[
  {
    "path": ".cargo/config.toml",
    "content": "[alias]\r\nxtask = \"run --package xtask --\"\r\n\r\n[target.x86_64-pc-windows-msvc]\r\nrustflags = [\"-Ctarget-feature=+crt-static\"]\r\n"
  },
  {
    "path": ".devcontainer/Dockerfile",
    "content": "FROM nvidia/cuda:13.0.1-base-ubuntu24.04\n\nRUN DEBIAN_FRONTEND=noninteractive apt update -y && DEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends \\\n    wget \\\n    build-essential \\\n    cmake \\\n    ninja-build \\\n    python3 \\\n    ripgrep \\\n    git \\\n    ltrace \\\n    # required by llvm 17\n    lsb-release software-properties-common gnupg\n\nARG LLVM_VERSION=17\nRUN wget https://apt.llvm.org/llvm.sh && \\\n    chmod +x llvm.sh && \\\n    ./llvm.sh ${LLVM_VERSION}\n\n# Feel free to change to a newer version if you have a newer verison on your host\nARG CUDA_PKG_VERSION=13-0\n# Docker <-> host  driver version compatiblity is newer host <-> older docker\n# Driver 580+ is required for CUDA 13\nARG CUDA_DRIVER=580\nRUN wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/libcudnn8-dev_8.9.7.29-1+cuda12.2_amd64.deb && \\\n    dpkg-deb -R libcudnn8-dev_8.9.7.29-1+cuda12.2_amd64.deb /opt && \\\n    rm libcudnn8-dev_8.9.7.29-1+cuda12.2_amd64.deb\nRUN DEBIAN_FRONTEND=noninteractive apt update -y && DEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends \\\n    # CUDA headers need it for interop\n    libgl-dev libegl-dev libvdpau-dev \\\n    nvidia-headless-no-dkms-${CUDA_DRIVER}-open \\\n    cuda-cudart-dev-${CUDA_PKG_VERSION} \\\n    cuda-nvml-dev-${CUDA_PKG_VERSION} \\\n    cuda-cudart-${CUDA_PKG_VERSION} \\\n    cuda-profiler-api-${CUDA_PKG_VERSION} \\\n    cuda-nvcc-${CUDA_PKG_VERSION} \\\n    cudnn9-cuda-${CUDA_PKG_VERSION} \\\n    libcufft-dev-${CUDA_PKG_VERSION} \\\n    libcublas-dev-${CUDA_PKG_VERSION} \\\n    libcusparse-dev-${CUDA_PKG_VERSION}\n\nARG ROCM_VERSION=6.4.4\nRUN mkdir --parents --mode=0755 /etc/apt/keyrings && \\\n    wget https://repo.radeon.com/rocm/rocm.gpg.key -O - | \\\n    gpg --dearmor | tee /etc/apt/keyrings/rocm.gpg > /dev/null && \\\n    echo \"deb [arch=amd64 signed-by=/etc/apt/keyrings/rocm.gpg] https://repo.radeon.com/rocm/apt/${ROCM_VERSION} noble main\" > /etc/apt/sources.list.d/rocm.list && \\\n    echo 'Package: *\\nPin: release o=repo.radeon.com\\nPin-Priority: 600' > /etc/apt/preferences.d/rocm-pin-600 && \\\n    DEBIAN_FRONTEND=noninteractive apt update -y && DEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends \\\n    rocminfo \\\n    rocm-gdb \\\n    rocm-smi-lib amd-smi-lib \\\n    rocm-llvm-dev \\\n    hip-runtime-amd \\\n    miopen-hip-dev \\\n    rocfft-dev \\\n    rocblas-dev \\\n    hipblaslt-dev \\\n    rocsolver-dev \\\n    rocsparse-dev \\\n    hip-dev && \\\n    echo '/opt/rocm/lib' > /etc/ld.so.conf.d/rocm.conf && \\\n    ldconfig\n\nENV PATH=$PATH:/opt/rocm-${ROCM_VERSION}/bin\n\n"
  },
  {
    "path": ".devcontainer/devcontainer.json",
    "content": "// For format details, see https://aka.ms/devcontainer.json. For config options, see the\n// README at: https://github.com/devcontainers/templates/tree/main/src/rust\n{\n\t\"name\": \"zluda\",\n\t\"build\": {\n\t\t\"dockerfile\": \"Dockerfile\"\n\t},\n\t\"securityOpt\": [ \"seccomp=unconfined\" ],\n\t\"runArgs\": [\n\t\t//\"--runtime=nvidia\",\n\t\t\"--device=/dev/kfd\",\n\t\t\"--device=/dev/dri\",\n\t\t\"--group-add=video\"\n\t],\n\t\"mounts\": [\n\t\t{\n\t\t\t\"source\": \"${localEnv:HOME}/.cargo/\",\n\t\t\t\"target\": \"/root/.cargo\",\n\t\t\t\"type\": \"bind\"\n\t\t}\n\t],\n\t// https://containers.dev/features.\n\t\"features\": {\n\t\t\"ghcr.io/devcontainers/features/rust:1\": {}\n\t},\n\t// https://aka.ms/dev-containers-non-root.\n\t\"remoteUser\": \"root\",\n\t\"hostRequirements\": { \"gpu\": true },\n\t\"customizations\": {\n\t\t\"vscode\": {\n\t\t\t\"extensions\": [ \"mhutchie.git-graph\" ]\n\t\t}\n\t},\n\t\"containerEnv\": {\n\t\t\"NVIDIA_DISABLE_REQUIRE\": \"1\"\n\t}\n}\n"
  },
  {
    "path": ".git-blame-ignore-revs",
    "content": "21ef5f60a3a5efa17855a30f6b5c7d1968cd46ba\n"
  },
  {
    "path": ".gitattributes",
    "content": "ext/** linguist-vendored\n*.dll filter=lfs diff=lfs merge=lfs -text\n*.bc filter=lfs diff=lfs merge=lfs -text\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: true\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/zluda_dump.yml",
    "content": "name: Bug Report\ndescription: Report an issue with ZLUDA\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        If you are reporting an application that is not supported by ZLUDA, please use zluda_trace to\n        create logs. See instructions here: https://zluda.readthedocs.io/latest/troubleshooting.html\n  - type: textarea\n    id: logs\n    attributes:\n      label: zluda_trace logs (tarball/zip file)\n      description: |\n        Please create a tarball (`.tar.gz`) or zip file (`.zip`) of your log directory and attach\n        it here. You can drag and drop files directly into the comment box. Please also include\n        zluda_trace logs using CUDA if you have NVIDIA hardware to test on.\n      placeholder: Attach file (e.g., drag and drop)\n    validations:\n      required: false\n  - type: textarea\n    id: description\n    attributes:\n      label: Description\n      description: |\n        Describe the issue you've encountered. What is the expected behavior? What is the actual\n        behavior?\n      placeholder: Description\n    validations:\n      required: false\n  - type: textarea\n    id: reproduce\n    attributes:\n      label: Steps to reproduce\n      description: |\n        Please describe the application you were running and provide clear, step-by-step\n        instructions to run it.\n      placeholder: |\n        example:\n          1. Download llm.c: git clone https://github.com/karpathy/llm.c.git\n          2. Navigate to the directory: cd llm.c\n          3. Download the model and train it:\n            chmod u+x ./dev/download_starter_pack.sh\n            ./dev/download_starter_pack.sh\n            make train_gpt2fp32cu\n            ./train_gpt2fp32cu\n          4. Build and run the tests:\n            make test_gpt2fp32cu\n            LD_LIBRARY_PATH=<ZLUDA_LOG_DIR> ./test_gpt2fp32cu\n    validations:\n      required: true\n  - type: input\n    id: version\n    attributes:\n      label: ZLUDA version\n      description: What version of ZLUDA are you using? Due to legal issues **versions older than 4 are not supported**\n      placeholder:  \"example: 5-preview.113\"\n    validations:\n      required: true\n  - type: input\n    id: os\n    attributes:\n      label: Operating System\n      description: What operating system are you using? (e.g., distribution and version)\n      placeholder:  \"example: Ubuntu 22.04.5 LTS\"\n    validations:\n      required: true\n  - type: input\n    id: gpu\n    attributes:\n      label: GPU\n      description: What GPU are you using?\n      placeholder:  \"example: AMD Radeon RX 6600\"\n    validations:\n      required: true\n"
  },
  {
    "path": ".github/workflows/move_tests.sh",
    "content": "#!/bin/bash\nset -ex\nTEST_EXECUTABLES_DIR=$1\nSUFFIX=$2\n\nls ${TEST_EXECUTABLES_DIR}/* | sort -u | while read -r executable; do\n    output=$(\"$executable\" --list 2>/dev/null)\n    exit_code=$?\n    if [ $exit_code -eq 0 ] && echo \"$output\" | grep -q \"_${SUFFIX}: test$\"; then\n        mv \"$executable\" \"${TEST_EXECUTABLES_DIR}/../${SUFFIX}/\"\n    fi\ndone\n"
  },
  {
    "path": ".github/workflows/nightly_tests.yml",
    "content": "name: Nightly tests\non:\n  workflow_call:\n  workflow_dispatch:\n\nenv:\n  ROCM_VERSION: \"6.3.4\"\n  AMDGPU_VERSION: \"6.4.4\"\n  TEST_THREADS: 24\n\njobs:\n  run_tests:\n    runs-on: gpu_large\n    steps:\n    - uses: actions/checkout@v4\n      with:\n        repository: 'vosen/ZLUDA'\n        path: zluda-src\n        sparse-checkout: |\n          .github/workflows/rocm_setup_run.sh\n    - name: Install ROCm\n      run: sudo bash zluda-src/.github/workflows/rocm_setup_run.sh ${{ env.ROCM_VERSION }} ${{ env.AMDGPU_VERSION }}\n    - uses: actions/checkout@v4\n      with:\n        repository: 'vosen/ptx_tests'\n    - uses: robinraju/release-downloader@v1\n      with:\n        repository: 'vosen/ZLUDA'\n        latest: true\n        preRelease: true\n        extract: true\n        fileName: 'zluda-linux-*.tar.gz'\n    - name: Build and run\n      run: |\n        DEBIAN_FRONTEND=noninteractive sudo apt install -y --no-install-recommends curl\n        curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --default-toolchain nightly --profile minimal -y\n        source ~/.cargo/env\n        pids=()\n        exit_codes=()\n        for i in $(seq 0 $((${{ env.TEST_THREADS }} - 1))); do\n          cargo run -r -- zluda/libcuda.so.1 --shard-index $i --shard-count ${{ env.TEST_THREADS }} > output_$i.log 2>&1 &\n          pids+=($!)\n        done\n        for pid in \"${pids[@]}\"; do\n          wait $pid\n          exit_codes+=($?)\n        done\n        error_occurred=0\n        for i in \"${!exit_codes[@]}\"; do\n          if [ ${exit_codes[$i]} -ne 0 ]; then\n            error_occurred=1\n          fi\n        done\n        exit $error_occurred\n    - name: Upload logs\n      if: always()\n      uses: actions/upload-artifact@v4\n      with:\n        name: output_logs\n        path: output_*.log"
  },
  {
    "path": ".github/workflows/pr_master.yml",
    "content": "name: ZLUDA\non:\n  pull_request:\n    branches: [ master ]\n\nenv:\n  CARGO_TERM_COLOR: always\n  CARGO_PROFILE: release\n  SCCACHE_GHA_ENABLED: \"true\"\n  RUSTC_WRAPPER: \"sccache\"\n  SCCACHE_MAX_FRAME_LENGTH: \"104857600\"  # 100 MB\n  ROCM_VERSION: \"6.3.4\"\n  AMDGPU_VERSION: \"6.4.4\"\n\njobs:\n  check_whitespace:\n    name: Check Whitespace\n    runs-on: ubuntu-22.04\n    steps:\n      - run: |\n          sudo apt install fd-find\n          fdfind \\\n            --exclude '*.bc' \\\n            --exclude '*.exe' \\\n            --exclude '*.lib' \\\n            --exclude ext/detours \\\n            --strip-cwd-prefix \\\n            --type file \\\n            --exec bash -c '\n              diff \\\n                --unified \\\n                --label \"a/$0\" \\\n                --label \"b/$0\" \\\n                <(cat \"$0\") \\\n                <(sed --regexp-extended \"s/\\s+$//; \\$a\\\\\" \"$0\")\n            '\n  formatting:\n    runs-on: ubuntu-22.04\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions-rust-lang/setup-rust-toolchain@v1\n        with:\n          components: rustfmt\n      - name: Check Rust formatting\n        uses: actions-rust-lang/rustfmt@v1\n  build_linux:\n    name: Build (Linux)\n    runs-on: ubuntu-22.04\n    steps:\n    - uses: jlumbroso/free-disk-space@v1.3.1\n    - uses: actions/checkout@v4\n      with:\n        lfs: true\n        submodules: true\n    - name: Install ROCm\n      run: sudo bash .github/workflows/rocm_setup_build.sh ${{ env.ROCM_VERSION }}\n    - name: Run sccache-cache\n      uses: mozilla-actions/sccache-action@v0.0.9\n    - name: Build\n      # https://github.com/actions/upload-artifact/issues/39\n      run: |\n        cargo xtask zip --profile ${{ env.CARGO_PROFILE }}\n        mkdir target/${{ env.CARGO_PROFILE }}/zluda\n        tar -xzf target/${{ env.CARGO_PROFILE }}/zluda.tar.gz -C target/${{ env.CARGO_PROFILE }}/zluda\n    - name: Set revision hash\n      run: echo \"SHORT_SHA=$(git rev-parse --short HEAD)\" >> $GITHUB_ENV\n    - name: Upload\n      uses: actions/upload-artifact@v4\n      with:\n        name: zluda-linux-${{ env.SHORT_SHA }}\n        path: target/${{ env.CARGO_PROFILE }}/zluda\n  build_windows:\n    name: Build (Windows)\n    runs-on: windows-2022\n    steps:\n    - uses: actions/checkout@v4\n      with:\n        lfs: true\n        submodules: true\n    - name: Run sccache-cache\n      uses: mozilla-actions/sccache-action@v0.0.9\n    - name: Build\n      run: |\n        cargo xtask zip --profile ${{ env.CARGO_PROFILE }}\n        Expand-Archive -Path target/${{ env.CARGO_PROFILE }}/zluda.zip -DestinationPath target/${{ env.CARGO_PROFILE }}/zluda\n    - name: Set revision hash\n      run: echo \"SHORT_SHA=$(\"${{ github.sha }}\".SubString(0, 7))\" >> $env:GITHUB_ENV\n    - name: Upload\n      uses: actions/upload-artifact@v4\n      with:\n        name: zluda-windows-${{ env.SHORT_SHA }}\n        path: target/${{ env.CARGO_PROFILE }}/zluda\n  build_tests:\n    name: Build AMD GPU unit tests\n    runs-on: gpu_small\n    outputs:\n      test_package: ${{ steps.upload_artifacts.outputs.artifact-id }}\n    steps:\n    - uses: jlumbroso/free-disk-space@v1.3.1\n    - name: Install build tools\n      run: |\n        sudo apt update\n        sudo apt install -y git git-lfs build-essential cmake\n    - uses: actions/checkout@v4\n      with:\n        lfs: true\n        submodules: true\n    - uses: actions-rust-lang/setup-rust-toolchain@v1\n      with:\n        rustflags: \"\"\n    - name: Install ROCm\n      run: sudo bash .github/workflows/rocm_setup_build.sh ${{ env.ROCM_VERSION }}\n    - name: Run sccache-cache\n      uses: mozilla-actions/sccache-action@v0.0.9\n    - uses: taiki-e/install-action@v2\n      with:\n        tool: cargo-export\n    - name: Build\n      run: |\n        cargo export target/tests -- test --features ci_build --workspace \\\n          --exclude cuda_macros \\\n          --exclude ptx_parser_macros \\\n          --exclude zluda_inject \\\n          --exclude zluda_redirect\n        mkdir -p target/amdgpu\n        bash .github/workflows/move_tests.sh target/tests amdgpu\n        strip target/amdgpu/*\n    - name: Upload\n      id: upload_artifacts\n      uses: actions/upload-artifact@v4\n      with:\n        name: tests\n        path: target/amdgpu\n        retention-days: 7\n  run_tests:\n    name: Run AMD GPU unit tests\n    runs-on: gpu_small\n    needs: [build_tests]\n    steps:\n    - uses: actions/checkout@v4\n      with:\n        submodules: false\n        sparse-checkout: .github\n    - name: Install ROCm\n      run: sudo bash .github/workflows/rocm_setup_run.sh ${{ env.ROCM_VERSION }} ${{ env.AMDGPU_VERSION }}\n    - uses: actions/download-artifact@v4\n      with:\n        artifact-ids: ${{ needs.build_tests.outputs.test_package }}\n        path: target\n    - name: Run tests\n      run: |\n        chmod +x target/tests/*\n        error_occurred=0\n        for exe in target/tests/*; do\n            ./\"$exe\" _amdgpu || { error_occurred=1; true; }\n        done\n        exit $error_occurred\n"
  },
  {
    "path": ".github/workflows/push_master.yml",
    "content": "name: ZLUDA\non:\n  workflow_dispatch:\n  push:\n    branches: [ master ]\n\nenv:\n  CARGO_TERM_COLOR: always\n  CARGO_PROFILE: release-lto\n  SCCACHE_GHA_ENABLED: \"true\"\n  RUSTC_WRAPPER: \"sccache\"\n  SCCACHE_MAX_FRAME_LENGTH: \"104857600\"  # 100 MB\n  ROCM_VERSION: \"6.3.4\"\n  AMDGPU_VERSION: \"6.4.4\"\n\njobs:\n  build_linux:\n    name: Build (Linux)\n    runs-on: ubuntu-22.04\n    permissions:\n      contents: write\n    steps:\n    - uses: jlumbroso/free-disk-space@v1.3.1\n    - uses: actions/checkout@v4\n      # fetch-depth and fetch-tags are required to properly tag pre-release builds\n      with:\n        fetch-depth: 0\n        fetch-tags: true\n        lfs: true\n        submodules: true\n    - name: Install ROCm\n      run: sudo bash .github/workflows/rocm_setup_build.sh ${{ env.ROCM_VERSION }}\n    - name: Run sccache-cache\n      uses: mozilla-actions/sccache-action@v0.0.9\n    - name: Build\n      # https://github.com/actions/upload-artifact/issues/39\n      run: |\n        cargo xtask zip --profile ${{ env.CARGO_PROFILE }}\n        mkdir target/${{ env.CARGO_PROFILE }}/zluda\n        tar -xzf target/${{ env.CARGO_PROFILE }}/zluda.tar.gz -C target/${{ env.CARGO_PROFILE }}/zluda\n    - name: Set revision hash\n      run: echo \"SHORT_SHA=$(git rev-parse --short HEAD)\" >> $GITHUB_ENV\n    - name: Upload\n      uses: actions/upload-artifact@v4\n      with:\n        name: zluda-linux-${{ env.SHORT_SHA }}\n        path: target/${{ env.CARGO_PROFILE }}/zluda\n    - name: Prepare artifact for release\n      run: |\n        mv target/${{ env.CARGO_PROFILE }}/zluda.tar.gz target/${{ env.CARGO_PROFILE }}/zluda-linux-${{ env.SHORT_SHA }}.tar.gz\n        latest_tag=$(git tag -l \"v*\" | grep -E \"^v[0-9]+$\" | sort -V | tail -n 1)\n        next_version=\"$((${latest_tag:1} + 1))\"\n        offset=$(git rev-list $latest_tag..HEAD --count)\n        echo \"VERSION=$next_version-preview.$offset\" >> $GITHUB_OUTPUT\n      id: prepare_artifacts\n    - uses: ncipollo/release-action@v1\n      with:\n        prerelease: true\n        generateReleaseNotes: true\n        allowUpdates: true\n        omitNameDuringUpdate: true\n        artifacts: \"target/${{ env.CARGO_PROFILE }}/zluda-linux-${{ env.SHORT_SHA }}.tar.gz\"\n        name: \"Version ${{ steps.prepare_artifacts.outputs.VERSION }}\"\n        tag: \"v${{ steps.prepare_artifacts.outputs.VERSION }}\"\n  build_windows:\n    name: Build (Windows)\n    runs-on: windows-2022\n    permissions:\n      contents: write\n    steps:\n    - uses: actions/checkout@v4\n      # fetch-depth and fetch-tags are required to properly tag pre-release builds\n      with:\n        fetch-depth: 0\n        fetch-tags: true\n        lfs: true\n        submodules: true\n    - name: Run sccache-cache\n      uses: mozilla-actions/sccache-action@v0.0.9\n    - name: Build\n      run: |\n        cargo xtask zip --profile ${{ env.CARGO_PROFILE }}\n        Expand-Archive -Path target/${{ env.CARGO_PROFILE }}/zluda.zip -DestinationPath target/${{ env.CARGO_PROFILE }}/zluda\n    - name: Set revision hash\n      run: echo \"SHORT_SHA=$(\"${{ github.sha }}\".SubString(0, 7))\" >> $env:GITHUB_ENV\n    - name: Upload\n      uses: actions/upload-artifact@v4\n      with:\n        name: zluda-windows-${{ env.SHORT_SHA }}\n        path: target/${{ env.CARGO_PROFILE }}/zluda\n    - name: Prepare artifact for release\n      shell: bash\n      working-directory: ${{ github.workspace }}\n      run: |\n        mv target/${{ env.CARGO_PROFILE }}/zluda.zip target/${{ env.CARGO_PROFILE }}/zluda-windows-${{ env.SHORT_SHA }}.zip\n        latest_tag=$(git tag -l \"v*\" | grep -E \"^v[0-9]+$\" | sort -V | tail -n 1)\n        next_version=\"$((${latest_tag:1} + 1))\"\n        offset=$(git rev-list $latest_tag..HEAD --count)\n        echo \"VERSION=$next_version-preview.$offset\" >> $GITHUB_OUTPUT\n      id: prepare_artifacts\n    - uses: ncipollo/release-action@v1\n      with:\n        prerelease: true\n        generateReleaseNotes: true\n        allowUpdates: true\n        omitNameDuringUpdate: true\n        artifacts: \"target/${{ env.CARGO_PROFILE }}/zluda-windows-${{ env.SHORT_SHA }}.zip\"\n        name: \"Version ${{ steps.prepare_artifacts.outputs.VERSION }}\"\n        tag: \"v${{ steps.prepare_artifacts.outputs.VERSION }}\"\n  build_tests:\n    name: Build AMD GPU unit tests\n    runs-on: gpu_small\n    outputs:\n      test_package: ${{ steps.upload_artifacts.outputs.artifact-id }}\n    steps:\n    - uses: jlumbroso/free-disk-space@v1.3.1\n    - name: Install build tools\n      run: |\n        sudo apt update\n        sudo apt install -y git git-lfs build-essential cmake\n    - uses: actions/checkout@v4\n      with:\n        lfs: true\n        submodules: true\n    - uses: actions-rust-lang/setup-rust-toolchain@v1\n      with:\n        rustflags: \"\"\n    - name: Install ROCm\n      run: sudo bash .github/workflows/rocm_setup_build.sh ${{ env.ROCM_VERSION }} ${{ env.AMDGPU_VERSION }}\n    - name: Run sccache-cache\n      uses: mozilla-actions/sccache-action@v0.0.9\n    - uses: taiki-e/install-action@v2\n      with:\n        tool: cargo-export\n    - name: Build\n      run: |\n        cargo export target/tests -- test --features ci_build --workspace \\\n          --exclude cuda_macros \\\n          --exclude ptx_parser_macros \\\n          --exclude zluda_inject \\\n          --exclude zluda_redirect\n        mkdir -p target/amdgpu\n        bash .github/workflows/move_tests.sh target/tests amdgpu\n        strip target/amdgpu/*\n    - name: Upload\n      id: upload_artifacts\n      uses: actions/upload-artifact@v4\n      with:\n        name: tests\n        path: target/amdgpu\n        retention-days: 7\n  run_tests:\n    name: Run AMD GPU unit tests\n    runs-on: gpu_small\n    needs: [build_tests]\n    steps:\n    - uses: actions/checkout@v4\n      with:\n        submodules: false\n        sparse-checkout: .github\n    - name: Install ROCm\n      run: sudo bash .github/workflows/rocm_setup_run.sh ${{ env.ROCM_VERSION }} ${{ env.AMDGPU_VERSION }}\n    - uses: actions/download-artifact@v4\n      with:\n        artifact-ids: ${{ needs.build_tests.outputs.test_package }}\n        path: target\n    - name: Run tests\n      run: |\n        chmod +x target/tests/*\n        error_occurred=0\n        for exe in target/tests/*; do\n            ./\"$exe\" _amdgpu || { error_occurred=1; true; }\n        done\n        exit $error_occurred\n"
  },
  {
    "path": ".github/workflows/rocm_setup_build.sh",
    "content": "#!/bin/bash\nset -ex\nROCM_VERSION=$1\n\nDEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends gpg patchelf\n# Source: https://rocm.docs.amd.com/projects/install-on-linux/en/latest/install/install-methods/package-manager/package-manager-ubuntu.html\nmkdir --parents --mode=0755 /etc/apt/keyrings\nwget https://repo.radeon.com/rocm/rocm.gpg.key -O - | \\\n    gpg --dearmor | tee /etc/apt/keyrings/rocm.gpg > /dev/null\necho deb [arch=amd64 signed-by=/etc/apt/keyrings/rocm.gpg] https://repo.radeon.com/rocm/apt/$ROCM_VERSION jammy main | tee /etc/apt/sources.list.d/rocm.list\necho -e 'Package: *\\nPin: release o=repo.radeon.com\\nPin-Priority: 600' \\\n    | tee /etc/apt/preferences.d/rocm-pin-600\nDEBIAN_FRONTEND=noninteractive apt update -y\nDEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends rocm-smi-lib rocm-llvm-dev hip-runtime-amd hip-dev rocblas-dev hipblaslt-dev miopen-hip-dev rocsparse-dev\necho 'export PATH=\"$PATH:/opt/rocm/bin\"' |  tee /etc/profile.d/rocm.sh\necho \"/opt/rocm/lib\" | tee /etc/ld.so.conf.d/rocm.conf\nldconfig\n"
  },
  {
    "path": ".github/workflows/rocm_setup_run.sh",
    "content": "#!/bin/bash\nset -ex\nROCM_VERSION=$1\nAMDGPU_VERSION=$2\n\nDEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends gpg zstd unzip \"linux-headers-$(uname -r)\" \"linux-modules-extra-$(uname -r)\"\n# Source: https://rocm.docs.amd.com/projects/install-on-linux/en/latest/install/install-methods/package-manager/package-manager-ubuntu.html\nmkdir --parents --mode=0755 /etc/apt/keyrings\nwget https://repo.radeon.com/rocm/rocm.gpg.key -O - | \\\n    gpg --dearmor | tee /etc/apt/keyrings/rocm.gpg > /dev/null\necho deb [arch=amd64 signed-by=/etc/apt/keyrings/rocm.gpg] https://repo.radeon.com/rocm/apt/$ROCM_VERSION noble main | tee /etc/apt/sources.list.d/rocm.list\necho deb [arch=amd64 signed-by=/etc/apt/keyrings/rocm.gpg] https://repo.radeon.com/amdgpu/$AMDGPU_VERSION/ubuntu noble main | tee /etc/apt/sources.list.d/amdgpu.list\necho -e 'Package: *\\nPin: release o=repo.radeon.com\\nPin-Priority: 600' \\\n    | tee /etc/apt/preferences.d/rocm-pin-600\nDEBIAN_FRONTEND=noninteractive apt update -y\n# rocm-smi-lib shouldn't be necessary, but somehow ptx tests started linking to it.\n# Result of Rust 1.90 linker change?\nDEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends amdgpu-dkms hip-runtime-amd rocm-smi-lib\necho 'export PATH=\"$PATH:/opt/rocm/bin\"' |  tee /etc/profile.d/rocm.sh\necho \"/opt/rocm/lib\" | tee /etc/ld.so.conf.d/rocm.conf\nldconfig\n\n#Grant access to GPUs to all users via udev rules\ncat <<'EOF' > /etc/udev/rules.d/70-amdgpu.rules\nKERNEL==\"kfd\", MODE=\"0666\"\nSUBSYSTEM==\"drm\", KERNEL==\"renderD*\", MODE=\"0666\"\nEOF\nudevadm control --reload-rules && udevadm trigger\nmodprobe amdgpu"
  },
  {
    "path": ".github/workflows/trigger_nightly_tests.yml",
    "content": "name: Trigger nightly tests\non:\n  schedule:\n    - cron: \"0 8 * * *\"\n\njobs:\n  check_last_nightly_run:\n    runs-on: 'ubuntu-latest'\n    outputs:\n      last_sha: ${{ fromJson(steps.check_last_run.outputs.data).workflow_runs[0].head_sha }}\n    steps:\n    - uses: octokit/request-action@v2.4.0\n      id: check_last_run\n      with:\n        route: GET /repos/${{github.repository}}/actions/workflows/nightly_tests.yml/runs?per_page=1&status=completed\n      env:\n        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n    - run: \"echo Last nightly build: ${{ fromJson(steps.check_last_run.outputs.data).workflow_runs[0].head_sha }}\"\n  build:\n    needs: [check_last_nightly_run]\n    if: needs.check_last_nightly_run.outputs.last_sha != github.sha\n    uses: ./.github/workflows/nightly_tests.yml\n    secrets: inherit"
  },
  {
    "path": ".gitignore",
    "content": "target/\nCargo.lock\n\n.vscode/\n.idea/\n\nptx/lib/zluda_ptx_impl.ll\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"ext/llvm-project\"]\n\tpath = ext/llvm-project\n\turl = https://github.com/vosen/llvm-project.git\n\tbranch = main\n\tshallow = true\n[submodule \"ext/HiGHS\"]\n\tpath = ext/HiGHS\n\turl = https://github.com/ERGO-Code/HiGHS.git\n\tshallow = true\n"
  },
  {
    "path": ".rustfmt.toml",
    "content": "newline_style = \"Unix\"\n"
  },
  {
    "path": "Cargo.toml",
    "content": "[workspace]\n\nresolver = \"2\"\n\nmembers = [\n    \"cuda_check\",\n    \"cuda_macros\",\n    \"cuda_types\",\n    \"dark_api\",\n    \"detours-sys\",\n    \"ext/highs-sys\",\n    \"ext/hip_runtime-sys\",\n    \"ext/hipblaslt-sys\",\n    \"ext/miopen-sys\",\n    \"ext/rocblas-sys\",\n    \"format\",\n    \"ptx\",\n    \"ptx_parser\",\n    \"ptx_parser_macros\",\n    \"ptx_parser_macros_impl\",\n    \"ptxas\",\n    \"xtask\",\n    \"zluda\",\n    \"zluda_bindgen\",\n    \"zluda_blas\",\n    \"zluda_blaslt\",\n    \"zluda_cache\",\n    \"zluda_common\",\n    \"zluda_dnn\",\n    \"zluda_dnn8\",\n    \"zluda_dnn9\",\n    \"zluda_trace\",\n    \"zluda_trace_blas\",\n    \"zluda_trace_blaslt\",\n    \"zluda_trace_common\",\n    \"zluda_trace_dnn8\",\n    \"zluda_trace_dnn9\",\n    \"zluda_trace_fft\",\n    \"zluda_trace_nvml\",\n    \"zluda_trace_sparse\",\n    \"zluda_fft\",\n    \"zluda_inject\",\n    \"zluda_ld\",\n    \"zluda_ml\",\n    \"zluda_precompile\",\n    \"zluda_redirect\",\n    \"zluda_sparse\",\n    \"compiler\",\n]\n\ndefault-members = [\"zluda\", \"zluda_ml\", \"zluda_inject\", \"zluda_redirect\", \"compiler\"]\n\n[profile.release-lto]\ninherits = \"release\"\ncodegen-units = 1\nlto = true\n\n# By default (even in dev) we build LLVM in Release (opt-level is controlled \n# by cmake). That's because LLVM in Debug is excruciatingly slow and makes any\n# kind of debugging impossible. This profile is a special configuration for when\n# you want to build LLVM in Debug\n[profile.dev-llvm]\ninherits = \"dev\"\n\n[profile.dev-llvm.package.xtask]\nopt-level = 2\n\n[profile.dev.package.xtask]\nopt-level = 2\n\n[patch.crates-io]\nhighs-sys = { path = \"ext/highs-sys\" }\n"
  },
  {
    "path": "LICENSE-APACHE",
    "content": "                              Apache License\n                        Version 2.0, January 2004\n                     http://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n   \"License\" shall mean the terms and conditions for use, reproduction,\n   and distribution as defined by Sections 1 through 9 of this document.\n\n   \"Licensor\" shall mean the copyright owner or entity authorized by\n   the copyright owner that is granting the License.\n\n   \"Legal Entity\" shall mean the union of the acting entity and all\n   other entities that control, are controlled by, or are under common\n   control with that entity. For the purposes of this definition,\n   \"control\" means (i) the power, direct or indirect, to cause the\n   direction or management of such entity, whether by contract or\n   otherwise, or (ii) ownership of fifty percent (50%) or more of the\n   outstanding shares, or (iii) beneficial ownership of such entity.\n\n   \"You\" (or \"Your\") shall mean an individual or Legal Entity\n   exercising permissions granted by this License.\n\n   \"Source\" form shall mean the preferred form for making modifications,\n   including but not limited to software source code, documentation\n   source, and configuration files.\n\n   \"Object\" form shall mean any form resulting from mechanical\n   transformation or translation of a Source form, including but\n   not limited to compiled object code, generated documentation,\n   and conversions to other media types.\n\n   \"Work\" shall mean the work of authorship, whether in Source or\n   Object form, made available under the License, as indicated by a\n   copyright notice that is included in or attached to the work\n   (an example is provided in the Appendix below).\n\n   \"Derivative Works\" shall mean any work, whether in Source or Object\n   form, that is based on (or derived from) the Work and for which the\n   editorial revisions, annotations, elaborations, or other modifications\n   represent, as a whole, an original work of authorship. For the purposes\n   of this License, Derivative Works shall not include works that remain\n   separable from, or merely link (or bind by name) to the interfaces of,\n   the Work and Derivative Works thereof.\n\n   \"Contribution\" shall mean any work of authorship, including\n   the original version of the Work and any modifications or additions\n   to that Work or Derivative Works thereof, that is intentionally\n   submitted to Licensor for inclusion in the Work by the copyright owner\n   or by an individual or Legal Entity authorized to submit on behalf of\n   the copyright owner. For the purposes of this definition, \"submitted\"\n   means any form of electronic, verbal, or written communication sent\n   to the Licensor or its representatives, including but not limited to\n   communication on electronic mailing lists, source code control systems,\n   and issue tracking systems that are managed by, or on behalf of, the\n   Licensor for the purpose of discussing and improving the Work, but\n   excluding communication that is conspicuously marked or otherwise\n   designated in writing by the copyright owner as \"Not a Contribution.\"\n\n   \"Contributor\" shall mean Licensor and any individual or Legal Entity\n   on behalf of whom a Contribution has been received by Licensor and\n   subsequently incorporated within the Work.\n\n2. Grant of Copyright License. Subject to the terms and conditions of\n   this License, each Contributor hereby grants to You a perpetual,\n   worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n   copyright license to reproduce, prepare Derivative Works of,\n   publicly display, publicly perform, sublicense, and distribute the\n   Work and such Derivative Works in Source or Object form.\n\n3. Grant of Patent License. Subject to the terms and conditions of\n   this License, each Contributor hereby grants to You a perpetual,\n   worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n   (except as stated in this section) patent license to make, have made,\n   use, offer to sell, sell, import, and otherwise transfer the Work,\n   where such license applies only to those patent claims licensable\n   by such Contributor that are necessarily infringed by their\n   Contribution(s) alone or by combination of their Contribution(s)\n   with the Work to which such Contribution(s) was submitted. If You\n   institute patent litigation against any entity (including a\n   cross-claim or counterclaim in a lawsuit) alleging that the Work\n   or a Contribution incorporated within the Work constitutes direct\n   or contributory patent infringement, then any patent licenses\n   granted to You under this License for that Work shall terminate\n   as of the date such litigation is filed.\n\n4. Redistribution. You may reproduce and distribute copies of the\n   Work or Derivative Works thereof in any medium, with or without\n   modifications, and in Source or Object form, provided that You\n   meet the following conditions:\n\n   (a) You must give any other recipients of the Work or\n       Derivative Works a copy of this License; and\n\n   (b) You must cause any modified files to carry prominent notices\n       stating that You changed the files; and\n\n   (c) You must retain, in the Source form of any Derivative Works\n       that You distribute, all copyright, patent, trademark, and\n       attribution notices from the Source form of the Work,\n       excluding those notices that do not pertain to any part of\n       the Derivative Works; and\n\n   (d) If the Work includes a \"NOTICE\" text file as part of its\n       distribution, then any Derivative Works that You distribute must\n       include a readable copy of the attribution notices contained\n       within such NOTICE file, excluding those notices that do not\n       pertain to any part of the Derivative Works, in at least one\n       of the following places: within a NOTICE text file distributed\n       as part of the Derivative Works; within the Source form or\n       documentation, if provided along with the Derivative Works; or,\n       within a display generated by the Derivative Works, if and\n       wherever such third-party notices normally appear. The contents\n       of the NOTICE file are for informational purposes only and\n       do not modify the License. You may add Your own attribution\n       notices within Derivative Works that You distribute, alongside\n       or as an addendum to the NOTICE text from the Work, provided\n       that such additional attribution notices cannot be construed\n       as modifying the License.\n\n   You may add Your own copyright statement to Your modifications and\n   may provide additional or different license terms and conditions\n   for use, reproduction, or distribution of Your modifications, or\n   for any such Derivative Works as a whole, provided Your use,\n   reproduction, and distribution of the Work otherwise complies with\n   the conditions stated in this License.\n\n5. Submission of Contributions. Unless You explicitly state otherwise,\n   any Contribution intentionally submitted for inclusion in the Work\n   by You to the Licensor shall be under the terms and conditions of\n   this License, without any additional terms or conditions.\n   Notwithstanding the above, nothing herein shall supersede or modify\n   the terms of any separate license agreement you may have executed\n   with Licensor regarding such Contributions.\n\n6. Trademarks. This License does not grant permission to use the trade\n   names, trademarks, service marks, or product names of the Licensor,\n   except as required for reasonable and customary use in describing the\n   origin of the Work and reproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty. Unless required by applicable law or\n   agreed to in writing, Licensor provides the Work (and each\n   Contributor provides its Contributions) on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n   implied, including, without limitation, any warranties or conditions\n   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n   PARTICULAR PURPOSE. You are solely responsible for determining the\n   appropriateness of using or redistributing the Work and assume any\n   risks associated with Your exercise of permissions under this License.\n\n8. Limitation of Liability. In no event and under no legal theory,\n   whether in tort (including negligence), contract, or otherwise,\n   unless required by applicable law (such as deliberate and grossly\n   negligent acts) or agreed to in writing, shall any Contributor be\n   liable to You for damages, including any direct, indirect, special,\n   incidental, or consequential damages of any character arising as a\n   result of this License or out of the use or inability to use the\n   Work (including but not limited to damages for loss of goodwill,\n   work stoppage, computer failure or malfunction, or any and all\n   other commercial damages or losses), even if such Contributor\n   has been advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability. While redistributing\n   the Work or Derivative Works thereof, You may choose to offer,\n   and charge a fee for, acceptance of support, warranty, indemnity,\n   or other liability obligations and/or rights consistent with this\n   License. However, in accepting such obligations, You may act only\n   on Your own behalf and on Your sole responsibility, not on behalf\n   of any other Contributor, and only if You agree to indemnify,\n   defend, and hold each Contributor harmless for any liability\n   incurred by, or claims asserted against, such Contributor by reason\n   of your accepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n"
  },
  {
    "path": "LICENSE-MIT",
    "content": "Permission is hereby granted, free of charge, to any\nperson obtaining a copy of this software and associated\ndocumentation files (the \"Software\"), to deal in the\nSoftware without restriction, including without\nlimitation the rights to use, copy, modify, merge,\npublish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software\nis furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice\nshall be included in all copies or substantial portions\nof the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\nANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\nTO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\nPARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT\nSHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR\nIN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "ZLUDA is a drop-in replacement for CUDA on non-NVIDIA GPUs. ZLUDA allows running unmodified CUDA applications using non-NVIDIA GPUs with near-native performance\n\n<div align=\"center\">\n\n<!-- 80x28 104.75x28  62x28-->\n[<img src=\"https://img.shields.io/badge/quick start-green?style=for-the-badge&logo=readthedocs&logoColor=white\" width=\"267.5\" height=\"56\">](https://zluda.readthedocs.io) [<img src=\"https://img.shields.io/badge/Discord-%235865F2.svg?style=for-the-badge&logo=discord&logoColor=white\" width=\"209.5\" height=\"56\">](https://discord.gg/sg6BNzXuc7) [<img src=\"https://img.shields.io/badge/news-red?style=for-the-badge&logo=book&logoColor=white\" width=\"124\" height=\"56\">](https://vosen.github.io/ZLUDA/)\n\n<div/>\n"
  },
  {
    "path": "compiler/Cargo.toml",
    "content": "[package]\nname = \"compiler\"\ndescription = \"ZLUDA offline compiler\"\nversion = \"0.0.0\"\nauthors = [\"Joëlle van Essen <joelle@v-essen.nl>\"]\nedition = \"2021\"\n\n[[bin]]\nname = \"zoc\"\npath = \"src/main.rs\"\n\n[dependencies]\nbpaf = { version = \"0.9.19\", features = [\"derive\", \"bright-color\"] }\nllvm_zluda = { path = \"../llvm_zluda\" }\nptx = { path = \"../ptx\" }\nptx_parser = { path = \"../ptx_parser\" }\nlibloading = \"0.8\"\nthiserror = \"2.0.12\"\n\n[package.metadata.zluda]\ndebug_only = true\n"
  },
  {
    "path": "compiler/src/error.rs",
    "content": "use ptx::TranslateError;\nuse ptx_parser::PtxError;\nuse std::ffi::FromBytesUntilNulError;\nuse std::io;\nuse std::str::Utf8Error;\n\n#[derive(Debug, thiserror::Error)]\npub enum CompilerError {\n    #[error(\"HIP error code: {0:?}\")]\n    HipError(u32),\n    #[error(transparent)]\n    Libloading(#[from] libloading::Error),\n    #[error(transparent)]\n    IoError(#[from] io::Error),\n    #[error(transparent)]\n    Utf8Error(#[from] Utf8Error),\n    #[error(transparent)]\n    FromBytesUntilNulError(#[from] FromBytesUntilNulError),\n    #[error(\"{message}\")]\n    GenericError {\n        #[source]\n        cause: Option<Box<dyn std::error::Error>>,\n        message: String,\n    },\n}\n\nimpl From<Vec<PtxError<'_>>> for CompilerError {\n    fn from(causes: Vec<PtxError>) -> Self {\n        let errors: Vec<String> = causes\n            .iter()\n            .map(|e| {\n                let msg = match e {\n                    PtxError::UnrecognizedStatement(value)\n                    | PtxError::UnrecognizedDirective(value) => value.to_string(),\n                    other => other.to_string(),\n                };\n                format!(\"PtxError::{}: {}\", e.as_ref(), msg)\n            })\n            .collect();\n        let message = errors.join(\"\\n\");\n        CompilerError::GenericError {\n            cause: None,\n            message,\n        }\n    }\n}\n\nimpl From<TranslateError> for CompilerError {\n    fn from(cause: TranslateError) -> Self {\n        let message = format!(\"PTX TranslateError::{}\", cause.as_ref());\n        let cause = Some(Box::new(cause) as Box<dyn std::error::Error>);\n        CompilerError::GenericError { cause, message }\n    }\n}\n\nimpl From<String> for CompilerError {\n    fn from(message: String) -> Self {\n        Self::GenericError {\n            cause: None,\n            message,\n        }\n    }\n}\n"
  },
  {
    "path": "compiler/src/main.rs",
    "content": "use bpaf::Bpaf;\nuse error::CompilerError;\nuse std::ffi::CStr;\nuse std::fs::{self, File};\nuse std::io::{self, Write};\nuse std::path::{Path, PathBuf};\nuse std::process::ExitCode;\nuse std::str;\nuse std::time::Instant;\nuse std::{env, mem};\n\nmod error;\n\nconst DEFAULT_ARCH: &'static str = \"gfx1100\";\n\n#[derive(Debug, Clone, Bpaf)]\n#[bpaf(options, version)]\npub struct Options {\n    #[bpaf(argument(\"output-dir\"))]\n    /// Output directory\n    output_dir: Option<PathBuf>,\n\n    #[bpaf(long(\"arch\"))]\n    /// Target GPU architecture\n    arch: Option<String>,\n\n    #[bpaf(long(\"ignore-errors\"))]\n    /// Try to ignore errors. This will try and produce output even if there are\n    /// parsing errors (e.g. an unimplemented instruction)\n    ignore_errors: bool,\n\n    #[bpaf(positional(\"filename\"))]\n    /// PTX file\n    ptx_path: String,\n}\n\nfn main() -> ExitCode {\n    if let Err(e) = main_core() {\n        eprintln!(\"Error: {}\", e);\n        return ExitCode::FAILURE;\n    }\n    ExitCode::SUCCESS\n}\n\nfn main_core() -> Result<(), CompilerError> {\n    let opts = options().run();\n\n    let ptx_path = Path::new(&opts.ptx_path).to_path_buf();\n    let filename_base = ptx_path\n        .file_name()\n        .map(|osstr| osstr.to_str().unwrap_or(\"output\"))\n        .unwrap_or(\"output\");\n\n    let mut output_path = match opts.output_dir {\n        Some(value) => {\n            std::fs::create_dir_all(&value)?;\n            value\n        }\n        None => match ptx_path.parent() {\n            Some(dir) => dir.to_path_buf(),\n            None => env::current_dir()?,\n        },\n    };\n    output_path.push(filename_base);\n\n    let arch: String = match opts.arch {\n        Some(s) => s,\n        None => (|| {\n            let runtime = hip::Runtime::load()?;\n            runtime.init()?;\n            get_gpu_arch(&runtime)\n        })()\n        .unwrap_or_else(|_| DEFAULT_ARCH.to_owned()),\n    };\n\n    let ptx = fs::read(&ptx_path).map_err(CompilerError::from)?;\n    let ptx = str::from_utf8(&ptx).map_err(CompilerError::from)?;\n    let llvm = ptx_to_llvm(opts.ignore_errors, ptx).map_err(CompilerError::from)?;\n\n    write_to_file(&llvm.llvm_ir, output_path.with_extension(\"ll\").as_path())?;\n\n    let compiler_hook = |bytes: &Vec<u8>, extension: String| {\n        let output_path = output_path.with_extension(extension);\n        write_to_file(bytes, &output_path).unwrap();\n    };\n\n    let mut start = Instant::now();\n    llvm_zluda::compile(\n        &llvm.context,\n        &arch,\n        llvm.main,\n        &llvm.linked_bitcode,\n        llvm.attributes,\n        Some(&compiler_hook),\n    )?;\n    report_pass_time(\"compile_bitcode\", &mut start);\n\n    Ok(())\n}\n\nfn ptx_to_llvm(ignore_errors: bool, ptx: &str) -> Result<LLVMArtifacts, CompilerError> {\n    let ast = if ignore_errors {\n        ptx_parser::parse_module_unchecked(ptx)\n    } else {\n        ptx_parser::parse_module_checked(ptx).map_err(CompilerError::from)?\n    };\n    let mut start = Instant::now();\n    let module = ptx::to_llvm_module(\n        ast,\n        ptx::Attributes {\n            clock_rate: 2124000,\n        },\n        |pass| {\n            report_pass_time(pass, &mut start);\n        },\n    )\n    .map_err(CompilerError::from)?;\n    let llvm_ir = module.llvm_ir.print_module_to_string().to_bytes().to_vec();\n    let linked_bitcode = module.linked_bitcode().to_vec();\n    let main = module.llvm_ir;\n    let attributes = module.attributes_ir;\n    Ok(LLVMArtifacts {\n        context: module.context,\n        main,\n        linked_bitcode,\n        attributes,\n        llvm_ir,\n    })\n}\n\nfn report_pass_time(pass: &str, start: &mut Instant) {\n    let duration = start.elapsed();\n    println!(\"Pass {:?} took {:?}\", pass, duration);\n    *start = Instant::now();\n}\n\nstruct LLVMArtifacts {\n    main: llvm_zluda::utils::Module,\n    attributes: llvm_zluda::utils::Module,\n    context: llvm_zluda::utils::Context,\n    linked_bitcode: Vec<u8>,\n    llvm_ir: Vec<u8>,\n}\n\nfn get_gpu_arch(runtime: &hip::Runtime) -> Result<String, CompilerError> {\n    let mut dev_props = unsafe { mem::zeroed() };\n    runtime.device_get_properties(&mut dev_props, 0)?;\n    let gcn_arch_name = &dev_props.gcnArchName;\n    let gcn_arch_name = unsafe { CStr::from_ptr(gcn_arch_name.as_ptr()) };\n    let gcn_arch_name = gcn_arch_name.to_str()?;\n    Ok(gcn_arch_name.to_string())\n}\n\nfn write_to_file(content: &[u8], path: &Path) -> io::Result<()> {\n    let mut file = File::create(path)?;\n    file.write_all(content)?;\n    file.flush()?;\n    println!(\"Wrote to {}\", path.to_str().unwrap());\n    Ok(())\n}\n\nmod hip {\n    use crate::error::CompilerError;\n\n    // We lazy load HIP runtime because we want to work on systems with no\n    // HIP driver installed\n    pub struct Runtime(libloading::Library);\n\n    impl Runtime {\n        fn hip_check(err: u32) -> Result<(), CompilerError> {\n            match err {\n                0 => Ok(()),\n                err_code => Err(CompilerError::HipError(err_code)),\n            }\n        }\n\n        pub fn load() -> Result<Self, CompilerError> {\n            #[cfg(windows)]\n            let lib_name_6 = \"amdhip64_6.dll\\0\";\n            #[cfg(windows)]\n            let lib_name_7 = \"amdhip64_7.dll\\0\";\n            #[cfg(unix)]\n            let lib_name_6 = \"libamdhip64.so.6\\0\";\n            #[cfg(unix)]\n            let lib_name_7 = \"libamdhip64.so.7\\0\";\n            let library = unsafe {\n                libloading::Library::new(lib_name_7)\n                    .or_else(|_| libloading::Library::new(lib_name_6))?\n            };\n            Ok(Self(library))\n        }\n\n        pub fn init(&self) -> Result<(), CompilerError> {\n            unsafe {\n                let hip_init: libloading::Symbol<unsafe extern \"C\" fn(u32) -> u32> =\n                    self.0.get(b\"hipInit\\0\")?;\n                Self::hip_check(hip_init(0))\n            }\n        }\n\n        pub fn device_get_properties(\n            &self,\n            prop: &mut hipDeviceProp_tR0600,\n            device: i32,\n        ) -> Result<(), CompilerError> {\n            unsafe {\n                let hip_get_device_properties: libloading::Symbol<\n                    unsafe extern \"C\" fn(*mut hipDeviceProp_tR0600, i32) -> u32,\n                > = self.0.get(b\"hipGetDevicePropertiesR0600\\0\")?;\n                Self::hip_check(hip_get_device_properties(prop, device))\n            }\n        }\n    }\n\n    #[allow(non_snake_case, non_camel_case_types)]\n    #[repr(C)]\n    #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\n    pub struct hipDeviceProp_tR0600 {\n        ///< Device name.\n        pub name: [::core::ffi::c_char; 256usize],\n        ///< UUID of a device\n        pub uuid: hipUUID,\n        ///< 8-byte unique identifier. Only valid on windows\n        pub luid: [::core::ffi::c_char; 8usize],\n        ///< LUID node mask\n        pub luidDeviceNodeMask: ::core::ffi::c_uint,\n        ///< Size of global memory region (in bytes).\n        pub totalGlobalMem: usize,\n        ///< Size of shared memory per block (in bytes).\n        pub sharedMemPerBlock: usize,\n        ///< Registers per block.\n        pub regsPerBlock: ::core::ffi::c_int,\n        ///< Warp size.\n        pub warpSize: ::core::ffi::c_int,\n        /**< Maximum pitch in bytes allowed by memory copies\n        < pitched memory*/\n        pub memPitch: usize,\n        ///< Max work items per work group or workgroup max size.\n        pub maxThreadsPerBlock: ::core::ffi::c_int,\n        ///< Max number of threads in each dimension (XYZ) of a block.\n        pub maxThreadsDim: [::core::ffi::c_int; 3usize],\n        ///< Max grid dimensions (XYZ).\n        pub maxGridSize: [::core::ffi::c_int; 3usize],\n        ///< Max clock frequency of the multiProcessors in khz.\n        pub clockRate: ::core::ffi::c_int,\n        /**< Size of shared constant memory region on the device\n        < (in bytes).*/\n        pub totalConstMem: usize,\n        /**< Major compute capability.  On HCC, this is an approximation and features may\n        < differ from CUDA CC.  See the arch feature flags for portable ways to query\n        < feature caps.*/\n        pub major: ::core::ffi::c_int,\n        /**< Minor compute capability.  On HCC, this is an approximation and features may\n        < differ from CUDA CC.  See the arch feature flags for portable ways to query\n        < feature caps.*/\n        pub minor: ::core::ffi::c_int,\n        ///< Alignment requirement for textures\n        pub textureAlignment: usize,\n        ///< Pitch alignment requirement for texture references bound to\n        pub texturePitchAlignment: usize,\n        ///< Deprecated. Use asyncEngineCount instead\n        pub deviceOverlap: ::core::ffi::c_int,\n        ///< Number of multi-processors (compute units).\n        pub multiProcessorCount: ::core::ffi::c_int,\n        ///< Run time limit for kernels executed on the device\n        pub kernelExecTimeoutEnabled: ::core::ffi::c_int,\n        ///< APU vs dGPU\n        pub integrated: ::core::ffi::c_int,\n        ///< Check whether HIP can map host memory\n        pub canMapHostMemory: ::core::ffi::c_int,\n        ///< Compute mode.\n        pub computeMode: ::core::ffi::c_int,\n        ///< Maximum number of elements in 1D images\n        pub maxTexture1D: ::core::ffi::c_int,\n        ///< Maximum 1D mipmap texture size\n        pub maxTexture1DMipmap: ::core::ffi::c_int,\n        ///< Maximum size for 1D textures bound to linear memory\n        pub maxTexture1DLinear: ::core::ffi::c_int,\n        ///< Maximum dimensions (width, height) of 2D images, in image elements\n        pub maxTexture2D: [::core::ffi::c_int; 2usize],\n        ///< Maximum number of elements in 2D array mipmap of images\n        pub maxTexture2DMipmap: [::core::ffi::c_int; 2usize],\n        ///< Maximum 2D tex dimensions if tex are bound to pitched memory\n        pub maxTexture2DLinear: [::core::ffi::c_int; 3usize],\n        ///< Maximum 2D tex dimensions if gather has to be performed\n        pub maxTexture2DGather: [::core::ffi::c_int; 2usize],\n        /**< Maximum dimensions (width, height, depth) of 3D images, in image\n        < elements*/\n        pub maxTexture3D: [::core::ffi::c_int; 3usize],\n        ///< Maximum alternate 3D texture dims\n        pub maxTexture3DAlt: [::core::ffi::c_int; 3usize],\n        ///< Maximum cubemap texture dims\n        pub maxTextureCubemap: ::core::ffi::c_int,\n        ///< Maximum number of elements in 1D array images\n        pub maxTexture1DLayered: [::core::ffi::c_int; 2usize],\n        ///< Maximum number of elements in 2D array images\n        pub maxTexture2DLayered: [::core::ffi::c_int; 3usize],\n        ///< Maximum cubemaps layered texture dims\n        pub maxTextureCubemapLayered: [::core::ffi::c_int; 2usize],\n        ///< Maximum 1D surface size\n        pub maxSurface1D: ::core::ffi::c_int,\n        ///< Maximum 2D surface size\n        pub maxSurface2D: [::core::ffi::c_int; 2usize],\n        ///< Maximum 3D surface size\n        pub maxSurface3D: [::core::ffi::c_int; 3usize],\n        ///< Maximum 1D layered surface size\n        pub maxSurface1DLayered: [::core::ffi::c_int; 2usize],\n        ///< Maximum 2D layared surface size\n        pub maxSurface2DLayered: [::core::ffi::c_int; 3usize],\n        ///< Maximum cubemap surface size\n        pub maxSurfaceCubemap: ::core::ffi::c_int,\n        ///< Maximum cubemap layered surface size\n        pub maxSurfaceCubemapLayered: [::core::ffi::c_int; 2usize],\n        ///< Alignment requirement for surface\n        pub surfaceAlignment: usize,\n        ///< Device can possibly execute multiple kernels concurrently.\n        pub concurrentKernels: ::core::ffi::c_int,\n        ///< Device has ECC support enabled\n        pub ECCEnabled: ::core::ffi::c_int,\n        ///< PCI Bus ID.\n        pub pciBusID: ::core::ffi::c_int,\n        ///< PCI Device ID.\n        pub pciDeviceID: ::core::ffi::c_int,\n        ///< PCI Domain ID\n        pub pciDomainID: ::core::ffi::c_int,\n        ///< 1:If device is Tesla device using TCC driver, else 0\n        pub tccDriver: ::core::ffi::c_int,\n        ///< Number of async engines\n        pub asyncEngineCount: ::core::ffi::c_int,\n        ///< Does device and host share unified address space\n        pub unifiedAddressing: ::core::ffi::c_int,\n        ///< Max global memory clock frequency in khz.\n        pub memoryClockRate: ::core::ffi::c_int,\n        ///< Global memory bus width in bits.\n        pub memoryBusWidth: ::core::ffi::c_int,\n        ///< L2 cache size.\n        pub l2CacheSize: ::core::ffi::c_int,\n        ///< Device's max L2 persisting lines in bytes\n        pub persistingL2CacheMaxSize: ::core::ffi::c_int,\n        ///< Maximum resident threads per multi-processor.\n        pub maxThreadsPerMultiProcessor: ::core::ffi::c_int,\n        ///< Device supports stream priority\n        pub streamPrioritiesSupported: ::core::ffi::c_int,\n        ///< Indicates globals are cached in L1\n        pub globalL1CacheSupported: ::core::ffi::c_int,\n        ///< Locals are cahced in L1\n        pub localL1CacheSupported: ::core::ffi::c_int,\n        ///< Amount of shared memory available per multiprocessor.\n        pub sharedMemPerMultiprocessor: usize,\n        ///< registers available per multiprocessor\n        pub regsPerMultiprocessor: ::core::ffi::c_int,\n        ///< Device supports allocating managed memory on this system\n        pub managedMemory: ::core::ffi::c_int,\n        ///< 1 if device is on a multi-GPU board, 0 if not.\n        pub isMultiGpuBoard: ::core::ffi::c_int,\n        ///< Unique identifier for a group of devices on same multiboard GPU\n        pub multiGpuBoardGroupID: ::core::ffi::c_int,\n        ///< Link between host and device supports native atomics\n        pub hostNativeAtomicSupported: ::core::ffi::c_int,\n        ///< Deprecated. CUDA only.\n        pub singleToDoublePrecisionPerfRatio: ::core::ffi::c_int,\n        /**< Device supports coherently accessing pageable memory\n        < without calling hipHostRegister on it*/\n        pub pageableMemoryAccess: ::core::ffi::c_int,\n        /**< Device can coherently access managed memory concurrently with\n        < the CPU*/\n        pub concurrentManagedAccess: ::core::ffi::c_int,\n        ///< Is compute preemption supported on the device\n        pub computePreemptionSupported: ::core::ffi::c_int,\n        /**< Device can access host registered memory with same\n        < address as the host*/\n        pub canUseHostPointerForRegisteredMem: ::core::ffi::c_int,\n        ///< HIP device supports cooperative launch\n        pub cooperativeLaunch: ::core::ffi::c_int,\n        /**< HIP device supports cooperative launch on multiple\n        < devices*/\n        pub cooperativeMultiDeviceLaunch: ::core::ffi::c_int,\n        ///< Per device m ax shared mem per block usable by special opt in\n        pub sharedMemPerBlockOptin: usize,\n        /**< Device accesses pageable memory via the host's\n        < page tables*/\n        pub pageableMemoryAccessUsesHostPageTables: ::core::ffi::c_int,\n        /**< Host can directly access managed memory on the device\n        < without migration*/\n        pub directManagedMemAccessFromHost: ::core::ffi::c_int,\n        ///< Max number of blocks on CU\n        pub maxBlocksPerMultiProcessor: ::core::ffi::c_int,\n        ///< Max value of access policy window\n        pub accessPolicyMaxWindowSize: ::core::ffi::c_int,\n        ///< Shared memory reserved by driver per block\n        pub reservedSharedMemPerBlock: usize,\n        ///< Device supports hipHostRegister\n        pub hostRegisterSupported: ::core::ffi::c_int,\n        ///< Indicates if device supports sparse hip arrays\n        pub sparseHipArraySupported: ::core::ffi::c_int,\n        /**< Device supports using the hipHostRegisterReadOnly flag\n        < with hipHostRegistger*/\n        pub hostRegisterReadOnlySupported: ::core::ffi::c_int,\n        ///< Indicates external timeline semaphore support\n        pub timelineSemaphoreInteropSupported: ::core::ffi::c_int,\n        ///< Indicates if device supports hipMallocAsync and hipMemPool APIs\n        pub memoryPoolsSupported: ::core::ffi::c_int,\n        ///< Indicates device support of RDMA APIs\n        pub gpuDirectRDMASupported: ::core::ffi::c_int,\n        /**< Bitmask to be interpreted according to\n        < hipFlushGPUDirectRDMAWritesOptions*/\n        pub gpuDirectRDMAFlushWritesOptions: ::core::ffi::c_uint,\n        ///< value of hipGPUDirectRDMAWritesOrdering\n        pub gpuDirectRDMAWritesOrdering: ::core::ffi::c_int,\n        ///< Bitmask of handle types support with mempool based IPC\n        pub memoryPoolSupportedHandleTypes: ::core::ffi::c_uint,\n        /**< Device supports deferred mapping HIP arrays and HIP\n        < mipmapped arrays*/\n        pub deferredMappingHipArraySupported: ::core::ffi::c_int,\n        ///< Device supports IPC events\n        pub ipcEventSupported: ::core::ffi::c_int,\n        ///< Device supports cluster launch\n        pub clusterLaunch: ::core::ffi::c_int,\n        ///< Indicates device supports unified function pointers\n        pub unifiedFunctionPointers: ::core::ffi::c_int,\n        ///< CUDA Reserved.\n        pub reserved: [::core::ffi::c_int; 63usize],\n        ///< Reserved for adding new entries for HIP/CUDA.\n        pub hipReserved: [::core::ffi::c_int; 32usize],\n        ///< AMD GCN Arch Name. HIP Only.\n        pub gcnArchName: [::core::ffi::c_char; 256usize],\n        ///< Maximum Shared Memory Per CU. HIP Only.\n        pub maxSharedMemoryPerMultiProcessor: usize,\n        /**< Frequency in khz of the timer used by the device-side \"clock*\"\n        < instructions.  New for HIP.*/\n        pub clockInstructionRate: ::core::ffi::c_int,\n        ///< Architectural feature flags.  New for HIP.\n        pub arch: hipDeviceArch_t,\n        ///< Addres of HDP_MEM_COHERENCY_FLUSH_CNTL register\n        pub hdpMemFlushCntl: *mut ::core::ffi::c_uint,\n        ///< Addres of HDP_REG_COHERENCY_FLUSH_CNTL register\n        pub hdpRegFlushCntl: *mut ::core::ffi::c_uint,\n        /**< HIP device supports cooperative launch on\n        < multiple*/\n        pub cooperativeMultiDeviceUnmatchedFunc: ::core::ffi::c_int,\n        /**< HIP device supports cooperative launch on\n        < multiple*/\n        pub cooperativeMultiDeviceUnmatchedGridDim: ::core::ffi::c_int,\n        /**< HIP device supports cooperative launch on\n        < multiple*/\n        pub cooperativeMultiDeviceUnmatchedBlockDim: ::core::ffi::c_int,\n        /**< HIP device supports cooperative launch on\n        < multiple*/\n        pub cooperativeMultiDeviceUnmatchedSharedMem: ::core::ffi::c_int,\n        ///< 1: if it is a large PCI bar device, else 0\n        pub isLargeBar: ::core::ffi::c_int,\n        ///< Revision of the GPU in this device\n        pub asicRevision: ::core::ffi::c_int,\n    }\n\n    #[allow(non_snake_case, non_camel_case_types)]\n    #[repr(C)]\n    #[repr(align(4))]\n    #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\n    pub struct hipDeviceArch_t {\n        pub _bitfield_align_1: [u8; 0],\n        pub _bitfield_1: __BindgenBitfieldUnit<[u8; 3usize]>,\n        pub __bindgen_padding_0: u8,\n    }\n\n    #[repr(C)]\n    #[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]\n    pub struct __BindgenBitfieldUnit<Storage> {\n        storage: Storage,\n    }\n\n    #[allow(non_camel_case_types)]\n    #[repr(C)]\n    #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\n    pub struct hipUUID_t {\n        pub bytes: [::core::ffi::c_char; 16usize],\n    }\n    #[allow(non_camel_case_types)]\n    pub type hipUUID = hipUUID_t;\n}\n"
  },
  {
    "path": "cuda_check/Cargo.toml",
    "content": "[package]\nname = \"cuda_check\"\nversion = \"0.0.0\"\nauthors = [\"Andrzej Janik <vosen@vosen.pl>\"]\nedition = \"2021\"\n\n[[bin]]\nname = \"cuda_check\"\npath = \"src/main.rs\"\n\n[dependencies]\ncuda_types = { path = \"../cuda_types\" }\nzluda_windows = { path = \"../zluda_windows\" }\nbpaf = { version = \"0.9.19\", features = [\"derive\", \"bright-color\"] }\nowo-colors = { version = \"4\", features = [\"supports-colors\"] }\nrand = \"0.9.2\"\nlibloading = \"0.8\"\n\n[target.'cfg(windows)'.dependencies]\nwindows = { version = \"0.62.2\", features = [\"Win32_Foundation\"] }\n\n\n[package.metadata.zluda]\nwindows_only = true\n"
  },
  {
    "path": "cuda_check/src/main.rs",
    "content": "#[cfg(windows)]\nmod win;\n\n#[cfg(windows)]\nfn main() {\n    win::main()\n}\n\n#[cfg(not(windows))]\nfn main() {}\n"
  },
  {
    "path": "cuda_check/src/win.rs",
    "content": "use bpaf::{construct, pure, Bpaf, Parser};\nuse owo_colors::{OwoColorize, Stream};\nuse rand::seq::SliceRandom;\nuse std::{ffi::OsString, mem};\nuse windows::Win32::Foundation::HMODULE;\nuse zluda_windows::{get_module_path_utf16, LibraryInfo};\n\n#[derive(Debug, Bpaf)]\n#[bpaf(options)]\nstruct Options {\n    #[bpaf(external)]\n    libraries: Vec<&'static LibraryInfo>,\n    #[bpaf(switch)]\n    driver_first: bool,\n}\n\nfn libraries() -> impl Parser<Vec<&'static LibraryInfo>> {\n    zluda_windows::LIBRARIES.iter().fold(\n        Parser::boxed(pure(Vec::with_capacity(zluda_windows::LIBRARIES.len()))),\n        |parser, library| {\n            let dlls = library.ascii_name;\n            let arg = bpaf::long(library.short_name)\n                .help(&*format!(\"Look for {dlls}\"))\n                .switch();\n            construct!(parser, arg)\n                .map(move |(mut acc, cur)| {\n                    if cur {\n                        acc.push(library);\n                    }\n                    acc\n                })\n                .boxed()\n        },\n    )\n}\n\npub fn main() {\n    let mut opts = options().run();\n    if opts.libraries.is_empty() {\n        opts.libraries = zluda_windows::LIBRARIES.iter().collect();\n    }\n    let mut lib_set = opts.libraries;\n    if !opts.driver_first {\n        lib_set.shuffle(&mut rand::rng());\n    } else {\n        let (_, remainder) = lib_set.split_first_mut().unwrap();\n        remainder.shuffle(&mut rand::rng());\n    }\n    for lib in lib_set {\n        print_result(lib.short_name, unsafe { try_load_library(lib) });\n    }\n}\n\nfn print_result(short_name: &str, lib: Result<Option<OsString>, Error>) {\n    print!(\"{:<10}: \", short_name);\n    match lib {\n        Ok(None) => println!(\n            \"{}\",\n            \"OK\".if_supports_color(Stream::Stdout, |text| text.green())\n        ),\n        Ok(Some(path)) => println!(\n            \"{} ({})\",\n            \"OK\".if_supports_color(Stream::Stdout, |text| text.green()),\n            path.display()\n        ),\n        Err(err) => println!(\n            \"{}\",\n            format!(\"ERROR: {:?}\", err).if_supports_color(Stream::Stdout, |text| text.red())\n        ),\n    }\n}\n\nunsafe fn try_load_library(lib: &LibraryInfo) -> Result<Option<OsString>, Error> {\n    let library = if lib.in_system32 {\n        libloading::Library::new(lib.ascii_name)?\n    } else {\n        match std::env::var(\"CUDA_PATH\") {\n            Ok(cuda_path) => {\n                let path = std::path::Path::new(&cuda_path)\n                    .join(\"bin\")\n                    .join(\"x64\")\n                    .join(lib.ascii_name);\n                libloading::Library::new(path)?\n            }\n            Err(_) => libloading::Library::new(lib.ascii_name)?,\n        }\n    };\n    match lib.short_name {\n        \"nvcuda\" => check_cuda(library),\n        \"nvml\" => check_nvml(library),\n        \"cudnn8\" => check_cudnn8(library),\n        \"cudnn9\" => check_cudnn9(library),\n        \"cublas11\" => check_cublas(library),\n        \"cublas12\" => check_cublas(library),\n        \"cublas13\" => check_cublas(library),\n        \"cublaslt11\" => check_cublaslt(library),\n        \"cublaslt12\" => check_cublaslt(library),\n        \"cublaslt13\" => check_cublaslt(library),\n        \"cusparse10\" => check_cusparse(library),\n        \"cusparse11\" => check_cusparse(library),\n        \"cusparse12\" => check_cusparse(library),\n        \"cufft10\" => check_cufft(library),\n        \"cufft11\" => check_cufft(library),\n        \"cufft12\" => check_cufft(library),\n        _ => Err(Error::Initialization(\n            format!(\"Library check not implemented for {}\", lib.short_name),\n            0,\n        )),\n    }\n}\n\nunsafe fn path_for_loaded_lib(lib: &'static str) -> Option<OsString> {\n    let lib = libloading::os::windows::Library::open_already_loaded(lib).ok()?;\n    let lib_handle = lib.into_raw();\n    let path = get_module_path_utf16(HMODULE(lib_handle as _));\n    libloading::os::windows::Library::from_raw(lib_handle);\n    Some(path)\n}\n\nunsafe fn check_cufft(library: libloading::Library) -> Result<Option<OsString>, Error> {\n    let hip_path = || path_for_loaded_lib(\"hipfft.dll\");\n    let cufft_create = library.get::<extern \"system\" fn(\n        handle: *mut cuda_types::cufft::cufftHandle,\n    ) -> cuda_types::cufft::cufftResult>(b\"cufftCreate\\0\")?;\n    let cufft_destroy = library.get::<extern \"system\" fn(\n        handle: cuda_types::cufft::cufftHandle,\n    ) -> cuda_types::cufft::cufftResult>(b\"cufftDestroy\\0\")?;\n    let mut handle = mem::zeroed();\n    match cufft_create(&mut handle) {\n        Ok(()) => {}\n        Err(cuda_types::cufft::cufftError_t::NOT_SUPPORTED) => {\n            return Ok(hip_path());\n        }\n        Err(err) => {\n            return Err(Error::Initialization(\n                \"cufftCreate\".to_string(),\n                err.0.get() as usize,\n            ));\n        }\n    }\n    let result = hip_path();\n    cufft_destroy(handle)\n        .map_err(|err| Error::Initialization(\"cufftDestroy\".to_string(), err.0.get() as usize))?;\n    Ok(result)\n}\n\nunsafe fn check_cublas(library: libloading::Library) -> Result<Option<OsString>, Error> {\n    let hip_path = || path_for_loaded_lib(\"rocblas.dll\");\n    let cublas_create = library.get::<extern \"system\" fn(\n        handle: *mut cuda_types::cublas::cublasHandle_t,\n    ) -> cuda_types::cublas::cublasStatus_t>(b\"cublasCreate_v2\\0\")?;\n    let cublas_destroy =\n        library.get::<extern \"system\" fn(\n            handle: cuda_types::cublas::cublasHandle_t,\n        ) -> cuda_types::cublas::cublasStatus_t>(b\"cublasDestroy_v2\\0\")?;\n    let mut handle = mem::zeroed();\n    cublas_create(&mut handle).map_err(|err| {\n        Error::Initialization(\"cublasCreate_v2\".to_string(), err.0.get() as usize)\n    })?;\n    let result = hip_path();\n    cublas_destroy(handle).map_err(|err| {\n        Error::Initialization(\"cublasDestroy_v2\".to_string(), err.0.get() as usize)\n    })?;\n    Ok(result)\n}\n\nunsafe fn check_cusparse(library: libloading::Library) -> Result<Option<OsString>, Error> {\n    let hip_path = || path_for_loaded_lib(\"rocsparse.dll\");\n    let cusparse_create =\n        library.get::<extern \"system\" fn(\n            handle: *mut cuda_types::cusparse::cusparseHandle_t,\n        ) -> cuda_types::cusparse::cusparseStatus_t>(b\"cusparseCreate\\0\")?;\n    let cusparse_destroy =\n        library.get::<extern \"system\" fn(\n            handle: cuda_types::cusparse::cusparseHandle_t,\n        ) -> cuda_types::cusparse::cusparseStatus_t>(b\"cusparseDestroy\\0\")?;\n    let mut handle = mem::zeroed();\n    match cusparse_create(&mut handle) {\n        Ok(()) => {}\n        Err(cuda_types::cusparse::cusparseError_t::NOT_SUPPORTED) => {\n            return Ok(hip_path());\n        }\n        Err(err) => {\n            return Err(Error::Initialization(\n                \"cusparseCreate\".to_string(),\n                err.0.get() as usize,\n            ));\n        }\n    }\n    let result = hip_path();\n    cusparse_destroy(handle).map_err(|err| {\n        Error::Initialization(\"cusparseDestroy\".to_string(), err.0.get() as usize)\n    })?;\n    Ok(result)\n}\n\nunsafe fn check_cublaslt(library: libloading::Library) -> Result<Option<OsString>, Error> {\n    let hip_path =\n        || path_for_loaded_lib(\"hipblaslt.dll\").or_else(|| path_for_loaded_lib(\"libhipblaslt.dll\"));\n    let cublaslt_create =\n        library.get::<extern \"system\" fn(\n            handle: *mut cuda_types::cublaslt::cublasLtHandle_t,\n        ) -> cuda_types::cublas::cublasStatus_t>(b\"cublasLtCreate\\0\")?;\n    let cublaslt_destroy =\n        library.get::<extern \"system\" fn(\n            handle: cuda_types::cublaslt::cublasLtHandle_t,\n        ) -> cuda_types::cublas::cublasStatus_t>(b\"cublasLtDestroy\\0\")?;\n    let mut handle = mem::zeroed();\n    cublaslt_create(&mut handle)\n        .map_err(|err| Error::Initialization(\"cublasLtCreate\".to_string(), err.0.get() as usize))?;\n    let result = hip_path();\n    cublaslt_destroy(handle).map_err(|err| {\n        Error::Initialization(\"cublasLtDestroy\".to_string(), err.0.get() as usize)\n    })?;\n    Ok(result)\n}\n\nunsafe fn check_cuda(library: libloading::Library) -> Result<Option<OsString>, Error> {\n    let cu_init = library\n        .get::<extern \"system\" fn(::core::ffi::c_uint) -> cuda_types::cuda::CUresult>(\n            b\"cuInit\\0\",\n        )?;\n    cu_init(0).map_err(|err| Error::Initialization(\"cuInit\".to_string(), err.0.get() as usize))?;\n    Ok(path_for_loaded_lib(\"amdhip64_7.dll\").or_else(|| path_for_loaded_lib(\"amdhip64_6.dll\")))\n}\n\nunsafe fn check_nvml(library: libloading::Library) -> Result<Option<OsString>, Error> {\n    use cuda_types::nvml::nvmlReturn_tConsts;\n    let nvml_init =\n        library.get::<extern \"system\" fn() -> cuda_types::nvml::nvmlReturn_t>(b\"nvmlInit_v2\\0\")?;\n    match nvml_init() {\n        Ok(()) | cuda_types::nvml::nvmlReturn_t::ERROR_NOT_SUPPORTED => {\n            Ok(path_for_loaded_lib(\"rocm_smi64.dll\"))\n        }\n        Err(err) => Err(Error::Initialization(\n            \"nvmlInit_v2\".to_string(),\n            err.0.get() as usize,\n        )),\n    }\n}\n\nunsafe fn check_cudnn8(library: libloading::Library) -> Result<Option<OsString>, Error> {\n    let hip_path = || path_for_loaded_lib(\"MIOpen.dll\");\n    let cudnn_create = library.get::<extern \"system\" fn(\n        handle: *mut cuda_types::cudnn8::cudnnHandle_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t>(b\"cudnnCreate\\0\")?;\n    let cudnn_destroy = library.get::<extern \"system\" fn(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t>(b\"cudnnDestroy\\0\")?;\n    let mut handle = mem::zeroed();\n    cudnn_create(&mut handle)\n        .map_err(|err| Error::Initialization(\"cudnnCreate\".to_string(), err.0.get() as usize))?;\n    let result = hip_path();\n    cudnn_destroy(handle)\n        .map_err(|err| Error::Initialization(\"cudnnDestroy\".to_string(), err.0.get() as usize))?;\n    Ok(result)\n}\n\nunsafe fn check_cudnn9(library: libloading::Library) -> Result<Option<OsString>, Error> {\n    let hip_path = || path_for_loaded_lib(\"MIOpen.dll\");\n    let cudnn_create = library.get::<extern \"system\" fn(\n        handle: *mut cuda_types::cudnn9::cudnnHandle_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t>(b\"cudnnCreate\\0\")?;\n    let cudnn_destroy = library.get::<extern \"system\" fn(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t>(b\"cudnnDestroy\\0\")?;\n    let mut handle = mem::zeroed();\n    cudnn_create(&mut handle)\n        .map_err(|err| Error::Initialization(\"cudnnCreate\".to_string(), err.0.get() as usize))?;\n    let result = hip_path();\n    cudnn_destroy(handle)\n        .map_err(|err| Error::Initialization(\"cudnnDestroy\".to_string(), err.0.get() as usize))?;\n    Ok(result)\n}\n\n#[derive(Debug)]\n#[allow(dead_code)]\nenum Error {\n    Loading(libloading::Error),\n    Initialization(String, usize),\n}\n\nimpl From<libloading::Error> for Error {\n    fn from(err: libloading::Error) -> Self {\n        Error::Loading(err)\n    }\n}\n"
  },
  {
    "path": "cuda_macros/.rustfmt.toml",
    "content": "disable_all_formatting = true\n"
  },
  {
    "path": "cuda_macros/Cargo.toml",
    "content": "[package]\nname = \"cuda_macros\"\nversion = \"0.0.0\"\nauthors = [\"Andrzej Janik <vosen@vosen.pl>\"]\nedition = \"2021\"\n\n[dependencies]\nquote = \"1.0\"\nsyn = { version = \"2.0\", features = [\"full\", \"visit-mut\", \"extra-traits\"] }\nproc-macro2 = \"1.0\"\nrustc-hash = \"2.0.0\"\n\n[lib]\nproc-macro = true\n"
  },
  {
    "path": "cuda_macros/build/wrapper.h",
    "content": "#define __CUDA_API_VERSION_INTERNAL\n#include <cuda.h>\n#include <cudaProfiler.h>\n#include <cudaGL.h>\n#include <cudaEGL.h>\n#include <vdpau/vdpau.h>\n#include <cudaVDPAU.h>\n"
  },
  {
    "path": "cuda_macros/src/cublas.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\nextern \"system\" {\n    #[must_use]\n    fn cublasCreate_v2(\n        handle: *mut cuda_types::cublas::cublasHandle_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDestroy_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasGetVersion_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        version: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasGetProperty(\n        type_: cuda_types::cublas::libraryPropertyType,\n        value: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    fn cublasGetCudartVersion() -> usize;\n    #[must_use]\n    fn cublasSetWorkspace_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        workspace: *mut ::core::ffi::c_void,\n        workspaceSizeInBytes: usize,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSetStream_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        streamId: cuda_types::cublas::cudaStream_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasGetStream_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        streamId: *mut cuda_types::cublas::cudaStream_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasGetPointerMode_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        mode: *mut cuda_types::cublas::cublasPointerMode_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSetPointerMode_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        mode: cuda_types::cublas::cublasPointerMode_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasGetAtomicsMode(\n        handle: cuda_types::cublas::cublasHandle_t,\n        mode: *mut cuda_types::cublas::cublasAtomicsMode_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSetAtomicsMode(\n        handle: cuda_types::cublas::cublasHandle_t,\n        mode: cuda_types::cublas::cublasAtomicsMode_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasGetMathMode(\n        handle: cuda_types::cublas::cublasHandle_t,\n        mode: *mut cuda_types::cublas::cublasMath_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSetMathMode(\n        handle: cuda_types::cublas::cublasHandle_t,\n        mode: cuda_types::cublas::cublasMath_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasGetSmCountTarget(\n        handle: cuda_types::cublas::cublasHandle_t,\n        smCountTarget: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSetSmCountTarget(\n        handle: cuda_types::cublas::cublasHandle_t,\n        smCountTarget: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasGetEmulationStrategy(\n        handle: cuda_types::cublas::cublasHandle_t,\n        emulationStrategy: *mut cuda_types::cublas::cublasEmulationStrategy_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSetEmulationStrategy(\n        handle: cuda_types::cublas::cublasHandle_t,\n        emulationStrategy: cuda_types::cublas::cublasEmulationStrategy_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    fn cublasGetStatusName(\n        status: cuda_types::cublas::cublasStatus_t,\n    ) -> *const ::core::ffi::c_char;\n    fn cublasGetStatusString(\n        status: cuda_types::cublas::cublasStatus_t,\n    ) -> *const ::core::ffi::c_char;\n    #[must_use]\n    fn cublasLoggerConfigure(\n        logIsOn: ::core::ffi::c_int,\n        logToStdOut: ::core::ffi::c_int,\n        logToStdErr: ::core::ffi::c_int,\n        logFileName: *const ::core::ffi::c_char,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSetLoggerCallback(\n        userCallback: cuda_types::cublas::cublasLogCallback,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasGetLoggerCallback(\n        userCallback: *mut cuda_types::cublas::cublasLogCallback,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSetVector(\n        n: ::core::ffi::c_int,\n        elemSize: ::core::ffi::c_int,\n        x: *const ::core::ffi::c_void,\n        incx: ::core::ffi::c_int,\n        devicePtr: *mut ::core::ffi::c_void,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSetVector_64(\n        n: i64,\n        elemSize: i64,\n        x: *const ::core::ffi::c_void,\n        incx: i64,\n        devicePtr: *mut ::core::ffi::c_void,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasGetVector(\n        n: ::core::ffi::c_int,\n        elemSize: ::core::ffi::c_int,\n        x: *const ::core::ffi::c_void,\n        incx: ::core::ffi::c_int,\n        y: *mut ::core::ffi::c_void,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasGetVector_64(\n        n: i64,\n        elemSize: i64,\n        x: *const ::core::ffi::c_void,\n        incx: i64,\n        y: *mut ::core::ffi::c_void,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSetMatrix(\n        rows: ::core::ffi::c_int,\n        cols: ::core::ffi::c_int,\n        elemSize: ::core::ffi::c_int,\n        A: *const ::core::ffi::c_void,\n        lda: ::core::ffi::c_int,\n        B: *mut ::core::ffi::c_void,\n        ldb: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSetMatrix_64(\n        rows: i64,\n        cols: i64,\n        elemSize: i64,\n        A: *const ::core::ffi::c_void,\n        lda: i64,\n        B: *mut ::core::ffi::c_void,\n        ldb: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasGetMatrix(\n        rows: ::core::ffi::c_int,\n        cols: ::core::ffi::c_int,\n        elemSize: ::core::ffi::c_int,\n        A: *const ::core::ffi::c_void,\n        lda: ::core::ffi::c_int,\n        B: *mut ::core::ffi::c_void,\n        ldb: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasGetMatrix_64(\n        rows: i64,\n        cols: i64,\n        elemSize: i64,\n        A: *const ::core::ffi::c_void,\n        lda: i64,\n        B: *mut ::core::ffi::c_void,\n        ldb: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSetVectorAsync(\n        n: ::core::ffi::c_int,\n        elemSize: ::core::ffi::c_int,\n        hostPtr: *const ::core::ffi::c_void,\n        incx: ::core::ffi::c_int,\n        devicePtr: *mut ::core::ffi::c_void,\n        incy: ::core::ffi::c_int,\n        stream: cuda_types::cublas::cudaStream_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSetVectorAsync_64(\n        n: i64,\n        elemSize: i64,\n        hostPtr: *const ::core::ffi::c_void,\n        incx: i64,\n        devicePtr: *mut ::core::ffi::c_void,\n        incy: i64,\n        stream: cuda_types::cublas::cudaStream_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasGetVectorAsync(\n        n: ::core::ffi::c_int,\n        elemSize: ::core::ffi::c_int,\n        devicePtr: *const ::core::ffi::c_void,\n        incx: ::core::ffi::c_int,\n        hostPtr: *mut ::core::ffi::c_void,\n        incy: ::core::ffi::c_int,\n        stream: cuda_types::cublas::cudaStream_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasGetVectorAsync_64(\n        n: i64,\n        elemSize: i64,\n        devicePtr: *const ::core::ffi::c_void,\n        incx: i64,\n        hostPtr: *mut ::core::ffi::c_void,\n        incy: i64,\n        stream: cuda_types::cublas::cudaStream_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSetMatrixAsync(\n        rows: ::core::ffi::c_int,\n        cols: ::core::ffi::c_int,\n        elemSize: ::core::ffi::c_int,\n        A: *const ::core::ffi::c_void,\n        lda: ::core::ffi::c_int,\n        B: *mut ::core::ffi::c_void,\n        ldb: ::core::ffi::c_int,\n        stream: cuda_types::cublas::cudaStream_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSetMatrixAsync_64(\n        rows: i64,\n        cols: i64,\n        elemSize: i64,\n        A: *const ::core::ffi::c_void,\n        lda: i64,\n        B: *mut ::core::ffi::c_void,\n        ldb: i64,\n        stream: cuda_types::cublas::cudaStream_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasGetMatrixAsync(\n        rows: ::core::ffi::c_int,\n        cols: ::core::ffi::c_int,\n        elemSize: ::core::ffi::c_int,\n        A: *const ::core::ffi::c_void,\n        lda: ::core::ffi::c_int,\n        B: *mut ::core::ffi::c_void,\n        ldb: ::core::ffi::c_int,\n        stream: cuda_types::cublas::cudaStream_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasGetMatrixAsync_64(\n        rows: i64,\n        cols: i64,\n        elemSize: i64,\n        A: *const ::core::ffi::c_void,\n        lda: i64,\n        B: *mut ::core::ffi::c_void,\n        ldb: i64,\n        stream: cuda_types::cublas::cudaStream_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    fn cublasXerbla(srName: *const ::core::ffi::c_char, info: ::core::ffi::c_int) -> ();\n    #[must_use]\n    fn cublasNrm2Ex(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const ::core::ffi::c_void,\n        xType: cuda_types::cublas::cudaDataType,\n        incx: ::core::ffi::c_int,\n        result: *mut ::core::ffi::c_void,\n        resultType: cuda_types::cublas::cudaDataType,\n        executionType: cuda_types::cublas::cudaDataType,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasNrm2Ex_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const ::core::ffi::c_void,\n        xType: cuda_types::cublas::cudaDataType,\n        incx: i64,\n        result: *mut ::core::ffi::c_void,\n        resultType: cuda_types::cublas::cudaDataType,\n        executionType: cuda_types::cublas::cudaDataType,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSnrm2_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const f32,\n        incx: ::core::ffi::c_int,\n        result: *mut f32,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSnrm2_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const f32,\n        incx: i64,\n        result: *mut f32,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDnrm2_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const f64,\n        incx: ::core::ffi::c_int,\n        result: *mut f64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDnrm2_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const f64,\n        incx: i64,\n        result: *mut f64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasScnrm2_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n        result: *mut f32,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasScnrm2_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: i64,\n        result: *mut f32,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDznrm2_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n        result: *mut f64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDznrm2_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n        result: *mut f64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDotEx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const ::core::ffi::c_void,\n        xType: cuda_types::cublas::cudaDataType,\n        incx: ::core::ffi::c_int,\n        y: *const ::core::ffi::c_void,\n        yType: cuda_types::cublas::cudaDataType,\n        incy: ::core::ffi::c_int,\n        result: *mut ::core::ffi::c_void,\n        resultType: cuda_types::cublas::cudaDataType,\n        executionType: cuda_types::cublas::cudaDataType,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDotEx_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const ::core::ffi::c_void,\n        xType: cuda_types::cublas::cudaDataType,\n        incx: i64,\n        y: *const ::core::ffi::c_void,\n        yType: cuda_types::cublas::cudaDataType,\n        incy: i64,\n        result: *mut ::core::ffi::c_void,\n        resultType: cuda_types::cublas::cudaDataType,\n        executionType: cuda_types::cublas::cudaDataType,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDotcEx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const ::core::ffi::c_void,\n        xType: cuda_types::cublas::cudaDataType,\n        incx: ::core::ffi::c_int,\n        y: *const ::core::ffi::c_void,\n        yType: cuda_types::cublas::cudaDataType,\n        incy: ::core::ffi::c_int,\n        result: *mut ::core::ffi::c_void,\n        resultType: cuda_types::cublas::cudaDataType,\n        executionType: cuda_types::cublas::cudaDataType,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDotcEx_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const ::core::ffi::c_void,\n        xType: cuda_types::cublas::cudaDataType,\n        incx: i64,\n        y: *const ::core::ffi::c_void,\n        yType: cuda_types::cublas::cudaDataType,\n        incy: i64,\n        result: *mut ::core::ffi::c_void,\n        resultType: cuda_types::cublas::cudaDataType,\n        executionType: cuda_types::cublas::cudaDataType,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSdot_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const f32,\n        incx: ::core::ffi::c_int,\n        y: *const f32,\n        incy: ::core::ffi::c_int,\n        result: *mut f32,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSdot_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const f32,\n        incx: i64,\n        y: *const f32,\n        incy: i64,\n        result: *mut f32,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDdot_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const f64,\n        incx: ::core::ffi::c_int,\n        y: *const f64,\n        incy: ::core::ffi::c_int,\n        result: *mut f64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDdot_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const f64,\n        incx: i64,\n        y: *const f64,\n        incy: i64,\n        result: *mut f64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCdotu_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n        y: *const cuda_types::cublas::cuComplex,\n        incy: ::core::ffi::c_int,\n        result: *mut cuda_types::cublas::cuComplex,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCdotu_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: i64,\n        y: *const cuda_types::cublas::cuComplex,\n        incy: i64,\n        result: *mut cuda_types::cublas::cuComplex,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCdotc_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n        y: *const cuda_types::cublas::cuComplex,\n        incy: ::core::ffi::c_int,\n        result: *mut cuda_types::cublas::cuComplex,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCdotc_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: i64,\n        y: *const cuda_types::cublas::cuComplex,\n        incy: i64,\n        result: *mut cuda_types::cublas::cuComplex,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZdotu_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n        y: *const cuda_types::cublas::cuDoubleComplex,\n        incy: ::core::ffi::c_int,\n        result: *mut cuda_types::cublas::cuDoubleComplex,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZdotu_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n        y: *const cuda_types::cublas::cuDoubleComplex,\n        incy: i64,\n        result: *mut cuda_types::cublas::cuDoubleComplex,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZdotc_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n        y: *const cuda_types::cublas::cuDoubleComplex,\n        incy: ::core::ffi::c_int,\n        result: *mut cuda_types::cublas::cuDoubleComplex,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZdotc_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n        y: *const cuda_types::cublas::cuDoubleComplex,\n        incy: i64,\n        result: *mut cuda_types::cublas::cuDoubleComplex,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasScalEx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        alpha: *const ::core::ffi::c_void,\n        alphaType: cuda_types::cublas::cudaDataType,\n        x: *mut ::core::ffi::c_void,\n        xType: cuda_types::cublas::cudaDataType,\n        incx: ::core::ffi::c_int,\n        executionType: cuda_types::cublas::cudaDataType,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasScalEx_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        alpha: *const ::core::ffi::c_void,\n        alphaType: cuda_types::cublas::cudaDataType,\n        x: *mut ::core::ffi::c_void,\n        xType: cuda_types::cublas::cudaDataType,\n        incx: i64,\n        executionType: cuda_types::cublas::cudaDataType,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSscal_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        x: *mut f32,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSscal_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        alpha: *const f32,\n        x: *mut f32,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDscal_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        alpha: *const f64,\n        x: *mut f64,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDscal_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        alpha: *const f64,\n        x: *mut f64,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCscal_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        x: *mut cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCscal_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        x: *mut cuda_types::cublas::cuComplex,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCsscal_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        x: *mut cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCsscal_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        alpha: *const f32,\n        x: *mut cuda_types::cublas::cuComplex,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZscal_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        x: *mut cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZscal_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        x: *mut cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZdscal_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        alpha: *const f64,\n        x: *mut cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZdscal_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        alpha: *const f64,\n        x: *mut cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasAxpyEx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        alpha: *const ::core::ffi::c_void,\n        alphaType: cuda_types::cublas::cudaDataType,\n        x: *const ::core::ffi::c_void,\n        xType: cuda_types::cublas::cudaDataType,\n        incx: ::core::ffi::c_int,\n        y: *mut ::core::ffi::c_void,\n        yType: cuda_types::cublas::cudaDataType,\n        incy: ::core::ffi::c_int,\n        executiontype: cuda_types::cublas::cudaDataType,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasAxpyEx_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        alpha: *const ::core::ffi::c_void,\n        alphaType: cuda_types::cublas::cudaDataType,\n        x: *const ::core::ffi::c_void,\n        xType: cuda_types::cublas::cudaDataType,\n        incx: i64,\n        y: *mut ::core::ffi::c_void,\n        yType: cuda_types::cublas::cudaDataType,\n        incy: i64,\n        executiontype: cuda_types::cublas::cudaDataType,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSaxpy_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        x: *const f32,\n        incx: ::core::ffi::c_int,\n        y: *mut f32,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSaxpy_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        alpha: *const f32,\n        x: *const f32,\n        incx: i64,\n        y: *mut f32,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDaxpy_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        alpha: *const f64,\n        x: *const f64,\n        incx: ::core::ffi::c_int,\n        y: *mut f64,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDaxpy_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        alpha: *const f64,\n        x: *const f64,\n        incx: i64,\n        y: *mut f64,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCaxpy_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n        y: *mut cuda_types::cublas::cuComplex,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCaxpy_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: i64,\n        y: *mut cuda_types::cublas::cuComplex,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZaxpy_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n        y: *mut cuda_types::cublas::cuDoubleComplex,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZaxpy_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n        y: *mut cuda_types::cublas::cuDoubleComplex,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCopyEx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const ::core::ffi::c_void,\n        xType: cuda_types::cublas::cudaDataType,\n        incx: ::core::ffi::c_int,\n        y: *mut ::core::ffi::c_void,\n        yType: cuda_types::cublas::cudaDataType,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCopyEx_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const ::core::ffi::c_void,\n        xType: cuda_types::cublas::cudaDataType,\n        incx: i64,\n        y: *mut ::core::ffi::c_void,\n        yType: cuda_types::cublas::cudaDataType,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasScopy_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const f32,\n        incx: ::core::ffi::c_int,\n        y: *mut f32,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasScopy_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const f32,\n        incx: i64,\n        y: *mut f32,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDcopy_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const f64,\n        incx: ::core::ffi::c_int,\n        y: *mut f64,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDcopy_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const f64,\n        incx: i64,\n        y: *mut f64,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCcopy_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n        y: *mut cuda_types::cublas::cuComplex,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCcopy_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: i64,\n        y: *mut cuda_types::cublas::cuComplex,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZcopy_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n        y: *mut cuda_types::cublas::cuDoubleComplex,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZcopy_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n        y: *mut cuda_types::cublas::cuDoubleComplex,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSswap_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *mut f32,\n        incx: ::core::ffi::c_int,\n        y: *mut f32,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSswap_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *mut f32,\n        incx: i64,\n        y: *mut f32,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDswap_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *mut f64,\n        incx: ::core::ffi::c_int,\n        y: *mut f64,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDswap_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *mut f64,\n        incx: i64,\n        y: *mut f64,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCswap_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *mut cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n        y: *mut cuda_types::cublas::cuComplex,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCswap_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *mut cuda_types::cublas::cuComplex,\n        incx: i64,\n        y: *mut cuda_types::cublas::cuComplex,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZswap_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *mut cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n        y: *mut cuda_types::cublas::cuDoubleComplex,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZswap_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *mut cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n        y: *mut cuda_types::cublas::cuDoubleComplex,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSwapEx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *mut ::core::ffi::c_void,\n        xType: cuda_types::cublas::cudaDataType,\n        incx: ::core::ffi::c_int,\n        y: *mut ::core::ffi::c_void,\n        yType: cuda_types::cublas::cudaDataType,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSwapEx_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *mut ::core::ffi::c_void,\n        xType: cuda_types::cublas::cudaDataType,\n        incx: i64,\n        y: *mut ::core::ffi::c_void,\n        yType: cuda_types::cublas::cudaDataType,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasIsamax_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const f32,\n        incx: ::core::ffi::c_int,\n        result: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasIsamax_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const f32,\n        incx: i64,\n        result: *mut i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasIdamax_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const f64,\n        incx: ::core::ffi::c_int,\n        result: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasIdamax_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const f64,\n        incx: i64,\n        result: *mut i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasIcamax_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n        result: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasIcamax_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: i64,\n        result: *mut i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasIzamax_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n        result: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasIzamax_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n        result: *mut i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasIamaxEx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const ::core::ffi::c_void,\n        xType: cuda_types::cublas::cudaDataType,\n        incx: ::core::ffi::c_int,\n        result: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasIamaxEx_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const ::core::ffi::c_void,\n        xType: cuda_types::cublas::cudaDataType,\n        incx: i64,\n        result: *mut i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasIsamin_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const f32,\n        incx: ::core::ffi::c_int,\n        result: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasIsamin_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const f32,\n        incx: i64,\n        result: *mut i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasIdamin_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const f64,\n        incx: ::core::ffi::c_int,\n        result: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasIdamin_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const f64,\n        incx: i64,\n        result: *mut i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasIcamin_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n        result: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasIcamin_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: i64,\n        result: *mut i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasIzamin_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n        result: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasIzamin_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n        result: *mut i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasIaminEx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const ::core::ffi::c_void,\n        xType: cuda_types::cublas::cudaDataType,\n        incx: ::core::ffi::c_int,\n        result: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasIaminEx_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const ::core::ffi::c_void,\n        xType: cuda_types::cublas::cudaDataType,\n        incx: i64,\n        result: *mut i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasAsumEx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const ::core::ffi::c_void,\n        xType: cuda_types::cublas::cudaDataType,\n        incx: ::core::ffi::c_int,\n        result: *mut ::core::ffi::c_void,\n        resultType: cuda_types::cublas::cudaDataType,\n        executiontype: cuda_types::cublas::cudaDataType,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasAsumEx_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const ::core::ffi::c_void,\n        xType: cuda_types::cublas::cudaDataType,\n        incx: i64,\n        result: *mut ::core::ffi::c_void,\n        resultType: cuda_types::cublas::cudaDataType,\n        executiontype: cuda_types::cublas::cudaDataType,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSasum_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const f32,\n        incx: ::core::ffi::c_int,\n        result: *mut f32,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSasum_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const f32,\n        incx: i64,\n        result: *mut f32,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDasum_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const f64,\n        incx: ::core::ffi::c_int,\n        result: *mut f64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDasum_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const f64,\n        incx: i64,\n        result: *mut f64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasScasum_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n        result: *mut f32,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasScasum_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: i64,\n        result: *mut f32,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDzasum_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n        result: *mut f64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDzasum_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n        result: *mut f64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSrot_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *mut f32,\n        incx: ::core::ffi::c_int,\n        y: *mut f32,\n        incy: ::core::ffi::c_int,\n        c: *const f32,\n        s: *const f32,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSrot_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *mut f32,\n        incx: i64,\n        y: *mut f32,\n        incy: i64,\n        c: *const f32,\n        s: *const f32,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDrot_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *mut f64,\n        incx: ::core::ffi::c_int,\n        y: *mut f64,\n        incy: ::core::ffi::c_int,\n        c: *const f64,\n        s: *const f64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDrot_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *mut f64,\n        incx: i64,\n        y: *mut f64,\n        incy: i64,\n        c: *const f64,\n        s: *const f64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCrot_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *mut cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n        y: *mut cuda_types::cublas::cuComplex,\n        incy: ::core::ffi::c_int,\n        c: *const f32,\n        s: *const cuda_types::cublas::cuComplex,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCrot_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *mut cuda_types::cublas::cuComplex,\n        incx: i64,\n        y: *mut cuda_types::cublas::cuComplex,\n        incy: i64,\n        c: *const f32,\n        s: *const cuda_types::cublas::cuComplex,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCsrot_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *mut cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n        y: *mut cuda_types::cublas::cuComplex,\n        incy: ::core::ffi::c_int,\n        c: *const f32,\n        s: *const f32,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCsrot_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *mut cuda_types::cublas::cuComplex,\n        incx: i64,\n        y: *mut cuda_types::cublas::cuComplex,\n        incy: i64,\n        c: *const f32,\n        s: *const f32,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZrot_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *mut cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n        y: *mut cuda_types::cublas::cuDoubleComplex,\n        incy: ::core::ffi::c_int,\n        c: *const f64,\n        s: *const cuda_types::cublas::cuDoubleComplex,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZrot_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *mut cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n        y: *mut cuda_types::cublas::cuDoubleComplex,\n        incy: i64,\n        c: *const f64,\n        s: *const cuda_types::cublas::cuDoubleComplex,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZdrot_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *mut cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n        y: *mut cuda_types::cublas::cuDoubleComplex,\n        incy: ::core::ffi::c_int,\n        c: *const f64,\n        s: *const f64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZdrot_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *mut cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n        y: *mut cuda_types::cublas::cuDoubleComplex,\n        incy: i64,\n        c: *const f64,\n        s: *const f64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasRotEx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *mut ::core::ffi::c_void,\n        xType: cuda_types::cublas::cudaDataType,\n        incx: ::core::ffi::c_int,\n        y: *mut ::core::ffi::c_void,\n        yType: cuda_types::cublas::cudaDataType,\n        incy: ::core::ffi::c_int,\n        c: *const ::core::ffi::c_void,\n        s: *const ::core::ffi::c_void,\n        csType: cuda_types::cublas::cudaDataType,\n        executiontype: cuda_types::cublas::cudaDataType,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasRotEx_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *mut ::core::ffi::c_void,\n        xType: cuda_types::cublas::cudaDataType,\n        incx: i64,\n        y: *mut ::core::ffi::c_void,\n        yType: cuda_types::cublas::cudaDataType,\n        incy: i64,\n        c: *const ::core::ffi::c_void,\n        s: *const ::core::ffi::c_void,\n        csType: cuda_types::cublas::cudaDataType,\n        executiontype: cuda_types::cublas::cudaDataType,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSrotg_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        a: *mut f32,\n        b: *mut f32,\n        c: *mut f32,\n        s: *mut f32,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDrotg_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        a: *mut f64,\n        b: *mut f64,\n        c: *mut f64,\n        s: *mut f64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCrotg_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        a: *mut cuda_types::cublas::cuComplex,\n        b: *mut cuda_types::cublas::cuComplex,\n        c: *mut f32,\n        s: *mut cuda_types::cublas::cuComplex,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZrotg_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        a: *mut cuda_types::cublas::cuDoubleComplex,\n        b: *mut cuda_types::cublas::cuDoubleComplex,\n        c: *mut f64,\n        s: *mut cuda_types::cublas::cuDoubleComplex,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasRotgEx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        a: *mut ::core::ffi::c_void,\n        b: *mut ::core::ffi::c_void,\n        abType: cuda_types::cublas::cudaDataType,\n        c: *mut ::core::ffi::c_void,\n        s: *mut ::core::ffi::c_void,\n        csType: cuda_types::cublas::cudaDataType,\n        executiontype: cuda_types::cublas::cudaDataType,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSrotm_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *mut f32,\n        incx: ::core::ffi::c_int,\n        y: *mut f32,\n        incy: ::core::ffi::c_int,\n        param: *const f32,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSrotm_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *mut f32,\n        incx: i64,\n        y: *mut f32,\n        incy: i64,\n        param: *const f32,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDrotm_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *mut f64,\n        incx: ::core::ffi::c_int,\n        y: *mut f64,\n        incy: ::core::ffi::c_int,\n        param: *const f64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDrotm_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *mut f64,\n        incx: i64,\n        y: *mut f64,\n        incy: i64,\n        param: *const f64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasRotmEx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        x: *mut ::core::ffi::c_void,\n        xType: cuda_types::cublas::cudaDataType,\n        incx: ::core::ffi::c_int,\n        y: *mut ::core::ffi::c_void,\n        yType: cuda_types::cublas::cudaDataType,\n        incy: ::core::ffi::c_int,\n        param: *const ::core::ffi::c_void,\n        paramType: cuda_types::cublas::cudaDataType,\n        executiontype: cuda_types::cublas::cudaDataType,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasRotmEx_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: i64,\n        x: *mut ::core::ffi::c_void,\n        xType: cuda_types::cublas::cudaDataType,\n        incx: i64,\n        y: *mut ::core::ffi::c_void,\n        yType: cuda_types::cublas::cudaDataType,\n        incy: i64,\n        param: *const ::core::ffi::c_void,\n        paramType: cuda_types::cublas::cudaDataType,\n        executiontype: cuda_types::cublas::cudaDataType,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSrotmg_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        d1: *mut f32,\n        d2: *mut f32,\n        x1: *mut f32,\n        y1: *const f32,\n        param: *mut f32,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDrotmg_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        d1: *mut f64,\n        d2: *mut f64,\n        x1: *mut f64,\n        y1: *const f64,\n        param: *mut f64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasRotmgEx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        d1: *mut ::core::ffi::c_void,\n        d1Type: cuda_types::cublas::cudaDataType,\n        d2: *mut ::core::ffi::c_void,\n        d2Type: cuda_types::cublas::cudaDataType,\n        x1: *mut ::core::ffi::c_void,\n        x1Type: cuda_types::cublas::cudaDataType,\n        y1: *const ::core::ffi::c_void,\n        y1Type: cuda_types::cublas::cudaDataType,\n        param: *mut ::core::ffi::c_void,\n        paramType: cuda_types::cublas::cudaDataType,\n        executiontype: cuda_types::cublas::cudaDataType,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSgemv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: ::core::ffi::c_int,\n        x: *const f32,\n        incx: ::core::ffi::c_int,\n        beta: *const f32,\n        y: *mut f32,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSgemv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        x: *const f32,\n        incx: i64,\n        beta: *const f32,\n        y: *mut f32,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDgemv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: ::core::ffi::c_int,\n        x: *const f64,\n        incx: ::core::ffi::c_int,\n        beta: *const f64,\n        y: *mut f64,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDgemv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        x: *const f64,\n        incx: i64,\n        beta: *const f64,\n        y: *mut f64,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgemv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuComplex,\n        y: *mut cuda_types::cublas::cuComplex,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgemv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: i64,\n        beta: *const cuda_types::cublas::cuComplex,\n        y: *mut cuda_types::cublas::cuComplex,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZgemv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        y: *mut cuda_types::cublas::cuDoubleComplex,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZgemv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        y: *mut cuda_types::cublas::cuDoubleComplex,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSgbmv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        kl: ::core::ffi::c_int,\n        ku: ::core::ffi::c_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: ::core::ffi::c_int,\n        x: *const f32,\n        incx: ::core::ffi::c_int,\n        beta: *const f32,\n        y: *mut f32,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSgbmv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        kl: i64,\n        ku: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        x: *const f32,\n        incx: i64,\n        beta: *const f32,\n        y: *mut f32,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDgbmv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        kl: ::core::ffi::c_int,\n        ku: ::core::ffi::c_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: ::core::ffi::c_int,\n        x: *const f64,\n        incx: ::core::ffi::c_int,\n        beta: *const f64,\n        y: *mut f64,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDgbmv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        kl: i64,\n        ku: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        x: *const f64,\n        incx: i64,\n        beta: *const f64,\n        y: *mut f64,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgbmv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        kl: ::core::ffi::c_int,\n        ku: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuComplex,\n        y: *mut cuda_types::cublas::cuComplex,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgbmv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        kl: i64,\n        ku: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: i64,\n        beta: *const cuda_types::cublas::cuComplex,\n        y: *mut cuda_types::cublas::cuComplex,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZgbmv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        kl: ::core::ffi::c_int,\n        ku: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        y: *mut cuda_types::cublas::cuDoubleComplex,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZgbmv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        kl: i64,\n        ku: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        y: *mut cuda_types::cublas::cuDoubleComplex,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasStrmv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: ::core::ffi::c_int,\n        A: *const f32,\n        lda: ::core::ffi::c_int,\n        x: *mut f32,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasStrmv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: i64,\n        A: *const f32,\n        lda: i64,\n        x: *mut f32,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDtrmv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: ::core::ffi::c_int,\n        A: *const f64,\n        lda: ::core::ffi::c_int,\n        x: *mut f64,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDtrmv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: i64,\n        A: *const f64,\n        lda: i64,\n        x: *mut f64,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCtrmv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: ::core::ffi::c_int,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        x: *mut cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCtrmv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: i64,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        x: *mut cuda_types::cublas::cuComplex,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZtrmv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: ::core::ffi::c_int,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        x: *mut cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZtrmv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: i64,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n        x: *mut cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasStbmv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        A: *const f32,\n        lda: ::core::ffi::c_int,\n        x: *mut f32,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasStbmv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: i64,\n        k: i64,\n        A: *const f32,\n        lda: i64,\n        x: *mut f32,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDtbmv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        A: *const f64,\n        lda: ::core::ffi::c_int,\n        x: *mut f64,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDtbmv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: i64,\n        k: i64,\n        A: *const f64,\n        lda: i64,\n        x: *mut f64,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCtbmv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        x: *mut cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCtbmv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: i64,\n        k: i64,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        x: *mut cuda_types::cublas::cuComplex,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZtbmv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        x: *mut cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZtbmv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: i64,\n        k: i64,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n        x: *mut cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasStpmv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: ::core::ffi::c_int,\n        AP: *const f32,\n        x: *mut f32,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasStpmv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: i64,\n        AP: *const f32,\n        x: *mut f32,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDtpmv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: ::core::ffi::c_int,\n        AP: *const f64,\n        x: *mut f64,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDtpmv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: i64,\n        AP: *const f64,\n        x: *mut f64,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCtpmv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: ::core::ffi::c_int,\n        AP: *const cuda_types::cublas::cuComplex,\n        x: *mut cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCtpmv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: i64,\n        AP: *const cuda_types::cublas::cuComplex,\n        x: *mut cuda_types::cublas::cuComplex,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZtpmv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: ::core::ffi::c_int,\n        AP: *const cuda_types::cublas::cuDoubleComplex,\n        x: *mut cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZtpmv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: i64,\n        AP: *const cuda_types::cublas::cuDoubleComplex,\n        x: *mut cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasStrsv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: ::core::ffi::c_int,\n        A: *const f32,\n        lda: ::core::ffi::c_int,\n        x: *mut f32,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasStrsv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: i64,\n        A: *const f32,\n        lda: i64,\n        x: *mut f32,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDtrsv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: ::core::ffi::c_int,\n        A: *const f64,\n        lda: ::core::ffi::c_int,\n        x: *mut f64,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDtrsv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: i64,\n        A: *const f64,\n        lda: i64,\n        x: *mut f64,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCtrsv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: ::core::ffi::c_int,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        x: *mut cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCtrsv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: i64,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        x: *mut cuda_types::cublas::cuComplex,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZtrsv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: ::core::ffi::c_int,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        x: *mut cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZtrsv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: i64,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n        x: *mut cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasStpsv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: ::core::ffi::c_int,\n        AP: *const f32,\n        x: *mut f32,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasStpsv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: i64,\n        AP: *const f32,\n        x: *mut f32,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDtpsv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: ::core::ffi::c_int,\n        AP: *const f64,\n        x: *mut f64,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDtpsv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: i64,\n        AP: *const f64,\n        x: *mut f64,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCtpsv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: ::core::ffi::c_int,\n        AP: *const cuda_types::cublas::cuComplex,\n        x: *mut cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCtpsv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: i64,\n        AP: *const cuda_types::cublas::cuComplex,\n        x: *mut cuda_types::cublas::cuComplex,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZtpsv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: ::core::ffi::c_int,\n        AP: *const cuda_types::cublas::cuDoubleComplex,\n        x: *mut cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZtpsv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: i64,\n        AP: *const cuda_types::cublas::cuDoubleComplex,\n        x: *mut cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasStbsv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        A: *const f32,\n        lda: ::core::ffi::c_int,\n        x: *mut f32,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasStbsv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: i64,\n        k: i64,\n        A: *const f32,\n        lda: i64,\n        x: *mut f32,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDtbsv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        A: *const f64,\n        lda: ::core::ffi::c_int,\n        x: *mut f64,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDtbsv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: i64,\n        k: i64,\n        A: *const f64,\n        lda: i64,\n        x: *mut f64,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCtbsv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        x: *mut cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCtbsv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: i64,\n        k: i64,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        x: *mut cuda_types::cublas::cuComplex,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZtbsv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        x: *mut cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZtbsv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        n: i64,\n        k: i64,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n        x: *mut cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSsymv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: ::core::ffi::c_int,\n        x: *const f32,\n        incx: ::core::ffi::c_int,\n        beta: *const f32,\n        y: *mut f32,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSsymv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        x: *const f32,\n        incx: i64,\n        beta: *const f32,\n        y: *mut f32,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDsymv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: ::core::ffi::c_int,\n        x: *const f64,\n        incx: ::core::ffi::c_int,\n        beta: *const f64,\n        y: *mut f64,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDsymv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        x: *const f64,\n        incx: i64,\n        beta: *const f64,\n        y: *mut f64,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCsymv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuComplex,\n        y: *mut cuda_types::cublas::cuComplex,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCsymv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: i64,\n        beta: *const cuda_types::cublas::cuComplex,\n        y: *mut cuda_types::cublas::cuComplex,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZsymv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        y: *mut cuda_types::cublas::cuDoubleComplex,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZsymv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        y: *mut cuda_types::cublas::cuDoubleComplex,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasChemv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuComplex,\n        y: *mut cuda_types::cublas::cuComplex,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasChemv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: i64,\n        beta: *const cuda_types::cublas::cuComplex,\n        y: *mut cuda_types::cublas::cuComplex,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZhemv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        y: *mut cuda_types::cublas::cuDoubleComplex,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZhemv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        y: *mut cuda_types::cublas::cuDoubleComplex,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSsbmv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: ::core::ffi::c_int,\n        x: *const f32,\n        incx: ::core::ffi::c_int,\n        beta: *const f32,\n        y: *mut f32,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSsbmv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        x: *const f32,\n        incx: i64,\n        beta: *const f32,\n        y: *mut f32,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDsbmv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: ::core::ffi::c_int,\n        x: *const f64,\n        incx: ::core::ffi::c_int,\n        beta: *const f64,\n        y: *mut f64,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDsbmv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        x: *const f64,\n        incx: i64,\n        beta: *const f64,\n        y: *mut f64,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasChbmv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuComplex,\n        y: *mut cuda_types::cublas::cuComplex,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasChbmv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: i64,\n        beta: *const cuda_types::cublas::cuComplex,\n        y: *mut cuda_types::cublas::cuComplex,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZhbmv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        y: *mut cuda_types::cublas::cuDoubleComplex,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZhbmv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        y: *mut cuda_types::cublas::cuDoubleComplex,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSspmv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        AP: *const f32,\n        x: *const f32,\n        incx: ::core::ffi::c_int,\n        beta: *const f32,\n        y: *mut f32,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSspmv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const f32,\n        AP: *const f32,\n        x: *const f32,\n        incx: i64,\n        beta: *const f32,\n        y: *mut f32,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDspmv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const f64,\n        AP: *const f64,\n        x: *const f64,\n        incx: ::core::ffi::c_int,\n        beta: *const f64,\n        y: *mut f64,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDspmv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const f64,\n        AP: *const f64,\n        x: *const f64,\n        incx: i64,\n        beta: *const f64,\n        y: *mut f64,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasChpmv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        AP: *const cuda_types::cublas::cuComplex,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuComplex,\n        y: *mut cuda_types::cublas::cuComplex,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasChpmv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        AP: *const cuda_types::cublas::cuComplex,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: i64,\n        beta: *const cuda_types::cublas::cuComplex,\n        y: *mut cuda_types::cublas::cuComplex,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZhpmv_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        AP: *const cuda_types::cublas::cuDoubleComplex,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        y: *mut cuda_types::cublas::cuDoubleComplex,\n        incy: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZhpmv_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        AP: *const cuda_types::cublas::cuDoubleComplex,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        y: *mut cuda_types::cublas::cuDoubleComplex,\n        incy: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSger_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        x: *const f32,\n        incx: ::core::ffi::c_int,\n        y: *const f32,\n        incy: ::core::ffi::c_int,\n        A: *mut f32,\n        lda: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSger_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        x: *const f32,\n        incx: i64,\n        y: *const f32,\n        incy: i64,\n        A: *mut f32,\n        lda: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDger_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f64,\n        x: *const f64,\n        incx: ::core::ffi::c_int,\n        y: *const f64,\n        incy: ::core::ffi::c_int,\n        A: *mut f64,\n        lda: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDger_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        m: i64,\n        n: i64,\n        alpha: *const f64,\n        x: *const f64,\n        incx: i64,\n        y: *const f64,\n        incy: i64,\n        A: *mut f64,\n        lda: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgeru_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n        y: *const cuda_types::cublas::cuComplex,\n        incy: ::core::ffi::c_int,\n        A: *mut cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgeru_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        m: i64,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: i64,\n        y: *const cuda_types::cublas::cuComplex,\n        incy: i64,\n        A: *mut cuda_types::cublas::cuComplex,\n        lda: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgerc_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n        y: *const cuda_types::cublas::cuComplex,\n        incy: ::core::ffi::c_int,\n        A: *mut cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgerc_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        m: i64,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: i64,\n        y: *const cuda_types::cublas::cuComplex,\n        incy: i64,\n        A: *mut cuda_types::cublas::cuComplex,\n        lda: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZgeru_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n        y: *const cuda_types::cublas::cuDoubleComplex,\n        incy: ::core::ffi::c_int,\n        A: *mut cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZgeru_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        m: i64,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n        y: *const cuda_types::cublas::cuDoubleComplex,\n        incy: i64,\n        A: *mut cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZgerc_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n        y: *const cuda_types::cublas::cuDoubleComplex,\n        incy: ::core::ffi::c_int,\n        A: *mut cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZgerc_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        m: i64,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n        y: *const cuda_types::cublas::cuDoubleComplex,\n        incy: i64,\n        A: *mut cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSsyr_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        x: *const f32,\n        incx: ::core::ffi::c_int,\n        A: *mut f32,\n        lda: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSsyr_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const f32,\n        x: *const f32,\n        incx: i64,\n        A: *mut f32,\n        lda: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDsyr_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const f64,\n        x: *const f64,\n        incx: ::core::ffi::c_int,\n        A: *mut f64,\n        lda: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDsyr_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const f64,\n        x: *const f64,\n        incx: i64,\n        A: *mut f64,\n        lda: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCsyr_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n        A: *mut cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCsyr_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: i64,\n        A: *mut cuda_types::cublas::cuComplex,\n        lda: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZsyr_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n        A: *mut cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZsyr_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n        A: *mut cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCher_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n        A: *mut cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCher_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const f32,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: i64,\n        A: *mut cuda_types::cublas::cuComplex,\n        lda: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZher_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const f64,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n        A: *mut cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZher_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const f64,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n        A: *mut cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSspr_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        x: *const f32,\n        incx: ::core::ffi::c_int,\n        AP: *mut f32,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSspr_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const f32,\n        x: *const f32,\n        incx: i64,\n        AP: *mut f32,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDspr_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const f64,\n        x: *const f64,\n        incx: ::core::ffi::c_int,\n        AP: *mut f64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDspr_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const f64,\n        x: *const f64,\n        incx: i64,\n        AP: *mut f64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasChpr_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n        AP: *mut cuda_types::cublas::cuComplex,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasChpr_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const f32,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: i64,\n        AP: *mut cuda_types::cublas::cuComplex,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZhpr_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const f64,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n        AP: *mut cuda_types::cublas::cuDoubleComplex,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZhpr_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const f64,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n        AP: *mut cuda_types::cublas::cuDoubleComplex,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSsyr2_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        x: *const f32,\n        incx: ::core::ffi::c_int,\n        y: *const f32,\n        incy: ::core::ffi::c_int,\n        A: *mut f32,\n        lda: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSsyr2_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const f32,\n        x: *const f32,\n        incx: i64,\n        y: *const f32,\n        incy: i64,\n        A: *mut f32,\n        lda: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDsyr2_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const f64,\n        x: *const f64,\n        incx: ::core::ffi::c_int,\n        y: *const f64,\n        incy: ::core::ffi::c_int,\n        A: *mut f64,\n        lda: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDsyr2_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const f64,\n        x: *const f64,\n        incx: i64,\n        y: *const f64,\n        incy: i64,\n        A: *mut f64,\n        lda: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCsyr2_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n        y: *const cuda_types::cublas::cuComplex,\n        incy: ::core::ffi::c_int,\n        A: *mut cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCsyr2_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: i64,\n        y: *const cuda_types::cublas::cuComplex,\n        incy: i64,\n        A: *mut cuda_types::cublas::cuComplex,\n        lda: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZsyr2_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n        y: *const cuda_types::cublas::cuDoubleComplex,\n        incy: ::core::ffi::c_int,\n        A: *mut cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZsyr2_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n        y: *const cuda_types::cublas::cuDoubleComplex,\n        incy: i64,\n        A: *mut cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCher2_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n        y: *const cuda_types::cublas::cuComplex,\n        incy: ::core::ffi::c_int,\n        A: *mut cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCher2_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: i64,\n        y: *const cuda_types::cublas::cuComplex,\n        incy: i64,\n        A: *mut cuda_types::cublas::cuComplex,\n        lda: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZher2_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n        y: *const cuda_types::cublas::cuDoubleComplex,\n        incy: ::core::ffi::c_int,\n        A: *mut cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZher2_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n        y: *const cuda_types::cublas::cuDoubleComplex,\n        incy: i64,\n        A: *mut cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSspr2_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        x: *const f32,\n        incx: ::core::ffi::c_int,\n        y: *const f32,\n        incy: ::core::ffi::c_int,\n        AP: *mut f32,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSspr2_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const f32,\n        x: *const f32,\n        incx: i64,\n        y: *const f32,\n        incy: i64,\n        AP: *mut f32,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDspr2_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const f64,\n        x: *const f64,\n        incx: ::core::ffi::c_int,\n        y: *const f64,\n        incy: ::core::ffi::c_int,\n        AP: *mut f64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDspr2_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const f64,\n        x: *const f64,\n        incx: i64,\n        y: *const f64,\n        incy: i64,\n        AP: *mut f64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasChpr2_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n        y: *const cuda_types::cublas::cuComplex,\n        incy: ::core::ffi::c_int,\n        AP: *mut cuda_types::cublas::cuComplex,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasChpr2_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: i64,\n        y: *const cuda_types::cublas::cuComplex,\n        incy: i64,\n        AP: *mut cuda_types::cublas::cuComplex,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZhpr2_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n        y: *const cuda_types::cublas::cuDoubleComplex,\n        incy: ::core::ffi::c_int,\n        AP: *mut cuda_types::cublas::cuDoubleComplex,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZhpr2_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n        y: *const cuda_types::cublas::cuDoubleComplex,\n        incy: i64,\n        AP: *mut cuda_types::cublas::cuDoubleComplex,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSgemvBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        Aarray: *const *const f32,\n        lda: ::core::ffi::c_int,\n        xarray: *const *const f32,\n        incx: ::core::ffi::c_int,\n        beta: *const f32,\n        yarray: *const *mut f32,\n        incy: ::core::ffi::c_int,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSgemvBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        Aarray: *const *const f32,\n        lda: i64,\n        xarray: *const *const f32,\n        incx: i64,\n        beta: *const f32,\n        yarray: *const *mut f32,\n        incy: i64,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDgemvBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f64,\n        Aarray: *const *const f64,\n        lda: ::core::ffi::c_int,\n        xarray: *const *const f64,\n        incx: ::core::ffi::c_int,\n        beta: *const f64,\n        yarray: *const *mut f64,\n        incy: ::core::ffi::c_int,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDgemvBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        alpha: *const f64,\n        Aarray: *const *const f64,\n        lda: i64,\n        xarray: *const *const f64,\n        incx: i64,\n        beta: *const f64,\n        yarray: *const *mut f64,\n        incy: i64,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgemvBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        Aarray: *const *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        xarray: *const *const cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuComplex,\n        yarray: *const *mut cuda_types::cublas::cuComplex,\n        incy: ::core::ffi::c_int,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgemvBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        Aarray: *const *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        xarray: *const *const cuda_types::cublas::cuComplex,\n        incx: i64,\n        beta: *const cuda_types::cublas::cuComplex,\n        yarray: *const *mut cuda_types::cublas::cuComplex,\n        incy: i64,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZgemvBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        Aarray: *const *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        xarray: *const *const cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        yarray: *const *mut cuda_types::cublas::cuDoubleComplex,\n        incy: ::core::ffi::c_int,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZgemvBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        Aarray: *const *const cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n        xarray: *const *const cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        yarray: *const *mut cuda_types::cublas::cuDoubleComplex,\n        incy: i64,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasHSHgemvBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        Aarray: *const *const cuda_types::cublas::__half,\n        lda: ::core::ffi::c_int,\n        xarray: *const *const cuda_types::cublas::__half,\n        incx: ::core::ffi::c_int,\n        beta: *const f32,\n        yarray: *const *mut cuda_types::cublas::__half,\n        incy: ::core::ffi::c_int,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasHSHgemvBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        Aarray: *const *const cuda_types::cublas::__half,\n        lda: i64,\n        xarray: *const *const cuda_types::cublas::__half,\n        incx: i64,\n        beta: *const f32,\n        yarray: *const *mut cuda_types::cublas::__half,\n        incy: i64,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasHSSgemvBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        Aarray: *const *const cuda_types::cublas::__half,\n        lda: ::core::ffi::c_int,\n        xarray: *const *const cuda_types::cublas::__half,\n        incx: ::core::ffi::c_int,\n        beta: *const f32,\n        yarray: *const *mut f32,\n        incy: ::core::ffi::c_int,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasHSSgemvBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        Aarray: *const *const cuda_types::cublas::__half,\n        lda: i64,\n        xarray: *const *const cuda_types::cublas::__half,\n        incx: i64,\n        beta: *const f32,\n        yarray: *const *mut f32,\n        incy: i64,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasTSTgemvBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        Aarray: *const *const cuda_types::cublas::__nv_bfloat16,\n        lda: ::core::ffi::c_int,\n        xarray: *const *const cuda_types::cublas::__nv_bfloat16,\n        incx: ::core::ffi::c_int,\n        beta: *const f32,\n        yarray: *const *mut cuda_types::cublas::__nv_bfloat16,\n        incy: ::core::ffi::c_int,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasTSTgemvBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        Aarray: *const *const cuda_types::cublas::__nv_bfloat16,\n        lda: i64,\n        xarray: *const *const cuda_types::cublas::__nv_bfloat16,\n        incx: i64,\n        beta: *const f32,\n        yarray: *const *mut cuda_types::cublas::__nv_bfloat16,\n        incy: i64,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasTSSgemvBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        Aarray: *const *const cuda_types::cublas::__nv_bfloat16,\n        lda: ::core::ffi::c_int,\n        xarray: *const *const cuda_types::cublas::__nv_bfloat16,\n        incx: ::core::ffi::c_int,\n        beta: *const f32,\n        yarray: *const *mut f32,\n        incy: ::core::ffi::c_int,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasTSSgemvBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        Aarray: *const *const cuda_types::cublas::__nv_bfloat16,\n        lda: i64,\n        xarray: *const *const cuda_types::cublas::__nv_bfloat16,\n        incx: i64,\n        beta: *const f32,\n        yarray: *const *mut f32,\n        incy: i64,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSgemvStridedBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: ::core::ffi::c_int,\n        strideA: ::core::ffi::c_longlong,\n        x: *const f32,\n        incx: ::core::ffi::c_int,\n        stridex: ::core::ffi::c_longlong,\n        beta: *const f32,\n        y: *mut f32,\n        incy: ::core::ffi::c_int,\n        stridey: ::core::ffi::c_longlong,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSgemvStridedBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        strideA: ::core::ffi::c_longlong,\n        x: *const f32,\n        incx: i64,\n        stridex: ::core::ffi::c_longlong,\n        beta: *const f32,\n        y: *mut f32,\n        incy: i64,\n        stridey: ::core::ffi::c_longlong,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDgemvStridedBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: ::core::ffi::c_int,\n        strideA: ::core::ffi::c_longlong,\n        x: *const f64,\n        incx: ::core::ffi::c_int,\n        stridex: ::core::ffi::c_longlong,\n        beta: *const f64,\n        y: *mut f64,\n        incy: ::core::ffi::c_int,\n        stridey: ::core::ffi::c_longlong,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDgemvStridedBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        strideA: ::core::ffi::c_longlong,\n        x: *const f64,\n        incx: i64,\n        stridex: ::core::ffi::c_longlong,\n        beta: *const f64,\n        y: *mut f64,\n        incy: i64,\n        stridey: ::core::ffi::c_longlong,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgemvStridedBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        strideA: ::core::ffi::c_longlong,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n        stridex: ::core::ffi::c_longlong,\n        beta: *const cuda_types::cublas::cuComplex,\n        y: *mut cuda_types::cublas::cuComplex,\n        incy: ::core::ffi::c_int,\n        stridey: ::core::ffi::c_longlong,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgemvStridedBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        strideA: ::core::ffi::c_longlong,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: i64,\n        stridex: ::core::ffi::c_longlong,\n        beta: *const cuda_types::cublas::cuComplex,\n        y: *mut cuda_types::cublas::cuComplex,\n        incy: i64,\n        stridey: ::core::ffi::c_longlong,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZgemvStridedBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        strideA: ::core::ffi::c_longlong,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n        stridex: ::core::ffi::c_longlong,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        y: *mut cuda_types::cublas::cuDoubleComplex,\n        incy: ::core::ffi::c_int,\n        stridey: ::core::ffi::c_longlong,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZgemvStridedBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n        strideA: ::core::ffi::c_longlong,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n        stridex: ::core::ffi::c_longlong,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        y: *mut cuda_types::cublas::cuDoubleComplex,\n        incy: i64,\n        stridey: ::core::ffi::c_longlong,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasHSHgemvStridedBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        A: *const cuda_types::cublas::__half,\n        lda: ::core::ffi::c_int,\n        strideA: ::core::ffi::c_longlong,\n        x: *const cuda_types::cublas::__half,\n        incx: ::core::ffi::c_int,\n        stridex: ::core::ffi::c_longlong,\n        beta: *const f32,\n        y: *mut cuda_types::cublas::__half,\n        incy: ::core::ffi::c_int,\n        stridey: ::core::ffi::c_longlong,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasHSHgemvStridedBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const cuda_types::cublas::__half,\n        lda: i64,\n        strideA: ::core::ffi::c_longlong,\n        x: *const cuda_types::cublas::__half,\n        incx: i64,\n        stridex: ::core::ffi::c_longlong,\n        beta: *const f32,\n        y: *mut cuda_types::cublas::__half,\n        incy: i64,\n        stridey: ::core::ffi::c_longlong,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasHSSgemvStridedBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        A: *const cuda_types::cublas::__half,\n        lda: ::core::ffi::c_int,\n        strideA: ::core::ffi::c_longlong,\n        x: *const cuda_types::cublas::__half,\n        incx: ::core::ffi::c_int,\n        stridex: ::core::ffi::c_longlong,\n        beta: *const f32,\n        y: *mut f32,\n        incy: ::core::ffi::c_int,\n        stridey: ::core::ffi::c_longlong,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasHSSgemvStridedBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const cuda_types::cublas::__half,\n        lda: i64,\n        strideA: ::core::ffi::c_longlong,\n        x: *const cuda_types::cublas::__half,\n        incx: i64,\n        stridex: ::core::ffi::c_longlong,\n        beta: *const f32,\n        y: *mut f32,\n        incy: i64,\n        stridey: ::core::ffi::c_longlong,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasTSTgemvStridedBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        A: *const cuda_types::cublas::__nv_bfloat16,\n        lda: ::core::ffi::c_int,\n        strideA: ::core::ffi::c_longlong,\n        x: *const cuda_types::cublas::__nv_bfloat16,\n        incx: ::core::ffi::c_int,\n        stridex: ::core::ffi::c_longlong,\n        beta: *const f32,\n        y: *mut cuda_types::cublas::__nv_bfloat16,\n        incy: ::core::ffi::c_int,\n        stridey: ::core::ffi::c_longlong,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasTSTgemvStridedBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const cuda_types::cublas::__nv_bfloat16,\n        lda: i64,\n        strideA: ::core::ffi::c_longlong,\n        x: *const cuda_types::cublas::__nv_bfloat16,\n        incx: i64,\n        stridex: ::core::ffi::c_longlong,\n        beta: *const f32,\n        y: *mut cuda_types::cublas::__nv_bfloat16,\n        incy: i64,\n        stridey: ::core::ffi::c_longlong,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasTSSgemvStridedBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        A: *const cuda_types::cublas::__nv_bfloat16,\n        lda: ::core::ffi::c_int,\n        strideA: ::core::ffi::c_longlong,\n        x: *const cuda_types::cublas::__nv_bfloat16,\n        incx: ::core::ffi::c_int,\n        stridex: ::core::ffi::c_longlong,\n        beta: *const f32,\n        y: *mut f32,\n        incy: ::core::ffi::c_int,\n        stridey: ::core::ffi::c_longlong,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasTSSgemvStridedBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const cuda_types::cublas::__nv_bfloat16,\n        lda: i64,\n        strideA: ::core::ffi::c_longlong,\n        x: *const cuda_types::cublas::__nv_bfloat16,\n        incx: i64,\n        stridex: ::core::ffi::c_longlong,\n        beta: *const f32,\n        y: *mut f32,\n        incy: i64,\n        stridey: ::core::ffi::c_longlong,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSgemm_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: ::core::ffi::c_int,\n        B: *const f32,\n        ldb: ::core::ffi::c_int,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSgemm_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        B: *const f32,\n        ldb: i64,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDgemm_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: ::core::ffi::c_int,\n        B: *const f64,\n        ldb: ::core::ffi::c_int,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDgemm_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        B: *const f64,\n        ldb: i64,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgemm_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        B: *const cuda_types::cublas::cuComplex,\n        ldb: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuComplex,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgemm_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        B: *const cuda_types::cublas::cuComplex,\n        ldb: i64,\n        beta: *const cuda_types::cublas::cuComplex,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgemm3m(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        B: *const cuda_types::cublas::cuComplex,\n        ldb: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuComplex,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgemm3m_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        B: *const cuda_types::cublas::cuComplex,\n        ldb: i64,\n        beta: *const cuda_types::cublas::cuComplex,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgemm3mEx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const ::core::ffi::c_void,\n        Atype: cuda_types::cublas::cudaDataType,\n        lda: ::core::ffi::c_int,\n        B: *const ::core::ffi::c_void,\n        Btype: cuda_types::cublas::cudaDataType,\n        ldb: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuComplex,\n        C: *mut ::core::ffi::c_void,\n        Ctype: cuda_types::cublas::cudaDataType,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgemm3mEx_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const ::core::ffi::c_void,\n        Atype: cuda_types::cublas::cudaDataType,\n        lda: i64,\n        B: *const ::core::ffi::c_void,\n        Btype: cuda_types::cublas::cudaDataType,\n        ldb: i64,\n        beta: *const cuda_types::cublas::cuComplex,\n        C: *mut ::core::ffi::c_void,\n        Ctype: cuda_types::cublas::cudaDataType,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZgemm_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        B: *const cuda_types::cublas::cuDoubleComplex,\n        ldb: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        C: *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZgemm_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n        B: *const cuda_types::cublas::cuDoubleComplex,\n        ldb: i64,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        C: *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZgemm3m(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        B: *const cuda_types::cublas::cuDoubleComplex,\n        ldb: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        C: *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZgemm3m_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n        B: *const cuda_types::cublas::cuDoubleComplex,\n        ldb: i64,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        C: *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasHgemm(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::__half,\n        A: *const cuda_types::cublas::__half,\n        lda: ::core::ffi::c_int,\n        B: *const cuda_types::cublas::__half,\n        ldb: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::__half,\n        C: *mut cuda_types::cublas::__half,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasHgemm_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::__half,\n        A: *const cuda_types::cublas::__half,\n        lda: i64,\n        B: *const cuda_types::cublas::__half,\n        ldb: i64,\n        beta: *const cuda_types::cublas::__half,\n        C: *mut cuda_types::cublas::__half,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSgemmEx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const f32,\n        A: *const ::core::ffi::c_void,\n        Atype: cuda_types::cublas::cudaDataType,\n        lda: ::core::ffi::c_int,\n        B: *const ::core::ffi::c_void,\n        Btype: cuda_types::cublas::cudaDataType,\n        ldb: ::core::ffi::c_int,\n        beta: *const f32,\n        C: *mut ::core::ffi::c_void,\n        Ctype: cuda_types::cublas::cudaDataType,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSgemmEx_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const ::core::ffi::c_void,\n        Atype: cuda_types::cublas::cudaDataType,\n        lda: i64,\n        B: *const ::core::ffi::c_void,\n        Btype: cuda_types::cublas::cudaDataType,\n        ldb: i64,\n        beta: *const f32,\n        C: *mut ::core::ffi::c_void,\n        Ctype: cuda_types::cublas::cudaDataType,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasGemmEx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const ::core::ffi::c_void,\n        A: *const ::core::ffi::c_void,\n        Atype: cuda_types::cublas::cudaDataType,\n        lda: ::core::ffi::c_int,\n        B: *const ::core::ffi::c_void,\n        Btype: cuda_types::cublas::cudaDataType,\n        ldb: ::core::ffi::c_int,\n        beta: *const ::core::ffi::c_void,\n        C: *mut ::core::ffi::c_void,\n        Ctype: cuda_types::cublas::cudaDataType,\n        ldc: ::core::ffi::c_int,\n        computeType: cuda_types::cublas::cublasComputeType_t,\n        algo: cuda_types::cublas::cublasGemmAlgo_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasGemmEx_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const ::core::ffi::c_void,\n        A: *const ::core::ffi::c_void,\n        Atype: cuda_types::cublas::cudaDataType,\n        lda: i64,\n        B: *const ::core::ffi::c_void,\n        Btype: cuda_types::cublas::cudaDataType,\n        ldb: i64,\n        beta: *const ::core::ffi::c_void,\n        C: *mut ::core::ffi::c_void,\n        Ctype: cuda_types::cublas::cudaDataType,\n        ldc: i64,\n        computeType: cuda_types::cublas::cublasComputeType_t,\n        algo: cuda_types::cublas::cublasGemmAlgo_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgemmEx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const ::core::ffi::c_void,\n        Atype: cuda_types::cublas::cudaDataType,\n        lda: ::core::ffi::c_int,\n        B: *const ::core::ffi::c_void,\n        Btype: cuda_types::cublas::cudaDataType,\n        ldb: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuComplex,\n        C: *mut ::core::ffi::c_void,\n        Ctype: cuda_types::cublas::cudaDataType,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgemmEx_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const ::core::ffi::c_void,\n        Atype: cuda_types::cublas::cudaDataType,\n        lda: i64,\n        B: *const ::core::ffi::c_void,\n        Btype: cuda_types::cublas::cudaDataType,\n        ldb: i64,\n        beta: *const cuda_types::cublas::cuComplex,\n        C: *mut ::core::ffi::c_void,\n        Ctype: cuda_types::cublas::cudaDataType,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSsyrk_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: ::core::ffi::c_int,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSsyrk_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDsyrk_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: ::core::ffi::c_int,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDsyrk_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCsyrk_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuComplex,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCsyrk_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        beta: *const cuda_types::cublas::cuComplex,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZsyrk_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        C: *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZsyrk_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        C: *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCsyrkEx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const ::core::ffi::c_void,\n        Atype: cuda_types::cublas::cudaDataType,\n        lda: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuComplex,\n        C: *mut ::core::ffi::c_void,\n        Ctype: cuda_types::cublas::cudaDataType,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCsyrkEx_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const ::core::ffi::c_void,\n        Atype: cuda_types::cublas::cudaDataType,\n        lda: i64,\n        beta: *const cuda_types::cublas::cuComplex,\n        C: *mut ::core::ffi::c_void,\n        Ctype: cuda_types::cublas::cudaDataType,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCsyrk3mEx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const ::core::ffi::c_void,\n        Atype: cuda_types::cublas::cudaDataType,\n        lda: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuComplex,\n        C: *mut ::core::ffi::c_void,\n        Ctype: cuda_types::cublas::cudaDataType,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCsyrk3mEx_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const ::core::ffi::c_void,\n        Atype: cuda_types::cublas::cudaDataType,\n        lda: i64,\n        beta: *const cuda_types::cublas::cuComplex,\n        C: *mut ::core::ffi::c_void,\n        Ctype: cuda_types::cublas::cudaDataType,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCherk_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const f32,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        beta: *const f32,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCherk_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        beta: *const f32,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZherk_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const f64,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        beta: *const f64,\n        C: *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZherk_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n        beta: *const f64,\n        C: *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCherkEx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const f32,\n        A: *const ::core::ffi::c_void,\n        Atype: cuda_types::cublas::cudaDataType,\n        lda: ::core::ffi::c_int,\n        beta: *const f32,\n        C: *mut ::core::ffi::c_void,\n        Ctype: cuda_types::cublas::cudaDataType,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCherkEx_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const ::core::ffi::c_void,\n        Atype: cuda_types::cublas::cudaDataType,\n        lda: i64,\n        beta: *const f32,\n        C: *mut ::core::ffi::c_void,\n        Ctype: cuda_types::cublas::cudaDataType,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCherk3mEx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const f32,\n        A: *const ::core::ffi::c_void,\n        Atype: cuda_types::cublas::cudaDataType,\n        lda: ::core::ffi::c_int,\n        beta: *const f32,\n        C: *mut ::core::ffi::c_void,\n        Ctype: cuda_types::cublas::cudaDataType,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCherk3mEx_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const ::core::ffi::c_void,\n        Atype: cuda_types::cublas::cudaDataType,\n        lda: i64,\n        beta: *const f32,\n        C: *mut ::core::ffi::c_void,\n        Ctype: cuda_types::cublas::cudaDataType,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSsyr2k_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: ::core::ffi::c_int,\n        B: *const f32,\n        ldb: ::core::ffi::c_int,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSsyr2k_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        B: *const f32,\n        ldb: i64,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDsyr2k_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: ::core::ffi::c_int,\n        B: *const f64,\n        ldb: ::core::ffi::c_int,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDsyr2k_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        B: *const f64,\n        ldb: i64,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCsyr2k_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        B: *const cuda_types::cublas::cuComplex,\n        ldb: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuComplex,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCsyr2k_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        B: *const cuda_types::cublas::cuComplex,\n        ldb: i64,\n        beta: *const cuda_types::cublas::cuComplex,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZsyr2k_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        B: *const cuda_types::cublas::cuDoubleComplex,\n        ldb: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        C: *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZsyr2k_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n        B: *const cuda_types::cublas::cuDoubleComplex,\n        ldb: i64,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        C: *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCher2k_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        B: *const cuda_types::cublas::cuComplex,\n        ldb: ::core::ffi::c_int,\n        beta: *const f32,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCher2k_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        B: *const cuda_types::cublas::cuComplex,\n        ldb: i64,\n        beta: *const f32,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZher2k_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        B: *const cuda_types::cublas::cuDoubleComplex,\n        ldb: ::core::ffi::c_int,\n        beta: *const f64,\n        C: *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZher2k_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n        B: *const cuda_types::cublas::cuDoubleComplex,\n        ldb: i64,\n        beta: *const f64,\n        C: *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSsyrkx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: ::core::ffi::c_int,\n        B: *const f32,\n        ldb: ::core::ffi::c_int,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSsyrkx_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        B: *const f32,\n        ldb: i64,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDsyrkx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: ::core::ffi::c_int,\n        B: *const f64,\n        ldb: ::core::ffi::c_int,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDsyrkx_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        B: *const f64,\n        ldb: i64,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCsyrkx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        B: *const cuda_types::cublas::cuComplex,\n        ldb: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuComplex,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCsyrkx_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        B: *const cuda_types::cublas::cuComplex,\n        ldb: i64,\n        beta: *const cuda_types::cublas::cuComplex,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZsyrkx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        B: *const cuda_types::cublas::cuDoubleComplex,\n        ldb: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        C: *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZsyrkx_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n        B: *const cuda_types::cublas::cuDoubleComplex,\n        ldb: i64,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        C: *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCherkx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        B: *const cuda_types::cublas::cuComplex,\n        ldb: ::core::ffi::c_int,\n        beta: *const f32,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCherkx_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        B: *const cuda_types::cublas::cuComplex,\n        ldb: i64,\n        beta: *const f32,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZherkx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        B: *const cuda_types::cublas::cuDoubleComplex,\n        ldb: ::core::ffi::c_int,\n        beta: *const f64,\n        C: *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZherkx_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n        B: *const cuda_types::cublas::cuDoubleComplex,\n        ldb: i64,\n        beta: *const f64,\n        C: *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSsymm_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: ::core::ffi::c_int,\n        B: *const f32,\n        ldb: ::core::ffi::c_int,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSsymm_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        B: *const f32,\n        ldb: i64,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDsymm_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: ::core::ffi::c_int,\n        B: *const f64,\n        ldb: ::core::ffi::c_int,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDsymm_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        m: i64,\n        n: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        B: *const f64,\n        ldb: i64,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCsymm_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        B: *const cuda_types::cublas::cuComplex,\n        ldb: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuComplex,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCsymm_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        m: i64,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        B: *const cuda_types::cublas::cuComplex,\n        ldb: i64,\n        beta: *const cuda_types::cublas::cuComplex,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZsymm_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        B: *const cuda_types::cublas::cuDoubleComplex,\n        ldb: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        C: *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZsymm_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        m: i64,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n        B: *const cuda_types::cublas::cuDoubleComplex,\n        ldb: i64,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        C: *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasChemm_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        B: *const cuda_types::cublas::cuComplex,\n        ldb: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuComplex,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasChemm_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        m: i64,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        B: *const cuda_types::cublas::cuComplex,\n        ldb: i64,\n        beta: *const cuda_types::cublas::cuComplex,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZhemm_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        B: *const cuda_types::cublas::cuDoubleComplex,\n        ldb: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        C: *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZhemm_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        m: i64,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n        B: *const cuda_types::cublas::cuDoubleComplex,\n        ldb: i64,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        C: *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasStrsm_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: ::core::ffi::c_int,\n        B: *mut f32,\n        ldb: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasStrsm_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        B: *mut f32,\n        ldb: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDtrsm_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: ::core::ffi::c_int,\n        B: *mut f64,\n        ldb: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDtrsm_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        m: i64,\n        n: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        B: *mut f64,\n        ldb: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCtrsm_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        B: *mut cuda_types::cublas::cuComplex,\n        ldb: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCtrsm_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        m: i64,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        B: *mut cuda_types::cublas::cuComplex,\n        ldb: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZtrsm_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        B: *mut cuda_types::cublas::cuDoubleComplex,\n        ldb: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZtrsm_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        m: i64,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n        B: *mut cuda_types::cublas::cuDoubleComplex,\n        ldb: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasStrmm_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: ::core::ffi::c_int,\n        B: *const f32,\n        ldb: ::core::ffi::c_int,\n        C: *mut f32,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasStrmm_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        B: *const f32,\n        ldb: i64,\n        C: *mut f32,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDtrmm_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: ::core::ffi::c_int,\n        B: *const f64,\n        ldb: ::core::ffi::c_int,\n        C: *mut f64,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDtrmm_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        m: i64,\n        n: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        B: *const f64,\n        ldb: i64,\n        C: *mut f64,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCtrmm_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        B: *const cuda_types::cublas::cuComplex,\n        ldb: ::core::ffi::c_int,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCtrmm_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        m: i64,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        B: *const cuda_types::cublas::cuComplex,\n        ldb: i64,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZtrmm_v2(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        B: *const cuda_types::cublas::cuDoubleComplex,\n        ldb: ::core::ffi::c_int,\n        C: *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZtrmm_v2_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        m: i64,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n        B: *const cuda_types::cublas::cuDoubleComplex,\n        ldb: i64,\n        C: *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasHgemmBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::__half,\n        Aarray: *const *const cuda_types::cublas::__half,\n        lda: ::core::ffi::c_int,\n        Barray: *const *const cuda_types::cublas::__half,\n        ldb: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::__half,\n        Carray: *const *mut cuda_types::cublas::__half,\n        ldc: ::core::ffi::c_int,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasHgemmBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::__half,\n        Aarray: *const *const cuda_types::cublas::__half,\n        lda: i64,\n        Barray: *const *const cuda_types::cublas::__half,\n        ldb: i64,\n        beta: *const cuda_types::cublas::__half,\n        Carray: *const *mut cuda_types::cublas::__half,\n        ldc: i64,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSgemmBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const f32,\n        Aarray: *const *const f32,\n        lda: ::core::ffi::c_int,\n        Barray: *const *const f32,\n        ldb: ::core::ffi::c_int,\n        beta: *const f32,\n        Carray: *const *mut f32,\n        ldc: ::core::ffi::c_int,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSgemmBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        Aarray: *const *const f32,\n        lda: i64,\n        Barray: *const *const f32,\n        ldb: i64,\n        beta: *const f32,\n        Carray: *const *mut f32,\n        ldc: i64,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDgemmBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const f64,\n        Aarray: *const *const f64,\n        lda: ::core::ffi::c_int,\n        Barray: *const *const f64,\n        ldb: ::core::ffi::c_int,\n        beta: *const f64,\n        Carray: *const *mut f64,\n        ldc: ::core::ffi::c_int,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDgemmBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        Aarray: *const *const f64,\n        lda: i64,\n        Barray: *const *const f64,\n        ldb: i64,\n        beta: *const f64,\n        Carray: *const *mut f64,\n        ldc: i64,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgemmBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        Aarray: *const *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        Barray: *const *const cuda_types::cublas::cuComplex,\n        ldb: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuComplex,\n        Carray: *const *mut cuda_types::cublas::cuComplex,\n        ldc: ::core::ffi::c_int,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgemmBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        Aarray: *const *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        Barray: *const *const cuda_types::cublas::cuComplex,\n        ldb: i64,\n        beta: *const cuda_types::cublas::cuComplex,\n        Carray: *const *mut cuda_types::cublas::cuComplex,\n        ldc: i64,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgemm3mBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        Aarray: *const *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        Barray: *const *const cuda_types::cublas::cuComplex,\n        ldb: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuComplex,\n        Carray: *const *mut cuda_types::cublas::cuComplex,\n        ldc: ::core::ffi::c_int,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgemm3mBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        Aarray: *const *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        Barray: *const *const cuda_types::cublas::cuComplex,\n        ldb: i64,\n        beta: *const cuda_types::cublas::cuComplex,\n        Carray: *const *mut cuda_types::cublas::cuComplex,\n        ldc: i64,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZgemmBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        Aarray: *const *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        Barray: *const *const cuda_types::cublas::cuDoubleComplex,\n        ldb: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        Carray: *const *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: ::core::ffi::c_int,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZgemmBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        Aarray: *const *const cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n        Barray: *const *const cuda_types::cublas::cuDoubleComplex,\n        ldb: i64,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        Carray: *const *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: i64,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasHgemmStridedBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::__half,\n        A: *const cuda_types::cublas::__half,\n        lda: ::core::ffi::c_int,\n        strideA: ::core::ffi::c_longlong,\n        B: *const cuda_types::cublas::__half,\n        ldb: ::core::ffi::c_int,\n        strideB: ::core::ffi::c_longlong,\n        beta: *const cuda_types::cublas::__half,\n        C: *mut cuda_types::cublas::__half,\n        ldc: ::core::ffi::c_int,\n        strideC: ::core::ffi::c_longlong,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasHgemmStridedBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::__half,\n        A: *const cuda_types::cublas::__half,\n        lda: i64,\n        strideA: ::core::ffi::c_longlong,\n        B: *const cuda_types::cublas::__half,\n        ldb: i64,\n        strideB: ::core::ffi::c_longlong,\n        beta: *const cuda_types::cublas::__half,\n        C: *mut cuda_types::cublas::__half,\n        ldc: i64,\n        strideC: ::core::ffi::c_longlong,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSgemmStridedBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: ::core::ffi::c_int,\n        strideA: ::core::ffi::c_longlong,\n        B: *const f32,\n        ldb: ::core::ffi::c_int,\n        strideB: ::core::ffi::c_longlong,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: ::core::ffi::c_int,\n        strideC: ::core::ffi::c_longlong,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSgemmStridedBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        strideA: ::core::ffi::c_longlong,\n        B: *const f32,\n        ldb: i64,\n        strideB: ::core::ffi::c_longlong,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: i64,\n        strideC: ::core::ffi::c_longlong,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDgemmStridedBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: ::core::ffi::c_int,\n        strideA: ::core::ffi::c_longlong,\n        B: *const f64,\n        ldb: ::core::ffi::c_int,\n        strideB: ::core::ffi::c_longlong,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: ::core::ffi::c_int,\n        strideC: ::core::ffi::c_longlong,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDgemmStridedBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        strideA: ::core::ffi::c_longlong,\n        B: *const f64,\n        ldb: i64,\n        strideB: ::core::ffi::c_longlong,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: i64,\n        strideC: ::core::ffi::c_longlong,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgemmStridedBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        strideA: ::core::ffi::c_longlong,\n        B: *const cuda_types::cublas::cuComplex,\n        ldb: ::core::ffi::c_int,\n        strideB: ::core::ffi::c_longlong,\n        beta: *const cuda_types::cublas::cuComplex,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: ::core::ffi::c_int,\n        strideC: ::core::ffi::c_longlong,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgemmStridedBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        strideA: ::core::ffi::c_longlong,\n        B: *const cuda_types::cublas::cuComplex,\n        ldb: i64,\n        strideB: ::core::ffi::c_longlong,\n        beta: *const cuda_types::cublas::cuComplex,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: i64,\n        strideC: ::core::ffi::c_longlong,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgemm3mStridedBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        strideA: ::core::ffi::c_longlong,\n        B: *const cuda_types::cublas::cuComplex,\n        ldb: ::core::ffi::c_int,\n        strideB: ::core::ffi::c_longlong,\n        beta: *const cuda_types::cublas::cuComplex,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: ::core::ffi::c_int,\n        strideC: ::core::ffi::c_longlong,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgemm3mStridedBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        strideA: ::core::ffi::c_longlong,\n        B: *const cuda_types::cublas::cuComplex,\n        ldb: i64,\n        strideB: ::core::ffi::c_longlong,\n        beta: *const cuda_types::cublas::cuComplex,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: i64,\n        strideC: ::core::ffi::c_longlong,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZgemmStridedBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        strideA: ::core::ffi::c_longlong,\n        B: *const cuda_types::cublas::cuDoubleComplex,\n        ldb: ::core::ffi::c_int,\n        strideB: ::core::ffi::c_longlong,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        C: *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: ::core::ffi::c_int,\n        strideC: ::core::ffi::c_longlong,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZgemmStridedBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n        strideA: ::core::ffi::c_longlong,\n        B: *const cuda_types::cublas::cuDoubleComplex,\n        ldb: i64,\n        strideB: ::core::ffi::c_longlong,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        C: *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: i64,\n        strideC: ::core::ffi::c_longlong,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasGemmBatchedEx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const ::core::ffi::c_void,\n        Aarray: *const *const ::core::ffi::c_void,\n        Atype: cuda_types::cublas::cudaDataType,\n        lda: ::core::ffi::c_int,\n        Barray: *const *const ::core::ffi::c_void,\n        Btype: cuda_types::cublas::cudaDataType,\n        ldb: ::core::ffi::c_int,\n        beta: *const ::core::ffi::c_void,\n        Carray: *const *mut ::core::ffi::c_void,\n        Ctype: cuda_types::cublas::cudaDataType,\n        ldc: ::core::ffi::c_int,\n        batchCount: ::core::ffi::c_int,\n        computeType: cuda_types::cublas::cublasComputeType_t,\n        algo: cuda_types::cublas::cublasGemmAlgo_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasGemmBatchedEx_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const ::core::ffi::c_void,\n        Aarray: *const *const ::core::ffi::c_void,\n        Atype: cuda_types::cublas::cudaDataType,\n        lda: i64,\n        Barray: *const *const ::core::ffi::c_void,\n        Btype: cuda_types::cublas::cudaDataType,\n        ldb: i64,\n        beta: *const ::core::ffi::c_void,\n        Carray: *const *mut ::core::ffi::c_void,\n        Ctype: cuda_types::cublas::cudaDataType,\n        ldc: i64,\n        batchCount: i64,\n        computeType: cuda_types::cublas::cublasComputeType_t,\n        algo: cuda_types::cublas::cublasGemmAlgo_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasGemmStridedBatchedEx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        alpha: *const ::core::ffi::c_void,\n        A: *const ::core::ffi::c_void,\n        Atype: cuda_types::cublas::cudaDataType,\n        lda: ::core::ffi::c_int,\n        strideA: ::core::ffi::c_longlong,\n        B: *const ::core::ffi::c_void,\n        Btype: cuda_types::cublas::cudaDataType,\n        ldb: ::core::ffi::c_int,\n        strideB: ::core::ffi::c_longlong,\n        beta: *const ::core::ffi::c_void,\n        C: *mut ::core::ffi::c_void,\n        Ctype: cuda_types::cublas::cudaDataType,\n        ldc: ::core::ffi::c_int,\n        strideC: ::core::ffi::c_longlong,\n        batchCount: ::core::ffi::c_int,\n        computeType: cuda_types::cublas::cublasComputeType_t,\n        algo: cuda_types::cublas::cublasGemmAlgo_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasGemmStridedBatchedEx_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const ::core::ffi::c_void,\n        A: *const ::core::ffi::c_void,\n        Atype: cuda_types::cublas::cudaDataType,\n        lda: i64,\n        strideA: ::core::ffi::c_longlong,\n        B: *const ::core::ffi::c_void,\n        Btype: cuda_types::cublas::cudaDataType,\n        ldb: i64,\n        strideB: ::core::ffi::c_longlong,\n        beta: *const ::core::ffi::c_void,\n        C: *mut ::core::ffi::c_void,\n        Ctype: cuda_types::cublas::cudaDataType,\n        ldc: i64,\n        strideC: ::core::ffi::c_longlong,\n        batchCount: i64,\n        computeType: cuda_types::cublas::cublasComputeType_t,\n        algo: cuda_types::cublas::cublasGemmAlgo_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSgemmGroupedBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa_array: *const cuda_types::cublas::cublasOperation_t,\n        transb_array: *const cuda_types::cublas::cublasOperation_t,\n        m_array: *const ::core::ffi::c_int,\n        n_array: *const ::core::ffi::c_int,\n        k_array: *const ::core::ffi::c_int,\n        alpha_array: *const f32,\n        Aarray: *const *const f32,\n        lda_array: *const ::core::ffi::c_int,\n        Barray: *const *const f32,\n        ldb_array: *const ::core::ffi::c_int,\n        beta_array: *const f32,\n        Carray: *const *mut f32,\n        ldc_array: *const ::core::ffi::c_int,\n        group_count: ::core::ffi::c_int,\n        group_size: *const ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSgemmGroupedBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa_array: *const cuda_types::cublas::cublasOperation_t,\n        transb_array: *const cuda_types::cublas::cublasOperation_t,\n        m_array: *const i64,\n        n_array: *const i64,\n        k_array: *const i64,\n        alpha_array: *const f32,\n        Aarray: *const *const f32,\n        lda_array: *const i64,\n        Barray: *const *const f32,\n        ldb_array: *const i64,\n        beta_array: *const f32,\n        Carray: *const *mut f32,\n        ldc_array: *const i64,\n        group_count: i64,\n        group_size: *const i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDgemmGroupedBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa_array: *const cuda_types::cublas::cublasOperation_t,\n        transb_array: *const cuda_types::cublas::cublasOperation_t,\n        m_array: *const ::core::ffi::c_int,\n        n_array: *const ::core::ffi::c_int,\n        k_array: *const ::core::ffi::c_int,\n        alpha_array: *const f64,\n        Aarray: *const *const f64,\n        lda_array: *const ::core::ffi::c_int,\n        Barray: *const *const f64,\n        ldb_array: *const ::core::ffi::c_int,\n        beta_array: *const f64,\n        Carray: *const *mut f64,\n        ldc_array: *const ::core::ffi::c_int,\n        group_count: ::core::ffi::c_int,\n        group_size: *const ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDgemmGroupedBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa_array: *const cuda_types::cublas::cublasOperation_t,\n        transb_array: *const cuda_types::cublas::cublasOperation_t,\n        m_array: *const i64,\n        n_array: *const i64,\n        k_array: *const i64,\n        alpha_array: *const f64,\n        Aarray: *const *const f64,\n        lda_array: *const i64,\n        Barray: *const *const f64,\n        ldb_array: *const i64,\n        beta_array: *const f64,\n        Carray: *const *mut f64,\n        ldc_array: *const i64,\n        group_count: i64,\n        group_size: *const i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasGemmGroupedBatchedEx(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa_array: *const cuda_types::cublas::cublasOperation_t,\n        transb_array: *const cuda_types::cublas::cublasOperation_t,\n        m_array: *const ::core::ffi::c_int,\n        n_array: *const ::core::ffi::c_int,\n        k_array: *const ::core::ffi::c_int,\n        alpha_array: *const ::core::ffi::c_void,\n        Aarray: *const *const ::core::ffi::c_void,\n        Atype: cuda_types::cublas::cudaDataType_t,\n        lda_array: *const ::core::ffi::c_int,\n        Barray: *const *const ::core::ffi::c_void,\n        Btype: cuda_types::cublas::cudaDataType_t,\n        ldb_array: *const ::core::ffi::c_int,\n        beta_array: *const ::core::ffi::c_void,\n        Carray: *const *mut ::core::ffi::c_void,\n        Ctype: cuda_types::cublas::cudaDataType_t,\n        ldc_array: *const ::core::ffi::c_int,\n        group_count: ::core::ffi::c_int,\n        group_size: *const ::core::ffi::c_int,\n        computeType: cuda_types::cublas::cublasComputeType_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasGemmGroupedBatchedEx_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa_array: *const cuda_types::cublas::cublasOperation_t,\n        transb_array: *const cuda_types::cublas::cublasOperation_t,\n        m_array: *const i64,\n        n_array: *const i64,\n        k_array: *const i64,\n        alpha_array: *const ::core::ffi::c_void,\n        Aarray: *const *const ::core::ffi::c_void,\n        Atype: cuda_types::cublas::cudaDataType_t,\n        lda_array: *const i64,\n        Barray: *const *const ::core::ffi::c_void,\n        Btype: cuda_types::cublas::cudaDataType_t,\n        ldb_array: *const i64,\n        beta_array: *const ::core::ffi::c_void,\n        Carray: *const *mut ::core::ffi::c_void,\n        Ctype: cuda_types::cublas::cudaDataType_t,\n        ldc_array: *const i64,\n        group_count: i64,\n        group_size: *const i64,\n        computeType: cuda_types::cublas::cublasComputeType_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSgeam(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: ::core::ffi::c_int,\n        beta: *const f32,\n        B: *const f32,\n        ldb: ::core::ffi::c_int,\n        C: *mut f32,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSgeam_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        beta: *const f32,\n        B: *const f32,\n        ldb: i64,\n        C: *mut f32,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDgeam(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: ::core::ffi::c_int,\n        beta: *const f64,\n        B: *const f64,\n        ldb: ::core::ffi::c_int,\n        C: *mut f64,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDgeam_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        beta: *const f64,\n        B: *const f64,\n        ldb: i64,\n        C: *mut f64,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgeam(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuComplex,\n        B: *const cuda_types::cublas::cuComplex,\n        ldb: ::core::ffi::c_int,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgeam_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        beta: *const cuda_types::cublas::cuComplex,\n        B: *const cuda_types::cublas::cuComplex,\n        ldb: i64,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZgeam(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        B: *const cuda_types::cublas::cuDoubleComplex,\n        ldb: ::core::ffi::c_int,\n        C: *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZgeam_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        m: i64,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n        beta: *const cuda_types::cublas::cuDoubleComplex,\n        B: *const cuda_types::cublas::cuDoubleComplex,\n        ldb: i64,\n        C: *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasStrsmBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        A: *const *const f32,\n        lda: ::core::ffi::c_int,\n        B: *const *mut f32,\n        ldb: ::core::ffi::c_int,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasStrsmBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const *const f32,\n        lda: i64,\n        B: *const *mut f32,\n        ldb: i64,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDtrsmBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f64,\n        A: *const *const f64,\n        lda: ::core::ffi::c_int,\n        B: *const *mut f64,\n        ldb: ::core::ffi::c_int,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDtrsmBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        m: i64,\n        n: i64,\n        alpha: *const f64,\n        A: *const *const f64,\n        lda: i64,\n        B: *const *mut f64,\n        ldb: i64,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCtrsmBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        B: *const *mut cuda_types::cublas::cuComplex,\n        ldb: ::core::ffi::c_int,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCtrsmBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        m: i64,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuComplex,\n        A: *const *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        B: *const *mut cuda_types::cublas::cuComplex,\n        ldb: i64,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZtrsmBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        B: *const *mut cuda_types::cublas::cuDoubleComplex,\n        ldb: ::core::ffi::c_int,\n        batchCount: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZtrsmBatched_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        side: cuda_types::cublas::cublasSideMode_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        diag: cuda_types::cublas::cublasDiagType_t,\n        m: i64,\n        n: i64,\n        alpha: *const cuda_types::cublas::cuDoubleComplex,\n        A: *const *const cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n        B: *const *mut cuda_types::cublas::cuDoubleComplex,\n        ldb: i64,\n        batchCount: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSdgmm(\n        handle: cuda_types::cublas::cublasHandle_t,\n        mode: cuda_types::cublas::cublasSideMode_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        A: *const f32,\n        lda: ::core::ffi::c_int,\n        x: *const f32,\n        incx: ::core::ffi::c_int,\n        C: *mut f32,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSdgmm_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        mode: cuda_types::cublas::cublasSideMode_t,\n        m: i64,\n        n: i64,\n        A: *const f32,\n        lda: i64,\n        x: *const f32,\n        incx: i64,\n        C: *mut f32,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDdgmm(\n        handle: cuda_types::cublas::cublasHandle_t,\n        mode: cuda_types::cublas::cublasSideMode_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        A: *const f64,\n        lda: ::core::ffi::c_int,\n        x: *const f64,\n        incx: ::core::ffi::c_int,\n        C: *mut f64,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDdgmm_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        mode: cuda_types::cublas::cublasSideMode_t,\n        m: i64,\n        n: i64,\n        A: *const f64,\n        lda: i64,\n        x: *const f64,\n        incx: i64,\n        C: *mut f64,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCdgmm(\n        handle: cuda_types::cublas::cublasHandle_t,\n        mode: cuda_types::cublas::cublasSideMode_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: ::core::ffi::c_int,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCdgmm_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        mode: cuda_types::cublas::cublasSideMode_t,\n        m: i64,\n        n: i64,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: i64,\n        x: *const cuda_types::cublas::cuComplex,\n        incx: i64,\n        C: *mut cuda_types::cublas::cuComplex,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZdgmm(\n        handle: cuda_types::cublas::cublasHandle_t,\n        mode: cuda_types::cublas::cublasSideMode_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: ::core::ffi::c_int,\n        C: *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZdgmm_64(\n        handle: cuda_types::cublas::cublasHandle_t,\n        mode: cuda_types::cublas::cublasSideMode_t,\n        m: i64,\n        n: i64,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: i64,\n        x: *const cuda_types::cublas::cuDoubleComplex,\n        incx: i64,\n        C: *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSmatinvBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        A: *const *const f32,\n        lda: ::core::ffi::c_int,\n        Ainv: *const *mut f32,\n        lda_inv: ::core::ffi::c_int,\n        info: *mut ::core::ffi::c_int,\n        batchSize: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDmatinvBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        A: *const *const f64,\n        lda: ::core::ffi::c_int,\n        Ainv: *const *mut f64,\n        lda_inv: ::core::ffi::c_int,\n        info: *mut ::core::ffi::c_int,\n        batchSize: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCmatinvBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        A: *const *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        Ainv: *const *mut cuda_types::cublas::cuComplex,\n        lda_inv: ::core::ffi::c_int,\n        info: *mut ::core::ffi::c_int,\n        batchSize: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZmatinvBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        A: *const *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        Ainv: *const *mut cuda_types::cublas::cuDoubleComplex,\n        lda_inv: ::core::ffi::c_int,\n        info: *mut ::core::ffi::c_int,\n        batchSize: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSgeqrfBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        Aarray: *const *mut f32,\n        lda: ::core::ffi::c_int,\n        TauArray: *const *mut f32,\n        info: *mut ::core::ffi::c_int,\n        batchSize: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDgeqrfBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        Aarray: *const *mut f64,\n        lda: ::core::ffi::c_int,\n        TauArray: *const *mut f64,\n        info: *mut ::core::ffi::c_int,\n        batchSize: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgeqrfBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        Aarray: *const *mut cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        TauArray: *const *mut cuda_types::cublas::cuComplex,\n        info: *mut ::core::ffi::c_int,\n        batchSize: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZgeqrfBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        Aarray: *const *mut cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        TauArray: *const *mut cuda_types::cublas::cuDoubleComplex,\n        info: *mut ::core::ffi::c_int,\n        batchSize: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSgelsBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nrhs: ::core::ffi::c_int,\n        Aarray: *const *mut f32,\n        lda: ::core::ffi::c_int,\n        Carray: *const *mut f32,\n        ldc: ::core::ffi::c_int,\n        info: *mut ::core::ffi::c_int,\n        devInfoArray: *mut ::core::ffi::c_int,\n        batchSize: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDgelsBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nrhs: ::core::ffi::c_int,\n        Aarray: *const *mut f64,\n        lda: ::core::ffi::c_int,\n        Carray: *const *mut f64,\n        ldc: ::core::ffi::c_int,\n        info: *mut ::core::ffi::c_int,\n        devInfoArray: *mut ::core::ffi::c_int,\n        batchSize: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgelsBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nrhs: ::core::ffi::c_int,\n        Aarray: *const *mut cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        Carray: *const *mut cuda_types::cublas::cuComplex,\n        ldc: ::core::ffi::c_int,\n        info: *mut ::core::ffi::c_int,\n        devInfoArray: *mut ::core::ffi::c_int,\n        batchSize: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZgelsBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nrhs: ::core::ffi::c_int,\n        Aarray: *const *mut cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        Carray: *const *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: ::core::ffi::c_int,\n        info: *mut ::core::ffi::c_int,\n        devInfoArray: *mut ::core::ffi::c_int,\n        batchSize: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasStpttr(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        AP: *const f32,\n        A: *mut f32,\n        lda: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDtpttr(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        AP: *const f64,\n        A: *mut f64,\n        lda: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCtpttr(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        AP: *const cuda_types::cublas::cuComplex,\n        A: *mut cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZtpttr(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        AP: *const cuda_types::cublas::cuDoubleComplex,\n        A: *mut cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasStrttp(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        A: *const f32,\n        lda: ::core::ffi::c_int,\n        AP: *mut f32,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDtrttp(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        A: *const f64,\n        lda: ::core::ffi::c_int,\n        AP: *mut f64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCtrttp(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        A: *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        AP: *mut cuda_types::cublas::cuComplex,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZtrttp(\n        handle: cuda_types::cublas::cublasHandle_t,\n        uplo: cuda_types::cublas::cublasFillMode_t,\n        n: ::core::ffi::c_int,\n        A: *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        AP: *mut cuda_types::cublas::cuDoubleComplex,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSgetrfBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        A: *const *mut f32,\n        lda: ::core::ffi::c_int,\n        P: *mut ::core::ffi::c_int,\n        info: *mut ::core::ffi::c_int,\n        batchSize: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDgetrfBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        A: *const *mut f64,\n        lda: ::core::ffi::c_int,\n        P: *mut ::core::ffi::c_int,\n        info: *mut ::core::ffi::c_int,\n        batchSize: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgetrfBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        A: *const *mut cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        P: *mut ::core::ffi::c_int,\n        info: *mut ::core::ffi::c_int,\n        batchSize: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZgetrfBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        A: *const *mut cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        P: *mut ::core::ffi::c_int,\n        info: *mut ::core::ffi::c_int,\n        batchSize: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSgetriBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        A: *const *const f32,\n        lda: ::core::ffi::c_int,\n        P: *const ::core::ffi::c_int,\n        C: *const *mut f32,\n        ldc: ::core::ffi::c_int,\n        info: *mut ::core::ffi::c_int,\n        batchSize: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDgetriBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        A: *const *const f64,\n        lda: ::core::ffi::c_int,\n        P: *const ::core::ffi::c_int,\n        C: *const *mut f64,\n        ldc: ::core::ffi::c_int,\n        info: *mut ::core::ffi::c_int,\n        batchSize: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgetriBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        A: *const *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        P: *const ::core::ffi::c_int,\n        C: *const *mut cuda_types::cublas::cuComplex,\n        ldc: ::core::ffi::c_int,\n        info: *mut ::core::ffi::c_int,\n        batchSize: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZgetriBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        n: ::core::ffi::c_int,\n        A: *const *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        P: *const ::core::ffi::c_int,\n        C: *const *mut cuda_types::cublas::cuDoubleComplex,\n        ldc: ::core::ffi::c_int,\n        info: *mut ::core::ffi::c_int,\n        batchSize: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSgetrsBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: ::core::ffi::c_int,\n        nrhs: ::core::ffi::c_int,\n        Aarray: *const *const f32,\n        lda: ::core::ffi::c_int,\n        devIpiv: *const ::core::ffi::c_int,\n        Barray: *const *mut f32,\n        ldb: ::core::ffi::c_int,\n        info: *mut ::core::ffi::c_int,\n        batchSize: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasDgetrsBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: ::core::ffi::c_int,\n        nrhs: ::core::ffi::c_int,\n        Aarray: *const *const f64,\n        lda: ::core::ffi::c_int,\n        devIpiv: *const ::core::ffi::c_int,\n        Barray: *const *mut f64,\n        ldb: ::core::ffi::c_int,\n        info: *mut ::core::ffi::c_int,\n        batchSize: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasCgetrsBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: ::core::ffi::c_int,\n        nrhs: ::core::ffi::c_int,\n        Aarray: *const *const cuda_types::cublas::cuComplex,\n        lda: ::core::ffi::c_int,\n        devIpiv: *const ::core::ffi::c_int,\n        Barray: *const *mut cuda_types::cublas::cuComplex,\n        ldb: ::core::ffi::c_int,\n        info: *mut ::core::ffi::c_int,\n        batchSize: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasZgetrsBatched(\n        handle: cuda_types::cublas::cublasHandle_t,\n        trans: cuda_types::cublas::cublasOperation_t,\n        n: ::core::ffi::c_int,\n        nrhs: ::core::ffi::c_int,\n        Aarray: *const *const cuda_types::cublas::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        devIpiv: *const ::core::ffi::c_int,\n        Barray: *const *mut cuda_types::cublas::cuDoubleComplex,\n        ldb: ::core::ffi::c_int,\n        info: *mut ::core::ffi::c_int,\n        batchSize: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasUint8gemmBias(\n        handle: cuda_types::cublas::cublasHandle_t,\n        transa: cuda_types::cublas::cublasOperation_t,\n        transb: cuda_types::cublas::cublasOperation_t,\n        transc: cuda_types::cublas::cublasOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        k: ::core::ffi::c_int,\n        A: *const ::core::ffi::c_uchar,\n        A_bias: ::core::ffi::c_int,\n        lda: ::core::ffi::c_int,\n        B: *const ::core::ffi::c_uchar,\n        B_bias: ::core::ffi::c_int,\n        ldb: ::core::ffi::c_int,\n        C: *mut ::core::ffi::c_uchar,\n        C_bias: ::core::ffi::c_int,\n        ldc: ::core::ffi::c_int,\n        C_mult: ::core::ffi::c_int,\n        C_shift: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasSetEnvironmentMode(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n    ) -> cuda_types::cublas::cublasStatus_t;\n}\n"
  },
  {
    "path": "cuda_macros/src/cublaslt.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\nextern \"system\" {\n    #[must_use]\n    fn cublasLtCreate(\n        lightHandle: *mut cuda_types::cublaslt::cublasLtHandle_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasLtDestroy(\n        lightHandle: cuda_types::cublaslt::cublasLtHandle_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    fn cublasLtGetStatusName(\n        status: cuda_types::cublas::cublasStatus_t,\n    ) -> *const ::core::ffi::c_char;\n    fn cublasLtGetStatusString(\n        status: cuda_types::cublas::cublasStatus_t,\n    ) -> *const ::core::ffi::c_char;\n    fn cublasLtGetVersion() -> usize;\n    fn cublasLtGetCudartVersion() -> usize;\n    #[must_use]\n    fn cublasLtGetProperty(\n        type_: cuda_types::cublaslt::libraryPropertyType,\n        value: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasLtHeuristicsCacheGetCapacity(\n        capacity: *mut usize,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    fn cublasLtHeuristicsCacheSetCapacity(\n        capacity: usize,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    /** Restricts usage of CPU instructions (ISA) specified by the flags in the mask.\n\n Flags can be combined with bitwise OR(|) operator. Supported flags:\n - 0x1 -- x86-64 AVX512 ISA\n\n Default mask: 0 (any applicable ISA is allowed).\n\n The function returns the previous value of the mask.\n The function takes precedence over the environment variable CUBLASLT_DISABLE_CPU_INSTRUCTIONS_MASK.*/\n    fn cublasLtDisableCpuInstructionsSetMask(\n        mask: ::core::ffi::c_uint,\n    ) -> ::core::ffi::c_uint;\n    #[must_use]\n    /** Execute matrix multiplication (D = alpha * op(A) * op(B) + beta * C).\n\n \\retval     CUBLAS_STATUS_NOT_INITIALIZED   if cuBLASLt handle has not been initialized\n \\retval     CUBLAS_STATUS_INVALID_VALUE     if parameters are in conflict or in an impossible configuration; e.g.\n                                             when workspaceSizeInBytes is less than workspace required by configured\n                                             algo\n \\retval     CUBLAS_STATUS_NOT_SUPPORTED     if current implementation on selected device doesn't support configured\n                                             operation\n \\retval     CUBLAS_STATUS_ARCH_MISMATCH     if configured operation cannot be run using selected device\n \\retval     CUBLAS_STATUS_EXECUTION_FAILED  if cuda reported execution error from the device\n \\retval     CUBLAS_STATUS_SUCCESS           if the operation completed successfully*/\n    fn cublasLtMatmul(\n        lightHandle: cuda_types::cublaslt::cublasLtHandle_t,\n        computeDesc: cuda_types::cublaslt::cublasLtMatmulDesc_t,\n        alpha: *const ::core::ffi::c_void,\n        A: *const ::core::ffi::c_void,\n        Adesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n        B: *const ::core::ffi::c_void,\n        Bdesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n        beta: *const ::core::ffi::c_void,\n        C: *const ::core::ffi::c_void,\n        Cdesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n        D: *mut ::core::ffi::c_void,\n        Ddesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n        algo: *const cuda_types::cublaslt::cublasLtMatmulAlgo_t,\n        workspace: *mut ::core::ffi::c_void,\n        workspaceSizeInBytes: usize,\n        stream: cuda_types::cublaslt::cudaStream_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Matrix layout conversion helper (C = alpha * op(A) + beta * op(B))\n\n Can be used to change memory order of data or to scale and shift the values.\n\n \\retval     CUBLAS_STATUS_NOT_INITIALIZED   if cuBLASLt handle has not been initialized\n \\retval     CUBLAS_STATUS_INVALID_VALUE     if parameters are in conflict or in an impossible configuration; e.g.\n                                             when A is not NULL, but Adesc is NULL\n \\retval     CUBLAS_STATUS_NOT_SUPPORTED     if current implementation on selected device doesn't support configured\n                                             operation\n \\retval     CUBLAS_STATUS_ARCH_MISMATCH     if configured operation cannot be run using selected device\n \\retval     CUBLAS_STATUS_EXECUTION_FAILED  if cuda reported execution error from the device\n \\retval     CUBLAS_STATUS_SUCCESS           if the operation completed successfully*/\n    fn cublasLtMatrixTransform(\n        lightHandle: cuda_types::cublaslt::cublasLtHandle_t,\n        transformDesc: cuda_types::cublaslt::cublasLtMatrixTransformDesc_t,\n        alpha: *const ::core::ffi::c_void,\n        A: *const ::core::ffi::c_void,\n        Adesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n        beta: *const ::core::ffi::c_void,\n        B: *const ::core::ffi::c_void,\n        Bdesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n        C: *mut ::core::ffi::c_void,\n        Cdesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n        stream: cuda_types::cublaslt::cudaStream_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /// Internal. Do not use directly.\n    fn cublasLtMatrixLayoutInit_internal(\n        matLayout: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n        size: usize,\n        type_: cuda_types::cublaslt::cudaDataType,\n        rows: u64,\n        cols: u64,\n        ld: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Create new matrix layout descriptor.\n\n \\retval     CUBLAS_STATUS_ALLOC_FAILED  if memory could not be allocated\n \\retval     CUBLAS_STATUS_SUCCESS       if desciptor was created successfully*/\n    fn cublasLtMatrixLayoutCreate(\n        matLayout: *mut cuda_types::cublaslt::cublasLtMatrixLayout_t,\n        type_: cuda_types::cublaslt::cudaDataType,\n        rows: u64,\n        cols: u64,\n        ld: i64,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Destroy matrix layout descriptor.\n\n \\retval     CUBLAS_STATUS_SUCCESS  if operation was successful*/\n    fn cublasLtMatrixLayoutDestroy(\n        matLayout: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Set matrix layout descriptor attribute.\n\n \\param[in]  matLayout    The descriptor\n \\param[in]  attr         The attribute\n \\param[in]  buf          memory address containing the new value\n \\param[in]  sizeInBytes  size of buf buffer for verification (in bytes)\n\n \\retval     CUBLAS_STATUS_INVALID_VALUE  if buf is NULL or sizeInBytes doesn't match size of internal storage for\n                                          selected attribute\n \\retval     CUBLAS_STATUS_SUCCESS        if attribute was set successfully*/\n    fn cublasLtMatrixLayoutSetAttribute(\n        matLayout: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n        attr: cuda_types::cublaslt::cublasLtMatrixLayoutAttribute_t,\n        buf: *const ::core::ffi::c_void,\n        sizeInBytes: usize,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Get matrix layout descriptor attribute.\n\n \\param[in]  matLayout    The descriptor\n \\param[in]  attr         The attribute\n \\param[out] buf          memory address containing the new value\n \\param[in]  sizeInBytes  size of buf buffer for verification (in bytes)\n \\param[out] sizeWritten  only valid when return value is CUBLAS_STATUS_SUCCESS. If sizeInBytes is non-zero: number of\n                          bytes actually written, if sizeInBytes is 0: number of bytes needed to write full contents\n\n \\retval     CUBLAS_STATUS_INVALID_VALUE  if sizeInBytes is 0 and sizeWritten is NULL, or if  sizeInBytes is non-zero\n                                          and buf is NULL or sizeInBytes doesn't match size of internal storage for\n                                          selected attribute\n \\retval     CUBLAS_STATUS_SUCCESS        if attribute's value was successfully written to user memory*/\n    fn cublasLtMatrixLayoutGetAttribute(\n        matLayout: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n        attr: cuda_types::cublaslt::cublasLtMatrixLayoutAttribute_t,\n        buf: *mut ::core::ffi::c_void,\n        sizeInBytes: usize,\n        sizeWritten: *mut usize,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /// Internal. Do not use directly.\n    fn cublasLtMatmulDescInit_internal(\n        matmulDesc: cuda_types::cublaslt::cublasLtMatmulDesc_t,\n        size: usize,\n        computeType: cuda_types::cublas::cublasComputeType_t,\n        scaleType: cuda_types::cublaslt::cudaDataType_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Create new matmul operation descriptor.\n\n \\retval     CUBLAS_STATUS_ALLOC_FAILED  if memory could not be allocated\n \\retval     CUBLAS_STATUS_SUCCESS       if desciptor was created successfully*/\n    fn cublasLtMatmulDescCreate(\n        matmulDesc: *mut cuda_types::cublaslt::cublasLtMatmulDesc_t,\n        computeType: cuda_types::cublas::cublasComputeType_t,\n        scaleType: cuda_types::cublaslt::cudaDataType_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Destroy matmul operation descriptor.\n\n \\retval     CUBLAS_STATUS_SUCCESS  if operation was successful*/\n    fn cublasLtMatmulDescDestroy(\n        matmulDesc: cuda_types::cublaslt::cublasLtMatmulDesc_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Set matmul operation descriptor attribute.\n\n \\param[in]  matmulDesc   The descriptor\n \\param[in]  attr         The attribute\n \\param[in]  buf          memory address containing the new value\n \\param[in]  sizeInBytes  size of buf buffer for verification (in bytes)\n\n \\retval     CUBLAS_STATUS_INVALID_VALUE  if buf is NULL or sizeInBytes doesn't match size of internal storage for\n                                          selected attribute\n \\retval     CUBLAS_STATUS_SUCCESS        if attribute was set successfully*/\n    fn cublasLtMatmulDescSetAttribute(\n        matmulDesc: cuda_types::cublaslt::cublasLtMatmulDesc_t,\n        attr: cuda_types::cublaslt::cublasLtMatmulDescAttributes_t,\n        buf: *const ::core::ffi::c_void,\n        sizeInBytes: usize,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Get matmul operation descriptor attribute.\n\n \\param[in]  matmulDesc   The descriptor\n \\param[in]  attr         The attribute\n \\param[out] buf          memory address containing the new value\n \\param[in]  sizeInBytes  size of buf buffer for verification (in bytes)\n \\param[out] sizeWritten  only valid when return value is CUBLAS_STATUS_SUCCESS. If sizeInBytes is non-zero: number of\n                          bytes actually written, if sizeInBytes is 0: number of bytes needed to write full contents\n\n \\retval     CUBLAS_STATUS_INVALID_VALUE  if sizeInBytes is 0 and sizeWritten is NULL, or if  sizeInBytes is non-zero\n                                          and buf is NULL or sizeInBytes doesn't match size of internal storage for\n                                          selected attribute\n \\retval     CUBLAS_STATUS_SUCCESS        if attribute's value was successfully written to user memory*/\n    fn cublasLtMatmulDescGetAttribute(\n        matmulDesc: cuda_types::cublaslt::cublasLtMatmulDesc_t,\n        attr: cuda_types::cublaslt::cublasLtMatmulDescAttributes_t,\n        buf: *mut ::core::ffi::c_void,\n        sizeInBytes: usize,\n        sizeWritten: *mut usize,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /// Internal. Do not use directly.\n    fn cublasLtMatrixTransformDescInit_internal(\n        transformDesc: cuda_types::cublaslt::cublasLtMatrixTransformDesc_t,\n        size: usize,\n        scaleType: cuda_types::cublaslt::cudaDataType,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Create new matrix transform operation descriptor.\n\n \\retval     CUBLAS_STATUS_ALLOC_FAILED  if memory could not be allocated\n \\retval     CUBLAS_STATUS_SUCCESS       if desciptor was created successfully*/\n    fn cublasLtMatrixTransformDescCreate(\n        transformDesc: *mut cuda_types::cublaslt::cublasLtMatrixTransformDesc_t,\n        scaleType: cuda_types::cublaslt::cudaDataType,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Destroy matrix transform operation descriptor.\n\n \\retval     CUBLAS_STATUS_SUCCESS  if operation was successful*/\n    fn cublasLtMatrixTransformDescDestroy(\n        transformDesc: cuda_types::cublaslt::cublasLtMatrixTransformDesc_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Set matrix transform operation descriptor attribute.\n\n \\param[in]  transformDesc  The descriptor\n \\param[in]  attr           The attribute\n \\param[in]  buf            memory address containing the new value\n \\param[in]  sizeInBytes    size of buf buffer for verification (in bytes)\n\n \\retval     CUBLAS_STATUS_INVALID_VALUE  if buf is NULL or sizeInBytes doesn't match size of internal storage for\n                                          selected attribute\n \\retval     CUBLAS_STATUS_SUCCESS        if attribute was set successfully*/\n    fn cublasLtMatrixTransformDescSetAttribute(\n        transformDesc: cuda_types::cublaslt::cublasLtMatrixTransformDesc_t,\n        attr: cuda_types::cublaslt::cublasLtMatrixTransformDescAttributes_t,\n        buf: *const ::core::ffi::c_void,\n        sizeInBytes: usize,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Get matrix transform operation descriptor attribute.\n\n \\param[in]  transformDesc  The descriptor\n \\param[in]  attr           The attribute\n \\param[out] buf            memory address containing the new value\n \\param[in]  sizeInBytes    size of buf buffer for verification (in bytes)\n \\param[out] sizeWritten    only valid when return value is CUBLAS_STATUS_SUCCESS. If sizeInBytes is non-zero: number\n of bytes actually written, if sizeInBytes is 0: number of bytes needed to write full contents\n\n \\retval     CUBLAS_STATUS_INVALID_VALUE  if sizeInBytes is 0 and sizeWritten is NULL, or if  sizeInBytes is non-zero\n                                          and buf is NULL or sizeInBytes doesn't match size of internal storage for\n                                          selected attribute\n \\retval     CUBLAS_STATUS_SUCCESS        if attribute's value was successfully written to user memory*/\n    fn cublasLtMatrixTransformDescGetAttribute(\n        transformDesc: cuda_types::cublaslt::cublasLtMatrixTransformDesc_t,\n        attr: cuda_types::cublaslt::cublasLtMatrixTransformDescAttributes_t,\n        buf: *mut ::core::ffi::c_void,\n        sizeInBytes: usize,\n        sizeWritten: *mut usize,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /// Internal. Do not use directly.\n    fn cublasLtMatmulPreferenceInit_internal(\n        pref: cuda_types::cublaslt::cublasLtMatmulPreference_t,\n        size: usize,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Create new matmul heuristic search preference descriptor.\n\n \\retval     CUBLAS_STATUS_ALLOC_FAILED  if memory could not be allocated\n \\retval     CUBLAS_STATUS_SUCCESS       if desciptor was created successfully*/\n    fn cublasLtMatmulPreferenceCreate(\n        pref: *mut cuda_types::cublaslt::cublasLtMatmulPreference_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Destroy matmul heuristic search preference descriptor.\n\n \\retval     CUBLAS_STATUS_SUCCESS  if operation was successful*/\n    fn cublasLtMatmulPreferenceDestroy(\n        pref: cuda_types::cublaslt::cublasLtMatmulPreference_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Set matmul heuristic search preference descriptor attribute.\n\n \\param[in]  pref         The descriptor\n \\param[in]  attr         The attribute\n \\param[in]  buf          memory address containing the new value\n \\param[in]  sizeInBytes  size of buf buffer for verification (in bytes)\n\n \\retval     CUBLAS_STATUS_INVALID_VALUE  if buf is NULL or sizeInBytes doesn't match size of internal storage for\n                                          selected attribute\n \\retval     CUBLAS_STATUS_SUCCESS        if attribute was set successfully*/\n    fn cublasLtMatmulPreferenceSetAttribute(\n        pref: cuda_types::cublaslt::cublasLtMatmulPreference_t,\n        attr: cuda_types::cublaslt::cublasLtMatmulPreferenceAttributes_t,\n        buf: *const ::core::ffi::c_void,\n        sizeInBytes: usize,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Get matmul heuristic search preference descriptor attribute.\n\n \\param[in]  pref         The descriptor\n \\param[in]  attr         The attribute\n \\param[out] buf          memory address containing the new value\n \\param[in]  sizeInBytes  size of buf buffer for verification (in bytes)\n \\param[out] sizeWritten  only valid when return value is CUBLAS_STATUS_SUCCESS. If sizeInBytes is non-zero: number of\n                          bytes actually written, if sizeInBytes is 0: number of bytes needed to write full contents\n\n \\retval     CUBLAS_STATUS_INVALID_VALUE  if sizeInBytes is 0 and sizeWritten is NULL, or if  sizeInBytes is non-zero\n                                          and buf is NULL or sizeInBytes doesn't match size of internal storage for\n                                          selected attribute\n \\retval     CUBLAS_STATUS_SUCCESS        if attribute's value was successfully written to user memory*/\n    fn cublasLtMatmulPreferenceGetAttribute(\n        pref: cuda_types::cublaslt::cublasLtMatmulPreference_t,\n        attr: cuda_types::cublaslt::cublasLtMatmulPreferenceAttributes_t,\n        buf: *mut ::core::ffi::c_void,\n        sizeInBytes: usize,\n        sizeWritten: *mut usize,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Query cublasLt heuristic for algorithm appropriate for given use case.\n\n \\param[in]      lightHandle            Pointer to the allocated cuBLASLt handle for the cuBLASLt\n                                        context. See cublasLtHandle_t.\n \\param[in]      operationDesc          Handle to the matrix multiplication descriptor.\n \\param[in]      Adesc                  Handle to the layout descriptors for matrix A.\n \\param[in]      Bdesc                  Handle to the layout descriptors for matrix B.\n \\param[in]      Cdesc                  Handle to the layout descriptors for matrix C.\n \\param[in]      Ddesc                  Handle to the layout descriptors for matrix D.\n \\param[in]      preference             Pointer to the structure holding the heuristic search\n                                        preferences descriptor. See cublasLtMatrixLayout_t.\n \\param[in]      requestedAlgoCount     Size of heuristicResultsArray (in elements) and requested\n                                        maximum number of algorithms to return.\n \\param[in, out] heuristicResultsArray  Output algorithms and associated runtime characteristics,\n                                        ordered in increasing estimated compute time.\n \\param[out]     returnAlgoCount        The number of heuristicResultsArray elements written.\n\n \\retval  CUBLAS_STATUS_INVALID_VALUE   if requestedAlgoCount is less or equal to zero\n \\retval  CUBLAS_STATUS_NOT_SUPPORTED   if no heuristic function available for current configuration\n \\retval  CUBLAS_STATUS_SUCCESS         if query was successful, inspect\n                                        heuristicResultsArray[0 to (returnAlgoCount - 1)].state\n                                        for detail status of results*/\n    fn cublasLtMatmulAlgoGetHeuristic(\n        lightHandle: cuda_types::cublaslt::cublasLtHandle_t,\n        operationDesc: cuda_types::cublaslt::cublasLtMatmulDesc_t,\n        Adesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n        Bdesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n        Cdesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n        Ddesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n        preference: cuda_types::cublaslt::cublasLtMatmulPreference_t,\n        requestedAlgoCount: ::core::ffi::c_int,\n        heuristicResultsArray: *mut cuda_types::cublaslt::cublasLtMatmulHeuristicResult_t,\n        returnAlgoCount: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Routine to get all algo IDs that can potentially run\n\n \\param[in]  int              requestedAlgoCount requested number of algos (must be less or equal to size of algoIdsA\n (in elements)) \\param[out] algoIdsA         array to write algoIds to \\param[out] returnAlgoCount  number of algoIds\n actually written\n\n \\retval     CUBLAS_STATUS_INVALID_VALUE  if requestedAlgoCount is less or equal to zero\n \\retval     CUBLAS_STATUS_SUCCESS        if query was successful, inspect returnAlgoCount to get actual number of IDs\n                                          available*/\n    fn cublasLtMatmulAlgoGetIds(\n        lightHandle: cuda_types::cublaslt::cublasLtHandle_t,\n        computeType: cuda_types::cublas::cublasComputeType_t,\n        scaleType: cuda_types::cublaslt::cudaDataType_t,\n        Atype: cuda_types::cublaslt::cudaDataType_t,\n        Btype: cuda_types::cublaslt::cudaDataType_t,\n        Ctype: cuda_types::cublaslt::cudaDataType_t,\n        Dtype: cuda_types::cublaslt::cudaDataType_t,\n        requestedAlgoCount: ::core::ffi::c_int,\n        algoIdsArray: *mut ::core::ffi::c_int,\n        returnAlgoCount: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Initialize algo structure\n\n \\retval     CUBLAS_STATUS_INVALID_VALUE  if algo is NULL or algoId is outside of recognized range\n \\retval     CUBLAS_STATUS_NOT_SUPPORTED  if algoId is not supported for given combination of data types\n \\retval     CUBLAS_STATUS_SUCCESS        if the structure was successfully initialized*/\n    fn cublasLtMatmulAlgoInit(\n        lightHandle: cuda_types::cublaslt::cublasLtHandle_t,\n        computeType: cuda_types::cublas::cublasComputeType_t,\n        scaleType: cuda_types::cublaslt::cudaDataType_t,\n        Atype: cuda_types::cublaslt::cudaDataType_t,\n        Btype: cuda_types::cublaslt::cudaDataType_t,\n        Ctype: cuda_types::cublaslt::cudaDataType_t,\n        Dtype: cuda_types::cublaslt::cudaDataType_t,\n        algoId: ::core::ffi::c_int,\n        algo: *mut cuda_types::cublaslt::cublasLtMatmulAlgo_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Check configured algo descriptor for correctness and support on current device.\n\n Result includes required workspace size and calculated wave count.\n\n CUBLAS_STATUS_SUCCESS doesn't fully guarantee algo will run (will fail if e.g. buffers are not correctly aligned);\n but if cublasLtMatmulAlgoCheck fails, the algo will not run.\n\n \\param[in]  algo    algo configuration to check\n \\param[out] result  result structure to report algo runtime characteristics; algo field is never updated\n\n \\retval     CUBLAS_STATUS_INVALID_VALUE  if matrix layout descriptors or operation descriptor don't match algo\n                                          descriptor\n \\retval     CUBLAS_STATUS_NOT_SUPPORTED  if algo configuration or data type combination is not currently supported on\n                                          given device\n \\retval     CUBLAS_STATUS_ARCH_MISMATCH  if algo configuration cannot be run using the selected device\n \\retval     CUBLAS_STATUS_SUCCESS        if check was successful*/\n    fn cublasLtMatmulAlgoCheck(\n        lightHandle: cuda_types::cublaslt::cublasLtHandle_t,\n        operationDesc: cuda_types::cublaslt::cublasLtMatmulDesc_t,\n        Adesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n        Bdesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n        Cdesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n        Ddesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n        algo: *const cuda_types::cublaslt::cublasLtMatmulAlgo_t,\n        result: *mut cuda_types::cublaslt::cublasLtMatmulHeuristicResult_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Get algo capability attribute.\n\n E.g. to get list of supported Tile IDs:\n      cublasLtMatmulTile_t tiles[CUBLASLT_MATMUL_TILE_END];\n      size_t num_tiles, size_written;\n      if (cublasLtMatmulAlgoCapGetAttribute(algo, CUBLASLT_ALGO_CAP_TILE_IDS, tiles, sizeof(tiles), size_written) ==\n CUBLAS_STATUS_SUCCESS) { num_tiles = size_written / sizeof(tiles[0]);\n      }\n\n \\param[in]  algo         The algo descriptor\n \\param[in]  attr         The attribute\n \\param[out] buf          memory address containing the new value\n \\param[in]  sizeInBytes  size of buf buffer for verification (in bytes)\n \\param[out] sizeWritten  only valid when return value is CUBLAS_STATUS_SUCCESS. If sizeInBytes is non-zero: number of\n                          bytes actually written, if sizeInBytes is 0: number of bytes needed to write full contents\n\n \\retval     CUBLAS_STATUS_INVALID_VALUE  if sizeInBytes is 0 and sizeWritten is NULL, or if  sizeInBytes is non-zero\n                                          and buf is NULL or sizeInBytes doesn't match size of internal storage for\n                                          selected attribute\n \\retval     CUBLAS_STATUS_SUCCESS        if attribute's value was successfully written to user memory*/\n    fn cublasLtMatmulAlgoCapGetAttribute(\n        algo: *const cuda_types::cublaslt::cublasLtMatmulAlgo_t,\n        attr: cuda_types::cublaslt::cublasLtMatmulAlgoCapAttributes_t,\n        buf: *mut ::core::ffi::c_void,\n        sizeInBytes: usize,\n        sizeWritten: *mut usize,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Set algo configuration attribute.\n\n \\param[in]  algo         The algo descriptor\n \\param[in]  attr         The attribute\n \\param[in]  buf          memory address containing the new value\n \\param[in]  sizeInBytes  size of buf buffer for verification (in bytes)\n\n \\retval     CUBLAS_STATUS_INVALID_VALUE  if buf is NULL or sizeInBytes doesn't match size of internal storage for\n                                          selected attribute\n \\retval     CUBLAS_STATUS_SUCCESS        if attribute was set successfully*/\n    fn cublasLtMatmulAlgoConfigSetAttribute(\n        algo: *mut cuda_types::cublaslt::cublasLtMatmulAlgo_t,\n        attr: cuda_types::cublaslt::cublasLtMatmulAlgoConfigAttributes_t,\n        buf: *const ::core::ffi::c_void,\n        sizeInBytes: usize,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Get algo configuration attribute.\n\n \\param[in]  algo         The algo descriptor\n \\param[in]  attr         The attribute\n \\param[out] buf          memory address containing the new value\n \\param[in]  sizeInBytes  size of buf buffer for verification (in bytes)\n \\param[out] sizeWritten  only valid when return value is CUBLAS_STATUS_SUCCESS. If sizeInBytes is non-zero: number of\n                          bytes actually written, if sizeInBytes is 0: number of bytes needed to write full contents\n\n \\retval     CUBLAS_STATUS_INVALID_VALUE  if sizeInBytes is 0 and sizeWritten is NULL, or if  sizeInBytes is non-zero\n                                          and buf is NULL or sizeInBytes doesn't match size of internal storage for\n                                          selected attribute\n \\retval     CUBLAS_STATUS_SUCCESS        if attribute's value was successfully written to user memory*/\n    fn cublasLtMatmulAlgoConfigGetAttribute(\n        algo: *const cuda_types::cublaslt::cublasLtMatmulAlgo_t,\n        attr: cuda_types::cublaslt::cublasLtMatmulAlgoConfigAttributes_t,\n        buf: *mut ::core::ffi::c_void,\n        sizeInBytes: usize,\n        sizeWritten: *mut usize,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Experimental: Logger callback setter.\n\n \\param[in]  callback                     a user defined callback function to be called by the logger\n\n \\retval     CUBLAS_STATUS_SUCCESS        if callback was set successfully*/\n    fn cublasLtLoggerSetCallback(\n        callback: cuda_types::cublaslt::cublasLtLoggerCallback_t,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Experimental: Log file setter.\n\n \\param[in]  file                         an open file with write permissions\n\n \\retval     CUBLAS_STATUS_SUCCESS        if log file was set successfully*/\n    fn cublasLtLoggerSetFile(\n        file: *mut cuda_types::FILE,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Experimental: Open log file.\n\n \\param[in]  logFile                      log file path. if the log file does not exist, it will be created\n\n \\retval     CUBLAS_STATUS_SUCCESS        if log file was created successfully*/\n    fn cublasLtLoggerOpenFile(\n        logFile: *const ::core::ffi::c_char,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Experimental: Log level setter.\n\n \\param[in]  level                        log level, should be one of the following:\n                                          0. Off\n                                          1. Errors\n                                          2. Performance Trace\n                                          3. Performance Hints\n                                          4. Heuristics Trace\n                                          5. API Trace\n\n \\retval     CUBLAS_STATUS_INVALID_VALUE  if log level is not one of the above levels\n\n \\retval     CUBLAS_STATUS_SUCCESS        if log level was set successfully*/\n    fn cublasLtLoggerSetLevel(\n        level: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Experimental: Log mask setter.\n\n \\param[in]  mask                         log mask, should be a combination of the following masks:\n                                          0.  Off\n                                          1.  Errors\n                                          2.  Performance Trace\n                                          4.  Performance Hints\n                                          8.  Heuristics Trace\n                                          16. API Trace\n\n \\retval     CUBLAS_STATUS_SUCCESS        if log mask was set successfully*/\n    fn cublasLtLoggerSetMask(\n        mask: ::core::ffi::c_int,\n    ) -> cuda_types::cublas::cublasStatus_t;\n    #[must_use]\n    /** Experimental: Disable logging for the entire session.\n\n \\retval     CUBLAS_STATUS_SUCCESS        if disabled logging*/\n    fn cublasLtLoggerForceDisable() -> cuda_types::cublas::cublasStatus_t;\n}\n"
  },
  {
    "path": "cuda_macros/src/cublaslt_internal.rs",
    "content": "/* automatically generated by rust-bindgen 0.70.1 */\n\nextern \"system\" {\n    fn cublasLtShutdownCtx(param_1: ::core::ffi::c_ulonglong) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtSetEnvironmentMode(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtGetEnvironmentMode(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: *mut ::core::ffi::c_uint,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtCtxInit(param_1: ::core::ffi::c_ulonglong) -> ::core::ffi::c_int;\n}\nextern \"system\" {\n    fn cublasLtHeuristicsCacheDestroy(\n        param_1: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtHeuristicLutSerializeEntry(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: *mut ::core::ffi::c_ulonglong,\n        param_13: *mut ::core::ffi::c_ulonglong,\n        param_14: ::core::ffi::c_ulonglong,\n        param_15: *mut ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtHeuristicsCachePut(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtHeuristicsCacheGet(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtHeuristicsCacheCreate(\n        param_1: *mut ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtLegacyGemmACC(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: *mut ::core::ffi::c_int,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_uint,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_uint,\n        param_14: ::core::ffi::c_uint,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_uint,\n        param_17: ::core::ffi::c_uint,\n        param_18: ::core::ffi::c_ulonglong,\n        param_19: ::core::ffi::c_uint,\n        param_20: ::core::ffi::c_uint,\n        param_21: ::core::ffi::c_uint,\n        param_22: ::core::ffi::c_uint,\n        param_23: ::core::ffi::c_uint,\n        param_24: ::core::ffi::c_uchar,\n        param_25: ::core::ffi::c_ulonglong,\n        param_26: ::core::ffi::c_ulonglong,\n        param_27: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtLegacyGemmBII(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: *mut ::core::ffi::c_int,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_uint,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_uint,\n        param_14: ::core::ffi::c_uint,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_uint,\n        param_17: ::core::ffi::c_uint,\n        param_18: ::core::ffi::c_ulonglong,\n        param_19: ::core::ffi::c_uint,\n        param_20: ::core::ffi::c_uint,\n        param_21: ::core::ffi::c_uint,\n        param_22: ::core::ffi::c_uint,\n        param_23: ::core::ffi::c_uint,\n        param_24: ::core::ffi::c_uchar,\n        param_25: ::core::ffi::c_ulonglong,\n        param_26: ::core::ffi::c_ulonglong,\n        param_27: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtLegacyGemmBSS(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: *mut ::core::ffi::c_int,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_uint,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_uint,\n        param_14: ::core::ffi::c_uint,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_uint,\n        param_17: ::core::ffi::c_uint,\n        param_18: ::core::ffi::c_ulonglong,\n        param_19: ::core::ffi::c_uint,\n        param_20: ::core::ffi::c_uint,\n        param_21: ::core::ffi::c_uint,\n        param_22: ::core::ffi::c_uint,\n        param_23: ::core::ffi::c_uint,\n        param_24: ::core::ffi::c_uchar,\n        param_25: ::core::ffi::c_ulonglong,\n        param_26: ::core::ffi::c_ulonglong,\n        param_27: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtLegacyGemmCCC(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: *mut ::core::ffi::c_int,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_uint,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_uint,\n        param_14: ::core::ffi::c_uint,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_uint,\n        param_17: ::core::ffi::c_uint,\n        param_18: ::core::ffi::c_ulonglong,\n        param_19: ::core::ffi::c_uint,\n        param_20: ::core::ffi::c_uint,\n        param_21: ::core::ffi::c_uint,\n        param_22: ::core::ffi::c_uint,\n        param_23: ::core::ffi::c_uint,\n        param_24: ::core::ffi::c_uchar,\n        param_25: ::core::ffi::c_ulonglong,\n        param_26: ::core::ffi::c_ulonglong,\n        param_27: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtLegacyGemmDDD(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: *mut ::core::ffi::c_int,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_uint,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_uint,\n        param_14: ::core::ffi::c_uint,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_uint,\n        param_17: ::core::ffi::c_uint,\n        param_18: ::core::ffi::c_ulonglong,\n        param_19: ::core::ffi::c_uint,\n        param_20: ::core::ffi::c_uint,\n        param_21: ::core::ffi::c_uint,\n        param_22: ::core::ffi::c_uint,\n        param_23: ::core::ffi::c_uint,\n        param_24: ::core::ffi::c_uchar,\n        param_25: ::core::ffi::c_ulonglong,\n        param_26: ::core::ffi::c_ulonglong,\n        param_27: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtLegacyGemmHHH(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: *mut ::core::ffi::c_int,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_uint,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_uint,\n        param_14: ::core::ffi::c_uint,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_uint,\n        param_17: ::core::ffi::c_uint,\n        param_18: ::core::ffi::c_ulonglong,\n        param_19: ::core::ffi::c_uint,\n        param_20: ::core::ffi::c_uint,\n        param_21: ::core::ffi::c_uint,\n        param_22: ::core::ffi::c_uint,\n        param_23: ::core::ffi::c_uint,\n        param_24: ::core::ffi::c_uchar,\n        param_25: ::core::ffi::c_ulonglong,\n        param_26: ::core::ffi::c_ulonglong,\n        param_27: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtLegacyGemmHSS(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: *mut ::core::ffi::c_int,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_uint,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_uint,\n        param_14: ::core::ffi::c_uint,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_uint,\n        param_17: ::core::ffi::c_uint,\n        param_18: ::core::ffi::c_ulonglong,\n        param_19: ::core::ffi::c_uint,\n        param_20: ::core::ffi::c_uint,\n        param_21: ::core::ffi::c_uint,\n        param_22: ::core::ffi::c_uint,\n        param_23: ::core::ffi::c_uint,\n        param_24: ::core::ffi::c_uchar,\n        param_25: ::core::ffi::c_ulonglong,\n        param_26: ::core::ffi::c_ulonglong,\n        param_27: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtLegacyGemmHSH(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: *mut ::core::ffi::c_int,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_uint,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_uint,\n        param_14: ::core::ffi::c_uint,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_uint,\n        param_17: ::core::ffi::c_uint,\n        param_18: ::core::ffi::c_ulonglong,\n        param_19: ::core::ffi::c_uint,\n        param_20: ::core::ffi::c_uint,\n        param_21: ::core::ffi::c_uint,\n        param_22: ::core::ffi::c_uint,\n        param_23: ::core::ffi::c_uint,\n        param_24: ::core::ffi::c_uchar,\n        param_25: ::core::ffi::c_ulonglong,\n        param_26: ::core::ffi::c_ulonglong,\n        param_27: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtLegacyGemmSSS(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: *mut ::core::ffi::c_int,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_uint,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_uint,\n        param_14: ::core::ffi::c_uint,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_uint,\n        param_17: ::core::ffi::c_uint,\n        param_18: ::core::ffi::c_ulonglong,\n        param_19: ::core::ffi::c_uint,\n        param_20: ::core::ffi::c_uint,\n        param_21: ::core::ffi::c_uint,\n        param_22: ::core::ffi::c_uint,\n        param_23: ::core::ffi::c_uint,\n        param_24: ::core::ffi::c_uchar,\n        param_25: ::core::ffi::c_ulonglong,\n        param_26: ::core::ffi::c_ulonglong,\n        param_27: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtLegacyGemmTSS(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: *mut ::core::ffi::c_int,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_uint,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_uint,\n        param_14: ::core::ffi::c_uint,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_uint,\n        param_17: ::core::ffi::c_uint,\n        param_18: ::core::ffi::c_ulonglong,\n        param_19: ::core::ffi::c_uint,\n        param_20: ::core::ffi::c_uint,\n        param_21: ::core::ffi::c_uint,\n        param_22: ::core::ffi::c_uint,\n        param_23: ::core::ffi::c_uint,\n        param_24: ::core::ffi::c_uchar,\n        param_25: ::core::ffi::c_ulonglong,\n        param_26: ::core::ffi::c_ulonglong,\n        param_27: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtLegacyGemmTST(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: *mut ::core::ffi::c_int,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_uint,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_uint,\n        param_14: ::core::ffi::c_uint,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_uint,\n        param_17: ::core::ffi::c_uint,\n        param_18: ::core::ffi::c_ulonglong,\n        param_19: ::core::ffi::c_uint,\n        param_20: ::core::ffi::c_uint,\n        param_21: ::core::ffi::c_uint,\n        param_22: ::core::ffi::c_uint,\n        param_23: ::core::ffi::c_uint,\n        param_24: ::core::ffi::c_uchar,\n        param_25: ::core::ffi::c_ulonglong,\n        param_26: ::core::ffi::c_ulonglong,\n        param_27: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtLegacyGemmZZZ(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: *mut ::core::ffi::c_int,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_uint,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_uint,\n        param_14: ::core::ffi::c_uint,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_uint,\n        param_17: ::core::ffi::c_uint,\n        param_18: ::core::ffi::c_ulonglong,\n        param_19: ::core::ffi::c_uint,\n        param_20: ::core::ffi::c_uint,\n        param_21: ::core::ffi::c_uint,\n        param_22: ::core::ffi::c_uint,\n        param_23: ::core::ffi::c_uint,\n        param_24: ::core::ffi::c_uchar,\n        param_25: ::core::ffi::c_ulonglong,\n        param_26: ::core::ffi::c_ulonglong,\n        param_27: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtClearNvjetCache(param_1: ::core::ffi::c_ulonglong) -> ();\n}\nextern \"system\" {\n    fn cublasLtAlgoCharacteristicGetAttribute(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_int,\n        param_4: ::core::ffi::c_int,\n        param_5: ::core::ffi::c_int,\n        param_6: *mut ::core::ffi::c_char,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtMatmulAlgoConfigGetAttributeRange() -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtHHHMatmulAlgoGetIds(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_int,\n        param_5: ::core::ffi::c_int,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_int,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: *mut ::core::ffi::c_int,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtHHHMatmulAlgoInit(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtHHHMatmulAlgoCapGetAttribute(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtHHHMatmul(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_ulonglong,\n        param_14: ::core::ffi::c_ulonglong,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtHHHMatmulAlgoCheck(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtHHHMatmulAlgoGetHeuristic(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: *mut ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtHSHMatmulAlgoGetIds(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_int,\n        param_5: ::core::ffi::c_int,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_int,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: *mut ::core::ffi::c_int,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtHSHMatmulAlgoInit(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtHSHMatmulAlgoCapGetAttribute(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtHSHMatmul(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_ulonglong,\n        param_14: ::core::ffi::c_ulonglong,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtHSHMatmulAlgoCheck(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtHSHMatmulAlgoGetHeuristic(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: *mut ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtSSSMatmulAlgoGetIds(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_int,\n        param_5: ::core::ffi::c_int,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_int,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: *mut ::core::ffi::c_int,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtSSSMatmulAlgoInit(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtSSSMatmulAlgoCapGetAttribute(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtSSSMatmul(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_ulonglong,\n        param_14: ::core::ffi::c_ulonglong,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtSSSMatmulAlgoCheck(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtSSSMatmulAlgoGetHeuristic(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: *mut ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtDDDMatmulAlgoGetIds(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_int,\n        param_5: ::core::ffi::c_int,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_int,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: *mut ::core::ffi::c_int,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtDDDMatmulAlgoInit(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtDDDMatmulAlgoCapGetAttribute(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtDDDMatmul(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_ulonglong,\n        param_14: ::core::ffi::c_ulonglong,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtDDDMatmulAlgoCheck(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtDDDMatmulAlgoGetHeuristic(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: *mut ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtBSSMatmulAlgoGetIds(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_int,\n        param_5: ::core::ffi::c_int,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_int,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: *mut ::core::ffi::c_int,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtBSSMatmulAlgoInit(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtBSSMatmulAlgoCapGetAttribute(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtBSSMatmul(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_ulonglong,\n        param_14: ::core::ffi::c_ulonglong,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtBSSMatmulAlgoCheck(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtBSSMatmulAlgoGetHeuristic(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: *mut ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtCCCMatmulAlgoGetIds(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_int,\n        param_5: ::core::ffi::c_int,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_int,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: *mut ::core::ffi::c_int,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtCCCMatmulAlgoInit(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtCCCMatmulAlgoCapGetAttribute(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtCCCMatmul(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_ulonglong,\n        param_14: ::core::ffi::c_ulonglong,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtCCCMatmulAlgoCheck(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtCCCMatmulAlgoGetHeuristic(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: *mut ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtZZZMatmulAlgoGetIds(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_int,\n        param_5: ::core::ffi::c_int,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_int,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: *mut ::core::ffi::c_int,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtZZZMatmulAlgoInit(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtZZZMatmulAlgoCapGetAttribute(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtZZZMatmul(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_ulonglong,\n        param_14: ::core::ffi::c_ulonglong,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtZZZMatmulAlgoCheck(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtZZZMatmulAlgoGetHeuristic(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: *mut ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtACCMatmulAlgoGetIds(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_int,\n        param_5: ::core::ffi::c_int,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_int,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: *mut ::core::ffi::c_int,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtACCMatmulAlgoInit(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtACCMatmulAlgoCapGetAttribute(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtACCMatmul(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_ulonglong,\n        param_14: ::core::ffi::c_ulonglong,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtACCMatmulAlgoCheck(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtACCMatmulAlgoGetHeuristic(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: *mut ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtBIIMatmulAlgoGetIds(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_int,\n        param_5: ::core::ffi::c_int,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_int,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: *mut ::core::ffi::c_int,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtBIIMatmulAlgoInit(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtBIIMatmulAlgoCapGetAttribute(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtBIIMatmul(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_ulonglong,\n        param_14: ::core::ffi::c_ulonglong,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtBIIMatmulAlgoCheck(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtBIIMatmulAlgoGetHeuristic(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: *mut ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtBSBMatmulAlgoGetIds(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_int,\n        param_5: ::core::ffi::c_int,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_int,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: *mut ::core::ffi::c_int,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtBSBMatmulAlgoInit(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtBSBMatmulAlgoCapGetAttribute(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtBSBMatmul(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_ulonglong,\n        param_14: ::core::ffi::c_ulonglong,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtBSBMatmulAlgoCheck(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtBSBMatmulAlgoGetHeuristic(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: *mut ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtHSSMatmulAlgoGetIds(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_int,\n        param_5: ::core::ffi::c_int,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_int,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: *mut ::core::ffi::c_int,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtHSSMatmulAlgoInit(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtHSSMatmulAlgoCapGetAttribute(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtHSSMatmul(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_ulonglong,\n        param_14: ::core::ffi::c_ulonglong,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtHSSMatmulAlgoCheck(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtHSSMatmulAlgoGetHeuristic(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: *mut ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtKCCMatmulAlgoGetIds(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_int,\n        param_5: ::core::ffi::c_int,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_int,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: *mut ::core::ffi::c_int,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtKCCMatmulAlgoInit(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtKCCMatmulAlgoCapGetAttribute(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtKCCMatmul(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_ulonglong,\n        param_14: ::core::ffi::c_ulonglong,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtKCCMatmulAlgoCheck(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtKCCMatmulAlgoGetHeuristic(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: *mut ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtKCKMatmulAlgoGetIds(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_int,\n        param_5: ::core::ffi::c_int,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_int,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: *mut ::core::ffi::c_int,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtKCKMatmulAlgoInit(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtKCKMatmulAlgoCapGetAttribute(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtKCKMatmul(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_ulonglong,\n        param_14: ::core::ffi::c_ulonglong,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtKCKMatmulAlgoCheck(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtKCKMatmulAlgoGetHeuristic(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: *mut ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtTSSMatmulAlgoGetIds(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_int,\n        param_5: ::core::ffi::c_int,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_int,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: *mut ::core::ffi::c_int,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtTSSMatmulAlgoInit(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtTSSMatmulAlgoCapGetAttribute(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtTSSMatmul(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_ulonglong,\n        param_14: ::core::ffi::c_ulonglong,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtTSSMatmulAlgoCheck(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtTSSMatmulAlgoGetHeuristic(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: *mut ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtTSTMatmulAlgoGetIds(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_int,\n        param_5: ::core::ffi::c_int,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_int,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: *mut ::core::ffi::c_int,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtTSTMatmulAlgoInit(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtTSTMatmulAlgoCapGetAttribute(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtTSTMatmul(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_ulonglong,\n        param_14: ::core::ffi::c_ulonglong,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtTSTMatmulAlgoCheck(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtTSTMatmulAlgoGetHeuristic(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: *mut ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtVCCMatmulAlgoGetIds(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_int,\n        param_5: ::core::ffi::c_int,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_int,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: *mut ::core::ffi::c_int,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtVCCMatmulAlgoInit(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtVCCMatmulAlgoCapGetAttribute(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtVCCMatmul(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_ulonglong,\n        param_14: ::core::ffi::c_ulonglong,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtVCCMatmulAlgoCheck(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtVCCMatmulAlgoGetHeuristic(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: *mut ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtVCVMatmulAlgoGetIds(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_int,\n        param_5: ::core::ffi::c_int,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_int,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: *mut ::core::ffi::c_int,\n    ) -> ::core::ffi::c_ulonglong;\n}\nextern \"system\" {\n    fn cublasLtVCVMatmulAlgoInit(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_uint,\n        param_4: ::core::ffi::c_uint,\n        param_5: ::core::ffi::c_uint,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtVCVMatmulAlgoCapGetAttribute(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_uint,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtVCVMatmul(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n        param_11: ::core::ffi::c_ulonglong,\n        param_12: ::core::ffi::c_ulonglong,\n        param_13: ::core::ffi::c_ulonglong,\n        param_14: ::core::ffi::c_ulonglong,\n        param_15: ::core::ffi::c_ulonglong,\n        param_16: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtVCVMatmulAlgoCheck(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLtVCVMatmulAlgoGetHeuristic(\n        param_1: ::core::ffi::c_ulonglong,\n        param_2: ::core::ffi::c_ulonglong,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_ulonglong,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_ulonglong,\n        param_7: *mut ::core::ffi::c_ulonglong,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_ulonglong,\n    ) -> ::core::ffi::c_uint;\n}\nextern \"system\" {\n    fn cublasLt_for_cublas_BII() -> *mut ::core::ffi::c_void;\n}\nextern \"system\" {\n    fn cublasLt_for_cublas_BSS() -> *mut ::core::ffi::c_void;\n}\nextern \"system\" {\n    fn cublasLt_for_cublas_DDD() -> *mut ::core::ffi::c_void;\n}\nextern \"system\" {\n    fn cublasLt_for_cublas_HHH() -> *mut ::core::ffi::c_void;\n}\nextern \"system\" {\n    fn cublasLt_for_cublas_HSH() -> *mut ::core::ffi::c_void;\n}\nextern \"system\" {\n    fn cublasLt_for_cublas_HSS() -> *mut ::core::ffi::c_void;\n}\nextern \"system\" {\n    fn cublasLt_for_cublas_SSS() -> *mut ::core::ffi::c_void;\n}\nextern \"system\" {\n    fn cublasLt_for_cublas_TSS() -> *mut ::core::ffi::c_void;\n}\nextern \"system\" {\n    fn cublasLt_for_cublas_TST() -> *mut ::core::ffi::c_void;\n}\n"
  },
  {
    "path": "cuda_macros/src/cuda.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\nextern \"system\" {\n    /** \\brief Gets the string description of an error code\n\n Sets \\p *pStr to the address of a NULL-terminated string description\n of the error code \\p error.\n If the error code is not recognized, ::CUDA_ERROR_INVALID_VALUE\n will be returned and \\p *pStr will be set to the NULL address.\n\n \\param error - Error code to convert to string\n \\param pStr - Address of the string pointer.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::CUresult,\n ::cudaGetErrorString*/\n    fn cuGetErrorString(\n        error: cuda_types::cuda::CUresult,\n        pStr: *mut *const ::core::ffi::c_char,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Gets the string representation of an error code enum name\n\n Sets \\p *pStr to the address of a NULL-terminated string representation\n of the name of the enum error code \\p error.\n If the error code is not recognized, ::CUDA_ERROR_INVALID_VALUE\n will be returned and \\p *pStr will be set to the NULL address.\n\n \\param error - Error code to convert to string\n \\param pStr - Address of the string pointer.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::CUresult,\n ::cudaGetErrorName*/\n    fn cuGetErrorName(\n        error: cuda_types::cuda::CUresult,\n        pStr: *mut *const ::core::ffi::c_char,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Initialize the CUDA driver API\n Initializes the driver API and must be called before any other function from\n the driver API in the current process. Currently, the \\p Flags parameter must be 0. If ::cuInit()\n has not been called, any function from the driver API will return\n ::CUDA_ERROR_NOT_INITIALIZED.\n\n Note: cuInit preloads various libraries needed for JIT compilation. To opt-out of this behavior,\n set the environment variable CUDA_FORCE_PRELOAD_LIBRARIES=0. CUDA will lazily load JIT libraries as needed.\n To disable JIT entirely, set the environment variable CUDA_DISABLE_JIT=1.\n\n \\param Flags - Initialization flag for CUDA.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE,\n ::CUDA_ERROR_SYSTEM_DRIVER_MISMATCH,\n ::CUDA_ERROR_COMPAT_NOT_SUPPORTED_ON_DEVICE\n \\notefnerr*/\n    fn cuInit(Flags: ::core::ffi::c_uint) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the latest CUDA version supported by driver\n\n Returns in \\p *driverVersion the version of CUDA supported by\n the driver.  The version is returned as\n (1000 * major + 10 * minor). For example, CUDA 9.2\n would be represented by 9020.\n\n This function automatically returns ::CUDA_ERROR_INVALID_VALUE if\n \\p driverVersion is NULL.\n\n \\param driverVersion - Returns the CUDA driver version\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa\n ::cudaDriverGetVersion,\n ::cudaRuntimeGetVersion*/\n    fn cuDriverGetVersion(\n        driverVersion: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a handle to a compute device\n\n Returns in \\p *device a device handle given an ordinal in the range <b>[0,\n ::cuDeviceGetCount()-1]</b>.\n\n \\param device  - Returned device handle\n \\param ordinal - Device number to get handle for\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE\n \\notefnerr\n\n \\sa\n ::cuDeviceGetAttribute,\n ::cuDeviceGetCount,\n ::cuDeviceGetName,\n ::cuDeviceGetUuid,\n ::cuDeviceGetLuid,\n ::cuDeviceTotalMem,\n ::cuDeviceGetExecAffinitySupport*/\n    fn cuDeviceGet(\n        device: *mut cuda_types::cuda::CUdevice,\n        ordinal: ::core::ffi::c_int,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the number of compute-capable devices\n\n Returns in \\p *count the number of devices with compute capability greater\n than or equal to 2.0 that are available for execution. If there is no such\n device, ::cuDeviceGetCount() returns 0.\n\n \\param count - Returned number of compute-capable devices\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa\n ::cuDeviceGetAttribute,\n ::cuDeviceGetName,\n ::cuDeviceGetUuid,\n ::cuDeviceGetLuid,\n ::cuDeviceGet,\n ::cuDeviceTotalMem,\n ::cuDeviceGetExecAffinitySupport,\n ::cudaGetDeviceCount*/\n    fn cuDeviceGetCount(count: *mut ::core::ffi::c_int) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns an identifier string for the device\n\n Returns an ASCII string identifying the device \\p dev in the NULL-terminated\n string pointed to by \\p name. \\p len specifies the maximum length of the\n string that may be returned. \\p name is shortened to the specified \\p len, if \\p len is less than the device name\n\n \\param name - Returned identifier string for the device\n \\param len  - Maximum length of string to store in \\p name\n \\param dev  - Device to get identifier string for\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE\n \\notefnerr\n\n \\sa\n ::cuDeviceGetAttribute,\n ::cuDeviceGetUuid,\n ::cuDeviceGetLuid,\n ::cuDeviceGetCount,\n ::cuDeviceGet,\n ::cuDeviceTotalMem,\n ::cuDeviceGetExecAffinitySupport,\n ::cudaGetDeviceProperties*/\n    fn cuDeviceGetName(\n        name: *mut ::core::ffi::c_char,\n        len: ::core::ffi::c_int,\n        dev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Return an UUID for the device\n\n Returns 16-octets identifying the device \\p dev in the structure\n pointed by the \\p uuid. If the device is in MIG mode, returns its\n MIG UUID which uniquely identifies the subscribed MIG compute instance.\n\n \\param uuid - Returned UUID\n \\param dev  - Device to get identifier string for\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE\n \\notefnerr\n\n \\sa\n ::cuDeviceGetAttribute,\n ::cuDeviceGetCount,\n ::cuDeviceGetName,\n ::cuDeviceGetLuid,\n ::cuDeviceGet,\n ::cuDeviceTotalMem,\n ::cudaGetDeviceProperties*/\n    fn cuDeviceGetUuid_v2(\n        uuid: *mut cuda_types::cuda::CUuuid,\n        dev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Return an LUID and device node mask for the device\n\n Return identifying information (\\p luid and \\p deviceNodeMask) to allow\n matching device with graphics APIs.\n\n \\param luid - Returned LUID\n \\param deviceNodeMask - Returned device node mask\n \\param dev  - Device to get identifier string for\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE\n \\notefnerr\n\n \\sa\n ::cuDeviceGetAttribute,\n ::cuDeviceGetCount,\n ::cuDeviceGetName,\n ::cuDeviceGet,\n ::cuDeviceTotalMem,\n ::cuDeviceGetExecAffinitySupport,\n ::cudaGetDeviceProperties*/\n    fn cuDeviceGetLuid(\n        luid: *mut ::core::ffi::c_char,\n        deviceNodeMask: *mut ::core::ffi::c_uint,\n        dev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the total amount of memory on the device\n\n Returns in \\p *bytes the total amount of memory available on the device\n \\p dev in bytes.\n\n \\param bytes - Returned memory available on device in bytes\n \\param dev   - Device handle\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE\n \\notefnerr\n\n \\sa\n ::cuDeviceGetAttribute,\n ::cuDeviceGetCount,\n ::cuDeviceGetName,\n ::cuDeviceGetUuid,\n ::cuDeviceGet,\n ::cuDeviceGetExecAffinitySupport,\n ::cudaMemGetInfo*/\n    fn cuDeviceTotalMem_v2(\n        bytes: *mut usize,\n        dev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the maximum number of elements allocatable in a 1D linear texture for a given texture element size.\n\n Returns in \\p maxWidthInElements the maximum number of texture elements allocatable in a 1D linear texture\n for given \\p format and \\p numChannels.\n\n \\param maxWidthInElements    - Returned maximum number of texture elements allocatable for given \\p format and \\p numChannels.\n \\param format                - Texture format.\n \\param numChannels           - Number of channels per texture element.\n \\param dev                   - Device handle.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE\n \\notefnerr\n\n \\sa\n ::cuDeviceGetAttribute,\n ::cuDeviceGetCount,\n ::cuDeviceGetName,\n ::cuDeviceGetUuid,\n ::cuDeviceGet,\n ::cudaMemGetInfo,\n ::cuDeviceTotalMem*/\n    fn cuDeviceGetTexture1DLinearMaxWidth(\n        maxWidthInElements: *mut usize,\n        format: cuda_types::cuda::CUarray_format,\n        numChannels: ::core::ffi::c_uint,\n        dev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns information about the device\n\n Returns in \\p *pi the integer value of the attribute \\p attrib on device\n \\p dev.\n\n \\param pi     - Returned device attribute value\n \\param attrib - Device attribute to query\n \\param dev    - Device handle\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE\n \\notefnerr\n\n \\sa\n ::cuDeviceGetCount,\n ::cuDeviceGetName,\n ::cuDeviceGetUuid,\n ::cuDeviceGet,\n ::cuDeviceTotalMem,\n ::cuDeviceGetExecAffinitySupport,\n ::cudaDeviceGetAttribute,\n ::cudaGetDeviceProperties*/\n    fn cuDeviceGetAttribute(\n        pi: *mut ::core::ffi::c_int,\n        attrib: cuda_types::cuda::CUdevice_attribute,\n        dev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Queries details about atomic operations supported between the device and host.\n\n Returns in \\p *capabilities the details about requested atomic \\p *operations over the\n the link between \\p dev and the host. The allocated size of \\p *operations and\n \\p *capabilities must be \\p count.\n\n For each ::CUatomicOperation in \\p *operations, the corresponding result in \\p *capabilities\n will be a bitmask indicating which of ::CUatomicOperationCapability the link supports natively.\n\n Returns ::CUDA_ERROR_INVALID_DEVICE if \\p dev is not valid.\n\n Returns ::CUDA_ERROR_INVALID_VALUE if \\p *capabilities or \\p *operations is NULL, if \\p count is 0,\n or if any of \\p *operations is not valid.\n\n \\param capabilities          - Returned capability details of each requested operation\n \\param operations            - Requested operations\n \\param count                 - Count of requested operations and size of capabilities\n \\param dev                   - Device handle\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_DEVICE,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa\n ::cuDeviceGetAttribute,\n ::cuDeviceGetP2PAtomicCapabilities,\n ::cudaDeviceGeHostAtomicCapabilities*/\n    fn cuDeviceGetHostAtomicCapabilities(\n        capabilities: *mut ::core::ffi::c_uint,\n        operations: *const cuda_types::cuda::CUatomicOperation,\n        count: ::core::ffi::c_uint,\n        dev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Return NvSciSync attributes that this device can support.\n\n Returns in \\p nvSciSyncAttrList, the properties of NvSciSync that\n this CUDA device, \\p dev can support. The returned \\p nvSciSyncAttrList\n can be used to create an NvSciSync object that matches this device's capabilities.\n\n If NvSciSyncAttrKey_RequiredPerm field in \\p nvSciSyncAttrList is\n already set this API will return ::CUDA_ERROR_INVALID_VALUE.\n\n The applications should set \\p nvSciSyncAttrList to a valid\n NvSciSyncAttrList failing which this API will return\n ::CUDA_ERROR_INVALID_HANDLE.\n\n The \\p flags controls how applications intends to use\n the NvSciSync created from the \\p nvSciSyncAttrList. The valid flags are:\n - ::CUDA_NVSCISYNC_ATTR_SIGNAL, specifies that the applications intends to\n signal an NvSciSync on this CUDA device.\n - ::CUDA_NVSCISYNC_ATTR_WAIT, specifies that the applications intends to\n wait on an NvSciSync on this CUDA device.\n\n At least one of these flags must be set, failing which the API\n returns ::CUDA_ERROR_INVALID_VALUE. Both the flags are orthogonal\n to one another: a developer may set both these flags that allows to\n set both wait and signal specific attributes in the same \\p nvSciSyncAttrList.\n\n Note that this API updates the input \\p nvSciSyncAttrList with values equivalent\n to the following public attribute key-values:\n NvSciSyncAttrKey_RequiredPerm is set to\n - NvSciSyncAccessPerm_SignalOnly if ::CUDA_NVSCISYNC_ATTR_SIGNAL is set in \\p flags.\n - NvSciSyncAccessPerm_WaitOnly if ::CUDA_NVSCISYNC_ATTR_WAIT is set in \\p flags.\n - NvSciSyncAccessPerm_WaitSignal if both ::CUDA_NVSCISYNC_ATTR_WAIT and\n ::CUDA_NVSCISYNC_ATTR_SIGNAL are set in \\p flags.\n NvSciSyncAttrKey_PrimitiveInfo is set to\n - NvSciSyncAttrValPrimitiveType_SysmemSemaphore on any valid \\p device.\n - NvSciSyncAttrValPrimitiveType_Syncpoint if \\p device is a Tegra device.\n - NvSciSyncAttrValPrimitiveType_SysmemSemaphorePayload64b if \\p device is GA10X+.\n NvSciSyncAttrKey_GpuId is set to the same UUID that is returned for this\n \\p device from ::cuDeviceGetUuid.\n\n \\param nvSciSyncAttrList     - Return NvSciSync attributes supported.\n \\param dev                   - Valid Cuda Device to get NvSciSync attributes for.\n \\param flags                 - flags describing NvSciSync usage.\n\n \\return\n\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_DEVICE,\n ::CUDA_ERROR_NOT_SUPPORTED,\n ::CUDA_ERROR_OUT_OF_MEMORY\n\n \\sa\n ::cuImportExternalSemaphore,\n ::cuDestroyExternalSemaphore,\n ::cuSignalExternalSemaphoresAsync,\n ::cuWaitExternalSemaphoresAsync*/\n    fn cuDeviceGetNvSciSyncAttributes(\n        nvSciSyncAttrList: *mut ::core::ffi::c_void,\n        dev: cuda_types::cuda::CUdevice,\n        flags: ::core::ffi::c_int,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the current memory pool of a device\n\n The memory pool must be local to the specified device.\n ::cuMemAllocAsync allocates from the current mempool of the provided stream's device.\n By default, a device's current memory pool is its default memory pool.\n\n \\note Use ::cuMemAllocFromPoolAsync to specify asynchronous allocations from a device different\n than the one the stream runs on.\n\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuDeviceGetDefaultMemPool, ::cuDeviceGetMemPool, ::cuMemPoolCreate, ::cuMemPoolDestroy, ::cuMemAllocFromPoolAsync*/\n    fn cuDeviceSetMemPool(\n        dev: cuda_types::cuda::CUdevice,\n        pool: cuda_types::cuda::CUmemoryPool,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Gets the current mempool for a device\n\n Returns the last pool provided to ::cuDeviceSetMemPool for this device\n or the device's default memory pool if ::cuDeviceSetMemPool has never been called.\n By default the current mempool is the default mempool for a device.\n Otherwise the returned pool must have been set with ::cuDeviceSetMemPool.\n\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuDeviceGetDefaultMemPool, ::cuMemPoolCreate, ::cuDeviceSetMemPool*/\n    fn cuDeviceGetMemPool(\n        pool: *mut cuda_types::cuda::CUmemoryPool,\n        dev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the default mempool of a device\n\n The default mempool of a device contains device memory from that device.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE,\n ::CUDA_ERROR_NOT_SUPPORTED\n \\notefnerr\n\n \\sa ::cuMemAllocAsync, ::cuMemPoolTrimTo, ::cuMemPoolGetAttribute, ::cuMemPoolSetAttribute, cuMemPoolSetAccess, ::cuDeviceGetMemPool, ::cuMemPoolCreate*/\n    fn cuDeviceGetDefaultMemPool(\n        pool_out: *mut cuda_types::cuda::CUmemoryPool,\n        dev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns information about the execution affinity support of the device.\n\n Returns in \\p *pi whether execution affinity type \\p type is supported by device \\p dev.\n The supported types are:\n - ::CU_EXEC_AFFINITY_TYPE_SM_COUNT: 1 if context with limited SMs is supported by the device,\n   or 0 if not;\n\n \\param pi   - 1 if the execution affinity type \\p type is supported by the device, or 0 if not\n \\param type - Execution affinity type to query\n \\param dev  - Device handle\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE\n \\notefnerr\n\n \\sa\n ::cuDeviceGetAttribute,\n ::cuDeviceGetCount,\n ::cuDeviceGetName,\n ::cuDeviceGetUuid,\n ::cuDeviceGet,\n ::cuDeviceTotalMem*/\n    fn cuDeviceGetExecAffinitySupport(\n        pi: *mut ::core::ffi::c_int,\n        type_: cuda_types::cuda::CUexecAffinityType,\n        dev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Blocks until remote writes are visible to the specified scope\n\n Blocks until GPUDirect RDMA writes to the target context via mappings\n created through APIs like nvidia_p2p_get_pages (see\n https://docs.nvidia.com/cuda/gpudirect-rdma for more information), are\n visible to the specified scope.\n\n If the scope equals or lies within the scope indicated by\n ::CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_WRITES_ORDERING, the call\n will be a no-op and can be safely omitted for performance. This can be\n determined by comparing the numerical values between the two enums, with\n smaller scopes having smaller values.\n\n On platforms that support GPUDirect RDMA writes via more than one path in\n hardware (see ::CU_MEM_RANGE_FLAG_DMA_BUF_MAPPING_TYPE_PCIE), the user should\n consider those paths as belonging to separate ordering domains. Note that in\n such cases CUDA driver will report both RDMA writes ordering and RDMA write\n scope as ALL_DEVICES and a call to cuFlushGPUDirectRDMA will be a no-op,\n but when these multiple paths are used simultaneously, it is the user's\n responsibility to ensure ordering by using mechanisms outside the scope of\n CUDA.\n\n Users may query support for this API via\n ::CU_DEVICE_ATTRIBUTE_FLUSH_FLUSH_GPU_DIRECT_RDMA_OPTIONS.\n\n \\param target - The target of the operation, see ::CUflushGPUDirectRDMAWritesTarget\n \\param scope  - The scope of the operation, see ::CUflushGPUDirectRDMAWritesScope\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n \\notefnerr\n*/\n    fn cuFlushGPUDirectRDMAWrites(\n        target: cuda_types::cuda::CUflushGPUDirectRDMAWritesTarget,\n        scope: cuda_types::cuda::CUflushGPUDirectRDMAWritesScope,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns properties for a selected device\n\n \\deprecated\n\n This function was deprecated as of CUDA 5.0 and replaced by ::cuDeviceGetAttribute().\n\n Returns in \\p *prop the properties of device \\p dev. The ::CUdevprop\n structure is defined as:\n\n \\code\ntypedef struct CUdevprop_st {\nint maxThreadsPerBlock;\nint maxThreadsDim[3];\nint maxGridSize[3];\nint sharedMemPerBlock;\nint totalConstantMemory;\nint SIMDWidth;\nint memPitch;\nint regsPerBlock;\nint clockRate;\nint textureAlign\n} CUdevprop;\n \\endcode\n where:\n\n - ::maxThreadsPerBlock is the maximum number of threads per block;\n - ::maxThreadsDim[3] is the maximum sizes of each dimension of a block;\n - ::maxGridSize[3] is the maximum sizes of each dimension of a grid;\n - ::sharedMemPerBlock is the total amount of shared memory available per\n   block in bytes;\n - ::totalConstantMemory is the total amount of constant memory available on\n   the device in bytes;\n - ::SIMDWidth is the warp size;\n - ::memPitch is the maximum pitch allowed by the memory copy functions that\n   involve memory regions allocated through ::cuMemAllocPitch();\n - ::regsPerBlock is the total number of registers available per block;\n - ::clockRate is the clock frequency in kilohertz;\n - ::textureAlign is the alignment requirement; texture base addresses that\n   are aligned to ::textureAlign bytes do not need an offset applied to\n   texture fetches.\n\n \\param prop - Returned properties of device\n \\param dev  - Device to get properties for\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE\n \\notefnerr\n\n \\sa\n ::cuDeviceGetAttribute,\n ::cuDeviceGetCount,\n ::cuDeviceGetName,\n ::cuDeviceGetUuid,\n ::cuDeviceGet,\n ::cuDeviceTotalMem*/\n    fn cuDeviceGetProperties(\n        prop: *mut cuda_types::cuda::CUdevprop,\n        dev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the compute capability of the device\n\n \\deprecated\n\n This function was deprecated as of CUDA 5.0 and its functionality superseded\n by ::cuDeviceGetAttribute().\n\n Returns in \\p *major and \\p *minor the major and minor revision numbers that\n define the compute capability of the device \\p dev.\n\n \\param major - Major revision number\n \\param minor - Minor revision number\n \\param dev   - Device handle\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE\n \\notefnerr\n\n \\sa\n ::cuDeviceGetAttribute,\n ::cuDeviceGetCount,\n ::cuDeviceGetName,\n ::cuDeviceGetUuid,\n ::cuDeviceGet,\n ::cuDeviceTotalMem*/\n    fn cuDeviceComputeCapability(\n        major: *mut ::core::ffi::c_int,\n        minor: *mut ::core::ffi::c_int,\n        dev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Retain the primary context on the GPU\n\n Retains the primary context on the device.\n Once the user successfully retains the primary context, the primary context\n will be active and available to the user until the user releases it\n with ::cuDevicePrimaryCtxRelease() or resets it with ::cuDevicePrimaryCtxReset().\n Unlike ::cuCtxCreate() the newly retained context is not pushed onto the stack.\n\n Retaining the primary context for the first time will fail with ::CUDA_ERROR_UNKNOWN\n if the compute mode of the device is ::CU_COMPUTEMODE_PROHIBITED. The function\n ::cuDeviceGetAttribute() can be used with ::CU_DEVICE_ATTRIBUTE_COMPUTE_MODE to\n determine the compute mode  of the device.\n The <i>nvidia-smi</i> tool can be used to set the compute mode for\n devices. Documentation for <i>nvidia-smi</i> can be obtained by passing a\n -h option to it.\n\n Please note that the primary context always supports pinned allocations. Other\n flags can be specified by ::cuDevicePrimaryCtxSetFlags().\n\n \\param pctx  - Returned context handle of the new context\n \\param dev   - Device for which primary context is requested\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_DEVICE,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_OUT_OF_MEMORY,\n ::CUDA_ERROR_UNKNOWN\n \\notefnerr\n\n \\sa ::cuDevicePrimaryCtxRelease,\n ::cuDevicePrimaryCtxSetFlags,\n ::cuCtxCreate,\n ::cuCtxGetApiVersion,\n ::cuCtxGetCacheConfig,\n ::cuCtxGetDevice,\n ::cuCtxGetFlags,\n ::cuCtxGetLimit,\n ::cuCtxPopCurrent,\n ::cuCtxPushCurrent,\n ::cuCtxSetCacheConfig,\n ::cuCtxSetLimit,\n ::cuCtxSynchronize*/\n    fn cuDevicePrimaryCtxRetain(\n        pctx: *mut cuda_types::cuda::CUcontext,\n        dev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Release the primary context on the GPU\n\n Releases the primary context interop on the device.\n A retained context should always be released once the user is done using\n it. The context is automatically reset once the last reference to it is\n released. This behavior is different when the primary context was retained\n by the CUDA runtime from CUDA 4.0 and earlier. In this case, the primary\n context remains always active.\n\n Releasing a primary context that has not been previously retained will\n fail with ::CUDA_ERROR_INVALID_CONTEXT.\n\n Please note that unlike ::cuCtxDestroy() this method does not pop the context\n from stack in any circumstances.\n\n \\param dev - Device which primary context is released\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_DEVICE,\n ::CUDA_ERROR_INVALID_CONTEXT\n \\notefnerr\n\n \\sa ::cuDevicePrimaryCtxRetain,\n ::cuCtxDestroy,\n ::cuCtxGetApiVersion,\n ::cuCtxGetCacheConfig,\n ::cuCtxGetDevice,\n ::cuCtxGetFlags,\n ::cuCtxGetLimit,\n ::cuCtxPopCurrent,\n ::cuCtxPushCurrent,\n ::cuCtxSetCacheConfig,\n ::cuCtxSetLimit,\n ::cuCtxSynchronize*/\n    fn cuDevicePrimaryCtxRelease_v2(\n        dev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Set flags for the primary context\n\n Sets the flags for the primary context on the device overwriting perviously\n set ones.\n\n The three LSBs of the \\p flags parameter can be used to control how the OS\n thread, which owns the CUDA context at the time of an API call, interacts\n with the OS scheduler when waiting for results from the GPU. Only one of\n the scheduling flags can be set when creating a context.\n\n - ::CU_CTX_SCHED_SPIN: Instruct CUDA to actively spin when waiting for\n results from the GPU. This can decrease latency when waiting for the GPU,\n but may lower the performance of CPU threads if they are performing work in\n parallel with the CUDA thread.\n\n - ::CU_CTX_SCHED_YIELD: Instruct CUDA to yield its thread when waiting for\n results from the GPU. This can increase latency when waiting for the GPU,\n but can increase the performance of CPU threads performing work in parallel\n with the GPU.\n\n - ::CU_CTX_SCHED_BLOCKING_SYNC: Instruct CUDA to block the CPU thread on a\n synchronization primitive when waiting for the GPU to finish work.\n\n - ::CU_CTX_BLOCKING_SYNC: Instruct CUDA to block the CPU thread on a\n synchronization primitive when waiting for the GPU to finish work. <br>\n <b>Deprecated:</b> This flag was deprecated as of CUDA 4.0 and was\n replaced with ::CU_CTX_SCHED_BLOCKING_SYNC.\n\n - ::CU_CTX_SCHED_AUTO: The default value if the \\p flags parameter is zero,\n uses a heuristic based on the number of active CUDA contexts in the\n process \\e C and the number of logical processors in the system \\e P. If\n \\e C > \\e P, then CUDA will yield to other OS threads when waiting for\n the GPU (::CU_CTX_SCHED_YIELD), otherwise CUDA will not yield while\n waiting for results and actively spin on the processor (::CU_CTX_SCHED_SPIN).\n Additionally, on Tegra devices, ::CU_CTX_SCHED_AUTO uses a heuristic based on\n the power profile of the platform and may choose ::CU_CTX_SCHED_BLOCKING_SYNC\n for low-powered devices.\n\n - ::CU_CTX_LMEM_RESIZE_TO_MAX: Instruct CUDA to not reduce local memory\n after resizing local memory for a kernel. This can prevent thrashing by\n local memory allocations when launching many kernels with high local\n memory usage at the cost of potentially increased memory usage. <br>\n <b>Deprecated:</b> This flag is deprecated and the behavior enabled\n by this flag is now the default and cannot be disabled.\n\n - ::CU_CTX_COREDUMP_ENABLE: If GPU coredumps have not been enabled globally\n with ::cuCoredumpSetAttributeGlobal or environment variables, this flag can\n be set during context creation to instruct CUDA to create a coredump if\n this context raises an exception during execution. These environment variables\n are described in the CUDA-GDB user guide under the \"GPU core dump support\"\n section.\n The initial settings will be taken from the global settings at the time of\n context creation. The other settings that control coredump output can be\n modified by calling ::cuCoredumpSetAttribute from the created context after\n it becomes current.\n\n - ::CU_CTX_USER_COREDUMP_ENABLE: If user-triggered GPU coredumps have not\n been enabled globally with ::cuCoredumpSetAttributeGlobal or environment\n variables, this flag can be set during context creation to instruct CUDA to\n create a coredump if data is written to a certain pipe that is present in the\n OS space. These environment variables are described in the CUDA-GDB user\n guide under the \"GPU core dump support\" section.\n It is important to note that the pipe name *must* be set with\n ::cuCoredumpSetAttributeGlobal before creating the context if this flag is\n used. Setting this flag implies that ::CU_CTX_COREDUMP_ENABLE is set.\n The initial settings will be taken from the global settings at the time of\n context creation. The other settings that control coredump output can be\n modified by calling ::cuCoredumpSetAttribute from the created context after\n it becomes current.\n\n - ::CU_CTX_SYNC_MEMOPS: Ensures that synchronous memory operations initiated\n on this context will always synchronize. See further documentation in the\n section titled \"API Synchronization behavior\" to learn more about cases when\n synchronous memory operations can exhibit asynchronous behavior.\n\n \\param dev   - Device for which the primary context flags are set\n \\param flags - New flags for the device\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_DEVICE,\n ::CUDA_ERROR_INVALID_VALUE,\n \\notefnerr\n\n \\sa ::cuDevicePrimaryCtxRetain,\n ::cuDevicePrimaryCtxGetState,\n ::cuCtxCreate,\n ::cuCtxGetFlags,\n ::cuCtxSetFlags,\n ::cudaSetDeviceFlags*/\n    fn cuDevicePrimaryCtxSetFlags_v2(\n        dev: cuda_types::cuda::CUdevice,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Get the state of the primary context\n\n Returns in \\p *flags the flags for the primary context of \\p dev, and in\n \\p *active whether it is active.  See ::cuDevicePrimaryCtxSetFlags for flag\n values.\n\n \\param dev    - Device to get primary context flags for\n \\param flags  - Pointer to store flags\n \\param active - Pointer to store context state; 0 = inactive, 1 = active\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_DEVICE,\n ::CUDA_ERROR_INVALID_VALUE,\n \\notefnerr\n\n \\sa\n ::cuDevicePrimaryCtxSetFlags,\n ::cuCtxGetFlags,\n ::cuCtxSetFlags,\n ::cudaGetDeviceFlags*/\n    fn cuDevicePrimaryCtxGetState(\n        dev: cuda_types::cuda::CUdevice,\n        flags: *mut ::core::ffi::c_uint,\n        active: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Destroy all allocations and reset all state on the primary context\n\n Explicitly destroys and cleans up all resources associated with the current\n device in the current process.\n\n Note that it is responsibility of the calling function to ensure that no\n other module in the process is using the device any more. For that reason\n it is recommended to use ::cuDevicePrimaryCtxRelease() in most cases.\n However it is safe for other modules to call ::cuDevicePrimaryCtxRelease()\n even after resetting the device.\n Resetting the primary context does not release it, an application that has\n retained the primary context should explicitly release its usage.\n\n \\param dev - Device for which primary context is destroyed\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_DEVICE,\n ::CUDA_ERROR_PRIMARY_CONTEXT_ACTIVE\n \\notefnerr\n\n \\sa ::cuDevicePrimaryCtxRetain,\n ::cuDevicePrimaryCtxRelease,\n ::cuCtxGetApiVersion,\n ::cuCtxGetCacheConfig,\n ::cuCtxGetDevice,\n ::cuCtxGetFlags,\n ::cuCtxGetLimit,\n ::cuCtxPopCurrent,\n ::cuCtxPushCurrent,\n ::cuCtxSetCacheConfig,\n ::cuCtxSetLimit,\n ::cuCtxSynchronize,\n ::cudaDeviceReset*/\n    fn cuDevicePrimaryCtxReset_v2(\n        dev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Create a CUDA context\n\n Creates a new CUDA context and associates it with the calling thread. The\n \\p flags parameter is described below. The context is created with a usage\n count of 1 and the caller of ::cuCtxCreate() must call ::cuCtxDestroy()\n when done using the context. If a context is already current to the thread,\n it is supplanted by the newly created context and may be restored by a subsequent\n call to ::cuCtxPopCurrent().\n\n CUDA context can be created with execution affinity. The type and the amount of\nexecution resource the context can use is limited by \\p paramsArray and \\p numExecAffinityParams\nin \\p execAffinity. The \\p paramsArray is an array of \\p CUexecAffinityParam and the \\p numExecAffinityParams\n describes the size of the paramsArray. If two \\p CUexecAffinityParam in the array have the same type,\n the latter execution affinity parameter overrides the former execution affinity parameter.\n The supported execution affinity types are:\n - ::CU_EXEC_AFFINITY_TYPE_SM_COUNT limits the portion of SMs that the context can use. The portion\n   of SMs is specified as the number of SMs via \\p CUexecAffinitySmCount. This limit will be internally\n   rounded up to the next hardware-supported amount. Hence, it is imperative to query the actual execution\n   affinity of the context via \\p cuCtxGetExecAffinity after context creation. Currently, this attribute\n   is only supported under Volta+ MPS.\n\n CUDA context can be created in CIG(CUDA in Graphics) mode by setting \\p cigParams.\n Data from graphics client is shared with CUDA via the \\p sharedData in \\p cigParams.\n Support for D3D12 graphics client can be determined using ::cuDeviceGetAttribute() with\n ::CU_DEVICE_ATTRIBUTE_D3D12_CIG_SUPPORTED. \\p sharedData is a ID3D12CommandQueue handle.\n Support for Vulkan graphics client can be determined using ::cuDeviceGetAttribute() with\n ::CU_DEVICE_ATTRIBUTE_VULKAN_CIG_SUPPORTED. \\p sharedData is a Nvidia specific data blob\n populated by calling vkGetExternalComputeQueueDataNV().\n Either \\p execAffinityParams or \\p cigParams can be set to a non-null value. Setting both to a\n non-null value will result in an undefined behavior.\n\n The three LSBs of the \\p flags parameter can be used to control how the OS\n thread, which owns the CUDA context at the time of an API call, interacts\n with the OS scheduler when waiting for results from the GPU. Only one of\n the scheduling flags can be set when creating a context.\n\n - ::CU_CTX_SCHED_SPIN: Instruct CUDA to actively spin when waiting for\n results from the GPU. This can decrease latency when waiting for the GPU,\n but may lower the performance of CPU threads if they are performing work in\n parallel with the CUDA thread.\n\n - ::CU_CTX_SCHED_YIELD: Instruct CUDA to yield its thread when waiting for\n results from the GPU. This can increase latency when waiting for the GPU,\n but can increase the performance of CPU threads performing work in parallel\n with the GPU.\n\n - ::CU_CTX_SCHED_BLOCKING_SYNC: Instruct CUDA to block the CPU thread on a\n synchronization primitive when waiting for the GPU to finish work.\n\n - ::CU_CTX_BLOCKING_SYNC: Instruct CUDA to block the CPU thread on a\n synchronization primitive when waiting for the GPU to finish work. <br>\n <b>Deprecated:</b> This flag was deprecated as of CUDA 4.0 and was\n replaced with ::CU_CTX_SCHED_BLOCKING_SYNC.\n\n - ::CU_CTX_SCHED_AUTO: The default value if the \\p flags parameter is zero,\n uses a heuristic based on the number of active CUDA contexts in the\n process \\e C and the number of logical processors in the system \\e P. If\n \\e C > \\e P, then CUDA will yield to other OS threads when waiting for\n the GPU (::CU_CTX_SCHED_YIELD), otherwise CUDA will not yield while\n waiting for results and actively spin on the processor (::CU_CTX_SCHED_SPIN).\n Additionally, on Tegra devices, ::CU_CTX_SCHED_AUTO uses a heuristic based on\n the power profile of the platform and may choose ::CU_CTX_SCHED_BLOCKING_SYNC\n for low-powered devices.\n\n - ::CU_CTX_MAP_HOST: Instruct CUDA to support mapped pinned allocations.\n This flag must be set in order to allocate pinned host memory that is\n accessible to the GPU.\n\n - ::CU_CTX_LMEM_RESIZE_TO_MAX: Instruct CUDA to not reduce local memory\n after resizing local memory for a kernel. This can prevent thrashing by\n local memory allocations when launching many kernels with high local\n memory usage at the cost of potentially increased memory usage. <br>\n <b>Deprecated:</b> This flag is deprecated and the behavior enabled\n by this flag is now the default and cannot be disabled.\n Instead, the per-thread stack size can be controlled with ::cuCtxSetLimit().\n\n - ::CU_CTX_COREDUMP_ENABLE: If GPU coredumps have not been enabled globally\n with ::cuCoredumpSetAttributeGlobal or environment variables, this flag can\n be set during context creation to instruct CUDA to create a coredump if\n this context raises an exception during execution. These environment variables\n are described in the CUDA-GDB user guide under the \"GPU core dump support\"\n section.\n The initial attributes will be taken from the global attributes at the time of\n context creation. The other attributes that control coredump output can be\n modified by calling ::cuCoredumpSetAttribute from the created context after\n it becomes current. This flag is not supported when CUDA context is created in\n CIG(CUDA in Graphics) mode.\n\n - ::CU_CTX_USER_COREDUMP_ENABLE: If user-triggered GPU coredumps have not\n been enabled globally with ::cuCoredumpSetAttributeGlobal or environment\n variables, this flag can be set during context creation to instruct CUDA to\n create a coredump if data is written to a certain pipe that is present in the\n OS space. These environment variables are described in the CUDA-GDB user\n guide under the \"GPU core dump support\" section.\n It is important to note that the pipe name *must* be set with\n ::cuCoredumpSetAttributeGlobal before creating the context if this flag is\n used. Setting this flag implies that ::CU_CTX_COREDUMP_ENABLE is set.\n The initial attributes will be taken from the global attributes at the time of\n context creation. The other attributes that control coredump output can be\n modified by calling ::cuCoredumpSetAttribute from the created context after\n it becomes current.\n Setting this flag on any context creation is equivalent to setting the\n ::CU_COREDUMP_ENABLE_USER_TRIGGER attribute to \\p true globally.\n This flag is not supported when CUDA context is created in\n CIG(CUDA in Graphics) mode.\n\n - ::CU_CTX_SYNC_MEMOPS: Ensures that synchronous memory operations initiated\n on this context will always synchronize. See further documentation in the\n section titled \"API Synchronization behavior\" to learn more about cases when\n synchronous memory operations can exhibit asynchronous behavior.\n\n Context creation will fail with ::CUDA_ERROR_UNKNOWN if the compute mode of\n the device is ::CU_COMPUTEMODE_PROHIBITED. The function ::cuDeviceGetAttribute()\n can be used with ::CU_DEVICE_ATTRIBUTE_COMPUTE_MODE to determine the\n compute mode of the device. The <i>nvidia-smi</i> tool can be used to set\n the compute mode for * devices.\n Documentation for <i>nvidia-smi</i> can be obtained by passing a\n -h option to it.\n\n Context creation will fail with :: CUDA_ERROR_INVALID_VALUE if invalid parameter was\n passed by client to create the CUDA context.\n\n Context creation in CIG mode will fail with ::CUDA_ERROR_NOT_SUPPORTED if CIG is not supported\n by the device or the driver.\n \\param pctx              - Returned context handle of the new context\n \\param ctxCreateParams   - Context creation parameters\n \\param flags             - Context creation flags\n \\param dev               - Device to create context on\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_DEVICE,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_SUPPORTED,\n ::CUDA_ERROR_OUT_OF_MEMORY,\n ::CUDA_ERROR_UNKNOWN\n \\notefnerr\n\n \\sa ::cuCtxDestroy,\n ::cuCtxGetApiVersion,\n ::cuCtxGetCacheConfig,\n ::cuCtxGetDevice,\n ::cuCtxGetFlags,\n ::cuCtxGetLimit,\n ::cuCtxPopCurrent,\n ::cuCtxPushCurrent,\n ::cuCtxSetCacheConfig,\n ::cuCtxSetLimit,\n ::cuCoredumpSetAttributeGlobal,\n ::cuCoredumpSetAttribute,\n ::cuCtxSynchronize*/\n    fn cuCtxCreate_v4(\n        pctx: *mut cuda_types::cuda::CUcontext,\n        ctxCreateParams: *mut cuda_types::cuda::CUctxCreateParams,\n        flags: ::core::ffi::c_uint,\n        dev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Destroy a CUDA context\n\n Destroys the CUDA context specified by \\p ctx.  The context \\p ctx will be\n destroyed regardless of how many threads it is current to.\n It is the responsibility of the calling function to ensure that no API\n call issues using \\p ctx while ::cuCtxDestroy() is executing.\n\n Destroys and cleans up all resources associated with the context.\n It is the caller's responsibility to ensure that the context or its resources\n are not accessed or passed in subsequent API calls and doing so will result in undefined behavior.\n These resources include CUDA types ::CUmodule, ::CUfunction, ::CUstream, ::CUevent,\n ::CUarray, ::CUmipmappedArray, ::CUtexObject, ::CUsurfObject, ::CUtexref, ::CUsurfref,\n ::CUgraphicsResource, ::CUlinkState, ::CUexternalMemory and ::CUexternalSemaphore.\n These resources also include memory allocations by ::cuMemAlloc(), ::cuMemAllocHost(),\n ::cuMemAllocManaged() and ::cuMemAllocPitch().\n\n If \\p ctx is current to the calling thread then \\p ctx will also be\n popped from the current thread's context stack (as though ::cuCtxPopCurrent()\n were called).  If \\p ctx is current to other threads, then \\p ctx will\n remain current to those threads, and attempting to access \\p ctx from\n those threads will result in the error ::CUDA_ERROR_CONTEXT_IS_DESTROYED.\n\n \\note ::cuCtxDestroy() will not destroy memory allocations by ::cuMemCreate(), ::cuMemAllocAsync() and\n ::cuMemAllocFromPoolAsync(). These memory allocations are not associated with any CUDA context and need to\n be destroyed explicitly.\n\n \\param ctx - Context to destroy\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa ::cuCtxCreate,\n ::cuCtxGetApiVersion,\n ::cuCtxGetCacheConfig,\n ::cuCtxGetDevice,\n ::cuCtxGetFlags,\n ::cuCtxGetLimit,\n ::cuCtxPopCurrent,\n ::cuCtxPushCurrent,\n ::cuCtxSetCacheConfig,\n ::cuCtxSetLimit,\n ::cuCtxSynchronize*/\n    fn cuCtxDestroy_v2(ctx: cuda_types::cuda::CUcontext) -> cuda_types::cuda::CUresult;\n    /** \\brief Pushes a context on the current CPU thread\n\n Pushes the given context \\p ctx onto the CPU thread's stack of current\n contexts. The specified context becomes the CPU thread's current context, so\n all CUDA functions that operate on the current context are affected.\n\n The previous current context may be made current again by calling\n ::cuCtxDestroy() or ::cuCtxPopCurrent().\n\n \\param ctx - Context to push\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa ::cuCtxCreate,\n ::cuCtxDestroy,\n ::cuCtxGetApiVersion,\n ::cuCtxGetCacheConfig,\n ::cuCtxGetDevice,\n ::cuCtxGetFlags,\n ::cuCtxGetLimit,\n ::cuCtxPopCurrent,\n ::cuCtxSetCacheConfig,\n ::cuCtxSetLimit,\n ::cuCtxSynchronize*/\n    fn cuCtxPushCurrent_v2(\n        ctx: cuda_types::cuda::CUcontext,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Pops the current CUDA context from the current CPU thread.\n\n Pops the current CUDA context from the CPU thread and passes back the\n old context handle in \\p *pctx. That context may then be made current\n to a different CPU thread by calling ::cuCtxPushCurrent().\n\n If a context was current to the CPU thread before ::cuCtxCreate() or\n ::cuCtxPushCurrent() was called, this function makes that context current to\n the CPU thread again.\n\n \\param pctx - Returned popped context handle\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT\n \\notefnerr\n\n \\sa ::cuCtxCreate,\n ::cuCtxDestroy,\n ::cuCtxGetApiVersion,\n ::cuCtxGetCacheConfig,\n ::cuCtxGetDevice,\n ::cuCtxGetFlags,\n ::cuCtxGetLimit,\n ::cuCtxPushCurrent,\n ::cuCtxSetCacheConfig,\n ::cuCtxSetLimit,\n ::cuCtxSynchronize*/\n    fn cuCtxPopCurrent_v2(\n        pctx: *mut cuda_types::cuda::CUcontext,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Binds the specified CUDA context to the calling CPU thread\n\n Binds the specified CUDA context to the calling CPU thread.\n If \\p ctx is NULL then the CUDA context previously bound to the\n calling CPU thread is unbound and ::CUDA_SUCCESS is returned.\n\n If there exists a CUDA context stack on the calling CPU thread, this\n will replace the top of that stack with \\p ctx.\n If \\p ctx is NULL then this will be equivalent to popping the top\n of the calling CPU thread's CUDA context stack (or a no-op if the\n calling CPU thread's CUDA context stack is empty).\n\n \\param ctx - Context to bind to the calling CPU thread\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT\n \\notefnerr\n\n \\sa\n ::cuCtxGetCurrent,\n ::cuCtxCreate,\n ::cuCtxDestroy,\n ::cudaSetDevice*/\n    fn cuCtxSetCurrent(ctx: cuda_types::cuda::CUcontext) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the CUDA context bound to the calling CPU thread.\n\n Returns in \\p *pctx the CUDA context bound to the calling CPU thread.\n If no context is bound to the calling CPU thread then \\p *pctx is\n set to NULL and ::CUDA_SUCCESS is returned.\n\n \\param pctx - Returned context handle\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n \\notefnerr\n\n \\sa\n ::cuCtxSetCurrent,\n ::cuCtxCreate,\n ::cuCtxDestroy,\n ::cudaGetDevice*/\n    fn cuCtxGetCurrent(\n        pctx: *mut cuda_types::cuda::CUcontext,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the device handle for the current context\n\n Returns in \\p *device the handle of the current context's device.\n\n \\param device - Returned device handle for the current context\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n \\notefnerr\n\n \\sa ::cuCtxCreate,\n ::cuCtxDestroy,\n ::cuCtxGetApiVersion,\n ::cuCtxGetCacheConfig,\n ::cuCtxGetFlags,\n ::cuCtxGetLimit,\n ::cuCtxPopCurrent,\n ::cuCtxPushCurrent,\n ::cuCtxSetCacheConfig,\n ::cuCtxSetLimit,\n ::cuCtxSynchronize,\n ::cudaGetDevice*/\n    fn cuCtxGetDevice(\n        device: *mut cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the device handle for the specified context\n\n Returns in \\p *device the handle of the specified context's device. If the specified context is NULL, the API will\n return the current context's device.\n\n \\param device - Returned device handle for the specified context\n \\param ctx - Context for which to obtain the device\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa ::cuCtxGetCurrent,\n ::cuCtxPopCurrent,\n ::cuCtxPushCurrent*/\n    fn cuCtxGetDevice_v2(\n        device: *mut cuda_types::cuda::CUdevice,\n        ctx: cuda_types::cuda::CUcontext,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the flags for the current context\n\n Returns in \\p *flags the flags of the current context. See ::cuCtxCreate\n for flag values.\n\n \\param flags - Pointer to store flags of current context\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n \\notefnerr\n\n \\sa ::cuCtxCreate,\n ::cuCtxGetApiVersion,\n ::cuCtxGetCacheConfig,\n ::cuCtxGetCurrent,\n ::cuCtxGetDevice,\n ::cuCtxGetLimit,\n ::cuCtxGetSharedMemConfig,\n ::cuCtxGetStreamPriorityRange,\n ::cuCtxSetFlags,\n ::cudaGetDeviceFlags*/\n    fn cuCtxGetFlags(flags: *mut ::core::ffi::c_uint) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the flags for the current context\n\n Sets the flags for the current context overwriting previously set ones. See\n ::cuDevicePrimaryCtxSetFlags for flag values.\n\n \\param flags - Flags to set on the current context\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n \\notefnerr\n\n \\sa ::cuCtxCreate,\n ::cuCtxGetApiVersion,\n ::cuCtxGetCacheConfig,\n ::cuCtxGetCurrent,\n ::cuCtxGetDevice,\n ::cuCtxGetLimit,\n ::cuCtxGetSharedMemConfig,\n ::cuCtxGetStreamPriorityRange,\n ::cuCtxGetFlags,\n ::cudaGetDeviceFlags,\n ::cuDevicePrimaryCtxSetFlags,*/\n    fn cuCtxSetFlags(flags: ::core::ffi::c_uint) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the unique Id associated with the context supplied\n\n Returns in \\p ctxId the unique Id which is associated with a given context.\n The Id is unique for the life of the program for this instance of CUDA.\n If context is supplied as NULL and there is one current, the Id of the\n current context is returned.\n\n \\param ctx - Context for which to obtain the Id\n \\param ctxId - Pointer to store the Id of the context\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_CONTEXT_IS_DESTROYED,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa ::cuCtxCreate,\n ::cuCtxDestroy,\n ::cuCtxGetApiVersion,\n ::cuCtxGetCacheConfig,\n ::cuCtxGetDevice,\n ::cuCtxGetFlags,\n ::cuCtxGetLimit,\n ::cuCtxPushCurrent*/\n    fn cuCtxGetId(\n        ctx: cuda_types::cuda::CUcontext,\n        ctxId: *mut ::core::ffi::c_ulonglong,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Block for the current context's tasks to complete\n\n Blocks until the current context has completed all preceding requested tasks.\n If the current context is the primary context, green contexts that have been\n created will also be synchronized.\n ::cuCtxSynchronize() returns an error if one of the preceding tasks failed.\n If the context was created with the ::CU_CTX_SCHED_BLOCKING_SYNC flag, the\n CPU thread will block until the GPU context has finished its work.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT\n \\notefnerr\n\n \\sa ::cuCtxCreate,\n ::cuCtxDestroy,\n ::cuCtxGetApiVersion,\n ::cuCtxGetCacheConfig,\n ::cuCtxGetDevice,\n ::cuCtxGetFlags,\n ::cuCtxGetLimit,\n ::cuCtxPopCurrent,\n ::cuCtxPushCurrent,\n ::cuCtxSetCacheConfig,\n ::cuCtxSetLimit,\n ::cudaDeviceSynchronize*/\n    fn cuCtxSynchronize() -> cuda_types::cuda::CUresult;\n    /** \\brief Block for the specified context's tasks to complete\n\n Blocks until the specified context has completed all preceding requested tasks.\n If the specified context is the primary context, green contexts that have been\n created will also be synchronized.\n The API returns an error if one of the preceding tasks failed.\n\n If the context was created with the ::CU_CTX_SCHED_BLOCKING_SYNC flag, the\n CPU thread will block until the GPU context has finished its work.\n\n If the specified context is NULL, the API will operate on the current context.\n\n \\param ctx - Context to synchronize\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa ::cuCtxGetCurrent,\n ::cuCtxPopCurrent,\n ::cuCtxPushCurrent,\n ::cuGreenCtxCreate,\n ::cuCtxFromGreenCtx,\n ::cudaDeviceSynchronize*/\n    fn cuCtxSynchronize_v2(\n        ctx: cuda_types::cuda::CUcontext,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Set resource limits\n\n Setting \\p limit to \\p value is a request by the application to update\n the current limit maintained by the context. The driver is free to\n modify the requested value to meet h/w requirements (this could be\n clamping to minimum or maximum values, rounding up to nearest element\n size, etc). The application can use ::cuCtxGetLimit() to find out exactly\n what the limit has been set to.\n\n Setting each ::CUlimit has its own specific restrictions, so each is\n discussed here.\n\n - ::CU_LIMIT_STACK_SIZE controls the stack size in bytes of each GPU thread.\n   The driver automatically increases the per-thread stack size\n   for each kernel launch as needed. This size isn't reset back to the\n   original value after each launch. Setting this value will take effect\n   immediately, and if necessary, the device will block until all preceding\n   requested tasks are complete.\n\n - ::CU_LIMIT_PRINTF_FIFO_SIZE controls the size in bytes of the FIFO used\n   by the ::printf() device system call. Setting ::CU_LIMIT_PRINTF_FIFO_SIZE\n   must be performed before launching any kernel that uses the ::printf()\n   device system call, otherwise ::CUDA_ERROR_INVALID_VALUE will be returned.\n\n - ::CU_LIMIT_MALLOC_HEAP_SIZE controls the size in bytes of the heap used\n   by the ::malloc() and ::free() device system calls. Setting\n   ::CU_LIMIT_MALLOC_HEAP_SIZE must be performed before launching any kernel\n   that uses the ::malloc() or ::free() device system calls, otherwise\n   ::CUDA_ERROR_INVALID_VALUE will be returned.\n\n - ::CU_LIMIT_DEV_RUNTIME_SYNC_DEPTH controls the maximum nesting depth of\n   a grid at which a thread can safely call ::cudaDeviceSynchronize(). Setting\n   this limit must be performed before any launch of a kernel that uses the\n   device runtime and calls ::cudaDeviceSynchronize() above the default sync\n   depth, two levels of grids. Calls to ::cudaDeviceSynchronize() will fail\n   with error code ::cudaErrorSyncDepthExceeded if the limitation is\n   violated. This limit can be set smaller than the default or up the maximum\n   launch depth of 24. When setting this limit, keep in mind that additional\n   levels of sync depth require the driver to reserve large amounts of device\n   memory which can no longer be used for user allocations. If these\n   reservations of device memory fail, ::cuCtxSetLimit() will return\n   ::CUDA_ERROR_OUT_OF_MEMORY, and the limit can be reset to a lower value.\n   This limit is only applicable to devices of compute capability < 9.0.\n   Attempting to set this limit on devices of other compute capability\n   versions will result in the error ::CUDA_ERROR_UNSUPPORTED_LIMIT being\n   returned.\n\n - ::CU_LIMIT_DEV_RUNTIME_PENDING_LAUNCH_COUNT controls the maximum number of\n   outstanding device runtime launches that can be made from the current\n   context. A grid is outstanding from the point of launch up until the grid\n   is known to have been completed. Device runtime launches which violate\n   this limitation fail and return ::cudaErrorLaunchPendingCountExceeded when\n   ::cudaGetLastError() is called after launch. If more pending launches than\n   the default (2048 launches) are needed for a module using the device\n   runtime, this limit can be increased. Keep in mind that being able to\n   sustain additional pending launches will require the driver to reserve\n   larger amounts of device memory upfront which can no longer be used for\n   allocations. If these reservations fail, ::cuCtxSetLimit() will return\n   ::CUDA_ERROR_OUT_OF_MEMORY, and the limit can be reset to a lower value.\n   This limit is only applicable to devices of compute capability 3.5 and\n   higher. Attempting to set this limit on devices of compute capability less\n   than 3.5 will result in the error ::CUDA_ERROR_UNSUPPORTED_LIMIT being\n   returned.\n\n - ::CU_LIMIT_MAX_L2_FETCH_GRANULARITY controls the L2 cache fetch granularity.\n   Values can range from 0B to 128B. This is purely a performance hint and\n   it can be ignored or clamped depending on the platform.\n\n - ::CU_LIMIT_PERSISTING_L2_CACHE_SIZE controls size in bytes available for\n   persisting L2 cache. This is purely a performance hint and it can be\n   ignored or clamped depending on the platform.\n\n \\param limit - Limit to set\n \\param value - Size of limit\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_UNSUPPORTED_LIMIT,\n ::CUDA_ERROR_OUT_OF_MEMORY,\n ::CUDA_ERROR_INVALID_CONTEXT\n \\notefnerr\n\n \\sa ::cuCtxCreate,\n ::cuCtxDestroy,\n ::cuCtxGetApiVersion,\n ::cuCtxGetCacheConfig,\n ::cuCtxGetDevice,\n ::cuCtxGetFlags,\n ::cuCtxGetLimit,\n ::cuCtxPopCurrent,\n ::cuCtxPushCurrent,\n ::cuCtxSetCacheConfig,\n ::cuCtxSynchronize,\n ::cudaDeviceSetLimit*/\n    fn cuCtxSetLimit(\n        limit: cuda_types::cuda::CUlimit,\n        value: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns resource limits\n\n Returns in \\p *pvalue the current size of \\p limit.  The supported\n ::CUlimit values are:\n - ::CU_LIMIT_STACK_SIZE: stack size in bytes of each GPU thread.\n - ::CU_LIMIT_PRINTF_FIFO_SIZE: size in bytes of the FIFO used by the\n   ::printf() device system call.\n - ::CU_LIMIT_MALLOC_HEAP_SIZE: size in bytes of the heap used by the\n   ::malloc() and ::free() device system calls.\n - ::CU_LIMIT_DEV_RUNTIME_SYNC_DEPTH: maximum grid depth at which a thread\n   can issue the device runtime call ::cudaDeviceSynchronize() to wait on\n   child grid launches to complete.\n - ::CU_LIMIT_DEV_RUNTIME_PENDING_LAUNCH_COUNT: maximum number of outstanding\n   device runtime launches that can be made from this context.\n - ::CU_LIMIT_MAX_L2_FETCH_GRANULARITY: L2 cache fetch granularity.\n - ::CU_LIMIT_PERSISTING_L2_CACHE_SIZE: Persisting L2 cache size in bytes\n\n \\param limit  - Limit to query\n \\param pvalue - Returned size of limit\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_UNSUPPORTED_LIMIT\n \\notefnerr\n\n \\sa ::cuCtxCreate,\n ::cuCtxDestroy,\n ::cuCtxGetApiVersion,\n ::cuCtxGetCacheConfig,\n ::cuCtxGetDevice,\n ::cuCtxGetFlags,\n ::cuCtxPopCurrent,\n ::cuCtxPushCurrent,\n ::cuCtxSetCacheConfig,\n ::cuCtxSetLimit,\n ::cuCtxSynchronize,\n ::cudaDeviceGetLimit*/\n    fn cuCtxGetLimit(\n        pvalue: *mut usize,\n        limit: cuda_types::cuda::CUlimit,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the preferred cache configuration for the current context.\n\n On devices where the L1 cache and shared memory use the same hardware\n resources, this function returns through \\p pconfig the preferred cache configuration\n for the current context. This is only a preference. The driver will use\n the requested configuration if possible, but it is free to choose a different\n configuration if required to execute functions.\n\n This will return a \\p pconfig of ::CU_FUNC_CACHE_PREFER_NONE on devices\n where the size of the L1 cache and shared memory are fixed.\n\n The supported cache configurations are:\n - ::CU_FUNC_CACHE_PREFER_NONE: no preference for shared memory or L1 (default)\n - ::CU_FUNC_CACHE_PREFER_SHARED: prefer larger shared memory and smaller L1 cache\n - ::CU_FUNC_CACHE_PREFER_L1: prefer larger L1 cache and smaller shared memory\n - ::CU_FUNC_CACHE_PREFER_EQUAL: prefer equal sized L1 cache and shared memory\n\n \\param pconfig - Returned cache configuration\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa ::cuCtxCreate,\n ::cuCtxDestroy,\n ::cuCtxGetApiVersion,\n ::cuCtxGetDevice,\n ::cuCtxGetFlags,\n ::cuCtxGetLimit,\n ::cuCtxPopCurrent,\n ::cuCtxPushCurrent,\n ::cuCtxSetCacheConfig,\n ::cuCtxSetLimit,\n ::cuCtxSynchronize,\n ::cuFuncSetCacheConfig,\n ::cudaDeviceGetCacheConfig*/\n    fn cuCtxGetCacheConfig(\n        pconfig: *mut cuda_types::cuda::CUfunc_cache,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the preferred cache configuration for the current context.\n\n On devices where the L1 cache and shared memory use the same hardware\n resources, this sets through \\p config the preferred cache configuration for\n the current context. This is only a preference. The driver will use\n the requested configuration if possible, but it is free to choose a different\n configuration if required to execute the function. Any function preference\n set via ::cuFuncSetCacheConfig() or ::cuKernelSetCacheConfig() will be preferred over this context-wide\n setting. Setting the context-wide cache configuration to\n ::CU_FUNC_CACHE_PREFER_NONE will cause subsequent kernel launches to prefer\n to not change the cache configuration unless required to launch the kernel.\n\n This setting does nothing on devices where the size of the L1 cache and\n shared memory are fixed.\n\n Launching a kernel with a different preference than the most recent\n preference setting may insert a device-side synchronization point.\n\n The supported cache configurations are:\n - ::CU_FUNC_CACHE_PREFER_NONE: no preference for shared memory or L1 (default)\n - ::CU_FUNC_CACHE_PREFER_SHARED: prefer larger shared memory and smaller L1 cache\n - ::CU_FUNC_CACHE_PREFER_L1: prefer larger L1 cache and smaller shared memory\n - ::CU_FUNC_CACHE_PREFER_EQUAL: prefer equal sized L1 cache and shared memory\n\n \\param config - Requested cache configuration\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa ::cuCtxCreate,\n ::cuCtxDestroy,\n ::cuCtxGetApiVersion,\n ::cuCtxGetCacheConfig,\n ::cuCtxGetDevice,\n ::cuCtxGetFlags,\n ::cuCtxGetLimit,\n ::cuCtxPopCurrent,\n ::cuCtxPushCurrent,\n ::cuCtxSetLimit,\n ::cuCtxSynchronize,\n ::cuFuncSetCacheConfig,\n ::cudaDeviceSetCacheConfig,\n ::cuKernelSetCacheConfig*/\n    fn cuCtxSetCacheConfig(\n        config: cuda_types::cuda::CUfunc_cache,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Gets the context's API version.\n\n Returns a version number in \\p version corresponding to the capabilities of\n the context (e.g. 3010 or 3020), which library developers can use to direct\n callers to a specific API version. If \\p ctx is NULL, returns the API version\n used to create the currently bound context.\n\n Note that new API versions are only introduced when context capabilities are\n changed that break binary compatibility, so the API version and driver version\n may be different. For example, it is valid for the API version to be 3020 while\n the driver version is 4020.\n\n \\param ctx     - Context to check\n \\param version - Pointer to version\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_UNKNOWN\n \\notefnerr\n\n \\sa ::cuCtxCreate,\n ::cuCtxDestroy,\n ::cuCtxGetDevice,\n ::cuCtxGetFlags,\n ::cuCtxGetLimit,\n ::cuCtxPopCurrent,\n ::cuCtxPushCurrent,\n ::cuCtxSetCacheConfig,\n ::cuCtxSetLimit,\n ::cuCtxSynchronize*/\n    fn cuCtxGetApiVersion(\n        ctx: cuda_types::cuda::CUcontext,\n        version: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns numerical values that correspond to the least and\n greatest stream priorities.\n\n Returns in \\p *leastPriority and \\p *greatestPriority the numerical values that correspond\n to the least and greatest stream priorities respectively. Stream priorities\n follow a convention where lower numbers imply greater priorities. The range of\n meaningful stream priorities is given by [\\p *greatestPriority, \\p *leastPriority].\n If the user attempts to create a stream with a priority value that is\n outside the meaningful range as specified by this API, the priority is\n automatically clamped down or up to either \\p *leastPriority or \\p *greatestPriority\n respectively. See ::cuStreamCreateWithPriority for details on creating a\n priority stream.\n A NULL may be passed in for \\p *leastPriority or \\p *greatestPriority if the value\n is not desired.\n\n This function will return '0' in both \\p *leastPriority and \\p *greatestPriority if\n the current context's device does not support stream priorities\n (see ::cuDeviceGetAttribute).\n\n \\param leastPriority    - Pointer to an int in which the numerical value for least\n                           stream priority is returned\n \\param greatestPriority - Pointer to an int in which the numerical value for greatest\n                           stream priority is returned\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n \\notefnerr\n\n \\sa ::cuStreamCreateWithPriority,\n ::cuStreamGetPriority,\n ::cuCtxGetDevice,\n ::cuCtxGetFlags,\n ::cuCtxSetLimit,\n ::cuCtxSynchronize,\n ::cudaDeviceGetStreamPriorityRange*/\n    fn cuCtxGetStreamPriorityRange(\n        leastPriority: *mut ::core::ffi::c_int,\n        greatestPriority: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Resets all persisting lines in cache to normal status.\n\n ::cuCtxResetPersistingL2Cache Resets all persisting lines in cache to normal\n status. Takes effect on function return.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_NOT_SUPPORTED\n \\notefnerr\n\n \\sa\n ::CUaccessPolicyWindow*/\n    fn cuCtxResetPersistingL2Cache() -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the execution affinity setting for the current context.\n\n Returns in \\p *pExecAffinity the current value of \\p type. The supported\n ::CUexecAffinityType values are:\n - ::CU_EXEC_AFFINITY_TYPE_SM_COUNT: number of SMs the context is limited to use.\n\n \\param type          - Execution affinity type to query\n \\param pExecAffinity - Returned execution affinity\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_UNSUPPORTED_EXEC_AFFINITY\n \\notefnerr\n\n \\sa\n ::CUexecAffinityParam*/\n    fn cuCtxGetExecAffinity(\n        pExecAffinity: *mut cuda_types::cuda::CUexecAffinityParam,\n        type_: cuda_types::cuda::CUexecAffinityType,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Records an event.\n\n Captures in \\p hEvent all the activities of the context \\p hCtx\n at the time of this call. \\p hEvent and \\p hCtx must be from the same\n CUDA context, otherwise ::CUDA_ERROR_INVALID_HANDLE will be returned.\n Calls such as ::cuEventQuery() or ::cuCtxWaitEvent() will then examine\n or wait for completion of the work that was captured.\n Uses of \\p hCtx after this call do not modify \\p hEvent.\n If the context passed to \\p hCtx is the primary context, \\p hEvent will\n capture all the activities of the primary context and its green contexts.\n If the context passed to \\p hCtx is a context converted from green context\n via ::cuCtxFromGreenCtx(), \\p hEvent will capture only the activities of the green context.\n\n \\note The API will return ::CUDA_ERROR_STREAM_CAPTURE_UNSUPPORTED if the\n specified context \\p hCtx has a stream in the capture mode. In such a case,\n the call will invalidate all the conflicting captures.\n\n \\param hCtx - Context to record event for\n \\param hEvent - Event to record\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_STREAM_CAPTURE_UNSUPPORTED\n\n \\sa\n ::cuCtxWaitEvent,\n ::cuGreenCtxRecordEvent,\n ::cuGreenCtxWaitEvent,\n ::cuEventRecord*/\n    fn cuCtxRecordEvent(\n        hCtx: cuda_types::cuda::CUcontext,\n        hEvent: cuda_types::cuda::CUevent,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Make a context wait on an event\n\n Makes all future work submitted to context \\p hCtx wait for all work\n captured in \\p hEvent. The synchronization will be performed on the device\n and will not block the calling CPU thread. See ::cuCtxRecordEvent()\n for details on what is captured by an event.\n If the context passed to \\p hCtx is the primary context, the primary context\n and its green contexts will wait for \\p hEvent.\n If the context passed to \\p hCtx is a context converted from green context\n via ::cuCtxFromGreenCtx(), the green context will wait for \\p hEvent.\n\n \\note \\p hEvent may be from a different context or device than \\p hCtx.\n\n \\note The API will return ::CUDA_ERROR_STREAM_CAPTURE_UNSUPPORTED and\n invalidate the capture if the specified event \\p hEvent is part of an ongoing\n capture sequence or if the specified context \\p hCtx has a stream in the capture mode.\n\n \\param hCtx    - Context to wait\n \\param hEvent  - Event to wait on\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_STREAM_CAPTURE_UNSUPPORTED\n\n \\sa\n ::cuCtxRecordEvent,\n ::cuGreenCtxRecordEvent,\n ::cuGreenCtxWaitEvent,\n ::cuStreamWaitEvent*/\n    fn cuCtxWaitEvent(\n        hCtx: cuda_types::cuda::CUcontext,\n        hEvent: cuda_types::cuda::CUevent,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Increment a context's usage-count\n\n \\deprecated\n\n Note that this function is deprecated and should not be used.\n\n Increments the usage count of the context and passes back a context handle\n in \\p *pctx that must be passed to ::cuCtxDetach() when the application is\n done with the context. ::cuCtxAttach() fails if there is no context current\n to the thread.\n\n Currently, the \\p flags parameter must be 0.\n\n \\param pctx  - Returned context handle of the current context\n \\param flags - Context attach flags (must be 0)\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa ::cuCtxCreate,\n ::cuCtxDestroy,\n ::cuCtxDetach,\n ::cuCtxGetApiVersion,\n ::cuCtxGetCacheConfig,\n ::cuCtxGetDevice,\n ::cuCtxGetFlags,\n ::cuCtxGetLimit,\n ::cuCtxPopCurrent,\n ::cuCtxPushCurrent,\n ::cuCtxSetCacheConfig,\n ::cuCtxSetLimit,\n ::cuCtxSynchronize*/\n    fn cuCtxAttach(\n        pctx: *mut cuda_types::cuda::CUcontext,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Decrement a context's usage-count\n\n \\deprecated\n\n Note that this function is deprecated and should not be used.\n\n Decrements the usage count of the context \\p ctx, and destroys the context\n if the usage count goes to 0. The context must be a handle that was passed\n back by ::cuCtxCreate() or ::cuCtxAttach(), and must be current to the\n calling thread.\n\n \\param ctx - Context to destroy\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT\n \\notefnerr\n\n \\sa ::cuCtxCreate,\n ::cuCtxDestroy,\n ::cuCtxGetApiVersion,\n ::cuCtxGetCacheConfig,\n ::cuCtxGetDevice,\n ::cuCtxGetFlags,\n ::cuCtxGetLimit,\n ::cuCtxPopCurrent,\n ::cuCtxPushCurrent,\n ::cuCtxSetCacheConfig,\n ::cuCtxSetLimit,\n ::cuCtxSynchronize*/\n    fn cuCtxDetach(ctx: cuda_types::cuda::CUcontext) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the current shared memory configuration for the current context.\n\n \\deprecated\n\n This function will return in \\p pConfig the current size of shared memory banks\n in the current context. On devices with configurable shared memory banks,\n ::cuCtxSetSharedMemConfig can be used to change this setting, so that all\n subsequent kernel launches will by default use the new bank size. When\n ::cuCtxGetSharedMemConfig is called on devices without configurable shared\n memory, it will return the fixed bank size of the hardware.\n\n The returned bank configurations can be either:\n - ::CU_SHARED_MEM_CONFIG_FOUR_BYTE_BANK_SIZE:  shared memory bank width is\n   four bytes.\n - ::CU_SHARED_MEM_CONFIG_EIGHT_BYTE_BANK_SIZE: shared memory bank width will\n   eight bytes.\n\n \\param pConfig - returned shared memory configuration\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa ::cuCtxCreate,\n ::cuCtxDestroy,\n ::cuCtxGetApiVersion,\n ::cuCtxGetCacheConfig,\n ::cuCtxGetDevice,\n ::cuCtxGetFlags,\n ::cuCtxGetLimit,\n ::cuCtxPopCurrent,\n ::cuCtxPushCurrent,\n ::cuCtxSetLimit,\n ::cuCtxSynchronize,\n ::cuCtxGetSharedMemConfig,\n ::cuFuncSetCacheConfig,\n ::cudaDeviceGetSharedMemConfig*/\n    fn cuCtxGetSharedMemConfig(\n        pConfig: *mut cuda_types::cuda::CUsharedconfig,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the shared memory configuration for the current context.\n\n \\deprecated\n\n On devices with configurable shared memory banks, this function will set\n the context's shared memory bank size which is used for subsequent kernel\n launches.\n\n Changed the shared memory configuration between launches may insert a device\n side synchronization point between those launches.\n\n Changing the shared memory bank size will not increase shared memory usage\n or affect occupancy of kernels, but may have major effects on performance.\n Larger bank sizes will allow for greater potential bandwidth to shared memory,\n but will change what kinds of accesses to shared memory will result in bank\n conflicts.\n\n This function will do nothing on devices with fixed shared memory bank size.\n\n The supported bank configurations are:\n - ::CU_SHARED_MEM_CONFIG_DEFAULT_BANK_SIZE: set bank width to the default initial\n   setting (currently, four bytes).\n - ::CU_SHARED_MEM_CONFIG_FOUR_BYTE_BANK_SIZE: set shared memory bank width to\n   be natively four bytes.\n - ::CU_SHARED_MEM_CONFIG_EIGHT_BYTE_BANK_SIZE: set shared memory bank width to\n   be natively eight bytes.\n\n \\param config - requested shared memory configuration\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa ::cuCtxCreate,\n ::cuCtxDestroy,\n ::cuCtxGetApiVersion,\n ::cuCtxGetCacheConfig,\n ::cuCtxGetDevice,\n ::cuCtxGetFlags,\n ::cuCtxGetLimit,\n ::cuCtxPopCurrent,\n ::cuCtxPushCurrent,\n ::cuCtxSetLimit,\n ::cuCtxSynchronize,\n ::cuCtxGetSharedMemConfig,\n ::cuFuncSetCacheConfig,\n ::cudaDeviceSetSharedMemConfig*/\n    fn cuCtxSetSharedMemConfig(\n        config: cuda_types::cuda::CUsharedconfig,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Loads a compute module\n\n Takes a filename \\p fname and loads the corresponding module \\p module into\n the current context. The CUDA driver API does not attempt to lazily\n allocate the resources needed by a module; if the memory for functions and\n data (constant and global) needed by the module cannot be allocated,\n ::cuModuleLoad() fails. The file should be a \\e cubin file as output by\n \\b nvcc, or a \\e PTX file either as output by \\b nvcc or handwritten, or\n a \\e fatbin file as output by \\b nvcc from toolchain 4.0 or later.\n\n \\param module - Returned module\n \\param fname  - Filename of module to load\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_PTX,\n ::CUDA_ERROR_UNSUPPORTED_PTX_VERSION,\n ::CUDA_ERROR_NOT_FOUND,\n ::CUDA_ERROR_OUT_OF_MEMORY,\n ::CUDA_ERROR_FILE_NOT_FOUND,\n ::CUDA_ERROR_NO_BINARY_FOR_GPU,\n ::CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND,\n ::CUDA_ERROR_SHARED_OBJECT_INIT_FAILED,\n ::CUDA_ERROR_JIT_COMPILER_NOT_FOUND\n \\notefnerr\n\n \\sa ::cuModuleGetFunction,\n ::cuModuleGetGlobal,\n ::cuModuleGetTexRef,\n ::cuModuleLoadData,\n ::cuModuleLoadDataEx,\n ::cuModuleLoadFatBinary,\n ::cuModuleUnload*/\n    fn cuModuleLoad(\n        module: *mut cuda_types::cuda::CUmodule,\n        fname: *const ::core::ffi::c_char,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Load a module's data\n\n Takes a pointer \\p image and loads the corresponding module \\p module into\n the current context. The \\p image may be a \\e cubin or \\e fatbin\n as output by \\b nvcc, or a NULL-terminated \\e PTX, either as output by \\b nvcc\n or hand-written.\n\n \\param module - Returned module\n \\param image  - Module data to load\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_PTX,\n ::CUDA_ERROR_UNSUPPORTED_PTX_VERSION,\n ::CUDA_ERROR_OUT_OF_MEMORY,\n ::CUDA_ERROR_NO_BINARY_FOR_GPU,\n ::CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND,\n ::CUDA_ERROR_SHARED_OBJECT_INIT_FAILED,\n ::CUDA_ERROR_JIT_COMPILER_NOT_FOUND\n \\notefnerr\n\n \\sa ::cuModuleGetFunction,\n ::cuModuleGetGlobal,\n ::cuModuleGetTexRef,\n ::cuModuleLoad,\n ::cuModuleLoadDataEx,\n ::cuModuleLoadFatBinary,\n ::cuModuleUnload*/\n    fn cuModuleLoadData(\n        module: *mut cuda_types::cuda::CUmodule,\n        image: *const ::core::ffi::c_void,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Load a module's data with options\n\n Takes a pointer \\p image and loads the corresponding module \\p module into\n the current context. The \\p image may be a \\e cubin or \\e fatbin\n as output by \\b nvcc, or a NULL-terminated \\e PTX, either as output by \\b nvcc\n or hand-written.\n\n \\param module       - Returned module\n \\param image        - Module data to load\n \\param numOptions   - Number of options\n \\param options      - Options for JIT\n \\param optionValues - Option values for JIT\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_PTX,\n ::CUDA_ERROR_UNSUPPORTED_PTX_VERSION,\n ::CUDA_ERROR_OUT_OF_MEMORY,\n ::CUDA_ERROR_NO_BINARY_FOR_GPU,\n ::CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND,\n ::CUDA_ERROR_SHARED_OBJECT_INIT_FAILED,\n ::CUDA_ERROR_JIT_COMPILER_NOT_FOUND\n \\notefnerr\n\n \\sa ::cuModuleGetFunction,\n ::cuModuleGetGlobal,\n ::cuModuleGetTexRef,\n ::cuModuleLoad,\n ::cuModuleLoadData,\n ::cuModuleLoadFatBinary,\n ::cuModuleUnload*/\n    fn cuModuleLoadDataEx(\n        module: *mut cuda_types::cuda::CUmodule,\n        image: *const ::core::ffi::c_void,\n        numOptions: ::core::ffi::c_uint,\n        options: *mut cuda_types::cuda::CUjit_option,\n        optionValues: *mut *mut ::core::ffi::c_void,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Load a module's data\n\n Takes a pointer \\p fatCubin and loads the corresponding module \\p module\n into the current context. The pointer represents a <i>fat binary</i> object,\n which is a collection of different \\e cubin and/or \\e PTX files, all\n representing the same device code, but compiled and optimized for different\n architectures.\n\n Prior to CUDA 4.0, there was no documented API for constructing and using\n fat binary objects by programmers.  Starting with CUDA 4.0, fat binary\n objects can be constructed by providing the <i>-fatbin option</i> to \\b nvcc.\n More information can be found in the \\b nvcc document.\n\n \\param module   - Returned module\n \\param fatCubin - Fat binary to load\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_PTX,\n ::CUDA_ERROR_UNSUPPORTED_PTX_VERSION,\n ::CUDA_ERROR_NOT_FOUND,\n ::CUDA_ERROR_OUT_OF_MEMORY,\n ::CUDA_ERROR_NO_BINARY_FOR_GPU,\n ::CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND,\n ::CUDA_ERROR_SHARED_OBJECT_INIT_FAILED,\n ::CUDA_ERROR_JIT_COMPILER_NOT_FOUND\n \\notefnerr\n\n \\sa ::cuModuleGetFunction,\n ::cuModuleGetGlobal,\n ::cuModuleGetTexRef,\n ::cuModuleLoad,\n ::cuModuleLoadData,\n ::cuModuleLoadDataEx,\n ::cuModuleUnload*/\n    fn cuModuleLoadFatBinary(\n        module: *mut cuda_types::cuda::CUmodule,\n        fatCubin: *const ::core::ffi::c_void,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Unloads a module\n\n Unloads a module \\p hmod from the current context. Attempting to unload\n a module which was obtained from the Library Management API such as\n ::cuLibraryGetModule will return ::CUDA_ERROR_NOT_PERMITTED.\n\n \\param hmod - Module to unload\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_PERMITTED\n \\notefnerr\n \\note_destroy_ub\n\n \\sa ::cuModuleGetFunction,\n ::cuModuleGetGlobal,\n ::cuModuleGetTexRef,\n ::cuModuleLoad,\n ::cuModuleLoadData,\n ::cuModuleLoadDataEx,\n ::cuModuleLoadFatBinary*/\n    fn cuModuleUnload(hmod: cuda_types::cuda::CUmodule) -> cuda_types::cuda::CUresult;\n    /** \\brief Query lazy loading mode\n\n Returns lazy loading mode\n Module loading mode is controlled by CUDA_MODULE_LOADING env variable\n\n \\param mode      - Returns the lazy loading mode\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n \\notefnerr\n\n \\sa\n ::cuModuleLoad,*/\n    fn cuModuleGetLoadingMode(\n        mode: *mut cuda_types::cuda::CUmoduleLoadingMode,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a function handle\n\n Returns in \\p *hfunc the handle of the function of name \\p name located in\n module \\p hmod. If no function of that name exists, ::cuModuleGetFunction()\n returns ::CUDA_ERROR_NOT_FOUND.\n\n \\param hfunc - Returned function handle\n \\param hmod  - Module to retrieve function from\n \\param name  - Name of function to retrieve\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_FOUND\n \\notefnerr\n\n \\sa ::cuModuleGetGlobal,\n ::cuModuleGetTexRef,\n ::cuModuleLoad,\n ::cuModuleLoadData,\n ::cuModuleLoadDataEx,\n ::cuModuleLoadFatBinary,\n ::cuModuleUnload*/\n    fn cuModuleGetFunction(\n        hfunc: *mut cuda_types::cuda::CUfunction,\n        hmod: cuda_types::cuda::CUmodule,\n        name: *const ::core::ffi::c_char,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the number of functions within a module\n\n Returns in \\p count the number of functions in \\p mod.\n\n \\param count - Number of functions found within the module\n \\param mod - Module to query\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_VALUE*/\n    fn cuModuleGetFunctionCount(\n        count: *mut ::core::ffi::c_uint,\n        mod_: cuda_types::cuda::CUmodule,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the function handles within a module.\n\n Returns in \\p functions a maximum number of \\p numFunctions function handles within \\p mod. When\n function loading mode is set to LAZY the function retrieved may be partially loaded. The loading\n state of a function can be queried using ::cuFunctionIsLoaded. CUDA APIs may load the function\n automatically when called with partially loaded function handle which may incur additional\n latency. Alternatively, ::cuFunctionLoad can be used to explicitly load a function. The returned\n function handles become invalid when the module is unloaded.\n\n \\param functions - Buffer where the function handles are returned to\n \\param numFunctions - Maximum number of function handles may be returned to the buffer\n \\param mod - Module to query from\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuModuleGetFunction,\n ::cuModuleGetFunctionCount,\n ::cuFuncIsLoaded,\n ::cuFuncLoad*/\n    fn cuModuleEnumerateFunctions(\n        functions: *mut cuda_types::cuda::CUfunction,\n        numFunctions: ::core::ffi::c_uint,\n        mod_: cuda_types::cuda::CUmodule,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a global pointer from a module\n\n Returns in \\p *dptr and \\p *bytes the base pointer and size of the\n global of name \\p name located in module \\p hmod. If no variable of that name\n exists, ::cuModuleGetGlobal() returns ::CUDA_ERROR_NOT_FOUND.\n One of the parameters \\p dptr or \\p bytes (not both) can be NULL in which\n case it is ignored.\n\n \\param dptr  - Returned global device pointer\n \\param bytes - Returned global size in bytes\n \\param hmod  - Module to retrieve global from\n \\param name  - Name of global to retrieve\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_FOUND\n \\notefnerr\n\n \\sa ::cuModuleGetFunction,\n ::cuModuleGetTexRef,\n ::cuModuleLoad,\n ::cuModuleLoadData,\n ::cuModuleLoadDataEx,\n ::cuModuleLoadFatBinary,\n ::cuModuleUnload,\n ::cudaGetSymbolAddress,\n ::cudaGetSymbolSize*/\n    fn cuModuleGetGlobal_v2(\n        dptr: *mut cuda_types::cuda::CUdeviceptr,\n        bytes: *mut usize,\n        hmod: cuda_types::cuda::CUmodule,\n        name: *const ::core::ffi::c_char,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Creates a pending JIT linker invocation.\n\n If the call is successful, the caller owns the returned CUlinkState, which\n should eventually be destroyed with ::cuLinkDestroy.  The\n device code machine size (32 or 64 bit) will match the calling application.\n\n Both linker and compiler options may be specified.  Compiler options will\n be applied to inputs to this linker action which must be compiled from PTX.\n The options ::CU_JIT_WALL_TIME,\n ::CU_JIT_INFO_LOG_BUFFER_SIZE_BYTES, and ::CU_JIT_ERROR_LOG_BUFFER_SIZE_BYTES\n will accumulate data until the CUlinkState is destroyed.\n\n The data passed in via ::cuLinkAddData and ::cuLinkAddFile will be treated\n as relocatable (-rdc=true to nvcc) when linking the final cubin during\n ::cuLinkComplete and will have similar consequences as offline relocatable\n device code linking.\n\n \\p optionValues must remain valid for the life of the CUlinkState if output\n options are used.  No other references to inputs are maintained after this\n call returns.\n\n \\note For LTO-IR input, only LTO-IR compiled with toolkits prior to CUDA 12.0 will be accepted\n\n \\param numOptions   Size of options arrays\n \\param options      Array of linker and compiler options\n \\param optionValues Array of option values, each cast to void *\n \\param stateOut     On success, this will contain a CUlinkState to specify\n                     and complete this action\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_OUT_OF_MEMORY,\n ::CUDA_ERROR_JIT_COMPILER_NOT_FOUND\n \\notefnerr\n\n \\sa ::cuLinkAddData,\n ::cuLinkAddFile,\n ::cuLinkComplete,\n ::cuLinkDestroy*/\n    fn cuLinkCreate_v2(\n        numOptions: ::core::ffi::c_uint,\n        options: *mut cuda_types::cuda::CUjit_option,\n        optionValues: *mut *mut ::core::ffi::c_void,\n        stateOut: *mut cuda_types::cuda::CUlinkState,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Add an input to a pending linker invocation\n\n Ownership of \\p data is retained by the caller.  No reference is retained to any\n inputs after this call returns.\n\n This method accepts only compiler options, which are used if the data must\n be compiled from PTX, and does not accept any of\n ::CU_JIT_WALL_TIME, ::CU_JIT_INFO_LOG_BUFFER, ::CU_JIT_ERROR_LOG_BUFFER,\n ::CU_JIT_TARGET_FROM_CUCONTEXT, or ::CU_JIT_TARGET.\n\n \\note For LTO-IR input, only LTO-IR compiled with toolkits prior to CUDA 12.0 will be accepted\n\n \\param state        A pending linker action.\n \\param type         The type of the input data.\n \\param data         The input data.  PTX must be NULL-terminated.\n \\param size         The length of the input data.\n \\param name         An optional name for this input in log messages.\n \\param numOptions   Size of options.\n \\param options      Options to be applied only for this input (overrides options from ::cuLinkCreate).\n \\param optionValues Array of option values, each cast to void *.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_IMAGE,\n ::CUDA_ERROR_INVALID_PTX,\n ::CUDA_ERROR_UNSUPPORTED_PTX_VERSION,\n ::CUDA_ERROR_OUT_OF_MEMORY,\n ::CUDA_ERROR_NO_BINARY_FOR_GPU\n\n \\sa ::cuLinkCreate,\n ::cuLinkAddFile,\n ::cuLinkComplete,\n ::cuLinkDestroy*/\n    fn cuLinkAddData_v2(\n        state: cuda_types::cuda::CUlinkState,\n        type_: cuda_types::cuda::CUjitInputType,\n        data: *mut ::core::ffi::c_void,\n        size: usize,\n        name: *const ::core::ffi::c_char,\n        numOptions: ::core::ffi::c_uint,\n        options: *mut cuda_types::cuda::CUjit_option,\n        optionValues: *mut *mut ::core::ffi::c_void,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Add a file input to a pending linker invocation\n\n No reference is retained to any inputs after this call returns.\n\n This method accepts only compiler options, which are used if the input\n must be compiled from PTX, and does not accept any of\n ::CU_JIT_WALL_TIME, ::CU_JIT_INFO_LOG_BUFFER, ::CU_JIT_ERROR_LOG_BUFFER,\n ::CU_JIT_TARGET_FROM_CUCONTEXT, or ::CU_JIT_TARGET.\n\n This method is equivalent to invoking ::cuLinkAddData on the contents\n of the file.\n\n \\note For LTO-IR input, only LTO-IR compiled with toolkits prior to CUDA 12.0 will be accepted\n\n \\param state        A pending linker action\n \\param type         The type of the input data\n \\param path         Path to the input file\n \\param numOptions   Size of options\n \\param options      Options to be applied only for this input (overrides options from ::cuLinkCreate)\n \\param optionValues Array of option values, each cast to void *\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_FILE_NOT_FOUND\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_IMAGE,\n ::CUDA_ERROR_INVALID_PTX,\n ::CUDA_ERROR_UNSUPPORTED_PTX_VERSION,\n ::CUDA_ERROR_OUT_OF_MEMORY,\n ::CUDA_ERROR_NO_BINARY_FOR_GPU\n\n \\sa ::cuLinkCreate,\n ::cuLinkAddData,\n ::cuLinkComplete,\n ::cuLinkDestroy*/\n    fn cuLinkAddFile_v2(\n        state: cuda_types::cuda::CUlinkState,\n        type_: cuda_types::cuda::CUjitInputType,\n        path: *const ::core::ffi::c_char,\n        numOptions: ::core::ffi::c_uint,\n        options: *mut cuda_types::cuda::CUjit_option,\n        optionValues: *mut *mut ::core::ffi::c_void,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Complete a pending linker invocation\n\n Completes the pending linker action and returns the cubin image for the linked\n device code, which can be used with ::cuModuleLoadData.  The cubin is owned by\n \\p state, so it should be loaded before \\p state is destroyed via ::cuLinkDestroy.\n This call does not destroy \\p state.\n\n \\param state    A pending linker invocation\n \\param cubinOut On success, this will point to the output image\n \\param sizeOut  Optional parameter to receive the size of the generated image\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_OUT_OF_MEMORY\n\n \\sa ::cuLinkCreate,\n ::cuLinkAddData,\n ::cuLinkAddFile,\n ::cuLinkDestroy,\n ::cuModuleLoadData*/\n    fn cuLinkComplete(\n        state: cuda_types::cuda::CUlinkState,\n        cubinOut: *mut *mut ::core::ffi::c_void,\n        sizeOut: *mut usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Destroys state for a JIT linker invocation.\n\n \\param state State object for the linker invocation\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_HANDLE\n\n \\sa ::cuLinkCreate*/\n    fn cuLinkDestroy(state: cuda_types::cuda::CUlinkState) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a handle to a texture reference\n\n \\deprecated\n\n Returns in \\p *pTexRef the handle of the texture reference of name \\p name\n in the module \\p hmod. If no texture reference of that name exists,\n ::cuModuleGetTexRef() returns ::CUDA_ERROR_NOT_FOUND. This texture reference\n handle should not be destroyed, since it will be destroyed when the module\n is unloaded.\n\n \\param pTexRef  - Returned texture reference\n \\param hmod     - Module to retrieve texture reference from\n \\param name     - Name of texture reference to retrieve\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_FOUND\n \\notefnerr\n\n \\sa\n ::cuModuleGetFunction,\n ::cuModuleGetGlobal,\n ::cuModuleGetSurfRef,\n ::cuModuleLoad,\n ::cuModuleLoadData,\n ::cuModuleLoadDataEx,\n ::cuModuleLoadFatBinary,\n ::cuModuleUnload*/\n    fn cuModuleGetTexRef(\n        pTexRef: *mut cuda_types::cuda::CUtexref,\n        hmod: cuda_types::cuda::CUmodule,\n        name: *const ::core::ffi::c_char,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a handle to a surface reference\n\n \\deprecated\n\n Returns in \\p *pSurfRef the handle of the surface reference of name \\p name\n in the module \\p hmod. If no surface reference of that name exists,\n ::cuModuleGetSurfRef() returns ::CUDA_ERROR_NOT_FOUND.\n\n \\param pSurfRef  - Returned surface reference\n \\param hmod     - Module to retrieve surface reference from\n \\param name     - Name of surface reference to retrieve\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_FOUND\n \\notefnerr\n\n \\sa\n ::cuModuleGetFunction,\n ::cuModuleGetGlobal,\n ::cuModuleGetTexRef,\n ::cuModuleLoad,\n ::cuModuleLoadData,\n ::cuModuleLoadDataEx,\n ::cuModuleLoadFatBinary,\n ::cuModuleUnload*/\n    fn cuModuleGetSurfRef(\n        pSurfRef: *mut cuda_types::cuda::CUsurfref,\n        hmod: cuda_types::cuda::CUmodule,\n        name: *const ::core::ffi::c_char,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Load a library with specified code and options\n\n Takes a pointer \\p code and loads the corresponding library \\p library based on\n the application defined library loading mode:\n - If module loading is set to EAGER, via the environment variables described in \"Module loading\",\n   \\p library is loaded eagerly into all contexts at the time of the call and future contexts\n   at the time of creation until the library is unloaded with ::cuLibraryUnload().\n - If the environment variables are set to LAZY, \\p library\n   is not immediately loaded onto all existent contexts and will only be\n   loaded when a function is needed for that context, such as a kernel launch.\n\n These environment variables are described in the CUDA programming guide under the\n \"CUDA environment variables\" section.\n\n The \\p code may be a \\e cubin or \\e fatbin as output by \\b nvcc,\n or a NULL-terminated \\e PTX, either as output by \\b nvcc or hand-written.\n A fatbin should also contain relocatable code when doing separate compilation.\n\n Options are passed as an array via \\p jitOptions and any corresponding parameters are passed in\n \\p jitOptionsValues. The number of total JIT options is supplied via \\p numJitOptions.\n Any outputs will be returned via \\p jitOptionsValues.\n\n Library load options are passed as an array via \\p libraryOptions and any corresponding parameters are passed in\n \\p libraryOptionValues. The number of total library load options is supplied via \\p numLibraryOptions.\n\n \\note If the library contains managed variables and no device in the system\n supports managed variables this call is expected to return ::CUDA_ERROR_NOT_SUPPORTED\n\n \\param library             - Returned library\n \\param code                - Code to load\n \\param jitOptions          - Options for JIT\n \\param jitOptionsValues    - Option values for JIT\n \\param numJitOptions       - Number of options\n \\param libraryOptions      - Options for loading\n \\param libraryOptionValues - Option values for loading\n \\param numLibraryOptions   - Number of options for loading\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_PTX,\n ::CUDA_ERROR_UNSUPPORTED_PTX_VERSION,\n ::CUDA_ERROR_OUT_OF_MEMORY,\n ::CUDA_ERROR_NO_BINARY_FOR_GPU,\n ::CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND,\n ::CUDA_ERROR_SHARED_OBJECT_INIT_FAILED,\n ::CUDA_ERROR_JIT_COMPILER_NOT_FOUND,\n ::CUDA_ERROR_NOT_SUPPORTED\n\n \\sa ::cuLibraryLoadFromFile,\n ::cuLibraryUnload,\n ::cuModuleLoad,\n ::cuModuleLoadData,\n ::cuModuleLoadDataEx*/\n    fn cuLibraryLoadData(\n        library: *mut cuda_types::cuda::CUlibrary,\n        code: *const ::core::ffi::c_void,\n        jitOptions: *mut cuda_types::cuda::CUjit_option,\n        jitOptionsValues: *mut *mut ::core::ffi::c_void,\n        numJitOptions: ::core::ffi::c_uint,\n        libraryOptions: *mut cuda_types::cuda::CUlibraryOption,\n        libraryOptionValues: *mut *mut ::core::ffi::c_void,\n        numLibraryOptions: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Load a library with specified file and options\n\n Takes a pointer \\p code and loads the corresponding library \\p library based on\n the application defined library loading mode:\n - If module loading is set to EAGER, via the environment variables described in \"Module loading\",\n   \\p library is loaded eagerly into all contexts at the time of the call and future contexts\n   at the time of creation until the library is unloaded with ::cuLibraryUnload().\n - If the environment variables are set to LAZY, \\p library\n   is not immediately loaded onto all existent contexts and will only be\n   loaded when a function is needed for that context, such as a kernel launch.\n\n These environment variables are described in the CUDA programming guide under the\n \"CUDA environment variables\" section.\n\n The file should be a \\e cubin file as output by \\b nvcc, or a \\e PTX file either\n as output by \\b nvcc or handwritten, or a \\e fatbin file as output by \\b nvcc.\n A fatbin should also contain relocatable code when doing separate compilation.\n\n Options are passed as an array via \\p jitOptions and any corresponding parameters are\n passed in \\p jitOptionsValues. The number of total options is supplied via \\p numJitOptions.\n Any outputs will be returned via \\p jitOptionsValues.\n\n Library load options are passed as an array via \\p libraryOptions and any corresponding parameters are passed in\n \\p libraryOptionValues. The number of total library load options is supplied via \\p numLibraryOptions.\n\n \\note If the library contains managed variables and no device in the system\n supports managed variables this call is expected to return ::CUDA_ERROR_NOT_SUPPORTED\n\n \\param library             - Returned library\n \\param fileName            - File to load from\n \\param jitOptions          - Options for JIT\n \\param jitOptionsValues    - Option values for JIT\n \\param numJitOptions       - Number of options\n \\param libraryOptions      - Options for loading\n \\param libraryOptionValues - Option values for loading\n \\param numLibraryOptions   - Number of options for loading\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_PTX,\n ::CUDA_ERROR_UNSUPPORTED_PTX_VERSION,\n ::CUDA_ERROR_OUT_OF_MEMORY,\n ::CUDA_ERROR_NO_BINARY_FOR_GPU,\n ::CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND,\n ::CUDA_ERROR_SHARED_OBJECT_INIT_FAILED,\n ::CUDA_ERROR_JIT_COMPILER_NOT_FOUND,\n ::CUDA_ERROR_NOT_SUPPORTED\n\n \\sa ::cuLibraryLoadData,\n ::cuLibraryUnload,\n ::cuModuleLoad,\n ::cuModuleLoadData,\n ::cuModuleLoadDataEx*/\n    fn cuLibraryLoadFromFile(\n        library: *mut cuda_types::cuda::CUlibrary,\n        fileName: *const ::core::ffi::c_char,\n        jitOptions: *mut cuda_types::cuda::CUjit_option,\n        jitOptionsValues: *mut *mut ::core::ffi::c_void,\n        numJitOptions: ::core::ffi::c_uint,\n        libraryOptions: *mut cuda_types::cuda::CUlibraryOption,\n        libraryOptionValues: *mut *mut ::core::ffi::c_void,\n        numLibraryOptions: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Unloads a library\n\n Unloads the library specified with \\p library\n\n \\param library - Library to unload\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuLibraryLoadData,\n ::cuLibraryLoadFromFile,\n ::cuModuleUnload*/\n    fn cuLibraryUnload(\n        library: cuda_types::cuda::CUlibrary,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a kernel handle\n\n Returns in \\p pKernel the handle of the kernel with name \\p name located in library \\p library.\n If kernel handle is not found, the call returns ::CUDA_ERROR_NOT_FOUND.\n\n \\param pKernel - Returned kernel handle\n \\param library - Library to retrieve kernel from\n \\param name - Name of kernel to retrieve\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_NOT_FOUND\n\n \\sa ::cuLibraryLoadData,\n ::cuLibraryLoadFromFile,\n ::cuLibraryUnload,\n ::cuKernelGetFunction,\n ::cuLibraryGetModule,\n ::cuModuleGetFunction*/\n    fn cuLibraryGetKernel(\n        pKernel: *mut cuda_types::cuda::CUkernel,\n        library: cuda_types::cuda::CUlibrary,\n        name: *const ::core::ffi::c_char,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the number of kernels within a library\n\n Returns in \\p count the number of kernels in \\p lib.\n\n \\param count - Number of kernels found within the library\n \\param lib - Library to query\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_VALUE*/\n    fn cuLibraryGetKernelCount(\n        count: *mut ::core::ffi::c_uint,\n        lib: cuda_types::cuda::CUlibrary,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Retrieve the kernel handles within a library.\n\n Returns in \\p kernels a maximum number of \\p numKernels kernel handles within \\p lib.\n The returned kernel handle becomes invalid when the library is unloaded.\n\n \\param kernels - Buffer where the kernel handles are returned to\n \\param numKernels - Maximum number of kernel handles may be returned to the buffer\n \\param lib - Library to query from\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuLibraryGetKernelCount*/\n    fn cuLibraryEnumerateKernels(\n        kernels: *mut cuda_types::cuda::CUkernel,\n        numKernels: ::core::ffi::c_uint,\n        lib: cuda_types::cuda::CUlibrary,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a module handle\n\n Returns in \\p pMod the module handle associated with the current context located in\n library \\p library. If module handle is not found, the call returns ::CUDA_ERROR_NOT_FOUND.\n\n \\param pMod - Returned module handle\n \\param library - Library to retrieve module from\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_NOT_FOUND,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_CONTEXT_IS_DESTROYED\n\n \\sa ::cuLibraryLoadData,\n ::cuLibraryLoadFromFile,\n ::cuLibraryUnload,\n ::cuModuleGetFunction*/\n    fn cuLibraryGetModule(\n        pMod: *mut cuda_types::cuda::CUmodule,\n        library: cuda_types::cuda::CUlibrary,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a function handle\n\n Returns in \\p pFunc the handle of the function for the requested kernel \\p kernel and\n the current context. If function handle is not found, the call returns ::CUDA_ERROR_NOT_FOUND.\n\n \\param pFunc - Returned function handle\n \\param kernel - Kernel to retrieve function for the requested context\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_NOT_FOUND,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_CONTEXT_IS_DESTROYED\n\n \\sa ::cuLibraryLoadData,\n ::cuLibraryLoadFromFile,\n ::cuLibraryUnload,\n ::cuLibraryGetKernel,\n ::cuLibraryGetModule,\n ::cuModuleGetFunction*/\n    fn cuKernelGetFunction(\n        pFunc: *mut cuda_types::cuda::CUfunction,\n        kernel: cuda_types::cuda::CUkernel,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a library handle\n\n Returns in \\p pLib the handle of the library for the requested kernel \\p kernel\n\n \\param pLib - Returned library handle\n \\param kernel - Kernel to retrieve library handle\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_NOT_FOUND\n\n \\sa ::cuLibraryLoadData,\n ::cuLibraryLoadFromFile,\n ::cuLibraryUnload,\n ::cuLibraryGetKernel*/\n    fn cuKernelGetLibrary(\n        pLib: *mut cuda_types::cuda::CUlibrary,\n        kernel: cuda_types::cuda::CUkernel,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a global device pointer\n\n Returns in \\p *dptr and \\p *bytes the base pointer and size of the global with\n name \\p name for the requested library \\p library and the current context.\n If no global for the requested name \\p name exists, the call returns ::CUDA_ERROR_NOT_FOUND.\n One of the parameters \\p dptr or \\p bytes (not both) can be NULL in which\n case it is ignored.\n\n \\param dptr - Returned global device pointer for the requested context\n \\param bytes - Returned global size in bytes\n \\param library - Library to retrieve global from\n \\param name - Name of global to retrieve\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_NOT_FOUND,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_CONTEXT_IS_DESTROYED\n\n \\sa ::cuLibraryLoadData,\n ::cuLibraryLoadFromFile,\n ::cuLibraryUnload,\n ::cuLibraryGetModule,\n cuModuleGetGlobal*/\n    fn cuLibraryGetGlobal(\n        dptr: *mut cuda_types::cuda::CUdeviceptr,\n        bytes: *mut usize,\n        library: cuda_types::cuda::CUlibrary,\n        name: *const ::core::ffi::c_char,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a pointer to managed memory\n\n Returns in \\p *dptr and \\p *bytes the base pointer and size of the managed memory with\n name \\p name for the requested library \\p library. If no managed memory with the\n requested name \\p name exists, the call returns ::CUDA_ERROR_NOT_FOUND. One of the parameters\n \\p dptr or \\p bytes (not both) can be NULL in which case it is ignored.\n Note that managed memory for library \\p library is shared across devices and is registered\n when the library is loaded into atleast one context.\n\n \\param dptr - Returned pointer to the managed memory\n \\param bytes - Returned memory size in bytes\n \\param library - Library to retrieve managed memory from\n \\param name - Name of managed memory to retrieve\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_NOT_FOUND\n\n \\sa ::cuLibraryLoadData,\n ::cuLibraryLoadFromFile,\n ::cuLibraryUnload*/\n    fn cuLibraryGetManaged(\n        dptr: *mut cuda_types::cuda::CUdeviceptr,\n        bytes: *mut usize,\n        library: cuda_types::cuda::CUlibrary,\n        name: *const ::core::ffi::c_char,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a pointer to a unified function\n\n Returns in \\p *fptr the function pointer to a unified function denoted by \\p symbol.\n If no unified function with name \\p symbol exists, the call returns ::CUDA_ERROR_NOT_FOUND.\n If there is no device with attribute ::CU_DEVICE_ATTRIBUTE_UNIFIED_FUNCTION_POINTERS present in the system,\n the call may return ::CUDA_ERROR_NOT_FOUND.\n\n \\param fptr - Returned pointer to a unified function\n \\param library - Library to retrieve function pointer memory from\n \\param symbol - Name of function pointer to retrieve\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_NOT_FOUND\n\n \\sa ::cuLibraryLoadData,\n ::cuLibraryLoadFromFile,\n ::cuLibraryUnload*/\n    fn cuLibraryGetUnifiedFunction(\n        fptr: *mut *mut ::core::ffi::c_void,\n        library: cuda_types::cuda::CUlibrary,\n        symbol: *const ::core::ffi::c_char,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns information about a kernel\n\n Returns in \\p *pi the integer value of the attribute \\p attrib for the kernel\n \\p kernel for the requested device \\p dev. The supported attributes are:\n - ::CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK: The maximum number of threads\n   per block, beyond which a launch of the kernel would fail. This number\n   depends on both the kernel and the requested device.\n - ::CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES: The size in bytes of\n   statically-allocated shared memory per block required by this kernel.\n   This does not include dynamically-allocated shared memory requested by\n   the user at runtime.\n - ::CU_FUNC_ATTRIBUTE_CONST_SIZE_BYTES: The size in bytes of user-allocated\n   constant memory required by this kernel.\n - ::CU_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES: The size in bytes of local memory\n   used by each thread of this kernel.\n - ::CU_FUNC_ATTRIBUTE_NUM_REGS: The number of registers used by each thread\n   of this kernel.\n - ::CU_FUNC_ATTRIBUTE_PTX_VERSION: The PTX virtual architecture version for\n   which the kernel was compiled. This value is the major PTX version * 10\n   + the minor PTX version, so a PTX version 1.3 function would return the\n   value 13. Note that this may return the undefined value of 0 for cubins\n   compiled prior to CUDA 3.0.\n - ::CU_FUNC_ATTRIBUTE_BINARY_VERSION: The binary architecture version for\n   which the kernel was compiled. This value is the major binary\n   version * 10 + the minor binary version, so a binary version 1.3 function\n   would return the value 13. Note that this will return a value of 10 for\n   legacy cubins that do not have a properly-encoded binary architecture\n   version.\n - ::CU_FUNC_CACHE_MODE_CA: The attribute to indicate whether the kernel has\n   been compiled with user specified option \"-Xptxas --dlcm=ca\" set.\n - ::CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES: The maximum size in bytes of\n   dynamically-allocated shared memory.\n - ::CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT: Preferred shared memory-L1\n   cache split ratio in percent of total shared memory.\n - ::CU_FUNC_ATTRIBUTE_CLUSTER_SIZE_MUST_BE_SET: If this attribute is set, the\n   kernel must launch with a valid cluster size specified.\n - ::CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_WIDTH: The required cluster width in\n   blocks.\n - ::CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_HEIGHT: The required cluster height in\n   blocks.\n - ::CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_DEPTH: The required cluster depth in\n   blocks.\n - ::CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED: Indicates whether\n   the function can be launched with non-portable cluster size. 1 is allowed,\n   0 is disallowed. A non-portable cluster size may only function on the\n   specific SKUs the program is tested on. The launch might fail if the\n   program is run on a different hardware platform. CUDA API provides\n   cudaOccupancyMaxActiveClusters to assist with checking whether the desired\n   size can be launched on the current device. A portable cluster size is\n   guaranteed to be functional on all compute capabilities higher than the\n   target compute capability. The portable cluster size for sm_90 is 8 blocks\n   per cluster. This value may increase for future compute capabilities. The\n   specific hardware unit may support higher cluster sizes that’s not\n   guaranteed to be portable.\n - ::CU_FUNC_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE: The block\n   scheduling policy of a function. The value type is CUclusterSchedulingPolicy.\n\n \\note If another thread is trying to set the same attribute on the same device using\n ::cuKernelSetAttribute() simultaneously, the attribute query will give the old or new\n value depending on the interleavings chosen by the OS scheduler and memory consistency.\n\n \\param pi     - Returned attribute value\n \\param attrib - Attribute requested\n \\param kernel  - Kernel to query attribute of\n \\param dev - Device to query attribute of\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE\n\n \\sa ::cuLibraryLoadData,\n ::cuLibraryLoadFromFile,\n ::cuLibraryUnload,\n ::cuKernelSetAttribute,\n ::cuLibraryGetKernel,\n ::cuLaunchKernel,\n ::cuKernelGetFunction,\n ::cuLibraryGetModule,\n ::cuModuleGetFunction,\n ::cuFuncGetAttribute*/\n    fn cuKernelGetAttribute(\n        pi: *mut ::core::ffi::c_int,\n        attrib: cuda_types::cuda::CUfunction_attribute,\n        kernel: cuda_types::cuda::CUkernel,\n        dev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets information about a kernel\n\n This call sets the value of a specified attribute \\p attrib on the kernel \\p kernel\n for the requested device \\p dev to an integer value specified by \\p val.\n This function returns CUDA_SUCCESS if the new value of the attribute could be\n successfully set. If the set fails, this call will return an error.\n Not all attributes can have values set. Attempting to set a value on a read-only\n attribute will result in an error (CUDA_ERROR_INVALID_VALUE)\n\n Note that attributes set using ::cuFuncSetAttribute() will override the attribute\n set by this API irrespective of whether the call to ::cuFuncSetAttribute() is made\n before or after this API call. However, ::cuKernelGetAttribute() will always\n return the attribute value set by this API.\n\n Supported attributes are:\n - ::CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES: This is the maximum size in bytes of\n   dynamically-allocated shared memory. The value should contain the requested\n   maximum size of dynamically-allocated shared memory. The sum of this value and\n   the function attribute ::CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES cannot exceed the\n   device attribute ::CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK_OPTIN.\n   The maximal size of requestable dynamic shared memory may differ by GPU\n   architecture.\n - ::CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT: On devices where the L1\n   cache and shared memory use the same hardware resources, this sets the shared memory\n   carveout preference, in percent of the total shared memory.\n   See ::CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_MULTIPROCESSOR\n   This is only a hint, and the driver can choose a different ratio if required to execute the function.\n - ::CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_WIDTH: The required cluster width in\n   blocks. The width, height, and depth values must either all be 0 or all be\n   positive. The validity of the cluster dimensions is checked at launch time.\n   If the value is set during compile time, it cannot be set at runtime.\n   Setting it at runtime will return CUDA_ERROR_NOT_PERMITTED.\n - ::CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_HEIGHT: The required cluster height in\n   blocks. The width, height, and depth values must either all be 0 or all be\n   positive. The validity of the cluster dimensions is checked at launch time.\n   If the value is set during compile time, it cannot be set at runtime.\n   Setting it at runtime will return CUDA_ERROR_NOT_PERMITTED.\n - ::CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_DEPTH: The required cluster depth in\n   blocks. The width, height, and depth values must either all be 0 or all be\n   positive. The validity of the cluster dimensions is checked at launch time.\n   If the value is set during compile time, it cannot be set at runtime.\n   Setting it at runtime will return CUDA_ERROR_NOT_PERMITTED.\n - ::CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED: Indicates whether\n   the function can be launched with non-portable cluster size. 1 is allowed,\n   0 is disallowed.\n - ::CU_FUNC_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE: The block\n   scheduling policy of a function. The value type is CUclusterSchedulingPolicy.\n\n \\note The API has stricter locking requirements in comparison to its legacy counterpart\n ::cuFuncSetAttribute() due to device-wide semantics. If multiple threads are trying to\n set the same attribute on the same device simultaneously, the attribute setting will depend\n on the interleavings chosen by the OS scheduler and memory consistency.\n\n \\param attrib - Attribute requested\n \\param val - Value to set\n \\param kernel  - Kernel to set attribute of\n \\param dev - Device to set attribute of\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE,\n ::CUDA_ERROR_OUT_OF_MEMORY\n\n \\sa ::cuLibraryLoadData,\n ::cuLibraryLoadFromFile,\n ::cuLibraryUnload,\n ::cuKernelGetAttribute,\n ::cuLibraryGetKernel,\n ::cuLaunchKernel,\n ::cuKernelGetFunction,\n ::cuLibraryGetModule,\n ::cuModuleGetFunction,\n ::cuFuncSetAttribute*/\n    fn cuKernelSetAttribute(\n        attrib: cuda_types::cuda::CUfunction_attribute,\n        val: ::core::ffi::c_int,\n        kernel: cuda_types::cuda::CUkernel,\n        dev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the preferred cache configuration for a device kernel.\n\n On devices where the L1 cache and shared memory use the same hardware\n resources, this sets through \\p config the preferred cache configuration for\n the device kernel \\p kernel on the requested device \\p dev. This is only a preference.\n The driver will use the requested configuration if possible, but it is free to choose a different\n configuration if required to execute \\p kernel.  Any context-wide preference\n set via ::cuCtxSetCacheConfig() will be overridden by this per-kernel\n setting.\n\n Note that attributes set using ::cuFuncSetCacheConfig() will override the attribute\n set by this API irrespective of whether the call to ::cuFuncSetCacheConfig() is made\n before or after this API call.\n\n This setting does nothing on devices where the size of the L1 cache and\n shared memory are fixed.\n\n Launching a kernel with a different preference than the most recent\n preference setting may insert a device-side synchronization point.\n\n\n The supported cache configurations are:\n - ::CU_FUNC_CACHE_PREFER_NONE: no preference for shared memory or L1 (default)\n - ::CU_FUNC_CACHE_PREFER_SHARED: prefer larger shared memory and smaller L1 cache\n - ::CU_FUNC_CACHE_PREFER_L1: prefer larger L1 cache and smaller shared memory\n - ::CU_FUNC_CACHE_PREFER_EQUAL: prefer equal sized L1 cache and shared memory\n\n \\note The API has stricter locking requirements in comparison to its legacy counterpart\n ::cuFuncSetCacheConfig() due to device-wide semantics. If multiple threads are trying to\n set a config on the same device simultaneously, the cache config setting will depend\n on the interleavings chosen by the OS scheduler and memory consistency.\n\n \\param kernel  - Kernel to configure cache for\n \\param config - Requested cache configuration\n \\param dev - Device to set attribute of\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE,\n ::CUDA_ERROR_OUT_OF_MEMORY\n\n \\sa ::cuLibraryLoadData,\n ::cuLibraryLoadFromFile,\n ::cuLibraryUnload,\n ::cuLibraryGetKernel,\n ::cuKernelGetFunction,\n ::cuLibraryGetModule,\n ::cuModuleGetFunction,\n ::cuFuncSetCacheConfig,\n ::cuCtxSetCacheConfig,\n ::cuLaunchKernel*/\n    fn cuKernelSetCacheConfig(\n        kernel: cuda_types::cuda::CUkernel,\n        config: cuda_types::cuda::CUfunc_cache,\n        dev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the function name for a ::CUkernel handle\n\n Returns in \\p **name the function name associated with the kernel handle \\p hfunc .\n The function name is returned as a null-terminated string. The returned name is only\n valid when the kernel handle is valid. If the library is unloaded or reloaded, one\n must call the API again to get the updated name. This API may return a mangled name if\n the function is not declared as having C linkage. If either \\p **name or \\p hfunc\n is NULL, ::CUDA_ERROR_INVALID_VALUE is returned.\n\n \\param name - The returned name of the function\n \\param hfunc - The function handle to retrieve the name for\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n*/\n    fn cuKernelGetName(\n        name: *mut *const ::core::ffi::c_char,\n        hfunc: cuda_types::cuda::CUkernel,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the offset and size of a kernel parameter in the device-side parameter layout\n\n Queries the kernel parameter at \\p paramIndex into \\p kernel's list of parameters, and returns\n in \\p paramOffset and \\p paramSize the offset and size, respectively, where the parameter\n will reside in the device-side parameter layout. This information can be used to update kernel\n node parameters from the device via ::cudaGraphKernelNodeSetParam() and\n ::cudaGraphKernelNodeUpdatesApply(). \\p paramIndex must be less than the number of parameters\n that \\p kernel takes. \\p paramSize can be set to NULL if only the parameter offset is desired.\n\n \\param kernel      - The kernel to query\n \\param paramIndex  - The parameter index to query\n \\param paramOffset - Returns the offset into the device-side parameter layout at which the parameter resides\n \\param paramSize   - Optionally returns the size of the parameter in the device-side parameter layout\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n \\notefnerr\n\n \\sa ::cuFuncGetParamInfo*/\n    fn cuKernelGetParamInfo(\n        kernel: cuda_types::cuda::CUkernel,\n        paramIndex: usize,\n        paramOffset: *mut usize,\n        paramSize: *mut usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Gets free and total memory\n\n Returns in \\p *total the total amount of memory available to the the current context.\n Returns in \\p *free the amount of memory on the device that is free according to the OS.\n CUDA is not guaranteed to be able to allocate all of the memory that the OS reports as free.\n In a multi-tenet situation, free estimate returned is prone to race condition where\n a new allocation/free done by a different process or a different thread in the same\n process between the time when free memory was estimated and reported, will result in\n deviation in free value reported and actual free memory.\n\n The integrated GPU on Tegra shares memory with CPU and other component\n of the SoC. The free and total values returned by the API excludes\n the SWAP memory space maintained by the OS on some platforms.\n The OS may move some of the memory pages into swap area as the GPU or\n CPU allocate or access memory. See Tegra app note on how to calculate\n total and free memory on Tegra.\n\n \\param free  - Returned free memory in bytes\n \\param total - Returned total memory in bytes\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D16,\n ::cuMemsetD2D32, ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD32,\n ::cudaMemGetInfo*/\n    fn cuMemGetInfo_v2(\n        free: *mut usize,\n        total: *mut usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Allocates device memory\n\n Allocates \\p bytesize bytes of linear memory on the device and returns in\n \\p *dptr a pointer to the allocated memory. The allocated memory is suitably\n aligned for any kind of variable. The memory is not cleared. If \\p bytesize\n is 0, ::cuMemAlloc() returns ::CUDA_ERROR_INVALID_VALUE.\n\n \\param dptr     - Returned device pointer\n \\param bytesize - Requested allocation size in bytes\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_OUT_OF_MEMORY\n \\notefnerr\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D16,\n ::cuMemsetD2D32, ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD32,\n ::cudaMalloc*/\n    fn cuMemAlloc_v2(\n        dptr: *mut cuda_types::cuda::CUdeviceptr,\n        bytesize: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Allocates pitched device memory\n\n Allocates at least \\p WidthInBytes * \\p Height bytes of linear memory on\n the device and returns in \\p *dptr a pointer to the allocated memory. The\n function may pad the allocation to ensure that corresponding pointers in\n any given row will continue to meet the alignment requirements for\n coalescing as the address is updated from row to row. \\p ElementSizeBytes\n specifies the size of the largest reads and writes that will be performed\n on the memory range. \\p ElementSizeBytes may be 4, 8 or 16 (since coalesced\n memory transactions are not possible on other data sizes). If\n \\p ElementSizeBytes is smaller than the actual read/write size of a kernel,\n the kernel will run correctly, but possibly at reduced speed. The pitch\n returned in \\p *pPitch by ::cuMemAllocPitch() is the width in bytes of the\n allocation. The intended usage of pitch is as a separate parameter of the\n allocation, used to compute addresses within the 2D array. Given the row\n and column of an array element of type \\b T, the address is computed as:\n \\code\nT* pElement = (T*)((char*)BaseAddress + Row * Pitch) + Column;\n \\endcode\n\n The pitch returned by ::cuMemAllocPitch() is guaranteed to work with\n ::cuMemcpy2D() under all circumstances. For allocations of 2D arrays, it is\n recommended that programmers consider performing pitch allocations using\n ::cuMemAllocPitch(). Due to alignment restrictions in the hardware, this is\n especially true if the application will be performing 2D memory copies\n between different regions of device memory (whether linear memory or CUDA\n arrays).\n\n The byte alignment of the pitch returned by ::cuMemAllocPitch() is guaranteed\n to match or exceed the alignment requirement for texture binding with\n ::cuTexRefSetAddress2D().\n\n \\param dptr             - Returned device pointer\n \\param pPitch           - Returned pitch of allocation in bytes\n \\param WidthInBytes     - Requested allocation width in bytes\n \\param Height           - Requested allocation height in rows\n \\param ElementSizeBytes - Size of largest reads/writes for range\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_OUT_OF_MEMORY\n \\notefnerr\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D16,\n ::cuMemsetD2D32, ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD32,\n ::cudaMallocPitch*/\n    fn cuMemAllocPitch_v2(\n        dptr: *mut cuda_types::cuda::CUdeviceptr,\n        pPitch: *mut usize,\n        WidthInBytes: usize,\n        Height: usize,\n        ElementSizeBytes: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Frees device memory\n\n Frees the memory space pointed to by \\p dptr, which must have been returned\n by a previous call to one of the following memory allocation APIs - ::cuMemAlloc(),\n ::cuMemAllocPitch(), ::cuMemAllocManaged(), ::cuMemAllocAsync(), ::cuMemAllocFromPoolAsync()\n\n Note - This API will not perform any implict synchronization when the pointer was allocated with\n ::cuMemAllocAsync or ::cuMemAllocFromPoolAsync. Callers must ensure that all accesses to these\n pointer have completed before invoking ::cuMemFree. For best performance and memory reuse, users\n should use ::cuMemFreeAsync to free memory allocated via the stream ordered memory allocator.\n For all other pointers, this API may perform implicit synchronization.\n\n \\param dptr - Pointer to memory to free\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemAllocManaged, ::cuMemAllocAsync, ::cuMemAllocFromPoolAsync,\n ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned, ::cuMemcpy3D, ::cuMemcpy3DAsync,\n ::cuMemcpyAtoA, ::cuMemcpyAtoD, ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA,\n ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync, ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA,\n ::cuMemcpyHtoAAsync, ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc, ::cuMemFreeAsync,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D16,\n ::cuMemsetD2D32, ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD32,\n ::cudaFree*/\n    fn cuMemFree_v2(dptr: cuda_types::cuda::CUdeviceptr) -> cuda_types::cuda::CUresult;\n    /** \\brief Get information on memory allocations\n\n Returns the base address in \\p *pbase and size in \\p *psize of the\n allocation by ::cuMemAlloc() or ::cuMemAllocPitch() that contains the input\n pointer \\p dptr. Both parameters \\p pbase and \\p psize are optional. If one\n of them is NULL, it is ignored.\n\n \\param pbase - Returned base address\n \\param psize - Returned size of device memory allocation\n \\param dptr  - Device pointer to query\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_NOT_FOUND,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D16,\n ::cuMemsetD2D32, ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD32*/\n    fn cuMemGetAddressRange_v2(\n        pbase: *mut cuda_types::cuda::CUdeviceptr,\n        psize: *mut usize,\n        dptr: cuda_types::cuda::CUdeviceptr,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Allocates page-locked host memory\n\n Allocates \\p bytesize bytes of host memory that is page-locked and\n accessible to the device. The driver tracks the virtual memory ranges\n allocated with this function and automatically accelerates calls to\n functions such as ::cuMemcpy(). Since the memory can be accessed directly by\n the device, it can be read or written with much higher bandwidth than\n pageable memory obtained with functions such as ::malloc().\n\n On systems where ::CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS_USES_HOST_PAGE_TABLES\n is true, ::cuMemAllocHost may not page-lock the allocated memory.\n\n Page-locking excessive amounts of memory with ::cuMemAllocHost() may degrade system\n performance, since it reduces the amount of memory available to the system\n for paging. As a result, this function is best used sparingly to allocate\n staging areas for data exchange between host and device.\n\n Note all host memory allocated using ::cuMemAllocHost() will automatically\n be immediately accessible to all contexts on all devices which support unified\n addressing (as may be queried using ::CU_DEVICE_ATTRIBUTE_UNIFIED_ADDRESSING).\n The device pointer that may be used to access this host memory from those\n contexts is always equal to the returned host pointer \\p *pp.\n See \\ref CUDA_UNIFIED for additional details.\n\n \\param pp       - Returned pointer to host memory\n \\param bytesize - Requested allocation size in bytes\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_OUT_OF_MEMORY\n \\notefnerr\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D16,\n ::cuMemsetD2D32, ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD32,\n ::cudaMallocHost*/\n    fn cuMemAllocHost_v2(\n        pp: *mut *mut ::core::ffi::c_void,\n        bytesize: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Frees page-locked host memory\n\n Frees the memory space pointed to by \\p p, which must have been returned by\n a previous call to ::cuMemAllocHost().\n\n \\param p - Pointer to memory to free\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D16,\n ::cuMemsetD2D32, ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD32,\n ::cudaFreeHost*/\n    fn cuMemFreeHost(p: *mut ::core::ffi::c_void) -> cuda_types::cuda::CUresult;\n    /** \\brief Allocates page-locked host memory\n\n Allocates \\p bytesize bytes of host memory that is page-locked and accessible\n to the device. The driver tracks the virtual memory ranges allocated with\n this function and automatically accelerates calls to functions such as\n ::cuMemcpyHtoD(). Since the memory can be accessed directly by the device,\n it can be read or written with much higher bandwidth than pageable memory\n obtained with functions such as ::malloc().\n\n On systems where ::CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS_USES_HOST_PAGE_TABLES\n is true, ::cuMemHostAlloc may not page-lock the allocated memory.\n\n Page-locking excessive amounts of memory may degrade system performance,\n since it reduces the amount of memory available to the system for paging.\n As a result, this function is best used sparingly to allocate staging areas\n for data exchange between host and device.\n\n The \\p Flags parameter enables different options to be specified that\n affect the allocation, as follows.\n\n - ::CU_MEMHOSTALLOC_PORTABLE: The memory returned by this call will be\n   considered as pinned memory by all CUDA contexts, not just the one that\n   performed the allocation.\n\n - ::CU_MEMHOSTALLOC_DEVICEMAP: Maps the allocation into the CUDA address\n   space. The device pointer to the memory may be obtained by calling\n   ::cuMemHostGetDevicePointer().\n\n - ::CU_MEMHOSTALLOC_WRITECOMBINED: Allocates the memory as write-combined\n   (WC). WC memory can be transferred across the PCI Express bus more\n   quickly on some system configurations, but cannot be read efficiently by\n   most CPUs. WC memory is a good option for buffers that will be written by\n   the CPU and read by the GPU via mapped pinned memory or host->device\n   transfers.\n\n All of these flags are orthogonal to one another: a developer may allocate\n memory that is portable, mapped and/or write-combined with no restrictions.\n\n The ::CU_MEMHOSTALLOC_DEVICEMAP flag may be specified on CUDA contexts for\n devices that do not support mapped pinned memory. The failure is deferred\n to ::cuMemHostGetDevicePointer() because the memory may be mapped into\n other CUDA contexts via the ::CU_MEMHOSTALLOC_PORTABLE flag.\n\n The memory allocated by this function must be freed with ::cuMemFreeHost().\n\n Note all host memory allocated using ::cuMemHostAlloc() will automatically\n be immediately accessible to all contexts on all devices which support unified\n addressing (as may be queried using ::CU_DEVICE_ATTRIBUTE_UNIFIED_ADDRESSING).\n Unless the flag ::CU_MEMHOSTALLOC_WRITECOMBINED is specified, the device pointer\n that may be used to access this host memory from those contexts is always equal\n to the returned host pointer \\p *pp.  If the flag ::CU_MEMHOSTALLOC_WRITECOMBINED\n is specified, then the function ::cuMemHostGetDevicePointer() must be used\n to query the device pointer, even if the context supports unified addressing.\n See \\ref CUDA_UNIFIED for additional details.\n\n \\param pp       - Returned pointer to host memory\n \\param bytesize - Requested allocation size in bytes\n \\param Flags    - Flags for allocation request\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_OUT_OF_MEMORY\n \\notefnerr\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D16,\n ::cuMemsetD2D32, ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD32,\n ::cudaHostAlloc*/\n    fn cuMemHostAlloc(\n        pp: *mut *mut ::core::ffi::c_void,\n        bytesize: usize,\n        Flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Passes back device pointer of mapped pinned memory\n\n Passes back the device pointer \\p pdptr corresponding to the mapped, pinned\n host buffer \\p p allocated by ::cuMemHostAlloc.\n\n ::cuMemHostGetDevicePointer() will fail if the ::CU_MEMHOSTALLOC_DEVICEMAP\n flag was not specified at the time the memory was allocated, or if the\n function is called on a GPU that does not support mapped pinned memory.\n\n For devices that have a non-zero value for the device attribute\n ::CU_DEVICE_ATTRIBUTE_CAN_USE_HOST_POINTER_FOR_REGISTERED_MEM, the memory\n can also be accessed from the device using the host pointer \\p p.\n The device pointer returned by ::cuMemHostGetDevicePointer() may or may not\n match the original host pointer \\p p and depends on the devices visible to the\n application. If all devices visible to the application have a non-zero value for the\n device attribute, the device pointer returned by ::cuMemHostGetDevicePointer()\n will match the original pointer \\p p. If any device visible to the application\n has a zero value for the device attribute, the device pointer returned by\n ::cuMemHostGetDevicePointer() will not match the original host pointer \\p p,\n but it will be suitable for use on all devices provided Unified Virtual Addressing\n is enabled. In such systems, it is valid to access the memory using either pointer\n on devices that have a non-zero value for the device attribute. Note however that\n such devices should access the memory using only one of the two pointers and not both.\n\n \\p Flags provides for future releases. For now, it must be set to 0.\n\n \\param pdptr - Returned device pointer\n \\param p     - Host pointer\n \\param Flags - Options (must be 0)\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemsetD2D8, ::cuMemsetD2D16,\n ::cuMemsetD2D32, ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD32,\n ::cudaHostGetDevicePointer*/\n    fn cuMemHostGetDevicePointer_v2(\n        pdptr: *mut cuda_types::cuda::CUdeviceptr,\n        p: *mut ::core::ffi::c_void,\n        Flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Passes back flags that were used for a pinned allocation\n\n Passes back the flags \\p pFlags that were specified when allocating\n the pinned host buffer \\p p allocated by ::cuMemHostAlloc.\n\n ::cuMemHostGetFlags() will fail if the pointer does not reside in\n an allocation performed by ::cuMemAllocHost() or ::cuMemHostAlloc().\n\n \\param pFlags - Returned flags word\n \\param p     - Host pointer\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa\n ::cuMemAllocHost,\n ::cuMemHostAlloc,\n ::cudaHostGetFlags*/\n    fn cuMemHostGetFlags(\n        pFlags: *mut ::core::ffi::c_uint,\n        p: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Allocates memory that will be automatically managed by the Unified Memory system\n\n Allocates \\p bytesize bytes of managed memory on the device and returns in\n \\p *dptr a pointer to the allocated memory. If the device doesn't support\n allocating managed memory, ::CUDA_ERROR_NOT_SUPPORTED is returned. Support\n for managed memory can be queried using the device attribute\n ::CU_DEVICE_ATTRIBUTE_MANAGED_MEMORY. The allocated memory is suitably\n aligned for any kind of variable. The memory is not cleared. If \\p bytesize\n is 0, ::cuMemAllocManaged returns ::CUDA_ERROR_INVALID_VALUE. The pointer\n is valid on the CPU and on all GPUs in the system that support managed memory.\n All accesses to this pointer must obey the Unified Memory programming model.\n\n \\p flags specifies the default stream association for this allocation.\n \\p flags must be one of ::CU_MEM_ATTACH_GLOBAL or ::CU_MEM_ATTACH_HOST. If\n ::CU_MEM_ATTACH_GLOBAL is specified, then this memory is accessible from\n any stream on any device. If ::CU_MEM_ATTACH_HOST is specified, then the\n allocation should not be accessed from devices that have a zero value for the\n device attribute ::CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS; an explicit call to\n ::cuStreamAttachMemAsync will be required to enable access on such devices.\n\n If the association is later changed via ::cuStreamAttachMemAsync to\n a single stream, the default association as specified during ::cuMemAllocManaged\n is restored when that stream is destroyed. For __managed__ variables, the\n default association is always ::CU_MEM_ATTACH_GLOBAL. Note that destroying a\n stream is an asynchronous operation, and as a result, the change to default\n association won't happen until all work in the stream has completed.\n\n Memory allocated with ::cuMemAllocManaged should be released with ::cuMemFree.\n\n Device memory oversubscription is possible for GPUs that have a non-zero value for the\n device attribute ::CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS. Managed memory on\n such GPUs may be evicted from device memory to host memory at any time by the Unified\n Memory driver in order to make room for other allocations.\n\n In a system where all GPUs have a non-zero value for the device attribute\n ::CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS, managed memory may not be populated when this\n API returns and instead may be populated on access. In such systems, managed memory can\n migrate to any processor's memory at any time. The Unified Memory driver will employ heuristics to\n maintain data locality and prevent excessive page faults to the extent possible. The application\n can also guide the driver about memory usage patterns via ::cuMemAdvise. The application\n can also explicitly migrate memory to a desired processor's memory via\n ::cuMemPrefetchAsync.\n\n In a multi-GPU system where all of the GPUs have a zero value for the device attribute\n ::CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS and all the GPUs have peer-to-peer support\n with each other, the physical storage for managed memory is created on the GPU which is active\n at the time ::cuMemAllocManaged is called. All other GPUs will reference the data at reduced\n bandwidth via peer mappings over the PCIe bus. The Unified Memory driver does not migrate\n memory among such GPUs.\n\n In a multi-GPU system where not all GPUs have peer-to-peer support with each other and\n where the value of the device attribute ::CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS\n is zero for at least one of those GPUs, the location chosen for physical storage of managed\n memory is system-dependent.\n - On Linux, the location chosen will be device memory as long as the current set of active\n contexts are on devices that either have peer-to-peer support with each other or have a\n non-zero value for the device attribute ::CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS.\n If there is an active context on a GPU that does not have a non-zero value for that device\n attribute and it does not have peer-to-peer support with the other devices that have active\n contexts on them, then the location for physical storage will be 'zero-copy' or host memory.\n Note that this means that managed memory that is located in device memory is migrated to\n host memory if a new context is created on a GPU that doesn't have a non-zero value for\n the device attribute and does not support peer-to-peer with at least one of the other devices\n that has an active context. This in turn implies that context creation may fail if there is\n insufficient host memory to migrate all managed allocations.\n - On Windows, the physical storage is always created in 'zero-copy' or host memory.\n All GPUs will reference the data at reduced bandwidth over the PCIe bus. In these\n circumstances, use of the environment variable CUDA_VISIBLE_DEVICES is recommended to\n restrict CUDA to only use those GPUs that have peer-to-peer support.\n Alternatively, users can also set CUDA_MANAGED_FORCE_DEVICE_ALLOC to a\n non-zero value to force the driver to always use device memory for physical storage.\n When this environment variable is set to a non-zero value, all contexts created in\n that process on devices that support managed memory have to be peer-to-peer compatible\n with each other. Context creation will fail if a context is created on a device that\n supports managed memory and is not peer-to-peer compatible with any of the other\n managed memory supporting devices on which contexts were previously created, even if\n those contexts have been destroyed. These environment variables are described\n in the CUDA programming guide under the \"CUDA environment variables\" section.\n - On ARM, managed memory is not available on discrete gpu with Drive PX-2.\n\n \\param dptr     - Returned device pointer\n \\param bytesize - Requested allocation size in bytes\n \\param flags    - Must be one of ::CU_MEM_ATTACH_GLOBAL or ::CU_MEM_ATTACH_HOST\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_NOT_SUPPORTED,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_OUT_OF_MEMORY\n \\notefnerr\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D16,\n ::cuMemsetD2D32, ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD32,\n ::cuDeviceGetAttribute, ::cuStreamAttachMemAsync,\n ::cudaMallocManaged*/\n    fn cuMemAllocManaged(\n        dptr: *mut cuda_types::cuda::CUdeviceptr,\n        bytesize: usize,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Registers a callback function to receive async notifications\n\n Registers \\p callbackFunc to receive async notifications.\n\n The \\p userData parameter is passed to the callback function at async notification time.\n Likewise, \\p callback is also passed to the callback function to distinguish between\n multiple registered callbacks.\n\n The callback function being registered should be designed to return quickly (~10ms).\n Any long running tasks should be queued for execution on an application thread.\n\n Callbacks may not call cuDeviceRegisterAsyncNotification or cuDeviceUnregisterAsyncNotification.\n Doing so will result in ::CUDA_ERROR_NOT_PERMITTED. Async notification callbacks execute\n in an undefined order and may be serialized.\n\n Returns in \\p *callback a handle representing the registered callback instance.\n\n \\param device - The device on which to register the callback\n \\param callbackFunc - The function to register as a callback\n \\param userData - A generic pointer to user data. This is passed into the callback function.\n \\param callback - A handle representing the registered callback instance\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_NOT_SUPPORTED,\n ::CUDA_ERROR_INVALID_DEVICE,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_PERMITTED,\n ::CUDA_ERROR_UNKNOWN\n \\notefnerr\n\n \\sa\n ::cuDeviceUnregisterAsyncNotification*/\n    fn cuDeviceRegisterAsyncNotification(\n        device: cuda_types::cuda::CUdevice,\n        callbackFunc: cuda_types::cuda::CUasyncCallback,\n        userData: *mut ::core::ffi::c_void,\n        callback: *mut cuda_types::cuda::CUasyncCallbackHandle,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Unregisters an async notification callback\n\n Unregisters \\p callback so that the corresponding callback function will stop receiving\n async notifications.\n\n \\param device - The device from which to remove \\p callback.\n \\param callback - The callback instance to unregister from receiving async notifications.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_NOT_SUPPORTED,\n ::CUDA_ERROR_INVALID_DEVICE,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_PERMITTED,\n ::CUDA_ERROR_UNKNOWN\n \\notefnerr\n\n \\sa\n ::cuDeviceRegisterAsyncNotification*/\n    fn cuDeviceUnregisterAsyncNotification(\n        device: cuda_types::cuda::CUdevice,\n        callback: cuda_types::cuda::CUasyncCallbackHandle,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a handle to a compute device\n\n Returns in \\p *device a device handle given a PCI bus ID string.\n\n \\param dev      - Returned device handle\n\n \\param pciBusId - String in one of the following forms:\n [domain]:[bus]:[device].[function]\n [domain]:[bus]:[device]\n [bus]:[device].[function]\n where \\p domain, \\p bus, \\p device, and \\p function are all hexadecimal values\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE\n \\notefnerr\n\n \\sa\n ::cuDeviceGet,\n ::cuDeviceGetAttribute,\n ::cuDeviceGetPCIBusId,\n ::cudaDeviceGetByPCIBusId*/\n    fn cuDeviceGetByPCIBusId(\n        dev: *mut cuda_types::cuda::CUdevice,\n        pciBusId: *const ::core::ffi::c_char,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a PCI Bus Id string for the device\n\n Returns an ASCII string identifying the device \\p dev in the NULL-terminated\n string pointed to by \\p pciBusId. \\p len specifies the maximum length of the\n string that may be returned.\n\n \\param pciBusId - Returned identifier string for the device in the following format\n [domain]:[bus]:[device].[function]\n where \\p domain, \\p bus, \\p device, and \\p function are all hexadecimal values.\n pciBusId should be large enough to store 13 characters including the NULL-terminator.\n\n \\param len      - Maximum length of string to store in \\p name\n\n \\param dev      - Device to get identifier string for\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE\n \\notefnerr\n\n \\sa\n ::cuDeviceGet,\n ::cuDeviceGetAttribute,\n ::cuDeviceGetByPCIBusId,\n ::cudaDeviceGetPCIBusId*/\n    fn cuDeviceGetPCIBusId(\n        pciBusId: *mut ::core::ffi::c_char,\n        len: ::core::ffi::c_int,\n        dev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Gets an interprocess handle for a previously allocated event\n\n Takes as input a previously allocated event. This event must have been\n created with the ::CU_EVENT_INTERPROCESS and ::CU_EVENT_DISABLE_TIMING\n flags set. This opaque handle may be copied into other processes and\n opened with ::cuIpcOpenEventHandle to allow efficient hardware\n synchronization between GPU work in different processes.\n\n After the event has been opened in the importing process,\n ::cuEventRecord, ::cuEventSynchronize, ::cuStreamWaitEvent and\n ::cuEventQuery may be used in either process. Performing operations\n on the imported event after the exported event has been freed\n with ::cuEventDestroy will result in undefined behavior.\n\n IPC functionality is restricted to devices with support for unified\n addressing on Linux and Windows operating systems.\n IPC functionality on Windows is supported for compatibility purposes\n but not recommended as it comes with performance cost.\n Users can test their device for IPC functionality by calling\n ::cuDeviceGetAttribute with ::CU_DEVICE_ATTRIBUTE_IPC_EVENT_SUPPORTED\n\n \\param pHandle - Pointer to a user allocated CUipcEventHandle\n                    in which to return the opaque event handle\n \\param event   - Event allocated with ::CU_EVENT_INTERPROCESS and\n                    ::CU_EVENT_DISABLE_TIMING flags.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_OUT_OF_MEMORY,\n ::CUDA_ERROR_MAP_FAILED,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuEventCreate,\n ::cuEventDestroy,\n ::cuEventSynchronize,\n ::cuEventQuery,\n ::cuStreamWaitEvent,\n ::cuIpcOpenEventHandle,\n ::cuIpcGetMemHandle,\n ::cuIpcOpenMemHandle,\n ::cuIpcCloseMemHandle,\n ::cudaIpcGetEventHandle*/\n    fn cuIpcGetEventHandle(\n        pHandle: *mut cuda_types::cuda::CUipcEventHandle,\n        event: cuda_types::cuda::CUevent,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Opens an interprocess event handle for use in the current process\n\n Opens an interprocess event handle exported from another process with\n ::cuIpcGetEventHandle. This function returns a ::CUevent that behaves like\n a locally created event with the ::CU_EVENT_DISABLE_TIMING flag specified.\n This event must be freed with ::cuEventDestroy.\n\n Performing operations on the imported event after the exported event has\n been freed with ::cuEventDestroy will result in undefined behavior.\n\n IPC functionality is restricted to devices with support for unified\n addressing on Linux and Windows operating systems.\n IPC functionality on Windows is supported for compatibility purposes\n but not recommended as it comes with performance cost.\n Users can test their device for IPC functionality by calling\n ::cuapiDeviceGetAttribute with ::CU_DEVICE_ATTRIBUTE_IPC_EVENT_SUPPORTED\n\n \\param phEvent - Returns the imported event\n \\param handle  - Interprocess handle to open\n\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_MAP_FAILED,\n ::CUDA_ERROR_PEER_ACCESS_UNSUPPORTED,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuEventCreate,\n ::cuEventDestroy,\n ::cuEventSynchronize,\n ::cuEventQuery,\n ::cuStreamWaitEvent,\n ::cuIpcGetEventHandle,\n ::cuIpcGetMemHandle,\n ::cuIpcOpenMemHandle,\n ::cuIpcCloseMemHandle,\n ::cudaIpcOpenEventHandle*/\n    fn cuIpcOpenEventHandle(\n        phEvent: *mut cuda_types::cuda::CUevent,\n        handle: cuda_types::cuda::CUipcEventHandle,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Gets an interprocess memory handle for an existing device memory\n allocation\n\n Takes a pointer to the base of an existing device memory allocation created\n with ::cuMemAlloc and exports it for use in another process. This is a\n lightweight operation and may be called multiple times on an allocation\n without adverse effects.\n\n If a region of memory is freed with ::cuMemFree and a subsequent call\n to ::cuMemAlloc returns memory with the same device address,\n ::cuIpcGetMemHandle will return a unique handle for the\n new memory.\n\n IPC functionality is restricted to devices with support for unified\n addressing on Linux and Windows operating systems.\n IPC functionality on Windows is supported for compatibility purposes\n but not recommended as it comes with performance cost.\n Users can test their device for IPC functionality by calling\n ::cuapiDeviceGetAttribute with ::CU_DEVICE_ATTRIBUTE_IPC_EVENT_SUPPORTED\n\n \\param pHandle - Pointer to user allocated ::CUipcMemHandle to return\n                    the handle in.\n \\param dptr    - Base pointer to previously allocated device memory\n\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_OUT_OF_MEMORY,\n ::CUDA_ERROR_MAP_FAILED,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuMemAlloc,\n ::cuMemFree,\n ::cuIpcGetEventHandle,\n ::cuIpcOpenEventHandle,\n ::cuIpcOpenMemHandle,\n ::cuIpcCloseMemHandle,\n ::cudaIpcGetMemHandle*/\n    fn cuIpcGetMemHandle(\n        pHandle: *mut cuda_types::cuda::CUipcMemHandle,\n        dptr: cuda_types::cuda::CUdeviceptr,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Opens an interprocess memory handle exported from another process\n and returns a device pointer usable in the local process.\n\n Maps memory exported from another process with ::cuIpcGetMemHandle into\n the current device address space. For contexts on different devices\n ::cuIpcOpenMemHandle can attempt to enable peer access between the\n devices as if the user called ::cuCtxEnablePeerAccess. This behavior is\n controlled by the ::CU_IPC_MEM_LAZY_ENABLE_PEER_ACCESS flag.\n ::cuDeviceCanAccessPeer can determine if a mapping is possible.\n\n Contexts that may open ::CUipcMemHandles are restricted in the following way.\n ::CUipcMemHandles from each ::CUdevice in a given process may only be opened\n by one ::CUcontext per ::CUdevice per other process.\n\n If the memory handle has already been opened by the current context, the\n reference count on the handle is incremented by 1 and the existing device pointer\n is returned.\n\n Memory returned from ::cuIpcOpenMemHandle must be freed with\n ::cuIpcCloseMemHandle.\n\n Calling ::cuMemFree on an exported memory region before calling\n ::cuIpcCloseMemHandle in the importing context will result in undefined\n behavior.\n\n IPC functionality is restricted to devices with support for unified\n addressing on Linux and Windows operating systems.\n IPC functionality on Windows is supported for compatibility purposes\n but not recommended as it comes with performance cost.\n Users can test their device for IPC functionality by calling\n ::cuapiDeviceGetAttribute with ::CU_DEVICE_ATTRIBUTE_IPC_EVENT_SUPPORTED\n\n \\param pdptr  - Returned device pointer\n \\param handle - ::CUipcMemHandle to open\n \\param Flags  - Flags for this operation. Must be specified as ::CU_IPC_MEM_LAZY_ENABLE_PEER_ACCESS\n\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_MAP_FAILED,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_TOO_MANY_PEERS,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\note No guarantees are made about the address returned in \\p *pdptr.\n In particular, multiple processes may not receive the same address for the same \\p handle.\n\n \\sa\n ::cuMemAlloc,\n ::cuMemFree,\n ::cuIpcGetEventHandle,\n ::cuIpcOpenEventHandle,\n ::cuIpcGetMemHandle,\n ::cuIpcCloseMemHandle,\n ::cuCtxEnablePeerAccess,\n ::cuDeviceCanAccessPeer,\n ::cudaIpcOpenMemHandle*/\n    fn cuIpcOpenMemHandle_v2(\n        pdptr: *mut cuda_types::cuda::CUdeviceptr,\n        handle: cuda_types::cuda::CUipcMemHandle,\n        Flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Attempts to close memory mapped with ::cuIpcOpenMemHandle\n\n Decrements the reference count of the memory returned by ::cuIpcOpenMemHandle by 1.\n When the reference count reaches 0, this API unmaps the memory. The original allocation\n in the exporting process as well as imported mappings in other processes\n will be unaffected.\n\n Any resources used to enable peer access will be freed if this is the\n last mapping using them.\n\n IPC functionality is restricted to devices with support for unified\n addressing on Linux and Windows operating systems.\n IPC functionality on Windows is supported for compatibility purposes\n but not recommended as it comes with performance cost.\n Users can test their device for IPC functionality by calling\n ::cuapiDeviceGetAttribute with ::CU_DEVICE_ATTRIBUTE_IPC_EVENT_SUPPORTED\n\n \\param dptr - Device pointer returned by ::cuIpcOpenMemHandle\n\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_MAP_FAILED,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_VALUE\n \\sa\n ::cuMemAlloc,\n ::cuMemFree,\n ::cuIpcGetEventHandle,\n ::cuIpcOpenEventHandle,\n ::cuIpcGetMemHandle,\n ::cuIpcOpenMemHandle,\n ::cudaIpcCloseMemHandle*/\n    fn cuIpcCloseMemHandle(\n        dptr: cuda_types::cuda::CUdeviceptr,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Registers an existing host memory range for use by CUDA\n\n Page-locks the memory range specified by \\p p and \\p bytesize and maps it\n for the device(s) as specified by \\p Flags. This memory range also is added\n to the same tracking mechanism as ::cuMemHostAlloc to automatically accelerate\n calls to functions such as ::cuMemcpyHtoD(). Since the memory can be accessed\n directly by the device, it can be read or written with much higher bandwidth\n than pageable memory that has not been registered.  Page-locking excessive\n amounts of memory may degrade system performance, since it reduces the amount\n of memory available to the system for paging. As a result, this function is\n best used sparingly to register staging areas for data exchange between\n host and device.\n\n On systems where ::CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS_USES_HOST_PAGE_TABLES\n is true, ::cuMemHostRegister will not page-lock the memory range specified\n by \\p ptr but only populate unpopulated pages.\n\n The \\p Flags parameter enables different options to be specified that\n affect the allocation, as follows.\n\n - ::CU_MEMHOSTREGISTER_PORTABLE: The memory returned by this call will be\n   considered as pinned memory by all CUDA contexts, not just the one that\n   performed the allocation.\n\n - ::CU_MEMHOSTREGISTER_DEVICEMAP: Maps the allocation into the CUDA address\n   space. The device pointer to the memory may be obtained by calling\n   ::cuMemHostGetDevicePointer().\n\n - ::CU_MEMHOSTREGISTER_IOMEMORY: The pointer is treated as pointing to some\n   I/O memory space, e.g. the PCI Express resource of a 3rd party device.\n\n - ::CU_MEMHOSTREGISTER_READ_ONLY: The pointer is treated as pointing to memory\n   that is considered read-only by the device.  On platforms without\n   ::CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS_USES_HOST_PAGE_TABLES, this flag is\n   required in order to register memory mapped to the CPU as read-only.  Support\n   for the use of this flag can be queried from the device attribute\n   ::CU_DEVICE_ATTRIBUTE_READ_ONLY_HOST_REGISTER_SUPPORTED.  Using this flag with\n   a current context associated with a device that does not have this attribute\n   set will cause ::cuMemHostRegister to error with CUDA_ERROR_NOT_SUPPORTED.\n\n All of these flags are orthogonal to one another: a developer may page-lock\n memory that is portable or mapped with no restrictions.\n\n The ::CU_MEMHOSTREGISTER_DEVICEMAP flag may be specified on CUDA contexts for\n devices that do not support mapped pinned memory. The failure is deferred\n to ::cuMemHostGetDevicePointer() because the memory may be mapped into\n other CUDA contexts via the ::CU_MEMHOSTREGISTER_PORTABLE flag.\n\n For devices that have a non-zero value for the device attribute\n ::CU_DEVICE_ATTRIBUTE_CAN_USE_HOST_POINTER_FOR_REGISTERED_MEM, the memory\n can also be accessed from the device using the host pointer \\p p.\n The device pointer returned by ::cuMemHostGetDevicePointer() may or may not\n match the original host pointer \\p ptr and depends on the devices visible to the\n application. If all devices visible to the application have a non-zero value for the\n device attribute, the device pointer returned by ::cuMemHostGetDevicePointer()\n will match the original pointer \\p ptr. If any device visible to the application\n has a zero value for the device attribute, the device pointer returned by\n ::cuMemHostGetDevicePointer() will not match the original host pointer \\p ptr,\n but it will be suitable for use on all devices provided Unified Virtual Addressing\n is enabled. In such systems, it is valid to access the memory using either pointer\n on devices that have a non-zero value for the device attribute. Note however that\n such devices should access the memory using only of the two pointers and not both.\n\n The memory page-locked by this function must be unregistered with\n ::cuMemHostUnregister().\n\n \\param p        - Host pointer to memory to page-lock\n \\param bytesize - Size in bytes of the address range to page-lock\n \\param Flags    - Flags for allocation request\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_OUT_OF_MEMORY,\n ::CUDA_ERROR_HOST_MEMORY_ALREADY_REGISTERED,\n ::CUDA_ERROR_NOT_PERMITTED,\n ::CUDA_ERROR_NOT_SUPPORTED\n \\notefnerr\n\n \\sa\n ::cuMemHostUnregister,\n ::cuMemHostGetFlags,\n ::cuMemHostGetDevicePointer,\n ::cudaHostRegister*/\n    fn cuMemHostRegister_v2(\n        p: *mut ::core::ffi::c_void,\n        bytesize: usize,\n        Flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Unregisters a memory range that was registered with cuMemHostRegister.\n\n Unmaps the memory range whose base address is specified by \\p p, and makes\n it pageable again.\n\n The base address must be the same one specified to ::cuMemHostRegister().\n\n \\param p - Host pointer to memory to unregister\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_OUT_OF_MEMORY,\n ::CUDA_ERROR_HOST_MEMORY_NOT_REGISTERED,\n \\notefnerr\n\n \\sa\n ::cuMemHostRegister,\n ::cudaHostUnregister*/\n    fn cuMemHostUnregister(p: *mut ::core::ffi::c_void) -> cuda_types::cuda::CUresult;\n    /** \\brief Copies memory\n\n Copies data between two pointers.\n \\p dst and \\p src are base pointers of the destination and source, respectively.\n \\p ByteCount specifies the number of bytes to copy.\n Note that this function infers the type of the transfer (host to host, host to\n   device, device to device, or device to host) from the pointer values.  This\n   function is only allowed in contexts which support unified addressing.\n\n \\param dst - Destination unified virtual address space pointer\n \\param src - Source unified virtual address space pointer\n \\param ByteCount - Size of memory copy in bytes\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_sync\n \\note_memcpy\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D16,\n ::cuMemsetD2D32, ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD32,\n ::cudaMemcpy,\n ::cudaMemcpyToSymbol,\n ::cudaMemcpyFromSymbol*/\n    fn cuMemcpy_ptds(\n        dst: cuda_types::cuda::CUdeviceptr,\n        src: cuda_types::cuda::CUdeviceptr,\n        ByteCount: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Copies device memory between two contexts\n\n Copies from device memory in one context to device memory in another\n context. \\p dstDevice is the base device pointer of the destination memory\n and \\p dstContext is the destination context.  \\p srcDevice is the base\n device pointer of the source memory and \\p srcContext is the source pointer.\n \\p ByteCount specifies the number of bytes to copy.\n\n \\param dstDevice  - Destination device pointer\n \\param dstContext - Destination context\n \\param srcDevice  - Source device pointer\n \\param srcContext - Source context\n \\param ByteCount  - Size of memory copy in bytes\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_sync\n\n \\sa ::cuMemcpyDtoD, ::cuMemcpy3DPeer, ::cuMemcpyDtoDAsync, ::cuMemcpyPeerAsync,\n ::cuMemcpy3DPeerAsync,\n ::cudaMemcpyPeer*/\n    fn cuMemcpyPeer_ptds(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        dstContext: cuda_types::cuda::CUcontext,\n        srcDevice: cuda_types::cuda::CUdeviceptr,\n        srcContext: cuda_types::cuda::CUcontext,\n        ByteCount: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Copies memory from Host to Device\n\n Copies from host memory to device memory. \\p dstDevice and \\p srcHost are\n the base addresses of the destination and source, respectively. \\p ByteCount\n specifies the number of bytes to copy.\n\n \\param dstDevice - Destination device pointer\n \\param srcHost   - Source host pointer\n \\param ByteCount - Size of memory copy in bytes\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_sync\n \\note_memcpy\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D16,\n ::cuMemsetD2D32, ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD32,\n ::cudaMemcpy,\n ::cudaMemcpyToSymbol*/\n    fn cuMemcpyHtoD_v2_ptds(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        srcHost: *const ::core::ffi::c_void,\n        ByteCount: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Copies memory from Device to Host\n\n Copies from device to host memory. \\p dstHost and \\p srcDevice specify the\n base pointers of the destination and source, respectively. \\p ByteCount\n specifies the number of bytes to copy.\n\n \\param dstHost   - Destination host pointer\n \\param srcDevice - Source device pointer\n \\param ByteCount - Size of memory copy in bytes\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_sync\n \\note_memcpy\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D16,\n ::cuMemsetD2D32, ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD32,\n ::cudaMemcpy,\n ::cudaMemcpyFromSymbol*/\n    fn cuMemcpyDtoH_v2_ptds(\n        dstHost: *mut ::core::ffi::c_void,\n        srcDevice: cuda_types::cuda::CUdeviceptr,\n        ByteCount: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Copies memory from Device to Device\n\n Copies from device memory to device memory. \\p dstDevice and \\p srcDevice\n are the base pointers of the destination and source, respectively.\n \\p ByteCount specifies the number of bytes to copy.\n\n \\param dstDevice - Destination device pointer\n \\param srcDevice - Source device pointer\n \\param ByteCount - Size of memory copy in bytes\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_sync\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D16,\n ::cuMemsetD2D32, ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD32,\n ::cudaMemcpy,\n ::cudaMemcpyToSymbol,\n ::cudaMemcpyFromSymbol*/\n    fn cuMemcpyDtoD_v2_ptds(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        srcDevice: cuda_types::cuda::CUdeviceptr,\n        ByteCount: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Copies memory from Device to Array\n\n Copies from device memory to a 1D CUDA array. \\p dstArray and \\p dstOffset\n specify the CUDA array handle and starting index of the destination data.\n \\p srcDevice specifies the base pointer of the source. \\p ByteCount\n specifies the number of bytes to copy.\n\n \\param dstArray  - Destination array\n \\param dstOffset - Offset in bytes of destination array\n \\param srcDevice - Source device pointer\n \\param ByteCount - Size of memory copy in bytes\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_sync\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D16,\n ::cuMemsetD2D32, ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD32,\n ::cudaMemcpyToArray*/\n    fn cuMemcpyDtoA_v2_ptds(\n        dstArray: cuda_types::cuda::CUarray,\n        dstOffset: usize,\n        srcDevice: cuda_types::cuda::CUdeviceptr,\n        ByteCount: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Copies memory from Array to Device\n\n Copies from one 1D CUDA array to device memory. \\p dstDevice specifies the\n base pointer of the destination and must be naturally aligned with the CUDA\n array elements. \\p srcArray and \\p srcOffset specify the CUDA array handle\n and the offset in bytes into the array where the copy is to begin.\n \\p ByteCount specifies the number of bytes to copy and must be evenly\n divisible by the array element size.\n\n \\param dstDevice - Destination device pointer\n \\param srcArray  - Source array\n \\param srcOffset - Offset in bytes of source array\n \\param ByteCount - Size of memory copy in bytes\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_sync\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D16,\n ::cuMemsetD2D32, ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD32,\n ::cudaMemcpyFromArray*/\n    fn cuMemcpyAtoD_v2_ptds(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        srcArray: cuda_types::cuda::CUarray,\n        srcOffset: usize,\n        ByteCount: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Copies memory from Host to Array\n\n Copies from host memory to a 1D CUDA array. \\p dstArray and \\p dstOffset\n specify the CUDA array handle and starting offset in bytes of the destination\n data.  \\p pSrc specifies the base address of the source. \\p ByteCount specifies\n the number of bytes to copy.\n\n \\param dstArray  - Destination array\n \\param dstOffset - Offset in bytes of destination array\n \\param srcHost   - Source host pointer\n \\param ByteCount - Size of memory copy in bytes\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_sync\n \\note_memcpy\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D16,\n ::cuMemsetD2D32, ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD32,\n ::cudaMemcpyToArray*/\n    fn cuMemcpyHtoA_v2_ptds(\n        dstArray: cuda_types::cuda::CUarray,\n        dstOffset: usize,\n        srcHost: *const ::core::ffi::c_void,\n        ByteCount: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Copies memory from Array to Host\n\n Copies from one 1D CUDA array to host memory. \\p dstHost specifies the base\n pointer of the destination. \\p srcArray and \\p srcOffset specify the CUDA\n array handle and starting offset in bytes of the source data.\n \\p ByteCount specifies the number of bytes to copy.\n\n \\param dstHost   - Destination device pointer\n \\param srcArray  - Source array\n \\param srcOffset - Offset in bytes of source array\n \\param ByteCount - Size of memory copy in bytes\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_sync\n \\note_memcpy\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D16,\n ::cuMemsetD2D32, ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD32,\n ::cudaMemcpyFromArray*/\n    fn cuMemcpyAtoH_v2_ptds(\n        dstHost: *mut ::core::ffi::c_void,\n        srcArray: cuda_types::cuda::CUarray,\n        srcOffset: usize,\n        ByteCount: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Copies memory from Array to Array\n\n Copies from one 1D CUDA array to another. \\p dstArray and \\p srcArray\n specify the handles of the destination and source CUDA arrays for the copy,\n respectively. \\p dstOffset and \\p srcOffset specify the destination and\n source offsets in bytes into the CUDA arrays. \\p ByteCount is the number of\n bytes to be copied. The size of the elements in the CUDA arrays need not be\n the same format, but the elements must be the same size; and count must be\n evenly divisible by that size.\n\n \\param dstArray  - Destination array\n \\param dstOffset - Offset in bytes of destination array\n \\param srcArray  - Source array\n \\param srcOffset - Offset in bytes of source array\n \\param ByteCount - Size of memory copy in bytes\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_sync\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D16,\n ::cuMemsetD2D32, ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD32,\n ::cudaMemcpyArrayToArray*/\n    fn cuMemcpyAtoA_v2_ptds(\n        dstArray: cuda_types::cuda::CUarray,\n        dstOffset: usize,\n        srcArray: cuda_types::cuda::CUarray,\n        srcOffset: usize,\n        ByteCount: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Copies memory for 2D arrays\n\n Perform a 2D memory copy according to the parameters specified in \\p pCopy.\n The ::CUDA_MEMCPY2D structure is defined as:\n\n \\code\ntypedef struct CUDA_MEMCPY2D_st {\nunsigned int srcXInBytes, srcY;\nCUmemorytype srcMemoryType;\nconst void *srcHost;\nCUdeviceptr srcDevice;\nCUarray srcArray;\nunsigned int srcPitch;\n\nunsigned int dstXInBytes, dstY;\nCUmemorytype dstMemoryType;\nvoid *dstHost;\nCUdeviceptr dstDevice;\nCUarray dstArray;\nunsigned int dstPitch;\n\nunsigned int WidthInBytes;\nunsigned int Height;\n} CUDA_MEMCPY2D;\n \\endcode\n where:\n - ::srcMemoryType and ::dstMemoryType specify the type of memory of the\n   source and destination, respectively; ::CUmemorytype_enum is defined as:\n\n \\code\ntypedef enum CUmemorytype_enum {\nCU_MEMORYTYPE_HOST = 0x01,\nCU_MEMORYTYPE_DEVICE = 0x02,\nCU_MEMORYTYPE_ARRAY = 0x03,\nCU_MEMORYTYPE_UNIFIED = 0x04\n} CUmemorytype;\n \\endcode\n\n \\par\n If ::srcMemoryType is ::CU_MEMORYTYPE_UNIFIED, ::srcDevice and ::srcPitch\n   specify the (unified virtual address space) base address of the source data\n   and the bytes per row to apply.  ::srcArray is ignored.\n This value may be used only if unified addressing is supported in the calling\n   context.\n\n \\par\n If ::srcMemoryType is ::CU_MEMORYTYPE_HOST, ::srcHost and ::srcPitch\n specify the (host) base address of the source data and the bytes per row to\n apply. ::srcArray is ignored.\n\n \\par\n If ::srcMemoryType is ::CU_MEMORYTYPE_DEVICE, ::srcDevice and ::srcPitch\n specify the (device) base address of the source data and the bytes per row\n to apply. ::srcArray is ignored.\n\n \\par\n If ::srcMemoryType is ::CU_MEMORYTYPE_ARRAY, ::srcArray specifies the\n handle of the source data. ::srcHost, ::srcDevice and ::srcPitch are\n ignored.\n\n \\par\n If ::dstMemoryType is ::CU_MEMORYTYPE_HOST, ::dstHost and ::dstPitch\n specify the (host) base address of the destination data and the bytes per\n row to apply. ::dstArray is ignored.\n\n \\par\n If ::dstMemoryType is ::CU_MEMORYTYPE_UNIFIED, ::dstDevice and ::dstPitch\n   specify the (unified virtual address space) base address of the source data\n   and the bytes per row to apply.  ::dstArray is ignored.\n This value may be used only if unified addressing is supported in the calling\n   context.\n\n \\par\n If ::dstMemoryType is ::CU_MEMORYTYPE_DEVICE, ::dstDevice and ::dstPitch\n specify the (device) base address of the destination data and the bytes per\n row to apply. ::dstArray is ignored.\n\n \\par\n If ::dstMemoryType is ::CU_MEMORYTYPE_ARRAY, ::dstArray specifies the\n handle of the destination data. ::dstHost, ::dstDevice and ::dstPitch are\n ignored.\n\n - ::srcXInBytes and ::srcY specify the base address of the source data for\n   the copy.\n\n \\par\n For host pointers, the starting address is\n \\code\nvoid* Start = (void*)((char*)srcHost+srcY*srcPitch + srcXInBytes);\n \\endcode\n\n \\par\n For device pointers, the starting address is\n \\code\nCUdeviceptr Start = srcDevice+srcY*srcPitch+srcXInBytes;\n \\endcode\n\n \\par\n For CUDA arrays, ::srcXInBytes must be evenly divisible by the array\n element size.\n\n - ::dstXInBytes and ::dstY specify the base address of the destination data\n   for the copy.\n\n \\par\n For host pointers, the base address is\n \\code\nvoid* dstStart = (void*)((char*)dstHost+dstY*dstPitch + dstXInBytes);\n \\endcode\n\n \\par\n For device pointers, the starting address is\n \\code\nCUdeviceptr dstStart = dstDevice+dstY*dstPitch+dstXInBytes;\n \\endcode\n\n \\par\n For CUDA arrays, ::dstXInBytes must be evenly divisible by the array\n element size.\n\n - ::WidthInBytes and ::Height specify the width (in bytes) and height of\n   the 2D copy being performed.\n - If specified, ::srcPitch must be greater than or equal to ::WidthInBytes +\n   ::srcXInBytes, and ::dstPitch must be greater than or equal to\n   ::WidthInBytes + dstXInBytes.\n\n \\par\n ::cuMemcpy2D() returns an error if any pitch is greater than the maximum\n allowed (::CU_DEVICE_ATTRIBUTE_MAX_PITCH). ::cuMemAllocPitch() passes back\n pitches that always work with ::cuMemcpy2D(). On intra-device memory copies\n (device to device, CUDA array to device, CUDA array to CUDA array),\n ::cuMemcpy2D() may fail for pitches not computed by ::cuMemAllocPitch().\n ::cuMemcpy2DUnaligned() does not have this restriction, but may run\n significantly slower in the cases where ::cuMemcpy2D() would have returned\n an error code.\n\n \\param pCopy - Parameters for the memory copy\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_sync\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D16,\n ::cuMemsetD2D32, ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD32,\n ::cudaMemcpy2D,\n ::cudaMemcpy2DToArray,\n ::cudaMemcpy2DFromArray*/\n    fn cuMemcpy2D_v2_ptds(\n        pCopy: *const cuda_types::cuda::CUDA_MEMCPY2D,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Copies memory for 2D arrays\n\n Perform a 2D memory copy according to the parameters specified in \\p pCopy.\n The ::CUDA_MEMCPY2D structure is defined as:\n\n \\code\ntypedef struct CUDA_MEMCPY2D_st {\nunsigned int srcXInBytes, srcY;\nCUmemorytype srcMemoryType;\nconst void *srcHost;\nCUdeviceptr srcDevice;\nCUarray srcArray;\nunsigned int srcPitch;\nunsigned int dstXInBytes, dstY;\nCUmemorytype dstMemoryType;\nvoid *dstHost;\nCUdeviceptr dstDevice;\nCUarray dstArray;\nunsigned int dstPitch;\nunsigned int WidthInBytes;\nunsigned int Height;\n} CUDA_MEMCPY2D;\n \\endcode\n where:\n - ::srcMemoryType and ::dstMemoryType specify the type of memory of the\n   source and destination, respectively; ::CUmemorytype_enum is defined as:\n\n \\code\ntypedef enum CUmemorytype_enum {\nCU_MEMORYTYPE_HOST = 0x01,\nCU_MEMORYTYPE_DEVICE = 0x02,\nCU_MEMORYTYPE_ARRAY = 0x03,\nCU_MEMORYTYPE_UNIFIED = 0x04\n} CUmemorytype;\n \\endcode\n\n \\par\n If ::srcMemoryType is ::CU_MEMORYTYPE_UNIFIED, ::srcDevice and ::srcPitch\n   specify the (unified virtual address space) base address of the source data\n   and the bytes per row to apply.  ::srcArray is ignored.\n This value may be used only if unified addressing is supported in the calling\n   context.\n\n \\par\n If ::srcMemoryType is ::CU_MEMORYTYPE_HOST, ::srcHost and ::srcPitch\n specify the (host) base address of the source data and the bytes per row to\n apply. ::srcArray is ignored.\n\n \\par\n If ::srcMemoryType is ::CU_MEMORYTYPE_DEVICE, ::srcDevice and ::srcPitch\n specify the (device) base address of the source data and the bytes per row\n to apply. ::srcArray is ignored.\n\n \\par\n If ::srcMemoryType is ::CU_MEMORYTYPE_ARRAY, ::srcArray specifies the\n handle of the source data. ::srcHost, ::srcDevice and ::srcPitch are\n ignored.\n\n \\par\n If ::dstMemoryType is ::CU_MEMORYTYPE_UNIFIED, ::dstDevice and ::dstPitch\n   specify the (unified virtual address space) base address of the source data\n   and the bytes per row to apply.  ::dstArray is ignored.\n This value may be used only if unified addressing is supported in the calling\n   context.\n\n \\par\n If ::dstMemoryType is ::CU_MEMORYTYPE_HOST, ::dstHost and ::dstPitch\n specify the (host) base address of the destination data and the bytes per\n row to apply. ::dstArray is ignored.\n\n \\par\n If ::dstMemoryType is ::CU_MEMORYTYPE_DEVICE, ::dstDevice and ::dstPitch\n specify the (device) base address of the destination data and the bytes per\n row to apply. ::dstArray is ignored.\n\n \\par\n If ::dstMemoryType is ::CU_MEMORYTYPE_ARRAY, ::dstArray specifies the\n handle of the destination data. ::dstHost, ::dstDevice and ::dstPitch are\n ignored.\n\n - ::srcXInBytes and ::srcY specify the base address of the source data for\n   the copy.\n\n \\par\n For host pointers, the starting address is\n \\code\nvoid* Start = (void*)((char*)srcHost+srcY*srcPitch + srcXInBytes);\n \\endcode\n\n \\par\n For device pointers, the starting address is\n \\code\nCUdeviceptr Start = srcDevice+srcY*srcPitch+srcXInBytes;\n \\endcode\n\n \\par\n For CUDA arrays, ::srcXInBytes must be evenly divisible by the array\n element size.\n\n - ::dstXInBytes and ::dstY specify the base address of the destination data\n   for the copy.\n\n \\par\n For host pointers, the base address is\n \\code\nvoid* dstStart = (void*)((char*)dstHost+dstY*dstPitch + dstXInBytes);\n \\endcode\n\n \\par\n For device pointers, the starting address is\n \\code\nCUdeviceptr dstStart = dstDevice+dstY*dstPitch+dstXInBytes;\n \\endcode\n\n \\par\n For CUDA arrays, ::dstXInBytes must be evenly divisible by the array\n element size.\n\n - ::WidthInBytes and ::Height specify the width (in bytes) and height of\n   the 2D copy being performed.\n - If specified, ::srcPitch must be greater than or equal to ::WidthInBytes +\n   ::srcXInBytes, and ::dstPitch must be greater than or equal to\n   ::WidthInBytes + dstXInBytes.\n\n \\par\n ::cuMemcpy2D() returns an error if any pitch is greater than the maximum\n allowed (::CU_DEVICE_ATTRIBUTE_MAX_PITCH). ::cuMemAllocPitch() passes back\n pitches that always work with ::cuMemcpy2D(). On intra-device memory copies\n (device to device, CUDA array to device, CUDA array to CUDA array),\n ::cuMemcpy2D() may fail for pitches not computed by ::cuMemAllocPitch().\n ::cuMemcpy2DUnaligned() does not have this restriction, but may run\n significantly slower in the cases where ::cuMemcpy2D() would have returned\n an error code.\n\n \\param pCopy - Parameters for the memory copy\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_sync\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D16,\n ::cuMemsetD2D32, ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD32,\n ::cudaMemcpy2D,\n ::cudaMemcpy2DToArray,\n ::cudaMemcpy2DFromArray*/\n    fn cuMemcpy2DUnaligned_v2_ptds(\n        pCopy: *const cuda_types::cuda::CUDA_MEMCPY2D,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Copies memory for 3D arrays\n\n Perform a 3D memory copy according to the parameters specified in\n \\p pCopy. The ::CUDA_MEMCPY3D structure is defined as:\n\n \\code\ntypedef struct CUDA_MEMCPY3D_st {\n\nunsigned int srcXInBytes, srcY, srcZ;\nunsigned int srcLOD;\nCUmemorytype srcMemoryType;\nconst void *srcHost;\nCUdeviceptr srcDevice;\nCUarray srcArray;\nunsigned int srcPitch;  // ignored when src is array\nunsigned int srcHeight; // ignored when src is array; may be 0 if Depth==1\n\nunsigned int dstXInBytes, dstY, dstZ;\nunsigned int dstLOD;\nCUmemorytype dstMemoryType;\nvoid *dstHost;\nCUdeviceptr dstDevice;\nCUarray dstArray;\nunsigned int dstPitch;  // ignored when dst is array\nunsigned int dstHeight; // ignored when dst is array; may be 0 if Depth==1\n\nunsigned int WidthInBytes;\nunsigned int Height;\nunsigned int Depth;\n} CUDA_MEMCPY3D;\n \\endcode\n where:\n - ::srcMemoryType and ::dstMemoryType specify the type of memory of the\n   source and destination, respectively; ::CUmemorytype_enum is defined as:\n\n \\code\ntypedef enum CUmemorytype_enum {\nCU_MEMORYTYPE_HOST = 0x01,\nCU_MEMORYTYPE_DEVICE = 0x02,\nCU_MEMORYTYPE_ARRAY = 0x03,\nCU_MEMORYTYPE_UNIFIED = 0x04\n} CUmemorytype;\n \\endcode\n\n \\par\n If ::srcMemoryType is ::CU_MEMORYTYPE_UNIFIED, ::srcDevice and ::srcPitch\n   specify the (unified virtual address space) base address of the source data\n   and the bytes per row to apply.  ::srcArray is ignored.\n This value may be used only if unified addressing is supported in the calling\n   context.\n\n \\par\n If ::srcMemoryType is ::CU_MEMORYTYPE_HOST, ::srcHost, ::srcPitch and\n ::srcHeight specify the (host) base address of the source data, the bytes\n per row, and the height of each 2D slice of the 3D array. ::srcArray is\n ignored.\n\n \\par\n If ::srcMemoryType is ::CU_MEMORYTYPE_DEVICE, ::srcDevice, ::srcPitch and\n ::srcHeight specify the (device) base address of the source data, the bytes\n per row, and the height of each 2D slice of the 3D array. ::srcArray is\n ignored.\n\n \\par\n If ::srcMemoryType is ::CU_MEMORYTYPE_ARRAY, ::srcArray specifies the\n handle of the source data. ::srcHost, ::srcDevice, ::srcPitch and\n ::srcHeight are ignored.\n\n \\par\n If ::dstMemoryType is ::CU_MEMORYTYPE_UNIFIED, ::dstDevice and ::dstPitch\n   specify the (unified virtual address space) base address of the source data\n   and the bytes per row to apply.  ::dstArray is ignored.\n This value may be used only if unified addressing is supported in the calling\n   context.\n\n \\par\n If ::dstMemoryType is ::CU_MEMORYTYPE_HOST, ::dstHost and ::dstPitch\n specify the (host) base address of the destination data, the bytes per row,\n and the height of each 2D slice of the 3D array. ::dstArray is ignored.\n\n \\par\n If ::dstMemoryType is ::CU_MEMORYTYPE_DEVICE, ::dstDevice and ::dstPitch\n specify the (device) base address of the destination data, the bytes per\n row, and the height of each 2D slice of the 3D array. ::dstArray is ignored.\n\n \\par\n If ::dstMemoryType is ::CU_MEMORYTYPE_ARRAY, ::dstArray specifies the\n handle of the destination data. ::dstHost, ::dstDevice, ::dstPitch and\n ::dstHeight are ignored.\n\n - ::srcXInBytes, ::srcY and ::srcZ specify the base address of the source\n   data for the copy.\n\n \\par\n For host pointers, the starting address is\n \\code\nvoid* Start = (void*)((char*)srcHost+(srcZ*srcHeight+srcY)*srcPitch + srcXInBytes);\n \\endcode\n\n \\par\n For device pointers, the starting address is\n \\code\nCUdeviceptr Start = srcDevice+(srcZ*srcHeight+srcY)*srcPitch+srcXInBytes;\n \\endcode\n\n \\par\n For CUDA arrays, ::srcXInBytes must be evenly divisible by the array\n element size.\n\n - dstXInBytes, ::dstY and ::dstZ specify the base address of the\n   destination data for the copy.\n\n \\par\n For host pointers, the base address is\n \\code\nvoid* dstStart = (void*)((char*)dstHost+(dstZ*dstHeight+dstY)*dstPitch + dstXInBytes);\n \\endcode\n\n \\par\n For device pointers, the starting address is\n \\code\nCUdeviceptr dstStart = dstDevice+(dstZ*dstHeight+dstY)*dstPitch+dstXInBytes;\n \\endcode\n\n \\par\n For CUDA arrays, ::dstXInBytes must be evenly divisible by the array\n element size.\n\n - ::WidthInBytes, ::Height and ::Depth specify the width (in bytes), height\n   and depth of the 3D copy being performed.\n - If specified, ::srcPitch must be greater than or equal to ::WidthInBytes +\n   ::srcXInBytes, and ::dstPitch must be greater than or equal to\n   ::WidthInBytes + dstXInBytes.\n - If specified, ::srcHeight must be greater than or equal to ::Height +\n   ::srcY, and ::dstHeight must be greater than or equal to ::Height + ::dstY.\n\n \\par\n ::cuMemcpy3D() returns an error if any pitch is greater than the maximum\n allowed (::CU_DEVICE_ATTRIBUTE_MAX_PITCH).\n\n The ::srcLOD and ::dstLOD members of the ::CUDA_MEMCPY3D structure must be\n set to 0.\n\n \\param pCopy - Parameters for the memory copy\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_sync\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D16,\n ::cuMemsetD2D32, ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD32,\n ::cudaMemcpy3D*/\n    fn cuMemcpy3D_v2_ptds(\n        pCopy: *const cuda_types::cuda::CUDA_MEMCPY3D,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Copies memory between contexts\n\n Perform a 3D memory copy according to the parameters specified in\n \\p pCopy.  See the definition of the ::CUDA_MEMCPY3D_PEER structure\n for documentation of its parameters.\n\n \\param pCopy - Parameters for the memory copy\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_sync\n\n \\sa ::cuMemcpyDtoD, ::cuMemcpyPeer, ::cuMemcpyDtoDAsync, ::cuMemcpyPeerAsync,\n ::cuMemcpy3DPeerAsync,\n ::cudaMemcpy3DPeer*/\n    fn cuMemcpy3DPeer_ptds(\n        pCopy: *const cuda_types::cuda::CUDA_MEMCPY3D_PEER,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Copies memory asynchronously\n\n Copies data between two pointers.\n \\p dst and \\p src are base pointers of the destination and source, respectively.\n \\p ByteCount specifies the number of bytes to copy.\n Note that this function infers the type of the transfer (host to host, host to\n   device, device to device, or device to host) from the pointer values.  This\n   function is only allowed in contexts which support unified addressing.\n\n \\param dst       - Destination unified virtual address space pointer\n \\param src       - Source unified virtual address space pointer\n \\param ByteCount - Size of memory copy in bytes\n \\param hStream   - Stream identifier\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE\n \\notefnerr\n \\note_async\n \\note_null_stream\n \\note_memcpy\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D8Async,\n ::cuMemsetD2D16, ::cuMemsetD2D16Async, ::cuMemsetD2D32, ::cuMemsetD2D32Async,\n ::cuMemsetD8, ::cuMemsetD8Async, ::cuMemsetD16, ::cuMemsetD16Async,\n ::cuMemsetD32, ::cuMemsetD32Async,\n ::cudaMemcpyAsync,\n ::cudaMemcpyToSymbolAsync,\n ::cudaMemcpyFromSymbolAsync*/\n    fn cuMemcpyAsync_ptsz(\n        dst: cuda_types::cuda::CUdeviceptr,\n        src: cuda_types::cuda::CUdeviceptr,\n        ByteCount: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Copies device memory between two contexts asynchronously.\n\n Copies from device memory in one context to device memory in another\n context. \\p dstDevice is the base device pointer of the destination memory\n and \\p dstContext is the destination context.  \\p srcDevice is the base\n device pointer of the source memory and \\p srcContext is the source pointer.\n \\p ByteCount specifies the number of bytes to copy.\n\n \\param dstDevice  - Destination device pointer\n \\param dstContext - Destination context\n \\param srcDevice  - Source device pointer\n \\param srcContext - Source context\n \\param ByteCount  - Size of memory copy in bytes\n \\param hStream    - Stream identifier\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE\n \\notefnerr\n \\note_async\n \\note_null_stream\n\n \\sa ::cuMemcpyDtoD, ::cuMemcpyPeer, ::cuMemcpy3DPeer, ::cuMemcpyDtoDAsync,\n ::cuMemcpy3DPeerAsync,\n ::cudaMemcpyPeerAsync*/\n    fn cuMemcpyPeerAsync_ptsz(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        dstContext: cuda_types::cuda::CUcontext,\n        srcDevice: cuda_types::cuda::CUdeviceptr,\n        srcContext: cuda_types::cuda::CUcontext,\n        ByteCount: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Copies memory from Host to Device\n\n Copies from host memory to device memory. \\p dstDevice and \\p srcHost are\n the base addresses of the destination and source, respectively. \\p ByteCount\n specifies the number of bytes to copy.\n\n \\param dstDevice - Destination device pointer\n \\param srcHost   - Source host pointer\n \\param ByteCount - Size of memory copy in bytes\n \\param hStream   - Stream identifier\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE\n \\notefnerr\n \\note_async\n \\note_null_stream\n \\note_memcpy\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D8Async,\n ::cuMemsetD2D16, ::cuMemsetD2D16Async, ::cuMemsetD2D32, ::cuMemsetD2D32Async,\n ::cuMemsetD8, ::cuMemsetD8Async, ::cuMemsetD16, ::cuMemsetD16Async,\n ::cuMemsetD32, ::cuMemsetD32Async,\n ::cudaMemcpyAsync,\n ::cudaMemcpyToSymbolAsync*/\n    fn cuMemcpyHtoDAsync_v2_ptsz(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        srcHost: *const ::core::ffi::c_void,\n        ByteCount: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Copies memory from Device to Host\n\n Copies from device to host memory. \\p dstHost and \\p srcDevice specify the\n base pointers of the destination and source, respectively. \\p ByteCount\n specifies the number of bytes to copy.\n\n \\param dstHost   - Destination host pointer\n \\param srcDevice - Source device pointer\n \\param ByteCount - Size of memory copy in bytes\n \\param hStream   - Stream identifier\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE\n \\notefnerr\n \\note_async\n \\note_null_stream\n \\note_memcpy\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D8Async,\n ::cuMemsetD2D16, ::cuMemsetD2D16Async, ::cuMemsetD2D32, ::cuMemsetD2D32Async,\n ::cuMemsetD8, ::cuMemsetD8Async, ::cuMemsetD16, ::cuMemsetD16Async,\n ::cuMemsetD32, ::cuMemsetD32Async,\n ::cudaMemcpyAsync,\n ::cudaMemcpyFromSymbolAsync*/\n    fn cuMemcpyDtoHAsync_v2_ptsz(\n        dstHost: *mut ::core::ffi::c_void,\n        srcDevice: cuda_types::cuda::CUdeviceptr,\n        ByteCount: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Copies memory from Device to Device\n\n Copies from device memory to device memory. \\p dstDevice and \\p srcDevice\n are the base pointers of the destination and source, respectively.\n \\p ByteCount specifies the number of bytes to copy.\n\n \\param dstDevice - Destination device pointer\n \\param srcDevice - Source device pointer\n \\param ByteCount - Size of memory copy in bytes\n \\param hStream   - Stream identifier\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE\n \\notefnerr\n \\note_async\n \\note_null_stream\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D8Async,\n ::cuMemsetD2D16, ::cuMemsetD2D16Async, ::cuMemsetD2D32, ::cuMemsetD2D32Async,\n ::cuMemsetD8, ::cuMemsetD8Async, ::cuMemsetD16, ::cuMemsetD16Async,\n ::cuMemsetD32, ::cuMemsetD32Async,\n ::cudaMemcpyAsync,\n ::cudaMemcpyToSymbolAsync,\n ::cudaMemcpyFromSymbolAsync*/\n    fn cuMemcpyDtoDAsync_v2_ptsz(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        srcDevice: cuda_types::cuda::CUdeviceptr,\n        ByteCount: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Copies memory from Host to Array\n\n Copies from host memory to a 1D CUDA array. \\p dstArray and \\p dstOffset\n specify the CUDA array handle and starting offset in bytes of the\n destination data. \\p srcHost specifies the base address of the source.\n \\p ByteCount specifies the number of bytes to copy.\n\n \\param dstArray  - Destination array\n \\param dstOffset - Offset in bytes of destination array\n \\param srcHost   - Source host pointer\n \\param ByteCount - Size of memory copy in bytes\n \\param hStream   - Stream identifier\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE\n \\notefnerr\n \\note_async\n \\note_null_stream\n \\note_memcpy\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D8Async,\n ::cuMemsetD2D16, ::cuMemsetD2D16Async, ::cuMemsetD2D32, ::cuMemsetD2D32Async,\n ::cuMemsetD8, ::cuMemsetD8Async, ::cuMemsetD16, ::cuMemsetD16Async,\n ::cuMemsetD32, ::cuMemsetD32Async,\n ::cudaMemcpyToArrayAsync*/\n    fn cuMemcpyHtoAAsync_v2_ptsz(\n        dstArray: cuda_types::cuda::CUarray,\n        dstOffset: usize,\n        srcHost: *const ::core::ffi::c_void,\n        ByteCount: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Copies memory from Array to Host\n\n Copies from one 1D CUDA array to host memory. \\p dstHost specifies the base\n pointer of the destination. \\p srcArray and \\p srcOffset specify the CUDA\n array handle and starting offset in bytes of the source data.\n \\p ByteCount specifies the number of bytes to copy.\n\n \\param dstHost   - Destination pointer\n \\param srcArray  - Source array\n \\param srcOffset - Offset in bytes of source array\n \\param ByteCount - Size of memory copy in bytes\n \\param hStream   - Stream identifier\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE\n \\notefnerr\n \\note_async\n \\note_null_stream\n \\note_memcpy\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D8Async,\n ::cuMemsetD2D16, ::cuMemsetD2D16Async, ::cuMemsetD2D32, ::cuMemsetD2D32Async,\n ::cuMemsetD8, ::cuMemsetD8Async, ::cuMemsetD16, ::cuMemsetD16Async,\n ::cuMemsetD32, ::cuMemsetD32Async,\n ::cudaMemcpyFromArrayAsync*/\n    fn cuMemcpyAtoHAsync_v2_ptsz(\n        dstHost: *mut ::core::ffi::c_void,\n        srcArray: cuda_types::cuda::CUarray,\n        srcOffset: usize,\n        ByteCount: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Copies memory for 2D arrays\n\n Perform a 2D memory copy according to the parameters specified in \\p pCopy.\n The ::CUDA_MEMCPY2D structure is defined as:\n\n \\code\ntypedef struct CUDA_MEMCPY2D_st {\nunsigned int srcXInBytes, srcY;\nCUmemorytype srcMemoryType;\nconst void *srcHost;\nCUdeviceptr srcDevice;\nCUarray srcArray;\nunsigned int srcPitch;\nunsigned int dstXInBytes, dstY;\nCUmemorytype dstMemoryType;\nvoid *dstHost;\nCUdeviceptr dstDevice;\nCUarray dstArray;\nunsigned int dstPitch;\nunsigned int WidthInBytes;\nunsigned int Height;\n} CUDA_MEMCPY2D;\n \\endcode\n where:\n - ::srcMemoryType and ::dstMemoryType specify the type of memory of the\n   source and destination, respectively; ::CUmemorytype_enum is defined as:\n\n \\code\ntypedef enum CUmemorytype_enum {\nCU_MEMORYTYPE_HOST = 0x01,\nCU_MEMORYTYPE_DEVICE = 0x02,\nCU_MEMORYTYPE_ARRAY = 0x03,\nCU_MEMORYTYPE_UNIFIED = 0x04\n} CUmemorytype;\n \\endcode\n\n \\par\n If ::srcMemoryType is ::CU_MEMORYTYPE_HOST, ::srcHost and ::srcPitch\n specify the (host) base address of the source data and the bytes per row to\n apply. ::srcArray is ignored.\n\n \\par\n If ::srcMemoryType is ::CU_MEMORYTYPE_UNIFIED, ::srcDevice and ::srcPitch\n   specify the (unified virtual address space) base address of the source data\n   and the bytes per row to apply.  ::srcArray is ignored.\n This value may be used only if unified addressing is supported in the calling\n   context.\n\n \\par\n If ::srcMemoryType is ::CU_MEMORYTYPE_DEVICE, ::srcDevice and ::srcPitch\n specify the (device) base address of the source data and the bytes per row\n to apply. ::srcArray is ignored.\n\n \\par\n If ::srcMemoryType is ::CU_MEMORYTYPE_ARRAY, ::srcArray specifies the\n handle of the source data. ::srcHost, ::srcDevice and ::srcPitch are\n ignored.\n\n \\par\n If ::dstMemoryType is ::CU_MEMORYTYPE_UNIFIED, ::dstDevice and ::dstPitch\n   specify the (unified virtual address space) base address of the source data\n   and the bytes per row to apply.  ::dstArray is ignored.\n This value may be used only if unified addressing is supported in the calling\n   context.\n\n \\par\n If ::dstMemoryType is ::CU_MEMORYTYPE_HOST, ::dstHost and ::dstPitch\n specify the (host) base address of the destination data and the bytes per\n row to apply. ::dstArray is ignored.\n\n \\par\n If ::dstMemoryType is ::CU_MEMORYTYPE_DEVICE, ::dstDevice and ::dstPitch\n specify the (device) base address of the destination data and the bytes per\n row to apply. ::dstArray is ignored.\n\n \\par\n If ::dstMemoryType is ::CU_MEMORYTYPE_ARRAY, ::dstArray specifies the\n handle of the destination data. ::dstHost, ::dstDevice and ::dstPitch are\n ignored.\n\n - ::srcXInBytes and ::srcY specify the base address of the source data for\n   the copy.\n\n \\par\n For host pointers, the starting address is\n \\code\nvoid* Start = (void*)((char*)srcHost+srcY*srcPitch + srcXInBytes);\n \\endcode\n\n \\par\n For device pointers, the starting address is\n \\code\nCUdeviceptr Start = srcDevice+srcY*srcPitch+srcXInBytes;\n \\endcode\n\n \\par\n For CUDA arrays, ::srcXInBytes must be evenly divisible by the array\n element size.\n\n - ::dstXInBytes and ::dstY specify the base address of the destination data\n   for the copy.\n\n \\par\n For host pointers, the base address is\n \\code\nvoid* dstStart = (void*)((char*)dstHost+dstY*dstPitch + dstXInBytes);\n \\endcode\n\n \\par\n For device pointers, the starting address is\n \\code\nCUdeviceptr dstStart = dstDevice+dstY*dstPitch+dstXInBytes;\n \\endcode\n\n \\par\n For CUDA arrays, ::dstXInBytes must be evenly divisible by the array\n element size.\n\n - ::WidthInBytes and ::Height specify the width (in bytes) and height of\n   the 2D copy being performed.\n - If specified, ::srcPitch must be greater than or equal to ::WidthInBytes +\n   ::srcXInBytes, and ::dstPitch must be greater than or equal to\n   ::WidthInBytes + dstXInBytes.\n - If specified, ::srcPitch must be greater than or equal to ::WidthInBytes +\n   ::srcXInBytes, and ::dstPitch must be greater than or equal to\n   ::WidthInBytes + dstXInBytes.\n - If specified, ::srcHeight must be greater than or equal to ::Height +\n   ::srcY, and ::dstHeight must be greater than or equal to ::Height + ::dstY.\n\n \\par\n ::cuMemcpy2DAsync() returns an error if any pitch is greater than the maximum\n allowed (::CU_DEVICE_ATTRIBUTE_MAX_PITCH). ::cuMemAllocPitch() passes back\n pitches that always work with ::cuMemcpy2D(). On intra-device memory copies\n (device to device, CUDA array to device, CUDA array to CUDA array),\n ::cuMemcpy2DAsync() may fail for pitches not computed by ::cuMemAllocPitch().\n\n \\param pCopy   - Parameters for the memory copy\n \\param hStream - Stream identifier\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE\n \\notefnerr\n \\note_async\n \\note_null_stream\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D8Async,\n ::cuMemsetD2D16, ::cuMemsetD2D16Async, ::cuMemsetD2D32, ::cuMemsetD2D32Async,\n ::cuMemsetD8, ::cuMemsetD8Async, ::cuMemsetD16, ::cuMemsetD16Async,\n ::cuMemsetD32, ::cuMemsetD32Async,\n ::cudaMemcpy2DAsync,\n ::cudaMemcpy2DToArrayAsync,\n ::cudaMemcpy2DFromArrayAsync*/\n    fn cuMemcpy2DAsync_v2_ptsz(\n        pCopy: *const cuda_types::cuda::CUDA_MEMCPY2D,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Copies memory for 3D arrays\n\n Perform a 3D memory copy according to the parameters specified in\n \\p pCopy. The ::CUDA_MEMCPY3D structure is defined as:\n\n \\code\ntypedef struct CUDA_MEMCPY3D_st {\n\nunsigned int srcXInBytes, srcY, srcZ;\nunsigned int srcLOD;\nCUmemorytype srcMemoryType;\nconst void *srcHost;\nCUdeviceptr srcDevice;\nCUarray srcArray;\nunsigned int srcPitch;  // ignored when src is array\nunsigned int srcHeight; // ignored when src is array; may be 0 if Depth==1\n\nunsigned int dstXInBytes, dstY, dstZ;\nunsigned int dstLOD;\nCUmemorytype dstMemoryType;\nvoid *dstHost;\nCUdeviceptr dstDevice;\nCUarray dstArray;\nunsigned int dstPitch;  // ignored when dst is array\nunsigned int dstHeight; // ignored when dst is array; may be 0 if Depth==1\n\nunsigned int WidthInBytes;\nunsigned int Height;\nunsigned int Depth;\n} CUDA_MEMCPY3D;\n \\endcode\n where:\n - ::srcMemoryType and ::dstMemoryType specify the type of memory of the\n   source and destination, respectively; ::CUmemorytype_enum is defined as:\n\n \\code\ntypedef enum CUmemorytype_enum {\nCU_MEMORYTYPE_HOST = 0x01,\nCU_MEMORYTYPE_DEVICE = 0x02,\nCU_MEMORYTYPE_ARRAY = 0x03,\nCU_MEMORYTYPE_UNIFIED = 0x04\n} CUmemorytype;\n \\endcode\n\n \\par\n If ::srcMemoryType is ::CU_MEMORYTYPE_UNIFIED, ::srcDevice and ::srcPitch\n   specify the (unified virtual address space) base address of the source data\n   and the bytes per row to apply.  ::srcArray is ignored.\n This value may be used only if unified addressing is supported in the calling\n   context.\n\n \\par\n If ::srcMemoryType is ::CU_MEMORYTYPE_HOST, ::srcHost, ::srcPitch and\n ::srcHeight specify the (host) base address of the source data, the bytes\n per row, and the height of each 2D slice of the 3D array. ::srcArray is\n ignored.\n\n \\par\n If ::srcMemoryType is ::CU_MEMORYTYPE_DEVICE, ::srcDevice, ::srcPitch and\n ::srcHeight specify the (device) base address of the source data, the bytes\n per row, and the height of each 2D slice of the 3D array. ::srcArray is\n ignored.\n\n \\par\n If ::srcMemoryType is ::CU_MEMORYTYPE_ARRAY, ::srcArray specifies the\n handle of the source data. ::srcHost, ::srcDevice, ::srcPitch and\n ::srcHeight are ignored.\n\n \\par\n If ::dstMemoryType is ::CU_MEMORYTYPE_UNIFIED, ::dstDevice and ::dstPitch\n   specify the (unified virtual address space) base address of the source data\n   and the bytes per row to apply.  ::dstArray is ignored.\n This value may be used only if unified addressing is supported in the calling\n   context.\n\n \\par\n If ::dstMemoryType is ::CU_MEMORYTYPE_HOST, ::dstHost and ::dstPitch\n specify the (host) base address of the destination data, the bytes per row,\n and the height of each 2D slice of the 3D array. ::dstArray is ignored.\n\n \\par\n If ::dstMemoryType is ::CU_MEMORYTYPE_DEVICE, ::dstDevice and ::dstPitch\n specify the (device) base address of the destination data, the bytes per\n row, and the height of each 2D slice of the 3D array. ::dstArray is ignored.\n\n \\par\n If ::dstMemoryType is ::CU_MEMORYTYPE_ARRAY, ::dstArray specifies the\n handle of the destination data. ::dstHost, ::dstDevice, ::dstPitch and\n ::dstHeight are ignored.\n\n - ::srcXInBytes, ::srcY and ::srcZ specify the base address of the source\n   data for the copy.\n\n \\par\n For host pointers, the starting address is\n \\code\nvoid* Start = (void*)((char*)srcHost+(srcZ*srcHeight+srcY)*srcPitch + srcXInBytes);\n \\endcode\n\n \\par\n For device pointers, the starting address is\n \\code\nCUdeviceptr Start = srcDevice+(srcZ*srcHeight+srcY)*srcPitch+srcXInBytes;\n \\endcode\n\n \\par\n For CUDA arrays, ::srcXInBytes must be evenly divisible by the array\n element size.\n\n - dstXInBytes, ::dstY and ::dstZ specify the base address of the\n   destination data for the copy.\n\n \\par\n For host pointers, the base address is\n \\code\nvoid* dstStart = (void*)((char*)dstHost+(dstZ*dstHeight+dstY)*dstPitch + dstXInBytes);\n \\endcode\n\n \\par\n For device pointers, the starting address is\n \\code\nCUdeviceptr dstStart = dstDevice+(dstZ*dstHeight+dstY)*dstPitch+dstXInBytes;\n \\endcode\n\n \\par\n For CUDA arrays, ::dstXInBytes must be evenly divisible by the array\n element size.\n\n - ::WidthInBytes, ::Height and ::Depth specify the width (in bytes), height\n   and depth of the 3D copy being performed.\n - If specified, ::srcPitch must be greater than or equal to ::WidthInBytes +\n   ::srcXInBytes, and ::dstPitch must be greater than or equal to\n   ::WidthInBytes + dstXInBytes.\n - If specified, ::srcHeight must be greater than or equal to ::Height +\n   ::srcY, and ::dstHeight must be greater than or equal to ::Height + ::dstY.\n\n \\par\n ::cuMemcpy3DAsync() returns an error if any pitch is greater than the maximum\n allowed (::CU_DEVICE_ATTRIBUTE_MAX_PITCH).\n\n The ::srcLOD and ::dstLOD members of the ::CUDA_MEMCPY3D structure must be\n set to 0.\n\n \\param pCopy - Parameters for the memory copy\n \\param hStream - Stream identifier\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE\n \\notefnerr\n \\note_async\n \\note_null_stream\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D8Async,\n ::cuMemsetD2D16, ::cuMemsetD2D16Async, ::cuMemsetD2D32, ::cuMemsetD2D32Async,\n ::cuMemsetD8, ::cuMemsetD8Async, ::cuMemsetD16, ::cuMemsetD16Async,\n ::cuMemsetD32, ::cuMemsetD32Async,\n ::cudaMemcpy3DAsync*/\n    fn cuMemcpy3DAsync_v2_ptsz(\n        pCopy: *const cuda_types::cuda::CUDA_MEMCPY3D,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Copies memory between contexts asynchronously.\n\n Perform a 3D memory copy according to the parameters specified in\n \\p pCopy.  See the definition of the ::CUDA_MEMCPY3D_PEER structure\n for documentation of its parameters.\n\n \\param pCopy - Parameters for the memory copy\n \\param hStream - Stream identifier\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_async\n \\note_null_stream\n\n \\sa ::cuMemcpyDtoD, ::cuMemcpyPeer, ::cuMemcpyDtoDAsync, ::cuMemcpyPeerAsync,\n ::cuMemcpy3DPeerAsync,\n ::cudaMemcpy3DPeerAsync*/\n    fn cuMemcpy3DPeerAsync_ptsz(\n        pCopy: *const cuda_types::cuda::CUDA_MEMCPY3D_PEER,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Performs a batch of memory copies asynchronously.\n\n Performs a batch of memory copies. The batch as a whole executes in stream order but copies within a\n batch are not guaranteed to execute in any specific order. This API only supports pointer-to-pointer copies.\n For copies involving CUDA arrays, please see ::cuMemcpy3DBatchAsync.\n\n Performs memory copies from source buffers specified in \\p srcs to destination buffers specified in \\p dsts.\n The size of each copy is specified in \\p sizes. All three arrays must be of the same length as specified\n by \\p count. Since there are no ordering guarantees for copies within a batch, specifying any dependent copies\n within a batch will result in undefined behavior.\n\n Every copy in the batch has to be associated with a set of attributes specified in the \\p attrs array.\n Each entry in this array can apply to more than one copy. This can be done by specifying in the \\p attrsIdxs array,\n the index of the first copy that the corresponding entry in the \\p attrs array applies to. Both \\p attrs and\n \\p attrsIdxs must be of the same length as specified by \\p numAttrs. For example, if a batch has 10 copies listed\n in dst/src/sizes, the first 6 of which have one set of attributes and the remaining 4 another, then \\p numAttrs\n will be 2, \\p attrsIdxs will be {0, 6} and \\p attrs will contains the two sets of attributes. Note that the first entry\n in \\p attrsIdxs must always be 0. Also, each entry must be greater than the previous entry and the last entry should be\n less than \\p count. Furthermore, \\p numAttrs must be lesser than or equal to \\p count.\n\n The ::CUmemcpyAttributes::srcAccessOrder indicates the source access ordering to be observed for copies associated\n with the attribute. If the source access order is set to ::CU_MEMCPY_SRC_ACCESS_ORDER_STREAM, then the source will\n be accessed in stream order. If the source access order is set to ::CU_MEMCPY_SRC_ACCESS_ORDER_DURING_API_CALL then\n it indicates that access to the source pointer can be out of stream order and all accesses must be complete before\n the API call returns. This flag is suited for ephemeral sources (ex., stack variables) when it's known that no prior\n operations in the stream can be accessing the memory and also that the lifetime of the memory is limited to the scope\n that the source variable was declared in. Specifying this flag allows the driver to optimize the copy and removes the\n need for the user to synchronize the stream after the API call. If the source access order is set to\n ::CU_MEMCPY_SRC_ACCESS_ORDER_ANY then it indicates that access to the source pointer can be out of stream order and the\n accesses can happen even after the API call returns. This flag is suited for host pointers allocated\n outside CUDA (ex., via malloc) when it's known that no prior operations in the stream can be accessing the memory.\n Specifying this flag allows the driver to optimize the copy on certain platforms. Each memcpy operation in the batch must\n have a valid ::CUmemcpyAttributes corresponding to it including the appropriate srcAccessOrder setting, otherwise the API\n will return ::CUDA_ERROR_INVALID_VALUE.\n\n The ::CUmemcpyAttributes::srcLocHint and ::CUmemcpyAttributes::dstLocHint allows applications to specify hint locations\n for operands of a copy when the operand doesn't have a fixed location. That is, these hints are\n only applicable for managed memory pointers on devices where ::CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS is true or\n system-allocated pageable memory on devices where ::CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS is true.\n For other cases, these hints are ignored.\n\n The ::CUmemcpyAttributes::flags field can be used to specify certain flags for copies. Setting the\n ::CU_MEMCPY_FLAG_PREFER_OVERLAP_WITH_COMPUTE flag indicates that the associated copies should preferably overlap with\n any compute work. Note that this flag is a hint and can be ignored depending on the platform and other parameters of the copy.\n\n\n \\param dsts          - Array of destination pointers.\n \\param srcs          - Array of memcpy source pointers.\n \\param sizes         - Array of sizes for memcpy operations.\n \\param count         - Size of \\p dsts, \\p srcs and \\p sizes arrays\n \\param attrs         - Array of memcpy attributes.\n \\param attrsIdxs     - Array of indices to specify which copies each entry in the \\p attrs array applies to.\nThe attributes specified in attrs[k] will be applied to copies starting from attrsIdxs[k]\nthrough attrsIdxs[k+1] - 1. Also attrs[numAttrs-1] will apply to copies starting from\nattrsIdxs[numAttrs-1] through count - 1.\n \\param numAttrs      - Size of \\p attrs and \\p attrsIdxs arrays.\n \\param hStream       - The stream to enqueue the operations in. Must not be legacy NULL stream.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_async\n \\note_memcpy*/\n    fn cuMemcpyBatchAsync_v2_ptsz(\n        dsts: *mut cuda_types::cuda::CUdeviceptr,\n        srcs: *mut cuda_types::cuda::CUdeviceptr,\n        sizes: *mut usize,\n        count: usize,\n        attrs: *mut cuda_types::cuda::CUmemcpyAttributes,\n        attrsIdxs: *mut usize,\n        numAttrs: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Performs a batch of 3D memory copies asynchronously.\n\n Performs a batch of memory copies. The batch as a whole executes in stream order but copies within a\n batch are not guaranteed to execute in any specific order. Note that this means specifying any dependent\n copies within a batch will result in undefined behavior.\n\n Performs memory copies as specified in the \\p opList array. The length of this array is specified in \\p numOps.\n Each entry in this array describes a copy operation. This includes among other things, the source and destination\n operands for the copy as specified in ::CUDA_MEMCPY3D_BATCH_OP::src and ::CUDA_MEMCPY3D_BATCH_OP::dst respectively.\n The source and destination operands of a copy can either be a pointer or a CUDA array. The width, height and depth\n of a copy is specified in ::CUDA_MEMCPY3D_BATCH_OP::extent. The width, height and depth of a copy are specified in\n elements and must not be zero. For pointer-to-pointer copies, the element size is considered to be 1. For pointer\n to CUDA array or vice versa copies, the element size is determined by the CUDA array. For CUDA array to CUDA array copies,\n the element size of the two CUDA arrays must match.\n\n For a given operand, if ::CUmemcpy3DOperand::type is specified as ::CU_MEMCPY_OPERAND_TYPE_POINTER, then\n ::CUmemcpy3DOperand::op::ptr will be used. The ::CUmemcpy3DOperand::op::ptr::ptr field must contain the pointer where\n the copy should begin. The ::CUmemcpy3DOperand::op::ptr::rowLength field specifies the length of each row in elements and\n must either be zero or be greater than or equal to the width of the copy specified in ::CUDA_MEMCPY3D_BATCH_OP::extent::width.\n The ::CUmemcpy3DOperand::op::ptr::layerHeight field specifies the height of each layer and must either be zero or be greater than\n or equal to the height of the copy specified in ::CUDA_MEMCPY3D_BATCH_OP::extent::height. When either of these values is zero,\n that aspect of the operand is considered to be tightly packed according to the copy extent. For managed memory pointers on devices where\n ::CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS is true or system-allocated pageable memory on devices where\n ::CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS is true, the ::CUmemcpy3DOperand::op::ptr::locHint field can be used to hint\n the location of the operand.\n\n If an operand's type is specified as ::CU_MEMCPY_OPERAND_TYPE_ARRAY, then ::CUmemcpy3DOperand::op::array will be used.\n The ::CUmemcpy3DOperand::op::array::array field specifies the CUDA array and ::CUmemcpy3DOperand::op::array::offset specifies\n the 3D offset into that array where the copy begins.\n\n The ::CUmemcpyAttributes::srcAccessOrder indicates the source access ordering to be observed for copies associated\n with the attribute. If the source access order is set to ::CU_MEMCPY_SRC_ACCESS_ORDER_STREAM, then the source will\n be accessed in stream order. If the source access order is set to ::CU_MEMCPY_SRC_ACCESS_ORDER_DURING_API_CALL then\n it indicates that access to the source pointer can be out of stream order and all accesses must be complete before\n the API call returns. This flag is suited for ephemeral sources (ex., stack variables) when it's known that no prior\n operations in the stream can be accessing the memory and also that the lifetime of the memory is limited to the scope\n that the source variable was declared in. Specifying this flag allows the driver to optimize the copy and removes the\n need for the user to synchronize the stream after the API call. If the source access order is set to\n ::CU_MEMCPY_SRC_ACCESS_ORDER_ANY then it indicates that access to the source pointer can be out of stream order and the\n accesses can happen even after the API call returns. This flag is suited for host pointers allocated\n outside CUDA (ex., via malloc) when it's known that no prior operations in the stream can be accessing the memory.\n Specifying this flag allows the driver to optimize the copy on certain platforms. Each memcopy operation in \\p opList must\n have a valid srcAccessOrder setting, otherwise this API will return ::CUDA_ERROR_INVALID_VALUE.\n\n The ::CUmemcpyAttributes::flags field can be used to specify certain flags for copies. Setting the\n ::CU_MEMCPY_FLAG_PREFER_OVERLAP_WITH_COMPUTE flag indicates that the associated copies should preferably overlap with\n any compute work. Note that this flag is a hint and can be ignored depending on the platform and other parameters of the copy.\n\n\n \\param numOps     - Total number of memcpy operations.\n \\param opList     - Array of size \\p numOps containing the actual memcpy operations.\n \\param flags      - Flags for future use, must be zero now.\n \\param hStream    - The stream to enqueue the operations in. Must not be default NULL stream.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_async\n \\note_memcpy*/\n    fn cuMemcpy3DBatchAsync_v2_ptsz(\n        numOps: usize,\n        opList: *mut cuda_types::cuda::CUDA_MEMCPY3D_BATCH_OP,\n        flags: ::core::ffi::c_ulonglong,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Initializes device memory\n\n Sets the memory range of \\p N 8-bit values to the specified value\n \\p uc.\n\n \\param dstDevice - Destination device pointer\n \\param uc        - Value to set\n \\param N         - Number of elements\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_memset\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D8Async,\n ::cuMemsetD2D16, ::cuMemsetD2D16Async, ::cuMemsetD2D32, ::cuMemsetD2D32Async,\n ::cuMemsetD8Async, ::cuMemsetD16, ::cuMemsetD16Async,\n ::cuMemsetD32, ::cuMemsetD32Async,\n ::cudaMemset*/\n    fn cuMemsetD8_v2_ptds(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        uc: ::core::ffi::c_uchar,\n        N: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Initializes device memory\n\n Sets the memory range of \\p N 16-bit values to the specified value\n \\p us. The \\p dstDevice pointer must be two byte aligned.\n\n \\param dstDevice - Destination device pointer\n \\param us        - Value to set\n \\param N         - Number of elements\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_memset\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D8Async,\n ::cuMemsetD2D16, ::cuMemsetD2D16Async, ::cuMemsetD2D32, ::cuMemsetD2D32Async,\n ::cuMemsetD8, ::cuMemsetD8Async, ::cuMemsetD16Async,\n ::cuMemsetD32, ::cuMemsetD32Async,\n ::cudaMemset*/\n    fn cuMemsetD16_v2_ptds(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        us: ::core::ffi::c_ushort,\n        N: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Initializes device memory\n\n Sets the memory range of \\p N 32-bit values to the specified value\n \\p ui. The \\p dstDevice pointer must be four byte aligned.\n\n \\param dstDevice - Destination device pointer\n \\param ui        - Value to set\n \\param N         - Number of elements\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_memset\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D8Async,\n ::cuMemsetD2D16, ::cuMemsetD2D16Async, ::cuMemsetD2D32, ::cuMemsetD2D32Async,\n ::cuMemsetD8, ::cuMemsetD8Async, ::cuMemsetD16, ::cuMemsetD16Async,\n ::cuMemsetD32Async,\n ::cudaMemset*/\n    fn cuMemsetD32_v2_ptds(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        ui: ::core::ffi::c_uint,\n        N: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Initializes device memory\n\n Sets the 2D memory range of \\p Width 8-bit values to the specified value\n \\p uc. \\p Height specifies the number of rows to set, and \\p dstPitch\n specifies the number of bytes between each row. This function performs\n fastest when the pitch is one that has been passed back by\n ::cuMemAllocPitch().\n\n \\param dstDevice - Destination device pointer\n \\param dstPitch  - Pitch of destination device pointer(Unused if \\p Height is 1)\n \\param uc        - Value to set\n \\param Width     - Width of row\n \\param Height    - Number of rows\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_memset\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8Async,\n ::cuMemsetD2D16, ::cuMemsetD2D16Async, ::cuMemsetD2D32, ::cuMemsetD2D32Async,\n ::cuMemsetD8, ::cuMemsetD8Async, ::cuMemsetD16, ::cuMemsetD16Async,\n ::cuMemsetD32, ::cuMemsetD32Async,\n ::cudaMemset2D*/\n    fn cuMemsetD2D8_v2_ptds(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        dstPitch: usize,\n        uc: ::core::ffi::c_uchar,\n        Width: usize,\n        Height: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Initializes device memory\n\n Sets the 2D memory range of \\p Width 16-bit values to the specified value\n \\p us. \\p Height specifies the number of rows to set, and \\p dstPitch\n specifies the number of bytes between each row. The \\p dstDevice pointer\n and \\p dstPitch offset must be two byte aligned. This function performs\n fastest when the pitch is one that has been passed back by\n ::cuMemAllocPitch().\n\n \\param dstDevice - Destination device pointer\n \\param dstPitch  - Pitch of destination device pointer(Unused if \\p Height is 1)\n \\param us        - Value to set\n \\param Width     - Width of row\n \\param Height    - Number of rows\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_memset\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D8Async,\n ::cuMemsetD2D16Async, ::cuMemsetD2D32, ::cuMemsetD2D32Async,\n ::cuMemsetD8, ::cuMemsetD8Async, ::cuMemsetD16, ::cuMemsetD16Async,\n ::cuMemsetD32, ::cuMemsetD32Async,\n ::cudaMemset2D*/\n    fn cuMemsetD2D16_v2_ptds(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        dstPitch: usize,\n        us: ::core::ffi::c_ushort,\n        Width: usize,\n        Height: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Initializes device memory\n\n Sets the 2D memory range of \\p Width 32-bit values to the specified value\n \\p ui. \\p Height specifies the number of rows to set, and \\p dstPitch\n specifies the number of bytes between each row. The \\p dstDevice pointer\n and \\p dstPitch offset must be four byte aligned. This function performs\n fastest when the pitch is one that has been passed back by\n ::cuMemAllocPitch().\n\n \\param dstDevice - Destination device pointer\n \\param dstPitch  - Pitch of destination device pointer(Unused if \\p Height is 1)\n \\param ui        - Value to set\n \\param Width     - Width of row\n \\param Height    - Number of rows\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_memset\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D8Async,\n ::cuMemsetD2D16, ::cuMemsetD2D16Async, ::cuMemsetD2D32Async,\n ::cuMemsetD8, ::cuMemsetD8Async, ::cuMemsetD16, ::cuMemsetD16Async,\n ::cuMemsetD32, ::cuMemsetD32Async,\n ::cudaMemset2D*/\n    fn cuMemsetD2D32_v2_ptds(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        dstPitch: usize,\n        ui: ::core::ffi::c_uint,\n        Width: usize,\n        Height: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets device memory\n\n Sets the memory range of \\p N 8-bit values to the specified value\n \\p uc.\n\n \\param dstDevice - Destination device pointer\n \\param uc        - Value to set\n \\param N         - Number of elements\n \\param hStream   - Stream identifier\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_memset\n \\note_null_stream\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D8Async,\n ::cuMemsetD2D16, ::cuMemsetD2D16Async, ::cuMemsetD2D32, ::cuMemsetD2D32Async,\n ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD16Async,\n ::cuMemsetD32, ::cuMemsetD32Async,\n ::cudaMemsetAsync*/\n    fn cuMemsetD8Async_ptsz(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        uc: ::core::ffi::c_uchar,\n        N: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets device memory\n\n Sets the memory range of \\p N 16-bit values to the specified value\n \\p us. The \\p dstDevice pointer must be two byte aligned.\n\n \\param dstDevice - Destination device pointer\n \\param us        - Value to set\n \\param N         - Number of elements\n \\param hStream   - Stream identifier\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_memset\n \\note_null_stream\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D8Async,\n ::cuMemsetD2D16, ::cuMemsetD2D16Async, ::cuMemsetD2D32, ::cuMemsetD2D32Async,\n ::cuMemsetD8, ::cuMemsetD8Async, ::cuMemsetD16,\n ::cuMemsetD32, ::cuMemsetD32Async,\n ::cudaMemsetAsync*/\n    fn cuMemsetD16Async_ptsz(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        us: ::core::ffi::c_ushort,\n        N: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets device memory\n\n Sets the memory range of \\p N 32-bit values to the specified value\n \\p ui. The \\p dstDevice pointer must be four byte aligned.\n\n \\param dstDevice - Destination device pointer\n \\param ui        - Value to set\n \\param N         - Number of elements\n \\param hStream   - Stream identifier\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_memset\n \\note_null_stream\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D8Async,\n ::cuMemsetD2D16, ::cuMemsetD2D16Async, ::cuMemsetD2D32, ::cuMemsetD2D32Async,\n ::cuMemsetD8, ::cuMemsetD8Async, ::cuMemsetD16, ::cuMemsetD16Async, ::cuMemsetD32,\n ::cudaMemsetAsync*/\n    fn cuMemsetD32Async_ptsz(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        ui: ::core::ffi::c_uint,\n        N: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets device memory\n\n Sets the 2D memory range of \\p Width 8-bit values to the specified value\n \\p uc. \\p Height specifies the number of rows to set, and \\p dstPitch\n specifies the number of bytes between each row. This function performs\n fastest when the pitch is one that has been passed back by\n ::cuMemAllocPitch().\n\n \\param dstDevice - Destination device pointer\n \\param dstPitch  - Pitch of destination device pointer(Unused if \\p Height is 1)\n \\param uc        - Value to set\n \\param Width     - Width of row\n \\param Height    - Number of rows\n \\param hStream   - Stream identifier\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_memset\n \\note_null_stream\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8,\n ::cuMemsetD2D16, ::cuMemsetD2D16Async, ::cuMemsetD2D32, ::cuMemsetD2D32Async,\n ::cuMemsetD8, ::cuMemsetD8Async, ::cuMemsetD16, ::cuMemsetD16Async,\n ::cuMemsetD32, ::cuMemsetD32Async,\n ::cudaMemset2DAsync*/\n    fn cuMemsetD2D8Async_ptsz(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        dstPitch: usize,\n        uc: ::core::ffi::c_uchar,\n        Width: usize,\n        Height: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets device memory\n\n Sets the 2D memory range of \\p Width 16-bit values to the specified value\n \\p us. \\p Height specifies the number of rows to set, and \\p dstPitch\n specifies the number of bytes between each row. The \\p dstDevice pointer\n and \\p dstPitch offset must be two byte aligned. This function performs\n fastest when the pitch is one that has been passed back by\n ::cuMemAllocPitch().\n\n \\param dstDevice - Destination device pointer\n \\param dstPitch  - Pitch of destination device pointer(Unused if \\p Height is 1)\n \\param us        - Value to set\n \\param Width     - Width of row\n \\param Height    - Number of rows\n \\param hStream   - Stream identifier\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_memset\n \\note_null_stream\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D8Async,\n ::cuMemsetD2D16, ::cuMemsetD2D32, ::cuMemsetD2D32Async,\n ::cuMemsetD8, ::cuMemsetD8Async, ::cuMemsetD16, ::cuMemsetD16Async,\n ::cuMemsetD32, ::cuMemsetD32Async,\n ::cudaMemset2DAsync*/\n    fn cuMemsetD2D16Async_ptsz(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        dstPitch: usize,\n        us: ::core::ffi::c_ushort,\n        Width: usize,\n        Height: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets device memory\n\n Sets the 2D memory range of \\p Width 32-bit values to the specified value\n \\p ui. \\p Height specifies the number of rows to set, and \\p dstPitch\n specifies the number of bytes between each row. The \\p dstDevice pointer\n and \\p dstPitch offset must be four byte aligned. This function performs\n fastest when the pitch is one that has been passed back by\n ::cuMemAllocPitch().\n\n \\param dstDevice - Destination device pointer\n \\param dstPitch  - Pitch of destination device pointer(Unused if \\p Height is 1)\n \\param ui        - Value to set\n \\param Width     - Width of row\n \\param Height    - Number of rows\n \\param hStream   - Stream identifier\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n \\note_memset\n \\note_null_stream\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D8Async,\n ::cuMemsetD2D16, ::cuMemsetD2D16Async, ::cuMemsetD2D32,\n ::cuMemsetD8, ::cuMemsetD8Async, ::cuMemsetD16, ::cuMemsetD16Async,\n ::cuMemsetD32, ::cuMemsetD32Async,\n ::cudaMemset2DAsync*/\n    fn cuMemsetD2D32Async_ptsz(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        dstPitch: usize,\n        ui: ::core::ffi::c_uint,\n        Width: usize,\n        Height: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Creates a 1D or 2D CUDA array\n\n Creates a CUDA array according to the ::CUDA_ARRAY_DESCRIPTOR structure\n \\p pAllocateArray and returns a handle to the new CUDA array in \\p *pHandle.\n The ::CUDA_ARRAY_DESCRIPTOR is defined as:\n\n \\code\ntypedef struct {\nunsigned int Width;\nunsigned int Height;\nCUarray_format Format;\nunsigned int NumChannels;\n} CUDA_ARRAY_DESCRIPTOR;\n \\endcode\n where:\n\n - \\p Width, and \\p Height are the width, and height of the CUDA array (in\n elements); the CUDA array is one-dimensional if height is 0, two-dimensional\n otherwise;\n - ::Format specifies the format of the elements; ::CUarray_format is\n defined as:\n \\code\ntypedef enum CUarray_format_enum {\nCU_AD_FORMAT_UNSIGNED_INT8 = 0x01,\nCU_AD_FORMAT_UNSIGNED_INT16 = 0x02,\nCU_AD_FORMAT_UNSIGNED_INT32 = 0x03,\nCU_AD_FORMAT_SIGNED_INT8 = 0x08,\nCU_AD_FORMAT_SIGNED_INT16 = 0x09,\nCU_AD_FORMAT_SIGNED_INT32 = 0x0a,\nCU_AD_FORMAT_HALF = 0x10,\nCU_AD_FORMAT_FLOAT = 0x20,\nCU_AD_FORMAT_NV12 = 0xb0,\nCU_AD_FORMAT_UNORM_INT8X1 = 0xc0,\nCU_AD_FORMAT_UNORM_INT8X2 = 0xc1,\nCU_AD_FORMAT_UNORM_INT8X4 = 0xc2,\nCU_AD_FORMAT_UNORM_INT16X1 = 0xc3,\nCU_AD_FORMAT_UNORM_INT16X2 = 0xc4,\nCU_AD_FORMAT_UNORM_INT16X4 = 0xc5,\nCU_AD_FORMAT_SNORM_INT8X1 = 0xc6,\nCU_AD_FORMAT_SNORM_INT8X2 = 0xc7,\nCU_AD_FORMAT_SNORM_INT8X4 = 0xc8,\nCU_AD_FORMAT_SNORM_INT16X1 = 0xc9,\nCU_AD_FORMAT_SNORM_INT16X2 = 0xca,\nCU_AD_FORMAT_SNORM_INT16X4 = 0xcb,\nCU_AD_FORMAT_BC1_UNORM = 0x91,\nCU_AD_FORMAT_BC1_UNORM_SRGB = 0x92,\nCU_AD_FORMAT_BC2_UNORM = 0x93,\nCU_AD_FORMAT_BC2_UNORM_SRGB = 0x94,\nCU_AD_FORMAT_BC3_UNORM = 0x95,\nCU_AD_FORMAT_BC3_UNORM_SRGB = 0x96,\nCU_AD_FORMAT_BC4_UNORM = 0x97,\nCU_AD_FORMAT_BC4_SNORM = 0x98,\nCU_AD_FORMAT_BC5_UNORM = 0x99,\nCU_AD_FORMAT_BC5_SNORM = 0x9a,\nCU_AD_FORMAT_BC6H_UF16 = 0x9b,\nCU_AD_FORMAT_BC6H_SF16 = 0x9c,\nCU_AD_FORMAT_BC7_UNORM = 0x9d,\nCU_AD_FORMAT_BC7_UNORM_SRGB = 0x9e,\nCU_AD_FORMAT_P010 = 0x9f,\nCU_AD_FORMAT_P016 = 0xa1,\nCU_AD_FORMAT_NV16 = 0xa2,\nCU_AD_FORMAT_P210 = 0xa3,\nCU_AD_FORMAT_P216 = 0xa4,\nCU_AD_FORMAT_YUY2 = 0xa5,\nCU_AD_FORMAT_Y210 = 0xa6,\nCU_AD_FORMAT_Y216 = 0xa7,\nCU_AD_FORMAT_AYUV = 0xa8,\nCU_AD_FORMAT_Y410 = 0xa9,\nCU_AD_FORMAT_Y416 = 0xb1,\nCU_AD_FORMAT_Y444_PLANAR8 = 0xb2,\nCU_AD_FORMAT_Y444_PLANAR10 = 0xb3,\nCU_AD_FORMAT_YUV444_8bit_SemiPlanar = 0xb4,\nCU_AD_FORMAT_YUV444_16bit_SemiPlanar = 0xb5,\nCU_AD_FORMAT_UNORM_INT_101010_2 = 0x50,\n} CUarray_format;\n  \\endcode\n - \\p NumChannels specifies the number of packed components per CUDA array\n element; it may be 1, 2, or 4;\n\n Here are examples of CUDA array descriptions:\n\n Description for a CUDA array of 2048 floats:\n \\code\nCUDA_ARRAY_DESCRIPTOR desc;\ndesc.Format = CU_AD_FORMAT_FLOAT;\ndesc.NumChannels = 1;\ndesc.Width = 2048;\ndesc.Height = 1;\n \\endcode\n\n Description for a 64 x 64 CUDA array of floats:\n \\code\nCUDA_ARRAY_DESCRIPTOR desc;\ndesc.Format = CU_AD_FORMAT_FLOAT;\ndesc.NumChannels = 1;\ndesc.Width = 64;\ndesc.Height = 64;\n \\endcode\n\n Description for a \\p width x \\p height CUDA array of 64-bit, 4x16-bit\n float16's:\n \\code\nCUDA_ARRAY_DESCRIPTOR desc;\ndesc.Format = CU_AD_FORMAT_HALF;\ndesc.NumChannels = 4;\ndesc.Width = width;\ndesc.Height = height;\n \\endcode\n\n Description for a \\p width x \\p height CUDA array of 16-bit elements, each\n of which is two 8-bit unsigned chars:\n \\code\nCUDA_ARRAY_DESCRIPTOR arrayDesc;\ndesc.Format = CU_AD_FORMAT_UNSIGNED_INT8;\ndesc.NumChannels = 2;\ndesc.Width = width;\ndesc.Height = height;\n \\endcode\n\n \\param pHandle        - Returned array\n \\param pAllocateArray - Array descriptor\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_OUT_OF_MEMORY,\n ::CUDA_ERROR_UNKNOWN\n \\notefnerr\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D16,\n ::cuMemsetD2D32, ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD32,\n ::cudaMallocArray*/\n    fn cuArrayCreate_v2(\n        pHandle: *mut cuda_types::cuda::CUarray,\n        pAllocateArray: *const cuda_types::cuda::CUDA_ARRAY_DESCRIPTOR,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Get a 1D or 2D CUDA array descriptor\n\n Returns in \\p *pArrayDescriptor a descriptor containing information on the\n format and dimensions of the CUDA array \\p hArray. It is useful for\n subroutines that have been passed a CUDA array, but need to know the CUDA\n array parameters for validation or other purposes.\n\n \\param pArrayDescriptor - Returned array descriptor\n \\param hArray           - Array to get descriptor of\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE\n \\notefnerr\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D16,\n ::cuMemsetD2D32, ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD32,\n ::cudaArrayGetInfo*/\n    fn cuArrayGetDescriptor_v2(\n        pArrayDescriptor: *mut cuda_types::cuda::CUDA_ARRAY_DESCRIPTOR,\n        hArray: cuda_types::cuda::CUarray,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the layout properties of a sparse CUDA array\n\n Returns the layout properties of a sparse CUDA array in \\p sparseProperties\n If the CUDA array is not allocated with flag ::CUDA_ARRAY3D_SPARSE\n ::CUDA_ERROR_INVALID_VALUE will be returned.\n\n If the returned value in ::CUDA_ARRAY_SPARSE_PROPERTIES::flags contains ::CU_ARRAY_SPARSE_PROPERTIES_SINGLE_MIPTAIL,\n then ::CUDA_ARRAY_SPARSE_PROPERTIES::miptailSize represents the total size of the array. Otherwise, it will be zero.\n Also, the returned value in ::CUDA_ARRAY_SPARSE_PROPERTIES::miptailFirstLevel is always zero.\n Note that the \\p array must have been allocated using ::cuArrayCreate or ::cuArray3DCreate. For CUDA arrays obtained\n using ::cuMipmappedArrayGetLevel, ::CUDA_ERROR_INVALID_VALUE will be returned. Instead, ::cuMipmappedArrayGetSparseProperties\n must be used to obtain the sparse properties of the entire CUDA mipmapped array to which \\p array belongs to.\n\n \\return\n ::CUDA_SUCCESS\n ::CUDA_ERROR_INVALID_VALUE\n\n \\param[out] sparseProperties - Pointer to ::CUDA_ARRAY_SPARSE_PROPERTIES\n \\param[in] array - CUDA array to get the sparse properties of\n \\sa ::cuMipmappedArrayGetSparseProperties, ::cuMemMapArrayAsync*/\n    fn cuArrayGetSparseProperties(\n        sparseProperties: *mut cuda_types::cuda::CUDA_ARRAY_SPARSE_PROPERTIES,\n        array: cuda_types::cuda::CUarray,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the layout properties of a sparse CUDA mipmapped array\n\n Returns the sparse array layout properties in \\p sparseProperties\n If the CUDA mipmapped array is not allocated with flag ::CUDA_ARRAY3D_SPARSE\n ::CUDA_ERROR_INVALID_VALUE will be returned.\n\n For non-layered CUDA mipmapped arrays, ::CUDA_ARRAY_SPARSE_PROPERTIES::miptailSize returns the\n size of the mip tail region. The mip tail region includes all mip levels whose width, height or depth\n is less than that of the tile.\n For layered CUDA mipmapped arrays, if ::CUDA_ARRAY_SPARSE_PROPERTIES::flags contains ::CU_ARRAY_SPARSE_PROPERTIES_SINGLE_MIPTAIL,\n then ::CUDA_ARRAY_SPARSE_PROPERTIES::miptailSize specifies the size of the mip tail of all layers combined.\n Otherwise, ::CUDA_ARRAY_SPARSE_PROPERTIES::miptailSize specifies mip tail size per layer.\n The returned value of ::CUDA_ARRAY_SPARSE_PROPERTIES::miptailFirstLevel is valid only if ::CUDA_ARRAY_SPARSE_PROPERTIES::miptailSize is non-zero.\n\n \\return\n ::CUDA_SUCCESS\n ::CUDA_ERROR_INVALID_VALUE\n\n \\param[out] sparseProperties - Pointer to ::CUDA_ARRAY_SPARSE_PROPERTIES\n \\param[in] mipmap - CUDA mipmapped array to get the sparse properties of\n \\sa ::cuArrayGetSparseProperties, ::cuMemMapArrayAsync*/\n    fn cuMipmappedArrayGetSparseProperties(\n        sparseProperties: *mut cuda_types::cuda::CUDA_ARRAY_SPARSE_PROPERTIES,\n        mipmap: cuda_types::cuda::CUmipmappedArray,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the memory requirements of a CUDA array\n\n Returns the memory requirements of a CUDA array in \\p memoryRequirements\n If the CUDA array is not allocated with flag ::CUDA_ARRAY3D_DEFERRED_MAPPING\n ::CUDA_ERROR_INVALID_VALUE will be returned.\n\n The returned value in ::CUDA_ARRAY_MEMORY_REQUIREMENTS::size\n represents the total size of the CUDA array.\n The returned value in ::CUDA_ARRAY_MEMORY_REQUIREMENTS::alignment\n represents the alignment necessary for mapping the CUDA array.\n\n \\return\n ::CUDA_SUCCESS\n ::CUDA_ERROR_INVALID_VALUE\n\n \\param[out] memoryRequirements - Pointer to ::CUDA_ARRAY_MEMORY_REQUIREMENTS\n \\param[in] array - CUDA array to get the memory requirements of\n \\param[in] device - Device to get the memory requirements for\n \\sa ::cuMipmappedArrayGetMemoryRequirements, ::cuMemMapArrayAsync*/\n    fn cuArrayGetMemoryRequirements(\n        memoryRequirements: *mut cuda_types::cuda::CUDA_ARRAY_MEMORY_REQUIREMENTS,\n        array: cuda_types::cuda::CUarray,\n        device: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the memory requirements of a CUDA mipmapped array\n\n Returns the memory requirements of a CUDA mipmapped array in \\p memoryRequirements\n If the CUDA mipmapped array is not allocated with flag ::CUDA_ARRAY3D_DEFERRED_MAPPING\n ::CUDA_ERROR_INVALID_VALUE will be returned.\n\n The returned value in ::CUDA_ARRAY_MEMORY_REQUIREMENTS::size\n represents the total size of the CUDA mipmapped array.\n The returned value in ::CUDA_ARRAY_MEMORY_REQUIREMENTS::alignment\n represents the alignment necessary for mapping the CUDA mipmapped\n array.\n\n \\return\n ::CUDA_SUCCESS\n ::CUDA_ERROR_INVALID_VALUE\n\n \\param[out] memoryRequirements - Pointer to ::CUDA_ARRAY_MEMORY_REQUIREMENTS\n \\param[in] mipmap - CUDA mipmapped array to get the memory requirements of\n \\param[in] device - Device to get the memory requirements for\n \\sa ::cuArrayGetMemoryRequirements, ::cuMemMapArrayAsync*/\n    fn cuMipmappedArrayGetMemoryRequirements(\n        memoryRequirements: *mut cuda_types::cuda::CUDA_ARRAY_MEMORY_REQUIREMENTS,\n        mipmap: cuda_types::cuda::CUmipmappedArray,\n        device: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Gets a CUDA array plane from a CUDA array\n\n Returns in \\p pPlaneArray a CUDA array that represents a single format plane\n of the CUDA array \\p hArray.\n\n If \\p planeIdx is greater than the maximum number of planes in this array or if the array does\n not have a multi-planar format e.g: ::CU_AD_FORMAT_NV12, then ::CUDA_ERROR_INVALID_VALUE is returned.\n\n Note that if the \\p hArray has format ::CU_AD_FORMAT_NV12, then passing in 0 for \\p planeIdx returns\n a CUDA array of the same size as \\p hArray but with one channel and ::CU_AD_FORMAT_UNSIGNED_INT8 as its format.\n If 1 is passed for \\p planeIdx, then the returned CUDA array has half the height and width\n of \\p hArray with two channels and ::CU_AD_FORMAT_UNSIGNED_INT8 as its format.\n\n \\param pPlaneArray   - Returned CUDA array referenced by the \\p planeIdx\n \\param hArray        - Multiplanar CUDA array\n \\param planeIdx      - Plane index\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE\n \\notefnerr\n\n \\sa\n ::cuArrayCreate,\n ::cudaArrayGetPlane*/\n    fn cuArrayGetPlane(\n        pPlaneArray: *mut cuda_types::cuda::CUarray,\n        hArray: cuda_types::cuda::CUarray,\n        planeIdx: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Destroys a CUDA array\n\n Destroys the CUDA array \\p hArray.\n\n \\param hArray - Array to destroy\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_ARRAY_IS_MAPPED,\n ::CUDA_ERROR_CONTEXT_IS_DESTROYED\n \\notefnerr\n\n \\sa ::cuArray3DCreate, ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D16,\n ::cuMemsetD2D32, ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD32,\n ::cudaFreeArray*/\n    fn cuArrayDestroy(hArray: cuda_types::cuda::CUarray) -> cuda_types::cuda::CUresult;\n    /** \\brief Creates a 3D CUDA array\n\n Creates a CUDA array according to the ::CUDA_ARRAY3D_DESCRIPTOR structure\n \\p pAllocateArray and returns a handle to the new CUDA array in \\p *pHandle.\n The ::CUDA_ARRAY3D_DESCRIPTOR is defined as:\n\n \\code\ntypedef struct {\nunsigned int Width;\nunsigned int Height;\nunsigned int Depth;\nCUarray_format Format;\nunsigned int NumChannels;\nunsigned int Flags;\n} CUDA_ARRAY3D_DESCRIPTOR;\n \\endcode\n where:\n\n - \\p Width, \\p Height, and \\p Depth are the width, height, and depth of the\n CUDA array (in elements); the following types of CUDA arrays can be allocated:\n     - A 1D array is allocated if \\p Height and \\p Depth extents are both zero.\n     - A 2D array is allocated if only \\p Depth extent is zero.\n     - A 3D array is allocated if all three extents are non-zero.\n     - A 1D layered CUDA array is allocated if only \\p Height is zero and the\n       ::CUDA_ARRAY3D_LAYERED flag is set. Each layer is a 1D array. The number\n       of layers is determined by the depth extent.\n     - A 2D layered CUDA array is allocated if all three extents are non-zero and\n       the ::CUDA_ARRAY3D_LAYERED flag is set. Each layer is a 2D array. The number\n       of layers is determined by the depth extent.\n     - A cubemap CUDA array is allocated if all three extents are non-zero and the\n       ::CUDA_ARRAY3D_CUBEMAP flag is set. \\p Width must be equal to \\p Height, and\n       \\p Depth must be six. A cubemap is a special type of 2D layered CUDA array,\n       where the six layers represent the six faces of a cube. The order of the six\n       layers in memory is the same as that listed in ::CUarray_cubemap_face.\n     - A cubemap layered CUDA array is allocated if all three extents are non-zero,\n       and both, ::CUDA_ARRAY3D_CUBEMAP and ::CUDA_ARRAY3D_LAYERED flags are set.\n       \\p Width must be equal to \\p Height, and \\p Depth must be a multiple of six.\n       A cubemap layered CUDA array is a special type of 2D layered CUDA array that\n       consists of a collection of cubemaps. The first six layers represent the first\n       cubemap, the next six layers form the second cubemap, and so on.\n\n - ::Format specifies the format of the elements; ::CUarray_format is\n defined as:\n \\code\ntypedef enum CUarray_format_enum {\nCU_AD_FORMAT_UNSIGNED_INT8 = 0x01,\nCU_AD_FORMAT_UNSIGNED_INT16 = 0x02,\nCU_AD_FORMAT_UNSIGNED_INT32 = 0x03,\nCU_AD_FORMAT_SIGNED_INT8 = 0x08,\nCU_AD_FORMAT_SIGNED_INT16 = 0x09,\nCU_AD_FORMAT_SIGNED_INT32 = 0x0a,\nCU_AD_FORMAT_HALF = 0x10,\nCU_AD_FORMAT_FLOAT = 0x20,\nCU_AD_FORMAT_NV12 = 0xb0,\nCU_AD_FORMAT_UNORM_INT8X1 = 0xc0,\nCU_AD_FORMAT_UNORM_INT8X2 = 0xc1,\nCU_AD_FORMAT_UNORM_INT8X4 = 0xc2,\nCU_AD_FORMAT_UNORM_INT16X1 = 0xc3,\nCU_AD_FORMAT_UNORM_INT16X2 = 0xc4,\nCU_AD_FORMAT_UNORM_INT16X4 = 0xc5,\nCU_AD_FORMAT_SNORM_INT8X1 = 0xc6,\nCU_AD_FORMAT_SNORM_INT8X2 = 0xc7,\nCU_AD_FORMAT_SNORM_INT8X4 = 0xc8,\nCU_AD_FORMAT_SNORM_INT16X1 = 0xc9,\nCU_AD_FORMAT_SNORM_INT16X2 = 0xca,\nCU_AD_FORMAT_SNORM_INT16X4 = 0xcb,\nCU_AD_FORMAT_BC1_UNORM = 0x91,\nCU_AD_FORMAT_BC1_UNORM_SRGB = 0x92,\nCU_AD_FORMAT_BC2_UNORM = 0x93,\nCU_AD_FORMAT_BC2_UNORM_SRGB = 0x94,\nCU_AD_FORMAT_BC3_UNORM = 0x95,\nCU_AD_FORMAT_BC3_UNORM_SRGB = 0x96,\nCU_AD_FORMAT_BC4_UNORM = 0x97,\nCU_AD_FORMAT_BC4_SNORM = 0x98,\nCU_AD_FORMAT_BC5_UNORM = 0x99,\nCU_AD_FORMAT_BC5_SNORM = 0x9a,\nCU_AD_FORMAT_BC6H_UF16 = 0x9b,\nCU_AD_FORMAT_BC6H_SF16 = 0x9c,\nCU_AD_FORMAT_BC7_UNORM = 0x9d,\nCU_AD_FORMAT_BC7_UNORM_SRGB = 0x9e,\nCU_AD_FORMAT_P010 = 0x9f,\nCU_AD_FORMAT_P016 = 0xa1,\nCU_AD_FORMAT_NV16 = 0xa2,\nCU_AD_FORMAT_P210 = 0xa3,\nCU_AD_FORMAT_P216 = 0xa4,\nCU_AD_FORMAT_YUY2 = 0xa5,\nCU_AD_FORMAT_Y210 = 0xa6,\nCU_AD_FORMAT_Y216 = 0xa7,\nCU_AD_FORMAT_AYUV = 0xa8,\nCU_AD_FORMAT_Y410 = 0xa9,\nCU_AD_FORMAT_Y416 = 0xb1,\nCU_AD_FORMAT_Y444_PLANAR8 = 0xb2,\nCU_AD_FORMAT_Y444_PLANAR10 = 0xb3,\nCU_AD_FORMAT_YUV444_8bit_SemiPlanar = 0xb4,\nCU_AD_FORMAT_YUV444_16bit_SemiPlanar = 0xb5,\nCU_AD_FORMAT_UNORM_INT_101010_2 = 0x50,\n} CUarray_format;\n  \\endcode\n\n - \\p NumChannels specifies the number of packed components per CUDA array\n element; it may be 1, 2, or 4;\n\n - ::Flags may be set to\n   - ::CUDA_ARRAY3D_LAYERED to enable creation of layered CUDA arrays. If this flag is set,\n     \\p Depth specifies the number of layers, not the depth of a 3D array.\n   - ::CUDA_ARRAY3D_SURFACE_LDST to enable surface references to be bound to the CUDA array.\n     If this flag is not set, ::cuSurfRefSetArray will fail when attempting to bind the CUDA array\n     to a surface reference.\n   - ::CUDA_ARRAY3D_CUBEMAP to enable creation of cubemaps. If this flag is set, \\p Width must be\n     equal to \\p Height, and \\p Depth must be six. If the ::CUDA_ARRAY3D_LAYERED flag is also set,\n     then \\p Depth must be a multiple of six.\n   - ::CUDA_ARRAY3D_TEXTURE_GATHER to indicate that the CUDA array will be used for texture gather.\n     Texture gather can only be performed on 2D CUDA arrays.\n\n \\p Width, \\p Height and \\p Depth must meet certain size requirements as listed in the following table.\n All values are specified in elements. Note that for brevity's sake, the full name of the device attribute\n is not specified. For ex., TEXTURE1D_WIDTH refers to the device attribute\n ::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_WIDTH.\n\n Note that 2D CUDA arrays have different size requirements if the ::CUDA_ARRAY3D_TEXTURE_GATHER flag\n is set. \\p Width and \\p Height must not be greater than ::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_GATHER_WIDTH\n and ::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_GATHER_HEIGHT respectively, in that case.\n\n <table>\n <tr><td><b>CUDA array type</b></td>\n <td><b>Valid extents that must always be met<br>{(width range in elements), (height range),\n (depth range)}</b></td>\n <td><b>Valid extents with CUDA_ARRAY3D_SURFACE_LDST set<br>\n {(width range in elements), (height range), (depth range)}</b></td></tr>\n <tr><td>1D</td>\n <td><small>{ (1,TEXTURE1D_WIDTH), 0, 0 }</small></td>\n <td><small>{ (1,SURFACE1D_WIDTH), 0, 0 }</small></td></tr>\n <tr><td>2D</td>\n <td><small>{ (1,TEXTURE2D_WIDTH), (1,TEXTURE2D_HEIGHT), 0 }</small></td>\n <td><small>{ (1,SURFACE2D_WIDTH), (1,SURFACE2D_HEIGHT), 0 }</small></td></tr>\n <tr><td>3D</td>\n <td><small>{ (1,TEXTURE3D_WIDTH), (1,TEXTURE3D_HEIGHT), (1,TEXTURE3D_DEPTH) }\n <br>OR<br>{ (1,TEXTURE3D_WIDTH_ALTERNATE), (1,TEXTURE3D_HEIGHT_ALTERNATE),\n (1,TEXTURE3D_DEPTH_ALTERNATE) }</small></td>\n <td><small>{ (1,SURFACE3D_WIDTH), (1,SURFACE3D_HEIGHT),\n (1,SURFACE3D_DEPTH) }</small></td></tr>\n <tr><td>1D Layered</td>\n <td><small>{ (1,TEXTURE1D_LAYERED_WIDTH), 0,\n (1,TEXTURE1D_LAYERED_LAYERS) }</small></td>\n <td><small>{ (1,SURFACE1D_LAYERED_WIDTH), 0,\n (1,SURFACE1D_LAYERED_LAYERS) }</small></td></tr>\n <tr><td>2D Layered</td>\n <td><small>{ (1,TEXTURE2D_LAYERED_WIDTH), (1,TEXTURE2D_LAYERED_HEIGHT),\n (1,TEXTURE2D_LAYERED_LAYERS) }</small></td>\n <td><small>{ (1,SURFACE2D_LAYERED_WIDTH), (1,SURFACE2D_LAYERED_HEIGHT),\n (1,SURFACE2D_LAYERED_LAYERS) }</small></td></tr>\n <tr><td>Cubemap</td>\n <td><small>{ (1,TEXTURECUBEMAP_WIDTH), (1,TEXTURECUBEMAP_WIDTH), 6 }</small></td>\n <td><small>{ (1,SURFACECUBEMAP_WIDTH),\n (1,SURFACECUBEMAP_WIDTH), 6 }</small></td></tr>\n <tr><td>Cubemap Layered</td>\n <td><small>{ (1,TEXTURECUBEMAP_LAYERED_WIDTH), (1,TEXTURECUBEMAP_LAYERED_WIDTH),\n (1,TEXTURECUBEMAP_LAYERED_LAYERS) }</small></td>\n <td><small>{ (1,SURFACECUBEMAP_LAYERED_WIDTH), (1,SURFACECUBEMAP_LAYERED_WIDTH),\n (1,SURFACECUBEMAP_LAYERED_LAYERS) }</small></td></tr>\n </table>\n\n Here are examples of CUDA array descriptions:\n\n Description for a CUDA array of 2048 floats:\n \\code\nCUDA_ARRAY3D_DESCRIPTOR desc;\ndesc.Format = CU_AD_FORMAT_FLOAT;\ndesc.NumChannels = 1;\ndesc.Width = 2048;\ndesc.Height = 0;\ndesc.Depth = 0;\n \\endcode\n\n Description for a 64 x 64 CUDA array of floats:\n \\code\nCUDA_ARRAY3D_DESCRIPTOR desc;\ndesc.Format = CU_AD_FORMAT_FLOAT;\ndesc.NumChannels = 1;\ndesc.Width = 64;\ndesc.Height = 64;\ndesc.Depth = 0;\n \\endcode\n\n Description for a \\p width x \\p height x \\p depth CUDA array of 64-bit,\n 4x16-bit float16's:\n \\code\nCUDA_ARRAY3D_DESCRIPTOR desc;\ndesc.Format = CU_AD_FORMAT_HALF;\ndesc.NumChannels = 4;\ndesc.Width = width;\ndesc.Height = height;\ndesc.Depth = depth;\n \\endcode\n\n \\param pHandle        - Returned array\n \\param pAllocateArray - 3D array descriptor\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_OUT_OF_MEMORY,\n ::CUDA_ERROR_UNKNOWN\n \\notefnerr\n\n \\sa ::cuArray3DGetDescriptor, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D16,\n ::cuMemsetD2D32, ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD32,\n ::cudaMalloc3DArray*/\n    fn cuArray3DCreate_v2(\n        pHandle: *mut cuda_types::cuda::CUarray,\n        pAllocateArray: *const cuda_types::cuda::CUDA_ARRAY3D_DESCRIPTOR,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Get a 3D CUDA array descriptor\n\n Returns in \\p *pArrayDescriptor a descriptor containing information on the\n format and dimensions of the CUDA array \\p hArray. It is useful for\n subroutines that have been passed a CUDA array, but need to know the CUDA\n array parameters for validation or other purposes.\n\n This function may be called on 1D and 2D arrays, in which case the \\p Height\n and/or \\p Depth members of the descriptor struct will be set to 0.\n\n \\param pArrayDescriptor - Returned 3D array descriptor\n \\param hArray           - 3D array to get descriptor of\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_CONTEXT_IS_DESTROYED\n \\notefnerr\n\n \\sa ::cuArray3DCreate, ::cuArrayCreate,\n ::cuArrayDestroy, ::cuArrayGetDescriptor, ::cuMemAlloc, ::cuMemAllocHost,\n ::cuMemAllocPitch, ::cuMemcpy2D, ::cuMemcpy2DAsync, ::cuMemcpy2DUnaligned,\n ::cuMemcpy3D, ::cuMemcpy3DAsync, ::cuMemcpyAtoA, ::cuMemcpyAtoD,\n ::cuMemcpyAtoH, ::cuMemcpyAtoHAsync, ::cuMemcpyDtoA, ::cuMemcpyDtoD, ::cuMemcpyDtoDAsync,\n ::cuMemcpyDtoH, ::cuMemcpyDtoHAsync, ::cuMemcpyHtoA, ::cuMemcpyHtoAAsync,\n ::cuMemcpyHtoD, ::cuMemcpyHtoDAsync, ::cuMemFree, ::cuMemFreeHost,\n ::cuMemGetAddressRange, ::cuMemGetInfo, ::cuMemHostAlloc,\n ::cuMemHostGetDevicePointer, ::cuMemsetD2D8, ::cuMemsetD2D16,\n ::cuMemsetD2D32, ::cuMemsetD8, ::cuMemsetD16, ::cuMemsetD32,\n ::cudaArrayGetInfo*/\n    fn cuArray3DGetDescriptor_v2(\n        pArrayDescriptor: *mut cuda_types::cuda::CUDA_ARRAY3D_DESCRIPTOR,\n        hArray: cuda_types::cuda::CUarray,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Creates a CUDA mipmapped array\n\n Creates a CUDA mipmapped array according to the ::CUDA_ARRAY3D_DESCRIPTOR structure\n \\p pMipmappedArrayDesc and returns a handle to the new CUDA mipmapped array in \\p *pHandle.\n \\p numMipmapLevels specifies the number of mipmap levels to be allocated. This value is\n clamped to the range [1, 1 + floor(log2(max(width, height, depth)))].\n\n The ::CUDA_ARRAY3D_DESCRIPTOR is defined as:\n\n \\code\ntypedef struct {\nunsigned int Width;\nunsigned int Height;\nunsigned int Depth;\nCUarray_format Format;\nunsigned int NumChannels;\nunsigned int Flags;\n} CUDA_ARRAY3D_DESCRIPTOR;\n \\endcode\n where:\n\n - \\p Width, \\p Height, and \\p Depth are the width, height, and depth of the\n CUDA array (in elements); the following types of CUDA arrays can be allocated:\n     - A 1D mipmapped array is allocated if \\p Height and \\p Depth extents are both zero.\n     - A 2D mipmapped array is allocated if only \\p Depth extent is zero.\n     - A 3D mipmapped array is allocated if all three extents are non-zero.\n     - A 1D layered CUDA mipmapped array is allocated if only \\p Height is zero and the\n       ::CUDA_ARRAY3D_LAYERED flag is set. Each layer is a 1D array. The number\n       of layers is determined by the depth extent.\n     - A 2D layered CUDA mipmapped array is allocated if all three extents are non-zero and\n       the ::CUDA_ARRAY3D_LAYERED flag is set. Each layer is a 2D array. The number\n       of layers is determined by the depth extent.\n     - A cubemap CUDA mipmapped array is allocated if all three extents are non-zero and the\n       ::CUDA_ARRAY3D_CUBEMAP flag is set. \\p Width must be equal to \\p Height, and\n       \\p Depth must be six. A cubemap is a special type of 2D layered CUDA array,\n       where the six layers represent the six faces of a cube. The order of the six\n       layers in memory is the same as that listed in ::CUarray_cubemap_face.\n     - A cubemap layered CUDA mipmapped array is allocated if all three extents are non-zero,\n       and both, ::CUDA_ARRAY3D_CUBEMAP and ::CUDA_ARRAY3D_LAYERED flags are set.\n       \\p Width must be equal to \\p Height, and \\p Depth must be a multiple of six.\n       A cubemap layered CUDA array is a special type of 2D layered CUDA array that\n       consists of a collection of cubemaps. The first six layers represent the first\n       cubemap, the next six layers form the second cubemap, and so on.\n\n - ::Format specifies the format of the elements; ::CUarray_format is\n defined as:\n \\code\ntypedef enum CUarray_format_enum {\nCU_AD_FORMAT_UNSIGNED_INT8 = 0x01,\nCU_AD_FORMAT_UNSIGNED_INT16 = 0x02,\nCU_AD_FORMAT_UNSIGNED_INT32 = 0x03,\nCU_AD_FORMAT_SIGNED_INT8 = 0x08,\nCU_AD_FORMAT_SIGNED_INT16 = 0x09,\nCU_AD_FORMAT_SIGNED_INT32 = 0x0a,\nCU_AD_FORMAT_HALF = 0x10,\nCU_AD_FORMAT_FLOAT = 0x20,\nCU_AD_FORMAT_NV12 = 0xb0,\nCU_AD_FORMAT_UNORM_INT8X1 = 0xc0,\nCU_AD_FORMAT_UNORM_INT8X2 = 0xc1,\nCU_AD_FORMAT_UNORM_INT8X4 = 0xc2,\nCU_AD_FORMAT_UNORM_INT16X1 = 0xc3,\nCU_AD_FORMAT_UNORM_INT16X2 = 0xc4,\nCU_AD_FORMAT_UNORM_INT16X4 = 0xc5,\nCU_AD_FORMAT_SNORM_INT8X1 = 0xc6,\nCU_AD_FORMAT_SNORM_INT8X2 = 0xc7,\nCU_AD_FORMAT_SNORM_INT8X4 = 0xc8,\nCU_AD_FORMAT_SNORM_INT16X1 = 0xc9,\nCU_AD_FORMAT_SNORM_INT16X2 = 0xca,\nCU_AD_FORMAT_SNORM_INT16X4 = 0xcb,\nCU_AD_FORMAT_BC1_UNORM = 0x91,\nCU_AD_FORMAT_BC1_UNORM_SRGB = 0x92,\nCU_AD_FORMAT_BC2_UNORM = 0x93,\nCU_AD_FORMAT_BC2_UNORM_SRGB = 0x94,\nCU_AD_FORMAT_BC3_UNORM = 0x95,\nCU_AD_FORMAT_BC3_UNORM_SRGB = 0x96,\nCU_AD_FORMAT_BC4_UNORM = 0x97,\nCU_AD_FORMAT_BC4_SNORM = 0x98,\nCU_AD_FORMAT_BC5_UNORM = 0x99,\nCU_AD_FORMAT_BC5_SNORM = 0x9a,\nCU_AD_FORMAT_BC6H_UF16 = 0x9b,\nCU_AD_FORMAT_BC6H_SF16 = 0x9c,\nCU_AD_FORMAT_BC7_UNORM = 0x9d,\nCU_AD_FORMAT_BC7_UNORM_SRGB = 0x9e,\nCU_AD_FORMAT_P010 = 0x9f,\nCU_AD_FORMAT_P016 = 0xa1,\nCU_AD_FORMAT_NV16 = 0xa2,\nCU_AD_FORMAT_P210 = 0xa3,\nCU_AD_FORMAT_P216 = 0xa4,\nCU_AD_FORMAT_YUY2 = 0xa5,\nCU_AD_FORMAT_Y210 = 0xa6,\nCU_AD_FORMAT_Y216 = 0xa7,\nCU_AD_FORMAT_AYUV = 0xa8,\nCU_AD_FORMAT_Y410 = 0xa9,\nCU_AD_FORMAT_Y416 = 0xb1,\nCU_AD_FORMAT_Y444_PLANAR8 = 0xb2,\nCU_AD_FORMAT_Y444_PLANAR10 = 0xb3,\nCU_AD_FORMAT_YUV444_8bit_SemiPlanar = 0xb4,\nCU_AD_FORMAT_YUV444_16bit_SemiPlanar = 0xb5,\nCU_AD_FORMAT_UNORM_INT_101010_2 = 0x50,\n} CUarray_format;\n  \\endcode\n\n - \\p NumChannels specifies the number of packed components per CUDA array\n element; it may be 1, 2, or 4;\n\n - ::Flags may be set to\n   - ::CUDA_ARRAY3D_LAYERED to enable creation of layered CUDA mipmapped arrays. If this flag is set,\n     \\p Depth specifies the number of layers, not the depth of a 3D array.\n   - ::CUDA_ARRAY3D_SURFACE_LDST to enable surface references to be bound to individual mipmap levels of\n     the CUDA mipmapped array. If this flag is not set, ::cuSurfRefSetArray will fail when attempting to\n     bind a mipmap level of the CUDA mipmapped array to a surface reference.\n   - ::CUDA_ARRAY3D_CUBEMAP to enable creation of mipmapped cubemaps. If this flag is set, \\p Width must be\n     equal to \\p Height, and \\p Depth must be six. If the ::CUDA_ARRAY3D_LAYERED flag is also set,\n     then \\p Depth must be a multiple of six.\n   - ::CUDA_ARRAY3D_TEXTURE_GATHER to indicate that the CUDA mipmapped array will be used for texture gather.\n     Texture gather can only be performed on 2D CUDA mipmapped arrays.\n\n \\p Width, \\p Height and \\p Depth must meet certain size requirements as listed in the following table.\n All values are specified in elements. Note that for brevity's sake, the full name of the device attribute\n is not specified. For ex., TEXTURE1D_MIPMAPPED_WIDTH refers to the device attribute\n ::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_MIPMAPPED_WIDTH.\n\n <table>\n <tr><td><b>CUDA array type</b></td>\n <td><b>Valid extents that must always be met<br>{(width range in elements), (height range),\n (depth range)}</b></td>\n <td><b>Valid extents with CUDA_ARRAY3D_SURFACE_LDST set<br>\n {(width range in elements), (height range), (depth range)}</b></td></tr>\n <tr><td>1D</td>\n <td><small>{ (1,TEXTURE1D_MIPMAPPED_WIDTH), 0, 0 }</small></td>\n <td><small>{ (1,SURFACE1D_WIDTH), 0, 0 }</small></td></tr>\n <tr><td>2D</td>\n <td><small>{ (1,TEXTURE2D_MIPMAPPED_WIDTH), (1,TEXTURE2D_MIPMAPPED_HEIGHT), 0 }</small></td>\n <td><small>{ (1,SURFACE2D_WIDTH), (1,SURFACE2D_HEIGHT), 0 }</small></td></tr>\n <tr><td>3D</td>\n <td><small>{ (1,TEXTURE3D_WIDTH), (1,TEXTURE3D_HEIGHT), (1,TEXTURE3D_DEPTH) }\n <br>OR<br>{ (1,TEXTURE3D_WIDTH_ALTERNATE), (1,TEXTURE3D_HEIGHT_ALTERNATE),\n (1,TEXTURE3D_DEPTH_ALTERNATE) }</small></td>\n <td><small>{ (1,SURFACE3D_WIDTH), (1,SURFACE3D_HEIGHT),\n (1,SURFACE3D_DEPTH) }</small></td></tr>\n <tr><td>1D Layered</td>\n <td><small>{ (1,TEXTURE1D_LAYERED_WIDTH), 0,\n (1,TEXTURE1D_LAYERED_LAYERS) }</small></td>\n <td><small>{ (1,SURFACE1D_LAYERED_WIDTH), 0,\n (1,SURFACE1D_LAYERED_LAYERS) }</small></td></tr>\n <tr><td>2D Layered</td>\n <td><small>{ (1,TEXTURE2D_LAYERED_WIDTH), (1,TEXTURE2D_LAYERED_HEIGHT),\n (1,TEXTURE2D_LAYERED_LAYERS) }</small></td>\n <td><small>{ (1,SURFACE2D_LAYERED_WIDTH), (1,SURFACE2D_LAYERED_HEIGHT),\n (1,SURFACE2D_LAYERED_LAYERS) }</small></td></tr>\n <tr><td>Cubemap</td>\n <td><small>{ (1,TEXTURECUBEMAP_WIDTH), (1,TEXTURECUBEMAP_WIDTH), 6 }</small></td>\n <td><small>{ (1,SURFACECUBEMAP_WIDTH),\n (1,SURFACECUBEMAP_WIDTH), 6 }</small></td></tr>\n <tr><td>Cubemap Layered</td>\n <td><small>{ (1,TEXTURECUBEMAP_LAYERED_WIDTH), (1,TEXTURECUBEMAP_LAYERED_WIDTH),\n (1,TEXTURECUBEMAP_LAYERED_LAYERS) }</small></td>\n <td><small>{ (1,SURFACECUBEMAP_LAYERED_WIDTH), (1,SURFACECUBEMAP_LAYERED_WIDTH),\n (1,SURFACECUBEMAP_LAYERED_LAYERS) }</small></td></tr>\n </table>\n\n\n \\param pHandle             - Returned mipmapped array\n \\param pMipmappedArrayDesc - mipmapped array descriptor\n \\param numMipmapLevels     - Number of mipmap levels\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_OUT_OF_MEMORY,\n ::CUDA_ERROR_UNKNOWN\n \\notefnerr\n\n \\sa\n ::cuMipmappedArrayDestroy,\n ::cuMipmappedArrayGetLevel,\n ::cuArrayCreate,\n ::cudaMallocMipmappedArray*/\n    fn cuMipmappedArrayCreate(\n        pHandle: *mut cuda_types::cuda::CUmipmappedArray,\n        pMipmappedArrayDesc: *const cuda_types::cuda::CUDA_ARRAY3D_DESCRIPTOR,\n        numMipmapLevels: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Gets a mipmap level of a CUDA mipmapped array\n\n Returns in \\p *pLevelArray a CUDA array that represents a single mipmap level\n of the CUDA mipmapped array \\p hMipmappedArray.\n\n If \\p level is greater than the maximum number of levels in this mipmapped array,\n ::CUDA_ERROR_INVALID_VALUE is returned.\n\n \\param pLevelArray     - Returned mipmap level CUDA array\n \\param hMipmappedArray - CUDA mipmapped array\n \\param level           - Mipmap level\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE\n \\notefnerr\n\n \\sa\n ::cuMipmappedArrayCreate,\n ::cuMipmappedArrayDestroy,\n ::cuArrayCreate,\n ::cudaGetMipmappedArrayLevel*/\n    fn cuMipmappedArrayGetLevel(\n        pLevelArray: *mut cuda_types::cuda::CUarray,\n        hMipmappedArray: cuda_types::cuda::CUmipmappedArray,\n        level: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Destroys a CUDA mipmapped array\n\n Destroys the CUDA mipmapped array \\p hMipmappedArray.\n\n \\param hMipmappedArray - Mipmapped array to destroy\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_ARRAY_IS_MAPPED,\n ::CUDA_ERROR_CONTEXT_IS_DESTROYED\n \\notefnerr\n\n \\sa\n ::cuMipmappedArrayCreate,\n ::cuMipmappedArrayGetLevel,\n ::cuArrayCreate,\n ::cudaFreeMipmappedArray*/\n    fn cuMipmappedArrayDestroy(\n        hMipmappedArray: cuda_types::cuda::CUmipmappedArray,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Retrieve handle for an address range\n\n Get a handle of the specified type to an address range.\n When requesting CUmemRangeHandleType::CU_MEM_RANGE_HANDLE_TYPE_DMA_BUF_FD,\n address range obtained by a prior call to either ::cuMemAlloc or\n ::cuMemAddressReserve is supported if the ::CU_DEVICE_ATTRIBUTE_DMA_BUF_SUPPORTED\n device attribute returns true.\n If the address range was obtained via ::cuMemAddressReserve, it\n must also be fully mapped via ::cuMemMap.\n Address range obtained by a prior call to either ::cuMemAllocHost or ::cuMemHostAlloc\n is supported if the ::CU_DEVICE_ATTRIBUTE_HOST_ALLOC_DMA_BUF_SUPPORTED device\n attribute returns true.\n\n As of CUDA 13.0, querying support for address range obtained by calling\n ::cuMemAllocHost or ::cuMemHostAlloc using the\n ::CU_DEVICE_ATTRIBUTE_DMA_BUF_SUPPORTED device attribute is deprecated.\n\n Users must ensure the \\p dptr and \\p size are aligned to the host page size.\n\n The \\p handle will be interpreted as a pointer to an integer to store the dma_buf file descriptor.\n Users must ensure the entire address range is backed and mapped when\n the address range is allocated by ::cuMemAddressReserve. All the physical\n allocations backing the address range must be resident on the same device and\n have identical allocation properties. Users are also expected to retrieve a\n new handle every time the underlying physical allocation(s) corresponding\n to a previously queried VA range are changed.\n\n For CUmemRangeHandleType::CU_MEM_RANGE_HANDLE_TYPE_DMA_BUF_FD, users may set\n flags to ::CU_MEM_RANGE_FLAG_DMA_BUF_MAPPING_TYPE_PCIE. Which when set on a\n supported platform, will give a DMA_BUF handle mapped via PCIE BAR1 or will\n return an error otherwise.\n\n \\param[out] handle     - Pointer to the location where the returned handle will be stored.\n \\param[in] dptr        - Pointer to a valid CUDA device allocation. Must be aligned to host page size.\n \\param[in] size        - Length of the address range. Must be aligned to host page size.\n \\param[in] handleType  - Type of handle requested (defines type and size of the \\p handle output parameter)\n \\param[in] flags       - When requesting CUmemRangeHandleType::CU_MEM_RANGE_HANDLE_TYPE_DMA_BUF_FD the value could be\n                          ::CU_MEM_RANGE_FLAG_DMA_BUF_MAPPING_TYPE_PCIE, otherwise 0.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_SUPPORTED*/\n    fn cuMemGetHandleForAddressRange(\n        handle: *mut ::core::ffi::c_void,\n        dptr: cuda_types::cuda::CUdeviceptr,\n        size: usize,\n        handleType: cuda_types::cuda::CUmemRangeHandleType,\n        flags: ::core::ffi::c_ulonglong,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief   Submit a batch of \\p count independent decompression operations.\n\n \\details Each of the \\p count decompression operations is described by a\n          single entry in the \\p paramsArray array. Once the batch has been\n          submitted, the function will return, and decompression will happen\n          asynchronously w.r.t. the CPU. To the work completion tracking\n          mechanisms in the CUDA driver, the batch will be considered a single\n          unit of work and processed according to stream semantics, i.e., it\n          is not possible to query the completion of individual decompression\n          operations within a batch.\n\n          The memory pointed to by each of ::CUmemDecompressParams.src,\n          ::CUmemDecompressParams.dst, and ::CUmemDecompressParams.dstActBytes,\n          must be capable of usage with the hardware decompress feature. That\n          is, for each of said pointers, the pointer attribute\n          ::CU_POINTER_ATTRIBUTE_IS_HW_DECOMPRESS_CAPABLE should give a\n          non-zero value. To ensure this, the memory backing the pointers\n          should have been allocated using one of the following CUDA memory\n          allocators:\n          * ::cuMemAlloc()\n          * ::cuMemCreate() with the usage flag ::CU_MEM_CREATE_USAGE_HW_DECOMPRESS\n          * ::cuMemAllocFromPoolAsync() from a pool that was created with\n            the usage flag ::CU_MEM_POOL_CREATE_USAGE_HW_DECOMPRESS\n          Additionally, ::CUmemDecompressParams.src, ::CUmemDecompressParams.dst,\n          and ::CUmemDecompressParams.dstActBytes, must all be accessible from\n          the device associated with the context where \\p stream was created.\n          For information on how to ensure this, see the documentation for the\n          allocator of interest.\n\n \\param[in]  paramsArray  The array of structures describing the independent\n                          decompression operations.\n \\param[in]  count        The number of entries in \\p paramsArray array.\n \\param[in]  flags        Must be 0.\n \\param[out] errorIndex   The index into \\p paramsArray of the decompression\n                          operation for which the error returned by this\n                          function pertains to. If \\p index is SIZE_MAX and\n                          the value returned is not ::CUDA_SUCCESS, then the\n                          error returned by this function should be considered\n                          a general error that does not pertain to a\n                          particular decompression operation. May be \\p NULL,\n                          in which case, no index will be recorded in the\n                          event of error.\n \\param[in]  stream       The stream where the work will be enqueued.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE\n \\notefnerr\n \\note_async\n \\note_null_stream\n\n \\sa ::cuMemAlloc, ::cuMemPoolCreate, ::cuMemAllocFromPoolAsync*/\n    fn cuMemBatchDecompressAsync_ptsz(\n        paramsArray: *mut cuda_types::cuda::CUmemDecompressParams,\n        count: usize,\n        flags: ::core::ffi::c_uint,\n        errorIndex: *mut usize,\n        stream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Allocate an address range reservation.\n\n Reserves a virtual address range based on the given parameters, giving\n the starting address of the range in \\p ptr.  This API requires a system that\n supports UVA.  The size and address parameters must be a multiple of the\n host page size and the alignment must be a power of two or zero for default\n alignment. If \\p addr is 0, then the driver chooses the address at which to\n place the start of the reservation whereas when it is non-zero then the driver\n treats it as a hint about where to place the reservation.\n\n \\param[out] ptr       - Resulting pointer to start of virtual address range allocated\n \\param[in]  size      - Size of the reserved virtual address range requested\n \\param[in]  alignment - Alignment of the reserved virtual address range requested\n \\param[in]  addr      - Hint address for the start of the address range\n \\param[in]  flags     - Currently unused, must be zero\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_OUT_OF_MEMORY,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_PERMITTED,\n ::CUDA_ERROR_NOT_SUPPORTED\n\n \\sa ::cuMemAddressFree*/\n    fn cuMemAddressReserve(\n        ptr: *mut cuda_types::cuda::CUdeviceptr,\n        size: usize,\n        alignment: usize,\n        addr: cuda_types::cuda::CUdeviceptr,\n        flags: ::core::ffi::c_ulonglong,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Free an address range reservation.\n\n Frees a virtual address range reserved by cuMemAddressReserve.  The size\n must match what was given to memAddressReserve and the ptr given must\n match what was returned from memAddressReserve.\n\n \\param[in] ptr  - Starting address of the virtual address range to free\n \\param[in] size - Size of the virtual address region to free\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_PERMITTED,\n ::CUDA_ERROR_NOT_SUPPORTED\n\n \\sa ::cuMemAddressReserve*/\n    fn cuMemAddressFree(\n        ptr: cuda_types::cuda::CUdeviceptr,\n        size: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Create a CUDA memory handle representing a memory allocation of a given size described by the given properties\n\n This creates a memory allocation on the target device specified through the\n \\p prop structure. The created allocation will not have any device or host\n mappings. The generic memory \\p handle for the allocation can be\n mapped to the address space of calling process via ::cuMemMap. This handle\n cannot be transmitted directly to other processes (see\n ::cuMemExportToShareableHandle).  On Windows, the caller must also pass\n an LPSECURITYATTRIBUTE in \\p prop to be associated with this handle which\n limits or allows access to this handle for a recipient process (see\n ::CUmemAllocationProp::win32HandleMetaData for more).  The \\p size of this\n allocation must be a multiple of the the value given via\n ::cuMemGetAllocationGranularity with the ::CU_MEM_ALLOC_GRANULARITY_MINIMUM\n flag.\n To create a CPU allocation that doesn't target any specific NUMA nodes, applications must\n set ::CUmemAllocationProp::CUmemLocation::type to ::CU_MEM_LOCATION_TYPE_HOST.\n ::CUmemAllocationProp::CUmemLocation::id is ignored for HOST allocations.\n HOST allocations are not IPC capable and ::CUmemAllocationProp::requestedHandleTypes must be 0,\n any other value will result in ::CUDA_ERROR_INVALID_VALUE.\n To create a CPU allocation targeting a specific host NUMA node, applications must\n set ::CUmemAllocationProp::CUmemLocation::type to ::CU_MEM_LOCATION_TYPE_HOST_NUMA and\n ::CUmemAllocationProp::CUmemLocation::id must specify the NUMA ID of the CPU.\n On systems where NUMA is not available ::CUmemAllocationProp::CUmemLocation::id must be set to 0.\n Specifying ::CU_MEM_LOCATION_TYPE_HOST_NUMA_CURRENT as the\n ::CUmemLocation::type will result in ::CUDA_ERROR_INVALID_VALUE.\n\n Applications that intend to use ::CU_MEM_HANDLE_TYPE_FABRIC based memory sharing must ensure:\n (1) `nvidia-caps-imex-channels` character device is created by the driver and is listed under /proc/devices\n (2) have at least one IMEX channel file accessible by the user launching the application.\n\n When exporter and importer CUDA processes have been granted access to the same IMEX channel, they can securely\n share memory.\n\n The IMEX channel security model works on a per user basis. Which means all processes under a user can share\n memory if the user has access to a valid IMEX channel. When multi-user isolation is desired, a separate IMEX\n channel is required for each user.\n\n These channel files exist in /dev/nvidia-caps-imex-channels/channel* and can be created using standard OS\n native calls like mknod on Linux. For example: To create channel0 with the major number from /proc/devices\n users can execute the following command: `mknod /dev/nvidia-caps-imex-channels/channel0 c <major number> 0`\n\n If ::CUmemAllocationProp::allocFlags::usage contains ::CU_MEM_CREATE_USAGE_TILE_POOL flag then\n the memory allocation is intended only to be used as backing tile pool for sparse CUDA arrays\n and sparse CUDA mipmapped arrays.\n (see ::cuMemMapArrayAsync).\n\n \\param[out] handle - Value of handle returned. All operations on this allocation are to be performed using this handle.\n \\param[in]  size   - Size of the allocation requested\n \\param[in]  prop   - Properties of the allocation to create.\n \\param[in]  flags  - flags for future use, must be zero now.\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_OUT_OF_MEMORY,\n ::CUDA_ERROR_INVALID_DEVICE,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_PERMITTED,\n ::CUDA_ERROR_NOT_SUPPORTED\n \\notefnerr\n\n \\sa ::cuMemRelease, ::cuMemExportToShareableHandle, ::cuMemImportFromShareableHandle*/\n    fn cuMemCreate(\n        handle: *mut cuda_types::cuda::CUmemGenericAllocationHandle,\n        size: usize,\n        prop: *const cuda_types::cuda::CUmemAllocationProp,\n        flags: ::core::ffi::c_ulonglong,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Release a memory handle representing a memory allocation which was previously allocated through cuMemCreate.\n\n Frees the memory that was allocated on a device through cuMemCreate.\n\n The memory allocation will be freed when all outstanding mappings to the memory\n are unmapped and when all outstanding references to the handle (including it's\n shareable counterparts) are also released. The generic memory handle can be\n freed when there are still outstanding mappings made with this handle. Each\n time a recipient process imports a shareable handle, it needs to pair it with\n ::cuMemRelease for the handle to be freed.  If \\p handle is not a valid handle\n the behavior is undefined.\n\n \\param[in] handle Value of handle which was returned previously by cuMemCreate.\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_PERMITTED,\n ::CUDA_ERROR_NOT_SUPPORTED\n \\notefnerr\n\n \\sa ::cuMemCreate*/\n    fn cuMemRelease(\n        handle: cuda_types::cuda::CUmemGenericAllocationHandle,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Maps an allocation handle to a reserved virtual address range.\n\n Maps bytes of memory represented by \\p handle starting from byte \\p offset to\n \\p size to address range [\\p addr, \\p addr + \\p size]. This range must be an\n address reservation previously reserved with ::cuMemAddressReserve, and\n \\p offset + \\p size must be less than the size of the memory allocation.\n Both \\p ptr, \\p size, and \\p offset must be a multiple of the value given via\n ::cuMemGetAllocationGranularity with the ::CU_MEM_ALLOC_GRANULARITY_MINIMUM flag.\n If \\p handle represents a multicast object, \\p ptr, \\p size and \\p offset must\n be aligned to the value returned by ::cuMulticastGetGranularity with the flag\n ::CU_MULTICAST_MINIMUM_GRANULARITY. For best performance however, it is\n recommended that \\p ptr, \\p size and \\p offset be aligned to the value\n returned by ::cuMulticastGetGranularity with the flag\n ::CU_MULTICAST_RECOMMENDED_GRANULARITY.\n\n When \\p handle represents a multicast object, this call may return\n CUDA_ERROR_ILLEGAL_STATE if the system configuration is in an illegal state.\n In such cases, to continue using multicast, verify that the system\n configuration is in a valid state and all required driver daemons are\n running properly.\n\n Please note calling ::cuMemMap does not make the address accessible,\n the caller needs to update accessibility of a contiguous mapped VA\n range by calling ::cuMemSetAccess.\n\n Once a recipient process obtains a shareable memory handle\n from ::cuMemImportFromShareableHandle, the process must\n use ::cuMemMap to map the memory into its address ranges before\n setting accessibility with ::cuMemSetAccess.\n\n ::cuMemMap can only create mappings on VA range reservations\n that are not currently mapped.\n\n \\param[in] ptr    - Address where memory will be mapped.\n \\param[in] size   - Size of the memory mapping.\n \\param[in] offset - Offset into the memory represented by\n                   - \\p handle from which to start mapping\n                   - Note: currently must be zero.\n \\param[in] handle - Handle to a shareable memory\n \\param[in] flags  - flags for future use, must be zero now.\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE,\n ::CUDA_ERROR_OUT_OF_MEMORY,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_PERMITTED,\n ::CUDA_ERROR_NOT_SUPPORTED,\n ::CUDA_ERROR_ILLEGAL_STATE\n \\notefnerr\n\n \\sa ::cuMemUnmap, ::cuMemSetAccess, ::cuMemCreate, ::cuMemAddressReserve, ::cuMemImportFromShareableHandle*/\n    fn cuMemMap(\n        ptr: cuda_types::cuda::CUdeviceptr,\n        size: usize,\n        offset: usize,\n        handle: cuda_types::cuda::CUmemGenericAllocationHandle,\n        flags: ::core::ffi::c_ulonglong,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Maps or unmaps subregions of sparse CUDA arrays and sparse CUDA mipmapped arrays\n\n Performs map or unmap operations on subregions of sparse CUDA arrays and sparse CUDA mipmapped arrays.\n Each operation is specified by a ::CUarrayMapInfo entry in the \\p mapInfoList array of size \\p count.\n The structure ::CUarrayMapInfo is defined as follow:\n\\code\ntypedef struct CUarrayMapInfo_st {\nCUresourcetype resourceType;\nunion {\nCUmipmappedArray mipmap;\nCUarray array;\n} resource;\n\nCUarraySparseSubresourceType subresourceType;\nunion {\nstruct {\nunsigned int level;\nunsigned int layer;\nunsigned int offsetX;\nunsigned int offsetY;\nunsigned int offsetZ;\nunsigned int extentWidth;\nunsigned int extentHeight;\nunsigned int extentDepth;\n} sparseLevel;\nstruct {\nunsigned int layer;\nunsigned long long offset;\nunsigned long long size;\n} miptail;\n} subresource;\n\nCUmemOperationType memOperationType;\n\nCUmemHandleType memHandleType;\nunion {\nCUmemGenericAllocationHandle memHandle;\n} memHandle;\n\nunsigned long long offset;\nunsigned int deviceBitMask;\nunsigned int flags;\nunsigned int reserved[2];\n} CUarrayMapInfo;\n\\endcode\n\n where ::CUarrayMapInfo::resourceType specifies the type of resource to be operated on.\n If ::CUarrayMapInfo::resourceType is set to ::CUresourcetype::CU_RESOURCE_TYPE_ARRAY then\n ::CUarrayMapInfo::resource::array must be set to a valid sparse CUDA array handle.\n The CUDA array must be either a 2D, 2D layered or 3D CUDA array and must have been allocated using\n ::cuArrayCreate or ::cuArray3DCreate with the flag ::CUDA_ARRAY3D_SPARSE\n or ::CUDA_ARRAY3D_DEFERRED_MAPPING.\n For CUDA arrays obtained using ::cuMipmappedArrayGetLevel, ::CUDA_ERROR_INVALID_VALUE will be returned.\n If ::CUarrayMapInfo::resourceType is set to ::CUresourcetype::CU_RESOURCE_TYPE_MIPMAPPED_ARRAY\n then ::CUarrayMapInfo::resource::mipmap must be set to a valid sparse CUDA mipmapped array handle.\n The CUDA mipmapped array must be either a 2D, 2D layered or 3D CUDA mipmapped array and must have been\n allocated using ::cuMipmappedArrayCreate with the flag ::CUDA_ARRAY3D_SPARSE\n or ::CUDA_ARRAY3D_DEFERRED_MAPPING.\n\n ::CUarrayMapInfo::subresourceType specifies the type of subresource within the resource.\n ::CUarraySparseSubresourceType_enum is defined as:\n\\code\ntypedef enum CUarraySparseSubresourceType_enum {\nCU_ARRAY_SPARSE_SUBRESOURCE_TYPE_SPARSE_LEVEL = 0,\nCU_ARRAY_SPARSE_SUBRESOURCE_TYPE_MIPTAIL = 1\n} CUarraySparseSubresourceType;\n\\endcode\n\n where ::CUarraySparseSubresourceType::CU_ARRAY_SPARSE_SUBRESOURCE_TYPE_SPARSE_LEVEL indicates a\n sparse-miplevel which spans at least one tile in every dimension. The remaining miplevels which\n are too small to span at least one tile in any dimension constitute the mip tail region as indicated by\n ::CUarraySparseSubresourceType::CU_ARRAY_SPARSE_SUBRESOURCE_TYPE_MIPTAIL subresource type.\n\n If ::CUarrayMapInfo::subresourceType is set to ::CUarraySparseSubresourceType::CU_ARRAY_SPARSE_SUBRESOURCE_TYPE_SPARSE_LEVEL\n then ::CUarrayMapInfo::subresource::sparseLevel struct must contain valid array subregion offsets and extents.\n The ::CUarrayMapInfo::subresource::sparseLevel::offsetX, ::CUarrayMapInfo::subresource::sparseLevel::offsetY\n and ::CUarrayMapInfo::subresource::sparseLevel::offsetZ must specify valid X, Y and Z offsets respectively.\n The ::CUarrayMapInfo::subresource::sparseLevel::extentWidth, ::CUarrayMapInfo::subresource::sparseLevel::extentHeight\n and ::CUarrayMapInfo::subresource::sparseLevel::extentDepth must specify valid width, height and depth extents respectively.\n These offsets and extents must be aligned to the corresponding tile dimension.\n For CUDA mipmapped arrays ::CUarrayMapInfo::subresource::sparseLevel::level must specify a valid mip level index. Otherwise,\n must be zero.\n For layered CUDA arrays and layered CUDA mipmapped arrays ::CUarrayMapInfo::subresource::sparseLevel::layer must specify a valid layer index. Otherwise,\n must be zero.\n ::CUarrayMapInfo::subresource::sparseLevel::offsetZ must be zero and ::CUarrayMapInfo::subresource::sparseLevel::extentDepth\n must be set to 1 for 2D and 2D layered CUDA arrays and CUDA mipmapped arrays.\n Tile extents can be obtained by calling ::cuArrayGetSparseProperties and ::cuMipmappedArrayGetSparseProperties\n\n If ::CUarrayMapInfo::subresourceType is set to ::CUarraySparseSubresourceType::CU_ARRAY_SPARSE_SUBRESOURCE_TYPE_MIPTAIL\n then ::CUarrayMapInfo::subresource::miptail struct must contain valid mip tail offset in\n ::CUarrayMapInfo::subresource::miptail::offset and size in ::CUarrayMapInfo::subresource::miptail::size.\n Both, mip tail offset and mip tail size must be aligned to the tile size.\n For layered CUDA mipmapped arrays which don't have the flag ::CU_ARRAY_SPARSE_PROPERTIES_SINGLE_MIPTAIL set in ::CUDA_ARRAY_SPARSE_PROPERTIES::flags\n as returned by ::cuMipmappedArrayGetSparseProperties, ::CUarrayMapInfo::subresource::miptail::layer must specify a valid layer index.\n Otherwise, must be zero.\n\n If ::CUarrayMapInfo::resource::array or ::CUarrayMapInfo::resource::mipmap was created with ::CUDA_ARRAY3D_DEFERRED_MAPPING\n flag set the ::CUarrayMapInfo::subresourceType and the contents of ::CUarrayMapInfo::subresource will be ignored.\n\n ::CUarrayMapInfo::memOperationType specifies the type of operation. ::CUmemOperationType is defined as:\n\\code\ntypedef enum CUmemOperationType_enum {\nCU_MEM_OPERATION_TYPE_MAP = 1,\nCU_MEM_OPERATION_TYPE_UNMAP = 2\n} CUmemOperationType;\n\\endcode\n If ::CUarrayMapInfo::memOperationType is set to ::CUmemOperationType::CU_MEM_OPERATION_TYPE_MAP then the subresource\n will be mapped onto the tile pool memory specified by ::CUarrayMapInfo::memHandle at offset ::CUarrayMapInfo::offset.\n The tile pool allocation has to be created by specifying the ::CU_MEM_CREATE_USAGE_TILE_POOL flag when calling ::cuMemCreate. Also,\n ::CUarrayMapInfo::memHandleType must be set to ::CUmemHandleType::CU_MEM_HANDLE_TYPE_GENERIC.\n\n If ::CUarrayMapInfo::memOperationType is set to ::CUmemOperationType::CU_MEM_OPERATION_TYPE_UNMAP then an unmapping operation\n is performed. ::CUarrayMapInfo::memHandle must be NULL.\n\n ::CUarrayMapInfo::deviceBitMask specifies the list of devices that must map or unmap physical memory.\n Currently, this mask must have exactly one bit set, and the corresponding device must match the device associated with the stream.\n If ::CUarrayMapInfo::memOperationType is set to ::CUmemOperationType::CU_MEM_OPERATION_TYPE_MAP, the device must also match\n the device associated with the tile pool memory allocation as specified by ::CUarrayMapInfo::memHandle.\n\n ::CUarrayMapInfo::flags and ::CUarrayMapInfo::reserved[] are unused and must be set to zero.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE\n\n \\param[in] mapInfoList - List of ::CUarrayMapInfo\n \\param[in] count       - Count of ::CUarrayMapInfo  in \\p mapInfoList\n \\param[in] hStream     - Stream identifier for the stream to use for map or unmap operations\n\n \\sa ::cuMipmappedArrayCreate, ::cuArrayCreate, ::cuArray3DCreate, ::cuMemCreate, ::cuArrayGetSparseProperties, ::cuMipmappedArrayGetSparseProperties*/\n    fn cuMemMapArrayAsync_ptsz(\n        mapInfoList: *mut cuda_types::cuda::CUarrayMapInfo,\n        count: ::core::ffi::c_uint,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Unmap the backing memory of a given address range.\n\n The range must be the entire contiguous address range that was mapped to.  In\n other words, ::cuMemUnmap cannot unmap a sub-range of an address range mapped\n by ::cuMemCreate / ::cuMemMap.  Any backing memory allocations will be freed\n if there are no existing mappings and there are no unreleased memory handles.\n\n When ::cuMemUnmap returns successfully the address range is converted to an\n address reservation and can be used for a future calls to ::cuMemMap.  Any new\n mapping to this virtual address will need to have access granted through\n ::cuMemSetAccess, as all mappings start with no accessibility setup.\n\n \\param[in] ptr  - Starting address for the virtual address range to unmap\n \\param[in] size - Size of the virtual address range to unmap\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_PERMITTED,\n ::CUDA_ERROR_NOT_SUPPORTED\n \\notefnerr\n \\note_sync\n\n \\sa ::cuMemCreate, ::cuMemAddressReserve*/\n    fn cuMemUnmap(\n        ptr: cuda_types::cuda::CUdeviceptr,\n        size: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Set the access flags for each location specified in \\p desc for the given virtual address range\n\n Given the virtual address range via \\p ptr and \\p size, and the locations\n in the array given by \\p desc and \\p count, set the access flags for the\n target locations.  The range must be a fully mapped address range\n containing all allocations created by ::cuMemMap / ::cuMemCreate.\n Users cannot specify ::CU_MEM_LOCATION_TYPE_HOST_NUMA accessibility for allocations created on with other location types.\n Note: When ::CUmemAccessDesc::CUmemLocation::type is ::CU_MEM_LOCATION_TYPE_HOST_NUMA, ::CUmemAccessDesc::CUmemLocation::id\n is ignored.\n When setting the access flags for a virtual address range mapping a multicast\n object, \\p ptr and \\p size must be aligned to the value returned by\n ::cuMulticastGetGranularity with the flag ::CU_MULTICAST_MINIMUM_GRANULARITY.\n For best performance however, it is recommended that \\p ptr and \\p size be\n aligned to the value returned by ::cuMulticastGetGranularity with the flag\n ::CU_MULTICAST_RECOMMENDED_GRANULARITY.\n\n \\param[in] ptr   - Starting address for the virtual address range\n \\param[in] size  - Length of the virtual address range\n \\param[in] desc  - Array of ::CUmemAccessDesc that describe how to change the\n                  - mapping for each location specified\n \\param[in] count - Number of ::CUmemAccessDesc in \\p desc\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE,\n ::CUDA_ERROR_NOT_SUPPORTED\n \\notefnerr\n \\note_sync\n\n \\sa ::cuMemSetAccess, ::cuMemCreate, :cuMemMap*/\n    fn cuMemSetAccess(\n        ptr: cuda_types::cuda::CUdeviceptr,\n        size: usize,\n        desc: *const cuda_types::cuda::CUmemAccessDesc,\n        count: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Get the access \\p flags set for the given \\p location and \\p ptr\n\n \\param[out] flags   - Flags set for this location\n \\param[in] location - Location in which to check the flags for\n \\param[in] ptr      - Address in which to check the access flags for\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_PERMITTED,\n ::CUDA_ERROR_NOT_SUPPORTED\n\n \\sa ::cuMemSetAccess*/\n    fn cuMemGetAccess(\n        flags: *mut ::core::ffi::c_ulonglong,\n        location: *const cuda_types::cuda::CUmemLocation,\n        ptr: cuda_types::cuda::CUdeviceptr,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Exports an allocation to a requested shareable handle type\n\n Given a CUDA memory handle, create a shareable memory\n allocation handle that can be used to share the memory with other\n processes. The recipient process can convert the shareable handle back into a\n CUDA memory handle using ::cuMemImportFromShareableHandle and map\n it with ::cuMemMap. The implementation of what this handle is and how it\n can be transferred is defined by the requested handle type in \\p handleType\n\n Once all shareable handles are closed and the allocation is released, the allocated\n memory referenced will be released back to the OS and uses of the CUDA handle afterward\n will lead to undefined behavior.\n\n This API can also be used in conjunction with other APIs (e.g. Vulkan, OpenGL)\n that support importing memory from the shareable type\n\n \\param[out] shareableHandle - Pointer to the location in which to store the requested handle type\n \\param[in] handle           - CUDA handle for the memory allocation\n \\param[in] handleType       - Type of shareable handle requested (defines type and size of the \\p shareableHandle output parameter)\n \\param[in] flags            - Reserved, must be zero\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_PERMITTED,\n ::CUDA_ERROR_NOT_SUPPORTED\n\n \\sa ::cuMemImportFromShareableHandle*/\n    fn cuMemExportToShareableHandle(\n        shareableHandle: *mut ::core::ffi::c_void,\n        handle: cuda_types::cuda::CUmemGenericAllocationHandle,\n        handleType: cuda_types::cuda::CUmemAllocationHandleType,\n        flags: ::core::ffi::c_ulonglong,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Imports an allocation from a requested shareable handle type.\n\n If the current process cannot support the memory described by this shareable\n handle, this API will error as ::CUDA_ERROR_NOT_SUPPORTED.\n\n If \\p shHandleType is ::CU_MEM_HANDLE_TYPE_FABRIC and the importer process has not been\n granted access to the same IMEX channel as the exporter process, this API will error\n as ::CUDA_ERROR_NOT_PERMITTED.\n\n \\note Importing shareable handles exported from some graphics APIs(VUlkan, OpenGL, etc)\n created on devices under an SLI group may not be supported, and thus this API will\n return CUDA_ERROR_NOT_SUPPORTED.\n There is no guarantee that the contents of \\p handle will be the same CUDA memory handle\n for the same given OS shareable handle, or the same underlying allocation.\n\n \\param[out] handle       - CUDA Memory handle for the memory allocation.\n \\param[in]  osHandle     - Shareable Handle representing the memory allocation that is to be imported.\n \\param[in]  shHandleType - handle type of the exported handle ::CUmemAllocationHandleType.\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_PERMITTED,\n ::CUDA_ERROR_NOT_SUPPORTED\n\n \\sa ::cuMemExportToShareableHandle, ::cuMemMap, ::cuMemRelease*/\n    fn cuMemImportFromShareableHandle(\n        handle: *mut cuda_types::cuda::CUmemGenericAllocationHandle,\n        osHandle: *mut ::core::ffi::c_void,\n        shHandleType: cuda_types::cuda::CUmemAllocationHandleType,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Calculates either the minimal or recommended granularity\n\n Calculates either the minimal or recommended granularity\n for a given allocation specification and returns it in granularity.  This\n granularity can be used as a multiple for alignment, size, or address mapping.\n\n \\param[out] granularity Returned granularity.\n \\param[in]  prop Property for which to determine the granularity for\n \\param[in]  option Determines which granularity to return\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_PERMITTED,\n ::CUDA_ERROR_NOT_SUPPORTED\n\n \\sa ::cuMemCreate, ::cuMemMap*/\n    fn cuMemGetAllocationGranularity(\n        granularity: *mut usize,\n        prop: *const cuda_types::cuda::CUmemAllocationProp,\n        option: cuda_types::cuda::CUmemAllocationGranularity_flags,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Retrieve the contents of the property structure defining properties for this handle\n\n \\param[out] prop  - Pointer to a properties structure which will hold the information about this handle\n \\param[in] handle - Handle which to perform the query on\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_PERMITTED,\n ::CUDA_ERROR_NOT_SUPPORTED\n\n \\sa ::cuMemCreate, ::cuMemImportFromShareableHandle*/\n    fn cuMemGetAllocationPropertiesFromHandle(\n        prop: *mut cuda_types::cuda::CUmemAllocationProp,\n        handle: cuda_types::cuda::CUmemGenericAllocationHandle,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Given an address \\p addr, returns the allocation handle of the backing memory allocation.\n\n The handle is guaranteed to be the same handle value used to map the memory. If the address\n requested is not mapped, the function will fail. The returned handle must be released with\n corresponding number of calls to ::cuMemRelease.\n\n \\note The address \\p addr, can be any address in a range previously mapped\n by ::cuMemMap, and not necessarily the start address.\n\n \\param[out] handle CUDA Memory handle for the backing memory allocation.\n \\param[in] addr Memory address to query, that has been mapped previously.\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_PERMITTED,\n ::CUDA_ERROR_NOT_SUPPORTED\n\n \\sa ::cuMemCreate, ::cuMemRelease, ::cuMemMap*/\n    fn cuMemRetainAllocationHandle(\n        handle: *mut cuda_types::cuda::CUmemGenericAllocationHandle,\n        addr: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Frees memory with stream ordered semantics\n\n Inserts a free operation into \\p hStream.\n The allocation must not be accessed after stream execution reaches the free.\n After this API returns, accessing the memory from any subsequent work launched on the GPU\n or querying its pointer attributes results in undefined behavior.\n\n \\note During stream capture, this function results in the creation of a free node and\n       must therefore be passed the address of a graph allocation.\n\n \\param dptr - memory to free\n \\param hStream - The stream establishing the stream ordering contract.\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT (default stream specified with no current context),\n ::CUDA_ERROR_NOT_SUPPORTED*/\n    fn cuMemFreeAsync_ptsz(\n        dptr: cuda_types::cuda::CUdeviceptr,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Allocates memory with stream ordered semantics\n\n Inserts an allocation operation into \\p hStream.\n A pointer to the allocated memory is returned immediately in *dptr.\n The allocation must not be accessed until the the allocation operation completes.\n The allocation comes from the memory pool current to the stream's device.\n\n \\note The default memory pool of a device contains device memory from that device.\n \\note Basic stream ordering allows future work submitted into the same stream to use the allocation.\n       Stream query, stream synchronize, and CUDA events can be used to guarantee that the allocation\n       operation completes before work submitted in a separate stream runs.\n \\note During stream capture, this function results in the creation of an allocation node.  In this case,\n       the allocation is owned by the graph instead of the memory pool. The memory pool's properties\n       are used to set the node's creation parameters.\n\n \\param[out] dptr    - Returned device pointer\n \\param[in] bytesize - Number of bytes to allocate\n \\param[in] hStream  - The stream establishing the stream ordering contract and the memory pool to allocate from\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT (default stream specified with no current context),\n ::CUDA_ERROR_NOT_SUPPORTED,\n ::CUDA_ERROR_OUT_OF_MEMORY\n\n \\sa ::cuMemAllocFromPoolAsync, ::cuMemFreeAsync, ::cuDeviceSetMemPool,\n     ::cuDeviceGetDefaultMemPool, ::cuDeviceGetMemPool, ::cuMemPoolCreate,\n     ::cuMemPoolSetAccess, ::cuMemPoolSetAttribute*/\n    fn cuMemAllocAsync_ptsz(\n        dptr: *mut cuda_types::cuda::CUdeviceptr,\n        bytesize: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Tries to release memory back to the OS\n\n Releases memory back to the OS until the pool contains fewer than minBytesToKeep\n reserved bytes, or there is no more memory that the allocator can safely release.\n The allocator cannot release OS allocations that back outstanding asynchronous allocations.\n The OS allocations may happen at different granularity from the user allocations.\n\n \\note: Allocations that have not been freed count as outstanding.\n \\note: Allocations that have been asynchronously freed but whose completion has\n        not been observed on the host (eg. by a synchronize) can count as outstanding.\n\n \\param[in] pool           - The memory pool to trim\n \\param[in] minBytesToKeep - If the pool has less than minBytesToKeep reserved,\n the TrimTo operation is a no-op.  Otherwise the pool will be guaranteed to have\n at least minBytesToKeep bytes reserved after the operation.\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuMemAllocAsync, ::cuMemFreeAsync, ::cuDeviceGetDefaultMemPool,\n     ::cuDeviceGetMemPool, ::cuMemPoolCreate*/\n    fn cuMemPoolTrimTo(\n        pool: cuda_types::cuda::CUmemoryPool,\n        minBytesToKeep: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets attributes of a memory pool\n\n Supported attributes are:\n - ::CU_MEMPOOL_ATTR_RELEASE_THRESHOLD: (value type = cuuint64_t)\n                    Amount of reserved memory in bytes to hold onto before trying\n                    to release memory back to the OS. When more than the release\n                    threshold bytes of memory are held by the memory pool, the\n                    allocator will try to release memory back to the OS on the\n                    next call to stream, event or context synchronize. (default 0)\n - ::CU_MEMPOOL_ATTR_REUSE_FOLLOW_EVENT_DEPENDENCIES: (value type = int)\n                    Allow ::cuMemAllocAsync to use memory asynchronously freed\n                    in another stream as long as a stream ordering dependency\n                    of the allocating stream on the free action exists.\n                    Cuda events and null stream interactions can create the required\n                    stream ordered dependencies. (default enabled)\n - ::CU_MEMPOOL_ATTR_REUSE_ALLOW_OPPORTUNISTIC: (value type = int)\n                    Allow reuse of already completed frees when there is no dependency\n                    between the free and allocation. (default enabled)\n - ::CU_MEMPOOL_ATTR_REUSE_ALLOW_INTERNAL_DEPENDENCIES: (value type = int)\n                    Allow ::cuMemAllocAsync to insert new stream dependencies\n                    in order to establish the stream ordering required to reuse\n                    a piece of memory released by ::cuMemFreeAsync (default enabled).\n - ::CU_MEMPOOL_ATTR_RESERVED_MEM_HIGH: (value type = cuuint64_t)\n                    Reset the high watermark that tracks the amount of backing memory that was\n                    allocated for the memory pool. It is illegal to set this attribute to a non-zero value.\n - ::CU_MEMPOOL_ATTR_USED_MEM_HIGH: (value type = cuuint64_t)\n                    Reset the high watermark that tracks the amount of used memory that was\n                    allocated for the memory pool.\n\n \\param[in] pool  - The memory pool to modify\n \\param[in] attr  - The attribute to modify\n \\param[in] value - Pointer to the value to assign\n\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuMemAllocAsync, ::cuMemFreeAsync, ::cuDeviceGetDefaultMemPool,\n     ::cuDeviceGetMemPool, ::cuMemPoolCreate*/\n    fn cuMemPoolSetAttribute(\n        pool: cuda_types::cuda::CUmemoryPool,\n        attr: cuda_types::cuda::CUmemPool_attribute,\n        value: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Gets attributes of a memory pool\n\n Supported attributes are:\n - ::CU_MEMPOOL_ATTR_RELEASE_THRESHOLD: (value type = cuuint64_t)\n                    Amount of reserved memory in bytes to hold onto before trying\n                    to release memory back to the OS. When more than the release\n                    threshold bytes of memory are held by the memory pool, the\n                    allocator will try to release memory back to the OS on the\n                    next call to stream, event or context synchronize. (default 0)\n - ::CU_MEMPOOL_ATTR_REUSE_FOLLOW_EVENT_DEPENDENCIES: (value type = int)\n                    Allow ::cuMemAllocAsync to use memory asynchronously freed\n                    in another stream as long as a stream ordering dependency\n                    of the allocating stream on the free action exists.\n                    Cuda events and null stream interactions can create the required\n                    stream ordered dependencies. (default enabled)\n - ::CU_MEMPOOL_ATTR_REUSE_ALLOW_OPPORTUNISTIC: (value type = int)\n                    Allow reuse of already completed frees when there is no dependency\n                    between the free and allocation. (default enabled)\n - ::CU_MEMPOOL_ATTR_REUSE_ALLOW_INTERNAL_DEPENDENCIES: (value type = int)\n                    Allow ::cuMemAllocAsync to insert new stream dependencies\n                    in order to establish the stream ordering required to reuse\n                    a piece of memory released by ::cuMemFreeAsync (default enabled).\n - ::CU_MEMPOOL_ATTR_RESERVED_MEM_CURRENT: (value type = cuuint64_t)\n                    Amount of backing memory currently allocated for the mempool\n - ::CU_MEMPOOL_ATTR_RESERVED_MEM_HIGH: (value type = cuuint64_t)\n                    High watermark of backing memory allocated for the mempool since the\n                    last time it was reset.\n - ::CU_MEMPOOL_ATTR_USED_MEM_CURRENT: (value type = cuuint64_t)\n                    Amount of memory from the pool that is currently in use by the application.\n - ::CU_MEMPOOL_ATTR_USED_MEM_HIGH: (value type = cuuint64_t)\n                    High watermark of the amount of memory from the pool that was in use by the application.\n\n \\param[in] pool   - The memory pool to get attributes of\n \\param[in] attr   - The attribute to get\n \\param[out] value - Retrieved value\n\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuMemAllocAsync, ::cuMemFreeAsync, ::cuDeviceGetDefaultMemPool,\n     ::cuDeviceGetMemPool, ::cuMemPoolCreate*/\n    fn cuMemPoolGetAttribute(\n        pool: cuda_types::cuda::CUmemoryPool,\n        attr: cuda_types::cuda::CUmemPool_attribute,\n        value: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Controls visibility of pools between devices\n\n \\param[in] pool  - The pool being modified\n \\param[in] map   - Array of access descriptors. Each descriptor instructs the access to enable for a single gpu.\n \\param[in] count - Number of descriptors in the map array.\n\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuMemAllocAsync, ::cuMemFreeAsync, ::cuDeviceGetDefaultMemPool,\n     ::cuDeviceGetMemPool, ::cuMemPoolCreate*/\n    fn cuMemPoolSetAccess(\n        pool: cuda_types::cuda::CUmemoryPool,\n        map: *const cuda_types::cuda::CUmemAccessDesc,\n        count: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the accessibility of a pool from a device\n\n Returns the accessibility of the pool's memory from the specified location.\n\n \\param[out] flags   - the accessibility of the pool from the specified location\n \\param[in] memPool  - the pool being queried\n \\param[in] location - the location accessing the pool\n\n \\sa ::cuMemAllocAsync, ::cuMemFreeAsync, ::cuDeviceGetDefaultMemPool,\n     ::cuDeviceGetMemPool, ::cuMemPoolCreate*/\n    fn cuMemPoolGetAccess(\n        flags: *mut cuda_types::cuda::CUmemAccess_flags,\n        memPool: cuda_types::cuda::CUmemoryPool,\n        location: *mut cuda_types::cuda::CUmemLocation,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Creates a memory pool\n\n Creates a CUDA memory pool and returns the handle in \\p pool.  The \\p poolProps determines\n the properties of the pool such as the backing device and IPC capabilities.\n\n To create a memory pool for HOST memory not targeting a specific NUMA node, applications must set\n set ::CUmemPoolProps::CUmemLocation::type to ::CU_MEM_LOCATION_TYPE_HOST.\n ::CUmemPoolProps::CUmemLocation::id is ignored for such pools.\n Pools created with the type ::CU_MEM_LOCATION_TYPE_HOST are not IPC capable\n and ::CUmemPoolProps::handleTypes must be 0, any other values will result in\n ::CUDA_ERROR_INVALID_VALUE.\n To create a memory pool targeting a specific host NUMA node, applications must\n set ::CUmemPoolProps::CUmemLocation::type to ::CU_MEM_LOCATION_TYPE_HOST_NUMA and\n ::CUmemPoolProps::CUmemLocation::id must specify the NUMA ID of the host memory node.\n Specifying ::CU_MEM_LOCATION_TYPE_HOST_NUMA_CURRENT as the\n ::CUmemPoolProps::CUmemLocation::type will result in ::CUDA_ERROR_INVALID_VALUE.\n By default, the pool's memory will be accessible from the device it is allocated on.\n In the case of pools created with ::CU_MEM_LOCATION_TYPE_HOST_NUMA or\n ::CU_MEM_LOCATION_TYPE_HOST, their default accessibility will be from the\n host CPU.\n Applications can control the maximum size of the pool by specifying a non-zero value for ::CUmemPoolProps::maxSize.\n If set to 0, the maximum size of the pool will default to a system dependent value.\n\n Applications that intend to use ::CU_MEM_HANDLE_TYPE_FABRIC based memory sharing must ensure:\n (1) `nvidia-caps-imex-channels` character device is created by the driver and is listed under /proc/devices\n (2) have at least one IMEX channel file accessible by the user launching the application.\n\n When exporter and importer CUDA processes have been granted access to the same IMEX channel, they can securely\n share memory.\n\n The IMEX channel security model works on a per user basis. Which means all processes under a user can share\n memory if the user has access to a valid IMEX channel. When multi-user isolation is desired, a separate IMEX\n channel is required for each user.\n\n These channel files exist in /dev/nvidia-caps-imex-channels/channel* and can be created using standard OS\n native calls like mknod on Linux. For example: To create channel0 with the major number from /proc/devices\n users can execute the following command: `mknod /dev/nvidia-caps-imex-channels/channel0 c <major number> 0`\n\n \\note Specifying CU_MEM_HANDLE_TYPE_NONE creates a memory pool that will not support IPC.\n\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_OUT_OF_MEMORY,\n ::CUDA_ERROR_NOT_PERMITTED,\n ::CUDA_ERROR_NOT_SUPPORTED\n\n \\sa ::cuDeviceSetMemPool, ::cuDeviceGetMemPool, ::cuDeviceGetDefaultMemPool,\n     ::cuMemAllocFromPoolAsync, ::cuMemPoolExportToShareableHandle*/\n    fn cuMemPoolCreate(\n        pool: *mut cuda_types::cuda::CUmemoryPool,\n        poolProps: *const cuda_types::cuda::CUmemPoolProps,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Destroys the specified memory pool\n\n If any pointers obtained from this pool haven't been freed or\n the pool has free operations that haven't completed\n when ::cuMemPoolDestroy is invoked, the function will return immediately and the\n resources associated with the pool will be released automatically\n once there are no more outstanding allocations.\n\n Destroying the current mempool of a device sets the default mempool of\n that device as the current mempool for that device.\n\n \\note A device's default memory pool cannot be destroyed.\n\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuMemFreeAsync, ::cuDeviceSetMemPool, ::cuDeviceGetMemPool,\n     ::cuDeviceGetDefaultMemPool, ::cuMemPoolCreate*/\n    fn cuMemPoolDestroy(\n        pool: cuda_types::cuda::CUmemoryPool,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the default memory pool for a given location and allocation type\n\n The memory location can be of one of ::CU_MEM_LOCATION_TYPE_DEVICE, ::CU_MEM_LOCATION_TYPE_HOST or\n ::CU_MEM_LOCATION_TYPE_HOST_NUMA. The allocation type can be one of ::CU_MEM_ALLOCATION_TYPE_PINNED or\n ::CU_MEM_ALLOCATION_TYPE_MANAGED. When the allocation type is ::CU_MEM_ALLOCATION_TYPE_MANAGED,\n the location type can also be ::CU_MEM_LOCATION_TYPE_NONE to indicate no preferred location\n for the managed memory pool. In all other cases, the call returns ::CUDA_ERROR_INVALID_VALUE.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE,\n ::CUDA_ERROR_NOT_SUPPORTED\n \\notefnerr\n\n \\sa ::cuMemAllocAsync, ::cuMemPoolTrimTo, ::cuMemPoolGetAttribute, ::cuMemPoolSetAttribute, cuMemPoolSetAccess, ::cuMemGetMemPool, ::cuMemPoolCreate*/\n    fn cuMemGetDefaultMemPool(\n        pool_out: *mut cuda_types::cuda::CUmemoryPool,\n        location: *mut cuda_types::cuda::CUmemLocation,\n        type_: cuda_types::cuda::CUmemAllocationType,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Gets the current memory pool for a memory location and of a particular allocation type\n\n The memory location can be of one of ::CU_MEM_LOCATION_TYPE_DEVICE, ::CU_MEM_LOCATION_TYPE_HOST or\n ::CU_MEM_LOCATION_TYPE_HOST_NUMA. The allocation type can be one of ::CU_MEM_ALLOCATION_TYPE_PINNED or\n ::CU_MEM_ALLOCATION_TYPE_MANAGED. When the allocation type is ::CU_MEM_ALLOCATION_TYPE_MANAGED,\n the location type can also be ::CU_MEM_LOCATION_TYPE_NONE to indicate no preferred location\n for the managed memory pool. In all other cases, the call returns ::CUDA_ERROR_INVALID_VALUE\n\n Returns the last pool provided to ::cuMemSetMemPool or ::cuDeviceSetMemPool for this location and allocation type\n or the location's default memory pool if ::cuMemSetMemPool or ::cuDeviceSetMemPool for that allocType and location\n has never been called. By default the current mempool of a location is the default mempool for a device.\n Otherwise the returned pool must have been set with ::cuDeviceSetMemPool.\n\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuDeviceGetDefaultMemPool, ::cuMemPoolCreate, ::cuDeviceSetMemPool, ::cuMemSetMemPool*/\n    fn cuMemGetMemPool(\n        pool: *mut cuda_types::cuda::CUmemoryPool,\n        location: *mut cuda_types::cuda::CUmemLocation,\n        type_: cuda_types::cuda::CUmemAllocationType,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the current memory pool for a memory location and allocation type\n\n The memory location can be of one of ::CU_MEM_LOCATION_TYPE_DEVICE, ::CU_MEM_LOCATION_TYPE_HOST or\n ::CU_MEM_LOCATION_TYPE_HOST_NUMA. The allocation type can be one of ::CU_MEM_ALLOCATION_TYPE_PINNED or\n ::CU_MEM_ALLOCATION_TYPE_MANAGED. When the allocation type is ::CU_MEM_ALLOCATION_TYPE_MANAGED,\n the location type can also be ::CU_MEM_LOCATION_TYPE_NONE to indicate no preferred location\n for the managed memory pool. In all other cases, the call returns ::CUDA_ERROR_INVALID_VALUE.\n\n When a memory pool is set as the current memory pool, the location parameter should be the same as the location of the pool.\n The location and allocation type specified must match those of the pool otherwise ::CUDA_ERROR_INVALID_VALUE is returned.\n By default, a memory location's current memory pool is its default memory pool that can be obtained via ::cuMemGetDefaultMemPool.\n If the location type is ::CU_MEM_LOCATION_TYPE_DEVICE and the allocation type is ::CU_MEM_ALLOCATION_TYPE_PINNED, then\n this API is the equivalent of calling ::cuDeviceSetMemPool with the location id as the device.\n For further details on the implications, please refer to the documentation for ::cuDeviceSetMemPool.\n\n \\note Use ::cuMemAllocFromPoolAsync to specify asynchronous allocations from a device different\n than the one the stream runs on.\n\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuDeviceGetDefaultMemPool, ::cuDeviceGetMemPool, ::cuMemGetMemPool, ::cuMemPoolCreate, ::cuMemPoolDestroy, ::cuMemAllocFromPoolAsync*/\n    fn cuMemSetMemPool(\n        location: *mut cuda_types::cuda::CUmemLocation,\n        type_: cuda_types::cuda::CUmemAllocationType,\n        pool: cuda_types::cuda::CUmemoryPool,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Allocates memory from a specified pool with stream ordered semantics.\n\n Inserts an allocation operation into \\p hStream.\n A pointer to the allocated memory is returned immediately in *dptr.\n The allocation must not be accessed until the the allocation operation completes.\n The allocation comes from the specified memory pool.\n\n \\note\n    -  The specified memory pool may be from a device different than that of the specified \\p hStream.\n\n    -  Basic stream ordering allows future work submitted into the same stream to use the allocation.\n       Stream query, stream synchronize, and CUDA events can be used to guarantee that the allocation\n       operation completes before work submitted in a separate stream runs.\n\n \\note During stream capture, this function results in the creation of an allocation node.  In this case,\n       the allocation is owned by the graph instead of the memory pool. The memory pool's properties\n       are used to set the node's creation parameters.\n\n \\param[out] dptr    - Returned device pointer\n \\param[in] bytesize - Number of bytes to allocate\n \\param[in] pool     - The pool to allocate from\n \\param[in] hStream  - The stream establishing the stream ordering semantic\n\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT (default stream specified with no current context),\n ::CUDA_ERROR_NOT_SUPPORTED,\n ::CUDA_ERROR_OUT_OF_MEMORY\n\n \\sa ::cuMemAllocAsync, ::cuMemFreeAsync, ::cuDeviceGetDefaultMemPool,\n     ::cuDeviceGetMemPool, ::cuMemPoolCreate, ::cuMemPoolSetAccess,\n     ::cuMemPoolSetAttribute*/\n    fn cuMemAllocFromPoolAsync_ptsz(\n        dptr: *mut cuda_types::cuda::CUdeviceptr,\n        bytesize: usize,\n        pool: cuda_types::cuda::CUmemoryPool,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Exports a memory pool to the requested handle type.\n\n Given an IPC capable mempool, create an OS handle to share the pool with another process.\n A recipient process can convert the shareable handle into a mempool with ::cuMemPoolImportFromShareableHandle.\n Individual pointers can then be shared with the ::cuMemPoolExportPointer and ::cuMemPoolImportPointer APIs.\n The implementation of what the shareable handle is and how it can be transferred is defined by the requested\n handle type.\n\n \\note: To create an IPC capable mempool, create a mempool with a CUmemAllocationHandleType other than CU_MEM_HANDLE_TYPE_NONE.\n\n \\param[out] handle_out  - Returned OS handle\n \\param[in] pool         - pool to export\n \\param[in] handleType   - the type of handle to create\n \\param[in] flags        - must be 0\n\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_OUT_OF_MEMORY\n\n \\sa ::cuMemPoolImportFromShareableHandle, ::cuMemPoolExportPointer,\n     ::cuMemPoolImportPointer, ::cuMemAllocAsync, ::cuMemFreeAsync,\n     ::cuDeviceGetDefaultMemPool, ::cuDeviceGetMemPool, ::cuMemPoolCreate,\n     ::cuMemPoolSetAccess, ::cuMemPoolSetAttribute*/\n    fn cuMemPoolExportToShareableHandle(\n        handle_out: *mut ::core::ffi::c_void,\n        pool: cuda_types::cuda::CUmemoryPool,\n        handleType: cuda_types::cuda::CUmemAllocationHandleType,\n        flags: ::core::ffi::c_ulonglong,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief imports a memory pool from a shared handle.\n\n Specific allocations can be imported from the imported pool with cuMemPoolImportPointer.\n\n If \\p handleType is ::CU_MEM_HANDLE_TYPE_FABRIC and the importer process has not been\n granted access to the same IMEX channel as the exporter process, this API will error\n as ::CUDA_ERROR_NOT_PERMITTED.\n\n\n \\note Imported memory pools do not support creating new allocations.\n       As such imported memory pools may not be used in cuDeviceSetMemPool\n       or ::cuMemAllocFromPoolAsync calls.\n\n \\param[out] pool_out    - Returned memory pool\n \\param[in] handle       - OS handle of the pool to open\n \\param[in] handleType   - The type of handle being imported\n \\param[in] flags        - must be 0\n\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_OUT_OF_MEMORY\n\n \\sa ::cuMemPoolExportToShareableHandle, ::cuMemPoolExportPointer, ::cuMemPoolImportPointer*/\n    fn cuMemPoolImportFromShareableHandle(\n        pool_out: *mut cuda_types::cuda::CUmemoryPool,\n        handle: *mut ::core::ffi::c_void,\n        handleType: cuda_types::cuda::CUmemAllocationHandleType,\n        flags: ::core::ffi::c_ulonglong,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Export data to share a memory pool allocation between processes.\n\n Constructs \\p shareData_out for sharing a specific allocation from an already shared memory pool.\n The recipient process can import the allocation with the ::cuMemPoolImportPointer api.\n The data is not a handle and may be shared through any IPC mechanism.\n\n \\param[out] shareData_out - Returned export data\n \\param[in] ptr            - pointer to memory being exported\n\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_OUT_OF_MEMORY\n\n \\sa ::cuMemPoolExportToShareableHandle, ::cuMemPoolImportFromShareableHandle, ::cuMemPoolImportPointer*/\n    fn cuMemPoolExportPointer(\n        shareData_out: *mut cuda_types::cuda::CUmemPoolPtrExportData,\n        ptr: cuda_types::cuda::CUdeviceptr,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Import a memory pool allocation from another process.\n\n Returns in \\p ptr_out a pointer to the imported memory.\n The imported memory must not be accessed before the allocation operation completes\n in the exporting process. The imported memory must be freed from all importing processes before\n being freed in the exporting process. The pointer may be freed with cuMemFree\n or cuMemFreeAsync.  If cuMemFreeAsync is used, the free must be completed\n on the importing process before the free operation on the exporting process.\n\n \\note The cuMemFreeAsync api may be used in the exporting process before\n       the cuMemFreeAsync operation completes in its stream as long as the\n       cuMemFreeAsync in the exporting process specifies a stream with\n       a stream dependency on the importing process's cuMemFreeAsync.\n\n \\param[out] ptr_out  - pointer to imported memory\n \\param[in] pool      - pool from which to import\n \\param[in] shareData - data specifying the memory to import\n\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_OUT_OF_MEMORY\n\n \\sa ::cuMemPoolExportToShareableHandle, ::cuMemPoolImportFromShareableHandle, ::cuMemPoolExportPointer*/\n    fn cuMemPoolImportPointer(\n        ptr_out: *mut cuda_types::cuda::CUdeviceptr,\n        pool: cuda_types::cuda::CUmemoryPool,\n        shareData: *mut cuda_types::cuda::CUmemPoolPtrExportData,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Create a generic allocation handle representing a multicast object described by the given properties.\n\n This creates a multicast object as described by \\p prop. The number of\n participating devices is specified by ::CUmulticastObjectProp::numDevices.\n Devices can be added to the multicast object via ::cuMulticastAddDevice.\n All participating devices must be added to the multicast object before memory\n can be bound to it. Memory is bound to the multicast object via either\n ::cuMulticastBindMem or ::cuMulticastBindAddr, and can be unbound via\n ::cuMulticastUnbind. The total amount of memory that can be bound per device\n is specified by :CUmulticastObjectProp::size. This size must be a multiple of\n the value returned by ::cuMulticastGetGranularity with the flag\n ::CU_MULTICAST_GRANULARITY_MINIMUM. For best performance however, the size\n should be aligned to the value returned by ::cuMulticastGetGranularity with\n the flag ::CU_MULTICAST_GRANULARITY_RECOMMENDED.\n\n After all participating devices have been added, multicast objects can also\n be mapped to a device's virtual address space using the virtual memory\n management APIs (see ::cuMemMap and ::cuMemSetAccess). Multicast objects can\n also be shared with other processes by requesting a shareable handle via\n ::cuMemExportToShareableHandle. Note that the desired types of shareable\n handles must be specified in the bitmask ::CUmulticastObjectProp::handleTypes.\n Multicast objects can be released using the virtual memory management API\n ::cuMemRelease.\n\n \\param[out] mcHandle     Value of handle returned.\n \\param[in]  prop         Properties of the multicast object to create.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_OUT_OF_MEMORY,\n ::CUDA_ERROR_INVALID_DEVICE,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_PERMITTED,\n ::CUDA_ERROR_NOT_SUPPORTED\n\n \\sa ::cuMulticastAddDevice, ::cuMulticastBindMem, ::cuMulticastBindAddr, ::cuMulticastUnbind\n \\sa ::cuMemCreate, ::cuMemRelease, ::cuMemExportToShareableHandle, ::cuMemImportFromShareableHandle*/\n    fn cuMulticastCreate(\n        mcHandle: *mut cuda_types::cuda::CUmemGenericAllocationHandle,\n        prop: *const cuda_types::cuda::CUmulticastObjectProp,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Associate a device to a multicast object.\n\n Associates a device to a multicast object. The added device will be a part of\n the multicast team of size specified by CUmulticastObjectProp::numDevices\n during ::cuMulticastCreate.\n The association of the device to the multicast object is permanent during\n the life time of the multicast object.\n All devices must be added to the multicast team before any memory can be\n bound to any device in the team. Any calls to ::cuMulticastBindMem or\n ::cuMulticastBindAddr will block until all devices have been added.\n Similarly all devices must be added to the multicast team before a virtual\n address range can be mapped to the multicast object. A call to ::cuMemMap\n will block until all devices have been added.\n\n \\param[in] mcHandle     Handle representing a multicast object.\n \\param[in] dev          Device that will be associated to the multicast\n                         object.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_OUT_OF_MEMORY,\n ::CUDA_ERROR_INVALID_DEVICE,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_PERMITTED,\n ::CUDA_ERROR_NOT_SUPPORTED\n\n \\sa ::cuMulticastCreate, ::cuMulticastBindMem, ::cuMulticastBindAddr*/\n    fn cuMulticastAddDevice(\n        mcHandle: cuda_types::cuda::CUmemGenericAllocationHandle,\n        dev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Bind a memory allocation represented by a handle to a multicast object.\n\n Binds a memory allocation specified by \\p memHandle and created via\n ::cuMemCreate to a multicast object represented by \\p mcHandle and created\n via ::cuMulticastCreate. The intended \\p size of the bind, the offset in the\n multicast range \\p mcOffset as well as the offset in the memory \\p memOffset\n must be a multiple of the value returned by ::cuMulticastGetGranularity with\n the flag ::CU_MULTICAST_GRANULARITY_MINIMUM. For best performance however,\n \\p size, \\p mcOffset and \\p memOffset should be aligned to the granularity of\n the memory allocation(see ::cuMemGetAllocationGranularity) or to the value\n returned by ::cuMulticastGetGranularity with the flag\n ::CU_MULTICAST_GRANULARITY_RECOMMENDED.\n\n The \\p size + \\p memOffset cannot be larger than the size of the allocated\n memory. Similarly the \\p size + \\p mcOffset cannot be larger than the size\n of the multicast object.\n The memory allocation must have beeen created on one of the devices\n that was added to the multicast team via ::cuMulticastAddDevice.\n Externally shareable as well as imported multicast objects can be bound only\n to externally shareable memory.\n Note that this call will return CUDA_ERROR_OUT_OF_MEMORY if there are\n insufficient resources required to perform the bind. This call may also\n return CUDA_ERROR_SYSTEM_NOT_READY if the necessary system software is not\n initialized or running.\n\n This call may return CUDA_ERROR_ILLEGAL_STATE if the system configuration\n is in an illegal state. In such cases, to continue using multicast, verify\n that the system configuration is in a valid state and all required driver\n daemons are running properly.\n\n \\param[in]  mcHandle     Handle representing a multicast object.\n \\param[in]  mcOffset     Offset into the multicast object for attachment.\n \\param[in]  memHandle    Handle representing a memory allocation.\n \\param[in]  memOffset    Offset into the memory for attachment.\n \\param[in]  size         Size of the memory that will be bound to the\n                          multicast object.\n \\param[in]  flags        Flags for future use, must be zero for now.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_PERMITTED,\n ::CUDA_ERROR_NOT_SUPPORTED,\n ::CUDA_ERROR_OUT_OF_MEMORY,\n ::CUDA_ERROR_SYSTEM_NOT_READY,\n ::CUDA_ERROR_ILLEGAL_STATE\n\n \\sa ::cuMulticastCreate, ::cuMulticastAddDevice, ::cuMemCreate*/\n    fn cuMulticastBindMem(\n        mcHandle: cuda_types::cuda::CUmemGenericAllocationHandle,\n        mcOffset: usize,\n        memHandle: cuda_types::cuda::CUmemGenericAllocationHandle,\n        memOffset: usize,\n        size: usize,\n        flags: ::core::ffi::c_ulonglong,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Bind a memory allocation represented by a virtual address to a multicast object.\n\n Binds a memory allocation specified by its mapped address \\p memptr to a\n multicast object represented by \\p mcHandle.\n The memory must have been allocated via ::cuMemCreate or ::cudaMallocAsync.\n The intended \\p size of the bind, the offset in the multicast range\n \\p mcOffset and \\p memptr must be a multiple of the value returned by\n ::cuMulticastGetGranularity with the flag ::CU_MULTICAST_GRANULARITY_MINIMUM.\n For best performance however, \\p size, \\p mcOffset and \\p memptr should be\n aligned to the value returned by ::cuMulticastGetGranularity with the flag\n ::CU_MULTICAST_GRANULARITY_RECOMMENDED.\n\n The \\p size cannot be larger than the size of the allocated memory.\n Similarly the \\p size + \\p mcOffset cannot be larger than the total size\n of the multicast object.\n The memory allocation must have beeen created on one of the devices\n that was added to the multicast team via ::cuMulticastAddDevice.\n Externally shareable as well as imported multicast objects can be bound only\n to externally shareable memory.\n Note that this call will return CUDA_ERROR_OUT_OF_MEMORY if there are\n insufficient resources required to perform the bind. This call may also\n return CUDA_ERROR_SYSTEM_NOT_READY if the necessary system software is not\n initialized or running.\n\n This call may return CUDA_ERROR_ILLEGAL_STATE if the system configuration\n is in an illegal state. In such cases, to continue using multicast, verify\n that the system configuration is in a valid state and all required driver\n daemons are running properly.\n\n \\param[in]  mcHandle     Handle representing a multicast object.\n \\param[in]  mcOffset     Offset into multicast va range for attachment.\n \\param[in]  memptr       Virtual address of the memory allocation.\n \\param[in]  size         Size of memory that will be bound to the\n                          multicast object.\n \\param[in]  flags        Flags for future use, must be zero now.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_PERMITTED,\n ::CUDA_ERROR_NOT_SUPPORTED,\n ::CUDA_ERROR_OUT_OF_MEMORY,\n ::CUDA_ERROR_SYSTEM_NOT_READY,\n ::CUDA_ERROR_ILLEGAL_STATE\n\n \\sa ::cuMulticastCreate, ::cuMulticastAddDevice, ::cuMemCreate*/\n    fn cuMulticastBindAddr(\n        mcHandle: cuda_types::cuda::CUmemGenericAllocationHandle,\n        mcOffset: usize,\n        memptr: cuda_types::cuda::CUdeviceptr,\n        size: usize,\n        flags: ::core::ffi::c_ulonglong,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Unbind any memory allocations bound to a multicast object at a given offset and upto a given size.\n\n Unbinds any memory allocations hosted on \\p dev and bound to a multicast\n object at \\p mcOffset and upto a given \\p size.\n The intended \\p size of the unbind and the offset in the multicast range\n ( \\p mcOffset ) must be a multiple of the value returned by\n ::cuMulticastGetGranularity flag ::CU_MULTICAST_GRANULARITY_MINIMUM.\n The \\p size + \\p mcOffset cannot be larger than the total size of the\n multicast object.\n\n \\note\n Warning:\n The \\p mcOffset and the \\p size must match the corresponding values specified\n during the bind call. Any other values may result in undefined behavior.\n\n \\param[in]  mcHandle     Handle representing a multicast object.\n \\param[in]  dev          Device that hosts the memory allocation.\n \\param[in]  mcOffset     Offset into the multicast object.\n \\param[in]  size         Desired size to unbind.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_PERMITTED,\n ::CUDA_ERROR_NOT_SUPPORTED\n\n \\sa ::cuMulticastBindMem, ::cuMulticastBindAddr*/\n    fn cuMulticastUnbind(\n        mcHandle: cuda_types::cuda::CUmemGenericAllocationHandle,\n        dev: cuda_types::cuda::CUdevice,\n        mcOffset: usize,\n        size: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Calculates either the minimal or recommended granularity for multicast object\n\n Calculates either the minimal or recommended granularity for a given set of\n multicast object properties and returns it in granularity.  This granularity\n can be used as a multiple for size, bind offsets and address mappings of the\n multicast object.\n\n \\param[out] granularity Returned granularity.\n \\param[in]  prop        Properties of the multicast object.\n \\param[in]  option      Determines which granularity to return.\n\n \\returns\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_PERMITTED,\n ::CUDA_ERROR_NOT_SUPPORTED\n\n \\sa ::cuMulticastCreate, ::cuMulticastBindMem, ::cuMulticastBindAddr, ::cuMulticastUnbind*/\n    fn cuMulticastGetGranularity(\n        granularity: *mut usize,\n        prop: *const cuda_types::cuda::CUmulticastObjectProp,\n        option: cuda_types::cuda::CUmulticastGranularity_flags,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns information about a pointer\n\n The supported attributes are:\n\n - ::CU_POINTER_ATTRIBUTE_CONTEXT:\n\n      Returns in \\p *data the ::CUcontext in which \\p ptr was allocated or\n      registered.\n      The type of \\p data must be ::CUcontext *.\n\n      If \\p ptr was not allocated by, mapped by, or registered with\n      a ::CUcontext which uses unified virtual addressing then\n      ::CUDA_ERROR_INVALID_VALUE is returned.\n\n - ::CU_POINTER_ATTRIBUTE_MEMORY_TYPE:\n\n      Returns in \\p *data the physical memory type of the memory that\n      \\p ptr addresses as a ::CUmemorytype enumerated value.\n      The type of \\p data must be unsigned int.\n\n      If \\p ptr addresses device memory then \\p *data is set to\n      ::CU_MEMORYTYPE_DEVICE.  The particular ::CUdevice on which the\n      memory resides is the ::CUdevice of the ::CUcontext returned by the\n      ::CU_POINTER_ATTRIBUTE_CONTEXT attribute of \\p ptr.\n\n      If \\p ptr addresses host memory then \\p *data is set to\n      ::CU_MEMORYTYPE_HOST.\n\n      If \\p ptr was not allocated by, mapped by, or registered with\n      a ::CUcontext which uses unified virtual addressing then\n      ::CUDA_ERROR_INVALID_VALUE is returned.\n\n      If the current ::CUcontext does not support unified virtual\n      addressing then ::CUDA_ERROR_INVALID_CONTEXT is returned.\n\n - ::CU_POINTER_ATTRIBUTE_DEVICE_POINTER:\n\n      Returns in \\p *data the device pointer value through which\n      \\p ptr may be accessed by kernels running in the current\n      ::CUcontext.\n      The type of \\p data must be CUdeviceptr *.\n\n      If there exists no device pointer value through which\n      kernels running in the current ::CUcontext may access\n      \\p ptr then ::CUDA_ERROR_INVALID_VALUE is returned.\n\n      If there is no current ::CUcontext then\n      ::CUDA_ERROR_INVALID_CONTEXT is returned.\n\n      Except in the exceptional disjoint addressing cases discussed\n      below, the value returned in \\p *data will equal the input\n      value \\p ptr.\n\n - ::CU_POINTER_ATTRIBUTE_HOST_POINTER:\n\n      Returns in \\p *data the host pointer value through which\n      \\p ptr may be accessed by by the host program.\n      The type of \\p data must be void **.\n      If there exists no host pointer value through which\n      the host program may directly access \\p ptr then\n      ::CUDA_ERROR_INVALID_VALUE is returned.\n\n      Except in the exceptional disjoint addressing cases discussed\n      below, the value returned in \\p *data will equal the input\n      value \\p ptr.\n\n - ::CU_POINTER_ATTRIBUTE_P2P_TOKENS:\n\n      Returns in \\p *data two tokens for use with the nv-p2p.h Linux\n      kernel interface. \\p data must be a struct of type\n      CUDA_POINTER_ATTRIBUTE_P2P_TOKENS.\n\n      \\p ptr must be a pointer to memory obtained from :cuMemAlloc().\n      Note that p2pToken and vaSpaceToken are only valid for the\n      lifetime of the source allocation. A subsequent allocation at\n      the same address may return completely different tokens.\n      Querying this attribute has a side effect of setting the attribute\n      ::CU_POINTER_ATTRIBUTE_SYNC_MEMOPS for the region of memory that\n      \\p ptr points to.\n\n - ::CU_POINTER_ATTRIBUTE_SYNC_MEMOPS:\n\n      A boolean attribute which when set, ensures that synchronous memory operations\n      initiated on the region of memory that \\p ptr points to will always synchronize.\n      See further documentation in the section titled \"API synchronization behavior\"\n      to learn more about cases when synchronous memory operations can\n      exhibit asynchronous behavior.\n\n - ::CU_POINTER_ATTRIBUTE_BUFFER_ID:\n\n      Returns in \\p *data a buffer ID which is guaranteed to be unique within the process.\n      \\p data must point to an unsigned long long.\n\n      \\p ptr must be a pointer to memory obtained from a CUDA memory allocation API.\n      Every memory allocation from any of the CUDA memory allocation APIs will\n      have a unique ID over a process lifetime. Subsequent allocations do not reuse IDs\n      from previous freed allocations. IDs are only unique within a single process.\n\n\n - ::CU_POINTER_ATTRIBUTE_IS_MANAGED:\n\n      Returns in \\p *data a boolean that indicates whether the pointer points to\n      managed memory or not.\n\n      If \\p ptr is not a valid CUDA pointer then ::CUDA_ERROR_INVALID_VALUE is returned.\n\n - ::CU_POINTER_ATTRIBUTE_DEVICE_ORDINAL:\n\n      Returns in \\p *data an integer representing a device ordinal of a device against\n      which the memory was allocated or registered.\n\n - ::CU_POINTER_ATTRIBUTE_IS_LEGACY_CUDA_IPC_CAPABLE:\n\n      Returns in \\p *data a boolean that indicates if this pointer maps to\n      an allocation that is suitable for ::cudaIpcGetMemHandle.\n\n - ::CU_POINTER_ATTRIBUTE_RANGE_START_ADDR:\n\n      Returns in \\p *data the starting address for the allocation referenced\n      by the device pointer \\p ptr.  Note that this is not necessarily the\n      address of the mapped region, but the address of the mappable address\n      range \\p ptr references (e.g. from ::cuMemAddressReserve).\n\n - ::CU_POINTER_ATTRIBUTE_RANGE_SIZE:\n\n      Returns in \\p *data the size for the allocation referenced by the device\n      pointer \\p ptr.  Note that this is not necessarily the size of the mapped\n      region, but the size of the mappable address range \\p ptr references\n      (e.g. from ::cuMemAddressReserve).  To retrieve the size of the mapped\n      region, see ::cuMemGetAddressRange\n\n - ::CU_POINTER_ATTRIBUTE_MAPPED:\n\n      Returns in \\p *data a boolean that indicates if this pointer is in a\n      valid address range that is mapped to a backing allocation.\n\n - ::CU_POINTER_ATTRIBUTE_ALLOWED_HANDLE_TYPES:\n\n      Returns a bitmask of the allowed handle types for an allocation that may\n      be passed to ::cuMemExportToShareableHandle.\n\n - ::CU_POINTER_ATTRIBUTE_MEMPOOL_HANDLE:\n\n      Returns in \\p *data the handle to the mempool that the allocation was obtained from.\n\n - ::CU_POINTER_ATTRIBUTE_IS_HW_DECOMPRESS_CAPABLE:\n\n      Returns in \\p *data a boolean that indicates whether the pointer points\n      to memory that is capable to be used for hardware accelerated\n      decompression.\n\n \\par\n\n Note that for most allocations in the unified virtual address space\n the host and device pointer for accessing the allocation will be the\n same.  The exceptions to this are\n  - user memory registered using ::cuMemHostRegister\n  - host memory allocated using ::cuMemHostAlloc with the\n    ::CU_MEMHOSTALLOC_WRITECOMBINED flag\n For these types of allocation there will exist separate, disjoint host\n and device addresses for accessing the allocation.  In particular\n  - The host address will correspond to an invalid unmapped device address\n    (which will result in an exception if accessed from the device)\n  - The device address will correspond to an invalid unmapped host address\n    (which will result in an exception if accessed from the host).\n For these types of allocations, querying ::CU_POINTER_ATTRIBUTE_HOST_POINTER\n and ::CU_POINTER_ATTRIBUTE_DEVICE_POINTER may be used to retrieve the host\n and device addresses from either address.\n\n \\param data      - Returned pointer attribute value\n \\param attribute - Pointer attribute to query\n \\param ptr       - Pointer\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE\n \\notefnerr\n\n \\sa\n ::cuPointerSetAttribute,\n ::cuMemAlloc,\n ::cuMemFree,\n ::cuMemAllocHost,\n ::cuMemFreeHost,\n ::cuMemHostAlloc,\n ::cuMemHostRegister,\n ::cuMemHostUnregister,\n ::cudaPointerGetAttributes*/\n    fn cuPointerGetAttribute(\n        data: *mut ::core::ffi::c_void,\n        attribute: cuda_types::cuda::CUpointer_attribute,\n        ptr: cuda_types::cuda::CUdeviceptr,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Prefetches memory to the specified destination location\n\n Prefetches memory to the specified destination location.  \\p devPtr is the\n base device pointer of the memory to be prefetched and \\p location specifies the\n destination location. \\p count specifies the number of bytes to copy. \\p hStream\n is the stream in which the operation is enqueued. The memory range must refer\n to managed memory allocated via ::cuMemAllocManaged or declared via __managed__ variables.\n\n Specifying ::CU_MEM_LOCATION_TYPE_DEVICE for ::CUmemLocation::type will prefetch memory to GPU\n specified by device ordinal ::CUmemLocation::id which must have non-zero value for the device attribute\n ::CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS. Additionally, \\p hStream must be associated with a device\n that has a non-zero value for the device attribute ::CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS.\n Specifying ::CU_MEM_LOCATION_TYPE_HOST as ::CUmemLocation::type will prefetch data to host memory.\n Applications can request prefetching memory to a specific host NUMA node by specifying\n ::CU_MEM_LOCATION_TYPE_HOST_NUMA for ::CUmemLocation::type and a valid host NUMA node id in ::CUmemLocation::id\n Users can also request prefetching memory to the host NUMA node closest to the current thread's CPU by specifying\n ::CU_MEM_LOCATION_TYPE_HOST_NUMA_CURRENT for ::CUmemLocation::type. Note when ::CUmemLocation::type is etiher\n ::CU_MEM_LOCATION_TYPE_HOST OR ::CU_MEM_LOCATION_TYPE_HOST_NUMA_CURRENT, ::CUmemLocation::id will be ignored.\n\n The start address and end address of the memory range will be rounded down and rounded up\n respectively to be aligned to CPU page size before the prefetch operation is enqueued\n in the stream.\n\n If no physical memory has been allocated for this region, then this memory region\n will be populated and mapped on the destination device. If there's insufficient\n memory to prefetch the desired region, the Unified Memory driver may evict pages from other\n ::cuMemAllocManaged allocations to host memory in order to make room. Device memory\n allocated using ::cuMemAlloc or ::cuArrayCreate will not be evicted.\n\n By default, any mappings to the previous location of the migrated pages are removed and\n mappings for the new location are only setup on the destination location. The exact behavior however\n also depends on the settings applied to this memory range via ::cuMemAdvise as described\n below:\n\n If ::CU_MEM_ADVISE_SET_READ_MOSTLY was set on any subset of this memory range,\n then that subset will create a read-only copy of the pages on destination location.\n If however the destination location is a host NUMA node, then any pages of that subset\n that are already in another host NUMA node will be transferred to the destination.\n\n If ::CU_MEM_ADVISE_SET_PREFERRED_LOCATION was called on any subset of this memory\n range, then the pages will be migrated to \\p location even if \\p location is not the\n preferred location of any pages in the memory range.\n\n If ::CU_MEM_ADVISE_SET_ACCESSED_BY was called on any subset of this memory range,\n then mappings to those pages from all the appropriate processors are updated to\n refer to the new location if establishing such a mapping is possible. Otherwise,\n those mappings are cleared.\n\n Note that this API is not required for functionality and only serves to improve performance\n by allowing the application to migrate data to a suitable location before it is accessed.\n Memory accesses to this range are always coherent and are allowed even when the data is\n actively being migrated.\n\n Note that this function is asynchronous with respect to the host and all work\n on other devices.\n\n \\param devPtr    - Pointer to be prefetched\n \\param count     - Size in bytes\n \\param location  - Location to prefetch to\n \\param flags     - flags for future use, must be zero now.\n \\param hStream   - Stream to enqueue prefetch operation\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE\n \\notefnerr\n \\note_async\n \\note_null_stream\n\n \\sa ::cuMemcpy, ::cuMemcpyPeer, ::cuMemcpyAsync,\n ::cuMemcpy3DPeerAsync, ::cuMemAdvise,\n ::cudaMemPrefetchAsync*/\n    fn cuMemPrefetchAsync_v2_ptsz(\n        devPtr: cuda_types::cuda::CUdeviceptr,\n        count: usize,\n        location: cuda_types::cuda::CUmemLocation,\n        flags: ::core::ffi::c_uint,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Advise about the usage of a given memory range\n\n Advise the Unified Memory subsystem about the usage pattern for the memory range\n starting at \\p devPtr with a size of \\p count bytes. The start address and end address of the memory\n range will be rounded down and rounded up respectively to be aligned to CPU page size before the\n advice is applied. The memory range must refer to managed memory allocated via ::cuMemAllocManaged\n or declared via __managed__ variables. The memory range could also refer to system-allocated pageable\n memory provided it represents a valid, host-accessible region of memory and all additional constraints\n imposed by \\p advice as outlined below are also satisfied. Specifying an invalid system-allocated pageable\n memory range results in an error being returned.\n\n The \\p advice parameter can take the following values:\n - ::CU_MEM_ADVISE_SET_READ_MOSTLY: This implies that the data is mostly going to be read\n from and only occasionally written to. Any read accesses from any processor to this region will create a\n read-only copy of at least the accessed pages in that processor's memory. Additionally, if ::cuMemPrefetchAsync\n is called on this region, it will create a read-only copy of the data on the destination processor.\n If the target location for ::cuMemPrefetchAsync is a host NUMA node and a read-only copy already exists on\n another host NUMA node, that copy will be migrated to the targeted host NUMA node.\n If any processor writes to this region, all copies of the corresponding page will be invalidated\n except for the one where the write occurred. If the writing processor is the CPU and the preferred location of\n the page is a host NUMA node, then the page will also be migrated to that host NUMA node. The \\p location argument is ignored for this advice.\n Note that for a page to be read-duplicated, the accessing processor must either be the CPU or a GPU\n that has a non-zero value for the device attribute ::CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS.\n Also, if a context is created on a device that does not have the device attribute\n ::CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS set, then read-duplication will not occur until\n all such contexts are destroyed.\n If the memory region refers to valid system-allocated pageable memory, then the accessing device must\n have a non-zero value for the device attribute ::CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS for a read-only\n copy to be created on that device. Note however that if the accessing device also has a non-zero value for the\n device attribute ::CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS_USES_HOST_PAGE_TABLES, then setting this advice\n will not create a read-only copy when that device accesses this memory region.\n\n - ::CU_MEM_ADVISE_UNSET_READ_MOSTLY:  Undoes the effect of ::CU_MEM_ADVISE_SET_READ_MOSTLY and also prevents the\n Unified Memory driver from attempting heuristic read-duplication on the memory range. Any read-duplicated\n copies of the data will be collapsed into a single copy. The location for the collapsed\n copy will be the preferred location if the page has a preferred location and one of the read-duplicated\n copies was resident at that location. Otherwise, the location chosen is arbitrary.\n Note: The \\p location argument is ignored for this advice.\n\n - ::CU_MEM_ADVISE_SET_PREFERRED_LOCATION: This advice sets the preferred location for the\n data to be the memory belonging to \\p location. When ::CUmemLocation::type is ::CU_MEM_LOCATION_TYPE_HOST,\n ::CUmemLocation::id is ignored and the preferred location is set to be host memory. To set the preferred location\n to a specific host NUMA node, applications must set ::CUmemLocation::type to ::CU_MEM_LOCATION_TYPE_HOST_NUMA and\n ::CUmemLocation::id must specify the NUMA ID of the host NUMA node. If ::CUmemLocation::type is set to ::CU_MEM_LOCATION_TYPE_HOST_NUMA_CURRENT,\n ::CUmemLocation::id will be ignored and the the host NUMA node closest to the calling thread's CPU will be used as the preferred location.\n If ::CUmemLocation::type is a ::CU_MEM_LOCATION_TYPE_DEVICE, then ::CUmemLocation::id must be a valid device ordinal\n and the device must have a non-zero value for the device attribute ::CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS.\n Setting the preferred location does not cause data to migrate to that location immediately. Instead, it guides the migration policy\n when a fault occurs on that memory region. If the data is already in its preferred location and the\n faulting processor can establish a mapping without requiring the data to be migrated, then\n data migration will be avoided. On the other hand, if the data is not in its preferred location\n or if a direct mapping cannot be established, then it will be migrated to the processor accessing\n it. It is important to note that setting the preferred location does not prevent data prefetching\n done using ::cuMemPrefetchAsync.\n Having a preferred location can override the page thrash detection and resolution logic in the Unified\n Memory driver. Normally, if a page is detected to be constantly thrashing between for example host and device\n memory, the page may eventually be pinned to host memory by the Unified Memory driver. But\n if the preferred location is set as device memory, then the page will continue to thrash indefinitely.\n If ::CU_MEM_ADVISE_SET_READ_MOSTLY is also set on this memory region or any subset of it, then the\n policies associated with that advice will override the policies of this advice, unless read accesses from\n \\p location will not result in a read-only copy being created on that procesor as outlined in description for\n the advice ::CU_MEM_ADVISE_SET_READ_MOSTLY.\n If the memory region refers to valid system-allocated pageable memory, and ::CUmemLocation::type is CU_MEM_LOCATION_TYPE_DEVICE\n then ::CUmemLocation::id must be a valid device that has a non-zero alue for the device attribute ::CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS.\n\n - ::CU_MEM_ADVISE_UNSET_PREFERRED_LOCATION: Undoes the effect of ::CU_MEM_ADVISE_SET_PREFERRED_LOCATION\n and changes the preferred location to none. The \\p location argument is ignored for this advice.\n\n - ::CU_MEM_ADVISE_SET_ACCESSED_BY: This advice implies that the data will be accessed by processor \\p location.\n The ::CUmemLocation::type must be either ::CU_MEM_LOCATION_TYPE_DEVICE with ::CUmemLocation::id representing a valid device\n ordinal or ::CU_MEM_LOCATION_TYPE_HOST and ::CUmemLocation::id will be ignored. All other location types are invalid.\n If ::CUmemLocation::id is a GPU, then the device attribute ::CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS must be non-zero.\n This advice does not cause data migration and has no impact on the location of the data per se. Instead,\n it causes the data to always be mapped in the specified processor's page tables, as long as the\n location of the data permits a mapping to be established. If the data gets migrated for any reason,\n the mappings are updated accordingly.\n This advice is recommended in scenarios where data locality is not important, but avoiding faults is.\n Consider for example a system containing multiple GPUs with peer-to-peer access enabled, where the\n data located on one GPU is occasionally accessed by peer GPUs. In such scenarios, migrating data\n over to the other GPUs is not as important because the accesses are infrequent and the overhead of\n migration may be too high. But preventing faults can still help improve performance, and so having\n a mapping set up in advance is useful. Note that on CPU access of this data, the data may be migrated\n to host memory because the CPU typically cannot access device memory directly. Any GPU that had the\n ::CU_MEM_ADVISE_SET_ACCESSED_BY flag set for this data will now have its mapping updated to point to the\n page in host memory.\n If ::CU_MEM_ADVISE_SET_READ_MOSTLY is also set on this memory region or any subset of it, then the\n policies associated with that advice will override the policies of this advice. Additionally, if the\n preferred location of this memory region or any subset of it is also \\p location, then the policies\n associated with ::CU_MEM_ADVISE_SET_PREFERRED_LOCATION will override the policies of this advice.\n If the memory region refers to valid system-allocated pageable memory, and ::CUmemLocation::type is ::CU_MEM_LOCATION_TYPE_DEVICE\n then device in ::CUmemLocation::id must have a non-zero value for the device attribute ::CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS.\n Additionally, if ::CUmemLocation::id has a non-zero value for the device attribute ::CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS_USES_HOST_PAGE_TABLES,\n then this call has no effect.\n\n - ::CU_MEM_ADVISE_UNSET_ACCESSED_BY: Undoes the effect of ::CU_MEM_ADVISE_SET_ACCESSED_BY. Any mappings to\n the data from \\p location may be removed at any time causing accesses to result in non-fatal page faults.\n If the memory region refers to valid system-allocated pageable memory, and ::CUmemLocation::type is ::CU_MEM_LOCATION_TYPE_DEVICE\n then device in ::CUmemLocation::id must have a non-zero value for the device attribute ::CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS.\n Additionally, if ::CUmemLocation::id has a non-zero value for the device attribute ::CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS_USES_HOST_PAGE_TABLES,\n then this call has no effect.\n\n \\param devPtr   - Pointer to memory to set the advice for\n \\param count    - Size in bytes of the memory range\n \\param advice   - Advice to be applied for the specified memory range\n \\param location - location to apply the advice for\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE\n \\notefnerr\n \\note_async\n \\note_null_stream\n\n \\sa ::cuMemcpy, ::cuMemcpyPeer, ::cuMemcpyAsync,\n ::cuMemcpy3DPeerAsync, ::cuMemPrefetchAsync,\n ::cudaMemAdvise*/\n    fn cuMemAdvise_v2(\n        devPtr: cuda_types::cuda::CUdeviceptr,\n        count: usize,\n        advice: cuda_types::cuda::CUmem_advise,\n        location: cuda_types::cuda::CUmemLocation,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Performs a batch of memory prefetches asynchronously\n\n Performs a batch of memory prefetches. The batch as a whole executes in stream order\n but operations within a batch are not guaranteed to execute in any specific order.\n All devices in the system must have a non-zero value for the device attribute\n ::CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS otherwise the API will return an error.\n\n The semantics of the individual prefetch operations are as described in ::cuMemPrefetchAsync.\n\n Performs memory prefetch on address ranges specified in \\p dptrs and \\p sizes.\n Both arrays must be of the same length as specified by \\p count. Each memory range specified\n must refer to managed memory allocated via ::cuMemAllocManaged or declared via\n __managed__ variables or it may also refer to system-allocated memory when all devices have a non-zero\n value for ::CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS. The prefetch location for every operation\n in the batch is specified in the \\p prefetchLocs array. Each entry in this array can apply to\n more than one operation. This can be done by specifying in the \\p prefetchLocIdxs array, the\n index of the first prefetch operation that the corresponding entry in the \\p prefetchLocs array\n applies to. Both \\p prefetchLocs and \\p prefetchLocIdxs must be of the same length as specified\n by \\p numPrefetchLocs. For example, if a batch has 10 prefetches listed in dptrs/sizes, the\n first 4 of which are to be prefetched to one location and the remaining 6 are to be prefetched\n to another, then \\p numPrefetchLocs will be 2, \\p prefetchLocIdxs will be {0, 4} and \\p prefetchLocs\n will contain the two locations. Note the first entry in \\p prefetchLocIdxs must always be 0.\n Also, each entry must be greater than the previous entry and the last entry should be less than \\p count.\n Furthermore, \\p numPrefetchLocs must be lesser than or equal to \\p count.\n\n \\param dptrs           - Array of pointers to be prefetched\n \\param sizes           - Array of sizes for memory prefetch operations.\n \\param count           - Size of \\p dptrs and \\p sizes arrays.\n \\param prefetchLocs    - Array of locations to prefetch to.\n \\param prefetchLocIdxs - Array of indices to specify which operands each entry in the \\p prefetchLocs array applies to.\n                          The locations specified in prefetchLocs[k] will be applied to copies starting from  prefetchLocIdxs[k]\n                          through  prefetchLocIdxs[k+1] - 1. Also prefetchLocs[numPrefetchLocs - 1] will apply to prefetches starting from\n                          prefetchLocIdxs[numPrefetchLocs - 1] through count - 1.\n \\param numPrefetchLocs - Size of \\p prefetchLocs and \\p prefetchLocIdxs arrays.\n \\param flags           - Flags reserved for future use. Must be zero.\n \\param hStream         - The stream to enqueue the operations in. Must not be legacy NULL stream.\n*/\n    fn cuMemPrefetchBatchAsync_ptsz(\n        dptrs: *mut cuda_types::cuda::CUdeviceptr,\n        sizes: *mut usize,\n        count: usize,\n        prefetchLocs: *mut cuda_types::cuda::CUmemLocation,\n        prefetchLocIdxs: *mut usize,\n        numPrefetchLocs: usize,\n        flags: ::core::ffi::c_ulonglong,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Performs a batch of memory discards asynchronously\n\n Performs a batch of memory discards. The batch as a whole executes in stream order\n but operations within a batch are not guaranteed to execute in any specific order.\n All devices in the system must have a non-zero value for the device attribute\n ::CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS otherwise the API will return an error.\n\n Discarding a memory range informs the driver that the contents of that range are no longer useful.\n Discarding memory ranges allows the driver to optimize certain data migrations and can also help\n reduce memory pressure. This operation can be undone on any part of the range by either writing to it\n or prefetching it via ::cuMemPrefetchAsync or ::cuMemPrefetchBatchAsync. Reading from a discarded range,\n without a subsequent write or prefetch to that part of the range, will return an indeterminate value.\n Note that any reads, writes or prefetches to any part of the memory range that occur simultaneously with\n the discard operation result in undefined behavior.\n\n Performs memory discard on address ranges specified in \\p dptrs and \\p sizes.\n Both arrays must be of the same length as specified by \\p count. Each memory range\n specified must refer to managed memory allocated via ::cuMemAllocManaged or declared\n via __managed__ variables or it may also refer to system-allocated memory when all devices\n have a non-zero value for ::CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS.\n\n \\param dptrs   - Array of pointers to be discarded\n \\param sizes   - Array of sizes for memory discard operations.\n \\param count   - Size of \\p dptrs and \\p sizes arrays.\n \\param flags   - Flags reserved for future use. Must be zero.\n \\param hStream - The stream to enqueue the operations in. Must not be legacy NULL stream.\n*/\n    fn cuMemDiscardBatchAsync_ptsz(\n        dptrs: *mut cuda_types::cuda::CUdeviceptr,\n        sizes: *mut usize,\n        count: usize,\n        flags: ::core::ffi::c_ulonglong,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Performs a batch of memory discards and prefetches asynchronously\n\n Performs a batch of memory discards followed by prefetches. The batch as a whole executes\n in stream order but operations within a batch are not guaranteed to execute in any specific order.\n All devices in the system must have a non-zero value for the device attribute\n ::CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS otherwise the API will return an error.\n\n Calling ::cuMemDiscardAndPrefetchBatchAsync is semantically equivalent to calling\n ::cuMemDiscardBatchAsync followed by ::cuMemPrefetchBatchAsync, but is more optimal.\n For more details on what discarding and prefetching imply, please refer to ::cuMemDiscardBatchAsync and\n ::cuMemPrefetchBatchAsync respectively. Note that any reads, writes or prefetches to any part\n of the memory range that occur simultaneously with this combined discard+prefetch operation\n result in undefined behavior.\n\n Performs memory discard and prefetch on address ranges specified in \\p dptrs and \\p sizes.\n Both arrays must be of the same length as specified by \\p count. Each memory range specified\n must refer to managed memory allocated via ::cuMemAllocManaged or declared via\n __managed__ variables or it may also refer to system-allocated memory when all devices\n have a non-zero value for ::CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS. Every operation in the batch\n has to be associated with a valid location to prefetch the address range to and specified in\n the \\p prefetchLocs array. Each entry in this array can apply to more than one operation.\n This can be done by specifying in the \\p prefetchLocIdxs array, the index of the first\n operation that the corresponding entry in the \\p prefetchLocs array applies to.\n Both \\p prefetchLocs and \\p prefetchLocIdxs must be of the same length as specified by\n \\p numPrefetchLocs. For example, if a batch has 10 operations listed in dptrs/sizes,\n the first 6 of which are to be prefetched to one location and the remaining 4 are to be\n prefetched to another, then \\p numPrefetchLocs will be 2, \\p prefetchLocIdxs will be {0, 6}\n and \\p prefetchLocs will contain the two set of locations. Note the first entry in\n \\p prefetchLocIdxs must always be 0. Also, each entry must be greater than the previous\n entry and the last entry should be less than \\p count. Furthermore, \\p numPrefetchLocs\n must be lesser than or equal to \\p count.\n\n \\param dptrs           - Array of pointers to be discarded\n \\param sizes           - Array of sizes for memory discard operations.\n \\param count           - Size of \\p dptrs and \\p sizes arrays.\n \\param prefetchLocs    - Array of locations to prefetch to.\n \\param prefetchLocIdxs - Array of indices to specify which operands each entry in the \\p prefetchLocs array applies to.\n                          The locations specified in prefetchLocs[k] will be applied to operations starting from  prefetchLocIdxs[k]\n                          through prefetchLocIdxs[k+1] - 1. Also prefetchLocs[numPrefetchLocs - 1] will apply to copies starting from\n                          prefetchLocIdxs[numPrefetchLocs - 1] through count - 1.\n \\param numPrefetchLocs - Size of \\p prefetchLocs and \\p prefetchLocIdxs arrays.\n \\param flags           - Flags reserved for future use. Must be zero.\n \\param hStream         - The stream to enqueue the operations in. Must not be legacy NULL stream.\n*/\n    fn cuMemDiscardAndPrefetchBatchAsync_ptsz(\n        dptrs: *mut cuda_types::cuda::CUdeviceptr,\n        sizes: *mut usize,\n        count: usize,\n        prefetchLocs: *mut cuda_types::cuda::CUmemLocation,\n        prefetchLocIdxs: *mut usize,\n        numPrefetchLocs: usize,\n        flags: ::core::ffi::c_ulonglong,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Query an attribute of a given memory range\n\n Query an attribute about the memory range starting at \\p devPtr with a size of \\p count bytes. The\n memory range must refer to managed memory allocated via ::cuMemAllocManaged or declared via\n __managed__ variables.\n\n The \\p attribute parameter can take the following values:\n - ::CU_MEM_RANGE_ATTRIBUTE_READ_MOSTLY: If this attribute is specified, \\p data will be interpreted\n as a 32-bit integer, and \\p dataSize must be 4. The result returned will be 1 if all pages in the given\n memory range have read-duplication enabled, or 0 otherwise.\n - ::CU_MEM_RANGE_ATTRIBUTE_PREFERRED_LOCATION: If this attribute is specified, \\p data will be\n interpreted as a 32-bit integer, and \\p dataSize must be 4. The result returned will be a GPU device\n id if all pages in the memory range have that GPU as their preferred location, or it will be CU_DEVICE_CPU\n if all pages in the memory range have the CPU as their preferred location, or it will be CU_DEVICE_INVALID\n if either all the pages don't have the same preferred location or some of the pages don't have a\n preferred location at all. Note that the actual location of the pages in the memory range at the time of\n the query may be different from the preferred location.\n - ::CU_MEM_RANGE_ATTRIBUTE_ACCESSED_BY: If this attribute is specified, \\p data will be interpreted\n as an array of 32-bit integers, and \\p dataSize must be a non-zero multiple of 4. The result returned\n will be a list of device ids that had ::CU_MEM_ADVISE_SET_ACCESSED_BY set for that entire memory range.\n If any device does not have that advice set for the entire memory range, that device will not be included.\n If \\p data is larger than the number of devices that have that advice set for that memory range,\n CU_DEVICE_INVALID will be returned in all the extra space provided. For ex., if \\p dataSize is 12\n (i.e. \\p data has 3 elements) and only device 0 has the advice set, then the result returned will be\n { 0, CU_DEVICE_INVALID, CU_DEVICE_INVALID }. If \\p data is smaller than the number of devices that have\n that advice set, then only as many devices will be returned as can fit in the array. There is no\n guarantee on which specific devices will be returned, however.\n - ::CU_MEM_RANGE_ATTRIBUTE_LAST_PREFETCH_LOCATION: If this attribute is specified, \\p data will be\n interpreted as a 32-bit integer, and \\p dataSize must be 4. The result returned will be the last location\n to which all pages in the memory range were prefetched explicitly via ::cuMemPrefetchAsync. This will either be\n a GPU id or CU_DEVICE_CPU depending on whether the last location for prefetch was a GPU or the CPU\n respectively. If any page in the memory range was never explicitly prefetched or if all pages were not\n prefetched to the same location, CU_DEVICE_INVALID will be returned. Note that this simply returns the\n last location that the application requested to prefetch the memory range to. It gives no indication as to\n whether the prefetch operation to that location has completed or even begun.\n - ::CU_MEM_RANGE_ATTRIBUTE_PREFERRED_LOCATION_TYPE: If this attribute is specified, \\p data will be\n interpreted as a ::CUmemLocationType, and \\p dataSize must be sizeof(CUmemLocationType). The ::CUmemLocationType returned will be\n ::CU_MEM_LOCATION_TYPE_DEVICE if all pages in the memory range have the same GPU as their preferred location, or ::CUmemLocationType\n will be ::CU_MEM_LOCATION_TYPE_HOST if all pages in the memory range have the CPU as their preferred location, or it will be ::CU_MEM_LOCATION_TYPE_HOST_NUMA\n if all the pages in the memory range have the same host NUMA node ID as their preferred location or it will be ::CU_MEM_LOCATION_TYPE_INVALID\n if either all the pages don't have the same preferred location or some of the pages don't have a preferred location at all.\n Note that the actual location type of the pages in the memory range at the time of the query may be different from the preferred location type.\n  - ::CU_MEM_RANGE_ATTRIBUTE_PREFERRED_LOCATION_ID: If this attribute is specified, \\p data will be\n interpreted as a 32-bit integer, and \\p dataSize must be 4. If the ::CU_MEM_RANGE_ATTRIBUTE_PREFERRED_LOCATION_TYPE query for the same address range\n returns ::CU_MEM_LOCATION_TYPE_DEVICE, it will be a valid device ordinal or if it returns ::CU_MEM_LOCATION_TYPE_HOST_NUMA, it will be a valid host NUMA node ID\n or if it returns any other location type, the id should be ignored.\n - ::CU_MEM_RANGE_ATTRIBUTE_LAST_PREFETCH_LOCATION_TYPE: If this attribute is specified, \\p data will be\n interpreted as a ::CUmemLocationType, and \\p dataSize must be sizeof(CUmemLocationType). The result returned will be the last location\n to which all pages in the memory range were prefetched explicitly via ::cuMemPrefetchAsync. The ::CUmemLocationType returned\n will be ::CU_MEM_LOCATION_TYPE_DEVICE if the last prefetch location was a GPU or ::CU_MEM_LOCATION_TYPE_HOST if it was the CPU or ::CU_MEM_LOCATION_TYPE_HOST_NUMA if\n the last prefetch location was a specific host NUMA node. If any page in the memory range was never explicitly prefetched or if all pages were not\n prefetched to the same location, ::CUmemLocationType will be ::CU_MEM_LOCATION_TYPE_INVALID.\n Note that this simply returns the last location type that the application requested to prefetch the memory range to. It gives no indication as to\n whether the prefetch operation to that location has completed or even begun.\n  - ::CU_MEM_RANGE_ATTRIBUTE_LAST_PREFETCH_LOCATION_ID: If this attribute is specified, \\p data will be\n interpreted as a 32-bit integer, and \\p dataSize must be 4. If the ::CU_MEM_RANGE_ATTRIBUTE_LAST_PREFETCH_LOCATION_TYPE query for the same address range\n returns ::CU_MEM_LOCATION_TYPE_DEVICE, it will be a valid device ordinal or if it returns ::CU_MEM_LOCATION_TYPE_HOST_NUMA, it will be a valid host NUMA node ID\n or if it returns any other location type, the id should be ignored.\n\n \\param data      - A pointers to a memory location where the result\n                    of each attribute query will be written to.\n \\param dataSize  - Array containing the size of data\n \\param attribute - The attribute to query\n \\param devPtr    - Start of the range to query\n \\param count     - Size of the range to query\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE\n \\notefnerr\n \\note_async\n \\note_null_stream\n\n \\sa ::cuMemRangeGetAttributes, ::cuMemPrefetchAsync,\n ::cuMemAdvise,\n ::cudaMemRangeGetAttribute*/\n    fn cuMemRangeGetAttribute(\n        data: *mut ::core::ffi::c_void,\n        dataSize: usize,\n        attribute: cuda_types::cuda::CUmem_range_attribute,\n        devPtr: cuda_types::cuda::CUdeviceptr,\n        count: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Query attributes of a given memory range.\n\n Query attributes of the memory range starting at \\p devPtr with a size of \\p count bytes. The\n memory range must refer to managed memory allocated via ::cuMemAllocManaged or declared via\n __managed__ variables. The \\p attributes array will be interpreted to have \\p numAttributes\n entries. The \\p dataSizes array will also be interpreted to have \\p numAttributes entries.\n The results of the query will be stored in \\p data.\n\n The list of supported attributes are given below. Please refer to ::cuMemRangeGetAttribute for\n attribute descriptions and restrictions.\n\n - ::CU_MEM_RANGE_ATTRIBUTE_READ_MOSTLY\n - ::CU_MEM_RANGE_ATTRIBUTE_PREFERRED_LOCATION\n - ::CU_MEM_RANGE_ATTRIBUTE_ACCESSED_BY\n - ::CU_MEM_RANGE_ATTRIBUTE_LAST_PREFETCH_LOCATION\n - ::CU_MEM_RANGE_ATTRIBUTE_PREFERRED_LOCATION_TYPE\n - ::CU_MEM_RANGE_ATTRIBUTE_PREFERRED_LOCATION_ID\n - ::CU_MEM_RANGE_ATTRIBUTE_LAST_PREFETCH_LOCATION_TYPE\n - ::CU_MEM_RANGE_ATTRIBUTE_LAST_PREFETCH_LOCATION_ID\n\n \\param data          - A two-dimensional array containing pointers to memory\n                        locations where the result of each attribute query will be written to.\n \\param dataSizes     - Array containing the sizes of each result\n \\param attributes    - An array of attributes to query\n                        (numAttributes and the number of attributes in this array should match)\n \\param numAttributes - Number of attributes to query\n \\param devPtr        - Start of the range to query\n \\param count         - Size of the range to query\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE\n \\notefnerr\n\n \\sa ::cuMemRangeGetAttribute, ::cuMemAdvise,\n ::cuMemPrefetchAsync,\n ::cudaMemRangeGetAttributes*/\n    fn cuMemRangeGetAttributes(\n        data: *mut *mut ::core::ffi::c_void,\n        dataSizes: *mut usize,\n        attributes: *mut cuda_types::cuda::CUmem_range_attribute,\n        numAttributes: usize,\n        devPtr: cuda_types::cuda::CUdeviceptr,\n        count: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Set attributes on a previously allocated memory region\n\n The supported attributes are:\n\n - ::CU_POINTER_ATTRIBUTE_SYNC_MEMOPS:\n\n      A boolean attribute that can either be set (1) or unset (0). When set,\n      the region of memory that \\p ptr points to is guaranteed to always synchronize\n      memory operations that are synchronous. If there are some previously initiated\n      synchronous memory operations that are pending when this attribute is set, the\n      function does not return until those memory operations are complete.\n      See further documentation in the section titled \"API synchronization behavior\"\n      to learn more about cases when synchronous memory operations can\n      exhibit asynchronous behavior.\n      \\p value will be considered as a pointer to an unsigned integer to which this attribute is to be set.\n\n \\param value     - Pointer to memory containing the value to be set\n \\param attribute - Pointer attribute to set\n \\param ptr       - Pointer to a memory region allocated using CUDA memory allocation APIs\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE\n \\notefnerr\n\n \\sa ::cuPointerGetAttribute,\n ::cuPointerGetAttributes,\n ::cuMemAlloc,\n ::cuMemFree,\n ::cuMemAllocHost,\n ::cuMemFreeHost,\n ::cuMemHostAlloc,\n ::cuMemHostRegister,\n ::cuMemHostUnregister*/\n    fn cuPointerSetAttribute(\n        value: *const ::core::ffi::c_void,\n        attribute: cuda_types::cuda::CUpointer_attribute,\n        ptr: cuda_types::cuda::CUdeviceptr,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns information about a pointer.\n\n The supported attributes are (refer to ::cuPointerGetAttribute for attribute descriptions and restrictions):\n\n - ::CU_POINTER_ATTRIBUTE_CONTEXT\n - ::CU_POINTER_ATTRIBUTE_MEMORY_TYPE\n - ::CU_POINTER_ATTRIBUTE_DEVICE_POINTER\n - ::CU_POINTER_ATTRIBUTE_HOST_POINTER\n - ::CU_POINTER_ATTRIBUTE_SYNC_MEMOPS\n - ::CU_POINTER_ATTRIBUTE_BUFFER_ID\n - ::CU_POINTER_ATTRIBUTE_IS_MANAGED\n - ::CU_POINTER_ATTRIBUTE_DEVICE_ORDINAL\n - ::CU_POINTER_ATTRIBUTE_RANGE_START_ADDR\n - ::CU_POINTER_ATTRIBUTE_RANGE_SIZE\n - ::CU_POINTER_ATTRIBUTE_MAPPED\n - ::CU_POINTER_ATTRIBUTE_IS_LEGACY_CUDA_IPC_CAPABLE\n - ::CU_POINTER_ATTRIBUTE_ALLOWED_HANDLE_TYPES\n - ::CU_POINTER_ATTRIBUTE_MEMPOOL_HANDLE\n - ::CU_POINTER_ATTRIBUTE_IS_HW_DECOMPRESS_CAPABLE\n\n \\param numAttributes - Number of attributes to query\n \\param attributes    - An array of attributes to query\n                      (numAttributes and the number of attributes in this array should match)\n \\param data          - A two-dimensional array containing pointers to memory\n                      locations where the result of each attribute query will be written to.\n \\param ptr           - Pointer to query\n\n Unlike ::cuPointerGetAttribute, this function will not return an error when the \\p ptr\n encountered is not a valid CUDA pointer. Instead, the attributes are assigned default NULL values\n and CUDA_SUCCESS is returned.\n\n If \\p ptr was not allocated by, mapped by, or registered with a ::CUcontext which uses UVA\n (Unified Virtual Addressing), ::CUDA_ERROR_INVALID_CONTEXT is returned.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE\n \\notefnerr\n\n \\sa\n ::cuPointerGetAttribute,\n ::cuPointerSetAttribute,\n ::cudaPointerGetAttributes*/\n    fn cuPointerGetAttributes(\n        numAttributes: ::core::ffi::c_uint,\n        attributes: *mut cuda_types::cuda::CUpointer_attribute,\n        data: *mut *mut ::core::ffi::c_void,\n        ptr: cuda_types::cuda::CUdeviceptr,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Create a stream\n\n Creates a stream and returns a handle in \\p phStream.  The \\p Flags argument\n determines behaviors of the stream.\n\n Valid values for \\p Flags are:\n - ::CU_STREAM_DEFAULT: Default stream creation flag.\n - ::CU_STREAM_NON_BLOCKING: Specifies that work running in the created\n   stream may run concurrently with work in stream 0 (the NULL stream), and that\n   the created stream should perform no implicit synchronization with stream 0.\n\n \\param phStream - Returned newly created stream\n \\param Flags    - Parameters for stream creation\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_OUT_OF_MEMORY\n \\notefnerr\n\n \\sa ::cuStreamDestroy,\n ::cuStreamCreateWithPriority,\n ::cuGreenCtxStreamCreate,\n ::cuStreamGetPriority,\n ::cuStreamGetFlags,\n ::cuStreamGetDevice\n ::cuStreamWaitEvent,\n ::cuStreamQuery,\n ::cuStreamSynchronize,\n ::cuStreamAddCallback,\n ::cudaStreamCreate,\n ::cudaStreamCreateWithFlags*/\n    fn cuStreamCreate(\n        phStream: *mut cuda_types::cuda::CUstream,\n        Flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Create a stream with the given priority\n\n Creates a stream with the specified priority and returns a handle in \\p phStream.\n This affects the scheduling priority of work in the stream. Priorities provide a\n hint to preferentially run work with higher priority when possible, but do\n not preempt already-running work or provide any other functional guarantee on\n execution order.\n\n \\p priority follows a convention where lower numbers represent higher priorities.\n '0' represents default priority. The range of meaningful numerical priorities can\n be queried using ::cuCtxGetStreamPriorityRange. If the specified priority is\n outside the numerical range returned by ::cuCtxGetStreamPriorityRange,\n it will automatically be clamped to the lowest or the highest number in the range.\n\n \\param phStream    - Returned newly created stream\n \\param flags       - Flags for stream creation. See ::cuStreamCreate for a list of\n                      valid flags\n \\param priority    - Stream priority. Lower numbers represent higher priorities.\n                      See ::cuCtxGetStreamPriorityRange for more information about\n                      meaningful stream priorities that can be passed.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_OUT_OF_MEMORY\n \\notefnerr\n\n \\note Stream priorities are supported only on GPUs\n with compute capability 3.5 or higher.\n\n \\note In the current implementation, only compute kernels launched in\n priority streams are affected by the stream's priority. Stream priorities have\n no effect on host-to-device and device-to-host memory operations.\n\n \\sa ::cuStreamDestroy,\n ::cuStreamCreate,\n ::cuGreenCtxStreamCreate,\n ::cuStreamGetPriority,\n ::cuCtxGetStreamPriorityRange,\n ::cuStreamGetFlags,\n ::cuStreamGetDevice,\n ::cuStreamWaitEvent,\n ::cuStreamQuery,\n ::cuStreamSynchronize,\n ::cuStreamAddCallback,\n ::cudaStreamCreateWithPriority*/\n    fn cuStreamCreateWithPriority(\n        phStream: *mut cuda_types::cuda::CUstream,\n        flags: ::core::ffi::c_uint,\n        priority: ::core::ffi::c_int,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Query the priority of a given stream\n\n Query the priority of a stream created using ::cuStreamCreate, ::cuStreamCreateWithPriority or ::cuGreenCtxStreamCreate\n and return the priority in \\p priority. Note that if the stream was created with a\n priority outside the numerical range returned by ::cuCtxGetStreamPriorityRange,\n this function returns the clamped priority.\n See ::cuStreamCreateWithPriority for details about priority clamping.\n\n \\param hStream    - Handle to the stream to be queried\n \\param priority   - Pointer to a signed integer in which the stream's priority is returned\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_OUT_OF_MEMORY\n \\notefnerr\n\n \\sa ::cuStreamDestroy,\n ::cuStreamCreate,\n ::cuStreamCreateWithPriority,\n ::cuGreenCtxStreamCreate,\n ::cuCtxGetStreamPriorityRange,\n ::cuStreamGetFlags,\n ::cuStreamGetDevice,\n ::cudaStreamGetPriority*/\n    fn cuStreamGetPriority_ptsz(\n        hStream: cuda_types::cuda::CUstream,\n        priority: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the device handle of the stream\n\n Returns in \\p *device the device handle of the stream\n\n \\param hStream - Handle to the stream to be queried\n \\param device - Returns the device to which a stream belongs\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_OUT_OF_MEMORY\n \\notefnerr\n\n \\sa\n ::cuStreamDestroy,\n ::cuStreamCreate,\n ::cuGreenCtxStreamCreate,\n ::cuStreamGetFlags*/\n    fn cuStreamGetDevice_ptsz(\n        hStream: cuda_types::cuda::CUstream,\n        device: *mut cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Query the flags of a given stream\n\n Query the flags of a stream created using ::cuStreamCreate, ::cuStreamCreateWithPriority or ::cuGreenCtxStreamCreate\n and return the flags in \\p flags.\n\n \\param hStream    - Handle to the stream to be queried\n \\param flags      - Pointer to an unsigned integer in which the stream's flags are returned\n                     The value returned in \\p flags is a logical 'OR' of all flags that\n                     were used while creating this stream. See ::cuStreamCreate for the list\n                     of valid flags\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_OUT_OF_MEMORY\n \\notefnerr\n\n \\sa ::cuStreamDestroy,\n ::cuStreamCreate,\n ::cuGreenCtxStreamCreate,\n ::cuStreamGetPriority,\n ::cudaStreamGetFlags,\n ::cuStreamGetDevice*/\n    fn cuStreamGetFlags_ptsz(\n        hStream: cuda_types::cuda::CUstream,\n        flags: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the unique Id associated with the stream handle supplied\n\n Returns in \\p streamId the unique Id which is associated with the given stream handle.\n The Id is unique for the life of the program.\n\n The stream handle \\p hStream can refer to any of the following:\n <ul>\n   <li>a stream created via any of the CUDA driver APIs such as ::cuStreamCreate\n   and ::cuStreamCreateWithPriority, or their runtime API equivalents such as\n   ::cudaStreamCreate, ::cudaStreamCreateWithFlags and ::cudaStreamCreateWithPriority.\n   Passing an invalid handle will result in undefined behavior.</li>\n   <li>any of the special streams such as the NULL stream, ::CU_STREAM_LEGACY and\n   ::CU_STREAM_PER_THREAD. The runtime API equivalents of these are also accepted,\n   which are NULL, ::cudaStreamLegacy and ::cudaStreamPerThread respectively.</li>\n </ul>\n\n \\param hStream    - Handle to the stream to be queried\n \\param streamId   - Pointer to store the Id of the stream\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE\n \\notefnerr\n\n \\sa ::cuStreamDestroy,\n ::cuStreamCreate,\n ::cuStreamGetPriority,\n ::cudaStreamGetId*/\n    fn cuStreamGetId_ptsz(\n        hStream: cuda_types::cuda::CUstream,\n        streamId: *mut ::core::ffi::c_ulonglong,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Query the context associated with a stream\n\n Returns the CUDA context that the stream is associated with.\n\n If the stream was created via the API ::cuGreenCtxStreamCreate, the returned context\n is equivalent to the one returned by ::cuCtxFromGreenCtx() on the green context\n associated with the stream at creation time.\n\n The stream handle \\p hStream can refer to any of the following:\n <ul>\n   <li>a stream created via any of the CUDA driver APIs such as ::cuStreamCreate\n   and ::cuStreamCreateWithPriority, or their runtime API equivalents such as\n   ::cudaStreamCreate, ::cudaStreamCreateWithFlags and ::cudaStreamCreateWithPriority.\n   The returned context is the context that was active in the calling thread when the\n   stream was created. Passing an invalid handle will result in undefined behavior.</li>\n   <li>any of the special streams such as the NULL stream, ::CU_STREAM_LEGACY and\n   ::CU_STREAM_PER_THREAD. The runtime API equivalents of these are also accepted,\n   which are NULL, ::cudaStreamLegacy and ::cudaStreamPerThread respectively.\n   Specifying any of the special handles will return the context current to the\n   calling thread. If no context is current to the calling thread,\n   ::CUDA_ERROR_INVALID_CONTEXT is returned.</li>\n </ul>\n\n \\param hStream - Handle to the stream to be queried\n \\param pctx    - Returned context associated with the stream\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_NOT_SUPPORTED\n \\notefnerr\n\n \\sa ::cuStreamDestroy,\n ::cuStreamCreateWithPriority,\n ::cuStreamGetPriority,\n ::cuStreamGetFlags,\n ::cuStreamGetDevice\n ::cuStreamWaitEvent,\n ::cuStreamQuery,\n ::cuStreamSynchronize,\n ::cuStreamAddCallback,\n ::cudaStreamCreate,\n ::cudaStreamCreateWithFlags*/\n    fn cuStreamGetCtx_ptsz(\n        hStream: cuda_types::cuda::CUstream,\n        pctx: *mut cuda_types::cuda::CUcontext,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Query the contexts associated with a stream\n\n Returns the contexts that the stream is associated with.\n\n If the stream is associated with a green context, the API returns the green context in \\p pGreenCtx\n and the primary context of the associated device in \\p pCtx.\n\n If the stream is associated with a regular context, the API returns the regular context in \\p pCtx\n and NULL in \\p pGreenCtx.\n\n The stream handle \\p hStream can refer to any of the following:\n <ul>\n   <li>a stream created via any of the CUDA driver APIs such as ::cuStreamCreate,\n   ::cuStreamCreateWithPriority and ::cuGreenCtxStreamCreate, or their runtime API equivalents such as\n   ::cudaStreamCreate, ::cudaStreamCreateWithFlags and ::cudaStreamCreateWithPriority.\n   Passing an invalid handle will result in undefined behavior.</li>\n   <li>any of the special streams such as the NULL stream, ::CU_STREAM_LEGACY and\n   ::CU_STREAM_PER_THREAD. The runtime API equivalents of these are also accepted,\n   which are NULL, ::cudaStreamLegacy and ::cudaStreamPerThread respectively.\n   If any of the special handles are specified, the API will operate on the context current to the\n   calling thread. If a green context (that was converted via ::cuCtxFromGreenCtx() before setting it current)\n   is current to the calling thread, the API will return the green context in \\p pGreenCtx\n   and the primary context of the associated device in \\p pCtx. If a regular context is current,\n   the API returns the regular context in \\p pCtx and NULL in \\p pGreenCtx.\n   Note that specifying ::CU_STREAM_PER_THREAD or ::cudaStreamPerThread will return ::CUDA_ERROR_INVALID_HANDLE\n   if a green context is current to the calling thread.\n   If no context is current to the calling thread, ::CUDA_ERROR_INVALID_CONTEXT is returned.</li>\n </ul>\n\n \\param hStream   - Handle to the stream to be queried\n \\param pCtx      - Returned regular context associated with the stream\n \\param pGreenCtx - Returned green context if the stream is associated with a green context or NULL if not\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE\n \\notefnerr\n\n \\sa ::cuStreamDestroy,\n ::cuStreamCreate\n ::cuStreamCreateWithPriority,\n ::cuGreenCtxStreamCreate,\n ::cuStreamGetPriority,\n ::cuStreamGetFlags,\n ::cuStreamGetDevice,\n ::cuStreamWaitEvent,\n ::cuStreamQuery,\n ::cuStreamSynchronize,\n ::cuStreamAddCallback,\n ::cudaStreamCreate,\n ::cudaStreamCreateWithFlags,*/\n    fn cuStreamGetCtx_v2_ptsz(\n        hStream: cuda_types::cuda::CUstream,\n        pCtx: *mut cuda_types::cuda::CUcontext,\n        pGreenCtx: *mut cuda_types::cuda::CUgreenCtx,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Make a compute stream wait on an event\n\n Makes all future work submitted to \\p hStream wait for all work captured in\n \\p hEvent.  See ::cuEventRecord() for details on what is captured by an event.\n The synchronization will be performed efficiently on the device when applicable.\n \\p hEvent may be from a different context or device than \\p hStream.\n\n flags include:\n - ::CU_EVENT_WAIT_DEFAULT: Default event creation flag.\n - ::CU_EVENT_WAIT_EXTERNAL: Event is captured in the graph as an external\n   event node when performing stream capture. This flag is invalid outside\n   of stream capture.\n\n \\param hStream - Stream to wait\n \\param hEvent  - Event to wait on (may not be NULL)\n \\param Flags   - See ::CUevent_capture_flags\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n \\note_null_stream\n \\notefnerr\n\n \\sa ::cuStreamCreate,\n ::cuEventRecord,\n ::cuStreamQuery,\n ::cuStreamSynchronize,\n ::cuStreamAddCallback,\n ::cuStreamDestroy,\n ::cudaStreamWaitEvent*/\n    fn cuStreamWaitEvent_ptsz(\n        hStream: cuda_types::cuda::CUstream,\n        hEvent: cuda_types::cuda::CUevent,\n        Flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Add a callback to a compute stream\n\n \\note This function is slated for eventual deprecation and removal. If\n you do not require the callback to execute in case of a device error,\n consider using ::cuLaunchHostFunc. Additionally, this function is not\n supported with ::cuStreamBeginCapture and ::cuStreamEndCapture, unlike\n ::cuLaunchHostFunc.\n\n Adds a callback to be called on the host after all currently enqueued\n items in the stream have completed.  For each\n cuStreamAddCallback call, the callback will be executed exactly once.\n The callback will block later work in the stream until it is finished.\n\n The callback may be passed ::CUDA_SUCCESS or an error code.  In the event\n of a device error, all subsequently executed callbacks will receive an\n appropriate ::CUresult.\n\n Callbacks must not make any CUDA API calls.  Attempting to use a CUDA API\n will result in ::CUDA_ERROR_NOT_PERMITTED.  Callbacks must not perform any\n synchronization that may depend on outstanding device work or other callbacks\n that are not mandated to run earlier.  Callbacks without a mandated order\n (in independent streams) execute in undefined order and may be serialized.\n\n For the purposes of Unified Memory, callback execution makes a number of\n guarantees:\n <ul>\n   <li>The callback stream is considered idle for the duration of the\n   callback.  Thus, for example, a callback may always use memory attached\n   to the callback stream.</li>\n   <li>The start of execution of a callback has the same effect as\n   synchronizing an event recorded in the same stream immediately prior to\n   the callback.  It thus synchronizes streams which have been \"joined\"\n   prior to the callback.</li>\n   <li>Adding device work to any stream does not have the effect of making\n   the stream active until all preceding host functions and stream callbacks\n   have executed.  Thus, for\n   example, a callback might use global attached memory even if work has\n   been added to another stream, if the work has been ordered behind the\n   callback with an event.</li>\n   <li>Completion of a callback does not cause a stream to become\n   active except as described above.  The callback stream will remain idle\n   if no device work follows the callback, and will remain idle across\n   consecutive callbacks without device work in between.  Thus, for example,\n   stream synchronization can be done by signaling from a callback at the\n   end of the stream.</li>\n </ul>\n\n \\param hStream  - Stream to add callback to\n \\param callback - The function to call once preceding stream operations are complete\n \\param userData - User specified data to be passed to the callback function\n \\param flags    - Reserved for future use, must be 0\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_NOT_SUPPORTED\n \\note_null_stream\n \\notefnerr\n\n \\sa ::cuStreamCreate,\n ::cuStreamQuery,\n ::cuStreamSynchronize,\n ::cuStreamWaitEvent,\n ::cuStreamDestroy,\n ::cuMemAllocManaged,\n ::cuStreamAttachMemAsync,\n ::cuLaunchHostFunc,\n ::cudaStreamAddCallback*/\n    fn cuStreamAddCallback_ptsz(\n        hStream: cuda_types::cuda::CUstream,\n        callback: cuda_types::cuda::CUstreamCallback,\n        userData: *mut ::core::ffi::c_void,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Begins graph capture on a stream\n\n Begin graph capture on \\p hStream. When a stream is in capture mode, all operations\n pushed into the stream will not be executed, but will instead be captured into\n a graph, which will be returned via ::cuStreamEndCapture. Capture may not be initiated\n if \\p stream is CU_STREAM_LEGACY. Capture must be ended on the same stream in which\n it was initiated, and it may only be initiated if the stream is not already in capture\n mode. The capture mode may be queried via ::cuStreamIsCapturing. A unique id\n representing the capture sequence may be queried via ::cuStreamGetCaptureInfo.\n\n If \\p mode is not ::CU_STREAM_CAPTURE_MODE_RELAXED, ::cuStreamEndCapture must be\n called on this stream from the same thread.\n\n \\param hStream - Stream in which to initiate capture\n \\param mode    - Controls the interaction of this capture sequence with other API\n                  calls that are potentially unsafe. For more details see\n                  ::cuThreadExchangeStreamCaptureMode.\n\n \\note Kernels captured using this API must not use texture and surface references.\n       Reading or writing through any texture or surface reference is undefined\n       behavior. This restriction does not apply to texture and surface objects.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa\n ::cuStreamCreate,\n ::cuStreamIsCapturing,\n ::cuStreamEndCapture,\n ::cuThreadExchangeStreamCaptureMode*/\n    fn cuStreamBeginCapture_v2_ptsz(\n        hStream: cuda_types::cuda::CUstream,\n        mode: cuda_types::cuda::CUstreamCaptureMode,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Begins graph capture on a stream to an existing graph\n\n Begin graph capture on \\p hStream, placing new nodes into an existing graph. When a stream is\n in capture mode, all operations pushed into the stream will not be executed, but will instead\n be captured into \\p hGraph. The graph will not be instantiable until the user calls\n ::cuStreamEndCapture.\n\n Capture may not be initiated if \\p stream is CU_STREAM_LEGACY. Capture must be ended on the\n same stream in which it was initiated, and it may only be initiated if the stream is not\n already in capture mode. The capture mode may be queried via ::cuStreamIsCapturing. A unique id\n representing the capture sequence may be queried via ::cuStreamGetCaptureInfo.\n\n If \\p mode is not ::CU_STREAM_CAPTURE_MODE_RELAXED, ::cuStreamEndCapture must be\n called on this stream from the same thread.\n\n \\param hStream         - Stream in which to initiate capture.\n \\param hGraph          - Graph to capture into.\n \\param dependencies    - Dependencies of the first node captured in the stream.  Can be NULL if numDependencies is 0.\n \\param dependencyData  - Optional array of data associated with each dependency.\n \\param numDependencies - Number of dependencies.\n \\param mode            - Controls the interaction of this capture sequence with other API\n                          calls that are potentially unsafe. For more details see\n                          ::cuThreadExchangeStreamCaptureMode.\n\n \\note Kernels captured using this API must not use texture and surface references.\n       Reading or writing through any texture or surface reference is undefined\n       behavior. This restriction does not apply to texture and surface objects.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa\n ::cuStreamBeginCapture,\n ::cuStreamCreate,\n ::cuStreamIsCapturing,\n ::cuStreamEndCapture,\n ::cuThreadExchangeStreamCaptureMode,\n ::cuGraphAddNode*/\n    fn cuStreamBeginCaptureToGraph_ptsz(\n        hStream: cuda_types::cuda::CUstream,\n        hGraph: cuda_types::cuda::CUgraph,\n        dependencies: *const cuda_types::cuda::CUgraphNode,\n        dependencyData: *const cuda_types::cuda::CUgraphEdgeData,\n        numDependencies: usize,\n        mode: cuda_types::cuda::CUstreamCaptureMode,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Swaps the stream capture interaction mode for a thread\n\n Sets the calling thread's stream capture interaction mode to the value contained\n in \\p *mode, and overwrites \\p *mode with the previous mode for the thread. To\n facilitate deterministic behavior across function or module boundaries, callers\n are encouraged to use this API in a push-pop fashion: \\code\nCUstreamCaptureMode mode = desiredMode;\ncuThreadExchangeStreamCaptureMode(&mode);\n...\ncuThreadExchangeStreamCaptureMode(&mode); // restore previous mode\n \\endcode\n\n During stream capture (see ::cuStreamBeginCapture), some actions, such as a call\n to ::cudaMalloc, may be unsafe. In the case of ::cudaMalloc, the operation is\n not enqueued asynchronously to a stream, and is not observed by stream capture.\n Therefore, if the sequence of operations captured via ::cuStreamBeginCapture\n depended on the allocation being replayed whenever the graph is launched, the\n captured graph would be invalid.\n\n Therefore, stream capture places restrictions on API calls that can be made within\n or concurrently to a ::cuStreamBeginCapture-::cuStreamEndCapture sequence. This\n behavior can be controlled via this API and flags to ::cuStreamBeginCapture.\n\n A thread's mode is one of the following:\n - \\p CU_STREAM_CAPTURE_MODE_GLOBAL: This is the default mode. If the local thread has\n   an ongoing capture sequence that was not initiated with\n   \\p CU_STREAM_CAPTURE_MODE_RELAXED at \\p cuStreamBeginCapture, or if any other thread\n   has a concurrent capture sequence initiated with \\p CU_STREAM_CAPTURE_MODE_GLOBAL,\n   this thread is prohibited from potentially unsafe API calls.\n - \\p CU_STREAM_CAPTURE_MODE_THREAD_LOCAL: If the local thread has an ongoing capture\n   sequence not initiated with \\p CU_STREAM_CAPTURE_MODE_RELAXED, it is prohibited\n   from potentially unsafe API calls. Concurrent capture sequences in other threads\n   are ignored.\n - \\p CU_STREAM_CAPTURE_MODE_RELAXED: The local thread is not prohibited from potentially\n   unsafe API calls. Note that the thread is still prohibited from API calls which\n   necessarily conflict with stream capture, for example, attempting ::cuEventQuery\n   on an event that was last recorded inside a capture sequence.\n\n \\param mode - Pointer to mode value to swap with the current mode\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa\n ::cuStreamBeginCapture*/\n    fn cuThreadExchangeStreamCaptureMode(\n        mode: *mut cuda_types::cuda::CUstreamCaptureMode,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Ends capture on a stream, returning the captured graph\n\n End capture on \\p hStream, returning the captured graph via \\p phGraph.\n Capture must have been initiated on \\p hStream via a call to ::cuStreamBeginCapture.\n If capture was invalidated, due to a violation of the rules of stream capture, then\n a NULL graph will be returned.\n\n If the \\p mode argument to ::cuStreamBeginCapture was not\n ::CU_STREAM_CAPTURE_MODE_RELAXED, this call must be from the same thread as\n ::cuStreamBeginCapture.\n\n \\param hStream - Stream to query\n \\param phGraph - The captured graph\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_STREAM_CAPTURE_WRONG_THREAD\n \\notefnerr\n\n \\sa\n ::cuStreamCreate,\n ::cuStreamBeginCapture,\n ::cuStreamIsCapturing,\n ::cuGraphDestroy*/\n    fn cuStreamEndCapture_ptsz(\n        hStream: cuda_types::cuda::CUstream,\n        phGraph: *mut cuda_types::cuda::CUgraph,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a stream's capture status\n\n Return the capture status of \\p hStream via \\p captureStatus. After a successful\n call, \\p *captureStatus will contain one of the following:\n - ::CU_STREAM_CAPTURE_STATUS_NONE: The stream is not capturing.\n - ::CU_STREAM_CAPTURE_STATUS_ACTIVE: The stream is capturing.\n - ::CU_STREAM_CAPTURE_STATUS_INVALIDATED: The stream was capturing but an error\n   has invalidated the capture sequence. The capture sequence must be terminated\n   with ::cuStreamEndCapture on the stream where it was initiated in order to\n   continue using \\p hStream.\n\n Note that, if this is called on ::CU_STREAM_LEGACY (the \"null stream\") while\n a blocking stream in the same context is capturing, it will return\n ::CUDA_ERROR_STREAM_CAPTURE_IMPLICIT and \\p *captureStatus is unspecified\n after the call. The blocking stream capture is not invalidated.\n\n When a blocking stream is capturing, the legacy stream is in an\n unusable state until the blocking stream capture is terminated. The legacy\n stream is not supported for stream capture, but attempted use would have an\n implicit dependency on the capturing stream(s).\n\n \\param hStream       - Stream to query\n \\param captureStatus - Returns the stream's capture status\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_STREAM_CAPTURE_IMPLICIT\n \\notefnerr\n\n \\sa\n ::cuStreamCreate,\n ::cuStreamBeginCapture,\n ::cuStreamEndCapture*/\n    fn cuStreamIsCapturing_ptsz(\n        hStream: cuda_types::cuda::CUstream,\n        captureStatus: *mut cuda_types::cuda::CUstreamCaptureStatus,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Query a stream's capture state\n\n Query stream state related to stream capture.\n\n If called on ::CU_STREAM_LEGACY (the \"null stream\") while a stream not created\n with ::CU_STREAM_NON_BLOCKING is capturing, returns ::CUDA_ERROR_STREAM_CAPTURE_IMPLICIT.\n\n Valid data (other than capture status) is returned only if both of the following are true:\n - the call returns CUDA_SUCCESS\n - the returned capture status is ::CU_STREAM_CAPTURE_STATUS_ACTIVE\n\n If \\p edgeData_out is non-NULL then \\p dependencies_out must be as well. If\n \\p dependencies_out is non-NULL and \\p edgeData_out is NULL, but there is non-zero edge\n data for one or more of the current stream dependencies, the call will return\n ::CUDA_ERROR_LOSSY_QUERY.\n\n \\param hStream - The stream to query\n \\param captureStatus_out - Location to return the capture status of the stream; required\n \\param id_out - Optional location to return an id for the capture sequence, which is\n           unique over the lifetime of the process\n \\param graph_out - Optional location to return the graph being captured into. All\n           operations other than destroy and node removal are permitted on the graph\n           while the capture sequence is in progress. This API does not transfer\n           ownership of the graph, which is transferred or destroyed at\n           ::cuStreamEndCapture. Note that the graph handle may be invalidated before\n           end of capture for certain errors. Nodes that are or become\n           unreachable from the original stream at ::cuStreamEndCapture due to direct\n           actions on the graph do not trigger ::CUDA_ERROR_STREAM_CAPTURE_UNJOINED.\n \\param dependencies_out - Optional location to store a pointer to an array of nodes.\n           The next node to be captured in the stream will depend on this set of nodes,\n           absent operations such as event wait which modify this set. The array pointer\n           is valid until the next API call which operates on the stream or until the\n           capture is terminated. The node handles may be copied out and are valid until\n           they or the graph is destroyed. The driver-owned array may also be passed\n           directly to APIs that operate on the graph (not the stream) without copying.\n \\param edgeData_out - Optional location to store a pointer to an array of graph edge\n           data. This array parallels \\c dependencies_out; the next node to be added\n           has an edge to \\c dependencies_out[i] with annotation \\c edgeData_out[i] for\n           each \\c i. The array pointer is valid until the next API call which operates\n           on the stream or until the capture is terminated.\n \\param numDependencies_out - Optional location to store the size of the array\n           returned in dependencies_out.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_STREAM_CAPTURE_IMPLICIT,\n ::CUDA_ERROR_LOSSY_QUERY\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuStreamBeginCapture,\n ::cuStreamIsCapturing,\n ::cuStreamUpdateCaptureDependencies*/\n    fn cuStreamGetCaptureInfo_v3_ptsz(\n        hStream: cuda_types::cuda::CUstream,\n        captureStatus_out: *mut cuda_types::cuda::CUstreamCaptureStatus,\n        id_out: *mut cuda_types::cuda::cuuint64_t,\n        graph_out: *mut cuda_types::cuda::CUgraph,\n        dependencies_out: *mut *const cuda_types::cuda::CUgraphNode,\n        edgeData_out: *mut *const cuda_types::cuda::CUgraphEdgeData,\n        numDependencies_out: *mut usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Update the set of dependencies in a capturing stream\n\n Modifies the dependency set of a capturing stream. The dependency set is the set\n of nodes that the next captured node in the stream will depend on along with the\n edge data for those dependencies.\n\n Valid flags are ::CU_STREAM_ADD_CAPTURE_DEPENDENCIES and\n ::CU_STREAM_SET_CAPTURE_DEPENDENCIES. These control whether the set passed to\n the API is added to the existing set or replaces it. A flags value of 0 defaults\n to ::CU_STREAM_ADD_CAPTURE_DEPENDENCIES.\n\n Nodes that are removed from the dependency set via this API do not result in\n ::CUDA_ERROR_STREAM_CAPTURE_UNJOINED if they are unreachable from the stream at\n ::cuStreamEndCapture.\n\n Returns ::CUDA_ERROR_ILLEGAL_STATE if the stream is not capturing.\n\n \\param hStream - The stream to update\n \\param dependencies - The set of dependencies to add\n \\param dependencyData - Optional array of data associated with each dependency.\n \\param numDependencies - The size of the dependencies array\n \\param flags - See above\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_ILLEGAL_STATE\n\n \\sa\n ::cuStreamBeginCapture,\n ::cuStreamGetCaptureInfo*/\n    fn cuStreamUpdateCaptureDependencies_v2_ptsz(\n        hStream: cuda_types::cuda::CUstream,\n        dependencies: *mut cuda_types::cuda::CUgraphNode,\n        dependencyData: *const cuda_types::cuda::CUgraphEdgeData,\n        numDependencies: usize,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Attach memory to a stream asynchronously\n\n Enqueues an operation in \\p hStream to specify stream association of\n \\p length bytes of memory starting from \\p dptr. This function is a\n stream-ordered operation, meaning that it is dependent on, and will\n only take effect when, previous work in stream has completed. Any\n previous association is automatically replaced.\n\n \\p dptr must point to one of the following types of memories:\n - managed memory declared using the __managed__ keyword or allocated with\n   ::cuMemAllocManaged.\n - a valid host-accessible region of system-allocated pageable memory. This\n   type of memory may only be specified if the device associated with the\n   stream reports a non-zero value for the device attribute\n   ::CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS.\n\n For managed allocations, \\p length must be either zero or the entire\n allocation's size. Both indicate that the entire allocation's stream\n association is being changed. Currently, it is not possible to change stream\n association for a portion of a managed allocation.\n\n For pageable host allocations, \\p length must be non-zero.\n\n The stream association is specified using \\p flags which must be\n one of ::CUmemAttach_flags.\n If the ::CU_MEM_ATTACH_GLOBAL flag is specified, the memory can be accessed\n by any stream on any device.\n If the ::CU_MEM_ATTACH_HOST flag is specified, the program makes a guarantee\n that it won't access the memory on the device from any stream on a device that\n has a zero value for the device attribute ::CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS.\n If the ::CU_MEM_ATTACH_SINGLE flag is specified and \\p hStream is associated with\n a device that has a zero value for the device attribute ::CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS,\n the program makes a guarantee that it will only access the memory on the device\n from \\p hStream. It is illegal to attach singly to the NULL stream, because the\n NULL stream is a virtual global stream and not a specific stream. An error will\n be returned in this case.\n\n When memory is associated with a single stream, the Unified Memory system will\n allow CPU access to this memory region so long as all operations in \\p hStream\n have completed, regardless of whether other streams are active. In effect,\n this constrains exclusive ownership of the managed memory region by\n an active GPU to per-stream activity instead of whole-GPU activity.\n\n Accessing memory on the device from streams that are not associated with\n it will produce undefined results. No error checking is performed by the\n Unified Memory system to ensure that kernels launched into other streams\n do not access this region.\n\n It is a program's responsibility to order calls to ::cuStreamAttachMemAsync\n via events, synchronization or other means to ensure legal access to memory\n at all times. Data visibility and coherency will be changed appropriately\n for all kernels which follow a stream-association change.\n\n If \\p hStream is destroyed while data is associated with it, the association is\n removed and the association reverts to the default visibility of the allocation\n as specified at ::cuMemAllocManaged. For __managed__ variables, the default\n association is always ::CU_MEM_ATTACH_GLOBAL. Note that destroying a stream is an\n asynchronous operation, and as a result, the change to default association won't\n happen until all work in the stream has completed.\n\n \\param hStream - Stream in which to enqueue the attach operation\n \\param dptr    - Pointer to memory (must be a pointer to managed memory or\n                  to a valid host-accessible region of system-allocated\n                  pageable memory)\n \\param length  - Length of memory\n \\param flags   - Must be one of ::CUmemAttach_flags\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_NOT_SUPPORTED\n \\note_null_stream\n \\notefnerr\n\n \\sa ::cuStreamCreate,\n ::cuStreamQuery,\n ::cuStreamSynchronize,\n ::cuStreamWaitEvent,\n ::cuStreamDestroy,\n ::cuMemAllocManaged,\n ::cudaStreamAttachMemAsync*/\n    fn cuStreamAttachMemAsync_ptsz(\n        hStream: cuda_types::cuda::CUstream,\n        dptr: cuda_types::cuda::CUdeviceptr,\n        length: usize,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Determine status of a compute stream\n\n Returns ::CUDA_SUCCESS if all operations in the stream specified by\n \\p hStream have completed, or ::CUDA_ERROR_NOT_READY if not.\n\n For the purposes of Unified Memory, a return value of ::CUDA_SUCCESS\n is equivalent to having called ::cuStreamSynchronize().\n\n \\param hStream - Stream to query status of\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_NOT_READY\n \\note_null_stream\n \\notefnerr\n\n \\sa ::cuStreamCreate,\n ::cuStreamWaitEvent,\n ::cuStreamDestroy,\n ::cuStreamSynchronize,\n ::cuStreamAddCallback,\n ::cudaStreamQuery*/\n    fn cuStreamQuery_ptsz(\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Wait until a stream's tasks are completed\n\n Waits until the device has completed all operations in the stream specified\n by \\p hStream. If the context was created with the\n ::CU_CTX_SCHED_BLOCKING_SYNC flag, the CPU thread will block until the\n stream is finished with all of its tasks.\n\n \\param hStream - Stream to wait for\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE\n\n \\note_null_stream\n \\notefnerr\n\n \\sa ::cuStreamCreate,\n ::cuStreamDestroy,\n ::cuStreamWaitEvent,\n ::cuStreamQuery,\n ::cuStreamAddCallback,\n ::cudaStreamSynchronize*/\n    fn cuStreamSynchronize_ptsz(\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Destroys a stream\n\n Destroys the stream specified by \\p hStream.\n\n In case the device is still doing work in the stream \\p hStream\n when ::cuStreamDestroy() is called, the function will return immediately\n and the resources associated with \\p hStream will be released automatically\n once the device has completed all work in \\p hStream.\n\n \\param hStream - Stream to destroy\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE\n \\notefnerr\n\n \\sa ::cuStreamCreate,\n ::cuStreamWaitEvent,\n ::cuStreamQuery,\n ::cuStreamSynchronize,\n ::cuStreamAddCallback,\n ::cudaStreamDestroy*/\n    fn cuStreamDestroy_v2(\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Copies attributes from source stream to destination stream.\n\n Copies attributes from source stream \\p src to destination stream \\p dst.\n Both streams must have the same context.\n\n \\param[out] dst Destination stream\n \\param[in] src Source stream\n For list of attributes see ::CUstreamAttrID\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa\n ::CUaccessPolicyWindow*/\n    fn cuStreamCopyAttributes_ptsz(\n        dst: cuda_types::cuda::CUstream,\n        src: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Queries stream attribute.\n\n Queries attribute \\p attr from \\p hStream and stores it in corresponding\n member of \\p value_out.\n\n \\param[in] hStream\n \\param[in] attr\n \\param[out] value_out\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE\n \\notefnerr\n\n \\sa\n ::CUaccessPolicyWindow*/\n    fn cuStreamGetAttribute_ptsz(\n        hStream: cuda_types::cuda::CUstream,\n        attr: cuda_types::cuda::CUstreamAttrID,\n        value_out: *mut cuda_types::cuda::CUstreamAttrValue,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets stream attribute.\n\n Sets attribute \\p attr on \\p hStream from corresponding attribute of\n \\p value. The updated attribute will be applied to subsequent work\n submitted to the stream. It will not affect previously submitted work.\n\n \\param[out] hStream\n \\param[in] attr\n \\param[in] value\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE\n \\notefnerr\n\n \\sa\n ::CUaccessPolicyWindow*/\n    fn cuStreamSetAttribute_ptsz(\n        hStream: cuda_types::cuda::CUstream,\n        attr: cuda_types::cuda::CUstreamAttrID,\n        value: *const cuda_types::cuda::CUstreamAttrValue,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Creates an event\n\n Creates an event *phEvent for the current context with the flags specified via\n \\p Flags. Valid flags include:\n - ::CU_EVENT_DEFAULT: Default event creation flag.\n - ::CU_EVENT_BLOCKING_SYNC: Specifies that the created event should use blocking\n   synchronization.  A CPU thread that uses ::cuEventSynchronize() to wait on\n   an event created with this flag will block until the event has actually\n   been recorded.\n - ::CU_EVENT_DISABLE_TIMING: Specifies that the created event does not need\n   to record timing data.  Events created with this flag specified and\n   the ::CU_EVENT_BLOCKING_SYNC flag not specified will provide the best\n   performance when used with ::cuStreamWaitEvent() and ::cuEventQuery().\n - ::CU_EVENT_INTERPROCESS: Specifies that the created event may be used as an\n   interprocess event by ::cuIpcGetEventHandle(). ::CU_EVENT_INTERPROCESS must\n   be specified along with ::CU_EVENT_DISABLE_TIMING.\n\n \\param phEvent - Returns newly created event\n \\param Flags   - Event creation flags\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_OUT_OF_MEMORY\n \\notefnerr\n\n \\sa\n ::cuEventRecord,\n ::cuEventQuery,\n ::cuEventSynchronize,\n ::cuEventDestroy,\n ::cuEventElapsedTime,\n ::cudaEventCreate,\n ::cudaEventCreateWithFlags*/\n    fn cuEventCreate(\n        phEvent: *mut cuda_types::cuda::CUevent,\n        Flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Records an event\n\n Captures in \\p hEvent the contents of \\p hStream at the time of this call.\n \\p hEvent and \\p hStream must be from the same context otherwise\n ::CUDA_ERROR_INVALID_HANDLE is returned.\n Calls such as ::cuEventQuery() or ::cuStreamWaitEvent() will then\n examine or wait for completion of the work that was captured. Uses of\n \\p hStream after this call do not modify \\p hEvent. See note on default\n stream behavior for what is captured in the default case.\n\n ::cuEventRecord() can be called multiple times on the same event and\n will overwrite the previously captured state. Other APIs such as\n ::cuStreamWaitEvent() use the most recently captured state at the time\n of the API call, and are not affected by later calls to\n ::cuEventRecord(). Before the first call to ::cuEventRecord(), an\n event represents an empty set of work, so for example ::cuEventQuery()\n would return ::CUDA_SUCCESS.\n\n \\param hEvent  - Event to record\n \\param hStream - Stream to record event for\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_null_stream\n \\notefnerr\n\n \\sa ::cuEventCreate,\n ::cuEventQuery,\n ::cuEventSynchronize,\n ::cuStreamWaitEvent,\n ::cuEventDestroy,\n ::cuEventElapsedTime,\n ::cudaEventRecord,\n ::cuEventRecordWithFlags*/\n    fn cuEventRecord_ptsz(\n        hEvent: cuda_types::cuda::CUevent,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Records an event\n\n Captures in \\p hEvent the contents of \\p hStream at the time of this call.\n \\p hEvent and \\p hStream must be from the same context otherwise\n ::CUDA_ERROR_INVALID_HANDLE is returned.\n Calls such as ::cuEventQuery() or ::cuStreamWaitEvent() will then\n examine or wait for completion of the work that was captured. Uses of\n \\p hStream after this call do not modify \\p hEvent. See note on default\n stream behavior for what is captured in the default case.\n\n ::cuEventRecordWithFlags() can be called multiple times on the same event and\n will overwrite the previously captured state. Other APIs such as\n ::cuStreamWaitEvent() use the most recently captured state at the time\n of the API call, and are not affected by later calls to\n ::cuEventRecordWithFlags(). Before the first call to ::cuEventRecordWithFlags(), an\n event represents an empty set of work, so for example ::cuEventQuery()\n would return ::CUDA_SUCCESS.\n\n flags include:\n - ::CU_EVENT_RECORD_DEFAULT: Default event creation flag.\n - ::CU_EVENT_RECORD_EXTERNAL: Event is captured in the graph as an external\n   event node when performing stream capture. This flag is invalid outside\n   of stream capture.\n\n \\param hEvent  - Event to record\n \\param hStream - Stream to record event for\n \\param flags   - See ::CUevent_capture_flags\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_null_stream\n \\notefnerr\n\n \\sa ::cuEventCreate,\n ::cuEventQuery,\n ::cuEventSynchronize,\n ::cuStreamWaitEvent,\n ::cuEventDestroy,\n ::cuEventElapsedTime,\n ::cuEventRecord,\n ::cudaEventRecord*/\n    fn cuEventRecordWithFlags_ptsz(\n        hEvent: cuda_types::cuda::CUevent,\n        hStream: cuda_types::cuda::CUstream,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Queries an event's status\n\n Queries the status of all work currently captured by \\p hEvent. See\n ::cuEventRecord() for details on what is captured by an event.\n\n Returns ::CUDA_SUCCESS if all captured work has been completed, or\n ::CUDA_ERROR_NOT_READY if any captured work is incomplete.\n\n For the purposes of Unified Memory, a return value of ::CUDA_SUCCESS\n is equivalent to having called ::cuEventSynchronize().\n\n \\param hEvent - Event to query\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_READY\n \\notefnerr\n\n \\sa ::cuEventCreate,\n ::cuEventRecord,\n ::cuEventSynchronize,\n ::cuEventDestroy,\n ::cuEventElapsedTime,\n ::cudaEventQuery*/\n    fn cuEventQuery(hEvent: cuda_types::cuda::CUevent) -> cuda_types::cuda::CUresult;\n    /** \\brief Waits for an event to complete\n\n Waits until the completion of all work currently captured in \\p hEvent.\n See ::cuEventRecord() for details on what is captured by an event.\n\n Waiting for an event that was created with the ::CU_EVENT_BLOCKING_SYNC\n flag will cause the calling CPU thread to block until the event has\n been completed by the device.  If the ::CU_EVENT_BLOCKING_SYNC flag has\n not been set, then the CPU thread will busy-wait until the event has\n been completed by the device.\n\n \\param hEvent - Event to wait for\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE\n \\notefnerr\n\n \\sa ::cuEventCreate,\n ::cuEventRecord,\n ::cuEventQuery,\n ::cuEventDestroy,\n ::cuEventElapsedTime,\n ::cudaEventSynchronize*/\n    fn cuEventSynchronize(\n        hEvent: cuda_types::cuda::CUevent,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Destroys an event\n\n Destroys the event specified by \\p hEvent.\n\n An event may be destroyed before it is complete (i.e., while\n ::cuEventQuery() would return ::CUDA_ERROR_NOT_READY). In this case, the\n call does not block on completion of the event, and any associated\n resources will automatically be released asynchronously at completion.\n\n \\param hEvent - Event to destroy\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE\n \\notefnerr\n\n \\sa ::cuEventCreate,\n ::cuEventRecord,\n ::cuEventQuery,\n ::cuEventSynchronize,\n ::cuEventElapsedTime,\n ::cudaEventDestroy*/\n    fn cuEventDestroy_v2(\n        hEvent: cuda_types::cuda::CUevent,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Computes the elapsed time between two events\n\n Computes the elapsed time between two events (in milliseconds with a\n resolution of around 0.5 microseconds). Note this API is not guaranteed\n to return the latest errors for pending work. As such this API is intended to\n serve as an elapsed time calculation only and any polling for completion on the\n events to be compared should be done with ::cuEventQuery instead.\n\n If either event was last recorded in a non-NULL stream, the resulting time\n may be greater than expected (even if both used the same stream handle). This\n happens because the ::cuEventRecord() operation takes place asynchronously\n and there is no guarantee that the measured latency is actually just between\n the two events. Any number of other different stream operations could execute\n in between the two measured events, thus altering the timing in a significant\n way.\n\n If ::cuEventRecord() has not been called on either event then\n ::CUDA_ERROR_INVALID_HANDLE is returned. If ::cuEventRecord() has been called\n on both events but one or both of them has not yet been completed (that is,\n ::cuEventQuery() would return ::CUDA_ERROR_NOT_READY on at least one of the\n events), ::CUDA_ERROR_NOT_READY is returned. If either event was created with\n the ::CU_EVENT_DISABLE_TIMING flag, then this function will return\n ::CUDA_ERROR_INVALID_HANDLE.\n\n \\param pMilliseconds - Time between \\p hStart and \\p hEnd in ms\n \\param hStart        - Starting event\n \\param hEnd          - Ending event\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_NOT_READY,\n ::CUDA_ERROR_UNKNOWN\n \\notefnerr\n\n \\sa ::cuEventCreate,\n ::cuEventRecord,\n ::cuEventQuery,\n ::cuEventSynchronize,\n ::cuEventDestroy,\n ::cudaEventElapsedTime*/\n    fn cuEventElapsedTime_v2(\n        pMilliseconds: *mut f32,\n        hStart: cuda_types::cuda::CUevent,\n        hEnd: cuda_types::cuda::CUevent,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Imports an external memory object\n\n Imports an externally allocated memory object and returns\n a handle to that in \\p extMem_out.\n\n The properties of the handle being imported must be described in\n \\p memHandleDesc. The ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC structure\n is defined as follows:\n\n \\code\ntypedef struct CUDA_EXTERNAL_MEMORY_HANDLE_DESC_st {\nCUexternalMemoryHandleType type;\nunion {\nint fd;\nstruct {\nvoid *handle;\nconst void *name;\n} win32;\nconst void *nvSciBufObject;\n} handle;\nunsigned long long size;\nunsigned int flags;\n} CUDA_EXTERNAL_MEMORY_HANDLE_DESC;\n \\endcode\n\n where ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::type specifies the type\n of handle being imported. ::CUexternalMemoryHandleType is\n defined as:\n\n \\code\ntypedef enum CUexternalMemoryHandleType_enum {\nCU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD          = 1,\nCU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32       = 2,\nCU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT   = 3,\nCU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP         = 4,\nCU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE     = 5,\nCU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE     = 6,\nCU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE_KMT = 7,\nCU_EXTERNAL_MEMORY_HANDLE_TYPE_NVSCIBUF           = 8,\nCU_EXTERNAL_MEMORY_HANDLE_TYPE_DMABUF_FD          = 9\n} CUexternalMemoryHandleType;\n \\endcode\n\n If ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::type is\n ::CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD, then\n ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::fd must be a valid\n file descriptor referencing a memory object. Ownership of\n the file descriptor is transferred to the CUDA driver when the\n handle is imported successfully. Performing any operations on the\n file descriptor after it is imported results in undefined behavior.\n\n If ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::type is\n ::CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32, then exactly one\n of ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::handle and\n ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::name must not be\n NULL. If ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::handle\n is not NULL, then it must represent a valid shared NT handle that\n references a memory object. Ownership of this handle is\n not transferred to CUDA after the import operation, so the\n application must release the handle using the appropriate system\n call. If ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::name\n is not NULL, then it must point to a NULL-terminated array of\n UTF-16 characters that refers to a memory object.\n\n If ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::type is\n ::CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT, then\n ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::handle must\n be non-NULL and\n ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::name\n must be NULL. The handle specified must be a globally shared KMT\n handle. This handle does not hold a reference to the underlying\n object, and thus will be invalid when all references to the\n memory object are destroyed.\n\n If ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::type is\n ::CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP, then exactly one\n of ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::handle and\n ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::name must not be\n NULL. If ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::handle\n is not NULL, then it must represent a valid shared NT handle that\n is returned by ID3D12Device::CreateSharedHandle when referring to a\n ID3D12Heap object. This handle holds a reference to the underlying\n object. If ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::name\n is not NULL, then it must point to a NULL-terminated array of\n UTF-16 characters that refers to a ID3D12Heap object.\n\n If ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::type is\n ::CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE, then exactly one\n of ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::handle and\n ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::name must not be\n NULL. If ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::handle\n is not NULL, then it must represent a valid shared NT handle that\n is returned by ID3D12Device::CreateSharedHandle when referring to a\n ID3D12Resource object. This handle holds a reference to the\n underlying object. If\n ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::name\n is not NULL, then it must point to a NULL-terminated array of\n UTF-16 characters that refers to a ID3D12Resource object.\n\n If ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::type is\n ::CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE, then\n ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::handle must\n represent a valid shared NT handle that is returned by\n IDXGIResource1::CreateSharedHandle when referring to a\n ID3D11Resource object. If\n ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::name\n is not NULL, then it must point to a NULL-terminated array of\n UTF-16 characters that refers to a ID3D11Resource object.\n\n If ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::type is\n ::CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE_KMT, then\n ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::handle must\n represent a valid shared KMT handle that is returned by\n IDXGIResource::GetSharedHandle when referring to a\n ID3D11Resource object and\n ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::win32::name\n must be NULL.\n\n If ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::type is\n ::CU_EXTERNAL_MEMORY_HANDLE_TYPE_NVSCIBUF, then\n ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::nvSciBufObject must be non-NULL\n and reference a valid NvSciBuf object.\n If the NvSciBuf object imported into CUDA is also mapped by other drivers, then the\n application must use ::cuWaitExternalSemaphoresAsync or ::cuSignalExternalSemaphoresAsync\n as appropriate barriers to maintain coherence between CUDA and the other drivers.\n See ::CUDA_EXTERNAL_SEMAPHORE_SIGNAL_SKIP_NVSCIBUF_MEMSYNC and ::CUDA_EXTERNAL_SEMAPHORE_WAIT_SKIP_NVSCIBUF_MEMSYNC\n for memory synchronization.\n\n If ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::type is\n ::CU_EXTERNAL_MEMORY_HANDLE_TYPE_DMABUF_FD, then\n ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::handle::fd must be a valid\n file descriptor referencing a dma_buf object and\n ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::flags must be zero. Importing\n a dma_buf object is supported only on Tegra Jetson platform starting\n with Thor series. Mapping an imported dma_buf object as CUDA\n mipmapped array using ::cuExternalMemoryGetMappedMipmappedArray\n is not supported.\n\n The size of the memory object must be specified in\n ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::size.\n\n Specifying the flag ::CUDA_EXTERNAL_MEMORY_DEDICATED in\n ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::flags indicates that the\n resource is a dedicated resource. The definition of what a\n dedicated resource is outside the scope of this extension.\n This flag must be set if ::CUDA_EXTERNAL_MEMORY_HANDLE_DESC::type\n is one of the following:\n ::CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE\n ::CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE\n ::CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE_KMT\n\n \\param extMem_out    - Returned handle to an external memory object\n \\param memHandleDesc - Memory import handle descriptor\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_OPERATING_SYSTEM\n \\notefnerr\n\n \\note If the Vulkan memory imported into CUDA is mapped on the CPU then the\n application must use vkInvalidateMappedMemoryRanges/vkFlushMappedMemoryRanges\n as well as appropriate Vulkan pipeline barriers to maintain coherence between\n CPU and GPU. For more information on these APIs, please refer to \"Synchronization\n and Cache Control\" chapter from Vulkan specification.\n\n \\sa ::cuDestroyExternalMemory,\n ::cuExternalMemoryGetMappedBuffer,\n ::cuExternalMemoryGetMappedMipmappedArray*/\n    fn cuImportExternalMemory(\n        extMem_out: *mut cuda_types::cuda::CUexternalMemory,\n        memHandleDesc: *const cuda_types::cuda::CUDA_EXTERNAL_MEMORY_HANDLE_DESC,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Maps a buffer onto an imported memory object\n\n Maps a buffer onto an imported memory object and returns a device\n pointer in \\p devPtr.\n\n The properties of the buffer being mapped must be described in\n \\p bufferDesc. The ::CUDA_EXTERNAL_MEMORY_BUFFER_DESC structure is\n defined as follows:\n\n \\code\ntypedef struct CUDA_EXTERNAL_MEMORY_BUFFER_DESC_st {\nunsigned long long offset;\nunsigned long long size;\nunsigned int flags;\n} CUDA_EXTERNAL_MEMORY_BUFFER_DESC;\n \\endcode\n\n where ::CUDA_EXTERNAL_MEMORY_BUFFER_DESC::offset is the offset in\n the memory object where the buffer's base address is.\n ::CUDA_EXTERNAL_MEMORY_BUFFER_DESC::size is the size of the buffer.\n ::CUDA_EXTERNAL_MEMORY_BUFFER_DESC::flags must be zero.\n\n The offset and size have to be suitably aligned to match the\n requirements of the external API. Mapping two buffers whose ranges\n overlap may or may not result in the same virtual address being\n returned for the overlapped portion. In such cases, the application\n must ensure that all accesses to that region from the GPU are\n volatile. Otherwise writes made via one address are not guaranteed\n to be visible via the other address, even if they're issued by the\n same thread. It is recommended that applications map the combined\n range instead of mapping separate buffers and then apply the\n appropriate offsets to the returned pointer to derive the\n individual buffers.\n\n The returned pointer \\p devPtr must be freed using ::cuMemFree.\n\n \\param devPtr     - Returned device pointer to buffer\n \\param extMem     - Handle to external memory object\n \\param bufferDesc - Buffer descriptor\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE\n \\notefnerr\n\n \\sa ::cuImportExternalMemory,\n ::cuDestroyExternalMemory,\n ::cuExternalMemoryGetMappedMipmappedArray*/\n    fn cuExternalMemoryGetMappedBuffer(\n        devPtr: *mut cuda_types::cuda::CUdeviceptr,\n        extMem: cuda_types::cuda::CUexternalMemory,\n        bufferDesc: *const cuda_types::cuda::CUDA_EXTERNAL_MEMORY_BUFFER_DESC,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Maps a CUDA mipmapped array onto an external memory object\n\n Maps a CUDA mipmapped array onto an external object and returns a\n handle to it in \\p mipmap.\n\n The properties of the CUDA mipmapped array being mapped must be\n described in \\p mipmapDesc. The structure\n ::CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC is defined as follows:\n\n \\code\ntypedef struct CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC_st {\nunsigned long long offset;\nCUDA_ARRAY3D_DESCRIPTOR arrayDesc;\nunsigned int numLevels;\n} CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC;\n \\endcode\n\n where ::CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC::offset is the\n offset in the memory object where the base level of the mipmap\n chain is.\n ::CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC::arrayDesc describes\n the format, dimensions and type of the base level of the mipmap\n chain. For further details on these parameters, please refer to the\n documentation for ::cuMipmappedArrayCreate. Note that if the mipmapped\n array is bound as a color target in the graphics API, then the flag\n ::CUDA_ARRAY3D_COLOR_ATTACHMENT must be specified in\n ::CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC::arrayDesc::Flags.\n ::CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC::numLevels specifies\n the total number of levels in the mipmap chain.\n\n If \\p extMem was imported from a handle of type ::CU_EXTERNAL_MEMORY_HANDLE_TYPE_NVSCIBUF, then\n ::CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC::numLevels must be equal to 1.\n\n Mapping \\p extMem imported from a handle of type\n ::CU_EXTERNAL_MEMORY_HANDLE_TYPE_DMABUF_FD, is not supported.\n\n The returned CUDA mipmapped array must be freed using ::cuMipmappedArrayDestroy.\n\n \\param mipmap     - Returned CUDA mipmapped array\n \\param extMem     - Handle to external memory object\n \\param mipmapDesc - CUDA array descriptor\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE\n \\notefnerr\n\n \\sa ::cuImportExternalMemory,\n ::cuDestroyExternalMemory,\n ::cuExternalMemoryGetMappedBuffer*/\n    fn cuExternalMemoryGetMappedMipmappedArray(\n        mipmap: *mut cuda_types::cuda::CUmipmappedArray,\n        extMem: cuda_types::cuda::CUexternalMemory,\n        mipmapDesc: *const cuda_types::cuda::CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Destroys an external memory object.\n\n Destroys the specified external memory object. Any existing buffers\n and CUDA mipmapped arrays mapped onto this object must no longer be\n used and must be explicitly freed using ::cuMemFree and\n ::cuMipmappedArrayDestroy respectively.\n\n \\param extMem - External memory object to be destroyed\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_HANDLE\n \\notefnerr\n\n \\sa ::cuImportExternalMemory,\n ::cuExternalMemoryGetMappedBuffer,\n ::cuExternalMemoryGetMappedMipmappedArray*/\n    fn cuDestroyExternalMemory(\n        extMem: cuda_types::cuda::CUexternalMemory,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Imports an external semaphore\n\n Imports an externally allocated synchronization object and returns\n a handle to that in \\p extSem_out.\n\n The properties of the handle being imported must be described in\n \\p semHandleDesc. The ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC is\n defined as follows:\n\n \\code\ntypedef struct CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_st {\nCUexternalSemaphoreHandleType type;\nunion {\nint fd;\nstruct {\nvoid *handle;\nconst void *name;\n} win32;\nconst void* NvSciSyncObj;\n} handle;\nunsigned int flags;\n} CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC;\n \\endcode\n\n where ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::type specifies the type of\n handle being imported. ::CUexternalSemaphoreHandleType is defined\n as:\n\n \\code\ntypedef enum CUexternalSemaphoreHandleType_enum {\nCU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD                = 1,\nCU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32             = 2,\nCU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT         = 3,\nCU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE              = 4,\nCU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE              = 5,\nCU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_NVSCISYNC                = 6,\nCU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX        = 7,\nCU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX_KMT    = 8,\nCU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TIMELINE_SEMAPHORE_FD    = 9,\nCU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TIMELINE_SEMAPHORE_WIN32 = 10\n} CUexternalSemaphoreHandleType;\n \\endcode\n\n If ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::type is\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD, then\n ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::fd must be a valid\n file descriptor referencing a synchronization object. Ownership of\n the file descriptor is transferred to the CUDA driver when the\n handle is imported successfully. Performing any operations on the\n file descriptor after it is imported results in undefined behavior.\n\n If ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::type is\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32, then exactly one\n of ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::handle and\n ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::name must not be\n NULL. If\n ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::handle\n is not NULL, then it must represent a valid shared NT handle that\n references a synchronization object. Ownership of this handle is\n not transferred to CUDA after the import operation, so the\n application must release the handle using the appropriate system\n call. If ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::name\n is not NULL, then it must name a valid synchronization object.\n\n If ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::type is\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT, then\n ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::handle must\n be non-NULL and\n ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::name\n must be NULL. The handle specified must be a globally shared KMT\n handle. This handle does not hold a reference to the underlying\n object, and thus will be invalid when all references to the\n synchronization object are destroyed.\n\n If ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::type is\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE, then exactly one\n of ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::handle and\n ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::name must not be\n NULL. If\n ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::handle\n is not NULL, then it must represent a valid shared NT handle that\n is returned by ID3D12Device::CreateSharedHandle when referring to a\n ID3D12Fence object. This handle holds a reference to the underlying\n object. If\n ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::name\n is not NULL, then it must name a valid synchronization object that\n refers to a valid ID3D12Fence object.\n\n If ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::type is\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE, then\n ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::handle\n represents a valid shared NT handle that is returned by\n ID3D11Fence::CreateSharedHandle. If\n ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::name\n is not NULL, then it must name a valid synchronization object that\n refers to a valid ID3D11Fence object.\n\n If ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::type is\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_NVSCISYNC, then\n ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::nvSciSyncObj\n represents a valid NvSciSyncObj.\n\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX, then\n ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::handle\n represents a valid shared NT handle that\n is returned by IDXGIResource1::CreateSharedHandle when referring to\n a IDXGIKeyedMutex object. If\n ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::name\n is not NULL, then it must name a valid synchronization object that\n refers to a valid IDXGIKeyedMutex object.\n\n If ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::type is\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX_KMT, then\n ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::handle\n represents a valid shared KMT handle that\n is returned by IDXGIResource::GetSharedHandle when referring to\n a IDXGIKeyedMutex object and\n ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::name must be NULL.\n\n If ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::type is\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TIMELINE_SEMAPHORE_FD, then\n ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::fd must be a valid\n file descriptor referencing a synchronization object. Ownership of\n the file descriptor is transferred to the CUDA driver when the\n handle is imported successfully. Performing any operations on the\n file descriptor after it is imported results in undefined behavior.\n\n If ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::type is\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TIMELINE_SEMAPHORE_WIN32, then exactly one\n of ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::handle and\n ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::name must not be\n NULL. If\n ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::handle\n is not NULL, then it must represent a valid shared NT handle that\n references a synchronization object. Ownership of this handle is\n not transferred to CUDA after the import operation, so the\n application must release the handle using the appropriate system\n call. If ::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC::handle::win32::name\n is not NULL, then it must name a valid synchronization object.\n\n \\param extSem_out    - Returned handle to an external semaphore\n \\param semHandleDesc - Semaphore import handle descriptor\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_NOT_SUPPORTED,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_OPERATING_SYSTEM\n \\notefnerr\n\n \\sa ::cuDestroyExternalSemaphore,\n ::cuSignalExternalSemaphoresAsync,\n ::cuWaitExternalSemaphoresAsync*/\n    fn cuImportExternalSemaphore(\n        extSem_out: *mut cuda_types::cuda::CUexternalSemaphore,\n        semHandleDesc: *const cuda_types::cuda::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Signals a set of external semaphore objects\n\n Enqueues a signal operation on a set of externally allocated\n semaphore object in the specified stream. The operations will be\n executed when all prior operations in the stream complete.\n\n The exact semantics of signaling a semaphore depends on the type of\n the object.\n\n If the semaphore object is any one of the following types:\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD,\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32,\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT\n then signaling the semaphore will set it to the signaled state.\n\n If the semaphore object is any one of the following types:\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE,\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE,\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TIMELINE_SEMAPHORE_FD,\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TIMELINE_SEMAPHORE_WIN32\n then the semaphore will be set to the value specified in\n ::CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS::params::fence::value.\n\n If the semaphore object is of the type ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_NVSCISYNC\n this API sets ::CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS::params::nvSciSync::fence\n to a value that can be used by subsequent waiters of the same NvSciSync object\n to order operations with those currently submitted in \\p stream. Such an update\n will overwrite previous contents of\n ::CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS::params::nvSciSync::fence. By default,\n signaling such an external semaphore object causes appropriate memory synchronization\n operations to be performed over all external memory objects that are imported as\n ::CU_EXTERNAL_MEMORY_HANDLE_TYPE_NVSCIBUF. This ensures that any subsequent accesses\n made by other importers of the same set of NvSciBuf memory object(s) are coherent.\n These operations can be skipped by specifying the flag\n ::CUDA_EXTERNAL_SEMAPHORE_SIGNAL_SKIP_NVSCIBUF_MEMSYNC, which can be used as a\n performance optimization when data coherency is not required. But specifying this\n flag in scenarios where data coherency is required results in undefined behavior.\n Also, for semaphore object of the type ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_NVSCISYNC,\n if the NvSciSyncAttrList used to create the NvSciSyncObj had not set the flags in\n ::cuDeviceGetNvSciSyncAttributes to CUDA_NVSCISYNC_ATTR_SIGNAL, this API will return\n CUDA_ERROR_NOT_SUPPORTED.\n NvSciSyncFence associated with semaphore object of the type\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_NVSCISYNC can be deterministic. For this the\n NvSciSyncAttrList used to create the semaphore object must have value of\n NvSciSyncAttrKey_RequireDeterministicFences key set to true. Deterministic fences\n allow users to enqueue a wait over the semaphore object even before corresponding\n signal is enqueued. For such a semaphore object, CUDA guarantees that each signal\n operation will increment the fence value by '1'. Users are expected to track count\n of signals enqueued on the semaphore object and insert waits accordingly. When such\n a semaphore object is signaled from multiple streams, due to concurrent stream\n execution, it is possible that the order in which the semaphore gets signaled is\n indeterministic. This could lead to waiters of the semaphore getting unblocked\n incorrectly. Users are expected to handle such situations, either by not using the\n same semaphore object with deterministic fence support enabled in different streams\n or by adding explicit dependency amongst such streams so that the semaphore is\n signaled in order.\n NvSciSyncFence associated with semaphore object of the type\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_NVSCISYNC can be timestamp enabled. For this\n the NvSciSyncAttrList used to create the object must have the value of\n NvSciSyncAttrKey_WaiterRequireTimestamps key set to true. Timestamps are emitted\n asynchronously by the GPU and CUDA saves the GPU timestamp in the corresponding\n NvSciSyncFence at the time of signal on GPU. Users are expected to convert\n GPU clocks to CPU clocks using appropriate scaling functions. Users are expected\n to wait for the completion of the fence before extracting timestamp using appropriate\n NvSciSync APIs. Users are expected to ensure that there is only one outstanding\n timestamp enabled fence per Cuda-NvSciSync object at any point of time, failing\n which leads to undefined behavior. Extracting the timestamp before the\n corresponding fence is signalled could lead to undefined behaviour. Timestamp\n extracted via appropriate NvSciSync API would be in microseconds.\n\n If the semaphore object is any one of the following types:\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX,\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX_KMT\n then the keyed mutex will be released with the key specified in\n ::CUDA_EXTERNAL_SEMAPHORE_PARAMS::params::keyedmutex::key.\n\n \\param extSemArray - Set of external semaphores to be signaled\n \\param paramsArray - Array of semaphore parameters\n \\param numExtSems  - Number of semaphores to signal\n \\param stream      - Stream to enqueue the signal operations in\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_NOT_SUPPORTED\n \\notefnerr\n\n \\sa ::cuImportExternalSemaphore,\n ::cuDestroyExternalSemaphore,\n ::cuWaitExternalSemaphoresAsync*/\n    fn cuSignalExternalSemaphoresAsync_ptsz(\n        extSemArray: *const cuda_types::cuda::CUexternalSemaphore,\n        paramsArray: *const cuda_types::cuda::CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS,\n        numExtSems: ::core::ffi::c_uint,\n        stream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Waits on a set of external semaphore objects\n\n Enqueues a wait operation on a set of externally allocated\n semaphore object in the specified stream. The operations will be\n executed when all prior operations in the stream complete.\n\n The exact semantics of waiting on a semaphore depends on the type\n of the object.\n\n If the semaphore object is any one of the following types:\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD,\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32,\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT\n then waiting on the semaphore will wait until the semaphore reaches\n the signaled state. The semaphore will then be reset to the\n unsignaled state. Therefore for every signal operation, there can\n only be one wait operation.\n\n If the semaphore object is any one of the following types:\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE,\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE,\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TIMELINE_SEMAPHORE_FD,\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TIMELINE_SEMAPHORE_WIN32\n then waiting on the semaphore will wait until the value of the\n semaphore is greater than or equal to\n ::CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS::params::fence::value.\n\n If the semaphore object is of the type ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_NVSCISYNC\n then, waiting on the semaphore will wait until the\n ::CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS::params::nvSciSync::fence is signaled by the\n signaler of the NvSciSyncObj that was associated with this semaphore object.\n By default, waiting on such an external semaphore object causes appropriate\n memory synchronization operations to be performed over all external memory objects\n that are imported as ::CU_EXTERNAL_MEMORY_HANDLE_TYPE_NVSCIBUF. This ensures that\n any subsequent accesses made by other importers of the same set of NvSciBuf memory\n object(s) are coherent. These operations can be skipped by specifying the flag\n ::CUDA_EXTERNAL_SEMAPHORE_WAIT_SKIP_NVSCIBUF_MEMSYNC, which can be used as a\n performance optimization when data coherency is not required. But specifying this\n flag in scenarios where data coherency is required results in undefined behavior.\n Also, for semaphore object of the type ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_NVSCISYNC,\n if the NvSciSyncAttrList used to create the NvSciSyncObj had not set the flags in\n ::cuDeviceGetNvSciSyncAttributes to CUDA_NVSCISYNC_ATTR_WAIT, this API will return\n CUDA_ERROR_NOT_SUPPORTED.\n\n If the semaphore object is any one of the following types:\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX,\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX_KMT\n then the keyed mutex will be acquired when it is released with the key\n specified in ::CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS::params::keyedmutex::key\n or until the timeout specified by\n ::CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS::params::keyedmutex::timeoutMs\n has lapsed. The timeout interval can either be a finite value\n specified in milliseconds or an infinite value. In case an infinite\n value is specified the timeout never elapses. The windows INFINITE\n macro must be used to specify infinite timeout.\n\n \\param extSemArray - External semaphores to be waited on\n \\param paramsArray - Array of semaphore parameters\n \\param numExtSems  - Number of semaphores to wait on\n \\param stream      - Stream to enqueue the wait operations in\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_NOT_SUPPORTED,\n ::CUDA_ERROR_TIMEOUT\n \\notefnerr\n\n \\sa ::cuImportExternalSemaphore,\n ::cuDestroyExternalSemaphore,\n ::cuSignalExternalSemaphoresAsync*/\n    fn cuWaitExternalSemaphoresAsync_ptsz(\n        extSemArray: *const cuda_types::cuda::CUexternalSemaphore,\n        paramsArray: *const cuda_types::cuda::CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS,\n        numExtSems: ::core::ffi::c_uint,\n        stream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Destroys an external semaphore\n\n Destroys an external semaphore object and releases any references\n to the underlying resource. Any outstanding signals or waits must\n have completed before the semaphore is destroyed.\n\n \\param extSem - External semaphore to be destroyed\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_HANDLE\n \\notefnerr\n\n \\sa ::cuImportExternalSemaphore,\n ::cuSignalExternalSemaphoresAsync,\n ::cuWaitExternalSemaphoresAsync*/\n    fn cuDestroyExternalSemaphore(\n        extSem: cuda_types::cuda::CUexternalSemaphore,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Wait on a memory location\n\n Enqueues a synchronization of the stream on the given memory location. Work\n ordered after the operation will block until the given condition on the\n memory is satisfied. By default, the condition is to wait for\n (int32_t)(*addr - value) >= 0, a cyclic greater-or-equal.\n Other condition types can be specified via \\p flags.\n\n If the memory was registered via ::cuMemHostRegister(), the device pointer\n should be obtained with ::cuMemHostGetDevicePointer(). This function cannot\n be used with managed memory (::cuMemAllocManaged).\n\n Support for CU_STREAM_WAIT_VALUE_NOR can be queried with ::cuDeviceGetAttribute() and\n ::CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_WAIT_VALUE_NOR_V2.\n\n \\note\n Warning:\n Improper use of this API may deadlock the application. Synchronization\n ordering established through this API is not visible to CUDA. CUDA tasks\n that are (even indirectly) ordered by this API should also have that order\n expressed with CUDA-visible dependencies such as events. This ensures that\n the scheduler does not serialize them in an improper order.\n\n \\param stream The stream to synchronize on the memory location.\n \\param addr The memory location to wait on.\n \\param value The value to compare with the memory location.\n \\param flags See ::CUstreamWaitValue_flags.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_SUPPORTED\n \\notefnerr\n\n \\sa ::cuStreamWaitValue64,\n ::cuStreamWriteValue32,\n ::cuStreamWriteValue64,\n ::cuStreamBatchMemOp,\n ::cuMemHostRegister,\n ::cuStreamWaitEvent*/\n    fn cuStreamWaitValue32_v2_ptsz(\n        stream: cuda_types::cuda::CUstream,\n        addr: cuda_types::cuda::CUdeviceptr,\n        value: cuda_types::cuda::cuuint32_t,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Wait on a memory location\n\n Enqueues a synchronization of the stream on the given memory location. Work\n ordered after the operation will block until the given condition on the\n memory is satisfied. By default, the condition is to wait for\n (int64_t)(*addr - value) >= 0, a cyclic greater-or-equal.\n Other condition types can be specified via \\p flags.\n\n If the memory was registered via ::cuMemHostRegister(), the device pointer\n should be obtained with ::cuMemHostGetDevicePointer().\n\n Support for this can be queried with ::cuDeviceGetAttribute() and\n ::CU_DEVICE_ATTRIBUTE_CAN_USE_64_BIT_STREAM_MEM_OPS.\n\n \\note\n Warning:\n Improper use of this API may deadlock the application. Synchronization\n ordering established through this API is not visible to CUDA. CUDA tasks\n that are (even indirectly) ordered by this API should also have that order\n expressed with CUDA-visible dependencies such as events. This ensures that\n the scheduler does not serialize them in an improper order.\n\n \\param stream The stream to synchronize on the memory location.\n \\param addr The memory location to wait on.\n \\param value The value to compare with the memory location.\n \\param flags See ::CUstreamWaitValue_flags.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_SUPPORTED\n \\notefnerr\n\n \\sa ::cuStreamWaitValue32,\n ::cuStreamWriteValue32,\n ::cuStreamWriteValue64,\n ::cuStreamBatchMemOp,\n ::cuMemHostRegister,\n ::cuStreamWaitEvent*/\n    fn cuStreamWaitValue64_v2_ptsz(\n        stream: cuda_types::cuda::CUstream,\n        addr: cuda_types::cuda::CUdeviceptr,\n        value: cuda_types::cuda::cuuint64_t,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Write a value to memory\n\n Write a value to memory.\n\n If the memory was registered via ::cuMemHostRegister(), the device pointer\n should be obtained with ::cuMemHostGetDevicePointer(). This function cannot\n be used with managed memory (::cuMemAllocManaged).\n\n \\param stream The stream to do the write in.\n \\param addr The device address to write to.\n \\param value The value to write.\n \\param flags See ::CUstreamWriteValue_flags.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_SUPPORTED\n \\notefnerr\n\n \\sa ::cuStreamWriteValue64,\n ::cuStreamWaitValue32,\n ::cuStreamWaitValue64,\n ::cuStreamBatchMemOp,\n ::cuMemHostRegister,\n ::cuEventRecord*/\n    fn cuStreamWriteValue32_v2_ptsz(\n        stream: cuda_types::cuda::CUstream,\n        addr: cuda_types::cuda::CUdeviceptr,\n        value: cuda_types::cuda::cuuint32_t,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Write a value to memory\n\n Write a value to memory.\n\n If the memory was registered via ::cuMemHostRegister(), the device pointer\n should be obtained with ::cuMemHostGetDevicePointer().\n\n Support for this can be queried with ::cuDeviceGetAttribute() and\n ::CU_DEVICE_ATTRIBUTE_CAN_USE_64_BIT_STREAM_MEM_OPS.\n\n \\param stream The stream to do the write in.\n \\param addr The device address to write to.\n \\param value The value to write.\n \\param flags See ::CUstreamWriteValue_flags.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_SUPPORTED\n \\notefnerr\n\n \\sa ::cuStreamWriteValue32,\n ::cuStreamWaitValue32,\n ::cuStreamWaitValue64,\n ::cuStreamBatchMemOp,\n ::cuMemHostRegister,\n ::cuEventRecord*/\n    fn cuStreamWriteValue64_v2_ptsz(\n        stream: cuda_types::cuda::CUstream,\n        addr: cuda_types::cuda::CUdeviceptr,\n        value: cuda_types::cuda::cuuint64_t,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Batch operations to synchronize the stream via memory operations\n\n This is a batch version of ::cuStreamWaitValue32() and ::cuStreamWriteValue32().\n Batching operations may avoid some performance overhead in both the API call\n and the device execution versus adding them to the stream in separate API\n calls. The operations are enqueued in the order they appear in the array.\n\n See ::CUstreamBatchMemOpType for the full set of supported operations, and\n ::cuStreamWaitValue32(), ::cuStreamWaitValue64(), ::cuStreamWriteValue32(),\n and ::cuStreamWriteValue64() for details of specific operations.\n\n See related APIs for details on querying support for specific operations.\n\n \\note\n Warning:\n Improper use of this API may deadlock the application. Synchronization\n ordering established through this API is not visible to CUDA. CUDA tasks\n that are (even indirectly) ordered by this API should also have that order\n expressed with CUDA-visible dependencies such as events. This ensures that\n the scheduler does not serialize them in an improper order.\n\n \\param stream The stream to enqueue the operations in.\n \\param count The number of operations in the array. Must be less than 256.\n \\param paramArray The types and parameters of the individual operations.\n \\param flags Reserved for future expansion; must be 0.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_SUPPORTED\n \\notefnerr\n\n \\sa ::cuStreamWaitValue32,\n ::cuStreamWaitValue64,\n ::cuStreamWriteValue32,\n ::cuStreamWriteValue64,\n ::cuMemHostRegister*/\n    fn cuStreamBatchMemOp_v2_ptsz(\n        stream: cuda_types::cuda::CUstream,\n        count: ::core::ffi::c_uint,\n        paramArray: *mut cuda_types::cuda::CUstreamBatchMemOpParams,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns information about a function\n\n Returns in \\p *pi the integer value of the attribute \\p attrib on the kernel\n given by \\p hfunc. The supported attributes are:\n - ::CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK: The maximum number of threads\n   per block, beyond which a launch of the function would fail. This number\n   depends on both the function and the device on which the function is\n   currently loaded.\n - ::CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES: The size in bytes of\n   statically-allocated shared memory per block required by this function.\n   This does not include dynamically-allocated shared memory requested by\n   the user at runtime.\n - ::CU_FUNC_ATTRIBUTE_CONST_SIZE_BYTES: The size in bytes of user-allocated\n   constant memory required by this function.\n - ::CU_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES: The size in bytes of local memory\n   used by each thread of this function.\n - ::CU_FUNC_ATTRIBUTE_NUM_REGS: The number of registers used by each thread\n   of this function.\n - ::CU_FUNC_ATTRIBUTE_PTX_VERSION: The PTX virtual architecture version for\n   which the function was compiled. This value is the major PTX version * 10\n   + the minor PTX version, so a PTX version 1.3 function would return the\n   value 13. Note that this may return the undefined value of 0 for cubins\n   compiled prior to CUDA 3.0.\n - ::CU_FUNC_ATTRIBUTE_BINARY_VERSION: The binary architecture version for\n   which the function was compiled. This value is the major binary\n   version * 10 + the minor binary version, so a binary version 1.3 function\n   would return the value 13. Note that this will return a value of 10 for\n   legacy cubins that do not have a properly-encoded binary architecture\n   version.\n - ::CU_FUNC_CACHE_MODE_CA: The attribute to indicate whether the function has\n   been compiled with user specified option \"-Xptxas --dlcm=ca\" set .\n - ::CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES: The maximum size in bytes of\n   dynamically-allocated shared memory.\n - ::CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT: Preferred shared memory-L1\n   cache split ratio in percent of total shared memory.\n - ::CU_FUNC_ATTRIBUTE_CLUSTER_SIZE_MUST_BE_SET: If this attribute is set, the\n   kernel must launch with a valid cluster size specified.\n - ::CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_WIDTH: The required cluster width in\n   blocks.\n - ::CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_HEIGHT: The required cluster height in\n   blocks.\n - ::CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_DEPTH: The required cluster depth in\n   blocks.\n - ::CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED: Indicates whether\n   the function can be launched with non-portable cluster size. 1 is allowed,\n   0 is disallowed. A non-portable cluster size may only function on the\n   specific SKUs the program is tested on. The launch might fail if the\n   program is run on a different hardware platform. CUDA API provides\n   cudaOccupancyMaxActiveClusters to assist with checking whether the desired\n   size can be launched on the current device. A portable cluster size is\n   guaranteed to be functional on all compute capabilities higher than the\n   target compute capability. The portable cluster size for sm_90 is 8 blocks\n   per cluster. This value may increase for future compute capabilities. The\n   specific hardware unit may support higher cluster sizes that’s not\n   guaranteed to be portable.\n - ::CU_FUNC_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE: The block\n   scheduling policy of a function. The value type is CUclusterSchedulingPolicy.\n\n With a few execeptions, function attributes may also be queried on unloaded\n function handles returned from ::cuModuleEnumerateFunctions.\n ::CUDA_ERROR_FUNCTION_NOT_LOADED is returned if the attribute requires a fully\n loaded function but the function is not loaded. The loading state of a function\n may be queried using ::cuFuncIsloaded. ::cuFuncLoad may be called to explicitly\n load a function before querying the following attributes that require the function\n to be loaded:\n - ::CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK\n - ::CU_FUNC_ATTRIBUTE_CONST_SIZE_BYTES\n - ::CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES\n\n \\param pi     - Returned attribute value\n \\param attrib - Attribute requested\n \\param hfunc  - Function to query attribute of\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_FUNCTION_NOT_LOADED\n \\notefnerr\n\n \\sa ::cuCtxGetCacheConfig,\n ::cuCtxSetCacheConfig,\n ::cuFuncSetCacheConfig,\n ::cuLaunchKernel,\n ::cudaFuncGetAttributes,\n ::cudaFuncSetAttribute,\n ::cuFuncIsLoaded,\n ::cuFuncLoad,\n ::cuKernelGetAttribute*/\n    fn cuFuncGetAttribute(\n        pi: *mut ::core::ffi::c_int,\n        attrib: cuda_types::cuda::CUfunction_attribute,\n        hfunc: cuda_types::cuda::CUfunction,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets information about a function\n\n This call sets the value of a specified attribute \\p attrib on the kernel given\n by \\p hfunc to an integer value specified by \\p val\n This function returns CUDA_SUCCESS if the new value of the attribute could be\n successfully set. If the set fails, this call will return an error.\n Not all attributes can have values set. Attempting to set a value on a read-only\n attribute will result in an error (CUDA_ERROR_INVALID_VALUE)\n\n Supported attributes for the cuFuncSetAttribute call are:\n - ::CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES: This maximum size in bytes of\n   dynamically-allocated shared memory. The value should contain the requested\n   maximum size of dynamically-allocated shared memory. The sum of this value and\n   the function attribute ::CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES cannot exceed the\n   device attribute ::CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK_OPTIN.\n   The maximal size of requestable dynamic shared memory may differ by GPU\n   architecture.\n - ::CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT: On devices where the L1\n   cache and shared memory use the same hardware resources, this sets the shared memory\n   carveout preference, in percent of the total shared memory.\n   See ::CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_MULTIPROCESSOR\n   This is only a hint, and the driver can choose a different ratio if required to execute the function.\n - ::CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_WIDTH: The required cluster width in\n   blocks. The width, height, and depth values must either all be 0 or all be\n   positive. The validity of the cluster dimensions is checked at launch time.\n   If the value is set during compile time, it cannot be set at runtime.\n   Setting it at runtime will return CUDA_ERROR_NOT_PERMITTED.\n - ::CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_HEIGHT: The required cluster height in\n   blocks. The width, height, and depth values must either all be 0 or all be\n   positive. The validity of the cluster dimensions is checked at launch time.\n   If the value is set during compile time, it cannot be set at runtime.\n   Setting it at runtime will return CUDA_ERROR_NOT_PERMITTED.\n - ::CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_DEPTH: The required cluster depth in\n   blocks. The width, height, and depth values must either all be 0 or all be\n   positive. The validity of the cluster dimensions is checked at launch time.\n   If the value is set during compile time, it cannot be set at runtime.\n   Setting it at runtime will return CUDA_ERROR_NOT_PERMITTED.\n - ::CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED: Indicates whether\n   the function can be launched with non-portable cluster size. 1 is allowed,\n   0 is disallowed.\n - ::CU_FUNC_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE: The block\n   scheduling policy of a function. The value type is CUclusterSchedulingPolicy.\n\n \\param hfunc  - Function to query attribute of\n \\param attrib - Attribute requested\n \\param value   - The value to set\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa ::cuCtxGetCacheConfig,\n ::cuCtxSetCacheConfig,\n ::cuFuncSetCacheConfig,\n ::cuLaunchKernel,\n ::cudaFuncGetAttributes,\n ::cudaFuncSetAttribute,\n ::cuKernelSetAttribute*/\n    fn cuFuncSetAttribute(\n        hfunc: cuda_types::cuda::CUfunction,\n        attrib: cuda_types::cuda::CUfunction_attribute,\n        value: ::core::ffi::c_int,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the preferred cache configuration for a device function\n\n On devices where the L1 cache and shared memory use the same hardware\n resources, this sets through \\p config the preferred cache configuration for\n the device function \\p hfunc. This is only a preference. The driver will use\n the requested configuration if possible, but it is free to choose a different\n configuration if required to execute \\p hfunc.  Any context-wide preference\n set via ::cuCtxSetCacheConfig() will be overridden by this per-function\n setting unless the per-function setting is ::CU_FUNC_CACHE_PREFER_NONE. In\n that case, the current context-wide setting will be used.\n\n This setting does nothing on devices where the size of the L1 cache and\n shared memory are fixed.\n\n Launching a kernel with a different preference than the most recent\n preference setting may insert a device-side synchronization point.\n\n\n The supported cache configurations are:\n - ::CU_FUNC_CACHE_PREFER_NONE: no preference for shared memory or L1 (default)\n - ::CU_FUNC_CACHE_PREFER_SHARED: prefer larger shared memory and smaller L1 cache\n - ::CU_FUNC_CACHE_PREFER_L1: prefer larger L1 cache and smaller shared memory\n - ::CU_FUNC_CACHE_PREFER_EQUAL: prefer equal sized L1 cache and shared memory\n\n \\param hfunc  - Kernel to configure cache for\n \\param config - Requested cache configuration\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT\n \\notefnerr\n\n \\sa ::cuCtxGetCacheConfig,\n ::cuCtxSetCacheConfig,\n ::cuFuncGetAttribute,\n ::cuLaunchKernel,\n ::cudaFuncSetCacheConfig,\n ::cuKernelSetCacheConfig*/\n    fn cuFuncSetCacheConfig(\n        hfunc: cuda_types::cuda::CUfunction,\n        config: cuda_types::cuda::CUfunc_cache,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a module handle\n\n Returns in \\p *hmod the handle of the module that function \\p hfunc\n is located in. The lifetime of the module corresponds to the lifetime of\n the context it was loaded in or until the module is explicitly unloaded.\n\n The CUDA runtime manages its own modules loaded into the primary context.\n If the handle returned by this API refers to a module loaded by the CUDA runtime,\n calling ::cuModuleUnload() on that module will result in undefined behavior.\n\n \\param hmod - Returned module handle\n \\param hfunc   - Function to retrieve module for\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_FOUND\n \\notefnerr\n*/\n    fn cuFuncGetModule(\n        hmod: *mut cuda_types::cuda::CUmodule,\n        hfunc: cuda_types::cuda::CUfunction,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the function name for a ::CUfunction handle\n\n Returns in \\p **name the function name associated with the function handle \\p hfunc .\n The function name is returned as a null-terminated string. The returned name is only\n valid when the function handle is valid. If the module is unloaded or reloaded, one\n must call the API again to get the updated name. This API may return a mangled name if\n the function is not declared as having C linkage. If either \\p **name or \\p hfunc\n is NULL, ::CUDA_ERROR_INVALID_VALUE is returned.\n\n \\param name - The returned name of the function\n \\param hfunc - The function handle to retrieve the name for\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n \\notefnerr\n*/\n    fn cuFuncGetName(\n        name: *mut *const ::core::ffi::c_char,\n        hfunc: cuda_types::cuda::CUfunction,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the offset and size of a kernel parameter in the device-side parameter layout\n\n Queries the kernel parameter at \\p paramIndex into \\p func's list of parameters, and returns\n in \\p paramOffset and \\p paramSize the offset and size, respectively, where the parameter\n will reside in the device-side parameter layout. This information can be used to update kernel\n node parameters from the device via ::cudaGraphKernelNodeSetParam() and\n ::cudaGraphKernelNodeUpdatesApply(). \\p paramIndex must be less than the number of parameters\n that \\p func takes. \\p paramSize can be set to NULL if only the parameter offset is desired.\n\n \\param func        - The function to query\n \\param paramIndex  - The parameter index to query\n \\param paramOffset - Returns the offset into the device-side parameter layout at which the parameter resides\n \\param paramSize   - Optionally returns the size of the parameter in the device-side parameter layout\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n \\notefnerr\n\n \\sa ::cuKernelGetParamInfo*/\n    fn cuFuncGetParamInfo(\n        func: cuda_types::cuda::CUfunction,\n        paramIndex: usize,\n        paramOffset: *mut usize,\n        paramSize: *mut usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns if the function is loaded\n\n Returns in \\p state the loading state of \\p function.\n\n \\param state - returned loading state\n \\param function - the function to check\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuFuncLoad,\n ::cuModuleEnumerateFunctions*/\n    fn cuFuncIsLoaded(\n        state: *mut cuda_types::cuda::CUfunctionLoadingState,\n        function: cuda_types::cuda::CUfunction,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Loads a function\n\n Finalizes function loading for \\p function. Calling this API with a\n fully loaded function has no effect.\n\n \\param function - the function to load\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuModuleEnumerateFunctions,\n ::cuFuncIsLoaded*/\n    fn cuFuncLoad(function: cuda_types::cuda::CUfunction) -> cuda_types::cuda::CUresult;\n    /** \\brief Launches a CUDA function ::CUfunction or a CUDA kernel ::CUkernel\n\n Invokes the function ::CUfunction or the kernel ::CUkernel \\p f\n on a \\p gridDimX x \\p gridDimY x \\p gridDimZ grid of blocks.\n Each block contains \\p blockDimX x \\p blockDimY x\n \\p blockDimZ threads.\n\n \\p sharedMemBytes sets the amount of dynamic shared memory that will be\n available to each thread block.\n\n Kernel parameters to \\p f can be specified in one of two ways:\n\n 1) Kernel parameters can be specified via \\p kernelParams.  If \\p f\n has N parameters, then \\p kernelParams needs to be an array of N\n pointers.  Each of \\p kernelParams[0] through \\p kernelParams[N-1]\n must point to a region of memory from which the actual kernel\n parameter will be copied.  The number of kernel parameters and their\n offsets and sizes do not need to be specified as that information is\n retrieved directly from the kernel's image.\n\n 2) Kernel parameters can also be packaged by the application into\n a single buffer that is passed in via the \\p extra parameter.\n This places the burden on the application of knowing each kernel\n parameter's size and alignment/padding within the buffer.  Here is\n an example of using the \\p extra parameter in this manner:\n \\code\nsize_t argBufferSize;\nchar argBuffer[256];\n\n// populate argBuffer and argBufferSize\n\nvoid *config[] = {\nCU_LAUNCH_PARAM_BUFFER_POINTER, argBuffer,\nCU_LAUNCH_PARAM_BUFFER_SIZE,    &argBufferSize,\nCU_LAUNCH_PARAM_END\n};\nstatus = cuLaunchKernel(f, gx, gy, gz, bx, by, bz, sh, s, NULL, config);\n \\endcode\n\n The \\p extra parameter exists to allow ::cuLaunchKernel to take\n additional less commonly used arguments.  \\p extra specifies a list of\n names of extra settings and their corresponding values.  Each extra\n setting name is immediately followed by the corresponding value.  The\n list must be terminated with either NULL or ::CU_LAUNCH_PARAM_END.\n\n - ::CU_LAUNCH_PARAM_END, which indicates the end of the \\p extra\n   array;\n - ::CU_LAUNCH_PARAM_BUFFER_POINTER, which specifies that the next\n   value in \\p extra will be a pointer to a buffer containing all\n   the kernel parameters for launching kernel \\p f;\n - ::CU_LAUNCH_PARAM_BUFFER_SIZE, which specifies that the next\n   value in \\p extra will be a pointer to a size_t containing the\n   size of the buffer specified with ::CU_LAUNCH_PARAM_BUFFER_POINTER;\n\n The error ::CUDA_ERROR_INVALID_VALUE will be returned if kernel\n parameters are specified with both \\p kernelParams and \\p extra\n (i.e. both \\p kernelParams and \\p extra are non-NULL).\n\n Calling ::cuLaunchKernel() invalidates the persistent function state\n set through the following deprecated APIs:\n  ::cuFuncSetBlockShape(),\n  ::cuFuncSetSharedSize(),\n  ::cuParamSetSize(),\n  ::cuParamSeti(),\n  ::cuParamSetf(),\n  ::cuParamSetv().\n\n Note that to use ::cuLaunchKernel(), the kernel \\p f must either have\n been compiled with toolchain version 3.2 or later so that it will\n contain kernel parameter information, or have no kernel parameters.\n If either of these conditions is not met, then ::cuLaunchKernel() will\n return ::CUDA_ERROR_INVALID_IMAGE.\n\n Note that the API can also be used to launch context-less kernel ::CUkernel\n by querying the handle using ::cuLibraryGetKernel() and then passing it\n to the API by casting to ::CUfunction. Here, the context to launch\n the kernel on will either be taken from the specified stream \\p hStream\n or the current context in case of NULL stream.\n\n \\param f              - Function ::CUfunction or Kernel ::CUkernel to launch\n \\param gridDimX       - Width of grid in blocks\n \\param gridDimY       - Height of grid in blocks\n \\param gridDimZ       - Depth of grid in blocks\n \\param blockDimX      - X dimension of each thread block\n \\param blockDimY      - Y dimension of each thread block\n \\param blockDimZ      - Z dimension of each thread block\n \\param sharedMemBytes - Dynamic shared-memory size per thread block in bytes\n \\param hStream        - Stream identifier\n \\param kernelParams   - Array of pointers to kernel parameters\n \\param extra          - Extra options\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_IMAGE,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_LAUNCH_FAILED,\n ::CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES,\n ::CUDA_ERROR_LAUNCH_TIMEOUT,\n ::CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING,\n ::CUDA_ERROR_SHARED_OBJECT_INIT_FAILED,\n ::CUDA_ERROR_NOT_FOUND\n \\note_null_stream\n \\notefnerr\n\n \\sa ::cuCtxGetCacheConfig,\n ::cuCtxSetCacheConfig,\n ::cuFuncSetCacheConfig,\n ::cuFuncGetAttribute,\n ::cudaLaunchKernel,\n ::cuLibraryGetKernel,\n ::cuKernelSetCacheConfig,\n ::cuKernelGetAttribute,\n ::cuKernelSetAttribute*/\n    fn cuLaunchKernel_ptsz(\n        f: cuda_types::cuda::CUfunction,\n        gridDimX: ::core::ffi::c_uint,\n        gridDimY: ::core::ffi::c_uint,\n        gridDimZ: ::core::ffi::c_uint,\n        blockDimX: ::core::ffi::c_uint,\n        blockDimY: ::core::ffi::c_uint,\n        blockDimZ: ::core::ffi::c_uint,\n        sharedMemBytes: ::core::ffi::c_uint,\n        hStream: cuda_types::cuda::CUstream,\n        kernelParams: *mut *mut ::core::ffi::c_void,\n        extra: *mut *mut ::core::ffi::c_void,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Launches a CUDA function ::CUfunction or a CUDA kernel ::CUkernel with launch-time configuration\n\n Invokes the function ::CUfunction or the kernel ::CUkernel \\p f with the specified launch-time configuration\n \\p config.\n\n The ::CUlaunchConfig structure is defined as:\n\n \\code\n       typedef struct CUlaunchConfig_st {\n     unsigned int gridDimX;\n     unsigned int gridDimY;\n     unsigned int gridDimZ;\n     unsigned int blockDimX;\n     unsigned int blockDimY;\n     unsigned int blockDimZ;\n     unsigned int sharedMemBytes;\n     CUstream hStream;\n     CUlaunchAttribute *attrs;\n     unsigned int numAttrs;\n } CUlaunchConfig;\n \\endcode\n\n where:\n - ::CUlaunchConfig::gridDimX is the width of the grid in blocks.\n - ::CUlaunchConfig::gridDimY is the height of the grid in blocks.\n - ::CUlaunchConfig::gridDimZ is the depth of the grid in blocks.\n - ::CUlaunchConfig::blockDimX is the X dimension of each thread block.\n - ::CUlaunchConfig::blockDimX is the Y dimension of each thread block.\n - ::CUlaunchConfig::blockDimZ is the Z dimension of each thread block.\n - ::CUlaunchConfig::sharedMemBytes is the dynamic shared-memory size per\n   thread block in bytes.\n - ::CUlaunchConfig::hStream is the handle to the stream to perform the launch\n   in. The CUDA context associated with this stream must match that associated\n   with function f.\n - ::CUlaunchConfig::attrs is an array of ::CUlaunchConfig::numAttrs\n   continguous ::CUlaunchAttribute elements. The value of this pointer is not\n   considered if ::CUlaunchConfig::numAttrs is zero. However, in that case, it\n   is recommended to set the pointer to NULL.\n - ::CUlaunchConfig::numAttrs is the number of attributes populating the\n   first ::CUlaunchConfig::numAttrs positions of the ::CUlaunchConfig::attrs\n   array.\n\n Launch-time configuration is specified by adding entries to\n ::CUlaunchConfig::attrs. Each entry is an attribute ID and a corresponding\n attribute value.\n\n The ::CUlaunchAttribute structure is defined as:\n \\code\n       typedef struct CUlaunchAttribute_st {\n     CUlaunchAttributeID id;\n     CUlaunchAttributeValue value;\n } CUlaunchAttribute;\n \\endcode\n where:\n - ::CUlaunchAttribute::id is a unique enum identifying the attribute.\n - ::CUlaunchAttribute::value is a union that hold the attribute value.\n\n An example of using the \\p config parameter:\n \\code\n       CUlaunchAttribute coopAttr = {.id = CU_LAUNCH_ATTRIBUTE_COOPERATIVE,\n                               .value = 1};\n CUlaunchConfig config = {... // set block and grid dimensions\n                        .attrs = &coopAttr,\n                        .numAttrs = 1};\n\n cuLaunchKernelEx(&config, kernel, NULL, NULL);\n \\endcode\n\n The ::CUlaunchAttributeID enum is defined as:\n \\code\n       typedef enum CUlaunchAttributeID_enum {\n     CU_LAUNCH_ATTRIBUTE_IGNORE = 0,\n     CU_LAUNCH_ATTRIBUTE_ACCESS_POLICY_WINDOW   = 1,\n     CU_LAUNCH_ATTRIBUTE_COOPERATIVE            = 2,\n     CU_LAUNCH_ATTRIBUTE_SYNCHRONIZATION_POLICY = 3,\n     CU_LAUNCH_ATTRIBUTE_CLUSTER_DIMENSION                    = 4,\n     CU_LAUNCH_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE = 5,\n     CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_STREAM_SERIALIZATION    = 6,\n     CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_EVENT                   = 7,\n     CU_LAUNCH_ATTRIBUTE_PRIORITY               = 8,\n     CU_LAUNCH_ATTRIBUTE_MEM_SYNC_DOMAIN_MAP    = 9,\n     CU_LAUNCH_ATTRIBUTE_MEM_SYNC_DOMAIN        = 10,\n     CU_LAUNCH_ATTRIBUTE_PREFERRED_CLUSTER_DIMENSION = 11,\n     CU_LAUNCH_ATTRIBUTE_LAUNCH_COMPLETION_EVENT = 12,\n     CU_LAUNCH_ATTRIBUTE_DEVICE_UPDATABLE_KERNEL_NODE = 13,\n } CUlaunchAttributeID;\n \\endcode\n\n and the corresponding ::CUlaunchAttributeValue union as :\n \\code\n       typedef union CUlaunchAttributeValue_union {\n     CUaccessPolicyWindow accessPolicyWindow;\n     int cooperative;\n     CUsynchronizationPolicy syncPolicy;\n     struct {\n         unsigned int x;\n         unsigned int y;\n         unsigned int z;\n     } clusterDim;\n     CUclusterSchedulingPolicy clusterSchedulingPolicyPreference;\n     int programmaticStreamSerializationAllowed;\n     struct {\n         CUevent event;\n         int flags;\n         int triggerAtBlockStart;\n     } programmaticEvent;\n     int priority;\n     CUlaunchMemSyncDomainMap memSyncDomainMap;\n     CUlaunchMemSyncDomain memSyncDomain;\n     struct {\n         unsigned int x;\n         unsigned int y;\n         unsigned int z;\n     } preferredClusterDim;\n     struct {\n         CUevent event;\n         int flags;\n     } launchCompletionEvent;\n     struct {\n         int deviceUpdatable;\n         CUgraphDeviceNode devNode;\n     } deviceUpdatableKernelNode;\n } CUlaunchAttributeValue;\n \\endcode\n\n Setting ::CU_LAUNCH_ATTRIBUTE_COOPERATIVE to a non-zero value causes the\n kernel launch to be a cooperative launch, with exactly the same usage and\n semantics of ::cuLaunchCooperativeKernel.\n\n Setting ::CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_STREAM_SERIALIZATION to a non-zero\n values causes the kernel to use programmatic means to resolve its stream\n dependency -- enabling the CUDA runtime to opportunistically allow the grid's\n execution to overlap with the previous kernel in the stream, if that kernel\n requests the overlap.\n\n ::CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_EVENT records an event along with the\n kernel launch. Event recorded through this launch attribute is guaranteed to\n only trigger after all block in the associated kernel trigger the event. A\n block can trigger the event through PTX launchdep.release or CUDA builtin\n function cudaTriggerProgrammaticLaunchCompletion(). A trigger can also be\n inserted at the beginning of each block's execution if triggerAtBlockStart is\n set to non-0. Note that dependents (including the CPU thread calling\n cuEventSynchronize()) are not guaranteed to observe the release precisely\n when it is released. For example, cuEventSynchronize() may only observe the\n event trigger long after the associated kernel has completed. This recording\n type is primarily meant for establishing programmatic dependency between\n device tasks. The event supplied must not be an interprocess or interop\n event. The event must disable timing (i.e. created with\n ::CU_EVENT_DISABLE_TIMING flag set).\n\n ::CU_LAUNCH_ATTRIBUTE_LAUNCH_COMPLETION_EVENT records an event along with\n the kernel launch. Nominally, the event is triggered once all blocks of the\n kernel have begun execution. Currently this is a best effort. If a kernel B\n has a launch completion dependency on a kernel A, B may wait until A is\n complete. Alternatively, blocks of B may begin before all blocks of A have\n begun, for example:\n\n  - If B can claim execution resources unavailable to A, for example if they\n    run on different GPUs.\n  - If B is a higher priority than A.\n\n Exercise caution if such an ordering inversion could lead to deadlock. The\n event supplied must not be an interprocess or interop event. The event must\n disable timing (i.e. must be created with the ::CU_EVENT_DISABLE_TIMING flag\n set).\n\n Setting ::CU_LAUNCH_ATTRIBUTE_DEVICE_UPDATABLE_KERNEL_NODE to 1\n on a captured launch causes the resulting kernel node to be device-updatable.\n This attribute is specific to graphs, and passing it to a launch in a\n non-capturing stream results in an error. Passing a value other than 0 or 1 is\n not allowed.\n\n On success, a handle will be returned via\n ::CUlaunchAttributeValue::deviceUpdatableKernelNode::devNode which can be passed\n to the various device-side update functions to update the node's kernel parameters\n from within another kernel. For more information on the types of device updates\n that can be made, as well as the relevant limitations thereof, see\n ::cudaGraphKernelNodeUpdatesApply.\n\n Kernel nodes which are device-updatable have additional restrictions compared to regular\n kernel nodes. Firstly, device-updatable nodes cannot be removed from their graph via\n ::cuGraphDestroyNode. Additionally, once opted-in to this functionality, a node cannot\n opt out, and any attempt to set the attribute to 0 will result in an error. Graphs\n containing one or more device-updatable node also do not allow multiple instantiation.\n\n ::CU_LAUNCH_ATTRIBUTE_PREFERRED_CLUSTER_DIMENSION allows the kernel launch to\n specify a preferred substitute cluster dimension. Blocks may be grouped\n according to either the dimensions specified with this attribute (grouped\n into a \"preferred substitute cluster\"), or the one specified with\n ::CU_LAUNCH_ATTRIBUTE_CLUSTER_DIMENSION attribute (grouped into a \"regular\n cluster\"). The cluster dimensions of a \"preferred substitute cluster\" shall\n be an integer multiple greater than zero of the regular cluster dimensions.\n The device will attempt - on a best-effort basis - to group thread blocks\n into preferred clusters over grouping them into regular clusters. When it\n deems necessary (primarily when the device temporarily runs out of physical\n resources to launch the larger preferred clusters), the device may switch to\n launch the regular clusters instead to attempt to utilize as much of the\n physical device resources as possible.\n\n Each type of cluster will have its enumeration / coordinate setup as if the\n grid consists solely of its type of cluster. For example, if the preferred\n substitute cluster dimensions double the regular cluster dimensions, there\n might be simultaneously a regular cluster indexed at (1,0,0), and a preferred\n cluster indexed at (1,0,0). In this example, the preferred substitute cluster\n (1,0,0) replaces regular clusters (2,0,0) and (3,0,0) and groups their\n blocks.\n\n This attribute will only take effect when a regular cluster dimension has\n been specified. The preferred substitute The preferred substitute cluster\n dimension must be an integer multiple greater than zero of the regular\n cluster dimension and must divide the grid. It must also be no more than\n `maxBlocksPerCluster`, if it is set in the kernel's `__launch_bounds__`.\n Otherwise it must be less than the maximum value the driver can support.\n Otherwise, setting this attribute to a value physically unable to fit on any\n particular device is permitted.\n\n The effect of other attributes is consistent with their effect when set via\n persistent APIs.\n\n See ::cuStreamSetAttribute for\n - ::CU_LAUNCH_ATTRIBUTE_ACCESS_POLICY_WINDOW\n - ::CU_LAUNCH_ATTRIBUTE_SYNCHRONIZATION_POLICY\n\n See ::cuFuncSetAttribute for\n - ::CU_LAUNCH_ATTRIBUTE_CLUSTER_DIMENSION\n - ::CU_LAUNCH_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE\n\n Kernel parameters to \\p f can be specified in the same ways that they can be\n using ::cuLaunchKernel.\n\n Note that the API can also be used to launch context-less kernel ::CUkernel\n by querying the handle using ::cuLibraryGetKernel() and then passing it\n to the API by casting to ::CUfunction. Here, the context to launch\n the kernel on will either be taken from the specified stream ::CUlaunchConfig::hStream\n or the current context in case of NULL stream.\n\n \\param config         - Config to launch\n \\param f              - Function ::CUfunction or Kernel ::CUkernel to launch\n \\param kernelParams   - Array of pointers to kernel parameters\n \\param extra          - Extra options\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_IMAGE,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_LAUNCH_FAILED,\n ::CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES,\n ::CUDA_ERROR_LAUNCH_TIMEOUT,\n ::CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING,\n ::CUDA_ERROR_COOPERATIVE_LAUNCH_TOO_LARGE,\n ::CUDA_ERROR_SHARED_OBJECT_INIT_FAILED,\n ::CUDA_ERROR_NOT_FOUND\n \\note_null_stream\n \\notefnerr\n\n \\sa ::cuCtxGetCacheConfig,\n ::cuCtxSetCacheConfig,\n ::cuFuncSetCacheConfig,\n ::cuFuncGetAttribute,\n ::cudaLaunchKernel,\n ::cudaLaunchKernelEx,\n ::cuLibraryGetKernel,\n ::cuKernelSetCacheConfig,\n ::cuKernelGetAttribute,\n ::cuKernelSetAttribute*/\n    fn cuLaunchKernelEx_ptsz(\n        config: *const cuda_types::cuda::CUlaunchConfig,\n        f: cuda_types::cuda::CUfunction,\n        kernelParams: *mut *mut ::core::ffi::c_void,\n        extra: *mut *mut ::core::ffi::c_void,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Launches a CUDA function ::CUfunction or a CUDA kernel ::CUkernel where thread blocks\n can cooperate and synchronize as they execute\n\n Invokes the function ::CUfunction or the kernel ::CUkernel \\p f on a \\p gridDimX x \\p gridDimY x \\p gridDimZ\n grid of blocks. Each block contains \\p blockDimX x \\p blockDimY x\n \\p blockDimZ threads.\n\n \\p sharedMemBytes sets the amount of dynamic shared memory that will be\n available to each thread block.\n\n The device on which this kernel is invoked must have a non-zero value for\n the device attribute ::CU_DEVICE_ATTRIBUTE_COOPERATIVE_LAUNCH.\n\n The total number of blocks launched cannot exceed the maximum number of blocks per\n multiprocessor as returned by ::cuOccupancyMaxActiveBlocksPerMultiprocessor (or\n ::cuOccupancyMaxActiveBlocksPerMultiprocessorWithFlags) times the number of multiprocessors\n as specified by the device attribute ::CU_DEVICE_ATTRIBUTE_MULTIPROCESSOR_COUNT.\n\n The kernel cannot make use of CUDA dynamic parallelism.\n\n Kernel parameters must be specified via \\p kernelParams.  If \\p f\n has N parameters, then \\p kernelParams needs to be an array of N\n pointers.  Each of \\p kernelParams[0] through \\p kernelParams[N-1]\n must point to a region of memory from which the actual kernel\n parameter will be copied.  The number of kernel parameters and their\n offsets and sizes do not need to be specified as that information is\n retrieved directly from the kernel's image.\n\n Calling ::cuLaunchCooperativeKernel() sets persistent function state that is\n the same as function state set through ::cuLaunchKernel API\n\n When the kernel \\p f is launched via ::cuLaunchCooperativeKernel(), the previous\n block shape, shared size and parameter info associated with \\p f\n is overwritten.\n\n Note that to use ::cuLaunchCooperativeKernel(), the kernel \\p f must either have\n been compiled with toolchain version 3.2 or later so that it will\n contain kernel parameter information, or have no kernel parameters.\n If either of these conditions is not met, then ::cuLaunchCooperativeKernel() will\n return ::CUDA_ERROR_INVALID_IMAGE.\n\n Note that the API can also be used to launch context-less kernel ::CUkernel\n by querying the handle using ::cuLibraryGetKernel() and then passing it\n to the API by casting to ::CUfunction. Here, the context to launch\n the kernel on will either be taken from the specified stream \\p hStream\n or the current context in case of NULL stream.\n\n \\param f              - Function ::CUfunction or Kernel ::CUkernel to launch\n \\param gridDimX       - Width of grid in blocks\n \\param gridDimY       - Height of grid in blocks\n \\param gridDimZ       - Depth of grid in blocks\n \\param blockDimX      - X dimension of each thread block\n \\param blockDimY      - Y dimension of each thread block\n \\param blockDimZ      - Z dimension of each thread block\n \\param sharedMemBytes - Dynamic shared-memory size per thread block in bytes\n \\param hStream        - Stream identifier\n \\param kernelParams   - Array of pointers to kernel parameters\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_IMAGE,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_LAUNCH_FAILED,\n ::CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES,\n ::CUDA_ERROR_LAUNCH_TIMEOUT,\n ::CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING,\n ::CUDA_ERROR_COOPERATIVE_LAUNCH_TOO_LARGE,\n ::CUDA_ERROR_SHARED_OBJECT_INIT_FAILED,\n ::CUDA_ERROR_NOT_FOUND\n \\note_null_stream\n \\notefnerr\n\n \\sa ::cuCtxGetCacheConfig,\n ::cuCtxSetCacheConfig,\n ::cuFuncSetCacheConfig,\n ::cuFuncGetAttribute,\n ::cuLaunchCooperativeKernelMultiDevice,\n ::cudaLaunchCooperativeKernel,\n ::cuLibraryGetKernel,\n ::cuKernelSetCacheConfig,\n ::cuKernelGetAttribute,\n ::cuKernelSetAttribute*/\n    fn cuLaunchCooperativeKernel_ptsz(\n        f: cuda_types::cuda::CUfunction,\n        gridDimX: ::core::ffi::c_uint,\n        gridDimY: ::core::ffi::c_uint,\n        gridDimZ: ::core::ffi::c_uint,\n        blockDimX: ::core::ffi::c_uint,\n        blockDimY: ::core::ffi::c_uint,\n        blockDimZ: ::core::ffi::c_uint,\n        sharedMemBytes: ::core::ffi::c_uint,\n        hStream: cuda_types::cuda::CUstream,\n        kernelParams: *mut *mut ::core::ffi::c_void,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Launches CUDA functions on multiple devices where thread blocks can cooperate and synchronize as they execute\n\n \\deprecated This function is deprecated as of CUDA 11.3.\n\n Invokes kernels as specified in the \\p launchParamsList array where each element\n of the array specifies all the parameters required to perform a single kernel launch.\n These kernels can cooperate and synchronize as they execute. The size of the array is\n specified by \\p numDevices.\n\n No two kernels can be launched on the same device. All the devices targeted by this\n multi-device launch must be identical. All devices must have a non-zero value for the\n device attribute ::CU_DEVICE_ATTRIBUTE_COOPERATIVE_MULTI_DEVICE_LAUNCH.\n\n All kernels launched must be identical with respect to the compiled code. Note that\n any __device__, __constant__ or __managed__ variables present in the module that owns\n the kernel launched on each device, are independently instantiated on every device.\n It is the application's responsibility to ensure these variables are initialized and\n used appropriately.\n\n The size of the grids as specified in blocks, the size of the blocks themselves\n and the amount of shared memory used by each thread block must also match across\n all launched kernels.\n\n The streams used to launch these kernels must have been created via either ::cuStreamCreate\n or ::cuStreamCreateWithPriority. The NULL stream or ::CU_STREAM_LEGACY or ::CU_STREAM_PER_THREAD\n cannot be used.\n\n The total number of blocks launched per kernel cannot exceed the maximum number of blocks\n per multiprocessor as returned by ::cuOccupancyMaxActiveBlocksPerMultiprocessor (or\n ::cuOccupancyMaxActiveBlocksPerMultiprocessorWithFlags) times the number of multiprocessors\n as specified by the device attribute ::CU_DEVICE_ATTRIBUTE_MULTIPROCESSOR_COUNT. Since the\n total number of blocks launched per device has to match across all devices, the maximum\n number of blocks that can be launched per device will be limited by the device with the\n least number of multiprocessors.\n\n The kernels cannot make use of CUDA dynamic parallelism.\n\n The ::CUDA_LAUNCH_PARAMS structure is defined as:\n \\code\ntypedef struct CUDA_LAUNCH_PARAMS_st\n{\nCUfunction function;\nunsigned int gridDimX;\nunsigned int gridDimY;\nunsigned int gridDimZ;\nunsigned int blockDimX;\nunsigned int blockDimY;\nunsigned int blockDimZ;\nunsigned int sharedMemBytes;\nCUstream hStream;\nvoid **kernelParams;\n} CUDA_LAUNCH_PARAMS;\n \\endcode\n where:\n - ::CUDA_LAUNCH_PARAMS::function specifies the kernel to be launched. All functions must\n   be identical with respect to the compiled code.\n   Note that you can also specify context-less kernel ::CUkernel by querying the handle\n   using ::cuLibraryGetKernel() and then casting to ::CUfunction. In this case, the context to\n   launch the kernel on be taken from the specified stream ::CUDA_LAUNCH_PARAMS::hStream.\n - ::CUDA_LAUNCH_PARAMS::gridDimX is the width of the grid in blocks. This must match across\n   all kernels launched.\n - ::CUDA_LAUNCH_PARAMS::gridDimY is the height of the grid in blocks. This must match across\n   all kernels launched.\n - ::CUDA_LAUNCH_PARAMS::gridDimZ is the depth of the grid in blocks. This must match across\n   all kernels launched.\n - ::CUDA_LAUNCH_PARAMS::blockDimX is the X dimension of each thread block. This must match across\n   all kernels launched.\n - ::CUDA_LAUNCH_PARAMS::blockDimX is the Y dimension of each thread block. This must match across\n   all kernels launched.\n - ::CUDA_LAUNCH_PARAMS::blockDimZ is the Z dimension of each thread block. This must match across\n   all kernels launched.\n - ::CUDA_LAUNCH_PARAMS::sharedMemBytes is the dynamic shared-memory size per thread block in bytes.\n   This must match across all kernels launched.\n - ::CUDA_LAUNCH_PARAMS::hStream is the handle to the stream to perform the launch in. This cannot\n   be the NULL stream or ::CU_STREAM_LEGACY or ::CU_STREAM_PER_THREAD. The CUDA context associated\n   with this stream must match that associated with ::CUDA_LAUNCH_PARAMS::function.\n - ::CUDA_LAUNCH_PARAMS::kernelParams is an array of pointers to kernel parameters. If\n   ::CUDA_LAUNCH_PARAMS::function has N parameters, then ::CUDA_LAUNCH_PARAMS::kernelParams\n   needs to be an array of N pointers. Each of ::CUDA_LAUNCH_PARAMS::kernelParams[0] through\n   ::CUDA_LAUNCH_PARAMS::kernelParams[N-1] must point to a region of memory from which the actual\n   kernel parameter will be copied. The number of kernel parameters and their offsets and sizes\n   do not need to be specified as that information is retrieved directly from the kernel's image.\n\n By default, the kernel won't begin execution on any GPU until all prior work in all the specified\n streams has completed. This behavior can be overridden by specifying the flag\n ::CUDA_COOPERATIVE_LAUNCH_MULTI_DEVICE_NO_PRE_LAUNCH_SYNC. When this flag is specified, each kernel\n will only wait for prior work in the stream corresponding to that GPU to complete before it begins\n execution.\n\n Similarly, by default, any subsequent work pushed in any of the specified streams will not begin\n execution until the kernels on all GPUs have completed. This behavior can be overridden by specifying\n the flag ::CUDA_COOPERATIVE_LAUNCH_MULTI_DEVICE_NO_POST_LAUNCH_SYNC. When this flag is specified,\n any subsequent work pushed in any of the specified streams will only wait for the kernel launched\n on the GPU corresponding to that stream to complete before it begins execution.\n\n Calling ::cuLaunchCooperativeKernelMultiDevice() sets persistent function state that is\n the same as function state set through ::cuLaunchKernel API when called individually for each\n element in \\p launchParamsList.\n\n When kernels are launched via ::cuLaunchCooperativeKernelMultiDevice(), the previous\n block shape, shared size and parameter info associated with each ::CUDA_LAUNCH_PARAMS::function\n in \\p launchParamsList is overwritten.\n\n Note that to use ::cuLaunchCooperativeKernelMultiDevice(), the kernels must either have\n been compiled with toolchain version 3.2 or later so that it will\n contain kernel parameter information, or have no kernel parameters.\n If either of these conditions is not met, then ::cuLaunchCooperativeKernelMultiDevice() will\n return ::CUDA_ERROR_INVALID_IMAGE.\n\n \\param launchParamsList - List of launch parameters, one per device\n \\param numDevices       - Size of the \\p launchParamsList array\n \\param flags            - Flags to control launch behavior\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_IMAGE,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_LAUNCH_FAILED,\n ::CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES,\n ::CUDA_ERROR_LAUNCH_TIMEOUT,\n ::CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING,\n ::CUDA_ERROR_COOPERATIVE_LAUNCH_TOO_LARGE,\n ::CUDA_ERROR_SHARED_OBJECT_INIT_FAILED\n \\note_null_stream\n \\notefnerr\n\n \\sa ::cuCtxGetCacheConfig,\n ::cuCtxSetCacheConfig,\n ::cuFuncSetCacheConfig,\n ::cuFuncGetAttribute,\n ::cuLaunchCooperativeKernel,\n ::cudaLaunchCooperativeKernelMultiDevice*/\n    fn cuLaunchCooperativeKernelMultiDevice(\n        launchParamsList: *mut cuda_types::cuda::CUDA_LAUNCH_PARAMS,\n        numDevices: ::core::ffi::c_uint,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Enqueues a host function call in a stream\n\n Enqueues a host function to run in a stream.  The function will be called\n after currently enqueued work and will block work added after it.\n\n The host function must not make any CUDA API calls.  Attempting to use a\n CUDA API may result in ::CUDA_ERROR_NOT_PERMITTED, but this is not required.\n The host function must not perform any synchronization that may depend on\n outstanding CUDA work not mandated to run earlier.  Host functions without a\n mandated order (such as in independent streams) execute in undefined order\n and may be serialized.\n\n For the purposes of Unified Memory, execution makes a number of guarantees:\n <ul>\n   <li>The stream is considered idle for the duration of the function's\n   execution.  Thus, for example, the function may always use memory attached\n   to the stream it was enqueued in.</li>\n   <li>The start of execution of the function has the same effect as\n   synchronizing an event recorded in the same stream immediately prior to\n   the function.  It thus synchronizes streams which have been \"joined\"\n   prior to the function.</li>\n   <li>Adding device work to any stream does not have the effect of making\n   the stream active until all preceding host functions and stream callbacks\n   have executed.  Thus, for\n   example, a function might use global attached memory even if work has\n   been added to another stream, if the work has been ordered behind the\n   function call with an event.</li>\n   <li>Completion of the function does not cause a stream to become\n   active except as described above.  The stream will remain idle\n   if no device work follows the function, and will remain idle across\n   consecutive host functions or stream callbacks without device work in\n   between.  Thus, for example,\n   stream synchronization can be done by signaling from a host function at the\n   end of the stream.</li>\n </ul>\n\n Note that, in contrast to ::cuStreamAddCallback, the function will not be\n called in the event of an error in the CUDA context.\n\n \\param hStream  - Stream to enqueue function call in\n \\param fn       - The function to call once preceding stream operations are complete\n \\param userData - User-specified data to be passed to the function\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_NOT_SUPPORTED\n \\note_null_stream\n \\notefnerr\n\n \\sa ::cuStreamCreate,\n ::cuStreamQuery,\n ::cuStreamSynchronize,\n ::cuStreamWaitEvent,\n ::cuStreamDestroy,\n ::cuMemAllocManaged,\n ::cuStreamAttachMemAsync,\n ::cuStreamAddCallback*/\n    fn cuLaunchHostFunc_ptsz(\n        hStream: cuda_types::cuda::CUstream,\n        fn_: cuda_types::cuda::CUhostFn,\n        userData: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the block-dimensions for the function\n\n \\deprecated\n\n Specifies the \\p x, \\p y, and \\p z dimensions of the thread blocks that are\n created when the kernel given by \\p hfunc is launched.\n\n \\param hfunc - Kernel to specify dimensions of\n \\param x     - X dimension\n \\param y     - Y dimension\n \\param z     - Z dimension\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa ::cuFuncSetSharedSize,\n ::cuFuncSetCacheConfig,\n ::cuFuncGetAttribute,\n ::cuParamSetSize,\n ::cuParamSeti,\n ::cuParamSetf,\n ::cuParamSetv,\n ::cuLaunch,\n ::cuLaunchGrid,\n ::cuLaunchGridAsync,\n ::cuLaunchKernel*/\n    fn cuFuncSetBlockShape(\n        hfunc: cuda_types::cuda::CUfunction,\n        x: ::core::ffi::c_int,\n        y: ::core::ffi::c_int,\n        z: ::core::ffi::c_int,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the dynamic shared-memory size for the function\n\n \\deprecated\n\n Sets through \\p bytes the amount of dynamic shared memory that will be\n available to each thread block when the kernel given by \\p hfunc is launched.\n\n \\param hfunc - Kernel to specify dynamic shared-memory size for\n \\param bytes - Dynamic shared-memory size per thread in bytes\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa ::cuFuncSetBlockShape,\n ::cuFuncSetCacheConfig,\n ::cuFuncGetAttribute,\n ::cuParamSetSize,\n ::cuParamSeti,\n ::cuParamSetf,\n ::cuParamSetv,\n ::cuLaunch,\n ::cuLaunchGrid,\n ::cuLaunchGridAsync,\n ::cuLaunchKernel*/\n    fn cuFuncSetSharedSize(\n        hfunc: cuda_types::cuda::CUfunction,\n        bytes: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the parameter size for the function\n\n \\deprecated\n\n Sets through \\p numbytes the total size in bytes needed by the function\n parameters of the kernel corresponding to \\p hfunc.\n\n \\param hfunc    - Kernel to set parameter size for\n \\param numbytes - Size of parameter list in bytes\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa ::cuFuncSetBlockShape,\n ::cuFuncSetSharedSize,\n ::cuFuncGetAttribute,\n ::cuParamSetf,\n ::cuParamSeti,\n ::cuParamSetv,\n ::cuLaunch,\n ::cuLaunchGrid,\n ::cuLaunchGridAsync,\n ::cuLaunchKernel*/\n    fn cuParamSetSize(\n        hfunc: cuda_types::cuda::CUfunction,\n        numbytes: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Adds an integer parameter to the function's argument list\n\n \\deprecated\n\n Sets an integer parameter that will be specified the next time the\n kernel corresponding to \\p hfunc will be invoked. \\p offset is a byte offset.\n\n \\param hfunc  - Kernel to add parameter to\n \\param offset - Offset to add parameter to argument list\n \\param value  - Value of parameter\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa ::cuFuncSetBlockShape,\n ::cuFuncSetSharedSize,\n ::cuFuncGetAttribute,\n ::cuParamSetSize,\n ::cuParamSetf,\n ::cuParamSetv,\n ::cuLaunch,\n ::cuLaunchGrid,\n ::cuLaunchGridAsync,\n ::cuLaunchKernel*/\n    fn cuParamSeti(\n        hfunc: cuda_types::cuda::CUfunction,\n        offset: ::core::ffi::c_int,\n        value: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Adds a floating-point parameter to the function's argument list\n\n \\deprecated\n\n Sets a floating-point parameter that will be specified the next time the\n kernel corresponding to \\p hfunc will be invoked. \\p offset is a byte offset.\n\n \\param hfunc  - Kernel to add parameter to\n \\param offset - Offset to add parameter to argument list\n \\param value  - Value of parameter\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa ::cuFuncSetBlockShape,\n ::cuFuncSetSharedSize,\n ::cuFuncGetAttribute,\n ::cuParamSetSize,\n ::cuParamSeti,\n ::cuParamSetv,\n ::cuLaunch,\n ::cuLaunchGrid,\n ::cuLaunchGridAsync,\n ::cuLaunchKernel*/\n    fn cuParamSetf(\n        hfunc: cuda_types::cuda::CUfunction,\n        offset: ::core::ffi::c_int,\n        value: f32,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Adds arbitrary data to the function's argument list\n\n \\deprecated\n\n Copies an arbitrary amount of data (specified in \\p numbytes) from \\p ptr\n into the parameter space of the kernel corresponding to \\p hfunc. \\p offset\n is a byte offset.\n\n \\param hfunc    - Kernel to add data to\n \\param offset   - Offset to add data to argument list\n \\param ptr      - Pointer to arbitrary data\n \\param numbytes - Size of data to copy in bytes\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa ::cuFuncSetBlockShape,\n ::cuFuncSetSharedSize,\n ::cuFuncGetAttribute,\n ::cuParamSetSize,\n ::cuParamSetf,\n ::cuParamSeti,\n ::cuLaunch,\n ::cuLaunchGrid,\n ::cuLaunchGridAsync,\n ::cuLaunchKernel*/\n    fn cuParamSetv(\n        hfunc: cuda_types::cuda::CUfunction,\n        offset: ::core::ffi::c_int,\n        ptr: *mut ::core::ffi::c_void,\n        numbytes: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Launches a CUDA function\n\n \\deprecated\n\n Invokes the kernel \\p f on a 1 x 1 x 1 grid of blocks. The block\n contains the number of threads specified by a previous call to\n ::cuFuncSetBlockShape().\n\n The block shape, dynamic shared memory size, and parameter information\n must be set using\n  ::cuFuncSetBlockShape(),\n  ::cuFuncSetSharedSize(),\n  ::cuParamSetSize(),\n  ::cuParamSeti(),\n  ::cuParamSetf(), and\n  ::cuParamSetv()\n prior to calling this function.\n\n Launching a function via ::cuLaunchKernel() invalidates the function's\n block shape, dynamic shared memory size, and parameter information. After\n launching via cuLaunchKernel, this state must be re-initialized prior to\n calling this function. Failure to do so results in undefined behavior.\n\n \\param f - Kernel to launch\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_LAUNCH_FAILED,\n ::CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES,\n ::CUDA_ERROR_LAUNCH_TIMEOUT,\n ::CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING,\n ::CUDA_ERROR_SHARED_OBJECT_INIT_FAILED\n \\notefnerr\n\n \\sa ::cuFuncSetBlockShape,\n ::cuFuncSetSharedSize,\n ::cuFuncGetAttribute,\n ::cuParamSetSize,\n ::cuParamSetf,\n ::cuParamSeti,\n ::cuParamSetv,\n ::cuLaunchGrid,\n ::cuLaunchGridAsync,\n ::cuLaunchKernel*/\n    fn cuLaunch(f: cuda_types::cuda::CUfunction) -> cuda_types::cuda::CUresult;\n    /** \\brief Launches a CUDA function\n\n \\deprecated\n\n Invokes the kernel \\p f on a \\p grid_width x \\p grid_height grid of\n blocks. Each block contains the number of threads specified by a previous\n call to ::cuFuncSetBlockShape().\n\n The block shape, dynamic shared memory size, and parameter information\n must be set using\n  ::cuFuncSetBlockShape(),\n  ::cuFuncSetSharedSize(),\n  ::cuParamSetSize(),\n  ::cuParamSeti(),\n  ::cuParamSetf(), and\n  ::cuParamSetv()\n prior to calling this function.\n\n Launching a function via ::cuLaunchKernel() invalidates the function's\n block shape, dynamic shared memory size, and parameter information. After\n launching via cuLaunchKernel, this state must be re-initialized prior to\n calling this function. Failure to do so results in undefined behavior.\n\n \\param f           - Kernel to launch\n \\param grid_width  - Width of grid in blocks\n \\param grid_height - Height of grid in blocks\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_LAUNCH_FAILED,\n ::CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES,\n ::CUDA_ERROR_LAUNCH_TIMEOUT,\n ::CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING,\n ::CUDA_ERROR_SHARED_OBJECT_INIT_FAILED\n \\notefnerr\n\n \\sa ::cuFuncSetBlockShape,\n ::cuFuncSetSharedSize,\n ::cuFuncGetAttribute,\n ::cuParamSetSize,\n ::cuParamSetf,\n ::cuParamSeti,\n ::cuParamSetv,\n ::cuLaunch,\n ::cuLaunchGridAsync,\n ::cuLaunchKernel*/\n    fn cuLaunchGrid(\n        f: cuda_types::cuda::CUfunction,\n        grid_width: ::core::ffi::c_int,\n        grid_height: ::core::ffi::c_int,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Launches a CUDA function\n\n \\deprecated\n\n Invokes the kernel \\p f on a \\p grid_width x \\p grid_height grid of\n blocks. Each block contains the number of threads specified by a previous\n call to ::cuFuncSetBlockShape().\n\n The block shape, dynamic shared memory size, and parameter information\n must be set using\n  ::cuFuncSetBlockShape(),\n  ::cuFuncSetSharedSize(),\n  ::cuParamSetSize(),\n  ::cuParamSeti(),\n  ::cuParamSetf(), and\n  ::cuParamSetv()\n prior to calling this function.\n\n Launching a function via ::cuLaunchKernel() invalidates the function's\n block shape, dynamic shared memory size, and parameter information. After\n launching via cuLaunchKernel, this state must be re-initialized prior to\n calling this function. Failure to do so results in undefined behavior.\n\n \\param f           - Kernel to launch\n \\param grid_width  - Width of grid in blocks\n \\param grid_height - Height of grid in blocks\n \\param hStream     - Stream identifier\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_LAUNCH_FAILED,\n ::CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES,\n ::CUDA_ERROR_LAUNCH_TIMEOUT,\n ::CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING,\n ::CUDA_ERROR_SHARED_OBJECT_INIT_FAILED\n\n \\note In certain cases where cubins are created with no ABI (i.e., using \\p ptxas \\p --abi-compile \\p no),\n       this function may serialize kernel launches. The CUDA driver retains asynchronous behavior by\n       growing the per-thread stack as needed per launch and not shrinking it afterwards.\n\n \\note_null_stream\n \\notefnerr\n\n \\sa ::cuFuncSetBlockShape,\n ::cuFuncSetSharedSize,\n ::cuFuncGetAttribute,\n ::cuParamSetSize,\n ::cuParamSetf,\n ::cuParamSeti,\n ::cuParamSetv,\n ::cuLaunch,\n ::cuLaunchGrid,\n ::cuLaunchKernel*/\n    fn cuLaunchGridAsync(\n        f: cuda_types::cuda::CUfunction,\n        grid_width: ::core::ffi::c_int,\n        grid_height: ::core::ffi::c_int,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Adds a texture-reference to the function's argument list\n\n \\deprecated\n\n Makes the CUDA array or linear memory bound to the texture reference\n \\p hTexRef available to a device program as a texture. In this version of\n CUDA, the texture-reference must be obtained via ::cuModuleGetTexRef() and\n the \\p texunit parameter must be set to ::CU_PARAM_TR_DEFAULT.\n\n \\param hfunc   - Kernel to add texture-reference to\n \\param texunit - Texture unit (must be ::CU_PARAM_TR_DEFAULT)\n \\param hTexRef - Texture-reference to add to argument list\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr*/\n    fn cuParamSetTexRef(\n        hfunc: cuda_types::cuda::CUfunction,\n        texunit: ::core::ffi::c_int,\n        hTexRef: cuda_types::cuda::CUtexref,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the shared memory configuration for a device function.\n\n \\deprecated\n\n On devices with configurable shared memory banks, this function will\n force all subsequent launches of the specified device function to have\n the given shared memory bank size configuration. On any given launch of the\n function, the shared memory configuration of the device will be temporarily\n changed if needed to suit the function's preferred configuration. Changes in\n shared memory configuration between subsequent launches of functions,\n may introduce a device side synchronization point.\n\n Any per-function setting of shared memory bank size set via\n ::cuFuncSetSharedMemConfig will override the context wide setting set with\n ::cuCtxSetSharedMemConfig.\n\n Changing the shared memory bank size will not increase shared memory usage\n or affect occupancy of kernels, but may have major effects on performance.\n Larger bank sizes will allow for greater potential bandwidth to shared memory,\n but will change what kinds of accesses to shared memory will result in bank\n conflicts.\n\n This function will do nothing on devices with fixed shared memory bank size.\n\n The supported bank configurations are:\n - ::CU_SHARED_MEM_CONFIG_DEFAULT_BANK_SIZE: use the context's shared memory\n   configuration when launching this function.\n - ::CU_SHARED_MEM_CONFIG_FOUR_BYTE_BANK_SIZE: set shared memory bank width to\n   be natively four bytes when launching this function.\n - ::CU_SHARED_MEM_CONFIG_EIGHT_BYTE_BANK_SIZE: set shared memory bank width to\n   be natively eight bytes when launching this function.\n\n \\param hfunc  - kernel to be given a shared memory config\n \\param config - requested shared memory configuration\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT\n \\notefnerr\n\n \\sa ::cuCtxGetCacheConfig,\n ::cuCtxSetCacheConfig,\n ::cuCtxGetSharedMemConfig,\n ::cuCtxSetSharedMemConfig,\n ::cuFuncGetAttribute,\n ::cuLaunchKernel,\n ::cudaFuncSetSharedMemConfig*/\n    fn cuFuncSetSharedMemConfig(\n        hfunc: cuda_types::cuda::CUfunction,\n        config: cuda_types::cuda::CUsharedconfig,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Creates a graph\n\n Creates an empty graph, which is returned via \\p phGraph.\n\n \\param phGraph - Returns newly created graph\n \\param flags   - Graph creation flags, must be 0\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_OUT_OF_MEMORY\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphAddChildGraphNode,\n ::cuGraphAddEmptyNode,\n ::cuGraphAddKernelNode,\n ::cuGraphAddHostNode,\n ::cuGraphAddMemcpyNode,\n ::cuGraphAddMemsetNode,\n ::cuGraphInstantiate,\n ::cuGraphDestroy,\n ::cuGraphGetNodes,\n ::cuGraphGetRootNodes,\n ::cuGraphGetEdges,\n ::cuGraphClone*/\n    fn cuGraphCreate(\n        phGraph: *mut cuda_types::cuda::CUgraph,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Creates a kernel execution node and adds it to a graph\n\n Creates a new kernel execution node and adds it to \\p hGraph with \\p numDependencies\n dependencies specified via \\p dependencies and arguments specified in \\p nodeParams.\n It is possible for \\p numDependencies to be 0, in which case the node will be placed\n at the root of the graph. \\p dependencies may not have any duplicate entries.\n A handle to the new node will be returned in \\p phGraphNode.\n\n The CUDA_KERNEL_NODE_PARAMS structure is defined as:\n\n \\code\n  typedef struct CUDA_KERNEL_NODE_PARAMS_st {\n      CUfunction func;\n      unsigned int gridDimX;\n      unsigned int gridDimY;\n      unsigned int gridDimZ;\n      unsigned int blockDimX;\n      unsigned int blockDimY;\n      unsigned int blockDimZ;\n      unsigned int sharedMemBytes;\n      void **kernelParams;\n      void **extra;\n      CUkernel kern;\n      CUcontext ctx;\n  } CUDA_KERNEL_NODE_PARAMS;\n \\endcode\n\n When the graph is launched, the node will invoke kernel \\p func on a (\\p gridDimX x\n \\p gridDimY x \\p gridDimZ) grid of blocks. Each block contains\n (\\p blockDimX x \\p blockDimY x \\p blockDimZ) threads.\n\n \\p sharedMemBytes sets the amount of dynamic shared memory that will be\n available to each thread block.\n\n Kernel parameters to \\p func can be specified in one of two ways:\n\n 1) Kernel parameters can be specified via \\p kernelParams. If the kernel has N\n parameters, then \\p kernelParams needs to be an array of N pointers. Each pointer,\n from \\p kernelParams[0] to \\p kernelParams[N-1], points to the region of memory from which the actual\n parameter will be copied. The number of kernel parameters and their offsets and sizes do not need\n to be specified as that information is retrieved directly from the kernel's image.\n\n 2) Kernel parameters for non-cooperative kernels can also be packaged by the application into a single\n buffer that is passed in via \\p extra. This places the burden on the application of knowing each\n kernel parameter's size and alignment/padding within the buffer. The \\p extra parameter exists\n to allow this function to take additional less commonly used arguments. \\p extra specifies\n a list of names of extra settings and their corresponding values. Each extra setting name is\n immediately followed by the corresponding value. The list must be terminated with either NULL or\n CU_LAUNCH_PARAM_END.\n\n - ::CU_LAUNCH_PARAM_END, which indicates the end of the \\p extra\n   array;\n - ::CU_LAUNCH_PARAM_BUFFER_POINTER, which specifies that the next\n   value in \\p extra will be a pointer to a buffer\n   containing all the kernel parameters for launching kernel\n   \\p func;\n - ::CU_LAUNCH_PARAM_BUFFER_SIZE, which specifies that the next\n   value in \\p extra will be a pointer to a size_t\n   containing the size of the buffer specified with\n   ::CU_LAUNCH_PARAM_BUFFER_POINTER;\n\n The error ::CUDA_ERROR_INVALID_VALUE will be returned if kernel parameters are specified with both\n \\p kernelParams and \\p extra (i.e. both \\p kernelParams and \\p extra are non-NULL).\n ::CUDA_ERROR_INVALID_VALUE will be returned if \\p extra is used for a cooperative kernel.\n\n The \\p kernelParams or \\p extra array, as well as the argument values it points to,\n are copied during this call.\n\n \\note Kernels launched using graphs must not use texture and surface references. Reading or\n       writing through any texture or surface reference is undefined behavior.\n       This restriction does not apply to texture and surface objects.\n\n \\param phGraphNode     - Returns newly created node\n \\param hGraph          - Graph to which to add the node\n \\param dependencies    - Dependencies of the node\n \\param numDependencies - Number of dependencies\n \\param nodeParams      - Parameters for the GPU execution node\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphAddNode,\n ::cuLaunchKernel,\n ::cuLaunchCooperativeKernel,\n ::cuGraphKernelNodeGetParams,\n ::cuGraphKernelNodeSetParams,\n ::cuGraphCreate,\n ::cuGraphDestroyNode,\n ::cuGraphAddChildGraphNode,\n ::cuGraphAddEmptyNode,\n ::cuGraphAddHostNode,\n ::cuGraphAddMemcpyNode,\n ::cuGraphAddMemsetNode*/\n    fn cuGraphAddKernelNode_v2(\n        phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n        hGraph: cuda_types::cuda::CUgraph,\n        dependencies: *const cuda_types::cuda::CUgraphNode,\n        numDependencies: usize,\n        nodeParams: *const cuda_types::cuda::CUDA_KERNEL_NODE_PARAMS,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a kernel node's parameters\n\n Returns the parameters of kernel node \\p hNode in \\p nodeParams.\n The \\p kernelParams or \\p extra array returned in \\p nodeParams,\n as well as the argument values it points to, are owned by the node.\n This memory remains valid until the node is destroyed or its\n parameters are modified, and should not be modified\n directly. Use ::cuGraphKernelNodeSetParams to update the\n parameters of this node.\n\n The params will contain either \\p kernelParams or \\p extra,\n according to which of these was most recently set on the node.\n\n \\param hNode      - Node to get the parameters for\n \\param nodeParams - Pointer to return the parameters\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuLaunchKernel,\n ::cuGraphAddKernelNode,\n ::cuGraphKernelNodeSetParams*/\n    fn cuGraphKernelNodeGetParams_v2(\n        hNode: cuda_types::cuda::CUgraphNode,\n        nodeParams: *mut cuda_types::cuda::CUDA_KERNEL_NODE_PARAMS,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets a kernel node's parameters\n\n Sets the parameters of kernel node \\p hNode to \\p nodeParams.\n\n \\param hNode      - Node to set the parameters for\n \\param nodeParams - Parameters to copy\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_OUT_OF_MEMORY\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphNodeSetParams,\n ::cuLaunchKernel,\n ::cuGraphAddKernelNode,\n ::cuGraphKernelNodeGetParams*/\n    fn cuGraphKernelNodeSetParams_v2(\n        hNode: cuda_types::cuda::CUgraphNode,\n        nodeParams: *const cuda_types::cuda::CUDA_KERNEL_NODE_PARAMS,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Creates a memcpy node and adds it to a graph\n\n Creates a new memcpy node and adds it to \\p hGraph with \\p numDependencies\n dependencies specified via \\p dependencies.\n It is possible for \\p numDependencies to be 0, in which case the node will be placed\n at the root of the graph. \\p dependencies may not have any duplicate entries.\n A handle to the new node will be returned in \\p phGraphNode.\n\n When the graph is launched, the node will perform the memcpy described by \\p copyParams.\n See ::cuMemcpy3D() for a description of the structure and its restrictions.\n\n Memcpy nodes have some additional restrictions with regards to managed memory, if the\n system contains at least one device which has a zero value for the device attribute\n ::CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS. If one or more of the operands refer\n to managed memory, then using the memory type ::CU_MEMORYTYPE_UNIFIED is disallowed\n for those operand(s). The managed memory will be treated as residing on either the\n host or the device, depending on which memory type is specified.\n\n \\param phGraphNode     - Returns newly created node\n \\param hGraph          - Graph to which to add the node\n \\param dependencies    - Dependencies of the node\n \\param numDependencies - Number of dependencies\n \\param copyParams      - Parameters for the memory copy\n \\param ctx             - Context on which to run the node\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphAddNode,\n ::cuMemcpy3D,\n ::cuGraphMemcpyNodeGetParams,\n ::cuGraphMemcpyNodeSetParams,\n ::cuGraphCreate,\n ::cuGraphDestroyNode,\n ::cuGraphAddChildGraphNode,\n ::cuGraphAddEmptyNode,\n ::cuGraphAddKernelNode,\n ::cuGraphAddHostNode,\n ::cuGraphAddMemsetNode*/\n    fn cuGraphAddMemcpyNode(\n        phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n        hGraph: cuda_types::cuda::CUgraph,\n        dependencies: *const cuda_types::cuda::CUgraphNode,\n        numDependencies: usize,\n        copyParams: *const cuda_types::cuda::CUDA_MEMCPY3D,\n        ctx: cuda_types::cuda::CUcontext,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a memcpy node's parameters\n\n Returns the parameters of memcpy node \\p hNode in \\p nodeParams.\n\n \\param hNode      - Node to get the parameters for\n \\param nodeParams - Pointer to return the parameters\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuMemcpy3D,\n ::cuGraphAddMemcpyNode,\n ::cuGraphMemcpyNodeSetParams*/\n    fn cuGraphMemcpyNodeGetParams(\n        hNode: cuda_types::cuda::CUgraphNode,\n        nodeParams: *mut cuda_types::cuda::CUDA_MEMCPY3D,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets a memcpy node's parameters\n\n Sets the parameters of memcpy node \\p hNode to \\p nodeParams.\n\n \\param hNode      - Node to set the parameters for\n \\param nodeParams - Parameters to copy\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphNodeSetParams,\n ::cuMemcpy3D,\n ::cuGraphAddMemcpyNode,\n ::cuGraphMemcpyNodeGetParams*/\n    fn cuGraphMemcpyNodeSetParams(\n        hNode: cuda_types::cuda::CUgraphNode,\n        nodeParams: *const cuda_types::cuda::CUDA_MEMCPY3D,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Creates a memset node and adds it to a graph\n\n Creates a new memset node and adds it to \\p hGraph with \\p numDependencies\n dependencies specified via \\p dependencies.\n It is possible for \\p numDependencies to be 0, in which case the node will be placed\n at the root of the graph. \\p dependencies may not have any duplicate entries.\n A handle to the new node will be returned in \\p phGraphNode.\n\n The element size must be 1, 2, or 4 bytes.\n When the graph is launched, the node will perform the memset described by \\p memsetParams.\n\n \\param phGraphNode     - Returns newly created node\n \\param hGraph          - Graph to which to add the node\n \\param dependencies    - Dependencies of the node\n \\param numDependencies - Number of dependencies\n \\param memsetParams    - Parameters for the memory set\n \\param ctx             - Context on which to run the node\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_CONTEXT\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphAddNode,\n ::cuMemsetD2D32,\n ::cuGraphMemsetNodeGetParams,\n ::cuGraphMemsetNodeSetParams,\n ::cuGraphCreate,\n ::cuGraphDestroyNode,\n ::cuGraphAddChildGraphNode,\n ::cuGraphAddEmptyNode,\n ::cuGraphAddKernelNode,\n ::cuGraphAddHostNode,\n ::cuGraphAddMemcpyNode*/\n    fn cuGraphAddMemsetNode(\n        phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n        hGraph: cuda_types::cuda::CUgraph,\n        dependencies: *const cuda_types::cuda::CUgraphNode,\n        numDependencies: usize,\n        memsetParams: *const cuda_types::cuda::CUDA_MEMSET_NODE_PARAMS,\n        ctx: cuda_types::cuda::CUcontext,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a memset node's parameters\n\n Returns the parameters of memset node \\p hNode in \\p nodeParams.\n\n \\param hNode      - Node to get the parameters for\n \\param nodeParams - Pointer to return the parameters\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuMemsetD2D32,\n ::cuGraphAddMemsetNode,\n ::cuGraphMemsetNodeSetParams*/\n    fn cuGraphMemsetNodeGetParams(\n        hNode: cuda_types::cuda::CUgraphNode,\n        nodeParams: *mut cuda_types::cuda::CUDA_MEMSET_NODE_PARAMS,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets a memset node's parameters\n\n Sets the parameters of memset node \\p hNode to \\p nodeParams.\n\n \\param hNode      - Node to set the parameters for\n \\param nodeParams - Parameters to copy\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphNodeSetParams,\n ::cuMemsetD2D32,\n ::cuGraphAddMemsetNode,\n ::cuGraphMemsetNodeGetParams*/\n    fn cuGraphMemsetNodeSetParams(\n        hNode: cuda_types::cuda::CUgraphNode,\n        nodeParams: *const cuda_types::cuda::CUDA_MEMSET_NODE_PARAMS,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Creates a host execution node and adds it to a graph\n\n Creates a new CPU execution node and adds it to \\p hGraph with \\p numDependencies\n dependencies specified via \\p dependencies and arguments specified in \\p nodeParams.\n It is possible for \\p numDependencies to be 0, in which case the node will be placed\n at the root of the graph. \\p dependencies may not have any duplicate entries.\n A handle to the new node will be returned in \\p phGraphNode.\n\n When the graph is launched, the node will invoke the specified CPU function.\n Host nodes are not supported under MPS with pre-Volta GPUs.\n\n \\param phGraphNode     - Returns newly created node\n \\param hGraph          - Graph to which to add the node\n \\param dependencies    - Dependencies of the node\n \\param numDependencies - Number of dependencies\n \\param nodeParams      - Parameters for the host node\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_NOT_SUPPORTED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphAddNode,\n ::cuLaunchHostFunc,\n ::cuGraphHostNodeGetParams,\n ::cuGraphHostNodeSetParams,\n ::cuGraphCreate,\n ::cuGraphDestroyNode,\n ::cuGraphAddChildGraphNode,\n ::cuGraphAddEmptyNode,\n ::cuGraphAddKernelNode,\n ::cuGraphAddMemcpyNode,\n ::cuGraphAddMemsetNode*/\n    fn cuGraphAddHostNode(\n        phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n        hGraph: cuda_types::cuda::CUgraph,\n        dependencies: *const cuda_types::cuda::CUgraphNode,\n        numDependencies: usize,\n        nodeParams: *const cuda_types::cuda::CUDA_HOST_NODE_PARAMS,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a host node's parameters\n\n Returns the parameters of host node \\p hNode in \\p nodeParams.\n\n \\param hNode      - Node to get the parameters for\n \\param nodeParams - Pointer to return the parameters\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuLaunchHostFunc,\n ::cuGraphAddHostNode,\n ::cuGraphHostNodeSetParams*/\n    fn cuGraphHostNodeGetParams(\n        hNode: cuda_types::cuda::CUgraphNode,\n        nodeParams: *mut cuda_types::cuda::CUDA_HOST_NODE_PARAMS,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets a host node's parameters\n\n Sets the parameters of host node \\p hNode to \\p nodeParams.\n\n \\param hNode      - Node to set the parameters for\n \\param nodeParams - Parameters to copy\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphNodeSetParams,\n ::cuLaunchHostFunc,\n ::cuGraphAddHostNode,\n ::cuGraphHostNodeGetParams*/\n    fn cuGraphHostNodeSetParams(\n        hNode: cuda_types::cuda::CUgraphNode,\n        nodeParams: *const cuda_types::cuda::CUDA_HOST_NODE_PARAMS,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Creates a child graph node and adds it to a graph\n\n Creates a new node which executes an embedded graph, and adds it to \\p hGraph with\n \\p numDependencies dependencies specified via \\p dependencies.\n It is possible for \\p numDependencies to be 0, in which case the node will be placed\n at the root of the graph. \\p dependencies may not have any duplicate entries.\n A handle to the new node will be returned in \\p phGraphNode.\n\n If \\p childGraph contains allocation nodes, free nodes, or conditional nodes, this call will\n return an error.\n\n The node executes an embedded child graph. The child graph is cloned in this call.\n\n \\param phGraphNode     - Returns newly created node\n \\param hGraph          - Graph to which to add the node\n \\param dependencies    - Dependencies of the node\n \\param numDependencies - Number of dependencies\n \\param childGraph      - The graph to clone into this node\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphAddNode,\n ::cuGraphChildGraphNodeGetGraph,\n ::cuGraphCreate,\n ::cuGraphDestroyNode,\n ::cuGraphAddEmptyNode,\n ::cuGraphAddKernelNode,\n ::cuGraphAddHostNode,\n ::cuGraphAddMemcpyNode,\n ::cuGraphAddMemsetNode,\n ::cuGraphClone*/\n    fn cuGraphAddChildGraphNode(\n        phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n        hGraph: cuda_types::cuda::CUgraph,\n        dependencies: *const cuda_types::cuda::CUgraphNode,\n        numDependencies: usize,\n        childGraph: cuda_types::cuda::CUgraph,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Gets a handle to the embedded graph of a child graph node\n\n Gets a handle to the embedded graph in a child graph node. This call\n does not clone the graph. Changes to the graph will be reflected in\n the node, and the node retains ownership of the graph.\n\n Allocation and free nodes cannot be added to the returned graph.\n Attempting to do so will return an error.\n\n \\param hNode   - Node to get the embedded graph for\n \\param phGraph - Location to store a handle to the graph\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphAddChildGraphNode,\n ::cuGraphNodeFindInClone*/\n    fn cuGraphChildGraphNodeGetGraph(\n        hNode: cuda_types::cuda::CUgraphNode,\n        phGraph: *mut cuda_types::cuda::CUgraph,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Creates an empty node and adds it to a graph\n\n Creates a new node which performs no operation, and adds it to \\p hGraph with\n \\p numDependencies dependencies specified via \\p dependencies.\n It is possible for \\p numDependencies to be 0, in which case the node will be placed\n at the root of the graph. \\p dependencies may not have any duplicate entries.\n A handle to the new node will be returned in \\p phGraphNode.\n\n An empty node performs no operation during execution, but can be used for\n transitive ordering. For example, a phased execution graph with 2 groups of n\n nodes with a barrier between them can be represented using an empty node and\n 2*n dependency edges, rather than no empty node and n^2 dependency edges.\n\n \\param phGraphNode     - Returns newly created node\n \\param hGraph          - Graph to which to add the node\n \\param dependencies    - Dependencies of the node\n \\param numDependencies - Number of dependencies\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphAddNode,\n ::cuGraphCreate,\n ::cuGraphDestroyNode,\n ::cuGraphAddChildGraphNode,\n ::cuGraphAddKernelNode,\n ::cuGraphAddHostNode,\n ::cuGraphAddMemcpyNode,\n ::cuGraphAddMemsetNode*/\n    fn cuGraphAddEmptyNode(\n        phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n        hGraph: cuda_types::cuda::CUgraph,\n        dependencies: *const cuda_types::cuda::CUgraphNode,\n        numDependencies: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Creates an event record node and adds it to a graph\n\n Creates a new event record node and adds it to \\p hGraph with \\p numDependencies\n dependencies specified via \\p dependencies and event specified in \\p event.\n It is possible for \\p numDependencies to be 0, in which case the node will be placed\n at the root of the graph. \\p dependencies may not have any duplicate entries.\n A handle to the new node will be returned in \\p phGraphNode.\n\n Each launch of the graph will record \\p event to capture execution of the\n node's dependencies.\n\n \\param phGraphNode     - Returns newly created node\n \\param hGraph          - Graph to which to add the node\n \\param dependencies    - Dependencies of the node\n \\param numDependencies - Number of dependencies\n \\param event           - Event for the node\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_NOT_SUPPORTED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphAddNode,\n ::cuGraphAddEventWaitNode,\n ::cuEventRecordWithFlags,\n ::cuStreamWaitEvent,\n ::cuGraphCreate,\n ::cuGraphDestroyNode,\n ::cuGraphAddChildGraphNode,\n ::cuGraphAddEmptyNode,\n ::cuGraphAddKernelNode,\n ::cuGraphAddMemcpyNode,\n ::cuGraphAddMemsetNode*/\n    fn cuGraphAddEventRecordNode(\n        phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n        hGraph: cuda_types::cuda::CUgraph,\n        dependencies: *const cuda_types::cuda::CUgraphNode,\n        numDependencies: usize,\n        event: cuda_types::cuda::CUevent,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the event associated with an event record node\n\n Returns the event of event record node \\p hNode in \\p event_out.\n\n \\param hNode     - Node to get the event for\n \\param event_out - Pointer to return the event\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphAddEventRecordNode,\n ::cuGraphEventRecordNodeSetEvent,\n ::cuGraphEventWaitNodeGetEvent,\n ::cuEventRecordWithFlags,\n ::cuStreamWaitEvent*/\n    fn cuGraphEventRecordNodeGetEvent(\n        hNode: cuda_types::cuda::CUgraphNode,\n        event_out: *mut cuda_types::cuda::CUevent,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets an event record node's event\n\n Sets the event of event record node \\p hNode to \\p event.\n\n \\param hNode - Node to set the event for\n \\param event - Event to use\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_OUT_OF_MEMORY\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphNodeSetParams,\n ::cuGraphAddEventRecordNode,\n ::cuGraphEventRecordNodeGetEvent,\n ::cuGraphEventWaitNodeSetEvent,\n ::cuEventRecordWithFlags,\n ::cuStreamWaitEvent*/\n    fn cuGraphEventRecordNodeSetEvent(\n        hNode: cuda_types::cuda::CUgraphNode,\n        event: cuda_types::cuda::CUevent,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Creates an event wait node and adds it to a graph\n\n Creates a new event wait node and adds it to \\p hGraph with \\p numDependencies\n dependencies specified via \\p dependencies and event specified in \\p event.\n It is possible for \\p numDependencies to be 0, in which case the node will be placed\n at the root of the graph. \\p dependencies may not have any duplicate entries.\n A handle to the new node will be returned in \\p phGraphNode.\n\n The graph node will wait for all work captured in \\p event.  See ::cuEventRecord()\n for details on what is captured by an event. \\p event may be from a different context\n or device than the launch stream.\n\n \\param phGraphNode     - Returns newly created node\n \\param hGraph          - Graph to which to add the node\n \\param dependencies    - Dependencies of the node\n \\param numDependencies - Number of dependencies\n \\param event           - Event for the node\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_NOT_SUPPORTED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphAddNode,\n ::cuGraphAddEventRecordNode,\n ::cuEventRecordWithFlags,\n ::cuStreamWaitEvent,\n ::cuGraphCreate,\n ::cuGraphDestroyNode,\n ::cuGraphAddChildGraphNode,\n ::cuGraphAddEmptyNode,\n ::cuGraphAddKernelNode,\n ::cuGraphAddMemcpyNode,\n ::cuGraphAddMemsetNode*/\n    fn cuGraphAddEventWaitNode(\n        phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n        hGraph: cuda_types::cuda::CUgraph,\n        dependencies: *const cuda_types::cuda::CUgraphNode,\n        numDependencies: usize,\n        event: cuda_types::cuda::CUevent,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the event associated with an event wait node\n\n Returns the event of event wait node \\p hNode in \\p event_out.\n\n \\param hNode     - Node to get the event for\n \\param event_out - Pointer to return the event\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphAddEventWaitNode,\n ::cuGraphEventWaitNodeSetEvent,\n ::cuGraphEventRecordNodeGetEvent,\n ::cuEventRecordWithFlags,\n ::cuStreamWaitEvent*/\n    fn cuGraphEventWaitNodeGetEvent(\n        hNode: cuda_types::cuda::CUgraphNode,\n        event_out: *mut cuda_types::cuda::CUevent,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets an event wait node's event\n\n Sets the event of event wait node \\p hNode to \\p event.\n\n \\param hNode - Node to set the event for\n \\param event - Event to use\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_OUT_OF_MEMORY\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphNodeSetParams,\n ::cuGraphAddEventWaitNode,\n ::cuGraphEventWaitNodeGetEvent,\n ::cuGraphEventRecordNodeSetEvent,\n ::cuEventRecordWithFlags,\n ::cuStreamWaitEvent*/\n    fn cuGraphEventWaitNodeSetEvent(\n        hNode: cuda_types::cuda::CUgraphNode,\n        event: cuda_types::cuda::CUevent,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Creates an external semaphore signal node and adds it to a graph\n\n Creates a new external semaphore signal node and adds it to \\p hGraph with \\p\n numDependencies dependencies specified via \\p dependencies and arguments specified\n in \\p nodeParams. It is possible for \\p numDependencies to be 0, in which case the\n node will be placed at the root of the graph. \\p dependencies may not have any\n duplicate entries. A handle to the new node will be returned in \\p phGraphNode.\n\n Performs a signal operation on a set of externally allocated semaphore objects\n when the node is launched.  The operation(s) will occur after all of the node's\n dependencies have completed.\n\n \\param phGraphNode     - Returns newly created node\n \\param hGraph          - Graph to which to add the node\n \\param dependencies    - Dependencies of the node\n \\param numDependencies - Number of dependencies\n \\param nodeParams      - Parameters for the node\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_NOT_SUPPORTED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphAddNode,\n ::cuGraphExternalSemaphoresSignalNodeGetParams,\n ::cuGraphExternalSemaphoresSignalNodeSetParams,\n ::cuGraphExecExternalSemaphoresSignalNodeSetParams,\n ::cuGraphAddExternalSemaphoresWaitNode,\n ::cuImportExternalSemaphore,\n ::cuSignalExternalSemaphoresAsync,\n ::cuWaitExternalSemaphoresAsync,\n ::cuGraphCreate,\n ::cuGraphDestroyNode,\n ::cuGraphAddEventRecordNode,\n ::cuGraphAddEventWaitNode,\n ::cuGraphAddChildGraphNode,\n ::cuGraphAddEmptyNode,\n ::cuGraphAddKernelNode,\n ::cuGraphAddMemcpyNode,\n ::cuGraphAddMemsetNode*/\n    fn cuGraphAddExternalSemaphoresSignalNode(\n        phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n        hGraph: cuda_types::cuda::CUgraph,\n        dependencies: *const cuda_types::cuda::CUgraphNode,\n        numDependencies: usize,\n        nodeParams: *const cuda_types::cuda::CUDA_EXT_SEM_SIGNAL_NODE_PARAMS,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns an external semaphore signal node's parameters\n\n Returns the parameters of an external semaphore signal node \\p hNode in \\p params_out.\n The \\p extSemArray and \\p paramsArray returned in \\p params_out,\n are owned by the node.  This memory remains valid until the node is destroyed or its\n parameters are modified, and should not be modified\n directly. Use ::cuGraphExternalSemaphoresSignalNodeSetParams to update the\n parameters of this node.\n\n \\param hNode      - Node to get the parameters for\n \\param params_out - Pointer to return the parameters\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuLaunchKernel,\n ::cuGraphAddExternalSemaphoresSignalNode,\n ::cuGraphExternalSemaphoresSignalNodeSetParams,\n ::cuGraphAddExternalSemaphoresWaitNode,\n ::cuSignalExternalSemaphoresAsync,\n ::cuWaitExternalSemaphoresAsync*/\n    fn cuGraphExternalSemaphoresSignalNodeGetParams(\n        hNode: cuda_types::cuda::CUgraphNode,\n        params_out: *mut cuda_types::cuda::CUDA_EXT_SEM_SIGNAL_NODE_PARAMS,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets an external semaphore signal node's parameters\n\n Sets the parameters of an external semaphore signal node \\p hNode to \\p nodeParams.\n\n \\param hNode      - Node to set the parameters for\n \\param nodeParams - Parameters to copy\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_OUT_OF_MEMORY\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphNodeSetParams,\n ::cuGraphAddExternalSemaphoresSignalNode,\n ::cuGraphExternalSemaphoresSignalNodeSetParams,\n ::cuGraphAddExternalSemaphoresWaitNode,\n ::cuSignalExternalSemaphoresAsync,\n ::cuWaitExternalSemaphoresAsync*/\n    fn cuGraphExternalSemaphoresSignalNodeSetParams(\n        hNode: cuda_types::cuda::CUgraphNode,\n        nodeParams: *const cuda_types::cuda::CUDA_EXT_SEM_SIGNAL_NODE_PARAMS,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Creates an external semaphore wait node and adds it to a graph\n\n Creates a new external semaphore wait node and adds it to \\p hGraph with \\p numDependencies\n dependencies specified via \\p dependencies and arguments specified in \\p nodeParams.\n It is possible for \\p numDependencies to be 0, in which case the node will be placed\n at the root of the graph. \\p dependencies may not have any duplicate entries. A handle\n to the new node will be returned in \\p phGraphNode.\n\n Performs a wait operation on a set of externally allocated semaphore objects\n when the node is launched.  The node's dependencies will not be launched until\n the wait operation has completed.\n\n \\param phGraphNode     - Returns newly created node\n \\param hGraph          - Graph to which to add the node\n \\param dependencies    - Dependencies of the node\n \\param numDependencies - Number of dependencies\n \\param nodeParams      - Parameters for the node\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_NOT_SUPPORTED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphAddNode,\n ::cuGraphExternalSemaphoresWaitNodeGetParams,\n ::cuGraphExternalSemaphoresWaitNodeSetParams,\n ::cuGraphExecExternalSemaphoresWaitNodeSetParams,\n ::cuGraphAddExternalSemaphoresSignalNode,\n ::cuImportExternalSemaphore,\n ::cuSignalExternalSemaphoresAsync,\n ::cuWaitExternalSemaphoresAsync,\n ::cuGraphCreate,\n ::cuGraphDestroyNode,\n ::cuGraphAddEventRecordNode,\n ::cuGraphAddEventWaitNode,\n ::cuGraphAddChildGraphNode,\n ::cuGraphAddEmptyNode,\n ::cuGraphAddKernelNode,\n ::cuGraphAddMemcpyNode,\n ::cuGraphAddMemsetNode*/\n    fn cuGraphAddExternalSemaphoresWaitNode(\n        phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n        hGraph: cuda_types::cuda::CUgraph,\n        dependencies: *const cuda_types::cuda::CUgraphNode,\n        numDependencies: usize,\n        nodeParams: *const cuda_types::cuda::CUDA_EXT_SEM_WAIT_NODE_PARAMS,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns an external semaphore wait node's parameters\n\n Returns the parameters of an external semaphore wait node \\p hNode in \\p params_out.\n The \\p extSemArray and \\p paramsArray returned in \\p params_out,\n are owned by the node.  This memory remains valid until the node is destroyed or its\n parameters are modified, and should not be modified\n directly. Use ::cuGraphExternalSemaphoresSignalNodeSetParams to update the\n parameters of this node.\n\n \\param hNode      - Node to get the parameters for\n \\param params_out - Pointer to return the parameters\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuLaunchKernel,\n ::cuGraphAddExternalSemaphoresWaitNode,\n ::cuGraphExternalSemaphoresWaitNodeSetParams,\n ::cuGraphAddExternalSemaphoresWaitNode,\n ::cuSignalExternalSemaphoresAsync,\n ::cuWaitExternalSemaphoresAsync*/\n    fn cuGraphExternalSemaphoresWaitNodeGetParams(\n        hNode: cuda_types::cuda::CUgraphNode,\n        params_out: *mut cuda_types::cuda::CUDA_EXT_SEM_WAIT_NODE_PARAMS,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets an external semaphore wait node's parameters\n\n Sets the parameters of an external semaphore wait node \\p hNode to \\p nodeParams.\n\n \\param hNode      - Node to set the parameters for\n \\param nodeParams - Parameters to copy\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_OUT_OF_MEMORY\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphNodeSetParams,\n ::cuGraphAddExternalSemaphoresWaitNode,\n ::cuGraphExternalSemaphoresWaitNodeSetParams,\n ::cuGraphAddExternalSemaphoresWaitNode,\n ::cuSignalExternalSemaphoresAsync,\n ::cuWaitExternalSemaphoresAsync*/\n    fn cuGraphExternalSemaphoresWaitNodeSetParams(\n        hNode: cuda_types::cuda::CUgraphNode,\n        nodeParams: *const cuda_types::cuda::CUDA_EXT_SEM_WAIT_NODE_PARAMS,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Creates a batch memory operation node and adds it to a graph\n\n Creates a new batch memory operation node and adds it to \\p hGraph with \\p\n numDependencies dependencies specified via \\p dependencies and arguments specified in \\p nodeParams.\n It is possible for \\p numDependencies to be 0, in which case the node will be placed\n at the root of the graph. \\p dependencies may not have any duplicate entries.\n A handle to the new node will be returned in \\p phGraphNode.\n\n When the node is added, the paramArray inside \\p nodeParams is copied and therefore it can be\n freed after the call returns.\n\n \\note\n Warning:\n Improper use of this API may deadlock the application. Synchronization\n ordering established through this API is not visible to CUDA. CUDA tasks\n that are (even indirectly) ordered by this API should also have that order\n expressed with CUDA-visible dependencies such as events. This ensures that\n the scheduler does not serialize them in an improper order.\n\n \\param phGraphNode     - Returns newly created node\n \\param hGraph          - Graph to which to add the node\n \\param dependencies    - Dependencies of the node\n \\param numDependencies - Number of dependencies\n \\param nodeParams      - Parameters for the node\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_NOT_SUPPORTED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphAddNode,\n ::cuStreamBatchMemOp,\n ::cuStreamWaitValue32,\n ::cuStreamWriteValue32,\n ::cuStreamWaitValue64,\n ::cuStreamWriteValue64,\n ::cuGraphBatchMemOpNodeGetParams,\n ::cuGraphBatchMemOpNodeSetParams,\n ::cuGraphCreate,\n ::cuGraphDestroyNode,\n ::cuGraphAddChildGraphNode,\n ::cuGraphAddEmptyNode,\n ::cuGraphAddKernelNode,\n ::cuGraphAddMemcpyNode,\n ::cuGraphAddMemsetNode*/\n    fn cuGraphAddBatchMemOpNode(\n        phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n        hGraph: cuda_types::cuda::CUgraph,\n        dependencies: *const cuda_types::cuda::CUgraphNode,\n        numDependencies: usize,\n        nodeParams: *const cuda_types::cuda::CUDA_BATCH_MEM_OP_NODE_PARAMS,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a batch mem op node's parameters\n\n Returns the parameters of batch mem op node \\p hNode in \\p nodeParams_out.\n The \\p paramArray returned in \\p nodeParams_out is owned by the node.\n This memory remains valid until the node is destroyed or its\n parameters are modified, and should not be modified\n directly. Use ::cuGraphBatchMemOpNodeSetParams to update the\n parameters of this node.\n\n \\param hNode          - Node to get the parameters for\n \\param nodeParams_out - Pointer to return the parameters\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuStreamBatchMemOp,\n ::cuGraphAddBatchMemOpNode,\n ::cuGraphBatchMemOpNodeSetParams*/\n    fn cuGraphBatchMemOpNodeGetParams(\n        hNode: cuda_types::cuda::CUgraphNode,\n        nodeParams_out: *mut cuda_types::cuda::CUDA_BATCH_MEM_OP_NODE_PARAMS,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets a batch mem op node's parameters\n\n Sets the parameters of batch mem op node \\p hNode to \\p nodeParams.\n\n The paramArray inside \\p nodeParams is copied and therefore it can be\n freed after the call returns.\n\n \\param hNode      - Node to set the parameters for\n \\param nodeParams - Parameters to copy\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_OUT_OF_MEMORY\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphNodeSetParams,\n ::cuStreamBatchMemOp,\n ::cuGraphAddBatchMemOpNode,\n ::cuGraphBatchMemOpNodeGetParams*/\n    fn cuGraphBatchMemOpNodeSetParams(\n        hNode: cuda_types::cuda::CUgraphNode,\n        nodeParams: *const cuda_types::cuda::CUDA_BATCH_MEM_OP_NODE_PARAMS,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the parameters for a batch mem op node in the given graphExec\n\n Sets the parameters of a batch mem op node in an executable graph \\p hGraphExec.\n The node is identified by the corresponding node \\p hNode in the\n non-executable graph, from which the executable graph was instantiated.\n\n The following fields on operations may be modified on an executable graph:\n\n  op.waitValue.address\n  op.waitValue.value[64]\n  op.waitValue.flags bits corresponding to wait type (i.e. CU_STREAM_WAIT_VALUE_FLUSH bit cannot be modified)\n  op.writeValue.address\n  op.writeValue.value[64]\n\n Other fields, such as the context, count or type of operations, and other types of operations such as membars,\n may not be modified.\n\n \\p hNode must not have been removed from the original graph.\n\n The modifications only affect future launches of \\p hGraphExec. Already\n enqueued or running launches of \\p hGraphExec are not affected by this call.\n \\p hNode is also not modified by this call.\n\n The paramArray inside \\p nodeParams is copied and therefore it can be\n freed after the call returns.\n\n \\param hGraphExec - The executable graph in which to set the specified node\n \\param hNode      - Batch mem op node from the graph from which graphExec was instantiated\n \\param nodeParams - Updated Parameters to set\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphExecNodeSetParams,\n ::cuStreamBatchMemOp,\n ::cuGraphAddBatchMemOpNode,\n ::cuGraphBatchMemOpNodeGetParams,\n ::cuGraphBatchMemOpNodeSetParams,\n ::cuGraphInstantiate*/\n    fn cuGraphExecBatchMemOpNodeSetParams(\n        hGraphExec: cuda_types::cuda::CUgraphExec,\n        hNode: cuda_types::cuda::CUgraphNode,\n        nodeParams: *const cuda_types::cuda::CUDA_BATCH_MEM_OP_NODE_PARAMS,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Creates an allocation node and adds it to a graph\n\n Creates a new allocation node and adds it to \\p hGraph with \\p numDependencies\n dependencies specified via \\p dependencies and arguments specified in \\p nodeParams.\n It is possible for \\p numDependencies to be 0, in which case the node will be placed\n at the root of the graph. \\p dependencies may not have any duplicate entries. A handle\n to the new node will be returned in \\p phGraphNode.\n\n \\param phGraphNode     - Returns newly created node\n \\param hGraph          - Graph to which to add the node\n \\param dependencies    - Dependencies of the node\n \\param numDependencies - Number of dependencies\n \\param nodeParams      - Parameters for the node\n\n When ::cuGraphAddMemAllocNode creates an allocation node, it returns the address of the allocation in\n \\p nodeParams.dptr.  The allocation's address remains fixed across instantiations and launches.\n\n If the allocation is freed in the same graph, by creating a free node using ::cuGraphAddMemFreeNode,\n the allocation can be accessed by nodes ordered after the allocation node but before the free node.\n These allocations cannot be freed outside the owning graph, and they can only be freed once in the\n owning graph.\n\n If the allocation is not freed in the same graph, then it can be accessed not only by nodes in the\n graph which are ordered after the allocation node, but also by stream operations ordered after the\n graph's execution but before the allocation is freed.\n\n Allocations which are not freed in the same graph can be freed by:\n - passing the allocation to ::cuMemFreeAsync or ::cuMemFree;\n - launching a graph with a free node for that allocation; or\n - specifying ::CUDA_GRAPH_INSTANTIATE_FLAG_AUTO_FREE_ON_LAUNCH during instantiation, which makes\n each launch behave as though it called ::cuMemFreeAsync for every unfreed allocation.\n\n It is not possible to free an allocation in both the owning graph and another graph.  If the allocation\n is freed in the same graph, a free node cannot be added to another graph.  If the allocation is freed\n in another graph, a free node can no longer be added to the owning graph.\n\n The following restrictions apply to graphs which contain allocation and/or memory free nodes:\n - Nodes and edges of the graph cannot be deleted.\n - The graph can only be used in a child node if the ownership is moved to the parent.\n - Only one instantiation of the graph may exist at any point in time.\n - The graph cannot be cloned.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_NOT_SUPPORTED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphAddNode,\n ::cuGraphAddMemFreeNode,\n ::cuGraphMemAllocNodeGetParams,\n ::cuDeviceGraphMemTrim,\n ::cuDeviceGetGraphMemAttribute,\n ::cuDeviceSetGraphMemAttribute,\n ::cuMemAllocAsync,\n ::cuMemFreeAsync,\n ::cuGraphCreate,\n ::cuGraphDestroyNode,\n ::cuGraphAddChildGraphNode,\n ::cuGraphAddEmptyNode,\n ::cuGraphAddEventRecordNode,\n ::cuGraphAddEventWaitNode,\n ::cuGraphAddExternalSemaphoresSignalNode,\n ::cuGraphAddExternalSemaphoresWaitNode,\n ::cuGraphAddKernelNode,\n ::cuGraphAddMemcpyNode,\n ::cuGraphAddMemsetNode*/\n    fn cuGraphAddMemAllocNode(\n        phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n        hGraph: cuda_types::cuda::CUgraph,\n        dependencies: *const cuda_types::cuda::CUgraphNode,\n        numDependencies: usize,\n        nodeParams: *mut cuda_types::cuda::CUDA_MEM_ALLOC_NODE_PARAMS,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a memory alloc node's parameters\n\n Returns the parameters of a memory alloc node \\p hNode in \\p params_out.\n The \\p poolProps and \\p accessDescs returned in \\p params_out, are owned by the\n node.  This memory remains valid until the node is destroyed.  The returned\n parameters must not be modified.\n\n \\param hNode      - Node to get the parameters for\n \\param params_out - Pointer to return the parameters\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphAddMemAllocNode,\n ::cuGraphMemFreeNodeGetParams*/\n    fn cuGraphMemAllocNodeGetParams(\n        hNode: cuda_types::cuda::CUgraphNode,\n        params_out: *mut cuda_types::cuda::CUDA_MEM_ALLOC_NODE_PARAMS,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Creates a memory free node and adds it to a graph\n\n Creates a new memory free node and adds it to \\p hGraph with \\p numDependencies\n dependencies specified via \\p dependencies and arguments specified in \\p nodeParams.\n It is possible for \\p numDependencies to be 0, in which case the node will be placed\n at the root of the graph. \\p dependencies may not have any duplicate entries. A handle\n to the new node will be returned in \\p phGraphNode.\n\n \\param phGraphNode     - Returns newly created node\n \\param hGraph          - Graph to which to add the node\n \\param dependencies    - Dependencies of the node\n \\param numDependencies - Number of dependencies\n \\param dptr            - Address of memory to free\n\n ::cuGraphAddMemFreeNode will return ::CUDA_ERROR_INVALID_VALUE if the user attempts to free:\n - an allocation twice in the same graph.\n - an address that was not returned by an allocation node.\n - an invalid address.\n\n The following restrictions apply to graphs which contain allocation and/or memory free nodes:\n - Nodes and edges of the graph cannot be deleted.\n - The graph can only be used in a child node if the ownership is moved to the parent.\n - Only one instantiation of the graph may exist at any point in time.\n - The graph cannot be cloned.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_NOT_SUPPORTED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphAddNode,\n ::cuGraphAddMemAllocNode,\n ::cuGraphMemFreeNodeGetParams,\n ::cuDeviceGraphMemTrim,\n ::cuDeviceGetGraphMemAttribute,\n ::cuDeviceSetGraphMemAttribute,\n ::cuMemAllocAsync,\n ::cuMemFreeAsync,\n ::cuGraphCreate,\n ::cuGraphDestroyNode,\n ::cuGraphAddChildGraphNode,\n ::cuGraphAddEmptyNode,\n ::cuGraphAddEventRecordNode,\n ::cuGraphAddEventWaitNode,\n ::cuGraphAddExternalSemaphoresSignalNode,\n ::cuGraphAddExternalSemaphoresWaitNode,\n ::cuGraphAddKernelNode,\n ::cuGraphAddMemcpyNode,\n ::cuGraphAddMemsetNode*/\n    fn cuGraphAddMemFreeNode(\n        phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n        hGraph: cuda_types::cuda::CUgraph,\n        dependencies: *const cuda_types::cuda::CUgraphNode,\n        numDependencies: usize,\n        dptr: cuda_types::cuda::CUdeviceptr,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a memory free node's parameters\n\n Returns the address of a memory free node \\p hNode in \\p dptr_out.\n\n \\param hNode    - Node to get the parameters for\n \\param dptr_out - Pointer to return the device address\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphAddMemFreeNode,\n ::cuGraphMemAllocNodeGetParams*/\n    fn cuGraphMemFreeNodeGetParams(\n        hNode: cuda_types::cuda::CUgraphNode,\n        dptr_out: *mut cuda_types::cuda::CUdeviceptr,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Free unused memory that was cached on the specified device for use with graphs back to the OS.\n\n Blocks which are not in use by a graph that is either currently executing or scheduled to execute are\n freed back to the operating system.\n\n \\param device - The device for which cached memory should be freed.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_DEVICE\n\n \\sa\n ::cuGraphAddMemAllocNode,\n ::cuGraphAddMemFreeNode,\n ::cuDeviceSetGraphMemAttribute,\n ::cuDeviceGetGraphMemAttribute*/\n    fn cuDeviceGraphMemTrim(\n        device: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Query asynchronous allocation attributes related to graphs\n\n Valid attributes are:\n\n - ::CU_GRAPH_MEM_ATTR_USED_MEM_CURRENT: Amount of memory, in bytes, currently associated with graphs\n - ::CU_GRAPH_MEM_ATTR_USED_MEM_HIGH: High watermark of memory, in bytes, associated with graphs since the\n   last time it was reset.  High watermark can only be reset to zero.\n - ::CU_GRAPH_MEM_ATTR_RESERVED_MEM_CURRENT: Amount of memory, in bytes, currently allocated for use by\n   the CUDA graphs asynchronous allocator.\n - ::CU_GRAPH_MEM_ATTR_RESERVED_MEM_HIGH: High watermark of memory, in bytes, currently allocated for use by\n   the CUDA graphs asynchronous allocator.\n\n \\param device - Specifies the scope of the query\n \\param attr - attribute to get\n \\param value - retrieved value\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_DEVICE\n\n \\sa\n ::cuDeviceSetGraphMemAttribute,\n ::cuGraphAddMemAllocNode,\n ::cuGraphAddMemFreeNode*/\n    fn cuDeviceGetGraphMemAttribute(\n        device: cuda_types::cuda::CUdevice,\n        attr: cuda_types::cuda::CUgraphMem_attribute,\n        value: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Set asynchronous allocation attributes related to graphs\n\n Valid attributes are:\n\n - ::CU_GRAPH_MEM_ATTR_USED_MEM_HIGH: High watermark of memory, in bytes, associated with graphs since the\n   last time it was reset.  High watermark can only be reset to zero.\n - ::CU_GRAPH_MEM_ATTR_RESERVED_MEM_HIGH: High watermark of memory, in bytes, currently allocated for use by\n   the CUDA graphs asynchronous allocator.\n\n \\param device - Specifies the scope of the query\n \\param attr - attribute to get\n \\param value - pointer to value to set\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_DEVICE\n\n \\sa\n ::cuDeviceGetGraphMemAttribute,\n ::cuGraphAddMemAllocNode,\n ::cuGraphAddMemFreeNode*/\n    fn cuDeviceSetGraphMemAttribute(\n        device: cuda_types::cuda::CUdevice,\n        attr: cuda_types::cuda::CUgraphMem_attribute,\n        value: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Clones a graph\n\n This function creates a copy of \\p originalGraph and returns it in \\p phGraphClone.\n All parameters are copied into the cloned graph. The original graph may be modified\n after this call without affecting the clone.\n\n Child graph nodes in the original graph are recursively copied into the clone.\n\n \\note: Cloning is not supported for graphs which contain memory allocation nodes,\n        memory free nodes, or conditional nodes.\n\n \\param phGraphClone  - Returns newly created cloned graph\n \\param originalGraph - Graph to clone\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_OUT_OF_MEMORY\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphCreate,\n ::cuGraphNodeFindInClone*/\n    fn cuGraphClone(\n        phGraphClone: *mut cuda_types::cuda::CUgraph,\n        originalGraph: cuda_types::cuda::CUgraph,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Finds a cloned version of a node\n\n This function returns the node in \\p hClonedGraph corresponding to \\p hOriginalNode\n in the original graph.\n\n \\p hClonedGraph must have been cloned from \\p hOriginalGraph via ::cuGraphClone.\n \\p hOriginalNode must have been in \\p hOriginalGraph at the time of the call to\n ::cuGraphClone, and the corresponding cloned node in \\p hClonedGraph must not have\n been removed. The cloned node is then returned via \\p phClonedNode.\n\n \\param phNode  - Returns handle to the cloned node\n \\param hOriginalNode - Handle to the original node\n \\param hClonedGraph - Cloned graph to query\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphClone*/\n    fn cuGraphNodeFindInClone(\n        phNode: *mut cuda_types::cuda::CUgraphNode,\n        hOriginalNode: cuda_types::cuda::CUgraphNode,\n        hClonedGraph: cuda_types::cuda::CUgraph,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a node's type\n\n Returns the node type of \\p hNode in \\p type.\n\n \\param hNode - Node to query\n \\param type  - Pointer to return the node type\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphGetNodes,\n ::cuGraphGetRootNodes,\n ::cuGraphChildGraphNodeGetGraph,\n ::cuGraphKernelNodeGetParams,\n ::cuGraphKernelNodeSetParams,\n ::cuGraphHostNodeGetParams,\n ::cuGraphHostNodeSetParams,\n ::cuGraphMemcpyNodeGetParams,\n ::cuGraphMemcpyNodeSetParams,\n ::cuGraphMemsetNodeGetParams,\n ::cuGraphMemsetNodeSetParams*/\n    fn cuGraphNodeGetType(\n        hNode: cuda_types::cuda::CUgraphNode,\n        type_: *mut cuda_types::cuda::CUgraphNodeType,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a graph's nodes\n\n Returns a list of \\p hGraph's nodes. \\p nodes may be NULL, in which case this\n function will return the number of nodes in \\p numNodes. Otherwise,\n \\p numNodes entries will be filled in. If \\p numNodes is higher than the actual\n number of nodes, the remaining entries in \\p nodes will be set to NULL, and the\n number of nodes actually obtained will be returned in \\p numNodes.\n\n \\param hGraph   - Graph to query\n \\param nodes    - Pointer to return the nodes\n \\param numNodes - See description\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphCreate,\n ::cuGraphGetRootNodes,\n ::cuGraphGetEdges,\n ::cuGraphNodeGetType,\n ::cuGraphNodeGetDependencies,\n ::cuGraphNodeGetDependentNodes*/\n    fn cuGraphGetNodes(\n        hGraph: cuda_types::cuda::CUgraph,\n        nodes: *mut cuda_types::cuda::CUgraphNode,\n        numNodes: *mut usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a graph's root nodes\n\n Returns a list of \\p hGraph's root nodes. \\p rootNodes may be NULL, in which case this\n function will return the number of root nodes in \\p numRootNodes. Otherwise,\n \\p numRootNodes entries will be filled in. If \\p numRootNodes is higher than the actual\n number of root nodes, the remaining entries in \\p rootNodes will be set to NULL, and the\n number of nodes actually obtained will be returned in \\p numRootNodes.\n\n \\param hGraph       - Graph to query\n \\param rootNodes    - Pointer to return the root nodes\n \\param numRootNodes - See description\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphCreate,\n ::cuGraphGetNodes,\n ::cuGraphGetEdges,\n ::cuGraphNodeGetType,\n ::cuGraphNodeGetDependencies,\n ::cuGraphNodeGetDependentNodes*/\n    fn cuGraphGetRootNodes(\n        hGraph: cuda_types::cuda::CUgraph,\n        rootNodes: *mut cuda_types::cuda::CUgraphNode,\n        numRootNodes: *mut usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a graph's dependency edges\n\n Returns a list of \\p hGraph's dependency edges. Edges are returned via corresponding\n indices in \\p from, \\p to and \\p edgeData; that is, the node in \\p to[i] has a\n dependency on the node in \\p from[i] with data \\p edgeData[i]. \\p from and \\p to may\n both be NULL, in which case this function only returns the number of edges in\n \\p numEdges. Otherwise, \\p numEdges entries will be filled in. If \\p numEdges is higher\n than the actual number of edges, the remaining entries in \\p from and \\p to will be\n set to NULL, and the number of edges actually returned will be written to \\p numEdges.\n \\p edgeData may alone be NULL, in which case the edges must all have default (zeroed)\n edge data. Attempting a lossy query via NULL \\p edgeData will result in\n ::CUDA_ERROR_LOSSY_QUERY. If \\p edgeData is non-NULL then \\p from and \\p to must be\n as well.\n\n \\param hGraph   - Graph to get the edges from\n \\param from     - Location to return edge endpoints\n \\param to       - Location to return edge endpoints\n \\param edgeData - Optional location to return edge data\n \\param numEdges - See description\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_LOSSY_QUERY,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphGetNodes,\n ::cuGraphGetRootNodes,\n ::cuGraphAddDependencies,\n ::cuGraphRemoveDependencies,\n ::cuGraphNodeGetDependencies,\n ::cuGraphNodeGetDependentNodes*/\n    fn cuGraphGetEdges_v2(\n        hGraph: cuda_types::cuda::CUgraph,\n        from: *mut cuda_types::cuda::CUgraphNode,\n        to: *mut cuda_types::cuda::CUgraphNode,\n        edgeData: *mut cuda_types::cuda::CUgraphEdgeData,\n        numEdges: *mut usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a node's dependencies\n\n Returns a list of \\p node's dependencies. \\p dependencies may be NULL, in which case this\n function will return the number of dependencies in \\p numDependencies. Otherwise,\n \\p numDependencies entries will be filled in. If \\p numDependencies is higher than the actual\n number of dependencies, the remaining entries in \\p dependencies will be set to NULL, and the\n number of nodes actually obtained will be returned in \\p numDependencies.\n\n Note that if an edge has non-zero (non-default) edge data and \\p edgeData is NULL,\n this API will return ::CUDA_ERROR_LOSSY_QUERY. If \\p edgeData is non-NULL, then\n \\p dependencies must be as well.\n\n \\param hNode           - Node to query\n \\param dependencies    - Pointer to return the dependencies\n \\param edgeData        - Optional array to return edge data for each dependency\n \\param numDependencies - See description\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_LOSSY_QUERY,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphNodeGetDependentNodes,\n ::cuGraphGetNodes,\n ::cuGraphGetRootNodes,\n ::cuGraphGetEdges,\n ::cuGraphAddDependencies,\n ::cuGraphRemoveDependencies*/\n    fn cuGraphNodeGetDependencies_v2(\n        hNode: cuda_types::cuda::CUgraphNode,\n        dependencies: *mut cuda_types::cuda::CUgraphNode,\n        edgeData: *mut cuda_types::cuda::CUgraphEdgeData,\n        numDependencies: *mut usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a node's dependent nodes\n\n Returns a list of \\p node's dependent nodes. \\p dependentNodes may be NULL, in which\n case this function will return the number of dependent nodes in \\p numDependentNodes.\n Otherwise, \\p numDependentNodes entries will be filled in. If \\p numDependentNodes is\n higher than the actual number of dependent nodes, the remaining entries in\n \\p dependentNodes will be set to NULL, and the number of nodes actually obtained will\n be returned in \\p numDependentNodes.\n\n Note that if an edge has non-zero (non-default) edge data and \\p edgeData is NULL,\n this API will return ::CUDA_ERROR_LOSSY_QUERY.  If \\p edgeData is non-NULL, then\n \\p dependentNodes must be as well.\n\n \\param hNode             - Node to query\n \\param dependentNodes    - Pointer to return the dependent nodes\n \\param edgeData          - Optional pointer to return edge data for dependent nodes\n \\param numDependentNodes - See description\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_LOSSY_QUERY,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphNodeGetDependencies,\n ::cuGraphGetNodes,\n ::cuGraphGetRootNodes,\n ::cuGraphGetEdges,\n ::cuGraphAddDependencies,\n ::cuGraphRemoveDependencies*/\n    fn cuGraphNodeGetDependentNodes_v2(\n        hNode: cuda_types::cuda::CUgraphNode,\n        dependentNodes: *mut cuda_types::cuda::CUgraphNode,\n        edgeData: *mut cuda_types::cuda::CUgraphEdgeData,\n        numDependentNodes: *mut usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Adds dependency edges to a graph\n\n The number of dependencies to be added is defined by \\p numDependencies\n Elements in \\p from and \\p to at corresponding indices define a dependency.\n Each node in \\p from and \\p to must belong to \\p hGraph.\n\n If \\p numDependencies is 0, elements in \\p from and \\p to will be ignored.\n Specifying an existing dependency will return an error.\n\n \\param hGraph - Graph to which dependencies are added\n \\param from - Array of nodes that provide the dependencies\n \\param to - Array of dependent nodes\n \\param edgeData - Optional array of edge data. If NULL, default (zeroed) edge data is assumed.\n \\param numDependencies - Number of dependencies to be added\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphRemoveDependencies,\n ::cuGraphGetEdges,\n ::cuGraphNodeGetDependencies,\n ::cuGraphNodeGetDependentNodes*/\n    fn cuGraphAddDependencies_v2(\n        hGraph: cuda_types::cuda::CUgraph,\n        from: *const cuda_types::cuda::CUgraphNode,\n        to: *const cuda_types::cuda::CUgraphNode,\n        edgeData: *const cuda_types::cuda::CUgraphEdgeData,\n        numDependencies: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Removes dependency edges from a graph\n\n The number of \\p dependencies to be removed is defined by \\p numDependencies.\n Elements in \\p from and \\p to at corresponding indices define a dependency.\n Each node in \\p from and \\p to must belong to \\p hGraph.\n\n If \\p numDependencies is 0, elements in \\p from and \\p to will be ignored.\n Specifying an edge that does not exist in the graph, with data matching\n \\p edgeData, results in an error. \\p edgeData is nullable, which is equivalent\n to passing default (zeroed) data for each edge.\n\n Dependencies cannot be removed from graphs which contain allocation or free nodes.\n Any attempt to do so will return an error.\n\n \\param hGraph - Graph from which to remove dependencies\n \\param from - Array of nodes that provide the dependencies\n \\param to - Array of dependent nodes\n \\param edgeData - Optional array of edge data. If NULL, edge data is assumed to\n                   be default (zeroed).\n \\param numDependencies - Number of dependencies to be removed\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphAddDependencies,\n ::cuGraphGetEdges,\n ::cuGraphNodeGetDependencies,\n ::cuGraphNodeGetDependentNodes*/\n    fn cuGraphRemoveDependencies_v2(\n        hGraph: cuda_types::cuda::CUgraph,\n        from: *const cuda_types::cuda::CUgraphNode,\n        to: *const cuda_types::cuda::CUgraphNode,\n        edgeData: *const cuda_types::cuda::CUgraphEdgeData,\n        numDependencies: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Remove a node from the graph\n\n Removes \\p hNode from its graph. This operation also severs any dependencies of other nodes\n on \\p hNode and vice versa.\n\n Nodes which belong to a graph which contains allocation or free nodes cannot be destroyed.\n Any attempt to do so will return an error.\n\n \\param hNode  - Node to remove\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphAddChildGraphNode,\n ::cuGraphAddEmptyNode,\n ::cuGraphAddKernelNode,\n ::cuGraphAddHostNode,\n ::cuGraphAddMemcpyNode,\n ::cuGraphAddMemsetNode*/\n    fn cuGraphDestroyNode(\n        hNode: cuda_types::cuda::CUgraphNode,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Creates an executable graph from a graph\n\n Instantiates \\p hGraph as an executable graph. The graph is validated for any\n structural constraints or intra-node constraints which were not previously\n validated. If instantiation is successful, a handle to the instantiated graph\n is returned in \\p phGraphExec.\n\n The \\p flags parameter controls the behavior of instantiation and subsequent\n graph launches.  Valid flags are:\n\n - ::CUDA_GRAPH_INSTANTIATE_FLAG_AUTO_FREE_ON_LAUNCH, which configures a\n graph containing memory allocation nodes to automatically free any\n unfreed memory allocations before the graph is relaunched.\n\n - ::CUDA_GRAPH_INSTANTIATE_FLAG_DEVICE_LAUNCH, which configures the graph for launch\n from the device. If this flag is passed, the executable graph handle returned can be\n used to launch the graph from both the host and device. This flag can only be used\n on platforms which support unified addressing. This flag cannot be used in\n conjunction with ::CUDA_GRAPH_INSTANTIATE_FLAG_AUTO_FREE_ON_LAUNCH.\n\n - ::CUDA_GRAPH_INSTANTIATE_FLAG_USE_NODE_PRIORITY, which causes the graph\n to use the priorities from the per-node attributes rather than the priority\n of the launch stream during execution. Note that priorities are only available\n on kernel nodes, and are copied from stream priority during stream capture.\n\n If \\p hGraph contains any allocation or free nodes, there can be at most one\n executable graph in existence for that graph at a time. An attempt to instantiate\n a second executable graph before destroying the first with ::cuGraphExecDestroy\n will result in an error.\n The same also applies if \\p hGraph contains any device-updatable kernel nodes.\n\n If \\p hGraph contains kernels which call device-side cudaGraphLaunch() from multiple\n contexts, this will result in an error.\n\n Graphs instantiated for launch on the device have additional restrictions which do not\n apply to host graphs:\n\n - The graph's nodes must reside on a single context.\n - The graph can only contain kernel nodes, memcpy nodes, memset nodes, and child graph nodes.\n - The graph cannot be empty and must contain at least one kernel, memcpy, or memset node.\n   Operation-specific restrictions are outlined below.\n - Kernel nodes:\n   - Use of CUDA Dynamic Parallelism is not permitted.\n   - Cooperative launches are permitted as long as MPS is not in use.\n - Memcpy nodes:\n   - Only copies involving device memory and/or pinned device-mapped host memory are permitted.\n   - Copies involving CUDA arrays are not permitted.\n   - Both operands must be accessible from the current context, and the current context must\n     match the context of other nodes in the graph.\n\n \\param phGraphExec - Returns instantiated graph\n \\param hGraph      - Graph to instantiate\n \\param flags       - Flags to control instantiation.  See ::CUgraphInstantiate_flags.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphInstantiate,\n ::cuGraphCreate,\n ::cuGraphUpload,\n ::cuGraphLaunch,\n ::cuGraphExecDestroy*/\n    fn cuGraphInstantiateWithFlags(\n        phGraphExec: *mut cuda_types::cuda::CUgraphExec,\n        hGraph: cuda_types::cuda::CUgraph,\n        flags: ::core::ffi::c_ulonglong,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Creates an executable graph from a graph\n\n Instantiates \\p hGraph as an executable graph according to the \\p instantiateParams structure.\n The graph is validated for any structural constraints or intra-node constraints\n which were not previously validated. If instantiation is successful, a handle to\n the instantiated graph is returned in \\p phGraphExec.\n\n \\p instantiateParams controls the behavior of instantiation and subsequent\n graph launches, as well as returning more detailed information in the event of an error.\n ::CUDA_GRAPH_INSTANTIATE_PARAMS is defined as:\n\n \\code\ntypedef struct {\ncuuint64_t flags;\nCUstream hUploadStream;\nCUgraphNode hErrNode_out;\nCUgraphInstantiateResult result_out;\n} CUDA_GRAPH_INSTANTIATE_PARAMS;\n \\endcode\n\n The \\p flags field controls the behavior of instantiation and subsequent\n graph launches. Valid flags are:\n\n - ::CUDA_GRAPH_INSTANTIATE_FLAG_AUTO_FREE_ON_LAUNCH, which configures a\n graph containing memory allocation nodes to automatically free any\n unfreed memory allocations before the graph is relaunched.\n\n - ::CUDA_GRAPH_INSTANTIATE_FLAG_UPLOAD, which will perform an upload of the graph\n into \\p hUploadStream once the graph has been instantiated.\n\n - ::CUDA_GRAPH_INSTANTIATE_FLAG_DEVICE_LAUNCH, which configures the graph for launch\n from the device. If this flag is passed, the executable graph handle returned can be\n used to launch the graph from both the host and device. This flag can only be used\n on platforms which support unified addressing. This flag cannot be used in\n conjunction with ::CUDA_GRAPH_INSTANTIATE_FLAG_AUTO_FREE_ON_LAUNCH.\n\n - ::CUDA_GRAPH_INSTANTIATE_FLAG_USE_NODE_PRIORITY, which causes the graph\n to use the priorities from the per-node attributes rather than the priority\n of the launch stream during execution. Note that priorities are only available\n on kernel nodes, and are copied from stream priority during stream capture.\n\n If \\p hGraph contains any allocation or free nodes, there can be at most one\n executable graph in existence for that graph at a time. An attempt to instantiate a\n second executable graph before destroying the first with ::cuGraphExecDestroy will\n result in an error.\n The same also applies if \\p hGraph contains any device-updatable kernel nodes.\n\n If \\p hGraph contains kernels which call device-side cudaGraphLaunch() from multiple\n contexts, this will result in an error.\n\n Graphs instantiated for launch on the device have additional restrictions which do not\n apply to host graphs:\n\n - The graph's nodes must reside on a single context.\n - The graph can only contain kernel nodes, memcpy nodes, memset nodes, and child graph nodes.\n - The graph cannot be empty and must contain at least one kernel, memcpy, or memset node.\n   Operation-specific restrictions are outlined below.\n - Kernel nodes:\n   - Use of CUDA Dynamic Parallelism is not permitted.\n   - Cooperative launches are permitted as long as MPS is not in use.\n - Memcpy nodes:\n   - Only copies involving device memory and/or pinned device-mapped host memory are permitted.\n   - Copies involving CUDA arrays are not permitted.\n   - Both operands must be accessible from the current context, and the current context must\n     match the context of other nodes in the graph.\n\n In the event of an error, the \\p result_out and \\p hErrNode_out fields will contain more\n information about the nature of the error. Possible error reporting includes:\n\n - ::CUDA_GRAPH_INSTANTIATE_ERROR, if passed an invalid value or if an unexpected error occurred\n   which is described by the return value of the function. \\p hErrNode_out will be set to NULL.\n - ::CUDA_GRAPH_INSTANTIATE_INVALID_STRUCTURE, if the graph structure is invalid. \\p hErrNode_out\n   will be set to one of the offending nodes.\n - ::CUDA_GRAPH_INSTANTIATE_NODE_OPERATION_NOT_SUPPORTED, if the graph is instantiated for device\n   launch but contains a node of an unsupported node type, or a node which performs unsupported\n   operations, such as use of CUDA dynamic parallelism within a kernel node. \\p hErrNode_out will\n   be set to this node.\n - ::CUDA_GRAPH_INSTANTIATE_MULTIPLE_CTXS_NOT_SUPPORTED, if the graph is instantiated for device\n   launch but a node’s context differs from that of another node. This error can also be returned\n   if a graph is not instantiated for device launch and it contains kernels which call device-side\n   cudaGraphLaunch() from multiple contexts. \\p hErrNode_out will be set to this node.\n\n If instantiation is successful, \\p result_out will be set to ::CUDA_GRAPH_INSTANTIATE_SUCCESS,\n and \\p hErrNode_out will be set to NULL.\n\n \\param phGraphExec       - Returns instantiated graph\n \\param hGraph            - Graph to instantiate\n \\param instantiateParams - Instantiation parameters\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphCreate,\n ::cuGraphInstantiate,\n ::cuGraphExecDestroy*/\n    fn cuGraphInstantiateWithParams_ptsz(\n        phGraphExec: *mut cuda_types::cuda::CUgraphExec,\n        hGraph: cuda_types::cuda::CUgraph,\n        instantiateParams: *mut cuda_types::cuda::CUDA_GRAPH_INSTANTIATE_PARAMS,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Query the instantiation flags of an executable graph\n\n Returns the flags that were passed to instantiation for the given executable graph.\n ::CUDA_GRAPH_INSTANTIATE_FLAG_UPLOAD will not be returned by this API as it does\n not affect the resulting executable graph.\n\n \\param hGraphExec - The executable graph to query\n \\param flags      - Returns the instantiation flags\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphInstantiate,\n ::cuGraphInstantiateWithParams*/\n    fn cuGraphExecGetFlags(\n        hGraphExec: cuda_types::cuda::CUgraphExec,\n        flags: *mut cuda_types::cuda::cuuint64_t,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the parameters for a kernel node in the given graphExec\n\n Sets the parameters of a kernel node in an executable graph \\p hGraphExec.\n The node is identified by the corresponding node \\p hNode in the\n non-executable graph, from which the executable graph was instantiated.\n\n \\p hNode must not have been removed from the original graph. All \\p nodeParams\n fields may change, but the following restrictions apply to \\p func updates:\n\n   - The owning context of the function cannot change.\n   - A node whose function originally did not use CUDA dynamic parallelism cannot be updated\n     to a function which uses CDP\n   - A node whose function originally did not make device-side update calls cannot be updated\n     to a function which makes device-side update calls.\n   - If \\p hGraphExec was not instantiated for device launch, a node whose function originally\n     did not use device-side cudaGraphLaunch() cannot be updated to a function which uses\n     device-side cudaGraphLaunch() unless the node resides on the same context as nodes which\n     contained such calls at instantiate-time. If no such calls were present at instantiation,\n     these updates cannot be performed at all.\n\n The modifications only affect future launches of \\p hGraphExec. Already\n enqueued or running launches of \\p hGraphExec are not affected by this call.\n \\p hNode is also not modified by this call.\n\n If \\p hNode is a device-updatable kernel node, the next upload/launch of \\p hGraphExec\n will overwrite any previous device-side updates. Additionally, applying host updates to a\n device-updatable kernel node while it is being updated from the device will result in\n undefined behavior.\n\n \\param hGraphExec  - The executable graph in which to set the specified node\n \\param hNode       - kernel node from the graph from which graphExec was instantiated\n \\param nodeParams  - Updated Parameters to set\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphExecNodeSetParams,\n ::cuGraphAddKernelNode,\n ::cuGraphKernelNodeSetParams,\n ::cuGraphExecMemcpyNodeSetParams,\n ::cuGraphExecMemsetNodeSetParams,\n ::cuGraphExecHostNodeSetParams,\n ::cuGraphExecChildGraphNodeSetParams,\n ::cuGraphExecEventRecordNodeSetEvent,\n ::cuGraphExecEventWaitNodeSetEvent,\n ::cuGraphExecExternalSemaphoresSignalNodeSetParams,\n ::cuGraphExecExternalSemaphoresWaitNodeSetParams,\n ::cuGraphExecUpdate,\n ::cuGraphInstantiate*/\n    fn cuGraphExecKernelNodeSetParams_v2(\n        hGraphExec: cuda_types::cuda::CUgraphExec,\n        hNode: cuda_types::cuda::CUgraphNode,\n        nodeParams: *const cuda_types::cuda::CUDA_KERNEL_NODE_PARAMS,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the parameters for a memcpy node in the given graphExec.\n\n Updates the work represented by \\p hNode in \\p hGraphExec as though \\p hNode had\n contained \\p copyParams at instantiation.  hNode must remain in the graph which was\n used to instantiate \\p hGraphExec.  Changed edges to and from hNode are ignored.\n\n The source and destination memory in \\p copyParams must be allocated from the same\n contexts as the original source and destination memory.  Both the instantiation-time\n memory operands and the memory operands in \\p copyParams must be 1-dimensional.\n Zero-length operations are not supported.\n\n The modifications only affect future launches of \\p hGraphExec.  Already enqueued\n or running launches of \\p hGraphExec are not affected by this call.  hNode is also\n not modified by this call.\n\n Returns CUDA_ERROR_INVALID_VALUE if the memory operands' mappings changed or\n either the original or new memory operands are multidimensional.\n\n \\param hGraphExec - The executable graph in which to set the specified node\n \\param hNode      - Memcpy node from the graph which was used to instantiate graphExec\n \\param copyParams - The updated parameters to set\n \\param ctx        - Context on which to run the node\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphExecNodeSetParams,\n ::cuGraphAddMemcpyNode,\n ::cuGraphMemcpyNodeSetParams,\n ::cuGraphExecKernelNodeSetParams,\n ::cuGraphExecMemsetNodeSetParams,\n ::cuGraphExecHostNodeSetParams,\n ::cuGraphExecChildGraphNodeSetParams,\n ::cuGraphExecEventRecordNodeSetEvent,\n ::cuGraphExecEventWaitNodeSetEvent,\n ::cuGraphExecExternalSemaphoresSignalNodeSetParams,\n ::cuGraphExecExternalSemaphoresWaitNodeSetParams,\n ::cuGraphExecUpdate,\n ::cuGraphInstantiate*/\n    fn cuGraphExecMemcpyNodeSetParams(\n        hGraphExec: cuda_types::cuda::CUgraphExec,\n        hNode: cuda_types::cuda::CUgraphNode,\n        copyParams: *const cuda_types::cuda::CUDA_MEMCPY3D,\n        ctx: cuda_types::cuda::CUcontext,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the parameters for a memset node in the given graphExec.\n\n Updates the work represented by \\p hNode in \\p hGraphExec as though \\p hNode had\n contained \\p memsetParams at instantiation.  hNode must remain in the graph which was\n used to instantiate \\p hGraphExec.  Changed edges to and from hNode are ignored.\n\n Zero sized operations are not supported.\n\n The new destination pointer in memsetParams must be to the same kind of allocation\n as the original destination pointer and have the same context association and device mapping\n as the original destination pointer.\n\n Both the value and pointer address may be updated.\n Changing other aspects of the memset (width, height, element size or pitch) may cause the update to be rejected.\n Specifically, for 2d memsets, all dimension changes are rejected.\n For 1d memsets, changes in height are explicitly rejected and other changes are opportunistically allowed\n if the resulting work maps onto the work resources already allocated for the node.\n\n The modifications only affect future launches of \\p hGraphExec.  Already enqueued\n or running launches of \\p hGraphExec are not affected by this call.  hNode is also\n not modified by this call.\n\n \\param hGraphExec   - The executable graph in which to set the specified node\n \\param hNode        - Memset node from the graph which was used to instantiate graphExec\n \\param memsetParams - The updated parameters to set\n \\param ctx          - Context on which to run the node\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphExecNodeSetParams,\n ::cuGraphAddMemsetNode,\n ::cuGraphMemsetNodeSetParams,\n ::cuGraphExecKernelNodeSetParams,\n ::cuGraphExecMemcpyNodeSetParams,\n ::cuGraphExecHostNodeSetParams,\n ::cuGraphExecChildGraphNodeSetParams,\n ::cuGraphExecEventRecordNodeSetEvent,\n ::cuGraphExecEventWaitNodeSetEvent,\n ::cuGraphExecExternalSemaphoresSignalNodeSetParams,\n ::cuGraphExecExternalSemaphoresWaitNodeSetParams,\n ::cuGraphExecUpdate,\n ::cuGraphInstantiate*/\n    fn cuGraphExecMemsetNodeSetParams(\n        hGraphExec: cuda_types::cuda::CUgraphExec,\n        hNode: cuda_types::cuda::CUgraphNode,\n        memsetParams: *const cuda_types::cuda::CUDA_MEMSET_NODE_PARAMS,\n        ctx: cuda_types::cuda::CUcontext,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the parameters for a host node in the given graphExec.\n\n Updates the work represented by \\p hNode in \\p hGraphExec as though \\p hNode had\n contained \\p nodeParams at instantiation.  hNode must remain in the graph which was\n used to instantiate \\p hGraphExec.  Changed edges to and from hNode are ignored.\n\n The modifications only affect future launches of \\p hGraphExec.  Already enqueued\n or running launches of \\p hGraphExec are not affected by this call.  hNode is also\n not modified by this call.\n\n \\param hGraphExec - The executable graph in which to set the specified node\n \\param hNode      - Host node from the graph which was used to instantiate graphExec\n \\param nodeParams - The updated parameters to set\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphExecNodeSetParams,\n ::cuGraphAddHostNode,\n ::cuGraphHostNodeSetParams,\n ::cuGraphExecKernelNodeSetParams,\n ::cuGraphExecMemcpyNodeSetParams,\n ::cuGraphExecMemsetNodeSetParams,\n ::cuGraphExecChildGraphNodeSetParams,\n ::cuGraphExecEventRecordNodeSetEvent,\n ::cuGraphExecEventWaitNodeSetEvent,\n ::cuGraphExecExternalSemaphoresSignalNodeSetParams,\n ::cuGraphExecExternalSemaphoresWaitNodeSetParams,\n ::cuGraphExecUpdate,\n ::cuGraphInstantiate*/\n    fn cuGraphExecHostNodeSetParams(\n        hGraphExec: cuda_types::cuda::CUgraphExec,\n        hNode: cuda_types::cuda::CUgraphNode,\n        nodeParams: *const cuda_types::cuda::CUDA_HOST_NODE_PARAMS,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Updates node parameters in the child graph node in the given graphExec.\n\n Updates the work represented by \\p hNode in \\p hGraphExec as though the nodes contained\n in \\p hNode's graph had the parameters contained in \\p childGraph's nodes at instantiation.\n \\p hNode must remain in the graph which was used to instantiate \\p hGraphExec.\n Changed edges to and from \\p hNode are ignored.\n\n The modifications only affect future launches of \\p hGraphExec.  Already enqueued\n or running launches of \\p hGraphExec are not affected by this call.  \\p hNode is also\n not modified by this call.\n\n The topology of \\p childGraph, as well as the node insertion order,  must match that\n of the graph contained in \\p hNode.  See ::cuGraphExecUpdate() for a list of restrictions\n on what can be updated in an instantiated graph.  The update is recursive, so child graph\n nodes contained within the top level child graph will also be updated.\n\n \\param hGraphExec - The executable graph in which to set the specified node\n \\param hNode      - Host node from the graph which was used to instantiate graphExec\n \\param childGraph - The graph supplying the updated parameters\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphExecNodeSetParams,\n ::cuGraphAddChildGraphNode,\n ::cuGraphChildGraphNodeGetGraph,\n ::cuGraphExecKernelNodeSetParams,\n ::cuGraphExecMemcpyNodeSetParams,\n ::cuGraphExecMemsetNodeSetParams,\n ::cuGraphExecHostNodeSetParams,\n ::cuGraphExecEventRecordNodeSetEvent,\n ::cuGraphExecEventWaitNodeSetEvent,\n ::cuGraphExecExternalSemaphoresSignalNodeSetParams,\n ::cuGraphExecExternalSemaphoresWaitNodeSetParams,\n ::cuGraphExecUpdate,\n ::cuGraphInstantiate*/\n    fn cuGraphExecChildGraphNodeSetParams(\n        hGraphExec: cuda_types::cuda::CUgraphExec,\n        hNode: cuda_types::cuda::CUgraphNode,\n        childGraph: cuda_types::cuda::CUgraph,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the event for an event record node in the given graphExec\n\n Sets the event of an event record node in an executable graph \\p hGraphExec.\n The node is identified by the corresponding node \\p hNode in the\n non-executable graph, from which the executable graph was instantiated.\n\n The modifications only affect future launches of \\p hGraphExec. Already\n enqueued or running launches of \\p hGraphExec are not affected by this call.\n \\p hNode is also not modified by this call.\n\n \\param hGraphExec - The executable graph in which to set the specified node\n \\param hNode      - event record node from the graph from which graphExec was instantiated\n \\param event      - Updated event to use\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphExecNodeSetParams,\n ::cuGraphAddEventRecordNode,\n ::cuGraphEventRecordNodeGetEvent,\n ::cuGraphEventWaitNodeSetEvent,\n ::cuEventRecordWithFlags,\n ::cuStreamWaitEvent,\n ::cuGraphExecKernelNodeSetParams,\n ::cuGraphExecMemcpyNodeSetParams,\n ::cuGraphExecMemsetNodeSetParams,\n ::cuGraphExecHostNodeSetParams,\n ::cuGraphExecChildGraphNodeSetParams,\n ::cuGraphExecEventWaitNodeSetEvent,\n ::cuGraphExecExternalSemaphoresSignalNodeSetParams,\n ::cuGraphExecExternalSemaphoresWaitNodeSetParams,\n ::cuGraphExecUpdate,\n ::cuGraphInstantiate*/\n    fn cuGraphExecEventRecordNodeSetEvent(\n        hGraphExec: cuda_types::cuda::CUgraphExec,\n        hNode: cuda_types::cuda::CUgraphNode,\n        event: cuda_types::cuda::CUevent,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the event for an event wait node in the given graphExec\n\n Sets the event of an event wait node in an executable graph \\p hGraphExec.\n The node is identified by the corresponding node \\p hNode in the\n non-executable graph, from which the executable graph was instantiated.\n\n The modifications only affect future launches of \\p hGraphExec. Already\n enqueued or running launches of \\p hGraphExec are not affected by this call.\n \\p hNode is also not modified by this call.\n\n \\param hGraphExec - The executable graph in which to set the specified node\n \\param hNode      - event wait node from the graph from which graphExec was instantiated\n \\param event      - Updated event to use\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphExecNodeSetParams,\n ::cuGraphAddEventWaitNode,\n ::cuGraphEventWaitNodeGetEvent,\n ::cuGraphEventRecordNodeSetEvent,\n ::cuEventRecordWithFlags,\n ::cuStreamWaitEvent,\n ::cuGraphExecKernelNodeSetParams,\n ::cuGraphExecMemcpyNodeSetParams,\n ::cuGraphExecMemsetNodeSetParams,\n ::cuGraphExecHostNodeSetParams,\n ::cuGraphExecChildGraphNodeSetParams,\n ::cuGraphExecEventRecordNodeSetEvent,\n ::cuGraphExecExternalSemaphoresSignalNodeSetParams,\n ::cuGraphExecExternalSemaphoresWaitNodeSetParams,\n ::cuGraphExecUpdate,\n ::cuGraphInstantiate*/\n    fn cuGraphExecEventWaitNodeSetEvent(\n        hGraphExec: cuda_types::cuda::CUgraphExec,\n        hNode: cuda_types::cuda::CUgraphNode,\n        event: cuda_types::cuda::CUevent,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the parameters for an external semaphore signal node in the given graphExec\n\n Sets the parameters of an external semaphore signal node in an executable graph \\p hGraphExec.\n The node is identified by the corresponding node \\p hNode in the\n non-executable graph, from which the executable graph was instantiated.\n\n \\p hNode must not have been removed from the original graph.\n\n The modifications only affect future launches of \\p hGraphExec. Already\n enqueued or running launches of \\p hGraphExec are not affected by this call.\n \\p hNode is also not modified by this call.\n\n Changing \\p nodeParams->numExtSems is not supported.\n\n \\param hGraphExec - The executable graph in which to set the specified node\n \\param hNode      - semaphore signal node from the graph from which graphExec was instantiated\n \\param nodeParams - Updated Parameters to set\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphExecNodeSetParams,\n ::cuGraphAddExternalSemaphoresSignalNode,\n ::cuImportExternalSemaphore,\n ::cuSignalExternalSemaphoresAsync,\n ::cuWaitExternalSemaphoresAsync,\n ::cuGraphExecKernelNodeSetParams,\n ::cuGraphExecMemcpyNodeSetParams,\n ::cuGraphExecMemsetNodeSetParams,\n ::cuGraphExecHostNodeSetParams,\n ::cuGraphExecChildGraphNodeSetParams,\n ::cuGraphExecEventRecordNodeSetEvent,\n ::cuGraphExecEventWaitNodeSetEvent,\n ::cuGraphExecExternalSemaphoresWaitNodeSetParams,\n ::cuGraphExecUpdate,\n ::cuGraphInstantiate*/\n    fn cuGraphExecExternalSemaphoresSignalNodeSetParams(\n        hGraphExec: cuda_types::cuda::CUgraphExec,\n        hNode: cuda_types::cuda::CUgraphNode,\n        nodeParams: *const cuda_types::cuda::CUDA_EXT_SEM_SIGNAL_NODE_PARAMS,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the parameters for an external semaphore wait node in the given graphExec\n\n Sets the parameters of an external semaphore wait node in an executable graph \\p hGraphExec.\n The node is identified by the corresponding node \\p hNode in the\n non-executable graph, from which the executable graph was instantiated.\n\n \\p hNode must not have been removed from the original graph.\n\n The modifications only affect future launches of \\p hGraphExec. Already\n enqueued or running launches of \\p hGraphExec are not affected by this call.\n \\p hNode is also not modified by this call.\n\n Changing \\p nodeParams->numExtSems is not supported.\n\n \\param hGraphExec - The executable graph in which to set the specified node\n \\param hNode      - semaphore wait node from the graph from which graphExec was instantiated\n \\param nodeParams - Updated Parameters to set\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphExecNodeSetParams,\n ::cuGraphAddExternalSemaphoresWaitNode,\n ::cuImportExternalSemaphore,\n ::cuSignalExternalSemaphoresAsync,\n ::cuWaitExternalSemaphoresAsync,\n ::cuGraphExecKernelNodeSetParams,\n ::cuGraphExecMemcpyNodeSetParams,\n ::cuGraphExecMemsetNodeSetParams,\n ::cuGraphExecHostNodeSetParams,\n ::cuGraphExecChildGraphNodeSetParams,\n ::cuGraphExecEventRecordNodeSetEvent,\n ::cuGraphExecEventWaitNodeSetEvent,\n ::cuGraphExecExternalSemaphoresSignalNodeSetParams,\n ::cuGraphExecUpdate,\n ::cuGraphInstantiate*/\n    fn cuGraphExecExternalSemaphoresWaitNodeSetParams(\n        hGraphExec: cuda_types::cuda::CUgraphExec,\n        hNode: cuda_types::cuda::CUgraphNode,\n        nodeParams: *const cuda_types::cuda::CUDA_EXT_SEM_WAIT_NODE_PARAMS,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Enables or disables the specified node in the given graphExec\n\n Sets \\p hNode to be either enabled or disabled. Disabled nodes are functionally equivalent\n to empty nodes until they are reenabled. Existing node parameters are not affected by\n disabling/enabling the node.\n\n The node is identified by the corresponding node \\p hNode in the non-executable\n graph, from which the executable graph was instantiated.\n\n \\p hNode must not have been removed from the original graph.\n\n The modifications only affect future launches of \\p hGraphExec. Already\n enqueued or running launches of \\p hGraphExec are not affected by this call.\n \\p hNode is also not modified by this call.\n\n If \\p hNode is a device-updatable kernel node, the next upload/launch of \\p hGraphExec\n will overwrite any previous device-side updates. Additionally, applying host updates to a\n device-updatable kernel node while it is being updated from the device will result in\n undefined behavior.\n\n \\note Currently only kernel, memset and memcpy nodes are supported.\n\n \\param hGraphExec - The executable graph in which to set the specified node\n \\param hNode      - Node from the graph from which graphExec was instantiated\n \\param isEnabled  - Node is enabled if != 0, otherwise the node is disabled\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphNodeGetEnabled,\n ::cuGraphExecUpdate,\n ::cuGraphInstantiate\n ::cuGraphLaunch*/\n    fn cuGraphNodeSetEnabled(\n        hGraphExec: cuda_types::cuda::CUgraphExec,\n        hNode: cuda_types::cuda::CUgraphNode,\n        isEnabled: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Query whether a node in the given graphExec is enabled\n\n Sets isEnabled to 1 if \\p hNode is enabled, or 0 if \\p hNode is disabled.\n\n The node is identified by the corresponding node \\p hNode in the non-executable\n graph, from which the executable graph was instantiated.\n\n \\p hNode must not have been removed from the original graph.\n\n \\note Currently only kernel, memset and memcpy nodes are supported.\n \\note This function will not reflect device-side updates for device-updatable kernel nodes.\n\n \\param hGraphExec - The executable graph in which to set the specified node\n \\param hNode      - Node from the graph from which graphExec was instantiated\n \\param isEnabled  - Location to return the enabled status of the node\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphNodeSetEnabled,\n ::cuGraphExecUpdate,\n ::cuGraphInstantiate\n ::cuGraphLaunch*/\n    fn cuGraphNodeGetEnabled(\n        hGraphExec: cuda_types::cuda::CUgraphExec,\n        hNode: cuda_types::cuda::CUgraphNode,\n        isEnabled: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Uploads an executable graph in a stream\n\n Uploads \\p hGraphExec to the device in \\p hStream without executing it. Uploads of\n the same \\p hGraphExec will be serialized. Each upload is ordered behind both any\n previous work in \\p hStream and any previous launches of \\p hGraphExec.\n Uses memory cached by \\p stream to back the allocations owned by \\p hGraphExec.\n\n \\param hGraphExec - Executable graph to upload\n \\param hStream    - Stream in which to upload the graph\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphInstantiate,\n ::cuGraphLaunch,\n ::cuGraphExecDestroy*/\n    fn cuGraphUpload_ptsz(\n        hGraphExec: cuda_types::cuda::CUgraphExec,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Launches an executable graph in a stream\n\n Executes \\p hGraphExec in \\p hStream. Only one instance of \\p hGraphExec may be executing\n at a time. Each launch is ordered behind both any previous work in \\p hStream\n and any previous launches of \\p hGraphExec. To execute a graph concurrently, it must be\n instantiated multiple times into multiple executable graphs.\n\n If any allocations created by \\p hGraphExec remain unfreed (from a previous launch) and\n \\p hGraphExec was not instantiated with ::CUDA_GRAPH_INSTANTIATE_FLAG_AUTO_FREE_ON_LAUNCH,\n the launch will fail with ::CUDA_ERROR_INVALID_VALUE.\n\n \\param hGraphExec - Executable graph to launch\n \\param hStream    - Stream in which to launch the graph\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphInstantiate,\n ::cuGraphUpload,\n ::cuGraphExecDestroy*/\n    fn cuGraphLaunch_ptsz(\n        hGraphExec: cuda_types::cuda::CUgraphExec,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Destroys an executable graph\n\n Destroys the executable graph specified by \\p hGraphExec, as well\n as all of its executable nodes. If the executable graph is\n in-flight, it will not be terminated, but rather freed\n asynchronously on completion.\n\n \\param hGraphExec - Executable graph to destroy\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphInstantiate,\n ::cuGraphUpload,\n ::cuGraphLaunch*/\n    fn cuGraphExecDestroy(\n        hGraphExec: cuda_types::cuda::CUgraphExec,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Destroys a graph\n\n Destroys the graph specified by \\p hGraph, as well as all of its nodes.\n\n \\param hGraph - Graph to destroy\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphCreate*/\n    fn cuGraphDestroy(hGraph: cuda_types::cuda::CUgraph) -> cuda_types::cuda::CUresult;\n    /** \\brief Check whether an executable graph can be updated with a graph and perform the update if possible\n\n Updates the node parameters in the instantiated graph specified by \\p hGraphExec with the\n node parameters in a topologically identical graph specified by \\p hGraph.\n\n Limitations:\n\n - Kernel nodes:\n   - The owning context of the function cannot change.\n   - A node whose function originally did not use CUDA dynamic parallelism cannot be updated\n     to a function which uses CDP.\n   - A node whose function originally did not make device-side update calls cannot be updated\n     to a function which makes device-side update calls.\n   - A cooperative node cannot be updated to a non-cooperative node, and vice-versa.\n   - If the graph was instantiated with CUDA_GRAPH_INSTANTIATE_FLAG_USE_NODE_PRIORITY, the\n     priority attribute cannot change. Equality is checked on the originally requested\n     priority values, before they are clamped to the device's supported range.\n   - If \\p hGraphExec was not instantiated for device launch, a node whose function originally\n     did not use device-side cudaGraphLaunch() cannot be updated to a function which uses\n     device-side cudaGraphLaunch() unless the node resides on the same context as nodes which\n     contained such calls at instantiate-time. If no such calls were present at instantiation,\n     these updates cannot be performed at all.\n   - Neither \\p hGraph nor \\p hGraphExec may contain device-updatable kernel nodes.\n - Memset and memcpy nodes:\n   - The CUDA device(s) to which the operand(s) was allocated/mapped cannot change.\n   - The source/destination memory must be allocated from the same contexts as the original\n     source/destination memory.\n   - For 2d memsets, only address and assigned value may be updated.\n   - For 1d memsets, updating dimensions is also allowed, but may fail if the resulting operation doesn't\n     map onto the work resources already allocated for the node.\n - Additional memcpy node restrictions:\n   - Changing either the source or destination memory type(i.e. CU_MEMORYTYPE_DEVICE,\n     CU_MEMORYTYPE_ARRAY, etc.) is not supported.\n - External semaphore wait nodes and record nodes:\n   - Changing the number of semaphores is not supported.\n - Conditional nodes:\n   - Changing node parameters is not supported.\n   - Changing parameters of nodes within the conditional body graph is subject to the rules above.\n   - Conditional handle flags and default values are updated as part of the graph update.\n\n Note:  The API may add further restrictions in future releases.  The return code should always be checked.\n\n cuGraphExecUpdate sets the result member of \\p resultInfo to CU_GRAPH_EXEC_UPDATE_ERROR_TOPOLOGY_CHANGED\n under the following conditions:\n - The count of nodes directly in \\p hGraphExec and \\p hGraph differ, in which case resultInfo->errorNode\n   is set to NULL.\n - \\p hGraph has more exit nodes than \\p hGraph, in which case resultInfo->errorNode is set to one of\n   the exit nodes in hGraph.\n - A node in \\p hGraph has a different number of dependencies than the node from \\p hGraphExec it is paired with,\n   in which case resultInfo->errorNode is set to the node from \\p hGraph.\n - A node in \\p hGraph has a dependency that does not match with the corresponding dependency of the paired node\n   from \\p hGraphExec. resultInfo->errorNode will be set to the node from \\p hGraph. resultInfo->errorFromNode\n   will be set to the mismatched dependency. The dependencies are paired based on edge order and a dependency\n   does not match when the nodes are already paired based on other edges examined in the graph.\n\n cuGraphExecUpdate sets the result member of \\p resultInfo to:\n - CU_GRAPH_EXEC_UPDATE_ERROR if passed an invalid value.\n - CU_GRAPH_EXEC_UPDATE_ERROR_TOPOLOGY_CHANGED if the graph topology changed\n - CU_GRAPH_EXEC_UPDATE_ERROR_NODE_TYPE_CHANGED if the type of a node changed, in which case\n   \\p hErrorNode_out is set to the node from \\p hGraph.\n - CU_GRAPH_EXEC_UPDATE_ERROR_UNSUPPORTED_FUNCTION_CHANGE if the function changed in an unsupported\n   way(see note above), in which case \\p hErrorNode_out is set to the node from \\p hGraph\n - CU_GRAPH_EXEC_UPDATE_ERROR_PARAMETERS_CHANGED if any parameters to a node changed in a way\n   that is not supported, in which case \\p hErrorNode_out is set to the node from \\p hGraph.\n - CU_GRAPH_EXEC_UPDATE_ERROR_ATTRIBUTES_CHANGED if any attributes of a node changed in a way\n   that is not supported, in which case \\p hErrorNode_out is set to the node from \\p hGraph.\n - CU_GRAPH_EXEC_UPDATE_ERROR_NOT_SUPPORTED if something about a node is unsupported, like\n   the node's type or configuration, in which case \\p hErrorNode_out is set to the node from \\p hGraph\n\n If the update fails for a reason not listed above, the result member of \\p resultInfo will be set\n to CU_GRAPH_EXEC_UPDATE_ERROR. If the update succeeds, the result member will be set to CU_GRAPH_EXEC_UPDATE_SUCCESS.\n\n cuGraphExecUpdate returns CUDA_SUCCESS when the updated was performed successfully.  It returns\n CUDA_ERROR_GRAPH_EXEC_UPDATE_FAILURE if the graph update was not performed because it included\n changes which violated constraints specific to instantiated graph update.\n\n \\param hGraphExec The instantiated graph to be updated\n \\param hGraph The graph containing the updated parameters\n \\param resultInfo the error info structure\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_GRAPH_EXEC_UPDATE_FAILURE,\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphInstantiate*/\n    fn cuGraphExecUpdate_v2(\n        hGraphExec: cuda_types::cuda::CUgraphExec,\n        hGraph: cuda_types::cuda::CUgraph,\n        resultInfo: *mut cuda_types::cuda::CUgraphExecUpdateResultInfo,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Copies attributes from source node to destination node.\n\n Copies attributes from source node \\p src to destination node \\p dst.\n Both node must have the same context.\n\n \\param[out] dst Destination node\n \\param[in] src Source node\n For list of attributes see ::CUkernelNodeAttrID\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa\n ::CUaccessPolicyWindow*/\n    fn cuGraphKernelNodeCopyAttributes(\n        dst: cuda_types::cuda::CUgraphNode,\n        src: cuda_types::cuda::CUgraphNode,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Queries node attribute.\n\n Queries attribute \\p attr from node \\p hNode and stores it in corresponding\n member of \\p value_out.\n\n \\param[in] hNode\n \\param[in] attr\n \\param[out] value_out\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE\n \\notefnerr\n\n \\sa\n ::CUaccessPolicyWindow*/\n    fn cuGraphKernelNodeGetAttribute(\n        hNode: cuda_types::cuda::CUgraphNode,\n        attr: cuda_types::cuda::CUkernelNodeAttrID,\n        value_out: *mut cuda_types::cuda::CUkernelNodeAttrValue,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets node attribute.\n\n Sets attribute \\p attr on node \\p hNode from corresponding attribute of\n \\p value.\n\n \\param[out] hNode\n \\param[in] attr\n \\param[out] value\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE\n \\notefnerr\n\n \\sa\n ::CUaccessPolicyWindow*/\n    fn cuGraphKernelNodeSetAttribute(\n        hNode: cuda_types::cuda::CUgraphNode,\n        attr: cuda_types::cuda::CUkernelNodeAttrID,\n        value: *const cuda_types::cuda::CUkernelNodeAttrValue,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Write a DOT file describing graph structure\n\n Using the provided \\p hGraph, write to \\p path a DOT formatted description of the graph.\n By default this includes the graph topology, node types, node id, kernel names and memcpy direction.\n \\p flags can be specified to write more detailed information about each node type such as\n parameter values, kernel attributes, node and function handles.\n\n \\param hGraph - The graph to create a DOT file from\n \\param path   - The path to write the DOT file to\n \\param flags  - Flags from CUgraphDebugDot_flags for specifying which additional node information to write\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_OPERATING_SYSTEM*/\n    fn cuGraphDebugDotPrint(\n        hGraph: cuda_types::cuda::CUgraph,\n        path: *const ::core::ffi::c_char,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Create a user object\n\n Create a user object with the specified destructor callback and initial reference count. The\n initial references are owned by the caller.\n\n Destructor callbacks cannot make CUDA API calls and should avoid blocking behavior, as they\n are executed by a shared internal thread. Another thread may be signaled to perform such\n actions, if it does not block forward progress of tasks scheduled through CUDA.\n\n See CUDA User Objects in the CUDA C++ Programming Guide for more information on user objects.\n\n \\param object_out      - Location to return the user object handle\n \\param ptr             - The pointer to pass to the destroy function\n \\param destroy         - Callback to free the user object when it is no longer in use\n \\param initialRefcount - The initial refcount to create the object with, typically 1. The\n                          initial references are owned by the calling thread.\n \\param flags           - Currently it is required to pass ::CU_USER_OBJECT_NO_DESTRUCTOR_SYNC,\n                          which is the only defined flag. This indicates that the destroy\n                          callback cannot be waited on by any CUDA API. Users requiring\n                          synchronization of the callback should signal its completion\n                          manually.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuUserObjectRetain,\n ::cuUserObjectRelease,\n ::cuGraphRetainUserObject,\n ::cuGraphReleaseUserObject,\n ::cuGraphCreate*/\n    fn cuUserObjectCreate(\n        object_out: *mut cuda_types::cuda::CUuserObject,\n        ptr: *mut ::core::ffi::c_void,\n        destroy: cuda_types::cuda::CUhostFn,\n        initialRefcount: ::core::ffi::c_uint,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Retain a reference to a user object\n\n Retains new references to a user object. The new references are owned by the caller.\n\n See CUDA User Objects in the CUDA C++ Programming Guide for more information on user objects.\n\n \\param object - The object to retain\n \\param count  - The number of references to retain, typically 1. Must be nonzero\n                 and not larger than INT_MAX.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuUserObjectCreate,\n ::cuUserObjectRelease,\n ::cuGraphRetainUserObject,\n ::cuGraphReleaseUserObject,\n ::cuGraphCreate*/\n    fn cuUserObjectRetain(\n        object: cuda_types::cuda::CUuserObject,\n        count: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Release a reference to a user object\n\n Releases user object references owned by the caller. The object's destructor is invoked if\n the reference count reaches zero.\n\n It is undefined behavior to release references not owned by the caller, or to use a user\n object handle after all references are released.\n\n See CUDA User Objects in the CUDA C++ Programming Guide for more information on user objects.\n\n \\param object - The object to release\n \\param count  - The number of references to release, typically 1. Must be nonzero\n                 and not larger than INT_MAX.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuUserObjectCreate,\n ::cuUserObjectRetain,\n ::cuGraphRetainUserObject,\n ::cuGraphReleaseUserObject,\n ::cuGraphCreate*/\n    fn cuUserObjectRelease(\n        object: cuda_types::cuda::CUuserObject,\n        count: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Retain a reference to a user object from a graph\n\n Creates or moves user object references that will be owned by a CUDA graph.\n\n See CUDA User Objects in the CUDA C++ Programming Guide for more information on user objects.\n\n \\param graph  - The graph to associate the reference with\n \\param object - The user object to retain a reference for\n \\param count  - The number of references to add to the graph, typically 1. Must be\n                 nonzero and not larger than INT_MAX.\n \\param flags  - The optional flag ::CU_GRAPH_USER_OBJECT_MOVE transfers references\n                 from the calling thread, rather than create new references. Pass 0\n                 to create new references.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuUserObjectCreate,\n ::cuUserObjectRetain,\n ::cuUserObjectRelease,\n ::cuGraphReleaseUserObject,\n ::cuGraphCreate*/\n    fn cuGraphRetainUserObject(\n        graph: cuda_types::cuda::CUgraph,\n        object: cuda_types::cuda::CUuserObject,\n        count: ::core::ffi::c_uint,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Release a user object reference from a graph\n\n Releases user object references owned by a graph.\n\n See CUDA User Objects in the CUDA C++ Programming Guide for more information on user objects.\n\n \\param graph  - The graph that will release the reference\n \\param object - The user object to release a reference for\n \\param count  - The number of references to release, typically 1. Must be nonzero\n                 and not larger than INT_MAX.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuUserObjectCreate,\n ::cuUserObjectRetain,\n ::cuUserObjectRelease,\n ::cuGraphRetainUserObject,\n ::cuGraphCreate*/\n    fn cuGraphReleaseUserObject(\n        graph: cuda_types::cuda::CUgraph,\n        object: cuda_types::cuda::CUuserObject,\n        count: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Adds a node of arbitrary type to a graph\n\n Creates a new node in \\p hGraph described by \\p nodeParams with \\p numDependencies\n dependencies specified via \\p dependencies. \\p numDependencies may be 0.\n \\p dependencies may be null if \\p numDependencies is 0. \\p dependencies may not have\n any duplicate entries.\n\n \\p nodeParams is a tagged union. The node type should be specified in the \\p type field,\n and type-specific parameters in the corresponding union member. All unused bytes - that\n is, \\p reserved0 and all bytes past the utilized union member - must be set to zero.\n It is recommended to use brace initialization or memset to ensure all bytes are\n initialized.\n\n Note that for some node types, \\p nodeParams may contain \"out parameters\" which are\n modified during the call, such as \\p nodeParams->alloc.dptr.\n\n A handle to the new node will be returned in \\p phGraphNode.\n\n \\param phGraphNode     - Returns newly created node\n \\param hGraph          - Graph to which to add the node\n \\param dependencies    - Dependencies of the node\n \\param dependencyData  - Optional edge data for the dependencies. If NULL, the data is\n                          assumed to be default (zeroed) for all dependencies.\n \\param numDependencies - Number of dependencies\n \\param nodeParams      - Specification of the node\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_NOT_SUPPORTED\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphCreate,\n ::cuGraphNodeSetParams,\n ::cuGraphExecNodeSetParams*/\n    fn cuGraphAddNode_v2(\n        phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n        hGraph: cuda_types::cuda::CUgraph,\n        dependencies: *const cuda_types::cuda::CUgraphNode,\n        dependencyData: *const cuda_types::cuda::CUgraphEdgeData,\n        numDependencies: usize,\n        nodeParams: *mut cuda_types::cuda::CUgraphNodeParams,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Update's a graph node's parameters\n\n Sets the parameters of graph node \\p hNode to \\p nodeParams. The node type specified by\n \\p nodeParams->type must match the type of \\p hNode. \\p nodeParams must be fully\n initialized and all unused bytes (reserved, padding) zeroed.\n\n Modifying parameters is not supported for node types CU_GRAPH_NODE_TYPE_MEM_ALLOC and\n CU_GRAPH_NODE_TYPE_MEM_FREE.\n\n \\param hNode      - Node to set the parameters for\n \\param nodeParams - Parameters to copy\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_SUPPORTED\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphAddNode,\n ::cuGraphExecNodeSetParams*/\n    fn cuGraphNodeSetParams(\n        hNode: cuda_types::cuda::CUgraphNode,\n        nodeParams: *mut cuda_types::cuda::CUgraphNodeParams,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Update's a graph node's parameters in an instantiated graph\n\n Sets the parameters of a node in an executable graph \\p hGraphExec. The node is identified\n by the corresponding node \\p hNode in the non-executable graph from which the executable\n graph was instantiated. \\p hNode must not have been removed from the original graph.\n\n The modifications only affect future launches of \\p hGraphExec. Already\n enqueued or running launches of \\p hGraphExec are not affected by this call.\n \\p hNode is also not modified by this call.\n\n Allowed changes to parameters on executable graphs are as follows:\n <table>\n   <tr><th>Node type<th>Allowed changes\n   <tr><td>kernel<td>See ::cuGraphExecKernelNodeSetParams\n   <tr><td>memcpy<td>Addresses for 1-dimensional copies if allocated in same context; see ::cuGraphExecMemcpyNodeSetParams\n   <tr><td>memset<td>Addresses for 1-dimensional memsets if allocated in same context; see ::cuGraphExecMemsetNodeSetParams\n   <tr><td>host<td>Unrestricted\n   <tr><td>child graph<td>Topology must match and restrictions apply recursively; see ::cuGraphExecUpdate\n   <tr><td>event wait<td>Unrestricted\n   <tr><td>event record<td>Unrestricted\n   <tr><td>external semaphore signal<td>Number of semaphore operations cannot change\n   <tr><td>external semaphore wait<td>Number of semaphore operations cannot change\n   <tr><td>memory allocation<td>API unsupported\n   <tr><td>memory free<td>API unsupported\n   <tr><td>batch memops<td>Addresses, values, and operation type for wait operations; see ::cuGraphExecBatchMemOpNodeSetParams\n </table>\n\n \\param hGraphExec  - The executable graph in which to update the specified node\n \\param hNode       - Corresponding node from the graph from which graphExec was instantiated\n \\param nodeParams  - Updated Parameters to set\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_SUPPORTED\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphAddNode,\n ::cuGraphNodeSetParams\n ::cuGraphExecUpdate,\n ::cuGraphInstantiate*/\n    fn cuGraphExecNodeSetParams(\n        hGraphExec: cuda_types::cuda::CUgraphExec,\n        hNode: cuda_types::cuda::CUgraphNode,\n        nodeParams: *mut cuda_types::cuda::CUgraphNodeParams,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Create a conditional handle\n\n Creates a conditional handle associated with \\p hGraph.\n\n The conditional handle must be associated with a conditional node in this graph or one of its children.\n\n Handles not associated with a conditional node may cause graph instantiation to fail.\n\n Handles can only be set from the context with which they are associated.\n\n \\param pHandle_out        - Pointer used to return the handle to the caller.\n \\param hGraph             - Graph which will contain the conditional node using this handle.\n \\param ctx                - Context for the handle and associated conditional node.\n \\param defaultLaunchValue - Optional initial value for the conditional variable.\n                             Applied at the beginning of each graph execution if CU_GRAPH_COND_ASSIGN_DEFAULT is set in \\p flags.\n \\param flags              - Currently must be CU_GRAPH_COND_ASSIGN_DEFAULT or 0.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_SUPPORTED\n \\note_graph_thread_safety\n \\notefnerr\n\n \\sa\n ::cuGraphAddNode*/\n    fn cuGraphConditionalHandleCreate(\n        pHandle_out: *mut cuda_types::cuda::CUgraphConditionalHandle,\n        hGraph: cuda_types::cuda::CUgraph,\n        ctx: cuda_types::cuda::CUcontext,\n        defaultLaunchValue: ::core::ffi::c_uint,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns occupancy of a function\n\n Returns in \\p *numBlocks the number of the maximum active blocks per\n streaming multiprocessor.\n\n Note that the API can also be used with context-less kernel ::CUkernel\n by querying the handle using ::cuLibraryGetKernel() and then passing it\n to the API by casting to ::CUfunction. Here, the context to use for calculations\n will be the current context.\n\n \\param numBlocks       - Returned occupancy\n \\param func            - Kernel for which occupancy is calculated\n \\param blockSize       - Block size the kernel is intended to be launched with\n \\param dynamicSMemSize - Per-block dynamic shared memory usage intended, in bytes\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_UNKNOWN\n \\notefnerr\n\n \\sa\n ::cudaOccupancyMaxActiveBlocksPerMultiprocessor*/\n    fn cuOccupancyMaxActiveBlocksPerMultiprocessor(\n        numBlocks: *mut ::core::ffi::c_int,\n        func: cuda_types::cuda::CUfunction,\n        blockSize: ::core::ffi::c_int,\n        dynamicSMemSize: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns occupancy of a function\n\n Returns in \\p *numBlocks the number of the maximum active blocks per\n streaming multiprocessor.\n\n The \\p Flags parameter controls how special cases are handled. The\n valid flags are:\n\n - ::CU_OCCUPANCY_DEFAULT, which maintains the default behavior as\n   ::cuOccupancyMaxActiveBlocksPerMultiprocessor;\n\n - ::CU_OCCUPANCY_DISABLE_CACHING_OVERRIDE, which suppresses the\n   default behavior on platform where global caching affects\n   occupancy. On such platforms, if caching is enabled, but\n   per-block SM resource usage would result in zero occupancy, the\n   occupancy calculator will calculate the occupancy as if caching\n   is disabled. Setting ::CU_OCCUPANCY_DISABLE_CACHING_OVERRIDE makes\n   the occupancy calculator to return 0 in such cases. More information\n   can be found about this feature in the \"Unified L1/Texture Cache\"\n   section of the Maxwell tuning guide.\n\n Note that the API can also be with launch context-less kernel ::CUkernel\n by querying the handle using ::cuLibraryGetKernel() and then passing it\n to the API by casting to ::CUfunction. Here, the context to use for calculations\n will be the current context.\n\n \\param numBlocks       - Returned occupancy\n \\param func            - Kernel for which occupancy is calculated\n \\param blockSize       - Block size the kernel is intended to be launched with\n \\param dynamicSMemSize - Per-block dynamic shared memory usage intended, in bytes\n \\param flags           - Requested behavior for the occupancy calculator\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_UNKNOWN\n \\notefnerr\n\n \\sa\n ::cudaOccupancyMaxActiveBlocksPerMultiprocessorWithFlags*/\n    fn cuOccupancyMaxActiveBlocksPerMultiprocessorWithFlags(\n        numBlocks: *mut ::core::ffi::c_int,\n        func: cuda_types::cuda::CUfunction,\n        blockSize: ::core::ffi::c_int,\n        dynamicSMemSize: usize,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Suggest a launch configuration with reasonable occupancy\n\n Returns in \\p *blockSize a reasonable block size that can achieve\n the maximum occupancy (or, the maximum number of active warps with\n the fewest blocks per multiprocessor), and in \\p *minGridSize the\n minimum grid size to achieve the maximum occupancy.\n\n If \\p blockSizeLimit is 0, the configurator will use the maximum\n block size permitted by the device / function instead.\n\n If per-block dynamic shared memory allocation is not needed, the\n user should leave both \\p blockSizeToDynamicSMemSize and \\p\n dynamicSMemSize as 0.\n\n If per-block dynamic shared memory allocation is needed, then if\n the dynamic shared memory size is constant regardless of block\n size, the size should be passed through \\p dynamicSMemSize, and \\p\n blockSizeToDynamicSMemSize should be NULL.\n\n Otherwise, if the per-block dynamic shared memory size varies with\n different block sizes, the user needs to provide a unary function\n through \\p blockSizeToDynamicSMemSize that computes the dynamic\n shared memory needed by \\p func for any given block size. \\p\n dynamicSMemSize is ignored. An example signature is:\n\n \\code\n    // Take block size, returns dynamic shared memory needed\n    size_t blockToSmem(int blockSize);\n \\endcode\n\n Note that the API can also be used with context-less kernel ::CUkernel\n by querying the handle using ::cuLibraryGetKernel() and then passing it\n to the API by casting to ::CUfunction. Here, the context to use for calculations\n will be the current context.\n\n \\param minGridSize - Returned minimum grid size needed to achieve the maximum occupancy\n \\param blockSize   - Returned maximum block size that can achieve the maximum occupancy\n \\param func        - Kernel for which launch configuration is calculated\n \\param blockSizeToDynamicSMemSize - A function that calculates how much per-block dynamic shared memory \\p func uses based on the block size\n \\param dynamicSMemSize - Dynamic shared memory usage intended, in bytes\n \\param blockSizeLimit  - The maximum block size \\p func is designed to handle\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_UNKNOWN\n \\notefnerr\n\n \\sa\n ::cudaOccupancyMaxPotentialBlockSize*/\n    fn cuOccupancyMaxPotentialBlockSize(\n        minGridSize: *mut ::core::ffi::c_int,\n        blockSize: *mut ::core::ffi::c_int,\n        func: cuda_types::cuda::CUfunction,\n        blockSizeToDynamicSMemSize: cuda_types::cuda::CUoccupancyB2DSize,\n        dynamicSMemSize: usize,\n        blockSizeLimit: ::core::ffi::c_int,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Suggest a launch configuration with reasonable occupancy\n\n An extended version of ::cuOccupancyMaxPotentialBlockSize. In\n addition to arguments passed to ::cuOccupancyMaxPotentialBlockSize,\n ::cuOccupancyMaxPotentialBlockSizeWithFlags also takes a \\p Flags\n parameter.\n\n The \\p Flags parameter controls how special cases are handled. The\n valid flags are:\n\n - ::CU_OCCUPANCY_DEFAULT, which maintains the default behavior as\n   ::cuOccupancyMaxPotentialBlockSize;\n\n - ::CU_OCCUPANCY_DISABLE_CACHING_OVERRIDE, which suppresses the\n   default behavior on platform where global caching affects\n   occupancy. On such platforms, the launch configurations that\n   produces maximal occupancy might not support global\n   caching. Setting ::CU_OCCUPANCY_DISABLE_CACHING_OVERRIDE\n   guarantees that the the produced launch configuration is global\n   caching compatible at a potential cost of occupancy. More information\n   can be found about this feature in the \"Unified L1/Texture Cache\"\n   section of the Maxwell tuning guide.\n\n Note that the API can also be used with context-less kernel ::CUkernel\n by querying the handle using ::cuLibraryGetKernel() and then passing it\n to the API by casting to ::CUfunction. Here, the context to use for calculations\n will be the current context.\n\n \\param minGridSize - Returned minimum grid size needed to achieve the maximum occupancy\n \\param blockSize   - Returned maximum block size that can achieve the maximum occupancy\n \\param func        - Kernel for which launch configuration is calculated\n \\param blockSizeToDynamicSMemSize - A function that calculates how much per-block dynamic shared memory \\p func uses based on the block size\n \\param dynamicSMemSize - Dynamic shared memory usage intended, in bytes\n \\param blockSizeLimit  - The maximum block size \\p func is designed to handle\n \\param flags       - Options\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_UNKNOWN\n \\notefnerr\n\n \\sa\n ::cudaOccupancyMaxPotentialBlockSizeWithFlags*/\n    fn cuOccupancyMaxPotentialBlockSizeWithFlags(\n        minGridSize: *mut ::core::ffi::c_int,\n        blockSize: *mut ::core::ffi::c_int,\n        func: cuda_types::cuda::CUfunction,\n        blockSizeToDynamicSMemSize: cuda_types::cuda::CUoccupancyB2DSize,\n        dynamicSMemSize: usize,\n        blockSizeLimit: ::core::ffi::c_int,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns dynamic shared memory available per block when launching \\p numBlocks blocks on SM\n\n Returns in \\p *dynamicSmemSize the maximum size of dynamic shared memory to allow \\p numBlocks blocks per SM.\n\n Note that the API can also be used with context-less kernel ::CUkernel\n by querying the handle using ::cuLibraryGetKernel() and then passing it\n to the API by casting to ::CUfunction. Here, the context to use for calculations\n will be the current context.\n\n \\param dynamicSmemSize - Returned maximum dynamic shared memory\n \\param func            - Kernel function for which occupancy is calculated\n \\param numBlocks       - Number of blocks to fit on SM\n \\param blockSize       - Size of the blocks\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_UNKNOWN\n \\notefnerr*/\n    fn cuOccupancyAvailableDynamicSMemPerBlock(\n        dynamicSmemSize: *mut usize,\n        func: cuda_types::cuda::CUfunction,\n        numBlocks: ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Given the kernel function (\\p func) and launch configuration\n (\\p config), return the maximum cluster size in \\p *clusterSize.\n\n The cluster dimensions in \\p config are ignored. If func has a required\n cluster size set (see ::cudaFuncGetAttributes / ::cuFuncGetAttribute),\\p\n *clusterSize will reflect the required cluster size.\n\n By default this function will always return a value that's portable on\n future hardware. A higher value may be returned if the kernel function\n allows non-portable cluster sizes.\n\n This function will respect the compile time launch bounds.\n\n Note that the API can also be used with context-less kernel ::CUkernel\n by querying the handle using ::cuLibraryGetKernel() and then passing it\n to the API by casting to ::CUfunction. Here, the context to use for calculations\n will either be taken from the specified stream \\p config->hStream\n or the current context in case of NULL stream.\n\n \\param clusterSize - Returned maximum cluster size that can be launched\n                      for the given kernel function and launch configuration\n \\param func        - Kernel function for which maximum cluster\n                      size is calculated\n \\param config      - Launch configuration for the given kernel function\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_UNKNOWN\n \\notefnerr\n\n \\sa\n ::cudaFuncGetAttributes,\n ::cuFuncGetAttribute*/\n    fn cuOccupancyMaxPotentialClusterSize(\n        clusterSize: *mut ::core::ffi::c_int,\n        func: cuda_types::cuda::CUfunction,\n        config: *const cuda_types::cuda::CUlaunchConfig,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Given the kernel function (\\p func) and launch configuration\n (\\p config), return the maximum number of clusters that could co-exist\n on the target device in \\p *numClusters.\n\n If the function has required cluster size already set (see\n ::cudaFuncGetAttributes / ::cuFuncGetAttribute), the cluster size\n from config must either be unspecified or match the required size.\n Without required sizes, the cluster size must be specified in config,\n else the function will return an error.\n\n Note that various attributes of the kernel function may affect occupancy\n calculation. Runtime environment may affect how the hardware schedules\n the clusters, so the calculated occupancy is not guaranteed to be achievable.\n\n Note that the API can also be used with context-less kernel ::CUkernel\n by querying the handle using ::cuLibraryGetKernel() and then passing it\n to the API by casting to ::CUfunction. Here, the context to use for calculations\n will either be taken from the specified stream \\p config->hStream\n or the current context in case of NULL stream.\n\n \\param numClusters - Returned maximum number of clusters that\n                      could co-exist on the target device\n \\param func        - Kernel function for which maximum number\n                      of clusters are calculated\n \\param config      - Launch configuration for the given kernel function\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_CLUSTER_SIZE,\n ::CUDA_ERROR_UNKNOWN\n \\notefnerr\n\n \\sa\n ::cudaFuncGetAttributes,\n ::cuFuncGetAttribute*/\n    fn cuOccupancyMaxActiveClusters(\n        numClusters: *mut ::core::ffi::c_int,\n        func: cuda_types::cuda::CUfunction,\n        config: *const cuda_types::cuda::CUlaunchConfig,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Binds an array as a texture reference\n\n \\deprecated\n\n Binds the CUDA array \\p hArray to the texture reference \\p hTexRef. Any\n previous address or CUDA array state associated with the texture reference\n is superseded by this function. \\p Flags must be set to\n ::CU_TRSA_OVERRIDE_FORMAT. Any CUDA array previously bound to \\p hTexRef is\n unbound.\n\n \\param hTexRef - Texture reference to bind\n \\param hArray  - Array to bind\n \\param Flags   - Options (must be ::CU_TRSA_OVERRIDE_FORMAT)\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuTexRefSetAddress,\n ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode,\n ::cuTexRefSetFilterMode, ::cuTexRefSetFlags, ::cuTexRefSetFormat,\n ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray,\n ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat*/\n    fn cuTexRefSetArray(\n        hTexRef: cuda_types::cuda::CUtexref,\n        hArray: cuda_types::cuda::CUarray,\n        Flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Binds a mipmapped array to a texture reference\n\n \\deprecated\n\n Binds the CUDA mipmapped array \\p hMipmappedArray to the texture reference \\p hTexRef.\n Any previous address or CUDA array state associated with the texture reference\n is superseded by this function. \\p Flags must be set to ::CU_TRSA_OVERRIDE_FORMAT.\n Any CUDA array previously bound to \\p hTexRef is unbound.\n\n \\param hTexRef         - Texture reference to bind\n \\param hMipmappedArray - Mipmapped array to bind\n \\param Flags           - Options (must be ::CU_TRSA_OVERRIDE_FORMAT)\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuTexRefSetAddress,\n ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode,\n ::cuTexRefSetFilterMode, ::cuTexRefSetFlags, ::cuTexRefSetFormat,\n ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray,\n ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat*/\n    fn cuTexRefSetMipmappedArray(\n        hTexRef: cuda_types::cuda::CUtexref,\n        hMipmappedArray: cuda_types::cuda::CUmipmappedArray,\n        Flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Binds an address as a texture reference\n\n \\deprecated\n\n Binds a linear address range to the texture reference \\p hTexRef. Any\n previous address or CUDA array state associated with the texture reference\n is superseded by this function. Any memory previously bound to \\p hTexRef\n is unbound.\n\n Since the hardware enforces an alignment requirement on texture base\n addresses, ::cuTexRefSetAddress() passes back a byte offset in\n \\p *ByteOffset that must be applied to texture fetches in order to read from\n the desired memory. This offset must be divided by the texel size and\n passed to kernels that read from the texture so they can be applied to the\n ::tex1Dfetch() function.\n\n If the device memory pointer was returned from ::cuMemAlloc(), the offset\n is guaranteed to be 0 and NULL may be passed as the \\p ByteOffset parameter.\n\n The total number of elements (or texels) in the linear address range\n cannot exceed ::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LINEAR_WIDTH.\n The number of elements is computed as (\\p bytes / bytesPerElement),\n where bytesPerElement is determined from the data format and number of\n components set using ::cuTexRefSetFormat().\n\n \\param ByteOffset - Returned byte offset\n \\param hTexRef    - Texture reference to bind\n \\param dptr       - Device pointer to bind\n \\param bytes      - Size of memory to bind in bytes\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, ::cuTexRefSetArray,\n ::cuTexRefSetFilterMode, ::cuTexRefSetFlags, ::cuTexRefSetFormat,\n ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray,\n ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat*/\n    fn cuTexRefSetAddress_v2(\n        ByteOffset: *mut usize,\n        hTexRef: cuda_types::cuda::CUtexref,\n        dptr: cuda_types::cuda::CUdeviceptr,\n        bytes: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Binds an address as a 2D texture reference\n\n \\deprecated\n\n Binds a linear address range to the texture reference \\p hTexRef. Any\n previous address or CUDA array state associated with the texture reference\n is superseded by this function. Any memory previously bound to \\p hTexRef\n is unbound.\n\n Using a ::tex2D() function inside a kernel requires a call to either\n ::cuTexRefSetArray() to bind the corresponding texture reference to an\n array, or ::cuTexRefSetAddress2D() to bind the texture reference to linear\n memory.\n\n Function calls to ::cuTexRefSetFormat() cannot follow calls to\n ::cuTexRefSetAddress2D() for the same texture reference.\n\n It is required that \\p dptr be aligned to the appropriate hardware-specific\n texture alignment. You can query this value using the device attribute\n ::CU_DEVICE_ATTRIBUTE_TEXTURE_ALIGNMENT. If an unaligned \\p dptr is\n supplied, ::CUDA_ERROR_INVALID_VALUE is returned.\n\n \\p Pitch has to be aligned to the hardware-specific texture pitch alignment.\n This value can be queried using the device attribute\n ::CU_DEVICE_ATTRIBUTE_TEXTURE_PITCH_ALIGNMENT. If an unaligned \\p Pitch is\n supplied, ::CUDA_ERROR_INVALID_VALUE is returned.\n\n Width and Height, which are specified in elements (or texels), cannot exceed\n ::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_WIDTH and\n ::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_HEIGHT respectively.\n \\p Pitch, which is specified in bytes, cannot exceed\n ::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_PITCH.\n\n \\param hTexRef - Texture reference to bind\n \\param desc    - Descriptor of CUDA array\n \\param dptr    - Device pointer to bind\n \\param Pitch   - Line pitch in bytes\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuTexRefSetAddress,\n ::cuTexRefSetAddressMode, ::cuTexRefSetArray,\n ::cuTexRefSetFilterMode, ::cuTexRefSetFlags, ::cuTexRefSetFormat,\n ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray,\n ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat*/\n    fn cuTexRefSetAddress2D_v3(\n        hTexRef: cuda_types::cuda::CUtexref,\n        desc: *const cuda_types::cuda::CUDA_ARRAY_DESCRIPTOR,\n        dptr: cuda_types::cuda::CUdeviceptr,\n        Pitch: usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the format for a texture reference\n\n \\deprecated\n\n Specifies the format of the data to be read by the texture reference\n \\p hTexRef. \\p fmt and \\p NumPackedComponents are exactly analogous to the\n ::Format and ::NumChannels members of the ::CUDA_ARRAY_DESCRIPTOR structure:\n They specify the format of each component and the number of components per\n array element.\n\n \\param hTexRef             - Texture reference\n \\param fmt                 - Format to set\n \\param NumPackedComponents - Number of components per array element\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuTexRefSetAddress,\n ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, ::cuTexRefSetArray,\n ::cuTexRefSetFilterMode, ::cuTexRefSetFlags,\n ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray,\n ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat,\n ::cudaCreateChannelDesc*/\n    fn cuTexRefSetFormat(\n        hTexRef: cuda_types::cuda::CUtexref,\n        fmt: cuda_types::cuda::CUarray_format,\n        NumPackedComponents: ::core::ffi::c_int,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the addressing mode for a texture reference\n\n \\deprecated\n\n Specifies the addressing mode \\p am for the given dimension \\p dim of the\n texture reference \\p hTexRef. If \\p dim is zero, the addressing mode is\n applied to the first parameter of the functions used to fetch from the\n texture; if \\p dim is 1, the second, and so on. ::CUaddress_mode is defined\n as:\n \\code\ntypedef enum CUaddress_mode_enum {\nCU_TR_ADDRESS_MODE_WRAP = 0,\nCU_TR_ADDRESS_MODE_CLAMP = 1,\nCU_TR_ADDRESS_MODE_MIRROR = 2,\nCU_TR_ADDRESS_MODE_BORDER = 3\n} CUaddress_mode;\n \\endcode\n\n Note that this call has no effect if \\p hTexRef is bound to linear memory.\n Also, if the flag, ::CU_TRSF_NORMALIZED_COORDINATES, is not set, the only\n supported address mode is ::CU_TR_ADDRESS_MODE_CLAMP.\n\n \\param hTexRef - Texture reference\n \\param dim     - Dimension\n \\param am      - Addressing mode to set\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuTexRefSetAddress,\n ::cuTexRefSetAddress2D, ::cuTexRefSetArray,\n ::cuTexRefSetFilterMode, ::cuTexRefSetFlags, ::cuTexRefSetFormat,\n ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray,\n ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat*/\n    fn cuTexRefSetAddressMode(\n        hTexRef: cuda_types::cuda::CUtexref,\n        dim: ::core::ffi::c_int,\n        am: cuda_types::cuda::CUaddress_mode,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the filtering mode for a texture reference\n\n \\deprecated\n\n Specifies the filtering mode \\p fm to be used when reading memory through\n the texture reference \\p hTexRef. ::CUfilter_mode_enum is defined as:\n\n \\code\ntypedef enum CUfilter_mode_enum {\nCU_TR_FILTER_MODE_POINT = 0,\nCU_TR_FILTER_MODE_LINEAR = 1\n} CUfilter_mode;\n \\endcode\n\n Note that this call has no effect if \\p hTexRef is bound to linear memory.\n\n \\param hTexRef - Texture reference\n \\param fm      - Filtering mode to set\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuTexRefSetAddress,\n ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, ::cuTexRefSetArray,\n ::cuTexRefSetFlags, ::cuTexRefSetFormat,\n ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray,\n ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat*/\n    fn cuTexRefSetFilterMode(\n        hTexRef: cuda_types::cuda::CUtexref,\n        fm: cuda_types::cuda::CUfilter_mode,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the mipmap filtering mode for a texture reference\n\n \\deprecated\n\n Specifies the mipmap filtering mode \\p fm to be used when reading memory through\n the texture reference \\p hTexRef. ::CUfilter_mode_enum is defined as:\n\n \\code\ntypedef enum CUfilter_mode_enum {\nCU_TR_FILTER_MODE_POINT = 0,\nCU_TR_FILTER_MODE_LINEAR = 1\n} CUfilter_mode;\n \\endcode\n\n Note that this call has no effect if \\p hTexRef is not bound to a mipmapped array.\n\n \\param hTexRef - Texture reference\n \\param fm      - Filtering mode to set\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuTexRefSetAddress,\n ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, ::cuTexRefSetArray,\n ::cuTexRefSetFlags, ::cuTexRefSetFormat,\n ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray,\n ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat*/\n    fn cuTexRefSetMipmapFilterMode(\n        hTexRef: cuda_types::cuda::CUtexref,\n        fm: cuda_types::cuda::CUfilter_mode,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the mipmap level bias for a texture reference\n\n \\deprecated\n\n Specifies the mipmap level bias \\p bias to be added to the specified mipmap level when\n reading memory through the texture reference \\p hTexRef.\n\n Note that this call has no effect if \\p hTexRef is not bound to a mipmapped array.\n\n \\param hTexRef - Texture reference\n \\param bias    - Mipmap level bias\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuTexRefSetAddress,\n ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, ::cuTexRefSetArray,\n ::cuTexRefSetFlags, ::cuTexRefSetFormat,\n ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray,\n ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat*/\n    fn cuTexRefSetMipmapLevelBias(\n        hTexRef: cuda_types::cuda::CUtexref,\n        bias: f32,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the mipmap min/max mipmap level clamps for a texture reference\n\n \\deprecated\n\n Specifies the min/max mipmap level clamps, \\p minMipmapLevelClamp and \\p maxMipmapLevelClamp\n respectively, to be used when reading memory through the texture reference\n \\p hTexRef.\n\n Note that this call has no effect if \\p hTexRef is not bound to a mipmapped array.\n\n \\param hTexRef        - Texture reference\n \\param minMipmapLevelClamp - Mipmap min level clamp\n \\param maxMipmapLevelClamp - Mipmap max level clamp\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuTexRefSetAddress,\n ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, ::cuTexRefSetArray,\n ::cuTexRefSetFlags, ::cuTexRefSetFormat,\n ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray,\n ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat*/\n    fn cuTexRefSetMipmapLevelClamp(\n        hTexRef: cuda_types::cuda::CUtexref,\n        minMipmapLevelClamp: f32,\n        maxMipmapLevelClamp: f32,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the maximum anisotropy for a texture reference\n\n \\deprecated\n\n Specifies the maximum anisotropy \\p maxAniso to be used when reading memory through\n the texture reference \\p hTexRef.\n\n Note that this call has no effect if \\p hTexRef is bound to linear memory.\n\n \\param hTexRef  - Texture reference\n \\param maxAniso - Maximum anisotropy\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuTexRefSetAddress,\n ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, ::cuTexRefSetArray,\n ::cuTexRefSetFlags, ::cuTexRefSetFormat,\n ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray,\n ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat*/\n    fn cuTexRefSetMaxAnisotropy(\n        hTexRef: cuda_types::cuda::CUtexref,\n        maxAniso: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the border color for a texture reference\n\n \\deprecated\n\n Specifies the value of the RGBA color via the \\p pBorderColor to the texture reference\n \\p hTexRef. The color value supports only float type and holds color components in\n the following sequence:\n pBorderColor[0] holds 'R' component\n pBorderColor[1] holds 'G' component\n pBorderColor[2] holds 'B' component\n pBorderColor[3] holds 'A' component\n\n Note that the color values can be set only when the Address mode is set to\n CU_TR_ADDRESS_MODE_BORDER using ::cuTexRefSetAddressMode.\n Applications using integer border color values have to \"reinterpret_cast\" their values to float.\n\n \\param hTexRef       - Texture reference\n \\param pBorderColor  - RGBA color\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuTexRefSetAddressMode,\n ::cuTexRefGetAddressMode, ::cuTexRefGetBorderColor*/\n    fn cuTexRefSetBorderColor(\n        hTexRef: cuda_types::cuda::CUtexref,\n        pBorderColor: *mut f32,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the flags for a texture reference\n\n \\deprecated\n\n Specifies optional flags via \\p Flags to specify the behavior of data\n returned through the texture reference \\p hTexRef. The valid flags are:\n\n - ::CU_TRSF_READ_AS_INTEGER, which suppresses the default behavior of\n   having the texture promote integer data to floating point data in the\n   range [0, 1]. Note that texture with 32-bit integer format\n   would not be promoted, regardless of whether or not this\n   flag is specified;\n - ::CU_TRSF_NORMALIZED_COORDINATES, which suppresses the\n   default behavior of having the texture coordinates range\n   from [0, Dim) where Dim is the width or height of the CUDA\n   array. Instead, the texture coordinates [0, 1.0) reference\n   the entire breadth of the array dimension;\n - ::CU_TRSF_DISABLE_TRILINEAR_OPTIMIZATION, which disables any trilinear\n   filtering optimizations. Trilinear optimizations improve texture filtering\n   performance by allowing bilinear filtering on textures in scenarios where\n   it can closely approximate the expected results.\n\n \\param hTexRef - Texture reference\n \\param Flags   - Optional flags to set\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuTexRefSetAddress,\n ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, ::cuTexRefSetArray,\n ::cuTexRefSetFilterMode, ::cuTexRefSetFormat,\n ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray,\n ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat*/\n    fn cuTexRefSetFlags(\n        hTexRef: cuda_types::cuda::CUtexref,\n        Flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Gets the address associated with a texture reference\n\n \\deprecated\n\n Returns in \\p *pdptr the base address bound to the texture reference\n \\p hTexRef, or returns ::CUDA_ERROR_INVALID_VALUE if the texture reference\n is not bound to any device memory range.\n\n \\param pdptr   - Returned device address\n \\param hTexRef - Texture reference\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuTexRefSetAddress,\n ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, ::cuTexRefSetArray,\n ::cuTexRefSetFilterMode, ::cuTexRefSetFlags, ::cuTexRefSetFormat,\n ::cuTexRefGetAddressMode, ::cuTexRefGetArray,\n ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat*/\n    fn cuTexRefGetAddress_v2(\n        pdptr: *mut cuda_types::cuda::CUdeviceptr,\n        hTexRef: cuda_types::cuda::CUtexref,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Gets the array bound to a texture reference\n\n \\deprecated\n\n Returns in \\p *phArray the CUDA array bound to the texture reference\n \\p hTexRef, or returns ::CUDA_ERROR_INVALID_VALUE if the texture reference\n is not bound to any CUDA array.\n\n \\param phArray - Returned array\n \\param hTexRef - Texture reference\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuTexRefSetAddress,\n ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, ::cuTexRefSetArray,\n ::cuTexRefSetFilterMode, ::cuTexRefSetFlags, ::cuTexRefSetFormat,\n ::cuTexRefGetAddress, ::cuTexRefGetAddressMode,\n ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat*/\n    fn cuTexRefGetArray(\n        phArray: *mut cuda_types::cuda::CUarray,\n        hTexRef: cuda_types::cuda::CUtexref,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Gets the mipmapped array bound to a texture reference\n\n \\deprecated\n\n Returns in \\p *phMipmappedArray the CUDA mipmapped array bound to the texture\n reference \\p hTexRef, or returns ::CUDA_ERROR_INVALID_VALUE if the texture reference\n is not bound to any CUDA mipmapped array.\n\n \\param phMipmappedArray - Returned mipmapped array\n \\param hTexRef          - Texture reference\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuTexRefSetAddress,\n ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, ::cuTexRefSetArray,\n ::cuTexRefSetFilterMode, ::cuTexRefSetFlags, ::cuTexRefSetFormat,\n ::cuTexRefGetAddress, ::cuTexRefGetAddressMode,\n ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat*/\n    fn cuTexRefGetMipmappedArray(\n        phMipmappedArray: *mut cuda_types::cuda::CUmipmappedArray,\n        hTexRef: cuda_types::cuda::CUtexref,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Gets the addressing mode used by a texture reference\n\n \\deprecated\n\n Returns in \\p *pam the addressing mode corresponding to the\n dimension \\p dim of the texture reference \\p hTexRef. Currently, the only\n valid value for \\p dim are 0 and 1.\n\n \\param pam     - Returned addressing mode\n \\param hTexRef - Texture reference\n \\param dim     - Dimension\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuTexRefSetAddress,\n ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, ::cuTexRefSetArray,\n ::cuTexRefSetFilterMode, ::cuTexRefSetFlags, ::cuTexRefSetFormat,\n ::cuTexRefGetAddress, ::cuTexRefGetArray,\n ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat*/\n    fn cuTexRefGetAddressMode(\n        pam: *mut cuda_types::cuda::CUaddress_mode,\n        hTexRef: cuda_types::cuda::CUtexref,\n        dim: ::core::ffi::c_int,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Gets the filter-mode used by a texture reference\n\n \\deprecated\n\n Returns in \\p *pfm the filtering mode of the texture reference\n \\p hTexRef.\n\n \\param pfm     - Returned filtering mode\n \\param hTexRef - Texture reference\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuTexRefSetAddress,\n ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, ::cuTexRefSetArray,\n ::cuTexRefSetFilterMode, ::cuTexRefSetFlags, ::cuTexRefSetFormat,\n ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray,\n ::cuTexRefGetFlags, ::cuTexRefGetFormat*/\n    fn cuTexRefGetFilterMode(\n        pfm: *mut cuda_types::cuda::CUfilter_mode,\n        hTexRef: cuda_types::cuda::CUtexref,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Gets the format used by a texture reference\n\n \\deprecated\n\n Returns in \\p *pFormat and \\p *pNumChannels the format and number\n of components of the CUDA array bound to the texture reference \\p hTexRef.\n If \\p pFormat or \\p pNumChannels is NULL, it will be ignored.\n\n \\param pFormat      - Returned format\n \\param pNumChannels - Returned number of components\n \\param hTexRef      - Texture reference\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuTexRefSetAddress,\n ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, ::cuTexRefSetArray,\n ::cuTexRefSetFilterMode, ::cuTexRefSetFlags, ::cuTexRefSetFormat,\n ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray,\n ::cuTexRefGetFilterMode, ::cuTexRefGetFlags*/\n    fn cuTexRefGetFormat(\n        pFormat: *mut cuda_types::cuda::CUarray_format,\n        pNumChannels: *mut ::core::ffi::c_int,\n        hTexRef: cuda_types::cuda::CUtexref,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Gets the mipmap filtering mode for a texture reference\n\n \\deprecated\n\n Returns the mipmap filtering mode in \\p pfm that's used when reading memory through\n the texture reference \\p hTexRef.\n\n \\param pfm     - Returned mipmap filtering mode\n \\param hTexRef - Texture reference\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuTexRefSetAddress,\n ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, ::cuTexRefSetArray,\n ::cuTexRefSetFlags, ::cuTexRefSetFormat,\n ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray,\n ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat*/\n    fn cuTexRefGetMipmapFilterMode(\n        pfm: *mut cuda_types::cuda::CUfilter_mode,\n        hTexRef: cuda_types::cuda::CUtexref,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Gets the mipmap level bias for a texture reference\n\n \\deprecated\n\n Returns the mipmap level bias in \\p pBias that's added to the specified mipmap\n level when reading memory through the texture reference \\p hTexRef.\n\n \\param pbias   - Returned mipmap level bias\n \\param hTexRef - Texture reference\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuTexRefSetAddress,\n ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, ::cuTexRefSetArray,\n ::cuTexRefSetFlags, ::cuTexRefSetFormat,\n ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray,\n ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat*/\n    fn cuTexRefGetMipmapLevelBias(\n        pbias: *mut f32,\n        hTexRef: cuda_types::cuda::CUtexref,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Gets the min/max mipmap level clamps for a texture reference\n\n \\deprecated\n\n Returns the min/max mipmap level clamps in \\p pminMipmapLevelClamp and \\p pmaxMipmapLevelClamp\n that's used when reading memory through the texture reference \\p hTexRef.\n\n \\param pminMipmapLevelClamp - Returned mipmap min level clamp\n \\param pmaxMipmapLevelClamp - Returned mipmap max level clamp\n \\param hTexRef              - Texture reference\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuTexRefSetAddress,\n ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, ::cuTexRefSetArray,\n ::cuTexRefSetFlags, ::cuTexRefSetFormat,\n ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray,\n ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat*/\n    fn cuTexRefGetMipmapLevelClamp(\n        pminMipmapLevelClamp: *mut f32,\n        pmaxMipmapLevelClamp: *mut f32,\n        hTexRef: cuda_types::cuda::CUtexref,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Gets the maximum anisotropy for a texture reference\n\n \\deprecated\n\n Returns the maximum anisotropy in \\p pmaxAniso that's used when reading memory through\n the texture reference \\p hTexRef.\n\n \\param pmaxAniso - Returned maximum anisotropy\n \\param hTexRef   - Texture reference\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuTexRefSetAddress,\n ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, ::cuTexRefSetArray,\n ::cuTexRefSetFlags, ::cuTexRefSetFormat,\n ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray,\n ::cuTexRefGetFilterMode, ::cuTexRefGetFlags, ::cuTexRefGetFormat*/\n    fn cuTexRefGetMaxAnisotropy(\n        pmaxAniso: *mut ::core::ffi::c_int,\n        hTexRef: cuda_types::cuda::CUtexref,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Gets the border color used by a texture reference\n\n \\deprecated\n\n Returns in \\p pBorderColor, values of the RGBA color used by\n the texture reference \\p hTexRef.\n The color value is of type float and holds color components in\n the following sequence:\n pBorderColor[0] holds 'R' component\n pBorderColor[1] holds 'G' component\n pBorderColor[2] holds 'B' component\n pBorderColor[3] holds 'A' component\n\n \\param hTexRef  - Texture reference\n \\param pBorderColor   - Returned Type and Value of RGBA color\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuTexRefSetAddressMode,\n ::cuTexRefSetAddressMode, ::cuTexRefSetBorderColor*/\n    fn cuTexRefGetBorderColor(\n        pBorderColor: *mut f32,\n        hTexRef: cuda_types::cuda::CUtexref,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Gets the flags used by a texture reference\n\n \\deprecated\n\n Returns in \\p *pFlags the flags of the texture reference \\p hTexRef.\n\n \\param pFlags  - Returned flags\n \\param hTexRef - Texture reference\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuTexRefSetAddress,\n ::cuTexRefSetAddress2D, ::cuTexRefSetAddressMode, ::cuTexRefSetArray,\n ::cuTexRefSetFilterMode, ::cuTexRefSetFlags, ::cuTexRefSetFormat,\n ::cuTexRefGetAddress, ::cuTexRefGetAddressMode, ::cuTexRefGetArray,\n ::cuTexRefGetFilterMode, ::cuTexRefGetFormat*/\n    fn cuTexRefGetFlags(\n        pFlags: *mut ::core::ffi::c_uint,\n        hTexRef: cuda_types::cuda::CUtexref,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Creates a texture reference\n\n \\deprecated\n\n Creates a texture reference and returns its handle in \\p *pTexRef. Once\n created, the application must call ::cuTexRefSetArray() or\n ::cuTexRefSetAddress() to associate the reference with allocated memory.\n Other texture reference functions are used to specify the format and\n interpretation (addressing, filtering, etc.) to be used when the memory is\n read through this texture reference.\n\n \\param pTexRef - Returned texture reference\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuTexRefDestroy*/\n    fn cuTexRefCreate(\n        pTexRef: *mut cuda_types::cuda::CUtexref,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Destroys a texture reference\n\n \\deprecated\n\n Destroys the texture reference specified by \\p hTexRef.\n\n \\param hTexRef - Texture reference to destroy\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuTexRefCreate*/\n    fn cuTexRefDestroy(\n        hTexRef: cuda_types::cuda::CUtexref,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets the CUDA array for a surface reference.\n\n \\deprecated\n\n Sets the CUDA array \\p hArray to be read and written by the surface reference\n \\p hSurfRef.  Any previous CUDA array state associated with the surface\n reference is superseded by this function.  \\p Flags must be set to 0.\n The ::CUDA_ARRAY3D_SURFACE_LDST flag must have been set for the CUDA array.\n Any CUDA array previously bound to \\p hSurfRef is unbound.\n\n \\param hSurfRef - Surface reference handle\n \\param hArray - CUDA array handle\n \\param Flags - set to 0\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuModuleGetSurfRef,\n ::cuSurfRefGetArray*/\n    fn cuSurfRefSetArray(\n        hSurfRef: cuda_types::cuda::CUsurfref,\n        hArray: cuda_types::cuda::CUarray,\n        Flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Passes back the CUDA array bound to a surface reference.\n\n \\deprecated\n\n Returns in \\p *phArray the CUDA array bound to the surface reference\n \\p hSurfRef, or returns ::CUDA_ERROR_INVALID_VALUE if the surface reference\n is not bound to any CUDA array.\n\n \\param phArray - Surface reference handle\n \\param hSurfRef - Surface reference handle\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa ::cuModuleGetSurfRef, ::cuSurfRefSetArray*/\n    fn cuSurfRefGetArray(\n        phArray: *mut cuda_types::cuda::CUarray,\n        hSurfRef: cuda_types::cuda::CUsurfref,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Creates a texture object\n\n Creates a texture object and returns it in \\p pTexObject. \\p pResDesc describes\n the data to texture from. \\p pTexDesc describes how the data should be sampled.\n \\p pResViewDesc is an optional argument that specifies an alternate format for\n the data described by \\p pResDesc, and also describes the subresource region\n to restrict access to when texturing. \\p pResViewDesc can only be specified if\n the type of resource is a CUDA array or a CUDA mipmapped array not in a block\n compressed format.\n\n Texture objects are only supported on devices of compute capability 3.0 or higher.\n Additionally, a texture object is an opaque value, and, as such, should only be\n accessed through CUDA API calls.\n\n The ::CUDA_RESOURCE_DESC structure is defined as:\n \\code\ntypedef struct CUDA_RESOURCE_DESC_st\n{\nCUresourcetype resType;\n\nunion {\nstruct {\nCUarray hArray;\n} array;\nstruct {\nCUmipmappedArray hMipmappedArray;\n} mipmap;\nstruct {\nCUdeviceptr devPtr;\nCUarray_format format;\nunsigned int numChannels;\nsize_t sizeInBytes;\n} linear;\nstruct {\nCUdeviceptr devPtr;\nCUarray_format format;\nunsigned int numChannels;\nsize_t width;\nsize_t height;\nsize_t pitchInBytes;\n} pitch2D;\n} res;\n\nunsigned int flags;\n} CUDA_RESOURCE_DESC;\n\n \\endcode\n where:\n - ::CUDA_RESOURCE_DESC::resType specifies the type of resource to texture from.\n CUresourceType is defined as:\n \\code\ntypedef enum CUresourcetype_enum {\nCU_RESOURCE_TYPE_ARRAY           = 0x00,\nCU_RESOURCE_TYPE_MIPMAPPED_ARRAY = 0x01,\nCU_RESOURCE_TYPE_LINEAR          = 0x02,\nCU_RESOURCE_TYPE_PITCH2D         = 0x03\n} CUresourcetype;\n \\endcode\n\n \\par\n If ::CUDA_RESOURCE_DESC::resType is set to ::CU_RESOURCE_TYPE_ARRAY, ::CUDA_RESOURCE_DESC::res::array::hArray\n must be set to a valid CUDA array handle.\n\n \\par\n If ::CUDA_RESOURCE_DESC::resType is set to ::CU_RESOURCE_TYPE_MIPMAPPED_ARRAY, ::CUDA_RESOURCE_DESC::res::mipmap::hMipmappedArray\n must be set to a valid CUDA mipmapped array handle.\n\n \\par\n If ::CUDA_RESOURCE_DESC::resType is set to ::CU_RESOURCE_TYPE_LINEAR, ::CUDA_RESOURCE_DESC::res::linear::devPtr\n must be set to a valid device pointer, that is aligned to ::CU_DEVICE_ATTRIBUTE_TEXTURE_ALIGNMENT.\n ::CUDA_RESOURCE_DESC::res::linear::format and ::CUDA_RESOURCE_DESC::res::linear::numChannels\n describe the format of each component and the number of components per array element. ::CUDA_RESOURCE_DESC::res::linear::sizeInBytes\n specifies the size of the array in bytes. The total number of elements in the linear address range cannot exceed\n ::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LINEAR_WIDTH. The number of elements is computed as (sizeInBytes / (sizeof(format) * numChannels)).\n\n \\par\n If ::CUDA_RESOURCE_DESC::resType is set to ::CU_RESOURCE_TYPE_PITCH2D, ::CUDA_RESOURCE_DESC::res::pitch2D::devPtr\n must be set to a valid device pointer, that is aligned to ::CU_DEVICE_ATTRIBUTE_TEXTURE_ALIGNMENT.\n ::CUDA_RESOURCE_DESC::res::pitch2D::format and ::CUDA_RESOURCE_DESC::res::pitch2D::numChannels\n describe the format of each component and the number of components per array element. ::CUDA_RESOURCE_DESC::res::pitch2D::width\n and ::CUDA_RESOURCE_DESC::res::pitch2D::height specify the width and height of the array in elements, and cannot exceed\n ::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_WIDTH and ::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_HEIGHT respectively.\n ::CUDA_RESOURCE_DESC::res::pitch2D::pitchInBytes specifies the pitch between two rows in bytes and has to be aligned to\n ::CU_DEVICE_ATTRIBUTE_TEXTURE_PITCH_ALIGNMENT. Pitch cannot exceed ::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_PITCH.\n\n - ::flags must be set to zero.\n\n\n The ::CUDA_TEXTURE_DESC struct is defined as\n \\code\ntypedef struct CUDA_TEXTURE_DESC_st {\nCUaddress_mode addressMode[3];\nCUfilter_mode filterMode;\nunsigned int flags;\nunsigned int maxAnisotropy;\nCUfilter_mode mipmapFilterMode;\nfloat mipmapLevelBias;\nfloat minMipmapLevelClamp;\nfloat maxMipmapLevelClamp;\n} CUDA_TEXTURE_DESC;\n \\endcode\n where\n - ::CUDA_TEXTURE_DESC::addressMode specifies the addressing mode for each dimension of the texture data. ::CUaddress_mode is defined as:\n   \\code\ntypedef enum CUaddress_mode_enum {\nCU_TR_ADDRESS_MODE_WRAP = 0,\nCU_TR_ADDRESS_MODE_CLAMP = 1,\nCU_TR_ADDRESS_MODE_MIRROR = 2,\nCU_TR_ADDRESS_MODE_BORDER = 3\n} CUaddress_mode;\n   \\endcode\n   This is ignored if ::CUDA_RESOURCE_DESC::resType is ::CU_RESOURCE_TYPE_LINEAR. Also, if the flag, ::CU_TRSF_NORMALIZED_COORDINATES\n   is not set, the only supported address mode is ::CU_TR_ADDRESS_MODE_CLAMP.\n\n - ::CUDA_TEXTURE_DESC::filterMode specifies the filtering mode to be used when fetching from the texture. CUfilter_mode is defined as:\n   \\code\ntypedef enum CUfilter_mode_enum {\nCU_TR_FILTER_MODE_POINT = 0,\nCU_TR_FILTER_MODE_LINEAR = 1\n} CUfilter_mode;\n   \\endcode\n   This is ignored if ::CUDA_RESOURCE_DESC::resType is ::CU_RESOURCE_TYPE_LINEAR.\n\n - ::CUDA_TEXTURE_DESC::flags can be any combination of the following:\n   - ::CU_TRSF_READ_AS_INTEGER, which suppresses the default behavior of\n   having the texture promote integer data to floating point data in the\n   range [0, 1]. Note that texture with 32-bit integer format would not be\n   promoted, regardless of whether or not this flag is specified.\n   - ::CU_TRSF_NORMALIZED_COORDINATES, which suppresses the default behavior\n   of having the texture coordinates range from [0, Dim) where Dim is the\n   width or height of the CUDA array. Instead, the texture coordinates\n   [0, 1.0) reference the entire breadth of the array dimension; Note that\n   for CUDA mipmapped arrays, this flag has to be set.\n   - ::CU_TRSF_DISABLE_TRILINEAR_OPTIMIZATION, which disables any trilinear\n   filtering optimizations. Trilinear optimizations improve texture filtering\n   performance by allowing bilinear filtering on textures in scenarios where\n   it can closely approximate the expected results.\n   - ::CU_TRSF_SEAMLESS_CUBEMAP, which enables seamless cube map filtering.\n   This flag can only be specified if the underlying resource is a CUDA array\n   or a CUDA mipmapped array that was created with the flag ::CUDA_ARRAY3D_CUBEMAP.\n   When seamless cube map filtering is enabled, texture address modes specified\n   by ::CUDA_TEXTURE_DESC::addressMode are ignored. Instead, if the ::CUDA_TEXTURE_DESC::filterMode\n   is set to ::CU_TR_FILTER_MODE_POINT the address mode ::CU_TR_ADDRESS_MODE_CLAMP\n   will be applied for all dimensions. If the ::CUDA_TEXTURE_DESC::filterMode is\n   set to ::CU_TR_FILTER_MODE_LINEAR seamless cube map filtering will be performed\n   when sampling along the cube face borders.\n\n - ::CUDA_TEXTURE_DESC::maxAnisotropy specifies the maximum anisotropy ratio to be used when doing anisotropic filtering. This value will be\n   clamped to the range [1,16].\n\n - ::CUDA_TEXTURE_DESC::mipmapFilterMode specifies the filter mode when the calculated mipmap level lies between two defined mipmap levels.\n\n - ::CUDA_TEXTURE_DESC::mipmapLevelBias specifies the offset to be applied to the calculated mipmap level.\n\n - ::CUDA_TEXTURE_DESC::minMipmapLevelClamp specifies the lower end of the mipmap level range to clamp access to.\n\n - ::CUDA_TEXTURE_DESC::maxMipmapLevelClamp specifies the upper end of the mipmap level range to clamp access to.\n\n\n The ::CUDA_RESOURCE_VIEW_DESC struct is defined as\n \\code\ntypedef struct CUDA_RESOURCE_VIEW_DESC_st\n{\nCUresourceViewFormat format;\nsize_t width;\nsize_t height;\nsize_t depth;\nunsigned int firstMipmapLevel;\nunsigned int lastMipmapLevel;\nunsigned int firstLayer;\nunsigned int lastLayer;\n} CUDA_RESOURCE_VIEW_DESC;\n \\endcode\n where:\n - ::CUDA_RESOURCE_VIEW_DESC::format specifies how the data contained in the CUDA array or CUDA mipmapped array should\n   be interpreted. Note that this can incur a change in size of the texture data. If the resource view format is a block\n   compressed format, then the underlying CUDA array or CUDA mipmapped array has to have a base of format ::CU_AD_FORMAT_UNSIGNED_INT32.\n   with 2 or 4 channels, depending on the block compressed format. For ex., BC1 and BC4 require the underlying CUDA array to have\n   a format of ::CU_AD_FORMAT_UNSIGNED_INT32 with 2 channels. The other BC formats require the underlying resource to have the same base\n   format but with 4 channels.\n\n - ::CUDA_RESOURCE_VIEW_DESC::width specifies the new width of the texture data. If the resource view format is a block\n   compressed format, this value has to be 4 times the original width of the resource. For non block compressed formats,\n   this value has to be equal to that of the original resource.\n\n - ::CUDA_RESOURCE_VIEW_DESC::height specifies the new height of the texture data. If the resource view format is a block\n   compressed format, this value has to be 4 times the original height of the resource. For non block compressed formats,\n   this value has to be equal to that of the original resource.\n\n - ::CUDA_RESOURCE_VIEW_DESC::depth specifies the new depth of the texture data. This value has to be equal to that of the\n   original resource.\n\n - ::CUDA_RESOURCE_VIEW_DESC::firstMipmapLevel specifies the most detailed mipmap level. This will be the new mipmap level zero.\n   For non-mipmapped resources, this value has to be zero.::CUDA_TEXTURE_DESC::minMipmapLevelClamp and ::CUDA_TEXTURE_DESC::maxMipmapLevelClamp\n   will be relative to this value. For ex., if the firstMipmapLevel is set to 2, and a minMipmapLevelClamp of 1.2 is specified,\n   then the actual minimum mipmap level clamp will be 3.2.\n\n - ::CUDA_RESOURCE_VIEW_DESC::lastMipmapLevel specifies the least detailed mipmap level. For non-mipmapped resources, this value\n   has to be zero.\n\n - ::CUDA_RESOURCE_VIEW_DESC::firstLayer specifies the first layer index for layered textures. This will be the new layer zero.\n   For non-layered resources, this value has to be zero.\n\n - ::CUDA_RESOURCE_VIEW_DESC::lastLayer specifies the last layer index for layered textures. For non-layered resources,\n   this value has to be zero.\n\n\n \\param pTexObject   - Texture object to create\n \\param pResDesc     - Resource descriptor\n \\param pTexDesc     - Texture descriptor\n \\param pResViewDesc - Resource view descriptor\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuTexObjectDestroy,\n ::cudaCreateTextureObject*/\n    fn cuTexObjectCreate(\n        pTexObject: *mut cuda_types::cuda::CUtexObject,\n        pResDesc: *const cuda_types::cuda::CUDA_RESOURCE_DESC,\n        pTexDesc: *const cuda_types::cuda::CUDA_TEXTURE_DESC,\n        pResViewDesc: *const cuda_types::cuda::CUDA_RESOURCE_VIEW_DESC,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Destroys a texture object\n\n Destroys the texture object specified by \\p texObject.\n\n \\param texObject - Texture object to destroy\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuTexObjectCreate,\n ::cudaDestroyTextureObject*/\n    fn cuTexObjectDestroy(\n        texObject: cuda_types::cuda::CUtexObject,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a texture object's resource descriptor\n\n Returns the resource descriptor for the texture object specified by \\p texObject.\n\n \\param pResDesc  - Resource descriptor\n \\param texObject - Texture object\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuTexObjectCreate,\n ::cudaGetTextureObjectResourceDesc,*/\n    fn cuTexObjectGetResourceDesc(\n        pResDesc: *mut cuda_types::cuda::CUDA_RESOURCE_DESC,\n        texObject: cuda_types::cuda::CUtexObject,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a texture object's texture descriptor\n\n Returns the texture descriptor for the texture object specified by \\p texObject.\n\n \\param pTexDesc  - Texture descriptor\n \\param texObject - Texture object\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuTexObjectCreate,\n ::cudaGetTextureObjectTextureDesc*/\n    fn cuTexObjectGetTextureDesc(\n        pTexDesc: *mut cuda_types::cuda::CUDA_TEXTURE_DESC,\n        texObject: cuda_types::cuda::CUtexObject,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a texture object's resource view descriptor\n\n Returns the resource view descriptor for the texture object specified by \\p texObject.\n If no resource view was set for \\p texObject, the ::CUDA_ERROR_INVALID_VALUE is returned.\n\n \\param pResViewDesc - Resource view descriptor\n \\param texObject    - Texture object\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuTexObjectCreate,\n ::cudaGetTextureObjectResourceViewDesc*/\n    fn cuTexObjectGetResourceViewDesc(\n        pResViewDesc: *mut cuda_types::cuda::CUDA_RESOURCE_VIEW_DESC,\n        texObject: cuda_types::cuda::CUtexObject,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Creates a surface object\n\n Creates a surface object and returns it in \\p pSurfObject. \\p pResDesc describes\n the data to perform surface load/stores on. ::CUDA_RESOURCE_DESC::resType must be\n ::CU_RESOURCE_TYPE_ARRAY and  ::CUDA_RESOURCE_DESC::res::array::hArray\n must be set to a valid CUDA array handle. ::CUDA_RESOURCE_DESC::flags must be set to zero.\n\n Surface objects are only supported on devices of compute capability 3.0 or higher.\n Additionally, a surface object is an opaque value, and, as such, should only be\n accessed through CUDA API calls.\n\n \\param pSurfObject - Surface object to create\n \\param pResDesc    - Resource descriptor\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuSurfObjectDestroy,\n ::cudaCreateSurfaceObject*/\n    fn cuSurfObjectCreate(\n        pSurfObject: *mut cuda_types::cuda::CUsurfObject,\n        pResDesc: *const cuda_types::cuda::CUDA_RESOURCE_DESC,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Destroys a surface object\n\n Destroys the surface object specified by \\p surfObject.\n\n \\param surfObject - Surface object to destroy\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuSurfObjectCreate,\n ::cudaDestroySurfaceObject*/\n    fn cuSurfObjectDestroy(\n        surfObject: cuda_types::cuda::CUsurfObject,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns a surface object's resource descriptor\n\n Returns the resource descriptor for the surface object specified by \\p surfObject.\n\n \\param pResDesc   - Resource descriptor\n \\param surfObject - Surface object\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuSurfObjectCreate,\n ::cudaGetSurfaceObjectResourceDesc*/\n    fn cuSurfObjectGetResourceDesc(\n        pResDesc: *mut cuda_types::cuda::CUDA_RESOURCE_DESC,\n        surfObject: cuda_types::cuda::CUsurfObject,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Create a tensor map descriptor object representing tiled memory region\n\n Creates a descriptor for Tensor Memory Access (TMA) object specified\n by the parameters describing a tiled region and returns it in \\p tensorMap.\n\n Tensor map objects are only supported on devices of compute capability 9.0 or higher.\n Additionally, a tensor map object is an opaque value, and, as such, should only be\n accessed through CUDA APIs and PTX.\n\n The parameters passed are bound to the following requirements:\n\n - \\p tensorMap address must be aligned to 64 bytes.\n\n - \\p tensorDataType has to be an enum from ::CUtensorMapDataType which is defined as:\n \\code\ntypedef enum CUtensorMapDataType_enum {\nCU_TENSOR_MAP_DATA_TYPE_UINT8 = 0,       // 1 byte\nCU_TENSOR_MAP_DATA_TYPE_UINT16,          // 2 bytes\nCU_TENSOR_MAP_DATA_TYPE_UINT32,          // 4 bytes\nCU_TENSOR_MAP_DATA_TYPE_INT32,           // 4 bytes\nCU_TENSOR_MAP_DATA_TYPE_UINT64,          // 8 bytes\nCU_TENSOR_MAP_DATA_TYPE_INT64,           // 8 bytes\nCU_TENSOR_MAP_DATA_TYPE_FLOAT16,         // 2 bytes\nCU_TENSOR_MAP_DATA_TYPE_FLOAT32,         // 4 bytes\nCU_TENSOR_MAP_DATA_TYPE_FLOAT64,         // 8 bytes\nCU_TENSOR_MAP_DATA_TYPE_BFLOAT16,        // 2 bytes\nCU_TENSOR_MAP_DATA_TYPE_FLOAT32_FTZ,     // 4 bytes\nCU_TENSOR_MAP_DATA_TYPE_TFLOAT32,        // 4 bytes\nCU_TENSOR_MAP_DATA_TYPE_TFLOAT32_FTZ,    // 4 bytes\nCU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN8B,    // 4 bits\nCU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN16B,   // 4 bits\nCU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B    // 6 bits\n} CUtensorMapDataType;\n \\endcode\n  ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN8B copies '16 x U4' packed values to memory aligned as 8 bytes. There are no gaps between packed values.\n  ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN16B copies '16 x U4' packed values to memory aligned as 16 bytes. There are 8 byte gaps between every 8 byte chunk of packed values.\n  ::CU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B copies '16 x U6' packed values to memory aligned as 16 bytes. There are 4 byte gaps between every 12 byte chunk of packed values.\n\n - \\p tensorRank must be non-zero and less than or equal to the maximum supported dimensionality of 5. If \\p interleave is not\n ::CU_TENSOR_MAP_INTERLEAVE_NONE, then \\p tensorRank must additionally be greater than or equal to 3.\n\n - \\p globalAddress, which specifies the starting address of the memory region described, must be 16 byte aligned. The following requirements need to also be met:\n    - When \\p interleave is ::CU_TENSOR_MAP_INTERLEAVE_32B, \\p globalAddress must be 32 byte aligned.\n    - When \\p tensorDataType is ::CU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B or ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN16B, \\p globalAddress must be 32 byte aligned.\n\n - \\p globalDim array, which specifies tensor size of each of the \\p tensorRank dimensions, must be non-zero and less than or\n equal to 2^32. Additionally, the following requirements need to be met for the packed data types:\n    - When \\p tensorDataType is ::CU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B or ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN16B, globalDim[0] must be a multiple of 128.\n    - When \\p tensorDataType is ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN8B, \\p globalDim[0] must be a multiple of 2.\n    - Dimension for the packed data types must reflect the number of individual U# values.\n\n - \\p globalStrides array, which specifies tensor stride of each of the lower \\p tensorRank - 1 dimensions in bytes, must be a\n multiple of 16 and less than 2^40. Additionally, the following requirements need to be met:\n    - When \\p interleave is ::CU_TENSOR_MAP_INTERLEAVE_32B, the strides must be a multiple of 32.\n    - When \\p tensorDataType is ::CU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B or ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN16B, the strides must be a multiple of 32.\n Each following dimension specified includes previous dimension stride:\n \\code\nglobalStrides[0] = globalDim[0] * elementSizeInBytes(tensorDataType) + padding[0];\nfor (i = 1; i < tensorRank - 1; i++)\nglobalStrides[i] = globalStrides[i – 1] * (globalDim[i] + padding[i]);\nassert(globalStrides[i] >= globalDim[i]);\n \\endcode\n\n - \\p boxDim array, which specifies number of elements to be traversed along each of the \\p tensorRank dimensions, must be non-zero\n and less than or equal to 256. Additionally, the following requirements need to be met:\n    - When \\p interleave is ::CU_TENSOR_MAP_INTERLEAVE_NONE, { \\p boxDim[0] * elementSizeInBytes( \\p tensorDataType ) } must be a multiple of 16 bytes.\n    - When \\p tensorDataType is ::CU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B or ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN16B, boxDim[0] must be 128.\n\n - \\p elementStrides array, which specifies the iteration step along each of the \\p tensorRank dimensions, must be non-zero and less\n than or equal to 8. Note that when \\p interleave is ::CU_TENSOR_MAP_INTERLEAVE_NONE, the first element of this array is ignored since\n TMA doesn’t support the stride for dimension zero.\n When all elements of \\p elementStrides array is one, \\p boxDim specifies the number of elements to load. However, if the \\p elementStrides[i]\n is not equal to one, then TMA loads ceil( \\p boxDim[i] / \\p elementStrides[i]) number of elements along i-th dimension. To load N elements along\n i-th dimension, \\p boxDim[i] must be set to N * \\p elementStrides[i].\n\n - \\p interleave specifies the interleaved layout of type ::CUtensorMapInterleave, which is defined as:\n \\code\ntypedef enum CUtensorMapInterleave_enum {\nCU_TENSOR_MAP_INTERLEAVE_NONE = 0,\nCU_TENSOR_MAP_INTERLEAVE_16B,\nCU_TENSOR_MAP_INTERLEAVE_32B\n} CUtensorMapInterleave;\n \\endcode\n TMA supports interleaved layouts like NC/8HWC8 where C8 utilizes 16 bytes in memory assuming 2 byte per channel or NC/16HWC16 where C16\n uses 32 bytes.\n When \\p interleave is ::CU_TENSOR_MAP_INTERLEAVE_NONE and \\p swizzle is not ::CU_TENSOR_MAP_SWIZZLE_NONE, the bounding box inner dimension\n (computed as \\p boxDim[0] multiplied by element size derived from \\p tensorDataType) must be less than or equal to the swizzle size.\n    - CU_TENSOR_MAP_SWIZZLE_32B requires the bounding box inner dimension to be <= 32.\n    - CU_TENSOR_MAP_SWIZZLE_64B requires the bounding box inner dimension to be <= 64.\n    - CU_TENSOR_MAP_SWIZZLE_128B* require the bounding box inner dimension to be <= 128.\n Additionally, \\p tensorDataType of ::CU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B requires \\p interleave to be ::CU_TENSOR_MAP_INTERLEAVE_NONE.\n\n - \\p swizzle, which specifies the shared memory bank swizzling pattern, has to be of type ::CUtensorMapSwizzle which is defined as:\n \\code\ntypedef enum CUtensorMapSwizzle_enum {\nCU_TENSOR_MAP_SWIZZLE_NONE = 0,\nCU_TENSOR_MAP_SWIZZLE_32B,                   // Swizzle 16B chunks within 32B  span\nCU_TENSOR_MAP_SWIZZLE_64B,                   // Swizzle 16B chunks within 64B  span\nCU_TENSOR_MAP_SWIZZLE_128B,                  // Swizzle 16B chunks within 128B span\nCU_TENSOR_MAP_SWIZZLE_128B_ATOM_32B,         // Swizzle 32B chunks within 128B span\nCU_TENSOR_MAP_SWIZZLE_128B_ATOM_32B_FLIP_8B, // Swizzle 32B chunks within 128B span, additionally swap lower 8B with upper 8B within each 16B for every alternate row\nCU_TENSOR_MAP_SWIZZLE_128B_ATOM_64B          // Swizzle 64B chunks within 128B span\n} CUtensorMapSwizzle;\n \\endcode\n Data are organized in a specific order in global memory; however, this may not match the order in which the application accesses data\n in shared memory. This difference in data organization may cause bank conflicts when shared memory is accessed. In order to avoid this\n problem, data can be loaded to shared memory with shuffling across shared memory banks.\n When \\p interleave is ::CU_TENSOR_MAP_INTERLEAVE_32B, \\p swizzle must be ::CU_TENSOR_MAP_SWIZZLE_32B.\n Other interleave modes can have any swizzling pattern.\n When the \\p tensorDataType is ::CU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B, only the following swizzle modes are supported:\n    - CU_TENSOR_MAP_SWIZZLE_NONE (Load & Store)\n    - CU_TENSOR_MAP_SWIZZLE_128B (Load & Store)\n    - CU_TENSOR_MAP_SWIZZLE_128B_ATOM_32B (Load & Store)\n    - CU_TENSOR_MAP_SWIZZLE_128B_ATOM_64B (Store only)\n When the \\p tensorDataType is ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN16B, only the following swizzle modes are supported:\n    - CU_TENSOR_MAP_SWIZZLE_NONE (Load only)\n    - CU_TENSOR_MAP_SWIZZLE_128B (Load only)\n    - CU_TENSOR_MAP_SWIZZLE_128B_ATOM_32B (Load only)\n\n - \\p l2Promotion specifies L2 fetch size which indicates the byte granurality at which L2 requests is filled from DRAM. It must be of\n type ::CUtensorMapL2promotion, which is defined as:\n \\code\ntypedef enum CUtensorMapL2promotion_enum {\nCU_TENSOR_MAP_L2_PROMOTION_NONE = 0,\nCU_TENSOR_MAP_L2_PROMOTION_L2_64B,\nCU_TENSOR_MAP_L2_PROMOTION_L2_128B,\nCU_TENSOR_MAP_L2_PROMOTION_L2_256B\n} CUtensorMapL2promotion;\n \\endcode\n\n - \\p oobFill, which indicates whether zero or a special NaN constant should be used to fill out-of-bound elements, must be of type\n ::CUtensorMapFloatOOBfill which is defined as:\n \\code\ntypedef enum CUtensorMapFloatOOBfill_enum {\nCU_TENSOR_MAP_FLOAT_OOB_FILL_NONE = 0,\nCU_TENSOR_MAP_FLOAT_OOB_FILL_NAN_REQUEST_ZERO_FMA\n} CUtensorMapFloatOOBfill;\n \\endcode\n Note that ::CU_TENSOR_MAP_FLOAT_OOB_FILL_NAN_REQUEST_ZERO_FMA can only be used when \\p tensorDataType represents a floating-point data type,\n and when \\p tensorDataType is not ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN8B, ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN16B, and ::CU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B.\n\n \\param tensorMap         - Tensor map object to create\n \\param tensorDataType    - Tensor data type\n \\param tensorRank        - Dimensionality of tensor\n \\param globalAddress     - Starting address of memory region described by tensor\n \\param globalDim         - Array containing tensor size (number of elements) along each of the \\p tensorRank dimensions\n \\param globalStrides     - Array containing stride size (in bytes) along each of the \\p tensorRank - 1 dimensions\n \\param boxDim            - Array containing traversal box size (number of elments) along each of the \\p tensorRank dimensions. Specifies how many elements to be traversed along each tensor dimension.\n \\param elementStrides    - Array containing traversal stride in each of the \\p tensorRank dimensions\n \\param interleave        - Type of interleaved layout the tensor addresses\n \\param swizzle           - Bank swizzling pattern inside shared memory\n \\param l2Promotion       - L2 promotion size\n \\param oobFill           - Indicate whether zero or special NaN constant must be used to fill out-of-bound elements\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuTensorMapEncodeIm2col,\n ::cuTensorMapEncodeIm2colWide,\n ::cuTensorMapReplaceAddress*/\n    fn cuTensorMapEncodeTiled(\n        tensorMap: *mut cuda_types::cuda::CUtensorMap,\n        tensorDataType: cuda_types::cuda::CUtensorMapDataType,\n        tensorRank: cuda_types::cuda::cuuint32_t,\n        globalAddress: *mut ::core::ffi::c_void,\n        globalDim: *const cuda_types::cuda::cuuint64_t,\n        globalStrides: *const cuda_types::cuda::cuuint64_t,\n        boxDim: *const cuda_types::cuda::cuuint32_t,\n        elementStrides: *const cuda_types::cuda::cuuint32_t,\n        interleave: cuda_types::cuda::CUtensorMapInterleave,\n        swizzle: cuda_types::cuda::CUtensorMapSwizzle,\n        l2Promotion: cuda_types::cuda::CUtensorMapL2promotion,\n        oobFill: cuda_types::cuda::CUtensorMapFloatOOBfill,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Create a tensor map descriptor object representing im2col memory region\n\n Creates a descriptor for Tensor Memory Access (TMA) object specified\n by the parameters describing a im2col memory layout and returns it in \\p tensorMap.\n\n Tensor map objects are only supported on devices of compute capability 9.0 or higher.\n Additionally, a tensor map object is an opaque value, and, as such, should only be\n accessed through CUDA APIs and PTX.\n\n The parameters passed are bound to the following requirements:\n\n - \\p tensorMap address must be aligned to 64 bytes.\n\n - \\p tensorDataType has to be an enum from ::CUtensorMapDataType which is defined as:\n \\code\ntypedef enum CUtensorMapDataType_enum {\nCU_TENSOR_MAP_DATA_TYPE_UINT8 = 0,       // 1 byte\nCU_TENSOR_MAP_DATA_TYPE_UINT16,          // 2 bytes\nCU_TENSOR_MAP_DATA_TYPE_UINT32,          // 4 bytes\nCU_TENSOR_MAP_DATA_TYPE_INT32,           // 4 bytes\nCU_TENSOR_MAP_DATA_TYPE_UINT64,          // 8 bytes\nCU_TENSOR_MAP_DATA_TYPE_INT64,           // 8 bytes\nCU_TENSOR_MAP_DATA_TYPE_FLOAT16,         // 2 bytes\nCU_TENSOR_MAP_DATA_TYPE_FLOAT32,         // 4 bytes\nCU_TENSOR_MAP_DATA_TYPE_FLOAT64,         // 8 bytes\nCU_TENSOR_MAP_DATA_TYPE_BFLOAT16,        // 2 bytes\nCU_TENSOR_MAP_DATA_TYPE_FLOAT32_FTZ,     // 4 bytes\nCU_TENSOR_MAP_DATA_TYPE_TFLOAT32,        // 4 bytes\nCU_TENSOR_MAP_DATA_TYPE_TFLOAT32_FTZ     // 4 bytes\nCU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN8B,    // 4 bits\nCU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN16B,   // 4 bits\nCU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B    // 6 bits\n} CUtensorMapDataType;\n \\endcode\n  ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN8B copies '16 x U4' packed values to memory aligned as 8 bytes. There are no gaps between packed values.\n  ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN16B copies '16 x U4' packed values to memory aligned as 16 bytes. There are 8 byte gaps between every 8 byte chunk of packed values.\n  ::CU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B copies '16 x U6' packed values to memory aligned as 16 bytes. There are 4 byte gaps between every 12 byte chunk of packed values.\n\n - \\p tensorRank, which specifies the number of tensor dimensions, must be 3, 4, or 5.\n\n - \\p globalAddress, which specifies the starting address of the memory region described, must be 16 byte aligned. The following requirements need to also be met:\n    - When \\p interleave is ::CU_TENSOR_MAP_INTERLEAVE_32B, \\p globalAddress must be 32 byte aligned.\n    - When \\p tensorDataType is ::CU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B or ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN16B, \\p globalAddress must be 32 byte aligned.\n\n - \\p globalDim array, which specifies tensor size of each of the \\p tensorRank dimensions, must be non-zero and less than or\n equal to 2^32. Additionally, the following requirements need to be met for the packed data types:\n    - When \\p tensorDataType is ::CU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B or ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN16B, globalDim[0] must be a multiple of 128.\n    - When \\p tensorDataType is ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN8B, \\p globalDim[0] must be a multiple of 2.\n    - Dimension for the packed data types must reflect the number of individual U# values.\n\n - \\p globalStrides array, which specifies tensor stride of each of the lower \\p tensorRank - 1 dimensions in bytes, must be a\n multiple of 16 and less than 2^40. Additionally, the following requirements need to be met:\n    - When \\p interleave is ::CU_TENSOR_MAP_INTERLEAVE_32B, the strides must be a multiple of 32.\n    - When \\p tensorDataType is ::CU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B or ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN16B, the strides must be a multiple of 32.\n Each following dimension specified includes previous dimension stride:\n \\code\nglobalStrides[0] = globalDim[0] * elementSizeInBytes(tensorDataType) + padding[0];\nfor (i = 1; i < tensorRank - 1; i++)\nglobalStrides[i] = globalStrides[i – 1] * (globalDim[i] + padding[i]);\nassert(globalStrides[i] >= globalDim[i]);\n \\endcode\n\n - \\p pixelBoxLowerCorner array specifies the coordinate offsets {D, H, W} of the bounding box from top/left/front corner. The number of\n offsets and their precision depend on the tensor dimensionality:\n    - When \\p tensorRank is 3, one signed offset within range [-32768, 32767] is supported.\n    - When \\p tensorRank is 4, two signed offsets each within range [-128, 127] are supported.\n    - When \\p tensorRank is 5, three offsets each within range [-16, 15] are supported.\n\n - \\p pixelBoxUpperCorner array specifies the coordinate offsets {D, H, W} of the bounding box from bottom/right/back corner. The number of\n offsets and their precision depend on the tensor dimensionality:\n    - When \\p tensorRank is 3, one signed offset within range [-32768, 32767] is supported.\n    - When \\p tensorRank is 4, two signed offsets each within range [-128, 127] are supported.\n    - When \\p tensorRank is 5, three offsets each within range [-16, 15] are supported.\n The bounding box specified by \\p pixelBoxLowerCorner and \\p pixelBoxUpperCorner must have non-zero area.\n\n - \\p channelsPerPixel, which specifies the number of elements which must be accessed along C dimension, must be less than or equal to 256.\n Additionally, when \\p tensorDataType is ::CU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B or ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN16B, \\p channelsPerPixel must be 128.\n\n - \\p pixelsPerColumn, which specifies the number of elements that must be accessed along the {N, D, H, W} dimensions, must be less than or\n equal to 1024.\n\n - \\p elementStrides array, which specifies the iteration step along each of the \\p tensorRank dimensions, must be non-zero and less\n than or equal to 8. Note that when \\p interleave is ::CU_TENSOR_MAP_INTERLEAVE_NONE, the first element of this array is ignored since\n TMA doesn’t support the stride for dimension zero.\n When all elements of the \\p elementStrides array are one, \\p boxDim specifies the number of elements to load. However, if \\p elementStrides[i]\n is not equal to one for some \\p i, then TMA loads ceil( \\p boxDim[i] / \\p elementStrides[i]) number of elements along i-th dimension.\n To load N elements along i-th dimension, \\p boxDim[i] must be set to N * \\p elementStrides[i].\n\n - \\p interleave specifies the interleaved layout of type ::CUtensorMapInterleave, which is defined as:\n \\code\ntypedef enum CUtensorMapInterleave_enum {\nCU_TENSOR_MAP_INTERLEAVE_NONE = 0,\nCU_TENSOR_MAP_INTERLEAVE_16B,\nCU_TENSOR_MAP_INTERLEAVE_32B\n} CUtensorMapInterleave;\n \\endcode\n TMA supports interleaved layouts like NC/8HWC8 where C8 utilizes 16 bytes in memory assuming 2 byte per channel or NC/16HWC16 where C16\n uses 32 bytes.\n When \\p interleave is ::CU_TENSOR_MAP_INTERLEAVE_NONE and \\p swizzle is not ::CU_TENSOR_MAP_SWIZZLE_NONE, the bounding box inner dimension\n (computed as \\p channelsPerPixel multiplied by element size in bytes derived from \\p tensorDataType) must be less than or equal to the swizzle size.\n    - CU_TENSOR_MAP_SWIZZLE_32B requires the bounding box inner dimension to be <= 32.\n    - CU_TENSOR_MAP_SWIZZLE_64B requires the bounding box inner dimension to be <= 64.\n    - CU_TENSOR_MAP_SWIZZLE_128B* require the bounding box inner dimension to be <= 128.\n Additionally, \\p tensorDataType of ::CU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B requires \\p interleave to be ::CU_TENSOR_MAP_INTERLEAVE_NONE.\n\n - \\p swizzle, which specifies the shared memory bank swizzling pattern, has to be of type ::CUtensorMapSwizzle which is defined as:\n \\code\ntypedef enum CUtensorMapSwizzle_enum {\nCU_TENSOR_MAP_SWIZZLE_NONE = 0,\nCU_TENSOR_MAP_SWIZZLE_32B,                   // Swizzle 16B chunks within 32B  span\nCU_TENSOR_MAP_SWIZZLE_64B,                   // Swizzle 16B chunks within 64B  span\nCU_TENSOR_MAP_SWIZZLE_128B,                  // Swizzle 16B chunks within 128B span\nCU_TENSOR_MAP_SWIZZLE_128B_ATOM_32B,         // Swizzle 32B chunks within 128B span\nCU_TENSOR_MAP_SWIZZLE_128B_ATOM_32B_FLIP_8B, // Swizzle 32B chunks within 128B span, additionally swap lower 8B with upper 8B within each 16B for every alternate row\nCU_TENSOR_MAP_SWIZZLE_128B_ATOM_64B          // Swizzle 64B chunks within 128B span\n} CUtensorMapSwizzle;\n \\endcode\n Data are organized in a specific order in global memory; however, this may not match the order in which the application accesses data\n in shared memory. This difference in data organization may cause bank conflicts when shared memory is accessed. In order to avoid this\n problem, data can be loaded to shared memory with shuffling across shared memory banks.\n When \\p interleave is ::CU_TENSOR_MAP_INTERLEAVE_32B, \\p swizzle must be ::CU_TENSOR_MAP_SWIZZLE_32B.\n Other interleave modes can have any swizzling pattern.\n When the \\p tensorDataType is ::CU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B, only the following swizzle modes are supported:\n    - CU_TENSOR_MAP_SWIZZLE_NONE (Load & Store)\n    - CU_TENSOR_MAP_SWIZZLE_128B (Load & Store)\n    - CU_TENSOR_MAP_SWIZZLE_128B_ATOM_32B (Load & Store)\n    - CU_TENSOR_MAP_SWIZZLE_128B_ATOM_64B (Store only)\n When the \\p tensorDataType is ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN16B, only the following swizzle modes are supported:\n    - CU_TENSOR_MAP_SWIZZLE_NONE (Load only)\n    - CU_TENSOR_MAP_SWIZZLE_128B (Load only)\n    - CU_TENSOR_MAP_SWIZZLE_128B_ATOM_32B (Load only)\n\n - \\p l2Promotion specifies L2 fetch size which indicates the byte granularity at which L2 requests are filled from DRAM. It must be of\n type ::CUtensorMapL2promotion, which is defined as:\n \\code\ntypedef enum CUtensorMapL2promotion_enum {\nCU_TENSOR_MAP_L2_PROMOTION_NONE = 0,\nCU_TENSOR_MAP_L2_PROMOTION_L2_64B,\nCU_TENSOR_MAP_L2_PROMOTION_L2_128B,\nCU_TENSOR_MAP_L2_PROMOTION_L2_256B\n} CUtensorMapL2promotion;\n \\endcode\n\n - \\p oobFill, which indicates whether zero or a special NaN constant should be used to fill out-of-bound elements, must be of type\n ::CUtensorMapFloatOOBfill which is defined as:\n \\code\ntypedef enum CUtensorMapFloatOOBfill_enum {\nCU_TENSOR_MAP_FLOAT_OOB_FILL_NONE = 0,\nCU_TENSOR_MAP_FLOAT_OOB_FILL_NAN_REQUEST_ZERO_FMA\n} CUtensorMapFloatOOBfill;\n \\endcode\n Note that ::CU_TENSOR_MAP_FLOAT_OOB_FILL_NAN_REQUEST_ZERO_FMA can only be used when \\p tensorDataType represents a floating-point data type,\n and when \\p tensorDataType is not ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN8B, ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN16B, and ::CU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B.\n\n \\param tensorMap             - Tensor map object to create\n \\param tensorDataType        - Tensor data type\n \\param tensorRank            - Dimensionality of tensor; must be at least 3\n \\param globalAddress         - Starting address of memory region described by tensor\n \\param globalDim             - Array containing tensor size (number of elements) along each of the \\p tensorRank dimensions\n \\param globalStrides         - Array containing stride size (in bytes) along each of the \\p tensorRank - 1 dimensions\n \\param pixelBoxLowerCorner   - Array containing DHW dimensions of lower box corner\n \\param pixelBoxUpperCorner   - Array containing DHW dimensions of upper box corner\n \\param channelsPerPixel      - Number of channels per pixel\n \\param pixelsPerColumn       - Number of pixels per column\n \\param elementStrides        - Array containing traversal stride in each of the \\p tensorRank dimensions\n \\param interleave            - Type of interleaved layout the tensor addresses\n \\param swizzle               - Bank swizzling pattern inside shared memory\n \\param l2Promotion           - L2 promotion size\n \\param oobFill               - Indicate whether zero or special NaN constant will be used to fill out-of-bound elements\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuTensorMapEncodeTiled,\n ::cuTensorMapEncodeIm2colWide,\n ::cuTensorMapReplaceAddress*/\n    fn cuTensorMapEncodeIm2col(\n        tensorMap: *mut cuda_types::cuda::CUtensorMap,\n        tensorDataType: cuda_types::cuda::CUtensorMapDataType,\n        tensorRank: cuda_types::cuda::cuuint32_t,\n        globalAddress: *mut ::core::ffi::c_void,\n        globalDim: *const cuda_types::cuda::cuuint64_t,\n        globalStrides: *const cuda_types::cuda::cuuint64_t,\n        pixelBoxLowerCorner: *const ::core::ffi::c_int,\n        pixelBoxUpperCorner: *const ::core::ffi::c_int,\n        channelsPerPixel: cuda_types::cuda::cuuint32_t,\n        pixelsPerColumn: cuda_types::cuda::cuuint32_t,\n        elementStrides: *const cuda_types::cuda::cuuint32_t,\n        interleave: cuda_types::cuda::CUtensorMapInterleave,\n        swizzle: cuda_types::cuda::CUtensorMapSwizzle,\n        l2Promotion: cuda_types::cuda::CUtensorMapL2promotion,\n        oobFill: cuda_types::cuda::CUtensorMapFloatOOBfill,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Create a tensor map descriptor object representing im2col memory region, but where\n the elements are exclusively loaded along the W dimension.\n\n Creates a descriptor for Tensor Memory Access (TMA) object specified by the parameters\n describing a im2col memory layout and where the row is always loaded along the W dimensuin\n and returns it in \\p tensorMap. This assumes the tensor layout in memory is either NDHWC,\n NHWC, or NWC.\n\n This API is only supported on devices of compute capability 10.0 or higher.\n Additionally, a tensor map object is an opaque value, and, as such, should only be\n accessed through CUDA APIs and PTX.\n\n The parameters passed are bound to the following requirements:\n\n - \\p tensorMap address must be aligned to 64 bytes.\n\n - \\p tensorDataType has to be an enum from ::CUtensorMapDataType which is defined as:\n \\code\ntypedef enum CUtensorMapDataType_enum {\nCU_TENSOR_MAP_DATA_TYPE_UINT8 = 0,       // 1 byte\nCU_TENSOR_MAP_DATA_TYPE_UINT16,          // 2 bytes\nCU_TENSOR_MAP_DATA_TYPE_UINT32,          // 4 bytes\nCU_TENSOR_MAP_DATA_TYPE_INT32,           // 4 bytes\nCU_TENSOR_MAP_DATA_TYPE_UINT64,          // 8 bytes\nCU_TENSOR_MAP_DATA_TYPE_INT64,           // 8 bytes\nCU_TENSOR_MAP_DATA_TYPE_FLOAT16,         // 2 bytes\nCU_TENSOR_MAP_DATA_TYPE_FLOAT32,         // 4 bytes\nCU_TENSOR_MAP_DATA_TYPE_FLOAT64,         // 8 bytes\nCU_TENSOR_MAP_DATA_TYPE_BFLOAT16,        // 2 bytes\nCU_TENSOR_MAP_DATA_TYPE_FLOAT32_FTZ,     // 4 bytes\nCU_TENSOR_MAP_DATA_TYPE_TFLOAT32,        // 4 bytes\nCU_TENSOR_MAP_DATA_TYPE_TFLOAT32_FTZ     // 4 bytes\nCU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN8B,    // 4 bits\nCU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN16B,   // 4 bits\nCU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B    // 6 bits\n} CUtensorMapDataType;\n \\endcode\n  ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN8B copies '16 x U4' packed values to memory aligned as 8 bytes. There are no gaps between packed values.\n  ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN16B copies '16 x U4' packed values to memory aligned as 16 bytes. There are 8 byte gaps between every 8 byte chunk of packed values.\n  ::CU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B copies '16 x U6' packed values to memory aligned as 16 bytes. There are 4 byte gaps between every 12 byte chunk of packed values.\n\n - \\p tensorRank, which specifies the number of tensor dimensions, must be 3, 4, or 5.\n\n - \\p globalAddress, which specifies the starting address of the memory region described, must be 16 byte aligned. The following requirements need to also be met:\n    - When \\p interleave is ::CU_TENSOR_MAP_INTERLEAVE_32B, \\p globalAddress must be 32 byte aligned.\n    - When \\p tensorDataType is ::CU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B or ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN16B, \\p globalAddress must be 32 byte aligned.\n\n - \\p globalDim array, which specifies tensor size of each of the \\p tensorRank dimensions, must be non-zero and less than or\n equal to 2^32. Additionally, the following requirements need to be met for the packed data types:\n    - When \\p tensorDataType is ::CU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B or ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN16B, globalDim[0] must be a multiple of 128.\n    - When \\p tensorDataType is ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN8B, \\p globalDim[0] must be a multiple of 2.\n    - Dimension for the packed data types must reflect the number of individual U# values.\n\n - \\p globalStrides array, which specifies tensor stride of each of the lower \\p tensorRank - 1 dimensions in bytes, must be a\n multiple of 16 and less than 2^40. Additionally, the following requirements need to be met:\n    - When \\p interleave is ::CU_TENSOR_MAP_INTERLEAVE_32B, the strides must be a multiple of 32.\n    - When \\p tensorDataType is ::CU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B or ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN16B, the strides must be a multiple of 32.\n Each following dimension specified includes previous dimension stride:\n \\code\nglobalStrides[0] = globalDim[0] * elementSizeInBytes(tensorDataType) + padding[0];\nfor (i = 1; i < tensorRank - 1; i++)\nglobalStrides[i] = globalStrides[i – 1] * (globalDim[i] + padding[i]);\nassert(globalStrides[i] >= globalDim[i]);\n \\endcode\n\n - \\p pixelBoxLowerCornerWidth specifies the coordinate offset W of the bounding box from left corner. The offset must be\n within range [-32768, 32767].\n\n - \\p pixelBoxUpperCornerWidth specifies the coordinate offset W of the bounding box from right corner. The offset must be\n within range [-32768, 32767].\n\n The bounding box specified by \\p pixelBoxLowerCornerWidth and \\p pixelBoxUpperCornerWidth must have non-zero area. Note\n that the size of the box along D and H dimensions is always equal to one.\n\n - \\p channelsPerPixel, which specifies the number of elements which must be accessed along C dimension, must be less than or equal to 256.\n Additionally, when \\p tensorDataType is ::CU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B or ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN16B, \\p channelsPerPixel must be 128.\n\n - \\p pixelsPerColumn, which specifies the number of elements that must be accessed along the W dimension, must be less than or\n equal to 1024. This field is ignored when \\p mode is ::CU_TENSOR_MAP_IM2COL_WIDE_MODE_W128.\n\n - \\p elementStrides array, which specifies the iteration step along each of the \\p tensorRank dimensions, must be non-zero and less\n than or equal to 8. Note that when \\p interleave is ::CU_TENSOR_MAP_INTERLEAVE_NONE, the first element of this array is ignored since\n TMA doesn’t support the stride for dimension zero.\n When all elements of the \\p elementStrides array are one, \\p boxDim specifies the number of elements to load. However, if \\p elementStrides[i]\n is not equal to one for some \\p i, then TMA loads ceil( \\p boxDim[i] / \\p elementStrides[i]) number of elements along i-th dimension.\n To load N elements along i-th dimension, \\p boxDim[i] must be set to N * \\p elementStrides[i].\n\n - \\p interleave specifies the interleaved layout of type ::CUtensorMapInterleave, which is defined as:\n \\code\ntypedef enum CUtensorMapInterleave_enum {\nCU_TENSOR_MAP_INTERLEAVE_NONE = 0,\nCU_TENSOR_MAP_INTERLEAVE_16B,\nCU_TENSOR_MAP_INTERLEAVE_32B\n} CUtensorMapInterleave;\n \\endcode\n TMA supports interleaved layouts like NC/8HWC8 where C8 utilizes 16 bytes in memory assuming 2 byte per channel or NC/16HWC16 where C16\n uses 32 bytes.\n When \\p interleave is ::CU_TENSOR_MAP_INTERLEAVE_NONE, the bounding box inner dimension (computed as \\p channelsPerPixel multiplied by\n element size in bytes derived from \\p tensorDataType) must be less than or equal to the swizzle size.\n    - CU_TENSOR_MAP_SWIZZLE_64B requires the bounding box inner dimension to be <= 64.\n    - CU_TENSOR_MAP_SWIZZLE_128B* require the bounding box inner dimension to be <= 128.\n Additionally, \\p tensorDataType of ::CU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B requires \\p interleave to be ::CU_TENSOR_MAP_INTERLEAVE_NONE.\n\n - \\p mode, which describes loading of elements loaded along the W dimension, has to be one of the following ::CUtensorMapIm2ColWideMode types:\n \\code\n          CU_TENSOR_MAP_IM2COL_WIDE_MODE_W,\n          CU_TENSOR_MAP_IM2COL_WIDE_MODE_W128\n \\endcode\n ::CU_TENSOR_MAP_IM2COL_WIDE_MODE_W allows the number of elements loaded along the W dimension to be specified\n via the \\p pixelsPerColumn field.\n\n - \\p swizzle, which specifies the shared memory bank swizzling pattern, must be one of the following\n ::CUtensorMapSwizzle modes (other swizzle modes are not supported):\n \\code\ntypedef enum CUtensorMapSwizzle_enum {\nCU_TENSOR_MAP_SWIZZLE_64B,                   // Swizzle 16B chunks within 64B  span\nCU_TENSOR_MAP_SWIZZLE_128B,                  // Swizzle 16B chunks within 128B span\nCU_TENSOR_MAP_SWIZZLE_128B_ATOM_32B,         // Swizzle 32B chunks within 128B span\n} CUtensorMapSwizzle;\n \\endcode\n Data are organized in a specific order in global memory; however, this may not match the order in which the application accesses data\n in shared memory. This difference in data organization may cause bank conflicts when shared memory is accessed. In order to avoid this\n problem, data can be loaded to shared memory with shuffling across shared memory banks.\n When the \\p tensorDataType is ::CU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B, only the following swizzle modes are supported:\n    - CU_TENSOR_MAP_SWIZZLE_128B (Load & Store)\n    - CU_TENSOR_MAP_SWIZZLE_128B_ATOM_32B (Load & Store)\n When the \\p tensorDataType is ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN16B, only the following swizzle modes are supported:\n    - CU_TENSOR_MAP_SWIZZLE_128B (Load only)\n    - CU_TENSOR_MAP_SWIZZLE_128B_ATOM_32B (Load only)\n\n - \\p l2Promotion specifies L2 fetch size which indicates the byte granularity at which L2 requests are filled from DRAM. It must be of\n type ::CUtensorMapL2promotion, which is defined as:\n \\code\ntypedef enum CUtensorMapL2promotion_enum {\nCU_TENSOR_MAP_L2_PROMOTION_NONE = 0,\nCU_TENSOR_MAP_L2_PROMOTION_L2_64B,\nCU_TENSOR_MAP_L2_PROMOTION_L2_128B,\nCU_TENSOR_MAP_L2_PROMOTION_L2_256B\n} CUtensorMapL2promotion;\n \\endcode\n\n - \\p oobFill, which indicates whether zero or a special NaN constant should be used to fill out-of-bound elements, must be of type\n ::CUtensorMapFloatOOBfill which is defined as:\n \\code\ntypedef enum CUtensorMapFloatOOBfill_enum {\nCU_TENSOR_MAP_FLOAT_OOB_FILL_NONE = 0,\nCU_TENSOR_MAP_FLOAT_OOB_FILL_NAN_REQUEST_ZERO_FMA\n} CUtensorMapFloatOOBfill;\n \\endcode\n Note that ::CU_TENSOR_MAP_FLOAT_OOB_FILL_NAN_REQUEST_ZERO_FMA can only be used when \\p tensorDataType represents a floating-point data type,\n and when \\p tensorDataType is not ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN8B, ::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN16B, and ::CU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B.\n\n \\param tensorMap                - Tensor map object to create\n \\param tensorDataType           - Tensor data type\n \\param tensorRank               - Dimensionality of tensor; must be at least 3\n \\param globalAddress            - Starting address of memory region described by tensor\n \\param globalDim                - Array containing tensor size (number of elements) along each of the \\p tensorRank dimensions\n \\param globalStrides            - Array containing stride size (in bytes) along each of the \\p tensorRank - 1 dimensions\n \\param pixelBoxLowerCornerWidth - Width offset of left box corner\n \\param pixelBoxUpperCornerWidth - Width offset of right box corner\n \\param channelsPerPixel         - Number of channels per pixel\n \\param pixelsPerColumn          - Number of pixels per column\n \\param elementStrides           - Array containing traversal stride in each of the \\p tensorRank dimensions\n \\param interleave               - Type of interleaved layout the tensor addresses\n \\param mode                     - W or W128 mode\n \\param swizzle                  - Bank swizzling pattern inside shared memory\n \\param l2Promotion              - L2 promotion size\n \\param oobFill                  - Indicate whether zero or special NaN constant will be used to fill out-of-bound elements\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuTensorMapEncodeTiled,\n ::cuTensorMapEncodeIm2col,\n ::cuTensorMapReplaceAddress*/\n    fn cuTensorMapEncodeIm2colWide(\n        tensorMap: *mut cuda_types::cuda::CUtensorMap,\n        tensorDataType: cuda_types::cuda::CUtensorMapDataType,\n        tensorRank: cuda_types::cuda::cuuint32_t,\n        globalAddress: *mut ::core::ffi::c_void,\n        globalDim: *const cuda_types::cuda::cuuint64_t,\n        globalStrides: *const cuda_types::cuda::cuuint64_t,\n        pixelBoxLowerCornerWidth: ::core::ffi::c_int,\n        pixelBoxUpperCornerWidth: ::core::ffi::c_int,\n        channelsPerPixel: cuda_types::cuda::cuuint32_t,\n        pixelsPerColumn: cuda_types::cuda::cuuint32_t,\n        elementStrides: *const cuda_types::cuda::cuuint32_t,\n        interleave: cuda_types::cuda::CUtensorMapInterleave,\n        mode: cuda_types::cuda::CUtensorMapIm2ColWideMode,\n        swizzle: cuda_types::cuda::CUtensorMapSwizzle,\n        l2Promotion: cuda_types::cuda::CUtensorMapL2promotion,\n        oobFill: cuda_types::cuda::CUtensorMapFloatOOBfill,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Modify an existing tensor map descriptor with an updated global address\n\n Modifies the descriptor for Tensor Memory Access (TMA) object passed in \\p tensorMap with\n an updated \\p globalAddress.\n\n Tensor map objects are only supported on devices of compute capability 9.0 or higher.\n Additionally, a tensor map object is an opaque value, and, as such, should only be\n accessed through CUDA API calls.\n\n \\param tensorMap             - Tensor map object to modify\n \\param globalAddress         - Starting address of memory region described by tensor, must follow previous alignment requirements\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuTensorMapEncodeTiled,\n ::cuTensorMapEncodeIm2col,\n ::cuTensorMapEncodeIm2colWide*/\n    fn cuTensorMapReplaceAddress(\n        tensorMap: *mut cuda_types::cuda::CUtensorMap,\n        globalAddress: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Queries if a device may directly access a peer device's memory.\n\n Returns in \\p *canAccessPeer a value of 1 if contexts on \\p dev are capable of\n directly accessing memory from contexts on \\p peerDev and 0 otherwise.\n If direct access of \\p peerDev from \\p dev is possible, then access may be\n enabled on two specific contexts by calling ::cuCtxEnablePeerAccess().\n\n \\param canAccessPeer - Returned access capability\n \\param dev           - Device from which allocations on \\p peerDev are to\n                        be directly accessed.\n \\param peerDev       - Device on which the allocations to be directly accessed\n                        by \\p dev reside.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_DEVICE\n \\notefnerr\n\n \\sa\n ::cuCtxEnablePeerAccess,\n ::cuCtxDisablePeerAccess,\n ::cudaDeviceCanAccessPeer*/\n    fn cuDeviceCanAccessPeer(\n        canAccessPeer: *mut ::core::ffi::c_int,\n        dev: cuda_types::cuda::CUdevice,\n        peerDev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Enables direct access to memory allocations in a peer context.\n\n If both the current context and \\p peerContext are on devices which support unified\n addressing (as may be queried using ::CU_DEVICE_ATTRIBUTE_UNIFIED_ADDRESSING) and same\n major compute capability, then on success all allocations from \\p peerContext will\n immediately be accessible by the current context.  See \\ref CUDA_UNIFIED for additional\n details.\n\n Note that access granted by this call is unidirectional and that in order to access\n memory from the current context in \\p peerContext, a separate symmetric call\n to ::cuCtxEnablePeerAccess() is required.\n\n Note that there are both device-wide and system-wide limitations per system\n configuration, as noted in the CUDA Programming Guide under the section\n \"Peer-to-Peer Memory Access\".\n\n Returns ::CUDA_ERROR_PEER_ACCESS_UNSUPPORTED if ::cuDeviceCanAccessPeer() indicates\n that the ::CUdevice of the current context cannot directly access memory\n from the ::CUdevice of \\p peerContext.\n\n Returns ::CUDA_ERROR_PEER_ACCESS_ALREADY_ENABLED if direct access of\n \\p peerContext from the current context has already been enabled.\n\n Returns ::CUDA_ERROR_TOO_MANY_PEERS if direct peer access is not possible\n because hardware resources required for peer access have been exhausted.\n\n Returns ::CUDA_ERROR_INVALID_CONTEXT if there is no current context, \\p peerContext\n is not a valid context, or if the current context is \\p peerContext.\n\n Returns ::CUDA_ERROR_INVALID_VALUE if \\p Flags is not 0.\n\n \\param peerContext - Peer context to enable direct access to from the current context\n \\param Flags       - Reserved for future use and must be set to 0\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_PEER_ACCESS_ALREADY_ENABLED,\n ::CUDA_ERROR_TOO_MANY_PEERS,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_PEER_ACCESS_UNSUPPORTED,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa\n ::cuDeviceCanAccessPeer,\n ::cuCtxDisablePeerAccess,\n ::cudaDeviceEnablePeerAccess*/\n    fn cuCtxEnablePeerAccess(\n        peerContext: cuda_types::cuda::CUcontext,\n        Flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Disables direct access to memory allocations in a peer context and\n unregisters any registered allocations.\n\nReturns ::CUDA_ERROR_PEER_ACCESS_NOT_ENABLED if direct peer access has\n not yet been enabled from \\p peerContext to the current context.\n\n Returns ::CUDA_ERROR_INVALID_CONTEXT if there is no current context, or if\n \\p peerContext is not a valid context.\n\n \\param peerContext - Peer context to disable direct access to\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_PEER_ACCESS_NOT_ENABLED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n \\notefnerr\n\n \\sa\n ::cuDeviceCanAccessPeer,\n ::cuCtxEnablePeerAccess,\n ::cudaDeviceDisablePeerAccess*/\n    fn cuCtxDisablePeerAccess(\n        peerContext: cuda_types::cuda::CUcontext,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Queries attributes of the link between two devices.\n\n Returns in \\p *value the value of the requested attribute \\p attrib of the\n link between \\p srcDevice and \\p dstDevice. The supported attributes are:\n - ::CU_DEVICE_P2P_ATTRIBUTE_PERFORMANCE_RANK: A relative value indicating the\n   performance of the link between two devices.\n - ::CU_DEVICE_P2P_ATTRIBUTE_ACCESS_SUPPORTED P2P: 1 if P2P Access is enable.\n - ::CU_DEVICE_P2P_ATTRIBUTE_NATIVE_ATOMIC_SUPPORTED: 1 if all CUDA-valid atomic\n   operations over the link are supported.\n - ::CU_DEVICE_P2P_ATTRIBUTE_CUDA_ARRAY_ACCESS_SUPPORTED: 1 if cudaArray can\n   be accessed over the link.\n - ::CU_DEVICE_P2P_ATTRIBUTE_ONLY_PARTIAL_NATIVE_ATOMIC_SUPPORTED: 1 if some\n   CUDA-valid atomic operations over the link are supported. Information about\n   specific operations can be retrieved with ::cuDeviceGetP2PAtomicCapabilities.\n\n Returns ::CUDA_ERROR_INVALID_DEVICE if \\p srcDevice or \\p dstDevice are not valid\n or if they represent the same device.\n\n Returns ::CUDA_ERROR_INVALID_VALUE if \\p attrib is not valid or if \\p value is\n a null pointer.\n\n \\param value         - Returned value of the requested attribute\n \\param attrib        - The requested attribute of the link between \\p srcDevice and \\p dstDevice.\n \\param srcDevice     - The source device of the target link.\n \\param dstDevice     - The destination device of the target link.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_DEVICE,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa\n ::cuCtxEnablePeerAccess,\n ::cuCtxDisablePeerAccess,\n ::cuDeviceCanAccessPeer,\n ::cuDeviceGetP2PAtomicCapabilities,\n ::cudaDeviceGetP2PAttribute*/\n    fn cuDeviceGetP2PAttribute(\n        value: *mut ::core::ffi::c_int,\n        attrib: cuda_types::cuda::CUdevice_P2PAttribute,\n        srcDevice: cuda_types::cuda::CUdevice,\n        dstDevice: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Queries details about atomic operations supported between two devices\n\n Returns in \\p *capabilities the details about requested atomic \\p *operations over the\n the link between \\p srcDevice and \\p dstDevice. The allocated size of \\p *operations and\n \\p *capabilities must be \\p count.\n\n For each ::CUatomicOperation in \\p *operations, the corresponding result in \\p *capabilities\n will be a bitmask indicating which of ::CUatomicOperationCapability the link supports natively.\n\n Returns ::CUDA_ERROR_INVALID_DEVICE if \\p srcDevice or \\p dstDevice are not valid\n or if they represent the same device.\n\n Returns ::CUDA_ERROR_INVALID_VALUE if \\p *capabilities or \\p *operations is NULL, if \\p count is 0,\n or if any of \\p *operations is not valid.\n\n \\param capabilities          - Returned capability details of each requested operation\n \\param operations            - Requested operations\n \\param count                 - Count of requested operations and size of capabilities\n \\param srcDevice             - The source device of the target link\n \\param dstDevice             - The destination device of the target link\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_DEVICE,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa\n ::cuDeviceGetP2PAttribute,\n ::cudaDeviceGetP2PAttribute,\n ::cudaDeviceGetP2PAtomicCapabilities*/\n    fn cuDeviceGetP2PAtomicCapabilities(\n        capabilities: *mut ::core::ffi::c_uint,\n        operations: *const cuda_types::cuda::CUatomicOperation,\n        count: ::core::ffi::c_uint,\n        srcDevice: cuda_types::cuda::CUdevice,\n        dstDevice: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Unregisters a graphics resource for access by CUDA\n\n Unregisters the graphics resource \\p resource so it is not accessible by\n CUDA unless registered again.\n\n If \\p resource is invalid then ::CUDA_ERROR_INVALID_HANDLE is\n returned.\n\n \\param resource - Resource to unregister\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_UNKNOWN\n \\notefnerr\n\n \\sa\n ::cuGraphicsD3D9RegisterResource,\n ::cuGraphicsD3D10RegisterResource,\n ::cuGraphicsD3D11RegisterResource,\n ::cuGraphicsGLRegisterBuffer,\n ::cuGraphicsGLRegisterImage,\n ::cudaGraphicsUnregisterResource*/\n    fn cuGraphicsUnregisterResource(\n        resource: cuda_types::cuda::CUgraphicsResource,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Get an array through which to access a subresource of a mapped graphics resource.\n\n Returns in \\p *pArray an array through which the subresource of the mapped\n graphics resource \\p resource which corresponds to array index \\p arrayIndex\n and mipmap level \\p mipLevel may be accessed.  The value set in \\p *pArray may\n change every time that \\p resource is mapped.\n\n If \\p resource is not a texture then it cannot be accessed via an array and\n ::CUDA_ERROR_NOT_MAPPED_AS_ARRAY is returned.\n If \\p arrayIndex is not a valid array index for \\p resource then\n ::CUDA_ERROR_INVALID_VALUE is returned.\n If \\p mipLevel is not a valid mipmap level for \\p resource then\n ::CUDA_ERROR_INVALID_VALUE is returned.\n If \\p resource is not mapped then ::CUDA_ERROR_NOT_MAPPED is returned.\n\n \\param pArray      - Returned array through which a subresource of \\p resource may be accessed\n \\param resource    - Mapped resource to access\n \\param arrayIndex  - Array index for array textures or cubemap face\n                      index as defined by ::CUarray_cubemap_face for\n                      cubemap textures for the subresource to access\n \\param mipLevel    - Mipmap level for the subresource to access\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_NOT_MAPPED,\n ::CUDA_ERROR_NOT_MAPPED_AS_ARRAY\n \\notefnerr\n\n \\sa\n ::cuGraphicsResourceGetMappedPointer,\n ::cudaGraphicsSubResourceGetMappedArray*/\n    fn cuGraphicsSubResourceGetMappedArray(\n        pArray: *mut cuda_types::cuda::CUarray,\n        resource: cuda_types::cuda::CUgraphicsResource,\n        arrayIndex: ::core::ffi::c_uint,\n        mipLevel: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Get a mipmapped array through which to access a mapped graphics resource.\n\n Returns in \\p *pMipmappedArray a mipmapped array through which the mapped graphics\n resource \\p resource. The value set in \\p *pMipmappedArray may change every time\n that \\p resource is mapped.\n\n If \\p resource is not a texture then it cannot be accessed via a mipmapped array and\n ::CUDA_ERROR_NOT_MAPPED_AS_ARRAY is returned.\n If \\p resource is not mapped then ::CUDA_ERROR_NOT_MAPPED is returned.\n\n \\param pMipmappedArray - Returned mipmapped array through which \\p resource may be accessed\n \\param resource        - Mapped resource to access\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_NOT_MAPPED,\n ::CUDA_ERROR_NOT_MAPPED_AS_ARRAY\n \\notefnerr\n\n \\sa\n ::cuGraphicsResourceGetMappedPointer,\n ::cudaGraphicsResourceGetMappedMipmappedArray*/\n    fn cuGraphicsResourceGetMappedMipmappedArray(\n        pMipmappedArray: *mut cuda_types::cuda::CUmipmappedArray,\n        resource: cuda_types::cuda::CUgraphicsResource,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Get a device pointer through which to access a mapped graphics resource.\n\n Returns in \\p *pDevPtr a pointer through which the mapped graphics resource\n \\p resource may be accessed.\n Returns in \\p pSize the size of the memory in bytes which may be accessed from that pointer.\n The value set in \\p pPointer may change every time that \\p resource is mapped.\n\n If \\p resource is not a buffer then it cannot be accessed via a pointer and\n ::CUDA_ERROR_NOT_MAPPED_AS_POINTER is returned.\n If \\p resource is not mapped then ::CUDA_ERROR_NOT_MAPPED is returned.\n *\n \\param pDevPtr    - Returned pointer through which \\p resource may be accessed\n \\param pSize      - Returned size of the buffer accessible starting at \\p *pPointer\n \\param resource   - Mapped resource to access\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_NOT_MAPPED,\n ::CUDA_ERROR_NOT_MAPPED_AS_POINTER\n \\notefnerr\n\n \\sa\n ::cuGraphicsMapResources,\n ::cuGraphicsSubResourceGetMappedArray,\n ::cudaGraphicsResourceGetMappedPointer*/\n    fn cuGraphicsResourceGetMappedPointer_v2(\n        pDevPtr: *mut cuda_types::cuda::CUdeviceptr,\n        pSize: *mut usize,\n        resource: cuda_types::cuda::CUgraphicsResource,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Set usage flags for mapping a graphics resource\n\n Set \\p flags for mapping the graphics resource \\p resource.\n\n Changes to \\p flags will take effect the next time \\p resource is mapped.\n The \\p flags argument may be any of the following:\n\n - ::CU_GRAPHICS_MAP_RESOURCE_FLAGS_NONE: Specifies no hints about how this\n   resource will be used. It is therefore assumed that this resource will be\n   read from and written to by CUDA kernels.  This is the default value.\n - ::CU_GRAPHICS_MAP_RESOURCE_FLAGS_READONLY: Specifies that CUDA kernels which\n   access this resource will not write to this resource.\n - ::CU_GRAPHICS_MAP_RESOURCE_FLAGS_WRITEDISCARD: Specifies that CUDA kernels\n   which access this resource will not read from this resource and will\n   write over the entire contents of the resource, so none of the data\n   previously stored in the resource will be preserved.\n\n If \\p resource is presently mapped for access by CUDA then\n ::CUDA_ERROR_ALREADY_MAPPED is returned.\n If \\p flags is not one of the above values then ::CUDA_ERROR_INVALID_VALUE is returned.\n\n \\param resource - Registered resource to set flags for\n \\param flags    - Parameters for resource mapping\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_ALREADY_MAPPED\n \\notefnerr\n\n \\sa\n ::cuGraphicsMapResources,\n ::cudaGraphicsResourceSetMapFlags*/\n    fn cuGraphicsResourceSetMapFlags_v2(\n        resource: cuda_types::cuda::CUgraphicsResource,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Map graphics resources for access by CUDA\n\n Maps the \\p count graphics resources in \\p resources for access by CUDA.\n\n The resources in \\p resources may be accessed by CUDA until they\n are unmapped. The graphics API from which \\p resources were registered\n should not access any resources while they are mapped by CUDA. If an\n application does so, the results are undefined.\n\n This function provides the synchronization guarantee that any graphics calls\n issued before ::cuGraphicsMapResources() will complete before any subsequent CUDA\n work issued in \\p stream begins.\n\n If \\p resources includes any duplicate entries then ::CUDA_ERROR_INVALID_HANDLE is returned.\n If any of \\p resources are presently mapped for access by CUDA then ::CUDA_ERROR_ALREADY_MAPPED is returned.\n\n \\param count      - Number of resources to map\n \\param resources  - Resources to map for CUDA usage\n \\param hStream    - Stream with which to synchronize\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_ALREADY_MAPPED,\n ::CUDA_ERROR_UNKNOWN\n \\note_null_stream\n \\notefnerr\n\n \\sa\n ::cuGraphicsResourceGetMappedPointer,\n ::cuGraphicsSubResourceGetMappedArray,\n ::cuGraphicsUnmapResources,\n ::cudaGraphicsMapResources*/\n    fn cuGraphicsMapResources_ptsz(\n        count: ::core::ffi::c_uint,\n        resources: *mut cuda_types::cuda::CUgraphicsResource,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Unmap graphics resources.\n\n Unmaps the \\p count graphics resources in \\p resources.\n\n Once unmapped, the resources in \\p resources may not be accessed by CUDA\n until they are mapped again.\n\n This function provides the synchronization guarantee that any CUDA work issued\n in \\p stream before ::cuGraphicsUnmapResources() will complete before any\n subsequently issued graphics work begins.\n\n\n If \\p resources includes any duplicate entries then ::CUDA_ERROR_INVALID_HANDLE is returned.\n If any of \\p resources are not presently mapped for access by CUDA then ::CUDA_ERROR_NOT_MAPPED is returned.\n\n \\param count      - Number of resources to unmap\n \\param resources  - Resources to unmap\n \\param hStream    - Stream with which to synchronize\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_NOT_MAPPED,\n ::CUDA_ERROR_UNKNOWN\n \\note_null_stream\n \\notefnerr\n\n \\sa\n ::cuGraphicsMapResources,\n ::cudaGraphicsUnmapResources*/\n    fn cuGraphicsUnmapResources_ptsz(\n        count: ::core::ffi::c_uint,\n        resources: *mut cuda_types::cuda::CUgraphicsResource,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the requested driver API function pointer\n\n Returns in \\p **pfn the address of the CUDA driver function for the requested\n CUDA version and flags.\n\n The CUDA version is specified as (1000 * major + 10 * minor), so CUDA 11.2\n should be specified as 11020. For a requested driver symbol, if the specified\n CUDA version is greater than or equal to the CUDA version in which the driver symbol\n was introduced, this API will return the function pointer to the corresponding\n versioned function. If the specified CUDA version is greater than the driver\n version, the API will return ::CUDA_ERROR_INVALID_VALUE.\n\n The pointer returned by the API should be cast to a function pointer matching the\n requested driver function's definition in the API header file. The function pointer\n typedef can be picked up from the corresponding typedefs header file. For example,\n cudaTypedefs.h consists of function pointer typedefs for driver APIs defined in cuda.h.\n\n The API will return ::CUDA_SUCCESS and set the returned \\p pfn to NULL if the\n requested driver function is not supported on the platform, no ABI\n compatible driver function exists for the specified \\p cudaVersion or if the\n driver symbol is invalid.\n\n It will also set the optional \\p symbolStatus to one of the values in\n ::CUdriverProcAddressQueryResult with the following meanings:\n - ::CU_GET_PROC_ADDRESS_SUCCESS - The requested symbol was succesfully found based\n   on input arguments and \\p pfn is valid\n - ::CU_GET_PROC_ADDRESS_SYMBOL_NOT_FOUND - The requested symbol was not found\n - ::CU_GET_PROC_ADDRESS_VERSION_NOT_SUFFICIENT - The requested symbol was found but is\n   not supported by cudaVersion specified\n\n The requested flags can be:\n - ::CU_GET_PROC_ADDRESS_DEFAULT: This is the default mode. This is equivalent to\n   ::CU_GET_PROC_ADDRESS_PER_THREAD_DEFAULT_STREAM if the code is compiled with\n   --default-stream per-thread compilation flag or the macro CUDA_API_PER_THREAD_DEFAULT_STREAM\n   is defined; ::CU_GET_PROC_ADDRESS_LEGACY_STREAM otherwise.\n - ::CU_GET_PROC_ADDRESS_LEGACY_STREAM: This will enable the search for all driver symbols\n   that match the requested driver symbol name except the corresponding per-thread versions.\n - ::CU_GET_PROC_ADDRESS_PER_THREAD_DEFAULT_STREAM: This will enable the search for all\n   driver symbols that match the requested driver symbol name including the per-thread\n   versions. If a per-thread version is not found, the API will return the legacy version\n   of the driver function.\n\n \\param symbol - The base name of the driver API function to look for. As an example,\n                 for the driver API ::cuMemAlloc_v2, \\p symbol would be cuMemAlloc and\n                 \\p cudaVersion would be the ABI compatible CUDA version for the _v2 variant.\n \\param pfn - Location to return the function pointer to the requested driver function\n \\param cudaVersion - The CUDA version to look for the requested driver symbol\n \\param flags -  Flags to specify search options.\n \\param symbolStatus - Optional location to store the status of the search for\n                       \\p symbol based on \\p cudaVersion. See ::CUdriverProcAddressQueryResult\n                       for possible values.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_SUPPORTED\n \\note_version_mixing\n\n \\sa\n ::cudaGetDriverEntryPointByVersion*/\n    fn cuGetProcAddress_v2(\n        symbol: *const ::core::ffi::c_char,\n        pfn: *mut *mut ::core::ffi::c_void,\n        cudaVersion: ::core::ffi::c_int,\n        flags: cuda_types::cuda::cuuint64_t,\n        symbolStatus: *mut cuda_types::cuda::CUdriverProcAddressQueryResult,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Allows caller to fetch a coredump attribute value for the current context\n\n Returns in \\p *value the requested value specified by \\p attrib. It is up to the caller\n to ensure that the data type and size of \\p *value matches the request.\n\n If the caller calls this function with \\p *value equal to NULL, the size of the memory\n region (in bytes) expected for \\p attrib will be placed in \\p size.\n\n The supported attributes are:\n - ::CU_COREDUMP_ENABLE_ON_EXCEPTION: Bool where ::true means that GPU exceptions from\n      this context will create a coredump at the location specified by ::CU_COREDUMP_FILE.\n      The default value is ::false unless set to ::true globally or locally, or the\n      CU_CTX_USER_COREDUMP_ENABLE flag was set during context creation.\n - ::CU_COREDUMP_TRIGGER_HOST: Bool where ::true means that the host CPU will\n      also create a coredump. The default value is ::true unless set to ::false globally or\n      or locally. This value is deprecated as of CUDA 12.5 - raise the ::CU_COREDUMP_SKIP_ABORT\n      flag to disable host device abort() if needed.\n - ::CU_COREDUMP_LIGHTWEIGHT: Bool where ::true means that any resulting coredumps\n      will not have a dump of GPU memory or non-reloc ELF images. The default value is\n      ::false unless set to ::true globally or locally. This attribute is deprecated as\n      of CUDA 12.5, please use ::CU_COREDUMP_GENERATION_FLAGS instead.\n - ::CU_COREDUMP_ENABLE_USER_TRIGGER: Bool where ::true means that a coredump can be\n      created by writing to the system pipe specified by ::CU_COREDUMP_PIPE. The default\n      value is ::false unless set to ::true globally or locally.\n - ::CU_COREDUMP_FILE: String of up to 1023 characters that defines the location where\n      any coredumps generated by this context will be written. The default value is\n      ::core.cuda.HOSTNAME.PID where ::HOSTNAME is the host name of the machine running\n      the CUDA applications and ::PID is the process ID of the CUDA application.\n - ::CU_COREDUMP_PIPE: String of up to 1023 characters that defines the name of the pipe\n      that will be monitored if user-triggered coredumps are enabled. The default value is\n      ::corepipe.cuda.HOSTNAME.PID where ::HOSTNAME is the host name of the machine running\n      the CUDA application and ::PID is the process ID of the CUDA application.\n - ::CU_COREDUMP_GENERATION_FLAGS: An integer with values to allow granular control the data\n      contained in a coredump specified as a bitwise OR combination of the following values:\n      + ::CU_COREDUMP_DEFAULT_FLAGS - if set by itself, coredump generation returns to its\n          default settings of including all memory regions that it is able to access\n      + ::CU_COREDUMP_SKIP_NONRELOCATED_ELF_IMAGES - Coredump will not include the data from\n          CUDA source modules that are not relocated at runtime.\n      + ::CU_COREDUMP_SKIP_GLOBAL_MEMORY - Coredump will not include device-side global data\n          that does not belong to any context.\n      + ::CU_COREDUMP_SKIP_SHARED_MEMORY - Coredump will not include grid-scale shared memory\n          for the warp that the dumped kernel belonged to.\n      + ::CU_COREDUMP_SKIP_LOCAL_MEMORY - Coredump will not include local memory from the kernel.\n      + ::CU_COREDUMP_LIGHTWEIGHT_FLAGS - Enables all of the above options. Equiavlent to setting\n          the ::CU_COREDUMP_LIGHTWEIGHT attribute to ::true.\n      + ::CU_COREDUMP_SKIP_ABORT - If set, GPU exceptions will not raise an abort() in the host CPU\n          process. Same functional goal as ::CU_COREDUMP_TRIGGER_HOST but better reflects the default\n          behavior.\n\n \\param attrib - The enum defining which value to fetch.\n \\param value - void* containing the requested data.\n \\param size - The size of the memory region \\p value points to.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_PERMITTED,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_CONTEXT_IS_DESTROYED\n\n \\sa\n ::cuCoredumpGetAttributeGlobal,\n ::cuCoredumpSetAttribute,\n ::cuCoredumpSetAttributeGlobal*/\n    fn cuCoredumpGetAttribute(\n        attrib: cuda_types::cuda::CUcoredumpSettings,\n        value: *mut ::core::ffi::c_void,\n        size: *mut usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Allows caller to fetch a coredump attribute value for the entire application\n\n Returns in \\p *value the requested value specified by \\p attrib. It is up to the caller\n to ensure that the data type and size of \\p *value matches the request.\n\n If the caller calls this function with \\p *value equal to NULL, the size of the memory\n region (in bytes) expected for \\p attrib will be placed in \\p size.\n\n The supported attributes are:\n - ::CU_COREDUMP_ENABLE_ON_EXCEPTION: Bool where ::true means that GPU exceptions from\n      this context will create a coredump at the location specified by ::CU_COREDUMP_FILE.\n      The default value is ::false.\n - ::CU_COREDUMP_TRIGGER_HOST: Bool where ::true means that the host CPU will\n      also create a coredump. The default value is ::true unless set to ::false globally or\n      or locally. This value is deprecated as of CUDA 12.5 - raise the ::CU_COREDUMP_SKIP_ABORT\n      flag to disable host device abort() if needed.\n - ::CU_COREDUMP_LIGHTWEIGHT: Bool where ::true means that any resulting coredumps\n      will not have a dump of GPU memory or non-reloc ELF images. The default value is\n      ::false. This attribute is deprecated as of CUDA 12.5, please use ::CU_COREDUMP_GENERATION_FLAGS\n      instead.\n - ::CU_COREDUMP_ENABLE_USER_TRIGGER: Bool where ::true means that a coredump can be\n      created by writing to the system pipe specified by ::CU_COREDUMP_PIPE. The default\n      value is ::false.\n - ::CU_COREDUMP_FILE: String of up to 1023 characters that defines the location where\n      any coredumps generated by this context will be written. The default value is\n      ::core.cuda.HOSTNAME.PID where ::HOSTNAME is the host name of the machine running\n      the CUDA applications and ::PID is the process ID of the CUDA application.\n - ::CU_COREDUMP_PIPE: String of up to 1023 characters that defines the name of the pipe\n      that will be monitored if user-triggered coredumps are enabled. The default value is\n      ::corepipe.cuda.HOSTNAME.PID where ::HOSTNAME is the host name of the machine running\n      the CUDA application and ::PID is the process ID of the CUDA application.\n - ::CU_COREDUMP_GENERATION_FLAGS: An integer with values to allow granular control the data\n      contained in a coredump specified as a bitwise OR combination of the following values:\n      + ::CU_COREDUMP_DEFAULT_FLAGS - if set by itself, coredump generation returns to its\n          default settings of including all memory regions that it is able to access\n      + ::CU_COREDUMP_SKIP_NONRELOCATED_ELF_IMAGES - Coredump will not include the data from\n          CUDA source modules that are not relocated at runtime.\n      + ::CU_COREDUMP_SKIP_GLOBAL_MEMORY - Coredump will not include device-side global data\n          that does not belong to any context.\n      + ::CU_COREDUMP_SKIP_SHARED_MEMORY - Coredump will not include grid-scale shared memory\n          for the warp that the dumped kernel belonged to.\n      + ::CU_COREDUMP_SKIP_LOCAL_MEMORY - Coredump will not include local memory from the kernel.\n      + ::CU_COREDUMP_LIGHTWEIGHT_FLAGS - Enables all of the above options. Equiavlent to setting\n          the ::CU_COREDUMP_LIGHTWEIGHT attribute to ::true.\n      + ::CU_COREDUMP_SKIP_ABORT - If set, GPU exceptions will not raise an abort() in the host CPU\n          process. Same functional goal as ::CU_COREDUMP_TRIGGER_HOST but better reflects the default\n          behavior.\n\n \\param attrib - The enum defining which value to fetch.\n \\param value - void* containing the requested data.\n \\param size - The size of the memory region \\p value points to.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuCoredumpGetAttribute,\n ::cuCoredumpSetAttribute,\n ::cuCoredumpSetAttributeGlobal*/\n    fn cuCoredumpGetAttributeGlobal(\n        attrib: cuda_types::cuda::CUcoredumpSettings,\n        value: *mut ::core::ffi::c_void,\n        size: *mut usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Allows caller to set a coredump attribute value for the current context\n\n This function should be considered an alternate interface to the CUDA-GDB environment\n variables defined in this document: https://docs.nvidia.com/cuda/cuda-gdb/index.html#gpu-coredump\n\n An important design decision to note is that any coredump environment variable values\n set before CUDA initializes will take permanent precedence over any values set with this\n function. This decision was made to ensure no change in behavior for any users that\n may be currently using these variables to get coredumps.\n\n \\p *value shall contain the requested value specified by \\p set. It is up to the caller\n to ensure that the data type and size of \\p *value matches the request.\n\n If the caller calls this function with \\p *value equal to NULL, the size of the memory\n region (in bytes) expected for \\p set will be placed in \\p size.\n\n /note This function will return ::CUDA_ERROR_NOT_SUPPORTED if the caller attempts to set\n ::CU_COREDUMP_ENABLE_ON_EXCEPTION on a GPU of with Compute Capability < 6.0. ::cuCoredumpSetAttributeGlobal\n works on those platforms as an alternative.\n\n /note ::CU_COREDUMP_ENABLE_USER_TRIGGER and ::CU_COREDUMP_PIPE cannot be set on a per-context basis.\n\n The supported attributes are:\n - ::CU_COREDUMP_ENABLE_ON_EXCEPTION: Bool where ::true means that GPU exceptions from\n      this context will create a coredump at the location specified by ::CU_COREDUMP_FILE.\n      The default value is ::false.\n - ::CU_COREDUMP_TRIGGER_HOST: Bool where ::true means that the host CPU will\n      also create a coredump. The default value is ::true unless set to ::false globally or\n      or locally. This value is deprecated as of CUDA 12.5 - raise the ::CU_COREDUMP_SKIP_ABORT\n      flag to disable host device abort() if needed.\n - ::CU_COREDUMP_LIGHTWEIGHT: Bool where ::true means that any resulting coredumps\n      will not have a dump of GPU memory or non-reloc ELF images. The default value is\n      ::false. This attribute is deprecated as of CUDA 12.5, please use ::CU_COREDUMP_GENERATION_FLAGS\n      instead.\n - ::CU_COREDUMP_FILE: String of up to 1023 characters that defines the location where\n      any coredumps generated by this context will be written. The default value is\n      ::core.cuda.HOSTNAME.PID where ::HOSTNAME is the host name of the machine running\n      the CUDA applications and ::PID is the process ID of the CUDA application.\n - ::CU_COREDUMP_GENERATION_FLAGS: An integer with values to allow granular control the data\n      contained in a coredump specified as a bitwise OR combination of the following values:\n      + ::CU_COREDUMP_DEFAULT_FLAGS - if set by itself, coredump generation returns to its\n          default settings of including all memory regions that it is able to access\n      + ::CU_COREDUMP_SKIP_NONRELOCATED_ELF_IMAGES - Coredump will not include the data from\n          CUDA source modules that are not relocated at runtime.\n      + ::CU_COREDUMP_SKIP_GLOBAL_MEMORY - Coredump will not include device-side global data\n          that does not belong to any context.\n      + ::CU_COREDUMP_SKIP_SHARED_MEMORY - Coredump will not include grid-scale shared memory\n          for the warp that the dumped kernel belonged to.\n      + ::CU_COREDUMP_SKIP_LOCAL_MEMORY - Coredump will not include local memory from the kernel.\n      + ::CU_COREDUMP_LIGHTWEIGHT_FLAGS - Enables all of the above options. Equiavlent to setting\n          the ::CU_COREDUMP_LIGHTWEIGHT attribute to ::true.\n      + ::CU_COREDUMP_SKIP_ABORT - If set, GPU exceptions will not raise an abort() in the host CPU\n          process. Same functional goal as ::CU_COREDUMP_TRIGGER_HOST but better reflects the default\n          behavior.\n\n \\param attrib - The enum defining which value to set.\n \\param value - void* containing the requested data.\n \\param size - The size of the memory region \\p value points to.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_PERMITTED,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_CONTEXT_IS_DESTROYED,\n ::CUDA_ERROR_NOT_SUPPORTED\n\n \\sa\n ::cuCoredumpGetAttributeGlobal,\n ::cuCoredumpGetAttribute,\n ::cuCoredumpSetAttributeGlobal*/\n    fn cuCoredumpSetAttribute(\n        attrib: cuda_types::cuda::CUcoredumpSettings,\n        value: *mut ::core::ffi::c_void,\n        size: *mut usize,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Allows caller to set a coredump attribute value globally\n\n This function should be considered an alternate interface to the CUDA-GDB environment\n variables defined in this document: https://docs.nvidia.com/cuda/cuda-gdb/index.html#gpu-coredump\n\n An important design decision to note is that any coredump environment variable values\n set before CUDA initializes will take permanent precedence over any values set with this\n function. This decision was made to ensure no change in behavior for any users that\n may be currently using these variables to get coredumps.\n\n \\p *value shall contain the requested value specified by \\p set. It is up to the caller\n to ensure that the data type and size of \\p *value matches the request.\n\n If the caller calls this function with \\p *value equal to NULL, the size of the memory\n region (in bytes) expected for \\p set will be placed in \\p size.\n\n The supported attributes are:\n - ::CU_COREDUMP_ENABLE_ON_EXCEPTION: Bool where ::true means that GPU exceptions from\n      this context will create a coredump at the location specified by ::CU_COREDUMP_FILE.\n      The default value is ::false.\n - ::CU_COREDUMP_TRIGGER_HOST: Bool where ::true means that the host CPU will\n      also create a coredump. The default value is ::true unless set to ::false globally or\n      or locally. This value is deprecated as of CUDA 12.5 - raise the ::CU_COREDUMP_SKIP_ABORT\n      flag to disable host device abort() if needed.\n - ::CU_COREDUMP_LIGHTWEIGHT: Bool where ::true means that any resulting coredumps\n      will not have a dump of GPU memory or non-reloc ELF images. The default value is\n      ::false. This attribute is deprecated as of CUDA 12.5, please use ::CU_COREDUMP_GENERATION_FLAGS\n      instead.\n - ::CU_COREDUMP_ENABLE_USER_TRIGGER: Bool where ::true means that a coredump can be\n      created by writing to the system pipe specified by ::CU_COREDUMP_PIPE. The default\n      value is ::false.\n - ::CU_COREDUMP_FILE: String of up to 1023 characters that defines the location where\n      any coredumps generated by this context will be written. The default value is\n      ::core.cuda.HOSTNAME.PID where ::HOSTNAME is the host name of the machine running\n      the CUDA applications and ::PID is the process ID of the CUDA application.\n - ::CU_COREDUMP_PIPE: String of up to 1023 characters that defines the name of the pipe\n      that will be monitored if user-triggered coredumps are enabled. This value may not be\n      changed after ::CU_COREDUMP_ENABLE_USER_TRIGGER is set to ::true. The default\n      value is ::corepipe.cuda.HOSTNAME.PID where ::HOSTNAME is the host name of the machine\n      running the CUDA application and ::PID is the process ID of the CUDA application.\n - ::CU_COREDUMP_GENERATION_FLAGS: An integer with values to allow granular control the data\n      contained in a coredump specified as a bitwise OR combination of the following values:\n      + ::CU_COREDUMP_DEFAULT_FLAGS - if set by itself, coredump generation returns to its\n          default settings of including all memory regions that it is able to access\n      + ::CU_COREDUMP_SKIP_NONRELOCATED_ELF_IMAGES - Coredump will not include the data from\n          CUDA source modules that are not relocated at runtime.\n      + ::CU_COREDUMP_SKIP_GLOBAL_MEMORY - Coredump will not include device-side global data\n          that does not belong to any context.\n      + ::CU_COREDUMP_SKIP_SHARED_MEMORY - Coredump will not include grid-scale shared memory\n          for the warp that the dumped kernel belonged to.\n      + ::CU_COREDUMP_SKIP_LOCAL_MEMORY - Coredump will not include local memory from the kernel.\n      + ::CU_COREDUMP_LIGHTWEIGHT_FLAGS - Enables all of the above options. Equiavlent to setting\n          the ::CU_COREDUMP_LIGHTWEIGHT attribute to ::true.\n      + ::CU_COREDUMP_SKIP_ABORT - If set, GPU exceptions will not raise an abort() in the host CPU\n          process. Same functional goal as ::CU_COREDUMP_TRIGGER_HOST but better reflects the default\n          behavior.\n\n \\param attrib - The enum defining which value to set.\n \\param value - void* containing the requested data.\n \\param size - The size of the memory region \\p value points to.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_PERMITTED\n\n \\sa\n ::cuCoredumpGetAttribute,\n ::cuCoredumpGetAttributeGlobal,\n ::cuCoredumpSetAttribute*/\n    fn cuCoredumpSetAttributeGlobal(\n        attrib: cuda_types::cuda::CUcoredumpSettings,\n        value: *mut ::core::ffi::c_void,\n        size: *mut usize,\n    ) -> cuda_types::cuda::CUresult;\n    /// @}\n    fn cuGetExportTable(\n        ppExportTable: *mut *const ::core::ffi::c_void,\n        pExportTableId: *const cuda_types::cuda::CUuuid,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Creates a green context with a specified set of resources.\n\n This API creates a green context with the resources specified in the descriptor \\p desc and\n returns it in the handle represented by \\p phCtx. This API will retain the primary context on device \\p dev,\n which will is released when the green context is destroyed. It is advised to have the primary context active\n before calling this API to avoid the heavy cost of triggering primary context initialization and\n deinitialization multiple times.\n\n The API does not set the green context current. In order to set it current, you need to explicitly set it current\n by first converting the green context to a CUcontext using ::cuCtxFromGreenCtx and subsequently calling\n ::cuCtxSetCurrent / ::cuCtxPushCurrent. It should be noted that a green context can be current to only one\n thread at a time. There is no internal synchronization to make API calls accessing the same green context\n from multiple threads work.\n\n Note: The API is not supported on 32-bit platforms.\n\n \\param phCtx - Pointer for the output handle to the green context\n \\param desc - Descriptor generated via ::cuDevResourceGenerateDesc which contains the set of resources to be used\n \\param dev - Device on which to create the green context.\n \\param flags - One of the supported green context creation flags. \\p CU_GREEN_CTX_DEFAULT_STREAM is required.\n\n The supported flags are:\n - \\p CU_GREEN_CTX_DEFAULT_STREAM : Creates a default stream to use inside the green context. Required.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_DEVICE,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_NOT_SUPPORTED,\n ::CUDA_ERROR_OUT_OF_MEMORY\n\n \\sa\n ::cuGreenCtxDestroy,\n ::cuCtxFromGreenCtx,\n ::cuCtxSetCurrent,\n ::cuCtxPushCurrent,\n ::cuDevResourceGenerateDesc,\n ::cuDevicePrimaryCtxRetain,\n ::cuCtxCreate*/\n    fn cuGreenCtxCreate(\n        phCtx: *mut cuda_types::cuda::CUgreenCtx,\n        desc: cuda_types::cuda::CUdevResourceDesc,\n        dev: cuda_types::cuda::CUdevice,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Destroys a green context\n\n Destroys the green context, releasing the primary context of the device that this green context was created for.\n Any resources provisioned for this green context (that were initially available via the resource descriptor)\n are released as well.\n The API does not destroy streams created via ::cuGreenCtxStreamCreate, ::cuStreamCreate, or ::cuStreamCreateWithPriority.\n Once the green context is destroyed, any subsequent API calls involving these streams (including ::cuStreamDestroy) will return\n ::CUDA_ERROR_CONTEXT_IS_DESTROYED.\n Users must explicitly destroy all such streams before invoking ::cuGreenCtxDestroy. Failure to do so will result in a memory leak.\n\n \\param hCtx - Green context to be destroyed\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_CONTEXT_IS_DESTROYED\n\n \\sa\n ::cuGreenCtxCreate,\n ::cuCtxDestroy*/\n    fn cuGreenCtxDestroy(\n        hCtx: cuda_types::cuda::CUgreenCtx,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Converts a green context into the primary context\n\n The API converts a green context into the primary context returned in \\p pContext. It is important\n to note that the converted context \\p pContext is a normal primary context but with\n the resources of the specified green context \\p hCtx. Once converted, it can then\n be used to set the context current with ::cuCtxSetCurrent or with any of the CUDA APIs\n that accept a CUcontext parameter.\n\n Users are expected to call this API before calling any CUDA APIs that accept a\n CUcontext. Failing to do so will result in the APIs returning ::CUDA_ERROR_INVALID_CONTEXT.\n\n \\param pContext Returned primary context with green context resources\n \\param hCtx Green context to convert\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuGreenCtxCreate*/\n    fn cuCtxFromGreenCtx(\n        pContext: *mut cuda_types::cuda::CUcontext,\n        hCtx: cuda_types::cuda::CUgreenCtx,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Get device resources\n\n Get the \\p type resources available to the \\p device.\n This may often be the starting point for further partitioning or configuring of resources.\n\n Note: The API is not supported on 32-bit platforms.\n\n \\param device - Device to get resource for\n \\param resource - Output pointer to a CUdevResource structure\n \\param type - Type of resource to retrieve\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_RESOURCE_TYPE,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_DEVICE\n\n \\sa\n ::cuDevResourceGenerateDesc*/\n    fn cuDeviceGetDevResource(\n        device: cuda_types::cuda::CUdevice,\n        resource: *mut cuda_types::cuda::CUdevResource,\n        type_: cuda_types::cuda::CUdevResourceType,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Get context resources\n\n Get the \\p type resources available to the context represented by \\p hCtx\n \\param hCtx - Context to get resource for\n\n Note: The API is not supported on 32-bit platforms.\n\n \\param resource - Output pointer to a CUdevResource structure\n \\param type - Type of resource to retrieve\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_RESOURCE_TYPE,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_CONTEXT\n\n \\sa\n ::cuDevResourceGenerateDesc*/\n    fn cuCtxGetDevResource(\n        hCtx: cuda_types::cuda::CUcontext,\n        resource: *mut cuda_types::cuda::CUdevResource,\n        type_: cuda_types::cuda::CUdevResourceType,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Get green context resources\n\n Get the \\p type resources available to the green context represented by \\p hCtx\n \\param hCtx - Green context to get resource for\n \\param resource - Output pointer to a CUdevResource structure\n \\param type - Type of resource to retrieve\n\n \\return\n ::CUDA_SUCCESS\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_RESOURCE_TYPE,\n ::CUDA_ERROR_INVALID_VALUE\n\n \\sa\n ::cuDevResourceGenerateDesc*/\n    fn cuGreenCtxGetDevResource(\n        hCtx: cuda_types::cuda::CUgreenCtx,\n        resource: *mut cuda_types::cuda::CUdevResource,\n        type_: cuda_types::cuda::CUdevResourceType,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Splits \\p CU_DEV_RESOURCE_TYPE_SM resources.\n\n Splits \\p CU_DEV_RESOURCE_TYPE_SM resources into \\p nbGroups, adhering to the minimum SM count specified in \\p minCount\n and the usage flags in \\p useFlags. If \\p result is NULL, the API simulates a split and provides the amount of groups that\n would be created in \\p nbGroups. Otherwise, \\p nbGroups must point to the amount of elements in \\p result and on return,\n the API will overwrite \\p nbGroups with the amount actually created. The groups are written to the array in \\p result.\n \\p nbGroups can be less than the total amount if a smaller number of groups is needed.\n\n This API is used to spatially partition the input resource. The input resource needs to come from one of\n ::cuDeviceGetDevResource, ::cuCtxGetDevResource, or ::cuGreenCtxGetDevResource.\n A limitation of the API is that the output results cannot be split again without\n first creating a descriptor and a green context with that descriptor.\n\n When creating the groups, the API will take into account the performance and functional characteristics of the\n input resource, and guarantee a split that will create a disjoint set of symmetrical partitions. This may lead to fewer groups created\n than purely dividing the total SM count by the \\p minCount due to cluster requirements or\n alignment and granularity requirements for the minCount.\n These requirements can be queried with ::cuDeviceGetDevResource, ::cuCtxGetDevResource, and ::cuGreenCtxGetDevResource for\n ::CU_DEV_RESOURCE_TYPE_SM, using the \\p minSmPartitionSize and \\p smCoscheduledAlignment fields to determine minimum\n partition size and alignment granularity, respectively.\n\n The \\p remainder set does not have the same functional or performance guarantees as the groups in \\p result.\n Its use should be carefully planned and future partitions of the \\p remainder set are discouraged.\n\n The following flags are supported:\n - \\p CU_DEV_SM_RESOURCE_SPLIT_IGNORE_SM_COSCHEDULING : Lower the minimum SM count and alignment, and treat each SM independent of its hierarchy.\n  This allows more fine grained partitions but at the cost of advanced features (such as large clusters on compute capability 9.0+).\n - \\p CU_DEV_SM_RESOURCE_SPLIT_MAX_POTENTIAL_CLUSTER_SIZE : Compute Capability 9.0+ only. Attempt to create groups that may allow\n  for maximally sized thread clusters. This can be queried post green context creation using ::cuOccupancyMaxPotentialClusterSize.\n\n A successful API call must either have:\n - A valid array of \\p result pointers of size passed in \\p nbGroups, with \\p input of type \\p CU_DEV_RESOURCE_TYPE_SM.\n Value of \\p minCount must be between 0 and the SM count specified in \\p input. \\p remaining may be NULL.\n - NULL passed in for \\p result, with a valid integer pointer in \\p nbGroups and \\p input of type \\p CU_DEV_RESOURCE_TYPE_SM.\n Value of \\p minCount must be between 0 and the SM count specified in \\p input. \\p remaining may be NULL.\n This queries the number of groups that would be created by the API.\n\n Note: The API is not supported on 32-bit platforms.\n\n \\param result - Output array of \\p CUdevResource resources. Can be NULL to query the number of groups.\n \\param nbGroups - This is a pointer, specifying the number of groups that would be or should be created as described below.\n \\param input - Input SM resource to be split. Must be a valid \\p CU_DEV_RESOURCE_TYPE_SM resource.\n \\param remaining - If the input resource cannot be cleanly split among \\p nbGroups, the remaining is placed in here.\n Can be ommitted (NULL) if the user does not need the remaining set.\n \\param useFlags - Flags specifying how these partitions are used or which constraints to abide by when splitting the input. Zero is valid for default behavior.\n \\param minCount - Minimum number of SMs required\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_DEVICE,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_RESOURCE_TYPE,\n ::CUDA_ERROR_INVALID_RESOURCE_CONFIGURATION\n\n \\sa\n ::cuGreenCtxGetDevResource,\n ::cuCtxGetDevResource,\n ::cuDeviceGetDevResource*/\n    fn cuDevSmResourceSplitByCount(\n        result: *mut cuda_types::cuda::CUdevResource,\n        nbGroups: *mut ::core::ffi::c_uint,\n        input: *const cuda_types::cuda::CUdevResource,\n        remaining: *mut cuda_types::cuda::CUdevResource,\n        useFlags: ::core::ffi::c_uint,\n        minCount: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Generate a resource descriptor\n\n Generates a single resource descriptor with the set of resources specified in \\p resources.\n The generated resource descriptor is necessary for the creation of green contexts via the ::cuGreenCtxCreate API.\n Resources of the same type can be passed in, provided they meet the requirements as noted below.\n\n A successful API call must have:\n - A valid output pointer for the \\p phDesc descriptor as well as a valid array of \\p resources pointers,\n with the array size passed in \\p nbResources.\n If multiple resources are provided in \\p resources, the device they came from must be the same,\n otherwise CUDA_ERROR_INVALID_RESOURCE_CONFIGURATION is returned.\n If multiple resources are provided in \\p resources and they are of type ::CU_DEV_RESOURCE_TYPE_SM,\n they must be outputs (whether \\p result or \\p remaining) from the same split API instance,\n otherwise CUDA_ERROR_INVALID_RESOURCE_CONFIGURATION is returned.\n\n Note: The API is not supported on 32-bit platforms.\n\n \\param phDesc - Output descriptor\n \\param resources - Array of resources to be included in the descriptor\n \\param nbResources - Number of resources passed in \\p resources\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_RESOURCE_TYPE,\n ::CUDA_ERROR_INVALID_RESOURCE_CONFIGURATION\n\n \\sa\n ::cuDevSmResourceSplitByCount*/\n    fn cuDevResourceGenerateDesc(\n        phDesc: *mut cuda_types::cuda::CUdevResourceDesc,\n        resources: *mut cuda_types::cuda::CUdevResource,\n        nbResources: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Records an event.\n\n Captures in \\p hEvent all the activities of the green context of \\p hCtx\n at the time of this call. \\p hEvent and \\p hCtx must be from the same\n primary context otherwise ::CUDA_ERROR_INVALID_HANDLE is returned.\n Calls such as ::cuEventQuery() or ::cuGreenCtxWaitEvent() will\n then examine or wait for completion of the work that was captured. Uses of\n \\p hCtx after this call do not modify \\p hEvent.\n\n \\note The API will return ::CUDA_ERROR_STREAM_CAPTURE_UNSUPPORTED if the\n specified green context \\p hCtx has a stream in the capture mode. In such\n a case, the call will invalidate all the conflicting captures.\n\n \\param hCtx - Green context to record event for\n \\param hEvent  - Event to record\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_STREAM_CAPTURE_UNSUPPORTED\n\n \\sa\n ::cuGreenCtxWaitEvent,\n ::cuEventRecord,\n ::cuCtxRecordEvent,\n ::cuCtxWaitEvent*/\n    fn cuGreenCtxRecordEvent(\n        hCtx: cuda_types::cuda::CUgreenCtx,\n        hEvent: cuda_types::cuda::CUevent,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Make a green context wait on an event\n\n Makes all future work submitted to green context \\p hCtx wait for all work\n captured in \\p hEvent. The synchronization will be performed on the device\n and will not block the calling CPU thread. See ::cuGreenCtxRecordEvent()\n or ::cuEventRecord(), for details on what is captured by an event.\n\n \\note \\p hEvent may be from a different context or device than \\p hCtx.\n\n \\note The API will return ::CUDA_ERROR_STREAM_CAPTURE_UNSUPPORTED and\n invalidate the capture if the specified event \\p hEvent is part of an\n ongoing capture sequence or if the specified green context \\p hCtx has\n a stream in the capture mode.\n\n \\param hCtx    - Green context to wait\n \\param hEvent  - Event to wait on\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_STREAM_CAPTURE_UNSUPPORTED\n\n \\sa\n ::cuGreenCtxRecordEvent,\n ::cuStreamWaitEvent,\n ::cuCtxRecordEvent,\n ::cuCtxWaitEvent*/\n    fn cuGreenCtxWaitEvent(\n        hCtx: cuda_types::cuda::CUgreenCtx,\n        hEvent: cuda_types::cuda::CUevent,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Query the green context associated with a stream\n\n Returns the CUDA green context that the stream is associated with, or NULL if the stream\n is not associated with any green context.\n\n The stream handle \\p hStream can refer to any of the following:\n <ul>\n   <li>\n   a stream created via any of the CUDA driver APIs such as ::cuStreamCreate, ::cuStreamCreateWithPriority\n   and ::cuGreenCtxStreamCreate, or their runtime API equivalents such as\n   ::cudaStreamCreate, ::cudaStreamCreateWithFlags and ::cudaStreamCreateWithPriority.\n   If during stream creation the context that was active in the calling thread was obtained\n   with cuCtxFromGreenCtx, that green context is returned in \\p phCtx.\n   Otherwise, \\p *phCtx is set to NULL instead.\n   </li>\n   <li>\n   special stream such as the NULL stream or ::CU_STREAM_LEGACY.\n   In that case if context that is active in the calling thread was obtained\n   with cuCtxFromGreenCtx, that green context is returned.\n   Otherwise, \\p *phCtx is set to NULL instead.\n   </li>\n </ul>\n Passing an invalid handle will result in undefined behavior.\n\n \\param hStream - Handle to the stream to be queried\n \\param phCtx   - Returned green context associated with the stream\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_HANDLE,\n \\notefnerr\n\n \\sa ::cuStreamDestroy,\n ::cuStreamCreate,\n ::cuStreamCreateWithPriority,\n ::cuStreamGetCtx,\n ::cuGreenCtxStreamCreate,\n ::cuStreamGetPriority,\n ::cuStreamGetFlags,\n ::cuStreamGetDevice,\n ::cuStreamWaitEvent,\n ::cuStreamQuery,\n ::cuStreamSynchronize,\n ::cuStreamAddCallback,\n ::cudaStreamCreate,\n ::cudaStreamCreateWithFlags*/\n    fn cuStreamGetGreenCtx(\n        hStream: cuda_types::cuda::CUstream,\n        phCtx: *mut cuda_types::cuda::CUgreenCtx,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Create a stream for use in the green context\n\n Creates a stream for use in the specified green context \\p greenCtx and returns a handle in \\p phStream.\n The stream can be destroyed by calling ::cuStreamDestroy(). Note that the API ignores the context that\n is current to the calling thread and creates a stream in the specified green context \\p greenCtx.\n\n The supported values for \\p flags are:\n - ::CU_STREAM_NON_BLOCKING: This must be specified. It indicates that work running in the created\n   stream may run concurrently with work in the default stream, and that\n   the created stream should perform no implicit synchronization with the default stream.\n\n Specifying \\p priority affects the scheduling priority of work in the stream. Priorities provide a\n hint to preferentially run work with higher priority when possible, but do not preempt\n already-running work or provide any other functional guarantee on execution order.\n \\p priority follows a convention where lower numbers represent higher priorities.\n '0' represents default priority. The range of meaningful numerical priorities can\n be queried using ::cuCtxGetStreamPriorityRange. If the specified priority is\n outside the numerical range returned by ::cuCtxGetStreamPriorityRange,\n it will automatically be clamped to the lowest or the highest number in the range.\n\n \\param phStream - Returned newly created stream\n \\param greenCtx - Green context for which to create the stream for\n \\param flags    - Flags for stream creation. \\p CU_STREAM_NON_BLOCKING must be specified.\n \\param priority - Stream priority. Lower numbers represent higher priorities.\n                   See ::cuCtxGetStreamPriorityRange for more information about\n                   meaningful stream priorities that can be passed.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_OUT_OF_MEMORY\n \\notefnerr\n\n \\note In the current implementation, only compute kernels launched in\n priority streams are affected by the stream's priority. Stream priorities have\n no effect on host-to-device and device-to-host memory operations.\n\n \\sa ::cuStreamDestroy,\n ::cuGreenCtxCreate\n ::cuStreamCreate,\n ::cuStreamGetPriority,\n ::cuCtxGetStreamPriorityRange,\n ::cuStreamGetFlags,\n ::cuStreamGetDevice,\n ::cuStreamWaitEvent,\n ::cuStreamQuery,\n ::cuStreamSynchronize,\n ::cuStreamAddCallback,\n ::cudaStreamCreateWithPriority*/\n    fn cuGreenCtxStreamCreate(\n        phStream: *mut cuda_types::cuda::CUstream,\n        greenCtx: cuda_types::cuda::CUgreenCtx,\n        flags: ::core::ffi::c_uint,\n        priority: ::core::ffi::c_int,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the unique Id associated with the green context supplied\n\n Returns in \\p greenCtxId the unique Id which is associated with a given green context.\n The Id is unique for the life of the program for this instance of CUDA.\n If green context is supplied as NULL and the current context is set to a green context,\n the Id of the current green context is returned.\n\n \\param greenCtx - Green context for which to obtain the Id\n \\param greenCtxId - Pointer to store the Id of the green context\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_CONTEXT_IS_DESTROYED,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa ::cuGreenCtxCreate,\n ::cuGreenCtxDestroy,\n ::cuCtxGetId*/\n    fn cuGreenCtxGetId(\n        greenCtx: cuda_types::cuda::CUgreenCtx,\n        greenCtxId: *mut ::core::ffi::c_ulonglong,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Register a callback function to receive error log messages\n\n \\param callbackFunc  - The function to register as a callback\n \\param userData      - A generic pointer to user data. This is passed into the callback function.\n \\param callback_out  - Optional location to store the callback handle after it is registered\n\n \\return\n ::CUDA_SUCCESS\n ::CUDA_ERROR_INVALID_VALUE*/\n    fn cuLogsRegisterCallback(\n        callbackFunc: cuda_types::cuda::CUlogsCallback,\n        userData: *mut ::core::ffi::c_void,\n        callback_out: *mut cuda_types::cuda::CUlogsCallbackHandle,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Unregister a log message callback\n\n \\param callback  - The callback instance to unregister from receiving log messages\n\n \\return\n ::CUDA_SUCCESS\n ::CUDA_ERROR_INVALID_VALUE*/\n    fn cuLogsUnregisterCallback(\n        callback: cuda_types::cuda::CUlogsCallbackHandle,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Sets log iterator to point to the end of log buffer, where the next message would be written.\n\n \\param iterator_out - Location to store an iterator to the current tail of the logs\n \\param flags        - Reserved for future use, must be 0\n\n \\return\n ::CUDA_SUCCESS\n ::CUDA_ERROR_INVALID_VALUE*/\n    fn cuLogsCurrent(\n        iterator_out: *mut cuda_types::cuda::CUlogIterator,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Dump accumulated driver logs into a file\n\n Logs generated by the driver are stored in an internal buffer and can be copied out using this API.\n This API dumps all driver logs starting from \\p iterator into \\p pathToFile provided.\n\n \\note \\p iterator is auto-advancing. Dumping logs will update the value of\n       \\p iterator to receive the next generated log.\n\n \\note The driver reserves limited memory for storing logs.\n       The oldest logs may be overwritten and become unrecoverable. An indication will appear in the\n       destination outupt if the logs have been truncated. Call dump after each failed API to mitigate this\n       risk.\n\n \\param iterator   - Optional auto-advancing iterator specifying the starting log to read. NULL value dumps all logs.\n \\param pathToFile - Path to output file for dumping logs\n \\param flags      - Reserved for future use, must be 0\n\n \\return\n ::CUDA_SUCCESS\n ::CUDA_ERROR_INVALID_VALUE*/\n    fn cuLogsDumpToFile(\n        iterator: *mut cuda_types::cuda::CUlogIterator,\n        pathToFile: *const ::core::ffi::c_char,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Dump accumulated driver logs into a buffer\n\n Logs generated by the driver are stored in an internal buffer and can be copied out using this API.\n This API dumps driver logs from \\p iterator into \\p buffer up to the size specified in \\p *size.\n The driver will always null terminate the buffer but there will not be a null character between log\n entries, only a newline \\\\n. The driver will then return the actual number of bytes written in\n \\p *size, excluding the null terminator. If there are no messages to dump, \\p *size will be set to 0\n and the function will return ::CUDA_SUCCESS.\n If the provided \\p buffer is not large enough to hold any messages, \\p *size will be set to 0 and\n the function will return ::CUDA_ERROR_INVALID_VALUE.\n\n \\note \\p iterator is auto-advancing. Dumping logs will update the value of\n       \\p iterator to receive the next generated log.\n\n \\note The driver reserves limited memory for storing logs. The maximum size of the buffer is 25600 bytes.\n       The oldest logs may be overwritten and become unrecoverable. An indication will appear in the\n       destination outupt if the logs have been truncated. Call dump after each failed API to mitigate this\n       risk.\n\n \\note If the provided value in \\p *size is not large enough to hold all buffered messages, a message will\n       be added at the head of the buffer indicating this. The driver then computes the number of messages\n       it is able to store in \\p buffer and writes it out. The final message in \\p buffer will always be\n       the most recent log message as of when the API is called.\n\n \\param iterator  - Optional auto-advancing iterator specifying the starting log to read. NULL value dumps all logs.\n \\param buffer    - Pointer to dump logs\n \\param size      - See description\n \\param flags     - Reserved for future use, must be 0\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_VALUE*/\n    fn cuLogsDumpToMemory(\n        iterator: *mut cuda_types::cuda::CUlogIterator,\n        buffer: *mut ::core::ffi::c_char,\n        size: *mut usize,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemHostRegister(\n        p: *mut ::core::ffi::c_void,\n        bytesize: usize,\n        Flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuGraphicsResourceSetMapFlags(\n        resource: cuda_types::cuda::CUgraphicsResource,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuLinkCreate(\n        numOptions: ::core::ffi::c_uint,\n        options: *mut cuda_types::cuda::CUjit_option,\n        optionValues: *mut *mut ::core::ffi::c_void,\n        stateOut: *mut cuda_types::cuda::CUlinkState,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuLinkAddData(\n        state: cuda_types::cuda::CUlinkState,\n        type_: cuda_types::cuda::CUjitInputType,\n        data: *mut ::core::ffi::c_void,\n        size: usize,\n        name: *const ::core::ffi::c_char,\n        numOptions: ::core::ffi::c_uint,\n        options: *mut cuda_types::cuda::CUjit_option,\n        optionValues: *mut *mut ::core::ffi::c_void,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuLinkAddFile(\n        state: cuda_types::cuda::CUlinkState,\n        type_: cuda_types::cuda::CUjitInputType,\n        path: *const ::core::ffi::c_char,\n        numOptions: ::core::ffi::c_uint,\n        options: *mut cuda_types::cuda::CUjit_option,\n        optionValues: *mut *mut ::core::ffi::c_void,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuTexRefSetAddress2D_v2(\n        hTexRef: cuda_types::cuda::CUtexref,\n        desc: *const cuda_types::cuda::CUDA_ARRAY_DESCRIPTOR,\n        dptr: cuda_types::cuda::CUdeviceptr,\n        Pitch: usize,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuDeviceTotalMem(\n        bytes: *mut ::core::ffi::c_uint,\n        dev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuCtxCreate(\n        pctx: *mut cuda_types::cuda::CUcontext,\n        flags: ::core::ffi::c_uint,\n        dev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuCtxCreate_v2(\n        pctx: *mut cuda_types::cuda::CUcontext,\n        flags: ::core::ffi::c_uint,\n        dev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuCtxCreate_v3(\n        pctx: *mut cuda_types::cuda::CUcontext,\n        paramsArray: *mut cuda_types::cuda::CUexecAffinityParam,\n        numParams: ::core::ffi::c_int,\n        flags: ::core::ffi::c_uint,\n        dev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuModuleGetGlobal(\n        dptr: *mut cuda_types::cuda::CUdeviceptr_v1,\n        bytes: *mut ::core::ffi::c_uint,\n        hmod: cuda_types::cuda::CUmodule,\n        name: *const ::core::ffi::c_char,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemGetInfo(\n        free: *mut ::core::ffi::c_uint,\n        total: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemAlloc(\n        dptr: *mut cuda_types::cuda::CUdeviceptr_v1,\n        bytesize: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemAllocPitch(\n        dptr: *mut cuda_types::cuda::CUdeviceptr_v1,\n        pPitch: *mut ::core::ffi::c_uint,\n        WidthInBytes: ::core::ffi::c_uint,\n        Height: ::core::ffi::c_uint,\n        ElementSizeBytes: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemFree(dptr: cuda_types::cuda::CUdeviceptr_v1) -> cuda_types::cuda::CUresult;\n    fn cuMemGetAddressRange(\n        pbase: *mut cuda_types::cuda::CUdeviceptr_v1,\n        psize: *mut ::core::ffi::c_uint,\n        dptr: cuda_types::cuda::CUdeviceptr_v1,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemAllocHost(\n        pp: *mut *mut ::core::ffi::c_void,\n        bytesize: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemHostGetDevicePointer(\n        pdptr: *mut cuda_types::cuda::CUdeviceptr_v1,\n        p: *mut ::core::ffi::c_void,\n        Flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyHtoD(\n        dstDevice: cuda_types::cuda::CUdeviceptr_v1,\n        srcHost: *const ::core::ffi::c_void,\n        ByteCount: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyDtoH(\n        dstHost: *mut ::core::ffi::c_void,\n        srcDevice: cuda_types::cuda::CUdeviceptr_v1,\n        ByteCount: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyDtoD(\n        dstDevice: cuda_types::cuda::CUdeviceptr_v1,\n        srcDevice: cuda_types::cuda::CUdeviceptr_v1,\n        ByteCount: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyDtoA(\n        dstArray: cuda_types::cuda::CUarray,\n        dstOffset: ::core::ffi::c_uint,\n        srcDevice: cuda_types::cuda::CUdeviceptr_v1,\n        ByteCount: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyAtoD(\n        dstDevice: cuda_types::cuda::CUdeviceptr_v1,\n        srcArray: cuda_types::cuda::CUarray,\n        srcOffset: ::core::ffi::c_uint,\n        ByteCount: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyHtoA(\n        dstArray: cuda_types::cuda::CUarray,\n        dstOffset: ::core::ffi::c_uint,\n        srcHost: *const ::core::ffi::c_void,\n        ByteCount: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyAtoH(\n        dstHost: *mut ::core::ffi::c_void,\n        srcArray: cuda_types::cuda::CUarray,\n        srcOffset: ::core::ffi::c_uint,\n        ByteCount: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyAtoA(\n        dstArray: cuda_types::cuda::CUarray,\n        dstOffset: ::core::ffi::c_uint,\n        srcArray: cuda_types::cuda::CUarray,\n        srcOffset: ::core::ffi::c_uint,\n        ByteCount: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyHtoAAsync(\n        dstArray: cuda_types::cuda::CUarray,\n        dstOffset: ::core::ffi::c_uint,\n        srcHost: *const ::core::ffi::c_void,\n        ByteCount: ::core::ffi::c_uint,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyAtoHAsync(\n        dstHost: *mut ::core::ffi::c_void,\n        srcArray: cuda_types::cuda::CUarray,\n        srcOffset: ::core::ffi::c_uint,\n        ByteCount: ::core::ffi::c_uint,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpy2D(\n        pCopy: *const cuda_types::cuda::CUDA_MEMCPY2D_v1,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpy2DUnaligned(\n        pCopy: *const cuda_types::cuda::CUDA_MEMCPY2D_v1,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpy3D(\n        pCopy: *const cuda_types::cuda::CUDA_MEMCPY3D_v1,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyHtoDAsync(\n        dstDevice: cuda_types::cuda::CUdeviceptr_v1,\n        srcHost: *const ::core::ffi::c_void,\n        ByteCount: ::core::ffi::c_uint,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyDtoHAsync(\n        dstHost: *mut ::core::ffi::c_void,\n        srcDevice: cuda_types::cuda::CUdeviceptr_v1,\n        ByteCount: ::core::ffi::c_uint,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyDtoDAsync(\n        dstDevice: cuda_types::cuda::CUdeviceptr_v1,\n        srcDevice: cuda_types::cuda::CUdeviceptr_v1,\n        ByteCount: ::core::ffi::c_uint,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpy2DAsync(\n        pCopy: *const cuda_types::cuda::CUDA_MEMCPY2D_v1,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpy3DAsync(\n        pCopy: *const cuda_types::cuda::CUDA_MEMCPY3D_v1,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemsetD8(\n        dstDevice: cuda_types::cuda::CUdeviceptr_v1,\n        uc: ::core::ffi::c_uchar,\n        N: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemsetD16(\n        dstDevice: cuda_types::cuda::CUdeviceptr_v1,\n        us: ::core::ffi::c_ushort,\n        N: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemsetD32(\n        dstDevice: cuda_types::cuda::CUdeviceptr_v1,\n        ui: ::core::ffi::c_uint,\n        N: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemsetD2D8(\n        dstDevice: cuda_types::cuda::CUdeviceptr_v1,\n        dstPitch: ::core::ffi::c_uint,\n        uc: ::core::ffi::c_uchar,\n        Width: ::core::ffi::c_uint,\n        Height: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemsetD2D16(\n        dstDevice: cuda_types::cuda::CUdeviceptr_v1,\n        dstPitch: ::core::ffi::c_uint,\n        us: ::core::ffi::c_ushort,\n        Width: ::core::ffi::c_uint,\n        Height: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemsetD2D32(\n        dstDevice: cuda_types::cuda::CUdeviceptr_v1,\n        dstPitch: ::core::ffi::c_uint,\n        ui: ::core::ffi::c_uint,\n        Width: ::core::ffi::c_uint,\n        Height: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuArrayCreate(\n        pHandle: *mut cuda_types::cuda::CUarray,\n        pAllocateArray: *const cuda_types::cuda::CUDA_ARRAY_DESCRIPTOR_v1,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuArrayGetDescriptor(\n        pArrayDescriptor: *mut cuda_types::cuda::CUDA_ARRAY_DESCRIPTOR_v1,\n        hArray: cuda_types::cuda::CUarray,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuArray3DCreate(\n        pHandle: *mut cuda_types::cuda::CUarray,\n        pAllocateArray: *const cuda_types::cuda::CUDA_ARRAY3D_DESCRIPTOR_v1,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuArray3DGetDescriptor(\n        pArrayDescriptor: *mut cuda_types::cuda::CUDA_ARRAY3D_DESCRIPTOR_v1,\n        hArray: cuda_types::cuda::CUarray,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuTexRefSetAddress(\n        ByteOffset: *mut ::core::ffi::c_uint,\n        hTexRef: cuda_types::cuda::CUtexref,\n        dptr: cuda_types::cuda::CUdeviceptr_v1,\n        bytes: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuTexRefSetAddress2D(\n        hTexRef: cuda_types::cuda::CUtexref,\n        desc: *const cuda_types::cuda::CUDA_ARRAY_DESCRIPTOR_v1,\n        dptr: cuda_types::cuda::CUdeviceptr_v1,\n        Pitch: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuTexRefGetAddress(\n        pdptr: *mut cuda_types::cuda::CUdeviceptr_v1,\n        hTexRef: cuda_types::cuda::CUtexref,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuGraphicsResourceGetMappedPointer(\n        pDevPtr: *mut cuda_types::cuda::CUdeviceptr_v1,\n        pSize: *mut ::core::ffi::c_uint,\n        resource: cuda_types::cuda::CUgraphicsResource,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuCtxDestroy(ctx: cuda_types::cuda::CUcontext) -> cuda_types::cuda::CUresult;\n    fn cuCtxPopCurrent(\n        pctx: *mut cuda_types::cuda::CUcontext,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuCtxPushCurrent(ctx: cuda_types::cuda::CUcontext) -> cuda_types::cuda::CUresult;\n    fn cuStreamDestroy(\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuEventDestroy(hEvent: cuda_types::cuda::CUevent) -> cuda_types::cuda::CUresult;\n    fn cuEventElapsedTime(\n        pMilliseconds: *mut f32,\n        hStart: cuda_types::cuda::CUevent,\n        hEnd: cuda_types::cuda::CUevent,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuDevicePrimaryCtxRelease(\n        dev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuDevicePrimaryCtxReset(\n        dev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuDevicePrimaryCtxSetFlags(\n        dev: cuda_types::cuda::CUdevice,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuDeviceGetUuid(\n        uuid: *mut cuda_types::cuda::CUuuid,\n        dev: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyHtoD_v2(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        srcHost: *const ::core::ffi::c_void,\n        ByteCount: usize,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyDtoH_v2(\n        dstHost: *mut ::core::ffi::c_void,\n        srcDevice: cuda_types::cuda::CUdeviceptr,\n        ByteCount: usize,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyDtoD_v2(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        srcDevice: cuda_types::cuda::CUdeviceptr,\n        ByteCount: usize,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyDtoA_v2(\n        dstArray: cuda_types::cuda::CUarray,\n        dstOffset: usize,\n        srcDevice: cuda_types::cuda::CUdeviceptr,\n        ByteCount: usize,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyAtoD_v2(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        srcArray: cuda_types::cuda::CUarray,\n        srcOffset: usize,\n        ByteCount: usize,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyHtoA_v2(\n        dstArray: cuda_types::cuda::CUarray,\n        dstOffset: usize,\n        srcHost: *const ::core::ffi::c_void,\n        ByteCount: usize,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyAtoH_v2(\n        dstHost: *mut ::core::ffi::c_void,\n        srcArray: cuda_types::cuda::CUarray,\n        srcOffset: usize,\n        ByteCount: usize,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyAtoA_v2(\n        dstArray: cuda_types::cuda::CUarray,\n        dstOffset: usize,\n        srcArray: cuda_types::cuda::CUarray,\n        srcOffset: usize,\n        ByteCount: usize,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyHtoAAsync_v2(\n        dstArray: cuda_types::cuda::CUarray,\n        dstOffset: usize,\n        srcHost: *const ::core::ffi::c_void,\n        ByteCount: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyAtoHAsync_v2(\n        dstHost: *mut ::core::ffi::c_void,\n        srcArray: cuda_types::cuda::CUarray,\n        srcOffset: usize,\n        ByteCount: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpy2D_v2(\n        pCopy: *const cuda_types::cuda::CUDA_MEMCPY2D,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpy2DUnaligned_v2(\n        pCopy: *const cuda_types::cuda::CUDA_MEMCPY2D,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpy3D_v2(\n        pCopy: *const cuda_types::cuda::CUDA_MEMCPY3D,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyHtoDAsync_v2(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        srcHost: *const ::core::ffi::c_void,\n        ByteCount: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyDtoHAsync_v2(\n        dstHost: *mut ::core::ffi::c_void,\n        srcDevice: cuda_types::cuda::CUdeviceptr,\n        ByteCount: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyDtoDAsync_v2(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        srcDevice: cuda_types::cuda::CUdeviceptr,\n        ByteCount: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpy2DAsync_v2(\n        pCopy: *const cuda_types::cuda::CUDA_MEMCPY2D,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpy3DAsync_v2(\n        pCopy: *const cuda_types::cuda::CUDA_MEMCPY3D,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemsetD8_v2(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        uc: ::core::ffi::c_uchar,\n        N: usize,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemsetD16_v2(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        us: ::core::ffi::c_ushort,\n        N: usize,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemsetD32_v2(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        ui: ::core::ffi::c_uint,\n        N: usize,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemsetD2D8_v2(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        dstPitch: usize,\n        uc: ::core::ffi::c_uchar,\n        Width: usize,\n        Height: usize,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemsetD2D16_v2(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        dstPitch: usize,\n        us: ::core::ffi::c_ushort,\n        Width: usize,\n        Height: usize,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemsetD2D32_v2(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        dstPitch: usize,\n        ui: ::core::ffi::c_uint,\n        Width: usize,\n        Height: usize,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpy(\n        dst: cuda_types::cuda::CUdeviceptr,\n        src: cuda_types::cuda::CUdeviceptr,\n        ByteCount: usize,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyAsync(\n        dst: cuda_types::cuda::CUdeviceptr,\n        src: cuda_types::cuda::CUdeviceptr,\n        ByteCount: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyPeer(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        dstContext: cuda_types::cuda::CUcontext,\n        srcDevice: cuda_types::cuda::CUdeviceptr,\n        srcContext: cuda_types::cuda::CUcontext,\n        ByteCount: usize,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyPeerAsync(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        dstContext: cuda_types::cuda::CUcontext,\n        srcDevice: cuda_types::cuda::CUdeviceptr,\n        srcContext: cuda_types::cuda::CUcontext,\n        ByteCount: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpy3DPeer(\n        pCopy: *const cuda_types::cuda::CUDA_MEMCPY3D_PEER,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpy3DPeerAsync(\n        pCopy: *const cuda_types::cuda::CUDA_MEMCPY3D_PEER,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyBatchAsync(\n        dsts: *mut cuda_types::cuda::CUdeviceptr,\n        srcs: *mut cuda_types::cuda::CUdeviceptr,\n        sizes: *mut usize,\n        count: usize,\n        attrs: *mut cuda_types::cuda::CUmemcpyAttributes,\n        attrsIdxs: *mut usize,\n        numAttrs: usize,\n        failIdx: *mut usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpy3DBatchAsync(\n        numOps: usize,\n        opList: *mut cuda_types::cuda::CUDA_MEMCPY3D_BATCH_OP,\n        failIdx: *mut usize,\n        flags: ::core::ffi::c_ulonglong,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyBatchAsync_ptsz(\n        dsts: *mut cuda_types::cuda::CUdeviceptr,\n        srcs: *mut cuda_types::cuda::CUdeviceptr,\n        sizes: *mut usize,\n        count: usize,\n        attrs: *mut cuda_types::cuda::CUmemcpyAttributes,\n        attrsIdxs: *mut usize,\n        numAttrs: usize,\n        failIdx: *mut usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpy3DBatchAsync_ptsz(\n        numOps: usize,\n        opList: *mut cuda_types::cuda::CUDA_MEMCPY3D_BATCH_OP,\n        failIdx: *mut usize,\n        flags: ::core::ffi::c_ulonglong,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpyBatchAsync_v2(\n        dsts: *mut cuda_types::cuda::CUdeviceptr,\n        srcs: *mut cuda_types::cuda::CUdeviceptr,\n        sizes: *mut usize,\n        count: usize,\n        attrs: *mut cuda_types::cuda::CUmemcpyAttributes,\n        attrsIdxs: *mut usize,\n        numAttrs: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemcpy3DBatchAsync_v2(\n        numOps: usize,\n        opList: *mut cuda_types::cuda::CUDA_MEMCPY3D_BATCH_OP,\n        flags: ::core::ffi::c_ulonglong,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemsetD8Async(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        uc: ::core::ffi::c_uchar,\n        N: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemsetD16Async(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        us: ::core::ffi::c_ushort,\n        N: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemsetD32Async(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        ui: ::core::ffi::c_uint,\n        N: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemsetD2D8Async(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        dstPitch: usize,\n        uc: ::core::ffi::c_uchar,\n        Width: usize,\n        Height: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemsetD2D16Async(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        dstPitch: usize,\n        us: ::core::ffi::c_ushort,\n        Width: usize,\n        Height: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemsetD2D32Async(\n        dstDevice: cuda_types::cuda::CUdeviceptr,\n        dstPitch: usize,\n        ui: ::core::ffi::c_uint,\n        Width: usize,\n        Height: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamGetPriority(\n        hStream: cuda_types::cuda::CUstream,\n        priority: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamGetId(\n        hStream: cuda_types::cuda::CUstream,\n        streamId: *mut ::core::ffi::c_ulonglong,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamGetFlags(\n        hStream: cuda_types::cuda::CUstream,\n        flags: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamGetDevice(\n        hStream: cuda_types::cuda::CUstream,\n        device: *mut cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamGetCtx(\n        hStream: cuda_types::cuda::CUstream,\n        pctx: *mut cuda_types::cuda::CUcontext,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamGetCtx_v2(\n        hStream: cuda_types::cuda::CUstream,\n        pCtx: *mut cuda_types::cuda::CUcontext,\n        pGreenCtx: *mut cuda_types::cuda::CUgreenCtx,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamWaitEvent(\n        hStream: cuda_types::cuda::CUstream,\n        hEvent: cuda_types::cuda::CUevent,\n        Flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamAddCallback(\n        hStream: cuda_types::cuda::CUstream,\n        callback: cuda_types::cuda::CUstreamCallback,\n        userData: *mut ::core::ffi::c_void,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamAttachMemAsync(\n        hStream: cuda_types::cuda::CUstream,\n        dptr: cuda_types::cuda::CUdeviceptr,\n        length: usize,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamQuery(hStream: cuda_types::cuda::CUstream) -> cuda_types::cuda::CUresult;\n    fn cuStreamSynchronize(\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuEventRecord(\n        hEvent: cuda_types::cuda::CUevent,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuEventRecordWithFlags(\n        hEvent: cuda_types::cuda::CUevent,\n        hStream: cuda_types::cuda::CUstream,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuLaunchKernel(\n        f: cuda_types::cuda::CUfunction,\n        gridDimX: ::core::ffi::c_uint,\n        gridDimY: ::core::ffi::c_uint,\n        gridDimZ: ::core::ffi::c_uint,\n        blockDimX: ::core::ffi::c_uint,\n        blockDimY: ::core::ffi::c_uint,\n        blockDimZ: ::core::ffi::c_uint,\n        sharedMemBytes: ::core::ffi::c_uint,\n        hStream: cuda_types::cuda::CUstream,\n        kernelParams: *mut *mut ::core::ffi::c_void,\n        extra: *mut *mut ::core::ffi::c_void,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuLaunchKernelEx(\n        config: *const cuda_types::cuda::CUlaunchConfig,\n        f: cuda_types::cuda::CUfunction,\n        kernelParams: *mut *mut ::core::ffi::c_void,\n        extra: *mut *mut ::core::ffi::c_void,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuLaunchHostFunc(\n        hStream: cuda_types::cuda::CUstream,\n        fn_: cuda_types::cuda::CUhostFn,\n        userData: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuGraphicsMapResources(\n        count: ::core::ffi::c_uint,\n        resources: *mut cuda_types::cuda::CUgraphicsResource,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuGraphicsUnmapResources(\n        count: ::core::ffi::c_uint,\n        resources: *mut cuda_types::cuda::CUgraphicsResource,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamWriteValue32(\n        stream: cuda_types::cuda::CUstream,\n        addr: cuda_types::cuda::CUdeviceptr,\n        value: cuda_types::cuda::cuuint32_t,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamWaitValue32(\n        stream: cuda_types::cuda::CUstream,\n        addr: cuda_types::cuda::CUdeviceptr,\n        value: cuda_types::cuda::cuuint32_t,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamWriteValue64(\n        stream: cuda_types::cuda::CUstream,\n        addr: cuda_types::cuda::CUdeviceptr,\n        value: cuda_types::cuda::cuuint64_t,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamWaitValue64(\n        stream: cuda_types::cuda::CUstream,\n        addr: cuda_types::cuda::CUdeviceptr,\n        value: cuda_types::cuda::cuuint64_t,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamBatchMemOp(\n        stream: cuda_types::cuda::CUstream,\n        count: ::core::ffi::c_uint,\n        paramArray: *mut cuda_types::cuda::CUstreamBatchMemOpParams,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamWriteValue32_ptsz(\n        stream: cuda_types::cuda::CUstream,\n        addr: cuda_types::cuda::CUdeviceptr,\n        value: cuda_types::cuda::cuuint32_t,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamWaitValue32_ptsz(\n        stream: cuda_types::cuda::CUstream,\n        addr: cuda_types::cuda::CUdeviceptr,\n        value: cuda_types::cuda::cuuint32_t,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamWriteValue64_ptsz(\n        stream: cuda_types::cuda::CUstream,\n        addr: cuda_types::cuda::CUdeviceptr,\n        value: cuda_types::cuda::cuuint64_t,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamWaitValue64_ptsz(\n        stream: cuda_types::cuda::CUstream,\n        addr: cuda_types::cuda::CUdeviceptr,\n        value: cuda_types::cuda::cuuint64_t,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamBatchMemOp_ptsz(\n        stream: cuda_types::cuda::CUstream,\n        count: ::core::ffi::c_uint,\n        paramArray: *mut cuda_types::cuda::CUstreamBatchMemOpParams,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamWriteValue32_v2(\n        stream: cuda_types::cuda::CUstream,\n        addr: cuda_types::cuda::CUdeviceptr,\n        value: cuda_types::cuda::cuuint32_t,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamWaitValue32_v2(\n        stream: cuda_types::cuda::CUstream,\n        addr: cuda_types::cuda::CUdeviceptr,\n        value: cuda_types::cuda::cuuint32_t,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamWriteValue64_v2(\n        stream: cuda_types::cuda::CUstream,\n        addr: cuda_types::cuda::CUdeviceptr,\n        value: cuda_types::cuda::cuuint64_t,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamWaitValue64_v2(\n        stream: cuda_types::cuda::CUstream,\n        addr: cuda_types::cuda::CUdeviceptr,\n        value: cuda_types::cuda::cuuint64_t,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamBatchMemOp_v2(\n        stream: cuda_types::cuda::CUstream,\n        count: ::core::ffi::c_uint,\n        paramArray: *mut cuda_types::cuda::CUstreamBatchMemOpParams,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemPrefetchAsync(\n        devPtr: cuda_types::cuda::CUdeviceptr,\n        count: usize,\n        dstDevice: cuda_types::cuda::CUdevice,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemPrefetchAsync_ptsz(\n        devPtr: cuda_types::cuda::CUdeviceptr,\n        count: usize,\n        dstDevice: cuda_types::cuda::CUdevice,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemPrefetchAsync_v2(\n        devPtr: cuda_types::cuda::CUdeviceptr,\n        count: usize,\n        location: cuda_types::cuda::CUmemLocation,\n        flags: ::core::ffi::c_uint,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemAdvise(\n        devPtr: cuda_types::cuda::CUdeviceptr,\n        count: usize,\n        advice: cuda_types::cuda::CUmem_advise,\n        device: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemPrefetchBatchAsync(\n        dptrs: *mut cuda_types::cuda::CUdeviceptr,\n        sizes: *mut usize,\n        count: usize,\n        prefetchLocs: *mut cuda_types::cuda::CUmemLocation,\n        prefetchLocIdxs: *mut usize,\n        numPrefetchLocs: usize,\n        flags: ::core::ffi::c_ulonglong,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemDiscardBatchAsync(\n        dptrs: *mut cuda_types::cuda::CUdeviceptr,\n        sizes: *mut usize,\n        count: usize,\n        flags: ::core::ffi::c_ulonglong,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemDiscardAndPrefetchBatchAsync(\n        dptrs: *mut cuda_types::cuda::CUdeviceptr,\n        sizes: *mut usize,\n        count: usize,\n        prefetchLocs: *mut cuda_types::cuda::CUmemLocation,\n        prefetchLocIdxs: *mut usize,\n        numPrefetchLocs: usize,\n        flags: ::core::ffi::c_ulonglong,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuLaunchCooperativeKernel(\n        f: cuda_types::cuda::CUfunction,\n        gridDimX: ::core::ffi::c_uint,\n        gridDimY: ::core::ffi::c_uint,\n        gridDimZ: ::core::ffi::c_uint,\n        blockDimX: ::core::ffi::c_uint,\n        blockDimY: ::core::ffi::c_uint,\n        blockDimZ: ::core::ffi::c_uint,\n        sharedMemBytes: ::core::ffi::c_uint,\n        hStream: cuda_types::cuda::CUstream,\n        kernelParams: *mut *mut ::core::ffi::c_void,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuSignalExternalSemaphoresAsync(\n        extSemArray: *const cuda_types::cuda::CUexternalSemaphore,\n        paramsArray: *const cuda_types::cuda::CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS,\n        numExtSems: ::core::ffi::c_uint,\n        stream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuWaitExternalSemaphoresAsync(\n        extSemArray: *const cuda_types::cuda::CUexternalSemaphore,\n        paramsArray: *const cuda_types::cuda::CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS,\n        numExtSems: ::core::ffi::c_uint,\n        stream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamBeginCapture(\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamBeginCapture_ptsz(\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamBeginCapture_v2(\n        hStream: cuda_types::cuda::CUstream,\n        mode: cuda_types::cuda::CUstreamCaptureMode,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamBeginCaptureToGraph(\n        hStream: cuda_types::cuda::CUstream,\n        hGraph: cuda_types::cuda::CUgraph,\n        dependencies: *const cuda_types::cuda::CUgraphNode,\n        dependencyData: *const cuda_types::cuda::CUgraphEdgeData,\n        numDependencies: usize,\n        mode: cuda_types::cuda::CUstreamCaptureMode,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamEndCapture(\n        hStream: cuda_types::cuda::CUstream,\n        phGraph: *mut cuda_types::cuda::CUgraph,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamIsCapturing(\n        hStream: cuda_types::cuda::CUstream,\n        captureStatus: *mut cuda_types::cuda::CUstreamCaptureStatus,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamGetCaptureInfo(\n        hStream: cuda_types::cuda::CUstream,\n        captureStatus_out: *mut cuda_types::cuda::CUstreamCaptureStatus,\n        id_out: *mut cuda_types::cuda::cuuint64_t,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamGetCaptureInfo_ptsz(\n        hStream: cuda_types::cuda::CUstream,\n        captureStatus_out: *mut cuda_types::cuda::CUstreamCaptureStatus,\n        id_out: *mut cuda_types::cuda::cuuint64_t,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamGetCaptureInfo_v2(\n        hStream: cuda_types::cuda::CUstream,\n        captureStatus_out: *mut cuda_types::cuda::CUstreamCaptureStatus,\n        id_out: *mut cuda_types::cuda::cuuint64_t,\n        graph_out: *mut cuda_types::cuda::CUgraph,\n        dependencies_out: *mut *const cuda_types::cuda::CUgraphNode,\n        numDependencies_out: *mut usize,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamGetCaptureInfo_v2_ptsz(\n        hStream: cuda_types::cuda::CUstream,\n        captureStatus_out: *mut cuda_types::cuda::CUstreamCaptureStatus,\n        id_out: *mut cuda_types::cuda::cuuint64_t,\n        graph_out: *mut cuda_types::cuda::CUgraph,\n        dependencies_out: *mut *const cuda_types::cuda::CUgraphNode,\n        numDependencies_out: *mut usize,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamGetCaptureInfo_v3(\n        hStream: cuda_types::cuda::CUstream,\n        captureStatus_out: *mut cuda_types::cuda::CUstreamCaptureStatus,\n        id_out: *mut cuda_types::cuda::cuuint64_t,\n        graph_out: *mut cuda_types::cuda::CUgraph,\n        dependencies_out: *mut *const cuda_types::cuda::CUgraphNode,\n        edgeData_out: *mut *const cuda_types::cuda::CUgraphEdgeData,\n        numDependencies_out: *mut usize,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuGraphAddKernelNode(\n        phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n        hGraph: cuda_types::cuda::CUgraph,\n        dependencies: *const cuda_types::cuda::CUgraphNode,\n        numDependencies: usize,\n        nodeParams: *const cuda_types::cuda::CUDA_KERNEL_NODE_PARAMS_v1,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuGraphKernelNodeGetParams(\n        hNode: cuda_types::cuda::CUgraphNode,\n        nodeParams: *mut cuda_types::cuda::CUDA_KERNEL_NODE_PARAMS_v1,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuGraphKernelNodeSetParams(\n        hNode: cuda_types::cuda::CUgraphNode,\n        nodeParams: *const cuda_types::cuda::CUDA_KERNEL_NODE_PARAMS_v1,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuGraphExecKernelNodeSetParams(\n        hGraphExec: cuda_types::cuda::CUgraphExec,\n        hNode: cuda_types::cuda::CUgraphNode,\n        nodeParams: *const cuda_types::cuda::CUDA_KERNEL_NODE_PARAMS_v1,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuGraphInstantiateWithParams(\n        phGraphExec: *mut cuda_types::cuda::CUgraphExec,\n        hGraph: cuda_types::cuda::CUgraph,\n        instantiateParams: *mut cuda_types::cuda::CUDA_GRAPH_INSTANTIATE_PARAMS,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuGraphExecUpdate(\n        hGraphExec: cuda_types::cuda::CUgraphExec,\n        hGraph: cuda_types::cuda::CUgraph,\n        hErrorNode_out: *mut cuda_types::cuda::CUgraphNode,\n        updateResult_out: *mut cuda_types::cuda::CUgraphExecUpdateResult,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuGraphUpload(\n        hGraph: cuda_types::cuda::CUgraphExec,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuGraphLaunch(\n        hGraph: cuda_types::cuda::CUgraphExec,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuGraphGetEdges(\n        hGraph: cuda_types::cuda::CUgraph,\n        from: *mut cuda_types::cuda::CUgraphNode,\n        to: *mut cuda_types::cuda::CUgraphNode,\n        numEdges: *mut usize,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuGraphNodeGetDependencies(\n        hNode: cuda_types::cuda::CUgraphNode,\n        dependencies: *mut cuda_types::cuda::CUgraphNode,\n        numDependencies: *mut usize,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuGraphNodeGetDependentNodes(\n        hNode: cuda_types::cuda::CUgraphNode,\n        dependentNodes: *mut cuda_types::cuda::CUgraphNode,\n        numDependentNodes: *mut usize,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuGraphAddDependencies(\n        hGraph: cuda_types::cuda::CUgraph,\n        from: *const cuda_types::cuda::CUgraphNode,\n        to: *const cuda_types::cuda::CUgraphNode,\n        numDependencies: usize,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuGraphRemoveDependencies(\n        hGraph: cuda_types::cuda::CUgraph,\n        from: *const cuda_types::cuda::CUgraphNode,\n        to: *const cuda_types::cuda::CUgraphNode,\n        numDependencies: usize,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuGraphAddNode(\n        phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n        hGraph: cuda_types::cuda::CUgraph,\n        dependencies: *const cuda_types::cuda::CUgraphNode,\n        numDependencies: usize,\n        nodeParams: *mut cuda_types::cuda::CUgraphNodeParams,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamCopyAttributes(\n        dstStream: cuda_types::cuda::CUstream,\n        srcStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamGetAttribute(\n        hStream: cuda_types::cuda::CUstream,\n        attr: cuda_types::cuda::CUstreamAttrID,\n        value: *mut cuda_types::cuda::CUstreamAttrValue,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamSetAttribute(\n        hStream: cuda_types::cuda::CUstream,\n        attr: cuda_types::cuda::CUstreamAttrID,\n        param: *const cuda_types::cuda::CUstreamAttrValue,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuIpcOpenMemHandle(\n        pdptr: *mut cuda_types::cuda::CUdeviceptr,\n        handle: cuda_types::cuda::CUipcMemHandle,\n        Flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuGraphInstantiate(\n        phGraphExec: *mut cuda_types::cuda::CUgraphExec,\n        hGraph: cuda_types::cuda::CUgraph,\n        phErrorNode: *mut cuda_types::cuda::CUgraphNode,\n        logBuffer: *mut ::core::ffi::c_char,\n        bufferSize: usize,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuGraphInstantiate_v2(\n        phGraphExec: *mut cuda_types::cuda::CUgraphExec,\n        hGraph: cuda_types::cuda::CUgraph,\n        phErrorNode: *mut cuda_types::cuda::CUgraphNode,\n        logBuffer: *mut ::core::ffi::c_char,\n        bufferSize: usize,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemMapArrayAsync(\n        mapInfoList: *mut cuda_types::cuda::CUarrayMapInfo,\n        count: ::core::ffi::c_uint,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemFreeAsync(\n        dptr: cuda_types::cuda::CUdeviceptr,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemAllocAsync(\n        dptr: *mut cuda_types::cuda::CUdeviceptr,\n        bytesize: usize,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemAllocFromPoolAsync(\n        dptr: *mut cuda_types::cuda::CUdeviceptr,\n        bytesize: usize,\n        pool: cuda_types::cuda::CUmemoryPool,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamUpdateCaptureDependencies(\n        hStream: cuda_types::cuda::CUstream,\n        dependencies: *mut cuda_types::cuda::CUgraphNode,\n        numDependencies: usize,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamUpdateCaptureDependencies_ptsz(\n        hStream: cuda_types::cuda::CUstream,\n        dependencies: *mut cuda_types::cuda::CUgraphNode,\n        numDependencies: usize,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuStreamUpdateCaptureDependencies_v2(\n        hStream: cuda_types::cuda::CUstream,\n        dependencies: *mut cuda_types::cuda::CUgraphNode,\n        dependencyData: *const cuda_types::cuda::CUgraphEdgeData,\n        numDependencies: usize,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuMemBatchDecompressAsync(\n        paramsArray: *mut cuda_types::cuda::CUmemDecompressParams,\n        count: usize,\n        flags: ::core::ffi::c_uint,\n        errorIndex: *mut usize,\n        stream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuGetProcAddress(\n        symbol: *const ::core::ffi::c_char,\n        pfn: *mut *mut ::core::ffi::c_void,\n        cudaVersion: ::core::ffi::c_int,\n        flags: cuda_types::cuda::cuuint64_t,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the restore thread ID for a CUDA process\n\n Returns in \\p *tid the thread ID of the CUDA restore thread for the process\n specified by \\p pid.\n\n \\param pid - The process ID of the CUDA process\n \\param tid - Returned restore thread ID\n\n \\return\n ::CUDA_SUCCESS\n ::CUDA_ERROR_INVALID_VALUE\n ::CUDA_ERROR_NOT_INITIALIZED\n ::CUDA_ERROR_NOT_SUPPORTED*/\n    fn cuCheckpointProcessGetRestoreThreadId(\n        pid: ::core::ffi::c_int,\n        tid: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Returns the process state of a CUDA process\n\n Returns in \\p *state the current state of the CUDA process specified by \\p pid.\n\n \\param pid - The process ID of the CUDA process\n \\param state - Returned CUDA process state\n\n \\return\n ::CUDA_SUCCESS\n ::CUDA_ERROR_INVALID_VALUE\n ::CUDA_ERROR_NOT_INITIALIZED\n ::CUDA_ERROR_NOT_SUPPORTED*/\n    fn cuCheckpointProcessGetState(\n        pid: ::core::ffi::c_int,\n        state: *mut cuda_types::cuda::CUprocessState,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Lock a running CUDA process\n\n Lock the CUDA process specified by \\p pid which will block further CUDA API\n calls. Process must be in the RUNNING state in order to lock.\n\n Upon successful return the process will be in the LOCKED state.\n\n If timeoutMs is specified and the timeout is reached the process will be left\n in the RUNNING state upon return.\n\n \\param pid - The process ID of the CUDA process\n \\param args - Optional lock operation arguments\n\n \\return\n ::CUDA_SUCCESS\n ::CUDA_ERROR_INVALID_VALUE\n ::CUDA_ERROR_NOT_INITIALIZED\n ::CUDA_ERROR_ILLEGAL_STATE\n ::CUDA_ERROR_NOT_SUPPORTED\n ::CUDA_ERROR_NOT_READY*/\n    fn cuCheckpointProcessLock(\n        pid: ::core::ffi::c_int,\n        args: *mut cuda_types::cuda::CUcheckpointLockArgs,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Checkpoint a CUDA process's GPU memory contents\n\n Checkpoints a CUDA process specified by \\p pid that is in the LOCKED\n state. The GPU memory contents will be brought into host memory and all\n underlying references will be released. Process must be in the LOCKED state\n to checkpoint.\n\n Upon successful return the process will be in the CHECKPOINTED state.\n\n \\param pid - The process ID of the CUDA process\n \\param args - Optional checkpoint operation arguments\n\n \\return\n ::CUDA_SUCCESS\n ::CUDA_ERROR_INVALID_VALUE\n ::CUDA_ERROR_NOT_INITIALIZED\n ::CUDA_ERROR_ILLEGAL_STATE\n ::CUDA_ERROR_NOT_SUPPORTED*/\n    fn cuCheckpointProcessCheckpoint(\n        pid: ::core::ffi::c_int,\n        args: *mut cuda_types::cuda::CUcheckpointCheckpointArgs,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Restore a CUDA process's GPU memory contents from its last checkpoint\n\n Restores a CUDA process specified by \\p pid from its last checkpoint. Process\n must be in the CHECKPOINTED state to restore.\n\n GPU UUID pairs can be specified in \\p args to remap the process old GPUs onto\n new GPUs. The GPU to restore onto needs to have enough memory and be of the\n same chip type as the old GPU. If an array of GPU UUID pairs is specified, it\n must contain every checkpointed GPU.\n\n Upon successful return the process will be in the LOCKED state.\n\n CUDA process restore requires persistence mode to be enabled or ::cuInit to\n have been called before execution.\n\n \\param pid - The process ID of the CUDA process\n \\param args - Optional restore operation arguments\n\n \\return\n ::CUDA_SUCCESS\n ::CUDA_ERROR_INVALID_VALUE\n ::CUDA_ERROR_NOT_INITIALIZED\n ::CUDA_ERROR_ILLEGAL_STATE\n ::CUDA_ERROR_NOT_SUPPORTED\n\n \\sa\n ::cuInit*/\n    fn cuCheckpointProcessRestore(\n        pid: ::core::ffi::c_int,\n        args: *mut cuda_types::cuda::CUcheckpointRestoreArgs,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Unlock a CUDA process to allow CUDA API calls\n\n Unlocks a process specified by \\p pid allowing it to resume making CUDA API\n calls. Process must be in the LOCKED state.\n\n Upon successful return the process will be in the RUNNING state.\n\n \\param pid - The process ID of the CUDA process\n \\param args - Optional unlock operation arguments\n\n \\return\n ::CUDA_SUCCESS\n ::CUDA_ERROR_INVALID_VALUE\n ::CUDA_ERROR_NOT_INITIALIZED\n ::CUDA_ERROR_ILLEGAL_STATE\n ::CUDA_ERROR_NOT_SUPPORTED*/\n    fn cuCheckpointProcessUnlock(\n        pid: ::core::ffi::c_int,\n        args: *mut cuda_types::cuda::CUcheckpointUnlockArgs,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Initialize the profiling.\n\n \\deprecated\n\n Note that this function is deprecated and should not be used.\n Starting with CUDA 12.0, it always returns error code ::CUDA_ERROR_NOT_SUPPORTED.\n\n Using this API user can initialize the CUDA profiler by specifying\n the configuration file, output file and output file format. This\n API is generally used to profile different set of counters by\n looping the kernel launch. The \\p configFile parameter can be used\n to select profiling options including profiler counters. Refer to\n the \"Compute Command Line Profiler User Guide\" for supported\n profiler options and counters.\n\n Limitation: The CUDA profiler cannot be initialized with this API\n if another profiling tool is already active, as indicated by the\n ::CUDA_ERROR_PROFILER_DISABLED return code.\n\n Typical usage of the profiling APIs is as follows:\n\n for each set of counters/options\\n\n {\\n\n     cuProfilerInitialize(); //Initialize profiling, set the counters or options in the config file \\n\n     ...\\n\n     cuProfilerStart(); \\n\n     // code to be profiled \\n\n     cuProfilerStop(); \\n\n     ...\\n\n     cuProfilerStart(); \\n\n     // code to be profiled \\n\n     cuProfilerStop(); \\n\n     ...\\n\n }\\n\n\n \\param configFile - Name of the config file that lists the counters/options\n for profiling.\n \\param outputFile - Name of the outputFile where the profiling results will\n be stored.\n \\param outputMode - outputMode, can be ::CU_OUT_KEY_VALUE_PAIR or ::CU_OUT_CSV.\n\n \\return\n ::CUDA_ERROR_NOT_SUPPORTED\n \\notefnerr\n\n \\sa\n ::cuProfilerStart,\n ::cuProfilerStop,*/\n    fn cuProfilerInitialize(\n        configFile: *const ::core::ffi::c_char,\n        outputFile: *const ::core::ffi::c_char,\n        outputMode: cuda_types::cuda::CUoutput_mode,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Enable profiling.\n\n Enables profile collection by the active profiling tool for the\n current context. If profiling is already enabled, then\n cuProfilerStart() has no effect.\n\n cuProfilerStart and cuProfilerStop APIs are used to\n programmatically control the profiling granularity by allowing\n profiling to be done only on selective pieces of code.\n\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_CONTEXT\n \\notefnerr\n\n \\sa\n ::cuProfilerInitialize,\n ::cuProfilerStop,\n ::cudaProfilerStart*/\n    fn cuProfilerStart() -> cuda_types::cuda::CUresult;\n    /** \\brief Disable profiling.\n\n Disables profile collection by the active profiling tool for the\n current context. If profiling is already disabled, then\n cuProfilerStop() has no effect.\n\n cuProfilerStart and cuProfilerStop APIs are used to\n programmatically control the profiling granularity by allowing\n profiling to be done only on selective pieces of code.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_CONTEXT\n \\notefnerr\n\n \\sa\n ::cuProfilerInitialize,\n ::cuProfilerStart,\n ::cudaProfilerStop*/\n    fn cuProfilerStop() -> cuda_types::cuda::CUresult;\n    /** \\brief Registers an OpenGL buffer object\n\n Registers the buffer object specified by \\p buffer for access by\n CUDA.  A handle to the registered object is returned as \\p\n pCudaResource.  The register flags \\p Flags specify the intended usage,\n as follows:\n\n - ::CU_GRAPHICS_REGISTER_FLAGS_NONE: Specifies no hints about how this\n   resource will be used. It is therefore assumed that this resource will be\n   read from and written to by CUDA. This is the default value.\n - ::CU_GRAPHICS_REGISTER_FLAGS_READ_ONLY: Specifies that CUDA\n   will not write to this resource.\n - ::CU_GRAPHICS_REGISTER_FLAGS_WRITE_DISCARD: Specifies that\n   CUDA will not read from this resource and will write over the\n   entire contents of the resource, so none of the data previously\n   stored in the resource will be preserved.\n\n \\param pCudaResource - Pointer to the returned object handle\n \\param buffer - name of buffer object to be registered\n \\param Flags - Register flags\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_ALREADY_MAPPED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_OPERATING_SYSTEM\n \\notefnerr\n\n \\sa\n ::cuGraphicsUnregisterResource,\n ::cuGraphicsMapResources,\n ::cuGraphicsResourceGetMappedPointer,\n ::cudaGraphicsGLRegisterBuffer*/\n    fn cuGraphicsGLRegisterBuffer(\n        pCudaResource: *mut cuda_types::cuda::CUgraphicsResource,\n        buffer: cuda_types::cuda::GLuint,\n        Flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Register an OpenGL texture or renderbuffer object\n\n Registers the texture or renderbuffer object specified by \\p image for access by CUDA.\n A handle to the registered object is returned as \\p pCudaResource.\n\n \\p target must match the type of the object, and must be one of ::GL_TEXTURE_2D,\n ::GL_TEXTURE_RECTANGLE, ::GL_TEXTURE_CUBE_MAP, ::GL_TEXTURE_3D, ::GL_TEXTURE_2D_ARRAY,\n or ::GL_RENDERBUFFER.\n\n The register flags \\p Flags specify the intended usage, as follows:\n\n - ::CU_GRAPHICS_REGISTER_FLAGS_NONE: Specifies no hints about how this\n   resource will be used. It is therefore assumed that this resource will be\n   read from and written to by CUDA. This is the default value.\n - ::CU_GRAPHICS_REGISTER_FLAGS_READ_ONLY: Specifies that CUDA\n   will not write to this resource.\n - ::CU_GRAPHICS_REGISTER_FLAGS_WRITE_DISCARD: Specifies that\n   CUDA will not read from this resource and will write over the\n   entire contents of the resource, so none of the data previously\n   stored in the resource will be preserved.\n - ::CU_GRAPHICS_REGISTER_FLAGS_SURFACE_LDST: Specifies that CUDA will\n   bind this resource to a surface reference.\n - ::CU_GRAPHICS_REGISTER_FLAGS_TEXTURE_GATHER: Specifies that CUDA will perform\n   texture gather operations on this resource.\n\n The following image formats are supported. For brevity's sake, the list is abbreviated.\n For ex., {GL_R, GL_RG} X {8, 16} would expand to the following 4 formats\n {GL_R8, GL_R16, GL_RG8, GL_RG16} :\n - GL_RED, GL_RG, GL_RGBA, GL_LUMINANCE, GL_ALPHA, GL_LUMINANCE_ALPHA, GL_INTENSITY\n - {GL_R, GL_RG, GL_RGBA} X {8, 16, 16F, 32F, 8UI, 16UI, 32UI, 8I, 16I, 32I}\n - {GL_LUMINANCE, GL_ALPHA, GL_LUMINANCE_ALPHA, GL_INTENSITY} X\n {8, 16, 16F_ARB, 32F_ARB, 8UI_EXT, 16UI_EXT, 32UI_EXT, 8I_EXT, 16I_EXT, 32I_EXT}\n\n The following image classes are currently disallowed:\n - Textures with borders\n - Multisampled renderbuffers\n\n \\param pCudaResource - Pointer to the returned object handle\n \\param image - name of texture or renderbuffer object to be registered\n \\param target - Identifies the type of object specified by \\p image\n \\param Flags - Register flags\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_ALREADY_MAPPED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_OPERATING_SYSTEM\n \\notefnerr\n\n \\sa\n ::cuGraphicsUnregisterResource,\n ::cuGraphicsMapResources,\n ::cuGraphicsSubResourceGetMappedArray,\n ::cudaGraphicsGLRegisterImage*/\n    fn cuGraphicsGLRegisterImage(\n        pCudaResource: *mut cuda_types::cuda::CUgraphicsResource,\n        image: cuda_types::cuda::GLuint,\n        target: cuda_types::cuda::GLenum,\n        Flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Gets the CUDA devices associated with the current OpenGL context\n\n Returns in \\p *pCudaDeviceCount the number of CUDA-compatible devices\n corresponding to the current OpenGL context. Also returns in \\p *pCudaDevices\n at most cudaDeviceCount of the CUDA-compatible devices corresponding to\n the current OpenGL context. If any of the GPUs being used by the current OpenGL\n context are not CUDA capable then the call will return CUDA_ERROR_NO_DEVICE.\n\n The \\p deviceList argument may be any of the following:\n - ::CU_GL_DEVICE_LIST_ALL: Query all devices used by the current OpenGL context.\n - ::CU_GL_DEVICE_LIST_CURRENT_FRAME: Query the devices used by the current OpenGL context to\n   render the current frame (in SLI).\n - ::CU_GL_DEVICE_LIST_NEXT_FRAME: Query the devices used by the current OpenGL context to\n   render the next frame (in SLI). Note that this is a prediction, it can't be guaranteed that\n   this is correct in all cases.\n\n \\param pCudaDeviceCount - Returned number of CUDA devices.\n \\param pCudaDevices     - Returned CUDA devices.\n \\param cudaDeviceCount  - The size of the output device array pCudaDevices.\n \\param deviceList       - The set of devices to return.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_NO_DEVICE,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_GRAPHICS_CONTEXT,\n ::CUDA_ERROR_OPERATING_SYSTEM\n\n \\notefnerr\n\n \\sa\n ::cuWGLGetDevice,\n ::cudaGLGetDevices*/\n    fn cuGLGetDevices_v2(\n        pCudaDeviceCount: *mut ::core::ffi::c_uint,\n        pCudaDevices: *mut cuda_types::cuda::CUdevice,\n        cudaDeviceCount: ::core::ffi::c_uint,\n        deviceList: cuda_types::cuda::CUGLDeviceList,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Create a CUDA context for interoperability with OpenGL\n\n \\deprecated This function is deprecated as of Cuda 5.0.\n\n This function is deprecated and should no longer be used.  It is\n no longer necessary to associate a CUDA context with an OpenGL\n context in order to achieve maximum interoperability performance.\n\n \\param pCtx   - Returned CUDA context\n \\param Flags  - Options for CUDA context creation\n \\param device - Device on which to create the context\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_OUT_OF_MEMORY\n \\notefnerr\n\n \\sa ::cuCtxCreate, ::cuGLInit, ::cuGLMapBufferObject,\n ::cuGLRegisterBufferObject, ::cuGLUnmapBufferObject,\n ::cuGLUnregisterBufferObject, ::cuGLMapBufferObjectAsync,\n ::cuGLUnmapBufferObjectAsync, ::cuGLSetBufferObjectMapFlags,\n ::cuWGLGetDevice*/\n    fn cuGLCtxCreate_v2(\n        pCtx: *mut cuda_types::cuda::CUcontext,\n        Flags: ::core::ffi::c_uint,\n        device: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Initializes OpenGL interoperability\n\n \\deprecated This function is deprecated as of Cuda 3.0.\n\n Initializes OpenGL interoperability. This function is deprecated\n and calling it is no longer required. It may fail if the needed\n OpenGL driver facilities are not available.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_UNKNOWN\n \\notefnerr\n\n \\sa ::cuGLMapBufferObject,\n ::cuGLRegisterBufferObject, ::cuGLUnmapBufferObject,\n ::cuGLUnregisterBufferObject, ::cuGLMapBufferObjectAsync,\n ::cuGLUnmapBufferObjectAsync, ::cuGLSetBufferObjectMapFlags,\n ::cuWGLGetDevice*/\n    fn cuGLInit() -> cuda_types::cuda::CUresult;\n    /** \\brief Registers an OpenGL buffer object\n\n \\deprecated This function is deprecated as of Cuda 3.0.\n\n Registers the buffer object specified by \\p buffer for access by\n CUDA. This function must be called before CUDA can map the buffer\n object.  There must be a valid OpenGL context bound to the current\n thread when this function is called, and the buffer name is\n resolved by that context.\n\n \\param buffer - The name of the buffer object to register.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_ALREADY_MAPPED\n \\notefnerr\n\n \\sa ::cuGraphicsGLRegisterBuffer*/\n    fn cuGLRegisterBufferObject(\n        buffer: cuda_types::cuda::GLuint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Maps an OpenGL buffer object\n\n \\deprecated This function is deprecated as of Cuda 3.0.\n\n Maps the buffer object specified by \\p buffer into the address space of the\n current CUDA context and returns in \\p *dptr and \\p *size the base pointer\n and size of the resulting mapping.\n\n There must be a valid OpenGL context bound to the current thread\n when this function is called.  This must be the same context, or a\n member of the same shareGroup, as the context that was bound when\n the buffer was registered.\n\n All streams in the current CUDA context are synchronized with the\n current GL context.\n\n \\param dptr   - Returned mapped base pointer\n \\param size   - Returned size of mapping\n \\param buffer - The name of the buffer object to map\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_MAP_FAILED\n \\notefnerr\n\n \\sa ::cuGraphicsMapResources*/\n    fn cuGLMapBufferObject_v2_ptds(\n        dptr: *mut cuda_types::cuda::CUdeviceptr,\n        size: *mut usize,\n        buffer: cuda_types::cuda::GLuint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Unmaps an OpenGL buffer object\n\n \\deprecated This function is deprecated as of Cuda 3.0.\n\n Unmaps the buffer object specified by \\p buffer for access by CUDA.\n\n There must be a valid OpenGL context bound to the current thread\n when this function is called.  This must be the same context, or a\n member of the same shareGroup, as the context that was bound when\n the buffer was registered.\n\n All streams in the current CUDA context are synchronized with the\n current GL context.\n\n \\param buffer - Buffer object to unmap\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa ::cuGraphicsUnmapResources*/\n    fn cuGLUnmapBufferObject(\n        buffer: cuda_types::cuda::GLuint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Unregister an OpenGL buffer object\n\n \\deprecated This function is deprecated as of Cuda 3.0.\n\n Unregisters the buffer object specified by \\p buffer.  This\n releases any resources associated with the registered buffer.\n After this call, the buffer may no longer be mapped for access by\n CUDA.\n\n There must be a valid OpenGL context bound to the current thread\n when this function is called.  This must be the same context, or a\n member of the same shareGroup, as the context that was bound when\n the buffer was registered.\n\n \\param buffer - Name of the buffer object to unregister\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa ::cuGraphicsUnregisterResource*/\n    fn cuGLUnregisterBufferObject(\n        buffer: cuda_types::cuda::GLuint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Set the map flags for an OpenGL buffer object\n\n \\deprecated This function is deprecated as of Cuda 3.0.\n\n Sets the map flags for the buffer object specified by \\p buffer.\n\n Changes to \\p Flags will take effect the next time \\p buffer is mapped.\n The \\p Flags argument may be any of the following:\n - ::CU_GL_MAP_RESOURCE_FLAGS_NONE: Specifies no hints about how this\n   resource will be used. It is therefore assumed that this resource will be\n   read from and written to by CUDA kernels. This is the default value.\n - ::CU_GL_MAP_RESOURCE_FLAGS_READ_ONLY: Specifies that CUDA kernels which\n   access this resource will not write to this resource.\n - ::CU_GL_MAP_RESOURCE_FLAGS_WRITE_DISCARD: Specifies that CUDA kernels\n   which access this resource will not read from this resource and will\n   write over the entire contents of the resource, so none of the data\n   previously stored in the resource will be preserved.\n\n If \\p buffer has not been registered for use with CUDA, then\n ::CUDA_ERROR_INVALID_HANDLE is returned. If \\p buffer is presently\n mapped for access by CUDA, then ::CUDA_ERROR_ALREADY_MAPPED is returned.\n\n There must be a valid OpenGL context bound to the current thread\n when this function is called.  This must be the same context, or a\n member of the same shareGroup, as the context that was bound when\n the buffer was registered.\n\n \\param buffer - Buffer object to unmap\n \\param Flags  - Map flags\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_ALREADY_MAPPED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n \\notefnerr\n\n \\sa ::cuGraphicsResourceSetMapFlags*/\n    fn cuGLSetBufferObjectMapFlags(\n        buffer: cuda_types::cuda::GLuint,\n        Flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Maps an OpenGL buffer object\n\n \\deprecated This function is deprecated as of Cuda 3.0.\n\n Maps the buffer object specified by \\p buffer into the address space of the\n current CUDA context and returns in \\p *dptr and \\p *size the base pointer\n and size of the resulting mapping.\n\n There must be a valid OpenGL context bound to the current thread\n when this function is called.  This must be the same context, or a\n member of the same shareGroup, as the context that was bound when\n the buffer was registered.\n\n Stream \\p hStream in the current CUDA context is synchronized with\n the current GL context.\n\n \\param dptr    - Returned mapped base pointer\n \\param size    - Returned size of mapping\n \\param buffer  - The name of the buffer object to map\n \\param hStream - Stream to synchronize\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_MAP_FAILED\n \\notefnerr\n\n \\sa ::cuGraphicsMapResources*/\n    fn cuGLMapBufferObjectAsync_v2_ptsz(\n        dptr: *mut cuda_types::cuda::CUdeviceptr,\n        size: *mut usize,\n        buffer: cuda_types::cuda::GLuint,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Unmaps an OpenGL buffer object\n\n \\deprecated This function is deprecated as of Cuda 3.0.\n\n Unmaps the buffer object specified by \\p buffer for access by CUDA.\n\n There must be a valid OpenGL context bound to the current thread\n when this function is called.  This must be the same context, or a\n member of the same shareGroup, as the context that was bound when\n the buffer was registered.\n\n Stream \\p hStream in the current CUDA context is synchronized with\n the current GL context.\n\n \\param buffer  - Name of the buffer object to unmap\n \\param hStream - Stream to synchronize\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa ::cuGraphicsUnmapResources*/\n    fn cuGLUnmapBufferObjectAsync(\n        buffer: cuda_types::cuda::GLuint,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuGLGetDevices(\n        pCudaDeviceCount: *mut ::core::ffi::c_uint,\n        pCudaDevices: *mut cuda_types::cuda::CUdevice,\n        cudaDeviceCount: ::core::ffi::c_uint,\n        deviceList: cuda_types::cuda::CUGLDeviceList,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuGLMapBufferObject_v2(\n        dptr: *mut cuda_types::cuda::CUdeviceptr,\n        size: *mut usize,\n        buffer: cuda_types::cuda::GLuint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuGLMapBufferObjectAsync_v2(\n        dptr: *mut cuda_types::cuda::CUdeviceptr,\n        size: *mut usize,\n        buffer: cuda_types::cuda::GLuint,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuGLCtxCreate(\n        pCtx: *mut cuda_types::cuda::CUcontext,\n        Flags: ::core::ffi::c_uint,\n        device: cuda_types::cuda::CUdevice,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuGLMapBufferObject(\n        dptr: *mut cuda_types::cuda::CUdeviceptr_v1,\n        size: *mut ::core::ffi::c_uint,\n        buffer: cuda_types::cuda::GLuint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuGLMapBufferObjectAsync(\n        dptr: *mut cuda_types::cuda::CUdeviceptr_v1,\n        size: *mut ::core::ffi::c_uint,\n        buffer: cuda_types::cuda::GLuint,\n        hStream: cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Registers an EGL image\n\n Registers the EGLImageKHR specified by \\p image for access by\n CUDA. A handle to the registered object is returned as \\p pCudaResource.\n Additional Mapping/Unmapping is not required for the registered resource and\n ::cuGraphicsResourceGetMappedEglFrame can be directly called on the \\p pCudaResource.\n\n The application will be responsible for synchronizing access to shared objects.\n The application must ensure that any pending operation which access the objects have completed\n before passing control to CUDA. This may be accomplished by issuing and waiting for\n glFinish command on all GLcontexts (for OpenGL and likewise for other APIs).\n The application will be also responsible for ensuring that any pending operation on the\n registered CUDA resource has completed prior to executing subsequent commands in other APIs\n accesing the same memory objects.\n This can be accomplished by calling cuCtxSynchronize or cuEventSynchronize (preferably).\n\n The surface's intended usage is specified using \\p flags, as follows:\n\n - ::CU_GRAPHICS_MAP_RESOURCE_FLAGS_NONE: Specifies no hints about how this\n   resource will be used. It is therefore assumed that this resource will be\n   read from and written to by CUDA. This is the default value.\n - ::CU_GRAPHICS_MAP_RESOURCE_FLAGS_READ_ONLY: Specifies that CUDA\n   will not write to this resource.\n - ::CU_GRAPHICS_MAP_RESOURCE_FLAGS_WRITE_DISCARD: Specifies that\n   CUDA will not read from this resource and will write over the\n   entire contents of the resource, so none of the data previously\n   stored in the resource will be preserved.\n\n The EGLImageKHR is an object which can be used to create EGLImage target resource. It is defined as a void pointer.\n typedef void* EGLImageKHR\n\n \\param pCudaResource   - Pointer to the returned object handle\n \\param image           - An EGLImageKHR image which can be used to create target resource.\n \\param flags           - Map flags\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_ALREADY_MAPPED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n\n \\sa ::cuGraphicsEGLRegisterImage, ::cuGraphicsUnregisterResource,\n ::cuGraphicsResourceSetMapFlags, ::cuGraphicsMapResources,\n ::cuGraphicsUnmapResources,\n ::cudaGraphicsEGLRegisterImage*/\n    fn cuGraphicsEGLRegisterImage(\n        pCudaResource: *mut cuda_types::cuda::CUgraphicsResource,\n        image: cuda_types::cuda::EGLImageKHR,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Connect CUDA to EGLStream as a consumer.\n\n Connect CUDA as a consumer to EGLStreamKHR specified by \\p stream.\n\n The EGLStreamKHR is an EGL object that transfers a sequence of image frames from one\n API to another.\n\n \\param conn            - Pointer to the returned connection handle\n \\param stream          - EGLStreamKHR handle\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_CONTEXT,\n\n \\sa ::cuEGLStreamConsumerConnect, ::cuEGLStreamConsumerDisconnect,\n ::cuEGLStreamConsumerAcquireFrame, ::cuEGLStreamConsumerReleaseFrame,\n ::cudaEGLStreamConsumerConnect*/\n    fn cuEGLStreamConsumerConnect(\n        conn: *mut cuda_types::cuda::CUeglStreamConnection,\n        stream: cuda_types::cuda::EGLStreamKHR,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Connect CUDA to EGLStream as a consumer with given flags.\n\n Connect CUDA as a consumer to EGLStreamKHR specified by \\p stream with specified \\p flags defined by CUeglResourceLocationFlags.\n\n The flags specify whether the consumer wants to access frames from system memory or video memory.\n Default is ::CU_EGL_RESOURCE_LOCATION_VIDMEM.\n\n \\param conn              - Pointer to the returned connection handle\n \\param stream            - EGLStreamKHR handle\n \\param flags             - Flags denote intended location - system or video.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_CONTEXT,\n\n \\sa ::cuEGLStreamConsumerConnect, ::cuEGLStreamConsumerDisconnect,\n ::cuEGLStreamConsumerAcquireFrame, ::cuEGLStreamConsumerReleaseFrame,\n ::cudaEGLStreamConsumerConnectWithFlags*/\n    fn cuEGLStreamConsumerConnectWithFlags(\n        conn: *mut cuda_types::cuda::CUeglStreamConnection,\n        stream: cuda_types::cuda::EGLStreamKHR,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Disconnect CUDA as a consumer to EGLStream .\n\n Disconnect CUDA as a consumer to EGLStreamKHR.\n\n \\param conn            - Conection to disconnect.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_CONTEXT,\n\n \\sa ::cuEGLStreamConsumerConnect, ::cuEGLStreamConsumerDisconnect,\n ::cuEGLStreamConsumerAcquireFrame, ::cuEGLStreamConsumerReleaseFrame,\n ::cudaEGLStreamConsumerDisconnect*/\n    fn cuEGLStreamConsumerDisconnect(\n        conn: *mut cuda_types::cuda::CUeglStreamConnection,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Acquire an image frame from the EGLStream with CUDA as a consumer.\n\n Acquire an image frame from EGLStreamKHR. This API can also acquire an old frame presented\n by the producer unless explicitly disabled by setting EGL_SUPPORT_REUSE_NV flag to EGL_FALSE\n during stream initialization. By default, EGLStream is created with this flag set to EGL_TRUE.\n ::cuGraphicsResourceGetMappedEglFrame can be called on \\p pCudaResource to get\n ::CUeglFrame.\n\n \\param conn            - Connection on which to acquire\n \\param pCudaResource   - CUDA resource on which the stream frame will be mapped for use.\n \\param pStream         - CUDA stream for synchronization and any data migrations\n                          implied by ::CUeglResourceLocationFlags.\n \\param timeout         - Desired timeout in usec for a new frame to be acquired.\n                          If set as ::CUDA_EGL_INFINITE_TIMEOUT, acquire waits infinitely.\n                          After timeout occurs CUDA consumer tries to acquire an old frame\n                          if available and EGL_SUPPORT_REUSE_NV flag is set.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_LAUNCH_TIMEOUT,\n\n \\sa ::cuEGLStreamConsumerConnect, ::cuEGLStreamConsumerDisconnect,\n ::cuEGLStreamConsumerAcquireFrame, ::cuEGLStreamConsumerReleaseFrame,\n ::cudaEGLStreamConsumerAcquireFrame*/\n    fn cuEGLStreamConsumerAcquireFrame(\n        conn: *mut cuda_types::cuda::CUeglStreamConnection,\n        pCudaResource: *mut cuda_types::cuda::CUgraphicsResource,\n        pStream: *mut cuda_types::cuda::CUstream,\n        timeout: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Releases the last frame acquired from the EGLStream.\n\n Release the acquired image frame specified by \\p pCudaResource to EGLStreamKHR.\n If EGL_SUPPORT_REUSE_NV flag is set to EGL_TRUE, at the time of EGL creation\n this API doesn't release the last frame acquired on the EGLStream.\n By default, EGLStream is created with this flag set to EGL_TRUE.\n\n \\param conn            - Connection on which to release\n \\param pCudaResource   - CUDA resource whose corresponding frame is to be released\n \\param pStream         - CUDA stream on which release will be done.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_HANDLE,\n\n \\sa ::cuEGLStreamConsumerConnect, ::cuEGLStreamConsumerDisconnect,\n ::cuEGLStreamConsumerAcquireFrame, ::cuEGLStreamConsumerReleaseFrame,\n ::cudaEGLStreamConsumerReleaseFrame*/\n    fn cuEGLStreamConsumerReleaseFrame(\n        conn: *mut cuda_types::cuda::CUeglStreamConnection,\n        pCudaResource: cuda_types::cuda::CUgraphicsResource,\n        pStream: *mut cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Connect CUDA to EGLStream as a producer.\n\n Connect CUDA as a producer to EGLStreamKHR specified by \\p stream.\n\n The EGLStreamKHR is an EGL object that transfers a sequence of image frames from one\n API to another.\n\n \\param conn   - Pointer to the returned connection handle\n \\param stream - EGLStreamKHR handle\n \\param width  - width of the image to be submitted to the stream\n \\param height - height of the image to be submitted to the stream\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_CONTEXT,\n\n \\sa ::cuEGLStreamProducerConnect, ::cuEGLStreamProducerDisconnect,\n ::cuEGLStreamProducerPresentFrame,\n ::cudaEGLStreamProducerConnect*/\n    fn cuEGLStreamProducerConnect(\n        conn: *mut cuda_types::cuda::CUeglStreamConnection,\n        stream: cuda_types::cuda::EGLStreamKHR,\n        width: cuda_types::cuda::EGLint,\n        height: cuda_types::cuda::EGLint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Disconnect CUDA as a producer  to EGLStream .\n\n Disconnect CUDA as a producer to EGLStreamKHR.\n\n \\param conn            - Conection to disconnect.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_INVALID_CONTEXT,\n\n \\sa ::cuEGLStreamProducerConnect, ::cuEGLStreamProducerDisconnect,\n ::cuEGLStreamProducerPresentFrame,\n ::cudaEGLStreamProducerDisconnect*/\n    fn cuEGLStreamProducerDisconnect(\n        conn: *mut cuda_types::cuda::CUeglStreamConnection,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Present a CUDA eglFrame to the EGLStream with CUDA as a producer.\n\n When a frame is presented by the producer, it gets associated with the EGLStream\n and thus it is illegal to free the frame before the producer is disconnected.\n If a frame is freed and reused it may lead to undefined behavior.\n\n If producer and consumer are on different GPUs (iGPU and dGPU) then frametype\n ::CU_EGL_FRAME_TYPE_ARRAY is not supported. ::CU_EGL_FRAME_TYPE_PITCH can be used for\n such cross-device applications.\n\n The ::CUeglFrame is defined as:\n \\code\n typedef struct CUeglFrame_st {\n     union {\n         CUarray pArray[MAX_PLANES];\n         void*   pPitch[MAX_PLANES];\n     } frame;\n     unsigned int width;\n     unsigned int height;\n     unsigned int depth;\n     unsigned int pitch;\n     unsigned int planeCount;\n     unsigned int numChannels;\n     CUeglFrameType frameType;\n     CUeglColorFormat eglColorFormat;\n     CUarray_format cuFormat;\n } CUeglFrame;\n \\endcode\n\n For ::CUeglFrame of type ::CU_EGL_FRAME_TYPE_PITCH, the application may present sub-region of a memory\n allocation. In that case, the pitched pointer will specify the start address of the sub-region in\n the allocation and corresponding ::CUeglFrame fields will specify the dimensions of the sub-region.\n\n \\param conn            - Connection on which to present the CUDA array\n \\param eglframe        - CUDA Eglstream Proucer Frame handle to be sent to the consumer over EglStream.\n \\param pStream         - CUDA stream on which to present the frame.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_HANDLE,\n\n \\sa ::cuEGLStreamProducerConnect, ::cuEGLStreamProducerDisconnect,\n ::cuEGLStreamProducerReturnFrame,\n ::cudaEGLStreamProducerPresentFrame*/\n    fn cuEGLStreamProducerPresentFrame(\n        conn: *mut cuda_types::cuda::CUeglStreamConnection,\n        eglframe: cuda_types::cuda::CUeglFrame,\n        pStream: *mut cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Return the CUDA eglFrame to the EGLStream released by the consumer.\n\n This API can potentially return CUDA_ERROR_LAUNCH_TIMEOUT if the consumer has not\n returned a frame to EGL stream. If timeout is returned the application can retry.\n\n \\param conn            - Connection on which to return\n \\param eglframe        - CUDA Eglstream Proucer Frame handle returned from the consumer over EglStream.\n \\param pStream         - CUDA stream on which to return the frame.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_LAUNCH_TIMEOUT\n\n \\sa ::cuEGLStreamProducerConnect, ::cuEGLStreamProducerDisconnect,\n ::cuEGLStreamProducerPresentFrame,\n ::cudaEGLStreamProducerReturnFrame*/\n    fn cuEGLStreamProducerReturnFrame(\n        conn: *mut cuda_types::cuda::CUeglStreamConnection,\n        eglframe: *mut cuda_types::cuda::CUeglFrame,\n        pStream: *mut cuda_types::cuda::CUstream,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Get an eglFrame through which to access a registered EGL graphics resource.\n\n Returns in \\p *eglFrame an eglFrame pointer through which the registered graphics resource\n \\p resource may be accessed.\n This API can only be called for registered EGL graphics resources.\n\n The ::CUeglFrame is defined as:\n \\code\n typedef struct CUeglFrame_st {\n     union {\n         CUarray pArray[MAX_PLANES];\n         void*   pPitch[MAX_PLANES];\n     } frame;\n     unsigned int width;\n     unsigned int height;\n     unsigned int depth;\n     unsigned int pitch;\n     unsigned int planeCount;\n     unsigned int numChannels;\n     CUeglFrameType frameType;\n     CUeglColorFormat eglColorFormat;\n     CUarray_format cuFormat;\n } CUeglFrame;\n \\endcode\n\n If \\p resource is not registered then ::CUDA_ERROR_NOT_MAPPED is returned.\n *\n \\param eglFrame   - Returned eglFrame.\n \\param resource   - Registered resource to access.\n \\param index      - Index for cubemap surfaces.\n \\param mipLevel   - Mipmap level for the subresource to access.\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_NOT_MAPPED\n\n \\sa\n ::cuGraphicsMapResources,\n ::cuGraphicsSubResourceGetMappedArray,\n ::cuGraphicsResourceGetMappedPointer,\n ::cudaGraphicsResourceGetMappedEglFrame*/\n    fn cuGraphicsResourceGetMappedEglFrame(\n        eglFrame: *mut cuda_types::cuda::CUeglFrame,\n        resource: cuda_types::cuda::CUgraphicsResource,\n        index: ::core::ffi::c_uint,\n        mipLevel: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Creates an event from EGLSync object\n\n Creates an event *phEvent from an EGLSyncKHR eglSync with the flags specified\n via \\p flags. Valid flags include:\n - ::CU_EVENT_DEFAULT: Default event creation flag.\n - ::CU_EVENT_BLOCKING_SYNC: Specifies that the created event should use blocking\n synchronization.  A CPU thread that uses ::cuEventSynchronize() to wait on\n an event created with this flag will block until the event has actually\n been completed.\n\n Once the \\p eglSync gets destroyed, ::cuEventDestroy is the only API\n that can be invoked on the event.\n\n ::cuEventRecord and TimingData are not supported for events created from EGLSync.\n\n The EGLSyncKHR is an opaque handle to an EGL sync object.\n typedef void* EGLSyncKHR\n\n \\param phEvent - Returns newly created event\n \\param eglSync - Opaque handle to EGLSync object\n \\param flags   - Event creation flags\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_OUT_OF_MEMORY\n\n \\sa\n ::cuEventQuery,\n ::cuEventSynchronize,\n ::cuEventDestroy*/\n    fn cuEventCreateFromEGLSync(\n        phEvent: *mut cuda_types::cuda::CUevent,\n        eglSync: cuda_types::cuda::EGLSyncKHR,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Gets the CUDA device associated with a VDPAU device\n\n Returns in \\p *pDevice the CUDA device associated with a \\p vdpDevice, if\n applicable.\n\n \\param pDevice           - Device associated with vdpDevice\n \\param vdpDevice         - A VdpDevice handle\n \\param vdpGetProcAddress - VDPAU's VdpGetProcAddress function pointer\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE\n \\notefnerr\n\n \\sa ::cuCtxCreate, ::cuVDPAUCtxCreate, ::cuGraphicsVDPAURegisterVideoSurface,\n ::cuGraphicsVDPAURegisterOutputSurface, ::cuGraphicsUnregisterResource,\n ::cuGraphicsResourceSetMapFlags, ::cuGraphicsMapResources,\n ::cuGraphicsUnmapResources, ::cuGraphicsSubResourceGetMappedArray,\n ::cudaVDPAUGetDevice*/\n    fn cuVDPAUGetDevice(\n        pDevice: *mut cuda_types::cuda::CUdevice,\n        vdpDevice: cuda_types::cuda::VdpDevice,\n        vdpGetProcAddress: cuda_types::cuda::VdpGetProcAddress,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Create a CUDA context for interoperability with VDPAU\n\n Creates a new CUDA context, initializes VDPAU interoperability, and\n associates the CUDA context with the calling thread. It must be called\n before performing any other VDPAU interoperability operations. It may fail\n if the needed VDPAU driver facilities are not available. For usage of the\n \\p flags parameter, see ::cuCtxCreate().\n\n \\param pCtx              - Returned CUDA context\n \\param flags             - Options for CUDA context creation\n \\param device            - Device on which to create the context\n \\param vdpDevice         - The VdpDevice to interop with\n \\param vdpGetProcAddress - VDPAU's VdpGetProcAddress function pointer\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_DEINITIALIZED,\n ::CUDA_ERROR_NOT_INITIALIZED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n ::CUDA_ERROR_INVALID_VALUE,\n ::CUDA_ERROR_OUT_OF_MEMORY\n \\notefnerr\n\n \\sa ::cuCtxCreate, ::cuGraphicsVDPAURegisterVideoSurface,\n ::cuGraphicsVDPAURegisterOutputSurface, ::cuGraphicsUnregisterResource,\n ::cuGraphicsResourceSetMapFlags, ::cuGraphicsMapResources,\n ::cuGraphicsUnmapResources, ::cuGraphicsSubResourceGetMappedArray,\n ::cuVDPAUGetDevice*/\n    fn cuVDPAUCtxCreate_v2(\n        pCtx: *mut cuda_types::cuda::CUcontext,\n        flags: ::core::ffi::c_uint,\n        device: cuda_types::cuda::CUdevice,\n        vdpDevice: cuda_types::cuda::VdpDevice,\n        vdpGetProcAddress: cuda_types::cuda::VdpGetProcAddress,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Registers a VDPAU VdpVideoSurface object\n\n Registers the VdpVideoSurface specified by \\p vdpSurface for access by\n CUDA. A handle to the registered object is returned as \\p pCudaResource.\n The surface's intended usage is specified using \\p flags, as follows:\n\n - ::CU_GRAPHICS_MAP_RESOURCE_FLAGS_NONE: Specifies no hints about how this\n   resource will be used. It is therefore assumed that this resource will be\n   read from and written to by CUDA. This is the default value.\n - ::CU_GRAPHICS_MAP_RESOURCE_FLAGS_READ_ONLY: Specifies that CUDA\n   will not write to this resource.\n - ::CU_GRAPHICS_MAP_RESOURCE_FLAGS_WRITE_DISCARD: Specifies that\n   CUDA will not read from this resource and will write over the\n   entire contents of the resource, so none of the data previously\n   stored in the resource will be preserved.\n\n The VdpVideoSurface is presented as an array of subresources that may be\n accessed using pointers returned by ::cuGraphicsSubResourceGetMappedArray.\n The exact number of valid \\p arrayIndex values depends on the VDPAU surface\n format. The mapping is shown in the table below. \\p mipLevel must be 0.\n\n \\htmlonly\n <table>\n <tr><th>VdpChromaType                               </th><th>arrayIndex</th><th>Size     </th><th>Format</th><th>Content            </th></tr>\n <tr><td rowspan=\"4\" valign=\"top\">VDP_CHROMA_TYPE_420</td><td>0         </td><td>w   x h/2</td><td>R8    </td><td>Top-field luma     </td></tr>\n <tr>                                                     <td>1         </td><td>w   x h/2</td><td>R8    </td><td>Bottom-field luma  </td></tr>\n <tr>                                                     <td>2         </td><td>w/2 x h/4</td><td>R8G8  </td><td>Top-field chroma   </td></tr>\n <tr>                                                     <td>3         </td><td>w/2 x h/4</td><td>R8G8  </td><td>Bottom-field chroma</td></tr>\n <tr><td rowspan=\"4\" valign=\"top\">VDP_CHROMA_TYPE_422</td><td>0         </td><td>w   x h/2</td><td>R8    </td><td>Top-field luma     </td></tr>\n <tr>                                                     <td>1         </td><td>w   x h/2</td><td>R8    </td><td>Bottom-field luma  </td></tr>\n <tr>                                                     <td>2         </td><td>w/2 x h/2</td><td>R8G8  </td><td>Top-field chroma   </td></tr>\n <tr>                                                     <td>3         </td><td>w/2 x h/2</td><td>R8G8  </td><td>Bottom-field chroma</td></tr>\n </table>\n \\endhtmlonly\n\n \\latexonly\n \\begin{tabular}{|l|l|l|l|l|}\n \\hline\n VdpChromaType          & arrayIndex & Size      & Format & Content             \\\\\n \\hline\n VDP\\_CHROMA\\_TYPE\\_420 & 0          & w x h/2   & R8     & Top-field luma      \\\\\n                        & 1          & w x h/2   & R8     & Bottom-field luma   \\\\\n                        & 2          & w/2 x h/4 & R8G8   & Top-field chroma    \\\\\n                        & 3          & w/2 x h/4 & R8G8   & Bottom-field chroma \\\\\n \\hline\n VDP\\_CHROMA\\_TYPE\\_422 & 0          & w x h/2   & R8     & Top-field luma      \\\\\n                        & 1          & w x h/2   & R8     & Bottom-field luma   \\\\\n                        & 2          & w/2 x h/2 & R8G8   & Top-field chroma    \\\\\n                        & 3          & w/2 x h/2 & R8G8   & Bottom-field chroma \\\\\n \\hline\n \\end{tabular}\n \\endlatexonly\n\n \\param pCudaResource - Pointer to the returned object handle\n \\param vdpSurface    - The VdpVideoSurface to be registered\n \\param flags         - Map flags\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_ALREADY_MAPPED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n \\notefnerr\n\n \\sa ::cuCtxCreate, ::cuVDPAUCtxCreate,\n ::cuGraphicsVDPAURegisterOutputSurface, ::cuGraphicsUnregisterResource,\n ::cuGraphicsResourceSetMapFlags, ::cuGraphicsMapResources,\n ::cuGraphicsUnmapResources, ::cuGraphicsSubResourceGetMappedArray,\n ::cuVDPAUGetDevice,\n ::cudaGraphicsVDPAURegisterVideoSurface*/\n    fn cuGraphicsVDPAURegisterVideoSurface(\n        pCudaResource: *mut cuda_types::cuda::CUgraphicsResource,\n        vdpSurface: cuda_types::cuda::VdpVideoSurface,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    /** \\brief Registers a VDPAU VdpOutputSurface object\n\n Registers the VdpOutputSurface specified by \\p vdpSurface for access by\n CUDA. A handle to the registered object is returned as \\p pCudaResource.\n The surface's intended usage is specified using \\p flags, as follows:\n\n - ::CU_GRAPHICS_MAP_RESOURCE_FLAGS_NONE: Specifies no hints about how this\n   resource will be used. It is therefore assumed that this resource will be\n   read from and written to by CUDA. This is the default value.\n - ::CU_GRAPHICS_MAP_RESOURCE_FLAGS_READ_ONLY: Specifies that CUDA\n   will not write to this resource.\n - ::CU_GRAPHICS_MAP_RESOURCE_FLAGS_WRITE_DISCARD: Specifies that\n   CUDA will not read from this resource and will write over the\n   entire contents of the resource, so none of the data previously\n   stored in the resource will be preserved.\n\n The VdpOutputSurface is presented as an array of subresources that may be\n accessed using pointers returned by ::cuGraphicsSubResourceGetMappedArray.\n The exact number of valid \\p arrayIndex values depends on the VDPAU surface\n format. The mapping is shown in the table below. \\p mipLevel must be 0.\n\n \\htmlonly\n <table>\n <tr><th>VdpRGBAFormat              </th><th>arrayIndex</th><th>Size </th><th>Format </th><th>Content       </th></tr>\n <tr><td>VDP_RGBA_FORMAT_B8G8R8A8   </td><td>0         </td><td>w x h</td><td>ARGB8  </td><td>Entire surface</td></tr>\n <tr><td>VDP_RGBA_FORMAT_R10G10B10A2</td><td>0         </td><td>w x h</td><td>A2BGR10</td><td>Entire surface</td></tr>\n </table>\n \\endhtmlonly\n\n \\latexonly\n \\begin{tabular}{|l|l|l|l|l|}\n \\hline\n VdpRGBAFormat                  & arrayIndex & Size  & Format  & Content        \\\\\n \\hline\n VDP\\_RGBA\\_FORMAT\\_B8G8R8A8    & 0          & w x h & ARGB8   & Entire surface \\\\\n VDP\\_RGBA\\_FORMAT\\_R10G10B10A2 & 0          & w x h & A2BGR10 & Entire surface \\\\\n \\hline\n \\end{tabular}\n \\endlatexonly\n\n \\param pCudaResource - Pointer to the returned object handle\n \\param vdpSurface    - The VdpOutputSurface to be registered\n \\param flags         - Map flags\n\n \\return\n ::CUDA_SUCCESS,\n ::CUDA_ERROR_INVALID_HANDLE,\n ::CUDA_ERROR_ALREADY_MAPPED,\n ::CUDA_ERROR_INVALID_CONTEXT,\n \\notefnerr\n\n \\sa ::cuCtxCreate, ::cuVDPAUCtxCreate,\n ::cuGraphicsVDPAURegisterVideoSurface, ::cuGraphicsUnregisterResource,\n ::cuGraphicsResourceSetMapFlags, ::cuGraphicsMapResources,\n ::cuGraphicsUnmapResources, ::cuGraphicsSubResourceGetMappedArray,\n ::cuVDPAUGetDevice,\n ::cudaGraphicsVDPAURegisterOutputSurface*/\n    fn cuGraphicsVDPAURegisterOutputSurface(\n        pCudaResource: *mut cuda_types::cuda::CUgraphicsResource,\n        vdpSurface: cuda_types::cuda::VdpOutputSurface,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::cuda::CUresult;\n    fn cuVDPAUCtxCreate(\n        pCtx: *mut cuda_types::cuda::CUcontext,\n        flags: ::core::ffi::c_uint,\n        device: cuda_types::cuda::CUdevice,\n        vdpDevice: cuda_types::cuda::VdpDevice,\n        vdpGetProcAddress: cuda_types::cuda::VdpGetProcAddress,\n    ) -> cuda_types::cuda::CUresult;\n}\n"
  },
  {
    "path": "cuda_macros/src/cudnn8.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\nextern \"system\" {\n    fn cudnnGetVersion() -> usize;\n    fn cudnnGetMaxDeviceVersion() -> usize;\n    fn cudnnGetCudartVersion() -> usize;\n    fn cudnnGetErrorString(\n        status: cuda_types::cudnn8::cudnnStatus_t,\n    ) -> *const ::core::ffi::c_char;\n    #[must_use]\n    fn cudnnQueryRuntimeError(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rstatus: *mut cuda_types::cudnn8::cudnnStatus_t,\n        mode: cuda_types::cudnn8::cudnnErrQueryMode_t,\n        tag: *mut cuda_types::cudnn8::cudnnRuntimeTag_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetProperty(\n        type_: cuda_types::cudnn8::libraryPropertyType,\n        value: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreate(\n        handle: *mut cuda_types::cudnn8::cudnnHandle_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroy(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetStream(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        streamId: cuda_types::cudnn8::cudaStream_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetStream(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        streamId: *mut cuda_types::cudnn8::cudaStream_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateTensorDescriptor(\n        tensorDesc: *mut cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetTensor4dDescriptor(\n        tensorDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        format: cuda_types::cudnn8::cudnnTensorFormat_t,\n        dataType: cuda_types::cudnn8::cudnnDataType_t,\n        n: ::core::ffi::c_int,\n        c: ::core::ffi::c_int,\n        h: ::core::ffi::c_int,\n        w: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetTensor4dDescriptorEx(\n        tensorDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dataType: cuda_types::cudnn8::cudnnDataType_t,\n        n: ::core::ffi::c_int,\n        c: ::core::ffi::c_int,\n        h: ::core::ffi::c_int,\n        w: ::core::ffi::c_int,\n        nStride: ::core::ffi::c_int,\n        cStride: ::core::ffi::c_int,\n        hStride: ::core::ffi::c_int,\n        wStride: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetTensor4dDescriptor(\n        tensorDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dataType: *mut cuda_types::cudnn8::cudnnDataType_t,\n        n: *mut ::core::ffi::c_int,\n        c: *mut ::core::ffi::c_int,\n        h: *mut ::core::ffi::c_int,\n        w: *mut ::core::ffi::c_int,\n        nStride: *mut ::core::ffi::c_int,\n        cStride: *mut ::core::ffi::c_int,\n        hStride: *mut ::core::ffi::c_int,\n        wStride: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetTensorNdDescriptor(\n        tensorDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dataType: cuda_types::cudnn8::cudnnDataType_t,\n        nbDims: ::core::ffi::c_int,\n        dimA: *const ::core::ffi::c_int,\n        strideA: *const ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetTensorNdDescriptorEx(\n        tensorDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        format: cuda_types::cudnn8::cudnnTensorFormat_t,\n        dataType: cuda_types::cudnn8::cudnnDataType_t,\n        nbDims: ::core::ffi::c_int,\n        dimA: *const ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetTensorNdDescriptor(\n        tensorDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        nbDimsRequested: ::core::ffi::c_int,\n        dataType: *mut cuda_types::cudnn8::cudnnDataType_t,\n        nbDims: *mut ::core::ffi::c_int,\n        dimA: *mut ::core::ffi::c_int,\n        strideA: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetTensorSizeInBytes(\n        tensorDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        size: *mut usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyTensorDescriptor(\n        tensorDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    /// Create a destination descriptor for cudnnTransformTensor\n    fn cudnnInitTransformDest(\n        transformDesc: cuda_types::cudnn8::cudnnTensorTransformDescriptor_t,\n        srcDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        destDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        destSizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    /// Create an empty tensor transform descriptor\n    fn cudnnCreateTensorTransformDescriptor(\n        transformDesc: *mut cuda_types::cudnn8::cudnnTensorTransformDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    /// Initialize a previously created tensor transform descriptor.\n    fn cudnnSetTensorTransformDescriptor(\n        transformDesc: cuda_types::cudnn8::cudnnTensorTransformDescriptor_t,\n        nbDims: u32,\n        destFormat: cuda_types::cudnn8::cudnnTensorFormat_t,\n        padBeforeA: *const i32,\n        padAfterA: *const i32,\n        foldA: *const u32,\n        direction: cuda_types::cudnn8::cudnnFoldingDirection_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    /** Retrieves the values stored in a previously initialized tensor transform\n descriptor.*/\n    fn cudnnGetTensorTransformDescriptor(\n        transformDesc: cuda_types::cudnn8::cudnnTensorTransformDescriptor_t,\n        nbDimsRequested: u32,\n        destFormat: *mut cuda_types::cudnn8::cudnnTensorFormat_t,\n        padBeforeA: *mut i32,\n        padAfterA: *mut i32,\n        foldA: *mut u32,\n        direction: *mut cuda_types::cudnn8::cudnnFoldingDirection_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    /// Destroys a previously created tensor transform descriptor.\n    fn cudnnDestroyTensorTransformDescriptor(\n        transformDesc: cuda_types::cudnn8::cudnnTensorTransformDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnTransformTensor(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnTransformTensorEx(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        transDesc: cuda_types::cudnn8::cudnnTensorTransformDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        srcDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        srcData: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        destDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        destData: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnAddTensor(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        alpha: *const ::core::ffi::c_void,\n        aDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        A: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        cDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        C: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateOpTensorDescriptor(\n        opTensorDesc: *mut cuda_types::cudnn8::cudnnOpTensorDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetOpTensorDescriptor(\n        opTensorDesc: cuda_types::cudnn8::cudnnOpTensorDescriptor_t,\n        opTensorOp: cuda_types::cudnn8::cudnnOpTensorOp_t,\n        opTensorCompType: cuda_types::cudnn8::cudnnDataType_t,\n        opTensorNanOpt: cuda_types::cudnn8::cudnnNanPropagation_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetOpTensorDescriptor(\n        opTensorDesc: cuda_types::cudnn8::cudnnOpTensorDescriptor_t,\n        opTensorOp: *mut cuda_types::cudnn8::cudnnOpTensorOp_t,\n        opTensorCompType: *mut cuda_types::cudnn8::cudnnDataType_t,\n        opTensorNanOpt: *mut cuda_types::cudnn8::cudnnNanPropagation_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyOpTensorDescriptor(\n        opTensorDesc: cuda_types::cudnn8::cudnnOpTensorDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnOpTensor(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        opTensorDesc: cuda_types::cudnn8::cudnnOpTensorDescriptor_t,\n        alpha1: *const ::core::ffi::c_void,\n        aDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        A: *const ::core::ffi::c_void,\n        alpha2: *const ::core::ffi::c_void,\n        bDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        B: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        cDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        C: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateReduceTensorDescriptor(\n        reduceTensorDesc: *mut cuda_types::cudnn8::cudnnReduceTensorDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetReduceTensorDescriptor(\n        reduceTensorDesc: cuda_types::cudnn8::cudnnReduceTensorDescriptor_t,\n        reduceTensorOp: cuda_types::cudnn8::cudnnReduceTensorOp_t,\n        reduceTensorCompType: cuda_types::cudnn8::cudnnDataType_t,\n        reduceTensorNanOpt: cuda_types::cudnn8::cudnnNanPropagation_t,\n        reduceTensorIndices: cuda_types::cudnn8::cudnnReduceTensorIndices_t,\n        reduceTensorIndicesType: cuda_types::cudnn8::cudnnIndicesType_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetReduceTensorDescriptor(\n        reduceTensorDesc: cuda_types::cudnn8::cudnnReduceTensorDescriptor_t,\n        reduceTensorOp: *mut cuda_types::cudnn8::cudnnReduceTensorOp_t,\n        reduceTensorCompType: *mut cuda_types::cudnn8::cudnnDataType_t,\n        reduceTensorNanOpt: *mut cuda_types::cudnn8::cudnnNanPropagation_t,\n        reduceTensorIndices: *mut cuda_types::cudnn8::cudnnReduceTensorIndices_t,\n        reduceTensorIndicesType: *mut cuda_types::cudnn8::cudnnIndicesType_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyReduceTensorDescriptor(\n        reduceTensorDesc: cuda_types::cudnn8::cudnnReduceTensorDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetReductionIndicesSize(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        reduceTensorDesc: cuda_types::cudnn8::cudnnReduceTensorDescriptor_t,\n        aDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        cDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        sizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetReductionWorkspaceSize(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        reduceTensorDesc: cuda_types::cudnn8::cudnnReduceTensorDescriptor_t,\n        aDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        cDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        sizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnReduceTensor(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        reduceTensorDesc: cuda_types::cudnn8::cudnnReduceTensorDescriptor_t,\n        indices: *mut ::core::ffi::c_void,\n        indicesSizeInBytes: usize,\n        workspace: *mut ::core::ffi::c_void,\n        workspaceSizeInBytes: usize,\n        alpha: *const ::core::ffi::c_void,\n        aDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        A: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        cDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        C: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetTensor(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        valuePtr: *const ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnScaleTensor(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        alpha: *const ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateFilterDescriptor(\n        filterDesc: *mut cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetFilter4dDescriptor(\n        filterDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        dataType: cuda_types::cudnn8::cudnnDataType_t,\n        format: cuda_types::cudnn8::cudnnTensorFormat_t,\n        k: ::core::ffi::c_int,\n        c: ::core::ffi::c_int,\n        h: ::core::ffi::c_int,\n        w: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetFilter4dDescriptor(\n        filterDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        dataType: *mut cuda_types::cudnn8::cudnnDataType_t,\n        format: *mut cuda_types::cudnn8::cudnnTensorFormat_t,\n        k: *mut ::core::ffi::c_int,\n        c: *mut ::core::ffi::c_int,\n        h: *mut ::core::ffi::c_int,\n        w: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetFilterNdDescriptor(\n        filterDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        dataType: cuda_types::cudnn8::cudnnDataType_t,\n        format: cuda_types::cudnn8::cudnnTensorFormat_t,\n        nbDims: ::core::ffi::c_int,\n        filterDimA: *const ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetFilterNdDescriptor(\n        filterDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        nbDimsRequested: ::core::ffi::c_int,\n        dataType: *mut cuda_types::cudnn8::cudnnDataType_t,\n        format: *mut cuda_types::cudnn8::cudnnTensorFormat_t,\n        nbDims: *mut ::core::ffi::c_int,\n        filterDimA: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetFilterSizeInBytes(\n        filterDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        size: *mut usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnTransformFilter(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        transDesc: cuda_types::cudnn8::cudnnTensorTransformDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        srcDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        srcData: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        destDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        destData: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyFilterDescriptor(\n        filterDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSoftmaxForward(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        algo: cuda_types::cudnn8::cudnnSoftmaxAlgorithm_t,\n        mode: cuda_types::cudnn8::cudnnSoftmaxMode_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreatePoolingDescriptor(\n        poolingDesc: *mut cuda_types::cudnn8::cudnnPoolingDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetPooling2dDescriptor(\n        poolingDesc: cuda_types::cudnn8::cudnnPoolingDescriptor_t,\n        mode: cuda_types::cudnn8::cudnnPoolingMode_t,\n        maxpoolingNanOpt: cuda_types::cudnn8::cudnnNanPropagation_t,\n        windowHeight: ::core::ffi::c_int,\n        windowWidth: ::core::ffi::c_int,\n        verticalPadding: ::core::ffi::c_int,\n        horizontalPadding: ::core::ffi::c_int,\n        verticalStride: ::core::ffi::c_int,\n        horizontalStride: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetPooling2dDescriptor(\n        poolingDesc: cuda_types::cudnn8::cudnnPoolingDescriptor_t,\n        mode: *mut cuda_types::cudnn8::cudnnPoolingMode_t,\n        maxpoolingNanOpt: *mut cuda_types::cudnn8::cudnnNanPropagation_t,\n        windowHeight: *mut ::core::ffi::c_int,\n        windowWidth: *mut ::core::ffi::c_int,\n        verticalPadding: *mut ::core::ffi::c_int,\n        horizontalPadding: *mut ::core::ffi::c_int,\n        verticalStride: *mut ::core::ffi::c_int,\n        horizontalStride: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetPoolingNdDescriptor(\n        poolingDesc: cuda_types::cudnn8::cudnnPoolingDescriptor_t,\n        mode: cuda_types::cudnn8::cudnnPoolingMode_t,\n        maxpoolingNanOpt: cuda_types::cudnn8::cudnnNanPropagation_t,\n        nbDims: ::core::ffi::c_int,\n        windowDimA: *const ::core::ffi::c_int,\n        paddingA: *const ::core::ffi::c_int,\n        strideA: *const ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetPoolingNdDescriptor(\n        poolingDesc: cuda_types::cudnn8::cudnnPoolingDescriptor_t,\n        nbDimsRequested: ::core::ffi::c_int,\n        mode: *mut cuda_types::cudnn8::cudnnPoolingMode_t,\n        maxpoolingNanOpt: *mut cuda_types::cudnn8::cudnnNanPropagation_t,\n        nbDims: *mut ::core::ffi::c_int,\n        windowDimA: *mut ::core::ffi::c_int,\n        paddingA: *mut ::core::ffi::c_int,\n        strideA: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetPoolingNdForwardOutputDim(\n        poolingDesc: cuda_types::cudnn8::cudnnPoolingDescriptor_t,\n        inputTensorDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        nbDims: ::core::ffi::c_int,\n        outputTensorDimA: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetPooling2dForwardOutputDim(\n        poolingDesc: cuda_types::cudnn8::cudnnPoolingDescriptor_t,\n        inputTensorDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        n: *mut ::core::ffi::c_int,\n        c: *mut ::core::ffi::c_int,\n        h: *mut ::core::ffi::c_int,\n        w: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyPoolingDescriptor(\n        poolingDesc: cuda_types::cudnn8::cudnnPoolingDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnPoolingForward(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        poolingDesc: cuda_types::cudnn8::cudnnPoolingDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateActivationDescriptor(\n        activationDesc: *mut cuda_types::cudnn8::cudnnActivationDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetActivationDescriptor(\n        activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n        mode: cuda_types::cudnn8::cudnnActivationMode_t,\n        reluNanOpt: cuda_types::cudnn8::cudnnNanPropagation_t,\n        coef: f64,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetActivationDescriptor(\n        activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n        mode: *mut cuda_types::cudnn8::cudnnActivationMode_t,\n        reluNanOpt: *mut cuda_types::cudnn8::cudnnNanPropagation_t,\n        coef: *mut f64,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetActivationDescriptorSwishBeta(\n        activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n        swish_beta: f64,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetActivationDescriptorSwishBeta(\n        activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n        swish_beta: *mut f64,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyActivationDescriptor(\n        activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnActivationForward(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateLRNDescriptor(\n        normDesc: *mut cuda_types::cudnn8::cudnnLRNDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetLRNDescriptor(\n        normDesc: cuda_types::cudnn8::cudnnLRNDescriptor_t,\n        lrnN: ::core::ffi::c_uint,\n        lrnAlpha: f64,\n        lrnBeta: f64,\n        lrnK: f64,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetLRNDescriptor(\n        normDesc: cuda_types::cudnn8::cudnnLRNDescriptor_t,\n        lrnN: *mut ::core::ffi::c_uint,\n        lrnAlpha: *mut f64,\n        lrnBeta: *mut f64,\n        lrnK: *mut f64,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyLRNDescriptor(\n        lrnDesc: cuda_types::cudnn8::cudnnLRNDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnLRNCrossChannelForward(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        normDesc: cuda_types::cudnn8::cudnnLRNDescriptor_t,\n        lrnMode: cuda_types::cudnn8::cudnnLRNMode_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDivisiveNormalizationForward(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        normDesc: cuda_types::cudnn8::cudnnLRNDescriptor_t,\n        mode: cuda_types::cudnn8::cudnnDivNormMode_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        means: *const ::core::ffi::c_void,\n        temp: *mut ::core::ffi::c_void,\n        temp2: *mut ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDeriveBNTensorDescriptor(\n        derivedBnDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        mode: cuda_types::cudnn8::cudnnBatchNormMode_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnBatchNormalizationForwardInference(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        mode: cuda_types::cudnn8::cudnnBatchNormMode_t,\n        alpha: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        bnScaleBiasMeanVarDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        bnScale: *const ::core::ffi::c_void,\n        bnBias: *const ::core::ffi::c_void,\n        estimatedMean: *const ::core::ffi::c_void,\n        estimatedVariance: *const ::core::ffi::c_void,\n        epsilon: f64,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDeriveNormTensorDescriptor(\n        derivedNormScaleBiasDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        derivedNormMeanVarDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        mode: cuda_types::cudnn8::cudnnNormMode_t,\n        groupCnt: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnNormalizationForwardInference(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        mode: cuda_types::cudnn8::cudnnNormMode_t,\n        normOps: cuda_types::cudnn8::cudnnNormOps_t,\n        algo: cuda_types::cudnn8::cudnnNormAlgo_t,\n        alpha: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        normScaleBiasDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        normScale: *const ::core::ffi::c_void,\n        normBias: *const ::core::ffi::c_void,\n        normMeanVarDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        estimatedMean: *const ::core::ffi::c_void,\n        estimatedVariance: *const ::core::ffi::c_void,\n        zDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        z: *const ::core::ffi::c_void,\n        activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        epsilon: f64,\n        groupCnt: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateSpatialTransformerDescriptor(\n        stDesc: *mut cuda_types::cudnn8::cudnnSpatialTransformerDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetSpatialTransformerNdDescriptor(\n        stDesc: cuda_types::cudnn8::cudnnSpatialTransformerDescriptor_t,\n        samplerType: cuda_types::cudnn8::cudnnSamplerType_t,\n        dataType: cuda_types::cudnn8::cudnnDataType_t,\n        nbDims: ::core::ffi::c_int,\n        dimA: *const ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroySpatialTransformerDescriptor(\n        stDesc: cuda_types::cudnn8::cudnnSpatialTransformerDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSpatialTfGridGeneratorForward(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        stDesc: cuda_types::cudnn8::cudnnSpatialTransformerDescriptor_t,\n        theta: *const ::core::ffi::c_void,\n        grid: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSpatialTfSamplerForward(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        stDesc: cuda_types::cudnn8::cudnnSpatialTransformerDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        grid: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateDropoutDescriptor(\n        dropoutDesc: *mut cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyDropoutDescriptor(\n        dropoutDesc: cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDropoutGetStatesSize(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        sizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDropoutGetReserveSpaceSize(\n        xdesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        sizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetDropoutDescriptor(\n        dropoutDesc: cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        dropout: f32,\n        states: *mut ::core::ffi::c_void,\n        stateSizeInBytes: usize,\n        seed: ::core::ffi::c_ulonglong,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnRestoreDropoutDescriptor(\n        dropoutDesc: cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        dropout: f32,\n        states: *mut ::core::ffi::c_void,\n        stateSizeInBytes: usize,\n        seed: ::core::ffi::c_ulonglong,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetDropoutDescriptor(\n        dropoutDesc: cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        dropout: *mut f32,\n        states: *mut *mut ::core::ffi::c_void,\n        seed: *mut ::core::ffi::c_ulonglong,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDropoutForward(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        dropoutDesc: cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n        xdesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        ydesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        reserveSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateAlgorithmDescriptor(\n        algoDesc: *mut cuda_types::cudnn8::cudnnAlgorithmDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetAlgorithmDescriptor(\n        algoDesc: cuda_types::cudnn8::cudnnAlgorithmDescriptor_t,\n        algorithm: cuda_types::cudnn8::cudnnAlgorithm_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetAlgorithmDescriptor(\n        algoDesc: cuda_types::cudnn8::cudnnAlgorithmDescriptor_t,\n        algorithm: *mut cuda_types::cudnn8::cudnnAlgorithm_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCopyAlgorithmDescriptor(\n        src: cuda_types::cudnn8::cudnnAlgorithmDescriptor_t,\n        dest: cuda_types::cudnn8::cudnnAlgorithmDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyAlgorithmDescriptor(\n        algoDesc: cuda_types::cudnn8::cudnnAlgorithmDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateAlgorithmPerformance(\n        algoPerf: *mut cuda_types::cudnn8::cudnnAlgorithmPerformance_t,\n        numberToCreate: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetAlgorithmPerformance(\n        algoPerf: cuda_types::cudnn8::cudnnAlgorithmPerformance_t,\n        algoDesc: cuda_types::cudnn8::cudnnAlgorithmDescriptor_t,\n        status: cuda_types::cudnn8::cudnnStatus_t,\n        time: f32,\n        memory: usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetAlgorithmPerformance(\n        algoPerf: cuda_types::cudnn8::cudnnAlgorithmPerformance_t,\n        algoDesc: *mut cuda_types::cudnn8::cudnnAlgorithmDescriptor_t,\n        status: *mut cuda_types::cudnn8::cudnnStatus_t,\n        time: *mut f32,\n        memory: *mut usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyAlgorithmPerformance(\n        algoPerf: *mut cuda_types::cudnn8::cudnnAlgorithmPerformance_t,\n        numberToDestroy: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetAlgorithmSpaceSize(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        algoDesc: cuda_types::cudnn8::cudnnAlgorithmDescriptor_t,\n        algoSpaceSizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSaveAlgorithm(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        algoDesc: cuda_types::cudnn8::cudnnAlgorithmDescriptor_t,\n        algoSpace: *mut ::core::ffi::c_void,\n        algoSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnRestoreAlgorithm(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        algoSpace: *mut ::core::ffi::c_void,\n        algoSpaceSizeInBytes: usize,\n        algoDesc: cuda_types::cudnn8::cudnnAlgorithmDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetCallback(\n        mask: ::core::ffi::c_uint,\n        udata: *mut ::core::ffi::c_void,\n        fptr: cuda_types::cudnn8::cudnnCallback_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetCallback(\n        mask: *mut ::core::ffi::c_uint,\n        udata: *mut *mut ::core::ffi::c_void,\n        fptr: *mut cuda_types::cudnn8::cudnnCallback_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnOpsInferVersionCheck() -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSoftmaxBackward(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        algo: cuda_types::cudnn8::cudnnSoftmaxAlgorithm_t,\n        mode: cuda_types::cudnn8::cudnnSoftmaxMode_t,\n        alpha: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        dxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnPoolingBackward(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        poolingDesc: cuda_types::cudnn8::cudnnPoolingDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        dxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnActivationBackward(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        dxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnLRNCrossChannelBackward(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        normDesc: cuda_types::cudnn8::cudnnLRNDescriptor_t,\n        lrnMode: cuda_types::cudnn8::cudnnLRNMode_t,\n        alpha: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        dxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDivisiveNormalizationBackward(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        normDesc: cuda_types::cudnn8::cudnnLRNDescriptor_t,\n        mode: cuda_types::cudnn8::cudnnDivNormMode_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        means: *const ::core::ffi::c_void,\n        dy: *const ::core::ffi::c_void,\n        temp: *mut ::core::ffi::c_void,\n        temp2: *mut ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        dXdMeansDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n        dMeans: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetBatchNormalizationForwardTrainingExWorkspaceSize(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        mode: cuda_types::cudnn8::cudnnBatchNormMode_t,\n        bnOps: cuda_types::cudnn8::cudnnBatchNormOps_t,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        zDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        bnScaleBiasMeanVarDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n        sizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetBatchNormalizationBackwardExWorkspaceSize(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        mode: cuda_types::cudnn8::cudnnBatchNormMode_t,\n        bnOps: cuda_types::cudnn8::cudnnBatchNormOps_t,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dzDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dBnScaleBiasDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n        sizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetBatchNormalizationTrainingExReserveSpaceSize(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        mode: cuda_types::cudnn8::cudnnBatchNormMode_t,\n        bnOps: cuda_types::cudnn8::cudnnBatchNormOps_t,\n        activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        sizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnBatchNormalizationForwardTraining(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        mode: cuda_types::cudnn8::cudnnBatchNormMode_t,\n        alpha: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        bnScaleBiasMeanVarDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        bnScale: *const ::core::ffi::c_void,\n        bnBias: *const ::core::ffi::c_void,\n        exponentialAverageFactor: f64,\n        resultRunningMean: *mut ::core::ffi::c_void,\n        resultRunningVariance: *mut ::core::ffi::c_void,\n        epsilon: f64,\n        resultSaveMean: *mut ::core::ffi::c_void,\n        resultSaveInvVariance: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnBatchNormalizationForwardTrainingEx(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        mode: cuda_types::cudnn8::cudnnBatchNormMode_t,\n        bnOps: cuda_types::cudnn8::cudnnBatchNormOps_t,\n        alpha: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        xData: *const ::core::ffi::c_void,\n        zDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        zData: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        yData: *mut ::core::ffi::c_void,\n        bnScaleBiasMeanVarDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        bnScale: *const ::core::ffi::c_void,\n        bnBias: *const ::core::ffi::c_void,\n        exponentialAverageFactor: f64,\n        resultRunningMean: *mut ::core::ffi::c_void,\n        resultRunningVariance: *mut ::core::ffi::c_void,\n        epsilon: f64,\n        resultSaveMean: *mut ::core::ffi::c_void,\n        resultSaveInvVariance: *mut ::core::ffi::c_void,\n        activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n        workspace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnBatchNormalizationBackward(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        mode: cuda_types::cudnn8::cudnnBatchNormMode_t,\n        alphaDataDiff: *const ::core::ffi::c_void,\n        betaDataDiff: *const ::core::ffi::c_void,\n        alphaParamDiff: *const ::core::ffi::c_void,\n        betaParamDiff: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        dxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n        dBnScaleBiasDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        bnScale: *const ::core::ffi::c_void,\n        dBnScaleResult: *mut ::core::ffi::c_void,\n        dBnBiasResult: *mut ::core::ffi::c_void,\n        epsilon: f64,\n        savedMean: *const ::core::ffi::c_void,\n        savedInvVariance: *const ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnBatchNormalizationBackwardEx(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        mode: cuda_types::cudnn8::cudnnBatchNormMode_t,\n        bnOps: cuda_types::cudnn8::cudnnBatchNormOps_t,\n        alphaDataDiff: *const ::core::ffi::c_void,\n        betaDataDiff: *const ::core::ffi::c_void,\n        alphaParamDiff: *const ::core::ffi::c_void,\n        betaParamDiff: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        xData: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        yData: *const ::core::ffi::c_void,\n        dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dyData: *const ::core::ffi::c_void,\n        dzDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dzData: *mut ::core::ffi::c_void,\n        dxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dxData: *mut ::core::ffi::c_void,\n        dBnScaleBiasDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        bnScaleData: *const ::core::ffi::c_void,\n        bnBiasData: *const ::core::ffi::c_void,\n        dBnScaleData: *mut ::core::ffi::c_void,\n        dBnBiasData: *mut ::core::ffi::c_void,\n        epsilon: f64,\n        savedMean: *const ::core::ffi::c_void,\n        savedInvVariance: *const ::core::ffi::c_void,\n        activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetNormalizationForwardTrainingWorkspaceSize(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        mode: cuda_types::cudnn8::cudnnNormMode_t,\n        normOps: cuda_types::cudnn8::cudnnNormOps_t,\n        algo: cuda_types::cudnn8::cudnnNormAlgo_t,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        zDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        normScaleBiasDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n        normMeanVarDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        sizeInBytes: *mut usize,\n        groupCnt: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetNormalizationBackwardWorkspaceSize(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        mode: cuda_types::cudnn8::cudnnNormMode_t,\n        normOps: cuda_types::cudnn8::cudnnNormOps_t,\n        algo: cuda_types::cudnn8::cudnnNormAlgo_t,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dzDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dNormScaleBiasDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n        normMeanVarDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        sizeInBytes: *mut usize,\n        groupCnt: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetNormalizationTrainingReserveSpaceSize(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        mode: cuda_types::cudnn8::cudnnNormMode_t,\n        normOps: cuda_types::cudnn8::cudnnNormOps_t,\n        algo: cuda_types::cudnn8::cudnnNormAlgo_t,\n        activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        sizeInBytes: *mut usize,\n        groupCnt: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnNormalizationForwardTraining(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        mode: cuda_types::cudnn8::cudnnNormMode_t,\n        normOps: cuda_types::cudnn8::cudnnNormOps_t,\n        algo: cuda_types::cudnn8::cudnnNormAlgo_t,\n        alpha: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        xData: *const ::core::ffi::c_void,\n        normScaleBiasDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        normScale: *const ::core::ffi::c_void,\n        normBias: *const ::core::ffi::c_void,\n        exponentialAverageFactor: f64,\n        normMeanVarDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        resultRunningMean: *mut ::core::ffi::c_void,\n        resultRunningVariance: *mut ::core::ffi::c_void,\n        epsilon: f64,\n        resultSaveMean: *mut ::core::ffi::c_void,\n        resultSaveInvVariance: *mut ::core::ffi::c_void,\n        activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n        zDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        zData: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        yData: *mut ::core::ffi::c_void,\n        workspace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n        groupCnt: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnNormalizationBackward(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        mode: cuda_types::cudnn8::cudnnNormMode_t,\n        normOps: cuda_types::cudnn8::cudnnNormOps_t,\n        algo: cuda_types::cudnn8::cudnnNormAlgo_t,\n        alphaDataDiff: *const ::core::ffi::c_void,\n        betaDataDiff: *const ::core::ffi::c_void,\n        alphaParamDiff: *const ::core::ffi::c_void,\n        betaParamDiff: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        xData: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        yData: *const ::core::ffi::c_void,\n        dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dyData: *const ::core::ffi::c_void,\n        dzDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dzData: *mut ::core::ffi::c_void,\n        dxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dxData: *mut ::core::ffi::c_void,\n        dNormScaleBiasDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        normScaleData: *const ::core::ffi::c_void,\n        normBiasData: *const ::core::ffi::c_void,\n        dNormScaleData: *mut ::core::ffi::c_void,\n        dNormBiasData: *mut ::core::ffi::c_void,\n        epsilon: f64,\n        normMeanVarDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        savedMean: *const ::core::ffi::c_void,\n        savedInvVariance: *const ::core::ffi::c_void,\n        activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n        groupCnt: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSpatialTfGridGeneratorBackward(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        stDesc: cuda_types::cudnn8::cudnnSpatialTransformerDescriptor_t,\n        dgrid: *const ::core::ffi::c_void,\n        dtheta: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSpatialTfSamplerBackward(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        stDesc: cuda_types::cudnn8::cudnnSpatialTransformerDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        dxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n        alphaDgrid: *const ::core::ffi::c_void,\n        dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        grid: *const ::core::ffi::c_void,\n        betaDgrid: *const ::core::ffi::c_void,\n        dgrid: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDropoutBackward(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        dropoutDesc: cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n        dydesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        dxdesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n        reserveSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnOpsTrainVersionCheck() -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateRNNDescriptor(\n        rnnDesc: *mut cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyRNNDescriptor(\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetRNNDescriptor_v8(\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        algo: cuda_types::cudnn8::cudnnRNNAlgo_t,\n        cellMode: cuda_types::cudnn8::cudnnRNNMode_t,\n        biasMode: cuda_types::cudnn8::cudnnRNNBiasMode_t,\n        dirMode: cuda_types::cudnn8::cudnnDirectionMode_t,\n        inputMode: cuda_types::cudnn8::cudnnRNNInputMode_t,\n        dataType: cuda_types::cudnn8::cudnnDataType_t,\n        mathPrec: cuda_types::cudnn8::cudnnDataType_t,\n        mathType: cuda_types::cudnn8::cudnnMathType_t,\n        inputSize: i32,\n        hiddenSize: i32,\n        projSize: i32,\n        numLayers: i32,\n        dropoutDesc: cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n        auxFlags: u32,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetRNNDescriptor_v8(\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        algo: *mut cuda_types::cudnn8::cudnnRNNAlgo_t,\n        cellMode: *mut cuda_types::cudnn8::cudnnRNNMode_t,\n        biasMode: *mut cuda_types::cudnn8::cudnnRNNBiasMode_t,\n        dirMode: *mut cuda_types::cudnn8::cudnnDirectionMode_t,\n        inputMode: *mut cuda_types::cudnn8::cudnnRNNInputMode_t,\n        dataType: *mut cuda_types::cudnn8::cudnnDataType_t,\n        mathPrec: *mut cuda_types::cudnn8::cudnnDataType_t,\n        mathType: *mut cuda_types::cudnn8::cudnnMathType_t,\n        inputSize: *mut i32,\n        hiddenSize: *mut i32,\n        projSize: *mut i32,\n        numLayers: *mut i32,\n        dropoutDesc: *mut cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n        auxFlags: *mut u32,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetRNNDescriptor_v6(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        hiddenSize: ::core::ffi::c_int,\n        numLayers: ::core::ffi::c_int,\n        dropoutDesc: cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n        inputMode: cuda_types::cudnn8::cudnnRNNInputMode_t,\n        direction: cuda_types::cudnn8::cudnnDirectionMode_t,\n        cellMode: cuda_types::cudnn8::cudnnRNNMode_t,\n        algo: cuda_types::cudnn8::cudnnRNNAlgo_t,\n        mathPrec: cuda_types::cudnn8::cudnnDataType_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetRNNDescriptor_v6(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        hiddenSize: *mut ::core::ffi::c_int,\n        numLayers: *mut ::core::ffi::c_int,\n        dropoutDesc: *mut cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n        inputMode: *mut cuda_types::cudnn8::cudnnRNNInputMode_t,\n        direction: *mut cuda_types::cudnn8::cudnnDirectionMode_t,\n        cellMode: *mut cuda_types::cudnn8::cudnnRNNMode_t,\n        algo: *mut cuda_types::cudnn8::cudnnRNNAlgo_t,\n        mathPrec: *mut cuda_types::cudnn8::cudnnDataType_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetRNNMatrixMathType(\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        mType: cuda_types::cudnn8::cudnnMathType_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetRNNMatrixMathType(\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        mType: *mut cuda_types::cudnn8::cudnnMathType_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetRNNBiasMode(\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        biasMode: cuda_types::cudnn8::cudnnRNNBiasMode_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetRNNBiasMode(\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        biasMode: *mut cuda_types::cudnn8::cudnnRNNBiasMode_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnRNNSetClip_v8(\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        clipMode: cuda_types::cudnn8::cudnnRNNClipMode_t,\n        clipNanOpt: cuda_types::cudnn8::cudnnNanPropagation_t,\n        lclip: f64,\n        rclip: f64,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnRNNGetClip_v8(\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        clipMode: *mut cuda_types::cudnn8::cudnnRNNClipMode_t,\n        clipNanOpt: *mut cuda_types::cudnn8::cudnnNanPropagation_t,\n        lclip: *mut f64,\n        rclip: *mut f64,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnRNNSetClip(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        clipMode: cuda_types::cudnn8::cudnnRNNClipMode_t,\n        clipNanOpt: cuda_types::cudnn8::cudnnNanPropagation_t,\n        lclip: f64,\n        rclip: f64,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnRNNGetClip(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        clipMode: *mut cuda_types::cudnn8::cudnnRNNClipMode_t,\n        clipNanOpt: *mut cuda_types::cudnn8::cudnnNanPropagation_t,\n        lclip: *mut f64,\n        rclip: *mut f64,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetRNNProjectionLayers(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        recProjSize: ::core::ffi::c_int,\n        outProjSize: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetRNNProjectionLayers(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        recProjSize: *mut ::core::ffi::c_int,\n        outProjSize: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreatePersistentRNNPlan(\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        minibatch: ::core::ffi::c_int,\n        dataType: cuda_types::cudnn8::cudnnDataType_t,\n        plan: *mut cuda_types::cudnn8::cudnnPersistentRNNPlan_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyPersistentRNNPlan(\n        plan: cuda_types::cudnn8::cudnnPersistentRNNPlan_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetPersistentRNNPlan(\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        plan: cuda_types::cudnn8::cudnnPersistentRNNPlan_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnBuildRNNDynamic(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        miniBatch: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetRNNWorkspaceSize(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        seqLength: ::core::ffi::c_int,\n        xDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        sizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetRNNTrainingReserveSize(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        seqLength: ::core::ffi::c_int,\n        xDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        sizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetRNNTempSpaceSizes(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        fwdMode: cuda_types::cudnn8::cudnnForwardMode_t,\n        xDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n        workSpaceSize: *mut usize,\n        reserveSpaceSize: *mut usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetRNNParamsSize(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        sizeInBytes: *mut usize,\n        dataType: cuda_types::cudnn8::cudnnDataType_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetRNNWeightSpaceSize(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        weightSpaceSize: *mut usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetRNNLinLayerMatrixParams(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        pseudoLayer: ::core::ffi::c_int,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        linLayerID: ::core::ffi::c_int,\n        linLayerMatDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        linLayerMat: *mut *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetRNNLinLayerBiasParams(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        pseudoLayer: ::core::ffi::c_int,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        linLayerID: ::core::ffi::c_int,\n        linLayerBiasDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        linLayerBias: *mut *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetRNNWeightParams(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        pseudoLayer: i32,\n        weightSpaceSize: usize,\n        weightSpace: *const ::core::ffi::c_void,\n        linLayerID: i32,\n        mDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        mAddr: *mut *mut ::core::ffi::c_void,\n        bDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        bAddr: *mut *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnRNNForwardInference(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        seqLength: ::core::ffi::c_int,\n        xDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        hxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        hx: *const ::core::ffi::c_void,\n        cxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        cx: *const ::core::ffi::c_void,\n        wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        yDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        hyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        hy: *mut ::core::ffi::c_void,\n        cyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        cy: *mut ::core::ffi::c_void,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetRNNPaddingMode(\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        paddingMode: ::core::ffi::c_uint,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetRNNPaddingMode(\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        paddingMode: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateRNNDataDescriptor(\n        rnnDataDesc: *mut cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyRNNDataDescriptor(\n        rnnDataDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetRNNDataDescriptor(\n        rnnDataDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n        dataType: cuda_types::cudnn8::cudnnDataType_t,\n        layout: cuda_types::cudnn8::cudnnRNNDataLayout_t,\n        maxSeqLength: ::core::ffi::c_int,\n        batchSize: ::core::ffi::c_int,\n        vectorSize: ::core::ffi::c_int,\n        seqLengthArray: *const ::core::ffi::c_int,\n        paddingFill: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetRNNDataDescriptor(\n        rnnDataDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n        dataType: *mut cuda_types::cudnn8::cudnnDataType_t,\n        layout: *mut cuda_types::cudnn8::cudnnRNNDataLayout_t,\n        maxSeqLength: *mut ::core::ffi::c_int,\n        batchSize: *mut ::core::ffi::c_int,\n        vectorSize: *mut ::core::ffi::c_int,\n        arrayLengthRequested: ::core::ffi::c_int,\n        seqLengthArray: *mut ::core::ffi::c_int,\n        paddingFill: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnRNNForwardInferenceEx(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        xDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        hxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        hx: *const ::core::ffi::c_void,\n        cxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        cx: *const ::core::ffi::c_void,\n        wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        hyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        hy: *mut ::core::ffi::c_void,\n        cyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        cy: *mut ::core::ffi::c_void,\n        kDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n        keys: *const ::core::ffi::c_void,\n        cDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n        cAttn: *mut ::core::ffi::c_void,\n        iDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n        iAttn: *mut ::core::ffi::c_void,\n        qDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n        queries: *mut ::core::ffi::c_void,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnRNNForward(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        fwdMode: cuda_types::cudnn8::cudnnForwardMode_t,\n        devSeqLengths: *const i32,\n        xDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        hDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        hx: *const ::core::ffi::c_void,\n        hy: *mut ::core::ffi::c_void,\n        cDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        cx: *const ::core::ffi::c_void,\n        cy: *mut ::core::ffi::c_void,\n        weightSpaceSize: usize,\n        weightSpace: *const ::core::ffi::c_void,\n        workSpaceSize: usize,\n        workSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSize: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetRNNAlgorithmDescriptor(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        algoDesc: cuda_types::cudnn8::cudnnAlgorithmDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetRNNForwardInferenceAlgorithmMaxCount(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        count: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnFindRNNForwardInferenceAlgorithmEx(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        seqLength: ::core::ffi::c_int,\n        xDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        hxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        hx: *const ::core::ffi::c_void,\n        cxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        cx: *const ::core::ffi::c_void,\n        wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        yDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        hyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        hy: *mut ::core::ffi::c_void,\n        cyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        cy: *mut ::core::ffi::c_void,\n        findIntensity: f32,\n        requestedAlgoCount: ::core::ffi::c_int,\n        returnedAlgoCount: *mut ::core::ffi::c_int,\n        perfResults: *mut cuda_types::cudnn8::cudnnAlgorithmPerformance_t,\n        workspace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateSeqDataDescriptor(\n        seqDataDesc: *mut cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroySeqDataDescriptor(\n        seqDataDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetSeqDataDescriptor(\n        seqDataDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n        dataType: cuda_types::cudnn8::cudnnDataType_t,\n        nbDims: ::core::ffi::c_int,\n        dimA: *const ::core::ffi::c_int,\n        axes: *const cuda_types::cudnn8::cudnnSeqDataAxis_t,\n        seqLengthArraySize: usize,\n        seqLengthArray: *const ::core::ffi::c_int,\n        paddingFill: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetSeqDataDescriptor(\n        seqDataDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n        dataType: *mut cuda_types::cudnn8::cudnnDataType_t,\n        nbDims: *mut ::core::ffi::c_int,\n        nbDimsRequested: ::core::ffi::c_int,\n        dimA: *mut ::core::ffi::c_int,\n        axes: *mut cuda_types::cudnn8::cudnnSeqDataAxis_t,\n        seqLengthArraySize: *mut usize,\n        seqLengthSizeRequested: usize,\n        seqLengthArray: *mut ::core::ffi::c_int,\n        paddingFill: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateAttnDescriptor(\n        attnDesc: *mut cuda_types::cudnn8::cudnnAttnDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyAttnDescriptor(\n        attnDesc: cuda_types::cudnn8::cudnnAttnDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetAttnDescriptor(\n        attnDesc: cuda_types::cudnn8::cudnnAttnDescriptor_t,\n        attnMode: ::core::ffi::c_uint,\n        nHeads: ::core::ffi::c_int,\n        smScaler: f64,\n        dataType: cuda_types::cudnn8::cudnnDataType_t,\n        computePrec: cuda_types::cudnn8::cudnnDataType_t,\n        mathType: cuda_types::cudnn8::cudnnMathType_t,\n        attnDropoutDesc: cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n        postDropoutDesc: cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n        qSize: ::core::ffi::c_int,\n        kSize: ::core::ffi::c_int,\n        vSize: ::core::ffi::c_int,\n        qProjSize: ::core::ffi::c_int,\n        kProjSize: ::core::ffi::c_int,\n        vProjSize: ::core::ffi::c_int,\n        oProjSize: ::core::ffi::c_int,\n        qoMaxSeqLength: ::core::ffi::c_int,\n        kvMaxSeqLength: ::core::ffi::c_int,\n        maxBatchSize: ::core::ffi::c_int,\n        maxBeamSize: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetAttnDescriptor(\n        attnDesc: cuda_types::cudnn8::cudnnAttnDescriptor_t,\n        attnMode: *mut ::core::ffi::c_uint,\n        nHeads: *mut ::core::ffi::c_int,\n        smScaler: *mut f64,\n        dataType: *mut cuda_types::cudnn8::cudnnDataType_t,\n        computePrec: *mut cuda_types::cudnn8::cudnnDataType_t,\n        mathType: *mut cuda_types::cudnn8::cudnnMathType_t,\n        attnDropoutDesc: *mut cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n        postDropoutDesc: *mut cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n        qSize: *mut ::core::ffi::c_int,\n        kSize: *mut ::core::ffi::c_int,\n        vSize: *mut ::core::ffi::c_int,\n        qProjSize: *mut ::core::ffi::c_int,\n        kProjSize: *mut ::core::ffi::c_int,\n        vProjSize: *mut ::core::ffi::c_int,\n        oProjSize: *mut ::core::ffi::c_int,\n        qoMaxSeqLength: *mut ::core::ffi::c_int,\n        kvMaxSeqLength: *mut ::core::ffi::c_int,\n        maxBatchSize: *mut ::core::ffi::c_int,\n        maxBeamSize: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetMultiHeadAttnBuffers(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        attnDesc: cuda_types::cudnn8::cudnnAttnDescriptor_t,\n        weightSizeInBytes: *mut usize,\n        workSpaceSizeInBytes: *mut usize,\n        reserveSpaceSizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetMultiHeadAttnWeights(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        attnDesc: cuda_types::cudnn8::cudnnAttnDescriptor_t,\n        wKind: cuda_types::cudnn8::cudnnMultiHeadAttnWeightKind_t,\n        weightSizeInBytes: usize,\n        weights: *const ::core::ffi::c_void,\n        wDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        wAddr: *mut *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnMultiHeadAttnForward(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        attnDesc: cuda_types::cudnn8::cudnnAttnDescriptor_t,\n        currIdx: ::core::ffi::c_int,\n        loWinIdx: *const ::core::ffi::c_int,\n        hiWinIdx: *const ::core::ffi::c_int,\n        devSeqLengthsQO: *const ::core::ffi::c_int,\n        devSeqLengthsKV: *const ::core::ffi::c_int,\n        qDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n        queries: *const ::core::ffi::c_void,\n        residuals: *const ::core::ffi::c_void,\n        kDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n        keys: *const ::core::ffi::c_void,\n        vDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n        values: *const ::core::ffi::c_void,\n        oDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n        out: *mut ::core::ffi::c_void,\n        weightSizeInBytes: usize,\n        weights: *const ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        workSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnAdvInferVersionCheck() -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnRNNForwardTraining(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        seqLength: ::core::ffi::c_int,\n        xDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        hxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        hx: *const ::core::ffi::c_void,\n        cxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        cx: *const ::core::ffi::c_void,\n        wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        yDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        hyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        hy: *mut ::core::ffi::c_void,\n        cyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        cy: *mut ::core::ffi::c_void,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnRNNBackwardData(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        seqLength: ::core::ffi::c_int,\n        yDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        dyDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        dhyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dhy: *const ::core::ffi::c_void,\n        dcyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dcy: *const ::core::ffi::c_void,\n        wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        hxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        hx: *const ::core::ffi::c_void,\n        cxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        cx: *const ::core::ffi::c_void,\n        dxDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n        dhxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dhx: *mut ::core::ffi::c_void,\n        dcxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dcx: *mut ::core::ffi::c_void,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnRNNBackwardData_v8(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        devSeqLengths: *const i32,\n        yDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        dy: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n        hDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        hx: *const ::core::ffi::c_void,\n        dhy: *const ::core::ffi::c_void,\n        dhx: *mut ::core::ffi::c_void,\n        cDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        cx: *const ::core::ffi::c_void,\n        dcy: *const ::core::ffi::c_void,\n        dcx: *mut ::core::ffi::c_void,\n        weightSpaceSize: usize,\n        weightSpace: *const ::core::ffi::c_void,\n        workSpaceSize: usize,\n        workSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSize: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnRNNBackwardWeights(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        seqLength: ::core::ffi::c_int,\n        xDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        hxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        hx: *const ::core::ffi::c_void,\n        yDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        workSpace: *const ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        dwDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        dw: *mut ::core::ffi::c_void,\n        reserveSpace: *const ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnRNNBackwardWeights_v8(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        addGrad: cuda_types::cudnn8::cudnnWgradMode_t,\n        devSeqLengths: *const i32,\n        xDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        hDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        hx: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        weightSpaceSize: usize,\n        dweightSpace: *mut ::core::ffi::c_void,\n        workSpaceSize: usize,\n        workSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSize: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnRNNForwardTrainingEx(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        xDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        hxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        hx: *const ::core::ffi::c_void,\n        cxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        cx: *const ::core::ffi::c_void,\n        wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        hyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        hy: *mut ::core::ffi::c_void,\n        cyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        cy: *mut ::core::ffi::c_void,\n        kDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n        keys: *const ::core::ffi::c_void,\n        cDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n        cAttn: *mut ::core::ffi::c_void,\n        iDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n        iAttn: *mut ::core::ffi::c_void,\n        qDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n        queries: *mut ::core::ffi::c_void,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnRNNBackwardDataEx(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        yDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        dyDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        dcDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n        dcAttn: *const ::core::ffi::c_void,\n        dhyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dhy: *const ::core::ffi::c_void,\n        dcyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dcy: *const ::core::ffi::c_void,\n        wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        hxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        hx: *const ::core::ffi::c_void,\n        cxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        cx: *const ::core::ffi::c_void,\n        dxDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n        dhxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dhx: *mut ::core::ffi::c_void,\n        dcxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dcx: *mut ::core::ffi::c_void,\n        dkDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n        dkeys: *mut ::core::ffi::c_void,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnRNNBackwardWeightsEx(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        xDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        hxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        hx: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        dwDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        dw: *mut ::core::ffi::c_void,\n        reserveSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetRNNForwardTrainingAlgorithmMaxCount(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        count: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnFindRNNForwardTrainingAlgorithmEx(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        seqLength: ::core::ffi::c_int,\n        xDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        hxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        hx: *const ::core::ffi::c_void,\n        cxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        cx: *const ::core::ffi::c_void,\n        wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        yDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        hyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        hy: *mut ::core::ffi::c_void,\n        cyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        cy: *mut ::core::ffi::c_void,\n        findIntensity: f32,\n        requestedAlgoCount: ::core::ffi::c_int,\n        returnedAlgoCount: *mut ::core::ffi::c_int,\n        perfResults: *mut cuda_types::cudnn8::cudnnAlgorithmPerformance_t,\n        workspace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetRNNBackwardDataAlgorithmMaxCount(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        count: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnFindRNNBackwardDataAlgorithmEx(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        seqLength: ::core::ffi::c_int,\n        yDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        dyDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        dhyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dhy: *const ::core::ffi::c_void,\n        dcyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dcy: *const ::core::ffi::c_void,\n        wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        hxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        hx: *const ::core::ffi::c_void,\n        cxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        cx: *const ::core::ffi::c_void,\n        dxDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n        dhxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dhx: *mut ::core::ffi::c_void,\n        dcxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dcx: *mut ::core::ffi::c_void,\n        findIntensity: f32,\n        requestedAlgoCount: ::core::ffi::c_int,\n        returnedAlgoCount: *mut ::core::ffi::c_int,\n        perfResults: *mut cuda_types::cudnn8::cudnnAlgorithmPerformance_t,\n        workspace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetRNNBackwardWeightsAlgorithmMaxCount(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        count: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnFindRNNBackwardWeightsAlgorithmEx(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n        seqLength: ::core::ffi::c_int,\n        xDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        hxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        hx: *const ::core::ffi::c_void,\n        yDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        findIntensity: f32,\n        requestedAlgoCount: ::core::ffi::c_int,\n        returnedAlgoCount: *mut ::core::ffi::c_int,\n        perfResults: *mut cuda_types::cudnn8::cudnnAlgorithmPerformance_t,\n        workspace: *const ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        dwDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        dw: *mut ::core::ffi::c_void,\n        reserveSpace: *const ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnMultiHeadAttnBackwardData(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        attnDesc: cuda_types::cudnn8::cudnnAttnDescriptor_t,\n        loWinIdx: *const ::core::ffi::c_int,\n        hiWinIdx: *const ::core::ffi::c_int,\n        devSeqLengthsDQDO: *const ::core::ffi::c_int,\n        devSeqLengthsDKDV: *const ::core::ffi::c_int,\n        doDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n        dout: *const ::core::ffi::c_void,\n        dqDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n        dqueries: *mut ::core::ffi::c_void,\n        queries: *const ::core::ffi::c_void,\n        dkDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n        dkeys: *mut ::core::ffi::c_void,\n        keys: *const ::core::ffi::c_void,\n        dvDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n        dvalues: *mut ::core::ffi::c_void,\n        values: *const ::core::ffi::c_void,\n        weightSizeInBytes: usize,\n        weights: *const ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        workSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnMultiHeadAttnBackwardWeights(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        attnDesc: cuda_types::cudnn8::cudnnAttnDescriptor_t,\n        addGrad: cuda_types::cudnn8::cudnnWgradMode_t,\n        qDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n        queries: *const ::core::ffi::c_void,\n        kDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n        keys: *const ::core::ffi::c_void,\n        vDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n        values: *const ::core::ffi::c_void,\n        doDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n        dout: *const ::core::ffi::c_void,\n        weightSizeInBytes: usize,\n        weights: *const ::core::ffi::c_void,\n        dweights: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        workSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateCTCLossDescriptor(\n        ctcLossDesc: *mut cuda_types::cudnn8::cudnnCTCLossDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetCTCLossDescriptor(\n        ctcLossDesc: cuda_types::cudnn8::cudnnCTCLossDescriptor_t,\n        compType: cuda_types::cudnn8::cudnnDataType_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetCTCLossDescriptorEx(\n        ctcLossDesc: cuda_types::cudnn8::cudnnCTCLossDescriptor_t,\n        compType: cuda_types::cudnn8::cudnnDataType_t,\n        normMode: cuda_types::cudnn8::cudnnLossNormalizationMode_t,\n        gradMode: cuda_types::cudnn8::cudnnNanPropagation_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetCTCLossDescriptor_v8(\n        ctcLossDesc: cuda_types::cudnn8::cudnnCTCLossDescriptor_t,\n        compType: cuda_types::cudnn8::cudnnDataType_t,\n        normMode: cuda_types::cudnn8::cudnnLossNormalizationMode_t,\n        gradMode: cuda_types::cudnn8::cudnnNanPropagation_t,\n        maxLabelLength: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetCTCLossDescriptor(\n        ctcLossDesc: cuda_types::cudnn8::cudnnCTCLossDescriptor_t,\n        compType: *mut cuda_types::cudnn8::cudnnDataType_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetCTCLossDescriptorEx(\n        ctcLossDesc: cuda_types::cudnn8::cudnnCTCLossDescriptor_t,\n        compType: *mut cuda_types::cudnn8::cudnnDataType_t,\n        normMode: *mut cuda_types::cudnn8::cudnnLossNormalizationMode_t,\n        gradMode: *mut cuda_types::cudnn8::cudnnNanPropagation_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetCTCLossDescriptor_v8(\n        ctcLossDesc: cuda_types::cudnn8::cudnnCTCLossDescriptor_t,\n        compType: *mut cuda_types::cudnn8::cudnnDataType_t,\n        normMode: *mut cuda_types::cudnn8::cudnnLossNormalizationMode_t,\n        gradMode: *mut cuda_types::cudnn8::cudnnNanPropagation_t,\n        maxLabelLength: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyCTCLossDescriptor(\n        ctcLossDesc: cuda_types::cudnn8::cudnnCTCLossDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCTCLoss(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        probsDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        probs: *const ::core::ffi::c_void,\n        hostLabels: *const ::core::ffi::c_int,\n        hostLabelLengths: *const ::core::ffi::c_int,\n        hostInputLengths: *const ::core::ffi::c_int,\n        costs: *mut ::core::ffi::c_void,\n        gradientsDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        gradients: *mut ::core::ffi::c_void,\n        algo: cuda_types::cudnn8::cudnnCTCLossAlgo_t,\n        ctcLossDesc: cuda_types::cudnn8::cudnnCTCLossDescriptor_t,\n        workspace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCTCLoss_v8(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        algo: cuda_types::cudnn8::cudnnCTCLossAlgo_t,\n        ctcLossDesc: cuda_types::cudnn8::cudnnCTCLossDescriptor_t,\n        probsDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        probs: *const ::core::ffi::c_void,\n        labels: *const ::core::ffi::c_int,\n        labelLengths: *const ::core::ffi::c_int,\n        inputLengths: *const ::core::ffi::c_int,\n        costs: *mut ::core::ffi::c_void,\n        gradientsDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        gradients: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        workspace: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetCTCLossWorkspaceSize(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        probsDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        gradientsDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        labels: *const ::core::ffi::c_int,\n        labelLengths: *const ::core::ffi::c_int,\n        inputLengths: *const ::core::ffi::c_int,\n        algo: cuda_types::cudnn8::cudnnCTCLossAlgo_t,\n        ctcLossDesc: cuda_types::cudnn8::cudnnCTCLossDescriptor_t,\n        sizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetCTCLossWorkspaceSize_v8(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        algo: cuda_types::cudnn8::cudnnCTCLossAlgo_t,\n        ctcLossDesc: cuda_types::cudnn8::cudnnCTCLossDescriptor_t,\n        probsDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        gradientsDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        sizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnAdvTrainVersionCheck() -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateConvolutionDescriptor(\n        convDesc: *mut cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyConvolutionDescriptor(\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetConvolutionMathType(\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        mathType: cuda_types::cudnn8::cudnnMathType_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolutionMathType(\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        mathType: *mut cuda_types::cudnn8::cudnnMathType_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetConvolutionGroupCount(\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        groupCount: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolutionGroupCount(\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        groupCount: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetConvolutionReorderType(\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        reorderType: cuda_types::cudnn8::cudnnReorderType_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolutionReorderType(\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        reorderType: *mut cuda_types::cudnn8::cudnnReorderType_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetConvolution2dDescriptor(\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        pad_h: ::core::ffi::c_int,\n        pad_w: ::core::ffi::c_int,\n        u: ::core::ffi::c_int,\n        v: ::core::ffi::c_int,\n        dilation_h: ::core::ffi::c_int,\n        dilation_w: ::core::ffi::c_int,\n        mode: cuda_types::cudnn8::cudnnConvolutionMode_t,\n        computeType: cuda_types::cudnn8::cudnnDataType_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolution2dDescriptor(\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        pad_h: *mut ::core::ffi::c_int,\n        pad_w: *mut ::core::ffi::c_int,\n        u: *mut ::core::ffi::c_int,\n        v: *mut ::core::ffi::c_int,\n        dilation_h: *mut ::core::ffi::c_int,\n        dilation_w: *mut ::core::ffi::c_int,\n        mode: *mut cuda_types::cudnn8::cudnnConvolutionMode_t,\n        computeType: *mut cuda_types::cudnn8::cudnnDataType_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetConvolutionNdDescriptor(\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        arrayLength: ::core::ffi::c_int,\n        padA: *const ::core::ffi::c_int,\n        filterStrideA: *const ::core::ffi::c_int,\n        dilationA: *const ::core::ffi::c_int,\n        mode: cuda_types::cudnn8::cudnnConvolutionMode_t,\n        computeType: cuda_types::cudnn8::cudnnDataType_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolutionNdDescriptor(\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        arrayLengthRequested: ::core::ffi::c_int,\n        arrayLength: *mut ::core::ffi::c_int,\n        padA: *mut ::core::ffi::c_int,\n        strideA: *mut ::core::ffi::c_int,\n        dilationA: *mut ::core::ffi::c_int,\n        mode: *mut cuda_types::cudnn8::cudnnConvolutionMode_t,\n        computeType: *mut cuda_types::cudnn8::cudnnDataType_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolution2dForwardOutputDim(\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        inputTensorDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        filterDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        n: *mut ::core::ffi::c_int,\n        c: *mut ::core::ffi::c_int,\n        h: *mut ::core::ffi::c_int,\n        w: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolutionNdForwardOutputDim(\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        inputTensorDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        filterDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        nbDims: ::core::ffi::c_int,\n        tensorOuputDimA: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolutionForwardAlgorithmMaxCount(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        count: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolutionForwardAlgorithm_v7(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        srcDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        filterDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        destDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        requestedAlgoCount: ::core::ffi::c_int,\n        returnedAlgoCount: *mut ::core::ffi::c_int,\n        perfResults: *mut cuda_types::cudnn8::cudnnConvolutionFwdAlgoPerf_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnFindConvolutionForwardAlgorithm(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        requestedAlgoCount: ::core::ffi::c_int,\n        returnedAlgoCount: *mut ::core::ffi::c_int,\n        perfResults: *mut cuda_types::cudnn8::cudnnConvolutionFwdAlgoPerf_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnFindConvolutionForwardAlgorithmEx(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        requestedAlgoCount: ::core::ffi::c_int,\n        returnedAlgoCount: *mut ::core::ffi::c_int,\n        perfResults: *mut cuda_types::cudnn8::cudnnConvolutionFwdAlgoPerf_t,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnIm2Col(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        colBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnReorderFilterAndBias(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        filterDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        reorderType: cuda_types::cudnn8::cudnnReorderType_t,\n        filterData: *const ::core::ffi::c_void,\n        reorderedFilterData: *mut ::core::ffi::c_void,\n        reorderBias: ::core::ffi::c_int,\n        biasData: *const ::core::ffi::c_void,\n        reorderedBiasData: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolutionForwardWorkspaceSize(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        algo: cuda_types::cudnn8::cudnnConvolutionFwdAlgo_t,\n        sizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnConvolutionForward(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        algo: cuda_types::cudnn8::cudnnConvolutionFwdAlgo_t,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        beta: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnConvolutionBiasActivationForward(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        alpha1: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        algo: cuda_types::cudnn8::cudnnConvolutionFwdAlgo_t,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        alpha2: *const ::core::ffi::c_void,\n        zDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        z: *const ::core::ffi::c_void,\n        biasDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        bias: *const ::core::ffi::c_void,\n        activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n        yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolutionBackwardDataAlgorithmMaxCount(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        count: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnFindConvolutionBackwardDataAlgorithm(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        dxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        requestedAlgoCount: ::core::ffi::c_int,\n        returnedAlgoCount: *mut ::core::ffi::c_int,\n        perfResults: *mut cuda_types::cudnn8::cudnnConvolutionBwdDataAlgoPerf_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnFindConvolutionBackwardDataAlgorithmEx(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        dxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n        requestedAlgoCount: ::core::ffi::c_int,\n        returnedAlgoCount: *mut ::core::ffi::c_int,\n        perfResults: *mut cuda_types::cudnn8::cudnnConvolutionBwdDataAlgoPerf_t,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolutionBackwardDataAlgorithm_v7(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        filterDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        diffDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        gradDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        requestedAlgoCount: ::core::ffi::c_int,\n        returnedAlgoCount: *mut ::core::ffi::c_int,\n        perfResults: *mut cuda_types::cudnn8::cudnnConvolutionBwdDataAlgoPerf_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolutionBackwardDataWorkspaceSize(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        dxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        algo: cuda_types::cudnn8::cudnnConvolutionBwdDataAlgo_t,\n        sizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnConvolutionBackwardData(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        alpha: *const ::core::ffi::c_void,\n        wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        algo: cuda_types::cudnn8::cudnnConvolutionBwdDataAlgo_t,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        beta: *const ::core::ffi::c_void,\n        dxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetFoldedConvBackwardDataDescriptors(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        filterDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        diffDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        gradDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        transformFormat: cuda_types::cudnn8::cudnnTensorFormat_t,\n        foldedFilterDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        paddedDiffDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        foldedConvDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        foldedGradDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        filterFoldTransDesc: cuda_types::cudnn8::cudnnTensorTransformDescriptor_t,\n        diffPadTransDesc: cuda_types::cudnn8::cudnnTensorTransformDescriptor_t,\n        gradFoldTransDesc: cuda_types::cudnn8::cudnnTensorTransformDescriptor_t,\n        gradUnfoldTransDesc: cuda_types::cudnn8::cudnnTensorTransformDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCnnInferVersionCheck() -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolutionBackwardFilterAlgorithmMaxCount(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        count: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnFindConvolutionBackwardFilterAlgorithm(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        dwDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        requestedAlgoCount: ::core::ffi::c_int,\n        returnedAlgoCount: *mut ::core::ffi::c_int,\n        perfResults: *mut cuda_types::cudnn8::cudnnConvolutionBwdFilterAlgoPerf_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnFindConvolutionBackwardFilterAlgorithmEx(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        dwDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        dw: *mut ::core::ffi::c_void,\n        requestedAlgoCount: ::core::ffi::c_int,\n        returnedAlgoCount: *mut ::core::ffi::c_int,\n        perfResults: *mut cuda_types::cudnn8::cudnnConvolutionBwdFilterAlgoPerf_t,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolutionBackwardFilterAlgorithm_v7(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        srcDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        diffDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        gradDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        requestedAlgoCount: ::core::ffi::c_int,\n        returnedAlgoCount: *mut ::core::ffi::c_int,\n        perfResults: *mut cuda_types::cudnn8::cudnnConvolutionBwdFilterAlgoPerf_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolutionBackwardFilterWorkspaceSize(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        gradDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        algo: cuda_types::cudnn8::cudnnConvolutionBwdFilterAlgo_t,\n        sizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnConvolutionBackwardFilter(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n        algo: cuda_types::cudnn8::cudnnConvolutionBwdFilterAlgo_t,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        beta: *const ::core::ffi::c_void,\n        dwDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n        dw: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnConvolutionBackwardBias(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        alpha: *const ::core::ffi::c_void,\n        dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        dbDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n        db: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateFusedOpsConstParamPack(\n        constPack: *mut cuda_types::cudnn8::cudnnFusedOpsConstParamPack_t,\n        ops: cuda_types::cudnn8::cudnnFusedOps_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyFusedOpsConstParamPack(\n        constPack: cuda_types::cudnn8::cudnnFusedOpsConstParamPack_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetFusedOpsConstParamPackAttribute(\n        constPack: cuda_types::cudnn8::cudnnFusedOpsConstParamPack_t,\n        paramLabel: cuda_types::cudnn8::cudnnFusedOpsConstParamLabel_t,\n        param: *const ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetFusedOpsConstParamPackAttribute(\n        constPack: cuda_types::cudnn8::cudnnFusedOpsConstParamPack_t,\n        paramLabel: cuda_types::cudnn8::cudnnFusedOpsConstParamLabel_t,\n        param: *mut ::core::ffi::c_void,\n        isNULL: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateFusedOpsVariantParamPack(\n        varPack: *mut cuda_types::cudnn8::cudnnFusedOpsVariantParamPack_t,\n        ops: cuda_types::cudnn8::cudnnFusedOps_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyFusedOpsVariantParamPack(\n        varPack: cuda_types::cudnn8::cudnnFusedOpsVariantParamPack_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetFusedOpsVariantParamPackAttribute(\n        varPack: cuda_types::cudnn8::cudnnFusedOpsVariantParamPack_t,\n        paramLabel: cuda_types::cudnn8::cudnnFusedOpsVariantParamLabel_t,\n        ptr: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetFusedOpsVariantParamPackAttribute(\n        varPack: cuda_types::cudnn8::cudnnFusedOpsVariantParamPack_t,\n        paramLabel: cuda_types::cudnn8::cudnnFusedOpsVariantParamLabel_t,\n        ptr: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateFusedOpsPlan(\n        plan: *mut cuda_types::cudnn8::cudnnFusedOpsPlan_t,\n        ops: cuda_types::cudnn8::cudnnFusedOps_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyFusedOpsPlan(\n        plan: cuda_types::cudnn8::cudnnFusedOpsPlan_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnMakeFusedOpsPlan(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        plan: cuda_types::cudnn8::cudnnFusedOpsPlan_t,\n        constPack: cuda_types::cudnn8::cudnnFusedOpsConstParamPack_t,\n        workspaceSizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnFusedOpsExecute(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        plan: cuda_types::cudnn8::cudnnFusedOpsPlan_t,\n        varPack: cuda_types::cudnn8::cudnnFusedOpsVariantParamPack_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCnnTrainVersionCheck() -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnBackendCreateDescriptor(\n        descriptorType: cuda_types::cudnn8::cudnnBackendDescriptorType_t,\n        descriptor: *mut cuda_types::cudnn8::cudnnBackendDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnBackendDestroyDescriptor(\n        descriptor: cuda_types::cudnn8::cudnnBackendDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnBackendInitialize(\n        descriptor: cuda_types::cudnn8::cudnnBackendDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnBackendFinalize(\n        descriptor: cuda_types::cudnn8::cudnnBackendDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnBackendSetAttribute(\n        descriptor: cuda_types::cudnn8::cudnnBackendDescriptor_t,\n        attributeName: cuda_types::cudnn8::cudnnBackendAttributeName_t,\n        attributeType: cuda_types::cudnn8::cudnnBackendAttributeType_t,\n        elementCount: i64,\n        arrayOfElements: *const ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnBackendGetAttribute(\n        descriptor: cuda_types::cudnn8::cudnnBackendDescriptor_t,\n        attributeName: cuda_types::cudnn8::cudnnBackendAttributeName_t,\n        attributeType: cuda_types::cudnn8::cudnnBackendAttributeType_t,\n        requestedElementCount: i64,\n        elementCount: *mut i64,\n        arrayOfElements: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n    #[must_use]\n    fn cudnnBackendExecute(\n        handle: cuda_types::cudnn8::cudnnHandle_t,\n        executionPlan: cuda_types::cudnn8::cudnnBackendDescriptor_t,\n        variantPack: cuda_types::cudnn8::cudnnBackendDescriptor_t,\n    ) -> cuda_types::cudnn8::cudnnStatus_t;\n}\n"
  },
  {
    "path": "cuda_macros/src/cudnn9.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\nextern \"system\" {\n    fn cudnnGetVersion() -> usize;\n    fn cudnnGetMaxDeviceVersion() -> usize;\n    fn cudnnGetCudartVersion() -> usize;\n    fn cudnnGetErrorString(\n        status: cuda_types::cudnn9::cudnnStatus_t,\n    ) -> *const ::core::ffi::c_char;\n    fn cudnnGetLastErrorString(message: *mut ::core::ffi::c_char, max_size: usize) -> ();\n    #[must_use]\n    fn cudnnQueryRuntimeError(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        rstatus: *mut cuda_types::cudnn9::cudnnStatus_t,\n        mode: cuda_types::cudnn9::cudnnErrQueryMode_t,\n        tag: *mut cuda_types::cudnn9::cudnnRuntimeTag_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetProperty(\n        type_: cuda_types::cudnn9::libraryPropertyType,\n        value: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreate(\n        handle: *mut cuda_types::cudnn9::cudnnHandle_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroy(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetStream(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        streamId: cuda_types::cudnn9::cudaStream_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetStream(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        streamId: *mut cuda_types::cudnn9::cudaStream_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetCallback(\n        mask: ::core::ffi::c_uint,\n        udata: *mut ::core::ffi::c_void,\n        fptr: cuda_types::cudnn9::cudnnCallback_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetCallback(\n        mask: *mut ::core::ffi::c_uint,\n        udata: *mut *mut ::core::ffi::c_void,\n        fptr: *mut cuda_types::cudnn9::cudnnCallback_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGraphVersionCheck() -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnBackendCreateDescriptor(\n        descriptorType: cuda_types::cudnn9::cudnnBackendDescriptorType_t,\n        descriptor: *mut cuda_types::cudnn9::cudnnBackendDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnBackendDestroyDescriptor(\n        descriptor: cuda_types::cudnn9::cudnnBackendDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnBackendInitialize(\n        descriptor: cuda_types::cudnn9::cudnnBackendDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnBackendFinalize(\n        descriptor: cuda_types::cudnn9::cudnnBackendDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnBackendSetAttribute(\n        descriptor: cuda_types::cudnn9::cudnnBackendDescriptor_t,\n        attributeName: cuda_types::cudnn9::cudnnBackendAttributeName_t,\n        attributeType: cuda_types::cudnn9::cudnnBackendAttributeType_t,\n        elementCount: i64,\n        arrayOfElements: *const ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnBackendGetAttribute(\n        descriptor: cuda_types::cudnn9::cudnnBackendDescriptor_t,\n        attributeName: cuda_types::cudnn9::cudnnBackendAttributeName_t,\n        attributeType: cuda_types::cudnn9::cudnnBackendAttributeType_t,\n        requestedElementCount: i64,\n        elementCount: *mut i64,\n        arrayOfElements: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnBackendExecute(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        executionPlan: cuda_types::cudnn9::cudnnBackendDescriptor_t,\n        variantPack: cuda_types::cudnn9::cudnnBackendDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnBackendPopulateCudaGraph(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        executionPlan: cuda_types::cudnn9::cudnnBackendDescriptor_t,\n        variantPack: cuda_types::cudnn9::cudnnBackendDescriptor_t,\n        graph: cuda_types::cudnn9::cudaGraph_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnBackendUpdateCudaGraph(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        executionPlan: cuda_types::cudnn9::cudnnBackendDescriptor_t,\n        variantPack: cuda_types::cudnn9::cudnnBackendDescriptor_t,\n        graph: cuda_types::cudnn9::cudaGraph_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateTensorDescriptor(\n        tensorDesc: *mut cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetTensor4dDescriptor(\n        tensorDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        format: cuda_types::cudnn9::cudnnTensorFormat_t,\n        dataType: cuda_types::cudnn9::cudnnDataType_t,\n        n: ::core::ffi::c_int,\n        c: ::core::ffi::c_int,\n        h: ::core::ffi::c_int,\n        w: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetTensor4dDescriptorEx(\n        tensorDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dataType: cuda_types::cudnn9::cudnnDataType_t,\n        n: ::core::ffi::c_int,\n        c: ::core::ffi::c_int,\n        h: ::core::ffi::c_int,\n        w: ::core::ffi::c_int,\n        nStride: ::core::ffi::c_int,\n        cStride: ::core::ffi::c_int,\n        hStride: ::core::ffi::c_int,\n        wStride: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetTensor4dDescriptor(\n        tensorDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dataType: *mut cuda_types::cudnn9::cudnnDataType_t,\n        n: *mut ::core::ffi::c_int,\n        c: *mut ::core::ffi::c_int,\n        h: *mut ::core::ffi::c_int,\n        w: *mut ::core::ffi::c_int,\n        nStride: *mut ::core::ffi::c_int,\n        cStride: *mut ::core::ffi::c_int,\n        hStride: *mut ::core::ffi::c_int,\n        wStride: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetTensorNdDescriptor(\n        tensorDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dataType: cuda_types::cudnn9::cudnnDataType_t,\n        nbDims: ::core::ffi::c_int,\n        dimA: *const ::core::ffi::c_int,\n        strideA: *const ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetTensorNdDescriptorEx(\n        tensorDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        format: cuda_types::cudnn9::cudnnTensorFormat_t,\n        dataType: cuda_types::cudnn9::cudnnDataType_t,\n        nbDims: ::core::ffi::c_int,\n        dimA: *const ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetTensorNdDescriptor(\n        tensorDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        nbDimsRequested: ::core::ffi::c_int,\n        dataType: *mut cuda_types::cudnn9::cudnnDataType_t,\n        nbDims: *mut ::core::ffi::c_int,\n        dimA: *mut ::core::ffi::c_int,\n        strideA: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetTensorSizeInBytes(\n        tensorDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        size: *mut usize,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyTensorDescriptor(\n        tensorDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    /// Create a destination descriptor for cudnnTransformTensor\n    fn cudnnInitTransformDest(\n        transformDesc: cuda_types::cudnn9::cudnnTensorTransformDescriptor_t,\n        srcDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        destDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        destSizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    /// Create an empty tensor transform descriptor\n    fn cudnnCreateTensorTransformDescriptor(\n        transformDesc: *mut cuda_types::cudnn9::cudnnTensorTransformDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    /// Initialize a previously created tensor transform descriptor.\n    fn cudnnSetTensorTransformDescriptor(\n        transformDesc: cuda_types::cudnn9::cudnnTensorTransformDescriptor_t,\n        nbDims: u32,\n        destFormat: cuda_types::cudnn9::cudnnTensorFormat_t,\n        padBeforeA: *const i32,\n        padAfterA: *const i32,\n        foldA: *const u32,\n        direction: cuda_types::cudnn9::cudnnFoldingDirection_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    /** Retrieves the values stored in a previously initialized tensor transform\n descriptor.*/\n    fn cudnnGetTensorTransformDescriptor(\n        transformDesc: cuda_types::cudnn9::cudnnTensorTransformDescriptor_t,\n        nbDimsRequested: u32,\n        destFormat: *mut cuda_types::cudnn9::cudnnTensorFormat_t,\n        padBeforeA: *mut i32,\n        padAfterA: *mut i32,\n        foldA: *mut u32,\n        direction: *mut cuda_types::cudnn9::cudnnFoldingDirection_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    /// Destroys a previously created tensor transform descriptor.\n    fn cudnnDestroyTensorTransformDescriptor(\n        transformDesc: cuda_types::cudnn9::cudnnTensorTransformDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnTransformTensor(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnTransformTensorEx(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        transDesc: cuda_types::cudnn9::cudnnTensorTransformDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        srcDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        srcData: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        destDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        destData: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnAddTensor(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        alpha: *const ::core::ffi::c_void,\n        aDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        A: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        cDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        C: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateOpTensorDescriptor(\n        opTensorDesc: *mut cuda_types::cudnn9::cudnnOpTensorDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetOpTensorDescriptor(\n        opTensorDesc: cuda_types::cudnn9::cudnnOpTensorDescriptor_t,\n        opTensorOp: cuda_types::cudnn9::cudnnOpTensorOp_t,\n        opTensorCompType: cuda_types::cudnn9::cudnnDataType_t,\n        opTensorNanOpt: cuda_types::cudnn9::cudnnNanPropagation_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetOpTensorDescriptor(\n        opTensorDesc: cuda_types::cudnn9::cudnnOpTensorDescriptor_t,\n        opTensorOp: *mut cuda_types::cudnn9::cudnnOpTensorOp_t,\n        opTensorCompType: *mut cuda_types::cudnn9::cudnnDataType_t,\n        opTensorNanOpt: *mut cuda_types::cudnn9::cudnnNanPropagation_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyOpTensorDescriptor(\n        opTensorDesc: cuda_types::cudnn9::cudnnOpTensorDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnOpTensor(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        opTensorDesc: cuda_types::cudnn9::cudnnOpTensorDescriptor_t,\n        alpha1: *const ::core::ffi::c_void,\n        aDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        A: *const ::core::ffi::c_void,\n        alpha2: *const ::core::ffi::c_void,\n        bDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        B: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        cDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        C: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateReduceTensorDescriptor(\n        reduceTensorDesc: *mut cuda_types::cudnn9::cudnnReduceTensorDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetReduceTensorDescriptor(\n        reduceTensorDesc: cuda_types::cudnn9::cudnnReduceTensorDescriptor_t,\n        reduceTensorOp: cuda_types::cudnn9::cudnnReduceTensorOp_t,\n        reduceTensorCompType: cuda_types::cudnn9::cudnnDataType_t,\n        reduceTensorNanOpt: cuda_types::cudnn9::cudnnNanPropagation_t,\n        reduceTensorIndices: cuda_types::cudnn9::cudnnReduceTensorIndices_t,\n        reduceTensorIndicesType: cuda_types::cudnn9::cudnnIndicesType_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetReduceTensorDescriptor(\n        reduceTensorDesc: cuda_types::cudnn9::cudnnReduceTensorDescriptor_t,\n        reduceTensorOp: *mut cuda_types::cudnn9::cudnnReduceTensorOp_t,\n        reduceTensorCompType: *mut cuda_types::cudnn9::cudnnDataType_t,\n        reduceTensorNanOpt: *mut cuda_types::cudnn9::cudnnNanPropagation_t,\n        reduceTensorIndices: *mut cuda_types::cudnn9::cudnnReduceTensorIndices_t,\n        reduceTensorIndicesType: *mut cuda_types::cudnn9::cudnnIndicesType_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyReduceTensorDescriptor(\n        reduceTensorDesc: cuda_types::cudnn9::cudnnReduceTensorDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetReductionIndicesSize(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        reduceTensorDesc: cuda_types::cudnn9::cudnnReduceTensorDescriptor_t,\n        aDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        cDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        sizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetReductionWorkspaceSize(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        reduceTensorDesc: cuda_types::cudnn9::cudnnReduceTensorDescriptor_t,\n        aDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        cDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        sizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnReduceTensor(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        reduceTensorDesc: cuda_types::cudnn9::cudnnReduceTensorDescriptor_t,\n        indices: *mut ::core::ffi::c_void,\n        indicesSizeInBytes: usize,\n        workspace: *mut ::core::ffi::c_void,\n        workspaceSizeInBytes: usize,\n        alpha: *const ::core::ffi::c_void,\n        aDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        A: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        cDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        C: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetTensor(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        valuePtr: *const ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnScaleTensor(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        alpha: *const ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateFilterDescriptor(\n        filterDesc: *mut cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetFilter4dDescriptor(\n        filterDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        dataType: cuda_types::cudnn9::cudnnDataType_t,\n        format: cuda_types::cudnn9::cudnnTensorFormat_t,\n        k: ::core::ffi::c_int,\n        c: ::core::ffi::c_int,\n        h: ::core::ffi::c_int,\n        w: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetFilter4dDescriptor(\n        filterDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        dataType: *mut cuda_types::cudnn9::cudnnDataType_t,\n        format: *mut cuda_types::cudnn9::cudnnTensorFormat_t,\n        k: *mut ::core::ffi::c_int,\n        c: *mut ::core::ffi::c_int,\n        h: *mut ::core::ffi::c_int,\n        w: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetFilterNdDescriptor(\n        filterDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        dataType: cuda_types::cudnn9::cudnnDataType_t,\n        format: cuda_types::cudnn9::cudnnTensorFormat_t,\n        nbDims: ::core::ffi::c_int,\n        filterDimA: *const ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetFilterNdDescriptor(\n        filterDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        nbDimsRequested: ::core::ffi::c_int,\n        dataType: *mut cuda_types::cudnn9::cudnnDataType_t,\n        format: *mut cuda_types::cudnn9::cudnnTensorFormat_t,\n        nbDims: *mut ::core::ffi::c_int,\n        filterDimA: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetFilterSizeInBytes(\n        filterDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        size: *mut usize,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnTransformFilter(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        transDesc: cuda_types::cudnn9::cudnnTensorTransformDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        srcDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        srcData: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        destDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        destData: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyFilterDescriptor(\n        filterDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSoftmaxForward(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        algo: cuda_types::cudnn9::cudnnSoftmaxAlgorithm_t,\n        mode: cuda_types::cudnn9::cudnnSoftmaxMode_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreatePoolingDescriptor(\n        poolingDesc: *mut cuda_types::cudnn9::cudnnPoolingDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetPooling2dDescriptor(\n        poolingDesc: cuda_types::cudnn9::cudnnPoolingDescriptor_t,\n        mode: cuda_types::cudnn9::cudnnPoolingMode_t,\n        maxpoolingNanOpt: cuda_types::cudnn9::cudnnNanPropagation_t,\n        windowHeight: ::core::ffi::c_int,\n        windowWidth: ::core::ffi::c_int,\n        verticalPadding: ::core::ffi::c_int,\n        horizontalPadding: ::core::ffi::c_int,\n        verticalStride: ::core::ffi::c_int,\n        horizontalStride: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetPooling2dDescriptor(\n        poolingDesc: cuda_types::cudnn9::cudnnPoolingDescriptor_t,\n        mode: *mut cuda_types::cudnn9::cudnnPoolingMode_t,\n        maxpoolingNanOpt: *mut cuda_types::cudnn9::cudnnNanPropagation_t,\n        windowHeight: *mut ::core::ffi::c_int,\n        windowWidth: *mut ::core::ffi::c_int,\n        verticalPadding: *mut ::core::ffi::c_int,\n        horizontalPadding: *mut ::core::ffi::c_int,\n        verticalStride: *mut ::core::ffi::c_int,\n        horizontalStride: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetPoolingNdDescriptor(\n        poolingDesc: cuda_types::cudnn9::cudnnPoolingDescriptor_t,\n        mode: cuda_types::cudnn9::cudnnPoolingMode_t,\n        maxpoolingNanOpt: cuda_types::cudnn9::cudnnNanPropagation_t,\n        nbDims: ::core::ffi::c_int,\n        windowDimA: *const ::core::ffi::c_int,\n        paddingA: *const ::core::ffi::c_int,\n        strideA: *const ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetPoolingNdDescriptor(\n        poolingDesc: cuda_types::cudnn9::cudnnPoolingDescriptor_t,\n        nbDimsRequested: ::core::ffi::c_int,\n        mode: *mut cuda_types::cudnn9::cudnnPoolingMode_t,\n        maxpoolingNanOpt: *mut cuda_types::cudnn9::cudnnNanPropagation_t,\n        nbDims: *mut ::core::ffi::c_int,\n        windowDimA: *mut ::core::ffi::c_int,\n        paddingA: *mut ::core::ffi::c_int,\n        strideA: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetPoolingNdForwardOutputDim(\n        poolingDesc: cuda_types::cudnn9::cudnnPoolingDescriptor_t,\n        inputTensorDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        nbDims: ::core::ffi::c_int,\n        outputTensorDimA: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetPooling2dForwardOutputDim(\n        poolingDesc: cuda_types::cudnn9::cudnnPoolingDescriptor_t,\n        inputTensorDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        n: *mut ::core::ffi::c_int,\n        c: *mut ::core::ffi::c_int,\n        h: *mut ::core::ffi::c_int,\n        w: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyPoolingDescriptor(\n        poolingDesc: cuda_types::cudnn9::cudnnPoolingDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnPoolingForward(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        poolingDesc: cuda_types::cudnn9::cudnnPoolingDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateActivationDescriptor(\n        activationDesc: *mut cuda_types::cudnn9::cudnnActivationDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetActivationDescriptor(\n        activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n        mode: cuda_types::cudnn9::cudnnActivationMode_t,\n        reluNanOpt: cuda_types::cudnn9::cudnnNanPropagation_t,\n        coef: f64,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetActivationDescriptor(\n        activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n        mode: *mut cuda_types::cudnn9::cudnnActivationMode_t,\n        reluNanOpt: *mut cuda_types::cudnn9::cudnnNanPropagation_t,\n        coef: *mut f64,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetActivationDescriptorSwishBeta(\n        activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n        swish_beta: f64,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetActivationDescriptorSwishBeta(\n        activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n        swish_beta: *mut f64,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyActivationDescriptor(\n        activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnActivationForward(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateLRNDescriptor(\n        normDesc: *mut cuda_types::cudnn9::cudnnLRNDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetLRNDescriptor(\n        normDesc: cuda_types::cudnn9::cudnnLRNDescriptor_t,\n        lrnN: ::core::ffi::c_uint,\n        lrnAlpha: f64,\n        lrnBeta: f64,\n        lrnK: f64,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetLRNDescriptor(\n        normDesc: cuda_types::cudnn9::cudnnLRNDescriptor_t,\n        lrnN: *mut ::core::ffi::c_uint,\n        lrnAlpha: *mut f64,\n        lrnBeta: *mut f64,\n        lrnK: *mut f64,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyLRNDescriptor(\n        lrnDesc: cuda_types::cudnn9::cudnnLRNDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnLRNCrossChannelForward(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        normDesc: cuda_types::cudnn9::cudnnLRNDescriptor_t,\n        lrnMode: cuda_types::cudnn9::cudnnLRNMode_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDivisiveNormalizationForward(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        normDesc: cuda_types::cudnn9::cudnnLRNDescriptor_t,\n        mode: cuda_types::cudnn9::cudnnDivNormMode_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        means: *const ::core::ffi::c_void,\n        temp: *mut ::core::ffi::c_void,\n        temp2: *mut ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDeriveBNTensorDescriptor(\n        derivedBnDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        mode: cuda_types::cudnn9::cudnnBatchNormMode_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnBatchNormalizationForwardInference(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        mode: cuda_types::cudnn9::cudnnBatchNormMode_t,\n        alpha: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        bnScaleBiasMeanVarDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        bnScale: *const ::core::ffi::c_void,\n        bnBias: *const ::core::ffi::c_void,\n        estimatedMean: *const ::core::ffi::c_void,\n        estimatedVariance: *const ::core::ffi::c_void,\n        epsilon: f64,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDeriveNormTensorDescriptor(\n        derivedNormScaleBiasDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        derivedNormMeanVarDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        mode: cuda_types::cudnn9::cudnnNormMode_t,\n        groupCnt: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnNormalizationForwardInference(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        mode: cuda_types::cudnn9::cudnnNormMode_t,\n        normOps: cuda_types::cudnn9::cudnnNormOps_t,\n        algo: cuda_types::cudnn9::cudnnNormAlgo_t,\n        alpha: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        normScaleBiasDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        normScale: *const ::core::ffi::c_void,\n        normBias: *const ::core::ffi::c_void,\n        normMeanVarDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        estimatedMean: *const ::core::ffi::c_void,\n        estimatedVariance: *const ::core::ffi::c_void,\n        zDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        z: *const ::core::ffi::c_void,\n        activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        epsilon: f64,\n        groupCnt: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateSpatialTransformerDescriptor(\n        stDesc: *mut cuda_types::cudnn9::cudnnSpatialTransformerDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetSpatialTransformerNdDescriptor(\n        stDesc: cuda_types::cudnn9::cudnnSpatialTransformerDescriptor_t,\n        samplerType: cuda_types::cudnn9::cudnnSamplerType_t,\n        dataType: cuda_types::cudnn9::cudnnDataType_t,\n        nbDims: ::core::ffi::c_int,\n        dimA: *const ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroySpatialTransformerDescriptor(\n        stDesc: cuda_types::cudnn9::cudnnSpatialTransformerDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSpatialTfGridGeneratorForward(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        stDesc: cuda_types::cudnn9::cudnnSpatialTransformerDescriptor_t,\n        theta: *const ::core::ffi::c_void,\n        grid: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSpatialTfSamplerForward(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        stDesc: cuda_types::cudnn9::cudnnSpatialTransformerDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        grid: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateDropoutDescriptor(\n        dropoutDesc: *mut cuda_types::cudnn9::cudnnDropoutDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyDropoutDescriptor(\n        dropoutDesc: cuda_types::cudnn9::cudnnDropoutDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDropoutGetStatesSize(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        sizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDropoutGetReserveSpaceSize(\n        xdesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        sizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetDropoutDescriptor(\n        dropoutDesc: cuda_types::cudnn9::cudnnDropoutDescriptor_t,\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        dropout: f32,\n        states: *mut ::core::ffi::c_void,\n        stateSizeInBytes: usize,\n        seed: ::core::ffi::c_ulonglong,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnRestoreDropoutDescriptor(\n        dropoutDesc: cuda_types::cudnn9::cudnnDropoutDescriptor_t,\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        dropout: f32,\n        states: *mut ::core::ffi::c_void,\n        stateSizeInBytes: usize,\n        seed: ::core::ffi::c_ulonglong,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetDropoutDescriptor(\n        dropoutDesc: cuda_types::cudnn9::cudnnDropoutDescriptor_t,\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        dropout: *mut f32,\n        states: *mut *mut ::core::ffi::c_void,\n        seed: *mut ::core::ffi::c_ulonglong,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDropoutForward(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        dropoutDesc: cuda_types::cudnn9::cudnnDropoutDescriptor_t,\n        xdesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        ydesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        reserveSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnOpsVersionCheck() -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSoftmaxBackward(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        algo: cuda_types::cudnn9::cudnnSoftmaxAlgorithm_t,\n        mode: cuda_types::cudnn9::cudnnSoftmaxMode_t,\n        alpha: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        dxDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnPoolingBackward(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        poolingDesc: cuda_types::cudnn9::cudnnPoolingDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        dxDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnActivationBackward(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        dxDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnLRNCrossChannelBackward(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        normDesc: cuda_types::cudnn9::cudnnLRNDescriptor_t,\n        lrnMode: cuda_types::cudnn9::cudnnLRNMode_t,\n        alpha: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        dxDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDivisiveNormalizationBackward(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        normDesc: cuda_types::cudnn9::cudnnLRNDescriptor_t,\n        mode: cuda_types::cudnn9::cudnnDivNormMode_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        means: *const ::core::ffi::c_void,\n        dy: *const ::core::ffi::c_void,\n        temp: *mut ::core::ffi::c_void,\n        temp2: *mut ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        dXdMeansDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n        dMeans: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetBatchNormalizationForwardTrainingExWorkspaceSize(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        mode: cuda_types::cudnn9::cudnnBatchNormMode_t,\n        bnOps: cuda_types::cudnn9::cudnnBatchNormOps_t,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        zDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        bnScaleBiasMeanVarDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n        sizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetBatchNormalizationBackwardExWorkspaceSize(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        mode: cuda_types::cudnn9::cudnnBatchNormMode_t,\n        bnOps: cuda_types::cudnn9::cudnnBatchNormOps_t,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dzDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dxDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dBnScaleBiasDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n        sizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetBatchNormalizationTrainingExReserveSpaceSize(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        mode: cuda_types::cudnn9::cudnnBatchNormMode_t,\n        bnOps: cuda_types::cudnn9::cudnnBatchNormOps_t,\n        activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        sizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnBatchNormalizationForwardTraining(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        mode: cuda_types::cudnn9::cudnnBatchNormMode_t,\n        alpha: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        bnScaleBiasMeanVarDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        bnScale: *const ::core::ffi::c_void,\n        bnBias: *const ::core::ffi::c_void,\n        exponentialAverageFactor: f64,\n        resultRunningMean: *mut ::core::ffi::c_void,\n        resultRunningVariance: *mut ::core::ffi::c_void,\n        epsilon: f64,\n        resultSaveMean: *mut ::core::ffi::c_void,\n        resultSaveInvVariance: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnBatchNormalizationForwardTrainingEx(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        mode: cuda_types::cudnn9::cudnnBatchNormMode_t,\n        bnOps: cuda_types::cudnn9::cudnnBatchNormOps_t,\n        alpha: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        xData: *const ::core::ffi::c_void,\n        zDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        zData: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        yData: *mut ::core::ffi::c_void,\n        bnScaleBiasMeanVarDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        bnScale: *const ::core::ffi::c_void,\n        bnBias: *const ::core::ffi::c_void,\n        exponentialAverageFactor: f64,\n        resultRunningMean: *mut ::core::ffi::c_void,\n        resultRunningVariance: *mut ::core::ffi::c_void,\n        epsilon: f64,\n        resultSaveMean: *mut ::core::ffi::c_void,\n        resultSaveInvVariance: *mut ::core::ffi::c_void,\n        activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n        workspace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnBatchNormalizationBackward(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        mode: cuda_types::cudnn9::cudnnBatchNormMode_t,\n        alphaDataDiff: *const ::core::ffi::c_void,\n        betaDataDiff: *const ::core::ffi::c_void,\n        alphaParamDiff: *const ::core::ffi::c_void,\n        betaParamDiff: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        dxDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n        dBnScaleBiasDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        bnScale: *const ::core::ffi::c_void,\n        dBnScaleResult: *mut ::core::ffi::c_void,\n        dBnBiasResult: *mut ::core::ffi::c_void,\n        epsilon: f64,\n        savedMean: *const ::core::ffi::c_void,\n        savedInvVariance: *const ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnBatchNormalizationBackwardEx(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        mode: cuda_types::cudnn9::cudnnBatchNormMode_t,\n        bnOps: cuda_types::cudnn9::cudnnBatchNormOps_t,\n        alphaDataDiff: *const ::core::ffi::c_void,\n        betaDataDiff: *const ::core::ffi::c_void,\n        alphaParamDiff: *const ::core::ffi::c_void,\n        betaParamDiff: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        xData: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        yData: *const ::core::ffi::c_void,\n        dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dyData: *const ::core::ffi::c_void,\n        dzDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dzData: *mut ::core::ffi::c_void,\n        dxDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dxData: *mut ::core::ffi::c_void,\n        dBnScaleBiasDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        bnScaleData: *const ::core::ffi::c_void,\n        bnBiasData: *const ::core::ffi::c_void,\n        dBnScaleData: *mut ::core::ffi::c_void,\n        dBnBiasData: *mut ::core::ffi::c_void,\n        epsilon: f64,\n        savedMean: *const ::core::ffi::c_void,\n        savedInvVariance: *const ::core::ffi::c_void,\n        activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetNormalizationForwardTrainingWorkspaceSize(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        mode: cuda_types::cudnn9::cudnnNormMode_t,\n        normOps: cuda_types::cudnn9::cudnnNormOps_t,\n        algo: cuda_types::cudnn9::cudnnNormAlgo_t,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        zDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        normScaleBiasDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n        normMeanVarDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        sizeInBytes: *mut usize,\n        groupCnt: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetNormalizationBackwardWorkspaceSize(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        mode: cuda_types::cudnn9::cudnnNormMode_t,\n        normOps: cuda_types::cudnn9::cudnnNormOps_t,\n        algo: cuda_types::cudnn9::cudnnNormAlgo_t,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dzDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dxDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dNormScaleBiasDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n        normMeanVarDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        sizeInBytes: *mut usize,\n        groupCnt: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetNormalizationTrainingReserveSpaceSize(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        mode: cuda_types::cudnn9::cudnnNormMode_t,\n        normOps: cuda_types::cudnn9::cudnnNormOps_t,\n        algo: cuda_types::cudnn9::cudnnNormAlgo_t,\n        activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        sizeInBytes: *mut usize,\n        groupCnt: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnNormalizationForwardTraining(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        mode: cuda_types::cudnn9::cudnnNormMode_t,\n        normOps: cuda_types::cudnn9::cudnnNormOps_t,\n        algo: cuda_types::cudnn9::cudnnNormAlgo_t,\n        alpha: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        xData: *const ::core::ffi::c_void,\n        normScaleBiasDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        normScale: *const ::core::ffi::c_void,\n        normBias: *const ::core::ffi::c_void,\n        exponentialAverageFactor: f64,\n        normMeanVarDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        resultRunningMean: *mut ::core::ffi::c_void,\n        resultRunningVariance: *mut ::core::ffi::c_void,\n        epsilon: f64,\n        resultSaveMean: *mut ::core::ffi::c_void,\n        resultSaveInvVariance: *mut ::core::ffi::c_void,\n        activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n        zDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        zData: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        yData: *mut ::core::ffi::c_void,\n        workspace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n        groupCnt: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnNormalizationBackward(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        mode: cuda_types::cudnn9::cudnnNormMode_t,\n        normOps: cuda_types::cudnn9::cudnnNormOps_t,\n        algo: cuda_types::cudnn9::cudnnNormAlgo_t,\n        alphaDataDiff: *const ::core::ffi::c_void,\n        betaDataDiff: *const ::core::ffi::c_void,\n        alphaParamDiff: *const ::core::ffi::c_void,\n        betaParamDiff: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        xData: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        yData: *const ::core::ffi::c_void,\n        dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dyData: *const ::core::ffi::c_void,\n        dzDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dzData: *mut ::core::ffi::c_void,\n        dxDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dxData: *mut ::core::ffi::c_void,\n        dNormScaleBiasDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        normScaleData: *const ::core::ffi::c_void,\n        normBiasData: *const ::core::ffi::c_void,\n        dNormScaleData: *mut ::core::ffi::c_void,\n        dNormBiasData: *mut ::core::ffi::c_void,\n        epsilon: f64,\n        normMeanVarDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        savedMean: *const ::core::ffi::c_void,\n        savedInvVariance: *const ::core::ffi::c_void,\n        activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n        groupCnt: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSpatialTfGridGeneratorBackward(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        stDesc: cuda_types::cudnn9::cudnnSpatialTransformerDescriptor_t,\n        dgrid: *const ::core::ffi::c_void,\n        dtheta: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSpatialTfSamplerBackward(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        stDesc: cuda_types::cudnn9::cudnnSpatialTransformerDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        dxDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n        alphaDgrid: *const ::core::ffi::c_void,\n        dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        grid: *const ::core::ffi::c_void,\n        betaDgrid: *const ::core::ffi::c_void,\n        dgrid: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDropoutBackward(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        dropoutDesc: cuda_types::cudnn9::cudnnDropoutDescriptor_t,\n        dydesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        dxdesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n        reserveSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateRNNDescriptor(\n        rnnDesc: *mut cuda_types::cudnn9::cudnnRNNDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyRNNDescriptor(\n        rnnDesc: cuda_types::cudnn9::cudnnRNNDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetRNNDescriptor_v8(\n        rnnDesc: cuda_types::cudnn9::cudnnRNNDescriptor_t,\n        algo: cuda_types::cudnn9::cudnnRNNAlgo_t,\n        cellMode: cuda_types::cudnn9::cudnnRNNMode_t,\n        biasMode: cuda_types::cudnn9::cudnnRNNBiasMode_t,\n        dirMode: cuda_types::cudnn9::cudnnDirectionMode_t,\n        inputMode: cuda_types::cudnn9::cudnnRNNInputMode_t,\n        dataType: cuda_types::cudnn9::cudnnDataType_t,\n        mathPrec: cuda_types::cudnn9::cudnnDataType_t,\n        mathType: cuda_types::cudnn9::cudnnMathType_t,\n        inputSize: i32,\n        hiddenSize: i32,\n        projSize: i32,\n        numLayers: i32,\n        dropoutDesc: cuda_types::cudnn9::cudnnDropoutDescriptor_t,\n        auxFlags: u32,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetRNNDescriptor_v8(\n        rnnDesc: cuda_types::cudnn9::cudnnRNNDescriptor_t,\n        algo: *mut cuda_types::cudnn9::cudnnRNNAlgo_t,\n        cellMode: *mut cuda_types::cudnn9::cudnnRNNMode_t,\n        biasMode: *mut cuda_types::cudnn9::cudnnRNNBiasMode_t,\n        dirMode: *mut cuda_types::cudnn9::cudnnDirectionMode_t,\n        inputMode: *mut cuda_types::cudnn9::cudnnRNNInputMode_t,\n        dataType: *mut cuda_types::cudnn9::cudnnDataType_t,\n        mathPrec: *mut cuda_types::cudnn9::cudnnDataType_t,\n        mathType: *mut cuda_types::cudnn9::cudnnMathType_t,\n        inputSize: *mut i32,\n        hiddenSize: *mut i32,\n        projSize: *mut i32,\n        numLayers: *mut i32,\n        dropoutDesc: *mut cuda_types::cudnn9::cudnnDropoutDescriptor_t,\n        auxFlags: *mut u32,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnRNNSetClip_v8(\n        rnnDesc: cuda_types::cudnn9::cudnnRNNDescriptor_t,\n        clipMode: cuda_types::cudnn9::cudnnRNNClipMode_t,\n        clipNanOpt: cuda_types::cudnn9::cudnnNanPropagation_t,\n        lclip: f64,\n        rclip: f64,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnRNNSetClip_v9(\n        rnnDesc: cuda_types::cudnn9::cudnnRNNDescriptor_t,\n        clipMode: cuda_types::cudnn9::cudnnRNNClipMode_t,\n        lclip: f64,\n        rclip: f64,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnRNNGetClip_v8(\n        rnnDesc: cuda_types::cudnn9::cudnnRNNDescriptor_t,\n        clipMode: *mut cuda_types::cudnn9::cudnnRNNClipMode_t,\n        clipNanOpt: *mut cuda_types::cudnn9::cudnnNanPropagation_t,\n        lclip: *mut f64,\n        rclip: *mut f64,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnRNNGetClip_v9(\n        rnnDesc: cuda_types::cudnn9::cudnnRNNDescriptor_t,\n        clipMode: *mut cuda_types::cudnn9::cudnnRNNClipMode_t,\n        lclip: *mut f64,\n        rclip: *mut f64,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnBuildRNNDynamic(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn9::cudnnRNNDescriptor_t,\n        miniBatch: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetRNNTempSpaceSizes(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn9::cudnnRNNDescriptor_t,\n        fwdMode: cuda_types::cudnn9::cudnnForwardMode_t,\n        xDesc: cuda_types::cudnn9::cudnnRNNDataDescriptor_t,\n        workSpaceSize: *mut usize,\n        reserveSpaceSize: *mut usize,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetRNNWeightSpaceSize(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn9::cudnnRNNDescriptor_t,\n        weightSpaceSize: *mut usize,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetRNNWeightParams(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn9::cudnnRNNDescriptor_t,\n        pseudoLayer: i32,\n        weightSpaceSize: usize,\n        weightSpace: *const ::core::ffi::c_void,\n        linLayerID: i32,\n        mDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        mAddr: *mut *mut ::core::ffi::c_void,\n        bDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        bAddr: *mut *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateRNNDataDescriptor(\n        rnnDataDesc: *mut cuda_types::cudnn9::cudnnRNNDataDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyRNNDataDescriptor(\n        rnnDataDesc: cuda_types::cudnn9::cudnnRNNDataDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetRNNDataDescriptor(\n        rnnDataDesc: cuda_types::cudnn9::cudnnRNNDataDescriptor_t,\n        dataType: cuda_types::cudnn9::cudnnDataType_t,\n        layout: cuda_types::cudnn9::cudnnRNNDataLayout_t,\n        maxSeqLength: ::core::ffi::c_int,\n        batchSize: ::core::ffi::c_int,\n        vectorSize: ::core::ffi::c_int,\n        seqLengthArray: *const ::core::ffi::c_int,\n        paddingFill: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetRNNDataDescriptor(\n        rnnDataDesc: cuda_types::cudnn9::cudnnRNNDataDescriptor_t,\n        dataType: *mut cuda_types::cudnn9::cudnnDataType_t,\n        layout: *mut cuda_types::cudnn9::cudnnRNNDataLayout_t,\n        maxSeqLength: *mut ::core::ffi::c_int,\n        batchSize: *mut ::core::ffi::c_int,\n        vectorSize: *mut ::core::ffi::c_int,\n        arrayLengthRequested: ::core::ffi::c_int,\n        seqLengthArray: *mut ::core::ffi::c_int,\n        paddingFill: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnRNNForward(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn9::cudnnRNNDescriptor_t,\n        fwdMode: cuda_types::cudnn9::cudnnForwardMode_t,\n        devSeqLengths: *const i32,\n        xDesc: cuda_types::cudnn9::cudnnRNNDataDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn9::cudnnRNNDataDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        hDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        hx: *const ::core::ffi::c_void,\n        hy: *mut ::core::ffi::c_void,\n        cDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        cx: *const ::core::ffi::c_void,\n        cy: *mut ::core::ffi::c_void,\n        weightSpaceSize: usize,\n        weightSpace: *const ::core::ffi::c_void,\n        workSpaceSize: usize,\n        workSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSize: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateSeqDataDescriptor(\n        seqDataDesc: *mut cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroySeqDataDescriptor(\n        seqDataDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetSeqDataDescriptor(\n        seqDataDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n        dataType: cuda_types::cudnn9::cudnnDataType_t,\n        nbDims: ::core::ffi::c_int,\n        dimA: *const ::core::ffi::c_int,\n        axes: *const cuda_types::cudnn9::cudnnSeqDataAxis_t,\n        seqLengthArraySize: usize,\n        seqLengthArray: *const ::core::ffi::c_int,\n        paddingFill: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetSeqDataDescriptor(\n        seqDataDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n        dataType: *mut cuda_types::cudnn9::cudnnDataType_t,\n        nbDims: *mut ::core::ffi::c_int,\n        nbDimsRequested: ::core::ffi::c_int,\n        dimA: *mut ::core::ffi::c_int,\n        axes: *mut cuda_types::cudnn9::cudnnSeqDataAxis_t,\n        seqLengthArraySize: *mut usize,\n        seqLengthSizeRequested: usize,\n        seqLengthArray: *mut ::core::ffi::c_int,\n        paddingFill: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateAttnDescriptor(\n        attnDesc: *mut cuda_types::cudnn9::cudnnAttnDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyAttnDescriptor(\n        attnDesc: cuda_types::cudnn9::cudnnAttnDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetAttnDescriptor(\n        attnDesc: cuda_types::cudnn9::cudnnAttnDescriptor_t,\n        attnMode: ::core::ffi::c_uint,\n        nHeads: ::core::ffi::c_int,\n        smScaler: f64,\n        dataType: cuda_types::cudnn9::cudnnDataType_t,\n        computePrec: cuda_types::cudnn9::cudnnDataType_t,\n        mathType: cuda_types::cudnn9::cudnnMathType_t,\n        attnDropoutDesc: cuda_types::cudnn9::cudnnDropoutDescriptor_t,\n        postDropoutDesc: cuda_types::cudnn9::cudnnDropoutDescriptor_t,\n        qSize: ::core::ffi::c_int,\n        kSize: ::core::ffi::c_int,\n        vSize: ::core::ffi::c_int,\n        qProjSize: ::core::ffi::c_int,\n        kProjSize: ::core::ffi::c_int,\n        vProjSize: ::core::ffi::c_int,\n        oProjSize: ::core::ffi::c_int,\n        qoMaxSeqLength: ::core::ffi::c_int,\n        kvMaxSeqLength: ::core::ffi::c_int,\n        maxBatchSize: ::core::ffi::c_int,\n        maxBeamSize: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetAttnDescriptor(\n        attnDesc: cuda_types::cudnn9::cudnnAttnDescriptor_t,\n        attnMode: *mut ::core::ffi::c_uint,\n        nHeads: *mut ::core::ffi::c_int,\n        smScaler: *mut f64,\n        dataType: *mut cuda_types::cudnn9::cudnnDataType_t,\n        computePrec: *mut cuda_types::cudnn9::cudnnDataType_t,\n        mathType: *mut cuda_types::cudnn9::cudnnMathType_t,\n        attnDropoutDesc: *mut cuda_types::cudnn9::cudnnDropoutDescriptor_t,\n        postDropoutDesc: *mut cuda_types::cudnn9::cudnnDropoutDescriptor_t,\n        qSize: *mut ::core::ffi::c_int,\n        kSize: *mut ::core::ffi::c_int,\n        vSize: *mut ::core::ffi::c_int,\n        qProjSize: *mut ::core::ffi::c_int,\n        kProjSize: *mut ::core::ffi::c_int,\n        vProjSize: *mut ::core::ffi::c_int,\n        oProjSize: *mut ::core::ffi::c_int,\n        qoMaxSeqLength: *mut ::core::ffi::c_int,\n        kvMaxSeqLength: *mut ::core::ffi::c_int,\n        maxBatchSize: *mut ::core::ffi::c_int,\n        maxBeamSize: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetMultiHeadAttnBuffers(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        attnDesc: cuda_types::cudnn9::cudnnAttnDescriptor_t,\n        weightSizeInBytes: *mut usize,\n        workSpaceSizeInBytes: *mut usize,\n        reserveSpaceSizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetMultiHeadAttnWeights(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        attnDesc: cuda_types::cudnn9::cudnnAttnDescriptor_t,\n        wKind: cuda_types::cudnn9::cudnnMultiHeadAttnWeightKind_t,\n        weightSizeInBytes: usize,\n        weights: *const ::core::ffi::c_void,\n        wDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        wAddr: *mut *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnMultiHeadAttnForward(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        attnDesc: cuda_types::cudnn9::cudnnAttnDescriptor_t,\n        currIdx: ::core::ffi::c_int,\n        loWinIdx: *const ::core::ffi::c_int,\n        hiWinIdx: *const ::core::ffi::c_int,\n        devSeqLengthsQO: *const ::core::ffi::c_int,\n        devSeqLengthsKV: *const ::core::ffi::c_int,\n        qDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n        queries: *const ::core::ffi::c_void,\n        residuals: *const ::core::ffi::c_void,\n        kDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n        keys: *const ::core::ffi::c_void,\n        vDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n        values: *const ::core::ffi::c_void,\n        oDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n        out: *mut ::core::ffi::c_void,\n        weightSizeInBytes: usize,\n        weights: *const ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        workSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnAdvVersionCheck() -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnRNNBackwardData_v8(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn9::cudnnRNNDescriptor_t,\n        devSeqLengths: *const i32,\n        yDesc: cuda_types::cudnn9::cudnnRNNDataDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        dy: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn9::cudnnRNNDataDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n        hDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        hx: *const ::core::ffi::c_void,\n        dhy: *const ::core::ffi::c_void,\n        dhx: *mut ::core::ffi::c_void,\n        cDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        cx: *const ::core::ffi::c_void,\n        dcy: *const ::core::ffi::c_void,\n        dcx: *mut ::core::ffi::c_void,\n        weightSpaceSize: usize,\n        weightSpace: *const ::core::ffi::c_void,\n        workSpaceSize: usize,\n        workSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSize: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnRNNBackwardWeights_v8(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        rnnDesc: cuda_types::cudnn9::cudnnRNNDescriptor_t,\n        addGrad: cuda_types::cudnn9::cudnnWgradMode_t,\n        devSeqLengths: *const i32,\n        xDesc: cuda_types::cudnn9::cudnnRNNDataDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        hDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        hx: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn9::cudnnRNNDataDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        weightSpaceSize: usize,\n        dweightSpace: *mut ::core::ffi::c_void,\n        workSpaceSize: usize,\n        workSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSize: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnMultiHeadAttnBackwardData(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        attnDesc: cuda_types::cudnn9::cudnnAttnDescriptor_t,\n        loWinIdx: *const ::core::ffi::c_int,\n        hiWinIdx: *const ::core::ffi::c_int,\n        devSeqLengthsDQDO: *const ::core::ffi::c_int,\n        devSeqLengthsDKDV: *const ::core::ffi::c_int,\n        doDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n        dout: *const ::core::ffi::c_void,\n        dqDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n        dqueries: *mut ::core::ffi::c_void,\n        queries: *const ::core::ffi::c_void,\n        dkDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n        dkeys: *mut ::core::ffi::c_void,\n        keys: *const ::core::ffi::c_void,\n        dvDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n        dvalues: *mut ::core::ffi::c_void,\n        values: *const ::core::ffi::c_void,\n        weightSizeInBytes: usize,\n        weights: *const ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        workSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnMultiHeadAttnBackwardWeights(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        attnDesc: cuda_types::cudnn9::cudnnAttnDescriptor_t,\n        addGrad: cuda_types::cudnn9::cudnnWgradMode_t,\n        qDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n        queries: *const ::core::ffi::c_void,\n        kDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n        keys: *const ::core::ffi::c_void,\n        vDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n        values: *const ::core::ffi::c_void,\n        doDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n        dout: *const ::core::ffi::c_void,\n        weightSizeInBytes: usize,\n        weights: *const ::core::ffi::c_void,\n        dweights: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        workSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateCTCLossDescriptor(\n        ctcLossDesc: *mut cuda_types::cudnn9::cudnnCTCLossDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetCTCLossDescriptor(\n        ctcLossDesc: cuda_types::cudnn9::cudnnCTCLossDescriptor_t,\n        compType: cuda_types::cudnn9::cudnnDataType_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetCTCLossDescriptorEx(\n        ctcLossDesc: cuda_types::cudnn9::cudnnCTCLossDescriptor_t,\n        compType: cuda_types::cudnn9::cudnnDataType_t,\n        normMode: cuda_types::cudnn9::cudnnLossNormalizationMode_t,\n        gradMode: cuda_types::cudnn9::cudnnNanPropagation_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetCTCLossDescriptor_v8(\n        ctcLossDesc: cuda_types::cudnn9::cudnnCTCLossDescriptor_t,\n        compType: cuda_types::cudnn9::cudnnDataType_t,\n        normMode: cuda_types::cudnn9::cudnnLossNormalizationMode_t,\n        gradMode: cuda_types::cudnn9::cudnnNanPropagation_t,\n        maxLabelLength: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetCTCLossDescriptor_v9(\n        ctcLossDesc: cuda_types::cudnn9::cudnnCTCLossDescriptor_t,\n        compType: cuda_types::cudnn9::cudnnDataType_t,\n        normMode: cuda_types::cudnn9::cudnnLossNormalizationMode_t,\n        ctcGradMode: cuda_types::cudnn9::cudnnCTCGradMode_t,\n        maxLabelLength: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetCTCLossDescriptor(\n        ctcLossDesc: cuda_types::cudnn9::cudnnCTCLossDescriptor_t,\n        compType: *mut cuda_types::cudnn9::cudnnDataType_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetCTCLossDescriptorEx(\n        ctcLossDesc: cuda_types::cudnn9::cudnnCTCLossDescriptor_t,\n        compType: *mut cuda_types::cudnn9::cudnnDataType_t,\n        normMode: *mut cuda_types::cudnn9::cudnnLossNormalizationMode_t,\n        gradMode: *mut cuda_types::cudnn9::cudnnNanPropagation_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetCTCLossDescriptor_v8(\n        ctcLossDesc: cuda_types::cudnn9::cudnnCTCLossDescriptor_t,\n        compType: *mut cuda_types::cudnn9::cudnnDataType_t,\n        normMode: *mut cuda_types::cudnn9::cudnnLossNormalizationMode_t,\n        gradMode: *mut cuda_types::cudnn9::cudnnNanPropagation_t,\n        maxLabelLength: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetCTCLossDescriptor_v9(\n        ctcLossDesc: cuda_types::cudnn9::cudnnCTCLossDescriptor_t,\n        compType: *mut cuda_types::cudnn9::cudnnDataType_t,\n        normMode: *mut cuda_types::cudnn9::cudnnLossNormalizationMode_t,\n        ctcGradMode: *mut cuda_types::cudnn9::cudnnCTCGradMode_t,\n        maxLabelLength: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyCTCLossDescriptor(\n        ctcLossDesc: cuda_types::cudnn9::cudnnCTCLossDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCTCLoss(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        probsDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        probs: *const ::core::ffi::c_void,\n        hostLabels: *const ::core::ffi::c_int,\n        hostLabelLengths: *const ::core::ffi::c_int,\n        hostInputLengths: *const ::core::ffi::c_int,\n        costs: *mut ::core::ffi::c_void,\n        gradientsDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        gradients: *mut ::core::ffi::c_void,\n        algo: cuda_types::cudnn9::cudnnCTCLossAlgo_t,\n        ctcLossDesc: cuda_types::cudnn9::cudnnCTCLossDescriptor_t,\n        workspace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCTCLoss_v8(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        algo: cuda_types::cudnn9::cudnnCTCLossAlgo_t,\n        ctcLossDesc: cuda_types::cudnn9::cudnnCTCLossDescriptor_t,\n        probsDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        probs: *const ::core::ffi::c_void,\n        labels: *const ::core::ffi::c_int,\n        labelLengths: *const ::core::ffi::c_int,\n        inputLengths: *const ::core::ffi::c_int,\n        costs: *mut ::core::ffi::c_void,\n        gradientsDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        gradients: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        workspace: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetCTCLossWorkspaceSize(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        probsDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        gradientsDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        labels: *const ::core::ffi::c_int,\n        labelLengths: *const ::core::ffi::c_int,\n        inputLengths: *const ::core::ffi::c_int,\n        algo: cuda_types::cudnn9::cudnnCTCLossAlgo_t,\n        ctcLossDesc: cuda_types::cudnn9::cudnnCTCLossDescriptor_t,\n        sizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetCTCLossWorkspaceSize_v8(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        algo: cuda_types::cudnn9::cudnnCTCLossAlgo_t,\n        ctcLossDesc: cuda_types::cudnn9::cudnnCTCLossDescriptor_t,\n        probsDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        gradientsDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        sizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateConvolutionDescriptor(\n        convDesc: *mut cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyConvolutionDescriptor(\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetConvolutionMathType(\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        mathType: cuda_types::cudnn9::cudnnMathType_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolutionMathType(\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        mathType: *mut cuda_types::cudnn9::cudnnMathType_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetConvolutionGroupCount(\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        groupCount: ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolutionGroupCount(\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        groupCount: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetConvolutionReorderType(\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        reorderType: cuda_types::cudnn9::cudnnReorderType_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolutionReorderType(\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        reorderType: *mut cuda_types::cudnn9::cudnnReorderType_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetConvolution2dDescriptor(\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        pad_h: ::core::ffi::c_int,\n        pad_w: ::core::ffi::c_int,\n        u: ::core::ffi::c_int,\n        v: ::core::ffi::c_int,\n        dilation_h: ::core::ffi::c_int,\n        dilation_w: ::core::ffi::c_int,\n        mode: cuda_types::cudnn9::cudnnConvolutionMode_t,\n        computeType: cuda_types::cudnn9::cudnnDataType_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolution2dDescriptor(\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        pad_h: *mut ::core::ffi::c_int,\n        pad_w: *mut ::core::ffi::c_int,\n        u: *mut ::core::ffi::c_int,\n        v: *mut ::core::ffi::c_int,\n        dilation_h: *mut ::core::ffi::c_int,\n        dilation_w: *mut ::core::ffi::c_int,\n        mode: *mut cuda_types::cudnn9::cudnnConvolutionMode_t,\n        computeType: *mut cuda_types::cudnn9::cudnnDataType_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetConvolutionNdDescriptor(\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        arrayLength: ::core::ffi::c_int,\n        padA: *const ::core::ffi::c_int,\n        filterStrideA: *const ::core::ffi::c_int,\n        dilationA: *const ::core::ffi::c_int,\n        mode: cuda_types::cudnn9::cudnnConvolutionMode_t,\n        computeType: cuda_types::cudnn9::cudnnDataType_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolutionNdDescriptor(\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        arrayLengthRequested: ::core::ffi::c_int,\n        arrayLength: *mut ::core::ffi::c_int,\n        padA: *mut ::core::ffi::c_int,\n        strideA: *mut ::core::ffi::c_int,\n        dilationA: *mut ::core::ffi::c_int,\n        mode: *mut cuda_types::cudnn9::cudnnConvolutionMode_t,\n        computeType: *mut cuda_types::cudnn9::cudnnDataType_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolution2dForwardOutputDim(\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        inputTensorDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        filterDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        n: *mut ::core::ffi::c_int,\n        c: *mut ::core::ffi::c_int,\n        h: *mut ::core::ffi::c_int,\n        w: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolutionNdForwardOutputDim(\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        inputTensorDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        filterDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        nbDims: ::core::ffi::c_int,\n        tensorOuputDimA: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolutionForwardAlgorithmMaxCount(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        count: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolutionForwardAlgorithm_v7(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        srcDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        filterDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        destDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        requestedAlgoCount: ::core::ffi::c_int,\n        returnedAlgoCount: *mut ::core::ffi::c_int,\n        perfResults: *mut cuda_types::cudnn9::cudnnConvolutionFwdAlgoPerf_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnFindConvolutionForwardAlgorithm(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        wDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        requestedAlgoCount: ::core::ffi::c_int,\n        returnedAlgoCount: *mut ::core::ffi::c_int,\n        perfResults: *mut cuda_types::cudnn9::cudnnConvolutionFwdAlgoPerf_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnFindConvolutionForwardAlgorithmEx(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        wDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        requestedAlgoCount: ::core::ffi::c_int,\n        returnedAlgoCount: *mut ::core::ffi::c_int,\n        perfResults: *mut cuda_types::cudnn9::cudnnConvolutionFwdAlgoPerf_t,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnIm2Col(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        wDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        colBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnReorderFilterAndBias(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        filterDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        reorderType: cuda_types::cudnn9::cudnnReorderType_t,\n        filterData: *const ::core::ffi::c_void,\n        reorderedFilterData: *mut ::core::ffi::c_void,\n        reorderBias: ::core::ffi::c_int,\n        biasData: *const ::core::ffi::c_void,\n        reorderedBiasData: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolutionForwardWorkspaceSize(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        wDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        algo: cuda_types::cudnn9::cudnnConvolutionFwdAlgo_t,\n        sizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnConvolutionForward(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        wDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        algo: cuda_types::cudnn9::cudnnConvolutionFwdAlgo_t,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        beta: *const ::core::ffi::c_void,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnConvolutionBiasActivationForward(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        alpha1: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        wDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        algo: cuda_types::cudnn9::cudnnConvolutionFwdAlgo_t,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        alpha2: *const ::core::ffi::c_void,\n        zDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        z: *const ::core::ffi::c_void,\n        biasDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        bias: *const ::core::ffi::c_void,\n        activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n        yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolutionBackwardDataAlgorithmMaxCount(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        count: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnFindConvolutionBackwardDataAlgorithm(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        wDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        dxDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        requestedAlgoCount: ::core::ffi::c_int,\n        returnedAlgoCount: *mut ::core::ffi::c_int,\n        perfResults: *mut cuda_types::cudnn9::cudnnConvolutionBwdDataAlgoPerf_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnFindConvolutionBackwardDataAlgorithmEx(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        wDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        dxDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n        requestedAlgoCount: ::core::ffi::c_int,\n        returnedAlgoCount: *mut ::core::ffi::c_int,\n        perfResults: *mut cuda_types::cudnn9::cudnnConvolutionBwdDataAlgoPerf_t,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolutionBackwardDataAlgorithm_v7(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        filterDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        diffDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        gradDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        requestedAlgoCount: ::core::ffi::c_int,\n        returnedAlgoCount: *mut ::core::ffi::c_int,\n        perfResults: *mut cuda_types::cudnn9::cudnnConvolutionBwdDataAlgoPerf_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolutionBackwardDataWorkspaceSize(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        wDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        dxDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        algo: cuda_types::cudnn9::cudnnConvolutionBwdDataAlgo_t,\n        sizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnConvolutionBackwardData(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        alpha: *const ::core::ffi::c_void,\n        wDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        algo: cuda_types::cudnn9::cudnnConvolutionBwdDataAlgo_t,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        beta: *const ::core::ffi::c_void,\n        dxDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetFoldedConvBackwardDataDescriptors(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        filterDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        diffDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        gradDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        transformFormat: cuda_types::cudnn9::cudnnTensorFormat_t,\n        foldedFilterDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        paddedDiffDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        foldedConvDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        foldedGradDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        filterFoldTransDesc: cuda_types::cudnn9::cudnnTensorTransformDescriptor_t,\n        diffPadTransDesc: cuda_types::cudnn9::cudnnTensorTransformDescriptor_t,\n        gradFoldTransDesc: cuda_types::cudnn9::cudnnTensorTransformDescriptor_t,\n        gradUnfoldTransDesc: cuda_types::cudnn9::cudnnTensorTransformDescriptor_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCnnVersionCheck() -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolutionBackwardFilterAlgorithmMaxCount(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        count: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnFindConvolutionBackwardFilterAlgorithm(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        dwDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        requestedAlgoCount: ::core::ffi::c_int,\n        returnedAlgoCount: *mut ::core::ffi::c_int,\n        perfResults: *mut cuda_types::cudnn9::cudnnConvolutionBwdFilterAlgoPerf_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnFindConvolutionBackwardFilterAlgorithmEx(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        dwDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        dw: *mut ::core::ffi::c_void,\n        requestedAlgoCount: ::core::ffi::c_int,\n        returnedAlgoCount: *mut ::core::ffi::c_int,\n        perfResults: *mut cuda_types::cudnn9::cudnnConvolutionBwdFilterAlgoPerf_t,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolutionBackwardFilterAlgorithm_v7(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        srcDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        diffDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        gradDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        requestedAlgoCount: ::core::ffi::c_int,\n        returnedAlgoCount: *mut ::core::ffi::c_int,\n        perfResults: *mut cuda_types::cudnn9::cudnnConvolutionBwdFilterAlgoPerf_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetConvolutionBackwardFilterWorkspaceSize(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        gradDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        algo: cuda_types::cudnn9::cudnnConvolutionBwdFilterAlgo_t,\n        sizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnConvolutionBackwardFilter(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n        algo: cuda_types::cudnn9::cudnnConvolutionBwdFilterAlgo_t,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSizeInBytes: usize,\n        beta: *const ::core::ffi::c_void,\n        dwDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n        dw: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnConvolutionBackwardBias(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        alpha: *const ::core::ffi::c_void,\n        dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        dbDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n        db: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateFusedOpsConstParamPack(\n        constPack: *mut cuda_types::cudnn9::cudnnFusedOpsConstParamPack_t,\n        ops: cuda_types::cudnn9::cudnnFusedOps_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyFusedOpsConstParamPack(\n        constPack: cuda_types::cudnn9::cudnnFusedOpsConstParamPack_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetFusedOpsConstParamPackAttribute(\n        constPack: cuda_types::cudnn9::cudnnFusedOpsConstParamPack_t,\n        paramLabel: cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t,\n        param: *const ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetFusedOpsConstParamPackAttribute(\n        constPack: cuda_types::cudnn9::cudnnFusedOpsConstParamPack_t,\n        paramLabel: cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t,\n        param: *mut ::core::ffi::c_void,\n        isNULL: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateFusedOpsVariantParamPack(\n        varPack: *mut cuda_types::cudnn9::cudnnFusedOpsVariantParamPack_t,\n        ops: cuda_types::cudnn9::cudnnFusedOps_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyFusedOpsVariantParamPack(\n        varPack: cuda_types::cudnn9::cudnnFusedOpsVariantParamPack_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnSetFusedOpsVariantParamPackAttribute(\n        varPack: cuda_types::cudnn9::cudnnFusedOpsVariantParamPack_t,\n        paramLabel: cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t,\n        ptr: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnGetFusedOpsVariantParamPackAttribute(\n        varPack: cuda_types::cudnn9::cudnnFusedOpsVariantParamPack_t,\n        paramLabel: cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t,\n        ptr: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnCreateFusedOpsPlan(\n        plan: *mut cuda_types::cudnn9::cudnnFusedOpsPlan_t,\n        ops: cuda_types::cudnn9::cudnnFusedOps_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnDestroyFusedOpsPlan(\n        plan: cuda_types::cudnn9::cudnnFusedOpsPlan_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnMakeFusedOpsPlan(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        plan: cuda_types::cudnn9::cudnnFusedOpsPlan_t,\n        constPack: cuda_types::cudnn9::cudnnFusedOpsConstParamPack_t,\n        workspaceSizeInBytes: *mut usize,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n    #[must_use]\n    fn cudnnFusedOpsExecute(\n        handle: cuda_types::cudnn9::cudnnHandle_t,\n        plan: cuda_types::cudnn9::cudnnFusedOpsPlan_t,\n        varPack: cuda_types::cudnn9::cudnnFusedOpsVariantParamPack_t,\n    ) -> cuda_types::cudnn9::cudnnStatus_t;\n}\n"
  },
  {
    "path": "cuda_macros/src/cufft.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\nextern \"system\" {\n    fn cufftPlan1d(\n        plan: *mut cuda_types::cufft::cufftHandle,\n        nx: ::core::ffi::c_int,\n        type_: cuda_types::cufft::cufftType,\n        batch: ::core::ffi::c_int,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftPlan2d(\n        plan: *mut cuda_types::cufft::cufftHandle,\n        nx: ::core::ffi::c_int,\n        ny: ::core::ffi::c_int,\n        type_: cuda_types::cufft::cufftType,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftPlan3d(\n        plan: *mut cuda_types::cufft::cufftHandle,\n        nx: ::core::ffi::c_int,\n        ny: ::core::ffi::c_int,\n        nz: ::core::ffi::c_int,\n        type_: cuda_types::cufft::cufftType,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftPlanMany(\n        plan: *mut cuda_types::cufft::cufftHandle,\n        rank: ::core::ffi::c_int,\n        n: *mut ::core::ffi::c_int,\n        inembed: *mut ::core::ffi::c_int,\n        istride: ::core::ffi::c_int,\n        idist: ::core::ffi::c_int,\n        onembed: *mut ::core::ffi::c_int,\n        ostride: ::core::ffi::c_int,\n        odist: ::core::ffi::c_int,\n        type_: cuda_types::cufft::cufftType,\n        batch: ::core::ffi::c_int,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftMakePlan1d(\n        plan: cuda_types::cufft::cufftHandle,\n        nx: ::core::ffi::c_int,\n        type_: cuda_types::cufft::cufftType,\n        batch: ::core::ffi::c_int,\n        workSize: *mut usize,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftMakePlan2d(\n        plan: cuda_types::cufft::cufftHandle,\n        nx: ::core::ffi::c_int,\n        ny: ::core::ffi::c_int,\n        type_: cuda_types::cufft::cufftType,\n        workSize: *mut usize,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftMakePlan3d(\n        plan: cuda_types::cufft::cufftHandle,\n        nx: ::core::ffi::c_int,\n        ny: ::core::ffi::c_int,\n        nz: ::core::ffi::c_int,\n        type_: cuda_types::cufft::cufftType,\n        workSize: *mut usize,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftMakePlanMany(\n        plan: cuda_types::cufft::cufftHandle,\n        rank: ::core::ffi::c_int,\n        n: *mut ::core::ffi::c_int,\n        inembed: *mut ::core::ffi::c_int,\n        istride: ::core::ffi::c_int,\n        idist: ::core::ffi::c_int,\n        onembed: *mut ::core::ffi::c_int,\n        ostride: ::core::ffi::c_int,\n        odist: ::core::ffi::c_int,\n        type_: cuda_types::cufft::cufftType,\n        batch: ::core::ffi::c_int,\n        workSize: *mut usize,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftMakePlanMany64(\n        plan: cuda_types::cufft::cufftHandle,\n        rank: ::core::ffi::c_int,\n        n: *mut ::core::ffi::c_longlong,\n        inembed: *mut ::core::ffi::c_longlong,\n        istride: ::core::ffi::c_longlong,\n        idist: ::core::ffi::c_longlong,\n        onembed: *mut ::core::ffi::c_longlong,\n        ostride: ::core::ffi::c_longlong,\n        odist: ::core::ffi::c_longlong,\n        type_: cuda_types::cufft::cufftType,\n        batch: ::core::ffi::c_longlong,\n        workSize: *mut usize,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftGetSizeMany64(\n        plan: cuda_types::cufft::cufftHandle,\n        rank: ::core::ffi::c_int,\n        n: *mut ::core::ffi::c_longlong,\n        inembed: *mut ::core::ffi::c_longlong,\n        istride: ::core::ffi::c_longlong,\n        idist: ::core::ffi::c_longlong,\n        onembed: *mut ::core::ffi::c_longlong,\n        ostride: ::core::ffi::c_longlong,\n        odist: ::core::ffi::c_longlong,\n        type_: cuda_types::cufft::cufftType,\n        batch: ::core::ffi::c_longlong,\n        workSize: *mut usize,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftEstimate1d(\n        nx: ::core::ffi::c_int,\n        type_: cuda_types::cufft::cufftType,\n        batch: ::core::ffi::c_int,\n        workSize: *mut usize,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftEstimate2d(\n        nx: ::core::ffi::c_int,\n        ny: ::core::ffi::c_int,\n        type_: cuda_types::cufft::cufftType,\n        workSize: *mut usize,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftEstimate3d(\n        nx: ::core::ffi::c_int,\n        ny: ::core::ffi::c_int,\n        nz: ::core::ffi::c_int,\n        type_: cuda_types::cufft::cufftType,\n        workSize: *mut usize,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftEstimateMany(\n        rank: ::core::ffi::c_int,\n        n: *mut ::core::ffi::c_int,\n        inembed: *mut ::core::ffi::c_int,\n        istride: ::core::ffi::c_int,\n        idist: ::core::ffi::c_int,\n        onembed: *mut ::core::ffi::c_int,\n        ostride: ::core::ffi::c_int,\n        odist: ::core::ffi::c_int,\n        type_: cuda_types::cufft::cufftType,\n        batch: ::core::ffi::c_int,\n        workSize: *mut usize,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftCreate(\n        handle: *mut cuda_types::cufft::cufftHandle,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftGetSize1d(\n        handle: cuda_types::cufft::cufftHandle,\n        nx: ::core::ffi::c_int,\n        type_: cuda_types::cufft::cufftType,\n        batch: ::core::ffi::c_int,\n        workSize: *mut usize,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftGetSize2d(\n        handle: cuda_types::cufft::cufftHandle,\n        nx: ::core::ffi::c_int,\n        ny: ::core::ffi::c_int,\n        type_: cuda_types::cufft::cufftType,\n        workSize: *mut usize,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftGetSize3d(\n        handle: cuda_types::cufft::cufftHandle,\n        nx: ::core::ffi::c_int,\n        ny: ::core::ffi::c_int,\n        nz: ::core::ffi::c_int,\n        type_: cuda_types::cufft::cufftType,\n        workSize: *mut usize,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftGetSizeMany(\n        handle: cuda_types::cufft::cufftHandle,\n        rank: ::core::ffi::c_int,\n        n: *mut ::core::ffi::c_int,\n        inembed: *mut ::core::ffi::c_int,\n        istride: ::core::ffi::c_int,\n        idist: ::core::ffi::c_int,\n        onembed: *mut ::core::ffi::c_int,\n        ostride: ::core::ffi::c_int,\n        odist: ::core::ffi::c_int,\n        type_: cuda_types::cufft::cufftType,\n        batch: ::core::ffi::c_int,\n        workArea: *mut usize,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftGetSize(\n        handle: cuda_types::cufft::cufftHandle,\n        workSize: *mut usize,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftSetWorkArea(\n        plan: cuda_types::cufft::cufftHandle,\n        workArea: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftSetAutoAllocation(\n        plan: cuda_types::cufft::cufftHandle,\n        autoAllocate: ::core::ffi::c_int,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftExecC2C(\n        plan: cuda_types::cufft::cufftHandle,\n        idata: *mut cuda_types::cufft::cufftComplex,\n        odata: *mut cuda_types::cufft::cufftComplex,\n        direction: ::core::ffi::c_int,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftExecR2C(\n        plan: cuda_types::cufft::cufftHandle,\n        idata: *mut cuda_types::cufft::cufftReal,\n        odata: *mut cuda_types::cufft::cufftComplex,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftExecC2R(\n        plan: cuda_types::cufft::cufftHandle,\n        idata: *mut cuda_types::cufft::cufftComplex,\n        odata: *mut cuda_types::cufft::cufftReal,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftExecZ2Z(\n        plan: cuda_types::cufft::cufftHandle,\n        idata: *mut cuda_types::cufft::cufftDoubleComplex,\n        odata: *mut cuda_types::cufft::cufftDoubleComplex,\n        direction: ::core::ffi::c_int,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftExecD2Z(\n        plan: cuda_types::cufft::cufftHandle,\n        idata: *mut cuda_types::cufft::cufftDoubleReal,\n        odata: *mut cuda_types::cufft::cufftDoubleComplex,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftExecZ2D(\n        plan: cuda_types::cufft::cufftHandle,\n        idata: *mut cuda_types::cufft::cufftDoubleComplex,\n        odata: *mut cuda_types::cufft::cufftDoubleReal,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftSetStream(\n        plan: cuda_types::cufft::cufftHandle,\n        stream: cuda_types::cufft::cudaStream_t,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftDestroy(\n        plan: cuda_types::cufft::cufftHandle,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftGetVersion(\n        version: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftGetProperty(\n        type_: cuda_types::cufft::libraryPropertyType,\n        value: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftSetPlanPropertyInt64(\n        plan: cuda_types::cufft::cufftHandle,\n        property: cuda_types::cufft::cufftProperty,\n        inputValueInt: ::core::ffi::c_longlong,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftGetPlanPropertyInt64(\n        plan: cuda_types::cufft::cufftHandle,\n        property: cuda_types::cufft::cufftProperty,\n        returnPtrValue: *mut ::core::ffi::c_longlong,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftResetPlanProperty(\n        plan: cuda_types::cufft::cufftHandle,\n        property: cuda_types::cufft::cufftProperty,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftXtSetGPUs(\n        handle: cuda_types::cufft::cufftHandle,\n        nGPUs: ::core::ffi::c_int,\n        whichGPUs: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftXtMalloc(\n        plan: cuda_types::cufft::cufftHandle,\n        descriptor: *mut *mut cuda_types::cufft::cudaLibXtDesc,\n        format: cuda_types::cufft::cufftXtSubFormat,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftXtMemcpy(\n        plan: cuda_types::cufft::cufftHandle,\n        dstPointer: *mut ::core::ffi::c_void,\n        srcPointer: *mut ::core::ffi::c_void,\n        type_: cuda_types::cufft::cufftXtCopyType,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftXtFree(\n        descriptor: *mut cuda_types::cufft::cudaLibXtDesc,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftXtSetWorkArea(\n        plan: cuda_types::cufft::cufftHandle,\n        workArea: *mut *mut ::core::ffi::c_void,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftXtExecDescriptorC2C(\n        plan: cuda_types::cufft::cufftHandle,\n        input: *mut cuda_types::cufft::cudaLibXtDesc,\n        output: *mut cuda_types::cufft::cudaLibXtDesc,\n        direction: ::core::ffi::c_int,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftXtExecDescriptorR2C(\n        plan: cuda_types::cufft::cufftHandle,\n        input: *mut cuda_types::cufft::cudaLibXtDesc,\n        output: *mut cuda_types::cufft::cudaLibXtDesc,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftXtExecDescriptorC2R(\n        plan: cuda_types::cufft::cufftHandle,\n        input: *mut cuda_types::cufft::cudaLibXtDesc,\n        output: *mut cuda_types::cufft::cudaLibXtDesc,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftXtExecDescriptorZ2Z(\n        plan: cuda_types::cufft::cufftHandle,\n        input: *mut cuda_types::cufft::cudaLibXtDesc,\n        output: *mut cuda_types::cufft::cudaLibXtDesc,\n        direction: ::core::ffi::c_int,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftXtExecDescriptorD2Z(\n        plan: cuda_types::cufft::cufftHandle,\n        input: *mut cuda_types::cufft::cudaLibXtDesc,\n        output: *mut cuda_types::cufft::cudaLibXtDesc,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftXtExecDescriptorZ2D(\n        plan: cuda_types::cufft::cufftHandle,\n        input: *mut cuda_types::cufft::cudaLibXtDesc,\n        output: *mut cuda_types::cufft::cudaLibXtDesc,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftXtQueryPlan(\n        plan: cuda_types::cufft::cufftHandle,\n        queryStruct: *mut ::core::ffi::c_void,\n        queryType: cuda_types::cufft::cufftXtQueryType,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftXtSetCallback(\n        plan: cuda_types::cufft::cufftHandle,\n        callback_routine: *mut *mut ::core::ffi::c_void,\n        cbType: cuda_types::cufft::cufftXtCallbackType,\n        caller_info: *mut *mut ::core::ffi::c_void,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftXtClearCallback(\n        plan: cuda_types::cufft::cufftHandle,\n        cbType: cuda_types::cufft::cufftXtCallbackType,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftXtSetCallbackSharedSize(\n        plan: cuda_types::cufft::cufftHandle,\n        cbType: cuda_types::cufft::cufftXtCallbackType,\n        sharedSize: usize,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftXtSetJITCallback(\n        plan: cuda_types::cufft::cufftHandle,\n        lto_callback_symbol_name: *const ::core::ffi::c_char,\n        lto_callback_fatbin: *const ::core::ffi::c_void,\n        lto_callback_fatbin_size: usize,\n        type_: cuda_types::cufft::cufftXtCallbackType,\n        caller_info: *mut *mut ::core::ffi::c_void,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftXtMakePlanMany(\n        plan: cuda_types::cufft::cufftHandle,\n        rank: ::core::ffi::c_int,\n        n: *mut ::core::ffi::c_longlong,\n        inembed: *mut ::core::ffi::c_longlong,\n        istride: ::core::ffi::c_longlong,\n        idist: ::core::ffi::c_longlong,\n        inputtype: cuda_types::cufft::cudaDataType,\n        onembed: *mut ::core::ffi::c_longlong,\n        ostride: ::core::ffi::c_longlong,\n        odist: ::core::ffi::c_longlong,\n        outputtype: cuda_types::cufft::cudaDataType,\n        batch: ::core::ffi::c_longlong,\n        workSize: *mut usize,\n        executiontype: cuda_types::cufft::cudaDataType,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftXtGetSizeMany(\n        plan: cuda_types::cufft::cufftHandle,\n        rank: ::core::ffi::c_int,\n        n: *mut ::core::ffi::c_longlong,\n        inembed: *mut ::core::ffi::c_longlong,\n        istride: ::core::ffi::c_longlong,\n        idist: ::core::ffi::c_longlong,\n        inputtype: cuda_types::cufft::cudaDataType,\n        onembed: *mut ::core::ffi::c_longlong,\n        ostride: ::core::ffi::c_longlong,\n        odist: ::core::ffi::c_longlong,\n        outputtype: cuda_types::cufft::cudaDataType,\n        batch: ::core::ffi::c_longlong,\n        workSize: *mut usize,\n        executiontype: cuda_types::cufft::cudaDataType,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftXtExec(\n        plan: cuda_types::cufft::cufftHandle,\n        input: *mut ::core::ffi::c_void,\n        output: *mut ::core::ffi::c_void,\n        direction: ::core::ffi::c_int,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftXtExecDescriptor(\n        plan: cuda_types::cufft::cufftHandle,\n        input: *mut cuda_types::cufft::cudaLibXtDesc,\n        output: *mut cuda_types::cufft::cudaLibXtDesc,\n        direction: ::core::ffi::c_int,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftXtSetWorkAreaPolicy(\n        plan: cuda_types::cufft::cufftHandle,\n        policy: cuda_types::cufft::cufftXtWorkAreaPolicy,\n        workSize: *mut usize,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftXtMakePlanGuru64(\n        param_1: ::core::ffi::c_uint,\n        param_2: ::core::ffi::c_int,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_int,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_uint,\n        param_8: ::core::ffi::c_uint,\n        param_9: ::core::ffi::c_ulonglong,\n        param_10: ::core::ffi::c_uint,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftMakePlanGuru64(\n        param_1: ::core::ffi::c_uint,\n        param_2: ::core::ffi::c_int,\n        param_3: ::core::ffi::c_ulonglong,\n        param_4: ::core::ffi::c_int,\n        param_5: ::core::ffi::c_ulonglong,\n        param_6: ::core::ffi::c_uint,\n        param_7: ::core::ffi::c_ulonglong,\n    ) -> cuda_types::cufft::cufftResult;\n    fn cufftEnterCS() -> cuda_types::cufft::cufftResult;\n    fn cufftLeaveCS() -> cuda_types::cufft::cufftResult;\n}\n"
  },
  {
    "path": "cuda_macros/src/cusparse.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\nextern \"system\" {\n    #[must_use]\n    fn cusparseCreate(\n        handle: *mut cuda_types::cusparse::cusparseHandle_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDestroy(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseGetVersion(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        version: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseGetProperty(\n        type_: cuda_types::cusparse::libraryPropertyType,\n        value: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    fn cusparseGetErrorName(\n        status: cuda_types::cusparse::cusparseStatus_t,\n    ) -> *const ::core::ffi::c_char;\n    fn cusparseGetErrorString(\n        status: cuda_types::cusparse::cusparseStatus_t,\n    ) -> *const ::core::ffi::c_char;\n    #[must_use]\n    fn cusparseSetStream(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        streamId: cuda_types::cusparse::cudaStream_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseGetStream(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        streamId: *mut cuda_types::cusparse::cudaStream_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseGetPointerMode(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        mode: *mut cuda_types::cusparse::cusparsePointerMode_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSetPointerMode(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        mode: cuda_types::cusparse::cusparsePointerMode_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseLoggerSetCallback(\n        callback: cuda_types::cusparse::cusparseLoggerCallback_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseLoggerSetFile(\n        file: *mut cuda_types::FILE,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseLoggerOpenFile(\n        logFile: *const ::core::ffi::c_char,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseLoggerSetLevel(\n        level: ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseLoggerSetMask(\n        mask: ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseLoggerForceDisable() -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCreateMatDescr(\n        descrA: *mut cuda_types::cusparse::cusparseMatDescr_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDestroyMatDescr(\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSetMatType(\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        type_: cuda_types::cusparse::cusparseMatrixType_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    fn cusparseGetMatType(\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    ) -> cuda_types::cusparse::cusparseMatrixType_t;\n    #[must_use]\n    fn cusparseSetMatFillMode(\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        fillMode: cuda_types::cusparse::cusparseFillMode_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    fn cusparseGetMatFillMode(\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    ) -> cuda_types::cusparse::cusparseFillMode_t;\n    #[must_use]\n    fn cusparseSetMatDiagType(\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        diagType: cuda_types::cusparse::cusparseDiagType_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    fn cusparseGetMatDiagType(\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    ) -> cuda_types::cusparse::cusparseDiagType_t;\n    #[must_use]\n    fn cusparseSetMatIndexBase(\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        base: cuda_types::cusparse::cusparseIndexBase_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    fn cusparseGetMatIndexBase(\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    ) -> cuda_types::cusparse::cusparseIndexBase_t;\n    #[must_use]\n    fn cusparseCreateCsric02Info(\n        info: *mut cuda_types::cusparse::csric02Info_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDestroyCsric02Info(\n        info: cuda_types::cusparse::csric02Info_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCreateBsric02Info(\n        info: *mut cuda_types::cusparse::bsric02Info_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDestroyBsric02Info(\n        info: cuda_types::cusparse::bsric02Info_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCreateCsrilu02Info(\n        info: *mut cuda_types::cusparse::csrilu02Info_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDestroyCsrilu02Info(\n        info: cuda_types::cusparse::csrilu02Info_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCreateBsrilu02Info(\n        info: *mut cuda_types::cusparse::bsrilu02Info_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDestroyBsrilu02Info(\n        info: cuda_types::cusparse::bsrilu02Info_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCreateBsrsv2Info(\n        info: *mut cuda_types::cusparse::bsrsv2Info_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDestroyBsrsv2Info(\n        info: cuda_types::cusparse::bsrsv2Info_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCreateBsrsm2Info(\n        info: *mut cuda_types::cusparse::bsrsm2Info_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDestroyBsrsm2Info(\n        info: cuda_types::cusparse::bsrsm2Info_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCreateCsru2csrInfo(\n        info: *mut cuda_types::cusparse::csru2csrInfo_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDestroyCsru2csrInfo(\n        info: cuda_types::cusparse::csru2csrInfo_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCreateColorInfo(\n        info: *mut cuda_types::cusparse::cusparseColorInfo_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDestroyColorInfo(\n        info: cuda_types::cusparse::cusparseColorInfo_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCreatePruneInfo(\n        info: *mut cuda_types::cusparse::pruneInfo_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDestroyPruneInfo(\n        info: cuda_types::cusparse::pruneInfo_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSgemvi(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        xVal: *const f32,\n        xInd: *const ::core::ffi::c_int,\n        beta: *const f32,\n        y: *mut f32,\n        idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSgemvi_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        pBufferSize: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDgemvi(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        xVal: *const f64,\n        xInd: *const ::core::ffi::c_int,\n        beta: *const f64,\n        y: *mut f64,\n        idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDgemvi_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        pBufferSize: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCgemvi(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cusparse::cuComplex,\n        A: *const cuda_types::cusparse::cuComplex,\n        lda: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        xVal: *const cuda_types::cusparse::cuComplex,\n        xInd: *const ::core::ffi::c_int,\n        beta: *const cuda_types::cusparse::cuComplex,\n        y: *mut cuda_types::cusparse::cuComplex,\n        idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCgemvi_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        pBufferSize: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZgemvi(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cusparse::cuDoubleComplex,\n        A: *const cuda_types::cusparse::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        xVal: *const cuda_types::cusparse::cuDoubleComplex,\n        xInd: *const ::core::ffi::c_int,\n        beta: *const cuda_types::cusparse::cuDoubleComplex,\n        y: *mut cuda_types::cusparse::cuDoubleComplex,\n        idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZgemvi_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        pBufferSize: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSbsrmv(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        alpha: *const f32,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const f32,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        x: *const f32,\n        beta: *const f32,\n        y: *mut f32,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDbsrmv(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        alpha: *const f64,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const f64,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        x: *const f64,\n        beta: *const f64,\n        y: *mut f64,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCbsrmv(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        alpha: *const cuda_types::cusparse::cuComplex,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        x: *const cuda_types::cusparse::cuComplex,\n        beta: *const cuda_types::cusparse::cuComplex,\n        y: *mut cuda_types::cusparse::cuComplex,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZbsrmv(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        alpha: *const cuda_types::cusparse::cuDoubleComplex,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        x: *const cuda_types::cusparse::cuDoubleComplex,\n        beta: *const cuda_types::cusparse::cuDoubleComplex,\n        y: *mut cuda_types::cusparse::cuDoubleComplex,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSbsrxmv(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        sizeOfMask: ::core::ffi::c_int,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        alpha: *const f32,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const f32,\n        bsrSortedMaskPtrA: *const ::core::ffi::c_int,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedEndPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        x: *const f32,\n        beta: *const f32,\n        y: *mut f32,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDbsrxmv(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        sizeOfMask: ::core::ffi::c_int,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        alpha: *const f64,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const f64,\n        bsrSortedMaskPtrA: *const ::core::ffi::c_int,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedEndPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        x: *const f64,\n        beta: *const f64,\n        y: *mut f64,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCbsrxmv(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        sizeOfMask: ::core::ffi::c_int,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        alpha: *const cuda_types::cusparse::cuComplex,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const cuda_types::cusparse::cuComplex,\n        bsrSortedMaskPtrA: *const ::core::ffi::c_int,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedEndPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        x: *const cuda_types::cusparse::cuComplex,\n        beta: *const cuda_types::cusparse::cuComplex,\n        y: *mut cuda_types::cusparse::cuComplex,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZbsrxmv(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        sizeOfMask: ::core::ffi::c_int,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        alpha: *const cuda_types::cusparse::cuDoubleComplex,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedMaskPtrA: *const ::core::ffi::c_int,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedEndPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        x: *const cuda_types::cusparse::cuDoubleComplex,\n        beta: *const cuda_types::cusparse::cuDoubleComplex,\n        y: *mut cuda_types::cusparse::cuDoubleComplex,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseXbsrsv2_zeroPivot(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        info: cuda_types::cusparse::bsrsv2Info_t,\n        position: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSbsrsv2_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *mut f32,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsv2Info_t,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDbsrsv2_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *mut f64,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsv2Info_t,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCbsrsv2_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *mut cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsv2Info_t,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZbsrsv2_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *mut cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsv2Info_t,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSbsrsv2_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *mut f32,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsv2Info_t,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDbsrsv2_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *mut f64,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsv2Info_t,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCbsrsv2_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *mut cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsv2Info_t,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZbsrsv2_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *mut cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsv2Info_t,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSbsrsv2_analysis(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const f32,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsv2Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDbsrsv2_analysis(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const f64,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsv2Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCbsrsv2_analysis(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsv2Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZbsrsv2_analysis(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsv2Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSbsrsv2_solve(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        alpha: *const f32,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const f32,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsv2Info_t,\n        f: *const f32,\n        x: *mut f32,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDbsrsv2_solve(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        alpha: *const f64,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const f64,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsv2Info_t,\n        f: *const f64,\n        x: *mut f64,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCbsrsv2_solve(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        alpha: *const cuda_types::cusparse::cuComplex,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsv2Info_t,\n        f: *const cuda_types::cusparse::cuComplex,\n        x: *mut cuda_types::cusparse::cuComplex,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZbsrsv2_solve(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        alpha: *const cuda_types::cusparse::cuDoubleComplex,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsv2Info_t,\n        f: *const cuda_types::cusparse::cuDoubleComplex,\n        x: *mut cuda_types::cusparse::cuDoubleComplex,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSbsrmm(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        transB: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        kb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        alpha: *const f32,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const f32,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        B: *const f32,\n        ldb: ::core::ffi::c_int,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDbsrmm(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        transB: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        kb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        alpha: *const f64,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const f64,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        B: *const f64,\n        ldb: ::core::ffi::c_int,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCbsrmm(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        transB: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        kb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        alpha: *const cuda_types::cusparse::cuComplex,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        B: *const cuda_types::cusparse::cuComplex,\n        ldb: ::core::ffi::c_int,\n        beta: *const cuda_types::cusparse::cuComplex,\n        C: *mut cuda_types::cusparse::cuComplex,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZbsrmm(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        transB: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        kb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        alpha: *const cuda_types::cusparse::cuDoubleComplex,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        B: *const cuda_types::cusparse::cuDoubleComplex,\n        ldb: ::core::ffi::c_int,\n        beta: *const cuda_types::cusparse::cuDoubleComplex,\n        C: *mut cuda_types::cusparse::cuDoubleComplex,\n        ldc: ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseXbsrsm2_zeroPivot(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        info: cuda_types::cusparse::bsrsm2Info_t,\n        position: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSbsrsm2_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        transXY: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut f32,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsm2Info_t,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDbsrsm2_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        transXY: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut f64,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsm2Info_t,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCbsrsm2_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        transXY: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsm2Info_t,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZbsrsm2_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        transXY: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsm2Info_t,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSbsrsm2_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        transB: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut f32,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsm2Info_t,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDbsrsm2_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        transB: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut f64,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsm2Info_t,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCbsrsm2_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        transB: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsm2Info_t,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZbsrsm2_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        transB: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsm2Info_t,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSbsrsm2_analysis(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        transXY: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *const f32,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsm2Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDbsrsm2_analysis(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        transXY: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *const f64,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsm2Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCbsrsm2_analysis(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        transXY: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *const cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsm2Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZbsrsm2_analysis(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        transXY: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *const cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsm2Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSbsrsm2_solve(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        transXY: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        alpha: *const f32,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *const f32,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsm2Info_t,\n        B: *const f32,\n        ldb: ::core::ffi::c_int,\n        X: *mut f32,\n        ldx: ::core::ffi::c_int,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDbsrsm2_solve(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        transXY: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        alpha: *const f64,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *const f64,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsm2Info_t,\n        B: *const f64,\n        ldb: ::core::ffi::c_int,\n        X: *mut f64,\n        ldx: ::core::ffi::c_int,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCbsrsm2_solve(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        transXY: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        alpha: *const cuda_types::cusparse::cuComplex,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *const cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsm2Info_t,\n        B: *const cuda_types::cusparse::cuComplex,\n        ldb: ::core::ffi::c_int,\n        X: *mut cuda_types::cusparse::cuComplex,\n        ldx: ::core::ffi::c_int,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZbsrsm2_solve(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        transA: cuda_types::cusparse::cusparseOperation_t,\n        transXY: cuda_types::cusparse::cusparseOperation_t,\n        mb: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        alpha: *const cuda_types::cusparse::cuDoubleComplex,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *const cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrsm2Info_t,\n        B: *const cuda_types::cusparse::cuDoubleComplex,\n        ldb: ::core::ffi::c_int,\n        X: *mut cuda_types::cusparse::cuDoubleComplex,\n        ldx: ::core::ffi::c_int,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseScsrilu02_numericBoost(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        info: cuda_types::cusparse::csrilu02Info_t,\n        enable_boost: ::core::ffi::c_int,\n        tol: *mut f64,\n        boost_val: *mut f32,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDcsrilu02_numericBoost(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        info: cuda_types::cusparse::csrilu02Info_t,\n        enable_boost: ::core::ffi::c_int,\n        tol: *mut f64,\n        boost_val: *mut f64,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCcsrilu02_numericBoost(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        info: cuda_types::cusparse::csrilu02Info_t,\n        enable_boost: ::core::ffi::c_int,\n        tol: *mut f64,\n        boost_val: *mut cuda_types::cusparse::cuComplex,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZcsrilu02_numericBoost(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        info: cuda_types::cusparse::csrilu02Info_t,\n        enable_boost: ::core::ffi::c_int,\n        tol: *mut f64,\n        boost_val: *mut cuda_types::cusparse::cuDoubleComplex,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseXcsrilu02_zeroPivot(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        info: cuda_types::cusparse::csrilu02Info_t,\n        position: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseScsrilu02_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *mut f32,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csrilu02Info_t,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDcsrilu02_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *mut f64,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csrilu02Info_t,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCcsrilu02_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *mut cuda_types::cusparse::cuComplex,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csrilu02Info_t,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZcsrilu02_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *mut cuda_types::cusparse::cuDoubleComplex,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csrilu02Info_t,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseScsrilu02_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedVal: *mut f32,\n        csrSortedRowPtr: *const ::core::ffi::c_int,\n        csrSortedColInd: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csrilu02Info_t,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDcsrilu02_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedVal: *mut f64,\n        csrSortedRowPtr: *const ::core::ffi::c_int,\n        csrSortedColInd: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csrilu02Info_t,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCcsrilu02_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedVal: *mut cuda_types::cusparse::cuComplex,\n        csrSortedRowPtr: *const ::core::ffi::c_int,\n        csrSortedColInd: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csrilu02Info_t,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZcsrilu02_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedVal: *mut cuda_types::cusparse::cuDoubleComplex,\n        csrSortedRowPtr: *const ::core::ffi::c_int,\n        csrSortedColInd: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csrilu02Info_t,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseScsrilu02_analysis(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f32,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csrilu02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDcsrilu02_analysis(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f64,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csrilu02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCcsrilu02_analysis(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const cuda_types::cusparse::cuComplex,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csrilu02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZcsrilu02_analysis(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csrilu02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseScsrilu02(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA_valM: *mut f32,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csrilu02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDcsrilu02(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA_valM: *mut f64,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csrilu02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCcsrilu02(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA_valM: *mut cuda_types::cusparse::cuComplex,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csrilu02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZcsrilu02(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA_valM: *mut cuda_types::cusparse::cuDoubleComplex,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csrilu02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSbsrilu02_numericBoost(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        info: cuda_types::cusparse::bsrilu02Info_t,\n        enable_boost: ::core::ffi::c_int,\n        tol: *mut f64,\n        boost_val: *mut f32,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDbsrilu02_numericBoost(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        info: cuda_types::cusparse::bsrilu02Info_t,\n        enable_boost: ::core::ffi::c_int,\n        tol: *mut f64,\n        boost_val: *mut f64,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCbsrilu02_numericBoost(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        info: cuda_types::cusparse::bsrilu02Info_t,\n        enable_boost: ::core::ffi::c_int,\n        tol: *mut f64,\n        boost_val: *mut cuda_types::cusparse::cuComplex,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZbsrilu02_numericBoost(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        info: cuda_types::cusparse::bsrilu02Info_t,\n        enable_boost: ::core::ffi::c_int,\n        tol: *mut f64,\n        boost_val: *mut cuda_types::cusparse::cuDoubleComplex,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseXbsrilu02_zeroPivot(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        info: cuda_types::cusparse::bsrilu02Info_t,\n        position: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSbsrilu02_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut f32,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrilu02Info_t,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDbsrilu02_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut f64,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrilu02Info_t,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCbsrilu02_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrilu02Info_t,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZbsrilu02_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrilu02Info_t,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSbsrilu02_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut f32,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrilu02Info_t,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDbsrilu02_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut f64,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrilu02Info_t,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCbsrilu02_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrilu02Info_t,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZbsrilu02_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrilu02Info_t,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSbsrilu02_analysis(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut f32,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrilu02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDbsrilu02_analysis(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut f64,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrilu02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCbsrilu02_analysis(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrilu02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZbsrilu02_analysis(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrilu02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSbsrilu02(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut f32,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrilu02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDbsrilu02(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut f64,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrilu02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCbsrilu02(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrilu02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZbsrilu02(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsrilu02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseXcsric02_zeroPivot(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        info: cuda_types::cusparse::csric02Info_t,\n        position: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseScsric02_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *mut f32,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csric02Info_t,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDcsric02_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *mut f64,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csric02Info_t,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCcsric02_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *mut cuda_types::cusparse::cuComplex,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csric02Info_t,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZcsric02_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *mut cuda_types::cusparse::cuDoubleComplex,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csric02Info_t,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseScsric02_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedVal: *mut f32,\n        csrSortedRowPtr: *const ::core::ffi::c_int,\n        csrSortedColInd: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csric02Info_t,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDcsric02_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedVal: *mut f64,\n        csrSortedRowPtr: *const ::core::ffi::c_int,\n        csrSortedColInd: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csric02Info_t,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCcsric02_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedVal: *mut cuda_types::cusparse::cuComplex,\n        csrSortedRowPtr: *const ::core::ffi::c_int,\n        csrSortedColInd: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csric02Info_t,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZcsric02_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedVal: *mut cuda_types::cusparse::cuDoubleComplex,\n        csrSortedRowPtr: *const ::core::ffi::c_int,\n        csrSortedColInd: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csric02Info_t,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseScsric02_analysis(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f32,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csric02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDcsric02_analysis(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f64,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csric02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCcsric02_analysis(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const cuda_types::cusparse::cuComplex,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csric02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZcsric02_analysis(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csric02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseScsric02(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA_valM: *mut f32,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csric02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDcsric02(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA_valM: *mut f64,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csric02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCcsric02(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA_valM: *mut cuda_types::cusparse::cuComplex,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csric02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZcsric02(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA_valM: *mut cuda_types::cusparse::cuDoubleComplex,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::csric02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseXbsric02_zeroPivot(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        info: cuda_types::cusparse::bsric02Info_t,\n        position: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSbsric02_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut f32,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsric02Info_t,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDbsric02_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut f64,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsric02Info_t,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCbsric02_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsric02Info_t,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZbsric02_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsric02Info_t,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSbsric02_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut f32,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsric02Info_t,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDbsric02_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut f64,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsric02Info_t,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCbsric02_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsric02Info_t,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZbsric02_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockSize: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsric02Info_t,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSbsric02_analysis(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *const f32,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsric02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pInputBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDbsric02_analysis(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *const f64,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsric02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pInputBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCbsric02_analysis(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *const cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsric02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pInputBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZbsric02_analysis(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *const cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsric02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pInputBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSbsric02(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut f32,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsric02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDbsric02(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut f64,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsric02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCbsric02(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsric02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZbsric02(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedVal: *mut cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        info: cuda_types::cusparse::bsric02Info_t,\n        policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSgtsv2_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        dl: *const f32,\n        d: *const f32,\n        du: *const f32,\n        B: *const f32,\n        ldb: ::core::ffi::c_int,\n        bufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDgtsv2_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        dl: *const f64,\n        d: *const f64,\n        du: *const f64,\n        B: *const f64,\n        ldb: ::core::ffi::c_int,\n        bufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCgtsv2_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        dl: *const cuda_types::cusparse::cuComplex,\n        d: *const cuda_types::cusparse::cuComplex,\n        du: *const cuda_types::cusparse::cuComplex,\n        B: *const cuda_types::cusparse::cuComplex,\n        ldb: ::core::ffi::c_int,\n        bufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZgtsv2_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        dl: *const cuda_types::cusparse::cuDoubleComplex,\n        d: *const cuda_types::cusparse::cuDoubleComplex,\n        du: *const cuda_types::cusparse::cuDoubleComplex,\n        B: *const cuda_types::cusparse::cuDoubleComplex,\n        ldb: ::core::ffi::c_int,\n        bufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSgtsv2(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        dl: *const f32,\n        d: *const f32,\n        du: *const f32,\n        B: *mut f32,\n        ldb: ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDgtsv2(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        dl: *const f64,\n        d: *const f64,\n        du: *const f64,\n        B: *mut f64,\n        ldb: ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCgtsv2(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        dl: *const cuda_types::cusparse::cuComplex,\n        d: *const cuda_types::cusparse::cuComplex,\n        du: *const cuda_types::cusparse::cuComplex,\n        B: *mut cuda_types::cusparse::cuComplex,\n        ldb: ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZgtsv2(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        dl: *const cuda_types::cusparse::cuDoubleComplex,\n        d: *const cuda_types::cusparse::cuDoubleComplex,\n        du: *const cuda_types::cusparse::cuDoubleComplex,\n        B: *mut cuda_types::cusparse::cuDoubleComplex,\n        ldb: ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSgtsv2_nopivot_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        dl: *const f32,\n        d: *const f32,\n        du: *const f32,\n        B: *const f32,\n        ldb: ::core::ffi::c_int,\n        bufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDgtsv2_nopivot_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        dl: *const f64,\n        d: *const f64,\n        du: *const f64,\n        B: *const f64,\n        ldb: ::core::ffi::c_int,\n        bufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCgtsv2_nopivot_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        dl: *const cuda_types::cusparse::cuComplex,\n        d: *const cuda_types::cusparse::cuComplex,\n        du: *const cuda_types::cusparse::cuComplex,\n        B: *const cuda_types::cusparse::cuComplex,\n        ldb: ::core::ffi::c_int,\n        bufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZgtsv2_nopivot_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        dl: *const cuda_types::cusparse::cuDoubleComplex,\n        d: *const cuda_types::cusparse::cuDoubleComplex,\n        du: *const cuda_types::cusparse::cuDoubleComplex,\n        B: *const cuda_types::cusparse::cuDoubleComplex,\n        ldb: ::core::ffi::c_int,\n        bufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSgtsv2_nopivot(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        dl: *const f32,\n        d: *const f32,\n        du: *const f32,\n        B: *mut f32,\n        ldb: ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDgtsv2_nopivot(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        dl: *const f64,\n        d: *const f64,\n        du: *const f64,\n        B: *mut f64,\n        ldb: ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCgtsv2_nopivot(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        dl: *const cuda_types::cusparse::cuComplex,\n        d: *const cuda_types::cusparse::cuComplex,\n        du: *const cuda_types::cusparse::cuComplex,\n        B: *mut cuda_types::cusparse::cuComplex,\n        ldb: ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZgtsv2_nopivot(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        dl: *const cuda_types::cusparse::cuDoubleComplex,\n        d: *const cuda_types::cusparse::cuDoubleComplex,\n        du: *const cuda_types::cusparse::cuDoubleComplex,\n        B: *mut cuda_types::cusparse::cuDoubleComplex,\n        ldb: ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSgtsv2StridedBatch_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        dl: *const f32,\n        d: *const f32,\n        du: *const f32,\n        x: *const f32,\n        batchCount: ::core::ffi::c_int,\n        batchStride: ::core::ffi::c_int,\n        bufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDgtsv2StridedBatch_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        dl: *const f64,\n        d: *const f64,\n        du: *const f64,\n        x: *const f64,\n        batchCount: ::core::ffi::c_int,\n        batchStride: ::core::ffi::c_int,\n        bufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCgtsv2StridedBatch_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        dl: *const cuda_types::cusparse::cuComplex,\n        d: *const cuda_types::cusparse::cuComplex,\n        du: *const cuda_types::cusparse::cuComplex,\n        x: *const cuda_types::cusparse::cuComplex,\n        batchCount: ::core::ffi::c_int,\n        batchStride: ::core::ffi::c_int,\n        bufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZgtsv2StridedBatch_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        dl: *const cuda_types::cusparse::cuDoubleComplex,\n        d: *const cuda_types::cusparse::cuDoubleComplex,\n        du: *const cuda_types::cusparse::cuDoubleComplex,\n        x: *const cuda_types::cusparse::cuDoubleComplex,\n        batchCount: ::core::ffi::c_int,\n        batchStride: ::core::ffi::c_int,\n        bufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSgtsv2StridedBatch(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        dl: *const f32,\n        d: *const f32,\n        du: *const f32,\n        x: *mut f32,\n        batchCount: ::core::ffi::c_int,\n        batchStride: ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDgtsv2StridedBatch(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        dl: *const f64,\n        d: *const f64,\n        du: *const f64,\n        x: *mut f64,\n        batchCount: ::core::ffi::c_int,\n        batchStride: ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCgtsv2StridedBatch(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        dl: *const cuda_types::cusparse::cuComplex,\n        d: *const cuda_types::cusparse::cuComplex,\n        du: *const cuda_types::cusparse::cuComplex,\n        x: *mut cuda_types::cusparse::cuComplex,\n        batchCount: ::core::ffi::c_int,\n        batchStride: ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZgtsv2StridedBatch(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        dl: *const cuda_types::cusparse::cuDoubleComplex,\n        d: *const cuda_types::cusparse::cuDoubleComplex,\n        du: *const cuda_types::cusparse::cuDoubleComplex,\n        x: *mut cuda_types::cusparse::cuDoubleComplex,\n        batchCount: ::core::ffi::c_int,\n        batchStride: ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSgtsvInterleavedBatch_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        algo: ::core::ffi::c_int,\n        m: ::core::ffi::c_int,\n        dl: *const f32,\n        d: *const f32,\n        du: *const f32,\n        x: *const f32,\n        batchCount: ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDgtsvInterleavedBatch_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        algo: ::core::ffi::c_int,\n        m: ::core::ffi::c_int,\n        dl: *const f64,\n        d: *const f64,\n        du: *const f64,\n        x: *const f64,\n        batchCount: ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCgtsvInterleavedBatch_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        algo: ::core::ffi::c_int,\n        m: ::core::ffi::c_int,\n        dl: *const cuda_types::cusparse::cuComplex,\n        d: *const cuda_types::cusparse::cuComplex,\n        du: *const cuda_types::cusparse::cuComplex,\n        x: *const cuda_types::cusparse::cuComplex,\n        batchCount: ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZgtsvInterleavedBatch_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        algo: ::core::ffi::c_int,\n        m: ::core::ffi::c_int,\n        dl: *const cuda_types::cusparse::cuDoubleComplex,\n        d: *const cuda_types::cusparse::cuDoubleComplex,\n        du: *const cuda_types::cusparse::cuDoubleComplex,\n        x: *const cuda_types::cusparse::cuDoubleComplex,\n        batchCount: ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSgtsvInterleavedBatch(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        algo: ::core::ffi::c_int,\n        m: ::core::ffi::c_int,\n        dl: *mut f32,\n        d: *mut f32,\n        du: *mut f32,\n        x: *mut f32,\n        batchCount: ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDgtsvInterleavedBatch(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        algo: ::core::ffi::c_int,\n        m: ::core::ffi::c_int,\n        dl: *mut f64,\n        d: *mut f64,\n        du: *mut f64,\n        x: *mut f64,\n        batchCount: ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCgtsvInterleavedBatch(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        algo: ::core::ffi::c_int,\n        m: ::core::ffi::c_int,\n        dl: *mut cuda_types::cusparse::cuComplex,\n        d: *mut cuda_types::cusparse::cuComplex,\n        du: *mut cuda_types::cusparse::cuComplex,\n        x: *mut cuda_types::cusparse::cuComplex,\n        batchCount: ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZgtsvInterleavedBatch(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        algo: ::core::ffi::c_int,\n        m: ::core::ffi::c_int,\n        dl: *mut cuda_types::cusparse::cuDoubleComplex,\n        d: *mut cuda_types::cusparse::cuDoubleComplex,\n        du: *mut cuda_types::cusparse::cuDoubleComplex,\n        x: *mut cuda_types::cusparse::cuDoubleComplex,\n        batchCount: ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSgpsvInterleavedBatch_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        algo: ::core::ffi::c_int,\n        m: ::core::ffi::c_int,\n        ds: *const f32,\n        dl: *const f32,\n        d: *const f32,\n        du: *const f32,\n        dw: *const f32,\n        x: *const f32,\n        batchCount: ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDgpsvInterleavedBatch_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        algo: ::core::ffi::c_int,\n        m: ::core::ffi::c_int,\n        ds: *const f64,\n        dl: *const f64,\n        d: *const f64,\n        du: *const f64,\n        dw: *const f64,\n        x: *const f64,\n        batchCount: ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCgpsvInterleavedBatch_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        algo: ::core::ffi::c_int,\n        m: ::core::ffi::c_int,\n        ds: *const cuda_types::cusparse::cuComplex,\n        dl: *const cuda_types::cusparse::cuComplex,\n        d: *const cuda_types::cusparse::cuComplex,\n        du: *const cuda_types::cusparse::cuComplex,\n        dw: *const cuda_types::cusparse::cuComplex,\n        x: *const cuda_types::cusparse::cuComplex,\n        batchCount: ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZgpsvInterleavedBatch_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        algo: ::core::ffi::c_int,\n        m: ::core::ffi::c_int,\n        ds: *const cuda_types::cusparse::cuDoubleComplex,\n        dl: *const cuda_types::cusparse::cuDoubleComplex,\n        d: *const cuda_types::cusparse::cuDoubleComplex,\n        du: *const cuda_types::cusparse::cuDoubleComplex,\n        dw: *const cuda_types::cusparse::cuDoubleComplex,\n        x: *const cuda_types::cusparse::cuDoubleComplex,\n        batchCount: ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSgpsvInterleavedBatch(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        algo: ::core::ffi::c_int,\n        m: ::core::ffi::c_int,\n        ds: *mut f32,\n        dl: *mut f32,\n        d: *mut f32,\n        du: *mut f32,\n        dw: *mut f32,\n        x: *mut f32,\n        batchCount: ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDgpsvInterleavedBatch(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        algo: ::core::ffi::c_int,\n        m: ::core::ffi::c_int,\n        ds: *mut f64,\n        dl: *mut f64,\n        d: *mut f64,\n        du: *mut f64,\n        dw: *mut f64,\n        x: *mut f64,\n        batchCount: ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCgpsvInterleavedBatch(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        algo: ::core::ffi::c_int,\n        m: ::core::ffi::c_int,\n        ds: *mut cuda_types::cusparse::cuComplex,\n        dl: *mut cuda_types::cusparse::cuComplex,\n        d: *mut cuda_types::cusparse::cuComplex,\n        du: *mut cuda_types::cusparse::cuComplex,\n        dw: *mut cuda_types::cusparse::cuComplex,\n        x: *mut cuda_types::cusparse::cuComplex,\n        batchCount: ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZgpsvInterleavedBatch(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        algo: ::core::ffi::c_int,\n        m: ::core::ffi::c_int,\n        ds: *mut cuda_types::cusparse::cuDoubleComplex,\n        dl: *mut cuda_types::cusparse::cuDoubleComplex,\n        d: *mut cuda_types::cusparse::cuDoubleComplex,\n        du: *mut cuda_types::cusparse::cuDoubleComplex,\n        dw: *mut cuda_types::cusparse::cuDoubleComplex,\n        x: *mut cuda_types::cusparse::cuDoubleComplex,\n        batchCount: ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseScsrgeam2_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        nnzA: ::core::ffi::c_int,\n        csrSortedValA: *const f32,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        beta: *const f32,\n        descrB: cuda_types::cusparse::cusparseMatDescr_t,\n        nnzB: ::core::ffi::c_int,\n        csrSortedValB: *const f32,\n        csrSortedRowPtrB: *const ::core::ffi::c_int,\n        csrSortedColIndB: *const ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *const f32,\n        csrSortedRowPtrC: *const ::core::ffi::c_int,\n        csrSortedColIndC: *const ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDcsrgeam2_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f64,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        nnzA: ::core::ffi::c_int,\n        csrSortedValA: *const f64,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        beta: *const f64,\n        descrB: cuda_types::cusparse::cusparseMatDescr_t,\n        nnzB: ::core::ffi::c_int,\n        csrSortedValB: *const f64,\n        csrSortedRowPtrB: *const ::core::ffi::c_int,\n        csrSortedColIndB: *const ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *const f64,\n        csrSortedRowPtrC: *const ::core::ffi::c_int,\n        csrSortedColIndC: *const ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCcsrgeam2_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cusparse::cuComplex,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        nnzA: ::core::ffi::c_int,\n        csrSortedValA: *const cuda_types::cusparse::cuComplex,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        beta: *const cuda_types::cusparse::cuComplex,\n        descrB: cuda_types::cusparse::cusparseMatDescr_t,\n        nnzB: ::core::ffi::c_int,\n        csrSortedValB: *const cuda_types::cusparse::cuComplex,\n        csrSortedRowPtrB: *const ::core::ffi::c_int,\n        csrSortedColIndB: *const ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *const cuda_types::cusparse::cuComplex,\n        csrSortedRowPtrC: *const ::core::ffi::c_int,\n        csrSortedColIndC: *const ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZcsrgeam2_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cusparse::cuDoubleComplex,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        nnzA: ::core::ffi::c_int,\n        csrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        beta: *const cuda_types::cusparse::cuDoubleComplex,\n        descrB: cuda_types::cusparse::cusparseMatDescr_t,\n        nnzB: ::core::ffi::c_int,\n        csrSortedValB: *const cuda_types::cusparse::cuDoubleComplex,\n        csrSortedRowPtrB: *const ::core::ffi::c_int,\n        csrSortedColIndB: *const ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *const cuda_types::cusparse::cuDoubleComplex,\n        csrSortedRowPtrC: *const ::core::ffi::c_int,\n        csrSortedColIndC: *const ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseXcsrgeam2Nnz(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        nnzA: ::core::ffi::c_int,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        descrB: cuda_types::cusparse::cusparseMatDescr_t,\n        nnzB: ::core::ffi::c_int,\n        csrSortedRowPtrB: *const ::core::ffi::c_int,\n        csrSortedColIndB: *const ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedRowPtrC: *mut ::core::ffi::c_int,\n        nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n        workspace: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseScsrgeam2(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f32,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        nnzA: ::core::ffi::c_int,\n        csrSortedValA: *const f32,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        beta: *const f32,\n        descrB: cuda_types::cusparse::cusparseMatDescr_t,\n        nnzB: ::core::ffi::c_int,\n        csrSortedValB: *const f32,\n        csrSortedRowPtrB: *const ::core::ffi::c_int,\n        csrSortedColIndB: *const ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *mut f32,\n        csrSortedRowPtrC: *mut ::core::ffi::c_int,\n        csrSortedColIndC: *mut ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDcsrgeam2(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const f64,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        nnzA: ::core::ffi::c_int,\n        csrSortedValA: *const f64,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        beta: *const f64,\n        descrB: cuda_types::cusparse::cusparseMatDescr_t,\n        nnzB: ::core::ffi::c_int,\n        csrSortedValB: *const f64,\n        csrSortedRowPtrB: *const ::core::ffi::c_int,\n        csrSortedColIndB: *const ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *mut f64,\n        csrSortedRowPtrC: *mut ::core::ffi::c_int,\n        csrSortedColIndC: *mut ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCcsrgeam2(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cusparse::cuComplex,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        nnzA: ::core::ffi::c_int,\n        csrSortedValA: *const cuda_types::cusparse::cuComplex,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        beta: *const cuda_types::cusparse::cuComplex,\n        descrB: cuda_types::cusparse::cusparseMatDescr_t,\n        nnzB: ::core::ffi::c_int,\n        csrSortedValB: *const cuda_types::cusparse::cuComplex,\n        csrSortedRowPtrB: *const ::core::ffi::c_int,\n        csrSortedColIndB: *const ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *mut cuda_types::cusparse::cuComplex,\n        csrSortedRowPtrC: *mut ::core::ffi::c_int,\n        csrSortedColIndC: *mut ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZcsrgeam2(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        alpha: *const cuda_types::cusparse::cuDoubleComplex,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        nnzA: ::core::ffi::c_int,\n        csrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        beta: *const cuda_types::cusparse::cuDoubleComplex,\n        descrB: cuda_types::cusparse::cusparseMatDescr_t,\n        nnzB: ::core::ffi::c_int,\n        csrSortedValB: *const cuda_types::cusparse::cuDoubleComplex,\n        csrSortedRowPtrB: *const ::core::ffi::c_int,\n        csrSortedColIndB: *const ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *mut cuda_types::cusparse::cuDoubleComplex,\n        csrSortedRowPtrC: *mut ::core::ffi::c_int,\n        csrSortedColIndC: *mut ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseScsrcolor(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f32,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        fractionToColor: *const f32,\n        ncolors: *mut ::core::ffi::c_int,\n        coloring: *mut ::core::ffi::c_int,\n        reordering: *mut ::core::ffi::c_int,\n        info: cuda_types::cusparse::cusparseColorInfo_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDcsrcolor(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f64,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        fractionToColor: *const f64,\n        ncolors: *mut ::core::ffi::c_int,\n        coloring: *mut ::core::ffi::c_int,\n        reordering: *mut ::core::ffi::c_int,\n        info: cuda_types::cusparse::cusparseColorInfo_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCcsrcolor(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const cuda_types::cusparse::cuComplex,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        fractionToColor: *const f32,\n        ncolors: *mut ::core::ffi::c_int,\n        coloring: *mut ::core::ffi::c_int,\n        reordering: *mut ::core::ffi::c_int,\n        info: cuda_types::cusparse::cusparseColorInfo_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZcsrcolor(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        fractionToColor: *const f64,\n        ncolors: *mut ::core::ffi::c_int,\n        coloring: *mut ::core::ffi::c_int,\n        reordering: *mut ::core::ffi::c_int,\n        info: cuda_types::cusparse::cusparseColorInfo_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSnnz(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        A: *const f32,\n        lda: ::core::ffi::c_int,\n        nnzPerRowCol: *mut ::core::ffi::c_int,\n        nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDnnz(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        A: *const f64,\n        lda: ::core::ffi::c_int,\n        nnzPerRowCol: *mut ::core::ffi::c_int,\n        nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCnnz(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        A: *const cuda_types::cusparse::cuComplex,\n        lda: ::core::ffi::c_int,\n        nnzPerRowCol: *mut ::core::ffi::c_int,\n        nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZnnz(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        A: *const cuda_types::cusparse::cuDoubleComplex,\n        lda: ::core::ffi::c_int,\n        nnzPerRowCol: *mut ::core::ffi::c_int,\n        nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSnnz_compress(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        descr: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f32,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        nnzPerRow: *mut ::core::ffi::c_int,\n        nnzC: *mut ::core::ffi::c_int,\n        tol: f32,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDnnz_compress(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        descr: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f64,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        nnzPerRow: *mut ::core::ffi::c_int,\n        nnzC: *mut ::core::ffi::c_int,\n        tol: f64,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCnnz_compress(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        descr: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const cuda_types::cusparse::cuComplex,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        nnzPerRow: *mut ::core::ffi::c_int,\n        nnzC: *mut ::core::ffi::c_int,\n        tol: cuda_types::cusparse::cuComplex,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZnnz_compress(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        descr: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        nnzPerRow: *mut ::core::ffi::c_int,\n        nnzC: *mut ::core::ffi::c_int,\n        tol: cuda_types::cusparse::cuDoubleComplex,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseScsr2csr_compress(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f32,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        nnzA: ::core::ffi::c_int,\n        nnzPerRow: *const ::core::ffi::c_int,\n        csrSortedValC: *mut f32,\n        csrSortedColIndC: *mut ::core::ffi::c_int,\n        csrSortedRowPtrC: *mut ::core::ffi::c_int,\n        tol: f32,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDcsr2csr_compress(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f64,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        nnzA: ::core::ffi::c_int,\n        nnzPerRow: *const ::core::ffi::c_int,\n        csrSortedValC: *mut f64,\n        csrSortedColIndC: *mut ::core::ffi::c_int,\n        csrSortedRowPtrC: *mut ::core::ffi::c_int,\n        tol: f64,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCcsr2csr_compress(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const cuda_types::cusparse::cuComplex,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        nnzA: ::core::ffi::c_int,\n        nnzPerRow: *const ::core::ffi::c_int,\n        csrSortedValC: *mut cuda_types::cusparse::cuComplex,\n        csrSortedColIndC: *mut ::core::ffi::c_int,\n        csrSortedRowPtrC: *mut ::core::ffi::c_int,\n        tol: cuda_types::cusparse::cuComplex,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZcsr2csr_compress(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        nnzA: ::core::ffi::c_int,\n        nnzPerRow: *const ::core::ffi::c_int,\n        csrSortedValC: *mut cuda_types::cusparse::cuDoubleComplex,\n        csrSortedColIndC: *mut ::core::ffi::c_int,\n        csrSortedRowPtrC: *mut ::core::ffi::c_int,\n        tol: cuda_types::cusparse::cuDoubleComplex,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseXcoo2csr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        cooRowInd: *const ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        m: ::core::ffi::c_int,\n        csrSortedRowPtr: *mut ::core::ffi::c_int,\n        idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseXcsr2coo(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        csrSortedRowPtr: *const ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        m: ::core::ffi::c_int,\n        cooRowInd: *mut ::core::ffi::c_int,\n        idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseXcsr2bsrNnz(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n        nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseScsr2bsr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f32,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValC: *mut f32,\n        bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n        bsrSortedColIndC: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDcsr2bsr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f64,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValC: *mut f64,\n        bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n        bsrSortedColIndC: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCcsr2bsr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const cuda_types::cusparse::cuComplex,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValC: *mut cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n        bsrSortedColIndC: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZcsr2bsr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValC: *mut cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n        bsrSortedColIndC: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSbsr2csr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const f32,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *mut f32,\n        csrSortedRowPtrC: *mut ::core::ffi::c_int,\n        csrSortedColIndC: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDbsr2csr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const f64,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *mut f64,\n        csrSortedRowPtrC: *mut ::core::ffi::c_int,\n        csrSortedColIndC: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCbsr2csr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *mut cuda_types::cusparse::cuComplex,\n        csrSortedRowPtrC: *mut ::core::ffi::c_int,\n        csrSortedColIndC: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZbsr2csr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        blockDim: ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *mut cuda_types::cusparse::cuDoubleComplex,\n        csrSortedRowPtrC: *mut ::core::ffi::c_int,\n        csrSortedColIndC: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSgebsr2gebsc_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        bsrSortedVal: *const f32,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDgebsr2gebsc_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        bsrSortedVal: *const f64,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCgebsr2gebsc_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        bsrSortedVal: *const cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZgebsr2gebsc_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        bsrSortedVal: *const cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSgebsr2gebsc_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        bsrSortedVal: *const f32,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDgebsr2gebsc_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        bsrSortedVal: *const f64,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCgebsr2gebsc_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        bsrSortedVal: *const cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZgebsr2gebsc_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        bsrSortedVal: *const cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSgebsr2gebsc(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        bsrSortedVal: *const f32,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        bscVal: *mut f32,\n        bscRowInd: *mut ::core::ffi::c_int,\n        bscColPtr: *mut ::core::ffi::c_int,\n        copyValues: cuda_types::cusparse::cusparseAction_t,\n        idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDgebsr2gebsc(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        bsrSortedVal: *const f64,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        bscVal: *mut f64,\n        bscRowInd: *mut ::core::ffi::c_int,\n        bscColPtr: *mut ::core::ffi::c_int,\n        copyValues: cuda_types::cusparse::cusparseAction_t,\n        idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCgebsr2gebsc(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        bsrSortedVal: *const cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        bscVal: *mut cuda_types::cusparse::cuComplex,\n        bscRowInd: *mut ::core::ffi::c_int,\n        bscColPtr: *mut ::core::ffi::c_int,\n        copyValues: cuda_types::cusparse::cusparseAction_t,\n        idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZgebsr2gebsc(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        bsrSortedVal: *const cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtr: *const ::core::ffi::c_int,\n        bsrSortedColInd: *const ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        bscVal: *mut cuda_types::cusparse::cuDoubleComplex,\n        bscRowInd: *mut ::core::ffi::c_int,\n        bscColPtr: *mut ::core::ffi::c_int,\n        copyValues: cuda_types::cusparse::cusparseAction_t,\n        idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseXgebsr2csr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedRowPtrC: *mut ::core::ffi::c_int,\n        csrSortedColIndC: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSgebsr2csr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const f32,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *mut f32,\n        csrSortedRowPtrC: *mut ::core::ffi::c_int,\n        csrSortedColIndC: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDgebsr2csr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const f64,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *mut f64,\n        csrSortedRowPtrC: *mut ::core::ffi::c_int,\n        csrSortedColIndC: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCgebsr2csr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *mut cuda_types::cusparse::cuComplex,\n        csrSortedRowPtrC: *mut ::core::ffi::c_int,\n        csrSortedColIndC: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZgebsr2csr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *mut cuda_types::cusparse::cuDoubleComplex,\n        csrSortedRowPtrC: *mut ::core::ffi::c_int,\n        csrSortedColIndC: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseScsr2gebsr_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f32,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDcsr2gebsr_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f64,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCcsr2gebsr_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const cuda_types::cusparse::cuComplex,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZcsr2gebsr_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseScsr2gebsr_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f32,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDcsr2gebsr_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f64,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCcsr2gebsr_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const cuda_types::cusparse::cuComplex,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZcsr2gebsr_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseXcsr2gebsrNnz(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseScsr2gebsr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f32,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValC: *mut f32,\n        bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n        bsrSortedColIndC: *mut ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDcsr2gebsr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f64,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValC: *mut f64,\n        bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n        bsrSortedColIndC: *mut ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCcsr2gebsr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const cuda_types::cusparse::cuComplex,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValC: *mut cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n        bsrSortedColIndC: *mut ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZcsr2gebsr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValC: *mut cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n        bsrSortedColIndC: *mut ::core::ffi::c_int,\n        rowBlockDim: ::core::ffi::c_int,\n        colBlockDim: ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSgebsr2gebsr_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const f32,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        rowBlockDimA: ::core::ffi::c_int,\n        colBlockDimA: ::core::ffi::c_int,\n        rowBlockDimC: ::core::ffi::c_int,\n        colBlockDimC: ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDgebsr2gebsr_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const f64,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        rowBlockDimA: ::core::ffi::c_int,\n        colBlockDimA: ::core::ffi::c_int,\n        rowBlockDimC: ::core::ffi::c_int,\n        colBlockDimC: ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCgebsr2gebsr_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        rowBlockDimA: ::core::ffi::c_int,\n        colBlockDimA: ::core::ffi::c_int,\n        rowBlockDimC: ::core::ffi::c_int,\n        colBlockDimC: ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZgebsr2gebsr_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        rowBlockDimA: ::core::ffi::c_int,\n        colBlockDimA: ::core::ffi::c_int,\n        rowBlockDimC: ::core::ffi::c_int,\n        colBlockDimC: ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSgebsr2gebsr_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const f32,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        rowBlockDimA: ::core::ffi::c_int,\n        colBlockDimA: ::core::ffi::c_int,\n        rowBlockDimC: ::core::ffi::c_int,\n        colBlockDimC: ::core::ffi::c_int,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDgebsr2gebsr_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const f64,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        rowBlockDimA: ::core::ffi::c_int,\n        colBlockDimA: ::core::ffi::c_int,\n        rowBlockDimC: ::core::ffi::c_int,\n        colBlockDimC: ::core::ffi::c_int,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCgebsr2gebsr_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        rowBlockDimA: ::core::ffi::c_int,\n        colBlockDimA: ::core::ffi::c_int,\n        rowBlockDimC: ::core::ffi::c_int,\n        colBlockDimC: ::core::ffi::c_int,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZgebsr2gebsr_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        rowBlockDimA: ::core::ffi::c_int,\n        colBlockDimA: ::core::ffi::c_int,\n        rowBlockDimC: ::core::ffi::c_int,\n        colBlockDimC: ::core::ffi::c_int,\n        pBufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseXgebsr2gebsrNnz(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        rowBlockDimA: ::core::ffi::c_int,\n        colBlockDimA: ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n        rowBlockDimC: ::core::ffi::c_int,\n        colBlockDimC: ::core::ffi::c_int,\n        nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSgebsr2gebsr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const f32,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        rowBlockDimA: ::core::ffi::c_int,\n        colBlockDimA: ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValC: *mut f32,\n        bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n        bsrSortedColIndC: *mut ::core::ffi::c_int,\n        rowBlockDimC: ::core::ffi::c_int,\n        colBlockDimC: ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDgebsr2gebsr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const f64,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        rowBlockDimA: ::core::ffi::c_int,\n        colBlockDimA: ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValC: *mut f64,\n        bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n        bsrSortedColIndC: *mut ::core::ffi::c_int,\n        rowBlockDimC: ::core::ffi::c_int,\n        colBlockDimC: ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCgebsr2gebsr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        rowBlockDimA: ::core::ffi::c_int,\n        colBlockDimA: ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValC: *mut cuda_types::cusparse::cuComplex,\n        bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n        bsrSortedColIndC: *mut ::core::ffi::c_int,\n        rowBlockDimC: ::core::ffi::c_int,\n        colBlockDimC: ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZgebsr2gebsr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        dirA: cuda_types::cusparse::cusparseDirection_t,\n        mb: ::core::ffi::c_int,\n        nb: ::core::ffi::c_int,\n        nnzb: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtrA: *const ::core::ffi::c_int,\n        bsrSortedColIndA: *const ::core::ffi::c_int,\n        rowBlockDimA: ::core::ffi::c_int,\n        colBlockDimA: ::core::ffi::c_int,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        bsrSortedValC: *mut cuda_types::cusparse::cuDoubleComplex,\n        bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n        bsrSortedColIndC: *mut ::core::ffi::c_int,\n        rowBlockDimC: ::core::ffi::c_int,\n        colBlockDimC: ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCreateIdentityPermutation(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        n: ::core::ffi::c_int,\n        p: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseXcoosort_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        cooRowsA: *const ::core::ffi::c_int,\n        cooColsA: *const ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseXcoosortByRow(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        cooRowsA: *mut ::core::ffi::c_int,\n        cooColsA: *mut ::core::ffi::c_int,\n        P: *mut ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseXcoosortByColumn(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        cooRowsA: *mut ::core::ffi::c_int,\n        cooColsA: *mut ::core::ffi::c_int,\n        P: *mut ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseXcsrsort_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        csrRowPtrA: *const ::core::ffi::c_int,\n        csrColIndA: *const ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseXcsrsort(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrRowPtrA: *const ::core::ffi::c_int,\n        csrColIndA: *mut ::core::ffi::c_int,\n        P: *mut ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseXcscsort_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        cscColPtrA: *const ::core::ffi::c_int,\n        cscRowIndA: *const ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseXcscsort(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        cscColPtrA: *const ::core::ffi::c_int,\n        cscRowIndA: *mut ::core::ffi::c_int,\n        P: *mut ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseScsru2csr_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        csrVal: *mut f32,\n        csrRowPtr: *const ::core::ffi::c_int,\n        csrColInd: *mut ::core::ffi::c_int,\n        info: cuda_types::cusparse::csru2csrInfo_t,\n        pBufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDcsru2csr_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        csrVal: *mut f64,\n        csrRowPtr: *const ::core::ffi::c_int,\n        csrColInd: *mut ::core::ffi::c_int,\n        info: cuda_types::cusparse::csru2csrInfo_t,\n        pBufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCcsru2csr_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        csrVal: *mut cuda_types::cusparse::cuComplex,\n        csrRowPtr: *const ::core::ffi::c_int,\n        csrColInd: *mut ::core::ffi::c_int,\n        info: cuda_types::cusparse::csru2csrInfo_t,\n        pBufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZcsru2csr_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        csrVal: *mut cuda_types::cusparse::cuDoubleComplex,\n        csrRowPtr: *const ::core::ffi::c_int,\n        csrColInd: *mut ::core::ffi::c_int,\n        info: cuda_types::cusparse::csru2csrInfo_t,\n        pBufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseScsru2csr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrVal: *mut f32,\n        csrRowPtr: *const ::core::ffi::c_int,\n        csrColInd: *mut ::core::ffi::c_int,\n        info: cuda_types::cusparse::csru2csrInfo_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDcsru2csr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrVal: *mut f64,\n        csrRowPtr: *const ::core::ffi::c_int,\n        csrColInd: *mut ::core::ffi::c_int,\n        info: cuda_types::cusparse::csru2csrInfo_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCcsru2csr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrVal: *mut cuda_types::cusparse::cuComplex,\n        csrRowPtr: *const ::core::ffi::c_int,\n        csrColInd: *mut ::core::ffi::c_int,\n        info: cuda_types::cusparse::csru2csrInfo_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZcsru2csr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrVal: *mut cuda_types::cusparse::cuDoubleComplex,\n        csrRowPtr: *const ::core::ffi::c_int,\n        csrColInd: *mut ::core::ffi::c_int,\n        info: cuda_types::cusparse::csru2csrInfo_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseScsr2csru(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrVal: *mut f32,\n        csrRowPtr: *const ::core::ffi::c_int,\n        csrColInd: *mut ::core::ffi::c_int,\n        info: cuda_types::cusparse::csru2csrInfo_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDcsr2csru(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrVal: *mut f64,\n        csrRowPtr: *const ::core::ffi::c_int,\n        csrColInd: *mut ::core::ffi::c_int,\n        info: cuda_types::cusparse::csru2csrInfo_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCcsr2csru(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrVal: *mut cuda_types::cusparse::cuComplex,\n        csrRowPtr: *const ::core::ffi::c_int,\n        csrColInd: *mut ::core::ffi::c_int,\n        info: cuda_types::cusparse::csru2csrInfo_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseZcsr2csru(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrVal: *mut cuda_types::cusparse::cuDoubleComplex,\n        csrRowPtr: *const ::core::ffi::c_int,\n        csrColInd: *mut ::core::ffi::c_int,\n        info: cuda_types::cusparse::csru2csrInfo_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpruneDense2csr_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        A: *const f32,\n        lda: ::core::ffi::c_int,\n        threshold: *const f32,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *const f32,\n        csrSortedRowPtrC: *const ::core::ffi::c_int,\n        csrSortedColIndC: *const ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDpruneDense2csr_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        A: *const f64,\n        lda: ::core::ffi::c_int,\n        threshold: *const f64,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *const f64,\n        csrSortedRowPtrC: *const ::core::ffi::c_int,\n        csrSortedColIndC: *const ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpruneDense2csrNnz(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        A: *const f32,\n        lda: ::core::ffi::c_int,\n        threshold: *const f32,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrRowPtrC: *mut ::core::ffi::c_int,\n        nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDpruneDense2csrNnz(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        A: *const f64,\n        lda: ::core::ffi::c_int,\n        threshold: *const f64,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedRowPtrC: *mut ::core::ffi::c_int,\n        nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpruneDense2csr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        A: *const f32,\n        lda: ::core::ffi::c_int,\n        threshold: *const f32,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *mut f32,\n        csrSortedRowPtrC: *const ::core::ffi::c_int,\n        csrSortedColIndC: *mut ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDpruneDense2csr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        A: *const f64,\n        lda: ::core::ffi::c_int,\n        threshold: *const f64,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *mut f64,\n        csrSortedRowPtrC: *const ::core::ffi::c_int,\n        csrSortedColIndC: *mut ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpruneCsr2csr_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnzA: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f32,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        threshold: *const f32,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *const f32,\n        csrSortedRowPtrC: *const ::core::ffi::c_int,\n        csrSortedColIndC: *const ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDpruneCsr2csr_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnzA: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f64,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        threshold: *const f64,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *const f64,\n        csrSortedRowPtrC: *const ::core::ffi::c_int,\n        csrSortedColIndC: *const ::core::ffi::c_int,\n        pBufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpruneCsr2csrNnz(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnzA: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f32,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        threshold: *const f32,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedRowPtrC: *mut ::core::ffi::c_int,\n        nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDpruneCsr2csrNnz(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnzA: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f64,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        threshold: *const f64,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedRowPtrC: *mut ::core::ffi::c_int,\n        nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpruneCsr2csr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnzA: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f32,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        threshold: *const f32,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *mut f32,\n        csrSortedRowPtrC: *const ::core::ffi::c_int,\n        csrSortedColIndC: *mut ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDpruneCsr2csr(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnzA: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f64,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        threshold: *const f64,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *mut f64,\n        csrSortedRowPtrC: *const ::core::ffi::c_int,\n        csrSortedColIndC: *mut ::core::ffi::c_int,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpruneDense2csrByPercentage_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        A: *const f32,\n        lda: ::core::ffi::c_int,\n        percentage: f32,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *const f32,\n        csrSortedRowPtrC: *const ::core::ffi::c_int,\n        csrSortedColIndC: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::pruneInfo_t,\n        pBufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDpruneDense2csrByPercentage_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        A: *const f64,\n        lda: ::core::ffi::c_int,\n        percentage: f32,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *const f64,\n        csrSortedRowPtrC: *const ::core::ffi::c_int,\n        csrSortedColIndC: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::pruneInfo_t,\n        pBufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpruneDense2csrNnzByPercentage(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        A: *const f32,\n        lda: ::core::ffi::c_int,\n        percentage: f32,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrRowPtrC: *mut ::core::ffi::c_int,\n        nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n        info: cuda_types::cusparse::pruneInfo_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDpruneDense2csrNnzByPercentage(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        A: *const f64,\n        lda: ::core::ffi::c_int,\n        percentage: f32,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrRowPtrC: *mut ::core::ffi::c_int,\n        nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n        info: cuda_types::cusparse::pruneInfo_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpruneDense2csrByPercentage(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        A: *const f32,\n        lda: ::core::ffi::c_int,\n        percentage: f32,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *mut f32,\n        csrSortedRowPtrC: *const ::core::ffi::c_int,\n        csrSortedColIndC: *mut ::core::ffi::c_int,\n        info: cuda_types::cusparse::pruneInfo_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDpruneDense2csrByPercentage(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        A: *const f64,\n        lda: ::core::ffi::c_int,\n        percentage: f32,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *mut f64,\n        csrSortedRowPtrC: *const ::core::ffi::c_int,\n        csrSortedColIndC: *mut ::core::ffi::c_int,\n        info: cuda_types::cusparse::pruneInfo_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpruneCsr2csrByPercentage_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnzA: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f32,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        percentage: f32,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *const f32,\n        csrSortedRowPtrC: *const ::core::ffi::c_int,\n        csrSortedColIndC: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::pruneInfo_t,\n        pBufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDpruneCsr2csrByPercentage_bufferSizeExt(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnzA: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f64,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        percentage: f32,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *const f64,\n        csrSortedRowPtrC: *const ::core::ffi::c_int,\n        csrSortedColIndC: *const ::core::ffi::c_int,\n        info: cuda_types::cusparse::pruneInfo_t,\n        pBufferSizeInBytes: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpruneCsr2csrNnzByPercentage(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnzA: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f32,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        percentage: f32,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedRowPtrC: *mut ::core::ffi::c_int,\n        nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n        info: cuda_types::cusparse::pruneInfo_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDpruneCsr2csrNnzByPercentage(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnzA: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f64,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        percentage: f32,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedRowPtrC: *mut ::core::ffi::c_int,\n        nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n        info: cuda_types::cusparse::pruneInfo_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpruneCsr2csrByPercentage(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnzA: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f32,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        percentage: f32,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *mut f32,\n        csrSortedRowPtrC: *const ::core::ffi::c_int,\n        csrSortedColIndC: *mut ::core::ffi::c_int,\n        info: cuda_types::cusparse::pruneInfo_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDpruneCsr2csrByPercentage(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnzA: ::core::ffi::c_int,\n        descrA: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValA: *const f64,\n        csrSortedRowPtrA: *const ::core::ffi::c_int,\n        csrSortedColIndA: *const ::core::ffi::c_int,\n        percentage: f32,\n        descrC: cuda_types::cusparse::cusparseMatDescr_t,\n        csrSortedValC: *mut f64,\n        csrSortedRowPtrC: *const ::core::ffi::c_int,\n        csrSortedColIndC: *mut ::core::ffi::c_int,\n        info: cuda_types::cusparse::pruneInfo_t,\n        pBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCsr2cscEx2(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        csrVal: *const ::core::ffi::c_void,\n        csrRowPtr: *const ::core::ffi::c_int,\n        csrColInd: *const ::core::ffi::c_int,\n        cscVal: *mut ::core::ffi::c_void,\n        cscColPtr: *mut ::core::ffi::c_int,\n        cscRowInd: *mut ::core::ffi::c_int,\n        valType: cuda_types::cusparse::cudaDataType,\n        copyValues: cuda_types::cusparse::cusparseAction_t,\n        idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n        alg: cuda_types::cusparse::cusparseCsr2CscAlg_t,\n        buffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCsr2cscEx2_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        m: ::core::ffi::c_int,\n        n: ::core::ffi::c_int,\n        nnz: ::core::ffi::c_int,\n        csrVal: *const ::core::ffi::c_void,\n        csrRowPtr: *const ::core::ffi::c_int,\n        csrColInd: *const ::core::ffi::c_int,\n        cscVal: *mut ::core::ffi::c_void,\n        cscColPtr: *mut ::core::ffi::c_int,\n        cscRowInd: *mut ::core::ffi::c_int,\n        valType: cuda_types::cusparse::cudaDataType,\n        copyValues: cuda_types::cusparse::cusparseAction_t,\n        idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n        alg: cuda_types::cusparse::cusparseCsr2CscAlg_t,\n        bufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCreateSpVec(\n        spVecDescr: *mut cuda_types::cusparse::cusparseSpVecDescr_t,\n        size: i64,\n        nnz: i64,\n        indices: *mut ::core::ffi::c_void,\n        values: *mut ::core::ffi::c_void,\n        idxType: cuda_types::cusparse::cusparseIndexType_t,\n        idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n        valueType: cuda_types::cusparse::cudaDataType,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCreateConstSpVec(\n        spVecDescr: *mut cuda_types::cusparse::cusparseConstSpVecDescr_t,\n        size: i64,\n        nnz: i64,\n        indices: *const ::core::ffi::c_void,\n        values: *const ::core::ffi::c_void,\n        idxType: cuda_types::cusparse::cusparseIndexType_t,\n        idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n        valueType: cuda_types::cusparse::cudaDataType,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDestroySpVec(\n        spVecDescr: cuda_types::cusparse::cusparseConstSpVecDescr_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpVecGet(\n        spVecDescr: cuda_types::cusparse::cusparseSpVecDescr_t,\n        size: *mut i64,\n        nnz: *mut i64,\n        indices: *mut *mut ::core::ffi::c_void,\n        values: *mut *mut ::core::ffi::c_void,\n        idxType: *mut cuda_types::cusparse::cusparseIndexType_t,\n        idxBase: *mut cuda_types::cusparse::cusparseIndexBase_t,\n        valueType: *mut cuda_types::cusparse::cudaDataType,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseConstSpVecGet(\n        spVecDescr: cuda_types::cusparse::cusparseConstSpVecDescr_t,\n        size: *mut i64,\n        nnz: *mut i64,\n        indices: *mut *const ::core::ffi::c_void,\n        values: *mut *const ::core::ffi::c_void,\n        idxType: *mut cuda_types::cusparse::cusparseIndexType_t,\n        idxBase: *mut cuda_types::cusparse::cusparseIndexBase_t,\n        valueType: *mut cuda_types::cusparse::cudaDataType,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpVecGetIndexBase(\n        spVecDescr: cuda_types::cusparse::cusparseConstSpVecDescr_t,\n        idxBase: *mut cuda_types::cusparse::cusparseIndexBase_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpVecGetValues(\n        spVecDescr: cuda_types::cusparse::cusparseSpVecDescr_t,\n        values: *mut *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseConstSpVecGetValues(\n        spVecDescr: cuda_types::cusparse::cusparseConstSpVecDescr_t,\n        values: *mut *const ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpVecSetValues(\n        spVecDescr: cuda_types::cusparse::cusparseSpVecDescr_t,\n        values: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCreateDnVec(\n        dnVecDescr: *mut cuda_types::cusparse::cusparseDnVecDescr_t,\n        size: i64,\n        values: *mut ::core::ffi::c_void,\n        valueType: cuda_types::cusparse::cudaDataType,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCreateConstDnVec(\n        dnVecDescr: *mut cuda_types::cusparse::cusparseConstDnVecDescr_t,\n        size: i64,\n        values: *const ::core::ffi::c_void,\n        valueType: cuda_types::cusparse::cudaDataType,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDestroyDnVec(\n        dnVecDescr: cuda_types::cusparse::cusparseConstDnVecDescr_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDnVecGet(\n        dnVecDescr: cuda_types::cusparse::cusparseDnVecDescr_t,\n        size: *mut i64,\n        values: *mut *mut ::core::ffi::c_void,\n        valueType: *mut cuda_types::cusparse::cudaDataType,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseConstDnVecGet(\n        dnVecDescr: cuda_types::cusparse::cusparseConstDnVecDescr_t,\n        size: *mut i64,\n        values: *mut *const ::core::ffi::c_void,\n        valueType: *mut cuda_types::cusparse::cudaDataType,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDnVecGetValues(\n        dnVecDescr: cuda_types::cusparse::cusparseDnVecDescr_t,\n        values: *mut *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseConstDnVecGetValues(\n        dnVecDescr: cuda_types::cusparse::cusparseConstDnVecDescr_t,\n        values: *mut *const ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDnVecSetValues(\n        dnVecDescr: cuda_types::cusparse::cusparseDnVecDescr_t,\n        values: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDestroySpMat(\n        spMatDescr: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpMatGetFormat(\n        spMatDescr: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        format: *mut cuda_types::cusparse::cusparseFormat_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpMatGetIndexBase(\n        spMatDescr: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        idxBase: *mut cuda_types::cusparse::cusparseIndexBase_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpMatGetValues(\n        spMatDescr: cuda_types::cusparse::cusparseSpMatDescr_t,\n        values: *mut *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseConstSpMatGetValues(\n        spMatDescr: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        values: *mut *const ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpMatSetValues(\n        spMatDescr: cuda_types::cusparse::cusparseSpMatDescr_t,\n        values: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpMatGetSize(\n        spMatDescr: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        rows: *mut i64,\n        cols: *mut i64,\n        nnz: *mut i64,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpMatGetStridedBatch(\n        spMatDescr: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        batchCount: *mut ::core::ffi::c_int,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCooSetStridedBatch(\n        spMatDescr: cuda_types::cusparse::cusparseSpMatDescr_t,\n        batchCount: ::core::ffi::c_int,\n        batchStride: i64,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCsrSetStridedBatch(\n        spMatDescr: cuda_types::cusparse::cusparseSpMatDescr_t,\n        batchCount: ::core::ffi::c_int,\n        offsetsBatchStride: i64,\n        columnsValuesBatchStride: i64,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseBsrSetStridedBatch(\n        spMatDescr: cuda_types::cusparse::cusparseSpMatDescr_t,\n        batchCount: ::core::ffi::c_int,\n        offsetsBatchStride: i64,\n        columnsBatchStride: i64,\n        ValuesBatchStride: i64,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpMatGetAttribute(\n        spMatDescr: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        attribute: cuda_types::cusparse::cusparseSpMatAttribute_t,\n        data: *mut ::core::ffi::c_void,\n        dataSize: usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpMatSetAttribute(\n        spMatDescr: cuda_types::cusparse::cusparseSpMatDescr_t,\n        attribute: cuda_types::cusparse::cusparseSpMatAttribute_t,\n        data: *mut ::core::ffi::c_void,\n        dataSize: usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCreateCsr(\n        spMatDescr: *mut cuda_types::cusparse::cusparseSpMatDescr_t,\n        rows: i64,\n        cols: i64,\n        nnz: i64,\n        csrRowOffsets: *mut ::core::ffi::c_void,\n        csrColInd: *mut ::core::ffi::c_void,\n        csrValues: *mut ::core::ffi::c_void,\n        csrRowOffsetsType: cuda_types::cusparse::cusparseIndexType_t,\n        csrColIndType: cuda_types::cusparse::cusparseIndexType_t,\n        idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n        valueType: cuda_types::cusparse::cudaDataType,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCreateConstCsr(\n        spMatDescr: *mut cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        rows: i64,\n        cols: i64,\n        nnz: i64,\n        csrRowOffsets: *const ::core::ffi::c_void,\n        csrColInd: *const ::core::ffi::c_void,\n        csrValues: *const ::core::ffi::c_void,\n        csrRowOffsetsType: cuda_types::cusparse::cusparseIndexType_t,\n        csrColIndType: cuda_types::cusparse::cusparseIndexType_t,\n        idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n        valueType: cuda_types::cusparse::cudaDataType,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCreateCsc(\n        spMatDescr: *mut cuda_types::cusparse::cusparseSpMatDescr_t,\n        rows: i64,\n        cols: i64,\n        nnz: i64,\n        cscColOffsets: *mut ::core::ffi::c_void,\n        cscRowInd: *mut ::core::ffi::c_void,\n        cscValues: *mut ::core::ffi::c_void,\n        cscColOffsetsType: cuda_types::cusparse::cusparseIndexType_t,\n        cscRowIndType: cuda_types::cusparse::cusparseIndexType_t,\n        idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n        valueType: cuda_types::cusparse::cudaDataType,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCreateConstCsc(\n        spMatDescr: *mut cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        rows: i64,\n        cols: i64,\n        nnz: i64,\n        cscColOffsets: *const ::core::ffi::c_void,\n        cscRowInd: *const ::core::ffi::c_void,\n        cscValues: *const ::core::ffi::c_void,\n        cscColOffsetsType: cuda_types::cusparse::cusparseIndexType_t,\n        cscRowIndType: cuda_types::cusparse::cusparseIndexType_t,\n        idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n        valueType: cuda_types::cusparse::cudaDataType,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCsrGet(\n        spMatDescr: cuda_types::cusparse::cusparseSpMatDescr_t,\n        rows: *mut i64,\n        cols: *mut i64,\n        nnz: *mut i64,\n        csrRowOffsets: *mut *mut ::core::ffi::c_void,\n        csrColInd: *mut *mut ::core::ffi::c_void,\n        csrValues: *mut *mut ::core::ffi::c_void,\n        csrRowOffsetsType: *mut cuda_types::cusparse::cusparseIndexType_t,\n        csrColIndType: *mut cuda_types::cusparse::cusparseIndexType_t,\n        idxBase: *mut cuda_types::cusparse::cusparseIndexBase_t,\n        valueType: *mut cuda_types::cusparse::cudaDataType,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseConstCsrGet(\n        spMatDescr: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        rows: *mut i64,\n        cols: *mut i64,\n        nnz: *mut i64,\n        csrRowOffsets: *mut *const ::core::ffi::c_void,\n        csrColInd: *mut *const ::core::ffi::c_void,\n        csrValues: *mut *const ::core::ffi::c_void,\n        csrRowOffsetsType: *mut cuda_types::cusparse::cusparseIndexType_t,\n        csrColIndType: *mut cuda_types::cusparse::cusparseIndexType_t,\n        idxBase: *mut cuda_types::cusparse::cusparseIndexBase_t,\n        valueType: *mut cuda_types::cusparse::cudaDataType,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCscGet(\n        spMatDescr: cuda_types::cusparse::cusparseSpMatDescr_t,\n        rows: *mut i64,\n        cols: *mut i64,\n        nnz: *mut i64,\n        cscColOffsets: *mut *mut ::core::ffi::c_void,\n        cscRowInd: *mut *mut ::core::ffi::c_void,\n        cscValues: *mut *mut ::core::ffi::c_void,\n        cscColOffsetsType: *mut cuda_types::cusparse::cusparseIndexType_t,\n        cscRowIndType: *mut cuda_types::cusparse::cusparseIndexType_t,\n        idxBase: *mut cuda_types::cusparse::cusparseIndexBase_t,\n        valueType: *mut cuda_types::cusparse::cudaDataType,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseConstCscGet(\n        spMatDescr: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        rows: *mut i64,\n        cols: *mut i64,\n        nnz: *mut i64,\n        cscColOffsets: *mut *const ::core::ffi::c_void,\n        cscRowInd: *mut *const ::core::ffi::c_void,\n        cscValues: *mut *const ::core::ffi::c_void,\n        cscColOffsetsType: *mut cuda_types::cusparse::cusparseIndexType_t,\n        cscRowIndType: *mut cuda_types::cusparse::cusparseIndexType_t,\n        idxBase: *mut cuda_types::cusparse::cusparseIndexBase_t,\n        valueType: *mut cuda_types::cusparse::cudaDataType,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCsrSetPointers(\n        spMatDescr: cuda_types::cusparse::cusparseSpMatDescr_t,\n        csrRowOffsets: *mut ::core::ffi::c_void,\n        csrColInd: *mut ::core::ffi::c_void,\n        csrValues: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCscSetPointers(\n        spMatDescr: cuda_types::cusparse::cusparseSpMatDescr_t,\n        cscColOffsets: *mut ::core::ffi::c_void,\n        cscRowInd: *mut ::core::ffi::c_void,\n        cscValues: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCreateBsr(\n        spMatDescr: *mut cuda_types::cusparse::cusparseSpMatDescr_t,\n        brows: i64,\n        bcols: i64,\n        bnnz: i64,\n        rowBlockSize: i64,\n        colBlockSize: i64,\n        bsrRowOffsets: *mut ::core::ffi::c_void,\n        bsrColInd: *mut ::core::ffi::c_void,\n        bsrValues: *mut ::core::ffi::c_void,\n        bsrRowOffsetsType: cuda_types::cusparse::cusparseIndexType_t,\n        bsrColIndType: cuda_types::cusparse::cusparseIndexType_t,\n        idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n        valueType: cuda_types::cusparse::cudaDataType,\n        order: cuda_types::cusparse::cusparseOrder_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCreateConstBsr(\n        spMatDescr: *mut cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        brows: i64,\n        bcols: i64,\n        bnnz: i64,\n        rowBlockDim: i64,\n        colBlockDim: i64,\n        bsrRowOffsets: *const ::core::ffi::c_void,\n        bsrColInd: *const ::core::ffi::c_void,\n        bsrValues: *const ::core::ffi::c_void,\n        bsrRowOffsetsType: cuda_types::cusparse::cusparseIndexType_t,\n        bsrColIndType: cuda_types::cusparse::cusparseIndexType_t,\n        idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n        valueType: cuda_types::cusparse::cudaDataType,\n        order: cuda_types::cusparse::cusparseOrder_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCreateCoo(\n        spMatDescr: *mut cuda_types::cusparse::cusparseSpMatDescr_t,\n        rows: i64,\n        cols: i64,\n        nnz: i64,\n        cooRowInd: *mut ::core::ffi::c_void,\n        cooColInd: *mut ::core::ffi::c_void,\n        cooValues: *mut ::core::ffi::c_void,\n        cooIdxType: cuda_types::cusparse::cusparseIndexType_t,\n        idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n        valueType: cuda_types::cusparse::cudaDataType,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCreateConstCoo(\n        spMatDescr: *mut cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        rows: i64,\n        cols: i64,\n        nnz: i64,\n        cooRowInd: *const ::core::ffi::c_void,\n        cooColInd: *const ::core::ffi::c_void,\n        cooValues: *const ::core::ffi::c_void,\n        cooIdxType: cuda_types::cusparse::cusparseIndexType_t,\n        idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n        valueType: cuda_types::cusparse::cudaDataType,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCooGet(\n        spMatDescr: cuda_types::cusparse::cusparseSpMatDescr_t,\n        rows: *mut i64,\n        cols: *mut i64,\n        nnz: *mut i64,\n        cooRowInd: *mut *mut ::core::ffi::c_void,\n        cooColInd: *mut *mut ::core::ffi::c_void,\n        cooValues: *mut *mut ::core::ffi::c_void,\n        idxType: *mut cuda_types::cusparse::cusparseIndexType_t,\n        idxBase: *mut cuda_types::cusparse::cusparseIndexBase_t,\n        valueType: *mut cuda_types::cusparse::cudaDataType,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseConstCooGet(\n        spMatDescr: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        rows: *mut i64,\n        cols: *mut i64,\n        nnz: *mut i64,\n        cooRowInd: *mut *const ::core::ffi::c_void,\n        cooColInd: *mut *const ::core::ffi::c_void,\n        cooValues: *mut *const ::core::ffi::c_void,\n        idxType: *mut cuda_types::cusparse::cusparseIndexType_t,\n        idxBase: *mut cuda_types::cusparse::cusparseIndexBase_t,\n        valueType: *mut cuda_types::cusparse::cudaDataType,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCooSetPointers(\n        spMatDescr: cuda_types::cusparse::cusparseSpMatDescr_t,\n        cooRows: *mut ::core::ffi::c_void,\n        cooColumns: *mut ::core::ffi::c_void,\n        cooValues: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCreateBlockedEll(\n        spMatDescr: *mut cuda_types::cusparse::cusparseSpMatDescr_t,\n        rows: i64,\n        cols: i64,\n        ellBlockSize: i64,\n        ellCols: i64,\n        ellColInd: *mut ::core::ffi::c_void,\n        ellValue: *mut ::core::ffi::c_void,\n        ellIdxType: cuda_types::cusparse::cusparseIndexType_t,\n        idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n        valueType: cuda_types::cusparse::cudaDataType,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCreateConstBlockedEll(\n        spMatDescr: *mut cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        rows: i64,\n        cols: i64,\n        ellBlockSize: i64,\n        ellCols: i64,\n        ellColInd: *const ::core::ffi::c_void,\n        ellValue: *const ::core::ffi::c_void,\n        ellIdxType: cuda_types::cusparse::cusparseIndexType_t,\n        idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n        valueType: cuda_types::cusparse::cudaDataType,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseBlockedEllGet(\n        spMatDescr: cuda_types::cusparse::cusparseSpMatDescr_t,\n        rows: *mut i64,\n        cols: *mut i64,\n        ellBlockSize: *mut i64,\n        ellCols: *mut i64,\n        ellColInd: *mut *mut ::core::ffi::c_void,\n        ellValue: *mut *mut ::core::ffi::c_void,\n        ellIdxType: *mut cuda_types::cusparse::cusparseIndexType_t,\n        idxBase: *mut cuda_types::cusparse::cusparseIndexBase_t,\n        valueType: *mut cuda_types::cusparse::cudaDataType,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseConstBlockedEllGet(\n        spMatDescr: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        rows: *mut i64,\n        cols: *mut i64,\n        ellBlockSize: *mut i64,\n        ellCols: *mut i64,\n        ellColInd: *mut *const ::core::ffi::c_void,\n        ellValue: *mut *const ::core::ffi::c_void,\n        ellIdxType: *mut cuda_types::cusparse::cusparseIndexType_t,\n        idxBase: *mut cuda_types::cusparse::cusparseIndexBase_t,\n        valueType: *mut cuda_types::cusparse::cudaDataType,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCreateSlicedEll(\n        spMatDescr: *mut cuda_types::cusparse::cusparseSpMatDescr_t,\n        rows: i64,\n        cols: i64,\n        nnz: i64,\n        sellValuesSize: i64,\n        sliceSize: i64,\n        sellSliceOffsets: *mut ::core::ffi::c_void,\n        sellColInd: *mut ::core::ffi::c_void,\n        sellValues: *mut ::core::ffi::c_void,\n        sellSliceOffsetsType: cuda_types::cusparse::cusparseIndexType_t,\n        sellColIndType: cuda_types::cusparse::cusparseIndexType_t,\n        idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n        valueType: cuda_types::cusparse::cudaDataType,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCreateConstSlicedEll(\n        spMatDescr: *mut cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        rows: i64,\n        cols: i64,\n        nnz: i64,\n        sellValuesSize: i64,\n        sliceSize: i64,\n        sellSliceOffsets: *const ::core::ffi::c_void,\n        sellColInd: *const ::core::ffi::c_void,\n        sellValues: *const ::core::ffi::c_void,\n        sellSliceOffsetsType: cuda_types::cusparse::cusparseIndexType_t,\n        sellColIndType: cuda_types::cusparse::cusparseIndexType_t,\n        idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n        valueType: cuda_types::cusparse::cudaDataType,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCreateDnMat(\n        dnMatDescr: *mut cuda_types::cusparse::cusparseDnMatDescr_t,\n        rows: i64,\n        cols: i64,\n        ld: i64,\n        values: *mut ::core::ffi::c_void,\n        valueType: cuda_types::cusparse::cudaDataType,\n        order: cuda_types::cusparse::cusparseOrder_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseCreateConstDnMat(\n        dnMatDescr: *mut cuda_types::cusparse::cusparseConstDnMatDescr_t,\n        rows: i64,\n        cols: i64,\n        ld: i64,\n        values: *const ::core::ffi::c_void,\n        valueType: cuda_types::cusparse::cudaDataType,\n        order: cuda_types::cusparse::cusparseOrder_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDestroyDnMat(\n        dnMatDescr: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDnMatGet(\n        dnMatDescr: cuda_types::cusparse::cusparseDnMatDescr_t,\n        rows: *mut i64,\n        cols: *mut i64,\n        ld: *mut i64,\n        values: *mut *mut ::core::ffi::c_void,\n        type_: *mut cuda_types::cusparse::cudaDataType,\n        order: *mut cuda_types::cusparse::cusparseOrder_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseConstDnMatGet(\n        dnMatDescr: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n        rows: *mut i64,\n        cols: *mut i64,\n        ld: *mut i64,\n        values: *mut *const ::core::ffi::c_void,\n        type_: *mut cuda_types::cusparse::cudaDataType,\n        order: *mut cuda_types::cusparse::cusparseOrder_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDnMatGetValues(\n        dnMatDescr: cuda_types::cusparse::cusparseDnMatDescr_t,\n        values: *mut *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseConstDnMatGetValues(\n        dnMatDescr: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n        values: *mut *const ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDnMatSetValues(\n        dnMatDescr: cuda_types::cusparse::cusparseDnMatDescr_t,\n        values: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDnMatSetStridedBatch(\n        dnMatDescr: cuda_types::cusparse::cusparseDnMatDescr_t,\n        batchCount: ::core::ffi::c_int,\n        batchStride: i64,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDnMatGetStridedBatch(\n        dnMatDescr: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n        batchCount: *mut ::core::ffi::c_int,\n        batchStride: *mut i64,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseAxpby(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        alpha: *const ::core::ffi::c_void,\n        vecX: cuda_types::cusparse::cusparseConstSpVecDescr_t,\n        beta: *const ::core::ffi::c_void,\n        vecY: cuda_types::cusparse::cusparseDnVecDescr_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseGather(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        vecY: cuda_types::cusparse::cusparseConstDnVecDescr_t,\n        vecX: cuda_types::cusparse::cusparseSpVecDescr_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseScatter(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        vecX: cuda_types::cusparse::cusparseConstSpVecDescr_t,\n        vecY: cuda_types::cusparse::cusparseDnVecDescr_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseRot(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        c_coeff: *const ::core::ffi::c_void,\n        s_coeff: *const ::core::ffi::c_void,\n        vecX: cuda_types::cusparse::cusparseSpVecDescr_t,\n        vecY: cuda_types::cusparse::cusparseDnVecDescr_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpVV_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        opX: cuda_types::cusparse::cusparseOperation_t,\n        vecX: cuda_types::cusparse::cusparseConstSpVecDescr_t,\n        vecY: cuda_types::cusparse::cusparseConstDnVecDescr_t,\n        result: *const ::core::ffi::c_void,\n        computeType: cuda_types::cusparse::cudaDataType,\n        bufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpVV(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        opX: cuda_types::cusparse::cusparseOperation_t,\n        vecX: cuda_types::cusparse::cusparseConstSpVecDescr_t,\n        vecY: cuda_types::cusparse::cusparseConstDnVecDescr_t,\n        result: *mut ::core::ffi::c_void,\n        computeType: cuda_types::cusparse::cudaDataType,\n        externalBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSparseToDense_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        matB: cuda_types::cusparse::cusparseDnMatDescr_t,\n        alg: cuda_types::cusparse::cusparseSparseToDenseAlg_t,\n        bufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSparseToDense(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        matB: cuda_types::cusparse::cusparseDnMatDescr_t,\n        alg: cuda_types::cusparse::cusparseSparseToDenseAlg_t,\n        externalBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDenseToSparse_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        matA: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n        matB: cuda_types::cusparse::cusparseSpMatDescr_t,\n        alg: cuda_types::cusparse::cusparseDenseToSparseAlg_t,\n        bufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDenseToSparse_analysis(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        matA: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n        matB: cuda_types::cusparse::cusparseSpMatDescr_t,\n        alg: cuda_types::cusparse::cusparseDenseToSparseAlg_t,\n        externalBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseDenseToSparse_convert(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        matA: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n        matB: cuda_types::cusparse::cusparseSpMatDescr_t,\n        alg: cuda_types::cusparse::cusparseDenseToSparseAlg_t,\n        externalBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpMV(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        opA: cuda_types::cusparse::cusparseOperation_t,\n        alpha: *const ::core::ffi::c_void,\n        matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        vecX: cuda_types::cusparse::cusparseConstDnVecDescr_t,\n        beta: *const ::core::ffi::c_void,\n        vecY: cuda_types::cusparse::cusparseDnVecDescr_t,\n        computeType: cuda_types::cusparse::cudaDataType,\n        alg: cuda_types::cusparse::cusparseSpMVAlg_t,\n        externalBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpMV_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        opA: cuda_types::cusparse::cusparseOperation_t,\n        alpha: *const ::core::ffi::c_void,\n        matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        vecX: cuda_types::cusparse::cusparseConstDnVecDescr_t,\n        beta: *const ::core::ffi::c_void,\n        vecY: cuda_types::cusparse::cusparseDnVecDescr_t,\n        computeType: cuda_types::cusparse::cudaDataType,\n        alg: cuda_types::cusparse::cusparseSpMVAlg_t,\n        bufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpMV_preprocess(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        opA: cuda_types::cusparse::cusparseOperation_t,\n        alpha: *const ::core::ffi::c_void,\n        matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        vecX: cuda_types::cusparse::cusparseConstDnVecDescr_t,\n        beta: *const ::core::ffi::c_void,\n        vecY: cuda_types::cusparse::cusparseDnVecDescr_t,\n        computeType: cuda_types::cusparse::cudaDataType,\n        alg: cuda_types::cusparse::cusparseSpMVAlg_t,\n        externalBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpSV_createDescr(\n        descr: *mut cuda_types::cusparse::cusparseSpSVDescr_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpSV_destroyDescr(\n        descr: cuda_types::cusparse::cusparseSpSVDescr_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpSV_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        opA: cuda_types::cusparse::cusparseOperation_t,\n        alpha: *const ::core::ffi::c_void,\n        matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        vecX: cuda_types::cusparse::cusparseConstDnVecDescr_t,\n        vecY: cuda_types::cusparse::cusparseDnVecDescr_t,\n        computeType: cuda_types::cusparse::cudaDataType,\n        alg: cuda_types::cusparse::cusparseSpSVAlg_t,\n        spsvDescr: cuda_types::cusparse::cusparseSpSVDescr_t,\n        bufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpSV_analysis(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        opA: cuda_types::cusparse::cusparseOperation_t,\n        alpha: *const ::core::ffi::c_void,\n        matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        vecX: cuda_types::cusparse::cusparseConstDnVecDescr_t,\n        vecY: cuda_types::cusparse::cusparseDnVecDescr_t,\n        computeType: cuda_types::cusparse::cudaDataType,\n        alg: cuda_types::cusparse::cusparseSpSVAlg_t,\n        spsvDescr: cuda_types::cusparse::cusparseSpSVDescr_t,\n        externalBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpSV_solve(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        opA: cuda_types::cusparse::cusparseOperation_t,\n        alpha: *const ::core::ffi::c_void,\n        matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        vecX: cuda_types::cusparse::cusparseConstDnVecDescr_t,\n        vecY: cuda_types::cusparse::cusparseDnVecDescr_t,\n        computeType: cuda_types::cusparse::cudaDataType,\n        alg: cuda_types::cusparse::cusparseSpSVAlg_t,\n        spsvDescr: cuda_types::cusparse::cusparseSpSVDescr_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpSV_updateMatrix(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        spsvDescr: cuda_types::cusparse::cusparseSpSVDescr_t,\n        newValues: *mut ::core::ffi::c_void,\n        updatePart: cuda_types::cusparse::cusparseSpSVUpdate_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpSM_createDescr(\n        descr: *mut cuda_types::cusparse::cusparseSpSMDescr_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpSM_destroyDescr(\n        descr: cuda_types::cusparse::cusparseSpSMDescr_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpSM_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        opA: cuda_types::cusparse::cusparseOperation_t,\n        opB: cuda_types::cusparse::cusparseOperation_t,\n        alpha: *const ::core::ffi::c_void,\n        matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        matB: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n        matC: cuda_types::cusparse::cusparseDnMatDescr_t,\n        computeType: cuda_types::cusparse::cudaDataType,\n        alg: cuda_types::cusparse::cusparseSpSMAlg_t,\n        spsmDescr: cuda_types::cusparse::cusparseSpSMDescr_t,\n        bufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpSM_analysis(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        opA: cuda_types::cusparse::cusparseOperation_t,\n        opB: cuda_types::cusparse::cusparseOperation_t,\n        alpha: *const ::core::ffi::c_void,\n        matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        matB: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n        matC: cuda_types::cusparse::cusparseDnMatDescr_t,\n        computeType: cuda_types::cusparse::cudaDataType,\n        alg: cuda_types::cusparse::cusparseSpSMAlg_t,\n        spsmDescr: cuda_types::cusparse::cusparseSpSMDescr_t,\n        externalBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpSM_solve(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        opA: cuda_types::cusparse::cusparseOperation_t,\n        opB: cuda_types::cusparse::cusparseOperation_t,\n        alpha: *const ::core::ffi::c_void,\n        matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        matB: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n        matC: cuda_types::cusparse::cusparseDnMatDescr_t,\n        computeType: cuda_types::cusparse::cudaDataType,\n        alg: cuda_types::cusparse::cusparseSpSMAlg_t,\n        spsmDescr: cuda_types::cusparse::cusparseSpSMDescr_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpSM_updateMatrix(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        spsmDescr: cuda_types::cusparse::cusparseSpSMDescr_t,\n        newValues: *mut ::core::ffi::c_void,\n        updatePart: cuda_types::cusparse::cusparseSpSMUpdate_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpMM_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        opA: cuda_types::cusparse::cusparseOperation_t,\n        opB: cuda_types::cusparse::cusparseOperation_t,\n        alpha: *const ::core::ffi::c_void,\n        matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        matB: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n        beta: *const ::core::ffi::c_void,\n        matC: cuda_types::cusparse::cusparseDnMatDescr_t,\n        computeType: cuda_types::cusparse::cudaDataType,\n        alg: cuda_types::cusparse::cusparseSpMMAlg_t,\n        bufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpMM_preprocess(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        opA: cuda_types::cusparse::cusparseOperation_t,\n        opB: cuda_types::cusparse::cusparseOperation_t,\n        alpha: *const ::core::ffi::c_void,\n        matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        matB: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n        beta: *const ::core::ffi::c_void,\n        matC: cuda_types::cusparse::cusparseDnMatDescr_t,\n        computeType: cuda_types::cusparse::cudaDataType,\n        alg: cuda_types::cusparse::cusparseSpMMAlg_t,\n        externalBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpMM(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        opA: cuda_types::cusparse::cusparseOperation_t,\n        opB: cuda_types::cusparse::cusparseOperation_t,\n        alpha: *const ::core::ffi::c_void,\n        matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        matB: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n        beta: *const ::core::ffi::c_void,\n        matC: cuda_types::cusparse::cusparseDnMatDescr_t,\n        computeType: cuda_types::cusparse::cudaDataType,\n        alg: cuda_types::cusparse::cusparseSpMMAlg_t,\n        externalBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpGEMM_createDescr(\n        descr: *mut cuda_types::cusparse::cusparseSpGEMMDescr_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpGEMM_destroyDescr(\n        descr: cuda_types::cusparse::cusparseSpGEMMDescr_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpGEMM_workEstimation(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        opA: cuda_types::cusparse::cusparseOperation_t,\n        opB: cuda_types::cusparse::cusparseOperation_t,\n        alpha: *const ::core::ffi::c_void,\n        matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        matB: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        beta: *const ::core::ffi::c_void,\n        matC: cuda_types::cusparse::cusparseSpMatDescr_t,\n        computeType: cuda_types::cusparse::cudaDataType,\n        alg: cuda_types::cusparse::cusparseSpGEMMAlg_t,\n        spgemmDescr: cuda_types::cusparse::cusparseSpGEMMDescr_t,\n        bufferSize1: *mut usize,\n        externalBuffer1: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpGEMM_getNumProducts(\n        spgemmDescr: cuda_types::cusparse::cusparseSpGEMMDescr_t,\n        num_prods: *mut i64,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpGEMM_estimateMemory(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        opA: cuda_types::cusparse::cusparseOperation_t,\n        opB: cuda_types::cusparse::cusparseOperation_t,\n        alpha: *const ::core::ffi::c_void,\n        matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        matB: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        beta: *const ::core::ffi::c_void,\n        matC: cuda_types::cusparse::cusparseSpMatDescr_t,\n        computeType: cuda_types::cusparse::cudaDataType,\n        alg: cuda_types::cusparse::cusparseSpGEMMAlg_t,\n        spgemmDescr: cuda_types::cusparse::cusparseSpGEMMDescr_t,\n        chunk_fraction: f32,\n        bufferSize3: *mut usize,\n        externalBuffer3: *mut ::core::ffi::c_void,\n        bufferSize2: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpGEMM_compute(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        opA: cuda_types::cusparse::cusparseOperation_t,\n        opB: cuda_types::cusparse::cusparseOperation_t,\n        alpha: *const ::core::ffi::c_void,\n        matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        matB: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        beta: *const ::core::ffi::c_void,\n        matC: cuda_types::cusparse::cusparseSpMatDescr_t,\n        computeType: cuda_types::cusparse::cudaDataType,\n        alg: cuda_types::cusparse::cusparseSpGEMMAlg_t,\n        spgemmDescr: cuda_types::cusparse::cusparseSpGEMMDescr_t,\n        bufferSize2: *mut usize,\n        externalBuffer2: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpGEMM_copy(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        opA: cuda_types::cusparse::cusparseOperation_t,\n        opB: cuda_types::cusparse::cusparseOperation_t,\n        alpha: *const ::core::ffi::c_void,\n        matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        matB: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        beta: *const ::core::ffi::c_void,\n        matC: cuda_types::cusparse::cusparseSpMatDescr_t,\n        computeType: cuda_types::cusparse::cudaDataType,\n        alg: cuda_types::cusparse::cusparseSpGEMMAlg_t,\n        spgemmDescr: cuda_types::cusparse::cusparseSpGEMMDescr_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpGEMMreuse_workEstimation(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        opA: cuda_types::cusparse::cusparseOperation_t,\n        opB: cuda_types::cusparse::cusparseOperation_t,\n        matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        matB: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        matC: cuda_types::cusparse::cusparseSpMatDescr_t,\n        alg: cuda_types::cusparse::cusparseSpGEMMAlg_t,\n        spgemmDescr: cuda_types::cusparse::cusparseSpGEMMDescr_t,\n        bufferSize1: *mut usize,\n        externalBuffer1: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpGEMMreuse_nnz(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        opA: cuda_types::cusparse::cusparseOperation_t,\n        opB: cuda_types::cusparse::cusparseOperation_t,\n        matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        matB: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        matC: cuda_types::cusparse::cusparseSpMatDescr_t,\n        alg: cuda_types::cusparse::cusparseSpGEMMAlg_t,\n        spgemmDescr: cuda_types::cusparse::cusparseSpGEMMDescr_t,\n        bufferSize2: *mut usize,\n        externalBuffer2: *mut ::core::ffi::c_void,\n        bufferSize3: *mut usize,\n        externalBuffer3: *mut ::core::ffi::c_void,\n        bufferSize4: *mut usize,\n        externalBuffer4: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpGEMMreuse_copy(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        opA: cuda_types::cusparse::cusparseOperation_t,\n        opB: cuda_types::cusparse::cusparseOperation_t,\n        matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        matB: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        matC: cuda_types::cusparse::cusparseSpMatDescr_t,\n        alg: cuda_types::cusparse::cusparseSpGEMMAlg_t,\n        spgemmDescr: cuda_types::cusparse::cusparseSpGEMMDescr_t,\n        bufferSize5: *mut usize,\n        externalBuffer5: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpGEMMreuse_compute(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        opA: cuda_types::cusparse::cusparseOperation_t,\n        opB: cuda_types::cusparse::cusparseOperation_t,\n        alpha: *const ::core::ffi::c_void,\n        matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        matB: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        beta: *const ::core::ffi::c_void,\n        matC: cuda_types::cusparse::cusparseSpMatDescr_t,\n        computeType: cuda_types::cusparse::cudaDataType,\n        alg: cuda_types::cusparse::cusparseSpGEMMAlg_t,\n        spgemmDescr: cuda_types::cusparse::cusparseSpGEMMDescr_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSDDMM_bufferSize(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        opA: cuda_types::cusparse::cusparseOperation_t,\n        opB: cuda_types::cusparse::cusparseOperation_t,\n        alpha: *const ::core::ffi::c_void,\n        matA: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n        matB: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n        beta: *const ::core::ffi::c_void,\n        matC: cuda_types::cusparse::cusparseSpMatDescr_t,\n        computeType: cuda_types::cusparse::cudaDataType,\n        alg: cuda_types::cusparse::cusparseSDDMMAlg_t,\n        bufferSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSDDMM_preprocess(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        opA: cuda_types::cusparse::cusparseOperation_t,\n        opB: cuda_types::cusparse::cusparseOperation_t,\n        alpha: *const ::core::ffi::c_void,\n        matA: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n        matB: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n        beta: *const ::core::ffi::c_void,\n        matC: cuda_types::cusparse::cusparseSpMatDescr_t,\n        computeType: cuda_types::cusparse::cudaDataType,\n        alg: cuda_types::cusparse::cusparseSDDMMAlg_t,\n        externalBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSDDMM(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        opA: cuda_types::cusparse::cusparseOperation_t,\n        opB: cuda_types::cusparse::cusparseOperation_t,\n        alpha: *const ::core::ffi::c_void,\n        matA: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n        matB: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n        beta: *const ::core::ffi::c_void,\n        matC: cuda_types::cusparse::cusparseSpMatDescr_t,\n        computeType: cuda_types::cusparse::cudaDataType,\n        alg: cuda_types::cusparse::cusparseSDDMMAlg_t,\n        externalBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpMMOp_createPlan(\n        handle: cuda_types::cusparse::cusparseHandle_t,\n        plan: *mut cuda_types::cusparse::cusparseSpMMOpPlan_t,\n        opA: cuda_types::cusparse::cusparseOperation_t,\n        opB: cuda_types::cusparse::cusparseOperation_t,\n        matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n        matB: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n        matC: cuda_types::cusparse::cusparseDnMatDescr_t,\n        computeType: cuda_types::cusparse::cudaDataType,\n        alg: cuda_types::cusparse::cusparseSpMMOpAlg_t,\n        addOperationNvvmBuffer: *const ::core::ffi::c_void,\n        addOperationBufferSize: usize,\n        mulOperationNvvmBuffer: *const ::core::ffi::c_void,\n        mulOperationBufferSize: usize,\n        epilogueNvvmBuffer: *const ::core::ffi::c_void,\n        epilogueBufferSize: usize,\n        SpMMWorkspaceSize: *mut usize,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpMMOp(\n        plan: cuda_types::cusparse::cusparseSpMMOpPlan_t,\n        externalBuffer: *mut ::core::ffi::c_void,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n    #[must_use]\n    fn cusparseSpMMOp_destroyPlan(\n        plan: cuda_types::cusparse::cusparseSpMMOpPlan_t,\n    ) -> cuda_types::cusparse::cusparseStatus_t;\n}\n"
  },
  {
    "path": "cuda_macros/src/lib.rs",
    "content": "extern crate proc_macro;\n\nuse proc_macro::TokenStream;\nuse proc_macro2::Span;\nuse quote::{format_ident, quote, ToTokens};\nuse rustc_hash::FxHashMap;\nuse std::iter;\nuse syn::parse::{Parse, ParseStream};\nuse syn::punctuated::Punctuated;\nuse syn::visit_mut::VisitMut;\nuse syn::{\n    bracketed, parse_macro_input, File, ForeignItem, ForeignItemFn, Ident, Item, Path, Signature,\n    Token\n};\n\nconst CUDA_RS: &'static str = include_str! {\"cuda.rs\"};\nconst NVML_RS: &'static str = include_str! {\"nvml.rs\"};\nconst CUBLAS_RS: &'static str = include_str! {\"cublas.rs\"};\nconst CUBLASLT_RS: &'static str = include_str! {\"cublaslt.rs\"};\nconst CUBLASLT_INTERNAL_RS: &'static str = include_str! {\"cublaslt_internal.rs\"};\nconst CUFFT_RS: &'static str = include_str! {\"cufft.rs\"};\nconst CUSPARSE_RS: &'static str = include_str! {\"cusparse.rs\"};\nconst CUDNN8_RS: &'static str = include_str! {\"cudnn8.rs\"};\nconst CUDNN9_RS: &'static str = include_str! {\"cudnn9.rs\"};\nconst ROCBLAS_RS: &'static str = include_str! {\"../../ext/rocblas-sys/src/lib.rs\"};\nconst ROCSPARSE_RS: &'static str = include_str! {\"../../ext/rocsparse-sys/src/lib.rs\"};\nconst HIPBLASLT_RS: &'static str = include_str! {\"../../ext/hipblaslt-sys/src/lib.rs\"};\nconst MIOPEN_RS: &'static str = include_str! {\"../../ext/miopen-sys/src/lib.rs\"};\n\n// This macro accepts following arguments:\n// * `normal_macro`: ident for a normal macro\n// * zero or more:\n//   * `override_macro`: ident for an override macro\n//   * `override_fns`: list of override functions\n// Then macro goes through every function in rust.rs, and for every fn `foo`:\n// * if `foo` is contained in `override_fns` then pass it into `override_macro`\n// * if `foo` is not contained in `override_fns` pass it to `normal_macro`\n// Both `override_macro` and `normal_macro` expect semicolon-separated list:\n//   macro_foo!(\n//      \"system\" fn cuCtxDetach(ctx: CUcontext) -> CUresult;\n//      \"system\" fn cuCtxDetach(ctx: CUcontext) -> CUresult\n//   )\n// Additionally, it does a fixup of CUDA types so they get prefixed with `type_path`\n#[proc_macro]\npub fn cuda_function_declarations(tokens: TokenStream) -> TokenStream {\n    function_declarations(tokens, CUDA_RS, false)\n}\n\n#[proc_macro]\npub fn cublas_function_declarations(tokens: TokenStream) -> TokenStream {\n    function_declarations(tokens, CUBLAS_RS, false)\n}\n\n#[proc_macro]\npub fn cublaslt_function_declarations(tokens: TokenStream) -> TokenStream {\n    function_declarations(tokens, CUBLASLT_RS, false)\n}\n\n#[proc_macro]\npub fn cublaslt_internal_function_declarations(tokens: TokenStream) -> TokenStream {\n    function_declarations(tokens, CUBLASLT_INTERNAL_RS, false)\n}\n\n#[proc_macro]\npub fn cufft_function_declarations(tokens: TokenStream) -> TokenStream {\n    function_declarations(tokens, CUFFT_RS, false)\n}\n\n#[proc_macro]\npub fn cusparse_function_declarations(tokens: TokenStream) -> TokenStream {\n    function_declarations(tokens, CUSPARSE_RS, false)\n}\n\n#[proc_macro]\npub fn cudnn8_function_declarations(tokens: TokenStream) -> TokenStream {\n    function_declarations(tokens, CUDNN8_RS, false)\n}\n\n#[proc_macro]\npub fn cudnn9_function_declarations(tokens: TokenStream) -> TokenStream {\n    function_declarations(tokens, CUDNN9_RS, false)\n}\n\n#[proc_macro]\npub fn rocblas_function_declarations(tokens: TokenStream) -> TokenStream {\n    function_declarations(tokens, ROCBLAS_RS, true)\n}\n\n#[proc_macro]\npub fn rocsparse_function_declarations(tokens: TokenStream) -> TokenStream {\n    function_declarations(tokens, ROCSPARSE_RS, true)\n}\n\n#[proc_macro]\npub fn hipblaslt_function_declarations(tokens: TokenStream) -> TokenStream {\n    function_declarations(tokens, HIPBLASLT_RS, true)\n}\n\n#[proc_macro]\npub fn miopen_function_declarations(tokens: TokenStream) -> TokenStream {\n    function_declarations(tokens, MIOPEN_RS, true)\n}\n\nfn function_declarations(tokens: TokenStream, module: &str, relaxed: bool) -> TokenStream {\n    let input = parse_macro_input!(tokens as FnDeclInput);\n    let mut cuda_module = syn::parse_str::<File>(module).unwrap();\n    let mut choose_macro = ChooseMacro::new(input);\n    syn::visit_mut::visit_file_mut(&mut FixFnSignatures, &mut cuda_module);\n    for item in cuda_module.items {\n        let extern_ = if let Item::ForeignMod(extern_) = item {\n            extern_\n        } else if relaxed {\n            continue;\n        } else {\n            unreachable!()\n        };\n        let abi = extern_.abi.name;\n        for mut item in extern_.items {\n            if let ForeignItem::Fn(ForeignItemFn {\n                sig: Signature { ref ident, ref mut output, ref variadic, .. },\n                ref mut attrs,\n                ref mut vis,\n                ..\n            }) = item\n            {\n                if relaxed {\n                    if variadic.is_some() {\n                        continue;\n                    }\n                    *vis = syn::Visibility::Inherited;\n                    if output == &syn::ReturnType::Default {\n                        *output = syn::ReturnType::Type(\n                            Token![->](Span::call_site()),\n                            Box::new(syn::parse_quote! { () }),\n                        );\n                    }\n                }\n                *attrs = Vec::new();\n                choose_macro.add(ident, quote! { #abi #item });\n            } else {\n                unreachable!()\n            }\n        }\n    }\n    let mut result = proc_macro2::TokenStream::new();\n    for (path, items) in\n        iter::once(choose_macro.default).chain(choose_macro.override_sets.into_iter())\n    {\n        if items.is_empty() {\n            continue;\n        }\n        quote! {\n            #path ! { #(#items)* }\n        }\n        .to_tokens(&mut result);\n    }\n    result.into()\n}\n\n#[proc_macro]\npub fn nvml_function_declarations(tokens: TokenStream) -> TokenStream {\n    function_declarations(tokens, NVML_RS, false)\n}\nstruct FnDeclInput {\n    normal_macro: Path,\n    overrides: Punctuated<OverrideMacro, Token![,]>,\n}\n\nimpl Parse for FnDeclInput {\n    fn parse(input: ParseStream) -> syn::Result<Self> {\n        let normal_macro = input.parse::<Path>()?;\n        let overrides = if input.is_empty() {\n            Punctuated::new()\n        } else {\n            input.parse::<Token![,]>()?;\n            input.parse_terminated(OverrideMacro::parse, Token![,])?\n        };\n        Ok(Self {\n            normal_macro,\n            overrides,\n        })\n    }\n}\nstruct OverrideMacro {\n    macro_: Path,\n    functions: Punctuated<Ident, Token![,]>,\n}\n\nimpl Parse for OverrideMacro {\n    fn parse(input: ParseStream) -> syn::Result<Self> {\n        let macro_ = input.parse::<Path>()?;\n        input.parse::<Token![<=]>()?;\n        let functions_content;\n        bracketed!(functions_content in input);\n        let functions = functions_content.parse_terminated(Ident::parse, Token![,])?;\n        Ok(Self { macro_, functions })\n    }\n}\n\nstruct ChooseMacro {\n    default: (Path, Vec<proc_macro2::TokenStream>),\n    override_lookup: FxHashMap<Ident, Path>,\n    override_sets: FxHashMap<Path, Vec<proc_macro2::TokenStream>>,\n}\n\nimpl ChooseMacro {\n    fn new(input: FnDeclInput) -> Self {\n        let mut override_lookup = FxHashMap::default();\n        let mut override_sets = FxHashMap::default();\n        for OverrideMacro { macro_, functions } in input.overrides {\n            for ident in functions {\n                override_lookup.insert(ident, macro_.clone());\n                override_sets.insert(macro_.clone(), Vec::new());\n            }\n        }\n        Self {\n            default: (input.normal_macro, Vec::new()),\n            override_lookup,\n            override_sets,\n        }\n    }\n\n    fn add(&mut self, ident: &Ident, tokens: proc_macro2::TokenStream) {\n        match self.override_lookup.get(ident) {\n            Some(override_macro) => {\n                self.override_sets\n                    .get_mut(override_macro)\n                    .unwrap()\n                    .push(tokens);\n            }\n            None => self.default.1.push(tokens),\n        }\n    }\n}\n\n// For some reason prettyplease will append trailing comma *only*\n// if there are two or more arguments\nstruct FixFnSignatures;\n\nimpl VisitMut for FixFnSignatures {\n    fn visit_signature_mut(&mut self, s: &mut syn::Signature) {\n        s.inputs.pop_punct();\n    }\n}\n\nconst MODULES: &[&str] = &[\n    \"context\", \"device\", \"driver\", \"event\", \"function\", \"graph\", \"kernel\",\n    \"library\", \"link\", \"memory\", \"module\", \"pointer\", \"stream\"\n];\n\nfn normalize_fn_impl(\n    prefix: &str,\n    default_module: Option<&str>,\n    tokens: TokenStream,\n) -> TokenStream {\n    let mut path = parse_macro_input!(tokens as syn::Path);\n    let fn_ = path\n        .segments\n        .pop()\n        .unwrap()\n        .into_tuple()\n        .0\n        .ident\n        .to_string();\n    let already_has_module = MODULES.contains(&&*path.segments.last().unwrap().ident.to_string());\n    let segments: Vec<String> = split(&fn_[prefix.len()..]); // skip \"cu\"\n    let fn_path = join(segments, default_module.filter(|_| !already_has_module));\n    quote! {\n        #path #fn_path\n    }\n    .into()\n}\n\n#[proc_macro]\npub fn cuda_normalize_fn(tokens: TokenStream) -> TokenStream {\n    normalize_fn_impl(\"cu\", Some(\"driver\"), tokens)\n}\n\n#[proc_macro]\npub fn cublas_normalize_fn(tokens: TokenStream) -> TokenStream {\n    normalize_fn_impl(\"cublas\", None, tokens)\n}\n\n#[proc_macro]\npub fn cublaslt_normalize_fn(tokens: TokenStream) -> TokenStream {\n    normalize_fn_impl(\"cublasLt\", None, tokens)\n}\n\n#[proc_macro]\npub fn cudnn_normalize_fn(tokens: TokenStream) -> TokenStream {\n    normalize_fn_impl(\"cudnn\", None, tokens)\n}\n\n#[proc_macro]\npub fn cusparse_normalize_fn(tokens: TokenStream) -> TokenStream {\n    normalize_fn_impl(\"cusparse\", None, tokens)\n}\n\n#[proc_macro]\npub fn nvml_normalize_fn(tokens: TokenStream) -> TokenStream {\n    normalize_fn_impl(\"nvml\", None, tokens)\n}\n\nfn split(fn_: &str) -> Vec<String> {\n    let mut result = Vec::new();\n    let mut chars: iter::Peekable<_> = fn_.chars().peekable();\n    while let Some(c) = chars.next() {\n        // Special handling of 2D/3D etc.\n        if c.is_ascii_digit() && chars.peek() == Some(&'D') {\n            chars.next();\n            result.push(format!(\"{c}d\"));\n            continue;\n        }\n        if c.is_ascii_uppercase() {\n            result.push(c.to_ascii_lowercase().to_string());\n        } else {\n            result.last_mut().unwrap().push(c);\n        }\n    }\n    result\n}\n\nfn join(\n    fn_: Vec<String>,\n    default_module: Option<&str>,\n) -> Punctuated<Ident, Token![::]> {\n    fn full_form(segment: &str) -> Option<&[&str]> {\n        Some(match segment {\n            \"ctx\" => &[\"context\"],\n            \"func\" => &[\"function\"],\n            \"mem\" => &[\"memory\"],\n            \"memcpy\" => &[\"memory\", \"copy\"],\n            \"memset\" => &[\"memory\", \"set\"],\n            _ => return None,\n        })\n    }\n    let mut normalized: Vec<&str> = Vec::new();\n    for segment in fn_.iter() {\n        match full_form(segment) {\n            Some(segments) => normalized.extend(segments.into_iter()),\n            None => normalized.push(&*segment),\n        }\n    }\n    if let Some(default_module) = default_module {\n        if !MODULES.contains(&normalized[0]) {\n        let mut globalized = vec![default_module];\n        globalized.extend(normalized);\n        normalized = globalized;\n    }\n    let (module, path) = normalized.split_first().unwrap();\n    let path = path.join(\"_\");\n    [module, &&*path]\n        .into_iter()\n        .map(|s| Ident::new(s, Span::call_site()))\n        .collect()\n    } else {\n        return [Ident::new(&normalized.join(\"_\"), Span::call_site())]\n            .into_iter()\n            .collect();\n    }\n\n}\n\n#[proc_macro_attribute]\npub fn test_cuda(_attr: TokenStream, item: TokenStream) -> TokenStream {\n    let fn_ = parse_macro_input!(item as syn::ItemFn);\n    let cuda_fn = format_ident!(\"{}{}\", fn_.sig.ident, \"_nvidia\");\n    let zluda_fn = format_ident!(\"{}{}\", fn_.sig.ident, \"_zluda\");\n    let fn_name = fn_.sig.ident.clone();\n    quote! {\n        #[test]\n        fn #cuda_fn() {\n            unsafe { #fn_name(<crate::tests::Cuda>::new()) }\n        }\n        #[test]\n        fn #zluda_fn() {\n            unsafe { #fn_name(<crate::tests::Zluda>::new()) }\n        }\n\n        #fn_\n    }.into()\n}\n"
  },
  {
    "path": "cuda_macros/src/nvml.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\nextern \"system\" {\n    #[must_use]\n    /** Initialize NVML, but don't initialize any GPUs yet.\n\n \\note nvmlInit_v3 introduces a \"flags\" argument, that allows passing boolean values\n       modifying the behaviour of nvmlInit().\n \\note In NVML 5.319 new nvmlInit_v2 has replaced nvmlInit\"_v1\" (default in NVML 4.304 and older) that\n       did initialize all GPU devices in the system.\n\n This allows NVML to communicate with a GPU\n when other GPUs in the system are unstable or in a bad state.  When using this API, GPUs are\n discovered and initialized in nvmlDeviceGetHandleBy* functions instead.\n\n \\note To contrast nvmlInit_v2 with nvmlInit\"_v1\", NVML 4.304 nvmlInit\"_v1\" will fail when any detected GPU is in\n       a bad or unstable state.\n\n For all products.\n\n This method, should be called once before invoking any other methods in the library.\n A reference count of the number of initializations is maintained.  Shutdown only occurs\n when the reference count reaches zero.\n\n @return\n         - \\ref NVML_SUCCESS                   if NVML has been properly initialized\n         - \\ref NVML_ERROR_DRIVER_NOT_LOADED   if NVIDIA driver is not running\n         - \\ref NVML_ERROR_NO_PERMISSION       if NVML does not have permission to talk to the driver\n         - \\ref NVML_ERROR_UNKNOWN             on any unexpected error*/\n    fn nvmlInit_v2() -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** nvmlInitWithFlags is a variant of nvmlInit(), that allows passing a set of boolean values\n       modifying the behaviour of nvmlInit().\n       Other than the \"flags\" parameter it is completely similar to \\ref nvmlInit_v2.\n\n For all products.\n\n @param flags                                 behaviour modifier flags\n\n @return\n         - \\ref NVML_SUCCESS                   if NVML has been properly initialized\n         - \\ref NVML_ERROR_DRIVER_NOT_LOADED   if NVIDIA driver is not running\n         - \\ref NVML_ERROR_NO_PERMISSION       if NVML does not have permission to talk to the driver\n         - \\ref NVML_ERROR_UNKNOWN             on any unexpected error*/\n    fn nvmlInitWithFlags(flags: ::core::ffi::c_uint) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Shut down NVML by releasing all GPU resources previously allocated with \\ref nvmlInit_v2().\n\n For all products.\n\n This method should be called after NVML work is done, once for each call to \\ref nvmlInit_v2()\n A reference count of the number of initializations is maintained.  Shutdown only occurs\n when the reference count reaches zero.  For backwards compatibility, no error is reported if\n nvmlShutdown() is called more times than nvmlInit().\n\n @return\n         - \\ref NVML_SUCCESS                 if NVML has been properly shut down\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlShutdown() -> cuda_types::nvml::nvmlReturn_t;\n    /** Helper method for converting NVML error codes into readable strings.\n\n For all products.\n\n @param result                               NVML error code to convert\n\n @return String representation of the error.\n*/\n    fn nvmlErrorString(\n        result: cuda_types::nvml::nvmlReturn_t,\n    ) -> *const ::core::ffi::c_char;\n    #[must_use]\n    /** Retrieves the version of the system's graphics driver.\n\n For all products.\n\n The version identifier is an alphanumeric string.  It will not exceed 80 characters in length\n (including the NULL terminator).  See \\ref nvmlConstants::NVML_SYSTEM_DRIVER_VERSION_BUFFER_SIZE.\n\n @param version                              Reference in which to return the version identifier\n @param length                               The maximum allowed length of the string returned in \\a version\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a version has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a version is NULL\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a length is too small*/\n    fn nvmlSystemGetDriverVersion(\n        version: *mut ::core::ffi::c_char,\n        length: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the version of the NVML library.\n\n For all products.\n\n The version identifier is an alphanumeric string.  It will not exceed 80 characters in length\n (including the NULL terminator).  See \\ref nvmlConstants::NVML_SYSTEM_NVML_VERSION_BUFFER_SIZE.\n\n @param version                              Reference in which to return the version identifier\n @param length                               The maximum allowed length of the string returned in \\a version\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a version has been set\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a version is NULL\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a length is too small*/\n    fn nvmlSystemGetNVMLVersion(\n        version: *mut ::core::ffi::c_char,\n        length: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the version of the CUDA driver.\n\n For all products.\n\n The CUDA driver version returned will be retreived from the currently installed version of CUDA.\n If the cuda library is not found, this function will return a known supported version number.\n\n @param cudaDriverVersion                    Reference in which to return the version identifier\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a cudaDriverVersion has been set\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a cudaDriverVersion is NULL*/\n    fn nvmlSystemGetCudaDriverVersion(\n        cudaDriverVersion: *mut ::core::ffi::c_int,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the version of the CUDA driver from the shared library.\n\n For all products.\n\n The returned CUDA driver version by calling cuDriverGetVersion()\n\n @param cudaDriverVersion                    Reference in which to return the version identifier\n\n @return\n         - \\ref NVML_SUCCESS                  if \\a cudaDriverVersion has been set\n         - \\ref NVML_ERROR_INVALID_ARGUMENT   if \\a cudaDriverVersion is NULL\n         - \\ref NVML_ERROR_LIBRARY_NOT_FOUND  if \\a libcuda.so.1 or libcuda.dll is not found\n         - \\ref NVML_ERROR_FUNCTION_NOT_FOUND if \\a cuDriverGetVersion() is not found in the shared library*/\n    fn nvmlSystemGetCudaDriverVersion_v2(\n        cudaDriverVersion: *mut ::core::ffi::c_int,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Gets name of the process with provided process id\n\n For all products.\n\n Returned process name is cropped to provided length.\n name string is encoded in ANSI.\n\n @param pid                                  The identifier of the process\n @param name                                 Reference in which to return the process name\n @param length                               The maximum allowed length of the string returned in \\a name\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a name has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a name is NULL or \\a length is 0.\n         - \\ref NVML_ERROR_NOT_FOUND         if process doesn't exists\n         - \\ref NVML_ERROR_NO_PERMISSION     if the user doesn't have permission to perform this operation\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlSystemGetProcessName(\n        pid: ::core::ffi::c_uint,\n        name: *mut ::core::ffi::c_char,\n        length: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the IDs and firmware versions for any Host Interface Cards (HICs) in the system.\n\n For S-class products.\n\n The \\a hwbcCount argument is expected to be set to the size of the input \\a hwbcEntries array.\n The HIC must be connected to an S-class system for it to be reported by this function.\n\n @param hwbcCount                            Size of hwbcEntries array\n @param hwbcEntries                          Array holding information about hwbc\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a hwbcCount and \\a hwbcEntries have been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if either \\a hwbcCount or \\a hwbcEntries is NULL\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a hwbcCount indicates that the \\a hwbcEntries array is too small*/\n    fn nvmlSystemGetHicVersion(\n        hwbcCount: *mut ::core::ffi::c_uint,\n        hwbcEntries: *mut cuda_types::nvml::nvmlHwbcEntry_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the set of GPUs that have a CPU affinity with the given CPU number\n For all products.\n Supported on Linux only.\n\n @param cpuNumber                            The CPU number\n @param count                                When zero, is set to the number of matching GPUs such that \\a deviceArray\n                                             can be malloc'd.  When non-zero, \\a deviceArray will be filled with \\a count\n                                             number of device handles.\n @param deviceArray                          An array of device handles for GPUs found with affinity to \\a cpuNumber\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a deviceArray or \\a count (if initially zero) has been set\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a cpuNumber, or \\a count is invalid, or \\a deviceArray is NULL with a non-zero \\a count\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device or OS does not support this feature\n         - \\ref NVML_ERROR_UNKNOWN           an error has occurred in underlying topology discovery*/\n    fn nvmlSystemGetTopologyGpuSet(\n        cpuNumber: ::core::ffi::c_uint,\n        count: *mut ::core::ffi::c_uint,\n        deviceArray: *mut cuda_types::nvml::nvmlDevice_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the driver branch of the NVIDIA driver installed on the system.\n\n For all products.\n\n The branch identifier is an alphanumeric string.  It will not exceed 80 characters in length\n (including the NULL terminator).  See \\ref nvmlConstants::NVML_SYSTEM_DRIVER_VERSION_BUFFER_SIZE.\n\n @param branchInfo                            Pointer to the driver branch information structure \\a nvmlSystemDriverBranchInfo_t\n @param length                                The maximum allowed length of the driver branch string\n\n @return\n         - \\ref NVML_SUCCESS                 successful completion\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a branchInfo is NULL\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a length is too small\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlSystemGetDriverBranch(\n        branchInfo: *mut cuda_types::nvml::nvmlSystemDriverBranchInfo_t,\n        length: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the number of units in the system.\n\n For S-class products.\n\n @param unitCount                            Reference in which to return the number of units\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a unitCount has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a unitCount is NULL\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlUnitGetCount(\n        unitCount: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Acquire the handle for a particular unit, based on its index.\n\n For S-class products.\n\n Valid indices are derived from the \\a unitCount returned by \\ref nvmlUnitGetCount().\n   For example, if \\a unitCount is 2 the valid indices are 0 and 1, corresponding to UNIT 0 and UNIT 1.\n\n The order in which NVML enumerates units has no guarantees of consistency between reboots.\n\n @param index                                The index of the target unit, >= 0 and < \\a unitCount\n @param unit                                 Reference in which to return the unit handle\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a unit has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a index is invalid or \\a unit is NULL\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlUnitGetHandleByIndex(\n        index: ::core::ffi::c_uint,\n        unit: *mut cuda_types::nvml::nvmlUnit_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the static information associated with a unit.\n\n For S-class products.\n\n See \\ref nvmlUnitInfo_t for details on available unit info.\n\n @param unit                                 The identifier of the target unit\n @param info                                 Reference in which to return the unit information\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a info has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a unit is invalid or \\a info is NULL*/\n    fn nvmlUnitGetUnitInfo(\n        unit: cuda_types::nvml::nvmlUnit_t,\n        info: *mut cuda_types::nvml::nvmlUnitInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the LED state associated with this unit.\n\n For S-class products.\n\n See \\ref nvmlLedState_t for details on allowed states.\n\n @param unit                                 The identifier of the target unit\n @param state                                Reference in which to return the current LED state\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a state has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a unit is invalid or \\a state is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this is not an S-class product\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlUnitSetLedState()*/\n    fn nvmlUnitGetLedState(\n        unit: cuda_types::nvml::nvmlUnit_t,\n        state: *mut cuda_types::nvml::nvmlLedState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the PSU stats for the unit.\n\n For S-class products.\n\n See \\ref nvmlPSUInfo_t for details on available PSU info.\n\n @param unit                                 The identifier of the target unit\n @param psu                                  Reference in which to return the PSU information\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a psu has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a unit is invalid or \\a psu is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this is not an S-class product\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlUnitGetPsuInfo(\n        unit: cuda_types::nvml::nvmlUnit_t,\n        psu: *mut cuda_types::nvml::nvmlPSUInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the temperature readings for the unit, in degrees C.\n\n For S-class products.\n\n Depending on the product, readings may be available for intake (type=0),\n exhaust (type=1) and board (type=2).\n\n @param unit                                 The identifier of the target unit\n @param type                                 The type of reading to take\n @param temp                                 Reference in which to return the intake temperature\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a temp has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a unit or \\a type is invalid or \\a temp is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this is not an S-class product\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlUnitGetTemperature(\n        unit: cuda_types::nvml::nvmlUnit_t,\n        type_: ::core::ffi::c_uint,\n        temp: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the fan speed readings for the unit.\n\n For S-class products.\n\n See \\ref nvmlUnitFanSpeeds_t for details on available fan speed info.\n\n @param unit                                 The identifier of the target unit\n @param fanSpeeds                            Reference in which to return the fan speed information\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a fanSpeeds has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a unit is invalid or \\a fanSpeeds is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this is not an S-class product\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlUnitGetFanSpeedInfo(\n        unit: cuda_types::nvml::nvmlUnit_t,\n        fanSpeeds: *mut cuda_types::nvml::nvmlUnitFanSpeeds_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the set of GPU devices that are attached to the specified unit.\n\n For S-class products.\n\n The \\a deviceCount argument is expected to be set to the size of the input \\a devices array.\n\n @param unit                                 The identifier of the target unit\n @param deviceCount                          Reference in which to provide the \\a devices array size, and\n                                             to return the number of attached GPU devices\n @param devices                              Reference in which to return the references to the attached GPU devices\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a deviceCount and \\a devices have been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a deviceCount indicates that the \\a devices array is too small\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a unit is invalid, either of \\a deviceCount or \\a devices is NULL\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlUnitGetDevices(\n        unit: cuda_types::nvml::nvmlUnit_t,\n        deviceCount: *mut ::core::ffi::c_uint,\n        devices: *mut cuda_types::nvml::nvmlDevice_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the number of compute devices in the system. A compute device is a single GPU.\n\n For all products.\n\n Note: New nvmlDeviceGetCount_v2 (default in NVML 5.319) returns count of all devices in the system\n       even if nvmlDeviceGetHandleByIndex_v2 returns NVML_ERROR_NO_PERMISSION for such device.\n       Update your code to handle this error, or use NVML 4.304 or older nvml header file.\n       For backward binary compatibility reasons _v1 version of the API is still present in the shared\n       library.\n       Old _v1 version of nvmlDeviceGetCount doesn't count devices that NVML has no permission to talk to.\n\n @param deviceCount                          Reference in which to return the number of accessible devices\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a deviceCount has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a deviceCount is NULL\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetCount_v2(\n        deviceCount: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get attributes (engine counts etc.) for the given NVML device handle.\n\n @note This API currently only supports MIG device handles.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux only.\n\n @param device                               NVML device handle\n @param attributes                           Device attributes\n\n @return\n        - \\ref NVML_SUCCESS                  if \\a device attributes were successfully retrieved\n        - \\ref NVML_ERROR_INVALID_ARGUMENT   if \\a device handle is invalid\n        - \\ref NVML_ERROR_UNINITIALIZED      if the library has not been successfully initialized\n        - \\ref NVML_ERROR_NOT_SUPPORTED      if this query is not supported by the device\n        - \\ref NVML_ERROR_UNKNOWN            on any unexpected error*/\n    fn nvmlDeviceGetAttributes_v2(\n        device: cuda_types::nvml::nvmlDevice_t,\n        attributes: *mut cuda_types::nvml::nvmlDeviceAttributes_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Acquire the handle for a particular device, based on its index.\n\n For all products.\n\n Valid indices are derived from the \\a accessibleDevices count returned by\n   \\ref nvmlDeviceGetCount_v2(). For example, if \\a accessibleDevices is 2 the valid indices\n   are 0 and 1, corresponding to GPU 0 and GPU 1.\n\n The order in which NVML enumerates devices has no guarantees of consistency between reboots. For that reason it\n   is recommended that devices be looked up by their PCI ids or UUID. See\n   \\ref nvmlDeviceGetHandleByUUID() and \\ref nvmlDeviceGetHandleByPciBusId_v2().\n\n Note: The NVML index may not correlate with other APIs, such as the CUDA device index.\n\n Starting from NVML 5, this API causes NVML to initialize the target GPU\n NVML may initialize additional GPUs if:\n  - The target GPU is an SLI slave\n\n Note: New nvmlDeviceGetCount_v2 (default in NVML 5.319) returns count of all devices in the system\n       even if nvmlDeviceGetHandleByIndex_v2 returns NVML_ERROR_NO_PERMISSION for such device.\n       Update your code to handle this error, or use NVML 4.304 or older nvml header file.\n       For backward binary compatibility reasons _v1 version of the API is still present in the shared\n       library.\n       Old _v1 version of nvmlDeviceGetCount doesn't count devices that NVML has no permission to talk to.\n\n       This means that nvmlDeviceGetHandleByIndex_v2 and _v1 can return different devices for the same index.\n       If you don't touch macros that map old (_v1) versions to _v2 versions at the top of the file you don't\n       need to worry about that.\n\n @param index                                The index of the target GPU, >= 0 and < \\a accessibleDevices\n @param device                               Reference in which to return the device handle\n\n @return\n         - \\ref NVML_SUCCESS                  if \\a device has been set\n         - \\ref NVML_ERROR_UNINITIALIZED      if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT   if \\a index is invalid or \\a device is NULL\n         - \\ref NVML_ERROR_INSUFFICIENT_POWER if any attached devices have improperly attached external power cables\n         - \\ref NVML_ERROR_NO_PERMISSION      if the user doesn't have permission to talk to this device\n         - \\ref NVML_ERROR_IRQ_ISSUE          if NVIDIA kernel detected an interrupt issue with the attached GPUs\n         - \\ref NVML_ERROR_GPU_IS_LOST        if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN            on any unexpected error\n\n @see nvmlDeviceGetIndex\n @see nvmlDeviceGetCount*/\n    fn nvmlDeviceGetHandleByIndex_v2(\n        index: ::core::ffi::c_uint,\n        device: *mut cuda_types::nvml::nvmlDevice_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Acquire the handle for a particular device, based on its board serial number.\n\n For Fermi &tm; or newer fully supported devices.\n\n This number corresponds to the value printed directly on the board, and to the value returned by\n   \\ref nvmlDeviceGetSerial().\n\n @deprecated Since more than one GPU can exist on a single board this function is deprecated in favor\n             of \\ref nvmlDeviceGetHandleByUUID.\n             For dual GPU boards this function will return NVML_ERROR_INVALID_ARGUMENT.\n\n Starting from NVML 5, this API causes NVML to initialize the target GPU\n NVML may initialize additional GPUs as it searches for the target GPU\n\n @param serial                               The board serial number of the target GPU\n @param device                               Reference in which to return the device handle\n\n @return\n         - \\ref NVML_SUCCESS                  if \\a device has been set\n         - \\ref NVML_ERROR_UNINITIALIZED      if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT   if \\a serial is invalid, \\a device is NULL or more than one\n                                              device has the same serial (dual GPU boards)\n         - \\ref NVML_ERROR_NOT_FOUND          if \\a serial does not match a valid device on the system\n         - \\ref NVML_ERROR_INSUFFICIENT_POWER if any attached devices have improperly attached external power cables\n         - \\ref NVML_ERROR_IRQ_ISSUE          if NVIDIA kernel detected an interrupt issue with the attached GPUs\n         - \\ref NVML_ERROR_GPU_IS_LOST        if any GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN            on any unexpected error\n\n @see nvmlDeviceGetSerial\n @see nvmlDeviceGetHandleByUUID*/\n    fn nvmlDeviceGetHandleBySerial(\n        serial: *const ::core::ffi::c_char,\n        device: *mut cuda_types::nvml::nvmlDevice_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Acquire the handle for a particular device, based on its globally unique immutable UUID (in ASCII format) associated with each device.\n\n For all products.\n\n @param uuid                                 The UUID of the target GPU or MIG instance\n @param device                               Reference in which to return the device handle or MIG device handle\n\n Starting from NVML 5, this API causes NVML to initialize the target GPU\n NVML may initialize additional GPUs as it searches for the target GPU\n\n @return\n         - \\ref NVML_SUCCESS                  if \\a device has been set\n         - \\ref NVML_ERROR_UNINITIALIZED      if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT   if \\a uuid is invalid or \\a device is null\n         - \\ref NVML_ERROR_NOT_FOUND          if \\a uuid does not match a valid device on the system\n         - \\ref NVML_ERROR_INSUFFICIENT_POWER if any attached devices have improperly attached external power cables\n         - \\ref NVML_ERROR_IRQ_ISSUE          if NVIDIA kernel detected an interrupt issue with the attached GPUs\n         - \\ref NVML_ERROR_GPU_IS_LOST        if any GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN            on any unexpected error\n\n @see nvmlDeviceGetUUID*/\n    fn nvmlDeviceGetHandleByUUID(\n        uuid: *const ::core::ffi::c_char,\n        device: *mut cuda_types::nvml::nvmlDevice_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Acquire the handle for a particular device, based on its globally unique immutable UUID (in either ASCII or binary format) associated with each device.\n See \\ref nvmlUUID_v1_t for more information on the UUID struct. The caller must set the appropriate version prior to calling this API.\n\n For all products.\n\n @param[in] uuid                                  The UUID of the target GPU or MIG instance\n @param[out] device                               Reference in which to return the device handle or MIG device handle\n\n This API causes NVML to initialize the target GPU\n NVML may initialize additional GPUs as it searches for the target GPU\n\n @return\n         - \\ref NVML_SUCCESS                          if \\a device has been set\n         - \\ref NVML_ERROR_UNINITIALIZED              if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT           if \\a uuid is invalid, \\a device is null or \\a uuid->type is invalid\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH  if the provided version is invalid/unsupported\n         - \\ref NVML_ERROR_NOT_FOUND                  if \\a uuid does not match a valid device on the system\n         - \\ref NVML_ERROR_GPU_IS_LOST                if any GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN                    on any unexpected error*/\n    fn nvmlDeviceGetHandleByUUIDV(\n        uuid: *const cuda_types::nvml::nvmlUUID_t,\n        device: *mut cuda_types::nvml::nvmlDevice_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Acquire the handle for a particular device, based on its PCI bus id.\n\n For all products.\n\n This value corresponds to the nvmlPciInfo_t::busId returned by \\ref nvmlDeviceGetPciInfo_v3().\n\n Starting from NVML 5, this API causes NVML to initialize the target GPU\n NVML may initialize additional GPUs if:\n  - The target GPU is an SLI slave\n\n \\note NVML 4.304 and older version of nvmlDeviceGetHandleByPciBusId\"_v1\" returns NVML_ERROR_NOT_FOUND\n       instead of NVML_ERROR_NO_PERMISSION.\n\n @param pciBusId                             The PCI bus id of the target GPU\n                                             Accept the following formats (all numbers in hexadecimal):\n                                               domain:bus:device.function in format %x:%x:%x.%x\n                                               domain:bus:device in format %x:%x:%x\n                                               bus:device.function in format %x:%x.%x\n\n @param device                               Reference in which to return the device handle\n\n @return\n         - \\ref NVML_SUCCESS                  if \\a device has been set\n         - \\ref NVML_ERROR_UNINITIALIZED      if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT   if \\a pciBusId is invalid or \\a device is NULL\n         - \\ref NVML_ERROR_NOT_FOUND          if \\a pciBusId does not match a valid device on the system\n         - \\ref NVML_ERROR_INSUFFICIENT_POWER if the attached device has improperly attached external power cables\n         - \\ref NVML_ERROR_NO_PERMISSION      if the user doesn't have permission to talk to this device\n         - \\ref NVML_ERROR_IRQ_ISSUE          if NVIDIA kernel detected an interrupt issue with the attached GPUs\n         - \\ref NVML_ERROR_GPU_IS_LOST        if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN            on any unexpected error*/\n    fn nvmlDeviceGetHandleByPciBusId_v2(\n        pciBusId: *const ::core::ffi::c_char,\n        device: *mut cuda_types::nvml::nvmlDevice_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the name of this device.\n\n For all products.\n\n The name is an alphanumeric string that denotes a particular product, e.g. Tesla &tm; C2070. It will not\n exceed 96 characters in length (including the NULL terminator).  See \\ref\n nvmlConstants::NVML_DEVICE_NAME_V2_BUFFER_SIZE.\n\n When used with MIG device handles the API returns MIG device names which can be used to identify devices\n based on their attributes.\n\n @param device                               The identifier of the target device\n @param name                                 Reference in which to return the product name\n @param length                               The maximum allowed length of the string returned in \\a name\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a name has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, or \\a name is NULL\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a length is too small\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetName(\n        device: cuda_types::nvml::nvmlDevice_t,\n        name: *mut ::core::ffi::c_char,\n        length: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the brand of this device.\n\n For all products.\n\n The type is a member of \\ref nvmlBrandType_t defined above.\n\n @param device                               The identifier of the target device\n @param type                                 Reference in which to return the product brand type\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a name has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, or \\a type is NULL\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetBrand(\n        device: cuda_types::nvml::nvmlDevice_t,\n        type_: *mut cuda_types::nvml::nvmlBrandType_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the NVML index of this device.\n\n For all products.\n\n Valid indices are derived from the \\a accessibleDevices count returned by\n   \\ref nvmlDeviceGetCount_v2(). For example, if \\a accessibleDevices is 2 the valid indices\n   are 0 and 1, corresponding to GPU 0 and GPU 1.\n\n The order in which NVML enumerates devices has no guarantees of consistency between reboots. For that reason it\n   is recommended that devices be looked up by their PCI ids or GPU UUID. See\n   \\ref nvmlDeviceGetHandleByPciBusId_v2() and \\ref nvmlDeviceGetHandleByUUID().\n\n When used with MIG device handles this API returns indices that can be\n passed to \\ref nvmlDeviceGetMigDeviceHandleByIndex to retrieve an identical handle.\n MIG device indices are unique within a device.\n\n Note: The NVML index may not correlate with other APIs, such as the CUDA device index.\n\n @param device                               The identifier of the target device\n @param index                                Reference in which to return the NVML index of the device\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a index has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, or \\a index is NULL\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlDeviceGetHandleByIndex()\n @see nvmlDeviceGetCount()*/\n    fn nvmlDeviceGetIndex(\n        device: cuda_types::nvml::nvmlDevice_t,\n        index: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the globally unique board serial number associated with this device's board.\n\n For all products with an inforom.\n\n The serial number is an alphanumeric string that will not exceed 30 characters (including the NULL terminator).\n This number matches the serial number tag that is physically attached to the board.  See \\ref\n nvmlConstants::NVML_DEVICE_SERIAL_BUFFER_SIZE.\n\n @param device                               The identifier of the target device\n @param serial                               Reference in which to return the board/module serial number\n @param length                               The maximum allowed length of the string returned in \\a serial\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a serial has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, or \\a serial is NULL\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a length is too small\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetSerial(\n        device: cuda_types::nvml::nvmlDevice_t,\n        serial: *mut ::core::ffi::c_char,\n        length: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get a unique identifier for the device module on the baseboard\n\n This API retrieves a unique identifier for each GPU module that exists on a given baseboard.\n For non-baseboard products, this ID would always be 0.\n\n @param device                               The identifier of the target device\n @param moduleId                             Unique identifier for the GPU module\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a moduleId has been successfully retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device or \\a moduleId is invalid\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetModuleId(\n        device: cuda_types::nvml::nvmlDevice_t,\n        moduleId: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the Device's C2C Mode information\n\n @param device                               The identifier of the target device\n @param c2cModeInfo                          Output struct containing the device's C2C Mode info\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a C2C Mode Infor query is successful\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, or \\a serial is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetC2cModeInfoV(\n        device: cuda_types::nvml::nvmlDevice_t,\n        c2cModeInfo: *mut cuda_types::nvml::nvmlC2cModeInfo_v1_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves an array of unsigned ints (sized to nodeSetSize) of bitmasks with\n the ideal memory affinity within node or socket for the device.\n For example, if NUMA node 0, 1 are ideal within the socket for the device and nodeSetSize ==  1,\n     result[0] = 0x3\n\n \\note If requested scope is not applicable to the target topology, the API\n       will fall back to reporting the memory affinity for the immediate non-I/O\n       ancestor of the device.\n\n For Kepler &tm; or newer fully supported devices.\n Supported on Linux only.\n\n @param device                               The identifier of the target device\n @param nodeSetSize                          The size of the nodeSet array that is safe to access\n @param nodeSet                              Array reference in which to return a bitmask of NODEs, 64 NODEs per\n                                             unsigned long on 64-bit machines, 32 on 32-bit machines\n @param scope                                Scope that change the default behavior\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a NUMA node Affinity has been filled\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, nodeSetSize == 0, nodeSet is NULL or scope is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetMemoryAffinity(\n        device: cuda_types::nvml::nvmlDevice_t,\n        nodeSetSize: ::core::ffi::c_uint,\n        nodeSet: *mut ::core::ffi::c_ulong,\n        scope: cuda_types::nvml::nvmlAffinityScope_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves an array of unsigned ints (sized to cpuSetSize) of bitmasks with the\n ideal CPU affinity within node or socket for the device.\n For example, if processors 0, 1, 32, and 33 are ideal for the device and cpuSetSize == 2,\n     result[0] = 0x3, result[1] = 0x3\n\n \\note If requested scope is not applicable to the target topology, the API\n       will fall back to reporting the CPU affinity for the immediate non-I/O\n       ancestor of the device.\n\n For Kepler &tm; or newer fully supported devices.\n Supported on Linux only.\n\n @param device                               The identifier of the target device\n @param cpuSetSize                           The size of the cpuSet array that is safe to access\n @param cpuSet                               Array reference in which to return a bitmask of CPUs, 64 CPUs per\n                                                 unsigned long on 64-bit machines, 32 on 32-bit machines\n @param scope                                Scope that change the default behavior\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a cpuAffinity has been filled\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, cpuSetSize == 0, cpuSet is NULL or sope is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetCpuAffinityWithinScope(\n        device: cuda_types::nvml::nvmlDevice_t,\n        cpuSetSize: ::core::ffi::c_uint,\n        cpuSet: *mut ::core::ffi::c_ulong,\n        scope: cuda_types::nvml::nvmlAffinityScope_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves an array of unsigned ints (sized to cpuSetSize) of bitmasks with the ideal CPU affinity for the device\n For example, if processors 0, 1, 32, and 33 are ideal for the device and cpuSetSize == 2,\n     result[0] = 0x3, result[1] = 0x3\n This is equivalent to calling \\ref nvmlDeviceGetCpuAffinityWithinScope with \\ref NVML_AFFINITY_SCOPE_NODE.\n\n For Kepler &tm; or newer fully supported devices.\n Supported on Linux only.\n\n @param device                               The identifier of the target device\n @param cpuSetSize                           The size of the cpuSet array that is safe to access\n @param cpuSet                               Array reference in which to return a bitmask of CPUs, 64 CPUs per\n                                                 unsigned long on 64-bit machines, 32 on 32-bit machines\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a cpuAffinity has been filled\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, cpuSetSize == 0, or cpuSet is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetCpuAffinity(\n        device: cuda_types::nvml::nvmlDevice_t,\n        cpuSetSize: ::core::ffi::c_uint,\n        cpuSet: *mut ::core::ffi::c_ulong,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Sets the ideal affinity for the calling thread and device using the guidelines\n given in nvmlDeviceGetCpuAffinity().  Note, this is a change as of version 8.0.\n Older versions set the affinity for a calling process and all children.\n Currently supports up to 1024 processors.\n\n For Kepler &tm; or newer fully supported devices.\n Supported on Linux only.\n\n @param device                               The identifier of the target device\n\n @return\n         - \\ref NVML_SUCCESS                 if the calling process has been successfully bound\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceSetCpuAffinity(\n        device: cuda_types::nvml::nvmlDevice_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Clear all affinity bindings for the calling thread.  Note, this is a change as of version\n 8.0 as older versions cleared the affinity for a calling process and all children.\n\n For Kepler &tm; or newer fully supported devices.\n Supported on Linux only.\n\n @param device                               The identifier of the target device\n\n @return\n         - \\ref NVML_SUCCESS                 if the calling process has been successfully unbound\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceClearCpuAffinity(\n        device: cuda_types::nvml::nvmlDevice_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get the NUMA node of the given GPU device.\n This only applies to platforms where the GPUs are NUMA nodes.\n\n @param[in]      device                  The device handle\n @param[out]     node                    NUMA node ID of the device\n\n @returns\n         - \\ref NVML_SUCCESS                  if the NUMA node is retrieved successfully\n         - \\ref NVML_ERROR_NOT_SUPPORTED      if request is not supported on the current platform\n         - \\ref NVML_ERROR_INVALID_ARGUMENT   if \\a device \\a node is invalid*/\n    fn nvmlDeviceGetNumaNodeId(\n        device: cuda_types::nvml::nvmlDevice_t,\n        node: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get the addressing mode for a given GPU. Addressing modes can be one of:\n 1. HMM:  System allocated memory (malloc, mmap) is addressable from the device (GPU),\n          via software-based mirroring of the CPU's page tables, on the GPU.\n 2. ATS:  System allocated memory (malloc, mmap) is addressable from the device (GPU),\n          via Address Translation Services. This means that there is (effectively)\n          a single set of page tables, and the CPU and GPU both use them.\n 3. None: Neither HMM nor ATS is active.\n\n For Turing &tm; or newer fully supported devices.\n Supported on Linux only.\n\n @param[in]      device                  The device handle\n @param[out]     mode                    Pointer to addressing mode of the device\n\n @returns\n         - \\ref NVML_SUCCESS                          if \\a mode is retrieved successfully\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH  if the provided version is invalid/unsupported\n         - \\ref NVML_ERROR_NOT_SUPPORTED              if request is not supported on the current platform\n         - \\ref NVML_ERROR_INVALID_ARGUMENT           if \\a device \\a node is invalid*/\n    fn nvmlDeviceGetAddressingMode(\n        device: cuda_types::nvml::nvmlDevice_t,\n        mode: *mut cuda_types::nvml::nvmlDeviceAddressingMode_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get the repair status for TPC/Channel repair\n\n For Ampere &tm; or newer fully supported devices.\n\n @param[in] device                               The identifier of the target device\n @param[out] repairStatus                         Reference to \\a nvmlRepairStatus_t\n\n @return\n         - \\ref NVML_SUCCESS                          if the query was successful\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH  if the provided version is invalid/unsupported\n         - \\ref NVML_ERROR_UNINITIALIZED              if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT           if \\a device is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED              if the device does not support this feature\n         - \\ref NVML_ERROR_UNKNOWN                    on any unexpected error*/\n    fn nvmlDeviceGetRepairStatus(\n        device: cuda_types::nvml::nvmlDevice_t,\n        repairStatus: *mut cuda_types::nvml::nvmlRepairStatus_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /// @}\n    fn nvmlDeviceGetTopologyCommonAncestor(\n        device1: cuda_types::nvml::nvmlDevice_t,\n        device2: cuda_types::nvml::nvmlDevice_t,\n        pathInfo: *mut cuda_types::nvml::nvmlGpuTopologyLevel_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the set of GPUs that are nearest to a given device at a specific interconnectivity level\n For all products.\n Supported on Linux only.\n\n @param device                               The identifier of the first device\n @param level                                The \\ref nvmlGpuTopologyLevel_t level to search for other GPUs\n @param count                                When zero, is set to the number of matching GPUs such that \\a deviceArray\n                                             can be malloc'd.  When non-zero, \\a deviceArray will be filled with \\a count\n                                             number of device handles.\n @param deviceArray                          An array of device handles for GPUs found at \\a level\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a deviceArray or \\a count (if initially zero) has been set\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device, \\a level, or \\a count is invalid, or \\a deviceArray is NULL with a non-zero \\a count\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device or OS does not support this feature\n         - \\ref NVML_ERROR_UNKNOWN           an error has occurred in underlying topology discovery*/\n    fn nvmlDeviceGetTopologyNearestGpus(\n        device: cuda_types::nvml::nvmlDevice_t,\n        level: cuda_types::nvml::nvmlGpuTopologyLevel_t,\n        count: *mut ::core::ffi::c_uint,\n        deviceArray: *mut cuda_types::nvml::nvmlDevice_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the status for a given p2p capability index between a given pair of GPU\n\n @param device1                              The first device\n @param device2                              The second device\n @param p2pIndex                             p2p Capability Index being looked for between \\a device1 and \\a device2\n @param p2pStatus                            Reference in which to return the status of the \\a p2pIndex\n                                             between \\a device1 and \\a device2\n @return\n         - \\ref NVML_SUCCESS         if \\a p2pStatus has been populated\n         - \\ref NVML_ERROR_INVALID_ARGUMENT     if \\a device1 or \\a device2 or \\a p2pIndex is invalid or \\a p2pStatus is NULL\n         - \\ref NVML_ERROR_UNKNOWN              on any unexpected error*/\n    fn nvmlDeviceGetP2PStatus(\n        device1: cuda_types::nvml::nvmlDevice_t,\n        device2: cuda_types::nvml::nvmlDevice_t,\n        p2pIndex: cuda_types::nvml::nvmlGpuP2PCapsIndex_t,\n        p2pStatus: *mut cuda_types::nvml::nvmlGpuP2PStatus_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the globally unique immutable UUID associated with this device, as a 5 part hexadecimal string,\n that augments the immutable, board serial identifier.\n\n For all products.\n\n The UUID is a globally unique identifier. It is the only available identifier for pre-Fermi-architecture products.\n It does NOT correspond to any identifier printed on the board.  It will not exceed 96 characters in length\n (including the NULL terminator).  See \\ref nvmlConstants::NVML_DEVICE_UUID_V2_BUFFER_SIZE.\n\n When used with MIG device handles the API returns globally unique UUIDs which can be used to identify MIG\n devices across both GPU and MIG devices. UUIDs are immutable for the lifetime of a MIG device.\n\n @param device                               The identifier of the target device\n @param uuid                                 Reference in which to return the GPU UUID\n @param length                               The maximum allowed length of the string returned in \\a uuid\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a uuid has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, or \\a uuid is NULL\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a length is too small\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetUUID(\n        device: cuda_types::nvml::nvmlDevice_t,\n        uuid: *mut ::core::ffi::c_char,\n        length: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves minor number for the device. The minor number for the device is such that the Nvidia device node file for\n each GPU will have the form /dev/nvidia[minor number].\n\n For all products.\n Supported only for Linux\n\n @param device                                The identifier of the target device\n @param minorNumber                           Reference in which to return the minor number for the device\n @return\n         - \\ref NVML_SUCCESS                 if the minor number is successfully retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a minorNumber is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by the device\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetMinorNumber(\n        device: cuda_types::nvml::nvmlDevice_t,\n        minorNumber: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the the device board part number which is programmed into the board's InfoROM\n\n For all products.\n\n @param device                                Identifier of the target device\n @param partNumber                            Reference to the buffer to return\n @param length                                Length of the buffer reference\n\n @return\n         - \\ref NVML_SUCCESS                  if \\a partNumber has been set\n         - \\ref NVML_ERROR_UNINITIALIZED      if the library has not been successfully initialized\n         - \\ref NVML_ERROR_NOT_SUPPORTED      if the needed VBIOS fields have not been filled\n         - \\ref NVML_ERROR_INVALID_ARGUMENT   if \\a device is invalid or \\a serial is NULL\n         - \\ref NVML_ERROR_GPU_IS_LOST        if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN            on any unexpected error*/\n    fn nvmlDeviceGetBoardPartNumber(\n        device: cuda_types::nvml::nvmlDevice_t,\n        partNumber: *mut ::core::ffi::c_char,\n        length: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the version information for the device's infoROM object.\n\n For all products with an inforom.\n\n Fermi and higher parts have non-volatile on-board memory for persisting device info, such as aggregate\n ECC counts. The version of the data structures in this memory may change from time to time. It will not\n exceed 16 characters in length (including the NULL terminator).\n See \\ref nvmlConstants::NVML_DEVICE_INFOROM_VERSION_BUFFER_SIZE.\n\n See \\ref nvmlInforomObject_t for details on the available infoROM objects.\n\n @param device                               The identifier of the target device\n @param object                               The target infoROM object\n @param version                              Reference in which to return the infoROM version\n @param length                               The maximum allowed length of the string returned in \\a version\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a version has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a version is NULL\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a length is too small\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not have an infoROM\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlDeviceGetInforomImageVersion*/\n    fn nvmlDeviceGetInforomVersion(\n        device: cuda_types::nvml::nvmlDevice_t,\n        object: cuda_types::nvml::nvmlInforomObject_t,\n        version: *mut ::core::ffi::c_char,\n        length: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the global infoROM image version\n\n For all products with an inforom.\n\n Image version just like VBIOS version uniquely describes the exact version of the infoROM flashed on the board\n in contrast to infoROM object version which is only an indicator of supported features.\n Version string will not exceed 16 characters in length (including the NULL terminator).\n See \\ref nvmlConstants::NVML_DEVICE_INFOROM_VERSION_BUFFER_SIZE.\n\n @param device                               The identifier of the target device\n @param version                              Reference in which to return the infoROM image version\n @param length                               The maximum allowed length of the string returned in \\a version\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a version has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a version is NULL\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a length is too small\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not have an infoROM\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlDeviceGetInforomVersion*/\n    fn nvmlDeviceGetInforomImageVersion(\n        device: cuda_types::nvml::nvmlDevice_t,\n        version: *mut ::core::ffi::c_char,\n        length: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the checksum of the configuration stored in the device's infoROM.\n\n For all products with an inforom.\n\n Can be used to make sure that two GPUs have the exact same configuration.\n Current checksum takes into account configuration stored in PWR and ECC infoROM objects.\n Checksum can change between driver releases or when user changes configuration (e.g. disable/enable ECC)\n\n @param device                               The identifier of the target device\n @param checksum                             Reference in which to return the infoROM configuration checksum\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a checksum has been set\n         - \\ref NVML_ERROR_CORRUPTED_INFOROM if the device's checksum couldn't be retrieved due to infoROM corruption\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a checksum is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetInforomConfigurationChecksum(\n        device: cuda_types::nvml::nvmlDevice_t,\n        checksum: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Reads the infoROM from the flash and verifies the checksums.\n\n For all products with an inforom.\n\n @param device                               The identifier of the target device\n\n @return\n         - \\ref NVML_SUCCESS                 if infoROM is not corrupted\n         - \\ref NVML_ERROR_CORRUPTED_INFOROM if the device's infoROM is corrupted\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceValidateInforom(\n        device: cuda_types::nvml::nvmlDevice_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the timestamp and the duration of the last flush of the BBX (blackbox) infoROM object during the current run.\n\n For all products with an inforom.\n\n @param device                               The identifier of the target device\n @param timestamp                            The start timestamp of the last BBX Flush\n @param durationUs                           The duration (us) of the last BBX Flush\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a timestamp and \\a durationUs are successfully retrieved\n         - \\ref NVML_ERROR_NOT_READY         if the BBX object has not been flushed yet\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not have an infoROM\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlDeviceGetInforomVersion*/\n    fn nvmlDeviceGetLastBBXFlushTime(\n        device: cuda_types::nvml::nvmlDevice_t,\n        timestamp: *mut ::core::ffi::c_ulonglong,\n        durationUs: *mut ::core::ffi::c_ulong,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the display mode for the device.\n\n For all products.\n\n This method indicates whether a physical display (e.g. monitor) is currently connected to\n any of the device's connectors.\n\n See \\ref nvmlEnableState_t for details on allowed modes.\n\n @param device                               The identifier of the target device\n @param display                              Reference in which to return the display mode\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a display has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a display is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetDisplayMode(\n        device: cuda_types::nvml::nvmlDevice_t,\n        display: *mut cuda_types::nvml::nvmlEnableState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the display active state for the device.\n\n For all products.\n\n This method indicates whether a display is initialized on the device.\n For example whether X Server is attached to this device and has allocated memory for the screen.\n\n Display can be active even when no monitor is physically attached.\n\n See \\ref nvmlEnableState_t for details on allowed modes.\n\n @param device                               The identifier of the target device\n @param isActive                             Reference in which to return the display active state\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a isActive has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a isActive is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetDisplayActive(\n        device: cuda_types::nvml::nvmlDevice_t,\n        isActive: *mut cuda_types::nvml::nvmlEnableState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the persistence mode associated with this device.\n\n For all products.\n For Linux only.\n\n When driver persistence mode is enabled the driver software state is not torn down when the last\n client disconnects. By default this feature is disabled.\n\n See \\ref nvmlEnableState_t for details on allowed modes.\n\n @param device                               The identifier of the target device\n @param mode                                 Reference in which to return the current driver persistence mode\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a mode has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a mode is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlDeviceSetPersistenceMode()*/\n    fn nvmlDeviceGetPersistenceMode(\n        device: cuda_types::nvml::nvmlDevice_t,\n        mode: *mut cuda_types::nvml::nvmlEnableState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves PCI attributes of this device.\n\n For all products.\n\n See \\ref nvmlPciInfoExt_v1_t for details on the available PCI info.\n\n @param device                               The identifier of the target device\n @param pci                                  Reference in which to return the PCI info\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a pci has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a pci is NULL\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetPciInfoExt(\n        device: cuda_types::nvml::nvmlDevice_t,\n        pci: *mut cuda_types::nvml::nvmlPciInfoExt_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the PCI attributes of this device.\n\n For all products.\n\n See \\ref nvmlPciInfo_t for details on the available PCI info.\n\n @param device                               The identifier of the target device\n @param pci                                  Reference in which to return the PCI info\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a pci has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a pci is NULL\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetPciInfo_v3(\n        device: cuda_types::nvml::nvmlDevice_t,\n        pci: *mut cuda_types::nvml::nvmlPciInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the maximum PCIe link generation possible with this device and system\n\n I.E. for a generation 2 PCIe device attached to a generation 1 PCIe bus the max link generation this function will\n report is generation 1.\n\n For Fermi &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param maxLinkGen                           Reference in which to return the max PCIe link generation\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a maxLinkGen has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a maxLinkGen is null\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if PCIe link information is not available\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetMaxPcieLinkGeneration(\n        device: cuda_types::nvml::nvmlDevice_t,\n        maxLinkGen: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the maximum PCIe link generation supported by this device\n\n For Fermi &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param maxLinkGenDevice                     Reference in which to return the max PCIe link generation\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a maxLinkGenDevice has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a maxLinkGenDevice is null\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if PCIe link information is not available\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetGpuMaxPcieLinkGeneration(\n        device: cuda_types::nvml::nvmlDevice_t,\n        maxLinkGenDevice: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the maximum PCIe link width possible with this device and system\n\n I.E. for a device with a 16x PCIe bus width attached to a 8x PCIe system bus this function will report\n a max link width of 8.\n\n For Fermi &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param maxLinkWidth                         Reference in which to return the max PCIe link generation\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a maxLinkWidth has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a maxLinkWidth is null\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if PCIe link information is not available\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetMaxPcieLinkWidth(\n        device: cuda_types::nvml::nvmlDevice_t,\n        maxLinkWidth: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the current PCIe link generation\n\n For Fermi &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param currLinkGen                          Reference in which to return the current PCIe link generation\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a currLinkGen has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a currLinkGen is null\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if PCIe link information is not available\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetCurrPcieLinkGeneration(\n        device: cuda_types::nvml::nvmlDevice_t,\n        currLinkGen: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the current PCIe link width\n\n For Fermi &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param currLinkWidth                        Reference in which to return the current PCIe link generation\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a currLinkWidth has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a currLinkWidth is null\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if PCIe link information is not available\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetCurrPcieLinkWidth(\n        device: cuda_types::nvml::nvmlDevice_t,\n        currLinkWidth: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve PCIe utilization information.\n This function is querying a byte counter over a 20ms interval and thus is the\n   PCIe throughput over that interval.\n\n For Maxwell &tm; or newer fully supported devices.\n\n This method is not supported in virtual machines running virtual GPU (vGPU).\n\n @param device                               The identifier of the target device\n @param counter                              The specific counter that should be queried \\ref nvmlPcieUtilCounter_t\n @param value                                Reference in which to return throughput in KB/s\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a value has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device or \\a counter is invalid, or \\a value is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetPcieThroughput(\n        device: cuda_types::nvml::nvmlDevice_t,\n        counter: cuda_types::nvml::nvmlPcieUtilCounter_t,\n        value: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the PCIe replay counter.\n\n For Kepler &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param value                                Reference in which to return the counter's value\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a value has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, or \\a value is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetPcieReplayCounter(\n        device: cuda_types::nvml::nvmlDevice_t,\n        value: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the current clock speeds for the device.\n\n For Fermi &tm; or newer fully supported devices.\n\n See \\ref nvmlClockType_t for details on available clock information.\n\n @param device                               The identifier of the target device\n @param type                                 Identify which clock domain to query\n @param clock                                Reference in which to return the clock speed in MHz\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a clock has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a clock is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device cannot report the specified clock\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetClockInfo(\n        device: cuda_types::nvml::nvmlDevice_t,\n        type_: cuda_types::nvml::nvmlClockType_t,\n        clock: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the maximum clock speeds for the device.\n\n For Fermi &tm; or newer fully supported devices.\n\n See \\ref nvmlClockType_t for details on available clock information.\n\n \\note Current P0 clocks (reported by \\ref nvmlDeviceGetClockInfo) can differ from max clocks\n       by a few MHz.\n\n @param device                               The identifier of the target device\n @param type                                 Identify which clock domain to query\n @param clock                                Reference in which to return the clock speed in MHz\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a clock has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a clock is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device cannot report the specified clock\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetMaxClockInfo(\n        device: cuda_types::nvml::nvmlDevice_t,\n        type_: cuda_types::nvml::nvmlClockType_t,\n        clock: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the GPCCLK VF offset value\n @param[in]   device                         The identifier of the target device\n @param[out]  offset                         The retrieved GPCCLK VF offset value\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a offset has been successfully queried\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a offset is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetGpcClkVfOffset(\n        device: cuda_types::nvml::nvmlDevice_t,\n        offset: *mut ::core::ffi::c_int,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /// @deprecated Applications clocks are deprecated and will be removed in CUDA 14.0.\n    fn nvmlDeviceGetApplicationsClock(\n        device: cuda_types::nvml::nvmlDevice_t,\n        clockType: cuda_types::nvml::nvmlClockType_t,\n        clockMHz: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /// @deprecated Applications clocks are deprecated and will be removed in CUDA 14.0.\n    fn nvmlDeviceGetDefaultApplicationsClock(\n        device: cuda_types::nvml::nvmlDevice_t,\n        clockType: cuda_types::nvml::nvmlClockType_t,\n        clockMHz: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the clock speed for the clock specified by the clock type and clock ID.\n\n For Kepler &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param clockType                            Identify which clock domain to query\n @param clockId                              Identify which clock in the domain to query\n @param clockMHz                             Reference in which to return the clock in MHz\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a clockMHz has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a clockMHz is NULL or \\a clockType is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetClock(\n        device: cuda_types::nvml::nvmlDevice_t,\n        clockType: cuda_types::nvml::nvmlClockType_t,\n        clockId: cuda_types::nvml::nvmlClockId_t,\n        clockMHz: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the customer defined maximum boost clock speed specified by the given clock type.\n\n For Pascal &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param clockType                            Identify which clock domain to query\n @param clockMHz                             Reference in which to return the clock in MHz\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a clockMHz has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a clockMHz is NULL or \\a clockType is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device or the \\a clockType on this device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetMaxCustomerBoostClock(\n        device: cuda_types::nvml::nvmlDevice_t,\n        clockType: cuda_types::nvml::nvmlClockType_t,\n        clockMHz: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the list of possible memory clocks that can be used as an argument for \\ref nvmlDeviceSetMemoryLockedClocks.\n\n For Kepler &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param count                                Reference in which to provide the \\a clocksMHz array size, and\n                                             to return the number of elements\n @param clocksMHz                            Reference in which to return the clock in MHz\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a count and \\a clocksMHz have been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a count is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a count is too small (\\a count is set to the number of\n                                                required elements)\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlDeviceSetMemoryLockedClocks*/\n    fn nvmlDeviceGetSupportedMemoryClocks(\n        device: cuda_types::nvml::nvmlDevice_t,\n        count: *mut ::core::ffi::c_uint,\n        clocksMHz: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the list of possible graphics clocks that can be used as an argument for \\ref nvmlDeviceSetGpuLockedClocks.\n\n For Kepler &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param memoryClockMHz                       Memory clock for which to return possible graphics clocks\n @param count                                Reference in which to provide the \\a clocksMHz array size, and\n                                             to return the number of elements\n @param clocksMHz                            Reference in which to return the clocks in MHz\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a count and \\a clocksMHz have been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_NOT_FOUND         if the specified \\a memoryClockMHz is not a supported frequency\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a clock is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a count is too small\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlDeviceSetGpuLockedClocks*/\n    fn nvmlDeviceGetSupportedGraphicsClocks(\n        device: cuda_types::nvml::nvmlDevice_t,\n        memoryClockMHz: ::core::ffi::c_uint,\n        count: *mut ::core::ffi::c_uint,\n        clocksMHz: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the current state of Auto Boosted clocks on a device and store it in \\a isEnabled\n\n For Kepler &tm; or newer fully supported devices.\n\n Auto Boosted clocks are enabled by default on some hardware, allowing the GPU to run at higher clock rates\n to maximize performance as thermal limits allow.\n\n On Pascal and newer hardware, Auto Aoosted clocks are controlled through application clocks.\n Use \\ref nvmlDeviceSetApplicationsClocks and \\ref nvmlDeviceResetApplicationsClocks to control Auto Boost\n behavior.\n\n @param device                               The identifier of the target device\n @param isEnabled                            Where to store the current state of Auto Boosted clocks of the target device\n @param defaultIsEnabled                     Where to store the default Auto Boosted clocks behavior of the target device that the device will\n                                                 revert to when no applications are using the GPU\n\n @return\n         - \\ref NVML_SUCCESS                 If \\a isEnabled has been been set with the Auto Boosted clocks state of \\a device\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a isEnabled is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support Auto Boosted clocks\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n*/\n    fn nvmlDeviceGetAutoBoostedClocksEnabled(\n        device: cuda_types::nvml::nvmlDevice_t,\n        isEnabled: *mut cuda_types::nvml::nvmlEnableState_t,\n        defaultIsEnabled: *mut cuda_types::nvml::nvmlEnableState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the intended operating speed of the device's fan.\n\n Note: The reported speed is the intended fan speed.  If the fan is physically blocked and unable to spin, the\n output will not match the actual fan speed.\n\n For all discrete products with dedicated fans.\n\n The fan speed is expressed as a percentage of the product's maximum noise tolerance fan speed.\n This value may exceed 100% in certain cases.\n\n @param device                               The identifier of the target device\n @param speed                                Reference in which to return the fan speed percentage\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a speed has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a speed is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not have a fan\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetFanSpeed(\n        device: cuda_types::nvml::nvmlDevice_t,\n        speed: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the intended operating speed of the device's specified fan.\n\n Note: The reported speed is the intended fan speed. If the fan is physically blocked and unable to spin, the\n output will not match the actual fan speed.\n\n For all discrete products with dedicated fans.\n\n The fan speed is expressed as a percentage of the product's maximum noise tolerance fan speed.\n This value may exceed 100% in certain cases.\n\n @param device                                The identifier of the target device\n @param fan                                   The index of the target fan, zero indexed.\n @param speed                                 Reference in which to return the fan speed percentage\n\n @return\n        - \\ref NVML_SUCCESS                   if \\a speed has been set\n        - \\ref NVML_ERROR_UNINITIALIZED       if the library has not been successfully initialized\n        - \\ref NVML_ERROR_INVALID_ARGUMENT    if \\a device is invalid, \\a fan is not an acceptable index, or \\a speed is NULL\n        - \\ref NVML_ERROR_NOT_SUPPORTED       if the device does not have a fan or is newer than Maxwell\n        - \\ref NVML_ERROR_GPU_IS_LOST         if the target GPU has fallen off the bus or is otherwise inaccessible\n        - \\ref NVML_ERROR_UNKNOWN             on any unexpected error*/\n    fn nvmlDeviceGetFanSpeed_v2(\n        device: cuda_types::nvml::nvmlDevice_t,\n        fan: ::core::ffi::c_uint,\n        speed: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the intended operating speed in rotations per minute (RPM) of the device's specified fan.\n\n For Maxwell &tm; or newer fully supported devices.\n\n For all discrete products with dedicated fans.\n\n Note: The reported speed is the intended fan speed. If the fan is physically blocked and unable to spin, the\n output will not match the actual fan speed.\n\n @param device                               The identifier of the target device\n @param fanSpeed                             Structure specifying the index of the target fan (input) and\n                                             retrieved fan speed value (output)\n\n @return\n         - \\ref NVML_SUCCESS                         If everything worked\n         - \\ref NVML_ERROR_UNINITIALIZED             If the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT          If \\a device is invalid, \\a fan is not an acceptable\n                                                          index, or \\a speed is NULL\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH If the provided version is invalid/unsupported\n         - \\ref NVML_ERROR_NOT_SUPPORTED             If the \\a device does not support this feature*/\n    fn nvmlDeviceGetFanSpeedRPM(\n        device: cuda_types::nvml::nvmlDevice_t,\n        fanSpeed: *mut cuda_types::nvml::nvmlFanSpeedInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the intended target speed of the device's specified fan.\n\n Normally, the driver dynamically adjusts the fan based on\n the needs of the GPU.  But when user set fan speed using nvmlDeviceSetFanSpeed_v2,\n the driver will attempt to make the fan achieve the setting in\n nvmlDeviceSetFanSpeed_v2.  The actual current speed of the fan\n is reported in nvmlDeviceGetFanSpeed_v2.\n\n For all discrete products with dedicated fans.\n\n The fan speed is expressed as a percentage of the product's maximum noise tolerance fan speed.\n This value may exceed 100% in certain cases.\n\n @param device                                The identifier of the target device\n @param fan                                   The index of the target fan, zero indexed.\n @param targetSpeed                           Reference in which to return the fan speed percentage\n\n @return\n        - \\ref NVML_SUCCESS                   if \\a speed has been set\n        - \\ref NVML_ERROR_UNINITIALIZED       if the library has not been successfully initialized\n        - \\ref NVML_ERROR_INVALID_ARGUMENT    if \\a device is invalid, \\a fan is not an acceptable index, or \\a speed is NULL\n        - \\ref NVML_ERROR_NOT_SUPPORTED       if the device does not have a fan or is newer than Maxwell\n        - \\ref NVML_ERROR_GPU_IS_LOST         if the target GPU has fallen off the bus or is otherwise inaccessible\n        - \\ref NVML_ERROR_UNKNOWN             on any unexpected error*/\n    fn nvmlDeviceGetTargetFanSpeed(\n        device: cuda_types::nvml::nvmlDevice_t,\n        fan: ::core::ffi::c_uint,\n        targetSpeed: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the min and max fan speed that user can set for the GPU fan.\n\n For all cuda-capable discrete products with fans\n\n @param device                        The identifier of the target device\n @param minSpeed                      The minimum speed allowed to set\n @param maxSpeed                      The maximum speed allowed to set\n\n return\n         NVML_SUCCESS                 if speed has been adjusted\n         NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         NVML_ERROR_INVALID_ARGUMENT  if device is invalid\n         NVML_ERROR_NOT_SUPPORTED     if the device does not support this\n                                      (doesn't have fans)\n         NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetMinMaxFanSpeed(\n        device: cuda_types::nvml::nvmlDevice_t,\n        minSpeed: *mut ::core::ffi::c_uint,\n        maxSpeed: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Gets current fan control policy.\n\n For Maxwell &tm; or newer fully supported devices.\n\n For all cuda-capable discrete products with fans\n\n device                               The identifier of the target \\a device\n policy                               Reference in which to return the fan control \\a policy\n\n return\n         NVML_SUCCESS                 if \\a policy has been populated\n         NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a policy is null or the \\a fan given doesn't reference\n                                            a fan that exists.\n         NVML_ERROR_NOT_SUPPORTED     if the \\a device is older than Maxwell\n         NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetFanControlPolicy_v2(\n        device: cuda_types::nvml::nvmlDevice_t,\n        fan: ::core::ffi::c_uint,\n        policy: *mut cuda_types::nvml::nvmlFanControlPolicy_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the number of fans on the device.\n\n For all discrete products with dedicated fans.\n\n @param device                               The identifier of the target device\n @param numFans                              The number of fans\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a fan number query was successful\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a numFans is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not have a fan\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetNumFans(\n        device: cuda_types::nvml::nvmlDevice_t,\n        numFans: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /// @deprecated Use \\ref nvmlDeviceGetTemperatureV instead\n    fn nvmlDeviceGetTemperature(\n        device: cuda_types::nvml::nvmlDevice_t,\n        sensorType: cuda_types::nvml::nvmlTemperatureSensors_t,\n        temp: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the cooler's information.\n Returns a cooler's control signal characteristics.  The possible types are restricted, Variable and Toggle.\n See \\ref nvmlCoolerControl_t for details on available signal types.\n Returns objects that cooler cools. Targets may be GPU, Memory, Power Supply or All of these.\n See \\ref nvmlCoolerTarget_t for details on available targets.\n\n For Maxwell &tm; or newer fully supported devices.\n\n For all discrete products with dedicated fans.\n\n @param[in]  device                               The identifier of the target device\n @param[out] coolerInfo                           Structure specifying the cooler's control signal characteristics (out)\n                                                  and the target that cooler cools (out)\n\n @return\n         - \\ref NVML_SUCCESS                         If everything worked\n         - \\ref NVML_ERROR_UNINITIALIZED             If the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT          If \\a device is invalid, \\a signalType or \\a target is NULL\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH If the provided version is invalid/unsupported\n         - \\ref NVML_ERROR_NOT_SUPPORTED             If the \\a device does not support this feature*/\n    fn nvmlDeviceGetCoolerInfo(\n        device: cuda_types::nvml::nvmlDevice_t,\n        coolerInfo: *mut cuda_types::nvml::nvmlCoolerInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the current temperature readings (in degrees C) for the given device.\n\n For all products.\n\n @param[in]       device                      Target device identifier.\n @param[in,out]   temperature                 Structure specifying the sensor type (input) and retrieved\n                                              temperature value (output).\n\n @return\n         - \\ref NVML_SUCCESS                  if \\a temp has been set\n         - \\ref NVML_ERROR_UNINITIALIZED      if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT   if \\a device is invalid, \\a sensorType is invalid or \\a temp is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED      if the device does not have the specified sensor\n         - \\ref NVML_ERROR_GPU_IS_LOST        if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN            on any unexpected error*/\n    fn nvmlDeviceGetTemperatureV(\n        device: cuda_types::nvml::nvmlDevice_t,\n        temperature: *mut cuda_types::nvml::nvmlTemperature_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the temperature threshold for the GPU with the specified threshold type in degrees C.\n\n For Kepler &tm; or newer fully supported devices.\n\n See \\ref nvmlTemperatureThresholds_t for details on available temperature thresholds.\n\n Note: This API is no longer the preferred interface for retrieving the following temperature thresholds\n on Ada and later architectures: NVML_TEMPERATURE_THRESHOLD_SHUTDOWN, NVML_TEMPERATURE_THRESHOLD_SLOWDOWN,\n NVML_TEMPERATURE_THRESHOLD_MEM_MAX and NVML_TEMPERATURE_THRESHOLD_GPU_MAX.\n\n Support for reading these temperature thresholds for Ada and later architectures would be removed from this\n API in future releases. Please use \\ref nvmlDeviceGetFieldValues with NVML_FI_DEV_TEMPERATURE_* fields to retrieve\n temperature thresholds on these architectures.\n\n @param device                               The identifier of the target device\n @param thresholdType                        The type of threshold value queried\n @param temp                                 Reference in which to return the temperature reading\n @return\n         - \\ref NVML_SUCCESS                 if \\a temp has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, \\a thresholdType is invalid or \\a temp is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not have a temperature sensor or is unsupported\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetTemperatureThreshold(\n        device: cuda_types::nvml::nvmlDevice_t,\n        thresholdType: cuda_types::nvml::nvmlTemperatureThresholds_t,\n        temp: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the thermal margin temperature (distance to nearest slowdown threshold).\n\n @param[in]     device                                The identifier of the target device\n @param[in,out] marginTempInfo                        Versioned structure in which to return the temperature reading\n\n @returns\n         - \\ref NVML_SUCCESS                           if the margin temperature was retrieved successfully\n         - \\ref NVML_ERROR_NOT_SUPPORTED               if request is not supported on the current platform\n         - \\ref NVML_ERROR_INVALID_ARGUMENT            if \\a device is invalid or \\a temperature is NULL\n         - \\ref NVML_ERROR_GPU_IS_LOST                 if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH   if the right versioned structure is not used\n         - \\ref NVML_ERROR_UNKNOWN                     on any unexpected error*/\n    fn nvmlDeviceGetMarginTemperature(\n        device: cuda_types::nvml::nvmlDevice_t,\n        marginTempInfo: *mut cuda_types::nvml::nvmlMarginTemperature_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Used to execute a list of thermal system instructions.\n\n @param device                               The identifier of the target device\n @param sensorIndex                          The index of the thermal sensor\n @param pThermalSettings                     Reference in which to return the thermal sensor information\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a pThermalSettings has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a pThermalSettings is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetThermalSettings(\n        device: cuda_types::nvml::nvmlDevice_t,\n        sensorIndex: ::core::ffi::c_uint,\n        pThermalSettings: *mut cuda_types::nvml::nvmlGpuThermalSettings_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the current performance state for the device.\n\n For Fermi &tm; or newer fully supported devices.\n\n See \\ref nvmlPstates_t for details on allowed performance states.\n\n @param device                               The identifier of the target device\n @param pState                               Reference in which to return the performance state reading\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a pState has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a pState is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetPerformanceState(\n        device: cuda_types::nvml::nvmlDevice_t,\n        pState: *mut cuda_types::nvml::nvmlPstates_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves current clocks event reasons.\n\n For all fully supported products.\n\n \\note More than one bit can be enabled at the same time. Multiple reasons can be affecting clocks at once.\n\n @param device                                The identifier of the target device\n @param clocksEventReasons                    Reference in which to return bitmask of active clocks event\n                                                  reasons\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a clocksEventReasons has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a clocksEventReasons is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlClocksEventReasons\n @see nvmlDeviceGetSupportedClocksEventReasons*/\n    fn nvmlDeviceGetCurrentClocksEventReasons(\n        device: cuda_types::nvml::nvmlDevice_t,\n        clocksEventReasons: *mut ::core::ffi::c_ulonglong,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /// @deprecated Use \\ref nvmlDeviceGetCurrentClocksEventReasons instead\n    fn nvmlDeviceGetCurrentClocksThrottleReasons(\n        device: cuda_types::nvml::nvmlDevice_t,\n        clocksThrottleReasons: *mut ::core::ffi::c_ulonglong,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves bitmask of supported clocks event reasons that can be returned by\n \\ref nvmlDeviceGetCurrentClocksEventReasons\n\n For all fully supported products.\n\n This method is not supported in virtual machines running virtual GPU (vGPU).\n\n @param device                               The identifier of the target device\n @param supportedClocksEventReasons       Reference in which to return bitmask of supported\n                                              clocks event reasons\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a supportedClocksEventReasons has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a supportedClocksEventReasons is NULL\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlClocksEventReasons\n @see nvmlDeviceGetCurrentClocksEventReasons*/\n    fn nvmlDeviceGetSupportedClocksEventReasons(\n        device: cuda_types::nvml::nvmlDevice_t,\n        supportedClocksEventReasons: *mut ::core::ffi::c_ulonglong,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /// @deprecated Use \\ref nvmlDeviceGetSupportedClocksEventReasons instead\n    fn nvmlDeviceGetSupportedClocksThrottleReasons(\n        device: cuda_types::nvml::nvmlDevice_t,\n        supportedClocksThrottleReasons: *mut ::core::ffi::c_ulonglong,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** @deprecated Use \\ref nvmlDeviceGetPerformanceState. This function exposes an incorrect generalization.\n\n Retrieve the current performance state for the device.\n\n For Fermi &tm; or newer fully supported devices.\n\n See \\ref nvmlPstates_t for details on allowed performance states.\n\n @param device                               The identifier of the target device\n @param pState                               Reference in which to return the performance state reading\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a pState has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a pState is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetPowerState(\n        device: cuda_types::nvml::nvmlDevice_t,\n        pState: *mut cuda_types::nvml::nvmlPstates_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve performance monitor samples from the associated subdevice.\n\n @param device\n @param pDynamicPstatesInfo\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a pDynamicPstatesInfo has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a pDynamicPstatesInfo is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetDynamicPstatesInfo(\n        device: cuda_types::nvml::nvmlDevice_t,\n        pDynamicPstatesInfo: *mut cuda_types::nvml::nvmlGpuDynamicPstatesInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the MemClk (Memory Clock) VF offset value.\n @param[in]   device                         The identifier of the target device\n @param[out]  offset                         The retrieved MemClk VF offset value\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a offset has been successfully queried\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a offset is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetMemClkVfOffset(\n        device: cuda_types::nvml::nvmlDevice_t,\n        offset: *mut ::core::ffi::c_int,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve min and max clocks of some clock domain for a given PState\n\n @param device                               The identifier of the target device\n @param type                                 Clock domain\n @param pstate                               PState to query\n @param minClockMHz                          Reference in which to return min clock frequency\n @param maxClockMHz                          Reference in which to return max clock frequency\n\n @return\n         - \\ref NVML_SUCCESS                 if everything worked\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device, \\a type or \\a minClockMHz and \\a maxClockMHz are NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_UNKNOWN           if \\a type or \\a pstate are invalid or any unexpected error*/\n    fn nvmlDeviceGetMinMaxClockOfPState(\n        device: cuda_types::nvml::nvmlDevice_t,\n        type_: cuda_types::nvml::nvmlClockType_t,\n        pstate: cuda_types::nvml::nvmlPstates_t,\n        minClockMHz: *mut ::core::ffi::c_uint,\n        maxClockMHz: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get all supported Performance States (P-States) for the device.\n\n The returned array would contain a contiguous list of valid P-States supported by\n the device. If the number of supported P-States is fewer than the size of the array\n supplied missing elements would contain \\a NVML_PSTATE_UNKNOWN.\n\n The number of elements in the returned list will never exceed \\a NVML_MAX_GPU_PERF_PSTATES.\n\n @param device                               The identifier of the target device\n @param pstates                              Container to return the list of performance states\n                                             supported by device\n @param size                                 Size of the supplied \\a pstates array in bytes\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a pstates array has been retrieved\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if the the container supplied was not large enough to\n                                             hold the resulting list\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device or \\a pstates is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support performance state readings\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetSupportedPerformanceStates(\n        device: cuda_types::nvml::nvmlDevice_t,\n        pstates: *mut cuda_types::nvml::nvmlPstates_t,\n        size: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the GPCCLK min max VF offset value.\n @param[in]   device                         The identifier of the target device\n @param[out]  minOffset                      The retrieved GPCCLK VF min offset value\n @param[out]  maxOffset                      The retrieved GPCCLK VF max offset value\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a offset has been successfully queried\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a offset is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetGpcClkMinMaxVfOffset(\n        device: cuda_types::nvml::nvmlDevice_t,\n        minOffset: *mut ::core::ffi::c_int,\n        maxOffset: *mut ::core::ffi::c_int,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the MemClk (Memory Clock) min max VF offset value.\n @param[in]   device                         The identifier of the target device\n @param[out]  minOffset                      The retrieved MemClk VF min offset value\n @param[out]  maxOffset                      The retrieved MemClk VF max offset value\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a offset has been successfully queried\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a offset is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetMemClkMinMaxVfOffset(\n        device: cuda_types::nvml::nvmlDevice_t,\n        minOffset: *mut ::core::ffi::c_int,\n        maxOffset: *mut ::core::ffi::c_int,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve min, max and current clock offset of some clock domain for a given PState\n\n For Maxwell &tm; or newer fully supported devices.\n\n Note: \\ref nvmlDeviceGetGpcClkVfOffset, \\ref nvmlDeviceGetMemClkVfOffset, \\ref nvmlDeviceGetGpcClkMinMaxVfOffset and\n       \\ref nvmlDeviceGetMemClkMinMaxVfOffset will be deprecated in a future release.\nUse \\ref nvmlDeviceGetClockOffsets instead.\n\n @param device                               The identifier of the target device\n @param info                                 Structure specifying the clock type (input) and the pstate (input)\n                                             retrieved clock offset value (output), min clock offset (output)\n                                             and max clock offset (output)\n\n @return\n         - \\ref NVML_SUCCESS                         If everything worked\n         - \\ref NVML_ERROR_UNINITIALIZED             If the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT          If \\a device, \\a type or \\a pstate are invalid or both\n                                                             \\a minClockOffsetMHz and \\a maxClockOffsetMHz are NULL\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH If the provided version is invalid/unsupported\n         - \\ref NVML_ERROR_NOT_SUPPORTED             If the device does not support this feature*/\n    fn nvmlDeviceGetClockOffsets(\n        device: cuda_types::nvml::nvmlDevice_t,\n        info: *mut cuda_types::nvml::nvmlClockOffset_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Control current clock offset of some clock domain for a given PState\n\n For Maxwell &tm; or newer fully supported devices.\n\n Requires privileged user.\n\n @param device                               The identifier of the target device\n @param info                                 Structure specifying the clock type (input), the pstate (input)\n                                             and clock offset value (input)\n\n @return\n         - \\ref NVML_SUCCESS                         If everything worked\n         - \\ref NVML_ERROR_UNINITIALIZED             If the library has not been successfully initialized\n         - \\ref NVML_ERROR_NO_PERMISSION             If the user doesn't have permission to perform this operation\n         - \\ref NVML_ERROR_INVALID_ARGUMENT          If \\a device, \\a type or \\a pstate are invalid or both\n                                                             \\a clockOffsetMHz is out of allowed range.\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH If the provided version is invalid/unsupported\n         - \\ref NVML_ERROR_NOT_SUPPORTED             If the device does not support this feature*/\n    fn nvmlDeviceSetClockOffsets(\n        device: cuda_types::nvml::nvmlDevice_t,\n        info: *mut cuda_types::nvml::nvmlClockOffset_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves a performance mode string with all the\n performance modes defined for this device along with their associated\n GPU Clock and Memory Clock values.\n Not all tokens will be reported on all GPUs, and additional tokens\n may be added in the future.\n For backwards compatibility we still provide nvclock and memclock;\n those are the same as nvclockmin and memclockmin.\n\n Note: These clock values take into account the offset\n set by clients through /ref nvmlDeviceSetClockOffsets.\n\n Maximum available Pstate (P15) shows the minimum performance level (0) and vice versa.\n\n Each performance modes are returned as a comma-separated list of\n \"token=value\" pairs.  Each set of performance mode tokens are separated\n by a \";\".  Valid tokens:\n\n    Token                    Value\n   \"perf\"                    unsigned int   - the Performance level\n   \"nvclock\"                 unsigned int   - the GPU clocks (in MHz) for the perf level\n   \"nvclockmin\"              unsigned int   - the GPU clocks min (in MHz) for the perf level\n   \"nvclockmax\"              unsigned int   - the GPU clocks max (in MHz) for the perf level\n   \"nvclockeditable\"         unsigned int   - if the GPU clock domain is editable for the perf level\n   \"memclock\"                unsigned int   - the memory clocks (in MHz) for the perf level\n   \"memclockmin\"             unsigned int   - the memory clocks min (in MHz) for the perf level\n   \"memclockmax\"             unsigned int   - the memory clocks max (in MHz) for the perf level\n   \"memclockeditable\"        unsigned int   - if the memory clock domain is editable for the perf level\n   \"memtransferrate\"         unsigned int   - the memory transfer rate (in MHz) for the perf level\n   \"memtransferratemin\"      unsigned int   - the memory transfer rate min (in MHz) for the perf level\n   \"memtransferratemax\"      unsigned int   - the memory transfer rate max (in MHz) for the perf level\n   \"memtransferrateeditable\" unsigned int   - if the memory transfer rate is editable for the perf level\n\n Example:\n\n perf=0, nvclock=324, nvclockmin=324, nvclockmax=324, nvclockeditable=0,\n memclock=324, memclockmin=324, memclockmax=324, memclockeditable=0,\n memtransferrate=648, memtransferratemin=648, memtransferratemax=648,\n memtransferrateeditable=0 ;\n perf=1, nvclock=324, nvclockmin=324, nvclockmax=640, nvclockeditable=0,\n memclock=810, memclockmin=810, memclockmax=810, memclockeditable=0,\n memtransferrate=1620, memtransferrate=1620, memtransferrate=1620,\n memtransferrateeditable=0 ;\n\n\n @param device                               The identifier of the target device\n @param perfModes                            Reference in which to return the performance level string\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a perfModes has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, or \\a name is NULL\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a length is too small\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetPerformanceModes(\n        device: cuda_types::nvml::nvmlDevice_t,\n        perfModes: *mut cuda_types::nvml::nvmlDevicePerfModes_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves a string with the associated current GPU Clock and Memory Clock values.\n\n Not all tokens will be reported on all GPUs, and additional tokens\n may be added in the future.\n\n Note: These clock values take into account the offset\n set by clients through /ref nvmlDeviceSetClockOffsets.\n\n Clock values are returned as a comma-separated list of\n \"token=value\" pairs.\n Valid tokens:\n\n    Token                    Value\n   \"perf\"                    unsigned int   - the Performance level\n   \"nvclock\"                 unsigned int   - the GPU clocks (in MHz) for the perf level\n   \"nvclockmin\"              unsigned int   - the GPU clocks min (in MHz) for the perf level\n   \"nvclockmax\"              unsigned int   - the GPU clocks max (in MHz) for the perf level\n   \"nvclockeditable\"         unsigned int   - if the GPU clock domain is editable for the perf level\n   \"memclock\"                unsigned int   - the memory clocks (in MHz) for the perf level\n   \"memclockmin\"             unsigned int   - the memory clocks min (in MHz) for the perf level\n   \"memclockmax\"             unsigned int   - the memory clocks max (in MHz) for the perf level\n   \"memclockeditable\"        unsigned int   - if the memory clock domain is editable for the perf level\n   \"memtransferrate\"         unsigned int   - the memory transfer rate (in MHz) for the perf level\n   \"memtransferratemin\"      unsigned int   - the memory transfer rate min (in MHz) for the perf level\n   \"memtransferratemax\"      unsigned int   - the memory transfer rate max (in MHz) for the perf level\n   \"memtransferrateeditable\" unsigned int   - if the memory transfer rate is editable for the perf level\n\n Example:\n\n nvclock=324, nvclockmin=324, nvclockmax=324, nvclockeditable=0,\n memclock=324, memclockmin=324, memclockmax=324, memclockeditable=0,\n memtransferrate=648, memtransferratemin=648, memtransferratemax=648,\n memtransferrateeditable=0 ;\n\n\n @param device                               The identifier of the target device\n @param currentClockFreqs                    Reference in which to return the performance level string\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a currentClockFreqs has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, or \\a name is NULL\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a length is too small\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetCurrentClockFreqs(\n        device: cuda_types::nvml::nvmlDevice_t,\n        currentClockFreqs: *mut cuda_types::nvml::nvmlDeviceCurrentClockFreqs_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** @deprecated This API has been deprecated.\n\n Retrieves the power management mode associated with this device.\n\n For products from the Fermi family.\n     - Requires \\a NVML_INFOROM_POWER version 3.0 or higher.\n\n For from the Kepler or newer families.\n     - Does not require \\a NVML_INFOROM_POWER object.\n\n This flag indicates whether any power management algorithm is currently active on the device. An\n enabled state does not necessarily mean the device is being actively throttled -- only that\n that the driver will do so if the appropriate conditions are met.\n\n See \\ref nvmlEnableState_t for details on allowed modes.\n\n @param device                               The identifier of the target device\n @param mode                                 Reference in which to return the current power management mode\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a mode has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a mode is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetPowerManagementMode(\n        device: cuda_types::nvml::nvmlDevice_t,\n        mode: *mut cuda_types::nvml::nvmlEnableState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the power management limit associated with this device.\n\n For Fermi &tm; or newer fully supported devices.\n\n The power limit defines the upper boundary for the card's power draw. If\n the card's total power draw reaches this limit the power management algorithm kicks in.\n\n This reading is only available if power management mode is supported.\n See \\ref nvmlDeviceGetPowerManagementMode.\n\n @param device                               The identifier of the target device\n @param limit                                Reference in which to return the power management limit in milliwatts\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a limit has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a limit is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetPowerManagementLimit(\n        device: cuda_types::nvml::nvmlDevice_t,\n        limit: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves information about possible values of power management limits on this device.\n\n For Kepler &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param minLimit                             Reference in which to return the minimum power management limit in milliwatts\n @param maxLimit                             Reference in which to return the maximum power management limit in milliwatts\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a minLimit and \\a maxLimit have been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a minLimit or \\a maxLimit is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlDeviceSetPowerManagementLimit*/\n    fn nvmlDeviceGetPowerManagementLimitConstraints(\n        device: cuda_types::nvml::nvmlDevice_t,\n        minLimit: *mut ::core::ffi::c_uint,\n        maxLimit: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves default power management limit on this device, in milliwatts.\n Default power management limit is a power management limit that the device boots with.\n\n For Kepler &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param defaultLimit                         Reference in which to return the default power management limit in milliwatts\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a defaultLimit has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a defaultLimit is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetPowerManagementDefaultLimit(\n        device: cuda_types::nvml::nvmlDevice_t,\n        defaultLimit: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves power usage for this GPU in milliwatts and its associated circuitry (e.g. memory)\n\n For Fermi &tm; or newer fully supported devices.\n\n On Fermi and Kepler GPUs the reading is accurate to within +/- 5% of current power draw. On Ampere\n (except GA100) or newer GPUs, the API returns power averaged over 1 sec interval. On GA100 and\n older architectures, instantaneous power is returned.\n\n See \\ref NVML_FI_DEV_POWER_AVERAGE and \\ref NVML_FI_DEV_POWER_INSTANT to query specific power\n values.\n\n It is only available if power management mode is supported. See \\ref nvmlDeviceGetPowerManagementMode.\n\n @param device                               The identifier of the target device\n @param power                                Reference in which to return the power usage information\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a power has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a power is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support power readings\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetPowerUsage(\n        device: cuda_types::nvml::nvmlDevice_t,\n        power: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves current power mizer mode on this device.\n\n PowerMizerMode provides a hint to the driver as to how to manage the performance of the GPU.\n\n For Maxwell &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param powerMizerMode                       Reference in which to return the power mizer mode\n @param supportedPowerMizerModes             Reference in which to return the bitmask of supported power mizer modes on this device.\n                                             The supported modes can be combined using the bitwise OR operator '|'.\n                                             For example, if a device supports all PowerMizer modes, the bitmask would be:\n                                             supportedPowerMizerModes = ((1 << NVML_POWER_MIZER_MODE_ADAPTIVE) |\n                                                                         (1 << NVML_POWER_MIZER_MODE_PREFER_MAXIMUM_PERFORMANCE) |\n                                                                         (1 << NVML_POWER_MIZER_MODE_AUTO) |\n                                                                         (1 << NVML_POWER_MIZER_MODE_PREFER_CONSISTENT_PERFORMANCE));\n                                             This bitmask can be used to check which power mizer modes are available on the device by performing\n                                             a bitwise AND operation with the specific mode you want to check.\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a powerMizerMode has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a powerMizerMode is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support powerMizerMode readings\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetPowerMizerMode_v1(\n        device: cuda_types::nvml::nvmlDevice_t,\n        powerMizerMode: *mut cuda_types::nvml::nvmlDevicePowerMizerModes_v1_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Sets the new power mizer mode.\n\n For Maxwell &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param powerMizerMode                       Reference in which to set the power mizer mode.\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a powerMizerMode has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a powerMizerMode is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support powerMizerMode readings\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceSetPowerMizerMode_v1(\n        device: cuda_types::nvml::nvmlDevice_t,\n        powerMizerMode: *mut cuda_types::nvml::nvmlDevicePowerMizerModes_v1_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves total energy consumption for this GPU in millijoules (mJ) since the driver was last reloaded\n\n For Volta &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param energy                               Reference in which to return the energy consumption information\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a energy has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a energy is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support energy readings\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetTotalEnergyConsumption(\n        device: cuda_types::nvml::nvmlDevice_t,\n        energy: *mut ::core::ffi::c_ulonglong,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get the effective power limit that the driver enforces after taking into account all limiters\n\n Note: This can be different from the \\ref nvmlDeviceGetPowerManagementLimit if other limits are set elsewhere\n This includes the out of band power limit interface\n\n For Kepler &tm; or newer fully supported devices.\n\n @param device                           The device to communicate with\n @param limit                            Reference in which to return the power management limit in milliwatts\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a limit has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a limit is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetEnforcedPowerLimit(\n        device: cuda_types::nvml::nvmlDevice_t,\n        limit: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the current GOM and pending GOM (the one that GPU will switch to after reboot).\n\n For GK110 M-class and X-class Tesla &tm; products from the Kepler family.\n Modes \\ref NVML_GOM_LOW_DP and \\ref NVML_GOM_ALL_ON are supported on fully supported GeForce products.\n Not supported on Quadro &reg; and Tesla &tm; C-class products.\n\n @param device                               The identifier of the target device\n @param current                              Reference in which to return the current GOM\n @param pending                              Reference in which to return the pending GOM\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a mode has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a current or \\a pending is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlGpuOperationMode_t\n @see nvmlDeviceSetGpuOperationMode*/\n    fn nvmlDeviceGetGpuOperationMode(\n        device: cuda_types::nvml::nvmlDevice_t,\n        current: *mut cuda_types::nvml::nvmlGpuOperationMode_t,\n        pending: *mut cuda_types::nvml::nvmlGpuOperationMode_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the amount of used, free, reserved and total memory available on the device, in bytes.\n The reserved amount is supported on version 2 only.\n\n For all products.\n\n Enabling ECC reduces the amount of total available memory, due to the extra required parity bits.\n Under WDDM most device memory is allocated and managed on startup by Windows.\n\n Under Linux and Windows TCC, the reported amount of used memory is equal to the sum of memory allocated\n by all active channels on the device.\n\n See \\ref nvmlMemory_v2_t for details on available memory info.\n\n @note In MIG mode, if device handle is provided, the API returns aggregate\n       information, only if the caller has appropriate privileges. Per-instance\n       information can be queried by using specific MIG device handles.\n\n @note nvmlDeviceGetMemoryInfo_v2 adds additional memory information.\n\n @note On systems where GPUs are NUMA nodes, the accuracy of FB memory utilization\n       provided by this API depends on the memory accounting of the operating system.\n       This is because FB memory is managed by the operating system instead of the NVIDIA GPU driver.\n       Typically, pages allocated from FB memory are not released even after\n       the process terminates to enhance performance. In scenarios where\n       the operating system is under memory pressure, it may resort to utilizing FB memory.\n       Such actions can result in discrepancies in the accuracy of memory reporting.\n\n @note On certain SOC platforms, the integrated GPU (iGPU) does not use a dedicated framebuffer\n       but instead shares memory with the system. As a result, \\ref NVML_ERROR_NOT_SUPPORTED\n       will be returned in this case.\n\n @param device                               The identifier of the target device\n @param memory                               Reference in which to return the memory information\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a memory has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_NO_PERMISSION     if the user doesn't have permission to perform this operation\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a memory is NULL\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if video memory is unsupported on the device\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetMemoryInfo(\n        device: cuda_types::nvml::nvmlDevice_t,\n        memory: *mut cuda_types::nvml::nvmlMemory_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /// nvmlDeviceGetMemoryInfo_v2 accounts separately for reserved memory and includes it in the used memory amount.\n    fn nvmlDeviceGetMemoryInfo_v2(\n        device: cuda_types::nvml::nvmlDevice_t,\n        memory: *mut cuda_types::nvml::nvmlMemory_v2_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the current compute mode for the device.\n\n For all products.\n\n See \\ref nvmlComputeMode_t for details on allowed compute modes.\n\n @param device                               The identifier of the target device\n @param mode                                 Reference in which to return the current compute mode\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a mode has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a mode is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlDeviceSetComputeMode()*/\n    fn nvmlDeviceGetComputeMode(\n        device: cuda_types::nvml::nvmlDevice_t,\n        mode: *mut cuda_types::nvml::nvmlComputeMode_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the CUDA compute capability of the device.\n\n For all products.\n\n Returns the major and minor compute capability version numbers of the\n device.  The major and minor versions are equivalent to the\n CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR and\n CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR attributes that would be\n returned by CUDA's cuDeviceGetAttribute().\n\n @param device                               The identifier of the target device\n @param major                                Reference in which to return the major CUDA compute capability\n @param minor                                Reference in which to return the minor CUDA compute capability\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a major and \\a minor have been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a major or \\a minor are NULL\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetCudaComputeCapability(\n        device: cuda_types::nvml::nvmlDevice_t,\n        major: *mut ::core::ffi::c_int,\n        minor: *mut ::core::ffi::c_int,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the current and pending DRAM Encryption modes for the device.\n\n For Blackwell &tm; or newer fully supported devices.\n Only applicable to devices that support DRAM Encryption\n Requires \\a NVML_INFOROM_DEN version 1.0 or higher.\n\n Changing DRAM Encryption modes requires a reboot. The \"pending\" DRAM Encryption mode refers to the target mode following\n the next reboot.\n\n See \\ref nvmlEnableState_t for details on allowed modes.\n\n @param device                               The identifier of the target device\n @param current                              Reference in which to return the current DRAM Encryption mode\n @param pending                              Reference in which to return the pending DRAM Encryption mode\n\n @return\n         - \\ref NVML_SUCCESS                         if \\a current and \\a pending have been set\n         - \\ref NVML_ERROR_UNINITIALIZED             if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT          if \\a device is invalid or either \\a current or \\a pending is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED             if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST               if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH if the argument version is not supported\n         - \\ref NVML_ERROR_UNKNOWN                   on any unexpected error\n\n @see nvmlDeviceSetDramEncryptionMode()*/\n    fn nvmlDeviceGetDramEncryptionMode(\n        device: cuda_types::nvml::nvmlDevice_t,\n        current: *mut cuda_types::nvml::nvmlDramEncryptionInfo_t,\n        pending: *mut cuda_types::nvml::nvmlDramEncryptionInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Set the DRAM Encryption mode for the device.\n\n For Kepler &tm; or newer fully supported devices.\n Only applicable to devices that support DRAM Encryption.\n Requires \\a NVML_INFOROM_DEN version 1.0 or higher.\n Requires root/admin permissions.\n\n The DRAM Encryption mode determines whether the GPU enables its DRAM Encryption support.\n\n This operation takes effect after the next reboot.\n\n See \\ref nvmlEnableState_t for details on available modes.\n\n @param device                               The identifier of the target device\n @param dramEncryption                       The target DRAM Encryption mode\n\n @return\n         - \\ref NVML_SUCCESS                         if the DRAM Encryption mode was set\n         - \\ref NVML_ERROR_UNINITIALIZED             if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT          if \\a device is invalid or \\a DRAM Encryption is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED             if the device does not support this feature\n         - \\ref NVML_ERROR_NO_PERMISSION             if the user doesn't have permission to perform this operation\n         - \\ref NVML_ERROR_GPU_IS_LOST               if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH if the argument version is not supported\n         - \\ref NVML_ERROR_UNKNOWN                   on any unexpected error\n\n @see nvmlDeviceGetDramEncryptionMode()*/\n    fn nvmlDeviceSetDramEncryptionMode(\n        device: cuda_types::nvml::nvmlDevice_t,\n        dramEncryption: *const cuda_types::nvml::nvmlDramEncryptionInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the current and pending ECC modes for the device.\n\n For Fermi &tm; or newer fully supported devices.\n Only applicable to devices with ECC.\n Requires \\a NVML_INFOROM_ECC version 1.0 or higher.\n\n Changing ECC modes requires a reboot. The \"pending\" ECC mode refers to the target mode following\n the next reboot.\n\n See \\ref nvmlEnableState_t for details on allowed modes.\n\n @param device                               The identifier of the target device\n @param current                              Reference in which to return the current ECC mode\n @param pending                              Reference in which to return the pending ECC mode\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a current and \\a pending have been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or either \\a current or \\a pending is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlDeviceSetEccMode()*/\n    fn nvmlDeviceGetEccMode(\n        device: cuda_types::nvml::nvmlDevice_t,\n        current: *mut cuda_types::nvml::nvmlEnableState_t,\n        pending: *mut cuda_types::nvml::nvmlEnableState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the default ECC modes for the device.\n\n For Fermi &tm; or newer fully supported devices.\n Only applicable to devices with ECC.\n Requires \\a NVML_INFOROM_ECC version 1.0 or higher.\n\n See \\ref nvmlEnableState_t for details on allowed modes.\n\n @param device                               The identifier of the target device\n @param defaultMode                          Reference in which to return the default ECC mode\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a current and \\a pending have been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a default is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlDeviceSetEccMode()*/\n    fn nvmlDeviceGetDefaultEccMode(\n        device: cuda_types::nvml::nvmlDevice_t,\n        defaultMode: *mut cuda_types::nvml::nvmlEnableState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the device boardId from 0-N.\n Devices with the same boardId indicate GPUs connected to the same PLX.  Use in conjunction with\n  \\ref nvmlDeviceGetMultiGpuBoard() to decide if they are on the same board as well.\n  The boardId returned is a unique ID for the current configuration.  Uniqueness and ordering across\n  reboots and system configurations is not guaranteed (i.e. if a Tesla K40c returns 0x100 and\n  the two GPUs on a Tesla K10 in the same system returns 0x200 it is not guaranteed they will\n  always return those values but they will always be different from each other).\n\n\n For Fermi &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param boardId                              Reference in which to return the device's board ID\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a boardId has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a boardId is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetBoardId(\n        device: cuda_types::nvml::nvmlDevice_t,\n        boardId: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves whether the device is on a Multi-GPU Board\n Devices that are on multi-GPU boards will set \\a multiGpuBool to a non-zero value.\n\n For Fermi &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param multiGpuBool                         Reference in which to return a zero or non-zero value\n                                                 to indicate whether the device is on a multi GPU board\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a multiGpuBool has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a multiGpuBool is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetMultiGpuBoard(\n        device: cuda_types::nvml::nvmlDevice_t,\n        multiGpuBool: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the total ECC error counts for the device.\n\n For Fermi &tm; or newer fully supported devices.\n Only applicable to devices with ECC.\n Requires \\a NVML_INFOROM_ECC version 1.0 or higher.\n Requires ECC Mode to be enabled.\n\n The total error count is the sum of errors across each of the separate memory systems, i.e. the total set of\n errors across the entire device.\n\n See \\ref nvmlMemoryErrorType_t for a description of available error types.\\n\n See \\ref nvmlEccCounterType_t for a description of available counter types.\n\n @param device                               The identifier of the target device\n @param errorType                            Flag that specifies the type of the errors.\n @param counterType                          Flag that specifies the counter-type of the errors.\n @param eccCounts                            Reference in which to return the specified ECC errors\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a eccCounts has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device, \\a errorType or \\a counterType is invalid, or \\a eccCounts is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlDeviceClearEccErrorCounts()*/\n    fn nvmlDeviceGetTotalEccErrors(\n        device: cuda_types::nvml::nvmlDevice_t,\n        errorType: cuda_types::nvml::nvmlMemoryErrorType_t,\n        counterType: cuda_types::nvml::nvmlEccCounterType_t,\n        eccCounts: *mut ::core::ffi::c_ulonglong,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the detailed ECC error counts for the device.\n\n @deprecated   This API supports only a fixed set of ECC error locations\n               On different GPU architectures different locations are supported\n               See \\ref nvmlDeviceGetMemoryErrorCounter\n\n For Fermi &tm; or newer fully supported devices.\n Only applicable to devices with ECC.\n Requires \\a NVML_INFOROM_ECC version 2.0 or higher to report aggregate location-based ECC counts.\n Requires \\a NVML_INFOROM_ECC version 1.0 or higher to report all other ECC counts.\n Requires ECC Mode to be enabled.\n\n Detailed errors provide separate ECC counts for specific parts of the memory system.\n\n Reports zero for unsupported ECC error counters when a subset of ECC error counters are supported.\n\n See \\ref nvmlMemoryErrorType_t for a description of available bit types.\\n\n See \\ref nvmlEccCounterType_t for a description of available counter types.\\n\n See \\ref nvmlEccErrorCounts_t for a description of provided detailed ECC counts.\n\n @param device                               The identifier of the target device\n @param errorType                            Flag that specifies the type of the errors.\n @param counterType                          Flag that specifies the counter-type of the errors.\n @param eccCounts                            Reference in which to return the specified ECC errors\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a eccCounts has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device, \\a errorType or \\a counterType is invalid, or \\a eccCounts is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlDeviceClearEccErrorCounts()*/\n    fn nvmlDeviceGetDetailedEccErrors(\n        device: cuda_types::nvml::nvmlDevice_t,\n        errorType: cuda_types::nvml::nvmlMemoryErrorType_t,\n        counterType: cuda_types::nvml::nvmlEccCounterType_t,\n        eccCounts: *mut cuda_types::nvml::nvmlEccErrorCounts_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the requested memory error counter for the device.\n\n For Fermi &tm; or newer fully supported devices.\n Requires \\a NVML_INFOROM_ECC version 2.0 or higher to report aggregate location-based memory error counts.\n Requires \\a NVML_INFOROM_ECC version 1.0 or higher to report all other memory error counts.\n\n Only applicable to devices with ECC.\n\n Requires ECC Mode to be enabled.\n\n @note On MIG-enabled GPUs, per instance information can be queried using specific\n       MIG device handles. Per instance information is currently only supported for\n       non-DRAM uncorrectable volatile errors. Querying volatile errors using device\n       handles is currently not supported.\n\n See \\ref nvmlMemoryErrorType_t for a description of available memory error types.\\n\n See \\ref nvmlEccCounterType_t for a description of available counter types.\\n\n See \\ref nvmlMemoryLocation_t for a description of available counter locations.\\n\n\n @param device                               The identifier of the target device\n @param errorType                            Flag that specifies the type of error.\n @param counterType                          Flag that specifies the counter-type of the errors.\n @param locationType                         Specifies the location of the counter.\n @param count                                Reference in which to return the ECC counter\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a count has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device, \\a bitTyp,e \\a counterType or \\a locationType is\n                                             invalid, or \\a count is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support ECC error reporting in the specified memory\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetMemoryErrorCounter(\n        device: cuda_types::nvml::nvmlDevice_t,\n        errorType: cuda_types::nvml::nvmlMemoryErrorType_t,\n        counterType: cuda_types::nvml::nvmlEccCounterType_t,\n        locationType: cuda_types::nvml::nvmlMemoryLocation_t,\n        count: *mut ::core::ffi::c_ulonglong,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the current utilization rates for the device's major subsystems.\n\n For Fermi &tm; or newer fully supported devices.\n\n See \\ref nvmlUtilization_t for details on available utilization rates.\n\n \\note During driver initialization when ECC is enabled one can see high GPU and Memory Utilization readings.\n       This is caused by ECC Memory Scrubbing mechanism that is performed during driver initialization.\n\n @note On MIG-enabled GPUs, querying device utilization rates is not currently supported.\n\n @param device                               The identifier of the target device\n @param utilization                          Reference in which to return the utilization information\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a utilization has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a utilization is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetUtilizationRates(\n        device: cuda_types::nvml::nvmlDevice_t,\n        utilization: *mut cuda_types::nvml::nvmlUtilization_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the current utilization and sampling size in microseconds for the Encoder\n\n For Kepler &tm; or newer fully supported devices.\n\n @note On MIG-enabled GPUs, querying encoder utilization is not currently supported.\n\n @param device                               The identifier of the target device\n @param utilization                          Reference to an unsigned int for encoder utilization info\n @param samplingPeriodUs                     Reference to an unsigned int for the sampling period in US\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a utilization has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, \\a utilization is NULL, or \\a samplingPeriodUs is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetEncoderUtilization(\n        device: cuda_types::nvml::nvmlDevice_t,\n        utilization: *mut ::core::ffi::c_uint,\n        samplingPeriodUs: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the current capacity of the device's encoder, as a percentage of maximum encoder capacity with valid values in the range 0-100.\n\n For Maxwell &tm; or newer fully supported devices.\n\n @param device                            The identifier of the target device\n @param encoderQueryType                  Type of encoder to query\n @param encoderCapacity                   Reference to an unsigned int for the encoder capacity\n\n @return\n         - \\ref NVML_SUCCESS                  if \\a encoderCapacity is fetched\n         - \\ref NVML_ERROR_UNINITIALIZED      if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT   if \\a encoderCapacity is NULL, or \\a device or \\a encoderQueryType\n                                              are invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED      if device does not support the encoder specified in \\a encodeQueryType\n         - \\ref NVML_ERROR_GPU_IS_LOST        if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN            on any unexpected error*/\n    fn nvmlDeviceGetEncoderCapacity(\n        device: cuda_types::nvml::nvmlDevice_t,\n        encoderQueryType: cuda_types::nvml::nvmlEncoderType_t,\n        encoderCapacity: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the current encoder statistics for a given device.\n\n For Maxwell &tm; or newer fully supported devices.\n\n @param device                            The identifier of the target device\n @param sessionCount                      Reference to an unsigned int for count of active encoder sessions\n @param averageFps                        Reference to an unsigned int for trailing average FPS of all active sessions\n @param averageLatency                    Reference to an unsigned int for encode latency in microseconds\n\n @return\n         - \\ref NVML_SUCCESS                  if \\a sessionCount, \\a averageFps and \\a averageLatency is fetched\n         - \\ref NVML_ERROR_UNINITIALIZED      if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT   if \\a sessionCount, or \\a device or \\a averageFps,\n                                              or \\a averageLatency is NULL\n         - \\ref NVML_ERROR_GPU_IS_LOST        if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN            on any unexpected error*/\n    fn nvmlDeviceGetEncoderStats(\n        device: cuda_types::nvml::nvmlDevice_t,\n        sessionCount: *mut ::core::ffi::c_uint,\n        averageFps: *mut ::core::ffi::c_uint,\n        averageLatency: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves information about active encoder sessions on a target device.\n\n An array of active encoder sessions is returned in the caller-supplied buffer pointed at by \\a sessionInfos. The\n array element count is passed in \\a sessionCount, and \\a sessionCount is used to return the number of sessions\n written to the buffer.\n\n If the supplied buffer is not large enough to accommodate the active session array, the function returns\n NVML_ERROR_INSUFFICIENT_SIZE, with the element count of nvmlEncoderSessionInfo_t array required in \\a sessionCount.\n To query the number of active encoder sessions, call this function with *sessionCount = 0.  The code will return\n NVML_SUCCESS with number of active encoder sessions updated in *sessionCount.\n\n For Maxwell &tm; or newer fully supported devices.\n\n @param device                            The identifier of the target device\n @param sessionCount                      Reference to caller supplied array size, and returns the number of sessions.\n @param sessionInfos                      Reference in which to return the session information\n\n @return\n         - \\ref NVML_SUCCESS                  if \\a sessionInfos is fetched\n         - \\ref NVML_ERROR_UNINITIALIZED      if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE  if \\a sessionCount is too small, array element count is returned in \\a sessionCount\n         - \\ref NVML_ERROR_INVALID_ARGUMENT   if \\a sessionCount is NULL.\n         - \\ref NVML_ERROR_GPU_IS_LOST        if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_NOT_SUPPORTED      if this query is not supported by \\a device\n         - \\ref NVML_ERROR_UNKNOWN            on any unexpected error*/\n    fn nvmlDeviceGetEncoderSessions(\n        device: cuda_types::nvml::nvmlDevice_t,\n        sessionCount: *mut ::core::ffi::c_uint,\n        sessionInfos: *mut cuda_types::nvml::nvmlEncoderSessionInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the current utilization and sampling size in microseconds for the Decoder\n\n For Kepler &tm; or newer fully supported devices.\n\n @note On MIG-enabled GPUs, querying decoder utilization is not currently supported.\n\n @param device                               The identifier of the target device\n @param utilization                          Reference to an unsigned int for decoder utilization info\n @param samplingPeriodUs                     Reference to an unsigned int for the sampling period in US\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a utilization has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, \\a utilization is NULL, or \\a samplingPeriodUs is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetDecoderUtilization(\n        device: cuda_types::nvml::nvmlDevice_t,\n        utilization: *mut ::core::ffi::c_uint,\n        samplingPeriodUs: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the current utilization and sampling size in microseconds for the JPG\n\n For Turing &tm; or newer fully supported devices.\n\n @note On MIG-enabled GPUs, querying decoder utilization is not currently supported.\n\n @param device                               The identifier of the target device\n @param utilization                          Reference to an unsigned int for jpg utilization info\n @param samplingPeriodUs                     Reference to an unsigned int for the sampling period in US\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a utilization has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, \\a utilization is NULL, or \\a samplingPeriodUs is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetJpgUtilization(\n        device: cuda_types::nvml::nvmlDevice_t,\n        utilization: *mut ::core::ffi::c_uint,\n        samplingPeriodUs: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the current utilization and sampling size in microseconds for the OFA (Optical Flow Accelerator)\n\n For Turing &tm; or newer fully supported devices.\n\n @note On MIG-enabled GPUs, querying decoder utilization is not currently supported.\n\n @param device                               The identifier of the target device\n @param utilization                          Reference to an unsigned int for ofa utilization info\n @param samplingPeriodUs                     Reference to an unsigned int for the sampling period in US\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a utilization has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, \\a utilization is NULL, or \\a samplingPeriodUs is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetOfaUtilization(\n        device: cuda_types::nvml::nvmlDevice_t,\n        utilization: *mut ::core::ffi::c_uint,\n        samplingPeriodUs: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the active frame buffer capture sessions statistics for a given device.\n\n For Maxwell &tm; or newer fully supported devices.\n\n @param device                            The identifier of the target device\n @param fbcStats                          Reference to nvmlFBCStats_t structure containing NvFBC stats\n\n @return\n         - \\ref NVML_SUCCESS                  if \\a fbcStats is fetched\n         - \\ref NVML_ERROR_UNINITIALIZED      if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT   if \\a fbcStats is NULL\n         - \\ref NVML_ERROR_GPU_IS_LOST        if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN            on any unexpected error*/\n    fn nvmlDeviceGetFBCStats(\n        device: cuda_types::nvml::nvmlDevice_t,\n        fbcStats: *mut cuda_types::nvml::nvmlFBCStats_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves information about active frame buffer capture sessions on a target device.\n\n An array of active FBC sessions is returned in the caller-supplied buffer pointed at by \\a sessionInfo. The\n array element count is passed in \\a sessionCount, and \\a sessionCount is used to return the number of sessions\n written to the buffer.\n\n If the supplied buffer is not large enough to accommodate the active session array, the function returns\n NVML_ERROR_INSUFFICIENT_SIZE, with the element count of nvmlFBCSessionInfo_t array required in \\a sessionCount.\n To query the number of active FBC sessions, call this function with *sessionCount = 0.  The code will return\n NVML_SUCCESS with number of active FBC sessions updated in *sessionCount.\n\n For Maxwell &tm; or newer fully supported devices.\n\n @note hResolution, vResolution, averageFPS and averageLatency data for a FBC session returned in \\a sessionInfo may\n       be zero if there are no new frames captured since the session started.\n\n @param device                            The identifier of the target device\n @param sessionCount                      Reference to caller supplied array size, and returns the number of sessions.\n @param sessionInfo                       Reference in which to return the session information\n\n @return\n         - \\ref NVML_SUCCESS                  if \\a sessionInfo is fetched\n         - \\ref NVML_ERROR_UNINITIALIZED      if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE  if \\a sessionCount is too small, array element count is returned in \\a sessionCount\n         - \\ref NVML_ERROR_INVALID_ARGUMENT   if \\a sessionCount is NULL.\n         - \\ref NVML_ERROR_GPU_IS_LOST        if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN            on any unexpected error*/\n    fn nvmlDeviceGetFBCSessions(\n        device: cuda_types::nvml::nvmlDevice_t,\n        sessionCount: *mut ::core::ffi::c_uint,\n        sessionInfo: *mut cuda_types::nvml::nvmlFBCSessionInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the current and pending driver model for the device.\n\n For Kepler &tm; or newer fully supported devices.\n For windows only.\n\n On Windows platforms the device driver can run in either WDDM, MCDM or WDM (TCC) modes. If a display is attached\n to the device it must run in WDDM mode. MCDM mode is preferred if a display is not attached. TCC mode is deprecated.\n\n See \\ref nvmlDriverModel_t for details on available driver models.\n\n @param device                               The identifier of the target device\n @param current                              Reference in which to return the current driver model\n @param pending                              Reference in which to return the pending driver model\n\n @return\n         - \\ref NVML_SUCCESS                 if either \\a current and/or \\a pending have been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or both \\a current and \\a pending are NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the platform is not windows\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlDeviceSetDriverModel_v2()*/\n    fn nvmlDeviceGetDriverModel_v2(\n        device: cuda_types::nvml::nvmlDevice_t,\n        current: *mut cuda_types::nvml::nvmlDriverModel_t,\n        pending: *mut cuda_types::nvml::nvmlDriverModel_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get VBIOS version of the device.\n\n For all products.\n\n The VBIOS version may change from time to time. It will not exceed 32 characters in length\n (including the NULL terminator).  See \\ref nvmlConstants::NVML_DEVICE_VBIOS_VERSION_BUFFER_SIZE.\n\n @param device                               The identifier of the target device\n @param version                              Reference to which to return the VBIOS version\n @param length                               The maximum allowed length of the string returned in \\a version\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a version has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, or \\a version is NULL\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a length is too small\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetVbiosVersion(\n        device: cuda_types::nvml::nvmlDevice_t,\n        version: *mut ::core::ffi::c_char,\n        length: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get Bridge Chip Information for all the bridge chips on the board.\n\n For all fully supported products.\n Only applicable to multi-GPU products.\n\n @param device                                The identifier of the target device\n @param bridgeHierarchy                       Reference to the returned bridge chip Hierarchy\n\n @return\n         - \\ref NVML_SUCCESS                 if bridge chip exists\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, or \\a bridgeInfo is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if bridge chip not supported on the device\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n*/\n    fn nvmlDeviceGetBridgeChipInfo(\n        device: cuda_types::nvml::nvmlDevice_t,\n        bridgeHierarchy: *mut cuda_types::nvml::nvmlBridgeChipHierarchy_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get information about processes with a compute context on a device\n\n For Fermi &tm; or newer fully supported devices.\n\n This function returns information only about compute running processes (e.g. CUDA application which have\n active context). Any graphics applications (e.g. using OpenGL, DirectX) won't be listed by this function.\n\n To query the current number of running compute processes, call this function with *infoCount = 0. The\n return code will be NVML_ERROR_INSUFFICIENT_SIZE, or NVML_SUCCESS if none are running. For this call\n \\a infos is allowed to be NULL.\n\n The usedGpuMemory field returned is all of the memory used by the application.\n\n Keep in mind that information returned by this call is dynamic and the number of elements might change in\n time. Allocate more space for \\a infos table in case new compute processes are spawned.\n\n @note In MIG mode, if device handle is provided, the API returns aggregate information, only if\n       the caller has appropriate privileges. Per-instance information can be queried by using\n       specific MIG device handles.\n       Querying per-instance information using MIG device handles is not supported if the device is in vGPU Host virtualization mode.\n\n @param device                               The device handle or MIG device handle\n @param infoCount                            Reference in which to provide the \\a infos array size, and\n                                             to return the number of returned elements\n @param infos                                Reference in which to return the process information\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a infoCount and \\a infos have been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a infoCount indicates that the \\a infos array is too small\n                                             \\a infoCount will contain minimal amount of space necessary for\n                                             the call to complete\n         - \\ref NVML_ERROR_NO_PERMISSION     if the user doesn't have permission to perform this operation\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, either of \\a infoCount or \\a infos is NULL\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by \\a device\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see \\ref nvmlSystemGetProcessName*/\n    fn nvmlDeviceGetComputeRunningProcesses_v3(\n        device: cuda_types::nvml::nvmlDevice_t,\n        infoCount: *mut ::core::ffi::c_uint,\n        infos: *mut cuda_types::nvml::nvmlProcessInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get information about processes with a graphics context on a device\n\n For Kepler &tm; or newer fully supported devices.\n\n This function returns information only about graphics based processes\n (eg. applications using OpenGL, DirectX)\n\n To query the current number of running graphics processes, call this function with *infoCount = 0. The\n return code will be NVML_ERROR_INSUFFICIENT_SIZE, or NVML_SUCCESS if none are running. For this call\n \\a infos is allowed to be NULL.\n\n The usedGpuMemory field returned is all of the memory used by the application.\n\n Keep in mind that information returned by this call is dynamic and the number of elements might change in\n time. Allocate more space for \\a infos table in case new graphics processes are spawned.\n\n @note In MIG mode, if device handle is provided, the API returns aggregate information, only if\n       the caller has appropriate privileges. Per-instance information can be queried by using\n       specific MIG device handles.\n       Querying per-instance information using MIG device handles is not supported if the device is in vGPU Host virtualization mode.\n\n @param device                               The device handle or MIG device handle\n @param infoCount                            Reference in which to provide the \\a infos array size, and\n                                             to return the number of returned elements\n @param infos                                Reference in which to return the process information\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a infoCount and \\a infos have been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a infoCount indicates that the \\a infos array is too small\n                                             \\a infoCount will contain minimal amount of space necessary for\n                                             the call to complete\n         - \\ref NVML_ERROR_NO_PERMISSION     if the user doesn't have permission to perform this operation\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, either of \\a infoCount or \\a infos is NULL\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by \\a device\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see \\ref nvmlSystemGetProcessName*/\n    fn nvmlDeviceGetGraphicsRunningProcesses_v3(\n        device: cuda_types::nvml::nvmlDevice_t,\n        infoCount: *mut ::core::ffi::c_uint,\n        infos: *mut cuda_types::nvml::nvmlProcessInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get information about processes with a Multi-Process Service (MPS) compute context on a device\n\n For Volta &tm; or newer fully supported devices.\n\n This function returns information only about compute running processes (e.g. CUDA application which have\n active context) utilizing MPS. Any graphics applications (e.g. using OpenGL, DirectX) won't be listed by\n this function.\n\n To query the current number of running compute processes, call this function with *infoCount = 0. The\n return code will be NVML_ERROR_INSUFFICIENT_SIZE, or NVML_SUCCESS if none are running. For this call\n \\a infos is allowed to be NULL.\n\n The usedGpuMemory field returned is all of the memory used by the application.\n\n Keep in mind that information returned by this call is dynamic and the number of elements might change in\n time. Allocate more space for \\a infos table in case new compute processes are spawned.\n\n @note In MIG mode, if device handle is provided, the API returns aggregate information, only if\n       the caller has appropriate privileges. Per-instance information can be queried by using\n       specific MIG device handles.\n       Querying per-instance information using MIG device handles is not supported if the device is in vGPU Host virtualization mode.\n\n @param device                               The device handle or MIG device handle\n @param infoCount                            Reference in which to provide the \\a infos array size, and\n                                             to return the number of returned elements\n @param infos                                Reference in which to return the process information\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a infoCount and \\a infos have been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a infoCount indicates that the \\a infos array is too small\n                                             \\a infoCount will contain minimal amount of space necessary for\n                                             the call to complete\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, either of \\a infoCount or \\a infos is NULL\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by \\a device\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see \\ref nvmlSystemGetProcessName*/\n    fn nvmlDeviceGetMPSComputeRunningProcesses_v3(\n        device: cuda_types::nvml::nvmlDevice_t,\n        infoCount: *mut ::core::ffi::c_uint,\n        infos: *mut cuda_types::nvml::nvmlProcessInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get information about running processes on a device for input context\n\n For Hopper &tm; or newer fully supported devices.\n\n This function returns information only about running processes (e.g. CUDA application which have\n active context).\n\n To determine the size of the \\a plist->procArray array to allocate, call the function with\n \\a plist->numProcArrayEntries set to zero and \\a plist->procArray set to NULL. The return\n code will be either NVML_ERROR_INSUFFICIENT_SIZE (if there are valid processes of type\n \\a plist->mode to report on, in which case the \\a plist->numProcArrayEntries field will\n indicate the required number of entries in the array) or NVML_SUCCESS (if no processes of type\n \\a plist->mode exist).\n\n The usedGpuMemory field returned is all of the memory used by the application.\n The usedGpuCcProtectedMemory field returned is all of the protected memory used by the application.\n\n Keep in mind that information returned by this call is dynamic and the number of elements might change in\n time. Allocate more space for \\a plist->procArray table in case new processes are spawned.\n\n @note In MIG mode, if device handle is provided, the API returns aggregate information, only if\n       the caller has appropriate privileges. Per-instance information can be queried by using\n       specific MIG device handles.\n       Querying per-instance information using MIG device handles is not supported if the device is in\n       vGPU Host virtualization mode.\n       Protected memory usage is currently not available in MIG mode and in windows.\n\n @param device                               The device handle or MIG device handle\n @param plist                                Reference in which to process detail list\n \\a plist->version                       The api version\n \\a plist->mode                          The process mode\n \\a plist->procArray                     Reference in which to return the process information\n \\a plist->numProcArrayEntries           Proc array size of returned entries\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a plist->numprocArrayEntries and \\a plist->procArray have been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a plist->numprocArrayEntries indicates that the \\a plist->procArray is too small\n                                             \\a plist->numprocArrayEntries will contain minimal amount of space necessary for\n                                             the call to complete\n         - \\ref NVML_ERROR_NO_PERMISSION     if the user doesn't have permission to perform this operation\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, \\a plist is NULL, \\a plist->version is invalid,\n                                             \\a plist->mode is invalid,\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by \\a device\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n*/\n    fn nvmlDeviceGetRunningProcessDetailList(\n        device: cuda_types::nvml::nvmlDevice_t,\n        plist: *mut cuda_types::nvml::nvmlProcessDetailList_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Check if the GPU devices are on the same physical board.\n\n For all fully supported products.\n\n @param device1                               The first GPU device\n @param device2                               The second GPU device\n @param onSameBoard                           Reference in which to return the status.\n                                              Non-zero indicates that the GPUs are on the same board.\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a onSameBoard has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a dev1 or \\a dev2 are invalid or \\a onSameBoard is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this check is not supported by the device\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the either GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceOnSameBoard(\n        device1: cuda_types::nvml::nvmlDevice_t,\n        device2: cuda_types::nvml::nvmlDevice_t,\n        onSameBoard: *mut ::core::ffi::c_int,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the root/admin permissions on the target API. See \\a nvmlRestrictedAPI_t for the list of supported APIs.\n If an API is restricted only root users can call that API. See \\a nvmlDeviceSetAPIRestriction to change current permissions.\n\n For all fully supported products.\n\n @param device                               The identifier of the target device\n @param apiType                              Target API type for this operation\n @param isRestricted                         Reference in which to return the current restriction\n                                             NVML_FEATURE_ENABLED indicates that the API is root-only\n                                             NVML_FEATURE_DISABLED indicates that the API is accessible to all users\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a isRestricted has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, \\a apiType incorrect or \\a isRestricted is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by the device or the device does not support\n                                                 the feature that is being queried (E.G. Enabling/disabling Auto Boosted clocks is\n                                                 not supported by the device)\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlRestrictedAPI_t*/\n    fn nvmlDeviceGetAPIRestriction(\n        device: cuda_types::nvml::nvmlDevice_t,\n        apiType: cuda_types::nvml::nvmlRestrictedAPI_t,\n        isRestricted: *mut cuda_types::nvml::nvmlEnableState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Gets recent samples for the GPU.\n\n For Kepler &tm; or newer fully supported devices.\n\n Based on type, this method can be used to fetch the power, utilization or clock samples maintained in the buffer by\n the driver.\n\n Power, Utilization and Clock samples are returned as type \"unsigned int\" for the union nvmlValue_t.\n\n To get the size of samples that user needs to allocate, the method is invoked with samples set to NULL.\n The returned samplesCount will provide the number of samples that can be queried. The user needs to\n allocate the buffer with size as samplesCount * sizeof(nvmlSample_t).\n\n lastSeenTimeStamp represents CPU timestamp in microseconds. Set it to 0 to fetch all the samples maintained by the\n underlying buffer. Set lastSeenTimeStamp to one of the timeStamps retrieved from the date of the previous query\n to get more recent samples.\n\n This method fetches the number of entries which can be accommodated in the provided samples array, and the\n reference samplesCount is updated to indicate how many samples were actually retrieved. The advantage of using this\n method for samples in contrast to polling via existing methods is to get get higher frequency data at lower polling cost.\n\n @note On MIG-enabled GPUs, querying the following sample types, NVML_GPU_UTILIZATION_SAMPLES, NVML_MEMORY_UTILIZATION_SAMPLES\n       NVML_ENC_UTILIZATION_SAMPLES and NVML_DEC_UTILIZATION_SAMPLES, is not currently supported.\n\n @param device                        The identifier for the target device\n @param type                          Type of sampling event\n @param lastSeenTimeStamp             Return only samples with timestamp greater than lastSeenTimeStamp.\n @param sampleValType                 Output parameter to represent the type of sample value as described in nvmlSampleVal_t\n @param sampleCount                   Reference to provide the number of elements which can be queried in samples array\n @param samples                       Reference in which samples are returned\n\n @return\n         - \\ref NVML_SUCCESS                 if samples are successfully retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, \\a samplesCount is NULL or\n                                             reference to \\a sampleCount is 0 for non null \\a samples\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by the device\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_NOT_FOUND         if sample entries are not found\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetSamples(\n        device: cuda_types::nvml::nvmlDevice_t,\n        type_: cuda_types::nvml::nvmlSamplingType_t,\n        lastSeenTimeStamp: ::core::ffi::c_ulonglong,\n        sampleValType: *mut cuda_types::nvml::nvmlValueType_t,\n        sampleCount: *mut ::core::ffi::c_uint,\n        samples: *mut cuda_types::nvml::nvmlSample_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Gets Total, Available and Used size of BAR1 memory.\n\n BAR1 is used to map the FB (device memory) so that it can be directly accessed by the CPU or by 3rd party\n devices (peer-to-peer on the PCIE bus).\n\n @note In MIG mode, if device handle is provided, the API returns aggregate\n       information, only if the caller has appropriate privileges. Per-instance\n       information can be queried by using specific MIG device handles.\n\n For Kepler &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param bar1Memory                           Reference in which BAR1 memory\n                                             information is returned.\n\n @return\n         - \\ref NVML_SUCCESS                 if BAR1 memory is successfully retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, \\a bar1Memory is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by the device\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n*/\n    fn nvmlDeviceGetBAR1MemoryInfo(\n        device: cuda_types::nvml::nvmlDevice_t,\n        bar1Memory: *mut cuda_types::nvml::nvmlBAR1Memory_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** @deprecated Use \\ref nvmlDeviceGetFieldValues to query this data.\n This API will be removed in CUDA 14.0.\n\n Translations are as follows:\n\n\n NVML_PERF_POLICY_POWER             -> NVML_FI_DEV_CLOCKS_EVENT_REASON_SW_POWER_CAP\n NVML_PERF_POLICY_THERMAL           -> NVML_FI_DEV_CLOCKS_EVENT_REASON_SW_THERM_SLOWDOWN\n NVML_PERF_POLICY_SYNC_BOOST        -> NVML_FI_DEV_CLOCKS_EVENT_REASON_SYNC_BOOST\n NVML_PERF_POLICY_BOARD_LIMIT       -> NVML_FI_DEV_PERF_POLICY_BOARD_LIMIT\n NVML_PERF_POLICY_LOW_UTILIZATION   -> NVML_FI_DEV_PERF_POLICY_LOW_UTILIZATION\n NVML_PERF_POLICY_RELIABILITY       -> NVML_FI_DEV_PERF_POLICY_RELIABILITY\n NVML_PERF_POLICY_TOTAL_APP_CLOCKS  -> DEPRECATED, Do not use\n NVML_PERF_POLICY_TOTAL_BASE_CLOCKS -> NVML_FI_DEV_PERF_POLICY_TOTAL_BASE_CLOCKS*/\n    fn nvmlDeviceGetViolationStatus(\n        device: cuda_types::nvml::nvmlDevice_t,\n        perfPolicyType: cuda_types::nvml::nvmlPerfPolicyType_t,\n        violTime: *mut cuda_types::nvml::nvmlViolationTime_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Gets the device's interrupt number\n\n @param device                               The identifier of the target device\n @param irqNum                               The interrupt number associated with the specified device\n\n @return\n         - \\ref NVML_SUCCESS                 if irq number is successfully retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, or \\a irqNum is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by the device\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n*/\n    fn nvmlDeviceGetIrqNum(\n        device: cuda_types::nvml::nvmlDevice_t,\n        irqNum: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Gets the device's core count\n\n @note On MIG-enabled GPUs, querying the device's core count is currently not supported using this API.\n       Please use \\ref nvmlDeviceGetGpuInstanceProfileInfo to fetch the MIG device's core count.\n\n @param device                               The identifier of the target device\n @param numCores                             The number of cores for the specified device\n\n @return\n         - \\ref NVML_SUCCESS                 if GPU core count is successfully retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, or \\a numCores is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by the device or a mig device.\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n*/\n    fn nvmlDeviceGetNumGpuCores(\n        device: cuda_types::nvml::nvmlDevice_t,\n        numCores: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Gets the devices power source\n\n @param device                               The identifier of the target device\n @param powerSource                          The power source of the device\n\n @return\n         - \\ref NVML_SUCCESS                 if the current power source was successfully retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, or \\a powerSource is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by the device\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n*/\n    fn nvmlDeviceGetPowerSource(\n        device: cuda_types::nvml::nvmlDevice_t,\n        powerSource: *mut cuda_types::nvml::nvmlPowerSource_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Gets the device's memory bus width\n\n @param device                               The identifier of the target device\n @param busWidth                             The devices's memory bus width\n\n @return\n         - \\ref NVML_SUCCESS                 if the memory bus width is successfully retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, or \\a busWidth is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by the device\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n*/\n    fn nvmlDeviceGetMemoryBusWidth(\n        device: cuda_types::nvml::nvmlDevice_t,\n        busWidth: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Gets the device's PCIE Max Link speed in MBPS\n\n @param device                               The identifier of the target device\n @param maxSpeed                             The devices's PCIE Max Link speed in MBPS\n\n @return\n         - \\ref NVML_SUCCESS                 if PCIe Max Link Speed is successfully retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, or \\a maxSpeed is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by the device\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n*/\n    fn nvmlDeviceGetPcieLinkMaxSpeed(\n        device: cuda_types::nvml::nvmlDevice_t,\n        maxSpeed: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Gets the device's PCIe Link speed in Mbps\n\n @param device                               The identifier of the target device\n @param pcieSpeed                            The devices's PCIe Max Link speed in Mbps\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a pcieSpeed has been retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a pcieSpeed is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support PCIe speed getting\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetPcieSpeed(\n        device: cuda_types::nvml::nvmlDevice_t,\n        pcieSpeed: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Gets the device's Adaptive Clock status\n\n @param device                               The identifier of the target device\n @param adaptiveClockStatus                  The current adaptive clocking status, either\n                                             NVML_ADAPTIVE_CLOCKING_INFO_STATUS_DISABLED\n                                             or NVML_ADAPTIVE_CLOCKING_INFO_STATUS_ENABLED\n\n @return\n         - \\ref NVML_SUCCESS                 if the current adaptive clocking status is successfully retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, or \\a adaptiveClockStatus is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by the device\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n*/\n    fn nvmlDeviceGetAdaptiveClockInfoStatus(\n        device: cuda_types::nvml::nvmlDevice_t,\n        adaptiveClockStatus: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get the type of the GPU Bus (PCIe, PCI, ...)\n\n @param device                               The identifier of the target device\n @param type                                 The PCI Bus type\n\n return\n         - \\ref NVML_SUCCESS                 if the bus \\a type is successfully retreived\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a type is NULL\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetBusType(\n        device: cuda_types::nvml::nvmlDevice_t,\n        type_: *mut cuda_types::nvml::nvmlBusType_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** @deprecated Will be deprecated in a future release. Use \\ref nvmlDeviceGetGpuFabricInfoV instead\n\n Get fabric information associated with the device.\n\n For Hopper &tm; or newer fully supported devices.\n\n On Hopper + NVSwitch systems, GPU is registered with the NVIDIA Fabric Manager\n Upon successful registration, the GPU is added to the NVLink fabric to enable\n peer-to-peer communication.\n This API reports the current state of the GPU in the NVLink fabric\n along with other useful information.\n\n\n @param device                               The identifier of the target device\n @param gpuFabricInfo                        Information about GPU fabric state\n\n @return\n         - \\ref NVML_SUCCESS                 Upon success\n         - \\ref NVML_ERROR_NOT_SUPPORTED     If \\a device doesn't support gpu fabric*/\n    fn nvmlDeviceGetGpuFabricInfo(\n        device: cuda_types::nvml::nvmlDevice_t,\n        gpuFabricInfo: *mut cuda_types::nvml::nvmlGpuFabricInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Versioned wrapper around \\ref nvmlDeviceGetGpuFabricInfo that accepts a versioned\n \\ref nvmlGpuFabricInfo_v2_t or later output structure.\n\n @note The caller must set the \\ref nvmlGpuFabricInfoV_t.version field to the\n appropriate version prior to calling this function. For example:\n \\code\n     nvmlGpuFabricInfoV_t fabricInfo =\n         { .version = nvmlGpuFabricInfo_v2 };\n     nvmlReturn_t result = nvmlDeviceGetGpuFabricInfoV(device,&fabricInfo);\n \\endcode\n\n For Hopper &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param gpuFabricInfo                        Information about GPU fabric state\n\n @return\n         - \\ref NVML_SUCCESS                 Upon success\n         - \\ref NVML_ERROR_NOT_SUPPORTED     If \\a device doesn't support gpu fabric*/\n    fn nvmlDeviceGetGpuFabricInfoV(\n        device: cuda_types::nvml::nvmlDevice_t,\n        gpuFabricInfo: *mut cuda_types::nvml::nvmlGpuFabricInfoV_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get Conf Computing System capabilities.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux, Windows TCC.\n\n @param capabilities                         System CC capabilities\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a capabilities were successfully queried\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a capabilities is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by the device*/\n    fn nvmlSystemGetConfComputeCapabilities(\n        capabilities: *mut cuda_types::nvml::nvmlConfComputeSystemCaps_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get Conf Computing System State.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux, Windows TCC.\n\n @param state                                System CC State\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a state were successfully queried\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a state is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by the device*/\n    fn nvmlSystemGetConfComputeState(\n        state: *mut cuda_types::nvml::nvmlConfComputeSystemState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get Conf Computing Protected and Unprotected Memory Sizes.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux, Windows TCC.\n\n @param device                               Device handle\n @param memInfo                              Protected/Unprotected Memory sizes\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a memInfo were successfully queried\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a memInfo or \\a device is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by the device*/\n    fn nvmlDeviceGetConfComputeMemSizeInfo(\n        device: cuda_types::nvml::nvmlDevice_t,\n        memInfo: *mut cuda_types::nvml::nvmlConfComputeMemSizeInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get Conf Computing GPUs ready state.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux, Windows TCC.\n\n @param isAcceptingWork                      Returns GPU current work accepting state,\n                                             NVML_CC_ACCEPTING_CLIENT_REQUESTS_TRUE or\n                                             NVML_CC_ACCEPTING_CLIENT_REQUESTS_FALSE\n\n return\n         - \\ref NVML_SUCCESS                 if \\a current GPUs ready state were successfully queried\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a isAcceptingWork is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by the device*/\n    fn nvmlSystemGetConfComputeGpusReadyState(\n        isAcceptingWork: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get Conf Computing protected memory usage.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux, Windows TCC.\n\n @param device                               The identifier of the target device\n @param memory                               Reference in which to return the memory information\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a memory has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a memory is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by the device\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetConfComputeProtectedMemoryUsage(\n        device: cuda_types::nvml::nvmlDevice_t,\n        memory: *mut cuda_types::nvml::nvmlMemory_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get Conf Computing GPU certificate details.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux, Windows TCC.\n\n @param device                               The identifier of the target device\n @param gpuCert                              Reference in which to return the gpu certificate information\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a gpu certificate info has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a memory is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by the device\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetConfComputeGpuCertificate(\n        device: cuda_types::nvml::nvmlDevice_t,\n        gpuCert: *mut cuda_types::nvml::nvmlConfComputeGpuCertificate_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get Conf Computing GPU attestation report.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux, Windows TCC.\n\n @param device                               The identifier of the target device\n @param gpuAtstReport                        Reference in which to return the gpu attestation report\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a gpu attestation report has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a memory is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by the device\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetConfComputeGpuAttestationReport(\n        device: cuda_types::nvml::nvmlDevice_t,\n        gpuAtstReport: *mut cuda_types::nvml::nvmlConfComputeGpuAttestationReport_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get Conf Computing key rotation threshold detail.\n\n For Hopper &tm; or newer fully supported devices.\n Supported on Linux, Windows TCC.\n\n @param pKeyRotationThrInfo                  Reference in which to return the key rotation threshold data\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a gpu key rotation threshold info has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a memory is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by the device\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlSystemGetConfComputeKeyRotationThresholdInfo(\n        pKeyRotationThrInfo: *mut cuda_types::nvml::nvmlConfComputeGetKeyRotationThresholdInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Set Conf Computing Unprotected Memory Size.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux, Windows TCC.\n\n @param device                               Device Handle\n @param sizeKiB                              Unprotected Memory size to be set in KiB\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a sizeKiB successfully set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by the device*/\n    fn nvmlDeviceSetConfComputeUnprotectedMemSize(\n        device: cuda_types::nvml::nvmlDevice_t,\n        sizeKiB: ::core::ffi::c_ulonglong,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Set Conf Computing GPUs ready state.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux, Windows TCC.\n\n @param isAcceptingWork                      GPU accepting new work, NVML_CC_ACCEPTING_CLIENT_REQUESTS_TRUE or\n                                             NVML_CC_ACCEPTING_CLIENT_REQUESTS_FALSE\n\n return\n         - \\ref NVML_SUCCESS                 if \\a current GPUs ready state is successfully set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a isAcceptingWork is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by the device*/\n    fn nvmlSystemSetConfComputeGpusReadyState(\n        isAcceptingWork: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Set Conf Computing key rotation threshold.\n\n For Hopper &tm; or newer fully supported devices.\n Supported on Linux, Windows TCC.\n\n This function is to set the confidential compute key rotation threshold parameters.\n \\a pKeyRotationThrInfo->maxAttackerAdvantage should be in the range from\n NVML_CC_KEY_ROTATION_THRESHOLD_ATTACKER_ADVANTAGE_MIN to NVML_CC_KEY_ROTATION_THRESHOLD_ATTACKER_ADVANTAGE_MAX.\n Default value is 60.\n\n @param pKeyRotationThrInfo                  Reference to the key rotation threshold data\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a key rotation threashold max attacker advantage has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a memory is NULL\n         - \\ref NVML_ERROR_INVALID_STATE     if confidential compute GPU ready state is enabled\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by the device\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlSystemSetConfComputeKeyRotationThresholdInfo(\n        pKeyRotationThrInfo: *mut cuda_types::nvml::nvmlConfComputeSetKeyRotationThresholdInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get Conf Computing System Settings.\n\n For Hopper &tm; or newer fully supported devices.\n Supported on Linux, Windows TCC.\n\n @param settings                                     System CC settings\n\n @return\n         - \\ref NVML_SUCCESS                         If the query is success\n         - \\ref NVML_ERROR_UNINITIALIZED             If the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT          If \\a device is invalid or \\a counters is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED             If the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST               If the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH If the provided version is invalid/unsupported\n         - \\ref NVML_ERROR_UNKNOWN                   On any unexpected error*/\n    fn nvmlSystemGetConfComputeSettings(\n        settings: *mut cuda_types::nvml::nvmlSystemConfComputeSettings_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve GSP firmware version.\n\n The caller passes in buffer via \\a version and corresponding GSP firmware numbered version\n is returned with the same parameter in string format.\n\n @param device                               Device handle\n @param version                              The retrieved GSP firmware version\n\n @return\n         - \\ref NVML_SUCCESS                 if GSP firmware version is sucessfully retrieved\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or GSP \\a version pointer is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if GSP firmware is not enabled for GPU\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetGspFirmwareVersion(\n        device: cuda_types::nvml::nvmlDevice_t,\n        version: *mut ::core::ffi::c_char,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve GSP firmware mode.\n\n The caller passes in integer pointers. GSP firmware enablement and default mode information is returned with\n corresponding parameters. The return value in \\a isEnabled and \\a defaultMode should be treated as boolean.\n\n @param device                               Device handle\n @param isEnabled                            Pointer to specify if GSP firmware is enabled\n @param defaultMode                          Pointer to specify if GSP firmware is supported by default on \\a device\n\n @return\n         - \\ref NVML_SUCCESS                 if GSP firmware mode is sucessfully retrieved\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or any of \\a isEnabled or \\a defaultMode is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if GSP firmware is not enabled for GPU\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetGspFirmwareMode(\n        device: cuda_types::nvml::nvmlDevice_t,\n        isEnabled: *mut ::core::ffi::c_uint,\n        defaultMode: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get SRAM ECC error status of this device.\n\n For Ampere &tm; or newer fully supported devices.\n Requires root/admin permissions.\n\n See \\ref nvmlEccSramErrorStatus_v1_t for more information on the struct.\n\n @param device                               The identifier of the target device\n @param status                               Returns SRAM ECC error status\n\n @return\n         - \\ref NVML_SUCCESS                          If \\a limit has been set\n         - \\ref NVML_ERROR_UNINITIALIZED              If the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT           If \\a device is invalid or \\a counters is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED              If the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST                If the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH  If the version of \\a nvmlEccSramErrorStatus_t is invalid\n         - \\ref NVML_ERROR_UNKNOWN                    On any unexpected error*/\n    fn nvmlDeviceGetSramEccErrorStatus(\n        device: cuda_types::nvml::nvmlDevice_t,\n        status: *mut cuda_types::nvml::nvmlEccSramErrorStatus_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Set new power limit of this device.\n\n For Kepler &tm; or newer fully supported devices.\n Requires root/admin permissions.\n\n See \\ref nvmlDeviceGetPowerManagementLimitConstraints to check the allowed ranges of values.\n\n See \\ref nvmlPowerValue_v2_t for more information on the struct.\n\n \\note Limit is not persistent across reboots or driver unloads.\n Enable persistent mode to prevent driver from unloading when no application is using the device.\n\n This API replaces nvmlDeviceSetPowerManagementLimit. It can be used as a drop-in replacement for the older version.\n\n @param device                               The identifier of the target device\n @param powerValue                           Power management limit in milliwatts to set\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a limit has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a powerValue is NULL or contains invalid values\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see NVML_FI_DEV_POWER_AVERAGE\n @see NVML_FI_DEV_POWER_INSTANT\n @see NVML_FI_DEV_POWER_MIN_LIMIT\n @see NVML_FI_DEV_POWER_MAX_LIMIT\n @see NVML_FI_DEV_POWER_CURRENT_LIMIT*/\n    fn nvmlDeviceSetPowerManagementLimit_v2(\n        device: cuda_types::nvml::nvmlDevice_t,\n        powerValue: *mut cuda_types::nvml::nvmlPowerValue_v2_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Queries the state of per process accounting mode.\n\n For Kepler &tm; or newer fully supported devices.\n\n See \\ref nvmlDeviceGetAccountingStats for more details.\n See \\ref nvmlDeviceSetAccountingMode\n\n @param device                               The identifier of the target device\n @param mode                                 Reference in which to return the current accounting mode\n\n @return\n         - \\ref NVML_SUCCESS                 if the mode has been successfully retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a mode are NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device doesn't support this feature\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetAccountingMode(\n        device: cuda_types::nvml::nvmlDevice_t,\n        mode: *mut cuda_types::nvml::nvmlEnableState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Queries process's accounting stats.\n\n For Kepler &tm; or newer fully supported devices.\n\n Accounting stats capture GPU utilization and other statistics across the lifetime of a process.\n Accounting stats can be queried during life time of the process and after its termination.\n The time field in \\ref nvmlAccountingStats_t is reported as 0 during the lifetime of the process and\n updated to actual running time after its termination.\n Accounting stats are kept in a circular buffer, newly created processes overwrite information about old\n processes.\n\n See \\ref nvmlAccountingStats_t for description of each returned metric.\n List of processes that can be queried can be retrieved from \\ref nvmlDeviceGetAccountingPids.\n\n @note Accounting Mode needs to be on. See \\ref nvmlDeviceGetAccountingMode.\n @note Only compute and graphics applications stats can be queried. Monitoring applications stats can't be\n         queried since they don't contribute to GPU utilization.\n @note In case of pid collision stats of only the latest process (that terminated last) will be reported\n\n @warning On Kepler devices per process statistics are accurate only if there's one process running on a GPU.\n\n @param device                               The identifier of the target device\n @param pid                                  Process Id of the target process to query stats for\n @param stats                                Reference in which to return the process's accounting stats\n\n @return\n         - \\ref NVML_SUCCESS                 if stats have been successfully retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a stats are NULL\n         - \\ref NVML_ERROR_NOT_FOUND         if process stats were not found\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if \\a device doesn't support this feature or accounting mode is disabled\n                                              or on vGPU host.\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlDeviceGetAccountingBufferSize*/\n    fn nvmlDeviceGetAccountingStats(\n        device: cuda_types::nvml::nvmlDevice_t,\n        pid: ::core::ffi::c_uint,\n        stats: *mut cuda_types::nvml::nvmlAccountingStats_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Queries list of processes that can be queried for accounting stats. The list of processes returned\n can be in running or terminated state.\n\n For Kepler &tm; or newer fully supported devices.\n\n To query the number of processes under Accounting Mode, call this function with *count = 0 and pids=NULL.\n The return code will be NVML_ERROR_INSUFFICIENT_SIZE with an updated count value indicating the number of processes.\n\n For more details see \\ref nvmlDeviceGetAccountingStats.\n\n @note In case of PID collision some processes might not be accessible before the circular buffer is full.\n\n @param device                               The identifier of the target device\n @param count                                Reference in which to provide the \\a pids array size, and\n                                               to return the number of elements ready to be queried\n @param pids                                 Reference in which to return list of process ids\n\n @return\n         - \\ref NVML_SUCCESS                 if pids were successfully retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a count is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if \\a device doesn't support this feature or accounting mode is disabled\n                                              or on vGPU host.\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a count is too small (\\a count is set to\n                                                 expected value)\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlDeviceGetAccountingBufferSize*/\n    fn nvmlDeviceGetAccountingPids(\n        device: cuda_types::nvml::nvmlDevice_t,\n        count: *mut ::core::ffi::c_uint,\n        pids: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Returns the number of processes that the circular buffer with accounting pids can hold.\n\n For Kepler &tm; or newer fully supported devices.\n\n This is the maximum number of processes that accounting information will be stored for before information\n about oldest processes will get overwritten by information about new processes.\n\n @param device                               The identifier of the target device\n @param bufferSize                           Reference in which to provide the size (in number of elements)\n                                               of the circular buffer for accounting stats.\n\n @return\n         - \\ref NVML_SUCCESS                 if buffer size was successfully retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a bufferSize is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device doesn't support this feature or accounting mode is disabled\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlDeviceGetAccountingStats\n @see nvmlDeviceGetAccountingPids*/\n    fn nvmlDeviceGetAccountingBufferSize(\n        device: cuda_types::nvml::nvmlDevice_t,\n        bufferSize: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Returns the list of retired pages by source, including pages that are pending retirement\n The address information provided from this API is the hardware address of the page that was retired.  Note\n that this does not match the virtual address used in CUDA, but will match the address information in Xid 63\n\n For Kepler &tm; or newer fully supported devices.\n\n @param device                            The identifier of the target device\n @param cause                             Filter page addresses by cause of retirement\n @param pageCount                         Reference in which to provide the \\a addresses buffer size, and\n                                          to return the number of retired pages that match \\a cause\n                                          Set to 0 to query the size without allocating an \\a addresses buffer\n @param addresses                         Buffer to write the page addresses into\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a pageCount was populated and \\a addresses was filled\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a pageCount indicates the buffer is not large enough to store all the\n                                             matching page addresses.  \\a pageCount is set to the needed size.\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, \\a pageCount is NULL, \\a cause is invalid, or\n                                             \\a addresses is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device doesn't support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetRetiredPages(\n        device: cuda_types::nvml::nvmlDevice_t,\n        cause: cuda_types::nvml::nvmlPageRetirementCause_t,\n        pageCount: *mut ::core::ffi::c_uint,\n        addresses: *mut ::core::ffi::c_ulonglong,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Returns the list of retired pages by source, including pages that are pending retirement\n The address information provided from this API is the hardware address of the page that was retired.  Note\n that this does not match the virtual address used in CUDA, but will match the address information in Xid 63\n\n \\note nvmlDeviceGetRetiredPages_v2 adds an additional timestamps parameter to return the time of each page's\n       retirement. This is supported for Pascal and newer architecture.\n\n For Kepler &tm; or newer fully supported devices.\n\n @param device                            The identifier of the target device\n @param cause                             Filter page addresses by cause of retirement\n @param pageCount                         Reference in which to provide the \\a addresses buffer size, and\n                                          to return the number of retired pages that match \\a cause\n                                          Set to 0 to query the size without allocating an \\a addresses buffer\n @param addresses                         Buffer to write the page addresses into\n @param timestamps                        Buffer to write the timestamps of page retirement, additional for _v2\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a pageCount was populated and \\a addresses was filled\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a pageCount indicates the buffer is not large enough to store all the\n                                             matching page addresses.  \\a pageCount is set to the needed size.\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, \\a pageCount is NULL, \\a cause is invalid, or\n                                             \\a addresses is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device doesn't support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetRetiredPages_v2(\n        device: cuda_types::nvml::nvmlDevice_t,\n        cause: cuda_types::nvml::nvmlPageRetirementCause_t,\n        pageCount: *mut ::core::ffi::c_uint,\n        addresses: *mut ::core::ffi::c_ulonglong,\n        timestamps: *mut ::core::ffi::c_ulonglong,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Check if any pages are pending retirement and need a reboot to fully retire.\n\n For Kepler &tm; or newer fully supported devices.\n\n @param device                            The identifier of the target device\n @param isPending                         Reference in which to return the pending status\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a isPending was populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a isPending is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device doesn't support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetRetiredPagesPendingStatus(\n        device: cuda_types::nvml::nvmlDevice_t,\n        isPending: *mut cuda_types::nvml::nvmlEnableState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get number of remapped rows. The number of rows reported will be based on\n the cause of the remapping. isPending indicates whether or not there are\n pending remappings. A reset will be required to actually remap the row.\n failureOccurred will be set if a row remapping ever failed in the past. A\n pending remapping won't affect future work on the GPU since\n error-containment and dynamic page blacklisting will take care of that.\n\n @note On MIG-enabled GPUs with active instances, querying the number of\n remapped rows is not supported\n\n For Ampere &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param corrRows                             Reference for number of rows remapped due to correctable errors\n @param uncRows                              Reference for number of rows remapped due to uncorrectable errors\n @param isPending                            Reference for whether or not remappings are pending\n @param failureOccurred                      Reference that is set when a remapping has failed in the past\n\n @return\n         - \\ref NVML_SUCCESS                 Upon success\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  If \\a corrRows, \\a uncRows, \\a isPending or \\a failureOccurred is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     If MIG is enabled or if the device doesn't support this feature\n         - \\ref NVML_ERROR_UNKNOWN           Unexpected error*/\n    fn nvmlDeviceGetRemappedRows(\n        device: cuda_types::nvml::nvmlDevice_t,\n        corrRows: *mut ::core::ffi::c_uint,\n        uncRows: *mut ::core::ffi::c_uint,\n        isPending: *mut ::core::ffi::c_uint,\n        failureOccurred: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get the row remapper histogram. Returns the remap availability for each bank\n on the GPU.\n\n @param device                               Device handle\n @param values                               Histogram values\n\n @return\n        - \\ref NVML_SUCCESS                  On success\n        - \\ref NVML_ERROR_UNKNOWN            On any unexpected error*/\n    fn nvmlDeviceGetRowRemapperHistogram(\n        device: cuda_types::nvml::nvmlDevice_t,\n        values: *mut cuda_types::nvml::nvmlRowRemapperHistogramValues_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get architecture for device\n\n @param device                               The identifier of the target device\n @param arch                                 Reference where architecture is returned, if call successful.\n                                             Set to NVML_DEVICE_ARCH_* upon success\n\n @return\n         - \\ref NVML_SUCCESS                 Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED     If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  If \\a device or \\a arch (output refererence) are invalid*/\n    fn nvmlDeviceGetArchitecture(\n        device: cuda_types::nvml::nvmlDevice_t,\n        arch: *mut cuda_types::nvml::nvmlDeviceArchitecture_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the frequency monitor fault status for the device.\n\n For Ampere &tm; or newer fully supported devices.\n Requires root user.\n\n See \\ref nvmlClkMonStatus_t for details on decoding the status output.\n\n @param device                               The identifier of the target device\n @param status                               Reference in which to return the clkmon fault status\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a status has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a status is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlDeviceGetClkMonStatus()*/\n    fn nvmlDeviceGetClkMonStatus(\n        device: cuda_types::nvml::nvmlDevice_t,\n        status: *mut cuda_types::nvml::nvmlClkMonStatus_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the current utilization and process ID\n\n For Maxwell &tm; or newer fully supported devices.\n\n Reads recent utilization of GPU SM (3D/Compute), framebuffer, video encoder, and video decoder for processes running.\n Utilization values are returned as an array of utilization sample structures in the caller-supplied buffer pointed at\n by \\a utilization. One utilization sample structure is returned per process running, that had some non-zero utilization\n during the last sample period. It includes the CPU timestamp at which  the samples were recorded. Individual utilization values\n are returned as \"unsigned int\" values. If no valid sample entries are found since the lastSeenTimeStamp, NVML_ERROR_NOT_FOUND\n is returned.\n\n To read utilization values, first determine the size of buffer required to hold the samples by invoking the function with\n \\a utilization set to NULL. The caller should allocate a buffer of size\n processSamplesCount * sizeof(nvmlProcessUtilizationSample_t). Invoke the function again with the allocated buffer passed\n in \\a utilization, and \\a processSamplesCount set to the number of entries the buffer is sized for.\n\n On successful return, the function updates \\a processSamplesCount with the number of process utilization sample\n structures that were actually written. This may differ from a previously read value as instances are created or\n destroyed.\n\n lastSeenTimeStamp represents the CPU timestamp in microseconds at which utilization samples were last read. Set it to 0\n to read utilization based on all the samples maintained by the driver's internal sample buffer. Set lastSeenTimeStamp\n to a timeStamp retrieved from a previous query to read utilization since the previous query.\n\n @note On MIG-enabled GPUs, querying process utilization is not currently supported.\n\n @param device                    The identifier of the target device\n @param utilization               Pointer to caller-supplied buffer in which guest process utilization samples are returned\n @param processSamplesCount       Pointer to caller-supplied array size, and returns number of processes running\n @param lastSeenTimeStamp         Return only samples with timestamp greater than lastSeenTimeStamp.\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a utilization has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, \\a utilization is NULL, or \\a samplingPeriodUs is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_NOT_FOUND         if sample entries are not found\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetProcessUtilization(\n        device: cuda_types::nvml::nvmlDevice_t,\n        utilization: *mut cuda_types::nvml::nvmlProcessUtilizationSample_t,\n        processSamplesCount: *mut ::core::ffi::c_uint,\n        lastSeenTimeStamp: ::core::ffi::c_ulonglong,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the recent utilization and process ID for all running processes\n\n For Maxwell &tm; or newer fully supported devices.\n\n Reads recent utilization of GPU SM (3D/Compute), framebuffer, video encoder, and video decoder, jpeg decoder, OFA (Optical Flow Accelerator)\n for all running processes. Utilization values are returned as an array of utilization sample structures in the caller-supplied buffer pointed at\n by \\a procesesUtilInfo->procUtilArray. One utilization sample structure is returned per process running, that had some non-zero utilization\n during the last sample period. It includes the CPU timestamp at which  the samples were recorded. Individual utilization values\n are returned as \"unsigned int\" values.\n\n The caller should allocate a buffer of size processSamplesCount * sizeof(nvmlProcessUtilizationInfo_t). If the buffer is too small, the API will\n return \\a NVML_ERROR_INSUFFICIENT_SIZE, with the recommended minimal buffer size at \\a procesesUtilInfo->processSamplesCount. The caller should\n invoke the function again with the allocated buffer passed in \\a procesesUtilInfo->procUtilArray, and \\a procesesUtilInfo->processSamplesCount\n set to the number no less than the recommended value by the previous API return.\n\n On successful return, the function updates \\a procesesUtilInfo->processSamplesCount with the number of process utilization info structures\n that were actually written. This may differ from a previously read value as instances are created or destroyed.\n\n \\a procesesUtilInfo->lastSeenTimeStamp represents the CPU timestamp in microseconds at which utilization samples were last read. Set it to 0\n to read utilization based on all the samples maintained by the driver's internal sample buffer. Set \\a procesesUtilInfo->lastSeenTimeStamp\n to a timeStamp retrieved from a previous query to read utilization since the previous query.\n\n \\a procesesUtilInfo->version is the version number of the structure nvmlProcessesUtilizationInfo_t, the caller should set the correct version\n number to retrieve the specific version of processes utilization information.\n\n @note On MIG-enabled GPUs, querying process utilization is not currently supported.\n\n @param device                    The identifier of the target device\n @param procesesUtilInfo          Pointer to the caller-provided structure of nvmlProcessesUtilizationInfo_t.\n\n @return\n         - \\ref NVML_SUCCESS                          If \\a procesesUtilInfo->procUtilArray has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED              If the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT           If \\a device is invalid, or \\a procesesUtilInfo is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED              If the device does not support this feature\n         - \\ref NVML_ERROR_NOT_FOUND                  If sample entries are not found\n         - \\ref NVML_ERROR_GPU_IS_LOST                If the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH  If the version of \\a procesesUtilInfo is invalid\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE          If \\a procesesUtilInfo->procUtilArray is NULL, or the buffer size of procesesUtilInfo->procUtilArray is too small.\n                                                      The caller should check the minimul array size from the returned procesesUtilInfo->processSamplesCount, and call\n                                                      the function again with a buffer no smaller than procesesUtilInfo->processSamplesCount * sizeof(nvmlProcessUtilizationInfo_t)\n         - \\ref NVML_ERROR_UNKNOWN                    On any unexpected error*/\n    fn nvmlDeviceGetProcessesUtilizationInfo(\n        device: cuda_types::nvml::nvmlDevice_t,\n        procesesUtilInfo: *mut cuda_types::nvml::nvmlProcessesUtilizationInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get platform information of this device.\n\n For Blackwell &tm; or newer fully supported devices.\n\n See \\ref nvmlPlatformInfo_v2_t for more information on the struct.\n\n @param device                               The identifier of the target device\n @param platformInfo                         Pointer to the caller-provided structure of nvmlPlatformInfo_t.\n\n @return\n         - \\ref NVML_SUCCESS                          If \\a platformInfo has been retrieved\n         - \\ref NVML_ERROR_INVALID_ARGUMENT           If \\a device is invalid or \\a platformInfo is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED              If the device does not support this feature\n         - \\ref NVML_ERROR_MEMORY                     if system memory is insufficient\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH  If the version of \\a nvmlPlatformInfo_t is invalid\n         - \\ref NVML_ERROR_UNKNOWN                    On any unexpected error*/\n    fn nvmlDeviceGetPlatformInfo(\n        device: cuda_types::nvml::nvmlDevice_t,\n        platformInfo: *mut cuda_types::nvml::nvmlPlatformInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the Per Device Identifier (PDI) associated with this device.\n\n For Pascal &tm; or newer fully supported devices.\n\n See \\ref nvmlPdi_v1_t for more information on the struct.\n\n @param[in]  device                              The identifier of the target device\n @param[out] pdi                                 Reference to the caller-provided structure to return the GPU PDI\n\n @return\n         - \\ref NVML_SUCCESS                          if \\a pdi has been set\n         - \\ref NVML_ERROR_UNINITIALIZED              if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT           if \\a device is invalid, or \\a pdi is NULL\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH  if the version is invalid/unsupported\n         - \\ref NVML_ERROR_NOT_SUPPORTED              if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST                if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN                    on any unexpected error*/\n    fn nvmlDeviceGetPdi(\n        device: cuda_types::nvml::nvmlDevice_t,\n        pdi: *mut cuda_types::nvml::nvmlPdi_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Set the hostname for the device.\n\n For Blackwell &tm; or newer fully supported devices.\n Requires root/admin permissions.\n Supported on Linux only.\n\n Sets a hostname string for the GPU device. This operation takes effect immediately.\n\n The hostname is not stored persistently across GPU resets or driver reloads.\n\n @param device                               The identifier of the target device\n @param hostname                             Reference to the caller-provided \\ref nvmlHostname_v1_t struct containing the hostname\n\n @return\n         - \\ref NVML_SUCCESS                          if the hostname was set successfully\n         - \\ref NVML_ERROR_UNINITIALIZED              if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT           if \\a device is invalid or \\a hostname is NULL or contains invalid characters\n         - \\ref NVML_ERROR_NOT_SUPPORTED              if the device does not support this feature\n         - \\ref NVML_ERROR_NO_PERMISSION              if the user doesn't have permission to perform this operation\n         - \\ref NVML_ERROR_GPU_IS_LOST                if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN                    on any unexpected error\n\n @see nvmlDeviceGetHostname_v1()*/\n    fn nvmlDeviceSetHostname_v1(\n        device: cuda_types::nvml::nvmlDevice_t,\n        hostname: *mut cuda_types::nvml::nvmlHostname_v1_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get the hostname for the device.\n\n For Blackwell &tm; or newer fully supported devices.\n Supported on Linux only.\n\n Retrieves the hostname string for the GPU device that was set using \\ref nvmlDeviceSetHostname_v1().\n\n @param device                               The identifier of the target device\n @param hostname                             Reference to the caller-provided \\ref nvmlHostname_v1_t struct to return the hostname\n\n @return\n         - \\ref NVML_SUCCESS                          if the hostname was retrieved successfully\n         - \\ref NVML_ERROR_UNINITIALIZED              if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT           if \\a device is invalid or \\a hostname is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED              if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST                if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN                    on any unexpected error\n\n @see nvmlDeviceSetHostname_v1()*/\n    fn nvmlDeviceGetHostname_v1(\n        device: cuda_types::nvml::nvmlDevice_t,\n        hostname: *mut cuda_types::nvml::nvmlHostname_v1_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Set the LED state for the unit. The LED can be either green (0) or amber (1).\n\n For S-class products.\n Requires root/admin permissions.\n\n This operation takes effect immediately.\n\n\n <b>Current S-Class products don't provide unique LEDs for each unit. As such, both front\n and back LEDs will be toggled in unison regardless of which unit is specified with this command.</b>\n\n See \\ref nvmlLedColor_t for available colors.\n\n @param unit                                 The identifier of the target unit\n @param color                                The target LED color\n\n @return\n         - \\ref NVML_SUCCESS                 if the LED color has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a unit or \\a color is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this is not an S-class product\n         - \\ref NVML_ERROR_NO_PERMISSION     if the user doesn't have permission to perform this operation\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlUnitGetLedState()*/\n    fn nvmlUnitSetLedState(\n        unit: cuda_types::nvml::nvmlUnit_t,\n        color: cuda_types::nvml::nvmlLedColor_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Set the persistence mode for the device.\n\n For all products.\n For Linux only.\n Requires root/admin permissions.\n\n The persistence mode determines whether the GPU driver software is torn down after the last client\n exits.\n\n This operation takes effect immediately. It is not persistent across reboots. After each reboot the\n persistence mode is reset to \"Disabled\".\n\n See \\ref nvmlEnableState_t for available modes.\n\n After calling this API with mode set to NVML_FEATURE_DISABLED on a device that has its own NUMA\n memory, the given device handle will no longer be valid, and to continue to interact with this\n device, a new handle should be obtained from one of the nvmlDeviceGetHandleBy*() APIs. This\n limitation is currently only applicable to devices that have a coherent NVLink connection to\n system memory.\n\n @param device                               The identifier of the target device\n @param mode                                 The target persistence mode\n\n @return\n         - \\ref NVML_SUCCESS                 if the persistence mode was set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a mode is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_NO_PERMISSION     if the user doesn't have permission to perform this operation\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlDeviceGetPersistenceMode()*/\n    fn nvmlDeviceSetPersistenceMode(\n        device: cuda_types::nvml::nvmlDevice_t,\n        mode: cuda_types::nvml::nvmlEnableState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Set the compute mode for the device.\n\n For all products.\n Requires root/admin permissions.\n\n The compute mode determines whether a GPU can be used for compute operations and whether it can\n be shared across contexts.\n\n This operation takes effect immediately. Under Linux it is not persistent across reboots and\n always resets to \"Default\". Under windows it is persistent.\n\n Under windows compute mode may only be set to DEFAULT when running in WDDM\n\n @note On MIG-enabled GPUs, compute mode would be set to DEFAULT and changing it is not supported.\n\n See \\ref nvmlComputeMode_t for details on available compute modes.\n\n @param device                               The identifier of the target device\n @param mode                                 The target compute mode\n\n @return\n         - \\ref NVML_SUCCESS                 if the compute mode was set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a mode is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_NO_PERMISSION     if the user doesn't have permission to perform this operation\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlDeviceGetComputeMode()*/\n    fn nvmlDeviceSetComputeMode(\n        device: cuda_types::nvml::nvmlDevice_t,\n        mode: cuda_types::nvml::nvmlComputeMode_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Set the ECC mode for the device.\n\n For Kepler &tm; or newer fully supported devices.\n Only applicable to devices with ECC.\n Requires \\a NVML_INFOROM_ECC version 1.0 or higher.\n Requires root/admin permissions.\n\n The ECC mode determines whether the GPU enables its ECC support.\n\n This operation takes effect after the next reboot.\n\n See \\ref nvmlEnableState_t for details on available modes.\n\n @param device                               The identifier of the target device\n @param ecc                                  The target ECC mode\n\n @return\n         - \\ref NVML_SUCCESS                 if the ECC mode was set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a ecc is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_NO_PERMISSION     if the user doesn't have permission to perform this operation\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlDeviceGetEccMode()*/\n    fn nvmlDeviceSetEccMode(\n        device: cuda_types::nvml::nvmlDevice_t,\n        ecc: cuda_types::nvml::nvmlEnableState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Clear the ECC error and other memory error counts for the device.\n\n For Kepler &tm; or newer fully supported devices.\n Only applicable to devices with ECC.\n Requires \\a NVML_INFOROM_ECC version 2.0 or higher to clear aggregate location-based ECC counts.\n Requires \\a NVML_INFOROM_ECC version 1.0 or higher to clear all other ECC counts.\n Requires root/admin permissions.\n Requires ECC Mode to be enabled.\n\n Sets all of the specified ECC counters to 0, including both detailed and total counts.\n\n This operation takes effect immediately.\n\n See \\ref nvmlMemoryErrorType_t for details on available counter types.\n\n @param device                               The identifier of the target device\n @param counterType                          Flag that indicates which type of errors should be cleared.\n\n @return\n         - \\ref NVML_SUCCESS                 if the error counts were cleared\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a counterType is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_NO_PERMISSION     if the user doesn't have permission to perform this operation\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see\n      - nvmlDeviceGetDetailedEccErrors()\n      - nvmlDeviceGetTotalEccErrors()*/\n    fn nvmlDeviceClearEccErrorCounts(\n        device: cuda_types::nvml::nvmlDevice_t,\n        counterType: cuda_types::nvml::nvmlEccCounterType_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Set the driver model for the device.\n\n For Fermi &tm; or newer fully supported devices.\n For windows only.\n Requires root/admin permissions.\n\n On Windows platforms the device driver can run in either WDDM or WDM (TCC) mode. If a display is attached\n to the device it must run in WDDM mode.\n\n It is possible to force the change to WDM (TCC) while the display is still attached with a force flag (nvmlFlagForce).\n This should only be done if the host is subsequently powered down and the display is detached from the device\n before the next reboot.\n\n This operation takes effect after the next reboot.\n\n Windows driver model may only be set to WDDM when running in DEFAULT compute mode.\n\n Change driver model to WDDM is not supported when GPU doesn't support graphics acceleration or\n will not support it after reboot. See \\ref nvmlDeviceSetGpuOperationMode.\n\n See \\ref nvmlDriverModel_t for details on available driver models.\n See \\ref nvmlFlagDefault and \\ref nvmlFlagForce\n\n @param device                               The identifier of the target device\n @param driverModel                          The target driver model\n @param flags                                Flags that change the default behavior\n\n @return\n         - \\ref NVML_SUCCESS                 if the driver model has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a driverModel is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the platform is not windows or the device does not support this feature\n         - \\ref NVML_ERROR_NO_PERMISSION     if the user doesn't have permission to perform this operation\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlDeviceGetDriverModel()*/\n    fn nvmlDeviceSetDriverModel(\n        device: cuda_types::nvml::nvmlDevice_t,\n        driverModel: cuda_types::nvml::nvmlDriverModel_t,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Set clocks that device will lock to.\n\n Sets the clocks that the device will be running at to the value in the range of minGpuClockMHz to maxGpuClockMHz.\n\n Can be used as a setting to request constant performance.\n\n This can be called with a pair of integer clock frequencies in MHz, or a pair of /ref nvmlClockLimitId_t values.\n See the table below for valid combinations of these values.\n\n minGpuClock | maxGpuClock | Effect\n ------------+-------------+--------------------------------------------------\n     tdp     |     tdp     | Lock clock to TDP\n  unlimited  |     tdp     | Upper bound is TDP but clock may drift below this\n     tdp     |  unlimited  | Lower bound is TDP but clock may boost above this\n  unlimited  |  unlimited  | Unlocked (== nvmlDeviceResetGpuLockedClocks)\n\n If one arg takes one of these values, the other must be one of these values as\n well. Mixed numeric and symbolic calls return NVML_ERROR_INVALID_ARGUMENT.\n\n Requires root/admin permissions.\n\n After system reboot or driver reload GPU clocks go back to their default value.\n See \\ref nvmlDeviceResetGpuLockedClocks.\n\n For Volta &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param minGpuClockMHz                       Requested minimum gpu clock in MHz\n @param maxGpuClockMHz                       Requested maximum gpu clock in MHz\n\n @return\n         - \\ref NVML_SUCCESS                 if new settings were successfully set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a minGpuClockMHz and \\a maxGpuClockMHz\n                                                 is not a valid clock combination\n         - \\ref NVML_ERROR_NO_PERMISSION     if the user doesn't have permission to perform this operation\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device doesn't support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceSetGpuLockedClocks(\n        device: cuda_types::nvml::nvmlDevice_t,\n        minGpuClockMHz: ::core::ffi::c_uint,\n        maxGpuClockMHz: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Resets the gpu clock to the default value\n\n This is the gpu clock that will be used after system reboot or driver reload.\n Default values are idle clocks.\n\n @see nvmlDeviceSetGpuLockedClocks\n\n For Volta &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n\n @return\n         - \\ref NVML_SUCCESS                 if new settings were successfully set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceResetGpuLockedClocks(\n        device: cuda_types::nvml::nvmlDevice_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Set memory clocks that device will lock to.\n\n Sets the device's memory clocks to the value in the range of minMemClockMHz to maxMemClockMHz.\n\n Can be used as a setting to request constant performance.\n\n Requires root/admin permissions.\n\n After system reboot or driver reload memory clocks go back to their default value.\n See \\ref nvmlDeviceResetMemoryLockedClocks.\n\n For Ampere &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param minMemClockMHz                       Requested minimum memory clock in MHz\n @param maxMemClockMHz                       Requested maximum memory clock in MHz\n\n @return\n         - \\ref NVML_SUCCESS                 if new settings were successfully set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a minGpuClockMHz and \\a maxGpuClockMHz\n                                                 is not a valid clock combination\n         - \\ref NVML_ERROR_NO_PERMISSION     if the user doesn't have permission to perform this operation\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device doesn't support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceSetMemoryLockedClocks(\n        device: cuda_types::nvml::nvmlDevice_t,\n        minMemClockMHz: ::core::ffi::c_uint,\n        maxMemClockMHz: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Resets the memory clock to the default value\n\n This is the memory clock that will be used after system reboot or driver reload.\n Default values are idle clocks.\n\n @see nvmlDeviceSetMemoryLockedClocks\n\n For Ampere &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n\n @return\n         - \\ref NVML_SUCCESS                 if new settings were successfully set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceResetMemoryLockedClocks(\n        device: cuda_types::nvml::nvmlDevice_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** @deprecated Applications clocks are deprecated and will be removed in CUDA 14.0.\n\n Please use \\ref nvmlDeviceSetMemoryLockedClocks for Memory Clocks and\n \\ref nvmlDeviceSetGpuLockedClocks for Graphics Clocks.*/\n    fn nvmlDeviceSetApplicationsClocks(\n        device: cuda_types::nvml::nvmlDevice_t,\n        memClockMHz: ::core::ffi::c_uint,\n        graphicsClockMHz: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** @deprecated Applications clocks are deprecated and will be removed in CUDA 14.0.\n\n Please use \\ref nvmlDeviceResetMemoryLockedClocks for Memory Clocks and\n \\ref nvmlDeviceResetGpuLockedClocks for Graphics Clocks.*/\n    fn nvmlDeviceResetApplicationsClocks(\n        device: cuda_types::nvml::nvmlDevice_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Try to set the current state of Auto Boosted clocks on a device.\n\n For Kepler &tm; or newer fully supported devices.\n\n Auto Boosted clocks are enabled by default on some hardware, allowing the GPU to run at higher clock rates\n to maximize performance as thermal limits allow. Auto Boosted clocks should be disabled if fixed clock\n rates are desired.\n\n Non-root users may use this API by default but can be restricted by root from using this API by calling\n \\ref nvmlDeviceSetAPIRestriction with apiType=NVML_RESTRICTED_API_SET_AUTO_BOOSTED_CLOCKS.\n Note: Persistence Mode is required to modify current Auto Boost settings, therefore, it must be enabled.\n\n On Pascal and newer hardware, Auto Boosted clocks are controlled through application clocks.\n Use \\ref nvmlDeviceSetApplicationsClocks and \\ref nvmlDeviceResetApplicationsClocks to control Auto Boost\n behavior.\n\n @param device                               The identifier of the target device\n @param enabled                              What state to try to set Auto Boosted clocks of the target device to\n\n @return\n         - \\ref NVML_SUCCESS                 If the Auto Boosted clocks were successfully set to the state specified by \\a enabled\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support Auto Boosted clocks\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n*/\n    fn nvmlDeviceSetAutoBoostedClocksEnabled(\n        device: cuda_types::nvml::nvmlDevice_t,\n        enabled: cuda_types::nvml::nvmlEnableState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Try to set the default state of Auto Boosted clocks on a device. This is the default state that Auto Boosted clocks will\n return to when no compute running processes (e.g. CUDA application which have an active context) are running\n\n For Kepler &tm; or newer non-GeForce fully supported devices and Maxwell or newer GeForce devices.\n Requires root/admin permissions.\n\n Auto Boosted clocks are enabled by default on some hardware, allowing the GPU to run at higher clock rates\n to maximize performance as thermal limits allow. Auto Boosted clocks should be disabled if fixed clock\n rates are desired.\n\n On Pascal and newer hardware, Auto Boosted clocks are controlled through application clocks.\n Use \\ref nvmlDeviceSetApplicationsClocks and \\ref nvmlDeviceResetApplicationsClocks to control Auto Boost\n behavior.\n\n @param device                               The identifier of the target device\n @param enabled                              What state to try to set default Auto Boosted clocks of the target device to\n @param flags                                Flags that change the default behavior. Currently Unused.\n\n @return\n         - \\ref NVML_SUCCESS                 If the Auto Boosted clock's default state was successfully set to the state specified by \\a enabled\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_NO_PERMISSION     If the calling user does not have permission to change Auto Boosted clock's default state.\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support Auto Boosted clocks\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n*/\n    fn nvmlDeviceSetDefaultAutoBoostedClocksEnabled(\n        device: cuda_types::nvml::nvmlDevice_t,\n        enabled: cuda_types::nvml::nvmlEnableState_t,\n        flags: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Sets the speed of the fan control policy to default.\n\n For all cuda-capable discrete products with fans\n\n @param device                        The identifier of the target device\n @param fan                           The index of the fan, starting at zero\n\n return\n         NVML_SUCCESS                 if speed has been adjusted\n         NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         NVML_ERROR_INVALID_ARGUMENT  if device is invalid\n         NVML_ERROR_NOT_SUPPORTED     if the device does not support this\n                                      (doesn't have fans)\n         NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceSetDefaultFanSpeed_v2(\n        device: cuda_types::nvml::nvmlDevice_t,\n        fan: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Sets current fan control policy.\n\n For Maxwell &tm; or newer fully supported devices.\n\n Requires privileged user.\n\n For all cuda-capable discrete products with fans\n\n device                               The identifier of the target \\a device\n policy                               The fan control \\a policy to set\n\n return\n         NVML_SUCCESS                 if \\a policy has been set\n         NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a policy is null or the \\a fan given doesn't reference\n                                            a fan that exists.\n         NVML_ERROR_NOT_SUPPORTED     if the \\a device is older than Maxwell\n         NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceSetFanControlPolicy(\n        device: cuda_types::nvml::nvmlDevice_t,\n        fan: ::core::ffi::c_uint,\n        policy: cuda_types::nvml::nvmlFanControlPolicy_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Sets the temperature threshold for the GPU with the specified threshold type in degrees C.\n\n For Maxwell &tm; or newer fully supported devices.\n\n See \\ref nvmlTemperatureThresholds_t for details on available temperature thresholds.\n\n @param device                               The identifier of the target device\n @param thresholdType                        The type of threshold value to be set\n @param temp                                 Reference which hold the value to be set\n @return\n         - \\ref NVML_SUCCESS                 if \\a temp has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, \\a thresholdType is invalid or \\a temp is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not have a temperature sensor or is unsupported\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceSetTemperatureThreshold(\n        device: cuda_types::nvml::nvmlDevice_t,\n        thresholdType: cuda_types::nvml::nvmlTemperatureThresholds_t,\n        temp: *mut ::core::ffi::c_int,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Set new power limit of this device.\n\n For Kepler &tm; or newer fully supported devices.\n Requires root/admin permissions.\n\n See \\ref nvmlDeviceGetPowerManagementLimitConstraints to check the allowed ranges of values.\n\n \\note Limit is not persistent across reboots or driver unloads.\n Enable persistent mode to prevent driver from unloading when no application is using the device.\n\n @param device                               The identifier of the target device\n @param limit                                Power management limit in milliwatts to set\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a limit has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a defaultLimit is out of range\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlDeviceGetPowerManagementLimitConstraints\n @see nvmlDeviceGetPowerManagementDefaultLimit*/\n    fn nvmlDeviceSetPowerManagementLimit(\n        device: cuda_types::nvml::nvmlDevice_t,\n        limit: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Sets new GOM. See \\a nvmlGpuOperationMode_t for details.\n\n For GK110 M-class and X-class Tesla &tm; products from the Kepler family.\n Modes \\ref NVML_GOM_LOW_DP and \\ref NVML_GOM_ALL_ON are supported on fully supported GeForce products.\n Not supported on Quadro &reg; and Tesla &tm; C-class products.\n Requires root/admin permissions.\n\n Changing GOMs requires a reboot.\n The reboot requirement might be removed in the future.\n\n Compute only GOMs don't support graphics acceleration. Under windows switching to these GOMs when\n pending driver model is WDDM is not supported. See \\ref nvmlDeviceSetDriverModel.\n\n @param device                               The identifier of the target device\n @param mode                                 Target GOM\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a mode has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a mode incorrect\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support GOM or specific mode\n         - \\ref NVML_ERROR_NO_PERMISSION     if the user doesn't have permission to perform this operation\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlGpuOperationMode_t\n @see nvmlDeviceGetGpuOperationMode*/\n    fn nvmlDeviceSetGpuOperationMode(\n        device: cuda_types::nvml::nvmlDevice_t,\n        mode: cuda_types::nvml::nvmlGpuOperationMode_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Changes the root/admin restructions on certain APIs. See \\a nvmlRestrictedAPI_t for the list of supported APIs.\n This method can be used by a root/admin user to give non-root/admin access to certain otherwise-restricted APIs.\n The new setting lasts for the lifetime of the NVIDIA driver; it is not persistent. See \\a nvmlDeviceGetAPIRestriction\n to query the current restriction settings.\n\n For Kepler &tm; or newer fully supported devices.\n Requires root/admin permissions.\n\n @param device                               The identifier of the target device\n @param apiType                              Target API type for this operation\n @param isRestricted                         The target restriction\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a isRestricted has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a apiType incorrect\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support changing API restrictions or the device does not support\n                                                 the feature that api restrictions are being set for (E.G. Enabling/disabling auto\n                                                 boosted clocks is not supported by the device)\n         - \\ref NVML_ERROR_NO_PERMISSION     if the user doesn't have permission to perform this operation\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlRestrictedAPI_t*/\n    fn nvmlDeviceSetAPIRestriction(\n        device: cuda_types::nvml::nvmlDevice_t,\n        apiType: cuda_types::nvml::nvmlRestrictedAPI_t,\n        isRestricted: cuda_types::nvml::nvmlEnableState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Sets the speed of a specified fan.\n\n WARNING: This function changes the fan control policy to manual. It means that YOU have to monitor\n          the temperature and adjust the fan speed accordingly.\n          If you set the fan speed too low you can burn your GPU!\n          Use nvmlDeviceSetDefaultFanSpeed_v2 to restore default control policy.\n\n For all cuda-capable discrete products with fans that are Maxwell or Newer.\n\n device                                The identifier of the target device\n fan                                   The index of the fan, starting at zero\n speed                                 The target speed of the fan [0-100] in % of max speed\n\n return\n        NVML_SUCCESS                   if the fan speed has been set\n        NVML_ERROR_UNINITIALIZED       if the library has not been successfully initialized\n        NVML_ERROR_INVALID_ARGUMENT    if the device is not valid, or the speed is outside acceptable ranges,\n                                              or if the fan index doesn't reference an actual fan.\n        NVML_ERROR_NOT_SUPPORTED       if the device is older than Maxwell.\n        NVML_ERROR_UNKNOWN             if there was an unexpected error.*/\n    fn nvmlDeviceSetFanSpeed_v2(\n        device: cuda_types::nvml::nvmlDevice_t,\n        fan: ::core::ffi::c_uint,\n        speed: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** @deprecated Will be deprecated in a future release. Use \\ref nvmlDeviceSetClockOffsets instead. It works\n             on Maxwell onwards GPU architectures.\n\n Set the GPCCLK VF offset value\n @param[in]   device                         The identifier of the target device\n @param[in]   offset                         The GPCCLK VF offset value to set\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a offset has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a offset is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceSetGpcClkVfOffset(\n        device: cuda_types::nvml::nvmlDevice_t,\n        offset: ::core::ffi::c_int,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** @deprecated Will be deprecated in a future release. Use \\ref nvmlDeviceSetClockOffsets instead. It works\n             on Maxwell onwards GPU architectures.\n\n Set the MemClk (Memory Clock) VF offset value. It requires elevated privileges.\n @param[in]   device                         The identifier of the target device\n @param[in]   offset                         The MemClk VF offset value to set\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a offset has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a offset is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceSetMemClkVfOffset(\n        device: cuda_types::nvml::nvmlDevice_t,\n        offset: ::core::ffi::c_int,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Enables or disables per process accounting.\n\n For Kepler &tm; or newer fully supported devices.\n Requires root/admin permissions.\n\n @note This setting is not persistent and will default to disabled after driver unloads.\n       Enable persistence mode to be sure the setting doesn't switch off to disabled.\n\n @note Enabling accounting mode has no negative impact on the GPU performance.\n\n @note Disabling accounting clears all accounting pids information.\n\n @note On MIG-enabled GPUs, accounting mode would be set to DISABLED and changing it is not supported.\n\n See \\ref nvmlDeviceGetAccountingMode\n See \\ref nvmlDeviceGetAccountingStats\n See \\ref nvmlDeviceClearAccountingPids\n\n @param device                               The identifier of the target device\n @param mode                                 The target accounting mode\n\n @return\n         - \\ref NVML_SUCCESS                 if the new mode has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device or \\a mode are invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device doesn't support this feature\n         - \\ref NVML_ERROR_NO_PERMISSION     if the user doesn't have permission to perform this operation\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceSetAccountingMode(\n        device: cuda_types::nvml::nvmlDevice_t,\n        mode: cuda_types::nvml::nvmlEnableState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Clears accounting information about all processes that have already terminated.\n\n For Kepler &tm; or newer fully supported devices.\n Requires root/admin permissions.\n\n See \\ref nvmlDeviceGetAccountingMode\n See \\ref nvmlDeviceGetAccountingStats\n See \\ref nvmlDeviceSetAccountingMode\n\n @param device                               The identifier of the target device\n\n @return\n         - \\ref NVML_SUCCESS                 if accounting information has been cleared\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device are invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device doesn't support this feature\n         - \\ref NVML_ERROR_NO_PERMISSION     if the user doesn't have permission to perform this operation\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceClearAccountingPids(\n        device: cuda_types::nvml::nvmlDevice_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the state of the device's NvLink for the link specified\n\n For Pascal &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param link                                 Specifies the NvLink link to be queried\n @param isActive                             \\a nvmlEnableState_t where NVML_FEATURE_ENABLED indicates that\n                                             the link is active and NVML_FEATURE_DISABLED indicates it\n                                             is inactive\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a isActive has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device or \\a link is invalid or \\a isActive is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device doesn't support this feature\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetNvLinkState(\n        device: cuda_types::nvml::nvmlDevice_t,\n        link: ::core::ffi::c_uint,\n        isActive: *mut cuda_types::nvml::nvmlEnableState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the version of the device's NvLink for the link specified\n\n For Pascal &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param link                                 Specifies the NvLink link to be queried\n @param version                              Requested NvLink version from nvmlNvlinkVersion_t\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a version has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device or \\a link is invalid or \\a version is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device doesn't support this feature\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetNvLinkVersion(\n        device: cuda_types::nvml::nvmlDevice_t,\n        link: ::core::ffi::c_uint,\n        version: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the requested capability from the device's NvLink for the link specified\n Please refer to the \\a nvmlNvLinkCapability_t structure for the specific caps that can be queried\n The return value should be treated as a boolean.\n\n For Pascal &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param link                                 Specifies the NvLink link to be queried\n @param capability                           Specifies the \\a nvmlNvLinkCapability_t to be queried\n @param capResult                            A boolean for the queried capability indicating that feature is available\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a capResult has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device, \\a link, or \\a capability is invalid or \\a capResult is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device doesn't support this feature\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetNvLinkCapability(\n        device: cuda_types::nvml::nvmlDevice_t,\n        link: ::core::ffi::c_uint,\n        capability: cuda_types::nvml::nvmlNvLinkCapability_t,\n        capResult: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the PCI information for the remote node on a NvLink link\n Note: pciSubSystemId is not filled in this function and is indeterminate\n\n For Pascal &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param link                                 Specifies the NvLink link to be queried\n @param pci                                  \\a nvmlPciInfo_t of the remote node for the specified link\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a pci has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device or \\a link is invalid or \\a pci is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device doesn't support this feature\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetNvLinkRemotePciInfo_v2(\n        device: cuda_types::nvml::nvmlDevice_t,\n        link: ::core::ffi::c_uint,\n        pci: *mut cuda_types::nvml::nvmlPciInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the specified error counter value\n Please refer to \\a nvmlNvLinkErrorCounter_t for error counters that are available\n\n For Pascal &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param link                                 Specifies the NvLink link to be queried\n @param counter                              Specifies the NvLink counter to be queried\n @param counterValue                         Returned counter value\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a counter has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device, \\a link, or \\a counter is invalid or \\a counterValue is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device doesn't support this feature\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetNvLinkErrorCounter(\n        device: cuda_types::nvml::nvmlDevice_t,\n        link: ::core::ffi::c_uint,\n        counter: cuda_types::nvml::nvmlNvLinkErrorCounter_t,\n        counterValue: *mut ::core::ffi::c_ulonglong,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Resets all error counters to zero\n Please refer to \\a nvmlNvLinkErrorCounter_t for the list of error counters that are reset\n\n For Pascal &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param link                                 Specifies the NvLink link to be queried\n\n @return\n         - \\ref NVML_SUCCESS                 if the reset is successful\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device or \\a link is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device doesn't support this feature\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceResetNvLinkErrorCounters(\n        device: cuda_types::nvml::nvmlDevice_t,\n        link: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** @deprecated Setting utilization counter control is no longer supported.\n\n Set the NVLINK utilization counter control information for the specified counter, 0 or 1.\n Please refer to \\a nvmlNvLinkUtilizationControl_t for the structure definition.  Performs a reset\n of the counters if the reset parameter is non-zero.\n\n For Pascal &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param counter                              Specifies the counter that should be set (0 or 1).\n @param link                                 Specifies the NvLink link to be queried\n @param control                              A reference to the \\a nvmlNvLinkUtilizationControl_t to set\n @param reset                                Resets the counters on set if non-zero\n\n @return\n         - \\ref NVML_SUCCESS                 if the control has been set successfully\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device, \\a counter, \\a link, or \\a control is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device doesn't support this feature\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceSetNvLinkUtilizationControl(\n        device: cuda_types::nvml::nvmlDevice_t,\n        link: ::core::ffi::c_uint,\n        counter: ::core::ffi::c_uint,\n        control: *mut cuda_types::nvml::nvmlNvLinkUtilizationControl_t,\n        reset: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** @deprecated Getting utilization counter control is no longer supported.\n\n Get the NVLINK utilization counter control information for the specified counter, 0 or 1.\n Please refer to \\a nvmlNvLinkUtilizationControl_t for the structure definition\n\n For Pascal &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param counter                              Specifies the counter that should be set (0 or 1).\n @param link                                 Specifies the NvLink link to be queried\n @param control                              A reference to the \\a nvmlNvLinkUtilizationControl_t to place information\n\n @return\n         - \\ref NVML_SUCCESS                 if the control has been set successfully\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device, \\a counter, \\a link, or \\a control is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device doesn't support this feature\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetNvLinkUtilizationControl(\n        device: cuda_types::nvml::nvmlDevice_t,\n        link: ::core::ffi::c_uint,\n        counter: ::core::ffi::c_uint,\n        control: *mut cuda_types::nvml::nvmlNvLinkUtilizationControl_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** @deprecated Use \\ref nvmlDeviceGetFieldValues with NVML_FI_DEV_NVLINK_THROUGHPUT_* as field values instead.\n\n Retrieve the NVLINK utilization counter based on the current control for a specified counter.\n In general it is good practice to use \\a nvmlDeviceSetNvLinkUtilizationControl\n  before reading the utilization counters as they have no default state\n\n For Pascal &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param link                                 Specifies the NvLink link to be queried\n @param counter                              Specifies the counter that should be read (0 or 1).\n @param rxcounter                            Receive counter return value\n @param txcounter                            Transmit counter return value\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a rxcounter and \\a txcounter have been successfully set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device, \\a counter, or \\a link is invalid or \\a rxcounter or \\a txcounter are NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device doesn't support this feature\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetNvLinkUtilizationCounter(\n        device: cuda_types::nvml::nvmlDevice_t,\n        link: ::core::ffi::c_uint,\n        counter: ::core::ffi::c_uint,\n        rxcounter: *mut ::core::ffi::c_ulonglong,\n        txcounter: *mut ::core::ffi::c_ulonglong,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** @deprecated Freezing NVLINK utilization counters is no longer supported.\n\n Freeze the NVLINK utilization counters\n Both the receive and transmit counters are operated on by this function\n\n For Pascal &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param link                                 Specifies the NvLink link to be queried\n @param counter                              Specifies the counter that should be frozen (0 or 1).\n @param freeze                               NVML_FEATURE_ENABLED = freeze the receive and transmit counters\n                                             NVML_FEATURE_DISABLED = unfreeze the receive and transmit counters\n\n @return\n         - \\ref NVML_SUCCESS                 if counters were successfully frozen or unfrozen\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device, \\a link, \\a counter, or \\a freeze is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device doesn't support this feature\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceFreezeNvLinkUtilizationCounter(\n        device: cuda_types::nvml::nvmlDevice_t,\n        link: ::core::ffi::c_uint,\n        counter: ::core::ffi::c_uint,\n        freeze: cuda_types::nvml::nvmlEnableState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** @deprecated Resetting NVLINK utilization counters is no longer supported.\n\n Reset the NVLINK utilization counters\n Both the receive and transmit counters are operated on by this function\n\n For Pascal &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param link                                 Specifies the NvLink link to be reset\n @param counter                              Specifies the counter that should be reset (0 or 1)\n\n @return\n         - \\ref NVML_SUCCESS                 if counters were successfully reset\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device, \\a link, or \\a counter is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device doesn't support this feature\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceResetNvLinkUtilizationCounter(\n        device: cuda_types::nvml::nvmlDevice_t,\n        link: ::core::ffi::c_uint,\n        counter: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get the NVLink device type of the remote device connected over the given link.\n\n @param device                                The device handle of the target GPU\n @param link                                  The NVLink link index on the target GPU\n @param pNvLinkDeviceType                     Pointer in which the output remote device type is returned\n\n @return\n         - \\ref NVML_SUCCESS                  if \\a pNvLinkDeviceType has been set\n         - \\ref NVML_ERROR_UNINITIALIZED      if the library has not been successfully initialized\n         - \\ref NVML_ERROR_NOT_SUPPORTED      if NVLink is not supported\n         - \\ref NVML_ERROR_INVALID_ARGUMENT   if \\a device or \\a link is invalid, or\n                                              \\a pNvLinkDeviceType is NULL\n         - \\ref NVML_ERROR_GPU_IS_LOST        if the target GPU has fallen off the bus or is\n                                              otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN            on any unexpected error*/\n    fn nvmlDeviceGetNvLinkRemoteDeviceType(\n        device: cuda_types::nvml::nvmlDevice_t,\n        link: ::core::ffi::c_uint,\n        pNvLinkDeviceType: *mut cuda_types::nvml::nvmlIntNvLinkDeviceType_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Set NvLink Low Power Threshold for device.\n\n For Hopper &tm; or newer fully supported devices.\n\n @param device                               The identifier of the target device\n @param info                                 Reference to \\a nvmlNvLinkPowerThres_t struct\n                                             input parameters\n\n @return\n        - \\ref NVML_SUCCESS                 if the \\a Threshold is successfully set\n        - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n        - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a Threshold is not within range\n        - \\ref NVML_ERROR_NOT_READY         if an internal driver setting prevents the threshold from being used\n        - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by the device\n*/\n    fn nvmlDeviceSetNvLinkDeviceLowPowerThreshold(\n        device: cuda_types::nvml::nvmlDevice_t,\n        info: *mut cuda_types::nvml::nvmlNvLinkPowerThres_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Set the global nvlink bandwith mode\n\n @param nvlinkBwMode             nvlink bandwidth mode\n @return\n         - \\ref NVML_SUCCESS                on success\n         - \\ref NVML_ERROR_INVALID_ARGUMENT if an invalid argument is provided\n         - \\ref NVML_ERROR_IN_USE           if P2P object exists\n         - \\ref NVML_ERROR_NOT_SUPPORTED    if GPU is not Hopper or newer architecture.\n         - \\ref NVML_ERROR_NO_PERMISSION    if not root user*/\n    fn nvmlSystemSetNvlinkBwMode(\n        nvlinkBwMode: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get the global nvlink bandwith mode\n\n @param nvlinkBwMode             reference of nvlink bandwidth mode\n @return\n         - \\ref NVML_SUCCESS                on success\n         - \\ref NVML_ERROR_INVALID_ARGUMENT if an invalid pointer is provided\n         - \\ref NVML_ERROR_NOT_SUPPORTED    if GPU is not Hopper or newer architecture.\n         - \\ref NVML_ERROR_NO_PERMISSION    if not root user*/\n    fn nvmlSystemGetNvlinkBwMode(\n        nvlinkBwMode: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get the supported NvLink Reduced Bandwidth Modes of the device\n\n For Blackwell &tm; or newer fully supported devices.\n\n @param device                                      The identifier of the target device\n @param supportedBwMode                             Reference to \\a nvmlNvlinkSupportedBwModes_t\n\n @return\n        - \\ref NVML_SUCCESS                         if the query was successful\n        - \\ref NVML_ERROR_INVALID_ARGUMENT          if device is invalid or supportedBwMode is NULL\n        - \\ref NVML_ERROR_NOT_SUPPORTED             if this feature is not supported by the device\n        - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH if the version specified is not supported*/\n    fn nvmlDeviceGetNvlinkSupportedBwModes(\n        device: cuda_types::nvml::nvmlDevice_t,\n        supportedBwMode: *mut cuda_types::nvml::nvmlNvlinkSupportedBwModes_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get the NvLink Reduced Bandwidth Mode for the device\n\n For Blackwell &tm; or newer fully supported devices.\n\n @param device                                      The identifier of the target device\n @param getBwMode                                   Reference to \\a nvmlNvlinkGetBwMode_t\n\n @return\n        - \\ref NVML_SUCCESS                         if the query was successful\n        - \\ref NVML_ERROR_INVALID_ARGUMENT          if device is invalid or getBwMode is NULL\n        - \\ref NVML_ERROR_NOT_SUPPORTED             if this feature is not supported by the device\n        - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH if the version specified is not supported*/\n    fn nvmlDeviceGetNvlinkBwMode(\n        device: cuda_types::nvml::nvmlDevice_t,\n        getBwMode: *mut cuda_types::nvml::nvmlNvlinkGetBwMode_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Set the NvLink Reduced Bandwidth Mode for the device\n\n For Blackwell &tm; or newer fully supported devices.\n\n @param device                                      The identifier of the target device\n @param setBwMode                                   Reference to \\a nvmlNvlinkSetBwMode_t\n\n @return\n        - \\ref NVML_SUCCESS                         if the Bandwidth mode was successfully set\n        - \\ref NVML_ERROR_INVALID_ARGUMENT          if device is invalid or setBwMode is NULL\n        - \\ref NVML_ERROR_NO_PERMISSION             if user does not have permission to change Bandwidth mode\n        - \\ref NVML_ERROR_NOT_SUPPORTED             if this feature is not supported by the device\n        - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH if the version specified is not supported*/\n    fn nvmlDeviceSetNvlinkBwMode(\n        device: cuda_types::nvml::nvmlDevice_t,\n        setBwMode: *mut cuda_types::nvml::nvmlNvlinkSetBwMode_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Query NVLINK information associated with this device.\n\n @param[in]  device                              The identifier of the target device\n @param[out] info                                Reference to \\a nvmlNvLinkInfo_t\n\n @return\n         - \\ref NVML_SUCCESS                          if query is success\n         - \\ref NVML_ERROR_UNINITIALIZED              if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT           if \\a device is invalid, or \\a info is NULL\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH  if the version is invalid/unsupported\n         - \\ref NVML_ERROR_NOT_SUPPORTED              if the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST                if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN                    on any unexpected error*/\n    fn nvmlDeviceGetNvLinkInfo(\n        device: cuda_types::nvml::nvmlDevice_t,\n        info: *mut cuda_types::nvml::nvmlNvLinkInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Create an empty set of events.\n Event set should be freed by \\ref nvmlEventSetFree\n\n For Fermi &tm; or newer fully supported devices.\n @param set                                  Reference in which to return the event handle\n\n @return\n         - \\ref NVML_SUCCESS                 if the event has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a set is NULL\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlEventSetFree*/\n    fn nvmlEventSetCreate(\n        set: *mut cuda_types::nvml::nvmlEventSet_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Starts recording of events on a specified devices and add the events to specified \\ref nvmlEventSet_t\n\n For Fermi &tm; or newer fully supported devices.\n ECC events are available only on ECC-enabled devices (see \\ref nvmlDeviceGetTotalEccErrors)\n Power capping events are available only on Power Management enabled devices (see \\ref nvmlDeviceGetPowerManagementMode)\n\n For Linux only.\n\n This call starts recording of events on specific device.\n All events that occurred before this call are not recorded.\n Checking if some event occurred can be done with \\ref nvmlEventSetWait_v2\n\n If function reports NVML_ERROR_UNKNOWN, event set is in undefined state and should be freed.\n If function reports NVML_ERROR_NOT_SUPPORTED, event set can still be used. None of the requested eventTypes\n     are registered in that case.\n\n @param device                               The identifier of the target device\n @param eventTypes                           Bitmask of \\ref nvmlEventType to record\n @param set                                  Set to which add new event types\n\n @return\n         - \\ref NVML_SUCCESS                 if the event has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a eventTypes is invalid or \\a set is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the platform does not support this feature or some of requested event types\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlEventType\n @see nvmlDeviceGetSupportedEventTypes\n @see nvmlEventSetWait\n @see nvmlEventSetFree*/\n    fn nvmlDeviceRegisterEvents(\n        device: cuda_types::nvml::nvmlDevice_t,\n        eventTypes: ::core::ffi::c_ulonglong,\n        set: cuda_types::nvml::nvmlEventSet_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Returns information about events supported on device\n\n For Fermi &tm; or newer fully supported devices.\n\n Events are not supported on Windows. So this function returns an empty mask in \\a eventTypes on Windows.\n\n @param device                               The identifier of the target device\n @param eventTypes                           Reference in which to return bitmask of supported events\n\n @return\n         - \\ref NVML_SUCCESS                 if the eventTypes has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a eventType is NULL\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlEventType\n @see nvmlDeviceRegisterEvents*/\n    fn nvmlDeviceGetSupportedEventTypes(\n        device: cuda_types::nvml::nvmlDevice_t,\n        eventTypes: *mut ::core::ffi::c_ulonglong,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Waits on events and delivers events\n\n For Fermi &tm; or newer fully supported devices.\n\n If some events are ready to be delivered at the time of the call, function returns immediately.\n If there are no events ready to be delivered, function sleeps till event arrives\n but not longer than specified timeout. This function in certain conditions can return before\n specified timeout passes (e.g. when interrupt arrives)\n\n On Windows, in case of Xid error, the function returns the most recent Xid error type seen by the system.\n If there are multiple Xid errors generated before nvmlEventSetWait is invoked then the last seen Xid error\n type is returned for all Xid error events.\n\n On Linux, every Xid error event would return the associated event data and other information if applicable.\n\n In MIG mode, if device handle is provided, the API reports all the events for the available instances,\n only if the caller has appropriate privileges. In absence of required privileges, only the events which\n affect all the instances (i.e. whole device) are reported.\n\n This API does not currently support per-instance event reporting using MIG device handles.\n\n @param set                                  Reference to set of events to wait on\n @param data                                 Reference in which to return event data\n @param timeoutms                            Maximum amount of wait time in milliseconds for registered event\n\n @return\n         - \\ref NVML_SUCCESS                 if the data has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a data is NULL\n         - \\ref NVML_ERROR_TIMEOUT           if no event arrived in specified timeout or interrupt arrived\n         - \\ref NVML_ERROR_GPU_IS_LOST       if a GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlEventType\n @see nvmlDeviceRegisterEvents*/\n    fn nvmlEventSetWait_v2(\n        set: cuda_types::nvml::nvmlEventSet_t,\n        data: *mut cuda_types::nvml::nvmlEventData_t,\n        timeoutms: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Releases events in the set\n\n For Fermi &tm; or newer fully supported devices.\n\n @param set                                  Reference to events to be released\n\n @return\n         - \\ref NVML_SUCCESS                 if the event has been successfully released\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlDeviceRegisterEvents*/\n    fn nvmlEventSetFree(\n        set: cuda_types::nvml::nvmlEventSet_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Create an empty set of system events.\n Event set should be freed by \\ref nvmlSystemEventSetFree\n\n For Fermi &tm; or newer fully supported devices.\n @param request                              Reference to nvmlSystemEventSetCreateRequest_t\n\n @return\n         - \\ref NVML_SUCCESS                         if the event has been set\n         - \\ref NVML_ERROR_UNINITIALIZED             if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT          if request is NULL\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH for unsupported version\n         - \\ref NVML_ERROR_UNKNOWN                   on any unexpected error\n\n @see nvmlSystemEventSetFree*/\n    fn nvmlSystemEventSetCreate(\n        request: *mut cuda_types::nvml::nvmlSystemEventSetCreateRequest_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Releases system event set\n\n For Fermi &tm; or newer fully supported devices.\n\n @param request                                  Reference to nvmlSystemEventSetFreeRequest_t\n\n @return\n         - \\ref NVML_SUCCESS                         if the event has been set\n         - \\ref NVML_ERROR_UNINITIALIZED             if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT          if request is NULL\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH for unsupported version\n         - \\ref NVML_ERROR_UNKNOWN                   on any unexpected error\n\n @see nvmlDeviceRegisterEvents*/\n    fn nvmlSystemEventSetFree(\n        request: *mut cuda_types::nvml::nvmlSystemEventSetFreeRequest_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Starts recording of events on system and add the events to specified \\ref nvmlSystemEventSet_t\n\n For Linux only.\n\n This call starts recording of events on specific device.\n All events that occurred before this call are not recorded.\n Checking if some event occurred can be done with \\ref nvmlSystemEventSetWait\n\n If function reports NVML_ERROR_UNKNOWN, event set is in undefined state and should be freed.\n If function reports NVML_ERROR_NOT_SUPPORTED, event set can still be used. None of the requested eventTypes\n     are registered in that case.\n\n @param request                              Reference to the struct nvmlSystemRegisterEventRequest_t\n\n @return\n         - \\ref NVML_SUCCESS                         if the event has been set\n         - \\ref NVML_ERROR_UNINITIALIZED             if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT          if request is NULL\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH for unsupported version\n         - \\ref NVML_ERROR_UNKNOWN                   on any unexpected error\n\n @see nvmlSystemEventType\n @see nvmlSystemEventSetWait\n @see nvmlEventSetFree*/\n    fn nvmlSystemRegisterEvents(\n        request: *mut cuda_types::nvml::nvmlSystemRegisterEventRequest_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Waits on system events and delivers events\n\n For Fermi &tm; or newer fully supported devices.\n\n If some events are ready to be delivered at the time of the call, function returns immediately.\n If there are no events ready to be delivered, function sleeps till event arrives\n but not longer than specified timeout. This function in certain conditions can return before\n specified timeout passes (e.g. when interrupt arrives)\n\n if the return request->numEvent equals to request->dataSize, there might be outstanding\n event, it is recommended to call nvmlSystemEventSetWait again to query all the events.\n\n @param request                              Reference in which to nvmlSystemEventSetWaitRequest_t\n\n @return\n         - \\ref NVML_SUCCESS                         if the event has been set\n         - \\ref NVML_ERROR_UNINITIALIZED             if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT          if request is NULL\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH for unsupported version\n         - \\ref NVML_ERROR_TIMEOUT                   if no event notification after timeoutms\n         - \\ref NVML_ERROR_UNKNOWN                   on any unexpected error\n\n @see nvmlSystemEventType\n @see nvmlSystemRegisterEvents*/\n    fn nvmlSystemEventSetWait(\n        request: *mut cuda_types::nvml::nvmlSystemEventSetWaitRequest_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Modify the drain state of a GPU.  This method forces a GPU to no longer accept new incoming requests.\n Any new NVML process will no longer see this GPU.  Persistence mode for this GPU must be turned off before\n this call is made.\n Must be called as administrator.\n For Linux only.\n\n For Pascal &tm; or newer fully supported devices.\n Some Kepler devices supported.\n\n @param pciInfo                              The PCI address of the GPU drain state to be modified\n @param newState                             The drain state that should be entered, see \\ref nvmlEnableState_t\n\n @return\n         - \\ref NVML_SUCCESS                 if counters were successfully reset\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a nvmlIndex or \\a newState is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device doesn't support this feature\n         - \\ref NVML_ERROR_NO_PERMISSION     if the calling process has insufficient permissions to perform operation\n         - \\ref NVML_ERROR_IN_USE            if the device has persistence mode turned on\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceModifyDrainState(\n        pciInfo: *mut cuda_types::nvml::nvmlPciInfo_t,\n        newState: cuda_types::nvml::nvmlEnableState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Query the drain state of a GPU.  This method is used to check if a GPU is in a currently draining\n state.\n For Linux only.\n\n For Pascal &tm; or newer fully supported devices.\n Some Kepler devices supported.\n\n @param pciInfo                              The PCI address of the GPU drain state to be queried\n @param currentState                         The current drain state for this GPU, see \\ref nvmlEnableState_t\n\n @return\n         - \\ref NVML_SUCCESS                 if counters were successfully reset\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a nvmlIndex or \\a currentState is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device doesn't support this feature\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceQueryDrainState(\n        pciInfo: *mut cuda_types::nvml::nvmlPciInfo_t,\n        currentState: *mut cuda_types::nvml::nvmlEnableState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** This method will remove the specified GPU from the view of both NVML and the NVIDIA kernel driver\n as long as no other processes are attached. If other processes are attached, this call will return\n NVML_ERROR_IN_USE and the GPU will be returned to its original \"draining\" state. Note: the\n only situation where a process can still be attached after nvmlDeviceModifyDrainState() is called\n to initiate the draining state is if that process was using, and is still using, a GPU before the\n call was made. Also note, persistence mode counts as an attachment to the GPU thus it must be disabled\n prior to this call.\n\n For long-running NVML processes please note that this will change the enumeration of current GPUs.\n For example, if there are four GPUs present and GPU1 is removed, the new enumeration will be 0-2.\n Also, device handles after the removed GPU will not be valid and must be re-established.\n Must be run as administrator.\n For Linux only.\n\n For Pascal &tm; or newer fully supported devices.\n Some Kepler devices supported.\n\n @param pciInfo                              The PCI address of the GPU to be removed\n @param gpuState                             Whether the GPU is to be removed, from the OS\n                                             see \\ref nvmlDetachGpuState_t\n @param linkState                            Requested upstream PCIe link state, see \\ref nvmlPcieLinkState_t\n\n @return\n         - \\ref NVML_SUCCESS                 if counters were successfully reset\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a nvmlIndex is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device doesn't support this feature\n         - \\ref NVML_ERROR_IN_USE            if the device is still in use and cannot be removed*/\n    fn nvmlDeviceRemoveGpu_v2(\n        pciInfo: *mut cuda_types::nvml::nvmlPciInfo_t,\n        gpuState: cuda_types::nvml::nvmlDetachGpuState_t,\n        linkState: cuda_types::nvml::nvmlPcieLinkState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Request the OS and the NVIDIA kernel driver to rediscover a portion of the PCI subsystem looking for GPUs that\n were previously removed. The portion of the PCI tree can be narrowed by specifying a domain, bus, and device.\n If all are zeroes then the entire PCI tree will be searched.  Please note that for long-running NVML processes\n the enumeration will change based on how many GPUs are discovered and where they are inserted in bus order.\n\n In addition, all newly discovered GPUs will be initialized and their ECC scrubbed which may take several seconds\n per GPU. Also, all device handles are no longer guaranteed to be valid post discovery.\n\n Must be run as administrator.\n For Linux only.\n\n For Pascal &tm; or newer fully supported devices.\n Some Kepler devices supported.\n\n @param pciInfo                              The PCI tree to be searched.  Only the domain, bus, and device\n                                             fields are used in this call.\n\n @return\n         - \\ref NVML_SUCCESS                 if counters were successfully reset\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a pciInfo is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the operating system does not support this feature\n         - \\ref NVML_ERROR_OPERATING_SYSTEM  if the operating system is denying this feature\n         - \\ref NVML_ERROR_NO_PERMISSION     if the calling process has insufficient permissions to perform operation\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceDiscoverGpus(\n        pciInfo: *mut cuda_types::nvml::nvmlPciInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Request values for a list of fields for a device. This API allows multiple fields to be queried at once.\n If any of the underlying fieldIds are populated by the same driver call, the results for those field IDs\n will be populated from a single call rather than making a driver call for each fieldId.\n\n @param device                               The device handle of the GPU to request field values for\n @param valuesCount                          Number of entries in values that should be retrieved\n @param values                               Array of \\a valuesCount structures to hold field values.\n                                             Each value's fieldId must be populated prior to this call\n\n @return\n         - \\ref NVML_SUCCESS                 if any values in \\a values were populated. Note that you must\n                                             check the nvmlReturn field of each value for each individual\n                                             status\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a values is NULL*/\n    fn nvmlDeviceGetFieldValues(\n        device: cuda_types::nvml::nvmlDevice_t,\n        valuesCount: ::core::ffi::c_int,\n        values: *mut cuda_types::nvml::nvmlFieldValue_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Clear values for a list of fields for a device. This API allows multiple fields to be cleared at once.\n\n @param device                               The device handle of the GPU to request field values for\n @param valuesCount                          Number of entries in values that should be cleared\n @param values                               Array of \\a valuesCount structures to hold field values.\n                                             Each value's fieldId must be populated prior to this call\n\n @return\n         - \\ref NVML_SUCCESS                 if any values in \\a values were cleared. Note that you must\n                                             check the nvmlReturn field of each value for each individual\n                                             status\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid or \\a values is NULL*/\n    fn nvmlDeviceClearFieldValues(\n        device: cuda_types::nvml::nvmlDevice_t,\n        valuesCount: ::core::ffi::c_int,\n        values: *mut cuda_types::nvml::nvmlFieldValue_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** This method is used to get the virtualization mode corresponding to the GPU.\n\n For Kepler &tm; or newer fully supported devices.\n\n @param device                    Identifier of the target device\n @param pVirtualMode              Reference to virtualization mode. One of NVML_GPU_VIRTUALIZATION_?\n\n @return\n         - \\ref NVML_SUCCESS                  if \\a pVirtualMode is fetched\n         - \\ref NVML_ERROR_UNINITIALIZED      if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT   if \\a device is invalid or \\a pVirtualMode is NULL\n         - \\ref NVML_ERROR_GPU_IS_LOST        if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN            on any unexpected error*/\n    fn nvmlDeviceGetVirtualizationMode(\n        device: cuda_types::nvml::nvmlDevice_t,\n        pVirtualMode: *mut cuda_types::nvml::nvmlGpuVirtualizationMode_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Queries if SR-IOV host operation is supported on a vGPU supported device.\n\n Checks whether SR-IOV host capability is supported by the device and the\n driver, and indicates device is in SR-IOV mode if both of these conditions\n are true.\n\n @param device                                The identifier of the target device\n @param pHostVgpuMode                         Reference in which to return the current vGPU mode\n\n @return\n         - \\ref NVML_SUCCESS                  if device's vGPU mode has been successfully retrieved\n         - \\ref NVML_ERROR_INVALID_ARGUMENT   if \\a device handle is 0 or \\a pVgpuMode is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED      if \\a device doesn't support this feature.\n         - \\ref NVML_ERROR_UNKNOWN            if any unexpected error occurred*/\n    fn nvmlDeviceGetHostVgpuMode(\n        device: cuda_types::nvml::nvmlDevice_t,\n        pHostVgpuMode: *mut cuda_types::nvml::nvmlHostVgpuMode_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** This method is used to set the virtualization mode corresponding to the GPU.\n\n For Kepler &tm; or newer fully supported devices.\n\n @param device                    Identifier of the target device\n @param virtualMode               virtualization mode. One of NVML_GPU_VIRTUALIZATION_?\n\n @return\n         - \\ref NVML_SUCCESS                  if \\a virtualMode is set\n         - \\ref NVML_ERROR_UNINITIALIZED      if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT   if \\a device is invalid or \\a virtualMode is NULL\n         - \\ref NVML_ERROR_GPU_IS_LOST        if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_NOT_SUPPORTED      if setting of virtualization mode is not supported.\n         - \\ref NVML_ERROR_NO_PERMISSION      if setting of virtualization mode is not allowed for this client.*/\n    fn nvmlDeviceSetVirtualizationMode(\n        device: cuda_types::nvml::nvmlDevice_t,\n        virtualMode: cuda_types::nvml::nvmlGpuVirtualizationMode_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get the vGPU heterogeneous mode for the device.\n\n When in heterogeneous mode, a vGPU can concurrently host timesliced vGPUs with differing framebuffer sizes.\n\n On successful return, the function returns \\a pHeterogeneousMode->mode with the current vGPU heterogeneous mode.\n \\a pHeterogeneousMode->version is the version number of the structure nvmlVgpuHeterogeneousMode_t, the caller should\n set the correct version number to retrieve the vGPU heterogeneous mode.\n \\a pHeterogeneousMode->mode can either be \\ref NVML_FEATURE_ENABLED or \\ref NVML_FEATURE_DISABLED.\n\n @param device                               The identifier of the target device\n @param pHeterogeneousMode                   Pointer to the caller-provided structure of nvmlVgpuHeterogeneousMode_t\n\n @return\n         - \\ref NVML_SUCCESS                          Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED              If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT           If \\a device is invalid or \\a pHeterogeneousMode is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED              If MIG is enabled or \\a device doesn't support this feature\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH  If the version of \\a pHeterogeneousMode is invalid\n         - \\ref NVML_ERROR_UNKNOWN                    On any unexpected error*/\n    fn nvmlDeviceGetVgpuHeterogeneousMode(\n        device: cuda_types::nvml::nvmlDevice_t,\n        pHeterogeneousMode: *mut cuda_types::nvml::nvmlVgpuHeterogeneousMode_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Enable or disable vGPU heterogeneous mode for the device.\n\n When in heterogeneous mode, a vGPU can concurrently host timesliced vGPUs with differing framebuffer sizes.\n\n API would return an appropriate error code upon unsuccessful activation. For example, the heterogeneous mode\n set will fail with error \\ref NVML_ERROR_IN_USE if any vGPU instance is active on the device. The caller of this API\n is expected to shutdown the vGPU VMs and retry setting the \\a mode.\n On KVM platform, setting heterogeneous mode is allowed, if no MDEV device is created on the device, else will fail\n with same error \\ref NVML_ERROR_IN_USE.\n On successful return, the function updates the vGPU heterogeneous mode with the user provided \\a pHeterogeneousMode->mode.\n \\a pHeterogeneousMode->version is the version number of the structure nvmlVgpuHeterogeneousMode_t, the caller should\n set the correct version number to set the vGPU heterogeneous mode.\n\n @param device                               Identifier of the target device\n @param pHeterogeneousMode                   Pointer to the caller-provided structure of nvmlVgpuHeterogeneousMode_t\n\n @return\n         - \\ref NVML_SUCCESS                          Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED              If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT           If \\a device or \\a pHeterogeneousMode is NULL or \\a pHeterogeneousMode->mode is invalid\n         - \\ref NVML_ERROR_IN_USE                     If the \\a device is in use\n         - \\ref NVML_ERROR_NO_PERMISSION              If user doesn't have permission to perform the operation\n         - \\ref NVML_ERROR_NOT_SUPPORTED              If MIG is enabled or \\a device doesn't support this feature\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH  If the version of \\a pHeterogeneousMode is invalid\n         - \\ref NVML_ERROR_UNKNOWN                    On any unexpected error*/\n    fn nvmlDeviceSetVgpuHeterogeneousMode(\n        device: cuda_types::nvml::nvmlDevice_t,\n        pHeterogeneousMode: *const cuda_types::nvml::nvmlVgpuHeterogeneousMode_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Query the placement ID of active vGPU instance.\n\n When in vGPU heterogeneous mode, this function returns a valid placement ID as \\a pPlacement->placementId\n else NVML_INVALID_VGPU_PLACEMENT_ID is returned.\n \\a pPlacement->version is the version number of the structure nvmlVgpuPlacementId_t, the caller should\n set the correct version number to get placement id of the vGPU instance \\a vgpuInstance.\n\n @param vgpuInstance                         Identifier of the target vGPU instance\n @param pPlacement                           Pointer to vGPU placement ID structure \\a nvmlVgpuPlacementId_t\n\n @return\n         - \\ref NVML_SUCCESS                          If information is successfully retrieved\n         - \\ref NVML_ERROR_NOT_FOUND                  If \\a vgpuInstance does not match a valid active vGPU instance\n         - \\ref NVML_ERROR_INVALID_ARGUMENT           If \\a vgpuInstance is invalid or \\a pPlacement is NULL\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH  If the version of \\a pPlacement is invalid\n         - \\ref NVML_ERROR_UNKNOWN                    On any unexpected error*/\n    fn nvmlVgpuInstanceGetPlacementId(\n        vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n        pPlacement: *mut cuda_types::nvml::nvmlVgpuPlacementId_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Query the supported vGPU placement ID of the vGPU type.\n\n The function returns an array of supported vGPU placement IDs for the specified vGPU type ID in the buffer provided\n by the caller at \\a pPlacementList->placementIds. The required memory for the placementIds array must be allocated\n based on the maximum number of vGPU type instances, which is retrievable through \\ref nvmlVgpuTypeGetMaxInstances().\n If the provided count by the caller is insufficient, the function will return NVML_ERROR_INSUFFICIENT_SIZE along with\n the number of required entries in \\a pPlacementList->count. The caller should then reallocate a buffer with the size\n of pPlacementList->count * sizeof(pPlacementList->placementIds) and invoke the function again.\n\n To obtain a list of homogeneous placement IDs, the caller needs to set \\a pPlacementList->mode to NVML_VGPU_PGPU_HOMOGENEOUS_MODE.\n For heterogeneous placement IDs, \\a pPlacementList->mode should be set to NVML_VGPU_PGPU_HETEROGENEOUS_MODE.\n By default, a list of heterogeneous placement IDs is returned.\n\n @param device                               Identifier of the target device\n @param vgpuTypeId                           Handle to vGPU type. The vGPU type ID\n @param pPlacementList                       Pointer to the vGPU placement structure \\a nvmlVgpuPlacementList_t\n\n @return\n         - \\ref NVML_SUCCESS                          Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED              If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT           If \\a device or \\a vgpuTypeId is invalid or \\a pPlacementList is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED              If \\a device or \\a vgpuTypeId isn't supported\n         - \\ref NVML_ERROR_NO_PERMISSION              If user doesn't have permission to perform the operation\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH  If the version of \\a pPlacementList is invalid\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE          If the buffer is small, element count is returned in \\a pPlacementList->count\n         - \\ref NVML_ERROR_UNKNOWN                    On any unexpected error*/\n    fn nvmlDeviceGetVgpuTypeSupportedPlacements(\n        device: cuda_types::nvml::nvmlDevice_t,\n        vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n        pPlacementList: *mut cuda_types::nvml::nvmlVgpuPlacementList_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Query the creatable vGPU placement ID of the vGPU type.\n\n An array of creatable vGPU placement IDs for the vGPU type ID indicated by \\a vgpuTypeId is returned in the\n caller-supplied buffer of \\a pPlacementList->placementIds. Memory needed for the placementIds array should be\n allocated based on maximum instances of a vGPU type which can be queried via \\ref nvmlVgpuTypeGetMaxInstances().\n If the provided count by the caller is insufficient, the function will return NVML_ERROR_INSUFFICIENT_SIZE along with\n the number of required entries in \\a pPlacementList->count. The caller should then reallocate a buffer with the size\n of pPlacementList->count * sizeof(pPlacementList->placementIds) and invoke the function again.\n\n The creatable vGPU placement IDs may differ over time, as there may be restrictions on what type of vGPU the\n vGPU instance is running.\n\n @param device                               The identifier of the target device\n @param vgpuTypeId                           Handle to vGPU type. The vGPU type ID\n @param pPlacementList                       Pointer to the list of vGPU placement structure \\a nvmlVgpuPlacementList_t\n\n @return\n         - \\ref NVML_SUCCESS                          Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED              If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT           If \\a device or \\a vgpuTypeId is invalid or \\a pPlacementList is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED              If MIG is enabled or \\a device or \\a vgpuTypeId isn't supported\n         - \\ref NVML_ERROR_NO_PERMISSION              If user doesn't have permission to perform the operation\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH  If the version of \\a pPlacementList is invalid\n         - \\ref NVML_ERROR_UNKNOWN                    On any unexpected error*/\n    fn nvmlDeviceGetVgpuTypeCreatablePlacements(\n        device: cuda_types::nvml::nvmlDevice_t,\n        vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n        pPlacementList: *mut cuda_types::nvml::nvmlVgpuPlacementList_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the static GSP heap size of the vGPU type in bytes\n\n @param vgpuTypeId                           Handle to vGPU type\n @param gspHeapSize                          Reference to return the GSP heap size value\n @return\n         - \\ref NVML_SUCCESS                 Successful completion\n         - \\ref NVML_ERROR_UNINITIALIZED     If the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  If \\a vgpuTypeId is invalid, or \\a gspHeapSize is NULL\n         - \\ref NVML_ERROR_UNKNOWN           On any unexpected error*/\n    fn nvmlVgpuTypeGetGspHeapSize(\n        vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n        gspHeapSize: *mut ::core::ffi::c_ulonglong,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the static framebuffer reservation of the vGPU type in bytes\n\n @param vgpuTypeId                           Handle to vGPU type\n @param fbReservation                        Reference to return the framebuffer reservation\n @return\n         - \\ref NVML_SUCCESS                 Successful completion\n         - \\ref NVML_ERROR_UNINITIALIZED     If the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  If \\a vgpuTypeId is invalid, or \\a fbReservation is NULL\n         - \\ref NVML_ERROR_UNKNOWN           On any unexpected error*/\n    fn nvmlVgpuTypeGetFbReservation(\n        vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n        fbReservation: *mut ::core::ffi::c_ulonglong,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the currently used runtime state size of the vGPU instance\n\n This size represents the maximum in-memory data size utilized by a vGPU instance during standard operation.\n This measurement is exclusive of frame buffer (FB) data size assigned to the vGPU instance.\n\n For Maxwell &tm; or newer fully supported devices.\n\n @param vgpuInstance                         Identifier of the target vGPU instance\n @param pState                               Pointer to the vGPU runtime state's structure \\a nvmlVgpuRuntimeState_t\n\n @return\n         - \\ref NVML_SUCCESS                          If information is successfully retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED              If the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT           If \\a vgpuInstance is invalid, or \\a pState is NULL\n         - \\ref NVML_ERROR_NOT_FOUND                  If \\a vgpuInstance does not match a valid active vGPU instance on the system\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH  If the version of \\a pState is invalid\n         - \\ref NVML_ERROR_UNKNOWN                    On any unexpected error*/\n    fn nvmlVgpuInstanceGetRuntimeStateSize(\n        vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n        pState: *mut cuda_types::nvml::nvmlVgpuRuntimeState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Set the desirable vGPU capability of a device\n\n Refer to the \\a nvmlDeviceVgpuCapability_t structure for the specific capabilities that can be set.\n See \\ref nvmlEnableState_t for available state.\n\n @param device                               The identifier of the target device\n @param capability                           Specifies the \\a nvmlDeviceVgpuCapability_t to be set\n @param state                                The target capability mode\n\n @return\n      - \\ref NVML_SUCCESS                    Successful completion\n      - \\ref NVML_ERROR_UNINITIALIZED        If the library has not been successfully initialized\n      - \\ref NVML_ERROR_INVALID_ARGUMENT     If \\a device is invalid, or \\a capability is invalid, or \\a state is invalid\n      - \\ref NVML_ERROR_NOT_SUPPORTED        The API is not supported in current state, or \\a device not in vGPU mode\n      - \\ref NVML_ERROR_UNKNOWN              On any unexpected error*/\n    fn nvmlDeviceSetVgpuCapabilities(\n        device: cuda_types::nvml::nvmlDevice_t,\n        capability: cuda_types::nvml::nvmlDeviceVgpuCapability_t,\n        state: cuda_types::nvml::nvmlEnableState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the vGPU Software licensable features.\n\n Identifies whether the system supports vGPU Software Licensing. If it does, return the list of licensable feature(s)\n and their current license status.\n\n @param device                    Identifier of the target device\n @param pGridLicensableFeatures   Pointer to structure in which vGPU software licensable features are returned\n\n @return\n         - \\ref NVML_SUCCESS                 if licensable features are successfully retrieved\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a pGridLicensableFeatures is NULL\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetGridLicensableFeatures_v4(\n        device: cuda_types::nvml::nvmlDevice_t,\n        pGridLicensableFeatures: *mut cuda_types::nvml::nvmlGridLicensableFeatures_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the requested vGPU driver capability.\n\n Refer to the \\a nvmlVgpuDriverCapability_t structure for the specific capabilities that can be queried.\n The return value in \\a capResult should be treated as a boolean, with a non-zero value indicating that the capability\n is supported.\n\n For Maxwell &tm; or newer fully supported devices.\n\n @param capability      Specifies the \\a nvmlVgpuDriverCapability_t to be queried\n @param capResult       A boolean for the queried capability indicating that feature is supported\n\n @return\n      - \\ref NVML_SUCCESS                      successful completion\n      - \\ref NVML_ERROR_UNINITIALIZED          if the library has not been successfully initialized\n      - \\ref NVML_ERROR_INVALID_ARGUMENT       if \\a capability is invalid, or \\a capResult is NULL\n      - \\ref NVML_ERROR_NOT_SUPPORTED          the API is not supported in current state or \\a devices not in vGPU mode\n      - \\ref NVML_ERROR_UNKNOWN                on any unexpected error*/\n    fn nvmlGetVgpuDriverCapabilities(\n        capability: cuda_types::nvml::nvmlVgpuDriverCapability_t,\n        capResult: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the requested vGPU capability for GPU.\n\n Refer to the \\a nvmlDeviceVgpuCapability_t structure for the specific capabilities that can be queried.\n The return value in \\a capResult reports a non-zero value indicating that the capability\n is supported, and also reports the capability's data based on the queried capability.\n\n For Maxwell &tm; or newer fully supported devices.\n\n @param device     The identifier of the target device\n @param capability Specifies the \\a nvmlDeviceVgpuCapability_t to be queried\n @param capResult  Specifies that the queried capability is supported, and also returns capability's data\n\n @return\n      - \\ref NVML_SUCCESS                      successful completion\n      - \\ref NVML_ERROR_UNINITIALIZED          if the library has not been successfully initialized\n      - \\ref NVML_ERROR_INVALID_ARGUMENT       if \\a device is invalid, or \\a capability is invalid, or \\a capResult is NULL\n      - \\ref NVML_ERROR_NOT_SUPPORTED          the API is not supported in current state or \\a device not in vGPU mode\n      - \\ref NVML_ERROR_UNKNOWN                on any unexpected error*/\n    fn nvmlDeviceGetVgpuCapabilities(\n        device: cuda_types::nvml::nvmlDevice_t,\n        capability: cuda_types::nvml::nvmlDeviceVgpuCapability_t,\n        capResult: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the supported vGPU types on a physical GPU (device).\n\n An array of supported vGPU types for the physical GPU indicated by \\a device is returned in the caller-supplied buffer\n pointed at by \\a vgpuTypeIds. The element count of nvmlVgpuTypeId_t array is passed in \\a vgpuCount, and \\a vgpuCount\n is used to return the number of vGPU types written to the buffer.\n\n If the supplied buffer is not large enough to accommodate the vGPU type array, the function returns\n NVML_ERROR_INSUFFICIENT_SIZE, with the element count of nvmlVgpuTypeId_t array required in \\a vgpuCount.\n To query the number of vGPU types supported for the GPU, call this function with *vgpuCount = 0.\n The code will return NVML_ERROR_INSUFFICIENT_SIZE, or NVML_SUCCESS if no vGPU types are supported.\n\n @param device                   The identifier of the target device\n @param vgpuCount                Pointer to caller-supplied array size, and returns number of vGPU types\n @param vgpuTypeIds              Pointer to caller-supplied array in which to return list of vGPU types\n\n @return\n         - \\ref NVML_SUCCESS                      successful completion\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE      \\a vgpuTypeIds buffer is too small, array element count is returned in \\a vgpuCount\n         - \\ref NVML_ERROR_INVALID_ARGUMENT       if \\a vgpuCount is NULL or \\a device is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED          if vGPU is not supported by the device\n         - \\ref NVML_ERROR_UNKNOWN                on any unexpected error*/\n    fn nvmlDeviceGetSupportedVgpus(\n        device: cuda_types::nvml::nvmlDevice_t,\n        vgpuCount: *mut ::core::ffi::c_uint,\n        vgpuTypeIds: *mut cuda_types::nvml::nvmlVgpuTypeId_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the currently creatable vGPU types on a physical GPU (device).\n\n An array of creatable vGPU types for the physical GPU indicated by \\a device is returned in the caller-supplied buffer\n pointed at by \\a vgpuTypeIds. The element count of nvmlVgpuTypeId_t array is passed in \\a vgpuCount, and \\a vgpuCount\n is used to return the number of vGPU types written to the buffer.\n\n The creatable vGPU types for a device may differ over time, as there may be restrictions on what type of vGPU types\n can concurrently run on a device.  For example, if only one vGPU type is allowed at a time on a device, then the creatable\n list will be restricted to whatever vGPU type is already running on the device.\n\n If the supplied buffer is not large enough to accommodate the vGPU type array, the function returns\n NVML_ERROR_INSUFFICIENT_SIZE, with the element count of nvmlVgpuTypeId_t array required in \\a vgpuCount.\n To query the number of vGPU types that can be created for the GPU, call this function with *vgpuCount = 0.\n The code will return NVML_ERROR_INSUFFICIENT_SIZE, or NVML_SUCCESS if no vGPU types are creatable.\n\n @param device                   The identifier of the target device\n @param vgpuCount                Pointer to caller-supplied array size, and returns number of vGPU types\n @param vgpuTypeIds              Pointer to caller-supplied array in which to return list of vGPU types\n\n @return\n         - \\ref NVML_SUCCESS                      successful completion\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE      \\a vgpuTypeIds buffer is too small, array element count is returned in \\a vgpuCount\n         - \\ref NVML_ERROR_INVALID_ARGUMENT       if \\a vgpuCount is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED          if vGPU is not supported by the device\n         - \\ref NVML_ERROR_UNKNOWN                on any unexpected error*/\n    fn nvmlDeviceGetCreatableVgpus(\n        device: cuda_types::nvml::nvmlDevice_t,\n        vgpuCount: *mut ::core::ffi::c_uint,\n        vgpuTypeIds: *mut cuda_types::nvml::nvmlVgpuTypeId_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the class of a vGPU type. It will not exceed 64 characters in length (including the NUL terminator).\n See \\ref nvmlConstants::NVML_DEVICE_NAME_BUFFER_SIZE.\n\n For Kepler &tm; or newer fully supported devices.\n\n @param vgpuTypeId               Handle to vGPU type\n @param vgpuTypeClass            Pointer to string array to return class in\n @param size                     Size of string\n\n @return\n         - \\ref NVML_SUCCESS                   successful completion\n         - \\ref NVML_ERROR_INVALID_ARGUMENT    if \\a vgpuTypeId is invalid, or \\a vgpuTypeClass is NULL\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE   if \\a size is too small\n         - \\ref NVML_ERROR_UNKNOWN             on any unexpected error*/\n    fn nvmlVgpuTypeGetClass(\n        vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n        vgpuTypeClass: *mut ::core::ffi::c_char,\n        size: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the vGPU type name.\n\n The name is an alphanumeric string that denotes a particular vGPU, e.g. GRID M60-2Q. It will not\n exceed 64 characters in length (including the NUL terminator).  See \\ref\n nvmlConstants::NVML_DEVICE_NAME_BUFFER_SIZE.\n\n For Kepler &tm; or newer fully supported devices.\n\n @param vgpuTypeId               Handle to vGPU type\n @param vgpuTypeName             Pointer to buffer to return name\n @param size                     Size of buffer\n\n @return\n         - \\ref NVML_SUCCESS                 successful completion\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vgpuTypeId is invalid, or \\a name is NULL\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a size is too small\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlVgpuTypeGetName(\n        vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n        vgpuTypeName: *mut ::core::ffi::c_char,\n        size: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the GPU Instance Profile ID for the given vGPU type ID.\n The API will return a valid GPU Instance Profile ID for the MIG capable vGPU types, else INVALID_GPU_INSTANCE_PROFILE_ID is\n returned.\n\n For Kepler &tm; or newer fully supported devices.\n\n @param vgpuTypeId               Handle to vGPU type\n @param gpuInstanceProfileId     GPU Instance Profile ID\n\n @return\n         - \\ref NVML_SUCCESS                 successful completion\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if \\a device is not in vGPU Host virtualization mode\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vgpuTypeId is invalid, or \\a gpuInstanceProfileId is NULL\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlVgpuTypeGetGpuInstanceProfileId(\n        vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n        gpuInstanceProfileId: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the device ID of a vGPU type.\n\n For Kepler &tm; or newer fully supported devices.\n\n @param vgpuTypeId               Handle to vGPU type\n @param deviceID                 Device ID and vendor ID of the device contained in single 32 bit value\n @param subsystemID              Subsystem ID and subsystem vendor ID of the device contained in single 32 bit value\n\n @return\n         - \\ref NVML_SUCCESS                 successful completion\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vgpuTypeId is invalid, or \\a deviceId or \\a subsystemID are NULL\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlVgpuTypeGetDeviceID(\n        vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n        deviceID: *mut ::core::ffi::c_ulonglong,\n        subsystemID: *mut ::core::ffi::c_ulonglong,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the vGPU framebuffer size in bytes.\n\n For Kepler &tm; or newer fully supported devices.\n\n @param vgpuTypeId               Handle to vGPU type\n @param fbSize                   Pointer to framebuffer size in bytes\n\n @return\n         - \\ref NVML_SUCCESS                 successful completion\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vgpuTypeId is invalid, or \\a fbSize is NULL\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlVgpuTypeGetFramebufferSize(\n        vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n        fbSize: *mut ::core::ffi::c_ulonglong,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve count of vGPU's supported display heads.\n\n For Kepler &tm; or newer fully supported devices.\n\n @param vgpuTypeId               Handle to vGPU type\n @param numDisplayHeads          Pointer to number of display heads\n\n @return\n         - \\ref NVML_SUCCESS                 successful completion\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vgpuTypeId is invalid, or \\a numDisplayHeads is NULL\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlVgpuTypeGetNumDisplayHeads(\n        vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n        numDisplayHeads: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve vGPU display head's maximum supported resolution.\n\n For Kepler &tm; or newer fully supported devices.\n\n @param vgpuTypeId               Handle to vGPU type\n @param displayIndex             Zero-based index of display head\n @param xdim                     Pointer to maximum number of pixels in X dimension\n @param ydim                     Pointer to maximum number of pixels in Y dimension\n\n @return\n         - \\ref NVML_SUCCESS                 successful completion\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vgpuTypeId is invalid, or \\a xdim or \\a ydim are NULL, or \\a displayIndex\n                                             is out of range.\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlVgpuTypeGetResolution(\n        vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n        displayIndex: ::core::ffi::c_uint,\n        xdim: *mut ::core::ffi::c_uint,\n        ydim: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve license requirements for a vGPU type\n\n The license type and version required to run the specified vGPU type is returned as an alphanumeric string, in the form\n \"<license name>,<version>\", for example \"GRID-Virtual-PC,2.0\". If a vGPU is runnable with* more than one type of license,\n the licenses are delimited by a semicolon, for example \"GRID-Virtual-PC,2.0;GRID-Virtual-WS,2.0;GRID-Virtual-WS-Ext,2.0\".\n\n The total length of the returned string will not exceed 128 characters, including the NUL terminator.\n See \\ref nvmlVgpuConstants::NVML_GRID_LICENSE_BUFFER_SIZE.\n\n For Kepler &tm; or newer fully supported devices.\n\n @param vgpuTypeId               Handle to vGPU type\n @param vgpuTypeLicenseString    Pointer to buffer to return license info\n @param size                     Size of \\a vgpuTypeLicenseString buffer\n\n @return\n         - \\ref NVML_SUCCESS                 successful completion\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vgpuTypeId is invalid, or \\a vgpuTypeLicenseString is NULL\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a size is too small\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlVgpuTypeGetLicense(\n        vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n        vgpuTypeLicenseString: *mut ::core::ffi::c_char,\n        size: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the static frame rate limit value of the vGPU type\n\n For Kepler &tm; or newer fully supported devices.\n\n @param vgpuTypeId               Handle to vGPU type\n @param frameRateLimit           Reference to return the frame rate limit value\n @return\n         - \\ref NVML_SUCCESS                 successful completion\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if frame rate limiter is turned off for the vGPU type\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vgpuTypeId is invalid, or \\a frameRateLimit is NULL\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlVgpuTypeGetFrameRateLimit(\n        vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n        frameRateLimit: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the maximum number of vGPU instances creatable on a device for given vGPU type\n\n For Kepler &tm; or newer fully supported devices.\n\n @param device                   The identifier of the target device\n @param vgpuTypeId               Handle to vGPU type\n @param vgpuInstanceCount        Pointer to get the max number of vGPU instances\n                                 that can be created on a deicve for given vgpuTypeId\n @return\n         - \\ref NVML_SUCCESS                 successful completion\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vgpuTypeId is invalid or is not supported on target device,\n                                             or \\a vgpuInstanceCount is NULL\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlVgpuTypeGetMaxInstances(\n        device: cuda_types::nvml::nvmlDevice_t,\n        vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n        vgpuInstanceCount: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the maximum number of vGPU instances supported per VM for given vGPU type\n\n For Kepler &tm; or newer fully supported devices.\n\n @param vgpuTypeId               Handle to vGPU type\n @param vgpuInstanceCountPerVm   Pointer to get the max number of vGPU instances supported per VM for given \\a vgpuTypeId\n @return\n         - \\ref NVML_SUCCESS                 successful completion\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vgpuTypeId is invalid, or \\a vgpuInstanceCountPerVm is NULL\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlVgpuTypeGetMaxInstancesPerVm(\n        vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n        vgpuInstanceCountPerVm: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the BAR1 info for given vGPU type.\n\n For Maxwell &tm; or newer fully supported devices.\n\n @param vgpuTypeId               Handle to vGPU type\n @param bar1Info                 Pointer to the vGPU type BAR1 information structure \\a nvmlVgpuTypeBar1Info_t\n\n @return\n         - \\ref NVML_SUCCESS                 successful completion\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vgpuTypeId is invalid, or \\a bar1Info is NULL\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlVgpuTypeGetBAR1Info(\n        vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n        bar1Info: *mut cuda_types::nvml::nvmlVgpuTypeBar1Info_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the active vGPU instances on a device.\n\n An array of active vGPU instances is returned in the caller-supplied buffer pointed at by \\a vgpuInstances. The\n array element count is passed in \\a vgpuCount, and \\a vgpuCount is used to return the number of vGPU instances\n written to the buffer.\n\n If the supplied buffer is not large enough to accommodate the vGPU instance array, the function returns\n NVML_ERROR_INSUFFICIENT_SIZE, with the element count of nvmlVgpuInstance_t array required in \\a vgpuCount.\n To query the number of active vGPU instances, call this function with *vgpuCount = 0.  The code will return\n NVML_ERROR_INSUFFICIENT_SIZE, or NVML_SUCCESS if no vGPU Types are supported.\n\n For Kepler &tm; or newer fully supported devices.\n\n @param device                   The identifier of the target device\n @param vgpuCount                Pointer which passes in the array size as well as get\n                                 back the number of types\n @param vgpuInstances            Pointer to array in which to return list of vGPU instances\n\n @return\n         - \\ref NVML_SUCCESS                  successful completion\n         - \\ref NVML_ERROR_UNINITIALIZED      if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT   if \\a device is invalid, or \\a vgpuCount is NULL\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE  if \\a size is too small\n         - \\ref NVML_ERROR_NOT_SUPPORTED      if vGPU is not supported by the device\n         - \\ref NVML_ERROR_UNKNOWN            on any unexpected error*/\n    fn nvmlDeviceGetActiveVgpus(\n        device: cuda_types::nvml::nvmlDevice_t,\n        vgpuCount: *mut ::core::ffi::c_uint,\n        vgpuInstances: *mut cuda_types::nvml::nvmlVgpuInstance_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the VM ID associated with a vGPU instance.\n\n The VM ID is returned as a string, not exceeding 80 characters in length (including the NUL terminator).\n See \\ref nvmlConstants::NVML_DEVICE_UUID_BUFFER_SIZE.\n\n The format of the VM ID varies by platform, and is indicated by the type identifier returned in \\a vmIdType.\n\n For Kepler &tm; or newer fully supported devices.\n\n @param vgpuInstance             Identifier of the target vGPU instance\n @param vmId                     Pointer to caller-supplied buffer to hold VM ID\n @param size                     Size of buffer in bytes\n @param vmIdType                 Pointer to hold VM ID type\n\n @return\n         - \\ref NVML_SUCCESS                 successful completion\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vmId or \\a vmIdType is NULL, or \\a vgpuInstance is 0\n         - \\ref NVML_ERROR_NOT_FOUND         if \\a vgpuInstance does not match a valid active vGPU instance on the system\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a size is too small\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlVgpuInstanceGetVmID(\n        vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n        vmId: *mut ::core::ffi::c_char,\n        size: ::core::ffi::c_uint,\n        vmIdType: *mut cuda_types::nvml::nvmlVgpuVmIdType_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the UUID of a vGPU instance.\n\n The UUID is a globally unique identifier associated with the vGPU, and is returned as a 5-part hexadecimal string,\n not exceeding 80 characters in length (including the NULL terminator).\n See \\ref nvmlConstants::NVML_DEVICE_UUID_BUFFER_SIZE.\n\n For Kepler &tm; or newer fully supported devices.\n\n @param vgpuInstance             Identifier of the target vGPU instance\n @param uuid                     Pointer to caller-supplied buffer to hold vGPU UUID\n @param size                     Size of buffer in bytes\n\n @return\n         - \\ref NVML_SUCCESS                 successful completion\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vgpuInstance is 0, or \\a uuid is NULL\n         - \\ref NVML_ERROR_NOT_FOUND         if \\a vgpuInstance does not match a valid active vGPU instance on the system\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a size is too small\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlVgpuInstanceGetUUID(\n        vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n        uuid: *mut ::core::ffi::c_char,\n        size: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the NVIDIA driver version installed in the VM associated with a vGPU.\n\n The version is returned as an alphanumeric string in the caller-supplied buffer \\a version. The length of the version\n string will not exceed 80 characters in length (including the NUL terminator).\n See \\ref nvmlConstants::NVML_SYSTEM_DRIVER_VERSION_BUFFER_SIZE.\n\n nvmlVgpuInstanceGetVmDriverVersion() may be called at any time for a vGPU instance. The guest VM driver version is\n returned as \"Not Available\" if no NVIDIA driver is installed in the VM, or the VM has not yet booted to the point where the\n NVIDIA driver is loaded and initialized.\n\n For Kepler &tm; or newer fully supported devices.\n\n @param vgpuInstance             Identifier of the target vGPU instance\n @param version                  Caller-supplied buffer to return driver version string\n @param length                   Size of \\a version buffer\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a version has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vgpuInstance is 0\n         - \\ref NVML_ERROR_NOT_FOUND         if \\a vgpuInstance does not match a valid active vGPU instance on the system\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a length is too small\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlVgpuInstanceGetVmDriverVersion(\n        vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n        version: *mut ::core::ffi::c_char,\n        length: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the framebuffer usage in bytes.\n\n Framebuffer usage is the amont of vGPU framebuffer memory that is currently in use by the VM.\n\n For Kepler &tm; or newer fully supported devices.\n\n @param vgpuInstance             The identifier of the target instance\n @param fbUsage                  Pointer to framebuffer usage in bytes\n\n @return\n         - \\ref NVML_SUCCESS                 successful completion\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vgpuInstance is 0, or \\a fbUsage is NULL\n         - \\ref NVML_ERROR_NOT_FOUND         if \\a vgpuInstance does not match a valid active vGPU instance on the system\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlVgpuInstanceGetFbUsage(\n        vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n        fbUsage: *mut ::core::ffi::c_ulonglong,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** @deprecated Use \\ref nvmlVgpuInstanceGetLicenseInfo_v2.\n\n Retrieve the current licensing state of the vGPU instance.\n\n If the vGPU is currently licensed, \\a licensed is set to 1, otherwise it is set to 0.\n\n For Kepler &tm; or newer fully supported devices.\n\n @param vgpuInstance             Identifier of the target vGPU instance\n @param licensed                 Reference to return the licensing status\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a licensed has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vgpuInstance is 0, or \\a licensed is NULL\n         - \\ref NVML_ERROR_NOT_FOUND         if \\a vgpuInstance does not match a valid active vGPU instance on the system\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlVgpuInstanceGetLicenseStatus(\n        vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n        licensed: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the vGPU type of a vGPU instance.\n\n Returns the vGPU type ID of vgpu assigned to the vGPU instance.\n\n For Kepler &tm; or newer fully supported devices.\n\n @param vgpuInstance             Identifier of the target vGPU instance\n @param vgpuTypeId               Reference to return the vgpuTypeId\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a vgpuTypeId has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vgpuInstance is 0, or \\a vgpuTypeId is NULL\n         - \\ref NVML_ERROR_NOT_FOUND         if \\a vgpuInstance does not match a valid active vGPU instance on the system\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlVgpuInstanceGetType(\n        vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n        vgpuTypeId: *mut cuda_types::nvml::nvmlVgpuTypeId_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the frame rate limit set for the vGPU instance.\n\n Returns the value of the frame rate limit set for the vGPU instance\n\n For Kepler &tm; or newer fully supported devices.\n\n @param vgpuInstance             Identifier of the target vGPU instance\n @param frameRateLimit           Reference to return the frame rate limit\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a frameRateLimit has been set\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if frame rate limiter is turned off for the vGPU type\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vgpuInstance is 0, or \\a frameRateLimit is NULL\n         - \\ref NVML_ERROR_NOT_FOUND         if \\a vgpuInstance does not match a valid active vGPU instance on the system\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlVgpuInstanceGetFrameRateLimit(\n        vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n        frameRateLimit: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the current ECC mode of vGPU instance.\n\n @param vgpuInstance            The identifier of the target vGPU instance\n @param eccMode                 Reference in which to return the current ECC mode\n\n @return\n         - \\ref NVML_SUCCESS                 if the vgpuInstance's ECC mode has been successfully retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vgpuInstance is 0, or \\a mode is NULL\n         - \\ref NVML_ERROR_NOT_FOUND         if \\a vgpuInstance does not match a valid active vGPU instance on the system\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the vGPU doesn't support this feature\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlVgpuInstanceGetEccMode(\n        vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n        eccMode: *mut cuda_types::nvml::nvmlEnableState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the encoder capacity of a vGPU instance, as a percentage of maximum encoder capacity with valid values in the range 0-100.\n\n For Maxwell &tm; or newer fully supported devices.\n\n @param vgpuInstance             Identifier of the target vGPU instance\n @param encoderCapacity          Reference to an unsigned int for the encoder capacity\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a encoderCapacity has been retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vgpuInstance is 0, or \\a encoderQueryType is invalid\n         - \\ref NVML_ERROR_NOT_FOUND         if \\a vgpuInstance does not match a valid active vGPU instance on the system\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlVgpuInstanceGetEncoderCapacity(\n        vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n        encoderCapacity: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Set the encoder capacity of a vGPU instance, as a percentage of maximum encoder capacity with valid values in the range 0-100.\n\n For Maxwell &tm; or newer fully supported devices.\n\n @param vgpuInstance             Identifier of the target vGPU instance\n @param encoderCapacity          Unsigned int for the encoder capacity value\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a encoderCapacity has been set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vgpuInstance is 0, or \\a encoderCapacity is out of range of 0-100.\n         - \\ref NVML_ERROR_NOT_FOUND         if \\a vgpuInstance does not match a valid active vGPU instance on the system\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlVgpuInstanceSetEncoderCapacity(\n        vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n        encoderCapacity: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the current encoder statistics of a vGPU Instance\n\n For Maxwell &tm; or newer fully supported devices.\n\n @param vgpuInstance                      Identifier of the target vGPU instance\n @param sessionCount                      Reference to an unsigned int for count of active encoder sessions\n @param averageFps                        Reference to an unsigned int for trailing average FPS of all active sessions\n @param averageLatency                    Reference to an unsigned int for encode latency in microseconds\n\n @return\n         - \\ref NVML_SUCCESS                  if \\a sessionCount, \\a averageFps and \\a averageLatency is fetched\n         - \\ref NVML_ERROR_UNINITIALIZED      if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT   if \\a sessionCount , or \\a averageFps or \\a averageLatency is NULL\n                                              or \\a vgpuInstance is 0.\n         - \\ref NVML_ERROR_NOT_FOUND          if \\a vgpuInstance does not match a valid active vGPU instance on the system\n         - \\ref NVML_ERROR_UNKNOWN            on any unexpected error*/\n    fn nvmlVgpuInstanceGetEncoderStats(\n        vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n        sessionCount: *mut ::core::ffi::c_uint,\n        averageFps: *mut ::core::ffi::c_uint,\n        averageLatency: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves information about all active encoder sessions on a vGPU Instance.\n\n An array of active encoder sessions is returned in the caller-supplied buffer pointed at by \\a sessionInfo. The\n array element count is passed in \\a sessionCount, and \\a sessionCount is used to return the number of sessions\n written to the buffer.\n\n If the supplied buffer is not large enough to accommodate the active session array, the function returns\n NVML_ERROR_INSUFFICIENT_SIZE, with the element count of nvmlEncoderSessionInfo_t array required in \\a sessionCount.\n To query the number of active encoder sessions, call this function with *sessionCount = 0. The code will return\n NVML_SUCCESS with number of active encoder sessions updated in *sessionCount.\n\n For Maxwell &tm; or newer fully supported devices.\n\n @param vgpuInstance                      Identifier of the target vGPU instance\n @param sessionCount                      Reference to caller supplied array size, and returns\n                                          the number of sessions.\n @param sessionInfo                       Reference to caller supplied array in which the list\n                                          of session information us returned.\n\n @return\n         - \\ref NVML_SUCCESS                  if \\a sessionInfo is fetched\n         - \\ref NVML_ERROR_UNINITIALIZED      if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE  if \\a sessionCount is too small, array element count is\nreturned in \\a sessionCount\n         - \\ref NVML_ERROR_INVALID_ARGUMENT   if \\a sessionCount is NULL, or \\a vgpuInstance is 0.\n         - \\ref NVML_ERROR_NOT_FOUND          if \\a vgpuInstance does not match a valid active vGPU instance on the system\n         - \\ref NVML_ERROR_UNKNOWN            on any unexpected error*/\n    fn nvmlVgpuInstanceGetEncoderSessions(\n        vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n        sessionCount: *mut ::core::ffi::c_uint,\n        sessionInfo: *mut cuda_types::nvml::nvmlEncoderSessionInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the active frame buffer capture sessions statistics of a vGPU Instance\n\n For Maxwell &tm; or newer fully supported devices.\n\n @param vgpuInstance                      Identifier of the target vGPU instance\n @param fbcStats                          Reference to nvmlFBCStats_t structure containing NvFBC stats\n\n @return\n         - \\ref NVML_SUCCESS                  if \\a fbcStats is fetched\n         - \\ref NVML_ERROR_UNINITIALIZED      if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT   if \\a vgpuInstance is 0, or \\a fbcStats is NULL\n         - \\ref NVML_ERROR_NOT_FOUND          if \\a vgpuInstance does not match a valid active vGPU instance on the system\n         - \\ref NVML_ERROR_UNKNOWN            on any unexpected error*/\n    fn nvmlVgpuInstanceGetFBCStats(\n        vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n        fbcStats: *mut cuda_types::nvml::nvmlFBCStats_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves information about active frame buffer capture sessions on a vGPU Instance.\n\n An array of active FBC sessions is returned in the caller-supplied buffer pointed at by \\a sessionInfo. The\n array element count is passed in \\a sessionCount, and \\a sessionCount is used to return the number of sessions\n written to the buffer.\n\n If the supplied buffer is not large enough to accommodate the active session array, the function returns\n NVML_ERROR_INSUFFICIENT_SIZE, with the element count of nvmlFBCSessionInfo_t array required in \\a sessionCount.\n To query the number of active FBC sessions, call this function with *sessionCount = 0.  The code will return\n NVML_SUCCESS with number of active FBC sessions updated in *sessionCount.\n\n For Maxwell &tm; or newer fully supported devices.\n\n @note hResolution, vResolution, averageFPS and averageLatency data for a FBC session returned in \\a sessionInfo may\n       be zero if there are no new frames captured since the session started.\n\n @param vgpuInstance                      Identifier of the target vGPU instance\n @param sessionCount                      Reference to caller supplied array size, and returns the number of sessions.\n @param sessionInfo                       Reference in which to return the session information\n\n @return\n         - \\ref NVML_SUCCESS                  if \\a sessionInfo is fetched\n         - \\ref NVML_ERROR_UNINITIALIZED      if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT   if \\a vgpuInstance is 0, or \\a sessionCount is NULL.\n         - \\ref NVML_ERROR_NOT_FOUND          if \\a vgpuInstance does not match a valid active vGPU instance on the system\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE  if \\a sessionCount is too small, array element count is returned in \\a sessionCount\n         - \\ref NVML_ERROR_UNKNOWN            on any unexpected error*/\n    fn nvmlVgpuInstanceGetFBCSessions(\n        vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n        sessionCount: *mut ::core::ffi::c_uint,\n        sessionInfo: *mut cuda_types::nvml::nvmlFBCSessionInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the GPU Instance ID for the given vGPU Instance.\n The API will return a valid GPU Instance ID for MIG backed vGPU Instance, else INVALID_GPU_INSTANCE_ID is returned.\n\n For Kepler &tm; or newer fully supported devices.\n\n @param vgpuInstance                      Identifier of the target vGPU instance\n @param gpuInstanceId                     GPU Instance ID\n\n @return\n         - \\ref NVML_SUCCESS                  successful completion\n         - \\ref NVML_ERROR_UNINITIALIZED      if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT   if \\a vgpuInstance is 0, or \\a gpuInstanceId is NULL.\n         - \\ref NVML_ERROR_NOT_FOUND          if \\a vgpuInstance does not match a valid active vGPU instance on the system\n         - \\ref NVML_ERROR_UNKNOWN            on any unexpected error*/\n    fn nvmlVgpuInstanceGetGpuInstanceId(\n        vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n        gpuInstanceId: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the PCI Id of the given vGPU Instance i.e. the PCI Id of the GPU as seen inside the VM.\n\n The vGPU PCI id is returned as \"00000000:00:00.0\" if NVIDIA driver is not installed on the vGPU instance.\n\n @param vgpuInstance                         Identifier of the target vGPU instance\n @param vgpuPciId                            Caller-supplied buffer to return vGPU PCI Id string\n @param length                               Size of the vgpuPciId buffer\n\n @return\n         - \\ref NVML_SUCCESS                 if vGPU PCI Id is sucessfully retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vgpuInstance is 0, or \\a vgpuPciId is NULL\n         - \\ref NVML_ERROR_NOT_FOUND         if \\a vgpuInstance does not match a valid active vGPU instance on the system\n         - \\ref NVML_ERROR_DRIVER_NOT_LOADED if NVIDIA driver is not running on the vGPU instance\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a length is too small, \\a length is set to required length\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlVgpuInstanceGetGpuPciId(\n        vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n        vgpuPciId: *mut ::core::ffi::c_char,\n        length: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the requested capability for a given vGPU type. Refer to the \\a nvmlVgpuCapability_t structure\n for the specific capabilities that can be queried. The return value in \\a capResult should be treated as\n a boolean, with a non-zero value indicating that the capability is supported.\n\n For Maxwell &tm; or newer fully supported devices.\n\n @param vgpuTypeId                           Handle to vGPU type\n @param capability                           Specifies the \\a nvmlVgpuCapability_t to be queried\n @param capResult                            A boolean for the queried capability indicating that feature is supported\n\n @return\n         - \\ref NVML_SUCCESS                 successful completion\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vgpuTypeId is invalid, or \\a capability is invalid, or \\a capResult is NULL\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlVgpuTypeGetCapabilities(\n        vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n        capability: cuda_types::nvml::nvmlVgpuCapability_t,\n        capResult: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the MDEV UUID of a vGPU instance.\n\n The MDEV UUID is a globally unique identifier of the mdev device assigned to the VM, and is returned as a 5-part hexadecimal string,\n not exceeding 80 characters in length (including the NULL terminator).\n MDEV UUID is displayed only on KVM platform.\n See \\ref nvmlConstants::NVML_DEVICE_UUID_BUFFER_SIZE.\n\n For Maxwell &tm; or newer fully supported devices.\n\n @param vgpuInstance             Identifier of the target vGPU instance\n @param mdevUuid                 Pointer to caller-supplied buffer to hold MDEV UUID\n @param size                     Size of buffer in bytes\n\n @return\n         - \\ref NVML_SUCCESS                 successful completion\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_NOT_SUPPORTED     on any hypervisor other than KVM\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vgpuInstance is 0, or \\a mdevUuid is NULL\n         - \\ref NVML_ERROR_NOT_FOUND         if \\a vgpuInstance does not match a valid active vGPU instance on the system\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a size is too small\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlVgpuInstanceGetMdevUUID(\n        vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n        mdevUuid: *mut ::core::ffi::c_char,\n        size: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Query the currently creatable vGPU types on a specific GPU Instance.\n\n The function returns an array of vGPU types that can be created for a specified GPU instance. This array is stored\n in a caller-supplied buffer, with the buffer's element count passed through \\a pVgpus->vgpuCount. The number of\n vGPU types written to the buffer is indicated by \\a pVgpus->vgpuCount. If the buffer is too small to hold the vGPU\n type array, the function returns NVML_ERROR_INSUFFICIENT_SIZE and updates \\a pVgpus->vgpuCount with the required\n element count.\n\n To determine the creatable vGPUs for a GPU Instance, invoke this function with \\a pVgpus->vgpuCount set to 0 and\n \\a pVgpus->vgpuTypeIds as NULL. This will result in NVML_ERROR_INSUFFICIENT_SIZE being returned, along with the\n count value in \\a pVgpus->vgpuCount.\n\n The creatable vGPU types may differ over time, as there may be restrictions on what type of vGPUs can concurrently\n run on the device.\n\n @param gpuInstance                          The GPU instance handle\n @param pVgpus                               Pointer to the caller-provided structure of nvmlVgpuTypeIdInfo_t\n\n @return\n         - \\ref NVML_SUCCESS                          Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED              If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT           If \\a gpuInstance is NULL or invalid, or \\a pVgpus is NULL\n                                                      or GPU Instance Id is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED              If not on a vGPU host or an unsupported GPU\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE          If \\a pVgpus->vgpuTypeIds buffer is small\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH  If the version of \\a pVgpus is invalid\n         - \\ref NVML_ERROR_UNKNOWN                    On any unexpected error*/\n    fn nvmlGpuInstanceGetCreatableVgpus(\n        gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n        pVgpus: *mut cuda_types::nvml::nvmlVgpuTypeIdInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the maximum number of vGPU instances per GPU instance for given vGPU type\n\n @param pMaxInstance                         Pointer to the caller-provided structure of nvmlVgpuTypeMaxInstance_t\n\n @return\n         - \\ref NVML_SUCCESS                          Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED              If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT           If \\a pMaxInstance is NULL or \\a pMaxInstance->vgpuTypeId is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED              If not on a vGPU host or an unsupported GPU or non-MIG vGPU type\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH  If the version of \\a pMaxInstance is invalid\n         - \\ref NVML_ERROR_UNKNOWN                    On any unexpected error*/\n    fn nvmlVgpuTypeGetMaxInstancesPerGpuInstance(\n        pMaxInstance: *mut cuda_types::nvml::nvmlVgpuTypeMaxInstance_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieve the active vGPU instances within a GPU instance.\n\n An array of active vGPU instances is returned in the caller-supplied buffer pointed\n at by \\a pVgpuInstanceInfo->vgpuInstances. The array element count is passed in\n \\a pVgpuInstanceInfo->vgpuCount, and \\a pVgpuInstanceInfo->vgpuCount is used to return\n the number of vGPU instances written to the buffer.\n\n If the supplied buffer is not large enough to accommodate the vGPU instance array,\n the function returns NVML_ERROR_INSUFFICIENT_SIZE, with the element count of\n nvmlVgpuInstance_t array required in \\a pVgpuInstanceInfo->vgpuCount. To query the\n number of active vGPU instances, call this function with pVgpuInstanceInfo->vgpuCount = 0\n and pVgpuInstanceInfo->vgpuTypeIds = NULL. The code will return NVML_ERROR_INSUFFICIENT_SIZE,\n or NVML_SUCCESS if no vGPU Types are active.\n\n @param gpuInstance          The GPU instance handle\n @param pVgpuInstanceInfo    Pointer to the vGPU instance information structure \\a nvmlActiveVgpuInstanceInfo_t\n\n @return\n         - \\ref NVML_SUCCESS                          Successful completion\n         - \\ref NVML_ERROR_UNINITIALIZED              If the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT           If \\a gpuInstance is NULL or invalid, or \\a pVgpuInstanceInfo is NULL\n                                                      or GPU Instance Id is invalid\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE          \\a pVgpuInstanceInfo->vgpuTypeIds buffer is too small,\n                                                      array element count is returned in \\a pVgpuInstanceInfo->vgpuCount\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH  If the version of \\a pVgpuInstanceInfo is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED              If not on a vGPU host or an unsupported GPU\n         - \\ref NVML_ERROR_UNKNOWN                    On any unexpected error*/\n    fn nvmlGpuInstanceGetActiveVgpus(\n        gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n        pVgpuInstanceInfo: *mut cuda_types::nvml::nvmlActiveVgpuInstanceInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Set vGPU scheduler state for the given GPU instance\n\n For Blackwell &tm GB20x; or newer fully supported devices.\n\n Scheduler state and params will be allowed to set only when no VM is running within the GPU instance.\n In \\a nvmlVgpuSchedulerState_t, IFF enableARRMode is enabled then provide the avgFactor and frequency\n as input. If enableARRMode is disabled then provide timeslice as input.\n\n The scheduler state change won't persist across module load/unload and GPU Instance creation/deletion.\n\n @param gpuInstance                          The GPU instance handle\n @param pScheduler                           Pointer to the caller-provided structure of nvmlVgpuSchedulerState_t\n\n @return\n         - \\ref NVML_SUCCESS                          Upon success\n         - \\ref NVML_ERROR_INVALID_ARGUMENT           If \\a gpuInstance is NULL or invalid, or \\a pScheduler is NULL\n                                                      or GPU Instance Id is invalid\n         - \\ref NVML_ERROR_RESET_REQUIRED             If setting the state failed with fatal error, reboot is required\n         - \\ref NVML_ERROR_NOT_SUPPORTED              If not on a vGPU host or an unsupported GPU or if any vGPU instance exists\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH  If the version of \\a pScheduler is invalid\n         - \\ref NVML_ERROR_UNKNOWN                    On any unexpected error*/\n    fn nvmlGpuInstanceSetVgpuSchedulerState(\n        gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n        pScheduler: *mut cuda_types::nvml::nvmlVgpuSchedulerState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Returns the vGPU scheduler state for the given GPU instance.\n The information returned in \\a nvmlVgpuSchedulerStateInfo_t is not relevant if the BEST EFFORT policy is set.\n\n For Blackwell &tm GB20x; or newer fully supported devices.\n\n @param gpuInstance                The GPU instance handle\n @param pSchedulerStateInfo        Reference in which \\a pSchedulerStateInfo is returned\n\n @return\n         - \\ref NVML_SUCCESS                          vGPU scheduler state is successfully obtained\n         - \\ref NVML_ERROR_UNINITIALIZED              If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT           If \\a gpuInstance is NULL or invalid, or \\a pSchedulerStateInfo is NULL\n                                                      or GPU Instance Id is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED              If not on a vGPU host or an unsupported GPU\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH  If the version of \\a pSchedulerStateInfo is invalid\n         - \\ref NVML_ERROR_UNKNOWN                    on any unexpected error*/\n    fn nvmlGpuInstanceGetVgpuSchedulerState(\n        gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n        pSchedulerStateInfo: *mut cuda_types::nvml::nvmlVgpuSchedulerStateInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Returns the vGPU scheduler logs for the given GPU instance.\n \\a pSchedulerLogInfo points to a caller-allocated structure to contain the logs. The number of elements returned will\n never exceed \\a NVML_SCHEDULER_SW_MAX_LOG_ENTRIES.\n\n To get the entire logs, call the function atleast 5 times a second.\n\n For Blackwell &tm GB20x; or newer fully supported devices.\n\n @param gpuInstance               The GPU instance handle\n @param pSchedulerLogInfo         Reference in which \\a pSchedulerLogInfo is written\n\n @return\n         - \\ref NVML_SUCCESS                          vGPU scheduler logs are successfully obtained\n         - \\ref NVML_ERROR_UNINITIALIZED              If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT           If \\a gpuInstance is NULL or invalid, or \\a pSchedulerLogInfo is NULL\n                                                      or GPU Instance Id is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED              If not on a vGPU host or an unsupported GPU\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH  If the version of \\a pSchedulerLogInfo is invalid\n         - \\ref NVML_ERROR_UNKNOWN                    on any unexpected error*/\n    fn nvmlGpuInstanceGetVgpuSchedulerLog(\n        gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n        pSchedulerLogInfo: *mut cuda_types::nvml::nvmlVgpuSchedulerLogInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Query the creatable vGPU placement ID of the vGPU type within a GPU instance.\n\n For Blackwell &tm GB20x; or newer fully supported devices.\n\n An array of creatable vGPU placement IDs for the vGPU type ID indicated by \\a pCreatablePlacementInfo->vgpuTypeId\n is returned in the caller-supplied buffer of \\a pCreatablePlacementInfo->placementIds. Memory needed for the\n placementIds array should be allocated based on maximum instances of a vGPU type per GPU instance which can be\n queried via \\ref nvmlVgpuTypeGetMaxInstancesPerGpuInstance().\n If the provided count by the caller is insufficient, the function will return NVML_ERROR_INSUFFICIENT_SIZE along with\n the number of required entries in \\a pCreatablePlacementInfo->count. The caller should then reallocate a buffer with the size\n of pCreatablePlacementInfo->count * sizeof(pCreatablePlacementInfo->placementIds) and invoke the function again.\n The creatable vGPU placement IDs may differ over time, as there may be restrictions on what type of vGPU the\n vGPU instance is running.\n\n @param gpuInstance                The GPU instance handle\n @param pCreatablePlacementInfo    Pointer to the list of vGPU creatable placement structure \\a nvmlVgpuCreatablePlacementInfo_t\n\n @return\n         - \\ref NVML_SUCCESS                          Successful completion\n         - \\ref NVML_ERROR_UNINITIALIZED              If the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT           If \\a gpuInstance is NULL or invalid, or \\a pCreatablePlacementInfo is NULL\n                                                      or GPU Instance Id is invalid\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE          If the buffer is small, element count is returned in \\a pCreatablePlacementInfo->count\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH  If the version of \\a pCreatablePlacementInfo is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED              If not on a vGPU host or an unsupported GPU or vGPU heterogeneous mode is not enabled\n         - \\ref NVML_ERROR_UNKNOWN                    On any unexpected error*/\n    fn nvmlGpuInstanceGetVgpuTypeCreatablePlacements(\n        gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n        pCreatablePlacementInfo: *mut cuda_types::nvml::nvmlVgpuCreatablePlacementInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get the vGPU heterogeneous mode for the GPU instance.\n\n When in heterogeneous mode, a vGPU can concurrently host timesliced vGPUs with differing framebuffer sizes.\n\n On successful return, the function returns \\a pHeterogeneousMode->mode with the current vGPU heterogeneous mode.\n \\a pHeterogeneousMode->version is the version number of the structure nvmlVgpuHeterogeneousMode_t, the caller should\n set the correct version number to retrieve the vGPU heterogeneous mode.\n \\a pHeterogeneousMode->mode can either be \\ref NVML_FEATURE_ENABLED or \\ref NVML_FEATURE_DISABLED.\n\n For Blackwell &tm GB20x; or newer fully supported devices.\n\n @param gpuInstance               The GPU instance handle\n @param pHeterogeneousMode        Pointer to the caller-provided structure of nvmlVgpuHeterogeneousMode_t\n\n @return\n         - \\ref NVML_SUCCESS                          Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED              If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT           If \\a gpuInstance is NULL or invalid, or \\a pHeterogeneousMode is NULL\n                                                      or GPU Instance Id is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED              If not on a vGPU host or an unsupported GPU or not in MIG mode\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH  If the version of \\a pHeterogeneousMode is invalid\n         - \\ref NVML_ERROR_UNKNOWN                    On any unexpected error*/\n    fn nvmlGpuInstanceGetVgpuHeterogeneousMode(\n        gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n        pHeterogeneousMode: *mut cuda_types::nvml::nvmlVgpuHeterogeneousMode_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Enable or disable vGPU heterogeneous mode for the GPU instance.\n\n When in heterogeneous mode, a vGPU can concurrently host timesliced vGPUs with differing framebuffer sizes.\n\n API would return an appropriate error code upon unsuccessful activation. For example, the heterogeneous mode\n set will fail with error \\ref NVML_ERROR_IN_USE if any vGPU instance is active within the GPU instance.\n The caller of this API is expected to shutdown the vGPU VMs and retry setting the \\a mode.\n On successful return, the function updates the vGPU heterogeneous mode with the user provided \\a pHeterogeneousMode->mode.\n \\a pHeterogeneousMode->version is the version number of the structure nvmlVgpuHeterogeneousMode_t, the caller should\n set the correct version number to set the vGPU heterogeneous mode.\n\n @param gpuInstance               The GPU instance handle\n @param pHeterogeneousMode        Pointer to the caller-provided structure of nvmlVgpuHeterogeneousMode_t\n\n @return\n         - \\ref NVML_SUCCESS                          Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED              If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT           If \\a gpuInstance  is NULL or invalid,\n                                                      or \\a pHeterogeneousMode is NULL or \\a pHeterogeneousMode->mode is invalid\n                                                      or GPU Instance Id is invalid\n         - \\ref NVML_ERROR_IN_USE                     If the \\a gpuInstance is in use\n         - \\ref NVML_ERROR_NOT_SUPPORTED              If not on a vGPU host or an unsupported GPU\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH  If the version of \\a pHeterogeneousMode is invalid\n         - \\ref NVML_ERROR_UNKNOWN                    On any unexpected error*/\n    fn nvmlGpuInstanceSetVgpuHeterogeneousMode(\n        gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n        pHeterogeneousMode: *const cuda_types::nvml::nvmlVgpuHeterogeneousMode_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Returns vGPU metadata structure for a running vGPU. The structure contains information about the vGPU and its associated VM\n such as the currently installed NVIDIA guest driver version, together with host driver version and an opaque data section\n containing internal state.\n\n nvmlVgpuInstanceGetMetadata() may be called at any time for a vGPU instance. Some fields in the returned structure are\n dependent on information obtained from the guest VM, which may not yet have reached a state where that information\n is available. The current state of these dependent fields is reflected in the info structure's \\ref nvmlVgpuGuestInfoState_t field.\n\n The VMM may choose to read and save the vGPU's VM info as persistent metadata associated with the VM, and provide\n it to Virtual GPU Manager when creating a vGPU for subsequent instances of the VM.\n\n The caller passes in a buffer via \\a vgpuMetadata, with the size of the buffer in \\a bufferSize. If the vGPU Metadata structure\n is too large to fit in the supplied buffer, the function returns NVML_ERROR_INSUFFICIENT_SIZE with the size needed\n in \\a bufferSize.\n\n @param vgpuInstance             vGPU instance handle\n @param vgpuMetadata             Pointer to caller-supplied buffer into which vGPU metadata is written\n @param bufferSize               Size of vgpuMetadata buffer\n\n @return\n         - \\ref NVML_SUCCESS                   vGPU metadata structure was successfully returned\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE   vgpuMetadata buffer is too small, required size is returned in \\a bufferSize\n         - \\ref NVML_ERROR_INVALID_ARGUMENT    if \\a bufferSize is NULL or \\a vgpuInstance is 0; if \\a vgpuMetadata is NULL and the value of \\a bufferSize is not 0.\n         - \\ref NVML_ERROR_NOT_FOUND           if \\a vgpuInstance does not match a valid active vGPU instance on the system\n         - \\ref NVML_ERROR_UNKNOWN             on any unexpected error*/\n    fn nvmlVgpuInstanceGetMetadata(\n        vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n        vgpuMetadata: *mut cuda_types::nvml::nvmlVgpuMetadata_t,\n        bufferSize: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Returns a vGPU metadata structure for the physical GPU indicated by \\a device. The structure contains information about\n the GPU and the currently installed NVIDIA host driver version that's controlling it, together with an opaque data section\n containing internal state.\n\n The caller passes in a buffer via \\a pgpuMetadata, with the size of the buffer in \\a bufferSize. If the \\a pgpuMetadata\n structure is too large to fit in the supplied buffer, the function returns NVML_ERROR_INSUFFICIENT_SIZE with the size needed\n in \\a bufferSize.\n\n @param device                The identifier of the target device\n @param pgpuMetadata          Pointer to caller-supplied buffer into which \\a pgpuMetadata is written\n @param bufferSize            Pointer to size of \\a pgpuMetadata buffer\n\n @return\n         - \\ref NVML_SUCCESS                   GPU metadata structure was successfully returned\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE   pgpuMetadata buffer is too small, required size is returned in \\a bufferSize\n         - \\ref NVML_ERROR_INVALID_ARGUMENT    if \\a bufferSize is NULL or \\a device is invalid; if \\a pgpuMetadata is NULL and the value of \\a bufferSize is not 0.\n         - \\ref NVML_ERROR_NOT_SUPPORTED       vGPU is not supported by the system\n         - \\ref NVML_ERROR_UNKNOWN             on any unexpected error*/\n    fn nvmlDeviceGetVgpuMetadata(\n        device: cuda_types::nvml::nvmlDevice_t,\n        pgpuMetadata: *mut cuda_types::nvml::nvmlVgpuPgpuMetadata_t,\n        bufferSize: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Takes a vGPU instance metadata structure read from \\ref nvmlVgpuInstanceGetMetadata(), and a vGPU metadata structure for a\n physical GPU read from \\ref nvmlDeviceGetVgpuMetadata(), and returns compatibility information of the vGPU instance and the\n physical GPU.\n\n The caller passes in a buffer via \\a compatibilityInfo, into which a compatibility information structure is written. The\n structure defines the states in which the vGPU / VM may be booted on the physical GPU. If the vGPU / VM compatibility\n with the physical GPU is limited, a limit code indicates the factor limiting compatability.\n (see \\ref nvmlVgpuPgpuCompatibilityLimitCode_t for details).\n\n Note: vGPU compatibility does not take into account dynamic capacity conditions that may limit a system's ability to\n       boot a given vGPU or associated VM.\n\n @param vgpuMetadata          Pointer to caller-supplied vGPU metadata structure\n @param pgpuMetadata          Pointer to caller-supplied GPU metadata structure\n @param compatibilityInfo     Pointer to caller-supplied buffer to hold compatibility info\n\n @return\n         - \\ref NVML_SUCCESS                   vGPU metadata structure was successfully returned\n         - \\ref NVML_ERROR_INVALID_ARGUMENT    If \\a vgpuMetadata or \\a pgpuMetadata or \\a bufferSize are NULL\n         - \\ref NVML_ERROR_UNKNOWN             On any unexpected error*/\n    fn nvmlGetVgpuCompatibility(\n        vgpuMetadata: *mut cuda_types::nvml::nvmlVgpuMetadata_t,\n        pgpuMetadata: *mut cuda_types::nvml::nvmlVgpuPgpuMetadata_t,\n        compatibilityInfo: *mut cuda_types::nvml::nvmlVgpuPgpuCompatibility_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Returns the properties of the physical GPU indicated by the device in an ascii-encoded string format.\n\n The caller passes in a buffer via \\a pgpuMetadata, with the size of the buffer in \\a bufferSize. If the\n string is too large to fit in the supplied buffer, the function returns NVML_ERROR_INSUFFICIENT_SIZE with the size needed\n in \\a bufferSize.\n\n @param device                The identifier of the target device\n @param pgpuMetadata          Pointer to caller-supplied buffer into which \\a pgpuMetadata is written\n @param bufferSize            Pointer to size of \\a pgpuMetadata buffer\n\n @return\n         - \\ref NVML_SUCCESS                   GPU metadata structure was successfully returned\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE   \\a pgpuMetadata buffer is too small, required size is returned in \\a bufferSize\n         - \\ref NVML_ERROR_INVALID_ARGUMENT    If \\a bufferSize is NULL or \\a device is invalid; if \\a pgpuMetadata is NULL and the value of \\a bufferSize is not 0.\n         - \\ref NVML_ERROR_NOT_SUPPORTED       If vGPU is not supported by the system\n         - \\ref NVML_ERROR_UNKNOWN             On any unexpected error*/\n    fn nvmlDeviceGetPgpuMetadataString(\n        device: cuda_types::nvml::nvmlDevice_t,\n        pgpuMetadata: *mut ::core::ffi::c_char,\n        bufferSize: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Returns the vGPU Software scheduler logs.\n \\a pSchedulerLog points to a caller-allocated structure to contain the logs. The number of elements returned will\n never exceed \\a NVML_SCHEDULER_SW_MAX_LOG_ENTRIES.\n\n To get the entire logs, call the function atleast 5 times a second.\n\n For Pascal &tm; or newer fully supported devices.\n\n @param device                The identifier of the target \\a device\n @param pSchedulerLog         Reference in which \\a pSchedulerLog is written\n\n @return\n         - \\ref NVML_SUCCESS                   vGPU scheduler logs were successfully obtained\n         - \\ref NVML_ERROR_INVALID_ARGUMENT    If \\a pSchedulerLog is NULL or \\a device is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED       If MIG is enabled or \\a device not in vGPU host mode\n         - \\ref NVML_ERROR_UNKNOWN             On any unexpected error*/\n    fn nvmlDeviceGetVgpuSchedulerLog(\n        device: cuda_types::nvml::nvmlDevice_t,\n        pSchedulerLog: *mut cuda_types::nvml::nvmlVgpuSchedulerLog_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Returns the vGPU scheduler state.\n The information returned in \\a nvmlVgpuSchedulerGetState_t is not relevant if the BEST EFFORT policy is set.\n\n For Pascal &tm; or newer fully supported devices.\n\n @param device                The identifier of the target \\a device\n @param pSchedulerState       Reference in which \\a pSchedulerState is returned\n\n @return\n         - \\ref NVML_SUCCESS                   vGPU scheduler state is successfully obtained\n         - \\ref NVML_ERROR_INVALID_ARGUMENT    If \\a pSchedulerState is NULL or \\a device is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED       If MIG is enabled or \\a device not in vGPU host mode\n         - \\ref NVML_ERROR_UNKNOWN             On any unexpected error*/\n    fn nvmlDeviceGetVgpuSchedulerState(\n        device: cuda_types::nvml::nvmlDevice_t,\n        pSchedulerState: *mut cuda_types::nvml::nvmlVgpuSchedulerGetState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Returns the vGPU scheduler capabilities.\n The list of supported vGPU schedulers returned in \\a nvmlVgpuSchedulerCapabilities_t is from\n the NVML_VGPU_SCHEDULER_POLICY_*. This list enumerates the supported scheduler policies\n if the engine is Graphics type.\n The other values in \\a nvmlVgpuSchedulerCapabilities_t are also applicable if the engine is\n Graphics type. For other engine types, it is BEST EFFORT policy.\n If ARR is supported and enabled, scheduling frequency and averaging factor are applicable\n else timeSlice is applicable.\n\n For Pascal &tm; or newer fully supported devices.\n\n @param device                The identifier of the target \\a device\n @param pCapabilities         Reference in which \\a pCapabilities is written\n\n @return\n         - \\ref NVML_SUCCESS                   vGPU scheduler capabilities were successfully obtained\n         - \\ref NVML_ERROR_INVALID_ARGUMENT    If \\a pCapabilities is NULL or \\a device is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED       The API is not supported in current state or \\a device not in vGPU host mode\n         - \\ref NVML_ERROR_UNKNOWN             On any unexpected error*/\n    fn nvmlDeviceGetVgpuSchedulerCapabilities(\n        device: cuda_types::nvml::nvmlDevice_t,\n        pCapabilities: *mut cuda_types::nvml::nvmlVgpuSchedulerCapabilities_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Sets the vGPU scheduler state.\n\n For Pascal &tm; or newer fully supported devices.\n\n The scheduler state change won't persist across module load/unload.\n Scheduler state and params will be allowed to set only when no VM is running.\n In \\a nvmlVgpuSchedulerSetState_t, IFF enableARRMode is enabled then\n provide avgFactorForARR and frequency as input. If enableARRMode is disabled\n then provide timeslice as input.\n\n @param device                The identifier of the target \\a device\n @param pSchedulerState       vGPU \\a pSchedulerState to set\n\n @return\n         - \\ref NVML_SUCCESS                  vGPU scheduler state has been successfully set\n         - \\ref NVML_ERROR_INVALID_ARGUMENT   If \\a pSchedulerState is NULL or \\a device is invalid\n         - \\ref NVML_ERROR_RESET_REQUIRED     If setting \\a pSchedulerState failed with fatal error,\n                                              reboot is required to overcome from this error.\n         - \\ref NVML_ERROR_NOT_SUPPORTED      If MIG is enabled or \\a device not in vGPU host mode\n                                              or if any vGPU instance currently exists on the \\a device\n         - \\ref NVML_ERROR_UNKNOWN            On any unexpected error*/\n    fn nvmlDeviceSetVgpuSchedulerState(\n        device: cuda_types::nvml::nvmlDevice_t,\n        pSchedulerState: *mut cuda_types::nvml::nvmlVgpuSchedulerSetState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Query the ranges of supported vGPU versions.\n\n This function gets the linear range of supported vGPU versions that is preset for the NVIDIA vGPU Manager and the range set by an administrator.\n If the preset range has not been overridden by \\ref nvmlSetVgpuVersion, both ranges are the same.\n\n The caller passes pointers to the following \\ref nvmlVgpuVersion_t structures, into which the NVIDIA vGPU Manager writes the ranges:\n 1. \\a supported structure that represents the preset range of vGPU versions supported by the NVIDIA vGPU Manager.\n 2. \\a current structure that represents the range of supported vGPU versions set by an administrator. By default, this range is the same as the preset range.\n\n @param supported  Pointer to the structure in which the preset range of vGPU versions supported by the NVIDIA vGPU Manager is written\n @param current    Pointer to the structure in which the range of supported vGPU versions set by an administrator is written\n\n @return\n - \\ref NVML_SUCCESS                 The vGPU version range structures were successfully obtained.\n - \\ref NVML_ERROR_NOT_SUPPORTED     The API is not supported.\n - \\ref NVML_ERROR_INVALID_ARGUMENT  The \\a supported parameter or the \\a current parameter is NULL.\n - \\ref NVML_ERROR_UNKNOWN           An error occurred while the data was being fetched.*/\n    fn nvmlGetVgpuVersion(\n        supported: *mut cuda_types::nvml::nvmlVgpuVersion_t,\n        current: *mut cuda_types::nvml::nvmlVgpuVersion_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Override the preset range of vGPU versions supported by the NVIDIA vGPU Manager with a range set by an administrator.\n\n This function configures the NVIDIA vGPU Manager with a range of supported vGPU versions set by an administrator. This range must be a subset of the\n preset range that the NVIDIA vGPU Manager supports. The custom range set by an administrator takes precedence over the preset range and is advertised to\n the guest VM for negotiating the vGPU version. See \\ref nvmlGetVgpuVersion for details of how to query the preset range of versions supported.\n\n This function takes a pointer to vGPU version range structure \\ref nvmlVgpuVersion_t as input to override the preset vGPU version range that the NVIDIA vGPU Manager supports.\n\n After host system reboot or driver reload, the range of supported versions reverts to the range that is preset for the NVIDIA vGPU Manager.\n\n @note 1. The range set by the administrator must be a subset of the preset range that the NVIDIA vGPU Manager supports. Otherwise, an error is returned.\n       2. If the range of supported guest driver versions does not overlap the range set by the administrator, the guest driver fails to load.\n       3. If the range of supported guest driver versions overlaps the range set by the administrator, the guest driver will load with a negotiated\n          vGPU version that is the maximum value in the overlapping range.\n       4. No VMs must be running on the host when this function is called. If a VM is running on the host, the call to this function fails.\n\n @param vgpuVersion   Pointer to a caller-supplied range of supported vGPU versions.\n\n @return\n - \\ref NVML_SUCCESS                 The preset range of supported vGPU versions was successfully overridden.\n - \\ref NVML_ERROR_NOT_SUPPORTED     The API is not supported.\n - \\ref NVML_ERROR_IN_USE            The range was not overridden because a VM is running on the host.\n - \\ref NVML_ERROR_INVALID_ARGUMENT  The \\a vgpuVersion parameter specifies a range that is outside the range supported by the NVIDIA vGPU Manager or if \\a vgpuVersion is NULL.*/\n    fn nvmlSetVgpuVersion(\n        vgpuVersion: *mut cuda_types::nvml::nvmlVgpuVersion_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves current utilization for vGPUs on a physical GPU (device).\n\n For Kepler &tm; or newer fully supported devices.\n\n Reads recent utilization of GPU SM (3D/Compute), framebuffer, video encoder, and video decoder for vGPU instances running\n on a device. Utilization values are returned as an array of utilization sample structures in the caller-supplied buffer\n pointed at by \\a utilizationSamples. One utilization sample structure is returned per vGPU instance, and includes the\n CPU timestamp at which the samples were recorded. Individual utilization values are returned as \"unsigned int\" values\n in nvmlValue_t unions. The function sets the caller-supplied \\a sampleValType to NVML_VALUE_TYPE_UNSIGNED_INT to\n indicate the returned value type.\n\n To read utilization values, first determine the size of buffer required to hold the samples by invoking the function with\n \\a utilizationSamples set to NULL. The function will return NVML_ERROR_INSUFFICIENT_SIZE, with the current vGPU instance\n count in \\a vgpuInstanceSamplesCount, or NVML_SUCCESS if the current vGPU instance count is zero. The caller should allocate\n a buffer of size vgpuInstanceSamplesCount * sizeof(nvmlVgpuInstanceUtilizationSample_t). Invoke the function again with\n the allocated buffer passed in \\a utilizationSamples, and \\a vgpuInstanceSamplesCount set to the number of entries the\n buffer is sized for.\n\n On successful return, the function updates \\a vgpuInstanceSampleCount with the number of vGPU utilization sample\n structures that were actually written. This may differ from a previously read value as vGPU instances are created or\n destroyed.\n\n lastSeenTimeStamp represents the CPU timestamp in microseconds at which utilization samples were last read. Set it to 0\n to read utilization based on all the samples maintained by the driver's internal sample buffer. Set lastSeenTimeStamp\n to a timeStamp retrieved from a previous query to read utilization since the previous query.\n\n @param device                        The identifier for the target device\n @param lastSeenTimeStamp             Return only samples with timestamp greater than lastSeenTimeStamp.\n @param sampleValType                 Pointer to caller-supplied buffer to hold the type of returned sample values\n @param vgpuInstanceSamplesCount      Pointer to caller-supplied array size, and returns number of vGPU instances\n @param utilizationSamples            Pointer to caller-supplied buffer in which vGPU utilization samples are returned\n\n @return\n         - \\ref NVML_SUCCESS                 if utilization samples are successfully retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, \\a vgpuInstanceSamplesCount or \\a sampleValType is\n                                             NULL, or a sample count of 0 is passed with a non-NULL \\a utilizationSamples\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if supplied \\a vgpuInstanceSamplesCount is too small to return samples for all\n                                             vGPU instances currently executing on the device\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if vGPU is not supported by the device\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_NOT_FOUND         if sample entries are not found\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetVgpuUtilization(\n        device: cuda_types::nvml::nvmlDevice_t,\n        lastSeenTimeStamp: ::core::ffi::c_ulonglong,\n        sampleValType: *mut cuda_types::nvml::nvmlValueType_t,\n        vgpuInstanceSamplesCount: *mut ::core::ffi::c_uint,\n        utilizationSamples: *mut cuda_types::nvml::nvmlVgpuInstanceUtilizationSample_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves recent utilization for vGPU instances running on a physical GPU (device).\n\n For Kepler &tm; or newer fully supported devices.\n\n Reads recent utilization of GPU SM (3D/Compute), framebuffer, video encoder, video decoder, jpeg decoder, and OFA for vGPU\n instances running on a device. Utilization values are returned as an array of utilization sample structures in the caller-supplied\n buffer pointed at by \\a vgpuUtilInfo->vgpuUtilArray. One utilization sample structure is returned per vGPU instance, and includes the\n CPU timestamp at which the samples were recorded. Individual utilization values are returned as \"unsigned int\" values\n in nvmlValue_t unions. The function sets the caller-supplied \\a vgpuUtilInfo->sampleValType to NVML_VALUE_TYPE_UNSIGNED_INT to\n indicate the returned value type.\n\n To read utilization values, first determine the size of buffer required to hold the samples by invoking the function with\n \\a vgpuUtilInfo->vgpuUtilArray set to NULL. The function will return NVML_ERROR_INSUFFICIENT_SIZE, with the current vGPU instance\n count in \\a vgpuUtilInfo->vgpuInstanceCount, or NVML_SUCCESS if the current vGPU instance count is zero. The caller should allocate\n a buffer of size vgpuUtilInfo->vgpuInstanceCount * sizeof(nvmlVgpuInstanceUtilizationInfo_t). Invoke the function again with\n the allocated buffer passed in \\a vgpuUtilInfo->vgpuUtilArray, and \\a vgpuUtilInfo->vgpuInstanceCount set to the number of entries the\n buffer is sized for.\n\n On successful return, the function updates \\a vgpuUtilInfo->vgpuInstanceCount with the number of vGPU utilization sample\n structures that were actually written. This may differ from a previously read value as vGPU instances are created or\n destroyed.\n\n \\a vgpuUtilInfo->lastSeenTimeStamp represents the CPU timestamp in microseconds at which utilization samples were last read. Set it to 0\n to read utilization based on all the samples maintained by the driver's internal sample buffer. Set \\a vgpuUtilInfo->lastSeenTimeStamp\n to a timeStamp retrieved from a previous query to read utilization since the previous query.\n\n @param device                        The identifier for the target device\n @param vgpuUtilInfo                  Pointer to the caller-provided structure of nvmlVgpuInstancesUtilizationInfo_t\n\n @return\n         - \\ref NVML_SUCCESS                          If utilization samples are successfully retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED              If the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT           If \\a device is invalid, \\a vgpuUtilInfo is NULL, or \\a vgpuUtilInfo->vgpuInstanceCount is 0\n         - \\ref NVML_ERROR_NOT_SUPPORTED              If vGPU is not supported by the device\n         - \\ref NVML_ERROR_GPU_IS_LOST                If the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH  If the version of \\a vgpuUtilInfo is invalid\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE          If \\a vgpuUtilInfo->vgpuUtilArray is NULL, or the buffer size of vgpuUtilInfo->vgpuInstanceCount is too small.\n                                                      The caller should check the current vGPU instance count from the returned vgpuUtilInfo->vgpuInstanceCount, and call\n                                                      the function again with a buffer of size vgpuUtilInfo->vgpuInstanceCount * sizeof(nvmlVgpuInstanceUtilizationInfo_t)\n         - \\ref NVML_ERROR_NOT_FOUND                  If sample entries are not found\n         - \\ref NVML_ERROR_UNKNOWN                    On any unexpected error*/\n    fn nvmlDeviceGetVgpuInstancesUtilizationInfo(\n        device: cuda_types::nvml::nvmlDevice_t,\n        vgpuUtilInfo: *mut cuda_types::nvml::nvmlVgpuInstancesUtilizationInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves current utilization for processes running on vGPUs on a physical GPU (device).\n\n For Maxwell &tm; or newer fully supported devices.\n\n Reads recent utilization of GPU SM (3D/Compute), framebuffer, video encoder, and video decoder for processes running on\n vGPU instances active on a device. Utilization values are returned as an array of utilization sample structures in the\n caller-supplied buffer pointed at by \\a utilizationSamples. One utilization sample structure is returned per process running\n on vGPU instances, that had some non-zero utilization during the last sample period. It includes the CPU timestamp at which\n the samples were recorded. Individual utilization values are returned as \"unsigned int\" values.\n\n To read utilization values, first determine the size of buffer required to hold the samples by invoking the function with\n \\a utilizationSamples set to NULL. The function will return NVML_ERROR_INSUFFICIENT_SIZE, with the current vGPU instance\n count in \\a vgpuProcessSamplesCount. The caller should allocate a buffer of size\n vgpuProcessSamplesCount * sizeof(nvmlVgpuProcessUtilizationSample_t). Invoke the function again with\n the allocated buffer passed in \\a utilizationSamples, and \\a vgpuProcessSamplesCount set to the number of entries the\n buffer is sized for.\n\n On successful return, the function updates \\a vgpuSubProcessSampleCount with the number of vGPU sub process utilization sample\n structures that were actually written. This may differ from a previously read value depending on the number of processes that are active\n in any given sample period.\n\n lastSeenTimeStamp represents the CPU timestamp in microseconds at which utilization samples were last read. Set it to 0\n to read utilization based on all the samples maintained by the driver's internal sample buffer. Set lastSeenTimeStamp\n to a timeStamp retrieved from a previous query to read utilization since the previous query.\n\n @param device                        The identifier for the target device\n @param lastSeenTimeStamp             Return only samples with timestamp greater than lastSeenTimeStamp.\n @param vgpuProcessSamplesCount       Pointer to caller-supplied array size, and returns number of processes running on vGPU instances\n @param utilizationSamples            Pointer to caller-supplied buffer in which vGPU sub process utilization samples are returned\n\n @return\n         - \\ref NVML_SUCCESS                 if utilization samples are successfully retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, \\a vgpuProcessSamplesCount or a sample count of 0 is\n                                             passed with a non-NULL \\a utilizationSamples\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if supplied \\a vgpuProcessSamplesCount is too small to return samples for all\n                                             vGPU instances currently executing on the device\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if vGPU is not supported by the device\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_NOT_FOUND         if sample entries are not found\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetVgpuProcessUtilization(\n        device: cuda_types::nvml::nvmlDevice_t,\n        lastSeenTimeStamp: ::core::ffi::c_ulonglong,\n        vgpuProcessSamplesCount: *mut ::core::ffi::c_uint,\n        utilizationSamples: *mut cuda_types::nvml::nvmlVgpuProcessUtilizationSample_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves recent utilization for processes running on vGPU instances on a physical GPU (device).\n\n For Maxwell &tm; or newer fully supported devices.\n\n Reads recent utilization of GPU SM (3D/Compute), framebuffer, video encoder, video decoder, jpeg decoder, and OFA for processes running\n on vGPU instances active on a device. Utilization values are returned as an array of utilization sample structures in the caller-supplied\n buffer pointed at by \\a vgpuProcUtilInfo->vgpuProcUtilArray. One utilization sample structure is returned per process running\n on vGPU instances, that had some non-zero utilization during the last sample period. It includes the CPU timestamp at which\n the samples were recorded. Individual utilization values are returned as \"unsigned int\" values.\n\n To read utilization values, first determine the size of buffer required to hold the samples by invoking the function with\n \\a vgpuProcUtilInfo->vgpuProcUtilArray set to NULL. The function will return NVML_ERROR_INSUFFICIENT_SIZE, with the current processes' count\n running on vGPU instances in \\a vgpuProcUtilInfo->vgpuProcessCount. The caller should allocate a buffer of size\n vgpuProcUtilInfo->vgpuProcessCount * sizeof(nvmlVgpuProcessUtilizationSample_t). Invoke the function again with the allocated buffer passed\n in \\a vgpuProcUtilInfo->vgpuProcUtilArray, and \\a vgpuProcUtilInfo->vgpuProcessCount set to the number of entries the buffer is sized for.\n\n On successful return, the function updates \\a vgpuProcUtilInfo->vgpuProcessCount with the number of vGPU sub process utilization sample\n structures that were actually written. This may differ from a previously read value depending on the number of processes that are active\n in any given sample period.\n\n vgpuProcUtilInfo->lastSeenTimeStamp represents the CPU timestamp in microseconds at which utilization samples were last read. Set it to 0\n to read utilization based on all the samples maintained by the driver's internal sample buffer. Set vgpuProcUtilInfo->lastSeenTimeStamp\n to a timeStamp retrieved from a previous query to read utilization since the previous query.\n\n @param device                        The identifier for the target device\n @param vgpuProcUtilInfo              Pointer to the caller-provided structure of nvmlVgpuProcessesUtilizationInfo_t\n\n @return\n         - \\ref NVML_SUCCESS                          If utilization samples are successfully retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED              If the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT           If \\a device is invalid, or \\a vgpuProcUtilInfo is null\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH  If the version of \\a vgpuProcUtilInfo is invalid\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE          If \\a vgpuProcUtilInfo->vgpuProcUtilArray is null, or supplied \\a vgpuProcUtilInfo->vgpuProcessCount\n                                                      is too small to return samples for all processes on vGPU instances currently executing on the device.\n                                                      The caller should check the current processes count from the returned \\a vgpuProcUtilInfo->vgpuProcessCount,\n                                                      and call the function again with a buffer of size\n                                                      vgpuProcUtilInfo->vgpuProcessCount * sizeof(nvmlVgpuProcessUtilizationSample_t)\n         - \\ref NVML_ERROR_NOT_SUPPORTED              If vGPU is not supported by the device\n         - \\ref NVML_ERROR_GPU_IS_LOST                If the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_NOT_FOUND                  If sample entries are not found\n         - \\ref NVML_ERROR_UNKNOWN                    On any unexpected error*/\n    fn nvmlDeviceGetVgpuProcessesUtilizationInfo(\n        device: cuda_types::nvml::nvmlDevice_t,\n        vgpuProcUtilInfo: *mut cuda_types::nvml::nvmlVgpuProcessesUtilizationInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Queries the state of per process accounting mode on vGPU.\n\n For Maxwell &tm; or newer fully supported devices.\n\n @param vgpuInstance            The identifier of the target vGPU instance\n @param mode                    Reference in which to return the current accounting mode\n\n @return\n         - \\ref NVML_SUCCESS                 if the mode has been successfully retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vgpuInstance is 0, or \\a mode is NULL\n         - \\ref NVML_ERROR_NOT_FOUND         if \\a vgpuInstance does not match a valid active vGPU instance on the system\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the vGPU doesn't support this feature\n         - \\ref NVML_ERROR_DRIVER_NOT_LOADED if NVIDIA driver is not running on the vGPU instance\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlVgpuInstanceGetAccountingMode(\n        vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n        mode: *mut cuda_types::nvml::nvmlEnableState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Queries list of processes running on vGPU that can be queried for accounting stats. The list of processes\n returned can be in running or terminated state.\n\n For Maxwell &tm; or newer fully supported devices.\n\n To just query the maximum number of processes that can be queried, call this function with *count = 0 and\n pids=NULL. The return code will be NVML_ERROR_INSUFFICIENT_SIZE, or NVML_SUCCESS if list is empty.\n\n For more details see \\ref nvmlVgpuInstanceGetAccountingStats.\n\n @note In case of PID collision some processes might not be accessible before the circular buffer is full.\n\n @param vgpuInstance            The identifier of the target vGPU instance\n @param count                   Reference in which to provide the \\a pids array size, and\n                                to return the number of elements ready to be queried\n @param pids                    Reference in which to return list of process ids\n\n @return\n         - \\ref NVML_SUCCESS                 if pids were successfully retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vgpuInstance is 0, or \\a count is NULL\n         - \\ref NVML_ERROR_NOT_FOUND         if \\a vgpuInstance does not match a valid active vGPU instance on the system\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the vGPU doesn't support this feature or accounting mode is disabled\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if \\a count is too small (\\a count is set to expected value)\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error\n\n @see nvmlVgpuInstanceGetAccountingPids*/\n    fn nvmlVgpuInstanceGetAccountingPids(\n        vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n        count: *mut ::core::ffi::c_uint,\n        pids: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Queries process's accounting stats.\n\n For Maxwell &tm; or newer fully supported devices.\n\n Accounting stats capture GPU utilization and other statistics across the lifetime of a process, and\n can be queried during life time of the process or after its termination.\n The time field in \\ref nvmlAccountingStats_t is reported as 0 during the lifetime of the process and\n updated to actual running time after its termination.\n Accounting stats are kept in a circular buffer, newly created processes overwrite information about old\n processes.\n\n See \\ref nvmlAccountingStats_t for description of each returned metric.\n List of processes that can be queried can be retrieved from \\ref nvmlVgpuInstanceGetAccountingPids.\n\n @note Accounting Mode needs to be on. See \\ref nvmlVgpuInstanceGetAccountingMode.\n @note Only compute and graphics applications stats can be queried. Monitoring applications stats can't be\n         queried since they don't contribute to GPU utilization.\n @note In case of pid collision stats of only the latest process (that terminated last) will be reported\n\n @param vgpuInstance            The identifier of the target vGPU instance\n @param pid                     Process Id of the target process to query stats for\n @param stats                   Reference in which to return the process's accounting stats\n\n @return\n         - \\ref NVML_SUCCESS                 if stats have been successfully retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vgpuInstance is 0, or \\a stats is NULL\n         - \\ref NVML_ERROR_NOT_FOUND         if \\a vgpuInstance does not match a valid active vGPU instance on the system\n                                             or \\a stats is not found\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the vGPU doesn't support this feature or accounting mode is disabled\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlVgpuInstanceGetAccountingStats(\n        vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n        pid: ::core::ffi::c_uint,\n        stats: *mut cuda_types::nvml::nvmlAccountingStats_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Clears accounting information of the vGPU instance that have already terminated.\n\n For Maxwell &tm; or newer fully supported devices.\n Requires root/admin permissions.\n\n @note Accounting Mode needs to be on. See \\ref nvmlVgpuInstanceGetAccountingMode.\n @note Only compute and graphics applications stats are reported and can be cleared since monitoring applications\n         stats don't contribute to GPU utilization.\n\n @param vgpuInstance            The identifier of the target vGPU instance\n\n @return\n         - \\ref NVML_SUCCESS                 if accounting information has been cleared\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vgpuInstance is invalid\n         - \\ref NVML_ERROR_NO_PERMISSION     if the user doesn't have permission to perform this operation\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the vGPU doesn't support this feature or accounting mode is disabled\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlVgpuInstanceClearAccountingPids(\n        vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Query the license information of the vGPU instance.\n\n For Maxwell &tm; or newer fully supported devices.\n\n @param vgpuInstance              Identifier of the target vGPU instance\n @param licenseInfo               Pointer to vGPU license information structure\n\n @return\n         - \\ref NVML_SUCCESS                 if information is successfully retrieved\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a vgpuInstance is 0, or \\a licenseInfo is NULL\n         - \\ref NVML_ERROR_NOT_FOUND         if \\a vgpuInstance does not match a valid active vGPU instance on the system\n         - \\ref NVML_ERROR_DRIVER_NOT_LOADED if NVIDIA driver is not running on the vGPU instance\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlVgpuInstanceGetLicenseInfo_v2(\n        vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n        licenseInfo: *mut cuda_types::nvml::nvmlVgpuLicenseInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the number of excluded GPU devices in the system.\n\n For all products.\n\n @param deviceCount                          Reference in which to return the number of excluded devices\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a deviceCount has been set\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a deviceCount is NULL*/\n    fn nvmlGetExcludedDeviceCount(\n        deviceCount: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Acquire the device information for an excluded GPU device, based on its index.\n\n For all products.\n\n Valid indices are derived from the \\a deviceCount returned by\n   \\ref nvmlGetExcludedDeviceCount(). For example, if \\a deviceCount is 2 the valid indices\n   are 0 and 1, corresponding to GPU 0 and GPU 1.\n\n @param index                                The index of the target GPU, >= 0 and < \\a deviceCount\n @param info                                 Reference in which to return the device information\n\n @return\n         - \\ref NVML_SUCCESS                  if \\a device has been set\n         - \\ref NVML_ERROR_INVALID_ARGUMENT   if \\a index is invalid or \\a info is NULL\n\n @see nvmlGetExcludedDeviceCount*/\n    fn nvmlGetExcludedDeviceInfoByIndex(\n        index: ::core::ffi::c_uint,\n        info: *mut cuda_types::nvml::nvmlExcludedDeviceInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Read or write a GPU PRM register. The input is assumed to be in TLV format in\n network byte order.\n\n For Blackwell &tm; or newer fully supported devices.\n\n Supported on Linux only.\n\n @param device                                        Identifer of target GPU device\n @param buffer                                        Structure holding the input data in TLV format as well as\n                                                      the PRM register contents in TLV format (in the case of a successful\n                                                      read operation).\n                                                      Note: the input data and any returned data shall be in network byte order.\n\n @return\n        - \\ref NVML_SUCCESS                           on success\n        - \\ref NVML_ERROR_INVALID_ARGUMENT            if \\p device or \\p buffer are invalid\n        - \\ref NVML_ERROR_NO_PERMISSION               if user does not have permission to perform this operation\n        - \\ref NVML_ERROR_NOT_SUPPORTED               if this feature is not supported by the device\n        - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH   if the version specified in \\p buffer is not supported*/\n    fn nvmlDeviceReadWritePRM_v1(\n        device: cuda_types::nvml::nvmlDevice_t,\n        buffer: *mut cuda_types::nvml::nvmlPRMTLV_v1_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Set MIG mode for the device.\n\n For Ampere &tm; or newer fully supported devices.\n Requires root user.\n\n This mode determines whether a GPU instance can be created.\n\n This API may unbind or reset the device to activate the requested mode. Thus, the attributes associated with the\n device, such as minor number, might change. The caller of this API is expected to query such attributes again.\n\n On certain platforms like pass-through virtualization, where reset functionality may not be exposed directly, VM\n reboot is required. \\a activationStatus would return \\ref NVML_ERROR_RESET_REQUIRED for such cases.\n\n \\a activationStatus would return the appropriate error code upon unsuccessful activation. For example, if device\n unbind fails because the device isn't idle, \\ref NVML_ERROR_IN_USE would be returned. The caller of this API\n is expected to idle the device and retry setting the \\a mode.\n\n @note On Windows, only disabling MIG mode is supported. \\a activationStatus would return \\ref\n       NVML_ERROR_NOT_SUPPORTED as GPU reset is not supported on Windows through this API.\n\n @param device                               The identifier of the target device\n @param mode                                 The mode to be set, \\ref NVML_DEVICE_MIG_DISABLE or\n                                             \\ref NVML_DEVICE_MIG_ENABLE\n @param activationStatus                     The activationStatus status\n\n @return\n         - \\ref NVML_SUCCESS                 Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED     If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  If \\a device,\\a mode or \\a activationStatus are invalid\n         - \\ref NVML_ERROR_NO_PERMISSION     If user doesn't have permission to perform the operation\n         - \\ref NVML_ERROR_NOT_SUPPORTED     If \\a device doesn't support MIG mode*/\n    fn nvmlDeviceSetMigMode(\n        device: cuda_types::nvml::nvmlDevice_t,\n        mode: ::core::ffi::c_uint,\n        activationStatus: *mut cuda_types::nvml::nvmlReturn_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get MIG mode for the device.\n\n For Ampere &tm; or newer fully supported devices.\n\n Changing MIG modes may require device unbind or reset. The \"pending\" MIG mode refers to the target mode following the\n next activation trigger.\n\n @param device                               The identifier of the target device\n @param currentMode                          Returns the current mode, \\ref NVML_DEVICE_MIG_DISABLE or\n                                             \\ref NVML_DEVICE_MIG_ENABLE\n @param pendingMode                          Returns the pending mode, \\ref NVML_DEVICE_MIG_DISABLE or\n                                             \\ref NVML_DEVICE_MIG_ENABLE\n\n @return\n         - \\ref NVML_SUCCESS                 Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED     If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  If \\a device, \\a currentMode or \\a pendingMode are invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     If \\a device doesn't support MIG mode\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetMigMode(\n        device: cuda_types::nvml::nvmlDevice_t,\n        currentMode: *mut ::core::ffi::c_uint,\n        pendingMode: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get GPU instance profile information\n\n Information provided by this API is immutable throughout the lifetime of a MIG mode.\n\n @note This API can be used to enumerate all MIG profiles supported by NVML in a forward compatible\n way by invoking it on \\a profile values starting from 0, until the API returns \\ref NVML_ERROR_INVALID_ARGUMENT.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux only.\n\n @param device                               The identifier of the target device\n @param profile                              One of the NVML_GPU_INSTANCE_PROFILE_*\n @param info                                 Returns detailed profile information\n\n @return\n         - \\ref NVML_SUCCESS                 Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED     If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  If \\a device, \\a profile or \\a info are invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     If \\a device doesn't support MIG or \\a profile isn't supported\n         - \\ref NVML_ERROR_NO_PERMISSION     If user doesn't have permission to perform the operation*/\n    fn nvmlDeviceGetGpuInstanceProfileInfo(\n        device: cuda_types::nvml::nvmlDevice_t,\n        profile: ::core::ffi::c_uint,\n        info: *mut cuda_types::nvml::nvmlGpuInstanceProfileInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Versioned wrapper around \\ref nvmlDeviceGetGpuInstanceProfileInfo that accepts a versioned\n \\ref nvmlGpuInstanceProfileInfo_v2_t or later output structure.\n\n @note The caller must set the \\ref nvmlGpuInstanceProfileInfo_v2_t.version field to the\n appropriate version prior to calling this function. For example:\n \\code\n     nvmlGpuInstanceProfileInfo_v2_t profileInfo =\n         { .version = nvmlGpuInstanceProfileInfo_v2 };\n     nvmlReturn_t result = nvmlDeviceGetGpuInstanceProfileInfoV(device,\n                                                                profile,\n                                                                &profileInfo);\n \\endcode\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux only.\n\n @param device                               The identifier of the target device\n @param profile                              One of the NVML_GPU_INSTANCE_PROFILE_*\n @param info                                 Returns detailed profile information\n\n @return\n         - \\ref NVML_SUCCESS                 Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED     If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  If \\a device, \\a profile, \\a info, or \\a info->version are invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     If \\a device doesn't have MIG mode enabled or \\a profile isn't supported\n         - \\ref NVML_ERROR_NO_PERMISSION     If user doesn't have permission to perform the operation*/\n    fn nvmlDeviceGetGpuInstanceProfileInfoV(\n        device: cuda_types::nvml::nvmlDevice_t,\n        profile: ::core::ffi::c_uint,\n        info: *mut cuda_types::nvml::nvmlGpuInstanceProfileInfo_v2_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** GPU instance profile query function that accepts profile ID, instead of profile name.\n It accepts a versioned \\ref nvmlGpuInstanceProfileInfo_v2_t or later output structure.\n\n @note The caller must set the \\ref nvmlGpuInstanceProfileInfo_v2_t.version field to the\n appropriate version prior to calling this function. For example:\n \\code\n     nvmlGpuInstanceProfileInfo_v2_t profileInfo =\n         { .version = nvmlGpuInstanceProfileInfo_v2 };\n     nvmlReturn_t result = nvmlDeviceGetGpuInstanceProfileInfoV(device,\n                                                                profile,\n                                                                &profileInfo);\n \\endcode\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux only.\n\n @param device                               The identifier of the target device\n @param profileId                            One of the profile IDs.\n @param info                                 Returns detailed profile information\n\n @return\n         - \\ref NVML_SUCCESS                 Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED     If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  If \\a device, \\a profileId, \\a info, or \\a info->version are invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     If \\a device doesn't have MIG mode enabled or \\a profile isn't supported\n         - \\ref NVML_ERROR_NO_PERMISSION     If user doesn't have permission to perform the operation*/\n    fn nvmlDeviceGetGpuInstanceProfileInfoByIdV(\n        device: cuda_types::nvml::nvmlDevice_t,\n        profileId: ::core::ffi::c_uint,\n        info: *mut cuda_types::nvml::nvmlGpuInstanceProfileInfo_v2_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get GPU instance placements.\n\n A placement represents the location of a GPU instance within a device. This API only returns all the possible\n placements for the given profile regardless of whether MIG is enabled or not.\n A created GPU instance occupies memory slices described by its placement. Creation of new GPU instance will\n fail if there is overlap with the already occupied memory slices.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux only.\n Requires privileged user.\n\n @param device                               The identifier of the target device\n @param profileId                            The GPU instance profile ID. See \\ref nvmlDeviceGetGpuInstanceProfileInfo\n @param placements                           Returns placements allowed for the profile. Can be NULL to discover number\n                                             of allowed placements for this profile. If non-NULL must be large enough\n                                             to accommodate the placements supported by the profile.\n @param count                                Returns number of allowed placemenets for the profile.\n\n @return\n         - \\ref NVML_SUCCESS                 Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED     If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  If \\a device, \\a profileId or \\a count are invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     If \\a device doesn't support MIG or \\a profileId isn't supported\n         - \\ref NVML_ERROR_NO_PERMISSION     If user doesn't have permission to perform the operation*/\n    fn nvmlDeviceGetGpuInstancePossiblePlacements_v2(\n        device: cuda_types::nvml::nvmlDevice_t,\n        profileId: ::core::ffi::c_uint,\n        placements: *mut cuda_types::nvml::nvmlGpuInstancePlacement_t,\n        count: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get GPU instance profile capacity.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux only.\n Requires privileged user.\n\n @param device                               The identifier of the target device\n @param profileId                            The GPU instance profile ID. See \\ref nvmlDeviceGetGpuInstanceProfileInfo\n @param count                                Returns remaining instance count for the profile ID\n\n @return\n         - \\ref NVML_SUCCESS                 Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED     If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  If \\a device, \\a profileId or \\a count are invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     If \\a device doesn't have MIG mode enabled or \\a profileId isn't supported\n         - \\ref NVML_ERROR_NO_PERMISSION     If user doesn't have permission to perform the operation*/\n    fn nvmlDeviceGetGpuInstanceRemainingCapacity(\n        device: cuda_types::nvml::nvmlDevice_t,\n        profileId: ::core::ffi::c_uint,\n        count: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Create GPU instance.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux only.\n Requires privileged user.\n\n If the parent device is unbound, reset or the GPU instance is destroyed explicitly, the GPU instance handle would\n become invalid. The GPU instance must be recreated to acquire a valid handle.\n\n @param device                               The identifier of the target device\n @param profileId                            The GPU instance profile ID. See \\ref nvmlDeviceGetGpuInstanceProfileInfo\n @param gpuInstance                          Returns the GPU instance handle\n\n @return\n         - \\ref NVML_SUCCESS                       Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED           If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT        If \\a device, \\a profile, \\a profileId or \\a gpuInstance are invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED           If \\a device doesn't have MIG mode enabled or in vGPU guest\n         - \\ref NVML_ERROR_NO_PERMISSION           If user doesn't have permission to perform the operation\n         - \\ref NVML_ERROR_INSUFFICIENT_RESOURCES  If the requested GPU instance could not be created*/\n    fn nvmlDeviceCreateGpuInstance(\n        device: cuda_types::nvml::nvmlDevice_t,\n        profileId: ::core::ffi::c_uint,\n        gpuInstance: *mut cuda_types::nvml::nvmlGpuInstance_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Create GPU instance with the specified placement.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux only.\n Requires privileged user.\n\n If the parent device is unbound, reset or the GPU instance is destroyed explicitly, the GPU instance handle would\n become invalid. The GPU instance must be recreated to acquire a valid handle.\n\n @param device                               The identifier of the target device\n @param profileId                            The GPU instance profile ID. See \\ref nvmlDeviceGetGpuInstanceProfileInfo\n @param placement                            The requested placement. See \\ref nvmlDeviceGetGpuInstancePossiblePlacements_v2\n @param gpuInstance                          Returns the GPU instance handle\n\n @return\n         - \\ref NVML_SUCCESS                       Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED           If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT        If \\a device, \\a profile, \\a profileId, \\a placement or \\a gpuInstance\n                                                   are invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED           If \\a device doesn't have MIG mode enabled or in vGPU guest\n         - \\ref NVML_ERROR_NO_PERMISSION           If user doesn't have permission to perform the operation\n         - \\ref NVML_ERROR_INSUFFICIENT_RESOURCES  If the requested GPU instance could not be created*/\n    fn nvmlDeviceCreateGpuInstanceWithPlacement(\n        device: cuda_types::nvml::nvmlDevice_t,\n        profileId: ::core::ffi::c_uint,\n        placement: *const cuda_types::nvml::nvmlGpuInstancePlacement_t,\n        gpuInstance: *mut cuda_types::nvml::nvmlGpuInstance_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Destroy GPU instance.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux only.\n Requires privileged user.\n\n @param gpuInstance                          The GPU instance handle\n\n @return\n         - \\ref NVML_SUCCESS                 Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED     If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  If \\a gpuInstance is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     If \\a device doesn't have MIG mode enabled or in vGPU guest\n         - \\ref NVML_ERROR_NO_PERMISSION     If user doesn't have permission to perform the operation\n         - \\ref NVML_ERROR_IN_USE            If the GPU instance is in use. This error would be returned if processes\n                                             (e.g. CUDA application) or compute instances are active on the\n                                             GPU instance.*/\n    fn nvmlGpuInstanceDestroy(\n        gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get GPU instances for given profile ID.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux only.\n Requires privileged user.\n\n @param device                               The identifier of the target device\n @param profileId                            The GPU instance profile ID. See \\ref nvmlDeviceGetGpuInstanceProfileInfo\n @param gpuInstances                         Returns pre-exiting GPU instances, the buffer must be large enough to\n                                             accommodate the instances supported by the profile.\n                                             See \\ref nvmlDeviceGetGpuInstanceProfileInfo\n @param count                                The count of returned GPU instances\n\n @return\n         - \\ref NVML_SUCCESS                 Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED     If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  If \\a device, \\a profileId, \\a gpuInstances or \\a count are invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     If \\a device doesn't have MIG mode enabled\n         - \\ref NVML_ERROR_NO_PERMISSION     If user doesn't have permission to perform the operation*/\n    fn nvmlDeviceGetGpuInstances(\n        device: cuda_types::nvml::nvmlDevice_t,\n        profileId: ::core::ffi::c_uint,\n        gpuInstances: *mut cuda_types::nvml::nvmlGpuInstance_t,\n        count: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get GPU instances for given instance ID.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux only.\n Requires privileged user.\n\n @param device                               The identifier of the target device\n @param id                                   The GPU instance ID\n @param gpuInstance                          Returns GPU instance\n\n @return\n         - \\ref NVML_SUCCESS                 Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED     If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  If \\a device, \\a id or \\a gpuInstance are invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     If \\a device doesn't have MIG mode enabled\n         - \\ref NVML_ERROR_NO_PERMISSION     If user doesn't have permission to perform the operation\n         - \\ref NVML_ERROR_NOT_FOUND         If the GPU instance is not found.*/\n    fn nvmlDeviceGetGpuInstanceById(\n        device: cuda_types::nvml::nvmlDevice_t,\n        id: ::core::ffi::c_uint,\n        gpuInstance: *mut cuda_types::nvml::nvmlGpuInstance_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get GPU instance information.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux only.\n\n @param gpuInstance                          The GPU instance handle\n @param info                                 Return GPU instance information\n\n @return\n         - \\ref NVML_SUCCESS                 Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED     If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  If \\a gpuInstance or \\a info are invalid\n         - \\ref NVML_ERROR_NO_PERMISSION     If user doesn't have permission to perform the operation*/\n    fn nvmlGpuInstanceGetInfo(\n        gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n        info: *mut cuda_types::nvml::nvmlGpuInstanceInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get compute instance profile information.\n\n Information provided by this API is immutable throughout the lifetime of a MIG mode.\n\n @note This API can be used to enumerate all MIG profiles supported by NVML in a forward compatible\n way by invoking it on \\a profile values starting from 0, until the API returns \\ref NVML_ERROR_INVALID_ARGUMENT.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux only.\n\n @param gpuInstance                          The identifier of the target GPU instance\n @param profile                              One of the NVML_COMPUTE_INSTANCE_PROFILE_*\n @param engProfile                           One of the NVML_COMPUTE_INSTANCE_ENGINE_PROFILE_*\n @param info                                 Returns detailed profile information\n\n @return\n         - \\ref NVML_SUCCESS                 Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED     If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  If \\a gpuInstance, \\a profile, \\a engProfile or \\a info are invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     If \\a profile isn't supported\n         - \\ref NVML_ERROR_NO_PERMISSION     If user doesn't have permission to perform the operation*/\n    fn nvmlGpuInstanceGetComputeInstanceProfileInfo(\n        gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n        profile: ::core::ffi::c_uint,\n        engProfile: ::core::ffi::c_uint,\n        info: *mut cuda_types::nvml::nvmlComputeInstanceProfileInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Versioned wrapper around \\ref nvmlGpuInstanceGetComputeInstanceProfileInfo that accepts a versioned\n \\ref nvmlComputeInstanceProfileInfo_v2_t or later output structure.\n\n @note The caller must set the \\ref nvmlGpuInstanceProfileInfo_v2_t.version field to the\n appropriate version prior to calling this function. For example:\n \\code\n     nvmlComputeInstanceProfileInfo_v2_t profileInfo =\n         { .version = nvmlComputeInstanceProfileInfo_v2 };\n     nvmlReturn_t result = nvmlGpuInstanceGetComputeInstanceProfileInfoV(gpuInstance,\n                                                                         profile,\n                                                                         engProfile,\n                                                                         &profileInfo);\n \\endcode\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux only.\n\n @param gpuInstance                          The identifier of the target GPU instance\n @param profile                              One of the NVML_COMPUTE_INSTANCE_PROFILE_*\n @param engProfile                           One of the NVML_COMPUTE_INSTANCE_ENGINE_PROFILE_*\n @param info                                 Returns detailed profile information\n\n @return\n         - \\ref NVML_SUCCESS                 Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED     If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  If \\a gpuInstance, \\a profile, \\a engProfile, \\a info, or \\a info->version are invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     If \\a profile isn't supported\n         - \\ref NVML_ERROR_NO_PERMISSION     If user doesn't have permission to perform the operation*/\n    fn nvmlGpuInstanceGetComputeInstanceProfileInfoV(\n        gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n        profile: ::core::ffi::c_uint,\n        engProfile: ::core::ffi::c_uint,\n        info: *mut cuda_types::nvml::nvmlComputeInstanceProfileInfo_v2_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get compute instance profile capacity.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux only.\n Requires privileged user.\n\n @param gpuInstance                          The identifier of the target GPU instance\n @param profileId                            The compute instance profile ID.\n                                             See \\ref nvmlGpuInstanceGetComputeInstanceProfileInfo\n @param count                                Returns remaining instance count for the profile ID\n\n @return\n         - \\ref NVML_SUCCESS                 Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED     If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  If \\a gpuInstance, \\a profileId or \\a availableCount are invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     If \\a profileId isn't supported\n         - \\ref NVML_ERROR_NO_PERMISSION     If user doesn't have permission to perform the operation*/\n    fn nvmlGpuInstanceGetComputeInstanceRemainingCapacity(\n        gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n        profileId: ::core::ffi::c_uint,\n        count: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get compute instance placements.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux only.\n Requires privileged user.\n\n A placement represents the location of a compute instance within a GPU instance. This API only returns all the possible\n placements for the given profile.\n A created compute instance occupies compute slices described by its placement. Creation of new compute instance will\n fail if there is overlap with the already occupied compute slices.\n\n @param gpuInstance                          The identifier of the target GPU instance\n @param profileId                            The compute instance profile ID. See \\ref  nvmlGpuInstanceGetComputeInstanceProfileInfo\n @param placements                           Returns placements allowed for the profile. Can be NULL to discover number\n                                             of allowed placements for this profile. If non-NULL must be large enough\n                                             to accommodate the placements supported by the profile.\n @param count                                Returns number of allowed placemenets for the profile.\n\n @return\n         - \\ref NVML_SUCCESS                 Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED     If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  If \\a gpuInstance, \\a profileId or \\a count are invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     If \\a device doesn't have MIG mode enabled or \\a profileId isn't supported\n         - \\ref NVML_ERROR_NO_PERMISSION     If user doesn't have permission to perform the operation*/\n    fn nvmlGpuInstanceGetComputeInstancePossiblePlacements(\n        gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n        profileId: ::core::ffi::c_uint,\n        placements: *mut cuda_types::nvml::nvmlComputeInstancePlacement_t,\n        count: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Create compute instance.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux only.\n Requires privileged user.\n\n If the parent device is unbound, reset or the parent GPU instance is destroyed or the compute instance is destroyed\n explicitly, the compute instance handle would become invalid. The compute instance must be recreated to acquire\n a valid handle.\n\n @param gpuInstance                          The identifier of the target GPU instance\n @param profileId                            The compute instance profile ID.\n                                             See \\ref nvmlGpuInstanceGetComputeInstanceProfileInfo\n @param computeInstance                      Returns the compute instance handle\n\n @return\n         - \\ref NVML_SUCCESS                       Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED           If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT        If \\a gpuInstance, \\a profile, \\a profileId or \\a computeInstance\n                                                   are invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED           If \\a profileId isn't supported\n         - \\ref NVML_ERROR_NO_PERMISSION           If user doesn't have permission to perform the operation\n         - \\ref NVML_ERROR_INSUFFICIENT_RESOURCES  If the requested compute instance could not be created*/\n    fn nvmlGpuInstanceCreateComputeInstance(\n        gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n        profileId: ::core::ffi::c_uint,\n        computeInstance: *mut cuda_types::nvml::nvmlComputeInstance_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Create compute instance with the specified placement.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux only.\n Requires privileged user.\n\n If the parent device is unbound, reset or the parent GPU instance is destroyed or the compute instance is destroyed\n explicitly, the compute instance handle would become invalid. The compute instance must be recreated to acquire\n a valid handle.\n\n @param gpuInstance                          The identifier of the target GPU instance\n @param profileId                            The compute instance profile ID.\n                                             See \\ref nvmlGpuInstanceGetComputeInstanceProfileInfo\n @param placement                            The requested placement. See \\ref nvmlGpuInstanceGetComputeInstancePossiblePlacements\n @param computeInstance                      Returns the compute instance handle\n\n @return\n         - \\ref NVML_SUCCESS                       Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED           If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT        If \\a gpuInstance, \\a profile, \\a profileId or \\a computeInstance\n                                                   are invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED           If \\a profileId isn't supported\n         - \\ref NVML_ERROR_NO_PERMISSION           If user doesn't have permission to perform the operation\n         - \\ref NVML_ERROR_INSUFFICIENT_RESOURCES  If the requested compute instance could not be created*/\n    fn nvmlGpuInstanceCreateComputeInstanceWithPlacement(\n        gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n        profileId: ::core::ffi::c_uint,\n        placement: *const cuda_types::nvml::nvmlComputeInstancePlacement_t,\n        computeInstance: *mut cuda_types::nvml::nvmlComputeInstance_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Destroy compute instance.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux only.\n Requires privileged user.\n\n @param computeInstance                      The compute instance handle\n\n @return\n         - \\ref NVML_SUCCESS                 Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED     If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  If \\a computeInstance is invalid\n         - \\ref NVML_ERROR_NO_PERMISSION     If user doesn't have permission to perform the operation\n         - \\ref NVML_ERROR_IN_USE            If the compute instance is in use. This error would be returned if\n                                             processes (e.g. CUDA application) are active on the compute instance.*/\n    fn nvmlComputeInstanceDestroy(\n        computeInstance: cuda_types::nvml::nvmlComputeInstance_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get compute instances for given profile ID.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux only.\n Requires privileged user.\n\n @param gpuInstance                          The identifier of the target GPU instance\n @param profileId                            The compute instance profile ID.\n                                             See \\ref nvmlGpuInstanceGetComputeInstanceProfileInfo\n @param computeInstances                     Returns pre-exiting compute instances, the buffer must be large enough to\n                                             accommodate the instances supported by the profile.\n                                             See \\ref nvmlGpuInstanceGetComputeInstanceProfileInfo\n @param count                                The count of returned compute instances\n\n @return\n         - \\ref NVML_SUCCESS                 Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED     If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  If \\a gpuInstance, \\a profileId, \\a computeInstances or \\a count\n                                             are invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     If \\a profileId isn't supported\n         - \\ref NVML_ERROR_NO_PERMISSION     If user doesn't have permission to perform the operation*/\n    fn nvmlGpuInstanceGetComputeInstances(\n        gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n        profileId: ::core::ffi::c_uint,\n        computeInstances: *mut cuda_types::nvml::nvmlComputeInstance_t,\n        count: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get compute instance for given instance ID.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux only.\n Requires privileged user.\n\n @param gpuInstance                          The identifier of the target GPU instance\n @param id                                   The compute instance ID\n @param computeInstance                      Returns compute instance\n\n @return\n         - \\ref NVML_SUCCESS                 Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED     If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  If \\a device, \\a ID or \\a computeInstance are invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     If \\a device doesn't have MIG mode enabled\n         - \\ref NVML_ERROR_NO_PERMISSION     If user doesn't have permission to perform the operation\n         - \\ref NVML_ERROR_NOT_FOUND         If the compute instance is not found.*/\n    fn nvmlGpuInstanceGetComputeInstanceById(\n        gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n        id: ::core::ffi::c_uint,\n        computeInstance: *mut cuda_types::nvml::nvmlComputeInstance_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get compute instance information.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux only.\n\n @param computeInstance                      The compute instance handle\n @param info                                 Return compute instance information\n\n @return\n         - \\ref NVML_SUCCESS                 Upon success\n         - \\ref NVML_ERROR_UNINITIALIZED     If library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  If \\a computeInstance or \\a info are invalid\n         - \\ref NVML_ERROR_NO_PERMISSION     If user doesn't have permission to perform the operation*/\n    fn nvmlComputeInstanceGetInfo_v2(\n        computeInstance: cuda_types::nvml::nvmlComputeInstance_t,\n        info: *mut cuda_types::nvml::nvmlComputeInstanceInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Test if the given handle refers to a MIG device.\n\n A MIG device handle is an NVML abstraction which maps to a MIG compute instance.\n These overloaded references can be used (with some restrictions) interchangeably\n with a GPU device handle to execute queries at a per-compute instance granularity.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux only.\n\n @param device                               NVML handle to test\n @param isMigDevice                          True when handle refers to a MIG device\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a device status was successfully retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device handle or \\a isMigDevice reference is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this check is not supported by the device\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceIsMigDeviceHandle(\n        device: cuda_types::nvml::nvmlDevice_t,\n        isMigDevice: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get GPU instance ID for the given MIG device handle.\n\n GPU instance IDs are unique per device and remain valid until the GPU instance is destroyed.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux only.\n\n @param device                               Target MIG device handle\n @param id                                   GPU instance ID\n\n @return\n         - \\ref NVML_SUCCESS                 if instance ID was successfully retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device or \\a id reference is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by the device\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetGpuInstanceId(\n        device: cuda_types::nvml::nvmlDevice_t,\n        id: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get compute instance ID for the given MIG device handle.\n\n Compute instance IDs are unique per GPU instance and remain valid until the compute instance\n is destroyed.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux only.\n\n @param device                               Target MIG device handle\n @param id                                   Compute instance ID\n\n @return\n         - \\ref NVML_SUCCESS                 if instance ID was successfully retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device or \\a id reference is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by the device\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetComputeInstanceId(\n        device: cuda_types::nvml::nvmlDevice_t,\n        id: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get the maximum number of MIG devices that can exist under a given parent NVML device.\n\n Returns zero if MIG is not supported or enabled.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux only.\n\n @param device                               Target device handle\n @param count                                Count of MIG devices\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a count was successfully retrieved\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device or \\a count reference is invalid\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetMaxMigDeviceCount(\n        device: cuda_types::nvml::nvmlDevice_t,\n        count: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get MIG device handle for the given index under its parent NVML device.\n\n If the compute instance is destroyed either explicitly or by destroying,\n resetting or unbinding the parent GPU instance or the GPU device itself\n the MIG device handle would remain invalid and must be requested again\n using this API. Handles may be reused and their properties can change in\n the process.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux only.\n\n @param device                               Reference to the parent GPU device handle\n @param index                                Index of the MIG device\n @param migDevice                            Reference to the MIG device handle\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a migDevice handle was successfully created\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device, \\a index or \\a migDevice reference is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by the device\n         - \\ref NVML_ERROR_NOT_FOUND         if no valid MIG device was found at \\a index\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetMigDeviceHandleByIndex(\n        device: cuda_types::nvml::nvmlDevice_t,\n        index: ::core::ffi::c_uint,\n        migDevice: *mut cuda_types::nvml::nvmlDevice_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get parent device handle from a MIG device handle.\n\n For Ampere &tm; or newer fully supported devices.\n Supported on Linux only.\n\n @param migDevice                            MIG device handle\n @param device                               Device handle\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a device handle was successfully created\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a migDevice or \\a device is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by the device\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetDeviceHandleFromMigDeviceHandle(\n        migDevice: cuda_types::nvml::nvmlDevice_t,\n        device: *mut cuda_types::nvml::nvmlDevice_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Calculate GPM metrics from two samples.\n\n For Hopper &tm; or newer fully supported devices.\n\n To retrieve metrics, the user must first allocate the two sample buffers at \\a metricsGet->sample1\n and \\a metricsGet->sample2 by calling \\a nvmlGpmSampleAlloc(). Next, the user should fill in the ID of each metric\n in \\a metricsGet->metrics[i].metricId and specify the total number of metrics to retrieve in \\a metricsGet->numMetrics,\n The version should be set to NVML_GPM_METRICS_GET_VERSION in \\a metricsGet->version. The user then calls the\n \\a nvmlGpmSampleGet() API twice to obtain 2 samples of counters.\n\n @note The interval between these two \\a nvmlGpmSampleGet() calls should be greater than 100ms due to the\n internal sample refresh rate. Finally, the user calls \\a nvmlGpmMetricsGet to retrieve the metrics, which will\n be stored at \\a metricsGet->metrics\n\n\n @param metricsGet             IN/OUT: populated \\a nvmlGpmMetricsGet_t struct\n\n @return\n         - \\ref NVML_SUCCESS on success\n         - Nonzero NVML_ERROR_? enum on error*/\n    fn nvmlGpmMetricsGet(\n        metricsGet: *mut cuda_types::nvml::nvmlGpmMetricsGet_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Free an allocated sample buffer that was allocated with \\ref nvmlGpmSampleAlloc()\n\n For Hopper &tm; or newer fully supported devices.\n\n @param gpmSample              Sample to free\n\n @return\n         - \\ref NVML_SUCCESS                on success\n         - \\ref NVML_ERROR_INVALID_ARGUMENT if an invalid pointer is provided*/\n    fn nvmlGpmSampleFree(\n        gpmSample: cuda_types::nvml::nvmlGpmSample_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Allocate a sample buffer to be used with NVML GPM . You will need to allocate\n at least two of these buffers to use with the NVML GPM feature\n\n For Hopper &tm; or newer fully supported devices.\n\n @param gpmSample             Where  the allocated sample will be stored\n\n @return\n         - \\ref NVML_SUCCESS                on success\n         - \\ref NVML_ERROR_INVALID_ARGUMENT if an invalid pointer is provided\n         - \\ref NVML_ERROR_MEMORY           if system memory is insufficient*/\n    fn nvmlGpmSampleAlloc(\n        gpmSample: *mut cuda_types::nvml::nvmlGpmSample_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Read a sample of GPM metrics into the provided \\a gpmSample buffer. After\n two samples are gathered, you can call nvmlGpmMetricGet on those samples to\n retrive metrics\n\n For Hopper &tm; or newer fully supported devices.\n\n @note The interval between two \\a nvmlGpmSampleGet() calls should be greater than 100ms due to\n the internal sample refresh rate.\n\n @param device                Device to get samples for\n @param gpmSample             Buffer to read samples into\n\n @return\n         - \\ref NVML_SUCCESS on success\n         - Nonzero NVML_ERROR_? enum on error*/\n    fn nvmlGpmSampleGet(\n        device: cuda_types::nvml::nvmlDevice_t,\n        gpmSample: cuda_types::nvml::nvmlGpmSample_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Read a sample of GPM metrics into the provided \\a gpmSample buffer for a MIG GPU Instance.\n\n After two samples are gathered, you can call nvmlGpmMetricGet on those\n samples to retrive metrics\n\n For Hopper &tm; or newer fully supported devices.\n\n @note The interval between two \\a nvmlGpmMigSampleGet() calls should be greater than 100ms due to\n the internal sample refresh rate.\n\n @param device                Device to get samples for\n @param gpuInstanceId         MIG GPU Instance ID\n @param gpmSample             Buffer to read samples into\n\n @return\n         - \\ref NVML_SUCCESS on success\n         - Nonzero NVML_ERROR_? enum on error*/\n    fn nvmlGpmMigSampleGet(\n        device: cuda_types::nvml::nvmlDevice_t,\n        gpuInstanceId: ::core::ffi::c_uint,\n        gpmSample: cuda_types::nvml::nvmlGpmSample_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Indicate whether the supplied device supports GPM\n\n For Hopper &tm; or newer fully supported devices.\n\n @param device                NVML device to query for\n @param gpmSupport            Structure to indicate GPM support \\a nvmlGpmSupport_t. Indicates\n                              GPM support per system for the supplied device\n\n @return\n         - NVML_SUCCESS on success\n         - Nonzero NVML_ERROR_? enum if there is an error in processing the query*/\n    fn nvmlGpmQueryDeviceSupport(\n        device: cuda_types::nvml::nvmlDevice_t,\n        gpmSupport: *mut cuda_types::nvml::nvmlGpmSupport_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get GPM stream state.\n\n For Hopper &tm; or newer fully supported devices.\n Supported on Linux, Windows TCC.\n\n @param device                               The identifier of the target device\n @param state                                Returns GPM stream state\n                                             NVML_FEATURE_DISABLED or NVML_FEATURE_ENABLED\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a current GPM stream state were successfully queried\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a  device is invalid or \\a state is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by the device*/\n    fn nvmlGpmQueryIfStreamingEnabled(\n        device: cuda_types::nvml::nvmlDevice_t,\n        state: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Set GPM stream state.\n\n For Hopper &tm; or newer fully supported devices.\n Supported on Linux, Windows TCC.\n\n @param device                               The identifier of the target device\n @param state                                GPM stream state,\n                                             NVML_FEATURE_DISABLED or NVML_FEATURE_ENABLED\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a current GPM stream state is successfully set\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if this query is not supported by the device*/\n    fn nvmlGpmSetStreamingEnabled(\n        device: cuda_types::nvml::nvmlDevice_t,\n        state: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get device capabilities\n\n See \\ref  nvmlDeviceCapabilities_v1_t for more information on the struct.\n\n @param device                               The identifier of the target device\n @param caps                                 Returns GPU's capabilities\n\n @return\n         - \\ref NVML_SUCCESS                         If the query is success\n         - \\ref NVML_ERROR_UNINITIALIZED             If the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT          If \\a device is invalid or \\a counters is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED             If the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST               If the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH If the provided version is invalid/unsupported\n         - \\ref NVML_ERROR_UNKNOWN                   On any unexpected error*/\n    fn nvmlDeviceGetCapabilities(\n        device: cuda_types::nvml::nvmlDevice_t,\n        caps: *mut cuda_types::nvml::nvmlDeviceCapabilities_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get Performance Profiles Information\n\n For Blackwell &tm; or newer fully supported devices.\n See \\ref nvmlWorkloadPowerProfileProfilesInfo_v1_t for more information on the struct.\n The mask \\a perfProfilesMask is bitmask of all supported mode indices where the\n mode is supported if the index is 1. Each supported mode will have a corresponding\n entry in the \\a perfProfile array which will contain the \\a profileId, the\n \\a priority of this mode, where the lower the value, the higher the priority,\n and a \\a conflictingMask, where each bit set in the mask corresponds to a different\n profile which cannot be used in conjunction with the given profile.\n\n @param device                               The identifier of the target device\n @param profilesInfo                         Reference to struct \\a nvmlWorkloadPowerProfileProfilesInfo_t\n\n @return\n         - \\ref NVML_SUCCESS                         If the query is successful\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE         If struct is fully allocated\n         - \\ref NVML_ERROR_UNINITIALIZED             If the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT          If \\a device is invalid or \\a pointer to struct is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED             If the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST               If the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH If the provided version is invalid/unsupported\n         - \\ref NVML_ERROR_UNKNOWN                   On any unexpected error*/\n    fn nvmlDeviceWorkloadPowerProfileGetProfilesInfo(\n        device: cuda_types::nvml::nvmlDevice_t,\n        profilesInfo: *mut cuda_types::nvml::nvmlWorkloadPowerProfileProfilesInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Get Current Performance Profiles\n\n For Blackwell &tm; or newer fully supported devices.\n See \\ref nvmlWorkloadPowerProfileCurrentProfiles_v1_t for more information on the struct.\n This API returns a stuct which contains the current \\a perfProfilesMask,\n \\a requestedProfilesMask and \\a enforcedProfilesMask. Each bit set in each\n bitmasks indicates the profile is supported, currently requested or currently\n engaged, respectively.\n\n @param device                The identifier of the target device\n @param currentProfiles       Reference to struct \\a nvmlWorkloadPowerProfileCurrentProfiles_v1_t\n\n @return\n         - \\ref NVML_SUCCESS                         If the query is successful\n         - \\ref NVML_ERROR_UNINITIALIZED             If the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT          If \\a device is invalid or the pointer to struct is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED             If the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST               If the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH If the provided version is invalid/unsupported\n         - \\ref NVML_ERROR_UNKNOWN                   On any unexpected error*/\n    fn nvmlDeviceWorkloadPowerProfileGetCurrentProfiles(\n        device: cuda_types::nvml::nvmlDevice_t,\n        currentProfiles: *mut cuda_types::nvml::nvmlWorkloadPowerProfileCurrentProfiles_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Set Requested Performance Profiles\n\n For Blackwell &tm; or newer fully supported devices.\n See \\ref nvmlWorkloadPowerProfileRequestedProfiles_v1_t for more information on the struct.\n Reuqest one or more performance profiles be activated using the input bitmask\n \\a requestedProfilesMask, where each bit set corresponds to a supported bit from\n the \\a perfProfilesMask. These profiles will be added to existing list of\n currently requested profiles.\n Requires root/admin permissions.\n\n @param device                The identifier of the target device\n @param requestedProfiles     Reference to struct \\a nvmlWorkloadPowerProfileRequestedProfiles_v1_t\n\n @return\n         - \\ref NVML_SUCCESS                         If the query is successful\n         - \\ref NVML_ERROR_UNINITIALIZED             If the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT          If \\a device is invalid or \\a pointer to struct is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED             If the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST               If the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH If the provided version is invalid/unsupported\n         - \\ref NVML_ERROR_UNKNOWN                   On any unexpected error*/\n    fn nvmlDeviceWorkloadPowerProfileSetRequestedProfiles(\n        device: cuda_types::nvml::nvmlDevice_t,\n        requestedProfiles: *mut cuda_types::nvml::nvmlWorkloadPowerProfileRequestedProfiles_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Clear Requested Performance Profiles\n\n For Blackwell &tm; or newer fully supported devices.\n See \\ref nvmlWorkloadPowerProfileRequestedProfiles_v1_t for more information on the struct.\n Clear one or more performance profiles be using the input bitmask\n \\a requestedProfilesMask, where each bit set corresponds to a supported bit from\n the \\a perfProfilesMask. These profiles will be removed from the existing list of\n currently requested profiles.\n Requires root/admin permissions.\n\n @param device                The identifier of the target device\n @param requestedProfiles     Reference to struct \\a nvmlWorkloadPowerProfileRequestedProfiles_v1_t\n\n @return\n         - \\ref NVML_SUCCESS                         If the query is successful\n         - \\ref NVML_ERROR_UNINITIALIZED             If the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT          If \\a device is invalid or \\a pointer to struct is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED             If the device does not support this feature\n         - \\ref NVML_ERROR_GPU_IS_LOST               If the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH If the provided version is invalid/unsupported\n         - \\ref NVML_ERROR_UNKNOWN                   On any unexpected error*/\n    fn nvmlDeviceWorkloadPowerProfileClearRequestedProfiles(\n        device: cuda_types::nvml::nvmlDevice_t,\n        requestedProfiles: *mut cuda_types::nvml::nvmlWorkloadPowerProfileRequestedProfiles_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Activiate a specific preset profile for datacenter power smoothing.\n The API only sets the active preset profile based on the input profileId,\n and ignores the other parameters of the structure.\n Requires root/admin permissions.\n\n For Blackwell &tm; or newer fully supported devices.\n\n @param device                                The identifier of the target device\n @param profile                               Reference to \\ref nvmlPowerSmoothingProfile_v1_t.\n                                              Note that only \\a profile->profileId is used and\n                                              the rest of the structure is ignored.\n\n @return\n        - \\ref NVML_SUCCESS                   if the Desired Profile was successfully set\n        - \\ref NVML_ERROR_INVALID_ARGUMENT    if device is invalid or structure was NULL\n        - \\ref NVML_ERROR_NO_PERMISSION       if user does not have permission to change the profile number\n        - \\ref NVML_ERROR_NOT_SUPPORTED       if this feature is not supported by the device\n*/\n    fn nvmlDevicePowerSmoothingActivatePresetProfile(\n        device: cuda_types::nvml::nvmlDevice_t,\n        profile: *mut cuda_types::nvml::nvmlPowerSmoothingProfile_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Update the value of a specific profile parameter contained within \\ref nvmlPowerSmoothingProfile_v1_t.\n Requires root/admin permissions.\n\n For Blackwell &tm; or newer fully supported devices.\n\n NVML_POWER_SMOOTHING_PROFILE_PARAM_PERCENT_TMP_FLOOR expects a value as a percentage from 00.00-100.00%\n NVML_POWER_SMOOTHING_PROFILE_PARAM_RAMP_UP_RATE expects a value in W/s\n NVML_POWER_SMOOTHING_PROFILE_PARAM_RAMP_DOWN_RATE expects a value in W/s\n NVML_POWER_SMOOTHING_PROFILE_PARAM_RAMP_DOWN_HYSTERESIS expects a value in ms\n\n @param device                                      The identifier of the target device\n @param profile                                     Reference to \\ref nvmlPowerSmoothingProfile_v1_t struct\n\n @return\n        - \\ref NVML_SUCCESS                         if the Active Profile was successfully set\n        - \\ref NVML_ERROR_INVALID_ARGUMENT          if device is invalid or profile parameter/value was invalid\n        - \\ref NVML_ERROR_NO_PERMISSION             if user does not have permission to change any profile parameters\n        - \\ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH if the structure version is not supported\n*/\n    fn nvmlDevicePowerSmoothingUpdatePresetProfileParam(\n        device: cuda_types::nvml::nvmlDevice_t,\n        profile: *mut cuda_types::nvml::nvmlPowerSmoothingProfile_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Enable or disable the Power Smoothing Feature.\n Requires root/admin permissions.\n\n For Blackwell &tm; or newer fully supported devices.\n\n See \\ref nvmlEnableState_t for details on allowed states\n\n @param device                                      The identifier of the target device\n @param state                                       Reference to \\ref nvmlPowerSmoothingState_v1_t\n\n @return\n        - \\ref NVML_SUCCESS                         if the feature state was successfully set\n        - \\ref NVML_ERROR_INVALID_ARGUMENT          if device is invalid or state is NULL\n        - \\ref NVML_ERROR_NO_PERMISSION             if user does not have permission to change feature state\n        - \\ref NVML_ERROR_NOT_SUPPORTED             if this feature is not supported by the device\n*/\n    fn nvmlDevicePowerSmoothingSetState(\n        device: cuda_types::nvml::nvmlDevice_t,\n        state: *mut cuda_types::nvml::nvmlPowerSmoothingState_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    /** Retrieves the counts of SRAM unique uncorrected ECC errors\n\n For Blackwell &tm; or newer fully supported devices.\n\n Reads SRAM unique uncorrected ECC error counts. The total number of unique errors is returned by\n \\a errorCounts->entryCount. Error counts are returned as an array of in the caller-supplied buffer pointed at by\n \\a errorCounts->entries. Each error count entry holds the location/address of the unique error, the error count and\n whether the error is parity or not.\n\n To read SRAM unique uncorrected ECC error counts, first determine the size of buffer required to hold the error\n counts by invoking the function with \\a errorCounts->entries set to NULL. The required array size is returned in\n \\a errorCounts->entryCount. The caller should allocate a buffer of size \"errorCounts->entryCount *\n sizeof(nvmlEccSramUniqueUncorrectedErrorCounts_t)\". Invoke the function again with the allocated buffer passed in\n \\a errorCounts->entries. This time \\a errorCounts->entryCount will be taken as the entry array size that caller\n allocates for \\a errorCounts->entries.\n\n On successful return of the second query, the function updates \\a errorCounts->entries with all unique errors. This\n may fail if \\a errorCounts->entryCount is smaller than the actual number of unique errors. This can happen in cases\n like new errors occur since the previous query of \\a errorCounts->entryCount. No matter the query succeeds or not,\n the latest number of unique errors will be returned in \\a errorCounts->entryCount.\n\n @note The query is only supported when ECC mode is enabled.\n\n @param device                    The identifier of the target device\n @param errorCounts               Pointer to caller-supplied array which returns the unique error count entries\n\n @return\n         - \\ref NVML_SUCCESS                 if \\a utilization has been populated\n         - \\ref NVML_ERROR_UNINITIALIZED     if the library has not been successfully initialized\n         - \\ref NVML_ERROR_INVALID_ARGUMENT  if \\a device is invalid, \\a errorCounts->entryCount is NULL\n         - \\ref NVML_ERROR_NOT_SUPPORTED     if the device does not support this feature or ECC mods is not enabled\n         - \\ref NVML_ERROR_INSUFFICIENT_SIZE if the allocated error entry array is not big enough\n         - \\ref NVML_ERROR_GPU_IS_LOST       if the target GPU has fallen off the bus or is otherwise inaccessible\n         - \\ref NVML_ERROR_UNKNOWN           on any unexpected error*/\n    fn nvmlDeviceGetSramUniqueUncorrectedEccErrorCounts(\n        device: cuda_types::nvml::nvmlDevice_t,\n        errorCounts: *mut cuda_types::nvml::nvmlEccSramUniqueUncorrectedErrorCounts_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    fn nvmlInit() -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    fn nvmlDeviceGetCount(\n        deviceCount: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    fn nvmlDeviceGetHandleByIndex(\n        index: ::core::ffi::c_uint,\n        device: *mut cuda_types::nvml::nvmlDevice_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    fn nvmlDeviceGetHandleByPciBusId(\n        pciBusId: *const ::core::ffi::c_char,\n        device: *mut cuda_types::nvml::nvmlDevice_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    fn nvmlDeviceGetPciInfo(\n        device: cuda_types::nvml::nvmlDevice_t,\n        pci: *mut cuda_types::nvml::nvmlPciInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    fn nvmlDeviceGetPciInfo_v2(\n        device: cuda_types::nvml::nvmlDevice_t,\n        pci: *mut cuda_types::nvml::nvmlPciInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    fn nvmlDeviceGetNvLinkRemotePciInfo(\n        device: cuda_types::nvml::nvmlDevice_t,\n        link: ::core::ffi::c_uint,\n        pci: *mut cuda_types::nvml::nvmlPciInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    fn nvmlDeviceGetGridLicensableFeatures(\n        device: cuda_types::nvml::nvmlDevice_t,\n        pGridLicensableFeatures: *mut cuda_types::nvml::nvmlGridLicensableFeatures_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    fn nvmlDeviceGetGridLicensableFeatures_v2(\n        device: cuda_types::nvml::nvmlDevice_t,\n        pGridLicensableFeatures: *mut cuda_types::nvml::nvmlGridLicensableFeatures_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    fn nvmlDeviceGetGridLicensableFeatures_v3(\n        device: cuda_types::nvml::nvmlDevice_t,\n        pGridLicensableFeatures: *mut cuda_types::nvml::nvmlGridLicensableFeatures_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    fn nvmlDeviceRemoveGpu(\n        pciInfo: *mut cuda_types::nvml::nvmlPciInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    fn nvmlEventSetWait(\n        set: cuda_types::nvml::nvmlEventSet_t,\n        data: *mut cuda_types::nvml::nvmlEventData_t,\n        timeoutms: ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    fn nvmlDeviceGetAttributes(\n        device: cuda_types::nvml::nvmlDevice_t,\n        attributes: *mut cuda_types::nvml::nvmlDeviceAttributes_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    fn nvmlComputeInstanceGetInfo(\n        computeInstance: cuda_types::nvml::nvmlComputeInstance_t,\n        info: *mut cuda_types::nvml::nvmlComputeInstanceInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    fn nvmlDeviceGetComputeRunningProcesses(\n        device: cuda_types::nvml::nvmlDevice_t,\n        infoCount: *mut ::core::ffi::c_uint,\n        infos: *mut cuda_types::nvml::nvmlProcessInfo_v1_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    fn nvmlDeviceGetComputeRunningProcesses_v2(\n        device: cuda_types::nvml::nvmlDevice_t,\n        infoCount: *mut ::core::ffi::c_uint,\n        infos: *mut cuda_types::nvml::nvmlProcessInfo_v2_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    fn nvmlDeviceGetGraphicsRunningProcesses(\n        device: cuda_types::nvml::nvmlDevice_t,\n        infoCount: *mut ::core::ffi::c_uint,\n        infos: *mut cuda_types::nvml::nvmlProcessInfo_v1_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    fn nvmlDeviceGetGraphicsRunningProcesses_v2(\n        device: cuda_types::nvml::nvmlDevice_t,\n        infoCount: *mut ::core::ffi::c_uint,\n        infos: *mut cuda_types::nvml::nvmlProcessInfo_v2_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    fn nvmlDeviceGetMPSComputeRunningProcesses(\n        device: cuda_types::nvml::nvmlDevice_t,\n        infoCount: *mut ::core::ffi::c_uint,\n        infos: *mut cuda_types::nvml::nvmlProcessInfo_v1_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    fn nvmlDeviceGetMPSComputeRunningProcesses_v2(\n        device: cuda_types::nvml::nvmlDevice_t,\n        infoCount: *mut ::core::ffi::c_uint,\n        infos: *mut cuda_types::nvml::nvmlProcessInfo_v2_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    fn nvmlDeviceGetGpuInstancePossiblePlacements(\n        device: cuda_types::nvml::nvmlDevice_t,\n        profileId: ::core::ffi::c_uint,\n        placements: *mut cuda_types::nvml::nvmlGpuInstancePlacement_t,\n        count: *mut ::core::ffi::c_uint,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    fn nvmlVgpuInstanceGetLicenseInfo(\n        vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n        licenseInfo: *mut cuda_types::nvml::nvmlVgpuLicenseInfo_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n    #[must_use]\n    fn nvmlDeviceGetDriverModel(\n        device: cuda_types::nvml::nvmlDevice_t,\n        current: *mut cuda_types::nvml::nvmlDriverModel_t,\n        pending: *mut cuda_types::nvml::nvmlDriverModel_t,\n    ) -> cuda_types::nvml::nvmlReturn_t;\n}\n"
  },
  {
    "path": "cuda_types/.rustfmt.toml",
    "content": "disable_all_formatting = true\n"
  },
  {
    "path": "cuda_types/Cargo.toml",
    "content": "[package]\nname = \"cuda_types\"\nversion = \"0.0.0\"\nauthors = [\"Andrzej Janik <vosen@vosen.pl>\"]\nedition = \"2021\"\n\n[dependencies]\ncuda_macros = { path = \"../cuda_macros\" }\nhip_runtime-sys = { path = \"../ext/hip_runtime-sys\" }\nbitflags = \"2.9.1\"\nrocblas-sys = { path = \"../ext/rocblas-sys\" }\nhipblaslt-sys = { path = \"../ext/hipblaslt-sys\" }\nmiopen-sys = { path = \"../ext/miopen-sys\" }\nrocsparse-sys = { path = \"../ext/rocsparse-sys\" }\n\n[target.'cfg(unix)'.dependencies]\nrocm_smi-sys = { path = \"../ext/rocm_smi-sys\" }\n"
  },
  {
    "path": "cuda_types/src/cublas.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\npub type __half = u16;\npub type __nv_bfloat16 = u16;\npub use super::cuda::cuComplex;\npub use super::cuda::cuDoubleComplex;\npub use super::cuda::cudaDataType;\npub use super::cuda::cudaDataType_t;\npub type cudaStream_t = super::cuda::CUstream;\npub use super::cuda::libraryPropertyType;\npub type cudaGraphExecUpdateResultInfo_st = super::cuda::CUgraphExecUpdateResultInfo_st;\npub type cudaAsyncNotificationType = super::cuda::CUasyncNotificationType_enum;\npub type cudaGraph_t = super::cuda::CUgraph;\npub const CUBLAS_VER_MAJOR: u32 = 13;\npub const CUBLAS_VER_MINOR: u32 = 0;\npub const CUBLAS_VER_PATCH: u32 = 2;\npub const CUBLAS_VER_BUILD: u32 = 14;\npub const CUBLAS_VERSION: u32 = 130002;\nimpl cublasFillMode_t {\n    pub const CUBLAS_FILL_MODE_LOWER: cublasFillMode_t = cublasFillMode_t(0);\n}\nimpl cublasFillMode_t {\n    pub const CUBLAS_FILL_MODE_UPPER: cublasFillMode_t = cublasFillMode_t(1);\n}\nimpl cublasFillMode_t {\n    pub const CUBLAS_FILL_MODE_FULL: cublasFillMode_t = cublasFillMode_t(2);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasFillMode_t(pub ::core::ffi::c_uint);\nimpl cublasDiagType_t {\n    pub const CUBLAS_DIAG_NON_UNIT: cublasDiagType_t = cublasDiagType_t(0);\n}\nimpl cublasDiagType_t {\n    pub const CUBLAS_DIAG_UNIT: cublasDiagType_t = cublasDiagType_t(1);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasDiagType_t(pub ::core::ffi::c_uint);\nimpl cublasSideMode_t {\n    pub const CUBLAS_SIDE_LEFT: cublasSideMode_t = cublasSideMode_t(0);\n}\nimpl cublasSideMode_t {\n    pub const CUBLAS_SIDE_RIGHT: cublasSideMode_t = cublasSideMode_t(1);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasSideMode_t(pub ::core::ffi::c_uint);\nimpl cublasOperation_t {\n    pub const CUBLAS_OP_N: cublasOperation_t = cublasOperation_t(0);\n}\nimpl cublasOperation_t {\n    pub const CUBLAS_OP_T: cublasOperation_t = cublasOperation_t(1);\n}\nimpl cublasOperation_t {\n    pub const CUBLAS_OP_C: cublasOperation_t = cublasOperation_t(2);\n}\nimpl cublasOperation_t {\n    pub const CUBLAS_OP_HERMITAN: cublasOperation_t = cublasOperation_t(2);\n}\nimpl cublasOperation_t {\n    pub const CUBLAS_OP_CONJG: cublasOperation_t = cublasOperation_t(3);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasOperation_t(pub ::core::ffi::c_uint);\nimpl cublasPointerMode_t {\n    pub const CUBLAS_POINTER_MODE_HOST: cublasPointerMode_t = cublasPointerMode_t(0);\n}\nimpl cublasPointerMode_t {\n    pub const CUBLAS_POINTER_MODE_DEVICE: cublasPointerMode_t = cublasPointerMode_t(1);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasPointerMode_t(pub ::core::ffi::c_uint);\nimpl cublasAtomicsMode_t {\n    pub const CUBLAS_ATOMICS_NOT_ALLOWED: cublasAtomicsMode_t = cublasAtomicsMode_t(0);\n}\nimpl cublasAtomicsMode_t {\n    pub const CUBLAS_ATOMICS_ALLOWED: cublasAtomicsMode_t = cublasAtomicsMode_t(1);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasAtomicsMode_t(pub ::core::ffi::c_uint);\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_DFALT: cublasGemmAlgo_t = cublasGemmAlgo_t(-1);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_DEFAULT: cublasGemmAlgo_t = cublasGemmAlgo_t(-1);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO0: cublasGemmAlgo_t = cublasGemmAlgo_t(0);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO1: cublasGemmAlgo_t = cublasGemmAlgo_t(1);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO2: cublasGemmAlgo_t = cublasGemmAlgo_t(2);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO3: cublasGemmAlgo_t = cublasGemmAlgo_t(3);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO4: cublasGemmAlgo_t = cublasGemmAlgo_t(4);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO5: cublasGemmAlgo_t = cublasGemmAlgo_t(5);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO6: cublasGemmAlgo_t = cublasGemmAlgo_t(6);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO7: cublasGemmAlgo_t = cublasGemmAlgo_t(7);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO8: cublasGemmAlgo_t = cublasGemmAlgo_t(8);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO9: cublasGemmAlgo_t = cublasGemmAlgo_t(9);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO10: cublasGemmAlgo_t = cublasGemmAlgo_t(10);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO11: cublasGemmAlgo_t = cublasGemmAlgo_t(11);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO12: cublasGemmAlgo_t = cublasGemmAlgo_t(12);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO13: cublasGemmAlgo_t = cublasGemmAlgo_t(13);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO14: cublasGemmAlgo_t = cublasGemmAlgo_t(14);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO15: cublasGemmAlgo_t = cublasGemmAlgo_t(15);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO16: cublasGemmAlgo_t = cublasGemmAlgo_t(16);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO17: cublasGemmAlgo_t = cublasGemmAlgo_t(17);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO18: cublasGemmAlgo_t = cublasGemmAlgo_t(18);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO19: cublasGemmAlgo_t = cublasGemmAlgo_t(19);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO20: cublasGemmAlgo_t = cublasGemmAlgo_t(20);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO21: cublasGemmAlgo_t = cublasGemmAlgo_t(21);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO22: cublasGemmAlgo_t = cublasGemmAlgo_t(22);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO23: cublasGemmAlgo_t = cublasGemmAlgo_t(23);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_DEFAULT_TENSOR_OP: cublasGemmAlgo_t = cublasGemmAlgo_t(99);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_DFALT_TENSOR_OP: cublasGemmAlgo_t = cublasGemmAlgo_t(99);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO0_TENSOR_OP: cublasGemmAlgo_t = cublasGemmAlgo_t(100);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO1_TENSOR_OP: cublasGemmAlgo_t = cublasGemmAlgo_t(101);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO2_TENSOR_OP: cublasGemmAlgo_t = cublasGemmAlgo_t(102);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO3_TENSOR_OP: cublasGemmAlgo_t = cublasGemmAlgo_t(103);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO4_TENSOR_OP: cublasGemmAlgo_t = cublasGemmAlgo_t(104);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO5_TENSOR_OP: cublasGemmAlgo_t = cublasGemmAlgo_t(105);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO6_TENSOR_OP: cublasGemmAlgo_t = cublasGemmAlgo_t(106);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO7_TENSOR_OP: cublasGemmAlgo_t = cublasGemmAlgo_t(107);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO8_TENSOR_OP: cublasGemmAlgo_t = cublasGemmAlgo_t(108);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO9_TENSOR_OP: cublasGemmAlgo_t = cublasGemmAlgo_t(109);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO10_TENSOR_OP: cublasGemmAlgo_t = cublasGemmAlgo_t(110);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO11_TENSOR_OP: cublasGemmAlgo_t = cublasGemmAlgo_t(111);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO12_TENSOR_OP: cublasGemmAlgo_t = cublasGemmAlgo_t(112);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO13_TENSOR_OP: cublasGemmAlgo_t = cublasGemmAlgo_t(113);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO14_TENSOR_OP: cublasGemmAlgo_t = cublasGemmAlgo_t(114);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_ALGO15_TENSOR_OP: cublasGemmAlgo_t = cublasGemmAlgo_t(115);\n}\nimpl cublasGemmAlgo_t {\n    pub const CUBLAS_GEMM_AUTOTUNE: cublasGemmAlgo_t = cublasGemmAlgo_t(999);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasGemmAlgo_t(pub ::core::ffi::c_int);\nimpl cublasMath_t {\n    pub const CUBLAS_DEFAULT_MATH: cublasMath_t = cublasMath_t(0);\n}\nimpl cublasMath_t {\n    pub const CUBLAS_TENSOR_OP_MATH: cublasMath_t = cublasMath_t(1);\n}\nimpl cublasMath_t {\n    pub const CUBLAS_PEDANTIC_MATH: cublasMath_t = cublasMath_t(2);\n}\nimpl cublasMath_t {\n    pub const CUBLAS_TF32_TENSOR_OP_MATH: cublasMath_t = cublasMath_t(3);\n}\nimpl cublasMath_t {\n    pub const CUBLAS_FP32_EMULATED_BF16X9_MATH: cublasMath_t = cublasMath_t(4);\n}\nimpl cublasMath_t {\n    pub const CUBLAS_MATH_DISALLOW_REDUCED_PRECISION_REDUCTION: cublasMath_t = cublasMath_t(\n        16,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasMath_t(pub ::core::ffi::c_uint);\npub use super::cuda::cudaDataType as cublasDataType_t;\nimpl cublasComputeType_t {\n    pub const CUBLAS_COMPUTE_16F: cublasComputeType_t = cublasComputeType_t(64);\n}\nimpl cublasComputeType_t {\n    pub const CUBLAS_COMPUTE_16F_PEDANTIC: cublasComputeType_t = cublasComputeType_t(65);\n}\nimpl cublasComputeType_t {\n    pub const CUBLAS_COMPUTE_32F: cublasComputeType_t = cublasComputeType_t(68);\n}\nimpl cublasComputeType_t {\n    pub const CUBLAS_COMPUTE_32F_PEDANTIC: cublasComputeType_t = cublasComputeType_t(69);\n}\nimpl cublasComputeType_t {\n    pub const CUBLAS_COMPUTE_32F_FAST_16F: cublasComputeType_t = cublasComputeType_t(74);\n}\nimpl cublasComputeType_t {\n    pub const CUBLAS_COMPUTE_32F_FAST_16BF: cublasComputeType_t = cublasComputeType_t(\n        75,\n    );\n}\nimpl cublasComputeType_t {\n    pub const CUBLAS_COMPUTE_32F_FAST_TF32: cublasComputeType_t = cublasComputeType_t(\n        77,\n    );\n}\nimpl cublasComputeType_t {\n    pub const CUBLAS_COMPUTE_32F_EMULATED_16BFX9: cublasComputeType_t = cublasComputeType_t(\n        78,\n    );\n}\nimpl cublasComputeType_t {\n    pub const CUBLAS_COMPUTE_64F: cublasComputeType_t = cublasComputeType_t(70);\n}\nimpl cublasComputeType_t {\n    pub const CUBLAS_COMPUTE_64F_PEDANTIC: cublasComputeType_t = cublasComputeType_t(71);\n}\nimpl cublasComputeType_t {\n    pub const CUBLAS_COMPUTE_32I: cublasComputeType_t = cublasComputeType_t(72);\n}\nimpl cublasComputeType_t {\n    pub const CUBLAS_COMPUTE_32I_PEDANTIC: cublasComputeType_t = cublasComputeType_t(73);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasComputeType_t(pub ::core::ffi::c_uint);\nimpl cublasEmulationStrategy_t {\n    pub const CUBLAS_EMULATION_STRATEGY_DEFAULT: cublasEmulationStrategy_t = cublasEmulationStrategy_t(\n        0,\n    );\n}\nimpl cublasEmulationStrategy_t {\n    pub const CUBLAS_EMULATION_STRATEGY_PERFORMANT: cublasEmulationStrategy_t = cublasEmulationStrategy_t(\n        1,\n    );\n}\nimpl cublasEmulationStrategy_t {\n    pub const CUBLAS_EMULATION_STRATEGY_EAGER: cublasEmulationStrategy_t = cublasEmulationStrategy_t(\n        2,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasEmulationStrategy_t(pub ::core::ffi::c_uint);\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cublasContext {\n    _unused: [u8; 0],\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasHandle_t(pub *mut cublasContext);\npub type cublasLogCallback = ::core::option::Option<\n    unsafe extern \"C\" fn(msg: *const ::core::ffi::c_char),\n>;\nimpl cublasError_t {\n    pub const r#NOT_INITIALIZED: cublasError_t = cublasError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(1)\n    });\n    pub const r#ALLOC_FAILED: cublasError_t = cublasError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3)\n    });\n    pub const r#INVALID_VALUE: cublasError_t = cublasError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(7)\n    });\n    pub const r#ARCH_MISMATCH: cublasError_t = cublasError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(8)\n    });\n    pub const r#MAPPING_ERROR: cublasError_t = cublasError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(11)\n    });\n    pub const r#EXECUTION_FAILED: cublasError_t = cublasError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(13)\n    });\n    pub const r#INTERNAL_ERROR: cublasError_t = cublasError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(14)\n    });\n    pub const r#NOT_SUPPORTED: cublasError_t = cublasError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(15)\n    });\n    pub const r#LICENSE_ERROR: cublasError_t = cublasError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(16)\n    });\n}\n#[repr(transparent)]\n#[derive(Debug, Hash, Copy, Clone, PartialEq, Eq)]\npub struct cublasError_t(pub ::core::num::NonZeroU32);\npub trait cublasStatus_tConsts {\n    const SUCCESS: cublasStatus_t = cublasStatus_t::Ok(());\n    const ERROR_NOT_INITIALIZED: cublasStatus_t = cublasStatus_t::Err(\n        cublasError_t::r#NOT_INITIALIZED,\n    );\n    const ERROR_ALLOC_FAILED: cublasStatus_t = cublasStatus_t::Err(\n        cublasError_t::r#ALLOC_FAILED,\n    );\n    const ERROR_INVALID_VALUE: cublasStatus_t = cublasStatus_t::Err(\n        cublasError_t::r#INVALID_VALUE,\n    );\n    const ERROR_ARCH_MISMATCH: cublasStatus_t = cublasStatus_t::Err(\n        cublasError_t::r#ARCH_MISMATCH,\n    );\n    const ERROR_MAPPING_ERROR: cublasStatus_t = cublasStatus_t::Err(\n        cublasError_t::r#MAPPING_ERROR,\n    );\n    const ERROR_EXECUTION_FAILED: cublasStatus_t = cublasStatus_t::Err(\n        cublasError_t::r#EXECUTION_FAILED,\n    );\n    const ERROR_INTERNAL_ERROR: cublasStatus_t = cublasStatus_t::Err(\n        cublasError_t::r#INTERNAL_ERROR,\n    );\n    const ERROR_NOT_SUPPORTED: cublasStatus_t = cublasStatus_t::Err(\n        cublasError_t::r#NOT_SUPPORTED,\n    );\n    const ERROR_LICENSE_ERROR: cublasStatus_t = cublasStatus_t::Err(\n        cublasError_t::r#LICENSE_ERROR,\n    );\n}\nimpl cublasStatus_tConsts for cublasStatus_t {}\n#[must_use]\npub type cublasStatus_t = ::core::result::Result<(), cublasError_t>;\nconst _: fn() = || {\n    let _ = std::mem::transmute::<cublasStatus_t, u32>;\n};\nimpl From<rocblas_sys::rocblas_error> for cublasError_t {\n    fn from(error: rocblas_sys::rocblas_error) -> Self {\n        Self(error.0)\n    }\n}\nimpl From<hipblaslt_sys::hipblasLtError> for cublasError_t {\n    fn from(error: hipblaslt_sys::hipblasLtError) -> Self {\n        Self(error.0)\n    }\n}\n"
  },
  {
    "path": "cuda_types/src/cublaslt.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\npub type __half = u16;\npub type __nv_bfloat16 = u16;\npub use super::cuda::cuComplex;\npub use super::cuda::cuDoubleComplex;\npub use super::cuda::cudaDataType;\npub use super::cuda::cudaDataType_t;\npub type cudaStream_t = super::cuda::CUstream;\npub use super::cuda::libraryPropertyType;\npub type cudaGraphExecUpdateResultInfo_st = super::cuda::CUgraphExecUpdateResultInfo_st;\npub type cudaAsyncNotificationType = super::cuda::CUasyncNotificationType_enum;\npub type cudaGraph_t = super::cuda::CUgraph;\npub const CUBLASLT_NUMERICAL_IMPL_FLAGS_FMA: u32 = 1;\npub const CUBLASLT_NUMERICAL_IMPL_FLAGS_HMMA: u32 = 2;\npub const CUBLASLT_NUMERICAL_IMPL_FLAGS_IMMA: u32 = 4;\npub const CUBLASLT_NUMERICAL_IMPL_FLAGS_DMMA: u32 = 8;\npub const CUBLASLT_NUMERICAL_IMPL_FLAGS_TENSOR_OP_MASK: u32 = 254;\npub const CUBLASLT_NUMERICAL_IMPL_FLAGS_OP_TYPE_MASK: u32 = 255;\npub const CUBLASLT_NUMERICAL_IMPL_FLAGS_ACCUMULATOR_16F: u32 = 256;\npub const CUBLASLT_NUMERICAL_IMPL_FLAGS_ACCUMULATOR_32F: u32 = 512;\npub const CUBLASLT_NUMERICAL_IMPL_FLAGS_ACCUMULATOR_64F: u32 = 1024;\npub const CUBLASLT_NUMERICAL_IMPL_FLAGS_ACCUMULATOR_32I: u32 = 2048;\npub const CUBLASLT_NUMERICAL_IMPL_FLAGS_ACCUMULATOR_TYPE_MASK: u32 = 65280;\npub const CUBLASLT_NUMERICAL_IMPL_FLAGS_INPUT_16F: u32 = 65536;\npub const CUBLASLT_NUMERICAL_IMPL_FLAGS_INPUT_16BF: u32 = 131072;\npub const CUBLASLT_NUMERICAL_IMPL_FLAGS_INPUT_TF32: u32 = 262144;\npub const CUBLASLT_NUMERICAL_IMPL_FLAGS_INPUT_32F: u32 = 524288;\npub const CUBLASLT_NUMERICAL_IMPL_FLAGS_INPUT_64F: u32 = 1048576;\npub const CUBLASLT_NUMERICAL_IMPL_FLAGS_INPUT_8I: u32 = 2097152;\npub const CUBLASLT_NUMERICAL_IMPL_FLAGS_INPUT_8F_E4M3: u32 = 4194304;\npub const CUBLASLT_NUMERICAL_IMPL_FLAGS_INPUT_8F_E5M2: u32 = 8388608;\npub const CUBLASLT_NUMERICAL_IMPL_FLAGS_OP_INPUT_TYPE_MASK: u32 = 16711680;\npub const CUBLASLT_NUMERICAL_IMPL_FLAGS_GAUSSIAN: u64 = 4294967296;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cublasLtContext {\n    _unused: [u8; 0],\n}\n/// Opaque structure holding CUBLASLT context\npub type cublasLtHandle_t = *mut cublasLtContext;\n/// Semi-opaque descriptor for matrix memory layout\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasLtMatrixLayoutOpaque_t {\n    pub data: [u64; 8usize],\n}\n/// Opaque descriptor for matrix memory layout\npub type cublasLtMatrixLayout_t = *mut cublasLtMatrixLayoutOpaque_t;\n/** Semi-opaque algorithm descriptor (to avoid complicated alloc/free schemes)\n\n This structure can be trivially serialized and later restored for use with the same version of cuBLAS library to save\n on selecting the right configuration again.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasLtMatmulAlgo_t {\n    pub data: [u64; 8usize],\n}\n/// Semi-opaque descriptor for cublasLtMatmul() operation details\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasLtMatmulDescOpaque_t {\n    pub data: [u64; 32usize],\n}\n/// Opaque descriptor for cublasLtMatmul() operation details\npub type cublasLtMatmulDesc_t = *mut cublasLtMatmulDescOpaque_t;\n/// Semi-opaque descriptor for cublasLtMatrixTransform() operation details\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasLtMatrixTransformDescOpaque_t {\n    pub data: [u64; 8usize],\n}\n/// Opaque descriptor for cublasLtMatrixTransform() operation details\npub type cublasLtMatrixTransformDesc_t = *mut cublasLtMatrixTransformDescOpaque_t;\n/// Semi-opaque descriptor for cublasLtMatmulPreference() operation details\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasLtMatmulPreferenceOpaque_t {\n    pub data: [u64; 8usize],\n}\n/// Opaque descriptor for cublasLtMatmulAlgoGetHeuristic() configuration\npub type cublasLtMatmulPreference_t = *mut cublasLtMatmulPreferenceOpaque_t;\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_UNDEFINED: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        0,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_8x8: cublasLtMatmulTile_t = cublasLtMatmulTile_t(1);\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_8x16: cublasLtMatmulTile_t = cublasLtMatmulTile_t(2);\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_16x8: cublasLtMatmulTile_t = cublasLtMatmulTile_t(3);\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_8x32: cublasLtMatmulTile_t = cublasLtMatmulTile_t(4);\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_16x16: cublasLtMatmulTile_t = cublasLtMatmulTile_t(5);\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_32x8: cublasLtMatmulTile_t = cublasLtMatmulTile_t(6);\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_8x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(7);\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_16x32: cublasLtMatmulTile_t = cublasLtMatmulTile_t(8);\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_32x16: cublasLtMatmulTile_t = cublasLtMatmulTile_t(9);\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x8: cublasLtMatmulTile_t = cublasLtMatmulTile_t(10);\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_32x32: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        11,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_32x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        12,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x32: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        13,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_32x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        14,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        15,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x32: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        16,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        17,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        18,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x256: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        19,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        20,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        21,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x512: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        22,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x256: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        23,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        24,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_512x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        25,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x96: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        26,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_96x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        27,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_96x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        28,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x160: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        29,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_160x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        30,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        31,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        32,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x96: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        33,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_32x256: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        34,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x32: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        35,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_8x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        36,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_8x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        37,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_8x256: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        38,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_8x320: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        39,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_8x384: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        40,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_8x448: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        41,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_8x512: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        42,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_8x576: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        43,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_8x640: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        44,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_8x704: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        45,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_8x768: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        46,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_16x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        47,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_16x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        48,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_16x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        49,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_16x256: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        50,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_16x320: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        51,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_16x384: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        52,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_16x448: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        53,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_16x512: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        54,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_16x576: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        55,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_16x640: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        56,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_16x704: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        57,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_16x768: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        58,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_24x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        59,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_24x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        60,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_24x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        61,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_24x256: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        62,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_24x320: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        63,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_24x384: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        64,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_24x448: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        65,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_24x512: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        66,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_24x576: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        67,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_24x640: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        68,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_24x704: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        69,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_24x768: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        70,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_32x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        71,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_32x320: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        72,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_32x384: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        73,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_32x448: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        74,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_32x512: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        75,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_32x576: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        76,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_32x640: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        77,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_32x704: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        78,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_32x768: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        79,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_40x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        80,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_40x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        81,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_40x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        82,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_40x256: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        83,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_40x320: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        84,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_40x384: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        85,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_40x448: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        86,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_40x512: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        87,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_40x576: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        88,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_40x640: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        89,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_40x704: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        90,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_40x768: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        91,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_48x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        92,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_48x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        93,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_48x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        94,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_48x256: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        95,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_48x320: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        96,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_48x384: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        97,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_48x448: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        98,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_48x512: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        99,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_48x576: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        100,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_48x640: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        101,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_48x704: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        102,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_48x768: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        103,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_56x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        104,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_56x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        105,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_56x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        106,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_56x256: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        107,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_56x320: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        108,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_56x384: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        109,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_56x448: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        110,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_56x512: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        111,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_56x576: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        112,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_56x640: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        113,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_56x704: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        114,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_56x768: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        115,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        116,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x320: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        117,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x384: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        118,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x448: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        119,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x576: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        120,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x640: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        121,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x704: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        122,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x768: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        123,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_72x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        124,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_72x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        125,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_72x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        126,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_72x256: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        127,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_72x320: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        128,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_72x384: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        129,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_72x448: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        130,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_72x512: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        131,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_72x576: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        132,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_72x640: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        133,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_80x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        134,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_80x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        135,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_80x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        136,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_80x256: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        137,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_80x320: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        138,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_80x384: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        139,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_80x448: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        140,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_80x512: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        141,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_80x576: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        142,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_88x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        143,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_88x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        144,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_88x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        145,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_88x256: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        146,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_88x320: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        147,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_88x384: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        148,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_88x448: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        149,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_88x512: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        150,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_96x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        151,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_96x256: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        152,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_96x320: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        153,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_96x384: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        154,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_96x448: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        155,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_96x512: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        156,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_104x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        157,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_104x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        158,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_104x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        159,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_104x256: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        160,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_104x320: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        161,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_104x384: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        162,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_104x448: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        163,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_112x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        164,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_112x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        165,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_112x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        166,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_112x256: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        167,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_112x320: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        168,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_112x384: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        169,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_120x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        170,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_120x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        171,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_120x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        172,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_120x256: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        173,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_120x320: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        174,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_120x384: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        175,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x320: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        176,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x384: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        177,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_136x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        178,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_136x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        179,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_136x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        180,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_136x256: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        181,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_136x320: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        182,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_144x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        183,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_144x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        184,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_144x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        185,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_144x256: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        186,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_144x320: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        187,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_152x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        188,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_152x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        189,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_152x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        190,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_152x256: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        191,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_152x320: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        192,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_160x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        193,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_160x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        194,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_160x256: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        195,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_168x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        196,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_168x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        197,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_168x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        198,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_168x256: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        199,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_176x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        200,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_176x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        201,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_176x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        202,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_176x256: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        203,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_184x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        204,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_184x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        205,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_184x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        206,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_184x256: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        207,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        208,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        209,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x256: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        210,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_200x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        211,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_200x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        212,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_200x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        213,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_208x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        214,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_208x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        215,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_208x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        216,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_216x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        217,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_216x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        218,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_216x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        219,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_224x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        220,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_224x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        221,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_224x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        222,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_232x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        223,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_232x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        224,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_232x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        225,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_240x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        226,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_240x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        227,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_240x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        228,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_248x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        229,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_248x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        230,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_248x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        231,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        232,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_264x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        233,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_264x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        234,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_272x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        235,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_272x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        236,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_280x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        237,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_280x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        238,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_288x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        239,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_288x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        240,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_296x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        241,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_296x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        242,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_304x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        243,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_304x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        244,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_312x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        245,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_312x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        246,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_320x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        247,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_320x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        248,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_328x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        249,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_328x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        250,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_336x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        251,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_336x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        252,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_344x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        253,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_344x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        254,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_352x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        255,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_352x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        256,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_360x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        257,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_360x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        258,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_368x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        259,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_368x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        260,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_376x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        261,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_376x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        262,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_384x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        263,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_384x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        264,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_392x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        265,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_400x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        266,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_408x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        267,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_416x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        268,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_424x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        269,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_432x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        270,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_440x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        271,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_448x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        272,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_456x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        273,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_464x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        274,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_472x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        275,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_480x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        276,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_488x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        277,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_496x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        278,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_504x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        279,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_520x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        280,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_528x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        281,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_536x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        282,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_544x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        283,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_552x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        284,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_560x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        285,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_568x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        286,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_576x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        287,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_584x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        288,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_592x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        289,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_600x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        290,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_608x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        291,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_616x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        292,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_624x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        293,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_632x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        294,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_640x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        295,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_648x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        296,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_656x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        297,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_664x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        298,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_672x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        299,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_680x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        300,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_688x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        301,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_696x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        302,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_704x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        303,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_712x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        304,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_720x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        305,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_728x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        306,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_736x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        307,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_744x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        308,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_752x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        309,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_760x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        310,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_768x64: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        311,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x16: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        312,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x24: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        313,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x40: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        314,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x48: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        315,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x56: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        316,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x72: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        317,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x80: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        318,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x88: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        319,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x104: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        320,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x112: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        321,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x120: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        322,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x136: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        323,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x144: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        324,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x152: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        325,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x160: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        326,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x168: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        327,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x176: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        328,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x184: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        329,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x200: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        330,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x208: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        331,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x216: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        332,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x224: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        333,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x232: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        334,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x240: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        335,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x248: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        336,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x264: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        337,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x272: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        338,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x280: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        339,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x288: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        340,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x296: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        341,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x304: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        342,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x312: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        343,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x328: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        344,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x336: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        345,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x344: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        346,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x352: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        347,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x360: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        348,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x368: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        349,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x376: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        350,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x392: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        351,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x400: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        352,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x408: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        353,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x416: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        354,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x424: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        355,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x432: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        356,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x440: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        357,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x456: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        358,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x464: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        359,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x472: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        360,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x480: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        361,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x488: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        362,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x496: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        363,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x504: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        364,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x520: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        365,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x528: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        366,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x536: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        367,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x544: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        368,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x552: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        369,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x560: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        370,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x568: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        371,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x584: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        372,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x592: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        373,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x600: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        374,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x608: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        375,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x616: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        376,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x624: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        377,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x632: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        378,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x648: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        379,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x656: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        380,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x664: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        381,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x672: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        382,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x680: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        383,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x688: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        384,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x696: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        385,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x712: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        386,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x720: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        387,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x728: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        388,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x736: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        389,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x744: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        390,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x752: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        391,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_64x760: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        392,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x8: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        393,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x16: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        394,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x24: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        395,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x40: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        396,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x48: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        397,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x56: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        398,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x72: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        399,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x80: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        400,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x88: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        401,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x104: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        402,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x112: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        403,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x120: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        404,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x136: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        405,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x144: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        406,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x152: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        407,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x168: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        408,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x176: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        409,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x184: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        410,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x200: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        411,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x208: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        412,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x216: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        413,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x224: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        414,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x232: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        415,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x240: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        416,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x248: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        417,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x264: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        418,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x272: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        419,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x280: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        420,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x288: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        421,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x296: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        422,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x304: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        423,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x312: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        424,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x328: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        425,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x336: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        426,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x344: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        427,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x352: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        428,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x360: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        429,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x368: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        430,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x376: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        431,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x392: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        432,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x400: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        433,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x408: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        434,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x416: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        435,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x424: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        436,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x432: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        437,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x440: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        438,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x448: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        439,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x456: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        440,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x464: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        441,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x472: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        442,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x480: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        443,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x488: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        444,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x496: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        445,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x504: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        446,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_128x512: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        447,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x8: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        448,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x16: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        449,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x24: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        450,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x32: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        451,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x40: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        452,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x48: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        453,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x56: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        454,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x72: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        455,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x80: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        456,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x88: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        457,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x96: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        458,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x104: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        459,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x112: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        460,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x120: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        461,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x136: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        462,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x144: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        463,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x152: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        464,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x160: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        465,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x168: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        466,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x176: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        467,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x184: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        468,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x200: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        469,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x208: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        470,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x216: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        471,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x224: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        472,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x232: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        473,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x240: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        474,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x248: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        475,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x264: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        476,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x272: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        477,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x280: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        478,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x288: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        479,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x296: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        480,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x304: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        481,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x312: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        482,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x320: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        483,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x328: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        484,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_192x336: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        485,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x8: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        486,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x16: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        487,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x24: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        488,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x40: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        489,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x48: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        490,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x56: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        491,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x72: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        492,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x80: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        493,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x88: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        494,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x96: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        495,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x104: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        496,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x112: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        497,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x120: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        498,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x136: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        499,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x144: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        500,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x152: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        501,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x160: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        502,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x168: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        503,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x176: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        504,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x184: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        505,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x200: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        506,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x208: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        507,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x216: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        508,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x224: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        509,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x232: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        510,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x240: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        511,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x248: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        512,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x256: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        513,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_320x8: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        514,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_320x16: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        515,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_320x24: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        516,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_320x32: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        517,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_320x40: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        518,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_320x48: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        519,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_320x56: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        520,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_320x72: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        521,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_320x80: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        522,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_320x88: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        523,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_320x96: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        524,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_320x104: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        525,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_320x112: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        526,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_320x120: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        527,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_320x136: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        528,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_320x144: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        529,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_320x152: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        530,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_320x160: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        531,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_320x168: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        532,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_320x176: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        533,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_320x184: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        534,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_320x192: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        535,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_320x200: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        536,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_384x8: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        537,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_384x16: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        538,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_384x24: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        539,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_384x32: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        540,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_384x40: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        541,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_384x48: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        542,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_384x56: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        543,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_384x72: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        544,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_384x80: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        545,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_384x88: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        546,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_384x96: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        547,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_384x104: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        548,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_384x112: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        549,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_384x120: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        550,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_384x136: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        551,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_384x144: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        552,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_384x152: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        553,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_384x160: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        554,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_384x168: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        555,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_448x8: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        556,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_448x16: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        557,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_448x24: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        558,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_448x32: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        559,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_448x40: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        560,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_448x48: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        561,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_448x56: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        562,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_448x72: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        563,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_448x80: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        564,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_448x88: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        565,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_448x96: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        566,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_448x104: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        567,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_448x112: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        568,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_448x120: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        569,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_448x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        570,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_448x136: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        571,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_448x144: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        572,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_512x8: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        573,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_512x16: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        574,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_512x24: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        575,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_512x32: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        576,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_512x40: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        577,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_512x48: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        578,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_512x56: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        579,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_512x72: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        580,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_512x80: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        581,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_512x88: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        582,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_512x96: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        583,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_512x104: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        584,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_512x112: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        585,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_512x120: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        586,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_512x128: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        587,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_576x8: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        588,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_576x16: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        589,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_576x24: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        590,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_576x32: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        591,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_576x40: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        592,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_576x48: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        593,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_576x56: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        594,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_576x72: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        595,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_576x80: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        596,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_576x88: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        597,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_576x96: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        598,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_576x104: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        599,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_576x112: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        600,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_640x8: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        601,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_640x16: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        602,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_640x24: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        603,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_640x32: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        604,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_640x40: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        605,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_640x48: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        606,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_640x56: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        607,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_640x72: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        608,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_640x80: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        609,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_640x88: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        610,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_640x96: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        611,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_704x8: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        612,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_704x16: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        613,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_704x24: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        614,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_704x32: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        615,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_704x40: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        616,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_704x48: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        617,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_704x56: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        618,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_704x72: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        619,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_704x80: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        620,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_704x88: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        621,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_768x8: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        622,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_768x16: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        623,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_768x24: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        624,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_768x32: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        625,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_768x40: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        626,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_768x48: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        627,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_768x56: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        628,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_768x72: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        629,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_768x80: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        630,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x512: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        631,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_256x1024: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        632,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_512x512: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        633,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_512x1024: cublasLtMatmulTile_t = cublasLtMatmulTile_t(\n        634,\n    );\n}\nimpl cublasLtMatmulTile_t {\n    pub const CUBLASLT_MATMUL_TILE_END: cublasLtMatmulTile_t = cublasLtMatmulTile_t(635);\n}\n#[repr(transparent)]\n/** Tile size (in C/D matrix Rows x Cols)\n\n General order of tile IDs is sorted by size first and by first dimension second.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasLtMatmulTile_t(pub ::core::ffi::c_uint);\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_UNDEFINED: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        0,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_16x1: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        1,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_16x2: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        2,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_16x3: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        3,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_16x4: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        4,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_16x5: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        5,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_16x6: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        6,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_32x1: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        7,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_32x2: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        8,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_32x3: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        9,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_32x4: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        10,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_32x5: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        11,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_32x6: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        12,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_64x1: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        13,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_64x2: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        14,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_64x3: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        15,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_64x4: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        16,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_64x5: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        17,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_64x6: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        18,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_128x1: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        19,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_128x2: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        20,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_128x3: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        21,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_128x4: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        22,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_128x5: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        23,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_128x6: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        24,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_32x10: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        25,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_8x4: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        26,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_16x10: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        27,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_8x5: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        28,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_8x3: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        31,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_8xAUTO: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        32,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_16xAUTO: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        33,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_32xAUTO: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        34,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_64xAUTO: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        35,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_128xAUTO: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        36,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_256xAUTO: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        37,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_768xAUTO: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        38,\n    );\n}\nimpl cublasLtMatmulStages_t {\n    pub const CUBLASLT_MATMUL_STAGES_END: cublasLtMatmulStages_t = cublasLtMatmulStages_t(\n        39,\n    );\n}\n#[repr(transparent)]\n/** Size and number of stages in which elements are read into shared memory\n\n General order of stages IDs is sorted by stage size first and by number of stages second.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasLtMatmulStages_t(pub ::core::ffi::c_uint);\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_AUTO: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        0,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_1x1x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        2,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_2x1x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        3,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_4x1x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        4,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_1x2x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        5,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_2x2x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        6,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_4x2x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        7,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_1x4x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        8,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_2x4x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        9,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_4x4x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        10,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_8x1x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        11,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_1x8x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        12,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_8x2x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        13,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_2x8x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        14,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_16x1x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        15,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_1x16x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        16,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_3x1x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        17,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_5x1x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        18,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_6x1x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        19,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_7x1x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        20,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_9x1x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        21,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_10x1x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        22,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_11x1x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        23,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_12x1x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        24,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_13x1x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        25,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_14x1x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        26,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_15x1x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        27,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_3x2x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        28,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_5x2x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        29,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_6x2x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        30,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_7x2x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        31,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_1x3x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        32,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_2x3x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        33,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_3x3x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        34,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_4x3x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        35,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_5x3x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        36,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_3x4x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        37,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_1x5x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        38,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_2x5x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        39,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_3x5x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        40,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_1x6x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        41,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_2x6x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        42,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_1x7x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        43,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_2x7x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        44,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_1x9x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        45,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_1x10x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        46,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_1x11x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        47,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_1x12x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        48,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_1x13x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        49,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_1x14x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        50,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_1x15x1: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        51,\n    );\n}\nimpl cublasLtClusterShape_t {\n    /// Let library pick cluster shape automatically\n    pub const CUBLASLT_CLUSTER_SHAPE_END: cublasLtClusterShape_t = cublasLtClusterShape_t(\n        52,\n    );\n}\n#[repr(transparent)]\n/** Thread Block Cluster size\n\n Typically dimensioned similar to cublasLtMatmulTile_t, with the third coordinate unused at this time.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasLtClusterShape_t(pub ::core::ffi::c_uint);\nimpl cublasLtMatmulInnerShape_t {\n    pub const CUBLASLT_MATMUL_INNER_SHAPE_UNDEFINED: cublasLtMatmulInnerShape_t = cublasLtMatmulInnerShape_t(\n        0,\n    );\n}\nimpl cublasLtMatmulInnerShape_t {\n    pub const CUBLASLT_MATMUL_INNER_SHAPE_MMA884: cublasLtMatmulInnerShape_t = cublasLtMatmulInnerShape_t(\n        1,\n    );\n}\nimpl cublasLtMatmulInnerShape_t {\n    pub const CUBLASLT_MATMUL_INNER_SHAPE_MMA1684: cublasLtMatmulInnerShape_t = cublasLtMatmulInnerShape_t(\n        2,\n    );\n}\nimpl cublasLtMatmulInnerShape_t {\n    pub const CUBLASLT_MATMUL_INNER_SHAPE_MMA1688: cublasLtMatmulInnerShape_t = cublasLtMatmulInnerShape_t(\n        3,\n    );\n}\nimpl cublasLtMatmulInnerShape_t {\n    pub const CUBLASLT_MATMUL_INNER_SHAPE_MMA16816: cublasLtMatmulInnerShape_t = cublasLtMatmulInnerShape_t(\n        4,\n    );\n}\nimpl cublasLtMatmulInnerShape_t {\n    pub const CUBLASLT_MATMUL_INNER_SHAPE_END: cublasLtMatmulInnerShape_t = cublasLtMatmulInnerShape_t(\n        5,\n    );\n}\n#[repr(transparent)]\n/** Inner size of the kernel\n\n Represents various aspects of internal kernel design, that don't impact CUDA grid size but may have other more subtle\n effects.\n*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasLtMatmulInnerShape_t(pub ::core::ffi::c_uint);\nimpl cublasLtMatmulMatrixScale_t {\n    /// Scaling factors are single precision scalars applied to the whole tensor.\n    pub const CUBLASLT_MATMUL_MATRIX_SCALE_SCALAR_32F: cublasLtMatmulMatrixScale_t = cublasLtMatmulMatrixScale_t(\n        0,\n    );\n}\nimpl cublasLtMatmulMatrixScale_t {\n    /** Scaling factors are tensors that contain a dedicated scaling factor stored as an 8-bit CUDA_R_8F_UE4M3 value for\n each 16-element block in the innermost dimension of the corresponding data tensor.*/\n    pub const CUBLASLT_MATMUL_MATRIX_SCALE_VEC16_UE4M3: cublasLtMatmulMatrixScale_t = cublasLtMatmulMatrixScale_t(\n        1,\n    );\n}\nimpl cublasLtMatmulMatrixScale_t {\n    /** Same as above, except that scaling factor tensor elements have type CUDA_R_8F_UE8M0 and the block size is 32\n elements.*/\n    pub const CUBLASLT_MATMUL_MATRIX_SCALE_VEC32_UE8M0: cublasLtMatmulMatrixScale_t = cublasLtMatmulMatrixScale_t(\n        2,\n    );\n}\nimpl cublasLtMatmulMatrixScale_t {\n    /** Scaling factors are vectors of CUDA_R_32F values. This mode is only applicable to matrices A and B, in which case\n the vectors are expected to have M and N elements respectively, and each (i, j)-th element of product of A and B is\n multiplied by i-th element of A scale and j-th element of B scale.*/\n    pub const CUBLASLT_MATMUL_MATRIX_SCALE_OUTER_VEC_32F: cublasLtMatmulMatrixScale_t = cublasLtMatmulMatrixScale_t(\n        3,\n    );\n}\nimpl cublasLtMatmulMatrixScale_t {\n    /** Scaling factors are tensors that contain a dedicated CUDA_R_32F scaling factor for each 128-element block in the\n innermost dimension of the corresponding data tensor.*/\n    pub const CUBLASLT_MATMUL_MATRIX_SCALE_VEC128_32F: cublasLtMatmulMatrixScale_t = cublasLtMatmulMatrixScale_t(\n        4,\n    );\n}\nimpl cublasLtMatmulMatrixScale_t {\n    /** Scaling factors are tensors that contain a dedicated CUDA_R_32F scaling factor for each 128x128-element block in\n the the corresponding data tensor.*/\n    pub const CUBLASLT_MATMUL_MATRIX_SCALE_BLK128x128_32F: cublasLtMatmulMatrixScale_t = cublasLtMatmulMatrixScale_t(\n        5,\n    );\n}\nimpl cublasLtMatmulMatrixScale_t {\n    /** Scaling factors are tensors that contain a dedicated CUDA_R_32F scaling factor for each 128x128-element block in\n the the corresponding data tensor.*/\n    pub const CUBLASLT_MATMUL_MATRIX_SCALE_END: cublasLtMatmulMatrixScale_t = cublasLtMatmulMatrixScale_t(\n        6,\n    );\n}\n#[repr(transparent)]\n/// Scaling mode for per-matrix scaling. See documentation for layout information.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasLtMatmulMatrixScale_t(pub ::core::ffi::c_uint);\nimpl cublasLtPointerMode_t {\n    /// matches CUBLAS_POINTER_MODE_HOST, pointer targets a single value host memory\n    pub const CUBLASLT_POINTER_MODE_HOST: cublasLtPointerMode_t = cublasLtPointerMode_t(\n        0,\n    );\n}\nimpl cublasLtPointerMode_t {\n    /// matches CUBLAS_POINTER_MODE_DEVICE, pointer targets a single value device memory\n    pub const CUBLASLT_POINTER_MODE_DEVICE: cublasLtPointerMode_t = cublasLtPointerMode_t(\n        1,\n    );\n}\nimpl cublasLtPointerMode_t {\n    /// pointer targets an array in device memory\n    pub const CUBLASLT_POINTER_MODE_DEVICE_VECTOR: cublasLtPointerMode_t = cublasLtPointerMode_t(\n        2,\n    );\n}\nimpl cublasLtPointerMode_t {\n    /** alpha pointer targets an array in device memory, beta is zero. Note:\nCUBLASLT_MATMUL_DESC_ALPHA_VECTOR_BATCH_STRIDE is not supported, must be 0.*/\n    pub const CUBLASLT_POINTER_MODE_ALPHA_DEVICE_VECTOR_BETA_ZERO: cublasLtPointerMode_t = cublasLtPointerMode_t(\n        3,\n    );\n}\nimpl cublasLtPointerMode_t {\n    /// alpha pointer targets an array in device memory, beta is a single value in host memory.\n    pub const CUBLASLT_POINTER_MODE_ALPHA_DEVICE_VECTOR_BETA_HOST: cublasLtPointerMode_t = cublasLtPointerMode_t(\n        4,\n    );\n}\n#[repr(transparent)]\n/// Pointer mode to use for alpha/beta\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasLtPointerMode_t(pub ::core::ffi::c_uint);\nimpl cublasLtPointerModeMask_t {\n    /// see CUBLASLT_POINTER_MODE_HOST\n    pub const CUBLASLT_POINTER_MODE_MASK_HOST: cublasLtPointerModeMask_t = cublasLtPointerModeMask_t(\n        1,\n    );\n}\nimpl cublasLtPointerModeMask_t {\n    /// see CUBLASLT_POINTER_MODE_DEVICE\n    pub const CUBLASLT_POINTER_MODE_MASK_DEVICE: cublasLtPointerModeMask_t = cublasLtPointerModeMask_t(\n        2,\n    );\n}\nimpl cublasLtPointerModeMask_t {\n    /// see CUBLASLT_POINTER_MODE_DEVICE_VECTOR\n    pub const CUBLASLT_POINTER_MODE_MASK_DEVICE_VECTOR: cublasLtPointerModeMask_t = cublasLtPointerModeMask_t(\n        4,\n    );\n}\nimpl cublasLtPointerModeMask_t {\n    /// see CUBLASLT_POINTER_MODE_ALPHA_DEVICE_VECTOR_BETA_ZERO\n    pub const CUBLASLT_POINTER_MODE_MASK_ALPHA_DEVICE_VECTOR_BETA_ZERO: cublasLtPointerModeMask_t = cublasLtPointerModeMask_t(\n        8,\n    );\n}\nimpl cublasLtPointerModeMask_t {\n    /// see CUBLASLT_POINTER_MODE_ALPHA_DEVICE_VECTOR_BETA_HOST\n    pub const CUBLASLT_POINTER_MODE_MASK_ALPHA_DEVICE_VECTOR_BETA_HOST: cublasLtPointerModeMask_t = cublasLtPointerModeMask_t(\n        16,\n    );\n}\n#[repr(transparent)]\n/// Mask to define pointer mode capability\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasLtPointerModeMask_t(pub ::core::ffi::c_uint);\npub type cublasLtNumericalImplFlags_t = u64;\nimpl cublasLtOrder_t {\n    /** Column-major\n\n Leading dimension is the stride (in elements) to the beginning of next column in memory.*/\n    pub const CUBLASLT_ORDER_COL: cublasLtOrder_t = cublasLtOrder_t(0);\n}\nimpl cublasLtOrder_t {\n    /** Row major\n\n Leading dimension is the stride (in elements) to the beginning of next row in memory.*/\n    pub const CUBLASLT_ORDER_ROW: cublasLtOrder_t = cublasLtOrder_t(1);\n}\nimpl cublasLtOrder_t {\n    /** Column-major ordered tiles of 32 columns.\n\n Leading dimension is the stride (in elements) to the beginning of next group of 32-columns. E.g. if matrix has 33\n columns and 2 rows, ld must be at least (32) * 2 = 64.*/\n    pub const CUBLASLT_ORDER_COL32: cublasLtOrder_t = cublasLtOrder_t(2);\n}\nimpl cublasLtOrder_t {\n    /** Column-major ordered tiles of composite tiles with total 32 columns and 8 rows, tile composed of interleaved\n inner tiles of 4 columns within 4 even or odd rows in an alternating pattern.\n\n Leading dimension is the stride (in elements) to the beginning of the first 32 column x 8 row tile for the next\n 32-wide group of columns. E.g. if matrix has 33 columns and 1 row, ld must be at least (32 * 8) * 1 = 256.*/\n    pub const CUBLASLT_ORDER_COL4_4R2_8C: cublasLtOrder_t = cublasLtOrder_t(3);\n}\nimpl cublasLtOrder_t {\n    /** Column-major ordered tiles of composite tiles with total 32 columns ands 32 rows.\n Element offset within the tile is calculated as (((row%8)/2*4+row/8)*2+row%2)*32+col.\n\n Leading dimension is the stride (in elements) to the beginning of the first 32 column x 32 row tile for the next\n 32-wide group of columns. E.g. if matrix has 33 columns and 1 row, ld must be at least (32*32)*1 = 1024.*/\n    pub const CUBLASLT_ORDER_COL32_2R_4R4: cublasLtOrder_t = cublasLtOrder_t(4);\n}\n#[repr(transparent)]\n/// Enum for data ordering\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasLtOrder_t(pub ::core::ffi::c_uint);\nimpl cublasLtBatchMode_t {\n    /** Strided\n\n The matrices of each instance of the batch are located at fixed offsets in number of elements from their locations\n in the previous instance.*/\n    pub const CUBLASLT_BATCH_MODE_STRIDED: cublasLtBatchMode_t = cublasLtBatchMode_t(0);\n}\nimpl cublasLtBatchMode_t {\n    /** Pointer array\n\n The address of the matrix of each instance of the batch are read from arrays of pointers.*/\n    pub const CUBLASLT_BATCH_MODE_POINTER_ARRAY: cublasLtBatchMode_t = cublasLtBatchMode_t(\n        1,\n    );\n}\n#[repr(transparent)]\n/// Enum for batch mode\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasLtBatchMode_t(pub ::core::ffi::c_uint);\nimpl cublasLtMatrixLayoutAttribute_t {\n    /** Data type, see cudaDataType.\n\n uint32_t*/\n    pub const CUBLASLT_MATRIX_LAYOUT_TYPE: cublasLtMatrixLayoutAttribute_t = cublasLtMatrixLayoutAttribute_t(\n        0,\n    );\n}\nimpl cublasLtMatrixLayoutAttribute_t {\n    /** Memory order of the data, see cublasLtOrder_t.\n\n int32_t, default: CUBLASLT_ORDER_COL*/\n    pub const CUBLASLT_MATRIX_LAYOUT_ORDER: cublasLtMatrixLayoutAttribute_t = cublasLtMatrixLayoutAttribute_t(\n        1,\n    );\n}\nimpl cublasLtMatrixLayoutAttribute_t {\n    /** Number of rows.\n\n Usually only values that can be expressed as int32_t are supported.\n\n uint64_t*/\n    pub const CUBLASLT_MATRIX_LAYOUT_ROWS: cublasLtMatrixLayoutAttribute_t = cublasLtMatrixLayoutAttribute_t(\n        2,\n    );\n}\nimpl cublasLtMatrixLayoutAttribute_t {\n    /** Number of columns.\n\n Usually only values that can be expressed as int32_t are supported.\n\n uint64_t*/\n    pub const CUBLASLT_MATRIX_LAYOUT_COLS: cublasLtMatrixLayoutAttribute_t = cublasLtMatrixLayoutAttribute_t(\n        3,\n    );\n}\nimpl cublasLtMatrixLayoutAttribute_t {\n    /** Matrix leading dimension.\n\n For CUBLASLT_ORDER_COL this is stride (in elements) of matrix column, for more details and documentation for\n other memory orders see documentation for cublasLtOrder_t values.\n\n Currently only non-negative values are supported, must be large enough so that matrix memory locations are not\n overlapping (e.g. greater or equal to CUBLASLT_MATRIX_LAYOUT_ROWS in case of CUBLASLT_ORDER_COL).\n\n int64_t;*/\n    pub const CUBLASLT_MATRIX_LAYOUT_LD: cublasLtMatrixLayoutAttribute_t = cublasLtMatrixLayoutAttribute_t(\n        4,\n    );\n}\nimpl cublasLtMatrixLayoutAttribute_t {\n    /** Number of matmul operations to perform in the batch.\n\n See also CUBLASLT_ALGO_CAP_STRIDED_BATCH_SUPPORT and CUBLASLT_ALGO_CAP_POINTER_ARRAY_BATCH_SUPPORT\n\n int32_t, default: 1*/\n    pub const CUBLASLT_MATRIX_LAYOUT_BATCH_COUNT: cublasLtMatrixLayoutAttribute_t = cublasLtMatrixLayoutAttribute_t(\n        5,\n    );\n}\nimpl cublasLtMatrixLayoutAttribute_t {\n    /** Stride (in elements) to the next matrix for strided batch operation.\n\n When matrix type is planar-complex (CUBLASLT_MATRIX_LAYOUT_PLANE_OFFSET != 0), batch stride\n is interpreted by cublasLtMatmul() in number of real valued sub-elements. E.g. for data of type CUDA_C_16F,\n offset of 1024B is encoded as a stride of value 512 (since each element of the real and imaginary matrices\n is a 2B (16bit) floating point type).\n\n NOTE: A bug in cublasLtMatrixTransform() causes it to interpret the batch stride for a planar-complex matrix\n as if it was specified in number of complex elements. Therefore an offset of 1024B must be encoded as stride\n value 256 when calling cublasLtMatrixTransform() (each complex element is 4B with real and imaginary values 2B\n each). This behavior is expected to be corrected in the next major cuBLAS version.\n\n int64_t, default: 0*/\n    pub const CUBLASLT_MATRIX_LAYOUT_STRIDED_BATCH_OFFSET: cublasLtMatrixLayoutAttribute_t = cublasLtMatrixLayoutAttribute_t(\n        6,\n    );\n}\nimpl cublasLtMatrixLayoutAttribute_t {\n    /** Stride (in bytes) to the imaginary plane for planar complex layout.\n\n int64_t, default: 0 - 0 means that layout is regular (real and imaginary parts of complex numbers are interleaved\n in memory in each element)*/\n    pub const CUBLASLT_MATRIX_LAYOUT_PLANE_OFFSET: cublasLtMatrixLayoutAttribute_t = cublasLtMatrixLayoutAttribute_t(\n        7,\n    );\n}\nimpl cublasLtMatrixLayoutAttribute_t {\n    /** Batch mode.\n\n uint32_t, default: 0 - 0 means that batch mode is CUBLASLT_BATCH_MODE_STRIDED.*/\n    pub const CUBLASLT_MATRIX_LAYOUT_BATCH_MODE: cublasLtMatrixLayoutAttribute_t = cublasLtMatrixLayoutAttribute_t(\n        8,\n    );\n}\n#[repr(transparent)]\n/// Attributes of memory layout\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasLtMatrixLayoutAttribute_t(pub ::core::ffi::c_uint);\nimpl cublasLtMatmulDescAttributes_t {\n    /** Compute type, see cudaDataType. Defines data type used for multiply and accumulate operations and the\n accumulator during matrix multiplication.\n\n int32_t*/\n    pub const CUBLASLT_MATMUL_DESC_COMPUTE_TYPE: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        0,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Scale type, see cudaDataType. Defines data type of alpha and beta. Accumulator and value from matrix C are\n typically converted to scale type before final scaling. Value is then converted from scale type to type of matrix\n D before being stored in memory.\n\n int32_t, default: same as CUBLASLT_MATMUL_DESC_COMPUTE_TYPE*/\n    pub const CUBLASLT_MATMUL_DESC_SCALE_TYPE: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        1,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Pointer mode of alpha and beta, see cublasLtPointerMode_t. When CUBLASLT_POINTER_MODE_DEVICE_VECTOR is in use,\n alpha/beta vector lenghts must match number of output matrix rows.\n\n int32_t, default: CUBLASLT_POINTER_MODE_HOST*/\n    pub const CUBLASLT_MATMUL_DESC_POINTER_MODE: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        2,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Transform of matrix A, see cublasOperation_t.\n\n int32_t, default: CUBLAS_OP_N*/\n    pub const CUBLASLT_MATMUL_DESC_TRANSA: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        3,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Transform of matrix B, see cublasOperation_t.\n\n int32_t, default: CUBLAS_OP_N*/\n    pub const CUBLASLT_MATMUL_DESC_TRANSB: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        4,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Transform of matrix C, see cublasOperation_t.\n\n Currently only CUBLAS_OP_N is supported.\n\n int32_t, default: CUBLAS_OP_N*/\n    pub const CUBLASLT_MATMUL_DESC_TRANSC: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        5,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Matrix fill mode, see cublasFillMode_t.\n\n int32_t, default: CUBLAS_FILL_MODE_FULL*/\n    pub const CUBLASLT_MATMUL_DESC_FILL_MODE: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        6,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Epilogue function, see cublasLtEpilogue_t.\n\n uint32_t, default: CUBLASLT_EPILOGUE_DEFAULT*/\n    pub const CUBLASLT_MATMUL_DESC_EPILOGUE: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        7,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Bias or bias gradient vector pointer in the device memory.\n\n Bias case. See CUBLASLT_EPILOGUE_BIAS.\n For bias data type see CUBLASLT_MATMUL_DESC_BIAS_DATA_TYPE.\n\n Bias vector length must match matrix D rows count.\n\n Bias gradient case. See CUBLASLT_EPILOGUE_DRELU_BGRAD and CUBLASLT_EPILOGUE_DGELU_BGRAD.\n Bias gradient vector elements are the same type as the output elements\n (Ctype) with the exception of IMMA kernels (see above).\n\n Routines that don't dereference this pointer, like cublasLtMatmulAlgoGetHeuristic()\n depend on its value to determine expected pointer alignment.\n\n Bias case: const void *, default: NULL\n Bias gradient case: void *, default: NULL*/\n    pub const CUBLASLT_MATMUL_DESC_BIAS_POINTER: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        8,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Batch stride for bias or bias gradient vector.\n\n Used together with CUBLASLT_MATMUL_DESC_BIAS_POINTER when matrix D's CUBLASLT_MATRIX_LAYOUT_BATCH_COUNT > 1.\n\n int64_t, default: 0*/\n    pub const CUBLASLT_MATMUL_DESC_BIAS_BATCH_STRIDE: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        10,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Pointer for epilogue auxiliary buffer.\n\n - Output vector for ReLu bit-mask in forward pass when CUBLASLT_EPILOGUE_RELU_AUX\n   or CUBLASLT_EPILOGUE_RELU_AUX_BIAS epilogue is used.\n - Input vector for ReLu bit-mask in backward pass when\n   CUBLASLT_EPILOGUE_DRELU_BGRAD epilogue is used.\n\n - Output of GELU input matrix in forward pass when\n   CUBLASLT_EPILOGUE_GELU_AUX_BIAS epilogue is used.\n - Input of GELU input matrix for backward pass when\n   CUBLASLT_EPILOGUE_DGELU_BGRAD epilogue is used.\n\n For aux data type see CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_DATA_TYPE.\n\n Routines that don't dereference this pointer, like cublasLtMatmulAlgoGetHeuristic()\n depend on its value to determine expected pointer alignment.\n\n Requires setting CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_LD attribute.\n\n Forward pass: void *, default: NULL\n Backward pass: const void *, default: NULL*/\n    pub const CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_POINTER: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        11,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Leading dimension for epilogue auxiliary buffer.\n\n - ReLu bit-mask matrix leading dimension in elements (i.e. bits)\n   when CUBLASLT_EPILOGUE_RELU_AUX, CUBLASLT_EPILOGUE_RELU_AUX_BIAS or CUBLASLT_EPILOGUE_DRELU_BGRAD epilogue is\n used. Must be divisible by 128 and be no less than the number of rows in the output matrix.\n\n - GELU input matrix leading dimension in elements\n   when CUBLASLT_EPILOGUE_GELU_AUX_BIAS or CUBLASLT_EPILOGUE_DGELU_BGRAD epilogue used.\n   Must be divisible by 8 and be no less than the number of rows in the output matrix.\n\n int64_t, default: 0*/\n    pub const CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_LD: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        12,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Batch stride for epilogue auxiliary buffer.\n\n - ReLu bit-mask matrix batch stride in elements (i.e. bits)\n   when CUBLASLT_EPILOGUE_RELU_AUX, CUBLASLT_EPILOGUE_RELU_AUX_BIAS or CUBLASLT_EPILOGUE_DRELU_BGRAD epilogue is\n used. Must be divisible by 128.\n\n - GELU input matrix batch stride in elements\n   when CUBLASLT_EPILOGUE_GELU_AUX_BIAS or CUBLASLT_EPILOGUE_DGELU_BGRAD epilogue used.\n   Must be divisible by 8.\n\n int64_t, default: 0*/\n    pub const CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_BATCH_STRIDE: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        13,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Batch stride for alpha vector.\n\n Used together with CUBLASLT_POINTER_MODE_ALPHA_DEVICE_VECTOR_BETA_HOST when matrix D's\n CUBLASLT_MATRIX_LAYOUT_BATCH_COUNT > 1. If CUBLASLT_POINTER_MODE_ALPHA_DEVICE_VECTOR_BETA_ZERO is set then\n CUBLASLT_MATMUL_DESC_ALPHA_VECTOR_BATCH_STRIDE must be set to 0 as this mode doesnt supported batched alpha vector.\n\n int64_t, default: 0*/\n    pub const CUBLASLT_MATMUL_DESC_ALPHA_VECTOR_BATCH_STRIDE: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        14,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Number of SMs to target for parallel execution. Optimizes heuristics for execution on a different number of SMs\n  when user expects a concurrent stream to be using some of the device resources.\n\n  int32_t, default: 0 - use the number reported by the device.*/\n    pub const CUBLASLT_MATMUL_DESC_SM_COUNT_TARGET: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        15,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Device pointer to the scale factor value that converts data in matrix A to the compute data type range.\n\n  The scaling factor value must have the same type as the compute type.\n\n  If not specified, or set to NULL, the scaling factor is assumed to be 1.\n\n  If set for an unsupported matrix data, scale, and compute type combination, calling cublasLtMatmul()\n  will return CUBLAS_INVALID_VALUE.\n\n  const void *, default: NULL*/\n    pub const CUBLASLT_MATMUL_DESC_A_SCALE_POINTER: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        17,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Device pointer to the scale factor value to convert data in matrix B to compute data type range.\n\n  The scaling factor value must have the same type as the compute type.\n\n  If not specified, or set to NULL, the scaling factor is assumed to be 1.\n\n  If set for an unsupported matrix data, scale, and compute type combination, calling cublasLtMatmul()\n  will return CUBLAS_INVALID_VALUE.\n\n  const void *, default: NULL*/\n    pub const CUBLASLT_MATMUL_DESC_B_SCALE_POINTER: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        18,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Device pointer to the scale factor value to convert data in matrix C to compute data type range.\n\n  The scaling factor value must have the same type as the compute type.\n\n  If not specified, or set to NULL, the scaling factor is assumed to be 1.\n\n  If set for an unsupported matrix data, scale, and compute type combination, calling cublasLtMatmul()\n  will return CUBLAS_INVALID_VALUE.\n\n  const void *, default: NULL*/\n    pub const CUBLASLT_MATMUL_DESC_C_SCALE_POINTER: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        19,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Device pointer to the scale factor value to convert data in matrix D to compute data type range.\n\n  The scaling factor value must have the same type as the compute type.\n\n  If not specified, or set to NULL, the scaling factor is assumed to be 1.\n\n  If set for an unsupported matrix data, scale, and compute type combination, calling cublasLtMatmul()\n  will return CUBLAS_INVALID_VALUE.\n\n  const void *, default: NULL*/\n    pub const CUBLASLT_MATMUL_DESC_D_SCALE_POINTER: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        20,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Device pointer to the memory location that on completion will be set to the maximum of absolute values in the\n  output matrix.\n\n  The computed value has the same type as the compute type.\n\n  If not specified or set to NULL, the maximum absolute value is not computed. If set for an unsupported matrix\n  data, scale, and compute type combination, calling cublasLtMatmul() will return CUBLAS_INVALID_VALUE.\n\n  void *, default: NULL*/\n    pub const CUBLASLT_MATMUL_DESC_AMAX_D_POINTER: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        21,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Type of the data to be stored to the memory pointed to by CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_POINTER.\n\n  If unset, the data type defaults to the type of elements of the output matrix with some exceptions, see details\n below.\n\n  ReLu uses a bit-mask.\n\n  GELU input matrix elements type is the same as the type of elements of\n  the output matrix with some exceptions, see details below.\n\n  For fp8 kernels with output type CUDA_R_8F_E4M3 the aux data type can be CUDA_R_8F_E4M3 or CUDA_R_16F with some\n  restrictions.  See https://docs.nvidia.com/cuda/cublas/index.html#cublasLtMatmulDescAttributes_t for more details.\n\n  If set for an unsupported matrix data, scale, and compute type combination, calling cublasLtMatmul()\n  will return CUBLAS_INVALID_VALUE.\n\n  int32_t based on cudaDataType, default: -1*/\n    pub const CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_DATA_TYPE: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        22,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Device pointer to the scaling factor value to convert results from compute type data range to storage\n  data range in the auxiliary matrix that is set via CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_POINTER.\n\n  The scaling factor value must have the same type as the compute type.\n\n  If not specified, or set to NULL, the scaling factor is assumed to be 1. If set for an unsupported matrix data,\n  scale, and compute type combination, calling cublasLtMatmul() will return CUBLAS_INVALID_VALUE.\n\n  void *, default: NULL*/\n    pub const CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_SCALE_POINTER: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        23,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Device pointer to the memory location that on completion will be set to the maximum of absolute values in the\n  buffer that is set via CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_POINTER.\n\n  The computed value has the same type as the compute type.\n\n  If not specified or set to NULL, the maximum absolute value is not computed. If set for an unsupported matrix\n  data, scale, and compute type combination, calling cublasLtMatmul() will return CUBLAS_INVALID_VALUE.\n\n  void *, default: NULL*/\n    pub const CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_AMAX_POINTER: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        24,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Flag for managing fp8 fast accumulation mode.\n  When enabled, problem execution might be faster but at the cost of lower accuracy because intermediate results\n  will not periodically be promoted to a higher precision.\n\n  int8_t, default: 0 - fast accumulation mode is disabled.*/\n    pub const CUBLASLT_MATMUL_DESC_FAST_ACCUM: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        25,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Type of bias or bias gradient vector in the device memory.\n\n Bias case: see CUBLASLT_EPILOGUE_BIAS.\n\n Bias vector elements are the same type as the elements of output matrix (Dtype) with the following exceptions:\n - IMMA kernels with computeType=CUDA_R_32I and Ctype=CUDA_R_8I where the bias vector elements\n   are the same type as alpha, beta (CUBLASLT_MATMUL_DESC_SCALE_TYPE=CUDA_R_32F)\n - fp8 kernels with an output type of CUDA_R_32F, CUDA_R_8F_E4M3 or CUDA_R_8F_E5M2, See\n   https://docs.nvidia.com/cuda/cublas/index.html#cublasLtMatmul for details.\n\n int32_t based on cudaDataType, default: -1*/\n    pub const CUBLASLT_MATMUL_DESC_BIAS_DATA_TYPE: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        26,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Scaling mode that defines how the matrix scaling factor for matrix A is interpreted\n\n int32_t, default: 0*/\n    pub const CUBLASLT_MATMUL_DESC_A_SCALE_MODE: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        31,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Scaling mode that defines how the matrix scaling factor for matrix B is interpreted\n\n int32_t, default: 0*/\n    pub const CUBLASLT_MATMUL_DESC_B_SCALE_MODE: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        32,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Scaling mode that defines how the matrix scaling factor for matrix C is interpreted\n\n int32_t, default: 0*/\n    pub const CUBLASLT_MATMUL_DESC_C_SCALE_MODE: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        33,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Scaling mode that defines how the matrix scaling factor for matrix D is interpreted\n\n int32_t, default: 0*/\n    pub const CUBLASLT_MATMUL_DESC_D_SCALE_MODE: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        34,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Scaling mode that defines how the matrix scaling factor for the auxiliary matrix is interpreted\n\n int32_t, default: 0*/\n    pub const CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_SCALE_MODE: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        35,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Device pointer to the scale factors that are used to convert data in matrix D to the compute data type range.\n\n  The scaling factor value type is defined by the scaling mode (see CUBLASLT_MATMUL_DESC_D_OUT_SCALE_MODE)\n\n  If set for an unsupported matrix data, scale, scale mode, and compute type combination, calling cublasLtMatmul()\n  will return CUBLAS_INVALID_VALUE.\n\n  void *, default: NULL*/\n    pub const CUBLASLT_MATMUL_DESC_D_OUT_SCALE_POINTER: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        36,\n    );\n}\nimpl cublasLtMatmulDescAttributes_t {\n    /** Scaling mode that defines how the output matrix scaling factor for matrix D is interpreted\n\n int32_t, default: 0*/\n    pub const CUBLASLT_MATMUL_DESC_D_OUT_SCALE_MODE: cublasLtMatmulDescAttributes_t = cublasLtMatmulDescAttributes_t(\n        37,\n    );\n}\n#[repr(transparent)]\n/// Matmul descriptor attributes to define details of the operation.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasLtMatmulDescAttributes_t(pub ::core::ffi::c_uint);\nimpl cublasLtMatrixTransformDescAttributes_t {\n    /** Scale type, see cudaDataType. Inputs are converted to scale type for scaling and summation and results are then\n converted to output type to store in memory.\n\n int32_t*/\n    pub const CUBLASLT_MATRIX_TRANSFORM_DESC_SCALE_TYPE: cublasLtMatrixTransformDescAttributes_t = cublasLtMatrixTransformDescAttributes_t(\n        0,\n    );\n}\nimpl cublasLtMatrixTransformDescAttributes_t {\n    /** Pointer mode of alpha and beta, see cublasLtPointerMode_t.\n\n int32_t, default: CUBLASLT_POINTER_MODE_HOST*/\n    pub const CUBLASLT_MATRIX_TRANSFORM_DESC_POINTER_MODE: cublasLtMatrixTransformDescAttributes_t = cublasLtMatrixTransformDescAttributes_t(\n        1,\n    );\n}\nimpl cublasLtMatrixTransformDescAttributes_t {\n    /** Transform of matrix A, see cublasOperation_t.\n\n int32_t, default: CUBLAS_OP_N*/\n    pub const CUBLASLT_MATRIX_TRANSFORM_DESC_TRANSA: cublasLtMatrixTransformDescAttributes_t = cublasLtMatrixTransformDescAttributes_t(\n        2,\n    );\n}\nimpl cublasLtMatrixTransformDescAttributes_t {\n    /** Transform of matrix B, see cublasOperation_t.\n\n int32_t, default: CUBLAS_OP_N*/\n    pub const CUBLASLT_MATRIX_TRANSFORM_DESC_TRANSB: cublasLtMatrixTransformDescAttributes_t = cublasLtMatrixTransformDescAttributes_t(\n        3,\n    );\n}\n#[repr(transparent)]\n/// Matrix transform descriptor attributes to define details of the operation.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasLtMatrixTransformDescAttributes_t(pub ::core::ffi::c_uint);\nimpl cublasLtReductionScheme_t {\n    /// No reduction scheme, dot-product shall be performed in one sequence.\n    pub const CUBLASLT_REDUCTION_SCHEME_NONE: cublasLtReductionScheme_t = cublasLtReductionScheme_t(\n        0,\n    );\n}\nimpl cublasLtReductionScheme_t {\n    /** Reduction is performed \"in place\" - using the output buffer (and output data type) and counters (in workspace) to\n guarantee the sequentiality.*/\n    pub const CUBLASLT_REDUCTION_SCHEME_INPLACE: cublasLtReductionScheme_t = cublasLtReductionScheme_t(\n        1,\n    );\n}\nimpl cublasLtReductionScheme_t {\n    /// Intermediate results are stored in compute type in the workspace and reduced in a separate step.\n    pub const CUBLASLT_REDUCTION_SCHEME_COMPUTE_TYPE: cublasLtReductionScheme_t = cublasLtReductionScheme_t(\n        2,\n    );\n}\nimpl cublasLtReductionScheme_t {\n    /// Intermediate results are stored in output type in the workspace and reduced in a separate step.\n    pub const CUBLASLT_REDUCTION_SCHEME_OUTPUT_TYPE: cublasLtReductionScheme_t = cublasLtReductionScheme_t(\n        4,\n    );\n}\nimpl cublasLtReductionScheme_t {\n    /// Intermediate results are stored in output type in the workspace and reduced in a separate step.\n    pub const CUBLASLT_REDUCTION_SCHEME_MASK: cublasLtReductionScheme_t = cublasLtReductionScheme_t(\n        7,\n    );\n}\n#[repr(transparent)]\n/// Reduction scheme for portions of the dot-product calculated in parallel (a. k. a. \"split - K\").\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasLtReductionScheme_t(pub ::core::ffi::c_uint);\nimpl cublasLtEpilogue_t {\n    /// No special postprocessing, just scale and quantize results if necessary.\n    pub const CUBLASLT_EPILOGUE_DEFAULT: cublasLtEpilogue_t = cublasLtEpilogue_t(1);\n}\nimpl cublasLtEpilogue_t {\n    /// ReLu, apply ReLu point-wise transform to the results (x:=max(x, 0)).\n    pub const CUBLASLT_EPILOGUE_RELU: cublasLtEpilogue_t = cublasLtEpilogue_t(2);\n}\nimpl cublasLtEpilogue_t {\n    /** ReLu, apply ReLu point-wise transform to the results (x:=max(x, 0)).\n\n This epilogue mode produces an extra output, a ReLu bit-mask matrix,\n see CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_POINTER.*/\n    pub const CUBLASLT_EPILOGUE_RELU_AUX: cublasLtEpilogue_t = cublasLtEpilogue_t(130);\n}\nimpl cublasLtEpilogue_t {\n    /** Bias, apply (broadcasted) Bias from bias vector. Bias vector length must match matrix D rows, it must be packed\n (stride between vector elements is 1). Bias vector is broadcasted to all columns and added before applying final\n postprocessing.*/\n    pub const CUBLASLT_EPILOGUE_BIAS: cublasLtEpilogue_t = cublasLtEpilogue_t(4);\n}\nimpl cublasLtEpilogue_t {\n    /// ReLu and Bias, apply Bias and then ReLu transform\n    pub const CUBLASLT_EPILOGUE_RELU_BIAS: cublasLtEpilogue_t = cublasLtEpilogue_t(6);\n}\nimpl cublasLtEpilogue_t {\n    /** ReLu and Bias, apply Bias and then ReLu transform\n\n This epilogue mode produces an extra output, a ReLu bit-mask matrix,\n see CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_POINTER.*/\n    pub const CUBLASLT_EPILOGUE_RELU_AUX_BIAS: cublasLtEpilogue_t = cublasLtEpilogue_t(\n        134,\n    );\n}\nimpl cublasLtEpilogue_t {\n    /** ReLu and Bias, apply Bias and then ReLu transform\n\n This epilogue mode produces an extra output, a ReLu bit-mask matrix,\n see CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_POINTER.*/\n    pub const CUBLASLT_EPILOGUE_DRELU: cublasLtEpilogue_t = cublasLtEpilogue_t(136);\n}\nimpl cublasLtEpilogue_t {\n    /** ReLu and Bias, apply Bias and then ReLu transform\n\n This epilogue mode produces an extra output, a ReLu bit-mask matrix,\n see CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_POINTER.*/\n    pub const CUBLASLT_EPILOGUE_DRELU_BGRAD: cublasLtEpilogue_t = cublasLtEpilogue_t(\n        152,\n    );\n}\nimpl cublasLtEpilogue_t {\n    /// GELU, apply GELU point-wise transform to the results (x:=GELU(x)).\n    pub const CUBLASLT_EPILOGUE_GELU: cublasLtEpilogue_t = cublasLtEpilogue_t(32);\n}\nimpl cublasLtEpilogue_t {\n    /** GELU, apply GELU point-wise transform to the results (x:=GELU(x)).\n\n This epilogue mode outputs GELU input as a separate matrix (useful for training).\n See CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_POINTER.*/\n    pub const CUBLASLT_EPILOGUE_GELU_AUX: cublasLtEpilogue_t = cublasLtEpilogue_t(160);\n}\nimpl cublasLtEpilogue_t {\n    /// GELU and Bias, apply Bias and then GELU transform\n    pub const CUBLASLT_EPILOGUE_GELU_BIAS: cublasLtEpilogue_t = cublasLtEpilogue_t(36);\n}\nimpl cublasLtEpilogue_t {\n    /** GELU and Bias, apply Bias and then GELU transform\n\n This epilogue mode outputs GELU input as a separate matrix (useful for training).\n See CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_POINTER.*/\n    pub const CUBLASLT_EPILOGUE_GELU_AUX_BIAS: cublasLtEpilogue_t = cublasLtEpilogue_t(\n        164,\n    );\n}\nimpl cublasLtEpilogue_t {\n    /** GELU and Bias, apply Bias and then GELU transform\n\n This epilogue mode outputs GELU input as a separate matrix (useful for training).\n See CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_POINTER.*/\n    pub const CUBLASLT_EPILOGUE_DGELU: cublasLtEpilogue_t = cublasLtEpilogue_t(192);\n}\nimpl cublasLtEpilogue_t {\n    /** GELU and Bias, apply Bias and then GELU transform\n\n This epilogue mode outputs GELU input as a separate matrix (useful for training).\n See CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_POINTER.*/\n    pub const CUBLASLT_EPILOGUE_DGELU_BGRAD: cublasLtEpilogue_t = cublasLtEpilogue_t(\n        208,\n    );\n}\nimpl cublasLtEpilogue_t {\n    /** Bias gradient based on the input matrix A.\n\n The bias size corresponds to the number of rows of the matrix D.\n The reduction happens over the GEMM's \"k\" dimension.\n\n Stores Bias gradient in the auxiliary output\n (see CUBLASLT_MATMUL_DESC_BIAS_POINTER).*/\n    pub const CUBLASLT_EPILOGUE_BGRADA: cublasLtEpilogue_t = cublasLtEpilogue_t(256);\n}\nimpl cublasLtEpilogue_t {\n    /** Bias gradient based on the input matrix B.\n\n The bias size corresponds to the number of columns of the matrix D.\n The reduction happens over the GEMM's \"k\" dimension.\n\n Stores Bias gradient in the auxiliary output\n (see CUBLASLT_MATMUL_DESC_BIAS_POINTER).*/\n    pub const CUBLASLT_EPILOGUE_BGRADB: cublasLtEpilogue_t = cublasLtEpilogue_t(512);\n}\n#[repr(transparent)]\n/// Postprocessing options for the epilogue\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasLtEpilogue_t(pub ::core::ffi::c_uint);\nimpl cublasLtMatmulSearch_t {\n    /// ask heuristics for best algo for given usecase\n    pub const CUBLASLT_SEARCH_BEST_FIT: cublasLtMatmulSearch_t = cublasLtMatmulSearch_t(\n        0,\n    );\n}\nimpl cublasLtMatmulSearch_t {\n    /// only try to find best config for preconfigured algo id\n    pub const CUBLASLT_SEARCH_LIMITED_BY_ALGO_ID: cublasLtMatmulSearch_t = cublasLtMatmulSearch_t(\n        1,\n    );\n}\nimpl cublasLtMatmulSearch_t {\n    /// reserved for future use\n    pub const CUBLASLT_SEARCH_RESERVED_02: cublasLtMatmulSearch_t = cublasLtMatmulSearch_t(\n        2,\n    );\n}\nimpl cublasLtMatmulSearch_t {\n    /// reserved for future use\n    pub const CUBLASLT_SEARCH_RESERVED_03: cublasLtMatmulSearch_t = cublasLtMatmulSearch_t(\n        3,\n    );\n}\nimpl cublasLtMatmulSearch_t {\n    /// reserved for future use\n    pub const CUBLASLT_SEARCH_RESERVED_04: cublasLtMatmulSearch_t = cublasLtMatmulSearch_t(\n        4,\n    );\n}\nimpl cublasLtMatmulSearch_t {\n    /// reserved for future use\n    pub const CUBLASLT_SEARCH_RESERVED_05: cublasLtMatmulSearch_t = cublasLtMatmulSearch_t(\n        5,\n    );\n}\nimpl cublasLtMatmulSearch_t {\n    /// reserved for future use\n    pub const CUBLASLT_SEARCH_RESERVED_06: cublasLtMatmulSearch_t = cublasLtMatmulSearch_t(\n        6,\n    );\n}\nimpl cublasLtMatmulSearch_t {\n    /// reserved for future use\n    pub const CUBLASLT_SEARCH_RESERVED_07: cublasLtMatmulSearch_t = cublasLtMatmulSearch_t(\n        7,\n    );\n}\nimpl cublasLtMatmulSearch_t {\n    /// reserved for future use\n    pub const CUBLASLT_SEARCH_RESERVED_08: cublasLtMatmulSearch_t = cublasLtMatmulSearch_t(\n        8,\n    );\n}\nimpl cublasLtMatmulSearch_t {\n    /// reserved for future use\n    pub const CUBLASLT_SEARCH_RESERVED_09: cublasLtMatmulSearch_t = cublasLtMatmulSearch_t(\n        9,\n    );\n}\n#[repr(transparent)]\n/// Matmul heuristic search mode\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasLtMatmulSearch_t(pub ::core::ffi::c_uint);\nimpl cublasLtMatmulPreferenceAttributes_t {\n    /** Search mode, see cublasLtMatmulSearch_t.\n\n uint32_t, default: CUBLASLT_SEARCH_BEST_FIT*/\n    pub const CUBLASLT_MATMUL_PREF_SEARCH_MODE: cublasLtMatmulPreferenceAttributes_t = cublasLtMatmulPreferenceAttributes_t(\n        0,\n    );\n}\nimpl cublasLtMatmulPreferenceAttributes_t {\n    /** Maximum allowed workspace size in bytes.\n\n uint64_t, default: 0 - no workspace allowed*/\n    pub const CUBLASLT_MATMUL_PREF_MAX_WORKSPACE_BYTES: cublasLtMatmulPreferenceAttributes_t = cublasLtMatmulPreferenceAttributes_t(\n        1,\n    );\n}\nimpl cublasLtMatmulPreferenceAttributes_t {\n    /** Reduction scheme mask, see cublasLtReductionScheme_t. Filters heuristic result to only include algo configs that\n use one of the required modes.\n\n E.g. mask value of 0x03 will allow only INPLACE and COMPUTE_TYPE reduction schemes.\n\n uint32_t, default: CUBLASLT_REDUCTION_SCHEME_MASK (allows all reduction schemes)*/\n    pub const CUBLASLT_MATMUL_PREF_REDUCTION_SCHEME_MASK: cublasLtMatmulPreferenceAttributes_t = cublasLtMatmulPreferenceAttributes_t(\n        3,\n    );\n}\nimpl cublasLtMatmulPreferenceAttributes_t {\n    /** Minimum buffer alignment for matrix A (in bytes).\n\n Selecting a smaller value will exclude algorithms that can not work with matrix A that is not as strictly aligned\n as they need.\n\n uint32_t, default: 256*/\n    pub const CUBLASLT_MATMUL_PREF_MIN_ALIGNMENT_A_BYTES: cublasLtMatmulPreferenceAttributes_t = cublasLtMatmulPreferenceAttributes_t(\n        5,\n    );\n}\nimpl cublasLtMatmulPreferenceAttributes_t {\n    /** Minimum buffer alignment for matrix B (in bytes).\n\n Selecting a smaller value will exclude algorithms that can not work with matrix B that is not as strictly aligned\n as they need.\n\n uint32_t, default: 256*/\n    pub const CUBLASLT_MATMUL_PREF_MIN_ALIGNMENT_B_BYTES: cublasLtMatmulPreferenceAttributes_t = cublasLtMatmulPreferenceAttributes_t(\n        6,\n    );\n}\nimpl cublasLtMatmulPreferenceAttributes_t {\n    /** Minimum buffer alignment for matrix C (in bytes).\n\n Selecting a smaller value will exclude algorithms that can not work with matrix C that is not as strictly aligned\n as they need.\n\n uint32_t, default: 256*/\n    pub const CUBLASLT_MATMUL_PREF_MIN_ALIGNMENT_C_BYTES: cublasLtMatmulPreferenceAttributes_t = cublasLtMatmulPreferenceAttributes_t(\n        7,\n    );\n}\nimpl cublasLtMatmulPreferenceAttributes_t {\n    /** Minimum buffer alignment for matrix D (in bytes).\n\n Selecting a smaller value will exclude algorithms that can not work with matrix D that is not as strictly aligned\n as they need.\n\n uint32_t, default: 256*/\n    pub const CUBLASLT_MATMUL_PREF_MIN_ALIGNMENT_D_BYTES: cublasLtMatmulPreferenceAttributes_t = cublasLtMatmulPreferenceAttributes_t(\n        8,\n    );\n}\nimpl cublasLtMatmulPreferenceAttributes_t {\n    /** Maximum wave count.\n\n See cublasLtMatmulHeuristicResult_t::wavesCount.\n\n Selecting a non-zero value will exclude algorithms that report device utilization higher than specified.\n\n float, default: 0.0f*/\n    pub const CUBLASLT_MATMUL_PREF_MAX_WAVES_COUNT: cublasLtMatmulPreferenceAttributes_t = cublasLtMatmulPreferenceAttributes_t(\n        9,\n    );\n}\nimpl cublasLtMatmulPreferenceAttributes_t {\n    /** Numerical implementation details mask, see cublasLtNumericalImplFlags_t. Filters heuristic result to only include\n algorithms that use the allowed implementations.\n\n uint64_t, default: uint64_t(-1) (allow everything)*/\n    pub const CUBLASLT_MATMUL_PREF_IMPL_MASK: cublasLtMatmulPreferenceAttributes_t = cublasLtMatmulPreferenceAttributes_t(\n        12,\n    );\n}\n#[repr(transparent)]\n/// Algo search preference to fine tune the heuristic function.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasLtMatmulPreferenceAttributes_t(pub ::core::ffi::c_uint);\n/** Results structure used by cublasLtMatmulAlgoGetHeuristic\n\n Holds returned configured algo descriptor and its runtime properties.*/\n#[repr(C)]\npub struct cublasLtMatmulHeuristicResult_t {\n    /** Matmul algorithm descriptor.\n\n Must be initialized with cublasLtMatmulAlgoInit() if preferences' CUBLASLT_MATMUL_PERF_SEARCH_MODE is set to\n CUBLASLT_SEARCH_LIMITED_BY_ALGO_ID*/\n    pub algo: cublasLtMatmulAlgo_t,\n    /// Actual size of workspace memory required.\n    pub workspaceSize: usize,\n    /** Result status, other fields are only valid if after call to cublasLtMatmulAlgoGetHeuristic() this member is set to\n CUBLAS_STATUS_SUCCESS.*/\n    pub state: super::cublas::cublasStatus_t,\n    /** Waves count - a device utilization metric.\n\n wavesCount value of 1.0f suggests that when kernel is launched it will fully occupy the GPU.*/\n    pub wavesCount: f32,\n    pub reserved: [::core::ffi::c_int; 4usize],\n}\nimpl cublasLtMatmulAlgoCapAttributes_t {\n    /** support for split K, see CUBLASLT_ALGO_CONFIG_SPLITK_NUM\n\n int32_t, 0 means no support, supported otherwise*/\n    pub const CUBLASLT_ALGO_CAP_SPLITK_SUPPORT: cublasLtMatmulAlgoCapAttributes_t = cublasLtMatmulAlgoCapAttributes_t(\n        0,\n    );\n}\nimpl cublasLtMatmulAlgoCapAttributes_t {\n    /** reduction scheme mask, see cublasLtReductionScheme_t; shows supported reduction schemes, if reduction scheme is\n not masked out it is supported.\n\n e.g. int isReductionSchemeComputeTypeSupported ? (reductionSchemeMask & CUBLASLT_REDUCTION_SCHEME_COMPUTE_TYPE) ==\n CUBLASLT_REDUCTION_SCHEME_COMPUTE_TYPE ? 1 : 0;\n\n uint32_t*/\n    pub const CUBLASLT_ALGO_CAP_REDUCTION_SCHEME_MASK: cublasLtMatmulAlgoCapAttributes_t = cublasLtMatmulAlgoCapAttributes_t(\n        1,\n    );\n}\nimpl cublasLtMatmulAlgoCapAttributes_t {\n    /** support for cta swizzling, see CUBLASLT_ALGO_CONFIG_CTA_SWIZZLING\n\n uint32_t, 0 means no support, 1 means supported value of 1, other values are reserved*/\n    pub const CUBLASLT_ALGO_CAP_CTA_SWIZZLING_SUPPORT: cublasLtMatmulAlgoCapAttributes_t = cublasLtMatmulAlgoCapAttributes_t(\n        2,\n    );\n}\nimpl cublasLtMatmulAlgoCapAttributes_t {\n    /** support strided batch\n\n int32_t, 0 means no support, supported otherwise*/\n    pub const CUBLASLT_ALGO_CAP_STRIDED_BATCH_SUPPORT: cublasLtMatmulAlgoCapAttributes_t = cublasLtMatmulAlgoCapAttributes_t(\n        3,\n    );\n}\nimpl cublasLtMatmulAlgoCapAttributes_t {\n    /** support results out of place (D != C in D = alpha.A.B + beta.C)\n\n int32_t, 0 means no support, supported otherwise*/\n    pub const CUBLASLT_ALGO_CAP_OUT_OF_PLACE_RESULT_SUPPORT: cublasLtMatmulAlgoCapAttributes_t = cublasLtMatmulAlgoCapAttributes_t(\n        4,\n    );\n}\nimpl cublasLtMatmulAlgoCapAttributes_t {\n    /** syrk/herk support (on top of regular gemm)\n\n int32_t, 0 means no support, supported otherwise*/\n    pub const CUBLASLT_ALGO_CAP_UPLO_SUPPORT: cublasLtMatmulAlgoCapAttributes_t = cublasLtMatmulAlgoCapAttributes_t(\n        5,\n    );\n}\nimpl cublasLtMatmulAlgoCapAttributes_t {\n    /** tile ids possible to use, see cublasLtMatmulTile_t; if no tile ids are supported use\n CUBLASLT_MATMUL_TILE_UNDEFINED\n\n use cublasLtMatmulAlgoCapGetAttribute() with sizeInBytes=0 to query actual count\n\n array of uint32_t*/\n    pub const CUBLASLT_ALGO_CAP_TILE_IDS: cublasLtMatmulAlgoCapAttributes_t = cublasLtMatmulAlgoCapAttributes_t(\n        6,\n    );\n}\nimpl cublasLtMatmulAlgoCapAttributes_t {\n    /** custom option range is from 0 to CUBLASLT_ALGO_CAP_CUSTOM_OPTION_MAX (inclusive), see\n CUBLASLT_ALGO_CONFIG_CUSTOM_OPTION\n\n int32_t*/\n    pub const CUBLASLT_ALGO_CAP_CUSTOM_OPTION_MAX: cublasLtMatmulAlgoCapAttributes_t = cublasLtMatmulAlgoCapAttributes_t(\n        7,\n    );\n}\nimpl cublasLtMatmulAlgoCapAttributes_t {\n    /** describes if the algorithm supports custom (not COL or ROW memory order), see cublasLtOrder_t\n\n int32_t 0 means only COL and ROW memory order is allowed, non-zero means that algo might have different\n requirements;*/\n    pub const CUBLASLT_ALGO_CAP_CUSTOM_MEMORY_ORDER: cublasLtMatmulAlgoCapAttributes_t = cublasLtMatmulAlgoCapAttributes_t(\n        10,\n    );\n}\nimpl cublasLtMatmulAlgoCapAttributes_t {\n    /** bitmask enumerating pointer modes algorithm supports\n\n uint32_t, see cublasLtPointerModeMask_t*/\n    pub const CUBLASLT_ALGO_CAP_POINTER_MODE_MASK: cublasLtMatmulAlgoCapAttributes_t = cublasLtMatmulAlgoCapAttributes_t(\n        11,\n    );\n}\nimpl cublasLtMatmulAlgoCapAttributes_t {\n    /** bitmask enumerating kinds of postprocessing algorithm supports in the epilogue\n\n uint32_t, see cublasLtEpilogue_t*/\n    pub const CUBLASLT_ALGO_CAP_EPILOGUE_MASK: cublasLtMatmulAlgoCapAttributes_t = cublasLtMatmulAlgoCapAttributes_t(\n        12,\n    );\n}\nimpl cublasLtMatmulAlgoCapAttributes_t {\n    /** stages ids possible to use, see cublasLtMatmulStages_t; if no stages ids are supported use\n CUBLASLT_MATMUL_STAGES_UNDEFINED\n\n use cublasLtMatmulAlgoCapGetAttribute() with sizeInBytes=0 to query actual count\n\n array of uint32_t*/\n    pub const CUBLASLT_ALGO_CAP_STAGES_IDS: cublasLtMatmulAlgoCapAttributes_t = cublasLtMatmulAlgoCapAttributes_t(\n        13,\n    );\n}\nimpl cublasLtMatmulAlgoCapAttributes_t {\n    /** support for nagative ld for all of the matrices\n\n int32_t 0 means no support, supported otherwise*/\n    pub const CUBLASLT_ALGO_CAP_LD_NEGATIVE: cublasLtMatmulAlgoCapAttributes_t = cublasLtMatmulAlgoCapAttributes_t(\n        14,\n    );\n}\nimpl cublasLtMatmulAlgoCapAttributes_t {\n    /** details about algorithm's implementation that affect it's numerical behavior\n\n uint64_t, see cublasLtNumericalImplFlags_t*/\n    pub const CUBLASLT_ALGO_CAP_NUMERICAL_IMPL_FLAGS: cublasLtMatmulAlgoCapAttributes_t = cublasLtMatmulAlgoCapAttributes_t(\n        15,\n    );\n}\nimpl cublasLtMatmulAlgoCapAttributes_t {\n    /** minimum alignment required for A matrix in bytes\n  (required for buffer pointer, leading dimension, and possibly other strides defined for matrix memory order)\n\n uint32_t*/\n    pub const CUBLASLT_ALGO_CAP_MIN_ALIGNMENT_A_BYTES: cublasLtMatmulAlgoCapAttributes_t = cublasLtMatmulAlgoCapAttributes_t(\n        16,\n    );\n}\nimpl cublasLtMatmulAlgoCapAttributes_t {\n    /** minimum alignment required for B matrix in bytes\n  (required for buffer pointer, leading dimension, and possibly other strides defined for matrix memory order)\n\n uint32_t*/\n    pub const CUBLASLT_ALGO_CAP_MIN_ALIGNMENT_B_BYTES: cublasLtMatmulAlgoCapAttributes_t = cublasLtMatmulAlgoCapAttributes_t(\n        17,\n    );\n}\nimpl cublasLtMatmulAlgoCapAttributes_t {\n    /** minimum alignment required for C matrix in bytes\n  (required for buffer pointer, leading dimension, and possibly other strides defined for matrix memory order)\n\n uint32_t*/\n    pub const CUBLASLT_ALGO_CAP_MIN_ALIGNMENT_C_BYTES: cublasLtMatmulAlgoCapAttributes_t = cublasLtMatmulAlgoCapAttributes_t(\n        18,\n    );\n}\nimpl cublasLtMatmulAlgoCapAttributes_t {\n    /** minimum alignment required for D matrix in bytes\n  (required for buffer pointer, leading dimension, and possibly other strides defined for matrix memory order)\n\n uint32_t*/\n    pub const CUBLASLT_ALGO_CAP_MIN_ALIGNMENT_D_BYTES: cublasLtMatmulAlgoCapAttributes_t = cublasLtMatmulAlgoCapAttributes_t(\n        19,\n    );\n}\nimpl cublasLtMatmulAlgoCapAttributes_t {\n    /** support pointer array batch\n\n int32_t, 0 means no support, supported otherwise*/\n    pub const CUBLASLT_ALGO_CAP_POINTER_ARRAY_BATCH_SUPPORT: cublasLtMatmulAlgoCapAttributes_t = cublasLtMatmulAlgoCapAttributes_t(\n        21,\n    );\n}\nimpl cublasLtMatmulAlgoCapAttributes_t {\n    /** describes if the algorithm supports floating point emulation\n\n int32_t*/\n    pub const CUBLASLT_ALGO_CAP_FLOATING_POINT_EMULATION_SUPPORT: cublasLtMatmulAlgoCapAttributes_t = cublasLtMatmulAlgoCapAttributes_t(\n        22,\n    );\n}\n#[repr(transparent)]\n/// Capabilities Attributes that can be retrieved from an initialized Algo structure\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasLtMatmulAlgoCapAttributes_t(pub ::core::ffi::c_uint);\nimpl cublasLtMatmulAlgoConfigAttributes_t {\n    /** algorithm index, see cublasLtMatmulAlgoGetIds()\n\n readonly, set by cublasLtMatmulAlgoInit()\n int32_t*/\n    pub const CUBLASLT_ALGO_CONFIG_ID: cublasLtMatmulAlgoConfigAttributes_t = cublasLtMatmulAlgoConfigAttributes_t(\n        0,\n    );\n}\nimpl cublasLtMatmulAlgoConfigAttributes_t {\n    /** tile id, see cublasLtMatmulTile_t\n\n uint32_t, default: CUBLASLT_MATMUL_TILE_UNDEFINED*/\n    pub const CUBLASLT_ALGO_CONFIG_TILE_ID: cublasLtMatmulAlgoConfigAttributes_t = cublasLtMatmulAlgoConfigAttributes_t(\n        1,\n    );\n}\nimpl cublasLtMatmulAlgoConfigAttributes_t {\n    /** Number of K splits. If the number of K splits is greater than one, SPLITK_NUM parts\n of matrix multiplication will be computed in parallel. The results will be accumulated\n according to CUBLASLT_ALGO_CONFIG_REDUCTION_SCHEME\n\n int32_t, default: 1*/\n    pub const CUBLASLT_ALGO_CONFIG_SPLITK_NUM: cublasLtMatmulAlgoConfigAttributes_t = cublasLtMatmulAlgoConfigAttributes_t(\n        2,\n    );\n}\nimpl cublasLtMatmulAlgoConfigAttributes_t {\n    /** reduction scheme, see cublasLtReductionScheme_t\n\n uint32_t, default: CUBLASLT_REDUCTION_SCHEME_NONE*/\n    pub const CUBLASLT_ALGO_CONFIG_REDUCTION_SCHEME: cublasLtMatmulAlgoConfigAttributes_t = cublasLtMatmulAlgoConfigAttributes_t(\n        3,\n    );\n}\nimpl cublasLtMatmulAlgoConfigAttributes_t {\n    /** cta swizzling, change mapping from CUDA grid coordinates to parts of the matrices\n\n possible values: 0, 1, other values reserved\n\n uint32_t, default: 0*/\n    pub const CUBLASLT_ALGO_CONFIG_CTA_SWIZZLING: cublasLtMatmulAlgoConfigAttributes_t = cublasLtMatmulAlgoConfigAttributes_t(\n        4,\n    );\n}\nimpl cublasLtMatmulAlgoConfigAttributes_t {\n    /** custom option, each algorithm can support some custom options that don't fit description of the other config\n attributes, see CUBLASLT_ALGO_CAP_CUSTOM_OPTION_MAX to get accepted range for any specific case\n\n uint32_t, default: 0*/\n    pub const CUBLASLT_ALGO_CONFIG_CUSTOM_OPTION: cublasLtMatmulAlgoConfigAttributes_t = cublasLtMatmulAlgoConfigAttributes_t(\n        5,\n    );\n}\nimpl cublasLtMatmulAlgoConfigAttributes_t {\n    /** stages id, see cublasLtMatmulStages_t\n\n uint32_t, default: CUBLASLT_MATMUL_STAGES_UNDEFINED*/\n    pub const CUBLASLT_ALGO_CONFIG_STAGES_ID: cublasLtMatmulAlgoConfigAttributes_t = cublasLtMatmulAlgoConfigAttributes_t(\n        6,\n    );\n}\nimpl cublasLtMatmulAlgoConfigAttributes_t {\n    /** inner shape id, see cublasLtMatmulInnerShape_t\n\n uint16_t, default: 0 (CUBLASLT_MATMUL_INNER_SHAPE_UNDEFINED)*/\n    pub const CUBLASLT_ALGO_CONFIG_INNER_SHAPE_ID: cublasLtMatmulAlgoConfigAttributes_t = cublasLtMatmulAlgoConfigAttributes_t(\n        7,\n    );\n}\nimpl cublasLtMatmulAlgoConfigAttributes_t {\n    /** Thread Block Cluster shape id, see cublasLtClusterShape_t. Defines cluster size to use.\n\n uint16_t, default: 0 (CUBLASLT_CLUSTER_SHAPE_AUTO)*/\n    pub const CUBLASLT_ALGO_CONFIG_CLUSTER_SHAPE_ID: cublasLtMatmulAlgoConfigAttributes_t = cublasLtMatmulAlgoConfigAttributes_t(\n        8,\n    );\n}\n#[repr(transparent)]\n/// Algo Configuration Attributes that can be set according to the Algo capabilities\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cublasLtMatmulAlgoConfigAttributes_t(pub ::core::ffi::c_uint);\n/// Experimental: Logger callback type.\npub type cublasLtLoggerCallback_t = ::core::option::Option<\n    unsafe extern \"C\" fn(\n        logLevel: ::core::ffi::c_int,\n        functionName: *const ::core::ffi::c_char,\n        message: *const ::core::ffi::c_char,\n    ),\n>;\n"
  },
  {
    "path": "cuda_types/src/cuda.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\npub const CUDA_VERSION: u32 = 13000;\npub const CU_IPC_HANDLE_SIZE: u32 = 64;\npub const CU_COMPUTE_ACCELERATED_TARGET_BASE: u32 = 65536;\npub const CU_COMPUTE_FAMILY_TARGET_BASE: u32 = 131072;\npub const CU_GRAPH_COND_ASSIGN_DEFAULT: u32 = 1;\npub const CU_GRAPH_KERNEL_NODE_PORT_DEFAULT: u32 = 0;\npub const CU_GRAPH_KERNEL_NODE_PORT_PROGRAMMATIC: u32 = 1;\npub const CU_GRAPH_KERNEL_NODE_PORT_LAUNCH_ORDER: u32 = 2;\npub const CU_MEMHOSTALLOC_PORTABLE: u32 = 1;\npub const CU_MEMHOSTALLOC_DEVICEMAP: u32 = 2;\npub const CU_MEMHOSTALLOC_WRITECOMBINED: u32 = 4;\npub const CU_MEMHOSTREGISTER_PORTABLE: u32 = 1;\npub const CU_MEMHOSTREGISTER_DEVICEMAP: u32 = 2;\npub const CU_MEMHOSTREGISTER_IOMEMORY: u32 = 4;\npub const CU_MEMHOSTREGISTER_READ_ONLY: u32 = 8;\npub const CU_ARRAY_SPARSE_PROPERTIES_SINGLE_MIPTAIL: u32 = 1;\npub const CU_TENSOR_MAP_NUM_QWORDS: u32 = 16;\npub const CUDA_EXTERNAL_MEMORY_DEDICATED: u32 = 1;\npub const CUDA_EXTERNAL_SEMAPHORE_SIGNAL_SKIP_NVSCIBUF_MEMSYNC: u32 = 1;\npub const CUDA_EXTERNAL_SEMAPHORE_WAIT_SKIP_NVSCIBUF_MEMSYNC: u32 = 2;\npub const CUDA_NVSCISYNC_ATTR_SIGNAL: u32 = 1;\npub const CUDA_NVSCISYNC_ATTR_WAIT: u32 = 2;\npub const CU_MEM_CREATE_USAGE_TILE_POOL: u32 = 1;\npub const CU_MEM_CREATE_USAGE_HW_DECOMPRESS: u32 = 2;\npub const CU_MEM_POOL_CREATE_USAGE_HW_DECOMPRESS: u32 = 2;\npub const CUDA_COOPERATIVE_LAUNCH_MULTI_DEVICE_NO_PRE_LAUNCH_SYNC: u32 = 1;\npub const CUDA_COOPERATIVE_LAUNCH_MULTI_DEVICE_NO_POST_LAUNCH_SYNC: u32 = 2;\npub const CUDA_ARRAY3D_LAYERED: u32 = 1;\npub const CUDA_ARRAY3D_2DARRAY: u32 = 1;\npub const CUDA_ARRAY3D_SURFACE_LDST: u32 = 2;\npub const CUDA_ARRAY3D_CUBEMAP: u32 = 4;\npub const CUDA_ARRAY3D_TEXTURE_GATHER: u32 = 8;\npub const CUDA_ARRAY3D_DEPTH_TEXTURE: u32 = 16;\npub const CUDA_ARRAY3D_COLOR_ATTACHMENT: u32 = 32;\npub const CUDA_ARRAY3D_SPARSE: u32 = 64;\npub const CUDA_ARRAY3D_DEFERRED_MAPPING: u32 = 128;\npub const CUDA_ARRAY3D_VIDEO_ENCODE_DECODE: u32 = 256;\npub const CU_TRSA_OVERRIDE_FORMAT: u32 = 1;\npub const CU_TRSF_READ_AS_INTEGER: u32 = 1;\npub const CU_TRSF_NORMALIZED_COORDINATES: u32 = 2;\npub const CU_TRSF_SRGB: u32 = 16;\npub const CU_TRSF_DISABLE_TRILINEAR_OPTIMIZATION: u32 = 32;\npub const CU_TRSF_SEAMLESS_CUBEMAP: u32 = 64;\npub const CU_LAUNCH_KERNEL_REQUIRED_BLOCK_DIM: u32 = 1;\npub const CU_LAUNCH_PARAM_END_AS_INT: u32 = 0;\npub const CU_LAUNCH_PARAM_BUFFER_POINTER_AS_INT: u32 = 1;\npub const CU_LAUNCH_PARAM_BUFFER_SIZE_AS_INT: u32 = 2;\npub const CU_PARAM_TR_DEFAULT: i32 = -1;\npub const CUDA_EGL_INFINITE_TIMEOUT: u32 = 4294967295;\npub type cuuint32_t = u32;\npub type cuuint64_t = u64;\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUdeviceptr_v2(pub *mut ::core::ffi::c_void);\npub type CUdeviceptr = CUdeviceptr_v2;\npub type CUdevice_v1 = ::core::ffi::c_int;\npub type CUdevice = CUdevice_v1;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct CUctx_st {\n    _unused: [u8; 0],\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUcontext(pub *mut CUctx_st);\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct CUmod_st {\n    _unused: [u8; 0],\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmodule(pub *mut CUmod_st);\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct CUfunc_st {\n    _unused: [u8; 0],\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUfunction(pub *mut CUfunc_st);\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct CUlib_st {\n    _unused: [u8; 0],\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUlibrary(pub *mut CUlib_st);\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct CUkern_st {\n    _unused: [u8; 0],\n}\npub type CUkernel = *mut CUkern_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct CUarray_st {\n    _unused: [u8; 0],\n}\npub type CUarray = *mut CUarray_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct CUmipmappedArray_st {\n    _unused: [u8; 0],\n}\npub type CUmipmappedArray = *mut CUmipmappedArray_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct CUtexref_st {\n    _unused: [u8; 0],\n}\npub type CUtexref = *mut CUtexref_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct CUsurfref_st {\n    _unused: [u8; 0],\n}\npub type CUsurfref = *mut CUsurfref_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct CUevent_st {\n    _unused: [u8; 0],\n}\npub type CUevent = *mut CUevent_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct CUstream_st {\n    _unused: [u8; 0],\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUstream(pub *mut CUstream_st);\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct CUgraphicsResource_st {\n    _unused: [u8; 0],\n}\npub type CUgraphicsResource = *mut CUgraphicsResource_st;\npub type CUtexObject_v1 = ::core::ffi::c_ulonglong;\npub type CUtexObject = CUtexObject_v1;\npub type CUsurfObject_v1 = ::core::ffi::c_ulonglong;\npub type CUsurfObject = CUsurfObject_v1;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct CUextMemory_st {\n    _unused: [u8; 0],\n}\npub type CUexternalMemory = *mut CUextMemory_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct CUextSemaphore_st {\n    _unused: [u8; 0],\n}\npub type CUexternalSemaphore = *mut CUextSemaphore_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct CUgraph_st {\n    _unused: [u8; 0],\n}\npub type CUgraph = *mut CUgraph_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct CUgraphNode_st {\n    _unused: [u8; 0],\n}\npub type CUgraphNode = *mut CUgraphNode_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct CUgraphExec_st {\n    _unused: [u8; 0],\n}\npub type CUgraphExec = *mut CUgraphExec_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct CUmemPoolHandle_st {\n    _unused: [u8; 0],\n}\npub type CUmemoryPool = *mut CUmemPoolHandle_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct CUuserObject_st {\n    _unused: [u8; 0],\n}\npub type CUuserObject = *mut CUuserObject_st;\npub type CUgraphConditionalHandle = cuuint64_t;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct CUgraphDeviceUpdatableNode_st {\n    _unused: [u8; 0],\n}\npub type CUgraphDeviceNode = *mut CUgraphDeviceUpdatableNode_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct CUasyncCallbackEntry_st {\n    _unused: [u8; 0],\n}\npub type CUasyncCallbackHandle = *mut CUasyncCallbackEntry_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct CUgreenCtx_st {\n    _unused: [u8; 0],\n}\n/** \\typedef typedef struct CUgreenCtx_st* CUgreenCtx\n A green context handle. This handle can be used safely from only one CPU thread at a time.\n Created via ::cuGreenCtxCreate*/\npub type CUgreenCtx = *mut CUgreenCtx_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUuuid_st {\n    pub bytes: [::core::ffi::c_uchar; 16usize],\n}\npub type CUuuid = CUuuid_st;\n/** Fabric handle - An opaque handle representing a memory allocation\n that can be exported to processes in same or different nodes. For IPC\n between processes on different nodes they must be connected via the\n NVSwitch fabric.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmemFabricHandle_st {\n    pub data: [::core::ffi::c_uchar; 64usize],\n}\n/** Fabric handle - An opaque handle representing a memory allocation\n that can be exported to processes in same or different nodes. For IPC\n between processes on different nodes they must be connected via the\n NVSwitch fabric.*/\npub type CUmemFabricHandle_v1 = CUmemFabricHandle_st;\n/** Fabric handle - An opaque handle representing a memory allocation\n that can be exported to processes in same or different nodes. For IPC\n between processes on different nodes they must be connected via the\n NVSwitch fabric.*/\npub type CUmemFabricHandle = CUmemFabricHandle_v1;\n/// CUDA IPC event handle\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUipcEventHandle_st {\n    pub reserved: [::core::ffi::c_char; 64usize],\n}\n/// CUDA IPC event handle\npub type CUipcEventHandle_v1 = CUipcEventHandle_st;\n/// CUDA IPC event handle\npub type CUipcEventHandle = CUipcEventHandle_v1;\n/// CUDA IPC mem handle\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUipcMemHandle_st {\n    pub reserved: [::core::ffi::c_char; 64usize],\n}\n/// CUDA IPC mem handle\npub type CUipcMemHandle_v1 = CUipcMemHandle_st;\n/// CUDA IPC mem handle\npub type CUipcMemHandle = CUipcMemHandle_v1;\nimpl CUipcMem_flags_enum {\n    ///< Automatically enable peer access between remote devices as needed\n    pub const CU_IPC_MEM_LAZY_ENABLE_PEER_ACCESS: CUipcMem_flags_enum = CUipcMem_flags_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n/// CUDA Ipc Mem Flags\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUipcMem_flags_enum(pub ::core::ffi::c_uint);\n/// CUDA Ipc Mem Flags\npub use self::CUipcMem_flags_enum as CUipcMem_flags;\nimpl CUmemAttach_flags_enum {\n    ///< Memory can be accessed by any stream on any device\n    pub const CU_MEM_ATTACH_GLOBAL: CUmemAttach_flags_enum = CUmemAttach_flags_enum(1);\n}\nimpl CUmemAttach_flags_enum {\n    ///< Memory cannot be accessed by any stream on any device\n    pub const CU_MEM_ATTACH_HOST: CUmemAttach_flags_enum = CUmemAttach_flags_enum(2);\n}\nimpl CUmemAttach_flags_enum {\n    ///< Memory can only be accessed by a single stream on the associated device\n    pub const CU_MEM_ATTACH_SINGLE: CUmemAttach_flags_enum = CUmemAttach_flags_enum(4);\n}\n#[repr(transparent)]\n/// CUDA Mem Attach Flags\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmemAttach_flags_enum(pub ::core::ffi::c_uint);\n/// CUDA Mem Attach Flags\npub use self::CUmemAttach_flags_enum as CUmemAttach_flags;\nimpl CUctx_flags_enum {\n    ///< Automatic scheduling\n    pub const CU_CTX_SCHED_AUTO: CUctx_flags_enum = CUctx_flags_enum(0);\n}\nimpl CUctx_flags_enum {\n    ///< Set spin as default scheduling\n    pub const CU_CTX_SCHED_SPIN: CUctx_flags_enum = CUctx_flags_enum(1);\n}\nimpl CUctx_flags_enum {\n    ///< Set yield as default scheduling\n    pub const CU_CTX_SCHED_YIELD: CUctx_flags_enum = CUctx_flags_enum(2);\n}\nimpl CUctx_flags_enum {\n    ///< Set blocking synchronization as default scheduling\n    pub const CU_CTX_SCHED_BLOCKING_SYNC: CUctx_flags_enum = CUctx_flags_enum(4);\n}\nimpl CUctx_flags_enum {\n    /**< Set blocking synchronization as default scheduling\n  \\deprecated This flag was deprecated as of CUDA 4.0\n  and was replaced with ::CU_CTX_SCHED_BLOCKING_SYNC.*/\n    pub const CU_CTX_BLOCKING_SYNC: CUctx_flags_enum = CUctx_flags_enum(4);\n}\nimpl CUctx_flags_enum {\n    pub const CU_CTX_SCHED_MASK: CUctx_flags_enum = CUctx_flags_enum(7);\n}\nimpl CUctx_flags_enum {\n    /**< \\deprecated This flag was deprecated as of CUDA 11.0\n  and it no longer has any effect. All contexts\n  as of CUDA 3.2 behave as though the flag is enabled.*/\n    pub const CU_CTX_MAP_HOST: CUctx_flags_enum = CUctx_flags_enum(8);\n}\nimpl CUctx_flags_enum {\n    ///< Keep local memory allocation after launch\n    pub const CU_CTX_LMEM_RESIZE_TO_MAX: CUctx_flags_enum = CUctx_flags_enum(16);\n}\nimpl CUctx_flags_enum {\n    ///< Trigger coredumps from exceptions in this context\n    pub const CU_CTX_COREDUMP_ENABLE: CUctx_flags_enum = CUctx_flags_enum(32);\n}\nimpl CUctx_flags_enum {\n    ///< Enable user pipe to trigger coredumps in this context\n    pub const CU_CTX_USER_COREDUMP_ENABLE: CUctx_flags_enum = CUctx_flags_enum(64);\n}\nimpl CUctx_flags_enum {\n    ///< Ensure synchronous memory operations on this context will synchronize\n    pub const CU_CTX_SYNC_MEMOPS: CUctx_flags_enum = CUctx_flags_enum(128);\n}\nimpl CUctx_flags_enum {\n    pub const CU_CTX_FLAGS_MASK: CUctx_flags_enum = CUctx_flags_enum(255);\n}\n#[repr(transparent)]\n/// Context creation flags\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUctx_flags_enum(pub ::core::ffi::c_uint);\n/// Context creation flags\npub use self::CUctx_flags_enum as CUctx_flags;\nimpl CUevent_sched_flags_enum {\n    ///< Automatic scheduling\n    pub const CU_EVENT_SCHED_AUTO: CUevent_sched_flags_enum = CUevent_sched_flags_enum(\n        0,\n    );\n}\nimpl CUevent_sched_flags_enum {\n    ///< Set spin as default scheduling\n    pub const CU_EVENT_SCHED_SPIN: CUevent_sched_flags_enum = CUevent_sched_flags_enum(\n        1,\n    );\n}\nimpl CUevent_sched_flags_enum {\n    ///< Set yield as default scheduling\n    pub const CU_EVENT_SCHED_YIELD: CUevent_sched_flags_enum = CUevent_sched_flags_enum(\n        2,\n    );\n}\nimpl CUevent_sched_flags_enum {\n    ///< Set blocking synchronization as default scheduling\n    pub const CU_EVENT_SCHED_BLOCKING_SYNC: CUevent_sched_flags_enum = CUevent_sched_flags_enum(\n        4,\n    );\n}\n#[repr(transparent)]\n/// Event sched flags\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUevent_sched_flags_enum(pub ::core::ffi::c_uint);\n/// Event sched flags\npub use self::CUevent_sched_flags_enum as CUevent_sched_flags;\nimpl CUstream_flags_enum {\n    ///< Default stream flag\n    pub const CU_STREAM_DEFAULT: CUstream_flags_enum = CUstream_flags_enum(0);\n}\nimpl CUstream_flags_enum {\n    ///< Stream does not synchronize with stream 0 (the NULL stream)\n    pub const CU_STREAM_NON_BLOCKING: CUstream_flags_enum = CUstream_flags_enum(1);\n}\n#[repr(transparent)]\n/// Stream creation flags\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUstream_flags_enum(pub ::core::ffi::c_uint);\n/// Stream creation flags\npub use self::CUstream_flags_enum as CUstream_flags;\nimpl CUevent_flags_enum {\n    ///< Default event flag\n    pub const CU_EVENT_DEFAULT: CUevent_flags_enum = CUevent_flags_enum(0);\n}\nimpl CUevent_flags_enum {\n    ///< Event uses blocking synchronization\n    pub const CU_EVENT_BLOCKING_SYNC: CUevent_flags_enum = CUevent_flags_enum(1);\n}\nimpl CUevent_flags_enum {\n    ///< Event will not record timing data\n    pub const CU_EVENT_DISABLE_TIMING: CUevent_flags_enum = CUevent_flags_enum(2);\n}\nimpl CUevent_flags_enum {\n    ///< Event is suitable for interprocess use. CU_EVENT_DISABLE_TIMING must be set\n    pub const CU_EVENT_INTERPROCESS: CUevent_flags_enum = CUevent_flags_enum(4);\n}\n#[repr(transparent)]\n/// Event creation flags\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUevent_flags_enum(pub ::core::ffi::c_uint);\n/// Event creation flags\npub use self::CUevent_flags_enum as CUevent_flags;\nimpl CUevent_record_flags_enum {\n    ///< Default event record flag\n    pub const CU_EVENT_RECORD_DEFAULT: CUevent_record_flags_enum = CUevent_record_flags_enum(\n        0,\n    );\n}\nimpl CUevent_record_flags_enum {\n    /**< When using stream capture, create an event record node\n  instead of the default behavior.  This flag is invalid\n  when used outside of capture.*/\n    pub const CU_EVENT_RECORD_EXTERNAL: CUevent_record_flags_enum = CUevent_record_flags_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n/// Event record flags\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUevent_record_flags_enum(pub ::core::ffi::c_uint);\n/// Event record flags\npub use self::CUevent_record_flags_enum as CUevent_record_flags;\nimpl CUevent_wait_flags_enum {\n    ///< Default event wait flag\n    pub const CU_EVENT_WAIT_DEFAULT: CUevent_wait_flags_enum = CUevent_wait_flags_enum(\n        0,\n    );\n}\nimpl CUevent_wait_flags_enum {\n    /**< When using stream capture, create an event wait node\n  instead of the default behavior.  This flag is invalid\n  when used outside of capture.*/\n    pub const CU_EVENT_WAIT_EXTERNAL: CUevent_wait_flags_enum = CUevent_wait_flags_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n/// Event wait flags\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUevent_wait_flags_enum(pub ::core::ffi::c_uint);\n/// Event wait flags\npub use self::CUevent_wait_flags_enum as CUevent_wait_flags;\nimpl CUstreamWaitValue_flags_enum {\n    /**< Wait until (int32_t)(*addr - value) >= 0 (or int64_t for 64 bit\nvalues). Note this is a cyclic comparison which ignores wraparound.\n(Default behavior.)*/\n    pub const CU_STREAM_WAIT_VALUE_GEQ: CUstreamWaitValue_flags_enum = CUstreamWaitValue_flags_enum(\n        0,\n    );\n}\nimpl CUstreamWaitValue_flags_enum {\n    ///< Wait until *addr == value.\n    pub const CU_STREAM_WAIT_VALUE_EQ: CUstreamWaitValue_flags_enum = CUstreamWaitValue_flags_enum(\n        1,\n    );\n}\nimpl CUstreamWaitValue_flags_enum {\n    ///< Wait until (*addr & value) != 0.\n    pub const CU_STREAM_WAIT_VALUE_AND: CUstreamWaitValue_flags_enum = CUstreamWaitValue_flags_enum(\n        2,\n    );\n}\nimpl CUstreamWaitValue_flags_enum {\n    /**< Wait until ~(*addr | value) != 0. Support for this operation can be\nqueried with ::cuDeviceGetAttribute() and\n::CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_WAIT_VALUE_NOR.*/\n    pub const CU_STREAM_WAIT_VALUE_NOR: CUstreamWaitValue_flags_enum = CUstreamWaitValue_flags_enum(\n        3,\n    );\n}\nimpl CUstreamWaitValue_flags_enum {\n    /**< Follow the wait operation with a flush of outstanding remote writes. This\nmeans that, if a remote write operation is guaranteed to have reached the\ndevice before the wait can be satisfied, that write is guaranteed to be\nvisible to downstream device work. The device is permitted to reorder\nremote writes internally. For example, this flag would be required if\ntwo remote writes arrive in a defined order, the wait is satisfied by the\nsecond write, and downstream work needs to observe the first write.\nSupport for this operation is restricted to selected platforms and can be\nqueried with ::CU_DEVICE_ATTRIBUTE_CAN_FLUSH_REMOTE_WRITES.*/\n    pub const CU_STREAM_WAIT_VALUE_FLUSH: CUstreamWaitValue_flags_enum = CUstreamWaitValue_flags_enum(\n        1073741824,\n    );\n}\n#[repr(transparent)]\n/// Flags for ::cuStreamWaitValue32 and ::cuStreamWaitValue64\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUstreamWaitValue_flags_enum(pub ::core::ffi::c_uint);\n/// Flags for ::cuStreamWaitValue32 and ::cuStreamWaitValue64\npub use self::CUstreamWaitValue_flags_enum as CUstreamWaitValue_flags;\nimpl CUstreamWriteValue_flags_enum {\n    ///< Default behavior\n    pub const CU_STREAM_WRITE_VALUE_DEFAULT: CUstreamWriteValue_flags_enum = CUstreamWriteValue_flags_enum(\n        0,\n    );\n}\nimpl CUstreamWriteValue_flags_enum {\n    /**< Permits the write to be reordered with writes which were issued\nbefore it, as a performance optimization. Normally,\n::cuStreamWriteValue32 will provide a memory fence before the\nwrite, which has similar semantics to\n__threadfence_system() but is scoped to the stream\nrather than a CUDA thread.\nThis flag is not supported in the v2 API.*/\n    pub const CU_STREAM_WRITE_VALUE_NO_MEMORY_BARRIER: CUstreamWriteValue_flags_enum = CUstreamWriteValue_flags_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n/// Flags for ::cuStreamWriteValue32\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUstreamWriteValue_flags_enum(pub ::core::ffi::c_uint);\n/// Flags for ::cuStreamWriteValue32\npub use self::CUstreamWriteValue_flags_enum as CUstreamWriteValue_flags;\nimpl CUstreamBatchMemOpType_enum {\n    ///< Represents a ::cuStreamWaitValue32 operation\n    pub const CU_STREAM_MEM_OP_WAIT_VALUE_32: CUstreamBatchMemOpType_enum = CUstreamBatchMemOpType_enum(\n        1,\n    );\n}\nimpl CUstreamBatchMemOpType_enum {\n    ///< Represents a ::cuStreamWriteValue32 operation\n    pub const CU_STREAM_MEM_OP_WRITE_VALUE_32: CUstreamBatchMemOpType_enum = CUstreamBatchMemOpType_enum(\n        2,\n    );\n}\nimpl CUstreamBatchMemOpType_enum {\n    ///< Represents a ::cuStreamWaitValue64 operation\n    pub const CU_STREAM_MEM_OP_WAIT_VALUE_64: CUstreamBatchMemOpType_enum = CUstreamBatchMemOpType_enum(\n        4,\n    );\n}\nimpl CUstreamBatchMemOpType_enum {\n    ///< Represents a ::cuStreamWriteValue64 operation\n    pub const CU_STREAM_MEM_OP_WRITE_VALUE_64: CUstreamBatchMemOpType_enum = CUstreamBatchMemOpType_enum(\n        5,\n    );\n}\nimpl CUstreamBatchMemOpType_enum {\n    ///< Insert a memory barrier of the specified type\n    pub const CU_STREAM_MEM_OP_BARRIER: CUstreamBatchMemOpType_enum = CUstreamBatchMemOpType_enum(\n        6,\n    );\n}\nimpl CUstreamBatchMemOpType_enum {\n    /**< This has the same effect as ::CU_STREAM_WAIT_VALUE_FLUSH, but as a\nstandalone operation.*/\n    pub const CU_STREAM_MEM_OP_FLUSH_REMOTE_WRITES: CUstreamBatchMemOpType_enum = CUstreamBatchMemOpType_enum(\n        3,\n    );\n}\n#[repr(transparent)]\n/// Operations for ::cuStreamBatchMemOp\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUstreamBatchMemOpType_enum(pub ::core::ffi::c_uint);\n/// Operations for ::cuStreamBatchMemOp\npub use self::CUstreamBatchMemOpType_enum as CUstreamBatchMemOpType;\nimpl CUstreamMemoryBarrier_flags_enum {\n    ///< System-wide memory barrier.\n    pub const CU_STREAM_MEMORY_BARRIER_TYPE_SYS: CUstreamMemoryBarrier_flags_enum = CUstreamMemoryBarrier_flags_enum(\n        0,\n    );\n}\nimpl CUstreamMemoryBarrier_flags_enum {\n    ///< Limit memory barrier scope to the GPU.\n    pub const CU_STREAM_MEMORY_BARRIER_TYPE_GPU: CUstreamMemoryBarrier_flags_enum = CUstreamMemoryBarrier_flags_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n/// Flags for ::CUstreamBatchMemOpParams::memoryBarrier\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUstreamMemoryBarrier_flags_enum(pub ::core::ffi::c_uint);\n/// Flags for ::CUstreamBatchMemOpParams::memoryBarrier\npub use self::CUstreamMemoryBarrier_flags_enum as CUstreamMemoryBarrier_flags;\n/// Per-operation parameters for ::cuStreamBatchMemOp\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union CUstreamBatchMemOpParams_union {\n    ///< Operation. This is the first field of all the union elemets and acts as a TAG to determine which union member is valid.\n    pub operation: CUstreamBatchMemOpType,\n    ///< Params for ::CU_STREAM_MEM_OP_WAIT_VALUE_32 and ::CU_STREAM_MEM_OP_WAIT_VALUE_64 operations.\n    pub waitValue: CUstreamBatchMemOpParams_union_CUstreamMemOpWaitValueParams_st,\n    ///< Params for ::CU_STREAM_MEM_OP_WRITE_VALUE_32 and ::CU_STREAM_MEM_OP_WRITE_VALUE_64 operations.\n    pub writeValue: CUstreamBatchMemOpParams_union_CUstreamMemOpWriteValueParams_st,\n    ///< Params for ::CU_STREAM_MEM_OP_FLUSH_REMOTE_WRITES operations.\n    pub flushRemoteWrites: CUstreamBatchMemOpParams_union_CUstreamMemOpFlushRemoteWritesParams_st,\n    ///< Params for ::CU_STREAM_MEM_OP_BARRIER operations.\n    pub memoryBarrier: CUstreamBatchMemOpParams_union_CUstreamMemOpMemoryBarrierParams_st,\n    pub pad: [cuuint64_t; 6usize],\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct CUstreamBatchMemOpParams_union_CUstreamMemOpWaitValueParams_st {\n    pub operation: CUstreamBatchMemOpType,\n    pub address: CUdeviceptr,\n    pub __bindgen_anon_1: CUstreamBatchMemOpParams_union_CUstreamMemOpWaitValueParams_st__bindgen_ty_1,\n    ///< See ::CUstreamWaitValue_flags.\n    pub flags: ::core::ffi::c_uint,\n    ///< For driver internal use. Initial value is unimportant.\n    pub alias: CUdeviceptr,\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union CUstreamBatchMemOpParams_union_CUstreamMemOpWaitValueParams_st__bindgen_ty_1 {\n    pub value: cuuint32_t,\n    pub value64: cuuint64_t,\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct CUstreamBatchMemOpParams_union_CUstreamMemOpWriteValueParams_st {\n    pub operation: CUstreamBatchMemOpType,\n    pub address: CUdeviceptr,\n    pub __bindgen_anon_1: CUstreamBatchMemOpParams_union_CUstreamMemOpWriteValueParams_st__bindgen_ty_1,\n    ///< See ::CUstreamWriteValue_flags.\n    pub flags: ::core::ffi::c_uint,\n    ///< For driver internal use. Initial value is unimportant.\n    pub alias: CUdeviceptr,\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union CUstreamBatchMemOpParams_union_CUstreamMemOpWriteValueParams_st__bindgen_ty_1 {\n    pub value: cuuint32_t,\n    pub value64: cuuint64_t,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUstreamBatchMemOpParams_union_CUstreamMemOpFlushRemoteWritesParams_st {\n    pub operation: CUstreamBatchMemOpType,\n    ///< Must be 0.\n    pub flags: ::core::ffi::c_uint,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUstreamBatchMemOpParams_union_CUstreamMemOpMemoryBarrierParams_st {\n    pub operation: CUstreamBatchMemOpType,\n    ///< See ::CUstreamMemoryBarrier_flags\n    pub flags: ::core::ffi::c_uint,\n}\n/// Per-operation parameters for ::cuStreamBatchMemOp\npub type CUstreamBatchMemOpParams_v1 = CUstreamBatchMemOpParams_union;\n/// Per-operation parameters for ::cuStreamBatchMemOp\npub type CUstreamBatchMemOpParams = CUstreamBatchMemOpParams_v1;\n/** Batch memory operation node parameters\n\n Used in the legacy ::cuGraphAddBatchMemOpNode api.\n New code should use ::cuGraphAddNode()*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_BATCH_MEM_OP_NODE_PARAMS_v1_st {\n    pub ctx: CUcontext,\n    pub count: ::core::ffi::c_uint,\n    pub paramArray: *mut CUstreamBatchMemOpParams,\n    pub flags: ::core::ffi::c_uint,\n}\n/** Batch memory operation node parameters\n\n Used in the legacy ::cuGraphAddBatchMemOpNode api.\n New code should use ::cuGraphAddNode()*/\npub type CUDA_BATCH_MEM_OP_NODE_PARAMS_v1 = CUDA_BATCH_MEM_OP_NODE_PARAMS_v1_st;\n/** Batch memory operation node parameters\n\n Used in the legacy ::cuGraphAddBatchMemOpNode api.\n New code should use ::cuGraphAddNode()*/\npub type CUDA_BATCH_MEM_OP_NODE_PARAMS = CUDA_BATCH_MEM_OP_NODE_PARAMS_v1;\n/// Batch memory operation node parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_BATCH_MEM_OP_NODE_PARAMS_v2_st {\n    ///< Context to use for the operations.\n    pub ctx: CUcontext,\n    ///< Number of operations in paramArray.\n    pub count: ::core::ffi::c_uint,\n    ///< Array of batch memory operations.\n    pub paramArray: *mut CUstreamBatchMemOpParams,\n    ///< Flags to control the node.\n    pub flags: ::core::ffi::c_uint,\n}\n/// Batch memory operation node parameters\npub type CUDA_BATCH_MEM_OP_NODE_PARAMS_v2 = CUDA_BATCH_MEM_OP_NODE_PARAMS_v2_st;\nimpl CUoccupancy_flags_enum {\n    ///< Default behavior\n    pub const CU_OCCUPANCY_DEFAULT: CUoccupancy_flags_enum = CUoccupancy_flags_enum(0);\n}\nimpl CUoccupancy_flags_enum {\n    ///< Assume global caching is enabled and cannot be automatically turned off\n    pub const CU_OCCUPANCY_DISABLE_CACHING_OVERRIDE: CUoccupancy_flags_enum = CUoccupancy_flags_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n/// Occupancy calculator flag\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUoccupancy_flags_enum(pub ::core::ffi::c_uint);\n/// Occupancy calculator flag\npub use self::CUoccupancy_flags_enum as CUoccupancy_flags;\nimpl CUstreamUpdateCaptureDependencies_flags_enum {\n    ///< Add new nodes to the dependency set\n    pub const CU_STREAM_ADD_CAPTURE_DEPENDENCIES: CUstreamUpdateCaptureDependencies_flags_enum = CUstreamUpdateCaptureDependencies_flags_enum(\n        0,\n    );\n}\nimpl CUstreamUpdateCaptureDependencies_flags_enum {\n    ///< Replace the dependency set with the new nodes\n    pub const CU_STREAM_SET_CAPTURE_DEPENDENCIES: CUstreamUpdateCaptureDependencies_flags_enum = CUstreamUpdateCaptureDependencies_flags_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n/// Flags for ::cuStreamUpdateCaptureDependencies\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUstreamUpdateCaptureDependencies_flags_enum(pub ::core::ffi::c_uint);\n/// Flags for ::cuStreamUpdateCaptureDependencies\npub use self::CUstreamUpdateCaptureDependencies_flags_enum as CUstreamUpdateCaptureDependencies_flags;\nimpl CUasyncNotificationType_enum {\n    ///< Sent when the process has exceeded its device memory budget\n    pub const CU_ASYNC_NOTIFICATION_TYPE_OVER_BUDGET: CUasyncNotificationType_enum = CUasyncNotificationType_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n/// Types of async notification that can be sent\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUasyncNotificationType_enum(pub ::core::ffi::c_uint);\n/// Types of async notification that can be sent\npub use self::CUasyncNotificationType_enum as CUasyncNotificationType;\n/// Information passed to the user via the async notification callback\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct CUasyncNotificationInfo_st {\n    ///< The type of notification being sent\n    pub type_: CUasyncNotificationType,\n    ///< Information about the notification. \\p type must be checked in order to interpret this field.\n    pub info: CUasyncNotificationInfo_st__bindgen_ty_1,\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union CUasyncNotificationInfo_st__bindgen_ty_1 {\n    ///< Information about notifications of type \\p CU_ASYNC_NOTIFICATION_TYPE_OVER_BUDGET\n    pub overBudget: CUasyncNotificationInfo_st__bindgen_ty_1__bindgen_ty_1,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUasyncNotificationInfo_st__bindgen_ty_1__bindgen_ty_1 {\n    ///< The number of bytes that the process has allocated above its device memory budget\n    pub bytesOverBudget: ::core::ffi::c_ulonglong,\n}\n/// Information passed to the user via the async notification callback\npub type CUasyncNotificationInfo = CUasyncNotificationInfo_st;\n/** CUDA async notification callback\n \\param info Information describing what actions to take as a result of this notification.\n \\param userData Pointer to user defined data provided at callback registration.\n \\param callback The callback handle associated with this specific callback.*/\npub type CUasyncCallback = ::core::option::Option<\n    unsafe extern \"system\" fn(\n        info: *mut CUasyncNotificationInfo,\n        userData: *mut ::core::ffi::c_void,\n        callback: CUasyncCallbackHandle,\n    ),\n>;\nimpl CUarray_format_enum {\n    ///< Unsigned 8-bit integers\n    pub const CU_AD_FORMAT_UNSIGNED_INT8: CUarray_format_enum = CUarray_format_enum(1);\n}\nimpl CUarray_format_enum {\n    ///< Unsigned 16-bit integers\n    pub const CU_AD_FORMAT_UNSIGNED_INT16: CUarray_format_enum = CUarray_format_enum(2);\n}\nimpl CUarray_format_enum {\n    ///< Unsigned 32-bit integers\n    pub const CU_AD_FORMAT_UNSIGNED_INT32: CUarray_format_enum = CUarray_format_enum(3);\n}\nimpl CUarray_format_enum {\n    ///< Signed 8-bit integers\n    pub const CU_AD_FORMAT_SIGNED_INT8: CUarray_format_enum = CUarray_format_enum(8);\n}\nimpl CUarray_format_enum {\n    ///< Signed 16-bit integers\n    pub const CU_AD_FORMAT_SIGNED_INT16: CUarray_format_enum = CUarray_format_enum(9);\n}\nimpl CUarray_format_enum {\n    ///< Signed 32-bit integers\n    pub const CU_AD_FORMAT_SIGNED_INT32: CUarray_format_enum = CUarray_format_enum(10);\n}\nimpl CUarray_format_enum {\n    ///< 16-bit floating point\n    pub const CU_AD_FORMAT_HALF: CUarray_format_enum = CUarray_format_enum(16);\n}\nimpl CUarray_format_enum {\n    ///< 32-bit floating point\n    pub const CU_AD_FORMAT_FLOAT: CUarray_format_enum = CUarray_format_enum(32);\n}\nimpl CUarray_format_enum {\n    ///< 8-bit YUV planar format, with 4:2:0 sampling\n    pub const CU_AD_FORMAT_NV12: CUarray_format_enum = CUarray_format_enum(176);\n}\nimpl CUarray_format_enum {\n    ///< 1 channel unsigned 8-bit normalized integer\n    pub const CU_AD_FORMAT_UNORM_INT8X1: CUarray_format_enum = CUarray_format_enum(192);\n}\nimpl CUarray_format_enum {\n    ///< 2 channel unsigned 8-bit normalized integer\n    pub const CU_AD_FORMAT_UNORM_INT8X2: CUarray_format_enum = CUarray_format_enum(193);\n}\nimpl CUarray_format_enum {\n    ///< 4 channel unsigned 8-bit normalized integer\n    pub const CU_AD_FORMAT_UNORM_INT8X4: CUarray_format_enum = CUarray_format_enum(194);\n}\nimpl CUarray_format_enum {\n    ///< 1 channel unsigned 16-bit normalized integer\n    pub const CU_AD_FORMAT_UNORM_INT16X1: CUarray_format_enum = CUarray_format_enum(195);\n}\nimpl CUarray_format_enum {\n    ///< 2 channel unsigned 16-bit normalized integer\n    pub const CU_AD_FORMAT_UNORM_INT16X2: CUarray_format_enum = CUarray_format_enum(196);\n}\nimpl CUarray_format_enum {\n    ///< 4 channel unsigned 16-bit normalized integer\n    pub const CU_AD_FORMAT_UNORM_INT16X4: CUarray_format_enum = CUarray_format_enum(197);\n}\nimpl CUarray_format_enum {\n    ///< 1 channel signed 8-bit normalized integer\n    pub const CU_AD_FORMAT_SNORM_INT8X1: CUarray_format_enum = CUarray_format_enum(198);\n}\nimpl CUarray_format_enum {\n    ///< 2 channel signed 8-bit normalized integer\n    pub const CU_AD_FORMAT_SNORM_INT8X2: CUarray_format_enum = CUarray_format_enum(199);\n}\nimpl CUarray_format_enum {\n    ///< 4 channel signed 8-bit normalized integer\n    pub const CU_AD_FORMAT_SNORM_INT8X4: CUarray_format_enum = CUarray_format_enum(200);\n}\nimpl CUarray_format_enum {\n    ///< 1 channel signed 16-bit normalized integer\n    pub const CU_AD_FORMAT_SNORM_INT16X1: CUarray_format_enum = CUarray_format_enum(201);\n}\nimpl CUarray_format_enum {\n    ///< 2 channel signed 16-bit normalized integer\n    pub const CU_AD_FORMAT_SNORM_INT16X2: CUarray_format_enum = CUarray_format_enum(202);\n}\nimpl CUarray_format_enum {\n    ///< 4 channel signed 16-bit normalized integer\n    pub const CU_AD_FORMAT_SNORM_INT16X4: CUarray_format_enum = CUarray_format_enum(203);\n}\nimpl CUarray_format_enum {\n    ///< 4 channel unsigned normalized block-compressed (BC1 compression) format\n    pub const CU_AD_FORMAT_BC1_UNORM: CUarray_format_enum = CUarray_format_enum(145);\n}\nimpl CUarray_format_enum {\n    ///< 4 channel unsigned normalized block-compressed (BC1 compression) format with sRGB encoding\n    pub const CU_AD_FORMAT_BC1_UNORM_SRGB: CUarray_format_enum = CUarray_format_enum(\n        146,\n    );\n}\nimpl CUarray_format_enum {\n    ///< 4 channel unsigned normalized block-compressed (BC2 compression) format\n    pub const CU_AD_FORMAT_BC2_UNORM: CUarray_format_enum = CUarray_format_enum(147);\n}\nimpl CUarray_format_enum {\n    ///< 4 channel unsigned normalized block-compressed (BC2 compression) format with sRGB encoding\n    pub const CU_AD_FORMAT_BC2_UNORM_SRGB: CUarray_format_enum = CUarray_format_enum(\n        148,\n    );\n}\nimpl CUarray_format_enum {\n    ///< 4 channel unsigned normalized block-compressed (BC3 compression) format\n    pub const CU_AD_FORMAT_BC3_UNORM: CUarray_format_enum = CUarray_format_enum(149);\n}\nimpl CUarray_format_enum {\n    ///< 4 channel unsigned normalized block-compressed (BC3 compression) format with sRGB encoding\n    pub const CU_AD_FORMAT_BC3_UNORM_SRGB: CUarray_format_enum = CUarray_format_enum(\n        150,\n    );\n}\nimpl CUarray_format_enum {\n    ///< 1 channel unsigned normalized block-compressed (BC4 compression) format\n    pub const CU_AD_FORMAT_BC4_UNORM: CUarray_format_enum = CUarray_format_enum(151);\n}\nimpl CUarray_format_enum {\n    ///< 1 channel signed normalized block-compressed (BC4 compression) format\n    pub const CU_AD_FORMAT_BC4_SNORM: CUarray_format_enum = CUarray_format_enum(152);\n}\nimpl CUarray_format_enum {\n    ///< 2 channel unsigned normalized block-compressed (BC5 compression) format\n    pub const CU_AD_FORMAT_BC5_UNORM: CUarray_format_enum = CUarray_format_enum(153);\n}\nimpl CUarray_format_enum {\n    ///< 2 channel signed normalized block-compressed (BC5 compression) format\n    pub const CU_AD_FORMAT_BC5_SNORM: CUarray_format_enum = CUarray_format_enum(154);\n}\nimpl CUarray_format_enum {\n    ///< 3 channel unsigned half-float block-compressed (BC6H compression) format\n    pub const CU_AD_FORMAT_BC6H_UF16: CUarray_format_enum = CUarray_format_enum(155);\n}\nimpl CUarray_format_enum {\n    ///< 3 channel signed half-float block-compressed (BC6H compression) format\n    pub const CU_AD_FORMAT_BC6H_SF16: CUarray_format_enum = CUarray_format_enum(156);\n}\nimpl CUarray_format_enum {\n    ///< 4 channel unsigned normalized block-compressed (BC7 compression) format\n    pub const CU_AD_FORMAT_BC7_UNORM: CUarray_format_enum = CUarray_format_enum(157);\n}\nimpl CUarray_format_enum {\n    ///< 4 channel unsigned normalized block-compressed (BC7 compression) format with sRGB encoding\n    pub const CU_AD_FORMAT_BC7_UNORM_SRGB: CUarray_format_enum = CUarray_format_enum(\n        158,\n    );\n}\nimpl CUarray_format_enum {\n    ///< 10-bit YUV planar format, with 4:2:0 sampling\n    pub const CU_AD_FORMAT_P010: CUarray_format_enum = CUarray_format_enum(159);\n}\nimpl CUarray_format_enum {\n    ///< 16-bit YUV planar format, with 4:2:0 sampling\n    pub const CU_AD_FORMAT_P016: CUarray_format_enum = CUarray_format_enum(161);\n}\nimpl CUarray_format_enum {\n    ///< 8-bit YUV planar format, with 4:2:2 sampling\n    pub const CU_AD_FORMAT_NV16: CUarray_format_enum = CUarray_format_enum(162);\n}\nimpl CUarray_format_enum {\n    ///< 10-bit YUV planar format, with 4:2:2 sampling\n    pub const CU_AD_FORMAT_P210: CUarray_format_enum = CUarray_format_enum(163);\n}\nimpl CUarray_format_enum {\n    ///< 16-bit YUV planar format, with 4:2:2 sampling\n    pub const CU_AD_FORMAT_P216: CUarray_format_enum = CUarray_format_enum(164);\n}\nimpl CUarray_format_enum {\n    ///< 2 channel, 8-bit YUV packed planar format, with 4:2:2 sampling\n    pub const CU_AD_FORMAT_YUY2: CUarray_format_enum = CUarray_format_enum(165);\n}\nimpl CUarray_format_enum {\n    ///< 2 channel, 10-bit YUV packed planar format, with 4:2:2 sampling\n    pub const CU_AD_FORMAT_Y210: CUarray_format_enum = CUarray_format_enum(166);\n}\nimpl CUarray_format_enum {\n    ///< 2 channel, 16-bit YUV packed planar format, with 4:2:2 sampling\n    pub const CU_AD_FORMAT_Y216: CUarray_format_enum = CUarray_format_enum(167);\n}\nimpl CUarray_format_enum {\n    ///< 4 channel, 8-bit YUV packed planar format, with 4:4:4 sampling\n    pub const CU_AD_FORMAT_AYUV: CUarray_format_enum = CUarray_format_enum(168);\n}\nimpl CUarray_format_enum {\n    ///< 10-bit YUV packed planar format, with 4:4:4 sampling\n    pub const CU_AD_FORMAT_Y410: CUarray_format_enum = CUarray_format_enum(169);\n}\nimpl CUarray_format_enum {\n    ///< 4 channel, 12-bit YUV packed planar format, with 4:4:4 sampling\n    pub const CU_AD_FORMAT_Y416: CUarray_format_enum = CUarray_format_enum(177);\n}\nimpl CUarray_format_enum {\n    ///< 3 channel 8-bit YUV planar format, with 4:4:4 sampling\n    pub const CU_AD_FORMAT_Y444_PLANAR8: CUarray_format_enum = CUarray_format_enum(178);\n}\nimpl CUarray_format_enum {\n    ///< 3 channel 10-bit YUV planar format, with 4:4:4 sampling\n    pub const CU_AD_FORMAT_Y444_PLANAR10: CUarray_format_enum = CUarray_format_enum(179);\n}\nimpl CUarray_format_enum {\n    ///< 3 channel 8-bit YUV semi-planar format, with 4:4:4 sampling\n    pub const CU_AD_FORMAT_YUV444_8bit_SemiPlanar: CUarray_format_enum = CUarray_format_enum(\n        180,\n    );\n}\nimpl CUarray_format_enum {\n    ///< 3 channel 16-bit YUV semi-planar format, with 4:4:4 sampling\n    pub const CU_AD_FORMAT_YUV444_16bit_SemiPlanar: CUarray_format_enum = CUarray_format_enum(\n        181,\n    );\n}\nimpl CUarray_format_enum {\n    ///< 4 channel unorm R10G10B10A2 RGB format\n    pub const CU_AD_FORMAT_UNORM_INT_101010_2: CUarray_format_enum = CUarray_format_enum(\n        80,\n    );\n}\nimpl CUarray_format_enum {\n    pub const CU_AD_FORMAT_MAX: CUarray_format_enum = CUarray_format_enum(2147483647);\n}\n#[repr(transparent)]\n/// Array formats\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUarray_format_enum(pub ::core::ffi::c_uint);\n/// Array formats\npub use self::CUarray_format_enum as CUarray_format;\nimpl CUaddress_mode_enum {\n    ///< Wrapping address mode\n    pub const CU_TR_ADDRESS_MODE_WRAP: CUaddress_mode_enum = CUaddress_mode_enum(0);\n}\nimpl CUaddress_mode_enum {\n    ///< Clamp to edge address mode\n    pub const CU_TR_ADDRESS_MODE_CLAMP: CUaddress_mode_enum = CUaddress_mode_enum(1);\n}\nimpl CUaddress_mode_enum {\n    ///< Mirror address mode\n    pub const CU_TR_ADDRESS_MODE_MIRROR: CUaddress_mode_enum = CUaddress_mode_enum(2);\n}\nimpl CUaddress_mode_enum {\n    ///< Border address mode\n    pub const CU_TR_ADDRESS_MODE_BORDER: CUaddress_mode_enum = CUaddress_mode_enum(3);\n}\n#[repr(transparent)]\n/// Texture reference addressing modes\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUaddress_mode_enum(pub ::core::ffi::c_uint);\n/// Texture reference addressing modes\npub use self::CUaddress_mode_enum as CUaddress_mode;\nimpl CUfilter_mode_enum {\n    ///< Point filter mode\n    pub const CU_TR_FILTER_MODE_POINT: CUfilter_mode_enum = CUfilter_mode_enum(0);\n}\nimpl CUfilter_mode_enum {\n    ///< Linear filter mode\n    pub const CU_TR_FILTER_MODE_LINEAR: CUfilter_mode_enum = CUfilter_mode_enum(1);\n}\n#[repr(transparent)]\n/// Texture reference filtering modes\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUfilter_mode_enum(pub ::core::ffi::c_uint);\n/// Texture reference filtering modes\npub use self::CUfilter_mode_enum as CUfilter_mode;\nimpl CUdevice_attribute_enum {\n    ///< Maximum number of threads per block\n    pub const CU_DEVICE_ATTRIBUTE_MAX_THREADS_PER_BLOCK: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        1,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum block dimension X\n    pub const CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_X: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        2,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum block dimension Y\n    pub const CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_Y: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        3,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum block dimension Z\n    pub const CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_Z: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        4,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum grid dimension X\n    pub const CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_X: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        5,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum grid dimension Y\n    pub const CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_Y: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        6,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum grid dimension Z\n    pub const CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_Z: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        7,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum shared memory available per block in bytes\n    pub const CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        8,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Deprecated, use CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK\n    pub const CU_DEVICE_ATTRIBUTE_SHARED_MEMORY_PER_BLOCK: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        8,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Memory available on device for __constant__ variables in a CUDA C kernel in bytes\n    pub const CU_DEVICE_ATTRIBUTE_TOTAL_CONSTANT_MEMORY: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        9,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Warp size in threads\n    pub const CU_DEVICE_ATTRIBUTE_WARP_SIZE: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        10,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum pitch in bytes allowed by memory copies\n    pub const CU_DEVICE_ATTRIBUTE_MAX_PITCH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        11,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum number of 32-bit registers available per block\n    pub const CU_DEVICE_ATTRIBUTE_MAX_REGISTERS_PER_BLOCK: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        12,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Deprecated, use CU_DEVICE_ATTRIBUTE_MAX_REGISTERS_PER_BLOCK\n    pub const CU_DEVICE_ATTRIBUTE_REGISTERS_PER_BLOCK: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        12,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Typical clock frequency in kilohertz\n    pub const CU_DEVICE_ATTRIBUTE_CLOCK_RATE: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        13,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Alignment requirement for textures\n    pub const CU_DEVICE_ATTRIBUTE_TEXTURE_ALIGNMENT: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        14,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device can possibly copy memory and execute a kernel concurrently. Deprecated. Use instead CU_DEVICE_ATTRIBUTE_ASYNC_ENGINE_COUNT.\n    pub const CU_DEVICE_ATTRIBUTE_GPU_OVERLAP: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        15,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Number of multiprocessors on device\n    pub const CU_DEVICE_ATTRIBUTE_MULTIPROCESSOR_COUNT: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        16,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Specifies whether there is a run time limit on kernels\n    pub const CU_DEVICE_ATTRIBUTE_KERNEL_EXEC_TIMEOUT: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        17,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device is integrated with host memory\n    pub const CU_DEVICE_ATTRIBUTE_INTEGRATED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        18,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device can map host memory into CUDA address space\n    pub const CU_DEVICE_ATTRIBUTE_CAN_MAP_HOST_MEMORY: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        19,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Compute mode (See ::CUcomputemode for details)\n    pub const CU_DEVICE_ATTRIBUTE_COMPUTE_MODE: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        20,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum 1D texture width\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_WIDTH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        21,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum 2D texture width\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_WIDTH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        22,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum 2D texture height\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_HEIGHT: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        23,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum 3D texture width\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_WIDTH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        24,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum 3D texture height\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_HEIGHT: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        25,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum 3D texture depth\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_DEPTH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        26,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum 2D layered texture width\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_WIDTH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        27,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum 2D layered texture height\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_HEIGHT: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        28,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum layers in a 2D layered texture\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_LAYERS: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        29,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Deprecated, use CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_WIDTH\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_ARRAY_WIDTH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        27,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Deprecated, use CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_HEIGHT\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_ARRAY_HEIGHT: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        28,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Deprecated, use CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_LAYERS\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_ARRAY_NUMSLICES: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        29,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Alignment requirement for surfaces\n    pub const CU_DEVICE_ATTRIBUTE_SURFACE_ALIGNMENT: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        30,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device can possibly execute multiple kernels concurrently\n    pub const CU_DEVICE_ATTRIBUTE_CONCURRENT_KERNELS: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        31,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device has ECC support enabled\n    pub const CU_DEVICE_ATTRIBUTE_ECC_ENABLED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        32,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< PCI bus ID of the device\n    pub const CU_DEVICE_ATTRIBUTE_PCI_BUS_ID: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        33,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< PCI device ID of the device\n    pub const CU_DEVICE_ATTRIBUTE_PCI_DEVICE_ID: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        34,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device is using TCC driver model\n    pub const CU_DEVICE_ATTRIBUTE_TCC_DRIVER: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        35,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Peak memory clock frequency in kilohertz\n    pub const CU_DEVICE_ATTRIBUTE_MEMORY_CLOCK_RATE: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        36,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Global memory bus width in bits\n    pub const CU_DEVICE_ATTRIBUTE_GLOBAL_MEMORY_BUS_WIDTH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        37,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Size of L2 cache in bytes\n    pub const CU_DEVICE_ATTRIBUTE_L2_CACHE_SIZE: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        38,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum resident threads per multiprocessor\n    pub const CU_DEVICE_ATTRIBUTE_MAX_THREADS_PER_MULTIPROCESSOR: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        39,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Number of asynchronous engines\n    pub const CU_DEVICE_ATTRIBUTE_ASYNC_ENGINE_COUNT: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        40,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device shares a unified address space with the host\n    pub const CU_DEVICE_ATTRIBUTE_UNIFIED_ADDRESSING: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        41,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum 1D layered texture width\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LAYERED_WIDTH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        42,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum layers in a 1D layered texture\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LAYERED_LAYERS: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        43,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Deprecated, do not use.\n    pub const CU_DEVICE_ATTRIBUTE_CAN_TEX2D_GATHER: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        44,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum 2D texture width if CUDA_ARRAY3D_TEXTURE_GATHER is set\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_GATHER_WIDTH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        45,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum 2D texture height if CUDA_ARRAY3D_TEXTURE_GATHER is set\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_GATHER_HEIGHT: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        46,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Alternate maximum 3D texture width\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_WIDTH_ALTERNATE: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        47,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Alternate maximum 3D texture height\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_HEIGHT_ALTERNATE: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        48,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Alternate maximum 3D texture depth\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_DEPTH_ALTERNATE: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        49,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< PCI domain ID of the device\n    pub const CU_DEVICE_ATTRIBUTE_PCI_DOMAIN_ID: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        50,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Pitch alignment requirement for textures\n    pub const CU_DEVICE_ATTRIBUTE_TEXTURE_PITCH_ALIGNMENT: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        51,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum cubemap texture width/height\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_WIDTH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        52,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum cubemap layered texture width/height\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_LAYERED_WIDTH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        53,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum layers in a cubemap layered texture\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_LAYERED_LAYERS: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        54,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum 1D surface width\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE1D_WIDTH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        55,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum 2D surface width\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_WIDTH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        56,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum 2D surface height\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_HEIGHT: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        57,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum 3D surface width\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_WIDTH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        58,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum 3D surface height\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_HEIGHT: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        59,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum 3D surface depth\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_DEPTH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        60,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum 1D layered surface width\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE1D_LAYERED_WIDTH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        61,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum layers in a 1D layered surface\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE1D_LAYERED_LAYERS: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        62,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum 2D layered surface width\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_WIDTH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        63,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum 2D layered surface height\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_HEIGHT: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        64,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum layers in a 2D layered surface\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_LAYERS: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        65,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum cubemap surface width\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_WIDTH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        66,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum cubemap layered surface width\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_LAYERED_WIDTH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        67,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum layers in a cubemap layered surface\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_LAYERED_LAYERS: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        68,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Deprecated, do not use. Use cudaDeviceGetTexture1DLinearMaxWidth() or cuDeviceGetTexture1DLinearMaxWidth() instead.\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LINEAR_WIDTH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        69,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum 2D linear texture width\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_WIDTH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        70,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum 2D linear texture height\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_HEIGHT: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        71,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum 2D linear texture pitch in bytes\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_PITCH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        72,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum mipmapped 2D texture width\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_MIPMAPPED_WIDTH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        73,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum mipmapped 2D texture height\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_MIPMAPPED_HEIGHT: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        74,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Major compute capability version number\n    pub const CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        75,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Minor compute capability version number\n    pub const CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        76,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum mipmapped 1D texture width\n    pub const CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_MIPMAPPED_WIDTH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        77,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports stream priorities\n    pub const CU_DEVICE_ATTRIBUTE_STREAM_PRIORITIES_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        78,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports caching globals in L1\n    pub const CU_DEVICE_ATTRIBUTE_GLOBAL_L1_CACHE_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        79,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports caching locals in L1\n    pub const CU_DEVICE_ATTRIBUTE_LOCAL_L1_CACHE_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        80,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum shared memory available per multiprocessor in bytes\n    pub const CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_MULTIPROCESSOR: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        81,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum number of 32-bit registers available per multiprocessor\n    pub const CU_DEVICE_ATTRIBUTE_MAX_REGISTERS_PER_MULTIPROCESSOR: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        82,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device can allocate managed memory on this system\n    pub const CU_DEVICE_ATTRIBUTE_MANAGED_MEMORY: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        83,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device is on a multi-GPU board\n    pub const CU_DEVICE_ATTRIBUTE_MULTI_GPU_BOARD: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        84,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Unique id for a group of devices on the same multi-GPU board\n    pub const CU_DEVICE_ATTRIBUTE_MULTI_GPU_BOARD_GROUP_ID: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        85,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Link between the device and the host supports all native atomic operations\n    pub const CU_DEVICE_ATTRIBUTE_HOST_NATIVE_ATOMIC_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        86,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Ratio of single precision performance (in floating-point operations per second) to double precision performance\n    pub const CU_DEVICE_ATTRIBUTE_SINGLE_TO_DOUBLE_PRECISION_PERF_RATIO: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        87,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports coherently accessing pageable memory without calling cudaHostRegister on it\n    pub const CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        88,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device can coherently access managed memory concurrently with the CPU\n    pub const CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        89,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports compute preemption.\n    pub const CU_DEVICE_ATTRIBUTE_COMPUTE_PREEMPTION_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        90,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device can access host registered memory at the same virtual address as the CPU\n    pub const CU_DEVICE_ATTRIBUTE_CAN_USE_HOST_POINTER_FOR_REGISTERED_MEM: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        91,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Deprecated, along with v1 MemOps API, ::cuStreamBatchMemOp and related APIs are supported.\n    pub const CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_MEM_OPS_V1: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        92,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Deprecated, along with v1 MemOps API, 64-bit operations are supported in ::cuStreamBatchMemOp and related APIs.\n    pub const CU_DEVICE_ATTRIBUTE_CAN_USE_64_BIT_STREAM_MEM_OPS_V1: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        93,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Deprecated, along with v1 MemOps API, ::CU_STREAM_WAIT_VALUE_NOR is supported.\n    pub const CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_WAIT_VALUE_NOR_V1: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        94,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports launching cooperative kernels via ::cuLaunchCooperativeKernel\n    pub const CU_DEVICE_ATTRIBUTE_COOPERATIVE_LAUNCH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        95,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Deprecated, ::cuLaunchCooperativeKernelMultiDevice is deprecated.\n    pub const CU_DEVICE_ATTRIBUTE_COOPERATIVE_MULTI_DEVICE_LAUNCH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        96,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum optin shared memory per block\n    pub const CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK_OPTIN: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        97,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< The ::CU_STREAM_WAIT_VALUE_FLUSH flag and the ::CU_STREAM_MEM_OP_FLUSH_REMOTE_WRITES MemOp are supported on the device. See \\ref CUDA_MEMOP for additional details.\n    pub const CU_DEVICE_ATTRIBUTE_CAN_FLUSH_REMOTE_WRITES: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        98,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports host memory registration via ::cudaHostRegister.\n    pub const CU_DEVICE_ATTRIBUTE_HOST_REGISTER_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        99,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device accesses pageable memory via the host's page tables.\n    pub const CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS_USES_HOST_PAGE_TABLES: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        100,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< The host can directly access managed memory on the device without migration.\n    pub const CU_DEVICE_ATTRIBUTE_DIRECT_MANAGED_MEM_ACCESS_FROM_HOST: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        101,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Deprecated, Use CU_DEVICE_ATTRIBUTE_VIRTUAL_MEMORY_MANAGEMENT_SUPPORTED\n    pub const CU_DEVICE_ATTRIBUTE_VIRTUAL_ADDRESS_MANAGEMENT_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        102,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports virtual memory management APIs like ::cuMemAddressReserve, ::cuMemCreate, ::cuMemMap and related APIs\n    pub const CU_DEVICE_ATTRIBUTE_VIRTUAL_MEMORY_MANAGEMENT_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        102,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports exporting memory to a posix file descriptor with ::cuMemExportToShareableHandle, if requested via ::cuMemCreate\n    pub const CU_DEVICE_ATTRIBUTE_HANDLE_TYPE_POSIX_FILE_DESCRIPTOR_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        103,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports exporting memory to a Win32 NT handle with ::cuMemExportToShareableHandle, if requested via ::cuMemCreate\n    pub const CU_DEVICE_ATTRIBUTE_HANDLE_TYPE_WIN32_HANDLE_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        104,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports exporting memory to a Win32 KMT handle with ::cuMemExportToShareableHandle, if requested via ::cuMemCreate\n    pub const CU_DEVICE_ATTRIBUTE_HANDLE_TYPE_WIN32_KMT_HANDLE_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        105,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum number of blocks per multiprocessor\n    pub const CU_DEVICE_ATTRIBUTE_MAX_BLOCKS_PER_MULTIPROCESSOR: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        106,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports compression of memory\n    pub const CU_DEVICE_ATTRIBUTE_GENERIC_COMPRESSION_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        107,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum L2 persisting lines capacity setting in bytes.\n    pub const CU_DEVICE_ATTRIBUTE_MAX_PERSISTING_L2_CACHE_SIZE: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        108,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Maximum value of CUaccessPolicyWindow::num_bytes.\n    pub const CU_DEVICE_ATTRIBUTE_MAX_ACCESS_POLICY_WINDOW_SIZE: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        109,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports specifying the GPUDirect RDMA flag with ::cuMemCreate\n    pub const CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_WITH_CUDA_VMM_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        110,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Shared memory reserved by CUDA driver per block in bytes\n    pub const CU_DEVICE_ATTRIBUTE_RESERVED_SHARED_MEMORY_PER_BLOCK: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        111,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports sparse CUDA arrays and sparse CUDA mipmapped arrays\n    pub const CU_DEVICE_ATTRIBUTE_SPARSE_CUDA_ARRAY_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        112,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports using the ::cuMemHostRegister flag ::CU_MEMHOSTERGISTER_READ_ONLY to register memory that must be mapped as read-only to the GPU\n    pub const CU_DEVICE_ATTRIBUTE_READ_ONLY_HOST_REGISTER_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        113,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< External timeline semaphore interop is supported on the device\n    pub const CU_DEVICE_ATTRIBUTE_TIMELINE_SEMAPHORE_INTEROP_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        114,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports using the ::cuMemAllocAsync and ::cuMemPool family of APIs\n    pub const CU_DEVICE_ATTRIBUTE_MEMORY_POOLS_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        115,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports GPUDirect RDMA APIs, like nvidia_p2p_get_pages (see https://docs.nvidia.com/cuda/gpudirect-rdma for more information)\n    pub const CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        116,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< The returned attribute shall be interpreted as a bitmask, where the individual bits are described by the ::CUflushGPUDirectRDMAWritesOptions enum\n    pub const CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_FLUSH_WRITES_OPTIONS: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        117,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< GPUDirect RDMA writes to the device do not need to be flushed for consumers within the scope indicated by the returned attribute. See ::CUGPUDirectRDMAWritesOrdering for the numerical values returned here.\n    pub const CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_WRITES_ORDERING: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        118,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Handle types supported with mempool based IPC\n    pub const CU_DEVICE_ATTRIBUTE_MEMPOOL_SUPPORTED_HANDLE_TYPES: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        119,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Indicates device supports cluster launch\n    pub const CU_DEVICE_ATTRIBUTE_CLUSTER_LAUNCH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        120,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports deferred mapping CUDA arrays and CUDA mipmapped arrays\n    pub const CU_DEVICE_ATTRIBUTE_DEFERRED_MAPPING_CUDA_ARRAY_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        121,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< 64-bit operations are supported in ::cuStreamBatchMemOp and related MemOp APIs.\n    pub const CU_DEVICE_ATTRIBUTE_CAN_USE_64_BIT_STREAM_MEM_OPS: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        122,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< ::CU_STREAM_WAIT_VALUE_NOR is supported by MemOp APIs.\n    pub const CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_WAIT_VALUE_NOR: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        123,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports buffer sharing with dma_buf mechanism.\n    pub const CU_DEVICE_ATTRIBUTE_DMA_BUF_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        124,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports IPC Events.\n    pub const CU_DEVICE_ATTRIBUTE_IPC_EVENT_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        125,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Number of memory domains the device supports.\n    pub const CU_DEVICE_ATTRIBUTE_MEM_SYNC_DOMAIN_COUNT: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        126,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports accessing memory using Tensor Map.\n    pub const CU_DEVICE_ATTRIBUTE_TENSOR_MAP_ACCESS_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        127,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports exporting memory to a fabric handle with cuMemExportToShareableHandle() or requested with cuMemCreate()\n    pub const CU_DEVICE_ATTRIBUTE_HANDLE_TYPE_FABRIC_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        128,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports unified function pointers.\n    pub const CU_DEVICE_ATTRIBUTE_UNIFIED_FUNCTION_POINTERS: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        129,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< NUMA configuration of a device: value is of type ::CUdeviceNumaConfig enum\n    pub const CU_DEVICE_ATTRIBUTE_NUMA_CONFIG: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        130,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< NUMA node ID of the GPU memory\n    pub const CU_DEVICE_ATTRIBUTE_NUMA_ID: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        131,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports switch multicast and reduction operations.\n    pub const CU_DEVICE_ATTRIBUTE_MULTICAST_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        132,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Indicates if contexts created on this device will be shared via MPS\n    pub const CU_DEVICE_ATTRIBUTE_MPS_ENABLED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        133,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< NUMA ID of the host node closest to the device. Returns -1 when system does not support NUMA.\n    pub const CU_DEVICE_ATTRIBUTE_HOST_NUMA_ID: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        134,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports CIG with D3D12.\n    pub const CU_DEVICE_ATTRIBUTE_D3D12_CIG_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        135,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< The returned valued shall be interpreted as a bitmask, where the individual bits are described by the ::CUmemDecompressAlgorithm enum.\n    pub const CU_DEVICE_ATTRIBUTE_MEM_DECOMPRESS_ALGORITHM_MASK: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        136,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< The returned valued is the maximum length in bytes of a single decompress operation that is allowed.\n    pub const CU_DEVICE_ATTRIBUTE_MEM_DECOMPRESS_MAXIMUM_LENGTH: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        137,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports CIG with Vulkan.\n    pub const CU_DEVICE_ATTRIBUTE_VULKAN_CIG_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        138,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< The combined 16-bit PCI device ID and 16-bit PCI vendor ID.\n    pub const CU_DEVICE_ATTRIBUTE_GPU_PCI_DEVICE_ID: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        139,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< The combined 16-bit PCI subsystem ID and 16-bit PCI subsystem vendor ID.\n    pub const CU_DEVICE_ATTRIBUTE_GPU_PCI_SUBSYSTEM_ID: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        140,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports HOST_NUMA location with the virtual memory management APIs like ::cuMemCreate, ::cuMemMap and related APIs\n    pub const CU_DEVICE_ATTRIBUTE_HOST_NUMA_VIRTUAL_MEMORY_MANAGEMENT_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        141,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports HOST_NUMA location with the ::cuMemAllocAsync and ::cuMemPool family of APIs\n    pub const CU_DEVICE_ATTRIBUTE_HOST_NUMA_MEMORY_POOLS_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        142,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports HOST_NUMA location IPC between nodes in a multi-node system.\n    pub const CU_DEVICE_ATTRIBUTE_HOST_NUMA_MULTINODE_IPC_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        143,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device suports HOST location with the ::cuMemAllocAsync and ::cuMemPool family of APIs\n    pub const CU_DEVICE_ATTRIBUTE_HOST_MEMORY_POOLS_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        144,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports HOST location with the virtual memory management APIs like ::cuMemCreate, ::cuMemMap and related APIs\n    pub const CU_DEVICE_ATTRIBUTE_HOST_VIRTUAL_MEMORY_MANAGEMENT_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        145,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Device supports page-locked host memory buffer sharing with dma_buf mechanism.\n    pub const CU_DEVICE_ATTRIBUTE_HOST_ALLOC_DMA_BUF_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        146,\n    );\n}\nimpl CUdevice_attribute_enum {\n    ///< Link between the device and the host supports only some native atomic operations\n    pub const CU_DEVICE_ATTRIBUTE_ONLY_PARTIAL_HOST_NATIVE_ATOMIC_SUPPORTED: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        147,\n    );\n}\nimpl CUdevice_attribute_enum {\n    pub const CU_DEVICE_ATTRIBUTE_MAX: CUdevice_attribute_enum = CUdevice_attribute_enum(\n        148,\n    );\n}\n#[repr(transparent)]\n/// Device properties\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUdevice_attribute_enum(pub ::core::ffi::c_uint);\n/// Device properties\npub use self::CUdevice_attribute_enum as CUdevice_attribute;\n/// Legacy device properties\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUdevprop_st {\n    ///< Maximum number of threads per block\n    pub maxThreadsPerBlock: ::core::ffi::c_int,\n    ///< Maximum size of each dimension of a block\n    pub maxThreadsDim: [::core::ffi::c_int; 3usize],\n    ///< Maximum size of each dimension of a grid\n    pub maxGridSize: [::core::ffi::c_int; 3usize],\n    ///< Shared memory available per block in bytes\n    pub sharedMemPerBlock: ::core::ffi::c_int,\n    ///< Constant memory available on device in bytes\n    pub totalConstantMemory: ::core::ffi::c_int,\n    ///< Warp size in threads\n    pub SIMDWidth: ::core::ffi::c_int,\n    ///< Maximum pitch in bytes allowed by memory copies\n    pub memPitch: ::core::ffi::c_int,\n    ///< 32-bit registers available per block\n    pub regsPerBlock: ::core::ffi::c_int,\n    ///< Clock frequency in kilohertz\n    pub clockRate: ::core::ffi::c_int,\n    ///< Alignment requirement for textures\n    pub textureAlign: ::core::ffi::c_int,\n}\n/// Legacy device properties\npub type CUdevprop_v1 = CUdevprop_st;\n/// Legacy device properties\npub type CUdevprop = CUdevprop_v1;\nimpl CUpointer_attribute_enum {\n    ///< The ::CUcontext on which a pointer was allocated or registered\n    pub const CU_POINTER_ATTRIBUTE_CONTEXT: CUpointer_attribute_enum = CUpointer_attribute_enum(\n        1,\n    );\n}\nimpl CUpointer_attribute_enum {\n    ///< The ::CUmemorytype describing the physical location of a pointer\n    pub const CU_POINTER_ATTRIBUTE_MEMORY_TYPE: CUpointer_attribute_enum = CUpointer_attribute_enum(\n        2,\n    );\n}\nimpl CUpointer_attribute_enum {\n    ///< The address at which a pointer's memory may be accessed on the device\n    pub const CU_POINTER_ATTRIBUTE_DEVICE_POINTER: CUpointer_attribute_enum = CUpointer_attribute_enum(\n        3,\n    );\n}\nimpl CUpointer_attribute_enum {\n    ///< The address at which a pointer's memory may be accessed on the host\n    pub const CU_POINTER_ATTRIBUTE_HOST_POINTER: CUpointer_attribute_enum = CUpointer_attribute_enum(\n        4,\n    );\n}\nimpl CUpointer_attribute_enum {\n    ///< A pair of tokens for use with the nv-p2p.h Linux kernel interface\n    pub const CU_POINTER_ATTRIBUTE_P2P_TOKENS: CUpointer_attribute_enum = CUpointer_attribute_enum(\n        5,\n    );\n}\nimpl CUpointer_attribute_enum {\n    ///< Synchronize every synchronous memory operation initiated on this region\n    pub const CU_POINTER_ATTRIBUTE_SYNC_MEMOPS: CUpointer_attribute_enum = CUpointer_attribute_enum(\n        6,\n    );\n}\nimpl CUpointer_attribute_enum {\n    ///< A process-wide unique ID for an allocated memory region\n    pub const CU_POINTER_ATTRIBUTE_BUFFER_ID: CUpointer_attribute_enum = CUpointer_attribute_enum(\n        7,\n    );\n}\nimpl CUpointer_attribute_enum {\n    ///< Indicates if the pointer points to managed memory\n    pub const CU_POINTER_ATTRIBUTE_IS_MANAGED: CUpointer_attribute_enum = CUpointer_attribute_enum(\n        8,\n    );\n}\nimpl CUpointer_attribute_enum {\n    ///< A device ordinal of a device on which a pointer was allocated or registered\n    pub const CU_POINTER_ATTRIBUTE_DEVICE_ORDINAL: CUpointer_attribute_enum = CUpointer_attribute_enum(\n        9,\n    );\n}\nimpl CUpointer_attribute_enum {\n    ///< 1 if this pointer maps to an allocation that is suitable for ::cudaIpcGetMemHandle, 0 otherwise\n    pub const CU_POINTER_ATTRIBUTE_IS_LEGACY_CUDA_IPC_CAPABLE: CUpointer_attribute_enum = CUpointer_attribute_enum(\n        10,\n    );\n}\nimpl CUpointer_attribute_enum {\n    ///< Starting address for this requested pointer\n    pub const CU_POINTER_ATTRIBUTE_RANGE_START_ADDR: CUpointer_attribute_enum = CUpointer_attribute_enum(\n        11,\n    );\n}\nimpl CUpointer_attribute_enum {\n    ///< Size of the address range for this requested pointer\n    pub const CU_POINTER_ATTRIBUTE_RANGE_SIZE: CUpointer_attribute_enum = CUpointer_attribute_enum(\n        12,\n    );\n}\nimpl CUpointer_attribute_enum {\n    ///< 1 if this pointer is in a valid address range that is mapped to a backing allocation, 0 otherwise\n    pub const CU_POINTER_ATTRIBUTE_MAPPED: CUpointer_attribute_enum = CUpointer_attribute_enum(\n        13,\n    );\n}\nimpl CUpointer_attribute_enum {\n    ///< Bitmask of allowed ::CUmemAllocationHandleType for this allocation\n    pub const CU_POINTER_ATTRIBUTE_ALLOWED_HANDLE_TYPES: CUpointer_attribute_enum = CUpointer_attribute_enum(\n        14,\n    );\n}\nimpl CUpointer_attribute_enum {\n    ///< 1 if the memory this pointer is referencing can be used with the GPUDirect RDMA API\n    pub const CU_POINTER_ATTRIBUTE_IS_GPU_DIRECT_RDMA_CAPABLE: CUpointer_attribute_enum = CUpointer_attribute_enum(\n        15,\n    );\n}\nimpl CUpointer_attribute_enum {\n    ///< Returns the access flags the device associated with the current context has on the corresponding memory referenced by the pointer given\n    pub const CU_POINTER_ATTRIBUTE_ACCESS_FLAGS: CUpointer_attribute_enum = CUpointer_attribute_enum(\n        16,\n    );\n}\nimpl CUpointer_attribute_enum {\n    ///< Returns the mempool handle for the allocation if it was allocated from a mempool. Otherwise returns NULL.\n    pub const CU_POINTER_ATTRIBUTE_MEMPOOL_HANDLE: CUpointer_attribute_enum = CUpointer_attribute_enum(\n        17,\n    );\n}\nimpl CUpointer_attribute_enum {\n    ///< Size of the actual underlying mapping that the pointer belongs to\n    pub const CU_POINTER_ATTRIBUTE_MAPPING_SIZE: CUpointer_attribute_enum = CUpointer_attribute_enum(\n        18,\n    );\n}\nimpl CUpointer_attribute_enum {\n    ///< The start address of the mapping that the pointer belongs to\n    pub const CU_POINTER_ATTRIBUTE_MAPPING_BASE_ADDR: CUpointer_attribute_enum = CUpointer_attribute_enum(\n        19,\n    );\n}\nimpl CUpointer_attribute_enum {\n    ///< A process-wide unique id corresponding to the physical allocation the pointer belongs to\n    pub const CU_POINTER_ATTRIBUTE_MEMORY_BLOCK_ID: CUpointer_attribute_enum = CUpointer_attribute_enum(\n        20,\n    );\n}\nimpl CUpointer_attribute_enum {\n    ///< Returns in \\p *data a boolean that indicates whether the pointer points to memory that is capable to be used for hardware accelerated decompression.\n    pub const CU_POINTER_ATTRIBUTE_IS_HW_DECOMPRESS_CAPABLE: CUpointer_attribute_enum = CUpointer_attribute_enum(\n        21,\n    );\n}\n#[repr(transparent)]\n/// Pointer information\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUpointer_attribute_enum(pub ::core::ffi::c_uint);\n/// Pointer information\npub use self::CUpointer_attribute_enum as CUpointer_attribute;\nimpl CUfunction_attribute_enum {\n    /** The maximum number of threads per block, beyond which a launch of the\n function would fail. This number depends on both the function and the\n device on which the function is currently loaded.*/\n    pub const CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK: CUfunction_attribute_enum = CUfunction_attribute_enum(\n        0,\n    );\n}\nimpl CUfunction_attribute_enum {\n    /** The size in bytes of statically-allocated shared memory required by\n this function. This does not include dynamically-allocated shared\n memory requested by the user at runtime.*/\n    pub const CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES: CUfunction_attribute_enum = CUfunction_attribute_enum(\n        1,\n    );\n}\nimpl CUfunction_attribute_enum {\n    /** The size in bytes of user-allocated constant memory required by this\n function.*/\n    pub const CU_FUNC_ATTRIBUTE_CONST_SIZE_BYTES: CUfunction_attribute_enum = CUfunction_attribute_enum(\n        2,\n    );\n}\nimpl CUfunction_attribute_enum {\n    /// The size in bytes of local memory used by each thread of this function.\n    pub const CU_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES: CUfunction_attribute_enum = CUfunction_attribute_enum(\n        3,\n    );\n}\nimpl CUfunction_attribute_enum {\n    /// The number of registers used by each thread of this function.\n    pub const CU_FUNC_ATTRIBUTE_NUM_REGS: CUfunction_attribute_enum = CUfunction_attribute_enum(\n        4,\n    );\n}\nimpl CUfunction_attribute_enum {\n    /** The PTX virtual architecture version for which the function was\n compiled. This value is the major PTX version * 10 + the minor PTX\n version, so a PTX version 1.3 function would return the value 13.\n Note that this may return the undefined value of 0 for cubins\n compiled prior to CUDA 3.0.*/\n    pub const CU_FUNC_ATTRIBUTE_PTX_VERSION: CUfunction_attribute_enum = CUfunction_attribute_enum(\n        5,\n    );\n}\nimpl CUfunction_attribute_enum {\n    /** The binary architecture version for which the function was compiled.\n This value is the major binary version * 10 + the minor binary version,\n so a binary version 1.3 function would return the value 13. Note that\n this will return a value of 10 for legacy cubins that do not have a\n properly-encoded binary architecture version.*/\n    pub const CU_FUNC_ATTRIBUTE_BINARY_VERSION: CUfunction_attribute_enum = CUfunction_attribute_enum(\n        6,\n    );\n}\nimpl CUfunction_attribute_enum {\n    /** The attribute to indicate whether the function has been compiled with\n user specified option \"-Xptxas --dlcm=ca\" set .*/\n    pub const CU_FUNC_ATTRIBUTE_CACHE_MODE_CA: CUfunction_attribute_enum = CUfunction_attribute_enum(\n        7,\n    );\n}\nimpl CUfunction_attribute_enum {\n    /** The maximum size in bytes of dynamically-allocated shared memory that can be used by\n this function. If the user-specified dynamic shared memory size is larger than this\n value, the launch will fail.\n The default value of this attribute is\n ::CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK - ::CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES,\n except when ::CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES is greater than\n ::CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK, then the default value of this attribute is 0.\n The value can be increased to ::CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK_OPTIN -\n ::CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES.\n See ::cuFuncSetAttribute, ::cuKernelSetAttribute*/\n    pub const CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES: CUfunction_attribute_enum = CUfunction_attribute_enum(\n        8,\n    );\n}\nimpl CUfunction_attribute_enum {\n    /** On devices where the L1 cache and shared memory use the same hardware resources,\n this sets the shared memory carveout preference, in percent of the total shared memory.\n Refer to ::CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_MULTIPROCESSOR.\n This is only a hint, and the driver can choose a different ratio if required to execute the function.\n See ::cuFuncSetAttribute, ::cuKernelSetAttribute*/\n    pub const CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT: CUfunction_attribute_enum = CUfunction_attribute_enum(\n        9,\n    );\n}\nimpl CUfunction_attribute_enum {\n    /** If this attribute is set, the kernel must launch with a valid cluster\n size specified.\n See ::cuFuncSetAttribute, ::cuKernelSetAttribute*/\n    pub const CU_FUNC_ATTRIBUTE_CLUSTER_SIZE_MUST_BE_SET: CUfunction_attribute_enum = CUfunction_attribute_enum(\n        10,\n    );\n}\nimpl CUfunction_attribute_enum {\n    /** The required cluster width in blocks. The values must either all be 0 or\n all be positive. The validity of the cluster dimensions is otherwise\n checked at launch time.\n\n If the value is set during compile time, it cannot be set at runtime.\n Setting it at runtime will return CUDA_ERROR_NOT_PERMITTED.\n See ::cuFuncSetAttribute, ::cuKernelSetAttribute*/\n    pub const CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_WIDTH: CUfunction_attribute_enum = CUfunction_attribute_enum(\n        11,\n    );\n}\nimpl CUfunction_attribute_enum {\n    /** The required cluster height in blocks. The values must either all be 0 or\n all be positive. The validity of the cluster dimensions is otherwise\n checked at launch time.\n\n If the value is set during compile time, it cannot be set at runtime.\n Setting it at runtime should return CUDA_ERROR_NOT_PERMITTED.\n See ::cuFuncSetAttribute, ::cuKernelSetAttribute*/\n    pub const CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_HEIGHT: CUfunction_attribute_enum = CUfunction_attribute_enum(\n        12,\n    );\n}\nimpl CUfunction_attribute_enum {\n    /** The required cluster depth in blocks. The values must either all be 0 or\n all be positive. The validity of the cluster dimensions is otherwise\n checked at launch time.\n\n If the value is set during compile time, it cannot be set at runtime.\n Setting it at runtime should return CUDA_ERROR_NOT_PERMITTED.\n See ::cuFuncSetAttribute, ::cuKernelSetAttribute*/\n    pub const CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_DEPTH: CUfunction_attribute_enum = CUfunction_attribute_enum(\n        13,\n    );\n}\nimpl CUfunction_attribute_enum {\n    /** Whether the function can be launched with non-portable cluster size. 1 is\n allowed, 0 is disallowed. A non-portable cluster size may only function\n on the specific SKUs the program is tested on. The launch might fail if\n the program is run on a different hardware platform.\n\n CUDA API provides cudaOccupancyMaxActiveClusters to assist with checking\n whether the desired size can be launched on the current device.\n\n Portable Cluster Size\n\n A portable cluster size is guaranteed to be functional on all compute\n capabilities higher than the target compute capability. The portable\n cluster size for sm_90 is 8 blocks per cluster. This value may increase\n for future compute capabilities.\n\n The specific hardware unit may support higher cluster sizes that’s not\n guaranteed to be portable.\n See ::cuFuncSetAttribute, ::cuKernelSetAttribute*/\n    pub const CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED: CUfunction_attribute_enum = CUfunction_attribute_enum(\n        14,\n    );\n}\nimpl CUfunction_attribute_enum {\n    /** The block scheduling policy of a function. The value type is\n CUclusterSchedulingPolicy / cudaClusterSchedulingPolicy.\n See ::cuFuncSetAttribute, ::cuKernelSetAttribute*/\n    pub const CU_FUNC_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE: CUfunction_attribute_enum = CUfunction_attribute_enum(\n        15,\n    );\n}\nimpl CUfunction_attribute_enum {\n    /** The block scheduling policy of a function. The value type is\n CUclusterSchedulingPolicy / cudaClusterSchedulingPolicy.\n See ::cuFuncSetAttribute, ::cuKernelSetAttribute*/\n    pub const CU_FUNC_ATTRIBUTE_MAX: CUfunction_attribute_enum = CUfunction_attribute_enum(\n        16,\n    );\n}\n#[repr(transparent)]\n/// Function properties\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUfunction_attribute_enum(pub ::core::ffi::c_uint);\n/// Function properties\npub use self::CUfunction_attribute_enum as CUfunction_attribute;\nimpl CUfunc_cache_enum {\n    ///< no preference for shared memory or L1 (default)\n    pub const CU_FUNC_CACHE_PREFER_NONE: CUfunc_cache_enum = CUfunc_cache_enum(0);\n}\nimpl CUfunc_cache_enum {\n    ///< prefer larger shared memory and smaller L1 cache\n    pub const CU_FUNC_CACHE_PREFER_SHARED: CUfunc_cache_enum = CUfunc_cache_enum(1);\n}\nimpl CUfunc_cache_enum {\n    ///< prefer larger L1 cache and smaller shared memory\n    pub const CU_FUNC_CACHE_PREFER_L1: CUfunc_cache_enum = CUfunc_cache_enum(2);\n}\nimpl CUfunc_cache_enum {\n    ///< prefer equal sized L1 cache and shared memory\n    pub const CU_FUNC_CACHE_PREFER_EQUAL: CUfunc_cache_enum = CUfunc_cache_enum(3);\n}\n#[repr(transparent)]\n/// Function cache configurations\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUfunc_cache_enum(pub ::core::ffi::c_uint);\n/// Function cache configurations\npub use self::CUfunc_cache_enum as CUfunc_cache;\nimpl CUsharedconfig_enum {\n    ///< set default shared memory bank size\n    pub const CU_SHARED_MEM_CONFIG_DEFAULT_BANK_SIZE: CUsharedconfig_enum = CUsharedconfig_enum(\n        0,\n    );\n}\nimpl CUsharedconfig_enum {\n    ///< set shared memory bank width to four bytes\n    pub const CU_SHARED_MEM_CONFIG_FOUR_BYTE_BANK_SIZE: CUsharedconfig_enum = CUsharedconfig_enum(\n        1,\n    );\n}\nimpl CUsharedconfig_enum {\n    ///< set shared memory bank width to eight bytes\n    pub const CU_SHARED_MEM_CONFIG_EIGHT_BYTE_BANK_SIZE: CUsharedconfig_enum = CUsharedconfig_enum(\n        2,\n    );\n}\n#[repr(transparent)]\n/** \\deprecated\n\n Shared memory configurations*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUsharedconfig_enum(pub ::core::ffi::c_uint);\n/** \\deprecated\n\n Shared memory configurations*/\npub use self::CUsharedconfig_enum as CUsharedconfig;\nimpl CUshared_carveout_enum {\n    ///< No preference for shared memory or L1 (default)\n    pub const CU_SHAREDMEM_CARVEOUT_DEFAULT: CUshared_carveout_enum = CUshared_carveout_enum(\n        -1,\n    );\n}\nimpl CUshared_carveout_enum {\n    ///< Prefer maximum available shared memory, minimum L1 cache\n    pub const CU_SHAREDMEM_CARVEOUT_MAX_SHARED: CUshared_carveout_enum = CUshared_carveout_enum(\n        100,\n    );\n}\nimpl CUshared_carveout_enum {\n    ///< Prefer maximum available L1 cache, minimum shared memory\n    pub const CU_SHAREDMEM_CARVEOUT_MAX_L1: CUshared_carveout_enum = CUshared_carveout_enum(\n        0,\n    );\n}\n#[repr(transparent)]\n/// Shared memory carveout configurations. These may be passed to ::cuFuncSetAttribute or ::cuKernelSetAttribute\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUshared_carveout_enum(pub ::core::ffi::c_int);\n/// Shared memory carveout configurations. These may be passed to ::cuFuncSetAttribute or ::cuKernelSetAttribute\npub use self::CUshared_carveout_enum as CUshared_carveout;\nimpl CUmemorytype_enum {\n    ///< Host memory\n    pub const CU_MEMORYTYPE_HOST: CUmemorytype_enum = CUmemorytype_enum(1);\n}\nimpl CUmemorytype_enum {\n    ///< Device memory\n    pub const CU_MEMORYTYPE_DEVICE: CUmemorytype_enum = CUmemorytype_enum(2);\n}\nimpl CUmemorytype_enum {\n    ///< Array memory\n    pub const CU_MEMORYTYPE_ARRAY: CUmemorytype_enum = CUmemorytype_enum(3);\n}\nimpl CUmemorytype_enum {\n    ///< Unified device or host memory\n    pub const CU_MEMORYTYPE_UNIFIED: CUmemorytype_enum = CUmemorytype_enum(4);\n}\n#[repr(transparent)]\n/// Memory types\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmemorytype_enum(pub ::core::ffi::c_uint);\n/// Memory types\npub use self::CUmemorytype_enum as CUmemorytype;\nimpl CUcomputemode_enum {\n    ///< Default compute mode (Multiple contexts allowed per device)\n    pub const CU_COMPUTEMODE_DEFAULT: CUcomputemode_enum = CUcomputemode_enum(0);\n}\nimpl CUcomputemode_enum {\n    ///< Compute-prohibited mode (No contexts can be created on this device at this time)\n    pub const CU_COMPUTEMODE_PROHIBITED: CUcomputemode_enum = CUcomputemode_enum(2);\n}\nimpl CUcomputemode_enum {\n    ///< Compute-exclusive-process mode (Only one context used by a single process can be present on this device at a time)\n    pub const CU_COMPUTEMODE_EXCLUSIVE_PROCESS: CUcomputemode_enum = CUcomputemode_enum(\n        3,\n    );\n}\n#[repr(transparent)]\n/// Compute Modes\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUcomputemode_enum(pub ::core::ffi::c_uint);\n/// Compute Modes\npub use self::CUcomputemode_enum as CUcomputemode;\nimpl CUmem_advise_enum {\n    ///< Data will mostly be read and only occasionally be written to\n    pub const CU_MEM_ADVISE_SET_READ_MOSTLY: CUmem_advise_enum = CUmem_advise_enum(1);\n}\nimpl CUmem_advise_enum {\n    ///< Undo the effect of ::CU_MEM_ADVISE_SET_READ_MOSTLY\n    pub const CU_MEM_ADVISE_UNSET_READ_MOSTLY: CUmem_advise_enum = CUmem_advise_enum(2);\n}\nimpl CUmem_advise_enum {\n    ///< Set the preferred location for the data as the specified device\n    pub const CU_MEM_ADVISE_SET_PREFERRED_LOCATION: CUmem_advise_enum = CUmem_advise_enum(\n        3,\n    );\n}\nimpl CUmem_advise_enum {\n    ///< Clear the preferred location for the data\n    pub const CU_MEM_ADVISE_UNSET_PREFERRED_LOCATION: CUmem_advise_enum = CUmem_advise_enum(\n        4,\n    );\n}\nimpl CUmem_advise_enum {\n    ///< Data will be accessed by the specified device, so prevent page faults as much as possible\n    pub const CU_MEM_ADVISE_SET_ACCESSED_BY: CUmem_advise_enum = CUmem_advise_enum(5);\n}\nimpl CUmem_advise_enum {\n    ///< Let the Unified Memory subsystem decide on the page faulting policy for the specified device\n    pub const CU_MEM_ADVISE_UNSET_ACCESSED_BY: CUmem_advise_enum = CUmem_advise_enum(6);\n}\n#[repr(transparent)]\n/// Memory advise values\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmem_advise_enum(pub ::core::ffi::c_uint);\n/// Memory advise values\npub use self::CUmem_advise_enum as CUmem_advise;\nimpl CUmem_range_attribute_enum {\n    ///< Whether the range will mostly be read and only occasionally be written to\n    pub const CU_MEM_RANGE_ATTRIBUTE_READ_MOSTLY: CUmem_range_attribute_enum = CUmem_range_attribute_enum(\n        1,\n    );\n}\nimpl CUmem_range_attribute_enum {\n    ///< The preferred location of the range\n    pub const CU_MEM_RANGE_ATTRIBUTE_PREFERRED_LOCATION: CUmem_range_attribute_enum = CUmem_range_attribute_enum(\n        2,\n    );\n}\nimpl CUmem_range_attribute_enum {\n    ///< Memory range has ::CU_MEM_ADVISE_SET_ACCESSED_BY set for specified device\n    pub const CU_MEM_RANGE_ATTRIBUTE_ACCESSED_BY: CUmem_range_attribute_enum = CUmem_range_attribute_enum(\n        3,\n    );\n}\nimpl CUmem_range_attribute_enum {\n    ///< The last location to which the range was prefetched\n    pub const CU_MEM_RANGE_ATTRIBUTE_LAST_PREFETCH_LOCATION: CUmem_range_attribute_enum = CUmem_range_attribute_enum(\n        4,\n    );\n}\nimpl CUmem_range_attribute_enum {\n    ///< The preferred location type of the range\n    pub const CU_MEM_RANGE_ATTRIBUTE_PREFERRED_LOCATION_TYPE: CUmem_range_attribute_enum = CUmem_range_attribute_enum(\n        5,\n    );\n}\nimpl CUmem_range_attribute_enum {\n    ///< The preferred location id of the range\n    pub const CU_MEM_RANGE_ATTRIBUTE_PREFERRED_LOCATION_ID: CUmem_range_attribute_enum = CUmem_range_attribute_enum(\n        6,\n    );\n}\nimpl CUmem_range_attribute_enum {\n    ///< The last location type to which the range was prefetched\n    pub const CU_MEM_RANGE_ATTRIBUTE_LAST_PREFETCH_LOCATION_TYPE: CUmem_range_attribute_enum = CUmem_range_attribute_enum(\n        7,\n    );\n}\nimpl CUmem_range_attribute_enum {\n    ///< The last location id to which the range was prefetched\n    pub const CU_MEM_RANGE_ATTRIBUTE_LAST_PREFETCH_LOCATION_ID: CUmem_range_attribute_enum = CUmem_range_attribute_enum(\n        8,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmem_range_attribute_enum(pub ::core::ffi::c_uint);\npub use self::CUmem_range_attribute_enum as CUmem_range_attribute;\nimpl CUjit_option_enum {\n    /** Max number of registers that a thread may use.\\n\n Option type: unsigned int\\n\n Applies to: compiler only*/\n    pub const CU_JIT_MAX_REGISTERS: CUjit_option_enum = CUjit_option_enum(0);\n}\nimpl CUjit_option_enum {\n    /** IN: Specifies minimum number of threads per block to target compilation\n for\\n\n OUT: Returns the number of threads the compiler actually targeted.\n This restricts the resource utilization of the compiler (e.g. max\n registers) such that a block with the given number of threads should be\n able to launch based on register limitations. Note, this option does not\n currently take into account any other resource limitations, such as\n shared memory utilization.\\n\n Cannot be combined with ::CU_JIT_TARGET.\\n\n Option type: unsigned int\\n\n Applies to: compiler only*/\n    pub const CU_JIT_THREADS_PER_BLOCK: CUjit_option_enum = CUjit_option_enum(1);\n}\nimpl CUjit_option_enum {\n    /** Overwrites the option value with the total wall clock time, in\n milliseconds, spent in the compiler and linker\\n\n Option type: float\\n\n Applies to: compiler and linker*/\n    pub const CU_JIT_WALL_TIME: CUjit_option_enum = CUjit_option_enum(2);\n}\nimpl CUjit_option_enum {\n    /** Pointer to a buffer in which to print any log messages\n that are informational in nature (the buffer size is specified via\n option ::CU_JIT_INFO_LOG_BUFFER_SIZE_BYTES)\\n\n Option type: char *\\n\n Applies to: compiler and linker*/\n    pub const CU_JIT_INFO_LOG_BUFFER: CUjit_option_enum = CUjit_option_enum(3);\n}\nimpl CUjit_option_enum {\n    /** IN: Log buffer size in bytes.  Log messages will be capped at this size\n (including null terminator)\\n\n OUT: Amount of log buffer filled with messages\\n\n Option type: unsigned int\\n\n Applies to: compiler and linker*/\n    pub const CU_JIT_INFO_LOG_BUFFER_SIZE_BYTES: CUjit_option_enum = CUjit_option_enum(\n        4,\n    );\n}\nimpl CUjit_option_enum {\n    /** Pointer to a buffer in which to print any log messages that\n reflect errors (the buffer size is specified via option\n ::CU_JIT_ERROR_LOG_BUFFER_SIZE_BYTES)\\n\n Option type: char *\\n\n Applies to: compiler and linker*/\n    pub const CU_JIT_ERROR_LOG_BUFFER: CUjit_option_enum = CUjit_option_enum(5);\n}\nimpl CUjit_option_enum {\n    /** IN: Log buffer size in bytes.  Log messages will be capped at this size\n (including null terminator)\\n\n OUT: Amount of log buffer filled with messages\\n\n Option type: unsigned int\\n\n Applies to: compiler and linker*/\n    pub const CU_JIT_ERROR_LOG_BUFFER_SIZE_BYTES: CUjit_option_enum = CUjit_option_enum(\n        6,\n    );\n}\nimpl CUjit_option_enum {\n    /** Level of optimizations to apply to generated code (0 - 4), with 4\n being the default and highest level of optimizations.\\n\n Option type: unsigned int\\n\n Applies to: compiler only*/\n    pub const CU_JIT_OPTIMIZATION_LEVEL: CUjit_option_enum = CUjit_option_enum(7);\n}\nimpl CUjit_option_enum {\n    /** No option value required. Determines the target based on the current\n attached context (default)\\n\n Option type: No option value needed\\n\n Applies to: compiler and linker*/\n    pub const CU_JIT_TARGET_FROM_CUCONTEXT: CUjit_option_enum = CUjit_option_enum(8);\n}\nimpl CUjit_option_enum {\n    /** Target is chosen based on supplied ::CUjit_target.  Cannot be\n combined with ::CU_JIT_THREADS_PER_BLOCK.\\n\n Option type: unsigned int for enumerated type ::CUjit_target\\n\n Applies to: compiler and linker*/\n    pub const CU_JIT_TARGET: CUjit_option_enum = CUjit_option_enum(9);\n}\nimpl CUjit_option_enum {\n    /** Specifies choice of fallback strategy if matching cubin is not found.\n Choice is based on supplied ::CUjit_fallback.  This option cannot be\n used with cuLink* APIs as the linker requires exact matches.\\n\n Option type: unsigned int for enumerated type ::CUjit_fallback\\n\n Applies to: compiler only*/\n    pub const CU_JIT_FALLBACK_STRATEGY: CUjit_option_enum = CUjit_option_enum(10);\n}\nimpl CUjit_option_enum {\n    /** Specifies whether to create debug information in output (-g)\n (0: false, default)\\n\n Option type: int\\n\n Applies to: compiler and linker*/\n    pub const CU_JIT_GENERATE_DEBUG_INFO: CUjit_option_enum = CUjit_option_enum(11);\n}\nimpl CUjit_option_enum {\n    /** Generate verbose log messages (0: false, default)\\n\n Option type: int\\n\n Applies to: compiler and linker*/\n    pub const CU_JIT_LOG_VERBOSE: CUjit_option_enum = CUjit_option_enum(12);\n}\nimpl CUjit_option_enum {\n    /** Generate line number information (-lineinfo) (0: false, default)\\n\n Option type: int\\n\n Applies to: compiler only*/\n    pub const CU_JIT_GENERATE_LINE_INFO: CUjit_option_enum = CUjit_option_enum(13);\n}\nimpl CUjit_option_enum {\n    /** Specifies whether to enable caching explicitly (-dlcm) \\n\n Choice is based on supplied ::CUjit_cacheMode_enum.\\n\n Option type: unsigned int for enumerated type ::CUjit_cacheMode_enum\\n\n Applies to: compiler only*/\n    pub const CU_JIT_CACHE_MODE: CUjit_option_enum = CUjit_option_enum(14);\n}\nimpl CUjit_option_enum {\n    /** \\deprecated\n This jit option is deprecated and should not be used.*/\n    pub const CU_JIT_NEW_SM3X_OPT: CUjit_option_enum = CUjit_option_enum(15);\n}\nimpl CUjit_option_enum {\n    /// This jit option is used for internal purpose only.\n    pub const CU_JIT_FAST_COMPILE: CUjit_option_enum = CUjit_option_enum(16);\n}\nimpl CUjit_option_enum {\n    /** Array of device symbol names that will be relocated to the corresponding\n host addresses stored in ::CU_JIT_GLOBAL_SYMBOL_ADDRESSES.\\n\n Must contain ::CU_JIT_GLOBAL_SYMBOL_COUNT entries.\\n\n When loading a device module, driver will relocate all encountered\n unresolved symbols to the host addresses.\\n\n It is only allowed to register symbols that correspond to unresolved\n global variables.\\n\n It is illegal to register the same device symbol at multiple addresses.\\n\n Option type: const char **\\n\n Applies to: dynamic linker only*/\n    pub const CU_JIT_GLOBAL_SYMBOL_NAMES: CUjit_option_enum = CUjit_option_enum(17);\n}\nimpl CUjit_option_enum {\n    /** Array of host addresses that will be used to relocate corresponding\n device symbols stored in ::CU_JIT_GLOBAL_SYMBOL_NAMES.\\n\n Must contain ::CU_JIT_GLOBAL_SYMBOL_COUNT entries.\\n\n Option type: void **\\n\n Applies to: dynamic linker only*/\n    pub const CU_JIT_GLOBAL_SYMBOL_ADDRESSES: CUjit_option_enum = CUjit_option_enum(18);\n}\nimpl CUjit_option_enum {\n    /** Number of entries in ::CU_JIT_GLOBAL_SYMBOL_NAMES and\n ::CU_JIT_GLOBAL_SYMBOL_ADDRESSES arrays.\\n\n Option type: unsigned int\\n\n Applies to: dynamic linker only*/\n    pub const CU_JIT_GLOBAL_SYMBOL_COUNT: CUjit_option_enum = CUjit_option_enum(19);\n}\nimpl CUjit_option_enum {\n    /** \\deprecated\n Enable link-time optimization (-dlto) for device code (Disabled by default).\\n\n This option is not supported on 32-bit platforms.\\n\n Option type: int\\n\n Applies to: compiler and linker\n\n Only valid with LTO-IR compiled with toolkits prior to CUDA 12.0*/\n    pub const CU_JIT_LTO: CUjit_option_enum = CUjit_option_enum(20);\n}\nimpl CUjit_option_enum {\n    /** \\deprecated\n Control single-precision denormals (-ftz) support (0: false, default).\n 1 : flushes denormal values to zero\n 0 : preserves denormal values\n Option type: int\\n\n Applies to: link-time optimization specified with CU_JIT_LTO\n\n Only valid with LTO-IR compiled with toolkits prior to CUDA 12.0*/\n    pub const CU_JIT_FTZ: CUjit_option_enum = CUjit_option_enum(21);\n}\nimpl CUjit_option_enum {\n    /** \\deprecated\n Control single-precision floating-point division and reciprocals\n (-prec-div) support (1: true, default).\n 1 : Enables the IEEE round-to-nearest mode\n 0 : Enables the fast approximation mode\n Option type: int\\n\n Applies to: link-time optimization specified with CU_JIT_LTO\n\n Only valid with LTO-IR compiled with toolkits prior to CUDA 12.0*/\n    pub const CU_JIT_PREC_DIV: CUjit_option_enum = CUjit_option_enum(22);\n}\nimpl CUjit_option_enum {\n    /** \\deprecated\n Control single-precision floating-point square root\n (-prec-sqrt) support (1: true, default).\n 1 : Enables the IEEE round-to-nearest mode\n 0 : Enables the fast approximation mode\n Option type: int\\n\n Applies to: link-time optimization specified with CU_JIT_LTO\n\n Only valid with LTO-IR compiled with toolkits prior to CUDA 12.0*/\n    pub const CU_JIT_PREC_SQRT: CUjit_option_enum = CUjit_option_enum(23);\n}\nimpl CUjit_option_enum {\n    /** \\deprecated\n Enable/Disable the contraction of floating-point multiplies\n and adds/subtracts into floating-point multiply-add (-fma)\n operations (1: Enable, default; 0: Disable).\n Option type: int\\n\n Applies to: link-time optimization specified with CU_JIT_LTO\n\n Only valid with LTO-IR compiled with toolkits prior to CUDA 12.0*/\n    pub const CU_JIT_FMA: CUjit_option_enum = CUjit_option_enum(24);\n}\nimpl CUjit_option_enum {\n    /** \\deprecated\n Array of kernel names that should be preserved at link time while others\n can be removed.\\n\n Must contain ::CU_JIT_REFERENCED_KERNEL_COUNT entries.\\n\n Note that kernel names can be mangled by the compiler in which case the\n mangled name needs to be specified.\\n\n Wildcard \"*\" can be used to represent zero or more characters instead of\n specifying the full or mangled name.\\n\n It is important to note that the wildcard \"*\" is also added implicitly.\n For example, specifying \"foo\" will match \"foobaz\", \"barfoo\", \"barfoobaz\" and\n thus preserve all kernels with those names. This can be avoided by providing\n a more specific name like \"barfoobaz\".\\n\n Option type: const char **\\n\n Applies to: dynamic linker only\n\n Only valid with LTO-IR compiled with toolkits prior to CUDA 12.0*/\n    pub const CU_JIT_REFERENCED_KERNEL_NAMES: CUjit_option_enum = CUjit_option_enum(25);\n}\nimpl CUjit_option_enum {\n    /** \\deprecated\n Number of entries in ::CU_JIT_REFERENCED_KERNEL_NAMES array.\\n\n Option type: unsigned int\\n\n Applies to: dynamic linker only\n\n Only valid with LTO-IR compiled with toolkits prior to CUDA 12.0*/\n    pub const CU_JIT_REFERENCED_KERNEL_COUNT: CUjit_option_enum = CUjit_option_enum(26);\n}\nimpl CUjit_option_enum {\n    /** \\deprecated\n Array of variable names (__device__ and/or __constant__) that should be\n preserved at link time while others can be removed.\\n\n Must contain ::CU_JIT_REFERENCED_VARIABLE_COUNT entries.\\n\n Note that variable names can be mangled by the compiler in which case the\n mangled name needs to be specified.\\n\n Wildcard \"*\" can be used to represent zero or more characters instead of\n specifying the full or mangled name.\\n\n It is important to note that the wildcard \"*\" is also added implicitly.\n For example, specifying \"foo\" will match \"foobaz\", \"barfoo\", \"barfoobaz\" and\n thus preserve all variables with those names. This can be avoided by providing\n a more specific name like \"barfoobaz\".\\n\n Option type: const char **\\n\n Applies to: link-time optimization specified with CU_JIT_LTO\n\n Only valid with LTO-IR compiled with toolkits prior to CUDA 12.0*/\n    pub const CU_JIT_REFERENCED_VARIABLE_NAMES: CUjit_option_enum = CUjit_option_enum(\n        27,\n    );\n}\nimpl CUjit_option_enum {\n    /** \\deprecated\n Number of entries in ::CU_JIT_REFERENCED_VARIABLE_NAMES array.\\n\n Option type: unsigned int\\n\n Applies to: link-time optimization specified with CU_JIT_LTO\n\n Only valid with LTO-IR compiled with toolkits prior to CUDA 12.0*/\n    pub const CU_JIT_REFERENCED_VARIABLE_COUNT: CUjit_option_enum = CUjit_option_enum(\n        28,\n    );\n}\nimpl CUjit_option_enum {\n    /** \\deprecated\n This option serves as a hint to enable the JIT compiler/linker\n to remove constant (__constant__) and device (__device__) variables\n unreferenced in device code (Disabled by default).\\n\n Note that host references to constant and device variables using APIs like\n ::cuModuleGetGlobal() with this option specified may result in undefined behavior unless\n the variables are explicitly specified using ::CU_JIT_REFERENCED_VARIABLE_NAMES.\\n\n Option type: int\\n\n Applies to: link-time optimization specified with CU_JIT_LTO\n\n Only valid with LTO-IR compiled with toolkits prior to CUDA 12.0*/\n    pub const CU_JIT_OPTIMIZE_UNUSED_DEVICE_VARIABLES: CUjit_option_enum = CUjit_option_enum(\n        29,\n    );\n}\nimpl CUjit_option_enum {\n    /** Generate position independent code (0: false)\\n\n Option type: int\\n\n Applies to: compiler only*/\n    pub const CU_JIT_POSITION_INDEPENDENT_CODE: CUjit_option_enum = CUjit_option_enum(\n        30,\n    );\n}\nimpl CUjit_option_enum {\n    /** This option hints to the JIT compiler the minimum number of CTAs from the\n kernel’s grid to be mapped to a SM. This option is ignored when used together\n with ::CU_JIT_MAX_REGISTERS or ::CU_JIT_THREADS_PER_BLOCK.\n Optimizations based on this option need ::CU_JIT_MAX_THREADS_PER_BLOCK to\n be specified as well. For kernels already using PTX directive .minnctapersm,\n this option will be ignored by default. Use ::CU_JIT_OVERRIDE_DIRECTIVE_VALUES\n to let this option take precedence over the PTX directive.\n Option type: unsigned int\\n\n Applies to: compiler only*/\n    pub const CU_JIT_MIN_CTA_PER_SM: CUjit_option_enum = CUjit_option_enum(31);\n}\nimpl CUjit_option_enum {\n    /** Maximum number threads in a thread block, computed as the product of\n the maximum extent specifed for each dimension of the block. This limit\n is guaranteed not to be exeeded in any invocation of the kernel. Exceeding\n the the maximum number of threads results in runtime error or kernel launch\n failure. For kernels already using PTX directive .maxntid, this option will\n be ignored by default. Use ::CU_JIT_OVERRIDE_DIRECTIVE_VALUES to let this\n option take precedence over the PTX directive.\n Option type: int\\n\n Applies to: compiler only*/\n    pub const CU_JIT_MAX_THREADS_PER_BLOCK: CUjit_option_enum = CUjit_option_enum(32);\n}\nimpl CUjit_option_enum {\n    /** This option lets the values specified using ::CU_JIT_MAX_REGISTERS,\n ::CU_JIT_THREADS_PER_BLOCK, ::CU_JIT_MAX_THREADS_PER_BLOCK and\n ::CU_JIT_MIN_CTA_PER_SM take precedence over any PTX directives.\n (0: Disable, default; 1: Enable)\n Option type: int\\n\n Applies to: compiler only*/\n    pub const CU_JIT_OVERRIDE_DIRECTIVE_VALUES: CUjit_option_enum = CUjit_option_enum(\n        33,\n    );\n}\nimpl CUjit_option_enum {\n    /** This option specifies the maximum number of concurrent threads to use\n when running compiler optimizations. If the specified value is 1, the\n option will be ignored. If the specified value is 0, the number of\n threads will match the number of CPUs on the underlying machine.\n Otherwise, if the option is N, then up to N threads will be used.\n Option type: unsigned int\\n\n Applies to: compiler only*/\n    pub const CU_JIT_SPLIT_COMPILE: CUjit_option_enum = CUjit_option_enum(34);\n}\nimpl CUjit_option_enum {\n    /** This option specifies the maximum number of concurrent threads to use\n when running compiler optimizations. If the specified value is 1, the\n option will be ignored. If the specified value is 0, the number of\n threads will match the number of CPUs on the underlying machine.\n Otherwise, if the option is N, then up to N threads will be used.\n Option type: unsigned int\\n\n Applies to: compiler only*/\n    pub const CU_JIT_NUM_OPTIONS: CUjit_option_enum = CUjit_option_enum(35);\n}\n#[repr(transparent)]\n/// Online compiler and linker options\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUjit_option_enum(pub ::core::ffi::c_uint);\n/// Online compiler and linker options\npub use self::CUjit_option_enum as CUjit_option;\nimpl CUjit_target_enum {\n    ///< Compute device class 3.0\n    pub const CU_TARGET_COMPUTE_30: CUjit_target_enum = CUjit_target_enum(30);\n}\nimpl CUjit_target_enum {\n    ///< Compute device class 3.2\n    pub const CU_TARGET_COMPUTE_32: CUjit_target_enum = CUjit_target_enum(32);\n}\nimpl CUjit_target_enum {\n    ///< Compute device class 3.5\n    pub const CU_TARGET_COMPUTE_35: CUjit_target_enum = CUjit_target_enum(35);\n}\nimpl CUjit_target_enum {\n    ///< Compute device class 3.7\n    pub const CU_TARGET_COMPUTE_37: CUjit_target_enum = CUjit_target_enum(37);\n}\nimpl CUjit_target_enum {\n    ///< Compute device class 5.0\n    pub const CU_TARGET_COMPUTE_50: CUjit_target_enum = CUjit_target_enum(50);\n}\nimpl CUjit_target_enum {\n    ///< Compute device class 5.2\n    pub const CU_TARGET_COMPUTE_52: CUjit_target_enum = CUjit_target_enum(52);\n}\nimpl CUjit_target_enum {\n    ///< Compute device class 5.3\n    pub const CU_TARGET_COMPUTE_53: CUjit_target_enum = CUjit_target_enum(53);\n}\nimpl CUjit_target_enum {\n    ///< Compute device class 6.0.\n    pub const CU_TARGET_COMPUTE_60: CUjit_target_enum = CUjit_target_enum(60);\n}\nimpl CUjit_target_enum {\n    ///< Compute device class 6.1.\n    pub const CU_TARGET_COMPUTE_61: CUjit_target_enum = CUjit_target_enum(61);\n}\nimpl CUjit_target_enum {\n    ///< Compute device class 6.2.\n    pub const CU_TARGET_COMPUTE_62: CUjit_target_enum = CUjit_target_enum(62);\n}\nimpl CUjit_target_enum {\n    ///< Compute device class 7.0.\n    pub const CU_TARGET_COMPUTE_70: CUjit_target_enum = CUjit_target_enum(70);\n}\nimpl CUjit_target_enum {\n    ///< Compute device class 7.2.\n    pub const CU_TARGET_COMPUTE_72: CUjit_target_enum = CUjit_target_enum(72);\n}\nimpl CUjit_target_enum {\n    ///< Compute device class 7.5.\n    pub const CU_TARGET_COMPUTE_75: CUjit_target_enum = CUjit_target_enum(75);\n}\nimpl CUjit_target_enum {\n    ///< Compute device class 8.0.\n    pub const CU_TARGET_COMPUTE_80: CUjit_target_enum = CUjit_target_enum(80);\n}\nimpl CUjit_target_enum {\n    ///< Compute device class 8.6.\n    pub const CU_TARGET_COMPUTE_86: CUjit_target_enum = CUjit_target_enum(86);\n}\nimpl CUjit_target_enum {\n    ///< Compute device class 8.7.\n    pub const CU_TARGET_COMPUTE_87: CUjit_target_enum = CUjit_target_enum(87);\n}\nimpl CUjit_target_enum {\n    ///< Compute device class 8.9.\n    pub const CU_TARGET_COMPUTE_89: CUjit_target_enum = CUjit_target_enum(89);\n}\nimpl CUjit_target_enum {\n    ///< Compute device class 9.0.\n    pub const CU_TARGET_COMPUTE_90: CUjit_target_enum = CUjit_target_enum(90);\n}\nimpl CUjit_target_enum {\n    ///< Compute device class 10.0.\n    pub const CU_TARGET_COMPUTE_100: CUjit_target_enum = CUjit_target_enum(100);\n}\nimpl CUjit_target_enum {\n    ///< Compute device class 11.0.\n    pub const CU_TARGET_COMPUTE_110: CUjit_target_enum = CUjit_target_enum(110);\n}\nimpl CUjit_target_enum {\n    ///< Compute device class 10.3.\n    pub const CU_TARGET_COMPUTE_103: CUjit_target_enum = CUjit_target_enum(103);\n}\nimpl CUjit_target_enum {\n    ///< Compute device class 12.0.\n    pub const CU_TARGET_COMPUTE_120: CUjit_target_enum = CUjit_target_enum(120);\n}\nimpl CUjit_target_enum {\n    ///< Compute device class 12.1.\n    pub const CU_TARGET_COMPUTE_121: CUjit_target_enum = CUjit_target_enum(121);\n}\nimpl CUjit_target_enum {\n    pub const CU_TARGET_COMPUTE_90A: CUjit_target_enum = CUjit_target_enum(65626);\n}\nimpl CUjit_target_enum {\n    pub const CU_TARGET_COMPUTE_100A: CUjit_target_enum = CUjit_target_enum(65636);\n}\nimpl CUjit_target_enum {\n    pub const CU_TARGET_COMPUTE_110A: CUjit_target_enum = CUjit_target_enum(65646);\n}\nimpl CUjit_target_enum {\n    pub const CU_TARGET_COMPUTE_103A: CUjit_target_enum = CUjit_target_enum(65639);\n}\nimpl CUjit_target_enum {\n    pub const CU_TARGET_COMPUTE_120A: CUjit_target_enum = CUjit_target_enum(65656);\n}\nimpl CUjit_target_enum {\n    pub const CU_TARGET_COMPUTE_121A: CUjit_target_enum = CUjit_target_enum(65657);\n}\nimpl CUjit_target_enum {\n    pub const CU_TARGET_COMPUTE_100F: CUjit_target_enum = CUjit_target_enum(131172);\n}\nimpl CUjit_target_enum {\n    pub const CU_TARGET_COMPUTE_110F: CUjit_target_enum = CUjit_target_enum(131182);\n}\nimpl CUjit_target_enum {\n    pub const CU_TARGET_COMPUTE_103F: CUjit_target_enum = CUjit_target_enum(131175);\n}\nimpl CUjit_target_enum {\n    pub const CU_TARGET_COMPUTE_120F: CUjit_target_enum = CUjit_target_enum(131192);\n}\nimpl CUjit_target_enum {\n    pub const CU_TARGET_COMPUTE_121F: CUjit_target_enum = CUjit_target_enum(131193);\n}\n#[repr(transparent)]\n/// Online compilation targets\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUjit_target_enum(pub ::core::ffi::c_uint);\n/// Online compilation targets\npub use self::CUjit_target_enum as CUjit_target;\nimpl CUjit_fallback_enum {\n    ///< Prefer to compile ptx if exact binary match not found\n    pub const CU_PREFER_PTX: CUjit_fallback_enum = CUjit_fallback_enum(0);\n}\nimpl CUjit_fallback_enum {\n    ///< Prefer to fall back to compatible binary code if exact match not found\n    pub const CU_PREFER_BINARY: CUjit_fallback_enum = CUjit_fallback_enum(1);\n}\n#[repr(transparent)]\n/// Cubin matching fallback strategies\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUjit_fallback_enum(pub ::core::ffi::c_uint);\n/// Cubin matching fallback strategies\npub use self::CUjit_fallback_enum as CUjit_fallback;\nimpl CUjit_cacheMode_enum {\n    ///< Compile with no -dlcm flag specified\n    pub const CU_JIT_CACHE_OPTION_NONE: CUjit_cacheMode_enum = CUjit_cacheMode_enum(0);\n}\nimpl CUjit_cacheMode_enum {\n    ///< Compile with L1 cache disabled\n    pub const CU_JIT_CACHE_OPTION_CG: CUjit_cacheMode_enum = CUjit_cacheMode_enum(1);\n}\nimpl CUjit_cacheMode_enum {\n    ///< Compile with L1 cache enabled\n    pub const CU_JIT_CACHE_OPTION_CA: CUjit_cacheMode_enum = CUjit_cacheMode_enum(2);\n}\n#[repr(transparent)]\n/// Caching modes for dlcm\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUjit_cacheMode_enum(pub ::core::ffi::c_uint);\n/// Caching modes for dlcm\npub use self::CUjit_cacheMode_enum as CUjit_cacheMode;\nimpl CUjitInputType_enum {\n    /** Compiled device-class-specific device code\\n\n Applicable options: none*/\n    pub const CU_JIT_INPUT_CUBIN: CUjitInputType_enum = CUjitInputType_enum(0);\n}\nimpl CUjitInputType_enum {\n    /** PTX source code\\n\n Applicable options: PTX compiler options*/\n    pub const CU_JIT_INPUT_PTX: CUjitInputType_enum = CUjitInputType_enum(1);\n}\nimpl CUjitInputType_enum {\n    /** Bundle of multiple cubins and/or PTX of some device code\\n\n Applicable options: PTX compiler options, ::CU_JIT_FALLBACK_STRATEGY*/\n    pub const CU_JIT_INPUT_FATBINARY: CUjitInputType_enum = CUjitInputType_enum(2);\n}\nimpl CUjitInputType_enum {\n    /** Host object with embedded device code\\n\n Applicable options: PTX compiler options, ::CU_JIT_FALLBACK_STRATEGY*/\n    pub const CU_JIT_INPUT_OBJECT: CUjitInputType_enum = CUjitInputType_enum(3);\n}\nimpl CUjitInputType_enum {\n    /** Archive of host objects with embedded device code\\n\n Applicable options: PTX compiler options, ::CU_JIT_FALLBACK_STRATEGY*/\n    pub const CU_JIT_INPUT_LIBRARY: CUjitInputType_enum = CUjitInputType_enum(4);\n}\nimpl CUjitInputType_enum {\n    /** \\deprecated\n High-level intermediate code for link-time optimization\\n\n Applicable options: NVVM compiler options, PTX compiler options\n\n Only valid with LTO-IR compiled with toolkits prior to CUDA 12.0*/\n    pub const CU_JIT_INPUT_NVVM: CUjitInputType_enum = CUjitInputType_enum(5);\n}\nimpl CUjitInputType_enum {\n    /** \\deprecated\n High-level intermediate code for link-time optimization\\n\n Applicable options: NVVM compiler options, PTX compiler options\n\n Only valid with LTO-IR compiled with toolkits prior to CUDA 12.0*/\n    pub const CU_JIT_NUM_INPUT_TYPES: CUjitInputType_enum = CUjitInputType_enum(6);\n}\n#[repr(transparent)]\n/// Device code formats\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUjitInputType_enum(pub ::core::ffi::c_uint);\n/// Device code formats\npub use self::CUjitInputType_enum as CUjitInputType;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct CUlinkState_st {\n    _unused: [u8; 0],\n}\npub type CUlinkState = *mut CUlinkState_st;\nimpl CUgraphicsRegisterFlags_enum {\n    pub const CU_GRAPHICS_REGISTER_FLAGS_NONE: CUgraphicsRegisterFlags_enum = CUgraphicsRegisterFlags_enum(\n        0,\n    );\n}\nimpl CUgraphicsRegisterFlags_enum {\n    pub const CU_GRAPHICS_REGISTER_FLAGS_READ_ONLY: CUgraphicsRegisterFlags_enum = CUgraphicsRegisterFlags_enum(\n        1,\n    );\n}\nimpl CUgraphicsRegisterFlags_enum {\n    pub const CU_GRAPHICS_REGISTER_FLAGS_WRITE_DISCARD: CUgraphicsRegisterFlags_enum = CUgraphicsRegisterFlags_enum(\n        2,\n    );\n}\nimpl CUgraphicsRegisterFlags_enum {\n    pub const CU_GRAPHICS_REGISTER_FLAGS_SURFACE_LDST: CUgraphicsRegisterFlags_enum = CUgraphicsRegisterFlags_enum(\n        4,\n    );\n}\nimpl CUgraphicsRegisterFlags_enum {\n    pub const CU_GRAPHICS_REGISTER_FLAGS_TEXTURE_GATHER: CUgraphicsRegisterFlags_enum = CUgraphicsRegisterFlags_enum(\n        8,\n    );\n}\n#[repr(transparent)]\n/// Flags to register a graphics resource\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUgraphicsRegisterFlags_enum(pub ::core::ffi::c_uint);\n/// Flags to register a graphics resource\npub use self::CUgraphicsRegisterFlags_enum as CUgraphicsRegisterFlags;\nimpl CUgraphicsMapResourceFlags_enum {\n    pub const CU_GRAPHICS_MAP_RESOURCE_FLAGS_NONE: CUgraphicsMapResourceFlags_enum = CUgraphicsMapResourceFlags_enum(\n        0,\n    );\n}\nimpl CUgraphicsMapResourceFlags_enum {\n    pub const CU_GRAPHICS_MAP_RESOURCE_FLAGS_READ_ONLY: CUgraphicsMapResourceFlags_enum = CUgraphicsMapResourceFlags_enum(\n        1,\n    );\n}\nimpl CUgraphicsMapResourceFlags_enum {\n    pub const CU_GRAPHICS_MAP_RESOURCE_FLAGS_WRITE_DISCARD: CUgraphicsMapResourceFlags_enum = CUgraphicsMapResourceFlags_enum(\n        2,\n    );\n}\n#[repr(transparent)]\n/// Flags for mapping and unmapping interop resources\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUgraphicsMapResourceFlags_enum(pub ::core::ffi::c_uint);\n/// Flags for mapping and unmapping interop resources\npub use self::CUgraphicsMapResourceFlags_enum as CUgraphicsMapResourceFlags;\nimpl CUarray_cubemap_face_enum {\n    ///< Positive X face of cubemap\n    pub const CU_CUBEMAP_FACE_POSITIVE_X: CUarray_cubemap_face_enum = CUarray_cubemap_face_enum(\n        0,\n    );\n}\nimpl CUarray_cubemap_face_enum {\n    ///< Negative X face of cubemap\n    pub const CU_CUBEMAP_FACE_NEGATIVE_X: CUarray_cubemap_face_enum = CUarray_cubemap_face_enum(\n        1,\n    );\n}\nimpl CUarray_cubemap_face_enum {\n    ///< Positive Y face of cubemap\n    pub const CU_CUBEMAP_FACE_POSITIVE_Y: CUarray_cubemap_face_enum = CUarray_cubemap_face_enum(\n        2,\n    );\n}\nimpl CUarray_cubemap_face_enum {\n    ///< Negative Y face of cubemap\n    pub const CU_CUBEMAP_FACE_NEGATIVE_Y: CUarray_cubemap_face_enum = CUarray_cubemap_face_enum(\n        3,\n    );\n}\nimpl CUarray_cubemap_face_enum {\n    ///< Positive Z face of cubemap\n    pub const CU_CUBEMAP_FACE_POSITIVE_Z: CUarray_cubemap_face_enum = CUarray_cubemap_face_enum(\n        4,\n    );\n}\nimpl CUarray_cubemap_face_enum {\n    ///< Negative Z face of cubemap\n    pub const CU_CUBEMAP_FACE_NEGATIVE_Z: CUarray_cubemap_face_enum = CUarray_cubemap_face_enum(\n        5,\n    );\n}\n#[repr(transparent)]\n/// Array indices for cube faces\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUarray_cubemap_face_enum(pub ::core::ffi::c_uint);\n/// Array indices for cube faces\npub use self::CUarray_cubemap_face_enum as CUarray_cubemap_face;\nimpl CUlimit_enum {\n    ///< GPU thread stack size\n    pub const CU_LIMIT_STACK_SIZE: CUlimit_enum = CUlimit_enum(0);\n}\nimpl CUlimit_enum {\n    ///< GPU printf FIFO size\n    pub const CU_LIMIT_PRINTF_FIFO_SIZE: CUlimit_enum = CUlimit_enum(1);\n}\nimpl CUlimit_enum {\n    ///< GPU malloc heap size\n    pub const CU_LIMIT_MALLOC_HEAP_SIZE: CUlimit_enum = CUlimit_enum(2);\n}\nimpl CUlimit_enum {\n    ///< GPU device runtime launch synchronize depth\n    pub const CU_LIMIT_DEV_RUNTIME_SYNC_DEPTH: CUlimit_enum = CUlimit_enum(3);\n}\nimpl CUlimit_enum {\n    ///< GPU device runtime pending launch count\n    pub const CU_LIMIT_DEV_RUNTIME_PENDING_LAUNCH_COUNT: CUlimit_enum = CUlimit_enum(4);\n}\nimpl CUlimit_enum {\n    ///< A value between 0 and 128 that indicates the maximum fetch granularity of L2 (in Bytes). This is a hint\n    pub const CU_LIMIT_MAX_L2_FETCH_GRANULARITY: CUlimit_enum = CUlimit_enum(5);\n}\nimpl CUlimit_enum {\n    ///< A size in bytes for L2 persisting lines cache size\n    pub const CU_LIMIT_PERSISTING_L2_CACHE_SIZE: CUlimit_enum = CUlimit_enum(6);\n}\nimpl CUlimit_enum {\n    ///< A maximum size in bytes of shared memory available to CUDA kernels on a CIG context. Can only be queried, cannot be set\n    pub const CU_LIMIT_SHMEM_SIZE: CUlimit_enum = CUlimit_enum(7);\n}\nimpl CUlimit_enum {\n    ///< A non-zero value indicates this CUDA context is a CIG-enabled context. Can only be queried, cannot be set\n    pub const CU_LIMIT_CIG_ENABLED: CUlimit_enum = CUlimit_enum(8);\n}\nimpl CUlimit_enum {\n    ///< When set to zero, CUDA will fail to launch a kernel on a CIG context, instead of using the fallback path, if the kernel uses more shared memory than available\n    pub const CU_LIMIT_CIG_SHMEM_FALLBACK_ENABLED: CUlimit_enum = CUlimit_enum(9);\n}\nimpl CUlimit_enum {\n    pub const CU_LIMIT_MAX: CUlimit_enum = CUlimit_enum(10);\n}\n#[repr(transparent)]\n/// Limits\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUlimit_enum(pub ::core::ffi::c_uint);\n/// Limits\npub use self::CUlimit_enum as CUlimit;\nimpl CUresourcetype_enum {\n    ///< Array resource\n    pub const CU_RESOURCE_TYPE_ARRAY: CUresourcetype_enum = CUresourcetype_enum(0);\n}\nimpl CUresourcetype_enum {\n    ///< Mipmapped array resource\n    pub const CU_RESOURCE_TYPE_MIPMAPPED_ARRAY: CUresourcetype_enum = CUresourcetype_enum(\n        1,\n    );\n}\nimpl CUresourcetype_enum {\n    ///< Linear resource\n    pub const CU_RESOURCE_TYPE_LINEAR: CUresourcetype_enum = CUresourcetype_enum(2);\n}\nimpl CUresourcetype_enum {\n    ///< Pitch 2D resource\n    pub const CU_RESOURCE_TYPE_PITCH2D: CUresourcetype_enum = CUresourcetype_enum(3);\n}\n#[repr(transparent)]\n/// Resource types\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUresourcetype_enum(pub ::core::ffi::c_uint);\n/// Resource types\npub use self::CUresourcetype_enum as CUresourcetype;\n/** CUDA host function\n \\param userData Argument value passed to the function*/\npub type CUhostFn = ::core::option::Option<\n    unsafe extern \"system\" fn(userData: *mut ::core::ffi::c_void),\n>;\nimpl CUaccessProperty_enum {\n    ///< Normal cache persistence.\n    pub const CU_ACCESS_PROPERTY_NORMAL: CUaccessProperty_enum = CUaccessProperty_enum(\n        0,\n    );\n}\nimpl CUaccessProperty_enum {\n    ///< Streaming access is less likely to persit from cache.\n    pub const CU_ACCESS_PROPERTY_STREAMING: CUaccessProperty_enum = CUaccessProperty_enum(\n        1,\n    );\n}\nimpl CUaccessProperty_enum {\n    ///< Persisting access is more likely to persist in cache.\n    pub const CU_ACCESS_PROPERTY_PERSISTING: CUaccessProperty_enum = CUaccessProperty_enum(\n        2,\n    );\n}\n#[repr(transparent)]\n/// Specifies performance hint with ::CUaccessPolicyWindow for hitProp and missProp members.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUaccessProperty_enum(pub ::core::ffi::c_uint);\n/// Specifies performance hint with ::CUaccessPolicyWindow for hitProp and missProp members.\npub use self::CUaccessProperty_enum as CUaccessProperty;\n/** Specifies an access policy for a window, a contiguous extent of memory\n beginning at base_ptr and ending at base_ptr + num_bytes.\n num_bytes is limited by CU_DEVICE_ATTRIBUTE_MAX_ACCESS_POLICY_WINDOW_SIZE.\n Partition into many segments and assign segments such that:\n sum of \"hit segments\" / window == approx. ratio.\n sum of \"miss segments\" / window == approx 1-ratio.\n Segments and ratio specifications are fitted to the capabilities of\n the architecture.\n Accesses in a hit segment apply the hitProp access policy.\n Accesses in a miss segment apply the missProp access policy.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, PartialEq)]\npub struct CUaccessPolicyWindow_st {\n    ///< Starting address of the access policy window. CUDA driver may align it.\n    pub base_ptr: *mut ::core::ffi::c_void,\n    ///< Size in bytes of the window policy. CUDA driver may restrict the maximum size and alignment.\n    pub num_bytes: usize,\n    ///< hitRatio specifies percentage of lines assigned hitProp, rest are assigned missProp.\n    pub hitRatio: f32,\n    ///< ::CUaccessProperty set for hit.\n    pub hitProp: CUaccessProperty,\n    ///< ::CUaccessProperty set for miss. Must be either NORMAL or STREAMING\n    pub missProp: CUaccessProperty,\n}\n/** Specifies an access policy for a window, a contiguous extent of memory\n beginning at base_ptr and ending at base_ptr + num_bytes.\n num_bytes is limited by CU_DEVICE_ATTRIBUTE_MAX_ACCESS_POLICY_WINDOW_SIZE.\n Partition into many segments and assign segments such that:\n sum of \"hit segments\" / window == approx. ratio.\n sum of \"miss segments\" / window == approx 1-ratio.\n Segments and ratio specifications are fitted to the capabilities of\n the architecture.\n Accesses in a hit segment apply the hitProp access policy.\n Accesses in a miss segment apply the missProp access policy.*/\npub type CUaccessPolicyWindow_v1 = CUaccessPolicyWindow_st;\n/// Access policy window\npub type CUaccessPolicyWindow = CUaccessPolicyWindow_v1;\n/// GPU kernel node parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_KERNEL_NODE_PARAMS_st {\n    ///< Kernel to launch\n    pub func: CUfunction,\n    ///< Width of grid in blocks\n    pub gridDimX: ::core::ffi::c_uint,\n    ///< Height of grid in blocks\n    pub gridDimY: ::core::ffi::c_uint,\n    ///< Depth of grid in blocks\n    pub gridDimZ: ::core::ffi::c_uint,\n    ///< X dimension of each thread block\n    pub blockDimX: ::core::ffi::c_uint,\n    ///< Y dimension of each thread block\n    pub blockDimY: ::core::ffi::c_uint,\n    ///< Z dimension of each thread block\n    pub blockDimZ: ::core::ffi::c_uint,\n    ///< Dynamic shared-memory size per thread block in bytes\n    pub sharedMemBytes: ::core::ffi::c_uint,\n    ///< Array of pointers to kernel parameters\n    pub kernelParams: *mut *mut ::core::ffi::c_void,\n    ///< Extra options\n    pub extra: *mut *mut ::core::ffi::c_void,\n}\n/// GPU kernel node parameters\npub type CUDA_KERNEL_NODE_PARAMS_v1 = CUDA_KERNEL_NODE_PARAMS_st;\n/// GPU kernel node parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_KERNEL_NODE_PARAMS_v2_st {\n    ///< Kernel to launch\n    pub func: CUfunction,\n    ///< Width of grid in blocks\n    pub gridDimX: ::core::ffi::c_uint,\n    ///< Height of grid in blocks\n    pub gridDimY: ::core::ffi::c_uint,\n    ///< Depth of grid in blocks\n    pub gridDimZ: ::core::ffi::c_uint,\n    ///< X dimension of each thread block\n    pub blockDimX: ::core::ffi::c_uint,\n    ///< Y dimension of each thread block\n    pub blockDimY: ::core::ffi::c_uint,\n    ///< Z dimension of each thread block\n    pub blockDimZ: ::core::ffi::c_uint,\n    ///< Dynamic shared-memory size per thread block in bytes\n    pub sharedMemBytes: ::core::ffi::c_uint,\n    ///< Array of pointers to kernel parameters\n    pub kernelParams: *mut *mut ::core::ffi::c_void,\n    ///< Extra options\n    pub extra: *mut *mut ::core::ffi::c_void,\n    ///< Kernel to launch, will only be referenced if func is NULL\n    pub kern: CUkernel,\n    ///< Context for the kernel task to run in. The value NULL will indicate the current context should be used by the api. This field is ignored if func is set.\n    pub ctx: CUcontext,\n}\n/// GPU kernel node parameters\npub type CUDA_KERNEL_NODE_PARAMS_v2 = CUDA_KERNEL_NODE_PARAMS_v2_st;\n/// GPU kernel node parameters\npub type CUDA_KERNEL_NODE_PARAMS = CUDA_KERNEL_NODE_PARAMS_v2;\n/// GPU kernel node parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_KERNEL_NODE_PARAMS_v3_st {\n    ///< Kernel to launch\n    pub func: CUfunction,\n    ///< Width of grid in blocks\n    pub gridDimX: ::core::ffi::c_uint,\n    ///< Height of grid in blocks\n    pub gridDimY: ::core::ffi::c_uint,\n    ///< Depth of grid in blocks\n    pub gridDimZ: ::core::ffi::c_uint,\n    ///< X dimension of each thread block\n    pub blockDimX: ::core::ffi::c_uint,\n    ///< Y dimension of each thread block\n    pub blockDimY: ::core::ffi::c_uint,\n    ///< Z dimension of each thread block\n    pub blockDimZ: ::core::ffi::c_uint,\n    ///< Dynamic shared-memory size per thread block in bytes\n    pub sharedMemBytes: ::core::ffi::c_uint,\n    ///< Array of pointers to kernel parameters\n    pub kernelParams: *mut *mut ::core::ffi::c_void,\n    ///< Extra options\n    pub extra: *mut *mut ::core::ffi::c_void,\n    ///< Kernel to launch, will only be referenced if func is NULL\n    pub kern: CUkernel,\n    ///< Context for the kernel task to run in. The value NULL will indicate the current context should be used by the api. This field is ignored if func is set.\n    pub ctx: CUcontext,\n}\n/// GPU kernel node parameters\npub type CUDA_KERNEL_NODE_PARAMS_v3 = CUDA_KERNEL_NODE_PARAMS_v3_st;\n/// Memset node parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_MEMSET_NODE_PARAMS_st {\n    ///< Destination device pointer\n    pub dst: CUdeviceptr,\n    ///< Pitch of destination device pointer. Unused if height is 1\n    pub pitch: usize,\n    ///< Value to be set\n    pub value: ::core::ffi::c_uint,\n    ///< Size of each element in bytes. Must be 1, 2, or 4.\n    pub elementSize: ::core::ffi::c_uint,\n    ///< Width of the row in elements\n    pub width: usize,\n    ///< Number of rows\n    pub height: usize,\n}\n/// Memset node parameters\npub type CUDA_MEMSET_NODE_PARAMS_v1 = CUDA_MEMSET_NODE_PARAMS_st;\n/// Memset node parameters\npub type CUDA_MEMSET_NODE_PARAMS = CUDA_MEMSET_NODE_PARAMS_v1;\n/// Memset node parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_MEMSET_NODE_PARAMS_v2_st {\n    ///< Destination device pointer\n    pub dst: CUdeviceptr,\n    ///< Pitch of destination device pointer. Unused if height is 1\n    pub pitch: usize,\n    ///< Value to be set\n    pub value: ::core::ffi::c_uint,\n    ///< Size of each element in bytes. Must be 1, 2, or 4.\n    pub elementSize: ::core::ffi::c_uint,\n    ///< Width of the row in elements\n    pub width: usize,\n    ///< Number of rows\n    pub height: usize,\n    ///< Context on which to run the node\n    pub ctx: CUcontext,\n}\n/// Memset node parameters\npub type CUDA_MEMSET_NODE_PARAMS_v2 = CUDA_MEMSET_NODE_PARAMS_v2_st;\n/// Host node parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash)]\npub struct CUDA_HOST_NODE_PARAMS_st {\n    ///< The function to call when the node executes\n    pub fn_: CUhostFn,\n    ///< Argument to pass to the function\n    pub userData: *mut ::core::ffi::c_void,\n}\n/// Host node parameters\npub type CUDA_HOST_NODE_PARAMS_v1 = CUDA_HOST_NODE_PARAMS_st;\n/// Host node parameters\npub type CUDA_HOST_NODE_PARAMS = CUDA_HOST_NODE_PARAMS_v1;\n/// Host node parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_HOST_NODE_PARAMS_v2_st {\n    ///< The function to call when the node executes\n    pub fn_: CUhostFn,\n    ///< Argument to pass to the function\n    pub userData: *mut ::core::ffi::c_void,\n}\n/// Host node parameters\npub type CUDA_HOST_NODE_PARAMS_v2 = CUDA_HOST_NODE_PARAMS_v2_st;\nimpl CUgraphConditionalNodeType_enum {\n    ///< Conditional 'if/else' Node. Body[0] executed if condition is non-zero.  If \\p size == 2, an optional ELSE graph is created and this is executed if the condition is zero.\n    pub const CU_GRAPH_COND_TYPE_IF: CUgraphConditionalNodeType_enum = CUgraphConditionalNodeType_enum(\n        0,\n    );\n}\nimpl CUgraphConditionalNodeType_enum {\n    ///< Conditional 'while' Node. Body executed repeatedly while condition value is non-zero.\n    pub const CU_GRAPH_COND_TYPE_WHILE: CUgraphConditionalNodeType_enum = CUgraphConditionalNodeType_enum(\n        1,\n    );\n}\nimpl CUgraphConditionalNodeType_enum {\n    ///< Conditional 'switch' Node. Body[n] is executed once, where 'n' is the value of the condition. If the condition does not match a body index, no body is launched.\n    pub const CU_GRAPH_COND_TYPE_SWITCH: CUgraphConditionalNodeType_enum = CUgraphConditionalNodeType_enum(\n        2,\n    );\n}\n#[repr(transparent)]\n/// Conditional node types\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUgraphConditionalNodeType_enum(pub ::core::ffi::c_uint);\n/// Conditional node types\npub use self::CUgraphConditionalNodeType_enum as CUgraphConditionalNodeType;\n/// Conditional node parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_CONDITIONAL_NODE_PARAMS {\n    /**< Conditional node handle.\nHandles must be created in advance of creating the node\nusing ::cuGraphConditionalHandleCreate.*/\n    pub handle: CUgraphConditionalHandle,\n    ///< Type of conditional node.\n    pub type_: CUgraphConditionalNodeType,\n    /**< Size of graph output array.  Allowed values are 1 for CU_GRAPH_COND_TYPE_WHILE, 1 or 2\nfor CU_GRAPH_COND_TYPE_IF, or any value greater than zero for CU_GRAPH_COND_TYPE_SWITCH.*/\n    pub size: ::core::ffi::c_uint,\n    /**< CUDA-owned array populated with conditional node child graphs during creation of the node.\nValid for the lifetime of the conditional node.\nThe contents of the graph(s) are subject to the following constraints:\n\n- Allowed node types are kernel nodes, empty nodes, child graphs, memsets,\nmemcopies, and conditionals. This applies recursively to child graphs and conditional bodies.\n- All kernels, including kernels in nested conditionals or child graphs at any level,\nmust belong to the same CUDA context.\n\nThese graphs may be populated using graph node creation APIs or ::cuStreamBeginCaptureToGraph.\n\nCU_GRAPH_COND_TYPE_IF:\nphGraph_out[0] is executed when the condition is non-zero.  If \\p size == 2, phGraph_out[1] will\nbe executed when the condition is zero.\nCU_GRAPH_COND_TYPE_WHILE:\nphGraph_out[0] is executed as long as the condition is non-zero.\nCU_GRAPH_COND_TYPE_SWITCH:\nphGraph_out[n] is executed when the condition is equal to n.  If the condition >= \\p size,\nno body graph is executed.*/\n    pub phGraph_out: *mut CUgraph,\n    ///< Context on which to run the node.  Must match context used to create the handle and all body nodes.\n    pub ctx: CUcontext,\n}\nimpl CUgraphNodeType_enum {\n    ///< GPU kernel node\n    pub const CU_GRAPH_NODE_TYPE_KERNEL: CUgraphNodeType_enum = CUgraphNodeType_enum(0);\n}\nimpl CUgraphNodeType_enum {\n    ///< Memcpy node\n    pub const CU_GRAPH_NODE_TYPE_MEMCPY: CUgraphNodeType_enum = CUgraphNodeType_enum(1);\n}\nimpl CUgraphNodeType_enum {\n    ///< Memset node\n    pub const CU_GRAPH_NODE_TYPE_MEMSET: CUgraphNodeType_enum = CUgraphNodeType_enum(2);\n}\nimpl CUgraphNodeType_enum {\n    ///< Host (executable) node\n    pub const CU_GRAPH_NODE_TYPE_HOST: CUgraphNodeType_enum = CUgraphNodeType_enum(3);\n}\nimpl CUgraphNodeType_enum {\n    ///< Node which executes an embedded graph\n    pub const CU_GRAPH_NODE_TYPE_GRAPH: CUgraphNodeType_enum = CUgraphNodeType_enum(4);\n}\nimpl CUgraphNodeType_enum {\n    ///< Empty (no-op) node\n    pub const CU_GRAPH_NODE_TYPE_EMPTY: CUgraphNodeType_enum = CUgraphNodeType_enum(5);\n}\nimpl CUgraphNodeType_enum {\n    ///< External event wait node\n    pub const CU_GRAPH_NODE_TYPE_WAIT_EVENT: CUgraphNodeType_enum = CUgraphNodeType_enum(\n        6,\n    );\n}\nimpl CUgraphNodeType_enum {\n    ///< External event record node\n    pub const CU_GRAPH_NODE_TYPE_EVENT_RECORD: CUgraphNodeType_enum = CUgraphNodeType_enum(\n        7,\n    );\n}\nimpl CUgraphNodeType_enum {\n    ///< External semaphore signal node\n    pub const CU_GRAPH_NODE_TYPE_EXT_SEMAS_SIGNAL: CUgraphNodeType_enum = CUgraphNodeType_enum(\n        8,\n    );\n}\nimpl CUgraphNodeType_enum {\n    ///< External semaphore wait node\n    pub const CU_GRAPH_NODE_TYPE_EXT_SEMAS_WAIT: CUgraphNodeType_enum = CUgraphNodeType_enum(\n        9,\n    );\n}\nimpl CUgraphNodeType_enum {\n    ///< Memory Allocation Node\n    pub const CU_GRAPH_NODE_TYPE_MEM_ALLOC: CUgraphNodeType_enum = CUgraphNodeType_enum(\n        10,\n    );\n}\nimpl CUgraphNodeType_enum {\n    ///< Memory Free Node\n    pub const CU_GRAPH_NODE_TYPE_MEM_FREE: CUgraphNodeType_enum = CUgraphNodeType_enum(\n        11,\n    );\n}\nimpl CUgraphNodeType_enum {\n    /**< Batch MemOp Node\nSee ::cuStreamBatchMemOp and ::CUstreamBatchMemOpType for what these nodes can do.*/\n    pub const CU_GRAPH_NODE_TYPE_BATCH_MEM_OP: CUgraphNodeType_enum = CUgraphNodeType_enum(\n        12,\n    );\n}\nimpl CUgraphNodeType_enum {\n    /**< Conditional Node\n\nMay be used to implement a conditional execution path or loop\ninside of a graph. The graph(s) contained within the body of the conditional node\ncan be selectively executed or iterated upon based on the value of a conditional\nvariable.\n\nHandles must be created in advance of creating the node\nusing ::cuGraphConditionalHandleCreate.\n\nThe following restrictions apply to graphs which contain conditional nodes:\nThe graph cannot be used in a child node.\nOnly one instantiation of the graph may exist at any point in time.\nThe graph cannot be cloned.\n\nTo set the control value, supply a default value when creating the handle and/or\ncall ::cudaGraphSetConditional from device code.*/\n    pub const CU_GRAPH_NODE_TYPE_CONDITIONAL: CUgraphNodeType_enum = CUgraphNodeType_enum(\n        13,\n    );\n}\n#[repr(transparent)]\n/// Graph node types\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUgraphNodeType_enum(pub ::core::ffi::c_uint);\n/// Graph node types\npub use self::CUgraphNodeType_enum as CUgraphNodeType;\nimpl CUgraphDependencyType_enum {\n    ///< This is an ordinary dependency.\n    pub const CU_GRAPH_DEPENDENCY_TYPE_DEFAULT: CUgraphDependencyType_enum = CUgraphDependencyType_enum(\n        0,\n    );\n}\nimpl CUgraphDependencyType_enum {\n    /**< This dependency type allows the downstream node to\nuse \\c cudaGridDependencySynchronize(). It may only be used\nbetween kernel nodes, and must be used with either the\n::CU_GRAPH_KERNEL_NODE_PORT_PROGRAMMATIC or\n::CU_GRAPH_KERNEL_NODE_PORT_LAUNCH_ORDER outgoing port.*/\n    pub const CU_GRAPH_DEPENDENCY_TYPE_PROGRAMMATIC: CUgraphDependencyType_enum = CUgraphDependencyType_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n/// Type annotations that can be applied to graph edges as part of ::CUgraphEdgeData.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUgraphDependencyType_enum(pub ::core::ffi::c_uint);\n/// Type annotations that can be applied to graph edges as part of ::CUgraphEdgeData.\npub use self::CUgraphDependencyType_enum as CUgraphDependencyType;\n/** Optional annotation for edges in a CUDA graph. Note, all edges implicitly have annotations and\n default to a zero-initialized value if not specified. A zero-initialized struct indicates a\n standard full serialization of two nodes with memory visibility.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUgraphEdgeData_st {\n    /**< This indicates when the dependency is triggered from the upstream\nnode on the edge. The meaning is specfic to the node type. A value\nof 0 in all cases means full completion of the upstream node, with\nmemory visibility to the downstream node or portion thereof\n(indicated by \\c to_port).\n<br>\nOnly kernel nodes define non-zero ports. A kernel node\ncan use the following output port types:\n::CU_GRAPH_KERNEL_NODE_PORT_DEFAULT, ::CU_GRAPH_KERNEL_NODE_PORT_PROGRAMMATIC,\nor ::CU_GRAPH_KERNEL_NODE_PORT_LAUNCH_ORDER.*/\n    pub from_port: ::core::ffi::c_uchar,\n    /**< This indicates what portion of the downstream node is dependent on\nthe upstream node or portion thereof (indicated by \\c from_port). The\nmeaning is specific to the node type. A value of 0 in all cases means\nthe entirety of the downstream node is dependent on the upstream work.\n<br>\nCurrently no node types define non-zero ports. Accordingly, this field\nmust be set to zero.*/\n    pub to_port: ::core::ffi::c_uchar,\n    /**< This should be populated with a value from ::CUgraphDependencyType. (It\nis typed as char due to compiler-specific layout of bitfields.) See\n::CUgraphDependencyType.*/\n    pub type_: ::core::ffi::c_uchar,\n    /**< These bytes are unused and must be zeroed. This ensures\ncompatibility if additional fields are added in the future.*/\n    pub reserved: [::core::ffi::c_uchar; 5usize],\n}\n/** Optional annotation for edges in a CUDA graph. Note, all edges implicitly have annotations and\n default to a zero-initialized value if not specified. A zero-initialized struct indicates a\n standard full serialization of two nodes with memory visibility.*/\npub type CUgraphEdgeData = CUgraphEdgeData_st;\nimpl CUgraphInstantiateResult_enum {\n    ///< Instantiation succeeded\n    pub const CUDA_GRAPH_INSTANTIATE_SUCCESS: CUgraphInstantiateResult_enum = CUgraphInstantiateResult_enum(\n        0,\n    );\n}\nimpl CUgraphInstantiateResult_enum {\n    ///< Instantiation failed for an unexpected reason which is described in the return value of the function\n    pub const CUDA_GRAPH_INSTANTIATE_ERROR: CUgraphInstantiateResult_enum = CUgraphInstantiateResult_enum(\n        1,\n    );\n}\nimpl CUgraphInstantiateResult_enum {\n    ///< Instantiation failed due to invalid structure, such as cycles\n    pub const CUDA_GRAPH_INSTANTIATE_INVALID_STRUCTURE: CUgraphInstantiateResult_enum = CUgraphInstantiateResult_enum(\n        2,\n    );\n}\nimpl CUgraphInstantiateResult_enum {\n    ///< Instantiation for device launch failed because the graph contained an unsupported operation\n    pub const CUDA_GRAPH_INSTANTIATE_NODE_OPERATION_NOT_SUPPORTED: CUgraphInstantiateResult_enum = CUgraphInstantiateResult_enum(\n        3,\n    );\n}\nimpl CUgraphInstantiateResult_enum {\n    ///< Instantiation for device launch failed due to the nodes belonging to different contexts\n    pub const CUDA_GRAPH_INSTANTIATE_MULTIPLE_CTXS_NOT_SUPPORTED: CUgraphInstantiateResult_enum = CUgraphInstantiateResult_enum(\n        4,\n    );\n}\nimpl CUgraphInstantiateResult_enum {\n    ///< One or more conditional handles are not associated with conditional nodes\n    pub const CUDA_GRAPH_INSTANTIATE_CONDITIONAL_HANDLE_UNUSED: CUgraphInstantiateResult_enum = CUgraphInstantiateResult_enum(\n        5,\n    );\n}\n#[repr(transparent)]\n/// Graph instantiation results\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUgraphInstantiateResult_enum(pub ::core::ffi::c_uint);\n/// Graph instantiation results\npub use self::CUgraphInstantiateResult_enum as CUgraphInstantiateResult;\n/// Graph instantiation parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_GRAPH_INSTANTIATE_PARAMS_st {\n    ///< Instantiation flags\n    pub flags: cuuint64_t,\n    ///< Upload stream\n    pub hUploadStream: CUstream,\n    ///< The node which caused instantiation to fail, if any\n    pub hErrNode_out: CUgraphNode,\n    ///< Whether instantiation was successful.  If it failed, the reason why\n    pub result_out: CUgraphInstantiateResult,\n}\n/// Graph instantiation parameters\npub type CUDA_GRAPH_INSTANTIATE_PARAMS = CUDA_GRAPH_INSTANTIATE_PARAMS_st;\nimpl CUsynchronizationPolicy_enum {\n    pub const CU_SYNC_POLICY_AUTO: CUsynchronizationPolicy_enum = CUsynchronizationPolicy_enum(\n        1,\n    );\n}\nimpl CUsynchronizationPolicy_enum {\n    pub const CU_SYNC_POLICY_SPIN: CUsynchronizationPolicy_enum = CUsynchronizationPolicy_enum(\n        2,\n    );\n}\nimpl CUsynchronizationPolicy_enum {\n    pub const CU_SYNC_POLICY_YIELD: CUsynchronizationPolicy_enum = CUsynchronizationPolicy_enum(\n        3,\n    );\n}\nimpl CUsynchronizationPolicy_enum {\n    pub const CU_SYNC_POLICY_BLOCKING_SYNC: CUsynchronizationPolicy_enum = CUsynchronizationPolicy_enum(\n        4,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUsynchronizationPolicy_enum(pub ::core::ffi::c_uint);\npub use self::CUsynchronizationPolicy_enum as CUsynchronizationPolicy;\nimpl CUclusterSchedulingPolicy_enum {\n    ///< the default policy\n    pub const CU_CLUSTER_SCHEDULING_POLICY_DEFAULT: CUclusterSchedulingPolicy_enum = CUclusterSchedulingPolicy_enum(\n        0,\n    );\n}\nimpl CUclusterSchedulingPolicy_enum {\n    ///< spread the blocks within a cluster to the SMs\n    pub const CU_CLUSTER_SCHEDULING_POLICY_SPREAD: CUclusterSchedulingPolicy_enum = CUclusterSchedulingPolicy_enum(\n        1,\n    );\n}\nimpl CUclusterSchedulingPolicy_enum {\n    ///< allow the hardware to load-balance the blocks in a cluster to the SMs\n    pub const CU_CLUSTER_SCHEDULING_POLICY_LOAD_BALANCING: CUclusterSchedulingPolicy_enum = CUclusterSchedulingPolicy_enum(\n        2,\n    );\n}\n#[repr(transparent)]\n/// Cluster scheduling policies. These may be passed to ::cuFuncSetAttribute or ::cuKernelSetAttribute\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUclusterSchedulingPolicy_enum(pub ::core::ffi::c_uint);\n/// Cluster scheduling policies. These may be passed to ::cuFuncSetAttribute or ::cuKernelSetAttribute\npub use self::CUclusterSchedulingPolicy_enum as CUclusterSchedulingPolicy;\nimpl CUlaunchMemSyncDomain_enum {\n    ///< Launch kernels in the default domain\n    pub const CU_LAUNCH_MEM_SYNC_DOMAIN_DEFAULT: CUlaunchMemSyncDomain_enum = CUlaunchMemSyncDomain_enum(\n        0,\n    );\n}\nimpl CUlaunchMemSyncDomain_enum {\n    ///< Launch kernels in the remote domain\n    pub const CU_LAUNCH_MEM_SYNC_DOMAIN_REMOTE: CUlaunchMemSyncDomain_enum = CUlaunchMemSyncDomain_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n/** Memory Synchronization Domain\n\n A kernel can be launched in a specified memory synchronization domain that affects all memory operations issued by\n that kernel. A memory barrier issued in one domain will only order memory operations in that domain, thus eliminating\n latency increase from memory barriers ordering unrelated traffic.\n\n By default, kernels are launched in domain 0. Kernel launched with ::CU_LAUNCH_MEM_SYNC_DOMAIN_REMOTE will have a\n different domain ID. User may also alter the domain ID with ::CUlaunchMemSyncDomainMap for a specific stream /\n graph node / kernel launch. See ::CU_LAUNCH_ATTRIBUTE_MEM_SYNC_DOMAIN, ::cuStreamSetAttribute, ::cuLaunchKernelEx,\n ::cuGraphKernelNodeSetAttribute.\n\n Memory operations done in kernels launched in different domains are considered system-scope distanced. In other\n words, a GPU scoped memory synchronization is not sufficient for memory order to be observed by kernels in another\n memory synchronization domain even if they are on the same GPU.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUlaunchMemSyncDomain_enum(pub ::core::ffi::c_uint);\n/** Memory Synchronization Domain\n\n A kernel can be launched in a specified memory synchronization domain that affects all memory operations issued by\n that kernel. A memory barrier issued in one domain will only order memory operations in that domain, thus eliminating\n latency increase from memory barriers ordering unrelated traffic.\n\n By default, kernels are launched in domain 0. Kernel launched with ::CU_LAUNCH_MEM_SYNC_DOMAIN_REMOTE will have a\n different domain ID. User may also alter the domain ID with ::CUlaunchMemSyncDomainMap for a specific stream /\n graph node / kernel launch. See ::CU_LAUNCH_ATTRIBUTE_MEM_SYNC_DOMAIN, ::cuStreamSetAttribute, ::cuLaunchKernelEx,\n ::cuGraphKernelNodeSetAttribute.\n\n Memory operations done in kernels launched in different domains are considered system-scope distanced. In other\n words, a GPU scoped memory synchronization is not sufficient for memory order to be observed by kernels in another\n memory synchronization domain even if they are on the same GPU.*/\npub use self::CUlaunchMemSyncDomain_enum as CUlaunchMemSyncDomain;\n/** Memory Synchronization Domain map\n\n See ::cudaLaunchMemSyncDomain.\n\n By default, kernels are launched in domain 0. Kernel launched with ::CU_LAUNCH_MEM_SYNC_DOMAIN_REMOTE will have a\n different domain ID. User may also alter the domain ID with ::CUlaunchMemSyncDomainMap for a specific stream /\n graph node / kernel launch. See ::CU_LAUNCH_ATTRIBUTE_MEM_SYNC_DOMAIN_MAP.\n\n Domain ID range is available through ::CU_DEVICE_ATTRIBUTE_MEM_SYNC_DOMAIN_COUNT.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUlaunchMemSyncDomainMap_st {\n    ///< The default domain ID to use for designated kernels\n    pub default_: ::core::ffi::c_uchar,\n    ///< The remote domain ID to use for designated kernels\n    pub remote: ::core::ffi::c_uchar,\n}\n/** Memory Synchronization Domain map\n\n See ::cudaLaunchMemSyncDomain.\n\n By default, kernels are launched in domain 0. Kernel launched with ::CU_LAUNCH_MEM_SYNC_DOMAIN_REMOTE will have a\n different domain ID. User may also alter the domain ID with ::CUlaunchMemSyncDomainMap for a specific stream /\n graph node / kernel launch. See ::CU_LAUNCH_ATTRIBUTE_MEM_SYNC_DOMAIN_MAP.\n\n Domain ID range is available through ::CU_DEVICE_ATTRIBUTE_MEM_SYNC_DOMAIN_COUNT.*/\npub type CUlaunchMemSyncDomainMap = CUlaunchMemSyncDomainMap_st;\nimpl CUlaunchAttributeID_enum {\n    ///< Ignored entry, for convenient composition\n    pub const CU_LAUNCH_ATTRIBUTE_IGNORE: CUlaunchAttributeID_enum = CUlaunchAttributeID_enum(\n        0,\n    );\n}\nimpl CUlaunchAttributeID_enum {\n    /**< Valid for streams, graph nodes, launches. See\n::CUlaunchAttributeValue::accessPolicyWindow.*/\n    pub const CU_LAUNCH_ATTRIBUTE_ACCESS_POLICY_WINDOW: CUlaunchAttributeID_enum = CUlaunchAttributeID_enum(\n        1,\n    );\n}\nimpl CUlaunchAttributeID_enum {\n    /**< Valid for graph nodes, launches. See\n::CUlaunchAttributeValue::cooperative.*/\n    pub const CU_LAUNCH_ATTRIBUTE_COOPERATIVE: CUlaunchAttributeID_enum = CUlaunchAttributeID_enum(\n        2,\n    );\n}\nimpl CUlaunchAttributeID_enum {\n    /**< Valid for streams. See\n::CUlaunchAttributeValue::syncPolicy.*/\n    pub const CU_LAUNCH_ATTRIBUTE_SYNCHRONIZATION_POLICY: CUlaunchAttributeID_enum = CUlaunchAttributeID_enum(\n        3,\n    );\n}\nimpl CUlaunchAttributeID_enum {\n    ///< Valid for graph nodes, launches. See ::CUlaunchAttributeValue::clusterDim.\n    pub const CU_LAUNCH_ATTRIBUTE_CLUSTER_DIMENSION: CUlaunchAttributeID_enum = CUlaunchAttributeID_enum(\n        4,\n    );\n}\nimpl CUlaunchAttributeID_enum {\n    ///< Valid for graph nodes, launches. See ::CUlaunchAttributeValue::clusterSchedulingPolicyPreference.\n    pub const CU_LAUNCH_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE: CUlaunchAttributeID_enum = CUlaunchAttributeID_enum(\n        5,\n    );\n}\nimpl CUlaunchAttributeID_enum {\n    /**< Valid for launches. Setting\n::CUlaunchAttributeValue::programmaticStreamSerializationAllowed\nto non-0 signals that the kernel will use programmatic\nmeans to resolve its stream dependency, so that the\nCUDA runtime should opportunistically allow the grid's\nexecution to overlap with the previous kernel in the\nstream, if that kernel requests the overlap. The\ndependent launches can choose to wait on the\ndependency using the programmatic sync\n(cudaGridDependencySynchronize() or equivalent PTX\ninstructions).*/\n    pub const CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_STREAM_SERIALIZATION: CUlaunchAttributeID_enum = CUlaunchAttributeID_enum(\n        6,\n    );\n}\nimpl CUlaunchAttributeID_enum {\n    /**< Valid for launches. Set\n::CUlaunchAttributeValue::programmaticEvent to\nrecord the event. Event recorded through this\nlaunch attribute is guaranteed to only trigger\nafter all block in the associated kernel trigger\nthe event. A block can trigger the event through\nPTX launchdep.release or CUDA builtin function\ncudaTriggerProgrammaticLaunchCompletion(). A\ntrigger can also be inserted at the beginning of\neach block's execution if triggerAtBlockStart is\nset to non-0. The dependent launches can choose to\nwait on the dependency using the programmatic sync\n(cudaGridDependencySynchronize() or equivalent PTX\ninstructions). Note that dependents (including the\nCPU thread calling cuEventSynchronize()) are not\nguaranteed to observe the release precisely when\nit is released.  For example, cuEventSynchronize()\nmay only observe the event trigger long after the\nassociated kernel has completed. This recording\ntype is primarily meant for establishing\nprogrammatic dependency between device tasks. Note\nalso this type of dependency allows, but does not\nguarantee, concurrent execution of tasks.\n<br>\nThe event supplied must not be an interprocess or\ninterop event. The event must disable timing (i.e.\nmust be created with the ::CU_EVENT_DISABLE_TIMING\nflag set).*/\n    pub const CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_EVENT: CUlaunchAttributeID_enum = CUlaunchAttributeID_enum(\n        7,\n    );\n}\nimpl CUlaunchAttributeID_enum {\n    /**< Valid for streams, graph nodes, launches. See\n::CUlaunchAttributeValue::priority.*/\n    pub const CU_LAUNCH_ATTRIBUTE_PRIORITY: CUlaunchAttributeID_enum = CUlaunchAttributeID_enum(\n        8,\n    );\n}\nimpl CUlaunchAttributeID_enum {\n    /**< Valid for streams, graph nodes, launches. See\n::CUlaunchAttributeValue::memSyncDomainMap.*/\n    pub const CU_LAUNCH_ATTRIBUTE_MEM_SYNC_DOMAIN_MAP: CUlaunchAttributeID_enum = CUlaunchAttributeID_enum(\n        9,\n    );\n}\nimpl CUlaunchAttributeID_enum {\n    /**< Valid for streams, graph nodes, launches. See\n::CUlaunchAttributeValue::memSyncDomain.*/\n    pub const CU_LAUNCH_ATTRIBUTE_MEM_SYNC_DOMAIN: CUlaunchAttributeID_enum = CUlaunchAttributeID_enum(\n        10,\n    );\n}\nimpl CUlaunchAttributeID_enum {\n    /**< Valid for graph nodes, launches. Set\n::CUlaunchAttributeValue::preferredClusterDim\nto allow the kernel launch to specify a preferred substitute\ncluster dimension. Blocks may be grouped according to either\nthe dimensions specified with this attribute (grouped into a\n\"preferred substitute cluster\"), or the one specified with\n::CU_LAUNCH_ATTRIBUTE_CLUSTER_DIMENSION attribute (grouped\ninto a \"regular cluster\"). The cluster dimensions of a\n\"preferred substitute cluster\" shall be an integer multiple\ngreater than zero of the regular cluster dimensions. The\ndevice will attempt - on a best-effort basis - to group\nthread blocks into preferred clusters over grouping them\ninto regular clusters. When it deems necessary (primarily\nwhen the device temporarily runs out of physical resources\nto launch the larger preferred clusters), the device may\nswitch to launch the regular clusters instead to attempt to\nutilize as much of the physical device resources as possible.\n<br>\nEach type of cluster will have its enumeration / coordinate\nsetup as if the grid consists solely of its type of cluster.\nFor example, if the preferred substitute cluster dimensions\ndouble the regular cluster dimensions, there might be\nsimultaneously a regular cluster indexed at (1,0,0), and a\npreferred cluster indexed at (1,0,0). In this example, the\npreferred substitute cluster (1,0,0) replaces regular\nclusters (2,0,0) and (3,0,0) and groups their blocks.\n<br>\nThis attribute will only take effect when a regular cluster\ndimension has been specified. The preferred substitute\ncluster dimension must be an integer multiple greater than\nzero of the regular cluster dimension and must divide the\ngrid. It must also be no more than `maxBlocksPerCluster`, if\nit is set in the kernel's `__launch_bounds__`. Otherwise it\nmust be less than the maximum value the driver can support.\nOtherwise, setting this attribute to a value physically\nunable to fit on any particular device is permitted.*/\n    pub const CU_LAUNCH_ATTRIBUTE_PREFERRED_CLUSTER_DIMENSION: CUlaunchAttributeID_enum = CUlaunchAttributeID_enum(\n        11,\n    );\n}\nimpl CUlaunchAttributeID_enum {\n    /**< Valid for launches. Set\n::CUlaunchAttributeValue::launchCompletionEvent to record the\nevent.\n<br>\nNominally, the event is triggered once all blocks of the kernel\nhave begun execution. Currently this is a best effort. If a kernel\nB has a launch completion dependency on a kernel A, B may wait\nuntil A is complete. Alternatively, blocks of B may begin before\nall blocks of A have begun, for example if B can claim execution\nresources unavailable to A (e.g. they run on different GPUs) or\nif B is a higher priority than A.\nExercise caution if such an ordering inversion could lead\nto deadlock.\n<br>\nA launch completion event is nominally similar to a programmatic\nevent with \\c triggerAtBlockStart set except that it is not\nvisible to \\c cudaGridDependencySynchronize() and can be used with\ncompute capability less than 9.0.\n<br>\nThe event supplied must not be an interprocess or interop\nevent. The event must disable timing (i.e. must be created\nwith the ::CU_EVENT_DISABLE_TIMING flag set).*/\n    pub const CU_LAUNCH_ATTRIBUTE_LAUNCH_COMPLETION_EVENT: CUlaunchAttributeID_enum = CUlaunchAttributeID_enum(\n        12,\n    );\n}\nimpl CUlaunchAttributeID_enum {\n    /**< Valid for graph nodes, launches. This attribute is graphs-only,\nand passing it to a launch in a non-capturing stream will result\nin an error.\n<br>\n::CUlaunchAttributeValue::deviceUpdatableKernelNode::deviceUpdatable can\nonly be set to 0 or 1. Setting the field to 1 indicates that the\ncorresponding kernel node should be device-updatable. On success, a handle\nwill be returned via\n::CUlaunchAttributeValue::deviceUpdatableKernelNode::devNode which can be\npassed to the various device-side update functions to update the node's\nkernel parameters from within another kernel. For more information on the\ntypes of device updates that can be made, as well as the relevant limitations\nthereof, see ::cudaGraphKernelNodeUpdatesApply.\n<br>\nNodes which are device-updatable have additional restrictions compared to\nregular kernel nodes. Firstly, device-updatable nodes cannot be removed\nfrom their graph via ::cuGraphDestroyNode. Additionally, once opted-in\nto this functionality, a node cannot opt out, and any attempt to set the\ndeviceUpdatable attribute to 0 will result in an error. Device-updatable\nkernel nodes also cannot have their attributes copied to/from another kernel\nnode via ::cuGraphKernelNodeCopyAttributes. Graphs containing one or more\ndevice-updatable nodes also do not allow multiple instantiation, and neither\nthe graph nor its instantiated version can be passed to ::cuGraphExecUpdate.\n<br>\nIf a graph contains device-updatable nodes and updates those nodes from the device\nfrom within the graph, the graph must be uploaded with ::cuGraphUpload before it\nis launched. For such a graph, if host-side executable graph updates are made to the\ndevice-updatable nodes, the graph must be uploaded before it is launched again.*/\n    pub const CU_LAUNCH_ATTRIBUTE_DEVICE_UPDATABLE_KERNEL_NODE: CUlaunchAttributeID_enum = CUlaunchAttributeID_enum(\n        13,\n    );\n}\nimpl CUlaunchAttributeID_enum {\n    /**< Valid for launches. On devices where the L1 cache and shared memory use the\nsame hardware resources, setting ::CUlaunchAttributeValue::sharedMemCarveout to a\npercentage between 0-100 signals the CUDA driver to set the shared memory carveout\npreference, in percent of the total shared memory for that kernel launch.\nThis attribute takes precedence over ::CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT.\nThis is only a hint, and the CUDA driver can choose a different configuration if\nrequired for the launch.*/\n    pub const CU_LAUNCH_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT: CUlaunchAttributeID_enum = CUlaunchAttributeID_enum(\n        14,\n    );\n}\nimpl CUlaunchAttributeID_enum {\n    /**< Valid for streams, graph nodes, launches. This attribute is a hint to the CUDA runtime that the\nlaunch should attempt to make the kernel maximize its NVLINK utilization.\n<br>\nWhen possible to honor this hint, CUDA will assume each block in the grid launch will carry out an even amount\nof NVLINK traffic, and make a best-effort attempt to adjust the kernel launch based on that assumption.\n<br>\nThis attribute is a hint only. CUDA makes no functional or performance guarantee. Its applicability can be\naffected by many different factors, including driver version (i.e. CUDA doesn't guarantee the performance\ncharacteristics will be maintained between driver versions or a driver update could alter or regress\npreviously observed perf characteristics.) It also doesn't guarantee a successful result, i.e. applying\nthe attribute may not improve the performance of either the targeted kernel or the encapsulating application.\n<br>\nValid values for ::CUlaunchAttributeValue::nvlinkUtilCentricScheduling are 0 (disabled) and 1 (enabled).*/\n    pub const CU_LAUNCH_ATTRIBUTE_NVLINK_UTIL_CENTRIC_SCHEDULING: CUlaunchAttributeID_enum = CUlaunchAttributeID_enum(\n        16,\n    );\n}\nimpl CUlaunchAttributeID_enum {\n    pub const CU_LAUNCH_ATTRIBUTE_MAX: CUlaunchAttributeID_enum = CUlaunchAttributeID_enum(\n        17,\n    );\n}\n#[repr(transparent)]\n/// Launch attributes enum; used as id field of ::CUlaunchAttribute\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUlaunchAttributeID_enum(pub ::core::ffi::c_uint);\n/// Launch attributes enum; used as id field of ::CUlaunchAttribute\npub use self::CUlaunchAttributeID_enum as CUlaunchAttributeID;\n/// Launch attributes union; used as value field of ::CUlaunchAttribute\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union CUlaunchAttributeValue_union {\n    pub pad: [::core::ffi::c_char; 64usize],\n    ///< Value of launch attribute ::CU_LAUNCH_ATTRIBUTE_ACCESS_POLICY_WINDOW.\n    pub accessPolicyWindow: CUaccessPolicyWindow,\n    /**< Value of launch attribute ::CU_LAUNCH_ATTRIBUTE_COOPERATIVE. Nonzero indicates a cooperative\nkernel (see ::cuLaunchCooperativeKernel).*/\n    pub cooperative: ::core::ffi::c_int,\n    /**< Value of launch attribute\n::CU_LAUNCH_ATTRIBUTE_SYNCHRONIZATION_POLICY. ::CUsynchronizationPolicy for\nwork queued up in this stream*/\n    pub syncPolicy: CUsynchronizationPolicy,\n    pub clusterDim: CUlaunchAttributeValue_union__bindgen_ty_1,\n    /**< Value of launch attribute\n::CU_LAUNCH_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE. Cluster\nscheduling policy preference for the kernel.*/\n    pub clusterSchedulingPolicyPreference: CUclusterSchedulingPolicy,\n    /**< Value of launch attribute\n::CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_STREAM_SERIALIZATION.*/\n    pub programmaticStreamSerializationAllowed: ::core::ffi::c_int,\n    pub programmaticEvent: CUlaunchAttributeValue_union__bindgen_ty_2,\n    pub launchCompletionEvent: CUlaunchAttributeValue_union__bindgen_ty_3,\n    ///< Value of launch attribute ::CU_LAUNCH_ATTRIBUTE_PRIORITY. Execution priority of the kernel.\n    pub priority: ::core::ffi::c_int,\n    /**< Value of launch attribute\n::CU_LAUNCH_ATTRIBUTE_MEM_SYNC_DOMAIN_MAP. See\n::CUlaunchMemSyncDomainMap.*/\n    pub memSyncDomainMap: CUlaunchMemSyncDomainMap,\n    /**< Value of launch attribute\n::CU_LAUNCH_ATTRIBUTE_MEM_SYNC_DOMAIN. See::CUlaunchMemSyncDomain*/\n    pub memSyncDomain: CUlaunchMemSyncDomain,\n    pub preferredClusterDim: CUlaunchAttributeValue_union__bindgen_ty_4,\n    pub deviceUpdatableKernelNode: CUlaunchAttributeValue_union__bindgen_ty_5,\n    ///< Value of launch attribute ::CU_LAUNCH_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT.\n    pub sharedMemCarveout: ::core::ffi::c_uint,\n    pub nvlinkUtilCentricScheduling: ::core::ffi::c_uint,\n}\n/**  Value of launch attribute ::CU_LAUNCH_ATTRIBUTE_CLUSTER_DIMENSION that\n  represents the desired cluster dimensions for the kernel. Opaque type\n  with the following fields:\n      - \\p x - The X dimension of the cluster, in blocks. Must be a divisor\n               of the grid X dimension.\n      - \\p y - The Y dimension of the cluster, in blocks. Must be a divisor\n               of the grid Y dimension.\n      - \\p z - The Z dimension of the cluster, in blocks. Must be a divisor\n               of the grid Z dimension.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUlaunchAttributeValue_union__bindgen_ty_1 {\n    pub x: ::core::ffi::c_uint,\n    pub y: ::core::ffi::c_uint,\n    pub z: ::core::ffi::c_uint,\n}\n/**  Value of launch attribute ::CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_EVENT\n  with the following fields:\n      - \\p CUevent event - Event to fire when all blocks trigger it.\n      - \\p Event record flags, see ::cuEventRecordWithFlags. Does not accept :CU_EVENT_RECORD_EXTERNAL.\n      - \\p triggerAtBlockStart - If this is set to non-0, each block launch will automatically trigger the event.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUlaunchAttributeValue_union__bindgen_ty_2 {\n    pub event: CUevent,\n    pub flags: ::core::ffi::c_int,\n    pub triggerAtBlockStart: ::core::ffi::c_int,\n}\n/** Value of launch attribute ::CU_LAUNCH_ATTRIBUTE_LAUNCH_COMPLETION_EVENT\n with the following fields:\n     - \\p CUevent event - Event to fire when the last block launches\n     - \\p int flags; - Event record flags, see ::cuEventRecordWithFlags. Does not accept ::CU_EVENT_RECORD_EXTERNAL.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUlaunchAttributeValue_union__bindgen_ty_3 {\n    pub event: CUevent,\n    pub flags: ::core::ffi::c_int,\n}\n/**  Value of launch attribute ::CU_LAUNCH_ATTRIBUTE_PREFERRED_CLUSTER_DIMENSION\n  that represents the desired preferred cluster dimensions for the kernel.\n  Opaque type with the following fields:\n      - \\p x - The X dimension of the preferred cluster, in blocks. Must\n               be a divisor of the grid X dimension, and must be a\n               multiple of the \\p x field of ::CUlaunchAttributeValue::clusterDim.\n      - \\p y - The Y dimension of the preferred cluster, in blocks. Must\n               be a divisor of the grid Y dimension, and must be a\n               multiple of the \\p y field of ::CUlaunchAttributeValue::clusterDim.\n      - \\p z - The Z dimension of the preferred cluster, in blocks. Must be\n               equal to the \\p z field of ::CUlaunchAttributeValue::clusterDim.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUlaunchAttributeValue_union__bindgen_ty_4 {\n    pub x: ::core::ffi::c_uint,\n    pub y: ::core::ffi::c_uint,\n    pub z: ::core::ffi::c_uint,\n}\n/**  Value of launch attribute ::CU_LAUNCH_ATTRIBUTE_DEVICE_UPDATABLE_KERNEL_NODE.\n  with the following fields:\n      - \\p int deviceUpdatable - Whether or not the resulting kernel node should be device-updatable.\n      - \\p CUgraphDeviceNode devNode - Returns a handle to pass to the various device-side update functions.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUlaunchAttributeValue_union__bindgen_ty_5 {\n    pub deviceUpdatable: ::core::ffi::c_int,\n    pub devNode: CUgraphDeviceNode,\n}\n/// Launch attributes union; used as value field of ::CUlaunchAttribute\npub type CUlaunchAttributeValue = CUlaunchAttributeValue_union;\n/// Launch attribute\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct CUlaunchAttribute_st {\n    ///< Attribute to set\n    pub id: CUlaunchAttributeID,\n    pub pad: [::core::ffi::c_char; 4usize],\n    ///< Value of the attribute\n    pub value: CUlaunchAttributeValue,\n}\n/// Launch attribute\npub type CUlaunchAttribute = CUlaunchAttribute_st;\n/// CUDA extensible launch configuration\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUlaunchConfig_st {\n    ///< Width of grid in blocks\n    pub gridDimX: ::core::ffi::c_uint,\n    ///< Height of grid in blocks\n    pub gridDimY: ::core::ffi::c_uint,\n    ///< Depth of grid in blocks\n    pub gridDimZ: ::core::ffi::c_uint,\n    ///< X dimension of each thread block\n    pub blockDimX: ::core::ffi::c_uint,\n    ///< Y dimension of each thread block\n    pub blockDimY: ::core::ffi::c_uint,\n    ///< Z dimension of each thread block\n    pub blockDimZ: ::core::ffi::c_uint,\n    ///< Dynamic shared-memory size per thread block in bytes\n    pub sharedMemBytes: ::core::ffi::c_uint,\n    ///< Stream identifier\n    pub hStream: CUstream,\n    ///< List of attributes; nullable if ::CUlaunchConfig::numAttrs == 0\n    pub attrs: *mut CUlaunchAttribute,\n    ///< Number of attributes populated in ::CUlaunchConfig::attrs\n    pub numAttrs: ::core::ffi::c_uint,\n}\n/// CUDA extensible launch configuration\npub type CUlaunchConfig = CUlaunchConfig_st;\n/// Launch attributes enum; used as id field of ::CUlaunchAttribute\npub use self::CUlaunchAttributeID as CUkernelNodeAttrID;\n/// Launch attributes union; used as value field of ::CUlaunchAttribute\npub type CUkernelNodeAttrValue_v1 = CUlaunchAttributeValue;\n/// Launch attributes union; used as value field of ::CUlaunchAttribute\npub type CUkernelNodeAttrValue = CUkernelNodeAttrValue_v1;\nimpl CUstreamCaptureStatus_enum {\n    ///< Stream is not capturing\n    pub const CU_STREAM_CAPTURE_STATUS_NONE: CUstreamCaptureStatus_enum = CUstreamCaptureStatus_enum(\n        0,\n    );\n}\nimpl CUstreamCaptureStatus_enum {\n    ///< Stream is actively capturing\n    pub const CU_STREAM_CAPTURE_STATUS_ACTIVE: CUstreamCaptureStatus_enum = CUstreamCaptureStatus_enum(\n        1,\n    );\n}\nimpl CUstreamCaptureStatus_enum {\n    /**< Stream is part of a capture sequence that\nhas been invalidated, but not terminated*/\n    pub const CU_STREAM_CAPTURE_STATUS_INVALIDATED: CUstreamCaptureStatus_enum = CUstreamCaptureStatus_enum(\n        2,\n    );\n}\n#[repr(transparent)]\n/// Possible stream capture statuses returned by ::cuStreamIsCapturing\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUstreamCaptureStatus_enum(pub ::core::ffi::c_uint);\n/// Possible stream capture statuses returned by ::cuStreamIsCapturing\npub use self::CUstreamCaptureStatus_enum as CUstreamCaptureStatus;\nimpl CUstreamCaptureMode_enum {\n    pub const CU_STREAM_CAPTURE_MODE_GLOBAL: CUstreamCaptureMode_enum = CUstreamCaptureMode_enum(\n        0,\n    );\n}\nimpl CUstreamCaptureMode_enum {\n    pub const CU_STREAM_CAPTURE_MODE_THREAD_LOCAL: CUstreamCaptureMode_enum = CUstreamCaptureMode_enum(\n        1,\n    );\n}\nimpl CUstreamCaptureMode_enum {\n    pub const CU_STREAM_CAPTURE_MODE_RELAXED: CUstreamCaptureMode_enum = CUstreamCaptureMode_enum(\n        2,\n    );\n}\n#[repr(transparent)]\n/** Possible modes for stream capture thread interactions. For more details see\n ::cuStreamBeginCapture and ::cuThreadExchangeStreamCaptureMode*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUstreamCaptureMode_enum(pub ::core::ffi::c_uint);\n/// Launch attributes enum; used as id field of ::CUlaunchAttribute\npub use self::CUlaunchAttributeID as CUstreamAttrID;\n/** Possible modes for stream capture thread interactions. For more details see\n ::cuStreamBeginCapture and ::cuThreadExchangeStreamCaptureMode*/\npub use self::CUstreamCaptureMode_enum as CUstreamCaptureMode;\n/// Launch attributes union; used as value field of ::CUlaunchAttribute\npub type CUstreamAttrValue_v1 = CUlaunchAttributeValue;\n/// Launch attributes union; used as value field of ::CUlaunchAttribute\npub type CUstreamAttrValue = CUstreamAttrValue_v1;\nimpl CUdriverProcAddress_flags_enum {\n    ///< Default search mode for driver symbols.\n    pub const CU_GET_PROC_ADDRESS_DEFAULT: CUdriverProcAddress_flags_enum = CUdriverProcAddress_flags_enum(\n        0,\n    );\n}\nimpl CUdriverProcAddress_flags_enum {\n    ///< Search for legacy versions of driver symbols.\n    pub const CU_GET_PROC_ADDRESS_LEGACY_STREAM: CUdriverProcAddress_flags_enum = CUdriverProcAddress_flags_enum(\n        1,\n    );\n}\nimpl CUdriverProcAddress_flags_enum {\n    ///< Search for per-thread versions of driver symbols.\n    pub const CU_GET_PROC_ADDRESS_PER_THREAD_DEFAULT_STREAM: CUdriverProcAddress_flags_enum = CUdriverProcAddress_flags_enum(\n        2,\n    );\n}\n#[repr(transparent)]\n/// Flags to specify search options. For more details see ::cuGetProcAddress\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUdriverProcAddress_flags_enum(pub ::core::ffi::c_uint);\n/// Flags to specify search options. For more details see ::cuGetProcAddress\npub use self::CUdriverProcAddress_flags_enum as CUdriverProcAddress_flags;\nimpl CUdriverProcAddressQueryResult_enum {\n    ///< Symbol was succesfully found\n    pub const CU_GET_PROC_ADDRESS_SUCCESS: CUdriverProcAddressQueryResult_enum = CUdriverProcAddressQueryResult_enum(\n        0,\n    );\n}\nimpl CUdriverProcAddressQueryResult_enum {\n    ///< Symbol was not found in search\n    pub const CU_GET_PROC_ADDRESS_SYMBOL_NOT_FOUND: CUdriverProcAddressQueryResult_enum = CUdriverProcAddressQueryResult_enum(\n        1,\n    );\n}\nimpl CUdriverProcAddressQueryResult_enum {\n    ///< Symbol was found but version supplied was not sufficient\n    pub const CU_GET_PROC_ADDRESS_VERSION_NOT_SUFFICIENT: CUdriverProcAddressQueryResult_enum = CUdriverProcAddressQueryResult_enum(\n        2,\n    );\n}\n#[repr(transparent)]\n/// Flags to indicate search status. For more details see ::cuGetProcAddress\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUdriverProcAddressQueryResult_enum(pub ::core::ffi::c_uint);\n/// Flags to indicate search status. For more details see ::cuGetProcAddress\npub use self::CUdriverProcAddressQueryResult_enum as CUdriverProcAddressQueryResult;\nimpl CUexecAffinityType_enum {\n    ///< Create a context with limited SMs.\n    pub const CU_EXEC_AFFINITY_TYPE_SM_COUNT: CUexecAffinityType_enum = CUexecAffinityType_enum(\n        0,\n    );\n}\nimpl CUexecAffinityType_enum {\n    pub const CU_EXEC_AFFINITY_TYPE_MAX: CUexecAffinityType_enum = CUexecAffinityType_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n/// Execution Affinity Types\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUexecAffinityType_enum(pub ::core::ffi::c_uint);\n/// Execution Affinity Types\npub use self::CUexecAffinityType_enum as CUexecAffinityType;\n/// Value for ::CU_EXEC_AFFINITY_TYPE_SM_COUNT\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUexecAffinitySmCount_st {\n    ///< The number of SMs the context is limited to use.\n    pub val: ::core::ffi::c_uint,\n}\n/// Value for ::CU_EXEC_AFFINITY_TYPE_SM_COUNT\npub type CUexecAffinitySmCount_v1 = CUexecAffinitySmCount_st;\n/// Value for ::CU_EXEC_AFFINITY_TYPE_SM_COUNT\npub type CUexecAffinitySmCount = CUexecAffinitySmCount_v1;\n/// Execution Affinity Parameters\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct CUexecAffinityParam_st {\n    pub type_: CUexecAffinityType,\n    pub param: CUexecAffinityParam_st__bindgen_ty_1,\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union CUexecAffinityParam_st__bindgen_ty_1 {\n    pub smCount: CUexecAffinitySmCount,\n}\n/// Execution Affinity Parameters\npub type CUexecAffinityParam_v1 = CUexecAffinityParam_st;\n/// Execution Affinity Parameters\npub type CUexecAffinityParam = CUexecAffinityParam_v1;\nimpl CUcigDataType_enum {\n    pub const CIG_DATA_TYPE_D3D12_COMMAND_QUEUE: CUcigDataType_enum = CUcigDataType_enum(\n        1,\n    );\n}\nimpl CUcigDataType_enum {\n    /// D3D12 Command Queue Handle\n    pub const CIG_DATA_TYPE_NV_BLOB: CUcigDataType_enum = CUcigDataType_enum(2);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUcigDataType_enum(pub ::core::ffi::c_uint);\npub use self::CUcigDataType_enum as CUcigDataType;\n/// CIG Context Create Params\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUctxCigParam_st {\n    pub sharedDataType: CUcigDataType,\n    pub sharedData: *mut ::core::ffi::c_void,\n}\n/// CIG Context Create Params\npub type CUctxCigParam = CUctxCigParam_st;\n/** Params for creating CUDA context\n Exactly one of execAffinityParams and cigParams\n must be non-NULL.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUctxCreateParams_st {\n    pub execAffinityParams: *mut CUexecAffinityParam,\n    pub numExecAffinityParams: ::core::ffi::c_int,\n    pub cigParams: *mut CUctxCigParam,\n}\n/** Params for creating CUDA context\n Exactly one of execAffinityParams and cigParams\n must be non-NULL.*/\npub type CUctxCreateParams = CUctxCreateParams_st;\nimpl CUlibraryOption_enum {\n    pub const CU_LIBRARY_HOST_UNIVERSAL_FUNCTION_AND_DATA_TABLE: CUlibraryOption_enum = CUlibraryOption_enum(\n        0,\n    );\n}\nimpl CUlibraryOption_enum {\n    /** Specifes that the argument \\p code passed to ::cuLibraryLoadData() will be preserved.\n Specifying this option will let the driver know that \\p code can be accessed at any point\n until ::cuLibraryUnload(). The default behavior is for the driver to allocate and\n maintain its own copy of \\p code. Note that this is only a memory usage optimization\n hint and the driver can choose to ignore it if required.\n Specifying this option with ::cuLibraryLoadFromFile() is invalid and\n will return ::CUDA_ERROR_INVALID_VALUE.*/\n    pub const CU_LIBRARY_BINARY_IS_PRESERVED: CUlibraryOption_enum = CUlibraryOption_enum(\n        1,\n    );\n}\nimpl CUlibraryOption_enum {\n    /** Specifes that the argument \\p code passed to ::cuLibraryLoadData() will be preserved.\n Specifying this option will let the driver know that \\p code can be accessed at any point\n until ::cuLibraryUnload(). The default behavior is for the driver to allocate and\n maintain its own copy of \\p code. Note that this is only a memory usage optimization\n hint and the driver can choose to ignore it if required.\n Specifying this option with ::cuLibraryLoadFromFile() is invalid and\n will return ::CUDA_ERROR_INVALID_VALUE.*/\n    pub const CU_LIBRARY_NUM_OPTIONS: CUlibraryOption_enum = CUlibraryOption_enum(2);\n}\n#[repr(transparent)]\n/// Library options to be specified with ::cuLibraryLoadData() or ::cuLibraryLoadFromFile()\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUlibraryOption_enum(pub ::core::ffi::c_uint);\n/// Library options to be specified with ::cuLibraryLoadData() or ::cuLibraryLoadFromFile()\npub use self::CUlibraryOption_enum as CUlibraryOption;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUlibraryHostUniversalFunctionAndDataTable_st {\n    pub functionTable: *mut ::core::ffi::c_void,\n    pub functionWindowSize: usize,\n    pub dataTable: *mut ::core::ffi::c_void,\n    pub dataWindowSize: usize,\n}\npub type CUlibraryHostUniversalFunctionAndDataTable = CUlibraryHostUniversalFunctionAndDataTable_st;\nimpl CUdevice_P2PAttribute_enum {\n    ///< A relative value indicating the performance of the link between two devices\n    pub const CU_DEVICE_P2P_ATTRIBUTE_PERFORMANCE_RANK: CUdevice_P2PAttribute_enum = CUdevice_P2PAttribute_enum(\n        1,\n    );\n}\nimpl CUdevice_P2PAttribute_enum {\n    ///< P2P Access is enable\n    pub const CU_DEVICE_P2P_ATTRIBUTE_ACCESS_SUPPORTED: CUdevice_P2PAttribute_enum = CUdevice_P2PAttribute_enum(\n        2,\n    );\n}\nimpl CUdevice_P2PAttribute_enum {\n    ///< All CUDA-valid atomic operation over the link are supported\n    pub const CU_DEVICE_P2P_ATTRIBUTE_NATIVE_ATOMIC_SUPPORTED: CUdevice_P2PAttribute_enum = CUdevice_P2PAttribute_enum(\n        3,\n    );\n}\nimpl CUdevice_P2PAttribute_enum {\n    ///< \\deprecated use CU_DEVICE_P2P_ATTRIBUTE_CUDA_ARRAY_ACCESS_SUPPORTED instead\n    pub const CU_DEVICE_P2P_ATTRIBUTE_ACCESS_ACCESS_SUPPORTED: CUdevice_P2PAttribute_enum = CUdevice_P2PAttribute_enum(\n        4,\n    );\n}\nimpl CUdevice_P2PAttribute_enum {\n    ///< Accessing CUDA arrays over the link supported\n    pub const CU_DEVICE_P2P_ATTRIBUTE_CUDA_ARRAY_ACCESS_SUPPORTED: CUdevice_P2PAttribute_enum = CUdevice_P2PAttribute_enum(\n        4,\n    );\n}\nimpl CUdevice_P2PAttribute_enum {\n    ///< Only some CUDA-valid atomic operations over the link are supported.\n    pub const CU_DEVICE_P2P_ATTRIBUTE_ONLY_PARTIAL_NATIVE_ATOMIC_SUPPORTED: CUdevice_P2PAttribute_enum = CUdevice_P2PAttribute_enum(\n        5,\n    );\n}\n#[repr(transparent)]\n/// P2P Attributes\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUdevice_P2PAttribute_enum(pub ::core::ffi::c_uint);\n/// P2P Attributes\npub use self::CUdevice_P2PAttribute_enum as CUdevice_P2PAttribute;\nimpl CUatomicOperation_enum {\n    pub const CU_ATOMIC_OPERATION_INTEGER_ADD: CUatomicOperation_enum = CUatomicOperation_enum(\n        0,\n    );\n}\nimpl CUatomicOperation_enum {\n    pub const CU_ATOMIC_OPERATION_INTEGER_MIN: CUatomicOperation_enum = CUatomicOperation_enum(\n        1,\n    );\n}\nimpl CUatomicOperation_enum {\n    pub const CU_ATOMIC_OPERATION_INTEGER_MAX: CUatomicOperation_enum = CUatomicOperation_enum(\n        2,\n    );\n}\nimpl CUatomicOperation_enum {\n    pub const CU_ATOMIC_OPERATION_INTEGER_INCREMENT: CUatomicOperation_enum = CUatomicOperation_enum(\n        3,\n    );\n}\nimpl CUatomicOperation_enum {\n    pub const CU_ATOMIC_OPERATION_INTEGER_DECREMENT: CUatomicOperation_enum = CUatomicOperation_enum(\n        4,\n    );\n}\nimpl CUatomicOperation_enum {\n    pub const CU_ATOMIC_OPERATION_AND: CUatomicOperation_enum = CUatomicOperation_enum(\n        5,\n    );\n}\nimpl CUatomicOperation_enum {\n    pub const CU_ATOMIC_OPERATION_OR: CUatomicOperation_enum = CUatomicOperation_enum(6);\n}\nimpl CUatomicOperation_enum {\n    pub const CU_ATOMIC_OPERATION_XOR: CUatomicOperation_enum = CUatomicOperation_enum(\n        7,\n    );\n}\nimpl CUatomicOperation_enum {\n    pub const CU_ATOMIC_OPERATION_EXCHANGE: CUatomicOperation_enum = CUatomicOperation_enum(\n        8,\n    );\n}\nimpl CUatomicOperation_enum {\n    pub const CU_ATOMIC_OPERATION_CAS: CUatomicOperation_enum = CUatomicOperation_enum(\n        9,\n    );\n}\nimpl CUatomicOperation_enum {\n    pub const CU_ATOMIC_OPERATION_FLOAT_ADD: CUatomicOperation_enum = CUatomicOperation_enum(\n        10,\n    );\n}\nimpl CUatomicOperation_enum {\n    pub const CU_ATOMIC_OPERATION_FLOAT_MIN: CUatomicOperation_enum = CUatomicOperation_enum(\n        11,\n    );\n}\nimpl CUatomicOperation_enum {\n    pub const CU_ATOMIC_OPERATION_FLOAT_MAX: CUatomicOperation_enum = CUatomicOperation_enum(\n        12,\n    );\n}\nimpl CUatomicOperation_enum {\n    pub const CU_ATOMIC_OPERATION_MAX: CUatomicOperation_enum = CUatomicOperation_enum(\n        13,\n    );\n}\n#[repr(transparent)]\n/// CUDA-valid Atomic Operations\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUatomicOperation_enum(pub ::core::ffi::c_uint);\n/// CUDA-valid Atomic Operations\npub use self::CUatomicOperation_enum as CUatomicOperation;\nimpl CUatomicOperationCapability_enum {\n    pub const CU_ATOMIC_CAPABILITY_SIGNED: CUatomicOperationCapability_enum = CUatomicOperationCapability_enum(\n        1,\n    );\n}\nimpl CUatomicOperationCapability_enum {\n    pub const CU_ATOMIC_CAPABILITY_UNSIGNED: CUatomicOperationCapability_enum = CUatomicOperationCapability_enum(\n        2,\n    );\n}\nimpl CUatomicOperationCapability_enum {\n    pub const CU_ATOMIC_CAPABILITY_REDUCTION: CUatomicOperationCapability_enum = CUatomicOperationCapability_enum(\n        4,\n    );\n}\nimpl CUatomicOperationCapability_enum {\n    pub const CU_ATOMIC_CAPABILITY_SCALAR_32: CUatomicOperationCapability_enum = CUatomicOperationCapability_enum(\n        8,\n    );\n}\nimpl CUatomicOperationCapability_enum {\n    pub const CU_ATOMIC_CAPABILITY_SCALAR_64: CUatomicOperationCapability_enum = CUatomicOperationCapability_enum(\n        16,\n    );\n}\nimpl CUatomicOperationCapability_enum {\n    pub const CU_ATOMIC_CAPABILITY_SCALAR_128: CUatomicOperationCapability_enum = CUatomicOperationCapability_enum(\n        32,\n    );\n}\nimpl CUatomicOperationCapability_enum {\n    pub const CU_ATOMIC_CAPABILITY_VECTOR_32x4: CUatomicOperationCapability_enum = CUatomicOperationCapability_enum(\n        64,\n    );\n}\n#[repr(transparent)]\n/// CUDA-valid Atomic Operation capabilities\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUatomicOperationCapability_enum(pub ::core::ffi::c_uint);\n/// CUDA-valid Atomic Operation capabilities\npub use self::CUatomicOperationCapability_enum as CUatomicOperationCapability;\n/** CUDA stream callback\n \\param hStream The stream the callback was added to, as passed to ::cuStreamAddCallback.  May be NULL.\n \\param status ::CUDA_SUCCESS or any persistent error on the stream.\n \\param userData User parameter provided at registration.*/\npub type CUstreamCallback = ::core::option::Option<\n    unsafe extern \"system\" fn(\n        hStream: CUstream,\n        status: CUresult,\n        userData: *mut ::core::ffi::c_void,\n    ),\n>;\n/** Block size to per-block dynamic shared memory mapping for a certain\n kernel \\param blockSize Block size of the kernel.\n\n \\return The dynamic shared memory needed by a block.*/\npub type CUoccupancyB2DSize = ::core::option::Option<\n    unsafe extern \"system\" fn(blockSize: ::core::ffi::c_int) -> usize,\n>;\n/// 2D memory copy parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_MEMCPY2D_st {\n    ///< Source X in bytes\n    pub srcXInBytes: usize,\n    ///< Source Y\n    pub srcY: usize,\n    ///< Source memory type (host, device, array)\n    pub srcMemoryType: CUmemorytype,\n    ///< Source host pointer\n    pub srcHost: *const ::core::ffi::c_void,\n    ///< Source device pointer\n    pub srcDevice: CUdeviceptr,\n    ///< Source array reference\n    pub srcArray: CUarray,\n    ///< Source pitch (ignored when src is array)\n    pub srcPitch: usize,\n    ///< Destination X in bytes\n    pub dstXInBytes: usize,\n    ///< Destination Y\n    pub dstY: usize,\n    ///< Destination memory type (host, device, array)\n    pub dstMemoryType: CUmemorytype,\n    ///< Destination host pointer\n    pub dstHost: *mut ::core::ffi::c_void,\n    ///< Destination device pointer\n    pub dstDevice: CUdeviceptr,\n    ///< Destination array reference\n    pub dstArray: CUarray,\n    ///< Destination pitch (ignored when dst is array)\n    pub dstPitch: usize,\n    ///< Width of 2D memory copy in bytes\n    pub WidthInBytes: usize,\n    ///< Height of 2D memory copy\n    pub Height: usize,\n}\n/// 2D memory copy parameters\npub type CUDA_MEMCPY2D_v2 = CUDA_MEMCPY2D_st;\n/// 2D memory copy parameters\npub type CUDA_MEMCPY2D = CUDA_MEMCPY2D_v2;\n/// 3D memory copy parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_MEMCPY3D_st {\n    ///< Source X in bytes\n    pub srcXInBytes: usize,\n    ///< Source Y\n    pub srcY: usize,\n    ///< Source Z\n    pub srcZ: usize,\n    ///< Source LOD\n    pub srcLOD: usize,\n    ///< Source memory type (host, device, array)\n    pub srcMemoryType: CUmemorytype,\n    ///< Source host pointer\n    pub srcHost: *const ::core::ffi::c_void,\n    ///< Source device pointer\n    pub srcDevice: CUdeviceptr,\n    ///< Source array reference\n    pub srcArray: CUarray,\n    ///< Must be NULL\n    pub reserved0: *mut ::core::ffi::c_void,\n    ///< Source pitch (ignored when src is array)\n    pub srcPitch: usize,\n    ///< Source height (ignored when src is array; may be 0 if Depth==1)\n    pub srcHeight: usize,\n    ///< Destination X in bytes\n    pub dstXInBytes: usize,\n    ///< Destination Y\n    pub dstY: usize,\n    ///< Destination Z\n    pub dstZ: usize,\n    ///< Destination LOD\n    pub dstLOD: usize,\n    ///< Destination memory type (host, device, array)\n    pub dstMemoryType: CUmemorytype,\n    ///< Destination host pointer\n    pub dstHost: *mut ::core::ffi::c_void,\n    ///< Destination device pointer\n    pub dstDevice: CUdeviceptr,\n    ///< Destination array reference\n    pub dstArray: CUarray,\n    ///< Must be NULL\n    pub reserved1: *mut ::core::ffi::c_void,\n    ///< Destination pitch (ignored when dst is array)\n    pub dstPitch: usize,\n    ///< Destination height (ignored when dst is array; may be 0 if Depth==1)\n    pub dstHeight: usize,\n    ///< Width of 3D memory copy in bytes\n    pub WidthInBytes: usize,\n    ///< Height of 3D memory copy\n    pub Height: usize,\n    ///< Depth of 3D memory copy\n    pub Depth: usize,\n}\n/// 3D memory copy parameters\npub type CUDA_MEMCPY3D_v2 = CUDA_MEMCPY3D_st;\n/// 3D memory copy parameters\npub type CUDA_MEMCPY3D = CUDA_MEMCPY3D_v2;\n/// 3D memory cross-context copy parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_MEMCPY3D_PEER_st {\n    ///< Source X in bytes\n    pub srcXInBytes: usize,\n    ///< Source Y\n    pub srcY: usize,\n    ///< Source Z\n    pub srcZ: usize,\n    ///< Source LOD\n    pub srcLOD: usize,\n    ///< Source memory type (host, device, array)\n    pub srcMemoryType: CUmemorytype,\n    ///< Source host pointer\n    pub srcHost: *const ::core::ffi::c_void,\n    ///< Source device pointer\n    pub srcDevice: CUdeviceptr,\n    ///< Source array reference\n    pub srcArray: CUarray,\n    ///< Source context (ignored with srcMemoryType is ::CU_MEMORYTYPE_ARRAY)\n    pub srcContext: CUcontext,\n    ///< Source pitch (ignored when src is array)\n    pub srcPitch: usize,\n    ///< Source height (ignored when src is array; may be 0 if Depth==1)\n    pub srcHeight: usize,\n    ///< Destination X in bytes\n    pub dstXInBytes: usize,\n    ///< Destination Y\n    pub dstY: usize,\n    ///< Destination Z\n    pub dstZ: usize,\n    ///< Destination LOD\n    pub dstLOD: usize,\n    ///< Destination memory type (host, device, array)\n    pub dstMemoryType: CUmemorytype,\n    ///< Destination host pointer\n    pub dstHost: *mut ::core::ffi::c_void,\n    ///< Destination device pointer\n    pub dstDevice: CUdeviceptr,\n    ///< Destination array reference\n    pub dstArray: CUarray,\n    ///< Destination context (ignored with dstMemoryType is ::CU_MEMORYTYPE_ARRAY)\n    pub dstContext: CUcontext,\n    ///< Destination pitch (ignored when dst is array)\n    pub dstPitch: usize,\n    ///< Destination height (ignored when dst is array; may be 0 if Depth==1)\n    pub dstHeight: usize,\n    ///< Width of 3D memory copy in bytes\n    pub WidthInBytes: usize,\n    ///< Height of 3D memory copy\n    pub Height: usize,\n    ///< Depth of 3D memory copy\n    pub Depth: usize,\n}\n/// 3D memory cross-context copy parameters\npub type CUDA_MEMCPY3D_PEER_v1 = CUDA_MEMCPY3D_PEER_st;\n/// 3D memory cross-context copy parameters\npub type CUDA_MEMCPY3D_PEER = CUDA_MEMCPY3D_PEER_v1;\n/// Memcpy node parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_MEMCPY_NODE_PARAMS_st {\n    ///< Must be zero\n    pub flags: ::core::ffi::c_int,\n    ///< Must be zero\n    pub reserved: ::core::ffi::c_int,\n    ///< Context on which to run the node\n    pub copyCtx: CUcontext,\n    ///< Parameters for the memory copy\n    pub copyParams: CUDA_MEMCPY3D,\n}\n/// Memcpy node parameters\npub type CUDA_MEMCPY_NODE_PARAMS = CUDA_MEMCPY_NODE_PARAMS_st;\n/// Array descriptor\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_ARRAY_DESCRIPTOR_st {\n    ///< Width of array\n    pub Width: usize,\n    ///< Height of array\n    pub Height: usize,\n    ///< Array format\n    pub Format: CUarray_format,\n    ///< Channels per array element\n    pub NumChannels: ::core::ffi::c_uint,\n}\n/// Array descriptor\npub type CUDA_ARRAY_DESCRIPTOR_v2 = CUDA_ARRAY_DESCRIPTOR_st;\n/// Array descriptor\npub type CUDA_ARRAY_DESCRIPTOR = CUDA_ARRAY_DESCRIPTOR_v2;\n/// 3D array descriptor\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_ARRAY3D_DESCRIPTOR_st {\n    ///< Width of 3D array\n    pub Width: usize,\n    ///< Height of 3D array\n    pub Height: usize,\n    ///< Depth of 3D array\n    pub Depth: usize,\n    ///< Array format\n    pub Format: CUarray_format,\n    ///< Channels per array element\n    pub NumChannels: ::core::ffi::c_uint,\n    ///< Flags\n    pub Flags: ::core::ffi::c_uint,\n}\n/// 3D array descriptor\npub type CUDA_ARRAY3D_DESCRIPTOR_v2 = CUDA_ARRAY3D_DESCRIPTOR_st;\n/// 3D array descriptor\npub type CUDA_ARRAY3D_DESCRIPTOR = CUDA_ARRAY3D_DESCRIPTOR_v2;\n/// CUDA array sparse properties\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_ARRAY_SPARSE_PROPERTIES_st {\n    pub tileExtent: CUDA_ARRAY_SPARSE_PROPERTIES_st__bindgen_ty_1,\n    /// First mip level at which the mip tail begins.\n    pub miptailFirstLevel: ::core::ffi::c_uint,\n    /// Total size of the mip tail.\n    pub miptailSize: ::core::ffi::c_ulonglong,\n    /// Flags will either be zero or ::CU_ARRAY_SPARSE_PROPERTIES_SINGLE_MIPTAIL\n    pub flags: ::core::ffi::c_uint,\n    pub reserved: [::core::ffi::c_uint; 4usize],\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_ARRAY_SPARSE_PROPERTIES_st__bindgen_ty_1 {\n    ///< Width of sparse tile in elements\n    pub width: ::core::ffi::c_uint,\n    ///< Height of sparse tile in elements\n    pub height: ::core::ffi::c_uint,\n    ///< Depth of sparse tile in elements\n    pub depth: ::core::ffi::c_uint,\n}\n/// CUDA array sparse properties\npub type CUDA_ARRAY_SPARSE_PROPERTIES_v1 = CUDA_ARRAY_SPARSE_PROPERTIES_st;\n/// CUDA array sparse properties\npub type CUDA_ARRAY_SPARSE_PROPERTIES = CUDA_ARRAY_SPARSE_PROPERTIES_v1;\n/// CUDA array memory requirements\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_ARRAY_MEMORY_REQUIREMENTS_st {\n    ///< Total required memory size\n    pub size: usize,\n    ///< alignment requirement\n    pub alignment: usize,\n    pub reserved: [::core::ffi::c_uint; 4usize],\n}\n/// CUDA array memory requirements\npub type CUDA_ARRAY_MEMORY_REQUIREMENTS_v1 = CUDA_ARRAY_MEMORY_REQUIREMENTS_st;\n/// CUDA array memory requirements\npub type CUDA_ARRAY_MEMORY_REQUIREMENTS = CUDA_ARRAY_MEMORY_REQUIREMENTS_v1;\n/// CUDA Resource descriptor\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct CUDA_RESOURCE_DESC_st {\n    ///< Resource type\n    pub resType: CUresourcetype,\n    pub res: CUDA_RESOURCE_DESC_st__bindgen_ty_1,\n    ///< Flags (must be zero)\n    pub flags: ::core::ffi::c_uint,\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union CUDA_RESOURCE_DESC_st__bindgen_ty_1 {\n    pub array: CUDA_RESOURCE_DESC_st__bindgen_ty_1__bindgen_ty_1,\n    pub mipmap: CUDA_RESOURCE_DESC_st__bindgen_ty_1__bindgen_ty_2,\n    pub linear: CUDA_RESOURCE_DESC_st__bindgen_ty_1__bindgen_ty_3,\n    pub pitch2D: CUDA_RESOURCE_DESC_st__bindgen_ty_1__bindgen_ty_4,\n    pub reserved: CUDA_RESOURCE_DESC_st__bindgen_ty_1__bindgen_ty_5,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_RESOURCE_DESC_st__bindgen_ty_1__bindgen_ty_1 {\n    ///< CUDA array\n    pub hArray: CUarray,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_RESOURCE_DESC_st__bindgen_ty_1__bindgen_ty_2 {\n    ///< CUDA mipmapped array\n    pub hMipmappedArray: CUmipmappedArray,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_RESOURCE_DESC_st__bindgen_ty_1__bindgen_ty_3 {\n    ///< Device pointer\n    pub devPtr: CUdeviceptr,\n    ///< Array format\n    pub format: CUarray_format,\n    ///< Channels per array element\n    pub numChannels: ::core::ffi::c_uint,\n    ///< Size in bytes\n    pub sizeInBytes: usize,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_RESOURCE_DESC_st__bindgen_ty_1__bindgen_ty_4 {\n    ///< Device pointer\n    pub devPtr: CUdeviceptr,\n    ///< Array format\n    pub format: CUarray_format,\n    ///< Channels per array element\n    pub numChannels: ::core::ffi::c_uint,\n    ///< Width of the array in elements\n    pub width: usize,\n    ///< Height of the array in elements\n    pub height: usize,\n    ///< Pitch between two rows in bytes\n    pub pitchInBytes: usize,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_RESOURCE_DESC_st__bindgen_ty_1__bindgen_ty_5 {\n    pub reserved: [::core::ffi::c_int; 32usize],\n}\n/// CUDA Resource descriptor\npub type CUDA_RESOURCE_DESC_v1 = CUDA_RESOURCE_DESC_st;\n/// CUDA Resource descriptor\npub type CUDA_RESOURCE_DESC = CUDA_RESOURCE_DESC_v1;\n/// Texture descriptor\n#[repr(C)]\n#[derive(Debug, Copy, Clone, PartialEq)]\npub struct CUDA_TEXTURE_DESC_st {\n    ///< Address modes\n    pub addressMode: [CUaddress_mode; 3usize],\n    ///< Filter mode\n    pub filterMode: CUfilter_mode,\n    ///< Flags\n    pub flags: ::core::ffi::c_uint,\n    ///< Maximum anisotropy ratio\n    pub maxAnisotropy: ::core::ffi::c_uint,\n    ///< Mipmap filter mode\n    pub mipmapFilterMode: CUfilter_mode,\n    ///< Mipmap level bias\n    pub mipmapLevelBias: f32,\n    ///< Mipmap minimum level clamp\n    pub minMipmapLevelClamp: f32,\n    ///< Mipmap maximum level clamp\n    pub maxMipmapLevelClamp: f32,\n    ///< Border Color\n    pub borderColor: [f32; 4usize],\n    pub reserved: [::core::ffi::c_int; 12usize],\n}\n/// Texture descriptor\npub type CUDA_TEXTURE_DESC_v1 = CUDA_TEXTURE_DESC_st;\n/// Texture descriptor\npub type CUDA_TEXTURE_DESC = CUDA_TEXTURE_DESC_v1;\nimpl CUresourceViewFormat_enum {\n    ///< No resource view format (use underlying resource format)\n    pub const CU_RES_VIEW_FORMAT_NONE: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        0,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< 1 channel unsigned 8-bit integers\n    pub const CU_RES_VIEW_FORMAT_UINT_1X8: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        1,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< 2 channel unsigned 8-bit integers\n    pub const CU_RES_VIEW_FORMAT_UINT_2X8: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        2,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< 4 channel unsigned 8-bit integers\n    pub const CU_RES_VIEW_FORMAT_UINT_4X8: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        3,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< 1 channel signed 8-bit integers\n    pub const CU_RES_VIEW_FORMAT_SINT_1X8: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        4,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< 2 channel signed 8-bit integers\n    pub const CU_RES_VIEW_FORMAT_SINT_2X8: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        5,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< 4 channel signed 8-bit integers\n    pub const CU_RES_VIEW_FORMAT_SINT_4X8: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        6,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< 1 channel unsigned 16-bit integers\n    pub const CU_RES_VIEW_FORMAT_UINT_1X16: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        7,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< 2 channel unsigned 16-bit integers\n    pub const CU_RES_VIEW_FORMAT_UINT_2X16: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        8,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< 4 channel unsigned 16-bit integers\n    pub const CU_RES_VIEW_FORMAT_UINT_4X16: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        9,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< 1 channel signed 16-bit integers\n    pub const CU_RES_VIEW_FORMAT_SINT_1X16: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        10,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< 2 channel signed 16-bit integers\n    pub const CU_RES_VIEW_FORMAT_SINT_2X16: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        11,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< 4 channel signed 16-bit integers\n    pub const CU_RES_VIEW_FORMAT_SINT_4X16: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        12,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< 1 channel unsigned 32-bit integers\n    pub const CU_RES_VIEW_FORMAT_UINT_1X32: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        13,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< 2 channel unsigned 32-bit integers\n    pub const CU_RES_VIEW_FORMAT_UINT_2X32: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        14,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< 4 channel unsigned 32-bit integers\n    pub const CU_RES_VIEW_FORMAT_UINT_4X32: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        15,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< 1 channel signed 32-bit integers\n    pub const CU_RES_VIEW_FORMAT_SINT_1X32: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        16,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< 2 channel signed 32-bit integers\n    pub const CU_RES_VIEW_FORMAT_SINT_2X32: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        17,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< 4 channel signed 32-bit integers\n    pub const CU_RES_VIEW_FORMAT_SINT_4X32: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        18,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< 1 channel 16-bit floating point\n    pub const CU_RES_VIEW_FORMAT_FLOAT_1X16: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        19,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< 2 channel 16-bit floating point\n    pub const CU_RES_VIEW_FORMAT_FLOAT_2X16: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        20,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< 4 channel 16-bit floating point\n    pub const CU_RES_VIEW_FORMAT_FLOAT_4X16: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        21,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< 1 channel 32-bit floating point\n    pub const CU_RES_VIEW_FORMAT_FLOAT_1X32: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        22,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< 2 channel 32-bit floating point\n    pub const CU_RES_VIEW_FORMAT_FLOAT_2X32: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        23,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< 4 channel 32-bit floating point\n    pub const CU_RES_VIEW_FORMAT_FLOAT_4X32: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        24,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< Block compressed 1\n    pub const CU_RES_VIEW_FORMAT_UNSIGNED_BC1: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        25,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< Block compressed 2\n    pub const CU_RES_VIEW_FORMAT_UNSIGNED_BC2: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        26,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< Block compressed 3\n    pub const CU_RES_VIEW_FORMAT_UNSIGNED_BC3: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        27,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< Block compressed 4 unsigned\n    pub const CU_RES_VIEW_FORMAT_UNSIGNED_BC4: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        28,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< Block compressed 4 signed\n    pub const CU_RES_VIEW_FORMAT_SIGNED_BC4: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        29,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< Block compressed 5 unsigned\n    pub const CU_RES_VIEW_FORMAT_UNSIGNED_BC5: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        30,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< Block compressed 5 signed\n    pub const CU_RES_VIEW_FORMAT_SIGNED_BC5: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        31,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< Block compressed 6 unsigned half-float\n    pub const CU_RES_VIEW_FORMAT_UNSIGNED_BC6H: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        32,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< Block compressed 6 signed half-float\n    pub const CU_RES_VIEW_FORMAT_SIGNED_BC6H: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        33,\n    );\n}\nimpl CUresourceViewFormat_enum {\n    ///< Block compressed 7\n    pub const CU_RES_VIEW_FORMAT_UNSIGNED_BC7: CUresourceViewFormat_enum = CUresourceViewFormat_enum(\n        34,\n    );\n}\n#[repr(transparent)]\n/// Resource view format\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUresourceViewFormat_enum(pub ::core::ffi::c_uint);\n/// Resource view format\npub use self::CUresourceViewFormat_enum as CUresourceViewFormat;\n/// Resource view descriptor\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_RESOURCE_VIEW_DESC_st {\n    ///< Resource view format\n    pub format: CUresourceViewFormat,\n    ///< Width of the resource view\n    pub width: usize,\n    ///< Height of the resource view\n    pub height: usize,\n    ///< Depth of the resource view\n    pub depth: usize,\n    ///< First defined mipmap level\n    pub firstMipmapLevel: ::core::ffi::c_uint,\n    ///< Last defined mipmap level\n    pub lastMipmapLevel: ::core::ffi::c_uint,\n    ///< First layer index\n    pub firstLayer: ::core::ffi::c_uint,\n    ///< Last layer index\n    pub lastLayer: ::core::ffi::c_uint,\n    pub reserved: [::core::ffi::c_uint; 16usize],\n}\n/// Resource view descriptor\npub type CUDA_RESOURCE_VIEW_DESC_v1 = CUDA_RESOURCE_VIEW_DESC_st;\n/// Resource view descriptor\npub type CUDA_RESOURCE_VIEW_DESC = CUDA_RESOURCE_VIEW_DESC_v1;\n/// Tensor map descriptor. Requires compiler support for aligning to 128 bytes.\n#[repr(C)]\n#[repr(align(128))]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUtensorMap_st {\n    pub opaque: [cuuint64_t; 16usize],\n}\n/// Tensor map descriptor. Requires compiler support for aligning to 128 bytes.\npub type CUtensorMap = CUtensorMap_st;\nimpl CUtensorMapDataType_enum {\n    pub const CU_TENSOR_MAP_DATA_TYPE_UINT8: CUtensorMapDataType_enum = CUtensorMapDataType_enum(\n        0,\n    );\n}\nimpl CUtensorMapDataType_enum {\n    pub const CU_TENSOR_MAP_DATA_TYPE_UINT16: CUtensorMapDataType_enum = CUtensorMapDataType_enum(\n        1,\n    );\n}\nimpl CUtensorMapDataType_enum {\n    pub const CU_TENSOR_MAP_DATA_TYPE_UINT32: CUtensorMapDataType_enum = CUtensorMapDataType_enum(\n        2,\n    );\n}\nimpl CUtensorMapDataType_enum {\n    pub const CU_TENSOR_MAP_DATA_TYPE_INT32: CUtensorMapDataType_enum = CUtensorMapDataType_enum(\n        3,\n    );\n}\nimpl CUtensorMapDataType_enum {\n    pub const CU_TENSOR_MAP_DATA_TYPE_UINT64: CUtensorMapDataType_enum = CUtensorMapDataType_enum(\n        4,\n    );\n}\nimpl CUtensorMapDataType_enum {\n    pub const CU_TENSOR_MAP_DATA_TYPE_INT64: CUtensorMapDataType_enum = CUtensorMapDataType_enum(\n        5,\n    );\n}\nimpl CUtensorMapDataType_enum {\n    pub const CU_TENSOR_MAP_DATA_TYPE_FLOAT16: CUtensorMapDataType_enum = CUtensorMapDataType_enum(\n        6,\n    );\n}\nimpl CUtensorMapDataType_enum {\n    pub const CU_TENSOR_MAP_DATA_TYPE_FLOAT32: CUtensorMapDataType_enum = CUtensorMapDataType_enum(\n        7,\n    );\n}\nimpl CUtensorMapDataType_enum {\n    pub const CU_TENSOR_MAP_DATA_TYPE_FLOAT64: CUtensorMapDataType_enum = CUtensorMapDataType_enum(\n        8,\n    );\n}\nimpl CUtensorMapDataType_enum {\n    pub const CU_TENSOR_MAP_DATA_TYPE_BFLOAT16: CUtensorMapDataType_enum = CUtensorMapDataType_enum(\n        9,\n    );\n}\nimpl CUtensorMapDataType_enum {\n    pub const CU_TENSOR_MAP_DATA_TYPE_FLOAT32_FTZ: CUtensorMapDataType_enum = CUtensorMapDataType_enum(\n        10,\n    );\n}\nimpl CUtensorMapDataType_enum {\n    pub const CU_TENSOR_MAP_DATA_TYPE_TFLOAT32: CUtensorMapDataType_enum = CUtensorMapDataType_enum(\n        11,\n    );\n}\nimpl CUtensorMapDataType_enum {\n    pub const CU_TENSOR_MAP_DATA_TYPE_TFLOAT32_FTZ: CUtensorMapDataType_enum = CUtensorMapDataType_enum(\n        12,\n    );\n}\nimpl CUtensorMapDataType_enum {\n    pub const CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN8B: CUtensorMapDataType_enum = CUtensorMapDataType_enum(\n        13,\n    );\n}\nimpl CUtensorMapDataType_enum {\n    pub const CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN16B: CUtensorMapDataType_enum = CUtensorMapDataType_enum(\n        14,\n    );\n}\nimpl CUtensorMapDataType_enum {\n    pub const CU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B: CUtensorMapDataType_enum = CUtensorMapDataType_enum(\n        15,\n    );\n}\n#[repr(transparent)]\n/// Tensor map data type\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUtensorMapDataType_enum(pub ::core::ffi::c_uint);\n/// Tensor map data type\npub use self::CUtensorMapDataType_enum as CUtensorMapDataType;\nimpl CUtensorMapInterleave_enum {\n    pub const CU_TENSOR_MAP_INTERLEAVE_NONE: CUtensorMapInterleave_enum = CUtensorMapInterleave_enum(\n        0,\n    );\n}\nimpl CUtensorMapInterleave_enum {\n    pub const CU_TENSOR_MAP_INTERLEAVE_16B: CUtensorMapInterleave_enum = CUtensorMapInterleave_enum(\n        1,\n    );\n}\nimpl CUtensorMapInterleave_enum {\n    pub const CU_TENSOR_MAP_INTERLEAVE_32B: CUtensorMapInterleave_enum = CUtensorMapInterleave_enum(\n        2,\n    );\n}\n#[repr(transparent)]\n/// Tensor map interleave layout type\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUtensorMapInterleave_enum(pub ::core::ffi::c_uint);\n/// Tensor map interleave layout type\npub use self::CUtensorMapInterleave_enum as CUtensorMapInterleave;\nimpl CUtensorMapSwizzle_enum {\n    pub const CU_TENSOR_MAP_SWIZZLE_NONE: CUtensorMapSwizzle_enum = CUtensorMapSwizzle_enum(\n        0,\n    );\n}\nimpl CUtensorMapSwizzle_enum {\n    pub const CU_TENSOR_MAP_SWIZZLE_32B: CUtensorMapSwizzle_enum = CUtensorMapSwizzle_enum(\n        1,\n    );\n}\nimpl CUtensorMapSwizzle_enum {\n    pub const CU_TENSOR_MAP_SWIZZLE_64B: CUtensorMapSwizzle_enum = CUtensorMapSwizzle_enum(\n        2,\n    );\n}\nimpl CUtensorMapSwizzle_enum {\n    pub const CU_TENSOR_MAP_SWIZZLE_128B: CUtensorMapSwizzle_enum = CUtensorMapSwizzle_enum(\n        3,\n    );\n}\nimpl CUtensorMapSwizzle_enum {\n    pub const CU_TENSOR_MAP_SWIZZLE_128B_ATOM_32B: CUtensorMapSwizzle_enum = CUtensorMapSwizzle_enum(\n        4,\n    );\n}\nimpl CUtensorMapSwizzle_enum {\n    pub const CU_TENSOR_MAP_SWIZZLE_128B_ATOM_32B_FLIP_8B: CUtensorMapSwizzle_enum = CUtensorMapSwizzle_enum(\n        5,\n    );\n}\nimpl CUtensorMapSwizzle_enum {\n    pub const CU_TENSOR_MAP_SWIZZLE_128B_ATOM_64B: CUtensorMapSwizzle_enum = CUtensorMapSwizzle_enum(\n        6,\n    );\n}\n#[repr(transparent)]\n/// Tensor map swizzling mode of shared memory banks\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUtensorMapSwizzle_enum(pub ::core::ffi::c_uint);\n/// Tensor map swizzling mode of shared memory banks\npub use self::CUtensorMapSwizzle_enum as CUtensorMapSwizzle;\nimpl CUtensorMapL2promotion_enum {\n    pub const CU_TENSOR_MAP_L2_PROMOTION_NONE: CUtensorMapL2promotion_enum = CUtensorMapL2promotion_enum(\n        0,\n    );\n}\nimpl CUtensorMapL2promotion_enum {\n    pub const CU_TENSOR_MAP_L2_PROMOTION_L2_64B: CUtensorMapL2promotion_enum = CUtensorMapL2promotion_enum(\n        1,\n    );\n}\nimpl CUtensorMapL2promotion_enum {\n    pub const CU_TENSOR_MAP_L2_PROMOTION_L2_128B: CUtensorMapL2promotion_enum = CUtensorMapL2promotion_enum(\n        2,\n    );\n}\nimpl CUtensorMapL2promotion_enum {\n    pub const CU_TENSOR_MAP_L2_PROMOTION_L2_256B: CUtensorMapL2promotion_enum = CUtensorMapL2promotion_enum(\n        3,\n    );\n}\n#[repr(transparent)]\n/// Tensor map L2 promotion type\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUtensorMapL2promotion_enum(pub ::core::ffi::c_uint);\n/// Tensor map L2 promotion type\npub use self::CUtensorMapL2promotion_enum as CUtensorMapL2promotion;\nimpl CUtensorMapFloatOOBfill_enum {\n    pub const CU_TENSOR_MAP_FLOAT_OOB_FILL_NONE: CUtensorMapFloatOOBfill_enum = CUtensorMapFloatOOBfill_enum(\n        0,\n    );\n}\nimpl CUtensorMapFloatOOBfill_enum {\n    pub const CU_TENSOR_MAP_FLOAT_OOB_FILL_NAN_REQUEST_ZERO_FMA: CUtensorMapFloatOOBfill_enum = CUtensorMapFloatOOBfill_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n/// Tensor map out-of-bounds fill type\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUtensorMapFloatOOBfill_enum(pub ::core::ffi::c_uint);\n/// Tensor map out-of-bounds fill type\npub use self::CUtensorMapFloatOOBfill_enum as CUtensorMapFloatOOBfill;\nimpl CUtensorMapIm2ColWideMode_enum {\n    pub const CU_TENSOR_MAP_IM2COL_WIDE_MODE_W: CUtensorMapIm2ColWideMode_enum = CUtensorMapIm2ColWideMode_enum(\n        0,\n    );\n}\nimpl CUtensorMapIm2ColWideMode_enum {\n    pub const CU_TENSOR_MAP_IM2COL_WIDE_MODE_W128: CUtensorMapIm2ColWideMode_enum = CUtensorMapIm2ColWideMode_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n/// Tensor map Im2Col wide mode\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUtensorMapIm2ColWideMode_enum(pub ::core::ffi::c_uint);\n/// Tensor map Im2Col wide mode\npub use self::CUtensorMapIm2ColWideMode_enum as CUtensorMapIm2ColWideMode;\n/// GPU Direct v3 tokens\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_POINTER_ATTRIBUTE_P2P_TOKENS_st {\n    pub p2pToken: ::core::ffi::c_ulonglong,\n    pub vaSpaceToken: ::core::ffi::c_uint,\n}\n/// GPU Direct v3 tokens\npub type CUDA_POINTER_ATTRIBUTE_P2P_TOKENS_v1 = CUDA_POINTER_ATTRIBUTE_P2P_TOKENS_st;\n/// GPU Direct v3 tokens\npub type CUDA_POINTER_ATTRIBUTE_P2P_TOKENS = CUDA_POINTER_ATTRIBUTE_P2P_TOKENS_v1;\nimpl CUDA_POINTER_ATTRIBUTE_ACCESS_FLAGS_enum {\n    ///< No access, meaning the device cannot access this memory at all, thus must be staged through accessible memory in order to complete certain operations\n    pub const CU_POINTER_ATTRIBUTE_ACCESS_FLAG_NONE: CUDA_POINTER_ATTRIBUTE_ACCESS_FLAGS_enum = CUDA_POINTER_ATTRIBUTE_ACCESS_FLAGS_enum(\n        0,\n    );\n}\nimpl CUDA_POINTER_ATTRIBUTE_ACCESS_FLAGS_enum {\n    ///< Read-only access, meaning writes to this memory are considered invalid accesses and thus return error in that case.\n    pub const CU_POINTER_ATTRIBUTE_ACCESS_FLAG_READ: CUDA_POINTER_ATTRIBUTE_ACCESS_FLAGS_enum = CUDA_POINTER_ATTRIBUTE_ACCESS_FLAGS_enum(\n        1,\n    );\n}\nimpl CUDA_POINTER_ATTRIBUTE_ACCESS_FLAGS_enum {\n    ///< Read-write access, the device has full read-write access to the memory\n    pub const CU_POINTER_ATTRIBUTE_ACCESS_FLAG_READWRITE: CUDA_POINTER_ATTRIBUTE_ACCESS_FLAGS_enum = CUDA_POINTER_ATTRIBUTE_ACCESS_FLAGS_enum(\n        3,\n    );\n}\n#[repr(transparent)]\n/** Access flags that specify the level of access the current context's device has\n on the memory referenced.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_POINTER_ATTRIBUTE_ACCESS_FLAGS_enum(pub ::core::ffi::c_uint);\n/** Access flags that specify the level of access the current context's device has\n on the memory referenced.*/\npub use self::CUDA_POINTER_ATTRIBUTE_ACCESS_FLAGS_enum as CUDA_POINTER_ATTRIBUTE_ACCESS_FLAGS;\n/// Kernel launch parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_LAUNCH_PARAMS_st {\n    ///< Kernel to launch\n    pub function: CUfunction,\n    ///< Width of grid in blocks\n    pub gridDimX: ::core::ffi::c_uint,\n    ///< Height of grid in blocks\n    pub gridDimY: ::core::ffi::c_uint,\n    ///< Depth of grid in blocks\n    pub gridDimZ: ::core::ffi::c_uint,\n    ///< X dimension of each thread block\n    pub blockDimX: ::core::ffi::c_uint,\n    ///< Y dimension of each thread block\n    pub blockDimY: ::core::ffi::c_uint,\n    ///< Z dimension of each thread block\n    pub blockDimZ: ::core::ffi::c_uint,\n    ///< Dynamic shared-memory size per thread block in bytes\n    pub sharedMemBytes: ::core::ffi::c_uint,\n    ///< Stream identifier\n    pub hStream: CUstream,\n    ///< Array of pointers to kernel parameters\n    pub kernelParams: *mut *mut ::core::ffi::c_void,\n}\n/// Kernel launch parameters\npub type CUDA_LAUNCH_PARAMS_v1 = CUDA_LAUNCH_PARAMS_st;\n/// Kernel launch parameters\npub type CUDA_LAUNCH_PARAMS = CUDA_LAUNCH_PARAMS_v1;\nimpl CUexternalMemoryHandleType_enum {\n    /// Handle is an opaque file descriptor\n    pub const CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD: CUexternalMemoryHandleType_enum = CUexternalMemoryHandleType_enum(\n        1,\n    );\n}\nimpl CUexternalMemoryHandleType_enum {\n    /// Handle is an opaque shared NT handle\n    pub const CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32: CUexternalMemoryHandleType_enum = CUexternalMemoryHandleType_enum(\n        2,\n    );\n}\nimpl CUexternalMemoryHandleType_enum {\n    /// Handle is an opaque, globally shared handle\n    pub const CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT: CUexternalMemoryHandleType_enum = CUexternalMemoryHandleType_enum(\n        3,\n    );\n}\nimpl CUexternalMemoryHandleType_enum {\n    /// Handle is a D3D12 heap object\n    pub const CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP: CUexternalMemoryHandleType_enum = CUexternalMemoryHandleType_enum(\n        4,\n    );\n}\nimpl CUexternalMemoryHandleType_enum {\n    /// Handle is a D3D12 committed resource\n    pub const CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE: CUexternalMemoryHandleType_enum = CUexternalMemoryHandleType_enum(\n        5,\n    );\n}\nimpl CUexternalMemoryHandleType_enum {\n    /// Handle is a shared NT handle to a D3D11 resource\n    pub const CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE: CUexternalMemoryHandleType_enum = CUexternalMemoryHandleType_enum(\n        6,\n    );\n}\nimpl CUexternalMemoryHandleType_enum {\n    /// Handle is a globally shared handle to a D3D11 resource\n    pub const CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE_KMT: CUexternalMemoryHandleType_enum = CUexternalMemoryHandleType_enum(\n        7,\n    );\n}\nimpl CUexternalMemoryHandleType_enum {\n    /// Handle is an NvSciBuf object\n    pub const CU_EXTERNAL_MEMORY_HANDLE_TYPE_NVSCIBUF: CUexternalMemoryHandleType_enum = CUexternalMemoryHandleType_enum(\n        8,\n    );\n}\nimpl CUexternalMemoryHandleType_enum {\n    /// Handle is a dma_buf file descriptor\n    pub const CU_EXTERNAL_MEMORY_HANDLE_TYPE_DMABUF_FD: CUexternalMemoryHandleType_enum = CUexternalMemoryHandleType_enum(\n        9,\n    );\n}\n#[repr(transparent)]\n/// External memory handle types\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUexternalMemoryHandleType_enum(pub ::core::ffi::c_uint);\n/// External memory handle types\npub use self::CUexternalMemoryHandleType_enum as CUexternalMemoryHandleType;\n/// External memory handle descriptor\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct CUDA_EXTERNAL_MEMORY_HANDLE_DESC_st {\n    /// Type of the handle\n    pub type_: CUexternalMemoryHandleType,\n    pub handle: CUDA_EXTERNAL_MEMORY_HANDLE_DESC_st__bindgen_ty_1,\n    /// Size of the memory allocation\n    pub size: ::core::ffi::c_ulonglong,\n    /// Flags must either be zero or ::CUDA_EXTERNAL_MEMORY_DEDICATED\n    pub flags: ::core::ffi::c_uint,\n    pub reserved: [::core::ffi::c_uint; 16usize],\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union CUDA_EXTERNAL_MEMORY_HANDLE_DESC_st__bindgen_ty_1 {\n    /** File descriptor referencing the memory object. Valid\n when type is\n ::CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD*/\n    pub fd: ::core::ffi::c_int,\n    pub win32: CUDA_EXTERNAL_MEMORY_HANDLE_DESC_st__bindgen_ty_1__bindgen_ty_1,\n    /** A handle representing an NvSciBuf Object. Valid when type\n is ::CU_EXTERNAL_MEMORY_HANDLE_TYPE_NVSCIBUF*/\n    pub nvSciBufObject: *const ::core::ffi::c_void,\n}\n/** Win32 handle referencing the semaphore object. Valid when\n type is one of the following:\n - ::CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32\n - ::CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT\n - ::CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP\n - ::CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE\n - ::CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE\n - ::CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE_KMT\n Exactly one of 'handle' and 'name' must be non-NULL. If\n type is one of the following:\n ::CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT\n ::CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE_KMT\n then 'name' must be NULL.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_EXTERNAL_MEMORY_HANDLE_DESC_st__bindgen_ty_1__bindgen_ty_1 {\n    /// Valid NT handle. Must be NULL if 'name' is non-NULL\n    pub handle: *mut ::core::ffi::c_void,\n    /** Name of a valid memory object.\n Must be NULL if 'handle' is non-NULL.*/\n    pub name: *const ::core::ffi::c_void,\n}\n/// External memory handle descriptor\npub type CUDA_EXTERNAL_MEMORY_HANDLE_DESC_v1 = CUDA_EXTERNAL_MEMORY_HANDLE_DESC_st;\n/// External memory handle descriptor\npub type CUDA_EXTERNAL_MEMORY_HANDLE_DESC = CUDA_EXTERNAL_MEMORY_HANDLE_DESC_v1;\n/// External memory buffer descriptor\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_EXTERNAL_MEMORY_BUFFER_DESC_st {\n    /// Offset into the memory object where the buffer's base is\n    pub offset: ::core::ffi::c_ulonglong,\n    /// Size of the buffer\n    pub size: ::core::ffi::c_ulonglong,\n    /// Flags reserved for future use. Must be zero.\n    pub flags: ::core::ffi::c_uint,\n    pub reserved: [::core::ffi::c_uint; 16usize],\n}\n/// External memory buffer descriptor\npub type CUDA_EXTERNAL_MEMORY_BUFFER_DESC_v1 = CUDA_EXTERNAL_MEMORY_BUFFER_DESC_st;\n/// External memory buffer descriptor\npub type CUDA_EXTERNAL_MEMORY_BUFFER_DESC = CUDA_EXTERNAL_MEMORY_BUFFER_DESC_v1;\n/// External memory mipmap descriptor\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC_st {\n    /** Offset into the memory object where the base level of the\n mipmap chain is.*/\n    pub offset: ::core::ffi::c_ulonglong,\n    /// Format, dimension and type of base level of the mipmap chain\n    pub arrayDesc: CUDA_ARRAY3D_DESCRIPTOR,\n    /// Total number of levels in the mipmap chain\n    pub numLevels: ::core::ffi::c_uint,\n    pub reserved: [::core::ffi::c_uint; 16usize],\n}\n/// External memory mipmap descriptor\npub type CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC_v1 = CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC_st;\n/// External memory mipmap descriptor\npub type CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC = CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC_v1;\nimpl CUexternalSemaphoreHandleType_enum {\n    /// Handle is an opaque file descriptor\n    pub const CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD: CUexternalSemaphoreHandleType_enum = CUexternalSemaphoreHandleType_enum(\n        1,\n    );\n}\nimpl CUexternalSemaphoreHandleType_enum {\n    /// Handle is an opaque shared NT handle\n    pub const CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32: CUexternalSemaphoreHandleType_enum = CUexternalSemaphoreHandleType_enum(\n        2,\n    );\n}\nimpl CUexternalSemaphoreHandleType_enum {\n    /// Handle is an opaque, globally shared handle\n    pub const CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT: CUexternalSemaphoreHandleType_enum = CUexternalSemaphoreHandleType_enum(\n        3,\n    );\n}\nimpl CUexternalSemaphoreHandleType_enum {\n    /// Handle is a shared NT handle referencing a D3D12 fence object\n    pub const CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE: CUexternalSemaphoreHandleType_enum = CUexternalSemaphoreHandleType_enum(\n        4,\n    );\n}\nimpl CUexternalSemaphoreHandleType_enum {\n    /// Handle is a shared NT handle referencing a D3D11 fence object\n    pub const CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE: CUexternalSemaphoreHandleType_enum = CUexternalSemaphoreHandleType_enum(\n        5,\n    );\n}\nimpl CUexternalSemaphoreHandleType_enum {\n    /// Opaque handle to NvSciSync Object\n    pub const CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_NVSCISYNC: CUexternalSemaphoreHandleType_enum = CUexternalSemaphoreHandleType_enum(\n        6,\n    );\n}\nimpl CUexternalSemaphoreHandleType_enum {\n    /// Handle is a shared NT handle referencing a D3D11 keyed mutex object\n    pub const CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX: CUexternalSemaphoreHandleType_enum = CUexternalSemaphoreHandleType_enum(\n        7,\n    );\n}\nimpl CUexternalSemaphoreHandleType_enum {\n    /// Handle is a globally shared handle referencing a D3D11 keyed mutex object\n    pub const CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX_KMT: CUexternalSemaphoreHandleType_enum = CUexternalSemaphoreHandleType_enum(\n        8,\n    );\n}\nimpl CUexternalSemaphoreHandleType_enum {\n    /// Handle is an opaque file descriptor referencing a timeline semaphore\n    pub const CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TIMELINE_SEMAPHORE_FD: CUexternalSemaphoreHandleType_enum = CUexternalSemaphoreHandleType_enum(\n        9,\n    );\n}\nimpl CUexternalSemaphoreHandleType_enum {\n    /// Handle is an opaque shared NT handle referencing a timeline semaphore\n    pub const CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TIMELINE_SEMAPHORE_WIN32: CUexternalSemaphoreHandleType_enum = CUexternalSemaphoreHandleType_enum(\n        10,\n    );\n}\n#[repr(transparent)]\n/// External semaphore handle types\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUexternalSemaphoreHandleType_enum(pub ::core::ffi::c_uint);\n/// External semaphore handle types\npub use self::CUexternalSemaphoreHandleType_enum as CUexternalSemaphoreHandleType;\n/// External semaphore handle descriptor\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_st {\n    /// Type of the handle\n    pub type_: CUexternalSemaphoreHandleType,\n    pub handle: CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_st__bindgen_ty_1,\n    /// Flags reserved for the future. Must be zero.\n    pub flags: ::core::ffi::c_uint,\n    pub reserved: [::core::ffi::c_uint; 16usize],\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_st__bindgen_ty_1 {\n    /** File descriptor referencing the semaphore object. Valid\n when type is one of the following:\n - ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD\n - ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TIMELINE_SEMAPHORE_FD*/\n    pub fd: ::core::ffi::c_int,\n    pub win32: CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_st__bindgen_ty_1__bindgen_ty_1,\n    /// Valid NvSciSyncObj. Must be non NULL\n    pub nvSciSyncObj: *const ::core::ffi::c_void,\n}\n/** Win32 handle referencing the semaphore object. Valid when\n type is one of the following:\n - ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32\n - ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT\n - ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE\n - ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE\n - ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX\n - ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TIMELINE_SEMAPHORE_WIN32\n Exactly one of 'handle' and 'name' must be non-NULL. If\n type is one of the following:\n - ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT\n - ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX_KMT\n then 'name' must be NULL.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_st__bindgen_ty_1__bindgen_ty_1 {\n    /// Valid NT handle. Must be NULL if 'name' is non-NULL\n    pub handle: *mut ::core::ffi::c_void,\n    /** Name of a valid synchronization primitive.\n Must be NULL if 'handle' is non-NULL.*/\n    pub name: *const ::core::ffi::c_void,\n}\n/// External semaphore handle descriptor\npub type CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_v1 = CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_st;\n/// External semaphore handle descriptor\npub type CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC = CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_v1;\n/// External semaphore signal parameters\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st {\n    pub params: CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st__bindgen_ty_1,\n    /** Only when ::CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS is used to\n signal a ::CUexternalSemaphore of type\n ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_NVSCISYNC, the valid flag is\n ::CUDA_EXTERNAL_SEMAPHORE_SIGNAL_SKIP_NVSCIBUF_MEMSYNC which indicates\n that while signaling the ::CUexternalSemaphore, no memory synchronization\n operations should be performed for any external memory object imported\n as ::CU_EXTERNAL_MEMORY_HANDLE_TYPE_NVSCIBUF.\n For all other types of ::CUexternalSemaphore, flags must be zero.*/\n    pub flags: ::core::ffi::c_uint,\n    pub reserved: [::core::ffi::c_uint; 16usize],\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st__bindgen_ty_1 {\n    pub fence: CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st__bindgen_ty_1__bindgen_ty_1,\n    pub nvSciSync: CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st__bindgen_ty_1__bindgen_ty_2,\n    pub keyedMutex: CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st__bindgen_ty_1__bindgen_ty_3,\n    pub reserved: [::core::ffi::c_uint; 12usize],\n}\n/// Parameters for fence objects\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st__bindgen_ty_1__bindgen_ty_1 {\n    /// Value of fence to be signaled\n    pub value: ::core::ffi::c_ulonglong,\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st__bindgen_ty_1__bindgen_ty_2 {\n    /** Pointer to NvSciSyncFence. Valid if ::CUexternalSemaphoreHandleType\n is of type ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_NVSCISYNC.*/\n    pub fence: *mut ::core::ffi::c_void,\n    pub reserved: ::core::ffi::c_ulonglong,\n}\n/// Parameters for keyed mutex objects\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st__bindgen_ty_1__bindgen_ty_3 {\n    /// Value of key to release the mutex with\n    pub key: ::core::ffi::c_ulonglong,\n}\n/// External semaphore signal parameters\npub type CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_v1 = CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st;\n/// External semaphore signal parameters\npub type CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS = CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_v1;\n/// External semaphore wait parameters\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st {\n    pub params: CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st__bindgen_ty_1,\n    /** Only when ::CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS is used to wait on\n a ::CUexternalSemaphore of type ::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_NVSCISYNC,\n the valid flag is ::CUDA_EXTERNAL_SEMAPHORE_WAIT_SKIP_NVSCIBUF_MEMSYNC\n which indicates that while waiting for the ::CUexternalSemaphore, no memory\n synchronization operations should be performed for any external memory\n object imported as ::CU_EXTERNAL_MEMORY_HANDLE_TYPE_NVSCIBUF.\n For all other types of ::CUexternalSemaphore, flags must be zero.*/\n    pub flags: ::core::ffi::c_uint,\n    pub reserved: [::core::ffi::c_uint; 16usize],\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st__bindgen_ty_1 {\n    pub fence: CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st__bindgen_ty_1__bindgen_ty_1,\n    pub nvSciSync: CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st__bindgen_ty_1__bindgen_ty_2,\n    pub keyedMutex: CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st__bindgen_ty_1__bindgen_ty_3,\n    pub reserved: [::core::ffi::c_uint; 10usize],\n}\n/// Parameters for fence objects\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st__bindgen_ty_1__bindgen_ty_1 {\n    /// Value of fence to be waited on\n    pub value: ::core::ffi::c_ulonglong,\n}\n/** Pointer to NvSciSyncFence. Valid if CUexternalSemaphoreHandleType\n is of type CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_NVSCISYNC.*/\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st__bindgen_ty_1__bindgen_ty_2 {\n    pub fence: *mut ::core::ffi::c_void,\n    pub reserved: ::core::ffi::c_ulonglong,\n}\n/// Parameters for keyed mutex objects\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st__bindgen_ty_1__bindgen_ty_3 {\n    /// Value of key to acquire the mutex with\n    pub key: ::core::ffi::c_ulonglong,\n    /// Timeout in milliseconds to wait to acquire the mutex\n    pub timeoutMs: ::core::ffi::c_uint,\n}\n/// External semaphore wait parameters\npub type CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_v1 = CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st;\n/// External semaphore wait parameters\npub type CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS = CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_v1;\n/// Semaphore signal node parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_EXT_SEM_SIGNAL_NODE_PARAMS_st {\n    ///< Array of external semaphore handles.\n    pub extSemArray: *mut CUexternalSemaphore,\n    ///< Array of external semaphore signal parameters.\n    pub paramsArray: *const CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS,\n    ///< Number of handles and parameters supplied in extSemArray and paramsArray.\n    pub numExtSems: ::core::ffi::c_uint,\n}\n/// Semaphore signal node parameters\npub type CUDA_EXT_SEM_SIGNAL_NODE_PARAMS_v1 = CUDA_EXT_SEM_SIGNAL_NODE_PARAMS_st;\n/// Semaphore signal node parameters\npub type CUDA_EXT_SEM_SIGNAL_NODE_PARAMS = CUDA_EXT_SEM_SIGNAL_NODE_PARAMS_v1;\n/// Semaphore signal node parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_EXT_SEM_SIGNAL_NODE_PARAMS_v2_st {\n    ///< Array of external semaphore handles.\n    pub extSemArray: *mut CUexternalSemaphore,\n    ///< Array of external semaphore signal parameters.\n    pub paramsArray: *const CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS,\n    ///< Number of handles and parameters supplied in extSemArray and paramsArray.\n    pub numExtSems: ::core::ffi::c_uint,\n}\n/// Semaphore signal node parameters\npub type CUDA_EXT_SEM_SIGNAL_NODE_PARAMS_v2 = CUDA_EXT_SEM_SIGNAL_NODE_PARAMS_v2_st;\n/// Semaphore wait node parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_EXT_SEM_WAIT_NODE_PARAMS_st {\n    ///< Array of external semaphore handles.\n    pub extSemArray: *mut CUexternalSemaphore,\n    ///< Array of external semaphore wait parameters.\n    pub paramsArray: *const CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS,\n    ///< Number of handles and parameters supplied in extSemArray and paramsArray.\n    pub numExtSems: ::core::ffi::c_uint,\n}\n/// Semaphore wait node parameters\npub type CUDA_EXT_SEM_WAIT_NODE_PARAMS_v1 = CUDA_EXT_SEM_WAIT_NODE_PARAMS_st;\n/// Semaphore wait node parameters\npub type CUDA_EXT_SEM_WAIT_NODE_PARAMS = CUDA_EXT_SEM_WAIT_NODE_PARAMS_v1;\n/// Semaphore wait node parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_EXT_SEM_WAIT_NODE_PARAMS_v2_st {\n    ///< Array of external semaphore handles.\n    pub extSemArray: *mut CUexternalSemaphore,\n    ///< Array of external semaphore wait parameters.\n    pub paramsArray: *const CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS,\n    ///< Number of handles and parameters supplied in extSemArray and paramsArray.\n    pub numExtSems: ::core::ffi::c_uint,\n}\n/// Semaphore wait node parameters\npub type CUDA_EXT_SEM_WAIT_NODE_PARAMS_v2 = CUDA_EXT_SEM_WAIT_NODE_PARAMS_v2_st;\npub type CUmemGenericAllocationHandle_v1 = ::core::ffi::c_ulonglong;\npub type CUmemGenericAllocationHandle = CUmemGenericAllocationHandle_v1;\nimpl CUmemAllocationHandleType_enum {\n    ///< Does not allow any export mechanism. >\n    pub const CU_MEM_HANDLE_TYPE_NONE: CUmemAllocationHandleType_enum = CUmemAllocationHandleType_enum(\n        0,\n    );\n}\nimpl CUmemAllocationHandleType_enum {\n    ///< Allows a file descriptor to be used for exporting. Permitted only on POSIX systems. (int)\n    pub const CU_MEM_HANDLE_TYPE_POSIX_FILE_DESCRIPTOR: CUmemAllocationHandleType_enum = CUmemAllocationHandleType_enum(\n        1,\n    );\n}\nimpl CUmemAllocationHandleType_enum {\n    ///< Allows a Win32 NT handle to be used for exporting. (HANDLE)\n    pub const CU_MEM_HANDLE_TYPE_WIN32: CUmemAllocationHandleType_enum = CUmemAllocationHandleType_enum(\n        2,\n    );\n}\nimpl CUmemAllocationHandleType_enum {\n    ///< Allows a Win32 KMT handle to be used for exporting. (D3DKMT_HANDLE)\n    pub const CU_MEM_HANDLE_TYPE_WIN32_KMT: CUmemAllocationHandleType_enum = CUmemAllocationHandleType_enum(\n        4,\n    );\n}\nimpl CUmemAllocationHandleType_enum {\n    ///< Allows a fabric handle to be used for exporting. (CUmemFabricHandle)\n    pub const CU_MEM_HANDLE_TYPE_FABRIC: CUmemAllocationHandleType_enum = CUmemAllocationHandleType_enum(\n        8,\n    );\n}\nimpl CUmemAllocationHandleType_enum {\n    pub const CU_MEM_HANDLE_TYPE_MAX: CUmemAllocationHandleType_enum = CUmemAllocationHandleType_enum(\n        2147483647,\n    );\n}\n#[repr(transparent)]\n/// Flags for specifying particular handle types\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmemAllocationHandleType_enum(pub ::core::ffi::c_uint);\n/// Flags for specifying particular handle types\npub use self::CUmemAllocationHandleType_enum as CUmemAllocationHandleType;\nimpl CUmemAccess_flags_enum {\n    ///< Default, make the address range not accessible\n    pub const CU_MEM_ACCESS_FLAGS_PROT_NONE: CUmemAccess_flags_enum = CUmemAccess_flags_enum(\n        0,\n    );\n}\nimpl CUmemAccess_flags_enum {\n    ///< Make the address range read accessible\n    pub const CU_MEM_ACCESS_FLAGS_PROT_READ: CUmemAccess_flags_enum = CUmemAccess_flags_enum(\n        1,\n    );\n}\nimpl CUmemAccess_flags_enum {\n    ///< Make the address range read-write accessible\n    pub const CU_MEM_ACCESS_FLAGS_PROT_READWRITE: CUmemAccess_flags_enum = CUmemAccess_flags_enum(\n        3,\n    );\n}\nimpl CUmemAccess_flags_enum {\n    pub const CU_MEM_ACCESS_FLAGS_PROT_MAX: CUmemAccess_flags_enum = CUmemAccess_flags_enum(\n        2147483647,\n    );\n}\n#[repr(transparent)]\n/// Specifies the memory protection flags for mapping.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmemAccess_flags_enum(pub ::core::ffi::c_uint);\n/// Specifies the memory protection flags for mapping.\npub use self::CUmemAccess_flags_enum as CUmemAccess_flags;\nimpl CUmemLocationType_enum {\n    pub const CU_MEM_LOCATION_TYPE_INVALID: CUmemLocationType_enum = CUmemLocationType_enum(\n        0,\n    );\n}\nimpl CUmemLocationType_enum {\n    ///< Location is unspecified. This is used when creating a managed memory pool to indicate no preferred location for the pool\n    pub const CU_MEM_LOCATION_TYPE_NONE: CUmemLocationType_enum = CUmemLocationType_enum(\n        0,\n    );\n}\nimpl CUmemLocationType_enum {\n    ///< Location is a device location, thus id is a device ordinal\n    pub const CU_MEM_LOCATION_TYPE_DEVICE: CUmemLocationType_enum = CUmemLocationType_enum(\n        1,\n    );\n}\nimpl CUmemLocationType_enum {\n    ///< Location is host, id is ignored\n    pub const CU_MEM_LOCATION_TYPE_HOST: CUmemLocationType_enum = CUmemLocationType_enum(\n        2,\n    );\n}\nimpl CUmemLocationType_enum {\n    ///< Location is a host NUMA node, thus id is a host NUMA node id\n    pub const CU_MEM_LOCATION_TYPE_HOST_NUMA: CUmemLocationType_enum = CUmemLocationType_enum(\n        3,\n    );\n}\nimpl CUmemLocationType_enum {\n    ///< Location is a host NUMA node of the current thread, id is ignored\n    pub const CU_MEM_LOCATION_TYPE_HOST_NUMA_CURRENT: CUmemLocationType_enum = CUmemLocationType_enum(\n        4,\n    );\n}\nimpl CUmemLocationType_enum {\n    pub const CU_MEM_LOCATION_TYPE_MAX: CUmemLocationType_enum = CUmemLocationType_enum(\n        2147483647,\n    );\n}\n#[repr(transparent)]\n/// Specifies the type of location\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmemLocationType_enum(pub ::core::ffi::c_uint);\n/// Specifies the type of location\npub use self::CUmemLocationType_enum as CUmemLocationType;\nimpl CUmemAllocationType_enum {\n    pub const CU_MEM_ALLOCATION_TYPE_INVALID: CUmemAllocationType_enum = CUmemAllocationType_enum(\n        0,\n    );\n}\nimpl CUmemAllocationType_enum {\n    /** This allocation type is 'pinned', i.e. cannot migrate from its current\n location while the application is actively using it*/\n    pub const CU_MEM_ALLOCATION_TYPE_PINNED: CUmemAllocationType_enum = CUmemAllocationType_enum(\n        1,\n    );\n}\nimpl CUmemAllocationType_enum {\n    /// This allocation type is managed memory\n    pub const CU_MEM_ALLOCATION_TYPE_MANAGED: CUmemAllocationType_enum = CUmemAllocationType_enum(\n        2,\n    );\n}\nimpl CUmemAllocationType_enum {\n    /// This allocation type is managed memory\n    pub const CU_MEM_ALLOCATION_TYPE_MAX: CUmemAllocationType_enum = CUmemAllocationType_enum(\n        2147483647,\n    );\n}\n#[repr(transparent)]\n/// Defines the allocation types available\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmemAllocationType_enum(pub ::core::ffi::c_uint);\n/// Defines the allocation types available\npub use self::CUmemAllocationType_enum as CUmemAllocationType;\nimpl CUmemAllocationGranularity_flags_enum {\n    ///< Minimum required granularity for allocation\n    pub const CU_MEM_ALLOC_GRANULARITY_MINIMUM: CUmemAllocationGranularity_flags_enum = CUmemAllocationGranularity_flags_enum(\n        0,\n    );\n}\nimpl CUmemAllocationGranularity_flags_enum {\n    ///< Recommended granularity for allocation for best performance\n    pub const CU_MEM_ALLOC_GRANULARITY_RECOMMENDED: CUmemAllocationGranularity_flags_enum = CUmemAllocationGranularity_flags_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n/// Flag for requesting different optimal and required granularities for an allocation.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmemAllocationGranularity_flags_enum(pub ::core::ffi::c_uint);\n/// Flag for requesting different optimal and required granularities for an allocation.\npub use self::CUmemAllocationGranularity_flags_enum as CUmemAllocationGranularity_flags;\nimpl CUmemRangeHandleType_enum {\n    pub const CU_MEM_RANGE_HANDLE_TYPE_DMA_BUF_FD: CUmemRangeHandleType_enum = CUmemRangeHandleType_enum(\n        1,\n    );\n}\nimpl CUmemRangeHandleType_enum {\n    pub const CU_MEM_RANGE_HANDLE_TYPE_MAX: CUmemRangeHandleType_enum = CUmemRangeHandleType_enum(\n        2147483647,\n    );\n}\n#[repr(transparent)]\n/// Specifies the handle type for address range\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmemRangeHandleType_enum(pub ::core::ffi::c_uint);\n/// Specifies the handle type for address range\npub use self::CUmemRangeHandleType_enum as CUmemRangeHandleType;\nimpl CUmemRangeFlags_enum {\n    ///< Indicates that DMA_BUF handle should be mapped via PCIe BAR1\n    pub const CU_MEM_RANGE_FLAG_DMA_BUF_MAPPING_TYPE_PCIE: CUmemRangeFlags_enum = CUmemRangeFlags_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n/// Flag for requesting handle type for address range.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmemRangeFlags_enum(pub ::core::ffi::c_uint);\n/// Flag for requesting handle type for address range.\npub use self::CUmemRangeFlags_enum as CUmemRangeFlags;\nimpl CUarraySparseSubresourceType_enum {\n    pub const CU_ARRAY_SPARSE_SUBRESOURCE_TYPE_SPARSE_LEVEL: CUarraySparseSubresourceType_enum = CUarraySparseSubresourceType_enum(\n        0,\n    );\n}\nimpl CUarraySparseSubresourceType_enum {\n    pub const CU_ARRAY_SPARSE_SUBRESOURCE_TYPE_MIPTAIL: CUarraySparseSubresourceType_enum = CUarraySparseSubresourceType_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n/// Sparse subresource types\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUarraySparseSubresourceType_enum(pub ::core::ffi::c_uint);\n/// Sparse subresource types\npub use self::CUarraySparseSubresourceType_enum as CUarraySparseSubresourceType;\nimpl CUmemOperationType_enum {\n    pub const CU_MEM_OPERATION_TYPE_MAP: CUmemOperationType_enum = CUmemOperationType_enum(\n        1,\n    );\n}\nimpl CUmemOperationType_enum {\n    pub const CU_MEM_OPERATION_TYPE_UNMAP: CUmemOperationType_enum = CUmemOperationType_enum(\n        2,\n    );\n}\n#[repr(transparent)]\n/// Memory operation types\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmemOperationType_enum(pub ::core::ffi::c_uint);\n/// Memory operation types\npub use self::CUmemOperationType_enum as CUmemOperationType;\nimpl CUmemHandleType_enum {\n    pub const CU_MEM_HANDLE_TYPE_GENERIC: CUmemHandleType_enum = CUmemHandleType_enum(0);\n}\n#[repr(transparent)]\n/// Memory handle types\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmemHandleType_enum(pub ::core::ffi::c_uint);\n/// Memory handle types\npub use self::CUmemHandleType_enum as CUmemHandleType;\n/// Specifies the CUDA array or CUDA mipmapped array memory mapping information\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct CUarrayMapInfo_st {\n    ///< Resource type\n    pub resourceType: CUresourcetype,\n    pub resource: CUarrayMapInfo_st__bindgen_ty_1,\n    ///< Sparse subresource type\n    pub subresourceType: CUarraySparseSubresourceType,\n    pub subresource: CUarrayMapInfo_st__bindgen_ty_2,\n    ///< Memory operation type\n    pub memOperationType: CUmemOperationType,\n    ///< Memory handle type\n    pub memHandleType: CUmemHandleType,\n    pub memHandle: CUarrayMapInfo_st__bindgen_ty_3,\n    ///< Offset within the memory\n    pub offset: ::core::ffi::c_ulonglong,\n    ///< Device ordinal bit mask\n    pub deviceBitMask: ::core::ffi::c_uint,\n    ///< flags for future use, must be zero now.\n    pub flags: ::core::ffi::c_uint,\n    ///< Reserved for future use, must be zero now.\n    pub reserved: [::core::ffi::c_uint; 2usize],\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union CUarrayMapInfo_st__bindgen_ty_1 {\n    pub mipmap: CUmipmappedArray,\n    pub array: CUarray,\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union CUarrayMapInfo_st__bindgen_ty_2 {\n    pub sparseLevel: CUarrayMapInfo_st__bindgen_ty_2__bindgen_ty_1,\n    pub miptail: CUarrayMapInfo_st__bindgen_ty_2__bindgen_ty_2,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUarrayMapInfo_st__bindgen_ty_2__bindgen_ty_1 {\n    ///< For CUDA mipmapped arrays must a valid mipmap level. For CUDA arrays must be zero\n    pub level: ::core::ffi::c_uint,\n    ///< For CUDA layered arrays must be a valid layer index. Otherwise, must be zero\n    pub layer: ::core::ffi::c_uint,\n    ///< Starting X offset in elements\n    pub offsetX: ::core::ffi::c_uint,\n    ///< Starting Y offset in elements\n    pub offsetY: ::core::ffi::c_uint,\n    ///< Starting Z offset in elements\n    pub offsetZ: ::core::ffi::c_uint,\n    ///< Width in elements\n    pub extentWidth: ::core::ffi::c_uint,\n    ///< Height in elements\n    pub extentHeight: ::core::ffi::c_uint,\n    ///< Depth in elements\n    pub extentDepth: ::core::ffi::c_uint,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUarrayMapInfo_st__bindgen_ty_2__bindgen_ty_2 {\n    ///< For CUDA layered arrays must be a valid layer index. Otherwise, must be zero\n    pub layer: ::core::ffi::c_uint,\n    ///< Offset within mip tail\n    pub offset: ::core::ffi::c_ulonglong,\n    ///< Extent in bytes\n    pub size: ::core::ffi::c_ulonglong,\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union CUarrayMapInfo_st__bindgen_ty_3 {\n    pub memHandle: CUmemGenericAllocationHandle,\n}\n/// Specifies the CUDA array or CUDA mipmapped array memory mapping information\npub type CUarrayMapInfo_v1 = CUarrayMapInfo_st;\n/// Specifies the CUDA array or CUDA mipmapped array memory mapping information\npub type CUarrayMapInfo = CUarrayMapInfo_v1;\n/// Specifies a memory location.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmemLocation_st {\n    ///< Specifies the location type, which modifies the meaning of id.\n    pub type_: CUmemLocationType,\n    ///< identifier for a given this location's ::CUmemLocationType.\n    pub id: ::core::ffi::c_int,\n}\n/// Specifies a memory location.\npub type CUmemLocation_v1 = CUmemLocation_st;\n/// Specifies a memory location.\npub type CUmemLocation = CUmemLocation_v1;\nimpl CUmemAllocationCompType_enum {\n    ///< Allocating non-compressible memory\n    pub const CU_MEM_ALLOCATION_COMP_NONE: CUmemAllocationCompType_enum = CUmemAllocationCompType_enum(\n        0,\n    );\n}\nimpl CUmemAllocationCompType_enum {\n    ///< Allocating  compressible memory\n    pub const CU_MEM_ALLOCATION_COMP_GENERIC: CUmemAllocationCompType_enum = CUmemAllocationCompType_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n/// Specifies compression attribute for an allocation.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmemAllocationCompType_enum(pub ::core::ffi::c_uint);\n/// Specifies compression attribute for an allocation.\npub use self::CUmemAllocationCompType_enum as CUmemAllocationCompType;\n/// Specifies the allocation properties for a allocation.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmemAllocationProp_st {\n    /// Allocation type\n    pub type_: CUmemAllocationType,\n    /// requested ::CUmemAllocationHandleType\n    pub requestedHandleTypes: CUmemAllocationHandleType,\n    /// Location of allocation\n    pub location: CUmemLocation,\n    /** Windows-specific POBJECT_ATTRIBUTES required when\n ::CU_MEM_HANDLE_TYPE_WIN32 is specified.  This object attributes structure\n includes security attributes that define\n the scope of which exported allocations may be transferred to other\n processes.  In all other cases, this field is required to be zero.*/\n    pub win32HandleMetaData: *mut ::core::ffi::c_void,\n    pub allocFlags: CUmemAllocationProp_st__bindgen_ty_1,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmemAllocationProp_st__bindgen_ty_1 {\n    /** Allocation hint for requesting compressible memory.\n On devices that support Compute Data Compression, compressible\n memory can be used to accelerate accesses to data with unstructured\n sparsity and other compressible data patterns. Applications are\n expected to query allocation property of the handle obtained with\n ::cuMemCreate using ::cuMemGetAllocationPropertiesFromHandle to\n validate if the obtained allocation is compressible or not. Note that\n compressed memory may not be mappable on all devices.*/\n    pub compressionType: ::core::ffi::c_uchar,\n    pub gpuDirectRDMACapable: ::core::ffi::c_uchar,\n    /// Bitmask indicating intended usage for this allocation\n    pub usage: ::core::ffi::c_ushort,\n    pub reserved: [::core::ffi::c_uchar; 4usize],\n}\n/// Specifies the allocation properties for a allocation.\npub type CUmemAllocationProp_v1 = CUmemAllocationProp_st;\n/// Specifies the allocation properties for a allocation.\npub type CUmemAllocationProp = CUmemAllocationProp_v1;\nimpl CUmulticastGranularity_flags_enum {\n    ///< Minimum required granularity\n    pub const CU_MULTICAST_GRANULARITY_MINIMUM: CUmulticastGranularity_flags_enum = CUmulticastGranularity_flags_enum(\n        0,\n    );\n}\nimpl CUmulticastGranularity_flags_enum {\n    ///< Recommended granularity for best performance\n    pub const CU_MULTICAST_GRANULARITY_RECOMMENDED: CUmulticastGranularity_flags_enum = CUmulticastGranularity_flags_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n/// Flags for querying different granularities for a multicast object\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmulticastGranularity_flags_enum(pub ::core::ffi::c_uint);\n/// Flags for querying different granularities for a multicast object\npub use self::CUmulticastGranularity_flags_enum as CUmulticastGranularity_flags;\n/// Specifies the properties for a multicast object.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmulticastObjectProp_st {\n    /** The number of devices in the multicast team that will bind memory to this\n object*/\n    pub numDevices: ::core::ffi::c_uint,\n    /** The maximum amount of memory that can be bound to this multicast object\n per device*/\n    pub size: usize,\n    /** Bitmask of exportable handle types (see ::CUmemAllocationHandleType) for\n this object*/\n    pub handleTypes: ::core::ffi::c_ulonglong,\n    /// Flags for future use, must be zero now\n    pub flags: ::core::ffi::c_ulonglong,\n}\n/// Specifies the properties for a multicast object.\npub type CUmulticastObjectProp_v1 = CUmulticastObjectProp_st;\n/// Specifies the properties for a multicast object.\npub type CUmulticastObjectProp = CUmulticastObjectProp_v1;\n/// Memory access descriptor\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmemAccessDesc_st {\n    ///< Location on which the request is to change it's accessibility\n    pub location: CUmemLocation,\n    ///< ::CUmemProt accessibility flags to set on the request\n    pub flags: CUmemAccess_flags,\n}\n/// Memory access descriptor\npub type CUmemAccessDesc_v1 = CUmemAccessDesc_st;\n/// Memory access descriptor\npub type CUmemAccessDesc = CUmemAccessDesc_v1;\nimpl CUgraphExecUpdateResult_enum {\n    ///< The update succeeded\n    pub const CU_GRAPH_EXEC_UPDATE_SUCCESS: CUgraphExecUpdateResult_enum = CUgraphExecUpdateResult_enum(\n        0,\n    );\n}\nimpl CUgraphExecUpdateResult_enum {\n    ///< The update failed for an unexpected reason which is described in the return value of the function\n    pub const CU_GRAPH_EXEC_UPDATE_ERROR: CUgraphExecUpdateResult_enum = CUgraphExecUpdateResult_enum(\n        1,\n    );\n}\nimpl CUgraphExecUpdateResult_enum {\n    ///< The update failed because the topology changed\n    pub const CU_GRAPH_EXEC_UPDATE_ERROR_TOPOLOGY_CHANGED: CUgraphExecUpdateResult_enum = CUgraphExecUpdateResult_enum(\n        2,\n    );\n}\nimpl CUgraphExecUpdateResult_enum {\n    ///< The update failed because a node type changed\n    pub const CU_GRAPH_EXEC_UPDATE_ERROR_NODE_TYPE_CHANGED: CUgraphExecUpdateResult_enum = CUgraphExecUpdateResult_enum(\n        3,\n    );\n}\nimpl CUgraphExecUpdateResult_enum {\n    ///< The update failed because the function of a kernel node changed (CUDA driver < 11.2)\n    pub const CU_GRAPH_EXEC_UPDATE_ERROR_FUNCTION_CHANGED: CUgraphExecUpdateResult_enum = CUgraphExecUpdateResult_enum(\n        4,\n    );\n}\nimpl CUgraphExecUpdateResult_enum {\n    ///< The update failed because the parameters changed in a way that is not supported\n    pub const CU_GRAPH_EXEC_UPDATE_ERROR_PARAMETERS_CHANGED: CUgraphExecUpdateResult_enum = CUgraphExecUpdateResult_enum(\n        5,\n    );\n}\nimpl CUgraphExecUpdateResult_enum {\n    ///< The update failed because something about the node is not supported\n    pub const CU_GRAPH_EXEC_UPDATE_ERROR_NOT_SUPPORTED: CUgraphExecUpdateResult_enum = CUgraphExecUpdateResult_enum(\n        6,\n    );\n}\nimpl CUgraphExecUpdateResult_enum {\n    ///< The update failed because the function of a kernel node changed in an unsupported way\n    pub const CU_GRAPH_EXEC_UPDATE_ERROR_UNSUPPORTED_FUNCTION_CHANGE: CUgraphExecUpdateResult_enum = CUgraphExecUpdateResult_enum(\n        7,\n    );\n}\nimpl CUgraphExecUpdateResult_enum {\n    ///< The update failed because the node attributes changed in a way that is not supported\n    pub const CU_GRAPH_EXEC_UPDATE_ERROR_ATTRIBUTES_CHANGED: CUgraphExecUpdateResult_enum = CUgraphExecUpdateResult_enum(\n        8,\n    );\n}\n#[repr(transparent)]\n/// CUDA Graph Update error types\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUgraphExecUpdateResult_enum(pub ::core::ffi::c_uint);\n/// CUDA Graph Update error types\npub use self::CUgraphExecUpdateResult_enum as CUgraphExecUpdateResult;\n/// Result information returned by cuGraphExecUpdate\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUgraphExecUpdateResultInfo_st {\n    /// Gives more specific detail when a cuda graph update fails.\n    pub result: CUgraphExecUpdateResult,\n    /** The \"to node\" of the error edge when the topologies do not match.\n The error node when the error is associated with a specific node.\n NULL when the error is generic.*/\n    pub errorNode: CUgraphNode,\n    /// The from node of error edge when the topologies do not match. Otherwise NULL.\n    pub errorFromNode: CUgraphNode,\n}\n/// Result information returned by cuGraphExecUpdate\npub type CUgraphExecUpdateResultInfo_v1 = CUgraphExecUpdateResultInfo_st;\n/// Result information returned by cuGraphExecUpdate\npub type CUgraphExecUpdateResultInfo = CUgraphExecUpdateResultInfo_v1;\nimpl CUmemPool_attribute_enum {\n    /** (value type = int)\n Allow cuMemAllocAsync to use memory asynchronously freed\n in another streams as long as a stream ordering dependency\n of the allocating stream on the free action exists.\n Cuda events and null stream interactions can create the required\n stream ordered dependencies. (default enabled)*/\n    pub const CU_MEMPOOL_ATTR_REUSE_FOLLOW_EVENT_DEPENDENCIES: CUmemPool_attribute_enum = CUmemPool_attribute_enum(\n        1,\n    );\n}\nimpl CUmemPool_attribute_enum {\n    /** (value type = int)\n Allow reuse of already completed frees when there is no dependency\n between the free and allocation. (default enabled)*/\n    pub const CU_MEMPOOL_ATTR_REUSE_ALLOW_OPPORTUNISTIC: CUmemPool_attribute_enum = CUmemPool_attribute_enum(\n        2,\n    );\n}\nimpl CUmemPool_attribute_enum {\n    /** (value type = int)\n Allow cuMemAllocAsync to insert new stream dependencies\n in order to establish the stream ordering required to reuse\n a piece of memory released by cuMemFreeAsync (default enabled).*/\n    pub const CU_MEMPOOL_ATTR_REUSE_ALLOW_INTERNAL_DEPENDENCIES: CUmemPool_attribute_enum = CUmemPool_attribute_enum(\n        3,\n    );\n}\nimpl CUmemPool_attribute_enum {\n    /** (value type = cuuint64_t)\n Amount of reserved memory in bytes to hold onto before trying\n to release memory back to the OS. When more than the release\n threshold bytes of memory are held by the memory pool, the\n allocator will try to release memory back to the OS on the\n next call to stream, event or context synchronize. (default 0)*/\n    pub const CU_MEMPOOL_ATTR_RELEASE_THRESHOLD: CUmemPool_attribute_enum = CUmemPool_attribute_enum(\n        4,\n    );\n}\nimpl CUmemPool_attribute_enum {\n    /** (value type = cuuint64_t)\n Amount of backing memory currently allocated for the mempool.*/\n    pub const CU_MEMPOOL_ATTR_RESERVED_MEM_CURRENT: CUmemPool_attribute_enum = CUmemPool_attribute_enum(\n        5,\n    );\n}\nimpl CUmemPool_attribute_enum {\n    /** (value type = cuuint64_t)\n High watermark of backing memory allocated for the mempool since the\n last time it was reset. High watermark can only be reset to zero.*/\n    pub const CU_MEMPOOL_ATTR_RESERVED_MEM_HIGH: CUmemPool_attribute_enum = CUmemPool_attribute_enum(\n        6,\n    );\n}\nimpl CUmemPool_attribute_enum {\n    /** (value type = cuuint64_t)\n Amount of memory from the pool that is currently in use by the application.*/\n    pub const CU_MEMPOOL_ATTR_USED_MEM_CURRENT: CUmemPool_attribute_enum = CUmemPool_attribute_enum(\n        7,\n    );\n}\nimpl CUmemPool_attribute_enum {\n    /** (value type = cuuint64_t)\n High watermark of the amount of memory from the pool that was in use by the application since\n the last time it was reset. High watermark can only be reset to zero.*/\n    pub const CU_MEMPOOL_ATTR_USED_MEM_HIGH: CUmemPool_attribute_enum = CUmemPool_attribute_enum(\n        8,\n    );\n}\n#[repr(transparent)]\n/// CUDA memory pool attributes\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmemPool_attribute_enum(pub ::core::ffi::c_uint);\n/// CUDA memory pool attributes\npub use self::CUmemPool_attribute_enum as CUmemPool_attribute;\n/// Specifies the properties of allocations made from the pool.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmemPoolProps_st {\n    ///< Allocation type. Currently must be specified as CU_MEM_ALLOCATION_TYPE_PINNED\n    pub allocType: CUmemAllocationType,\n    ///< Handle types that will be supported by allocations from the pool.\n    pub handleTypes: CUmemAllocationHandleType,\n    ///< Location where allocations should reside.\n    pub location: CUmemLocation,\n    /** Windows-specific LPSECURITYATTRIBUTES required when\n ::CU_MEM_HANDLE_TYPE_WIN32 is specified.  This security attribute defines\n the scope of which exported allocations may be transferred to other\n processes.  In all other cases, this field is required to be zero.*/\n    pub win32SecurityAttributes: *mut ::core::ffi::c_void,\n    ///< Maximum pool size. When set to 0, defaults to a system dependent value.\n    pub maxSize: usize,\n    ///< Bitmask indicating intended usage for the pool.\n    pub usage: ::core::ffi::c_ushort,\n    ///< reserved for future use, must be 0\n    pub reserved: [::core::ffi::c_uchar; 54usize],\n}\n/// Specifies the properties of allocations made from the pool.\npub type CUmemPoolProps_v1 = CUmemPoolProps_st;\n/// Specifies the properties of allocations made from the pool.\npub type CUmemPoolProps = CUmemPoolProps_v1;\n/// Opaque data for exporting a pool allocation\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmemPoolPtrExportData_st {\n    pub reserved: [::core::ffi::c_uchar; 64usize],\n}\n/// Opaque data for exporting a pool allocation\npub type CUmemPoolPtrExportData_v1 = CUmemPoolPtrExportData_st;\n/// Opaque data for exporting a pool allocation\npub type CUmemPoolPtrExportData = CUmemPoolPtrExportData_v1;\nimpl CUmemcpyFlags_enum {\n    pub const CU_MEMCPY_FLAG_DEFAULT: CUmemcpyFlags_enum = CUmemcpyFlags_enum(0);\n}\nimpl CUmemcpyFlags_enum {\n    /// Hint to the driver to try and overlap the copy with compute work on the SMs.\n    pub const CU_MEMCPY_FLAG_PREFER_OVERLAP_WITH_COMPUTE: CUmemcpyFlags_enum = CUmemcpyFlags_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n/// Flags to specify for copies within a batch. For more details see ::cuMemcpyBatchAsync.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmemcpyFlags_enum(pub ::core::ffi::c_uint);\n/// Flags to specify for copies within a batch. For more details see ::cuMemcpyBatchAsync.\npub use self::CUmemcpyFlags_enum as CUmemcpyFlags;\nimpl CUmemcpySrcAccessOrder_enum {\n    /// Default invalid.\n    pub const CU_MEMCPY_SRC_ACCESS_ORDER_INVALID: CUmemcpySrcAccessOrder_enum = CUmemcpySrcAccessOrder_enum(\n        0,\n    );\n}\nimpl CUmemcpySrcAccessOrder_enum {\n    /// Indicates that access to the source pointer must be in stream order.\n    pub const CU_MEMCPY_SRC_ACCESS_ORDER_STREAM: CUmemcpySrcAccessOrder_enum = CUmemcpySrcAccessOrder_enum(\n        1,\n    );\n}\nimpl CUmemcpySrcAccessOrder_enum {\n    /** Indicates that access to the source pointer can be out of stream order and\n all accesses must be complete before the API call returns. This flag is suited for\n ephemeral sources (ex., stack variables) when it's known that no prior operations\n in the stream can be accessing the memory and also that the lifetime of the memory\n is limited to the scope that the source variable was declared in. Specifying\n this flag allows the driver to optimize the copy and removes the need for the user\n to synchronize the stream after the API call.*/\n    pub const CU_MEMCPY_SRC_ACCESS_ORDER_DURING_API_CALL: CUmemcpySrcAccessOrder_enum = CUmemcpySrcAccessOrder_enum(\n        2,\n    );\n}\nimpl CUmemcpySrcAccessOrder_enum {\n    /** Indicates that access to the source pointer can be out of stream order and the accesses\n can happen even after the API call returns. This flag is suited for host pointers\n allocated outside CUDA (ex., via malloc) when it's known that no prior operations\n in the stream can be accessing the memory. Specifying this flag allows the driver\n to optimize the copy on certain platforms.*/\n    pub const CU_MEMCPY_SRC_ACCESS_ORDER_ANY: CUmemcpySrcAccessOrder_enum = CUmemcpySrcAccessOrder_enum(\n        3,\n    );\n}\nimpl CUmemcpySrcAccessOrder_enum {\n    /** Indicates that access to the source pointer can be out of stream order and the accesses\n can happen even after the API call returns. This flag is suited for host pointers\n allocated outside CUDA (ex., via malloc) when it's known that no prior operations\n in the stream can be accessing the memory. Specifying this flag allows the driver\n to optimize the copy on certain platforms.*/\n    pub const CU_MEMCPY_SRC_ACCESS_ORDER_MAX: CUmemcpySrcAccessOrder_enum = CUmemcpySrcAccessOrder_enum(\n        2147483647,\n    );\n}\n#[repr(transparent)]\n/** These flags allow applications to convey the source access ordering CUDA must maintain.\n The destination will always be accessed in stream order.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmemcpySrcAccessOrder_enum(pub ::core::ffi::c_uint);\n/** These flags allow applications to convey the source access ordering CUDA must maintain.\n The destination will always be accessed in stream order.*/\npub use self::CUmemcpySrcAccessOrder_enum as CUmemcpySrcAccessOrder;\n/// Attributes specific to copies within a batch. For more details on usage see ::cuMemcpyBatchAsync.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmemcpyAttributes_st {\n    ///< Source access ordering to be observed for copies with this attribute.\n    pub srcAccessOrder: CUmemcpySrcAccessOrder,\n    ///< Hint location for the source operand. Ignored when the pointers are not managed memory or memory allocated outside CUDA.\n    pub srcLocHint: CUmemLocation,\n    ///< Hint location for the destination operand. Ignored when the pointers are not managed memory or memory allocated outside CUDA.\n    pub dstLocHint: CUmemLocation,\n    ///< Additional flags for copies with this attribute. See ::CUmemcpyFlags\n    pub flags: ::core::ffi::c_uint,\n}\n/// Attributes specific to copies within a batch. For more details on usage see ::cuMemcpyBatchAsync.\npub type CUmemcpyAttributes_v1 = CUmemcpyAttributes_st;\n/// Attributes specific to copies within a batch. For more details on usage see ::cuMemcpyBatchAsync.\npub type CUmemcpyAttributes = CUmemcpyAttributes_v1;\nimpl CUmemcpy3DOperandType_enum {\n    ///< Memcpy operand is a valid pointer.\n    pub const CU_MEMCPY_OPERAND_TYPE_POINTER: CUmemcpy3DOperandType_enum = CUmemcpy3DOperandType_enum(\n        1,\n    );\n}\nimpl CUmemcpy3DOperandType_enum {\n    ///< Memcpy operand is a CUarray.\n    pub const CU_MEMCPY_OPERAND_TYPE_ARRAY: CUmemcpy3DOperandType_enum = CUmemcpy3DOperandType_enum(\n        2,\n    );\n}\nimpl CUmemcpy3DOperandType_enum {\n    pub const CU_MEMCPY_OPERAND_TYPE_MAX: CUmemcpy3DOperandType_enum = CUmemcpy3DOperandType_enum(\n        2147483647,\n    );\n}\n#[repr(transparent)]\n/// These flags allow applications to convey the operand type for individual copies specified in ::cuMemcpy3DBatchAsync.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmemcpy3DOperandType_enum(pub ::core::ffi::c_uint);\n/// These flags allow applications to convey the operand type for individual copies specified in ::cuMemcpy3DBatchAsync.\npub use self::CUmemcpy3DOperandType_enum as CUmemcpy3DOperandType;\n/// Struct representing offset into a CUarray in elements\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUoffset3D_st {\n    pub x: usize,\n    pub y: usize,\n    pub z: usize,\n}\n/// Struct representing offset into a CUarray in elements\npub type CUoffset3D_v1 = CUoffset3D_st;\n/// Struct representing offset into a CUarray in elements\npub type CUoffset3D = CUoffset3D_v1;\n/// Struct representing width/height/depth of a CUarray in elements\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUextent3D_st {\n    pub width: usize,\n    pub height: usize,\n    pub depth: usize,\n}\n/// Struct representing width/height/depth of a CUarray in elements\npub type CUextent3D_v1 = CUextent3D_st;\n/// Struct representing width/height/depth of a CUarray in elements\npub type CUextent3D = CUextent3D_v1;\n/// Struct representing an operand for copy with ::cuMemcpy3DBatchAsync\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct CUmemcpy3DOperand_st {\n    pub type_: CUmemcpy3DOperandType,\n    pub op: CUmemcpy3DOperand_st__bindgen_ty_1,\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union CUmemcpy3DOperand_st__bindgen_ty_1 {\n    pub ptr: CUmemcpy3DOperand_st__bindgen_ty_1__bindgen_ty_1,\n    pub array: CUmemcpy3DOperand_st__bindgen_ty_1__bindgen_ty_2,\n}\n/// Struct representing an operand when ::CUmemcpy3DOperand::type is ::CU_MEMCPY_OPERAND_TYPE_POINTER\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmemcpy3DOperand_st__bindgen_ty_1__bindgen_ty_1 {\n    pub ptr: CUdeviceptr,\n    ///< Length of each row in elements.\n    pub rowLength: usize,\n    ///< Height of each layer in elements.\n    pub layerHeight: usize,\n    ///< Hint location for the operand. Ignored when the pointers are not managed memory or memory allocated outside CUDA.\n    pub locHint: CUmemLocation,\n}\n/// Struct representing an operand when ::CUmemcpy3DOperand::type is ::CU_MEMCPY_OPERAND_TYPE_ARRAY\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmemcpy3DOperand_st__bindgen_ty_1__bindgen_ty_2 {\n    pub array: CUarray,\n    pub offset: CUoffset3D,\n}\n/// Struct representing an operand for copy with ::cuMemcpy3DBatchAsync\npub type CUmemcpy3DOperand_v1 = CUmemcpy3DOperand_st;\n/// Struct representing an operand for copy with ::cuMemcpy3DBatchAsync\npub type CUmemcpy3DOperand = CUmemcpy3DOperand_v1;\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct CUDA_MEMCPY3D_BATCH_OP_st {\n    ///< Source memcpy operand.\n    pub src: CUmemcpy3DOperand,\n    ///< Destination memcpy operand.\n    pub dst: CUmemcpy3DOperand,\n    ///< Extents of the memcpy between src and dst. The width, height and depth components must not be 0.\n    pub extent: CUextent3D,\n    ///< Source access ordering to be observed for copy from src to dst.\n    pub srcAccessOrder: CUmemcpySrcAccessOrder,\n    ///< Additional flags for copies with this attribute. See ::CUmemcpyFlags\n    pub flags: ::core::ffi::c_uint,\n}\npub type CUDA_MEMCPY3D_BATCH_OP_v1 = CUDA_MEMCPY3D_BATCH_OP_st;\npub type CUDA_MEMCPY3D_BATCH_OP = CUDA_MEMCPY3D_BATCH_OP_v1;\n/// Memory allocation node parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_MEM_ALLOC_NODE_PARAMS_v1_st {\n    /** in: location where the allocation should reside (specified in ::location).\n ::handleTypes must be ::CU_MEM_HANDLE_TYPE_NONE. IPC is not supported.*/\n    pub poolProps: CUmemPoolProps,\n    ///< in: array of memory access descriptors. Used to describe peer GPU access\n    pub accessDescs: *const CUmemAccessDesc,\n    ///< in: number of memory access descriptors.  Must not exceed the number of GPUs.\n    pub accessDescCount: usize,\n    ///< in: size in bytes of the requested allocation\n    pub bytesize: usize,\n    ///< out: address of the allocation returned by CUDA\n    pub dptr: CUdeviceptr,\n}\n/// Memory allocation node parameters\npub type CUDA_MEM_ALLOC_NODE_PARAMS_v1 = CUDA_MEM_ALLOC_NODE_PARAMS_v1_st;\n/// Memory allocation node parameters\npub type CUDA_MEM_ALLOC_NODE_PARAMS = CUDA_MEM_ALLOC_NODE_PARAMS_v1;\n/// Memory allocation node parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_MEM_ALLOC_NODE_PARAMS_v2_st {\n    /** in: location where the allocation should reside (specified in ::location).\n ::handleTypes must be ::CU_MEM_HANDLE_TYPE_NONE. IPC is not supported.*/\n    pub poolProps: CUmemPoolProps,\n    ///< in: array of memory access descriptors. Used to describe peer GPU access\n    pub accessDescs: *const CUmemAccessDesc,\n    ///< in: number of memory access descriptors.  Must not exceed the number of GPUs.\n    pub accessDescCount: usize,\n    ///< in: size in bytes of the requested allocation\n    pub bytesize: usize,\n    ///< out: address of the allocation returned by CUDA\n    pub dptr: CUdeviceptr,\n}\n/// Memory allocation node parameters\npub type CUDA_MEM_ALLOC_NODE_PARAMS_v2 = CUDA_MEM_ALLOC_NODE_PARAMS_v2_st;\n/// Memory free node parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_MEM_FREE_NODE_PARAMS_st {\n    ///< in: the pointer to free\n    pub dptr: CUdeviceptr,\n}\n/// Memory free node parameters\npub type CUDA_MEM_FREE_NODE_PARAMS = CUDA_MEM_FREE_NODE_PARAMS_st;\nimpl CUgraphMem_attribute_enum {\n    /** (value type = cuuint64_t)\n Amount of memory, in bytes, currently associated with graphs*/\n    pub const CU_GRAPH_MEM_ATTR_USED_MEM_CURRENT: CUgraphMem_attribute_enum = CUgraphMem_attribute_enum(\n        0,\n    );\n}\nimpl CUgraphMem_attribute_enum {\n    /** (value type = cuuint64_t)\n High watermark of memory, in bytes, associated with graphs since the\n last time it was reset.  High watermark can only be reset to zero.*/\n    pub const CU_GRAPH_MEM_ATTR_USED_MEM_HIGH: CUgraphMem_attribute_enum = CUgraphMem_attribute_enum(\n        1,\n    );\n}\nimpl CUgraphMem_attribute_enum {\n    /** (value type = cuuint64_t)\n Amount of memory, in bytes, currently allocated for use by\n the CUDA graphs asynchronous allocator.*/\n    pub const CU_GRAPH_MEM_ATTR_RESERVED_MEM_CURRENT: CUgraphMem_attribute_enum = CUgraphMem_attribute_enum(\n        2,\n    );\n}\nimpl CUgraphMem_attribute_enum {\n    /** (value type = cuuint64_t)\n High watermark of memory, in bytes, currently allocated for use by\n the CUDA graphs asynchronous allocator.*/\n    pub const CU_GRAPH_MEM_ATTR_RESERVED_MEM_HIGH: CUgraphMem_attribute_enum = CUgraphMem_attribute_enum(\n        3,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUgraphMem_attribute_enum(pub ::core::ffi::c_uint);\npub use self::CUgraphMem_attribute_enum as CUgraphMem_attribute;\nimpl CUgraphChildGraphNodeOwnership_enum {\n    /**< Default behavior for a child graph node. Child graph is cloned\ninto the parent and memory allocation/free nodes can't be present\nin the child graph.*/\n    pub const CU_GRAPH_CHILD_GRAPH_OWNERSHIP_CLONE: CUgraphChildGraphNodeOwnership_enum = CUgraphChildGraphNodeOwnership_enum(\n        0,\n    );\n}\nimpl CUgraphChildGraphNodeOwnership_enum {\n    /**< The child graph is moved to the parent. The handle to the child graph\nis owned by the parent and will be destroyed when the parent is\ndestroyed.\n\nThe following restrictions apply to child graphs after they have been moved:\nCannot be independently instantiated or destroyed;\nCannot be added as a child graph of a separate parent graph;\nCannot be used as an argument to cuGraphExecUpdate;\nCannot have additional memory allocation or free nodes added.*/\n    pub const CU_GRAPH_CHILD_GRAPH_OWNERSHIP_MOVE: CUgraphChildGraphNodeOwnership_enum = CUgraphChildGraphNodeOwnership_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n/// Child graph node ownership\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUgraphChildGraphNodeOwnership_enum(pub ::core::ffi::c_uint);\n/// Child graph node ownership\npub use self::CUgraphChildGraphNodeOwnership_enum as CUgraphChildGraphNodeOwnership;\n/// Child graph node parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_CHILD_GRAPH_NODE_PARAMS_st {\n    /**< The child graph to clone into the node for node creation, or\n   a handle to the graph owned by the node for node query.\n   The graph must not contain conditional nodes. Graphs\n   containing memory allocation or memory free nodes must\n   set the ownership to be moved to the parent.*/\n    pub graph: CUgraph,\n    ///< The ownership relationship of the child graph node.\n    pub ownership: CUgraphChildGraphNodeOwnership,\n}\n/// Child graph node parameters\npub type CUDA_CHILD_GRAPH_NODE_PARAMS = CUDA_CHILD_GRAPH_NODE_PARAMS_st;\n/// Event record node parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_EVENT_RECORD_NODE_PARAMS_st {\n    ///< The event to record when the node executes\n    pub event: CUevent,\n}\n/// Event record node parameters\npub type CUDA_EVENT_RECORD_NODE_PARAMS = CUDA_EVENT_RECORD_NODE_PARAMS_st;\n/// Event wait node parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_EVENT_WAIT_NODE_PARAMS_st {\n    ///< The event to wait on from the node\n    pub event: CUevent,\n}\n/// Event wait node parameters\npub type CUDA_EVENT_WAIT_NODE_PARAMS = CUDA_EVENT_WAIT_NODE_PARAMS_st;\n/// Graph node parameters.  See ::cuGraphAddNode.\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct CUgraphNodeParams_st {\n    ///< Type of the node\n    pub type_: CUgraphNodeType,\n    ///< Reserved. Must be zero.\n    pub reserved0: [::core::ffi::c_int; 3usize],\n    pub __bindgen_anon_1: CUgraphNodeParams_st__bindgen_ty_1,\n    ///< Reserved bytes. Must be zero.\n    pub reserved2: ::core::ffi::c_longlong,\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union CUgraphNodeParams_st__bindgen_ty_1 {\n    ///< Padding. Unused bytes must be zero.\n    pub reserved1: [::core::ffi::c_longlong; 29usize],\n    ///< Kernel node parameters.\n    pub kernel: CUDA_KERNEL_NODE_PARAMS_v3,\n    ///< Memcpy node parameters.\n    pub memcpy: CUDA_MEMCPY_NODE_PARAMS,\n    ///< Memset node parameters.\n    pub memset: CUDA_MEMSET_NODE_PARAMS_v2,\n    ///< Host node parameters.\n    pub host: CUDA_HOST_NODE_PARAMS_v2,\n    ///< Child graph node parameters.\n    pub graph: CUDA_CHILD_GRAPH_NODE_PARAMS,\n    ///< Event wait node parameters.\n    pub eventWait: CUDA_EVENT_WAIT_NODE_PARAMS,\n    ///< Event record node parameters.\n    pub eventRecord: CUDA_EVENT_RECORD_NODE_PARAMS,\n    ///< External semaphore signal node parameters.\n    pub extSemSignal: CUDA_EXT_SEM_SIGNAL_NODE_PARAMS_v2,\n    ///< External semaphore wait node parameters.\n    pub extSemWait: CUDA_EXT_SEM_WAIT_NODE_PARAMS_v2,\n    ///< Memory allocation node parameters.\n    pub alloc: CUDA_MEM_ALLOC_NODE_PARAMS_v2,\n    ///< Memory free node parameters.\n    pub free: CUDA_MEM_FREE_NODE_PARAMS,\n    ///< MemOp node parameters.\n    pub memOp: CUDA_BATCH_MEM_OP_NODE_PARAMS_v2,\n    ///< Conditional node parameters.\n    pub conditional: CUDA_CONDITIONAL_NODE_PARAMS,\n}\n/// Graph node parameters.  See ::cuGraphAddNode.\npub type CUgraphNodeParams = CUgraphNodeParams_st;\nimpl CUflushGPUDirectRDMAWritesOptions_enum {\n    ///< ::cuFlushGPUDirectRDMAWrites() and its CUDA Runtime API counterpart are supported on the device.\n    pub const CU_FLUSH_GPU_DIRECT_RDMA_WRITES_OPTION_HOST: CUflushGPUDirectRDMAWritesOptions_enum = CUflushGPUDirectRDMAWritesOptions_enum(\n        1,\n    );\n}\nimpl CUflushGPUDirectRDMAWritesOptions_enum {\n    ///< The ::CU_STREAM_WAIT_VALUE_FLUSH flag and the ::CU_STREAM_MEM_OP_FLUSH_REMOTE_WRITES MemOp are supported on the device.\n    pub const CU_FLUSH_GPU_DIRECT_RDMA_WRITES_OPTION_MEMOPS: CUflushGPUDirectRDMAWritesOptions_enum = CUflushGPUDirectRDMAWritesOptions_enum(\n        2,\n    );\n}\n#[repr(transparent)]\n/// Bitmasks for ::CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_FLUSH_WRITES_OPTIONS\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUflushGPUDirectRDMAWritesOptions_enum(pub ::core::ffi::c_uint);\n/// Bitmasks for ::CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_FLUSH_WRITES_OPTIONS\npub use self::CUflushGPUDirectRDMAWritesOptions_enum as CUflushGPUDirectRDMAWritesOptions;\nimpl CUGPUDirectRDMAWritesOrdering_enum {\n    ///< The device does not natively support ordering of remote writes. ::cuFlushGPUDirectRDMAWrites() can be leveraged if supported.\n    pub const CU_GPU_DIRECT_RDMA_WRITES_ORDERING_NONE: CUGPUDirectRDMAWritesOrdering_enum = CUGPUDirectRDMAWritesOrdering_enum(\n        0,\n    );\n}\nimpl CUGPUDirectRDMAWritesOrdering_enum {\n    ///< Natively, the device can consistently consume remote writes, although other CUDA devices may not.\n    pub const CU_GPU_DIRECT_RDMA_WRITES_ORDERING_OWNER: CUGPUDirectRDMAWritesOrdering_enum = CUGPUDirectRDMAWritesOrdering_enum(\n        100,\n    );\n}\nimpl CUGPUDirectRDMAWritesOrdering_enum {\n    ///< Any CUDA device in the system can consistently consume remote writes to this device.\n    pub const CU_GPU_DIRECT_RDMA_WRITES_ORDERING_ALL_DEVICES: CUGPUDirectRDMAWritesOrdering_enum = CUGPUDirectRDMAWritesOrdering_enum(\n        200,\n    );\n}\n#[repr(transparent)]\n/// Platform native ordering for GPUDirect RDMA writes\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUGPUDirectRDMAWritesOrdering_enum(pub ::core::ffi::c_uint);\n/// Platform native ordering for GPUDirect RDMA writes\npub use self::CUGPUDirectRDMAWritesOrdering_enum as CUGPUDirectRDMAWritesOrdering;\nimpl CUflushGPUDirectRDMAWritesScope_enum {\n    ///< Blocks until remote writes are visible to the CUDA device context owning the data.\n    pub const CU_FLUSH_GPU_DIRECT_RDMA_WRITES_TO_OWNER: CUflushGPUDirectRDMAWritesScope_enum = CUflushGPUDirectRDMAWritesScope_enum(\n        100,\n    );\n}\nimpl CUflushGPUDirectRDMAWritesScope_enum {\n    ///< Blocks until remote writes are visible to all CUDA device contexts.\n    pub const CU_FLUSH_GPU_DIRECT_RDMA_WRITES_TO_ALL_DEVICES: CUflushGPUDirectRDMAWritesScope_enum = CUflushGPUDirectRDMAWritesScope_enum(\n        200,\n    );\n}\n#[repr(transparent)]\n/// The scopes for ::cuFlushGPUDirectRDMAWrites\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUflushGPUDirectRDMAWritesScope_enum(pub ::core::ffi::c_uint);\n/// The scopes for ::cuFlushGPUDirectRDMAWrites\npub use self::CUflushGPUDirectRDMAWritesScope_enum as CUflushGPUDirectRDMAWritesScope;\nimpl CUflushGPUDirectRDMAWritesTarget_enum {\n    ///< Sets the target for ::cuFlushGPUDirectRDMAWrites() to the currently active CUDA device context.\n    pub const CU_FLUSH_GPU_DIRECT_RDMA_WRITES_TARGET_CURRENT_CTX: CUflushGPUDirectRDMAWritesTarget_enum = CUflushGPUDirectRDMAWritesTarget_enum(\n        0,\n    );\n}\n#[repr(transparent)]\n/// The targets for ::cuFlushGPUDirectRDMAWrites\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUflushGPUDirectRDMAWritesTarget_enum(pub ::core::ffi::c_uint);\n/// The targets for ::cuFlushGPUDirectRDMAWrites\npub use self::CUflushGPUDirectRDMAWritesTarget_enum as CUflushGPUDirectRDMAWritesTarget;\nimpl CUgraphDebugDot_flags_enum {\n    ///< Output all debug data as if every debug flag is enabled\n    pub const CU_GRAPH_DEBUG_DOT_FLAGS_VERBOSE: CUgraphDebugDot_flags_enum = CUgraphDebugDot_flags_enum(\n        1,\n    );\n}\nimpl CUgraphDebugDot_flags_enum {\n    ///< Use CUDA Runtime structures for output\n    pub const CU_GRAPH_DEBUG_DOT_FLAGS_RUNTIME_TYPES: CUgraphDebugDot_flags_enum = CUgraphDebugDot_flags_enum(\n        2,\n    );\n}\nimpl CUgraphDebugDot_flags_enum {\n    ///< Adds CUDA_KERNEL_NODE_PARAMS values to output\n    pub const CU_GRAPH_DEBUG_DOT_FLAGS_KERNEL_NODE_PARAMS: CUgraphDebugDot_flags_enum = CUgraphDebugDot_flags_enum(\n        4,\n    );\n}\nimpl CUgraphDebugDot_flags_enum {\n    ///< Adds CUDA_MEMCPY3D values to output\n    pub const CU_GRAPH_DEBUG_DOT_FLAGS_MEMCPY_NODE_PARAMS: CUgraphDebugDot_flags_enum = CUgraphDebugDot_flags_enum(\n        8,\n    );\n}\nimpl CUgraphDebugDot_flags_enum {\n    ///< Adds CUDA_MEMSET_NODE_PARAMS values to output\n    pub const CU_GRAPH_DEBUG_DOT_FLAGS_MEMSET_NODE_PARAMS: CUgraphDebugDot_flags_enum = CUgraphDebugDot_flags_enum(\n        16,\n    );\n}\nimpl CUgraphDebugDot_flags_enum {\n    ///< Adds CUDA_HOST_NODE_PARAMS values to output\n    pub const CU_GRAPH_DEBUG_DOT_FLAGS_HOST_NODE_PARAMS: CUgraphDebugDot_flags_enum = CUgraphDebugDot_flags_enum(\n        32,\n    );\n}\nimpl CUgraphDebugDot_flags_enum {\n    ///< Adds CUevent handle from record and wait nodes to output\n    pub const CU_GRAPH_DEBUG_DOT_FLAGS_EVENT_NODE_PARAMS: CUgraphDebugDot_flags_enum = CUgraphDebugDot_flags_enum(\n        64,\n    );\n}\nimpl CUgraphDebugDot_flags_enum {\n    ///< Adds CUDA_EXT_SEM_SIGNAL_NODE_PARAMS values to output\n    pub const CU_GRAPH_DEBUG_DOT_FLAGS_EXT_SEMAS_SIGNAL_NODE_PARAMS: CUgraphDebugDot_flags_enum = CUgraphDebugDot_flags_enum(\n        128,\n    );\n}\nimpl CUgraphDebugDot_flags_enum {\n    ///< Adds CUDA_EXT_SEM_WAIT_NODE_PARAMS values to output\n    pub const CU_GRAPH_DEBUG_DOT_FLAGS_EXT_SEMAS_WAIT_NODE_PARAMS: CUgraphDebugDot_flags_enum = CUgraphDebugDot_flags_enum(\n        256,\n    );\n}\nimpl CUgraphDebugDot_flags_enum {\n    ///< Adds CUkernelNodeAttrValue values to output\n    pub const CU_GRAPH_DEBUG_DOT_FLAGS_KERNEL_NODE_ATTRIBUTES: CUgraphDebugDot_flags_enum = CUgraphDebugDot_flags_enum(\n        512,\n    );\n}\nimpl CUgraphDebugDot_flags_enum {\n    ///< Adds node handles and every kernel function handle to output\n    pub const CU_GRAPH_DEBUG_DOT_FLAGS_HANDLES: CUgraphDebugDot_flags_enum = CUgraphDebugDot_flags_enum(\n        1024,\n    );\n}\nimpl CUgraphDebugDot_flags_enum {\n    ///< Adds memory alloc node parameters to output\n    pub const CU_GRAPH_DEBUG_DOT_FLAGS_MEM_ALLOC_NODE_PARAMS: CUgraphDebugDot_flags_enum = CUgraphDebugDot_flags_enum(\n        2048,\n    );\n}\nimpl CUgraphDebugDot_flags_enum {\n    ///< Adds memory free node parameters to output\n    pub const CU_GRAPH_DEBUG_DOT_FLAGS_MEM_FREE_NODE_PARAMS: CUgraphDebugDot_flags_enum = CUgraphDebugDot_flags_enum(\n        4096,\n    );\n}\nimpl CUgraphDebugDot_flags_enum {\n    ///< Adds batch mem op node parameters to output\n    pub const CU_GRAPH_DEBUG_DOT_FLAGS_BATCH_MEM_OP_NODE_PARAMS: CUgraphDebugDot_flags_enum = CUgraphDebugDot_flags_enum(\n        8192,\n    );\n}\nimpl CUgraphDebugDot_flags_enum {\n    ///< Adds edge numbering information\n    pub const CU_GRAPH_DEBUG_DOT_FLAGS_EXTRA_TOPO_INFO: CUgraphDebugDot_flags_enum = CUgraphDebugDot_flags_enum(\n        16384,\n    );\n}\nimpl CUgraphDebugDot_flags_enum {\n    ///< Adds conditional node parameters to output\n    pub const CU_GRAPH_DEBUG_DOT_FLAGS_CONDITIONAL_NODE_PARAMS: CUgraphDebugDot_flags_enum = CUgraphDebugDot_flags_enum(\n        32768,\n    );\n}\n#[repr(transparent)]\n/// The additional write options for ::cuGraphDebugDotPrint\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUgraphDebugDot_flags_enum(pub ::core::ffi::c_uint);\n/// The additional write options for ::cuGraphDebugDotPrint\npub use self::CUgraphDebugDot_flags_enum as CUgraphDebugDot_flags;\nimpl CUuserObject_flags_enum {\n    ///< Indicates the destructor execution is not synchronized by any CUDA handle.\n    pub const CU_USER_OBJECT_NO_DESTRUCTOR_SYNC: CUuserObject_flags_enum = CUuserObject_flags_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n/// Flags for user objects for graphs\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUuserObject_flags_enum(pub ::core::ffi::c_uint);\n/// Flags for user objects for graphs\npub use self::CUuserObject_flags_enum as CUuserObject_flags;\nimpl CUuserObjectRetain_flags_enum {\n    ///< Transfer references from the caller rather than creating new references.\n    pub const CU_GRAPH_USER_OBJECT_MOVE: CUuserObjectRetain_flags_enum = CUuserObjectRetain_flags_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n/// Flags for retaining user object references for graphs\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUuserObjectRetain_flags_enum(pub ::core::ffi::c_uint);\n/// Flags for retaining user object references for graphs\npub use self::CUuserObjectRetain_flags_enum as CUuserObjectRetain_flags;\nimpl CUgraphInstantiate_flags_enum {\n    ///< Automatically free memory allocated in a graph before relaunching.\n    pub const CUDA_GRAPH_INSTANTIATE_FLAG_AUTO_FREE_ON_LAUNCH: CUgraphInstantiate_flags_enum = CUgraphInstantiate_flags_enum(\n        1,\n    );\n}\nimpl CUgraphInstantiate_flags_enum {\n    /**< Automatically upload the graph after instantiation. Only supported by\n::cuGraphInstantiateWithParams.  The upload will be performed using the\nstream provided in \\p instantiateParams.*/\n    pub const CUDA_GRAPH_INSTANTIATE_FLAG_UPLOAD: CUgraphInstantiate_flags_enum = CUgraphInstantiate_flags_enum(\n        2,\n    );\n}\nimpl CUgraphInstantiate_flags_enum {\n    /**< Instantiate the graph to be launchable from the device. This flag can only\nbe used on platforms which support unified addressing. This flag cannot be\nused in conjunction with CUDA_GRAPH_INSTANTIATE_FLAG_AUTO_FREE_ON_LAUNCH.*/\n    pub const CUDA_GRAPH_INSTANTIATE_FLAG_DEVICE_LAUNCH: CUgraphInstantiate_flags_enum = CUgraphInstantiate_flags_enum(\n        4,\n    );\n}\nimpl CUgraphInstantiate_flags_enum {\n    /**< Run the graph using the per-node priority attributes rather than the\npriority of the stream it is launched into.*/\n    pub const CUDA_GRAPH_INSTANTIATE_FLAG_USE_NODE_PRIORITY: CUgraphInstantiate_flags_enum = CUgraphInstantiate_flags_enum(\n        8,\n    );\n}\n#[repr(transparent)]\n/// Flags for instantiating a graph\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUgraphInstantiate_flags_enum(pub ::core::ffi::c_uint);\n/// Flags for instantiating a graph\npub use self::CUgraphInstantiate_flags_enum as CUgraphInstantiate_flags;\nimpl CUdeviceNumaConfig_enum {\n    ///< The GPU is not a NUMA node\n    pub const CU_DEVICE_NUMA_CONFIG_NONE: CUdeviceNumaConfig_enum = CUdeviceNumaConfig_enum(\n        0,\n    );\n}\nimpl CUdeviceNumaConfig_enum {\n    ///< The GPU is a NUMA node, CU_DEVICE_ATTRIBUTE_NUMA_ID contains its NUMA ID\n    pub const CU_DEVICE_NUMA_CONFIG_NUMA_NODE: CUdeviceNumaConfig_enum = CUdeviceNumaConfig_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n/// CUDA device NUMA configuration\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUdeviceNumaConfig_enum(pub ::core::ffi::c_uint);\n/// CUDA device NUMA configuration\npub use self::CUdeviceNumaConfig_enum as CUdeviceNumaConfig;\nimpl CUprocessState_enum {\n    ///< Default process state\n    pub const CU_PROCESS_STATE_RUNNING: CUprocessState_enum = CUprocessState_enum(0);\n}\nimpl CUprocessState_enum {\n    ///< CUDA API locks are taken so further CUDA API calls will block\n    pub const CU_PROCESS_STATE_LOCKED: CUprocessState_enum = CUprocessState_enum(1);\n}\nimpl CUprocessState_enum {\n    ///< Application memory contents have been checkpointed and underlying allocations and device handles have been released\n    pub const CU_PROCESS_STATE_CHECKPOINTED: CUprocessState_enum = CUprocessState_enum(\n        2,\n    );\n}\nimpl CUprocessState_enum {\n    ///< Application entered an uncorrectable error during the checkpoint/restore process\n    pub const CU_PROCESS_STATE_FAILED: CUprocessState_enum = CUprocessState_enum(3);\n}\n#[repr(transparent)]\n/// CUDA Process States\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUprocessState_enum(pub ::core::ffi::c_uint);\n/// CUDA Process States\npub use self::CUprocessState_enum as CUprocessState;\n/// CUDA checkpoint optional lock arguments\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUcheckpointLockArgs_st {\n    ///< Timeout in milliseconds to attempt to lock the process, 0 indicates no timeout\n    pub timeoutMs: ::core::ffi::c_uint,\n    ///< Reserved for future use, must be zero\n    pub reserved0: ::core::ffi::c_uint,\n    ///< Reserved for future use, must be zeroed\n    pub reserved1: [cuuint64_t; 7usize],\n}\n/// CUDA checkpoint optional lock arguments\npub type CUcheckpointLockArgs = CUcheckpointLockArgs_st;\n/// CUDA checkpoint optional checkpoint arguments\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUcheckpointCheckpointArgs_st {\n    ///< Reserved for future use, must be zeroed\n    pub reserved: [cuuint64_t; 8usize],\n}\n/// CUDA checkpoint optional checkpoint arguments\npub type CUcheckpointCheckpointArgs = CUcheckpointCheckpointArgs_st;\n/// CUDA checkpoint GPU UUID pairs for device remapping during restore\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUcheckpointGpuPair_st {\n    ///< UUID of the GPU that was checkpointed\n    pub oldUuid: CUuuid,\n    ///< UUID of the GPU to restore onto\n    pub newUuid: CUuuid,\n}\n/// CUDA checkpoint GPU UUID pairs for device remapping during restore\npub type CUcheckpointGpuPair = CUcheckpointGpuPair_st;\n/// CUDA checkpoint optional restore arguments\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUcheckpointRestoreArgs_st {\n    ///< Pointer to array of gpu pairs that indicate how to remap GPUs during restore\n    pub gpuPairs: *mut CUcheckpointGpuPair,\n    ///< Number of gpu pairs to remap\n    pub gpuPairsCount: ::core::ffi::c_uint,\n    ///< Reserved for future use, must be zeroed\n    pub reserved: [::core::ffi::c_char; 44usize],\n    ///< Reserved for future use, must be zeroed\n    pub reserved1: cuuint64_t,\n}\n/// CUDA checkpoint optional restore arguments\npub type CUcheckpointRestoreArgs = CUcheckpointRestoreArgs_st;\n/// CUDA checkpoint optional unlock arguments\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUcheckpointUnlockArgs_st {\n    ///< Reserved for future use, must be zeroed\n    pub reserved: [cuuint64_t; 8usize],\n}\n/// CUDA checkpoint optional unlock arguments\npub type CUcheckpointUnlockArgs = CUcheckpointUnlockArgs_st;\nimpl CUmoduleLoadingMode_enum {\n    ///< Lazy Kernel Loading is not enabled\n    pub const CU_MODULE_EAGER_LOADING: CUmoduleLoadingMode_enum = CUmoduleLoadingMode_enum(\n        1,\n    );\n}\nimpl CUmoduleLoadingMode_enum {\n    ///< Lazy Kernel Loading is enabled\n    pub const CU_MODULE_LAZY_LOADING: CUmoduleLoadingMode_enum = CUmoduleLoadingMode_enum(\n        2,\n    );\n}\n#[repr(transparent)]\n/// CUDA Lazy Loading status\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmoduleLoadingMode_enum(pub ::core::ffi::c_uint);\n/// CUDA Lazy Loading status\npub use self::CUmoduleLoadingMode_enum as CUmoduleLoadingMode;\nimpl CUmemDecompressAlgorithm_enum {\n    ///< Decompression is unsupported.\n    pub const CU_MEM_DECOMPRESS_UNSUPPORTED: CUmemDecompressAlgorithm_enum = CUmemDecompressAlgorithm_enum(\n        0,\n    );\n}\nimpl CUmemDecompressAlgorithm_enum {\n    ///< Deflate is supported.\n    pub const CU_MEM_DECOMPRESS_ALGORITHM_DEFLATE: CUmemDecompressAlgorithm_enum = CUmemDecompressAlgorithm_enum(\n        1,\n    );\n}\nimpl CUmemDecompressAlgorithm_enum {\n    ///< Snappy is supported.\n    pub const CU_MEM_DECOMPRESS_ALGORITHM_SNAPPY: CUmemDecompressAlgorithm_enum = CUmemDecompressAlgorithm_enum(\n        2,\n    );\n}\nimpl CUmemDecompressAlgorithm_enum {\n    ///< LZ4 is supported.\n    pub const CU_MEM_DECOMPRESS_ALGORITHM_LZ4: CUmemDecompressAlgorithm_enum = CUmemDecompressAlgorithm_enum(\n        4,\n    );\n}\n#[repr(transparent)]\n/// \\brief Bitmasks for CU_DEVICE_ATTRIBUTE_MEM_DECOMPRESS_ALGORITHM_MASK.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmemDecompressAlgorithm_enum(pub ::core::ffi::c_uint);\n/// \\brief Bitmasks for CU_DEVICE_ATTRIBUTE_MEM_DECOMPRESS_ALGORITHM_MASK.\npub use self::CUmemDecompressAlgorithm_enum as CUmemDecompressAlgorithm;\n/** \\brief Structure describing the parameters that compose a single\n        decompression operation.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUmemDecompressParams_st {\n    /** The number of bytes to be read and decompressed from\n  ::CUmemDecompressParams_st.src.*/\n    pub srcNumBytes: usize,\n    /** The number of bytes that the decompression operation will be expected to\n  write to ::CUmemDecompressParams_st.dst. This value is optional; if\n  present, it may be used by the CUDA driver as a heuristic for scheduling\n  the individual decompression operations.*/\n    pub dstNumBytes: usize,\n    /** After the decompression operation has completed, the actual number of\n bytes written to ::CUmemDecompressParams.dst will be recorded as a 32-bit\n unsigned integer in the memory at this address.*/\n    pub dstActBytes: *mut cuuint32_t,\n    /** Pointer to a buffer of at least ::CUmemDecompressParams_st.srcNumBytes\n compressed bytes.*/\n    pub src: *const ::core::ffi::c_void,\n    /** Pointer to a buffer where the decompressed data will be written. The\n number of bytes written to this location will be recorded in the memory\n pointed to by ::CUmemDecompressParams_st.dstActBytes*/\n    pub dst: *mut ::core::ffi::c_void,\n    /// The decompression algorithm to use.\n    pub algo: CUmemDecompressAlgorithm,\n    pub padding: [::core::ffi::c_uchar; 20usize],\n}\n/** \\brief Structure describing the parameters that compose a single\n        decompression operation.*/\npub type CUmemDecompressParams = CUmemDecompressParams_st;\nimpl CUfunctionLoadingState_enum {\n    pub const CU_FUNCTION_LOADING_STATE_UNLOADED: CUfunctionLoadingState_enum = CUfunctionLoadingState_enum(\n        0,\n    );\n}\nimpl CUfunctionLoadingState_enum {\n    pub const CU_FUNCTION_LOADING_STATE_LOADED: CUfunctionLoadingState_enum = CUfunctionLoadingState_enum(\n        1,\n    );\n}\nimpl CUfunctionLoadingState_enum {\n    pub const CU_FUNCTION_LOADING_STATE_MAX: CUfunctionLoadingState_enum = CUfunctionLoadingState_enum(\n        2,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUfunctionLoadingState_enum(pub ::core::ffi::c_uint);\npub use self::CUfunctionLoadingState_enum as CUfunctionLoadingState;\nimpl CUcoredumpSettings_enum {\n    pub const CU_COREDUMP_ENABLE_ON_EXCEPTION: CUcoredumpSettings_enum = CUcoredumpSettings_enum(\n        1,\n    );\n}\nimpl CUcoredumpSettings_enum {\n    pub const CU_COREDUMP_TRIGGER_HOST: CUcoredumpSettings_enum = CUcoredumpSettings_enum(\n        2,\n    );\n}\nimpl CUcoredumpSettings_enum {\n    pub const CU_COREDUMP_LIGHTWEIGHT: CUcoredumpSettings_enum = CUcoredumpSettings_enum(\n        3,\n    );\n}\nimpl CUcoredumpSettings_enum {\n    pub const CU_COREDUMP_ENABLE_USER_TRIGGER: CUcoredumpSettings_enum = CUcoredumpSettings_enum(\n        4,\n    );\n}\nimpl CUcoredumpSettings_enum {\n    pub const CU_COREDUMP_FILE: CUcoredumpSettings_enum = CUcoredumpSettings_enum(5);\n}\nimpl CUcoredumpSettings_enum {\n    pub const CU_COREDUMP_PIPE: CUcoredumpSettings_enum = CUcoredumpSettings_enum(6);\n}\nimpl CUcoredumpSettings_enum {\n    pub const CU_COREDUMP_GENERATION_FLAGS: CUcoredumpSettings_enum = CUcoredumpSettings_enum(\n        7,\n    );\n}\nimpl CUcoredumpSettings_enum {\n    pub const CU_COREDUMP_MAX: CUcoredumpSettings_enum = CUcoredumpSettings_enum(8);\n}\n#[repr(transparent)]\n/// Flags for choosing a coredump attribute to get/set\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUcoredumpSettings_enum(pub ::core::ffi::c_uint);\n/// Flags for choosing a coredump attribute to get/set\npub use self::CUcoredumpSettings_enum as CUcoredumpSettings;\nimpl CUCoredumpGenerationFlags {\n    pub const CU_COREDUMP_DEFAULT_FLAGS: CUCoredumpGenerationFlags = CUCoredumpGenerationFlags(\n        0,\n    );\n}\nimpl CUCoredumpGenerationFlags {\n    pub const CU_COREDUMP_SKIP_NONRELOCATED_ELF_IMAGES: CUCoredumpGenerationFlags = CUCoredumpGenerationFlags(\n        1,\n    );\n}\nimpl CUCoredumpGenerationFlags {\n    pub const CU_COREDUMP_SKIP_GLOBAL_MEMORY: CUCoredumpGenerationFlags = CUCoredumpGenerationFlags(\n        2,\n    );\n}\nimpl CUCoredumpGenerationFlags {\n    pub const CU_COREDUMP_SKIP_SHARED_MEMORY: CUCoredumpGenerationFlags = CUCoredumpGenerationFlags(\n        4,\n    );\n}\nimpl CUCoredumpGenerationFlags {\n    pub const CU_COREDUMP_SKIP_LOCAL_MEMORY: CUCoredumpGenerationFlags = CUCoredumpGenerationFlags(\n        8,\n    );\n}\nimpl CUCoredumpGenerationFlags {\n    pub const CU_COREDUMP_SKIP_ABORT: CUCoredumpGenerationFlags = CUCoredumpGenerationFlags(\n        16,\n    );\n}\nimpl CUCoredumpGenerationFlags {\n    pub const CU_COREDUMP_SKIP_CONSTBANK_MEMORY: CUCoredumpGenerationFlags = CUCoredumpGenerationFlags(\n        32,\n    );\n}\nimpl CUCoredumpGenerationFlags {\n    pub const CU_COREDUMP_LIGHTWEIGHT_FLAGS: CUCoredumpGenerationFlags = CUCoredumpGenerationFlags(\n        47,\n    );\n}\n#[repr(transparent)]\n/// Flags for controlling coredump contents\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUCoredumpGenerationFlags(pub ::core::ffi::c_uint);\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct CUdevResourceDesc_st {\n    _unused: [u8; 0],\n}\n/** \\typedef struct CUdevResourceDesc_st* CUdevResourceDesc;\n An opaque descriptor handle. The descriptor encapsulates multiple created and configured resources.\n Created via ::cuDevResourceGenerateDesc*/\npub type CUdevResourceDesc = *mut CUdevResourceDesc_st;\nimpl CUgreenCtxCreate_flags {\n    ///< Required. Creates a default stream to use inside the green context\n    pub const CU_GREEN_CTX_DEFAULT_STREAM: CUgreenCtxCreate_flags = CUgreenCtxCreate_flags(\n        1,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUgreenCtxCreate_flags(pub ::core::ffi::c_uint);\nimpl CUdevSmResourceSplit_flags {\n    pub const CU_DEV_SM_RESOURCE_SPLIT_IGNORE_SM_COSCHEDULING: CUdevSmResourceSplit_flags = CUdevSmResourceSplit_flags(\n        1,\n    );\n}\nimpl CUdevSmResourceSplit_flags {\n    pub const CU_DEV_SM_RESOURCE_SPLIT_MAX_POTENTIAL_CLUSTER_SIZE: CUdevSmResourceSplit_flags = CUdevSmResourceSplit_flags(\n        2,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUdevSmResourceSplit_flags(pub ::core::ffi::c_uint);\nimpl CUdevResourceType {\n    pub const CU_DEV_RESOURCE_TYPE_INVALID: CUdevResourceType = CUdevResourceType(0);\n}\nimpl CUdevResourceType {\n    ///< Streaming multiprocessors related information\n    pub const CU_DEV_RESOURCE_TYPE_SM: CUdevResourceType = CUdevResourceType(1);\n}\nimpl CUdevResourceType {\n    pub const CU_DEV_RESOURCE_TYPE_MAX: CUdevResourceType = CUdevResourceType(2);\n}\n#[repr(transparent)]\n/** \\typedef enum CUdevResourceType\n Type of resource*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUdevResourceType(pub ::core::ffi::c_uint);\n/** \\struct CUdevSmResource\n Data for SM-related resources*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUdevSmResource_st {\n    ///< The amount of streaming multiprocessors available in this resource. This is an output parameter only, do not write to this field.\n    pub smCount: ::core::ffi::c_uint,\n    /**< The minimum number of streaming multiprocessors required to partition this resource.\nThis is an output parameter only, do not write to this field.*/\n    pub minSmPartitionSize: ::core::ffi::c_uint,\n    /**< The number of streaming multiprocessors in this resource that are guaranteed to\nbe co-scheduled on the same GPU processing cluster. smCount is a multiple of this value.\nThis is an output parameter only, do not write to this field.*/\n    pub smCoscheduledAlignment: ::core::ffi::c_uint,\n}\n/** \\struct CUdevSmResource\n Data for SM-related resources*/\npub type CUdevSmResource = CUdevSmResource_st;\n/** \\struct CUdevResource\n A tagged union describing different resources identified by the type field. This structure should not be directly modified outside of the API that created it.\n \\code\n struct {\n     CUdevResourceType type;\n     union {\n         CUdevSmResource sm;\n     };\n };\n \\endcode\n - If \\p type is \\p CU_DEV_RESOURCE_TYPE_INVALID, this resoure is not valid and cannot be further accessed.\n - If \\p type is \\p CU_DEV_RESOURCE_TYPE_SM, the ::CUdevSmResource structure \\p sm is filled in. For example,\n \\p sm.smCount will reflect the amount of streaming multiprocessors available in this resource.*/\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct CUdevResource_st {\n    ///< Type of resource, dictates which union field was last set\n    pub type_: CUdevResourceType,\n    pub _internal_padding: [::core::ffi::c_uchar; 92usize],\n    pub __bindgen_anon_1: CUdevResource_st__bindgen_ty_1,\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union CUdevResource_st__bindgen_ty_1 {\n    ///< Resource corresponding to CU_DEV_RESOURCE_TYPE_SM \\p type.\n    pub sm: CUdevSmResource,\n    pub _oversize: [::core::ffi::c_uchar; 48usize],\n}\n/** \\struct CUdevResource\n A tagged union describing different resources identified by the type field. This structure should not be directly modified outside of the API that created it.\n \\code\n struct {\n     CUdevResourceType type;\n     union {\n         CUdevSmResource sm;\n     };\n };\n \\endcode\n - If \\p type is \\p CU_DEV_RESOURCE_TYPE_INVALID, this resoure is not valid and cannot be further accessed.\n - If \\p type is \\p CU_DEV_RESOURCE_TYPE_SM, the ::CUdevSmResource structure \\p sm is filled in. For example,\n \\p sm.smCount will reflect the amount of streaming multiprocessors available in this resource.*/\npub type CUdevResource_v1 = CUdevResource_st;\n/** \\struct CUdevResource\n A tagged union describing different resources identified by the type field. This structure should not be directly modified outside of the API that created it.\n \\code\n struct {\n     CUdevResourceType type;\n     union {\n         CUdevSmResource sm;\n     };\n };\n \\endcode\n - If \\p type is \\p CU_DEV_RESOURCE_TYPE_INVALID, this resoure is not valid and cannot be further accessed.\n - If \\p type is \\p CU_DEV_RESOURCE_TYPE_SM, the ::CUdevSmResource structure \\p sm is filled in. For example,\n \\p sm.smCount will reflect the amount of streaming multiprocessors available in this resource.*/\npub type CUdevResource = CUdevResource_v1;\nimpl CUlogLevel_enum {\n    pub const CU_LOG_LEVEL_ERROR: CUlogLevel_enum = CUlogLevel_enum(0);\n}\nimpl CUlogLevel_enum {\n    pub const CU_LOG_LEVEL_WARNING: CUlogLevel_enum = CUlogLevel_enum(1);\n}\n#[repr(transparent)]\n/** \\defgroup CUDA_LOGS Error Log Management Functions\n\n ___MANBRIEF___ error log management functions for the low-level CUDA API\n (___CURRENT_FILE___) ___ENDMANBRIEF___\n\n This section describes the error log management functions of the low-level CUDA\n driver application programming interface.\n\n @{*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUlogLevel_enum(pub ::core::ffi::c_uint);\n/** \\defgroup CUDA_LOGS Error Log Management Functions\n\n ___MANBRIEF___ error log management functions for the low-level CUDA API\n (___CURRENT_FILE___) ___ENDMANBRIEF___\n\n This section describes the error log management functions of the low-level CUDA\n driver application programming interface.\n\n @{*/\npub use self::CUlogLevel_enum as CUlogLevel;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct CUlogsCallbackEntry_st {\n    _unused: [u8; 0],\n}\npub type CUlogsCallbackHandle = *mut CUlogsCallbackEntry_st;\npub type CUlogsCallback = ::core::option::Option<\n    unsafe extern \"system\" fn(\n        data: *mut ::core::ffi::c_void,\n        logLevel: CUlogLevel,\n        message: *mut ::core::ffi::c_char,\n        length: usize,\n    ),\n>;\npub type CUlogIterator = ::core::ffi::c_uint;\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUdeviceptr_v1(pub ::core::ffi::c_uint);\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_MEMCPY2D_v1_st {\n    ///< Source X in bytes\n    pub srcXInBytes: ::core::ffi::c_uint,\n    ///< Source Y\n    pub srcY: ::core::ffi::c_uint,\n    ///< Source memory type (host, device, array)\n    pub srcMemoryType: CUmemorytype,\n    ///< Source host pointer\n    pub srcHost: *const ::core::ffi::c_void,\n    ///< Source device pointer\n    pub srcDevice: CUdeviceptr_v1,\n    ///< Source array reference\n    pub srcArray: CUarray,\n    ///< Source pitch (ignored when src is array)\n    pub srcPitch: ::core::ffi::c_uint,\n    ///< Destination X in bytes\n    pub dstXInBytes: ::core::ffi::c_uint,\n    ///< Destination Y\n    pub dstY: ::core::ffi::c_uint,\n    ///< Destination memory type (host, device, array)\n    pub dstMemoryType: CUmemorytype,\n    ///< Destination host pointer\n    pub dstHost: *mut ::core::ffi::c_void,\n    ///< Destination device pointer\n    pub dstDevice: CUdeviceptr_v1,\n    ///< Destination array reference\n    pub dstArray: CUarray,\n    ///< Destination pitch (ignored when dst is array)\n    pub dstPitch: ::core::ffi::c_uint,\n    ///< Width of 2D memory copy in bytes\n    pub WidthInBytes: ::core::ffi::c_uint,\n    ///< Height of 2D memory copy\n    pub Height: ::core::ffi::c_uint,\n}\npub type CUDA_MEMCPY2D_v1 = CUDA_MEMCPY2D_v1_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_MEMCPY3D_v1_st {\n    ///< Source X in bytes\n    pub srcXInBytes: ::core::ffi::c_uint,\n    ///< Source Y\n    pub srcY: ::core::ffi::c_uint,\n    ///< Source Z\n    pub srcZ: ::core::ffi::c_uint,\n    ///< Source LOD\n    pub srcLOD: ::core::ffi::c_uint,\n    ///< Source memory type (host, device, array)\n    pub srcMemoryType: CUmemorytype,\n    ///< Source host pointer\n    pub srcHost: *const ::core::ffi::c_void,\n    ///< Source device pointer\n    pub srcDevice: CUdeviceptr_v1,\n    ///< Source array reference\n    pub srcArray: CUarray,\n    ///< Must be NULL\n    pub reserved0: *mut ::core::ffi::c_void,\n    ///< Source pitch (ignored when src is array)\n    pub srcPitch: ::core::ffi::c_uint,\n    ///< Source height (ignored when src is array; may be 0 if Depth==1)\n    pub srcHeight: ::core::ffi::c_uint,\n    ///< Destination X in bytes\n    pub dstXInBytes: ::core::ffi::c_uint,\n    ///< Destination Y\n    pub dstY: ::core::ffi::c_uint,\n    ///< Destination Z\n    pub dstZ: ::core::ffi::c_uint,\n    ///< Destination LOD\n    pub dstLOD: ::core::ffi::c_uint,\n    ///< Destination memory type (host, device, array)\n    pub dstMemoryType: CUmemorytype,\n    ///< Destination host pointer\n    pub dstHost: *mut ::core::ffi::c_void,\n    ///< Destination device pointer\n    pub dstDevice: CUdeviceptr_v1,\n    ///< Destination array reference\n    pub dstArray: CUarray,\n    ///< Must be NULL\n    pub reserved1: *mut ::core::ffi::c_void,\n    ///< Destination pitch (ignored when dst is array)\n    pub dstPitch: ::core::ffi::c_uint,\n    ///< Destination height (ignored when dst is array; may be 0 if Depth==1)\n    pub dstHeight: ::core::ffi::c_uint,\n    ///< Width of 3D memory copy in bytes\n    pub WidthInBytes: ::core::ffi::c_uint,\n    ///< Height of 3D memory copy\n    pub Height: ::core::ffi::c_uint,\n    ///< Depth of 3D memory copy\n    pub Depth: ::core::ffi::c_uint,\n}\npub type CUDA_MEMCPY3D_v1 = CUDA_MEMCPY3D_v1_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_ARRAY_DESCRIPTOR_v1_st {\n    ///< Width of array\n    pub Width: ::core::ffi::c_uint,\n    ///< Height of array\n    pub Height: ::core::ffi::c_uint,\n    ///< Array format\n    pub Format: CUarray_format,\n    ///< Channels per array element\n    pub NumChannels: ::core::ffi::c_uint,\n}\npub type CUDA_ARRAY_DESCRIPTOR_v1 = CUDA_ARRAY_DESCRIPTOR_v1_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUDA_ARRAY3D_DESCRIPTOR_v1_st {\n    ///< Width of 3D array\n    pub Width: ::core::ffi::c_uint,\n    ///< Height of 3D array\n    pub Height: ::core::ffi::c_uint,\n    ///< Depth of 3D array\n    pub Depth: ::core::ffi::c_uint,\n    ///< Array format\n    pub Format: CUarray_format,\n    ///< Channels per array element\n    pub NumChannels: ::core::ffi::c_uint,\n    ///< Flags\n    pub Flags: ::core::ffi::c_uint,\n}\npub type CUDA_ARRAY3D_DESCRIPTOR_v1 = CUDA_ARRAY3D_DESCRIPTOR_v1_st;\nimpl CUoutput_mode_enum {\n    ///< Output mode Key-Value pair format.\n    pub const CU_OUT_KEY_VALUE_PAIR: CUoutput_mode_enum = CUoutput_mode_enum(0);\n}\nimpl CUoutput_mode_enum {\n    ///< Output mode Comma separated values format.\n    pub const CU_OUT_CSV: CUoutput_mode_enum = CUoutput_mode_enum(1);\n}\n#[repr(transparent)]\n/// Profiler Output Modes\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUoutput_mode_enum(pub ::core::ffi::c_uint);\n/// Profiler Output Modes\npub use self::CUoutput_mode_enum as CUoutput_mode;\npub type GLenum = ::core::ffi::c_uint;\npub type GLuint = ::core::ffi::c_uint;\npub type khronos_int32_t = i32;\nimpl CUGLDeviceList_enum {\n    ///< The CUDA devices for all GPUs used by the current OpenGL context\n    pub const CU_GL_DEVICE_LIST_ALL: CUGLDeviceList_enum = CUGLDeviceList_enum(1);\n}\nimpl CUGLDeviceList_enum {\n    ///< The CUDA devices for the GPUs used by the current OpenGL context in its currently rendering frame\n    pub const CU_GL_DEVICE_LIST_CURRENT_FRAME: CUGLDeviceList_enum = CUGLDeviceList_enum(\n        2,\n    );\n}\nimpl CUGLDeviceList_enum {\n    ///< The CUDA devices for the GPUs to be used by the current OpenGL context in the next frame\n    pub const CU_GL_DEVICE_LIST_NEXT_FRAME: CUGLDeviceList_enum = CUGLDeviceList_enum(3);\n}\n#[repr(transparent)]\n/// CUDA devices corresponding to an OpenGL device\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUGLDeviceList_enum(pub ::core::ffi::c_uint);\n/// CUDA devices corresponding to an OpenGL device\npub use self::CUGLDeviceList_enum as CUGLDeviceList;\nimpl CUGLmap_flags_enum {\n    pub const CU_GL_MAP_RESOURCE_FLAGS_NONE: CUGLmap_flags_enum = CUGLmap_flags_enum(0);\n}\nimpl CUGLmap_flags_enum {\n    pub const CU_GL_MAP_RESOURCE_FLAGS_READ_ONLY: CUGLmap_flags_enum = CUGLmap_flags_enum(\n        1,\n    );\n}\nimpl CUGLmap_flags_enum {\n    pub const CU_GL_MAP_RESOURCE_FLAGS_WRITE_DISCARD: CUGLmap_flags_enum = CUGLmap_flags_enum(\n        2,\n    );\n}\n#[repr(transparent)]\n/// Flags to map or unmap a resource\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUGLmap_flags_enum(pub ::core::ffi::c_uint);\n/// Flags to map or unmap a resource\npub use self::CUGLmap_flags_enum as CUGLmap_flags;\npub type EGLint = khronos_int32_t;\npub type EGLSyncKHR = *mut ::core::ffi::c_void;\npub type EGLImageKHR = *mut ::core::ffi::c_void;\npub type EGLStreamKHR = *mut ::core::ffi::c_void;\nimpl CUeglFrameType_enum {\n    ///< Frame type CUDA array\n    pub const CU_EGL_FRAME_TYPE_ARRAY: CUeglFrameType_enum = CUeglFrameType_enum(0);\n}\nimpl CUeglFrameType_enum {\n    ///< Frame type pointer\n    pub const CU_EGL_FRAME_TYPE_PITCH: CUeglFrameType_enum = CUeglFrameType_enum(1);\n}\n#[repr(transparent)]\n/// CUDA EglFrame type - array or pointer\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUeglFrameType_enum(pub ::core::ffi::c_uint);\n/// CUDA EglFrame type - array or pointer\npub use self::CUeglFrameType_enum as CUeglFrameType;\nimpl CUeglResourceLocationFlags_enum {\n    ///< Resource location sysmem\n    pub const CU_EGL_RESOURCE_LOCATION_SYSMEM: CUeglResourceLocationFlags_enum = CUeglResourceLocationFlags_enum(\n        0,\n    );\n}\nimpl CUeglResourceLocationFlags_enum {\n    ///< Resource location vidmem\n    pub const CU_EGL_RESOURCE_LOCATION_VIDMEM: CUeglResourceLocationFlags_enum = CUeglResourceLocationFlags_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n/** Resource location flags- sysmem or vidmem\n\n For CUDA context on iGPU, since video and system memory are equivalent -\n these flags will not have an effect on the execution.\n\n For CUDA context on dGPU, applications can use the flag ::CUeglResourceLocationFlags\n to give a hint about the desired location.\n\n ::CU_EGL_RESOURCE_LOCATION_SYSMEM - the frame data is made resident on the system memory\n to be accessed by CUDA.\n\n ::CU_EGL_RESOURCE_LOCATION_VIDMEM - the frame data is made resident on the dedicated\n video memory to be accessed by CUDA.\n\n There may be an additional latency due to new allocation and data migration,\n if the frame is produced on a different memory.\n*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUeglResourceLocationFlags_enum(pub ::core::ffi::c_uint);\n/** Resource location flags- sysmem or vidmem\n\n For CUDA context on iGPU, since video and system memory are equivalent -\n these flags will not have an effect on the execution.\n\n For CUDA context on dGPU, applications can use the flag ::CUeglResourceLocationFlags\n to give a hint about the desired location.\n\n ::CU_EGL_RESOURCE_LOCATION_SYSMEM - the frame data is made resident on the system memory\n to be accessed by CUDA.\n\n ::CU_EGL_RESOURCE_LOCATION_VIDMEM - the frame data is made resident on the dedicated\n video memory to be accessed by CUDA.\n\n There may be an additional latency due to new allocation and data migration,\n if the frame is produced on a different memory.\n*/\npub use self::CUeglResourceLocationFlags_enum as CUeglResourceLocationFlags;\nimpl CUeglColorFormat_enum {\n    ///< Y, U, V in three surfaces, each in a separate surface, U/V width = 1/2 Y width, U/V height = 1/2 Y height.\n    pub const CU_EGL_COLOR_FORMAT_YUV420_PLANAR: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        0,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y, UV in two surfaces (UV as one surface) with VU byte ordering, width, height ratio same as YUV420Planar.\n    pub const CU_EGL_COLOR_FORMAT_YUV420_SEMIPLANAR: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        1,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y, U, V  each in a separate  surface, U/V width = 1/2 Y width, U/V height = Y height.\n    pub const CU_EGL_COLOR_FORMAT_YUV422_PLANAR: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        2,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y, UV in two surfaces with VU byte ordering, width, height ratio same as YUV422Planar.\n    pub const CU_EGL_COLOR_FORMAT_YUV422_SEMIPLANAR: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        3,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< R/G/B three channels in one surface with BGR byte ordering. Only pitch linear format supported.\n    pub const CU_EGL_COLOR_FORMAT_RGB: CUeglColorFormat_enum = CUeglColorFormat_enum(4);\n}\nimpl CUeglColorFormat_enum {\n    ///< R/G/B three channels in one surface with RGB byte ordering. Only pitch linear format supported.\n    pub const CU_EGL_COLOR_FORMAT_BGR: CUeglColorFormat_enum = CUeglColorFormat_enum(5);\n}\nimpl CUeglColorFormat_enum {\n    ///< R/G/B/A four channels in one surface with BGRA byte ordering.\n    pub const CU_EGL_COLOR_FORMAT_ARGB: CUeglColorFormat_enum = CUeglColorFormat_enum(6);\n}\nimpl CUeglColorFormat_enum {\n    ///< R/G/B/A four channels in one surface with ABGR byte ordering.\n    pub const CU_EGL_COLOR_FORMAT_RGBA: CUeglColorFormat_enum = CUeglColorFormat_enum(7);\n}\nimpl CUeglColorFormat_enum {\n    ///< single luminance channel in one surface.\n    pub const CU_EGL_COLOR_FORMAT_L: CUeglColorFormat_enum = CUeglColorFormat_enum(8);\n}\nimpl CUeglColorFormat_enum {\n    ///< single color channel in one surface.\n    pub const CU_EGL_COLOR_FORMAT_R: CUeglColorFormat_enum = CUeglColorFormat_enum(9);\n}\nimpl CUeglColorFormat_enum {\n    ///< Y, U, V in three surfaces, each in a separate surface, U/V width = Y width, U/V height = Y height.\n    pub const CU_EGL_COLOR_FORMAT_YUV444_PLANAR: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        10,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y, UV in two surfaces (UV as one surface) with VU byte ordering, width, height ratio same as YUV444Planar.\n    pub const CU_EGL_COLOR_FORMAT_YUV444_SEMIPLANAR: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        11,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y, U, V in one surface, interleaved as UYVY in one channel.\n    pub const CU_EGL_COLOR_FORMAT_YUYV_422: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        12,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y, U, V in one surface, interleaved as YUYV in one channel.\n    pub const CU_EGL_COLOR_FORMAT_UYVY_422: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        13,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< R/G/B/A four channels in one surface with RGBA byte ordering.\n    pub const CU_EGL_COLOR_FORMAT_ABGR: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        14,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< R/G/B/A four channels in one surface with ARGB byte ordering.\n    pub const CU_EGL_COLOR_FORMAT_BGRA: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        15,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Alpha color format - one channel in one surface.\n    pub const CU_EGL_COLOR_FORMAT_A: CUeglColorFormat_enum = CUeglColorFormat_enum(16);\n}\nimpl CUeglColorFormat_enum {\n    ///< R/G color format - two channels in one surface with GR byte ordering\n    pub const CU_EGL_COLOR_FORMAT_RG: CUeglColorFormat_enum = CUeglColorFormat_enum(17);\n}\nimpl CUeglColorFormat_enum {\n    ///< Y, U, V, A four channels in one surface, interleaved as VUYA.\n    pub const CU_EGL_COLOR_FORMAT_AYUV: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        18,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y, VU in two surfaces (VU as one surface) with UV byte ordering, U/V width = Y width, U/V height = Y height.\n    pub const CU_EGL_COLOR_FORMAT_YVU444_SEMIPLANAR: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        19,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y, VU in two surfaces (VU as one surface) with UV byte ordering, U/V width = 1/2 Y width, U/V height = Y height.\n    pub const CU_EGL_COLOR_FORMAT_YVU422_SEMIPLANAR: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        20,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y, VU in two surfaces (VU as one surface) with UV byte ordering, U/V width = 1/2 Y width, U/V height = 1/2 Y height.\n    pub const CU_EGL_COLOR_FORMAT_YVU420_SEMIPLANAR: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        21,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y10, V10U10 in two surfaces (VU as one surface) with UV byte ordering, U/V width = Y width, U/V height = Y height.\n    pub const CU_EGL_COLOR_FORMAT_Y10V10U10_444_SEMIPLANAR: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        22,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y10, V10U10 in two surfaces (VU as one surface) with UV byte ordering, U/V width = 1/2 Y width, U/V height = 1/2 Y height.\n    pub const CU_EGL_COLOR_FORMAT_Y10V10U10_420_SEMIPLANAR: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        23,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y12, V12U12 in two surfaces (VU as one surface) with UV byte ordering, U/V width = Y width, U/V height = Y height.\n    pub const CU_EGL_COLOR_FORMAT_Y12V12U12_444_SEMIPLANAR: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        24,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y12, V12U12 in two surfaces (VU as one surface) with UV byte ordering, U/V width = 1/2 Y width, U/V height = 1/2 Y height.\n    pub const CU_EGL_COLOR_FORMAT_Y12V12U12_420_SEMIPLANAR: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        25,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Y, U, V in one surface, interleaved as YVYU in one channel.\n    pub const CU_EGL_COLOR_FORMAT_VYUY_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        26,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Y, U, V in one surface, interleaved as YUYV in one channel.\n    pub const CU_EGL_COLOR_FORMAT_UYVY_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        27,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Y, U, V in one surface, interleaved as UYVY in one channel.\n    pub const CU_EGL_COLOR_FORMAT_YUYV_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        28,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Y, U, V in one surface, interleaved as VYUY in one channel.\n    pub const CU_EGL_COLOR_FORMAT_YVYU_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        29,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Y, U, V three channels in one surface, interleaved as VUY. Only pitch linear format supported.\n    pub const CU_EGL_COLOR_FORMAT_YUV_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        30,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Y, U, V, A four channels in one surface, interleaved as AVUY.\n    pub const CU_EGL_COLOR_FORMAT_YUVA_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        31,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Y, U, V, A four channels in one surface, interleaved as VUYA.\n    pub const CU_EGL_COLOR_FORMAT_AYUV_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        32,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Y, U, V in three surfaces, U/V width = Y width, U/V height = Y height.\n    pub const CU_EGL_COLOR_FORMAT_YUV444_PLANAR_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        33,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Y, U, V in three surfaces, U/V width = 1/2 Y width, U/V height = Y height.\n    pub const CU_EGL_COLOR_FORMAT_YUV422_PLANAR_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        34,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Y, U, V in three surfaces, U/V width = 1/2 Y width, U/V height = 1/2 Y height.\n    pub const CU_EGL_COLOR_FORMAT_YUV420_PLANAR_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        35,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Y, UV in two surfaces (UV as one surface) with VU byte ordering, U/V width = Y width, U/V height = Y height.\n    pub const CU_EGL_COLOR_FORMAT_YUV444_SEMIPLANAR_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        36,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Y, UV in two surfaces (UV as one surface) with VU byte ordering, U/V width = 1/2 Y width, U/V height = Y height.\n    pub const CU_EGL_COLOR_FORMAT_YUV422_SEMIPLANAR_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        37,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Y, UV in two surfaces (UV as one surface) with VU byte ordering, U/V width = 1/2 Y width, U/V height = 1/2 Y height.\n    pub const CU_EGL_COLOR_FORMAT_YUV420_SEMIPLANAR_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        38,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Y, V, U in three surfaces, U/V width = Y width, U/V height = Y height.\n    pub const CU_EGL_COLOR_FORMAT_YVU444_PLANAR_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        39,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Y, V, U in three surfaces, U/V width = 1/2 Y width, U/V height = Y height.\n    pub const CU_EGL_COLOR_FORMAT_YVU422_PLANAR_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        40,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Y, V, U in three surfaces, U/V width = 1/2 Y width, U/V height = 1/2 Y height.\n    pub const CU_EGL_COLOR_FORMAT_YVU420_PLANAR_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        41,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Y, VU in two surfaces (VU as one surface) with UV byte ordering, U/V width = Y width, U/V height = Y height.\n    pub const CU_EGL_COLOR_FORMAT_YVU444_SEMIPLANAR_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        42,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Y, VU in two surfaces (VU as one surface) with UV byte ordering, U/V width = 1/2 Y width, U/V height = Y height.\n    pub const CU_EGL_COLOR_FORMAT_YVU422_SEMIPLANAR_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        43,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Y, VU in two surfaces (VU as one surface) with UV byte ordering, U/V width = 1/2 Y width, U/V height = 1/2 Y height.\n    pub const CU_EGL_COLOR_FORMAT_YVU420_SEMIPLANAR_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        44,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer format - one channel in one surface with interleaved RGGB ordering.\n    pub const CU_EGL_COLOR_FORMAT_BAYER_RGGB: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        45,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer format - one channel in one surface with interleaved BGGR ordering.\n    pub const CU_EGL_COLOR_FORMAT_BAYER_BGGR: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        46,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer format - one channel in one surface with interleaved GRBG ordering.\n    pub const CU_EGL_COLOR_FORMAT_BAYER_GRBG: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        47,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer format - one channel in one surface with interleaved GBRG ordering.\n    pub const CU_EGL_COLOR_FORMAT_BAYER_GBRG: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        48,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer10 format - one channel in one surface with interleaved RGGB ordering. Out of 16 bits, 10 bits used 6 bits No-op.\n    pub const CU_EGL_COLOR_FORMAT_BAYER10_RGGB: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        49,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer10 format - one channel in one surface with interleaved BGGR ordering. Out of 16 bits, 10 bits used 6 bits No-op.\n    pub const CU_EGL_COLOR_FORMAT_BAYER10_BGGR: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        50,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer10 format - one channel in one surface with interleaved GRBG ordering. Out of 16 bits, 10 bits used 6 bits No-op.\n    pub const CU_EGL_COLOR_FORMAT_BAYER10_GRBG: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        51,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer10 format - one channel in one surface with interleaved GBRG ordering. Out of 16 bits, 10 bits used 6 bits No-op.\n    pub const CU_EGL_COLOR_FORMAT_BAYER10_GBRG: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        52,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer12 format - one channel in one surface with interleaved RGGB ordering. Out of 16 bits, 12 bits used 4 bits No-op.\n    pub const CU_EGL_COLOR_FORMAT_BAYER12_RGGB: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        53,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer12 format - one channel in one surface with interleaved BGGR ordering. Out of 16 bits, 12 bits used 4 bits No-op.\n    pub const CU_EGL_COLOR_FORMAT_BAYER12_BGGR: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        54,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer12 format - one channel in one surface with interleaved GRBG ordering. Out of 16 bits, 12 bits used 4 bits No-op.\n    pub const CU_EGL_COLOR_FORMAT_BAYER12_GRBG: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        55,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer12 format - one channel in one surface with interleaved GBRG ordering. Out of 16 bits, 12 bits used 4 bits No-op.\n    pub const CU_EGL_COLOR_FORMAT_BAYER12_GBRG: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        56,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer14 format - one channel in one surface with interleaved RGGB ordering. Out of 16 bits, 14 bits used 2 bits No-op.\n    pub const CU_EGL_COLOR_FORMAT_BAYER14_RGGB: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        57,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer14 format - one channel in one surface with interleaved BGGR ordering. Out of 16 bits, 14 bits used 2 bits No-op.\n    pub const CU_EGL_COLOR_FORMAT_BAYER14_BGGR: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        58,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer14 format - one channel in one surface with interleaved GRBG ordering. Out of 16 bits, 14 bits used 2 bits No-op.\n    pub const CU_EGL_COLOR_FORMAT_BAYER14_GRBG: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        59,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer14 format - one channel in one surface with interleaved GBRG ordering. Out of 16 bits, 14 bits used 2 bits No-op.\n    pub const CU_EGL_COLOR_FORMAT_BAYER14_GBRG: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        60,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer20 format - one channel in one surface with interleaved RGGB ordering. Out of 32 bits, 20 bits used 12 bits No-op.\n    pub const CU_EGL_COLOR_FORMAT_BAYER20_RGGB: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        61,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer20 format - one channel in one surface with interleaved BGGR ordering. Out of 32 bits, 20 bits used 12 bits No-op.\n    pub const CU_EGL_COLOR_FORMAT_BAYER20_BGGR: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        62,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer20 format - one channel in one surface with interleaved GRBG ordering. Out of 32 bits, 20 bits used 12 bits No-op.\n    pub const CU_EGL_COLOR_FORMAT_BAYER20_GRBG: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        63,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer20 format - one channel in one surface with interleaved GBRG ordering. Out of 32 bits, 20 bits used 12 bits No-op.\n    pub const CU_EGL_COLOR_FORMAT_BAYER20_GBRG: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        64,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y, V, U in three surfaces, each in a separate surface, U/V width = Y width, U/V height = Y height.\n    pub const CU_EGL_COLOR_FORMAT_YVU444_PLANAR: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        65,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y, V, U in three surfaces, each in a separate surface, U/V width = 1/2 Y width, U/V height = Y height.\n    pub const CU_EGL_COLOR_FORMAT_YVU422_PLANAR: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        66,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y, V, U in three surfaces, each in a separate surface, U/V width = 1/2 Y width, U/V height = 1/2 Y height.\n    pub const CU_EGL_COLOR_FORMAT_YVU420_PLANAR: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        67,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Nvidia proprietary Bayer ISP format - one channel in one surface with interleaved RGGB ordering and mapped to opaque integer datatype.\n    pub const CU_EGL_COLOR_FORMAT_BAYER_ISP_RGGB: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        68,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Nvidia proprietary Bayer ISP format - one channel in one surface with interleaved BGGR ordering and mapped to opaque integer datatype.\n    pub const CU_EGL_COLOR_FORMAT_BAYER_ISP_BGGR: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        69,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Nvidia proprietary Bayer ISP format - one channel in one surface with interleaved GRBG ordering and mapped to opaque integer datatype.\n    pub const CU_EGL_COLOR_FORMAT_BAYER_ISP_GRBG: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        70,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Nvidia proprietary Bayer ISP format - one channel in one surface with interleaved GBRG ordering and mapped to opaque integer datatype.\n    pub const CU_EGL_COLOR_FORMAT_BAYER_ISP_GBRG: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        71,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer format - one channel in one surface with interleaved BCCR ordering.\n    pub const CU_EGL_COLOR_FORMAT_BAYER_BCCR: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        72,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer format - one channel in one surface with interleaved RCCB ordering.\n    pub const CU_EGL_COLOR_FORMAT_BAYER_RCCB: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        73,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer format - one channel in one surface with interleaved CRBC ordering.\n    pub const CU_EGL_COLOR_FORMAT_BAYER_CRBC: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        74,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer format - one channel in one surface with interleaved CBRC ordering.\n    pub const CU_EGL_COLOR_FORMAT_BAYER_CBRC: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        75,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer10 format - one channel in one surface with interleaved CCCC ordering. Out of 16 bits, 10 bits used 6 bits No-op.\n    pub const CU_EGL_COLOR_FORMAT_BAYER10_CCCC: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        76,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer12 format - one channel in one surface with interleaved BCCR ordering. Out of 16 bits, 12 bits used 4 bits No-op.\n    pub const CU_EGL_COLOR_FORMAT_BAYER12_BCCR: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        77,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer12 format - one channel in one surface with interleaved RCCB ordering. Out of 16 bits, 12 bits used 4 bits No-op.\n    pub const CU_EGL_COLOR_FORMAT_BAYER12_RCCB: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        78,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer12 format - one channel in one surface with interleaved CRBC ordering. Out of 16 bits, 12 bits used 4 bits No-op.\n    pub const CU_EGL_COLOR_FORMAT_BAYER12_CRBC: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        79,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer12 format - one channel in one surface with interleaved CBRC ordering. Out of 16 bits, 12 bits used 4 bits No-op.\n    pub const CU_EGL_COLOR_FORMAT_BAYER12_CBRC: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        80,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Bayer12 format - one channel in one surface with interleaved CCCC ordering. Out of 16 bits, 12 bits used 4 bits No-op.\n    pub const CU_EGL_COLOR_FORMAT_BAYER12_CCCC: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        81,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Color format for single Y plane.\n    pub const CU_EGL_COLOR_FORMAT_Y: CUeglColorFormat_enum = CUeglColorFormat_enum(82);\n}\nimpl CUeglColorFormat_enum {\n    ///< Y, UV in two surfaces (UV as one surface) U/V width = 1/2 Y width, U/V height = 1/2 Y height.\n    pub const CU_EGL_COLOR_FORMAT_YUV420_SEMIPLANAR_2020: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        83,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y, VU in two surfaces (VU as one surface) U/V width = 1/2 Y width, U/V height = 1/2 Y height.\n    pub const CU_EGL_COLOR_FORMAT_YVU420_SEMIPLANAR_2020: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        84,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y, U, V  each in a separate  surface, U/V width = 1/2 Y width, U/V height= 1/2 Y height.\n    pub const CU_EGL_COLOR_FORMAT_YUV420_PLANAR_2020: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        85,\n    );\n}\nimpl CUeglColorFormat_enum {\n    /**< Y, V, U each in a separate surface, U/V width = 1/2 Y width, U/V height\n= 1/2 Y height.*/\n    pub const CU_EGL_COLOR_FORMAT_YVU420_PLANAR_2020: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        86,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y, UV in two surfaces (UV as one surface) U/V width = 1/2 Y width, U/V height = 1/2 Y height.\n    pub const CU_EGL_COLOR_FORMAT_YUV420_SEMIPLANAR_709: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        87,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y, VU in two surfaces (VU as one surface) U/V width = 1/2 Y width, U/V height = 1/2 Y height.\n    pub const CU_EGL_COLOR_FORMAT_YVU420_SEMIPLANAR_709: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        88,\n    );\n}\nimpl CUeglColorFormat_enum {\n    /**< Y, U, V  each in a separate  surface, U/V width = 1/2 Y width, U/V height\n= 1/2 Y height.*/\n    pub const CU_EGL_COLOR_FORMAT_YUV420_PLANAR_709: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        89,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y, V, U each in a separate surface, U/V width = 1/2 Y width, U/V height = 1/2 Y height.\n    pub const CU_EGL_COLOR_FORMAT_YVU420_PLANAR_709: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        90,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y10, V10U10 in two surfaces (VU as one surface), U/V width = 1/2 Y width, U/V height = 1/2 Y height.\n    pub const CU_EGL_COLOR_FORMAT_Y10V10U10_420_SEMIPLANAR_709: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        91,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y10, V10U10 in two surfaces (VU as one surface), U/V width = 1/2 Y width, U/V height = 1/2 Y height.\n    pub const CU_EGL_COLOR_FORMAT_Y10V10U10_420_SEMIPLANAR_2020: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        92,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y10, V10U10 in two surfaces(VU as one surface) U/V width = 1/2 Y width, U/V height  = Y height.\n    pub const CU_EGL_COLOR_FORMAT_Y10V10U10_422_SEMIPLANAR_2020: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        93,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y10, V10U10 in two surfaces(VU as one surface) U/V width = 1/2 Y width, U/V height  = Y height.\n    pub const CU_EGL_COLOR_FORMAT_Y10V10U10_422_SEMIPLANAR: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        94,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y10, V10U10 in two surfaces(VU as one surface) U/V width = 1/2 Y width, U/V height  = Y height.\n    pub const CU_EGL_COLOR_FORMAT_Y10V10U10_422_SEMIPLANAR_709: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        95,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Color format for single Y plane.\n    pub const CU_EGL_COLOR_FORMAT_Y_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        96,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Color format for single Y plane.\n    pub const CU_EGL_COLOR_FORMAT_Y_709_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        97,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Color format for single Y10 plane.\n    pub const CU_EGL_COLOR_FORMAT_Y10_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        98,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Color format for single Y10 plane.\n    pub const CU_EGL_COLOR_FORMAT_Y10_709_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        99,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Color format for single Y12 plane.\n    pub const CU_EGL_COLOR_FORMAT_Y12_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        100,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Color format for single Y12 plane.\n    pub const CU_EGL_COLOR_FORMAT_Y12_709_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        101,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y, U, V, A four channels in one surface, interleaved as AVUY.\n    pub const CU_EGL_COLOR_FORMAT_YUVA: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        102,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y, U, V three channels in one surface, interleaved as VUY. Only pitch linear format supported.\n    pub const CU_EGL_COLOR_FORMAT_YUV: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        103,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y, U, V in one surface, interleaved as YVYU in one channel.\n    pub const CU_EGL_COLOR_FORMAT_YVYU: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        104,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y, U, V in one surface, interleaved as VYUY in one channel.\n    pub const CU_EGL_COLOR_FORMAT_VYUY: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        105,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Y10, V10U10 in two surfaces(VU as one surface) U/V width = 1/2 Y width, U/V height = 1/2 Y height.\n    pub const CU_EGL_COLOR_FORMAT_Y10V10U10_420_SEMIPLANAR_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        106,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Y10, V10U10 in two surfaces(VU as one surface) U/V width = 1/2 Y width, U/V height = 1/2 Y height.\n    pub const CU_EGL_COLOR_FORMAT_Y10V10U10_420_SEMIPLANAR_709_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        107,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Y10, V10U10 in two surfaces (VU as one surface) U/V width = Y width, U/V height = Y height.\n    pub const CU_EGL_COLOR_FORMAT_Y10V10U10_444_SEMIPLANAR_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        108,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Y10, V10U10 in two surfaces (VU as one surface)  U/V width = Y width, U/V height = Y height.\n    pub const CU_EGL_COLOR_FORMAT_Y10V10U10_444_SEMIPLANAR_709_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        109,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Y12, V12U12 in two surfaces (VU as one surface) U/V width = 1/2 Y width, U/V height = 1/2 Y height.\n    pub const CU_EGL_COLOR_FORMAT_Y12V12U12_420_SEMIPLANAR_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        110,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Y12, V12U12 in two surfaces (VU as one surface) U/V width = 1/2 Y width, U/V height = 1/2 Y height.\n    pub const CU_EGL_COLOR_FORMAT_Y12V12U12_420_SEMIPLANAR_709_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        111,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Y12, V12U12 in two surfaces (VU as one surface) U/V width = Y width, U/V height = Y height.\n    pub const CU_EGL_COLOR_FORMAT_Y12V12U12_444_SEMIPLANAR_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        112,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Y12, V12U12 in two surfaces (VU as one surface) U/V width = Y width, U/V height = Y height.\n    pub const CU_EGL_COLOR_FORMAT_Y12V12U12_444_SEMIPLANAR_709_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        113,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y, U, V in one surface, interleaved as UYVY in one channel.\n    pub const CU_EGL_COLOR_FORMAT_UYVY_709: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        114,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Extended Range Y, U, V in one surface, interleaved as UYVY in one channel.\n    pub const CU_EGL_COLOR_FORMAT_UYVY_709_ER: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        115,\n    );\n}\nimpl CUeglColorFormat_enum {\n    ///< Y, U, V in one surface, interleaved as UYVY in one channel.\n    pub const CU_EGL_COLOR_FORMAT_UYVY_2020: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        116,\n    );\n}\nimpl CUeglColorFormat_enum {\n    pub const CU_EGL_COLOR_FORMAT_MAX: CUeglColorFormat_enum = CUeglColorFormat_enum(\n        117,\n    );\n}\n#[repr(transparent)]\n/** CUDA EGL Color Format - The different planar and multiplanar formats currently supported for CUDA_EGL interops.\n Three channel formats are currently not supported for ::CU_EGL_FRAME_TYPE_ARRAY*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct CUeglColorFormat_enum(pub ::core::ffi::c_uint);\n/** CUDA EGL Color Format - The different planar and multiplanar formats currently supported for CUDA_EGL interops.\n Three channel formats are currently not supported for ::CU_EGL_FRAME_TYPE_ARRAY*/\npub use self::CUeglColorFormat_enum as CUeglColorFormat;\n/** CUDA EGLFrame structure Descriptor - structure defining one frame of EGL.\n\n Each frame may contain one or more planes depending on whether the surface  * is Multiplanar or not.*/\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct CUeglFrame_st {\n    pub frame: CUeglFrame_st__bindgen_ty_1,\n    ///< Width of first plane\n    pub width: ::core::ffi::c_uint,\n    ///< Height of first plane\n    pub height: ::core::ffi::c_uint,\n    ///< Depth of first plane\n    pub depth: ::core::ffi::c_uint,\n    ///< Pitch of first plane\n    pub pitch: ::core::ffi::c_uint,\n    ///< Number of planes\n    pub planeCount: ::core::ffi::c_uint,\n    ///< Number of channels for the plane\n    pub numChannels: ::core::ffi::c_uint,\n    ///< Array or Pitch\n    pub frameType: CUeglFrameType,\n    ///< CUDA EGL Color Format\n    pub eglColorFormat: CUeglColorFormat,\n    ///< CUDA Array Format\n    pub cuFormat: CUarray_format,\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union CUeglFrame_st__bindgen_ty_1 {\n    ///< Array of CUarray corresponding to each plane\n    pub pArray: [CUarray; 3usize],\n    ///< Array of Pointers corresponding to each plane\n    pub pPitch: [*mut ::core::ffi::c_void; 3usize],\n}\n/** CUDA EGLFrame structure Descriptor - structure defining one frame of EGL.\n\n Each frame may contain one or more planes depending on whether the surface  * is Multiplanar or not.*/\npub type CUeglFrame_v1 = CUeglFrame_st;\n/** CUDA EGLFrame structure Descriptor - structure defining one frame of EGL.\n\n Each frame may contain one or more planes depending on whether the surface  * is Multiplanar or not.*/\npub type CUeglFrame = CUeglFrame_v1;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct CUeglStreamConnection_st {\n    _unused: [u8; 0],\n}\n/// CUDA EGLSream Connection\npub type CUeglStreamConnection = *mut CUeglStreamConnection_st;\nimpl VdpStatus {\n    pub const VDP_STATUS_OK: VdpStatus = VdpStatus(0);\n}\nimpl VdpStatus {\n    pub const VDP_STATUS_NO_IMPLEMENTATION: VdpStatus = VdpStatus(1);\n}\nimpl VdpStatus {\n    pub const VDP_STATUS_DISPLAY_PREEMPTED: VdpStatus = VdpStatus(2);\n}\nimpl VdpStatus {\n    pub const VDP_STATUS_INVALID_HANDLE: VdpStatus = VdpStatus(3);\n}\nimpl VdpStatus {\n    pub const VDP_STATUS_INVALID_POINTER: VdpStatus = VdpStatus(4);\n}\nimpl VdpStatus {\n    pub const VDP_STATUS_INVALID_CHROMA_TYPE: VdpStatus = VdpStatus(5);\n}\nimpl VdpStatus {\n    pub const VDP_STATUS_INVALID_Y_CB_CR_FORMAT: VdpStatus = VdpStatus(6);\n}\nimpl VdpStatus {\n    pub const VDP_STATUS_INVALID_RGBA_FORMAT: VdpStatus = VdpStatus(7);\n}\nimpl VdpStatus {\n    pub const VDP_STATUS_INVALID_INDEXED_FORMAT: VdpStatus = VdpStatus(8);\n}\nimpl VdpStatus {\n    pub const VDP_STATUS_INVALID_COLOR_STANDARD: VdpStatus = VdpStatus(9);\n}\nimpl VdpStatus {\n    pub const VDP_STATUS_INVALID_COLOR_TABLE_FORMAT: VdpStatus = VdpStatus(10);\n}\nimpl VdpStatus {\n    pub const VDP_STATUS_INVALID_BLEND_FACTOR: VdpStatus = VdpStatus(11);\n}\nimpl VdpStatus {\n    pub const VDP_STATUS_INVALID_BLEND_EQUATION: VdpStatus = VdpStatus(12);\n}\nimpl VdpStatus {\n    pub const VDP_STATUS_INVALID_FLAG: VdpStatus = VdpStatus(13);\n}\nimpl VdpStatus {\n    pub const VDP_STATUS_INVALID_DECODER_PROFILE: VdpStatus = VdpStatus(14);\n}\nimpl VdpStatus {\n    pub const VDP_STATUS_INVALID_VIDEO_MIXER_FEATURE: VdpStatus = VdpStatus(15);\n}\nimpl VdpStatus {\n    pub const VDP_STATUS_INVALID_VIDEO_MIXER_PARAMETER: VdpStatus = VdpStatus(16);\n}\nimpl VdpStatus {\n    pub const VDP_STATUS_INVALID_VIDEO_MIXER_ATTRIBUTE: VdpStatus = VdpStatus(17);\n}\nimpl VdpStatus {\n    pub const VDP_STATUS_INVALID_VIDEO_MIXER_PICTURE_STRUCTURE: VdpStatus = VdpStatus(\n        18,\n    );\n}\nimpl VdpStatus {\n    pub const VDP_STATUS_INVALID_FUNC_ID: VdpStatus = VdpStatus(19);\n}\nimpl VdpStatus {\n    pub const VDP_STATUS_INVALID_SIZE: VdpStatus = VdpStatus(20);\n}\nimpl VdpStatus {\n    pub const VDP_STATUS_INVALID_VALUE: VdpStatus = VdpStatus(21);\n}\nimpl VdpStatus {\n    pub const VDP_STATUS_INVALID_STRUCT_VERSION: VdpStatus = VdpStatus(22);\n}\nimpl VdpStatus {\n    pub const VDP_STATUS_RESOURCES: VdpStatus = VdpStatus(23);\n}\nimpl VdpStatus {\n    pub const VDP_STATUS_HANDLE_DEVICE_MISMATCH: VdpStatus = VdpStatus(24);\n}\nimpl VdpStatus {\n    pub const VDP_STATUS_ERROR: VdpStatus = VdpStatus(25);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct VdpStatus(pub ::core::ffi::c_uint);\npub type VdpDevice = u32;\npub type VdpVideoSurface = u32;\npub type VdpOutputSurface = u32;\npub type VdpFuncId = u32;\npub type VdpGetProcAddress = ::core::option::Option<\n    unsafe extern \"system\" fn(\n        device: VdpDevice,\n        function_id: VdpFuncId,\n        function_pointer: *mut *mut ::core::ffi::c_void,\n    ) -> VdpStatus,\n>;\nimpl cudaDataType_t {\n    pub const CUDA_R_16F: cudaDataType_t = cudaDataType_t(2);\n}\nimpl cudaDataType_t {\n    pub const CUDA_C_16F: cudaDataType_t = cudaDataType_t(6);\n}\nimpl cudaDataType_t {\n    pub const CUDA_R_16BF: cudaDataType_t = cudaDataType_t(14);\n}\nimpl cudaDataType_t {\n    pub const CUDA_C_16BF: cudaDataType_t = cudaDataType_t(15);\n}\nimpl cudaDataType_t {\n    pub const CUDA_R_32F: cudaDataType_t = cudaDataType_t(0);\n}\nimpl cudaDataType_t {\n    pub const CUDA_C_32F: cudaDataType_t = cudaDataType_t(4);\n}\nimpl cudaDataType_t {\n    pub const CUDA_R_64F: cudaDataType_t = cudaDataType_t(1);\n}\nimpl cudaDataType_t {\n    pub const CUDA_C_64F: cudaDataType_t = cudaDataType_t(5);\n}\nimpl cudaDataType_t {\n    pub const CUDA_R_4I: cudaDataType_t = cudaDataType_t(16);\n}\nimpl cudaDataType_t {\n    pub const CUDA_C_4I: cudaDataType_t = cudaDataType_t(17);\n}\nimpl cudaDataType_t {\n    pub const CUDA_R_4U: cudaDataType_t = cudaDataType_t(18);\n}\nimpl cudaDataType_t {\n    pub const CUDA_C_4U: cudaDataType_t = cudaDataType_t(19);\n}\nimpl cudaDataType_t {\n    pub const CUDA_R_8I: cudaDataType_t = cudaDataType_t(3);\n}\nimpl cudaDataType_t {\n    pub const CUDA_C_8I: cudaDataType_t = cudaDataType_t(7);\n}\nimpl cudaDataType_t {\n    pub const CUDA_R_8U: cudaDataType_t = cudaDataType_t(8);\n}\nimpl cudaDataType_t {\n    pub const CUDA_C_8U: cudaDataType_t = cudaDataType_t(9);\n}\nimpl cudaDataType_t {\n    pub const CUDA_R_16I: cudaDataType_t = cudaDataType_t(20);\n}\nimpl cudaDataType_t {\n    pub const CUDA_C_16I: cudaDataType_t = cudaDataType_t(21);\n}\nimpl cudaDataType_t {\n    pub const CUDA_R_16U: cudaDataType_t = cudaDataType_t(22);\n}\nimpl cudaDataType_t {\n    pub const CUDA_C_16U: cudaDataType_t = cudaDataType_t(23);\n}\nimpl cudaDataType_t {\n    pub const CUDA_R_32I: cudaDataType_t = cudaDataType_t(10);\n}\nimpl cudaDataType_t {\n    pub const CUDA_C_32I: cudaDataType_t = cudaDataType_t(11);\n}\nimpl cudaDataType_t {\n    pub const CUDA_R_32U: cudaDataType_t = cudaDataType_t(12);\n}\nimpl cudaDataType_t {\n    pub const CUDA_C_32U: cudaDataType_t = cudaDataType_t(13);\n}\nimpl cudaDataType_t {\n    pub const CUDA_R_64I: cudaDataType_t = cudaDataType_t(24);\n}\nimpl cudaDataType_t {\n    pub const CUDA_C_64I: cudaDataType_t = cudaDataType_t(25);\n}\nimpl cudaDataType_t {\n    pub const CUDA_R_64U: cudaDataType_t = cudaDataType_t(26);\n}\nimpl cudaDataType_t {\n    pub const CUDA_C_64U: cudaDataType_t = cudaDataType_t(27);\n}\nimpl cudaDataType_t {\n    pub const CUDA_R_8F_E4M3: cudaDataType_t = cudaDataType_t(28);\n}\nimpl cudaDataType_t {\n    pub const CUDA_R_8F_UE4M3: cudaDataType_t = cudaDataType_t(28);\n}\nimpl cudaDataType_t {\n    pub const CUDA_R_8F_E5M2: cudaDataType_t = cudaDataType_t(29);\n}\nimpl cudaDataType_t {\n    pub const CUDA_R_8F_UE8M0: cudaDataType_t = cudaDataType_t(30);\n}\nimpl cudaDataType_t {\n    pub const CUDA_R_6F_E2M3: cudaDataType_t = cudaDataType_t(31);\n}\nimpl cudaDataType_t {\n    pub const CUDA_R_6F_E3M2: cudaDataType_t = cudaDataType_t(32);\n}\nimpl cudaDataType_t {\n    pub const CUDA_R_4F_E2M1: cudaDataType_t = cudaDataType_t(33);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudaDataType_t(pub ::core::ffi::c_uint);\npub use self::cudaDataType_t as cudaDataType;\nimpl cudaEmulationStrategy_t {\n    /** The default emulation strategy.  For emulated computations, this is\n  equivalent to CUDA_EMULATION_STRATEGY_PERFORMANT, unless a library\n  dependent environment variable is set*/\n    pub const CUDA_EMULATION_STRATEGY_DEFAULT: cudaEmulationStrategy_t = cudaEmulationStrategy_t(\n        0,\n    );\n}\nimpl cudaEmulationStrategy_t {\n    /** An emulation strategy which configures libraries to use emulation\n  when it provides a performance benefit*/\n    pub const CUDA_EMULATION_STRATEGY_PERFORMANT: cudaEmulationStrategy_t = cudaEmulationStrategy_t(\n        1,\n    );\n}\nimpl cudaEmulationStrategy_t {\n    /** An emulation strategy which configures libraries to use emulation\n  whenever possible*/\n    pub const CUDA_EMULATION_STRATEGY_EAGER: cudaEmulationStrategy_t = cudaEmulationStrategy_t(\n        2,\n    );\n}\n#[repr(transparent)]\n/// Enum for specifying how to leverage floating-point emulation algorithms\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudaEmulationStrategy_t(pub ::core::ffi::c_uint);\n/// Enum for specifying how to leverage floating-point emulation algorithms\npub use self::cudaEmulationStrategy_t as cudaEmulationStrategy;\nimpl libraryPropertyType_t {\n    pub const MAJOR_VERSION: libraryPropertyType_t = libraryPropertyType_t(0);\n}\nimpl libraryPropertyType_t {\n    pub const MINOR_VERSION: libraryPropertyType_t = libraryPropertyType_t(1);\n}\nimpl libraryPropertyType_t {\n    pub const PATCH_LEVEL: libraryPropertyType_t = libraryPropertyType_t(2);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct libraryPropertyType_t(pub ::core::ffi::c_uint);\npub use self::libraryPropertyType_t as libraryPropertyType;\n#[repr(C)]\n#[repr(align(8))]\n#[derive(Debug, Copy, Clone, PartialEq)]\npub struct float2 {\n    pub x: f32,\n    pub y: f32,\n}\n#[repr(C)]\n#[repr(align(16))]\n#[derive(Debug, Copy, Clone, PartialEq)]\npub struct double2 {\n    pub x: f64,\n    pub y: f64,\n}\npub type cuFloatComplex = float2;\npub type cuDoubleComplex = double2;\npub type cuComplex = cuFloatComplex;\nimpl CUerror {\n    pub const r#INVALID_VALUE: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(1)\n    });\n    pub const r#OUT_OF_MEMORY: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(2)\n    });\n    pub const r#NOT_INITIALIZED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3)\n    });\n    pub const r#DEINITIALIZED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(4)\n    });\n    pub const r#PROFILER_DISABLED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(5)\n    });\n    pub const r#PROFILER_NOT_INITIALIZED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(6)\n    });\n    pub const r#PROFILER_ALREADY_STARTED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(7)\n    });\n    pub const r#PROFILER_ALREADY_STOPPED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(8)\n    });\n    pub const r#STUB_LIBRARY: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(34)\n    });\n    pub const r#CALL_REQUIRES_NEWER_DRIVER: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(36)\n    });\n    pub const r#DEVICE_UNAVAILABLE: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(46)\n    });\n    pub const r#NO_DEVICE: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(100)\n    });\n    pub const r#INVALID_DEVICE: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(101)\n    });\n    pub const r#DEVICE_NOT_LICENSED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(102)\n    });\n    pub const r#INVALID_IMAGE: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(200)\n    });\n    pub const r#INVALID_CONTEXT: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(201)\n    });\n    pub const r#CONTEXT_ALREADY_CURRENT: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(202)\n    });\n    pub const r#MAP_FAILED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(205)\n    });\n    pub const r#UNMAP_FAILED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(206)\n    });\n    pub const r#ARRAY_IS_MAPPED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(207)\n    });\n    pub const r#ALREADY_MAPPED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(208)\n    });\n    pub const r#NO_BINARY_FOR_GPU: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(209)\n    });\n    pub const r#ALREADY_ACQUIRED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(210)\n    });\n    pub const r#NOT_MAPPED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(211)\n    });\n    pub const r#NOT_MAPPED_AS_ARRAY: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(212)\n    });\n    pub const r#NOT_MAPPED_AS_POINTER: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(213)\n    });\n    pub const r#ECC_UNCORRECTABLE: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(214)\n    });\n    pub const r#UNSUPPORTED_LIMIT: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(215)\n    });\n    pub const r#CONTEXT_ALREADY_IN_USE: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(216)\n    });\n    pub const r#PEER_ACCESS_UNSUPPORTED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(217)\n    });\n    pub const r#INVALID_PTX: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(218)\n    });\n    pub const r#INVALID_GRAPHICS_CONTEXT: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(219)\n    });\n    pub const r#NVLINK_UNCORRECTABLE: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(220)\n    });\n    pub const r#JIT_COMPILER_NOT_FOUND: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(221)\n    });\n    pub const r#UNSUPPORTED_PTX_VERSION: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(222)\n    });\n    pub const r#JIT_COMPILATION_DISABLED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(223)\n    });\n    pub const r#UNSUPPORTED_EXEC_AFFINITY: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(224)\n    });\n    pub const r#UNSUPPORTED_DEVSIDE_SYNC: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(225)\n    });\n    pub const r#CONTAINED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(226)\n    });\n    pub const r#INVALID_SOURCE: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(300)\n    });\n    pub const r#FILE_NOT_FOUND: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(301)\n    });\n    pub const r#SHARED_OBJECT_SYMBOL_NOT_FOUND: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(302)\n    });\n    pub const r#SHARED_OBJECT_INIT_FAILED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(303)\n    });\n    pub const r#OPERATING_SYSTEM: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(304)\n    });\n    pub const r#INVALID_HANDLE: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(400)\n    });\n    pub const r#ILLEGAL_STATE: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(401)\n    });\n    pub const r#LOSSY_QUERY: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(402)\n    });\n    pub const r#NOT_FOUND: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(500)\n    });\n    pub const r#NOT_READY: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(600)\n    });\n    pub const r#ILLEGAL_ADDRESS: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(700)\n    });\n    pub const r#LAUNCH_OUT_OF_RESOURCES: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(701)\n    });\n    pub const r#LAUNCH_TIMEOUT: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(702)\n    });\n    pub const r#LAUNCH_INCOMPATIBLE_TEXTURING: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(703)\n    });\n    pub const r#PEER_ACCESS_ALREADY_ENABLED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(704)\n    });\n    pub const r#PEER_ACCESS_NOT_ENABLED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(705)\n    });\n    pub const r#PRIMARY_CONTEXT_ACTIVE: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(708)\n    });\n    pub const r#CONTEXT_IS_DESTROYED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(709)\n    });\n    pub const r#ASSERT: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(710)\n    });\n    pub const r#TOO_MANY_PEERS: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(711)\n    });\n    pub const r#HOST_MEMORY_ALREADY_REGISTERED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(712)\n    });\n    pub const r#HOST_MEMORY_NOT_REGISTERED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(713)\n    });\n    pub const r#HARDWARE_STACK_ERROR: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(714)\n    });\n    pub const r#ILLEGAL_INSTRUCTION: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(715)\n    });\n    pub const r#MISALIGNED_ADDRESS: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(716)\n    });\n    pub const r#INVALID_ADDRESS_SPACE: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(717)\n    });\n    pub const r#INVALID_PC: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(718)\n    });\n    pub const r#LAUNCH_FAILED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(719)\n    });\n    pub const r#COOPERATIVE_LAUNCH_TOO_LARGE: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(720)\n    });\n    pub const r#TENSOR_MEMORY_LEAK: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(721)\n    });\n    pub const r#NOT_PERMITTED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(800)\n    });\n    pub const r#NOT_SUPPORTED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(801)\n    });\n    pub const r#SYSTEM_NOT_READY: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(802)\n    });\n    pub const r#SYSTEM_DRIVER_MISMATCH: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(803)\n    });\n    pub const r#COMPAT_NOT_SUPPORTED_ON_DEVICE: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(804)\n    });\n    pub const r#MPS_CONNECTION_FAILED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(805)\n    });\n    pub const r#MPS_RPC_FAILURE: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(806)\n    });\n    pub const r#MPS_SERVER_NOT_READY: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(807)\n    });\n    pub const r#MPS_MAX_CLIENTS_REACHED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(808)\n    });\n    pub const r#MPS_MAX_CONNECTIONS_REACHED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(809)\n    });\n    pub const r#MPS_CLIENT_TERMINATED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(810)\n    });\n    pub const r#CDP_NOT_SUPPORTED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(811)\n    });\n    pub const r#CDP_VERSION_MISMATCH: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(812)\n    });\n    pub const r#STREAM_CAPTURE_UNSUPPORTED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(900)\n    });\n    pub const r#STREAM_CAPTURE_INVALIDATED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(901)\n    });\n    pub const r#STREAM_CAPTURE_MERGE: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(902)\n    });\n    pub const r#STREAM_CAPTURE_UNMATCHED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(903)\n    });\n    pub const r#STREAM_CAPTURE_UNJOINED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(904)\n    });\n    pub const r#STREAM_CAPTURE_ISOLATION: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(905)\n    });\n    pub const r#STREAM_CAPTURE_IMPLICIT: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(906)\n    });\n    pub const r#CAPTURED_EVENT: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(907)\n    });\n    pub const r#STREAM_CAPTURE_WRONG_THREAD: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(908)\n    });\n    pub const r#TIMEOUT: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(909)\n    });\n    pub const r#GRAPH_EXEC_UPDATE_FAILURE: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(910)\n    });\n    pub const r#EXTERNAL_DEVICE: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(911)\n    });\n    pub const r#INVALID_CLUSTER_SIZE: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(912)\n    });\n    pub const r#FUNCTION_NOT_LOADED: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(913)\n    });\n    pub const r#INVALID_RESOURCE_TYPE: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(914)\n    });\n    pub const r#INVALID_RESOURCE_CONFIGURATION: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(915)\n    });\n    pub const r#KEY_ROTATION: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(916)\n    });\n    pub const r#UNKNOWN: CUerror = CUerror(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(999)\n    });\n}\n#[repr(transparent)]\n#[derive(Debug, Hash, Copy, Clone, PartialEq, Eq)]\npub struct CUerror(pub ::core::num::NonZeroU32);\npub trait CUresultConsts {\n    const SUCCESS: CUresult = CUresult::Ok(());\n    const ERROR_INVALID_VALUE: CUresult = CUresult::Err(CUerror::r#INVALID_VALUE);\n    const ERROR_OUT_OF_MEMORY: CUresult = CUresult::Err(CUerror::r#OUT_OF_MEMORY);\n    const ERROR_NOT_INITIALIZED: CUresult = CUresult::Err(CUerror::r#NOT_INITIALIZED);\n    const ERROR_DEINITIALIZED: CUresult = CUresult::Err(CUerror::r#DEINITIALIZED);\n    const ERROR_PROFILER_DISABLED: CUresult = CUresult::Err(\n        CUerror::r#PROFILER_DISABLED,\n    );\n    const ERROR_PROFILER_NOT_INITIALIZED: CUresult = CUresult::Err(\n        CUerror::r#PROFILER_NOT_INITIALIZED,\n    );\n    const ERROR_PROFILER_ALREADY_STARTED: CUresult = CUresult::Err(\n        CUerror::r#PROFILER_ALREADY_STARTED,\n    );\n    const ERROR_PROFILER_ALREADY_STOPPED: CUresult = CUresult::Err(\n        CUerror::r#PROFILER_ALREADY_STOPPED,\n    );\n    const ERROR_STUB_LIBRARY: CUresult = CUresult::Err(CUerror::r#STUB_LIBRARY);\n    const ERROR_CALL_REQUIRES_NEWER_DRIVER: CUresult = CUresult::Err(\n        CUerror::r#CALL_REQUIRES_NEWER_DRIVER,\n    );\n    const ERROR_DEVICE_UNAVAILABLE: CUresult = CUresult::Err(\n        CUerror::r#DEVICE_UNAVAILABLE,\n    );\n    const ERROR_NO_DEVICE: CUresult = CUresult::Err(CUerror::r#NO_DEVICE);\n    const ERROR_INVALID_DEVICE: CUresult = CUresult::Err(CUerror::r#INVALID_DEVICE);\n    const ERROR_DEVICE_NOT_LICENSED: CUresult = CUresult::Err(\n        CUerror::r#DEVICE_NOT_LICENSED,\n    );\n    const ERROR_INVALID_IMAGE: CUresult = CUresult::Err(CUerror::r#INVALID_IMAGE);\n    const ERROR_INVALID_CONTEXT: CUresult = CUresult::Err(CUerror::r#INVALID_CONTEXT);\n    const ERROR_CONTEXT_ALREADY_CURRENT: CUresult = CUresult::Err(\n        CUerror::r#CONTEXT_ALREADY_CURRENT,\n    );\n    const ERROR_MAP_FAILED: CUresult = CUresult::Err(CUerror::r#MAP_FAILED);\n    const ERROR_UNMAP_FAILED: CUresult = CUresult::Err(CUerror::r#UNMAP_FAILED);\n    const ERROR_ARRAY_IS_MAPPED: CUresult = CUresult::Err(CUerror::r#ARRAY_IS_MAPPED);\n    const ERROR_ALREADY_MAPPED: CUresult = CUresult::Err(CUerror::r#ALREADY_MAPPED);\n    const ERROR_NO_BINARY_FOR_GPU: CUresult = CUresult::Err(\n        CUerror::r#NO_BINARY_FOR_GPU,\n    );\n    const ERROR_ALREADY_ACQUIRED: CUresult = CUresult::Err(CUerror::r#ALREADY_ACQUIRED);\n    const ERROR_NOT_MAPPED: CUresult = CUresult::Err(CUerror::r#NOT_MAPPED);\n    const ERROR_NOT_MAPPED_AS_ARRAY: CUresult = CUresult::Err(\n        CUerror::r#NOT_MAPPED_AS_ARRAY,\n    );\n    const ERROR_NOT_MAPPED_AS_POINTER: CUresult = CUresult::Err(\n        CUerror::r#NOT_MAPPED_AS_POINTER,\n    );\n    const ERROR_ECC_UNCORRECTABLE: CUresult = CUresult::Err(\n        CUerror::r#ECC_UNCORRECTABLE,\n    );\n    const ERROR_UNSUPPORTED_LIMIT: CUresult = CUresult::Err(\n        CUerror::r#UNSUPPORTED_LIMIT,\n    );\n    const ERROR_CONTEXT_ALREADY_IN_USE: CUresult = CUresult::Err(\n        CUerror::r#CONTEXT_ALREADY_IN_USE,\n    );\n    const ERROR_PEER_ACCESS_UNSUPPORTED: CUresult = CUresult::Err(\n        CUerror::r#PEER_ACCESS_UNSUPPORTED,\n    );\n    const ERROR_INVALID_PTX: CUresult = CUresult::Err(CUerror::r#INVALID_PTX);\n    const ERROR_INVALID_GRAPHICS_CONTEXT: CUresult = CUresult::Err(\n        CUerror::r#INVALID_GRAPHICS_CONTEXT,\n    );\n    const ERROR_NVLINK_UNCORRECTABLE: CUresult = CUresult::Err(\n        CUerror::r#NVLINK_UNCORRECTABLE,\n    );\n    const ERROR_JIT_COMPILER_NOT_FOUND: CUresult = CUresult::Err(\n        CUerror::r#JIT_COMPILER_NOT_FOUND,\n    );\n    const ERROR_UNSUPPORTED_PTX_VERSION: CUresult = CUresult::Err(\n        CUerror::r#UNSUPPORTED_PTX_VERSION,\n    );\n    const ERROR_JIT_COMPILATION_DISABLED: CUresult = CUresult::Err(\n        CUerror::r#JIT_COMPILATION_DISABLED,\n    );\n    const ERROR_UNSUPPORTED_EXEC_AFFINITY: CUresult = CUresult::Err(\n        CUerror::r#UNSUPPORTED_EXEC_AFFINITY,\n    );\n    const ERROR_UNSUPPORTED_DEVSIDE_SYNC: CUresult = CUresult::Err(\n        CUerror::r#UNSUPPORTED_DEVSIDE_SYNC,\n    );\n    const ERROR_CONTAINED: CUresult = CUresult::Err(CUerror::r#CONTAINED);\n    const ERROR_INVALID_SOURCE: CUresult = CUresult::Err(CUerror::r#INVALID_SOURCE);\n    const ERROR_FILE_NOT_FOUND: CUresult = CUresult::Err(CUerror::r#FILE_NOT_FOUND);\n    const ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND: CUresult = CUresult::Err(\n        CUerror::r#SHARED_OBJECT_SYMBOL_NOT_FOUND,\n    );\n    const ERROR_SHARED_OBJECT_INIT_FAILED: CUresult = CUresult::Err(\n        CUerror::r#SHARED_OBJECT_INIT_FAILED,\n    );\n    const ERROR_OPERATING_SYSTEM: CUresult = CUresult::Err(CUerror::r#OPERATING_SYSTEM);\n    const ERROR_INVALID_HANDLE: CUresult = CUresult::Err(CUerror::r#INVALID_HANDLE);\n    const ERROR_ILLEGAL_STATE: CUresult = CUresult::Err(CUerror::r#ILLEGAL_STATE);\n    const ERROR_LOSSY_QUERY: CUresult = CUresult::Err(CUerror::r#LOSSY_QUERY);\n    const ERROR_NOT_FOUND: CUresult = CUresult::Err(CUerror::r#NOT_FOUND);\n    const ERROR_NOT_READY: CUresult = CUresult::Err(CUerror::r#NOT_READY);\n    const ERROR_ILLEGAL_ADDRESS: CUresult = CUresult::Err(CUerror::r#ILLEGAL_ADDRESS);\n    const ERROR_LAUNCH_OUT_OF_RESOURCES: CUresult = CUresult::Err(\n        CUerror::r#LAUNCH_OUT_OF_RESOURCES,\n    );\n    const ERROR_LAUNCH_TIMEOUT: CUresult = CUresult::Err(CUerror::r#LAUNCH_TIMEOUT);\n    const ERROR_LAUNCH_INCOMPATIBLE_TEXTURING: CUresult = CUresult::Err(\n        CUerror::r#LAUNCH_INCOMPATIBLE_TEXTURING,\n    );\n    const ERROR_PEER_ACCESS_ALREADY_ENABLED: CUresult = CUresult::Err(\n        CUerror::r#PEER_ACCESS_ALREADY_ENABLED,\n    );\n    const ERROR_PEER_ACCESS_NOT_ENABLED: CUresult = CUresult::Err(\n        CUerror::r#PEER_ACCESS_NOT_ENABLED,\n    );\n    const ERROR_PRIMARY_CONTEXT_ACTIVE: CUresult = CUresult::Err(\n        CUerror::r#PRIMARY_CONTEXT_ACTIVE,\n    );\n    const ERROR_CONTEXT_IS_DESTROYED: CUresult = CUresult::Err(\n        CUerror::r#CONTEXT_IS_DESTROYED,\n    );\n    const ERROR_ASSERT: CUresult = CUresult::Err(CUerror::r#ASSERT);\n    const ERROR_TOO_MANY_PEERS: CUresult = CUresult::Err(CUerror::r#TOO_MANY_PEERS);\n    const ERROR_HOST_MEMORY_ALREADY_REGISTERED: CUresult = CUresult::Err(\n        CUerror::r#HOST_MEMORY_ALREADY_REGISTERED,\n    );\n    const ERROR_HOST_MEMORY_NOT_REGISTERED: CUresult = CUresult::Err(\n        CUerror::r#HOST_MEMORY_NOT_REGISTERED,\n    );\n    const ERROR_HARDWARE_STACK_ERROR: CUresult = CUresult::Err(\n        CUerror::r#HARDWARE_STACK_ERROR,\n    );\n    const ERROR_ILLEGAL_INSTRUCTION: CUresult = CUresult::Err(\n        CUerror::r#ILLEGAL_INSTRUCTION,\n    );\n    const ERROR_MISALIGNED_ADDRESS: CUresult = CUresult::Err(\n        CUerror::r#MISALIGNED_ADDRESS,\n    );\n    const ERROR_INVALID_ADDRESS_SPACE: CUresult = CUresult::Err(\n        CUerror::r#INVALID_ADDRESS_SPACE,\n    );\n    const ERROR_INVALID_PC: CUresult = CUresult::Err(CUerror::r#INVALID_PC);\n    const ERROR_LAUNCH_FAILED: CUresult = CUresult::Err(CUerror::r#LAUNCH_FAILED);\n    const ERROR_COOPERATIVE_LAUNCH_TOO_LARGE: CUresult = CUresult::Err(\n        CUerror::r#COOPERATIVE_LAUNCH_TOO_LARGE,\n    );\n    const ERROR_TENSOR_MEMORY_LEAK: CUresult = CUresult::Err(\n        CUerror::r#TENSOR_MEMORY_LEAK,\n    );\n    const ERROR_NOT_PERMITTED: CUresult = CUresult::Err(CUerror::r#NOT_PERMITTED);\n    const ERROR_NOT_SUPPORTED: CUresult = CUresult::Err(CUerror::r#NOT_SUPPORTED);\n    const ERROR_SYSTEM_NOT_READY: CUresult = CUresult::Err(CUerror::r#SYSTEM_NOT_READY);\n    const ERROR_SYSTEM_DRIVER_MISMATCH: CUresult = CUresult::Err(\n        CUerror::r#SYSTEM_DRIVER_MISMATCH,\n    );\n    const ERROR_COMPAT_NOT_SUPPORTED_ON_DEVICE: CUresult = CUresult::Err(\n        CUerror::r#COMPAT_NOT_SUPPORTED_ON_DEVICE,\n    );\n    const ERROR_MPS_CONNECTION_FAILED: CUresult = CUresult::Err(\n        CUerror::r#MPS_CONNECTION_FAILED,\n    );\n    const ERROR_MPS_RPC_FAILURE: CUresult = CUresult::Err(CUerror::r#MPS_RPC_FAILURE);\n    const ERROR_MPS_SERVER_NOT_READY: CUresult = CUresult::Err(\n        CUerror::r#MPS_SERVER_NOT_READY,\n    );\n    const ERROR_MPS_MAX_CLIENTS_REACHED: CUresult = CUresult::Err(\n        CUerror::r#MPS_MAX_CLIENTS_REACHED,\n    );\n    const ERROR_MPS_MAX_CONNECTIONS_REACHED: CUresult = CUresult::Err(\n        CUerror::r#MPS_MAX_CONNECTIONS_REACHED,\n    );\n    const ERROR_MPS_CLIENT_TERMINATED: CUresult = CUresult::Err(\n        CUerror::r#MPS_CLIENT_TERMINATED,\n    );\n    const ERROR_CDP_NOT_SUPPORTED: CUresult = CUresult::Err(\n        CUerror::r#CDP_NOT_SUPPORTED,\n    );\n    const ERROR_CDP_VERSION_MISMATCH: CUresult = CUresult::Err(\n        CUerror::r#CDP_VERSION_MISMATCH,\n    );\n    const ERROR_STREAM_CAPTURE_UNSUPPORTED: CUresult = CUresult::Err(\n        CUerror::r#STREAM_CAPTURE_UNSUPPORTED,\n    );\n    const ERROR_STREAM_CAPTURE_INVALIDATED: CUresult = CUresult::Err(\n        CUerror::r#STREAM_CAPTURE_INVALIDATED,\n    );\n    const ERROR_STREAM_CAPTURE_MERGE: CUresult = CUresult::Err(\n        CUerror::r#STREAM_CAPTURE_MERGE,\n    );\n    const ERROR_STREAM_CAPTURE_UNMATCHED: CUresult = CUresult::Err(\n        CUerror::r#STREAM_CAPTURE_UNMATCHED,\n    );\n    const ERROR_STREAM_CAPTURE_UNJOINED: CUresult = CUresult::Err(\n        CUerror::r#STREAM_CAPTURE_UNJOINED,\n    );\n    const ERROR_STREAM_CAPTURE_ISOLATION: CUresult = CUresult::Err(\n        CUerror::r#STREAM_CAPTURE_ISOLATION,\n    );\n    const ERROR_STREAM_CAPTURE_IMPLICIT: CUresult = CUresult::Err(\n        CUerror::r#STREAM_CAPTURE_IMPLICIT,\n    );\n    const ERROR_CAPTURED_EVENT: CUresult = CUresult::Err(CUerror::r#CAPTURED_EVENT);\n    const ERROR_STREAM_CAPTURE_WRONG_THREAD: CUresult = CUresult::Err(\n        CUerror::r#STREAM_CAPTURE_WRONG_THREAD,\n    );\n    const ERROR_TIMEOUT: CUresult = CUresult::Err(CUerror::r#TIMEOUT);\n    const ERROR_GRAPH_EXEC_UPDATE_FAILURE: CUresult = CUresult::Err(\n        CUerror::r#GRAPH_EXEC_UPDATE_FAILURE,\n    );\n    const ERROR_EXTERNAL_DEVICE: CUresult = CUresult::Err(CUerror::r#EXTERNAL_DEVICE);\n    const ERROR_INVALID_CLUSTER_SIZE: CUresult = CUresult::Err(\n        CUerror::r#INVALID_CLUSTER_SIZE,\n    );\n    const ERROR_FUNCTION_NOT_LOADED: CUresult = CUresult::Err(\n        CUerror::r#FUNCTION_NOT_LOADED,\n    );\n    const ERROR_INVALID_RESOURCE_TYPE: CUresult = CUresult::Err(\n        CUerror::r#INVALID_RESOURCE_TYPE,\n    );\n    const ERROR_INVALID_RESOURCE_CONFIGURATION: CUresult = CUresult::Err(\n        CUerror::r#INVALID_RESOURCE_CONFIGURATION,\n    );\n    const ERROR_KEY_ROTATION: CUresult = CUresult::Err(CUerror::r#KEY_ROTATION);\n    const ERROR_UNKNOWN: CUresult = CUresult::Err(CUerror::r#UNKNOWN);\n}\nimpl CUresultConsts for CUresult {}\n#[must_use]\npub type CUresult = ::core::result::Result<(), CUerror>;\nconst _: fn() = || {\n    let _ = std::mem::transmute::<CUresult, u32>;\n};\nimpl From<hip_runtime_sys::hipErrorCode_t> for CUerror {\n    fn from(error: hip_runtime_sys::hipErrorCode_t) -> Self {\n        Self(error.0)\n    }\n}\nunsafe impl Send for CUdeviceptr {}\nunsafe impl Sync for CUdeviceptr {}\nunsafe impl Send for CUcontext {}\nunsafe impl Sync for CUcontext {}\nunsafe impl Send for CUstream {}\nunsafe impl Sync for CUstream {}\nunsafe impl Send for CUmodule {}\nunsafe impl Sync for CUmodule {}\nunsafe impl Send for CUfunction {}\nunsafe impl Sync for CUfunction {}\nunsafe impl Send for CUlibrary {}\nunsafe impl Sync for CUlibrary {}\n"
  },
  {
    "path": "cuda_types/src/cudnn.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cudnnContext {\n    _unused: [u8; 0],\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cudnnRuntimeTag_t {\n    _unused: [u8; 0],\n}\nimpl cudnnErrQueryMode_t {\n    pub const CUDNN_ERRQUERY_RAWCODE: cudnnErrQueryMode_t = cudnnErrQueryMode_t(0);\n}\nimpl cudnnErrQueryMode_t {\n    pub const CUDNN_ERRQUERY_NONBLOCKING: cudnnErrQueryMode_t = cudnnErrQueryMode_t(1);\n}\nimpl cudnnErrQueryMode_t {\n    pub const CUDNN_ERRQUERY_BLOCKING: cudnnErrQueryMode_t = cudnnErrQueryMode_t(2);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnErrQueryMode_t(pub ::core::ffi::c_uint);\nimpl cudnnMathType_t {\n    pub const CUDNN_DEFAULT_MATH: cudnnMathType_t = cudnnMathType_t(0);\n}\nimpl cudnnMathType_t {\n    pub const CUDNN_TENSOR_OP_MATH: cudnnMathType_t = cudnnMathType_t(1);\n}\nimpl cudnnMathType_t {\n    pub const CUDNN_TENSOR_OP_MATH_ALLOW_CONVERSION: cudnnMathType_t = cudnnMathType_t(\n        2,\n    );\n}\nimpl cudnnMathType_t {\n    pub const CUDNN_FMA_MATH: cudnnMathType_t = cudnnMathType_t(3);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnMathType_t(pub ::core::ffi::c_uint);\nimpl cudnnNanPropagation_t {\n    pub const CUDNN_NOT_PROPAGATE_NAN: cudnnNanPropagation_t = cudnnNanPropagation_t(0);\n}\nimpl cudnnNanPropagation_t {\n    pub const CUDNN_PROPAGATE_NAN: cudnnNanPropagation_t = cudnnNanPropagation_t(1);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnNanPropagation_t(pub ::core::ffi::c_uint);\nimpl cudnnTensorFormat_t {\n    pub const CUDNN_TENSOR_NCHW: cudnnTensorFormat_t = cudnnTensorFormat_t(0);\n}\nimpl cudnnTensorFormat_t {\n    pub const CUDNN_TENSOR_NHWC: cudnnTensorFormat_t = cudnnTensorFormat_t(1);\n}\nimpl cudnnTensorFormat_t {\n    pub const CUDNN_TENSOR_NCHW_VECT_C: cudnnTensorFormat_t = cudnnTensorFormat_t(2);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnTensorFormat_t(pub ::core::ffi::c_uint);\nimpl cudnnReduceTensorOp_t {\n    pub const CUDNN_REDUCE_TENSOR_ADD: cudnnReduceTensorOp_t = cudnnReduceTensorOp_t(0);\n}\nimpl cudnnReduceTensorOp_t {\n    pub const CUDNN_REDUCE_TENSOR_MUL: cudnnReduceTensorOp_t = cudnnReduceTensorOp_t(1);\n}\nimpl cudnnReduceTensorOp_t {\n    pub const CUDNN_REDUCE_TENSOR_MIN: cudnnReduceTensorOp_t = cudnnReduceTensorOp_t(2);\n}\nimpl cudnnReduceTensorOp_t {\n    pub const CUDNN_REDUCE_TENSOR_MAX: cudnnReduceTensorOp_t = cudnnReduceTensorOp_t(3);\n}\nimpl cudnnReduceTensorOp_t {\n    pub const CUDNN_REDUCE_TENSOR_AMAX: cudnnReduceTensorOp_t = cudnnReduceTensorOp_t(4);\n}\nimpl cudnnReduceTensorOp_t {\n    pub const CUDNN_REDUCE_TENSOR_AVG: cudnnReduceTensorOp_t = cudnnReduceTensorOp_t(5);\n}\nimpl cudnnReduceTensorOp_t {\n    pub const CUDNN_REDUCE_TENSOR_NORM1: cudnnReduceTensorOp_t = cudnnReduceTensorOp_t(\n        6,\n    );\n}\nimpl cudnnReduceTensorOp_t {\n    pub const CUDNN_REDUCE_TENSOR_NORM2: cudnnReduceTensorOp_t = cudnnReduceTensorOp_t(\n        7,\n    );\n}\nimpl cudnnReduceTensorOp_t {\n    pub const CUDNN_REDUCE_TENSOR_MUL_NO_ZEROS: cudnnReduceTensorOp_t = cudnnReduceTensorOp_t(\n        8,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnReduceTensorOp_t(pub ::core::ffi::c_uint);\nimpl cudnnActivationMode_t {\n    pub const CUDNN_ACTIVATION_SIGMOID: cudnnActivationMode_t = cudnnActivationMode_t(0);\n}\nimpl cudnnActivationMode_t {\n    pub const CUDNN_ACTIVATION_RELU: cudnnActivationMode_t = cudnnActivationMode_t(1);\n}\nimpl cudnnActivationMode_t {\n    pub const CUDNN_ACTIVATION_TANH: cudnnActivationMode_t = cudnnActivationMode_t(2);\n}\nimpl cudnnActivationMode_t {\n    pub const CUDNN_ACTIVATION_CLIPPED_RELU: cudnnActivationMode_t = cudnnActivationMode_t(\n        3,\n    );\n}\nimpl cudnnActivationMode_t {\n    pub const CUDNN_ACTIVATION_ELU: cudnnActivationMode_t = cudnnActivationMode_t(4);\n}\nimpl cudnnActivationMode_t {\n    pub const CUDNN_ACTIVATION_IDENTITY: cudnnActivationMode_t = cudnnActivationMode_t(\n        5,\n    );\n}\nimpl cudnnActivationMode_t {\n    pub const CUDNN_ACTIVATION_SWISH: cudnnActivationMode_t = cudnnActivationMode_t(6);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnActivationMode_t(pub ::core::ffi::c_uint);\nimpl cudnnSeverity_t {\n    pub const CUDNN_SEV_FATAL: cudnnSeverity_t = cudnnSeverity_t(0);\n}\nimpl cudnnSeverity_t {\n    pub const CUDNN_SEV_ERROR: cudnnSeverity_t = cudnnSeverity_t(1);\n}\nimpl cudnnSeverity_t {\n    pub const CUDNN_SEV_WARNING: cudnnSeverity_t = cudnnSeverity_t(2);\n}\nimpl cudnnSeverity_t {\n    pub const CUDNN_SEV_INFO: cudnnSeverity_t = cudnnSeverity_t(3);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnSeverity_t(pub ::core::ffi::c_uint);\nimpl cudnnConvolutionMode_t {\n    pub const CUDNN_CONVOLUTION: cudnnConvolutionMode_t = cudnnConvolutionMode_t(0);\n}\nimpl cudnnConvolutionMode_t {\n    pub const CUDNN_CROSS_CORRELATION: cudnnConvolutionMode_t = cudnnConvolutionMode_t(\n        1,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnConvolutionMode_t(pub ::core::ffi::c_uint);\nimpl cudnnReorderType_t {\n    pub const CUDNN_DEFAULT_REORDER: cudnnReorderType_t = cudnnReorderType_t(0);\n}\nimpl cudnnReorderType_t {\n    pub const CUDNN_NO_REORDER: cudnnReorderType_t = cudnnReorderType_t(1);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnReorderType_t(pub ::core::ffi::c_uint);\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnFractionStruct {\n    pub numerator: i64,\n    pub denominator: i64,\n}\nimpl cudnnResampleMode_t {\n    pub const CUDNN_RESAMPLE_NEAREST: cudnnResampleMode_t = cudnnResampleMode_t(0);\n}\nimpl cudnnResampleMode_t {\n    pub const CUDNN_RESAMPLE_BILINEAR: cudnnResampleMode_t = cudnnResampleMode_t(1);\n}\nimpl cudnnResampleMode_t {\n    pub const CUDNN_RESAMPLE_AVGPOOL: cudnnResampleMode_t = cudnnResampleMode_t(2);\n}\nimpl cudnnResampleMode_t {\n    pub const CUDNN_RESAMPLE_AVGPOOL_INCLUDE_PADDING: cudnnResampleMode_t = cudnnResampleMode_t(\n        2,\n    );\n}\nimpl cudnnResampleMode_t {\n    pub const CUDNN_RESAMPLE_AVGPOOL_EXCLUDE_PADDING: cudnnResampleMode_t = cudnnResampleMode_t(\n        4,\n    );\n}\nimpl cudnnResampleMode_t {\n    pub const CUDNN_RESAMPLE_MAXPOOL: cudnnResampleMode_t = cudnnResampleMode_t(3);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnResampleMode_t(pub ::core::ffi::c_uint);\nimpl cudnnSignalMode_t {\n    pub const CUDNN_SIGNAL_SET: cudnnSignalMode_t = cudnnSignalMode_t(0);\n}\nimpl cudnnSignalMode_t {\n    pub const CUDNN_SIGNAL_WAIT: cudnnSignalMode_t = cudnnSignalMode_t(1);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnSignalMode_t(pub ::core::ffi::c_uint);\nimpl cudnnGenStatsMode_t {\n    pub const CUDNN_GENSTATS_SUM_SQSUM: cudnnGenStatsMode_t = cudnnGenStatsMode_t(0);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnGenStatsMode_t(pub ::core::ffi::c_uint);\nimpl cudnnBnFinalizeStatsMode_t {\n    pub const CUDNN_BN_FINALIZE_STATISTICS_TRAINING: cudnnBnFinalizeStatsMode_t = cudnnBnFinalizeStatsMode_t(\n        0,\n    );\n}\nimpl cudnnBnFinalizeStatsMode_t {\n    pub const CUDNN_BN_FINALIZE_STATISTICS_INFERENCE: cudnnBnFinalizeStatsMode_t = cudnnBnFinalizeStatsMode_t(\n        1,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnBnFinalizeStatsMode_t(pub ::core::ffi::c_uint);\nimpl cudnnRngDistribution_t {\n    pub const CUDNN_RNG_DISTRIBUTION_BERNOULLI: cudnnRngDistribution_t = cudnnRngDistribution_t(\n        0,\n    );\n}\nimpl cudnnRngDistribution_t {\n    pub const CUDNN_RNG_DISTRIBUTION_UNIFORM: cudnnRngDistribution_t = cudnnRngDistribution_t(\n        1,\n    );\n}\nimpl cudnnRngDistribution_t {\n    pub const CUDNN_RNG_DISTRIBUTION_NORMAL: cudnnRngDistribution_t = cudnnRngDistribution_t(\n        2,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnRngDistribution_t(pub ::core::ffi::c_uint);\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_HANDLE: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        0,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_DATA_TYPE: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        1,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_BOOLEAN: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        2,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_INT64: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        3,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_FLOAT: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        4,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_DOUBLE: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        5,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_VOID_PTR: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        6,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_CONVOLUTION_MODE: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        7,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_HEUR_MODE: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        8,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_KNOB_TYPE: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        9,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_NAN_PROPOGATION: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        10,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_NUMERICAL_NOTE: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        11,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_LAYOUT_TYPE: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        12,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_ATTRIB_NAME: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        13,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_POINTWISE_MODE: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        14,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_BACKEND_DESCRIPTOR: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        15,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_GENSTATS_MODE: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        16,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_BN_FINALIZE_STATS_MODE: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        17,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_REDUCTION_OPERATOR_TYPE: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        18,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_BEHAVIOR_NOTE: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        19,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_TENSOR_REORDERING_MODE: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        20,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_RESAMPLE_MODE: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        21,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_PADDING_MODE: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        22,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_INT32: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        23,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_CHAR: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        24,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_SIGNAL_MODE: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        25,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_FRACTION: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        26,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_NORM_MODE: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        27,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_NORM_FWD_PHASE: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        28,\n    );\n}\nimpl cudnnBackendAttributeType_t {\n    pub const CUDNN_TYPE_RNG_DISTRIBUTION: cudnnBackendAttributeType_t = cudnnBackendAttributeType_t(\n        29,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnBackendAttributeType_t(pub ::core::ffi::c_uint);\nimpl cudnnBackendLayoutType_t {\n    pub const CUDNN_LAYOUT_TYPE_PREFERRED_NCHW: cudnnBackendLayoutType_t = cudnnBackendLayoutType_t(\n        0,\n    );\n}\nimpl cudnnBackendLayoutType_t {\n    pub const CUDNN_LAYOUT_TYPE_PREFERRED_NHWC: cudnnBackendLayoutType_t = cudnnBackendLayoutType_t(\n        1,\n    );\n}\nimpl cudnnBackendLayoutType_t {\n    pub const CUDNN_LAYOUT_TYPE_PREFERRED_PAD4CK: cudnnBackendLayoutType_t = cudnnBackendLayoutType_t(\n        2,\n    );\n}\nimpl cudnnBackendLayoutType_t {\n    pub const CUDNN_LAYOUT_TYPE_PREFERRED_PAD8CK: cudnnBackendLayoutType_t = cudnnBackendLayoutType_t(\n        3,\n    );\n}\nimpl cudnnBackendLayoutType_t {\n    pub const CUDNN_LAYOUT_TYPE_COUNT: cudnnBackendLayoutType_t = cudnnBackendLayoutType_t(\n        4,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnBackendLayoutType_t(pub ::core::ffi::c_uint);\nimpl cudnnBackendHeurMode_t {\n    pub const CUDNN_HEUR_MODE_INSTANT: cudnnBackendHeurMode_t = cudnnBackendHeurMode_t(\n        0,\n    );\n}\nimpl cudnnBackendHeurMode_t {\n    pub const CUDNN_HEUR_MODE_B: cudnnBackendHeurMode_t = cudnnBackendHeurMode_t(1);\n}\nimpl cudnnBackendHeurMode_t {\n    pub const CUDNN_HEUR_MODE_FALLBACK: cudnnBackendHeurMode_t = cudnnBackendHeurMode_t(\n        2,\n    );\n}\nimpl cudnnBackendHeurMode_t {\n    pub const CUDNN_HEUR_MODE_A: cudnnBackendHeurMode_t = cudnnBackendHeurMode_t(3);\n}\nimpl cudnnBackendHeurMode_t {\n    pub const CUDNN_HEUR_MODES_COUNT: cudnnBackendHeurMode_t = cudnnBackendHeurMode_t(4);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnBackendHeurMode_t(pub ::core::ffi::c_uint);\nimpl cudnnPaddingMode_t {\n    pub const CUDNN_ZERO_PAD: cudnnPaddingMode_t = cudnnPaddingMode_t(0);\n}\nimpl cudnnPaddingMode_t {\n    pub const CUDNN_NEG_INF_PAD: cudnnPaddingMode_t = cudnnPaddingMode_t(1);\n}\nimpl cudnnPaddingMode_t {\n    pub const CUDNN_EDGE_VAL_PAD: cudnnPaddingMode_t = cudnnPaddingMode_t(2);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnPaddingMode_t(pub ::core::ffi::c_uint);\nimpl cudnnBackendNormFwdPhase_t {\n    pub const CUDNN_NORM_FWD_INFERENCE: cudnnBackendNormFwdPhase_t = cudnnBackendNormFwdPhase_t(\n        0,\n    );\n}\nimpl cudnnBackendNormFwdPhase_t {\n    pub const CUDNN_NORM_FWD_TRAINING: cudnnBackendNormFwdPhase_t = cudnnBackendNormFwdPhase_t(\n        1,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnBackendNormFwdPhase_t(pub ::core::ffi::c_uint);\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cudnnTensorStruct {\n    _unused: [u8; 0],\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cudnnPoolingStruct {\n    _unused: [u8; 0],\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cudnnFilterStruct {\n    _unused: [u8; 0],\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cudnnLRNStruct {\n    _unused: [u8; 0],\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cudnnActivationStruct {\n    _unused: [u8; 0],\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cudnnSpatialTransformerStruct {\n    _unused: [u8; 0],\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cudnnOpTensorStruct {\n    _unused: [u8; 0],\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cudnnReduceTensorStruct {\n    _unused: [u8; 0],\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cudnnCTCLossStruct {\n    _unused: [u8; 0],\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cudnnTensorTransformStruct {\n    _unused: [u8; 0],\n}\nimpl cudnnDeterminism_t {\n    pub const CUDNN_NON_DETERMINISTIC: cudnnDeterminism_t = cudnnDeterminism_t(0);\n}\nimpl cudnnDeterminism_t {\n    pub const CUDNN_DETERMINISTIC: cudnnDeterminism_t = cudnnDeterminism_t(1);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnDeterminism_t(pub ::core::ffi::c_uint);\nimpl cudnnFoldingDirection_t {\n    pub const CUDNN_TRANSFORM_FOLD: cudnnFoldingDirection_t = cudnnFoldingDirection_t(0);\n}\nimpl cudnnFoldingDirection_t {\n    pub const CUDNN_TRANSFORM_UNFOLD: cudnnFoldingDirection_t = cudnnFoldingDirection_t(\n        1,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnFoldingDirection_t(pub ::core::ffi::c_uint);\nimpl cudnnOpTensorOp_t {\n    pub const CUDNN_OP_TENSOR_ADD: cudnnOpTensorOp_t = cudnnOpTensorOp_t(0);\n}\nimpl cudnnOpTensorOp_t {\n    pub const CUDNN_OP_TENSOR_MUL: cudnnOpTensorOp_t = cudnnOpTensorOp_t(1);\n}\nimpl cudnnOpTensorOp_t {\n    pub const CUDNN_OP_TENSOR_MIN: cudnnOpTensorOp_t = cudnnOpTensorOp_t(2);\n}\nimpl cudnnOpTensorOp_t {\n    pub const CUDNN_OP_TENSOR_MAX: cudnnOpTensorOp_t = cudnnOpTensorOp_t(3);\n}\nimpl cudnnOpTensorOp_t {\n    pub const CUDNN_OP_TENSOR_SQRT: cudnnOpTensorOp_t = cudnnOpTensorOp_t(4);\n}\nimpl cudnnOpTensorOp_t {\n    pub const CUDNN_OP_TENSOR_NOT: cudnnOpTensorOp_t = cudnnOpTensorOp_t(5);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnOpTensorOp_t(pub ::core::ffi::c_uint);\nimpl cudnnReduceTensorIndices_t {\n    pub const CUDNN_REDUCE_TENSOR_NO_INDICES: cudnnReduceTensorIndices_t = cudnnReduceTensorIndices_t(\n        0,\n    );\n}\nimpl cudnnReduceTensorIndices_t {\n    pub const CUDNN_REDUCE_TENSOR_FLATTENED_INDICES: cudnnReduceTensorIndices_t = cudnnReduceTensorIndices_t(\n        1,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnReduceTensorIndices_t(pub ::core::ffi::c_uint);\nimpl cudnnIndicesType_t {\n    pub const CUDNN_32BIT_INDICES: cudnnIndicesType_t = cudnnIndicesType_t(0);\n}\nimpl cudnnIndicesType_t {\n    pub const CUDNN_64BIT_INDICES: cudnnIndicesType_t = cudnnIndicesType_t(1);\n}\nimpl cudnnIndicesType_t {\n    pub const CUDNN_16BIT_INDICES: cudnnIndicesType_t = cudnnIndicesType_t(2);\n}\nimpl cudnnIndicesType_t {\n    pub const CUDNN_8BIT_INDICES: cudnnIndicesType_t = cudnnIndicesType_t(3);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnIndicesType_t(pub ::core::ffi::c_uint);\nimpl cudnnSoftmaxAlgorithm_t {\n    pub const CUDNN_SOFTMAX_FAST: cudnnSoftmaxAlgorithm_t = cudnnSoftmaxAlgorithm_t(0);\n}\nimpl cudnnSoftmaxAlgorithm_t {\n    pub const CUDNN_SOFTMAX_ACCURATE: cudnnSoftmaxAlgorithm_t = cudnnSoftmaxAlgorithm_t(\n        1,\n    );\n}\nimpl cudnnSoftmaxAlgorithm_t {\n    pub const CUDNN_SOFTMAX_LOG: cudnnSoftmaxAlgorithm_t = cudnnSoftmaxAlgorithm_t(2);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnSoftmaxAlgorithm_t(pub ::core::ffi::c_uint);\nimpl cudnnSoftmaxMode_t {\n    pub const CUDNN_SOFTMAX_MODE_INSTANCE: cudnnSoftmaxMode_t = cudnnSoftmaxMode_t(0);\n}\nimpl cudnnSoftmaxMode_t {\n    pub const CUDNN_SOFTMAX_MODE_CHANNEL: cudnnSoftmaxMode_t = cudnnSoftmaxMode_t(1);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnSoftmaxMode_t(pub ::core::ffi::c_uint);\nimpl cudnnPoolingMode_t {\n    pub const CUDNN_POOLING_MAX: cudnnPoolingMode_t = cudnnPoolingMode_t(0);\n}\nimpl cudnnPoolingMode_t {\n    pub const CUDNN_POOLING_AVERAGE_COUNT_INCLUDE_PADDING: cudnnPoolingMode_t = cudnnPoolingMode_t(\n        1,\n    );\n}\nimpl cudnnPoolingMode_t {\n    pub const CUDNN_POOLING_AVERAGE_COUNT_EXCLUDE_PADDING: cudnnPoolingMode_t = cudnnPoolingMode_t(\n        2,\n    );\n}\nimpl cudnnPoolingMode_t {\n    pub const CUDNN_POOLING_MAX_DETERMINISTIC: cudnnPoolingMode_t = cudnnPoolingMode_t(\n        3,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnPoolingMode_t(pub ::core::ffi::c_uint);\nimpl cudnnLRNMode_t {\n    pub const CUDNN_LRN_CROSS_CHANNEL_DIM1: cudnnLRNMode_t = cudnnLRNMode_t(0);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnLRNMode_t(pub ::core::ffi::c_uint);\nimpl cudnnDivNormMode_t {\n    pub const CUDNN_DIVNORM_PRECOMPUTED_MEANS: cudnnDivNormMode_t = cudnnDivNormMode_t(\n        0,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnDivNormMode_t(pub ::core::ffi::c_uint);\nimpl cudnnBatchNormMode_t {\n    pub const CUDNN_BATCHNORM_PER_ACTIVATION: cudnnBatchNormMode_t = cudnnBatchNormMode_t(\n        0,\n    );\n}\nimpl cudnnBatchNormMode_t {\n    pub const CUDNN_BATCHNORM_SPATIAL: cudnnBatchNormMode_t = cudnnBatchNormMode_t(1);\n}\nimpl cudnnBatchNormMode_t {\n    pub const CUDNN_BATCHNORM_SPATIAL_PERSISTENT: cudnnBatchNormMode_t = cudnnBatchNormMode_t(\n        2,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnBatchNormMode_t(pub ::core::ffi::c_uint);\nimpl cudnnBatchNormOps_t {\n    pub const CUDNN_BATCHNORM_OPS_BN: cudnnBatchNormOps_t = cudnnBatchNormOps_t(0);\n}\nimpl cudnnBatchNormOps_t {\n    pub const CUDNN_BATCHNORM_OPS_BN_ACTIVATION: cudnnBatchNormOps_t = cudnnBatchNormOps_t(\n        1,\n    );\n}\nimpl cudnnBatchNormOps_t {\n    pub const CUDNN_BATCHNORM_OPS_BN_ADD_ACTIVATION: cudnnBatchNormOps_t = cudnnBatchNormOps_t(\n        2,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnBatchNormOps_t(pub ::core::ffi::c_uint);\nimpl cudnnNormMode_t {\n    pub const CUDNN_NORM_PER_ACTIVATION: cudnnNormMode_t = cudnnNormMode_t(0);\n}\nimpl cudnnNormMode_t {\n    pub const CUDNN_NORM_PER_CHANNEL: cudnnNormMode_t = cudnnNormMode_t(1);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnNormMode_t(pub ::core::ffi::c_uint);\nimpl cudnnNormAlgo_t {\n    pub const CUDNN_NORM_ALGO_STANDARD: cudnnNormAlgo_t = cudnnNormAlgo_t(0);\n}\nimpl cudnnNormAlgo_t {\n    pub const CUDNN_NORM_ALGO_PERSIST: cudnnNormAlgo_t = cudnnNormAlgo_t(1);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnNormAlgo_t(pub ::core::ffi::c_uint);\nimpl cudnnNormOps_t {\n    pub const CUDNN_NORM_OPS_NORM: cudnnNormOps_t = cudnnNormOps_t(0);\n}\nimpl cudnnNormOps_t {\n    pub const CUDNN_NORM_OPS_NORM_ACTIVATION: cudnnNormOps_t = cudnnNormOps_t(1);\n}\nimpl cudnnNormOps_t {\n    pub const CUDNN_NORM_OPS_NORM_ADD_ACTIVATION: cudnnNormOps_t = cudnnNormOps_t(2);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnNormOps_t(pub ::core::ffi::c_uint);\nimpl cudnnSamplerType_t {\n    pub const CUDNN_SAMPLER_BILINEAR: cudnnSamplerType_t = cudnnSamplerType_t(0);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnSamplerType_t(pub ::core::ffi::c_uint);\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cudnnDropoutStruct {\n    _unused: [u8; 0],\n}\nimpl cudnnConvolutionFwdAlgo_t {\n    pub const CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_GEMM: cudnnConvolutionFwdAlgo_t = cudnnConvolutionFwdAlgo_t(\n        0,\n    );\n}\nimpl cudnnConvolutionFwdAlgo_t {\n    pub const CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_PRECOMP_GEMM: cudnnConvolutionFwdAlgo_t = cudnnConvolutionFwdAlgo_t(\n        1,\n    );\n}\nimpl cudnnConvolutionFwdAlgo_t {\n    pub const CUDNN_CONVOLUTION_FWD_ALGO_GEMM: cudnnConvolutionFwdAlgo_t = cudnnConvolutionFwdAlgo_t(\n        2,\n    );\n}\nimpl cudnnConvolutionFwdAlgo_t {\n    pub const CUDNN_CONVOLUTION_FWD_ALGO_DIRECT: cudnnConvolutionFwdAlgo_t = cudnnConvolutionFwdAlgo_t(\n        3,\n    );\n}\nimpl cudnnConvolutionFwdAlgo_t {\n    pub const CUDNN_CONVOLUTION_FWD_ALGO_FFT: cudnnConvolutionFwdAlgo_t = cudnnConvolutionFwdAlgo_t(\n        4,\n    );\n}\nimpl cudnnConvolutionFwdAlgo_t {\n    pub const CUDNN_CONVOLUTION_FWD_ALGO_FFT_TILING: cudnnConvolutionFwdAlgo_t = cudnnConvolutionFwdAlgo_t(\n        5,\n    );\n}\nimpl cudnnConvolutionFwdAlgo_t {\n    pub const CUDNN_CONVOLUTION_FWD_ALGO_WINOGRAD: cudnnConvolutionFwdAlgo_t = cudnnConvolutionFwdAlgo_t(\n        6,\n    );\n}\nimpl cudnnConvolutionFwdAlgo_t {\n    pub const CUDNN_CONVOLUTION_FWD_ALGO_WINOGRAD_NONFUSED: cudnnConvolutionFwdAlgo_t = cudnnConvolutionFwdAlgo_t(\n        7,\n    );\n}\nimpl cudnnConvolutionFwdAlgo_t {\n    pub const CUDNN_CONVOLUTION_FWD_ALGO_COUNT: cudnnConvolutionFwdAlgo_t = cudnnConvolutionFwdAlgo_t(\n        8,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnConvolutionFwdAlgo_t(pub ::core::ffi::c_uint);\nimpl cudnnConvolutionBwdFilterAlgo_t {\n    pub const CUDNN_CONVOLUTION_BWD_FILTER_ALGO_0: cudnnConvolutionBwdFilterAlgo_t = cudnnConvolutionBwdFilterAlgo_t(\n        0,\n    );\n}\nimpl cudnnConvolutionBwdFilterAlgo_t {\n    pub const CUDNN_CONVOLUTION_BWD_FILTER_ALGO_1: cudnnConvolutionBwdFilterAlgo_t = cudnnConvolutionBwdFilterAlgo_t(\n        1,\n    );\n}\nimpl cudnnConvolutionBwdFilterAlgo_t {\n    pub const CUDNN_CONVOLUTION_BWD_FILTER_ALGO_FFT: cudnnConvolutionBwdFilterAlgo_t = cudnnConvolutionBwdFilterAlgo_t(\n        2,\n    );\n}\nimpl cudnnConvolutionBwdFilterAlgo_t {\n    pub const CUDNN_CONVOLUTION_BWD_FILTER_ALGO_3: cudnnConvolutionBwdFilterAlgo_t = cudnnConvolutionBwdFilterAlgo_t(\n        3,\n    );\n}\nimpl cudnnConvolutionBwdFilterAlgo_t {\n    pub const CUDNN_CONVOLUTION_BWD_FILTER_ALGO_WINOGRAD: cudnnConvolutionBwdFilterAlgo_t = cudnnConvolutionBwdFilterAlgo_t(\n        4,\n    );\n}\nimpl cudnnConvolutionBwdFilterAlgo_t {\n    pub const CUDNN_CONVOLUTION_BWD_FILTER_ALGO_WINOGRAD_NONFUSED: cudnnConvolutionBwdFilterAlgo_t = cudnnConvolutionBwdFilterAlgo_t(\n        5,\n    );\n}\nimpl cudnnConvolutionBwdFilterAlgo_t {\n    pub const CUDNN_CONVOLUTION_BWD_FILTER_ALGO_FFT_TILING: cudnnConvolutionBwdFilterAlgo_t = cudnnConvolutionBwdFilterAlgo_t(\n        6,\n    );\n}\nimpl cudnnConvolutionBwdFilterAlgo_t {\n    pub const CUDNN_CONVOLUTION_BWD_FILTER_ALGO_COUNT: cudnnConvolutionBwdFilterAlgo_t = cudnnConvolutionBwdFilterAlgo_t(\n        7,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnConvolutionBwdFilterAlgo_t(pub ::core::ffi::c_uint);\nimpl cudnnConvolutionBwdDataAlgo_t {\n    pub const CUDNN_CONVOLUTION_BWD_DATA_ALGO_0: cudnnConvolutionBwdDataAlgo_t = cudnnConvolutionBwdDataAlgo_t(\n        0,\n    );\n}\nimpl cudnnConvolutionBwdDataAlgo_t {\n    pub const CUDNN_CONVOLUTION_BWD_DATA_ALGO_1: cudnnConvolutionBwdDataAlgo_t = cudnnConvolutionBwdDataAlgo_t(\n        1,\n    );\n}\nimpl cudnnConvolutionBwdDataAlgo_t {\n    pub const CUDNN_CONVOLUTION_BWD_DATA_ALGO_FFT: cudnnConvolutionBwdDataAlgo_t = cudnnConvolutionBwdDataAlgo_t(\n        2,\n    );\n}\nimpl cudnnConvolutionBwdDataAlgo_t {\n    pub const CUDNN_CONVOLUTION_BWD_DATA_ALGO_FFT_TILING: cudnnConvolutionBwdDataAlgo_t = cudnnConvolutionBwdDataAlgo_t(\n        3,\n    );\n}\nimpl cudnnConvolutionBwdDataAlgo_t {\n    pub const CUDNN_CONVOLUTION_BWD_DATA_ALGO_WINOGRAD: cudnnConvolutionBwdDataAlgo_t = cudnnConvolutionBwdDataAlgo_t(\n        4,\n    );\n}\nimpl cudnnConvolutionBwdDataAlgo_t {\n    pub const CUDNN_CONVOLUTION_BWD_DATA_ALGO_WINOGRAD_NONFUSED: cudnnConvolutionBwdDataAlgo_t = cudnnConvolutionBwdDataAlgo_t(\n        5,\n    );\n}\nimpl cudnnConvolutionBwdDataAlgo_t {\n    pub const CUDNN_CONVOLUTION_BWD_DATA_ALGO_COUNT: cudnnConvolutionBwdDataAlgo_t = cudnnConvolutionBwdDataAlgo_t(\n        6,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnConvolutionBwdDataAlgo_t(pub ::core::ffi::c_uint);\nimpl cudnnCTCLossAlgo_t {\n    pub const CUDNN_CTC_LOSS_ALGO_DETERMINISTIC: cudnnCTCLossAlgo_t = cudnnCTCLossAlgo_t(\n        0,\n    );\n}\nimpl cudnnCTCLossAlgo_t {\n    pub const CUDNN_CTC_LOSS_ALGO_NON_DETERMINISTIC: cudnnCTCLossAlgo_t = cudnnCTCLossAlgo_t(\n        1,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnCTCLossAlgo_t(pub ::core::ffi::c_uint);\nimpl cudnnRNNAlgo_t {\n    pub const CUDNN_RNN_ALGO_STANDARD: cudnnRNNAlgo_t = cudnnRNNAlgo_t(0);\n}\nimpl cudnnRNNAlgo_t {\n    pub const CUDNN_RNN_ALGO_PERSIST_STATIC: cudnnRNNAlgo_t = cudnnRNNAlgo_t(1);\n}\nimpl cudnnRNNAlgo_t {\n    pub const CUDNN_RNN_ALGO_PERSIST_DYNAMIC: cudnnRNNAlgo_t = cudnnRNNAlgo_t(2);\n}\nimpl cudnnRNNAlgo_t {\n    pub const CUDNN_RNN_ALGO_PERSIST_STATIC_SMALL_H: cudnnRNNAlgo_t = cudnnRNNAlgo_t(3);\n}\nimpl cudnnRNNAlgo_t {\n    pub const CUDNN_RNN_ALGO_COUNT: cudnnRNNAlgo_t = cudnnRNNAlgo_t(4);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnRNNAlgo_t(pub ::core::ffi::c_uint);\nimpl cudnnForwardMode_t {\n    pub const CUDNN_FWD_MODE_INFERENCE: cudnnForwardMode_t = cudnnForwardMode_t(0);\n}\nimpl cudnnForwardMode_t {\n    pub const CUDNN_FWD_MODE_TRAINING: cudnnForwardMode_t = cudnnForwardMode_t(1);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnForwardMode_t(pub ::core::ffi::c_uint);\nimpl cudnnRNNMode_t {\n    pub const CUDNN_RNN_RELU: cudnnRNNMode_t = cudnnRNNMode_t(0);\n}\nimpl cudnnRNNMode_t {\n    pub const CUDNN_RNN_TANH: cudnnRNNMode_t = cudnnRNNMode_t(1);\n}\nimpl cudnnRNNMode_t {\n    pub const CUDNN_LSTM: cudnnRNNMode_t = cudnnRNNMode_t(2);\n}\nimpl cudnnRNNMode_t {\n    pub const CUDNN_GRU: cudnnRNNMode_t = cudnnRNNMode_t(3);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnRNNMode_t(pub ::core::ffi::c_uint);\nimpl cudnnRNNBiasMode_t {\n    pub const CUDNN_RNN_NO_BIAS: cudnnRNNBiasMode_t = cudnnRNNBiasMode_t(0);\n}\nimpl cudnnRNNBiasMode_t {\n    pub const CUDNN_RNN_SINGLE_INP_BIAS: cudnnRNNBiasMode_t = cudnnRNNBiasMode_t(1);\n}\nimpl cudnnRNNBiasMode_t {\n    pub const CUDNN_RNN_DOUBLE_BIAS: cudnnRNNBiasMode_t = cudnnRNNBiasMode_t(2);\n}\nimpl cudnnRNNBiasMode_t {\n    pub const CUDNN_RNN_SINGLE_REC_BIAS: cudnnRNNBiasMode_t = cudnnRNNBiasMode_t(3);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnRNNBiasMode_t(pub ::core::ffi::c_uint);\nimpl cudnnDirectionMode_t {\n    pub const CUDNN_UNIDIRECTIONAL: cudnnDirectionMode_t = cudnnDirectionMode_t(0);\n}\nimpl cudnnDirectionMode_t {\n    pub const CUDNN_BIDIRECTIONAL: cudnnDirectionMode_t = cudnnDirectionMode_t(1);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnDirectionMode_t(pub ::core::ffi::c_uint);\nimpl cudnnRNNInputMode_t {\n    pub const CUDNN_LINEAR_INPUT: cudnnRNNInputMode_t = cudnnRNNInputMode_t(0);\n}\nimpl cudnnRNNInputMode_t {\n    pub const CUDNN_SKIP_INPUT: cudnnRNNInputMode_t = cudnnRNNInputMode_t(1);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnRNNInputMode_t(pub ::core::ffi::c_uint);\nimpl cudnnRNNClipMode_t {\n    pub const CUDNN_RNN_CLIP_NONE: cudnnRNNClipMode_t = cudnnRNNClipMode_t(0);\n}\nimpl cudnnRNNClipMode_t {\n    pub const CUDNN_RNN_CLIP_MINMAX: cudnnRNNClipMode_t = cudnnRNNClipMode_t(1);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnRNNClipMode_t(pub ::core::ffi::c_uint);\nimpl cudnnRNNDataLayout_t {\n    pub const CUDNN_RNN_DATA_LAYOUT_SEQ_MAJOR_UNPACKED: cudnnRNNDataLayout_t = cudnnRNNDataLayout_t(\n        0,\n    );\n}\nimpl cudnnRNNDataLayout_t {\n    pub const CUDNN_RNN_DATA_LAYOUT_SEQ_MAJOR_PACKED: cudnnRNNDataLayout_t = cudnnRNNDataLayout_t(\n        1,\n    );\n}\nimpl cudnnRNNDataLayout_t {\n    pub const CUDNN_RNN_DATA_LAYOUT_BATCH_MAJOR_UNPACKED: cudnnRNNDataLayout_t = cudnnRNNDataLayout_t(\n        2,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnRNNDataLayout_t(pub ::core::ffi::c_uint);\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cudnnRNNStruct {\n    _unused: [u8; 0],\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cudnnRNNDataStruct {\n    _unused: [u8; 0],\n}\nimpl cudnnSeqDataAxis_t {\n    pub const CUDNN_SEQDATA_TIME_DIM: cudnnSeqDataAxis_t = cudnnSeqDataAxis_t(0);\n}\nimpl cudnnSeqDataAxis_t {\n    pub const CUDNN_SEQDATA_BATCH_DIM: cudnnSeqDataAxis_t = cudnnSeqDataAxis_t(1);\n}\nimpl cudnnSeqDataAxis_t {\n    pub const CUDNN_SEQDATA_BEAM_DIM: cudnnSeqDataAxis_t = cudnnSeqDataAxis_t(2);\n}\nimpl cudnnSeqDataAxis_t {\n    pub const CUDNN_SEQDATA_VECT_DIM: cudnnSeqDataAxis_t = cudnnSeqDataAxis_t(3);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnSeqDataAxis_t(pub ::core::ffi::c_uint);\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cudnnSeqDataStruct {\n    _unused: [u8; 0],\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cudnnAttnStruct {\n    _unused: [u8; 0],\n}\nimpl cudnnMultiHeadAttnWeightKind_t {\n    pub const CUDNN_MH_ATTN_Q_WEIGHTS: cudnnMultiHeadAttnWeightKind_t = cudnnMultiHeadAttnWeightKind_t(\n        0,\n    );\n}\nimpl cudnnMultiHeadAttnWeightKind_t {\n    pub const CUDNN_MH_ATTN_K_WEIGHTS: cudnnMultiHeadAttnWeightKind_t = cudnnMultiHeadAttnWeightKind_t(\n        1,\n    );\n}\nimpl cudnnMultiHeadAttnWeightKind_t {\n    pub const CUDNN_MH_ATTN_V_WEIGHTS: cudnnMultiHeadAttnWeightKind_t = cudnnMultiHeadAttnWeightKind_t(\n        2,\n    );\n}\nimpl cudnnMultiHeadAttnWeightKind_t {\n    pub const CUDNN_MH_ATTN_O_WEIGHTS: cudnnMultiHeadAttnWeightKind_t = cudnnMultiHeadAttnWeightKind_t(\n        3,\n    );\n}\nimpl cudnnMultiHeadAttnWeightKind_t {\n    pub const CUDNN_MH_ATTN_Q_BIASES: cudnnMultiHeadAttnWeightKind_t = cudnnMultiHeadAttnWeightKind_t(\n        4,\n    );\n}\nimpl cudnnMultiHeadAttnWeightKind_t {\n    pub const CUDNN_MH_ATTN_K_BIASES: cudnnMultiHeadAttnWeightKind_t = cudnnMultiHeadAttnWeightKind_t(\n        5,\n    );\n}\nimpl cudnnMultiHeadAttnWeightKind_t {\n    pub const CUDNN_MH_ATTN_V_BIASES: cudnnMultiHeadAttnWeightKind_t = cudnnMultiHeadAttnWeightKind_t(\n        6,\n    );\n}\nimpl cudnnMultiHeadAttnWeightKind_t {\n    pub const CUDNN_MH_ATTN_O_BIASES: cudnnMultiHeadAttnWeightKind_t = cudnnMultiHeadAttnWeightKind_t(\n        7,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnMultiHeadAttnWeightKind_t(pub ::core::ffi::c_uint);\nimpl cudnnWgradMode_t {\n    pub const CUDNN_WGRAD_MODE_ADD: cudnnWgradMode_t = cudnnWgradMode_t(0);\n}\nimpl cudnnWgradMode_t {\n    pub const CUDNN_WGRAD_MODE_SET: cudnnWgradMode_t = cudnnWgradMode_t(1);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnWgradMode_t(pub ::core::ffi::c_uint);\nimpl cudnnLossNormalizationMode_t {\n    pub const CUDNN_LOSS_NORMALIZATION_NONE: cudnnLossNormalizationMode_t = cudnnLossNormalizationMode_t(\n        0,\n    );\n}\nimpl cudnnLossNormalizationMode_t {\n    pub const CUDNN_LOSS_NORMALIZATION_SOFTMAX: cudnnLossNormalizationMode_t = cudnnLossNormalizationMode_t(\n        1,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnLossNormalizationMode_t(pub ::core::ffi::c_uint);\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cudnnConvolutionStruct {\n    _unused: [u8; 0],\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cudnnFusedOpsConstParamStruct {\n    _unused: [u8; 0],\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cudnnFusedOpsVariantParamStruct {\n    _unused: [u8; 0],\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cudnnFusedOpsPlanStruct {\n    _unused: [u8; 0],\n}\nimpl cudnnFusedOps_t {\n    pub const CUDNN_FUSED_SCALE_BIAS_ACTIVATION_CONV_BNSTATS: cudnnFusedOps_t = cudnnFusedOps_t(\n        0,\n    );\n}\nimpl cudnnFusedOps_t {\n    pub const CUDNN_FUSED_SCALE_BIAS_ACTIVATION_WGRAD: cudnnFusedOps_t = cudnnFusedOps_t(\n        1,\n    );\n}\nimpl cudnnFusedOps_t {\n    pub const CUDNN_FUSED_BN_FINALIZE_STATISTICS_TRAINING: cudnnFusedOps_t = cudnnFusedOps_t(\n        2,\n    );\n}\nimpl cudnnFusedOps_t {\n    pub const CUDNN_FUSED_BN_FINALIZE_STATISTICS_INFERENCE: cudnnFusedOps_t = cudnnFusedOps_t(\n        3,\n    );\n}\nimpl cudnnFusedOps_t {\n    pub const CUDNN_FUSED_CONV_SCALE_BIAS_ADD_ACTIVATION: cudnnFusedOps_t = cudnnFusedOps_t(\n        4,\n    );\n}\nimpl cudnnFusedOps_t {\n    pub const CUDNN_FUSED_SCALE_BIAS_ADD_ACTIVATION_GEN_BITMASK: cudnnFusedOps_t = cudnnFusedOps_t(\n        5,\n    );\n}\nimpl cudnnFusedOps_t {\n    pub const CUDNN_FUSED_DACTIVATION_FORK_DBATCHNORM: cudnnFusedOps_t = cudnnFusedOps_t(\n        6,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnFusedOps_t(pub ::core::ffi::c_uint);\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_XDESC: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        0,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_XDATA_PLACEHOLDER: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        1,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_BN_MODE: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        2,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_BN_EQSCALEBIAS_DESC: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        3,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_BN_EQSCALE_PLACEHOLDER: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        4,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_BN_EQBIAS_PLACEHOLDER: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        5,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_ACTIVATION_DESC: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        6,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_CONV_DESC: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        7,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_WDESC: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        8,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_WDATA_PLACEHOLDER: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        9,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_DWDESC: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        10,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_DWDATA_PLACEHOLDER: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        11,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_YDESC: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        12,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_YDATA_PLACEHOLDER: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        13,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_DYDESC: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        14,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_DYDATA_PLACEHOLDER: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        15,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_YSTATS_DESC: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        16,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_YSUM_PLACEHOLDER: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        17,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_YSQSUM_PLACEHOLDER: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        18,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_BN_SCALEBIAS_MEANVAR_DESC: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        19,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_BN_SCALE_PLACEHOLDER: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        20,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_BN_BIAS_PLACEHOLDER: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        21,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_BN_SAVED_MEAN_PLACEHOLDER: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        22,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_BN_SAVED_INVSTD_PLACEHOLDER: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        23,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_BN_RUNNING_MEAN_PLACEHOLDER: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        24,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_BN_RUNNING_VAR_PLACEHOLDER: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        25,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_ZDESC: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        26,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_ZDATA_PLACEHOLDER: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        27,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_BN_Z_EQSCALEBIAS_DESC: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        28,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_BN_Z_EQSCALE_PLACEHOLDER: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        29,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_BN_Z_EQBIAS_PLACEHOLDER: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        30,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_ACTIVATION_BITMASK_DESC: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        31,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_ACTIVATION_BITMASK_PLACEHOLDER: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        32,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_DXDESC: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        33,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_DXDATA_PLACEHOLDER: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        34,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_DZDESC: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        35,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_DZDATA_PLACEHOLDER: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        36,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_BN_DSCALE_PLACEHOLDER: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        37,\n    );\n}\nimpl cudnnFusedOpsConstParamLabel_t {\n    pub const CUDNN_PARAM_BN_DBIAS_PLACEHOLDER: cudnnFusedOpsConstParamLabel_t = cudnnFusedOpsConstParamLabel_t(\n        38,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnFusedOpsConstParamLabel_t(pub ::core::ffi::c_uint);\nimpl cudnnFusedOpsPointerPlaceHolder_t {\n    pub const CUDNN_PTR_NULL: cudnnFusedOpsPointerPlaceHolder_t = cudnnFusedOpsPointerPlaceHolder_t(\n        0,\n    );\n}\nimpl cudnnFusedOpsPointerPlaceHolder_t {\n    pub const CUDNN_PTR_ELEM_ALIGNED: cudnnFusedOpsPointerPlaceHolder_t = cudnnFusedOpsPointerPlaceHolder_t(\n        1,\n    );\n}\nimpl cudnnFusedOpsPointerPlaceHolder_t {\n    pub const CUDNN_PTR_16B_ALIGNED: cudnnFusedOpsPointerPlaceHolder_t = cudnnFusedOpsPointerPlaceHolder_t(\n        2,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnFusedOpsPointerPlaceHolder_t(pub ::core::ffi::c_uint);\nimpl cudnnFusedOpsVariantParamLabel_t {\n    pub const CUDNN_PTR_XDATA: cudnnFusedOpsVariantParamLabel_t = cudnnFusedOpsVariantParamLabel_t(\n        0,\n    );\n}\nimpl cudnnFusedOpsVariantParamLabel_t {\n    pub const CUDNN_PTR_BN_EQSCALE: cudnnFusedOpsVariantParamLabel_t = cudnnFusedOpsVariantParamLabel_t(\n        1,\n    );\n}\nimpl cudnnFusedOpsVariantParamLabel_t {\n    pub const CUDNN_PTR_BN_EQBIAS: cudnnFusedOpsVariantParamLabel_t = cudnnFusedOpsVariantParamLabel_t(\n        2,\n    );\n}\nimpl cudnnFusedOpsVariantParamLabel_t {\n    pub const CUDNN_PTR_WDATA: cudnnFusedOpsVariantParamLabel_t = cudnnFusedOpsVariantParamLabel_t(\n        3,\n    );\n}\nimpl cudnnFusedOpsVariantParamLabel_t {\n    pub const CUDNN_PTR_DWDATA: cudnnFusedOpsVariantParamLabel_t = cudnnFusedOpsVariantParamLabel_t(\n        4,\n    );\n}\nimpl cudnnFusedOpsVariantParamLabel_t {\n    pub const CUDNN_PTR_YDATA: cudnnFusedOpsVariantParamLabel_t = cudnnFusedOpsVariantParamLabel_t(\n        5,\n    );\n}\nimpl cudnnFusedOpsVariantParamLabel_t {\n    pub const CUDNN_PTR_DYDATA: cudnnFusedOpsVariantParamLabel_t = cudnnFusedOpsVariantParamLabel_t(\n        6,\n    );\n}\nimpl cudnnFusedOpsVariantParamLabel_t {\n    pub const CUDNN_PTR_YSUM: cudnnFusedOpsVariantParamLabel_t = cudnnFusedOpsVariantParamLabel_t(\n        7,\n    );\n}\nimpl cudnnFusedOpsVariantParamLabel_t {\n    pub const CUDNN_PTR_YSQSUM: cudnnFusedOpsVariantParamLabel_t = cudnnFusedOpsVariantParamLabel_t(\n        8,\n    );\n}\nimpl cudnnFusedOpsVariantParamLabel_t {\n    pub const CUDNN_PTR_WORKSPACE: cudnnFusedOpsVariantParamLabel_t = cudnnFusedOpsVariantParamLabel_t(\n        9,\n    );\n}\nimpl cudnnFusedOpsVariantParamLabel_t {\n    pub const CUDNN_PTR_BN_SCALE: cudnnFusedOpsVariantParamLabel_t = cudnnFusedOpsVariantParamLabel_t(\n        10,\n    );\n}\nimpl cudnnFusedOpsVariantParamLabel_t {\n    pub const CUDNN_PTR_BN_BIAS: cudnnFusedOpsVariantParamLabel_t = cudnnFusedOpsVariantParamLabel_t(\n        11,\n    );\n}\nimpl cudnnFusedOpsVariantParamLabel_t {\n    pub const CUDNN_PTR_BN_SAVED_MEAN: cudnnFusedOpsVariantParamLabel_t = cudnnFusedOpsVariantParamLabel_t(\n        12,\n    );\n}\nimpl cudnnFusedOpsVariantParamLabel_t {\n    pub const CUDNN_PTR_BN_SAVED_INVSTD: cudnnFusedOpsVariantParamLabel_t = cudnnFusedOpsVariantParamLabel_t(\n        13,\n    );\n}\nimpl cudnnFusedOpsVariantParamLabel_t {\n    pub const CUDNN_PTR_BN_RUNNING_MEAN: cudnnFusedOpsVariantParamLabel_t = cudnnFusedOpsVariantParamLabel_t(\n        14,\n    );\n}\nimpl cudnnFusedOpsVariantParamLabel_t {\n    pub const CUDNN_PTR_BN_RUNNING_VAR: cudnnFusedOpsVariantParamLabel_t = cudnnFusedOpsVariantParamLabel_t(\n        15,\n    );\n}\nimpl cudnnFusedOpsVariantParamLabel_t {\n    pub const CUDNN_PTR_ZDATA: cudnnFusedOpsVariantParamLabel_t = cudnnFusedOpsVariantParamLabel_t(\n        16,\n    );\n}\nimpl cudnnFusedOpsVariantParamLabel_t {\n    pub const CUDNN_PTR_BN_Z_EQSCALE: cudnnFusedOpsVariantParamLabel_t = cudnnFusedOpsVariantParamLabel_t(\n        17,\n    );\n}\nimpl cudnnFusedOpsVariantParamLabel_t {\n    pub const CUDNN_PTR_BN_Z_EQBIAS: cudnnFusedOpsVariantParamLabel_t = cudnnFusedOpsVariantParamLabel_t(\n        18,\n    );\n}\nimpl cudnnFusedOpsVariantParamLabel_t {\n    pub const CUDNN_PTR_ACTIVATION_BITMASK: cudnnFusedOpsVariantParamLabel_t = cudnnFusedOpsVariantParamLabel_t(\n        19,\n    );\n}\nimpl cudnnFusedOpsVariantParamLabel_t {\n    pub const CUDNN_PTR_DXDATA: cudnnFusedOpsVariantParamLabel_t = cudnnFusedOpsVariantParamLabel_t(\n        20,\n    );\n}\nimpl cudnnFusedOpsVariantParamLabel_t {\n    pub const CUDNN_PTR_DZDATA: cudnnFusedOpsVariantParamLabel_t = cudnnFusedOpsVariantParamLabel_t(\n        21,\n    );\n}\nimpl cudnnFusedOpsVariantParamLabel_t {\n    pub const CUDNN_PTR_BN_DSCALE: cudnnFusedOpsVariantParamLabel_t = cudnnFusedOpsVariantParamLabel_t(\n        22,\n    );\n}\nimpl cudnnFusedOpsVariantParamLabel_t {\n    pub const CUDNN_PTR_BN_DBIAS: cudnnFusedOpsVariantParamLabel_t = cudnnFusedOpsVariantParamLabel_t(\n        23,\n    );\n}\nimpl cudnnFusedOpsVariantParamLabel_t {\n    pub const CUDNN_SCALAR_SIZE_T_WORKSPACE_SIZE_IN_BYTES: cudnnFusedOpsVariantParamLabel_t = cudnnFusedOpsVariantParamLabel_t(\n        100,\n    );\n}\nimpl cudnnFusedOpsVariantParamLabel_t {\n    pub const CUDNN_SCALAR_INT64_T_BN_ACCUMULATION_COUNT: cudnnFusedOpsVariantParamLabel_t = cudnnFusedOpsVariantParamLabel_t(\n        101,\n    );\n}\nimpl cudnnFusedOpsVariantParamLabel_t {\n    pub const CUDNN_SCALAR_DOUBLE_BN_EXP_AVG_FACTOR: cudnnFusedOpsVariantParamLabel_t = cudnnFusedOpsVariantParamLabel_t(\n        102,\n    );\n}\nimpl cudnnFusedOpsVariantParamLabel_t {\n    pub const CUDNN_SCALAR_DOUBLE_BN_EPSILON: cudnnFusedOpsVariantParamLabel_t = cudnnFusedOpsVariantParamLabel_t(\n        103,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnFusedOpsVariantParamLabel_t(pub ::core::ffi::c_uint);\n"
  },
  {
    "path": "cuda_types/src/cudnn8.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\npub type __half = u16;\npub type __nv_bfloat16 = u16;\npub use super::cuda::cuComplex;\npub use super::cuda::cuDoubleComplex;\npub use super::cuda::cudaDataType;\npub use super::cuda::cudaDataType_t;\npub type cudaStream_t = super::cuda::CUstream;\npub use super::cuda::libraryPropertyType;\npub type cudaGraphExecUpdateResultInfo_st = super::cuda::CUgraphExecUpdateResultInfo_st;\npub type cudaAsyncNotificationType = super::cuda::CUasyncNotificationType_enum;\npub type cudaGraph_t = super::cuda::CUgraph;\npub const CUDNN_MAJOR: u32 = 8;\npub const CUDNN_MINOR: u32 = 9;\npub const CUDNN_PATCHLEVEL: u32 = 7;\npub const CUDNN_VERSION: u32 = 8907;\npub const CUDNN_MAX_SM_MAJOR_NUMBER: u32 = 9;\npub const CUDNN_MAX_SM_MINOR_NUMBER: u32 = 0;\npub const CUDNN_MAX_DEVICE_VERSION: u32 = 900;\npub const CUDNN_SM_50: u32 = 500;\npub const CUDNN_SM_52: u32 = 520;\npub const CUDNN_SM_53: u32 = 530;\npub const CUDNN_SM_60: u32 = 600;\npub const CUDNN_SM_61: u32 = 610;\npub const CUDNN_SM_62: u32 = 620;\npub const CUDNN_SM_70: u32 = 700;\npub const CUDNN_SM_72: u32 = 720;\npub const CUDNN_SM_75: u32 = 750;\npub const CUDNN_SM_80: u32 = 800;\npub const CUDNN_SM_86: u32 = 860;\npub const CUDNN_SM_87: u32 = 870;\npub const CUDNN_SM_89: u32 = 890;\npub const CUDNN_SM_90: u32 = 900;\npub const CUDNN_SM_9X_END: u32 = 999;\npub const CUDNN_MIN_DEVICE_VERSION: u32 = 500;\npub const CUDNN_OPS_INFER_MAJOR: u32 = 8;\npub const CUDNN_OPS_INFER_MINOR: u32 = 9;\npub const CUDNN_OPS_INFER_PATCH: u32 = 7;\npub const CUDNN_DIM_MAX: u32 = 8;\npub const CUDNN_LRN_MIN_N: u32 = 1;\npub const CUDNN_LRN_MAX_N: u32 = 16;\npub const CUDNN_LRN_MIN_K: f64 = 0.00001;\npub const CUDNN_LRN_MIN_BETA: f64 = 0.01;\npub const CUDNN_BN_MIN_EPSILON: f64 = 0.0;\npub const CUDNN_OPS_TRAIN_MAJOR: u32 = 8;\npub const CUDNN_OPS_TRAIN_MINOR: u32 = 9;\npub const CUDNN_OPS_TRAIN_PATCH: u32 = 7;\npub const CUDNN_ADV_INFER_MAJOR: u32 = 8;\npub const CUDNN_ADV_INFER_MINOR: u32 = 9;\npub const CUDNN_ADV_INFER_PATCH: u32 = 7;\npub const CUDNN_RNN_PADDED_IO_DISABLED: u32 = 0;\npub const CUDNN_RNN_PADDED_IO_ENABLED: u32 = 1;\npub const CUDNN_SEQDATA_DIM_COUNT: u32 = 4;\npub const CUDNN_ATTN_QUERYMAP_ALL_TO_ONE: u32 = 0;\npub const CUDNN_ATTN_QUERYMAP_ONE_TO_ONE: u32 = 1;\npub const CUDNN_ATTN_DISABLE_PROJ_BIASES: u32 = 0;\npub const CUDNN_ATTN_ENABLE_PROJ_BIASES: u32 = 2;\npub const CUDNN_ATTN_WKIND_COUNT: u32 = 8;\npub const CUDNN_ADV_TRAIN_MAJOR: u32 = 8;\npub const CUDNN_ADV_TRAIN_MINOR: u32 = 9;\npub const CUDNN_ADV_TRAIN_PATCH: u32 = 7;\npub const CUDNN_CNN_INFER_MAJOR: u32 = 8;\npub const CUDNN_CNN_INFER_MINOR: u32 = 9;\npub const CUDNN_CNN_INFER_PATCH: u32 = 7;\npub const CUDNN_CNN_TRAIN_MAJOR: u32 = 8;\npub const CUDNN_CNN_TRAIN_MINOR: u32 = 9;\npub const CUDNN_CNN_TRAIN_PATCH: u32 = 7;\npub use super::cudnn::cudnnContext;\npub type cudnnHandle_t = *mut cudnnContext;\npub use super::cudnn::cudnnRuntimeTag_t;\npub use super::cudnn::cudnnErrQueryMode_t;\npub use super::cudnn::cudnnTensorStruct;\npub type cudnnTensorDescriptor_t = *mut cudnnTensorStruct;\npub use super::cudnn::cudnnPoolingStruct;\npub type cudnnPoolingDescriptor_t = *mut cudnnPoolingStruct;\npub use super::cudnn::cudnnFilterStruct;\npub type cudnnFilterDescriptor_t = *mut cudnnFilterStruct;\npub use super::cudnn::cudnnLRNStruct;\npub type cudnnLRNDescriptor_t = *mut cudnnLRNStruct;\npub use super::cudnn::cudnnActivationStruct;\npub type cudnnActivationDescriptor_t = *mut cudnnActivationStruct;\npub use super::cudnn::cudnnSpatialTransformerStruct;\npub type cudnnSpatialTransformerDescriptor_t = *mut cudnnSpatialTransformerStruct;\npub use super::cudnn::cudnnOpTensorStruct;\npub type cudnnOpTensorDescriptor_t = *mut cudnnOpTensorStruct;\npub use super::cudnn::cudnnReduceTensorStruct;\npub type cudnnReduceTensorDescriptor_t = *mut cudnnReduceTensorStruct;\npub use super::cudnn::cudnnCTCLossStruct;\npub type cudnnCTCLossDescriptor_t = *mut cudnnCTCLossStruct;\npub use super::cudnn::cudnnTensorTransformStruct;\npub type cudnnTensorTransformDescriptor_t = *mut cudnnTensorTransformStruct;\npub use super::cudnn9::cudnnDataType_t;\npub use super::cudnn::cudnnMathType_t;\npub use super::cudnn::cudnnNanPropagation_t;\npub use super::cudnn::cudnnDeterminism_t;\npub use super::cudnn::cudnnTensorFormat_t;\npub use super::cudnn::cudnnFoldingDirection_t;\npub use super::cudnn::cudnnOpTensorOp_t;\npub use super::cudnn::cudnnReduceTensorOp_t;\npub use super::cudnn::cudnnReduceTensorIndices_t;\npub use super::cudnn::cudnnIndicesType_t;\npub use super::cudnn::cudnnSoftmaxAlgorithm_t;\npub use super::cudnn::cudnnSoftmaxMode_t;\npub use super::cudnn::cudnnPoolingMode_t;\npub use super::cudnn::cudnnActivationMode_t;\npub use super::cudnn::cudnnLRNMode_t;\npub use super::cudnn::cudnnDivNormMode_t;\npub use super::cudnn::cudnnBatchNormMode_t;\npub use super::cudnn::cudnnBatchNormOps_t;\npub use super::cudnn::cudnnNormMode_t;\npub use super::cudnn::cudnnNormAlgo_t;\npub use super::cudnn::cudnnNormOps_t;\npub use super::cudnn::cudnnSamplerType_t;\npub use super::cudnn::cudnnDropoutStruct;\npub type cudnnDropoutDescriptor_t = *mut cudnnDropoutStruct;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cudnnAlgorithmStruct {\n    _unused: [u8; 0],\n}\npub type cudnnAlgorithmDescriptor_t = *mut cudnnAlgorithmStruct;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cudnnAlgorithmPerformanceStruct {\n    _unused: [u8; 0],\n}\npub type cudnnAlgorithmPerformance_t = *mut cudnnAlgorithmPerformanceStruct;\npub use super::cudnn::cudnnConvolutionFwdAlgo_t;\npub use super::cudnn::cudnnConvolutionBwdFilterAlgo_t;\npub use super::cudnn::cudnnConvolutionBwdDataAlgo_t;\npub use super::cudnn::cudnnRNNAlgo_t;\npub use super::cudnn::cudnnCTCLossAlgo_t;\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct cudnnAlgorithmUnionStruct {\n    pub algo: cudnnAlgorithmUnionStruct_Algorithm,\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union cudnnAlgorithmUnionStruct_Algorithm {\n    pub convFwdAlgo: cudnnConvolutionFwdAlgo_t,\n    pub convBwdFilterAlgo: cudnnConvolutionBwdFilterAlgo_t,\n    pub convBwdDataAlgo: cudnnConvolutionBwdDataAlgo_t,\n    pub RNNAlgo: cudnnRNNAlgo_t,\n    pub CTCLossAlgo: cudnnCTCLossAlgo_t,\n}\npub type cudnnAlgorithm_t = cudnnAlgorithmUnionStruct;\npub use super::cudnn::cudnnSeverity_t;\n#[repr(C)]\npub struct cudnnDebugStruct {\n    pub cudnn_version: ::core::ffi::c_uint,\n    pub cudnnStatus: cudnnStatus_t,\n    pub time_sec: ::core::ffi::c_uint,\n    pub time_usec: ::core::ffi::c_uint,\n    pub time_delta: ::core::ffi::c_uint,\n    pub handle: cudnnHandle_t,\n    pub stream: cudaStream_t,\n    pub pid: ::core::ffi::c_ulonglong,\n    pub tid: ::core::ffi::c_ulonglong,\n    pub cudaDeviceId: ::core::ffi::c_int,\n    pub reserved: [::core::ffi::c_int; 15usize],\n}\npub type cudnnDebug_t = cudnnDebugStruct;\npub type cudnnCallback_t = ::core::option::Option<\n    unsafe extern \"C\" fn(\n        sev: cudnnSeverity_t,\n        udata: *mut ::core::ffi::c_void,\n        dbg: *const cudnnDebug_t,\n        msg: *const ::core::ffi::c_char,\n    ),\n>;\npub use super::cudnn::cudnnForwardMode_t;\npub use super::cudnn::cudnnRNNMode_t;\npub use super::cudnn::cudnnRNNBiasMode_t;\npub use super::cudnn::cudnnDirectionMode_t;\npub use super::cudnn::cudnnRNNInputMode_t;\npub use super::cudnn::cudnnRNNClipMode_t;\npub use super::cudnn::cudnnRNNDataLayout_t;\npub type cudnnRNNPaddingMode_t = ::core::ffi::c_uint;\npub use super::cudnn::cudnnRNNStruct;\npub type cudnnRNNDescriptor_t = *mut cudnnRNNStruct;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cudnnPersistentRNNPlan {\n    _unused: [u8; 0],\n}\npub type cudnnPersistentRNNPlan_t = *mut cudnnPersistentRNNPlan;\npub use super::cudnn::cudnnRNNDataStruct;\npub type cudnnRNNDataDescriptor_t = *mut cudnnRNNDataStruct;\npub use super::cudnn::cudnnSeqDataAxis_t;\npub use super::cudnn::cudnnSeqDataStruct;\npub type cudnnSeqDataDescriptor_t = *mut cudnnSeqDataStruct;\npub type cudnnAttnQueryMap_t = ::core::ffi::c_uint;\npub use super::cudnn::cudnnAttnStruct;\npub type cudnnAttnDescriptor_t = *mut cudnnAttnStruct;\npub use super::cudnn::cudnnMultiHeadAttnWeightKind_t;\npub use super::cudnn::cudnnWgradMode_t;\npub use super::cudnn::cudnnLossNormalizationMode_t;\npub use super::cudnn::cudnnConvolutionStruct;\npub type cudnnConvolutionDescriptor_t = *mut cudnnConvolutionStruct;\npub use super::cudnn::cudnnConvolutionMode_t;\npub use super::cudnn::cudnnReorderType_t;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, PartialEq)]\npub struct cudnnConvolutionFwdAlgoPerfStruct {\n    pub algo: cudnnConvolutionFwdAlgo_t,\n    pub status: cudnnStatus_t,\n    pub time: f32,\n    pub memory: usize,\n    pub determinism: cudnnDeterminism_t,\n    pub mathType: cudnnMathType_t,\n    pub reserved: [::core::ffi::c_int; 3usize],\n}\npub type cudnnConvolutionFwdAlgoPerf_t = cudnnConvolutionFwdAlgoPerfStruct;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, PartialEq)]\npub struct cudnnConvolutionBwdDataAlgoPerfStruct {\n    pub algo: cudnnConvolutionBwdDataAlgo_t,\n    pub status: cudnnStatus_t,\n    pub time: f32,\n    pub memory: usize,\n    pub determinism: cudnnDeterminism_t,\n    pub mathType: cudnnMathType_t,\n    pub reserved: [::core::ffi::c_int; 3usize],\n}\npub type cudnnConvolutionBwdDataAlgoPerf_t = cudnnConvolutionBwdDataAlgoPerfStruct;\npub use super::cudnn::cudnnFusedOpsConstParamStruct;\npub type cudnnFusedOpsConstParamPack_t = *mut cudnnFusedOpsConstParamStruct;\npub use super::cudnn::cudnnFusedOpsVariantParamStruct;\npub type cudnnFusedOpsVariantParamPack_t = *mut cudnnFusedOpsVariantParamStruct;\npub use super::cudnn::cudnnFusedOpsPlanStruct;\npub type cudnnFusedOpsPlan_t = *mut cudnnFusedOpsPlanStruct;\npub use super::cudnn::cudnnFusedOps_t;\npub use super::cudnn::cudnnFusedOpsConstParamLabel_t;\npub use super::cudnn::cudnnFusedOpsPointerPlaceHolder_t;\npub use super::cudnn::cudnnFusedOpsVariantParamLabel_t;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, PartialEq)]\npub struct cudnnConvolutionBwdFilterAlgoPerfStruct {\n    pub algo: cudnnConvolutionBwdFilterAlgo_t,\n    pub status: cudnnStatus_t,\n    pub time: f32,\n    pub memory: usize,\n    pub determinism: cudnnDeterminism_t,\n    pub mathType: cudnnMathType_t,\n    pub reserved: [::core::ffi::c_int; 3usize],\n}\npub type cudnnConvolutionBwdFilterAlgoPerf_t = cudnnConvolutionBwdFilterAlgoPerfStruct;\npub type cudnnBackendDescriptor_t = *mut ::core::ffi::c_void;\npub use super::cudnn::cudnnFractionStruct;\npub type cudnnFraction_t = cudnnFractionStruct;\npub use super::cudnn9::cudnnPointwiseMode_t;\npub use super::cudnn::cudnnResampleMode_t;\npub use super::cudnn::cudnnSignalMode_t;\npub use super::cudnn::cudnnGenStatsMode_t;\npub use super::cudnn::cudnnBnFinalizeStatsMode_t;\npub use super::cudnn::cudnnRngDistribution_t;\npub use super::cudnn9::cudnnBackendAttributeName_t;\npub use super::cudnn::cudnnBackendAttributeType_t;\npub use super::cudnn9::cudnnBackendDescriptorType_t;\nimpl cudnnBackendNumericalNote_t {\n    pub const CUDNN_NUMERICAL_NOTE_TENSOR_CORE: cudnnBackendNumericalNote_t = cudnnBackendNumericalNote_t(\n        0,\n    );\n}\nimpl cudnnBackendNumericalNote_t {\n    pub const CUDNN_NUMERICAL_NOTE_DOWN_CONVERT_INPUTS: cudnnBackendNumericalNote_t = cudnnBackendNumericalNote_t(\n        1,\n    );\n}\nimpl cudnnBackendNumericalNote_t {\n    pub const CUDNN_NUMERICAL_NOTE_REDUCED_PRECISION_REDUCTION: cudnnBackendNumericalNote_t = cudnnBackendNumericalNote_t(\n        2,\n    );\n}\nimpl cudnnBackendNumericalNote_t {\n    pub const CUDNN_NUMERICAL_NOTE_FFT: cudnnBackendNumericalNote_t = cudnnBackendNumericalNote_t(\n        3,\n    );\n}\nimpl cudnnBackendNumericalNote_t {\n    pub const CUDNN_NUMERICAL_NOTE_NONDETERMINISTIC: cudnnBackendNumericalNote_t = cudnnBackendNumericalNote_t(\n        4,\n    );\n}\nimpl cudnnBackendNumericalNote_t {\n    pub const CUDNN_NUMERICAL_NOTE_WINOGRAD: cudnnBackendNumericalNote_t = cudnnBackendNumericalNote_t(\n        5,\n    );\n}\nimpl cudnnBackendNumericalNote_t {\n    pub const CUDNN_NUMERICAL_NOTE_WINOGRAD_TILE_4x4: cudnnBackendNumericalNote_t = cudnnBackendNumericalNote_t(\n        6,\n    );\n}\nimpl cudnnBackendNumericalNote_t {\n    pub const CUDNN_NUMERICAL_NOTE_WINOGRAD_TILE_6x6: cudnnBackendNumericalNote_t = cudnnBackendNumericalNote_t(\n        7,\n    );\n}\nimpl cudnnBackendNumericalNote_t {\n    pub const CUDNN_NUMERICAL_NOTE_WINOGRAD_TILE_13x13: cudnnBackendNumericalNote_t = cudnnBackendNumericalNote_t(\n        8,\n    );\n}\nimpl cudnnBackendNumericalNote_t {\n    pub const CUDNN_NUMERICAL_NOTE_TYPE_COUNT: cudnnBackendNumericalNote_t = cudnnBackendNumericalNote_t(\n        9,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnBackendNumericalNote_t(pub ::core::ffi::c_uint);\nimpl cudnnBackendBehaviorNote_t {\n    pub const CUDNN_BEHAVIOR_NOTE_RUNTIME_COMPILATION: cudnnBackendBehaviorNote_t = cudnnBackendBehaviorNote_t(\n        0,\n    );\n}\nimpl cudnnBackendBehaviorNote_t {\n    pub const CUDNN_BEHAVIOR_NOTE_REQUIRES_FILTER_INT8x32_REORDER: cudnnBackendBehaviorNote_t = cudnnBackendBehaviorNote_t(\n        1,\n    );\n}\nimpl cudnnBackendBehaviorNote_t {\n    pub const CUDNN_BEHAVIOR_NOTE_REQUIRES_BIAS_INT8x32_REORDER: cudnnBackendBehaviorNote_t = cudnnBackendBehaviorNote_t(\n        2,\n    );\n}\nimpl cudnnBackendBehaviorNote_t {\n    pub const CUDNN_BEHAVIOR_NOTE_TYPE_COUNT: cudnnBackendBehaviorNote_t = cudnnBackendBehaviorNote_t(\n        3,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnBackendBehaviorNote_t(pub ::core::ffi::c_uint);\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_SPLIT_K: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        0,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_SWIZZLE: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        1,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_TILE_SIZE: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        2,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_USE_TEX: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        3,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_EDGE: cudnnBackendKnobType_t = cudnnBackendKnobType_t(4);\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_KBLOCK: cudnnBackendKnobType_t = cudnnBackendKnobType_t(5);\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_LDGA: cudnnBackendKnobType_t = cudnnBackendKnobType_t(6);\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_LDGB: cudnnBackendKnobType_t = cudnnBackendKnobType_t(7);\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_CHUNK_K: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        8,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_SPLIT_H: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        9,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_WINO_TILE: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        10,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_MULTIPLY: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        11,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_SPLIT_K_BUF: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        12,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_TILEK: cudnnBackendKnobType_t = cudnnBackendKnobType_t(13);\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_STAGES: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        14,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_REDUCTION_MODE: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        15,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_CTA_SPLIT_K_MODE: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        16,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_SPLIT_K_SLC: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        17,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_IDX_MODE: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        18,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_SLICED: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        19,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_SPLIT_RS: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        20,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_SINGLEBUFFER: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        21,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_LDGC: cudnnBackendKnobType_t = cudnnBackendKnobType_t(22);\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_SPECFILT: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        23,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_KERNEL_CFG: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        24,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_WORKSPACE: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        25,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_TILE_CGA: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        26,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_TILE_CGA_M: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        27,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_TILE_CGA_N: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        28,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_BLOCK_SIZE: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        29,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_OCCUPANCY: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        30,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_ARRAY_SIZE_PER_THREAD: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        31,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_NUM_C_PER_BLOCK: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        32,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_SPLIT_COLS: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        33,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_TILE_ROWS: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        34,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_TILE_COLS: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        35,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_LOAD_SIZE: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        36,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_COUNTS: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        37,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnBackendKnobType_t(pub ::core::ffi::c_uint);\npub use super::cudnn::cudnnBackendLayoutType_t;\npub use super::cudnn::cudnnBackendHeurMode_t;\npub use super::cudnn9::cudnnBackendTensorReordering_t;\npub use super::cudnn::cudnnPaddingMode_t;\npub use super::cudnn9::cudnnBackendNormMode_t;\npub use super::cudnn::cudnnBackendNormFwdPhase_t;\nimpl cudnnError_t {\n    pub const r#NOT_INITIALIZED: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(1)\n    });\n    pub const r#ALLOC_FAILED: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(2)\n    });\n    pub const r#BAD_PARAM: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3)\n    });\n    pub const r#INTERNAL_ERROR: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(4)\n    });\n    pub const r#INVALID_VALUE: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(5)\n    });\n    pub const r#ARCH_MISMATCH: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(6)\n    });\n    pub const r#MAPPING_ERROR: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(7)\n    });\n    pub const r#EXECUTION_FAILED: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(8)\n    });\n    pub const r#NOT_SUPPORTED: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(9)\n    });\n    pub const r#LICENSE_ERROR: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(10)\n    });\n    pub const r#RUNTIME_PREREQUISITE_MISSING: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(11)\n    });\n    pub const r#RUNTIME_IN_PROGRESS: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(12)\n    });\n    pub const r#RUNTIME_FP_OVERFLOW: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(13)\n    });\n    pub const r#VERSION_MISMATCH: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(14)\n    });\n}\n#[repr(transparent)]\n#[derive(Debug, Hash, Copy, Clone, PartialEq, Eq)]\npub struct cudnnError_t(pub ::core::num::NonZeroU32);\npub trait cudnnStatus_tConsts {\n    const SUCCESS: cudnnStatus_t = cudnnStatus_t::Ok(());\n    const ERROR_NOT_INITIALIZED: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#NOT_INITIALIZED,\n    );\n    const ERROR_ALLOC_FAILED: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#ALLOC_FAILED,\n    );\n    const ERROR_BAD_PARAM: cudnnStatus_t = cudnnStatus_t::Err(cudnnError_t::r#BAD_PARAM);\n    const ERROR_INTERNAL_ERROR: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#INTERNAL_ERROR,\n    );\n    const ERROR_INVALID_VALUE: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#INVALID_VALUE,\n    );\n    const ERROR_ARCH_MISMATCH: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#ARCH_MISMATCH,\n    );\n    const ERROR_MAPPING_ERROR: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#MAPPING_ERROR,\n    );\n    const ERROR_EXECUTION_FAILED: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#EXECUTION_FAILED,\n    );\n    const ERROR_NOT_SUPPORTED: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#NOT_SUPPORTED,\n    );\n    const ERROR_LICENSE_ERROR: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#LICENSE_ERROR,\n    );\n    const ERROR_RUNTIME_PREREQUISITE_MISSING: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#RUNTIME_PREREQUISITE_MISSING,\n    );\n    const ERROR_RUNTIME_IN_PROGRESS: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#RUNTIME_IN_PROGRESS,\n    );\n    const ERROR_RUNTIME_FP_OVERFLOW: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#RUNTIME_FP_OVERFLOW,\n    );\n    const ERROR_VERSION_MISMATCH: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#VERSION_MISMATCH,\n    );\n}\nimpl cudnnStatus_tConsts for cudnnStatus_t {}\n#[must_use]\npub type cudnnStatus_t = ::core::result::Result<(), cudnnError_t>;\nconst _: fn() = || {\n    let _ = std::mem::transmute::<cudnnStatus_t, u32>;\n};\n\nimpl From<crate::cudnn9::cudnnError_t> for cudnnError_t {\n    fn from(err: crate::cudnn9::cudnnError_t) -> Self {\n        match err {\n            crate::cudnn9::cudnnError_t::NOT_INITIALIZED => {\n                crate::cudnn8::cudnnError_t::NOT_INITIALIZED\n            }\n            crate::cudnn9::cudnnError_t::ALLOC_FAILED => {\n                crate::cudnn8::cudnnError_t::ALLOC_FAILED\n            }\n            crate::cudnn9::cudnnError_t::BAD_PARAM => {\n                crate::cudnn8::cudnnError_t::BAD_PARAM\n            }\n            crate::cudnn9::cudnnError_t::INTERNAL_ERROR => {\n                crate::cudnn8::cudnnError_t::INTERNAL_ERROR\n            }\n            crate::cudnn9::cudnnError_t::INVALID_VALUE => {\n                crate::cudnn8::cudnnError_t::INVALID_VALUE\n            }\n            crate::cudnn9::cudnnError_t::ARCH_MISMATCH => {\n                crate::cudnn8::cudnnError_t::ARCH_MISMATCH\n            }\n            crate::cudnn9::cudnnError_t::MAPPING_ERROR => {\n                crate::cudnn8::cudnnError_t::MAPPING_ERROR\n            }\n            crate::cudnn9::cudnnError_t::EXECUTION_FAILED => {\n                crate::cudnn8::cudnnError_t::EXECUTION_FAILED\n            }\n            crate::cudnn9::cudnnError_t::NOT_SUPPORTED => {\n                crate::cudnn8::cudnnError_t::NOT_SUPPORTED\n            }\n            crate::cudnn9::cudnnError_t::LICENSE_ERROR => {\n                crate::cudnn8::cudnnError_t::LICENSE_ERROR\n            }\n            crate::cudnn9::cudnnError_t::RUNTIME_PREREQUISITE_MISSING => {\n                crate::cudnn8::cudnnError_t::RUNTIME_PREREQUISITE_MISSING\n            }\n            crate::cudnn9::cudnnError_t::RUNTIME_IN_PROGRESS => {\n                crate::cudnn8::cudnnError_t::RUNTIME_IN_PROGRESS\n            }\n            crate::cudnn9::cudnnError_t::RUNTIME_FP_OVERFLOW => {\n                crate::cudnn8::cudnnError_t::RUNTIME_FP_OVERFLOW\n            }\n            crate::cudnn9::cudnnError_t::VERSION_MISMATCH => {\n                crate::cudnn8::cudnnError_t::VERSION_MISMATCH\n            }\n            _ => crate::cudnn8::cudnnError_t::INTERNAL_ERROR,\n        }\n    }\n}\nimpl From<miopen_sys::miopenError_t> for cudnnError_t {\n    fn from(error: miopen_sys::miopenError_t) -> Self {\n        match error {\n            miopen_sys::miopenError_t::NotInitialized => cudnnError_t::NOT_INITIALIZED,\n            miopen_sys::miopenError_t::InvalidValue => cudnnError_t::INVALID_VALUE,\n            miopen_sys::miopenError_t::BadParm => cudnnError_t::BAD_PARAM,\n            miopen_sys::miopenError_t::AllocFailed => cudnnError_t::ALLOC_FAILED,\n            miopen_sys::miopenError_t::InternalError => cudnnError_t::INTERNAL_ERROR,\n            miopen_sys::miopenError_t::NotImplemented | miopen_sys::miopenError_t::UnsupportedOp => cudnnError_t::NOT_SUPPORTED,\n            miopen_sys::miopenError_t::VersionMismatch => cudnnError_t::VERSION_MISMATCH,\n            _ => cudnnError_t::INTERNAL_ERROR,\n        }\n    }\n}"
  },
  {
    "path": "cuda_types/src/cudnn9.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\npub type __half = u16;\npub type __nv_bfloat16 = u16;\npub use super::cuda::cuComplex;\npub use super::cuda::cuDoubleComplex;\npub use super::cuda::cudaDataType;\npub use super::cuda::cudaDataType_t;\npub type cudaStream_t = super::cuda::CUstream;\npub use super::cuda::libraryPropertyType;\npub type cudaGraphExecUpdateResultInfo_st = super::cuda::CUgraphExecUpdateResultInfo_st;\npub type cudaAsyncNotificationType = super::cuda::CUasyncNotificationType_enum;\npub type cudaGraph_t = super::cuda::CUgraph;\npub const CUDNN_MAJOR: u32 = 9;\npub const CUDNN_MINOR: u32 = 13;\npub const CUDNN_PATCHLEVEL: u32 = 1;\npub const CUDNN_VERSION: u32 = 91301;\npub const CUDNN_MAX_SM_MAJOR_NUMBER: u32 = 12;\npub const CUDNN_MAX_SM_MINOR_NUMBER: u32 = 1;\npub const CUDNN_MAX_DEVICE_VERSION: u32 = 1210;\npub const CUDNN_GRAPH_MAJOR: u32 = 9;\npub const CUDNN_GRAPH_MINOR: u32 = 13;\npub const CUDNN_GRAPH_PATCH: u32 = 1;\npub const CUDNN_DIM_MAX: u32 = 8;\npub const CUDNN_OPS_MAJOR: u32 = 9;\npub const CUDNN_OPS_MINOR: u32 = 13;\npub const CUDNN_OPS_PATCH: u32 = 1;\npub const CUDNN_LRN_MIN_N: u32 = 1;\npub const CUDNN_LRN_MAX_N: u32 = 16;\npub const CUDNN_LRN_MIN_K: f64 = 0.00001;\npub const CUDNN_LRN_MIN_BETA: f64 = 0.01;\npub const CUDNN_BN_MIN_EPSILON: f64 = 0.0;\npub const CUDNN_ADV_MAJOR: u32 = 9;\npub const CUDNN_ADV_MINOR: u32 = 13;\npub const CUDNN_ADV_PATCH: u32 = 1;\npub const CUDNN_RNN_PADDED_IO_DISABLED: u32 = 0;\npub const CUDNN_RNN_PADDED_IO_ENABLED: u32 = 1;\npub const CUDNN_SEQDATA_DIM_COUNT: u32 = 4;\npub const CUDNN_ATTN_QUERYMAP_ALL_TO_ONE: u32 = 0;\npub const CUDNN_ATTN_QUERYMAP_ONE_TO_ONE: u32 = 1;\npub const CUDNN_ATTN_DISABLE_PROJ_BIASES: u32 = 0;\npub const CUDNN_ATTN_ENABLE_PROJ_BIASES: u32 = 2;\npub const CUDNN_ATTN_WKIND_COUNT: u32 = 8;\npub const CUDNN_CNN_MAJOR: u32 = 9;\npub const CUDNN_CNN_MINOR: u32 = 13;\npub const CUDNN_CNN_PATCH: u32 = 1;\npub use super::cudnn::cudnnContext;\npub type cudnnHandle_t = *mut cudnnContext;\npub use super::cudnn::cudnnRuntimeTag_t;\npub use super::cudnn::cudnnErrQueryMode_t;\nimpl cudnnDataType_t {\n    pub const CUDNN_DATA_FLOAT: cudnnDataType_t = cudnnDataType_t(0);\n}\nimpl cudnnDataType_t {\n    pub const CUDNN_DATA_DOUBLE: cudnnDataType_t = cudnnDataType_t(1);\n}\nimpl cudnnDataType_t {\n    pub const CUDNN_DATA_HALF: cudnnDataType_t = cudnnDataType_t(2);\n}\nimpl cudnnDataType_t {\n    pub const CUDNN_DATA_INT8: cudnnDataType_t = cudnnDataType_t(3);\n}\nimpl cudnnDataType_t {\n    pub const CUDNN_DATA_INT32: cudnnDataType_t = cudnnDataType_t(4);\n}\nimpl cudnnDataType_t {\n    pub const CUDNN_DATA_INT8x4: cudnnDataType_t = cudnnDataType_t(5);\n}\nimpl cudnnDataType_t {\n    pub const CUDNN_DATA_UINT8: cudnnDataType_t = cudnnDataType_t(6);\n}\nimpl cudnnDataType_t {\n    pub const CUDNN_DATA_UINT8x4: cudnnDataType_t = cudnnDataType_t(7);\n}\nimpl cudnnDataType_t {\n    pub const CUDNN_DATA_INT8x32: cudnnDataType_t = cudnnDataType_t(8);\n}\nimpl cudnnDataType_t {\n    pub const CUDNN_DATA_BFLOAT16: cudnnDataType_t = cudnnDataType_t(9);\n}\nimpl cudnnDataType_t {\n    pub const CUDNN_DATA_INT64: cudnnDataType_t = cudnnDataType_t(10);\n}\nimpl cudnnDataType_t {\n    pub const CUDNN_DATA_BOOLEAN: cudnnDataType_t = cudnnDataType_t(11);\n}\nimpl cudnnDataType_t {\n    pub const CUDNN_DATA_FP8_E4M3: cudnnDataType_t = cudnnDataType_t(12);\n}\nimpl cudnnDataType_t {\n    pub const CUDNN_DATA_FP8_E5M2: cudnnDataType_t = cudnnDataType_t(13);\n}\nimpl cudnnDataType_t {\n    pub const CUDNN_DATA_FAST_FLOAT_FOR_FP8: cudnnDataType_t = cudnnDataType_t(14);\n}\nimpl cudnnDataType_t {\n    pub const CUDNN_DATA_FP8_E8M0: cudnnDataType_t = cudnnDataType_t(15);\n}\nimpl cudnnDataType_t {\n    pub const CUDNN_DATA_FP4_E2M1: cudnnDataType_t = cudnnDataType_t(16);\n}\nimpl cudnnDataType_t {\n    pub const CUDNN_DATA_INT4: cudnnDataType_t = cudnnDataType_t(17);\n}\nimpl cudnnDataType_t {\n    pub const CUDNN_DATA_UINT4: cudnnDataType_t = cudnnDataType_t(18);\n}\nimpl cudnnDataType_t {\n    pub const CUDNN_DATA_UINT32: cudnnDataType_t = cudnnDataType_t(19);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnDataType_t(pub ::core::ffi::c_uint);\npub use super::cudnn::cudnnMathType_t;\npub use super::cudnn::cudnnNanPropagation_t;\nimpl cudnnCTCGradMode_t {\n    pub const CUDNN_CTC_ZERO_OOB_GRADIENTS: cudnnCTCGradMode_t = cudnnCTCGradMode_t(0);\n}\nimpl cudnnCTCGradMode_t {\n    pub const CUDNN_CTC_SKIP_OOB_GRADIENTS: cudnnCTCGradMode_t = cudnnCTCGradMode_t(1);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnCTCGradMode_t(pub ::core::ffi::c_uint);\npub use super::cudnn::cudnnTensorFormat_t;\npub use super::cudnn::cudnnReduceTensorOp_t;\npub use super::cudnn::cudnnActivationMode_t;\npub use super::cudnn::cudnnSeverity_t;\n#[repr(C)]\npub struct cudnnDebugStruct {\n    pub cudnn_version: ::core::ffi::c_uint,\n    pub cudnnStatus: cudnnStatus_t,\n    pub time_sec: ::core::ffi::c_uint,\n    pub time_usec: ::core::ffi::c_uint,\n    pub time_delta: ::core::ffi::c_uint,\n    pub handle: cudnnHandle_t,\n    pub stream: cudaStream_t,\n    pub pid: ::core::ffi::c_ulonglong,\n    pub tid: ::core::ffi::c_ulonglong,\n    pub cudaDeviceId: ::core::ffi::c_int,\n    pub reserved: [::core::ffi::c_int; 15usize],\n}\npub type cudnnDebug_t = cudnnDebugStruct;\npub type cudnnCallback_t = ::core::option::Option<\n    unsafe extern \"C\" fn(\n        sev: cudnnSeverity_t,\n        udata: *mut ::core::ffi::c_void,\n        dbg: *const cudnnDebug_t,\n        msg: *const ::core::ffi::c_char,\n    ),\n>;\npub use super::cudnn::cudnnConvolutionMode_t;\npub use super::cudnn::cudnnReorderType_t;\npub type cudnnBackendDescriptor_t = *mut ::core::ffi::c_void;\npub use super::cudnn::cudnnFractionStruct;\npub type cudnnFraction_t = cudnnFractionStruct;\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_ADD: cudnnPointwiseMode_t = cudnnPointwiseMode_t(0);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_ADD_SQUARE: cudnnPointwiseMode_t = cudnnPointwiseMode_t(5);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_DIV: cudnnPointwiseMode_t = cudnnPointwiseMode_t(6);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_MAX: cudnnPointwiseMode_t = cudnnPointwiseMode_t(3);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_MIN: cudnnPointwiseMode_t = cudnnPointwiseMode_t(2);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_MOD: cudnnPointwiseMode_t = cudnnPointwiseMode_t(7);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_MUL: cudnnPointwiseMode_t = cudnnPointwiseMode_t(1);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_POW: cudnnPointwiseMode_t = cudnnPointwiseMode_t(8);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_SUB: cudnnPointwiseMode_t = cudnnPointwiseMode_t(9);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_ABS: cudnnPointwiseMode_t = cudnnPointwiseMode_t(10);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_CEIL: cudnnPointwiseMode_t = cudnnPointwiseMode_t(11);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_COS: cudnnPointwiseMode_t = cudnnPointwiseMode_t(12);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_EXP: cudnnPointwiseMode_t = cudnnPointwiseMode_t(13);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_FLOOR: cudnnPointwiseMode_t = cudnnPointwiseMode_t(14);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_LOG: cudnnPointwiseMode_t = cudnnPointwiseMode_t(15);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_NEG: cudnnPointwiseMode_t = cudnnPointwiseMode_t(16);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_RSQRT: cudnnPointwiseMode_t = cudnnPointwiseMode_t(17);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_SIN: cudnnPointwiseMode_t = cudnnPointwiseMode_t(18);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_SQRT: cudnnPointwiseMode_t = cudnnPointwiseMode_t(4);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_TAN: cudnnPointwiseMode_t = cudnnPointwiseMode_t(19);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_ERF: cudnnPointwiseMode_t = cudnnPointwiseMode_t(20);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_IDENTITY: cudnnPointwiseMode_t = cudnnPointwiseMode_t(21);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_RECIPROCAL: cudnnPointwiseMode_t = cudnnPointwiseMode_t(\n        22,\n    );\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_ATAN2: cudnnPointwiseMode_t = cudnnPointwiseMode_t(23);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_RELU_FWD: cudnnPointwiseMode_t = cudnnPointwiseMode_t(100);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_TANH_FWD: cudnnPointwiseMode_t = cudnnPointwiseMode_t(101);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_SIGMOID_FWD: cudnnPointwiseMode_t = cudnnPointwiseMode_t(\n        102,\n    );\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_ELU_FWD: cudnnPointwiseMode_t = cudnnPointwiseMode_t(103);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_GELU_FWD: cudnnPointwiseMode_t = cudnnPointwiseMode_t(104);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_SOFTPLUS_FWD: cudnnPointwiseMode_t = cudnnPointwiseMode_t(\n        105,\n    );\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_SWISH_FWD: cudnnPointwiseMode_t = cudnnPointwiseMode_t(\n        106,\n    );\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_GELU_APPROX_TANH_FWD: cudnnPointwiseMode_t = cudnnPointwiseMode_t(\n        107,\n    );\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_RELU_BWD: cudnnPointwiseMode_t = cudnnPointwiseMode_t(200);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_TANH_BWD: cudnnPointwiseMode_t = cudnnPointwiseMode_t(201);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_SIGMOID_BWD: cudnnPointwiseMode_t = cudnnPointwiseMode_t(\n        202,\n    );\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_ELU_BWD: cudnnPointwiseMode_t = cudnnPointwiseMode_t(203);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_GELU_BWD: cudnnPointwiseMode_t = cudnnPointwiseMode_t(204);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_SOFTPLUS_BWD: cudnnPointwiseMode_t = cudnnPointwiseMode_t(\n        205,\n    );\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_SWISH_BWD: cudnnPointwiseMode_t = cudnnPointwiseMode_t(\n        206,\n    );\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_GELU_APPROX_TANH_BWD: cudnnPointwiseMode_t = cudnnPointwiseMode_t(\n        207,\n    );\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_CMP_EQ: cudnnPointwiseMode_t = cudnnPointwiseMode_t(300);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_CMP_NEQ: cudnnPointwiseMode_t = cudnnPointwiseMode_t(301);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_CMP_GT: cudnnPointwiseMode_t = cudnnPointwiseMode_t(302);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_CMP_GE: cudnnPointwiseMode_t = cudnnPointwiseMode_t(303);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_CMP_LT: cudnnPointwiseMode_t = cudnnPointwiseMode_t(304);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_CMP_LE: cudnnPointwiseMode_t = cudnnPointwiseMode_t(305);\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_LOGICAL_AND: cudnnPointwiseMode_t = cudnnPointwiseMode_t(\n        400,\n    );\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_LOGICAL_OR: cudnnPointwiseMode_t = cudnnPointwiseMode_t(\n        401,\n    );\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_LOGICAL_NOT: cudnnPointwiseMode_t = cudnnPointwiseMode_t(\n        402,\n    );\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_GEN_INDEX: cudnnPointwiseMode_t = cudnnPointwiseMode_t(\n        501,\n    );\n}\nimpl cudnnPointwiseMode_t {\n    pub const CUDNN_POINTWISE_BINARY_SELECT: cudnnPointwiseMode_t = cudnnPointwiseMode_t(\n        601,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnPointwiseMode_t(pub ::core::ffi::c_uint);\npub use super::cudnn::cudnnResampleMode_t;\npub use super::cudnn::cudnnSignalMode_t;\npub use super::cudnn::cudnnGenStatsMode_t;\npub use super::cudnn::cudnnBnFinalizeStatsMode_t;\npub use super::cudnn::cudnnRngDistribution_t;\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_POINTWISE_MODE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        0,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_POINTWISE_MATH_PREC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_POINTWISE_NAN_PROPAGATION: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_POINTWISE_RELU_LOWER_CLIP: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        3,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_POINTWISE_RELU_UPPER_CLIP: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        4,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_POINTWISE_RELU_LOWER_CLIP_SLOPE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        5,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_POINTWISE_ELU_ALPHA: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        6,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_POINTWISE_SOFTPLUS_BETA: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        7,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_POINTWISE_SWISH_BETA: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        8,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_POINTWISE_AXIS: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        9,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_CONVOLUTION_COMP_TYPE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        100,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_CONVOLUTION_CONV_MODE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        101,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_CONVOLUTION_DILATIONS: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        102,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_CONVOLUTION_FILTER_STRIDES: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        103,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_CONVOLUTION_POST_PADDINGS: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        104,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_CONVOLUTION_PRE_PADDINGS: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        105,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_CONVOLUTION_SPATIAL_DIMS: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        106,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_ENGINEHEUR_MODE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        200,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_ENGINEHEUR_OPERATION_GRAPH: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        201,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_ENGINEHEUR_RESULTS: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        202,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_ENGINEHEUR_SM_COUNT_TARGET: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        203,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_ENGINEHEUR_DEVICEPROP: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        204,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_ENGINECFG_ENGINE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        300,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_ENGINECFG_INTERMEDIATE_INFO: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        301,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_ENGINECFG_KNOB_CHOICES: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        302,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_ENGINECFG_WORKSPACE_SIZE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        303,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_ENGINECFG_SHARED_MEMORY_USED: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        304,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_EXECUTION_PLAN_HANDLE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        400,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_EXECUTION_PLAN_ENGINE_CONFIG: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        401,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_EXECUTION_PLAN_WORKSPACE_SIZE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        402,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_EXECUTION_PLAN_COMPUTED_INTERMEDIATE_UIDS: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        403,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_EXECUTION_PLAN_RUN_ONLY_INTERMEDIATE_UIDS: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        404,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_EXECUTION_PLAN_JSON_REPRESENTATION: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        405,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_EXECUTION_PLAN_KERNEL_CACHE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        406,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_EXECUTION_PLAN_DEVICEPROP: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        407,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_INTERMEDIATE_INFO_UNIQUE_ID: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        500,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_INTERMEDIATE_INFO_SIZE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        501,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_INTERMEDIATE_INFO_DEPENDENT_DATA_UIDS: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        502,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_INTERMEDIATE_INFO_DEPENDENT_ATTRIBUTES: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        503,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_KNOB_CHOICE_KNOB_TYPE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        600,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_KNOB_CHOICE_KNOB_VALUE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        601,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_ALPHA: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        700,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_BETA: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        701,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_CONV_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        702,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_W: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        703,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_X: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        704,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_Y: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        705,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_ALPHA: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        706,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_BETA: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        707,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_CONV_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        708,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_W: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        709,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_DX: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        710,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_DY: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        711,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_ALPHA: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        712,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_BETA: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        713,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_CONV_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        714,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_DW: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        715,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_X: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        716,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_DY: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        717,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_POINTWISE_PW_DESCRIPTOR: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        750,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_POINTWISE_XDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        751,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_POINTWISE_BDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        752,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_POINTWISE_YDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        753,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_POINTWISE_ALPHA1: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        754,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_POINTWISE_ALPHA2: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        755,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_POINTWISE_DXDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        756,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_POINTWISE_DYDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        757,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_POINTWISE_TDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        758,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_GENSTATS_MODE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        770,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_GENSTATS_MATH_PREC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        771,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_GENSTATS_XDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        772,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_GENSTATS_SUMDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        773,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_GENSTATS_SQSUMDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        774,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BN_FINALIZE_STATS_MODE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        780,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BN_FINALIZE_MATH_PREC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        781,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BN_FINALIZE_Y_SUM_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        782,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BN_FINALIZE_Y_SQ_SUM_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        783,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BN_FINALIZE_SCALE_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        784,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BN_FINALIZE_BIAS_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        785,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BN_FINALIZE_PREV_RUNNING_MEAN_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        786,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BN_FINALIZE_PREV_RUNNING_VAR_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        787,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BN_FINALIZE_UPDATED_RUNNING_MEAN_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        788,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BN_FINALIZE_UPDATED_RUNNING_VAR_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        789,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BN_FINALIZE_SAVED_MEAN_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        790,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BN_FINALIZE_SAVED_INV_STD_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        791,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BN_FINALIZE_EQ_SCALE_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        792,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BN_FINALIZE_EQ_BIAS_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        793,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BN_FINALIZE_ACCUM_COUNT_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        794,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BN_FINALIZE_EPSILON_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        795,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BN_FINALIZE_EXP_AVERATE_FACTOR_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        796,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATIONGRAPH_HANDLE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        800,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATIONGRAPH_OPS: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        801,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATIONGRAPH_ENGINE_GLOBAL_COUNT: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        802,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATIONGRAPH_IS_DYNAMIC_SHAPE_ENABLED: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        803,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATIONGRAPH_IS_SAME_TOPOLOGY: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        804,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_TENSOR_BYTE_ALIGNMENT: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        900,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_TENSOR_DATA_TYPE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        901,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_TENSOR_DIMENSIONS: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        902,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_TENSOR_STRIDES: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        903,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_TENSOR_VECTOR_COUNT: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        904,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_TENSOR_VECTORIZED_DIMENSION: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        905,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_TENSOR_UNIQUE_ID: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        906,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_TENSOR_IS_VIRTUAL: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        907,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_TENSOR_IS_BY_VALUE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        908,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_TENSOR_REORDERING_MODE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        909,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_TENSOR_RAGGED_OFFSET_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        913,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_VARIANT_PACK_UNIQUE_IDS: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1000,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_VARIANT_PACK_DATA_POINTERS: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1001,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_VARIANT_PACK_INTERMEDIATES: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1002,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_VARIANT_PACK_WORKSPACE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1003,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_LAYOUT_INFO_TENSOR_UID: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1100,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_LAYOUT_INFO_TYPES: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1101,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_KNOB_INFO_TYPE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1200,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_KNOB_INFO_MAXIMUM_VALUE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1201,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_KNOB_INFO_MINIMUM_VALUE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1202,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_KNOB_INFO_STRIDE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1203,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_ENGINE_OPERATION_GRAPH: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1300,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_ENGINE_GLOBAL_INDEX: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1301,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_ENGINE_KNOB_INFO: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1302,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_ENGINE_NUMERICAL_NOTE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1303,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_ENGINE_LAYOUT_INFO: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1304,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_ENGINE_BEHAVIOR_NOTE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1305,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_ENGINE_SM_COUNT_TARGET: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1306,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_ENGINE_DEVICEPROP: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1307,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_MATMUL_COMP_TYPE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1500,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_MATMUL_PADDING_VALUE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1503,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_MATMUL_ADESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1520,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_MATMUL_BDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1521,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_MATMUL_CDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1522,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_MATMUL_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1523,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_MATMUL_IRREGULARLY_STRIDED_BATCH_COUNT: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1524,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_MATMUL_GEMM_M_OVERRIDE_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1525,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_MATMUL_GEMM_N_OVERRIDE_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1526,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_MATMUL_GEMM_K_OVERRIDE_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1527,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_REDUCTION_OPERATOR: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1600,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_REDUCTION_COMP_TYPE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1601,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_REDUCTION_IS_DETERMINISTIC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1602,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_REDUCTION_XDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1610,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_REDUCTION_YDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1611,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_REDUCTION_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1612,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_MATH_PREC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1620,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_MEAN_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1621,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_INVSTD_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1622,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_BN_SCALE_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1623,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_X_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1624,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_DY_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1625,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_DBN_SCALE_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1626,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_DBN_BIAS_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1627,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_EQ_DY_SCALE_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1628,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_EQ_X_SCALE_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1629,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_EQ_BIAS: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1630,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_RESAMPLE_MODE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1700,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_RESAMPLE_COMP_TYPE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1701,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_RESAMPLE_SPATIAL_DIMS: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1702,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_RESAMPLE_POST_PADDINGS: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1703,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_RESAMPLE_PRE_PADDINGS: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1704,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_RESAMPLE_STRIDES: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1705,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_RESAMPLE_WINDOW_DIMS: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1706,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_RESAMPLE_NAN_PROPAGATION: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1707,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_RESAMPLE_PADDING_MODE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1708,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_RESAMPLE_FWD_XDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1710,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_RESAMPLE_FWD_YDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1711,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_RESAMPLE_FWD_IDXDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1712,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_RESAMPLE_FWD_ALPHA: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1713,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_RESAMPLE_FWD_BETA: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1714,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_RESAMPLE_FWD_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1716,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_RESAMPLE_BWD_DXDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1720,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_RESAMPLE_BWD_DYDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1721,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_RESAMPLE_BWD_IDXDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1722,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_RESAMPLE_BWD_ALPHA: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1723,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_RESAMPLE_BWD_BETA: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1724,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_RESAMPLE_BWD_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1725,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_RESAMPLE_BWD_XDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1726,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_RESAMPLE_BWD_YDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1727,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONCAT_AXIS: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1800,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONCAT_INPUT_DESCS: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1801,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONCAT_INPLACE_INDEX: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1802,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONCAT_OUTPUT_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1803,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_SIGNAL_MODE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1900,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_SIGNAL_FLAGDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1901,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_SIGNAL_VALUE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1902,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_SIGNAL_XDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1903,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_SIGNAL_YDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1904,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_PAGED_CACHE_LOAD_CONTAINER_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1950,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_PAGED_CACHE_LOAD_YDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1951,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_PAGED_CACHE_LOAD_SEQUENCE_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1952,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_PAGED_CACHE_LOAD_PAGE_TABLE_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        1953,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_NORM_FWD_MODE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2000,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_NORM_FWD_PHASE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2001,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_NORM_FWD_XDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2002,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_NORM_FWD_MEAN_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2003,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_NORM_FWD_INV_VARIANCE_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2004,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_NORM_FWD_SCALE_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2005,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_NORM_FWD_BIAS_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2006,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_NORM_FWD_EPSILON_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2007,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_NORM_FWD_EXP_AVG_FACTOR_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2008,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_NORM_FWD_INPUT_RUNNING_MEAN_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2009,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_NORM_FWD_INPUT_RUNNING_VAR_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2010,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_NORM_FWD_OUTPUT_RUNNING_MEAN_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2011,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_NORM_FWD_OUTPUT_RUNNING_VAR_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2012,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_NORM_FWD_YDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2013,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_NORM_FWD_PEER_STAT_DESCS: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2014,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_NORM_BWD_MODE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2100,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_NORM_BWD_XDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2101,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_NORM_BWD_MEAN_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2102,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_NORM_BWD_INV_VARIANCE_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2103,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_NORM_BWD_DYDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2104,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_NORM_BWD_SCALE_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2105,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_NORM_BWD_EPSILON_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2106,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_NORM_BWD_DSCALE_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2107,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_NORM_BWD_DBIAS_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2108,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_NORM_BWD_DXDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2109,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_NORM_BWD_PEER_STAT_DESCS: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2110,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_RESHAPE_XDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2200,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_RESHAPE_YDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2201,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_EXPAND_BAND_MATRIX_XDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2250,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_EXPAND_BAND_MATRIX_YDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2251,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_EXPAND_BAND_MATRIX_LOWER_BANDWIDTH: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2252,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_EXPAND_BAND_MATRIX_UPPER_BANDWIDTH: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2253,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_EXPAND_BAND_MATRIX_AXIS: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2254,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_EXPAND_BAND_MATRIX_PAD_VALUE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2255,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_EXPAND_BAND_MATRIX_KV_TOKEN_OFFSET_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2256,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_EXPAND_BAND_MATRIX_SPECULATIVE_MASK_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2257,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONTRACT_BAND_MATRIX_XDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2270,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONTRACT_BAND_MATRIX_YDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2271,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONTRACT_BAND_MATRIX_LOWER_BANDWIDTH: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2272,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONTRACT_BAND_MATRIX_UPPER_BANDWIDTH: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2273,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONTRACT_BAND_MATRIX_AXIS: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2274,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONTRACT_BAND_MATRIX_PAD_VALUE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2275,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_CONTRACT_BAND_MAX_TOKEN_VALUE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2276,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_RNG_DISTRIBUTION: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2300,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_RNG_NORMAL_DIST_MEAN: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2301,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_RNG_NORMAL_DIST_STANDARD_DEVIATION: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2302,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_RNG_UNIFORM_DIST_MAXIMUM: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2303,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_RNG_UNIFORM_DIST_MINIMUM: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2304,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_RNG_BERNOULLI_DIST_PROBABILITY: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2305,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_RNG_YDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2310,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_RNG_SEED: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2311,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_RNG_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2312,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_RNG_OFFSET_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2313,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_KERNEL_CACHE_OPERATION_GRAPH: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2400,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_KERNEL_CACHE_IS_ENGINECFG_KERNEL_CACHED: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2401,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_KERNEL_CACHE_JSON_REPRESENTATION: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2402,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BLOCK_SCALE_QUANTIZE_XDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2500,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BLOCK_SCALE_QUANTIZE_YDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2501,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BLOCK_SCALE_QUANTIZE_SCALE_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2502,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BLOCK_SCALE_QUANTIZE_MATH_PREC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2503,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BLOCK_SCALE_QUANTIZE_BLOCK_SIZE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2504,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BLOCK_SCALE_DEQUANTIZE_XDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2600,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BLOCK_SCALE_DEQUANTIZE_SCALE_DESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2601,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BLOCK_SCALE_DEQUANTIZE_YDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2602,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BLOCK_SCALE_DEQUANTIZE_MATH_PREC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2603,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BLOCK_SCALE_DEQUANTIZE_BLOCK_SIZE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2604,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_BLOCK_SCALE_DEQUANTIZE_NEG_SCALE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2605,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_DEVICEPROP_DEVICE_ID: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2700,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_DEVICEPROP_HANDLE: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2701,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_DEVICEPROP_JSON_REPRESENTATION: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2702,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_SDPA_FWD_QDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2800,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_SDPA_FWD_KDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2801,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_SDPA_FWD_VDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2802,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_SDPA_FWD_ODESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2803,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_SDPA_FWD_STATSDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2804,\n    );\n}\nimpl cudnnBackendAttributeName_t {\n    pub const CUDNN_ATTR_OPERATION_SDPA_FWD_SCALEDESC: cudnnBackendAttributeName_t = cudnnBackendAttributeName_t(\n        2805,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnBackendAttributeName_t(pub ::core::ffi::c_uint);\npub use super::cudnn::cudnnBackendAttributeType_t;\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_POINTWISE_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        0,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_CONVOLUTION_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        1,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_ENGINE_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        2,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_ENGINECFG_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        3,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_ENGINEHEUR_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        4,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        5,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_INTERMEDIATE_INFO_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        6,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_KNOB_CHOICE_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        7,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_KNOB_INFO_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        8,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_LAYOUT_INFO_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        9,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_OPERATION_CONVOLUTION_FORWARD_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        10,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_OPERATION_CONVOLUTION_BACKWARD_FILTER_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        11,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_OPERATION_CONVOLUTION_BACKWARD_DATA_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        12,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_OPERATION_POINTWISE_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        13,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_OPERATION_GEN_STATS_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        14,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_OPERATIONGRAPH_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        15,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_VARIANT_PACK_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        16,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_TENSOR_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        17,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_MATMUL_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        18,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_OPERATION_MATMUL_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        19,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_OPERATION_BN_FINALIZE_STATISTICS_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        20,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_REDUCTION_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        21,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_OPERATION_REDUCTION_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        22,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_OPERATION_BN_BWD_WEIGHTS_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        23,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_RESAMPLE_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        24,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_OPERATION_RESAMPLE_FWD_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        25,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_OPERATION_RESAMPLE_BWD_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        26,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_OPERATION_CONCAT_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        27,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_OPERATION_SIGNAL_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        28,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_OPERATION_NORM_FORWARD_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        29,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_OPERATION_NORM_BACKWARD_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        30,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_OPERATION_RESHAPE_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        31,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_RNG_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        32,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_OPERATION_RNG_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        33,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_KERNEL_CACHE_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        34,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_OPERATION_PAGED_CACHE_LOAD_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        35,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_OPERATION_BLOCK_SCALE_QUANTIZE_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        36,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_OPERATION_BLOCK_SCALE_DEQUANTIZE_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        37,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_DEVICEPROP_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        38,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_OPERATION_EXPAND_BAND_MATRIX_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        39,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_OPERATION_CONTRACT_BAND_MATRIX_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        40,\n    );\n}\nimpl cudnnBackendDescriptorType_t {\n    pub const CUDNN_BACKEND_OPERATION_SDPA_FWD_DESCRIPTOR: cudnnBackendDescriptorType_t = cudnnBackendDescriptorType_t(\n        41,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnBackendDescriptorType_t(pub ::core::ffi::c_uint);\nimpl cudnnBackendNumericalNote_t {\n    pub const CUDNN_NUMERICAL_NOTE_TENSOR_CORE: cudnnBackendNumericalNote_t = cudnnBackendNumericalNote_t(\n        0,\n    );\n}\nimpl cudnnBackendNumericalNote_t {\n    pub const CUDNN_NUMERICAL_NOTE_DOWN_CONVERT_INPUTS: cudnnBackendNumericalNote_t = cudnnBackendNumericalNote_t(\n        1,\n    );\n}\nimpl cudnnBackendNumericalNote_t {\n    pub const CUDNN_NUMERICAL_NOTE_REDUCED_PRECISION_REDUCTION: cudnnBackendNumericalNote_t = cudnnBackendNumericalNote_t(\n        2,\n    );\n}\nimpl cudnnBackendNumericalNote_t {\n    pub const CUDNN_NUMERICAL_NOTE_FFT: cudnnBackendNumericalNote_t = cudnnBackendNumericalNote_t(\n        3,\n    );\n}\nimpl cudnnBackendNumericalNote_t {\n    pub const CUDNN_NUMERICAL_NOTE_NONDETERMINISTIC: cudnnBackendNumericalNote_t = cudnnBackendNumericalNote_t(\n        4,\n    );\n}\nimpl cudnnBackendNumericalNote_t {\n    pub const CUDNN_NUMERICAL_NOTE_WINOGRAD: cudnnBackendNumericalNote_t = cudnnBackendNumericalNote_t(\n        5,\n    );\n}\nimpl cudnnBackendNumericalNote_t {\n    pub const CUDNN_NUMERICAL_NOTE_WINOGRAD_TILE_4x4: cudnnBackendNumericalNote_t = cudnnBackendNumericalNote_t(\n        6,\n    );\n}\nimpl cudnnBackendNumericalNote_t {\n    pub const CUDNN_NUMERICAL_NOTE_WINOGRAD_TILE_6x6: cudnnBackendNumericalNote_t = cudnnBackendNumericalNote_t(\n        7,\n    );\n}\nimpl cudnnBackendNumericalNote_t {\n    pub const CUDNN_NUMERICAL_NOTE_WINOGRAD_TILE_13x13: cudnnBackendNumericalNote_t = cudnnBackendNumericalNote_t(\n        8,\n    );\n}\nimpl cudnnBackendNumericalNote_t {\n    pub const CUDNN_NUMERICAL_NOTE_STRICT_NAN_PROP: cudnnBackendNumericalNote_t = cudnnBackendNumericalNote_t(\n        9,\n    );\n}\nimpl cudnnBackendNumericalNote_t {\n    pub const CUDNN_NUMERICAL_NOTE_TYPE_COUNT: cudnnBackendNumericalNote_t = cudnnBackendNumericalNote_t(\n        10,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnBackendNumericalNote_t(pub ::core::ffi::c_uint);\nimpl cudnnBackendBehaviorNote_t {\n    pub const CUDNN_BEHAVIOR_NOTE_RUNTIME_COMPILATION: cudnnBackendBehaviorNote_t = cudnnBackendBehaviorNote_t(\n        0,\n    );\n}\nimpl cudnnBackendBehaviorNote_t {\n    pub const CUDNN_BEHAVIOR_NOTE_REQUIRES_FILTER_INT8x32_REORDER: cudnnBackendBehaviorNote_t = cudnnBackendBehaviorNote_t(\n        1,\n    );\n}\nimpl cudnnBackendBehaviorNote_t {\n    pub const CUDNN_BEHAVIOR_NOTE_REQUIRES_BIAS_INT8x32_REORDER: cudnnBackendBehaviorNote_t = cudnnBackendBehaviorNote_t(\n        2,\n    );\n}\nimpl cudnnBackendBehaviorNote_t {\n    pub const CUDNN_BEHAVIOR_NOTE_SUPPORTS_CUDA_GRAPH_NATIVE_API: cudnnBackendBehaviorNote_t = cudnnBackendBehaviorNote_t(\n        3,\n    );\n}\nimpl cudnnBackendBehaviorNote_t {\n    pub const CUDNN_BEHAVIOR_NOTE_TYPE_COUNT: cudnnBackendBehaviorNote_t = cudnnBackendBehaviorNote_t(\n        4,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnBackendBehaviorNote_t(pub ::core::ffi::c_uint);\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_SPLIT_K: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        0,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_SWIZZLE: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        1,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_TILE_SIZE: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        2,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_USE_TEX: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        3,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_EDGE: cudnnBackendKnobType_t = cudnnBackendKnobType_t(4);\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_KBLOCK: cudnnBackendKnobType_t = cudnnBackendKnobType_t(5);\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_LDGA: cudnnBackendKnobType_t = cudnnBackendKnobType_t(6);\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_LDGB: cudnnBackendKnobType_t = cudnnBackendKnobType_t(7);\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_CHUNK_K: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        8,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_SPLIT_H: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        9,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_WINO_TILE: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        10,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_MULTIPLY: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        11,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_SPLIT_K_BUF: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        12,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_TILEK: cudnnBackendKnobType_t = cudnnBackendKnobType_t(13);\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_STAGES: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        14,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_REDUCTION_MODE: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        15,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_CTA_SPLIT_K_MODE: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        16,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_SPLIT_K_SLC: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        17,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_IDX_MODE: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        18,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_SLICED: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        19,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_SPLIT_RS: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        20,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_SINGLEBUFFER: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        21,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_LDGC: cudnnBackendKnobType_t = cudnnBackendKnobType_t(22);\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_SPECFILT: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        23,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_KERNEL_CFG: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        24,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_WORKSPACE: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        25,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_TILE_CGA: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        26,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_TILE_CGA_M: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        27,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_TILE_CGA_N: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        28,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_BLOCK_SIZE: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        29,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_OCCUPANCY: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        30,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_ARRAY_SIZE_PER_THREAD: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        31,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_NUM_C_PER_BLOCK: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        32,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_SPLIT_COLS: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        33,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_TILE_ROWS: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        34,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_TILE_COLS: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        35,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_LOAD_SIZE: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        36,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_CTA_COUNT: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        37,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_STREAM_K: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        38,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_SPLIT_P_SLC: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        39,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_TILE_M: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        40,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_TILE_N: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        41,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_WARP_SPEC_CFG: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        42,\n    );\n}\nimpl cudnnBackendKnobType_t {\n    pub const CUDNN_KNOB_TYPE_COUNTS: cudnnBackendKnobType_t = cudnnBackendKnobType_t(\n        43,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnBackendKnobType_t(pub ::core::ffi::c_uint);\npub use super::cudnn::cudnnBackendLayoutType_t;\npub use super::cudnn::cudnnBackendHeurMode_t;\nimpl cudnnBackendTensorReordering_t {\n    pub const CUDNN_TENSOR_REORDERING_NONE: cudnnBackendTensorReordering_t = cudnnBackendTensorReordering_t(\n        0,\n    );\n}\nimpl cudnnBackendTensorReordering_t {\n    pub const CUDNN_TENSOR_REORDERING_INT8x32: cudnnBackendTensorReordering_t = cudnnBackendTensorReordering_t(\n        1,\n    );\n}\nimpl cudnnBackendTensorReordering_t {\n    pub const CUDNN_TENSOR_REORDERING_F16x16: cudnnBackendTensorReordering_t = cudnnBackendTensorReordering_t(\n        2,\n    );\n}\nimpl cudnnBackendTensorReordering_t {\n    pub const CUDNN_TENSOR_REORDERING_F8_128x4: cudnnBackendTensorReordering_t = cudnnBackendTensorReordering_t(\n        3,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnBackendTensorReordering_t(pub ::core::ffi::c_uint);\npub use super::cudnn::cudnnPaddingMode_t;\nimpl cudnnBackendNormMode_t {\n    pub const CUDNN_LAYER_NORM: cudnnBackendNormMode_t = cudnnBackendNormMode_t(0);\n}\nimpl cudnnBackendNormMode_t {\n    pub const CUDNN_INSTANCE_NORM: cudnnBackendNormMode_t = cudnnBackendNormMode_t(1);\n}\nimpl cudnnBackendNormMode_t {\n    pub const CUDNN_BATCH_NORM: cudnnBackendNormMode_t = cudnnBackendNormMode_t(2);\n}\nimpl cudnnBackendNormMode_t {\n    pub const CUDNN_GROUP_NORM: cudnnBackendNormMode_t = cudnnBackendNormMode_t(3);\n}\nimpl cudnnBackendNormMode_t {\n    pub const CUDNN_RMS_NORM: cudnnBackendNormMode_t = cudnnBackendNormMode_t(4);\n}\nimpl cudnnBackendNormMode_t {\n    pub const CUDNN_ADA_LAYER_NORM: cudnnBackendNormMode_t = cudnnBackendNormMode_t(5);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudnnBackendNormMode_t(pub ::core::ffi::c_uint);\npub use super::cudnn::cudnnBackendNormFwdPhase_t;\npub use super::cudnn::cudnnTensorStruct;\npub type cudnnTensorDescriptor_t = *mut cudnnTensorStruct;\npub use super::cudnn::cudnnPoolingStruct;\npub type cudnnPoolingDescriptor_t = *mut cudnnPoolingStruct;\npub use super::cudnn::cudnnFilterStruct;\npub type cudnnFilterDescriptor_t = *mut cudnnFilterStruct;\npub use super::cudnn::cudnnLRNStruct;\npub type cudnnLRNDescriptor_t = *mut cudnnLRNStruct;\npub use super::cudnn::cudnnActivationStruct;\npub type cudnnActivationDescriptor_t = *mut cudnnActivationStruct;\npub use super::cudnn::cudnnSpatialTransformerStruct;\npub type cudnnSpatialTransformerDescriptor_t = *mut cudnnSpatialTransformerStruct;\npub use super::cudnn::cudnnOpTensorStruct;\npub type cudnnOpTensorDescriptor_t = *mut cudnnOpTensorStruct;\npub use super::cudnn::cudnnReduceTensorStruct;\npub type cudnnReduceTensorDescriptor_t = *mut cudnnReduceTensorStruct;\npub use super::cudnn::cudnnCTCLossStruct;\npub type cudnnCTCLossDescriptor_t = *mut cudnnCTCLossStruct;\npub use super::cudnn::cudnnTensorTransformStruct;\npub type cudnnTensorTransformDescriptor_t = *mut cudnnTensorTransformStruct;\npub use super::cudnn::cudnnDeterminism_t;\npub use super::cudnn::cudnnFoldingDirection_t;\npub use super::cudnn::cudnnOpTensorOp_t;\npub use super::cudnn::cudnnReduceTensorIndices_t;\npub use super::cudnn::cudnnIndicesType_t;\npub use super::cudnn::cudnnSoftmaxAlgorithm_t;\npub use super::cudnn::cudnnSoftmaxMode_t;\npub use super::cudnn::cudnnPoolingMode_t;\npub use super::cudnn::cudnnLRNMode_t;\npub use super::cudnn::cudnnDivNormMode_t;\npub use super::cudnn::cudnnBatchNormMode_t;\npub use super::cudnn::cudnnBatchNormOps_t;\npub use super::cudnn::cudnnNormMode_t;\npub use super::cudnn::cudnnNormAlgo_t;\npub use super::cudnn::cudnnNormOps_t;\npub use super::cudnn::cudnnSamplerType_t;\npub use super::cudnn::cudnnDropoutStruct;\npub type cudnnDropoutDescriptor_t = *mut cudnnDropoutStruct;\npub use super::cudnn::cudnnConvolutionFwdAlgo_t;\npub use super::cudnn::cudnnConvolutionBwdFilterAlgo_t;\npub use super::cudnn::cudnnConvolutionBwdDataAlgo_t;\npub use super::cudnn::cudnnCTCLossAlgo_t;\npub use super::cudnn::cudnnRNNAlgo_t;\npub use super::cudnn::cudnnForwardMode_t;\npub use super::cudnn::cudnnRNNMode_t;\npub use super::cudnn::cudnnRNNBiasMode_t;\npub use super::cudnn::cudnnDirectionMode_t;\npub use super::cudnn::cudnnRNNInputMode_t;\npub use super::cudnn::cudnnRNNClipMode_t;\npub use super::cudnn::cudnnRNNDataLayout_t;\npub use super::cudnn::cudnnRNNStruct;\npub type cudnnRNNDescriptor_t = *mut cudnnRNNStruct;\npub use super::cudnn::cudnnRNNDataStruct;\npub type cudnnRNNDataDescriptor_t = *mut cudnnRNNDataStruct;\npub use super::cudnn::cudnnSeqDataAxis_t;\npub use super::cudnn::cudnnSeqDataStruct;\npub type cudnnSeqDataDescriptor_t = *mut cudnnSeqDataStruct;\npub use super::cudnn::cudnnAttnStruct;\npub type cudnnAttnDescriptor_t = *mut cudnnAttnStruct;\npub use super::cudnn::cudnnMultiHeadAttnWeightKind_t;\npub use super::cudnn::cudnnWgradMode_t;\npub use super::cudnn::cudnnLossNormalizationMode_t;\npub use super::cudnn::cudnnConvolutionStruct;\npub type cudnnConvolutionDescriptor_t = *mut cudnnConvolutionStruct;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, PartialEq)]\npub struct cudnnConvolutionFwdAlgoPerfStruct {\n    pub algo: cudnnConvolutionFwdAlgo_t,\n    pub status: cudnnStatus_t,\n    pub time: f32,\n    pub memory: usize,\n    pub determinism: cudnnDeterminism_t,\n    pub mathType: cudnnMathType_t,\n    pub reserved: [::core::ffi::c_int; 3usize],\n}\npub type cudnnConvolutionFwdAlgoPerf_t = cudnnConvolutionFwdAlgoPerfStruct;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, PartialEq)]\npub struct cudnnConvolutionBwdDataAlgoPerfStruct {\n    pub algo: cudnnConvolutionBwdDataAlgo_t,\n    pub status: cudnnStatus_t,\n    pub time: f32,\n    pub memory: usize,\n    pub determinism: cudnnDeterminism_t,\n    pub mathType: cudnnMathType_t,\n    pub reserved: [::core::ffi::c_int; 3usize],\n}\npub type cudnnConvolutionBwdDataAlgoPerf_t = cudnnConvolutionBwdDataAlgoPerfStruct;\npub use super::cudnn::cudnnFusedOpsConstParamStruct;\npub type cudnnFusedOpsConstParamPack_t = *mut cudnnFusedOpsConstParamStruct;\npub use super::cudnn::cudnnFusedOpsVariantParamStruct;\npub type cudnnFusedOpsVariantParamPack_t = *mut cudnnFusedOpsVariantParamStruct;\npub use super::cudnn::cudnnFusedOpsPlanStruct;\npub type cudnnFusedOpsPlan_t = *mut cudnnFusedOpsPlanStruct;\npub use super::cudnn::cudnnFusedOps_t;\npub use super::cudnn::cudnnFusedOpsConstParamLabel_t;\npub use super::cudnn::cudnnFusedOpsPointerPlaceHolder_t;\npub use super::cudnn::cudnnFusedOpsVariantParamLabel_t;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, PartialEq)]\npub struct cudnnConvolutionBwdFilterAlgoPerfStruct {\n    pub algo: cudnnConvolutionBwdFilterAlgo_t,\n    pub status: cudnnStatus_t,\n    pub time: f32,\n    pub memory: usize,\n    pub determinism: cudnnDeterminism_t,\n    pub mathType: cudnnMathType_t,\n    pub reserved: [::core::ffi::c_int; 3usize],\n}\npub type cudnnConvolutionBwdFilterAlgoPerf_t = cudnnConvolutionBwdFilterAlgoPerfStruct;\nimpl cudnnError_t {\n    pub const r#NOT_INITIALIZED: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(1001)\n    });\n    pub const r#SUBLIBRARY_VERSION_MISMATCH: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(1002)\n    });\n    pub const r#SERIALIZATION_VERSION_MISMATCH: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(1003)\n    });\n    pub const r#DEPRECATED: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(1004)\n    });\n    pub const r#LICENSE_ERROR: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(1005)\n    });\n    pub const r#RUNTIME_IN_PROGRESS: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(1006)\n    });\n    pub const r#RUNTIME_FP_OVERFLOW: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(1007)\n    });\n    pub const r#SUBLIBRARY_LOADING_FAILED: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(1008)\n    });\n    pub const r#BAD_PARAM: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(2000)\n    });\n    pub const r#BAD_PARAM_NULL_POINTER: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(2002)\n    });\n    pub const r#BAD_PARAM_MISALIGNED_POINTER: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(2003)\n    });\n    pub const r#BAD_PARAM_NOT_FINALIZED: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(2004)\n    });\n    pub const r#BAD_PARAM_OUT_OF_BOUND: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(2005)\n    });\n    pub const r#BAD_PARAM_SIZE_INSUFFICIENT: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(2006)\n    });\n    pub const r#BAD_PARAM_STREAM_MISMATCH: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(2007)\n    });\n    pub const r#BAD_PARAM_SHAPE_MISMATCH: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(2008)\n    });\n    pub const r#BAD_PARAM_DUPLICATED_ENTRIES: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(2009)\n    });\n    pub const r#BAD_PARAM_ATTRIBUTE_TYPE: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(2010)\n    });\n    pub const r#BAD_PARAM_CUDA_GRAPH_MISMATCH: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(2011)\n    });\n    pub const r#BAD_PARAM_DESCRIPTOR_TYPE: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(2012)\n    });\n    pub const r#NOT_SUPPORTED: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3000)\n    });\n    pub const r#NOT_SUPPORTED_GRAPH_PATTERN: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3001)\n    });\n    pub const r#NOT_SUPPORTED_SHAPE: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3002)\n    });\n    pub const r#NOT_SUPPORTED_DATA_TYPE: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3003)\n    });\n    pub const r#NOT_SUPPORTED_LAYOUT: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3004)\n    });\n    pub const r#NOT_SUPPORTED_INCOMPATIBLE_CUDA_DRIVER: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3005)\n    });\n    pub const r#NOT_SUPPORTED_INCOMPATIBLE_CUDART: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3006)\n    });\n    pub const r#NOT_SUPPORTED_ARCH_MISMATCH: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3007)\n    });\n    pub const r#NOT_SUPPORTED_RUNTIME_PREREQUISITE_MISSING: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3008)\n    });\n    pub const r#NOT_SUPPORTED_SUBLIBRARY_UNAVAILABLE: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3009)\n    });\n    pub const r#NOT_SUPPORTED_SHARED_MEMORY_INSUFFICIENT: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3010)\n    });\n    pub const r#NOT_SUPPORTED_PADDING: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3011)\n    });\n    pub const r#NOT_SUPPORTED_BAD_LAUNCH_PARAM: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3012)\n    });\n    pub const r#NOT_SUPPORTED_CUDA_GRAPH_NATIVE_API: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3013)\n    });\n    pub const r#INTERNAL_ERROR: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(4000)\n    });\n    pub const r#INTERNAL_ERROR_COMPILATION_FAILED: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(4001)\n    });\n    pub const r#INTERNAL_ERROR_UNEXPECTED_VALUE: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(4002)\n    });\n    pub const r#INTERNAL_ERROR_HOST_ALLOCATION_FAILED: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(4003)\n    });\n    pub const r#INTERNAL_ERROR_DEVICE_ALLOCATION_FAILED: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(4004)\n    });\n    pub const r#INTERNAL_ERROR_BAD_LAUNCH_PARAM: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(4005)\n    });\n    pub const r#INTERNAL_ERROR_TEXTURE_CREATION_FAILED: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(4006)\n    });\n    pub const r#EXECUTION_FAILED: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(5000)\n    });\n    pub const r#EXECUTION_FAILED_CUDA_DRIVER: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(5001)\n    });\n    pub const r#EXECUTION_FAILED_CUBLAS: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(5002)\n    });\n    pub const r#EXECUTION_FAILED_CUDART: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(5003)\n    });\n    pub const r#EXECUTION_FAILED_CURAND: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(5004)\n    });\n    pub const r#ALLOC_FAILED: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(4003)\n    });\n    pub const r#INVALID_VALUE: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(2001)\n    });\n    pub const r#ARCH_MISMATCH: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3007)\n    });\n    pub const r#MAPPING_ERROR: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(4006)\n    });\n    pub const r#RUNTIME_PREREQUISITE_MISSING: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3008)\n    });\n    pub const r#VERSION_MISMATCH: cudnnError_t = cudnnError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(1002)\n    });\n}\n#[repr(transparent)]\n#[derive(Debug, Hash, Copy, Clone, PartialEq, Eq)]\npub struct cudnnError_t(pub ::core::num::NonZeroU32);\npub trait cudnnStatus_tConsts {\n    const SUCCESS: cudnnStatus_t = cudnnStatus_t::Ok(());\n    const ERROR_NOT_INITIALIZED: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#NOT_INITIALIZED,\n    );\n    const ERROR_SUBLIBRARY_VERSION_MISMATCH: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#SUBLIBRARY_VERSION_MISMATCH,\n    );\n    const ERROR_SERIALIZATION_VERSION_MISMATCH: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#SERIALIZATION_VERSION_MISMATCH,\n    );\n    const ERROR_DEPRECATED: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#DEPRECATED,\n    );\n    const ERROR_LICENSE_ERROR: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#LICENSE_ERROR,\n    );\n    const ERROR_RUNTIME_IN_PROGRESS: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#RUNTIME_IN_PROGRESS,\n    );\n    const ERROR_RUNTIME_FP_OVERFLOW: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#RUNTIME_FP_OVERFLOW,\n    );\n    const ERROR_SUBLIBRARY_LOADING_FAILED: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#SUBLIBRARY_LOADING_FAILED,\n    );\n    const ERROR_BAD_PARAM: cudnnStatus_t = cudnnStatus_t::Err(cudnnError_t::r#BAD_PARAM);\n    const ERROR_BAD_PARAM_NULL_POINTER: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#BAD_PARAM_NULL_POINTER,\n    );\n    const ERROR_BAD_PARAM_MISALIGNED_POINTER: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#BAD_PARAM_MISALIGNED_POINTER,\n    );\n    const ERROR_BAD_PARAM_NOT_FINALIZED: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#BAD_PARAM_NOT_FINALIZED,\n    );\n    const ERROR_BAD_PARAM_OUT_OF_BOUND: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#BAD_PARAM_OUT_OF_BOUND,\n    );\n    const ERROR_BAD_PARAM_SIZE_INSUFFICIENT: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#BAD_PARAM_SIZE_INSUFFICIENT,\n    );\n    const ERROR_BAD_PARAM_STREAM_MISMATCH: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#BAD_PARAM_STREAM_MISMATCH,\n    );\n    const ERROR_BAD_PARAM_SHAPE_MISMATCH: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#BAD_PARAM_SHAPE_MISMATCH,\n    );\n    const ERROR_BAD_PARAM_DUPLICATED_ENTRIES: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#BAD_PARAM_DUPLICATED_ENTRIES,\n    );\n    const ERROR_BAD_PARAM_ATTRIBUTE_TYPE: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#BAD_PARAM_ATTRIBUTE_TYPE,\n    );\n    const ERROR_BAD_PARAM_CUDA_GRAPH_MISMATCH: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#BAD_PARAM_CUDA_GRAPH_MISMATCH,\n    );\n    const ERROR_BAD_PARAM_DESCRIPTOR_TYPE: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#BAD_PARAM_DESCRIPTOR_TYPE,\n    );\n    const ERROR_NOT_SUPPORTED: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#NOT_SUPPORTED,\n    );\n    const ERROR_NOT_SUPPORTED_GRAPH_PATTERN: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#NOT_SUPPORTED_GRAPH_PATTERN,\n    );\n    const ERROR_NOT_SUPPORTED_SHAPE: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#NOT_SUPPORTED_SHAPE,\n    );\n    const ERROR_NOT_SUPPORTED_DATA_TYPE: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#NOT_SUPPORTED_DATA_TYPE,\n    );\n    const ERROR_NOT_SUPPORTED_LAYOUT: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#NOT_SUPPORTED_LAYOUT,\n    );\n    const ERROR_NOT_SUPPORTED_INCOMPATIBLE_CUDA_DRIVER: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#NOT_SUPPORTED_INCOMPATIBLE_CUDA_DRIVER,\n    );\n    const ERROR_NOT_SUPPORTED_INCOMPATIBLE_CUDART: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#NOT_SUPPORTED_INCOMPATIBLE_CUDART,\n    );\n    const ERROR_NOT_SUPPORTED_ARCH_MISMATCH: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#NOT_SUPPORTED_ARCH_MISMATCH,\n    );\n    const ERROR_NOT_SUPPORTED_RUNTIME_PREREQUISITE_MISSING: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#NOT_SUPPORTED_RUNTIME_PREREQUISITE_MISSING,\n    );\n    const ERROR_NOT_SUPPORTED_SUBLIBRARY_UNAVAILABLE: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#NOT_SUPPORTED_SUBLIBRARY_UNAVAILABLE,\n    );\n    const ERROR_NOT_SUPPORTED_SHARED_MEMORY_INSUFFICIENT: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#NOT_SUPPORTED_SHARED_MEMORY_INSUFFICIENT,\n    );\n    const ERROR_NOT_SUPPORTED_PADDING: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#NOT_SUPPORTED_PADDING,\n    );\n    const ERROR_NOT_SUPPORTED_BAD_LAUNCH_PARAM: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#NOT_SUPPORTED_BAD_LAUNCH_PARAM,\n    );\n    const ERROR_NOT_SUPPORTED_CUDA_GRAPH_NATIVE_API: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#NOT_SUPPORTED_CUDA_GRAPH_NATIVE_API,\n    );\n    const ERROR_INTERNAL_ERROR: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#INTERNAL_ERROR,\n    );\n    const ERROR_INTERNAL_ERROR_COMPILATION_FAILED: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#INTERNAL_ERROR_COMPILATION_FAILED,\n    );\n    const ERROR_INTERNAL_ERROR_UNEXPECTED_VALUE: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#INTERNAL_ERROR_UNEXPECTED_VALUE,\n    );\n    const ERROR_INTERNAL_ERROR_HOST_ALLOCATION_FAILED: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#INTERNAL_ERROR_HOST_ALLOCATION_FAILED,\n    );\n    const ERROR_INTERNAL_ERROR_DEVICE_ALLOCATION_FAILED: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#INTERNAL_ERROR_DEVICE_ALLOCATION_FAILED,\n    );\n    const ERROR_INTERNAL_ERROR_BAD_LAUNCH_PARAM: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#INTERNAL_ERROR_BAD_LAUNCH_PARAM,\n    );\n    const ERROR_INTERNAL_ERROR_TEXTURE_CREATION_FAILED: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#INTERNAL_ERROR_TEXTURE_CREATION_FAILED,\n    );\n    const ERROR_EXECUTION_FAILED: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#EXECUTION_FAILED,\n    );\n    const ERROR_EXECUTION_FAILED_CUDA_DRIVER: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#EXECUTION_FAILED_CUDA_DRIVER,\n    );\n    const ERROR_EXECUTION_FAILED_CUBLAS: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#EXECUTION_FAILED_CUBLAS,\n    );\n    const ERROR_EXECUTION_FAILED_CUDART: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#EXECUTION_FAILED_CUDART,\n    );\n    const ERROR_EXECUTION_FAILED_CURAND: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#EXECUTION_FAILED_CURAND,\n    );\n    const ERROR_ALLOC_FAILED: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#ALLOC_FAILED,\n    );\n    const ERROR_INVALID_VALUE: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#INVALID_VALUE,\n    );\n    const ERROR_ARCH_MISMATCH: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#ARCH_MISMATCH,\n    );\n    const ERROR_MAPPING_ERROR: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#MAPPING_ERROR,\n    );\n    const ERROR_RUNTIME_PREREQUISITE_MISSING: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#RUNTIME_PREREQUISITE_MISSING,\n    );\n    const ERROR_VERSION_MISMATCH: cudnnStatus_t = cudnnStatus_t::Err(\n        cudnnError_t::r#VERSION_MISMATCH,\n    );\n}\nimpl cudnnStatus_tConsts for cudnnStatus_t {}\n#[must_use]\npub type cudnnStatus_t = ::core::result::Result<(), cudnnError_t>;\nconst _: fn() = || {\n    let _ = std::mem::transmute::<cudnnStatus_t, u32>;\n};\n\nimpl From<miopen_sys::miopenError_t> for cudnnError_t {\n    fn from(error: miopen_sys::miopenError_t) -> Self {\n        match error {\n            miopen_sys::miopenError_t::NotInitialized => cudnnError_t::NOT_INITIALIZED,\n            miopen_sys::miopenError_t::InvalidValue => cudnnError_t::INVALID_VALUE,\n            miopen_sys::miopenError_t::BadParm => cudnnError_t::BAD_PARAM,\n            miopen_sys::miopenError_t::AllocFailed => cudnnError_t::ALLOC_FAILED,\n            miopen_sys::miopenError_t::InternalError => cudnnError_t::INTERNAL_ERROR,\n            miopen_sys::miopenError_t::NotImplemented | miopen_sys::miopenError_t::UnsupportedOp => cudnnError_t::NOT_SUPPORTED,\n            miopen_sys::miopenError_t::VersionMismatch => cudnnError_t::VERSION_MISMATCH,\n            _ => cudnnError_t::INTERNAL_ERROR,\n        }\n    }\n}"
  },
  {
    "path": "cuda_types/src/cufft.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\npub type __half = u16;\npub type __nv_bfloat16 = u16;\npub use super::cuda::cuComplex;\npub use super::cuda::cuDoubleComplex;\npub use super::cuda::cudaDataType;\npub use super::cuda::cudaDataType_t;\npub type cudaStream_t = super::cuda::CUstream;\npub use super::cuda::libraryPropertyType;\npub type cudaGraphExecUpdateResultInfo_st = super::cuda::CUgraphExecUpdateResultInfo_st;\npub type cudaAsyncNotificationType = super::cuda::CUasyncNotificationType_enum;\npub type cudaGraph_t = super::cuda::CUgraph;\npub const CUFFT_VER_MAJOR: u32 = 12;\npub const CUFFT_VER_MINOR: u32 = 1;\npub const CUFFT_VER_PATCH: u32 = 0;\npub const CUFFT_VER_BUILD: u32 = 31;\npub const CUFFT_VERSION: u32 = 12100;\npub const CUFFT_FORWARD: i32 = -1;\npub const CUFFT_INVERSE: u32 = 1;\npub const CUFFT_PLAN_NULL: i32 = -1;\nimpl libFormat_t {\n    pub const LIB_FORMAT_CUFFT: libFormat_t = libFormat_t(0);\n}\nimpl libFormat_t {\n    pub const LIB_FORMAT_UNDEFINED: libFormat_t = libFormat_t(1);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct libFormat_t(pub ::core::ffi::c_uint);\npub use self::libFormat_t as libFormat;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudaXtDesc_t {\n    pub version: ::core::ffi::c_int,\n    pub nGPUs: ::core::ffi::c_int,\n    pub GPUs: [::core::ffi::c_int; 64usize],\n    pub data: [*mut ::core::ffi::c_void; 64usize],\n    pub size: [usize; 64usize],\n    pub cudaXtState: *mut ::core::ffi::c_void,\n}\npub type cudaXtDesc = cudaXtDesc_t;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cudaLibXtDesc_t {\n    pub version: ::core::ffi::c_int,\n    pub descriptor: *mut cudaXtDesc,\n    pub library: libFormat,\n    pub subFormat: ::core::ffi::c_int,\n    pub libDescriptor: *mut ::core::ffi::c_void,\n}\npub type cudaLibXtDesc = cudaLibXtDesc_t;\npub type cufftReal = f32;\npub type cufftDoubleReal = f64;\npub type cufftComplex = super::cuda::cuComplex;\npub type cufftDoubleComplex = super::cuda::cuDoubleComplex;\nimpl cufftType_t {\n    pub const CUFFT_R2C: cufftType_t = cufftType_t(42);\n}\nimpl cufftType_t {\n    pub const CUFFT_C2R: cufftType_t = cufftType_t(44);\n}\nimpl cufftType_t {\n    pub const CUFFT_C2C: cufftType_t = cufftType_t(41);\n}\nimpl cufftType_t {\n    pub const CUFFT_D2Z: cufftType_t = cufftType_t(106);\n}\nimpl cufftType_t {\n    pub const CUFFT_Z2D: cufftType_t = cufftType_t(108);\n}\nimpl cufftType_t {\n    pub const CUFFT_Z2Z: cufftType_t = cufftType_t(105);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cufftType_t(pub ::core::ffi::c_uint);\npub use self::cufftType_t as cufftType;\nimpl cufftCompatibility_t {\n    pub const CUFFT_COMPATIBILITY_FFTW_PADDING: cufftCompatibility_t = cufftCompatibility_t(\n        1,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cufftCompatibility_t(pub ::core::ffi::c_uint);\npub use self::cufftCompatibility_t as cufftCompatibility;\npub type cufftHandle = ::core::ffi::c_int;\nimpl cufftProperty_t {\n    pub const NVFFT_PLAN_PROPERTY_INT64_PATIENT_JIT: cufftProperty_t = cufftProperty_t(\n        1,\n    );\n}\nimpl cufftProperty_t {\n    pub const NVFFT_PLAN_PROPERTY_INT64_MAX_NUM_HOST_THREADS: cufftProperty_t = cufftProperty_t(\n        2,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cufftProperty_t(pub ::core::ffi::c_uint);\npub use self::cufftProperty_t as cufftProperty;\nimpl cufftXtSubFormat_t {\n    pub const CUFFT_XT_FORMAT_INPUT: cufftXtSubFormat_t = cufftXtSubFormat_t(0);\n}\nimpl cufftXtSubFormat_t {\n    pub const CUFFT_XT_FORMAT_OUTPUT: cufftXtSubFormat_t = cufftXtSubFormat_t(1);\n}\nimpl cufftXtSubFormat_t {\n    pub const CUFFT_XT_FORMAT_INPLACE: cufftXtSubFormat_t = cufftXtSubFormat_t(2);\n}\nimpl cufftXtSubFormat_t {\n    pub const CUFFT_XT_FORMAT_INPLACE_SHUFFLED: cufftXtSubFormat_t = cufftXtSubFormat_t(\n        3,\n    );\n}\nimpl cufftXtSubFormat_t {\n    pub const CUFFT_XT_FORMAT_1D_INPUT_SHUFFLED: cufftXtSubFormat_t = cufftXtSubFormat_t(\n        4,\n    );\n}\nimpl cufftXtSubFormat_t {\n    pub const CUFFT_XT_FORMAT_DISTRIBUTED_INPUT: cufftXtSubFormat_t = cufftXtSubFormat_t(\n        5,\n    );\n}\nimpl cufftXtSubFormat_t {\n    pub const CUFFT_XT_FORMAT_DISTRIBUTED_OUTPUT: cufftXtSubFormat_t = cufftXtSubFormat_t(\n        6,\n    );\n}\nimpl cufftXtSubFormat_t {\n    pub const CUFFT_FORMAT_UNDEFINED: cufftXtSubFormat_t = cufftXtSubFormat_t(7);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cufftXtSubFormat_t(pub ::core::ffi::c_uint);\npub use self::cufftXtSubFormat_t as cufftXtSubFormat;\nimpl cufftXtCopyType_t {\n    pub const CUFFT_COPY_HOST_TO_DEVICE: cufftXtCopyType_t = cufftXtCopyType_t(0);\n}\nimpl cufftXtCopyType_t {\n    pub const CUFFT_COPY_DEVICE_TO_HOST: cufftXtCopyType_t = cufftXtCopyType_t(1);\n}\nimpl cufftXtCopyType_t {\n    pub const CUFFT_COPY_DEVICE_TO_DEVICE: cufftXtCopyType_t = cufftXtCopyType_t(2);\n}\nimpl cufftXtCopyType_t {\n    pub const CUFFT_COPY_UNDEFINED: cufftXtCopyType_t = cufftXtCopyType_t(3);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cufftXtCopyType_t(pub ::core::ffi::c_uint);\npub use self::cufftXtCopyType_t as cufftXtCopyType;\nimpl cufftXtQueryType_t {\n    pub const CUFFT_QUERY_1D_FACTORS: cufftXtQueryType_t = cufftXtQueryType_t(0);\n}\nimpl cufftXtQueryType_t {\n    pub const CUFFT_QUERY_UNDEFINED: cufftXtQueryType_t = cufftXtQueryType_t(1);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cufftXtQueryType_t(pub ::core::ffi::c_uint);\npub use self::cufftXtQueryType_t as cufftXtQueryType;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cufftXt1dFactors_t {\n    pub size: ::core::ffi::c_longlong,\n    pub stringCount: ::core::ffi::c_longlong,\n    pub stringLength: ::core::ffi::c_longlong,\n    pub substringLength: ::core::ffi::c_longlong,\n    pub factor1: ::core::ffi::c_longlong,\n    pub factor2: ::core::ffi::c_longlong,\n    pub stringMask: ::core::ffi::c_longlong,\n    pub substringMask: ::core::ffi::c_longlong,\n    pub factor1Mask: ::core::ffi::c_longlong,\n    pub factor2Mask: ::core::ffi::c_longlong,\n    pub stringShift: ::core::ffi::c_int,\n    pub substringShift: ::core::ffi::c_int,\n    pub factor1Shift: ::core::ffi::c_int,\n    pub factor2Shift: ::core::ffi::c_int,\n}\npub type cufftXt1dFactors = cufftXt1dFactors_t;\nimpl cufftXtWorkAreaPolicy_t {\n    pub const CUFFT_WORKAREA_MINIMAL: cufftXtWorkAreaPolicy_t = cufftXtWorkAreaPolicy_t(\n        0,\n    );\n}\nimpl cufftXtWorkAreaPolicy_t {\n    pub const CUFFT_WORKAREA_USER: cufftXtWorkAreaPolicy_t = cufftXtWorkAreaPolicy_t(1);\n}\nimpl cufftXtWorkAreaPolicy_t {\n    pub const CUFFT_WORKAREA_PERFORMANCE: cufftXtWorkAreaPolicy_t = cufftXtWorkAreaPolicy_t(\n        2,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cufftXtWorkAreaPolicy_t(pub ::core::ffi::c_uint);\npub use self::cufftXtWorkAreaPolicy_t as cufftXtWorkAreaPolicy;\nimpl cufftXtCallbackType_t {\n    pub const CUFFT_CB_LD_COMPLEX: cufftXtCallbackType_t = cufftXtCallbackType_t(0);\n}\nimpl cufftXtCallbackType_t {\n    pub const CUFFT_CB_LD_COMPLEX_DOUBLE: cufftXtCallbackType_t = cufftXtCallbackType_t(\n        1,\n    );\n}\nimpl cufftXtCallbackType_t {\n    pub const CUFFT_CB_LD_REAL: cufftXtCallbackType_t = cufftXtCallbackType_t(2);\n}\nimpl cufftXtCallbackType_t {\n    pub const CUFFT_CB_LD_REAL_DOUBLE: cufftXtCallbackType_t = cufftXtCallbackType_t(3);\n}\nimpl cufftXtCallbackType_t {\n    pub const CUFFT_CB_ST_COMPLEX: cufftXtCallbackType_t = cufftXtCallbackType_t(4);\n}\nimpl cufftXtCallbackType_t {\n    pub const CUFFT_CB_ST_COMPLEX_DOUBLE: cufftXtCallbackType_t = cufftXtCallbackType_t(\n        5,\n    );\n}\nimpl cufftXtCallbackType_t {\n    pub const CUFFT_CB_ST_REAL: cufftXtCallbackType_t = cufftXtCallbackType_t(6);\n}\nimpl cufftXtCallbackType_t {\n    pub const CUFFT_CB_ST_REAL_DOUBLE: cufftXtCallbackType_t = cufftXtCallbackType_t(7);\n}\nimpl cufftXtCallbackType_t {\n    pub const CUFFT_CB_UNDEFINED: cufftXtCallbackType_t = cufftXtCallbackType_t(8);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cufftXtCallbackType_t(pub ::core::ffi::c_uint);\npub use self::cufftXtCallbackType_t as cufftXtCallbackType;\npub type cufftCallbackLoadC = ::core::option::Option<\n    unsafe extern \"C\" fn(\n        dataIn: *mut ::core::ffi::c_void,\n        offset: usize,\n        callerInfo: *mut ::core::ffi::c_void,\n        sharedPointer: *mut ::core::ffi::c_void,\n    ) -> cufftComplex,\n>;\npub type cufftCallbackLoadZ = ::core::option::Option<\n    unsafe extern \"C\" fn(\n        dataIn: *mut ::core::ffi::c_void,\n        offset: usize,\n        callerInfo: *mut ::core::ffi::c_void,\n        sharedPointer: *mut ::core::ffi::c_void,\n    ) -> cufftDoubleComplex,\n>;\npub type cufftCallbackLoadR = ::core::option::Option<\n    unsafe extern \"C\" fn(\n        dataIn: *mut ::core::ffi::c_void,\n        offset: usize,\n        callerInfo: *mut ::core::ffi::c_void,\n        sharedPointer: *mut ::core::ffi::c_void,\n    ) -> cufftReal,\n>;\npub type cufftCallbackLoadD = ::core::option::Option<\n    unsafe extern \"C\" fn(\n        dataIn: *mut ::core::ffi::c_void,\n        offset: usize,\n        callerInfo: *mut ::core::ffi::c_void,\n        sharedPointer: *mut ::core::ffi::c_void,\n    ) -> cufftDoubleReal,\n>;\npub type cufftCallbackStoreC = ::core::option::Option<\n    unsafe extern \"C\" fn(\n        dataOut: *mut ::core::ffi::c_void,\n        offset: usize,\n        element: cufftComplex,\n        callerInfo: *mut ::core::ffi::c_void,\n        sharedPointer: *mut ::core::ffi::c_void,\n    ),\n>;\npub type cufftCallbackStoreZ = ::core::option::Option<\n    unsafe extern \"C\" fn(\n        dataOut: *mut ::core::ffi::c_void,\n        offset: usize,\n        element: cufftDoubleComplex,\n        callerInfo: *mut ::core::ffi::c_void,\n        sharedPointer: *mut ::core::ffi::c_void,\n    ),\n>;\npub type cufftCallbackStoreR = ::core::option::Option<\n    unsafe extern \"C\" fn(\n        dataOut: *mut ::core::ffi::c_void,\n        offset: usize,\n        element: cufftReal,\n        callerInfo: *mut ::core::ffi::c_void,\n        sharedPointer: *mut ::core::ffi::c_void,\n    ),\n>;\npub type cufftCallbackStoreD = ::core::option::Option<\n    unsafe extern \"C\" fn(\n        dataOut: *mut ::core::ffi::c_void,\n        offset: usize,\n        element: cufftDoubleReal,\n        callerInfo: *mut ::core::ffi::c_void,\n        sharedPointer: *mut ::core::ffi::c_void,\n    ),\n>;\npub type cufftJITCallbackLoadC = ::core::option::Option<\n    unsafe extern \"C\" fn(\n        dataIn: *mut ::core::ffi::c_void,\n        offset: ::core::ffi::c_ulonglong,\n        callerInfo: *mut ::core::ffi::c_void,\n        sharedPointer: *mut ::core::ffi::c_void,\n    ) -> cufftComplex,\n>;\npub type cufftJITCallbackLoadZ = ::core::option::Option<\n    unsafe extern \"C\" fn(\n        dataIn: *mut ::core::ffi::c_void,\n        offset: ::core::ffi::c_ulonglong,\n        callerInfo: *mut ::core::ffi::c_void,\n        sharedPointer: *mut ::core::ffi::c_void,\n    ) -> cufftDoubleComplex,\n>;\npub type cufftJITCallbackLoadR = ::core::option::Option<\n    unsafe extern \"C\" fn(\n        dataIn: *mut ::core::ffi::c_void,\n        offset: ::core::ffi::c_ulonglong,\n        callerInfo: *mut ::core::ffi::c_void,\n        sharedPointer: *mut ::core::ffi::c_void,\n    ) -> cufftReal,\n>;\npub type cufftJITCallbackLoadD = ::core::option::Option<\n    unsafe extern \"C\" fn(\n        dataIn: *mut ::core::ffi::c_void,\n        offset: ::core::ffi::c_ulonglong,\n        callerInfo: *mut ::core::ffi::c_void,\n        sharedPointer: *mut ::core::ffi::c_void,\n    ) -> cufftDoubleReal,\n>;\npub type cufftJITCallbackStoreC = ::core::option::Option<\n    unsafe extern \"C\" fn(\n        dataOut: *mut ::core::ffi::c_void,\n        offset: ::core::ffi::c_ulonglong,\n        element: cufftComplex,\n        callerInfo: *mut ::core::ffi::c_void,\n        sharedPointer: *mut ::core::ffi::c_void,\n    ),\n>;\npub type cufftJITCallbackStoreZ = ::core::option::Option<\n    unsafe extern \"C\" fn(\n        dataOut: *mut ::core::ffi::c_void,\n        offset: ::core::ffi::c_ulonglong,\n        element: cufftDoubleComplex,\n        callerInfo: *mut ::core::ffi::c_void,\n        sharedPointer: *mut ::core::ffi::c_void,\n    ),\n>;\npub type cufftJITCallbackStoreR = ::core::option::Option<\n    unsafe extern \"C\" fn(\n        dataOut: *mut ::core::ffi::c_void,\n        offset: ::core::ffi::c_ulonglong,\n        element: cufftReal,\n        callerInfo: *mut ::core::ffi::c_void,\n        sharedPointer: *mut ::core::ffi::c_void,\n    ),\n>;\npub type cufftJITCallbackStoreD = ::core::option::Option<\n    unsafe extern \"C\" fn(\n        dataOut: *mut ::core::ffi::c_void,\n        offset: ::core::ffi::c_ulonglong,\n        element: cufftDoubleReal,\n        callerInfo: *mut ::core::ffi::c_void,\n        sharedPointer: *mut ::core::ffi::c_void,\n    ),\n>;\nimpl cufftError_t {\n    pub const r#INVALID_PLAN: cufftError_t = cufftError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(1)\n    });\n    pub const r#ALLOC_FAILED: cufftError_t = cufftError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(2)\n    });\n    pub const r#INVALID_TYPE: cufftError_t = cufftError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3)\n    });\n    pub const r#INVALID_VALUE: cufftError_t = cufftError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(4)\n    });\n    pub const r#INTERNAL_ERROR: cufftError_t = cufftError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(5)\n    });\n    pub const r#EXEC_FAILED: cufftError_t = cufftError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(6)\n    });\n    pub const r#SETUP_FAILED: cufftError_t = cufftError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(7)\n    });\n    pub const r#INVALID_SIZE: cufftError_t = cufftError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(8)\n    });\n    pub const r#UNALIGNED_DATA: cufftError_t = cufftError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(9)\n    });\n    pub const r#INVALID_DEVICE: cufftError_t = cufftError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(11)\n    });\n    pub const r#NO_WORKSPACE: cufftError_t = cufftError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(13)\n    });\n    pub const r#NOT_IMPLEMENTED: cufftError_t = cufftError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(14)\n    });\n    pub const r#NOT_SUPPORTED: cufftError_t = cufftError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(16)\n    });\n    pub const r#MISSING_DEPENDENCY: cufftError_t = cufftError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(17)\n    });\n    pub const r#NVRTC_FAILURE: cufftError_t = cufftError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(18)\n    });\n    pub const r#NVJITLINK_FAILURE: cufftError_t = cufftError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(19)\n    });\n    pub const r#NVSHMEM_FAILURE: cufftError_t = cufftError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(20)\n    });\n}\n#[repr(transparent)]\n#[derive(Debug, Hash, Copy, Clone, PartialEq, Eq)]\npub struct cufftError_t(pub ::core::num::NonZeroU32);\npub trait cufftResultConsts {\n    const SUCCESS: cufftResult = cufftResult::Ok(());\n    const ERROR_INVALID_PLAN: cufftResult = cufftResult::Err(\n        cufftError_t::r#INVALID_PLAN,\n    );\n    const ERROR_ALLOC_FAILED: cufftResult = cufftResult::Err(\n        cufftError_t::r#ALLOC_FAILED,\n    );\n    const ERROR_INVALID_TYPE: cufftResult = cufftResult::Err(\n        cufftError_t::r#INVALID_TYPE,\n    );\n    const ERROR_INVALID_VALUE: cufftResult = cufftResult::Err(\n        cufftError_t::r#INVALID_VALUE,\n    );\n    const ERROR_INTERNAL_ERROR: cufftResult = cufftResult::Err(\n        cufftError_t::r#INTERNAL_ERROR,\n    );\n    const ERROR_EXEC_FAILED: cufftResult = cufftResult::Err(cufftError_t::r#EXEC_FAILED);\n    const ERROR_SETUP_FAILED: cufftResult = cufftResult::Err(\n        cufftError_t::r#SETUP_FAILED,\n    );\n    const ERROR_INVALID_SIZE: cufftResult = cufftResult::Err(\n        cufftError_t::r#INVALID_SIZE,\n    );\n    const ERROR_UNALIGNED_DATA: cufftResult = cufftResult::Err(\n        cufftError_t::r#UNALIGNED_DATA,\n    );\n    const ERROR_INVALID_DEVICE: cufftResult = cufftResult::Err(\n        cufftError_t::r#INVALID_DEVICE,\n    );\n    const ERROR_NO_WORKSPACE: cufftResult = cufftResult::Err(\n        cufftError_t::r#NO_WORKSPACE,\n    );\n    const ERROR_NOT_IMPLEMENTED: cufftResult = cufftResult::Err(\n        cufftError_t::r#NOT_IMPLEMENTED,\n    );\n    const ERROR_NOT_SUPPORTED: cufftResult = cufftResult::Err(\n        cufftError_t::r#NOT_SUPPORTED,\n    );\n    const ERROR_MISSING_DEPENDENCY: cufftResult = cufftResult::Err(\n        cufftError_t::r#MISSING_DEPENDENCY,\n    );\n    const ERROR_NVRTC_FAILURE: cufftResult = cufftResult::Err(\n        cufftError_t::r#NVRTC_FAILURE,\n    );\n    const ERROR_NVJITLINK_FAILURE: cufftResult = cufftResult::Err(\n        cufftError_t::r#NVJITLINK_FAILURE,\n    );\n    const ERROR_NVSHMEM_FAILURE: cufftResult = cufftResult::Err(\n        cufftError_t::r#NVSHMEM_FAILURE,\n    );\n}\nimpl cufftResultConsts for cufftResult {}\n#[must_use]\npub type cufftResult = ::core::result::Result<(), cufftError_t>;\nconst _: fn() = || {\n    let _ = std::mem::transmute::<cufftResult, u32>;\n};\n"
  },
  {
    "path": "cuda_types/src/cusparse.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\npub type __half = u16;\npub type __nv_bfloat16 = u16;\npub use super::cuda::cuComplex;\npub use super::cuda::cuDoubleComplex;\npub use super::cuda::cudaDataType;\npub use super::cuda::cudaDataType_t;\npub type cudaStream_t = super::cuda::CUstream;\npub use super::cuda::libraryPropertyType;\npub type cudaGraphExecUpdateResultInfo_st = super::cuda::CUgraphExecUpdateResultInfo_st;\npub type cudaAsyncNotificationType = super::cuda::CUasyncNotificationType_enum;\npub type cudaGraph_t = super::cuda::CUgraph;\npub const CUSPARSE_VER_MAJOR: u32 = 12;\npub const CUSPARSE_VER_MINOR: u32 = 6;\npub const CUSPARSE_VER_PATCH: u32 = 3;\npub const CUSPARSE_VER_BUILD: u32 = 3;\npub const CUSPARSE_VERSION: u32 = 12603;\n/// Result information returned by cudaGraphExecUpdate\npub type cudaGraphExecUpdateResultInfo = cudaGraphExecUpdateResultInfo_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cusparseContext {\n    _unused: [u8; 0],\n}\npub type cusparseHandle_t = *mut cusparseContext;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cusparseMatDescr {\n    _unused: [u8; 0],\n}\npub type cusparseMatDescr_t = *mut cusparseMatDescr;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct bsrsv2Info {\n    _unused: [u8; 0],\n}\npub type bsrsv2Info_t = *mut bsrsv2Info;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct bsrsm2Info {\n    _unused: [u8; 0],\n}\npub type bsrsm2Info_t = *mut bsrsm2Info;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct csric02Info {\n    _unused: [u8; 0],\n}\npub type csric02Info_t = *mut csric02Info;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct bsric02Info {\n    _unused: [u8; 0],\n}\npub type bsric02Info_t = *mut bsric02Info;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct csrilu02Info {\n    _unused: [u8; 0],\n}\npub type csrilu02Info_t = *mut csrilu02Info;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct bsrilu02Info {\n    _unused: [u8; 0],\n}\npub type bsrilu02Info_t = *mut bsrilu02Info;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct csru2csrInfo {\n    _unused: [u8; 0],\n}\npub type csru2csrInfo_t = *mut csru2csrInfo;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cusparseColorInfo {\n    _unused: [u8; 0],\n}\npub type cusparseColorInfo_t = *mut cusparseColorInfo;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct pruneInfo {\n    _unused: [u8; 0],\n}\npub type pruneInfo_t = *mut pruneInfo;\nimpl cusparsePointerMode_t {\n    pub const CUSPARSE_POINTER_MODE_HOST: cusparsePointerMode_t = cusparsePointerMode_t(\n        0,\n    );\n}\nimpl cusparsePointerMode_t {\n    pub const CUSPARSE_POINTER_MODE_DEVICE: cusparsePointerMode_t = cusparsePointerMode_t(\n        1,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cusparsePointerMode_t(pub ::core::ffi::c_uint);\nimpl cusparseAction_t {\n    pub const CUSPARSE_ACTION_SYMBOLIC: cusparseAction_t = cusparseAction_t(0);\n}\nimpl cusparseAction_t {\n    pub const CUSPARSE_ACTION_NUMERIC: cusparseAction_t = cusparseAction_t(1);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cusparseAction_t(pub ::core::ffi::c_uint);\nimpl cusparseMatrixType_t {\n    pub const CUSPARSE_MATRIX_TYPE_GENERAL: cusparseMatrixType_t = cusparseMatrixType_t(\n        0,\n    );\n}\nimpl cusparseMatrixType_t {\n    pub const CUSPARSE_MATRIX_TYPE_SYMMETRIC: cusparseMatrixType_t = cusparseMatrixType_t(\n        1,\n    );\n}\nimpl cusparseMatrixType_t {\n    pub const CUSPARSE_MATRIX_TYPE_HERMITIAN: cusparseMatrixType_t = cusparseMatrixType_t(\n        2,\n    );\n}\nimpl cusparseMatrixType_t {\n    pub const CUSPARSE_MATRIX_TYPE_TRIANGULAR: cusparseMatrixType_t = cusparseMatrixType_t(\n        3,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cusparseMatrixType_t(pub ::core::ffi::c_uint);\nimpl cusparseFillMode_t {\n    pub const CUSPARSE_FILL_MODE_LOWER: cusparseFillMode_t = cusparseFillMode_t(0);\n}\nimpl cusparseFillMode_t {\n    pub const CUSPARSE_FILL_MODE_UPPER: cusparseFillMode_t = cusparseFillMode_t(1);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cusparseFillMode_t(pub ::core::ffi::c_uint);\nimpl cusparseDiagType_t {\n    pub const CUSPARSE_DIAG_TYPE_NON_UNIT: cusparseDiagType_t = cusparseDiagType_t(0);\n}\nimpl cusparseDiagType_t {\n    pub const CUSPARSE_DIAG_TYPE_UNIT: cusparseDiagType_t = cusparseDiagType_t(1);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cusparseDiagType_t(pub ::core::ffi::c_uint);\nimpl cusparseIndexBase_t {\n    pub const CUSPARSE_INDEX_BASE_ZERO: cusparseIndexBase_t = cusparseIndexBase_t(0);\n}\nimpl cusparseIndexBase_t {\n    pub const CUSPARSE_INDEX_BASE_ONE: cusparseIndexBase_t = cusparseIndexBase_t(1);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cusparseIndexBase_t(pub ::core::ffi::c_uint);\nimpl cusparseOperation_t {\n    pub const CUSPARSE_OPERATION_NON_TRANSPOSE: cusparseOperation_t = cusparseOperation_t(\n        0,\n    );\n}\nimpl cusparseOperation_t {\n    pub const CUSPARSE_OPERATION_TRANSPOSE: cusparseOperation_t = cusparseOperation_t(1);\n}\nimpl cusparseOperation_t {\n    pub const CUSPARSE_OPERATION_CONJUGATE_TRANSPOSE: cusparseOperation_t = cusparseOperation_t(\n        2,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cusparseOperation_t(pub ::core::ffi::c_uint);\nimpl cusparseDirection_t {\n    pub const CUSPARSE_DIRECTION_ROW: cusparseDirection_t = cusparseDirection_t(0);\n}\nimpl cusparseDirection_t {\n    pub const CUSPARSE_DIRECTION_COLUMN: cusparseDirection_t = cusparseDirection_t(1);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cusparseDirection_t(pub ::core::ffi::c_uint);\nimpl cusparseSolvePolicy_t {\n    pub const CUSPARSE_SOLVE_POLICY_NO_LEVEL: cusparseSolvePolicy_t = cusparseSolvePolicy_t(\n        0,\n    );\n}\nimpl cusparseSolvePolicy_t {\n    pub const CUSPARSE_SOLVE_POLICY_USE_LEVEL: cusparseSolvePolicy_t = cusparseSolvePolicy_t(\n        1,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cusparseSolvePolicy_t(pub ::core::ffi::c_uint);\nimpl cusparseColorAlg_t {\n    pub const CUSPARSE_COLOR_ALG0: cusparseColorAlg_t = cusparseColorAlg_t(0);\n}\nimpl cusparseColorAlg_t {\n    pub const CUSPARSE_COLOR_ALG1: cusparseColorAlg_t = cusparseColorAlg_t(1);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cusparseColorAlg_t(pub ::core::ffi::c_uint);\npub type cusparseLoggerCallback_t = ::core::option::Option<\n    unsafe extern \"C\" fn(\n        logLevel: ::core::ffi::c_int,\n        functionName: *const ::core::ffi::c_char,\n        message: *const ::core::ffi::c_char,\n    ),\n>;\nimpl cusparseCsr2CscAlg_t {\n    pub const CUSPARSE_CSR2CSC_ALG_DEFAULT: cusparseCsr2CscAlg_t = cusparseCsr2CscAlg_t(\n        1,\n    );\n}\nimpl cusparseCsr2CscAlg_t {\n    pub const CUSPARSE_CSR2CSC_ALG1: cusparseCsr2CscAlg_t = cusparseCsr2CscAlg_t(1);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cusparseCsr2CscAlg_t(pub ::core::ffi::c_uint);\nimpl cusparseFormat_t {\n    ///< Compressed Sparse Row (CSR)\n    pub const CUSPARSE_FORMAT_CSR: cusparseFormat_t = cusparseFormat_t(1);\n}\nimpl cusparseFormat_t {\n    ///< Compressed Sparse Column (CSC)\n    pub const CUSPARSE_FORMAT_CSC: cusparseFormat_t = cusparseFormat_t(2);\n}\nimpl cusparseFormat_t {\n    ///< Coordinate (COO) - Structure of Arrays\n    pub const CUSPARSE_FORMAT_COO: cusparseFormat_t = cusparseFormat_t(3);\n}\nimpl cusparseFormat_t {\n    ///< Blocked ELL\n    pub const CUSPARSE_FORMAT_BLOCKED_ELL: cusparseFormat_t = cusparseFormat_t(5);\n}\nimpl cusparseFormat_t {\n    ///< Blocked Compressed Sparse Row (BSR)\n    pub const CUSPARSE_FORMAT_BSR: cusparseFormat_t = cusparseFormat_t(6);\n}\nimpl cusparseFormat_t {\n    ///< Sliced ELL\n    pub const CUSPARSE_FORMAT_SLICED_ELLPACK: cusparseFormat_t = cusparseFormat_t(7);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cusparseFormat_t(pub ::core::ffi::c_uint);\nimpl cusparseOrder_t {\n    ///< Column-Major Order - Matrix memory layout\n    pub const CUSPARSE_ORDER_COL: cusparseOrder_t = cusparseOrder_t(1);\n}\nimpl cusparseOrder_t {\n    ///< Row-Major Order - Matrix memory layout\n    pub const CUSPARSE_ORDER_ROW: cusparseOrder_t = cusparseOrder_t(2);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cusparseOrder_t(pub ::core::ffi::c_uint);\nimpl cusparseIndexType_t {\n    /**< 16-bit unsigned integer for matrix/vector\n< indices*/\n    pub const CUSPARSE_INDEX_16U: cusparseIndexType_t = cusparseIndexType_t(1);\n}\nimpl cusparseIndexType_t {\n    ///< 32-bit signed integer for matrix/vector indices\n    pub const CUSPARSE_INDEX_32I: cusparseIndexType_t = cusparseIndexType_t(2);\n}\nimpl cusparseIndexType_t {\n    ///< 64-bit signed integer for matrix/vector indices\n    pub const CUSPARSE_INDEX_64I: cusparseIndexType_t = cusparseIndexType_t(3);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cusparseIndexType_t(pub ::core::ffi::c_uint);\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cusparseSpVecDescr {\n    _unused: [u8; 0],\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cusparseDnVecDescr {\n    _unused: [u8; 0],\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cusparseSpMatDescr {\n    _unused: [u8; 0],\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cusparseDnMatDescr {\n    _unused: [u8; 0],\n}\npub type cusparseSpVecDescr_t = *mut cusparseSpVecDescr;\npub type cusparseDnVecDescr_t = *mut cusparseDnVecDescr;\npub type cusparseSpMatDescr_t = *mut cusparseSpMatDescr;\npub type cusparseDnMatDescr_t = *mut cusparseDnMatDescr;\npub type cusparseConstSpVecDescr_t = *const cusparseSpVecDescr;\npub type cusparseConstDnVecDescr_t = *const cusparseDnVecDescr;\npub type cusparseConstSpMatDescr_t = *const cusparseSpMatDescr;\npub type cusparseConstDnMatDescr_t = *const cusparseDnMatDescr;\nimpl cusparseSpMatAttribute_t {\n    pub const CUSPARSE_SPMAT_FILL_MODE: cusparseSpMatAttribute_t = cusparseSpMatAttribute_t(\n        0,\n    );\n}\nimpl cusparseSpMatAttribute_t {\n    pub const CUSPARSE_SPMAT_DIAG_TYPE: cusparseSpMatAttribute_t = cusparseSpMatAttribute_t(\n        1,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cusparseSpMatAttribute_t(pub ::core::ffi::c_uint);\nimpl cusparseSparseToDenseAlg_t {\n    pub const CUSPARSE_SPARSETODENSE_ALG_DEFAULT: cusparseSparseToDenseAlg_t = cusparseSparseToDenseAlg_t(\n        0,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cusparseSparseToDenseAlg_t(pub ::core::ffi::c_uint);\nimpl cusparseDenseToSparseAlg_t {\n    pub const CUSPARSE_DENSETOSPARSE_ALG_DEFAULT: cusparseDenseToSparseAlg_t = cusparseDenseToSparseAlg_t(\n        0,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cusparseDenseToSparseAlg_t(pub ::core::ffi::c_uint);\nimpl cusparseSpMVAlg_t {\n    pub const CUSPARSE_SPMV_ALG_DEFAULT: cusparseSpMVAlg_t = cusparseSpMVAlg_t(0);\n}\nimpl cusparseSpMVAlg_t {\n    pub const CUSPARSE_SPMV_CSR_ALG1: cusparseSpMVAlg_t = cusparseSpMVAlg_t(2);\n}\nimpl cusparseSpMVAlg_t {\n    pub const CUSPARSE_SPMV_CSR_ALG2: cusparseSpMVAlg_t = cusparseSpMVAlg_t(3);\n}\nimpl cusparseSpMVAlg_t {\n    pub const CUSPARSE_SPMV_COO_ALG1: cusparseSpMVAlg_t = cusparseSpMVAlg_t(1);\n}\nimpl cusparseSpMVAlg_t {\n    pub const CUSPARSE_SPMV_COO_ALG2: cusparseSpMVAlg_t = cusparseSpMVAlg_t(4);\n}\nimpl cusparseSpMVAlg_t {\n    pub const CUSPARSE_SPMV_SELL_ALG1: cusparseSpMVAlg_t = cusparseSpMVAlg_t(5);\n}\nimpl cusparseSpMVAlg_t {\n    pub const CUSPARSE_SPMV_BSR_ALG1: cusparseSpMVAlg_t = cusparseSpMVAlg_t(6);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cusparseSpMVAlg_t(pub ::core::ffi::c_uint);\nimpl cusparseSpSVAlg_t {\n    pub const CUSPARSE_SPSV_ALG_DEFAULT: cusparseSpSVAlg_t = cusparseSpSVAlg_t(0);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cusparseSpSVAlg_t(pub ::core::ffi::c_uint);\nimpl cusparseSpSVUpdate_t {\n    pub const CUSPARSE_SPSV_UPDATE_GENERAL: cusparseSpSVUpdate_t = cusparseSpSVUpdate_t(\n        0,\n    );\n}\nimpl cusparseSpSVUpdate_t {\n    pub const CUSPARSE_SPSV_UPDATE_DIAGONAL: cusparseSpSVUpdate_t = cusparseSpSVUpdate_t(\n        1,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cusparseSpSVUpdate_t(pub ::core::ffi::c_uint);\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cusparseSpSVDescr {\n    _unused: [u8; 0],\n}\npub type cusparseSpSVDescr_t = *mut cusparseSpSVDescr;\nimpl cusparseSpSMAlg_t {\n    pub const CUSPARSE_SPSM_ALG_DEFAULT: cusparseSpSMAlg_t = cusparseSpSMAlg_t(0);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cusparseSpSMAlg_t(pub ::core::ffi::c_uint);\nimpl cusparseSpSMUpdate_t {\n    pub const CUSPARSE_SPSM_UPDATE_GENERAL: cusparseSpSMUpdate_t = cusparseSpSMUpdate_t(\n        0,\n    );\n}\nimpl cusparseSpSMUpdate_t {\n    pub const CUSPARSE_SPSM_UPDATE_DIAGONAL: cusparseSpSMUpdate_t = cusparseSpSMUpdate_t(\n        1,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cusparseSpSMUpdate_t(pub ::core::ffi::c_uint);\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cusparseSpSMDescr {\n    _unused: [u8; 0],\n}\npub type cusparseSpSMDescr_t = *mut cusparseSpSMDescr;\nimpl cusparseSpMMAlg_t {\n    pub const CUSPARSE_SPMM_ALG_DEFAULT: cusparseSpMMAlg_t = cusparseSpMMAlg_t(0);\n}\nimpl cusparseSpMMAlg_t {\n    pub const CUSPARSE_SPMM_COO_ALG1: cusparseSpMMAlg_t = cusparseSpMMAlg_t(1);\n}\nimpl cusparseSpMMAlg_t {\n    pub const CUSPARSE_SPMM_COO_ALG2: cusparseSpMMAlg_t = cusparseSpMMAlg_t(2);\n}\nimpl cusparseSpMMAlg_t {\n    pub const CUSPARSE_SPMM_COO_ALG3: cusparseSpMMAlg_t = cusparseSpMMAlg_t(3);\n}\nimpl cusparseSpMMAlg_t {\n    pub const CUSPARSE_SPMM_COO_ALG4: cusparseSpMMAlg_t = cusparseSpMMAlg_t(5);\n}\nimpl cusparseSpMMAlg_t {\n    pub const CUSPARSE_SPMM_CSR_ALG1: cusparseSpMMAlg_t = cusparseSpMMAlg_t(4);\n}\nimpl cusparseSpMMAlg_t {\n    pub const CUSPARSE_SPMM_CSR_ALG2: cusparseSpMMAlg_t = cusparseSpMMAlg_t(6);\n}\nimpl cusparseSpMMAlg_t {\n    pub const CUSPARSE_SPMM_CSR_ALG3: cusparseSpMMAlg_t = cusparseSpMMAlg_t(12);\n}\nimpl cusparseSpMMAlg_t {\n    pub const CUSPARSE_SPMM_BLOCKED_ELL_ALG1: cusparseSpMMAlg_t = cusparseSpMMAlg_t(13);\n}\nimpl cusparseSpMMAlg_t {\n    pub const CUSPARSE_SPMM_BSR_ALG1: cusparseSpMMAlg_t = cusparseSpMMAlg_t(14);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cusparseSpMMAlg_t(pub ::core::ffi::c_uint);\nimpl cusparseSpGEMMAlg_t {\n    pub const CUSPARSE_SPGEMM_DEFAULT: cusparseSpGEMMAlg_t = cusparseSpGEMMAlg_t(0);\n}\nimpl cusparseSpGEMMAlg_t {\n    pub const CUSPARSE_SPGEMM_CSR_ALG_DETERMINITIC: cusparseSpGEMMAlg_t = cusparseSpGEMMAlg_t(\n        1,\n    );\n}\nimpl cusparseSpGEMMAlg_t {\n    pub const CUSPARSE_SPGEMM_CSR_ALG_NONDETERMINITIC: cusparseSpGEMMAlg_t = cusparseSpGEMMAlg_t(\n        2,\n    );\n}\nimpl cusparseSpGEMMAlg_t {\n    pub const CUSPARSE_SPGEMM_ALG1: cusparseSpGEMMAlg_t = cusparseSpGEMMAlg_t(3);\n}\nimpl cusparseSpGEMMAlg_t {\n    pub const CUSPARSE_SPGEMM_ALG2: cusparseSpGEMMAlg_t = cusparseSpGEMMAlg_t(4);\n}\nimpl cusparseSpGEMMAlg_t {\n    pub const CUSPARSE_SPGEMM_ALG3: cusparseSpGEMMAlg_t = cusparseSpGEMMAlg_t(5);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cusparseSpGEMMAlg_t(pub ::core::ffi::c_uint);\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cusparseSpGEMMDescr {\n    _unused: [u8; 0],\n}\npub type cusparseSpGEMMDescr_t = *mut cusparseSpGEMMDescr;\nimpl cusparseSDDMMAlg_t {\n    pub const CUSPARSE_SDDMM_ALG_DEFAULT: cusparseSDDMMAlg_t = cusparseSDDMMAlg_t(0);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cusparseSDDMMAlg_t(pub ::core::ffi::c_uint);\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct cusparseSpMMOpPlan {\n    _unused: [u8; 0],\n}\npub type cusparseSpMMOpPlan_t = *mut cusparseSpMMOpPlan;\nimpl cusparseSpMMOpAlg_t {\n    pub const CUSPARSE_SPMM_OP_ALG_DEFAULT: cusparseSpMMOpAlg_t = cusparseSpMMOpAlg_t(0);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct cusparseSpMMOpAlg_t(pub ::core::ffi::c_uint);\nimpl cusparseError_t {\n    pub const r#NOT_INITIALIZED: cusparseError_t = cusparseError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(1)\n    });\n    pub const r#ALLOC_FAILED: cusparseError_t = cusparseError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(2)\n    });\n    pub const r#INVALID_VALUE: cusparseError_t = cusparseError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3)\n    });\n    pub const r#ARCH_MISMATCH: cusparseError_t = cusparseError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(4)\n    });\n    pub const r#MAPPING_ERROR: cusparseError_t = cusparseError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(5)\n    });\n    pub const r#EXECUTION_FAILED: cusparseError_t = cusparseError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(6)\n    });\n    pub const r#INTERNAL_ERROR: cusparseError_t = cusparseError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(7)\n    });\n    pub const r#MATRIX_TYPE_NOT_SUPPORTED: cusparseError_t = cusparseError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(8)\n    });\n    pub const r#ZERO_PIVOT: cusparseError_t = cusparseError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(9)\n    });\n    pub const r#NOT_SUPPORTED: cusparseError_t = cusparseError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(10)\n    });\n    pub const r#INSUFFICIENT_RESOURCES: cusparseError_t = cusparseError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(11)\n    });\n}\n#[repr(transparent)]\n#[derive(Debug, Hash, Copy, Clone, PartialEq, Eq)]\npub struct cusparseError_t(pub ::core::num::NonZeroU32);\npub trait cusparseStatus_tConsts {\n    const SUCCESS: cusparseStatus_t = cusparseStatus_t::Ok(());\n    const ERROR_NOT_INITIALIZED: cusparseStatus_t = cusparseStatus_t::Err(\n        cusparseError_t::r#NOT_INITIALIZED,\n    );\n    const ERROR_ALLOC_FAILED: cusparseStatus_t = cusparseStatus_t::Err(\n        cusparseError_t::r#ALLOC_FAILED,\n    );\n    const ERROR_INVALID_VALUE: cusparseStatus_t = cusparseStatus_t::Err(\n        cusparseError_t::r#INVALID_VALUE,\n    );\n    const ERROR_ARCH_MISMATCH: cusparseStatus_t = cusparseStatus_t::Err(\n        cusparseError_t::r#ARCH_MISMATCH,\n    );\n    const ERROR_MAPPING_ERROR: cusparseStatus_t = cusparseStatus_t::Err(\n        cusparseError_t::r#MAPPING_ERROR,\n    );\n    const ERROR_EXECUTION_FAILED: cusparseStatus_t = cusparseStatus_t::Err(\n        cusparseError_t::r#EXECUTION_FAILED,\n    );\n    const ERROR_INTERNAL_ERROR: cusparseStatus_t = cusparseStatus_t::Err(\n        cusparseError_t::r#INTERNAL_ERROR,\n    );\n    const ERROR_MATRIX_TYPE_NOT_SUPPORTED: cusparseStatus_t = cusparseStatus_t::Err(\n        cusparseError_t::r#MATRIX_TYPE_NOT_SUPPORTED,\n    );\n    const ERROR_ZERO_PIVOT: cusparseStatus_t = cusparseStatus_t::Err(\n        cusparseError_t::r#ZERO_PIVOT,\n    );\n    const ERROR_NOT_SUPPORTED: cusparseStatus_t = cusparseStatus_t::Err(\n        cusparseError_t::r#NOT_SUPPORTED,\n    );\n    const ERROR_INSUFFICIENT_RESOURCES: cusparseStatus_t = cusparseStatus_t::Err(\n        cusparseError_t::r#INSUFFICIENT_RESOURCES,\n    );\n}\nimpl cusparseStatus_tConsts for cusparseStatus_t {}\n#[must_use]\npub type cusparseStatus_t = ::core::result::Result<(), cusparseError_t>;\nconst _: fn() = || {\n    let _ = std::mem::transmute::<cusparseStatus_t, u32>;\n};\n\nimpl From<rocsparse_sys::rocsparse_error> for cusparseError_t {\n    fn from(error: rocsparse_sys::rocsparse_error) -> Self {\n        match error {\n            rocsparse_sys::rocsparse_error::invalid_handle => cusparseError_t::INVALID_VALUE,\n            rocsparse_sys::rocsparse_error::not_implemented => cusparseError_t::NOT_SUPPORTED,\n            rocsparse_sys::rocsparse_error::invalid_pointer => cusparseError_t::INVALID_VALUE,\n            rocsparse_sys::rocsparse_error::invalid_size => cusparseError_t::INVALID_VALUE,\n            rocsparse_sys::rocsparse_error::memory_error => cusparseError_t::ALLOC_FAILED,\n            rocsparse_sys::rocsparse_error::internal_error => cusparseError_t::INTERNAL_ERROR,\n            rocsparse_sys::rocsparse_error::invalid_value => cusparseError_t::INVALID_VALUE,\n            rocsparse_sys::rocsparse_error::arch_mismatch => cusparseError_t::ARCH_MISMATCH,\n            rocsparse_sys::rocsparse_error::zero_pivot => cusparseError_t::ZERO_PIVOT,\n            rocsparse_sys::rocsparse_error::not_initialized => cusparseError_t::NOT_INITIALIZED,\n            rocsparse_sys::rocsparse_error::type_mismatch => cusparseError_t::INVALID_VALUE,\n            rocsparse_sys::rocsparse_error::requires_sorted_storage => cusparseError_t::INTERNAL_ERROR,\n            rocsparse_sys::rocsparse_error::thrown_exception => cusparseError_t::INTERNAL_ERROR,\n            rocsparse_sys::rocsparse_error::r#continue => cusparseError_t::INTERNAL_ERROR,\n            _ => cusparseError_t::INTERNAL_ERROR\n        }\n    }\n}\n"
  },
  {
    "path": "cuda_types/src/dark_api.rs",
    "content": "use bitflags::bitflags;\nuse std::ffi::{c_uint, c_ulonglong, c_ushort, c_void};\n\n/*\nfat_cubin:\ntypedef struct {\n  int magic;\n  int version;\n  const unsigned long long* data;\n  void *filename_or_fatbins;  /* version 1: offline filename,\n                               * version 2: array of prelinked fatbins */\n} __fatBinC_Wrapper_t;\n\ndata start with this header:\n#define FATBIN_MAGIC 0xBA55ED50U\n#define OLD_STYLE_FATBIN_MAGIC 0x1EE55A01U\n#define FATBIN_VERSION 0x0001U\n\nstruct fatbinary_ALIGN_(8) fatBinaryHeader\n{\n  unsigned int           magic;   // FATBIN_MAGIC\n  unsigned short         version; // FATBIN_VERSION\n  unsigned short         headerSize;\n  unsigned long long int fatSize; // size of the entire fat binary excluding this header\n};\n\nthere's binary data after header\n\n*/\n\n#[repr(C)]\npub struct FatbincWrapper {\n    pub magic: c_uint,\n    pub version: c_uint,\n    pub data: *const FatbinHeader,\n    pub filename_or_fatbins: *const c_void,\n}\n\n#[repr(C, align(8))]\npub struct FatbinHeader {\n    pub magic: c_uint,\n    pub version: c_ushort,\n    pub header_size: c_ushort,\n    pub files_size: c_ulonglong, // excluding frame header, size of all blocks framed by this frame\n}\n\n#[repr(C)]\n#[derive(Debug)]\npub struct FatbinFileHeader {\n    pub kind: c_ushort,\n    pub version: c_ushort,\n    pub header_size: c_uint,\n    pub payload_size: c_uint,\n    pub unknown0: c_uint, // check if it's written into separately\n    pub compressed_size: c_uint,\n    pub unknown1: c_uint,\n    pub unknown2: c_uint,\n    pub sm_version: c_uint,\n    pub bit_width: c_uint,\n    pub unknown3: c_uint,\n    pub flags: FatbinFileHeaderFlags,\n    pub unknown5: c_ulonglong,\n    pub uncompressed_payload: c_ulonglong,\n}\n\nbitflags! {\n    #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]\n    pub struct FatbinFileHeaderFlags: u64 {\n        const Is64Bit = 0x0000000000000001;\n        const Debug = 0x0000000000000002;\n        const Linux = 0x0000000000000010;\n        const Mac = 0x0000000000000020;\n        const Windows = 0x0000000000000040;\n        const CompressedLz4 = 0x0000000000002000;\n        const CompressedZstd = 0x0000000000008000;\n\n        const _ = !0;\n    }\n}\n\nimpl FatbincWrapper {\n    pub const MAGIC: [u8; 4] = 0x466243B1u32.to_le_bytes();\n    pub const VERSION_V1: c_uint = 0x1;\n    pub const VERSION_V2: c_uint = 0x2;\n}\n\nimpl FatbinHeader {\n    pub const MAGIC: [u8; 4] = 0xBA55ED50u32.to_le_bytes();\n    pub const VERSION: c_ushort = 0x01;\n}\n\nimpl FatbinFileHeader {\n    pub const HEADER_KIND_PTX: c_ushort = 0x01;\n    pub const HEADER_KIND_ELF: c_ushort = 0x02;\n    pub const HEADER_VERSION_CURRENT: c_ushort = 0x101;\n}\n"
  },
  {
    "path": "cuda_types/src/lib.rs",
    "content": "pub enum FILE {}\n\npub mod cublas;\npub mod cublaslt;\npub mod cuda;\npub mod cudnn;\npub mod cudnn8;\npub mod cudnn9;\npub mod cufft;\npub mod cusparse;\npub mod nvml;\npub mod dark_api;\n"
  },
  {
    "path": "cuda_types/src/nvml.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\npub type __half = u16;\npub type __nv_bfloat16 = u16;\npub use super::cuda::cuComplex;\npub use super::cuda::cuDoubleComplex;\npub use super::cuda::cudaDataType;\npub use super::cuda::cudaDataType_t;\npub type cudaStream_t = super::cuda::CUstream;\npub use super::cuda::libraryPropertyType;\npub type cudaGraphExecUpdateResultInfo_st = super::cuda::CUgraphExecUpdateResultInfo_st;\npub type cudaAsyncNotificationType = super::cuda::CUasyncNotificationType_enum;\npub type cudaGraph_t = super::cuda::CUgraph;\npub const NVML_API_VERSION: u32 = 13;\npub const NVML_API_VERSION_STR: &[u8; 3] = b\"13\\0\";\npub const NVML_VALUE_NOT_AVAILABLE: i32 = -1;\npub const NVML_DEVICE_PCI_BUS_ID_BUFFER_SIZE: u32 = 32;\npub const NVML_DEVICE_PCI_BUS_ID_BUFFER_V2_SIZE: u32 = 16;\npub const NVML_DEVICE_PCI_BUS_ID_LEGACY_FMT: &[u8; 17] = b\"%04X:%02X:%02X.0\\0\";\npub const NVML_DEVICE_PCI_BUS_ID_FMT: &[u8; 17] = b\"%08X:%02X:%02X.0\\0\";\npub const NVML_NVLINK_MAX_LINKS: u32 = 18;\npub const NVML_MAX_PHYSICAL_BRIDGE: u32 = 128;\npub const NVML_MAX_THERMAL_SENSORS_PER_GPU: u32 = 3;\npub const NVML_DEVICE_UUID_ASCII_LEN: u32 = 41;\npub const NVML_DEVICE_UUID_BINARY_LEN: u32 = 16;\npub const NVML_MAX_GPU_PERF_PSTATES: u32 = 16;\npub const NVML_PERF_MODES_BUFFER_SIZE: u32 = 2048;\npub const NVML_POWER_MIZER_MODE_ADAPTIVE: u32 = 0;\npub const NVML_POWER_MIZER_MODE_PREFER_MAXIMUM_PERFORMANCE: u32 = 1;\npub const NVML_POWER_MIZER_MODE_AUTO: u32 = 2;\npub const NVML_POWER_MIZER_MODE_PREFER_CONSISTENT_PERFORMANCE: u32 = 3;\npub const NVML_DEVICE_HOSTNAME_BUFFER_SIZE: u32 = 64;\npub const NVML_GSP_FIRMWARE_VERSION_BUF_SIZE: u32 = 64;\npub const NVML_DEVICE_ARCH_KEPLER: u32 = 2;\npub const NVML_DEVICE_ARCH_MAXWELL: u32 = 3;\npub const NVML_DEVICE_ARCH_PASCAL: u32 = 4;\npub const NVML_DEVICE_ARCH_VOLTA: u32 = 5;\npub const NVML_DEVICE_ARCH_TURING: u32 = 6;\npub const NVML_DEVICE_ARCH_AMPERE: u32 = 7;\npub const NVML_DEVICE_ARCH_ADA: u32 = 8;\npub const NVML_DEVICE_ARCH_HOPPER: u32 = 9;\npub const NVML_DEVICE_ARCH_BLACKWELL: u32 = 10;\npub const NVML_DEVICE_ARCH_UNKNOWN: u32 = 4294967295;\npub const NVML_BUS_TYPE_UNKNOWN: u32 = 0;\npub const NVML_BUS_TYPE_PCI: u32 = 1;\npub const NVML_BUS_TYPE_PCIE: u32 = 2;\npub const NVML_BUS_TYPE_FPCI: u32 = 3;\npub const NVML_BUS_TYPE_AGP: u32 = 4;\npub const NVML_FAN_POLICY_TEMPERATURE_CONTINOUS_SW: u32 = 0;\npub const NVML_FAN_POLICY_MANUAL: u32 = 1;\npub const NVML_POWER_SOURCE_AC: u32 = 0;\npub const NVML_POWER_SOURCE_BATTERY: u32 = 1;\npub const NVML_POWER_SOURCE_UNDERSIZED: u32 = 2;\npub const NVML_PCIE_LINK_MAX_SPEED_INVALID: u32 = 0;\npub const NVML_PCIE_LINK_MAX_SPEED_2500MBPS: u32 = 1;\npub const NVML_PCIE_LINK_MAX_SPEED_5000MBPS: u32 = 2;\npub const NVML_PCIE_LINK_MAX_SPEED_8000MBPS: u32 = 3;\npub const NVML_PCIE_LINK_MAX_SPEED_16000MBPS: u32 = 4;\npub const NVML_PCIE_LINK_MAX_SPEED_32000MBPS: u32 = 5;\npub const NVML_PCIE_LINK_MAX_SPEED_64000MBPS: u32 = 6;\npub const NVML_ADAPTIVE_CLOCKING_INFO_STATUS_DISABLED: u32 = 0;\npub const NVML_ADAPTIVE_CLOCKING_INFO_STATUS_ENABLED: u32 = 1;\npub const NVML_MAX_GPU_UTILIZATIONS: u32 = 8;\npub const NVML_PCIE_ATOMICS_CAP_FETCHADD32: u32 = 1;\npub const NVML_PCIE_ATOMICS_CAP_FETCHADD64: u32 = 2;\npub const NVML_PCIE_ATOMICS_CAP_SWAP32: u32 = 4;\npub const NVML_PCIE_ATOMICS_CAP_SWAP64: u32 = 8;\npub const NVML_PCIE_ATOMICS_CAP_CAS32: u32 = 16;\npub const NVML_PCIE_ATOMICS_CAP_CAS64: u32 = 32;\npub const NVML_PCIE_ATOMICS_CAP_CAS128: u32 = 64;\npub const NVML_PCIE_ATOMICS_OPS_MAX: u32 = 7;\npub const NVML_POWER_SCOPE_GPU: u32 = 0;\npub const NVML_POWER_SCOPE_MODULE: u32 = 1;\npub const NVML_POWER_SCOPE_MEMORY: u32 = 2;\npub const NVML_GRID_LICENSE_EXPIRY_NOT_AVAILABLE: u32 = 0;\npub const NVML_GRID_LICENSE_EXPIRY_INVALID: u32 = 1;\npub const NVML_GRID_LICENSE_EXPIRY_VALID: u32 = 2;\npub const NVML_GRID_LICENSE_EXPIRY_NOT_APPLICABLE: u32 = 3;\npub const NVML_GRID_LICENSE_EXPIRY_PERMANENT: u32 = 4;\npub const NVML_GRID_LICENSE_BUFFER_SIZE: u32 = 128;\npub const NVML_VGPU_NAME_BUFFER_SIZE: u32 = 64;\npub const NVML_GRID_LICENSE_FEATURE_MAX_COUNT: u32 = 3;\npub const NVML_INVALID_VGPU_PLACEMENT_ID: u32 = 65535;\npub const NVML_VGPU_VIRTUALIZATION_CAP_MIGRATION_NO: u32 = 0;\npub const NVML_VGPU_VIRTUALIZATION_CAP_MIGRATION_YES: u32 = 1;\npub const NVML_VGPU_PGPU_VIRTUALIZATION_CAP_MIGRATION_NO: u32 = 0;\npub const NVML_VGPU_PGPU_VIRTUALIZATION_CAP_MIGRATION_YES: u32 = 1;\npub const NVML_VGPU_PGPU_HETEROGENEOUS_MODE: u32 = 0;\npub const NVML_VGPU_PGPU_HOMOGENEOUS_MODE: u32 = 1;\npub const NVML_VGPU_SCHEDULER_POLICY_UNKNOWN: u32 = 0;\npub const NVML_VGPU_SCHEDULER_POLICY_BEST_EFFORT: u32 = 1;\npub const NVML_VGPU_SCHEDULER_POLICY_EQUAL_SHARE: u32 = 2;\npub const NVML_VGPU_SCHEDULER_POLICY_FIXED_SHARE: u32 = 3;\npub const NVML_SUPPORTED_VGPU_SCHEDULER_POLICY_COUNT: u32 = 3;\npub const NVML_SCHEDULER_SW_MAX_LOG_ENTRIES: u32 = 200;\npub const NVML_VGPU_SCHEDULER_ARR_DEFAULT: u32 = 0;\npub const NVML_VGPU_SCHEDULER_ARR_DISABLE: u32 = 1;\npub const NVML_VGPU_SCHEDULER_ARR_ENABLE: u32 = 2;\npub const NVML_VGPU_SCHEDULER_ENGINE_TYPE_GRAPHICS: u32 = 1;\npub const NVML_GRID_LICENSE_STATE_UNKNOWN: u32 = 0;\npub const NVML_GRID_LICENSE_STATE_UNINITIALIZED: u32 = 1;\npub const NVML_GRID_LICENSE_STATE_UNLICENSED_UNRESTRICTED: u32 = 2;\npub const NVML_GRID_LICENSE_STATE_UNLICENSED_RESTRICTED: u32 = 3;\npub const NVML_GRID_LICENSE_STATE_UNLICENSED: u32 = 4;\npub const NVML_GRID_LICENSE_STATE_LICENSED: u32 = 5;\npub const NVML_FI_DEV_ECC_CURRENT: u32 = 1;\npub const NVML_FI_DEV_ECC_PENDING: u32 = 2;\npub const NVML_FI_DEV_ECC_SBE_VOL_TOTAL: u32 = 3;\npub const NVML_FI_DEV_ECC_DBE_VOL_TOTAL: u32 = 4;\npub const NVML_FI_DEV_ECC_SBE_AGG_TOTAL: u32 = 5;\npub const NVML_FI_DEV_ECC_DBE_AGG_TOTAL: u32 = 6;\npub const NVML_FI_DEV_ECC_SBE_VOL_L1: u32 = 7;\npub const NVML_FI_DEV_ECC_DBE_VOL_L1: u32 = 8;\npub const NVML_FI_DEV_ECC_SBE_VOL_L2: u32 = 9;\npub const NVML_FI_DEV_ECC_DBE_VOL_L2: u32 = 10;\npub const NVML_FI_DEV_ECC_SBE_VOL_DEV: u32 = 11;\npub const NVML_FI_DEV_ECC_DBE_VOL_DEV: u32 = 12;\npub const NVML_FI_DEV_ECC_SBE_VOL_REG: u32 = 13;\npub const NVML_FI_DEV_ECC_DBE_VOL_REG: u32 = 14;\npub const NVML_FI_DEV_ECC_SBE_VOL_TEX: u32 = 15;\npub const NVML_FI_DEV_ECC_DBE_VOL_TEX: u32 = 16;\npub const NVML_FI_DEV_ECC_DBE_VOL_CBU: u32 = 17;\npub const NVML_FI_DEV_ECC_SBE_AGG_L1: u32 = 18;\npub const NVML_FI_DEV_ECC_DBE_AGG_L1: u32 = 19;\npub const NVML_FI_DEV_ECC_SBE_AGG_L2: u32 = 20;\npub const NVML_FI_DEV_ECC_DBE_AGG_L2: u32 = 21;\npub const NVML_FI_DEV_ECC_SBE_AGG_DEV: u32 = 22;\npub const NVML_FI_DEV_ECC_DBE_AGG_DEV: u32 = 23;\npub const NVML_FI_DEV_ECC_SBE_AGG_REG: u32 = 24;\npub const NVML_FI_DEV_ECC_DBE_AGG_REG: u32 = 25;\npub const NVML_FI_DEV_ECC_SBE_AGG_TEX: u32 = 26;\npub const NVML_FI_DEV_ECC_DBE_AGG_TEX: u32 = 27;\npub const NVML_FI_DEV_ECC_DBE_AGG_CBU: u32 = 28;\npub const NVML_FI_DEV_RETIRED_SBE: u32 = 29;\npub const NVML_FI_DEV_RETIRED_DBE: u32 = 30;\npub const NVML_FI_DEV_RETIRED_PENDING: u32 = 31;\npub const NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L0: u32 = 32;\npub const NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L1: u32 = 33;\npub const NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L2: u32 = 34;\npub const NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L3: u32 = 35;\npub const NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L4: u32 = 36;\npub const NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L5: u32 = 37;\npub const NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_TOTAL: u32 = 38;\npub const NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L0: u32 = 39;\npub const NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L1: u32 = 40;\npub const NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L2: u32 = 41;\npub const NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L3: u32 = 42;\npub const NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L4: u32 = 43;\npub const NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L5: u32 = 44;\npub const NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_TOTAL: u32 = 45;\npub const NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L0: u32 = 46;\npub const NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L1: u32 = 47;\npub const NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L2: u32 = 48;\npub const NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L3: u32 = 49;\npub const NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L4: u32 = 50;\npub const NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L5: u32 = 51;\npub const NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_TOTAL: u32 = 52;\npub const NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L0: u32 = 53;\npub const NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L1: u32 = 54;\npub const NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L2: u32 = 55;\npub const NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L3: u32 = 56;\npub const NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L4: u32 = 57;\npub const NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L5: u32 = 58;\npub const NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_TOTAL: u32 = 59;\npub const NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L0: u32 = 60;\npub const NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L1: u32 = 61;\npub const NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L2: u32 = 62;\npub const NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L3: u32 = 63;\npub const NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L4: u32 = 64;\npub const NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L5: u32 = 65;\npub const NVML_FI_DEV_NVLINK_BANDWIDTH_C0_TOTAL: u32 = 66;\npub const NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L0: u32 = 67;\npub const NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L1: u32 = 68;\npub const NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L2: u32 = 69;\npub const NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L3: u32 = 70;\npub const NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L4: u32 = 71;\npub const NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L5: u32 = 72;\npub const NVML_FI_DEV_NVLINK_BANDWIDTH_C1_TOTAL: u32 = 73;\npub const NVML_FI_DEV_PERF_POLICY_POWER: u32 = 74;\npub const NVML_FI_DEV_PERF_POLICY_THERMAL: u32 = 75;\npub const NVML_FI_DEV_PERF_POLICY_SYNC_BOOST: u32 = 76;\npub const NVML_FI_DEV_PERF_POLICY_BOARD_LIMIT: u32 = 77;\npub const NVML_FI_DEV_PERF_POLICY_LOW_UTILIZATION: u32 = 78;\npub const NVML_FI_DEV_PERF_POLICY_RELIABILITY: u32 = 79;\npub const NVML_FI_DEV_PERF_POLICY_TOTAL_APP_CLOCKS: u32 = 80;\npub const NVML_FI_DEV_PERF_POLICY_TOTAL_BASE_CLOCKS: u32 = 81;\npub const NVML_FI_DEV_MEMORY_TEMP: u32 = 82;\npub const NVML_FI_DEV_TOTAL_ENERGY_CONSUMPTION: u32 = 83;\npub const NVML_FI_DEV_NVLINK_SPEED_MBPS_L0: u32 = 84;\npub const NVML_FI_DEV_NVLINK_SPEED_MBPS_L1: u32 = 85;\npub const NVML_FI_DEV_NVLINK_SPEED_MBPS_L2: u32 = 86;\npub const NVML_FI_DEV_NVLINK_SPEED_MBPS_L3: u32 = 87;\npub const NVML_FI_DEV_NVLINK_SPEED_MBPS_L4: u32 = 88;\npub const NVML_FI_DEV_NVLINK_SPEED_MBPS_L5: u32 = 89;\npub const NVML_FI_DEV_NVLINK_SPEED_MBPS_COMMON: u32 = 90;\npub const NVML_FI_DEV_NVLINK_LINK_COUNT: u32 = 91;\npub const NVML_FI_DEV_RETIRED_PENDING_SBE: u32 = 92;\npub const NVML_FI_DEV_RETIRED_PENDING_DBE: u32 = 93;\npub const NVML_FI_DEV_PCIE_REPLAY_COUNTER: u32 = 94;\npub const NVML_FI_DEV_PCIE_REPLAY_ROLLOVER_COUNTER: u32 = 95;\npub const NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L6: u32 = 96;\npub const NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L7: u32 = 97;\npub const NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L8: u32 = 98;\npub const NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L9: u32 = 99;\npub const NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L10: u32 = 100;\npub const NVML_FI_DEV_NVLINK_CRC_FLIT_ERROR_COUNT_L11: u32 = 101;\npub const NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L6: u32 = 102;\npub const NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L7: u32 = 103;\npub const NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L8: u32 = 104;\npub const NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L9: u32 = 105;\npub const NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L10: u32 = 106;\npub const NVML_FI_DEV_NVLINK_CRC_DATA_ERROR_COUNT_L11: u32 = 107;\npub const NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L6: u32 = 108;\npub const NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L7: u32 = 109;\npub const NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L8: u32 = 110;\npub const NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L9: u32 = 111;\npub const NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L10: u32 = 112;\npub const NVML_FI_DEV_NVLINK_REPLAY_ERROR_COUNT_L11: u32 = 113;\npub const NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L6: u32 = 114;\npub const NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L7: u32 = 115;\npub const NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L8: u32 = 116;\npub const NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L9: u32 = 117;\npub const NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L10: u32 = 118;\npub const NVML_FI_DEV_NVLINK_RECOVERY_ERROR_COUNT_L11: u32 = 119;\npub const NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L6: u32 = 120;\npub const NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L7: u32 = 121;\npub const NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L8: u32 = 122;\npub const NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L9: u32 = 123;\npub const NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L10: u32 = 124;\npub const NVML_FI_DEV_NVLINK_BANDWIDTH_C0_L11: u32 = 125;\npub const NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L6: u32 = 126;\npub const NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L7: u32 = 127;\npub const NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L8: u32 = 128;\npub const NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L9: u32 = 129;\npub const NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L10: u32 = 130;\npub const NVML_FI_DEV_NVLINK_BANDWIDTH_C1_L11: u32 = 131;\npub const NVML_FI_DEV_NVLINK_SPEED_MBPS_L6: u32 = 132;\npub const NVML_FI_DEV_NVLINK_SPEED_MBPS_L7: u32 = 133;\npub const NVML_FI_DEV_NVLINK_SPEED_MBPS_L8: u32 = 134;\npub const NVML_FI_DEV_NVLINK_SPEED_MBPS_L9: u32 = 135;\npub const NVML_FI_DEV_NVLINK_SPEED_MBPS_L10: u32 = 136;\npub const NVML_FI_DEV_NVLINK_SPEED_MBPS_L11: u32 = 137;\npub const NVML_FI_DEV_NVLINK_THROUGHPUT_DATA_TX: u32 = 138;\npub const NVML_FI_DEV_NVLINK_THROUGHPUT_DATA_RX: u32 = 139;\npub const NVML_FI_DEV_NVLINK_THROUGHPUT_RAW_TX: u32 = 140;\npub const NVML_FI_DEV_NVLINK_THROUGHPUT_RAW_RX: u32 = 141;\npub const NVML_FI_DEV_REMAPPED_COR: u32 = 142;\npub const NVML_FI_DEV_REMAPPED_UNC: u32 = 143;\npub const NVML_FI_DEV_REMAPPED_PENDING: u32 = 144;\npub const NVML_FI_DEV_REMAPPED_FAILURE: u32 = 145;\npub const NVML_FI_DEV_NVLINK_REMOTE_NVLINK_ID: u32 = 146;\npub const NVML_FI_DEV_NVSWITCH_CONNECTED_LINK_COUNT: u32 = 147;\npub const NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L0: u32 = 148;\npub const NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L1: u32 = 149;\npub const NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L2: u32 = 150;\npub const NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L3: u32 = 151;\npub const NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L4: u32 = 152;\npub const NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L5: u32 = 153;\npub const NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L6: u32 = 154;\npub const NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L7: u32 = 155;\npub const NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L8: u32 = 156;\npub const NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L9: u32 = 157;\npub const NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L10: u32 = 158;\npub const NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_L11: u32 = 159;\npub const NVML_FI_DEV_NVLINK_ECC_DATA_ERROR_COUNT_TOTAL: u32 = 160;\npub const NVML_FI_DEV_NVLINK_ERROR_DL_REPLAY: u32 = 161;\npub const NVML_FI_DEV_NVLINK_ERROR_DL_RECOVERY: u32 = 162;\npub const NVML_FI_DEV_NVLINK_ERROR_DL_CRC: u32 = 163;\npub const NVML_FI_DEV_NVLINK_GET_SPEED: u32 = 164;\npub const NVML_FI_DEV_NVLINK_GET_STATE: u32 = 165;\npub const NVML_FI_DEV_NVLINK_GET_VERSION: u32 = 166;\npub const NVML_FI_DEV_NVLINK_GET_POWER_STATE: u32 = 167;\npub const NVML_FI_DEV_NVLINK_GET_POWER_THRESHOLD: u32 = 168;\npub const NVML_FI_DEV_PCIE_L0_TO_RECOVERY_COUNTER: u32 = 169;\npub const NVML_FI_DEV_C2C_LINK_COUNT: u32 = 170;\npub const NVML_FI_DEV_C2C_LINK_GET_STATUS: u32 = 171;\npub const NVML_FI_DEV_C2C_LINK_GET_MAX_BW: u32 = 172;\npub const NVML_FI_DEV_PCIE_COUNT_CORRECTABLE_ERRORS: u32 = 173;\npub const NVML_FI_DEV_PCIE_COUNT_NAKS_RECEIVED: u32 = 174;\npub const NVML_FI_DEV_PCIE_COUNT_RECEIVER_ERROR: u32 = 175;\npub const NVML_FI_DEV_PCIE_COUNT_BAD_TLP: u32 = 176;\npub const NVML_FI_DEV_PCIE_COUNT_NAKS_SENT: u32 = 177;\npub const NVML_FI_DEV_PCIE_COUNT_BAD_DLLP: u32 = 178;\npub const NVML_FI_DEV_PCIE_COUNT_NON_FATAL_ERROR: u32 = 179;\npub const NVML_FI_DEV_PCIE_COUNT_FATAL_ERROR: u32 = 180;\npub const NVML_FI_DEV_PCIE_COUNT_UNSUPPORTED_REQ: u32 = 181;\npub const NVML_FI_DEV_PCIE_COUNT_LCRC_ERROR: u32 = 182;\npub const NVML_FI_DEV_PCIE_COUNT_LANE_ERROR: u32 = 183;\npub const NVML_FI_DEV_IS_RESETLESS_MIG_SUPPORTED: u32 = 184;\npub const NVML_FI_DEV_POWER_AVERAGE: u32 = 185;\npub const NVML_FI_DEV_POWER_INSTANT: u32 = 186;\npub const NVML_FI_DEV_POWER_MIN_LIMIT: u32 = 187;\npub const NVML_FI_DEV_POWER_MAX_LIMIT: u32 = 188;\npub const NVML_FI_DEV_POWER_DEFAULT_LIMIT: u32 = 189;\npub const NVML_FI_DEV_POWER_CURRENT_LIMIT: u32 = 190;\npub const NVML_FI_DEV_ENERGY: u32 = 191;\npub const NVML_FI_DEV_POWER_REQUESTED_LIMIT: u32 = 192;\npub const NVML_FI_DEV_TEMPERATURE_SHUTDOWN_TLIMIT: u32 = 193;\npub const NVML_FI_DEV_TEMPERATURE_SLOWDOWN_TLIMIT: u32 = 194;\npub const NVML_FI_DEV_TEMPERATURE_MEM_MAX_TLIMIT: u32 = 195;\npub const NVML_FI_DEV_TEMPERATURE_GPU_MAX_TLIMIT: u32 = 196;\npub const NVML_FI_DEV_PCIE_COUNT_TX_BYTES: u32 = 197;\npub const NVML_FI_DEV_PCIE_COUNT_RX_BYTES: u32 = 198;\npub const NVML_FI_DEV_IS_MIG_MODE_INDEPENDENT_MIG_QUERY_CAPABLE: u32 = 199;\npub const NVML_FI_DEV_NVLINK_GET_POWER_THRESHOLD_MAX: u32 = 200;\npub const NVML_FI_DEV_NVLINK_COUNT_XMIT_PACKETS: u32 = 201;\npub const NVML_FI_DEV_NVLINK_COUNT_XMIT_BYTES: u32 = 202;\npub const NVML_FI_DEV_NVLINK_COUNT_RCV_PACKETS: u32 = 203;\npub const NVML_FI_DEV_NVLINK_COUNT_RCV_BYTES: u32 = 204;\npub const NVML_FI_DEV_NVLINK_COUNT_VL15_DROPPED: u32 = 205;\npub const NVML_FI_DEV_NVLINK_COUNT_MALFORMED_PACKET_ERRORS: u32 = 206;\npub const NVML_FI_DEV_NVLINK_COUNT_BUFFER_OVERRUN_ERRORS: u32 = 207;\npub const NVML_FI_DEV_NVLINK_COUNT_RCV_ERRORS: u32 = 208;\npub const NVML_FI_DEV_NVLINK_COUNT_RCV_REMOTE_ERRORS: u32 = 209;\npub const NVML_FI_DEV_NVLINK_COUNT_RCV_GENERAL_ERRORS: u32 = 210;\npub const NVML_FI_DEV_NVLINK_COUNT_LOCAL_LINK_INTEGRITY_ERRORS: u32 = 211;\npub const NVML_FI_DEV_NVLINK_COUNT_XMIT_DISCARDS: u32 = 212;\npub const NVML_FI_DEV_NVLINK_COUNT_LINK_RECOVERY_SUCCESSFUL_EVENTS: u32 = 213;\npub const NVML_FI_DEV_NVLINK_COUNT_LINK_RECOVERY_FAILED_EVENTS: u32 = 214;\npub const NVML_FI_DEV_NVLINK_COUNT_LINK_RECOVERY_EVENTS: u32 = 215;\npub const NVML_FI_DEV_NVLINK_COUNT_RAW_BER_LANE0: u32 = 216;\npub const NVML_FI_DEV_NVLINK_COUNT_RAW_BER_LANE1: u32 = 217;\npub const NVML_FI_DEV_NVLINK_COUNT_RAW_BER: u32 = 218;\npub const NVML_FI_DEV_NVLINK_COUNT_EFFECTIVE_ERRORS: u32 = 219;\npub const NVML_FI_DEV_NVLINK_COUNT_EFFECTIVE_BER: u32 = 220;\npub const NVML_FI_DEV_NVLINK_COUNT_SYMBOL_ERRORS: u32 = 221;\npub const NVML_FI_DEV_NVLINK_COUNT_SYMBOL_BER: u32 = 222;\npub const NVML_FI_DEV_NVLINK_GET_POWER_THRESHOLD_MIN: u32 = 223;\npub const NVML_FI_DEV_NVLINK_GET_POWER_THRESHOLD_UNITS: u32 = 224;\npub const NVML_FI_DEV_NVLINK_GET_POWER_THRESHOLD_SUPPORTED: u32 = 225;\npub const NVML_FI_DEV_RESET_STATUS: u32 = 226;\npub const NVML_FI_DEV_DRAIN_AND_RESET_STATUS: u32 = 227;\npub const NVML_FI_DEV_PCIE_OUTBOUND_ATOMICS_MASK: u32 = 228;\npub const NVML_FI_DEV_PCIE_INBOUND_ATOMICS_MASK: u32 = 229;\npub const NVML_FI_DEV_GET_GPU_RECOVERY_ACTION: u32 = 230;\npub const NVML_FI_DEV_C2C_LINK_ERROR_INTR: u32 = 231;\npub const NVML_FI_DEV_C2C_LINK_ERROR_REPLAY: u32 = 232;\npub const NVML_FI_DEV_C2C_LINK_ERROR_REPLAY_B2B: u32 = 233;\npub const NVML_FI_DEV_C2C_LINK_POWER_STATE: u32 = 234;\npub const NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_0: u32 = 235;\npub const NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_1: u32 = 236;\npub const NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_2: u32 = 237;\npub const NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_3: u32 = 238;\npub const NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_4: u32 = 239;\npub const NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_5: u32 = 240;\npub const NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_6: u32 = 241;\npub const NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_7: u32 = 242;\npub const NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_8: u32 = 243;\npub const NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_9: u32 = 244;\npub const NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_10: u32 = 245;\npub const NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_11: u32 = 246;\npub const NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_12: u32 = 247;\npub const NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_13: u32 = 248;\npub const NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_14: u32 = 249;\npub const NVML_FI_DEV_NVLINK_COUNT_FEC_HISTORY_15: u32 = 250;\npub const NVML_FI_PWR_SMOOTHING_ENABLED: u32 = 251;\npub const NVML_FI_PWR_SMOOTHING_PRIV_LVL: u32 = 252;\npub const NVML_FI_PWR_SMOOTHING_IMM_RAMP_DOWN_ENABLED: u32 = 253;\npub const NVML_FI_PWR_SMOOTHING_APPLIED_TMP_CEIL: u32 = 254;\npub const NVML_FI_PWR_SMOOTHING_APPLIED_TMP_FLOOR: u32 = 255;\npub const NVML_FI_PWR_SMOOTHING_MAX_PERCENT_TMP_FLOOR_SETTING: u32 = 256;\npub const NVML_FI_PWR_SMOOTHING_MIN_PERCENT_TMP_FLOOR_SETTING: u32 = 257;\npub const NVML_FI_PWR_SMOOTHING_HW_CIRCUITRY_PERCENT_LIFETIME_REMAINING: u32 = 258;\npub const NVML_FI_PWR_SMOOTHING_MAX_NUM_PRESET_PROFILES: u32 = 259;\npub const NVML_FI_PWR_SMOOTHING_PROFILE_PERCENT_TMP_FLOOR: u32 = 260;\npub const NVML_FI_PWR_SMOOTHING_PROFILE_RAMP_UP_RATE: u32 = 261;\npub const NVML_FI_PWR_SMOOTHING_PROFILE_RAMP_DOWN_RATE: u32 = 262;\npub const NVML_FI_PWR_SMOOTHING_PROFILE_RAMP_DOWN_HYST_VAL: u32 = 263;\npub const NVML_FI_PWR_SMOOTHING_ACTIVE_PRESET_PROFILE: u32 = 264;\npub const NVML_FI_PWR_SMOOTHING_ADMIN_OVERRIDE_PERCENT_TMP_FLOOR: u32 = 265;\npub const NVML_FI_PWR_SMOOTHING_ADMIN_OVERRIDE_RAMP_UP_RATE: u32 = 266;\npub const NVML_FI_PWR_SMOOTHING_ADMIN_OVERRIDE_RAMP_DOWN_RATE: u32 = 267;\npub const NVML_FI_PWR_SMOOTHING_ADMIN_OVERRIDE_RAMP_DOWN_HYST_VAL: u32 = 268;\npub const NVML_FI_DEV_CLOCKS_EVENT_REASON_SW_POWER_CAP: u32 = 74;\npub const NVML_FI_DEV_CLOCKS_EVENT_REASON_SYNC_BOOST: u32 = 76;\npub const NVML_FI_DEV_CLOCKS_EVENT_REASON_SW_THERM_SLOWDOWN: u32 = 269;\npub const NVML_FI_DEV_CLOCKS_EVENT_REASON_HW_THERM_SLOWDOWN: u32 = 270;\npub const NVML_FI_DEV_CLOCKS_EVENT_REASON_HW_POWER_BRAKE_SLOWDOWN: u32 = 271;\npub const NVML_FI_DEV_POWER_SYNC_BALANCING_FREQ: u32 = 272;\npub const NVML_FI_DEV_POWER_SYNC_BALANCING_AF: u32 = 273;\npub const NVML_FI_MAX: u32 = 274;\npub const NVML_NVLINK_LOW_POWER_THRESHOLD_UNIT_100US: u32 = 0;\npub const NVML_NVLINK_LOW_POWER_THRESHOLD_UNIT_50US: u32 = 1;\npub const NVML_NVLINK_POWER_STATE_HIGH_SPEED: u32 = 0;\npub const NVML_NVLINK_POWER_STATE_LOW: u32 = 1;\npub const NVML_NVLINK_LOW_POWER_THRESHOLD_MIN: u32 = 1;\npub const NVML_NVLINK_LOW_POWER_THRESHOLD_MAX: u32 = 8191;\npub const NVML_NVLINK_LOW_POWER_THRESHOLD_RESET: u32 = 4294967295;\npub const NVML_NVLINK_LOW_POWER_THRESHOLD_DEFAULT: u32 = 4294967295;\npub const NVML_C2C_POWER_STATE_FULL_POWER: u32 = 0;\npub const NVML_C2C_POWER_STATE_LOW_POWER: u32 = 1;\npub const NVML_NVFBC_SESSION_FLAG_DIFFMAP_ENABLED: u32 = 1;\npub const NVML_NVFBC_SESSION_FLAG_CLASSIFICATIONMAP_ENABLED: u32 = 2;\npub const NVML_NVFBC_SESSION_FLAG_CAPTURE_WITH_WAIT_NO_WAIT: u32 = 4;\npub const NVML_NVFBC_SESSION_FLAG_CAPTURE_WITH_WAIT_INFINITE: u32 = 8;\npub const NVML_NVFBC_SESSION_FLAG_CAPTURE_WITH_WAIT_TIMEOUT: u32 = 16;\npub const NVML_CC_SYSTEM_CPU_CAPS_NONE: u32 = 0;\npub const NVML_CC_SYSTEM_CPU_CAPS_AMD_SEV: u32 = 1;\npub const NVML_CC_SYSTEM_CPU_CAPS_INTEL_TDX: u32 = 2;\npub const NVML_CC_SYSTEM_CPU_CAPS_AMD_SEV_SNP: u32 = 3;\npub const NVML_CC_SYSTEM_CPU_CAPS_AMD_SNP_VTOM: u32 = 4;\npub const NVML_CC_SYSTEM_GPUS_CC_NOT_CAPABLE: u32 = 0;\npub const NVML_CC_SYSTEM_GPUS_CC_CAPABLE: u32 = 1;\npub const NVML_CC_SYSTEM_DEVTOOLS_MODE_OFF: u32 = 0;\npub const NVML_CC_SYSTEM_DEVTOOLS_MODE_ON: u32 = 1;\npub const NVML_CC_SYSTEM_ENVIRONMENT_UNAVAILABLE: u32 = 0;\npub const NVML_CC_SYSTEM_ENVIRONMENT_SIM: u32 = 1;\npub const NVML_CC_SYSTEM_ENVIRONMENT_PROD: u32 = 2;\npub const NVML_CC_SYSTEM_FEATURE_DISABLED: u32 = 0;\npub const NVML_CC_SYSTEM_FEATURE_ENABLED: u32 = 1;\npub const NVML_CC_SYSTEM_MULTIGPU_NONE: u32 = 0;\npub const NVML_CC_SYSTEM_MULTIGPU_PROTECTED_PCIE: u32 = 1;\npub const NVML_CC_SYSTEM_MULTIGPU_NVLE: u32 = 2;\npub const NVML_CC_ACCEPTING_CLIENT_REQUESTS_FALSE: u32 = 0;\npub const NVML_CC_ACCEPTING_CLIENT_REQUESTS_TRUE: u32 = 1;\npub const NVML_GPU_CERT_CHAIN_SIZE: u32 = 4096;\npub const NVML_GPU_ATTESTATION_CERT_CHAIN_SIZE: u32 = 5120;\npub const NVML_CC_GPU_CEC_NONCE_SIZE: u32 = 32;\npub const NVML_CC_GPU_ATTESTATION_REPORT_SIZE: u32 = 8192;\npub const NVML_CC_GPU_CEC_ATTESTATION_REPORT_SIZE: u32 = 4096;\npub const NVML_CC_CEC_ATTESTATION_REPORT_NOT_PRESENT: u32 = 0;\npub const NVML_CC_CEC_ATTESTATION_REPORT_PRESENT: u32 = 1;\npub const NVML_CC_KEY_ROTATION_THRESHOLD_ATTACKER_ADVANTAGE_MIN: u32 = 50;\npub const NVML_CC_KEY_ROTATION_THRESHOLD_ATTACKER_ADVANTAGE_MAX: u32 = 65;\npub const NVML_GPU_FABRIC_UUID_LEN: u32 = 16;\npub const NVML_GPU_FABRIC_STATE_NOT_SUPPORTED: u32 = 0;\npub const NVML_GPU_FABRIC_STATE_NOT_STARTED: u32 = 1;\npub const NVML_GPU_FABRIC_STATE_IN_PROGRESS: u32 = 2;\npub const NVML_GPU_FABRIC_STATE_COMPLETED: u32 = 3;\npub const NVML_GPU_FABRIC_HEALTH_MASK_DEGRADED_BW_NOT_SUPPORTED: u32 = 0;\npub const NVML_GPU_FABRIC_HEALTH_MASK_DEGRADED_BW_TRUE: u32 = 1;\npub const NVML_GPU_FABRIC_HEALTH_MASK_DEGRADED_BW_FALSE: u32 = 2;\npub const NVML_GPU_FABRIC_HEALTH_MASK_SHIFT_DEGRADED_BW: u32 = 0;\npub const NVML_GPU_FABRIC_HEALTH_MASK_WIDTH_DEGRADED_BW: u32 = 3;\npub const NVML_GPU_FABRIC_HEALTH_MASK_ROUTE_RECOVERY_NOT_SUPPORTED: u32 = 0;\npub const NVML_GPU_FABRIC_HEALTH_MASK_ROUTE_RECOVERY_TRUE: u32 = 1;\npub const NVML_GPU_FABRIC_HEALTH_MASK_ROUTE_RECOVERY_FALSE: u32 = 2;\npub const NVML_GPU_FABRIC_HEALTH_MASK_SHIFT_ROUTE_RECOVERY: u32 = 2;\npub const NVML_GPU_FABRIC_HEALTH_MASK_WIDTH_ROUTE_RECOVERY: u32 = 3;\npub const NVML_GPU_FABRIC_HEALTH_MASK_ROUTE_UNHEALTHY_NOT_SUPPORTED: u32 = 0;\npub const NVML_GPU_FABRIC_HEALTH_MASK_ROUTE_UNHEALTHY_TRUE: u32 = 1;\npub const NVML_GPU_FABRIC_HEALTH_MASK_ROUTE_UNHEALTHY_FALSE: u32 = 2;\npub const NVML_GPU_FABRIC_HEALTH_MASK_SHIFT_ROUTE_UNHEALTHY: u32 = 4;\npub const NVML_GPU_FABRIC_HEALTH_MASK_WIDTH_ROUTE_UNHEALTHY: u32 = 3;\npub const NVML_GPU_FABRIC_HEALTH_MASK_ACCESS_TIMEOUT_RECOVERY_NOT_SUPPORTED: u32 = 0;\npub const NVML_GPU_FABRIC_HEALTH_MASK_ACCESS_TIMEOUT_RECOVERY_TRUE: u32 = 1;\npub const NVML_GPU_FABRIC_HEALTH_MASK_ACCESS_TIMEOUT_RECOVERY_FALSE: u32 = 2;\npub const NVML_GPU_FABRIC_HEALTH_MASK_SHIFT_ACCESS_TIMEOUT_RECOVERY: u32 = 6;\npub const NVML_GPU_FABRIC_HEALTH_MASK_WIDTH_ACCESS_TIMEOUT_RECOVERY: u32 = 3;\npub const NVML_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_NOT_SUPPORTED: u32 = 0;\npub const NVML_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_NONE: u32 = 1;\npub const NVML_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_INCORRECT_SYSGUID: u32 = 2;\npub const NVML_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_INCORRECT_CHASSIS_SN: u32 = 3;\npub const NVML_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_NO_PARTITION: u32 = 4;\npub const NVML_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_INSUFFICIENT_NVLINKS: u32 = 5;\npub const NVML_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_INCOMPATIBLE_GPU_FW: u32 = 6;\npub const NVML_GPU_FABRIC_HEALTH_MASK_INCORRECT_CONFIGURATION_INVALID_LOCATION: u32 = 7;\npub const NVML_GPU_FABRIC_HEALTH_MASK_SHIFT_INCORRECT_CONFIGURATION: u32 = 8;\npub const NVML_GPU_FABRIC_HEALTH_MASK_WIDTH_INCORRECT_CONFIGURATION: u32 = 15;\npub const NVML_GPU_FABRIC_HEALTH_SUMMARY_NOT_SUPPORTED: u32 = 0;\npub const NVML_GPU_FABRIC_HEALTH_SUMMARY_HEALTHY: u32 = 1;\npub const NVML_GPU_FABRIC_HEALTH_SUMMARY_UNHEALTHY: u32 = 2;\npub const NVML_GPU_FABRIC_HEALTH_SUMMARY_LIMITED_CAPACITY: u32 = 3;\npub const NVML_INIT_FLAG_NO_GPUS: u32 = 1;\npub const NVML_INIT_FLAG_NO_ATTACH: u32 = 2;\npub const NVML_DEVICE_INFOROM_VERSION_BUFFER_SIZE: u32 = 16;\npub const NVML_DEVICE_UUID_BUFFER_SIZE: u32 = 80;\npub const NVML_DEVICE_UUID_V2_BUFFER_SIZE: u32 = 96;\npub const NVML_DEVICE_PART_NUMBER_BUFFER_SIZE: u32 = 80;\npub const NVML_SYSTEM_DRIVER_VERSION_BUFFER_SIZE: u32 = 80;\npub const NVML_SYSTEM_NVML_VERSION_BUFFER_SIZE: u32 = 80;\npub const NVML_DEVICE_NAME_BUFFER_SIZE: u32 = 64;\npub const NVML_DEVICE_NAME_V2_BUFFER_SIZE: u32 = 96;\npub const NVML_DEVICE_SERIAL_BUFFER_SIZE: u32 = 30;\npub const NVML_DEVICE_VBIOS_VERSION_BUFFER_SIZE: u32 = 32;\npub const NVML_AFFINITY_SCOPE_NODE: u32 = 0;\npub const NVML_AFFINITY_SCOPE_SOCKET: u32 = 1;\npub const NVML_NVLINK_BER_MANTISSA_SHIFT: u32 = 8;\npub const NVML_NVLINK_BER_MANTISSA_WIDTH: u32 = 15;\npub const NVML_NVLINK_BER_EXP_SHIFT: u32 = 0;\npub const NVML_NVLINK_BER_EXP_WIDTH: u32 = 255;\npub const NVML_NVLINK_STATE_INACTIVE: u32 = 0;\npub const NVML_NVLINK_STATE_ACTIVE: u32 = 1;\npub const NVML_NVLINK_STATE_SLEEP: u32 = 2;\npub const NVML_NVLINK_TOTAL_SUPPORTED_BW_MODES: u32 = 23;\npub const NVML_NVLINK_FIRMWARE_UCODE_TYPE_MSE: u32 = 1;\npub const NVML_NVLINK_FIRMWARE_UCODE_TYPE_NETIR: u32 = 2;\npub const NVML_NVLINK_FIRMWARE_UCODE_TYPE_NETIR_UPHY: u32 = 3;\npub const NVML_NVLINK_FIRMWARE_UCODE_TYPE_NETIR_CLN: u32 = 4;\npub const NVML_NVLINK_FIRMWARE_UCODE_TYPE_NETIR_DLN: u32 = 5;\npub const NVML_NVLINK_FIRMWARE_VERSION_LENGTH: u32 = 100;\npub const NVML_PRM_DATA_MAX_SIZE: u32 = 496;\npub const NVML_DEVICE_MIG_DISABLE: u32 = 0;\npub const NVML_DEVICE_MIG_ENABLE: u32 = 1;\npub const NVML_GPU_INSTANCE_PROFILE_1_SLICE: u32 = 0;\npub const NVML_GPU_INSTANCE_PROFILE_2_SLICE: u32 = 1;\npub const NVML_GPU_INSTANCE_PROFILE_3_SLICE: u32 = 2;\npub const NVML_GPU_INSTANCE_PROFILE_4_SLICE: u32 = 3;\npub const NVML_GPU_INSTANCE_PROFILE_7_SLICE: u32 = 4;\npub const NVML_GPU_INSTANCE_PROFILE_8_SLICE: u32 = 5;\npub const NVML_GPU_INSTANCE_PROFILE_6_SLICE: u32 = 6;\npub const NVML_GPU_INSTANCE_PROFILE_1_SLICE_REV1: u32 = 7;\npub const NVML_GPU_INSTANCE_PROFILE_2_SLICE_REV1: u32 = 8;\npub const NVML_GPU_INSTANCE_PROFILE_1_SLICE_REV2: u32 = 9;\npub const NVML_GPU_INSTANCE_PROFILE_1_SLICE_GFX: u32 = 10;\npub const NVML_GPU_INSTANCE_PROFILE_2_SLICE_GFX: u32 = 11;\npub const NVML_GPU_INSTANCE_PROFILE_4_SLICE_GFX: u32 = 12;\npub const NVML_GPU_INSTANCE_PROFILE_1_SLICE_NO_ME: u32 = 13;\npub const NVML_GPU_INSTANCE_PROFILE_2_SLICE_NO_ME: u32 = 14;\npub const NVML_GPU_INSTANCE_PROFILE_1_SLICE_ALL_ME: u32 = 15;\npub const NVML_GPU_INSTANCE_PROFILE_2_SLICE_ALL_ME: u32 = 16;\npub const NVML_GPU_INSTANCE_PROFILE_COUNT: u32 = 17;\npub const NVML_GPU_INSTANCE_PROFILE_CAPS_P2P: u32 = 1;\npub const NVML_GPU_INTSTANCE_PROFILE_CAPS_P2P: u32 = 1;\npub const NVML_GPU_INSTANCE_PROFILE_CAPS_GFX: u32 = 2;\npub const NVML_COMPUTE_INSTANCE_PROFILE_CAPS_GFX: u32 = 1;\npub const NVML_COMPUTE_INSTANCE_PROFILE_1_SLICE: u32 = 0;\npub const NVML_COMPUTE_INSTANCE_PROFILE_2_SLICE: u32 = 1;\npub const NVML_COMPUTE_INSTANCE_PROFILE_3_SLICE: u32 = 2;\npub const NVML_COMPUTE_INSTANCE_PROFILE_4_SLICE: u32 = 3;\npub const NVML_COMPUTE_INSTANCE_PROFILE_7_SLICE: u32 = 4;\npub const NVML_COMPUTE_INSTANCE_PROFILE_8_SLICE: u32 = 5;\npub const NVML_COMPUTE_INSTANCE_PROFILE_6_SLICE: u32 = 6;\npub const NVML_COMPUTE_INSTANCE_PROFILE_1_SLICE_REV1: u32 = 7;\npub const NVML_COMPUTE_INSTANCE_PROFILE_COUNT: u32 = 8;\npub const NVML_COMPUTE_INSTANCE_ENGINE_PROFILE_SHARED: u32 = 0;\npub const NVML_COMPUTE_INSTANCE_ENGINE_PROFILE_COUNT: u32 = 1;\npub const NVML_GPM_METRICS_GET_VERSION: u32 = 1;\npub const NVML_GPM_SUPPORT_VERSION: u32 = 1;\npub const NVML_DEV_CAP_EGM: u32 = 1;\npub const NVML_255_MASK_BITS_PER_ELEM: u32 = 32;\npub const NVML_255_MASK_NUM_ELEMS: u32 = 8;\npub const NVML_WORKLOAD_POWER_MAX_PROFILES: u32 = 255;\npub const NVML_POWER_SMOOTHING_MAX_NUM_PROFILES: u32 = 5;\npub const NVML_POWER_SMOOTHING_NUM_PROFILE_PARAMS: u32 = 4;\npub const NVML_POWER_SMOOTHING_ADMIN_OVERRIDE_NOT_SET: u32 = 4294967295;\npub const NVML_POWER_SMOOTHING_PROFILE_PARAM_PERCENT_TMP_FLOOR: u32 = 0;\npub const NVML_POWER_SMOOTHING_PROFILE_PARAM_RAMP_UP_RATE: u32 = 1;\npub const NVML_POWER_SMOOTHING_PROFILE_PARAM_RAMP_DOWN_RATE: u32 = 2;\npub const NVML_POWER_SMOOTHING_PROFILE_PARAM_RAMP_DOWN_HYSTERESIS: u32 = 3;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct nvmlDevice_st {\n    _unused: [u8; 0],\n}\npub type nvmlDevice_t = *mut nvmlDevice_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct nvmlGpuInstance_st {\n    _unused: [u8; 0],\n}\npub type nvmlGpuInstance_t = *mut nvmlGpuInstance_st;\n/// PCI information about a GPU device.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlPciInfoExt_v1_t {\n    ///!< The version number of this struct\n    pub version: ::core::ffi::c_uint,\n    ///!< The PCI domain on which the device's bus resides, 0 to 0xffffffff\n    pub domain: ::core::ffi::c_uint,\n    ///!< The bus on which the device resides, 0 to 0xff\n    pub bus: ::core::ffi::c_uint,\n    ///!< The device's id on the bus, 0 to 31\n    pub device: ::core::ffi::c_uint,\n    ///!< The combined 16-bit device id and 16-bit vendor id\n    pub pciDeviceId: ::core::ffi::c_uint,\n    ///!< The 32-bit Sub System Device ID\n    pub pciSubSystemId: ::core::ffi::c_uint,\n    ///!< The 8-bit PCI base class code\n    pub baseClass: ::core::ffi::c_uint,\n    ///!< The 8-bit PCI sub class code\n    pub subClass: ::core::ffi::c_uint,\n    ///!< The tuple domain:bus:device.function PCI identifier (&amp; NULL terminator)\n    pub busId: [::core::ffi::c_char; 32usize],\n}\n/// PCI information about a GPU device.\npub type nvmlPciInfoExt_t = nvmlPciInfoExt_v1_t;\n/// PCI information about a GPU device.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlPciInfo_st {\n    ///!< The legacy tuple domain:bus:device.function PCI identifier (&amp; NULL terminator)\n    pub busIdLegacy: [::core::ffi::c_char; 16usize],\n    ///!< The PCI domain on which the device's bus resides, 0 to 0xffffffff\n    pub domain: ::core::ffi::c_uint,\n    ///!< The bus on which the device resides, 0 to 0xff\n    pub bus: ::core::ffi::c_uint,\n    ///!< The device's id on the bus, 0 to 31\n    pub device: ::core::ffi::c_uint,\n    ///!< The combined 16-bit device id and 16-bit vendor id\n    pub pciDeviceId: ::core::ffi::c_uint,\n    ///!< The 32-bit Sub System Device ID\n    pub pciSubSystemId: ::core::ffi::c_uint,\n    ///!< The tuple domain:bus:device.function PCI identifier (&amp; NULL terminator)\n    pub busId: [::core::ffi::c_char; 32usize],\n}\n/// PCI information about a GPU device.\npub type nvmlPciInfo_t = nvmlPciInfo_st;\n/** Detailed ECC error counts for a device.\n\n @deprecated  Different GPU families can have different memory error counters\n              See \\ref nvmlDeviceGetMemoryErrorCounter*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlEccErrorCounts_st {\n    ///!< L1 cache errors\n    pub l1Cache: ::core::ffi::c_ulonglong,\n    ///!< L2 cache errors\n    pub l2Cache: ::core::ffi::c_ulonglong,\n    ///!< Device memory errors\n    pub deviceMemory: ::core::ffi::c_ulonglong,\n    ///!< Register file errors\n    pub registerFile: ::core::ffi::c_ulonglong,\n}\n/** Detailed ECC error counts for a device.\n\n @deprecated  Different GPU families can have different memory error counters\n              See \\ref nvmlDeviceGetMemoryErrorCounter*/\npub type nvmlEccErrorCounts_t = nvmlEccErrorCounts_st;\n/** Utilization information for a device.\n Each sample period may be between 1 second and 1/6 second, depending on the product being queried.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlUtilization_st {\n    ///!< Percent of time over the past sample period during which one or more kernels was executing on the GPU\n    pub gpu: ::core::ffi::c_uint,\n    ///!< Percent of time over the past sample period during which global (device) memory was being read or written\n    pub memory: ::core::ffi::c_uint,\n}\n/** Utilization information for a device.\n Each sample period may be between 1 second and 1/6 second, depending on the product being queried.*/\npub type nvmlUtilization_t = nvmlUtilization_st;\n/** Memory allocation information for a device (v1).\n The total amount is equal to the sum of the amounts of free and used memory.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlMemory_st {\n    ///!< Total physical device memory (in bytes)\n    pub total: ::core::ffi::c_ulonglong,\n    ///!< Unallocated device memory (in bytes)\n    pub free: ::core::ffi::c_ulonglong,\n    /**!< Sum of Reserved and Allocated device memory (in bytes).\n!< Note that the driver/GPU always sets aside a small amount of memory for bookkeeping*/\n    pub used: ::core::ffi::c_ulonglong,\n}\n/** Memory allocation information for a device (v1).\n The total amount is equal to the sum of the amounts of free and used memory.*/\npub type nvmlMemory_t = nvmlMemory_st;\n/** Memory allocation information for a device (v2).\n\n Version 2 adds versioning for the struct and the amount of system-reserved memory as an output.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlMemory_v2_st {\n    ///!< Structure format version (must be 2)\n    pub version: ::core::ffi::c_uint,\n    ///!< Total physical device memory (in bytes)\n    pub total: ::core::ffi::c_ulonglong,\n    ///!< Device memory (in bytes) reserved for system use (driver or firmware)\n    pub reserved: ::core::ffi::c_ulonglong,\n    ///!< Unallocated device memory (in bytes)\n    pub free: ::core::ffi::c_ulonglong,\n    ///!< Allocated device memory (in bytes).\n    pub used: ::core::ffi::c_ulonglong,\n}\n/** Memory allocation information for a device (v2).\n\n Version 2 adds versioning for the struct and the amount of system-reserved memory as an output.*/\npub type nvmlMemory_v2_t = nvmlMemory_v2_st;\n/// BAR1 Memory allocation Information for a device\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlBAR1Memory_st {\n    ///!< Total BAR1 Memory (in bytes)\n    pub bar1Total: ::core::ffi::c_ulonglong,\n    ///!< Unallocated BAR1 Memory (in bytes)\n    pub bar1Free: ::core::ffi::c_ulonglong,\n    ///!< Allocated Used Memory (in bytes)\n    pub bar1Used: ::core::ffi::c_ulonglong,\n}\n/// BAR1 Memory allocation Information for a device\npub type nvmlBAR1Memory_t = nvmlBAR1Memory_st;\n/** Information about running compute processes on the GPU, legacy version\n for older versions of the API.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlProcessInfo_v1_st {\n    ///!< Process ID\n    pub pid: ::core::ffi::c_uint,\n    ///!< Amount of used GPU memory in bytes.\n    pub usedGpuMemory: ::core::ffi::c_ulonglong,\n}\n/** Information about running compute processes on the GPU, legacy version\n for older versions of the API.*/\npub type nvmlProcessInfo_v1_t = nvmlProcessInfo_v1_st;\n/// Information about running compute processes on the GPU\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlProcessInfo_v2_st {\n    ///!< Process ID\n    pub pid: ::core::ffi::c_uint,\n    ///!< Amount of used GPU memory in bytes.\n    pub usedGpuMemory: ::core::ffi::c_ulonglong,\n    ///!< If MIG is enabled, stores a valid GPU instance ID. gpuInstanceId is set to\n    pub gpuInstanceId: ::core::ffi::c_uint,\n    ///!< If MIG is enabled, stores a valid compute instance ID. computeInstanceId is set to\n    pub computeInstanceId: ::core::ffi::c_uint,\n}\n/// Information about running compute processes on the GPU\npub type nvmlProcessInfo_v2_t = nvmlProcessInfo_v2_st;\n/// Information about running compute processes on the GPU\npub type nvmlProcessInfo_t = nvmlProcessInfo_v2_st;\n/// Information about running process on the GPU with protected memory\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlProcessDetail_v1_t {\n    ///!< Process ID\n    pub pid: ::core::ffi::c_uint,\n    ///!< Amount of used GPU memory in bytes.\n    pub usedGpuMemory: ::core::ffi::c_ulonglong,\n    ///!< If MIG is enabled, stores a valid GPU instance ID. gpuInstanceId is\n    pub gpuInstanceId: ::core::ffi::c_uint,\n    ///!< If MIG is enabled, stores a valid compute instance ID. computeInstanceId\n    pub computeInstanceId: ::core::ffi::c_uint,\n    ///!< Amount of used GPU conf compute protected memory in bytes.\n    pub usedGpuCcProtectedMemory: ::core::ffi::c_ulonglong,\n}\n/// Information about all running processes on the GPU for the given mode\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlProcessDetailList_v1_t {\n    ///!< Struct version, MUST be nvmlProcessDetailList_v1\n    pub version: ::core::ffi::c_uint,\n    ///!< Process mode(Compute/Graphics/MPSCompute)\n    pub mode: ::core::ffi::c_uint,\n    ///!< Number of process entries in procArray\n    pub numProcArrayEntries: ::core::ffi::c_uint,\n    ///!< Process array\n    pub procArray: *mut nvmlProcessDetail_v1_t,\n}\n/// Information about all running processes on the GPU for the given mode\npub type nvmlProcessDetailList_t = nvmlProcessDetailList_v1_t;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlDeviceAttributes_st {\n    ///!< Streaming Multiprocessor count\n    pub multiprocessorCount: ::core::ffi::c_uint,\n    ///!< Shared Copy Engine count\n    pub sharedCopyEngineCount: ::core::ffi::c_uint,\n    ///!< Shared Decoder Engine count\n    pub sharedDecoderCount: ::core::ffi::c_uint,\n    ///!< Shared Encoder Engine count\n    pub sharedEncoderCount: ::core::ffi::c_uint,\n    ///!< Shared JPEG Engine count\n    pub sharedJpegCount: ::core::ffi::c_uint,\n    ///!< Shared OFA Engine count\n    pub sharedOfaCount: ::core::ffi::c_uint,\n    ///!< GPU instance slice count\n    pub gpuInstanceSliceCount: ::core::ffi::c_uint,\n    ///!< Compute instance slice count\n    pub computeInstanceSliceCount: ::core::ffi::c_uint,\n    ///!< Device memory size (in MiB)\n    pub memorySizeMB: ::core::ffi::c_ulonglong,\n}\npub type nvmlDeviceAttributes_t = nvmlDeviceAttributes_st;\n/// C2C Mode information for a device\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlC2cModeInfo_v1_t {\n    pub isC2cEnabled: ::core::ffi::c_uint,\n}\nimpl nvmlDeviceAddressingModeType_t {\n    ///!< No active mode\n    pub const NVML_DEVICE_ADDRESSING_MODE_NONE: nvmlDeviceAddressingModeType_t = nvmlDeviceAddressingModeType_t(\n        0,\n    );\n}\nimpl nvmlDeviceAddressingModeType_t {\n    ///!< Heterogeneous Memory Management mode\n    pub const NVML_DEVICE_ADDRESSING_MODE_HMM: nvmlDeviceAddressingModeType_t = nvmlDeviceAddressingModeType_t(\n        1,\n    );\n}\nimpl nvmlDeviceAddressingModeType_t {\n    ///!< Address Translation Services mode\n    pub const NVML_DEVICE_ADDRESSING_MODE_ATS: nvmlDeviceAddressingModeType_t = nvmlDeviceAddressingModeType_t(\n        2,\n    );\n}\n#[repr(transparent)]\n/// Enum to represent device addressing mode values\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlDeviceAddressingModeType_t(pub ::core::ffi::c_uint);\n/// Struct to represent device addressing mode information\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlDeviceAddressingMode_v1_t {\n    ///!< API version\n    pub version: ::core::ffi::c_uint,\n    ///!< One of \\ref nvmlDeviceAddressingModeType_t\n    pub value: ::core::ffi::c_uint,\n}\n/// Struct to represent device addressing mode information\npub type nvmlDeviceAddressingMode_t = nvmlDeviceAddressingMode_v1_t;\n/// Struct to represent the NVML repair status\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlRepairStatus_v1_t {\n    ///!< API version number\n    pub version: ::core::ffi::c_uint,\n    ///!< Reference to \\a unsigned int\n    pub bChannelRepairPending: ::core::ffi::c_uint,\n    ///!< Reference to \\a unsigned int\n    pub bTpcRepairPending: ::core::ffi::c_uint,\n}\n/// Struct to represent the NVML repair status\npub type nvmlRepairStatus_t = nvmlRepairStatus_v1_t;\n/** Possible values that classify the remap availability for each bank. The max\n field will contain the number of banks that have maximum remap availability\n (all reserved rows are available). None means that there are no reserved\n rows available.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlRowRemapperHistogramValues_st {\n    pub max: ::core::ffi::c_uint,\n    pub high: ::core::ffi::c_uint,\n    pub partial: ::core::ffi::c_uint,\n    pub low: ::core::ffi::c_uint,\n    pub none: ::core::ffi::c_uint,\n}\n/** Possible values that classify the remap availability for each bank. The max\n field will contain the number of banks that have maximum remap availability\n (all reserved rows are available). None means that there are no reserved\n rows available.*/\npub type nvmlRowRemapperHistogramValues_t = nvmlRowRemapperHistogramValues_st;\nimpl nvmlBridgeChipType_enum {\n    pub const NVML_BRIDGE_CHIP_PLX: nvmlBridgeChipType_enum = nvmlBridgeChipType_enum(0);\n}\nimpl nvmlBridgeChipType_enum {\n    pub const NVML_BRIDGE_CHIP_BRO4: nvmlBridgeChipType_enum = nvmlBridgeChipType_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n/// Enum to represent type of bridge chip\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlBridgeChipType_enum(pub ::core::ffi::c_uint);\n/// Enum to represent type of bridge chip\npub use self::nvmlBridgeChipType_enum as nvmlBridgeChipType_t;\nimpl nvmlNvLinkUtilizationCountUnits_enum {\n    pub const NVML_NVLINK_COUNTER_UNIT_CYCLES: nvmlNvLinkUtilizationCountUnits_enum = nvmlNvLinkUtilizationCountUnits_enum(\n        0,\n    );\n}\nimpl nvmlNvLinkUtilizationCountUnits_enum {\n    pub const NVML_NVLINK_COUNTER_UNIT_PACKETS: nvmlNvLinkUtilizationCountUnits_enum = nvmlNvLinkUtilizationCountUnits_enum(\n        1,\n    );\n}\nimpl nvmlNvLinkUtilizationCountUnits_enum {\n    pub const NVML_NVLINK_COUNTER_UNIT_BYTES: nvmlNvLinkUtilizationCountUnits_enum = nvmlNvLinkUtilizationCountUnits_enum(\n        2,\n    );\n}\nimpl nvmlNvLinkUtilizationCountUnits_enum {\n    pub const NVML_NVLINK_COUNTER_UNIT_RESERVED: nvmlNvLinkUtilizationCountUnits_enum = nvmlNvLinkUtilizationCountUnits_enum(\n        3,\n    );\n}\nimpl nvmlNvLinkUtilizationCountUnits_enum {\n    pub const NVML_NVLINK_COUNTER_UNIT_COUNT: nvmlNvLinkUtilizationCountUnits_enum = nvmlNvLinkUtilizationCountUnits_enum(\n        4,\n    );\n}\n#[repr(transparent)]\n/// Enum to represent the NvLink utilization counter packet units\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlNvLinkUtilizationCountUnits_enum(pub ::core::ffi::c_uint);\n/// Enum to represent the NvLink utilization counter packet units\npub use self::nvmlNvLinkUtilizationCountUnits_enum as nvmlNvLinkUtilizationCountUnits_t;\nimpl nvmlNvLinkUtilizationCountPktTypes_enum {\n    pub const NVML_NVLINK_COUNTER_PKTFILTER_NOP: nvmlNvLinkUtilizationCountPktTypes_enum = nvmlNvLinkUtilizationCountPktTypes_enum(\n        1,\n    );\n}\nimpl nvmlNvLinkUtilizationCountPktTypes_enum {\n    pub const NVML_NVLINK_COUNTER_PKTFILTER_READ: nvmlNvLinkUtilizationCountPktTypes_enum = nvmlNvLinkUtilizationCountPktTypes_enum(\n        2,\n    );\n}\nimpl nvmlNvLinkUtilizationCountPktTypes_enum {\n    pub const NVML_NVLINK_COUNTER_PKTFILTER_WRITE: nvmlNvLinkUtilizationCountPktTypes_enum = nvmlNvLinkUtilizationCountPktTypes_enum(\n        4,\n    );\n}\nimpl nvmlNvLinkUtilizationCountPktTypes_enum {\n    pub const NVML_NVLINK_COUNTER_PKTFILTER_RATOM: nvmlNvLinkUtilizationCountPktTypes_enum = nvmlNvLinkUtilizationCountPktTypes_enum(\n        8,\n    );\n}\nimpl nvmlNvLinkUtilizationCountPktTypes_enum {\n    pub const NVML_NVLINK_COUNTER_PKTFILTER_NRATOM: nvmlNvLinkUtilizationCountPktTypes_enum = nvmlNvLinkUtilizationCountPktTypes_enum(\n        16,\n    );\n}\nimpl nvmlNvLinkUtilizationCountPktTypes_enum {\n    pub const NVML_NVLINK_COUNTER_PKTFILTER_FLUSH: nvmlNvLinkUtilizationCountPktTypes_enum = nvmlNvLinkUtilizationCountPktTypes_enum(\n        32,\n    );\n}\nimpl nvmlNvLinkUtilizationCountPktTypes_enum {\n    pub const NVML_NVLINK_COUNTER_PKTFILTER_RESPDATA: nvmlNvLinkUtilizationCountPktTypes_enum = nvmlNvLinkUtilizationCountPktTypes_enum(\n        64,\n    );\n}\nimpl nvmlNvLinkUtilizationCountPktTypes_enum {\n    pub const NVML_NVLINK_COUNTER_PKTFILTER_RESPNODATA: nvmlNvLinkUtilizationCountPktTypes_enum = nvmlNvLinkUtilizationCountPktTypes_enum(\n        128,\n    );\n}\nimpl nvmlNvLinkUtilizationCountPktTypes_enum {\n    pub const NVML_NVLINK_COUNTER_PKTFILTER_ALL: nvmlNvLinkUtilizationCountPktTypes_enum = nvmlNvLinkUtilizationCountPktTypes_enum(\n        255,\n    );\n}\n#[repr(transparent)]\n/** Enum to represent the NvLink utilization counter packet types to count\n  ** this is ONLY applicable with the units as packets or bytes\n  ** as specified in \\a nvmlNvLinkUtilizationCountUnits_t\n  ** all packet filter descriptions are target GPU centric\n  ** these can be \"OR'd\" together*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlNvLinkUtilizationCountPktTypes_enum(pub ::core::ffi::c_uint);\n/** Enum to represent the NvLink utilization counter packet types to count\n  ** this is ONLY applicable with the units as packets or bytes\n  ** as specified in \\a nvmlNvLinkUtilizationCountUnits_t\n  ** all packet filter descriptions are target GPU centric\n  ** these can be \"OR'd\" together*/\npub use self::nvmlNvLinkUtilizationCountPktTypes_enum as nvmlNvLinkUtilizationCountPktTypes_t;\n/// Struct to define the NVLINK counter controls\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlNvLinkUtilizationControl_st {\n    pub units: nvmlNvLinkUtilizationCountUnits_t,\n    pub pktfilter: nvmlNvLinkUtilizationCountPktTypes_t,\n}\n/// Struct to define the NVLINK counter controls\npub type nvmlNvLinkUtilizationControl_t = nvmlNvLinkUtilizationControl_st;\nimpl nvmlNvLinkCapability_enum {\n    pub const NVML_NVLINK_CAP_P2P_SUPPORTED: nvmlNvLinkCapability_enum = nvmlNvLinkCapability_enum(\n        0,\n    );\n}\nimpl nvmlNvLinkCapability_enum {\n    pub const NVML_NVLINK_CAP_SYSMEM_ACCESS: nvmlNvLinkCapability_enum = nvmlNvLinkCapability_enum(\n        1,\n    );\n}\nimpl nvmlNvLinkCapability_enum {\n    pub const NVML_NVLINK_CAP_P2P_ATOMICS: nvmlNvLinkCapability_enum = nvmlNvLinkCapability_enum(\n        2,\n    );\n}\nimpl nvmlNvLinkCapability_enum {\n    pub const NVML_NVLINK_CAP_SYSMEM_ATOMICS: nvmlNvLinkCapability_enum = nvmlNvLinkCapability_enum(\n        3,\n    );\n}\nimpl nvmlNvLinkCapability_enum {\n    pub const NVML_NVLINK_CAP_SLI_BRIDGE: nvmlNvLinkCapability_enum = nvmlNvLinkCapability_enum(\n        4,\n    );\n}\nimpl nvmlNvLinkCapability_enum {\n    pub const NVML_NVLINK_CAP_VALID: nvmlNvLinkCapability_enum = nvmlNvLinkCapability_enum(\n        5,\n    );\n}\nimpl nvmlNvLinkCapability_enum {\n    pub const NVML_NVLINK_CAP_COUNT: nvmlNvLinkCapability_enum = nvmlNvLinkCapability_enum(\n        6,\n    );\n}\n#[repr(transparent)]\n/// Enum to represent NvLink queryable capabilities\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlNvLinkCapability_enum(pub ::core::ffi::c_uint);\n/// Enum to represent NvLink queryable capabilities\npub use self::nvmlNvLinkCapability_enum as nvmlNvLinkCapability_t;\nimpl nvmlNvLinkErrorCounter_enum {\n    pub const NVML_NVLINK_ERROR_DL_REPLAY: nvmlNvLinkErrorCounter_enum = nvmlNvLinkErrorCounter_enum(\n        0,\n    );\n}\nimpl nvmlNvLinkErrorCounter_enum {\n    pub const NVML_NVLINK_ERROR_DL_RECOVERY: nvmlNvLinkErrorCounter_enum = nvmlNvLinkErrorCounter_enum(\n        1,\n    );\n}\nimpl nvmlNvLinkErrorCounter_enum {\n    pub const NVML_NVLINK_ERROR_DL_CRC_FLIT: nvmlNvLinkErrorCounter_enum = nvmlNvLinkErrorCounter_enum(\n        2,\n    );\n}\nimpl nvmlNvLinkErrorCounter_enum {\n    pub const NVML_NVLINK_ERROR_DL_CRC_DATA: nvmlNvLinkErrorCounter_enum = nvmlNvLinkErrorCounter_enum(\n        3,\n    );\n}\nimpl nvmlNvLinkErrorCounter_enum {\n    pub const NVML_NVLINK_ERROR_DL_ECC_DATA: nvmlNvLinkErrorCounter_enum = nvmlNvLinkErrorCounter_enum(\n        4,\n    );\n}\nimpl nvmlNvLinkErrorCounter_enum {\n    pub const NVML_NVLINK_ERROR_COUNT: nvmlNvLinkErrorCounter_enum = nvmlNvLinkErrorCounter_enum(\n        5,\n    );\n}\n#[repr(transparent)]\n/// Enum to represent NvLink queryable error counters\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlNvLinkErrorCounter_enum(pub ::core::ffi::c_uint);\n/// Enum to represent NvLink queryable error counters\npub use self::nvmlNvLinkErrorCounter_enum as nvmlNvLinkErrorCounter_t;\nimpl nvmlIntNvLinkDeviceType_enum {\n    pub const NVML_NVLINK_DEVICE_TYPE_GPU: nvmlIntNvLinkDeviceType_enum = nvmlIntNvLinkDeviceType_enum(\n        0,\n    );\n}\nimpl nvmlIntNvLinkDeviceType_enum {\n    pub const NVML_NVLINK_DEVICE_TYPE_IBMNPU: nvmlIntNvLinkDeviceType_enum = nvmlIntNvLinkDeviceType_enum(\n        1,\n    );\n}\nimpl nvmlIntNvLinkDeviceType_enum {\n    pub const NVML_NVLINK_DEVICE_TYPE_SWITCH: nvmlIntNvLinkDeviceType_enum = nvmlIntNvLinkDeviceType_enum(\n        2,\n    );\n}\nimpl nvmlIntNvLinkDeviceType_enum {\n    pub const NVML_NVLINK_DEVICE_TYPE_UNKNOWN: nvmlIntNvLinkDeviceType_enum = nvmlIntNvLinkDeviceType_enum(\n        255,\n    );\n}\n#[repr(transparent)]\n/// Enum to represent NvLink's remote device type\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlIntNvLinkDeviceType_enum(pub ::core::ffi::c_uint);\n/// Enum to represent NvLink's remote device type\npub use self::nvmlIntNvLinkDeviceType_enum as nvmlIntNvLinkDeviceType_t;\nimpl nvmlGpuLevel_enum {\n    pub const NVML_TOPOLOGY_INTERNAL: nvmlGpuLevel_enum = nvmlGpuLevel_enum(0);\n}\nimpl nvmlGpuLevel_enum {\n    pub const NVML_TOPOLOGY_SINGLE: nvmlGpuLevel_enum = nvmlGpuLevel_enum(10);\n}\nimpl nvmlGpuLevel_enum {\n    pub const NVML_TOPOLOGY_MULTIPLE: nvmlGpuLevel_enum = nvmlGpuLevel_enum(20);\n}\nimpl nvmlGpuLevel_enum {\n    pub const NVML_TOPOLOGY_HOSTBRIDGE: nvmlGpuLevel_enum = nvmlGpuLevel_enum(30);\n}\nimpl nvmlGpuLevel_enum {\n    pub const NVML_TOPOLOGY_NODE: nvmlGpuLevel_enum = nvmlGpuLevel_enum(40);\n}\nimpl nvmlGpuLevel_enum {\n    pub const NVML_TOPOLOGY_SYSTEM: nvmlGpuLevel_enum = nvmlGpuLevel_enum(50);\n}\n#[repr(transparent)]\n/** Represents level relationships within a system between two GPUs\n The enums are spaced to allow for future relationships*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlGpuLevel_enum(pub ::core::ffi::c_uint);\n/** Represents level relationships within a system between two GPUs\n The enums are spaced to allow for future relationships*/\npub use self::nvmlGpuLevel_enum as nvmlGpuTopologyLevel_t;\nimpl nvmlGpuP2PStatus_enum {\n    pub const NVML_P2P_STATUS_OK: nvmlGpuP2PStatus_enum = nvmlGpuP2PStatus_enum(0);\n}\nimpl nvmlGpuP2PStatus_enum {\n    pub const NVML_P2P_STATUS_CHIPSET_NOT_SUPPORED: nvmlGpuP2PStatus_enum = nvmlGpuP2PStatus_enum(\n        1,\n    );\n}\nimpl nvmlGpuP2PStatus_enum {\n    pub const NVML_P2P_STATUS_CHIPSET_NOT_SUPPORTED: nvmlGpuP2PStatus_enum = nvmlGpuP2PStatus_enum(\n        1,\n    );\n}\nimpl nvmlGpuP2PStatus_enum {\n    pub const NVML_P2P_STATUS_GPU_NOT_SUPPORTED: nvmlGpuP2PStatus_enum = nvmlGpuP2PStatus_enum(\n        2,\n    );\n}\nimpl nvmlGpuP2PStatus_enum {\n    pub const NVML_P2P_STATUS_IOH_TOPOLOGY_NOT_SUPPORTED: nvmlGpuP2PStatus_enum = nvmlGpuP2PStatus_enum(\n        3,\n    );\n}\nimpl nvmlGpuP2PStatus_enum {\n    pub const NVML_P2P_STATUS_DISABLED_BY_REGKEY: nvmlGpuP2PStatus_enum = nvmlGpuP2PStatus_enum(\n        4,\n    );\n}\nimpl nvmlGpuP2PStatus_enum {\n    pub const NVML_P2P_STATUS_NOT_SUPPORTED: nvmlGpuP2PStatus_enum = nvmlGpuP2PStatus_enum(\n        5,\n    );\n}\nimpl nvmlGpuP2PStatus_enum {\n    pub const NVML_P2P_STATUS_UNKNOWN: nvmlGpuP2PStatus_enum = nvmlGpuP2PStatus_enum(6);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlGpuP2PStatus_enum(pub ::core::ffi::c_uint);\npub use self::nvmlGpuP2PStatus_enum as nvmlGpuP2PStatus_t;\nimpl nvmlGpuP2PCapsIndex_enum {\n    pub const NVML_P2P_CAPS_INDEX_READ: nvmlGpuP2PCapsIndex_enum = nvmlGpuP2PCapsIndex_enum(\n        0,\n    );\n}\nimpl nvmlGpuP2PCapsIndex_enum {\n    pub const NVML_P2P_CAPS_INDEX_WRITE: nvmlGpuP2PCapsIndex_enum = nvmlGpuP2PCapsIndex_enum(\n        1,\n    );\n}\nimpl nvmlGpuP2PCapsIndex_enum {\n    pub const NVML_P2P_CAPS_INDEX_NVLINK: nvmlGpuP2PCapsIndex_enum = nvmlGpuP2PCapsIndex_enum(\n        2,\n    );\n}\nimpl nvmlGpuP2PCapsIndex_enum {\n    pub const NVML_P2P_CAPS_INDEX_ATOMICS: nvmlGpuP2PCapsIndex_enum = nvmlGpuP2PCapsIndex_enum(\n        3,\n    );\n}\nimpl nvmlGpuP2PCapsIndex_enum {\n    pub const NVML_P2P_CAPS_INDEX_PCI: nvmlGpuP2PCapsIndex_enum = nvmlGpuP2PCapsIndex_enum(\n        4,\n    );\n}\nimpl nvmlGpuP2PCapsIndex_enum {\n    pub const NVML_P2P_CAPS_INDEX_PROP: nvmlGpuP2PCapsIndex_enum = nvmlGpuP2PCapsIndex_enum(\n        4,\n    );\n}\nimpl nvmlGpuP2PCapsIndex_enum {\n    pub const NVML_P2P_CAPS_INDEX_UNKNOWN: nvmlGpuP2PCapsIndex_enum = nvmlGpuP2PCapsIndex_enum(\n        5,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlGpuP2PCapsIndex_enum(pub ::core::ffi::c_uint);\npub use self::nvmlGpuP2PCapsIndex_enum as nvmlGpuP2PCapsIndex_t;\n/// Information about the Bridge Chip Firmware\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlBridgeChipInfo_st {\n    ///!< Type of Bridge Chip\n    pub type_: nvmlBridgeChipType_t,\n    ///!< Firmware Version. 0=Version is unavailable\n    pub fwVersion: ::core::ffi::c_uint,\n}\n/// Information about the Bridge Chip Firmware\npub type nvmlBridgeChipInfo_t = nvmlBridgeChipInfo_st;\n/** This structure stores the complete Hierarchy of the Bridge Chip within the board. The immediate\n bridge is stored at index 0 of bridgeInfoList, parent to immediate bridge is at index 1 and so forth.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlBridgeChipHierarchy_st {\n    ///!< Number of Bridge Chips on the Board\n    pub bridgeCount: ::core::ffi::c_uchar,\n    ///!< Hierarchy of Bridge Chips on the board\n    pub bridgeChipInfo: [nvmlBridgeChipInfo_t; 128usize],\n}\n/** This structure stores the complete Hierarchy of the Bridge Chip within the board. The immediate\n bridge is stored at index 0 of bridgeInfoList, parent to immediate bridge is at index 1 and so forth.*/\npub type nvmlBridgeChipHierarchy_t = nvmlBridgeChipHierarchy_st;\nimpl nvmlSamplingType_enum {\n    ///!< To represent total power drawn by GPU\n    pub const NVML_TOTAL_POWER_SAMPLES: nvmlSamplingType_enum = nvmlSamplingType_enum(0);\n}\nimpl nvmlSamplingType_enum {\n    ///!< To represent percent of time during which one or more kernels was executing on the GPU\n    pub const NVML_GPU_UTILIZATION_SAMPLES: nvmlSamplingType_enum = nvmlSamplingType_enum(\n        1,\n    );\n}\nimpl nvmlSamplingType_enum {\n    ///!< To represent percent of time during which global (device) memory was being read or written\n    pub const NVML_MEMORY_UTILIZATION_SAMPLES: nvmlSamplingType_enum = nvmlSamplingType_enum(\n        2,\n    );\n}\nimpl nvmlSamplingType_enum {\n    ///!< To represent percent of time during which NVENC remains busy\n    pub const NVML_ENC_UTILIZATION_SAMPLES: nvmlSamplingType_enum = nvmlSamplingType_enum(\n        3,\n    );\n}\nimpl nvmlSamplingType_enum {\n    ///!< To represent percent of time during which NVDEC remains busy\n    pub const NVML_DEC_UTILIZATION_SAMPLES: nvmlSamplingType_enum = nvmlSamplingType_enum(\n        4,\n    );\n}\nimpl nvmlSamplingType_enum {\n    ///!< To represent processor clock samples\n    pub const NVML_PROCESSOR_CLK_SAMPLES: nvmlSamplingType_enum = nvmlSamplingType_enum(\n        5,\n    );\n}\nimpl nvmlSamplingType_enum {\n    ///!< To represent memory clock samples\n    pub const NVML_MEMORY_CLK_SAMPLES: nvmlSamplingType_enum = nvmlSamplingType_enum(6);\n}\nimpl nvmlSamplingType_enum {\n    ///!< To represent module power samples for total module starting Grace Hopper\n    pub const NVML_MODULE_POWER_SAMPLES: nvmlSamplingType_enum = nvmlSamplingType_enum(\n        7,\n    );\n}\nimpl nvmlSamplingType_enum {\n    ///!< To represent percent of time during which NVJPG remains busy\n    pub const NVML_JPG_UTILIZATION_SAMPLES: nvmlSamplingType_enum = nvmlSamplingType_enum(\n        8,\n    );\n}\nimpl nvmlSamplingType_enum {\n    ///!< To represent percent of time during which NVOFA remains busy\n    pub const NVML_OFA_UTILIZATION_SAMPLES: nvmlSamplingType_enum = nvmlSamplingType_enum(\n        9,\n    );\n}\nimpl nvmlSamplingType_enum {\n    pub const NVML_SAMPLINGTYPE_COUNT: nvmlSamplingType_enum = nvmlSamplingType_enum(10);\n}\n#[repr(transparent)]\n///  Represents Type of Sampling Event\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlSamplingType_enum(pub ::core::ffi::c_uint);\n///  Represents Type of Sampling Event\npub use self::nvmlSamplingType_enum as nvmlSamplingType_t;\nimpl nvmlPcieUtilCounter_enum {\n    pub const NVML_PCIE_UTIL_TX_BYTES: nvmlPcieUtilCounter_enum = nvmlPcieUtilCounter_enum(\n        0,\n    );\n}\nimpl nvmlPcieUtilCounter_enum {\n    pub const NVML_PCIE_UTIL_RX_BYTES: nvmlPcieUtilCounter_enum = nvmlPcieUtilCounter_enum(\n        1,\n    );\n}\nimpl nvmlPcieUtilCounter_enum {\n    pub const NVML_PCIE_UTIL_COUNT: nvmlPcieUtilCounter_enum = nvmlPcieUtilCounter_enum(\n        2,\n    );\n}\n#[repr(transparent)]\n/// Represents the queryable PCIe utilization counters\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlPcieUtilCounter_enum(pub ::core::ffi::c_uint);\n/// Represents the queryable PCIe utilization counters\npub use self::nvmlPcieUtilCounter_enum as nvmlPcieUtilCounter_t;\nimpl nvmlValueType_enum {\n    pub const NVML_VALUE_TYPE_DOUBLE: nvmlValueType_enum = nvmlValueType_enum(0);\n}\nimpl nvmlValueType_enum {\n    pub const NVML_VALUE_TYPE_UNSIGNED_INT: nvmlValueType_enum = nvmlValueType_enum(1);\n}\nimpl nvmlValueType_enum {\n    pub const NVML_VALUE_TYPE_UNSIGNED_LONG: nvmlValueType_enum = nvmlValueType_enum(2);\n}\nimpl nvmlValueType_enum {\n    pub const NVML_VALUE_TYPE_UNSIGNED_LONG_LONG: nvmlValueType_enum = nvmlValueType_enum(\n        3,\n    );\n}\nimpl nvmlValueType_enum {\n    pub const NVML_VALUE_TYPE_SIGNED_LONG_LONG: nvmlValueType_enum = nvmlValueType_enum(\n        4,\n    );\n}\nimpl nvmlValueType_enum {\n    pub const NVML_VALUE_TYPE_SIGNED_INT: nvmlValueType_enum = nvmlValueType_enum(5);\n}\nimpl nvmlValueType_enum {\n    pub const NVML_VALUE_TYPE_UNSIGNED_SHORT: nvmlValueType_enum = nvmlValueType_enum(6);\n}\nimpl nvmlValueType_enum {\n    pub const NVML_VALUE_TYPE_COUNT: nvmlValueType_enum = nvmlValueType_enum(7);\n}\n#[repr(transparent)]\n/// Represents the type for sample value returned\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlValueType_enum(pub ::core::ffi::c_uint);\n/// Represents the type for sample value returned\npub use self::nvmlValueType_enum as nvmlValueType_t;\n/// Union to represent different types of Value\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union nvmlValue_st {\n    ///!< If the value is double\n    pub dVal: f64,\n    ///!< If the value is signed int\n    pub siVal: ::core::ffi::c_int,\n    ///!< If the value is unsigned int\n    pub uiVal: ::core::ffi::c_uint,\n    ///!< If the value is unsigned long\n    pub ulVal: ::core::ffi::c_ulong,\n    ///!< If the value is unsigned long long\n    pub ullVal: ::core::ffi::c_ulonglong,\n    ///!< If the value is signed long long\n    pub sllVal: ::core::ffi::c_longlong,\n    ///!< If the value is unsigned short\n    pub usVal: ::core::ffi::c_ushort,\n}\n/// Union to represent different types of Value\npub type nvmlValue_t = nvmlValue_st;\n/// Information for Sample\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct nvmlSample_st {\n    ///!< CPU Timestamp in microseconds\n    pub timeStamp: ::core::ffi::c_ulonglong,\n    ///!< Sample Value\n    pub sampleValue: nvmlValue_t,\n}\n/// Information for Sample\npub type nvmlSample_t = nvmlSample_st;\nimpl nvmlPerfPolicyType_enum {\n    ///!< How long did power violations cause the GPU to be below application clocks\n    pub const NVML_PERF_POLICY_POWER: nvmlPerfPolicyType_enum = nvmlPerfPolicyType_enum(\n        0,\n    );\n}\nimpl nvmlPerfPolicyType_enum {\n    ///!< How long did thermal violations cause the GPU to be below application clocks\n    pub const NVML_PERF_POLICY_THERMAL: nvmlPerfPolicyType_enum = nvmlPerfPolicyType_enum(\n        1,\n    );\n}\nimpl nvmlPerfPolicyType_enum {\n    ///!< How long did sync boost cause the GPU to be below application clocks\n    pub const NVML_PERF_POLICY_SYNC_BOOST: nvmlPerfPolicyType_enum = nvmlPerfPolicyType_enum(\n        2,\n    );\n}\nimpl nvmlPerfPolicyType_enum {\n    ///!< How long did the board limit cause the GPU to be below application clocks\n    pub const NVML_PERF_POLICY_BOARD_LIMIT: nvmlPerfPolicyType_enum = nvmlPerfPolicyType_enum(\n        3,\n    );\n}\nimpl nvmlPerfPolicyType_enum {\n    ///!< How long did low utilization cause the GPU to be below application clocks\n    pub const NVML_PERF_POLICY_LOW_UTILIZATION: nvmlPerfPolicyType_enum = nvmlPerfPolicyType_enum(\n        4,\n    );\n}\nimpl nvmlPerfPolicyType_enum {\n    ///!< How long did the board reliability limit cause the GPU to be below application clocks\n    pub const NVML_PERF_POLICY_RELIABILITY: nvmlPerfPolicyType_enum = nvmlPerfPolicyType_enum(\n        5,\n    );\n}\nimpl nvmlPerfPolicyType_enum {\n    ///!< Total time the GPU was held below application clocks by any limiter (0 - 5 above)\n    pub const NVML_PERF_POLICY_TOTAL_APP_CLOCKS: nvmlPerfPolicyType_enum = nvmlPerfPolicyType_enum(\n        10,\n    );\n}\nimpl nvmlPerfPolicyType_enum {\n    ///!< Total time the GPU was held below base clocks\n    pub const NVML_PERF_POLICY_TOTAL_BASE_CLOCKS: nvmlPerfPolicyType_enum = nvmlPerfPolicyType_enum(\n        11,\n    );\n}\nimpl nvmlPerfPolicyType_enum {\n    pub const NVML_PERF_POLICY_COUNT: nvmlPerfPolicyType_enum = nvmlPerfPolicyType_enum(\n        12,\n    );\n}\n#[repr(transparent)]\n/// Represents type of perf policy for which violation times can be queried\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlPerfPolicyType_enum(pub ::core::ffi::c_uint);\n/// Represents type of perf policy for which violation times can be queried\npub use self::nvmlPerfPolicyType_enum as nvmlPerfPolicyType_t;\n/// Struct to hold perf policy violation status data\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlViolationTime_st {\n    ///!< referenceTime represents CPU timestamp in microseconds\n    pub referenceTime: ::core::ffi::c_ulonglong,\n    ///!< violationTime in Nanoseconds\n    pub violationTime: ::core::ffi::c_ulonglong,\n}\n/// Struct to hold perf policy violation status data\npub type nvmlViolationTime_t = nvmlViolationTime_st;\nimpl nvmlThermalTarget_t {\n    pub const NVML_THERMAL_TARGET_NONE: nvmlThermalTarget_t = nvmlThermalTarget_t(0);\n}\nimpl nvmlThermalTarget_t {\n    ///!< GPU core temperature requires NvPhysicalGpuHandle\n    pub const NVML_THERMAL_TARGET_GPU: nvmlThermalTarget_t = nvmlThermalTarget_t(1);\n}\nimpl nvmlThermalTarget_t {\n    ///!< GPU memory temperature requires NvPhysicalGpuHandle\n    pub const NVML_THERMAL_TARGET_MEMORY: nvmlThermalTarget_t = nvmlThermalTarget_t(2);\n}\nimpl nvmlThermalTarget_t {\n    ///!< GPU power supply temperature requires NvPhysicalGpuHandle\n    pub const NVML_THERMAL_TARGET_POWER_SUPPLY: nvmlThermalTarget_t = nvmlThermalTarget_t(\n        4,\n    );\n}\nimpl nvmlThermalTarget_t {\n    ///!< GPU board ambient temperature requires NvPhysicalGpuHandle\n    pub const NVML_THERMAL_TARGET_BOARD: nvmlThermalTarget_t = nvmlThermalTarget_t(8);\n}\nimpl nvmlThermalTarget_t {\n    ///!< Visual Computing Device Board temperature requires NvVisualComputingDeviceHandle\n    pub const NVML_THERMAL_TARGET_VCD_BOARD: nvmlThermalTarget_t = nvmlThermalTarget_t(\n        9,\n    );\n}\nimpl nvmlThermalTarget_t {\n    ///!< Visual Computing Device Inlet temperature requires NvVisualComputingDeviceHandle\n    pub const NVML_THERMAL_TARGET_VCD_INLET: nvmlThermalTarget_t = nvmlThermalTarget_t(\n        10,\n    );\n}\nimpl nvmlThermalTarget_t {\n    ///!< Visual Computing Device Outlet temperature requires NvVisualComputingDeviceHandle\n    pub const NVML_THERMAL_TARGET_VCD_OUTLET: nvmlThermalTarget_t = nvmlThermalTarget_t(\n        11,\n    );\n}\nimpl nvmlThermalTarget_t {\n    pub const NVML_THERMAL_TARGET_ALL: nvmlThermalTarget_t = nvmlThermalTarget_t(15);\n}\nimpl nvmlThermalTarget_t {\n    pub const NVML_THERMAL_TARGET_UNKNOWN: nvmlThermalTarget_t = nvmlThermalTarget_t(-1);\n}\n#[repr(transparent)]\n/// Represents the thermal sensor targets\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlThermalTarget_t(pub ::core::ffi::c_int);\nimpl nvmlThermalController_t {\n    pub const NVML_THERMAL_CONTROLLER_NONE: nvmlThermalController_t = nvmlThermalController_t(\n        0,\n    );\n}\nimpl nvmlThermalController_t {\n    pub const NVML_THERMAL_CONTROLLER_GPU_INTERNAL: nvmlThermalController_t = nvmlThermalController_t(\n        1,\n    );\n}\nimpl nvmlThermalController_t {\n    pub const NVML_THERMAL_CONTROLLER_ADM1032: nvmlThermalController_t = nvmlThermalController_t(\n        2,\n    );\n}\nimpl nvmlThermalController_t {\n    pub const NVML_THERMAL_CONTROLLER_ADT7461: nvmlThermalController_t = nvmlThermalController_t(\n        3,\n    );\n}\nimpl nvmlThermalController_t {\n    pub const NVML_THERMAL_CONTROLLER_MAX6649: nvmlThermalController_t = nvmlThermalController_t(\n        4,\n    );\n}\nimpl nvmlThermalController_t {\n    pub const NVML_THERMAL_CONTROLLER_MAX1617: nvmlThermalController_t = nvmlThermalController_t(\n        5,\n    );\n}\nimpl nvmlThermalController_t {\n    pub const NVML_THERMAL_CONTROLLER_LM99: nvmlThermalController_t = nvmlThermalController_t(\n        6,\n    );\n}\nimpl nvmlThermalController_t {\n    pub const NVML_THERMAL_CONTROLLER_LM89: nvmlThermalController_t = nvmlThermalController_t(\n        7,\n    );\n}\nimpl nvmlThermalController_t {\n    pub const NVML_THERMAL_CONTROLLER_LM64: nvmlThermalController_t = nvmlThermalController_t(\n        8,\n    );\n}\nimpl nvmlThermalController_t {\n    pub const NVML_THERMAL_CONTROLLER_G781: nvmlThermalController_t = nvmlThermalController_t(\n        9,\n    );\n}\nimpl nvmlThermalController_t {\n    pub const NVML_THERMAL_CONTROLLER_ADT7473: nvmlThermalController_t = nvmlThermalController_t(\n        10,\n    );\n}\nimpl nvmlThermalController_t {\n    pub const NVML_THERMAL_CONTROLLER_SBMAX6649: nvmlThermalController_t = nvmlThermalController_t(\n        11,\n    );\n}\nimpl nvmlThermalController_t {\n    pub const NVML_THERMAL_CONTROLLER_VBIOSEVT: nvmlThermalController_t = nvmlThermalController_t(\n        12,\n    );\n}\nimpl nvmlThermalController_t {\n    pub const NVML_THERMAL_CONTROLLER_OS: nvmlThermalController_t = nvmlThermalController_t(\n        13,\n    );\n}\nimpl nvmlThermalController_t {\n    pub const NVML_THERMAL_CONTROLLER_NVSYSCON_CANOAS: nvmlThermalController_t = nvmlThermalController_t(\n        14,\n    );\n}\nimpl nvmlThermalController_t {\n    pub const NVML_THERMAL_CONTROLLER_NVSYSCON_E551: nvmlThermalController_t = nvmlThermalController_t(\n        15,\n    );\n}\nimpl nvmlThermalController_t {\n    pub const NVML_THERMAL_CONTROLLER_MAX6649R: nvmlThermalController_t = nvmlThermalController_t(\n        16,\n    );\n}\nimpl nvmlThermalController_t {\n    pub const NVML_THERMAL_CONTROLLER_ADT7473S: nvmlThermalController_t = nvmlThermalController_t(\n        17,\n    );\n}\nimpl nvmlThermalController_t {\n    pub const NVML_THERMAL_CONTROLLER_UNKNOWN: nvmlThermalController_t = nvmlThermalController_t(\n        -1,\n    );\n}\n#[repr(transparent)]\n/// Represents the thermal sensor controllers\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlThermalController_t(pub ::core::ffi::c_int);\n/// Struct to hold the thermal sensor settings\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlGpuThermalSettings_t {\n    pub count: ::core::ffi::c_uint,\n    pub sensor: [nvmlGpuThermalSettings_t__bindgen_ty_1; 3usize],\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlGpuThermalSettings_t__bindgen_ty_1 {\n    pub controller: nvmlThermalController_t,\n    pub defaultMinTemp: ::core::ffi::c_int,\n    pub defaultMaxTemp: ::core::ffi::c_int,\n    pub currentTemp: ::core::ffi::c_int,\n    pub target: nvmlThermalTarget_t,\n}\nimpl nvmlCoolerControl_enum {\n    ///!< This cooler has no control signal.\n    pub const NVML_THERMAL_COOLER_SIGNAL_NONE: nvmlCoolerControl_enum = nvmlCoolerControl_enum(\n        0,\n    );\n}\nimpl nvmlCoolerControl_enum {\n    ///!< This cooler can only be toggled either ON or OFF (eg a switch).\n    pub const NVML_THERMAL_COOLER_SIGNAL_TOGGLE: nvmlCoolerControl_enum = nvmlCoolerControl_enum(\n        1,\n    );\n}\nimpl nvmlCoolerControl_enum {\n    ///!< This cooler's level can be adjusted from some minimum to some maximum (eg a knob).\n    pub const NVML_THERMAL_COOLER_SIGNAL_VARIABLE: nvmlCoolerControl_enum = nvmlCoolerControl_enum(\n        2,\n    );\n}\nimpl nvmlCoolerControl_enum {\n    pub const NVML_THERMAL_COOLER_SIGNAL_COUNT: nvmlCoolerControl_enum = nvmlCoolerControl_enum(\n        3,\n    );\n}\n#[repr(transparent)]\n/// Cooler control type\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlCoolerControl_enum(pub ::core::ffi::c_uint);\n/// Cooler control type\npub use self::nvmlCoolerControl_enum as nvmlCoolerControl_t;\nimpl nvmlCoolerTarget_enum {\n    ///!< This cooler cools nothing.\n    pub const NVML_THERMAL_COOLER_TARGET_NONE: nvmlCoolerTarget_enum = nvmlCoolerTarget_enum(\n        1,\n    );\n}\nimpl nvmlCoolerTarget_enum {\n    ///!< This cooler can cool the GPU.\n    pub const NVML_THERMAL_COOLER_TARGET_GPU: nvmlCoolerTarget_enum = nvmlCoolerTarget_enum(\n        2,\n    );\n}\nimpl nvmlCoolerTarget_enum {\n    ///!< This cooler can cool the memory.\n    pub const NVML_THERMAL_COOLER_TARGET_MEMORY: nvmlCoolerTarget_enum = nvmlCoolerTarget_enum(\n        4,\n    );\n}\nimpl nvmlCoolerTarget_enum {\n    ///!< This cooler can cool the power supply.\n    pub const NVML_THERMAL_COOLER_TARGET_POWER_SUPPLY: nvmlCoolerTarget_enum = nvmlCoolerTarget_enum(\n        8,\n    );\n}\nimpl nvmlCoolerTarget_enum {\n    ///!< This cooler cools all of the components related to its target gpu. GPU_RELATED = GPU | MEMORY | POWER_SUPPLY\n    pub const NVML_THERMAL_COOLER_TARGET_GPU_RELATED: nvmlCoolerTarget_enum = nvmlCoolerTarget_enum(\n        14,\n    );\n}\n#[repr(transparent)]\n/// Cooler's target\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlCoolerTarget_enum(pub ::core::ffi::c_uint);\n/// Cooler's target\npub use self::nvmlCoolerTarget_enum as nvmlCoolerTarget_t;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlCoolerInfo_v1_t {\n    ///!< the API version number\n    pub version: ::core::ffi::c_uint,\n    ///!< the cooler index\n    pub index: ::core::ffi::c_uint,\n    ///!< OUT: the cooler's control signal characteristics\n    pub signalType: nvmlCoolerControl_t,\n    ///!< OUT: the target that cooler cools\n    pub target: nvmlCoolerTarget_t,\n}\npub type nvmlCoolerInfo_t = nvmlCoolerInfo_v1_t;\nimpl nvmlUUIDType_t {\n    ///!< Undefined type\n    pub const NVML_UUID_TYPE_NONE: nvmlUUIDType_t = nvmlUUIDType_t(0);\n}\nimpl nvmlUUIDType_t {\n    ///!< ASCII format type\n    pub const NVML_UUID_TYPE_ASCII: nvmlUUIDType_t = nvmlUUIDType_t(1);\n}\nimpl nvmlUUIDType_t {\n    ///!< Binary format type\n    pub const NVML_UUID_TYPE_BINARY: nvmlUUIDType_t = nvmlUUIDType_t(2);\n}\n#[repr(transparent)]\n/// Enum to represent different UUID types\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlUUIDType_t(pub ::core::ffi::c_uint);\n/// Union to represent different UUID values\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union nvmlUUIDValue_t {\n    ///!< ASCII format value\n    pub str_: [::core::ffi::c_char; 41usize],\n    ///!< Binary format value\n    pub bytes: [::core::ffi::c_uchar; 16usize],\n}\n/// Struct to represent NVML UUID information\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct nvmlUUID_v1_t {\n    ///!< API version number\n    pub version: ::core::ffi::c_uint,\n    ///!< One of \\p nvmlUUIDType_t\n    pub type_: ::core::ffi::c_uint,\n    ///!< One of \\p nvmlUUIDValue_t, to be set based on the UUID format\n    pub value: nvmlUUIDValue_t,\n}\n/// Struct to represent NVML UUID information\npub type nvmlUUID_t = nvmlUUID_v1_t;\n/// Struct to represent the NVML PDI information\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlPdi_v1_t {\n    ///!< API version number\n    pub version: ::core::ffi::c_uint,\n    ///!< 64-bit PDI value\n    pub value: ::core::ffi::c_ulonglong,\n}\n/// Struct to represent the NVML PDI information\npub type nvmlPdi_t = nvmlPdi_v1_t;\nimpl nvmlEnableState_enum {\n    ///!< Feature disabled\n    pub const NVML_FEATURE_DISABLED: nvmlEnableState_enum = nvmlEnableState_enum(0);\n}\nimpl nvmlEnableState_enum {\n    ///!< Feature enabled\n    pub const NVML_FEATURE_ENABLED: nvmlEnableState_enum = nvmlEnableState_enum(1);\n}\n#[repr(transparent)]\n/// Generic enable/disable enum.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlEnableState_enum(pub ::core::ffi::c_uint);\n/// Generic enable/disable enum.\npub use self::nvmlEnableState_enum as nvmlEnableState_t;\n/// DRAM Encryption Info\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlDramEncryptionInfo_v1_t {\n    ///!< IN - the API version number\n    pub version: ::core::ffi::c_uint,\n    ///!< IN/OUT - DRAM Encryption state\n    pub encryptionState: nvmlEnableState_t,\n}\n/// DRAM Encryption Info\npub type nvmlDramEncryptionInfo_t = nvmlDramEncryptionInfo_v1_t;\nimpl nvmlBrandType_enum {\n    pub const NVML_BRAND_UNKNOWN: nvmlBrandType_enum = nvmlBrandType_enum(0);\n}\nimpl nvmlBrandType_enum {\n    pub const NVML_BRAND_QUADRO: nvmlBrandType_enum = nvmlBrandType_enum(1);\n}\nimpl nvmlBrandType_enum {\n    pub const NVML_BRAND_TESLA: nvmlBrandType_enum = nvmlBrandType_enum(2);\n}\nimpl nvmlBrandType_enum {\n    pub const NVML_BRAND_NVS: nvmlBrandType_enum = nvmlBrandType_enum(3);\n}\nimpl nvmlBrandType_enum {\n    pub const NVML_BRAND_GRID: nvmlBrandType_enum = nvmlBrandType_enum(4);\n}\nimpl nvmlBrandType_enum {\n    pub const NVML_BRAND_GEFORCE: nvmlBrandType_enum = nvmlBrandType_enum(5);\n}\nimpl nvmlBrandType_enum {\n    pub const NVML_BRAND_TITAN: nvmlBrandType_enum = nvmlBrandType_enum(6);\n}\nimpl nvmlBrandType_enum {\n    pub const NVML_BRAND_NVIDIA_VAPPS: nvmlBrandType_enum = nvmlBrandType_enum(7);\n}\nimpl nvmlBrandType_enum {\n    pub const NVML_BRAND_NVIDIA_VPC: nvmlBrandType_enum = nvmlBrandType_enum(8);\n}\nimpl nvmlBrandType_enum {\n    pub const NVML_BRAND_NVIDIA_VCS: nvmlBrandType_enum = nvmlBrandType_enum(9);\n}\nimpl nvmlBrandType_enum {\n    pub const NVML_BRAND_NVIDIA_VWS: nvmlBrandType_enum = nvmlBrandType_enum(10);\n}\nimpl nvmlBrandType_enum {\n    pub const NVML_BRAND_NVIDIA_CLOUD_GAMING: nvmlBrandType_enum = nvmlBrandType_enum(\n        11,\n    );\n}\nimpl nvmlBrandType_enum {\n    pub const NVML_BRAND_NVIDIA_VGAMING: nvmlBrandType_enum = nvmlBrandType_enum(11);\n}\nimpl nvmlBrandType_enum {\n    pub const NVML_BRAND_QUADRO_RTX: nvmlBrandType_enum = nvmlBrandType_enum(12);\n}\nimpl nvmlBrandType_enum {\n    pub const NVML_BRAND_NVIDIA_RTX: nvmlBrandType_enum = nvmlBrandType_enum(13);\n}\nimpl nvmlBrandType_enum {\n    pub const NVML_BRAND_NVIDIA: nvmlBrandType_enum = nvmlBrandType_enum(14);\n}\nimpl nvmlBrandType_enum {\n    pub const NVML_BRAND_GEFORCE_RTX: nvmlBrandType_enum = nvmlBrandType_enum(15);\n}\nimpl nvmlBrandType_enum {\n    pub const NVML_BRAND_TITAN_RTX: nvmlBrandType_enum = nvmlBrandType_enum(16);\n}\nimpl nvmlBrandType_enum {\n    pub const NVML_BRAND_COUNT: nvmlBrandType_enum = nvmlBrandType_enum(18);\n}\n#[repr(transparent)]\n///  * The Brand of the GPU\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlBrandType_enum(pub ::core::ffi::c_uint);\n///  * The Brand of the GPU\npub use self::nvmlBrandType_enum as nvmlBrandType_t;\nimpl nvmlTemperatureThresholds_enum {\n    pub const NVML_TEMPERATURE_THRESHOLD_SHUTDOWN: nvmlTemperatureThresholds_enum = nvmlTemperatureThresholds_enum(\n        0,\n    );\n}\nimpl nvmlTemperatureThresholds_enum {\n    pub const NVML_TEMPERATURE_THRESHOLD_SLOWDOWN: nvmlTemperatureThresholds_enum = nvmlTemperatureThresholds_enum(\n        1,\n    );\n}\nimpl nvmlTemperatureThresholds_enum {\n    pub const NVML_TEMPERATURE_THRESHOLD_MEM_MAX: nvmlTemperatureThresholds_enum = nvmlTemperatureThresholds_enum(\n        2,\n    );\n}\nimpl nvmlTemperatureThresholds_enum {\n    pub const NVML_TEMPERATURE_THRESHOLD_GPU_MAX: nvmlTemperatureThresholds_enum = nvmlTemperatureThresholds_enum(\n        3,\n    );\n}\nimpl nvmlTemperatureThresholds_enum {\n    pub const NVML_TEMPERATURE_THRESHOLD_ACOUSTIC_MIN: nvmlTemperatureThresholds_enum = nvmlTemperatureThresholds_enum(\n        4,\n    );\n}\nimpl nvmlTemperatureThresholds_enum {\n    pub const NVML_TEMPERATURE_THRESHOLD_ACOUSTIC_CURR: nvmlTemperatureThresholds_enum = nvmlTemperatureThresholds_enum(\n        5,\n    );\n}\nimpl nvmlTemperatureThresholds_enum {\n    pub const NVML_TEMPERATURE_THRESHOLD_ACOUSTIC_MAX: nvmlTemperatureThresholds_enum = nvmlTemperatureThresholds_enum(\n        6,\n    );\n}\nimpl nvmlTemperatureThresholds_enum {\n    pub const NVML_TEMPERATURE_THRESHOLD_GPS_CURR: nvmlTemperatureThresholds_enum = nvmlTemperatureThresholds_enum(\n        7,\n    );\n}\nimpl nvmlTemperatureThresholds_enum {\n    pub const NVML_TEMPERATURE_THRESHOLD_COUNT: nvmlTemperatureThresholds_enum = nvmlTemperatureThresholds_enum(\n        8,\n    );\n}\n#[repr(transparent)]\n/// Temperature thresholds.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlTemperatureThresholds_enum(pub ::core::ffi::c_uint);\n/// Temperature thresholds.\npub use self::nvmlTemperatureThresholds_enum as nvmlTemperatureThresholds_t;\nimpl nvmlTemperatureSensors_enum {\n    ///!< Temperature sensor for the GPU die\n    pub const NVML_TEMPERATURE_GPU: nvmlTemperatureSensors_enum = nvmlTemperatureSensors_enum(\n        0,\n    );\n}\nimpl nvmlTemperatureSensors_enum {\n    pub const NVML_TEMPERATURE_COUNT: nvmlTemperatureSensors_enum = nvmlTemperatureSensors_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n/// Temperature sensors.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlTemperatureSensors_enum(pub ::core::ffi::c_uint);\n/// Temperature sensors.\npub use self::nvmlTemperatureSensors_enum as nvmlTemperatureSensors_t;\n/// Margin temperature values\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlMarginTemperature_v1_t {\n    ///!< The version number of this struct\n    pub version: ::core::ffi::c_uint,\n    ///!< The margin temperature value\n    pub marginTemperature: ::core::ffi::c_int,\n}\n/// Margin temperature values\npub type nvmlMarginTemperature_t = nvmlMarginTemperature_v1_t;\nimpl nvmlComputeMode_enum {\n    ///!< Default compute mode -- multiple contexts per device\n    pub const NVML_COMPUTEMODE_DEFAULT: nvmlComputeMode_enum = nvmlComputeMode_enum(0);\n}\nimpl nvmlComputeMode_enum {\n    ///!< Support Removed\n    pub const NVML_COMPUTEMODE_EXCLUSIVE_THREAD: nvmlComputeMode_enum = nvmlComputeMode_enum(\n        1,\n    );\n}\nimpl nvmlComputeMode_enum {\n    ///!< Compute-prohibited mode -- no contexts per device\n    pub const NVML_COMPUTEMODE_PROHIBITED: nvmlComputeMode_enum = nvmlComputeMode_enum(\n        2,\n    );\n}\nimpl nvmlComputeMode_enum {\n    ///!< Compute-exclusive-process mode -- only one context per device, usable from multiple threads at a time\n    pub const NVML_COMPUTEMODE_EXCLUSIVE_PROCESS: nvmlComputeMode_enum = nvmlComputeMode_enum(\n        3,\n    );\n}\nimpl nvmlComputeMode_enum {\n    pub const NVML_COMPUTEMODE_COUNT: nvmlComputeMode_enum = nvmlComputeMode_enum(4);\n}\n#[repr(transparent)]\n/** Compute mode.\n\n NVML_COMPUTEMODE_EXCLUSIVE_PROCESS was added in CUDA 4.0.\n Earlier CUDA versions supported a single exclusive mode,\n which is equivalent to NVML_COMPUTEMODE_EXCLUSIVE_THREAD in CUDA 4.0 and beyond.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlComputeMode_enum(pub ::core::ffi::c_uint);\n/** Compute mode.\n\n NVML_COMPUTEMODE_EXCLUSIVE_PROCESS was added in CUDA 4.0.\n Earlier CUDA versions supported a single exclusive mode,\n which is equivalent to NVML_COMPUTEMODE_EXCLUSIVE_THREAD in CUDA 4.0 and beyond.*/\npub use self::nvmlComputeMode_enum as nvmlComputeMode_t;\n/// Clock Monitor error types\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlClkMonFaultInfo_struct {\n    /// The Domain which faulted\n    pub clkApiDomain: ::core::ffi::c_uint,\n    /// Faults Information\n    pub clkDomainFaultMask: ::core::ffi::c_uint,\n}\n/// Clock Monitor error types\npub type nvmlClkMonFaultInfo_t = nvmlClkMonFaultInfo_struct;\n/// Clock Monitor Status\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlClkMonStatus_status {\n    /// Fault status Indicator\n    pub bGlobalStatus: ::core::ffi::c_uint,\n    /// Total faulted domain numbers\n    pub clkMonListSize: ::core::ffi::c_uint,\n    /// The fault Information structure\n    pub clkMonList: [nvmlClkMonFaultInfo_t; 32usize],\n}\n/// Clock Monitor Status\npub type nvmlClkMonStatus_t = nvmlClkMonStatus_status;\nimpl nvmlMemoryErrorType_enum {\n    /** A memory error that was corrected\n\n For ECC errors, these are single bit errors\n For Texture memory, these are errors fixed by resend*/\n    pub const NVML_MEMORY_ERROR_TYPE_CORRECTED: nvmlMemoryErrorType_enum = nvmlMemoryErrorType_enum(\n        0,\n    );\n}\nimpl nvmlMemoryErrorType_enum {\n    /** A memory error that was not corrected\n\n For ECC errors, these are double bit errors\n For Texture memory, these are errors where the resend fails*/\n    pub const NVML_MEMORY_ERROR_TYPE_UNCORRECTED: nvmlMemoryErrorType_enum = nvmlMemoryErrorType_enum(\n        1,\n    );\n}\nimpl nvmlMemoryErrorType_enum {\n    ///!< Count of memory error types\n    pub const NVML_MEMORY_ERROR_TYPE_COUNT: nvmlMemoryErrorType_enum = nvmlMemoryErrorType_enum(\n        2,\n    );\n}\n#[repr(transparent)]\n/// Memory error types\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlMemoryErrorType_enum(pub ::core::ffi::c_uint);\n/// Memory error types\npub use self::nvmlMemoryErrorType_enum as nvmlMemoryErrorType_t;\nimpl nvmlNvlinkVersion_enum {\n    pub const NVML_NVLINK_VERSION_INVALID: nvmlNvlinkVersion_enum = nvmlNvlinkVersion_enum(\n        0,\n    );\n}\nimpl nvmlNvlinkVersion_enum {\n    pub const NVML_NVLINK_VERSION_1_0: nvmlNvlinkVersion_enum = nvmlNvlinkVersion_enum(\n        1,\n    );\n}\nimpl nvmlNvlinkVersion_enum {\n    pub const NVML_NVLINK_VERSION_2_0: nvmlNvlinkVersion_enum = nvmlNvlinkVersion_enum(\n        2,\n    );\n}\nimpl nvmlNvlinkVersion_enum {\n    pub const NVML_NVLINK_VERSION_2_2: nvmlNvlinkVersion_enum = nvmlNvlinkVersion_enum(\n        3,\n    );\n}\nimpl nvmlNvlinkVersion_enum {\n    pub const NVML_NVLINK_VERSION_3_0: nvmlNvlinkVersion_enum = nvmlNvlinkVersion_enum(\n        4,\n    );\n}\nimpl nvmlNvlinkVersion_enum {\n    pub const NVML_NVLINK_VERSION_3_1: nvmlNvlinkVersion_enum = nvmlNvlinkVersion_enum(\n        5,\n    );\n}\nimpl nvmlNvlinkVersion_enum {\n    pub const NVML_NVLINK_VERSION_4_0: nvmlNvlinkVersion_enum = nvmlNvlinkVersion_enum(\n        6,\n    );\n}\nimpl nvmlNvlinkVersion_enum {\n    pub const NVML_NVLINK_VERSION_5_0: nvmlNvlinkVersion_enum = nvmlNvlinkVersion_enum(\n        7,\n    );\n}\n#[repr(transparent)]\n/// Represents Nvlink Version\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlNvlinkVersion_enum(pub ::core::ffi::c_uint);\n/// Represents Nvlink Version\npub use self::nvmlNvlinkVersion_enum as nvmlNvlinkVersion_t;\nimpl nvmlEccCounterType_enum {\n    ///!< Volatile counts are reset each time the driver loads.\n    pub const NVML_VOLATILE_ECC: nvmlEccCounterType_enum = nvmlEccCounterType_enum(0);\n}\nimpl nvmlEccCounterType_enum {\n    ///!< Aggregate counts persist across reboots (i.e. for the lifetime of the device)\n    pub const NVML_AGGREGATE_ECC: nvmlEccCounterType_enum = nvmlEccCounterType_enum(1);\n}\nimpl nvmlEccCounterType_enum {\n    ///!< Count of memory counter types\n    pub const NVML_ECC_COUNTER_TYPE_COUNT: nvmlEccCounterType_enum = nvmlEccCounterType_enum(\n        2,\n    );\n}\n#[repr(transparent)]\n/** ECC counter types.\n\n Note: Volatile counts are reset each time the driver loads. On Windows this is once per boot. On Linux this can be more frequent.\n       On Linux the driver unloads when no active clients exist. If persistence mode is enabled or there is always a driver\n       client active (e.g. X11), then Linux also sees per-boot behavior. If not, volatile counts are reset each time a compute app\n       is run.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlEccCounterType_enum(pub ::core::ffi::c_uint);\n/** ECC counter types.\n\n Note: Volatile counts are reset each time the driver loads. On Windows this is once per boot. On Linux this can be more frequent.\n       On Linux the driver unloads when no active clients exist. If persistence mode is enabled or there is always a driver\n       client active (e.g. X11), then Linux also sees per-boot behavior. If not, volatile counts are reset each time a compute app\n       is run.*/\npub use self::nvmlEccCounterType_enum as nvmlEccCounterType_t;\nimpl nvmlClockType_enum {\n    ///!< Graphics clock domain\n    pub const NVML_CLOCK_GRAPHICS: nvmlClockType_enum = nvmlClockType_enum(0);\n}\nimpl nvmlClockType_enum {\n    ///!< SM clock domain\n    pub const NVML_CLOCK_SM: nvmlClockType_enum = nvmlClockType_enum(1);\n}\nimpl nvmlClockType_enum {\n    ///!< Memory clock domain\n    pub const NVML_CLOCK_MEM: nvmlClockType_enum = nvmlClockType_enum(2);\n}\nimpl nvmlClockType_enum {\n    ///!< Video encoder/decoder clock domain\n    pub const NVML_CLOCK_VIDEO: nvmlClockType_enum = nvmlClockType_enum(3);\n}\nimpl nvmlClockType_enum {\n    ///!< Count of clock types\n    pub const NVML_CLOCK_COUNT: nvmlClockType_enum = nvmlClockType_enum(4);\n}\n#[repr(transparent)]\n/** Clock types.\n\n All speeds are in Mhz.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlClockType_enum(pub ::core::ffi::c_uint);\n/** Clock types.\n\n All speeds are in Mhz.*/\npub use self::nvmlClockType_enum as nvmlClockType_t;\nimpl nvmlClockId_enum {\n    ///!< Current actual clock value\n    pub const NVML_CLOCK_ID_CURRENT: nvmlClockId_enum = nvmlClockId_enum(0);\n}\nimpl nvmlClockId_enum {\n    /**!< Target application clock.\n!< Deprecated, do not use.*/\n    pub const NVML_CLOCK_ID_APP_CLOCK_TARGET: nvmlClockId_enum = nvmlClockId_enum(1);\n}\nimpl nvmlClockId_enum {\n    /**!< Default application clock target\n!< Deprecated, do not use.*/\n    pub const NVML_CLOCK_ID_APP_CLOCK_DEFAULT: nvmlClockId_enum = nvmlClockId_enum(2);\n}\nimpl nvmlClockId_enum {\n    ///!< OEM-defined maximum clock rate\n    pub const NVML_CLOCK_ID_CUSTOMER_BOOST_MAX: nvmlClockId_enum = nvmlClockId_enum(3);\n}\nimpl nvmlClockId_enum {\n    ///!< Count of Clock Ids.\n    pub const NVML_CLOCK_ID_COUNT: nvmlClockId_enum = nvmlClockId_enum(4);\n}\n#[repr(transparent)]\n/** Clock Ids.  These are used in combination with nvmlClockType_t\n to specify a single clock value.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlClockId_enum(pub ::core::ffi::c_uint);\n/** Clock Ids.  These are used in combination with nvmlClockType_t\n to specify a single clock value.*/\npub use self::nvmlClockId_enum as nvmlClockId_t;\nimpl nvmlDriverModel_enum {\n    ///!< WDDM driver model -- GPU treated as a display device\n    pub const NVML_DRIVER_WDDM: nvmlDriverModel_enum = nvmlDriverModel_enum(0);\n}\nimpl nvmlDriverModel_enum {\n    ///!< WDM (TCC) model (deprecated) -- GPU treated as a generic compute device\n    pub const NVML_DRIVER_WDM: nvmlDriverModel_enum = nvmlDriverModel_enum(1);\n}\nimpl nvmlDriverModel_enum {\n    ///!< MCDM driver model -- GPU treated as a Microsoft compute device\n    pub const NVML_DRIVER_MCDM: nvmlDriverModel_enum = nvmlDriverModel_enum(2);\n}\n#[repr(transparent)]\n/** Driver models.\n\n Windows only.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlDriverModel_enum(pub ::core::ffi::c_uint);\n/** Driver models.\n\n Windows only.*/\npub use self::nvmlDriverModel_enum as nvmlDriverModel_t;\nimpl nvmlPStates_enum {\n    ///!< Performance state 0 -- Maximum Performance\n    pub const NVML_PSTATE_0: nvmlPStates_enum = nvmlPStates_enum(0);\n}\nimpl nvmlPStates_enum {\n    ///!< Performance state 1\n    pub const NVML_PSTATE_1: nvmlPStates_enum = nvmlPStates_enum(1);\n}\nimpl nvmlPStates_enum {\n    ///!< Performance state 2\n    pub const NVML_PSTATE_2: nvmlPStates_enum = nvmlPStates_enum(2);\n}\nimpl nvmlPStates_enum {\n    ///!< Performance state 3\n    pub const NVML_PSTATE_3: nvmlPStates_enum = nvmlPStates_enum(3);\n}\nimpl nvmlPStates_enum {\n    ///!< Performance state 4\n    pub const NVML_PSTATE_4: nvmlPStates_enum = nvmlPStates_enum(4);\n}\nimpl nvmlPStates_enum {\n    ///!< Performance state 5\n    pub const NVML_PSTATE_5: nvmlPStates_enum = nvmlPStates_enum(5);\n}\nimpl nvmlPStates_enum {\n    ///!< Performance state 6\n    pub const NVML_PSTATE_6: nvmlPStates_enum = nvmlPStates_enum(6);\n}\nimpl nvmlPStates_enum {\n    ///!< Performance state 7\n    pub const NVML_PSTATE_7: nvmlPStates_enum = nvmlPStates_enum(7);\n}\nimpl nvmlPStates_enum {\n    ///!< Performance state 8\n    pub const NVML_PSTATE_8: nvmlPStates_enum = nvmlPStates_enum(8);\n}\nimpl nvmlPStates_enum {\n    ///!< Performance state 9\n    pub const NVML_PSTATE_9: nvmlPStates_enum = nvmlPStates_enum(9);\n}\nimpl nvmlPStates_enum {\n    ///!< Performance state 10\n    pub const NVML_PSTATE_10: nvmlPStates_enum = nvmlPStates_enum(10);\n}\nimpl nvmlPStates_enum {\n    ///!< Performance state 11\n    pub const NVML_PSTATE_11: nvmlPStates_enum = nvmlPStates_enum(11);\n}\nimpl nvmlPStates_enum {\n    ///!< Performance state 12\n    pub const NVML_PSTATE_12: nvmlPStates_enum = nvmlPStates_enum(12);\n}\nimpl nvmlPStates_enum {\n    ///!< Performance state 13\n    pub const NVML_PSTATE_13: nvmlPStates_enum = nvmlPStates_enum(13);\n}\nimpl nvmlPStates_enum {\n    ///!< Performance state 14\n    pub const NVML_PSTATE_14: nvmlPStates_enum = nvmlPStates_enum(14);\n}\nimpl nvmlPStates_enum {\n    ///!< Performance state 15 -- Minimum Performance\n    pub const NVML_PSTATE_15: nvmlPStates_enum = nvmlPStates_enum(15);\n}\nimpl nvmlPStates_enum {\n    ///!< Unknown performance state\n    pub const NVML_PSTATE_UNKNOWN: nvmlPStates_enum = nvmlPStates_enum(32);\n}\n#[repr(transparent)]\n/// Allowed PStates.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlPStates_enum(pub ::core::ffi::c_uint);\n/// Allowed PStates.\npub use self::nvmlPStates_enum as nvmlPstates_t;\n/// Clock offset info.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlClockOffset_v1_t {\n    ///!< The version number of this struct\n    pub version: ::core::ffi::c_uint,\n    pub type_: nvmlClockType_t,\n    pub pstate: nvmlPstates_t,\n    pub clockOffsetMHz: ::core::ffi::c_int,\n    pub minClockOffsetMHz: ::core::ffi::c_int,\n    pub maxClockOffsetMHz: ::core::ffi::c_int,\n}\n/// Clock offset info.\npub type nvmlClockOffset_t = nvmlClockOffset_v1_t;\n/// Fan speed info.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlFanSpeedInfo_v1_t {\n    ///!< the API version number\n    pub version: ::core::ffi::c_uint,\n    ///!< the fan index\n    pub fan: ::core::ffi::c_uint,\n    ///!< OUT: the fan speed in RPM\n    pub speed: ::core::ffi::c_uint,\n}\n/// Fan speed info.\npub type nvmlFanSpeedInfo_t = nvmlFanSpeedInfo_v1_t;\n/// Device performance modes string\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlDevicePerfModes_v1_t {\n    ///!< the API version number\n    pub version: ::core::ffi::c_uint,\n    ///!< OUT: the performance modes string.\n    pub str_: [::core::ffi::c_char; 2048usize],\n}\n/// Device performance modes string\npub type nvmlDevicePerfModes_t = nvmlDevicePerfModes_v1_t;\n/// Device current clocks string\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlDeviceCurrentClockFreqs_v1_t {\n    ///!< the API version number\n    pub version: ::core::ffi::c_uint,\n    ///!< OUT: the current clock frequency string.\n    pub str_: [::core::ffi::c_char; 2048usize],\n}\n/// Device current clocks string\npub type nvmlDeviceCurrentClockFreqs_t = nvmlDeviceCurrentClockFreqs_v1_t;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlDevicePowerMizerModes_v1_t {\n    ///!< OUT: the current powermizer mode\n    pub currentMode: ::core::ffi::c_uint,\n    ///!< IN: the powermizer mode to set\n    pub mode: ::core::ffi::c_uint,\n    ///!< OUT: Bitmask of supported powermizer modes\n    pub supportedPowerMizerModes: ::core::ffi::c_uint,\n}\nimpl nvmlGom_enum {\n    ///!< Everything is enabled and running at full speed\n    pub const NVML_GOM_ALL_ON: nvmlGom_enum = nvmlGom_enum(0);\n}\nimpl nvmlGom_enum {\n    /**!< Designed for running only compute tasks. Graphics operations\n!< are not allowed*/\n    pub const NVML_GOM_COMPUTE: nvmlGom_enum = nvmlGom_enum(1);\n}\nimpl nvmlGom_enum {\n    /**!< Designed for running graphics applications that don't require\n!< high bandwidth double precision*/\n    pub const NVML_GOM_LOW_DP: nvmlGom_enum = nvmlGom_enum(2);\n}\n#[repr(transparent)]\n/** GPU Operation Mode\n\n GOM allows to reduce power usage and optimize GPU throughput by disabling GPU features.\n\n Each GOM is designed to meet specific user needs.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlGom_enum(pub ::core::ffi::c_uint);\n/** GPU Operation Mode\n\n GOM allows to reduce power usage and optimize GPU throughput by disabling GPU features.\n\n Each GOM is designed to meet specific user needs.*/\npub use self::nvmlGom_enum as nvmlGpuOperationMode_t;\nimpl nvmlInforomObject_enum {\n    ///!< An object defined by OEM\n    pub const NVML_INFOROM_OEM: nvmlInforomObject_enum = nvmlInforomObject_enum(0);\n}\nimpl nvmlInforomObject_enum {\n    ///!< The ECC object determining the level of ECC support\n    pub const NVML_INFOROM_ECC: nvmlInforomObject_enum = nvmlInforomObject_enum(1);\n}\nimpl nvmlInforomObject_enum {\n    ///!< The power management object\n    pub const NVML_INFOROM_POWER: nvmlInforomObject_enum = nvmlInforomObject_enum(2);\n}\nimpl nvmlInforomObject_enum {\n    ///!< DRAM Encryption object\n    pub const NVML_INFOROM_DEN: nvmlInforomObject_enum = nvmlInforomObject_enum(3);\n}\nimpl nvmlInforomObject_enum {\n    ///!< This counts the number of infoROM objects the driver knows about\n    pub const NVML_INFOROM_COUNT: nvmlInforomObject_enum = nvmlInforomObject_enum(4);\n}\n#[repr(transparent)]\n/// Available infoROM objects.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlInforomObject_enum(pub ::core::ffi::c_uint);\n/// Available infoROM objects.\npub use self::nvmlInforomObject_enum as nvmlInforomObject_t;\nimpl nvmlMemoryLocation_enum {\n    ///!< GPU L1 Cache\n    pub const NVML_MEMORY_LOCATION_L1_CACHE: nvmlMemoryLocation_enum = nvmlMemoryLocation_enum(\n        0,\n    );\n}\nimpl nvmlMemoryLocation_enum {\n    ///!< GPU L2 Cache\n    pub const NVML_MEMORY_LOCATION_L2_CACHE: nvmlMemoryLocation_enum = nvmlMemoryLocation_enum(\n        1,\n    );\n}\nimpl nvmlMemoryLocation_enum {\n    ///!< Turing+ DRAM\n    pub const NVML_MEMORY_LOCATION_DRAM: nvmlMemoryLocation_enum = nvmlMemoryLocation_enum(\n        2,\n    );\n}\nimpl nvmlMemoryLocation_enum {\n    ///!< GPU Device Memory\n    pub const NVML_MEMORY_LOCATION_DEVICE_MEMORY: nvmlMemoryLocation_enum = nvmlMemoryLocation_enum(\n        2,\n    );\n}\nimpl nvmlMemoryLocation_enum {\n    ///!< GPU Register File\n    pub const NVML_MEMORY_LOCATION_REGISTER_FILE: nvmlMemoryLocation_enum = nvmlMemoryLocation_enum(\n        3,\n    );\n}\nimpl nvmlMemoryLocation_enum {\n    ///!< GPU Texture Memory\n    pub const NVML_MEMORY_LOCATION_TEXTURE_MEMORY: nvmlMemoryLocation_enum = nvmlMemoryLocation_enum(\n        4,\n    );\n}\nimpl nvmlMemoryLocation_enum {\n    ///!< Shared memory\n    pub const NVML_MEMORY_LOCATION_TEXTURE_SHM: nvmlMemoryLocation_enum = nvmlMemoryLocation_enum(\n        5,\n    );\n}\nimpl nvmlMemoryLocation_enum {\n    ///!< CBU\n    pub const NVML_MEMORY_LOCATION_CBU: nvmlMemoryLocation_enum = nvmlMemoryLocation_enum(\n        6,\n    );\n}\nimpl nvmlMemoryLocation_enum {\n    ///!< Turing+ SRAM\n    pub const NVML_MEMORY_LOCATION_SRAM: nvmlMemoryLocation_enum = nvmlMemoryLocation_enum(\n        7,\n    );\n}\nimpl nvmlMemoryLocation_enum {\n    ///!< This counts the number of memory locations the driver knows about\n    pub const NVML_MEMORY_LOCATION_COUNT: nvmlMemoryLocation_enum = nvmlMemoryLocation_enum(\n        8,\n    );\n}\n#[repr(transparent)]\n/// See \\ref nvmlDeviceGetMemoryErrorCounter\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlMemoryLocation_enum(pub ::core::ffi::c_uint);\n/// See \\ref nvmlDeviceGetMemoryErrorCounter\npub use self::nvmlMemoryLocation_enum as nvmlMemoryLocation_t;\nimpl nvmlPageRetirementCause_enum {\n    ///!< Page was retired due to multiple single bit ECC error\n    pub const NVML_PAGE_RETIREMENT_CAUSE_MULTIPLE_SINGLE_BIT_ECC_ERRORS: nvmlPageRetirementCause_enum = nvmlPageRetirementCause_enum(\n        0,\n    );\n}\nimpl nvmlPageRetirementCause_enum {\n    ///!< Page was retired due to double bit ECC error\n    pub const NVML_PAGE_RETIREMENT_CAUSE_DOUBLE_BIT_ECC_ERROR: nvmlPageRetirementCause_enum = nvmlPageRetirementCause_enum(\n        1,\n    );\n}\nimpl nvmlPageRetirementCause_enum {\n    pub const NVML_PAGE_RETIREMENT_CAUSE_COUNT: nvmlPageRetirementCause_enum = nvmlPageRetirementCause_enum(\n        2,\n    );\n}\n#[repr(transparent)]\n/// Causes for page retirement\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlPageRetirementCause_enum(pub ::core::ffi::c_uint);\n/// Causes for page retirement\npub use self::nvmlPageRetirementCause_enum as nvmlPageRetirementCause_t;\nimpl nvmlRestrictedAPI_enum {\n    /**!< APIs that change application clocks, see nvmlDeviceSetApplicationsClocks\n!< and see nvmlDeviceResetApplicationsClocks.\n!< Deprecated, keeping definition for backward compatibility.*/\n    pub const NVML_RESTRICTED_API_SET_APPLICATION_CLOCKS: nvmlRestrictedAPI_enum = nvmlRestrictedAPI_enum(\n        0,\n    );\n}\nimpl nvmlRestrictedAPI_enum {\n    /**!< APIs that enable/disable Auto Boosted clocks\n!< see nvmlDeviceSetAutoBoostedClocksEnabled*/\n    pub const NVML_RESTRICTED_API_SET_AUTO_BOOSTED_CLOCKS: nvmlRestrictedAPI_enum = nvmlRestrictedAPI_enum(\n        1,\n    );\n}\nimpl nvmlRestrictedAPI_enum {\n    pub const NVML_RESTRICTED_API_COUNT: nvmlRestrictedAPI_enum = nvmlRestrictedAPI_enum(\n        2,\n    );\n}\n#[repr(transparent)]\n/// API types that allow changes to default permission restrictions\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlRestrictedAPI_enum(pub ::core::ffi::c_uint);\n/// API types that allow changes to default permission restrictions\npub use self::nvmlRestrictedAPI_enum as nvmlRestrictedAPI_t;\n/// Structure to store utilization value and process Id\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlProcessUtilizationSample_st {\n    ///!< PID of process\n    pub pid: ::core::ffi::c_uint,\n    ///!< CPU Timestamp in microseconds\n    pub timeStamp: ::core::ffi::c_ulonglong,\n    ///!< SM (3D/Compute) Util Value\n    pub smUtil: ::core::ffi::c_uint,\n    ///!< Frame Buffer Memory Util Value\n    pub memUtil: ::core::ffi::c_uint,\n    ///!< Encoder Util Value\n    pub encUtil: ::core::ffi::c_uint,\n    ///!< Decoder Util Value\n    pub decUtil: ::core::ffi::c_uint,\n}\n/// Structure to store utilization value and process Id\npub type nvmlProcessUtilizationSample_t = nvmlProcessUtilizationSample_st;\n/// Structure to store utilization value and process Id -- version 1\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlProcessUtilizationInfo_v1_t {\n    ///!< CPU Timestamp in microseconds\n    pub timeStamp: ::core::ffi::c_ulonglong,\n    ///!< PID of process\n    pub pid: ::core::ffi::c_uint,\n    ///!< SM (3D/Compute) Util Value\n    pub smUtil: ::core::ffi::c_uint,\n    ///!< Frame Buffer Memory Util Value\n    pub memUtil: ::core::ffi::c_uint,\n    ///!< Encoder Util Value\n    pub encUtil: ::core::ffi::c_uint,\n    ///!< Decoder Util Value\n    pub decUtil: ::core::ffi::c_uint,\n    ///!< Jpeg Util Value\n    pub jpgUtil: ::core::ffi::c_uint,\n    ///!< Ofa Util Value\n    pub ofaUtil: ::core::ffi::c_uint,\n}\n/// Structure to store utilization and process ID for each running process -- version 1\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlProcessesUtilizationInfo_v1_t {\n    ///!< The version number of this struct\n    pub version: ::core::ffi::c_uint,\n    ///!< Caller-supplied array size, and returns number of processes running\n    pub processSamplesCount: ::core::ffi::c_uint,\n    ///!< Return only samples with timestamp greater than lastSeenTimeStamp\n    pub lastSeenTimeStamp: ::core::ffi::c_ulonglong,\n    ///!< The array (allocated by caller) of the utilization of GPU SM, framebuffer, video encoder, video decoder, JPEG, and OFA\n    pub procUtilArray: *mut nvmlProcessUtilizationInfo_v1_t,\n}\n/// Structure to store utilization and process ID for each running process -- version 1\npub type nvmlProcessesUtilizationInfo_t = nvmlProcessesUtilizationInfo_v1_t;\n/// Structure to store SRAM uncorrectable error counters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlEccSramErrorStatus_v1_t {\n    ///!< the API version number\n    pub version: ::core::ffi::c_uint,\n    ///!< aggregate uncorrectable parity error count\n    pub aggregateUncParity: ::core::ffi::c_ulonglong,\n    ///!< aggregate uncorrectable SEC-DED error count\n    pub aggregateUncSecDed: ::core::ffi::c_ulonglong,\n    ///!< aggregate correctable error count\n    pub aggregateCor: ::core::ffi::c_ulonglong,\n    ///!< volatile uncorrectable parity error count\n    pub volatileUncParity: ::core::ffi::c_ulonglong,\n    ///!< volatile uncorrectable SEC-DED error count\n    pub volatileUncSecDed: ::core::ffi::c_ulonglong,\n    ///!< volatile correctable error count\n    pub volatileCor: ::core::ffi::c_ulonglong,\n    ///!< aggregate uncorrectable error count for L2 cache bucket\n    pub aggregateUncBucketL2: ::core::ffi::c_ulonglong,\n    ///!< aggregate uncorrectable error count for SM bucket\n    pub aggregateUncBucketSm: ::core::ffi::c_ulonglong,\n    ///!< aggregate uncorrectable error count for PCIE bucket\n    pub aggregateUncBucketPcie: ::core::ffi::c_ulonglong,\n    ///!< aggregate uncorrectable error count for Microcontroller bucket\n    pub aggregateUncBucketMcu: ::core::ffi::c_ulonglong,\n    ///!< aggregate uncorrectable error count for Other bucket\n    pub aggregateUncBucketOther: ::core::ffi::c_ulonglong,\n    ///!< if the error threshold of field diag is exceeded\n    pub bThresholdExceeded: ::core::ffi::c_uint,\n}\n/// Structure to store SRAM uncorrectable error counters\npub type nvmlEccSramErrorStatus_t = nvmlEccSramErrorStatus_v1_t;\n/** Structure to store platform information\n\n @deprecated  The nvmlPlatformInfo_v1_t will be deprecated in the subsequent releases.\n              Use nvmlPlatformInfo_v2_t*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlPlatformInfo_v1_t {\n    ///!< the API version number\n    pub version: ::core::ffi::c_uint,\n    ///!< Infiniband GUID reported by platform (for Blackwell, ibGuid is 8 bytes so indices 8-15 are zero)\n    pub ibGuid: [::core::ffi::c_uchar; 16usize],\n    ///!< GUID of the rack containing this GPU (for Blackwell rackGuid is 13 bytes so indices 13-15 are zero)\n    pub rackGuid: [::core::ffi::c_uchar; 16usize],\n    ///!< The slot number in the rack containing this GPU (includes switches)\n    pub chassisPhysicalSlotNumber: ::core::ffi::c_uchar,\n    ///!< The index within the compute slots in the rack containing this GPU (does not include switches)\n    pub computeSlotIndex: ::core::ffi::c_uchar,\n    ///!< Index of the node within the slot containing this GPU\n    pub nodeIndex: ::core::ffi::c_uchar,\n    ///!< Platform indicated NVLink-peer type (e.g. switch present or not)\n    pub peerType: ::core::ffi::c_uchar,\n    ///!< ID of this GPU within the node\n    pub moduleId: ::core::ffi::c_uchar,\n}\n/// Structure to store platform information (v2)\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlPlatformInfo_v2_t {\n    ///!< the API version number\n    pub version: ::core::ffi::c_uint,\n    ///!< Infiniband GUID reported by platform (for Blackwell, ibGuid is 8 bytes so indices 8-15 are zero)\n    pub ibGuid: [::core::ffi::c_uchar; 16usize],\n    ///!< Serial number of the chassis containing this GPU (for Blackwell it is 13 bytes so indices 13-15 are zero)\n    pub chassisSerialNumber: [::core::ffi::c_uchar; 16usize],\n    ///!< The slot number in the chassis containing this GPU (includes switches)\n    pub slotNumber: ::core::ffi::c_uchar,\n    ///!< The tray index within the compute slots in the chassis containing this GPU (does not include switches)\n    pub trayIndex: ::core::ffi::c_uchar,\n    ///!< Index of the node within the slot containing this GPU\n    pub hostId: ::core::ffi::c_uchar,\n    ///!< Platform indicated NVLink-peer type (e.g. switch present or not)\n    pub peerType: ::core::ffi::c_uchar,\n    ///!< ID of this GPU within the node\n    pub moduleId: ::core::ffi::c_uchar,\n}\n/// Structure to store platform information (v2)\npub type nvmlPlatformInfo_t = nvmlPlatformInfo_v2_t;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlHostname_v1_t {\n    ///!< null-terminated hostname string\n    pub value: [::core::ffi::c_char; 64usize],\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlEccSramUniqueUncorrectedErrorEntry_v1_t {\n    ///!< the SRAM unit index\n    pub unit: ::core::ffi::c_uint,\n    ///!< the error location within the SRAM unit\n    pub location: ::core::ffi::c_uint,\n    ///!< the error sublocation within the SRAM unit\n    pub sublocation: ::core::ffi::c_uint,\n    ///!< the error extlocation within the SRAM unit\n    pub extlocation: ::core::ffi::c_uint,\n    ///!< the error address within the SRAM unit\n    pub address: ::core::ffi::c_uint,\n    ///!< if the SRAM error is parity or not\n    pub isParity: ::core::ffi::c_uint,\n    ///!< the error count at the same SRAM address\n    pub count: ::core::ffi::c_uint,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlEccSramUniqueUncorrectedErrorCounts_v1_t {\n    ///!< the API version number\n    pub version: ::core::ffi::c_uint,\n    ///!< the number of error count entries\n    pub entryCount: ::core::ffi::c_uint,\n    ///!< pointer to caller-supplied buffer to return the SRAM unique uncorrected ECC error count entries\n    pub entries: *mut nvmlEccSramUniqueUncorrectedErrorEntry_v1_t,\n}\npub type nvmlEccSramUniqueUncorrectedErrorCounts_t = nvmlEccSramUniqueUncorrectedErrorCounts_v1_t;\npub type nvmlDeviceArchitecture_t = ::core::ffi::c_uint;\npub type nvmlBusType_t = ::core::ffi::c_uint;\npub type nvmlFanControlPolicy_t = ::core::ffi::c_uint;\npub type nvmlPowerSource_t = ::core::ffi::c_uint;\nimpl nvmlGpuUtilizationDomainId_t {\n    ///!< Graphics engine domain\n    pub const NVML_GPU_UTILIZATION_DOMAIN_GPU: nvmlGpuUtilizationDomainId_t = nvmlGpuUtilizationDomainId_t(\n        0,\n    );\n}\nimpl nvmlGpuUtilizationDomainId_t {\n    ///!< Frame buffer domain\n    pub const NVML_GPU_UTILIZATION_DOMAIN_FB: nvmlGpuUtilizationDomainId_t = nvmlGpuUtilizationDomainId_t(\n        1,\n    );\n}\nimpl nvmlGpuUtilizationDomainId_t {\n    ///!< Video engine domain\n    pub const NVML_GPU_UTILIZATION_DOMAIN_VID: nvmlGpuUtilizationDomainId_t = nvmlGpuUtilizationDomainId_t(\n        2,\n    );\n}\nimpl nvmlGpuUtilizationDomainId_t {\n    ///!< Bus interface domain\n    pub const NVML_GPU_UTILIZATION_DOMAIN_BUS: nvmlGpuUtilizationDomainId_t = nvmlGpuUtilizationDomainId_t(\n        3,\n    );\n}\n#[repr(transparent)]\n/// Represents the GPU utilization domains\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlGpuUtilizationDomainId_t(pub ::core::ffi::c_uint);\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlGpuDynamicPstatesInfo_st {\n    ///!< Reserved for future use\n    pub flags: ::core::ffi::c_uint,\n    pub utilization: [nvmlGpuDynamicPstatesInfo_st__bindgen_ty_1; 8usize],\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlGpuDynamicPstatesInfo_st__bindgen_ty_1 {\n    ///!< Set if this utilization domain is present on this GPU\n    pub bIsPresent: ::core::ffi::c_uint,\n    ///!< Percentage of time where the domain is considered busy in the last 1-second interval\n    pub percentage: ::core::ffi::c_uint,\n    ///!< Utilization threshold that can trigger a perf-increasing P-State change when crossed\n    pub incThreshold: ::core::ffi::c_uint,\n    ///!< Utilization threshold that can trigger a perf-decreasing P-State change when crossed\n    pub decThreshold: ::core::ffi::c_uint,\n}\npub type nvmlGpuDynamicPstatesInfo_t = nvmlGpuDynamicPstatesInfo_st;\npub type nvmlPowerScopeType_t = ::core::ffi::c_uchar;\n/// Contains the power management limit\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlPowerValue_v2_t {\n    ///!< Structure format version (must be 1)\n    pub version: ::core::ffi::c_uint,\n    ///!< [in]  Device type: GPU or Total Module\n    pub powerScope: nvmlPowerScopeType_t,\n    ///!< [out] Power value to retrieve or set in milliwatts\n    pub powerValueMw: ::core::ffi::c_uint,\n}\nimpl nvmlGpuVirtualizationMode {\n    ///!< Represents Bare Metal GPU\n    pub const NVML_GPU_VIRTUALIZATION_MODE_NONE: nvmlGpuVirtualizationMode = nvmlGpuVirtualizationMode(\n        0,\n    );\n}\nimpl nvmlGpuVirtualizationMode {\n    ///!< Device is associated with GPU-Passthorugh\n    pub const NVML_GPU_VIRTUALIZATION_MODE_PASSTHROUGH: nvmlGpuVirtualizationMode = nvmlGpuVirtualizationMode(\n        1,\n    );\n}\nimpl nvmlGpuVirtualizationMode {\n    ///!< Device is associated with vGPU inside virtual machine.\n    pub const NVML_GPU_VIRTUALIZATION_MODE_VGPU: nvmlGpuVirtualizationMode = nvmlGpuVirtualizationMode(\n        2,\n    );\n}\nimpl nvmlGpuVirtualizationMode {\n    ///!< Device is associated with VGX hypervisor in vGPU mode\n    pub const NVML_GPU_VIRTUALIZATION_MODE_HOST_VGPU: nvmlGpuVirtualizationMode = nvmlGpuVirtualizationMode(\n        3,\n    );\n}\nimpl nvmlGpuVirtualizationMode {\n    ///!< Device is associated with VGX hypervisor in vSGA mode\n    pub const NVML_GPU_VIRTUALIZATION_MODE_HOST_VSGA: nvmlGpuVirtualizationMode = nvmlGpuVirtualizationMode(\n        4,\n    );\n}\n#[repr(transparent)]\n/// GPU virtualization mode types.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlGpuVirtualizationMode(pub ::core::ffi::c_uint);\n/// GPU virtualization mode types.\npub use self::nvmlGpuVirtualizationMode as nvmlGpuVirtualizationMode_t;\nimpl nvmlHostVgpuMode_enum {\n    ///!< Non SR-IOV mode\n    pub const NVML_HOST_VGPU_MODE_NON_SRIOV: nvmlHostVgpuMode_enum = nvmlHostVgpuMode_enum(\n        0,\n    );\n}\nimpl nvmlHostVgpuMode_enum {\n    ///!< SR-IOV mode\n    pub const NVML_HOST_VGPU_MODE_SRIOV: nvmlHostVgpuMode_enum = nvmlHostVgpuMode_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n/// Host vGPU modes\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlHostVgpuMode_enum(pub ::core::ffi::c_uint);\n/// Host vGPU modes\npub use self::nvmlHostVgpuMode_enum as nvmlHostVgpuMode_t;\nimpl nvmlVgpuVmIdType {\n    ///!< VM ID represents DOMAIN ID\n    pub const NVML_VGPU_VM_ID_DOMAIN_ID: nvmlVgpuVmIdType = nvmlVgpuVmIdType(0);\n}\nimpl nvmlVgpuVmIdType {\n    ///!< VM ID represents UUID\n    pub const NVML_VGPU_VM_ID_UUID: nvmlVgpuVmIdType = nvmlVgpuVmIdType(1);\n}\n#[repr(transparent)]\n/// Types of VM identifiers\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuVmIdType(pub ::core::ffi::c_uint);\n/// Types of VM identifiers\npub use self::nvmlVgpuVmIdType as nvmlVgpuVmIdType_t;\nimpl nvmlVgpuGuestInfoState_enum {\n    ///!< Guest-dependent fields uninitialized\n    pub const NVML_VGPU_INSTANCE_GUEST_INFO_STATE_UNINITIALIZED: nvmlVgpuGuestInfoState_enum = nvmlVgpuGuestInfoState_enum(\n        0,\n    );\n}\nimpl nvmlVgpuGuestInfoState_enum {\n    ///!< Guest-dependent fields initialized\n    pub const NVML_VGPU_INSTANCE_GUEST_INFO_STATE_INITIALIZED: nvmlVgpuGuestInfoState_enum = nvmlVgpuGuestInfoState_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n/// vGPU GUEST info state\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuGuestInfoState_enum(pub ::core::ffi::c_uint);\n/// vGPU GUEST info state\npub use self::nvmlVgpuGuestInfoState_enum as nvmlVgpuGuestInfoState_t;\nimpl nvmlGridLicenseFeatureCode_t {\n    ///!< Unknown\n    pub const NVML_GRID_LICENSE_FEATURE_CODE_UNKNOWN: nvmlGridLicenseFeatureCode_t = nvmlGridLicenseFeatureCode_t(\n        0,\n    );\n}\nimpl nvmlGridLicenseFeatureCode_t {\n    ///!< Virtual GPU\n    pub const NVML_GRID_LICENSE_FEATURE_CODE_VGPU: nvmlGridLicenseFeatureCode_t = nvmlGridLicenseFeatureCode_t(\n        1,\n    );\n}\nimpl nvmlGridLicenseFeatureCode_t {\n    ///!< Nvidia RTX\n    pub const NVML_GRID_LICENSE_FEATURE_CODE_NVIDIA_RTX: nvmlGridLicenseFeatureCode_t = nvmlGridLicenseFeatureCode_t(\n        2,\n    );\n}\nimpl nvmlGridLicenseFeatureCode_t {\n    ///!< Deprecated, do not use.\n    pub const NVML_GRID_LICENSE_FEATURE_CODE_VWORKSTATION: nvmlGridLicenseFeatureCode_t = nvmlGridLicenseFeatureCode_t(\n        2,\n    );\n}\nimpl nvmlGridLicenseFeatureCode_t {\n    ///!< Gaming\n    pub const NVML_GRID_LICENSE_FEATURE_CODE_GAMING: nvmlGridLicenseFeatureCode_t = nvmlGridLicenseFeatureCode_t(\n        3,\n    );\n}\nimpl nvmlGridLicenseFeatureCode_t {\n    ///!< Compute\n    pub const NVML_GRID_LICENSE_FEATURE_CODE_COMPUTE: nvmlGridLicenseFeatureCode_t = nvmlGridLicenseFeatureCode_t(\n        4,\n    );\n}\n#[repr(transparent)]\n/// vGPU software licensable features\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlGridLicenseFeatureCode_t(pub ::core::ffi::c_uint);\nimpl nvmlVgpuCapability_enum {\n    ///!< P2P over NVLink is supported\n    pub const NVML_VGPU_CAP_NVLINK_P2P: nvmlVgpuCapability_enum = nvmlVgpuCapability_enum(\n        0,\n    );\n}\nimpl nvmlVgpuCapability_enum {\n    ///!< GPUDirect capability is supported\n    pub const NVML_VGPU_CAP_GPUDIRECT: nvmlVgpuCapability_enum = nvmlVgpuCapability_enum(\n        1,\n    );\n}\nimpl nvmlVgpuCapability_enum {\n    ///!< vGPU profile cannot be mixed with other vGPU profiles in same VM\n    pub const NVML_VGPU_CAP_MULTI_VGPU_EXCLUSIVE: nvmlVgpuCapability_enum = nvmlVgpuCapability_enum(\n        2,\n    );\n}\nimpl nvmlVgpuCapability_enum {\n    ///!< vGPU profile cannot run on a GPU alongside other profiles of different type\n    pub const NVML_VGPU_CAP_EXCLUSIVE_TYPE: nvmlVgpuCapability_enum = nvmlVgpuCapability_enum(\n        3,\n    );\n}\nimpl nvmlVgpuCapability_enum {\n    ///!< vGPU profile cannot run on a GPU alongside other profiles of different size\n    pub const NVML_VGPU_CAP_EXCLUSIVE_SIZE: nvmlVgpuCapability_enum = nvmlVgpuCapability_enum(\n        4,\n    );\n}\nimpl nvmlVgpuCapability_enum {\n    pub const NVML_VGPU_CAP_COUNT: nvmlVgpuCapability_enum = nvmlVgpuCapability_enum(5);\n}\n#[repr(transparent)]\n/// vGPU queryable capabilities\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuCapability_enum(pub ::core::ffi::c_uint);\n/// vGPU queryable capabilities\npub use self::nvmlVgpuCapability_enum as nvmlVgpuCapability_t;\nimpl nvmlVgpuDriverCapability_enum {\n    ///!< Supports mixing of different vGPU profiles within one guest VM\n    pub const NVML_VGPU_DRIVER_CAP_HETEROGENEOUS_MULTI_VGPU: nvmlVgpuDriverCapability_enum = nvmlVgpuDriverCapability_enum(\n        0,\n    );\n}\nimpl nvmlVgpuDriverCapability_enum {\n    ///!< Supports FSR and warm update of vGPU host driver without terminating the running guest VM\n    pub const NVML_VGPU_DRIVER_CAP_WARM_UPDATE: nvmlVgpuDriverCapability_enum = nvmlVgpuDriverCapability_enum(\n        1,\n    );\n}\nimpl nvmlVgpuDriverCapability_enum {\n    pub const NVML_VGPU_DRIVER_CAP_COUNT: nvmlVgpuDriverCapability_enum = nvmlVgpuDriverCapability_enum(\n        2,\n    );\n}\n#[repr(transparent)]\n/// vGPU driver queryable capabilities\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuDriverCapability_enum(pub ::core::ffi::c_uint);\n/// vGPU driver queryable capabilities\npub use self::nvmlVgpuDriverCapability_enum as nvmlVgpuDriverCapability_t;\nimpl nvmlDeviceVgpuCapability_enum {\n    ///!< Query whether the fractional vGPU profiles on this GPU can be used in multi-vGPU configurations\n    pub const NVML_DEVICE_VGPU_CAP_FRACTIONAL_MULTI_VGPU: nvmlDeviceVgpuCapability_enum = nvmlDeviceVgpuCapability_enum(\n        0,\n    );\n}\nimpl nvmlDeviceVgpuCapability_enum {\n    ///!< Query whether the GPU support concurrent execution of timesliced vGPU profiles of differing types\n    pub const NVML_DEVICE_VGPU_CAP_HETEROGENEOUS_TIMESLICE_PROFILES: nvmlDeviceVgpuCapability_enum = nvmlDeviceVgpuCapability_enum(\n        1,\n    );\n}\nimpl nvmlDeviceVgpuCapability_enum {\n    ///!< Query whether the GPU support concurrent execution of timesliced vGPU profiles of differing framebuffer sizes\n    pub const NVML_DEVICE_VGPU_CAP_HETEROGENEOUS_TIMESLICE_SIZES: nvmlDeviceVgpuCapability_enum = nvmlDeviceVgpuCapability_enum(\n        2,\n    );\n}\nimpl nvmlDeviceVgpuCapability_enum {\n    ///!< Query the GPU's read_device_buffer expected bandwidth capacity in megabytes per second\n    pub const NVML_DEVICE_VGPU_CAP_READ_DEVICE_BUFFER_BW: nvmlDeviceVgpuCapability_enum = nvmlDeviceVgpuCapability_enum(\n        3,\n    );\n}\nimpl nvmlDeviceVgpuCapability_enum {\n    ///!< Query the GPU's write_device_buffer expected bandwidth capacity in megabytes per second\n    pub const NVML_DEVICE_VGPU_CAP_WRITE_DEVICE_BUFFER_BW: nvmlDeviceVgpuCapability_enum = nvmlDeviceVgpuCapability_enum(\n        4,\n    );\n}\nimpl nvmlDeviceVgpuCapability_enum {\n    ///!< Query whether the vGPU profiles on the GPU supports migration data streaming\n    pub const NVML_DEVICE_VGPU_CAP_DEVICE_STREAMING: nvmlDeviceVgpuCapability_enum = nvmlDeviceVgpuCapability_enum(\n        5,\n    );\n}\nimpl nvmlDeviceVgpuCapability_enum {\n    ///!< Set/Get support for mini-quarter vGPU profiles\n    pub const NVML_DEVICE_VGPU_CAP_MINI_QUARTER_GPU: nvmlDeviceVgpuCapability_enum = nvmlDeviceVgpuCapability_enum(\n        6,\n    );\n}\nimpl nvmlDeviceVgpuCapability_enum {\n    ///!< Set/Get support for compute media engine vGPU profiles\n    pub const NVML_DEVICE_VGPU_CAP_COMPUTE_MEDIA_ENGINE_GPU: nvmlDeviceVgpuCapability_enum = nvmlDeviceVgpuCapability_enum(\n        7,\n    );\n}\nimpl nvmlDeviceVgpuCapability_enum {\n    ///!< Query whether the GPU supports FSR and warm update\n    pub const NVML_DEVICE_VGPU_CAP_WARM_UPDATE: nvmlDeviceVgpuCapability_enum = nvmlDeviceVgpuCapability_enum(\n        8,\n    );\n}\nimpl nvmlDeviceVgpuCapability_enum {\n    ///!< Query whether the GPU supports reporting of placements of timesliced vGPU profiles with identical framebuffer sizes\n    pub const NVML_DEVICE_VGPU_CAP_HOMOGENEOUS_PLACEMENTS: nvmlDeviceVgpuCapability_enum = nvmlDeviceVgpuCapability_enum(\n        9,\n    );\n}\nimpl nvmlDeviceVgpuCapability_enum {\n    ///!< Query whether the GPU supports timesliced vGPU on MIG\n    pub const NVML_DEVICE_VGPU_CAP_MIG_TIMESLICING_SUPPORTED: nvmlDeviceVgpuCapability_enum = nvmlDeviceVgpuCapability_enum(\n        10,\n    );\n}\nimpl nvmlDeviceVgpuCapability_enum {\n    ///!< Set/Get MIG timesliced mode reporting, without impacting the underlying functionality\n    pub const NVML_DEVICE_VGPU_CAP_MIG_TIMESLICING_ENABLED: nvmlDeviceVgpuCapability_enum = nvmlDeviceVgpuCapability_enum(\n        11,\n    );\n}\nimpl nvmlDeviceVgpuCapability_enum {\n    pub const NVML_DEVICE_VGPU_CAP_COUNT: nvmlDeviceVgpuCapability_enum = nvmlDeviceVgpuCapability_enum(\n        12,\n    );\n}\n#[repr(transparent)]\n/// Device vGPU queryable capabilities\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlDeviceVgpuCapability_enum(pub ::core::ffi::c_uint);\n/// Device vGPU queryable capabilities\npub use self::nvmlDeviceVgpuCapability_enum as nvmlDeviceVgpuCapability_t;\n#[doc = \"/\\n/** @defgroup nvmlVgpuStructs vGPU Structs\\n  @{\\n/\\n/\"]\npub type nvmlVgpuTypeId_t = ::core::ffi::c_uint;\npub type nvmlVgpuInstance_t = ::core::ffi::c_uint;\n/// Structure to store the vGPU heterogeneous mode of device -- version 1\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuHeterogeneousMode_v1_t {\n    ///!< The version number of this struct\n    pub version: ::core::ffi::c_uint,\n    ///!< The vGPU heterogeneous mode\n    pub mode: ::core::ffi::c_uint,\n}\n/// Structure to store the vGPU heterogeneous mode of device -- version 1\npub type nvmlVgpuHeterogeneousMode_t = nvmlVgpuHeterogeneousMode_v1_t;\n/// Structure to store the placement ID of vGPU instance -- version 1\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuPlacementId_v1_t {\n    ///!< The version number of this struct\n    pub version: ::core::ffi::c_uint,\n    ///!< Placement ID of the active vGPU instance\n    pub placementId: ::core::ffi::c_uint,\n}\n/// Structure to store the placement ID of vGPU instance -- version 1\npub type nvmlVgpuPlacementId_t = nvmlVgpuPlacementId_v1_t;\n/// Structure to store the list of vGPU placements -- version 1\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuPlacementList_v1_t {\n    ///!< The version number of this struct\n    pub version: ::core::ffi::c_uint,\n    ///!< The number of slots occupied by the vGPU type\n    pub placementSize: ::core::ffi::c_uint,\n    ///!< Count of placement IDs fetched\n    pub count: ::core::ffi::c_uint,\n    ///!< Placement IDs for the vGPU type\n    pub placementIds: *mut ::core::ffi::c_uint,\n}\n/// Structure to store the list of vGPU placements -- version 2\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuPlacementList_v2_t {\n    ///!< IN: The version number of this struct\n    pub version: ::core::ffi::c_uint,\n    ///!< OUT: The number of slots occupied by the vGPU type\n    pub placementSize: ::core::ffi::c_uint,\n    ///!< IN/OUT: Count of the placement IDs\n    pub count: ::core::ffi::c_uint,\n    ///!< IN/OUT: Placement IDs for the vGPU type\n    pub placementIds: *mut ::core::ffi::c_uint,\n    ///!< IN: The vGPU mode. Either NVML_VGPU_PGPU_HETEROGENEOUS_MODE or NVML_VGPU_PGPU_HOMOGENEOUS_MODE\n    pub mode: ::core::ffi::c_uint,\n}\n/// Structure to store the list of vGPU placements -- version 2\npub type nvmlVgpuPlacementList_t = nvmlVgpuPlacementList_v2_t;\n/// Structure to store BAR1 size information of vGPU type -- Version 1\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuTypeBar1Info_v1_t {\n    ///!< The version number of this struct\n    pub version: ::core::ffi::c_uint,\n    ///!< BAR1 size in megabytes\n    pub bar1Size: ::core::ffi::c_ulonglong,\n}\n/// Structure to store BAR1 size information of vGPU type -- Version 1\npub type nvmlVgpuTypeBar1Info_t = nvmlVgpuTypeBar1Info_v1_t;\n/// Structure to store Utilization Value and vgpuInstance\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct nvmlVgpuInstanceUtilizationSample_st {\n    ///!< vGPU Instance\n    pub vgpuInstance: nvmlVgpuInstance_t,\n    ///!< CPU Timestamp in microseconds\n    pub timeStamp: ::core::ffi::c_ulonglong,\n    ///!< SM (3D/Compute) Util Value\n    pub smUtil: nvmlValue_t,\n    ///!< Frame Buffer Memory Util Value\n    pub memUtil: nvmlValue_t,\n    ///!< Encoder Util Value\n    pub encUtil: nvmlValue_t,\n    ///!< Decoder Util Value\n    pub decUtil: nvmlValue_t,\n}\n/// Structure to store Utilization Value and vgpuInstance\npub type nvmlVgpuInstanceUtilizationSample_t = nvmlVgpuInstanceUtilizationSample_st;\n/// Structure to store Utilization Value and vgpuInstance Info -- Version 1\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct nvmlVgpuInstanceUtilizationInfo_v1_t {\n    ///!< CPU Timestamp in microseconds\n    pub timeStamp: ::core::ffi::c_ulonglong,\n    ///!< vGPU Instance\n    pub vgpuInstance: nvmlVgpuInstance_t,\n    ///!< SM (3D/Compute) Util Value\n    pub smUtil: nvmlValue_t,\n    ///!< Frame Buffer Memory Util Value\n    pub memUtil: nvmlValue_t,\n    ///!< Encoder Util Value\n    pub encUtil: nvmlValue_t,\n    ///!< Decoder Util Value\n    pub decUtil: nvmlValue_t,\n    ///!< Jpeg Util Value\n    pub jpgUtil: nvmlValue_t,\n    ///!< Ofa Util Value\n    pub ofaUtil: nvmlValue_t,\n}\n/// Structure to store recent utilization for vGPU instances running on a device -- version 1\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuInstancesUtilizationInfo_v1_t {\n    ///!< The version number of this struct\n    pub version: ::core::ffi::c_uint,\n    ///!< Hold the type of returned sample values\n    pub sampleValType: nvmlValueType_t,\n    ///!< Hold the number of vGPU instances\n    pub vgpuInstanceCount: ::core::ffi::c_uint,\n    ///!< Return only samples with timestamp greater than lastSeenTimeStamp\n    pub lastSeenTimeStamp: ::core::ffi::c_ulonglong,\n    ///!< The array (allocated by caller) in which vGPU utilization are returned\n    pub vgpuUtilArray: *mut nvmlVgpuInstanceUtilizationInfo_v1_t,\n}\n/// Structure to store recent utilization for vGPU instances running on a device -- version 1\npub type nvmlVgpuInstancesUtilizationInfo_t = nvmlVgpuInstancesUtilizationInfo_v1_t;\n/// Structure to store Utilization Value, vgpuInstance and subprocess information\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuProcessUtilizationSample_st {\n    ///!< vGPU Instance\n    pub vgpuInstance: nvmlVgpuInstance_t,\n    ///!< PID of process running within the vGPU VM\n    pub pid: ::core::ffi::c_uint,\n    ///!< Name of process running within the vGPU VM\n    pub processName: [::core::ffi::c_char; 64usize],\n    ///!< CPU Timestamp in microseconds\n    pub timeStamp: ::core::ffi::c_ulonglong,\n    ///!< SM (3D/Compute) Util Value\n    pub smUtil: ::core::ffi::c_uint,\n    ///!< Frame Buffer Memory Util Value\n    pub memUtil: ::core::ffi::c_uint,\n    ///!< Encoder Util Value\n    pub encUtil: ::core::ffi::c_uint,\n    ///!< Decoder Util Value\n    pub decUtil: ::core::ffi::c_uint,\n}\n/// Structure to store Utilization Value, vgpuInstance and subprocess information\npub type nvmlVgpuProcessUtilizationSample_t = nvmlVgpuProcessUtilizationSample_st;\n/// Structure to store Utilization Value, vgpuInstance and subprocess information for process running on vGPU instance -- version 1\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuProcessUtilizationInfo_v1_t {\n    ///!< Name of process running within the vGPU VM\n    pub processName: [::core::ffi::c_char; 64usize],\n    ///!< CPU Timestamp in microseconds\n    pub timeStamp: ::core::ffi::c_ulonglong,\n    ///!< vGPU Instance\n    pub vgpuInstance: nvmlVgpuInstance_t,\n    ///!< PID of process running within the vGPU VM\n    pub pid: ::core::ffi::c_uint,\n    ///!< SM (3D/Compute) Util Value\n    pub smUtil: ::core::ffi::c_uint,\n    ///!< Frame Buffer Memory Util Value\n    pub memUtil: ::core::ffi::c_uint,\n    ///!< Encoder Util Value\n    pub encUtil: ::core::ffi::c_uint,\n    ///!< Decoder Util Value\n    pub decUtil: ::core::ffi::c_uint,\n    ///!< Jpeg Util Value\n    pub jpgUtil: ::core::ffi::c_uint,\n    ///!< Ofa Util Value\n    pub ofaUtil: ::core::ffi::c_uint,\n}\n/// Structure to store recent utilization, vgpuInstance and subprocess information for processes running on vGPU instances active on a device -- version 1\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuProcessesUtilizationInfo_v1_t {\n    ///!< The version number of this struct\n    pub version: ::core::ffi::c_uint,\n    ///!< Hold the number of processes running on vGPU instances\n    pub vgpuProcessCount: ::core::ffi::c_uint,\n    ///!< Return only samples with timestamp greater than lastSeenTimeStamp\n    pub lastSeenTimeStamp: ::core::ffi::c_ulonglong,\n    ///!< The array (allocated by caller) in which utilization of processes running on vGPU instances are returned\n    pub vgpuProcUtilArray: *mut nvmlVgpuProcessUtilizationInfo_v1_t,\n}\n/// Structure to store recent utilization, vgpuInstance and subprocess information for processes running on vGPU instances active on a device -- version 1\npub type nvmlVgpuProcessesUtilizationInfo_t = nvmlVgpuProcessesUtilizationInfo_v1_t;\n/// Structure to store the information of vGPU runtime state -- version 1\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuRuntimeState_v1_t {\n    ///!< IN:  The version number of this struct\n    pub version: ::core::ffi::c_uint,\n    ///!< OUT: The runtime state size of the vGPU instance\n    pub size: ::core::ffi::c_ulonglong,\n}\n/// Structure to store the information of vGPU runtime state -- version 1\npub type nvmlVgpuRuntimeState_t = nvmlVgpuRuntimeState_v1_t;\n/// Union to represent the vGPU Scheduler Parameters\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union nvmlVgpuSchedulerParams_t {\n    pub vgpuSchedDataWithARR: nvmlVgpuSchedulerParams_t__bindgen_ty_1,\n    pub vgpuSchedData: nvmlVgpuSchedulerParams_t__bindgen_ty_2,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuSchedulerParams_t__bindgen_ty_1 {\n    ///!< Average factor in compensating the timeslice for Adaptive Round Robin mode\n    pub avgFactor: ::core::ffi::c_uint,\n    ///!< The timeslice in ns for each software run list as configured, or the default value otherwise\n    pub timeslice: ::core::ffi::c_uint,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuSchedulerParams_t__bindgen_ty_2 {\n    ///!< The timeslice in ns for each software run list as configured, or the default value otherwise\n    pub timeslice: ::core::ffi::c_uint,\n}\n/// Structure to store the state and logs of a software runlist\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuSchedulerLogEntries_st {\n    ///!< Timestamp in ns when this software runlist was preeempted\n    pub timestamp: ::core::ffi::c_ulonglong,\n    ///!< Total time in ns this software runlist has run\n    pub timeRunTotal: ::core::ffi::c_ulonglong,\n    ///!< Time in ns this software runlist ran before preemption\n    pub timeRun: ::core::ffi::c_ulonglong,\n    ///!< Software runlist Id\n    pub swRunlistId: ::core::ffi::c_uint,\n    ///!< The actual timeslice after deduction\n    pub targetTimeSlice: ::core::ffi::c_ulonglong,\n    ///!< Preemption time in ns for this SW runlist\n    pub cumulativePreemptionTime: ::core::ffi::c_ulonglong,\n}\n/// Structure to store the state and logs of a software runlist\npub type nvmlVgpuSchedulerLogEntry_t = nvmlVgpuSchedulerLogEntries_st;\n/// Structure to store a vGPU software scheduler log\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct nvmlVgpuSchedulerLog_st {\n    ///!< Engine whose software runlist log entries are fetched\n    pub engineId: ::core::ffi::c_uint,\n    ///!< Scheduler policy\n    pub schedulerPolicy: ::core::ffi::c_uint,\n    ///!< Adaptive Round Robin scheduler mode. One of the NVML_VGPU_SCHEDULER_ARR_*.\n    pub arrMode: ::core::ffi::c_uint,\n    pub schedulerParams: nvmlVgpuSchedulerParams_t,\n    ///!< Count of log entries fetched\n    pub entriesCount: ::core::ffi::c_uint,\n    pub logEntries: [nvmlVgpuSchedulerLogEntry_t; 200usize],\n}\n/// Structure to store a vGPU software scheduler log\npub type nvmlVgpuSchedulerLog_t = nvmlVgpuSchedulerLog_st;\n/// Structure to store the vGPU scheduler state\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct nvmlVgpuSchedulerGetState_st {\n    ///!< Scheduler policy\n    pub schedulerPolicy: ::core::ffi::c_uint,\n    ///!< Adaptive Round Robin scheduler mode. One of the NVML_VGPU_SCHEDULER_ARR_*.\n    pub arrMode: ::core::ffi::c_uint,\n    pub schedulerParams: nvmlVgpuSchedulerParams_t,\n}\n/// Structure to store the vGPU scheduler state\npub type nvmlVgpuSchedulerGetState_t = nvmlVgpuSchedulerGetState_st;\n/// Union to represent the vGPU Scheduler set Parameters\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union nvmlVgpuSchedulerSetParams_t {\n    pub vgpuSchedDataWithARR: nvmlVgpuSchedulerSetParams_t__bindgen_ty_1,\n    pub vgpuSchedData: nvmlVgpuSchedulerSetParams_t__bindgen_ty_2,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuSchedulerSetParams_t__bindgen_ty_1 {\n    ///!< Average factor in compensating the timeslice for Adaptive Round Robin mode\n    pub avgFactor: ::core::ffi::c_uint,\n    ///!< Frequency for Adaptive Round Robin mode\n    pub frequency: ::core::ffi::c_uint,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuSchedulerSetParams_t__bindgen_ty_2 {\n    ///!< The timeslice in ns(Nanoseconds) for each software run list as configured, or the default value otherwise\n    pub timeslice: ::core::ffi::c_uint,\n}\n/// Structure to set the vGPU scheduler state\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct nvmlVgpuSchedulerSetState_st {\n    ///!< Scheduler policy\n    pub schedulerPolicy: ::core::ffi::c_uint,\n    ///!< Adaptive Round Robin scheduler\n    pub enableARRMode: ::core::ffi::c_uint,\n    pub schedulerParams: nvmlVgpuSchedulerSetParams_t,\n}\n/// Structure to set the vGPU scheduler state\npub type nvmlVgpuSchedulerSetState_t = nvmlVgpuSchedulerSetState_st;\n/// Structure to store the vGPU scheduler capabilities\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuSchedulerCapabilities_st {\n    ///!< List the supported vGPU schedulers on the device\n    pub supportedSchedulers: [::core::ffi::c_uint; 3usize],\n    ///!< Maximum timeslice value in ns\n    pub maxTimeslice: ::core::ffi::c_uint,\n    ///!< Minimum timeslice value in ns\n    pub minTimeslice: ::core::ffi::c_uint,\n    ///!< Flag to check Adaptive Round Robin mode enabled/disabled.\n    pub isArrModeSupported: ::core::ffi::c_uint,\n    ///!< Maximum frequency for Adaptive Round Robin mode\n    pub maxFrequencyForARR: ::core::ffi::c_uint,\n    ///!< Minimum frequency for Adaptive Round Robin mode\n    pub minFrequencyForARR: ::core::ffi::c_uint,\n    ///!< Maximum averaging factor for Adaptive Round Robin mode\n    pub maxAvgFactorForARR: ::core::ffi::c_uint,\n    ///!< Minimum averaging factor for Adaptive Round Robin mode\n    pub minAvgFactorForARR: ::core::ffi::c_uint,\n}\n/// Structure to store the vGPU scheduler capabilities\npub type nvmlVgpuSchedulerCapabilities_t = nvmlVgpuSchedulerCapabilities_st;\n/// Structure to store the vGPU license expiry details\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuLicenseExpiry_st {\n    ///!< Year of license expiry\n    pub year: ::core::ffi::c_uint,\n    ///!< Month of license expiry\n    pub month: ::core::ffi::c_ushort,\n    ///!< Day of license expiry\n    pub day: ::core::ffi::c_ushort,\n    ///!< Hour of license expiry\n    pub hour: ::core::ffi::c_ushort,\n    ///!< Minutes of license expiry\n    pub min: ::core::ffi::c_ushort,\n    ///!< Seconds of license expiry\n    pub sec: ::core::ffi::c_ushort,\n    ///!< License expiry status\n    pub status: ::core::ffi::c_uchar,\n}\n/// Structure to store the vGPU license expiry details\npub type nvmlVgpuLicenseExpiry_t = nvmlVgpuLicenseExpiry_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuLicenseInfo_st {\n    ///!< License status\n    pub isLicensed: ::core::ffi::c_uchar,\n    ///!< License expiry information\n    pub licenseExpiry: nvmlVgpuLicenseExpiry_t,\n    ///!< Current license state\n    pub currentState: ::core::ffi::c_uint,\n}\npub type nvmlVgpuLicenseInfo_t = nvmlVgpuLicenseInfo_st;\n/// Structure to store license expiry date and time values\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlGridLicenseExpiry_st {\n    ///!< Year value of license expiry\n    pub year: ::core::ffi::c_uint,\n    ///!< Month value of license expiry\n    pub month: ::core::ffi::c_ushort,\n    ///!< Day value of license expiry\n    pub day: ::core::ffi::c_ushort,\n    ///!< Hour value of license expiry\n    pub hour: ::core::ffi::c_ushort,\n    ///!< Minutes value of license expiry\n    pub min: ::core::ffi::c_ushort,\n    ///!< Seconds value of license expiry\n    pub sec: ::core::ffi::c_ushort,\n    ///!< License expiry status\n    pub status: ::core::ffi::c_uchar,\n}\n/// Structure to store license expiry date and time values\npub type nvmlGridLicenseExpiry_t = nvmlGridLicenseExpiry_st;\n/// Structure containing vGPU software licensable feature information\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlGridLicensableFeature_st {\n    ///!< Licensed feature code\n    pub featureCode: nvmlGridLicenseFeatureCode_t,\n    ///!< Non-zero if feature is currently licensed, otherwise zero\n    pub featureState: ::core::ffi::c_uint,\n    ///!< Deprecated.\n    pub licenseInfo: [::core::ffi::c_char; 128usize],\n    ///!< Product name of feature\n    pub productName: [::core::ffi::c_char; 128usize],\n    ///!< Non-zero if feature is enabled, otherwise zero\n    pub featureEnabled: ::core::ffi::c_uint,\n    ///!< License expiry structure containing date and time\n    pub licenseExpiry: nvmlGridLicenseExpiry_t,\n}\n/// Structure containing vGPU software licensable feature information\npub type nvmlGridLicensableFeature_t = nvmlGridLicensableFeature_st;\n/// Structure to store vGPU software licensable features\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlGridLicensableFeatures_st {\n    ///!< Non-zero if vGPU Software Licensing is supported on the system, otherwise zero\n    pub isGridLicenseSupported: ::core::ffi::c_int,\n    ///!< Entries returned in \\a gridLicensableFeatures array\n    pub licensableFeaturesCount: ::core::ffi::c_uint,\n    ///!< Array of vGPU software licensable features.\n    pub gridLicensableFeatures: [nvmlGridLicensableFeature_t; 3usize],\n}\n/// Structure to store vGPU software licensable features\npub type nvmlGridLicensableFeatures_t = nvmlGridLicensableFeatures_st;\nimpl nvmlDeviceGpuRecoveryAction_s {\n    pub const NVML_GPU_RECOVERY_ACTION_NONE: nvmlDeviceGpuRecoveryAction_s = nvmlDeviceGpuRecoveryAction_s(\n        0,\n    );\n}\nimpl nvmlDeviceGpuRecoveryAction_s {\n    pub const NVML_GPU_RECOVERY_ACTION_GPU_RESET: nvmlDeviceGpuRecoveryAction_s = nvmlDeviceGpuRecoveryAction_s(\n        1,\n    );\n}\nimpl nvmlDeviceGpuRecoveryAction_s {\n    pub const NVML_GPU_RECOVERY_ACTION_NODE_REBOOT: nvmlDeviceGpuRecoveryAction_s = nvmlDeviceGpuRecoveryAction_s(\n        2,\n    );\n}\nimpl nvmlDeviceGpuRecoveryAction_s {\n    pub const NVML_GPU_RECOVERY_ACTION_DRAIN_P2P: nvmlDeviceGpuRecoveryAction_s = nvmlDeviceGpuRecoveryAction_s(\n        3,\n    );\n}\nimpl nvmlDeviceGpuRecoveryAction_s {\n    pub const NVML_GPU_RECOVERY_ACTION_DRAIN_AND_RESET: nvmlDeviceGpuRecoveryAction_s = nvmlDeviceGpuRecoveryAction_s(\n        4,\n    );\n}\n#[repr(transparent)]\n/// Enum describing the GPU Recovery Action\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlDeviceGpuRecoveryAction_s(pub ::core::ffi::c_uint);\n/// Enum describing the GPU Recovery Action\npub use self::nvmlDeviceGpuRecoveryAction_s as nvmlDeviceGpuRecoveryAction_t;\n/// Structure to store the vGPU type IDs -- version 1\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuTypeIdInfo_v1_t {\n    ///!< IN: The version number of this struct\n    pub version: ::core::ffi::c_uint,\n    ///!< IN/OUT: Number of vGPU types\n    pub vgpuCount: ::core::ffi::c_uint,\n    ///!< OUT: List of vGPU type IDs\n    pub vgpuTypeIds: *mut nvmlVgpuTypeId_t,\n}\n/// Structure to store the vGPU type IDs -- version 1\npub type nvmlVgpuTypeIdInfo_t = nvmlVgpuTypeIdInfo_v1_t;\n/// Structure to store the maximum number of possible vGPU type IDs -- version 1\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuTypeMaxInstance_v1_t {\n    ///!< IN: The version number of this struct\n    pub version: ::core::ffi::c_uint,\n    ///!< IN: Handle to vGPU type\n    pub vgpuTypeId: nvmlVgpuTypeId_t,\n    ///!< OUT: Maximum number of vGPU instances per GPU instance\n    pub maxInstancePerGI: ::core::ffi::c_uint,\n}\n/// Structure to store the maximum number of possible vGPU type IDs -- version 1\npub type nvmlVgpuTypeMaxInstance_t = nvmlVgpuTypeMaxInstance_v1_t;\n/// Structure to store active vGPU instance information -- Version 1\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlActiveVgpuInstanceInfo_v1_t {\n    ///!< IN: The version number of this struct\n    pub version: ::core::ffi::c_uint,\n    ///!< IN/OUT: Count of the active vGPU instances\n    pub vgpuCount: ::core::ffi::c_uint,\n    ///!< IN/OUT: list of active vGPU instances\n    pub vgpuInstances: *mut nvmlVgpuInstance_t,\n}\n/// Structure to store active vGPU instance information -- Version 1\npub type nvmlActiveVgpuInstanceInfo_t = nvmlActiveVgpuInstanceInfo_v1_t;\n/// Structure to set vGPU scheduler state information -- version 1\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct nvmlVgpuSchedulerState_v1_t {\n    ///!< IN: The version number of this struct\n    pub version: ::core::ffi::c_uint,\n    ///!< IN: One of NVML_VGPU_SCHEDULER_ENGINE_TYPE_*.\n    pub engineId: ::core::ffi::c_uint,\n    ///!< IN: Scheduler policy\n    pub schedulerPolicy: ::core::ffi::c_uint,\n    ///!< IN: Adaptive Round Robin scheduler\n    pub enableARRMode: ::core::ffi::c_uint,\n    ///!< IN: vGPU Scheduler Parameters\n    pub schedulerParams: nvmlVgpuSchedulerSetParams_t,\n}\n/// Structure to set vGPU scheduler state information -- version 1\npub type nvmlVgpuSchedulerState_t = nvmlVgpuSchedulerState_v1_t;\n/// Structure to store vGPU scheduler state information -- Version 1\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct nvmlVgpuSchedulerStateInfo_v1_t {\n    ///!< IN:  The version number of this struct\n    pub version: ::core::ffi::c_uint,\n    ///!< IN:  Engine whose software scheduler state info is fetched. One of NVML_VGPU_SCHEDULER_ENGINE_TYPE_*.\n    pub engineId: ::core::ffi::c_uint,\n    ///!< OUT: Scheduler policy\n    pub schedulerPolicy: ::core::ffi::c_uint,\n    ///!< OUT: Adaptive Round Robin scheduler mode. One of the NVML_VGPU_SCHEDULER_ARR_*.\n    pub arrMode: ::core::ffi::c_uint,\n    ///!< OUT: vGPU Scheduler Parameters\n    pub schedulerParams: nvmlVgpuSchedulerParams_t,\n}\n/// Structure to store vGPU scheduler state information -- Version 1\npub type nvmlVgpuSchedulerStateInfo_t = nvmlVgpuSchedulerStateInfo_v1_t;\n/// Structure to store vGPU scheduler log information -- Version 1\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct nvmlVgpuSchedulerLogInfo_v1_t {\n    ///!< IN: The version number of this struct\n    pub version: ::core::ffi::c_uint,\n    ///!< IN: Engine whose software runlist log entries are fetched. One of One of NVML_VGPU_SCHEDULER_ENGINE_TYPE_*.\n    pub engineId: ::core::ffi::c_uint,\n    ///!< OUT: Scheduler policy\n    pub schedulerPolicy: ::core::ffi::c_uint,\n    ///!< OUT: Adaptive Round Robin scheduler mode. One of the NVML_VGPU_SCHEDULER_ARR_*.\n    pub arrMode: ::core::ffi::c_uint,\n    ///!< OUT: vGPU Scheduler Parameters\n    pub schedulerParams: nvmlVgpuSchedulerParams_t,\n    ///!< OUT: Count of log entries fetched\n    pub entriesCount: ::core::ffi::c_uint,\n    ///!< OUT: Structure to store the state and logs of a software runlist\n    pub logEntries: [nvmlVgpuSchedulerLogEntry_t; 200usize],\n}\n/// Structure to store vGPU scheduler log information -- Version 1\npub type nvmlVgpuSchedulerLogInfo_t = nvmlVgpuSchedulerLogInfo_v1_t;\n/// Structure to store creatable vGPU placement information -- version 1\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuCreatablePlacementInfo_v1_t {\n    ///!< IN: The version number of this struct\n    pub version: ::core::ffi::c_uint,\n    ///!< IN: Handle to vGPU type\n    pub vgpuTypeId: nvmlVgpuTypeId_t,\n    ///!< IN/OUT: Count of the placement IDs\n    pub count: ::core::ffi::c_uint,\n    ///!< IN/OUT: Placement IDs for the vGPU type\n    pub placementIds: *mut ::core::ffi::c_uint,\n    ///!< OUT: The number of slots occupied by the vGPU type\n    pub placementSize: ::core::ffi::c_uint,\n}\n/// Structure to store creatable vGPU placement information -- version 1\npub type nvmlVgpuCreatablePlacementInfo_t = nvmlVgpuCreatablePlacementInfo_v1_t;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlNvLinkPowerThres_st {\n    ///!< Low power threshold\n    pub lowPwrThreshold: ::core::ffi::c_uint,\n}\npub type nvmlNvLinkPowerThres_t = nvmlNvLinkPowerThres_st;\n/// Information for a Field Value Sample\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct nvmlFieldValue_st {\n    ///!< ID of the NVML field to retrieve. This must be set before any call that uses this struct. See the constants starting with NVML_FI_ above.\n    pub fieldId: ::core::ffi::c_uint,\n    ///!< Scope ID can represent data used by NVML depending on fieldId's context. For example, for NVLink throughput counter data, scopeId can represent linkId.\n    pub scopeId: ::core::ffi::c_uint,\n    ///!< CPU Timestamp of this value in microseconds since 1970\n    pub timestamp: ::core::ffi::c_longlong,\n    ///!< How long this field value took to update (in usec) within NVML. This may be averaged across several fields that are serviced by the same driver call.\n    pub latencyUsec: ::core::ffi::c_longlong,\n    ///!< Type of the value stored in value\n    pub valueType: nvmlValueType_t,\n    ///!< Return code for retrieving this value. This must be checked before looking at value, as value is undefined if nvmlReturn != NVML_SUCCESS\n    pub nvmlReturn: nvmlReturn_t,\n    ///!< Value for this field. This is only valid if nvmlReturn == NVML_SUCCESS\n    pub value: nvmlValue_t,\n}\n/// Information for a Field Value Sample\npub type nvmlFieldValue_t = nvmlFieldValue_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct nvmlUnit_st {\n    _unused: [u8; 0],\n}\n#[doc = \"/\\n/** @defgroup nvmlUnitStructs Unit Structs\\n  @{\\n/\\n/\"]\npub type nvmlUnit_t = *mut nvmlUnit_st;\n/// Description of HWBC entry\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlHwbcEntry_st {\n    pub hwbcId: ::core::ffi::c_uint,\n    pub firmwareVersion: [::core::ffi::c_char; 32usize],\n}\n/// Description of HWBC entry\npub type nvmlHwbcEntry_t = nvmlHwbcEntry_st;\nimpl nvmlFanState_enum {\n    ///!< Fan is working properly\n    pub const NVML_FAN_NORMAL: nvmlFanState_enum = nvmlFanState_enum(0);\n}\nimpl nvmlFanState_enum {\n    ///!< Fan has failed\n    pub const NVML_FAN_FAILED: nvmlFanState_enum = nvmlFanState_enum(1);\n}\n#[repr(transparent)]\n/// Fan state enum.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlFanState_enum(pub ::core::ffi::c_uint);\n/// Fan state enum.\npub use self::nvmlFanState_enum as nvmlFanState_t;\nimpl nvmlLedColor_enum {\n    ///!< GREEN, indicates good health\n    pub const NVML_LED_COLOR_GREEN: nvmlLedColor_enum = nvmlLedColor_enum(0);\n}\nimpl nvmlLedColor_enum {\n    ///!< AMBER, indicates problem\n    pub const NVML_LED_COLOR_AMBER: nvmlLedColor_enum = nvmlLedColor_enum(1);\n}\n#[repr(transparent)]\n/// Led color enum.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlLedColor_enum(pub ::core::ffi::c_uint);\n/// Led color enum.\npub use self::nvmlLedColor_enum as nvmlLedColor_t;\n/// LED states for an S-class unit.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlLedState_st {\n    ///!< If amber, a text description of the cause\n    pub cause: [::core::ffi::c_char; 256usize],\n    ///!< GREEN or AMBER\n    pub color: nvmlLedColor_t,\n}\n/// LED states for an S-class unit.\npub type nvmlLedState_t = nvmlLedState_st;\n/// Static S-class unit info.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlUnitInfo_st {\n    ///!< Product name\n    pub name: [::core::ffi::c_char; 96usize],\n    ///!< Product identifier\n    pub id: [::core::ffi::c_char; 96usize],\n    ///!< Product serial number\n    pub serial: [::core::ffi::c_char; 96usize],\n    ///!< Firmware version\n    pub firmwareVersion: [::core::ffi::c_char; 96usize],\n}\n/// Static S-class unit info.\npub type nvmlUnitInfo_t = nvmlUnitInfo_st;\n/** Power usage information for an S-class unit.\n The power supply state is a human readable string that equals \"Normal\" or contains\n a combination of \"Abnormal\" plus one or more of the following:\n\n    - High voltage\n    - Fan failure\n    - Heatsink temperature\n    - Current limit\n    - Voltage below UV alarm threshold\n    - Low-voltage\n    - SI2C remote off command\n    - MOD_DISABLE input\n    - Short pin transition*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlPSUInfo_st {\n    ///!< The power supply state\n    pub state: [::core::ffi::c_char; 256usize],\n    ///!< PSU current (A)\n    pub current: ::core::ffi::c_uint,\n    ///!< PSU voltage (V)\n    pub voltage: ::core::ffi::c_uint,\n    ///!< PSU power draw (W)\n    pub power: ::core::ffi::c_uint,\n}\n/** Power usage information for an S-class unit.\n The power supply state is a human readable string that equals \"Normal\" or contains\n a combination of \"Abnormal\" plus one or more of the following:\n\n    - High voltage\n    - Fan failure\n    - Heatsink temperature\n    - Current limit\n    - Voltage below UV alarm threshold\n    - Low-voltage\n    - SI2C remote off command\n    - MOD_DISABLE input\n    - Short pin transition*/\npub type nvmlPSUInfo_t = nvmlPSUInfo_st;\n/// Fan speed reading for a single fan in an S-class unit.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlUnitFanInfo_st {\n    ///!< Fan speed (RPM)\n    pub speed: ::core::ffi::c_uint,\n    ///!< Flag that indicates whether fan is working properly\n    pub state: nvmlFanState_t,\n}\n/// Fan speed reading for a single fan in an S-class unit.\npub type nvmlUnitFanInfo_t = nvmlUnitFanInfo_st;\n/// Fan speed readings for an entire S-class unit.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlUnitFanSpeeds_st {\n    ///!< Fan speed data for each fan\n    pub fans: [nvmlUnitFanInfo_t; 24usize],\n    ///!< Number of fans in unit\n    pub count: ::core::ffi::c_uint,\n}\n/// Fan speed readings for an entire S-class unit.\npub type nvmlUnitFanSpeeds_t = nvmlUnitFanSpeeds_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct nvmlEventSet_st {\n    _unused: [u8; 0],\n}\n/// Handle to an event set\npub type nvmlEventSet_t = *mut nvmlEventSet_st;\n/// Information about occurred event\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlEventData_st {\n    ///!< Specific device where the event occurred\n    pub device: nvmlDevice_t,\n    ///!< Information about what specific event occurred\n    pub eventType: ::core::ffi::c_ulonglong,\n    ///!< Stores Xid error for the device in the event of nvmlEventTypeXidCriticalError,\n    pub eventData: ::core::ffi::c_ulonglong,\n    ///!< If MIG is enabled and nvmlEventTypeXidCriticalError event is attributable to a GPU\n    pub gpuInstanceId: ::core::ffi::c_uint,\n    ///!< If MIG is enabled and nvmlEventTypeXidCriticalError event is attributable to a\n    pub computeInstanceId: ::core::ffi::c_uint,\n}\n/// Information about occurred event\npub type nvmlEventData_t = nvmlEventData_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct nvmlSystemEventSet_st {\n    _unused: [u8; 0],\n}\n/// System Event Set\npub type nvmlSystemEventSet_t = *mut nvmlSystemEventSet_st;\n/// nvmlSystemEventSetCreateRequest\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlSystemEventSetCreateRequest_v1_t {\n    ///!< the API version number\n    pub version: ::core::ffi::c_uint,\n    ///!< system event set\n    pub set: nvmlSystemEventSet_t,\n}\n/// nvmlSystemEventSetCreateRequest\npub type nvmlSystemEventSetCreateRequest_t = nvmlSystemEventSetCreateRequest_v1_t;\n/// nvmlSystemEventSetFreeRequest\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlSystemEventSetFreeRequest_v1_t {\n    ///!< the API version number\n    pub version: ::core::ffi::c_uint,\n    ///!< system event set\n    pub set: nvmlSystemEventSet_t,\n}\n/// nvmlSystemEventSetFreeRequest\npub type nvmlSystemEventSetFreeRequest_t = nvmlSystemEventSetFreeRequest_v1_t;\n/// nvmlSystemRegisterEventRequest\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlSystemRegisterEventRequest_v1_t {\n    ///!< the API version number\n    pub version: ::core::ffi::c_uint,\n    /**!< Bitmask of \\ref nvmlEventType to record\n!< For example eventTypes = (nvmlEventTypeBind | nvmlEventTypeUnbind)\n!< to listen to both Bind and Unbind events.*/\n    pub eventTypes: ::core::ffi::c_ulonglong,\n    ///!< Set to which add new event types\n    pub set: nvmlSystemEventSet_t,\n}\n/// nvmlSystemRegisterEventRequest\npub type nvmlSystemRegisterEventRequest_t = nvmlSystemRegisterEventRequest_v1_t;\n/// nvmlSystemEventData_v1_t\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlSystemEventData_v1_t {\n    ///!< Information about what specific system event occurred\n    pub eventType: ::core::ffi::c_ulonglong,\n    ///!< gpuId in PCI format\n    pub gpuId: ::core::ffi::c_uint,\n}\n/// nvmlSystemEventSetWait\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlSystemEventSetWaitRequest_v1_t {\n    ///!< input/output: the API version number\n    pub version: ::core::ffi::c_uint,\n    /**!< input: time to sleep waiting for event.\n!< If timeoutms is zero, skip waiting for event.*/\n    pub timeoutms: ::core::ffi::c_uint,\n    ///!< input: system event set\n    pub set: nvmlSystemEventSet_t,\n    ///!< input/output: array of event data, owned by caller\n    pub data: *mut nvmlSystemEventData_v1_t,\n    ///!< input: the size of data array\n    pub dataSize: ::core::ffi::c_uint,\n    ///!< output: number of event collected.\n    pub numEvent: ::core::ffi::c_uint,\n}\n/// nvmlSystemEventSetWait\npub type nvmlSystemEventSetWaitRequest_t = nvmlSystemEventSetWaitRequest_v1_t;\n/// Describes accounting statistics of a process.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlAccountingStats_st {\n    ///!< Percent of time over the process's lifetime during which one or more kernels was executing on the GPU.\n    pub gpuUtilization: ::core::ffi::c_uint,\n    ///!< Percent of time over the process's lifetime during which global (device) memory was being read or written.\n    pub memoryUtilization: ::core::ffi::c_uint,\n    ///!< Maximum total memory in bytes that was ever allocated by the process.\n    pub maxMemoryUsage: ::core::ffi::c_ulonglong,\n    /**!< Amount of time in ms during which the compute context was active. The time is reported as 0 if\n!< the process is not terminated*/\n    pub time: ::core::ffi::c_ulonglong,\n    ///!< CPU Timestamp in usec representing start time for the process\n    pub startTime: ::core::ffi::c_ulonglong,\n    ///!< Flag to represent if the process is running (1 for running, 0 for terminated)\n    pub isRunning: ::core::ffi::c_uint,\n    ///!< Reserved for future use\n    pub reserved: [::core::ffi::c_uint; 5usize],\n}\n/// Describes accounting statistics of a process.\npub type nvmlAccountingStats_t = nvmlAccountingStats_st;\nimpl nvmlEncoderQueryType_enum {\n    ///!< H264 encoder\n    pub const NVML_ENCODER_QUERY_H264: nvmlEncoderQueryType_enum = nvmlEncoderQueryType_enum(\n        0,\n    );\n}\nimpl nvmlEncoderQueryType_enum {\n    ///!< HEVC encoder\n    pub const NVML_ENCODER_QUERY_HEVC: nvmlEncoderQueryType_enum = nvmlEncoderQueryType_enum(\n        1,\n    );\n}\nimpl nvmlEncoderQueryType_enum {\n    ///!< AV1 encoder\n    pub const NVML_ENCODER_QUERY_AV1: nvmlEncoderQueryType_enum = nvmlEncoderQueryType_enum(\n        2,\n    );\n}\nimpl nvmlEncoderQueryType_enum {\n    ///!< Unknown encoder\n    pub const NVML_ENCODER_QUERY_UNKNOWN: nvmlEncoderQueryType_enum = nvmlEncoderQueryType_enum(\n        255,\n    );\n}\n#[repr(transparent)]\n/// Represents type of encoder for capacity can be queried\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlEncoderQueryType_enum(pub ::core::ffi::c_uint);\n/// Represents type of encoder for capacity can be queried\npub use self::nvmlEncoderQueryType_enum as nvmlEncoderType_t;\n/// Structure to hold encoder session data\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlEncoderSessionInfo_st {\n    ///!< Unique session ID\n    pub sessionId: ::core::ffi::c_uint,\n    ///!< Owning process ID\n    pub pid: ::core::ffi::c_uint,\n    ///!< Owning vGPU instance ID (only valid on vGPU hosts, otherwise zero)\n    pub vgpuInstance: nvmlVgpuInstance_t,\n    ///!< Video encoder type\n    pub codecType: nvmlEncoderType_t,\n    ///!< Current encode horizontal resolution\n    pub hResolution: ::core::ffi::c_uint,\n    ///!< Current encode vertical resolution\n    pub vResolution: ::core::ffi::c_uint,\n    ///!< Moving average encode frames per second\n    pub averageFps: ::core::ffi::c_uint,\n    ///!< Moving average encode latency in microseconds\n    pub averageLatency: ::core::ffi::c_uint,\n}\n/// Structure to hold encoder session data\npub type nvmlEncoderSessionInfo_t = nvmlEncoderSessionInfo_st;\nimpl nvmlFBCSessionType_enum {\n    ///!< Unknown\n    pub const NVML_FBC_SESSION_TYPE_UNKNOWN: nvmlFBCSessionType_enum = nvmlFBCSessionType_enum(\n        0,\n    );\n}\nimpl nvmlFBCSessionType_enum {\n    ///!< ToSys\n    pub const NVML_FBC_SESSION_TYPE_TOSYS: nvmlFBCSessionType_enum = nvmlFBCSessionType_enum(\n        1,\n    );\n}\nimpl nvmlFBCSessionType_enum {\n    ///!< Cuda\n    pub const NVML_FBC_SESSION_TYPE_CUDA: nvmlFBCSessionType_enum = nvmlFBCSessionType_enum(\n        2,\n    );\n}\nimpl nvmlFBCSessionType_enum {\n    ///!< Vid\n    pub const NVML_FBC_SESSION_TYPE_VID: nvmlFBCSessionType_enum = nvmlFBCSessionType_enum(\n        3,\n    );\n}\nimpl nvmlFBCSessionType_enum {\n    ///!< HEnc\n    pub const NVML_FBC_SESSION_TYPE_HWENC: nvmlFBCSessionType_enum = nvmlFBCSessionType_enum(\n        4,\n    );\n}\n#[repr(transparent)]\n/// Represents frame buffer capture session type\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlFBCSessionType_enum(pub ::core::ffi::c_uint);\n/// Represents frame buffer capture session type\npub use self::nvmlFBCSessionType_enum as nvmlFBCSessionType_t;\n/// Structure to hold frame buffer capture sessions stats\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlFBCStats_st {\n    ///!< Total no of sessions\n    pub sessionsCount: ::core::ffi::c_uint,\n    ///!< Moving average new frames captured per second\n    pub averageFPS: ::core::ffi::c_uint,\n    ///!< Moving average new frame capture latency in microseconds\n    pub averageLatency: ::core::ffi::c_uint,\n}\n/// Structure to hold frame buffer capture sessions stats\npub type nvmlFBCStats_t = nvmlFBCStats_st;\n/// Structure to hold FBC session data\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlFBCSessionInfo_st {\n    ///!< Unique session ID\n    pub sessionId: ::core::ffi::c_uint,\n    ///!< Owning process ID\n    pub pid: ::core::ffi::c_uint,\n    ///!< Owning vGPU instance ID (only valid on vGPU hosts, otherwise zero)\n    pub vgpuInstance: nvmlVgpuInstance_t,\n    ///!< Display identifier\n    pub displayOrdinal: ::core::ffi::c_uint,\n    ///!< Type of frame buffer capture session\n    pub sessionType: nvmlFBCSessionType_t,\n    ///!< Session flags (one or more of NVML_NVFBC_SESSION_FLAG_XXX).\n    pub sessionFlags: ::core::ffi::c_uint,\n    ///!< Max horizontal resolution supported by the capture session\n    pub hMaxResolution: ::core::ffi::c_uint,\n    ///!< Max vertical resolution supported by the capture session\n    pub vMaxResolution: ::core::ffi::c_uint,\n    ///!< Horizontal resolution requested by caller in capture call\n    pub hResolution: ::core::ffi::c_uint,\n    ///!< Vertical resolution requested by caller in capture call\n    pub vResolution: ::core::ffi::c_uint,\n    ///!< Moving average new frames captured per second\n    pub averageFPS: ::core::ffi::c_uint,\n    ///!< Moving average new frame capture latency in microseconds\n    pub averageLatency: ::core::ffi::c_uint,\n}\n/// Structure to hold FBC session data\npub type nvmlFBCSessionInfo_t = nvmlFBCSessionInfo_st;\nimpl nvmlDetachGpuState_enum {\n    pub const NVML_DETACH_GPU_KEEP: nvmlDetachGpuState_enum = nvmlDetachGpuState_enum(0);\n}\nimpl nvmlDetachGpuState_enum {\n    pub const NVML_DETACH_GPU_REMOVE: nvmlDetachGpuState_enum = nvmlDetachGpuState_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n///  Is the GPU device to be removed from the kernel by nvmlDeviceRemoveGpu()\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlDetachGpuState_enum(pub ::core::ffi::c_uint);\n///  Is the GPU device to be removed from the kernel by nvmlDeviceRemoveGpu()\npub use self::nvmlDetachGpuState_enum as nvmlDetachGpuState_t;\nimpl nvmlPcieLinkState_enum {\n    pub const NVML_PCIE_LINK_KEEP: nvmlPcieLinkState_enum = nvmlPcieLinkState_enum(0);\n}\nimpl nvmlPcieLinkState_enum {\n    pub const NVML_PCIE_LINK_SHUT_DOWN: nvmlPcieLinkState_enum = nvmlPcieLinkState_enum(\n        1,\n    );\n}\n#[repr(transparent)]\n///  Parent bridge PCIe link state requested by nvmlDeviceRemoveGpu()\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlPcieLinkState_enum(pub ::core::ffi::c_uint);\n///  Parent bridge PCIe link state requested by nvmlDeviceRemoveGpu()\npub use self::nvmlPcieLinkState_enum as nvmlPcieLinkState_t;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlConfComputeSystemCaps_st {\n    pub cpuCaps: ::core::ffi::c_uint,\n    pub gpusCaps: ::core::ffi::c_uint,\n}\npub type nvmlConfComputeSystemCaps_t = nvmlConfComputeSystemCaps_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlConfComputeSystemState_st {\n    pub environment: ::core::ffi::c_uint,\n    pub ccFeature: ::core::ffi::c_uint,\n    pub devToolsMode: ::core::ffi::c_uint,\n}\npub type nvmlConfComputeSystemState_t = nvmlConfComputeSystemState_st;\n/// Confidential Compute System settings\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlSystemConfComputeSettings_v1_t {\n    pub version: ::core::ffi::c_uint,\n    pub environment: ::core::ffi::c_uint,\n    pub ccFeature: ::core::ffi::c_uint,\n    pub devToolsMode: ::core::ffi::c_uint,\n    pub multiGpuMode: ::core::ffi::c_uint,\n}\n/// Confidential Compute System settings\npub type nvmlSystemConfComputeSettings_t = nvmlSystemConfComputeSettings_v1_t;\n/// Protected memory size\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlConfComputeMemSizeInfo_st {\n    pub protectedMemSizeKib: ::core::ffi::c_ulonglong,\n    pub unprotectedMemSizeKib: ::core::ffi::c_ulonglong,\n}\n/// Protected memory size\npub type nvmlConfComputeMemSizeInfo_t = nvmlConfComputeMemSizeInfo_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlConfComputeGpuCertificate_st {\n    pub certChainSize: ::core::ffi::c_uint,\n    pub attestationCertChainSize: ::core::ffi::c_uint,\n    pub certChain: [::core::ffi::c_uchar; 4096usize],\n    pub attestationCertChain: [::core::ffi::c_uchar; 5120usize],\n}\npub type nvmlConfComputeGpuCertificate_t = nvmlConfComputeGpuCertificate_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlConfComputeGpuAttestationReport_st {\n    ///!< output\n    pub isCecAttestationReportPresent: ::core::ffi::c_uint,\n    ///!< output\n    pub attestationReportSize: ::core::ffi::c_uint,\n    ///!< output\n    pub cecAttestationReportSize: ::core::ffi::c_uint,\n    ///!< input: spdm supports 32 bytes on nonce\n    pub nonce: [::core::ffi::c_uchar; 32usize],\n    ///!< output\n    pub attestationReport: [::core::ffi::c_uchar; 8192usize],\n    ///!< output\n    pub cecAttestationReport: [::core::ffi::c_uchar; 4096usize],\n}\npub type nvmlConfComputeGpuAttestationReport_t = nvmlConfComputeGpuAttestationReport_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlConfComputeSetKeyRotationThresholdInfo_st {\n    pub version: ::core::ffi::c_uint,\n    pub maxAttackerAdvantage: ::core::ffi::c_ulonglong,\n}\npub type nvmlConfComputeSetKeyRotationThresholdInfo_v1_t = nvmlConfComputeSetKeyRotationThresholdInfo_st;\npub type nvmlConfComputeSetKeyRotationThresholdInfo_t = nvmlConfComputeSetKeyRotationThresholdInfo_v1_t;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlConfComputeGetKeyRotationThresholdInfo_st {\n    pub version: ::core::ffi::c_uint,\n    pub attackerAdvantage: ::core::ffi::c_ulonglong,\n}\npub type nvmlConfComputeGetKeyRotationThresholdInfo_v1_t = nvmlConfComputeGetKeyRotationThresholdInfo_st;\npub type nvmlConfComputeGetKeyRotationThresholdInfo_t = nvmlConfComputeGetKeyRotationThresholdInfo_v1_t;\n/// Probe State of GPU registration process\npub type nvmlGpuFabricState_t = ::core::ffi::c_uchar;\n/// Contains the device fabric information\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlGpuFabricInfo_t {\n    ///!< Uuid of the cluster to which this GPU belongs\n    pub clusterUuid: [::core::ffi::c_uchar; 16usize],\n    ///!< Error status, if any. Must be checked only if state returns \"complete\".\n    pub status: nvmlReturn_t,\n    ///!< ID of the fabric clique to which this GPU belongs\n    pub cliqueId: ::core::ffi::c_uint,\n    ///!< Current state of GPU registration process. See NVML_GPU_FABRIC_STATE_*\n    pub state: nvmlGpuFabricState_t,\n}\n/** GPU Fabric information (v2).\n\n @deprecated  nvmlGpuFabricInfo_v2_t is deprecated and will be removed in a future release.\n              Use nvmlGpuFabricInfo_v3_t instead\n\n Version 2 adds the \\ref nvmlGpuFabricInfo_v2_t.version field\n to the start of the structure, and the \\ref nvmlGpuFabricInfo_v2_t.healthMask\n field to the end. This structure is not backwards-compatible with\n \\ref nvmlGpuFabricInfo_t.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlGpuFabricInfo_v2_t {\n    ///!< Structure version identifier (set to nvmlGpuFabricInfo_v2)\n    pub version: ::core::ffi::c_uint,\n    ///!< Uuid of the cluster to which this GPU belongs\n    pub clusterUuid: [::core::ffi::c_uchar; 16usize],\n    ///!< Probe Error status, if any. Must be checked only if Probe state returns \"complete\".\n    pub status: nvmlReturn_t,\n    ///!< ID of the fabric clique to which this GPU belongs\n    pub cliqueId: ::core::ffi::c_uint,\n    ///!< Current Probe State of GPU registration process. See NVML_GPU_FABRIC_STATE_*\n    pub state: nvmlGpuFabricState_t,\n    ///!< GPU Fabric health Status Mask. See NVML_GPU_FABRIC_HEALTH_MASK_*\n    pub healthMask: ::core::ffi::c_uint,\n}\n/// GPU Fabric information (v3).\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlGpuFabricInfo_v3_t {\n    ///!< Structure version identifier (set to nvmlGpuFabricInfo_v2)\n    pub version: ::core::ffi::c_uint,\n    ///!< Uuid of the cluster to which this GPU belongs\n    pub clusterUuid: [::core::ffi::c_uchar; 16usize],\n    ///!< Probe Error status, if any. Must be checked only if Probe state returns \"complete\".\n    pub status: nvmlReturn_t,\n    ///!< ID of the fabric clique to which this GPU belongs\n    pub cliqueId: ::core::ffi::c_uint,\n    ///!< Current Probe State of GPU registration process. See NVML_GPU_FABRIC_STATE_*\n    pub state: nvmlGpuFabricState_t,\n    ///!< GPU Fabric health Status Mask. See NVML_GPU_FABRIC_HEALTH_MASK_*\n    pub healthMask: ::core::ffi::c_uint,\n    ///!< GPU Fabric health summary. See NVML_GPU_FABRIC_HEALTH_SUMMARY_*\n    pub healthSummary: ::core::ffi::c_uchar,\n}\n/// GPU Fabric information (v3).\npub type nvmlGpuFabricInfoV_t = nvmlGpuFabricInfo_v3_t;\n/// Structure to store Driver branch information\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlSystemDriverBranchInfo_v1_t {\n    ///!< The version number of this struct\n    pub version: ::core::ffi::c_uint,\n    ///!< driver branch\n    pub branch: [::core::ffi::c_char; 80usize],\n}\n/// Structure to store Driver branch information\npub type nvmlSystemDriverBranchInfo_t = nvmlSystemDriverBranchInfo_v1_t;\npub type nvmlAffinityScope_t = ::core::ffi::c_uint;\n/// Structure used to encapsulate temperature info\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlTemperature_v1_t {\n    pub version: ::core::ffi::c_uint,\n    pub sensorType: nvmlTemperatureSensors_t,\n    pub temperature: ::core::ffi::c_int,\n}\n/// Structure used to encapsulate temperature info\npub type nvmlTemperature_t = nvmlTemperature_v1_t;\nimpl nvmlClockLimitId_enum {\n    pub const NVML_CLOCK_LIMIT_ID_RANGE_START: nvmlClockLimitId_enum = nvmlClockLimitId_enum(\n        4294967040,\n    );\n}\nimpl nvmlClockLimitId_enum {\n    pub const NVML_CLOCK_LIMIT_ID_TDP: nvmlClockLimitId_enum = nvmlClockLimitId_enum(\n        4294967041,\n    );\n}\nimpl nvmlClockLimitId_enum {\n    pub const NVML_CLOCK_LIMIT_ID_UNLIMITED: nvmlClockLimitId_enum = nvmlClockLimitId_enum(\n        4294967042,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlClockLimitId_enum(pub ::core::ffi::c_uint);\npub use self::nvmlClockLimitId_enum as nvmlClockLimitId_t;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlNvlinkSupportedBwModes_v1_t {\n    pub version: ::core::ffi::c_uint,\n    pub bwModes: [::core::ffi::c_uchar; 23usize],\n    pub totalBwModes: ::core::ffi::c_uchar,\n}\npub type nvmlNvlinkSupportedBwModes_t = nvmlNvlinkSupportedBwModes_v1_t;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlNvlinkGetBwMode_v1_t {\n    pub version: ::core::ffi::c_uint,\n    pub bIsBest: ::core::ffi::c_uint,\n    pub bwMode: ::core::ffi::c_uchar,\n}\npub type nvmlNvlinkGetBwMode_t = nvmlNvlinkGetBwMode_v1_t;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlNvlinkSetBwMode_v1_t {\n    pub version: ::core::ffi::c_uint,\n    pub bSetBest: ::core::ffi::c_uint,\n    pub bwMode: ::core::ffi::c_uchar,\n}\npub type nvmlNvlinkSetBwMode_t = nvmlNvlinkSetBwMode_v1_t;\n/// Struct to represent per device NVLINK information v1\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlNvLinkInfo_v1_t {\n    ///!< IN - the API version number\n    pub version: ::core::ffi::c_uint,\n    ///!< OUT - NVLINK encryption enablement\n    pub isNvleEnabled: ::core::ffi::c_uint,\n}\n/// Struct to represent NVLINK firmware Semantic versioning and ucode type\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlNvlinkFirmwareVersion_t {\n    pub ucodeType: ::core::ffi::c_uchar,\n    pub major: ::core::ffi::c_uint,\n    pub minor: ::core::ffi::c_uint,\n    pub subMinor: ::core::ffi::c_uint,\n}\n/// Struct to represent NVLINK firmware information\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlNvlinkFirmwareInfo_t {\n    ///!< OUT - NVLINK firmware version\n    pub firmwareVersion: [nvmlNvlinkFirmwareVersion_t; 100usize],\n    ///!< OUT - Number of valid firmware entries\n    pub numValidEntries: ::core::ffi::c_uint,\n}\n/// Struct to represent per device NVLINK information v2\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlNvLinkInfo_v2_t {\n    ///!< IN - the API version number\n    pub version: ::core::ffi::c_uint,\n    ///!< OUT - NVLINK encryption enablement\n    pub isNvleEnabled: ::core::ffi::c_uint,\n    ///!< OUT - NVLINK Firmware info\n    pub firmwareInfo: nvmlNvlinkFirmwareInfo_t,\n}\n/// Struct to represent per device NVLINK information v2\npub type nvmlNvLinkInfo_t = nvmlNvLinkInfo_v2_t;\n/// Structure representing range of vGPU versions.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuVersion_st {\n    ///!< Minimum vGPU version.\n    pub minVersion: ::core::ffi::c_uint,\n    ///!< Maximum vGPU version.\n    pub maxVersion: ::core::ffi::c_uint,\n}\n/// Structure representing range of vGPU versions.\npub type nvmlVgpuVersion_t = nvmlVgpuVersion_st;\n/// vGPU metadata structure.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuMetadata_st {\n    ///!< Current version of the structure\n    pub version: ::core::ffi::c_uint,\n    ///!< Current revision of the structure\n    pub revision: ::core::ffi::c_uint,\n    ///!< Current state of Guest-dependent fields\n    pub guestInfoState: nvmlVgpuGuestInfoState_t,\n    ///!< Version of driver installed in guest\n    pub guestDriverVersion: [::core::ffi::c_char; 80usize],\n    ///!< Version of driver installed in host\n    pub hostDriverVersion: [::core::ffi::c_char; 80usize],\n    ///!< Reserved for internal use\n    pub reserved: [::core::ffi::c_uint; 6usize],\n    ///!< vGPU virtualization capabilities bitfield\n    pub vgpuVirtualizationCaps: ::core::ffi::c_uint,\n    ///!< vGPU version of guest driver\n    pub guestVgpuVersion: ::core::ffi::c_uint,\n    ///!< Size of opaque data field in bytes\n    pub opaqueDataSize: ::core::ffi::c_uint,\n    ///!< Opaque data\n    pub opaqueData: [::core::ffi::c_char; 4usize],\n}\n/// vGPU metadata structure.\npub type nvmlVgpuMetadata_t = nvmlVgpuMetadata_st;\n/// Physical GPU metadata structure\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuPgpuMetadata_st {\n    ///!< Current version of the structure\n    pub version: ::core::ffi::c_uint,\n    ///!< Current revision of the structure\n    pub revision: ::core::ffi::c_uint,\n    ///!< Host driver version\n    pub hostDriverVersion: [::core::ffi::c_char; 80usize],\n    ///!< Pgpu virtualization capabilities bitfield\n    pub pgpuVirtualizationCaps: ::core::ffi::c_uint,\n    ///!< Reserved for internal use\n    pub reserved: [::core::ffi::c_uint; 5usize],\n    ///!< vGPU version range supported by host driver\n    pub hostSupportedVgpuRange: nvmlVgpuVersion_t,\n    ///!< Size of opaque data field in bytes\n    pub opaqueDataSize: ::core::ffi::c_uint,\n    ///!< Opaque data\n    pub opaqueData: [::core::ffi::c_char; 4usize],\n}\n/// Physical GPU metadata structure\npub type nvmlVgpuPgpuMetadata_t = nvmlVgpuPgpuMetadata_st;\nimpl nvmlVgpuVmCompatibility_enum {\n    ///!< vGPU is not runnable\n    pub const NVML_VGPU_VM_COMPATIBILITY_NONE: nvmlVgpuVmCompatibility_enum = nvmlVgpuVmCompatibility_enum(\n        0,\n    );\n}\nimpl nvmlVgpuVmCompatibility_enum {\n    ///!< vGPU is runnable from a cold / powered-off state (ACPI S5)\n    pub const NVML_VGPU_VM_COMPATIBILITY_COLD: nvmlVgpuVmCompatibility_enum = nvmlVgpuVmCompatibility_enum(\n        1,\n    );\n}\nimpl nvmlVgpuVmCompatibility_enum {\n    ///!< vGPU is runnable from a hibernated state (ACPI S4)\n    pub const NVML_VGPU_VM_COMPATIBILITY_HIBERNATE: nvmlVgpuVmCompatibility_enum = nvmlVgpuVmCompatibility_enum(\n        2,\n    );\n}\nimpl nvmlVgpuVmCompatibility_enum {\n    ///!< vGPU is runnable from a sleeped state (ACPI S3)\n    pub const NVML_VGPU_VM_COMPATIBILITY_SLEEP: nvmlVgpuVmCompatibility_enum = nvmlVgpuVmCompatibility_enum(\n        4,\n    );\n}\nimpl nvmlVgpuVmCompatibility_enum {\n    ///!< vGPU is runnable from a live/paused (ACPI S0)\n    pub const NVML_VGPU_VM_COMPATIBILITY_LIVE: nvmlVgpuVmCompatibility_enum = nvmlVgpuVmCompatibility_enum(\n        8,\n    );\n}\n#[repr(transparent)]\n/// vGPU VM compatibility codes\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuVmCompatibility_enum(pub ::core::ffi::c_uint);\n/// vGPU VM compatibility codes\npub use self::nvmlVgpuVmCompatibility_enum as nvmlVgpuVmCompatibility_t;\nimpl nvmlVgpuPgpuCompatibilityLimitCode_enum {\n    ///!< Compatibility is not limited.\n    pub const NVML_VGPU_COMPATIBILITY_LIMIT_NONE: nvmlVgpuPgpuCompatibilityLimitCode_enum = nvmlVgpuPgpuCompatibilityLimitCode_enum(\n        0,\n    );\n}\nimpl nvmlVgpuPgpuCompatibilityLimitCode_enum {\n    ///!< ompatibility is limited by host driver version.\n    pub const NVML_VGPU_COMPATIBILITY_LIMIT_HOST_DRIVER: nvmlVgpuPgpuCompatibilityLimitCode_enum = nvmlVgpuPgpuCompatibilityLimitCode_enum(\n        1,\n    );\n}\nimpl nvmlVgpuPgpuCompatibilityLimitCode_enum {\n    ///!< Compatibility is limited by guest driver version.\n    pub const NVML_VGPU_COMPATIBILITY_LIMIT_GUEST_DRIVER: nvmlVgpuPgpuCompatibilityLimitCode_enum = nvmlVgpuPgpuCompatibilityLimitCode_enum(\n        2,\n    );\n}\nimpl nvmlVgpuPgpuCompatibilityLimitCode_enum {\n    ///!< Compatibility is limited by GPU hardware.\n    pub const NVML_VGPU_COMPATIBILITY_LIMIT_GPU: nvmlVgpuPgpuCompatibilityLimitCode_enum = nvmlVgpuPgpuCompatibilityLimitCode_enum(\n        4,\n    );\n}\nimpl nvmlVgpuPgpuCompatibilityLimitCode_enum {\n    ///!< Compatibility is limited by an undefined factor.\n    pub const NVML_VGPU_COMPATIBILITY_LIMIT_OTHER: nvmlVgpuPgpuCompatibilityLimitCode_enum = nvmlVgpuPgpuCompatibilityLimitCode_enum(\n        2147483648,\n    );\n}\n#[repr(transparent)]\n///  vGPU-pGPU compatibility limit codes\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuPgpuCompatibilityLimitCode_enum(pub ::core::ffi::c_uint);\n///  vGPU-pGPU compatibility limit codes\npub use self::nvmlVgpuPgpuCompatibilityLimitCode_enum as nvmlVgpuPgpuCompatibilityLimitCode_t;\n/// vGPU-pGPU compatibility structure\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlVgpuPgpuCompatibility_st {\n    ///!< Compatibility of vGPU VM. See \\ref nvmlVgpuVmCompatibility_t\n    pub vgpuVmCompatibility: nvmlVgpuVmCompatibility_t,\n    ///!< Limiting factor for vGPU-pGPU compatibility. See \\ref nvmlVgpuPgpuCompatibilityLimitCode_t\n    pub compatibilityLimitCode: nvmlVgpuPgpuCompatibilityLimitCode_t,\n}\n/// vGPU-pGPU compatibility structure\npub type nvmlVgpuPgpuCompatibility_t = nvmlVgpuPgpuCompatibility_st;\n/// Excluded GPU device information\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlExcludedDeviceInfo_st {\n    ///!< The PCI information for the excluded GPU\n    pub pciInfo: nvmlPciInfo_t,\n    ///!< The ASCII string UUID for the excluded GPU\n    pub uuid: [::core::ffi::c_char; 80usize],\n}\n/// Excluded GPU device information\npub type nvmlExcludedDeviceInfo_t = nvmlExcludedDeviceInfo_st;\n/// Main PRM input structure\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct nvmlPRMTLV_v1_t {\n    ///!< Size of the input TLV data.\n    pub dataSize: ::core::ffi::c_uint,\n    ///!< OUT: status of the PRM command\n    pub status: ::core::ffi::c_uint,\n    pub __bindgen_anon_1: nvmlPRMTLV_v1_t__bindgen_ty_1,\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union nvmlPRMTLV_v1_t__bindgen_ty_1 {\n    ///!< IN: Input data in TLV format\n    pub inData: [::core::ffi::c_uchar; 496usize],\n    ///!< OUT: Output PRM data in TLV format\n    pub outData: [::core::ffi::c_uchar; 496usize],\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlGpuInstancePlacement_st {\n    ///!< Index of first occupied memory slice\n    pub start: ::core::ffi::c_uint,\n    ///!< Number of memory slices occupied\n    pub size: ::core::ffi::c_uint,\n}\npub type nvmlGpuInstancePlacement_t = nvmlGpuInstancePlacement_st;\n/// GPU instance profile information.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlGpuInstanceProfileInfo_st {\n    ///!< Unique profile ID within the device\n    pub id: ::core::ffi::c_uint,\n    ///!< Peer-to-Peer support\n    pub isP2pSupported: ::core::ffi::c_uint,\n    ///!< GPU Slice count\n    pub sliceCount: ::core::ffi::c_uint,\n    ///!< GPU instance count\n    pub instanceCount: ::core::ffi::c_uint,\n    ///!< Streaming Multiprocessor count\n    pub multiprocessorCount: ::core::ffi::c_uint,\n    ///!< Copy Engine count\n    pub copyEngineCount: ::core::ffi::c_uint,\n    ///!< Decoder Engine count\n    pub decoderCount: ::core::ffi::c_uint,\n    ///!< Encoder Engine count\n    pub encoderCount: ::core::ffi::c_uint,\n    ///!< JPEG Engine count\n    pub jpegCount: ::core::ffi::c_uint,\n    ///!< OFA Engine count\n    pub ofaCount: ::core::ffi::c_uint,\n    ///!< Memory size in MBytes\n    pub memorySizeMB: ::core::ffi::c_ulonglong,\n}\n/// GPU instance profile information.\npub type nvmlGpuInstanceProfileInfo_t = nvmlGpuInstanceProfileInfo_st;\n/** GPU instance profile information (v2).\n\n Version 2 adds the \\ref nvmlGpuInstanceProfileInfo_v2_t.version field\n to the start of the structure, and the \\ref nvmlGpuInstanceProfileInfo_v2_t.name\n field to the end. This structure is not backwards-compatible with\n \\ref nvmlGpuInstanceProfileInfo_t.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlGpuInstanceProfileInfo_v2_st {\n    ///!< Structure version identifier (set to \\ref nvmlGpuInstanceProfileInfo_v2)\n    pub version: ::core::ffi::c_uint,\n    ///!< Unique profile ID within the device\n    pub id: ::core::ffi::c_uint,\n    ///!< Peer-to-Peer support\n    pub isP2pSupported: ::core::ffi::c_uint,\n    ///!< GPU Slice count\n    pub sliceCount: ::core::ffi::c_uint,\n    ///!< GPU instance count\n    pub instanceCount: ::core::ffi::c_uint,\n    ///!< Streaming Multiprocessor count\n    pub multiprocessorCount: ::core::ffi::c_uint,\n    ///!< Copy Engine count\n    pub copyEngineCount: ::core::ffi::c_uint,\n    ///!< Decoder Engine count\n    pub decoderCount: ::core::ffi::c_uint,\n    ///!< Encoder Engine count\n    pub encoderCount: ::core::ffi::c_uint,\n    ///!< JPEG Engine count\n    pub jpegCount: ::core::ffi::c_uint,\n    ///!< OFA Engine count\n    pub ofaCount: ::core::ffi::c_uint,\n    ///!< Memory size in MBytes\n    pub memorySizeMB: ::core::ffi::c_ulonglong,\n    ///!< Profile name\n    pub name: [::core::ffi::c_char; 96usize],\n}\n/** GPU instance profile information (v2).\n\n Version 2 adds the \\ref nvmlGpuInstanceProfileInfo_v2_t.version field\n to the start of the structure, and the \\ref nvmlGpuInstanceProfileInfo_v2_t.name\n field to the end. This structure is not backwards-compatible with\n \\ref nvmlGpuInstanceProfileInfo_t.*/\npub type nvmlGpuInstanceProfileInfo_v2_t = nvmlGpuInstanceProfileInfo_v2_st;\n/** GPU instance profile information (v3).\n\n Version 3 removes isP2pSupported field and adds the \\ref nvmlGpuInstanceProfileInfo_v3_t.capabilities\n field \\ref nvmlGpuInstanceProfileInfo_t.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlGpuInstanceProfileInfo_v3_st {\n    ///!< Structure version identifier (set to \\ref nvmlGpuInstanceProfileInfo_v3)\n    pub version: ::core::ffi::c_uint,\n    ///!< Unique profile ID within the device\n    pub id: ::core::ffi::c_uint,\n    ///!< GPU Slice count\n    pub sliceCount: ::core::ffi::c_uint,\n    ///!< GPU instance count\n    pub instanceCount: ::core::ffi::c_uint,\n    ///!< Streaming Multiprocessor count\n    pub multiprocessorCount: ::core::ffi::c_uint,\n    ///!< Copy Engine count\n    pub copyEngineCount: ::core::ffi::c_uint,\n    ///!< Decoder Engine count\n    pub decoderCount: ::core::ffi::c_uint,\n    ///!< Encoder Engine count\n    pub encoderCount: ::core::ffi::c_uint,\n    ///!< JPEG Engine count\n    pub jpegCount: ::core::ffi::c_uint,\n    ///!< OFA Engine count\n    pub ofaCount: ::core::ffi::c_uint,\n    ///!< Memory size in MBytes\n    pub memorySizeMB: ::core::ffi::c_ulonglong,\n    ///!< Profile name\n    pub name: [::core::ffi::c_char; 96usize],\n    ///!< Additional capabilities\n    pub capabilities: ::core::ffi::c_uint,\n}\n/** GPU instance profile information (v3).\n\n Version 3 removes isP2pSupported field and adds the \\ref nvmlGpuInstanceProfileInfo_v3_t.capabilities\n field \\ref nvmlGpuInstanceProfileInfo_t.*/\npub type nvmlGpuInstanceProfileInfo_v3_t = nvmlGpuInstanceProfileInfo_v3_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlGpuInstanceInfo_st {\n    ///!< Parent device\n    pub device: nvmlDevice_t,\n    ///!< Unique instance ID within the device\n    pub id: ::core::ffi::c_uint,\n    ///!< Unique profile ID within the device\n    pub profileId: ::core::ffi::c_uint,\n    ///!< Placement for this instance\n    pub placement: nvmlGpuInstancePlacement_t,\n}\npub type nvmlGpuInstanceInfo_t = nvmlGpuInstanceInfo_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlComputeInstancePlacement_st {\n    ///!< Index of first occupied compute slice\n    pub start: ::core::ffi::c_uint,\n    ///!< Number of compute slices occupied\n    pub size: ::core::ffi::c_uint,\n}\npub type nvmlComputeInstancePlacement_t = nvmlComputeInstancePlacement_st;\n/// Compute instance profile information.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlComputeInstanceProfileInfo_st {\n    ///!< Unique profile ID within the GPU instance\n    pub id: ::core::ffi::c_uint,\n    ///!< GPU Slice count\n    pub sliceCount: ::core::ffi::c_uint,\n    ///!< Compute instance count\n    pub instanceCount: ::core::ffi::c_uint,\n    ///!< Streaming Multiprocessor count\n    pub multiprocessorCount: ::core::ffi::c_uint,\n    ///!< Shared Copy Engine count\n    pub sharedCopyEngineCount: ::core::ffi::c_uint,\n    ///!< Shared Decoder Engine count\n    pub sharedDecoderCount: ::core::ffi::c_uint,\n    ///!< Shared Encoder Engine count\n    pub sharedEncoderCount: ::core::ffi::c_uint,\n    ///!< Shared JPEG Engine count\n    pub sharedJpegCount: ::core::ffi::c_uint,\n    ///!< Shared OFA Engine count\n    pub sharedOfaCount: ::core::ffi::c_uint,\n}\n/// Compute instance profile information.\npub type nvmlComputeInstanceProfileInfo_t = nvmlComputeInstanceProfileInfo_st;\n/** Compute instance profile information (v2).\n\n Version 2 adds the \\ref nvmlComputeInstanceProfileInfo_v2_t.version field\n to the start of the structure, and the \\ref nvmlComputeInstanceProfileInfo_v2_t.name\n field to the end. This structure is not backwards-compatible with\n \\ref nvmlComputeInstanceProfileInfo_t.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlComputeInstanceProfileInfo_v2_st {\n    ///!< Structure version identifier (set to \\ref nvmlComputeInstanceProfileInfo_v2)\n    pub version: ::core::ffi::c_uint,\n    ///!< Unique profile ID within the GPU instance\n    pub id: ::core::ffi::c_uint,\n    ///!< GPU Slice count\n    pub sliceCount: ::core::ffi::c_uint,\n    ///!< Compute instance count\n    pub instanceCount: ::core::ffi::c_uint,\n    ///!< Streaming Multiprocessor count\n    pub multiprocessorCount: ::core::ffi::c_uint,\n    ///!< Shared Copy Engine count\n    pub sharedCopyEngineCount: ::core::ffi::c_uint,\n    ///!< Shared Decoder Engine count\n    pub sharedDecoderCount: ::core::ffi::c_uint,\n    ///!< Shared Encoder Engine count\n    pub sharedEncoderCount: ::core::ffi::c_uint,\n    ///!< Shared JPEG Engine count\n    pub sharedJpegCount: ::core::ffi::c_uint,\n    ///!< Shared OFA Engine count\n    pub sharedOfaCount: ::core::ffi::c_uint,\n    ///!< Profile name\n    pub name: [::core::ffi::c_char; 96usize],\n}\n/** Compute instance profile information (v2).\n\n Version 2 adds the \\ref nvmlComputeInstanceProfileInfo_v2_t.version field\n to the start of the structure, and the \\ref nvmlComputeInstanceProfileInfo_v2_t.name\n field to the end. This structure is not backwards-compatible with\n \\ref nvmlComputeInstanceProfileInfo_t.*/\npub type nvmlComputeInstanceProfileInfo_v2_t = nvmlComputeInstanceProfileInfo_v2_st;\n/** Compute instance profile information (v3).\n\n Version 3 adds the \\ref nvmlComputeInstanceProfileInfo_v3_t.capabilities field\n \\ref nvmlComputeInstanceProfileInfo_t.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlComputeInstanceProfileInfo_v3_st {\n    ///!< Structure version identifier (set to \\ref nvmlComputeInstanceProfileInfo_v3)\n    pub version: ::core::ffi::c_uint,\n    ///!< Unique profile ID within the GPU instance\n    pub id: ::core::ffi::c_uint,\n    ///!< GPU Slice count\n    pub sliceCount: ::core::ffi::c_uint,\n    ///!< Compute instance count\n    pub instanceCount: ::core::ffi::c_uint,\n    ///!< Streaming Multiprocessor count\n    pub multiprocessorCount: ::core::ffi::c_uint,\n    ///!< Shared Copy Engine count\n    pub sharedCopyEngineCount: ::core::ffi::c_uint,\n    ///!< Shared Decoder Engine count\n    pub sharedDecoderCount: ::core::ffi::c_uint,\n    ///!< Shared Encoder Engine count\n    pub sharedEncoderCount: ::core::ffi::c_uint,\n    ///!< Shared JPEG Engine count\n    pub sharedJpegCount: ::core::ffi::c_uint,\n    ///!< Shared OFA Engine count\n    pub sharedOfaCount: ::core::ffi::c_uint,\n    ///!< Profile name\n    pub name: [::core::ffi::c_char; 96usize],\n    ///!< Additional capabilities\n    pub capabilities: ::core::ffi::c_uint,\n}\n/** Compute instance profile information (v3).\n\n Version 3 adds the \\ref nvmlComputeInstanceProfileInfo_v3_t.capabilities field\n \\ref nvmlComputeInstanceProfileInfo_t.*/\npub type nvmlComputeInstanceProfileInfo_v3_t = nvmlComputeInstanceProfileInfo_v3_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlComputeInstanceInfo_st {\n    ///!< Parent device\n    pub device: nvmlDevice_t,\n    ///!< Parent GPU instance\n    pub gpuInstance: nvmlGpuInstance_t,\n    ///!< Unique instance ID within the GPU instance\n    pub id: ::core::ffi::c_uint,\n    ///!< Unique profile ID within the GPU instance\n    pub profileId: ::core::ffi::c_uint,\n    ///!< Placement for this instance within the GPU instance's compute slice range {0, sliceCount}\n    pub placement: nvmlComputeInstancePlacement_t,\n}\npub type nvmlComputeInstanceInfo_t = nvmlComputeInstanceInfo_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct nvmlComputeInstance_st {\n    _unused: [u8; 0],\n}\npub type nvmlComputeInstance_t = *mut nvmlComputeInstance_st;\nimpl nvmlGpmMetricId_t {\n    ///!< Percentage of time any compute/graphics app was active on the GPU. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_GRAPHICS_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(1);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percentage of SMs that were busy. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_SM_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(2);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percentage of warps that were active vs theoretical maximum. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_SM_OCCUPANCY: nvmlGpmMetricId_t = nvmlGpmMetricId_t(3);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percentage of time the GPU's SMs were doing integer operations. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_INTEGER_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(4);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percentage of time the GPU's SMs were doing ANY tensor operations. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_ANY_TENSOR_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(5);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percentage of time the GPU's SMs were doing DFMA tensor operations. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_DFMA_TENSOR_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(6);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percentage of time the GPU's SMs were doing HMMA tensor operations. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_HMMA_TENSOR_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(7);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percentage of time the GPU's SMs were doing IMMA tensor operations. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_IMMA_TENSOR_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(9);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percentage of DRAM bw used vs theoretical maximum. 0.0 - 100.0 */\n    pub const NVML_GPM_METRIC_DRAM_BW_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(10);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percentage of time the GPU's SMs were doing non-tensor FP64 math. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_FP64_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(11);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percentage of time the GPU's SMs were doing non-tensor FP32 math. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_FP32_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(12);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percentage of time the GPU's SMs were doing non-tensor FP16 math. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_FP16_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(13);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< PCIe traffic from this GPU in MiB/sec\n    pub const NVML_GPM_METRIC_PCIE_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(20);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< PCIe traffic to this GPU in MiB/sec\n    pub const NVML_GPM_METRIC_PCIE_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(21);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percent utilization of NVDEC 0. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_NVDEC_0_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(30);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percent utilization of NVDEC 1. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_NVDEC_1_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(31);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percent utilization of NVDEC 2. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_NVDEC_2_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(32);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percent utilization of NVDEC 3. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_NVDEC_3_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(33);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percent utilization of NVDEC 4. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_NVDEC_4_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(34);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percent utilization of NVDEC 5. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_NVDEC_5_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(35);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percent utilization of NVDEC 6. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_NVDEC_6_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(36);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percent utilization of NVDEC 7. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_NVDEC_7_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(37);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percent utilization of NVJPG 0. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_NVJPG_0_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(40);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percent utilization of NVJPG 1. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_NVJPG_1_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(41);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percent utilization of NVJPG 2. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_NVJPG_2_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(42);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percent utilization of NVJPG 3. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_NVJPG_3_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(43);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percent utilization of NVJPG 4. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_NVJPG_4_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(44);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percent utilization of NVJPG 5. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_NVJPG_5_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(45);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percent utilization of NVJPG 6. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_NVJPG_6_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(46);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percent utilization of NVJPG 7. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_NVJPG_7_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(47);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percent utilization of NVOFA 0. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_NVOFA_0_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(50);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Percent utilization of NVOFA 1. 0.0 - 100.0\n    pub const NVML_GPM_METRIC_NVOFA_1_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(51);\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink read bandwidth for all links in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_TOTAL_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        60,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink write bandwidth for all links in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_TOTAL_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        61,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink read bandwidth for link 0 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L0_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        62,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink write bandwidth for link 0 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L0_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        63,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink read bandwidth for link 1 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L1_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        64,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink write bandwidth for link 1 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L1_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        65,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink read bandwidth for link 2 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L2_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        66,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink write bandwidth for link 2 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L2_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        67,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink read bandwidth for link 3 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L3_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        68,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink write bandwidth for link 3 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L3_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        69,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink read bandwidth for link 4 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L4_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        70,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink write bandwidth for link 4 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L4_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        71,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink read bandwidth for link 5 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L5_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        72,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink write bandwidth for link 5 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L5_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        73,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink read bandwidth for link 6 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L6_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        74,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink write bandwidth for link 6 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L6_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        75,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink read bandwidth for link 7 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L7_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        76,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink write bandwidth for link 7 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L7_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        77,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink read bandwidth for link 8 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L8_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        78,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink write bandwidth for link 8 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L8_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        79,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink read bandwidth for link 9 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L9_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        80,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink write bandwidth for link 9 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L9_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        81,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink read bandwidth for link 10 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L10_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        82,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink write bandwidth for link 10 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L10_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        83,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink read bandwidth for link 11 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L11_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        84,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink write bandwidth for link 11 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L11_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        85,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink read bandwidth for link 12 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L12_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        86,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink write bandwidth for link 12 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L12_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        87,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink read bandwidth for link 13 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L13_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        88,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink write bandwidth for link 13 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L13_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        89,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink read bandwidth for link 14 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L14_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        90,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink write bandwidth for link 14 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L14_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        91,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink read bandwidth for link 15 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L15_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        92,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink write bandwidth for link 15 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L15_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        93,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink read bandwidth for link 16 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L16_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        94,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink write bandwidth for link 16 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L16_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        95,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink read bandwidth for link 17 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L17_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        96,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< NvLink write bandwidth for link 17 in MiB/sec\n    pub const NVML_GPM_METRIC_NVLINK_L17_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        97,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_TOTAL_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        100,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_TOTAL_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        101,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_DATA_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        102,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_DATA_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        103,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK0_TOTAL_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        104,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK0_TOTAL_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        105,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK0_DATA_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        106,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK0_DATA_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        107,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK1_TOTAL_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        108,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK1_TOTAL_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        109,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK1_DATA_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        110,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK1_DATA_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        111,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK2_TOTAL_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        112,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK2_TOTAL_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        113,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK2_DATA_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        114,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK2_DATA_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        115,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK3_TOTAL_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        116,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK3_TOTAL_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        117,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK3_DATA_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        118,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK3_DATA_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        119,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK4_TOTAL_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        120,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK4_TOTAL_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        121,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK4_DATA_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        122,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK4_DATA_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        123,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK5_TOTAL_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        124,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK5_TOTAL_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        125,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK5_DATA_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        126,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK5_DATA_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        127,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK6_TOTAL_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        128,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK6_TOTAL_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        129,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK6_DATA_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        130,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK6_DATA_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        131,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK7_TOTAL_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        132,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK7_TOTAL_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        133,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK7_DATA_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        134,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK7_DATA_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        135,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK8_TOTAL_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        136,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK8_TOTAL_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        137,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK8_DATA_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        138,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK8_DATA_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        139,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK9_TOTAL_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        140,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK9_TOTAL_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        141,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK9_DATA_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        142,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK9_DATA_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        143,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK10_TOTAL_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        144,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK10_TOTAL_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        145,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK10_DATA_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        146,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK10_DATA_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        147,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK11_TOTAL_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        148,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK11_TOTAL_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        149,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK11_DATA_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        150,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK11_DATA_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        151,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK12_TOTAL_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        152,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK12_TOTAL_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        153,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK12_DATA_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        154,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK12_DATA_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        155,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK13_TOTAL_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        156,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK13_TOTAL_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        157,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK13_DATA_TX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        158,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_C2C_LINK13_DATA_RX_PER_SEC: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        159,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_HOSTMEM_CACHE_HIT: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        160,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_HOSTMEM_CACHE_MISS: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        161,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_PEERMEM_CACHE_HIT: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        162,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_PEERMEM_CACHE_MISS: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        163,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_DRAM_CACHE_HIT: nvmlGpmMetricId_t = nvmlGpmMetricId_t(164);\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_DRAM_CACHE_MISS: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        165,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_NVENC_0_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(166);\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_NVENC_1_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(167);\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_NVENC_2_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(168);\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_NVENC_3_UTIL: nvmlGpmMetricId_t = nvmlGpmMetricId_t(169);\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR0_CTXSW_CYCLES_ELAPSED: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        170,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR0_CTXSW_CYCLES_ACTIVE: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        171,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR0_CTXSW_REQUESTS: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        172,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR0_CTXSW_CYCLES_PER_REQ: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        173,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR0_CTXSW_ACTIVE_PCT: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        174,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR1_CTXSW_CYCLES_ELAPSED: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        175,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR1_CTXSW_CYCLES_ACTIVE: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        176,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR1_CTXSW_REQUESTS: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        177,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR1_CTXSW_CYCLES_PER_REQ: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        178,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR1_CTXSW_ACTIVE_PCT: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        179,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR2_CTXSW_CYCLES_ELAPSED: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        180,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR2_CTXSW_CYCLES_ACTIVE: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        181,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR2_CTXSW_REQUESTS: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        182,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR2_CTXSW_CYCLES_PER_REQ: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        183,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR2_CTXSW_ACTIVE_PCT: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        184,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR3_CTXSW_CYCLES_ELAPSED: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        185,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR3_CTXSW_CYCLES_ACTIVE: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        186,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR3_CTXSW_REQUESTS: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        187,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR3_CTXSW_CYCLES_PER_REQ: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        188,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR3_CTXSW_ACTIVE_PCT: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        189,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR4_CTXSW_CYCLES_ELAPSED: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        190,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR4_CTXSW_CYCLES_ACTIVE: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        191,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR4_CTXSW_REQUESTS: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        192,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR4_CTXSW_CYCLES_PER_REQ: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        193,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR4_CTXSW_ACTIVE_PCT: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        194,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR5_CTXSW_CYCLES_ELAPSED: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        195,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR5_CTXSW_CYCLES_ACTIVE: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        196,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR5_CTXSW_REQUESTS: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        197,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR5_CTXSW_CYCLES_PER_REQ: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        198,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR5_CTXSW_ACTIVE_PCT: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        199,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR6_CTXSW_CYCLES_ELAPSED: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        200,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR6_CTXSW_CYCLES_ACTIVE: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        201,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR6_CTXSW_REQUESTS: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        202,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR6_CTXSW_CYCLES_PER_REQ: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        203,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR6_CTXSW_ACTIVE_PCT: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        204,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR7_CTXSW_CYCLES_ELAPSED: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        205,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR7_CTXSW_CYCLES_ACTIVE: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        206,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR7_CTXSW_REQUESTS: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        207,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR7_CTXSW_CYCLES_PER_REQ: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        208,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    pub const NVML_GPM_METRIC_GR7_CTXSW_ACTIVE_PCT: nvmlGpmMetricId_t = nvmlGpmMetricId_t(\n        209,\n    );\n}\nimpl nvmlGpmMetricId_t {\n    ///!< Maximum value above +1. Note that changing this should also change NVML_GPM_METRICS_GET_VERSION due to struct size change\n    pub const NVML_GPM_METRIC_MAX: nvmlGpmMetricId_t = nvmlGpmMetricId_t(210);\n}\n#[repr(transparent)]\n/// GPM Metric Identifiers\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlGpmMetricId_t(pub ::core::ffi::c_uint);\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct nvmlGpmSample_st {\n    _unused: [u8; 0],\n}\n/// Handle to an allocated GPM sample allocated with nvmlGpmSampleAlloc(). Free this with nvmlGpmSampleFree().\npub type nvmlGpmSample_t = *mut nvmlGpmSample_st;\n/// GPM metric information.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, PartialEq)]\npub struct nvmlGpmMetric_t {\n    ///!<  IN: NVML_GPM_METRIC_? define of which metric to retrieve\n    pub metricId: ::core::ffi::c_uint,\n    ///!<  OUT: Status of this metric. If this is nonzero, then value is not valid\n    pub nvmlReturn: nvmlReturn_t,\n    ///!<  OUT: Value of this metric. Is only valid if nvmlReturn is 0 (NVML_SUCCESS)\n    pub value: f64,\n    ///!< OUT: Metric name and unit. Those can be NULL if not defined\n    pub metricInfo: nvmlGpmMetric_t__bindgen_ty_1,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlGpmMetric_t__bindgen_ty_1 {\n    pub shortName: *mut ::core::ffi::c_char,\n    pub longName: *mut ::core::ffi::c_char,\n    pub unit: *mut ::core::ffi::c_char,\n}\n/// GPM buffer information.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, PartialEq)]\npub struct nvmlGpmMetricsGet_t {\n    ///!< IN: Set to NVML_GPM_METRICS_GET_VERSION\n    pub version: ::core::ffi::c_uint,\n    ///!< IN: How many metrics to retrieve in metrics[]\n    pub numMetrics: ::core::ffi::c_uint,\n    ///!< IN: Sample buffer\n    pub sample1: nvmlGpmSample_t,\n    ///!< IN: Sample buffer\n    pub sample2: nvmlGpmSample_t,\n    ///!< IN/OUT: Array of metrics. Set metricId on call. See nvmlReturn and value on return\n    pub metrics: [nvmlGpmMetric_t; 210usize],\n}\n/// GPM device information.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlGpmSupport_t {\n    ///!< IN: Set to NVML_GPM_SUPPORT_VERSION\n    pub version: ::core::ffi::c_uint,\n    ///!< OUT: Indicates device support\n    pub isSupportedDevice: ::core::ffi::c_uint,\n}\n/// Device capabilities\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlDeviceCapabilities_v1_t {\n    ///!< the API version number\n    pub version: ::core::ffi::c_uint,\n    ///!< OUT: Bit mask of capabilities.\n    pub capMask: ::core::ffi::c_uint,\n}\n/// Device capabilities\npub type nvmlDeviceCapabilities_t = nvmlDeviceCapabilities_v1_t;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlMask255_t {\n    pub mask: [::core::ffi::c_uint; 8usize],\n}\nimpl nvmlPowerProfileType_t {\n    pub const NVML_POWER_PROFILE_MAX_P: nvmlPowerProfileType_t = nvmlPowerProfileType_t(\n        0,\n    );\n}\nimpl nvmlPowerProfileType_t {\n    pub const NVML_POWER_PROFILE_MAX_Q: nvmlPowerProfileType_t = nvmlPowerProfileType_t(\n        1,\n    );\n}\nimpl nvmlPowerProfileType_t {\n    pub const NVML_POWER_PROFILE_COMPUTE: nvmlPowerProfileType_t = nvmlPowerProfileType_t(\n        2,\n    );\n}\nimpl nvmlPowerProfileType_t {\n    pub const NVML_POWER_PROFILE_MEMORY_BOUND: nvmlPowerProfileType_t = nvmlPowerProfileType_t(\n        3,\n    );\n}\nimpl nvmlPowerProfileType_t {\n    pub const NVML_POWER_PROFILE_NETWORK: nvmlPowerProfileType_t = nvmlPowerProfileType_t(\n        4,\n    );\n}\nimpl nvmlPowerProfileType_t {\n    pub const NVML_POWER_PROFILE_BALANCED: nvmlPowerProfileType_t = nvmlPowerProfileType_t(\n        5,\n    );\n}\nimpl nvmlPowerProfileType_t {\n    pub const NVML_POWER_PROFILE_LLM_INFERENCE: nvmlPowerProfileType_t = nvmlPowerProfileType_t(\n        6,\n    );\n}\nimpl nvmlPowerProfileType_t {\n    pub const NVML_POWER_PROFILE_LLM_TRAINING: nvmlPowerProfileType_t = nvmlPowerProfileType_t(\n        7,\n    );\n}\nimpl nvmlPowerProfileType_t {\n    pub const NVML_POWER_PROFILE_RBM: nvmlPowerProfileType_t = nvmlPowerProfileType_t(8);\n}\nimpl nvmlPowerProfileType_t {\n    pub const NVML_POWER_PROFILE_DCPCIE: nvmlPowerProfileType_t = nvmlPowerProfileType_t(\n        9,\n    );\n}\nimpl nvmlPowerProfileType_t {\n    pub const NVML_POWER_PROFILE_HMMA_SPARSE: nvmlPowerProfileType_t = nvmlPowerProfileType_t(\n        10,\n    );\n}\nimpl nvmlPowerProfileType_t {\n    pub const NVML_POWER_PROFILE_HMMA_DENSE: nvmlPowerProfileType_t = nvmlPowerProfileType_t(\n        11,\n    );\n}\nimpl nvmlPowerProfileType_t {\n    pub const NVML_POWER_PROFILE_SYNC_BALANCED: nvmlPowerProfileType_t = nvmlPowerProfileType_t(\n        12,\n    );\n}\nimpl nvmlPowerProfileType_t {\n    pub const NVML_POWER_PROFILE_HPC: nvmlPowerProfileType_t = nvmlPowerProfileType_t(\n        13,\n    );\n}\nimpl nvmlPowerProfileType_t {\n    pub const NVML_POWER_PROFILE_MIG: nvmlPowerProfileType_t = nvmlPowerProfileType_t(\n        14,\n    );\n}\nimpl nvmlPowerProfileType_t {\n    pub const NVML_POWER_PROFILE_MAX: nvmlPowerProfileType_t = nvmlPowerProfileType_t(\n        15,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlPowerProfileType_t(pub ::core::ffi::c_uint);\n/// Profile Metadata\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlWorkloadPowerProfileInfo_v1_t {\n    ///!< the API version number\n    pub version: ::core::ffi::c_uint,\n    ///!< Performance Profile Id to provide semantic name such as compute, Memory, Max-Q...\n    pub profileId: ::core::ffi::c_uint,\n    ///!< Priority of the profile\n    pub priority: ::core::ffi::c_uint,\n    ///!< Mask of conflicting performance profiles\n    pub conflictingMask: nvmlMask255_t,\n}\n/// Profile Metadata\npub type nvmlWorkloadPowerProfileInfo_t = nvmlWorkloadPowerProfileInfo_v1_t;\n/// Profiles Info\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlWorkloadPowerProfileProfilesInfo_v1_t {\n    ///!< the API version number\n    pub version: ::core::ffi::c_uint,\n    ///!< Mask bit set to true for each valid performance profile\n    pub perfProfilesMask: nvmlMask255_t,\n    ///!< Array of performance profile info parameters\n    pub perfProfile: [nvmlWorkloadPowerProfileInfo_t; 255usize],\n}\n/// Profiles Info\npub type nvmlWorkloadPowerProfileProfilesInfo_t = nvmlWorkloadPowerProfileProfilesInfo_v1_t;\n/// Current Profiles\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlWorkloadPowerProfileCurrentProfiles_v1_t {\n    pub version: ::core::ffi::c_uint,\n    ///!< Mask bit set to true for each valid performance profile\n    pub perfProfilesMask: nvmlMask255_t,\n    ///!< Mask of currently requested performance profiles\n    pub requestedProfilesMask: nvmlMask255_t,\n    ///!< Mask of currently enforced performance profiles post all arbitrations among the requested profiles.\n    pub enforcedProfilesMask: nvmlMask255_t,\n}\n/// Current Profiles\npub type nvmlWorkloadPowerProfileCurrentProfiles_t = nvmlWorkloadPowerProfileCurrentProfiles_v1_t;\n/// Requested Profiles\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlWorkloadPowerProfileRequestedProfiles_v1_t {\n    ///!< the API version number\n    pub version: ::core::ffi::c_uint,\n    ///!< Mask of 255 bits, each bit representing index of respective perf profile\n    pub requestedProfilesMask: nvmlMask255_t,\n}\n/// Requested Profiles\npub type nvmlWorkloadPowerProfileRequestedProfiles_t = nvmlWorkloadPowerProfileRequestedProfiles_v1_t;\n/// Power Smoothing Structure for Profile information\n#[repr(C)]\n#[derive(Debug, Copy, Clone, PartialEq)]\npub struct nvmlPowerSmoothingProfile_v1_t {\n    ///!< the API version number\n    pub version: ::core::ffi::c_uint,\n    ///!< The requested profile ID\n    pub profileId: ::core::ffi::c_uint,\n    ///!< The requested paramater ID\n    pub paramId: ::core::ffi::c_uint,\n    ///!< The requested value for the given parameter\n    pub value: f64,\n}\n/// Power Smoothing Structure for Profile information\npub type nvmlPowerSmoothingProfile_t = nvmlPowerSmoothingProfile_v1_t;\n/// Power Smoothing Structure for Feature Enablement\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct nvmlPowerSmoothingState_v1_t {\n    ///!< the API version number\n    pub version: ::core::ffi::c_uint,\n    ///!< 0/Disabled or 1/Enabled\n    pub state: nvmlEnableState_t,\n}\n/// Power Smoothing Structure for Feature Enablement\npub type nvmlPowerSmoothingState_t = nvmlPowerSmoothingState_v1_t;\nimpl nvmlError_t {\n    pub const r#UNINITIALIZED: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(1)\n    });\n    pub const r#INVALID_ARGUMENT: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(2)\n    });\n    pub const r#NOT_SUPPORTED: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3)\n    });\n    pub const r#NO_PERMISSION: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(4)\n    });\n    pub const r#ALREADY_INITIALIZED: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(5)\n    });\n    pub const r#NOT_FOUND: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(6)\n    });\n    pub const r#INSUFFICIENT_SIZE: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(7)\n    });\n    pub const r#INSUFFICIENT_POWER: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(8)\n    });\n    pub const r#DRIVER_NOT_LOADED: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(9)\n    });\n    pub const r#TIMEOUT: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(10)\n    });\n    pub const r#IRQ_ISSUE: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(11)\n    });\n    pub const r#LIBRARY_NOT_FOUND: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(12)\n    });\n    pub const r#FUNCTION_NOT_FOUND: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(13)\n    });\n    pub const r#CORRUPTED_INFOROM: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(14)\n    });\n    pub const r#GPU_IS_LOST: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(15)\n    });\n    pub const r#RESET_REQUIRED: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(16)\n    });\n    pub const r#OPERATING_SYSTEM: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(17)\n    });\n    pub const r#LIB_RM_VERSION_MISMATCH: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(18)\n    });\n    pub const r#IN_USE: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(19)\n    });\n    pub const r#MEMORY: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(20)\n    });\n    pub const r#NO_DATA: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(21)\n    });\n    pub const r#VGPU_ECC_NOT_SUPPORTED: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(22)\n    });\n    pub const r#INSUFFICIENT_RESOURCES: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(23)\n    });\n    pub const r#FREQ_NOT_SUPPORTED: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(24)\n    });\n    pub const r#ARGUMENT_VERSION_MISMATCH: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(25)\n    });\n    pub const r#DEPRECATED: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(26)\n    });\n    pub const r#NOT_READY: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(27)\n    });\n    pub const r#GPU_NOT_FOUND: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(28)\n    });\n    pub const r#INVALID_STATE: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(29)\n    });\n    pub const r#RESET_TYPE_NOT_SUPPORTED: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(30)\n    });\n    pub const r#UNKNOWN: nvmlError_t = nvmlError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(999)\n    });\n}\n#[repr(transparent)]\n#[derive(Debug, Hash, Copy, Clone, PartialEq, Eq)]\npub struct nvmlError_t(pub ::core::num::NonZeroU32);\npub trait nvmlReturn_tConsts {\n    const SUCCESS: nvmlReturn_t = nvmlReturn_t::Ok(());\n    const ERROR_UNINITIALIZED: nvmlReturn_t = nvmlReturn_t::Err(\n        nvmlError_t::r#UNINITIALIZED,\n    );\n    const ERROR_INVALID_ARGUMENT: nvmlReturn_t = nvmlReturn_t::Err(\n        nvmlError_t::r#INVALID_ARGUMENT,\n    );\n    const ERROR_NOT_SUPPORTED: nvmlReturn_t = nvmlReturn_t::Err(\n        nvmlError_t::r#NOT_SUPPORTED,\n    );\n    const ERROR_NO_PERMISSION: nvmlReturn_t = nvmlReturn_t::Err(\n        nvmlError_t::r#NO_PERMISSION,\n    );\n    const ERROR_ALREADY_INITIALIZED: nvmlReturn_t = nvmlReturn_t::Err(\n        nvmlError_t::r#ALREADY_INITIALIZED,\n    );\n    const ERROR_NOT_FOUND: nvmlReturn_t = nvmlReturn_t::Err(nvmlError_t::r#NOT_FOUND);\n    const ERROR_INSUFFICIENT_SIZE: nvmlReturn_t = nvmlReturn_t::Err(\n        nvmlError_t::r#INSUFFICIENT_SIZE,\n    );\n    const ERROR_INSUFFICIENT_POWER: nvmlReturn_t = nvmlReturn_t::Err(\n        nvmlError_t::r#INSUFFICIENT_POWER,\n    );\n    const ERROR_DRIVER_NOT_LOADED: nvmlReturn_t = nvmlReturn_t::Err(\n        nvmlError_t::r#DRIVER_NOT_LOADED,\n    );\n    const ERROR_TIMEOUT: nvmlReturn_t = nvmlReturn_t::Err(nvmlError_t::r#TIMEOUT);\n    const ERROR_IRQ_ISSUE: nvmlReturn_t = nvmlReturn_t::Err(nvmlError_t::r#IRQ_ISSUE);\n    const ERROR_LIBRARY_NOT_FOUND: nvmlReturn_t = nvmlReturn_t::Err(\n        nvmlError_t::r#LIBRARY_NOT_FOUND,\n    );\n    const ERROR_FUNCTION_NOT_FOUND: nvmlReturn_t = nvmlReturn_t::Err(\n        nvmlError_t::r#FUNCTION_NOT_FOUND,\n    );\n    const ERROR_CORRUPTED_INFOROM: nvmlReturn_t = nvmlReturn_t::Err(\n        nvmlError_t::r#CORRUPTED_INFOROM,\n    );\n    const ERROR_GPU_IS_LOST: nvmlReturn_t = nvmlReturn_t::Err(\n        nvmlError_t::r#GPU_IS_LOST,\n    );\n    const ERROR_RESET_REQUIRED: nvmlReturn_t = nvmlReturn_t::Err(\n        nvmlError_t::r#RESET_REQUIRED,\n    );\n    const ERROR_OPERATING_SYSTEM: nvmlReturn_t = nvmlReturn_t::Err(\n        nvmlError_t::r#OPERATING_SYSTEM,\n    );\n    const ERROR_LIB_RM_VERSION_MISMATCH: nvmlReturn_t = nvmlReturn_t::Err(\n        nvmlError_t::r#LIB_RM_VERSION_MISMATCH,\n    );\n    const ERROR_IN_USE: nvmlReturn_t = nvmlReturn_t::Err(nvmlError_t::r#IN_USE);\n    const ERROR_MEMORY: nvmlReturn_t = nvmlReturn_t::Err(nvmlError_t::r#MEMORY);\n    const ERROR_NO_DATA: nvmlReturn_t = nvmlReturn_t::Err(nvmlError_t::r#NO_DATA);\n    const ERROR_VGPU_ECC_NOT_SUPPORTED: nvmlReturn_t = nvmlReturn_t::Err(\n        nvmlError_t::r#VGPU_ECC_NOT_SUPPORTED,\n    );\n    const ERROR_INSUFFICIENT_RESOURCES: nvmlReturn_t = nvmlReturn_t::Err(\n        nvmlError_t::r#INSUFFICIENT_RESOURCES,\n    );\n    const ERROR_FREQ_NOT_SUPPORTED: nvmlReturn_t = nvmlReturn_t::Err(\n        nvmlError_t::r#FREQ_NOT_SUPPORTED,\n    );\n    const ERROR_ARGUMENT_VERSION_MISMATCH: nvmlReturn_t = nvmlReturn_t::Err(\n        nvmlError_t::r#ARGUMENT_VERSION_MISMATCH,\n    );\n    const ERROR_DEPRECATED: nvmlReturn_t = nvmlReturn_t::Err(nvmlError_t::r#DEPRECATED);\n    const ERROR_NOT_READY: nvmlReturn_t = nvmlReturn_t::Err(nvmlError_t::r#NOT_READY);\n    const ERROR_GPU_NOT_FOUND: nvmlReturn_t = nvmlReturn_t::Err(\n        nvmlError_t::r#GPU_NOT_FOUND,\n    );\n    const ERROR_INVALID_STATE: nvmlReturn_t = nvmlReturn_t::Err(\n        nvmlError_t::r#INVALID_STATE,\n    );\n    const ERROR_RESET_TYPE_NOT_SUPPORTED: nvmlReturn_t = nvmlReturn_t::Err(\n        nvmlError_t::r#RESET_TYPE_NOT_SUPPORTED,\n    );\n    const ERROR_UNKNOWN: nvmlReturn_t = nvmlReturn_t::Err(nvmlError_t::r#UNKNOWN);\n}\nimpl nvmlReturn_tConsts for nvmlReturn_t {}\n#[must_use]\npub type nvmlReturn_t = ::core::result::Result<(), nvmlError_t>;\nconst _: fn() = || {\n    let _ = std::mem::transmute::<nvmlReturn_t, u32>;\n};\n#[cfg(unix)]\nimpl From<rocm_smi_sys::rsmi_error> for nvmlError_t {\n    fn from(error: rocm_smi_sys::rsmi_error) -> Self {\n        match error {\n            rocm_smi_sys::rsmi_error::INVALID_ARGS => nvmlError_t::from(nvmlError_t::INVALID_ARGUMENT),\n            rocm_smi_sys::rsmi_error::NOT_SUPPORTED => nvmlError_t::from(nvmlError_t::NOT_SUPPORTED),\n            rocm_smi_sys::rsmi_error::PERMISSION => nvmlError_t::from(nvmlError_t::NO_PERMISSION),\n            rocm_smi_sys::rsmi_error::INPUT_OUT_OF_BOUNDS => nvmlError_t::from(nvmlError_t::INVALID_ARGUMENT),\n            rocm_smi_sys::rsmi_error::INIT_ERROR => nvmlError_t::from(nvmlError_t::UNINITIALIZED),\n            rocm_smi_sys::rsmi_error::NOT_FOUND => nvmlError_t::from(nvmlError_t::GPU_NOT_FOUND),\n            rocm_smi_sys::rsmi_error::INSUFFICIENT_SIZE => nvmlError_t::from(nvmlError_t::INSUFFICIENT_SIZE),\n            rocm_smi_sys::rsmi_error::INTERRUPT => nvmlError_t::from(nvmlError_t::IRQ_ISSUE),\n            rocm_smi_sys::rsmi_error::NO_DATA => nvmlError_t::from(nvmlError_t::NO_DATA),\n            _ => nvmlError_t::from(nvmlError_t::UNKNOWN),\n        }\n    }\n}"
  },
  {
    "path": "dark_api/Cargo.toml",
    "content": "[package]\nname = \"dark_api\"\nversion = \"0.0.0\"\nedition = \"2021\"\n\n[dependencies]\ncuda_types = { path = \"../cuda_types\" }\nformat = { path = \"../format\" }\nuuid = \"1.16\"\npaste = \"1.0\"\nbit-vec = \"0.8.0\"\ncglue = \"0.3.5\"\nlz4-sys = \"1.9\"\nzstd-safe = { version = \"7.2.4\", features = [\"std\"] }\n"
  },
  {
    "path": "dark_api/src/fatbin.rs",
    "content": "// This file contains a higher-level interface for parsing fatbins\n\nuse std::{borrow::Cow, ptr};\n\nuse cuda_types::dark_api::*;\n\npub enum ParseError {\n    NullPointer(&'static str),\n    UnexpectedBinaryField {\n        field_name: &'static str,\n        observed: u32,\n        expected: Vec<u32>,\n    },\n}\n\nimpl ParseError {\n    pub(crate) fn check_fields<const N: usize, T: Into<u32> + Eq + Copy>(\n        name: &'static str,\n        observed: T,\n        expected: [T; N],\n    ) -> Result<(), Self> {\n        if expected.contains(&observed) {\n            Ok(())\n        } else {\n            let observed = observed.into();\n            let expected = expected.into_iter().map(Into::into).collect();\n            Err(ParseError::UnexpectedBinaryField {\n                field_name: name,\n                expected,\n                observed,\n            })\n        }\n    }\n}\n\npub enum FatbinError {\n    ParseFailure(ParseError),\n    Lz4DecompressionFailure,\n    ZstdDecompressionFailure(usize),\n}\n\npub fn parse_fatbinc_wrapper<T: Sized>(ptr: &*const T) -> Result<&FatbincWrapper, ParseError> {\n    unsafe { ptr.cast::<FatbincWrapper>().as_ref() }\n        .ok_or(ParseError::NullPointer(\"FatbincWrapper\"))\n        .and_then(|ptr| {\n            ParseError::check_fields(\n                \"FATBINC_MAGIC\",\n                ptr.magic,\n                [u32::from_ne_bytes(FatbincWrapper::MAGIC)],\n            )?;\n            ParseError::check_fields(\n                \"FATBINC_VERSION\",\n                ptr.version,\n                [FatbincWrapper::VERSION_V1, FatbincWrapper::VERSION_V2],\n            )?;\n            Ok(ptr)\n        })\n}\n\nfn parse_fatbin_header<T: Sized>(ptr: &*const T) -> Result<&FatbinHeader, ParseError> {\n    unsafe { ptr.cast::<FatbinHeader>().as_ref() }\n        .ok_or(ParseError::NullPointer(\"FatbinHeader\"))\n        .and_then(|ptr| {\n            ParseError::check_fields(\n                \"FATBIN_MAGIC\",\n                ptr.magic,\n                [u32::from_ne_bytes(FatbinHeader::MAGIC)],\n            )?;\n            ParseError::check_fields(\"FATBIN_VERSION\", ptr.version, [FatbinHeader::VERSION])?;\n            Ok(ptr)\n        })\n}\n\n#[derive(Clone, Copy)]\npub struct Fatbin<'a> {\n    pub wrapper: &'a FatbincWrapper,\n}\n\nimpl<'a> Fatbin<'a> {\n    pub fn new<T>(ptr: &'a *const T) -> Result<Self, FatbinError> {\n        let wrapper: &FatbincWrapper =\n            parse_fatbinc_wrapper(ptr).map_err(|e| FatbinError::ParseFailure(e))?;\n\n        Ok(Fatbin { wrapper })\n    }\n\n    pub fn get_submodules(self) -> Result<FatbinIter<'a>, FatbinError> {\n        match self.wrapper.version {\n            FatbincWrapper::VERSION_V2 => Ok(FatbinIter::V2(FatbinSubmoduleIterator {\n                fatbins: self.wrapper.filename_or_fatbins as *const *const std::ffi::c_void,\n                _phantom: std::marker::PhantomData,\n            })),\n            FatbincWrapper::VERSION_V1 => {\n                let header =\n                    parse_fatbin_header(&self.wrapper.data).map_err(FatbinError::ParseFailure)?;\n                Ok(FatbinIter::V1(Some(FatbinSubmodule::new(header))))\n            }\n            version => Err(FatbinError::ParseFailure(\n                ParseError::UnexpectedBinaryField {\n                    field_name: \"FATBINC_VERSION\",\n                    observed: version,\n                    expected: [FatbincWrapper::VERSION_V1, FatbincWrapper::VERSION_V2].into(),\n                },\n            )),\n        }\n    }\n}\n\nunsafe impl Send for Fatbin<'static> {}\nunsafe impl Sync for Fatbin<'static> {}\n\n#[derive(Clone, Copy)]\npub struct FatbinSubmodule<'a> {\n    pub header: &'a FatbinHeader, // TODO: maybe make private\n}\n\nimpl<'a> FatbinSubmodule<'a> {\n    pub fn new(header: &'a FatbinHeader) -> Self {\n        FatbinSubmodule { header }\n    }\n\n    pub fn get_files(&self) -> FatbinFileIterator<'a> {\n        unsafe { FatbinFileIterator::new(self.header) }\n    }\n}\n\npub enum FatbinIter<'a> {\n    V1(Option<FatbinSubmodule<'a>>),\n    V2(FatbinSubmoduleIterator<'a>),\n}\n\nimpl<'a> FatbinIter<'a> {\n    pub fn multi_module(&self) -> bool {\n        matches!(self, FatbinIter::V2(_))\n    }\n\n    pub fn next(&mut self) -> Option<Result<FatbinSubmodule<'a>, ParseError>> {\n        match self {\n            FatbinIter::V1(opt) => Ok(opt.take()).transpose(),\n            FatbinIter::V2(iter) => unsafe { iter.next() },\n        }\n    }\n}\n\npub struct FatbinSubmoduleIterator<'a> {\n    fatbins: *const *const std::ffi::c_void,\n    _phantom: std::marker::PhantomData<&'a FatbinHeader>,\n}\n\nimpl<'a> FatbinSubmoduleIterator<'a> {\n    pub unsafe fn next(&mut self) -> Option<Result<FatbinSubmodule<'a>, ParseError>> {\n        if *self.fatbins != ptr::null() {\n            let header = *self.fatbins as *const FatbinHeader;\n            self.fatbins = self.fatbins.add(1);\n            Some(\n                header\n                    .as_ref()\n                    .ok_or(ParseError::NullPointer(\"FatbinSubmoduleIterator\"))\n                    .map(FatbinSubmodule::new),\n            )\n        } else {\n            None\n        }\n    }\n}\n\n#[derive(Clone, Copy)]\npub struct FatbinFile<'a> {\n    pub header: &'a FatbinFileHeader,\n}\n\nimpl<'a> FatbinFile<'a> {\n    pub fn new(header: &'a FatbinFileHeader) -> Self {\n        Self { header }\n    }\n\n    pub fn kind(&self) -> &'static str {\n        match self.header.kind {\n            FatbinFileHeader::HEADER_KIND_PTX => \"ptx\",\n            FatbinFileHeader::HEADER_KIND_ELF => \"elf\",\n            _ => \"bin\",\n        }\n    }\n\n    pub unsafe fn get_non_compressed_payload(self) -> &'a [u8] {\n        let start = std::ptr::from_ref(self.header)\n            .cast::<u8>()\n            .add(self.header.header_size as usize);\n        std::slice::from_raw_parts(start, self.header.payload_size as usize)\n    }\n\n    pub unsafe fn get_compressed_payload(self) -> &'a [u8] {\n        let start = std::ptr::from_ref(self.header)\n            .cast::<u8>()\n            .add(self.header.header_size as usize);\n        std::slice::from_raw_parts(start, self.header.compressed_size as usize)\n    }\n\n    pub unsafe fn get_or_decompress_content(self) -> Result<Cow<'a, [u8]>, FatbinError> {\n        let mut payload = if self\n            .header\n            .flags\n            .contains(FatbinFileHeaderFlags::CompressedLz4)\n        {\n            Cow::Owned(unsafe { decompress_lz4(self) }?)\n        } else if self\n            .header\n            .flags\n            .contains(FatbinFileHeaderFlags::CompressedZstd)\n        {\n            Cow::Owned(unsafe { decompress_zstd(self) }?)\n        } else {\n            Cow::Borrowed(unsafe { self.get_non_compressed_payload() })\n        };\n\n        // Remove trailing zeros\n        if self.header.kind == FatbinFileHeader::HEADER_KIND_PTX {\n            match payload {\n                Cow::Borrowed(ref mut slice) => {\n                    while slice.last() == Some(&0) {\n                        *slice = &slice[..slice.len() - 1];\n                    }\n                }\n                Cow::Owned(ref mut vec) => {\n                    while vec.last() == Some(&0) {\n                        vec.pop();\n                    }\n                }\n            }\n        }\n        Ok(payload)\n    }\n}\n\npub struct FatbinFileIterator<'a> {\n    file_buffer: &'a [u8],\n}\n\nimpl<'a> FatbinFileIterator<'a> {\n    pub unsafe fn new(header: &'a FatbinHeader) -> Self {\n        let start = std::ptr::from_ref(header)\n            .cast::<u8>()\n            .add(header.header_size as usize);\n        let file_buffer = std::slice::from_raw_parts(start, header.files_size as usize);\n\n        Self { file_buffer }\n    }\n\n    pub unsafe fn next(&mut self) -> Option<Result<FatbinFile<'a>, ParseError>> {\n        if self.file_buffer.len() < std::mem::size_of::<FatbinFileHeader>() {\n            return None;\n        }\n        let this = &*self.file_buffer.as_ptr().cast::<FatbinFileHeader>();\n        let next_element = self\n            .file_buffer\n            .split_at_checked(\n                this.header_size as usize\n                    + u32::max(this.payload_size, this.compressed_size) as usize,\n            )\n            .map(|(_, next)| next);\n        self.file_buffer = next_element.unwrap_or(&[]);\n        Some(\n            ParseError::check_fields(\n                \"FATBIN_FILE_HEADER_VERSION_CURRENT\",\n                this.version,\n                [FatbinFileHeader::HEADER_VERSION_CURRENT],\n            )\n            .map(|_| FatbinFile::new(this)),\n        )\n    }\n}\n\nconst MAX_MODULE_DECOMPRESSION_BOUND: usize = 64 * 1024 * 1024;\n\npub unsafe fn decompress_lz4(file: FatbinFile) -> Result<Vec<u8>, FatbinError> {\n    let decompressed_size = usize::max(1024, file.header.uncompressed_payload as usize);\n    let mut decompressed_vec = vec![0u8; decompressed_size];\n    loop {\n        match lz4_sys::LZ4_decompress_safe(\n            file.get_compressed_payload().as_ptr() as *const _,\n            decompressed_vec.as_mut_ptr() as *mut _,\n            file.header.compressed_size as _,\n            decompressed_vec.len() as _,\n        ) {\n            error if error < 0 => {\n                let new_size = decompressed_vec.len() * 2;\n                if new_size > MAX_MODULE_DECOMPRESSION_BOUND {\n                    return Err(FatbinError::Lz4DecompressionFailure);\n                }\n                decompressed_vec.resize(decompressed_vec.len() * 2, 0);\n            }\n            real_decompressed_size => {\n                decompressed_vec.truncate(real_decompressed_size as usize);\n                return Ok(decompressed_vec);\n            }\n        }\n    }\n}\n\npub unsafe fn decompress_zstd(file: FatbinFile) -> Result<Vec<u8>, FatbinError> {\n    let mut result = Vec::with_capacity(file.header.uncompressed_payload as usize);\n    let payload = file.get_compressed_payload();\n    match zstd_safe::decompress(&mut result, payload) {\n        Ok(actual_size) => {\n            result.truncate(actual_size);\n            Ok(result)\n        }\n        Err(err) => Err(FatbinError::ZstdDecompressionFailure(err)),\n    }\n}\n"
  },
  {
    "path": "dark_api/src/lib.rs",
    "content": "use std::ffi::c_void;\n\nuse cuda_types::cuda::CUuuid;\n\npub mod fatbin;\n\nmacro_rules! dark_api_init {\n    (SIZE_OF, $table_len:literal, $type_:ty) => {\n        (std::mem::size_of::<usize>() * $table_len) as *const std::ffi::c_void\n    };\n    (NULL, $table_len:literal, $type_:ty) => {\n        std::ptr::null()\n    };\n    ($fn_:ident, $table_len:literal, $type_:ty) => {\n        <$type_>::$fn_ as *const std::ffi::c_void\n    };\n}\n\nmacro_rules! dark_api_fn {\n    (SIZE_OF) => { };\n    (NULL) => { };\n    ($fn_:ident ( $($arg_id:ident: $arg_type:ty),* ) -> $ret_type:ty) => {\n        unsafe extern \"system\" fn $fn_(\n            $($arg_id : $arg_type,)*\n        ) -> $ret_type;\n    }\n}\n\nmacro_rules! dark_api_entry {\n    ($idx:literal, SIZE_OF) => { };\n    ($idx:literal, NULL) => { };\n    ($idx:literal, $fn_:ident ( $($arg_id:ident: $arg_type:ty),* ) -> $ret_type:ty) => {\n        #[allow(non_snake_case)]\n        pub unsafe fn $fn_(\n            &self,\n            $($arg_id : $arg_type,)*\n        ) -> $ret_type {\n            let ptr = self.ptr as *const *const std::ffi::c_void;\n            let ptr = ptr.add($idx);\n            let fn_ = std::mem::transmute::<_, unsafe extern \"system\" fn( $($arg_type,)* ) -> $ret_type >(*ptr);\n            (fn_)( $($arg_id,)* )\n        }\n    }\n}\n\nmacro_rules! dark_api_format_args {\n    ($writer:ident; $arg_idx:ident; $first_arg:ident $(, $arg_id:ident)*) => {\n        $writer.write_all(concat!(stringify!($first_arg), \": \").as_bytes())?;\n        format::CudaDisplay::write(& $first_arg, \"\", $arg_idx, $writer)?;\n        $(\n            $arg_idx += 1;\n            $writer.write_all(concat!(\", \", stringify!($arg_id), \": \").as_bytes())?;\n            format::CudaDisplay::write(& $arg_id, \"\", $arg_idx, $writer)?;\n        )*\n    };\n    ($writer:ident; $arg_idx:ident; ) => {\n    };\n}\n\nmacro_rules! dark_api_is_fn {\n    (SIZE_OF) => {\n        false\n    };\n    (NULL) => {\n        false\n    };\n    ($fn_:ident) => {\n        true\n    };\n}\n\nmacro_rules! dark_api_format_fn {\n    (SIZE_OF) => { };\n    (NULL) => { };\n    (#[noformat] $fn_:ident ( $($arg_id:ident: $arg_type:ty),* ) -> $ret_type:ty) => { };\n    ($fn_:ident ( $($arg_id:ident: $arg_type:ty),* ) -> $ret_type:ty) => {\n        pub fn $fn_ (\n            writer: &mut (impl std::io::Write + ?Sized),\n            $($arg_id: $arg_type,)*\n        ) -> std::io::Result<()> {\n            #[allow(unused)]\n            let mut arg_idx = 0usize;\n            writer.write_all(b\"(\")?;\n            dark_api_format_args!(writer; arg_idx; $($arg_id),*);\n            writer.write_all(b\")\")\n        }\n    }\n}\n\nmacro_rules! dark_api {\n    (\n        $mod_name: ident;\n        $(\n            $guid:expr => $name:ident [$len:literal] {\n                $(\n                    $(#[$attr:ident])?\n                    [$index:literal] = $fn_:ident $( ( $($arg_id:ident : $arg_type:ty),* ) -> $ret_type:ty )?\n                ),*\n            }\n        ),+\n    ) => {\n        pub mod $mod_name {\n        #[allow(non_snake_case)]\n        pub struct CudaDarkApiGlobalTable {\n            $(pub $name: [*const std::ffi::c_void; $len],)+\n        }\n\n        impl CudaDarkApiGlobalTable {\n            $(const $name: cuda_types::cuda::CUuuid = cuda_types::cuda::CUuuid { bytes: *uuid::uuid!($guid).as_bytes() };)+\n        }\n\n        unsafe impl Sync for CudaDarkApiGlobalTable {}\n\n        impl CudaDarkApiGlobalTable {\n            pub const fn new<T: CudaDarkApi>() -> Self {\n                let mut result = Self {\n                    $(\n                        $name: [std::ptr::null(); $len],\n                    )+\n                };\n                $(\n                    $( result.$name[$index] =  dark_api_init!($fn_, $len, T); )*\n                )+\n                result\n            }\n\n            pub fn get(&self, key: &cuda_types::cuda::CUuuid) -> Option<crate::DarkApiTable<'_>> {\n                match key {\n                    $(\n                        &Self::$name => {\n                            let fns = &self.$name[..];\n                            let mut valid_fns = bit_vec::BitVec::from_elem($len, false);\n                            $(\n                                valid_fns.set($index, dark_api_is_fn!($fn_) );\n                            )*\n                            Some(crate::DarkApiTable {\n                                fns,\n                                valid_fns\n                            })\n                        }\n                    )+\n                    _ => None\n                }\n            }\n        }\n\n        pub trait CudaDarkApi {\n            $($(\n                dark_api_fn!($fn_ $( ( $($arg_id: $arg_type),* ) -> $ret_type )?);\n            )*)+\n        }\n\n        pub fn guid_to_name(guid: &cuda_types::cuda::CUuuid, index: usize) -> Option<(&'static str, Option<&'static str>)> {\n            let guid = uuid::Uuid::from_bytes(guid.bytes);\n            $(\n                if guid == uuid::uuid!($guid) {\n                    let guid = stringify!($name);\n                    $(\n                        if index == $index {\n                            return Some((guid, Some(stringify!($fn_))));\n                        }\n                    )*\n                    return Some((guid, None));\n                }\n            )+\n            None\n        }\n\n        $(\n            paste::paste! {\n                pub struct [<$name:camel>] {\n                    #[allow(dead_code)]\n                    ptr: *const std::ffi::c_void\n                }\n\n                impl [<$name:camel>] {\n                    pub const GUID: cuda_types::cuda::CUuuid = CudaDarkApiGlobalTable::$name;\n\n                    pub unsafe fn new(ptr: *const std::ffi::c_void) -> Self {\n                        Self {\n                            ptr\n                        }\n                    }\n                    $(\n                        dark_api_entry!($index, $fn_ $( ( $($arg_id: $arg_type),* ) -> $ret_type )?);\n                    )*\n                }\n            }\n        )+\n\n        pub mod format {\n            $($(\n                dark_api_format_fn!($(#[$attr])? $fn_ $( ( $($arg_id: $arg_type),* ) -> $ret_type )? );\n            )*)+\n        }\n        }\n    };\n}\n\npub struct DarkApiTable<'a> {\n    fns: &'a [*const std::ffi::c_void],\n    valid_fns: bit_vec::BitVec,\n}\n\nimpl<'a> DarkApiTable<'a> {\n    pub fn len(&self) -> usize {\n        self.fns.len()\n    }\n\n    pub fn get_fn(&self, idx: usize) -> Option<*const std::ffi::c_void> {\n        if self.valid_fns.get(idx).unwrap_or(false) {\n            Some(self.fns[idx])\n        } else {\n            None\n        }\n    }\n\n    pub fn start(&self) -> *const std::ffi::c_void {\n        self.fns.as_ptr().cast()\n    }\n}\n\ndark_api! {\n    cuda;\n    \"{6BD5FB6C-5BF4-E74A-8987-D93912FD9DF9}\" => CUDART_INTERFACE[13] {\n        [0] = SIZE_OF,\n        [1] = get_module_from_cubin(\n            module: *mut cuda_types::cuda::CUmodule,\n            fatbinc_wrapper: *const cuda_types::dark_api::FatbincWrapper\n        ) -> cuda_types::cuda::CUresult,\n        [2] = cudart_interface_fn2(\n            pctx: *mut cuda_types::cuda::CUcontext,\n            dev: cuda_types::cuda::CUdevice\n        ) -> cuda_types::cuda::CUresult,\n        [6] = get_module_from_cubin_ext1(\n            result: *mut cuda_types::cuda::CUmodule,\n            fatbinc_wrapper: *const cuda_types::dark_api::FatbincWrapper,\n            arg3: *mut std::ffi::c_void,\n            arg4: *mut std::ffi::c_void,\n            arg5: u32\n        ) -> cuda_types::cuda::CUresult,\n        [7] = cudart_interface_fn7(arg1: usize) -> (),\n        [8] = get_module_from_cubin_ext2(\n            fatbin_header: *const cuda_types::dark_api::FatbinHeader,\n            result: *mut cuda_types::cuda::CUmodule,\n            arg3: *mut std::ffi::c_void,\n            arg4: *mut std::ffi::c_void,\n            arg5: u32\n        ) -> cuda_types::cuda::CUresult,\n        // In original CUDA it loads PTX compiler, libnvvm, tileir\n        [12] = load_compilers() -> cuda_types::cuda::CUresult\n    },\n    \"{42D85A81-23F6-CB47-8298-F6E78A3AECDC}\" => TOOLS_TLS[4] {\n        [0] = SIZE_OF\n    },\n    \"{A094798C-2E74-2E74-93F2-0800200C0A66}\" => TOOLS_RUNTIME_CALLBACK_HOOKS[7] {\n        [0] = SIZE_OF,\n        [2] = get_unknown_buffer1(ptr: *mut *mut std::ffi::c_void, size: *mut usize) -> (),\n        [6] = get_unknown_buffer2(ptr: *mut *mut std::ffi::c_void, size: *mut usize) -> ()\n    },\n    \"{C693336E-1121-DF11-A8C3-68F355D89593}\" => CONTEXT_LOCAL_STORAGE_INTERFACE_V0301[4] {\n        [0] = context_local_storage_put(\n            context: cuda_types::cuda::CUcontext,\n            key: *mut std::ffi::c_void,\n            value: *mut std::ffi::c_void,\n            // clsContextDestroyCallback, have to be called on cuDevicePrimaryCtxReset\n            dtor_cb: Option<extern \"system\" fn(\n                cuda_types::cuda::CUcontext,\n                *mut std::ffi::c_void,\n                *mut std::ffi::c_void,\n            )>\n        ) -> cuda_types::cuda::CUresult,\n        [1] = context_local_storage_delete(\n            context: cuda_types::cuda::CUcontext,\n            key: *mut std::ffi::c_void\n        ) -> cuda_types::cuda::CUresult,\n        [2] = context_local_storage_get(\n            value: *mut *mut std::ffi::c_void,\n            cu_ctx: cuda_types::cuda::CUcontext,\n            key: *mut std::ffi::c_void\n        ) -> cuda_types::cuda::CUresult\n    },\n    \"{0CA50B8C-1004-929A-89A7-D0DF10E77286}\" => CTX_CREATE_BYPASS[2] {\n        [0] = SIZE_OF,\n        [1] = ctx_create_v2_bypass(\n            pctx: *mut cuda_types::cuda::CUcontext,\n            flags: ::std::os::raw::c_uint,\n            dev: cuda_types::cuda::CUdevice\n        ) -> cuda_types::cuda::CUresult\n    },\n    \"{195BCBF4-D67D-024A-ACC5-1D29CEA631AE}\" => HEAP_ACCESS[3] {\n        [0] = SIZE_OF,\n        [1] = heap_alloc(\n            heap_alloc_record_ptr: *mut *const std::ffi::c_void, // HeapAllocRecord\n            arg2: usize,\n            arg3: usize\n        ) -> cuda_types::cuda::CUresult,\n        [2] = heap_free(\n            heap_alloc_record_ptr: *const std::ffi::c_void, // HeapAllocRecord\n            arg2: *mut usize\n        ) -> cuda_types::cuda::CUresult\n    },\n    \"{B10541E1-F7C7-C74A-9F64-F223BE99F1E2}\" => DEVICE_EXTENDED_RT[26] {\n        [0] = SIZE_OF,\n        [5] = device_get_attribute_ext(\n            dev: cuda_types::cuda::CUdevice,\n            attribute: std::ffi::c_uint,\n            unknown: std::ffi::c_int,\n            result: *mut [usize; 2]\n        ) -> cuda_types::cuda::CUresult,\n        // I don't know is this function return, but on my GTX 1060 it returns 0\n        [13] = device_get_something(\n            result: *mut std::ffi::c_uchar,\n            dev: cuda_types::cuda::CUdevice\n        ) -> cuda_types::cuda::CUresult\n    },\n    \"{D4082055-BDE6-704B-8D34-BA123C66E1F2}\" => INTEGRITY_CHECK[3] {\n        [0] = SIZE_OF,\n        [1] = integrity_check(\n            version: u32,\n            unix_seconds: u64,\n            result: *mut [u64;2]\n        ) -> cuda_types::cuda::CUresult\n    },\n    // This functions check for some bits that are never observably set\n    \"{263E8860-7CD2-6143-92F6-BBD5006DFA7E}\" => CONTEXT_CHECKS[4] {\n        [0] = SIZE_OF,\n        [2] = context_check(\n            ctx_in: cuda_types::cuda::CUcontext,\n            result1: *mut u32, // seems to be always 0\n            result2: *mut *const std::ffi::c_void\n        ) -> cuda_types::cuda::CUresult,\n        [3] = check_fn3() -> u32 // seeems to always return 0\n    },\n    // On Windows, applications linking to CUDART rely on loading\n    // `nvcudart_hybrid64.dll` and getting `__cudaGetProcAddress`\n    \"{DD9E98A4-F410-4844-99B0-E2AEB7B432B5}\" => HYBRID_CUDART[3] {\n        [0] = SIZE_OF,\n        [1] = hybrid_runtime_load_get_proc_address(\n            name: *const std::ffi::c_char,\n            fn_ptr: *mut *const std::ffi::c_void,\n            token: *mut usize\n        ) -> cuda_types::cuda::CUresult,\n        [2] = hybrid_runtime_free(\n            token: usize\n        ) -> cuda_types::cuda::CUresult\n    }\n}\n\n// Purely for internal use by ZLUDA trace\ndark_api! {\n    zluda_trace;\n    \"{0B7A5827-AF98-46AB-A951-22D19BDF5C08}\" => ZLUDA_TRACE_INTERNAL[1] {\n        #[noformat]\n        [0] = logged_call(\n            fn_name: cglue::slice::CSliceRef<'static, u8>,\n            args: crate::FnFfiRef<crate::ByteVecFfi>,\n            fn_: crate::FnFfiRef<usize>,\n            internal_error: usize,\n            format_status: extern \"C\" fn(usize) -> crate::ByteVecFfi\n        ) -> usize\n    }\n}\n\n#[repr(C)]\npub struct ByteVecFfi {\n    ptr: *mut u8,\n    len: usize,\n    capacity: usize,\n}\n\nimpl ByteVecFfi {\n    pub fn new(mut v: Vec<u8>) -> Self {\n        let (ptr, len, capacity) = (v.as_mut_ptr(), v.len(), v.capacity());\n        std::mem::forget(v);\n        Self { ptr, len, capacity }\n    }\n\n    pub fn to_vec(self) -> Vec<u8> {\n        let vec = unsafe { Vec::from_raw_parts(self.ptr, self.len, self.capacity) };\n        std::mem::forget(self);\n        vec\n    }\n}\n\nimpl Drop for ByteVecFfi {\n    fn drop(&mut self) {\n        // SAFETY: We are dropping the Vec<u8> that we created in `from`\n        // and we know that the pointer is valid.\n        unsafe {\n            let _ = Vec::from_raw_parts(self.ptr, self.len, self.capacity);\n        }\n    }\n}\n\n#[cglue::cglue_trait]\npub trait FnFfi {\n    type Output;\n    fn call(&self) -> Self::Output;\n}\n\n// We use this wrapper instead of implementing `FnFfi` for all T that implement `Fn() -> Output`\n// because cglue machinery already provided blanket implementation of `FnFfi` for its own needs\n// `cglue_trait_ext` does not work with `Fn` traits because they are special\n#[repr(transparent)]\npub struct FnFfiWrapper<Output, T: std::ops::Fn() -> Output>(pub T);\n\nimpl<Output, T: std::ops::Fn() -> Output> FnFfi for FnFfiWrapper<Output, T> {\n    type Output = Output;\n    fn call(&self) -> Output {\n        (self.0)()\n    }\n}\n\npub fn integrity_check(\n    version: u32,\n    unix_seconds: u64,\n    driver_version: u32,\n    current_process: u32,\n    current_thread: u32,\n    integrity_check_table: *const c_void,\n    cudart_table: *const c_void,\n    fn_address: *const c_void,\n    devices: u32,\n    get_device: impl FnMut(u32) -> DeviceHashinfo,\n) -> [u64; 2] {\n    match version % 10 {\n        0 => return [0x3341181C03CB675C, 0x8ED383AA1F4CD1E8],\n        1 => return [0x1841181C03CB675C, 0x8ED383AA1F4CD1E8],\n        _ => {}\n    }\n    // There's first computation pass, but it does not use any input and effectively computes this\n    let pass1_result = [\n        0x14u8, 0x6A, 0xDD, 0xAE, 0x53, 0xA9, 0xA7, 0x52, 0xAA, 0x08, 0x41, 0x36, 0x0B, 0xF5, 0x5A,\n        0x9F,\n    ];\n    let mut result = [0u8; 66];\n    pass2(&mut result, &pass1_result);\n    let pass3_input = Pass3Input {\n        driver_version,\n        version,\n        current_process,\n        current_thread,\n        cudart_table,\n        integrity_check_table,\n        fn_address,\n        unix_seconds,\n    };\n    pass3(&mut result, &pass3_input);\n    pass4(&mut result, devices, get_device);\n    let pass5_1 = pass5(&mut result);\n    zero_result(&mut result);\n    pass6(&mut result, &pass1_result);\n    pass7(&mut result, &pass5_1);\n    pass5(&mut result)\n}\n\nfn pass7(accumulator: &mut [u8; 66], pass5_1: &[u64; 2]) {\n    hash_pass(accumulator, pass5_1, 0);\n}\n\nfn pass6(accumulator: &mut [u8; 66], pass1_result: &[u8; 16]) {\n    hash_pass(accumulator, pass1_result, 0x5c);\n}\n\nfn zero_result(result: &mut [u8; 66]) {\n    for i in 0..16 {\n        result[i] = 0;\n    }\n    for i in 48..66 {\n        result[i] = 0;\n    }\n}\n\nfn pass5(result: &mut [u8; 66]) -> [u64; 2] {\n    let temp = 16u8.wrapping_sub(result[64]);\n    for _ in 0..temp {\n        integrity_check_single_pass(result, temp);\n    }\n    let mut temp_ptr = unsafe { result.as_mut_ptr().add(0x30) };\n    loop {\n        let temp = unsafe { *temp_ptr };\n        temp_ptr = unsafe { temp_ptr.add(1) };\n        integrity_check_single_pass(result, temp);\n        if temp_ptr == unsafe { result.as_mut_ptr().add(0x40) } {\n            break;\n        }\n    }\n    [\n        u64::from_ne_bytes(result[0..8].try_into().unwrap()),\n        u64::from_ne_bytes(result[8..16].try_into().unwrap()),\n    ]\n}\n\n#[repr(C)]\nstruct Pass3Input {\n    driver_version: u32,\n    version: u32,\n    current_process: u32,\n    current_thread: u32,\n    cudart_table: *const c_void,\n    integrity_check_table: *const c_void,\n    fn_address: *const c_void,\n    unix_seconds: u64,\n}\n\n#[repr(C)]\n#[derive(Clone, Copy)]\npub struct DeviceHashinfo {\n    pub guid: CUuuid,\n    pub pci_domain: i32,\n    pub pci_bus: i32,\n    pub pci_device: i32,\n}\n\nfn pass2(accumulator: &mut [u8; 66], pass1_result: &[u8; 16]) {\n    hash_pass(accumulator, pass1_result, 0x36)\n}\n\nfn pass3(accumulator: &mut [u8; 66], mixin: &Pass3Input) {\n    hash_pass(accumulator, mixin, 0)\n}\n\nfn pass4(\n    accumulator: &mut [u8; 66],\n    devices: u32,\n    mut get_device: impl FnMut(u32) -> DeviceHashinfo,\n) {\n    for dev in 0..devices {\n        hash_pass(accumulator, &(get_device)(dev), 0)\n    }\n}\n\nfn hash_pass<T: Sized>(accumulator: &mut [u8; 66], mixin: &T, xor_mask: u8) {\n    for i in 0..std::mem::size_of_val(mixin) {\n        integrity_check_single_pass(\n            accumulator,\n            unsafe { *std::ptr::from_ref(mixin).cast::<u8>().add(i) } ^ xor_mask,\n        );\n    }\n}\n\nfn integrity_check_single_pass(arg1: &mut [u8; 66], arg2: u8) {\n    const MIXING_TABLE: [u8; 256] = [\n        0x29, 0x2E, 0x43, 0xC9, 0xA2, 0xD8, 0x7C, 0x01, 0x3D, 0x36, 0x54, 0xA1, 0xEC, 0xF0, 0x06,\n        0x13, 0x62, 0xA7, 0x05, 0xF3, 0xC0, 0xC7, 0x73, 0x8C, 0x98, 0x93, 0x2B, 0xD9, 0xBC, 0x4C,\n        0x82, 0xCA, 0x1E, 0x9B, 0x57, 0x3C, 0xFD, 0xD4, 0xE0, 0x16, 0x67, 0x42, 0x6F, 0x18, 0x8A,\n        0x17, 0xE5, 0x12, 0xBE, 0x4E, 0xC4, 0xD6, 0xDA, 0x9E, 0xDE, 0x49, 0xA0, 0xFB, 0xF5, 0x8E,\n        0xBB, 0x2F, 0xEE, 0x7A, 0xA9, 0x68, 0x79, 0x91, 0x15, 0xB2, 0x07, 0x3F, 0x94, 0xC2, 0x10,\n        0x89, 0x0B, 0x22, 0x5F, 0x21, 0x80, 0x7F, 0x5D, 0x9A, 0x5A, 0x90, 0x32, 0x27, 0x35, 0x3E,\n        0xCC, 0xE7, 0xBF, 0xF7, 0x97, 0x03, 0xFF, 0x19, 0x30, 0xB3, 0x48, 0xA5, 0xB5, 0xD1, 0xD7,\n        0x5E, 0x92, 0x2A, 0xAC, 0x56, 0xAA, 0xC6, 0x4F, 0xB8, 0x38, 0xD2, 0x96, 0xA4, 0x7D, 0xB6,\n        0x76, 0xFC, 0x6B, 0xE2, 0x9C, 0x74, 0x04, 0xF1, 0x45, 0x9D, 0x70, 0x59, 0x64, 0x71, 0x87,\n        0x20, 0x86, 0x5B, 0xCF, 0x65, 0xE6, 0x2D, 0xA8, 0x02, 0x1B, 0x60, 0x25, 0xAD, 0xAE, 0xB0,\n        0xB9, 0xF6, 0x1C, 0x46, 0x61, 0x69, 0x34, 0x40, 0x7E, 0x0F, 0x55, 0x47, 0xA3, 0x23, 0xDD,\n        0x51, 0xAF, 0x3A, 0xC3, 0x5C, 0xF9, 0xCE, 0xBA, 0xC5, 0xEA, 0x26, 0x2C, 0x53, 0x0D, 0x6E,\n        0x85, 0x28, 0x84, 0x09, 0xD3, 0xDF, 0xCD, 0xF4, 0x41, 0x81, 0x4D, 0x52, 0x6A, 0xDC, 0x37,\n        0xC8, 0x6C, 0xC1, 0xAB, 0xFA, 0x24, 0xE1, 0x7B, 0x08, 0x0C, 0xBD, 0xB1, 0x4A, 0x78, 0x88,\n        0x95, 0x8B, 0xE3, 0x63, 0xE8, 0x6D, 0xE9, 0xCB, 0xD5, 0xFE, 0x3B, 0x00, 0x1D, 0x39, 0xF2,\n        0xEF, 0xB7, 0x0E, 0x66, 0x58, 0xD0, 0xE4, 0xA6, 0x77, 0x72, 0xF8, 0xEB, 0x75, 0x4B, 0x0A,\n        0x31, 0x44, 0x50, 0xB4, 0x8F, 0xED, 0x1F, 0x1A, 0xDB, 0x99, 0x8D, 0x33, 0x9F, 0x11, 0x83,\n        0x14,\n    ];\n    let temp1 = arg1[0x40];\n    arg1[temp1 as usize + 0x10] = arg2;\n    let temp2 = temp1 as usize;\n    let temp3 = (temp1 + 1) & 0xf;\n    arg1[temp1 as usize + 0x20] = arg1[temp2] ^ arg2;\n    let temp4 = MIXING_TABLE[(arg2 ^ arg1[0x41]) as usize];\n    let temp1 = arg1[temp2 + 0x30];\n    arg1[temp2 + 0x30] = temp4 ^ temp1;\n    arg1[0x41] = temp4 ^ temp1;\n    arg1[0x40] = temp3;\n    if temp3 != 0 {\n        return;\n    }\n    let mut temp1 = 0x29;\n    let mut temp5 = 0x0;\n    unsafe {\n        loop {\n            temp1 = temp1 ^ arg1[0];\n            arg1[0] = temp1;\n            let mut temp6 = arg1.as_mut_ptr().add(1);\n            loop {\n                let temp7 = temp6.add(1);\n                temp1 = *temp6 ^ MIXING_TABLE[temp1 as usize];\n                *temp6 = temp1;\n                temp6 = temp7;\n                if temp7 == arg1.as_mut_ptr().add(0x30) {\n                    break;\n                }\n            }\n            temp1 = temp1.wrapping_add(temp5);\n            temp5 = temp5.wrapping_add(0x01);\n            if temp5 == 0x12 {\n                break;\n            }\n            temp1 = MIXING_TABLE[temp1 as usize];\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use std::mem;\n\n    #[test]\n    fn integrity_check_single_pass() {\n        let mut input = [\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x38, 0xc0, 0x9b, 0xf7, 0xff, 0x7f, 0x00, 0x00, 0xa3, 0x61, 0xe4, 0x42,\n            0xf6, 0x67, 0x94, 0xff, 0x18, 0xc0, 0x9b, 0xf7, 0xff, 0x7f, 0x00, 0x00, 0xa4, 0x57,\n            0x72, 0xf7, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n        ];\n        super::integrity_check_single_pass(&mut input, 34);\n        let expected = [\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x22, 0xc0, 0x9b, 0xf7, 0xff, 0x7f, 0x00, 0x00, 0xa3, 0x61, 0xe4, 0x42,\n            0xf6, 0x67, 0x94, 0xff, 0x22, 0xc0, 0x9b, 0xf7, 0xff, 0x7f, 0x00, 0x00, 0xa4, 0x57,\n            0x72, 0xf7, 0xff, 0x7f, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x57,\n        ];\n        assert_eq!(input, expected);\n    }\n\n    #[test]\n    fn integrity_check_pass2() {\n        let pass1_result = [\n            0x14u8, 0x6A, 0xDD, 0xAE, 0x53, 0xA9, 0xA7, 0x52, 0xAA, 0x08, 0x41, 0x36, 0x0B, 0xF5,\n            0x5A, 0x9F,\n        ];\n        let mut result = [0u8; 66];\n        super::pass2(&mut result, &pass1_result);\n        let expected = [\n            0x8b, 0x21, 0x9a, 0x49, 0xe8, 0x6d, 0x1a, 0xee, 0xf2, 0x37, 0xf9, 0xb5, 0x4a, 0x8c,\n            0x3c, 0x75, 0xc7, 0x1e, 0xee, 0x21, 0xcf, 0x29, 0x8a, 0xe5, 0x13, 0x83, 0xf4, 0xec,\n            0x33, 0x04, 0xe2, 0xfd, 0xb0, 0x2f, 0x09, 0x01, 0x4f, 0xf7, 0x68, 0x6d, 0x69, 0x46,\n            0x43, 0x7e, 0xb6, 0x2b, 0x21, 0xed, 0x57, 0xa1, 0x10, 0x86, 0x0e, 0x60, 0x44, 0x1e,\n            0x70, 0x5f, 0x67, 0xd1, 0xeb, 0x67, 0xa1, 0x3d, 0x00, 0x3d,\n        ];\n        assert_eq!(result, expected);\n    }\n\n    #[test]\n    fn integrity_check_pass3() {\n        let mut result = [\n            0x8b, 0x21, 0x9a, 0x49, 0xe8, 0x6d, 0x1a, 0xee, 0xf2, 0x37, 0xf9, 0xb5, 0x4a, 0x8c,\n            0x3c, 0x75, 0xc7, 0x1e, 0xee, 0x21, 0xcf, 0x29, 0x8a, 0xe5, 0x13, 0x83, 0xf4, 0xec,\n            0x33, 0x04, 0xe2, 0xfd, 0xb0, 0x2f, 0x09, 0x01, 0x4f, 0xf7, 0x68, 0x6d, 0x69, 0x46,\n            0x43, 0x7e, 0xb6, 0x2b, 0x21, 0xed, 0x57, 0xa1, 0x10, 0x86, 0x0e, 0x60, 0x44, 0x1e,\n            0x70, 0x5f, 0x67, 0xd1, 0xeb, 0x67, 0xa1, 0x3d, 0x00, 0x3d,\n        ];\n        let input = super::Pass3Input {\n            driver_version: 0x2f30,\n            version: 12082,\n            current_process: 0x002fa423,\n            current_thread: 0xf79c1000,\n            cudart_table: 0x00007ffff6958240 as *const _,\n            integrity_check_table: 0x00007ffff6958220 as *const _,\n            fn_address: 0x00007ffff2aaf4a0 as *const _,\n            unix_seconds: 0x682b9cee,\n        };\n        super::pass3(&mut result, &input);\n        let expected = [\n            0x0a, 0xfd, 0xab, 0xc9, 0xff, 0x9b, 0xa0, 0xbe, 0x4d, 0x30, 0x32, 0x82, 0x74, 0x4f,\n            0xa7, 0x48, 0x9d, 0x23, 0x82, 0xa3, 0x87, 0xfa, 0x6c, 0xdb, 0x92, 0x49, 0xd9, 0xb5,\n            0x4b, 0x2b, 0x5e, 0x51, 0x6e, 0xf7, 0xf9, 0x4d, 0x28, 0x8a, 0x64, 0x06, 0x19, 0xb3,\n            0xe6, 0xbe, 0xa4, 0xec, 0x7e, 0x54, 0x64, 0x28, 0xd9, 0xe1, 0xd4, 0x34, 0xc0, 0xa9,\n            0x49, 0x88, 0xc9, 0x61, 0x58, 0xdd, 0x66, 0x74, 0x00, 0x74,\n        ];\n        assert_eq!(result, expected);\n    }\n\n    #[test]\n    fn integrity_check_pass4() {\n        let mut result = [\n            0x84, 0xfd, 0x93, 0x10, 0xc6, 0xdb, 0xb3, 0xbc, 0x49, 0xc2, 0x25, 0xe7, 0xda, 0x6e,\n            0x22, 0x6f, 0x9b, 0xbd, 0x81, 0x59, 0xc3, 0x01, 0x9a, 0x7a, 0x26, 0x34, 0x39, 0x0f,\n            0x2a, 0x56, 0x13, 0xb1, 0xf6, 0xbc, 0x7f, 0xa1, 0x8f, 0x04, 0xa5, 0x4d, 0x0d, 0x78,\n            0xab, 0x20, 0xf8, 0x23, 0x20, 0xa5, 0x3f, 0x67, 0x36, 0xe2, 0xde, 0x8a, 0xe5, 0xdf,\n            0xe1, 0xf2, 0x03, 0x94, 0xad, 0xdc, 0x9a, 0xda, 0x00, 0xda,\n        ];\n        super::pass4(&mut result, 1, |_| super::DeviceHashinfo {\n            guid: super::CUuuid {\n                bytes: unsafe {\n                    std::mem::transmute([0x8a2bfe9au32, 0x382d25ac, 0xc5ae37ea, 0x5f32716d])\n                },\n            },\n            pci_domain: 0,\n            pci_bus: 2,\n            pci_device: 0,\n        });\n        let expected = [\n            0x1f, 0xd8, 0x25, 0xd2, 0xdf, 0xfa, 0x64, 0xc7, 0xb6, 0x1a, 0xaf, 0x22, 0xb8, 0x79,\n            0xfb, 0x96, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x7c, 0x9d, 0x46, 0xd2, 0x1f, 0xd8, 0x25, 0xd2, 0xdd, 0xfa, 0x64, 0xc7, 0xb6, 0x1a,\n            0xaf, 0x22, 0xe6, 0x17, 0xbd, 0x3a, 0xd7, 0xdd, 0x5f, 0x82, 0x8c, 0x87, 0xce, 0x86,\n            0x66, 0xaf, 0xa0, 0x50, 0x7a, 0x7d, 0xbb, 0xbc, 0x0c, 0x50,\n        ];\n        assert_eq!(result, expected);\n    }\n\n    #[test]\n    fn integrity_check_pass5() {\n        let mut result = [\n            0x3e, 0x4b, 0xf2, 0x95, 0x71, 0xf5, 0x6b, 0x51, 0x07, 0xbf, 0x4b, 0xf1, 0x04, 0x0e,\n            0x8e, 0x0b, 0x5f, 0x4d, 0x30, 0x0c, 0x0f, 0x0c, 0xae, 0xfb, 0x48, 0xaf, 0x23, 0xb5,\n            0xea, 0x4c, 0xc2, 0xdb, 0xd7, 0xdf, 0x88, 0x74, 0x39, 0x58, 0x16, 0x3a, 0x1f, 0x7c,\n            0x9b, 0x20, 0x7e, 0x7e, 0x94, 0xc8, 0x8b, 0xc6, 0xb2, 0x38, 0x0d, 0x07, 0x7d, 0xbd,\n            0x90, 0xd5, 0x39, 0x63, 0xeb, 0x1d, 0x4f, 0x40, 0x00, 0x40,\n        ];\n        let output = super::pass5(&mut result);\n        let expected_result = [\n            0x00, 0x23, 0x53, 0x06, 0x5e, 0x96, 0xf6, 0x9c, 0x61, 0xaa, 0x96, 0x2d, 0x2e, 0xcd,\n            0xa8, 0x58, 0xe9, 0xca, 0xc0, 0x2e, 0x35, 0xed, 0x5f, 0xca, 0xe1, 0x0e, 0xcd, 0x1f,\n            0xd0, 0x8e, 0x8b, 0x9c, 0x29, 0x4d, 0x1c, 0x94, 0x6b, 0xf7, 0x10, 0xb0, 0x07, 0x08,\n            0x91, 0xd6, 0x14, 0x06, 0xc0, 0xec, 0xe1, 0x9c, 0x8e, 0x33, 0xd4, 0xe9, 0x43, 0x5c,\n            0x86, 0x0c, 0x72, 0x4d, 0x27, 0x98, 0x91, 0x7f, 0x00, 0x7f,\n        ];\n        assert_eq!(result, expected_result);\n        let output = unsafe { mem::transmute::<_, [u8; 16]>(output) };\n        let expected = [\n            0x00, 0x23, 0x53, 0x06, 0x5e, 0x96, 0xf6, 0x9c, 0x61, 0xaa, 0x96, 0x2d, 0x2e, 0xcd,\n            0xa8, 0x58,\n        ];\n        assert_eq!(output, expected);\n    }\n}\n"
  },
  {
    "path": "detours-sys/Cargo.toml",
    "content": "[package]\nname = \"detours-sys\"\nversion = \"0.1.2\"\nauthors = [\"Diana <5275194+DianaNites@users.noreply.github.com>\"]\nedition = \"2021\"\nlinks = \"detours\"\n# Package stuff\ndescription = \"Rust bindings to Microsoft Detours\"\ndocumentation = \"https://github.com/microsoft/Detours/wiki/Reference\"\nhomepage = \"https://github.com/DianaNites/detours\"\nrepository = \"https://github.com/DianaNites/detours\"\nreadme = \"README.md\"\nkeywords = [\n    \"detours\",\n    \"hooking\",\n    \"injection\",\n]\ncategories = [\n    \"external-ffi-bindings\",\n    \"os::windows-apis\",\n]\nlicense = \"MIT OR Apache-2.0\"\nexclude = [\n    \"/.vscode/**\"\n]\n\n[badges]\nmaintenance = { status = \"as-is\" }\n\n[dev-dependencies.winapi]\nversion = \"0.3\"\nfeatures = [\n    \"synchapi\",\n    \"processthreadsapi\",\n    \"sysinfoapi\",\n]\n\n[build-dependencies]\ncc = \"1.0\"\n"
  },
  {
    "path": "detours-sys/LICENSE-APACHE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "detours-sys/LICENSE-MIT",
    "content": "Copyright 2019 Diana\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "detours-sys/README.md",
    "content": "# Detours-sys\n\n[![Crates.io](https://img.shields.io/crates/v/detours-sys.svg)](https://crates.io/crates/detours-sys)\n![maintenance-as-is](https://img.shields.io/badge/maintenance-as--is-yellow.svg)\n\nRust bindings to [Microsoft Detours](https://github.com/Microsoft/Detours)\n\n## Usage\n\nSee the [Detours Documentation](https://github.com/Microsoft/Detours/wiki) for details.\n\n## Details\n\nUse the `buildtime_generation` feature to generate bindings at build time,\notherwise use pregenerated bindings.\n\nNote that this will require a relatively recent version of Clang be installed.\n\n## License\n\nLicensed under either of\n\n* Apache License, Version 2.0\n   ([LICENSE-APACHE](LICENSE-APACHE) or <http://www.apache.org/licenses/LICENSE-2.0>)\n* MIT license\n   ([LICENSE-MIT](LICENSE-MIT) or <http://opensource.org/licenses/MIT>)\n\nat your option.\n\n## Contribution\n\nUnless you explicitly state otherwise, any contribution intentionally submitted\nfor inclusion in the work by you, as defined in the Apache-2.0 license, shall be\ndual licensed as above, without any additional terms or conditions.\n"
  },
  {
    "path": "detours-sys/build/wrapper.h",
    "content": "#include <windows.h>\n#include <detours.h>\n"
  },
  {
    "path": "detours-sys/build.rs",
    "content": "#[cfg(not(target_os = \"windows\"))]\nfn main() {}\n\n#[cfg(target_os = \"windows\")]\nfn main() -> Result<(), Box<dyn std::error::Error>> {\n    windows::main_impl()\n}\n\n#[cfg(target_os = \"windows\")]\nmod windows {\n    use std::error::Error;\n\n    const CPP_FILES: [&'static str; 5] = [\n        \"../ext/detours/src/creatwth.cpp\",\n        \"../ext/detours/src/detours.cpp\",\n        \"../ext/detours/src/disasm.cpp\",\n        \"../ext/detours/src/image.cpp\",\n        \"../ext/detours/src/modules.cpp\",\n    ];\n\n    pub fn main_impl() -> Result<(), Box<dyn Error>> {\n        println!(\"cargo:rerun-if-changed=build/wrapper.h\");\n        for f in &CPP_FILES {\n            println!(\"cargo:rerun-if-changed={}\", f);\n        }\n        build_detours()\n    }\n\n    fn build_detours() -> Result<(), Box<dyn Error>> {\n        add_target_options(\n            cc::Build::new()\n                .include(\"../ext/detours/src\")\n                .files(&CPP_FILES),\n        )\n        .try_compile(\"detours\")?;\n        Ok(())\n    }\n    fn add_target_options(build: &mut cc::Build) -> &mut cc::Build {\n        if std::env::var(\"CARGO_CFG_TARGET_ENV\").unwrap() != \"msvc\" {\n            build\n                .compiler(\"clang\")\n                .cpp(true)\n                .flag(\"-fms-extensions\")\n                .flag(\"-Wno-everything\")\n        } else {\n            build\n        }\n    }\n}\n"
  },
  {
    "path": "detours-sys/src/bundled_bindings.rs",
    "content": "/* automatically generated by rust-bindgen 0.56.0 */\n\npub type wchar_t = ::std::os::raw::c_ushort;\npub type ULONG = ::std::os::raw::c_ulong;\npub type DWORD = ::std::os::raw::c_ulong;\npub type BOOL = ::std::os::raw::c_int;\npub type BYTE = ::std::os::raw::c_uchar;\npub type WORD = ::std::os::raw::c_ushort;\npub type LPBYTE = *mut BYTE;\npub type PDWORD = *mut DWORD;\npub type LPVOID = *mut ::std::os::raw::c_void;\npub type LPCVOID = *const ::std::os::raw::c_void;\npub type INT = ::std::os::raw::c_int;\npub type PVOID = *mut ::std::os::raw::c_void;\npub type CHAR = ::std::os::raw::c_char;\npub type LONG = ::std::os::raw::c_long;\npub type WCHAR = wchar_t;\npub type LPWSTR = *mut WCHAR;\npub type LPCWSTR = *const WCHAR;\npub type LPSTR = *mut CHAR;\npub type LPCSTR = *const CHAR;\npub type HANDLE = *mut ::std::os::raw::c_void;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct _GUID {\n    pub Data1: ::std::os::raw::c_ulong,\n    pub Data2: ::std::os::raw::c_ushort,\n    pub Data3: ::std::os::raw::c_ushort,\n    pub Data4: [::std::os::raw::c_uchar; 8usize],\n}\n#[test]\nfn bindgen_test_layout__GUID() {\n    assert_eq!(\n        ::std::mem::size_of::<_GUID>(),\n        16usize,\n        concat!(\"Size of: \", stringify!(_GUID))\n    );\n    assert_eq!(\n        ::std::mem::align_of::<_GUID>(),\n        4usize,\n        concat!(\"Alignment of \", stringify!(_GUID))\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_GUID>())).Data1 as *const _ as usize },\n        0usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_GUID),\n            \"::\",\n            stringify!(Data1)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_GUID>())).Data2 as *const _ as usize },\n        4usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_GUID),\n            \"::\",\n            stringify!(Data2)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_GUID>())).Data3 as *const _ as usize },\n        6usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_GUID),\n            \"::\",\n            stringify!(Data3)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_GUID>())).Data4 as *const _ as usize },\n        8usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_GUID),\n            \"::\",\n            stringify!(Data4)\n        )\n    );\n}\npub type GUID = _GUID;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct HINSTANCE__ {\n    pub unused: ::std::os::raw::c_int,\n}\n#[test]\nfn bindgen_test_layout_HINSTANCE__() {\n    assert_eq!(\n        ::std::mem::size_of::<HINSTANCE__>(),\n        4usize,\n        concat!(\"Size of: \", stringify!(HINSTANCE__))\n    );\n    assert_eq!(\n        ::std::mem::align_of::<HINSTANCE__>(),\n        4usize,\n        concat!(\"Alignment of \", stringify!(HINSTANCE__))\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<HINSTANCE__>())).unused as *const _ as usize },\n        0usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(HINSTANCE__),\n            \"::\",\n            stringify!(unused)\n        )\n    );\n}\npub type HINSTANCE = *mut HINSTANCE__;\npub type HMODULE = HINSTANCE;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct HWND__ {\n    pub unused: ::std::os::raw::c_int,\n}\n#[test]\nfn bindgen_test_layout_HWND__() {\n    assert_eq!(\n        ::std::mem::size_of::<HWND__>(),\n        4usize,\n        concat!(\"Size of: \", stringify!(HWND__))\n    );\n    assert_eq!(\n        ::std::mem::align_of::<HWND__>(),\n        4usize,\n        concat!(\"Alignment of \", stringify!(HWND__))\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<HWND__>())).unused as *const _ as usize },\n        0usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(HWND__),\n            \"::\",\n            stringify!(unused)\n        )\n    );\n}\npub type HWND = *mut HWND__;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct _SECURITY_ATTRIBUTES {\n    pub nLength: DWORD,\n    pub lpSecurityDescriptor: LPVOID,\n    pub bInheritHandle: BOOL,\n}\n#[test]\nfn bindgen_test_layout__SECURITY_ATTRIBUTES() {\n    assert_eq!(\n        ::std::mem::size_of::<_SECURITY_ATTRIBUTES>(),\n        24usize,\n        concat!(\"Size of: \", stringify!(_SECURITY_ATTRIBUTES))\n    );\n    assert_eq!(\n        ::std::mem::align_of::<_SECURITY_ATTRIBUTES>(),\n        8usize,\n        concat!(\"Alignment of \", stringify!(_SECURITY_ATTRIBUTES))\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_SECURITY_ATTRIBUTES>())).nLength as *const _ as usize },\n        0usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_SECURITY_ATTRIBUTES),\n            \"::\",\n            stringify!(nLength)\n        )\n    );\n    assert_eq!(\n        unsafe {\n            &(*(::std::ptr::null::<_SECURITY_ATTRIBUTES>())).lpSecurityDescriptor as *const _\n                as usize\n        },\n        8usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_SECURITY_ATTRIBUTES),\n            \"::\",\n            stringify!(lpSecurityDescriptor)\n        )\n    );\n    assert_eq!(\n        unsafe {\n            &(*(::std::ptr::null::<_SECURITY_ATTRIBUTES>())).bInheritHandle as *const _ as usize\n        },\n        16usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_SECURITY_ATTRIBUTES),\n            \"::\",\n            stringify!(bInheritHandle)\n        )\n    );\n}\npub type LPSECURITY_ATTRIBUTES = *mut _SECURITY_ATTRIBUTES;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct _PROCESS_INFORMATION {\n    pub hProcess: HANDLE,\n    pub hThread: HANDLE,\n    pub dwProcessId: DWORD,\n    pub dwThreadId: DWORD,\n}\n#[test]\nfn bindgen_test_layout__PROCESS_INFORMATION() {\n    assert_eq!(\n        ::std::mem::size_of::<_PROCESS_INFORMATION>(),\n        24usize,\n        concat!(\"Size of: \", stringify!(_PROCESS_INFORMATION))\n    );\n    assert_eq!(\n        ::std::mem::align_of::<_PROCESS_INFORMATION>(),\n        8usize,\n        concat!(\"Alignment of \", stringify!(_PROCESS_INFORMATION))\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_PROCESS_INFORMATION>())).hProcess as *const _ as usize },\n        0usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_PROCESS_INFORMATION),\n            \"::\",\n            stringify!(hProcess)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_PROCESS_INFORMATION>())).hThread as *const _ as usize },\n        8usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_PROCESS_INFORMATION),\n            \"::\",\n            stringify!(hThread)\n        )\n    );\n    assert_eq!(\n        unsafe {\n            &(*(::std::ptr::null::<_PROCESS_INFORMATION>())).dwProcessId as *const _ as usize\n        },\n        16usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_PROCESS_INFORMATION),\n            \"::\",\n            stringify!(dwProcessId)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_PROCESS_INFORMATION>())).dwThreadId as *const _ as usize },\n        20usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_PROCESS_INFORMATION),\n            \"::\",\n            stringify!(dwThreadId)\n        )\n    );\n}\npub type LPPROCESS_INFORMATION = *mut _PROCESS_INFORMATION;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct _STARTUPINFOA {\n    pub cb: DWORD,\n    pub lpReserved: LPSTR,\n    pub lpDesktop: LPSTR,\n    pub lpTitle: LPSTR,\n    pub dwX: DWORD,\n    pub dwY: DWORD,\n    pub dwXSize: DWORD,\n    pub dwYSize: DWORD,\n    pub dwXCountChars: DWORD,\n    pub dwYCountChars: DWORD,\n    pub dwFillAttribute: DWORD,\n    pub dwFlags: DWORD,\n    pub wShowWindow: WORD,\n    pub cbReserved2: WORD,\n    pub lpReserved2: LPBYTE,\n    pub hStdInput: HANDLE,\n    pub hStdOutput: HANDLE,\n    pub hStdError: HANDLE,\n}\n#[test]\nfn bindgen_test_layout__STARTUPINFOA() {\n    assert_eq!(\n        ::std::mem::size_of::<_STARTUPINFOA>(),\n        104usize,\n        concat!(\"Size of: \", stringify!(_STARTUPINFOA))\n    );\n    assert_eq!(\n        ::std::mem::align_of::<_STARTUPINFOA>(),\n        8usize,\n        concat!(\"Alignment of \", stringify!(_STARTUPINFOA))\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOA>())).cb as *const _ as usize },\n        0usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOA),\n            \"::\",\n            stringify!(cb)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOA>())).lpReserved as *const _ as usize },\n        8usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOA),\n            \"::\",\n            stringify!(lpReserved)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOA>())).lpDesktop as *const _ as usize },\n        16usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOA),\n            \"::\",\n            stringify!(lpDesktop)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOA>())).lpTitle as *const _ as usize },\n        24usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOA),\n            \"::\",\n            stringify!(lpTitle)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOA>())).dwX as *const _ as usize },\n        32usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOA),\n            \"::\",\n            stringify!(dwX)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOA>())).dwY as *const _ as usize },\n        36usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOA),\n            \"::\",\n            stringify!(dwY)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOA>())).dwXSize as *const _ as usize },\n        40usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOA),\n            \"::\",\n            stringify!(dwXSize)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOA>())).dwYSize as *const _ as usize },\n        44usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOA),\n            \"::\",\n            stringify!(dwYSize)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOA>())).dwXCountChars as *const _ as usize },\n        48usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOA),\n            \"::\",\n            stringify!(dwXCountChars)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOA>())).dwYCountChars as *const _ as usize },\n        52usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOA),\n            \"::\",\n            stringify!(dwYCountChars)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOA>())).dwFillAttribute as *const _ as usize },\n        56usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOA),\n            \"::\",\n            stringify!(dwFillAttribute)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOA>())).dwFlags as *const _ as usize },\n        60usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOA),\n            \"::\",\n            stringify!(dwFlags)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOA>())).wShowWindow as *const _ as usize },\n        64usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOA),\n            \"::\",\n            stringify!(wShowWindow)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOA>())).cbReserved2 as *const _ as usize },\n        66usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOA),\n            \"::\",\n            stringify!(cbReserved2)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOA>())).lpReserved2 as *const _ as usize },\n        72usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOA),\n            \"::\",\n            stringify!(lpReserved2)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOA>())).hStdInput as *const _ as usize },\n        80usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOA),\n            \"::\",\n            stringify!(hStdInput)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOA>())).hStdOutput as *const _ as usize },\n        88usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOA),\n            \"::\",\n            stringify!(hStdOutput)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOA>())).hStdError as *const _ as usize },\n        96usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOA),\n            \"::\",\n            stringify!(hStdError)\n        )\n    );\n}\npub type LPSTARTUPINFOA = *mut _STARTUPINFOA;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct _STARTUPINFOW {\n    pub cb: DWORD,\n    pub lpReserved: LPWSTR,\n    pub lpDesktop: LPWSTR,\n    pub lpTitle: LPWSTR,\n    pub dwX: DWORD,\n    pub dwY: DWORD,\n    pub dwXSize: DWORD,\n    pub dwYSize: DWORD,\n    pub dwXCountChars: DWORD,\n    pub dwYCountChars: DWORD,\n    pub dwFillAttribute: DWORD,\n    pub dwFlags: DWORD,\n    pub wShowWindow: WORD,\n    pub cbReserved2: WORD,\n    pub lpReserved2: LPBYTE,\n    pub hStdInput: HANDLE,\n    pub hStdOutput: HANDLE,\n    pub hStdError: HANDLE,\n}\n#[test]\nfn bindgen_test_layout__STARTUPINFOW() {\n    assert_eq!(\n        ::std::mem::size_of::<_STARTUPINFOW>(),\n        104usize,\n        concat!(\"Size of: \", stringify!(_STARTUPINFOW))\n    );\n    assert_eq!(\n        ::std::mem::align_of::<_STARTUPINFOW>(),\n        8usize,\n        concat!(\"Alignment of \", stringify!(_STARTUPINFOW))\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOW>())).cb as *const _ as usize },\n        0usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOW),\n            \"::\",\n            stringify!(cb)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOW>())).lpReserved as *const _ as usize },\n        8usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOW),\n            \"::\",\n            stringify!(lpReserved)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOW>())).lpDesktop as *const _ as usize },\n        16usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOW),\n            \"::\",\n            stringify!(lpDesktop)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOW>())).lpTitle as *const _ as usize },\n        24usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOW),\n            \"::\",\n            stringify!(lpTitle)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOW>())).dwX as *const _ as usize },\n        32usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOW),\n            \"::\",\n            stringify!(dwX)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOW>())).dwY as *const _ as usize },\n        36usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOW),\n            \"::\",\n            stringify!(dwY)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOW>())).dwXSize as *const _ as usize },\n        40usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOW),\n            \"::\",\n            stringify!(dwXSize)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOW>())).dwYSize as *const _ as usize },\n        44usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOW),\n            \"::\",\n            stringify!(dwYSize)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOW>())).dwXCountChars as *const _ as usize },\n        48usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOW),\n            \"::\",\n            stringify!(dwXCountChars)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOW>())).dwYCountChars as *const _ as usize },\n        52usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOW),\n            \"::\",\n            stringify!(dwYCountChars)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOW>())).dwFillAttribute as *const _ as usize },\n        56usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOW),\n            \"::\",\n            stringify!(dwFillAttribute)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOW>())).dwFlags as *const _ as usize },\n        60usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOW),\n            \"::\",\n            stringify!(dwFlags)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOW>())).wShowWindow as *const _ as usize },\n        64usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOW),\n            \"::\",\n            stringify!(wShowWindow)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOW>())).cbReserved2 as *const _ as usize },\n        66usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOW),\n            \"::\",\n            stringify!(cbReserved2)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOW>())).lpReserved2 as *const _ as usize },\n        72usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOW),\n            \"::\",\n            stringify!(lpReserved2)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOW>())).hStdInput as *const _ as usize },\n        80usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOW),\n            \"::\",\n            stringify!(hStdInput)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOW>())).hStdOutput as *const _ as usize },\n        88usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOW),\n            \"::\",\n            stringify!(hStdOutput)\n        )\n    );\n    assert_eq!(\n        unsafe { &(*(::std::ptr::null::<_STARTUPINFOW>())).hStdError as *const _ as usize },\n        96usize,\n        concat!(\n            \"Offset of field: \",\n            stringify!(_STARTUPINFOW),\n            \"::\",\n            stringify!(hStdError)\n        )\n    );\n}\npub type LPSTARTUPINFOW = *mut _STARTUPINFOW;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct _DETOUR_TRAMPOLINE {\n    _unused: [u8; 0],\n}\npub type PDETOUR_TRAMPOLINE = *mut _DETOUR_TRAMPOLINE;\n#[doc = \" Binary Typedefs.\"]\npub type PF_DETOUR_BINARY_BYWAY_CALLBACK = ::std::option::Option<\n    unsafe extern \"system\" fn(pContext: PVOID, pszFile: LPCSTR, ppszOutFile: *mut LPCSTR) -> BOOL,\n>;\npub type PF_DETOUR_BINARY_FILE_CALLBACK = ::std::option::Option<\n    unsafe extern \"system\" fn(\n        pContext: PVOID,\n        pszOrigFile: LPCSTR,\n        pszFile: LPCSTR,\n        ppszOutFile: *mut LPCSTR,\n    ) -> BOOL,\n>;\npub type PF_DETOUR_BINARY_SYMBOL_CALLBACK = ::std::option::Option<\n    unsafe extern \"system\" fn(\n        pContext: PVOID,\n        nOrigOrdinal: ULONG,\n        nOrdinal: ULONG,\n        pnOutOrdinal: *mut ULONG,\n        pszOrigSymbol: LPCSTR,\n        pszSymbol: LPCSTR,\n        ppszOutSymbol: *mut LPCSTR,\n    ) -> BOOL,\n>;\npub type PF_DETOUR_BINARY_COMMIT_CALLBACK =\n    ::std::option::Option<unsafe extern \"system\" fn(pContext: PVOID) -> BOOL>;\npub type PF_DETOUR_ENUMERATE_EXPORT_CALLBACK = ::std::option::Option<\n    unsafe extern \"system\" fn(pContext: PVOID, nOrdinal: ULONG, pszName: LPCSTR, pCode: PVOID) -> BOOL,\n>;\npub type PF_DETOUR_IMPORT_FILE_CALLBACK = ::std::option::Option<\n    unsafe extern \"system\" fn(pContext: PVOID, hModule: HMODULE, pszFile: LPCSTR) -> BOOL,\n>;\npub type PF_DETOUR_IMPORT_FUNC_CALLBACK = ::std::option::Option<\n    unsafe extern \"system\" fn(pContext: PVOID, nOrdinal: DWORD, pszFunc: LPCSTR, pvFunc: PVOID) -> BOOL,\n>;\npub type PF_DETOUR_IMPORT_FUNC_CALLBACK_EX = ::std::option::Option<\n    unsafe extern \"system\" fn(\n        pContext: PVOID,\n        nOrdinal: DWORD,\n        pszFunc: LPCSTR,\n        ppvFunc: *mut PVOID,\n    ) -> BOOL,\n>;\npub type PDETOUR_BINARY = *mut ::std::os::raw::c_void;\nextern \"system\" {\n    #[doc = \" Transaction APIs.\"]\n    pub fn DetourTransactionBegin() -> LONG;\n}\nextern \"system\" {\n    pub fn DetourTransactionAbort() -> LONG;\n}\nextern \"system\" {\n    pub fn DetourTransactionCommit() -> LONG;\n}\nextern \"system\" {\n    pub fn DetourTransactionCommitEx(pppFailedPointer: *mut *mut PVOID) -> LONG;\n}\nextern \"system\" {\n    pub fn DetourUpdateThread(hThread: HANDLE) -> LONG;\n}\nextern \"system\" {\n    pub fn DetourAttach(ppPointer: *mut PVOID, pDetour: PVOID) -> LONG;\n}\nextern \"system\" {\n    pub fn DetourAttachEx(\n        ppPointer: *mut PVOID,\n        pDetour: PVOID,\n        ppRealTrampoline: *mut PDETOUR_TRAMPOLINE,\n        ppRealTarget: *mut PVOID,\n        ppRealDetour: *mut PVOID,\n    ) -> LONG;\n}\nextern \"system\" {\n    pub fn DetourDetach(ppPointer: *mut PVOID, pDetour: PVOID) -> LONG;\n}\nextern \"system\" {\n    pub fn DetourSetIgnoreTooSmall(fIgnore: BOOL) -> BOOL;\n}\nextern \"system\" {\n    pub fn DetourSetRetainRegions(fRetain: BOOL) -> BOOL;\n}\nextern \"system\" {\n    pub fn DetourSetSystemRegionLowerBound(pSystemRegionLowerBound: PVOID) -> PVOID;\n}\nextern \"system\" {\n    pub fn DetourSetSystemRegionUpperBound(pSystemRegionUpperBound: PVOID) -> PVOID;\n}\nextern \"system\" {\n    #[doc = \" Code Functions.\"]\n    pub fn DetourFindFunction(pszModule: LPCSTR, pszFunction: LPCSTR) -> PVOID;\n}\nextern \"system\" {\n    pub fn DetourCodeFromPointer(pPointer: PVOID, ppGlobals: *mut PVOID) -> PVOID;\n}\nextern \"system\" {\n    pub fn DetourCopyInstruction(\n        pDst: PVOID,\n        ppDstPool: *mut PVOID,\n        pSrc: PVOID,\n        ppTarget: *mut PVOID,\n        plExtra: *mut LONG,\n    ) -> PVOID;\n}\nextern \"system\" {\n    pub fn DetourSetCodeModule(hModule: HMODULE, fLimitReferencesToModule: BOOL) -> BOOL;\n}\nextern \"system\" {\n    pub fn DetourAllocateRegionWithinJumpBounds(\n        pbTarget: LPCVOID,\n        pcbAllocatedSize: PDWORD,\n    ) -> PVOID;\n}\nextern \"system\" {\n    #[doc = \" Loaded Binary Functions.\"]\n    pub fn DetourGetContainingModule(pvAddr: PVOID) -> HMODULE;\n}\nextern \"system\" {\n    pub fn DetourEnumerateModules(hModuleLast: HMODULE) -> HMODULE;\n}\nextern \"system\" {\n    pub fn DetourGetEntryPoint(hModule: HMODULE) -> PVOID;\n}\nextern \"system\" {\n    pub fn DetourGetModuleSize(hModule: HMODULE) -> ULONG;\n}\nextern \"system\" {\n    pub fn DetourEnumerateExports(\n        hModule: HMODULE,\n        pContext: PVOID,\n        pfExport: PF_DETOUR_ENUMERATE_EXPORT_CALLBACK,\n    ) -> BOOL;\n}\nextern \"system\" {\n    pub fn DetourEnumerateImports(\n        hModule: HMODULE,\n        pContext: PVOID,\n        pfImportFile: PF_DETOUR_IMPORT_FILE_CALLBACK,\n        pfImportFunc: PF_DETOUR_IMPORT_FUNC_CALLBACK,\n    ) -> BOOL;\n}\nextern \"system\" {\n    pub fn DetourEnumerateImportsEx(\n        hModule: HMODULE,\n        pContext: PVOID,\n        pfImportFile: PF_DETOUR_IMPORT_FILE_CALLBACK,\n        pfImportFuncEx: PF_DETOUR_IMPORT_FUNC_CALLBACK_EX,\n    ) -> BOOL;\n}\nextern \"system\" {\n    pub fn DetourFindPayload(hModule: HMODULE, rguid: *const GUID, pcbData: *mut DWORD) -> PVOID;\n}\nextern \"system\" {\n    pub fn DetourFindPayloadEx(rguid: *const GUID, pcbData: *mut DWORD) -> PVOID;\n}\nextern \"system\" {\n    pub fn DetourGetSizeOfPayloads(hModule: HMODULE) -> DWORD;\n}\nextern \"system\" {\n    #[doc = \" Persistent Binary Functions.\"]\n    pub fn DetourBinaryOpen(hFile: HANDLE) -> PDETOUR_BINARY;\n}\nextern \"system\" {\n    pub fn DetourBinaryEnumeratePayloads(\n        pBinary: PDETOUR_BINARY,\n        pGuid: *mut GUID,\n        pcbData: *mut DWORD,\n        pnIterator: *mut DWORD,\n    ) -> PVOID;\n}\nextern \"system\" {\n    pub fn DetourBinaryFindPayload(\n        pBinary: PDETOUR_BINARY,\n        rguid: *const GUID,\n        pcbData: *mut DWORD,\n    ) -> PVOID;\n}\nextern \"system\" {\n    pub fn DetourBinarySetPayload(\n        pBinary: PDETOUR_BINARY,\n        rguid: *const GUID,\n        pData: PVOID,\n        cbData: DWORD,\n    ) -> PVOID;\n}\nextern \"system\" {\n    pub fn DetourBinaryDeletePayload(pBinary: PDETOUR_BINARY, rguid: *const GUID) -> BOOL;\n}\nextern \"system\" {\n    pub fn DetourBinaryPurgePayloads(pBinary: PDETOUR_BINARY) -> BOOL;\n}\nextern \"system\" {\n    pub fn DetourBinaryResetImports(pBinary: PDETOUR_BINARY) -> BOOL;\n}\nextern \"system\" {\n    pub fn DetourBinaryEditImports(\n        pBinary: PDETOUR_BINARY,\n        pContext: PVOID,\n        pfByway: PF_DETOUR_BINARY_BYWAY_CALLBACK,\n        pfFile: PF_DETOUR_BINARY_FILE_CALLBACK,\n        pfSymbol: PF_DETOUR_BINARY_SYMBOL_CALLBACK,\n        pfCommit: PF_DETOUR_BINARY_COMMIT_CALLBACK,\n    ) -> BOOL;\n}\nextern \"system\" {\n    pub fn DetourBinaryWrite(pBinary: PDETOUR_BINARY, hFile: HANDLE) -> BOOL;\n}\nextern \"system\" {\n    pub fn DetourBinaryClose(pBinary: PDETOUR_BINARY) -> BOOL;\n}\n#[doc = \" Create Process & Load Dll.\"]\npub type PDETOUR_CREATE_PROCESS_ROUTINEA = ::std::option::Option<\n    unsafe extern \"system\" fn(\n        lpApplicationName: LPCSTR,\n        lpCommandLine: LPSTR,\n        lpProcessAttributes: LPSECURITY_ATTRIBUTES,\n        lpThreadAttributes: LPSECURITY_ATTRIBUTES,\n        bInheritHandles: BOOL,\n        dwCreationFlags: DWORD,\n        lpEnvironment: LPVOID,\n        lpCurrentDirectory: LPCSTR,\n        lpStartupInfo: LPSTARTUPINFOA,\n        lpProcessInformation: LPPROCESS_INFORMATION,\n    ) -> BOOL,\n>;\npub type PDETOUR_CREATE_PROCESS_ROUTINEW = ::std::option::Option<\n    unsafe extern \"system\" fn(\n        lpApplicationName: LPCWSTR,\n        lpCommandLine: LPWSTR,\n        lpProcessAttributes: LPSECURITY_ATTRIBUTES,\n        lpThreadAttributes: LPSECURITY_ATTRIBUTES,\n        bInheritHandles: BOOL,\n        dwCreationFlags: DWORD,\n        lpEnvironment: LPVOID,\n        lpCurrentDirectory: LPCWSTR,\n        lpStartupInfo: LPSTARTUPINFOW,\n        lpProcessInformation: LPPROCESS_INFORMATION,\n    ) -> BOOL,\n>;\nextern \"system\" {\n    pub fn DetourCreateProcessWithDllA(\n        lpApplicationName: LPCSTR,\n        lpCommandLine: LPSTR,\n        lpProcessAttributes: LPSECURITY_ATTRIBUTES,\n        lpThreadAttributes: LPSECURITY_ATTRIBUTES,\n        bInheritHandles: BOOL,\n        dwCreationFlags: DWORD,\n        lpEnvironment: LPVOID,\n        lpCurrentDirectory: LPCSTR,\n        lpStartupInfo: LPSTARTUPINFOA,\n        lpProcessInformation: LPPROCESS_INFORMATION,\n        lpDllName: LPCSTR,\n        pfCreateProcessA: PDETOUR_CREATE_PROCESS_ROUTINEA,\n    ) -> BOOL;\n}\nextern \"system\" {\n    pub fn DetourCreateProcessWithDllW(\n        lpApplicationName: LPCWSTR,\n        lpCommandLine: LPWSTR,\n        lpProcessAttributes: LPSECURITY_ATTRIBUTES,\n        lpThreadAttributes: LPSECURITY_ATTRIBUTES,\n        bInheritHandles: BOOL,\n        dwCreationFlags: DWORD,\n        lpEnvironment: LPVOID,\n        lpCurrentDirectory: LPCWSTR,\n        lpStartupInfo: LPSTARTUPINFOW,\n        lpProcessInformation: LPPROCESS_INFORMATION,\n        lpDllName: LPCSTR,\n        pfCreateProcessW: PDETOUR_CREATE_PROCESS_ROUTINEW,\n    ) -> BOOL;\n}\nextern \"system\" {\n    pub fn DetourCreateProcessWithDllExA(\n        lpApplicationName: LPCSTR,\n        lpCommandLine: LPSTR,\n        lpProcessAttributes: LPSECURITY_ATTRIBUTES,\n        lpThreadAttributes: LPSECURITY_ATTRIBUTES,\n        bInheritHandles: BOOL,\n        dwCreationFlags: DWORD,\n        lpEnvironment: LPVOID,\n        lpCurrentDirectory: LPCSTR,\n        lpStartupInfo: LPSTARTUPINFOA,\n        lpProcessInformation: LPPROCESS_INFORMATION,\n        lpDllName: LPCSTR,\n        pfCreateProcessA: PDETOUR_CREATE_PROCESS_ROUTINEA,\n    ) -> BOOL;\n}\nextern \"system\" {\n    pub fn DetourCreateProcessWithDllExW(\n        lpApplicationName: LPCWSTR,\n        lpCommandLine: LPWSTR,\n        lpProcessAttributes: LPSECURITY_ATTRIBUTES,\n        lpThreadAttributes: LPSECURITY_ATTRIBUTES,\n        bInheritHandles: BOOL,\n        dwCreationFlags: DWORD,\n        lpEnvironment: LPVOID,\n        lpCurrentDirectory: LPCWSTR,\n        lpStartupInfo: LPSTARTUPINFOW,\n        lpProcessInformation: LPPROCESS_INFORMATION,\n        lpDllName: LPCSTR,\n        pfCreateProcessW: PDETOUR_CREATE_PROCESS_ROUTINEW,\n    ) -> BOOL;\n}\nextern \"system\" {\n    pub fn DetourCreateProcessWithDllsA(\n        lpApplicationName: LPCSTR,\n        lpCommandLine: LPSTR,\n        lpProcessAttributes: LPSECURITY_ATTRIBUTES,\n        lpThreadAttributes: LPSECURITY_ATTRIBUTES,\n        bInheritHandles: BOOL,\n        dwCreationFlags: DWORD,\n        lpEnvironment: LPVOID,\n        lpCurrentDirectory: LPCSTR,\n        lpStartupInfo: LPSTARTUPINFOA,\n        lpProcessInformation: LPPROCESS_INFORMATION,\n        nDlls: DWORD,\n        rlpDlls: *mut LPCSTR,\n        pfCreateProcessA: PDETOUR_CREATE_PROCESS_ROUTINEA,\n    ) -> BOOL;\n}\nextern \"system\" {\n    pub fn DetourCreateProcessWithDllsW(\n        lpApplicationName: LPCWSTR,\n        lpCommandLine: LPWSTR,\n        lpProcessAttributes: LPSECURITY_ATTRIBUTES,\n        lpThreadAttributes: LPSECURITY_ATTRIBUTES,\n        bInheritHandles: BOOL,\n        dwCreationFlags: DWORD,\n        lpEnvironment: LPVOID,\n        lpCurrentDirectory: LPCWSTR,\n        lpStartupInfo: LPSTARTUPINFOW,\n        lpProcessInformation: LPPROCESS_INFORMATION,\n        nDlls: DWORD,\n        rlpDlls: *mut LPCSTR,\n        pfCreateProcessW: PDETOUR_CREATE_PROCESS_ROUTINEW,\n    ) -> BOOL;\n}\nextern \"system\" {\n    pub fn DetourProcessViaHelperA(\n        dwTargetPid: DWORD,\n        lpDllName: LPCSTR,\n        pfCreateProcessA: PDETOUR_CREATE_PROCESS_ROUTINEA,\n    ) -> BOOL;\n}\nextern \"system\" {\n    pub fn DetourProcessViaHelperW(\n        dwTargetPid: DWORD,\n        lpDllName: LPCSTR,\n        pfCreateProcessW: PDETOUR_CREATE_PROCESS_ROUTINEW,\n    ) -> BOOL;\n}\nextern \"system\" {\n    pub fn DetourProcessViaHelperDllsA(\n        dwTargetPid: DWORD,\n        nDlls: DWORD,\n        rlpDlls: *mut LPCSTR,\n        pfCreateProcessA: PDETOUR_CREATE_PROCESS_ROUTINEA,\n    ) -> BOOL;\n}\nextern \"system\" {\n    pub fn DetourProcessViaHelperDllsW(\n        dwTargetPid: DWORD,\n        nDlls: DWORD,\n        rlpDlls: *mut LPCSTR,\n        pfCreateProcessW: PDETOUR_CREATE_PROCESS_ROUTINEW,\n    ) -> BOOL;\n}\nextern \"system\" {\n    pub fn DetourUpdateProcessWithDll(hProcess: HANDLE, rlpDlls: *mut LPCSTR, nDlls: DWORD)\n        -> BOOL;\n}\nextern \"system\" {\n    pub fn DetourUpdateProcessWithDllEx(\n        hProcess: HANDLE,\n        hImage: HMODULE,\n        bIs32Bit: BOOL,\n        rlpDlls: *mut LPCSTR,\n        nDlls: DWORD,\n    ) -> BOOL;\n}\nextern \"system\" {\n    pub fn DetourCopyPayloadToProcess(\n        hProcess: HANDLE,\n        rguid: *const GUID,\n        pvData: PVOID,\n        cbData: DWORD,\n    ) -> BOOL;\n}\nextern \"system\" {\n    pub fn DetourRestoreAfterWith() -> BOOL;\n}\nextern \"system\" {\n    pub fn DetourRestoreAfterWithEx(pvData: PVOID, cbData: DWORD) -> BOOL;\n}\nextern \"system\" {\n    pub fn DetourIsHelperProcess() -> BOOL;\n}\nextern \"system\" {\n    pub fn DetourFinishHelperProcess(arg1: HWND, arg2: HINSTANCE, arg3: LPSTR, arg4: INT);\n}\n"
  },
  {
    "path": "detours-sys/src/lib.rs",
    "content": "#![cfg(target_os = \"windows\")]\n\n//! Bindings to the Microsoft Detours API.\n#![allow(non_camel_case_types)]\n#![allow(non_snake_case)]\n\n// Rebuild with:\n// bindgen ..\\build\\wrapper.h --whitelist-function \"Detour.*\" -o bundled_bindings.rs  -- \"-fms-compatibility\" \"-fms-extensions\" --target=x86_64-pc-windows-msvc -I ..\\..\\ext\\detours\\src\\\ninclude!(\"bundled_bindings.rs\");\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use std::{ffi, ptr};\n    use winapi::{\n        shared::minwindef::LPVOID,\n        um::{processthreadsapi::GetCurrentThread, synchapi::Sleep, sysinfoapi::GetTickCount},\n    };\n\n    static mut TRUE_SLEEP: unsafe extern \"system\" fn(DWORD) = Sleep;\n    static mut SLEPT: LONG = 0;\n\n    // Detour function that replaces the Sleep API.\n    unsafe extern \"system\" fn TimedSleep(dwMilliseconds: DWORD) {\n        // Save the before and after times around calling the Sleep API.\n        let dwBeg: DWORD = GetTickCount();\n        TRUE_SLEEP(dwMilliseconds);\n        let dwEnd: DWORD = GetTickCount();\n\n        SLEPT = (dwEnd - dwBeg) as i32;\n    }\n\n    extern \"system\" fn DllMain(_: HINSTANCE, reason: DWORD, _: LPVOID) -> BOOL {\n        if unsafe { DetourIsHelperProcess() } == 1 {\n            return 1;\n        }\n\n        let tru = unsafe { &mut TRUE_SLEEP as *mut _ as *mut *mut ffi::c_void };\n        let new = TimedSleep as *mut ffi::c_void;\n\n        match reason {\n            // DLL_PROCESS_ATTACH\n            1 => unsafe {\n                DetourRestoreAfterWith();\n\n                DetourTransactionBegin();\n                DetourUpdateThread(GetCurrentThread() as _);\n                DetourAttach(tru, new);\n                DetourTransactionCommit();\n            },\n            // DLL_PROCESS_DETACH\n            0 => unsafe {\n                DetourTransactionBegin();\n                DetourUpdateThread(GetCurrentThread() as _);\n                DetourDetach(tru, new);\n                DetourTransactionCommit();\n            },\n            _ => (),\n        }\n        1\n    }\n\n    #[test]\n    fn hook_self() {\n        unsafe {\n            DllMain(ptr::null_mut(), 1, ptr::null_mut());\n            let slept;\n\n            Sleep(500);\n            slept = SLEPT;\n            assert_ne!(SLEPT, 0);\n\n            DllMain(ptr::null_mut(), 0, ptr::null_mut());\n            Sleep(500);\n            assert_eq!(slept, SLEPT);\n        }\n    }\n}\n"
  },
  {
    "path": "docs/.gitignore",
    "content": "book\n"
  },
  {
    "path": "docs/.readthedocs.yaml",
    "content": "version: 2\nbuild:\n  os: ubuntu-lts-latest\n  tools:\n    rust: latest\n  jobs:\n    install:\n      - cargo install mdbook@0.5.2 --root .\n    build:\n      html:\n        - PATH=$PATH:./bin mdbook build docs --dest-dir $READTHEDOCS_OUTPUT/html\n"
  },
  {
    "path": "docs/book.toml",
    "content": "[book]\nauthors = [\"Andrzej Janik\"]\nlanguage = \"en\"\nsrc = \"src\"\ntitle = \"ZLUDA\"\n"
  },
  {
    "path": "docs/src/SUMMARY.md",
    "content": "# Summary\n\n# General\n- [Quick start](./quick_start.md)\n- [Installing HIP SDK](./hip_sdk.md)\n- [FAQ](./faq.md)\n\n# Troubleshooting\n- [Logging (general issues)](./troubleshooting.md)\n- [Precompiling (slow start)](./precompiling.md)\n\n# Applications\n  - [llama.cpp](./llama_cpp.md)\n\n# For developers\n- [Building from source](./building.md)\n"
  },
  {
    "path": "docs/src/building.md",
    "content": "# Building\n\n## Dependencies\n\n* Git\n* CMake\n* Python 3\n* Rust compiler (recent version)\n* C++ compiler\n* (Linux only) HIP ([instructions here](https://rocm.docs.amd.com/projects/HIP/en/latest/install/install.html))\n* (Optional, but recommended) [Ninja build system](https://ninja-build.org/)\n\n## Build steps\n\n* Git clone the repo (make sure to use `--recursive` option to fetch submodules):\\\n`git clone --recursive https://github.com/vosen/ZLUDA.git`\n* Enter freshly cloned `ZLUDA` directory and build with cargo (this takes a while):\n  * `cargo xtask --release` for Release build\n  * `cargo xtask` for Debug build\n"
  },
  {
    "path": "docs/src/faq.md",
    "content": "# FAQ\n\n> [!WARNING]\n> For legal reasons we can't help you with the pre-rollback versions (older than 4). See more here: [https://www.theregister.com/2024/08/09/amd_zluda_take_down](https://www.theregister.com/2024/08/09/amd_zluda_take_down/)\n\n## General\n\n1. How I can donate to ZLUDA development?\n\n    The ZLUDA project is fully funded and only accepts donations of labor.\n\n1. What organization is funding ZLUDA development?\n\n    This will be revealed in due time.\n\n1. How can I follow ZLUDA's progress\n\n   * Join our [Discord](https://discord.gg/sg6BNzXuc7)\n   * Every quarter we publish a progress report on [ZLUDA's blog](https://vosen.github.io/ZLUDA/)\n\n\n## Hardware\n\n1. AMD GPU support?\n\n     ZLUDA supports AMD Radeon RX 5000 series and newer GPUs (both desktop and integrated).\n     Older consumer GPUs (Polaris, Vega, etc.) and server‑class GPUs are not supported; these architectures differ significantly from recent desktop GPUs and would require substantial engineering effort.\n     We expect that the near-future unified GPU architecture (UDNA) will be more similar to desktop GPUs.\n\n1. Intel GPU support?\n\n    ZLUDA previously supported Intel GPUs, but not currently. It is possible to revive the Intel backend. The development team is focusing on high‑quality AMD GPU support and welcomes contributions.\n\n1. NVIDIA GPU support?\n\n    Unlikely to ever be on the roadmap, because NVIDIA users can use the original CUDA. That said, if someone wants to add support we are open to contributions.\n\n1. Qualcomm GPU support?\n\n    It would be interesting to have Qualcomm GPU support, but the development team is focusing on high‑quality AMD GPU support. We welcome contributions.\n\n1. macOS support?\n\n    Unlikely to ever happen. There is very little non‑deprecated CUDA software for macOS, and what remains will soon be unsupported.\n\n1. ZLUDA on top of OpenCL or Vulkan?\n\n    ZLUDA could be ported to OpenCL or Vulkan, but with significantly reduced functionality. This might be acceptable for a narrow use case, but it would not be as general‑purpose as using the native backend. Examples of features available with the current compilation path that are not exposed by either Vulkan or OpenCL:\n   * Disabling FP contraction\n   * Explicit alignment\n   * Some subgroup and group operations\n   * Bindless images\n   * Pointer casts\n   * Arbitrary virtual calls\n   * Inline assembly\n   * Rounding modes\n   * Denormal modes\n\n    Additionally, performance libraries (cuBLAS, cuDNN, etc.) cannot be easily mapped through Vulkan or OpenCL.\n\n# Software\n\n1. PyTorch support?\n\n    PyTorch support is currently our top priority. We expect to have initial support fourth quarter of 2025.\n\n1. Tensorflow support?\n\n   Tensorflow support is currently a top priority for ZLUDA and will follow PyTorch support.\n\n1. Blender support\n\n    Blender is not on the roadmap, but it's often requested. Support might be added at certain point, but it's a low priority. If ZLUDA supports Blender, it will not support hardware ray-tracing (see _Hardware ray-tracing (OptiX) support?_ section below).\n\n1. Hardware ray-tracing (OptiX) support?\n\n    OptiX support is exceedingly complex. While it's built on top of CUDA, it uses its own dialect of PTX, uses its own host code and requires its own specific optimizations. It's unlikely that ZLUDA will ever support OptiX again. OptiX would require a very dedicated contributor (or team of contributors) to step in.\n\n1. Support for games using 32 bit PhysX?\n\n   We are convinced that it's possible (both for AMD GPUs and NVIDIA GPUs). Necessary groundwork has been done (log collection) and there is a plan how to implement the feature. It's not on the roadmap and we are hoping for outside contributors to step in.\n\n1. Support for games using 64 bit PhysX (GameWorks)?\n\n    It is definitely possible, pre-rollback ZLUDA had this capability. It's not on the roadmap and would require outside contributions.\n\n1. DLSS support?\n\n    Previously DLSS support was blocked by a missing functionality in AMD's Direct3D driver: ability to enqueue HIP kernels into Direct3D command list. This functionality now ships in the newest driver and DLSS support should be possible. It's not on our roadmap, but if someone steps in to implement it, we'd be happy to merge.\n"
  },
  {
    "path": "docs/src/hip_sdk.md",
    "content": "# Installing HIP SDK\n\nOn Windows, in addition to installing the GPU driver, you need to install the HIP SDK. Choose one of the two options below:\n\n<table width=\"100%\">\n<tr >\n<th> Official HIP SDK </th>\n<th> Unofficial HIP SDK builds </th>\n</tr>\n<tr/>\n<tr>\n<td style=\"width: 50%;border:none;vertical-align: top\">\n\n✅ Automatic installation\\\n✅ Stable and supported by AMD\\\n❌ Older code\\\n❌ No Machine Learning support (PyTorch and TensorFlow will not work)\n\n### Installation\n\n1. Visit the [AMD HIP SDK for Windows](https://www.amd.com/en/developer/resources/rocm-hub/hip-sdk.html) website\n2. Download the latest version for your OS\n3. Run the installer and follow the on-screen instructions\n\n</td>\n<td style=\"width: 50%;border:none;vertical-align: top\">\n\n❌ Manual installation\\\n❌ Unstable and unsupported by AMD\\\n✅ Newer code\\\n✅ Machine Learning support (required for PyTorch, TensorFlow, etc.)\n\n### Installation\n\n1. Visit the [ROCm SDK nightly tarballs](https://therock-nightly-tarball.s3.amazonaws.com/index.html) website\n2. Download a recent `therock-dist-windows-gfx<GPUARCH>...tar.gz` file:\n   - If you don't know your `<GPUARCH>`, check the TechPowerUp GPU database. Example: for [AMD Radeon RX 9070](https://www.techpowerup.com/gpu-specs/radeon-rx-9070.c4250), the `<GPUARCH>` (Shader ISA) is 1201\n   - Alternatively, download any `tar.gz` file, unpack it and run the included `hipInfo.exe` to determine your `<GPUARCH>` (gcnArchName)\n3. Extract the `.tar.gz` file to a directory of your choice (you can use [7-Zip](https://www.7-zip.org/))\n   - Note: You may need to extract twice (first the `.tar.gz`, then the `.tar` file)\n4. Set the `HIP_PATH` environment variable to the extracted directory path ([instructions here](https://www.tenforums.com/tutorials/121855-edit-user-system-environment-variables-windows.html))\n   - The directory must contain a `bin` subdirectory\n   - The `bin` directory must contain various `.dll` files, including `rocblas.dll`\n\n</td>\n</tr>\n</table>\n\n## Verification\n\nZLUDA includes a small CUDA application that tests the loading and initialization of all performance libraries. Run it using:\n\n```\nzluda.exe -- cuda_check.exe\n```\n\nThe output should look like this:\n\n```\nnvcuda    : OK (C:\\hip_sdk\\bin\\amdhip64_7.dll)\nnvml      : OK\ncufft11   : OK\ncudnn9    : OK (C:\\hip_sdk\\bin\\MIOpen.dll)\ncudnn8    : OK (C:\\hip_sdk\\bin\\MIOpen.dll)\ncublaslt13: OK (C:\\hip_sdk\\bin\\libhipblaslt.dll)\ncusparse12: OK\ncufft12   : OK\ncublas13  : OK (C:\\hip_sdk\\bin\\rocblas.dll)\ncublaslt12: OK (C:\\hip_sdk\\bin\\libhipblaslt.dll)\ncublas12  : OK (C:\\hip_sdk\\bin\\rocblas.dll)\ncusparse11: OK\n```\n\nThe path in parentheses is the path to the underlying HIP SDK library.\n\n**Caveats and Known Issues:**\n- The path shown in parentheses indicates the underlying HIP SDK library, but is not guaranteed to be used. If an application loads the library from a different path before loading ZLUDA, ZLUDA will use the already-loaded library instead\n- `cuda_check.exe` may sometimes hang and not close due to a bug in MIOpen\n- When using the official HIP SDK, `cuda_check.exe` will fail to load `cudnn8` and `cudnn9` because the official SDK does not include MIOpen\n\n"
  },
  {
    "path": "docs/src/llama_cpp.md",
    "content": "# llama.cpp\n\nllama.cpp runs at native speed when compiled for CUDA architecture 86 and with cuBLAS enabled:\n```\ncmake -B build -DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES=\"86\" -DGGML_CUDA_FORCE_CUBLAS=true\n```\n\nCompiling for multiple CUDA architectures should be fine as long as one of the architectures is 80, 86 or 89.  \nCompiling with cuBLAS disabled might lead to performance degradation.\n\n## Windows\nYou need to install [HIP SDK](hip_sdk.html) to have access to rocBLAS"
  },
  {
    "path": "docs/src/precompiling.md",
    "content": "# Precompiling\n\nConsider precompiling the GPU code with `zluda_precompile` if you are trying to run a large application.\n`zluda_precompile` scans the location, extracts all the GPU code, compiles it, and saves it to the cache.\nThis way, the GPU code is already in the cache when the application is launched for the first time.\n\nThis process uses all the threads on the machine (making it faster than leaving it to the application) and may compile more code than is necessary for your application (making it potentially slower than leaving it to the application). Your mileage might vary.\n\n## Usage:\n\nWindows:\n```\nzluda_precompile.exe <PATH>\n```\nLinux:\n```\nzluda_precompile <PATH>\n```\n\n\nwhere `<PATH>` is the path to the directory or file."
  },
  {
    "path": "docs/src/quick_start.md",
    "content": "# Quick start\n\n> [!WARNING]\n> This version of ZLUDA is under heavy development and will likely not work with your application yet. In the meantime, you are encouraged to try it and report results.\n\n## How to get it\n\nZLUDA evolves quickly, we recommend downloading the [most recent pre-release version](https://github.com/vosen/ZLUDA/releases).\nPeriodically, we mark a pre-release version as stable, you can download it from the \"Releases\" section on our [Github page](https://github.com/vosen/ZLUDA).\n\n\n## Usage\n\n### Windows\nYou should have a recent AMD GPU driver (\"AMD Software: Adrenalin Edition\") and [HIP SDK](hip_sdk.html) installed.\\\nTo run your application either:\n* (_Recommended_) Use ZLUDA launcher:\n    ```\n    <ZLUDA_DIRECTORY>\\zluda.exe -- <APPLICATION> <APPLICATION_ARGUMENTS>\n    ```\n* Copy all ZLUDA files (including `nvcuda.dll`) from `zluda` (if you downloaded a zip package) or `target\\release` (if you built from sources) into a path which your application uses to load CUDA. Paths vary application to application, but usually it's the directory where the .exe file is located\n\n\n### Linux\n\nRun your application like this:\n* Recommended method\n    ```\n    LD_LIBRARY_PATH=\"<ZLUDA_DIRECTORY>:$LD_LIBRARY_PATH\" <APPLICATION> <APPLICATION_ARGUMENTS>\n    ```\n\n    where `<ZLUDA_DIRECTORY>` is the directory which contains ZLUDA-provided `libcuda.so`: `zluda` if you downloaded a prebuilt package or `target/release` if you built from sources.\n\n* Alternative method\n    ```\n    LD_AUDIT=\"<ZLUDA_DIRECTORY>/zluda_ld:$LD_AUDIT\" <APPLICATION> <APPLICATION_ARGUMENTS>\n    ```\n\n    where `<ZLUDA_DIRECTORY>` is the directory which contains ZLUDA-provided `libcuda.so`: `zluda` if you downloaded a prebuilt package or `target/release` if you built from sources.\n\n\n\n### macOS\n\nNot supported\n"
  },
  {
    "path": "docs/src/troubleshooting.md",
    "content": "# Logging\n\n## Introduction\n\nzluda_trace is a [shim](https://en.wikipedia.org/wiki/Shim_(computing))\nfor the CUDA API which traces application's CUDA usage. If your application is\nencountering issues with ZLUDA, you should use zluda_trace to find out where and\nwhy ZLUDA fails.\n\n## Quick Start\n\n### Linux\n\nRun your application like this:\n\n#### AMD GPU:\n\n```bash\nZLUDA_CUDA_LIB=<ZLUDA_DIRECTORY>/libcuda.so LD_LIBRARY_PATH=<ZLUDA_DIRECTORY>/trace/ \\\nZLUDA_LOG_DIR=<LOG_DIRECTORY> <APPLICATION> <APPLICATION_ARGUMENTS>\n```\n\n#### NVIDIA GPU:\n\n```bash\nLD_LIBRARY_PATH=<ZLUDA_DIRECTORY>/trace/ \\\nZLUDA_LOG_DIR=<LOG_DIRECTORY> <APPLICATION> <APPLICATION_ARGUMENTS>\n```\n\nIf you're [filing a GitHub\nissue](https://github.com/vosen/ZLUDA/issues/new/choose), please create\nan archive with your logs from `<LOG_DIRECTORY>` and attach it to the issue:\n\n\n```bash\ntar -cvf logs.tar.gz -C <LOG_DIRECTORY> .\n```\n\n### Windows\n\nRun your application like this:\n\n#### AMD GPU:\n\n```bash\nzluda.exe --zluda-trace -- <APPLICATION> <APPLICATION_ARGUMENTS>\n```\n\n#### NVIDIA GPU:\n\n```bash\nzluda.exe --nvidia-trace -- <APPLICATION> <APPLICATION_ARGUMENTS>\n```\n\nThis will create a new directory with executable name with the log output in `C:\\Users\\%USERNAME%\\AppData\\Local\\Temp\\zluda` (`%TEMP%\\zluda`).\n\nIf you're [filing a GitHub\nissue](https://github.com/vosen/ZLUDA/issues/new/choose), please create\na .zip file with your logs from `C:\\Users\\%USERNAME%\\AppData\\Local\\Temp\\zluda` to attach to the\nissue. In Windows Explorer, right click on the directory  and select\n\"Send to\"/\"Compressed (zipped) folder\". Exact steps may vary between\nWindows versions.\n\n### Explanation\n\n#### `LD_LIBRARY_PATH=<ZLUDA_DIRECTORY>/trace/`\n\n`<ZLUDA_DIRECTORY>` is the directory that contains the ZLUDA driver (`libcuda.so`\nand various other libraries). It will be `target/release` if you built from\nsource, or `zluda` if you downloaded one of the release packages. `<ZLUDA_DIRECTORY>/trace`\ncontains tracing shims for `libcuda.so` (zluda_trace) and other CUDA libraries.\n\n> [!NOTE]\n> `LD_LIBRARY_PATH` is an environment variable used by `ld`, Linux's dynamic linker. It tells `ld` that when it's looking for a shared library – for example, `libcuda.so` – it should first look in a specific list of directories, before system paths. It's just like `PATH`, but for shared libraries instead of executables.\n\n#### `ZLUDA_CUDA_LIB=<ZLUDA_DIRECTORY>/libcuda.so`\n\nBy default, zluda_trace will log all calls and then redirect them to an actual\nCUDA driver (`libcuda.so`). In order to use ZLUDA, `ZLUDA_CUDA_LIB` must be set\nto the `libcuda.so` provided by ZLUDA. If `ZLUDA_CUDA_LIB` is not set,\nzluda_trace will use NVIDIA’s `libcuda.so`.\n\n#### `ZLUDA_LOG_DIR=<LOG_DIRECTORY>`\n\nBy default, zluda_trace prints logs to stderr. In order to save them to a\nfile, as well as save other useful information, you must provide a\ndirectory that they should be saved in – for example, `/tmp/zluda`.\n\n## Understanding the zluda_trace output\n\nLet's look at the zluda_trace output for a simple application. Here's a\nCUDA program that adds two numbers on the GPU:\n\n```cpp,linenos\n#include <iostream>\n\n__global__ void add(int a, int b, int *out) {\n    *out = a + b;\n}\n\nint main() {\n    int *result;\n    cudaMallocManaged(&result, sizeof(int));\n    add<<<1, 1>>>(1, 2, result);\n    cudaDeviceSynchronize();\n    std::cout << \"result: \" << *result << std::endl;\n    cudaFree(result);\n    return 0;\n}\n```\n\nI've saved this file as `add.cu`. ZLUDA doesn't successfully run this\napplication yet, so I'll compile it and run it using zluda_trace and CUDA\nin order to demonstrate all of zluda_trace's features.\n\n```bash\nnvcc add.cu -o add -arch sm_80\nLD_LIBRARY_PATH=~/ZLUDA/target/release/trace/ ZLUDA_LOG_DIR=/tmp/zluda ./add\n```\n\nThe last few lines should look something like:\n\n```\n[ZLUDA_TRACE] cuCtxSynchronize() -> CUDA_SUCCESS\nresult: 3\n[ZLUDA_TRACE] {CONTEXT_LOCAL_STORAGE_INTERFACE_V0301}::context_local_storage_get(value: 0x562c764a73c0, cu_ctx: 0x0, key: 0x562c764ba130) -> CUDA_SUCCESS\n[ZLUDA_TRACE] cuMemFree_v2(dptr: 0x7f3ca2000000) -> CUDA_SUCCESS\n[ZLUDA_TRACE] {CONTEXT_LOCAL_STORAGE_INTERFACE_V0301}::context_local_storage_delete(context: 0x562c764ba760, key: 0x562c764ba130) -> CUDA_ERROR_DEINITIALIZED\n[ZLUDA_TRACE] cuLibraryUnload(library: 0x562c773ffb10) -> CUDA_ERROR_DEINITIALIZED\n[ZLUDA_TRACE] cuDevicePrimaryCtxRelease(dev: 0) -> CUDA_ERROR_DEINITIALIZED\n```\n\nNow, let's take a look at our log directory:\n\n```bash\nls /tmp/zluda\nadd\n```\n\nzluda_trace creates a new directory for each run, based on the name of\nthe command. If the `add` directory already existed, it'd create an `add_1`\ndirectory, and so on. Next, let's look at that newly-created directory:\n\n```bash\nls /tmp/zluda/add/\nlog.txt  module_0001_01.elf  module_0001_02.ptx\n```\n\nLet's take a look at each of these files.\n\n### log.txt\n\n```bash\n#no_wrap\ncat /tmp/zluda/add/log.txt\n# ...\n# cuModuleGetFunction(hfunc: 0x55ee94d645d0, hmod: 0x55ee94d63c40, name: \"_Z3addiiPi\") -> CUDA_SUCCESS\n# cuLaunchKernel(f: 0x55ee94d645d0, gridDimX: 1, gridDimY: 1, gridDimZ: 1, blockDimX: 1, blockDimY: 1, blockDimZ: 1, sharedMemBytes: 0, hStream: 0x0, kernelParams: 0x7fffe0fa193c, extra: NULL) -> CUDA_SUCCESS\n# {CONTEXT_LOCAL_STORAGE_INTERFACE_V0301}::context_local_storage_get(value: 0x55ee93e083c0, cu_ctx: 0x0, key: 0x55ee93e1b130) -> CUDA_SUCCESS\n# cuCtxSynchronize() -> CUDA_SUCCESS\n# {CONTEXT_LOCAL_STORAGE_INTERFACE_V0301}::context_local_storage_get(value: 0x55ee93e083c0, cu_ctx: 0x0, key: 0x55ee93e1b130) -> CUDA_SUCCESS\n# cuMemFree_v2(dptr: 0x7fbde6000000) -> CUDA_SUCCESS\n# {CONTEXT_LOCAL_STORAGE_INTERFACE_V0301}::context_local_storage_delete(context: 0x55ee93e1b760, key: 0x55ee93e1b130) -> CUDA_ERROR_DEINITIALIZED\n# cuLibraryUnload(library: 0x55ee94d60ae0) -> CUDA_ERROR_DEINITIALIZED\n# cuDevicePrimaryCtxRelease(dev: 0) -> CUDA_ERROR_DEINITIALIZED\n```\n\nAs you can see, this is the same log that was written to stderr. It\nrecords each call made to a CUDA library, the arguments it was passed,\nand the status code returned. Most of these will be calls that you can\nfind in the NVIDIA documentation – for example,\n[`cuModuleGetFunction`](https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__MODULE.html#group__CUDA__MODULE_1ga52be009b0d4045811b30c965e1cb2cf)\n– but some of them aren't publicly documented.\n\n<!-- I've used a zero-width space around :: below. -->\nFor example, look at the calls to\n`{CONTEXT_LOCAL_STORAGE_INTERFACE_V0301}​::​context_local_storage_get`.\nCalls with this format are to what we call NVIDIA's Dark API. We'll\nwrite more documentation for this later, but for now all you need to\nknow are that these are from function pointer tables returned by\n`cuGetExportTable`.\n\nWe're looking at a very simple example, so it doesn't use any\nperformance libraries. If you use zluda_trace for code calling one of\nNVIDIA's performance libraries, zluda_trace will log both the call to\nthat library, and then all of the calls made by that library call. That\nlooks like:\n\n```\ncublasCreate_v2(handle: 0x55e502373120) -> CUBLAS_STATUS_SUCCESS\n    cuGetProcAddress_v2(symbol: \"\", pfn: 0x0, cudaVersion: 0, flags: 0, symbolStatus: NULL) -> CUDA_ERROR_NOT_FOUND\n```\n\nThe call to `cublasCreate_v2` is making a call to `cuGetProcAddress_v2`.\n\n### module_0001_01.elf\n\nThis is precompiled SASS assembly for a single GPU architecture.\n\n### module_0001_02.ptx\n\nThis is PTX assembly that is portable across many NVIDIA GPUs.\n\n```bash\ncat /tmp/zluda/add/module_0001_02.ptx\n# //\n# //\n# //\n# //\n# //\n# //\n#\n# .version 8.7\n# .target sm_80\n# .address_size 64\n#\n# //\n#\n# .visible .entry _Z3addiiPi(\n# .param .u32 _Z3addiiPi_param_0,\n# .param .u32 _Z3addiiPi_param_1,\n# .param .u64 _Z3addiiPi_param_2\n# )\n# {\n# .reg .b32 %r<4>;\n# .reg .b64 %rd<3>;\n#\n#\n# ld.param.u32 %r1, [_Z3addiiPi_param_0];\n# ld.param.u32 %r2, [_Z3addiiPi_param_1];\n# ld.param.u64 %rd1, [_Z3addiiPi_param_2];\n# cvta.to.global.u64 %rd2, %rd1;\n# add.s32 %r3, %r2, %r1;\n# st.global.u32 [%rd2], %r3;\n# ret;\n#\n# }\n```\n\nThis is the `add` function from `add.cu`. `_Z3addiiPi` is the `add(int, int, int*)` after [C++ name mangling](https://en.wikipedia.org/wiki/Name_mangling).\n\n### Compiler logs\n\nThere's one more kind of file zluda_trace might produce: a compiler error\nlog file. When zluda_trace encounters a PTX module, it tries to compile\nit with ZLUDA's PTX compiler. Any errors produced will be saved into a\n`module_NNNN_NN.log` file. For example, it might look like\n\n```\nUnrecognized statement \"nanosleep.u32 %r101;\"\n```\n\nWe use this information to discover which PTX instructions are used by the\napplication and not supported by ZLUDA.\n"
  },
  {
    "path": "ext/detours/.github/ISSUE_TEMPLATE/bug-report.md",
    "content": "---\r\nname: Bug Report\r\nabout: Report a bug in Detours\r\ntitle: \"<header>: Problem\"\r\nlabels: 'bug'\r\nassignees: ''\r\n\r\n---\r\n\r\n**Describe the bug**\r\nA clear and concise description of what the bug is. Please check that you've\r\nread the guidelines for submitting a bug report in the \r\n[Bug Reports](https://github.com/microsoft/Detours/wiki/FAQ#bug-reports) section\r\nof the FAQ.\r\n\r\n**Command-line test case**\r\n```\r\nC:\\Temp>type repro.cpp\r\n#include <iostream>\r\n#include <windows.h>\r\n#include <detours.h>\r\n\r\nvoid main() {\r\n    // Replace this program with one demonstrating your actual bug report,\r\n    // along with the following compilation command. Please leave compiler\r\n    // version banners in the output (don't use /nologo), and include output\r\n    // of your test program, if any.\r\n    std::cout << \"Test Case Result: \";\r\n    if (DetourIsHelperProcess()) {\r\n        std::cout << \"Fail\\n\";\r\n    } else {\r\n        std::cout << \"Pass\\n\";\r\n    }\r\n}\r\n\r\nC:\\Temp>cl.exe /EHsc /W4 /WX .\\repro.cpp -I. ..\\lib.X64\\detours.lib\r\nMicrosoft (R) C/C++ Optimizing Compiler Version 19.27.29111 for x64\r\nCopyright (C) Microsoft Corporation.  All rights reserved.\r\n\r\nrepro.cpp\r\nMicrosoft (R) Incremental Linker Version 14.27.29111.0\r\nCopyright (C) Microsoft Corporation.  All rights reserved.\r\n\r\n/out:repro.exe\r\nrepro.obj\r\n..\\lib.X64\\detours.lib\r\n\r\nC:\\Temp>.\\repro.exe\r\nTest Case Result: Pass\r\n```\r\n\r\n**Expected behavior**\r\nA clear and concise description of what you expected to happen.\r\nAlternatively, include `static_assert` or `assert` lines in your\r\ntest case above whose failure clearly indicates the problem.\r\n\r\n**Detours version**\r\n* Option 1: Release version\r\n  * Displayed on the releases page: https://github.com/microsoft/Detours/releases/\r\n  * Example:\r\n    ```\r\n    Version 4.0.1 of Detours\r\n    ```\r\n\r\n* Option 2: git commit hash\r\n  * Example:\r\n    ```\r\n    https://github.com/microsoft/Detours/commit/2195148\r\n    ```\r\n\r\n**Additional context**\r\nAdd any other context about the problem here.\r\n"
  },
  {
    "path": "ext/detours/.github/ISSUE_TEMPLATE/question.md",
    "content": "---\r\nname: Question\r\nabout: Ask a question about Detours\r\ntitle: \"\"\r\nlabels: question\r\nassignees: ''\r\n\r\n---\r\n\r\nInstructions\r\n============\r\nHere, you can ask a question about Detours, and a maintainer or someone from\r\nthe community will answer. Please read the examples below, then delete all of\r\nthis text and replace it with your question. If you aren't sure whether a\r\nquestion is on-topic, just go ahead and ask it! :-)\r\n\r\nPlease make sure to check the Wiki, esspecially the FAQ, to make sure your\r\nquestion hasn't been answered there already:\r\nhttps://github.com/microsoft/Detours/wiki/FAQ\r\n\r\nOn-Topic Examples\r\n-----------------\r\n* What is this code in the Detours doing? You can link to the relevant code:\r\nhttps://help.github.com/en/github/managing-your-work-on-github/creating-a-permanent-link-to-a-code-snippet\r\n* What are the preferred conventions for writing something?\r\n* What are the maintainers planning to do in the future?\r\n* Would the maintainers be interested in specific enhancements?\r\n\r\nOff-Topic Examples\r\n------------------\r\n* Questions about non-Detours components, such as the compiler, the Windows API,\r\nthe Visual Studio IDE, etc.\r\n* Questions about whether you've encountered a bug in Detours. Instead of this\r\nQuestion template, please use the Bug Report template, because we'll need\r\na command-line test case and the other information requested there.\r\n"
  },
  {
    "path": "ext/detours/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md",
    "content": "<!--\r\nBefore submitting a pull request, please ensure that:\r\n\r\n* These changes introduce no known API breaks (changing the public facing\r\n  functions return types, function parameters, renaming functions, etc.).\r\n\r\n* The changes are tested.\r\n\r\n* Your changes are written from scratch using only this repository.\r\n  If your changes are derived from any other project, you *must* mention it\r\n  here, so we can determine whether the license is compatible and what else\r\n  needs to be done.\r\n-->\r\n"
  },
  {
    "path": "ext/detours/.github/codeql/codeql-config.yml",
    "content": "---\r\nname: \"Detours CodeQL Config\"\r\n\r\nqueries:\r\n - uses: security-and-quality\r\n - uses: security-extended \r\n"
  },
  {
    "path": "ext/detours/.github/workflows/main.yml",
    "content": "name: CI-Build\n\nenv:\n  # Turn on msvc analysis during build, enable once warnings are clean.\n  DETOURS_ANALYZE: true\n\n  # Compile in parallel where possible.\n  CL: /MP\n\n# Triggers the workflow on push or pull request events for the master branch.\non:\n  push:\n    branches: [ master ]\n  pull_request:\n    branches: [ master ]\n\njobs:\n  build:\n    runs-on: ${{ matrix.os }}\n    strategy:\n      fail-fast: false\n      matrix:\n        os: [windows-2019, windows-2016]\n        arch: [x86, x64, x64_arm, x64_arm64]\n\n    steps:\n      - name: Clone Repository\n        uses: actions/checkout@v2\n        with:\n          # Must fetch at least the immediate parents so that if this is\n          # a pull request then we can checkout the head of the pull request.\n          # Only include this option if you are running this workflow on pull requests.\n          fetch-depth: 2\n\n      # If this run was triggered by a pull request event then checkout\n      # the head of the pull request instead of the merge commit.\n      # Only include this step if you are running this workflow on pull requests.\n      - name: Checkout head of the pull request\n        run: git checkout HEAD^2\n        if: ${{ github.event_name == 'pull_request' }}\n\n      # Setup build environment variables using vcvarsall.bat.\n      - name: Configure MSCV Compiler for ${{ matrix.arch }}\n        uses: ilammy/msvc-dev-cmd@v1.4.1\n        with:\n          arch: ${{ matrix.arch }}\n\n      - name: Initialize CodeQL for C++\n        uses: github/codeql-action/init@v1\n        if: ${{ matrix.os == 'windows-2019' }}\n        with:\n          languages: cpp\n          config-file: ./.github/codeql/codeql-config.yml\n\n      - name: Build Detours for ${{ matrix.arch }} on ${{ matrix.os }} \n        env:\n          # Tell detours what process to target\n          DETOURS_TARGET_PROCESSOR: ${{ env.VSCMD_ARG_TGT_ARCH }}\n        run: nmake\n\n      - name: Run unit tests for ${{ matrix.arch }} on ${{ matrix.os }} \n        id: run-unit-tests\n        run: cd tests && nmake test\n        if: ${{ matrix.arch == 'x86' || matrix.arch == 'x64' }}\n\n      - name: Upload artifacts for ${{ matrix.arch }} on ${{ matrix.os }} \n        uses: actions/upload-artifact@v2\n        with:\n          name: artifacts-${{ matrix.os }}\n          path: |\n            lib.*/\n            bin.*/\n            include/\n\n      - name: Perform CodeQL Analysis\n        uses: github/codeql-action/analyze@v1\n        if: ${{ matrix.os == 'windows-2019' }}\n"
  },
  {
    "path": "ext/detours/.gitignore",
    "content": "# C extensions\r\n*.so\r\n\r\n# Unit test / coverage reports\r\n.coverage\r\n.tox\r\nnosetests.xml\r\n\r\n# Translations\r\n*.mo\r\n\r\n# Mr Developer\r\n.mr.developer.cfg\r\n.project\r\n.pydevproject\r\n\r\n# vim\r\n*~\r\n*.swp\r\n\r\n# Visual Studio build\r\n*.ipch\r\n.vs/\r\noutput/\r\ninclude/\r\n*.exp\r\n*.pdb\r\n*.lib\r\n*.dll\r\n*.exe\r\nobj.*\r\n*.ipdb\r\n*.iobj\r\n*.tlog\r\n*.log\r\n*.obj\r\n*.user\r\n*.recipe\r\n/bin.*\r\n*.vcxproj.FileListAbsolute.txt\r\n*.vcxprojAssemblyReference.cache\r\n"
  },
  {
    "path": "ext/detours/CREDITS.TXT",
    "content": "==============================================================================\nThe following individuals have helped identify specific bugs and improvements\nin Detours.  The entire Detours community has benefited from their help.\n==============================================================================\n\n* Jay Krell:          Identified error in DetourFindPayload that caused a\n                      incorrect failure when pcbData is NULL. (Build_342)\n\n* Jay Krell:          Identified issue with VirtualSize == 0 files created in\n                      NT 3.1 images. (Build_339)\n\n* Igor Odnovorov:     Identified an issue with the placement of the trampoline\n                      region when a function is detoured twice and the second\n                      trampoline region is outside of the +/- 2GB range of\n                      the target. (Build_337)\n\n* Jay Krell:          Identified need for some programs to enumerate the\n                      address of IAT entries. (Build_336)\n\n* Calvin Hsia:        Identified need for some program to change the excluded\n                      system region. (Build_336)\n\n* Adam Smith:         Identified error in failure handling when VirtualProect\n                      cannot make pages executable because the Prohibit\n                      Dynamic Code Generation mitigation policy has been\n                      applied to a process. (Build_335)\n\n* Ben Faull:          Identified fix to detour_alloc_region_from_lo and\n                      detour_alloc_region_from_hi that preserves ASLR entropy.\n                      (Build_334)\n\n* Shaoxiang Su:       Reported errors building with Visual Studio 2015.\n                      (Build_332)\n\n* Jay Krell:          Identified and resolved significant gaps in the X86, X64\n                      and IA64 disassemblers for instruction found in code,\n                      but seldom found in function prologues. (Build_331)\n\n* Allan Murphy:       Identify error in rep and jmp ds: encodings. (Build_331)\n\n* Philip Bacon:       Identified incorrect entry point return for pure\n                      resource-only binaries. (Build_330)\n\n* Jay Krell:          Identified failure in DetourAttachEx to update nAlign.\n                      (Build_330)\n\n* Sumit Sarin:        Helped debug error with packed binaries.\n                      (Build_329)\n\n* Nitya Kumar Sharma: Reported bug in DetourAfterWithDll for 32/64 agnostic\n                      EXEs.\n                      (Build_327)\n\n* Richard Black:      Identified a large number of typos in documentation.\n                      (Build_326)\n\n* Michael Bilodeau:   Identified bug in DetourUpdateProcessWithDll when the\n                      target process contains a Detours payload *after* all\n                      valid PE binaries.\n                      (Build_324)\n\n* Meera Jindal:       Reported bug in identification of target address in\n                      DetourCopyInstruction for jmp[] and call[] on x86 & x64,\n                      the ff15 and ff25 opcodes.\n                      (Build_323)\n\n* Ken Johnson:        Assistance with SAL 2.0 annotations.\n                      (Build_319)\n\n* Nick Wood:          Identified bug in DetourFindFunction on ARM.\n                      (Build_314)\n\n* Mark Russinovich:   Helped debug DetourCreateProcessWithDllEx.\n                      (Build_314)\n\n* John Lin:           Implementation idea for DetoursCreateProcessWithDllEx.\n                      (Build_314)\n\n* Andrew Zawadowskiy  Reported an improper memory page permissions\n                      vulnerability in Detours 2.1.  (Vulnerability does not\n                      exist in versions later than Detours 2.1.)\n                      (Build_223)\n\n* Nightxie:           Identified bug in detour_alloc_round_up_to_region.\n                      (Build_310)\n\n* Diana Milirud:      Identified bug in B* instructions on ARM.\n                      (Build_309)\n\n* Juan Carlos         Identified correct MSIL entry point for unsigned MSIL.\n  Luciani:            (Build_308)\n\n* Lee Hunt            Suggested improvements in algorithm for allocation of\n  Lawrence Landauer   trampoline regions on x64 to avoid collisions with\n  Joe Laughlin:       system DLLs.\n                      (Build_307)\n\n* Tyler Sims          Identified bug in handling of \"anycpu\" MSIL binaries\n  Darren Kennedy:     on x64.\n                      (Build_307)\n\n* Andre Vachon:       Help with optimized binaries.\n                      (Build 301)\n\n* Chris Mann:         Identified fix not forward ported from 2.2 to 3.0.\n                      (Build_301)\n\n* Mark Irving:        Identified bug with EXEs missing second import table.\n                      (Build_300)\n\n* Ben Schwarz:        Identified bug in handling of multi-byte NOPs.\n                      (Build_300)\n\n* Aaron Giles         Coded initial ARM/Thumb2 disassembler.\n  Jared Henderson:    (Build_300)\n\n* Doug Brubacher:     Coded initial x86 disassembler.\n                      (Build_100)\n"
  },
  {
    "path": "ext/detours/LICENSE.md",
    "content": "# Copyright (c) Microsoft Corporation\n\nAll rights reserved.\n\n# MIT License\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "ext/detours/Makefile",
    "content": "##############################################################################\n##\n##  Makefile for Detours.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\nROOT = .\n!include \"$(ROOT)\\system.mak\"\n\nall:\n    cd \"$(MAKEDIR)\"\n    @if exist \"$(MAKEDIR)\\core\\makefile\" cd \"$(MAKEDIR)\\core\" && $(MAKE) /NOLOGO /$(MAKEFLAGS)\n    cd \"$(MAKEDIR)\\src\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n    cd \"$(MAKEDIR)\\samples\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n    cd \"$(MAKEDIR)\\tests\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n    @if exist \"$(MAKEDIR)\\bugs\\makefile\" cd \"$(MAKEDIR)\\bugs\" && $(MAKE) /NOLOGO /$(MAKEFLAGS)\n    cd \"$(MAKEDIR)\"\n\nclean:\n    cd \"$(MAKEDIR)\"\n    @if exist \"$(MAKEDIR)\\core\\makefile\" cd \"$(MAKEDIR)\\core\" && $(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\src\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\samples\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\tests\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    @if exist \"$(MAKEDIR)\\bugs\\makefile\" cd \"$(MAKEDIR)\\bugs\" && $(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\"\n\nrealclean: clean\n    cd \"$(MAKEDIR)\"\n    @if exist \"$(MAKEDIR)\\core\\makefile\" cd \"$(MAKEDIR)\\core\" && $(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\src\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\samples\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\tests\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    @if exist \"$(MAKEDIR)\\bugs\\makefile\" cd \"$(MAKEDIR)\\bugs\" && $(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\"\n    -rmdir /q /s $(INCDS) 2> nul\n    -rmdir /q /s $(LIBDS) 2> nul\n    -rmdir /q /s $(BINDS) 2> nul\n    -rmdir /q /s dist 2> nul\n    -del docsrc\\detours.chm 2> nul\n    -del /q *.msi 2>nul\n    -del /q /f /s *~ 2>nul\n\ntest:\n    cd \"$(MAKEDIR)\\samples\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n    cd \"$(MAKEDIR)\\tests\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n    cd \"$(MAKEDIR)\"\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/README.md",
    "content": "# Microsoft Research Detours Package\n\nDetours is a software package for monitoring and instrumenting API calls on Windows. Detours\nhas been used by many ISVs and  is also  used by product teams at Microsoft. Detours is now available under\na standard open source  license ([MIT](https://github.com/microsoft/Detours/blob/master/LICENSE.md)).  This simplifies licensing for programmers using Detours\nand allows the community to support Detours using open source tools and processes.\n\nDetours is compatible with the Windows NT family of \noperating systems: Windows NT, Windows XP, Windows Server 2003, Windows 7,\nWindows 8, and Windows 10.  It cannot be used by Windows Store apps\nbecause Detours requires APIs not available to those applications. \nThis repo contains the source code for version 4.0.1 of Detours.\n\nFor technical documentation on Detours, see the [Detours Wiki](https://github.com/microsoft/Detours/wiki).\nFor directions on how to build and run samples, see the\nsamples [README.txt](https://github.com/Microsoft/Detours/blob/master/samples/README.TXT) file.\n\n## Contributing\n\nThe [`Detours`](https://github.com/microsoft/detours) repository is where development is done.\nHere are some ways you can participate in the project:\n\n* [Answer questions](https://github.com/microsoft/detours/issues) about using Detours.\n* [Improve the Wiki](https://github.com/microsoft/detours/wiki).\n* [Submit bugs](https://github.com/microsoft/detours/issues) and help us verify fixes and changes as they are checked in.\n* Review [source code changes](https://github.com/microsoft/detours/pulls).\n\nMost contributions require you to agree to a Contributor License Agreement (CLA) declaring that\nyou have the right to, and actually do, grant us the rights to use your contribution.\nFor details, visit https://cla.opensource.microsoft.com.\n\nWhen you submit a pull request, a CLA bot will automatically determine whether you need to provide\na CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions\nprovided by the bot. You will only need to do this once across all repos using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Issues, questions, and feedback\n\n* Open an issue on [GitHub Issues](https://github.com/Microsoft/detours/issues).\n\n## Mailing list for announcements\n\nThe detours-announce mailing list is a low-traffic email list for important announcements \nabout the project, such as the availability of new versions of Detours.  To join it, send \nan email to listserv@lists.research.microsoft.com with a \nmessage body containing only the text SUBSCRIBE DETOURS-ANNOUNCE.\nTo leave it, send an email to listserv@lists.research.microsoft.com with a \nmessage body containing only the text UNSUBSCRIBE DETOURS-ANNOUNCE.\n\n\n## License\n\nCopyright (c) Microsoft Corporation. All rights reserved.\n\nLicensed under the [MIT](LICENSE.md) License.\n"
  },
  {
    "path": "ext/detours/samples/Makefile",
    "content": "##############################################################################\n##\n##  Makefile for Detours Test Programs.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n##  Note:\n##    syelog, setdll, and withdll must be built first because a number of the\n##    other samples depend on them.\n##\n\nROOT=..\n!include .\\common.mak\n\n##############################################################################\n\nall:\n    cd \"$(MAKEDIR)\\syelog\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n    cd \"$(MAKEDIR)\\simple\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n    cd \"$(MAKEDIR)\\slept\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n    cd \"$(MAKEDIR)\\setdll\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n    cd \"$(MAKEDIR)\\withdll\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n    cd \"$(MAKEDIR)\\cping\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n    cd \"$(MAKEDIR)\\disas\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n    cd \"$(MAKEDIR)\\dtest\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n    cd \"$(MAKEDIR)\\dumpe\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n    cd \"$(MAKEDIR)\\dumpi\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n    cd \"$(MAKEDIR)\\echo\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n!IF \"$(DETOURS_TARGET_PROCESSOR)\" != \"ARM64\"\n    cd \"$(MAKEDIR)\\einst\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n!ENDIF\n!IF \"$(DETOURS_TARGET_PROCESSOR)\" == \"X86\"\n    cd \"$(MAKEDIR)\\excep\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n!ENDIF\n    cd \"$(MAKEDIR)\\comeasy\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n    cd \"$(MAKEDIR)\\commem\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n!IF \"$(DETOURS_TARGET_PROCESSOR)\" != \"ARM64\"\n    cd \"$(MAKEDIR)\\findfunc\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n!ENDIF\n!IF \"$(DETOURS_TARGET_PROCESSOR)\" != \"ARM\" && \"$(DETOURS_TARGET_PROCESSOR)\" != \"ARM64\"\n    cd \"$(MAKEDIR)\\member\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n!ENDIF\n    cd \"$(MAKEDIR)\\region\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n!IF \"$(DETOURS_TARGET_PROCESSOR)\" == \"X64\" || \"$(DETOURS_TARGET_PROCESSOR)\" == \"IA64\"\n    cd \"$(MAKEDIR)\\talloc\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n!ENDIF\n    cd \"$(MAKEDIR)\\traceapi\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n    cd \"$(MAKEDIR)\\tracebld\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n    cd \"$(MAKEDIR)\\tracemem\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n    cd \"$(MAKEDIR)\\tracereg\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n    cd \"$(MAKEDIR)\\traceser\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n    cd \"$(MAKEDIR)\\tracessl\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n    cd \"$(MAKEDIR)\\tracetcp\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n    cd \"$(MAKEDIR)\\tracelnk\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n!IF \"$(DETOURS_TARGET_PROCESSOR)\" != \"ARM\" && \"$(DETOURS_TARGET_PROCESSOR)\" != \"ARM64\"\n    cd \"$(MAKEDIR)\\tryman\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n!ENDIF\n    cd \"$(MAKEDIR)\\impmunge\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n    cd \"$(MAKEDIR)\\dynamic_alloc\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS)\n    cd \"$(MAKEDIR)\"\n\nclean:\n    cd \"$(MAKEDIR)\\syelog\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\simple\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\slept\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\setdll\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\withdll\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\cping\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\disas\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\dtest\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\dumpe\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\dumpi\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\echo\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\einst\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\excep\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\comeasy\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\commem\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\findfunc\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\member\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\region\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\talloc\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\traceapi\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\tracebld\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\tracemem\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\tracereg\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\traceser\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\tracessl\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\tracetcp\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\tracelnk\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\tryman\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\impmunge\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\\dynamic_alloc\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) clean\n    cd \"$(MAKEDIR)\"\n    -rmdir lib32 2>nul\n    -rmdir lib64 2>nul\n    -rmdir include 2>nul\n\nrealclean:\n    cd \"$(MAKEDIR)\\syelog\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\simple\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\slept\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\setdll\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\withdll\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\cping\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\disas\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\dtest\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\dumpe\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\dumpi\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\echo\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\einst\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\excep\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\comeasy\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\commem\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\findfunc\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\member\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\region\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\talloc\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\traceapi\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\tracebld\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\tracemem\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\tracereg\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\traceser\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\tracessl\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\tracetcp\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\tracelnk\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\tryman\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\impmunge\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\\dynamic_alloc\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) realclean\n    cd \"$(MAKEDIR)\"\n    -rmdir lib32 2>nul\n    -rmdir lib64 2>nul\n    -rmdir include 2>nul\n\ntest:\n    cd \"$(MAKEDIR)\\syelog\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n    cd \"$(MAKEDIR)\\simple\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n!IF \"$(DETOURS_TARGET_PROCESSOR)\" != \"ARM64\"\n    cd \"$(MAKEDIR)\\slept\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n    cd \"$(MAKEDIR)\\setdll\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n    cd \"$(MAKEDIR)\\withdll\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n!ENDIF\n!IF \"$(DETOURS_TARGET_PROCESSOR)\" == \"X86\"\n    cd \"$(MAKEDIR)\\cping\"\n#   @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n!ENDIF\n    cd \"$(MAKEDIR)\\disas\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n!IF \"$(DETOURS_TARGET_PROCESSOR)\" != \"ARM64\"\n    cd \"$(MAKEDIR)\\dtest\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n!ENDIF\n    cd \"$(MAKEDIR)\\dumpe\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n    cd \"$(MAKEDIR)\\dumpi\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n    cd \"$(MAKEDIR)\\echo\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n!IF \"$(DETOURS_TARGET_PROCESSOR)\" != \"ARM64\"\n    cd \"$(MAKEDIR)\\einst\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n!ENDIF\n!IF \"$(DETOURS_TARGET_PROCESSOR)\" == \"X86\"\n    cd \"$(MAKEDIR)\\excep\"\n#   @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n!ENDIF\n!IF \"$(DETOURS_TARGET_PROCESSOR)\" != \"ARM64\"\n    cd \"$(MAKEDIR)\\comeasy\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n\n    cd \"$(MAKEDIR)\\commem\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n    cd \"$(MAKEDIR)\\findfunc\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n    cd \"$(MAKEDIR)\\member\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n    cd \"$(MAKEDIR)\\region\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n!ENDIF\n!IF \"$(DETOURS_TARGET_PROCESSOR)\" == \"X64\" || \"$(DETOURS_TARGET_PROCESSOR)\" == \"IA64\"\n    cd \"$(MAKEDIR)\\talloc\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n!ENDIF\n!IF \"$(DETOURS_TARGET_PROCESSOR)\" != \"ARM64\"\n    cd \"$(MAKEDIR)\\traceapi\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n    cd \"$(MAKEDIR)\\tracebld\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n    cd \"$(MAKEDIR)\\tracemem\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n    cd \"$(MAKEDIR)\\tracereg\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n    cd \"$(MAKEDIR)\\traceser\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n!ENDIF\n#    cd \"$(MAKEDIR)\\tracessl\"\n#    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n#    cd \"$(MAKEDIR)\\tracetcp\"\n#    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n!IF \"$(DETOURS_TARGET_PROCESSOR)\" != \"ARM64\"\n    cd \"$(MAKEDIR)\\tracelnk\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n!ENDIF\n    cd \"$(MAKEDIR)\\impmunge\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n    cd \"$(MAKEDIR)\\dynamic_alloc\"\n    @$(MAKE) /NOLOGO /$(MAKEFLAGS) test\n    cd \"$(MAKEDIR)\"\n\n##\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/README.TXT",
    "content": "##############################################################################\n##\n##  Samples README File\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\nThis README file describes how to set up your build environment, build\nsamples, and run tests.\n\nBUILD ENVIRONMENT:\n==================\nWe assume that you have a version of the Visual Studio IDE installed.  You can\ndownload a free copy of the Visual Studio IDE from\nhttps://visualstudio.microsoft.com.  During Visual Studio installation, make\nsure that C/C++ tools are installed and that the Windows SDK is installed.\n\nClone the Detours git repo to a directory on your machine.  Choose a directory\nthat does not have spaces in the full path name.\n\nBUILDING:\n=========\nOpen a Developer Command Prompt for VS.  Note there are several different\nflavors of the command prompt for different target architectures.  The\ndefault Visual Studio Command prompt targets x86.  To target x64, choose\nthe \"X64 Native Tools Command Prompt for VS\"\n\nChange directory to the samples directory for your git repo.  To build the\nsamples, type \"nmake\".\n\nNote that you must build setdll and syslog in order to use many of the\nother sample programs.\n\nINSTALLING AND BUILDING VIA VCPKG:\n==================================\nYou can download and install detours using the vcpkg(https://github.com/Microsoft/vcpkg) dependency manager:\n\n    git clone https://github.com/Microsoft/vcpkg.git\n    cd vcpkg\n    ./bootstrap-vcpkg.sh\n    ./vcpkg integrate install\n    vcpkg install detours\n    \nThe detours port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please create an issue or pull request(https://github.com/Microsoft/vcpkg) on the vcpkg repository.\n\nTESTING:\n========\nEach of the sample directories has a test, which can be invoked by typing\n\"nmake test\", to demonstrate the usage of the sample.  With very few\nexceptions, all of the executables also accept a \"/?\" command to display a\nusage message.\n\nTo run all sample tests, change directory to the samples directory and type\n\"nmake test\".  Note that some samples are architecture-specific.  Tests for\nthose samples be run only on supported architectures and will be skipped on\nother architectures.\n\nCOMMENTS:\n=========\nThe trace* samples log their output through the syelogd.exe daemon and hook\nCreateProcessW to load themselves into any child processes.  For example,\ntyping \"withdll -d:traceapi.dll cmd.exe\" will create a command shell under\nwhich all processes log their API calls through traceapi.dll.\n"
  },
  {
    "path": "ext/detours/samples/comeasy/Makefile",
    "content": "##############################################################################\n##\n##  API Extension to Measure time slept.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\nLIBS=$(LIBS) kernel32.lib\n\n##############################################################################\n\nall: dirs \\\n    $(BIND)\\wrotei$(DETOURS_BITS).dll \\\n    $(BIND)\\comeasy.exe \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\wrotei$(DETOURS_BITS).bsc \\\n    $(OBJD)\\comeasy.bsc \\\n!ENDIF\n    option\n\n##############################################################################\n\nclean:\n    -del $(BIND)\\wrotei*.* 2>nul\n    -del $(BIND)\\comeasy.* 2>nul\n    -del $(BIND)\\wrotei.* *~ 2>nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\n##############################################################################\n\n$(OBJD)\\wrotei.obj : wrotei.cpp\n\n$(OBJD)\\wrotei.res : wrotei.rc\n\n$(BIND)\\wrotei$(DETOURS_BITS).dll $(BIND)\\wrotei$(DETOURS_BITS).lib: \\\n        $(OBJD)\\wrotei.obj $(OBJD)\\wrotei.res $(DEPS)\n    cl /LD $(CFLAGS) /Fe$(@R).dll /Fd$(@R).pdb \\\n        $(OBJD)\\wrotei.obj $(OBJD)\\wrotei.res \\\n        /link $(LINKFLAGS) /subsystem:console \\\n        /export:DetourFinishHelperProcess,@1,NONAME \\\n        $(LIBS) ole32.lib\n\n$(OBJD)\\wrotei$(DETOURS_BITS).bsc : $(OBJD)\\wrotei.obj\n    bscmake /v /n /o $@ $(OBJD)\\wrotei.sbr\n\n$(OBJD)\\comeasy.obj : comeasy.cpp\n\n$(BIND)\\comeasy.exe : $(OBJD)\\comeasy.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb \\\n        $(OBJD)\\comeasy.obj \\\n        /link $(LINKFLAGS) $(LIBS) ole32.lib \\\n        /subsystem:console /fixed:no\n\n$(OBJD)\\comeasy.bsc : $(OBJD)\\comeasy.obj\n    bscmake /v /n /o $@ $(OBJD)\\comeasy.sbr\n\n############################################### Install non-bit-size binaries.\n\n!IF \"$(DETOURS_OPTION_PROCESSOR)\" != \"\"\n\n$(OPTD)\\wrotei$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\wrotei$(DETOURS_OPTION_BITS).pdb:\n\n$(BIND)\\wrotei$(DETOURS_OPTION_BITS).dll : $(OPTD)\\wrotei$(DETOURS_OPTION_BITS).dll\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\wrotei$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\wrotei$(DETOURS_OPTION_BITS).pdb\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n\noption: \\\n    $(BIND)\\wrotei$(DETOURS_OPTION_BITS).dll \\\n    $(BIND)\\wrotei$(DETOURS_OPTION_BITS).pdb \\\n\n!ELSE\n\noption:\n\n!ENDIF\n\n##############################################################################\n\ntest: all\n    @echo -------- Reseting test binaries to initial state. -----------------------\n    $(BIND)\\setdll.exe -r $(BIND)\\comeasy.exe\n    @echo.\n    @echo -------- Should not load slept$(DETOURS_BITS).dll --------------------------------------\n    $(BIND)\\comeasy.exe\n    @echo.\n    @echo -------- Adding wrotei$(DETOURS_BITS).dll to comeasy.exe ------------------------------\n    $(BIND)\\setdll.exe -d:$(BIND)\\wrotei$(DETOURS_BITS).dll $(BIND)\\comeasy.exe\n    @echo.\n    @echo -------- Should load wrotei$(DETOURS_BITS).dll ----------------------------------------\n    $(BIND)\\comeasy.exe\n    @echo.\n    @echo -------- Removing wrotei$(DETOURS_BITS).dll from comeasy.exe --------------------------\n    $(BIND)\\setdll.exe -r $(BIND)\\comeasy.exe\n    @echo.\n    @echo -------- Should not load wrotei$(DETOURS_BITS).dll ------------------------------------\n    $(BIND)\\comeasy.exe\n    @echo.\n    @echo -------- Should load wrotei$(DETOURS_BITS).dll dynamically using withdll.exe ----------\n    $(BIND)\\withdll.exe -d:$(BIND)\\wrotei$(DETOURS_BITS).dll $(BIND)\\comeasy.exe\n    @echo.\n    @echo -------- Test completed. ------------------------------------------------\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/comeasy/comeasy.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detour Test Program (comeasy.cpp of comeasy.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include <ole2.h>\n#include <windows.h>\n#include <stdio.h>\n\n//////////////////////////////////////////////////////////////////////////////\n//\nint __cdecl main(int argc, char **argv)\n{\n    HRESULT hr;\n\n    (void)argc;\n    (void)argv;\n\n    LPSTREAM pStream = NULL;\n    ULARGE_INTEGER ul;\n    LARGE_INTEGER li;\n\n    printf(\"comeasy.exe: Starting (at %p).\\n\", main);\n\n    CoInitialize(NULL);\n\n    hr = CreateStreamOnHGlobal(NULL, TRUE, &pStream);\n\n    ul.QuadPart = 512;\n    hr = pStream->SetSize(ul);\n\n    li.QuadPart = 0;\n    hr = pStream->Seek(li, STREAM_SEEK_SET, NULL);\n\n    printf(\"comeasy.exe: First write.\\n\");\n    fflush(stdout);\n\n    li.QuadPart = 0;\n    hr = pStream->Write(&ul, sizeof(ul), NULL);\n\n    printf(\"comeasy.exe: Second write.\\n\");\n    fflush(stdout);\n\n    li.QuadPart = 1;\n    hr = pStream->Write(&li, sizeof(li), NULL);\n\n    printf(\"comeasy.exe: Third write.\\n\");\n    fflush(stdout);\n\n    li.QuadPart = 2;\n    hr = pStream->Write(&li, sizeof(li), NULL);\n\n    pStream->Release();\n    pStream = NULL;\n\n    CoUninitialize();\n\n    printf(\"comeasy.exe: Exiting.\\n\\n\");\n    fflush(stdout);\n\n    return 0;\n}\n\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/comeasy/wrotei.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detour Test Program (wrotei.cpp of wrotei.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n//  An example dynamically detouring a function.\n//\n#include <stdio.h>\n\n//////////////////////////////////////////////////////////////////////////////\n//\n//  WARNING:\n//\n//  CINTERFACE must be defined so that the lpVtbl pointer is visible\n//  on COM interfaces.  However, once we've defined it, we must use\n//  coding conventions when accessing interface members, for example:\n//      i->lpVtbl->Write\n//  instead of the C++ syntax:\n//      i->Write.\n//  We must also pass the implicit \"this\" parameter explicitly:\n//      i->lpVtbl->Write(i, pb, 0, NULL)\n//  instead of the C++ syntax:\n//      i->Write(pb, 0, NULL)\n//\n#define CINTERFACE\n#include <ole2.h>\n#include <windows.h>\n#include <detours.h>\n\n//////////////////////////////////////////////////////////////////////////////\n//\nLONG dwWrote = 0;\n\nstatic int (WINAPI * TrueEntryPoint)(VOID) = NULL;\nstatic int (WINAPI * RawEntryPoint)(VOID) = NULL;\n\n//////////////////////////////////////////////////////////////////////////////\n//\nHRESULT (STDMETHODCALLTYPE *RealIStreamWrite)(IStream * This,\n                                              const void *pv,\n                                              ULONG cb,\n                                              ULONG *pcbWritten) = NULL;\n\nHRESULT STDMETHODCALLTYPE MineIStreamWrite(IStream * This,\n                                           const void *pv,\n                                           ULONG cb,\n                                           ULONG *pcbWritten)\n{\n    HRESULT hr;\n    ULONG cbWritten = 0;\n    if (pcbWritten == NULL) {\n        pcbWritten = &cbWritten;\n    }\n\n    hr = RealIStreamWrite(This, pv, cb, pcbWritten);\n\n    for (;;) {\n        LONG dwOld = dwWrote;\n        LONG dwNew = dwOld + *pcbWritten;\n\n        if (InterlockedCompareExchange(&dwWrote, dwNew, dwOld) == dwOld) {\n            break;\n        }\n    }\n\n    return hr;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nint WINAPI TimedEntryPoint(VOID)\n{\n    // We couldn't call CoInitializeEx in DllMain,\n    // so we detour the vtable entries here...\n    LONG error;\n    LPSTREAM pStream = NULL;\n\n    // Create a temporary object so we can get a vtable.\n    CreateStreamOnHGlobal(NULL, TRUE, &pStream);\n\n    // Apply the detour to the vtable.\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n    if (pStream != NULL) {\n        RealIStreamWrite = pStream->lpVtbl->Write;\n        DetourAttach(&(PVOID&)RealIStreamWrite, MineIStreamWrite);\n    }\n    error = DetourTransactionCommit();\n\n    if (pStream != NULL) {\n        pStream->lpVtbl->Release(pStream);\n        pStream = NULL;\n    }\n\n    if (error == NO_ERROR) {\n        printf(\"wrotei\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll:\"\n               \" Detoured IStream::Wrote() from OnHGlobal.\\n\");\n    }\n    else {\n        printf(\"wrotei\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll:\"\n               \" Error detouring IStram::Wrote(): %ld\\n\", error);\n    }\n\n    printf(\"wrotei\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll:\"\n           \" Calling EntryPoint\\n\\n\");\n    fflush(stdout);\n\n    return TrueEntryPoint();\n}\n\nBOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)\n{\n    LONG error;\n    (void)hinst;\n    (void)reserved;\n\n    if (DetourIsHelperProcess()) {\n        return TRUE;\n    }\n\n    if (dwReason == DLL_PROCESS_ATTACH) {\n        DetourRestoreAfterWith();\n\n        printf(\"wrotei\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll:\"\n               \" Starting.\\n\");\n        fflush(stdout);\n\n        // NB: DllMain can't call LoadLibrary, so we hook the app entry point.\n        TrueEntryPoint = (int (WINAPI *)(VOID))DetourGetEntryPoint(NULL);\n        RawEntryPoint = TrueEntryPoint;\n\n        DetourTransactionBegin();\n        DetourUpdateThread(GetCurrentThread());\n        DetourAttach(&(PVOID&)TrueEntryPoint, TimedEntryPoint);\n        error = DetourTransactionCommit();\n\n        if (error == NO_ERROR) {\n            printf(\"wrotei\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll:\"\n                   \" Detoured EntryPoint().\\n\");\n        }\n        else {\n            printf(\"wrotei\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll:\"\n                   \" Error detouring EntryPoint(): %ld\\n\", error);\n        }\n    }\n    else if (dwReason == DLL_PROCESS_DETACH) {\n        DetourTransactionBegin();\n        DetourUpdateThread(GetCurrentThread());\n        if (RealIStreamWrite != NULL) {\n            DetourDetach(&(PVOID&)RealIStreamWrite, (PVOID)MineIStreamWrite);\n        }\n        DetourDetach(&(PVOID&)TrueEntryPoint, TimedEntryPoint);\n        error = DetourTransactionCommit();\n\n        printf(\"wrotei\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll:\"\n               \" Removed IStream::Wrote() detours (%ld), wrote %ld bytes.\\n\",\n               error, dwWrote);\n\n        fflush(stdout);\n    }\n    return TRUE;\n}\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/comeasy/wrotei.rc",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Version information for wrotei.rc.\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include \"detver.h\"\n\n#define VER_INTERNALNAME_STR        \"wrotei\" DETOURS_STRINGIFY(DETOURS_BITS)\n#define VER_ORIGINALFILENAME_STR    \"wrotei\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\"\n#define VER_FILEDESCRIPTION_STR     \"Detours COM Easy Sample\"\n#define VER_COMPANYNAME_STR         \"Microsoft Corporation\"\n\n#include \"common.ver\"\n"
  },
  {
    "path": "ext/detours/samples/commem/Makefile",
    "content": "##############################################################################\n##\n##  Makefile for Detours Test Programs.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\nLIBS=$(LIBS) kernel32.lib\n\nall: dirs \\\n    $(BIND)\\commem.exe \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\commem.bsc\n!ENDIF\n\nclean:\n    -del *~ *.obj *.sbr 2> nul\n    -del $(BIND)\\commem.* 2> nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\n$(BIND)\\commem.obj : commem.cpp\n\n$(BIND)\\commem.exe : $(OBJD)\\commem.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb $(OBJD)\\commem.obj \\\n        /link $(LINKFLAGS) $(LIBS) ole32.lib /subsystem:console\n\n$(OBJD)\\commem.bsc : $(OBJD)\\commem.obj\n    bscmake /v /n /o $@ $(OBJD)\\commem.sbr\n\n##############################################################################\n\ntest: $(BIND)\\commem.exe\n    @echo.\n    $(BIND)\\commem.exe\n    @echo.\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/commem/commem.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detour functions of a COM interface (commem.cpp of commem.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n//\n//\n#include <stdio.h>\n\n//////////////////////////////////////////////////////////////////////////////\n//\n//  WARNING:\n//\n//  CINTERFACE must be defined so that the lpVtbl pointer is visible\n//  on COM interfaces.  However, once we've defined it, we must use\n//  coding conventions when accessing interface members, for example:\n//      i->lpVtbl->Write\n//  instead of the C++ syntax:\n//      i->Write.\n//  We must also pass the implicit \"this\" parameter explicitly:\n//      i->lpVtbl->Write(i, pb, 0, NULL)\n//  instead of the C++ syntax:\n//      i->Write(pb, 0, NULL)\n//\n#define CINTERFACE\n#include <ole2.h>\n#include <windows.h>\n#include <detours.h>\n\n//////////////////////////////////////////////////////////////////////////////\n//\nHRESULT (STDMETHODCALLTYPE *RealIStreamWrite)(IStream * This,\n                                              const void *pv,\n                                              ULONG cb,\n                                              ULONG *pcbWritten) = NULL;\n\nHRESULT STDMETHODCALLTYPE MineIStreamWrite(IStream * This,\n                                           const void *pv,\n                                           ULONG cb,\n                                           ULONG *pcbWritten)\n{\n    HRESULT hr;\n    ULONG cbWritten = 0;\n    if (pcbWritten == NULL) {\n        pcbWritten = &cbWritten;\n    }\n\n    printf(\"commem:   %p->IStreamWrite(pv=%p, cb=%ld)\\n\", This, pv, cb);\n    hr = RealIStreamWrite(This, pv, cb, pcbWritten);\n    printf(\"commem:   %p->IStreamWrite -> %08lx (pcbWritten=%ld)\\n\", This, hr, *pcbWritten);\n\n    return hr;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nint main(int argc, char **argv)\n{\n    HRESULT hr;\n\n    (void)argc;\n    (void)argv;\n\n    LPSTREAM pStream = NULL;\n    ULARGE_INTEGER ul;\n    LARGE_INTEGER li;\n\n    CoInitialize(NULL);\n\n    hr = CreateStreamOnHGlobal(NULL, TRUE, &pStream);\n\n    RealIStreamWrite = pStream->lpVtbl->Write;\n\n    ul.QuadPart = 512;\n    hr = pStream->lpVtbl->SetSize(pStream, ul);\n    li.QuadPart = 0;\n    hr = pStream->lpVtbl->Seek(pStream, li, STREAM_SEEK_SET, NULL);\n\n    printf(\"commem: Calling Write w/o before attach.\\n\");\n\n    li.QuadPart = 0;\n    hr = pStream->lpVtbl->Write(pStream, &ul, sizeof(ul), NULL);\n\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n    DetourAttach(&(PVOID&)RealIStreamWrite, MineIStreamWrite);\n    DetourTransactionCommit();\n\n    printf(\"commem: Calling Write w/o after attach.\\n\");\n\n    li.QuadPart = 1;\n    hr = pStream->lpVtbl->Write(pStream, &li, sizeof(li), NULL);\n\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n    DetourDetach(&(PVOID&)RealIStreamWrite, MineIStreamWrite);\n    DetourTransactionCommit();\n\n    printf(\"commem: Calling Write w/o after detach.\\n\");\n\n    li.QuadPart = 2;\n    hr = pStream->lpVtbl->Write(pStream, &li, sizeof(li), NULL);\n\n    hr = pStream->lpVtbl->Release(pStream);\n    pStream = NULL;\n\n    CoUninitialize();\n\n    return 0;\n}\n\n"
  },
  {
    "path": "ext/detours/samples/common.mak",
    "content": "##############################################################################\n##\n##  Common makefile for Detours test programs.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!IF \"$(ROOT)\" == \"\"\nROOT = ..\\..\n!ENDIF\n!include \"$(ROOT)\\system.mak\"\n\n!IF \"$(DETOURS_SOURCE_BROWSING)\" == \"\"\nDETOURS_SOURCE_BROWSING=0\n!ENDIF\n\n##############################################################################\n\n!IFNDEF CLIB\nCLIB=/MT\n!ENDIF\n\nAFLAGS=/nologo /Zi /c /Fl\nCFLAGS=/nologo /Zi $(CLIB) /Gm- /W4 /WX /we4777 /we4800 /Od\n\n!IF $(DETOURS_SOURCE_BROWSING)==1\nCFLAGS=$(CFLAGS) /FR\n!ELSE\nCFLAGS=$(CFLAGS) /I$(INCD)\n!ENDIF\n\nLIBFLAGS=/nologo\nLINKFLAGS=/release /incremental:no /profile /nodefaultlib:oldnames.lib\n\n!if defined(DETOURS_WIN_7) && defined(DETOURS_CL_17_OR_NEWER)\nCFLAGS=$(CFLAGS) /D_USING_V110_SDK71_\n!endif\n\n!IF \"$(DETOURS_TARGET_PROCESSOR)\" == \"X86\"\n\nASM=ml\n\n!ELSEIF \"$(DETOURS_TARGET_PROCESSOR)\" == \"X64\"\n\nASM=ml64\n\n!ELSEIF \"$(DETOURS_TARGET_PROCESSOR)\" == \"IA64\"\n\nASM=ias\nAFLAGS=-F COFF32_PLUS\nCFLAGS=$(CFLAGS) /wd4163 # intrinsic rdtebex not available; using newer Windows headers with older compiler\n#CFLAGS=$(CFLAGS) /wd4996 /wd4068\n\n!ELSEIF \"$(DETOURS_TARGET_PROCESSOR)\" == \"ARM\"\n\nASM=armasm\nAFLAGS=-coff_thumb2_only\nCFLAGS=$(CFLAGS) /D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE\n\nCFLAGS=$(CFLAGS) /D_$(DETOURS_TARGET_PROCESSOR:X64=AMD64)_ # redundant with windows.h except for midl proxies\n\n!ENDIF\n\nDEPS = $(LIBD)\\syelog.lib $(LIBD)\\detours.lib\nLIBS = $(DEPS)\n\n##############################################################################\n##\n\n.SUFFIXES: .cpp .h .obj .rc .res\n\n!ifdef DETOURS_ANALYZE\n.cpp{$(OBJD)}.obj:\n    $(CC) $(CFLAGS) /Fd$(OBJD)\\vc.pdb /Fo$(OBJD)\\ /c $<\n!else\n.cpp{$(OBJD)}.obj::\n    $(CC) $(CFLAGS) /Fd$(OBJD)\\vc.pdb /Fo$(OBJD)\\ /c $<\n!endif\n\n.rc{$(OBJD)}.res:\n    rc /nologo /DDETOURS_BITS=$(DETOURS_BITS) /fo$(@) /i$(INCD) $(*B).rc\n\n##\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/cping/Makefile",
    "content": "##############################################################################\n##\n##  Makefile for Detours Test Programs.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\nLIBS=$(LIBS) \\\n\tkernel32.lib \\\n\tuser32.lib \\\n\tshell32.lib \\\n\tuuid.lib \\\n    ole32.lib \\\n    rpcrt4.lib \\\n    advapi32.lib \\\n    wsock32.lib \\\n\n# RpcProxy.h uses #ifdef WIN32.\n\n!if \"$(DETOURS_TARGET_PROCESSOR)\" == \"ARM\"\nCFLAGS = $(CFLAGS) /D_WIN32_WINNT=0x0500\n!else\nCFLAGS = $(CFLAGS) /D_WIN32_WINNT=0x0400\n!endif\n\nCFLAGS = $(CFLAGS) /Fd$(OBJD)\\vc.pdb \\\n        /DCONST_VTABLE \\\n        /DCOBJMACROS -DWIN32 -DNT\n\nC__FLAGS=-DENTRY_PREFIX=iping_ -DREGISTER_PROXY_DLL \nCPPFLAGS=\n\n##############################################################################\n\n.SUFFIXES: .c .cpp .h .idl .obj .res .rc\n\n{$(OBJD)}.c{$(OBJD)}.obj:\n    $(CC) $(CFLAGS:/W4=/W3) $(C__FLAGS) /I$(OBJD) /Fo$(OBJD)\\ /c $<\n\n!ifdef DETOURS_ANALYZE\n.cpp{$(OBJD)}.obj:\n    $(CC) $(CFLAGS) $(CPPFLAGS) /I$(OBJD) /Fo$(OBJD)\\ /c $<\n!else\n.cpp{$(OBJD)}.obj::\n    $(CC) $(CFLAGS) $(CPPFLAGS) /I$(OBJD) /Fo$(OBJD)\\ /c $<\n!endif\n\n.rc{$(OBJD)}.res:\n    rc /nologo /Fo$@ .\\$(*B).rc\n\n##############################################################################\n##\nC__FLAGS=-DENTRY_PREFIX=iping_ -DREGISTER_PROXY_DLL \nCPPFLAGS=\n\n\nMIDLFLAGS=/nologo /Oif /no_format_opt\n\n!IF \"$(DETOURS_TARGET_PROCESSOR)\" == \"X86\"\nMIDLFLAGS=$(MIDLFLAGS) /no_robust /win32\n!ELSEIF \"$(DETOURS_TARGET_PROCESSOR)\" == \"IA64\"\nMIDLFLAGS=$(MIDLFLAGS) /ia64\n!ELSEIF \"$(DETOURS_TARGET_PROCESSOR)\" == \"X64\"\nMIDLFLAGS=$(MIDLFLAGS) /x64\n!ELSEIF \"$(DETOURS_TARGET_PROCESSOR)\" == \"ARM\"\nMIDLFLAGS=$(MIDLFLAGS) /arm32\n!ELSEIF \"$(DETOURS_TARGET_PROCESSOR)\" == \"ARM64\"\nMIDLFLAGS=$(MIDLFLAGS) /arm64\n!ENDIF\n\nOBJS = \\\n    $(OBJD)\\cping.obj   \\\n    \\\n    $(OBJD)\\iping_i.obj \\\n    $(OBJD)\\iping_p.obj \\\n    $(OBJD)\\iping_d.obj \\\n\n##############################################################################\n\nall: dirs \\\n    $(BIND)\\cping.exe   \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\cping.bsc\n!ENDIF\n\n##############################################################################\n\nclean:\n    -del iping.h *.c *.obj *.sbr *~ 2>nul\n    -del $(BIND)\\cping.* 2>nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\n##############################################################################\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\n$(OBJD)\\cping.bsc : $(OBJS)\n    bscmake /v /n /o $@ $(OBJS:.obj=.sbr)\n\n$(BIND)\\cping.exe : $(OBJS) $(DEPS)\n    cl $(CFLAGS) /Fe$@ $(OBJS) /link $(LINKFLAGS) \\\n        /subsystem:console $(LIBS)\n\n$(OBJD)\\cping.obj: cping.cpp $(OBJD)\\iping.h\n\n##############################################################################\n##\n$(OBJD)\\iping.h $(OBJD)\\iping_d.c $(OBJD)\\iping_i.c $(OBJD)\\iping_p.c : iping.idl\n    midl $(MIDLFLAGS) /out $(OBJD) /prefix all iping_ /dlldata iping_d.c iping.idl\n\n$(OBJD)\\iping_i.obj: $(OBJD)\\iping_i.c\n$(OBJD)\\iping_p.obj: $(OBJD)\\iping_p.c $(OBJD)\\iping.h\n$(OBJD)\\iping_d.obj: $(OBJD)\\iping_d.c\n\n##############################################################################\n\ntest: $(BIND)\\cping.exe\n    start $(BIND)\\cping.exe /s\n    $(BIND)\\cping.exe /p localhost\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/cping/ReadMe.Txt",
    "content": "Microsoft Research Detours Package\n==============================================================================\n4/2/98\n\n* Instrumentation:\n    Read Pentium cycle counter\n\n* PC configuration:\n    DCOM/TCP, Windows NT Server 4.0,\n    between two 300MHz Pentium boxes,\n    Ethernet connecction\n\n* Client test program:\n    HRESULT get(SHORT, SHORT, LONG*)\n    average over 1,000 calls\n    midl /Oicf\n\n* Results:\n    get() {\n                    <-- (1)\n      IRpcChannelBuffer::SendReceive()) {\n                    <-- (2)\n        I_RpcSendReceive() {\n                    <-- (3)\n          send(soc, )\n                    <-- (4)\n          NtWaitForSingleObject(soc, )\n                    <-- (5)\n        } // end of RPC layer\n                    <-- (6)\n      } // end of channel object\n                    <-- (7)\n    } // end of client call\n                            Average number\n                               of Pentium cycles\n    (1) NDR marshaling overhead (2 SHORTs)      13   K\n                (No! of which 11K from GetBuffer,\n                     of which 6.2K from I_RpcGetBuffer()!)\n    (2) Channel object one-way (send) overhead       1.0 K\n    (3) RPC layer one-way (send) overhead        5.3 K\n    (4) TCP + all server work                      200   K\n    (5) RPC layer one-way (recv) overhead        5.1 K\n    (6) Channel object one-way (recv) overhead       2.2 K\n    (7) NDR unmarshaling overhead (2 LONGs)      4.2 K\n\n    (*) send() only                 17   K\n    TOTAL CYCLES for client get(): 230 K\n"
  },
  {
    "path": "ext/detours/samples/cping/cping.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Module: cping.cpp (cping.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n//  COM Ping text program.\n//\n#define _RPCRT4_\n#define INITGUID\n#include <winsock2.h>\n#include <objbase.h>\n#include <objidl.h>\n#include <ocidl.h>\n#include <olectl.h>\n#include <shellapi.h>\n#include <stdio.h>\n#include <stdlib.h>\n#pragma warning(push)\n#if _MSC_VER > 1400\n#pragma warning(disable:6102 6103) // /analyze warnings\n#endif\n#include <strsafe.h>\n#pragma warning(pop)\n#include <winnt.h>\n#include <rpc.h>\n#include <rpcdcep.h>\n#include <detours.h>\n#include \"iping.h\"\n\n// ARM64 ReadTimeStampCounter is a function.\n// ARM ReadTimeStampCounter is a declared function but not implemented.\n// old IA64: ReadTimeStampCounter nonexisant.\n// new IA64: ReadTimeStampCounter is a macro.\n// old x86; ReadTimeStampCounter is a function.\n// new x86: ReadTimeStampCounter is a macro.\n// AMD64: ReadTimeStampCounter is a macro.\n\n#if defined(_ARM64_) || defined(ReadTimeStampCounter)\n#define GetTimeStamp() ReadTimeStampCounter()\n#elif defined(_X86_) || defined(_AMD64_)\nextern \"C\"\nDWORD64\n__rdtsc (\n    VOID\n    );\n#pragma intrinsic(__rdtsc)\n#define GetTimeStamp() __rdtsc()\n#else\nUINT64 GetTimeStamp(void)\n{\n    LARGE_INTEGER a = { 0 };\n    QueryPerformanceCounter(&a);\n    return a.QuadPart;\n}\n#endif\n\n#define BE_VERBOSE\n////////////////////////////////////////////////////////// Assertion Handling.\n//\n#pragma warning(disable:4127)   // Many of our asserts are constants.\n\n#ifndef NODEBUG\n#undef ASSERT\nVOID PingAssertMessage(CONST PCHAR szMsg, CONST PCHAR szFile, ULONG nLine);\n#define ASSERT(x)   \\\ndo { if (!((int)(x))) { PingAssertMessage(#x, __FILE__, __LINE__); DebugBreak(); }} while (0)\n;\n#else   // NODEBUG\n#undef ASSERT\n#define ASSERT(x)\n#endif  // NODEBUG\n\n//////////////////////////////////////////////////////////////////////////////\n\n#define wcssize(x)      ((wcslen(x) + 1) * sizeof(WCHAR))\n#define strsize(x)      ((strlen(x) + 1) * sizeof(CHAR))\n\nextern \"C\" {\n    ULONG WINAPI iping_DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved);\n    HRESULT STDAPICALLTYPE iping_DllRegisterServer(void);\n    HRESULT STDAPICALLTYPE iping_DllUnregisterServer(void);\n    HRESULT STDAPICALLTYPE iping_DllGetClassObject(REFCLSID rclsid,\n                                                   REFIID riid, PVOID *ppv);\n    HRESULT STDAPICALLTYPE iping_DllCanUnloadNow(void);\n}\n\nSTDAPI PingMessage(PCSTR msg, ...);\n\n///////////////////////////////////////////////////////////////////// Globals.\n\nvoid *              g_pBuffer = NULL;\nWCHAR               g_wzServerName[128];\nWCHAR               g_wzClientName[128];\nULONG               g_cbBufferMax = 262144;\ndouble              g_dCyclesPerSecond = 0.0;\ndouble              g_dMsPerCycle = 0.0;\ndouble              g_dLatency = 0.0;\nBOOL                g_fSummarize = TRUE;\nULONG               g_nFixedToClient = 0;\nULONG               g_nFixedToServer = 0;\n\n//////////////////////////////////////////////////////////////////////////////\n//\nstatic CHAR s_szMessageBuf[2048];\n\nSTDAPI PingMessage(PCSTR msg, ...)\n{\n    HRESULT hr;\n    double d = 0.0;                                     // Required for FP support\n    (void)d;\n    va_list args;\n\n    va_start(args, msg);\n    hr = StringCchVPrintfA(s_szMessageBuf, ARRAYSIZE(s_szMessageBuf), msg, args);\n    va_end(args);\n    if (FAILED(hr)) {\n        return hr;\n    }\n\n    // OutputDebugStringA(s_szMessageBuf);\n\n    printf(\"%s\", s_szMessageBuf);\n    return S_FALSE;\n}\n\nVOID PingAssertMessage(CONST PCHAR szMsg, CONST PCHAR szFile, ULONG nLine)\n{\n    PingMessage(\"%08lx ASSERT(%s) failed in %s, line %d.\\n\",\n                GetCurrentThreadId(), szMsg, szFile, nLine);\n    printf(\"ASSERT(%s) failed in %s, line %ld.\\n\", szMsg, szFile, nLine);\n}\n\nBOOLEAN CheckResult(HRESULT hr, PCSTR pszMsg, ...)\n{\n    if (FAILED(hr)) {\n        HRESULT ihr;\n        va_list args;\n\n        va_start(args, pszMsg);\n        ihr = StringCchVPrintfA(s_szMessageBuf, ARRAYSIZE(s_szMessageBuf), pszMsg, args);\n        va_end(args);\n        if (FAILED(ihr)) {\n            return FALSE;\n        }\n\n        printf(\"  %-57.57s -> %08lx\\n\", s_szMessageBuf, hr);\n        return FALSE;\n    }\n    return TRUE;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////\n//\n#define NTSYSAPI            DECLSPEC_IMPORT\n#define NTAPI               __stdcall\n#define NTSTATUS            LONG\n#define PIO_APC_ROUTINE     PVOID\n\ntypedef struct\n{\n    NTSTATUS    Status;\n    LONG        Information;\n} *PIO_STATUS_BLOCK;\n\nNTSTATUS (NTAPI *Real_NtWaitForSingleObject)(HANDLE Handle,\n                                             BOOLEAN Alertable,\n                                             PLARGE_INTEGER Timeout) = NULL;\n\nNTSTATUS (NTAPI *Real_NtDeviceIoControlFile)(HANDLE FileHandle,\n                                             HANDLE Event,\n                                             PIO_APC_ROUTINE ApcRoutine,\n                                             PVOID ApcContext,\n                                             PIO_STATUS_BLOCK IoStatusBlock,\n                                             ULONG IoControlCode,\n                                             PVOID InputBuffer,\n                                             ULONG InputBufferLength,\n                                             PVOID OutputBuffer,\n                                             ULONG OutputBufferLength) = NULL;\n\n//////////////////////////////////////////////////////////////////////////////\n//\nstatic LONG     s_nInCall = 0;\nstatic ULONG    s_nThread = 0;\n\nenum {\n    E_MinValue = 0,\n    E_SleepEx = 1,\n\n    E_Proxy,\n\n    E_I_RpcGetBuffer,\n    E_I_RpcSendReceive,\n    E_I_RpcFreeBuffer,\n    E_I_RpcSend,\n    E_I_RpcReceive,\n    E_I_RpcFreePipeBuffer,\n    E_I_RpcReallocPipeBuffer,\n    E_I_RpcRequestMutex,\n    E_I_RpcClearMutex,\n    E_I_RpcAllocate,\n    E_I_RpcFree,\n    E_I_RpcPauseExecution,\n    E_I_RpcMonitorAssociation,\n    E_I_RpcStopMonitorAssociation,\n\n    E_Recv,\n    E_RecvFrom,\n    E_NtWaitForSingleObject,\n    E_NtDeviceIoControlFileRecv,\n    E_NtDeviceIoControlFile,\n\n    E_Send,\n    E_SendTo,\n    E_NtDeviceIoControlFileSend,\n\n    E_DCOM,\n    E_RPC,\n    E_UDP,\n    E_NET,\n\n    E_MaxValue,\n\n    E_DcomBeg = E_Proxy,\n    E_DcomEnd = E_Proxy,\n\n    E_RpcBeg = E_I_RpcGetBuffer,\n    E_RpcEnd = E_I_RpcStopMonitorAssociation,\n\n    E_UdpBeg = E_Send,\n    E_UdpEnd = E_NtDeviceIoControlFileSend,\n\n    E_NetBeg = E_Recv,\n    E_NetEnd = E_NtDeviceIoControlFile,\n};\n\nPCHAR s_rszRouteNames[E_MaxValue] =\n{\n    \"<NULL>\",\n    \"SleepEx\",\n    \"Proxy\",\n    \"I_RpcGetBuffer\",\n    \"I_RpcSendReceive\",\n    \"I_RpcFreeBuffer\",\n    \"I_RpcSend\",\n    \"I_RpcReceive\",\n    \"I_RpcFreePipeBuffer\",\n    \"I_RpcReallocPipeBuffer\",\n    \"I_RpcRequestMutex\",\n    \"I_RpcClearMutex\",\n    \"I_RpcAllocate\",\n    \"I_RpcFree\",\n    \"I_RpcPauseExecution\",\n    \"I_RpcMonitorAssociation\",\n    \"I_RpcStopMonitorAssociation\",\n    \"Recv\",\n    \"RecvFrom\",\n    \"NtWaitForSingleObject\",\n    \"NtDeviceIoControlRecv\",\n    \"NtDeviceIoControlFile\",\n    \"Send\",\n    \"SendTo\",\n    \"NtDeviceIoControlSend\",\n    \"DCOM\",\n    \"RPC\",\n    \"UDP/TCP (Send Only)\",\n    \"NET\",\n};\n\nLONGLONG    s_rllCycles[E_MaxValue];\nLONGLONG    s_rllTotals[E_MaxValue];\nLONG        s_rllCounts[E_MaxValue];\n\nclass CRouteTime\n{\n  public:\n    inline CRouteTime(LONG nRoute)\n        {\n            if (s_nInCall && GetCurrentThreadId() == s_nThread) {\n                LONGLONG llBeg;\n                m_nOldRoute = s_nRoute;\n                m_llOldMinus = s_llMinus;\n\n                s_nRoute = m_nRoute = nRoute;\n\n                s_rllCounts[m_nRoute]++;\n                s_llMinus = 0;\n                ASSERT(m_nRoute != m_nOldRoute);\n\n                llBeg = GetTimeStamp();\n                m_llBeg = llBeg;\n            }\n            else {\n                m_nRoute = 0;\n            }\n        }\n\n    inline ~CRouteTime()\n        {\n            if (m_nRoute) {\n                LONGLONG llEnd = GetTimeStamp();\n                llEnd -= m_llBeg;\n                s_rllTotals[m_nRoute] += llEnd;\n                s_rllCycles[m_nRoute] += llEnd - s_llMinus;\n                s_nRoute = m_nOldRoute;\n                s_llMinus = m_llOldMinus + llEnd;\n            }\n        }\n\n    inline BOOL Routed()\n        {\n            return m_nRoute;\n        }\n\n  public:\n    ULONG       m_nRoute;\n    ULONG       m_nOldRoute;\n    LONGLONG    m_llBeg;\n    LONGLONG    m_llOldMinus;\n    static ULONG    s_nRoute;\n    static LONGLONG s_llMinus;\n};\n\nULONG       CRouteTime::s_nRoute = 0;\nLONGLONG    CRouteTime::s_llMinus = 0;\n\nVOID ZeroCycles(VOID)\n{\n    for (ULONG n = 0; n < E_MaxValue; n++) {\n        s_rllCycles[n] = 0;\n        s_rllTotals[n] = 0;\n        s_rllCounts[n] = 0;\n    }\n}\n\nVOID DumpCycles(LONG nRoute)\n{\n    if (s_rllCycles[nRoute] != 0 || s_rllTotals[nRoute] != 0) {\n        printf(\";;   %-21.21s %10I64d %8.3fms %10I64d %8.3fms :%6ld\\n\",\n               s_rszRouteNames[nRoute],\n               s_rllCycles[nRoute], (double)s_rllCycles[nRoute] * g_dMsPerCycle,\n               s_rllTotals[nRoute], (double)s_rllTotals[nRoute] * g_dMsPerCycle,\n               s_rllCounts[nRoute]);\n    }\n}\n\nVOID SummarizeCycles(VOID)\n{\n    ULONG n;\n    for (n = E_DCOM; n <= E_NET; n++) {\n        s_rllCycles[n] = 0;\n        s_rllTotals[n] = 0;\n        s_rllCounts[n] = 0;\n    }\n\n    for (n = E_DcomBeg; n <= E_DcomEnd; n++) {\n        s_rllCycles[E_DCOM] += s_rllCycles[n];\n        s_rllTotals[E_DCOM] += s_rllTotals[n];\n    }\n    for (n = E_RpcBeg; n <= E_RpcEnd; n++) {\n        s_rllCycles[E_RPC] += s_rllCycles[n];\n        s_rllTotals[E_RPC] += s_rllTotals[n];\n    }\n    for (n = E_UdpBeg; n <= E_UdpEnd; n++) {\n        s_rllCycles[E_UDP] += s_rllCycles[n];\n        s_rllTotals[E_UDP] += s_rllTotals[n];\n    }\n    for (n = E_NetBeg; n <= E_NetEnd; n++) {\n        s_rllCycles[E_NET] += s_rllCycles[n];\n        s_rllTotals[E_NET] += s_rllTotals[n];\n    }\n\n#ifdef BE_VERBOSE\n    printf(\"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\"\n           \"::::::::::::::::::\\n\");\n    printf(\":: Protocol Cycles:\\n\");\n    DumpCycles(E_DCOM);\n    DumpCycles(E_RPC);\n    DumpCycles(E_UDP);\n    DumpCycles(E_NET);\n#endif\n\n    s_rllCycles[E_DCOM] /= s_rllCounts[E_DCOM];\n    s_rllCycles[E_RPC] /= s_rllCounts[E_DCOM];\n    s_rllCycles[E_UDP] /= s_rllCounts[E_DCOM];\n    s_rllCycles[E_NET] /= s_rllCounts[E_DCOM];\n    s_rllTotals[E_DCOM] /= s_rllCounts[E_DCOM];\n    s_rllTotals[E_RPC] /= s_rllCounts[E_DCOM];\n    s_rllTotals[E_UDP] /= s_rllCounts[E_DCOM];\n    s_rllTotals[E_NET] /= s_rllCounts[E_DCOM];\n\n#ifdef BE_VERBOSE\n    printf(\"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\"\n           \"::::::::::::::::::\\n\");\n    printf(\":: Protocol Cycles Per DCOM Call:\\n\");\n    DumpCycles(E_DCOM);\n    DumpCycles(E_RPC);\n    DumpCycles(E_UDP);\n    DumpCycles(E_NET);\n#endif\n\n    for (n = 0; n < E_DCOM; n++) {\n        s_rllCycles[n] = 0;\n        s_rllTotals[n] = 0;\n        s_rllCounts[n] = 0;\n    }\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nDWORD (WINAPI * Real_SleepEx)(DWORD dwMilliseconds, BOOL bAlertable)\n    = SleepEx;\nint (WSAAPI * Real_send)(SOCKET s,\n                         const char * buf, int len, int flags)\n    = send;\nint (WSAAPI * Real_sendto)(SOCKET s,\n                           const char * buf, int len, int flags,\n                           const struct sockaddr * to, int tolen)\n    = sendto;\nint (WSAAPI * Real_recv)(SOCKET s, char * buf, int len, int flags)\n    = recv;\nint (WSAAPI * Real_recvfrom)(SOCKET s,char * buf, int len, int flags,\n                             struct sockaddr * from, int * fromlen)\n    = recvfrom;\n\nRPC_STATUS (RPC_ENTRY *\n            Real_I_RpcGetBuffer)(RPC_MESSAGE * Message)\n    = I_RpcGetBuffer;\nRPC_STATUS (RPC_ENTRY *\n            Real_I_RpcSendReceive)(RPC_MESSAGE * Message)\n    = I_RpcSendReceive;\nRPC_STATUS (RPC_ENTRY *\n            Real_I_RpcFreeBuffer)(RPC_MESSAGE * Message)\n    = I_RpcFreeBuffer;\nRPC_STATUS (RPC_ENTRY *\n            Real_I_RpcSend)(PRPC_MESSAGE Message)\n    = I_RpcSend;\nRPC_STATUS (RPC_ENTRY *\n            Real_I_RpcReceive)(PRPC_MESSAGE Message,\n                               unsigned int Size)\n    = I_RpcReceive;\nRPC_STATUS (RPC_ENTRY *\n            Real_I_RpcFreePipeBuffer)(RPC_MESSAGE * Message)\n    = I_RpcFreePipeBuffer;\nRPC_STATUS (RPC_ENTRY *\n            Real_I_RpcReallocPipeBuffer)(PRPC_MESSAGE Msg,\n                                         unsigned int Size)\n    = I_RpcReallocPipeBuffer;\nvoid (RPC_ENTRY *\n      Real_I_RpcRequestMutex)(I_RPC_MUTEX * Mutex)\n    = I_RpcRequestMutex;\nvoid (RPC_ENTRY *\n      Real_I_RpcClearMutex)(I_RPC_MUTEX Mutex)\n    = I_RpcClearMutex;\nvoid * (RPC_ENTRY *\n      Real_I_RpcAllocate)(unsigned int Size)\n    = I_RpcAllocate;\nvoid (RPC_ENTRY *\n      Real_I_RpcFree)(void * Object)\n    = I_RpcFree;\nvoid (RPC_ENTRY *\n      Real_I_RpcPauseExecution)(unsigned long Milliseconds)\n    = I_RpcPauseExecution;\n\n#if _MSC_VER < 1300\nRPC_STATUS (RPC_ENTRY *\n            Real_I_RpcMonitorAssociation)(RPC_BINDING_HANDLE Handle,\n                                          PRPC_RUNDOWN RundownRoutine,\n                                          void * Context)\n    = I_RpcMonitorAssociation;\nRPC_STATUS (RPC_ENTRY *\n            Real_I_RpcStopMonitorAssociation)(RPC_BINDING_HANDLE Handle)\n    = I_RpcStopMonitorAssociation;\n#endif\n\n//////////////////////////////////////////////////////////////////////////////\n//\nstatic DWORD WINAPI Catch_SleepEx(DWORD dwMilliseconds, BOOL bAlertable)\n{\n    CRouteTime rt(E_SleepEx);\n    return Real_SleepEx(dwMilliseconds, bAlertable);\n}\n\nstatic int WSAAPI Catch_send(SOCKET s, const char * buf, int len, int flags)\n{\n    CRouteTime rt(E_Send);\n    return Real_send(s, buf, len, flags);\n}\n\nstatic NTSTATUS NTAPI Catch_NtWaitForSingleObject(HANDLE Handle,\n                                                  BOOLEAN Alertable,\n                                                  PLARGE_INTEGER Timeout)\n{\n    CRouteTime rt(E_NtWaitForSingleObject);\n    if (rt.Routed()) {\n        //printf(\"WaitForSingle(%d, %I64d)\\n\", Alertable, Timeout->QuadPart);\n    }\n\n    return Real_NtWaitForSingleObject(Handle, Alertable, Timeout);\n}\n\n#define IO_CONTROL_AFD_SEND_DATAGRAM        0x12023\n#define IO_CONTROL_AFD_SEND                 0x1201f\n#define IO_CONTROL_AFD_RECV_DATAGRAM        0x1201b\n#define IO_CONTROL_AFD_RECV                 0x12017\n\nstatic NTSTATUS NTAPI Catch_NtDeviceIoControlFile(HANDLE FileHandle,\n                                                  HANDLE Event,\n                                                  PIO_APC_ROUTINE ApcRoutine,\n                                                  PVOID ApcContext,\n                                                  PIO_STATUS_BLOCK IoStatusBlock,\n                                                  ULONG IoControlCode,\n                                                  PVOID InputBuffer,\n                                                  ULONG InputBufferLength,\n                                                  PVOID OutputBuffer,\n                                                  ULONG OutputBufferLength)\n{\n    if (IoControlCode == IO_CONTROL_AFD_SEND_DATAGRAM ||\n        IoControlCode == IO_CONTROL_AFD_SEND) {\n        CRouteTime rt(E_NtDeviceIoControlFileSend);\n        NTSTATUS NtStatus = Real_NtDeviceIoControlFile(FileHandle,\n                                                       Event,\n                                                       ApcRoutine,\n                                                       ApcContext,\n                                                       IoStatusBlock,\n                                                       IoControlCode,\n                                                       InputBuffer,\n                                                       InputBufferLength,\n                                                       OutputBuffer,\n                                                       OutputBufferLength);\n        if (NtStatus == STATUS_PENDING) {\n            LARGE_INTEGER li;\n            li.QuadPart = INFINITE;\n            Real_NtWaitForSingleObject(Event, FALSE, &li);\n            NtStatus = IoStatusBlock->Status;\n        }\n        return NtStatus;\n    }\n    else if (IoControlCode == IO_CONTROL_AFD_RECV_DATAGRAM ||\n             IoControlCode == IO_CONTROL_AFD_RECV) {\n        CRouteTime rt(E_NtDeviceIoControlFileRecv);\n        return Real_NtDeviceIoControlFile(FileHandle,\n                                          Event,\n                                          ApcRoutine,\n                                          ApcContext,\n                                          IoStatusBlock,\n                                          IoControlCode,\n                                          InputBuffer,\n                                          InputBufferLength,\n                                          OutputBuffer,\n                                          OutputBufferLength);\n    }\n    else {\n        CRouteTime rt(E_NtDeviceIoControlFile);\n        if (rt.Routed()) {\n            printf(\"IoControlCode: %08lx\\n\", IoControlCode);\n            __debugbreak();\n        }\n        return Real_NtDeviceIoControlFile(FileHandle,\n                                          Event,\n                                          ApcRoutine,\n                                          ApcContext,\n                                          IoStatusBlock,\n                                          IoControlCode,\n                                          InputBuffer,\n                                          InputBufferLength,\n                                          OutputBuffer,\n                                          OutputBufferLength);\n    }\n}\n\n\nstatic RPC_STATUS RPC_ENTRY Catch_I_RpcGetBuffer(RPC_MESSAGE * Message)\n{\n    CRouteTime rt(E_I_RpcGetBuffer);\n    return Real_I_RpcGetBuffer(Message);\n}\n\nstatic RPC_STATUS RPC_ENTRY Catch_I_RpcSendReceive(RPC_MESSAGE * Message)\n{\n    CRouteTime rt(E_I_RpcSendReceive);\n    return Real_I_RpcSendReceive(Message);\n}\n\nstatic RPC_STATUS RPC_ENTRY Catch_I_RpcFreeBuffer(RPC_MESSAGE * Message)\n{\n    CRouteTime rt(E_I_RpcFreeBuffer);\n    return Real_I_RpcFreeBuffer(Message);\n}\n\nstatic RPC_STATUS RPC_ENTRY Catch_I_RpcSend(PRPC_MESSAGE Message)\n{\n    CRouteTime rt(E_I_RpcSend);\n    return Real_I_RpcSend(Message);\n}\n\nstatic RPC_STATUS RPC_ENTRY Catch_I_RpcReceive(PRPC_MESSAGE Message, unsigned int Size)\n{\n    CRouteTime rt(E_I_RpcReceive);\n    return Real_I_RpcReceive(Message, Size);\n}\n\nstatic RPC_STATUS RPC_ENTRY Catch_I_RpcFreePipeBuffer(RPC_MESSAGE * Message)\n{\n    CRouteTime rt(E_I_RpcFreePipeBuffer);\n    return Real_I_RpcFreePipeBuffer(Message);\n}\n\nstatic RPC_STATUS RPC_ENTRY Catch_I_RpcReallocPipeBuffer(PRPC_MESSAGE Message,\n                                                         unsigned int NewSize)\n{\n    CRouteTime rt(E_I_RpcReallocPipeBuffer);\n    return Real_I_RpcReallocPipeBuffer(Message, NewSize);\n}\n\nstatic void RPC_ENTRY Catch_I_RpcRequestMutex(I_RPC_MUTEX * Mutex)\n{\n    CRouteTime rt(E_I_RpcRequestMutex);\n    Real_I_RpcRequestMutex(Mutex);\n}\n\nstatic void RPC_ENTRY Catch_I_RpcClearMutex(I_RPC_MUTEX Mutex)\n{\n    CRouteTime rt(E_I_RpcClearMutex);\n    Real_I_RpcClearMutex(Mutex);\n}\n\nstatic void * RPC_ENTRY Catch_I_RpcAllocate(unsigned int Size)\n{\n    CRouteTime rt(E_I_RpcAllocate);\n    return Real_I_RpcAllocate(Size);\n}\n\nstatic void RPC_ENTRY Catch_I_RpcFree(void * Object)\n{\n    CRouteTime rt(E_I_RpcFree);\n    Real_I_RpcFree(Object);\n}\n\nstatic void RPC_ENTRY Catch_I_RpcPauseExecution(unsigned long Milliseconds)\n{\n    CRouteTime rt(E_I_RpcPauseExecution);\n    Real_I_RpcPauseExecution(Milliseconds);\n}\n\n#if _MSC_VER < 1300\nstatic RPC_STATUS RPC_ENTRY Catch_I_RpcMonitorAssociation(RPC_BINDING_HANDLE Handle,\n                                                          PRPC_RUNDOWN RundownRoutine,\n                                                          void * Context)\n{\n    CRouteTime rt(E_I_RpcMonitorAssociation);\n    return Real_I_RpcMonitorAssociation(Handle, RundownRoutine, Context);\n}\n\nstatic RPC_STATUS RPC_ENTRY Catch_I_RpcStopMonitorAssociation(RPC_BINDING_HANDLE Handle)\n{\n    CRouteTime rt(E_I_RpcStopMonitorAssociation);\n    return Real_I_RpcStopMonitorAssociation(Handle);\n}\n#endif\n\nstatic STDMETHODIMP Catch_IPing_Ping(IPing *pip)\n{\n    HRESULT hr;\n    InterlockedIncrement(&s_nInCall);\n    {\n        CRouteTime rt(E_Proxy);\n        hr = pip->Ping();\n    }\n    InterlockedDecrement(&s_nInCall);\n    return hr;\n}\n\nstatic STDMETHODIMP Catch_IPing_PingToServer(IPing *pip, LPSTR pszString)\n{\n    HRESULT hr;\n    InterlockedIncrement(&s_nInCall);\n    {\n        CRouteTime rt(E_Proxy);\n        hr = pip->PingToServer(pszString);\n    }\n    InterlockedDecrement(&s_nInCall);\n    return hr;\n}\n\nstatic STDMETHODIMP Catch_IPing_PingToClient(IPing *pip, LPSTR *ppszString)\n{\n    HRESULT hr;\n    InterlockedIncrement(&s_nInCall);\n    {\n        CRouteTime rt(E_Proxy);\n        hr = pip->PingToClient(ppszString);\n    }\n    InterlockedDecrement(&s_nInCall);\n    return hr;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nLONG RerouteEntryPoints(VOID)\n{\n    Real_NtWaitForSingleObject\n        = ((NTSTATUS (NTAPI *)(HANDLE,\n                               BOOLEAN,\n                               PLARGE_INTEGER))\n           DetourFindFunction(\"ntdll.dll\", \"NtWaitForSingleObject\"));\n\n    Real_NtDeviceIoControlFile\n        = ((NTSTATUS (NTAPI *)(HANDLE,\n                               HANDLE,\n                               PIO_APC_ROUTINE,\n                               PVOID,\n                               PIO_STATUS_BLOCK,\n                               ULONG,\n                               PVOID,\n                               ULONG,\n                               PVOID,\n                               ULONG))\n           DetourFindFunction(\"ntdll.dll\", \"NtDeviceIoControlFile\"));\n\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n\n    DetourAttach(&(PVOID&)Real_NtWaitForSingleObject,\n                 Catch_NtWaitForSingleObject);\n    DetourAttach(&(PVOID&)Real_NtDeviceIoControlFile,\n                 Catch_NtDeviceIoControlFile);\n\n    DetourAttach(&(PVOID&)Real_SleepEx,\n                 Catch_SleepEx);\n    DetourAttach(&(PVOID&)Real_send,\n                 Catch_send);\n    DetourAttach(&(PVOID&)Real_I_RpcGetBuffer,\n                 Catch_I_RpcGetBuffer);\n    DetourAttach(&(PVOID&)Real_I_RpcSendReceive,\n                 Catch_I_RpcSendReceive);\n    DetourAttach(&(PVOID&)Real_I_RpcFreeBuffer,\n                 Catch_I_RpcFreeBuffer);\n    DetourAttach(&(PVOID&)Real_I_RpcSend,\n                 Catch_I_RpcSend);\n    DetourAttach(&(PVOID&)Real_I_RpcReceive,\n                 Catch_I_RpcReceive);\n    DetourAttach(&(PVOID&)Real_I_RpcFreePipeBuffer,\n                 Catch_I_RpcFreePipeBuffer);\n    DetourAttach(&(PVOID&)Real_I_RpcReallocPipeBuffer,\n                 Catch_I_RpcReallocPipeBuffer);\n    DetourAttach(&(PVOID&)Real_I_RpcRequestMutex,\n                 Catch_I_RpcRequestMutex);\n    DetourAttach(&(PVOID&)Real_I_RpcClearMutex,\n                 Catch_I_RpcClearMutex);\n    DetourAttach(&(PVOID&)Real_I_RpcAllocate,\n                 Catch_I_RpcAllocate);\n    DetourAttach(&(PVOID&)Real_I_RpcFree,\n                 Catch_I_RpcFree);\n    DetourAttach(&(PVOID&)Real_I_RpcPauseExecution,\n                 Catch_I_RpcPauseExecution);\n#if _MSC_VER < 1300\n    DetourAttach(&(PVOID&)Real_I_RpcMonitorAssociation,\n                 Catch_I_RpcMonitorAssociation);\n    DetourAttach(&(PVOID&)Real_I_RpcStopMonitorAssociation,\n                 Catch_I_RpcStopMonitorAssociation);\n#endif\n\n    return DetourTransactionCommit();\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////////\n///////////////////////////////////////////////////////////////////// Classes.\n\nclass CNetPingFactory : public IClassFactory\n{\n  public:\n    CNetPingFactory();\n    ~CNetPingFactory();\n\n    // IUnknown\n    STDMETHODIMP    QueryInterface(REFIID riid, void** ppv);\n    STDMETHODIMP_(ULONG) AddRef(void);\n    STDMETHODIMP_(ULONG) Release(void);\n\n    // IClassFactory\n    STDMETHODIMP    CreateInstance(LPUNKNOWN punkOuter, REFIID iid, void **ppv);\n    STDMETHODIMP    LockServer(BOOL fLock);\n\n  public:\n    static HRESULT  InitSystem(VOID);\n    static HRESULT  FiniSystem(VOID);\n\n    static HRESULT  InitObject(VOID);\n    static HRESULT  FiniObject(VOID);\n\n    static HRESULT  Lock(BOOL fLock);\n\n    static HRESULT  Wait(VOID);\n\n  private:\n    LONG            m_cRef;\n\n    static HANDLE   s_hevtDone;\n    static LONG     s_nObjects;\n    static LONG     s_nLocks;\n};\n\nclass CNetPingObject : public IPing\n{\n  public:\n    CNetPingObject();\n    ~CNetPingObject();\n\n    // IUnknown\n    STDMETHODIMP    QueryInterface(REFIID iid, void **ppv);\n    STDMETHODIMP_(ULONG) AddRef(void);\n    STDMETHODIMP_(ULONG) Release(void);\n\n    // IPing\n    STDMETHODIMP    Ping();\n    STDMETHODIMP    PingToServer(LPSTR pszString);\n    STDMETHODIMP    PingToClient(LPSTR *ppszString);\n    STDMETHODIMP    PingToClientSize(ULONG cbOut);\n\n  private:\n    LONG        m_cRef;\n    ULONG       m_cbLast;\n    ULONG       m_cbOut;\n};\n\n/////////////////////////////////////////////////////////////////////// GUIDs.\n\nDEFINE_GUID(CLSID_NetPingObject,\n            0xdecdbeed, 0xd1ac, 0x11d1, 0x96, 0xbc, 0x00, 0xaa, 0x00, 0x57, 0x3f, 0xb0);\n\n/////////////////////////////////////////////////////////// Initialize String.\n//\nvoid InitializeString(LPSTR pszString, LONG cbSize)\n{\n    ASSERT(cbSize >= 1);\n\n    while (cbSize-- > 1) {\n        *pszString++ = '+';\n    }\n    *pszString = '\\0';\n}\n\nBOOL GetKeyValue(HKEY hRootKey, PWCHAR pwzKey, PWCHAR pwzValueName, PWCHAR pwzValue,\n                 DWORD cbValue)\n{\n    HKEY        hKey;\n    WCHAR       wzKey[256];\n    HRESULT     hr;\n\n    hr = StringCchCopyW(wzKey, ARRAYSIZE(wzKey), pwzKey);\n    if (FAILED(hr)) {\n        return FALSE;\n    }\n\n    if (RegOpenKeyExW(hRootKey, wzKey, 0, KEY_READ, &hKey) != NO_ERROR) {\n      abort:\n        pwzValue[0] = '\\0';\n        return FALSE;\n    }\n\n    DWORD nType = 0;\n    cbValue -= sizeof(WCHAR);\n    if (RegQueryValueExW(hKey, pwzValueName, 0, &nType, (PBYTE)pwzValue, &cbValue)\n        != NO_ERROR || nType != REG_SZ) {\n\n        RegCloseKey(hKey);\n        goto abort;\n    }\n\n    RegCloseKey(hKey);\n\n    cbValue /= sizeof(WCHAR);\n    pwzValue[cbValue] = L'\\0';\n\n    return TRUE;\n}\n\nstatic BOOLEAN SetKeyAndValue(HKEY hRootKey,\n                              PWCHAR pwzKey, PWCHAR pwzSubkey,\n                              PWCHAR pwzValueName, PWCHAR pwzValue)\n{\n    HKEY        hKey;\n    WCHAR       wzKey[256];\n    HRESULT     hr;\n\n    hr = StringCchCopyW(wzKey, ARRAYSIZE(wzKey), pwzKey);\n    if (FAILED(hr)) {\n        return FALSE;\n    }\n\n    if (pwzSubkey != NULL) {\n        hr = StringCchCatW(wzKey, ARRAYSIZE(wzKey), L\"\\\\\");\n        if (FAILED(hr)) {\n            return FALSE;\n        }\n        hr = StringCchCatW(wzKey, ARRAYSIZE(wzKey), pwzSubkey);\n        if (FAILED(hr)) {\n            return FALSE;\n        }\n    }\n\n    if (RegCreateKeyExW(hRootKey, wzKey, 0, NULL, REG_OPTION_NON_VOLATILE,\n                        KEY_ALL_ACCESS, NULL, &hKey, NULL) != ERROR_SUCCESS) {\n        return FALSE;\n    }\n\n    if (pwzValue != NULL) {\n        RegSetValueExW(hKey, pwzValueName, 0, REG_SZ,\n                       (BYTE *)pwzValue, (DWORD)wcssize(pwzValue));\n    }\n    RegCloseKey(hKey);\n    return TRUE;\n}\n\nstatic BOOLEAN SetKeyAndValue(HKEY hRootKey,\n                              PWCHAR pwzKey, PWCHAR pwzSubkey,\n                              PWCHAR pwzValueName,\n                              PBYTE pbData, ULONG cbData)\n{\n    HKEY        hKey;\n    WCHAR       wzKey[256];\n    HRESULT     hr;\n\n    hr = StringCchCopyW(wzKey, ARRAYSIZE(wzKey), pwzKey);\n    if (FAILED(hr)) {\n        return FALSE;\n    }\n\n    if (pwzSubkey != NULL) {\n        hr = StringCchCatW(wzKey, ARRAYSIZE(wzKey), L\"\\\\\");\n        if (FAILED(hr)) {\n            return FALSE;\n        }\n        hr = StringCchCatW(wzKey, ARRAYSIZE(wzKey), pwzSubkey);\n        if (FAILED(hr)) {\n            return FALSE;\n        }\n    }\n\n    if (RegCreateKeyExW(hRootKey, wzKey, 0, NULL, REG_OPTION_NON_VOLATILE,\n                        KEY_ALL_ACCESS, NULL, &hKey, NULL) != ERROR_SUCCESS) {\n        return FALSE;\n    }\n\n    if (pbData != NULL) {\n        RegSetValueExW(hKey, pwzValueName, 0, REG_BINARY, pbData, cbData);\n    }\n    RegCloseKey(hKey);\n    return TRUE;\n}\n\nstatic void Register(void)\n{\n\n    WCHAR wzModule[256];\n    WCHAR wzName[256];\n    WCHAR wzValue[256];\n    WCHAR wzClass[48];\n    WCHAR wzKey[256];\n    PWCHAR pwz;\n    HRESULT hr;\n\n    BYTE rgEveryone[] = {\n        0x01,0x00,0x04,0x80,0x34,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n        0x14,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x18,0x00,\n        0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,\n        0x00,0x00,0x00,0x00,0x01,0x05,0x00,0x00,0x00,0x00,0x00,0x05,0x15,0x00,0x00,0x00,\n        0xa0,0x65,0xcf,0x7e,0x78,0x4b,0x9b,0x5f,0xe7,0x7c,0x87,0x70,0x32,0x7f,0x00,0x00,\n        0x01,0x05,0x00,0x00,0x00,0x00,0x00,0x05,0x15,0x00,0x00,0x00,0xa0,0x65,0xcf,0x7e,\n        0x78,0x4b,0x9b,0x5f,0xe7,0x7c,0x87,0x70,0x32,0x7f,0x00,0x00\n    };\n\n    GetModuleFileNameW(NULL, wzModule, sizeof(wzModule)/sizeof(WCHAR));\n    if ((pwz = wcsrchr(wzModule, '\\\\')) != NULL) {\n        hr = StringCchCopyW(wzName, ARRAYSIZE(wzName), pwz + 1);\n    }\n    else if ((pwz = wcsrchr(wzModule, ':')) != NULL) {\n        hr = StringCchCopyW(wzName, ARRAYSIZE(wzName), pwz + 1);\n    }\n    else {\n        hr = StringCchCopyW(wzName, ARRAYSIZE(wzName), wzModule);\n    }\n    CheckResult(hr, \"IPing_DllRegisterServer\");\n\n    // printf(\"Server: %ls / %ls\\n\", wzModule, wzName);\n\n    StringFromGUID2(CLSID_NetPingObject, wzClass, ARRAYSIZE(wzClass));\n    // printf(\"  Class: %ls\\n\", wzClass);\n    hr = StringCchCopyW(wzKey, ARRAYSIZE(wzKey), L\"CLSID\\\\\");\n    CheckResult(hr, \"IPing_DllRegisterServer\");\n    hr = StringCchCatW(wzKey, ARRAYSIZE(wzKey), wzClass);\n    CheckResult(hr, \"IPing_DllRegisterServer\");\n\n    SetKeyAndValue(HKEY_CLASSES_ROOT, wzKey, NULL, NULL, L\"COM Ping Network Server\");\n    hr = StringCchPrintfW(wzValue, ARRAYSIZE(wzValue), L\"%ls /s\", wzModule);\n    CheckResult(hr, \"IPing_DllRegisterServer\");\n    SetKeyAndValue(HKEY_CLASSES_ROOT, wzKey, L\"LocalServer32\", NULL, wzValue);\n    SetKeyAndValue(HKEY_CLASSES_ROOT, wzKey, L\"LaunchPermission\", NULL, L\"Y\");\n    SetKeyAndValue(HKEY_CLASSES_ROOT, wzKey, NULL, L\"AppID\", wzClass);\n\n    hr = StringCchCopyW(wzKey, ARRAYSIZE(wzKey), L\"AppID\\\\\");\n    CheckResult(hr, \"IPing_DllRegisterServer\");\n    hr = StringCchCatW(wzKey, ARRAYSIZE(wzKey), wzClass);\n    CheckResult(hr, \"IPing_DllRegisterServer\");\n    SetKeyAndValue(HKEY_CLASSES_ROOT, wzKey, NULL, NULL, L\"COM Ping Network Server\");\n    SetKeyAndValue(HKEY_CLASSES_ROOT, wzKey, NULL, L\"RunAs\", L\"Interactive User\");\n    SetKeyAndValue(HKEY_CLASSES_ROOT, wzKey, NULL, L\"AccessPermission\",\n                   rgEveryone, sizeof(rgEveryone));\n\n    hr = StringCchCopyW(wzKey, ARRAYSIZE(wzKey), L\"AppID\\\\\");\n    CheckResult(hr, \"IPing_DllRegisterServer\");\n    hr = StringCchCatW(wzKey, ARRAYSIZE(wzKey), wzName);\n    CheckResult(hr, \"IPing_DllRegisterServer\");\n\n    SetKeyAndValue(HKEY_CLASSES_ROOT, wzKey, NULL, L\"AppID\", wzClass);\n\n    /////////////////////////////////////////////////// Register Proxy & Stub.\n    //\n    iping_DllRegisterServer();\n    CheckResult(hr, \"IPing_DllRegisterServer\");\n\n    //////////////////////////////////////////////// Register Processor Speed.\n    //\n    DWORD   cycles = 0;\n\n    hr = StringCchCopyW(wzKey, ARRAYSIZE(wzKey), L\"Software\\\\Microsoft\\\\Detours\\\\ProcessorCycles\");\n    CheckResult(hr, \"IPing_DllRegisterServer\");\n\n    if (GetKeyValue(HKEY_LOCAL_MACHINE, wzKey, NULL, wzValue, sizeof(wzValue))) {\n        cycles = _wtoi(wzValue);\n\n        printf(\"[Recorded Cycles/Second: %ld]\\n\", cycles);\n    }\n\n    if (cycles  < 10000) {\n        LONGLONG llBeg;\n        LONGLONG llEnd;\n\n        printf(\"[Calibrating Processors...]\\r\");\n\n        LARGE_INTEGER liBeg;\n        LARGE_INTEGER liEnd;\n        LARGE_INTEGER liBrk;\n        LARGE_INTEGER liFrq;\n\n        QueryPerformanceFrequency(&liFrq);\n        QueryPerformanceCounter(&liBeg);\n        llBeg = GetTimeStamp();\n        liBrk.QuadPart = liBeg.QuadPart + liFrq.QuadPart * 5;\n        do {\n            QueryPerformanceCounter(&liEnd);\n            llEnd = GetTimeStamp();\n        } while (liEnd.QuadPart < liBrk.QuadPart);\n\n        double secs = (double)(liEnd.QuadPart - liBeg.QuadPart) / (double)liFrq.QuadPart;\n        double clks = (double)(llEnd - llBeg);\n        double cycs = clks / secs;\n\n        cycles = (DWORD)cycs;\n        printf(\"[Measured Cycles/Second: %ld]          \\n\", cycles);\n\n        hr = StringCchPrintfW(wzValue, ARRAYSIZE(wzValue), L\"%d\", cycles);\n        CheckResult(hr, \"IPing_DllRegisterServer\");\n\n        SetKeyAndValue(HKEY_LOCAL_MACHINE, wzKey, NULL, NULL, wzValue);\n    }\n}\n\nvoid Unregister(void)\n{\n    ///////////////////////////////////////////////// Unregister Proxy & Stub.\n    //\n    HRESULT hr = iping_DllUnregisterServer();\n    if (FAILED(hr)) {\n        CheckResult(hr, \"IPing_DllUnregisterServer\");\n    }\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nHRESULT GetClockInfo(LONGLONG *pllCyclesPerSecond)\n{\n    WCHAR   wzKey[512];\n    WCHAR   wzValue[128];\n    LONG    cbValue;\n    HRESULT hr;\n\n    ////////////////////////////////////////////////////////// Check Registry.\n\n    cbValue = sizeof(wzValue);\n    hr = StringCchCopyW(wzKey, ARRAYSIZE(wzKey), L\"Software\\\\Microsoft\\\\Detours\\\\ProcessorCycles\");\n    CheckResult(hr, \"GetClockInfo\");\n\n    if (RegQueryValueW(HKEY_LOCAL_MACHINE, wzKey, wzValue, &cbValue) == NO_ERROR) {\n        *pllCyclesPerSecond = _wtoi(wzValue);\n        return S_OK;\n    }\n    *pllCyclesPerSecond = 1000000;\n    return E_FAIL;\n}\n\n///////////////////////////////////////////////////////// CNetPingFactory.\n//\nLONG    CNetPingFactory::s_nObjects = 0;\nLONG    CNetPingFactory::s_nLocks = 0;\nHANDLE  CNetPingFactory::s_hevtDone = NULL;\n\nCNetPingFactory::CNetPingFactory()\n{\n    m_cRef = 1;\n}\n\n\nCNetPingFactory::~CNetPingFactory()\n{\n    m_cRef = 0;\n}\n\nULONG CNetPingFactory::AddRef(void)\n{\n    return InterlockedIncrement(&m_cRef);\n}\n\nULONG CNetPingFactory::Release(void)\n{\n    if (InterlockedDecrement(&m_cRef) == 0) {\n        delete this;\n        return 0;\n    }\n    return 1;\n}\n\nHRESULT CNetPingFactory::InitSystem(VOID)\n{\n    s_nObjects = 0;\n    s_nLocks = 0;\n\n    s_hevtDone = CreateEvent(NULL, FALSE, FALSE, NULL);\n    if (s_hevtDone == NULL) {\n        HRESULT hr = HRESULT_FROM_WIN32(GetLastError());\n        CheckResult(hr, \"Server: CreateEvent\");\n        exit(hr);\n    }\n\n    return S_OK;\n}\n\nHRESULT CNetPingFactory::FiniSystem(VOID)\n{\n    if (s_hevtDone != NULL) {\n        CloseHandle(s_hevtDone);\n        s_hevtDone = NULL;\n    }\n    return S_OK;\n}\n\n\nHRESULT CNetPingFactory::InitObject(VOID)\n{\n    InterlockedIncrement(&s_nObjects);\n    return S_OK;\n}\n\nHRESULT CNetPingFactory::FiniObject(VOID)\n{\n    if (InterlockedDecrement(&s_nObjects) == 0 && s_nLocks == 0)\n        SetEvent(s_hevtDone);\n    return S_OK;\n}\n\nHRESULT CNetPingFactory::Lock(BOOL fLock)\n{\n    if (fLock) {\n        InterlockedIncrement(&s_nLocks);\n    }\n\n    else {\n        if (InterlockedDecrement(&s_nLocks) == 0 && s_nObjects == 0)\n            SetEvent(s_hevtDone);\n    }\n    return S_OK;\n}\n\nHRESULT CNetPingFactory::Wait(VOID)\n{\n    DWORD dwWaitResult;\n    MSG msg;\n\n    for (;;) {\n        dwWaitResult = MsgWaitForMultipleObjects(1, &s_hevtDone,\n                                                 FALSE, INFINITE,\n                                                 QS_ALLINPUT);\n\n        if (dwWaitResult == WAIT_OBJECT_0) {\n            ResetEvent(s_hevtDone);\n            break;\n        }\n\n        while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {\n            TranslateMessage(&msg);\n            DispatchMessage(&msg);\n        }\n    }\n    return S_OK;\n}\n\nSTDMETHODIMP CNetPingFactory::QueryInterface(REFIID riid, void** ppv)\n{\n    if (ppv == NULL) {\n        return E_INVALIDARG;\n    }\n    if (riid == IID_IClassFactory || riid == IID_IUnknown) {\n        *ppv = (IClassFactory *) this;\n        AddRef();\n        return S_OK;\n    }\n    *ppv = NULL;\n    return E_NOINTERFACE;\n}\n\nHRESULT CNetPingFactory::LockServer (BOOL fLock)\n{\n    return Lock(fLock);\n}\n\nSTDMETHODIMP CNetPingFactory::CreateInstance(LPUNKNOWN punkOuter,\n                                             REFIID riid, void** ppv)\n{\n    LPUNKNOWN   punk;\n    HRESULT     hr;\n\n    *ppv = NULL;\n\n    if (punkOuter != NULL) {\n        return CLASS_E_NOAGGREGATION;\n    }\n\n    printf(\"  Server: IClassFactory:CreateInstance\\n\");\n\n    punk = new CNetPingObject;\n    if (punk == NULL) {\n        return E_OUTOFMEMORY;\n    }\n\n    hr = punk->QueryInterface(riid, ppv);\n    punk->Release();\n    return hr;\n}\n\n/////////////////////////////////////////////////////////////// CNetPingObject.\n//\nCNetPingObject::CNetPingObject()\n{\n    m_cRef = 1;\n    m_cbLast = ~0u;\n    m_cbOut = 2;\n    CNetPingFactory::InitObject();\n}\n\nCNetPingObject::~CNetPingObject()\n{\n    CNetPingFactory::FiniObject();\n}\n\nSTDMETHODIMP CNetPingObject::QueryInterface(REFIID riid, void** ppv)\n{\n    if (ppv == NULL) {\n        return E_INVALIDARG;\n    }\n    if (riid == IID_IUnknown || riid == IID_IPing) {\n        *ppv = (IPing *) this;\n        AddRef();\n        return S_OK;\n    }\n    *ppv = NULL;\n    return E_NOINTERFACE;\n}\n\nSTDMETHODIMP_(ULONG) CNetPingObject::AddRef(void)\n{\n    return InterlockedIncrement(&m_cRef);\n}\n\nSTDMETHODIMP_(ULONG) CNetPingObject::Release(void)\n{\n    if (InterlockedDecrement(&m_cRef) == 0) {\n        delete this;\n        return 0;\n    }\n    return 1;\n}\n\nSTDMETHODIMP CNetPingObject::Ping()\n{\n    return S_OK;\n}\n\nSTDMETHODIMP CNetPingObject::PingToServer(LPSTR pszString)\n{\n    (void)pszString;\n    return S_OK;\n}\n\nSTDMETHODIMP CNetPingObject::PingToClient(LPSTR *ppszString)\n{\n    LPSTR pszString = (LPSTR)CoTaskMemAlloc(m_cbOut);\n    if (pszString == NULL) {\n        return E_OUTOFMEMORY;\n    }\n\n    CopyMemory(pszString, g_pBuffer, m_cbOut);\n    *ppszString = pszString;\n\n    return S_OK;\n}\n\nSTDMETHODIMP CNetPingObject::PingToClientSize(ULONG cbOut)\n{\n    if (cbOut < 1) {\n        return E_INVALIDARG;\n    }\n\n    InitializeString((LPSTR)g_pBuffer, cbOut);\n    m_cbOut = cbOut;\n    return S_OK;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nclass CSampleRecord\n{\n  public:\n    DOUBLE      m_dTime;\n    FILETIME    m_nWhen;\n    LONG        m_cbToClient;\n    LONG        m_cbToServer;\n    DOUBLE      m_dDcom;\n    DOUBLE      m_dRpc;\n    DOUBLE      m_dUdp;\n    DOUBLE      m_dNet;\n\n  protected:\n    static LONG s_cbToClient;\n    static LONG s_cbToServer;\n\n  public:\n    CSampleRecord();\n    CSampleRecord(IPing *pIPing, LONG cbToClient, LONG cbToServer);\n\n    HRESULT     Measure(IPing *pIPing, LONG cbToClient, LONG cbToServer);\n    HRESULT     Write();\n\n    double      GetTime()           { return m_dTime; }\n    FILETIME    GetWhen()           { return m_nWhen; }\n    LONG        GetToClient()       { return m_cbToClient; }\n    LONG        GetToServer()       { return m_cbToServer; }\n\n};\n\n//////////////////////////////////////////////////////////////////////////////\n//\nLONG CSampleRecord::s_cbToClient = 0;\nLONG CSampleRecord::s_cbToServer = 0;\n\n//////////////////////////////////////////////////////////////////////////////\n//\nCSampleRecord::CSampleRecord()\n{\n    m_dTime = 0;\n    m_dDcom = 0;\n    m_dRpc = 0;\n    m_dUdp = 0;\n    m_dNet = 0;\n}\n\nCSampleRecord::CSampleRecord(IPing *pIPing, LONG cbToClient, LONG cbToServer)\n{\n    Measure(pIPing, cbToClient, cbToServer);\n}\n\nHRESULT CSampleRecord::Measure(IPing *pIPing, LONG cbToClient, LONG cbToServer)\n{\n    HRESULT hr;\n    LONGLONG llBeg;\n    LONGLONG llEnd;\n\n    GetSystemTimeAsFileTime(&m_nWhen);\n    m_cbToClient = cbToClient;\n    m_cbToServer = cbToServer;\n\n    if (cbToClient == 0 && cbToServer == 0) {\n        llBeg = GetTimeStamp();\n        hr = Catch_IPing_Ping(pIPing);\n        llEnd = GetTimeStamp();\n    }\n    else if (cbToClient) {\n        if (s_cbToClient != cbToClient) {\n            hr = pIPing->PingToClientSize(cbToClient);\n            s_cbToClient = cbToClient;\n        }\n\n        LPSTR pszString = NULL;\n\n        llBeg = GetTimeStamp();\n        hr = Catch_IPing_PingToClient(pIPing, &pszString);\n        llEnd = GetTimeStamp();\n\n        if (pszString) {\n            LONG cb = (LONG)strlen(pszString) + 1;\n            ASSERT(cb == cbToClient);\n            CoTaskMemFree(pszString);\n            pszString = NULL;\n        }\n    }\n    else {\n        if (s_cbToServer != cbToServer) {\n            InitializeString((LPSTR)g_pBuffer, cbToServer);\n            s_cbToServer = cbToServer;\n        }\n\n        llBeg = GetTimeStamp();\n        hr = Catch_IPing_PingToServer(pIPing, (LPSTR)g_pBuffer);\n        llEnd = GetTimeStamp();\n    }\n\n    if (FAILED(hr)) {\n        printf(\";; Operation failed: %08lx\\n\", hr);\n        exit(999);\n    }\n\n    if (g_fSummarize) {\n        SummarizeCycles();\n        m_dDcom = (double)s_rllCycles[E_DCOM] * g_dMsPerCycle;\n        m_dRpc = (double)s_rllCycles[E_RPC] * g_dMsPerCycle;\n        m_dUdp = (double)s_rllCycles[E_UDP] * g_dMsPerCycle;\n        m_dNet = (double)s_rllCycles[E_NET] * g_dMsPerCycle;\n    }\n\n    m_dTime = (double)(llEnd - llBeg) * g_dMsPerCycle;\n\n    return S_OK;\n}\n\nHRESULT CSampleRecord::Write()\n{\n    SYSTEMTIME  st;\n    FILETIME ft;\n\n    FileTimeToLocalFileTime(&m_nWhen, &ft);\n    FileTimeToSystemTime(&ft, &st);\n\n    printf(\"%02d/%02d %2d:%02d:%02d %6ld %ld %6.3f [ %6.3f %6.3f %6.3f %6.3f ]\\n\",\n           st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond,\n           m_cbToClient, m_cbToServer, m_dTime,\n           m_dDcom, m_dRpc, m_dUdp, m_dNet);\n\n    return S_OK;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\ndouble NetTest(HKEY hNetwork, IPing *pIPing,\n               BOOLEAN fToClient, LONG cbPacket, LONG nCount)\n{\n    //////////////////////////////////////////////////////////////////// ToClient.\n    //\n    HRESULT hr;\n    double msAvg = 0.0;\n    double msMin = 1.0e12;\n    double msMax = 0.0;\n    ULONG nMax = 999;\n    ULONG nMin = 999;\n\n    if (fToClient) {\n        printf(\">Client %6ld %6ld \", cbPacket, nCount);\n    }\n    else {\n        printf(\">Server %6ld %6ld \", cbPacket, nCount);\n    }\n\n    for (LONG n = 0; n < nCount; n++) {\n        double ms;\n\n        if (fToClient) {\n            ms = CSampleRecord(pIPing, cbPacket, 0).GetTime();\n        }\n        else {\n            ms = CSampleRecord(pIPing, 0, cbPacket).GetTime();\n        }\n\n        if (ms < 0) {\n            break;\n        }\n\n        if (msMin > ms) {\n            msMin = ms;\n            nMin = n;\n        }\n        if (msMax < ms) {\n            msMax = ms;\n            nMax = n;\n        }\n        msAvg += ms;\n    }\n\n    if (nCount) {\n        msAvg /= nCount;\n    }\n\n    if (cbPacket == 0) {\n        g_dLatency = msMin;\n    }\n\n    double mbps = (double)cbPacket / msMin;\n    mbps *= 8.0 * 1000.0 / 1024.0 / 1024.0;\n\n    double mbps2 = (double)cbPacket / (msMin - g_dLatency);\n    mbps2 *= 8.0 * 1000.0 / 1024.0 / 1024.0;\n    if (cbPacket == 0) {\n        mbps2 = 0;\n    }\n\n    if (hNetwork != NULL) {\n        WCHAR wzKey[64];\n        WCHAR wzLatency[64];\n\n        if (fToClient) {\n            hr = StringCchPrintfW(wzKey, ARRAYSIZE(wzKey), L\"ToClient\\\\%d\", cbPacket);\n            CheckResult(hr, \"NetTest\");\n        }\n        else {\n            hr = StringCchPrintfW(wzKey, ARRAYSIZE(wzKey), L\"ToServer\\\\%d\", cbPacket);\n            CheckResult(hr, \"NetTest\");\n        }\n        hr = StringCchPrintfW(wzLatency, ARRAYSIZE(wzLatency), L\"%I64d\", msAvg);\n        CheckResult(hr, \"NetTest\");\n\n        RegSetValueW(hNetwork, wzKey, REG_SZ, wzLatency, (DWORD)wcssize(wzLatency));\n    }\n\n    printf(\"%8.3f %8.3f %8.3f %9.4f %8.3f %9.4f%3ld\\n\",\n           msMin,\n           msAvg,\n           msMax,\n           mbps,\n           msMin - g_dLatency,\n           mbps2,\n           nMax);\n    return mbps;\n}\n\n//////////////////////////////////////////////////////////////////////// main.\n\nstatic WCHAR    wzServers[32][64];\nstatic int      nServers = 0;\n\nvoid Sample_Fixed(IPing *pIPing)\n{\n    CSampleRecord csrRecords[512];\n    LONG nRecords = 0;\n    HRESULT hr;\n\n    double dAvg = 0;\n    double dMin = 500000.0;\n    double dMax = 0.0;\n    double dMinDcom = dMin;\n    double dMinRpc = dMin;\n    double dMinUdp = dMin;\n    double dMinNet = dMin;\n\n    for (int i = 0; i < 512; i++) {\n        CSampleRecord& csr = csrRecords[nRecords++];\n\n        hr = csr.Measure(pIPing, g_nFixedToClient, g_nFixedToServer);\n        double d = csr.GetTime();\n        if (dMin > d) {\n            dMin = d;\n        }\n        if (dMax < d) {\n            dMax = d;\n        }\n        if (dMinDcom > csr.m_dDcom) {\n            dMinDcom = csr.m_dDcom;\n        }\n        if (dMinRpc > csr.m_dRpc) {\n            dMinRpc = csr.m_dRpc;\n        }\n        if (dMinUdp > csr.m_dUdp) {\n            dMinUdp = csr.m_dUdp;\n        }\n        if (dMinNet > csr.m_dNet) {\n            dMinNet = csr.m_dNet;\n        }\n        dAvg += d;\n    }\n\n    dAvg /= 512;\n    printf(\"size: %ld, min: %.3f, max: %.3f avg: %.3f [ %8.3f %8.3f %8.3f %8.3f ]\\n\",\n           g_nFixedToClient, dMin, dMax, dAvg, dMinDcom, dMinRpc, dMinUdp, dMinNet);\n    for (int n = 0; n < nRecords; n++) {\n        csrRecords[n].Write();\n    }\n}\n\nvoid Sample_Simple(IPing *pIPing)\n{\n    CSampleRecord csrRecords[512];\n    LONG nRecords = 0;\n    HRESULT hr;\n\n    for (int cb = 0; cb < 64000; cb = cb ? cb << 1 : 32) {\n        double n[5];\n        int i = 0;\n\n        for (; i < 5; i++) {\n            CSampleRecord& csr = csrRecords[nRecords++];\n\n            hr = csr.Measure(pIPing, cb, 0);\n            n[i] = csr.GetTime();\n        }\n\n        double nAvg = 0;\n        double nApx = 0;\n        double nMin = n[0];\n        double nMax = n[0];\n\n        for (i = 0; i < 5; i++) {\n            if (nMin > n[i]) {\n                nMin = n[i];\n            }\n            if (nMax < n[i]) {\n                nMax = n[i];\n            }\n            nAvg += n[i];\n        }\n        nApx = nAvg - nMax;\n        nAvg /= 5;\n        nApx /= 4;\n        printf(\"min: %8.3f ms (%6d) %7.3f%7.3f%7.3f%7.3f%7.3f:%8.3f%8.3f\\n\",\n               nMin, cb, n[0], n[1], n[2], n[3], n[4], nAvg, nApx);\n    }\n    for (int n = 0; n < nRecords; n++) {\n        csrRecords[n].Write();\n    }\n}\n\nvoid Sample_More(IPing *pIPing)\n{\n    CSampleRecord csrRecords[64];\n    LONG nRecords = 0;\n\n    for (int cb = 0; cb < 64000; cb = cb ? cb << 1 : 32) {\n        int i = 0;\n        for (; i < 64; i++) {\n            CSampleRecord& csr = csrRecords[nRecords++];\n\n            csr.Measure(pIPing, cb, 0);\n        }\n\n        double nAvg = 0;\n        double nMin = csrRecords[0].GetTime();\n        double nMax = csrRecords[0].GetTime();\n\n        for (i = 0; i < 64; i++) {\n            double n = csrRecords[i].GetTime();\n\n            if (nMin > n) {\n                nMin = n;\n            }\n            if (nMax < n) {\n                nMax = n;\n            }\n            nAvg += n;\n        }\n        nAvg /= i;\n        printf(\"min: %8.3f ms (%6d) : %8.3f %8.3f\\n\",\n               nMin, cb, nMax, nAvg);\n\n        for (int n = 0; n < nRecords; n++) {\n            csrRecords[n].Write();\n        }\n        nRecords = 0;\n    }\n}\n\nvoid Sample_Less(IPing *pIPing)\n{\n    CSampleRecord csrRecords[16];\n    LONG nRecords = 0;\n\n    for (int cb = 0; cb < 64000; cb = cb ? cb << 1 : 16) {\n        int i = 0;\n        for (; i < 16; i++) {\n            CSampleRecord& csr = csrRecords[nRecords++];\n\n            csr.Measure(pIPing, cb, 0);\n        }\n\n        double nAvg = 0;\n        double nMin = csrRecords[0].GetTime();\n        double nMax = csrRecords[0].GetTime();\n\n        for (i = 0; i < 16; i++) {\n            double n = csrRecords[i].GetTime();\n\n            if (nMin > n) {\n                nMin = n;\n            }\n            if (nMax < n) {\n                nMax = n;\n            }\n            nAvg += n;\n        }\n        nAvg /= i;\n        printf(\"min: %8.3f ms (%6d) : %8.3f %8.3f\\n\",\n               nMin, cb, nMax, nAvg);\n\n        for (int n = 0; n < nRecords; n++) {\n            csrRecords[n].Write();\n        }\n        nRecords = 0;\n    }\n}\n\nvoid Sample_Profile(IPing *pIPing)\n{\n    CSampleRecord csrRecords[64];\n\n    double dbZero = 0;\n\n    printf(\"\\nPacket_Size_ Min_Latency Max_Latency Avg_Latency \"\n           \"Relative_Bnd ___Bandwidth\\n\");\n\n    for (int cb = 0; cb < 256 * 1024;) {\n        int n = 0;\n        for (; n < 64; n++) {\n            CSampleRecord& csr = csrRecords[n];\n            csr.Measure(pIPing, cb, 0);\n        }\n\n        double dbAvg = 0;\n        double dbMin = csrRecords[0].GetTime();\n        double dbMax = csrRecords[0].GetTime();\n        LONG nMin = 0;\n        LONG nMax = 0;\n\n        for (n = 0; n < 64; n++) {\n            double db = csrRecords[n].GetTime();\n\n            if (dbMin > db) {\n                dbMin = db;\n                nMin = n;\n            }\n            if (dbMax < db) {\n                dbMax = db;\n                nMax = n;\n            }\n            dbAvg += db;\n        }\n        dbAvg /= n;\n        if (cb == 0) {\n            dbZero = dbMin;\n        }\n\n        double dbBnd = 0;\n        if (dbMin > dbZero) {\n            dbBnd = ((8 * cb) * 1000.0) / (1024 * 1024);\n            dbBnd /= dbMin - dbZero;\n        }\n        double dbReal = ((8 * cb) * 1000.0) / (1024 * 1024) / dbMin;\n\n        printf(\"%6d bytes %9.3fms %9.3fms %9.3fms %8.3fMbps %8.3fMbps\\r\",\n               cb, dbMin, dbMax, dbAvg, dbBnd, dbReal);\n\n        csrRecords[nMin].Write();\n\n        if (cb < 2048) {\n            cb++;\n        }\n        else if (cb < 4096) {\n            cb += 2;\n        }\n        else if (cb < 8192) {\n            cb += 8;\n        }\n        else if (cb < 16384) {\n            cb += 32;\n        }\n        else {\n            cb += 128;\n        }\n    }\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nclass CInit\n{\n  public:\n    CInit(HINSTANCE hinst)\n        {\n            m_hinst = hinst;\n\n            AllocConsole();\n\n            // initialize COM for free-threading\n            HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);\n            if (FAILED(hr)) {\n                CheckResult(hr, \"CoInitializeEx\");\n                exit(hr);\n            }\n\n            ULONG ul = iping_DllMain(m_hinst, DLL_PROCESS_ATTACH, NULL);\n            ASSERT(ul);\n        }\n\n    ~CInit()\n        {\n            ULONG ul = iping_DllMain(m_hinst, DLL_PROCESS_DETACH, NULL);\n            ASSERT(ul);\n\n            CoUninitialize();\n        }\n\n  private:\n    HINSTANCE   m_hinst;\n};\n\nclass CInitStub\n{\n  public:\n    CInitStub()\n        {\n            m_dwRegister = ~0u;\n\n            IClassFactory *pClassFactory = NULL;\n            HRESULT hr = iping_DllGetClassObject(IID_IPing,\n                                                 IID_IUnknown,\n                                                 (void **)&pClassFactory);\n            if (FAILED(hr)) {\n                CheckResult(hr, \"IPing_DllGetClassObject\");\n                ASSERT(SUCCEEDED(hr));\n            }\n\n            if (pClassFactory) {\n                hr = CoRegisterClassObject(IID_IPing,\n                                           pClassFactory,\n                                           CLSCTX_SERVER,\n                                           REGCLS_MULTIPLEUSE,\n                                           &m_dwRegister);\n                if (FAILED(hr)) {\n                    ASSERT(SUCCEEDED(hr));\n                    CheckResult(hr, \"CoRegisterClassObject(IID_IPing)\\n\");\n                }\n                pClassFactory->Release();\n                pClassFactory = NULL;\n            }\n        }\n\n    ~CInitStub()\n        {\n            if (m_dwRegister != ~0u) {\n                CoRevokeClassObject(m_dwRegister);\n                m_dwRegister = ~0u;\n            }\n        }\n\n  private:\n    DWORD       m_dwRegister;\n};\n\n///////////////////////////////////////////////////////////////////////////////\n///////////////////////////////////////////////////////////////////////////////\n//\nint __cdecl main(void)\n{\n    CInit cinit(GetModuleHandle(NULL));\n    int argc;\n    WCHAR **argv = CommandLineToArgvW(GetCommandLineW(), &argc);\n\n    HRESULT hr;\n    BOOLEAN fUnreg = FALSE;\n    BOOLEAN fNeedHelp = FALSE;\n    BOOLEAN fServer = FALSE;\n    BOOLEAN fLong = FALSE;\n    BOOLEAN fProfile = FALSE;\n    BOOLEAN fInstrument = TRUE;\n    BOOLEAN fFixed = FALSE;\n\n    s_nThread = GetCurrentThreadId();\n\n    printf(\"Ping Network Server: [\" __DATE__ \" \" __TIME__ \"]\\n\");\n    int arg = 1;\n    for (; arg < argc; arg++) {\n        if (argv[arg][0] == '-' || argv[arg][0] == '/') {\n            WCHAR *argn = argv[arg] + 1;\n            WCHAR *argp = argn;\n            while (*argp && *argp != ':') {\n                argp++;\n            }\n            if (*argp == ':') {\n                *argp++ = '\\0';\n            }\n\n            switch (argn[0]) {\n\n              case 'f':                                 // Fixed\n              case 'F':\n                fFixed = TRUE;\n                g_nFixedToClient = _wtoi(argp);\n                g_nFixedToServer = 0;\n                break;\n\n              case 'i':\n              case 'I':                                 // Instrument\n                fInstrument = !fInstrument;\n                break;\n\n              case 'n':                                 // Null\n              case 'N':\n                fFixed = TRUE;\n                g_nFixedToClient = g_nFixedToServer = 0;\n                break;\n\n              case 'l':                                 // Long-term loop\n              case 'L':\n                fLong = !fLong;\n                break;\n\n              case 'p':                                 // Profile Network\n              case 'P':\n                fProfile = !fProfile;\n                break;\n\n              case 's':                                 // Server\n              case 'S':\n                fServer = !fServer;\n                break;\n\n              case 'u':                                 // Unregister\n              case 'U':\n                fUnreg = !fUnreg;\n                break;\n\n              case 'x':                                 // Xtract Data\n              case 'X':\n                g_fSummarize = !g_fSummarize;\n                break;\n\n              case '?':                                 // Help\n                fNeedHelp = TRUE;\n                break;\n\n              case '\\0':                                // Local Host\n                hr = StringCchCopyW(wzServers[nServers++], ARRAYSIZE(wzServers[nServers++]),\n                               L\"localhost\");\n                if (FAILED(hr)) {\n                    return 900;\n                }\n                ASSERT(nServers <= 32);\n                break;\n\n              default:\n                fNeedHelp = TRUE;\n                printf(\"Bad argument: %ls\\n\", argv[arg]);\n                break;\n            }\n        }\n        else {\n            hr = StringCchCopyW(wzServers[nServers++], ARRAYSIZE(wzServers[nServers++]), argv[arg]);\n            if (FAILED(hr)) {\n                return 900;\n            }\n            ASSERT(nServers <= 32);\n        }\n    }\n    if (argc == 1 || (nServers == 0 && !fUnreg && !fServer)) {\n        fNeedHelp = TRUE;\n    }\n\n    if (fNeedHelp) {\n        printf(\"Usage:\\n\"\n               \"    cping [options] [hosts]  ..or.. cping [options] /s\\n\"\n               \"Options:\\n\"\n               \"    /u      : Unregister.\\n\"\n               \"    /s      : Act as a server, waiting for clients.\\n\"\n               \"    /?      : Display this help screen.\\n\"\n               \"Client Options:\\n\"\n               \"    /l      : Long-term loop test.                (Default: %3s)\\n\"\n               \"    /p      : Profile test.                       (Default: %3s)\\n\"\n               \"    /n      : Null (0 length) test.               (Default: Off)\\n\"\n               \"    /f:size : Fixed sized packets.                (Default: %3s)\\n\"\n               \"    /x      : Xtract detailed DCOM/RPC/NET data.  (Default: %3s)\\n\"\n               \"    /i      : Toggle instrumentation.             (Default: %3s)\\n\",\n               fLong        ? \"On\" : \"Off\",\n               fProfile     ? \"On\" : \"Off\",\n               fFixed       ? \"On\" : \"Off\",\n               g_fSummarize ? \"Off\" : \"Off\",\n               fInstrument  ? \"On\" : \"Off\");\n\n        exit(1);\n    }\n\n    //////////////////////////////////////////////////////////////////////////\n    if (fUnreg) {\n        Unregister();\n    }\n    else {\n        //////////////////////////////////////////////////////////////////////////////\n        //\n        CInitStub cinitstub;\n\n        // Register in the registry.\n        Register();\n\n        if (fInstrument) {\n            RerouteEntryPoints();\n        }\n\n        LONGLONG llCycles;\n        hr = GetClockInfo(&llCycles);\n        ASSERT(SUCCEEDED(hr));\n        g_dCyclesPerSecond = (double)llCycles;\n        g_dMsPerCycle = (double)1000.0 / (double)llCycles;\n\n        g_pBuffer = CoTaskMemAlloc(g_cbBufferMax);\n        ASSERT(g_pBuffer != NULL);\n\n        if (fServer) {\n            // register the class-object with OLE\n            CNetPingFactory::InitSystem();\n\n            CNetPingFactory *pClassFactory = new CNetPingFactory;\n\n            printf(\"Registering.\\n\");\n            DWORD dwRegister;\n            hr = CoRegisterClassObject(CLSID_NetPingObject, pClassFactory,\n                                       CLSCTX_SERVER, REGCLS_MULTIPLEUSE, &dwRegister);\n            printf(\"Releasing Registered.\\n\");\n            pClassFactory->Release();\n            if (FAILED(hr)) {\n                CheckResult(hr, \"Server: CoRegisterClassObject\");\n                ASSERT(SUCCEEDED(hr));\n            }\n\n            printf(\"  Server: Waiting   <<<Press Ctrl-C to stop.>>>\\n\");\n\n            while (fServer) {\n                CNetPingFactory::Wait();\n            }\n\n            hr = CoRevokeClassObject(dwRegister);\n            if (FAILED(hr)) {\n                CheckResult(hr, \"Server: CoRevokeClassObject\");\n                ASSERT(SUCCEEDED(hr));\n            }\n\n            CNetPingFactory::FiniSystem();\n        }\n        else if (nServers) {\n            LONGLONG llBeg;\n            LONGLONG llEnd;\n            COSERVERINFO csi;\n            MULTI_QI mq;\n\n            //////////////////////////////////////////////////////////////////\n            //\n            printf(\"Processor Speed: %.0f MHz\\n\", g_dCyclesPerSecond / 1000000.0);\n\n            DWORD dwSize = ARRAYSIZE(g_wzClientName);\n            GetComputerNameW(g_wzClientName, &dwSize);\n\n            printf(\";;; %ls - %.0f MHz\\n\",\n                    g_wzClientName,\n                    g_dCyclesPerSecond / 1000000.0);\n\n            for (int n = 0; n < nServers; n++) {\n                if (g_wzServerName[0] == '\\\\' && g_wzServerName[1] == '\\\\') {\n                    hr = StringCchCopyW(g_wzServerName, ARRAYSIZE(g_wzServerName), wzServers[n] + 2);\n                }\n                else {\n                    hr = StringCchCopyW(g_wzServerName, ARRAYSIZE(g_wzServerName), wzServers[n]);\n                }\n                CheckResult(hr, \"Main\");\n\n                printf(\"Server: %ls->%ls\\n\", g_wzClientName, g_wzServerName);\n\n                printf(\";; %ls %ls\\n\", g_wzClientName, g_wzServerName);\n\n                ZeroMemory(&csi, sizeof(csi));\n                csi.pwszName = wzServers[n];\n\n                // create a remote instance of the object on the argv[1] machine\n                mq.pIID = &IID_IPing;\n                mq.pItf = NULL;\n                mq.hr = S_OK;\n                llBeg = GetTimeStamp();\n                hr = CoCreateInstanceEx(CLSID_NetPingObject, NULL, CLSCTX_SERVER,\n                                        &csi, 1, &mq);\n                llEnd = GetTimeStamp();\n\n                printf(\"  CoCreateInstanceEx: %0.4f seconds (%lu ticks)\\n\",\n                       (double)(llEnd - llBeg)/(double)llCycles,\n                       (ULONG)(llEnd - llBeg));\n\n                CheckResult(mq.hr, \"CoCreateInstanceEx [mq]\");\n                CheckResult(hr, \"CoCreateInstanceEx\");\n\n                if (FAILED(hr)) {\n                    CheckResult(hr, \"CoCreateInstanceEx\");\n                    continue;\n                }\n\n                //////////////////////////////////////////////////////////////////\n                //\n                IPing *pIPing = (IPing *)mq.pItf;\n\n                hr = pIPing->Ping();\n                if (FAILED(hr)) {\n                    CheckResult(hr, \"Ping\");\n                }\n                ASSERT(SUCCEEDED(hr));\n                hr = Catch_IPing_Ping(pIPing);\n                if (FAILED(hr)) {\n                    CheckResult(hr, \"Ping\");\n                }\n                ASSERT(SUCCEEDED(hr));\n                ZeroCycles();\n\n                if (fFixed) {\n                    Sample_Fixed(pIPing);\n                }\n                else if (fProfile) {\n                    Sample_Profile(pIPing);\n                }\n                else {\n                    Sample_Simple(pIPing);\n                    if (fLong) {\n                        for (;;) {\n                            Sample_More(pIPing);\n\n                            for (int j = 0; j < 5; j++) {\n                                Sleep(20000);\n                                Sample_Simple(pIPing);\n                            }\n                            Sleep(20000);\n\n                            for (int i = 0; i < 18; i++) {\n                                Sample_Less(pIPing);\n\n                                for (int j = 0; j < 3; j++) {\n                                    Sleep(20000);\n                                    Sample_Simple(pIPing);\n                                }\n                                Sleep(20000);\n                            }\n                        }\n                    }\n                }\n\n                pIPing->Release();\n            }\n        }\n\n        if (g_pBuffer) {\n            CoTaskMemFree(g_pBuffer);\n            g_pBuffer = NULL;\n        }\n\n        Sleep(2);\n\n        if (fInstrument && !g_fSummarize && s_rllCounts[E_Proxy]) {\n            printf(\"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\"\n                   \"::::::::::::::::::\\n\");\n            printf(\":: Instrumented Cycles:     _____Function Time__  \"\n                   \"________Total Time__ : Count\\n\");\n            LONG n = E_DCOM;\n            for (; n < E_MaxValue; n++) {\n                s_rllCycles[n] = 0;\n                s_rllTotals[n] = 0;\n                s_rllCounts[n] = 0;\n            }\n\n            for (n = E_MinValue + 1; n < E_MaxValue; n++) {\n                DumpCycles(n);\n            }\n\n            printf(\"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\"\n                   \"::::::::::::::::::\\n\");\n            printf(\":: Protocol Cycles:\\n\");\n            for (n = E_DcomBeg; n <= E_DcomEnd; n++) {\n                s_rllCycles[E_DCOM] += s_rllCycles[n];\n                s_rllTotals[E_DCOM] += s_rllTotals[n];\n                s_rllCounts[E_DCOM] += s_rllCounts[n];\n            }\n            for (n = E_RpcBeg; n <= E_RpcEnd; n++) {\n                s_rllCycles[E_RPC] += s_rllCycles[n];\n                s_rllTotals[E_RPC] += s_rllTotals[n];\n                s_rllCounts[E_RPC] += s_rllCounts[n];\n            }\n            for (n = E_UdpBeg; n <= E_UdpEnd; n++) {\n                s_rllCycles[E_UDP] += s_rllCycles[n];\n                s_rllTotals[E_UDP] += s_rllTotals[n];\n                s_rllCounts[E_UDP] += s_rllCounts[n];\n            }\n            for (n = E_NetBeg; n <= E_NetEnd; n++) {\n                s_rllTotals[E_NET] += s_rllCycles[n];\n                s_rllCycles[E_NET] += s_rllTotals[n];\n                s_rllCounts[E_NET] += s_rllCounts[n];\n            }\n            DumpCycles(E_DCOM);\n            DumpCycles(E_RPC);\n            DumpCycles(E_UDP);\n            DumpCycles(E_NET);\n\n            printf(\"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\"\n                   \"::::::::::::::::::\\n\");\n            printf(\":: Protocol Cycles Per DCOM Call:\\n\");\n            s_rllCycles[E_DCOM] /= s_rllCounts[E_DCOM];\n            s_rllCycles[E_RPC] /= s_rllCounts[E_DCOM];\n            s_rllCycles[E_UDP] /= s_rllCounts[E_DCOM];\n            s_rllCycles[E_NET] /= s_rllCounts[E_DCOM];\n\n            s_rllTotals[E_DCOM] /= s_rllCounts[E_DCOM];\n            s_rllTotals[E_RPC] /= s_rllCounts[E_DCOM];\n            s_rllTotals[E_UDP] /= s_rllCounts[E_DCOM];\n            s_rllTotals[E_NET] /= s_rllCounts[E_DCOM];\n\n            DumpCycles(E_DCOM);\n            DumpCycles(E_RPC);\n            DumpCycles(E_UDP);\n            DumpCycles(E_NET);\n        }\n    }\n    return 0;\n}\n\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/cping/iping.idl",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Module: iping.idl (cping.exe - COM Ping)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\nimport \"objidl.idl\";\nimport \"oaidl.idl\";\nimport \"oleidl.idl\";\n\n\n[object, uuid(decdbeef-d1ac-11d1-96bc-00aa00573fb0), pointer_default(unique)]\ninterface IPing : IUnknown\n{\n    HRESULT     Ping(void);\n    HRESULT     PingToServer([in] LPSTR pszString);\n    HRESULT     PingToClient([out] LPSTR *ppszString);\n    HRESULT     PingToClientSize([in] ULONG cbOut);\n};\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/disas/Makefile",
    "content": "##############################################################################\n##\n##  Makefile for Detours Test Programs.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\n# temporarily disable this test for ARM64\n!if \"$(DETOURS_TARGET_PROCESSOR)\" != \"ARM64\"\n\nLIBS=$(LIBS) kernel32.lib\n\nall: dirs \\\n    $(BIND)\\disas.exe \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\disas.bsc\n!ENDIF\n\nclean:\n    -del *~ *.obj *.sbr *.lst 2>nul\n    -del $(BIND)\\disas.* 2> nul \n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\n!IF \"$(DETOURS_TARGET_PROCESSOR)\" == \"X86\"\n$(OBJD)\\disasm.obj : x86.cpp\n    cl $(CFLAGS) /Fe$@ /FAcs /Fa$(OBJD)\\x86.lst \\\n        /Fd$(@R).pdb /Fo$(OBJD)\\disasm.obj /c x86.cpp\n!ELSEIF \"$(DETOURS_TARGET_PROCESSOR)\" == \"X64\"\n$(OBJD)\\disasm.obj : x64.asm\n    $(ASM) $(AFLAGS) /Fo$(OBJD)\\disasm.obj /Fl$(OBJD)\\x64.lst x64.asm\n!ELSEIF \"$(DETOURS_TARGET_PROCESSOR)\" == \"IA64\"\n$(OBJD)\\disasm.obj : ia64.asm\n    $(ASM) $(AFLAGS) -o $(OBJD)\\disasm.obj ia64.asm\n!ELSEIF \"$(DETOURS_TARGET_PROCESSOR)\" == \"ARM\"\n$(OBJD)\\disasm.obj : arm.asm\n    $(ASM) $(AFLAGS) -list $(OBJD)\\arm.lst -o $(OBJD)\\disasm.obj arm.asm\n!ENDIF\n\n$(BIND)\\disas.obj : disas.cpp\n\n$(BIND)\\disas.exe : $(OBJD)\\disas.obj $(OBJD)\\disasm.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /FAcs /Fa$(OBJD)\\disas.lst /Fd$(@R).pdb \\\n        $(OBJD)\\disas.obj $(OBJD)\\disasm.obj \\\n        /link $(LINKFLAGS) $(LIBS) /subsystem:console /entry:WinMainCRTStartup\n\n$(OBJD)\\disas.bsc : $(OBJD)\\disas.obj\n    bscmake /v /n /o $@ $(OBJD)\\disas.sbr\n\n##############################################################################\n\ntest: $(BIND)\\disas.exe\n    $(BIND)\\disas.exe\n\n##############################################################################\n\n!else\n\nall:\ntest:\nclean:\nrealclean:\n\n!endif\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/disas/arm.asm",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;\n;;  Detours Test Program (rlo.asm/disas.exe)\n;;\n;;  Microsoft Research Detours Package\n;;\n;;  Copyright (c) Microsoft Corporation.  All rights reserved.\n;;\n\n        MACRO\n        BREAK\n        DCW 0xdefe\n        MEND\n\n        AREA    |.text|,ALIGN=2,CODE,READONLY\n\n        AREA    |.text|,CODE,READONLY\n\n        ALIGN 0x1000\n\n        EXPORT  |TestCodes|\n|TestCodes|\n\n;        dcw 0xf8df,0xe00e                               ; 94  = -16 = -12 ; 94 ; 98 + e = a6\n;        BREAK                                           ; 98  = -14 = -10 ; 98 ; 9c\n;        dcw 0xf8df,0xe00a                               ; 9a  = -12 = -8  ; 98 ; 9c + a = a6\n;        BREAK                                           ; 9e =  -8 = -4   ; 9c ; a0\n;        dcw 0xf8df,0xe002                               ; a0 =  -6 = -2   ; a0 ; a4 + 2 = a6\n;        BREAK                                           ; a4 =  -2        ; a4 ; a8\n;        movs r2, r0                                     ; a6 <===\n;        movs r3, r0                                     ;\n;        BREAK\n;        BREAK\n;\n;        ldr     lr,=0xa98765\n;        ldr     pc,=0xa98765\n;        ldr     pc,=0xa98765\n;        ldr     pc,=0xa98765\n;        BREAK\n;       BREAK\n\n        BREAK\n        ldr     lr, =0xa98765\n        BREAK\n        blx     lr\n\n        BREAK\n        pop     pc\n        BREAK\n        pop     {r11,pc}\n        BREAK\n        pop     {r10,r11,pc}\n        BREAK\n        pop     {r9,r10,r11,pc}\n        BREAK\n        pop     {r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,pc}\n\n        BREAK\n        ldr.w     r0,=0xa98765\n        BREAK\n        nop\n        ldr.w     r0,=0xa98765\n        BREAK\n        nop\n        nop\n        ldr.w     r0,=0xa98765\n\n        BREAK\n        ldr     r0,=0xa98765\n        BREAK\n        ldr.w   r0,=0xa98765\n        BREAK\n        ldr.w   r0,=0xa98765\n        BREAK\n        ldr     r0,=0xa98765\n        BREAK\n        ldr.w   r0,=0xa98765\n        BREAK\n        ldr.w   r0,=0xa98765\n        BREAK\n        ldr     r0,=0xa98765\n        BREAK\n        ldr.w   r0,=0xa98765\n        BREAK\n        ldr.w   r0,=0xa98765\n\n        BREAK\n        ldr     r0,=0xa98765\n        BREAK\n        nop\n        ldr     r0,=0xa98765\n        BREAK\n        nop\n        nop\n        ldr     r0,=0xa98765\n\n        BREAK\n        nop\n        ldr     r0,=0xa\n        BREAK\n        ldr     r0,=0xa9\n        BREAK\n        ldr     r0,=0xa98\n        BREAK\n        ldr     r0,=0xa987\n        BREAK\n        ldr     r0,=0xa9876\n        BREAK\n        ldr     r0,=0xa98765\n        BREAK\n        ldr     r0,=0xa987654\n        BREAK\n        ldr     r0,=0xa9876543\n\n        ;; Simple instructions.\n        BREAK\n        adds r0,r0, #5                                  ; 1d40\n        BREAK\n        movs r2, #0                                     ; 2200\n        BREAK\n        movs r3, #0                                     ; 2300\n        BREAK\n        bx lr                                           ; 4770 [FFFFFFFF]\n\n        ;; Known 16-bit instructions\n        BREAK\n        mov r11, sp                                     ; 46eb\n        BREAK\n        movs r2, r0                                     ; 0002\n        BREAK\n        push r0, r1                                     ; b403\n        BREAK\n        str r3,[r7,#0x28]                               ; 62bb\n        BREAK\n        bx r5                                           ; 4728 [FFFFFFFF]\n        BREAK\n        blx r5                                          ; 47a8\n        BREAK\n        DCW 0x4878 ;  ldr r0, [PC + 0x1E0]              ; 4878\n        BREAK\n        str r3,[r7,#0x1C]                               ; 61fb\n        BREAK\n        ldr r3,[r7,#0x38]                               ; 6bbb\n        BREAK\n        add r3,sp,#0xCC                                 ; ab33\n        BREAK\n        cbz r2,+0x56                                    ; b34a [00xx1510]\n        BREAK\n        cbnz r2,+0x56                                   ; bb4a [00xx1514]\n        BREAK\n        push {r0,r2,r4,r6,lr}                           ; b555\n        BREAK\n        nop                                             ; bf00\n\n        ;; Placeholder for IT instruction\n        BREAK\n        bne +0x6E                                       ; d135 [00xx1538] -??? d137\n        BREAK\n        svc #0x24                                       ; df24\n        BREAK\n        b +0x7FE                                        ; e3fd [00xx1cd0] -??? e3ff\n\n        ;; 32 bit test codes\n        BREAK\n        adds r0,r7,#8                                   ; f1170008\n        BREAK\n        str r3,[r5,#0x677]                              ; f8c53677\n        BREAK\n        ldrsh r10,[r5,#0x5A5]                           ; f9b5a5a5\n        BREAK\n        DCW 0xf89f,0x55a5 ;ldrb r5, [+0x5A5]            ; f89f55a5\n        BREAK\n        bls.w +0x86;    0xf240; 0x8043; //              ; f2408041 [00xx157A]\n        BREAK\n        bl +0xFE;    0xf7ff; 0xff80; //\n        BREAK\n        bl +0xFFE;    0xf7ff; 0xff80; //\n        BREAK\n        bl +0xFFFE;    0xf7ff; 0xff80; //\n        BREAK\n        bl +0xFFFFE;    0xf7ff; 0xff80; //\n        BREAK\n        bl +0xFFFFFE;    0xf7ff; 0xff80; //\n        BREAK\n        bl +0xF0;    0xf7ff; 0xff80; //\n        BREAK\n        bl +0xFF0;    0xf7ff; 0xff80; //\n        BREAK\n        bl +0xFFF0;    0xf7ff; 0xff80; //\n        BREAK\n        bl +0xFFFF0;    0xf7ff; 0xff80; //\n        BREAK\n        bl +0xFFFFF0;    0xf7ff; 0xff80; //\n        BREAK\n        bl +0xF00;    0xf7ff; 0xff80; //\n        BREAK\n        bl +0xFF00;    0xf7ff; 0xff80; //\n        BREAK\n        bl +0xFFF00;    0xf7ff; 0xff80; //\n        BREAK\n        bl +0xFFFF00;    0xf7ff; 0xff80; //\n        BREAK\n        DCW 0xf7ff,0xff80\n        ;bl +0xFFFFFF00;    0xf7ff; 0xff80; //\n        BREAK\n        DCW 0xf7ff,0xbe02\n        ;        b.w ;    0xf7ff; 0xbe02; //  (10053528)\n        BREAK\n        push {r7,r11,lr};    0xe92d; 0x4880; //\n\n        ;; 32 bit expected results\n        BREAK\n        adds r0,r7,#8                                   ; 0xf1170008\n        BREAK\n        str r3,[r5,#0x677]                              ; 0xf8c53677\n        BREAK\n        ldrsh r10,[r5,#0x5A5]                           ; 0xf9b5a5a5\n\n        BREAK\n        DCW 0xf6af,0xfbd2\n        ; bl (0008ef3c);    ResultCode(4, 0xf6af, 0xfbd2, Target(ADDRESS(&g_pTestCodes32[i*2], 0xFFFFFF00))); // 0xf7ff, 0xff80: -> 0xf6affbd2\n        BREAK\n        bl (00090300);    ResultCode(4, 0xf6af, 0xba54, Target(ADDRESS(&g_pTestCodes32[i*2], 0xFFFFFC04))); // 0xf7ff, 0xff80: -> f6afba54 bl (00090300)\n        BREAK\n        push {r7,r11,lr};    ResultCode(4, 0xe92d, 0x4880); // 0xe92d, 0x4880: //\n\n        BREAK\n        BREAK\n\n|TestCodes_end|\n\n        END\n"
  },
  {
    "path": "ext/detours/samples/disas/disas.cpp",
    "content": "/////////////////////////////////////////////////////////////////////////////\n//\n//  Module: disas.cpp (disas.exe - Detours Test Program)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#define DETOURS_INTERNAL\n#include <detours.h>\n#include <stdio.h>\n#include <stdlib.h>\n\n///////////////////////////////////////////////////////////////////////// ARM.\n//\n#ifdef DETOURS_ARM\n\nextern \"C\" BYTE TestCodes[];\n\nvoid DumpMemoryFragment(PBYTE pbData, ULONG cbData, ULONG cbSpace)\n{\n    ULONG n = 0;\n    if (cbData >= 4) {\n        printf(\"%04x%04x \", ((PUSHORT)pbData)[0], ((PUSHORT)pbData)[1]);\n        n += 4;\n    }\n    else if (cbData >= 2) {\n        printf(\"%04x \", *((PUSHORT)pbData));\n        n += 2;\n    }\n\n    for (; n < cbSpace; n++) {\n        if (n < cbData) {\n            printf(\"%02x\", pbData[n]);\n        }\n        else {\n            printf(\"  \");\n        }\n    }\n    if (n < cbData) {\n        printf(\".\");\n    }\n    else {\n        printf(\" \");\n    }\n}\n\ninline ULONG fetch_thumb_opcode(PBYTE pbCode)\n{\n    ULONG Opcode = *(UINT16 *)&pbCode[0];\n    if (Opcode >= 0xe800) {\n        Opcode = (Opcode << 16) | *(UINT16 *)&pbCode[2];\n    }\n    return Opcode;\n}\n\nBOOL IsTerminate(PBYTE pbSrc)\n{\n    ULONG opcode = fetch_thumb_opcode(pbSrc);\n\n    if ((opcode & 0xff87) == 0x4700) {\n        // bx r\n        return TRUE;\n    }\n\n#if 0\n    if ((opcode & 0xfbf08f00) == 0xf2400c00) {          // movw r12,#xxxx\n        return TRUE;\n    }\n\n    if ((opcode == 0xf8dcf000) {                 // ldr  pc,[r12]\n                ULONG Immediate = ((opcode2 << 12) & 0xf7000000) |\n                                  ((opcode2 <<  1) & 0x08000000) |\n                                  ((opcode2 << 16) & 0x00ff0000) |\n                                  ((opcode  >>  4) & 0x0000f700) |\n                                  ((opcode  >> 15) & 0x00000800) |\n                                  ((opcode  >>  0) & 0x000000ff);\n                PBYTE pbTarget = *(PBYTE *)Immediate;\n                if (detour_is_imported(pbCode, pbTarget)) {\n                    PBYTE pbNew = *(PBYTE *)pbTarget;\n                    DETOUR_TRACE((\"%p->%p: skipped over import table.\\n\", pbCode, pbNew));\n                    return pbNew;\n                }\n            }\n        }\n    }\n#endif\n\n    return FALSE;\n}\n\n#endif // DETOURS_ARM\n\n///////////////////////////////////////////////////////////////// X86 and X64.\n//\n#if defined(DETOURS_X86) || defined(DETOURS_X64)\n\nextern \"C\" BYTE TestCodes[];\n\nvoid DumpMemoryFragment(PBYTE pbData, ULONG cbData, ULONG cbSpace)\n{\n    ULONG n = 0;\n    for (; n < cbSpace; n++) {\n        if (n < cbData) {\n            printf(\"%02x\", pbData[n]);\n        }\n        else {\n            printf(\"  \");\n        }\n    }\n    if (n < cbData) {\n        printf(\".\");\n    }\n    else {\n        printf(\" \");\n    }\n}\n\nBOOL IsTerminate(PBYTE pbSrc)\n{\n    if ((0xC3 == pbSrc[0] && 0x00 == pbSrc[1]) ||       // bx lr\n        0xCB == pbSrc[0] ||                             // RETF\n        0xC2 == pbSrc[0] ||                             // RET dw\n        0xCA == pbSrc[0] ||                             // RETF dw\n        0xEB == pbSrc[0] ||                             // JMP ob\n        0xE9 == pbSrc[0] ||                             // JMP ol\n        0xEA == pbSrc[0]) {                             // JMP ol\n\n        return TRUE;\n    }\n    if (0xff == pbSrc[0] && 0x25 == pbSrc[1])           // JMP [addr]\n        return TRUE;\n    return FALSE;\n}\n\n#endif // DETOURS_X86 || DETOURS_X64\n\n/////////////////////////////////////////////////////////// X86, X64, and ARM.\n//\n#if defined(DETOURS_X86) || defined(DETOURS_X64) || defined(DETOURS_ARM)\nstruct BasicBlockLink\n{\n  public:\n    BasicBlockLink *    m_pNext;\n    PBYTE               m_pbEntry;\n    PCHAR               m_pszName;\n\n  public:\n    BasicBlockLink(PBYTE pbEntry, PCHAR pszName = NULL)\n    {\n        m_pNext = NULL;\n        m_pbEntry = pbEntry;\n        m_pszName = pszName;\n\n        *s_ppTail = this;\n        s_ppTail = &m_pNext;\n    }\n\n    BasicBlockLink * Next()\n    {\n        return m_pNext;\n    }\n\n    static BasicBlockLink * GetListHead()\n    {\n        return s_pHead;\n    }\n\n  protected:\n    static BasicBlockLink *     s_pHead;\n    static BasicBlockLink **    s_ppTail;\n};\n\nBasicBlockLink *    BasicBlockLink::s_pHead = NULL;\nBasicBlockLink **   BasicBlockLink::s_ppTail = &BasicBlockLink::s_pHead;\n\nstatic PBYTE s_pbBegin = NULL;\nstatic PBYTE s_pbLimit = NULL;\n\nint TestDetourCopyInstruction(PBYTE pbSrcInstruction, PCHAR pszFunction)\n{\n    PBYTE pbSrc = pbSrcInstruction;\n    ULONG nIns = 0;\n\n    if (pszFunction) {\n        printf(\"%s:\\n\", pszFunction);\n    }\n    for (; nIns < 4096; nIns++) {\n        BYTE rbDst[128];\n        PVOID pbDstPool = (PVOID)(rbDst + sizeof(rbDst));\n        LONG lExtra = 0;\n        PVOID pbTarget = NULL;\n        ULONG cbStep = (ULONG)((PBYTE)DetourCopyInstruction(rbDst, &pbDstPool, pbSrc,\n                                                            &pbTarget, &lExtra) - pbSrc);\n\n        printf(\"    %p:\", pbSrc);\n        DumpMemoryFragment(rbDst, cbStep, 10);\n        printf(\" \");\n        DumpMemoryFragment(rbDst, cbStep, 10);\n        if (pbTarget) {\n            if (pbTarget == DETOUR_INSTRUCTION_TARGET_DYNAMIC) {\n                printf(\"  Dynamic\\n\");\n            }\n            else {\n                printf(\" %p%c\\n\", pbTarget,\n                       (pbTarget >= s_pbBegin && pbTarget < s_pbLimit) ? ' ' : '!');\n            }\n        }\n        else {\n            printf(\"\\n\");\n        }\n\n        if (pbTarget && pbTarget != DETOUR_INSTRUCTION_TARGET_DYNAMIC) {\n            if (pbTarget > pbSrc &&\n                pbTarget >= s_pbBegin &&\n                pbTarget < s_pbLimit\n               ) {\n                (void) new BasicBlockLink((PBYTE)pbTarget, NULL);\n            }\n        }\n\n        if (IsTerminate(pbSrc)) {\n            break;\n        }\n\n        pbSrc += cbStep;\n    }\n    return nIns;\n}\n\nBOOL CALLBACK ExportCallback(_In_opt_ PVOID pContext,\n                             _In_ ULONG nOrdinal,\n                             _In_opt_ LPCSTR pszName,\n                             _In_opt_ PVOID pCode)\n{\n    (void)pContext;\n    (void)nOrdinal;\n    (void)pCode;\n\n    (VOID) new BasicBlockLink((PBYTE)pCode, pszName ? pszName : \"[NO NAME]\");\n    return TRUE;\n}\n#endif // DETOURS_X86 || DETOURS_X64\n\n//////////////////////////////////////////////////////////////////////// IA64.\n//\n#ifdef DETOURS_IA64\n#pragma warning(disable: 4201)  // ignore warning about unnamed sturcture in union.\n\nvoid DumpHi(PBYTE pbData, ULONG cbData, ULONG cbSpace)\n{\n    ULONG n = 0;\n    for (; n < cbSpace; n++) {\n        if (n < cbData) {\n            printf(\"%02x\", pbData[(cbData - 1) - n]);\n        }\n        else {\n            printf(\"  \");\n        }\n    }\n    printf(\"\\n\");\n}\n\nstruct DETOUR_IA64_BUNDLE_DISASSEMBLE : public DETOUR_IA64_BUNDLE\n{\n  public:\n    void SetBrx(UINT64 raw)\n    {\n        SetBrl();\n        SetBrlImm(raw);\n    }\n\n    void Dis()\n    {\n        const char szUnitNames[17] = \"?aimbflx?AIMBFLX\";\n\n        printf(\"%p: \", data);\n        BYTE nTemplate = GetTemplate();\n        BYTE nInst0 = GetInst0();\n        BYTE nInst1 = GetInst1();\n        BYTE nInst2 = GetInst2();\n        BYTE nUnit0 = GetUnit0();\n        BYTE nUnit1 = GetUnit1();\n        BYTE nUnit2 = GetUnit2();\n        if (nUnit1 == L_UNIT) { // MLX instruction\n            UINT64 d2 = (\n                         //          0x0000000000fffff0\n                         ((wide[1] & 0x00fffff000000000) >> 32) |\n                         //          0x000000ffff000000\n                         ((wide[0] & 0xffff000000000000) >> 24) |\n                         //          0x7fffff0000000000\n                         ((wide[1] & 0x00000000007fffff) << 40) |\n                         //          0x8000000000000000\n                         ((wide[1] & 0x0800000000000000) <<  4)\n                        );\n            printf(\"%02x %c%01x %010I64lx %c%01x %016I64lx\",\n                   nTemplate,\n                   szUnitNames[nUnit0], nInst0, GetData0(),\n                   szUnitNames[nUnit2], nInst2, d2);\n        }\n        else {\n            printf(\"%02x %c%01x %010I64lx %c%01x %010I64lx %c%01x %010I64lx\",\n                   nTemplate,\n                   szUnitNames[nUnit0], nInst0, GetData0(),\n                   szUnitNames[nUnit1], nInst1, GetData1(),\n                   szUnitNames[nUnit2], nInst2, GetData2());\n        }\n\n        if (IsBrl()) {\n            printf(\" brl  %p\", GetBrlTarget());\n        }\n        else if (IsMovlGp()) {\n            printf(\" movl gp=%p\", GetMovlGp());\n        }\n        if ((wide[0] & 0xfffffc000603ffff) == 0x002024000200100b &&\n            wide[1] == 0x0004000000203008) {\n\n            ULONG64 offset =\n                ((wide[0] & 0x0000000001fc0000) >> 18) |  // imm7b\n                ((wide[0] & 0x000001ff00000000) >> 25) |  // imm9d\n                ((wide[0] & 0x00000000f8000000) >> 11);   // imm5c\n            if (wide[0] & 0x0000020000000000) {\n                offset |= 0xffffffffffe00000;\n            }\n            printf(\" imm=%016I64lx\", offset);\n        }\n        printf(\"\\n\");\n    }\n};\n\n//////////////////////////////////////////////////////////////////////////////\n//\nBOOL CALLBACK ExportCallbackIA64(_In_opt_ PVOID pContext,\n                                 _In_ ULONG nOrdinal,\n                                 _In_opt_ LPCSTR pszName,\n                                 _In_opt_ PVOID pCode)\n{\n    (void)pContext;\n    (void)nOrdinal;\n\n    DETOUR_IA64_BUNDLE_DISASSEMBLE *pb = *(DETOUR_IA64_BUNDLE_DISASSEMBLE **)pCode;\n    DETOUR_IA64_BUNDLE temp;\n\n    if (!pb[0].Copy(&temp)) {\n        printf(\"%s:\\n  \", pszName ? pszName : \"[NO NAME]\");\n        pb[0].Dis();\n    }\n    return TRUE;\n}\n\n#if 0\nvoid TestBoth()\n{\n    LPVOID pvBase = VirtualAlloc((PBYTE)0x800000000, 0x10000,\n                                 MEM_RESERVE | MEM_COMMIT,\n                                 PAGE_EXECUTE_READWRITE);\n\n    DETOUR_IA64_BUNDLE *pbBase = (DETOUR_IA64_BUNDLE *)pvBase;\n    DETOUR_IA64_BUNDLE *pb = pbBase;\n\n    printf(\"TestBoth:\\n\");\n    for (UINT64 i = 0x10; i < 0x8000000000000000; i <<= 1) {\n        pb->SetMovlGp(i);\n        if (pb->GetMovlGp() != i) {\n            printf(\"Error in MovlGp!\\n\");\n            return;\n        }\n        pb++;\n\n        pb->SetBrl(i);\n        if (pb->GetBrlEip() != i) {\n            printf(\"Error in Brl!\\n\");\n            return;\n        }\n        pb++;\n    }\n\n    for (UINT64 i = (UINT64)(INT64)-0x10; i > 0; i <<= 1) {\n        pb->SetMovlGp(i);\n        if (pb->GetMovlGp() != i) {\n            printf(\"Error in MovlGp!\\n\");\n            return;\n        }\n        pb++;\n\n        pb->SetBrl(i);\n        if (pb->GetBrlEip() != i) {\n            printf(\"Error in Brl!\\n\");\n            return;\n        }\n        pb++;\n    }\n\n    printf(\"u %p %p\\n\", pbBase, pb);\n}\n#endif\n#endif // DETOURS_IA64\n\nint WINAPI WinMain(HINSTANCE hinst, HINSTANCE hprev, LPSTR lpszCmdLine, int nCmdShow)\n{\n    (void)hprev;\n    (void)hinst;\n    (void)lpszCmdLine;\n    (void)nCmdShow;\n\r\n    // Bug report, but it works here.\r\n    // 07ff8`4b783054 49ba 70b3d93a d40fb998 mov r10,98B90FD43AD9B370h\r\n    //\r\n    {\r\n        static const UCHAR mov_r10_imm64[] = {0x49, 0xba, 1, 2, 3, 4, 5, 6, 7, 8 };\r\n\r\n        PVOID const after = DetourCopyInstructionX64(0, 0, const_cast<PUCHAR>(mov_r10_imm64), 0, 0);\r\n\r\n        if (after != &mov_r10_imm64 + 1)\r\n        {\r\n            printf(\"mov_r10_imm64 failed, expected:%p vs. got:%p\\n\", &mov_r10_imm64 + 1, after);\r\n            if (IsDebuggerPresent())\r\n            {\r\n                __debugbreak();\r\n                DetourCopyInstructionX64(0, 0, const_cast<PUCHAR>(mov_r10_imm64), 0, 0);\r\n            }\r\n            return 1;\r\n        }\r\n    }\r\n\n#ifdef DETOURS_IA64\n    // First we check the pre-canned TestCodes from disasm.asm\n    //\n    PBYTE pbTest = *(PBYTE*)WinMain;\n    for (;; pbTest += 16) {\n        DETOUR_IA64_BUNDLE_DISASSEMBLE *pb = (DETOUR_IA64_BUNDLE_DISASSEMBLE *)pbTest;\n\n        pb->Dis();\n        if (pbTest[0] == 0xff) {\n            break;\n        }\n        DumpHi(pbTest, 16, 16);\n    }\n\n#if 0\n    printf(\"\\n\\n\");\n\n    DETOUR_IA64_BUNDLE_DISASSEMBLE *pb = (DETOUR_IA64_BUNDLE_DISASSEMBLE *)pbTest;\n    DETOUR_IA64_BUNDLE_DISASSEMBLE *pbBeg = pb;\n    DWORD dwOld;\n    VirtualProtect(pb, 0x2000, PAGE_EXECUTE_READWRITE, &dwOld);\n    printf(\"%p: (%d)\\n\", pb, sizeof(pb));\n    pb++;\n    printf(\"%p: (%d)\\n\", pb, sizeof(pb));\n    pb++; pb->SetBrx(0);\n    pb++; pb->SetBrx(0);\n    pb++; pb->SetBrx(0);\n    pb++; pb->SetBrx(0xffffffffffffffff);\n    pb++; pb->SetBrx(0x0fffffffffffffff);\n    pb++; pb->SetBrx(0x00ffffffffffffff);\n    pb++; pb->SetBrx(0x000fffffffffffff);\n    pb++; pb->SetBrx(0x0000ffffffffffff);\n    pb++; pb->SetBrx(0x00000fffffffffff);\n    pb++; pb->SetBrx(0x000000ffffffffff);\n    pb++; pb->SetBrx(0x0000000fffffffff);\n    pb++; pb->SetBrx(0x00000000ffffffff);\n    pb++; pb->SetBrx(0x000000000fffffff);\n    pb++; pb->SetBrx(0x0000000000ffffff);\n    pb++; pb->SetBrx(0x00000000000fffff);\n    pb++; pb->SetBrx(0x000000000000ffff);\n    pb++; pb->SetBrx(0x0000000000000fff);\n    pb++; pb->SetBrx(0x00000000000000ff);\n    pb++; pb->SetBrx(0x000000000000000f);\n    pb++; pb->SetBrx(0x0000000000000000);\n    pb++; pb->SetBrx(0xffffffffffffffff);\n    pb++; pb->SetBrx(0xffffffffffffffff);\n    pb->SetInst0(0xff);\n    pb->SetData0(0xffffffffffffffff);\n    printf(\"%p:\\n\", pb);\n    DETOUR_IA64_BUNDLE_DISASSEMBLE *pbEnd = pb;\n    for (pb = pbBeg; pb < pbEnd; pb++) {\n        printf(\"  %p: \", pb);\n        DumpHi((BYTE*)pb, 16, 16);\n    }\n#endif\n\n#if 1\n    {\n        // Then we check all of the code we can find in user32.dll\n        //\n        printf(\"\\n\");\n        HINSTANCE hInst = LoadLibraryA(\"user32.dll\");\n        printf(\"Loaded: user32.dll: %p\\n\", hInst);\n\n        PBYTE pbEntry = (PBYTE)DetourGetEntryPoint(hInst);\n        printf(\"Entry: %p\\n\", pbEntry);\n        ExportCallbackIA64(NULL, 0, \"[Entry]\", pbEntry);\n        DetourEnumerateExports(hInst, NULL, ExportCallbackIA64);\n    }\n\n    {\n        // Then we check all of the code we can find in opengl32.dll\n        //\n        printf(\"\\n\");\n        HINSTANCE hInst = LoadLibraryA(\"opengl32.dll\");\n        printf(\"Loaded: opengl32.dll: %p\\n\", hInst);\n\n        PBYTE pbEntry = (PBYTE)DetourGetEntryPoint(hInst);\n        printf(\"Entry: %p\\n\", pbEntry);\n        ExportCallbackIA64(NULL, 0, \"[Entry]\", pbEntry);\n        DetourEnumerateExports(hInst, NULL, ExportCallbackIA64);\n    }\n\n    printf(\"\\n\");\n    for (HINSTANCE hInst = NULL; (hInst = DetourEnumerateModules(hInst)) != NULL;) {\n        CHAR szModuleName[512];\n        GetModuleFileNameA(hInst, szModuleName,\n                           sizeof(szModuleName)/sizeof(szModuleName[0]));\n        printf(\"%p : %s\\n\", hInst, szModuleName);\n        DetourEnumerateExports(hInst, NULL, ExportCallbackIA64);\n    }\n\n    printf(\"\\n\");\n#endif\n#if 0\n    TestBoth();\n#endif\n#endif // DETOURS_IA64\n\n#if defined(DETOURS_X64) || defined(DETOURS_X86)\n    // First we check the pre-canned TestCodes from disasm.asm\n    //\n    PBYTE pbBegin = (PBYTE)DetourCodeFromPointer(TestCodes, NULL);\n    printf(\"%p:\\n\", pbBegin);\n    for (PBYTE pbTest = pbBegin;;) {\n        if (pbTest[0] != 0xcc) {    // int 3\n            printf(\"%08lx  \", (ULONG)(pbTest - pbBegin));\n            DumpMemoryFragment(pbTest, 8, 8);\n            printf(\"\\n\");\n            printf(\"failed on last.\\n\");\n            return 1;\n        }\n        pbTest++;\n\n        if (pbTest[0] == 0x70 || pbTest[0] == 0x71) {\n            printf(\"[%p]:\\n\", pbTest);\n        }\n        BYTE rbDst[128];\n        PVOID pbDstPool = (PVOID)(rbDst + sizeof(rbDst));\n        LONG lExtra = 0;\n        PVOID pbTarget = NULL;\n        PBYTE pbNext = (PBYTE)DetourCopyInstruction(rbDst, &pbDstPool, pbTest,\n                                                    &pbTarget, &lExtra);\n\n        LONG cbTest = (LONG)(pbNext - pbTest);\n\n        printf(\"%08lx  \", (ULONG)(pbTest - pbBegin));\n        DumpMemoryFragment(pbTest, cbTest, 12);\n        printf(\"[%16p] \", pbTarget);\n        DumpMemoryFragment(rbDst, cbTest + lExtra, 11);\n        printf(\"\\n\");\n\n        if (pbTest[cbTest] != 0xcc) {\n            printf(\"failed!\\n\");\n            return 1;\n        }\n\n        pbTest += cbTest;\n\n        if (pbTest[0] == 0xcc && pbTest[1] == 0xcc) {\n            break;\n        }\n    }\n\n#if 0\n    // Then we check all of the code we can find in user32.dll\n    //\n    HINSTANCE hInst = LoadLibraryA(\"user32.dll\");\n    printf(\"Loaded: user32.dll: %p\\n\", hInst);\n\n    s_pbBegin = (PBYTE)hInst;\n    s_pbLimit = s_pbBegin + DetourGetModuleSize(hInst);\n\n    PBYTE pbEntry = DetourGetEntryPoint(hInst);\n    (VOID) new BasicBlockLink(pbEntry, \"user32.dll\");\n\n    DetourEnumerateExports(hInst, NULL, ExportCallback);\n\n    ULONG nIns = 0;\n    for (BasicBlockLink *pLink = BasicBlockLink::GetListHead();\n         pLink; pLink = pLink->Next()) {\n\n        nIns += TestDetourCopyInstruction(pLink->m_pbEntry, pLink->m_pszName);\n        if (nIns > 100000) {\n            break;\n        }\n    }\n    printf(\"Disassembled %d instructions.\\n\", nIns);\n#endif\n#endif // DETOURS_X86 || DETOURS_X64\n\n#ifdef DETOURS_ARM\n    // Create an output buffer and fill it with debugbreaks.\n    //\n    PBYTE pbBuffer\n        = (PBYTE)VirtualAlloc(NULL, 0x400, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);\n    for (PBYTE pbOut = pbBuffer; pbOut < pbBuffer + 0x400;) {\n        *pbOut++ = 0xfe;\n        *pbOut++ = 0xde;\n    }\n    PBYTE pbDst = pbBuffer;\n    PVOID pvDstPool = (PVOID)(pbBuffer + 0x400);\n\n    // First we check the pre-canned TestCodes from disasm.asm\n    //\n    PBYTE pbBegin = (PBYTE)DetourCodeFromPointer(TestCodes, NULL);\n    printf(\"%p: (TestCodes %p) => %p\\n\", pbBegin, TestCodes, pbBuffer);\n    for (PBYTE pbSrc = pbBegin;;) {\n        if (pbSrc[0] != 0xfe && pbSrc[1] != 0xde) {    // BREAK\n            printf(\"%08x  \", pbSrc - pbBegin);\n            DumpMemoryFragment(pbSrc, 8, 8);\n            printf(\"\\n\");\n            printf(\"failed on last.\\n\");\n            return 1;\n        }\n        pbSrc += 2;\n        *pbDst++ = 0xfe;\n        *pbDst++ = 0xde;\n\n        if ((pbSrc[0] == 0x00 && pbSrc[1] == 0xbf) &&  // NOP\n            (pbSrc[2] != 0xfe && pbSrc[3] != 0xde)) {    // BREAK\n            // Skip over a single NOP so we can test alignment.\n            pbSrc += 2;\n        }\n\n        if ((pbSrc[0] == 0x00 && pbSrc[1] == 0xbf) &&  // NOP\n            (pbSrc[2] != 0xfe && pbSrc[3] != 0xde)) {    // BREAK\n            // If there is a second NOP, then we insert alignment.\n            pbSrc += 2;\n            *pbDst++ = 0x00;\n            *pbDst++ = 0xbf;\n        }\n\n\n        LONG lExtra = 0;\n        PVOID pbTarget = NULL;\n        PBYTE pbNext = (PBYTE)DetourCopyInstruction(pbDst, &pvDstPool, pbSrc, &pbTarget, &lExtra);\n\n        LONG cbTest = (LONG)(pbNext - pbSrc);\n\n        printf(\"%08x  \", pbSrc - pbBegin);\n        DumpMemoryFragment(pbSrc, cbTest, 4);\n        printf(\"[%8p] \", pbTarget);\n        DumpMemoryFragment(pbDst, cbTest + lExtra, 16);\n        printf(\"\\n\");\n\n        if (pbSrc[cbTest] != 0xfe || pbSrc[cbTest+1] != 0xde) {\n            printf(\"%p: failed! (pbSrc[n]=%02x, pbSrc[n+1]=%02x\\n\",\n                   pbSrc,\n                   pbSrc[cbTest], pbSrc[cbTest+1]);\n            __debugbreak();\n            pbNext = (PBYTE)DetourCopyInstruction(pbDst, &pvDstPool, pbSrc, &pbTarget, &lExtra);\n            cbTest = (LONG)(pbNext - pbSrc);\n            return 1;\n        }\n\n        pbDst += cbTest + lExtra;\n        pbSrc += cbTest;\n\n        if (pbSrc[0] == 0xfe && pbSrc[1] == 0xde &&\n            pbSrc[2] == 0xfe && pbSrc[3] == 0xde) {\n            break;\n        }\n    }\n\n#if 0\n    // Then we check all of the code we can find in user32.dll\n    //\n    HINSTANCE hInst = LoadLibraryA(\"user32.dll\");\n    printf(\"Loaded: user32.dll: %p\\n\", hInst);\n\n    s_pbBegin = (PBYTE)hInst;\n    s_pbLimit = s_pbBegin + DetourGetModuleSize(hInst);\n\n    PBYTE pbEntry = DetourGetEntryPoint(hInst);\n    (VOID) new BasicBlockLink(pbEntry, \"user32.dll\");\n\n    DetourEnumerateExports(hInst, NULL, ExportCallback);\n\n    ULONG nIns = 0;\n    for (BasicBlockLink *pLink = BasicBlockLink::GetListHead();\n         pLink; pLink = pLink->Next()) {\n\n        nIns += TestDetourCopyInstruction(pLink->m_pbEntry, pLink->m_pszName);\n        if (nIns > 100000) {\n            break;\n        }\n    }\n    printf(\"Disassembled %d instructions.\\n\", nIns);\n#endif\n#endif // DETOURS_ARM\n\n    return 0;\n}\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/disas/ia64.asm",
    "content": "/////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (ia64.asm/disas.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n    .section .text\n    .proc  TestCodes#\n    .global TestCodes#\n    .align 64\n\nTestCodes:\n{   .mii\n        and     r21 = 7, r32\n        mux1    r25 = r33, @brcst\n        add     r16 = r32, r34\n} { .mmb\n        cmp.ge  p9 = 0, r34\n        mov     r8 = r32\n(p9)    br.ret.spnt b0\n  ;;\n}\n// align on an 8-byte boundary\n{   .mmi\n        cmp.ne  p15 = 0, r21   //Low 3 bits zero?\n        cmp.gt  p10 = 0x30, r34\n        cmp.eq  p6, p7 = 0, r33\n} { .mmb\n        nop.m   0\n        nop.m   0\n(p15)   br.cond.dpnt Align_Loop\n  ;;\n} { .mmi\n(p7)    mov     r27 = 0x88\n(p6)    mov     r27 = 0x90\n        tbit.nz p14,p13 = r32, 3 // is aligned on 8-bytes (to align on 16 before FP loop)?\n} { .mbb\n        nop.m   0\n(p10)   br.cond.dpnt Aligned_Short  // blocks < 48 bytes\n(p7)    br.cond.dpnt Aligned_Long;  // do 8-byte stores for non-zero fills, 16-byte f0 for zero-fills\n  ;;\n}\n\n// zero-fills >= 48 bytes goes through an f0 16-byte store loop\nAligned_FP_Long:\n{   .mmi\n        add     r28 = 0x80, r27\n        add     r29 = 0x100, r27\n        add     r30 = 0x180, r27\n} { .mmi\n(p14)   add     r14 = 0x88, r32\n(p14)   st8     [r32] = r0, 8\n(p14)   add     r34 = -0x8, r34\n  ;;\n} { .mmi\n(p13)   add     r14 = 0x80, r32\n        cmp.ge  p7 = r34, r27\n        add     r27 = 0x200, r27\n} { .mmi\n        add     r15 = 0x180, r32\n        add     r17 = 0x200, r32\n        nop.i   0\n  ;;\n} { .mmi\n        add     r26 = 0x280, r32\n        cmp.ge  p8 = r34, r28\n        cmp.ge  p9 = r34, r29\n} { .mmi\n        stf.spill   [r32] = f0       // Line 0\n(p7)    stf.spill   [r14] = f0,0x80  // Line +1 0x80\n        add     r28 = 0x200, r28\n  ;;\n} { .mmi\n(p8)    stf.spill   [r14] = f0   // Line +2 0x100\n(p9)    stf.spill   [r15] = f0   // Line +3 0x180\n        cmp.ge  p10 = r34, r28\n} { .mmi\n        cmp.ge  p11 = r34, r30\n        cmp.ge  p12 = r34, r27\n        nop.i   0\n  ;;\n} { .mmi\n(p11)   stf.spill   [r17] = f0   // Line +4 0x200\n(p12)   stf.spill   [r26] = f0, 0x80 // Line +5 0x280\n        add    r31 = 0x10, r32\n  ;;\n}\n\n    .align 32\nLong_FP_loop:\n{   .mmi\n(p10)   stf.spill   [r26] = f0, 0x80 // Line +6\n        stf.spill   [r31] = f0, 0x20\n        cmp.le  p15,p12 = 0x40, r34\n} { .mmb\n        add     r32 = 0x20, r32\n        add     r34 = -0x20, r34\n(p12)   br.cond.dpnt Aligned_Short\n  ;;\n} { .mmi\n(p15)   stf.spill   [r32] = f0, 0x20\n(p15)   stf.spill   [r31] = f0, 0x20\n        cmp.le  p15,p12 = 0x40, r34\n} { .mmb\n        add     r21 = -0x60, r34\n        add     r34 = -0x20, r34\n(p12)   br.cond.dpnt Aligned_Short\n  ;;\n} { .mmi\n(p15)   stf.spill   [r32] = f0, 0x20\n(p15)   stf.spill   [r31] = f0, 0x20\n        cmp.le  p15,p12 = 0x40, r34\n} { .mmb\n        cmp.ge  p10 = r21, r28\n        add     r34 = -0x20, r34\n(p12)   br.cond.dpnt Aligned_Short\n  ;;\n} { .mmi\n(p15)   stf.spill   [r32] = f0, 0x20\n(p15)   stf.spill   [r31] = f0, 0x20\n        cmp.le  p15,p12 = 0x40, r34\n} { .mbb\n        add     r34 = -0x20, r34\n(p15)   br.cond.sptk.many   Long_FP_loop\n        br.cond.dpnt.many   Aligned_Short\n  ;;\n}\n\n    .align 32\n// >= 48 bytes non-zero fills go through a 8-byte store based loop\nAligned_Long:\n{   .mmi\n        add     r28 = 0x80, r27\n        add     r29 = 0x100, r27\n        add     r30 = 0x180, r27\n} { .mmi\n        add     r14 = 0x80, r32\n        cmp.ge  p7 = r34, r27\n        nop.i   0\n  ;;\n} { .mmi\n        add     r26 = 0x180, r32\n        cmp.ge  p8 = r34, r28\n        add     r31 = 8, r32\n} { .mmi\n        st8     [r32] = r25\n(p7)    st8     [r14] = r25, 0x80\n        cmp.ge  p9 = r34, r29\n  ;;\n} { .mmi\n(p8)    st8     [r14] = r25\n(p9)    st8     [r26] = r25, 0x80\n        cmp.ge  p10 = r34, r30\n  ;;\n}\n    .align 32\nLong_loop:\n{   .mmi\n(p10)   st8     [r26] = r25, 0x80\n        st8     [r31] = r25, 0x10\n        cmp.le  p15,p12 = 0x20, r34\n} { .mmb\n        add     r32 = 0x10, r32\n        add     r34 = -0x10, r34\n(p12)   br.cond.dpnt Aligned_Short\n  ;;\n} { .mmi\n(p15)   st8     [r32] = r25, 0x10\n(p15)   st8     [r31] = r25, 0x10\n        cmp.le  p15,p12 = 0x20, r34\n} { .mmb\n        nop.m   0\n        add     r34 = -0x10, r34\n(p12)   br.cond.dpnt Aligned_Short\n  ;;\n} { .mmi\n(p15)   st8     [r32] = r25, 0x10\n(p15)   st8     [r31] = r25, 0x10\n        cmp.le  p15,p12 = 0x20, r34\n} { .mmb\n        nop.m   0\n        add     r34 = -0x10, r34\n(p12)   br.cond.dpnt Aligned_Short\n  ;;\n} { .mmi\n(p15)   st8     [r32] = r25, 0x10\n(p15)   st8     [r31] = r25, 0x10\n        cmp.le  p15,p12 = 0x20, r34\n} { .mmb\n        nop.m   0\n        add     r34 = -0x10, r34\n(p12)   br.cond.dpnt Aligned_Short\n  ;;\n} { .mmi\n(p15)   st8     [r32] = r25, 0x10\n(p15)   st8     [r31] = r25, 0x10\n        cmp.le  p15,p12 = 0x20, r34\n} { .mmb\n        nop.m   0\n        add     r34 = -0x10, r34\n(p12)   br.cond.dpnt Aligned_Short\n  ;;\n} { .mmi\n(p15)   st8     [r32] = r25, 0x10\n(p15)   st8     [r31] = r25, 0x10\n        cmp.le  p15,p12 = 0x20, r34\n} { .mmb\n        add     r21 = -0x30, r34\n        add     r34 = -0x10, r34\n(p12)   br.cond.dpnt Aligned_Short\n  ;;\n} { .mmi\n(p15)   st8     [r32] = r25, 0x10\n(p15)   st8     [r31] = r25, 0x10\n        cmp.le  p15,p12 = 0x20, r34\n} { .mmb\n        cmp.ge  p10 = r21, r30\n        add     r34 = -0x10, r34\n(p12)   br.cond.dpnt Aligned_Short\n  ;;\n} { .mmi\n(p15)   st8     [r32] = r25, 0x10\n(p15)   st8     [r31] = r25, 0x10\n        cmp.le  p15,p12 = 0x20, r34\n} { .mmb\n        add     r34 = -0x10, r34\n        nop.m   0\n(p15)   br.cond.sptk.many Long_loop\n  ;;\n\n}\n\n//\n// Do partial word stores\n//\n    .align 32\nAligned_Short:\n{   .mmi\n        and     r27 = 2, r34\n        add     r31 = 8, r32\n        tbit.nz p6 = r34, 0   //bit 0 on?\n} { .mmb\n        cmp.le  p11 = 0x10, r34\n        cmp.eq  p10 = 0, r34\n(p10)   br.ret.dpnt  b0\n  ;;\n} { .mmi\n(p11)   st8     [r32] = r25, 0x10\n(p11)   st8     [r31] = r25, 0x10\n        cmp.le  p12 = 0x20, r34\n} { .mmi\n        add     r17 = -2, r16\n        add     r18 = -4, r16\n        tbit.nz p9 = r34, 3   //odd number of st8s?\n  ;;\n} { .mmi\n(p12)   st8     [r32] = r25, 0x10\n(p12)   st8     [r31] = r25, 0x10\n        nop.i   0\n} { .mmi\n(p6)    add     r18 = -1, r18\n(p6)    add     r16 = -1, r16\n        cmp.ne  p7 = 0, r27\n  ;;\n} { .mmi\n(p9)    st8     [r32] = r25\n(p6)    st1     [r16] = r25\n        tbit.nz p8 = r34, 2   //bit 2 on?\n} { .mmi\n(p7)    add     r18 = -2, r18\n(p6)    add     r17 = -1, r17\n        nop.i   0\n  ;;\n} { .mmb\n(p8)    st4     [r18] = r25\n(p7)    st2     [r17] = r25\n        br.ret.sptk.many b0\n  ;;\n}\n\n    .align 32\n// Align the input pointer to an 8-byte boundary\nAlign_Loop:\n{   .mmi\n        st1     [r32] = r33,1\n        add     r21 = 1, r21\n        cmp.eq  p15 = 1, r34\n} { .mmb\n        cmp.ge  p11 = 0x30, r34\n        add     r34 = -1, r34\n(p15)   br.ret.dpnt  b0\n  ;;\n} { .mmb\n        cmp.gt  p10 = 8, r21\n        cmp.eq  p6, p7 = 0, r33\n(p10)   br.cond.sptk Align_Loop\n  ;;\n} { .mmi\n(p7)    mov     r27 = 0x88\n(p6)    mov     r27 = 0x90\n        tbit.nz p14,p13 = r32, 3 // is aligned on 8-bytes (to align on 16 before FP loop)?\n} { .bbb\n(p11)   br.cond.dpnt Aligned_Short  // blocks < 48 bytes\n(p7)    br.cond.dpnt Aligned_Long;  // non-zero fills\n        br.cond.dptk Aligned_FP_Long; // zero fills\n  ;;\n}\n    .endp  TestCodes#\n\n    .proc  Again#\nAgain:\n    brl         TestCodes\n    brl         TestCodes\n    brl         TestCodes\n    brl         TestCodes\n    brl         TestCodes\n    brl         TestCodes\n    brl         TestCodes\n    brl         TestCodes\n    brl         TestCodes\n    brl         TestCodes\n    brl         Fore1\n    brl         Fore2\n    brl         Fore3\n    brl         Fore4\n    brl         Fore5\n    brl         Fore6\n    brl         Fore7\n    .endp  Again#\n\n    data4       0xffffff00\n    data4       0xffffffff\n    data4       0xffffffff\n    data4       0xffffffff\n    .align 64\n\n    data4       0xffffff00\n    data4       0xffffffff\n    data4       0xffffffff\n    data4       0xffffffff\n\n{\n    addl   r2=0xffffffffffffffff, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0xfffffffffffffff0, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0xffffffffffffff00, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0xfffffffffffff000, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0xfffffffffffff000, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0xffffffffffff0000, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0xfffffffffff00000, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0xffffffffffe00000, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0x00000000001fffff, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0x00000000000fffff, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0x000000000000ffff, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0x0000000000000fff, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0x00000000000000ff, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0x000000000000000f, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0x0000000000000000, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0x0000000000000001, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0x0000000000000002, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0x0000000000000004, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0x0000000000000008, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0x0000000000000010, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0x0000000000000020, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0x0000000000000040, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0x0000000000000080, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0x0000000000000100, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0x0000000000000200, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0x0000000000000400, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0x0000000000000800, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0x0000000000001000, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0x0000000000002000, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0x0000000000004000, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0x0000000000008000, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0x0000000000010000, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0x0000000000020000, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0x0000000000040000, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0x0000000000080000, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0x0000000000100000, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n{\n    addl   r2=0xffffffffffe00000, gp ;;\n    ld8    r2=[r2]\n    nop.i  0 ;;\n}\n\n    data4       0\n    .align 64\n\n    .align 64                                           ;\n    .proc  Fore1#\nFore1:\n    brl         Fore2\n    .endp  Fore1#\n\n    data4       0\n    .align 64\n\n    .proc  Fore2#\nFore2:\n    brl         Fore3\n    .endp  Fore2#\n\n    data4       0\n    .align 64\n\n    .proc  Fore3#\nFore3:\n    brl         Fore3\n    movl        gp = 0xffffffffffffffff\n    brl         Fore4\n    movl        gp = 0x0000000000000000\n    movl        gp = 0x0000000000000001\n    movl        gp = 0x0000000000000002\n    movl        gp = 0x0000000000000004\n    movl        gp = 0x0000000000000008\n    movl        gp = 0x0000000000000010\n    movl        gp = 0x0000000000000020\n    movl        gp = 0x0000000000000040\n    movl        gp = 0x0000000000000080\n    movl        gp = 0x0000000000000100\n    movl        gp = 0x0000000000000200\n    movl        gp = 0x0000000000000400\n    movl        gp = 0x0000000000000800\n    movl        gp = 0x0000000000001000\n    movl        gp = 0x0000000000002000\n    movl        gp = 0x0000000000004000\n    brl         Fore4\n    movl        gp = 0x0000000000000000\n    brl         Fore4\n    movl        gp = 0x0000000000000001\n    brl         Fore4\n    movl        gp = 0x0000000000000002\n    brl         Fore4\n    movl        gp = 0x0000000000000004\n    brl         Fore4\n    movl        gp = 0x0000000000000008\n    brl         Fore4\n    movl        gp = 0x0000000000000010\n    brl         Fore4\n    movl        gp = 0x0000000000000020\n    brl         Fore4\n    movl        gp = 0x0000000000000040\n    brl         Fore4\n    movl        gp = 0x0000000000000080\n    brl         Fore4\n    movl        gp = 0x0000000000000100\n    brl         Fore4\n    movl        gp = 0x0000000000000200\n    brl         Fore4\n    movl        gp = 0x0000000000000400\n    brl         Fore4\n    movl        gp = 0x0000000000000800\n    brl         Fore4\n    movl        gp = 0x0000000000001000\n    brl         Fore4\n    movl        gp = 0x0000000000002000\n    brl         Fore4\n    movl        gp = 0x0000000000004000\n    brl         Fore4\n    movl        gp = 0x0000000000008000\n    brl         Fore4\n    movl        gp = 0x0000000000010000\n    brl         Fore4\n    movl        gp = 0x0000000000020000\n    brl         Fore4\n    movl        gp = 0x0000000000040000\n    brl         Fore4\n    movl        gp = 0x0000000000080000\n    brl         Fore4\n    movl        gp = 0x0000000000100000\n    brl         Fore4\n    movl        gp = 0x0000000000200000\n    brl         Fore4\n    movl        gp = 0x0000000000400000\n    brl         Fore4\n    movl        gp = 0x0000000000800000\n    brl         Fore4\n    movl        gp = 0x0000000001000000\n    brl         Fore4\n    movl        gp = 0x0000000002000000\n    brl         Fore4\n    movl        gp = 0x0000000004000000\n    brl         Fore4\n    movl        gp = 0x0000000008000000\n    brl         Fore4\n    movl        gp = 0x0000000010000000\n    brl         Fore4\n    movl        gp = 0x0000000020000000\n    brl         Fore4\n    movl        gp = 0x0000000040000000\n    brl         Fore4\n    movl        gp = 0x0000000080000000\n    brl         Fore4\n    movl        gp = 0x0000000100000000\n    brl         Fore4\n    movl        gp = 0x0000000200000000\n    brl         Fore4\n    movl        gp = 0x0000000400000000\n    brl         Fore4\n    movl        gp = 0x0000000800000000\n    brl         Fore4\n    movl        gp = 0x0000001000000000\n    brl         Fore4\n    movl        gp = 0x0000002000000000\n    brl         Fore4\n    movl        gp = 0x0000004000000000\n    brl         Fore4\n    movl        gp = 0x0000008000000000\n    brl         Fore4\n    movl        gp = 0x0000010000000000\n    brl         Fore4\n    movl        gp = 0x0000020000000000\n    brl         Fore4\n    movl        gp = 0x0000040000000000\n    brl         Fore4\n    movl        gp = 0x0000080000000000\n    brl         Fore4\n    movl        gp = 0x0000100000000000\n    brl         Fore4\n    movl        gp = 0x0000200000000000\n    brl         Fore4\n    movl        gp = 0x0000400000000000\n    brl         Fore4\n    movl        gp = 0x0000800000000000\n    brl         Fore4\n    movl        gp = 0x0001000000000000\n    brl         Fore4\n    movl        gp = 0x0002000000000000\n    brl         Fore4\n    movl        gp = 0x0004000000000000\n    brl         Fore4\n    movl        gp = 0x0008000000000000\n    brl         Fore4\n    movl        gp = 0x0010000000000000\n    brl         Fore4\n    movl        gp = 0x0020000000000000\n    brl         Fore4\n    movl        gp = 0x0040000000000000\n    brl         Fore4\n    movl        gp = 0x0080000000000000\n    brl         Fore4\n    movl        gp = 0x0100000000000000\n    brl         Fore4\n    movl        gp = 0x0200000000000000\n    brl         Fore4\n    movl        gp = 0x0400000000000000\n    brl         Fore4\n    movl        gp = 0x0800000000000000\n    brl         Fore4\n    movl        gp = 0x1000000000000000\n    brl         Fore4\n    movl        gp = 0x2000000000000000\n    brl         Fore4\n    movl        gp = 0x4000000000000000\n    brl         Fore4\n    movl        gp = 0x8000000000000000\n    brl         Fore4\n    movl        gp = 0xffffffffffffffff\n    brl         Fore4\n    movl        gp = 0x0000000000000000\n    brl         Fore4\n    movl        gp = 0xfffffffffffffffe\n    brl         Fore4\n    movl        gp = 0xfffffffffffffffc\n    brl         Fore4\n    movl        gp = 0xfffffffffffffff8\n    brl         Fore4\n    movl        gp = 0xfffffffffffffff0\n    brl         Fore4\n    movl        gp = 0xffffffffffffffe0\n    brl         Fore4\n    movl        gp = 0xffffffffffffffc0\n    brl         Fore4\n    movl        gp = 0xffffffffffffff80\n    brl         Fore4\n    movl        gp = 0xffffffffffffff00\n    brl         Fore4\n    movl        gp = 0xfffffffffffffe00\n    brl         Fore4\n    movl        gp = 0xfffffffffffffc00\n    brl         Fore4\n    movl        gp = 0xfffffffffffff800\n    brl         Fore4\n    movl        gp = 0xfffffffffffff000\n    brl         Fore4\n    movl        gp = 0xffffffffffffe000\n    brl         Fore4\n    movl        gp = 0xffffffffffffc000\n    brl         Fore4\n    movl        gp = 0xffffffffffff8000\n    brl         Fore4\n    movl        gp = 0xffffffffffff0000\n    brl         Fore4\n    movl        gp = 0xfffffffffffe0000\n    brl         Fore4\n    movl        gp = 0xfffffffffffc0000\n    brl         Fore4\n    movl        gp = 0xfffffffffff80000\n    brl         Fore4\n    movl        gp = 0xfffffffffff00000\n    brl         Fore4\n    movl        gp = 0xffffffffffe00000\n    brl         Fore4\n    movl        gp = 0xffffffffffc00000\n    brl         Fore4\n    movl        gp = 0xffffffffff800000\n    brl         Fore4\n    movl        gp = 0xffffffffff000000\n    brl         Fore4\n    movl        gp = 0xfffffffffe000000\n    brl         Fore4\n    movl        gp = 0xfffffffffc000000\n    brl         Fore4\n    movl        gp = 0xfffffffff8000000\n    brl         Fore4\n    movl        gp = 0xfffffffff0000000\n    brl         Fore4\n    movl        gp = 0xffffffffe0000000\n    brl         Fore4\n    movl        gp = 0xffffffffc0000000\n    brl         Fore4\n    movl        gp = 0xffffffff80000000\n    brl         Fore4\n    movl        gp = 0xffffffff00000000\n    brl         Fore4\n    movl        gp = 0xfffffffe00000000\n    brl         Fore4\n    movl        gp = 0xfffffffc00000000\n    brl         Fore4\n    movl        gp = 0xfffffff800000000\n    brl         Fore4\n    movl        gp = 0xfffffff000000000\n    brl         Fore4\n    movl        gp = 0xffffffe000000000\n    brl         Fore4\n    movl        gp = 0xffffffc000000000\n    brl         Fore4\n    movl        gp = 0xffffff8000000000\n    brl         Fore4\n    movl        gp = 0xffffff0000000000\n    brl         Fore4\n    movl        gp = 0xfffffe0000000000\n    brl         Fore4\n    movl        gp = 0xfffffc0000000000\n    brl         Fore4\n    movl        gp = 0xfffff80000000000\n    brl         Fore4\n    movl        gp = 0xfffff00000000000\n    brl         Fore4\n    movl        gp = 0xffffe00000000000\n    brl         Fore4\n    movl        gp = 0xffffc00000000000\n    brl         Fore4\n    movl        gp = 0xffff800000000000\n    brl         Fore4\n    movl        gp = 0xffff000000000000\n    brl         Fore4\n    movl        gp = 0xfffe000000000000\n    brl         Fore4\n    movl        gp = 0xfffc000000000000\n    brl         Fore4\n    movl        gp = 0xfff8000000000000\n    brl         Fore4\n    movl        gp = 0xfff0000000000000\n    brl         Fore4\n    movl        gp = 0xffe0000000000000\n    brl         Fore4\n    movl        gp = 0xffc0000000000000\n    brl         Fore4\n    movl        gp = 0xff80000000000000\n    brl         Fore4\n    movl        gp = 0xff00000000000000\n    brl         Fore4\n    movl        gp = 0xfe00000000000000\n    brl         Fore4\n    movl        gp = 0xfc00000000000000\n    brl         Fore4\n    movl        gp = 0xf800000000000000\n    brl         Fore4\n    movl        gp = 0xf000000000000000\n    brl         Fore4\n    movl        gp = 0xe000000000000000\n    brl         Fore4\n    movl        gp = 0xc000000000000000\n    brl         Fore4\n    movl        gp = 0x8000000000000000\n    brl         Fore4\n    movl        gp = 0x0000000000000000\n    brl         Fore4\n    movl        gp = 0x0000000000000000\n    brl         Fore4\n    brl.sptk.many Fore4\n    brl.sptk.many Fore4\n    brl.sptk.many Fore4\n    brl.sptk.many Fore4\n\n    movl        gp = 0xf0f0f0f0f0f0f0f0\n    brl.sptk.many Fore9\nFore9:\n    brl.sptk.few Fore8\nFore8:\n    brl.sptk.few Fore8\n    brl.sptk.few Fore8\n    brl.sptk.few Fore8\n    data1       0x05,0x00,0x00,0x00,0x01,0x00,0xff,0xff,0xff,0xff,0x7f,0x00,0xf0,0xff,0xff,0xc8\n    data1       0x05,0x00,0x00,0x00,0x01,0x00,0xff,0xff,0xff,0xff,0x7f,0x00,0xf0,0xff,0xff,0xc0\n    data1       0x05,0x00,0x00,0x00,0x01,0x00,0xff,0xff,0xff,0xff,0x7f,0x00,0xf0,0xff,0xff,0xc8\n    data1       0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x25,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x45,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x85,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x02,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x04,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x08,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x10,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x20,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x40,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x80,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x08,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x80,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x00,0x08,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x00,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x00,0x00,0x01,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x00,0x00,0x01,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data1       0x05,0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0\n    data4       0xffffffff\n    data4       0xffffffff\n    data4       0xffffffff\n    data4       0xffffffff\n    movl        gp = 0xf0f0f0f0f0f0f0f0\n\n{   .mii\n        nop.m 0\n        nop.i 0\n        nop.i 0\n}\n{   .mmi\n        nop.m 0\n        nop.m 0\n        nop.i 0\n}\n{ .mmb\n        nop.m 0\n        nop.m 0\n        nop.b 0\n}\n{ .mmf\n        nop.m 0\n        nop.m 0\n        nop.f 0\n}\n{ .mbb\n        nop.m 0\n        nop.b 0\n        nop.b 0\n}\n    movl        gp = 0x0000000000000000\n{ .mlx\n    flushrs\n    movl        gp = 0x0000000000000000\n}\n    movl        gp = 0x0000000000000000\n    .endp  Fore3#\n\n    data4       0\n    .align 64\n\n    .proc  Fore4#\nFore4:\n    movl        gp = 0x0000000000000000\n    brl         Fore5\n    .endp  Fore4#\n\n    data4       0\n    .align 64\n\n    data4       0\n    .align 64\n\n    .proc  Fore5#\nFore5:\n    movl        gp = 0xffffffffffffffff\n    brl         Fore6\n    .endp  Fore5#\n\n    data4       0\n    .align 64\n\n    .proc  Fore6#\nFore6:\n    movl        gp = 0x0000000000000000\n    brl         Fore7\n    .endp  Fore6#\n\n    data4       0\n    .align 64\n\n    .proc  Fore7#\nFore7:\n    movl        gp = 0xffffffffffffffff\n    brl         Fore6\n    brl.call.dptk.many b0=Fore6\n    br.call.dptk.many b0=Fore6\n    br.ret.dpnt.many b0\n    br.ret.dptk.many b0\n    br.ret.spnt.many b0\n    br.ret.sptk.many b0\n    .endp  Fore7#\n\n    data4       0\n    .align 64\n\n    .proc  Call8#\nCall8:\n{\n        alloc  r41=ar.pfs, 10, 0, 8, 0\n        adds   r49=0, r39\n        mov    r40=rp\n}\n{\n        adds   r48=0, r38\n        adds   r47=0, r37\n        adds   r46=0, r36 ;;\n}\n{\n        adds   r45=0, r35\n        adds   r44=0, r34\n        adds   r43=0, r33\n}\n{\n        movl   gp = 0xffffffffffffffff ;;\n}\n{\n        adds   r42=0, r32\n        brl.call.sptk.few rp=Call8Real  ;;\n}\nCall8Real:\n{\n        movl   gp = 0xffffffffffffffff ;;\n}\n{\n        nop.m  0\n        mov    rp=r40, +0 ;;\n        mov.i  ar.pfs=r41\n}\n{\n        nop.m  0\n        nop.m  0\n        br.ret.sptk.many rp ;;\n}\n    .endp  Call8#\n\n    data4       0\n    .align 64\n\n    .proc  Pass8#\nPass8:\n{\n        alloc  r41=ar.pfs, 11, 0, 8, 0\n        mov    r40=rp\n}\n{\n        adds   r50=0, r39\n        adds   r49=0, r38\n        adds   r48=0, r37 ;;\n}\n{\n        adds   r47=0, r36\n        adds   r46=0, r35\n        adds   r45=0, r34\n}\n{\n        adds   r44=0, r33\n        adds   r43=0, r32\n        adds   r42=0, gp  ;;\n}\n{\n        movl   gp = 0xffffffffffffffff ;;\n}\n{\n        brl.call.sptk.few rp=Pass8Real  ;;\n}\nPass8Real:\n{\n        adds   gp=0, r42\n        mov    rp=r40, +0 ;;\n        mov.i  ar.pfs=r41\n}\n{\n        nop.m  0\n        nop.m  0\n        br.ret.sptk.many rp ;;\n}\n    .endp  Pass8#\n\n    data4       0\n    .align 64\n\n    .proc  Last#\nLast:\n    data4       0xffffffff\n    data4       0xffffffff\n    data4       0xffffffff\n    data4       0xffffffff\n    .skip       0x1000\n    data4       0xffffffff\n    data4       0xffffffff\n    data4       0xffffffff\n    data4       0xffffffff\n    .endp  Last#\n\n// End\n"
  },
  {
    "path": "ext/detours/samples/disas/unk.cpp",
    "content": "/////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (x86.asm of disas.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\nstatic int value = 0;\n\nextern \"C\" void TestCodes()\n{\n    value++;\n}\n"
  },
  {
    "path": "ext/detours/samples/disas/x64.asm",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;\n;;  Detours Test Program (x64.asm/disas.exe)\n;;\n;;  Microsoft Research Detours Package\n;;\n;;  Copyright (c) Microsoft Corporation.  All rights reserved.\n;;\n\n.xlist\n.list\n.code\n\nPUBLIC  TestCodes\n\n_TEXT   SEGMENT\n\nTestCodes   PROC\n\nbegin:\nfaraway:\n        int 3\n        nop\n        int 3\n        db      066h,090h ; // 2-byte NOP.\n        int 3\n        db      00fh, 01fh, 000h ; // 3-byte NOP.\n        int 3\n        db      00fh, 01fh, 040h, 000h ; // 4-byte NOP.\n        int 3\n        db      00fh, 01fh, 044h, 000h, 000h ; // 5-byte NOP.\n        int 3\n        db      066h, 00fh, 01fh, 044h, 000h, 000h ; // 6-byte NOP.\n        int 3\n        db      00fh, 01fh, 080h, 000h, 000h, 000h, 000h ; // 7-byte NOP.\n        int 3\n        db      00fh, 01fh, 084h, 000h, 000h, 000h, 000h, 000h ; // 8-byte NOP.\n        int 3\n        db      066h, 00fh, 01fh, 084h, 000h, 000h, 000h, 000h, 000h ; // 9-byte NOP.\n        int 3\n        mov     rax, cr8\n        int 3\n        mov     rcx, cr8\n        int 3\n        mov     rdx, cr8\n        int 3\n        mov     rbx, cr8\n        int 3\n        mov     rsp, cr8\n        int 3\n        mov     rbp, cr8\n        int 3\n        mov     rsi, cr8\n        int 3\n        mov     rdi, cr8\n        int 3\n        mov     r8, cr8\n        int 3\n        mov     r9, cr8\n        int 3\n        mov     r10, cr8\n        int 3\n        mov     r11, cr8\n        int 3\n        mov     r12, cr8\n        int 3\n        mov     r13, cr8\n        int 3\n        mov     r14, cr8\n        int 3\n        mov     r15, cr8\n        int 3\n        mov     cr8, rax\n        int 3\n        mov     cr8, rcx\n        int 3\n        mov     cr8, rdx\n        int 3\n        mov     cr8, rbx\n        int 3\n        mov     cr8, rsp\n        int 3\n        mov     cr8, rbp\n        int 3\n        mov     cr8, rsi\n        int 3\n        mov     cr8, rdi\n        int 3\n        mov     cr8, r8\n        int 3\n        mov     cr8, r9\n        int 3\n        mov     cr8, r10\n        int 3\n        mov     cr8, r11\n        int 3\n        mov     cr8, r12\n        int 3\n        mov     cr8, r13\n        int 3\n        mov     cr8, r14\n        int 3\n        mov     cr8, r15\n        int 3\n        xor     rax, rax\n        int 3\n        xor     rcx, rcx\n        int 3\n        xor     rdx, rdx\n        int 3\n        xor     rbx, rbx\n        int 3\n        xor     rsp, rsp\n        int 3\n        xor     rbp, rbp\n        int 3\n        xor     rsi, rsi\n        int 3\n        xor     rdi, rdi\n        int 3\n        xor     r8, r8\n        int 3\n        xor     r9, r9\n        int 3\n        xor     r10, r10\n        int 3\n        xor     r11, r11\n        int 3\n        xor     r12, r12\n        int 3\n        xor     r13, r13\n        int 3\n        xor     r14, r14\n        int 3\n        xor     r15, r15\n        int 3\n        jmp     rax\n        int 3\n        jmp     rbx\n        int 3\n        jmp     rcx\n        int 3\n        jmp     rdx\n        int 3\n        push    rax\n        int 3\n        push    rbx\n        int 3\n        push    rcx\n        int 3\n        push    rdx\n        int 3\n        push    0\n        int 3\n        pop     rax\n        int 3\n        pop     rbx\n        int 3\n        pop     rcx\n        int 3\n        pop     rdx\n        int 3\n        mov     rax,[value]\n        int 3\n        sub     rsp,0418h\n        int 3\n        mov     [rsp+0410h],rbx\n        int 3\n        mov     [rsp+0408h],rsi\n        int 3\n        mov     [rsp+0400h],rdi\n        int 3\n        mov     [rsp+03f8h],r12\n        int 3\n        mov     [rsp+03f0h],r13\n        int 3\n        mov     [rsp+03e8h],r14\n        int 3\n        mov     [rsp+03e0h],r15\n        int 3\n        add     [rax],al                                ; 0000\n        int 3\n        add     [rcx],al                                ; 0001\n        int 3\n        add     [rbx],al                                ; 0003\n        int 3\n        add     [rax+rax],al                            ; 000400\n        int 3\n        add     [rdi],al                                ; 0007\n        int 3\n        add     [rax],cl                                ; 0008\n        int 3\n        add     [rdi],cl                                ; 000f\n        int 3\n        add     [rax],dl                                ; 0010\n        int 3\n        add     [rdi],bl                                ; 001f\n        int 3\n        add     [rax],ah                                ; 0020\n        int 3\n        add     [rdi],bh                                ; 003f\n        int 3\n        add     [rax+03bh],cl                           ; 00483b\n        int 3\n        add     [rdi],bh                                ; 007f00\n        int 3\n        add     [rax+040000000h],al                     ; 008000000040\n        int 3\n        add     bh,bh                                   ; 00ff\n        int 3\n        add     [rax],eax                               ; 0100\n        int 3\n        add     al,[rax]                                ; 0200\n        int 3\n        add     eax,06603ebc3h                          ; 05c3eb0366\n        int 3\n        syscall                                         ; 0f05\n        int 3\n        prefetchw      byte ptr [rcx]                   ; 0f0d09\n        int 3\n        prefetchnta    byte ptr [rcx]                   ; 0f1801\n        int 3\n        prefetchnta    byte ptr [rax+rdx]               ; 0f180410\n        int 3\n        jb             again                            ; 0f8247070000\n        int 3\n        jnb            again                            ; 0f8306050000\n        int 3\n        je             again                            ; 0f8432010000\n        int 3\n        jne            again                            ; 0f8508010000\n        int 3\n        jnbe           again                            ; 0f878a000000\n        int 3\n        ldmxcsr        dword ptr [rcx+034h]             ; 0fae5134\n        int 3\n        stmxcsr        dword ptr [rcx+034h]             ; 0fae5934\n        int 3\n        and            ecx,[rdx+rbx*4]                  ; 230c9a\n        int 3\n        xor            eax,eax                          ; 33c0\n        int 3\n        xor            ecx,ecx                          ; 33c9\n        int 3\n        xor            edx,ecx                          ; 33d1\n        int 3\n        xor            edx,edx                          ; 33d2\n        int 3\n        add            r10d,010001h                     ; 4181c201000100\n        int 3\n        and            r11d,0ffffh                      ; 4181e3ffff0000\n        int 3\n        mov            eax,r8d                          ; 418bc0\n        int 3\n        mov            byte ptr [r11],00h               ; 41c60300\n        int 3\n        call           qword ptr [r9+030h]              ; 41ff5130\n        int 3\n        call           qword ptr [r9+r8*8]              ; 43ff14c1\n        int 3\n        mov            [rcx+034h],r8d                   ; 44894134\n        int 3\n        mov            [rsp+030h],r9d                   ; 44894c2430\n        int 3\n        mov            r8d,[rcx]                        ; 448b01\n        int 3\n        mov            r9d,[rcx]                        ; 448b09\n        int 3\n        mov            r8d,[rax+058h]                   ; 448b4058\n        int 3\n        mov            r8d,[rsp+02ch]                   ; 448b44242c\n        int 3\n        mov            r8d,eax                          ; 448bc0\n        int 3\n        mov            r8d,edx                          ; 448bc2\n        int 3\n        xor            r8b,r8b                          ; 4532c0\n        int 3\n        mov            r9d,r8d                          ; 458bc8\n        int 3\n        lea            r11d,[r9+rax]                    ; 458d1c01\n        int 3\n        add            rdx,rcx                          ; 4803d1\n        int 3\n        or             rsi,rdx                          ; 480bf2\n        int 3\n        movnti         [rcx],rax                        ; 480fc301\n        int 3\n        and            rax,0fe000000h                   ; 4825000000fe\n        int 3\n        sub            rax,rcx                          ; 482bc1\n        int 3\n        sub            rdx,rcx                          ; 482bd1\n        int 3\n        cmp            rdi,rbp                          ; 483bfd\n        int 3\n        push           rbp                              ; 4855\n        int 3\n        add            rcx,03d0h                        ; 4881c1d0030000\n        int 3\n        add            rsp,0c8h                         ; 4881c4c8000000\n        int 3\n        and            rdx,0fe000000h                   ; 4881e2000000fe\n        int 3\n        sub            rsp,0c8h                         ; 4881ecc8000000\n        int 3\n        sub            rsp,03d0h                        ; 4881ecd0030000\n        int 3\n        add            rax,040h                         ; 4883c040\n        int 3\n        add            rcx,08h                          ; 4883c108\n        int 3\n        add            rcx,040h                         ; 4883c140\n        int 3\n        add            rsp,08h                          ; 4883c408\n        int 3\n        add            rsi,09h                          ; 4883c609\n        int 3\n        add            rdi,01h                          ; 4883c701\n        int 3\n        and            rcx,0f8h                         ; 4883e1f8\n        int 3\n        sub            rax,040h                         ; 4883e840\n        int 3\n        sub            rdx,08h                          ; 4883ea08\n        int 3\n        sub            rdx,040h                         ; 4883ea40\n        int 3\n        sub            rsp,08h                          ; 4883ec08\n        int 3\n        sub            rsi,08h                          ; 4883ee08\n        int 3\n        sub            rdi,01h                          ; 4883ef01\n        int 3\n        test           rax,rax                          ; 4885c0\n        int 3\n        test           rdx,rdx                          ; 4885d2\n        int 3\n        mov            [rsp],rax                        ; 48890424\n        int 3\n        mov            [rsp],rbp                        ; 48892c24\n        int 3\n        mov            [rsp],rsi                        ; 48893424\n        int 3\n        mov            [rsp],rdi                        ; 48893c24\n        int 3\n        mov            [rcx+08h],rax                    ; 48894108\n        int 3\n        mov            [rcx+078h],rax                   ; 48894178\n        int 3\n        mov            [rcx-08h],rax                    ; 488941f8\n        int 3\n        mov            [rsp+018h],rax                   ; 4889442418\n        int 3\n        mov            [rcx+010h],rdx                   ; 48895110\n        int 3\n        mov            [rsp+08h],rbx                    ; 48895c2408\n        int 3\n        mov            [rsp+018h],rsi                   ; 4889742418\n        int 3\n        mov            [rsp+08h],rdi                    ; 48897c2408\n        int 3\n        mov            [rsp+010h],rdi                   ; 48897c2410\n        int 3\n        mov            [rcx+098h],rax                   ; 48898198000000\n        int 3\n        mov            [rcx+080h],rcx                   ; 48898980000000\n        int 3\n        mov            [rcx+088h],rdx                   ; 48899188000000\n        int 3\n        mov            [rcx+090h],rbx                   ; 48899990000000\n        int 3\n        mov            [rcx+0a0h],rbp                   ; 4889a9a0000000\n        int 3\n        mov            [rcx+0a8h],rsi                   ; 4889b1a8000000\n        int 3\n        mov            [rcx+0b0h],rdi                   ; 4889b9b0000000\n        int 3\n        mov            rax,[rcx]                        ; 488b01\n        int 3\n        mov            rax,[rcx+rdx]                    ; 488b0411\n        int 3\n        mov            rax,[value]                      ; 488b05318c0100\n        int 3\n        mov            rcx,[rsp]                        ; 488b0c24\n        int 3\n        mov            rsi,[rsp]                        ; 488b3424\n        int 3\n        mov            rdi,[rsp]                        ; 488b3c24\n        int 3\n        mov            rax,[rax+018h]                   ; 488b4018\n        int 3\n        mov            rax,[rcx+078h]                   ; 488b4178\n        int 3\n        mov            rax,[rdx+020h]                   ; 488b4220\n        int 3\n        mov            rax,[rsp+08h]                    ; 488b442408\n        int 3\n        mov            rcx,[rcx+08h]                    ; 488b4908\n        int 3\n        mov            rcx,[rsp+020h]                   ; 488b4c2420\n        int 3\n        mov            rdx,[rsp+08h]                    ; 488b542408\n        int 3\n        mov            rdi,[rsp+08h]                    ; 488b7c2408\n        int 3\n        mov            rax,[rcx+098h]                   ; 488b8198000000\n        int 3\n        mov            rax,[rcx+0f8h]                   ; 488b81f8000000\n        int 3\n        cmp            ebx,0                            ;\n        int 3\n        cmp            rbx,0                            ;\n        int 3\n        cmp            byte ptr [value],77h             ; 803d........77\n        int 3\n        cmp            dword ptr [value],77h            ; 833d........77\n        int 3\n        cmp            qword ptr [value],77h            ; 48833d........77\n        int 3\n        cmp            dword ptr [value],77777777h      ; 813d........77777777\n        int 3\n        cmp            qword ptr [value],77777777h      ; 48813d........77777777\n        int 3\nnearby:\n        jo      nearby                                  ; 70xx\n        int 3\n        jno     nearby                                  ; 71xx\n        int 3\n        jb      nearby                                  ; 72xx\n        int 3\n        jae     nearby                                  ; 73xx\n        int 3\n        je      nearby                                  ; 74xx\n        int 3\n        jne     nearby                                  ; 75xx\n        int 3\n        jbe     nearby                                  ; 76xx\n        int 3\n        ja      nearby                                  ; 77xx\n        int 3\n        js      nearby                                  ; 78xx\n        int 3\n        jns     nearby                                  ; 79xx\n        int 3\n        jp      nearby                                  ; 7axx\n        int 3\n        jnp     nearby                                  ; 7bxx\n        int 3\n        jl      nearby                                  ; 7cxx\n        int 3\n        jge     nearby                                  ; 7dxx\n        int 3\n        jle     nearby                                  ; 7exx\n        int 3\n        jg      nearby                                  ; 7fxx\n        int 3\n        jmp     nearby                                  ; ebxx\n\n        int 3\n        jo      faraway                                 ; 0f80xxxxxxxx\n        int 3\n        jno     faraway                                 ; 0f81xxxxxxxx\n        int 3\n        jb      faraway                                 ; 0f82xxxxxxxx\n        int 3\n        jae     faraway                                 ; 0f83xxxxxxxx\n        int 3\n        je      faraway                                 ; 0f84xxxxxxxx\n        int 3\n        jne     faraway                                 ; 0f85xxxxxxxx\n        int 3\n        jbe     faraway                                 ; 0f86xxxxxxxx\n        int 3\n        ja      faraway                                 ; 0f87xxxxxxxx\n        int 3\n        js      faraway                                 ; 0f88xxxxxxxx\n        int 3\n        jns     faraway                                 ; 0f89xxxxxxxx\n        int 3\n        jp      faraway                                 ; 0f8axxxxxxxx\n        int 3\n        jnp     faraway                                 ; 0f8bxxxxxxxx\n        int 3\n        jl      faraway                                 ; 0f8cxxxxxxxx\n        int 3\n        jge     faraway                                 ; 0f8dxxxxxxxx\n        int 3\n        jle     faraway                                 ; 0f8exxxxxxxx\n        int 3\n        jg      faraway                                 ; 0f8fxxxxxxxx\n        int 3\n        jmp     faraway                                 ; e9xxxxxxxx\n\n        int 3\n        lea     rax,[rsp]                               ; 488d0424        \n        int 3\n        mov rcx,0BADC0DEBA5Eh                           ;  48b95ebadec0ad0b0000 \n        int 3\n        cmp     rax,rcx                                 ;  483bc1\n\n        int 3\n        sub rsp, 28h\n        int 3\n        add rsp,28h\n        int 3\n        ret\n        int 3\n\n\n;; The list is terminated by two \"int 3\" in a row.\nagain:\n        int 3\n        int 3\nTestCodes   ENDP\n\nvalue   QWORD   0\n\n_TEXT   ENDS\nEND\n"
  },
  {
    "path": "ext/detours/samples/disas/x86.cpp",
    "content": "/////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (x86.asm of disas.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\nstatic int value = 0;\n\nextern \"C\" void __declspec(naked) TestCodes()\n{\n    __asm {\n// Each instruction is proceeded by an \"int 3\".\n      faraway:\n        int 3;\n        nop;        // 1-byte NOP.\n        int 3;\n        _emit 0x66; // 2-byte NOP.\n        _emit 0x90;\n        int 3;\n        _emit 0x0f; // 3-byte NOP.\n        _emit 0x1f;\n        _emit 0x00;\n        int 3;\n        _emit 0x0f; // 4-byte NOP.\n        _emit 0x1f;\n        _emit 0x40;\n        _emit 0x00;\n        int 3;\n        _emit 0x0f; // 5-byte NOP.\n        _emit 0x1f;\n        _emit 0x44;\n        _emit 0x00;\n        _emit 0x00;\n        int 3;\n        _emit 0x66; // 6-byte NOP.\n        _emit 0x0f;\n        _emit 0x1f;\n        _emit 0x44;\n        _emit 0x00;\n        _emit 0x00;\n        int 3;\n        _emit 0x0f; // 7-byte NOP.\n        _emit 0x1f;\n        _emit 0x80;\n        _emit 0x00;\n        _emit 0x00;\n        _emit 0x00;\n        _emit 0x00;\n        int 3;\n        _emit 0x0f; // 8-byte NOP.\n        _emit 0x1f;\n        _emit 0x84;\n        _emit 0x00;\n        _emit 0x00;\n        _emit 0x00;\n        _emit 0x00;\n        _emit 0x00;\n        int 3;\n        _emit 0x66; // 9-byte NOP.\n        _emit 0x0f;\n        _emit 0x1f;\n        _emit 0x84;\n        _emit 0x00;\n        _emit 0x00;\n        _emit 0x00;\n        _emit 0x00;\n        _emit 0x00;\n        int 3;\n        mov     ecx, eax;\n        int 3;\n        mov     ebx, 0ffff000eh;\n        int 3;\n        call    ebx;\n        int 3;\n        call    dword ptr [eax];\n        int 3;\n        call    dword ptr [ebx];\n        int 3;\n        call    dword ptr [ecx];\n        int 3;\n        call    dword ptr [edx];\n        int 3;\n        jmp     dword ptr [eax];\n        int 3;\n        jmp     dword ptr [ebx];\n        int 3;\n        jmp     dword ptr [ecx];\n        int 3;\n        jmp     dword ptr [edx];\n        int 3;\n        call    ecx;\n        int 3;\n        call    eax;\n        int 3;\n        mov     ebx, 0ffff000eh;\n        int 3;\n        push    eax;\n        int 3;\n        call    ebx;\n        int 3;\n        cmp     ebx, 0;\n        int 3;\n        cmp     byte ptr [value], 77h;\n        int 3;\n        cmp     dword ptr [value], 77h;\n        int 3;\n        cmp     dword ptr [value], 77777777h;\n      nearby:\n        int 3\n        jo      nearby                                  ; 70xx\n        int 3\n        jno     nearby                                  ; 71xx\n        int 3\n        jb      nearby                                  ; 72xx\n        int 3\n        jae     nearby                                  ; 73xx\n        int 3\n        je      nearby                                  ; 74xx\n        int 3\n        jne     nearby                                  ; 75xx\n        int 3\n        jbe     nearby                                  ; 76xx\n        int 3\n        ja      nearby                                  ; 77xx\n        int 3\n        js      nearby                                  ; 78xx\n        int 3\n        jns     nearby                                  ; 79xx\n        int 3\n        jp      nearby                                  ; 7axx\n        int 3\n        jnp     nearby                                  ; 7bxx\n        int 3\n        jl      nearby                                  ; 7cxx\n        int 3\n        jge     nearby                                  ; 7dxx\n        int 3\n        jle     nearby                                  ; 7exx\n        int 3\n        jg      nearby                                  ; 7fxx\n\n        int 3\n        jo      faraway                                 ; 0f80xx\n        int 3\n        jno     faraway                                 ; 0f81xx\n        int 3\n        jb      faraway                                 ; 0f82xx\n        int 3\n        jae     faraway                                 ; 0f83xx\n        int 3\n        je      faraway                                 ; 0f84xx\n        int 3\n        jne     faraway                                 ; 0f85xx\n        int 3\n        jbe     faraway                                 ; 0f86xx\n        int 3\n        ja      faraway                                 ; 0f87xx\n        int 3\n        js      faraway                                 ; 0f88xx\n        int 3\n        jns     faraway                                 ; 0f89xx\n        int 3\n        jp      faraway                                 ; 0f8axx\n        int 3\n        jnp     faraway                                 ; 0f8bxx\n        int 3\n        jl      faraway                                 ; 0f8cxx\n        int 3\n        jge     faraway                                 ; 0f8dxx\n        int 3\n        jle     faraway                                 ; 0f8exx\n        int 3\n        jg      faraway                                 ; 0f8fxx\n\n// The list is terminated by two \"int 3\" in a row.\n        int 3;\n        int 3;\n        ret;\n    }\n}\n\n"
  },
  {
    "path": "ext/detours/samples/dtest/Makefile",
    "content": "##############################################################################\n##\n##  Makefile for Detours Test Programs.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\nLIBS=$(LIBS) kernel32.lib\n\nall: dirs \\\n    $(BIND)\\dtarge$(DETOURS_BITS).dll \\\n    $(BIND)\\dtest.exe \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\dtarge$(DETOURS_BITS).bsc \\\n    $(OBJD)\\dtest.bsc \\\n!ENDIF\n    option\n\nclean:\n    -del *~ *.obj *.sbr 2> nul\n    -del $(BIND)\\dtest.* $(BIND)\\dtarge*.* 2> nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\n$(OBJD)\\dtarge.obj : dtarge.cpp\n\n$(OBJD)\\dtarge.res : dtarge.rc\n\n$(BIND)\\dtarge$(DETOURS_BITS).dll $(BIND)\\dtarge$(DETOURS_BITS).lib: \\\n        $(OBJD)\\dtarge.obj $(OBJD)\\dtarge.res $(DEPS)\n    cl /LD $(CFLAGS) \\\n\t\t/Fe$(@R).dll \\\n\t\t/Fd$(@R).pdb \\\n        $(OBJD)\\dtarge.obj $(OBJD)\\dtarge.res \\\n        /link $(LINKFLAGS) /subsystem:console \\\n        /export:Target0 \\\n        /export:Target1 \\\n        /export:Target2 \\\n        /export:Target3 \\\n        /export:Target4 \\\n        /export:Target5 \\\n        /export:Target6 \\\n        /export:Target7 \\\n        /export:Target8 \\\n        /export:Target9 \\\n        /export:Target10 \\\n        /export:Target11 \\\n        /export:Target12 \\\n        /export:Target13 \\\n        /export:Target14 \\\n        /export:Target15 \\\n        /export:Target16 \\\n        /export:TargetV \\\n        /export:TargetR \\\n        $(LIBS)\n\n$(OBJD)\\dtarge$(DETOURS_BITS).bsc : $(OBJD)\\dtarge.obj\n    bscmake /v /n /o $@ $(OBJD)\\dtarge.sbr\n\n$(OBJD)\\dtest.obj : dtest.cpp\n\n$(BIND)\\dtest.exe : $(OBJD)\\dtest.obj $(BIND)\\dtarge$(DETOURS_BITS).lib $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb $(OBJD)\\dtest.obj \\\n        /link $(LINKFLAGS) $(LIBS) $(BIND)\\dtarge$(DETOURS_BITS).lib \\\n        /subsystem:console /entry:WinMainCRTStartup\n\n$(OBJD)\\dtest.bsc : $(OBJD)\\dtest.obj\n    bscmake /v /n /o $@ $(OBJD)\\dtest.sbr\n\n############################################### Install non-bit-size binaries.\n\n!IF \"$(DETOURS_OPTION_PROCESSOR)\" != \"\"\n\n$(OPTD)\\dtarge$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\dtarge$(DETOURS_OPTION_BITS).pdb:\n\n$(BIND)\\dtarge$(DETOURS_OPTION_BITS).dll : $(OPTD)\\dtarge$(DETOURS_OPTION_BITS).dll\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\dtarge$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\dtarge$(DETOURS_OPTION_BITS).pdb\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n\noption: \\\n    $(BIND)\\dtarge$(DETOURS_OPTION_BITS).dll \\\n    $(BIND)\\dtarge$(DETOURS_OPTION_BITS).pdb \\\n\n!ELSE\n\noption:\n\n!ENDIF\n\n##############################################################################\n\ntest: all\n    $(BIND)\\dtest.exe\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/dtest/NORMAL_IA64.TXT",
    "content": "    ..\\..\\bin.IA64\\dtest.exe\nCalling LocalTarget1 w/o detour\n  LocalTarget1 (1)\nCalling LocalTarget1 w/ detour\n  MyLocalTarget1 (2)\n  LocalTarget1 (2)\nCalling Target0 function.\n  MyTarget0 ()\nCalling TargetN functions.\n  MyLocalTarget1 (1)\n  LocalTarget1 (1)\n  MyTarget0 ()\n  MyTarget1 (1)\n  MyTarget2 (1,2)\n  MyTarget3 (1,2,3)\n  MyTarget4 (1,2,3,4)\n  MyTarget5 (1,2,3,4,5)\n  MyTarget6 (1,2,3,4,5,6)\n  MyTarget7 (1,2,3,4,5,6,7)\n  MyTarget8 (1,2,3,4,5,6,7,8)\n  MyTarget9 (1,2,3,4,5,6,7,8,9)\n  MyTarget10(1,2,3,4,5,6,7,8,9,10)\n  MyTarget11(1,2,3,4,5,6,7,8,9,10,11)\n  MyTarget12(1,2,3,4,5,6,7,8,9,10,11,12)\n  MyTarget13(1,2,3,4,5,6,7,8,9,10,11,12,13)\n  MyTarget14(1,2,3,4,5,6,7,8,9,10,11,12,13,14)\n  MyTarget15(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)\n  MyTarget16(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)\n  MyTargetV (0)\n  MyTargetV (0,1)\n  MyTargetV (0,1,2)\n  MyTargetV (0,1,2,3)\n  MyTargetV (0,1,2,3,4)\n  MyTargetV (0,1,2,3,4,5)\n  MyTargetV (0,1,2,3,4,5,6)\n  MyTargetV (0,1,2,3,4,5,6,7)\n  MyTargetV (0,1,2,3,4,5,6,7,8)\n  MyTargetV (0,1,2,3,4,5,6,7,8,9)\n  MyTargetV (0,1,2,3,4,5,6,7,8,9,10)\n  MyTargetV (0,1,2,3,4,5,6,7,8,9,10,11)\n  MyTargetV (0,1,2,3,4,5,6,7,8,9,10,11,12)\n  MyTargetV (0,1,2,3,4,5,6,7,8,9,10,11,12,13)\n  MyTargetV (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14)\n  MyTargetV (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)\n  MyTargetV (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)\n  MyTargetR (0,1,2,3,4)\n  MyTargetR (0,1,2,3,3)\n  MyTargetR (0,1,2,3,2)\n  MyTargetR (0,1,2,3,1)\n....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................  MyTargetR (0,1,2,3,4,5,6,7,8,9,10,4)\n  MyTargetR (0,1,2,3,4,5,6,7,8,9,10,3)\n  MyTargetR (0,1,2,3,4,5,6,7,8,9,10,2)\n  MyTargetR (0,1,2,3,4,5,6,7,8,9,10,1)\n => 3011\nCalling Target0 again with 1 detour.\n  MyTarget0 ()\nCalling Target0 again with 2 detours.\n  Starting Target0_1.\n  MyTarget0 ()\n  End Target0_1.\nCalling Target0 again with 3 detours.\n  Starting Target0_2.\n  Starting Target0_1.\n  MyTarget0 ()\n  End Target0_1.\n  End Target0_2.\nCalling Target0 again with 4 detours.\n  Starting Target0_3.\n  Starting Target0_2.\n  Starting Target0_1.\n  MyTarget0 ()\n  End Target0_1.\n  End Target0_2.\n  End Target0_3.\nDone.\n    Target0 ()\n    Target0 ()\n    Target1 (1)\n    Target2 (1,2)\n    Target3 (1,2,3)\n    Target4 (1,2,3,4)\n    Target5 (1,2,3,4,5)\n    Target6 (1,2,3,4,5,6)\n    Target7 (1,2,3,4,5,6,7)\n    Target8 (1,2,3,4,5,6,7,8)\n    Target9 (1,2,3,4,5,6,7,8,9)\n    Target10(1,2,3,4,5,6,7,8,9,10)\n    Target11(1,2,3,4,5,6,7,8,9,10,11)\n    Target12(1,2,3,4,5,6,7,8,9,10,11,12)\n    Target13(1,2,3,4,5,6,7,8,9,10,11,12,13)\n    Target14(1,2,3,4,5,6,7,8,9,10,11,12,13,14)\n    Target15(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)\n    Target16(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)\n    TargetV (0)\n    TargetV (0,1)\n    TargetV (0,1,2)\n    TargetV (0,1,2,3)\n    TargetV (0,1,2,3,4)\n    TargetV (0,1,2,3,4,5)\n    TargetV (0,1,2,3,4,5,6)\n    TargetV (0,1,2,3,4,5,6,7)\n    TargetV (0,1,2,3,4,5,6,7,8)\n    TargetV (0,1,2,3,4,5,6,7,8,9)\n    TargetV (0,1,2,3,4,5,6,7,8,9,10)\n    TargetV (0,1,2,3,4,5,6,7,8,9,10,11)\n    TargetV (0,1,2,3,4,5,6,7,8,9,10,11,12)\n    TargetV (0,1,2,3,4,5,6,7,8,9,10,11,12,13)\n    TargetV (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14)\n    TargetV (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)\n    TargetV (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)\n:::    TargetR (0,1,2,3,1)\n:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::    TargetR (0,1,2,3,4,5,6,7,8,9,10,1)\n    Target0 ()\n    Target0 ()\n    Target0 ()\n    Target0 ()\n"
  },
  {
    "path": "ext/detours/samples/dtest/NORMAL_X64.TXT",
    "content": "    ..\\..\\bin.X64\\dtest.exe\nCalling LocalTarget1 w/o detour\n  LocalTarget1 (1)\nCalling LocalTarget1 w/ detour\n  MyLocalTarget1 (2)\n  LocalTarget1 (2)\nCalling Target0 function.\n  MyTarget0 ()\nCalling TargetN functions.\n  MyLocalTarget1 (1)\n  LocalTarget1 (1)\n  MyTarget0 ()\n  MyTarget1 (1)\n  MyTarget2 (1,2)\n  MyTarget3 (1,2,3)\n  MyTarget4 (1,2,3,4)\n  MyTarget5 (1,2,3,4,5)\n  MyTarget6 (1,2,3,4,5,6)\n  MyTarget7 (1,2,3,4,5,6,7)\n  MyTarget8 (1,2,3,4,5,6,7,8)\n  MyTarget9 (1,2,3,4,5,6,7,8,9)\n  MyTarget10(1,2,3,4,5,6,7,8,9,10)\n  MyTarget11(1,2,3,4,5,6,7,8,9,10,11)\n  MyTarget12(1,2,3,4,5,6,7,8,9,10,11,12)\n  MyTarget13(1,2,3,4,5,6,7,8,9,10,11,12,13)\n  MyTarget14(1,2,3,4,5,6,7,8,9,10,11,12,13,14)\n  MyTarget15(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)\n  MyTarget16(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)\n  MyTargetV (0)\n  MyTargetV (0,1)\n  MyTargetV (0,1,2)\n  MyTargetV (0,1,2,3)\n  MyTargetV (0,1,2,3,4)\n  MyTargetV (0,1,2,3,4,5)\n  MyTargetV (0,1,2,3,4,5,6)\n  MyTargetV (0,1,2,3,4,5,6,7)\n  MyTargetV (0,1,2,3,4,5,6,7,8)\n  MyTargetV (0,1,2,3,4,5,6,7,8,9)\n  MyTargetV (0,1,2,3,4,5,6,7,8,9,10)\n  MyTargetV (0,1,2,3,4,5,6,7,8,9,10,11)\n  MyTargetV (0,1,2,3,4,5,6,7,8,9,10,11,12)\n  MyTargetV (0,1,2,3,4,5,6,7,8,9,10,11,12,13)\n  MyTargetV (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14)\n  MyTargetV (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)\n  MyTargetV (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)\n  MyTargetR (0,1,2,3,4)\n  MyTargetR (0,1,2,3,3)\n  MyTargetR (0,1,2,3,2)\n  MyTargetR (0,1,2,3,1)\n....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................  MyTargetR (0,1,2,3,4,5,6,7,8,9,10,4)\n  MyTargetR (0,1,2,3,4,5,6,7,8,9,10,3)\n  MyTargetR (0,1,2,3,4,5,6,7,8,9,10,2)\n  MyTargetR (0,1,2,3,4,5,6,7,8,9,10,1)\n => 3011\nCalling Target0 again with 1 detour.\n  MyTarget0 ()\nCalling Target0 again with 2 detours.\n  Starting Target0_1.\n  MyTarget0 ()\n  End Target0_1.\nCalling Target0 again with 3 detours.\n  Starting Target0_2.\n  Starting Target0_1.\n  MyTarget0 ()\n  End Target0_1.\n  End Target0_2.\nCalling Target0 again with 4 detours.\n  Starting Target0_3.\n  Starting Target0_2.\n  Starting Target0_1.\n  MyTarget0 ()\n  End Target0_1.\n  End Target0_2.\n  End Target0_3.\nDone.\n    Target0 ()\n    Target0 ()\n    Target1 (1)\n    Target2 (1,2)\n    Target3 (1,2,3)\n    Target4 (1,2,3,4)\n    Target5 (1,2,3,4,5)\n    Target6 (1,2,3,4,5,6)\n    Target7 (1,2,3,4,5,6,7)\n    Target8 (1,2,3,4,5,6,7,8)\n    Target9 (1,2,3,4,5,6,7,8,9)\n    Target10(1,2,3,4,5,6,7,8,9,10)\n    Target11(1,2,3,4,5,6,7,8,9,10,11)\n    Target12(1,2,3,4,5,6,7,8,9,10,11,12)\n    Target13(1,2,3,4,5,6,7,8,9,10,11,12,13)\n    Target14(1,2,3,4,5,6,7,8,9,10,11,12,13,14)\n    Target15(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)\n    Target16(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)\n    TargetV (0)\n    TargetV (0,1)\n    TargetV (0,1,2)\n    TargetV (0,1,2,3)\n    TargetV (0,1,2,3,4)\n    TargetV (0,1,2,3,4,5)\n    TargetV (0,1,2,3,4,5,6)\n    TargetV (0,1,2,3,4,5,6,7)\n    TargetV (0,1,2,3,4,5,6,7,8)\n    TargetV (0,1,2,3,4,5,6,7,8,9)\n    TargetV (0,1,2,3,4,5,6,7,8,9,10)\n    TargetV (0,1,2,3,4,5,6,7,8,9,10,11)\n    TargetV (0,1,2,3,4,5,6,7,8,9,10,11,12)\n    TargetV (0,1,2,3,4,5,6,7,8,9,10,11,12,13)\n    TargetV (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14)\n    TargetV (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)\n    TargetV (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)\n:::    TargetR (0,1,2,3,1)\n:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::    TargetR (0,1,2,3,4,5,6,7,8,9,10,1)\n    Target0 ()\n    Target0 ()\n    Target0 ()\n    Target0 ()\n"
  },
  {
    "path": "ext/detours/samples/dtest/NORMAL_X86.TXT",
    "content": "    ..\\..\\bin.X86\\dtest.exe\nCalling LocalTarget1 w/o detour\n  LocalTarget1 (1)\nCalling LocalTarget1 w/ detour\n  MyLocalTarget1 (2)\n  LocalTarget1 (2)\nCalling Target0 function.\n  MyTarget0 ()\nCalling TargetN functions.\n  MyLocalTarget1 (1)\n  LocalTarget1 (1)\n  MyTarget0 ()\n  MyTarget1 (1)\n  MyTarget2 (1,2)\n  MyTarget3 (1,2,3)\n  MyTarget4 (1,2,3,4)\n  MyTarget5 (1,2,3,4,5)\n  MyTarget6 (1,2,3,4,5,6)\n  MyTarget7 (1,2,3,4,5,6,7)\n  MyTarget8 (1,2,3,4,5,6,7,8)\n  MyTarget9 (1,2,3,4,5,6,7,8,9)\n  MyTarget10(1,2,3,4,5,6,7,8,9,10)\n  MyTarget11(1,2,3,4,5,6,7,8,9,10,11)\n  MyTarget12(1,2,3,4,5,6,7,8,9,10,11,12)\n  MyTarget13(1,2,3,4,5,6,7,8,9,10,11,12,13)\n  MyTarget14(1,2,3,4,5,6,7,8,9,10,11,12,13,14)\n  MyTarget15(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)\n  MyTarget16(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)\n  MyTargetV (0)\n  MyTargetV (0,1)\n  MyTargetV (0,1,2)\n  MyTargetV (0,1,2,3)\n  MyTargetV (0,1,2,3,4)\n  MyTargetV (0,1,2,3,4,5)\n  MyTargetV (0,1,2,3,4,5,6)\n  MyTargetV (0,1,2,3,4,5,6,7)\n  MyTargetV (0,1,2,3,4,5,6,7,8)\n  MyTargetV (0,1,2,3,4,5,6,7,8,9)\n  MyTargetV (0,1,2,3,4,5,6,7,8,9,10)\n  MyTargetV (0,1,2,3,4,5,6,7,8,9,10,11)\n  MyTargetV (0,1,2,3,4,5,6,7,8,9,10,11,12)\n  MyTargetV (0,1,2,3,4,5,6,7,8,9,10,11,12,13)\n  MyTargetV (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14)\n  MyTargetV (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)\n  MyTargetV (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)\n  MyTargetR (0,1,2,3,4)\n  MyTargetR (0,1,2,3,3)\n  MyTargetR (0,1,2,3,2)\n  MyTargetR (0,1,2,3,1)\n....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................  MyTargetR (0,1,2,3,4,5,6,7,8,9,10,4)\n  MyTargetR (0,1,2,3,4,5,6,7,8,9,10,3)\n  MyTargetR (0,1,2,3,4,5,6,7,8,9,10,2)\n  MyTargetR (0,1,2,3,4,5,6,7,8,9,10,1)\n => 3011\nCalling Target0 again with 1 detour.\n  MyTarget0 ()\nCalling Target0 again with 2 detours.\n  Starting Target0_1.\n  MyTarget0 ()\n  End Target0_1.\nCalling Target0 again with 3 detours.\n  Starting Target0_2.\n  Starting Target0_1.\n  MyTarget0 ()\n  End Target0_1.\n  End Target0_2.\nCalling Target0 again with 4 detours.\n  Starting Target0_3.\n  Starting Target0_2.\n  Starting Target0_1.\n  MyTarget0 ()\n  End Target0_1.\n  End Target0_2.\n  End Target0_3.\nDone.\n    Target0 ()\n    Target0 ()\n    Target1 (1)\n    Target2 (1,2)\n    Target3 (1,2,3)\n    Target4 (1,2,3,4)\n    Target5 (1,2,3,4,5)\n    Target6 (1,2,3,4,5,6)\n    Target7 (1,2,3,4,5,6,7)\n    Target8 (1,2,3,4,5,6,7,8)\n    Target9 (1,2,3,4,5,6,7,8,9)\n    Target10(1,2,3,4,5,6,7,8,9,10)\n    Target11(1,2,3,4,5,6,7,8,9,10,11)\n    Target12(1,2,3,4,5,6,7,8,9,10,11,12)\n    Target13(1,2,3,4,5,6,7,8,9,10,11,12,13)\n    Target14(1,2,3,4,5,6,7,8,9,10,11,12,13,14)\n    Target15(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)\n    Target16(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)\n    TargetV (0)\n    TargetV (0,1)\n    TargetV (0,1,2)\n    TargetV (0,1,2,3)\n    TargetV (0,1,2,3,4)\n    TargetV (0,1,2,3,4,5)\n    TargetV (0,1,2,3,4,5,6)\n    TargetV (0,1,2,3,4,5,6,7)\n    TargetV (0,1,2,3,4,5,6,7,8)\n    TargetV (0,1,2,3,4,5,6,7,8,9)\n    TargetV (0,1,2,3,4,5,6,7,8,9,10)\n    TargetV (0,1,2,3,4,5,6,7,8,9,10,11)\n    TargetV (0,1,2,3,4,5,6,7,8,9,10,11,12)\n    TargetV (0,1,2,3,4,5,6,7,8,9,10,11,12,13)\n    TargetV (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14)\n    TargetV (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)\n    TargetV (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)\n:::    TargetR (0,1,2,3,1)\n:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::    TargetR (0,1,2,3,4,5,6,7,8,9,10,1)\n    Target0 ()\n    Target0 ()\n    Target0 ()\n    Target0 ()\n"
  },
  {
    "path": "ext/detours/samples/dtest/dtarge.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (dtarge.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#include <stdio.h>\n#include <windows.h>\n#include \"dtarge.h\"\n\nDWORD_PTR WINAPI Target0()\n{\n    printf(\"    Target0 ()\\n\");\n    return 1000;\n}\n\nDWORD_PTR WINAPI Target1(DWORD_PTR v1)\n{\n    printf(\"    Target1 (%ld)\\n\",\n           (DWORD)v1);\n    return 1001;\n}\n\nDWORD_PTR WINAPI Target2(DWORD_PTR v1, DWORD_PTR v2)\n{\n    printf(\"    Target2 (%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2);\n    return 1002;\n}\n\nDWORD_PTR WINAPI Target3(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3)\n{\n    printf(\"    Target3 (%ld,%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2, (DWORD)v3);\n    return 1003;\n}\n\nDWORD_PTR WINAPI Target4(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4)\n{\n    printf(\"    Target4 (%ld,%ld,%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4);\n    return 1004;\n}\n\nDWORD_PTR WINAPI Target5(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                         DWORD_PTR v5)\n{\n    printf(\"    Target5 (%ld,%ld,%ld,%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4,\n           (DWORD)v5);\n    return 1005;\n}\n\nDWORD_PTR WINAPI Target6(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                         DWORD_PTR v5, DWORD_PTR v6)\n{\n    printf(\"    Target6 (%ld,%ld,%ld,%ld,%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4,\n           (DWORD)v5, (DWORD)v6);\n    return 1006;\n}\n\nDWORD_PTR WINAPI Target7(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                         DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7)\n{\n    printf(\"    Target7 (%ld,%ld,%ld,%ld,%ld,%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4,\n           (DWORD)v5, (DWORD)v6, (DWORD)v7);\n    return 1007;\n}\n\nDWORD_PTR WINAPI Target8(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                         DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8)\n{\n    printf(\"    Target8 (%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4,\n           (DWORD)v5, (DWORD)v6, (DWORD)v7, (DWORD)v8);\n    return 1008;\n}\n\nDWORD_PTR WINAPI Target9(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                         DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n                         DWORD_PTR v9)\n{\n    printf(\"    Target9 (%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4,\n           (DWORD)v5, (DWORD)v6, (DWORD)v7, (DWORD)v8,\n           (DWORD)v9);\n    return 1009;\n}\n\nDWORD_PTR WINAPI Target10(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                          DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n                          DWORD_PTR v9, DWORD_PTR v10)\n{\n    printf(\"    Target10(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4,\n           (DWORD)v5, (DWORD)v6, (DWORD)v7, (DWORD)v8,\n           (DWORD)v9, (DWORD)v10);\n    return 1010;\n}\n\nDWORD_PTR WINAPI Target11(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                          DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n                          DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11)\n{\n    printf(\"    Target11(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4,\n           (DWORD)v5, (DWORD)v6, (DWORD)v7, (DWORD)v8,\n           (DWORD)v9, (DWORD)v10, (DWORD)v11);\n    return 1011;\n}\n\nDWORD_PTR WINAPI Target12(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                          DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n                          DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11, DWORD_PTR v12)\n{\n    printf(\"    Target12(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4,\n           (DWORD)v5, (DWORD)v6, (DWORD)v7, (DWORD)v8,\n           (DWORD)v9, (DWORD)v10, (DWORD)v11, (DWORD)v12);\n    return 1012;\n}\n\nDWORD_PTR WINAPI Target13(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                          DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n                          DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11, DWORD_PTR v12,\n                          DWORD_PTR v13)\n{\n    printf(\"    Target13(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4,\n           (DWORD)v5, (DWORD)v6, (DWORD)v7, (DWORD)v8,\n           (DWORD)v9, (DWORD)v10, (DWORD)v11, (DWORD)v12,\n           (DWORD)v13);\n    return 1013;\n}\n\nDWORD_PTR WINAPI Target14(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                          DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n                          DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11, DWORD_PTR v12,\n                          DWORD_PTR v13, DWORD_PTR v14)\n{\n    printf(\"    Target14(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4,\n           (DWORD)v5, (DWORD)v6, (DWORD)v7, (DWORD)v8,\n           (DWORD)v9, (DWORD)v10, (DWORD)v11, (DWORD)v12,\n           (DWORD)v13, (DWORD)v14);\n    return 1014;\n}\n\nDWORD_PTR WINAPI Target15(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                          DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n                          DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11, DWORD_PTR v12,\n                          DWORD_PTR v13, DWORD_PTR v14, DWORD_PTR v15)\n{\n    printf(\"    Target15(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4,\n           (DWORD)v5, (DWORD)v6, (DWORD)v7, (DWORD)v8,\n           (DWORD)v9, (DWORD)v10, (DWORD)v11, (DWORD)v12,\n           (DWORD)v13, (DWORD)v14, (DWORD)v15);\n    return 1015;\n}\n\nDWORD_PTR WINAPI Target16(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                          DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n                          DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11, DWORD_PTR v12,\n                          DWORD_PTR v13, DWORD_PTR v14, DWORD_PTR v15, DWORD_PTR v16)\n{\n    printf(\"    Target16(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4,\n           (DWORD)v5, (DWORD)v6, (DWORD)v7, (DWORD)v8,\n           (DWORD)v9, (DWORD)v10, (DWORD)v11, (DWORD)v12,\n           (DWORD)v13, (DWORD)v14, (DWORD)v15, (DWORD)v16);\n    return 1016;\n}\n\nDWORD_PTR WINAPI TargetV(DWORD_PTR v1, ...)\n{\n    DWORD_PTR args[32];\n\n    va_list va;\n    va_start(va, v1);\n\n    int argc = 0;\n    for (args[argc++] = v1; args[argc-1] != 0;) {\n        args[argc++] = va_arg(va, DWORD_PTR);\n    }\n    va_end(va);\n\n    printf(\"    TargetV (\");\n    int i = argc - 1;\n    for (; i > 0; i--) {\n        printf(\"%ld,\", (DWORD)args[i]);\n    }\n    printf(\"%ld)\\n\", (DWORD)args[0]);\n\n    return 1000 + argc;\n}\n\nDWORD_PTR WINAPI TargetR(DWORD_PTR v1, ...)\n{\n    DWORD_PTR args[32];\n\n    va_list va;\n    va_start(va, v1);\n\n    int argc = 0;\n    for (args[argc++] = v1; args[argc-1] != 0;) {\n        args[argc++] = va_arg(va, DWORD_PTR);\n    }\n    va_end(va);\n\n    if (v1 > 1) {\n        printf(\":\");\n        switch (argc) {\n          default:\n            return TargetR(0) + 1;\n          case 1:\n            return TargetR(args[0] - 1) + 1;\n          case 2:\n            return TargetR(args[0] - 1, args[1]) + 1;\n          case 3:\n            return TargetR(args[0] - 1, args[1], args[2]) + 1;\n          case 4:\n            return TargetR(args[0] - 1, args[1], args[2], args[3]) + 1;\n          case 5:\n            return TargetR(args[0] - 1, args[1], args[2], args[3],\n                           args[4]) + 1;\n          case 6:\n            return TargetR(args[0] - 1, args[1], args[2], args[3],\n                           args[4], args[5]) + 1;\n          case 7:\n            return TargetR(args[0] - 1, args[1], args[2], args[3],\n                           args[4], args[5], args[6]) + 1;\n          case 8:\n            return TargetR(args[0] - 1, args[1], args[2], args[3],\n                           args[4], args[5], args[6], args[7]) + 1;\n          case 9:\n            return TargetR(args[0] - 1, args[1], args[2], args[3],\n                           args[4], args[5], args[6], args[7],\n                           args[8]) + 1;\n          case 10:\n            return TargetR(args[0] - 1, args[1], args[2], args[3],\n                           args[4], args[5], args[6], args[7],\n                           args[8], args[9]) + 1;\n          case 11:\n            return TargetR(args[0] - 1, args[1], args[2], args[3],\n                           args[4], args[5], args[6], args[7],\n                           args[8], args[9], args[10]) + 1;\n          case 12:\n            return TargetR(args[0] - 1, args[1], args[2], args[3],\n                           args[4], args[5], args[6], args[7],\n                           args[8], args[9], args[10], args[11]) + 1;\n          case 13:\n            return TargetR(args[0] - 1, args[1], args[2], args[3],\n                           args[4], args[5], args[6], args[7],\n                           args[8], args[9], args[10], args[11],\n                           args[12]) + 1;\n          case 14:\n            return TargetR(args[0] - 1, args[1], args[2], args[3],\n                           args[4], args[5], args[6], args[7],\n                           args[8], args[9], args[10], args[11],\n                           args[12], args[13]) + 1;\n          case 15:\n            return TargetR(args[0] - 1, args[1], args[2], args[3],\n                           args[4], args[5], args[6], args[7],\n                           args[8], args[9], args[10], args[11],\n                           args[12], args[13], args[14]) + 1;\n          case 16:\n            return TargetR(args[0] - 1, args[1], args[2], args[3],\n                           args[4], args[5], args[6], args[7],\n                           args[8], args[9], args[10], args[11],\n                           args[12], args[13], args[14], args[15]) + 1;\n          case 17:\n            return TargetR(args[0] - 1, args[1], args[2], args[3],\n                           args[4], args[5], args[6], args[7],\n                           args[8], args[9], args[10], args[11],\n                           args[12], args[13], args[14], args[15],\n                           args[16]) + 1;\n        }\n    }\n\n    printf(\"    TargetR (\");\n    int i = argc - 1;\n    for (; i > 0; i--) {\n        printf(\"%ld,\", (DWORD)args[i]);\n    }\n    printf(\"%ld)\\n\", (DWORD)args[0]);\n\n    return 2000 + argc;\n}\n\n\nBOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)\n{\n    (void)hinst;\n    (void)dwReason;\n    (void)reserved;\n\n    return TRUE;\n}\n\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/dtest/dtarge.h",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (dtarge.h of dtarge.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#pragma once\n\n#if (_MSC_VER < 1299)\ntypedef DWORD DWORD_PTR;\n#endif\n\nDWORD_PTR WINAPI Target0();\nDWORD_PTR WINAPI Target1(DWORD_PTR v1);\nDWORD_PTR WINAPI Target2(DWORD_PTR v1, DWORD_PTR v2);\nDWORD_PTR WINAPI Target3(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3);\nDWORD_PTR WINAPI Target4(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4);\nDWORD_PTR WINAPI Target5(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                         DWORD_PTR v5);\nDWORD_PTR WINAPI Target6(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                         DWORD_PTR v5, DWORD_PTR v6);\nDWORD_PTR WINAPI Target7(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                         DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7);\nDWORD_PTR WINAPI Target8(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                         DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8);\nDWORD_PTR WINAPI Target9(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                         DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n                         DWORD_PTR v9);\nDWORD_PTR WINAPI Target10(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                          DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n                          DWORD_PTR v9, DWORD_PTR v10);\nDWORD_PTR WINAPI Target11(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                          DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n                          DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11);\nDWORD_PTR WINAPI Target12(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                          DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n                          DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11, DWORD_PTR v12);\nDWORD_PTR WINAPI Target13(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                          DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n                          DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11, DWORD_PTR v12,\n                          DWORD_PTR v13);\nDWORD_PTR WINAPI Target14(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                          DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n                          DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11, DWORD_PTR v12,\n                          DWORD_PTR v13, DWORD_PTR v14);\nDWORD_PTR WINAPI Target15(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                          DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n                          DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11, DWORD_PTR v12,\n                          DWORD_PTR v13, DWORD_PTR v14, DWORD_PTR v15);\nDWORD_PTR WINAPI Target16(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                          DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n                          DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11, DWORD_PTR v12,\n                          DWORD_PTR v13, DWORD_PTR v14, DWORD_PTR v15, DWORD_PTR v16);\nDWORD_PTR WINAPI TargetV(DWORD_PTR v1, ...);\nDWORD_PTR WINAPI TargetR(DWORD_PTR v1, ...);\n\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/dtest/dtarge.rc",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Version information for dtarge.rc.\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include \"detver.h\"\n\n#define VER_INTERNALNAME_STR        \"dtarge\" DETOURS_STRINGIFY(DETOURS_BITS)\n#define VER_ORIGINALFILENAME_STR    \"dtarge\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\"\n#define VER_FILEDESCRIPTION_STR     \"Detours Test Module\"\n#define VER_COMPANYNAME_STR         \"Microsoft Corporation\"\n\n#include \"common.ver\"\n"
  },
  {
    "path": "ext/detours/samples/dtest/dtest.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (dtest.cpp of dtest.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#include <stdio.h>\n#include <stdarg.h>\n#include <windows.h>\n#pragma warning(push)\n#if _MSC_VER > 1400\n#pragma warning(disable:6102 6103) // /analyze warnings\n#endif\n#include <strsafe.h>\n#pragma warning(pop)\n#include <detours.h>\n#include \"dtarge.h\"\n\nDWORD_PTR WINAPI LocalTarget1(DWORD_PTR v1);\n\n////////////////////////////////////////////////////// Multi-Argument Detours.\n//\nDWORD_PTR (WINAPI * Trampoline_LocalTarget1)(DWORD_PTR v1) = LocalTarget1;\n\nDWORD_PTR (WINAPI * Trampoline_Target0)() = Target0;\nDWORD_PTR (WINAPI * Trampoline_Target1)(DWORD_PTR v1) = Target1;\nDWORD_PTR (WINAPI * Trampoline_Target2)(DWORD_PTR v1, DWORD_PTR v2) = Target2;\nDWORD_PTR (WINAPI * Trampoline_Target3)\n    (DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3) = Target3;\nDWORD_PTR (WINAPI * Trampoline_Target4)\n    (DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4) = Target4;\nDWORD_PTR (WINAPI * Trampoline_Target5)\n    (DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n     DWORD_PTR v5) = Target5;\nDWORD_PTR (WINAPI * Trampoline_Target6)\n    (DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n     DWORD_PTR v5, DWORD_PTR v6) = Target6;\nDWORD_PTR (WINAPI * Trampoline_Target7)\n    (DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n     DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7) = Target7;\nDWORD_PTR (WINAPI * Trampoline_Target8)\n    (DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n     DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8) = Target8;\nDWORD_PTR (WINAPI * Trampoline_Target9)\n    (DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n     DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n     DWORD_PTR v9) = Target9;\nDWORD_PTR (WINAPI * Trampoline_Target10)\n    (DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n     DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n     DWORD_PTR v9, DWORD_PTR v10) = Target10;\nDWORD_PTR (WINAPI * Trampoline_Target11)\n    (DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n     DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n     DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11) = Target11;\nDWORD_PTR (WINAPI * Trampoline_Target12)\n    (DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n     DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n     DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11, DWORD_PTR v12) = Target12;\nDWORD_PTR (WINAPI * Trampoline_Target13)\n    (DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n     DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n     DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11, DWORD_PTR v12,\n     DWORD_PTR v13) = Target13;\nDWORD_PTR (WINAPI * Trampoline_Target14)\n    (DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n     DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n     DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11, DWORD_PTR v12,\n     DWORD_PTR v13, DWORD_PTR v14) = Target14;\nDWORD_PTR (WINAPI * Trampoline_Target15)\n    (DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n     DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n     DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11, DWORD_PTR v12,\n     DWORD_PTR v13, DWORD_PTR v14, DWORD_PTR v15) = Target15;\nDWORD_PTR (WINAPI * Trampoline_Target16)\n    (DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n     DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n     DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11, DWORD_PTR v12,\n     DWORD_PTR v13, DWORD_PTR v14, DWORD_PTR v15, DWORD_PTR v16) = Target16;\nDWORD_PTR (WINAPI * Trampoline_TargetV)(DWORD_PTR v1, ...) = TargetV;\nDWORD_PTR (WINAPI * Trampoline_TargetR)(DWORD_PTR v1, ...) = TargetR;\n\n//////////////////////////////////////////////////////////////////////////////\n//\nVOID dprintf(const char * fmt, ...)\n{\n    CHAR szBuf[1024];\n\n    va_list args;\n    va_start(args, fmt);\n    StringCchPrintfA(szBuf, sizeof(szBuf), fmt, args);\n    va_end(args);\n\n    OutputDebugStringA(szBuf);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nDWORD_PTR WINAPI LocalTarget1(DWORD_PTR v1)\n{\n    printf(\"  LocalTarget1 (%ld)\\n\", (DWORD)v1);\n    // dprintf(\"LocalTarget1\\n\");\n    // __debugbreak();\n    return 9000;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nDWORD_PTR WINAPI MyLocalTarget1(DWORD_PTR v1)\n{\n    printf(\"  MyLocalTarget1 (%ld)\\n\",\n           (DWORD)v1);\n    // dprintf(\"LocalTarget1, Trampoline_LocalTarget1=%p\\n\", Trampoline_LocalTarget1);\n    return Trampoline_LocalTarget1(v1);\n}\n\nDWORD_PTR WINAPI MyTarget0()\n{\n    printf(\"  MyTarget0 ()\\n\");\n    return Trampoline_Target0();\n}\n\nDWORD_PTR WINAPI MyTarget1(DWORD_PTR v1)\n{\n    printf(\"  MyTarget1 (%ld)\\n\",\n           (DWORD)v1);\n    return Trampoline_Target1(v1);\n}\n\nDWORD_PTR WINAPI MyTarget2(DWORD_PTR v1, DWORD_PTR v2)\n{\n    printf(\"  MyTarget2 (%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2);\n    return Trampoline_Target2(v1,v2);\n}\n\nDWORD_PTR WINAPI MyTarget3(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3)\n{\n    printf(\"  MyTarget3 (%ld,%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2, (DWORD)v3);\n    return Trampoline_Target3(v1,v2,v3);\n}\n\nDWORD_PTR WINAPI MyTarget4(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4)\n{\n    printf(\"  MyTarget4 (%ld,%ld,%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4);\n    return Trampoline_Target4(v1,v2,v3,v4);\n}\n\nDWORD_PTR WINAPI MyTarget5(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                           DWORD_PTR v5)\n{\n    printf(\"  MyTarget5 (%ld,%ld,%ld,%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4,\n           (DWORD)v5);\n    return Trampoline_Target5(v1,v2,v3,v4,v5);\n}\n\nDWORD_PTR WINAPI MyTarget6(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                           DWORD_PTR v5, DWORD_PTR v6)\n{\n    printf(\"  MyTarget6 (%ld,%ld,%ld,%ld,%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4,\n           (DWORD)v5, (DWORD)v6);\n    return Trampoline_Target6(v1,v2,v3,v4,v5,v6);\n}\n\nDWORD_PTR WINAPI MyTarget7(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                           DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7)\n{\n    printf(\"  MyTarget7 (%ld,%ld,%ld,%ld,%ld,%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4,\n           (DWORD)v5, (DWORD)v6, (DWORD)v7);\n    return Trampoline_Target7(v1,v2,v3,v4,v5,v6,v7);\n}\n\nDWORD_PTR WINAPI MyTarget8(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                           DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8)\n{\n    printf(\"  MyTarget8 (%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4,\n           (DWORD)v5, (DWORD)v6, (DWORD)v7, (DWORD)v8);\n    return Trampoline_Target8(v1,v2,v3,v4,v5,v6,v7,v8);\n}\n\nDWORD_PTR WINAPI MyTarget9(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                         DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n                         DWORD_PTR v9)\n{\n    printf(\"  MyTarget9 (%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4,\n           (DWORD)v5, (DWORD)v6, (DWORD)v7, (DWORD)v8,\n           (DWORD)v9);\n    return Trampoline_Target9(v1,v2,v3,v4,v5,v6,v7,v8,v9);\n}\n\nDWORD_PTR WINAPI MyTarget10(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                            DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n                            DWORD_PTR v9, DWORD_PTR v10)\n{\n    printf(\"  MyTarget10(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4,\n           (DWORD)v5, (DWORD)v6, (DWORD)v7, (DWORD)v8,\n           (DWORD)v9, (DWORD)v10);\n    return Trampoline_Target10(v1,v2,v3,v4,v5,v6,v7,v8,v9,v10);\n}\n\nDWORD_PTR WINAPI MyTarget11(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                            DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n                            DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11)\n{\n    printf(\"  MyTarget11(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4,\n           (DWORD)v5, (DWORD)v6, (DWORD)v7, (DWORD)v8,\n           (DWORD)v9, (DWORD)v10, (DWORD)v11);\n    return Trampoline_Target11(v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11);\n}\n\nDWORD_PTR WINAPI MyTarget12(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                            DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n                            DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11, DWORD_PTR v12)\n{\n    printf(\"  MyTarget12(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4,\n           (DWORD)v5, (DWORD)v6, (DWORD)v7, (DWORD)v8,\n           (DWORD)v9, (DWORD)v10, (DWORD)v11, (DWORD)v12);\n    return Trampoline_Target12(v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12);\n}\n\nDWORD_PTR WINAPI MyTarget13(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                            DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n                            DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11, DWORD_PTR v12,\n                            DWORD_PTR v13)\n{\n    printf(\"  MyTarget13(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4,\n           (DWORD)v5, (DWORD)v6, (DWORD)v7, (DWORD)v8,\n           (DWORD)v9, (DWORD)v10, (DWORD)v11, (DWORD)v12,\n           (DWORD)v13);\n    return Trampoline_Target13(v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13);\n}\n\nDWORD_PTR WINAPI MyTarget14(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                            DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n                            DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11, DWORD_PTR v12,\n                            DWORD_PTR v13, DWORD_PTR v14)\n{\n    printf(\"  MyTarget14(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4,\n           (DWORD)v5, (DWORD)v6, (DWORD)v7, (DWORD)v8,\n           (DWORD)v9, (DWORD)v10, (DWORD)v11, (DWORD)v12,\n           (DWORD)v13, (DWORD)v14);\n    return Trampoline_Target14(v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14);\n}\n\nDWORD_PTR WINAPI MyTarget15(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                            DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n                            DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11, DWORD_PTR v12,\n                            DWORD_PTR v13, DWORD_PTR v14, DWORD_PTR v15)\n{\n    printf(\"  MyTarget15(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4,\n           (DWORD)v5, (DWORD)v6, (DWORD)v7, (DWORD)v8,\n           (DWORD)v9, (DWORD)v10, (DWORD)v11, (DWORD)v12,\n           (DWORD)v13, (DWORD)v14, (DWORD)v15);\n    return Trampoline_Target15(v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15);\n}\n\nDWORD_PTR WINAPI MyTarget16(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4,\n                            DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8,\n                            DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11, DWORD_PTR v12,\n                            DWORD_PTR v13, DWORD_PTR v14, DWORD_PTR v15, DWORD_PTR v16)\n{\n    printf(\"  MyTarget16(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)\\n\",\n           (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4,\n           (DWORD)v5, (DWORD)v6, (DWORD)v7, (DWORD)v8,\n           (DWORD)v9, (DWORD)v10, (DWORD)v11, (DWORD)v12,\n           (DWORD)v13, (DWORD)v14, (DWORD)v15, (DWORD)v16);\n    return Trampoline_Target16(v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16);\n}\n\nDWORD_PTR WINAPI MyTargetV(DWORD_PTR v1, ...)\n{\n    DWORD_PTR args[32];\n\n    va_list va;\n    va_start(va, v1);\n\n    int argc = 0;\n    for (args[argc++] = v1; args[argc-1] != 0;) {\n        args[argc++] = va_arg(va, DWORD_PTR);\n    }\n    va_end(va);\n\n    printf(\"  MyTargetV (\");\n    int i = argc - 1;\n    for (; i > 0; i--) {\n        printf(\"%ld,\", (DWORD)args[i]);\n    }\n    printf(\"%ld)\\n\", (DWORD)args[0]);\n\n    switch (argc) {\n      default:\n        return Trampoline_TargetV(0);\n      case 1:\n        return Trampoline_TargetV(args[0]);\n      case 2:\n        return Trampoline_TargetV(args[0], args[1]);\n      case 3:\n        return Trampoline_TargetV(args[0], args[1], args[2]);\n      case 4:\n        return Trampoline_TargetV(args[0], args[1], args[2], args[3]);\n      case 5:\n        return Trampoline_TargetV(args[0], args[1], args[2], args[3],\n                                  args[4]);\n      case 6:\n        return Trampoline_TargetV(args[0], args[1], args[2], args[3],\n                                  args[4], args[5]);\n      case 7:\n        return Trampoline_TargetV(args[0], args[1], args[2], args[3],\n                                  args[4], args[5], args[6]);\n      case 8:\n        return Trampoline_TargetV(args[0], args[1], args[2], args[3],\n                                  args[4], args[5], args[6], args[7]);\n      case 9:\n        return Trampoline_TargetV(args[0], args[1], args[2], args[3],\n                                  args[4], args[5], args[6], args[7],\n                                  args[8]);\n      case 10:\n        return Trampoline_TargetV(args[0], args[1], args[2], args[3],\n                                  args[4], args[5], args[6], args[7],\n                                  args[8], args[9]);\n      case 11:\n        return Trampoline_TargetV(args[0], args[1], args[2], args[3],\n                                  args[4], args[5], args[6], args[7],\n                                  args[8], args[9], args[10]);\n      case 12:\n        return Trampoline_TargetV(args[0], args[1], args[2], args[3],\n                                  args[4], args[5], args[6], args[7],\n                                  args[8], args[9], args[10], args[11]);\n      case 13:\n        return Trampoline_TargetV(args[0], args[1], args[2], args[3],\n                                  args[4], args[5], args[6], args[7],\n                                  args[8], args[9], args[10], args[11],\n                                  args[12]);\n      case 14:\n        return Trampoline_TargetV(args[0], args[1], args[2], args[3],\n                                  args[4], args[5], args[6], args[7],\n                                  args[8], args[9], args[10], args[11],\n                                  args[12], args[13]);\n      case 15:\n        return Trampoline_TargetV(args[0], args[1], args[2], args[3],\n                                  args[4], args[5], args[6], args[7],\n                                  args[8], args[9], args[10], args[11],\n                                  args[12], args[13], args[14]);\n      case 16:\n        return Trampoline_TargetV(args[0], args[1], args[2], args[3],\n                                  args[4], args[5], args[6], args[7],\n                                  args[8], args[9], args[10], args[11],\n                                  args[12], args[13], args[14], args[15]);\n      case 17:\n        return Trampoline_TargetV(args[0], args[1], args[2], args[3],\n                                  args[4], args[5], args[6], args[7],\n                                  args[8], args[9], args[10], args[11],\n                                  args[12], args[13], args[14], args[15],\n                                  args[16]);\n    }\n}\n\nDWORD_PTR WINAPI MyTargetR(DWORD_PTR v1, ...)\n{\n    DWORD_PTR args[32];\n\n    va_list va;\n    va_start(va, v1);\n\n    int argc = 0;\n    for (args[argc++] = v1; args[argc-1] != 0;) {\n        args[argc++] = va_arg(va, DWORD_PTR);\n    }\n    va_end(va);\n\n    if (v1 < 5) {\n        printf(\"  MyTargetR (\");\n        int i = argc - 1;\n        for (; i > 0; i--) {\n            printf(\"%ld,\", (DWORD)args[i]);\n        }\n        printf(\"%ld)\\n\", (DWORD)args[0]);\n    }\n    else {\n        printf(\".\");\n    }\n\n    switch (argc) {\n      default:\n        return Trampoline_TargetR(0);\n      case 1:\n        return Trampoline_TargetR(args[0]);\n      case 2:\n        return Trampoline_TargetR(args[0], args[1]);\n      case 3:\n        return Trampoline_TargetR(args[0], args[1], args[2]);\n      case 4:\n        return Trampoline_TargetR(args[0], args[1], args[2], args[3]);\n      case 5:\n        return Trampoline_TargetR(args[0], args[1], args[2], args[3],\n                                  args[4]);\n      case 6:\n        return Trampoline_TargetR(args[0], args[1], args[2], args[3],\n                                  args[4], args[5]);\n      case 7:\n        return Trampoline_TargetR(args[0], args[1], args[2], args[3],\n                                  args[4], args[5], args[6]);\n      case 8:\n        return Trampoline_TargetR(args[0], args[1], args[2], args[3],\n                                  args[4], args[5], args[6], args[7]);\n      case 9:\n        return Trampoline_TargetR(args[0], args[1], args[2], args[3],\n                                  args[4], args[5], args[6], args[7],\n                                  args[8]);\n      case 10:\n        return Trampoline_TargetR(args[0], args[1], args[2], args[3],\n                                  args[4], args[5], args[6], args[7],\n                                  args[8], args[9]);\n      case 11:\n        return Trampoline_TargetR(args[0], args[1], args[2], args[3],\n                                  args[4], args[5], args[6], args[7],\n                                  args[8], args[9], args[10]);\n      case 12:\n        return Trampoline_TargetR(args[0], args[1], args[2], args[3],\n                                  args[4], args[5], args[6], args[7],\n                                  args[8], args[9], args[10], args[11]);\n      case 13:\n        return Trampoline_TargetR(args[0], args[1], args[2], args[3],\n                                  args[4], args[5], args[6], args[7],\n                                  args[8], args[9], args[10], args[11],\n                                  args[12]);\n      case 14:\n        return Trampoline_TargetR(args[0], args[1], args[2], args[3],\n                                  args[4], args[5], args[6], args[7],\n                                  args[8], args[9], args[10], args[11],\n                                  args[12], args[13]);\n      case 15:\n        return Trampoline_TargetR(args[0], args[1], args[2], args[3],\n                                  args[4], args[5], args[6], args[7],\n                                  args[8], args[9], args[10], args[11],\n                                  args[12], args[13], args[14]);\n      case 16:\n        return Trampoline_TargetR(args[0], args[1], args[2], args[3],\n                                  args[4], args[5], args[6], args[7],\n                                  args[8], args[9], args[10], args[11],\n                                  args[12], args[13], args[14], args[15]);\n      case 17:\n        return Trampoline_TargetR(args[0], args[1], args[2], args[3],\n                                  args[4], args[5], args[6], args[7],\n                                  args[8], args[9], args[10], args[11],\n                                  args[12], args[13], args[14], args[15],\n                                  args[16]);\n    }\n}\n\n/////////////////////////////////////////////////////////// Recursive Detours.\n//\nDWORD_PTR (WINAPI * Trampoline_Target0_1)() = NULL;\nDWORD_PTR (WINAPI * Trampoline_Target0_2)() = NULL;\nDWORD_PTR (WINAPI * Trampoline_Target0_3)() = NULL;\n\nstatic DWORD_PTR WINAPI MyTarget0_1()\n{\n    printf(\"  Starting Target0_1.\\n\");\n    DWORD_PTR rv = Trampoline_Target0_1();\n    printf(\"  End Target0_1.\\n\");\n    return rv;\n}\n\nstatic DWORD_PTR WINAPI MyTarget0_2()\n{\n    printf(\"  Starting Target0_2.\\n\");\n    DWORD_PTR rv = Trampoline_Target0_2();\n    printf(\"  End Target0_2.\\n\");\n    return rv;\n}\n\nstatic DWORD_PTR WINAPI MyTarget0_3()\n{\n    printf(\"  Starting Target0_3.\\n\");\n    DWORD_PTR rv = Trampoline_Target0_3();\n    printf(\"  End Target0_3.\\n\");\n    return rv;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nint WINAPI WinMain(HINSTANCE hinst, HINSTANCE hprev, LPSTR lpszCmdLine, int nCmdShow)\n{\n    (void)hinst;\n    (void)hprev;\n    (void)lpszCmdLine;\n    (void)nCmdShow;\n\n    printf(\"Calling LocalTarget1 w/o detour\\n\");\n    LocalTarget1(1);\n\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n    DetourAttach(&(PVOID&)Trampoline_LocalTarget1, MyLocalTarget1);\n    DetourTransactionCommit();\n\n    printf(\"Calling LocalTarget1 w/ detour\\n\");\n    LocalTarget1(2);\n\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n    DetourAttach(&(PVOID&)Trampoline_Target0, MyTarget0);\n    DetourTransactionCommit();\n\n    printf(\"Calling Target0 function.\\n\");\n    //dprintf(\"- Trampoline_Target0:: %p\\n\", Trampoline_Target0);\n    //dprintf(\"- Target0           :: %p\\n\", Target0);\n    Target0();\n\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n    DetourAttach(&(PVOID&)Trampoline_Target1, MyTarget1);\n    DetourAttach(&(PVOID&)Trampoline_Target2, MyTarget2);\n    DetourAttach(&(PVOID&)Trampoline_Target3, MyTarget3);\n    DetourAttach(&(PVOID&)Trampoline_Target4, MyTarget4);\n    DetourAttach(&(PVOID&)Trampoline_Target5, MyTarget5);\n    DetourAttach(&(PVOID&)Trampoline_Target6, MyTarget6);\n    DetourAttach(&(PVOID&)Trampoline_Target7, MyTarget7);\n    DetourAttach(&(PVOID&)Trampoline_Target8, MyTarget8);\n    DetourAttach(&(PVOID&)Trampoline_Target9, MyTarget9);\n    DetourAttach(&(PVOID&)Trampoline_Target10, MyTarget10);\n    DetourAttach(&(PVOID&)Trampoline_Target11, MyTarget11);\n    DetourAttach(&(PVOID&)Trampoline_Target12, MyTarget12);\n    DetourAttach(&(PVOID&)Trampoline_Target13, MyTarget13);\n    DetourAttach(&(PVOID&)Trampoline_Target14, MyTarget14);\n    DetourAttach(&(PVOID&)Trampoline_Target15, MyTarget15);\n    DetourAttach(&(PVOID&)Trampoline_Target16, MyTarget16);\n    DetourAttach(&(PVOID&)Trampoline_TargetV, MyTargetV);\n    DetourAttach(&(PVOID&)Trampoline_TargetR, MyTargetR);\n    DetourTransactionCommit();\n\n    printf(\"Calling TargetN functions.\\n\");\n    LocalTarget1(1);\n    Target0();\n    Target1(1);\n    Target2(1,2);\n    Target3(1,2,3);\n    Target4(1,2,3,4);\n    Target5(1,2,3,4,5);\n    Target6(1,2,3,4,5,6);\n    Target7(1,2,3,4,5,6,7);\n    Target8(1,2,3,4,5,6,7,8);\n    Target9(1,2,3,4,5,6,7,8,9);\n    Target10(1,2,3,4,5,6,7,8,9,10);\n    Target11(1,2,3,4,5,6,7,8,9,10,11);\n    Target12(1,2,3,4,5,6,7,8,9,10,11,12);\n    Target13(1,2,3,4,5,6,7,8,9,10,11,12,13);\n    Target14(1,2,3,4,5,6,7,8,9,10,11,12,13,14);\n    Target15(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);\n    Target16(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16);\n    TargetV(0);\n    TargetV(1,0);\n    TargetV(2,1,0);\n    TargetV(3,2,1,0);\n    TargetV(4,3,2,1,0);\n    TargetV(5,4,3,2,1,0);\n    TargetV(6,5,4,3,2,1,0);\n    TargetV(7,6,5,4,3,2,1,0);\n    TargetV(8,7,6,5,4,3,2,1,0);\n    TargetV(9,8,7,6,5,4,3,2,1,0);\n    TargetV(10,9,8,7,6,5,4,3,2,1,0);\n    TargetV(11,10,9,8,7,6,5,4,3,2,1,0);\n    TargetV(12,11,10,9,8,7,6,5,4,3,2,1,0);\n    TargetV(13,12,11,10,9,8,7,6,5,4,3,2,1,0);\n    TargetV(14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);\n    TargetV(15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);\n    TargetV(16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);\n    TargetR(4,3,2,1,0);\n    DWORD_PTR rv = TargetR(100,10,9,8,7,6,5,4,3,2,1,0);\n    printf(\" => %ld\\n\", (DWORD)rv);\n\n    Trampoline_Target0_1 = Target0;\n    Trampoline_Target0_2 = Target0;\n    Trampoline_Target0_3 = Target0;\n\n    //dprintf(\"Trampoline_Target0_1 = %p\\n\", DetourCodeFromPointer(Trampoline_Target0_1, NULL));\n    //__debugbreak();\n\n    printf(\"Calling Target0 again with 1 detour.\\n\");\n    Target0();\n\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n    DetourAttach(&(PVOID&)Trampoline_Target0_1, MyTarget0_1);\n    DetourTransactionCommit();\n\n    //dprintf(\"Trampoline_Target0_2 = %p\\n\", DetourCodeFromPointer(Trampoline_Target0_2, NULL));\n    //__debugbreak();\n    printf(\"Calling Target0 again with 2 detours.\\n\");\n    Target0();\n\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n    DetourAttach(&(PVOID&)Trampoline_Target0_2, MyTarget0_2);\n    DetourTransactionCommit();\n\n    //dprintf(\"Trampoline_Target0_3 = %p\\n\", DetourCodeFromPointer(Trampoline_Target0_3, NULL));\n    //__debugbreak();\n    printf(\"Calling Target0 again with 3 detours.\\n\");\n    Target0();\n\n\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n    DetourAttach(&(PVOID&)Trampoline_Target0_3, MyTarget0_3);\n    DetourTransactionCommit();\n\n    //dprintf(\"Trampoline_Target0_3 = %p\\n\", DetourCodeFromPointer(Trampoline_Target0_3, NULL));\n    //__debugbreak();\n    printf(\"Calling Target0 again with 4 detours.\\n\");\n    Target0();\n\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n    DetourDetach(&(PVOID&)Trampoline_Target0, MyTarget0);\n    DetourDetach(&(PVOID&)Trampoline_Target1, MyTarget1);\n    DetourDetach(&(PVOID&)Trampoline_Target2, MyTarget2);\n    DetourDetach(&(PVOID&)Trampoline_Target3, MyTarget3);\n    DetourDetach(&(PVOID&)Trampoline_Target4, MyTarget4);\n    DetourDetach(&(PVOID&)Trampoline_Target5, MyTarget5);\n    DetourDetach(&(PVOID&)Trampoline_Target6, MyTarget6);\n    DetourDetach(&(PVOID&)Trampoline_Target7, MyTarget7);\n    DetourDetach(&(PVOID&)Trampoline_Target8, MyTarget8);\n    DetourDetach(&(PVOID&)Trampoline_Target9, MyTarget9);\n    DetourDetach(&(PVOID&)Trampoline_Target10, MyTarget10);\n    DetourDetach(&(PVOID&)Trampoline_Target11, MyTarget11);\n    DetourDetach(&(PVOID&)Trampoline_Target12, MyTarget12);\n    DetourDetach(&(PVOID&)Trampoline_Target13, MyTarget13);\n    DetourDetach(&(PVOID&)Trampoline_Target14, MyTarget14);\n    DetourDetach(&(PVOID&)Trampoline_Target15, MyTarget15);\n    DetourDetach(&(PVOID&)Trampoline_Target16, MyTarget16);\n    DetourDetach(&(PVOID&)Trampoline_TargetV, MyTargetV);\n    DetourDetach(&(PVOID&)Trampoline_TargetR, MyTargetR);\n    DetourTransactionCommit();\n\n    printf(\"Done.\\n\");\n\n    return 0;\n}\n\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/dumpe/Makefile",
    "content": "##############################################################################\n##\n##  Makefile for Detours Test Programs.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\nLIBS=$(LIBS) kernel32.lib\n\nall: dirs \\\n    $(BIND)\\dumpe.exe \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\dumpe.bsc\n!ENDIF\n\nclean:\n    -del *~ 2>nul\n    -del $(BIND)\\dumpe.* 2>nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\n$(OBJD)\\dumpe.obj : dumpe.cpp\n\n$(BIND)\\dumpe.exe : $(OBJD)\\dumpe.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb $(OBJD)\\dumpe.obj \\\n        /link $(LINKFLAGS) $(LIBS) \\\n        /subsystem:console\n\n$(OBJD)\\dumpe.bsc : $(OBJD)\\dumpe.obj\n    bscmake /v /n /o $@ $(OBJD)\\dumpe.sbr\n\n##############################################################################\n\ntest: $(BIND)\\dumpe.exe\n    $(BIND)\\dumpe.exe $(BIND)\\slept.dll\n\ntestx: $(BIND)\\dumpe.exe\n    cd $(MAKEDIR)\\..\\..\\src\n    nmake\n    cd $(MAKEDIR)\n    if exist $(SYSTEMROOT)\\system32\\browseui.dll $(BIND)\\dumpe.exe browseui.dll\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/dumpe/dumpe.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (dumpe.cpp of dumpe.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#include <stdio.h>\n#include <stdlib.h>\n#include <windows.h>\n#include <ole2.h>\n#include <shellapi.h>\n#include \"detours.h\"\n\n//////////////////////////////////////////////////////////////////////////////\n//\n#ifndef NODEBUG\n#undef ASSERT\nVOID DetourAssertMessage(CONST PCHAR szMsg, CONST PCHAR szFile, DWORD nLine);\n\n#define ASSERT(x)   \\\ndo { if (!(x)) { DetourAssertMessage(#x, __FILE__, __LINE__); DebugBreak(); }} while (0)\n    ;\n#undef ASSERTX\n#define ASSERTX(x)   \\\ndo { if (!(x)) { DetourAssertMessage(#x, __FILE__, __LINE__); PCHAR p=(PCHAR)(x); *p = 1; }} while (0)\n    ;\n#else   // NODEBUG\n#undef ASSERT\n#define ASSERT(x)\n#undef ASSERTX\n#define ASSERTX(x)\n#endif  // NODEBUG\n//\n//////////////////////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////// Error Messages.\n//\nVOID DetourAssertMessage(CONST PCHAR szMsg, CONST PCHAR szFile, DWORD nLine)\n{\n    printf(\"ASSERT(%s) failed in %s, line %ld.\", szMsg, szFile, nLine);\n}\n\n\n\nstatic BOOL CALLBACK ExportCallback(PVOID pContext,\n                                    ULONG nOrdinal,\n                                    LPCSTR pszSymbol,\n                                    PVOID pbTarget)\n{\n    (void)pContext;\n\n    printf(\"    %7ld      %p %-30s\\n\",\n           (ULONG)nOrdinal,\n           pbTarget,\n           pszSymbol ? pszSymbol : \"[NONAME]\");\n    return TRUE;\n}\n\nBOOL DumpFile(PCHAR pszPath)\n{\n    HINSTANCE hInst = LoadLibraryA(pszPath);\n    if (hInst == NULL) {\n        printf(\"Unable to load %s: Error %ld\\n\", pszPath, GetLastError());\n        return FALSE;\n    }\n\n    printf(\"%s @ %p\\n\", pszPath, hInst);\n\n    PVOID pbEntry = DetourGetEntryPoint(hInst);\n    printf(\"  EntryPoint: %p\\n\", pbEntry);\n\n    printf(\"    Ordinal      RVA     Name\\n\");\n    DetourEnumerateExports(hInst, NULL, ExportCallback);\n\n    return TRUE;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nvoid PrintUsage(void)\n{\n    printf(\"Usage:\\n\"\n           \"    dumpe [.dll files]\\n\"\n           \"Misc. Options:\\n\"\n           \"    /?       : Help screen.\\n\");\n}\n\n//////////////////////////////////////////////////////////////////////// main.\n//\nint CDECL main(int argc, char **argv)\n{\n    BOOL fNeedHelp = FALSE;\n\n    int arg = 1;\n    for (; arg < argc; arg++) {\n        if (argv[arg][0] == '-' || argv[arg][0] == '/') {\n            CHAR *argn = argv[arg] + 1;\n            CHAR *argp = argn;\n            while (*argp && *argp != ':')\n                argp++;\n            if (*argp == ':')\n                *argp++ = '\\0';\n\n            switch (argn[0]) {\n\n            case '?':                                   // Help.\n                fNeedHelp = TRUE;\n                break;\n\n            default:\n                fNeedHelp = TRUE;\n                printf(\"Bad argument: %s:%s\\n\", argn, argp);\n                break;\n            }\n        }\n        else {\n            DumpFile(argv[arg]);\n        }\n    }\n    if (fNeedHelp || argc == 1) {\n        PrintUsage();\n        return 1;\n    }\n    return 0;\n}\n\n// End of File\n"
  },
  {
    "path": "ext/detours/samples/dumpi/Makefile",
    "content": "##############################################################################\n##\n##  Makefile for Detours Test Programs - Dump Imports\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\nLIBS=$(LIBS) kernel32.lib\n\nall: dirs \\\n    $(BIND)\\dumpi.exe \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\dumpi.bsc \\\n!ENDIF\n\nclean:\n    -del *~ 2>nul\n    -del $(BIND)\\dumpi.* 2>nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\n$(OBJD)\\dumpi.obj : dumpi.cpp\n\n$(BIND)\\dumpi.exe : $(OBJD)\\dumpi.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb $(OBJD)\\dumpi.obj \\\n        /link $(LINKFLAGS) $(LIBS) \\\n        /subsystem:console\n\n$(OBJD)\\dumpi.bsc : $(OBJD)\\dumpi.obj\n    bscmake /v /n /o $@ $(OBJD)\\dumpi.sbr\n\n##############################################################################\n\ntest: $(BIND)\\dumpi.exe\n    $(BIND)\\dumpi.exe $(BIND)\\slept.dll $(BIND)\\sleepold.exe\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/dumpi/dumpi.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (dumpi.cpp of dumpi.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#include <stdio.h>\n#include <stdlib.h>\n#include <windows.h>\n#include <shellapi.h>\n#pragma warning(push)\n#if _MSC_VER > 1400\n#pragma warning(disable:6102 6103) // /analyze warnings\n#endif\n#include <strsafe.h>\n#pragma warning(pop)\n#include <detours.h>\n\n////////////////////////////////////////////////////////////// Error Messages.\n//\nVOID AssertMessage(PCSTR szMsg, PCSTR szFile, DWORD nLine)\n{\n    printf(\"ASSERT(%s) failed in %s, line %ld.\", szMsg, szFile, nLine);\n}\n\n#define ASSERT(x)   \\\ndo { if (!(x)) { AssertMessage(#x, __FILE__, __LINE__); DebugBreak(); }} while (0)\n    ;\n\n//////////////////////////////////////////////////////////////////////////////\n//\nstatic CHAR s_szFile[MAX_PATH] = \"\\0\";\n\nstatic BOOL CALLBACK ListFileCallback(_In_opt_ PVOID pContext,\n                                      _In_z_ LPCSTR pszOrigFile,\n                                      _In_z_ LPCSTR pszFile,\n                                      _Outptr_result_maybenull_ LPCSTR *ppszOutFile)\n{\n    (void)pContext;\n    (void)pszFile;\n\n    *ppszOutFile = NULL;\n\n    StringCchCopyA(s_szFile, sizeof(s_szFile), pszOrigFile);\n\n    PCHAR psz;\n    if ((psz = strchr(s_szFile, '.')) != NULL) {\n        *psz = '\\0';\n    }\n    return TRUE;\n}\n\nBOOL CALLBACK ListSymbolCallback(_In_opt_ PVOID pContext,\n                                 _In_ ULONG nOrigOrdinal,\n                                 _In_ ULONG nOrdinal,\n                                 _Out_ ULONG *pnOutOrdinal,\n                                 _In_opt_z_ LPCSTR pszOrigSymbol,\n                                 _In_opt_z_ LPCSTR pszSymbol,\n                                 _Outptr_result_maybenull_ LPCSTR *ppszOutSymbol)\n{\n    (void)pContext;\n    (void)nOrdinal;\n    (void)pszSymbol;\n\n    *ppszOutSymbol = NULL;\n    *pnOutOrdinal = 0;\n\n    if (nOrigOrdinal != 0) {\n        printf(\"  %s::#%ld\\n\",\n               s_szFile, nOrigOrdinal);\n    }\n    else {\n        printf(\"  %s::%s\\n\",\n               s_szFile, pszOrigSymbol);\n    }\n\n    return TRUE;\n}\n\nBOOL DimpFile(PCHAR pszPath)\n{\n    BOOL bGood = TRUE;\n    HANDLE hOld = INVALID_HANDLE_VALUE;\n    PDETOUR_BINARY pBinary = NULL;\n\n\n    hOld = CreateFileA(pszPath,\n                       GENERIC_READ,\n                       FILE_SHARE_READ,\n                       NULL,\n                       OPEN_EXISTING,\n                       FILE_ATTRIBUTE_NORMAL,\n                       NULL);\n\n    if (hOld == INVALID_HANDLE_VALUE) {\n        printf(\"%s: Failed to open input file with error: %ld\\n\",\n               pszPath, GetLastError());\n        bGood = FALSE;\n        goto end;\n    }\n\n    if ((pBinary = DetourBinaryOpen(hOld)) == NULL) {\n        printf(\"%s: DetourBinaryOpen failed: %ld\\n\", pszPath, GetLastError());\n        goto end;\n    }\n\n    if (hOld != INVALID_HANDLE_VALUE) {\n        CloseHandle(hOld);\n        hOld = INVALID_HANDLE_VALUE;\n    }\n\n    printf(\"%s:\\n\", pszPath);\n    if (!DetourBinaryEditImports(pBinary,\n                                 NULL,\n                                 NULL,\n                                 ListFileCallback,\n                                 ListSymbolCallback,\n                                 NULL)) {\n\n        printf(\"%s: DetourBinaryEditImports failed: %ld\\n\", pszPath, GetLastError());\n    }\n\n    DetourBinaryClose(pBinary);\n    pBinary = NULL;\n\n  end:\n    if (pBinary) {\n        DetourBinaryClose(pBinary);\n        pBinary = NULL;\n    }\n    if (hOld != INVALID_HANDLE_VALUE) {\n        CloseHandle(hOld);\n        hOld = INVALID_HANDLE_VALUE;\n    }\n    return bGood;\n}\n\n//////////////////////////////////////////////////////////////////////////////\nint DimpArgument(char *dir, char *argp, int fDoSubs)\n{\n    //////////////////////////////////////////////////////////////////////////\n\n    WIN32_FIND_DATAA wfd;\n    HANDLE  hFind = NULL;\n    char    name[1024];\n    int     nFound = 0;\n\n    StringCchCopyA(name, sizeof(name), dir ? dir : \"\");\n    StringCchCatA(name, sizeof(name), argp);\n\n    hFind = FindFirstFileA(name, &wfd);\n    if (hFind != INVALID_HANDLE_VALUE) {\n        do {\n            if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {\n                StringCchCopyA(name, sizeof(name), dir ? dir : \"\");\n                StringCchCatA(name, sizeof(name), wfd.cFileName);\n\n                nFound += DimpFile(name);\n            }\n        } while (FindNextFileA(hFind, &wfd));\n        FindClose(hFind);\n    }\n\n    if (fDoSubs) {\n        StringCchCopyA(name, sizeof(name), dir ? dir : \"\");\n        StringCchCatA(name, sizeof(name), \"*\");\n\n        hFind = FindFirstFileA(name, &wfd);\n        if (hFind == INVALID_HANDLE_VALUE)\n            return nFound;\n\n        do {\n            if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&\n                wfd.cFileName[0] != '.') {\n\n                StringCchCopyA(name, sizeof(name), dir ? dir : \"\");\n                StringCchCatA(name, sizeof(name), wfd.cFileName);\n                StringCchCatA(name, sizeof(name), \"\\\\\");\n\n                nFound += DimpArgument(name, argp, fDoSubs);\n            }\n        } while (FindNextFileA(hFind, &wfd));\n        FindClose(hFind);\n    }\n    return nFound;\n}\n\n\n//////////////////////////////////////////////////////////////////////////////\n//\nvoid PrintUsage(void)\n{\n    printf(\"Usage:\\n\"\n           \"    dimp [options] binary_files\\n\"\n           \"Options:\\n\"\n           \"    /s           : Recurse through subdirectories.\\n\"\n           \"    /?           : This help screen.\\n\"\n           \"Examples:\\n\"\n           \"    dimp /s *.exe\\n\"\n           \"\");\n}\n\n//////////////////////////////////////////////////////////////////////// main.\n//\nint CDECL main(int argc, char **argv)\n{\n    BOOL fNeedHelp = FALSE;\n    BOOL fSubdirs = FALSE;\n\n    int arg = 1;\n    for (; arg < argc; arg++) {\n        if (argv[arg][0] == '-' || argv[arg][0] == '/') {\n            CHAR *argn = argv[arg] + 1;\n            CHAR *argp = argn;\n            while (*argp && *argp != ':')\n                argp++;\n            if (*argp == ':')\n                *argp++ = '\\0';\n\n            switch (argn[0]) {\n\n              case 's':                                 // Do Subdirectories.\n              case 'S':\n                fSubdirs = TRUE;\n                break;\n\n              case '?':                                 // Help.\n                fNeedHelp = TRUE;\n                break;\n\n              default:\n                fNeedHelp = TRUE;\n                printf(\"Bad argument: %s:%s\\n\", argn, argp);\n                break;\n            }\n        }\n        else {\n            CHAR szDir[MAX_PATH] = \"\";\n            CHAR szArg[MAX_PATH] = \"\";\n            PCHAR pszDir;\n\n            if ((pszDir = strrchr(argv[arg], '\\\\')) != NULL) {\n                *pszDir++ = '\\0';\n                StringCchCopyA(szArg, sizeof(szArg), pszDir);\n                StringCchCopyA(szDir, sizeof(szDir), argv[arg]);\n                StringCchCatA(szDir, sizeof(szDir), \"\\\\\");\n            }\n            else {\n                if (GetCurrentDirectoryA(sizeof(szDir), szDir) > 3) {\n                    StringCchCatA(szDir, sizeof(szDir), \"\\\\\");\n                }\n                StringCchCopyA(szArg, sizeof(szArg), argv[arg]);\n            }\n\n            DimpArgument(szDir, szArg, fSubdirs);\n        }\n    }\n    if (argc == 1) {\n        fNeedHelp = TRUE;\n    }\n    if (fNeedHelp) {\n        PrintUsage();\n        return 1;\n    }\n    return 0;\n}\n\n// End of File\n"
  },
  {
    "path": "ext/detours/samples/dynamic_alloc/Makefile",
    "content": "##############################################################################\n##\n##  Makefile for Detours Test Programs.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\n# This test is x86 only\n!IF \"$(DETOURS_TARGET_PROCESSOR)\" == \"X86\" || \"$(DETOURS_TARGET_PROCESSOR)\" == \"X64\"\n\nTARGET_NAME=dalloc\nCFLAGS=\\\n\t$(CFLAGS)\\\n\t/EHsc\\\n\nLIBS=$(LIBS)\\\n\tuser32.lib\\\n\nall: dirs $(BIND)\\$(TARGET_NAME).exe\n\n##############################################################################\n\nclean:\n\t-del $(BIND)\\$(TARGET_NAME).* 2>nul\n\t-rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n\t-rmdir /q /s $(OBJDS) 2>nul\n\n##############################################################################\n\ndirs:\n\t@if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n\t@if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\n!IF \"$(DETOURS_TARGET_PROCESSOR)\" == \"X64\"\n$(OBJD)\\asm.obj : x64.asm\n\t$(ASM) $(AFLAGS) /Fl$(OBJD)\\x64.lst /Fo$(OBJD)\\asm.obj x64.asm\n!ELSE\n$(OBJD)\\asm.obj : x86.asm\n\t$(ASM) $(AFLAGS) /Fl$(OBJD)\\x86.lst /Fo$(OBJD)\\asm.obj x86.asm\n!ENDIF\n\n$(OBJD)\\main.obj : main.cpp\n\n$(BIND)\\$(TARGET_NAME).exe : $(OBJD)\\main.obj $(OBJD)\\asm.obj $(DEPS)\n\tlink\\\n\t\t/SUBSYSTEM:CONSOLE\\\n\t\t$(LINKFLAGS)\\\n\t\t$(LIBS)\\\n\t\t/PDB:\"$(@R).pdb\"\\\n\t\t/OUT:\"$@\"\\\n\t\t$**\\\n\n##############################################################################\n\ntest: all\n\t$(BIND)\\$(TARGET_NAME).exe\n\n##############################################################################\n\n!ELSE\n\nall:\n  @echo The platform `$(DETOURS_TARGET_PROCESSOR)` is not supported.  Skipping.\ntest:\n  @echo The platform `$(DETOURS_TARGET_PROCESSOR)` is not supported.  Skipping.\nclean:\nrealclean:\n\n!ENDIF\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/dynamic_alloc/main.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n//  This is a test program to test the DetourAllocateRegionWithinJumpBounds\n//  API, that dynamically allocates an executable region adjacent to a given\n//  address so that we can use the region as a detour function.\n//\n//  This test program detours the function `target_function`.  Instead of\n//  simply specifying a code segment as a detour function, we specify a\n//  dynamically-allocated region into which we copy the code, altering the\n//  return value, from the assembly function `CodeTemplate` as a template.\n//\n#define _CRT_SECURE_NO_WARNINGS\n#include <iostream>\n#include <functional>\n#include <assert.h>\n#include <windows.h>\n#include <detours.h>\n\nextern \"C\" {\n  void *CodeTemplate();\n  void *CodeTemplate_End();\n}\n\nvoid Log(PCSTR format, ...) {\n  char linebuf[1024];\n  va_list v;\n  va_start(v, format);\n  wvsprintfA(linebuf, format, v);\n  va_end(v);\n  OutputDebugStringA(linebuf);\n}\n\n// This is a target function to be detoured.  When detoured, it's expected to\n// return a non-nullptr value.\nvoid *target_function() {\n  std::cout << '+' << __FUNCTION__ << std::endl;\n  return nullptr;\n}\n\n// Helper function to sandwich a given function between `DetourTransactionBegin`\n// and `DetourTransactionCommit`/`DetourTransactionAbort`.\nbool DetourTransaction(std::function<bool()> callback) {\n  LONG status = DetourTransactionBegin();\n  if (status != NO_ERROR) {\n    Log(\"DetourTransactionBegin failed with %08x\\n\", status);\n    return status == NO_ERROR;\n  }\n\n  if (callback()) {\n    status = DetourTransactionCommit();\n    if (status != NO_ERROR) {\n      Log(\"DetourTransactionCommit failed with %08x\\n\", status);\n    }\n  }\n  else {\n    status = DetourTransactionAbort();\n    if (status == NO_ERROR) {\n      Log(\"Aborted transaction.\\n\");\n    }\n    else {\n      Log(\"DetourTransactionAbort failed with %08x\\n\", status);\n    }\n  }\n  return status == NO_ERROR;\n}\n\n// This class manages one dynamically-allocated region that is allocated by\n// the Detours API `DetourAllocateRegionWithinJumpBounds`, to which we can\n// push binary data sequentially to use it as a detour function.\nclass CodeRegionFactory final {\n  template <typename T>\n  static const T *at(const void *base, uint32_t offset) {\n    return\n      reinterpret_cast<const T*>(\n        reinterpret_cast<const uint8_t*>(base) + offset);\n  }\n\n  template <typename T>\n  static T *at(void *base, uint32_t offset) {\n    return\n      reinterpret_cast<T*>(\n        reinterpret_cast<uint8_t*>(base) + offset);\n  }\n\n  void *region_ = nullptr;\n  uint8_t *current_ = nullptr,\n          *current_end_ = nullptr;\n\npublic:\n  CodeRegionFactory(const void *source) {\n    DWORD new_region_size = 0;\n    auto new_region_address =\n      DetourAllocateRegionWithinJumpBounds(source, &new_region_size);\n    if (new_region_address) {\n      region_ = current_ = at<uint8_t>(new_region_address, 0);\n      current_end_ = current_ + new_region_size;\n    }\n    else {\n      Log(\"Cannot find a region near %p\\n\", source);\n    }\n  }\n\n  ~CodeRegionFactory() {\n    if (region_\n        && !VirtualFree(region_, 0, MEM_RELEASE)) {\n      Log(\"VirtualFree failed - %08x\\n\", GetLastError());\n    }\n  }\n\n  // Pushes binary data to the region if there is enough space, and returns\n  // the start address of a copy in the region if succeeded.\n  void *PushTemplate(const void *start,\n                     const void *end) {\n    auto diff = at<uint8_t>(end, 0) - at<uint8_t>(start, 0);\n    if (diff < 0 || current_ + diff > current_end_)\n      return nullptr;\n    auto start_pos = current_;\n    memcpy(start_pos, start, diff);\n    current_ += diff;\n    return start_pos;\n  }\n};\n\nint main(int, char**) {\n  std::cout << \"1. target_function() without Detour\" << std::endl;\n  auto ret = target_function();\n  std::cout << ret << std::endl;\n  assert(!ret);\n\n  CodeRegionFactory factory(target_function);\n\n  void *detour_destination,\n       *detour_target = reinterpret_cast<void*>(target_function);\n\n  // Fill the allocated page with as many instances as possible of the code\n  // template, and pick the last instance\n  while (auto p = factory.PushTemplate(CodeTemplate,\n                                       CodeTemplate_End)) {\n    detour_destination = p;\n  }\n\n  bool is_detoured = false;\n  DetourTransaction([&]() {\n    PDETOUR_TRAMPOLINE trampoline = nullptr;\n    void *target = nullptr,\n         *detour = nullptr;\n    auto status = DetourAttachEx(&detour_target,\n                                 detour_destination,\n                                 &trampoline,\n                                 &target,\n                                 &detour);\n    if (status != NO_ERROR) {\n      Log(\"DetourAttachEx failed - %08x\\n\", status);\n      return false;\n    }\n    is_detoured = true;\n    std::cout\n      << \"detour: \" << target << \" --> \" << detour\n      << \" (trampoline: \" << trampoline << \" )\"\n      << std::endl;\n    return true;\n  });\n\n  // Attach failed for some reason.  Bail out.\n  if (!is_detoured)\n    return 1;\n\n  std::cout << \"2. target_function() with Detour\" << std::endl;\n  ret = target_function();\n  std::cout << ret << std::endl;\n  assert(ret); // The return value is cracked by the detour function\n\n  DetourTransaction([&]() {\n    auto status = DetourDetach(&detour_target, detour_destination);\n    if (status != NO_ERROR) {\n      Log(\"DetourDetach failed - %08x\\n\", status);\n      return false;\n    }\n    return true;\n  });\n\n  std::cout << \"3. target_function() without Detour\" << std::endl;\n  ret = target_function();\n  std::cout << ret << std::endl;\n  assert(!ret);\n\n  return 0;\n}"
  },
  {
    "path": "ext/detours/samples/dynamic_alloc/x64.asm",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;\n;;  Detours Test Program\n;;\n;;  Microsoft Research Detours Package\n;;\n;;  Copyright (c) Microsoft Corporation.  All rights reserved.\n;;\nPUBLIC CodeTemplate\nPUBLIC CodeTemplate_End\n\n_TEXT SEGMENT\n\nCodeTemplate PROC\n  nop\n  nop\n  mov rax, 0deadbeef00000000h\n  nop\n  ret\nCodeTemplate_End::\nCodeTemplate ENDP\n\n_TEXT ENDS\n\nEND\n"
  },
  {
    "path": "ext/detours/samples/dynamic_alloc/x86.asm",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;\n;;  Detours Test Program\n;;\n;;  Microsoft Research Detours Package\n;;\n;;  Copyright (c) Microsoft Corporation.  All rights reserved.\n;;\n.386\n.model flat,C\n\nPUBLIC CodeTemplate\nPUBLIC CodeTemplate_End\n\n_TEXT SEGMENT\n\nCodeTemplate PROC\n  nop\n  nop\n  nop\n  mov eax, 0deadbeefh\n  nop\n  nop\n  nop\n  ret\nCodeTemplate_End::\nCodeTemplate ENDP\n\n_TEXT ENDS\n\nEND\n"
  },
  {
    "path": "ext/detours/samples/echo/Makefile",
    "content": "##############################################################################\n##\n##  Detours Test Program\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\nLIBS=$(LIBS) kernel32.lib\n\n##############################################################################\n\nall: dirs \\\n    $(BIND)\\echofx$(DETOURS_BITS).dll \\\n    $(BIND)\\echonul.exe \\\n    \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\echofx$(DETOURS_BITS).bsc \\\n    $(OBJD)\\echonul.bsc \\\n!ENDIF\n    option\n\n##############################################################################\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\n$(OBJD)\\echofx.obj : echofx.cpp\n\n$(OBJD)\\echofx.res : echofx.rc\n\n$(BIND)\\echofx$(DETOURS_BITS).dll $(BIND)\\echofx$(DETOURS_BITS).lib: \\\n        $(OBJD)\\echofx.obj $(OBJD)\\echofx.res $(DEPS) $(BIND)\\echonul.lib\n    cl /LD $(CFLAGS) /Fe$@ /Fd$(@R).pdb \\\n        $(OBJD)\\echofx.obj $(OBJD)\\echofx.res \\\n        /link $(LINKFLAGS) /subsystem:console \\\n        /export:DetourFinishHelperProcess,@1,NONAME \\\n        /export:Mine_Echo \\\n        $(LIBS) $(BIND)\\echonul.lib\n\n$(OBJD)\\echofx$(DETOURS_BITS).bsc : $(OBJD)\\echofx.obj\n    bscmake /v /n /o $@ $(OBJD)\\echofx.sbr\n\n$(OBJD)\\echonul.obj : echonul.cpp\n$(OBJD)\\main.obj : main.cpp\n\n$(BIND)\\echonul.exe $(BIND)\\echonul.lib: $(OBJD)\\main.obj $(OBJD)\\echonul.obj\n    cl $(CFLAGS) /Zl /Fe$(BIND)\\echonul.exe /Fd$(@R).pdb \\\n        $(OBJD)\\main.obj $(OBJD)\\echonul.obj \\\n        /link $(LINKFLAGS) \\\n        /export:Echo \\\n        /subsystem:console\n\n$(OBJD)\\echonul.bsc : echonul.obj\n    bscmake /v /n /o $@ echonul.sbr\n\n##############################################################################\n\nclean:\n    -del *~ 2>nul\n    -del $(BIND)\\echofx*.* 2>nul\n    -del $(BIND)\\echonul.* 2>nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\n############################################### Install non-bit-size binaries.\n\n!IF \"$(DETOURS_OPTION_PROCESSOR)\" != \"\"\n\n$(OPTD)\\echofx$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\echofx$(DETOURS_OPTION_BITS).pdb:\n\n$(BIND)\\echofx$(DETOURS_OPTION_BITS).dll : $(OPTD)\\echofx$(DETOURS_OPTION_BITS).dll\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\echofx$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\echofx$(DETOURS_OPTION_BITS).pdb\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n\noption: \\\n    $(BIND)\\echofx$(DETOURS_OPTION_BITS).dll \\\n    $(BIND)\\echofx$(DETOURS_OPTION_BITS).pdb \\\n\n!ELSE\n\noption:\n\n!ENDIF\n\n##############################################################################\n\ntest: all\n    @echo -------- Should echo nothing. --------------------------------------\n    -$(BIND)\\echonul.exe\n    @echo -------- Should echo Hello World. ----------------------------------\n    -$(BIND)\\withdll.exe -d:$(BIND)\\echofx$(DETOURS_BITS).dll $(BIND)\\echonul.exe\n    @echo.\n\ntestd: all\n    @echo.\n    -windbg -o -g -G $(BIND)\\withdll.exe -d:$(BIND)\\echofx$(DETOURS_BITS).dll $(BIND)\\echonul.exe\n    @echo.\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/echo/echofx.cpp",
    "content": "//\n//\n//\n#include <windows.h>\n#include <detours.h>\n#include <stdio.h>\n\nint WINAPI Echo(PCSTR pszMsg);\n\nstatic int (WINAPI * Real_Echo)(PCSTR pszMsg) = Echo;\n\nint WINAPI Mine_Echo(PCSTR pszMsg)\n{\n    printf(\"Echo(%s)\\n\", pszMsg);\n    return Real_Echo(pszMsg);\n}\n\nBOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)\n{\n    LONG error;\n    (void)hinst;\n    (void)reserved;\n\n    if (DetourIsHelperProcess()) {\n        return TRUE;\n    }\n\n    if (dwReason == DLL_PROCESS_ATTACH) {\n        DetourRestoreAfterWith();\n\n        printf(\"echofx\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll:\"\n               \" Starting.\\n\");\n        fflush(stdout);\n\n        DetourTransactionBegin();\n        DetourUpdateThread(GetCurrentThread());\n        DetourAttach(&(PVOID&)Real_Echo, Mine_Echo);\n        error = DetourTransactionCommit();\n\n        if (error == NO_ERROR) {\n            printf(\"echofx\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll:\"\n                   \" Detoured Echo().\\n\");\n        }\n        else {\n            printf(\"echofx\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll:\"\n                   \" Error detouring Echo(): %ld\\n\", error);\n        }\n    }\n    else if (dwReason == DLL_PROCESS_DETACH) {\n        DetourTransactionBegin();\n        DetourUpdateThread(GetCurrentThread());\n        DetourDetach(&(PVOID&)Real_Echo, Mine_Echo);\n        error = DetourTransactionCommit();\n\n        printf(\"echofx\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll:\"\n               \" Removed Echo() (result=%ld)\\n\", error);\n        fflush(stdout);\n    }\n    return TRUE;\n}\n"
  },
  {
    "path": "ext/detours/samples/echo/echofx.rc",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Version information for echofx.rc.\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include \"detver.h\"\n\n#define VER_INTERNALNAME_STR        \"echofx\" DETOURS_STRINGIFY(DETOURS_BITS)\n#define VER_ORIGINALFILENAME_STR    \"echofx\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\"\n#define VER_FILEDESCRIPTION_STR     \"Detours Echo Interception Module\"\n#define VER_COMPANYNAME_STR         \"Microsoft Corporation\"\n\n#include \"common.ver\"\n"
  },
  {
    "path": "ext/detours/samples/echo/echonul.cpp",
    "content": "//\n//\n//\n#include <windows.h>\n\nint WINAPI Echo(PCSTR pszMsg)\n{\n    int sum = 0;\n    while (*pszMsg) {\n        sum = sum + *pszMsg++;\n    }\n    return sum;\n}\n\nint main()\n{\n    return 0;\n}\n"
  },
  {
    "path": "ext/detours/samples/echo/main.cpp",
    "content": "//\n//\n//\n#include <windows.h>\n\nint WINAPI Echo(PCSTR pszMsg);\n\nextern \"C\" int __stdcall mainCRTStartup(HINSTANCE hInstance,\n                             HINSTANCE hPrevInstance,\n                             LPSTR lpCmdLine,\n                             int nCmdShow\n                            )\n{\n    (void)hInstance;\n    (void)hPrevInstance;\n    (void)lpCmdLine;\n    (void)nCmdShow;\n\n    Echo(\"Hello World\");\n    Echo(\"Goodbye World\");\n\n    return 0x99;\n}\n\n"
  },
  {
    "path": "ext/detours/samples/einst/Makefile",
    "content": "##############################################################################\n##\n##  Makefile for Detours Test Programs.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\n# ARM64 does not like base addresses below 4GB.\r\n# Append two extra zeros for it.\n#\r\n!if \"$(DETOURS_TARGET_PROCESSOR)\" == \"ARM64\"\r\nEDLL1X_BASE=0x710000000\r\nEDLL2X_BASE=0x720000000\r\nEDLL3X_BASE=0x730000000\r\n!else\nEDLL1X_BASE=0x7100000\r\nEDLL2X_BASE=0x7200000\r\nEDLL3X_BASE=0x7300000\r\n!endif\n\nLIBS=$(LIBS) kernel32.lib user32.lib\n\nall: dirs \\\n    $(BIND)\\edll1x$(DETOURS_BITS).dll \\\n    $(BIND)\\edll2x$(DETOURS_BITS).dll \\\n    $(BIND)\\edll3x$(DETOURS_BITS).dll \\\n    $(BIND)\\einst.exe \\\n    \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\edll1x$(DETOURS_BITS).bsc \\\n    $(OBJD)\\edll2x$(DETOURS_BITS).bsc \\\n    $(OBJD)\\edll3x$(DETOURS_BITS).bsc \\\n    $(OBJD)\\einst.bsc \\\n!ENDIF\n\toption\n\nclean:\n    -del *~ 2>nul\n    -del $(BIND)\\edll1x*.* 2>nul\n    -del $(BIND)\\edll2x*.* 2>nul\n    -del $(BIND)\\edll3x*.* 2>nul\n    -del $(BIND)\\einst.* 2>nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\n##############################################################################\n\n$(OBJD)\\einst.obj : einst.cpp\n\n$(BIND)\\einst.exe : $(OBJD)\\einst.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb $(OBJD)\\einst.obj \\\n        /link $(LINKFLAGS) $(LIBS) \\\n        $(BIND)\\edll1x$(DETOURS_BITS).lib $(BIND)\\edll2x$(DETOURS_BITS).lib $(BIND)\\edll3x$(DETOURS_BITS).lib \\\n        /subsystem:console /entry:WinMainCRTStartup\n\n$(OBJD)\\einst.bsc : $(OBJD)\\einst.obj\n    bscmake /v /n /o $@ $(OBJD)\\einst.sbr\n\n$(OBJD)\\edll1x.obj : edll1x.cpp\n\n$(BIND)\\edll1x$(DETOURS_BITS).dll : $(OBJD)\\edll1x.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb \\\n        $(OBJD)\\edll1x.obj /LD \\\n        /link $(LINKFLAGS) $(LIBS) \\\n        /subsystem:windows \\\n        /base:$(EDLL1X_BASE)\n\n$(OBJD)\\edll1x$(DETOURS_BITS).bsc : $(OBJD)\\edll1x.obj\n    bscmake /v /n /o $@ $(OBJD)\\edll1x.sbr\n\n$(OBJD)\\edll2x.obj : edll2x.cpp\n\n$(BIND)\\edll2x$(DETOURS_BITS).dll : $(OBJD)\\edll2x.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb \\\n        $(OBJD)\\edll2x.obj /LD \\\n        /link $(LINKFLAGS) $(LIBS) \\\n        /subsystem:console \\\n        /base:$(EDLL2X_BASE)\r\n\n$(OBJD)\\edll2x$(DETOURS_BITS).bsc : $(OBJD)\\edll2x.obj\n    bscmake /v /n /o $@ $(OBJD)\\edll2x.sbr\n\n$(OBJD)\\edll3x.obj : edll3x.cpp\n\n$(BIND)\\edll3x$(DETOURS_BITS).dll : $(OBJD)\\edll3x.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb \\\n        $(OBJD)\\edll3x.obj /LD \\\n        /link $(LINKFLAGS) $(LIBS) \\\n        /subsystem:console \\\n        /base:$(EDLL3X_BASE)\r\n\n$(OBJD)\\edll3x$(DETOURS_BITS).bsc : $(OBJD)\\edll3x.obj\n    bscmake /v /n /o $@ $(OBJD)\\edll3x.sbr\n\n############################################### Install non-bit-size binaries.\n\n!IF \"$(DETOURS_OPTION_PROCESSOR)\" != \"\"\n\n$(OPTD)\\edll1x$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\edll1x$(DETOURS_OPTION_BITS).pdb:\n$(OPTD)\\edll2x$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\edll2x$(DETOURS_OPTION_BITS).pdb:\n$(OPTD)\\edll3x$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\edll3x$(DETOURS_OPTION_BITS).pdb:\n\n$(BIND)\\edll1x$(DETOURS_OPTION_BITS).dll : $(OPTD)\\edll1x$(DETOURS_OPTION_BITS).dll\n\t@if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\edll1x$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\edll1x$(DETOURS_OPTION_BITS).pdb\n\t@if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\edll2x$(DETOURS_OPTION_BITS).dll : $(OPTD)\\edll2x$(DETOURS_OPTION_BITS).dll\n\t@if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\edll2x$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\edll2x$(DETOURS_OPTION_BITS).pdb\n\t@if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\edll3x$(DETOURS_OPTION_BITS).dll : $(OPTD)\\edll3x$(DETOURS_OPTION_BITS).dll\n\t@if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\edll3x$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\edll3x$(DETOURS_OPTION_BITS).pdb\n\t@if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n\noption: \\\n\t$(BIND)\\edll1x$(DETOURS_OPTION_BITS).dll \\\n\t$(BIND)\\edll1x$(DETOURS_OPTION_BITS).pdb \\\n\t$(BIND)\\edll2x$(DETOURS_OPTION_BITS).dll \\\n\t$(BIND)\\edll2x$(DETOURS_OPTION_BITS).pdb \\\n\t$(BIND)\\edll3x$(DETOURS_OPTION_BITS).dll \\\n\t$(BIND)\\edll3x$(DETOURS_OPTION_BITS).pdb \\\n\n!ELSE\n\noption:\n\n!ENDIF\n\n##############################################################################\n\ntest: all\n    $(BIND)\\einst.exe\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/einst/edll1x.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (edll1x.cpp of edll1x.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#include <stdio.h>\n#include <windows.h>\n#include <detours.h>\n\n//////////////////////////////////////////////////////////////////// DLL Stuff\n//\nstruct CPrivateStuff\n{\n    DETOUR_SECTION_HEADER   header;\n    DETOUR_SECTION_RECORD   record;\n    CHAR                    szMessage[32];\n};\n\n#pragma data_seg(\".detour\")\n\nstatic CPrivateStuff private_stuff = {\n    DETOUR_SECTION_HEADER_DECLARE(sizeof(CPrivateStuff)),\n    {\n        (sizeof(CPrivateStuff) - sizeof(DETOUR_SECTION_HEADER)),\n        0,\n        { /* d9ab8a40-f4cc-11d1-b6d7-006097b010e3 */\n            0xd9ab8a40,\n            0xf4cc,\n            0x11d1,\n            {0xb6, 0xd7, 0x00, 0x60, 0x97, 0xb0, 0x10, 0xe3}\n        }\n    },\n    \"The First Dll!\"\n};\n#pragma data_seg()\n\n__declspec(dllexport) VOID WINAPI EDll1Function(VOID)\n{\n    return;\n}\n\n__declspec(dllexport) ULONG WINAPI\nDllMain(HINSTANCE hInstance, DWORD dwReason, PVOID lpReserved)\n{\n    (void)hInstance;\n    (void)dwReason;\n    (void)lpReserved;\n\n    return TRUE;\n}\n\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/einst/edll2x.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (edll2x.cpp of einst.exe/edll2x.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#include <stdio.h>\n#include <windows.h>\n#include <detours.h>\n\n//////////////////////////////////////////////////////////////////// DLL Stuff\n//\nstruct CPrivateStuff\n{\n    DETOUR_SECTION_HEADER   header;\n    DETOUR_SECTION_RECORD   record;\n    CHAR                    szMessage[32];\n};\n\n#pragma data_seg(\".detour\")\n\nstatic CPrivateStuff private_stuff = {\n    DETOUR_SECTION_HEADER_DECLARE(sizeof(CPrivateStuff)),\n    {\n        (sizeof(CPrivateStuff) - sizeof(DETOUR_SECTION_HEADER)),\n        0,\n        { /* d9ab8a40-f4cc-11d1-b6d7-006097b010e3 */\n            0xd9ab8a40,\n            0xf4cc,\n            0x11d1,\n            {0xb6, 0xd7, 0x00, 0x60, 0x97, 0xb0, 0x10, 0xe3}\n        }\n    },\n    \"The Second Dll!\"\n};\n#pragma data_seg()\n\n__declspec(dllexport) VOID WINAPI EDll2Function(VOID)\n{\n    return;\n}\n\n__declspec(dllexport) ULONG WINAPI\nDllMain(HINSTANCE hInstance, DWORD dwReason, PVOID lpReserved)\n{\n    (void)hInstance;\n    (void)dwReason;\n    (void)lpReserved;\n\n    return TRUE;\n}\n\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/einst/edll3x.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (edll3x.cpp of einst.exe/edll3x.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#include <stdio.h>\n#include <windows.h>\n#include <detours.h>\n\n//////////////////////////////////////////////////////////////////// DLL Stuff\n//\nstruct CPrivateStuffPart1\n{\n    DETOUR_SECTION_RECORD   header;\n    CHAR                    szMessage[48];\n};\n\nstruct CPrivateStuffPart2\n{\n    DETOUR_SECTION_RECORD   header;\n    CHAR                    szMessage[64];\n};\n\nstruct CPrivateStuff\n{\n    DETOUR_SECTION_HEADER   header;\n    CPrivateStuffPart1      record1;\n    CPrivateStuffPart2      record2;\n};\n\n#pragma data_seg(\".detour\")\n\nstatic CPrivateStuff private_stuff = {\n    DETOUR_SECTION_HEADER_DECLARE(sizeof(CPrivateStuff)),\n    {\n        {\n            sizeof(CPrivateStuffPart1),\n            0,\n            { /* d9ab8a41-f4cc-11d1-b6d7-006097b010e3 */\n                0xd9ab8a41,\n                0xf4cc,\n                0x11d1,\n                {0xb6, 0xd7, 0x00, 0x60, 0x97, 0xb0, 0x10, 0xe3}\n            }\n        },\n        \"The Third DLL Part One!\"\n    },\n    {\n        {\n            sizeof(CPrivateStuffPart2),\n            0,\n            { /* d9ab8a40-f4cc-11d1-b6d7-006097b010e3 */\n                0xd9ab8a40,\n                0xf4cc,\n                0x11d1,\n                {0xb6, 0xd7, 0x00, 0x60, 0x97, 0xb0, 0x10, 0xe3}\n            }\n        },\n        \"The Third DLL Part Two!\"\n    }\n};\n#pragma data_seg()\n\n__declspec(dllexport) VOID WINAPI EDll3Function(VOID)\n{\n    return;\n}\n\n__declspec(dllexport) ULONG WINAPI\nDllMain(HINSTANCE hInstance, DWORD dwReason, PVOID lpReserved)\n{\n    (void)hInstance;\n    (void)dwReason;\n    (void)lpReserved;\n\n    return TRUE;\n}\n\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/einst/einst.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (einst.cpp of einst.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#include <stdio.h>\n#include <windows.h>\n#include <detours.h>\n\nstruct CPrivateStuff\n{\n    DETOUR_SECTION_HEADER   header;\n    DETOUR_SECTION_RECORD   record;\n    CHAR                    szMessage[32];\n};\n\n#ifdef INCLUDE_THIS\n#pragma data_seg(\".detour\")\n\nstatic CPrivateStuff private_stuff = {\n    DETOUR_SECTION_HEADER_DECLARE(sizeof(CPrivateStuff)),\n    {\n        (sizeof(CPrivateStuff) - sizeof(DETOUR_SECTION_HEADER)),\n        0,\n        { /* d9ab8a40-f4cc-11d1-b6d7-006097b010e3 */\n            0xd9ab8a40,\n            0xf4cc,\n            0x11d1,\n            {0xb6, 0xd7, 0x00, 0x60, 0x97, 0xb0, 0x10, 0xe3}\n        }\n    },\n    \"The Application!\"\n};\n#pragma data_seg()\n#endif\n\nGUID my_guid =\n{ /* d9ab8a40-f4cc-11d1-b6d7-006097b010e3 */\n    0xd9ab8a40,\n    0xf4cc,\n    0x11d1,\n    {0xb6, 0xd7, 0x00, 0x60, 0x97, 0xb0, 0x10, 0xe3}\n};\n\n__declspec(dllimport) VOID WINAPI EDll1Function(VOID);\n__declspec(dllimport) VOID WINAPI EDll2Function(VOID);\n__declspec(dllimport) VOID WINAPI EDll3Function(VOID);\n\nvoid FindPayload(HINSTANCE hinst)\n{\n    CHAR szModuleName[256];\n    GetModuleFileNameA(hinst, szModuleName, ARRAYSIZE(szModuleName));\n    printf(\"  %p : %s\\n\", hinst, szModuleName);\n\n    ULONG cbData = 0;\n    PBYTE pbData = (PBYTE)DetourFindPayload(hinst, my_guid, &cbData);\n\n    if (pbData) {\n        printf(\"  %08p..%08p : %50.50s\\n\",\n               pbData,\n               pbData + cbData,\n               pbData);\n    }\n}\n\nint WINAPI WinMain(HINSTANCE hinst, HINSTANCE hprev, LPSTR lpszCmdLine, int nCmdShow)\n{\n    (void)hinst;\n    (void)hprev;\n    (void)lpszCmdLine;\n    (void)nCmdShow;\n\n    printf(\"Source .EXE:\\n\");\n    FindPayload(NULL);\n    printf(\"\\n\");\n\n    printf(\"DLL and EXE binaries loaded:\\n\");\n\n    EDll1Function();\n    EDll2Function();\n    EDll3Function();\n\n    for (HINSTANCE hiter = NULL; (hiter = DetourEnumerateModules(hiter)) != NULL;) {\n        FindPayload(hiter);\n    }\n\n    if ((PVOID)hinst == (PVOID)lpszCmdLine) {\n        DispatchMessage(NULL);                          // Force load of gdi32.dll\n    }\n\n    return 0;\n}\n\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/excep/Makefile",
    "content": "##############################################################################\n##\n##  Makefile for Detours Test Programs.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\nLIBS=$(LIBS) kernel32.lib\n\nall: dirs \\\n    $(BIND)\\excep.exe \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\excep.bsc\n!ENDIF\n\nclean:\n    -del *~ 2>nul\n    -del $(BIND)\\excep.* 2>nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\n$(OBJD)\\excep.obj : excep.cpp\n$(OBJD)\\firstexc.obj : firstexc.cpp\n\n$(BIND)\\excep.exe : $(OBJD)\\excep.obj $(OBJD)\\firstexc.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb $(OBJD)\\excep.obj $(OBJD)\\firstexc.obj \\\n        /link $(LINKFLAGS) $(LIBS) /subsystem:console /entry:WinMainCRTStartup\n\n$(OBJD)\\excep.bsc : $(OBJD)\\excep.obj\n    bscmake /v /n /o $@ $(OBJD)\\excep.sbr\n\n##############################################################################\n\ntest: $(BIND)\\excep.exe\n    $(BIND)\\excep.exe\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/excep/excep.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  First Chance Exception Handling Test Program (excep.cpp of excep.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n//  For more information on exception handling, see \"A Crash Course on the\n//  Depths of Win32 Structured Exception Handling,\" by Matt Pietrek in the\n//  January 1997 issue of Microsoft Systems Journal.\n//\n#include <stdio.h>\n#include <windows.h>\n#include <detours.h>\n#include \"firstexc.h\"\n\n//////////////////////////////////////////////////////////////////////////////\n//\nstatic LPVOID   s_pvData = NULL;\nstatic DWORD    s_dwDataPerm = 0;\n\nstatic LONG ExceptCatch(LONG nTry, DWORD dwException, LPEXCEPTION_POINTERS pinfo)\n{\n    printf(\"      ExceptCatch(%ld, %08lx, %08lx)\\n\", nTry, dwException, (ULONG)pinfo);\n#ifdef INCLUDE_THIS\n    if (nTry == 0) {\n        return EXCEPTION_CONTINUE_EXECUTION;\n    }\n#endif\n    return EXCEPTION_EXECUTE_HANDLER;\n}\n\nstatic int BadCode(int nTry)\n{\n    printf(\"    BadCode(Try:%d)\\n\", nTry);\n    printf(\"      BadCode -> %ld\\n\", *(PULONG)s_pvData);\n    ((PULONG)s_pvData)[0] = 0;\n    printf(\"      BadCode -> %ld\\n\", *(PULONG)s_pvData);\n    ((PULONG)s_pvData)[-1] = 0;\n    printf(\"      BadCode -> %ld\\n\", *(PULONG)s_pvData);\n\n    return 0;\n}\n\nvoid safe(int nTry)\n{\n    __try {\n        printf(\"  try(%d)\\n\", nTry);\n        BadCode(nTry);\n        printf(\"  good(%d)\\n\", nTry);\n    } __except(ExceptCatch(nTry,\n                           GetExceptionCode(),\n                           GetExceptionInformation())) {\n        DWORD dwExcept = GetExceptionCode();\n\n        printf(\"  handler(%d) : %08lx\\n\", nTry, dwExcept);\n    }\n}\n\nvoid raw(int nTry)\n{\n    BadCode(nTry);\n}\n\nLONG WINAPI MyVirtualFaultFilter(PEXCEPTION_POINTERS pException)\n{\n    PEXCEPTION_RECORD pExceptRec = pException->ExceptionRecord;\n\n    if (pExceptRec->ExceptionCode == 0xc0000005) {\n        printf(\"--        Memory access exception.\\n\");\n        if (pExceptRec->NumberParameters >= 2 &&\n            pExceptRec->ExceptionInformation[1] >= (ULONG)s_pvData &&\n            pExceptRec->ExceptionInformation[1] <= (ULONG)s_pvData + sizeof(ULONG)) {\n\n            VirtualProtect(s_pvData, sizeof(ULONG), PAGE_READWRITE, &s_dwDataPerm);\n            printf(\"--        Changed permissions.\\n\");\n            return EXCEPTION_CONTINUE_EXECUTION;\n        }\n    }\n    return EXCEPTION_CONTINUE_SEARCH;\n}\n\nint WINAPI WinMain(HINSTANCE hinst, HINSTANCE hprev, LPSTR lpszCmdLine, int nCmdShow)\n{\n    (void)hinst;\n    (void)hprev;\n    (void)lpszCmdLine;\n    (void)nCmdShow;\n\n    s_pvData = VirtualAlloc(NULL, sizeof(ULONG), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);\n    if (s_pvData == NULL) {\n        printf(\"VirtualAlloc failed: %ld\\n\", GetLastError());\n        return 0;\n    }\n    *(PULONG)s_pvData = 1;\n\n    VirtualProtect(s_pvData, sizeof(ULONG), PAGE_READONLY, &s_dwDataPerm);\n\n    DetourFirstChanceExceptionFilter(MyVirtualFaultFilter);\n\n    printf(\"main\\n\");\n    printf(\"--------------------------------------------------\\n\");\n    int nTry = 0;\n    for (; nTry < 1; nTry++) {\n        // safe(nTry);\n    }\n    printf(\"-- safe ------------------------------------------\\n\");\n    safe(nTry);\n    VirtualProtect(s_pvData, sizeof(ULONG), PAGE_READWRITE, &s_dwDataPerm);\n    *(PULONG)s_pvData = 1;\n    VirtualProtect(s_pvData, sizeof(ULONG), PAGE_READONLY, &s_dwDataPerm);\n\n    printf(\"-- raw -------------------------------------------\\n\");\n    printf(\"*\\n\");\n    printf(\"* NB: The second attempt to write will fail because it isn't handled.\\n\");\n    printf(\"*\\n\");\n    raw(nTry);\n    printf(\"--------------------------------------------------\\n\");\n    printf(\"exit\\n\");\n\n    return 0;\n}\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/excep/firstexc.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (firstexc.cpp of firstexc.lib)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n//  For more information on exception handling, see \"A Crash Course on the\n//  Depths of Win32 Structured Exception Handling,\" by Matt Pietrek in the\n//  January 1997 issue of Microsoft Systems Journal.\n//\n#include <stdio.h>\n#include <windows.h>\n#include \"detours.h\"\n#include \"firstexc.h\"\n\n#if _MSC_VER > 1000\n#pragma warning(disable: 4740)\n#endif\n\n//////////////////////////////////////////////////////////////////////////////\n//\nstatic BOOL                         s_bExceptionDetourInstalled = FALSE;\nstatic LPTOP_LEVEL_EXCEPTION_FILTER s_pFirstChanceFilter = NULL;\n\nULONG (NTAPI *Real_NtContinue)(IN PCONTEXT ContextRecord,\n                             IN BOOLEAN TestAlerts) = NULL;\n\nVOID (NTAPI *Real_KiUserExceptionDispatcher)(IN PEXCEPTION_RECORD ExceptionRecord,\n                                        IN PCONTEXT ContextFrame) = NULL;\n\n//////////////////////////////////////////////////////////////////////////////\n//\n//  This function effectively removes all try..catch frames for the current\n//  stack.  It forces all exceptions to be treated as unhandled exceptions.\n//\n#pragma warning(push)\n#pragma warning(disable: 4733)\nstatic VOID WINAPI RemoveAllExceptionHandlers(VOID)\n{\n    // The basic, OS defined exception frame\n    struct EXCEPTION_REGISTRATION\n    {\n        EXCEPTION_REGISTRATION* prev;\n        FARPROC handler;\n    };\n\n    EXCEPTION_REGISTRATION * pVCExcRec = NULL;\n    EXCEPTION_REGISTRATION * pLastGood = NULL;\n\n    __asm mov eax, FS:[0];\n    __asm mov [pVCExcRec], eax;\n\n    for (pLastGood = pVCExcRec; (ULONG)pVCExcRec != ~0ul; ) {\n        if ((ULONG)pVCExcRec >= 0x30000000)\n            break;\n\n        pLastGood = pVCExcRec;\n        pVCExcRec = (EXCEPTION_REGISTRATION *)(pVCExcRec->prev);\n    }\n\n    __asm mov eax, [pLastGood];\n    __asm mov FS:[0], eax;\n}\n#pragma warning(pop)\n\n//////////////////////////////////////////////////////////////////////////////\n// Routine Description:\n//\n//    This routine is entered on return from kernel mode to dispatch a user\n//    mode exception. If a frame based handler handles the exception, then\n//    the execution is continued. Else last chance processing is performed.\n//\n//    NOTE:  This procedure is not called, but rather dispatched to.\n//           It depends on there not being a return address on the stack\n//           (assumption w.r.t. argument offsets.)\n//\n// Arguments:\n//    ExceptionRecord (esp+0) - Supplies a pointer to an exception record.\n//    ContextRecord (esp+4) - Supplies a pointer to a context frame.\n//\n// Return Value:\n//    None.\n//\nstatic VOID __declspec(naked) NTAPI\nDetour_KiUserExceptionDispatcher(PEXCEPTION_RECORD pExceptRec,\n                                 CONTEXT *pContext)\n{\n    __asm {\n        xor     eax, eax                ; // Create fake return address on stack.\n        push    eax                     ; // (Generally, we are called by the kernel.)\n\n        push    ebp                     ; // Prolog\n        mov     ebp, esp                ;\n        sub     esp, __LOCAL_SIZE       ;\n    }\n\n    LPTOP_LEVEL_EXCEPTION_FILTER pFirstChanceFilter;\n    EXCEPTION_POINTERS ep;\n    DWORD dwReturn;\n    DWORD dwError;\n\n    ep.ExceptionRecord = pExceptRec;\n    ep.ContextRecord = pContext;\n    pFirstChanceFilter = s_pFirstChanceFilter;\n    dwReturn = EXCEPTION_CONTINUE_SEARCH;\n    dwError = 0;\n\n    if (s_pFirstChanceFilter) {\n        dwReturn = pFirstChanceFilter(&ep);\n    }\n\n    if (dwReturn == EXCEPTION_CONTINUE_EXECUTION) {\n        dwError = Real_NtContinue(pContext, 0);\n        // This call should *NEVER* return.  If it does, we want to fail to the debugger.\n        RemoveAllExceptionHandlers();\n    }\n\n    if (dwReturn == EXCEPTION_EXECUTE_HANDLER) {        // Special: Call debugger.\n        RemoveAllExceptionHandlers();\n    }\n\n    __asm {\n        mov     ebx, pExceptRec         ;\n        mov     ecx, pContext           ;\n        push    ecx                     ;\n        push    ebx                     ;\n        mov     eax, [Real_KiUserExceptionDispatcher];\n        jmp     eax                     ;\n        ;\n        ; The above code should never return.\n        ;\n        int     3                       ; // Break!\n        ;\n        mov     esp, ebp                ; // Epilog\n        pop     ebp                     ;\n        ret                             ;\n    }\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\n//  Set the first-chance exception filter.\n//\n//  Returns the pointer to the last first-chance exception filter if there\n//  was one.  If this is the first first-chance exception filter, installs\n//  the necessary detour and acquires the appropriate function pointers.\n//  If the parameter is NULL, first-chance exception filtering is disabled.\n//\n//  A first-chance exception filter should always return one of three\n//  possible codes:\n//\n//    EXCEPTION_CONTINUE_SEARCH:\n//        The exception was not handled by this filter; continue the\n//        search for the appropriate exception handler.\n//\n//    EXCEPTION_CONTINUE_EXECUTION:\n//        The exception was handled by this filter; continue execution\n//        at the point were the exception was thrown.\n//\n//    EXCEPTION_EXECUTE_HANDLER:\n//        Drastic failure in the exception filter.  Process the\n//        exception as if no exception handlers were installed.\n//        (i.e. Give the user a chance to invoke the debugger.)\n//\nLPTOP_LEVEL_EXCEPTION_FILTER WINAPI\nDetourFirstChanceExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER pNewFirstChanceFilter)\n{\n    if (!s_bExceptionDetourInstalled) {\n        s_bExceptionDetourInstalled = TRUE;\n\n        Real_NtContinue = (ULONG (NTAPI *)(IN PCONTEXT, IN BOOLEAN))\n            DetourFindFunction(\"ntdll.dll\", \"NtContinue\");\n        Real_KiUserExceptionDispatcher =\n            (VOID (NTAPI *)(IN PEXCEPTION_RECORD, IN PCONTEXT))\n            DetourFindFunction(\"ntdll.dll\", \"KiUserExceptionDispatcher\");\n\n        DetourTransactionBegin();\n        DetourUpdateThread(GetCurrentThread());\n        DetourAttach(&(PVOID&)Real_KiUserExceptionDispatcher,\n                       Detour_KiUserExceptionDispatcher);\n        DetourTransactionCommit();\n    }\n\n    LPTOP_LEVEL_EXCEPTION_FILTER pOldFirstChanceFilter = s_pFirstChanceFilter;\n    s_pFirstChanceFilter = pNewFirstChanceFilter;\n    return pOldFirstChanceFilter;\n}\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/excep/firstexc.h",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (firstexc.h of firstexc.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#pragma once\n#ifndef _FIRSTEXC_H_\n#define _FIRSTEXC_H_\n\n/////////////////////////////////////////////// First Chance Exception Filter.\n//\nLPTOP_LEVEL_EXCEPTION_FILTER WINAPI\nDetourFirstChanceExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelFilter);\n\n#endif // _FIRSTEXC_H_\n//\n////////////////////////////////////////////////////////////////  End of File.\n"
  },
  {
    "path": "ext/detours/samples/findfunc/Makefile",
    "content": "##############################################################################\n##\n##  Program to test DetourFindFunction.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\n# ARM64 does not like base addresses below 4GB.\n# Append two extra zeros for it.\r\n#\r\n!if \"$(DETOURS_TARGET_PROCESSOR)\" == \"ARM64\"\r\nTARGET_BASE=0x190000000\r\nEXTEND_BASE=0x1a0000000\r\n!else\r\nTARGET_BASE=0x1900000\r\nEXTEND_BASE=0x1a00000\r\n!endif\r\n\nLIBS=$(LIBS) kernel32.lib\n\n##############################################################################\n\nall: dirs \\\n    $(BIND)\\target$(DETOURS_BITS).dll \\\n    $(BIND)\\extend$(DETOURS_BITS).dll \\\n    $(BIND)\\findfunc.exe \\\n    $(BIND)\\symtest.exe \\\n    $(BIND)\\dbghelp.dll \\\n    \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\target$(DETOURS_BITS).bsc \\\n    $(OBJD)\\extend$(DETOURS_BITS).bsc \\\n    $(OBJD)\\findfunc.bsc \\\n    $(OBJD)\\symtest.bsc \\\n!ENDIF\n    option\n\n##############################################################################\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\n$(OBJD)\\target.obj : target.cpp\n\n$(OBJD)\\target.res : target.rc\n\n$(BIND)\\target$(DETOURS_BITS).dll $(BIND)\\target$(DETOURS_BITS).lib: \\\n        $(OBJD)\\target.obj $(OBJD)\\target.res $(DEPS)\n    cl /LD $(CFLAGS) /Fe$(@R).dll /Fd$(@R).pdb \\\n        $(OBJD)\\target.obj $(OBJD)\\target.res \\\n        /link $(LINKFLAGS) /subsystem:console \\\n        /export:Target \\\n        /base:$(TARGET_BASE) \\\n        $(LIBS)\n\n$(OBJD)\\target$(DETOURS_BITS).bsc : $(OBJD)\\target.obj\n    bscmake /v /n /o $@ $(OBJD)\\target.sbr\n\n$(OBJD)\\extend.obj : extend.cpp\n\n$(OBJD)\\extend.res : extend.rc\n\n$(BIND)\\extend$(DETOURS_BITS).dll $(BIND)\\extend$(DETOURS_BITS).lib: \\\n        $(OBJD)\\extend.obj $(OBJD)\\extend.res $(DEPS)\n    cl /LD $(CFLAGS) /Fe$(@R).dll /Fd$(@R).pdb \\\n        $(OBJD)\\extend.obj $(OBJD)\\extend.res \\\n        /link $(LINKFLAGS) /subsystem:console \\\n        /export:DetourFinishHelperProcess,@1,NONAME \\\n        /base:$(EXTEND_BASE) \\\n        $(LIBS)\n\n$(OBJD)\\extend$(DETOURS_BITS).bsc : $(OBJD)\\extend.obj\n    bscmake /v /n /o $@ $(OBJD)\\extend.sbr\n\n$(OBJD)\\findfunc.obj : findfunc.cpp\n\n$(BIND)\\findfunc.exe : $(OBJD)\\findfunc.obj $(BIND)\\target$(DETOURS_BITS).lib $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb $(OBJD)\\findfunc.obj \\\n        /link $(LINKFLAGS) $(LIBS) \\\n        /subsystem:console /fixed:no $(BIND)\\target$(DETOURS_BITS).lib\n\n$(OBJD)\\findfunc.bsc : $(OBJD)\\findfunc.obj\n    bscmake /v /n /o $@ $(OBJD)\\findfunc.sbr\n\n$(OBJD)\\symtest.obj : symtest.cpp\n\n$(BIND)\\symtest.exe : $(OBJD)\\symtest.obj $(BIND)\\target$(DETOURS_BITS).lib $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb $(OBJD)\\symtest.obj \\\n        /link $(LINKFLAGS) $(LIBS) \\\n        /subsystem:console /fixed:no $(BIND)\\target$(DETOURS_BITS).lib\n\n$(OBJD)\\symtest.bsc : $(OBJD)\\symtest.obj\n    bscmake /v /n /o $@ $(OBJD)\\symtest.sbr\n\n# We try to get the 64-bit dbghelp first because it is a lot more useful.\n$(BIND)\\dbghelp.dll : {\"$(PROGRAMFILES)\\Debugging Tools for Windows 64-bit\";$(PATH)}dbghelp.dll\n    -copy $** $(BIND)\\dbghelp.dll \n\n##############################################################################\n\nclean:\n    -del *~ 2>nul\n    -del $(BIND)\\target*.* $(BIND)\\extend*.* 2>nul\n    -del $(BIND)\\findfunc.* $(BIND)\\symtest.* $(BIND)\\dbghelp.dll 2>nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\n############################################### Install non-bit-size binaries.\n\n!IF \"$(DETOURS_OPTION_PROCESSOR)\" != \"\"\n\n$(OPTD)\\extend$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\extend$(DETOURS_OPTION_BITS).pdb:\n$(OPTD)\\target$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\target$(DETOURS_OPTION_BITS).pdb:\n\n$(BIND)\\extend$(DETOURS_OPTION_BITS).dll : $(OPTD)\\extend$(DETOURS_OPTION_BITS).dll\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\extend$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\extend$(DETOURS_OPTION_BITS).pdb\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\target$(DETOURS_OPTION_BITS).dll : $(OPTD)\\target$(DETOURS_OPTION_BITS).dll\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\target$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\target$(DETOURS_OPTION_BITS).pdb\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n\noption: \\\n    $(BIND)\\extend$(DETOURS_OPTION_BITS).dll \\\n    $(BIND)\\extend$(DETOURS_OPTION_BITS).pdb \\\n    $(BIND)\\target$(DETOURS_OPTION_BITS).dll \\\n    $(BIND)\\target$(DETOURS_OPTION_BITS).pdb \\\n\n!ELSE\n\noption:\n\n!ENDIF\n\n##############################################################################\n\nverbose: all\n    cls\n    $(BIND)\\symtest.exe\n\ntest: all\n    @echo -------- Reseting test binaries to initial state. -----------------------\n    $(BIND)\\setdll.exe -r $(BIND)\\findfunc.exe\n    @echo.\n    @echo -------- Should not load extend$(DETOURS_BITS).dll--------------------------------------\n    $(BIND)\\findfunc.exe\n    @echo.\n    @echo -------- Adding extend$(DETOURS_BITS).dll to findfunc.exe ------------------------------\n    $(BIND)\\setdll.exe -d:$(BIND)\\extend$(DETOURS_BITS).dll $(BIND)\\findfunc.exe\n    @echo.\n    @echo -------- Should load extend$(DETOURS_BITS).dll statically ------------------------------\n    $(BIND)\\findfunc.exe\n    @echo.\n    @echo -------- Removing extend$(DETOURS_BITS).dll from findfunc.exe --------------------------\n    $(BIND)\\setdll.exe -r $(BIND)\\findfunc.exe\n    @echo.\n    @echo -------- Should not load extend$(DETOURS_BITS).dll -------------------------------------\n    $(BIND)\\findfunc.exe\n    @echo.\n    @echo -------- Should load extend$(DETOURS_BITS).dll dynamically using withdll.exe -----------\n    $(BIND)\\withdll.exe -d:$(BIND)\\extend$(DETOURS_BITS).dll $(BIND)\\findfunc.exe\n    @echo.\n    @echo -------- Should list symbols using symtest.exe -----------\n    $(BIND)\\symtest.exe\n    @echo.\n    @echo -------- Test completed. ------------------------------------------------\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/findfunc/extend.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detour Test Program (extend.cpp of extend.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n//  An example dynamically detouring a function.\n//\n#include <stdio.h>\n#include <windows.h>\n#include \"detours.h\"\n\nstatic LONG nExtends = 0;\nstatic LONG nInterns = 0;\n\nstatic DWORD (WINAPI * TrueTarget)(DWORD dwCount) = NULL;\nstatic DWORD (WINAPI * TrueHidden)(DWORD dwCount) = NULL;\nstatic int (WINAPI * TrueEntryPoint)(VOID) = NULL;\n\n// Extend is a detour for Target.\nstatic DWORD WINAPI Extend(DWORD dwCount)\n{\n    InterlockedIncrement(&nExtends);\n\n    printf(\"extend\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll: Extend    (%ld) -> %ld.\\n\", dwCount, dwCount + 1000);\n    dwCount = TrueTarget(dwCount + 1000);\n    printf(\"extend\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll: Extend    (.....) -> %ld.\\n\", dwCount);\n    return dwCount;\n}\n\n// Intern is a detour for Hidden.\nstatic DWORD WINAPI Intern(DWORD dwCount)\n{\n    InterlockedIncrement(&nInterns);\n\n    printf(\"extend\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll:    Intern (%ld) -> %ld.\\n\", dwCount, dwCount + 10);\n    dwCount = TrueHidden(dwCount + 10);\n    printf(\"extend\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll:    Intern (.....) -> %ld.\\n\", dwCount);\n    return dwCount;\n}\n\nstatic int WINAPI ExtendEntryPoint()\n{\n    // We couldn't call LoadLibrary in DllMain, so our functions here.\n    LONG error;\n\n    // We separate out the functions in the export table (Target)\n    // from the ones that require debug symbols (Hidden).\n    TrueTarget =\n        (DWORD (WINAPI *)(DWORD))\n        DetourFindFunction(\"target\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\", \"Target\");\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n    DetourAttach(&(PVOID&)TrueTarget, Extend);\n    error = DetourTransactionCommit();\n\n    if (error == NO_ERROR) {\n        printf(\"extend\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll: Detoured Target().\\n\");\n    }\n    else {\n        printf(\"extend\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll: Error detouring Target(): %ld\\n\", error);\n    }\n\n    // Now try to detour the functions requiring debug symbols.\n    TrueHidden =\n        (DWORD (WINAPI *)(DWORD))\n        DetourFindFunction(\"target\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\", \"Hidden\");\n    if (TrueHidden == NULL) {\n        error = GetLastError();\n        printf(\"extend\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll: TrueHidden = %p (error = %ld)\\n\", TrueHidden, error);\n    }\n\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n    DetourAttach(&(PVOID&)TrueHidden, Intern);\n    error = DetourTransactionCommit();\n\n    if (error == NO_ERROR) {\n        printf(\"extend\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll: Detoured Hidden().\\n\");\n    }\n    else {\n        printf(\"extend\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll: Error detouring Hidden(): %ld\\n\", error);\n    }\n\n    // Now let the application start executing.\n    printf(\"extend\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll: Calling EntryPoint\\n\");\n    fflush(stdout);\n\n    return TrueEntryPoint();\n}\n\nBOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)\n{\n    LONG error;\n    (void)hinst;\n    (void)reserved;\n\n    if (DetourIsHelperProcess()) {\n        return TRUE;\n    }\n\n    if (dwReason == DLL_PROCESS_ATTACH) {\n        DetourRestoreAfterWith();\n\n        printf(\"extend\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll: Starting.\\n\");\n        fflush(stdout);\n\n        // NB: DllMain can't call LoadLibrary, so we hook the app entry point.\n\n        TrueEntryPoint = (int (WINAPI *)())DetourGetEntryPoint(NULL);\n\n        DetourTransactionBegin();\n        DetourUpdateThread(GetCurrentThread());\n        DetourAttach(&(PVOID&)TrueEntryPoint, ExtendEntryPoint);\n        error = DetourTransactionCommit();\n\n        if (error == NO_ERROR) {\n            printf(\"extend\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll: Detoured EntryPoint().\\n\");\n        }\n        else {\n            printf(\"extend\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll: Error detouring EntryPoint(): %ld\\n\", error);\n        }\n    }\n    else if (dwReason == DLL_PROCESS_DETACH) {\n        DetourTransactionBegin();\n        DetourUpdateThread(GetCurrentThread());\n\n        // Detach functions found from the export table.\n        if (TrueTarget != NULL) {\n            DetourDetach(&(PVOID&)TrueTarget, (PVOID)Extend);\n        }\n\n        // Detach functions found from debug symbols.\n        if (TrueHidden != NULL) {\n            DetourDetach(&(PVOID&)TrueHidden, (PVOID)Intern);\n        }\n\n        // Detach the entry point.\n        DetourDetach(&(PVOID&)TrueEntryPoint, ExtendEntryPoint);\n        error = DetourTransactionCommit();\n\n        printf(\"extend\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll: Removed Target() detours (%ld), %ld/%ld calls.\\n\",\n               error, nExtends, nInterns);\n\n        fflush(stdout);\n    }\n    return TRUE;\n}\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/findfunc/extend.rc",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Version information for extend.rc.\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include \"detver.h\"\n\n#define VER_INTERNALNAME_STR        \"extend\" DETOURS_STRINGIFY(DETOURS_BITS)\n#define VER_ORIGINALFILENAME_STR    \"extend\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\"\n#define VER_FILEDESCRIPTION_STR     \"Detours Dyanmic Interception Test Module\"\n#define VER_COMPANYNAME_STR         \"Microsoft Corporation\"\n\n#include \"common.ver\"\n"
  },
  {
    "path": "ext/detours/samples/findfunc/findfunc.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detour Test Program (findfunc.cpp of findfunc.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include <windows.h>\n#include <stdio.h>\n#include <detours.h>\n#include \"target.h\"\n\nint __cdecl main(void)\n{\n    printf(\"findfunc.exe: Starting.\\n\");\n    fflush(stdout);\n\n    printf(\"DLLs:\\n\");\n    for (HMODULE hModule = NULL; (hModule = DetourEnumerateModules(hModule)) != NULL;) {\n        CHAR szName[MAX_PATH] = { 0 };\n        GetModuleFileNameA(hModule, szName, sizeof(szName) - 1);\n        printf(\"  %p: %s\\n\", hModule, szName);\n    }\n\n    DWORD dwCount = 10000;\n    for (int i = 0; i < 3; i++) {\n        printf(\"findfunc.exe: Calling (%ld).\\n\", dwCount);\n        dwCount = Target(dwCount) + 10000;\n    }\n    return 0;\n}\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/findfunc/symtest.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detour Test Program (symtest.cpp of symtest.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include <windows.h>\n#include <stdio.h>\n#pragma warning(push)\n#if _MSC_VER > 1400\n#pragma warning(disable:6102 6103) // /analyze warnings\n#endif\n#include <strsafe.h>\n#pragma warning(pop)\n#include <detours.h>\n#include \"target.h\"\n\n#if (_MSC_VER < 1299)\n#include <imagehlp.h>\ntypedef IMAGEHLP_MODULE IMAGEHLP_MODULE64;\ntypedef PIMAGEHLP_MODULE PIMAGEHLP_MODULE64;\ntypedef IMAGEHLP_SYMBOL SYMBOL_INFO;\ntypedef PIMAGEHLP_SYMBOL PSYMBOL_INFO;\n#else\n#pragma warning(push)\n#pragma warning(disable:4091) // empty typedef\n#include <dbghelp.h>\n#pragma warning(pop)\n#endif\n\n//////////////////////////////////////////////////////////////////////////////\n//\ntypedef LPAPI_VERSION (NTAPI *PF_ImagehlpApiVersionEx)(LPAPI_VERSION AppVersion);\n\ntypedef BOOL (NTAPI *PF_SymInitialize)(IN HANDLE hProcess,\n                                       IN LPCSTR UserSearchPath,\n                                       IN BOOL fInvadeProcess);\ntypedef DWORD (NTAPI *PF_SymSetOptions)(IN DWORD SymOptions);\ntypedef DWORD (NTAPI *PF_SymGetOptions)(VOID);\ntypedef DWORD64 (NTAPI *PF_SymLoadModule64)(IN HANDLE hProcess,\n                                            IN HANDLE hFile,\n                                            IN PSTR ImageName,\n                                            IN PSTR ModuleName,\n                                            IN DWORD64 BaseOfDll,\n                                            IN DWORD SizeOfDll);\ntypedef BOOL (NTAPI *PF_SymGetModuleInfo64)(IN HANDLE hProcess,\n                                            IN DWORD64 qwAddr,\n                                            OUT PIMAGEHLP_MODULE64 ModuleInfo);\ntypedef BOOL (NTAPI *PF_SymFromName)(IN HANDLE hProcess,\n                                     IN LPSTR Name,\n                                     OUT PSYMBOL_INFO Symbol);\n#if (_MSC_VER < 1299)\ntypedef BOOL (NTAPI *PF_SymRegisterCallback64)();\ntypedef BOOL (NTAPI *PF_SymEnumerateModules64)();\ntypedef BOOL (NTAPI *PF_SymEnumSymbols)();\n#else\ntypedef BOOL (NTAPI *PF_SymRegisterCallback64)(IN HANDLE hProcess,\n                                               IN PSYMBOL_REGISTERED_CALLBACK64\n                                               CallbackFunction,\n                                               IN ULONG64 UserContext);\ntypedef BOOL (NTAPI *PF_SymEnumerateModules64)(IN HANDLE hProcess,\n                                               IN PSYM_ENUMMODULES_CALLBACK64\n                                               EnumModulesCallback,\n                                               IN PVOID UserContext);\ntypedef BOOL (NTAPI *PF_SymEnumSymbols)(IN HANDLE hProcess,\n                                        IN ULONG64 BaseOfDll,\n                                        IN PCSTR Mask,\n                                        IN PSYM_ENUMERATESYMBOLS_CALLBACK\n                                        EnumSymbolsCallback,\n                                        IN PVOID UserContext);\n#endif\n\nPF_ImagehlpApiVersionEx     pfImagehlpApiVersionEx = NULL;\nPF_SymInitialize            pfSymInitialize = NULL;\nPF_SymSetOptions            pfSymSetOptions = NULL;\nPF_SymGetOptions            pfSymGetOptions = NULL;\nPF_SymLoadModule64          pfSymLoadModule64 = NULL;\nPF_SymGetModuleInfo64       pfSymGetModuleInfo64 = NULL;\nPF_SymFromName              pfSymFromName = NULL;\nPF_SymRegisterCallback64    pfSymRegisterCallback64 = NULL;\nPF_SymEnumerateModules64    pfSymEnumerateModules64 = NULL;\nPF_SymEnumSymbols           pfSymEnumSymbols = NULL;\n\n//////////////////////////////////////////////////////////////////////////////\n//\n\n#if (_MSC_VER > 1299)\nstatic BOOL WINAPI SymEnumerateCallback(\n                                        PCSTR pszModule,\n                                        DWORD64 base,\n                                        PVOID pvUserContext)\n{\n    (void)pvUserContext;\n    printf(\"  %p: %s\\n\", (PVOID)base, pszModule);\n    return TRUE;\n}\n\nstatic int nSymbolCount = 0;\nstatic BOOL WINAPI SymEnumerateSymbols(PSYMBOL_INFO pSym,\n                                       ULONG size,\n                                       PVOID pvUserContext)\n{\n    (void)size;\n    (void)pvUserContext;\n    if (strstr(pSym->Name, \"Target\") != NULL ||\n        strstr(pSym->Name, \"Hidden\") != NULL) {\n        printf(\"  %p: %s\\n\", (PVOID)pSym->Address, pSym->Name);\n        nSymbolCount++;\n    }\n    else if (nSymbolCount < 5) {\n        printf(\"  %p: %s\\n\", (PVOID)pSym->Address, pSym->Name);\n        nSymbolCount++;\n    }\n    return TRUE;\n}\n\nstatic void truncate(PCHAR data)\n{\n    size_t len = strlen(data);\n    if (len > 0 && data[len-1] == '\\r') {\n        data[--len] = '\\0';\n    }\n    if (len > 0 && data[len-1] == '\\n') {\n        data[--len] = '\\0';\n    }\n}\n\nBOOL WINAPI CallbackFunction(HANDLE hProcess, ULONG action, ULONG64 data, ULONG64 context)\n{\n    (void)context;\n\n    switch (action) {\n      case CBA_DEBUG_INFO:\n        truncate((PCHAR)data);\n        printf(\"::> %s\\n\", (PCHAR)data);\n        return TRUE;\n\n      case CBA_DEFERRED_SYMBOL_LOAD_CANCEL:\n        printf(\"::> proc=%p action=%08lx data=%p\\n\",\n                      (PVOID)hProcess,\n                      action,\n                      (PVOID)data);\n        {\n            PIMAGEHLP_DEFERRED_SYMBOL_LOAD64 pi = (PIMAGEHLP_DEFERRED_SYMBOL_LOAD64)data;\n            printf(\"pi->SizeOfStruct = %ld\\n\", pi->SizeOfStruct);\n            printf(\"pi->BaseOfImage  = %p\\n\", (PVOID)(size_t)pi->BaseOfImage);\n            printf(\"pi->CheckSum     = %8lx\\n\", pi->CheckSum);\n            printf(\"pi->FileName     = %p [%s]\\n\", pi->FileName, pi->FileName);\n            printf(\"pi->Reparse      = %d\\n\", pi->Reparse);\n        }\n        return FALSE;\n      default:\n        printf(\"::> proc=%p action=%08lx data=%p\\n\",\n                      (PVOID)hProcess,\n                      action,\n                      (PVOID)data);\n        return FALSE;\n    }\n}\n#endif\n\nint __cdecl main(void)\n{\n    printf(\"symtest.exe: Starting.\\n\");\n    fflush(stdout);\n\n    //////////////////////////////////////////////////////// Get the functions.\n    //\n    HMODULE hDbgHelp = LoadLibraryA(\"dbghelp.dll\");\n    if (hDbgHelp == NULL) {\n        printf(\"Couldn't load dbghelp.dll\");\n        return 1;\n    }\n\n    pfImagehlpApiVersionEx\n        = (PF_ImagehlpApiVersionEx)GetProcAddress(hDbgHelp,\n                                                  \"ImagehlpApiVersionEx\");\n    pfSymInitialize\n        = (PF_SymInitialize)GetProcAddress(hDbgHelp, \"SymInitialize\");\n    pfSymSetOptions\n        = (PF_SymSetOptions)GetProcAddress(hDbgHelp, \"SymSetOptions\");\n    pfSymGetOptions\n        = (PF_SymGetOptions)GetProcAddress(hDbgHelp, \"SymGetOptions\");\n    pfSymLoadModule64\n        = (PF_SymLoadModule64)GetProcAddress(hDbgHelp, \"SymLoadModule64\");\n    pfSymGetModuleInfo64\n        = (PF_SymGetModuleInfo64)GetProcAddress(hDbgHelp, \"SymGetModuleInfo64\");\n    pfSymFromName\n        = (PF_SymFromName)GetProcAddress(hDbgHelp, \"SymFromName\");\n    pfSymRegisterCallback64\n        = (PF_SymRegisterCallback64)GetProcAddress(hDbgHelp, \"SymRegisterCallback64\");\n    pfSymEnumerateModules64\n        = (PF_SymEnumerateModules64)GetProcAddress(hDbgHelp, \"SymEnumerateModules64\");\n    pfSymEnumSymbols\n        = (PF_SymEnumSymbols)GetProcAddress(hDbgHelp, \"SymEnumSymbols\");\n\n    //////////////////////////////////////////////////////////////////////////////\n    //\n    HANDLE hProcess = GetCurrentProcess();\n\n    API_VERSION av;\n    ZeroMemory(&av, sizeof(av));\n    av.MajorVersion = API_VERSION_NUMBER;\n\n    pfImagehlpApiVersionEx(&av);\n    printf(\"  Version: %d.%d (%d)\\n\",\n                  av.MajorVersion,\n                  av.MinorVersion,\n                  API_VERSION_NUMBER);\n\n    if (!pfSymInitialize(hProcess, NULL, FALSE)) {\n        printf(\"SymInitialize failed: %ld\\n\", GetLastError());\n        return 1;\n    }\n\n#if (_MSC_VER > 1299)\n    pfSymRegisterCallback64(hProcess, CallbackFunction, NULL);\n#endif\n\n    DWORD dw = pfSymGetOptions();\n    printf(\"GetOptions = %08lx\\n\", dw);\n    dw &= ~(SYMOPT_CASE_INSENSITIVE |\n            SYMOPT_UNDNAME |\n            SYMOPT_DEFERRED_LOADS |\n            0);\n    dw |= (\n#if defined(SYMOPT_EXACT_SYMBOLS)\n           SYMOPT_EXACT_SYMBOLS |\n#endif\n#if defined(SYMOPT_DEBUG)\n           SYMOPT_DEBUG |\n#endif\n#if defined(SYMOPT_NO_UNQUALIFIED_LOADS)\n           SYMOPT_NO_UNQUALIFIED_LOADS |\n#endif\n#if defined(SYMOPT_FAIL_CRITICAL_ERRORS)\n           SYMOPT_FAIL_CRITICAL_ERRORS |\n#endif\n#if defined(SYMOPT_INCLUDE_32BIT_MODULES)\n           SYMOPT_INCLUDE_32BIT_MODULES |\n#endif\n           0);\n    printf(\"SetOptions = %08lx\\n\", dw);\n    pfSymSetOptions(dw);\n\n    /////////////////////////////////////////////// First, try GetProcAddress.\n    //\n    PCHAR pszFile = \"target\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\";\n    HMODULE hModule = LoadLibraryA(pszFile);\n    if (hModule == NULL) {\n        printf(\"LoadLibraryA(%s) failed: %ld\\n\", pszFile, GetLastError());\n        return 2;\n    }\n\n    ////////////////////////////////////////////////////// Then try ImageHelp.\n    //\n#if (_MSC_VER > 1299)\n\n    //CHAR szFull[MAX_PATH];\n    //GetModuleFileNameA(hModule, szFull, sizeof(szFull));\n    printf(\"SymLoadModule64(%s) will be called.\\n\", pszFile /*szFull*/);\n    DWORD64 loaded = pfSymLoadModule64(hProcess, NULL,\n                                       (PCHAR)pszFile/*szFull*/, NULL,\n                                       (DWORD64)hModule, 0);\n    if (loaded == 0) {\n        printf(\"SymLoadModule64(%p) failed: %ld\\n\", hProcess, GetLastError());\n        printf(\"\\n\");\n    }\n    else {\n        printf(\"SymLoadModule64(%p) succeeded: 0x%p\\n\", hProcess, (PVOID)loaded);\n    }\n\n    CHAR szModName[512];\n\n    printf(\"Modules:\\n\");\n// The first parameter of PSYM_ENUMMODULES_CALLBACK64 changed from PSTR to PCSTR\n// between Windows 2003 and Windows 7. Cast here to work with either.\n    pfSymEnumerateModules64(hProcess, (PSYM_ENUMMODULES_CALLBACK64)SymEnumerateCallback, NULL);\n    printf(\"\\n\");\n\n    IMAGEHLP_MODULE64 modinfo;\n    ZeroMemory(&modinfo, sizeof(modinfo));\n    modinfo.SizeOfStruct = 512/*sizeof(modinfo)*/;\n    if (!pfSymGetModuleInfo64(hProcess, (DWORD64)hModule, &modinfo)) {\n        printf(\"SymGetModuleInfo64(%p, %p) [64] failed: %ld\\n\",\n                      hProcess, hModule, GetLastError());\n    }\n    else {\n        printf(\"SymGetModuleInfo64(%p, %p) [64] succeeded: %ld\\n\",\n                      hProcess, hModule, GetLastError());\n        StringCchCopyA(szModName, ARRAYSIZE(szModName), modinfo.ModuleName);\n        StringCchCatA(szModName, ARRAYSIZE(szModName), \"!\");\n\n        printf(\"NumSyms:         %ld\\n\", modinfo.NumSyms);\n        printf(\"SymType:         %d\\n\", modinfo.SymType);\n        printf(\"ModuleName:      %s\\n\", modinfo.ModuleName);\n        printf(\"ImageName:       %s\\n\", modinfo.ImageName);\n        printf(\"LoadedImageName: %s\\n\", modinfo.LoadedImageName);\n    }\n\n    printf(\"\\n\");\n    fflush(stdout);\n\n    printf(\"DLLs:\\n\");\n    for (hModule = NULL; (hModule = DetourEnumerateModules(hModule)) != NULL;) {\n        CHAR szName[MAX_PATH];\n        GetModuleFileNameA(hModule, szName, sizeof(szName));\n        printf(\"  %p: %s\\n\", hModule, szName);\n    }\n\n    if (pfSymEnumSymbols == NULL) {\n        printf(\"Couldn't find SymEnumSymbols.\\n\");\n    }\n    else {\n        printf(\"===Enum===\\n\");\n        SetLastError(0);\n        nSymbolCount = 0;\n        if (!pfSymEnumSymbols(hProcess, (DWORD64)hModule, NULL, SymEnumerateSymbols, NULL)) {\n            printf(\"SymEnumSymbols() failed: %ld\\n\",\n                          GetLastError());\n        }\n    }\n\n    // Look for specific symbols.\n    struct CFullSymbol : SYMBOL_INFO {\n        CHAR szRestOfName[MAX_SYM_NAME];\n    } symbol;\n    CHAR szFullName[512];\n\n    // Look for Target\n    StringCchCopyA(szFullName, ARRAYSIZE(szFullName), szModName);\n    StringCchCatA(szFullName, ARRAYSIZE(szFullName), \"Target\");\n    printf(\"Symbol: [%s]\\n\", szFullName);\n\n    ZeroMemory(&symbol, sizeof(symbol));\n    symbol.SizeOfStruct = sizeof(SYMBOL_INFO);\n#ifdef DBHLPAPI\n    symbol.MaxNameLen = MAX_SYM_NAME;\n#else\n    symbol.MaxNameLength = MAX_SYM_NAME;\n#endif\n\n    SetLastError(0);\n    if (!pfSymFromName(hProcess, szFullName, &symbol)) {\n        printf(\"--SymFromName(%s) failed: %ld\\n\", szFullName, GetLastError());\n    }\n    if (symbol.Address != 0) {\n        printf(\"--SymFromName(%s) succeeded\\n\", szFullName);\n    }\n\n    printf(\"%s => %p\\n\\n\", szFullName, (PBYTE)symbol.Address);\n\n    // Look for Hidden\n    StringCchCopyA(szFullName, ARRAYSIZE(szFullName), szModName);\n    StringCchCatA(szFullName, ARRAYSIZE(szFullName), \"Hidden\");\n    printf(\"Symbol: [%s]\\n\", szFullName);\n\n    ZeroMemory(&symbol, sizeof(symbol));\n    symbol.SizeOfStruct = sizeof(SYMBOL_INFO);\n#ifdef DBHLPAPI\n    symbol.MaxNameLen = MAX_SYM_NAME;\n#else\n    symbol.MaxNameLength = MAX_SYM_NAME;\n#endif\n\n    SetLastError(0);\n    if (!pfSymFromName(hProcess, szFullName, &symbol)) {\n        printf(\"--SymFromName(%s) failed: %ld\\n\", szFullName, GetLastError());\n    }\n    if (symbol.Address != 0) {\n        printf(\"--SymFromName(%s) succeeded\\n\", szFullName);\n    }\n\n    printf(\"%s => %p\\n\\n\", szFullName, (PBYTE)symbol.Address);\n#endif\n\n    // We call Target once to insure it is loaded.\n    Target(0);\n    return 0;\n}\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/findfunc/target.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detour Test Program (target.cpp of target.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include <stdio.h>\n#include <windows.h>\n#include \"target.h\"\n\nextern \"C\" DWORD WINAPI Hidden(DWORD dwCount)\n{\n    printf(\"target.dll:     Hidden(%ld) -> %ld.\\n\", dwCount, dwCount + 1);\n    return dwCount + 1;\n}\n\n// We use this point to ensure Hidden isn't inlined.\nstatic DWORD (WINAPI * SelfHidden)(DWORD dwCount) = Hidden;\n\nDWORD WINAPI Target(DWORD dwCount)\n{\n    printf(\"target.dll:   Target  (%ld) -> %ld.\\n\", dwCount, dwCount + 100);\n    dwCount = SelfHidden(dwCount + 100);\n    printf(\"target.dll:   Target  (.....) -> %ld.\\n\", dwCount);\n    return dwCount;\n}\n\nBOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)\n{\n    (void)hinst;\n    (void)dwReason;\n    (void)reserved;\n\n    return TRUE;\n}\n\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/findfunc/target.h",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detour Test Program (target.h of target.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#pragma once\n\nDWORD WINAPI Target(DWORD dwCount);\n\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/findfunc/target.rc",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Version information for target.rc.\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include \"detver.h\"\n\n#define VER_INTERNALNAME_STR        \"target\" DETOURS_STRINGIFY(DETOURS_BITS)\n#define VER_ORIGINALFILENAME_STR    \"target\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\"\n#define VER_FILEDESCRIPTION_STR     \"Detours Test Module\"\n#define VER_COMPANYNAME_STR         \"Microsoft Corporation\"\n\n#include \"common.ver\"\n"
  },
  {
    "path": "ext/detours/samples/impmunge/Makefile",
    "content": "##############################################################################\n##\n##  Makefile for Detours Test Programs.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\nLIBS=$(LIBS) kernel32.lib\n\nall: dirs \\\n    $(BIND)\\impmunge.exe    \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\impmunge.bsc\n!ENDIF\n\n##############################################################################\n\nclean:\n    -del *~ test.exe.* 2>nul\n    -del $(BIND)\\impmunge.* 2>nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\n##############################################################################\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\n$(OBJD)\\impmunge.obj : impmunge.cpp\n\n$(BIND)\\impmunge.exe : $(OBJD)\\impmunge.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb $(OBJD)\\impmunge.obj \\\n        /link $(LINKFLAGS) $(LIBS) imagehlp.lib /subsystem:console\n\n$(OBJD)\\impmunge.bsc : $(OBJD)\\impmunge.obj\n    bscmake /v /n /o $@ $(OBJD)\\impmunge.sbr\n\n##############################################################################\n\ntest: $(BIND)\\impmunge.exe\n    $(BIND)\\impmunge.exe /m /o:test.exe.1 $(BIND)\\impmunge.exe\n    $(BIND)\\impmunge.exe /m /l- /o:test.exe.2 test.exe.1\n    $(BIND)\\impmunge.exe /m /l- /o:test.exe.3 test.exe.2\n    $(BIND)\\impmunge.exe /m /l- /o:test.exe.4 test.exe.3\n    $(BIND)\\impmunge.exe /l test.exe.4\n    $(BIND)\\impmunge.exe /r /l- /o:test.exe.0 test.exe.4\n    $(BIND)\\impmunge.exe /l test.exe.0\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/impmunge/impmunge.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (impmunge.cpp of impmunge.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#include <stdio.h>\n#include <stdlib.h>\n#include <windows.h>\n#pragma warning(push)\n#if _MSC_VER > 1400\n#pragma warning(disable:6102 6103) // /analyze warnings\n#endif\n#include <strsafe.h>\n#include <detours.h>\n#pragma warning(disable:4091) // empty typedef\n#include <imagehlp.h>\n#pragma warning(pop)\n\n////////////////////////////////////////////////////////////// Error Messages.\n//\nVOID AssertMessage(PCSTR szMsg, PCSTR szFile, DWORD nLine)\n{\n    printf(\"ASSERT(%s) failed in %s, line %ld.\", szMsg, szFile, nLine);\n}\n\n#define ASSERT(x)   \\\ndo { if (!(x)) { AssertMessage(#x, __FILE__, __LINE__); DebugBreak(); }} while (0)\n    ;\n\n\n//////////////////////////////////////////////////////////////////////////////\n//\nstatic BOOLEAN s_fRestore = FALSE;\nstatic BOOLEAN s_fList = TRUE;\nstatic BOOLEAN s_fMunge = FALSE;\nstatic BOOLEAN s_fToSymbols = FALSE;\n\n//////////////////////////////////////////////////////////////////////////////\n//\nstatic BOOL CALLBACK ListByway(_In_opt_ PVOID pContext,\n                               _In_opt_ LPCSTR pszFile,\n                               _Outptr_result_maybenull_ LPCSTR *ppszOutFile)\n{\n    (void)pContext;\n    (void)ppszOutFile;\n\n    printf(\"  byway   -------------------------------- %s\\n\", pszFile ? pszFile : \"\");\n    return TRUE;\n}\n\nstatic BOOL CALLBACK ListFile(_In_opt_ PVOID pContext,\n                              _In_ LPCSTR pszOrigFile,\n                              _In_ LPCSTR pszFile,\n                              _Outptr_result_maybenull_ LPCSTR *ppszOutFile)\n{\n    (void)pContext;\n    (void)ppszOutFile;\n\n    printf(\"  file    %-32.32s %-32.32s\\n\",\n           pszOrigFile ? pszOrigFile : \"\",\n           pszFile ? pszFile : \"\");\n    return TRUE;\n}\n\nstatic BOOL CALLBACK ListSymbol(_In_opt_ PVOID pContext,\n                                _In_ ULONG nOrigOrdinal,\n                                _In_ ULONG nOrdinal,\n                                _Out_ ULONG *pnOutOrdinal,\n                                _In_opt_ LPCSTR pszOrigSymbol,\n                                _In_opt_ LPCSTR pszSymbol,\n                                _Outptr_result_maybenull_ LPCSTR *ppszOutSymbol)\n{\n    (void)pContext;\n    (void)pnOutOrdinal;\n    (void)ppszOutSymbol;\n\n    char szOrig[80];\n    char szLast[80];\n\n    if (pszOrigSymbol == NULL) {\n        StringCchPrintfA(szOrig, sizeof(szOrig), \"#%d\", nOrigOrdinal);\n        pszOrigSymbol = szOrig;\n    }\n    if (pszSymbol == NULL) {\n        StringCchPrintfA(szLast, sizeof(szLast), \"#%d\", nOrdinal);\n        pszSymbol = szLast;\n    }\n\n    printf(\"  symbol  %-32.32s %-32.32s\\n\", pszOrigSymbol, pszSymbol);\n    return TRUE;\n}\n\nstatic BOOL CALLBACK ListCommit(PVOID pContext)\n{\n    (void)pContext;\n\n    printf(\"  commit\\n\");\n    return TRUE;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nstruct MUNGE_STATE\n{\n    BOOL fLastWasByway;\n    LONG nBywayCount;\n    CHAR szBuffer[512];\n};\n\nstatic BOOL CALLBACK MungeByway(_In_opt_ PVOID pContext,\n                                _In_opt_ LPCSTR pszFile,\n                                _Outptr_result_maybenull_ LPCSTR *ppszOutFile)\n{\n    MUNGE_STATE *pState = (MUNGE_STATE *)pContext;\n\n    printf(\"|\");\n\n    if (pState->fLastWasByway) {\n        return TRUE;\n    }\n\n    pState->fLastWasByway = TRUE;\n\n    if (pszFile == NULL) {\n        StringCchPrintfA(pState->szBuffer, sizeof(pState->szBuffer), \"mb_munge_%d.dll\", pState->nBywayCount++);\n        *ppszOutFile = pState->szBuffer;\n    }\n    return TRUE;\n}\n\nstatic BOOL CALLBACK MungeFile(_In_opt_ PVOID pContext,\n                               _In_ LPCSTR pszOrigFile,\n                               _In_ LPCSTR pszFile,\n                               _Outptr_result_maybenull_ LPCSTR *ppszOutFile)\n{\n    (void)pszOrigFile;\n    MUNGE_STATE *pState = (MUNGE_STATE *)pContext;\n\n    pState->fLastWasByway = FALSE;\n\n    printf(\"*\");\n    StringCchPrintfA(pState->szBuffer, sizeof(pState->szBuffer), \"mf_%s\", pszFile);\n    *ppszOutFile = pState->szBuffer;\n    return TRUE;\n}\n\nstatic BOOL CALLBACK MungeSymbol(_In_opt_ PVOID pContext,\n                                 _In_ ULONG nOrigOrdinal,\n                                 _In_ ULONG nOrdinal,\n                                 _Out_ ULONG *pnOutOrdinal,\n                                 _In_opt_ LPCSTR pszOrigSymbol,\n                                 _In_opt_ LPCSTR pszSymbol,\n                                 _Outptr_result_maybenull_ LPCSTR *ppszOutSymbol)\n{\n    (void)nOrigOrdinal;\n    (void)pszOrigSymbol;\n    MUNGE_STATE *pState = (MUNGE_STATE *)pContext;\n\n    pState->fLastWasByway = FALSE;\n\n    printf(\".\");\n    if (nOrdinal != 0) {\n        if (s_fToSymbols) {\n            StringCchPrintfA(pState->szBuffer, sizeof(pState->szBuffer), \"mo_%d\", (int)nOrdinal);\n            *pnOutOrdinal = 0;\n            *ppszOutSymbol = pState->szBuffer;\n        }\n        else {\n            *pnOutOrdinal = 10000 + nOrdinal;\n            *ppszOutSymbol = NULL;\n        }\n    }\n    else {\n        StringCchPrintfA(pState->szBuffer, sizeof(pState->szBuffer), \"ms_%s\", pszSymbol);\n        *pnOutOrdinal = 0;\n        *ppszOutSymbol = pState->szBuffer;\n    }\n    return TRUE;\n}\n\nstatic BOOL CALLBACK MungeCommit(PVOID pContext)\n{\n    MUNGE_STATE *pState = (MUNGE_STATE *)pContext;\n\n    pState->fLastWasByway = FALSE;\n\n    printf(\"\\n\");\n    (void)pContext;\n    return TRUE;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nstatic BOOL CALLBACK RestoreByway(_In_opt_ PVOID pContext,\n                                  _In_opt_ LPCSTR pszFile,\n                                  _Outptr_result_maybenull_ LPCSTR *ppszOutFile)\n{\n    (void)pContext;\n    (void)pszFile;\n\n    *ppszOutFile = NULL;\n    return TRUE;\n}\n\nstatic BOOL CALLBACK RestoreFile(_In_opt_ PVOID pContext,\n                                 _In_ LPCSTR pszOrigFile,\n                                 _In_ LPCSTR pszFile,\n                                 _Outptr_result_maybenull_ LPCSTR *ppszOutFile)\n{\n    (void)pContext;\n    (void)pszFile;\n\n    *ppszOutFile = pszOrigFile;\n    return TRUE;\n}\n\nstatic BOOL CALLBACK RestoreSymbol(_In_opt_ PVOID pContext,\n                                   _In_ ULONG nOrigOrdinal,\n                                   _In_ ULONG nOrdinal,\n                                   _Out_ ULONG *pnOutOrdinal,\n                                   _In_opt_ LPCSTR pszOrigSymbol,\n                                   _In_opt_ LPCSTR pszSymbol,\n                                   _Outptr_result_maybenull_ LPCSTR *ppszOutSymbol)\n{\n    (void)pContext;\n    (void)nOrdinal;\n    (void)pszSymbol;\n\n    *pnOutOrdinal = nOrigOrdinal;\n    *ppszOutSymbol = pszOrigSymbol;\n    return TRUE;\n}\n\nstatic BOOL CALLBACK RestoreCommit(PVOID pContext)\n{\n    (void)pContext;\n    return TRUE;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\n\nBOOL EditFile(PCHAR pszInput, PCHAR pszOutput)\n{\n    BOOL fGood = TRUE;\n\n    HANDLE hOld = INVALID_HANDLE_VALUE;\n    HANDLE hNew = INVALID_HANDLE_VALUE;\n    PDETOUR_BINARY pBinary = NULL;\n\n    if (pszOutput != NULL) {\n        printf(\"%s -> %s:\\n\", pszInput, pszOutput);\n    }\n    else {\n        printf(\"%s:\\n\", pszInput);\n    }\n\n    hOld = CreateFileA(pszInput,\n                       GENERIC_READ,\n                       FILE_SHARE_READ,\n                       NULL,\n                       OPEN_EXISTING,\n                       FILE_ATTRIBUTE_NORMAL,\n                       NULL);\n\n    if (hOld == INVALID_HANDLE_VALUE) {\n        printf(\"Couldn't open input file: %s, error: %ld\\n\",\n               pszInput, GetLastError());\n        fGood = FALSE;\n        goto end;\n    }\n\n    if ((pBinary = DetourBinaryOpen(hOld)) == NULL) {\n        printf(\"DetourBinaryOpen failed: %ld\\n\", GetLastError());\n        goto end;\n    }\n\n    if (hOld != INVALID_HANDLE_VALUE) {\n        CloseHandle(hOld);\n        hOld = INVALID_HANDLE_VALUE;\n    }\n\n    if (s_fRestore) {\n        if (!DetourBinaryEditImports(pBinary,\n                                     NULL,\n                                     RestoreByway,\n                                     RestoreFile,\n                                     RestoreSymbol,\n                                     RestoreCommit)) {\n\n            printf(\"DetourBinaryEditImports for munge failed: %ld\\n\", GetLastError());\n        }\n    }\n\n    if (s_fMunge) {\n        MUNGE_STATE state;\n        state.fLastWasByway = FALSE;\n        state.nBywayCount = 1;\n\n        if (!DetourBinaryEditImports(pBinary,\n                                     &state,\n                                     MungeByway,\n                                     MungeFile,\n                                     MungeSymbol,\n                                     MungeCommit)) {\n\n            printf(\"DetourBinaryEditImports for munge failed: %ld\\n\", GetLastError());\n        }\n    }\n\n    if (s_fList) {\n        if (!DetourBinaryEditImports(pBinary,\n                                     NULL,\n                                     ListByway,\n                                     ListFile,\n                                     ListSymbol,\n                                     ListCommit)) {\n\n            printf(\"DetourBinaryEditImports for list failed: %ld\\n\", GetLastError());\n        }\n    }\n\n    if (pszOutput != NULL) {\n        hNew = CreateFileA(pszOutput,\n                           GENERIC_WRITE | GENERIC_READ, 0, NULL, CREATE_ALWAYS,\n                           FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);\n        if (hNew == INVALID_HANDLE_VALUE) {\n            printf(\"Couldn't open output file: %s, error: %ld\\n\",\n                   pszOutput, GetLastError());\n            fGood = FALSE;\n            goto end;\n        }\n\n        if (!DetourBinaryWrite(pBinary, hNew)) {\n            printf(\"DetourBinaryWrite failed: %ld\\n\", GetLastError());\n            fGood = FALSE;\n        }\n\n        CloseHandle(hNew);\n        hNew = INVALID_HANDLE_VALUE;\n    }\n\n    DetourBinaryClose(pBinary);\n    pBinary = NULL;\n\n\n    if (fGood && pszOutput != NULL) {\n        if (!BindImageEx(BIND_NO_BOUND_IMPORTS, pszOutput, \".\", \".\", NULL)) {\n            printf(\"Warning: Couldn't bind binary %s: %ld\\n\", pszOutput, GetLastError());\n        }\n    }\n\n  end:\n    if (pBinary) {\n        DetourBinaryClose(pBinary);\n        pBinary = NULL;\n    }\n    if (hNew != INVALID_HANDLE_VALUE) {\n        CloseHandle(hNew);\n        hNew = INVALID_HANDLE_VALUE;\n    }\n    if (hOld != INVALID_HANDLE_VALUE) {\n        CloseHandle(hOld);\n        hOld = INVALID_HANDLE_VALUE;\n    }\n    return fGood;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nvoid PrintUsage(void)\n{\n    printf(\"Usage:\\n\"\n           \"    impmunge [options] binary_files\\n\"\n           \"Options:\\n\"\n           \"    /l           : List imports.\\n\"\n           \"    /l-          : Don't list imports.\\n\"\n           \"    /m           : Munge imports.\\n\"\n           \"    /r           : Remove import munges.\\n\"\n           \"    /o:file      : Set name of output file; must be include with /m or /r.\\n\"\n           \"    /?           : This help screen.\\n\");\n}\n\n//////////////////////////////////////////////////////////////////////// main.\n//\nint CDECL main(int argc, char **argv)\n{\n    BOOL fNeedHelp = FALSE;\n    PCHAR pszOutput = NULL;\n\n    int arg = 1;\n    for (; arg < argc && !fNeedHelp; arg++) {\n        if (argv[arg][0] == '-' || argv[arg][0] == '/') {\n            CHAR *argn = argv[arg] + 1;\n            CHAR *argp = argn;\n            while (*argp && *argp != ':')\n                argp++;\n            if (*argp == ':')\n                *argp++ = '\\0';\n\n            switch (argn[0]) {\n\n              case 'l':                                 // List contents of import table.\n              case 'L':\n                s_fList = (argn[1] != '-');\n                break;\n\n              case 'm':                                 // Munge import table.\n              case 'M':\n                s_fMunge = (argn[1] != '-');\n                break;\n\n              case 'o':                                 // Set output file name.\n              case 'O':\n                pszOutput = argp;\n                break;\n              case 'r':                                 // Restore file to unmunged state.\n              case 'R':\n                s_fRestore = (argn[1] != '-');\n                break;\n\n              case 's':                                 // Munge ordinals to symbols\n              case 'S':\n                s_fToSymbols = true;\n                break;\n\n              case '?':                                 // Help\n                fNeedHelp = TRUE;\n                break;\n\n              default:\n                fNeedHelp = TRUE;\n                printf(\"Bad argument: %s:%s\\n\", argn, argp);\n                break;\n            }\n        }\n        else {\n            if (!s_fList && !s_fMunge && !s_fRestore) {\n                fNeedHelp = TRUE;\n                break;\n            }\n            if (pszOutput == NULL && (s_fMunge || s_fRestore)) {\n                fNeedHelp = TRUE;\n                break;\n            }\n\n            EditFile(argv[arg], pszOutput);\n            pszOutput = NULL;\n        }\n    }\n    if (argc == 1) {\n        fNeedHelp = TRUE;\n    }\n    if (fNeedHelp) {\n        PrintUsage();\n        return 1;\n    }\n    return 0;\n}\n\n// End of File\n"
  },
  {
    "path": "ext/detours/samples/member/Makefile",
    "content": "##############################################################################\n##\n##  Makefile for Detours Test Programs.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\nLIBS=$(LIBS) kernel32.lib\n\nall: dirs \\\n    $(BIND)\\member.exe \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\member.bsc\n!ENDIF\n\nclean:\n    -del *~ 2> nul\n    -del $(BIND)\\member.* 2> nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\n$(OBJD)\\member.obj : member.cpp\n\n$(BIND)\\member.exe : $(OBJD)\\member.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb $(OBJD)\\member.obj \\\n        /link $(LINKFLAGS) $(LIBS) /subsystem:console\n\n$(OBJD)\\member.bsc : $(OBJD)\\member.obj\n    bscmake /v /n /o $@ $(OBJD)\\member.sbr\n\n##############################################################################\n\ntest: $(BIND)\\member.exe\n    @echo.\n    $(BIND)\\member.exe\n    @echo.\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/member/member.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Test a detour of a member function (member.cpp of member.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n//  By default, C++ member functions use the __thiscall calling convention.\n//  In order to Detour a member function, both the trampoline and the detour\n//  must have exactly the same calling convention as the target function.\n//  Unfortunately, the VC compiler does not support a __thiscall, so the only\n//  way to create legal detour and trampoline functions is by making them\n//  class members of a \"detour\" class.\n//\n//  In addition, C++ does not support converting a pointer to a member\n//  function to an arbitrary pointer.  To get a raw pointer, the address of\n//  the member function must be moved into a temporary member-function\n//  pointer, then passed by taking it's address, then de-referencing it.\n//  Fortunately, the compiler will optimize the code to remove the extra\n//  pointer operations.\n//\n//  If X::Target is a virtual function, the following code will *NOT* work\n//  because &X::Target is the address of a thunk that does a virtual call,\n//  not the real address of the X::Target.  You can get the real address\n//  of X::Target by looking directly in the VTBL for class X, but there\n//  is no legal way to 1) get the address of X's VTBL or 2) get the offset\n//  of ::Target within that VTBL.  You can of course, figure these out for\n//  a particular class and function, but there is no general way to do so.\n//\n#include <stdio.h>\n\n#include <windows.h>\n#include <detours.h>\n\n#include \"..\\slept\\verify.cpp\"\n\n//////////////////////////////////////////////////////////////// Target Class.\n//\nclass CMember\n{\n  public:\n    void Target(void);\n};\n\nvoid CMember::Target(void)\n{\n    printf(\"  CMember::Target!   (this:%p)\\n\", this);\n}\n\n//////////////////////////////////////////////////////////////// Detour Class.\n//\nclass CDetour /* add \": public CMember\" to enable access to member variables... */\n{\n  public:\n    void Mine_Target(void);\n    static void (CDetour::* Real_Target)(void);\n\n    // Class shouldn't have any member variables or virtual functions.\n};\n\nvoid CDetour::Mine_Target(void)\n{\n    printf(\"  CDetour::Mine_Target! (this:%p)\\n\", this);\n    (this->*Real_Target)();\n}\n\nvoid (CDetour::* CDetour::Real_Target)(void) = (void (CDetour::*)(void))&CMember::Target;\n\n//////////////////////////////////////////////////////////////////////////////\n//\nint main(int argc, char **argv)\n{\n    (void)argc;\n    (void)argv;\n\n    //////////////////////////////////////////////////////////////////////////\n    //\n\n    void (CMember::* pfTarget)(void) = &CMember::Target;\n    void (CDetour::* pfMine)(void) = &CDetour::Mine_Target;\n\n    Verify(\"CMember::Target      \", *(PBYTE*)&pfTarget);\n    Verify(\"*CDetour::Real_Target\", *(PBYTE*)&CDetour::Real_Target);\n    Verify(\"CDetour::Mine_Target \", *(PBYTE*)&pfMine);\n\n    printf(\"\\n\");\n\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n\n    DetourAttach(&(PVOID&)CDetour::Real_Target,\n                 *(PBYTE*)&pfMine);\n\n    LONG l = DetourTransactionCommit();\n    printf(\"DetourTransactionCommit = %ld\\n\", l);\n    printf(\"\\n\");\n\n    Verify(\"CMember::Target      \", *(PBYTE*)&pfTarget);\n    Verify(\"*CDetour::Real_Target\", *(&(PBYTE&)CDetour::Real_Target));\n    Verify(\"CDetour::Mine_Target \", *(PBYTE*)&pfMine);\n    printf(\"\\n\");\n\n    //////////////////////////////////////////////////////////////////////////\n    //\n    CMember target;\n\n    printf(\"Calling CMember (w/o Detour):\\n\");\n    (((CDetour*)&target)->*CDetour::Real_Target)();\n\n    printf(\"Calling CMember (will be detoured):\\n\");\n    target.Target();\n\n    return 0;\n}\n\n"
  },
  {
    "path": "ext/detours/samples/opengl/Makefile",
    "content": "######################################################################\n##\n##  Hook test for glFinish\n##\n\n!include ..\\common.mak\n\nLIBS=$(LIBS) kernel32.lib gdi32.lib\n\n##############################################################################\n\nall: dirs \\\n    $(BIND)\\ogldet$(DETOURS_BITS).dll \\\n    $(BIND)\\testogl.exe \\\n    \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\ogldet$(DETOURS_BITS).bsc \\\n    $(OBJD)\\testogl.bsc \\\n!ENDIF\n    option\n\n##############################################################################\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\n$(OBJD)\\ogldet.obj : ogldet.cpp\n\n$(OBJD)\\ogldet.res : ogldet.rc\n\n$(BIND)\\ogldet$(DETOURS_BITS).dll $(BIND)\\ogldet$(DETOURS_BITS).lib: \\\n        $(OBJD)\\ogldet.obj $(OBJD)\\ogldet.res $(DEPS)\n    cl /LD $(CFLAGS) /Fe$(@R).dll /Fd$(@R).pdb \\\n        $(OBJD)\\ogldet.obj $(OBJD)\\ogldet.res \\\n        /link $(LINKFLAGS) /subsystem:console \\\n        /export:DetourFinishHelperProcess,@1,NONAME \\\n        /export:hookedGlFinish \\\n        $(LIBS) opengl32.lib\n\n$(OBJD)\\ogldet$(DETOURS_BITS).bsc : $(OBJD)\\ogldet.obj\n    bscmake /v /n /o $@ $(OBJD)\\ogldet.sbr\n\n$(OBJD)\\testogl.obj : testogl.cpp\n\n$(BIND)\\testogl.exe : $(OBJD)\\testogl.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb $(OBJD)\\testogl.obj \\\n        /link $(LINKFLAGS) $(LIBS) opengl32.lib \\\n        /subsystem:console\n\n$(OBJD)\\testogl.bsc : $(OBJD)\\testogl.obj\n    bscmake /v /n /o $@ $(OBJD)\\testogl.sbr\n\n##############################################################################\n\nclean:\n    -del *~ 2>nul\n    -del $(BIND)\\ogldet*.* 2>nul\n    -del $(BIND)\\testogl.* 2>nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\n############################################### Install non-bit-size binaries.\n\n!IF \"$(DETOURS_OPTION_PROCESSOR)\" != \"\"\n\n$(OPTD)\\olgdet$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\olgdet$(DETOURS_OPTION_BITS).pdb:\n\n$(BIND)\\olgdet$(DETOURS_OPTION_BITS).dll : $(OPTD)\\olgdet$(DETOURS_OPTION_BITS).dll\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\olgdet$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\olgdet$(DETOURS_OPTION_BITS).pdb\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n\noption: \\\n    $(BIND)\\olgdet$(DETOURS_OPTION_BITS).dll \\\n    $(BIND)\\olgdet$(DETOURS_OPTION_BITS).pdb \\\n\n!ELSE\n\noption:\n\n!ENDIF\n\n##############################################################################\n\ntest: all\n    @echo -------- Reseting test binaries to initial state. ---------------------\n    $(BIND)\\setdll.exe -r $(BIND)\\testogl.exe\n    @echo.\n    @echo -------- Should not load ogldet$(DETOURS_BITS).dll -----------------------------------\n    $(BIND)\\testogl.exe\n    @echo.\n    @echo -------- Adding ogldet$(DETOURS_BITS).dll to testogl.exe ------------------------------\n    $(BIND)\\setdll.exe -d:$(BIND)\\ogldet$(DETOURS_BITS).dll $(BIND)\\testogl.exe\n    @echo.\n    @echo -------- Should load ogldet$(DETOURS_BITS).dll statically ----------------------------\n    $(BIND)\\testogl.exe\n    @echo.\n    @echo -------- Removing ogldet$(DETOURS_BITS).dll from testogl.exe --------------------------\n    $(BIND)\\setdll.exe -r $(BIND)\\testogl.exe\n    @echo.\n    @echo -------- Should not load ogldet$(DETOURS_BITS).dll -----------------------------------\n    $(BIND)\\testogl.exe\n    @echo.\n    @echo -------- Should load ogldet$(DETOURS_BITS).dll dynamically using withdll.exe----------\n    $(BIND)\\withdll.exe -d:$(BIND)\\ogldet$(DETOURS_BITS).dll $(BIND)\\testogl.exe\n    @echo.\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/opengl/ogldet.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Module:     ogldet.dll\n//\n//  This DLL is based on the sample simple.dll. A detour is inserted for\n//  the OpenGL glFinish function.\n//\n#include <stdio.h>\n#include <windows.h>\n#include <GL/gl.h>\n#include \"detours.h\"\n\nstatic void (WINAPI * trueGlFinish)(void) = glFinish;\n\nvoid WINAPI hookedGlFinish(void)\n{\n    printf(\"ogldet\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll:\"\n           \" hookedGlFinish Starting.\\n\");\n    fflush(stdout);\n\n    trueGlFinish();\n\n    printf(\"ogldet\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll:\"\n           \" hookedGlFinish done.\\n\");\n    fflush(stdout);\n}\n\nBOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)\n{\n    LONG error;\n    (void)hinst;\n    (void)reserved;\n\n    if (DetourIsHelperProcess()) {\n        return TRUE;\n    }\n\n    if (dwReason == DLL_PROCESS_ATTACH) {\n        DetourRestoreAfterWith();\n\n        printf(\"ogldet\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll:\"\n               \" Starting.\\n\");\n        fflush(stdout);\n\n        DetourTransactionBegin();\n        DetourUpdateThread(GetCurrentThread());\n        DetourAttach(&(PVOID&)trueGlFinish, hookedGlFinish);\n        error = DetourTransactionCommit();\n\n        if (error == NO_ERROR) {\n            printf(\"ogldet\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll:\"\n                   \" Detoured glFinish().\\n\");\n        }\n        else {\n            printf(\"ogldet\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll:\"\n                   \" Error detouring glFinish(): %d\\n\", error);\n        }\n    }\n    else if (dwReason == DLL_PROCESS_DETACH) {\n        DetourTransactionBegin();\n        DetourUpdateThread(GetCurrentThread());\n        DetourDetach(&(PVOID&)trueGlFinish, hookedGlFinish);\n        error = DetourTransactionCommit();\n\n        printf(\"ogldet\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll:\"\n               \" Removed detour glFinish() (result=%d)\\n\", error);\n        fflush(stdout);\n    }\n\n    return TRUE;\n}\n\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/opengl/ogldet.rc",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Version information for ogldet.rc.\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include \"detver.h\"\n\n#define VER_INTERNALNAME_STR        \"ogldet\" DETOURS_STRINGIFY(DETOURS_BITS)\n#define VER_ORIGINALFILENAME_STR    \"ogldet\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\"\n#define VER_FILEDESCRIPTION_STR     \"Detours Open GL Test Module\"\n#define VER_COMPANYNAME_STR         \"Microsoft Corporation\"\n\n#include \"common.ver\"\n"
  },
  {
    "path": "ext/detours/samples/opengl/testogl.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  File:       testogl.cpp\n//  Module:     testogl.exe (oglsimple.dll)\n//\n\n#include <windows.h>\n#include <stdio.h>\n#include <GL/gl.h>\n\nint __cdecl main()\n{\n    printf(\"testogl.exe: Starting\\n\");\n    fflush(stdout);\n\n    glFinish();\n\n    printf(\"testogl.exe: done\\n\");\n    fflush(stdout);\n\n    return 0;\n}\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/region/Makefile",
    "content": "##############################################################################\n##\n##  Makefile for Detours Test Programs.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\nLIBS=$(LIBS) kernel32.lib\n\nall: dirs \\\n    $(BIND)\\region.exe \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\region.bsc\n!ENDIF\n\nclean:\n    -del *~ 2> nul\n    -del $(BIND)\\region.* 2> nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\n$(OBJD)\\region.obj : region.cpp\n\n$(BIND)\\region.exe : $(OBJD)\\region.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb $(OBJD)\\region.obj \\\n        /link $(LINKFLAGS) $(LIBS) /subsystem:console\n\n$(OBJD)\\region.bsc : $(OBJD)\\region.obj\n    bscmake /v /n /o $@ $(OBJD)\\region.sbr\n\n##############################################################################\n\ntest: $(BIND)\\region.exe\n    @echo.\n    $(BIND)\\region.exe\n    @echo.\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/region/region.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Test the different system region bounds (region.cpp of region.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#include <stdio.h>\n\n#include <windows.h>\n#include <detours.h>\n\n//////////////////////////////////////////////////////////////////////////////\n//\nstatic DWORD (WINAPI * TrueSleepEx)(DWORD dwMilliseconds, BOOL bAlertable) = SleepEx;\n\nDWORD WINAPI LoudSleepEx(DWORD dwMilliseconds, BOOL bAlertable)\n{\n    DWORD dwBeg = GetTickCount();\n    DWORD ret = TrueSleepEx(dwMilliseconds, bAlertable);\n    DWORD dwEnd = GetTickCount();\n\n    printf(\"Slept %lu ticks.\\n\", dwEnd - dwBeg);\n    return ret;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nPVOID AttachAndDetach(DWORD dwMilliseconds)\n{\n    LONG error;\n    PVOID trampoline;\n\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n    DetourAttach(&(PVOID&)TrueSleepEx, LoudSleepEx);\n    error = DetourTransactionCommit();\n\n    printf(\"Attach: %ld, Trampoline: %p\\n\", error, TrueSleepEx);\n\n    trampoline = TrueSleepEx;\n\n    printf(\"\\n\");\n    printf(\"Sleep(%lu)\\n\", dwMilliseconds);\n    Sleep(dwMilliseconds);\n    printf(\"\\n\");\n\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n    DetourDetach(&(PVOID&)TrueSleepEx, LoudSleepEx);\n    error = DetourTransactionCommit();\n\n    return trampoline;\n}\n\nint main(int argc, char **argv)\n{\n    (void)argc;\n    (void)argv;\n\n    // First, save the default system region.\n\n    PVOID pDefaultLower = DetourSetSystemRegionLowerBound(NULL);\n    PVOID pDefaultUpper = DetourSetSystemRegionUpperBound(NULL);\n\n    // Now attach the detour with the default system region.\n\n    DetourSetSystemRegionLowerBound(pDefaultLower);\n    DetourSetSystemRegionUpperBound(pDefaultUpper);\n\n    printf(\"%p..%p: \", pDefaultLower, pDefaultUpper);\n    PVOID pTramp1 = AttachAndDetach(10);\n\n    printf(\"%p..%p: \", pDefaultLower, pDefaultUpper);\n    PVOID pTramp2 = AttachAndDetach(10);\n\n    // Now attach the detour with a smaller system region.\n\n    PVOID pSmallerLower = (PVOID)( ((ULONG_PTR)pTramp1) & ~(ULONG_PTR)0x3fffffff );\n    PVOID pSmallerUpper = (PVOID)( ((ULONG_PTR)pTramp1 + 0x3fffffff) & ~(ULONG_PTR)0x3fffffff );\n\n    DetourSetSystemRegionLowerBound(pSmallerLower);\n    DetourSetSystemRegionUpperBound(pSmallerUpper);\n\n    printf(\"%p..%p: \", pSmallerLower, pSmallerUpper);\n    PVOID pTramp3 = AttachAndDetach(20);\n\n    printf(\"Sleep(30)\\n\");\n    Sleep(30);\n    printf(\"\\n\");\n\n    if (pTramp1 != pTramp2) {\n        printf(\"!!!!!! Trampoling allocation is not deterministic.  %p != %p\\n\", pTramp1, pTramp2);\n        return 1;\n    }\n    else if (pTramp2 == pTramp3) {\n        printf(\"!!!!!! Trampoling allocation doesn't skip region.  %p == %p\\n\", pTramp2, pTramp3);\n        return 2;\n    }\n\n    return 0;\n}\n\n"
  },
  {
    "path": "ext/detours/samples/setdll/Makefile",
    "content": "##############################################################################\n##\n##  Makefile for Detours Test Programs.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\nLIBS=$(LIBS) kernel32.lib\n\nall: dirs \\\n    $(BIND)\\setdll.exe \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\setdll.bsc \\\n!ENDIF\n\toption\n\n##############################################################################\n\nclean:\n    -del *~ 2>nul\n    -del $(BIND)\\setdll.* 2>nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\n##############################################################################\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\n$(OBJD)\\setdll.obj : setdll.cpp\n\n$(BIND)\\setdll.exe : $(OBJD)\\setdll.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb $(OBJD)\\setdll.obj \\\n        /link $(LINKFLAGS) $(LIBS) /subsystem:console\n\n$(OBJD)\\setdll.bsc : $(OBJD)\\setdll.obj\n    bscmake /v /n /o $@ $(OBJD)\\setdll.sbr\n\n############################################### Install non-bit-size binaries.\n\noption:\n\n##############################################################################\n\ntest: all\n    @echo -------- Reseting test binaries to initial state. -----------------------\n    $(BIND)\\setdll.exe -d:$(BIND)\\slept$(DETOURS_BITS).dll $(BIND)\\sleepold.exe\n    @echo -------- Should load slept$(DETOURS_BITS).dll statically -------------------------------\n    $(BIND)\\sleepold.exe\n    @echo -------- Reseting test binaries to initial state. -----------------------\n    $(BIND)\\setdll.exe -r $(BIND)\\sleepold.exe\n    @echo -------- Should not load slept$(DETOURS_BITS).dll --------------------------------------\n    $(BIND)\\sleepold.exe\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/setdll/setdll.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (setdll.cpp of setdll.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#include <stdio.h>\n#include <stdlib.h>\n#include <windows.h>\n#include <shellapi.h>\n#include <detours.h>\n#pragma warning(push)\n#if _MSC_VER > 1400\n#pragma warning(disable:6102 6103) // /analyze warnings\n#endif\n#include <strsafe.h>\n#pragma warning(pop)\n\n////////////////////////////////////////////////////////////// Error Messages.\n//\nVOID AssertMessage(PCSTR szMsg, PCSTR szFile, DWORD nLine)\n{\n    printf(\"ASSERT(%s) failed in %s, line %ld.\", szMsg, szFile, nLine);\n}\n\n#define ASSERT(x)   \\\ndo { if (!(x)) { AssertMessage(#x, __FILE__, __LINE__); DebugBreak(); }} while (0)\n    ;\n\n\n//////////////////////////////////////////////////////////////////////////////\n//\nstatic BOOLEAN  s_fRemove = FALSE;\nstatic CHAR     s_szDllPath[MAX_PATH] = \"\";\n\n//////////////////////////////////////////////////////////////////////////////\n//\n//  This code verifies that the named DLL has been configured correctly\n//  to be imported into the target process.  DLLs must export a function with\n//  ordinal #1 so that the import table touch-up magic works.\n//\nstatic BOOL CALLBACK ExportCallback(_In_opt_ PVOID pContext,\n                                    _In_ ULONG nOrdinal,\n                                    _In_opt_ LPCSTR pszName,\n                                    _In_opt_ PVOID pCode)\n{\n    (void)pContext;\n    (void)pCode;\n    (void)pszName;\n\n    if (nOrdinal == 1) {\n        *((BOOL *)pContext) = TRUE;\n    }\n    return TRUE;\n}\n\nBOOL DoesDllExportOrdinal1(PCHAR pszDllPath)\n{\n    HMODULE hDll = LoadLibraryExA(pszDllPath, NULL, DONT_RESOLVE_DLL_REFERENCES);\n    if (hDll == NULL) {\n        printf(\"setdll.exe: LoadLibraryEx(%s) failed with error %ld.\\n\",\n               pszDllPath,\n               GetLastError());\n        return FALSE;\n    }\n\n    BOOL validFlag = FALSE;\n    DetourEnumerateExports(hDll, &validFlag, ExportCallback);\n    FreeLibrary(hDll);\n    return validFlag;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nstatic BOOL CALLBACK ListBywayCallback(_In_opt_ PVOID pContext,\n                                       _In_opt_ LPCSTR pszFile,\n                                       _Outptr_result_maybenull_ LPCSTR *ppszOutFile)\n{\n    (void)pContext;\n\n    *ppszOutFile = pszFile;\n    if (pszFile) {\n        printf(\"    %s\\n\", pszFile);\n    }\n    return TRUE;\n}\n\nstatic BOOL CALLBACK ListFileCallback(_In_opt_ PVOID pContext,\n                                      _In_ LPCSTR pszOrigFile,\n                                      _In_ LPCSTR pszFile,\n                                      _Outptr_result_maybenull_ LPCSTR *ppszOutFile)\n{\n    (void)pContext;\n\n    *ppszOutFile = pszFile;\n    printf(\"    %s -> %s\\n\", pszOrigFile, pszFile);\n    return TRUE;\n}\n\nstatic BOOL CALLBACK AddBywayCallback(_In_opt_ PVOID pContext,\n                                      _In_opt_ LPCSTR pszFile,\n                                      _Outptr_result_maybenull_ LPCSTR *ppszOutFile)\n{\n    PBOOL pbAddedDll = (PBOOL)pContext;\n    if (!pszFile && !*pbAddedDll) {                     // Add new byway.\n        *pbAddedDll = TRUE;\n        *ppszOutFile = s_szDllPath;\n    }\n    return TRUE;\n}\n\nBOOL SetFile(PCHAR pszPath)\n{\n    BOOL bGood = TRUE;\n    HANDLE hOld = INVALID_HANDLE_VALUE;\n    HANDLE hNew = INVALID_HANDLE_VALUE;\n    PDETOUR_BINARY pBinary = NULL;\n\n    CHAR szOrg[MAX_PATH];\n    CHAR szNew[MAX_PATH];\n    CHAR szOld[MAX_PATH];\n\n    szOld[0] = '\\0';\n    szNew[0] = '\\0';\n\n    StringCchCopyA(szOrg, sizeof(szOrg), pszPath);\n    StringCchCopyA(szNew, sizeof(szNew), szOrg);\n    StringCchCatA(szNew, sizeof(szNew), \"#\");\n    StringCchCopyA(szOld, sizeof(szOld), szOrg);\n    StringCchCatA(szOld, sizeof(szOld), \"~\");\n    printf(\"  %s:\\n\", pszPath);\n\n    hOld = CreateFileA(szOrg,\n                       GENERIC_READ,\n                       FILE_SHARE_READ,\n                       NULL,\n                       OPEN_EXISTING,\n                       FILE_ATTRIBUTE_NORMAL,\n                       NULL);\n\n    if (hOld == INVALID_HANDLE_VALUE) {\n        printf(\"Couldn't open input file: %s, error: %ld\\n\",\n               szOrg, GetLastError());\n        bGood = FALSE;\n        goto end;\n    }\n\n    hNew = CreateFileA(szNew,\n                       GENERIC_WRITE | GENERIC_READ, 0, NULL, CREATE_ALWAYS,\n                       FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);\n    if (hNew == INVALID_HANDLE_VALUE) {\n        printf(\"Couldn't open output file: %s, error: %ld\\n\",\n               szNew, GetLastError());\n        bGood = FALSE;\n        goto end;\n    }\n\n    if ((pBinary = DetourBinaryOpen(hOld)) == NULL) {\n        printf(\"DetourBinaryOpen failed: %ld\\n\", GetLastError());\n        goto end;\n    }\n\n    if (hOld != INVALID_HANDLE_VALUE) {\n        CloseHandle(hOld);\n        hOld = INVALID_HANDLE_VALUE;\n    }\n\n    {\n        BOOL bAddedDll = FALSE;\n\n        DetourBinaryResetImports(pBinary);\n\n        if (!s_fRemove) {\n            if (!DetourBinaryEditImports(pBinary,\n                                         &bAddedDll,\n                                         AddBywayCallback, NULL, NULL, NULL)) {\n                printf(\"DetourBinaryEditImports failed: %ld\\n\", GetLastError());\n            }\n        }\n\n        if (!DetourBinaryEditImports(pBinary, NULL,\n                                     ListBywayCallback, ListFileCallback,\n                                     NULL, NULL)) {\n\n            printf(\"DetourBinaryEditImports failed: %ld\\n\", GetLastError());\n        }\n\n        if (!DetourBinaryWrite(pBinary, hNew)) {\n            printf(\"DetourBinaryWrite failed: %ld\\n\", GetLastError());\n            bGood = FALSE;\n        }\n\n        DetourBinaryClose(pBinary);\n        pBinary = NULL;\n\n        if (hNew != INVALID_HANDLE_VALUE) {\n            CloseHandle(hNew);\n            hNew = INVALID_HANDLE_VALUE;\n        }\n\n        if (bGood) {\n            if (!DeleteFileA(szOld)) {\n                DWORD dwError = GetLastError();\n                if (dwError != ERROR_FILE_NOT_FOUND) {\n                    printf(\"Warning: Couldn't delete %s: %ld\\n\", szOld, dwError);\n                    bGood = FALSE;\n                }\n            }\n            if (!MoveFileA(szOrg, szOld)) {\n                printf(\"Error: Couldn't back up %s to %s: %ld\\n\",\n                       szOrg, szOld, GetLastError());\n                bGood = FALSE;\n            }\n            if (!MoveFileA(szNew, szOrg)) {\n                printf(\"Error: Couldn't install %s as %s: %ld\\n\",\n                       szNew, szOrg, GetLastError());\n                bGood = FALSE;\n            }\n        }\n\n        DeleteFileA(szNew);\n    }\n\n\n  end:\n    if (pBinary) {\n        DetourBinaryClose(pBinary);\n        pBinary = NULL;\n    }\n    if (hNew != INVALID_HANDLE_VALUE) {\n        CloseHandle(hNew);\n        hNew = INVALID_HANDLE_VALUE;\n    }\n    if (hOld != INVALID_HANDLE_VALUE) {\n        CloseHandle(hOld);\n        hOld = INVALID_HANDLE_VALUE;\n    }\n    return bGood;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nvoid PrintUsage(void)\n{\n    printf(\"Usage:\\n\"\n           \"    setdll [options] binary_files\\n\"\n           \"Options:\\n\"\n           \"    /d:file.dll  : Add file.dll binary files\\n\"\n           \"    /r           : Remove extra DLLs from binary files\\n\"\n           \"    /?           : This help screen.\\n\");\n}\n\n//////////////////////////////////////////////////////////////////////// main.\n//\nint CDECL main(int argc, char **argv)\n{\n    BOOL fNeedHelp = FALSE;\n    PCHAR pszFilePart = NULL;\n\n    int arg = 1;\n    for (; arg < argc; arg++) {\n        if (argv[arg][0] == '-' || argv[arg][0] == '/') {\n            CHAR *argn = argv[arg] + 1;\n            CHAR *argp = argn;\n            while (*argp && *argp != ':' && *argp != '=')\n                argp++;\n            if (*argp == ':' || *argp == '=')\n                *argp++ = '\\0';\n\n            switch (argn[0]) {\n\n              case 'd':                                 // Set DLL\n              case 'D':\n                if ((strchr(argp, ':') != NULL || strchr(argp, '\\\\') != NULL) &&\n                    GetFullPathNameA(argp, sizeof(s_szDllPath), s_szDllPath, &pszFilePart)) {\n                }\n                else {\n                    StringCchPrintfA(s_szDllPath, sizeof(s_szDllPath), \"%s\", argp);\n                }\n                break;\n\n              case 'r':                                 // Remove extra set DLLs.\n              case 'R':\n                s_fRemove = TRUE;\n                break;\n\n              case '?':                                 // Help\n                fNeedHelp = TRUE;\n                break;\n\n              default:\n                fNeedHelp = TRUE;\n                printf(\"Bad argument: %s:%s\\n\", argn, argp);\n                break;\n            }\n        }\n    }\n    if (argc == 1) {\n        fNeedHelp = TRUE;\n    }\n    if (!s_fRemove && s_szDllPath[0] == 0) {\n        fNeedHelp = TRUE;\n    }\n    if (fNeedHelp) {\n        PrintUsage();\n        return 1;\n    }\n\n\n    if (s_fRemove) {\n        printf(\"Removing extra DLLs from binary files.\\n\");\n    }\n    else {\n        if (!DoesDllExportOrdinal1(s_szDllPath)) {\n            printf(\"Error: %hs does not export function with ordinal #1.\\n\",\n                   s_szDllPath);\n            return 2;\n        }\n        printf(\"Adding %hs to binary files.\\n\", s_szDllPath);\n    }\n\n    for (arg = 1; arg < argc; arg++) {\n        if (argv[arg][0] != '-' && argv[arg][0] != '/') {\n            SetFile(argv[arg]);\n        }\n    }\n    return 0;\n}\n\n// End of File\n"
  },
  {
    "path": "ext/detours/samples/simple/Makefile",
    "content": "##############################################################################\n##\n##  API Extention to Measure time slept.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\nLIBS=$(LIBS) kernel32.lib\n\n##############################################################################\n\nall: dirs \\\n    $(BIND)\\simple$(DETOURS_BITS).dll \\\n    $(BIND)\\sleep5.exe \\\n    \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\simple$(DETOURS_BITS).bsc \\\n    $(OBJD)\\sleep5.bsc \\\n!ENDIF\n    option\n\n##############################################################################\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\n$(OBJD)\\simple.obj : simple.cpp\n\n$(OBJD)\\simple.res : simple.rc\n\n$(BIND)\\simple$(DETOURS_BITS).dll $(BIND)\\simple$(DETOURS_BITS).lib: \\\n        $(OBJD)\\simple.obj $(OBJD)\\simple.res $(DEPS)\n    cl /LD $(CFLAGS) /Fe$(@R).dll /Fd$(@R).pdb \\\n        $(OBJD)\\simple.obj $(OBJD)\\simple.res \\\n        /link $(LINKFLAGS) /subsystem:console \\\n        /export:DetourFinishHelperProcess,@1,NONAME \\\n        /export:TimedSleepEx \\\n        $(LIBS)\n\n$(OBJD)\\simple$(DETOURS_BITS).bsc : $(OBJD)\\simple.obj\n    bscmake /v /n /o $@ $(OBJD)\\simple.sbr\n\n$(OBJD)\\sleep5.obj : sleep5.cpp\n\n$(BIND)\\sleep5.exe : $(OBJD)\\sleep5.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb $(OBJD)\\sleep5.obj \\\n        /link $(LINKFLAGS) $(LIBS) \\\n        /subsystem:console\n\n$(OBJD)\\sleep5.bsc : $(OBJD)\\sleep5.obj\n    bscmake /v /n /o $@ $(OBJD)\\sleep5.sbr\n\n##############################################################################\n\nclean:\n    -del *~ 2>nul\n    -del $(BIND)\\simple*.* 2>nul\n    -del $(BIND)\\sleep5.* 2>nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\n############################################### Install non-bit-size binaries.\n\n!IF \"$(DETOURS_OPTION_PROCESSOR)\" != \"\"\n\n$(OPTD)\\simple$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\simple$(DETOURS_OPTION_BITS).pdb:\n\n$(BIND)\\simple$(DETOURS_OPTION_BITS).dll : $(OPTD)\\simple$(DETOURS_OPTION_BITS).dll\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\simple$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\simple$(DETOURS_OPTION_BITS).pdb\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n\noption: \\\n    $(BIND)\\simple$(DETOURS_OPTION_BITS).dll \\\n    $(BIND)\\simple$(DETOURS_OPTION_BITS).pdb \\\n\n!ELSE\n\noption:\n\n!ENDIF\n\n##############################################################################\n\ntest: all\n    @echo -------- Reseting test binaries to initial state. ---------------------\n    $(BIND)\\setdll.exe -r $(BIND)\\sleep5.exe\n    @echo.\n    @echo -------- Should not load simple$(DETOURS_BITS).dll -----------------------------------\n    $(BIND)\\sleep5.exe\n    @echo.\n    @echo -------- Adding simple$(DETOURS_BITS).dll to sleep5.exe ------------------------------\n    $(BIND)\\setdll.exe -d:$(BIND)\\simple$(DETOURS_BITS).dll $(BIND)\\sleep5.exe\n    @echo.\n    @echo -------- Should load simple$(DETOURS_BITS).dll statically ----------------------------\n    $(BIND)\\sleep5.exe\n    @echo.\n    @echo -------- Removing simple$(DETOURS_BITS).dll from sleep5.exe --------------------------\n    $(BIND)\\setdll.exe -r $(BIND)\\sleep5.exe\n    @echo.\n    @echo -------- Should not load simple$(DETOURS_BITS).dll -----------------------------------\n    $(BIND)\\sleep5.exe\n    @echo.\n    @echo -------- Should load simple$(DETOURS_BITS).dll dynamically using withdll.exe----------\n    $(BIND)\\withdll.exe -d:$(BIND)\\simple$(DETOURS_BITS).dll $(BIND)\\sleep5.exe\n    @echo.\n\ndebug: all\n    windbg -o $(BIND)\\withdll.exe -d:$(BIND)\\simple$(DETOURS_BITS).dll $(BIND)\\sleep5.exe\n\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/simple/simple.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (simple.cpp of simple.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n//  This DLL will detour the Windows SleepEx API so that TimedSleep function\n//  gets called instead.  TimedSleepEx records the before and after times, and\n//  calls the real SleepEx API through the TrueSleepEx function pointer.\n//\n#include <stdio.h>\n#include <windows.h>\n#include \"detours.h\"\n\nstatic LONG dwSlept = 0;\nstatic DWORD (WINAPI * TrueSleepEx)(DWORD dwMilliseconds, BOOL bAlertable) = SleepEx;\n\nDWORD WINAPI TimedSleepEx(DWORD dwMilliseconds, BOOL bAlertable)\n{\n    DWORD dwBeg = GetTickCount();\n    DWORD ret = TrueSleepEx(dwMilliseconds, bAlertable);\n    DWORD dwEnd = GetTickCount();\n\n    InterlockedExchangeAdd(&dwSlept, dwEnd - dwBeg);\n\n    return ret;\n}\n\nBOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)\n{\n    LONG error;\n    (void)hinst;\n    (void)reserved;\n\n    if (DetourIsHelperProcess()) {\n        return TRUE;\n    }\n\n    if (dwReason == DLL_PROCESS_ATTACH) {\n        DetourRestoreAfterWith();\n\n        printf(\"simple\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll:\"\n               \" Starting.\\n\");\n        fflush(stdout);\n\n        DetourTransactionBegin();\n        DetourUpdateThread(GetCurrentThread());\n        DetourAttach(&(PVOID&)TrueSleepEx, TimedSleepEx);\n        error = DetourTransactionCommit();\n\n        if (error == NO_ERROR) {\n            printf(\"simple\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll:\"\n                   \" Detoured SleepEx().\\n\");\n        }\n        else {\n            printf(\"simple\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll:\"\n                   \" Error detouring SleepEx(): %ld\\n\", error);\n        }\n    }\n    else if (dwReason == DLL_PROCESS_DETACH) {\n        DetourTransactionBegin();\n        DetourUpdateThread(GetCurrentThread());\n        DetourDetach(&(PVOID&)TrueSleepEx, TimedSleepEx);\n        error = DetourTransactionCommit();\n\n        printf(\"simple\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll:\"\n               \" Removed SleepEx() (result=%ld), slept %ld ticks.\\n\", error, dwSlept);\n        fflush(stdout);\n    }\n    return TRUE;\n}\n\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/simple/simple.rc",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Version information for simple.rc.\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include \"detver.h\"\n\n#define VER_INTERNALNAME_STR        \"simple\" DETOURS_STRINGIFY(DETOURS_BITS)\n#define VER_ORIGINALFILENAME_STR    \"simple\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\"\n#define VER_FILEDESCRIPTION_STR     \"Detours Test Module\"\n#define VER_COMPANYNAME_STR         \"Microsoft Corporation\"\n\n#include \"common.ver\"\n"
  },
  {
    "path": "ext/detours/samples/simple/sleep5.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (sleep5.cpp of sleep5.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include <windows.h>\n#include <stdio.h>\n#include <stdlib.h>\n\nint __cdecl main(int argc, char ** argv)\n{\n    if (argc == 2) {\n        Sleep(atoi(argv[1]) * 1000);\n    }\n    else {\n        printf(\"sleep5.exe: Starting.\\n\");\n\n        Sleep(5000);\n\n        printf(\"sleep5.exe: Done sleeping.\\n\");\n    }\n    return 0;\n}\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/slept/Makefile",
    "content": "##############################################################################\n##\n##  API Extension to Measure time slept.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\nCFLAGS = $(CFLAGS:/Od=/O2)\n\nLIBS=$(LIBS) kernel32.lib\n\n##############################################################################\n\nall: dirs \\\n    $(BIND)\\slept$(DETOURS_BITS).dll \\\n    $(BIND)\\dslept$(DETOURS_BITS).dll \\\n    $(BIND)\\sleepold.exe \\\n    $(BIND)\\sleepnew.exe \\\n    $(BIND)\\sleepbed.exe \\\n    \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\slept$(DETOURS_BITS).bsc \\\n    $(OBJD)\\dslept$(DETOURS_BITS).bsc \\\n    $(OBJD)\\sleepold.bsc \\\n    $(OBJD)\\sleepnew.bsc \\\n    $(OBJD)\\sleepbed.bsc \\\n!ENDIF\n    option\n\n##############################################################################\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\n$(OBJD)\\slept.obj : slept.cpp verify.cpp\n\n$(OBJD)\\slept.res : slept.rc\n\n$(BIND)\\slept$(DETOURS_BITS).dll $(BIND)\\slept$(DETOURS_BITS).lib: \\\n        $(OBJD)\\slept.obj $(OBJD)\\slept.res $(DEPS)\n    cl /LD $(CFLAGS) /Fe$(@R).dll /Fd$(@R).pdb \\\n        $(OBJD)\\slept.obj $(OBJD)\\slept.res\\\n        /link $(LINKFLAGS) /subsystem:console \\\n        /export:DetourFinishHelperProcess,@1,NONAME \\\n        /export:TimedSleepEx \\\n        /export:UntimedSleepEx \\\n        /export:GetSleptTicks \\\n        /export:TestTicks \\\n        /export:TestTicksEx \\\n        $(LIBS)\n\n$(OBJD)\\slept$(DETOURS_BITS).bsc : $(OBJD)\\slept.obj\n    bscmake /v /n /o $@ $(OBJD)\\slept.sbr\n\n$(OBJD)\\dslept.obj : dslept.cpp verify.cpp\n\n$(OBJD)\\dslept.res : dslept.rc\n\n$(BIND)\\dslept$(DETOURS_BITS).dll $(BIND)\\dslept$(DETOURS_BITS).lib: \\\n        $(OBJD)\\dslept.obj $(OBJD)\\dslept.res $(DEPS)\n    cl /LD $(CFLAGS) /Fe$(@R).dll /Fd$(@R).pdb \\\n        $(OBJD)\\dslept.obj $(OBJD)\\dslept.res \\\n        /link $(LINKFLAGS) /subsystem:console \\\n        /export:DetourFinishHelperProcess,@1,NONAME \\\n        /export:TimedSleepEx \\\n        /export:UntimedSleepEx \\\n        /export:GetSleptTicks \\\n        $(LIBS)\n\n$(OBJD)\\dslept$(DETOURS_BITS).bsc : $(OBJD)\\dslept.obj\n    bscmake /v /n /o $@ $(OBJD)\\dslept.sbr\n\n$(OBJD)\\sleepold.obj : sleepold.cpp verify.cpp\n\n$(BIND)\\sleepold.exe : $(OBJD)\\sleepold.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb $(OBJD)\\sleepold.obj \\\n        /link $(LINKFLAGS) $(LIBS) \\\n        /subsystem:console /fixed:no\n\n$(OBJD)\\sleepold.bsc : $(OBJD)\\sleepold.obj\n    bscmake /v /n /o $@ $(OBJD)\\sleepold.sbr\n\n$(OBJD)\\sleepnew.obj : sleepnew.cpp verify.cpp\n\n$(BIND)\\sleepnew.exe : $(OBJD)\\sleepnew.obj $(BIND)\\slept$(DETOURS_BITS).lib $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb $(OBJD)\\sleepnew.obj \\\n        /link $(LINKFLAGS) $(LIBS) \\\n        /subsystem:console /fixed:no $(BIND)\\slept$(DETOURS_BITS).lib\n\n$(OBJD)\\sleepnew.bsc : $(OBJD)\\sleepnew.obj\n    bscmake /v /n /o $@ $(OBJD)\\sleepnew.sbr\n\n$(OBJD)\\sleepbed.obj : sleepbed.cpp verify.cpp\n\n$(BIND)\\sleepbed.exe : $(OBJD)\\sleepbed.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb $(OBJD)\\sleepbed.obj \\\n        /link $(LINKFLAGS) $(LIBS) \\\n        /subsystem:console /fixed:no\n\n$(OBJD)\\sleepbed.bsc : $(OBJD)\\sleepbed.obj\n    bscmake /v /n /o $@ $(OBJD)\\sleepbed.sbr\n\n##############################################################################\n\nclean:\n    -del *~ 2>nul\n    -del $(BIND)\\slept*.* 2>nul\n    -del $(BIND)\\dslept*.* 2>nul\n    -del $(BIND)\\sleepold.* 2>nul\n    -del $(BIND)\\sleepnew.* 2>nul\n    -del $(BIND)\\sleepbed.* 2>nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\n############################################### Install non-bit-size binaries.\n\n!IF \"$(DETOURS_OPTION_PROCESSOR)\" != \"\"\n\n$(OPTD)\\slept$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\slept$(DETOURS_OPTION_BITS).pdb:\n$(OPTD)\\dslept$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\dslept$(DETOURS_OPTION_BITS).pdb:\n\n$(BIND)\\slept$(DETOURS_OPTION_BITS).dll: $(OPTD)\\slept$(DETOURS_OPTION_BITS).dll\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\slept$(DETOURS_OPTION_BITS).pdb: $(OPTD)\\slept$(DETOURS_OPTION_BITS).pdb\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\dslept$(DETOURS_OPTION_BITS).dll: $(OPTD)\\dslept$(DETOURS_OPTION_BITS).dll\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\dslept$(DETOURS_OPTION_BITS).pdb: $(OPTD)\\dslept$(DETOURS_OPTION_BITS).pdb\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n\noption: \\\n    $(BIND)\\slept$(DETOURS_OPTION_BITS).dll \\\n    $(BIND)\\slept$(DETOURS_OPTION_BITS).pdb \\\n    $(BIND)\\dslept$(DETOURS_OPTION_BITS).dll \\\n    $(BIND)\\dslept$(DETOURS_OPTION_BITS).pdb \\\n\n!ELSE\n\noption:\n\n!ENDIF\n\n##############################################################################\n\nskype: all\n    start windbg -G -o $(BIND)\\withdll.exe -d:$(BIND)\\slept$(DETOURS_BITS).dll \"C:\\Program Files (x86)\\Skype\\Phone\\Skype.exe\"\n\ntest: all\n    @echo -------- Reseting test binaries to initial state. -----------------------\n    $(BIND)\\setdll.exe -r $(BIND)\\sleepold.exe\n    @echo.\n    @echo -------- Should load detour self ----------------------------------------\n    $(BIND)\\sleepbed.exe\n    @echo.\n    @echo -------- Should load slept$(DETOURS_BITS).dll statically -------------------------------\n    $(BIND)\\sleepnew.exe\n    @echo.\n    @echo -------- Should not load slept$(DETOURS_BITS).dll --------------------------------------\n    $(BIND)\\sleepold.exe\n    @echo.\n    @echo -------- Adding slept$(DETOURS_BITS).dll to sleepold.exe -------------------------------\n    $(BIND)\\setdll.exe -d:$(BIND)\\slept$(DETOURS_BITS).dll $(BIND)\\sleepold.exe\n    @echo.\n    @echo -------- Should load slept$(DETOURS_BITS).dll statically -------------------------------\n    $(BIND)\\sleepold.exe\n    @echo.\n    @echo -------- Replacing slept$(DETOURS_BITS).dll with dslept$(DETOURS_BITS).dll in sleepold.exe ------------\n    $(BIND)\\setdll.exe -r $(BIND)\\sleepold.exe\n    $(BIND)\\setdll.exe -d:$(BIND)\\dslept$(DETOURS_BITS).dll $(BIND)\\sleepold.exe\n    @echo.\n    @echo -------- Should load dslept$(DETOURS_BITS).dll instead of slept$(DETOURS_BITS).dll --------------------\n    $(BIND)\\sleepold.exe\n    @echo.\n    @echo -------- Removing dslept$(DETOURS_BITS).dll from sleepold.exe --------------------------\n    $(BIND)\\setdll.exe -r $(BIND)\\sleepold.exe\n    @echo.\n    @echo -------- Should not load dslept$(DETOURS_BITS).dll or slept$(DETOURS_BITS).dll ------------------------\n    $(BIND)\\sleepold.exe\n    @echo.\n    @echo -------- Should load slept$(DETOURS_BITS).dll dynamically using withdll.exe ------------\n    $(BIND)\\withdll.exe -d:$(BIND)\\slept$(DETOURS_BITS).dll $(BIND)\\sleepold.exe\n    @echo.\n    @echo -------- Test completed. ------------------------------------------------\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/slept/NORMAL_IA64.TXT",
    "content": "-------- Reseting test binaries to initial state. -----------------------\n    ..\\..\\bin.IA64\\setdll.exe -r ..\\..\\bin.IA64\\sleepold.exe\nRemoving extra DLLs from binary files.\n  ..\\..\\bin.IA64\\sleepold.exe:\n    KERNEL32.dll -> KERNEL32.dll\n\n-------- Should load detour self ----------------------------------------\n    ..\\..\\bin.IA64\\sleepbed.exe\nsleepbed.exe: Starting.\nsleepbed.exe: ExeEntry=000000013F702DD0, DllEntry=0000000000000000\n  SleepEx = 0000000077898980 [0000000077845300]\n    0000000077898980: 08181d0a 80054002 04004240 0400c400\n    0000000077898990: 11300142 00215002 80004200 00000020\n    00000000778989A0: 13000000 01000000 00001000 80a50050\n\nsleepbed.exe: Detoured SleepEx().\nsleepbed.exe: After detour.\n  SleepEx = 0000000077898980 [0000000077845300]\n    0000000077898980: 05000000 0100bfff ffff7f00 b879ffc8  [0000000037890330]\n    0000000077898990: 11300142 00215002 80004200 00000020\n    00000000778989A0: 13000000 01000000 00001000 80a50050\n\nsleepbed.exe: Calling Sleep for 1 second.\nsleepbed.exe: Calling SleepEx for 1 second.\nsleepbed.exe: Calling Sleep again for 1 second.\nsleepbed.exe: Calling TimedSleepEx for 1 second.\nsleepbed.exe: Calling UntimedSleepEx for 1 second.\nsleepbed.exe: Done sleeping.\n\nsleepbed.exe: Removed SleepEx() detour (0), slept 2000 ticks.\nsleepbed.exe: GetSleptTicks() = 2000\n\n\n-------- Should load slept64.dll statically -------------------------------\n    ..\\..\\bin.IA64\\sleepnew.exe\nslept64.dll:  Starting.\nslept64.dll:  ExeEntry=000000013F18CA50, DllEntry=000006FAEE9F6D80\n  SleepEx = 0000000077898980 [0000000077845300]\n    0000000077898980: 08181d0a 80054002 04004240 0400c400\n    0000000077898990: 11300142 00215002 80004200 00000020\n    00000000778989A0: 13000000 01000000 00001000 80a50050\n\nsleepnew.exe: Starting.\n  SleepEx = 0000000077898980 [0000000077845300]\n    0000000077898980: 05000000 0100bfff ffff7f00 b879ffc8  [0000000037890330]\n    0000000077898990: 11300142 00215002 80004200 00000020\n    00000000778989A0: 13000000 01000000 00001000 80a50050\n\nsleepnew.exe: Calling Sleep for 1 second.\nsleepnew.exe: Calling SleepEx for 1 second.\nsleepnew.exe: Calling Sleep again for 1 second.\nsleepnew.exe: Calling TimedSleep for 1 second.\nsleepnew.exe: Calling UntimedSleep for 1 second.\nsleepnew.exe: Done sleeping.\n\nsleepnew.exe: GetSleptTicks() = 2000\n\nslept64.dll:  Detoured SleepEx().\nslept64.dll:  Removed SleepEx() detour (0), slept 2000 ticks.\n\n-------- Should not load slept64.dll --------------------------------------\n    ..\\..\\bin.IA64\\sleepold.exe\nsleepold.exe: Starting (at 000000013F80C288).\n  SleepEx = 0000000077898980 [0000000077845300]\n    0000000077898980: 08181d0a 80054002 04004240 0400c400\n    0000000077898990: 11300142 00215002 80004200 00000020\n    00000000778989A0: 13000000 01000000 00001000 80a50050\n\nsleepold.exe: Calling Sleep for 1 second.\nsleepold.exe: Calling SleepEx for 1 second.\nsleepold.exe: Calling Sleep again for 1 second.\nsleepold.exe: Done sleeping.\n\n\n-------- Adding slept64.dll to sleepold.exe -------------------------------\n    ..\\..\\bin.IA64\\setdll.exe -d:..\\..\\bin.IA64\\slept64.dll ..\\..\\bin.IA64\\sleepold.exe\nAdding c:\\Code\\Detours\\bin.IA64\\slept64.dll to binary files.\n  ..\\..\\bin.IA64\\sleepold.exe:\n    c:\\Code\\Detours\\bin.IA64\\slept64.dll\n    KERNEL32.dll -> KERNEL32.dll\n\n-------- Should load slept64.dll statically -------------------------------\n    ..\\..\\bin.IA64\\sleepold.exe\nslept64.dll:  Starting.\nslept64.dll:  ExeEntry=000000013F4FCAB0, DllEntry=000006FAEE9F6D80\n  SleepEx = 0000000077898980 [0000000077845300]\n    0000000077898980: 08181d0a 80054002 04004240 0400c400\n    0000000077898990: 11300142 00215002 80004200 00000020\n    00000000778989A0: 13000000 01000000 00001000 80a50050\n\nsleepold.exe: Starting (at 000000013F4FC288).\n  SleepEx = 0000000077898980 [0000000077845300]\n    0000000077898980: 05000000 0100bfff ffff7f00 b879ffc8  [0000000037890330]\n    0000000077898990: 11300142 00215002 80004200 00000020\n    00000000778989A0: 13000000 01000000 00001000 80a50050\n\nsleepold.exe: Calling Sleep for 1 second.\nsleepold.exe: Calling SleepEx for 1 second.\nsleepold.exe: Calling Sleep again for 1 second.\nsleepold.exe: Done sleeping.\n\nslept64.dll:  Detoured SleepEx().\nslept64.dll:  Removed SleepEx() detour (0), slept 1000 ticks.\n\n-------- Replacing slept64.dll with dslept64.dll in sleepold.exe ------------\n    ..\\..\\bin.IA64\\setdll.exe -r ..\\..\\bin.IA64\\sleepold.exe\nRemoving extra DLLs from binary files.\n  ..\\..\\bin.IA64\\sleepold.exe:\n    KERNEL32.dll -> KERNEL32.dll\n    ..\\..\\bin.IA64\\setdll.exe -d:..\\..\\bin.IA64\\dslept64.dll ..\\..\\bin.IA64\\sleepold.exe\nAdding c:\\Code\\Detours\\bin.IA64\\dslept64.dll to binary files.\n  ..\\..\\bin.IA64\\sleepold.exe:\n    c:\\Code\\Detours\\bin.IA64\\dslept64.dll\n    KERNEL32.dll -> KERNEL32.dll\n\n-------- Should load dslept64.dll instead of slept64.dll --------------------\n    ..\\..\\bin.IA64\\sleepold.exe\ndslept64.dll:  Starting.\n  SleepEx = 0000000077898980 [0000000077845300]\n    0000000077898980: 08181d0a 80054002 04004240 0400c400\n    0000000077898990: 11300142 00215002 80004200 00000020\n    00000000778989A0: 13000000 01000000 00001000 80a50050\n\n  EntryPoint = 000000013F12D580 [000000013F16CAB0]\n    000000013F12D580: 01080d06 80050002 00620040 04080084\n    000000013F12D590: 13000000 01000000 00001000 90eb0050\n    000000013F12D5A0: 13080044 00210000 00001000 c0fcff58\n  EntryPoint after attach = 000000013F12D580 [000000013F16CAB0]\n    000000013F12D580: 05000000 0100bfff ffff7f00 b82dffc8  [00000000FF120330]\n    000000013F12D590: 13000000 01000000 00001000 90eb0050\n    000000013F12D5A0: 13080044 00210000 00001000 c0fcff58\n  EntryPoint trampoline = 00000000FF120300 [00000000FF1203B0]\n    00000000FF120300: 05000000 01003f01 00000020 00f00267\n    00000000FF120310: 01080d06 80050002 00620040 04080084\n    00000000FF120320: 05000000 01004000 00000000 78d200c0  [000000013F12D590]\ndslept64.dll:  Detoured EntryPoint().\ndslept64.dll:  Detoured SleepEx().\n  SleepEx = 0000000077898980 [0000000077845300]\n    0000000077898980: 05000000 0100bfff ffff7f00 b879ffc8  [0000000037890330]\n    0000000077898990: 11300142 00215002 80004200 00000020\n    00000000778989A0: 13000000 01000000 00001000 80a50050\n\ndslept64.dll:  Calling EntryPoint\nsleepold.exe: Starting (at 000000013F16C288).\n  SleepEx = 0000000077898980 [0000000077845300]\n    0000000077898980: 05000000 0100bfff ffff7f00 b879ffc8  [0000000037890330]\n    0000000077898990: 11300142 00215002 80004200 00000020\n    00000000778989A0: 13000000 01000000 00001000 80a50050\n\nsleepold.exe: Calling Sleep for 1 second.\nsleepold.exe: Calling SleepEx for 1 second.\nsleepold.exe: Calling Sleep again for 1 second.\nsleepold.exe: Done sleeping.\n\ndslept64.dll:  Removed Sleep() detours (0), slept 1000 ticks.\n\n-------- Removing dslept64.dll from sleepold.exe --------------------------\n    ..\\..\\bin.IA64\\setdll.exe -r ..\\..\\bin.IA64\\sleepold.exe\nRemoving extra DLLs from binary files.\n  ..\\..\\bin.IA64\\sleepold.exe:\n    KERNEL32.dll -> KERNEL32.dll\n\n-------- Should not load dslept64.dll or slept64.dll ------------------------\n    ..\\..\\bin.IA64\\sleepold.exe\nsleepold.exe: Starting (at 000000013FCEC288).\n  SleepEx = 0000000077898980 [0000000077845300]\n    0000000077898980: 08181d0a 80054002 04004240 0400c400\n    0000000077898990: 11300142 00215002 80004200 00000020\n    00000000778989A0: 13000000 01000000 00001000 80a50050\n\nsleepold.exe: Calling Sleep for 1 second.\nsleepold.exe: Calling SleepEx for 1 second.\nsleepold.exe: Calling Sleep again for 1 second.\nsleepold.exe: Done sleeping.\n\n\n-------- Should load slept64.dll dynamically using withdll.exe ------------\n    ..\\..\\bin.IA64\\withdll.exe -d:..\\..\\bin.IA64\\slept64.dll ..\\..\\bin.IA64\\sleepold.exe\nwithdll.exe: Starting: `..\\..\\bin.IA64\\sleepold.exe'\nwithdll.exe:   with `c:\\Code\\Detours\\bin.IA64\\slept64.dll'\nslept64.dll:  Starting.\nslept64.dll:  ExeEntry=000000013FBFCAB0, DllEntry=000006FAEE9F6D80\n  SleepEx = 0000000077898980 [0000000077845300]\n    0000000077898980: 08181d0a 80054002 04004240 0400c400\n    0000000077898990: 11300142 00215002 80004200 00000020\n    00000000778989A0: 13000000 01000000 00001000 80a50050\n\nsleepold.exe: Starting (at 000000013FBFC288).\n  SleepEx = 0000000077898980 [0000000077845300]\n    0000000077898980: 05000000 0100bfff ffff7f00 b879ffc8  [0000000037890330]\n    0000000077898990: 11300142 00215002 80004200 00000020\n    00000000778989A0: 13000000 01000000 00001000 80a50050\n\nsleepold.exe: Calling Sleep for 1 second.\nsleepold.exe: Calling SleepEx for 1 second.\nsleepold.exe: Calling Sleep again for 1 second.\nsleepold.exe: Done sleeping.\n\nslept64.dll:  Detoured SleepEx().\nslept64.dll:  Removed SleepEx() detour (0), slept 1030 ticks.\n\n-------- Test completed. ------------------------------------------------\n"
  },
  {
    "path": "ext/detours/samples/slept/NORMAL_X64.TXT",
    "content": "-------- Reseting test binaries to initial state. -----------------------\n    ..\\..\\bin.X64\\setdll.exe -r ..\\..\\bin.X64\\sleepold.exe\nRemoving extra DLLs from binary files.\n  ..\\..\\bin.X64\\sleepold.exe:\n    KERNEL32.dll -> KERNEL32.dll\n\n-------- Should load detour self ----------------------------------------\n    ..\\..\\bin.X64\\sleepbed.exe\nsleepbed.exe: Starting.\nsleepbed.exe: ExeEntry=000000013FE863E0, DllEntry=000000013FE9E610\n  SleepEx = 000007FEFD541150 [0000000076912B60]\n    000007FEFD541150: 4c8bdc\n    000007FEFD541153: 49895b08\n    000007FEFD541157: 89542410\n\nsleepbed.exe: Detoured SleepEx().\nsleepbed.exe: After detour.\n  SleepEx = 000007FEFD541150 [0000000076912B60]\n    000007FEFD541150: e923f0ff bf                          [000007FEBD540178]\n    000007FEFD541155: cc                                   [FFFFFFFFFFFFFFFF]\n    000007FEFD541156: cc                                   [FFFFFFFFFFFFFFFF]\n\nsleepbed.exe: Calling Sleep for 1 second.\nsleepbed.exe: Calling SleepEx for 1 second.\nsleepbed.exe: Calling Sleep again for 1 second.\nsleepbed.exe: Calling TimedSleepEx for 1 second.\nsleepbed.exe: Calling UntimedSleepEx for 1 second.\nsleepbed.exe: Done sleeping.\n\nsleepbed.exe: Removed SleepEx() detour (0), slept 4056 ticks.\nsleepbed.exe: GetSleptTicks() = 4056\n\n\n-------- Should load slept64.dll statically -------------------------------\n    ..\\..\\bin.X64\\sleepnew.exe\nslept64.dll:  Starting.\nslept64.dll:  ExeEntry=000000013F56484C, DllEntry=000007FEF2E78B74\n  SleepEx = 000007FEFD541150 [0000000076912B60]\n    000007FEFD541150: 4c8bdc\n    000007FEFD541153: 49895b08\n    000007FEFD541157: 89542410\n\nsleepnew.exe: Starting.\n  SleepEx = 000007FEFD541150 [0000000076912B60]\n    000007FEFD541150: e923f0ff bf                          [000007FEBD540178]\n    000007FEFD541155: cc                                   [FFFFFFFFFFFFFFFF]\n    000007FEFD541156: cc                                   [FFFFFFFFFFFFFFFF]\n\nsleepnew.exe: Calling Sleep for 1 second.\nsleepnew.exe: Calling SleepEx for 1 second.\nsleepnew.exe: Calling Sleep again for 1 second.\nsleepnew.exe: Calling TimedSleep for 1 second.\nsleepnew.exe: Calling UntimedSleep for 1 second.\nsleepnew.exe: Done sleeping.\n\nsleepnew.exe: GetSleptTicks() = 4056\n\nslept64.dll:  Detoured SleepEx().\nslept64.dll:  Removed SleepEx() detour (0), slept 4056 ticks.\n\n-------- Should not load slept64.dll --------------------------------------\n    ..\\..\\bin.X64\\sleepold.exe\nsleepold.exe: Starting (at 000000013FEF1350).\n  SleepEx = 000007FEFD541150 [0000000076912B60]\n    000007FEFD541150: 4c8bdc\n    000007FEFD541153: 49895b08\n    000007FEFD541157: 89542410\n\nsleepold.exe: Calling Sleep for 1 second.\nsleepold.exe: Calling SleepEx for 1 second.\nsleepold.exe: Calling Sleep again for 1 second.\nsleepold.exe: Done sleeping.\n\n\n-------- Adding slept64.dll to sleepold.exe -------------------------------\n    ..\\..\\bin.X64\\setdll.exe -d:..\\..\\bin.X64\\slept64.dll ..\\..\\bin.X64\\sleepold.exe\nAdding c:\\Code\\detours\\bin.X64\\slept64.dll to binary files.\n  ..\\..\\bin.X64\\sleepold.exe:\n    c:\\Code\\detours\\bin.X64\\slept64.dll\n    KERNEL32.dll -> KERNEL32.dll\n\n-------- Should load slept64.dll statically -------------------------------\n    ..\\..\\bin.X64\\sleepold.exe\nslept64.dll:  Starting.\nslept64.dll:  ExeEntry=000000013F554ADC, DllEntry=000007FEF2E78B74\n  SleepEx = 000007FEFD541150 [0000000076912B60]\n    000007FEFD541150: 4c8bdc\n    000007FEFD541153: 49895b08\n    000007FEFD541157: 89542410\n\nsleepold.exe: Starting (at 000000013F551350).\n  SleepEx = 000007FEFD541150 [0000000076912B60]\n    000007FEFD541150: e923f0ff bf                          [000007FEBD540178]\n    000007FEFD541155: cc                                   [FFFFFFFFFFFFFFFF]\n    000007FEFD541156: cc                                   [FFFFFFFFFFFFFFFF]\n\nsleepold.exe: Calling Sleep for 1 second.\nsleepold.exe: Calling SleepEx for 1 second.\nsleepold.exe: Calling Sleep again for 1 second.\nsleepold.exe: Done sleeping.\n\nslept64.dll:  Detoured SleepEx().\nslept64.dll:  Removed SleepEx() detour (0), slept 3042 ticks.\n\n-------- Replacing slept64.dll with dslept64.dll in sleepold.exe ------------\n    ..\\..\\bin.X64\\setdll.exe -r ..\\..\\bin.X64\\sleepold.exe\nRemoving extra DLLs from binary files.\n  ..\\..\\bin.X64\\sleepold.exe:\n    KERNEL32.dll -> KERNEL32.dll\n    ..\\..\\bin.X64\\setdll.exe -d:..\\..\\bin.X64\\dslept64.dll ..\\..\\bin.X64\\sleepold.exe\nAdding c:\\Code\\detours\\bin.X64\\dslept64.dll to binary files.\n  ..\\..\\bin.X64\\sleepold.exe:\n    c:\\Code\\detours\\bin.X64\\dslept64.dll\n    KERNEL32.dll -> KERNEL32.dll\n\n-------- Should load dslept64.dll instead of slept64.dll --------------------\n    ..\\..\\bin.X64\\sleepold.exe\ndslept64.dll:  Starting.\n  SleepEx = 000007FEFD541150 [0000000076912B60]\n    000007FEFD541150: 4c8bdc\n    000007FEFD541153: 49895b08\n    000007FEFD541157: 89542410\n\n  EntryPoint = 000000013FB24ADC\n    000000013FB24ADC: 4883ec28\n    000000013FB24AE0: e8875f00 00                          [000000013FB2AA6C]\n    000000013FB24AE5: 4883c428\n  EntryPoint after attach = 000000013FB24ADC\n    000000013FB24ADC: e997b6ff bf                          [00000000FFB20178]\n    000000013FB24AE1: cc                                   [FFFFFFFFFFFFFFFF]\n    000000013FB24AE2: cc                                   [FFFFFFFFFFFFFFFF]\n  EntryPoint trampoline = 00000000FFB20120\n    00000000FFB20120: 4883ec28\n    00000000FFB20124: e843a900 40                          [000000013FB2AA6C]\n    00000000FFB20129: ff253900 0000\ndslept64.dll:  Detoured EntryPoint().\ndslept64.dll:  Detoured SleepEx().\n  SleepEx = 000007FEFD541150 [0000000076912B60]\n    000007FEFD541150: e923f0ff bf                          [000007FEBD540178]\n    000007FEFD541155: cc                                   [FFFFFFFFFFFFFFFF]\n    000007FEFD541156: cc                                   [FFFFFFFFFFFFFFFF]\n\ndslept64.dll:  Calling EntryPoint\nsleepold.exe: Starting (at 000000013FB21350).\n  SleepEx = 000007FEFD541150 [0000000076912B60]\n    000007FEFD541150: e923f0ff bf                          [000007FEBD540178]\n    000007FEFD541155: cc                                   [FFFFFFFFFFFFFFFF]\n    000007FEFD541156: cc                                   [FFFFFFFFFFFFFFFF]\n\nsleepold.exe: Calling Sleep for 1 second.\nsleepold.exe: Calling SleepEx for 1 second.\nsleepold.exe: Calling Sleep again for 1 second.\nsleepold.exe: Done sleeping.\n\ndslept64.dll:  Removed Sleep() detours (0), slept 3042 ticks.\n\n-------- Removing dslept64.dll from sleepold.exe --------------------------\n    ..\\..\\bin.X64\\setdll.exe -r ..\\..\\bin.X64\\sleepold.exe\nRemoving extra DLLs from binary files.\n  ..\\..\\bin.X64\\sleepold.exe:\n    KERNEL32.dll -> KERNEL32.dll\n\n-------- Should not load dslept64.dll or slept64.dll ------------------------\n    ..\\..\\bin.X64\\sleepold.exe\nsleepold.exe: Starting (at 000000013F551350).\n  SleepEx = 000007FEFD541150 [0000000076912B60]\n    000007FEFD541150: 4c8bdc\n    000007FEFD541153: 49895b08\n    000007FEFD541157: 89542410\n\nsleepold.exe: Calling Sleep for 1 second.\nsleepold.exe: Calling SleepEx for 1 second.\nsleepold.exe: Calling Sleep again for 1 second.\nsleepold.exe: Done sleeping.\n\n\n-------- Should load slept64.dll dynamically using withdll.exe ------------\n    ..\\..\\bin.X64\\withdll.exe -d:..\\..\\bin.X64\\slept64.dll ..\\..\\bin.X64\\sleepold.exe\nwithdll.exe: Starting: `..\\..\\bin.X64\\sleepold.exe'\nwithdll.exe:   with `c:\\Code\\detours\\bin.X64\\slept64.dll'\nslept64.dll:  Starting.\nslept64.dll:  ExeEntry=000000013FE84ADC, DllEntry=000007FEF3108B74\n  SleepEx = 000007FEFD541150 [0000000076912B60]\n    000007FEFD541150: 4c8bdc\n    000007FEFD541153: 49895b08\n    000007FEFD541157: 89542410\n\nsleepold.exe: Starting (at 000000013FE81350).\n  SleepEx = 000007FEFD541150 [0000000076912B60]\n    000007FEFD541150: e923f0ff bf                          [000007FEBD540178]\n    000007FEFD541155: cc                                   [FFFFFFFFFFFFFFFF]\n    000007FEFD541156: cc                                   [FFFFFFFFFFFFFFFF]\n\nsleepold.exe: Calling Sleep for 1 second.\nsleepold.exe: Calling SleepEx for 1 second.\nsleepold.exe: Calling Sleep again for 1 second.\nsleepold.exe: Done sleeping.\n\nslept64.dll:  Detoured SleepEx().\nslept64.dll:  Removed SleepEx() detour (0), slept 3042 ticks.\n\n-------- Test completed. ------------------------------------------------\n"
  },
  {
    "path": "ext/detours/samples/slept/NORMAL_X86.TXT",
    "content": "-------- Reseting test binaries to initial state. -----------------------\n    ..\\..\\bin.X86\\setdll.exe -r ..\\..\\bin.X86\\sleepold.exe\nRemoving extra DLLs from binary files.\n  ..\\..\\bin.X86\\sleepold.exe:\n    KERNEL32.dll -> KERNEL32.dll\n\n-------- Should load detour self ----------------------------------------\n    ..\\..\\bin.X86\\sleepbed.exe\nsleepbed.exe: Starting.\nsleepbed.exe: ExeEntry=00B1572E, DllEntry=00000000\n  SleepEx = 74F51215\n    74F51215: 8bff\n    74F51217: 55\n    74F51218: 8bec\n\nsleepbed.exe: Detoured SleepEx().\nsleepbed.exe: After detour.\n  SleepEx = 74F51215\n    74F51215: e95600bc 8b                          [00B11270]\n    74F5121A: 5d\n    74F5121B: ebed                                 [74F5120A]\n\nsleepbed.exe: Calling Sleep for 1 second.\nsleepbed.exe: Calling SleepEx for 1 second.\nsleepbed.exe: Calling Sleep again for 1 second.\nsleepbed.exe: Calling TimedSleepEx for 1 second.\nsleepbed.exe: Calling UntimedSleepEx for 1 second.\nsleepbed.exe: Done sleeping.\n\nsleepbed.exe: Removed SleepEx() detour (0), slept 2028 ticks.\nsleepbed.exe: GetSleptTicks() = 2028\n\n\n-------- Should load slept32.dll statically -------------------------------\n    ..\\..\\bin.X86\\sleepnew.exe\nslept32.dll:  Starting.\nslept32.dll:  ExeEntry=012D3B1A, DllEntry=7248702E\n  SleepEx = 74F51215\n    74F51215: 8bff\n    74F51217: 55\n    74F51218: 8bec\n\nsleepnew.exe: Starting.\n  SleepEx = 74F51215\n    74F51215: e9560053 fd                          [72481270]\n    74F5121A: 5d\n    74F5121B: ebed                                 [74F5120A]\n\nsleepnew.exe: Calling Sleep for 1 second.\nsleepnew.exe: Calling SleepEx for 1 second.\nsleepnew.exe: Calling Sleep again for 1 second.\nsleepnew.exe: Calling TimedSleep for 1 second.\nsleepnew.exe: Calling UntimedSleep for 1 second.\nsleepnew.exe: Done sleeping.\n\nsleepnew.exe: GetSleptTicks() = 2028\n\nslept32.dll:  Detoured SleepEx().\nslept32.dll:  Removed SleepEx() detour (0), slept 2028 ticks.\n\n-------- Should not load slept32.dll --------------------------------------\n    ..\\..\\bin.X86\\sleepold.exe\nsleepold.exe: Starting (at 00971260).\n  SleepEx = 74F51215\n    74F51215: 8bff\n    74F51217: 55\n    74F51218: 8bec\n\nsleepold.exe: Calling Sleep for 1 second.\nsleepold.exe: Calling SleepEx for 1 second.\nsleepold.exe: Calling Sleep again for 1 second.\nsleepold.exe: Done sleeping.\n\n\n-------- Adding slept32.dll to sleepold.exe -------------------------------\n    ..\\..\\bin.X86\\setdll.exe -d:..\\..\\bin.X86\\slept32.dll ..\\..\\bin.X86\\sleepold.exe\nAdding c:\\Code\\detours\\bin.X86\\slept32.dll to binary files.\n  ..\\..\\bin.X86\\sleepold.exe:\n    c:\\Code\\detours\\bin.X86\\slept32.dll\n    KERNEL32.dll -> KERNEL32.dll\n\n-------- Should load slept32.dll statically -------------------------------\n    ..\\..\\bin.X86\\sleepold.exe\nslept32.dll:  Starting.\nslept32.dll:  ExeEntry=00AF3D4C, DllEntry=7248702E\n  SleepEx = 74F51215\n    74F51215: 8bff\n    74F51217: 55\n    74F51218: 8bec\n\nsleepold.exe: Starting (at 00AF1260).\n  SleepEx = 74F51215\n    74F51215: e9560053 fd                          [72481270]\n    74F5121A: 5d\n    74F5121B: ebed                                 [74F5120A]\n\nsleepold.exe: Calling Sleep for 1 second.\nsleepold.exe: Calling SleepEx for 1 second.\nsleepold.exe: Calling Sleep again for 1 second.\nsleepold.exe: Done sleeping.\n\nslept32.dll:  Detoured SleepEx().\nslept32.dll:  Removed SleepEx() detour (0), slept 1014 ticks.\n\n-------- Replacing slept32.dll with dslept32.dll in sleepold.exe ------------\n    ..\\..\\bin.X86\\setdll.exe -r ..\\..\\bin.X86\\sleepold.exe\nRemoving extra DLLs from binary files.\n  ..\\..\\bin.X86\\sleepold.exe:\n    KERNEL32.dll -> KERNEL32.dll\n    ..\\..\\bin.X86\\setdll.exe -d:..\\..\\bin.X86\\dslept32.dll ..\\..\\bin.X86\\sleepold.exe\nAdding c:\\Code\\detours\\bin.X86\\dslept32.dll to binary files.\n  ..\\..\\bin.X86\\sleepold.exe:\n    c:\\Code\\detours\\bin.X86\\dslept32.dll\n    KERNEL32.dll -> KERNEL32.dll\n\n-------- Should load dslept32.dll instead of slept32.dll --------------------\n    ..\\..\\bin.X86\\sleepold.exe\ndslept32.dll:  Starting.\n  SleepEx = 74F51215\n    74F51215: 8bff\n    74F51217: 55\n    74F51218: 8bec\n\n  EntryPoint = 00263D4C\n    00263D4C: e8d75400 00                          [00269228]\n    00263D51: e995feff ff                          [00263BEB]\n    00263D56: 3b0d8412 2800\n  EntryPoint after attach = 00263D4C\n    00263D4C: e96fd502 72                          [722912C0]\n    00263D51: e995feff ff                          [00263BEB]\n    00263D56: 3b0d8412 2800\n  EntryPoint trampoline = 402500D8\n    402500D8: e84b9101 c0                          [00269228]\n    402500DD: e96f3c01 c0                          [00263D51]\n    402500E2: cc                                   [FFFFFFFF]\ndslept32.dll:  Detoured EntryPoint().\ndslept32.dll:  Detoured SleepEx().\n  SleepEx = 74F51215\n    74F51215: e9560034 fd                          [72291270]\n    74F5121A: 5d\n    74F5121B: ebed                                 [74F5120A]\n\ndslept32.dll:  Calling EntryPoint\nsleepold.exe: Starting (at 00261260).\n  SleepEx = 74F51215\n    74F51215: e9560034 fd                          [72291270]\n    74F5121A: 5d\n    74F5121B: ebed                                 [74F5120A]\n\nsleepold.exe: Calling Sleep for 1 second.\nsleepold.exe: Calling SleepEx for 1 second.\nsleepold.exe: Calling Sleep again for 1 second.\nsleepold.exe: Done sleeping.\n\ndslept32.dll:  Removed Sleep() detours (0), slept 1014 ticks.\n\n-------- Removing dslept32.dll from sleepold.exe --------------------------\n    ..\\..\\bin.X86\\setdll.exe -r ..\\..\\bin.X86\\sleepold.exe\nRemoving extra DLLs from binary files.\n  ..\\..\\bin.X86\\sleepold.exe:\n    KERNEL32.dll -> KERNEL32.dll\n\n-------- Should not load dslept32.dll or slept32.dll ------------------------\n    ..\\..\\bin.X86\\sleepold.exe\nsleepold.exe: Starting (at 00E01260).\n  SleepEx = 74F51215\n    74F51215: 8bff\n    74F51217: 55\n    74F51218: 8bec\n\nsleepold.exe: Calling Sleep for 1 second.\nsleepold.exe: Calling SleepEx for 1 second.\nsleepold.exe: Calling Sleep again for 1 second.\nsleepold.exe: Done sleeping.\n\n\n-------- Should load slept32.dll dynamically using withdll.exe ------------\n    ..\\..\\bin.X86\\withdll.exe -d:..\\..\\bin.X86\\slept32.dll ..\\..\\bin.X86\\sleepold.exe\nwithdll.exe: Starting: `..\\..\\bin.X86\\sleepold.exe'\nwithdll.exe:   with `c:\\Code\\detours\\bin.X86\\slept32.dll'\nslept32.dll:  Starting.\nslept32.dll:  ExeEntry=011A3D4C, DllEntry=7248702E\n  SleepEx = 74F51215\n    74F51215: 8bff\n    74F51217: 55\n    74F51218: 8bec\n\nsleepold.exe: Starting (at 011A1260).\n  SleepEx = 74F51215\n    74F51215: e9560053 fd                          [72481270]\n    74F5121A: 5d\n    74F5121B: ebed                                 [74F5120A]\n\nsleepold.exe: Calling Sleep for 1 second.\nsleepold.exe: Calling SleepEx for 1 second.\nsleepold.exe: Calling Sleep again for 1 second.\nsleepold.exe: Done sleeping.\n\nslept32.dll:  Detoured SleepEx().\nslept32.dll:  Removed SleepEx() detour (0), slept 1014 ticks.\n\n-------- Test completed. ------------------------------------------------\n"
  },
  {
    "path": "ext/detours/samples/slept/dslept.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detour Test Program (dslept.cpp of dslept.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n//  An example dynamically detouring a function.\n//\n#include <stdio.h>\n#include <windows.h>\n#include \"detours.h\"\n#include \"slept.h\"\n\n#include \"verify.cpp\"\n\nLONG dwSlept = 0;\n\nstatic DWORD (WINAPI * TrueSleepEx)(DWORD dwMilliseconds, BOOL bAlertable) = NULL;\nstatic int (WINAPI * TrueEntryPoint)(VOID) = NULL;\nstatic int (WINAPI * RawEntryPoint)(VOID) = NULL;\n\nDWORD WINAPI UntimedSleepEx(DWORD dwMilliseconds, BOOL bAlertable)\n{\n    if (TrueSleepEx != NULL) {\n        return TrueSleepEx(dwMilliseconds, bAlertable);\n    }\n    return 0;\n}\n\nDWORD WINAPI TimedSleepEx(DWORD dwMilliseconds, BOOL bAlertable)\n{\n    DWORD dwBeg = GetTickCount();\n    DWORD ret = TrueSleepEx(dwMilliseconds, bAlertable);\n    DWORD dwEnd = GetTickCount();\n\n    InterlockedExchangeAdd(&dwSlept, dwEnd - dwBeg);\n    return ret;\n}\n\nDWORD WINAPI GetSleptTicks(VOID)\n{\n    return dwSlept;\n}\n\nint WINAPI TimedEntryPoint(VOID)\n{\n    // We couldn't call LoadLibrary in DllMain,\n    // so we detour SleepEx here...\n    LONG error;\n\n    TrueSleepEx = (DWORD (WINAPI *)(DWORD, BOOL))\n        DetourFindFunction(\"kernel32.dll\", \"SleepEx\");\n\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n    DetourAttach(&(PVOID&)TrueSleepEx, TimedSleepEx);\n    error = DetourTransactionCommit();\n\n    if (error == NO_ERROR) {\n        printf(\"dslept\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll: \"\n               \" Detoured SleepEx().\\n\");\n\n    }\n    else {\n        printf(\"dslept\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll: \"\n               \" Error detouring SleepEx(): %ld\\n\", error);\n    }\n\n    Verify(\"SleepEx\", (PVOID)SleepEx);\n    printf(\"\\n\");\n    fflush(stdout);\n\n    printf(\"dslept\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll: \"\n           \" Calling EntryPoint\\n\");\n    fflush(stdout);\n\n    return TrueEntryPoint();\n}\n\nBOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)\n{\n    LONG error;\n    (void)hinst;\n    (void)reserved;\n\n    if (DetourIsHelperProcess()) {\n        return TRUE;\n    }\n\n    if (dwReason == DLL_PROCESS_ATTACH) {\n        DetourRestoreAfterWith();\n\n        printf(\"dslept\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll: \"\n               \" Starting.\\n\");\n        Verify(\"SleepEx\", (PVOID)SleepEx);\n        printf(\"\\n\");\n        fflush(stdout);\n\n        // NB: DllMain can't call LoadLibrary, so we hook the app entry point.\n        TrueEntryPoint = (int (WINAPI *)(VOID))DetourGetEntryPoint(NULL);\n        RawEntryPoint = TrueEntryPoint;\n\n        Verify(\"EntryPoint\", RawEntryPoint);\n\n        DetourTransactionBegin();\n        DetourUpdateThread(GetCurrentThread());\n        DetourAttach(&(PVOID&)TrueEntryPoint, TimedEntryPoint);\n        error = DetourTransactionCommit();\n\n        Verify(\"EntryPoint after attach\", RawEntryPoint);\n        Verify(\"EntryPoint trampoline\", TrueEntryPoint);\n\n        if (error == NO_ERROR) {\n            printf(\"dslept\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll: \"\n                   \" Detoured EntryPoint().\\n\");\n        }\n        else {\n            printf(\"dslept\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll: \"\n                   \" Error detouring EntryPoint(): %ld\\n\", error);\n        }\n    }\n    else if (dwReason == DLL_PROCESS_DETACH) {\n        DetourTransactionBegin();\n        DetourUpdateThread(GetCurrentThread());\n        if (TrueSleepEx != NULL) {\n            DetourDetach(&(PVOID&)TrueSleepEx, (PVOID)TimedSleepEx);\n        }\n        DetourDetach(&(PVOID&)TrueEntryPoint, TimedEntryPoint);\n        error = DetourTransactionCommit();\n\n        printf(\"dslept\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll: \"\n               \" Removed Sleep() detours (%ld), slept %ld ticks.\\n\", error, dwSlept);\n\n        fflush(stdout);\n    }\n    return TRUE;\n}\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/slept/dslept.rc",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Version information for dslept.rc.\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include \"detver.h\"\n\n#define VER_INTERNALNAME_STR        \"dslept\" DETOURS_STRINGIFY(DETOURS_BITS)\n#define VER_ORIGINALFILENAME_STR    \"dslept\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\"\n#define VER_FILEDESCRIPTION_STR     \"Detours Sleep Interception Module\"\n#define VER_COMPANYNAME_STR         \"Microsoft Corporation\"\n\n#include \"common.ver\"\n"
  },
  {
    "path": "ext/detours/samples/slept/sleepbed.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detour Test Program (sleepbed.cpp of sleepbed.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include <windows.h>\n#include <stdio.h>\n\n#include \"verify.cpp\"\n\nstatic BOOL fBroke = FALSE;\nstatic LONG dwSlept = 0;\nstatic DWORD (WINAPI * TrueSleepEx)(DWORD dwMilliseconds, BOOL bAlertable)\n    = SleepEx;\n\nDWORD WINAPI UntimedSleepEx(DWORD dwMilliseconds, BOOL bAlertable)\n{\n    return TrueSleepEx(dwMilliseconds, bAlertable);\n}\n\nDWORD WINAPI TimedSleepEx(DWORD dwMilliseconds, BOOL bAlertable)\n{\n    DWORD dwBeg = GetTickCount();\n    DWORD ret = TrueSleepEx(dwMilliseconds, bAlertable);\n    DWORD dwEnd = GetTickCount();\n\n    if (!fBroke) {\n        fBroke = TRUE;\n        // DebugBreak();\n    }\n\n    InterlockedExchangeAdd(&dwSlept, dwEnd - dwBeg);\n    return ret;\n}\n\nDWORD WINAPI GetSleptTicks(VOID)\n{\n    return dwSlept;\n}\n\n//\n///////////////////////////////////////////////////////////////// End of File.\n\nint __cdecl main(void)\n{\n    int error = 0;\n\n    printf(\"sleepbed.exe: Starting.\\n\");\n    PVOID pbExeEntry = DetourGetEntryPoint(NULL);\n    printf(\"sleepbed.exe: ExeEntry=%p\\n\", pbExeEntry);\n\n    Verify(\"SleepEx\", (PVOID)SleepEx);\n    printf(\"\\n\");\n    fflush(stdout);\n\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n    DetourAttach(&(PVOID&)TrueSleepEx, TimedSleepEx);\n    error = DetourTransactionCommit();\n\n    if (error == NO_ERROR) {\n        printf(\"sleepbed.exe: Detoured SleepEx().\\n\");\n    }\n    else {\n        printf(\"sleepbed.exe: Error detouring SleepEx(): %d\\n\", error);\n        return error;\n    }\n    fflush(stdout);\n\n    printf(\"sleepbed.exe: After detour.\\n\");\n    Verify(\"SleepEx\", (PBYTE)SleepEx);\n    printf(\"\\n\");\n    fflush(stdout);\n\n    printf(\"sleepbed.exe: Calling Sleep for 1 second.\\n\");\n    Sleep(1000);\n    printf(\"sleepbed.exe: Calling SleepEx for 1 second.\\n\");\n    SleepEx(1000, true);\n    printf(\"sleepbed.exe: Calling Sleep again for 1 second.\\n\");\n    Sleep(1000);\n    printf(\"sleepbed.exe: Calling TimedSleepEx for 1 second.\\n\");\n    TimedSleepEx(1000, false);\n    printf(\"sleepbed.exe: Calling UntimedSleepEx for 1 second.\\n\");\n    UntimedSleepEx(1000, false);\n    printf(\"sleepbed.exe: Done sleeping.\\n\\n\");\n\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n    DetourDetach(&(PVOID&)TrueSleepEx, TimedSleepEx);\n    error = DetourTransactionCommit();\n    printf(\"sleepbed.exe: Removed SleepEx() detour (%d), slept %ld ticks.\\n\",\n           error, dwSlept);\n    fflush(stdout);\n\n    printf(\"sleepbed.exe: GetSleptTicks() = %ld\\n\\n\", GetSleptTicks());\n    return error;\n}\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/slept/sleepnew.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detour Test Program (sleepnew.cpp of sleepnew.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include <windows.h>\n#include <stdio.h>\n#include \"slept.h\"\n\n#include \"verify.cpp\"\n\nint __cdecl main(void)\n{\n    printf(\"sleepnew.exe: Starting.\\n\");\n    Verify(\"SleepEx\", (PBYTE)SleepEx);\n    printf(\"\\n\");\n    fflush(stdout);\n\n    printf(\"sleepnew.exe: Calling Sleep for 1 second.\\n\");\n    Sleep(1000);\n    printf(\"sleepnew.exe: Calling SleepEx for 1 second.\\n\");\n    SleepEx(1000, true);\n    printf(\"sleepnew.exe: Calling Sleep again for 1 second.\\n\");\n    Sleep(1000);\n    printf(\"sleepnew.exe: Calling TimedSleep for 1 second.\\n\");\n    TimedSleepEx(1000, FALSE);\n    printf(\"sleepnew.exe: Calling UntimedSleep for 1 second.\\n\");\n    UntimedSleepEx(1000, FALSE);\n    printf(\"sleepnew.exe: Done sleeping.\\n\\n\");\n\n#if 0\n    // This code enumerates the virtual address space and attempts to reserve\n    // all unused space below 8GB.\n    //\n    for (PBYTE pbTry = (PBYTE)0x10000; pbTry < (PBYTE)0x200000000;) {\n        MEMORY_BASIC_INFORMATION mbi;\n\n        if (!VirtualQuery(pbTry, &mbi, sizeof(mbi))) {\n            break;\n        }\n\n        if (mbi.State == MEM_FREE && mbi.RegionSize > 0x10000) {\n            PBYTE pbBase = (PBYTE)((((ULONG_PTR)pbTry) + 0xffff) & 0xffffffffffff0000);\n            SIZE_T cbTry = mbi.RegionSize & 0xffffffffffff0000;\n            if (cbTry > 0x40000000) {\n                cbTry = 0x40000000;\n            }\n            PVOID pvRegion = VirtualAlloc(pbBase, cbTry,\n                                          MEM_RESERVE,\n                                          PAGE_NOACCESS);\n            if (pvRegion == NULL) {\n                printf(\"---%p..%p failed.\\n\", pbBase, mbi.RegionSize - 0x10000);\n            }\n            else {\n                continue;\n            }\n        }\n\n        printf(\"   %p..%p %6x [%p]\\n\",\n               mbi.BaseAddress, (PBYTE)mbi.BaseAddress + mbi.RegionSize - 1,\n               mbi.State,\n               pbTry);\n\n        pbTry = (PBYTE)mbi.BaseAddress + mbi.RegionSize;\n    }\n#endif\n\n    printf(\"sleepnew.exe: GetSleptTicks() = %ld\\n\\n\", GetSleptTicks());\n    return 0;\n}\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/slept/sleepold.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detour Test Program (sleepold.cpp of sleepold.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include <windows.h>\n#include <stdio.h>\n\n#include \"verify.cpp\"\n\nint __cdecl main(int argc, char **argv)\n{\n    BOOL fQuiet = FALSE;\n\n    if (argc == 2 && _stricmp(argv[1], \"-quiet\") == 0) {\n        fQuiet = TRUE;\n    }\n\n    //\n    // Verify what the code looks like.\n    //\n    printf(\"sleepold.exe: Starting (at %p).\\n\", main);\n    if (!fQuiet) {\n        Verify(\"SleepEx\", (PBYTE)SleepEx);\n        printf(\"\\n\");\n    }\n    fflush(stdout);\n\n    //\n    // See if another process wants us to wait on a shared event.\n    // This helps in testing loading a DLL into a new process.\n\n    if (argc == 2 && _stricmp(argv[1], \"-wait\") == 0) {\n        HANDLE hEvent = OpenEventA(SYNCHRONIZE, FALSE, \"detours_load_test_event\");\n        if (hEvent) {\n            printf(\"sleepold.exe: Waiting for detours_load_test_event to be set.\\n\");\n            fflush(stdout);\n            WaitForSingleObject(hEvent, INFINITE);\n        }\n        else {\n            printf(\"sleepold.exe: Couldn't open detours_load_test_event.\\n\");\n        }\n    }\n\n    //\n    // Try out sleep (which may be detours).\n    //\n    printf(\"sleepold.exe: Calling Sleep for 1 second.\\n\");\n    Sleep(1000);\n\n    printf(\"sleepold.exe: Calling SleepEx for 1 second.\\n\");\n    SleepEx(1000, false);\n\n    printf(\"sleepold.exe: Calling Sleep again for 1 second.\\n\");\n    Sleep(1000);\n\n    // DebugBreak();\n\n    printf(\"sleepold.exe: Done sleeping.\\n\\n\");\n    fflush(stdout);\n\n    return 0;\n}\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/slept/slept.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detour Test Program (slept.cpp of slept.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#include <stdio.h>\n#include <windows.h>\n#include \"detours.h\"\n#include \"slept.h\"\n\n#include \"verify.cpp\"\n\nstatic BOOL fBroke = FALSE;\nstatic LONG dwSlept = 0;\nstatic DWORD (WINAPI * TrueSleepEx)(DWORD dwMilliseconds, BOOL bAlertable) = SleepEx;\n\nDWORD WINAPI UntimedSleepEx(DWORD dwMilliseconds, BOOL bAlertable)\n{\n    return TrueSleepEx(dwMilliseconds, bAlertable);\n}\n\nDWORD WINAPI TimedSleepEx(DWORD dwMilliseconds, BOOL bAlertable)\n{\n    DWORD dwBeg = GetTickCount();\n    DWORD ret = TrueSleepEx(dwMilliseconds, bAlertable);\n    DWORD dwEnd = GetTickCount();\n\n    if (!fBroke) {\n        fBroke = TRUE;\n        // DebugBreak();\n    }\n\n    InterlockedExchangeAdd(&dwSlept, dwEnd - dwBeg);\n    return ret;\n}\n\nDWORD WINAPI GetSleptTicks(VOID)\n{\n    return dwSlept;\n}\n\nDWORD WINAPI TestTicks(VOID)\n{\n    return TestTicksEx(0);\n}\n\nDWORD WINAPI TestTicksEx(DWORD Add)\n{\n    PDWORD pdw = new DWORD [Add + 1];\n\n    if (pdw != NULL) {\n        pdw[0] = dwSlept;\n        for (DWORD n = 1; n < Add + 1; n++) {\n            pdw[n] = pdw[n-1] + 1;\n        }\n\n        for (DWORD n = 1; n < Add + 1; n++) {\n            pdw[n-1] = pdw[n-1] - 1;\n        }\n\n        for (DWORD n = 1; n < Add + 1; n++) {\n            pdw[n] = pdw[n-1] + 1;\n        }\n\n        Add = pdw[Add] - Add;\n\n        delete [] pdw;\n    }\n    else {\n        Add = dwSlept + Add;\n    }\n\n    return Add;\n}\n\nBOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)\n{\n    LONG error;\n    (void)hinst;\n    (void)reserved;\n\n    if (DetourIsHelperProcess()) {\n        return TRUE;\n    }\n\n    if (dwReason == DLL_PROCESS_ATTACH) {\n        DetourRestoreAfterWith();\n\n        printf(\"slept\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll: \"\n               \" Starting.\\n\");\n        PVOID pbExeEntry = DetourGetEntryPoint(NULL);\n        PVOID pbDllEntry = DetourGetEntryPoint(hinst);\n        printf(\"slept\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll: \"\n               \" ExeEntry=%p, DllEntry=%p\\n\", pbExeEntry, pbDllEntry);\n\n        Verify(\"SleepEx\", (PVOID)SleepEx);\n        printf(\"\\n\");\n        fflush(stdout);\n\n        DetourTransactionBegin();\n        DetourUpdateThread(GetCurrentThread());\n        DetourAttach(&(PVOID&)TrueSleepEx, TimedSleepEx);\n        error = DetourTransactionCommit();\n\n        if (error == NO_ERROR) {\n            printf(\"slept\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll: \"\n                   \" Detoured SleepEx() @ %p.\\n\", TrueSleepEx);\n        }\n        else {\n            printf(\"slept\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll: \"\n                   \" Error detouring SleepEx(): %ld\\n\", error);\n        }\n    }\n    else if (dwReason == DLL_PROCESS_DETACH) {\n        DetourTransactionBegin();\n        DetourUpdateThread(GetCurrentThread());\n        DetourDetach(&(PVOID&)TrueSleepEx, TimedSleepEx);\n        error = DetourTransactionCommit();\n        printf(\"slept\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll: \"\n               \" Removed SleepEx() detour (%ld), slept %ld ticks.\\n\", error, dwSlept);\n        fflush(stdout);\n    }\n    return TRUE;\n}\n\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/slept/slept.h",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detour Test Program (slept.h of slept.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#pragma once\n\nDWORD WINAPI UntimedSleepEx(DWORD dwMilliseconds, BOOL bAlertable);\nDWORD WINAPI TimedSleepEx(DWORD dwMilliseconds, BOOL bAlertable);\nDWORD WINAPI GetSleptTicks(VOID);\nDWORD WINAPI TestTicks(VOID);\nDWORD WINAPI TestTicksEx(DWORD Add);\n\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/slept/slept.rc",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Version information for sleep.rc.\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include \"detver.h\"\n\n#define VER_INTERNALNAME_STR        \"sleep\" DETOURS_STRINGIFY(DETOURS_BITS)\n#define VER_ORIGINALFILENAME_STR    \"sleep\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\"\n#define VER_FILEDESCRIPTION_STR     \"Detours Sleep Test Module\"\n#define VER_COMPANYNAME_STR         \"Microsoft Corporation\"\n\n#include \"common.ver\"\n"
  },
  {
    "path": "ext/detours/samples/slept/verify.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detour Test Program (verify.cpp)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include <detours.h>\n\nstatic VOID Dump(PBYTE pbBytes, LONG nBytes, PBYTE pbTarget)\n{\n    for (LONG n = 0; n < nBytes; n += 16) {\n        printf(\"    %p: \", pbBytes + n);\n        for (LONG m = n; m < n + 16; m++) {\n            if (m >= nBytes) {\n                printf(\"  \");\n            }\n            else {\n                printf(\"%02x\", pbBytes[m]);\n            }\n            if (m % 4 == 3) {\n                printf(\" \");\n            }\n        }\n        if (n == 0 && pbTarget != DETOUR_INSTRUCTION_TARGET_NONE) {\n            printf(\" [%p]\", pbTarget);\n        }\n        printf(\"\\n\");\n    }\n}\n\nstatic VOID Decode(PCSTR pszDesc, PBYTE pbCode, PBYTE pbOther, PBYTE pbPointer, LONG nInst)\n{\n    if (pbCode != pbPointer) {\n        printf(\"  %s = %p [%p]\\n\", pszDesc, pbCode, pbPointer);\n    }\n    else {\n        printf(\"  %s = %p\\n\", pszDesc, pbCode);\n    }\n\n    if (pbCode == pbOther) {\n        printf(\"    ... unchanged ...\\n\");\n        return;\n    }\n\n    PBYTE pbSrc = pbCode;\n    PBYTE pbEnd;\n    PVOID pbTarget;\n    for (LONG n = 0; n < nInst; n++) {\n        pbEnd = (PBYTE)DetourCopyInstruction(NULL, NULL, pbSrc, &pbTarget, NULL);\n        Dump(pbSrc, (int)(pbEnd - pbSrc), (PBYTE)pbTarget);\n        pbSrc = pbEnd;\n    }\n}\n\n\nVOID WINAPI Verify(PCHAR pszFunc, PVOID pvPointer)\n{\n    PVOID pvCode = DetourCodeFromPointer(pvPointer, NULL);\n\n    Decode(pszFunc, (PBYTE)pvCode, NULL, (PBYTE)pvPointer, 3);\n}\n\nVOID WINAPI VerifyEx(PCHAR pszFunc, PVOID pvPointer, LONG nInst)\n{\n    PVOID pvCode = DetourCodeFromPointer(pvPointer, NULL);\n\n    Decode(pszFunc, (PBYTE)pvCode, NULL, (PBYTE)pvPointer, nInst);\n}\n\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/syelog/Makefile",
    "content": "##############################################################################\n##\n##  Makefile for Detours.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n##############################################################################\n\nTARGETOS=WINNT\n!include ..\\common.mak\n\nLIBS=$(LIBS) kernel32.lib\n\n##############################################################################\n\nall: dirs \\\n    $(INCD)\\syelog.h        \\\n    $(LIBD)\\syelog.lib  \\\n    $(BIND)\\syelogd.exe \\\n    \\\n    $(BIND)\\sltest.exe  \\\n    $(BIND)\\sltestp.exe     \\\n    \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\syelogd.bsc \\\n    $(OBJD)\\sltest.bsc  \\\n    $(OBJD)\\sltestp.bsc     \\\n!ENDIF\n\n##############################################################################\n##\nclean:\n    -del *~ test.txt 2> nul\n    -del $(INCD)\\syelog.* 2>nul\n    -del $(LIBD)\\syelog.* 2>nul\n    -del $(BIND)\\syelogd.* 2>nul\n    -del $(BIND)\\sltest.* 2>nul\n    -del $(BIND)\\sltestp.* 2>nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\n##############################################################################\n\ndirs:\n    @if not exist $(INCD) mkdir $(INCD) && echo.   Created $(INCD)\n    @if not exist $(LIBD) mkdir $(LIBD) && echo.   Created $(LIBD)\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\n$(OBJD)\\syelog.obj : syelog.cpp syelog.h\n$(OBJD)\\syelogd.obj: syelogd.cpp syelog.h\n$(OBJD)\\sltest.obj: sltest.cpp syelog.h\n$(OBJD)\\sltestp.obj: sltestp.cpp syelog.h\n\n$(INCD)\\syelog.h : syelog.h\n    copy syelog.h $@\n\n$(LIBD)\\syelog.lib : $(OBJD)\\syelog.obj\n    link /lib $(LIBFLAGS) /out:$@ $(OBJD)\\syelog.obj\n\n$(BIND)\\sltest.exe: $(OBJD)\\sltest.obj $(OBJD)\\syelog.obj $(DEPS)\n    $(CC) $(CFLAGS) /Fe$@ /Fd$(@R).pdb $(OBJD)\\sltest.obj \\\n        /link $(LINKFLAGS) $(LIBS)\n\n$(OBJD)\\sltest.bsc : $(OBJD)\\sltest.obj\n    bscmake /v /n /o $@ $(OBJD)\\sltest.sbr\n\n$(BIND)\\sltestp.exe: $(OBJD)\\sltestp.obj $(DEPS)\n    $(CC) $(CFLAGS) /Fe$@ /Fd$(@R).pdb $(OBJD)\\sltestp.obj \\\n        /link $(LINKFLAGS) $(LIBS)\n\n$(OBJD)\\sltestp.bsc : $(OBJD)\\sltestp.obj\n    bscmake /v /n /o $@ $(OBJD)\\sltestp.sbr\n\n$(LIBD)\\detours.lib:\n    cd $(ROOT)\\src\n    nmake /nologo\n    cd $(MAKEDIR)\n\n$(BIND)\\syelogd.exe: $(OBJD)\\syelogd.obj $(DEPS)\n    $(CC) $(CFLAGS) /Fe$@ /Fd$(@R).pdb $(OBJD)\\syelogd.obj \\\n        /link $(LINKFLAGS) ws2_32.lib mswsock.lib advapi32.lib\n\n$(OBJD)\\syelogd.bsc : $(OBJD)\\syelogd.obj\n    bscmake /v /n /o $@ $(OBJD)\\syelogd.sbr\n\n##############################################################################\n\ntest: $(BIND)\\syelogd.exe $(BIND)\\sltest.exe $(BIND)\\sltestp.exe\n    @echo -------- Logging output to test.txt ------------\n    start $(BIND)\\syelogd.exe test.txt\n    $(BIND)\\sleep5.exe 1\n    $(BIND)\\sltestp.exe\n    $(BIND)\\sltest.exe /x\n    type test.txt\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/syelog/sltest.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (sltest.cpp of sltest.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n//  Test the named-pipe-based connection with syelog.lib to the syelog\n//  system-event logger.\n//\n#include <windows.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <stddef.h>\n#pragma warning(push)\n#if _MSC_VER > 1400\n#pragma warning(disable:6102 6103) // /analyze warnings\n#endif\n#include <strsafe.h>\n#pragma warning(pop)\n#include \"syelog.h\"\n#include \"detours.h\"\n\nextern \"C\" {\n\n    HANDLE ( WINAPI *\n             Real_CreateFileW)(LPCWSTR a0,\n                               DWORD a1,\n                               DWORD a2,\n                               LPSECURITY_ATTRIBUTES a3,\n                               DWORD a4,\n                               DWORD a5,\n                               HANDLE a6)\n        = CreateFileW;\n\n    BOOL ( WINAPI *\n           Real_WriteFile)(HANDLE hFile,\n                           LPCVOID lpBuffer,\n                           DWORD nNumberOfBytesToWrite,\n                           LPDWORD lpNumberOfBytesWritten,\n                           LPOVERLAPPED lpOverlapped)\n        = WriteFile;\n    BOOL ( WINAPI *\n           Real_FlushFileBuffers)(HANDLE hFile)\n        = FlushFileBuffers;\n    BOOL ( WINAPI *\n           Real_CloseHandle)(HANDLE hObject)\n        = CloseHandle;\n\n    BOOL ( WINAPI *\n           Real_WaitNamedPipeW)(LPCWSTR lpNamedPipeName, DWORD nTimeOut)\n        = WaitNamedPipeW;\n    BOOL ( WINAPI *\n           Real_SetNamedPipeHandleState)(HANDLE hNamedPipe,\n                                         LPDWORD lpMode,\n                                         LPDWORD lpMaxCollectionCount,\n                                         LPDWORD lpCollectDataTimeout)\n        = SetNamedPipeHandleState;\n\n    DWORD ( WINAPI *\n            Real_GetCurrentProcessId)(VOID)\n        = GetCurrentProcessId;\n    VOID ( WINAPI *\n           Real_GetSystemTimeAsFileTime)(LPFILETIME lpSystemTimeAsFileTime)\n        = GetSystemTimeAsFileTime;\n\n    VOID ( WINAPI *\n           Real_InitializeCriticalSection)(LPCRITICAL_SECTION lpSection)\n        = InitializeCriticalSection;\n    VOID ( WINAPI *\n           Real_EnterCriticalSection)(LPCRITICAL_SECTION lpSection)\n        = EnterCriticalSection;\n    VOID ( WINAPI *\n           Real_LeaveCriticalSection)(LPCRITICAL_SECTION lpSection)\n        = LeaveCriticalSection;\n}\n\nint main(int argc, char **argv)\n{\n    BOOL fNeedHelp = FALSE;\n    BOOL fRequestExitOnClose = FALSE;\n\n    int arg = 1;\n    for (; arg < argc && (argv[arg][0] == '-' || argv[arg][0] == '/'); arg++) {\n        CHAR *argn = argv[arg] + 1;\n        CHAR *argp = argn;\n        while (*argp && *argp != ':') {\n            argp++;\n        }\n        if (*argp == ':') {\n            *argp++ = '\\0';\n        }\n\n        switch (argn[0]) {\n\n          case 'x':                                 // Request exit on close.\n          case 'X':\n            fRequestExitOnClose = TRUE;\n            break;\n\n          case '?':                                 // Help.\n            fNeedHelp = TRUE;\n            break;\n\n          default:\n            fNeedHelp = TRUE;\n            printf(\"SLTEST: Bad argument: %s:%s\\n\", argn, argp);\n            break;\n        }\n    }\n\n    if (fNeedHelp) {\n        printf(\"Usage:\\n\"\n               \"    sltest.exe [options] message\\n\"\n               \"Options:\\n\"\n               \"    /x         Ask syelogd.exe to terminate when this connect closes.\\n\"\n               \"    /?         Display this help message.\\n\"\n               \"\\n\");\n        exit(1);\n    }\n\n    SyelogOpen(\"sltest\", SYELOG_FACILITY_APPLICATION);\n    if (arg >= argc) {\n        Syelog(SYELOG_SEVERITY_INFORMATION, \"Hello World! [1 of 4]\");\n        Syelog(SYELOG_SEVERITY_INFORMATION, \"Hello World! [2 of 4]\");\n        Syelog(SYELOG_SEVERITY_INFORMATION, \"Hello World! [3 of 4]\");\n        Syelog(SYELOG_SEVERITY_INFORMATION, \"Hello World! [4 of 4]\");\n    }\n    else {\n        CHAR Buffer[1024] = \"\";\n\n        for (; arg < argc; arg++) {\n            StringCchCatA(Buffer, ARRAYSIZE(Buffer), argv[arg]);\n            if (arg + 1 < argc) {\n                StringCchCatA(Buffer, ARRAYSIZE(Buffer), \" \");\n            }\n        }\n        Syelog(SYELOG_SEVERITY_INFORMATION, Buffer);\n    }\n\n    SyelogClose(fRequestExitOnClose);\n\n    return 0;\n}\n"
  },
  {
    "path": "ext/detours/samples/syelog/sltestp.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (sltestp.cpp of sltestp.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n//  Test the named-pipe-based connection to the syelog system-event logger.\n//\n#include <windows.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <stddef.h>\n#pragma warning(push)\n#if _MSC_VER > 1400\n#pragma warning(disable:6102 6103) // /analyze warnings\n#endif\n#include <strsafe.h>\n#pragma warning(pop)\n#include \"syelog.h\"\n\nVOID MyErrExit(PCSTR pszMsg)\n{\n    fprintf(stderr, \"Error %s: %ld\\n\", pszMsg, GetLastError());\n    exit(1);\n}\n\nDWORD main(int argc, char *argv[])\n{\n    HANDLE hPipe;\n    SYELOG_MESSAGE Message;\n    BOOL fSuccess;\n    DWORD cbWritten, dwMode;\n\n    // Try to open a named pipe; wait for it, if necessary.\n\n    TIME_ZONE_INFORMATION tzi;\n    GetTimeZoneInformation(&tzi);\n\n    for (;;) {\n        hPipe = CreateFileW(SYELOG_PIPE_NAMEW,  // pipe name\n                            GENERIC_WRITE,      // write access only\n                            0,                  // no sharing\n                            NULL,               // no security attributes\n                            OPEN_EXISTING,      // opens existing pipe\n                            0,                  // default attributes\n                            NULL);              // no template file\n\n        // Break if the pipe handle is valid.\n         if (hPipe != INVALID_HANDLE_VALUE)\n            break;\n\n        // Exit if an error other than ERROR_PIPE_BUSY occurs.\n\n        if (GetLastError() != ERROR_PIPE_BUSY)\n            MyErrExit(\"Could not open pipe\");\n\n        // All pipe instances are busy, so wait for 1 seconds.\n\n        if (!WaitNamedPipeW(SYELOG_PIPE_NAMEW, 1000))\n            MyErrExit(\"Could not open pipe\");\n    }\n\n    // The pipe connected; change to message-read mode.\n    dwMode = PIPE_READMODE_MESSAGE;\n    fSuccess = SetNamedPipeHandleState(hPipe,    // pipe handle\n                                       &dwMode,  // new pipe mode\n                                       NULL,     // don't set maximum bytes\n                                       NULL);    // don't set maximum time\n    if (!fSuccess)\n        MyErrExit(\"SetNamedPipeHandleState\");\n\n    // Send a message to the pipe server.\n\n    memset(&Message, 0, sizeof(Message));\n\n    StringCchCopyA(Message.szMessage, ARRAYSIZE(Message.szMessage),\n                   (argc > 1) ? argv[1] : \"sltestp: hello world!\");\n\n    Message.nFacility = SYELOG_FACILITY_APPLICATION;\n    Message.nSeverity = SYELOG_SEVERITY_INFORMATION;\n    Message.nProcessId = GetCurrentProcessId();\n    GetSystemTimeAsFileTime(&Message.ftOccurance);\n    PCSTR pszEnd = Message.szMessage;\n    for (; *pszEnd; pszEnd++) {\n        // no internal contents.\n    }\n    Message.nBytes = (USHORT)(pszEnd - ((PCSTR)&Message) + 1);\n\n    fSuccess = WriteFile(hPipe,                  // pipe handle\n                         &Message,             // message\n                         Message.nBytes, // message length\n                         &cbWritten,             // bytes written\n                         NULL);                  // not overlapped\n    if (! fSuccess)\n        MyErrExit(\"WriteFile\");\n\n    CloseHandle(hPipe);\n\n    GetTimeZoneInformation(&tzi);\n\n    return 0;\n}\n"
  },
  {
    "path": "ext/detours/samples/syelog/syelog.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (syelog.cpp of syelog.lib)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#include <windows.h>\n#include <stdarg.h>\n#include <stddef.h>\n#include <stdlib.h>\n#include \"detours.h\"\n#include \"syelog.h\"\n\n#include <stdio.h>\n\n//////////////////////////////////////////////////////////////////////////////\nextern \"C\" {\n    extern HANDLE ( WINAPI * Real_CreateFileW)(LPCWSTR a0,\n                                               DWORD a1,\n                                               DWORD a2,\n                                               LPSECURITY_ATTRIBUTES a3,\n                                               DWORD a4,\n                                               DWORD a5,\n                                               HANDLE a6);\n    extern BOOL ( WINAPI * Real_WriteFile)(HANDLE hFile,\n                                           LPCVOID lpBuffer,\n                                           DWORD nNumberOfBytesToWrite,\n                                           LPDWORD lpNumberOfBytesWritten,\n                                           LPOVERLAPPED lpOverlapped);\n    extern BOOL ( WINAPI * Real_FlushFileBuffers)(HANDLE hFile);\n    extern BOOL ( WINAPI * Real_CloseHandle)(HANDLE hObject);\n\n    extern BOOL ( WINAPI * Real_WaitNamedPipeW)(LPCWSTR lpNamedPipeName, DWORD nTimeOut);\n    extern BOOL ( WINAPI * Real_SetNamedPipeHandleState)(HANDLE hNamedPipe,\n                                                         LPDWORD lpMode,\n                                                         LPDWORD lpMaxCollectionCount,\n                                                         LPDWORD lpCollectDataTimeout);\n\n    extern DWORD ( WINAPI * Real_GetCurrentProcessId)(VOID);\n    extern VOID ( WINAPI * Real_GetSystemTimeAsFileTime)(LPFILETIME lpSystemTimeAsFileTime);\n\n    extern VOID ( WINAPI * Real_InitializeCriticalSection)(LPCRITICAL_SECTION lpSection);\n    extern VOID ( WINAPI * Real_EnterCriticalSection)(LPCRITICAL_SECTION lpSection);\n    extern VOID ( WINAPI * Real_LeaveCriticalSection)(LPCRITICAL_SECTION lpSection);\n}\n\n///////////////////////////////////////////////////////////////////// VPrintf.\n//\n// Completely side-effect free printf replacement (but no FP numbers).\n//\nstatic PCHAR do_base(PCHAR pszOut, UINT64 nValue, UINT nBase, PCSTR pszDigits)\n{\n    CHAR szTmp[96];\n    int nDigit = sizeof(szTmp)-2;\n    for (; nDigit >= 0; nDigit--) {\n        szTmp[nDigit] = pszDigits[nValue % nBase];\n        nValue /= nBase;\n    }\n    for (nDigit = 0; nDigit < sizeof(szTmp) - 2 && szTmp[nDigit] == '0'; nDigit++) {\n        // skip leading zeros.\n    }\n    for (; nDigit < sizeof(szTmp) - 1; nDigit++) {\n        *pszOut++ = szTmp[nDigit];\n    }\n    *pszOut = '\\0';\n    return pszOut;\n}\n\nstatic PCHAR do_str(PCHAR pszOut, PCHAR pszEnd, PCSTR pszIn)\n{\n    while (*pszIn && pszOut < pszEnd) {\n        *pszOut++ = *pszIn++;\n    }\n    *pszOut = '\\0';\n    return pszOut;\n}\n\nstatic PCHAR do_wstr(PCHAR pszOut, PCHAR pszEnd, PCWSTR pszIn)\n{\n    while (*pszIn && pszOut < pszEnd) {\n        *pszOut++ = (CHAR)*pszIn++;\n    }\n    *pszOut = '\\0';\n    return pszOut;\n}\n\nstatic PCHAR do_estr(PCHAR pszOut, PCHAR pszEnd, PCSTR pszIn)\n{\n    while (*pszIn && pszOut < pszEnd) {\n        if (*pszIn == '<') {\n            if (pszOut + 4 > pszEnd) {\n                break;\n            }\n            pszIn++;\n            *pszOut++ = '&';\n            *pszOut++ = 'l';\n            *pszOut++ = 't';\n            *pszOut++ = ';';\n        }\n        else if (*pszIn == '>') {\n            if (pszOut + 4 > pszEnd) {\n                break;\n            }\n            pszIn++;\n            *pszOut++ = '&';\n            *pszOut++ = 'g';\n            *pszOut++ = 't';\n            *pszOut++ = ';';\n        }\n        else if (*pszIn == '&') {\n            if (pszOut + 5 > pszEnd) {\n                break;\n            }\n            pszIn++;\n            *pszOut++ = '&';\n            *pszOut++ = 'a';\n            *pszOut++ = 'm';\n            *pszOut++ = 'p';\n            *pszOut++ = ';';\n        }\n        else if (*pszIn == '\\\"') {\n            if (pszOut + 6 > pszEnd) {\n                break;\n            }\n            pszIn++;\n            *pszOut++ = '&';\n            *pszOut++ = 'q';\n            *pszOut++ = 'u';\n            *pszOut++ = 'o';\n            *pszOut++ = 't';\n            *pszOut++ = ';';\n        }\n        else if (*pszIn == '\\'') {\n            if (pszOut + 6 > pszEnd) {\n                break;\n            }\n            pszIn++;\n            *pszOut++ = '&';\n            *pszOut++ = 'a';\n            *pszOut++ = 'p';\n            *pszOut++ = 'o';\n            *pszOut++ = 's';\n            *pszOut++ = ';';\n        }\n        else if (*pszIn  < ' ') {\n            BYTE c = (BYTE)(*pszIn++);\n            if (c < 10 && pszOut + 4 <= pszEnd) {\n                *pszOut++ = '&';\n                *pszOut++ = '#';\n                *pszOut++ = '0' + (c % 10);\n                *pszOut++ = ';';\n            }\n            else if (c < 100 && pszOut + 5 <= pszEnd) {\n                *pszOut++ = '&';\n                *pszOut++ = '#';\n                *pszOut++ = '0' + ((c / 10) % 10);\n                *pszOut++ = '0' + (c % 10);\n                *pszOut++ = ';';\n            }\n            else if (c < 1000 && pszOut + 6 <= pszEnd) {\n                *pszOut++ = '&';\n                *pszOut++ = '#';\n                *pszOut++ = '0' + ((c / 100) % 10);\n                *pszOut++ = '0' + ((c / 10) % 10);\n                *pszOut++ = '0' + (c % 10);\n                *pszOut++ = ';';\n            }\n            else {\n                break;\n            }\n        }\n        else {\n            *pszOut++ = *pszIn++;\n        }\n    }\n    *pszOut = '\\0';\n    return pszOut;\n}\n\nstatic PCHAR do_ewstr(PCHAR pszOut, PCHAR pszEnd, PCWSTR pszIn)\n{\n    while (*pszIn && pszOut < pszEnd) {\n        if (*pszIn == '<') {\n            if (pszOut + 4 > pszEnd) {\n                break;\n            }\n            pszIn++;\n            *pszOut++ = '&';\n            *pszOut++ = 'l';\n            *pszOut++ = 't';\n            *pszOut++ = ';';\n        }\n        else if (*pszIn == '>') {\n            if (pszOut + 4 > pszEnd) {\n                break;\n            }\n            pszIn++;\n            *pszOut++ = '&';\n            *pszOut++ = 'g';\n            *pszOut++ = 't';\n            *pszOut++ = ';';\n        }\n        else if (*pszIn == '&') {\n            if (pszOut + 5 > pszEnd) {\n                break;\n            }\n            pszIn++;\n            *pszOut++ = '&';\n            *pszOut++ = 'a';\n            *pszOut++ = 'm';\n            *pszOut++ = 'p';\n            *pszOut++ = ';';\n        }\n        else if (*pszIn == '\\\"') {\n            if (pszOut + 6 > pszEnd) {\n                break;\n            }\n            pszIn++;\n            *pszOut++ = '&';\n            *pszOut++ = 'q';\n            *pszOut++ = 'u';\n            *pszOut++ = 'o';\n            *pszOut++ = 't';\n            *pszOut++ = ';';\n        }\n        else if (*pszIn == '\\'') {\n            if (pszOut + 6 > pszEnd) {\n                break;\n            }\n            pszIn++;\n            *pszOut++ = '&';\n            *pszOut++ = 'a';\n            *pszOut++ = 'p';\n            *pszOut++ = 'o';\n            *pszOut++ = 's';\n            *pszOut++ = ';';\n        }\n        else if (*pszIn  < ' ' || *pszIn > 127) {\n            WCHAR c = *pszIn++;\n            if (c < 10 && pszOut + 4 <= pszEnd) {\n                *pszOut++ = '&';\n                *pszOut++ = '#';\n                *pszOut++ = '0' + (CHAR)(c % 10);\n                *pszOut++ = ';';\n            }\n            else if (c < 100 && pszOut + 5 <= pszEnd) {\n                *pszOut++ = '&';\n                *pszOut++ = '#';\n                *pszOut++ = '0' + (CHAR)((c / 10) % 10);\n                *pszOut++ = '0' + (CHAR)(c % 10);\n                *pszOut++ = ';';\n            }\n            else if (c < 1000 && pszOut + 6 <= pszEnd) {\n                *pszOut++ = '&';\n                *pszOut++ = '#';\n                *pszOut++ = '0' + (CHAR)((c / 100) % 10);\n                *pszOut++ = '0' + (CHAR)((c / 10) % 10);\n                *pszOut++ = '0' + (CHAR)(c % 10);\n                *pszOut++ = ';';\n            }\n            else {\n                break;\n            }\n        }\n        else {\n            *pszOut++ = (CHAR)*pszIn++;\n        }\n    }\n    *pszOut = '\\0';\n    return pszOut;\n}\n\n#if _MSC_VER >= 1900\n#pragma warning(push)\n#pragma warning(disable:4456) // declaration hides previous local declaration\n#endif\n\nVOID VSafePrintf(PCSTR pszMsg, va_list args, PCHAR pszBuffer, LONG cbBuffer)\n{\n    PCHAR pszOut = pszBuffer;\n    PCHAR pszEnd = pszBuffer + cbBuffer - 1;\n    pszBuffer[0] = '\\0';\n\n    __try {\n        while (*pszMsg && pszOut < pszEnd) {\n            if (*pszMsg == '%') {\n                CHAR szHead[4] = \"\";\n                INT nLen;\n                INT nWidth = 0;\n                INT nPrecision = 0;\n                BOOL fLeft = FALSE;\n                BOOL fPositive = FALSE;\n                BOOL fPound = FALSE;\n                BOOL fBlank = FALSE;\n                BOOL fZero = FALSE;\n                BOOL fDigit = FALSE;\n                BOOL fSmall = FALSE;\n                BOOL fLarge = FALSE;\n                BOOL f64Bit = FALSE;\n                PCSTR pszArg = pszMsg;\n\n                pszMsg++;\n\n                for (; (*pszMsg == '-' ||\n                        *pszMsg == '+' ||\n                        *pszMsg == '#' ||\n                        *pszMsg == ' ' ||\n                        *pszMsg == '0'); pszMsg++) {\n                    switch (*pszMsg) {\n                      case '-': fLeft = TRUE; break;\n                      case '+': fPositive = TRUE; break;\n                      case '#': fPound = TRUE; break;\n                      case ' ': fBlank = TRUE; break;\n                      case '0': fZero = TRUE; break;\n                    }\n                }\n\n                if (*pszMsg == '*') {\n                    nWidth = va_arg(args, INT);\n                    pszMsg++;\n                }\n                else {\n                    while (*pszMsg >= '0' && *pszMsg <= '9') {\n                        nWidth = nWidth * 10 + (*pszMsg++ - '0');\n                    }\n                }\n                if (*pszMsg == '.') {\n                    pszMsg++;\n                    fDigit = TRUE;\n                    if (*pszMsg == '*') {\n                        nPrecision = va_arg(args, INT);\n                        pszMsg++;\n                    }\n                    else {\n                        while (*pszMsg >= '0' && *pszMsg <= '9') {\n                            nPrecision = nPrecision * 10 + (*pszMsg++ - '0');\n                        }\n                    }\n                }\n\n                if (*pszMsg == 'h') {\n                    fSmall = TRUE;\n                    pszMsg++;\n                }\n                else if (*pszMsg == 'l') {\n                    fLarge = TRUE;\n                    pszMsg++;\n                }\n                else if (*pszMsg == 'I' && pszMsg[1] == '6' && pszMsg[2] == '4') {\n                    f64Bit = TRUE;\n                    pszMsg += 3;\n                }\n\n                if (*pszMsg == 's' || *pszMsg == 'e' || *pszMsg == 'c') {\n                    // We ignore the length, precision, and alignment\n                    // to avoid using a temporary buffer.\n\n                    if (*pszMsg == 's') { // [GalenH] need to not use temp.\n                        PVOID pvData = va_arg(args, PVOID);\n\n                        pszMsg++;\n\n                        if (fSmall) {\n                            fLarge = FALSE;\n                        }\n\n                        __try {\n                            if (pvData == NULL) {\n                                pszOut = do_str(pszOut, pszEnd, \"<NULL>\");\n                            }\n                            else if (pvData < (PVOID)0x10000) {\n                                pszOut = do_str(pszOut, pszEnd, \"#\");\n                                pszOut = do_base(pszOut, (UINT64)pvData, 16,\n                                             \"0123456789ABCDEF\");\n                                pszOut = do_str(pszOut, pszEnd, \"#\");\n                            }\n                            else if (fLarge) {\n                                pszOut = do_wstr(pszOut, pszEnd, (PWCHAR)pvData);\n                            }\n                            else {\n                                pszOut = do_str(pszOut, pszEnd, (PCHAR)pvData);\n                            }\n                        } __except(EXCEPTION_EXECUTE_HANDLER) {\n                            pszOut = do_str(pszOut, pszEnd, \"-\");\n                            pszOut = do_base(pszOut, (UINT64)pvData, 16,\n                                             \"0123456789ABCDEF\");\n                            pszOut = do_str(pszOut, pszEnd, \"-\");\n                        }\n                    }\n                    else if (*pszMsg == 'e')    {   // Escape the string.\n                        PVOID pvData = va_arg(args, PVOID);\n\n                        pszMsg++;\n\n                        if (fSmall) {\n                            fLarge = FALSE;\n                        }\n\n                        __try {\n                            if (pvData == NULL) {\n                                pszOut = do_str(pszOut, pszEnd, \"<NULL>\");\n                            }\n                            else if (pvData < (PVOID)0x10000) {\n                                pszOut = do_str(pszOut, pszEnd, \">\");\n                                pszOut = do_base(pszOut, (UINT64)pvData, 16,\n                                             \"0123456789ABCDEF\");\n                                pszOut = do_str(pszOut, pszEnd, \">\");\n                            }\n                            else if (fLarge) {\n                                pszOut = do_ewstr(pszOut, pszEnd, (PWCHAR)pvData);\n                            }\n                            else {\n                                pszOut = do_estr(pszOut, pszEnd, (PCHAR)pvData);\n                            }\n                        } __except(EXCEPTION_EXECUTE_HANDLER) {\n                            pszOut = do_str(pszOut, pszEnd, \"-\");\n                            pszOut = do_base(pszOut, (UINT64)pvData, 16,\n                                             \"0123456789ABCDEF\");\n                            pszOut = do_str(pszOut, pszEnd, \"-\");\n                        }\n                    }\n                    else {\n                        CHAR szTemp[2];\n                        pszMsg++;\n\n                        szTemp[0] = (CHAR)va_arg(args, INT);\n                        szTemp[1] = '\\0';\n                        pszOut = do_str(pszOut, pszEnd, szTemp);\n                    }\n                }\n                else if (*pszMsg == 'd' || *pszMsg == 'i' || *pszMsg == 'o' ||\n                         *pszMsg == 'x' || *pszMsg == 'X' || *pszMsg == 'b' ||\n                         *pszMsg == 'u') {\n                    CHAR szTemp[128];\n                    UINT64 value;\n                    if (f64Bit) {\n                        value = va_arg(args, UINT64);\n                    }\n                    else {\n                        value = va_arg(args, UINT);\n                    }\n\n                    if (*pszMsg == 'x') {\n                        pszMsg++;\n                        nLen = (int)(do_base(szTemp, value, 16, \"0123456789abcdef\") - szTemp);\n                        if (fPound && value) {\n                            do_str(szHead, szHead + sizeof(szHead) - 1, \"0x\");\n                        }\n                    }\n                    else if (*pszMsg == 'X') {\n                        pszMsg++;\n                        nLen = (int)(do_base(szTemp, value, 16, \"0123456789ABCDEF\") - szTemp);\n                        if (fPound && value) {\n                            do_str(szHead, szHead + sizeof(szHead) - 1, \"0X\");\n                        }\n                    }\n                    else if (*pszMsg == 'd') {\n                        pszMsg++;\n                        if ((INT64)value < 0) {\n                            value = -(INT64)value;\n                            do_str(szHead, szHead + sizeof(szHead) - 1, \"-\");\n                        }\n                        else if (fPositive) {\n                            if (value > 0) {\n                                do_str(szHead, szHead + sizeof(szHead) - 1, \"+\");\n                            }\n                        }\n                        else if (fBlank) {\n                            if (value > 0) {\n                                do_str(szHead, szHead + sizeof(szHead) - 1, \" \");\n                            }\n                        }\n                        nLen = (int)(do_base(szTemp, value, 10, \"0123456789\") - szTemp);\n                        nPrecision = 0;\n                    }\n                    else if (*pszMsg == 'u') {\n                        pszMsg++;\n                        nLen = (int)(do_base(szTemp, value, 10, \"0123456789\") - szTemp);\n                        nPrecision = 0;\n                    }\n                    else if (*pszMsg == 'o') {\n                        pszMsg++;\n                        nLen = (int)(do_base(szTemp, value, 8, \"01234567\") - szTemp);\n                        nPrecision = 0;\n\n                        if (fPound && value) {\n                            do_str(szHead, szHead + sizeof(szHead) - 1, \"0\");\n                        }\n                    }\n                    else if (*pszMsg == 'b') {\n                        pszMsg++;\n                        nLen = (int)(do_base(szTemp, value, 2, \"01\") - szTemp);\n                        nPrecision = 0;\n\n                        if (fPound && value) {\n                            do_str(szHead, szHead + sizeof(szHead) - 1, \"0b\");\n                        }\n                    }\n                    else {\n                        pszMsg++;\n                        if ((INT64)value < 0) {\n                            value = -(INT64)value;\n                            do_str(szHead, szHead + sizeof(szHead) - 1, \"-\");\n                        }\n                        else if (fPositive) {\n                            if (value > 0) {\n                                do_str(szHead, szHead + sizeof(szHead) - 1, \"+\");\n                            }\n                        }\n                        else if (fBlank) {\n                            if (value > 0) {\n                                do_str(szHead, szHead + sizeof(szHead) - 1, \" \");\n                            }\n                        }\n                        nLen = (int)(do_base(szTemp, value, 10, \"0123456789\") - szTemp);\n                        nPrecision = 0;\n                    }\n\n                    INT nHead = 0;\n                    for (; szHead[nHead]; nHead++) {\n                        // Count characters in head string.\n                    }\n\n                    if (fLeft) {\n                        if (nHead) {\n                            pszOut = do_str(pszOut, pszEnd, szHead);\n                            nLen += nHead;\n                        }\n                        pszOut = do_str(pszOut, pszEnd, szTemp);\n                        for (; nLen < nWidth && pszOut < pszEnd; nLen++) {\n                            *pszOut++ = ' ';\n                        }\n                    }\n                    else if (fZero) {\n                        if (nHead) {\n                            pszOut = do_str(pszOut, pszEnd, szHead);\n                            nLen += nHead;\n                        }\n                        for (; nLen < nWidth && pszOut < pszEnd; nLen++) {\n                            *pszOut++ = '0';\n                        }\n                        pszOut = do_str(pszOut, pszEnd, szTemp);\n                    }\n                    else {\n                        if (nHead) {\n                            nLen += nHead;\n                        }\n                        for (; nLen < nWidth && pszOut < pszEnd; nLen++) {\n                            *pszOut++ = ' ';\n                        }\n                        if (nHead) {\n                            pszOut = do_str(pszOut, pszEnd, szHead);\n                        }\n                        pszOut = do_str(pszOut, pszEnd, szTemp);\n                    }\n                }\n                else if (*pszMsg == 'p') {\n                    CHAR szTemp[64];\n                    ULONG_PTR value;\n                    value = va_arg(args, ULONG_PTR);\n\n                    if ((INT64)value == (INT64)-1 ||\n                        (INT64)value == (INT64)-2) {\n                        if (*pszMsg == 'p') {\n                            pszMsg++;\n                        }\n                        szTemp[0] = '-';\n                        szTemp[1] = ((INT64)value == (INT64)-1) ? '1' : '2';\n                        szTemp[2] = '\\0';\n                        nLen = 2;\n                    }\n                    else {\n                        if (*pszMsg == 'p') {\n                            pszMsg++;\n                            nLen = (int)(do_base(szTemp, (UINT64)value, 16, \"0123456789abcdef\") - szTemp);\n                            if (fPound && value) {\n                                do_str(szHead, szHead + sizeof(szHead) - 1, \"0x\");\n                            }\n                        }\n                        else {\n                            pszMsg++;\n                            nLen = (int)(do_base(szTemp, (UINT64)value, 16, \"0123456789ABCDEF\") - szTemp);\n                            if (fPound && value) {\n                                do_str(szHead, szHead + sizeof(szHead) - 1, \"0x\");\n                            }\n                        }\n                    }\n\n                    INT nHead = 0;\n                    for (; szHead[nHead]; nHead++) {\n                        // Count characters in head string.\n                    }\n\n                    if (nHead) {\n                        pszOut = do_str(pszOut, pszEnd, szHead);\n                        nLen += nHead;\n                    }\n                    for (; nLen < nWidth && pszOut < pszEnd; nLen++) {\n                        *pszOut++ = '0';\n                    }\n                    pszOut = do_str(pszOut, pszEnd, szTemp);\n                }\n                else {\n                    pszMsg++;\n                    while (pszArg < pszMsg && pszOut < pszEnd) {\n                        *pszOut++ = *pszArg++;\n                    }\n                }\n            }\n            else {\n                if (pszOut < pszEnd) {\n                    *pszOut++ = *pszMsg++;\n                }\n            }\n        }\n        *pszOut = '\\0';\n        pszBuffer[cbBuffer - 1] = '\\0';\n    } __except(EXCEPTION_EXECUTE_HANDLER) {\n        PCHAR pszOut = pszBuffer;\n        *pszOut = '\\0';\n        pszOut = do_str(pszOut, pszEnd, \"-exception:\");\n        pszOut = do_base(pszOut, (UINT64)GetExceptionCode(), 10, \"0123456789\");\n        pszOut = do_str(pszOut, pszEnd, \"-\");\n    }\n}\n\n#if _MSC_VER >= 1900\n#pragma warning(pop)\n#endif\n\nPCHAR SafePrintf(PCHAR pszBuffer, LONG cbBuffer, PCSTR pszMsg, ...)\n{\n    va_list args;\n    va_start(args, pszMsg);\n    VSafePrintf(pszMsg, args, pszBuffer, cbBuffer);\n    va_end(args);\n\n    while (*pszBuffer) {\n        pszBuffer++;\n    }\n    return pszBuffer;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nstatic CRITICAL_SECTION s_csPipe;                       // Guards access to hPipe.\nstatic HANDLE           s_hPipe = INVALID_HANDLE_VALUE;\nstatic DWORD            s_nPipeError = 0;\nstatic FILETIME         s_ftRetry = {0,0};\nstatic BYTE             s_nFacility = SYELOG_FACILITY_APPLICATION;\nstatic CHAR             s_szIdent[256] = \"\";\nstatic DWORD            s_nProcessId = 0;\n\nstatic inline INT syelogCompareTimes(CONST PFILETIME pft1, CONST PFILETIME pft2)\n{\n    INT64 ut1 = *(PINT64)pft1;\n    INT64 ut2 = *(PINT64)pft2;\n\n    if (ut1 < ut2) {\n        return -1;\n    }\n    else if (ut1 > ut2) {\n        return 1;\n    }\n    else {\n        return 0;\n    }\n}\n\nstatic inline VOID syelogAddMilliseconds(PFILETIME pft, DWORD nMilliseconds)\n{\n    *(PINT64&)pft += ((INT64)nMilliseconds * 10000);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// Tries to insure that a named-pipe connection to the system log is open\n// If the pipe closes, the next call will immediately try to re-open the pipe.\n// If the pipe doesn't open again, we wait 5 minutes before trying again.\n// We wait 5 minutes, because each attempt may take up to a full second to\n// time out.\n//\nstatic BOOL syelogIsOpen(PFILETIME pftLog)\n{\n    if (s_hPipe != INVALID_HANDLE_VALUE) {\n        return TRUE;\n    }\n\n    if (syelogCompareTimes(pftLog, &s_ftRetry) < 0) {\n        return FALSE;\n    }\n\n    s_hPipe = Real_CreateFileW(SYELOG_PIPE_NAMEW,\n                               GENERIC_WRITE, 0, NULL, OPEN_EXISTING,\n                               SECURITY_ANONYMOUS, NULL);\n    if (s_hPipe != INVALID_HANDLE_VALUE) {\n        DWORD dwMode = PIPE_READMODE_MESSAGE;\n        if (Real_SetNamedPipeHandleState(s_hPipe, &dwMode, NULL, NULL)) {\n            return TRUE;\n        }\n    }\n\n    if (Real_WaitNamedPipeW(SYELOG_PIPE_NAMEW, 2000)) { // Wait 2 seconds.\n        // Pipe connected, change to message-read mode.\n        //\n        s_hPipe = Real_CreateFileW(SYELOG_PIPE_NAMEW,\n                                   GENERIC_WRITE, 0, NULL, OPEN_EXISTING,\n                                   SECURITY_ANONYMOUS, NULL);\n        if (s_hPipe != INVALID_HANDLE_VALUE) {\n            DWORD dwMode = PIPE_READMODE_MESSAGE;\n            if (Real_SetNamedPipeHandleState(s_hPipe, &dwMode, NULL, NULL)) {\n                return TRUE;\n            }\n        }\n    }\n\n    // Couldn't open pipe.\n    s_ftRetry = *pftLog;\n    syelogAddMilliseconds(&s_ftRetry, 300000);           // Wait 5 minute before retry.\n\n    return FALSE;\n}\n\nVOID SyelogOpen(PCSTR pszIdentifier, BYTE nFacility)\n{\n    Real_InitializeCriticalSection(&s_csPipe);\n\n    if (pszIdentifier) {\n        PCHAR pszOut = s_szIdent;\n        PCHAR pszEnd = s_szIdent + ARRAYSIZE(s_szIdent) - 1;\n        pszOut = do_str(pszOut, pszEnd, pszIdentifier);\n        pszOut = do_str(pszOut, pszEnd, \": \");\n        *pszEnd = '\\0';\n    }\n    else {\n        s_szIdent[0] = '\\0';\n    }\n\n    s_nFacility = nFacility;\n    s_nProcessId = Real_GetCurrentProcessId();\n}\n\nVOID SyelogExV(BOOL fTerminate, BYTE nSeverity, PCSTR pszMsgf, va_list args)\n{\n    SYELOG_MESSAGE Message;\n    DWORD cbWritten = 0;\n\n    Real_GetSystemTimeAsFileTime(&Message.ftOccurance);\n    Message.fTerminate = fTerminate;\n    Message.nFacility = s_nFacility;\n    Message.nSeverity = nSeverity;\n    Message.nProcessId = s_nProcessId;\n    PCHAR pszBuf = Message.szMessage;\n    PCHAR pszEnd = Message.szMessage + ARRAYSIZE(Message.szMessage) - 1;\n    if (s_szIdent[0]) {\n        pszBuf = do_str(pszBuf, pszEnd, s_szIdent);\n    }\n    *pszEnd = '\\0';\n    VSafePrintf(pszMsgf, args,\n                pszBuf, (int)(Message.szMessage + sizeof(Message.szMessage) - 1 - pszBuf));\n\n    pszEnd = Message.szMessage;\n    for (; *pszEnd; pszEnd++) {\n        // no internal contents.\n    }\n\n    // Insure that the message always ends with a '\\n'\n    //\n    if (pszEnd > Message.szMessage) {\n        if (pszEnd[-1] != '\\n') {\n            *pszEnd++ = '\\n';\n            *pszEnd++ = '\\0';\n        }\n        else {\n            *pszEnd++ = '\\0';\n        }\n    }\n    else {\n        *pszEnd++ = '\\n';\n        *pszEnd++ = '\\0';\n    }\n    Message.nBytes = (USHORT)(pszEnd - ((PCSTR)&Message));\n\n    Real_EnterCriticalSection(&s_csPipe);\n\n    if (syelogIsOpen(&Message.ftOccurance)) {\n        if (!Real_WriteFile(s_hPipe, &Message, Message.nBytes, &cbWritten, NULL)) {\n            s_nPipeError = GetLastError();\n            if (s_nPipeError == ERROR_BAD_IMPERSONATION_LEVEL) {\n                // Don't close the file just for a temporary impersonation level.\n            }\n            else {\n                if (s_hPipe != INVALID_HANDLE_VALUE) {\n                    Real_CloseHandle(s_hPipe);\n                    s_hPipe = INVALID_HANDLE_VALUE;\n                }\n                if (syelogIsOpen(&Message.ftOccurance)) {\n                    Real_WriteFile(s_hPipe, &Message, Message.nBytes, &cbWritten, NULL);\n                }\n            }\n        }\n    }\n\n    Real_LeaveCriticalSection(&s_csPipe);\n}\n\nVOID SyelogV(BYTE nSeverity, PCSTR pszMsgf, va_list args)\n{\n    SyelogExV(FALSE, nSeverity, pszMsgf, args);\n}\n\nVOID Syelog(BYTE nSeverity, PCSTR pszMsgf, ...)\n{\n    va_list args;\n    va_start(args, pszMsgf);\n    SyelogExV(FALSE, nSeverity, pszMsgf, args);\n    va_end(args);\n}\n\nVOID SyelogEx(BOOL fTerminate, BYTE nSeverity, PCSTR pszMsgf, ...)\n{\n    va_list args;\n    va_start(args, pszMsgf);\n    SyelogExV(fTerminate, nSeverity, pszMsgf, args);\n    va_end(args);\n}\n\nVOID SyelogClose(BOOL fTerminate)\n{\n    if (fTerminate) {\n        SyelogEx(TRUE, SYELOG_SEVERITY_NOTICE, \"Requesting exit on close.\\n\");\n    }\n\n    Real_EnterCriticalSection(&s_csPipe);\n\n    if (s_hPipe != INVALID_HANDLE_VALUE) {\n        Real_FlushFileBuffers(s_hPipe);\n        Real_CloseHandle(s_hPipe);\n        s_hPipe = INVALID_HANDLE_VALUE;\n    }\n\n    Real_LeaveCriticalSection(&s_csPipe);\n}\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/syelog/syelog.h",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (syelog.h of syelog.lib)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#pragma once\n#ifndef _SYELOGD_H_\n#define _SYELOGD_H_\n#include <stdarg.h>\n\n#pragma pack(push, 1)\n#pragma warning(push)\n#pragma warning(disable: 4200)\n\n//////////////////////////////////////////////////////////////////////////////\n//\n//\n#define SYELOG_PIPE_NAMEA       \"\\\\\\\\.\\\\pipe\\\\syelog\"\n#define SYELOG_PIPE_NAMEW       L\"\\\\\\\\.\\\\pipe\\\\syelog\"\n#ifdef UNICODE\n#define SYELOG_PIPE_NAME        SYELOG_PIPE_NAMEW\n#else\n#define SYELOG_PIPE_NAME        SYELOG_PIPE_NAMEA\n#endif\n\n//////////////////////////////////////////////////////////////////////////////\n//\n#define SYELOG_MAXIMUM_MESSAGE  4086    // 4096 - sizeof(header stuff)\n\ntypedef struct _SYELOG_MESSAGE\n{\n    USHORT      nBytes;\n    BYTE        nFacility;\n    BYTE        nSeverity;\n    DWORD       nProcessId;\n    FILETIME    ftOccurance;\n    BOOL        fTerminate;\n    CHAR        szMessage[SYELOG_MAXIMUM_MESSAGE];\n} SYELOG_MESSAGE, *PSYELOG_MESSAGE;\n\n\n// Facility Codes.\n//\n#define SYELOG_FACILITY_KERNEL          0x10            // OS Kernel\n#define SYELOG_FACILITY_SECURITY        0x20            // OS Security\n#define SYELOG_FACILITY_LOGGING         0x30            // OS Logging-internal\n#define SYELOG_FACILITY_SERVICE         0x40            // User-mode system daemon\n#define SYELOG_FACILITY_APPLICATION     0x50            // User-mode application\n#define SYELOG_FACILITY_USER            0x60            // User self-generated.\n#define SYELOG_FACILITY_LOCAL0          0x70            // Locally defined.\n#define SYELOG_FACILITY_LOCAL1          0x71            // Locally defined.\n#define SYELOG_FACILITY_LOCAL2          0x72            // Locally defined.\n#define SYELOG_FACILITY_LOCAL3          0x73            // Locally defined.\n#define SYELOG_FACILITY_LOCAL4          0x74            // Locally defined.\n#define SYELOG_FACILITY_LOCAL5          0x75            // Locally defined.\n#define SYELOG_FACILITY_LOCAL6          0x76            // Locally defined.\n#define SYELOG_FACILITY_LOCAL7          0x77            // Locally defined.\n#define SYELOG_FACILITY_LOCAL8          0x78            // Locally defined.\n#define SYELOG_FACILITY_LOCAL9          0x79            // Locally defined.\n\n// Severity Codes.\n//\n#define SYELOG_SEVERITY_FATAL           0x00            // System is dead.\n#define SYELOG_SEVERITY_ALERT           0x10            // Take action immediately.\n#define SYELOG_SEVERITY_CRITICAL        0x20            // Critical condition.\n#define SYELOG_SEVERITY_ERROR           0x30            // Error\n#define SYELOG_SEVERITY_WARNING         0x40            // Warning\n#define SYELOG_SEVERITY_NOTICE          0x50            // Significant condition.\n#define SYELOG_SEVERITY_INFORMATION     0x60            // Informational\n#define SYELOG_SEVERITY_AUDIT_FAIL      0x66            // Audit Failed\n#define SYELOG_SEVERITY_AUDIT_PASS      0x67            // Audit Succeeeded\n#define SYELOG_SEVERITY_DEBUG           0x70            // Debugging\n\n// Logging Functions.\n//\nVOID SyelogOpen(PCSTR pszIdentifier, BYTE nFacility);\nVOID Syelog(BYTE nSeverity, PCSTR pszMsgf, ...);\nVOID SyelogV(BYTE nSeverity, PCSTR pszMsgf, va_list args);\nVOID SyelogClose(BOOL fTerminate);\n\n#pragma warning(pop)\n#pragma pack(pop)\n\n#endif //  _SYELOGD_H_\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/syelog/syelogd.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (syelogd.cpp of syelogd.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#include <windows.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <stddef.h>\n#pragma warning(push)\n#if _MSC_VER > 1400\n#pragma warning(disable:6102 6103) // /analyze warnings\n#endif\n#include <strsafe.h>\n#pragma warning(pop)\n#include \"syelog.h\"\n\n#if (_MSC_VER < 1299)\ntypedef ULONG * PULONG_PTR;\ntypedef ULONG ULONG_PTR;\ntypedef LONG * PLONG_PTR;\ntypedef LONG LONG_PTR;\n#endif\n\nenum {\n    CLIENT_AWAITING_PIPE_ACCEPT = 0x21,\n    CLIENT_AWAITING_PIPE_DATA   = 0x22,\n};\n\ntypedef struct _CLIENT : OVERLAPPED\n{\n    HANDLE          hPipe;\n    BOOL            fAwaitingAccept;\n    PVOID           Zero;\n    SYELOG_MESSAGE  Message;\n} CLIENT, *PCLIENT;\n\n//////////////////////////////////////////////////////////////////////////////\n//\nBOOL        s_fLogToScreen  = TRUE;     // Log output to screen.\nBOOL        s_fExitAfterOne = FALSE;\nBOOL        s_fDeltaTime    = FALSE;\nHANDLE      s_hOutFile      = INVALID_HANDLE_VALUE;\n\nLONG        s_nActiveClients = 0;\nLONGLONG    s_llStartTime = 0;\nLONGLONG    s_llLastTime = 0;\n\nBOOL LogMessageV(BYTE nSeverity, PCHAR pszMsg, ...);\n\n//////////////////////////////////////////////////////////////////////////////\n//\nVOID MyErrExit(PCSTR pszMsg)\n{\n    DWORD error = GetLastError();\n\n    LogMessageV(SYELOG_SEVERITY_FATAL, \"Error %d in %s.\", error, pszMsg);\n    fprintf(stderr, \"SYELOGD: Error %ld in %s.\\n\", error, pszMsg);\n    fflush(stderr);\n    exit(1);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nstatic PCSTR FileTimeToString(PCHAR pszBuffer, DWORD cbBuffer, FILETIME ftTime)\n{\n    (void)cbBuffer;\n\n    static BOOL bGotTzi = FALSE;\n    static DWORD dwTzi = TIME_ZONE_ID_UNKNOWN;\n    static TIME_ZONE_INFORMATION tzi;\n    if (!bGotTzi) {\n        dwTzi = GetTimeZoneInformation(&tzi);\n        if (dwTzi == TIME_ZONE_ID_UNKNOWN) {\n            ZeroMemory(&tzi, sizeof(tzi));\n        }\n        bGotTzi = TRUE;\n    }\n    SYSTEMTIME stUtc;\n    SYSTEMTIME stLocal;\n\n    pszBuffer[0] = '\\0';\n\n    if (s_fDeltaTime) {\n        if (s_llLastTime == 0) {\n            s_llLastTime = s_llStartTime;\n        }\n\n        ULARGE_INTEGER ul;\n        ul.LowPart = ftTime.dwLowDateTime;\n        ul.HighPart = ftTime.dwHighDateTime;\n\n        LONG64 delta = ul.QuadPart - s_llLastTime;\n        s_llLastTime = ul.QuadPart;\n        delta /= 10000;\n\n        StringCchPrintfA(pszBuffer, cbBuffer, \"%7I64d\", delta);\n    }\n    else {\n        if (!FileTimeToSystemTime(&ftTime, &stUtc)) {\n            StringCchPrintfA(pszBuffer, cbBuffer, \"ft:%16I64d\", *(LONGLONG *)&ftTime);\n            return pszBuffer;\n        }\n        else if (!SystemTimeToTzSpecificLocalTime(&tzi, &stUtc, &stLocal)) {\n            CopyMemory(&stLocal, &stUtc, sizeof(stLocal));\n        }\n\n        StringCchPrintfA(pszBuffer, cbBuffer, \"%4d%02d%02d%02d%02d%02d%03d\",\n                         stLocal.wYear,\n                         stLocal.wMonth,\n                         stLocal.wDay,\n                         stLocal.wHour,\n                         stLocal.wMinute,\n                         stLocal.wSecond,\n                         stLocal.wMilliseconds);\n    }\n    return pszBuffer;\n}\n\nBOOL CloseConnection(PCLIENT pClient)\n{\n    LogMessageV(SYELOG_SEVERITY_INFORMATION, \"Client closed pipe.\");\n\n    InterlockedDecrement(&s_nActiveClients);\n    if (pClient != NULL) {\n        if (pClient->hPipe != INVALID_HANDLE_VALUE) {\n            FlushFileBuffers(pClient->hPipe);\n            if (!DisconnectNamedPipe(pClient->hPipe)) {\n                MyErrExit(\"DisconnectNamedPipe\");\n            }\n            CloseHandle(pClient->hPipe);\n            pClient->hPipe = INVALID_HANDLE_VALUE;\n        }\n        GlobalFree(pClient);\n        pClient = NULL;\n    }\n\n    if (s_fExitAfterOne) {\n        ExitProcess(0);\n    }\n    return TRUE;\n}\n\n// Creates a pipe instance and initiate an accept request.\n//\nPCLIENT CreatePipeConnection(HANDLE hCompletionPort)\n{\n    HANDLE hPipe = CreateNamedPipe(SYELOG_PIPE_NAME,           // pipe name\n                                   PIPE_ACCESS_INBOUND |       // read-only access\n                                   FILE_FLAG_OVERLAPPED,       // overlapped mode\n                                   PIPE_TYPE_MESSAGE |         // message-type pipe\n                                   PIPE_READMODE_MESSAGE |     // message read mode\n                                   PIPE_WAIT,                   // blocking mode\n                                   PIPE_UNLIMITED_INSTANCES,   // unlimited instances\n                                   0,                          // output buffer size\n                                   0,                          // input buffer size\n                                   20000,                      // client time-out\n                                   NULL);                      // no security attributes\n    if (hPipe == INVALID_HANDLE_VALUE) {\n        MyErrExit(\"CreatePipe\");\n    }\n\n    // Allocate the client data structure.\n    //\n    PCLIENT pClient = (PCLIENT) GlobalAlloc(GPTR, sizeof(CLIENT));\n    if (pClient == NULL) {\n        MyErrExit(\"GlobalAlloc pClient\");\n    }\n\n    ZeroMemory(pClient, sizeof(*pClient));\n    pClient->hPipe = hPipe;\n    pClient->fAwaitingAccept = TRUE;\n\n    // Associate file with our complietion port.\n    //\n    if (!CreateIoCompletionPort(pClient->hPipe, hCompletionPort, (ULONG_PTR)pClient, 0)) {\n        MyErrExit(\"CreateIoComplietionPort pClient\");\n    }\n\n    if (!ConnectNamedPipe(hPipe, pClient)) {\n        if (GetLastError() != ERROR_IO_PENDING &&\n            GetLastError() != ERROR_PIPE_LISTENING) {\n            MyErrExit(\"ConnectNamedPipe\");\n        }\n    }\n    else {\n        LogMessageV(SYELOG_SEVERITY_INFORMATION,\n                    \"ConnectNamedPipe accepted immediately.\");\n    }\n    return pClient;\n}\n\nBOOL LogMessageV(BYTE nSeverity, PCHAR pszMsg, ...)\n{\n    FILETIME ftOccurance;\n    CHAR szTime[64];\n    GetSystemTimeAsFileTime(&ftOccurance);\n    FileTimeToString(szTime, sizeof(szTime), ftOccurance);\n\n    if (s_fLogToScreen) {\n        printf(s_fDeltaTime\n               ? \"%-7.7s ---- --.%02x: \"\n               : \"%-17.17s ---- --.%02x: \"\n               , szTime, nSeverity);\n        va_list args;\n        va_start(args, pszMsg);\n        vprintf(pszMsg, args);\n        va_end(args);\n        printf(\"\\n\");\n    }\n    if (s_hOutFile != INVALID_HANDLE_VALUE) {\n        DWORD cbWritten = 0;\n        CHAR szBuf[4096] = \"\";\n        PCHAR pcchEnd = szBuf + ARRAYSIZE(szBuf) - 2;\n        PCHAR pcchCur = szBuf;\n        HRESULT hr;\n\n        hr = StringCchPrintfExA(pcchCur, pcchEnd - pcchCur,\n                                &pcchCur, NULL, STRSAFE_NULL_ON_FAILURE,\n                                s_fDeltaTime\n                                ? \"%-7.7s ---- --.%02x: \"\n                                : \"%-17.17s ---- --.%02x: \"\n                                , szTime, nSeverity);\n        if (FAILED(hr)) {\n            goto Cleanup;\n        }\n\n        va_list args;\n        va_start(args, pszMsg);\n        hr = StringCchPrintfExA(pcchCur, pcchEnd - pcchCur,\n                                &pcchCur, NULL, STRSAFE_NULL_ON_FAILURE,\n                                pszMsg, args);\n        va_end(args);\n        if (FAILED(hr)) {\n            goto Cleanup;\n        }\n\n        hr = StringCchPrintfExA(pcchCur, (szBuf + ARRAYSIZE(szBuf)) - pcchCur,\n                                &pcchCur, NULL, STRSAFE_NULL_ON_FAILURE,\n                                 \"\\n\");\n        if (FAILED(hr)) {\n            goto Cleanup;\n        }\n\n      Cleanup:\n        WriteFile(s_hOutFile, szBuf, (DWORD)(pcchCur - szBuf), &cbWritten, NULL);\n    }\n    return TRUE;\n}\n\nBOOL LogMessage(PSYELOG_MESSAGE pMessage, DWORD nBytes)\n{\n    // Sanity check the size of the message.\n    //\n    if (nBytes > pMessage->nBytes) {\n        nBytes = pMessage->nBytes;\n    }\n    if (nBytes >= sizeof(*pMessage)) {\n        nBytes = sizeof(*pMessage) - 1;\n    }\n\n    // Don't log message if there isn't and message text.\n    //\n    if (nBytes <= offsetof(SYELOG_MESSAGE, szMessage)) {\n        return FALSE;\n    }\n\n    CHAR szTime[64];\n    FileTimeToString(szTime, sizeof(szTime), pMessage->ftOccurance);\n\n    PCHAR pszMsg = pMessage->szMessage;\n    while (*pszMsg) {\n        pszMsg++;\n    }\n    while (pszMsg > pMessage->szMessage && isspace(pszMsg[-1])) {\n        *--pszMsg = '\\0';\n    }\n\n    if (s_fLogToScreen) {\n        printf(s_fDeltaTime\n               ? \"%-7.7s %4d %02x.%02x: %s\\n\"\n               : \"%-17.17s %4d %02x.%02x: %s\\n\",\n               szTime,\n               pMessage->nProcessId,\n               pMessage->nFacility,\n               pMessage->nSeverity,\n               pMessage->szMessage);\n    }\n    if (s_hOutFile != INVALID_HANDLE_VALUE) {\n        DWORD cbWritten = 0;\n        CHAR szBuf[4096];\n        PCHAR pcchEnd = szBuf + ARRAYSIZE(szBuf);\n        PCHAR pcchCur = szBuf;\n        HRESULT hr;\n\n        hr = StringCchPrintfExA(pcchCur, pcchEnd - pcchCur,\n                                &pcchCur, NULL, STRSAFE_NULL_ON_FAILURE,\n                                s_fDeltaTime\n                                ? \"%-7.7s %4d %02x.%02x: %s\\n\"\n                                : \"%-17.17s %4d %02x.%02x: %s\\n\",\n                                szTime,\n                                pMessage->nProcessId,\n                                pMessage->nFacility,\n                                pMessage->nSeverity,\n                                pMessage->szMessage);\n        if (FAILED(hr)) {\n            goto Cleanup;\n        }\n\n      Cleanup:\n        WriteFile(s_hOutFile, szBuf, (DWORD)(pcchCur - szBuf), &cbWritten, NULL);\n    }\n    return TRUE;\n}\n\nDWORD WINAPI WorkerThread(LPVOID pvVoid)\n{\n    PCLIENT pClient;\n    BOOL b;\n    LPOVERLAPPED lpo;\n    DWORD nBytes;\n    HANDLE hCompletionPort = (HANDLE)pvVoid;\n\n    for (BOOL fKeepLooping = TRUE; fKeepLooping;) {\n        pClient = NULL;\n        lpo = NULL;\n        nBytes = 0;\n        b = GetQueuedCompletionStatus(hCompletionPort,\n                                      &nBytes, (PULONG_PTR)&pClient, &lpo, INFINITE);\n\n        if (!b || lpo == NULL) {\n            fKeepLooping = FALSE;\n            MyErrExit(\"GetQueuedCompletionState\");\n            break;\n        }\n        else if (!b) {\n            if (pClient) {\n                if (GetLastError() == ERROR_BROKEN_PIPE) {\n                    LogMessageV(SYELOG_SEVERITY_INFORMATION, \"Client closed pipe.\");\n                }\n                else {\n                    LogMessageV(SYELOG_SEVERITY_ERROR,\n                                \"GetQueuedCompletionStatus failed %d [%p]\",\n                                GetLastError(), pClient);\n                }\n                CloseConnection(pClient);\n            }\n            continue;\n        }\n\n        if (pClient->fAwaitingAccept) {\n            InterlockedIncrement(&s_nActiveClients);\n            pClient->fAwaitingAccept = FALSE;\n            b = ReadFile(pClient->hPipe,\n                         &pClient->Message,\n                         sizeof(pClient->Message),\n                         &nBytes,\n                         pClient);\n            if (!b) {\n                if (GetLastError() != ERROR_IO_PENDING) {\n                    LogMessageV(SYELOG_SEVERITY_ERROR,\n                                \"ReadFile failed %d.\", GetLastError());\n                    continue;\n                }\n            }\n\n            CreatePipeConnection(hCompletionPort);\n        }\n        else {\n            if (nBytes < offsetof(SYELOG_MESSAGE, szMessage)) {\n                CloseConnection(pClient);\n            }\n\n            if (pClient->Message.fTerminate) {\n                LogMessageV(SYELOG_SEVERITY_NOTICE,\n                            \"Client requested terminate on next connection close.\");\n                s_fExitAfterOne = TRUE;\n            }\n\n            LogMessage(&pClient->Message, nBytes);\n\n            b = ReadFile(pClient->hPipe,\n                         &pClient->Message,\n                         sizeof(pClient->Message),\n                         &nBytes,\n                         pClient);\n            if (!b && GetLastError() == ERROR_BROKEN_PIPE) {\n                CloseConnection(pClient);\n            }\n        }\n    }\n    return 0;\n}\n\nBOOL CreateWorkers(HANDLE hCompletionPort)\n{\n    DWORD dwThread;\n    HANDLE hThread;\n    DWORD i;\n    SYSTEM_INFO SystemInfo;\n\n    GetSystemInfo(&SystemInfo);\n\n    for (i = 0; i < 2 * SystemInfo.dwNumberOfProcessors; i++) {\n        hThread = CreateThread(NULL, 0, WorkerThread, hCompletionPort, 0, &dwThread);\n        if (!hThread) {\n            MyErrExit(\"CreateThread WorkerThread\");\n            // Unreachable: return FALSE;\n        }\n        CloseHandle(hThread);\n    }\n    return TRUE;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nBOOL WINAPI ControlHandler(DWORD dwCtrlType)\n{\n    switch (dwCtrlType) {\n      case CTRL_C_EVENT:\n      case CTRL_BREAK_EVENT:\n      case CTRL_CLOSE_EVENT:\n      case CTRL_LOGOFF_EVENT:\n      case CTRL_SHUTDOWN_EVENT:\n        LogMessageV(SYELOG_SEVERITY_INFORMATION, \"User requested stop.\");\n        printf(\"\\nSYELOGD: Closing connections.\\n\");\n        if (s_hOutFile != INVALID_HANDLE_VALUE) {\n            printf(\"Closing file.\\n\");\n            FlushFileBuffers(s_hOutFile);\n            CloseHandle(s_hOutFile);\n            s_hOutFile = INVALID_HANDLE_VALUE;\n        }\n        ExitProcess(0);\n    }\n    return FALSE;\n}\n\nDWORD main(int argc, char **argv)\n{\n    HANDLE hCompletionPort;\n    BOOL fNeedHelp = FALSE;\n\n    GetSystemTimeAsFileTime((FILETIME *)&s_llStartTime);\n    SetConsoleCtrlHandler(ControlHandler, TRUE);\n\n    int arg = 1;\n    for (; arg < argc; arg++) {\n        if (argv[arg][0] == '-' || argv[arg][0] == '/') {\n            CHAR *argn = argv[arg] + 1;\n            CHAR *argp = argn;\n            while (*argp && *argp != ':') {\n                argp++;\n            }\n            if (*argp == ':') {\n                *argp++ = '\\0';\n            }\n\n            switch (argn[0]) {\n\n              case 'd':                                 // Delta time.\n              case 'D':\n                s_fDeltaTime = TRUE;\n                break;\n\n              case 'o':                                 // Only one.\n              case 'O':\n                s_fExitAfterOne = TRUE;\n                break;\n\n              case 'q':                                 // Quiet.\n              case 'Q':\n                s_fLogToScreen = FALSE;\n                break;\n\n              case '?':                                 // Help.\n                fNeedHelp = TRUE;\n                break;\n\n              default:\n                fNeedHelp = TRUE;\n                printf(\"SYELOGD: Bad argument: %s:%s\\n\", argn, argp);\n                break;\n            }\n        }\n        else {\n            if (s_hOutFile != INVALID_HANDLE_VALUE) {\n                printf(\"SYELOGD: Error, more than one output file specified.\\n\\n\");\n                fNeedHelp = TRUE;\n                break;\n            }\n\n            s_hOutFile = CreateFileA(argv[arg],\n                                     GENERIC_WRITE,\n                                     FILE_SHARE_READ,\n                                     NULL,\n                                     CREATE_ALWAYS,\n                                     FILE_ATTRIBUTE_NORMAL |\n                                     FILE_FLAG_SEQUENTIAL_SCAN,\n                                     NULL);\n            if (s_hOutFile == INVALID_HANDLE_VALUE) {\n                printf(\"SYELOGD: Error opening output file: %s: %ld\\n\\n\",\n                       argv[arg], GetLastError());\n                fNeedHelp = TRUE;\n                break;\n            }\n            else {\n                printf(\"SYELOGD: Logging to %s.\\n\", argv[arg]);\n            }\n        }\n    }\n    if (fNeedHelp) {\n        printf(\"Usage:\\n\"\n               \"    syelogd [options] {output_file}\\n\"\n               \"Options:\\n\"\n               \"    /d         List delta time in ms from previous event (not absolute time).\\n\"\n               \"    /o         Exit after one client disconnects.\\n\"\n               \"    /q         Disable event logging to screen (quiet mode).\\n\"\n               \"    /?         Display this help message.\\n\"\n               \"Summary:\\n\"\n               \"    If given, all events will be logged to the output file.\\n\"\n               \"\\n\");\n        exit(1);\n    }\n\n\n    // Create the completion port.\n    hCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, 0);\n    if (hCompletionPort == NULL) {\n        MyErrExit(\"CreateIoCompletionPort\");\n    }\n\n    // Create completion port worker threads.\n    //\n    CreateWorkers(hCompletionPort);\n    CreatePipeConnection(hCompletionPort);\n\n    printf(\"SYELOGD: Ready for clients.  Press Ctrl-C to stop.\\n\");\n    while (argc) {\n        Sleep(10000);\n    }\n\n    SetConsoleCtrlHandler(ControlHandler, FALSE);\n\n    if (s_hOutFile != INVALID_HANDLE_VALUE) {\n        FlushFileBuffers(s_hOutFile);\n        CloseHandle(s_hOutFile);\n        s_hOutFile = INVALID_HANDLE_VALUE;\n    }\n\n    return 0;\n}\n//\n//////////////////////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "ext/detours/samples/talloc/Makefile",
    "content": "##############################################################################\n##\n##  Makefile for Detours Test Programs.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\n# This test tests the allocation algorithm. .dlls are carefully placed\n# immediately adjacent to each other to force the algorithm to look more places.\n\n# /noentry keeps the .dlls small, so they all fit at their bases\n\n!if \"$(DETOURS_TARGET_PROCESSOR:64=)\" == \"$(DETOURS_TARGET_PROCESSOR)\"\n# 32bit bases\nDETOURS_TALLOC1=0x28000000\nDETOURS_TALLOC2=0x38000000\nDETOURS_TALLOC3=0x48050000\nDETOURS_TALLOC4=0x58000000\nDETOURS_TALLOC5=0x68000000\nDETOURS_TALLOC6=0x68010000\nDETOURS_TALLOC7=0x68020000\nDETOURS_TALLOC8=0x68030000\nDETOURS_TALLOC9=0x68040000\n!else\n# 64bit bases\nDETOURS_TALLOC1=0x280000000\nDETOURS_TALLOC2=0x380000000\nDETOURS_TALLOC3=0x480050000\nDETOURS_TALLOC4=0x580000000\nDETOURS_TALLOC5=0x680000000\nDETOURS_TALLOC6=0x680010000\nDETOURS_TALLOC7=0x680020000\nDETOURS_TALLOC8=0x680030000\nDETOURS_TALLOC9=0x680040000\n!endif\n\nLIBS=$(LIBS) kernel32.lib psapi.lib\n\nall: dirs \\\n    $(BIND)\\tdll1x$(DETOURS_BITS).dll \\\n    $(BIND)\\tdll2x$(DETOURS_BITS).dll \\\n    $(BIND)\\tdll3x$(DETOURS_BITS).dll \\\n    $(BIND)\\tdll4x$(DETOURS_BITS).dll \\\n    $(BIND)\\tdll5x$(DETOURS_BITS).dll \\\n    $(BIND)\\tdll6x$(DETOURS_BITS).dll \\\n    $(BIND)\\tdll7x$(DETOURS_BITS).dll \\\n    $(BIND)\\tdll8x$(DETOURS_BITS).dll \\\n    $(BIND)\\tdll9x$(DETOURS_BITS).dll \\\n    $(BIND)\\talloc.exe \\\n    \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\tdll1x$(DETOURS_BITS).bsc \\\n    $(OBJD)\\tdll2x$(DETOURS_BITS).bsc \\\n    $(OBJD)\\tdll3x$(DETOURS_BITS).bsc \\\n    $(OBJD)\\tdll4x$(DETOURS_BITS).bsc \\\n    $(OBJD)\\tdll5x$(DETOURS_BITS).bsc \\\n    $(OBJD)\\tdll6x$(DETOURS_BITS).bsc \\\n    $(OBJD)\\tdll7x$(DETOURS_BITS).bsc \\\n    $(OBJD)\\tdll8x$(DETOURS_BITS).bsc \\\n    $(OBJD)\\tdll9x$(DETOURS_BITS).bsc \\\n    $(OBJD)\\talloc.bsc \\\n!ENDIF\n\toption\n\nclean:\n    -del *~ 2>nul\n    -del $(BIND)\\tdll1x* 2>nul\n    -del $(BIND)\\tdll2x* 2>nul\n    -del $(BIND)\\tdll3x* 2>nul\n    -del $(BIND)\\tdll4x* 2>nul\n    -del $(BIND)\\tdll5x* 2>nul\n    -del $(BIND)\\tdll6x* 2>nul\n    -del $(BIND)\\tdll7x* 2>nul\n    -del $(BIND)\\tdll8x* 2>nul\n    -del $(BIND)\\tdll9x* 2>nul\n    -del $(BIND)\\talloc* 2>nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\n##############################################################################\n\n$(OBJD)\\talloc.obj : talloc.cpp\n\n$(BIND)\\talloc.exe : $(OBJD)\\talloc.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb $(OBJD)\\talloc.obj \\\n        /link $(LINKFLAGS) $(LIBS) \\\n        $(BIND)\\tdll1x$(DETOURS_BITS).lib \\\n\t\t$(BIND)\\tdll2x$(DETOURS_BITS).lib \\\n\t\t$(BIND)\\tdll3x$(DETOURS_BITS).lib \\\n\t\t$(BIND)\\tdll4x$(DETOURS_BITS).lib \\\n\t\t$(BIND)\\tdll5x$(DETOURS_BITS).lib \\\n\t\t$(BIND)\\tdll6x$(DETOURS_BITS).lib \\\n\t\t$(BIND)\\tdll7x$(DETOURS_BITS).lib \\\n\t\t$(BIND)\\tdll8x$(DETOURS_BITS).lib \\\n\t\t$(BIND)\\tdll9x$(DETOURS_BITS).lib \\\n        /subsystem:console /entry:WinMainCRTStartup\n\n$(OBJD)\\talloc.bsc : $(OBJD)\\talloc.obj\n    bscmake /v /n /o $@ $(OBJD)\\talloc.sbr\n\n$(OBJD)\\tdll1x.obj : tdll1x.cpp\n\n# /noentry keeps the .dlls small, so they all fit at their bases\n$(BIND)\\tdll1x$(DETOURS_BITS).dll : $(OBJD)\\tdll1x.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb \\\n        $(OBJD)\\tdll1x.obj /LD \\\n        /link $(LINKFLAGS:/profile=/fixed) $(LIBS) \\\n        /subsystem:windows \\\n        /noentry \\\n        /base:$(DETOURS_TALLOC1)\n\n$(OBJD)\\tdll1x$(DETOURS_BITS).bsc : $(OBJD)\\tdll1x.obj\n    bscmake /v /n /o $@ $(OBJD)\\tdll1x.sbr\n\n$(OBJD)\\tdll2x.obj : tdll2x.cpp\n\n# /noentry keeps the .dlls small, so they all fit at their bases\n$(BIND)\\tdll2x$(DETOURS_BITS).dll : $(OBJD)\\tdll2x.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb \\\n        $(OBJD)\\tdll2x.obj /LD \\\n        /link $(LINKFLAGS:/profile=/fixed) $(LIBS) \\\n        /subsystem:console \\\n        /noentry \\\n        /base:$(DETOURS_TALLOC2)\n\n$(OBJD)\\tdll2x$(DETOURS_BITS).bsc : $(OBJD)\\tdll2x.obj\n    bscmake /v /n /o $@ $(OBJD)\\tdll2x.sbr\n\n$(OBJD)\\tdll3x.obj : tdll3x.cpp\n\n# /noentry keeps the .dlls small, so they all fit at their bases\n$(BIND)\\tdll3x$(DETOURS_BITS).dll : $(OBJD)\\tdll3x.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb \\\n        $(OBJD)\\tdll3x.obj /LD \\\n        /link $(LINKFLAGS:/profile=/fixed) $(LIBS) \\\n        /subsystem:console \\\n        /noentry \\\n        /base:$(DETOURS_TALLOC3)\n\n$(OBJD)\\tdll3x$(DETOURS_BITS).bsc : $(OBJD)\\tdll3x.obj\n    bscmake /v /n /o $@ $(OBJD)\\tdll3x.sbr\n\n$(OBJD)\\tdll4x.obj : tdll4x.cpp\n\n# /noentry keeps the .dlls small, so they all fit at their bases\n$(BIND)\\tdll4x$(DETOURS_BITS).dll : $(OBJD)\\tdll4x.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb \\\n        $(OBJD)\\tdll4x.obj /LD \\\n        /link $(LINKFLAGS:/profile=/fixed) $(LIBS) \\\n        /subsystem:console \\\n        /noentry \\\n        /base:$(DETOURS_TALLOC4)\n\n$(OBJD)\\tdll4x$(DETOURS_BITS).bsc : $(OBJD)\\tdll4x.obj\n    bscmake /v /n /o $@ $(OBJD)\\tdll4x.sbr\n\n\n$(OBJD)\\tdll5x.obj : tdll5x.cpp\n\n# /noentry keeps the .dlls small, so they all fit at their bases\n$(BIND)\\tdll5x$(DETOURS_BITS).dll : $(OBJD)\\tdll5x.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb \\\n        $(OBJD)\\tdll5x.obj /LD \\\n        /link $(LINKFLAGS:/profile=/fixed) $(LIBS) \\\n        /subsystem:console \\\n        /noentry \\\n        /base:$(DETOURS_TALLOC5)\n\n$(OBJD)\\tdll5x$(DETOURS_BITS).bsc : $(OBJD)\\tdll5x.obj\n    bscmake /v /n /o $@ $(OBJD)\\tdll5x.sbr\n\n$(OBJD)\\tdll6x.obj : tdll6x.cpp\n\n# /noentry keeps the .dlls small, so they all fit at their bases\n$(BIND)\\tdll6x$(DETOURS_BITS).dll : $(OBJD)\\tdll6x.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb \\\n        $(OBJD)\\tdll6x.obj /LD \\\n        /link $(LINKFLAGS:/profile=/fixed) $(LIBS) \\\n        /subsystem:console \\\n        /noentry \\\n        /base:$(DETOURS_TALLOC6)\n\n$(OBJD)\\tdll6x$(DETOURS_BITS).bsc : $(OBJD)\\tdll6x.obj\n    bscmake /v /n /o $@ $(OBJD)\\tdll6x.sbr\n\n\n$(OBJD)\\tdll7x.obj : tdll7x.cpp\n\n# /noentry keeps the .dlls small, so they all fit at their bases\n$(BIND)\\tdll7x$(DETOURS_BITS).dll : $(OBJD)\\tdll7x.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb \\\n        $(OBJD)\\tdll7x.obj /LD \\\n        /link $(LINKFLAGS:/profile=/fixed) $(LIBS) \\\n        /subsystem:console \\\n        /noentry \\\n        /base:$(DETOURS_TALLOC7)\n\n$(OBJD)\\tdll7x$(DETOURS_BITS).bsc : $(OBJD)\\tdll7x.obj\n    bscmake /v /n /o $@ $(OBJD)\\tdll7x.sbr\n\n\n$(OBJD)\\tdll8x.obj : tdll8x.cpp\n\n# /noentry keeps the .dlls small, so they all fit at their bases\n$(BIND)\\tdll8x$(DETOURS_BITS).dll : $(OBJD)\\tdll8x.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb \\\n        $(OBJD)\\tdll8x.obj /LD \\\n        /link $(LINKFLAGS:/profile=/fixed) $(LIBS) \\\n        /subsystem:console \\\n        /noentry \\\n        /base:$(DETOURS_TALLOC8)\n\n$(OBJD)\\tdll8x$(DETOURS_BITS).bsc : $(OBJD)\\tdll8x.obj\n    bscmake /v /n /o $@ $(OBJD)\\tdll8x.sbr\n\n\n$(OBJD)\\tdll9x.obj : tdll9x.cpp\n\n# /noentry keeps the .dlls small, so they all fit at their bases\n$(BIND)\\tdll9x$(DETOURS_BITS).dll : $(OBJD)\\tdll9x.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb \\\n        $(OBJD)\\tdll9x.obj /LD \\\n        /link $(LINKFLAGS:/profile=/fixed) $(LIBS) \\\n        /subsystem:console \\\n        /noentry \\\n        /base:$(DETOURS_TALLOC9)\n\n$(OBJD)\\tdll9x$(DETOURS_BITS).bsc : $(OBJD)\\tdll9x.obj\n    bscmake /v /n /o $@ $(OBJD)\\tdll9x.sbr\n\n############################################### Install non-bit-size binaries.\n\n!IF \"$(DETOURS_OPTION_PROCESSOR)\" != \"\"\n\n$(OPTD)\\tdll1x$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\tdll1x$(DETOURS_OPTION_BITS).pdb:\n$(OPTD)\\tdll2x$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\tdll2x$(DETOURS_OPTION_BITS).pdb:\n$(OPTD)\\tdll3x$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\tdll3x$(DETOURS_OPTION_BITS).pdb:\n$(OPTD)\\tdll4x$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\tdll4x$(DETOURS_OPTION_BITS).pdb:\n$(OPTD)\\tdll5x$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\tdll5x$(DETOURS_OPTION_BITS).pdb:\n$(OPTD)\\tdll6x$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\tdll6x$(DETOURS_OPTION_BITS).pdb:\n$(OPTD)\\tdll7x$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\tdll7x$(DETOURS_OPTION_BITS).pdb:\n$(OPTD)\\tdll8x$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\tdll8x$(DETOURS_OPTION_BITS).pdb:\n$(OPTD)\\tdll9x$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\tdll9x$(DETOURS_OPTION_BITS).pdb:\n\n$(BIND)\\tdll1x$(DETOURS_OPTION_BITS).dll : $(OPTD)\\tdll1x$(DETOURS_OPTION_BITS).dll\n\t@if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\tdll1x$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\tdll1x$(DETOURS_OPTION_BITS).pdb\n\t@if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\tdll2x$(DETOURS_OPTION_BITS).dll : $(OPTD)\\tdll2x$(DETOURS_OPTION_BITS).dll\n\t@if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\tdll2x$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\tdll2x$(DETOURS_OPTION_BITS).pdb\n\t@if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\tdll3x$(DETOURS_OPTION_BITS).dll : $(OPTD)\\tdll3x$(DETOURS_OPTION_BITS).dll\n\t@if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\tdll3x$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\tdll3x$(DETOURS_OPTION_BITS).pdb\n\t@if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\tdll4x$(DETOURS_OPTION_BITS).dll : $(OPTD)\\tdll4x$(DETOURS_OPTION_BITS).dll\n\t@if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\tdll4x$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\tdll4x$(DETOURS_OPTION_BITS).pdb\n\t@if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\tdll5x$(DETOURS_OPTION_BITS).dll : $(OPTD)\\tdll5x$(DETOURS_OPTION_BITS).dll\n\t@if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\tdll5x$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\tdll5x$(DETOURS_OPTION_BITS).pdb\n\t@if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\tdll6x$(DETOURS_OPTION_BITS).dll : $(OPTD)\\tdll6x$(DETOURS_OPTION_BITS).dll\n\t@if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\tdll6x$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\tdll6x$(DETOURS_OPTION_BITS).pdb\n\t@if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\tdll7x$(DETOURS_OPTION_BITS).dll : $(OPTD)\\tdll7x$(DETOURS_OPTION_BITS).dll\n\t@if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\tdll7x$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\tdll7x$(DETOURS_OPTION_BITS).pdb\n\t@if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\tdll8x$(DETOURS_OPTION_BITS).dll : $(OPTD)\\tdll8x$(DETOURS_OPTION_BITS).dll\n\t@if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\tdll8x$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\tdll8x$(DETOURS_OPTION_BITS).pdb\n\t@if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\tdll9x$(DETOURS_OPTION_BITS).dll : $(OPTD)\\tdll9x$(DETOURS_OPTION_BITS).dll\n\t@if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\tdll9x$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\tdll9x$(DETOURS_OPTION_BITS).pdb\n\t@if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n\noption: \\\n\t$(BIND)\\tdll1x$(DETOURS_OPTION_BITS).dll \\\n\t$(BIND)\\tdll1x$(DETOURS_OPTION_BITS).pdb \\\n\t$(BIND)\\tdll2x$(DETOURS_OPTION_BITS).dll \\\n\t$(BIND)\\tdll2x$(DETOURS_OPTION_BITS).pdb \\\n\t$(BIND)\\tdll3x$(DETOURS_OPTION_BITS).dll \\\n\t$(BIND)\\tdll3x$(DETOURS_OPTION_BITS).pdb \\\n\t$(BIND)\\tdll4x$(DETOURS_OPTION_BITS).dll \\\n\t$(BIND)\\tdll4x$(DETOURS_OPTION_BITS).pdb \\\n\t$(BIND)\\tdll5x$(DETOURS_OPTION_BITS).dll \\\n\t$(BIND)\\tdll5x$(DETOURS_OPTION_BITS).pdb \\\n\t$(BIND)\\tdll6x$(DETOURS_OPTION_BITS).dll \\\n\t$(BIND)\\tdll6x$(DETOURS_OPTION_BITS).pdb \\\n\t$(BIND)\\tdll7x$(DETOURS_OPTION_BITS).dll \\\n\t$(BIND)\\tdll7x$(DETOURS_OPTION_BITS).pdb \\\n\t$(BIND)\\tdll8x$(DETOURS_OPTION_BITS).dll \\\n\t$(BIND)\\tdll8x$(DETOURS_OPTION_BITS).pdb \\\n\t$(BIND)\\tdll9x$(DETOURS_OPTION_BITS).dll \\\n\t$(BIND)\\tdll9x$(DETOURS_OPTION_BITS).pdb \\\n\n!ELSE\n\noption:\n\n!ENDIF\n\n##############################################################################\n\ntest: all\n    $(BIND)\\talloc.exe\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/talloc/NORMAL_IA64.TXT",
    "content": "talloc.exe: Detoured functions.\n\n       Address         Size: Typ Sta Prot Ini : Contents\n  ------------ ------------: --- --- ---- --- : -----------------\nExe:                                                    13f660000\n     100000000     3f660000:     fre  ---     : \n     13f660000         2000: img com  r-- rcx : TALLOC.EXE\n     13f6ce000    100802000:     fre  ---     : \nDll1:                                                   280000000\n     200000000     3fed0000:     fre  ---     : \n     23fed0000        10000: pri com  r-x rwx : \n     23fee0000         2000: pri res      --- : \n     23fee2000         e000:     fre  ---     : \n     23fef0000        10000: pri res      --- : \n     23ff00000       100000: pri res      --- : \n     240000000     40000000: pri res      --- : \n     280000000         2000: img com  r-- rcx : TDLL1X64.DLL\n     280028000         8000:     fre  ---     : \n     280030000     7ffd0000: pri res      --- : \nDll2:                                                   380000000\n     300000000     80000000: pri res      --- : \n     380000000         2000: img com  r-- rcx : TDLL2X64.DLL\n     380028000         8000:     fre  ---     : \n     380030000     40000000: pri res      --- : \n     3c0030000       100000: pri res      --- : \n     3c0130000        10000: pri res      --- : \n     3c0140000         2000: pri res      --- : \n     3c0142000         e000:     fre  ---     : \n     3c0150000        10000: pri com  r-x rwx : \n     3c0160000     3fea0000:     fre  ---     : \nDll3:                                                   480000000\n     400000000     40000000: pri res      --- : \n     440000000       100000: pri res      --- : \n     440100000        10000: pri res      --- : \n     440110000         2000: pri res      --- : \n     440112000         e000:     fre  ---     : \n     440120000        10000: pri com  r-x rwx : \n     440130000     3fed0000:     fre  ---     : \n     480000000         2000: img com  r-- rcx : TDLL3X64.DLL\n     480028000         8000:     fre  ---     : \n     480030000     7ffd0000: pri res      --- : \nDll4:                                                   580000000\n     500000000     80000000: pri res      --- : \n     580000000         2000: img com  r-- rcx : TDLL4X64.DLL\n     580028000     3fea8000:     fre  ---     : \n     5bfed0000        10000: pri com  r-x rwx : \n     5bfee0000         2000: pri res      --- : \n     5bfee2000         e000:     fre  ---     : \n     5bfef0000        10000: pri res      --- : \n     5bff00000       100000: pri res      --- : \n     5c0000000     40000000: pri res      --- : \nDll5:                                                   680000000\n     600000000        f0000:     fre  ---     : \n     6000f0000        10000: pri com  r-x rwx : \n     600100000     7ff00000: pri res      --- : \n     680000000         2000: img com  r-- rcx : TDLL5X64.DLL\n     680028000        18000:     fre  ---     : \n     680040000         2000: img com  r-- rcx : TDLL6X64.DLL\n     680068000        18000:     fre  ---     : \n     680080000         2000: img com  r-- rcx : TDLL7X64.DLL\n     6800a8000        18000:     fre  ---     : \n     6800c0000         2000: img com  r-- rcx : TDLL8X64.DLL\n     6800e8000        18000:     fre  ---     : \n     680100000         2000: img com  r-- rcx : TDLL9X64.DLL\n     680128000         8000:     fre  ---     : \n     680130000     7fe00000: pri res      --- : \n     6fff30000        10000: pri com  r-x rwx : \n     6fff40000  6f3fbdd0000:     fre  ---     : \n\ntalloc.exe: 1 calls to Dll1Function\n"
  },
  {
    "path": "ext/detours/samples/talloc/NORMAL_X64.TXT",
    "content": "talloc.exe: Detoured functions.\n\n       Address         Size: Typ Sta Prot Ini : Contents\n  ------------ ------------: --- --- ---- --- : -----------------\nExe:                                                    13f7f0000\n     100000000     3f7f0000:     fre  ---     : \n     13f7f0000         1000: img com  r-- rcx : TALLOC.EXE\n     13f81e000    1006b2000:     fre  ---     : \nDll1:                                                   280000000\n     200000000     3fed0000:     fre  ---     : \n     23fed0000        10000: pri com  r-x rwx : \n     23fee0000         1000: pri res      --- : \n     23fee1000         f000:     fre  ---     : \n     23fef0000        10000: pri res      --- : \n     23ff00000       100000: pri res      --- : \n     240000000     40000000: pri res      --- : \n     280000000         1000: img com  r-- rcx : TDLL1X64.DLL\n     280010000     7fff0000: pri res      --- : \nDll2:                                                   380000000\n     300000000     80000000: pri res      --- : \n     380000000         1000: img com  r-- rcx : TDLL2X64.DLL\n     380010000     40000000: pri res      --- : \n     3c0010000       100000: pri res      --- : \n     3c0110000        10000: pri res      --- : \n     3c0120000         1000: pri res      --- : \n     3c0121000         f000:     fre  ---     : \n     3c0130000        10000: pri com  r-x rwx : \n     3c0140000     3fec0000:     fre  ---     : \nDll3:                                                   480000000\n     400000000     40000000: pri res      --- : \n     440000000       100000: pri res      --- : \n     440100000        10000: pri res      --- : \n     440110000         1000: pri res      --- : \n     440111000         f000:     fre  ---     : \n     440120000        10000: pri com  r-x rwx : \n     440130000     3fed0000:     fre  ---     : \n     480000000         1000: img com  r-- rcx : TDLL3X64.DLL\n     480010000     7fff0000: pri res      --- : \nDll4:                                                   580000000\n     500000000     80000000: pri res      --- : \n     580000000         1000: img com  r-- rcx : TDLL4X64.DLL\n     580010000     3fec0000:     fre  ---     : \n     5bfed0000        10000: pri com  r-x rwx : \n     5bfee0000         1000: pri res      --- : \n     5bfee1000         f000:     fre  ---     : \n     5bfef0000        10000: pri res      --- : \n     5bff00000       100000: pri res      --- : \n     5c0000000     40000000: pri res      --- : \nDll5:                                                   680000000\n     600000000        f0000:     fre  ---     : \n     6000f0000        10000: pri com  r-x rwx : \n     600100000     7ff00000: pri res      --- : \n     680000000         1000: img com  r-- rcx : TDLL5X64.DLL\n     680010000        30000:     fre  ---     : \n     680040000         1000: img com  r-- rcx : TDLL6X64.DLL\n     680050000        30000:     fre  ---     : \n     680080000         1000: img com  r-- rcx : TDLL7X64.DLL\n     680090000        30000:     fre  ---     : \n     6800c0000         1000: img com  r-- rcx : TDLL8X64.DLL\n     6800d0000        30000:     fre  ---     : \n     680100000         1000: img com  r-- rcx : TDLL9X64.DLL\n     680110000     7fe00000: pri res      --- : \n     6fff10000        10000: pri com  r-x rwx : \n     6fff20000  7f7fdf70000:     fre  ---     : \n\ntalloc.exe: 1 calls to Dll1Function\n"
  },
  {
    "path": "ext/detours/samples/talloc/talloc.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (talloc.cpp of talloc.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#define PSAPI_VERSION 2\n#include <stdio.h>\n#include <stdlib.h>\n#include <windows.h>\n#pragma warning(push)\n#if _MSC_VER > 1400\n#pragma warning(disable:6102 6103) // /analyze warnings\n#endif\n#include <strsafe.h>\n#pragma warning(pop)\n#include <psapi.h>\n#include <detours.h>\n\n//////////////////////////////////////////////////////////////////////////////\n\nvoid TypeToString(DWORD Type, char *pszBuffer, size_t cBuffer)\n{\n    if (Type == MEM_IMAGE) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"img\");\n    }\n    else if (Type == MEM_MAPPED) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"map\");\n    }\n    else if (Type == MEM_PRIVATE) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"pri\");\n    }\n    else if (Type == 0) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"   \");\n    }\n    else {\n        StringCchPrintfA(pszBuffer, cBuffer, \"%x\", Type);\n    }\n}\n\nvoid StateToString(DWORD State, char *pszBuffer, size_t cBuffer)\n{\n    if (State == MEM_COMMIT) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"com\");\n    }\n    else if (State == MEM_FREE) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"fre\");\n    }\n    else if (State == MEM_RESERVE) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"res\");\n    }\n    else {\n        StringCchPrintfA(pszBuffer, cBuffer, \"%x\", State);\n    }\n}\n\nvoid ProtectToString(DWORD Protect, char *pszBuffer, size_t cBuffer)\n{\n    if (Protect == 0) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"\");\n    }\n    else if (Protect == PAGE_EXECUTE) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"--x\");\n    }\n    else if (Protect == PAGE_EXECUTE_READ) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"r-x\");\n    }\n    else if (Protect == PAGE_EXECUTE_READWRITE) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"rwx\");\n    }\n    else if (Protect == PAGE_EXECUTE_WRITECOPY) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"rcx\");\n    }\n    else if (Protect == PAGE_NOACCESS) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"---\");\n    }\n    else if (Protect == PAGE_READONLY) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"r--\");\n    }\n    else if (Protect == PAGE_READWRITE) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"rw-\");\n    }\n    else if (Protect == PAGE_WRITECOPY) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"rc-\");\n    }\n    else if (Protect == (PAGE_GUARD | PAGE_EXECUTE)) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"g--x\");\n    }\n    else if (Protect == (PAGE_GUARD | PAGE_EXECUTE_READ)) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"gr-x\");\n    }\n    else if (Protect == (PAGE_GUARD | PAGE_EXECUTE_READWRITE)) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"grwx\");\n    }\n    else if (Protect == (PAGE_GUARD | PAGE_EXECUTE_WRITECOPY)) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"grcx\");\n    }\n    else if (Protect == (PAGE_GUARD | PAGE_NOACCESS)) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"g---\");\n    }\n    else if (Protect == (PAGE_GUARD | PAGE_READONLY)) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"gr--\");\n    }\n    else if (Protect == (PAGE_GUARD | PAGE_READWRITE)) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"grw-\");\n    }\n    else if (Protect == (PAGE_GUARD | PAGE_WRITECOPY)) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"grc-\");\n    }\n    else {\n        StringCchPrintfA(pszBuffer, cBuffer, \"%x\", Protect);\n    }\n}\n\nULONG PadToPage(ULONG Size)\n{\n    return (Size & 0xfff)\n        ? Size + 0x1000 - (Size & 0xfff)\n        : Size;\n}\n\nsize_t NextAt(size_t start)\n{\n    size_t next = start;\n\n    for (;;) {\n        MEMORY_BASIC_INFORMATION mbi;\n\n        ZeroMemory(&mbi, sizeof(mbi));\n        if (VirtualQuery((PVOID)next, &mbi, sizeof(mbi)) == 0) {\n            break;\n        }\n        if ((mbi.RegionSize & 0xfff) == 0xfff) {\n            break;\n        }\n\n        if ((size_t)mbi.AllocationBase != start) {\n            break;\n        }\n\n        next = (size_t)mbi.BaseAddress + mbi.RegionSize;\n    }\n    return next;\n}\n\nsize_t RoundUpRegion(size_t value)\n{\n    size_t diff = value & 0xffff;\n    return (diff != 0) ? value + 0x10000 - diff : value;\n}\n\nVOID DumpProcessHeaders()\n{\n    printf(\"  %12s %12s: %3s %3s %4s %3s : %8s\\n\",\n           \"Address\", \"Size\", \"Typ\", \"Sta\", \"Prot\", \"Ini\", \"Contents\");\n    printf(\"  %12s %12s: %3s %3s %4s %3s : %8s\\n\",\n           \"------------\", \"------------\", \"---\", \"---\", \"----\", \"---\", \"-----------------\");\n}\n\nBOOL DumpProcess(UINT64 lo64, UINT64 hi64)\n{\n#ifdef _WIN64\n    ULONG_PTR lo = lo64;\n    ULONG_PTR hi = hi64;\n#else\n    ULONG_PTR lo = (size_t)(lo64 >> 4);\n    ULONG_PTR hi = (size_t)(hi64 >> 4);\n#endif\n\n    size_t base;\n    size_t next;\n\n    MEMORY_BASIC_INFORMATION mbi;\n\n    for (next = lo; next < hi;) {\n        base = next;\n        ZeroMemory(&mbi, sizeof(mbi));\n        if (VirtualQuery((PVOID)base, &mbi, sizeof(mbi)) == 0) {\n            break;\n        }\n        if ((mbi.RegionSize & 0xfff) == 0xfff) {\n            break;\n        }\n\n        if ((size_t)mbi.BaseAddress < lo) {\n            base = (size_t)mbi.BaseAddress;\n        }\n\n        size_t size = ((size_t)mbi.BaseAddress + mbi.RegionSize) - base;\n        next = (size_t)mbi.BaseAddress + mbi.RegionSize;\n\n        CHAR szType[16];\n        TypeToString(mbi.Type, szType, ARRAYSIZE(szType));\n        CHAR szState[16];\n        StateToString(mbi.State, szState, ARRAYSIZE(szState));\n        CHAR szProtect[16];\n        ProtectToString(mbi.Protect, szProtect, ARRAYSIZE(szProtect));\n        CHAR szAllocProtect[16];\n        ProtectToString(mbi.AllocationProtect, szAllocProtect, ARRAYSIZE(szAllocProtect));\n\n        CHAR szFile[MAX_PATH];\n        szFile[0] = '\\0';\n        DWORD cb = 0;\n        PCHAR pszFile = szFile;\n\n        if (base == (size_t)mbi.AllocationBase) {\n            next = NextAt(base);\n\n            cb = GetMappedFileNameA(GetCurrentProcess(),\n                                    mbi.AllocationBase, szFile, ARRAYSIZE(szFile));\n            if (cb > 0) {\n                for (DWORD c = 0; c < cb; c++) {\n                    szFile[c] = (char)toupper(szFile[c]);\n                }\n                szFile[cb] = '\\0';\n            }\n            else {\n                szFile[0] = '\\0';\n            }\n            if ((pszFile = strrchr(szFile, '\\\\')) == NULL) {\n                pszFile = szFile;\n            }\n            else {\n                pszFile++;\n            }\n        }\n\n        printf(\"%c %12zx %12zx: %3s %3s %4s %3s : %s\\n\",\n               \" *\"[base == (size_t)mbi.AllocationBase],\n               base,\n               size,\n               szType,\n               szState,\n               szProtect,\n               szAllocProtect,\n               pszFile);\n    }\n    return TRUE;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\n__declspec(dllimport) DWORD WINAPI Dll1Function(DWORD Value);\n__declspec(dllimport) DWORD WINAPI Dll2Function(DWORD Value);\n__declspec(dllimport) DWORD WINAPI Dll3Function(DWORD Value);\n__declspec(dllimport) DWORD WINAPI Dll4Function(DWORD Value);\n__declspec(dllimport) DWORD WINAPI Dll5Function(DWORD Value);\n__declspec(dllimport) DWORD WINAPI Dll6Function(DWORD Value);\n__declspec(dllimport) DWORD WINAPI Dll7Function(DWORD Value);\n__declspec(dllimport) DWORD WINAPI Dll8Function(DWORD Value);\n__declspec(dllimport) DWORD WINAPI Dll9Function(DWORD Value);\n\nstatic LONG dwCountDll1 = 0;\nstatic LONG dwCountDll2 = 0;\nstatic LONG dwCountDll3 = 0;\nstatic LONG dwCountDll4 = 0;\nstatic LONG dwCountDll5 = 0;\nstatic LONG dwCountDll6 = 0;\nstatic LONG dwCountDll7 = 0;\nstatic LONG dwCountDll8 = 0;\nstatic LONG dwCountDll9 = 0;\n\nstatic DWORD (WINAPI * TrueDll1Function)(DWORD Value) = Dll1Function;\nstatic DWORD (WINAPI * TrueDll2Function)(DWORD Value) = Dll2Function;\nstatic DWORD (WINAPI * TrueDll3Function)(DWORD Value) = Dll3Function;\nstatic DWORD (WINAPI * TrueDll4Function)(DWORD Value) = Dll4Function;\nstatic DWORD (WINAPI * TrueDll5Function)(DWORD Value) = Dll5Function;\nstatic DWORD (WINAPI * TrueDll6Function)(DWORD Value) = Dll6Function;\nstatic DWORD (WINAPI * TrueDll7Function)(DWORD Value) = Dll7Function;\nstatic DWORD (WINAPI * TrueDll8Function)(DWORD Value) = Dll8Function;\nstatic DWORD (WINAPI * TrueDll9Function)(DWORD Value) = Dll9Function;\n\nDWORD WINAPI MineDll1Function(DWORD Value)\n{\n    Value = TrueDll1Function(Value);\n    InterlockedIncrement(&dwCountDll1);\n\n    return Value;\n}\n\nDWORD WINAPI MineDll2Function(DWORD Value)\n{\n    Value = TrueDll2Function(Value);\n    InterlockedIncrement(&dwCountDll2);\n\n    return Value;\n}\n\nDWORD WINAPI MineDll3Function(DWORD Value)\n{\n    Value = TrueDll3Function(Value);\n    InterlockedIncrement(&dwCountDll3);\n\n    return Value;\n}\n\nDWORD WINAPI MineDll4Function(DWORD Value)\n{\n    Value = TrueDll4Function(Value);\n    InterlockedIncrement(&dwCountDll4);\n\n    return Value;\n}\n\nDWORD WINAPI MineDll5Function(DWORD Value)\n{\n    Value = TrueDll5Function(Value);\n    InterlockedIncrement(&dwCountDll5);\n\n    return Value;\n}\n\nDWORD WINAPI MineDll6Function(DWORD Value)\n{\n    Value = TrueDll6Function(Value);\n    InterlockedIncrement(&dwCountDll6);\n\n    return Value;\n}\n\nDWORD WINAPI MineDll7Function(DWORD Value)\n{\n    Value = TrueDll7Function(Value);\n    InterlockedIncrement(&dwCountDll7);\n\n    return Value;\n}\n\nDWORD WINAPI MineDll8Function(DWORD Value)\n{\n    Value = TrueDll8Function(Value);\n    InterlockedIncrement(&dwCountDll8);\n\n    return Value;\n}\n\nDWORD WINAPI MineDll9Function(DWORD Value)\n{\n    Value = TrueDll9Function(Value);\n    InterlockedIncrement(&dwCountDll9);\n\n    return Value;\n}\n\nvoid Reserve(ULONG_PTR addr, ULONG_PTR size)\n{\n    PVOID mem = VirtualAlloc((PVOID)addr, size, MEM_RESERVE, PAGE_NOACCESS);\n    if (mem != (PVOID)addr) {\n        printf(\"*** Reservation failed: %p != %p\\n\", mem, (PVOID)addr);\n    }\n}\n\nint WINAPI WinMain(HINSTANCE hinst, HINSTANCE hprev, LPSTR lpszCmdLine, int nCmdShow)\n{\n    (void)hinst;\n    (void)hprev;\n    (void)lpszCmdLine;\n    (void)nCmdShow;\n    DWORD error = NO_ERROR;\n\n    size_t Dll1 = (size_t)LoadLibraryA(\"tdll1x\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\");\n    size_t Dll2 = (size_t)LoadLibraryA(\"tdll2x\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\");\n    size_t Dll3 = (size_t)LoadLibraryA(\"tdll3x\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\");\n    size_t Dll4 = (size_t)LoadLibraryA(\"tdll4x\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\");\n    size_t Dll5 = (size_t)LoadLibraryA(\"tdll5x\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\");\n    size_t Dll6 = (size_t)LoadLibraryA(\"tdll6x\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\");\n    size_t Dll7 = (size_t)LoadLibraryA(\"tdll7x\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\");\n    size_t Dll8 = (size_t)LoadLibraryA(\"tdll8x\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\");\n    size_t Dll9 = (size_t)LoadLibraryA(\"tdll9x\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\");\n\n    size_t DllEnd = RoundUpRegion(NextAt(Dll1));\n    ULONG_PTR DllSize = (DllEnd - Dll1);\n\n    (void)Dll6;\n    (void)Dll7;\n    (void)Dll8;\n\n    // Force allocation below moving lower.\n    Reserve(Dll1 - 0x40000000, 0x40000000);\n    Reserve(Dll1 - 0x40100000, 0x00100000);\n    Reserve(Dll1 - 0x40110000, 0x00010000);\n    Reserve(Dll1 - 0x40120000, 0x00001000);\n    Reserve(Dll1 + DllSize, 0x80000000 - DllSize);\n\n    // Force allocation above moving higher.\n    Reserve(Dll2 - 0x80000000, 0x80000000);\n    Reserve(Dll2 + DllSize, 0x40000000);\n    Reserve(Dll2 + 0x40000000 + DllSize, 0x00100000);\n    Reserve(Dll2 + 0x40100000 + DllSize, 0x00010000);\n    Reserve(Dll2 + 0x40110000 + DllSize, 0x00001000);\n\n    // Force allocation below moving higher.\n    Reserve(Dll3 - 0x80000000, 0x40000000);\n    Reserve(Dll3 - 0x40000000, 0x00100000);\n    Reserve(Dll3 - 0x3ff00000, 0x00010000);\n    Reserve(Dll3 - 0x3fef0000, 0x00001000);\n    Reserve(Dll3 + DllSize, 0x80000000 - DllSize);\n\n    // Force allocation above moving lower.\n    Reserve(Dll4 - 0x80000000, 0x80000000);\n    Reserve(Dll4 + 0x40000000, 0x40000000);\n    Reserve(Dll4 + 0x3ff00000, 0x00100000);\n    Reserve(Dll4 + 0x3fef0000, 0x00010000);\n    Reserve(Dll4 + 0x3fee0000, 0x00001000);\n\n    // Force allocation above and below.\n    Reserve(Dll5 - 0x7ff00000, 0x7ff00000);\n    Reserve(Dll9 + DllSize, 0x7fe00000);\n\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n    DetourAttach(&(PVOID&)TrueDll1Function, MineDll1Function);\n    error = DetourTransactionCommit();\n    if (error != NO_ERROR) {\n      failed:\n        printf(\"talloc.exe: Error detouring functions: %ld\\n\", error);\n        exit(1);\n    }\n\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n    DetourAttach(&(PVOID&)TrueDll2Function, MineDll2Function);\n    error = DetourTransactionCommit();\n    if (error != NO_ERROR) {\n        goto failed;\n    }\n\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n    DetourAttach(&(PVOID&)TrueDll3Function, MineDll3Function);\n    error = DetourTransactionCommit();\n    if (error != NO_ERROR) {\n        goto failed;\n    }\n\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n    DetourAttach(&(PVOID&)TrueDll4Function, MineDll4Function);\n    error = DetourTransactionCommit();\n    if (error != NO_ERROR) {\n        goto failed;\n    }\n\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n    DetourAttach(&(PVOID&)TrueDll5Function, MineDll5Function);\n    error = DetourTransactionCommit();\n    if (error != NO_ERROR) {\n        goto failed;\n    }\n\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n    DetourAttach(&(PVOID&)TrueDll6Function, MineDll6Function);\n    error = DetourTransactionCommit();\n    if (error != NO_ERROR) {\n        goto failed;\n    }\n\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n    DetourAttach(&(PVOID&)TrueDll7Function, MineDll7Function);\n    error = DetourTransactionCommit();\n    if (error != NO_ERROR) {\n        goto failed;\n    }\n\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n    DetourAttach(&(PVOID&)TrueDll8Function, MineDll8Function);\n    error = DetourTransactionCommit();\n    if (error != NO_ERROR) {\n        goto failed;\n    }\n\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n    DetourAttach(&(PVOID&)TrueDll9Function, MineDll9Function);\n    error = DetourTransactionCommit();\n    if (error != NO_ERROR) {\n        goto failed;\n    }\n\n    printf(\"talloc.exe: Detoured functions.\\n\");\n    printf(\"\\n\");\n\n    DumpProcessHeaders();\n    printf(\"%-47s %17zx\\n\", \"Exe:\", (size_t)GetModuleHandleW(NULL));\n    DumpProcess(0x100000000, 0x200000000);\n    printf(\"%-47s %17zx\\n\", \"Dll1:\", Dll1);\n    DumpProcess(0x200000000, 0x300000000);\n    printf(\"%-47s %17zx\\n\", \"Dll2:\", Dll2);\n    DumpProcess(0x300000000, 0x400000000);\n    printf(\"%-47s %17zx\\n\", \"Dll3:\", Dll3);\n    DumpProcess(0x400000000, 0x500000000);\n    printf(\"%-47s %17zx\\n\", \"Dll4:\", Dll4);\n    DumpProcess(0x500000000, 0x600000000);\n    printf(\"%-47s %17zx\\n\", \"Dll5:\", Dll5);\n    DumpProcess(0x600000000, 0x700000000);\n    fflush(stdout);\n\n    Dll1Function(1);\n    Dll2Function(2);\n    Dll2Function(3);\n    Dll3Function(4);\n    Dll3Function(5);\n    Dll3Function(6);\n    Dll4Function(7);\n    Dll5Function(8);\n    Dll6Function(9);\n    Dll7Function(10);\n    Dll8Function(10);\n    Dll9Function(10);\n\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n    DetourDetach(&(PVOID&)TrueDll1Function, MineDll1Function);\n    DetourDetach(&(PVOID&)TrueDll2Function, MineDll2Function);\n    DetourDetach(&(PVOID&)TrueDll3Function, MineDll3Function);\n    DetourDetach(&(PVOID&)TrueDll4Function, MineDll4Function);\n    DetourDetach(&(PVOID&)TrueDll5Function, MineDll5Function);\n    DetourDetach(&(PVOID&)TrueDll6Function, MineDll6Function);\n    DetourDetach(&(PVOID&)TrueDll7Function, MineDll7Function);\n    DetourDetach(&(PVOID&)TrueDll8Function, MineDll8Function);\n    DetourDetach(&(PVOID&)TrueDll9Function, MineDll9Function);\n    error = DetourTransactionCommit();\n    if (error != NO_ERROR) {\n        goto failed;\n    }\n\n    printf(\"\\n\");\n    printf(\"talloc.exe: %ld calls to Dll1Function\\n\", dwCountDll1);\n    fflush(stdout);\n\n    return 0;\n}\n\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/talloc/tdll1x.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (tdll1x.cpp of talloc.exe/tdll1x.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n//////////////////////////////////////////////////////////////////// DLL Stuff\n//\n__declspec(dllexport) unsigned long __stdcall Dll1Function(unsigned long Value)\n{\n    return Value + 1;\n}\n\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/talloc/tdll2x.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (tdll2x.cpp of talloc.exe/tdll2x.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n//////////////////////////////////////////////////////////////////// DLL Stuff\n//\n__declspec(dllexport) unsigned long __stdcall Dll2Function(unsigned long Value)\n{\n    return Value + 1;\n}\n\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/talloc/tdll3x.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (tdll3x.cpp of talloc.exe/tdll3x.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n//////////////////////////////////////////////////////////////////// DLL Stuff\n//\n__declspec(dllexport) unsigned long __stdcall Dll3Function(unsigned long Value)\n{\n    return Value + 1;\n}\n\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/talloc/tdll4x.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (tdll4x.cpp of talloc.exe/tdll4x.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n//////////////////////////////////////////////////////////////////// DLL Stuff\n//\n__declspec(dllexport) unsigned long __stdcall Dll4Function(unsigned long Value)\n{\n    return Value + 1;\n}\n\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/talloc/tdll5x.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (tdll5x.cpp of talloc.exe/tdll5x.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n//////////////////////////////////////////////////////////////////// DLL Stuff\n//\n__declspec(dllexport) unsigned long __stdcall Dll5Function(unsigned long Value)\n{\n    return Value + 1;\n}\n\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/talloc/tdll6x.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (tdll6x.cpp of talloc.exe/tdll6x.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n//////////////////////////////////////////////////////////////////// DLL Stuff\n//\n__declspec(dllexport) unsigned long __stdcall Dll6Function(unsigned long Value)\n{\n    return Value + 1;\n}\n\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/talloc/tdll7x.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (tdll7x.cpp of talloc.exe/tdll7x.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n//////////////////////////////////////////////////////////////////// DLL Stuff\n//\n__declspec(dllexport) unsigned long __stdcall Dll7Function(unsigned long Value)\n{\n    return Value + 1;\n}\n\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/talloc/tdll8x.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (tdll8x.cpp of talloc.exe/tdll8x.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n//////////////////////////////////////////////////////////////////// DLL Stuff\n//\n__declspec(dllexport) unsigned long __stdcall Dll8Function(unsigned long Value)\n{\n    return Value + 1;\n}\n\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/talloc/tdll9x.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (tdll9x.cpp of talloc.exe/tdll9x.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n//////////////////////////////////////////////////////////////////// DLL Stuff\n//\n__declspec(dllexport) unsigned long __stdcall Dll9Function(unsigned long Value)\n{\n    return Value + 1;\n}\n\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/traceapi/Makefile",
    "content": "##############################################################################\n##\n##  Utility to trace Win32 APIs.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\nLIBS=$(LIBS) kernel32.lib gdi32.lib user32.lib shell32.lib advapi32.lib ole32.lib ws2_32.lib\n\n##############################################################################\n\nall: dirs \\\n    $(BIND)\\trcapi$(DETOURS_BITS).dll \\\n    $(BIND)\\testapi.exe \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\trcapi$(DETOURS_BITS).bsc \\\n    $(OBJD)\\testapi.bsc \\\n!ENDIF\n    option\n\n##############################################################################\n\nclean:\n    -del *~ test.txt 2>nul\n    -del $(BIND)\\trcapi*.* $(BIND)\\testapi.* 2>nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\n$(OBJD)\\trcapi.obj : trcapi.cpp _win32.cpp\n\n$(OBJD)\\trcapi.res : trcapi.rc\n\n$(BIND)\\trcapi$(DETOURS_BITS).dll: $(OBJD)\\trcapi.obj $(OBJD)\\trcapi.res $(DEPS)\n    cl /LD $(CFLAGS) /Fe$@ /Fd$(@R).pdb \\\n        $(OBJD)\\trcapi.obj $(OBJD)\\trcapi.res \\\n        /link $(LINKFLAGS) /release /subsystem:console \\\n        /export:DetourFinishHelperProcess,@1,NONAME \\\n        $(LIBS)\n\n$(OBJD)\\trcapi$(DETOURS_BITS).bsc : $(OBJD)\\trcapi.obj\n    bscmake /v /n /o $@ $(OBJD)\\trcapi.sbr\n\n$(OBJD)\\testapi.obj : testapi.cpp trcapi.cpp _win32.cpp\n\n$(BIND)\\testapi.exe : $(OBJD)\\testapi.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb $(OBJD)\\testapi.obj \\\n        /link $(LINKFLAGS) $(LIBS) \\\n        /subsystem:console /fixed:no\n\n$(OBJD)\\testapi.bsc : $(OBJD)\\testapi.obj\n    bscmake /v /n /o $@ $(OBJD)\\testapi.sbr\n\n############################################### Install non-bit-size binaries.\n\n!IF \"$(DETOURS_OPTION_PROCESSOR)\" != \"\"\n\n$(OPTD)\\trcapi$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\trcapi$(DETOURS_OPTION_BITS).pdb:\n\n$(BIND)\\trcapi$(DETOURS_OPTION_BITS).dll : $(OPTD)\\trcapi$(DETOURS_OPTION_BITS).dll\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\trcapi$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\trcapi$(DETOURS_OPTION_BITS).pdb\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n\noption: \\\n    $(BIND)\\trcapi$(DETOURS_OPTION_BITS).dll \\\n    $(BIND)\\trcapi$(DETOURS_OPTION_BITS).pdb \\\n\n!ELSE\n\noption:\n\n!ENDIF\n\n##############################################################################\n\ntest: all\n    @echo -------- Logging output to test.txt ------------\n    start $(BIND)\\syelogd.exe /o test.txt\n    $(BIND)\\sleep5.exe 1\n    @echo -------- Should load trcapi$(DETOURS_BITS).dll dynamically using withdll.exe ------------\n    $(BIND)\\withdll -d:$(BIND)\\trcapi$(DETOURS_BITS).dll $(BIND)\\sleepold.exe\n    @echo -------- Log from syelog -------------\n    type test.txt\n\ndebug: all\n    @echo -------- Logging output to test.txt ------------\n    start $(BIND)\\syelogd.exe /o test.txt\n    $(BIND)\\sleep5.exe 1\n    @echo -------- Should load trcapi$(DETOURS_BITS).dll dynamically using withdll.exe ------------\n    windbg -o -g -G $(BIND)\\withdll -d:$(BIND)\\trcapi$(DETOURS_BITS).dll $(BIND)\\sleepold.exe\n    @echo -------- Log from syelog -------------\n    type test.txt\n\ncalc: all\n    @echo -------- Logging output to test.txt ------------\n    start $(BIND)\\syelogd.exe /q /o test.txt\n    $(BIND)\\sleep5.exe 1\n    @echo -------- Should load trcapi$(DETOURS_BITS).dll dynamically using withdll.exe ------------\n    $(BIND)\\withdll -d:$(BIND)\\trcapi$(DETOURS_BITS).dll $(SYSTEMROOT)\\System32\\calc.exe\n    @echo -------- Log from syelog -------------\n    wc test.txt\n\nexplorer: all\n    @echo -------- Logging output to test.txt ------------\n    start $(BIND)\\syelogd.exe /q /o test.txt\n    $(BIND)\\sleep5.exe 1\n    @echo -------- Should load trcapi$(DETOURS_BITS).dll dynamically using withdll.exe ------------\n    $(BIND)\\withdll -d:$(BIND)\\trcapi$(DETOURS_BITS).dll $(SYSTEMROOT)\\explorer.exe\n    @echo -------- Log from syelog -------------\n    wc test.txt\n\nwordpad: all\n    @echo -------- Logging output to test.txt ------------\n    start $(BIND)\\syelogd.exe /q /o test.txt\n    $(BIND)\\sleep5.exe 1\n    @echo -------- Should load trcapi$(DETOURS_BITS).dll dynamically using withdll.exe ------------\n    $(BIND)\\withdll -d:$(BIND)\\trcapi$(DETOURS_BITS).dll $(PROGRAMFILES)\\Windows NT\\Accessories\\wordpad.exe\n    @echo -------- Log from syelog -------------\n    wc test.txt\n\nnotepad: all\n    @echo -------- Logging output to test.txt ------------\n    start $(BIND)\\syelogd.exe /q /o test.txt\n    $(BIND)\\sleep5.exe 1\n    @echo -------- Should load trcapi$(DETOURS_BITS).dll dynamically using withdll.exe ------------\n    $(BIND)\\withdll -d:$(BIND)\\trcapi$(DETOURS_BITS).dll $(SYSTEMROOT)\\notepad.exe\n    @echo -------- Log from syelog -------------\n    wc test.txt\n\nie: all\n    @echo -------- Logging output to test.txt ------------\n    start $(BIND)\\syelogd.exe /q /o test.txt\n    $(BIND)\\sleep5.exe 1\n    @echo -------- Should load trcapi$(DETOURS_BITS).dll dynamically using withdll.exe ------------\n    windbg -g -G -o $(BIND)\\withdll -d:$(BIND)\\trcapi$(DETOURS_BITS).dll \"$(PROGRAMFILES)\\Internet Explorer\\iexplore.exe\"\n    @echo -------- Log from syelog -------------\n    wc test.txt\n\nws: all\n    $(BIND)\\withdll -d:$(BIND)\\trcapi$(DETOURS_BITS).dll $(BIND)\\WebServiceTester.exe\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/traceapi/_win32.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (_win32.cpp of traceapi.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n///////////////////////////////////////////////////////////////// Trampolines.\n//\nint (__stdcall * Real_AbortDoc)(HDC a0)\n    = AbortDoc;\n\nBOOL (__stdcall * Real_AbortPath)(HDC a0)\n    = AbortPath;\n\nHKL (__stdcall * Real_ActivateKeyboardLayout)(HKL a0,\n                                              UINT a1)\n    = ActivateKeyboardLayout;\n\nATOM (__stdcall * Real_AddAtomA)(LPCSTR a0)\n    = AddAtomA;\n\nATOM (__stdcall * Real_AddAtomW)(LPCWSTR a0)\n    = AddAtomW;\n\nint (__stdcall * Real_AddFontResourceA)(LPCSTR a0)\n    = AddFontResourceA;\n\nint (__stdcall * Real_AddFontResourceW)(LPCWSTR a0)\n    = AddFontResourceW;\n\nBOOL (__stdcall * Real_AdjustWindowRect)(LPRECT a0,\n                                         DWORD a1,\n                                         BOOL a2)\n    = AdjustWindowRect;\n\nBOOL (__stdcall * Real_AdjustWindowRectEx)(LPRECT a0,\n                                           DWORD a1,\n                                           BOOL a2,\n                                           DWORD a3)\n    = AdjustWindowRectEx;\n\nBOOL (__stdcall * Real_AllocConsole)(void)\n    = AllocConsole;\n\nBOOL (__stdcall * Real_AngleArc)(HDC a0,\n                                 int a1,\n                                 int a2,\n                                 DWORD a3,\n                                 FLOAT a4,\n                                 FLOAT a5)\n    = AngleArc;\n\nBOOL (__stdcall * Real_AnimatePalette)(HPALETTE a0,\n                                       UINT a1,\n                                       UINT a2,\n                                       CONST PALETTEENTRY* a3)\n    = AnimatePalette;\n\nBOOL (__stdcall * Real_AnyPopup)(void)\n    = AnyPopup;\n\nBOOL (__stdcall * Real_AppendMenuA)(HMENU a0,\n                                    UINT a1,\n                                    UINT_PTR a2,\n                                    LPCSTR a3)\n    = AppendMenuA;\n\nBOOL (__stdcall * Real_AppendMenuW)(HMENU a0,\n                                    UINT a1,\n                                    UINT_PTR a2,\n                                    LPCWSTR a3)\n    = AppendMenuW;\n\nBOOL (__stdcall * Real_Arc)(HDC a0,\n                            int a1,\n                            int a2,\n                            int a3,\n                            int a4,\n                            int a5,\n                            int a6,\n                            int a7,\n                            int a8)\n    = Arc;\n\nBOOL (__stdcall * Real_ArcTo)(HDC a0,\n                              int a1,\n                              int a2,\n                              int a3,\n                              int a4,\n                              int a5,\n                              int a6,\n                              int a7,\n                              int a8)\n    = ArcTo;\n\nBOOL (__stdcall * Real_AreFileApisANSI)(void)\n    = AreFileApisANSI;\n\nUINT (__stdcall * Real_ArrangeIconicWindows)(HWND a0)\n    = ArrangeIconicWindows;\n\nBOOL (__stdcall * Real_AttachThreadInput)(DWORD a0,\n                                          DWORD a1,\n                                          BOOL a2)\n    = AttachThreadInput;\n\nBOOL (__stdcall * Real_BackupRead)(HANDLE a0,\n                                   LPBYTE a1,\n                                   DWORD a2,\n                                   LPDWORD a3,\n                                   BOOL a4,\n                                   BOOL a5,\n                                   LPVOID* a6)\n    = BackupRead;\n\nBOOL (__stdcall * Real_BackupSeek)(HANDLE a0,\n                                   DWORD a1,\n                                   DWORD a2,\n                                   LPDWORD a3,\n                                   LPDWORD a4,\n                                   LPVOID* a5)\n    = BackupSeek;\n\nBOOL (__stdcall * Real_BackupWrite)(HANDLE a0,\n                                    LPBYTE a1,\n                                    DWORD a2,\n                                    LPDWORD a3,\n                                    BOOL a4,\n                                    BOOL a5,\n                                    LPVOID* a6)\n    = BackupWrite;\n\nBOOL (__stdcall * Real_Beep)(DWORD a0,\n                             DWORD a1)\n    = Beep;\n\nHDWP (__stdcall * Real_BeginDeferWindowPos)(int a0)\n    = BeginDeferWindowPos;\n\nHDC (__stdcall * Real_BeginPaint)(HWND a0,\n                                  LPPAINTSTRUCT a1)\n    = BeginPaint;\n\nBOOL (__stdcall * Real_BeginPath)(HDC a0)\n    = BeginPath;\n\nHANDLE (__stdcall * Real_BeginUpdateResourceA)(LPCSTR a0,\n                                               BOOL a1)\n    = BeginUpdateResourceA;\n\nHANDLE (__stdcall * Real_BeginUpdateResourceW)(LPCWSTR a0,\n                                               BOOL a1)\n    = BeginUpdateResourceW;\n\nHRESULT (__stdcall * Real_BindMoniker)(IMoniker* a0,\n                                       DWORD a1,\n                                       CONST IID& a2,\n                                       LPVOID* a3)\n    = BindMoniker;\n\nBOOL (__stdcall * Real_BitBlt)(HDC a0,\n                               int a1,\n                               int a2,\n                               int a3,\n                               int a4,\n                               HDC a5,\n                               int a6,\n                               int a7,\n                               DWORD a8)\n    = BitBlt;\n\nBOOL (__stdcall * Real_BringWindowToTop)(HWND a0)\n    = BringWindowToTop;\n\nlong (__stdcall * Real_BroadcastSystemMessageA)(DWORD a0,\n                                                LPDWORD a1,\n                                                UINT a2,\n                                                WPARAM a3,\n                                                LPARAM a4)\n    = BroadcastSystemMessageA;\n\nlong (__stdcall * Real_BroadcastSystemMessageW)(DWORD a0,\n                                                LPDWORD a1,\n                                                UINT a2,\n                                                WPARAM a3,\n                                                LPARAM a4)\n    = BroadcastSystemMessageW;\n\nBOOL (__stdcall * Real_BuildCommDCBA)(LPCSTR a0,\n                                      LPDCB a1)\n    = BuildCommDCBA;\n\nBOOL (__stdcall * Real_BuildCommDCBAndTimeoutsA)(LPCSTR a0,\n                                                 LPDCB a1,\n                                                 LPCOMMTIMEOUTS a2)\n    = BuildCommDCBAndTimeoutsA;\n\nBOOL (__stdcall * Real_BuildCommDCBAndTimeoutsW)(LPCWSTR a0,\n                                                 LPDCB a1,\n                                                 LPCOMMTIMEOUTS a2)\n    = BuildCommDCBAndTimeoutsW;\n\nBOOL (__stdcall * Real_BuildCommDCBW)(LPCWSTR a0,\n                                      LPDCB a1)\n    = BuildCommDCBW;\n\nHRESULT (__stdcall * Real_CLSIDFromProgID)(LPCOLESTR a0,\n                                           LPGUID a1)\n    = CLSIDFromProgID;\n\n#ifdef _WIN32_WINNT_WIN7\nHRESULT (__stdcall * Real_CLSIDFromString)(LPCOLESTR a0,\n                                           LPGUID a1)\n    = CLSIDFromString;\n#else\nHRESULT (__stdcall * Real_CLSIDFromString)(LPOLESTR a0,\n                                           LPGUID a1)\n    = CLSIDFromString;\n#endif\n\nBOOL (__stdcall * Real_CallMsgFilterA)(LPMSG a0,\n                                       int a1)\n    = CallMsgFilterA;\n\nBOOL (__stdcall * Real_CallMsgFilterW)(LPMSG a0,\n                                       int a1)\n    = CallMsgFilterW;\n\nBOOL (__stdcall * Real_CallNamedPipeA)(LPCSTR a0,\n                                       LPVOID a1,\n                                       DWORD a2,\n                                       LPVOID a3,\n                                       DWORD a4,\n                                       LPDWORD a5,\n                                       DWORD a6)\n    = CallNamedPipeA;\n\nBOOL (__stdcall * Real_CallNamedPipeW)(LPCWSTR a0,\n                                       LPVOID a1,\n                                       DWORD a2,\n                                       LPVOID a3,\n                                       DWORD a4,\n                                       LPDWORD a5,\n                                       DWORD a6)\n    = CallNamedPipeW;\n\nLRESULT (__stdcall * Real_CallNextHookEx)(HHOOK a0,\n                                          int a1,\n                                          WPARAM a2,\n                                          LPARAM a3)\n    = CallNextHookEx;\n\nLRESULT (__stdcall * Real_CallWindowProcA)(WNDPROC a0,\n                                           HWND a1,\n                                           UINT a2,\n                                           WPARAM a3,\n                                           LPARAM a4)\n    = CallWindowProcA;\n\nLRESULT (__stdcall * Real_CallWindowProcW)(WNDPROC a0,\n                                           HWND a1,\n                                           UINT a2,\n                                           WPARAM a3,\n                                           LPARAM a4)\n    = CallWindowProcW;\n\nBOOL (__stdcall * Real_CancelDC)(HDC a0)\n    = CancelDC;\n\nBOOL (__stdcall * Real_CancelIo)(HANDLE a0)\n    = CancelIo;\n\nBOOL (__stdcall * Real_CancelWaitableTimer)(HANDLE a0)\n    = CancelWaitableTimer;\n\nWORD (__stdcall * Real_CascadeWindows)(HWND a0,\n                                       UINT a1,\n                                       CONST RECT* a2,\n                                       UINT a3,\n                                       CONST HWND * a4)\n    = CascadeWindows;\n\nBOOL (__stdcall * Real_ChangeClipboardChain)(HWND a0,\n                                             HWND a1)\n    = ChangeClipboardChain;\n\nLONG (__stdcall * Real_ChangeDisplaySettingsA)(LPDEVMODEA a0,\n                                               DWORD a1)\n    = ChangeDisplaySettingsA;\n\nLONG (__stdcall * Real_ChangeDisplaySettingsExA)(LPCSTR a0,\n                                                 LPDEVMODEA a1,\n                                                 HWND a2,\n                                                 DWORD a3,\n                                                 LPVOID a4)\n    = ChangeDisplaySettingsExA;\n\nLONG (__stdcall * Real_ChangeDisplaySettingsExW)(LPCWSTR a0,\n                                                 LPDEVMODEW a1,\n                                                 HWND a2,\n                                                 DWORD a3,\n                                                 LPVOID a4)\n    = ChangeDisplaySettingsExW;\n\nLONG (__stdcall * Real_ChangeDisplaySettingsW)(LPDEVMODEW a0,\n                                               DWORD a1)\n    = ChangeDisplaySettingsW;\n\nBOOL (__stdcall * Real_ChangeMenuA)(HMENU a0,\n                                    UINT a1,\n                                    LPCSTR a2,\n                                    UINT a3,\n                                    UINT a4)\n    = ChangeMenuA;\n\nBOOL (__stdcall * Real_ChangeMenuW)(HMENU a0,\n                                    UINT a1,\n                                    LPCWSTR a2,\n                                    UINT a3,\n                                    UINT a4)\n    = ChangeMenuW;\n\nLPSTR (__stdcall * Real_CharLowerA)(LPSTR a0)\n    = CharLowerA;\n\nDWORD (__stdcall * Real_CharLowerBuffA)(LPSTR a0,\n                                        DWORD a1)\n    = CharLowerBuffA;\n\nDWORD (__stdcall * Real_CharLowerBuffW)(LPWSTR a0,\n                                        DWORD a1)\n    = CharLowerBuffW;\n\nLPWSTR (__stdcall * Real_CharLowerW)(LPWSTR a0)\n    = CharLowerW;\n\nLPSTR (__stdcall * Real_CharNextA)(LPCSTR a0)\n    = CharNextA;\n\nLPSTR (__stdcall * Real_CharNextExA)(WORD a0,\n                                     LPCSTR a1,\n                                     DWORD a2)\n    = CharNextExA;\n\nLPWSTR (__stdcall * Real_CharNextW)(LPCWSTR a0)\n    = CharNextW;\n\nLPSTR (__stdcall * Real_CharPrevA)(LPCSTR a0,\n                                   LPCSTR a1)\n    = CharPrevA;\n\nLPSTR (__stdcall * Real_CharPrevExA)(WORD a0,\n                                     LPCSTR a1,\n                                     LPCSTR a2,\n                                     DWORD a3)\n    = CharPrevExA;\n\nLPWSTR (__stdcall * Real_CharPrevW)(LPCWSTR a0,\n                                    LPCWSTR a1)\n    = CharPrevW;\n\nBOOL (__stdcall * Real_CharToOemA)(LPCSTR a0,\n                                   LPSTR a1)\n    = CharToOemA;\n\nBOOL (__stdcall * Real_CharToOemBuffA)(LPCSTR a0,\n                                       LPSTR a1,\n                                       DWORD a2)\n    = CharToOemBuffA;\n\nBOOL (__stdcall * Real_CharToOemBuffW)(LPCWSTR a0,\n                                       LPSTR a1,\n                                       DWORD a2)\n    = CharToOemBuffW;\n\nBOOL (__stdcall * Real_CharToOemW)(LPCWSTR a0,\n                                   LPSTR a1)\n    = CharToOemW;\n\nLPSTR (__stdcall * Real_CharUpperA)(LPSTR a0)\n    = CharUpperA;\n\nDWORD (__stdcall * Real_CharUpperBuffA)(LPSTR a0,\n                                        DWORD a1)\n    = CharUpperBuffA;\n\nDWORD (__stdcall * Real_CharUpperBuffW)(LPWSTR a0,\n                                        DWORD a1)\n    = CharUpperBuffW;\n\nLPWSTR (__stdcall * Real_CharUpperW)(LPWSTR a0)\n    = CharUpperW;\n\nBOOL (__stdcall * Real_CheckColorsInGamut)(\n                                           HDC a0,\n#ifdef GDIPLUS_TS_QUERYVER\n                                           LPRGBTRIPLE a1,\n#else\n                                           LPVOID a1,\n#endif\n                                           LPVOID a2,\n                                           DWORD a3\n                                          )\n    = CheckColorsInGamut;\n\nBOOL (__stdcall * Real_CheckDlgButton)(HWND a0,\n                                       int a1,\n                                       UINT a2)\n    = CheckDlgButton;\n\nDWORD (__stdcall * Real_CheckMenuItem)(HMENU a0,\n                                       UINT a1,\n                                       UINT a2)\n    = CheckMenuItem;\n\nBOOL (__stdcall * Real_CheckMenuRadioItem)(HMENU a0,\n                                           UINT a1,\n                                           UINT a2,\n                                           UINT a3,\n                                           UINT a4)\n    = CheckMenuRadioItem;\n\nBOOL (__stdcall * Real_CheckRadioButton)(HWND a0,\n                                         int a1,\n                                         int a2,\n                                         int a3)\n    = CheckRadioButton;\n\nHWND (__stdcall * Real_ChildWindowFromPoint)(HWND a0,\n                                             POINT a1)\n    = ChildWindowFromPoint;\n\nHWND (__stdcall * Real_ChildWindowFromPointEx)(HWND a0,\n                                               POINT a1,\n                                               UINT a2)\n    = ChildWindowFromPointEx;\n\nint (__stdcall * Real_ChoosePixelFormat)(HDC a0,\n                                         CONST PIXELFORMATDESCRIPTOR* a1)\n    = ChoosePixelFormat;\n\nBOOL (__stdcall * Real_Chord)(HDC a0,\n                              int a1,\n                              int a2,\n                              int a3,\n                              int a4,\n                              int a5,\n                              int a6,\n                              int a7,\n                              int a8)\n    = Chord;\n\nBOOL (__stdcall * Real_ClearCommBreak)(HANDLE a0)\n    = ClearCommBreak;\n\nBOOL (__stdcall * Real_ClearCommError)(HANDLE a0,\n                                       LPDWORD a1,\n                                       LPCOMSTAT a2)\n    = ClearCommError;\n\nBOOL (__stdcall * Real_ClientToScreen)(HWND a0,\n                                       LPPOINT a1)\n    = ClientToScreen;\n\nBOOL (__stdcall * Real_ClipCursor)(CONST RECT* a0)\n    = ClipCursor;\n\nBOOL (__stdcall * Real_CloseClipboard)(void)\n    = CloseClipboard;\n\nBOOL (__stdcall * Real_CloseDesktop)(HDESK a0)\n    = CloseDesktop;\n\nHENHMETAFILE (__stdcall * Real_CloseEnhMetaFile)(HDC a0)\n    = CloseEnhMetaFile;\n\nBOOL (__stdcall * Real_CloseFigure)(HDC a0)\n    = CloseFigure;\n\nBOOL (__stdcall * Real_CloseHandle)(HANDLE a0)\n    = CloseHandle;\n\nHMETAFILE (__stdcall * Real_CloseMetaFile)(HDC a0)\n    = CloseMetaFile;\n\nBOOL (__stdcall * Real_CloseWindow)(HWND a0)\n    = CloseWindow;\n\nBOOL (__stdcall * Real_CloseWindowStation)(HWINSTA a0)\n    = CloseWindowStation;\n\nULONG (__stdcall * Real_CoAddRefServerProcess)(void)\n    = CoAddRefServerProcess;\n\nDWORD (__stdcall * Real_CoBuildVersion)(void)\n    = CoBuildVersion;\n\nHRESULT (__stdcall * Real_CoCopyProxy)(IUnknown* a0,\n                                       IUnknown** a1)\n    = CoCopyProxy;\n\nHRESULT (__stdcall * Real_CoCreateFreeThreadedMarshaler)(LPUNKNOWN a0,\n                                                         LPUNKNOWN* a1)\n    = CoCreateFreeThreadedMarshaler;\n\nHRESULT (__stdcall * Real_CoCreateGuid)(GUID* a0)\n    = CoCreateGuid;\n\nHRESULT (__stdcall * Real_CoCreateInstance)(CONST IID& a0,\n                                            LPUNKNOWN a1,\n                                            DWORD a2,\n                                            CONST IID& a3,\n                                            LPVOID* a4)\n    = CoCreateInstance;\n\nHRESULT (__stdcall * Real_CoCreateInstanceEx)(CONST IID& a0,\n                                              IUnknown* a1,\n                                              DWORD a2,\n                                              COSERVERINFO* a3,\n                                              DWORD a4,\n                                              MULTI_QI* a5)\n    = CoCreateInstanceEx;\n\nHRESULT (__stdcall * Real_CoDisconnectObject)(LPUNKNOWN a0,\n                                              DWORD a1)\n    = CoDisconnectObject;\n\nBOOL (__stdcall * Real_CoDosDateTimeToFileTime)(WORD a0,\n                                                WORD a1,\n                                                FILETIME* a2)\n    = CoDosDateTimeToFileTime;\n\nHRESULT (__stdcall * Real_CoFileTimeNow)(FILETIME* a0)\n    = CoFileTimeNow;\n\nBOOL (__stdcall * Real_CoFileTimeToDosDateTime)(FILETIME* a0,\n                                                LPWORD a1,\n                                                LPWORD a2)\n    = CoFileTimeToDosDateTime;\n\nvoid (__stdcall * Real_CoFreeAllLibraries)(void)\n    = CoFreeAllLibraries;\n\nvoid (__stdcall * Real_CoFreeLibrary)(HINSTANCE a0)\n    = CoFreeLibrary;\n\nvoid (__stdcall * Real_CoFreeUnusedLibraries)(void)\n    = CoFreeUnusedLibraries;\n\nHRESULT (__stdcall * Real_CoGetCallContext)(CONST IID& a0,\n                                            void** a1)\n    = CoGetCallContext;\n\nHRESULT (__stdcall * Real_CoGetClassObject)(CONST IID& a0,\n                                            DWORD a1,\n                                            LPVOID a2,\n                                            CONST IID& a3,\n                                            LPVOID* a4)\n    = CoGetClassObject;\n\nDWORD (__stdcall * Real_CoGetCurrentProcess)(void)\n    = CoGetCurrentProcess;\n\nHRESULT (__stdcall * Real_CoGetInstanceFromFile)(COSERVERINFO* a0,\n                                                 CLSID* a1,\n                                                 IUnknown* a2,\n                                                 DWORD a3,\n                                                 DWORD a4,\n                                                 OLECHAR* a5,\n                                                 DWORD a6,\n                                                 MULTI_QI* a7)\n    = CoGetInstanceFromFile;\n\nHRESULT (__stdcall * Real_CoGetInstanceFromIStorage)(COSERVERINFO* a0,\n                                                     CLSID* a1,\n                                                     IUnknown* a2,\n                                                     DWORD a3,\n                                                     IStorage* a4,\n                                                     DWORD a5,\n                                                     MULTI_QI* a6)\n    = CoGetInstanceFromIStorage;\n\nHRESULT (__stdcall * Real_CoGetInterfaceAndReleaseStream)(LPSTREAM a0,\n                                                          CONST IID& a1,\n                                                          LPVOID* a2)\n    = CoGetInterfaceAndReleaseStream;\n\nHRESULT (__stdcall * Real_CoGetMalloc)(DWORD a0,\n                                       IMalloc** a1)\n    = CoGetMalloc;\n\nHRESULT (__stdcall * Real_CoGetMarshalSizeMax)(ULONG* a0,\n                                               CONST IID& a1,\n                                               LPUNKNOWN a2,\n                                               DWORD a3,\n                                               LPVOID a4,\n                                               DWORD a5)\n    = CoGetMarshalSizeMax;\n\nHRESULT (__stdcall * Real_CoGetObject)(LPCWSTR a0,\n                                       BIND_OPTS* a1,\n                                       CONST IID& a2,\n                                       void** a3)\n    = CoGetObject;\n\nHRESULT (__stdcall * Real_CoGetPSClsid)(CONST IID& a0,\n                                        CLSID* a1)\n    = CoGetPSClsid;\n\nHRESULT (__stdcall * Real_CoGetStandardMarshal)(CONST IID& a0,\n                                                LPUNKNOWN a1,\n                                                DWORD a2,\n                                                LPVOID a3,\n                                                DWORD a4,\n                                                IMarshal** a5)\n    = CoGetStandardMarshal;\n\nHRESULT (__stdcall * Real_CoGetStdMarshalEx)(LPUNKNOWN a0,\n                                             DWORD a1,\n                                             LPUNKNOWN* a2)\n    = CoGetStdMarshalEx;\n\nHRESULT (__stdcall * Real_CoGetTreatAsClass)(CONST IID& a0,\n                                             LPGUID a1)\n    = CoGetTreatAsClass;\n\nHRESULT (__stdcall * Real_CoImpersonateClient)(void)\n    = CoImpersonateClient;\n\nHRESULT (__stdcall * Real_CoInitialize)(LPVOID a0)\n    = CoInitialize;\n\nHRESULT (__stdcall * Real_CoInitializeEx)(LPVOID a0,\n                                          DWORD a1)\n    = CoInitializeEx;\n\nHRESULT (__stdcall * Real_CoInitializeSecurity)(PSECURITY_DESCRIPTOR a0,\n                                                LONG a1,\n                                                SOLE_AUTHENTICATION_SERVICE* a2,\n                                                void* a3,\n                                                DWORD a4,\n                                                DWORD a5,\n                                                void* a6,\n                                                DWORD a7,\n                                                void* a8)\n    = CoInitializeSecurity;\n\nBOOL (__stdcall * Real_CoIsHandlerConnected)(LPUNKNOWN a0)\n    = CoIsHandlerConnected;\n\nBOOL (__stdcall * Real_CoIsOle1Class)(CONST IID& a0)\n    = CoIsOle1Class;\n\nHINSTANCE (__stdcall * Real_CoLoadLibrary)(LPOLESTR a0,\n                                           BOOL a1)\n    = CoLoadLibrary;\n\nHRESULT (__stdcall * Real_CoLockObjectExternal)(LPUNKNOWN a0,\n                                                BOOL a1,\n                                                BOOL a2)\n    = CoLockObjectExternal;\n\nHRESULT (__stdcall * Real_CoMarshalHresult)(LPSTREAM a0,\n                                            HRESULT a1)\n    = CoMarshalHresult;\n\nHRESULT (__stdcall * Real_CoMarshalInterThreadInterfaceInStream)(CONST IID& a0,\n                                                                 LPUNKNOWN a1,\n                                                                 LPSTREAM* a2)\n    = CoMarshalInterThreadInterfaceInStream;\n\nHRESULT (__stdcall * Real_CoMarshalInterface)(LPSTREAM a0,\n                                              CONST IID& a1,\n                                              LPUNKNOWN a2,\n                                              DWORD a3,\n                                              LPVOID a4,\n                                              DWORD a5)\n    = CoMarshalInterface;\n\nHRESULT (__stdcall * Real_CoQueryAuthenticationServices)(DWORD* a0,\n                                                         SOLE_AUTHENTICATION_SERVICE** a1)\n    = CoQueryAuthenticationServices;\n\nHRESULT (__stdcall * Real_CoQueryClientBlanket)(DWORD* a0,\n                                                DWORD* a1,\n                                                OLECHAR** a2,\n                                                DWORD* a3,\n                                                DWORD* a4,\n                                                RPC_AUTHZ_HANDLE* a5,\n                                                DWORD* a6)\n    = CoQueryClientBlanket;\n\nHRESULT (__stdcall * Real_CoQueryProxyBlanket)(IUnknown* a0,\n                                               DWORD* a1,\n                                               DWORD* a2,\n                                               OLECHAR** a3,\n                                               DWORD* a4,\n                                               DWORD* a5,\n                                               RPC_AUTH_IDENTITY_HANDLE* a6,\n                                               DWORD* a7)\n    = CoQueryProxyBlanket;\n\nHRESULT (__stdcall * Real_CoRegisterChannelHook)(CONST GUID& a0,\n                                                 IChannelHook* a1)\n    = CoRegisterChannelHook;\n\nHRESULT (__stdcall * Real_CoRegisterClassObject)(CONST IID& a0,\n                                                 LPUNKNOWN a1,\n                                                 DWORD a2,\n                                                 DWORD a3,\n                                                 LPDWORD a4)\n    = CoRegisterClassObject;\n\nHRESULT (__stdcall * Real_CoRegisterMallocSpy)(IMallocSpy* a0)\n    = CoRegisterMallocSpy;\n\nHRESULT (__stdcall * Real_CoRegisterMessageFilter)(LPMESSAGEFILTER a0,\n                                                   LPMESSAGEFILTER* a1)\n    = CoRegisterMessageFilter;\n\nHRESULT (__stdcall * Real_CoRegisterPSClsid)(CONST IID& a0,\n                                             CONST IID& a1)\n    = CoRegisterPSClsid;\n\nHRESULT (__stdcall * Real_CoRegisterSurrogate)(LPSURROGATE a0)\n    = CoRegisterSurrogate;\n\nHRESULT (__stdcall * Real_CoReleaseMarshalData)(LPSTREAM a0)\n    = CoReleaseMarshalData;\n\nULONG (__stdcall * Real_CoReleaseServerProcess)(void)\n    = CoReleaseServerProcess;\n\nHRESULT (__stdcall * Real_CoResumeClassObjects)(void)\n    = CoResumeClassObjects;\n\nHRESULT (__stdcall * Real_CoRevertToSelf)(void)\n    = CoRevertToSelf;\n\nHRESULT (__stdcall * Real_CoRevokeClassObject)(DWORD a0)\n    = CoRevokeClassObject;\n\nHRESULT (__stdcall * Real_CoRevokeMallocSpy)(void)\n    = CoRevokeMallocSpy;\n\nHRESULT (__stdcall * Real_CoSetProxyBlanket)(IUnknown* a0,\n                                             DWORD a1,\n                                             DWORD a2,\n                                             OLECHAR* a3,\n                                             DWORD a4,\n                                             DWORD a5,\n                                             RPC_AUTH_IDENTITY_HANDLE a6,\n                                             DWORD a7)\n    = CoSetProxyBlanket;\n\nHRESULT (__stdcall * Real_CoSuspendClassObjects)(void)\n    = CoSuspendClassObjects;\n\nHRESULT (__stdcall * Real_CoSwitchCallContext)(IUnknown* a0,\n                                               IUnknown** a1)\n    = CoSwitchCallContext;\n\nLPVOID (__stdcall * Real_CoTaskMemAlloc)(SIZE_T a0)\n    = CoTaskMemAlloc;\n\nvoid (__stdcall * Real_CoTaskMemFree)(LPVOID a0)\n    = CoTaskMemFree;\n\nLPVOID (__stdcall * Real_CoTaskMemRealloc)(LPVOID a0,\n                                           SIZE_T a1)\n    = CoTaskMemRealloc;\n\nHRESULT (__stdcall * Real_CoTreatAsClass)(CONST IID& a0,\n                                          CONST IID& a1)\n    = CoTreatAsClass;\n\nvoid (__stdcall * Real_CoUninitialize)(void)\n    = CoUninitialize;\n\nHRESULT (__stdcall * Real_CoUnmarshalHresult)(LPSTREAM a0,\n                                              HRESULT* a1)\n    = CoUnmarshalHresult;\n\nHRESULT (__stdcall * Real_CoUnmarshalInterface)(LPSTREAM a0,\n                                                CONST IID& a1,\n                                                LPVOID* a2)\n    = CoUnmarshalInterface;\n\nBOOL (__stdcall * Real_ColorMatchToTarget)(HDC a0,\n                                           HDC a1,\n                                           DWORD a2)\n    = ColorMatchToTarget;\n\nint (__stdcall * Real_CombineRgn)(HRGN a0,\n                                  HRGN a1,\n                                  HRGN a2,\n                                  int a3)\n    = CombineRgn;\n\nBOOL (__stdcall * Real_CombineTransform)(LPXFORM a0,\n                                         CONST XFORM* a1,\n                                         CONST XFORM* a2)\n    = CombineTransform;\n\nBOOL (__stdcall * Real_CommConfigDialogA)(LPCSTR a0,\n                                          HWND a1,\n                                          LPCOMMCONFIG a2)\n    = CommConfigDialogA;\n\nBOOL (__stdcall * Real_CommConfigDialogW)(LPCWSTR a0,\n                                          HWND a1,\n                                          LPCOMMCONFIG a2)\n    = CommConfigDialogW;\n\nLONG (__stdcall * Real_CompareFileTime)(CONST FILETIME* a0,\n                                        CONST FILETIME* a1)\n    = CompareFileTime;\n\nint (__stdcall * Real_CompareStringA)(LCID a0,\n                                      DWORD a1,\n                                      LPCSTR a2,\n                                      int a3,\n                                      LPCSTR a4,\n                                      int a5)\n    = CompareStringA;\n\nint (__stdcall * Real_CompareStringW)(LCID a0,\n                                      DWORD a1,\n                                      LPCWSTR a2,\n                                      int a3,\n                                      LPCWSTR a4,\n                                      int a5)\n    = CompareStringW;\n\nBOOL (__stdcall * Real_ConnectNamedPipe)(HANDLE a0,\n                                         LPOVERLAPPED a1)\n    = ConnectNamedPipe;\n\n#if !defined(DETOURS_ARM)\nBOOL (__stdcall * Real_ContinueDebugEvent)(DWORD a0,\n                                           DWORD a1,\n                                           DWORD a2)\n    = ContinueDebugEvent;\n#endif // !DETOURS_ARM\n\nLCID (__stdcall * Real_ConvertDefaultLocale)(LCID a0)\n    = ConvertDefaultLocale;\n\nLPVOID (__stdcall * Real_ConvertThreadToFiber)(LPVOID a0)\n    = ConvertThreadToFiber;\n\nint (__stdcall * Real_CopyAcceleratorTableA)(HACCEL a0,\n                                             LPACCEL a1,\n                                             int a2)\n    = CopyAcceleratorTableA;\n\nint (__stdcall * Real_CopyAcceleratorTableW)(HACCEL a0,\n                                             LPACCEL a1,\n                                             int a2)\n    = CopyAcceleratorTableW;\n\nHENHMETAFILE (__stdcall * Real_CopyEnhMetaFileA)(HENHMETAFILE a0,\n                                                 LPCSTR a1)\n    = CopyEnhMetaFileA;\n\nHENHMETAFILE (__stdcall * Real_CopyEnhMetaFileW)(HENHMETAFILE a0,\n                                                 LPCWSTR a1)\n    = CopyEnhMetaFileW;\n\nBOOL (__stdcall * Real_CopyFileA)(LPCSTR a0,\n                                  LPCSTR a1,\n                                  BOOL a2)\n    = CopyFileA;\n\nBOOL (__stdcall * Real_CopyFileExA)(LPCSTR a0,\n                                    LPCSTR a1,\n                                    LPPROGRESS_ROUTINE a2,\n                                    LPVOID a3,\n                                    LPBOOL a4,\n                                    DWORD a5)\n    = CopyFileExA;\n\nBOOL (__stdcall * Real_CopyFileExW)(LPCWSTR a0,\n                                    LPCWSTR a1,\n                                    LPPROGRESS_ROUTINE a2,\n                                    LPVOID a3,\n                                    LPBOOL a4,\n                                    DWORD a5)\n    = CopyFileExW;\n\nBOOL (__stdcall * Real_CopyFileW)(LPCWSTR a0,\n                                  LPCWSTR a1,\n                                  BOOL a2)\n    = CopyFileW;\n\nHICON (__stdcall * Real_CopyIcon)(HICON a0)\n    = CopyIcon;\n\nHANDLE (__stdcall * Real_CopyImage)(HANDLE a0,\n                                    UINT a1,\n                                    int a2,\n                                    int a3,\n                                    UINT a4)\n    = CopyImage;\n\nHMETAFILE (__stdcall * Real_CopyMetaFileA)(HMETAFILE a0,\n                                           LPCSTR a1)\n    = CopyMetaFileA;\n\nHMETAFILE (__stdcall * Real_CopyMetaFileW)(HMETAFILE a0,\n                                           LPCWSTR a1)\n    = CopyMetaFileW;\n\nBOOL (__stdcall * Real_CopyRect)(LPRECT a0,\n                                 CONST RECT* a1)\n    = CopyRect;\n\nint (__stdcall * Real_CountClipboardFormats)(void)\n    = CountClipboardFormats;\n\nHACCEL (__stdcall * Real_CreateAcceleratorTableA)(LPACCEL a0,\n                                                  int a1)\n    = CreateAcceleratorTableA;\n\nHACCEL (__stdcall * Real_CreateAcceleratorTableW)(LPACCEL a0,\n                                                  int a1)\n    = CreateAcceleratorTableW;\n\nHRESULT (__stdcall * Real_CreateAntiMoniker)(IMoniker** a0)\n    = CreateAntiMoniker;\n\nHRESULT (__stdcall * Real_CreateBindCtx)(DWORD a0,\n                                         IBindCtx** a1)\n    = CreateBindCtx;\n\nHBITMAP (__stdcall * Real_CreateBitmap)(int a0,\n                                        int a1,\n                                        UINT a2,\n                                        UINT a3,\n                                        CONST void* a4)\n    = CreateBitmap;\n\nHBITMAP (__stdcall * Real_CreateBitmapIndirect)(CONST BITMAP* a0)\n    = CreateBitmapIndirect;\n\nHBRUSH (__stdcall * Real_CreateBrushIndirect)(CONST LOGBRUSH* a0)\n    = CreateBrushIndirect;\n\nBOOL (__stdcall * Real_CreateCaret)(HWND a0,\n                                    HBITMAP a1,\n                                    int a2,\n                                    int a3)\n    = CreateCaret;\n\nHRESULT (__stdcall * Real_CreateClassMoniker)(CONST IID& a0,\n                                              IMoniker** a1)\n    = CreateClassMoniker;\n\nHCOLORSPACE (__stdcall * Real_CreateColorSpaceA)(LPLOGCOLORSPACEA a0)\n    = CreateColorSpaceA;\n\nHCOLORSPACE (__stdcall * Real_CreateColorSpaceW)(LPLOGCOLORSPACEW a0)\n    = CreateColorSpaceW;\n\nHBITMAP (__stdcall * Real_CreateCompatibleBitmap)(HDC a0,\n                                                  int a1,\n                                                  int a2)\n    = CreateCompatibleBitmap;\n\nHDC (__stdcall * Real_CreateCompatibleDC)(HDC a0)\n    = CreateCompatibleDC;\n\nHANDLE (__stdcall * Real_CreateConsoleScreenBuffer)(DWORD a0,\n                                                    DWORD a1,\n                                                    CONST SECURITY_ATTRIBUTES* a2,\n                                                    DWORD a3,\n                                                    LPVOID a4)\n    = CreateConsoleScreenBuffer;\n\nHCURSOR (__stdcall * Real_CreateCursor)(HINSTANCE a0,\n                                        int a1,\n                                        int a2,\n                                        int a3,\n                                        int a4,\n                                        CONST void* a5,\n                                        CONST void* a6)\n    = CreateCursor;\n\nHDC (__stdcall * Real_CreateDCA)(LPCSTR a0,\n                                 LPCSTR a1,\n                                 LPCSTR a2,\n                                 CONST DEVMODEA * a3)\n    = CreateDCA;\n\nHDC (__stdcall * Real_CreateDCW)(LPCWSTR a0,\n                                 LPCWSTR a1,\n                                 LPCWSTR a2,\n                                 CONST DEVMODEW * a3)\n    = CreateDCW;\n\nHBRUSH (__stdcall * Real_CreateDIBPatternBrush)(HGLOBAL a0,\n                                                UINT a1)\n    = CreateDIBPatternBrush;\n\nHBRUSH (__stdcall * Real_CreateDIBPatternBrushPt)(CONST void* a0,\n                                                  UINT a1)\n    = CreateDIBPatternBrushPt;\n\nHBITMAP (__stdcall * Real_CreateDIBSection)(HDC a0,\n                                            CONST BITMAPINFO* a1,\n                                            UINT a2,\n                                            void** a3,\n                                            HANDLE a4,\n                                            DWORD a5)\n    = CreateDIBSection;\n\nHBITMAP (__stdcall * Real_CreateDIBitmap)(HDC a0,\n                                          CONST BITMAPINFOHEADER* a1,\n                                          DWORD a2,\n                                          CONST void* a3,\n                                          CONST BITMAPINFO* a4,\n                                          UINT a5)\n    = CreateDIBitmap;\n\nHRESULT (__stdcall * Real_CreateDataAdviseHolder)(LPDATAADVISEHOLDER* a0)\n    = CreateDataAdviseHolder;\n\nHRESULT (__stdcall * Real_CreateDataCache)(LPUNKNOWN a0,\n                                           CONST IID& a1,\n                                           CONST IID& a2,\n                                           LPVOID* a3)\n    = CreateDataCache;\n\n#if _MSC_VER < 1300\nHDESK (__stdcall * Real_CreateDesktopA)(LPSTR a0,\n                                        LPSTR a1,\n                                        LPDEVMODEA a2,\n                                        DWORD a3,\n                                        ACCESS_MASK a4,\n                                        LPSECURITY_ATTRIBUTES a5)\n    = CreateDesktopA;\n#else\nHDESK (__stdcall * Real_CreateDesktopA)(LPCSTR a0,\n                                        LPCSTR a1,\n                                        LPDEVMODEA a2,\n                                        DWORD a3,\n                                        ACCESS_MASK a4,\n                                        LPSECURITY_ATTRIBUTES a5)\n    = CreateDesktopA;\n\n#endif\n\n#if _MSC_VER < 1300\nHDESK (__stdcall * Real_CreateDesktopW)(LPWSTR a0,\n                                        LPWSTR a1,\n                                        LPDEVMODEW a2,\n                                        DWORD a3,\n                                        ACCESS_MASK a4,\n                                        LPSECURITY_ATTRIBUTES a5)\n    = CreateDesktopW;\n#else\nHDESK (__stdcall * Real_CreateDesktopW)(LPCWSTR a0,\n                                        LPCWSTR a1,\n                                        LPDEVMODEW a2,\n                                        DWORD a3,\n                                        ACCESS_MASK a4,\n                                        LPSECURITY_ATTRIBUTES a5)\n    = CreateDesktopW;\n#endif\n\nHWND (__stdcall * Real_CreateDialogIndirectParamA)(HINSTANCE a0,\n                                                   LPCDLGTEMPLATEA a1,\n                                                   HWND a2,\n                                                   DLGPROC a3,\n                                                   LPARAM a4)\n    = CreateDialogIndirectParamA;\n\nHWND (__stdcall * Real_CreateDialogIndirectParamW)(HINSTANCE a0,\n                                                   LPCDLGTEMPLATEW a1,\n                                                   HWND a2,\n                                                   DLGPROC a3,\n                                                   LPARAM a4)\n    = CreateDialogIndirectParamW;\n\nHWND (__stdcall * Real_CreateDialogParamA)(HINSTANCE a0,\n                                           LPCSTR a1,\n                                           HWND a2,\n                                           DLGPROC a3,\n                                           LPARAM a4)\n    = CreateDialogParamA;\n\nHWND (__stdcall * Real_CreateDialogParamW)(HINSTANCE a0,\n                                           LPCWSTR a1,\n                                           HWND a2,\n                                           DLGPROC a3,\n                                           LPARAM a4)\n    = CreateDialogParamW;\n\nBOOL (__stdcall * Real_CreateDirectoryA)(LPCSTR a0,\n                                         LPSECURITY_ATTRIBUTES a1)\n    = CreateDirectoryA;\n\nBOOL (__stdcall * Real_CreateDirectoryExA)(LPCSTR a0,\n                                           LPCSTR a1,\n                                           LPSECURITY_ATTRIBUTES a2)\n    = CreateDirectoryExA;\n\nBOOL (__stdcall * Real_CreateDirectoryExW)(LPCWSTR a0,\n                                           LPCWSTR a1,\n                                           LPSECURITY_ATTRIBUTES a2)\n    = CreateDirectoryExW;\n\nBOOL (__stdcall * Real_CreateDirectoryW)(LPCWSTR a0,\n                                         LPSECURITY_ATTRIBUTES a1)\n    = CreateDirectoryW;\n\nHBITMAP (__stdcall * Real_CreateDiscardableBitmap)(HDC a0,\n                                                   int a1,\n                                                   int a2)\n    = CreateDiscardableBitmap;\n\nHRGN (__stdcall * Real_CreateEllipticRgn)(int a0,\n                                          int a1,\n                                          int a2,\n                                          int a3)\n    = CreateEllipticRgn;\n\nHRGN (__stdcall * Real_CreateEllipticRgnIndirect)(CONST RECT* a0)\n    = CreateEllipticRgnIndirect;\n\nHDC (__stdcall * Real_CreateEnhMetaFileA)(HDC a0,\n                                          LPCSTR a1,\n                                          CONST RECT* a2,\n                                          LPCSTR a3)\n    = CreateEnhMetaFileA;\n\nHDC (__stdcall * Real_CreateEnhMetaFileW)(HDC a0,\n                                          LPCWSTR a1,\n                                          CONST RECT* a2,\n                                          LPCWSTR a3)\n    = CreateEnhMetaFileW;\n\nHANDLE (__stdcall * Real_CreateEventA)(LPSECURITY_ATTRIBUTES a0,\n                                       BOOL a1,\n                                       BOOL a2,\n                                       LPCSTR a3)\n    = CreateEventA;\n\nHANDLE (__stdcall * Real_CreateEventW)(LPSECURITY_ATTRIBUTES a0,\n                                       BOOL a1,\n                                       BOOL a2,\n                                       LPCWSTR a3)\n    = CreateEventW;\n\nLPVOID (__stdcall * Real_CreateFiber)(ULONG_PTR a0,\n                                      LPFIBER_START_ROUTINE a1,\n                                      LPVOID a2)\n    = CreateFiber;\n\nHANDLE (__stdcall * Real_CreateFileA)(LPCSTR a0,\n                                      DWORD a1,\n                                      DWORD a2,\n                                      LPSECURITY_ATTRIBUTES a3,\n                                      DWORD a4,\n                                      DWORD a5,\n                                      HANDLE a6)\n    = CreateFileA;\n\nHANDLE (__stdcall * Real_CreateFileMappingA)(HANDLE a0,\n                                             LPSECURITY_ATTRIBUTES a1,\n                                             DWORD a2,\n                                             DWORD a3,\n                                             DWORD a4,\n                                             LPCSTR a5)\n    = CreateFileMappingA;\n\nHANDLE (__stdcall * Real_CreateFileMappingW)(HANDLE a0,\n                                             LPSECURITY_ATTRIBUTES a1,\n                                             DWORD a2,\n                                             DWORD a3,\n                                             DWORD a4,\n                                             LPCWSTR a5)\n    = CreateFileMappingW;\n\nHRESULT (__stdcall * Real_CreateFileMoniker)(LPCOLESTR a0,\n                                             IMoniker** a1)\n    = CreateFileMoniker;\n\nHANDLE (__stdcall * Real_CreateFileW)(LPCWSTR a0,\n                                      DWORD a1,\n                                      DWORD a2,\n                                      LPSECURITY_ATTRIBUTES a3,\n                                      DWORD a4,\n                                      DWORD a5,\n                                      HANDLE a6)\n    = CreateFileW;\n\nHFONT (__stdcall * Real_CreateFontA)(int a0,\n                                     int a1,\n                                     int a2,\n                                     int a3,\n                                     int a4,\n                                     DWORD a5,\n                                     DWORD a6,\n                                     DWORD a7,\n                                     DWORD a8,\n                                     DWORD a9,\n                                     DWORD a10,\n                                     DWORD a11,\n                                     DWORD a12,\n                                     LPCSTR a13)\n    = CreateFontA;\n\nHFONT (__stdcall * Real_CreateFontIndirectA)(CONST LOGFONTA* a0)\n    = CreateFontIndirectA;\n\nHFONT (__stdcall * Real_CreateFontIndirectW)(CONST LOGFONTW* a0)\n    = CreateFontIndirectW;\n\nHFONT (__stdcall * Real_CreateFontW)(int a0,\n                                     int a1,\n                                     int a2,\n                                     int a3,\n                                     int a4,\n                                     DWORD a5,\n                                     DWORD a6,\n                                     DWORD a7,\n                                     DWORD a8,\n                                     DWORD a9,\n                                     DWORD a10,\n                                     DWORD a11,\n                                     DWORD a12,\n                                     LPCWSTR a13)\n    = CreateFontW;\n\nHRESULT (__stdcall * Real_CreateGenericComposite)(IMoniker* a0,\n                                                  IMoniker* a1,\n                                                  IMoniker** a2)\n    = CreateGenericComposite;\n\nHPALETTE (__stdcall * Real_CreateHalftonePalette)(HDC a0)\n    = CreateHalftonePalette;\n\nHBRUSH (__stdcall * Real_CreateHatchBrush)(int a0,\n                                           COLORREF a1)\n    = CreateHatchBrush;\n\nHDC (__stdcall * Real_CreateICA)(LPCSTR a0,\n                                 LPCSTR a1,\n                                 LPCSTR a2,\n                                 CONST DEVMODEA* a3)\n    = CreateICA;\n\nHDC (__stdcall * Real_CreateICW)(LPCWSTR a0,\n                                 LPCWSTR a1,\n                                 LPCWSTR a2,\n                                 CONST DEVMODEW* a3)\n    = CreateICW;\n\nHRESULT (__stdcall * Real_CreateILockBytesOnHGlobal)(HGLOBAL a0,\n                                                     BOOL a1,\n                                                     ILockBytes** a2)\n    = CreateILockBytesOnHGlobal;\n\nHICON (__stdcall * Real_CreateIcon)(HINSTANCE a0,\n                                    int a1,\n                                    int a2,\n                                    BYTE a3,\n                                    BYTE a4,\n                                    CONST BYTE* a5,\n                                    CONST BYTE* a6)\n    = CreateIcon;\n\nHICON (__stdcall * Real_CreateIconFromResource)(PBYTE a0,\n                                                DWORD a1,\n                                                BOOL a2,\n                                                DWORD a3)\n    = CreateIconFromResource;\n\nHICON (__stdcall * Real_CreateIconFromResourceEx)(PBYTE a0,\n                                                  DWORD a1,\n                                                  BOOL a2,\n                                                  DWORD a3,\n                                                  int a4,\n                                                  int a5,\n                                                  UINT a6)\n    = CreateIconFromResourceEx;\n\nHICON (__stdcall * Real_CreateIconIndirect)(PICONINFO a0)\n    = CreateIconIndirect;\n\nHANDLE (__stdcall * Real_CreateIoCompletionPort)(HANDLE a0,\n                                                 HANDLE a1,\n                                                 ULONG_PTR a2,\n                                                 DWORD a3)\n    = CreateIoCompletionPort;\n\nHRESULT (__stdcall * Real_CreateItemMoniker)(LPCOLESTR a0,\n                                             LPCOLESTR a1,\n                                             IMoniker** a2)\n    = CreateItemMoniker;\n\n#if _MSC_VER < 1300\nHWND (__stdcall * Real_CreateMDIWindowA)(LPSTR a0,\n                                         LPSTR a1,\n                                         DWORD a2,\n                                         int a3,\n                                         int a4,\n                                         int a5,\n                                         int a6,\n                                         HWND a7,\n                                         HINSTANCE a8,\n                                         LPARAM a9)\n    = CreateMDIWindowA;\n#else\nHWND (__stdcall * Real_CreateMDIWindowA)(LPCSTR a0,\n                                         LPCSTR a1,\n                                         DWORD a2,\n                                         int a3,\n                                         int a4,\n                                         int a5,\n                                         int a6,\n                                         HWND a7,\n                                         HINSTANCE a8,\n                                         LPARAM a9)\n    = CreateMDIWindowA;\n#endif\n\n#if _MSC_VER < 1300\nHWND (__stdcall * Real_CreateMDIWindowW)(LPWSTR a0,\n                                         LPWSTR a1,\n                                         DWORD a2,\n                                         int a3,\n                                         int a4,\n                                         int a5,\n                                         int a6,\n                                         HWND a7,\n                                         HINSTANCE a8,\n                                         LPARAM a9)\n    = CreateMDIWindowW;\n#else\nHWND (__stdcall * Real_CreateMDIWindowW)(LPCWSTR a0,\n                                         LPCWSTR a1,\n                                         DWORD a2,\n                                         int a3,\n                                         int a4,\n                                         int a5,\n                                         int a6,\n                                         HWND a7,\n                                         HINSTANCE a8,\n                                         LPARAM a9)\n    = CreateMDIWindowW;\n#endif\n\nHANDLE (__stdcall * Real_CreateMailslotA)(LPCSTR a0,\n                                          DWORD a1,\n                                          DWORD a2,\n                                          LPSECURITY_ATTRIBUTES a3)\n    = CreateMailslotA;\n\nHANDLE (__stdcall * Real_CreateMailslotW)(LPCWSTR a0,\n                                          DWORD a1,\n                                          DWORD a2,\n                                          LPSECURITY_ATTRIBUTES a3)\n    = CreateMailslotW;\n\nHMENU (__stdcall * Real_CreateMenu)(void)\n    = CreateMenu;\n\nHDC (__stdcall * Real_CreateMetaFileA)(LPCSTR a0)\n    = CreateMetaFileA;\n\nHDC (__stdcall * Real_CreateMetaFileW)(LPCWSTR a0)\n    = CreateMetaFileW;\n\nHANDLE (__stdcall * Real_CreateMutexA)(LPSECURITY_ATTRIBUTES a0,\n                                       BOOL a1,\n                                       LPCSTR a2)\n    = CreateMutexA;\n\nHANDLE (__stdcall * Real_CreateMutexW)(LPSECURITY_ATTRIBUTES a0,\n                                       BOOL a1,\n                                       LPCWSTR a2)\n    = CreateMutexW;\n\nHANDLE (__stdcall * Real_CreateNamedPipeA)(LPCSTR a0,\n                                           DWORD a1,\n                                           DWORD a2,\n                                           DWORD a3,\n                                           DWORD a4,\n                                           DWORD a5,\n                                           DWORD a6,\n                                           LPSECURITY_ATTRIBUTES a7)\n    = CreateNamedPipeA;\n\nHANDLE (__stdcall * Real_CreateNamedPipeW)(LPCWSTR a0,\n                                           DWORD a1,\n                                           DWORD a2,\n                                           DWORD a3,\n                                           DWORD a4,\n                                           DWORD a5,\n                                           DWORD a6,\n                                           LPSECURITY_ATTRIBUTES a7)\n    = CreateNamedPipeW;\n\nHRESULT (__stdcall * Real_CreateOleAdviseHolder)(LPOLEADVISEHOLDER* a0)\n    = CreateOleAdviseHolder;\n\nHPALETTE (__stdcall * Real_CreatePalette)(CONST LOGPALETTE* a0)\n    = CreatePalette;\n\nHBRUSH (__stdcall * Real_CreatePatternBrush)(HBITMAP a0)\n    = CreatePatternBrush;\n\nHPEN (__stdcall * Real_CreatePen)(int a0,\n                                  int a1,\n                                  COLORREF a2)\n    = CreatePen;\n\nHPEN (__stdcall * Real_CreatePenIndirect)(CONST LOGPEN* a0)\n    = CreatePenIndirect;\n\nBOOL (__stdcall * Real_CreatePipe)(PHANDLE a0,\n                                   PHANDLE a1,\n                                   LPSECURITY_ATTRIBUTES a2,\n                                   DWORD a3)\n    = CreatePipe;\n\nHRESULT (__stdcall * Real_CreatePointerMoniker)(LPUNKNOWN a0,\n                                                IMoniker** a1)\n    = CreatePointerMoniker;\n\nHRGN (__stdcall * Real_CreatePolyPolygonRgn)(CONST POINT* a0,\n                                             CONST INT* a1,\n                                             int a2,\n                                             int a3)\n    = CreatePolyPolygonRgn;\n\nHRGN (__stdcall * Real_CreatePolygonRgn)(CONST POINT* a0,\n                                         int a1,\n                                         int a2)\n    = CreatePolygonRgn;\n\nHMENU (__stdcall * Real_CreatePopupMenu)(void)\n    = CreatePopupMenu;\n\nBOOL (__stdcall * Real_CreateProcessA)(LPCSTR a0,\n                                       LPSTR a1,\n                                       LPSECURITY_ATTRIBUTES a2,\n                                       LPSECURITY_ATTRIBUTES a3,\n                                       BOOL a4,\n                                       DWORD a5,\n                                       LPVOID a6,\n                                       LPCSTR a7,\n                                       LPSTARTUPINFOA a8,\n                                       LPPROCESS_INFORMATION a9)\n    = CreateProcessA;\n\nBOOL (__stdcall * Real_CreateProcessW)(LPCWSTR a0,\n                                       LPWSTR a1,\n                                       LPSECURITY_ATTRIBUTES a2,\n                                       LPSECURITY_ATTRIBUTES a3,\n                                       BOOL a4,\n                                       DWORD a5,\n                                       LPVOID a6,\n                                       LPCWSTR a7,\n                                       LPSTARTUPINFOW a8,\n                                       LPPROCESS_INFORMATION a9)\n    = CreateProcessW;\n\nBOOL (__stdcall * Real_CreateProcessAsUserA)(\n  __in_opt     HANDLE hToken,\n  __in_opt     LPCSTR lpApplicationName,\n  __inout_opt  LPSTR lpCommandLine,\n  __in_opt     LPSECURITY_ATTRIBUTES lpProcessAttributes,\n  __in_opt     LPSECURITY_ATTRIBUTES lpThreadAttributes,\n  __in         BOOL bInheritHandles,\n  __in         DWORD dwCreationFlags,\n  __in_opt     LPVOID lpEnvironment,\n  __in_opt     LPCSTR lpCurrentDirectory,\n  __in         LPSTARTUPINFOA lpStartupInfo,\n  __out        LPPROCESS_INFORMATION lpProcessInformation\n                                       ) = CreateProcessAsUserA;\n\nBOOL (__stdcall * Real_CreateProcessAsUserW)(\n  __in_opt     HANDLE hToken,\n  __in_opt     LPCWSTR lpApplicationName,\n  __inout_opt  LPWSTR lpCommandLine,\n  __in_opt     LPSECURITY_ATTRIBUTES lpProcessAttributes,\n  __in_opt     LPSECURITY_ATTRIBUTES lpThreadAttributes,\n  __in         BOOL bInheritHandles,\n  __in         DWORD dwCreationFlags,\n  __in_opt     LPVOID lpEnvironment,\n  __in_opt     LPCWSTR lpCurrentDirectory,\n  __in         LPSTARTUPINFOW lpStartupInfo,\n  __out        LPPROCESS_INFORMATION lpProcessInformation\n) = CreateProcessAsUserW;\n\n#if(_WIN32_WINNT >= 0x0500)\n\nBOOL (WINAPI * Real_CreateProcessWithLogonW)(\n  __in         LPCWSTR lpUsername,\n  __in_opt     LPCWSTR lpDomain,\n  __in         LPCWSTR lpPassword,\n  __in         DWORD dwLogonFlags,\n  __in_opt     LPCWSTR lpApplicationName,\n  __inout_opt  LPWSTR lpCommandLine,\n  __in         DWORD dwCreationFlags,\n  __in_opt     LPVOID lpEnvironment,\n  __in_opt     LPCWSTR lpCurrentDirectory,\n  __in         LPSTARTUPINFOW lpStartupInfo,\n  __out        LPPROCESS_INFORMATION lpProcessInfo\n) = CreateProcessWithLogonW;\n\nBOOL (WINAPI * Real_CreateProcessWithTokenW)(\n  __in         HANDLE hToken,\n  __in         DWORD dwLogonFlags,\n  __in_opt     LPCWSTR lpApplicationName,\n  __inout_opt  LPWSTR lpCommandLine,\n  __in         DWORD dwCreationFlags,\n  __in_opt     LPVOID lpEnvironment,\n  __in_opt     LPCWSTR lpCurrentDirectory,\n  __in         LPSTARTUPINFOW lpStartupInfo,\n  __out        LPPROCESS_INFORMATION lpProcessInfo\n) = CreateProcessWithTokenW;\n#endif\n\nHRGN (__stdcall * Real_CreateRectRgn)(int a0,\n                                      int a1,\n                                      int a2,\n                                      int a3)\n    = CreateRectRgn;\n\nHRGN (__stdcall * Real_CreateRectRgnIndirect)(CONST RECT* a0)\n    = CreateRectRgnIndirect;\n\nHANDLE (__stdcall * Real_CreateRemoteThread)(HANDLE a0,\n                                             LPSECURITY_ATTRIBUTES a1,\n                                             ULONG_PTR a2,\n                                             LPTHREAD_START_ROUTINE a3,\n                                             LPVOID a4,\n                                             DWORD a5,\n                                             LPDWORD a6)\n    = CreateRemoteThread;\n\nHRGN (__stdcall * Real_CreateRoundRectRgn)(int a0,\n                                           int a1,\n                                           int a2,\n                                           int a3,\n                                           int a4,\n                                           int a5)\n    = CreateRoundRectRgn;\n\nBOOL (__stdcall * Real_CreateScalableFontResourceA)(DWORD a0,\n                                                    LPCSTR a1,\n                                                    LPCSTR a2,\n                                                    LPCSTR a3)\n    = CreateScalableFontResourceA;\n\nBOOL (__stdcall * Real_CreateScalableFontResourceW)(DWORD a0,\n                                                    LPCWSTR a1,\n                                                    LPCWSTR a2,\n                                                    LPCWSTR a3)\n    = CreateScalableFontResourceW;\n\nHANDLE (__stdcall * Real_CreateSemaphoreA)(LPSECURITY_ATTRIBUTES a0,\n                                           LONG a1,\n                                           LONG a2,\n                                           LPCSTR a3)\n    = CreateSemaphoreA;\n\nHANDLE (__stdcall * Real_CreateSemaphoreW)(LPSECURITY_ATTRIBUTES a0,\n                                           LONG a1,\n                                           LONG a2,\n                                           LPCWSTR a3)\n    = CreateSemaphoreW;\n\nHBRUSH (__stdcall * Real_CreateSolidBrush)(COLORREF a0)\n    = CreateSolidBrush;\n\nHRESULT (__stdcall * Real_CreateStdProgressIndicator)(HWND a0,\n                                                      LPCOLESTR a1,\n                                                      IBindStatusCallback* a2,\n                                                      IBindStatusCallback** a3)\n    = CreateStdProgressIndicator;\n\nHRESULT (__stdcall * Real_CreateStreamOnHGlobal)(HGLOBAL a0,\n                                                 BOOL a1,\n                                                 LPSTREAM* a2)\n    = CreateStreamOnHGlobal;\n\nDWORD (__stdcall * Real_CreateTapePartition)(HANDLE a0,\n                                             DWORD a1,\n                                             DWORD a2,\n                                             DWORD a3)\n    = CreateTapePartition;\n\nHANDLE (__stdcall * Real_CreateThread)(LPSECURITY_ATTRIBUTES a0,\n                                       ULONG_PTR a1,\n                                       LPTHREAD_START_ROUTINE a2,\n                                       LPVOID a3,\n                                       DWORD a4,\n                                       LPDWORD a5)\n    = CreateThread;\n\nHANDLE (__stdcall * Real_CreateWaitableTimerA)(LPSECURITY_ATTRIBUTES a0,\n                                               BOOL a1,\n                                               LPCSTR a2)\n    = CreateWaitableTimerA;\n\nHANDLE (__stdcall * Real_CreateWaitableTimerW)(LPSECURITY_ATTRIBUTES a0,\n                                               BOOL a1,\n                                               LPCWSTR a2)\n    = CreateWaitableTimerW;\n\nHWND (__stdcall * Real_CreateWindowExA)(DWORD a0,\n                                        LPCSTR a1,\n                                        LPCSTR a2,\n                                        DWORD a3,\n                                        int a4,\n                                        int a5,\n                                        int a6,\n                                        int a7,\n                                        HWND a8,\n                                        HMENU a9,\n                                        HINSTANCE a10,\n                                        LPVOID a11)\n    = CreateWindowExA;\n\nHWND (__stdcall * Real_CreateWindowExW)(DWORD a0,\n                                        LPCWSTR a1,\n                                        LPCWSTR a2,\n                                        DWORD a3,\n                                        int a4,\n                                        int a5,\n                                        int a6,\n                                        int a7,\n                                        HWND a8,\n                                        HMENU a9,\n                                        HINSTANCE a10,\n                                        LPVOID a11)\n    = CreateWindowExW;\n\n#if _MSC_VER < 1300\nHWINSTA (__stdcall * Real_CreateWindowStationA)(LPSTR a0,\n                                                DWORD a1,\n                                                ACCESS_MASK a2,\n                                                LPSECURITY_ATTRIBUTES a3)\n    = CreateWindowStationA;\n#else\nHWINSTA (__stdcall * Real_CreateWindowStationA)(LPCSTR a0,\n                                                DWORD a1,\n                                                ACCESS_MASK a2,\n                                                LPSECURITY_ATTRIBUTES a3)\n    = CreateWindowStationA;\n#endif\n\n#if _MSC_VER < 1300\nHWINSTA (__stdcall * Real_CreateWindowStationW)(LPWSTR a0,\n                                                DWORD a1,\n                                                ACCESS_MASK a2,\n                                                LPSECURITY_ATTRIBUTES a3)\n    = CreateWindowStationW;\n#else\nHWINSTA (__stdcall * Real_CreateWindowStationW)(LPCWSTR a0,\n                                                DWORD a1,\n                                                ACCESS_MASK a2,\n                                                LPSECURITY_ATTRIBUTES a3)\n    = CreateWindowStationW;\n#endif\n\nBOOL (__stdcall * Real_DPtoLP)(HDC a0,\n                               POINT* a1,\n                               int a2)\n    = DPtoLP;\n\nBOOL (__stdcall * Real_DdeAbandonTransaction)(DWORD a0,\n                                              HCONV a1,\n                                              DWORD a2)\n    = DdeAbandonTransaction;\n\nLPBYTE (__stdcall * Real_DdeAccessData)(HDDEDATA a0,\n                                        LPDWORD a1)\n    = DdeAccessData;\n\nHDDEDATA (__stdcall * Real_DdeAddData)(HDDEDATA a0,\n                                       LPBYTE a1,\n                                       DWORD a2,\n                                       DWORD a3)\n    = DdeAddData;\n\nHDDEDATA (__stdcall * Real_DdeClientTransaction)(LPBYTE a0,\n                                                 DWORD a1,\n                                                 HCONV a2,\n                                                 HSZ a3,\n                                                 UINT a4,\n                                                 UINT a5,\n                                                 DWORD a6,\n                                                 LPDWORD a7)\n    = DdeClientTransaction;\n\nint (__stdcall * Real_DdeCmpStringHandles)(HSZ a0,\n                                           HSZ a1)\n    = DdeCmpStringHandles;\n\nHCONV (__stdcall * Real_DdeConnect)(DWORD a0,\n                                    HSZ a1,\n                                    HSZ a2,\n                                    PCONVCONTEXT a3)\n    = DdeConnect;\n\nHCONVLIST (__stdcall * Real_DdeConnectList)(DWORD a0,\n                                            HSZ a1,\n                                            HSZ a2,\n                                            HCONVLIST a3,\n                                            PCONVCONTEXT a4)\n    = DdeConnectList;\n\nHDDEDATA (__stdcall * Real_DdeCreateDataHandle)(DWORD a0,\n                                                LPBYTE a1,\n                                                DWORD a2,\n                                                DWORD a3,\n                                                HSZ a4,\n                                                UINT a5,\n                                                UINT a6)\n    = DdeCreateDataHandle;\n\nHSZ (__stdcall * Real_DdeCreateStringHandleA)(DWORD a0,\n                                              LPCSTR a1,\n                                              int a2)\n    = DdeCreateStringHandleA;\n\nHSZ (__stdcall * Real_DdeCreateStringHandleW)(DWORD a0,\n                                              LPCWSTR a1,\n                                              int a2)\n    = DdeCreateStringHandleW;\n\nBOOL (__stdcall * Real_DdeDisconnect)(HCONV a0)\n    = DdeDisconnect;\n\nBOOL (__stdcall * Real_DdeDisconnectList)(HCONVLIST a0)\n    = DdeDisconnectList;\n\nBOOL (__stdcall * Real_DdeEnableCallback)(DWORD a0,\n                                          HCONV a1,\n                                          UINT a2)\n    = DdeEnableCallback;\n\nBOOL (__stdcall * Real_DdeFreeDataHandle)(HDDEDATA a0)\n    = DdeFreeDataHandle;\n\nBOOL (__stdcall * Real_DdeFreeStringHandle)(DWORD a0,\n                                            HSZ a1)\n    = DdeFreeStringHandle;\n\nDWORD (__stdcall * Real_DdeGetData)(HDDEDATA a0,\n                                    LPBYTE a1,\n                                    DWORD a2,\n                                    DWORD a3)\n    = DdeGetData;\n\nUINT (__stdcall * Real_DdeGetLastError)(DWORD a0)\n    = DdeGetLastError;\n\nBOOL (__stdcall * Real_DdeImpersonateClient)(HCONV a0)\n    = DdeImpersonateClient;\n\nBOOL (__stdcall * Real_DdeKeepStringHandle)(DWORD a0,\n                                            HSZ a1)\n    = DdeKeepStringHandle;\n\nHDDEDATA (__stdcall * Real_DdeNameService)(DWORD a0,\n                                           HSZ a1,\n                                           HSZ a2,\n                                           UINT a3)\n    = DdeNameService;\n\nBOOL (__stdcall * Real_DdePostAdvise)(DWORD a0,\n                                      HSZ a1,\n                                      HSZ a2)\n    = DdePostAdvise;\n\nUINT (__stdcall * Real_DdeQueryConvInfo)(HCONV a0,\n                                         DWORD a1,\n                                         CONVINFO* a2)\n    = DdeQueryConvInfo;\n\nHCONV (__stdcall * Real_DdeQueryNextServer)(HCONVLIST a0,\n                                            HCONV a1)\n    = DdeQueryNextServer;\n\nDWORD (__stdcall * Real_DdeQueryStringA)(DWORD a0,\n                                         HSZ a1,\n                                         LPSTR a2,\n                                         DWORD a3,\n                                         int a4)\n    = DdeQueryStringA;\n\nDWORD (__stdcall * Real_DdeQueryStringW)(DWORD a0,\n                                         HSZ a1,\n                                         LPWSTR a2,\n                                         DWORD a3,\n                                         int a4)\n    = DdeQueryStringW;\n\nHCONV (__stdcall * Real_DdeReconnect)(HCONV a0)\n    = DdeReconnect;\n\nBOOL (__stdcall * Real_DdeSetQualityOfService)(HWND a0,\n                                               CONST SECURITY_QUALITY_OF_SERVICE* a1,\n                                               PSECURITY_QUALITY_OF_SERVICE a2)\n    = DdeSetQualityOfService;\n\nBOOL (__stdcall * Real_DdeSetUserHandle)(HCONV a0,\n                                         DWORD a1,\n                                         ULONG_PTR a2)\n    = DdeSetUserHandle;\n\nBOOL (__stdcall * Real_DdeUnaccessData)(HDDEDATA a0)\n    = DdeUnaccessData;\n\nBOOL (__stdcall * Real_DdeUninitialize)(DWORD a0)\n    = DdeUninitialize;\n\nBOOL (__stdcall * Real_DebugActiveProcess)(DWORD a0)\n    = DebugActiveProcess;\n\nBOOL (__stdcall * Real_DebugActiveProcessStop)(DWORD a0)\n    = DebugActiveProcessStop;\n\nvoid (__stdcall * Real_DebugBreak)(void)\n    = DebugBreak;\n\nLRESULT (__stdcall * Real_DefDlgProcA)(HWND a0,\n                                       UINT a1,\n                                       WPARAM a2,\n                                       LPARAM a3)\n    = DefDlgProcA;\n\nLRESULT (__stdcall * Real_DefDlgProcW)(HWND a0,\n                                       UINT a1,\n                                       WPARAM a2,\n                                       LPARAM a3)\n    = DefDlgProcW;\n\nLRESULT (__stdcall * Real_DefFrameProcA)(HWND a0,\n                                         HWND a1,\n                                         UINT a2,\n                                         WPARAM a3,\n                                         LPARAM a4)\n    = DefFrameProcA;\n\nLRESULT (__stdcall * Real_DefFrameProcW)(HWND a0,\n                                         HWND a1,\n                                         UINT a2,\n                                         WPARAM a3,\n                                         LPARAM a4)\n    = DefFrameProcW;\n\nLRESULT (__stdcall * Real_DefMDIChildProcA)(HWND a0,\n                                            UINT a1,\n                                            WPARAM a2,\n                                            LPARAM a3)\n    = DefMDIChildProcA;\n\nLRESULT (__stdcall * Real_DefMDIChildProcW)(HWND a0,\n                                            UINT a1,\n                                            WPARAM a2,\n                                            LPARAM a3)\n    = DefMDIChildProcW;\n\nLRESULT (__stdcall * Real_DefWindowProcA)(HWND a0,\n                                          UINT a1,\n                                          WPARAM a2,\n                                          LPARAM a3)\n    = DefWindowProcA;\n\nLRESULT (__stdcall * Real_DefWindowProcW)(HWND a0,\n                                          UINT a1,\n                                          WPARAM a2,\n                                          LPARAM a3)\n    = DefWindowProcW;\n\nHDWP (__stdcall * Real_DeferWindowPos)(HDWP a0,\n                                       HWND a1,\n                                       HWND a2,\n                                       int a3,\n                                       int a4,\n                                       int a5,\n                                       int a6,\n                                       UINT a7)\n    = DeferWindowPos;\n\nBOOL (__stdcall * Real_DefineDosDeviceA)(DWORD a0,\n                                         LPCSTR a1,\n                                         LPCSTR a2)\n    = DefineDosDeviceA;\n\nBOOL (__stdcall * Real_DefineDosDeviceW)(DWORD a0,\n                                         LPCWSTR a1,\n                                         LPCWSTR a2)\n    = DefineDosDeviceW;\n\nATOM (__stdcall * Real_DeleteAtom)(ATOM a0)\n    = DeleteAtom;\n\nBOOL (__stdcall * Real_DeleteColorSpace)(HCOLORSPACE a0)\n    = DeleteColorSpace;\n\nBOOL (__stdcall * Real_DeleteDC)(HDC a0)\n    = DeleteDC;\n\nBOOL (__stdcall * Real_DeleteEnhMetaFile)(HENHMETAFILE a0)\n    = DeleteEnhMetaFile;\n\nvoid (__stdcall * Real_DeleteFiber)(LPVOID a0)\n    = DeleteFiber;\n\nBOOL (__stdcall * Real_DeleteFileA)(LPCSTR a0)\n    = DeleteFileA;\n\nBOOL (__stdcall * Real_DeleteFileW)(LPCWSTR a0)\n    = DeleteFileW;\n\nBOOL (__stdcall * Real_DeleteMenu)(HMENU a0,\n                                   UINT a1,\n                                   UINT a2)\n    = DeleteMenu;\n\nBOOL (__stdcall * Real_DeleteMetaFile)(HMETAFILE a0)\n    = DeleteMetaFile;\n\nBOOL (__stdcall * Real_DeleteObject)(HGDIOBJ a0)\n    = DeleteObject;\n\nint (__stdcall * Real_DescribePixelFormat)(HDC a0,\n                                           int a1,\n                                           UINT a2,\n                                           PIXELFORMATDESCRIPTOR* a3)\n    = DescribePixelFormat;\n\nBOOL (__stdcall * Real_DestroyAcceleratorTable)(HACCEL a0)\n    = DestroyAcceleratorTable;\n\nBOOL (__stdcall * Real_DestroyCaret)(void)\n    = DestroyCaret;\n\nBOOL (__stdcall * Real_DestroyCursor)(HCURSOR a0)\n    = DestroyCursor;\n\nBOOL (__stdcall * Real_DestroyIcon)(HICON a0)\n    = DestroyIcon;\n\nBOOL (__stdcall * Real_DestroyMenu)(HMENU a0)\n    = DestroyMenu;\n\nBOOL (__stdcall * Real_DestroyWindow)(HWND a0)\n    = DestroyWindow;\n\nBOOL (__stdcall * Real_DeviceIoControl)(HANDLE a0,\n                                        DWORD a1,\n                                        LPVOID a2,\n                                        DWORD a3,\n                                        LPVOID a4,\n                                        DWORD a5,\n                                        LPDWORD a6,\n                                        LPOVERLAPPED a7)\n    = DeviceIoControl;\n\nINT_PTR (__stdcall * Real_DialogBoxIndirectParamA)(HINSTANCE a0,\n                                                   LPCDLGTEMPLATEA a1,\n                                                   HWND a2,\n                                                   DLGPROC a3,\n                                                   LPARAM a4)\n    = DialogBoxIndirectParamA;\n\nINT_PTR (__stdcall * Real_DialogBoxIndirectParamW)(HINSTANCE a0,\n                                                   LPCDLGTEMPLATEW a1,\n                                                   HWND a2,\n                                                   DLGPROC a3,\n                                                   LPARAM a4)\n    = DialogBoxIndirectParamW;\n\nINT_PTR (__stdcall * Real_DialogBoxParamA)(HINSTANCE a0,\n                                           LPCSTR a1,\n                                           HWND a2,\n                                           DLGPROC a3,\n                                           LPARAM a4)\n    = DialogBoxParamA;\n\nINT_PTR (__stdcall * Real_DialogBoxParamW)(HINSTANCE a0,\n                                           LPCWSTR a1,\n                                           HWND a2,\n                                           DLGPROC a3,\n                                           LPARAM a4)\n    = DialogBoxParamW;\n\nBOOL (__stdcall * Real_DisableThreadLibraryCalls)(HMODULE a0)\n    = DisableThreadLibraryCalls;\n\nBOOL (__stdcall * Real_DisconnectNamedPipe)(HANDLE a0)\n    = DisconnectNamedPipe;\n\nLRESULT (__stdcall * Real_DispatchMessageA)(CONST MSG* a0)\n    = DispatchMessageA;\n\nLRESULT (__stdcall * Real_DispatchMessageW)(CONST MSG* a0)\n    = DispatchMessageW;\n\nint (__stdcall * Real_DlgDirListA)(HWND a0,\n                                   LPSTR a1,\n                                   int a2,\n                                   int a3,\n                                   UINT a4)\n    = DlgDirListA;\n\nint (__stdcall * Real_DlgDirListComboBoxA)(HWND a0,\n                                           LPSTR a1,\n                                           int a2,\n                                           int a3,\n                                           UINT a4)\n    = DlgDirListComboBoxA;\n\nint (__stdcall * Real_DlgDirListComboBoxW)(HWND a0,\n                                           LPWSTR a1,\n                                           int a2,\n                                           int a3,\n                                           UINT a4)\n    = DlgDirListComboBoxW;\n\nint (__stdcall * Real_DlgDirListW)(HWND a0,\n                                   LPWSTR a1,\n                                   int a2,\n                                   int a3,\n                                   UINT a4)\n    = DlgDirListW;\n\nBOOL (__stdcall * Real_DlgDirSelectComboBoxExA)(HWND a0,\n                                                LPSTR a1,\n                                                int a2,\n                                                int a3)\n    = DlgDirSelectComboBoxExA;\n\nBOOL (__stdcall * Real_DlgDirSelectComboBoxExW)(HWND a0,\n                                                LPWSTR a1,\n                                                int a2,\n                                                int a3)\n    = DlgDirSelectComboBoxExW;\n\nBOOL (__stdcall * Real_DlgDirSelectExA)(HWND a0,\n                                        LPSTR a1,\n                                        int a2,\n                                        int a3)\n    = DlgDirSelectExA;\n\nBOOL (__stdcall * Real_DlgDirSelectExW)(HWND a0,\n                                        LPWSTR a1,\n                                        int a2,\n                                        int a3)\n    = DlgDirSelectExW;\n\nHRESULT (__stdcall * Real_DoDragDrop)(IDataObject* a0,\n                                      IDropSource* a1,\n                                      DWORD a2,\n                                      LPDWORD a3)\n    = DoDragDrop;\n\nBOOL (__stdcall * Real_DosDateTimeToFileTime)(WORD a0,\n                                              WORD a1,\n                                              LPFILETIME a2)\n    = DosDateTimeToFileTime;\n\nBOOL (__stdcall * Real_DragDetect)(HWND a0,\n                                   POINT a1)\n    = DragDetect;\n\nDWORD (__stdcall * Real_DragObject)(HWND a0,\n                                    HWND a1,\n                                    UINT a2,\n                                    ULONG_PTR a3,\n                                    HCURSOR a4)\n    = DragObject;\n\nBOOL (__stdcall * Real_DrawAnimatedRects)(HWND a0,\n                                          int a1,\n                                          CONST RECT* a2,\n                                          CONST RECT* a3)\n    = DrawAnimatedRects;\n\nBOOL (__stdcall * Real_DrawCaption)(HWND a0,\n                                    HDC a1,\n                                    CONST RECT* a2,\n                                    UINT a3)\n    = DrawCaption;\n\nBOOL (__stdcall * Real_DrawEdge)(HDC a0,\n                                 LPRECT a1,\n                                 UINT a2,\n                                 UINT a3)\n    = DrawEdge;\n\nint (__stdcall * Real_DrawEscape)(HDC a0,\n                                  int a1,\n                                  int a2,\n                                  LPCSTR a3)\n    = DrawEscape;\n\nBOOL (__stdcall * Real_DrawFocusRect)(HDC a0,\n                                      CONST RECT* a1)\n    = DrawFocusRect;\n\nBOOL (__stdcall * Real_DrawFrameControl)(HDC a0,\n                                         LPRECT a1,\n                                         UINT a2,\n                                         UINT a3)\n    = DrawFrameControl;\n\nBOOL (__stdcall * Real_DrawIcon)(HDC a0,\n                                 int a1,\n                                 int a2,\n                                 HICON a3)\n    = DrawIcon;\n\nBOOL (__stdcall * Real_DrawIconEx)(HDC a0,\n                                   int a1,\n                                   int a2,\n                                   HICON a3,\n                                   int a4,\n                                   int a5,\n                                   UINT a6,\n                                   HBRUSH a7,\n                                   UINT a8)\n    = DrawIconEx;\n\nBOOL (__stdcall * Real_DrawMenuBar)(HWND a0)\n    = DrawMenuBar;\n\nBOOL (__stdcall * Real_DrawStateA)(HDC a0,\n                                   HBRUSH a1,\n                                   DRAWSTATEPROC a2,\n                                   LPARAM a3,\n                                   WPARAM a4,\n                                   int a5,\n                                   int a6,\n                                   int a7,\n                                   int a8,\n                                   UINT a9)\n    = DrawStateA;\n\nBOOL (__stdcall * Real_DrawStateW)(HDC a0,\n                                   HBRUSH a1,\n                                   DRAWSTATEPROC a2,\n                                   LPARAM a3,\n                                   WPARAM a4,\n                                   int a5,\n                                   int a6,\n                                   int a7,\n                                   int a8,\n                                   UINT a9)\n    = DrawStateW;\n\nint (__stdcall * Real_DrawTextA)(HDC a0,\n                                 LPCSTR a1,\n                                 int a2,\n                                 LPRECT a3,\n                                 UINT a4)\n    = DrawTextA;\n\nint (__stdcall * Real_DrawTextExA)(HDC a0,\n                                   LPSTR a1,\n                                   int a2,\n                                   LPRECT a3,\n                                   UINT a4,\n                                   LPDRAWTEXTPARAMS a5)\n    = DrawTextExA;\n\nint (__stdcall * Real_DrawTextExW)(HDC a0,\n                                   LPWSTR a1,\n                                   int a2,\n                                   LPRECT a3,\n                                   UINT a4,\n                                   LPDRAWTEXTPARAMS a5)\n    = DrawTextExW;\n\nint (__stdcall * Real_DrawTextW)(HDC a0,\n                                 LPCWSTR a1,\n                                 int a2,\n                                 LPRECT a3,\n                                 UINT a4)\n    = DrawTextW;\n\nBOOL (__stdcall * Real_DuplicateHandle)(HANDLE a0,\n                                        HANDLE a1,\n                                        HANDLE a2,\n                                        LPHANDLE a3,\n                                        DWORD a4,\n                                        BOOL a5,\n                                        DWORD a6)\n    = DuplicateHandle;\n\nBOOL (__stdcall * Real_Ellipse)(HDC a0,\n                                int a1,\n                                int a2,\n                                int a3,\n                                int a4)\n    = Ellipse;\n\nBOOL (__stdcall * Real_EmptyClipboard)(void)\n    = EmptyClipboard;\n\nBOOL (__stdcall * Real_EnableMenuItem)(HMENU a0,\n                                       UINT a1,\n                                       UINT a2)\n    = EnableMenuItem;\n\nBOOL (__stdcall * Real_EnableScrollBar)(HWND a0,\n                                        UINT a1,\n                                        UINT a2)\n    = EnableScrollBar;\n\nBOOL (__stdcall * Real_EnableWindow)(HWND a0,\n                                     BOOL a1)\n    = EnableWindow;\n\nBOOL (__stdcall * Real_EndDeferWindowPos)(HDWP a0)\n    = EndDeferWindowPos;\n\nBOOL (__stdcall * Real_EndDialog)(HWND a0,\n                                  INT_PTR a1)\n    = EndDialog;\n\nint (__stdcall * Real_EndDoc)(HDC a0)\n    = EndDoc;\n\nint (__stdcall * Real_EndPage)(HDC a0)\n    = EndPage;\n\nBOOL (__stdcall * Real_EndPaint)(HWND a0,\n                                 CONST PAINTSTRUCT* a1)\n    = EndPaint;\n\nBOOL (__stdcall * Real_EndPath)(HDC a0)\n    = EndPath;\n\nBOOL (__stdcall * Real_EndUpdateResourceA)(HANDLE a0,\n                                           BOOL a1)\n    = EndUpdateResourceA;\n\nBOOL (__stdcall * Real_EndUpdateResourceW)(HANDLE a0,\n                                           BOOL a1)\n    = EndUpdateResourceW;\n\nBOOL (__stdcall * Real_EnumCalendarInfoA)(CALINFO_ENUMPROCA a0,\n                                          LCID a1,\n                                          CALID a2,\n                                          CALTYPE a3)\n    = EnumCalendarInfoA;\n\nBOOL (__stdcall * Real_EnumCalendarInfoW)(CALINFO_ENUMPROCW a0,\n                                          LCID a1,\n                                          CALID a2,\n                                          CALTYPE a3)\n    = EnumCalendarInfoW;\n\nBOOL (__stdcall * Real_EnumChildWindows)(HWND a0,\n                                         WNDENUMPROC a1,\n                                         LPARAM a2)\n    = EnumChildWindows;\n\nUINT (__stdcall * Real_EnumClipboardFormats)(UINT a0)\n    = EnumClipboardFormats;\n\nBOOL (__stdcall * Real_EnumDateFormatsA)(DATEFMT_ENUMPROCA a0,\n                                         LCID a1,\n                                         DWORD a2)\n    = EnumDateFormatsA;\n\nBOOL (__stdcall * Real_EnumDateFormatsW)(DATEFMT_ENUMPROCW a0,\n                                         LCID a1,\n                                         DWORD a2)\n    = EnumDateFormatsW;\n\nBOOL (__stdcall * Real_EnumDesktopWindows)(HDESK a0,\n                                           WNDENUMPROC a1,\n                                           LPARAM a2)\n    = EnumDesktopWindows;\n\nBOOL (__stdcall * Real_EnumDesktopsA)(HWINSTA a0,\n                                      DESKTOPENUMPROCA a1,\n                                      LPARAM a2)\n    = EnumDesktopsA;\n\nBOOL (__stdcall * Real_EnumDesktopsW)(HWINSTA a0,\n                                      DESKTOPENUMPROCW a1,\n                                      LPARAM a2)\n    = EnumDesktopsW;\n\nBOOL (__stdcall * Real_EnumDisplaySettingsA)(LPCSTR a0,\n                                             DWORD a1,\n                                             LPDEVMODEA a2)\n    = EnumDisplaySettingsA;\n\nBOOL (__stdcall * Real_EnumDisplaySettingsW)(LPCWSTR a0,\n                                             DWORD a1,\n                                             LPDEVMODEW a2)\n    = EnumDisplaySettingsW;\n\nBOOL (__stdcall * Real_EnumEnhMetaFile)(HDC a0,\n                                        HENHMETAFILE a1,\n                                        ENHMFENUMPROC a2,\n                                        LPVOID a3,\n                                        CONST RECT* a4)\n    = EnumEnhMetaFile;\n\nint (__stdcall * Real_EnumFontFamiliesA)(HDC a0,\n                                         LPCSTR a1,\n                                         FONTENUMPROCA a2,\n                                         LPARAM a3)\n    = EnumFontFamiliesA;\n\nint (__stdcall * Real_EnumFontFamiliesExA)(HDC a0,\n                                           LPLOGFONTA a1,\n                                           FONTENUMPROCA a2,\n                                           LPARAM a3,\n                                           DWORD a4)\n    = EnumFontFamiliesExA;\n\nint (__stdcall * Real_EnumFontFamiliesExW)(HDC a0,\n                                           LPLOGFONTW a1,\n                                           FONTENUMPROCW a2,\n                                           LPARAM a3,\n                                           DWORD a4)\n    = EnumFontFamiliesExW;\n\nint (__stdcall * Real_EnumFontFamiliesW)(HDC a0,\n                                         LPCWSTR a1,\n                                         FONTENUMPROCW a2,\n                                         LPARAM a3)\n    = EnumFontFamiliesW;\n\nint (__stdcall * Real_EnumFontsA)(HDC a0,\n                                  LPCSTR a1,\n                                  FONTENUMPROCA a2,\n                                  LPARAM a3)\n    = EnumFontsA;\n\nint (__stdcall * Real_EnumFontsW)(HDC a0,\n                                  LPCWSTR a1,\n                                  FONTENUMPROCW a2,\n                                  LPARAM a3)\n    = EnumFontsW;\n\nint (__stdcall * Real_EnumICMProfilesA)(HDC a0,\n                                        ICMENUMPROCA a1,\n                                        LPARAM a2)\n    = EnumICMProfilesA;\n\nint (__stdcall * Real_EnumICMProfilesW)(HDC a0,\n                                        ICMENUMPROCW a1,\n                                        LPARAM a2)\n    = EnumICMProfilesW;\n\nBOOL (__stdcall * Real_EnumMetaFile)(HDC a0,\n                                     HMETAFILE a1,\n                                     MFENUMPROC a2,\n                                     LPARAM a3)\n    = EnumMetaFile;\n\nint (__stdcall * Real_EnumObjects)(HDC a0,\n                                   int a1,\n                                   GOBJENUMPROC a2,\n                                   LPARAM a3)\n    = EnumObjects;\n\nint (__stdcall * Real_EnumPropsA)(HWND a0,\n                                  PROPENUMPROCA a1)\n    = EnumPropsA;\n\nint (__stdcall * Real_EnumPropsExA)(HWND a0,\n                                    PROPENUMPROCEXA a1,\n                                    LPARAM a2)\n    = EnumPropsExA;\n\nint (__stdcall * Real_EnumPropsExW)(HWND a0,\n                                    PROPENUMPROCEXW a1,\n                                    LPARAM a2)\n    = EnumPropsExW;\n\nint (__stdcall * Real_EnumPropsW)(HWND a0,\n                                  PROPENUMPROCW a1)\n    = EnumPropsW;\n\n#if _MSC_VER < 1300\nBOOL (__stdcall * Real_EnumResourceLanguagesA)(HMODULE a0,\n                                               LPCSTR a1,\n                                               LPCSTR a2,\n                                               ENUMRESLANGPROC a3,\n                                               LONG a4)\n    = EnumResourceLanguagesA;\n#else\nBOOL (__stdcall * Real_EnumResourceLanguagesA)(HMODULE a0,\n                                               LPCSTR a1,\n                                               LPCSTR a2,\n                                               ENUMRESLANGPROCA a3,\n                                               LONG_PTR a4)\n    = EnumResourceLanguagesA;\n#endif\n\n#if _MSC_VER < 1300\nBOOL (__stdcall * Real_EnumResourceLanguagesW)(HMODULE a0,\n                                               LPCWSTR a1,\n                                               LPCWSTR a2,\n                                               ENUMRESLANGPROC a3,\n                                               LONG a4)\n    = EnumResourceLanguagesW;\n#else\nBOOL (__stdcall * Real_EnumResourceLanguagesW)(HMODULE a0,\n                                               LPCWSTR a1,\n                                               LPCWSTR a2,\n                                               ENUMRESLANGPROCW a3,\n                                               LONG_PTR a4)\n    = EnumResourceLanguagesW;\n#endif\n\n#if _MSC_VER < 1300\nBOOL (__stdcall * Real_EnumResourceNamesA)(HMODULE a0,\n                                           LPCSTR a1,\n                                           ENUMRESNAMEPROC a2,\n                                           LONG a3)\n    = EnumResourceNamesA;\n#else\nBOOL (__stdcall * Real_EnumResourceNamesA)(HMODULE a0,\n                                           LPCSTR a1,\n                                           ENUMRESNAMEPROCA a2,\n                                           LONG_PTR a3)\n    = EnumResourceNamesA;\n#endif\n\n#if _MSC_VER < 1300\nBOOL (__stdcall * Real_EnumResourceNamesW)(HMODULE a0,\n                                           LPCWSTR a1,\n                                           ENUMRESNAMEPROC a2,\n                                           LONG a3)\n    = EnumResourceNamesW;\n#else\nBOOL (__stdcall * Real_EnumResourceNamesW)(HMODULE a0,\n                                           LPCWSTR a1,\n                                           ENUMRESNAMEPROCW a2,\n                                           LONG_PTR a3)\n    = EnumResourceNamesW;\n#endif\n\n#if _MSC_VER < 1300\nBOOL (__stdcall * Real_EnumResourceTypesA)(HMODULE a0,\n                                           ENUMRESTYPEPROC a1,\n                                           LONG a2)\n    = EnumResourceTypesA;\n#else\nBOOL (__stdcall * Real_EnumResourceTypesA)(HMODULE a0,\n                                           ENUMRESTYPEPROCA a1,\n                                           LONG_PTR a2)\n    = EnumResourceTypesA;\n#endif\n\n#if _MSC_VER < 1300\nBOOL (__stdcall * Real_EnumResourceTypesW)(HMODULE a0,\n                                           ENUMRESTYPEPROC a1,\n                                           LONG a2)\n    = EnumResourceTypesW;\n#else\nBOOL (__stdcall * Real_EnumResourceTypesW)(HMODULE a0,\n                                           ENUMRESTYPEPROCW a1,\n                                           LONG_PTR a2)\n    = EnumResourceTypesW;\n#endif\n\nBOOL (__stdcall * Real_EnumSystemCodePagesA)(CODEPAGE_ENUMPROCA a0,\n                                             DWORD a1)\n    = EnumSystemCodePagesA;\n\nBOOL (__stdcall * Real_EnumSystemCodePagesW)(CODEPAGE_ENUMPROCW a0,\n                                             DWORD a1)\n    = EnumSystemCodePagesW;\n\n#if(WINVER >= 0x0500)\nBOOL (__stdcall * Real_EnumSystemLocalesA)(LOCALE_ENUMPROCA a0,\n                                           DWORD a1)\n    = EnumSystemLocalesA;\n\nBOOL (__stdcall * Real_EnumSystemLocalesW)(LOCALE_ENUMPROCW a0,\n                                           DWORD a1)\n    = EnumSystemLocalesW;\n#endif // (WINVER >= 0x0500)\n\nBOOL (__stdcall * Real_EnumThreadWindows)(DWORD a0,\n                                          WNDENUMPROC a1,\n                                          LPARAM a2)\n    = EnumThreadWindows;\n\nBOOL (__stdcall * Real_EnumTimeFormatsA)(TIMEFMT_ENUMPROCA a0,\n                                         LCID a1,\n                                         DWORD a2)\n    = EnumTimeFormatsA;\n\nBOOL (__stdcall * Real_EnumTimeFormatsW)(TIMEFMT_ENUMPROCW a0,\n                                         LCID a1,\n                                         DWORD a2)\n    = EnumTimeFormatsW;\n\nBOOL (__stdcall * Real_EnumWindowStationsA)(WINSTAENUMPROCA a0,\n                                            LPARAM a1)\n    = EnumWindowStationsA;\n\nBOOL (__stdcall * Real_EnumWindowStationsW)(WINSTAENUMPROCW a0,\n                                            LPARAM a1)\n    = EnumWindowStationsW;\n\nBOOL (__stdcall * Real_EnumWindows)(WNDENUMPROC a0,\n                                    LPARAM a1)\n    = EnumWindows;\n\nBOOL (__stdcall * Real_EqualRect)(CONST RECT* a0,\n                                  CONST RECT* a1)\n    = EqualRect;\n\nBOOL (__stdcall * Real_EqualRgn)(HRGN a0,\n                                 HRGN a1)\n    = EqualRgn;\n\nDWORD (__stdcall * Real_EraseTape)(HANDLE a0,\n                                   DWORD a1,\n                                   BOOL a2)\n    = EraseTape;\n\nint (__stdcall * Real_Escape)(HDC a0,\n                              int a1,\n                              int a2,\n                              LPCSTR a3,\n                              LPVOID a4)\n    = Escape;\n\nBOOL (__stdcall * Real_EscapeCommFunction)(HANDLE a0,\n                                           DWORD a1)\n    = EscapeCommFunction;\n\nint (__stdcall * Real_ExcludeClipRect)(HDC a0,\n                                       int a1,\n                                       int a2,\n                                       int a3,\n                                       int a4)\n    = ExcludeClipRect;\n\nint (__stdcall * Real_ExcludeUpdateRgn)(HDC a0,\n                                        HWND a1)\n    = ExcludeUpdateRgn;\n\nvoid (__stdcall * Real_ExitProcess)(UINT a0)\n    = ExitProcess;\n\nvoid (__stdcall * Real_ExitThread)(DWORD a0)\n    = ExitThread;\n\nBOOL (__stdcall * Real_ExitWindowsEx)(UINT a0,\n                                      DWORD a1)\n    = ExitWindowsEx;\n\nDWORD (__stdcall * Real_ExpandEnvironmentStringsA)(LPCSTR a0,\n                                                   LPSTR a1,\n                                                   DWORD a2)\n    = ExpandEnvironmentStringsA;\n\nDWORD (__stdcall * Real_ExpandEnvironmentStringsW)(LPCWSTR a0,\n                                                   LPWSTR a1,\n                                                   DWORD a2)\n    = ExpandEnvironmentStringsW;\n\nHPEN (__stdcall * Real_ExtCreatePen)(DWORD a0,\n                                     DWORD a1,\n                                     CONST LOGBRUSH* a2,\n                                     DWORD a3,\n                                     CONST DWORD* a4)\n    = ExtCreatePen;\n\nHRGN (__stdcall * Real_ExtCreateRegion)(CONST XFORM* a0,\n                                        DWORD a1,\n                                        CONST RGNDATA* a2)\n    = ExtCreateRegion;\n\nint (__stdcall * Real_ExtEscape)(HDC a0,\n                                 int a1,\n                                 int a2,\n                                 LPCSTR a3,\n                                 int a4,\n                                 LPSTR a5)\n    = ExtEscape;\n\nBOOL (__stdcall * Real_ExtFloodFill)(HDC a0,\n                                     int a1,\n                                     int a2,\n                                     COLORREF a3,\n                                     UINT a4)\n    = ExtFloodFill;\n\nint (__stdcall * Real_ExtSelectClipRgn)(HDC a0,\n                                        HRGN a1,\n                                        int a2)\n    = ExtSelectClipRgn;\n\nBOOL (__stdcall * Real_ExtTextOutA)(HDC a0,\n                                    int a1,\n                                    int a2,\n                                    UINT a3,\n                                    CONST RECT* a4,\n                                    LPCSTR a5,\n                                    UINT a6,\n                                    CONST INT* a7)\n    = ExtTextOutA;\n\nBOOL (__stdcall * Real_ExtTextOutW)(HDC a0,\n                                    int a1,\n                                    int a2,\n                                    UINT a3,\n                                    CONST RECT* a4,\n                                    LPCWSTR a5,\n                                    UINT a6,\n                                    CONST INT* a7)\n    = ExtTextOutW;\n\nvoid (__stdcall * Real_FatalAppExitA)(UINT a0,\n                                      LPCSTR a1)\n    = FatalAppExitA;\n\nvoid (__stdcall * Real_FatalAppExitW)(UINT a0,\n                                      LPCWSTR a1)\n    = FatalAppExitW;\n\nvoid (__stdcall * Real_FatalExit)(int a0)\n    = FatalExit;\n\nBOOL (__stdcall * Real_FileTimeToDosDateTime)(CONST FILETIME* a0,\n                                              LPWORD a1,\n                                              LPWORD a2)\n    = FileTimeToDosDateTime;\n\nBOOL (__stdcall * Real_FileTimeToLocalFileTime)(CONST FILETIME* a0,\n                                                LPFILETIME a1)\n    = FileTimeToLocalFileTime;\n\nBOOL (__stdcall * Real_FileTimeToSystemTime)(CONST FILETIME* a0,\n                                             LPSYSTEMTIME a1)\n    = FileTimeToSystemTime;\n\nBOOL (__stdcall * Real_FillConsoleOutputAttribute)(HANDLE a0,\n                                                   WORD a1,\n                                                   DWORD a2,\n                                                   COORD a3,\n                                                   LPDWORD a4)\n    = FillConsoleOutputAttribute;\n\nBOOL (__stdcall * Real_FillConsoleOutputCharacterA)(HANDLE a0,\n                                                    CHAR a1,\n                                                    DWORD a2,\n                                                    COORD a3,\n                                                    LPDWORD a4)\n    = FillConsoleOutputCharacterA;\n\nBOOL (__stdcall * Real_FillConsoleOutputCharacterW)(HANDLE a0,\n                                                    WCHAR a1,\n                                                    DWORD a2,\n                                                    COORD a3,\n                                                    LPDWORD a4)\n    = FillConsoleOutputCharacterW;\n\nBOOL (__stdcall * Real_FillPath)(HDC a0)\n    = FillPath;\n\nint (__stdcall * Real_FillRect)(HDC a0,\n                                CONST RECT* a1,\n                                HBRUSH a2)\n    = FillRect;\n\nBOOL (__stdcall * Real_FillRgn)(HDC a0,\n                                HRGN a1,\n                                HBRUSH a2)\n    = FillRgn;\n\nATOM (__stdcall * Real_FindAtomA)(LPCSTR a0)\n    = FindAtomA;\n\nATOM (__stdcall * Real_FindAtomW)(LPCWSTR a0)\n    = FindAtomW;\n\nBOOL (__stdcall * Real_FindClose)(HANDLE a0)\n    = FindClose;\n\nBOOL (__stdcall * Real_FindCloseChangeNotification)(HANDLE a0)\n    = FindCloseChangeNotification;\n\nHANDLE (__stdcall * Real_FindFirstChangeNotificationA)(LPCSTR a0,\n                                                       BOOL a1,\n                                                       DWORD a2)\n    = FindFirstChangeNotificationA;\n\nHANDLE (__stdcall * Real_FindFirstChangeNotificationW)(LPCWSTR a0,\n                                                       BOOL a1,\n                                                       DWORD a2)\n    = FindFirstChangeNotificationW;\n\nHANDLE (__stdcall * Real_FindFirstFileA)(LPCSTR a0,\n                                         LPWIN32_FIND_DATAA a1)\n    = FindFirstFileA;\n\nHANDLE (__stdcall * Real_FindFirstFileExA)(LPCSTR a0,\n                                           FINDEX_INFO_LEVELS a1,\n                                           LPVOID a2,\n                                           FINDEX_SEARCH_OPS a3,\n                                           LPVOID a4,\n                                           DWORD a5)\n    = FindFirstFileExA;\n\nHANDLE (__stdcall * Real_FindFirstFileExW)(LPCWSTR a0,\n                                           FINDEX_INFO_LEVELS a1,\n                                           LPVOID a2,\n                                           FINDEX_SEARCH_OPS a3,\n                                           LPVOID a4,\n                                           DWORD a5)\n    = FindFirstFileExW;\n\nHANDLE (__stdcall * Real_FindFirstFileW)(LPCWSTR a0,\n                                         LPWIN32_FIND_DATAW a1)\n    = FindFirstFileW;\n\nBOOL (__stdcall * Real_FindNextChangeNotification)(HANDLE a0)\n    = FindNextChangeNotification;\n\nBOOL (__stdcall * Real_FindNextFileA)(HANDLE a0,\n                                      LPWIN32_FIND_DATAA a1)\n    = FindNextFileA;\n\nBOOL (__stdcall * Real_FindNextFileW)(HANDLE a0,\n                                      LPWIN32_FIND_DATAW a1)\n    = FindNextFileW;\n\nHRSRC (__stdcall * Real_FindResourceA)(HMODULE a0,\n                                       LPCSTR a1,\n                                       LPCSTR a2)\n    = FindResourceA;\n\nHRSRC (__stdcall * Real_FindResourceExA)(HMODULE a0,\n                                         LPCSTR a1,\n                                         LPCSTR a2,\n                                         WORD a3)\n    = FindResourceExA;\n\nHRSRC (__stdcall * Real_FindResourceExW)(HMODULE a0,\n                                         LPCWSTR a1,\n                                         LPCWSTR a2,\n                                         WORD a3)\n    = FindResourceExW;\n\nHRSRC (__stdcall * Real_FindResourceW)(HMODULE a0,\n                                       LPCWSTR a1,\n                                       LPCWSTR a2)\n    = FindResourceW;\n\nHWND (__stdcall * Real_FindWindowA)(LPCSTR a0,\n                                    LPCSTR a1)\n    = FindWindowA;\n\nHWND (__stdcall * Real_FindWindowExA)(HWND a0,\n                                      HWND a1,\n                                      LPCSTR a2,\n                                      LPCSTR a3)\n    = FindWindowExA;\n\nHWND (__stdcall * Real_FindWindowExW)(HWND a0,\n                                      HWND a1,\n                                      LPCWSTR a2,\n                                      LPCWSTR a3)\n    = FindWindowExW;\n\nHWND (__stdcall * Real_FindWindowW)(LPCWSTR a0,\n                                    LPCWSTR a1)\n    = FindWindowW;\n\nBOOL (__stdcall * Real_FixBrushOrgEx)(HDC a0,\n                                      int a1,\n                                      int a2,\n                                      POINT* a3)\n    = FixBrushOrgEx;\n\nBOOL (__stdcall * Real_FlashWindow)(HWND a0,\n                                    BOOL a1)\n    = FlashWindow;\n\nBOOL (__stdcall * Real_FlattenPath)(HDC a0)\n    = FlattenPath;\n\nBOOL (__stdcall * Real_FloodFill)(HDC a0,\n                                  int a1,\n                                  int a2,\n                                  COLORREF a3)\n    = FloodFill;\n\nBOOL (__stdcall * Real_FlushConsoleInputBuffer)(HANDLE a0)\n    = FlushConsoleInputBuffer;\n\nBOOL (__stdcall * Real_FlushFileBuffers)(HANDLE a0)\n    = FlushFileBuffers;\n\nBOOL (__stdcall * Real_FlushViewOfFile)(LPCVOID a0,\n                                        SIZE_T a1)\n    = FlushViewOfFile;\n\nHRESULT (__stdcall * Real_FmtIdToPropStgName)(CONST FMTID* a0,\n                                              LPOLESTR a1)\n    = FmtIdToPropStgName;\n\nint (__stdcall * Real_FoldStringA)(DWORD a0,\n                                   LPCSTR a1,\n                                   int a2,\n                                   LPSTR a3,\n                                   int a4)\n    = FoldStringA;\n\nint (__stdcall * Real_FoldStringW)(DWORD a0,\n                                   LPCWSTR a1,\n                                   int a2,\n                                   LPWSTR a3,\n                                   int a4)\n    = FoldStringW;\n\nDWORD (__stdcall * Real_FormatMessageA)(DWORD a0,\n                                        LPCVOID a1,\n                                        DWORD a2,\n                                        DWORD a3,\n                                        LPSTR a4,\n                                        DWORD a5,\n                                        va_list* a6)\n    = FormatMessageA;\n\nDWORD (__stdcall * Real_FormatMessageW)(DWORD a0,\n                                        LPCVOID a1,\n                                        DWORD a2,\n                                        DWORD a3,\n                                        LPWSTR a4,\n                                        DWORD a5,\n                                        va_list* a6)\n    = FormatMessageW;\n\nint (__stdcall * Real_FrameRect)(HDC a0,\n                                 CONST RECT* a1,\n                                 HBRUSH a2)\n    = FrameRect;\n\nBOOL (__stdcall * Real_FrameRgn)(HDC a0,\n                                 HRGN a1,\n                                 HBRUSH a2,\n                                 int a3,\n                                 int a4)\n    = FrameRgn;\n\nBOOL (__stdcall * Real_FreeConsole)(void)\n    = FreeConsole;\n\nBOOL (__stdcall * Real_FreeDDElParam)(UINT a0,\n                                      LPARAM a1)\n    = FreeDDElParam;\n\nBOOL (__stdcall * Real_FreeEnvironmentStringsA)(LPSTR a0)\n    = FreeEnvironmentStringsA;\n\nBOOL (__stdcall * Real_FreeEnvironmentStringsW)(LPWSTR a0)\n    = FreeEnvironmentStringsW;\n\nBOOL (__stdcall * Real_FreeLibrary)(HMODULE a0)\n    = FreeLibrary;\n\nvoid (__stdcall * Real_FreeLibraryAndExitThread)(HMODULE a0,\n                                                 DWORD a1)\n    = FreeLibraryAndExitThread;\n\nHRESULT (__stdcall * Real_FreePropVariantArray)(ULONG a0,\n                                                PROPVARIANT* a1)\n    = FreePropVariantArray;\n\nBOOL (__stdcall * Real_FreeResource)(HGLOBAL a0)\n    = FreeResource;\n\nBOOL (__stdcall * Real_GdiComment)(HDC a0,\n                                   UINT a1,\n                                   CONST BYTE* a2)\n    = GdiComment;\n\nBOOL (__stdcall * Real_GdiFlush)(void)\n    = GdiFlush;\n\nDWORD (__stdcall * Real_GdiGetBatchLimit)(void)\n    = GdiGetBatchLimit;\n\nDWORD (__stdcall * Real_GdiSetBatchLimit)(DWORD a0)\n    = GdiSetBatchLimit;\n\nBOOL (__stdcall * Real_GenerateConsoleCtrlEvent)(DWORD a0,\n                                                 DWORD a1)\n    = GenerateConsoleCtrlEvent;\n\nUINT (__stdcall * Real_GetACP)(void)\n    = GetACP;\n\nHWND (__stdcall * Real_GetActiveWindow)(void)\n    = GetActiveWindow;\n\nint (__stdcall * Real_GetArcDirection)(HDC a0)\n    = GetArcDirection;\n\nBOOL (__stdcall * Real_GetAspectRatioFilterEx)(HDC a0,\n                                               SIZE* a1)\n    = GetAspectRatioFilterEx;\n\nSHORT (__stdcall * Real_GetAsyncKeyState)(int a0)\n    = GetAsyncKeyState;\n\nUINT (__stdcall * Real_GetAtomNameA)(ATOM a0,\n                                     LPSTR a1,\n                                     int a2)\n    = GetAtomNameA;\n\nUINT (__stdcall * Real_GetAtomNameW)(ATOM a0,\n                                     LPWSTR a1,\n                                     int a2)\n    = GetAtomNameW;\n\nBOOL (__stdcall * Real_GetBinaryTypeA)(LPCSTR a0,\n                                       LPDWORD a1)\n    = GetBinaryTypeA;\n\nBOOL (__stdcall * Real_GetBinaryTypeW)(LPCWSTR a0,\n                                       LPDWORD a1)\n    = GetBinaryTypeW;\n\nLONG (__stdcall * Real_GetBitmapBits)(HBITMAP a0,\n                                      LONG a1,\n                                      LPVOID a2)\n    = GetBitmapBits;\n\nBOOL (__stdcall * Real_GetBitmapDimensionEx)(HBITMAP a0,\n                                             SIZE* a1)\n    = GetBitmapDimensionEx;\n\nCOLORREF (__stdcall * Real_GetBkColor)(HDC a0)\n    = GetBkColor;\n\nint (__stdcall * Real_GetBkMode)(HDC a0)\n    = GetBkMode;\n\nUINT (__stdcall * Real_GetBoundsRect)(HDC a0,\n                                      LPRECT a1,\n                                      UINT a2)\n    = GetBoundsRect;\n\nBOOL (__stdcall * Real_GetBrushOrgEx)(HDC a0,\n                                      POINT* a1)\n    = GetBrushOrgEx;\n\nBOOL (__stdcall * Real_GetCPInfo)(UINT a0,\n                                  LPCPINFO a1)\n    = GetCPInfo;\n\nHWND (__stdcall * Real_GetCapture)(void)\n    = GetCapture;\n\nUINT (__stdcall * Real_GetCaretBlinkTime)(void)\n    = GetCaretBlinkTime;\n\nBOOL (__stdcall * Real_GetCaretPos)(POINT* a0)\n    = GetCaretPos;\n\nBOOL (__stdcall * Real_GetCharABCWidthsA)(HDC a0,\n                                          UINT a1,\n                                          UINT a2,\n                                          LPABC a3)\n    = GetCharABCWidthsA;\n\nBOOL (__stdcall * Real_GetCharABCWidthsFloatA)(HDC a0,\n                                               UINT a1,\n                                               UINT a2,\n                                               LPABCFLOAT a3)\n    = GetCharABCWidthsFloatA;\n\nBOOL (__stdcall * Real_GetCharABCWidthsFloatW)(HDC a0,\n                                               UINT a1,\n                                               UINT a2,\n                                               LPABCFLOAT a3)\n    = GetCharABCWidthsFloatW;\n\nBOOL (__stdcall * Real_GetCharABCWidthsW)(HDC a0,\n                                          UINT a1,\n                                          UINT a2,\n                                          LPABC a3)\n    = GetCharABCWidthsW;\n\nBOOL (__stdcall * Real_GetCharWidth32A)(HDC a0,\n                                        UINT a1,\n                                        UINT a2,\n                                        LPINT a3)\n    = GetCharWidth32A;\n\nBOOL (__stdcall * Real_GetCharWidth32W)(HDC a0,\n                                        UINT a1,\n                                        UINT a2,\n                                        LPINT a3)\n    = GetCharWidth32W;\n\nBOOL (__stdcall * Real_GetCharWidthA)(HDC a0,\n                                      UINT a1,\n                                      UINT a2,\n                                      LPINT a3)\n    = GetCharWidthA;\n\nBOOL (__stdcall * Real_GetCharWidthFloatA)(HDC a0,\n                                           UINT a1,\n                                           UINT a2,\n                                           PFLOAT a3)\n    = GetCharWidthFloatA;\n\nBOOL (__stdcall * Real_GetCharWidthFloatW)(HDC a0,\n                                           UINT a1,\n                                           UINT a2,\n                                           PFLOAT a3)\n    = GetCharWidthFloatW;\n\nBOOL (__stdcall * Real_GetCharWidthW)(HDC a0,\n                                      UINT a1,\n                                      UINT a2,\n                                      LPINT a3)\n    = GetCharWidthW;\n\nDWORD (__stdcall * Real_GetCharacterPlacementA)(HDC a0,\n                                                LPCSTR a1,\n                                                int a2,\n                                                int a3,\n                                                LPGCP_RESULTSA a4,\n                                                DWORD a5)\n    = GetCharacterPlacementA;\n\nDWORD (__stdcall * Real_GetCharacterPlacementW)(HDC a0,\n                                                LPCWSTR a1,\n                                                int a2,\n                                                int a3,\n                                                LPGCP_RESULTSW a4,\n                                                DWORD a5)\n    = GetCharacterPlacementW;\n\nHRESULT (__stdcall * Real_GetClassFile)(LPCOLESTR a0,\n                                        CLSID* a1)\n    = GetClassFile;\n\nBOOL (__stdcall * Real_GetClassInfoA)(HINSTANCE a0,\n                                      LPCSTR a1,\n                                      LPWNDCLASSA a2)\n    = GetClassInfoA;\n\nBOOL (__stdcall * Real_GetClassInfoExA)(HINSTANCE a0,\n                                        LPCSTR a1,\n                                        LPWNDCLASSEXA a2)\n    = GetClassInfoExA;\n\nBOOL (__stdcall * Real_GetClassInfoExW)(HINSTANCE a0,\n                                        LPCWSTR a1,\n                                        LPWNDCLASSEXW a2)\n    = GetClassInfoExW;\n\nBOOL (__stdcall * Real_GetClassInfoW)(HINSTANCE a0,\n                                      LPCWSTR a1,\n                                      LPWNDCLASSW a2)\n    = GetClassInfoW;\n\nDWORD (__stdcall * Real_GetClassLongA)(HWND a0,\n                                       int a1)\n    = GetClassLongA;\n\nDWORD (__stdcall * Real_GetClassLongW)(HWND a0,\n                                       int a1)\n    = GetClassLongW;\n\nint (__stdcall * Real_GetClassNameA)(HWND a0,\n                                     LPSTR a1,\n                                     int a2)\n    = GetClassNameA;\n\nint (__stdcall * Real_GetClassNameW)(HWND a0,\n                                     LPWSTR a1,\n                                     int a2)\n    = GetClassNameW;\n\nWORD (__stdcall * Real_GetClassWord)(HWND a0,\n                                     int a1)\n    = GetClassWord;\n\nBOOL (__stdcall * Real_GetClientRect)(HWND a0,\n                                      LPRECT a1)\n    = GetClientRect;\n\nint (__stdcall * Real_GetClipBox)(HDC a0,\n                                  LPRECT a1)\n    = GetClipBox;\n\nBOOL (__stdcall * Real_GetClipCursor)(LPRECT a0)\n    = GetClipCursor;\n\nint (__stdcall * Real_GetClipRgn)(HDC a0,\n                                  HRGN a1)\n    = GetClipRgn;\n\nHANDLE (__stdcall * Real_GetClipboardData)(UINT a0)\n    = GetClipboardData;\n\nint (__stdcall * Real_GetClipboardFormatNameA)(UINT a0,\n                                               LPSTR a1,\n                                               int a2)\n    = GetClipboardFormatNameA;\n\nint (__stdcall * Real_GetClipboardFormatNameW)(UINT a0,\n                                               LPWSTR a1,\n                                               int a2)\n    = GetClipboardFormatNameW;\n\nHWND (__stdcall * Real_GetClipboardOwner)(void)\n    = GetClipboardOwner;\n\nHWND (__stdcall * Real_GetClipboardViewer)(void)\n    = GetClipboardViewer;\n\nBOOL (__stdcall * Real_GetColorAdjustment)(HDC a0,\n                                           LPCOLORADJUSTMENT a1)\n    = GetColorAdjustment;\n\nHCOLORSPACE (__stdcall * Real_GetColorSpace)(HDC a0)\n    = GetColorSpace;\n\nBOOL (__stdcall * Real_GetCommConfig)(HANDLE a0,\n                                      LPCOMMCONFIG a1,\n                                      LPDWORD a2)\n    = GetCommConfig;\n\nBOOL (__stdcall * Real_GetCommMask)(HANDLE a0,\n                                    LPDWORD a1)\n    = GetCommMask;\n\nBOOL (__stdcall * Real_GetCommModemStatus)(HANDLE a0,\n                                           LPDWORD a1)\n    = GetCommModemStatus;\n\nBOOL (__stdcall * Real_GetCommProperties)(HANDLE a0,\n                                          LPCOMMPROP a1)\n    = GetCommProperties;\n\nBOOL (__stdcall * Real_GetCommState)(HANDLE a0,\n                                     LPDCB a1)\n    = GetCommState;\n\nBOOL (__stdcall * Real_GetCommTimeouts)(HANDLE a0,\n                                        LPCOMMTIMEOUTS a1)\n    = GetCommTimeouts;\n\nLPSTR (__stdcall * Real_GetCommandLineA)(void)\n    = GetCommandLineA;\n\nLPWSTR (__stdcall * Real_GetCommandLineW)(void)\n    = GetCommandLineW;\n\nBOOL (__stdcall * Real_GetComputerNameA)(LPSTR a0,\n                                         LPDWORD a1)\n    = GetComputerNameA;\n\nBOOL (__stdcall * Real_GetComputerNameW)(LPWSTR a0,\n                                         LPDWORD a1)\n    = GetComputerNameW;\n\nUINT (__stdcall * Real_GetConsoleCP)(void)\n    = GetConsoleCP;\n\nBOOL (__stdcall * Real_GetConsoleCursorInfo)(HANDLE a0,\n                                             PCONSOLE_CURSOR_INFO a1)\n    = GetConsoleCursorInfo;\n\nBOOL (__stdcall * Real_GetConsoleMode)(HANDLE a0,\n                                       LPDWORD a1)\n    = GetConsoleMode;\n\nUINT (__stdcall * Real_GetConsoleOutputCP)(void)\n    = GetConsoleOutputCP;\n\nBOOL (__stdcall * Real_GetConsoleScreenBufferInfo)(HANDLE a0,\n                                                   PCONSOLE_SCREEN_BUFFER_INFO a1)\n    = GetConsoleScreenBufferInfo;\n\nDWORD (__stdcall * Real_GetConsoleTitleA)(LPSTR a0,\n                                          DWORD a1)\n    = GetConsoleTitleA;\n\nDWORD (__stdcall * Real_GetConsoleTitleW)(LPWSTR a0,\n                                          DWORD a1)\n    = GetConsoleTitleW;\n\nHRESULT (__stdcall * Real_GetConvertStg)(IStorage* a0)\n    = GetConvertStg;\n\nint (__stdcall * Real_GetCurrencyFormatA)(LCID a0,\n                                          DWORD a1,\n                                          LPCSTR a2,\n                                          CONST CURRENCYFMTA* a3,\n                                          LPSTR a4,\n                                          int a5)\n    = GetCurrencyFormatA;\n\nint (__stdcall * Real_GetCurrencyFormatW)(LCID a0,\n                                          DWORD a1,\n                                          LPCWSTR a2,\n                                          CONST CURRENCYFMTW* a3,\n                                          LPWSTR a4,\n                                          int a5)\n    = GetCurrencyFormatW;\n\nDWORD (__stdcall * Real_GetCurrentDirectoryA)(DWORD a0,\n                                              LPSTR a1)\n    = GetCurrentDirectoryA;\n\nDWORD (__stdcall * Real_GetCurrentDirectoryW)(DWORD a0,\n                                              LPWSTR a1)\n    = GetCurrentDirectoryW;\n\nHGDIOBJ (__stdcall * Real_GetCurrentObject)(HDC a0,\n                                            UINT a1)\n    = GetCurrentObject;\n\nBOOL (__stdcall * Real_GetCurrentPositionEx)(HDC a0,\n                                             POINT* a1)\n    = GetCurrentPositionEx;\n\nHANDLE (__stdcall * Real_GetCurrentProcess)(void)\n    = GetCurrentProcess;\n\nDWORD (__stdcall * Real_GetCurrentProcessId)(void)\n    = GetCurrentProcessId;\n\nDWORD (__stdcall * Real_GetCurrentThreadId)(void)\n    = GetCurrentThreadId;\n\nHCURSOR (__stdcall * Real_GetCursor)(void)\n    = GetCursor;\n\nBOOL (__stdcall * Real_GetCursorPos)(POINT* a0)\n    = GetCursorPos;\n\nHDC (__stdcall * Real_GetDC)(HWND a0)\n    = GetDC;\n\nHDC (__stdcall * Real_GetDCEx)(HWND a0,\n                               HRGN a1,\n                               DWORD a2)\n    = GetDCEx;\n\nBOOL (__stdcall * Real_GetDCOrgEx)(HDC a0,\n                                   POINT* a1)\n    = GetDCOrgEx;\n\nUINT (__stdcall * Real_GetDIBColorTable)(HDC a0,\n                                         UINT a1,\n                                         UINT a2,\n                                         RGBQUAD* a3)\n    = GetDIBColorTable;\n\nint (__stdcall * Real_GetDIBits)(HDC a0,\n                                 HBITMAP a1,\n                                 UINT a2,\n                                 UINT a3,\n                                 LPVOID a4,\n                                 LPBITMAPINFO a5,\n                                 UINT a6)\n    = GetDIBits;\n\nint (__stdcall * Real_GetDateFormatA)(LCID a0,\n                                      DWORD a1,\n                                      CONST SYSTEMTIME* a2,\n                                      LPCSTR a3,\n                                      LPSTR a4,\n                                      int a5)\n    = GetDateFormatA;\n\nint (__stdcall * Real_GetDateFormatW)(LCID a0,\n                                      DWORD a1,\n                                      CONST SYSTEMTIME* a2,\n                                      LPCWSTR a3,\n                                      LPWSTR a4,\n                                      int a5)\n    = GetDateFormatW;\n\nBOOL (__stdcall * Real_GetDefaultCommConfigA)(LPCSTR a0,\n                                              LPCOMMCONFIG a1,\n                                              LPDWORD a2)\n    = GetDefaultCommConfigA;\n\nBOOL (__stdcall * Real_GetDefaultCommConfigW)(LPCWSTR a0,\n                                              LPCOMMCONFIG a1,\n                                              LPDWORD a2)\n    = GetDefaultCommConfigW;\n\nHWND (__stdcall * Real_GetDesktopWindow)(void)\n    = GetDesktopWindow;\n\nint (__stdcall * Real_GetDeviceCaps)(HDC a0,\n                                     int a1)\n    = GetDeviceCaps;\n\nBOOL (__stdcall * Real_GetDeviceGammaRamp)(HDC a0,\n                                           LPVOID a1)\n    = GetDeviceGammaRamp;\n\nlong (__stdcall * Real_GetDialogBaseUnits)(void)\n    = GetDialogBaseUnits;\n\nBOOL (__stdcall * Real_GetDiskFreeSpaceA)(LPCSTR a0,\n                                          LPDWORD a1,\n                                          LPDWORD a2,\n                                          LPDWORD a3,\n                                          LPDWORD a4)\n    = GetDiskFreeSpaceA;\n\nBOOL (__stdcall * Real_GetDiskFreeSpaceExA)(LPCSTR a0,\n                                            union _ULARGE_INTEGER* a1,\n                                            union _ULARGE_INTEGER* a2,\n                                            union _ULARGE_INTEGER* a3)\n    = GetDiskFreeSpaceExA;\n\nBOOL (__stdcall * Real_GetDiskFreeSpaceExW)(LPCWSTR a0,\n                                            union _ULARGE_INTEGER* a1,\n                                            union _ULARGE_INTEGER* a2,\n                                            union _ULARGE_INTEGER* a3)\n    = GetDiskFreeSpaceExW;\n\nBOOL (__stdcall * Real_GetDiskFreeSpaceW)(LPCWSTR a0,\n                                          LPDWORD a1,\n                                          LPDWORD a2,\n                                          LPDWORD a3,\n                                          LPDWORD a4)\n    = GetDiskFreeSpaceW;\n\nint (__stdcall * Real_GetDlgCtrlID)(HWND a0)\n    = GetDlgCtrlID;\n\nHWND (__stdcall * Real_GetDlgItem)(HWND a0,\n                                   int a1)\n    = GetDlgItem;\n\nUINT (__stdcall * Real_GetDlgItemInt)(HWND a0,\n                                      int a1,\n                                      BOOL* a2,\n                                      BOOL a3)\n    = GetDlgItemInt;\n\nUINT (__stdcall * Real_GetDlgItemTextA)(HWND a0,\n                                        int a1,\n                                        LPSTR a2,\n                                        int a3)\n    = GetDlgItemTextA;\n\nUINT (__stdcall * Real_GetDlgItemTextW)(HWND a0,\n                                        int a1,\n                                        LPWSTR a2,\n                                        int a3)\n    = GetDlgItemTextW;\n\nUINT (__stdcall * Real_GetDoubleClickTime)(void)\n    = GetDoubleClickTime;\n\nUINT (__stdcall * Real_GetDriveTypeA)(LPCSTR a0)\n    = GetDriveTypeA;\n\nUINT (__stdcall * Real_GetDriveTypeW)(LPCWSTR a0)\n    = GetDriveTypeW;\n\nHENHMETAFILE (__stdcall * Real_GetEnhMetaFileA)(LPCSTR a0)\n    = GetEnhMetaFileA;\n\nUINT (__stdcall * Real_GetEnhMetaFileBits)(HENHMETAFILE a0,\n                                           UINT a1,\n                                           LPBYTE a2)\n    = GetEnhMetaFileBits;\n\nUINT (__stdcall * Real_GetEnhMetaFileDescriptionA)(HENHMETAFILE a0,\n                                                   UINT a1,\n                                                   LPSTR a2)\n    = GetEnhMetaFileDescriptionA;\n\nUINT (__stdcall * Real_GetEnhMetaFileDescriptionW)(HENHMETAFILE a0,\n                                                   UINT a1,\n                                                   LPWSTR a2)\n    = GetEnhMetaFileDescriptionW;\n\nUINT (__stdcall * Real_GetEnhMetaFileHeader)(HENHMETAFILE a0,\n                                             UINT a1,\n                                             ENHMETAHEADER* a2)\n    = GetEnhMetaFileHeader;\n\nUINT (__stdcall * Real_GetEnhMetaFilePaletteEntries)(HENHMETAFILE a0,\n                                                     UINT a1,\n                                                     PALETTEENTRY* a2)\n    = GetEnhMetaFilePaletteEntries;\n\nUINT (__stdcall * Real_GetEnhMetaFilePixelFormat)(HENHMETAFILE a0,\n                                                  UINT a1,\n                                                  PIXELFORMATDESCRIPTOR* a2)\n    = GetEnhMetaFilePixelFormat;\n\nHENHMETAFILE (__stdcall * Real_GetEnhMetaFileW)(LPCWSTR a0)\n    = GetEnhMetaFileW;\n\n#undef GetEnvironmentStrings\n\nLPSTR (__stdcall * Real_GetEnvironmentStrings)(void)\n    = GetEnvironmentStrings;\n\nLPWSTR (__stdcall * Real_GetEnvironmentStringsW)(void)\n    = GetEnvironmentStringsW;\n\nDWORD (__stdcall * Real_GetEnvironmentVariableA)(LPCSTR a0,\n                                                 LPSTR a1,\n                                                 DWORD a2)\n    = GetEnvironmentVariableA;\n\nDWORD (__stdcall * Real_GetEnvironmentVariableW)(LPCWSTR a0,\n                                                 LPWSTR a1,\n                                                 DWORD a2)\n    = GetEnvironmentVariableW;\n\nBOOL (__stdcall * Real_GetExitCodeProcess)(HANDLE a0,\n                                           LPDWORD a1)\n    = GetExitCodeProcess;\n\nBOOL (__stdcall * Real_GetExitCodeThread)(HANDLE a0,\n                                          LPDWORD a1)\n    = GetExitCodeThread;\n\nDWORD (__stdcall * Real_GetFileAttributesA)(LPCSTR a0)\n    = GetFileAttributesA;\n\nBOOL (__stdcall * Real_GetFileAttributesExA)(LPCSTR a0,\n                                             enum _GET_FILEEX_INFO_LEVELS a1,\n                                             LPVOID a2)\n    = GetFileAttributesExA;\n\nBOOL (__stdcall * Real_GetFileAttributesExW)(LPCWSTR a0,\n                                             enum _GET_FILEEX_INFO_LEVELS a1,\n                                             LPVOID a2)\n    = GetFileAttributesExW;\n\nDWORD (__stdcall * Real_GetFileAttributesW)(LPCWSTR a0)\n    = GetFileAttributesW;\n\nBOOL (__stdcall * Real_GetFileInformationByHandle)(HANDLE a0,\n                                                   LPBY_HANDLE_FILE_INFORMATION a1)\n    = GetFileInformationByHandle;\n\nDWORD (__stdcall * Real_GetFileSize)(HANDLE a0,\n                                     LPDWORD a1)\n    = GetFileSize;\n\nBOOL (__stdcall * Real_GetFileTime)(HANDLE a0,\n                                    LPFILETIME a1,\n                                    LPFILETIME a2,\n                                    LPFILETIME a3)\n    = GetFileTime;\n\nDWORD (__stdcall * Real_GetFileType)(HANDLE a0)\n    = GetFileType;\n\nHWND (__stdcall * Real_GetFocus)(void)\n    = GetFocus;\n\nDWORD (__stdcall * Real_GetFontData)(HDC a0,\n                                     DWORD a1,\n                                     DWORD a2,\n                                     LPVOID a3,\n                                     DWORD a4)\n    = GetFontData;\n\nDWORD (__stdcall * Real_GetFontLanguageInfo)(HDC a0)\n    = GetFontLanguageInfo;\n\nHWND (__stdcall * Real_GetForegroundWindow)(void)\n    = GetForegroundWindow;\n\nDWORD (__stdcall * Real_GetFullPathNameA)(LPCSTR a0,\n                                          DWORD a1,\n                                          LPSTR a2,\n                                          LPSTR* a3)\n    = GetFullPathNameA;\n\nDWORD (__stdcall * Real_GetFullPathNameW)(LPCWSTR a0,\n                                          DWORD a1,\n                                          LPWSTR a2,\n                                          LPWSTR* a3)\n    = GetFullPathNameW;\n\nDWORD (__stdcall * Real_GetGlyphOutlineA)(HDC a0,\n                                          UINT a1,\n                                          UINT a2,\n                                          LPGLYPHMETRICS a3,\n                                          DWORD a4,\n                                          LPVOID a5,\n                                          CONST MAT2* a6)\n    = GetGlyphOutlineA;\n\nDWORD (__stdcall * Real_GetGlyphOutlineW)(HDC a0,\n                                          UINT a1,\n                                          UINT a2,\n                                          LPGLYPHMETRICS a3,\n                                          DWORD a4,\n                                          LPVOID a5,\n                                          CONST MAT2* a6)\n    = GetGlyphOutlineW;\n\nint (__stdcall * Real_GetGraphicsMode)(HDC a0)\n    = GetGraphicsMode;\n\nHRESULT (__stdcall * Real_GetHGlobalFromILockBytes)(ILockBytes* a0,\n                                                    HGLOBAL* a1)\n    = GetHGlobalFromILockBytes;\n\nHRESULT (__stdcall * Real_GetHGlobalFromStream)(LPSTREAM a0,\n                                                HGLOBAL* a1)\n    = GetHGlobalFromStream;\n\nBOOL (__stdcall * Real_GetHandleInformation)(HANDLE a0,\n                                             LPDWORD a1)\n    = GetHandleInformation;\n\nBOOL (__stdcall * Real_GetICMProfileA)(HDC a0,\n                                       LPDWORD a1,\n                                       LPSTR a2)\n    = GetICMProfileA;\n\nBOOL (__stdcall * Real_GetICMProfileW)(HDC a0,\n                                       LPDWORD a1,\n                                       LPWSTR a2)\n    = GetICMProfileW;\n\nBOOL (__stdcall * Real_GetIconInfo)(HICON a0,\n                                    PICONINFO a1)\n    = GetIconInfo;\n\nBOOL (__stdcall * Real_GetInputState)(void)\n    = GetInputState;\n\nUINT (__stdcall * Real_GetKBCodePage)(void)\n    = GetKBCodePage;\n\nDWORD (__stdcall * Real_GetKerningPairsA)(HDC a0,\n                                          DWORD a1,\n                                          KERNINGPAIR* a2)\n    = GetKerningPairsA;\n\nDWORD (__stdcall * Real_GetKerningPairsW)(HDC a0,\n                                          DWORD a1,\n                                          KERNINGPAIR* a2)\n    = GetKerningPairsW;\n\nint (__stdcall * Real_GetKeyNameTextA)(LONG a0,\n                                       LPSTR a1,\n                                       int a2)\n    = GetKeyNameTextA;\n\nint (__stdcall * Real_GetKeyNameTextW)(LONG a0,\n                                       LPWSTR a1,\n                                       int a2)\n    = GetKeyNameTextW;\n\nSHORT (__stdcall * Real_GetKeyState)(int a0)\n    = GetKeyState;\n\nHKL (__stdcall * Real_GetKeyboardLayout)(DWORD a0)\n    = GetKeyboardLayout;\n\nint (__stdcall * Real_GetKeyboardLayoutList)(int a0,\n                                             HKL* a1)\n    = GetKeyboardLayoutList;\n\nBOOL (__stdcall * Real_GetKeyboardLayoutNameA)(LPSTR a0)\n    = GetKeyboardLayoutNameA;\n\nBOOL (__stdcall * Real_GetKeyboardLayoutNameW)(LPWSTR a0)\n    = GetKeyboardLayoutNameW;\n\nBOOL (__stdcall * Real_GetKeyboardState)(PBYTE a0)\n    = GetKeyboardState;\n\nint (__stdcall * Real_GetKeyboardType)(int a0)\n    = GetKeyboardType;\n\nHWND (__stdcall * Real_GetLastActivePopup)(HWND a0)\n    = GetLastActivePopup;\n\nvoid (__stdcall * Real_GetLocalTime)(LPSYSTEMTIME a0)\n    = GetLocalTime;\n\nint (__stdcall * Real_GetLocaleInfoA)(LCID a0,\n                                      LCTYPE a1,\n                                      LPSTR a2,\n                                      int a3)\n    = GetLocaleInfoA;\n\nint (__stdcall * Real_GetLocaleInfoW)(LCID a0,\n                                      LCTYPE a1,\n                                      LPWSTR a2,\n                                      int a3)\n    = GetLocaleInfoW;\n\nBOOL (__stdcall * Real_GetLogColorSpaceA)(HCOLORSPACE a0,\n                                          LOGCOLORSPACEA* a1,\n                                          DWORD a2)\n    = GetLogColorSpaceA;\n\nBOOL (__stdcall * Real_GetLogColorSpaceW)(HCOLORSPACE a0,\n                                          LOGCOLORSPACEW* a1,\n                                          DWORD a2)\n    = GetLogColorSpaceW;\n\nDWORD (__stdcall * Real_GetLogicalDriveStringsA)(DWORD a0,\n                                                 LPSTR a1)\n    = GetLogicalDriveStringsA;\n\nDWORD (__stdcall * Real_GetLogicalDriveStringsW)(DWORD a0,\n                                                 LPWSTR a1)\n    = GetLogicalDriveStringsW;\n\nDWORD (__stdcall * Real_GetLogicalDrives)(void)\n    = GetLogicalDrives;\n\nBOOL (__stdcall * Real_GetMailslotInfo)(HANDLE a0,\n                                        LPDWORD a1,\n                                        LPDWORD a2,\n                                        LPDWORD a3,\n                                        LPDWORD a4)\n    = GetMailslotInfo;\n\nint (__stdcall * Real_GetMapMode)(HDC a0)\n    = GetMapMode;\n\nHMENU (__stdcall * Real_GetMenu)(HWND a0)\n    = GetMenu;\n\nLONG (__stdcall * Real_GetMenuCheckMarkDimensions)(void)\n    = GetMenuCheckMarkDimensions;\n\nDWORD (__stdcall * Real_GetMenuContextHelpId)(HMENU a0)\n    = GetMenuContextHelpId;\n\nUINT (__stdcall * Real_GetMenuDefaultItem)(HMENU a0,\n                                           UINT a1,\n                                           UINT a2)\n    = GetMenuDefaultItem;\n\nint (__stdcall * Real_GetMenuItemCount)(HMENU a0)\n    = GetMenuItemCount;\n\nUINT (__stdcall * Real_GetMenuItemID)(HMENU a0,\n                                      int a1)\n    = GetMenuItemID;\n\nBOOL (__stdcall * Real_GetMenuItemInfoA)(HMENU a0,\n                                         UINT a1,\n                                         BOOL a2,\n                                         LPMENUITEMINFOA a3)\n    = GetMenuItemInfoA;\n\nBOOL (__stdcall * Real_GetMenuItemInfoW)(HMENU a0,\n                                         UINT a1,\n                                         BOOL a2,\n                                         LPMENUITEMINFOW a3)\n    = GetMenuItemInfoW;\n\nBOOL (__stdcall * Real_GetMenuItemRect)(HWND a0,\n                                        HMENU a1,\n                                        UINT a2,\n                                        LPRECT a3)\n    = GetMenuItemRect;\n\nUINT (__stdcall * Real_GetMenuState)(HMENU a0,\n                                     UINT a1,\n                                     UINT a2)\n    = GetMenuState;\n\nint (__stdcall * Real_GetMenuStringA)(HMENU a0,\n                                      UINT a1,\n                                      LPSTR a2,\n                                      int a3,\n                                      UINT a4)\n    = GetMenuStringA;\n\nint (__stdcall * Real_GetMenuStringW)(HMENU a0,\n                                      UINT a1,\n                                      LPWSTR a2,\n                                      int a3,\n                                      UINT a4)\n    = GetMenuStringW;\n\nBOOL (__stdcall * Real_GetMessageA)(LPMSG a0,\n                                    HWND a1,\n                                    UINT a2,\n                                    UINT a3)\n    = GetMessageA;\n\nLPARAM (__stdcall * Real_GetMessageExtraInfo)(void)\n    = GetMessageExtraInfo;\n\nDWORD (__stdcall * Real_GetMessagePos)(void)\n    = GetMessagePos;\n\nLONG (__stdcall * Real_GetMessageTime)(void)\n    = GetMessageTime;\n\nBOOL (__stdcall * Real_GetMessageW)(LPMSG a0,\n                                    HWND a1,\n                                    UINT a2,\n                                    UINT a3)\n    = GetMessageW;\n\nHMETAFILE (__stdcall * Real_GetMetaFileA)(LPCSTR a0)\n    = GetMetaFileA;\n\nUINT (__stdcall * Real_GetMetaFileBitsEx)(HMETAFILE a0,\n                                          UINT a1,\n                                          LPVOID a2)\n    = GetMetaFileBitsEx;\n\nHMETAFILE (__stdcall * Real_GetMetaFileW)(LPCWSTR a0)\n    = GetMetaFileW;\n\nint (__stdcall * Real_GetMetaRgn)(HDC a0,\n                                  HRGN a1)\n    = GetMetaRgn;\n\nBOOL (__stdcall * Real_GetMiterLimit)(HDC a0,\n                                      PFLOAT a1)\n    = GetMiterLimit;\n\nDWORD (__stdcall * Real_GetModuleFileNameA)(HMODULE a0,\n                                            LPSTR a1,\n                                            DWORD a2)\n    = GetModuleFileNameA;\n\nDWORD (__stdcall * Real_GetModuleFileNameW)(HMODULE a0,\n                                            LPWSTR a1,\n                                            DWORD a2)\n    = GetModuleFileNameW;\n\nHMODULE (__stdcall * Real_GetModuleHandleA)(LPCSTR a0)\n    = GetModuleHandleA;\n\nHMODULE (__stdcall * Real_GetModuleHandleW)(LPCWSTR a0)\n    = GetModuleHandleW;\n\nBOOL (__stdcall * Real_GetNamedPipeHandleStateA)(HANDLE a0,\n                                                 LPDWORD a1,\n                                                 LPDWORD a2,\n                                                 LPDWORD a3,\n                                                 LPDWORD a4,\n                                                 LPSTR a5,\n                                                 DWORD a6)\n    = GetNamedPipeHandleStateA;\n\nBOOL (__stdcall * Real_GetNamedPipeHandleStateW)(HANDLE a0,\n                                                 LPDWORD a1,\n                                                 LPDWORD a2,\n                                                 LPDWORD a3,\n                                                 LPDWORD a4,\n                                                 LPWSTR a5,\n                                                 DWORD a6)\n    = GetNamedPipeHandleStateW;\n\nBOOL (__stdcall * Real_GetNamedPipeInfo)(HANDLE a0,\n                                         LPDWORD a1,\n                                         LPDWORD a2,\n                                         LPDWORD a3,\n                                         LPDWORD a4)\n    = GetNamedPipeInfo;\n\nCOLORREF (__stdcall * Real_GetNearestColor)(HDC a0,\n                                            COLORREF a1)\n    = GetNearestColor;\n\nUINT (__stdcall * Real_GetNearestPaletteIndex)(HPALETTE a0,\n                                               COLORREF a1)\n    = GetNearestPaletteIndex;\n\nHWND (__stdcall * Real_GetNextDlgGroupItem)(HWND a0,\n                                            HWND a1,\n                                            BOOL a2)\n    = GetNextDlgGroupItem;\n\nHWND (__stdcall * Real_GetNextDlgTabItem)(HWND a0,\n                                          HWND a1,\n                                          BOOL a2)\n    = GetNextDlgTabItem;\n\nint (__stdcall * Real_GetNumberFormatA)(LCID a0,\n                                        DWORD a1,\n                                        LPCSTR a2,\n                                        CONST NUMBERFMTA* a3,\n                                        LPSTR a4,\n                                        int a5)\n    = GetNumberFormatA;\n\nint (__stdcall * Real_GetNumberFormatW)(LCID a0,\n                                        DWORD a1,\n                                        LPCWSTR a2,\n                                        CONST NUMBERFMTW* a3,\n                                        LPWSTR a4,\n                                        int a5)\n    = GetNumberFormatW;\n\nBOOL (__stdcall * Real_GetNumberOfConsoleInputEvents)(HANDLE a0,\n                                                      LPDWORD a1)\n    = GetNumberOfConsoleInputEvents;\n\nBOOL (__stdcall * Real_GetNumberOfConsoleMouseButtons)(LPDWORD a0)\n    = GetNumberOfConsoleMouseButtons;\n\nUINT (__stdcall * Real_GetOEMCP)(void)\n    = GetOEMCP;\n\nint (__stdcall * Real_GetObjectA)(HGDIOBJ a0,\n                                  int a1,\n                                  LPVOID a2)\n    = GetObjectA;\n\nDWORD (__stdcall * Real_GetObjectType)(HGDIOBJ a0)\n    = GetObjectType;\n\nint (__stdcall * Real_GetObjectW)(HGDIOBJ a0,\n                                  int a1,\n                                  LPVOID a2)\n    = GetObjectW;\n\nHWND (__stdcall * Real_GetOpenClipboardWindow)(void)\n    = GetOpenClipboardWindow;\n\nUINT (__stdcall * Real_GetOutlineTextMetricsA)(HDC a0,\n                                               UINT a1,\n                                               LPOUTLINETEXTMETRICA a2)\n    = GetOutlineTextMetricsA;\n\nUINT (__stdcall * Real_GetOutlineTextMetricsW)(HDC a0,\n                                               UINT a1,\n                                               LPOUTLINETEXTMETRICW a2)\n    = GetOutlineTextMetricsW;\n\nBOOL (__stdcall * Real_GetOverlappedResult)(HANDLE a0,\n                                            LPOVERLAPPED a1,\n                                            LPDWORD a2,\n                                            BOOL a3)\n    = GetOverlappedResult;\n\nUINT (__stdcall * Real_GetPaletteEntries)(HPALETTE a0,\n                                          UINT a1,\n                                          UINT a2,\n                                          PALETTEENTRY* a3)\n    = GetPaletteEntries;\n\nHWND (__stdcall * Real_GetParent)(HWND a0)\n    = GetParent;\n\nint (__stdcall * Real_GetPath)(HDC a0,\n                               POINT* a1,\n                               LPBYTE a2,\n                               int a3)\n    = GetPath;\n\nCOLORREF (__stdcall * Real_GetPixel)(HDC a0,\n                                     int a1,\n                                     int a2)\n    = GetPixel;\n\nint (__stdcall * Real_GetPixelFormat)(HDC a0)\n    = GetPixelFormat;\n\nint (__stdcall * Real_GetPolyFillMode)(HDC a0)\n    = GetPolyFillMode;\n\nDWORD (__stdcall * Real_GetPriorityClass)(HANDLE a0)\n    = GetPriorityClass;\n\nint (__stdcall * Real_GetPriorityClipboardFormat)(UINT* a0,\n                                                  int a1)\n    = GetPriorityClipboardFormat;\n\nUINT (__stdcall * Real_GetPrivateProfileIntA)(LPCSTR a0,\n                                              LPCSTR a1,\n                                              INT a2,\n                                              LPCSTR a3)\n    = GetPrivateProfileIntA;\n\nUINT (__stdcall * Real_GetPrivateProfileIntW)(LPCWSTR a0,\n                                              LPCWSTR a1,\n                                              INT a2,\n                                              LPCWSTR a3)\n    = GetPrivateProfileIntW;\n\nDWORD (__stdcall * Real_GetPrivateProfileSectionA)(LPCSTR a0,\n                                                   LPSTR a1,\n                                                   DWORD a2,\n                                                   LPCSTR a3)\n    = GetPrivateProfileSectionA;\n\nDWORD (__stdcall * Real_GetPrivateProfileSectionNamesA)(LPSTR a0,\n                                                        DWORD a1,\n                                                        LPCSTR a2)\n    = GetPrivateProfileSectionNamesA;\n\nDWORD (__stdcall * Real_GetPrivateProfileSectionNamesW)(LPWSTR a0,\n                                                        DWORD a1,\n                                                        LPCWSTR a2)\n    = GetPrivateProfileSectionNamesW;\n\nDWORD (__stdcall * Real_GetPrivateProfileSectionW)(LPCWSTR a0,\n                                                   LPWSTR a1,\n                                                   DWORD a2,\n                                                   LPCWSTR a3)\n    = GetPrivateProfileSectionW;\n\nDWORD (__stdcall * Real_GetPrivateProfileStringA)(LPCSTR a0,\n                                                  LPCSTR a1,\n                                                  LPCSTR a2,\n                                                  LPSTR a3,\n                                                  DWORD a4,\n                                                  LPCSTR a5)\n    = GetPrivateProfileStringA;\n\nDWORD (__stdcall * Real_GetPrivateProfileStringW)(LPCWSTR a0,\n                                                  LPCWSTR a1,\n                                                  LPCWSTR a2,\n                                                  LPWSTR a3,\n                                                  DWORD a4,\n                                                  LPCWSTR a5)\n    = GetPrivateProfileStringW;\n\nBOOL (__stdcall * Real_GetPrivateProfileStructA)(LPCSTR a0,\n                                                 LPCSTR a1,\n                                                 LPVOID a2,\n                                                 UINT a3,\n                                                 LPCSTR a4)\n    = GetPrivateProfileStructA;\n\nBOOL (__stdcall * Real_GetPrivateProfileStructW)(LPCWSTR a0,\n                                                 LPCWSTR a1,\n                                                 LPVOID a2,\n                                                 UINT a3,\n                                                 LPCWSTR a4)\n    = GetPrivateProfileStructW;\n\nFARPROC (__stdcall * Real_GetProcAddress)(HMODULE a0,\n                                          LPCSTR a1)\n    = GetProcAddress;\n\nBOOL (__stdcall * Real_GetProcessAffinityMask)(HANDLE a0,\n                                               PDWORD_PTR a1,\n                                               PDWORD_PTR a2)\n    = GetProcessAffinityMask;\n\nDWORD (__stdcall * Real_GetProcessHeaps)(DWORD a0,\n                                         PHANDLE a1)\n    = GetProcessHeaps;\n\nBOOL (__stdcall * Real_GetProcessShutdownParameters)(LPDWORD a0,\n                                                     LPDWORD a1)\n    = GetProcessShutdownParameters;\n\nBOOL (__stdcall * Real_GetProcessTimes)(HANDLE a0,\n                                        LPFILETIME a1,\n                                        LPFILETIME a2,\n                                        LPFILETIME a3,\n                                        LPFILETIME a4)\n    = GetProcessTimes;\n\nDWORD (__stdcall * Real_GetProcessVersion)(DWORD a0)\n    = GetProcessVersion;\n\nHWINSTA (__stdcall * Real_GetProcessWindowStation)(void)\n    = GetProcessWindowStation;\n\nBOOL (__stdcall * Real_GetProcessWorkingSetSize)(HANDLE a0,\n                                                 PSIZE_T a1,\n                                                 PSIZE_T a2)\n    = GetProcessWorkingSetSize;\n\nUINT (__stdcall * Real_GetProfileIntA)(LPCSTR a0,\n                                       LPCSTR a1,\n                                       INT a2)\n    = GetProfileIntA;\n\nUINT (__stdcall * Real_GetProfileIntW)(LPCWSTR a0,\n                                       LPCWSTR a1,\n                                       INT a2)\n    = GetProfileIntW;\n\nDWORD (__stdcall * Real_GetProfileSectionA)(LPCSTR a0,\n                                            LPSTR a1,\n                                            DWORD a2)\n    = GetProfileSectionA;\n\nDWORD (__stdcall * Real_GetProfileSectionW)(LPCWSTR a0,\n                                            LPWSTR a1,\n                                            DWORD a2)\n    = GetProfileSectionW;\n\nDWORD (__stdcall * Real_GetProfileStringA)(LPCSTR a0,\n                                           LPCSTR a1,\n                                           LPCSTR a2,\n                                           LPSTR a3,\n                                           DWORD a4)\n    = GetProfileStringA;\n\nDWORD (__stdcall * Real_GetProfileStringW)(LPCWSTR a0,\n                                           LPCWSTR a1,\n                                           LPCWSTR a2,\n                                           LPWSTR a3,\n                                           DWORD a4)\n    = GetProfileStringW;\n\nHANDLE (__stdcall * Real_GetPropA)(HWND a0,\n                                   LPCSTR a1)\n    = GetPropA;\n\nHANDLE (__stdcall * Real_GetPropW)(HWND a0,\n                                   LPCWSTR a1)\n    = GetPropW;\n\nDWORD (__stdcall * Real_GetQueueStatus)(UINT a0)\n    = GetQueueStatus;\n\nBOOL (__stdcall * Real_GetQueuedCompletionStatus)(HANDLE a0,\n                                                  LPDWORD a1,\n                                                  PULONG_PTR a2,\n                                                  LPOVERLAPPED* a3,\n                                                  DWORD a4)\n    = GetQueuedCompletionStatus;\n\nint (__stdcall * Real_GetROP2)(HDC a0)\n    = GetROP2;\n\nBOOL (__stdcall * Real_GetRasterizerCaps)(LPRASTERIZER_STATUS a0,\n                                          UINT a1)\n    = GetRasterizerCaps;\n\nDWORD (__stdcall * Real_GetRegionData)(HRGN a0,\n                                       DWORD a1,\n                                       LPRGNDATA a2)\n    = GetRegionData;\n\nint (__stdcall * Real_GetRgnBox)(HRGN a0,\n                                 LPRECT a1)\n    = GetRgnBox;\n\nHRESULT (__stdcall * Real_GetRunningObjectTable)(DWORD a0,\n                                                 LPRUNNINGOBJECTTABLE* a1)\n    = GetRunningObjectTable;\n\nBOOL (__stdcall * Real_GetScrollInfo)(HWND a0,\n                                      int a1,\n                                      LPSCROLLINFO a2)\n    = GetScrollInfo;\n\nint (__stdcall * Real_GetScrollPos)(HWND a0,\n                                    int a1)\n    = GetScrollPos;\n\nBOOL (__stdcall * Real_GetScrollRange)(HWND a0,\n                                       int a1,\n                                       LPINT a2,\n                                       LPINT a3)\n    = GetScrollRange;\n\nDWORD (__stdcall * Real_GetShortPathNameA)(LPCSTR a0,\n                                           LPSTR a1,\n                                           DWORD a2)\n    = GetShortPathNameA;\n\nDWORD (__stdcall * Real_GetShortPathNameW)(LPCWSTR a0,\n                                           LPWSTR a1,\n                                           DWORD a2)\n    = GetShortPathNameW;\n\nvoid (__stdcall * Real_GetStartupInfoA)(LPSTARTUPINFOA a0)\n    = GetStartupInfoA;\n\nvoid (__stdcall * Real_GetStartupInfoW)(LPSTARTUPINFOW a0)\n    = GetStartupInfoW;\n\nHANDLE (__stdcall * Real_GetStdHandle)(DWORD a0)\n    = GetStdHandle;\n\nHGDIOBJ (__stdcall * Real_GetStockObject)(int a0)\n    = GetStockObject;\n\nint (__stdcall * Real_GetStretchBltMode)(HDC a0)\n    = GetStretchBltMode;\n\nHMENU (__stdcall * Real_GetSubMenu)(HMENU a0,\n                                    int a1)\n    = GetSubMenu;\n\nDWORD (__stdcall * Real_GetSysColor)(int a0)\n    = GetSysColor;\n\nHBRUSH (__stdcall * Real_GetSysColorBrush)(int a0)\n    = GetSysColorBrush;\n\nLCID (__stdcall * Real_GetSystemDefaultLCID)(void)\n    = GetSystemDefaultLCID;\n\nLANGID (__stdcall * Real_GetSystemDefaultLangID)(void)\n    = GetSystemDefaultLangID;\n\nUINT (__stdcall * Real_GetSystemDirectoryA)(LPSTR a0,\n                                            UINT a1)\n    = GetSystemDirectoryA;\n\nUINT (__stdcall * Real_GetSystemDirectoryW)(LPWSTR a0,\n                                            UINT a1)\n    = GetSystemDirectoryW;\n\nvoid (__stdcall * Real_GetSystemInfo)(LPSYSTEM_INFO a0)\n    = GetSystemInfo;\n\nHMENU (__stdcall * Real_GetSystemMenu)(HWND a0,\n                                       BOOL a1)\n    = GetSystemMenu;\n\nint (__stdcall * Real_GetSystemMetrics)(int a0)\n    = GetSystemMetrics;\n\nUINT (__stdcall * Real_GetSystemPaletteEntries)(HDC a0,\n                                                UINT a1,\n                                                UINT a2,\n                                                PALETTEENTRY* a3)\n    = GetSystemPaletteEntries;\n\nUINT (__stdcall * Real_GetSystemPaletteUse)(HDC a0)\n    = GetSystemPaletteUse;\n\nBOOL (__stdcall * Real_GetSystemPowerStatus)(LPSYSTEM_POWER_STATUS a0)\n    = GetSystemPowerStatus;\n\nvoid (__stdcall * Real_GetSystemTime)(LPSYSTEMTIME a0)\n    = GetSystemTime;\n\nBOOL (__stdcall * Real_GetSystemTimeAdjustment)(PDWORD a0,\n                                                PDWORD a1,\n                                                PBOOL a2)\n    = GetSystemTimeAdjustment;\n\nvoid (__stdcall * Real_GetSystemTimeAsFileTime)(LPFILETIME a0)\n    = GetSystemTimeAsFileTime;\n\n#if _MSC_VER < 1300\nDWORD (__stdcall * Real_GetTabbedTextExtentA)(HDC a0,\n                                              LPCSTR a1,\n                                              int a2,\n                                              int a3,\n                                              INT* a4)\n    = GetTabbedTextExtentA;\n#else\nDWORD (__stdcall * Real_GetTabbedTextExtentA)(HDC a0,\n                                              LPCSTR a1,\n                                              int a2,\n                                              int a3,\n                                              CONST INT* a4)\n    = GetTabbedTextExtentA;\n#endif\n\n#if _MSC_VER < 1300\nDWORD (__stdcall * Real_GetTabbedTextExtentW)(HDC a0,\n                                              LPCWSTR a1,\n                                              int a2,\n                                              int a3,\n                                              INT* a4)\n    = GetTabbedTextExtentW;\n#else\nDWORD (__stdcall * Real_GetTabbedTextExtentW)(HDC a0,\n                                              LPCWSTR a1,\n                                              int a2,\n                                              int a3,\n                                              CONST INT* a4)\n    = GetTabbedTextExtentW;\n#endif\n\nDWORD (__stdcall * Real_GetTapeParameters)(HANDLE a0,\n                                           DWORD a1,\n                                           LPDWORD a2,\n                                           LPVOID a3)\n    = GetTapeParameters;\n\nDWORD (__stdcall * Real_GetTapePosition)(HANDLE a0,\n                                         DWORD a1,\n                                         LPDWORD a2,\n                                         LPDWORD a3,\n                                         LPDWORD a4)\n    = GetTapePosition;\n\nDWORD (__stdcall * Real_GetTapeStatus)(HANDLE a0)\n    = GetTapeStatus;\n\nUINT (__stdcall * Real_GetTempFileNameA)(LPCSTR a0,\n                                         LPCSTR a1,\n                                         UINT a2,\n                                         LPSTR a3)\n    = GetTempFileNameA;\n\nUINT (__stdcall * Real_GetTempFileNameW)(LPCWSTR a0,\n                                         LPCWSTR a1,\n                                         UINT a2,\n                                         LPWSTR a3)\n    = GetTempFileNameW;\n\nDWORD (__stdcall * Real_GetTempPathA)(DWORD a0,\n                                      LPSTR a1)\n    = GetTempPathA;\n\nDWORD (__stdcall * Real_GetTempPathW)(DWORD a0,\n                                      LPWSTR a1)\n    = GetTempPathW;\n\nUINT (__stdcall * Real_GetTextAlign)(HDC a0)\n    = GetTextAlign;\n\nint (__stdcall * Real_GetTextCharacterExtra)(HDC a0)\n    = GetTextCharacterExtra;\n\nint (__stdcall * Real_GetTextCharset)(HDC a0)\n    = GetTextCharset;\n\nint (__stdcall * Real_GetTextCharsetInfo)(HDC a0,\n                                          LPFONTSIGNATURE a1,\n                                          DWORD a2)\n    = GetTextCharsetInfo;\n\nCOLORREF (__stdcall * Real_GetTextColor)(HDC a0)\n    = GetTextColor;\n\nBOOL (__stdcall * Real_GetTextExtentExPointA)(HDC a0,\n                                              LPCSTR a1,\n                                              int a2,\n                                              int a3,\n                                              LPINT a4,\n                                              LPINT a5,\n                                              SIZE* a6)\n    = GetTextExtentExPointA;\n\nBOOL (__stdcall * Real_GetTextExtentExPointW)(HDC a0,\n                                              LPCWSTR a1,\n                                              int a2,\n                                              int a3,\n                                              LPINT a4,\n                                              LPINT a5,\n                                              SIZE* a6)\n    = GetTextExtentExPointW;\n\nBOOL (__stdcall * Real_GetTextExtentPoint32A)(HDC a0,\n                                              LPCSTR a1,\n                                              int a2,\n                                              SIZE* a3)\n    = GetTextExtentPoint32A;\n\nBOOL (__stdcall * Real_GetTextExtentPoint32W)(HDC a0,\n                                              LPCWSTR a1,\n                                              int a2,\n                                              SIZE* a3)\n    = GetTextExtentPoint32W;\n\nBOOL (__stdcall * Real_GetTextExtentPointA)(HDC a0,\n                                            LPCSTR a1,\n                                            int a2,\n                                            SIZE* a3)\n    = GetTextExtentPointA;\n\nBOOL (__stdcall * Real_GetTextExtentPointW)(HDC a0,\n                                            LPCWSTR a1,\n                                            int a2,\n                                            SIZE* a3)\n    = GetTextExtentPointW;\n\nint (__stdcall * Real_GetTextFaceA)(HDC a0,\n                                    int a1,\n                                    LPSTR a2)\n    = GetTextFaceA;\n\nint (__stdcall * Real_GetTextFaceW)(HDC a0,\n                                    int a1,\n                                    LPWSTR a2)\n    = GetTextFaceW;\n\nBOOL (__stdcall * Real_GetTextMetricsA)(HDC a0,\n                                        LPTEXTMETRICA a1)\n    = GetTextMetricsA;\n\nBOOL (__stdcall * Real_GetTextMetricsW)(HDC a0,\n                                        LPTEXTMETRICW a1)\n    = GetTextMetricsW;\n\nBOOL (__stdcall * Real_GetThreadContext)(HANDLE a0,\n                                         LPCONTEXT a1)\n    = GetThreadContext;\n\nHDESK (__stdcall * Real_GetThreadDesktop)(DWORD a0)\n    = GetThreadDesktop;\n\n#if(WINVER >= 0x0500)\nLCID (__stdcall * Real_GetThreadLocale)(void)\n    = GetThreadLocale;\n#endif // (WINVER >= 0x0500)\n\nint (__stdcall * Real_GetThreadPriority)(HANDLE a0)\n    = GetThreadPriority;\n\nBOOL (__stdcall * Real_GetThreadPriorityBoost)(HANDLE a0,\n                                               PBOOL a1)\n    = GetThreadPriorityBoost;\n\nBOOL (__stdcall * Real_GetThreadSelectorEntry)(HANDLE a0,\n                                               DWORD a1,\n                                               LPLDT_ENTRY a2)\n    = GetThreadSelectorEntry;\n\nBOOL (__stdcall * Real_GetThreadTimes)(HANDLE a0,\n                                       LPFILETIME a1,\n                                       LPFILETIME a2,\n                                       LPFILETIME a3,\n                                       LPFILETIME a4)\n    = GetThreadTimes;\n\nDWORD (__stdcall * Real_GetTickCount)(void)\n    = GetTickCount;\n\nint (__stdcall * Real_GetTimeFormatA)(LCID a0,\n                                      DWORD a1,\n                                      CONST SYSTEMTIME* a2,\n                                      LPCSTR a3,\n                                      LPSTR a4,\n                                      int a5)\n    = GetTimeFormatA;\n\nint (__stdcall * Real_GetTimeFormatW)(LCID a0,\n                                      DWORD a1,\n                                      CONST SYSTEMTIME* a2,\n                                      LPCWSTR a3,\n                                      LPWSTR a4,\n                                      int a5)\n    = GetTimeFormatW;\n\nDWORD (__stdcall * Real_GetTimeZoneInformation)(LPTIME_ZONE_INFORMATION a0)\n    = GetTimeZoneInformation;\n\nHWND (__stdcall * Real_GetTopWindow)(HWND a0)\n    = GetTopWindow;\n\nBOOL (__stdcall * Real_GetUpdateRect)(HWND a0,\n                                      LPRECT a1,\n                                      BOOL a2)\n    = GetUpdateRect;\n\nint (__stdcall * Real_GetUpdateRgn)(HWND a0,\n                                    HRGN a1,\n                                    BOOL a2)\n    = GetUpdateRgn;\n\nLCID (__stdcall * Real_GetUserDefaultLCID)(void)\n    = GetUserDefaultLCID;\n\nLANGID (__stdcall * Real_GetUserDefaultLangID)(void)\n    = GetUserDefaultLangID;\n\nBOOL (__stdcall * Real_GetUserObjectInformationA)(HANDLE a0,\n                                                  int a1,\n                                                  PVOID a2,\n                                                  DWORD a3,\n                                                  LPDWORD a4)\n    = GetUserObjectInformationA;\n\nBOOL (__stdcall * Real_GetUserObjectInformationW)(HANDLE a0,\n                                                  int a1,\n                                                  PVOID a2,\n                                                  DWORD a3,\n                                                  LPDWORD a4)\n    = GetUserObjectInformationW;\n\nBOOL (__stdcall * Real_GetUserObjectSecurity)(HANDLE a0,\n                                              PSECURITY_INFORMATION a1,\n                                              PSECURITY_DESCRIPTOR a2,\n                                              DWORD a3,\n                                              LPDWORD a4)\n    = GetUserObjectSecurity;\n\nDWORD (__stdcall * Real_GetVersion)(void)\n    = GetVersion;\n\nBOOL (__stdcall * Real_GetVersionExA)(LPOSVERSIONINFOA a0)\n    = GetVersionExA;\n\nBOOL (__stdcall * Real_GetVersionExW)(LPOSVERSIONINFOW a0)\n    = GetVersionExW;\n\nBOOL (__stdcall * Real_GetViewportExtEx)(HDC a0,\n                                         SIZE* a1)\n    = GetViewportExtEx;\n\nBOOL (__stdcall * Real_GetViewportOrgEx)(HDC a0,\n                                         POINT* a1)\n    = GetViewportOrgEx;\n\nBOOL (__stdcall * Real_GetVolumeInformationA)(LPCSTR a0,\n                                              LPSTR a1,\n                                              DWORD a2,\n                                              LPDWORD a3,\n                                              LPDWORD a4,\n                                              LPDWORD a5,\n                                              LPSTR a6,\n                                              DWORD a7)\n    = GetVolumeInformationA;\n\nBOOL (__stdcall * Real_GetVolumeInformationW)(LPCWSTR a0,\n                                              LPWSTR a1,\n                                              DWORD a2,\n                                              LPDWORD a3,\n                                              LPDWORD a4,\n                                              LPDWORD a5,\n                                              LPWSTR a6,\n                                              DWORD a7)\n    = GetVolumeInformationW;\n\nUINT (__stdcall * Real_GetWinMetaFileBits)(HENHMETAFILE a0,\n                                           UINT a1,\n                                           LPBYTE a2,\n                                           INT a3,\n                                           HDC a4)\n    = GetWinMetaFileBits;\n\nHWND (__stdcall * Real_GetWindow)(HWND a0,\n                                  UINT a1)\n    = GetWindow;\n\nDWORD (__stdcall * Real_GetWindowContextHelpId)(HWND a0)\n    = GetWindowContextHelpId;\n\nHDC (__stdcall * Real_GetWindowDC)(HWND a0)\n    = GetWindowDC;\n\nBOOL (__stdcall * Real_GetWindowExtEx)(HDC a0,\n                                       SIZE* a1)\n    = GetWindowExtEx;\n\nLONG (__stdcall * Real_GetWindowLongA)(HWND a0,\n                                       int a1)\n    = GetWindowLongA;\n\nLONG (__stdcall * Real_GetWindowLongW)(HWND a0,\n                                       int a1)\n    = GetWindowLongW;\n\nBOOL (__stdcall * Real_GetWindowOrgEx)(HDC a0,\n                                       POINT* a1)\n    = GetWindowOrgEx;\n\nBOOL (__stdcall * Real_GetWindowPlacement)(HWND a0,\n                                           WINDOWPLACEMENT* a1)\n    = GetWindowPlacement;\n\nBOOL (__stdcall * Real_GetWindowRect)(HWND a0,\n                                      LPRECT a1)\n    = GetWindowRect;\n\nint (__stdcall * Real_GetWindowRgn)(HWND a0,\n                                    HRGN a1)\n    = GetWindowRgn;\n\nint (__stdcall * Real_GetWindowTextA)(HWND a0,\n                                      LPSTR a1,\n                                      int a2)\n    = GetWindowTextA;\n\nint (__stdcall * Real_GetWindowTextLengthA)(HWND a0)\n    = GetWindowTextLengthA;\n\nint (__stdcall * Real_GetWindowTextLengthW)(HWND a0)\n    = GetWindowTextLengthW;\n\nint (__stdcall * Real_GetWindowTextW)(HWND a0,\n                                      LPWSTR a1,\n                                      int a2)\n    = GetWindowTextW;\n\nDWORD (__stdcall * Real_GetWindowThreadProcessId)(HWND a0,\n                                                  LPDWORD a1)\n    = GetWindowThreadProcessId;\n\nWORD (__stdcall * Real_GetWindowWord)(HWND a0,\n                                      int a1)\n    = GetWindowWord;\n\nUINT (__stdcall * Real_GetWindowsDirectoryA)(LPSTR a0,\n                                             UINT a1)\n    = GetWindowsDirectoryA;\n\nUINT (__stdcall * Real_GetWindowsDirectoryW)(LPWSTR a0,\n                                             UINT a1)\n    = GetWindowsDirectoryW;\n\nBOOL (__stdcall * Real_GetWorldTransform)(HDC a0,\n                                          XFORM* a1)\n    = GetWorldTransform;\n\nATOM (__stdcall * Real_GlobalAddAtomA)(LPCSTR a0)\n    = GlobalAddAtomA;\n\nATOM (__stdcall * Real_GlobalAddAtomW)(LPCWSTR a0)\n    = GlobalAddAtomW;\n\nHGLOBAL (__stdcall * Real_GlobalAlloc)(UINT a0,\n                                       SIZE_T a1)\n    = GlobalAlloc;\n\n#if _MSC_VER < 1300\nUINT (__stdcall * Real_GlobalCompact)(DWORD a0)\n    = GlobalCompact;\n#else\nSIZE_T (__stdcall * Real_GlobalCompact)(DWORD a0)\n    = GlobalCompact;\n#endif\n\nATOM (__stdcall * Real_GlobalDeleteAtom)(ATOM a0)\n    = GlobalDeleteAtom;\n\nATOM (__stdcall * Real_GlobalFindAtomA)(LPCSTR a0)\n    = GlobalFindAtomA;\n\nATOM (__stdcall * Real_GlobalFindAtomW)(LPCWSTR a0)\n    = GlobalFindAtomW;\n\nvoid (__stdcall * Real_GlobalFix)(HGLOBAL a0)\n    = GlobalFix;\n\nUINT (__stdcall * Real_GlobalFlags)(HGLOBAL a0)\n    = GlobalFlags;\n\nHGLOBAL (__stdcall * Real_GlobalFree)(HGLOBAL a0)\n    = GlobalFree;\n\nUINT (__stdcall * Real_GlobalGetAtomNameA)(ATOM a0,\n                                           LPSTR a1,\n                                           int a2)\n    = GlobalGetAtomNameA;\n\nUINT (__stdcall * Real_GlobalGetAtomNameW)(ATOM a0,\n                                           LPWSTR a1,\n                                           int a2)\n    = GlobalGetAtomNameW;\n\nHGLOBAL (__stdcall * Real_GlobalHandle)(LPCVOID a0)\n    = GlobalHandle;\n\nLPVOID (__stdcall * Real_GlobalLock)(HGLOBAL a0)\n    = GlobalLock;\n\nvoid (__stdcall * Real_GlobalMemoryStatus)(LPMEMORYSTATUS a0)\n    = GlobalMemoryStatus;\n\nHGLOBAL (__stdcall * Real_GlobalReAlloc)(HGLOBAL a0,\n                                         SIZE_T a1,\n                                         UINT a2)\n    = GlobalReAlloc;\n\nSIZE_T (__stdcall * Real_GlobalSize)(HGLOBAL a0)\n    = GlobalSize;\n\nBOOL (__stdcall * Real_GlobalUnWire)(HGLOBAL a0)\n    = GlobalUnWire;\n\nvoid (__stdcall * Real_GlobalUnfix)(HGLOBAL a0)\n    = GlobalUnfix;\n\nBOOL (__stdcall * Real_GlobalUnlock)(HGLOBAL a0)\n    = GlobalUnlock;\n\nLPVOID (__stdcall * Real_GlobalWire)(HGLOBAL a0)\n    = GlobalWire;\n\nBOOL (__stdcall * Real_GrayStringA)(HDC a0,\n                                    HBRUSH a1,\n                                    GRAYSTRINGPROC a2,\n                                    LPARAM a3,\n                                    int a4,\n                                    int a5,\n                                    int a6,\n                                    int a7,\n                                    int a8)\n    = GrayStringA;\n\nBOOL (__stdcall * Real_GrayStringW)(HDC a0,\n                                    HBRUSH a1,\n                                    GRAYSTRINGPROC a2,\n                                    LPARAM a3,\n                                    int a4,\n                                    int a5,\n                                    int a6,\n                                    int a7,\n                                    int a8)\n    = GrayStringW;\n\nBOOL (__stdcall * Real_HeapLock)(HANDLE a0)\n    = HeapLock;\n\nBOOL (__stdcall * Real_HeapUnlock)(HANDLE a0)\n    = HeapUnlock;\n\nBOOL (__stdcall * Real_HideCaret)(HWND a0)\n    = HideCaret;\n\nBOOL (__stdcall * Real_HiliteMenuItem)(HWND a0,\n                                       HMENU a1,\n                                       UINT a2,\n                                       UINT a3)\n    = HiliteMenuItem;\n\n#ifdef _WIN32_WINNT_WIN7\nHRESULT (__stdcall * Real_IIDFromString)(LPCOLESTR a0,\n                                         LPGUID a1)\n    = IIDFromString;\n#else\nHRESULT (__stdcall * Real_IIDFromString)(LPOLESTR a0,\n                                         LPGUID a1)\n    = IIDFromString;\n#endif\n\nBOOL (__stdcall * Real_ImpersonateDdeClientWindow)(HWND a0,\n                                                   HWND a1)\n    = ImpersonateDdeClientWindow;\n\nBOOL (__stdcall * Real_InSendMessage)(void)\n    = InSendMessage;\n\nBOOL (__stdcall * Real_InflateRect)(LPRECT a0,\n                                    int a1,\n                                    int a2)\n    = InflateRect;\n\nBOOL (__stdcall * Real_InitAtomTable)(DWORD a0)\n    = InitAtomTable;\n\nBOOL (__stdcall * Real_InsertMenuA)(HMENU a0,\n                                    UINT a1,\n                                    UINT a2,\n                                    UINT_PTR a3,\n                                    LPCSTR a4)\n    = InsertMenuA;\n\nBOOL (__stdcall * Real_InsertMenuW)(HMENU a0,\n                                    UINT a1,\n                                    UINT a2,\n                                    UINT_PTR a3,\n                                    LPCWSTR a4)\n    = InsertMenuW;\n\nBOOL (__stdcall * Real_InsertMenuItemA)(HMENU a0,\n                                        UINT a1,\n                                        BOOL a2,\n                                        LPCMENUITEMINFOA a3)\n    = InsertMenuItemA;\n\nBOOL (__stdcall * Real_InsertMenuItemW)(HMENU a0,\n                                        UINT a1,\n                                        BOOL a2,\n                                        LPCMENUITEMINFOW a3)\n    = InsertMenuItemW;\n\nint (__stdcall * Real_IntersectClipRect)(HDC a0,\n                                         int a1,\n                                         int a2,\n                                         int a3,\n                                         int a4)\n    = IntersectClipRect;\n\nBOOL (__stdcall * Real_IntersectRect)(LPRECT a0,\n                                      CONST RECT* a1,\n                                      CONST RECT* a2)\n    = IntersectRect;\n\nBOOL (__stdcall * Real_InvalidateRect)(HWND a0,\n                                       CONST RECT* a1,\n                                       BOOL a2)\n    = InvalidateRect;\n\nBOOL (__stdcall * Real_InvalidateRgn)(HWND a0,\n                                      HRGN a1,\n                                      BOOL a2)\n    = InvalidateRgn;\n\nBOOL (__stdcall * Real_InvertRect)(HDC a0,\n                                   CONST RECT* a1)\n    = InvertRect;\n\nBOOL (__stdcall * Real_InvertRgn)(HDC a0,\n                                  HRGN a1)\n    = InvertRgn;\n\nBOOL (__stdcall * Real_IsAccelerator)(HACCEL a0,\n                                      int a1,\n                                      LPMSG a2,\n                                      WORD* a3)\n    = IsAccelerator;\n\nBOOL (__stdcall * Real_IsBadCodePtr)(FARPROC a0)\n    = IsBadCodePtr;\n\nBOOL (__stdcall * Real_IsBadHugeReadPtr)(CONST void* a0,\n                                         UINT_PTR a1)\n    = IsBadHugeReadPtr;\n\nBOOL (__stdcall * Real_IsBadHugeWritePtr)(LPVOID a0,\n                                          UINT_PTR a1)\n    = IsBadHugeWritePtr;\n\nBOOL (__stdcall * Real_IsBadReadPtr)(CONST void* a0,\n                                     UINT_PTR a1)\n    = IsBadReadPtr;\n\nBOOL (__stdcall * Real_IsBadStringPtrA)(LPCSTR a0,\n                                        UINT_PTR a1)\n    = IsBadStringPtrA;\n\nBOOL (__stdcall * Real_IsBadStringPtrW)(LPCWSTR a0,\n                                        UINT_PTR a1)\n    = IsBadStringPtrW;\n\nBOOL (__stdcall * Real_IsBadWritePtr)(LPVOID a0,\n                                      UINT_PTR a1)\n    = IsBadWritePtr;\n\nBOOL (__stdcall * Real_IsCharAlphaA)(CHAR a0)\n    = IsCharAlphaA;\n\nBOOL (__stdcall * Real_IsCharAlphaNumericA)(CHAR a0)\n    = IsCharAlphaNumericA;\n\nBOOL (__stdcall * Real_IsCharAlphaNumericW)(WCHAR a0)\n    = IsCharAlphaNumericW;\n\nBOOL (__stdcall * Real_IsCharAlphaW)(WCHAR a0)\n    = IsCharAlphaW;\n\nBOOL (__stdcall * Real_IsCharLowerA)(CHAR a0)\n    = IsCharLowerA;\n\nBOOL (__stdcall * Real_IsCharLowerW)(WCHAR a0)\n    = IsCharLowerW;\n\nBOOL (__stdcall * Real_IsCharUpperA)(CHAR a0)\n    = IsCharUpperA;\n\nBOOL (__stdcall * Real_IsCharUpperW)(WCHAR a0)\n    = IsCharUpperW;\n\nBOOL (__stdcall * Real_IsChild)(HWND a0,\n                                HWND a1)\n    = IsChild;\n\nBOOL (__stdcall * Real_IsClipboardFormatAvailable)(UINT a0)\n    = IsClipboardFormatAvailable;\n\nBOOL (__stdcall * Real_IsDBCSLeadByte)(BYTE a0)\n    = IsDBCSLeadByte;\n\nBOOL (__stdcall * Real_IsDBCSLeadByteEx)(UINT a0,\n                                         BYTE a1)\n    = IsDBCSLeadByteEx;\n\nBOOL (__stdcall * Real_IsDebuggerPresent)(void)\n    = IsDebuggerPresent;\n\nBOOL (__stdcall * Real_IsDialogMessageA)(HWND a0,\n                                         LPMSG a1)\n    = IsDialogMessageA;\n\nBOOL (__stdcall * Real_IsDialogMessageW)(HWND a0,\n                                         LPMSG a1)\n    = IsDialogMessageW;\n\nUINT (__stdcall * Real_IsDlgButtonChecked)(HWND a0,\n                                           int a1)\n    = IsDlgButtonChecked;\n\nBOOL (__stdcall * Real_IsIconic)(HWND a0)\n    = IsIconic;\n\nBOOL (__stdcall * Real_IsMenu)(HMENU a0)\n    = IsMenu;\n\n#if !defined(DETOURS_ARM)\nBOOL (__stdcall * Real_IsProcessorFeaturePresent)(DWORD a0)\n    = IsProcessorFeaturePresent;\n#endif // !DETOURS_ARM\n\nBOOL (__stdcall * Real_IsRectEmpty)(CONST RECT* a0)\n    = IsRectEmpty;\n\nBOOL (__stdcall * Real_IsValidCodePage)(UINT a0)\n    = IsValidCodePage;\n\nBOOL (__stdcall * Real_IsValidLocale)(LCID a0,\n                                      DWORD a1)\n    = IsValidLocale;\n\nBOOL (__stdcall * Real_IsWindow)(HWND a0)\n    = IsWindow;\n\nBOOL (__stdcall * Real_IsWindowEnabled)(HWND a0)\n    = IsWindowEnabled;\n\nBOOL (__stdcall * Real_IsWindowUnicode)(HWND a0)\n    = IsWindowUnicode;\n\nBOOL (__stdcall * Real_IsWindowVisible)(HWND a0)\n    = IsWindowVisible;\n\nBOOL (__stdcall * Real_IsZoomed)(HWND a0)\n    = IsZoomed;\n\nBOOL (__stdcall * Real_KillTimer)(HWND a0,\n                                  UINT_PTR a1)\n    = KillTimer;\n\nBOOL (__stdcall * Real_LPtoDP)(HDC a0,\n                               POINT* a1,\n                               int a2)\n    = LPtoDP;\n\nBOOL (__stdcall * Real_LineDDA)(int a0,\n                                int a1,\n                                int a2,\n                                int a3,\n                                LINEDDAPROC a4,\n                                LPARAM a5)\n    = LineDDA;\n\nBOOL (__stdcall * Real_LineTo)(HDC a0,\n                               int a1,\n                               int a2)\n    = LineTo;\n\nHACCEL (__stdcall * Real_LoadAcceleratorsA)(HINSTANCE a0,\n                                            LPCSTR a1)\n    = LoadAcceleratorsA;\n\nHACCEL (__stdcall * Real_LoadAcceleratorsW)(HINSTANCE a0,\n                                            LPCWSTR a1)\n    = LoadAcceleratorsW;\n\nHBITMAP (__stdcall * Real_LoadBitmapA)(HINSTANCE a0,\n                                       LPCSTR a1)\n    = LoadBitmapA;\n\nHBITMAP (__stdcall * Real_LoadBitmapW)(HINSTANCE a0,\n                                       LPCWSTR a1)\n    = LoadBitmapW;\n\nHCURSOR (__stdcall * Real_LoadCursorA)(HINSTANCE a0,\n                                       LPCSTR a1)\n    = LoadCursorA;\n\nHCURSOR (__stdcall * Real_LoadCursorFromFileA)(LPCSTR a0)\n    = LoadCursorFromFileA;\n\nHCURSOR (__stdcall * Real_LoadCursorFromFileW)(LPCWSTR a0)\n    = LoadCursorFromFileW;\n\nHCURSOR (__stdcall * Real_LoadCursorW)(HINSTANCE a0,\n                                       LPCWSTR a1)\n    = LoadCursorW;\n\nHICON (__stdcall * Real_LoadIconA)(HINSTANCE a0,\n                                   LPCSTR a1)\n    = LoadIconA;\n\nHICON (__stdcall * Real_LoadIconW)(HINSTANCE a0,\n                                   LPCWSTR a1)\n    = LoadIconW;\n\nHANDLE (__stdcall * Real_LoadImageA)(HINSTANCE a0,\n                                     LPCSTR a1,\n                                     UINT a2,\n                                     int a3,\n                                     int a4,\n                                     UINT a5)\n    = LoadImageA;\n\nHANDLE (__stdcall * Real_LoadImageW)(HINSTANCE a0,\n                                     LPCWSTR a1,\n                                     UINT a2,\n                                     int a3,\n                                     int a4,\n                                     UINT a5)\n    = LoadImageW;\n\nHKL (__stdcall * Real_LoadKeyboardLayoutA)(LPCSTR a0,\n                                           UINT a1)\n    = LoadKeyboardLayoutA;\n\nHKL (__stdcall * Real_LoadKeyboardLayoutW)(LPCWSTR a0,\n                                           UINT a1)\n    = LoadKeyboardLayoutW;\n\nHMODULE (__stdcall * Real_LoadLibraryA)(LPCSTR a0)\n    = LoadLibraryA;\n\nHMODULE (__stdcall * Real_LoadLibraryExA)(LPCSTR a0,\n                                          HANDLE a1,\n                                          DWORD a2)\n    = LoadLibraryExA;\n\nHMODULE (__stdcall * Real_LoadLibraryExW)(LPCWSTR a0,\n                                          HANDLE a1,\n                                          DWORD a2)\n    = LoadLibraryExW;\n\nHMODULE (__stdcall * Real_LoadLibraryW)(LPCWSTR a0)\n    = LoadLibraryW;\n\nHMENU (__stdcall * Real_LoadMenuA)(HINSTANCE a0,\n                                   LPCSTR a1)\n    = LoadMenuA;\n\nHMENU (__stdcall * Real_LoadMenuIndirectA)(CONST MENUTEMPLATEA* a0)\n    = LoadMenuIndirectA;\n\nHMENU (__stdcall * Real_LoadMenuIndirectW)(CONST MENUTEMPLATEW* a0)\n    = LoadMenuIndirectW;\n\nHMENU (__stdcall * Real_LoadMenuW)(HINSTANCE a0,\n                                   LPCWSTR a1)\n    = LoadMenuW;\n\nDWORD (__stdcall * Real_LoadModule)(LPCSTR a0,\n                                    LPVOID a1)\n    = LoadModule;\n\nHGLOBAL (__stdcall * Real_LoadResource)(HMODULE a0,\n                                        HRSRC a1)\n    = LoadResource;\n\nint (__stdcall * Real_LoadStringA)(HINSTANCE a0,\n                                   UINT a1,\n                                   LPSTR a2,\n                                   int a3)\n    = LoadStringA;\n\nint (__stdcall * Real_LoadStringW)(HINSTANCE a0,\n                                   UINT a1,\n                                   LPWSTR a2,\n                                   int a3)\n    = LoadStringW;\n\n#if _MSC_VER < 1300\nHLOCAL (__stdcall * Real_LocalAlloc)(UINT a0,\n                                     UINT a1)\n    = LocalAlloc;\n#else\nHLOCAL (__stdcall * Real_LocalAlloc)(UINT a0,\n                                     SIZE_T a1)\n    = LocalAlloc;\n#endif\n\n#if _MSC_VER < 1300\nUINT (__stdcall * Real_LocalCompact)(UINT a0)\n    = LocalCompact;\n#else\nSIZE_T (__stdcall * Real_LocalCompact)(UINT a0)\n    = LocalCompact;\n#endif\n\nBOOL (__stdcall * Real_LocalFileTimeToFileTime)(CONST FILETIME* a0,\n                                                LPFILETIME a1)\n    = LocalFileTimeToFileTime;\n\nUINT (__stdcall * Real_LocalFlags)(HLOCAL a0)\n    = LocalFlags;\n\nHLOCAL (__stdcall * Real_LocalFree)(HLOCAL a0)\n    = LocalFree;\n\nHLOCAL (__stdcall * Real_LocalHandle)(LPCVOID a0)\n    = LocalHandle;\n\nLPVOID (__stdcall * Real_LocalLock)(HLOCAL a0)\n    = LocalLock;\n\n#if _MSC_VER < 1300\nHLOCAL (__stdcall * Real_LocalReAlloc)(HLOCAL a0,\n                                       UINT a1,\n                                       UINT a2)\n    = LocalReAlloc;\n#else\nHLOCAL (__stdcall * Real_LocalReAlloc)(HLOCAL a0,\n                                       SIZE_T a1,\n                                       UINT a2)\n    = LocalReAlloc;\n#endif\n\n#if _MSC_VER < 1300\nUINT (__stdcall * Real_LocalShrink)(HLOCAL a0,\n                                      UINT a1)\n    = LocalShrink;\n#else\nSIZE_T (__stdcall * Real_LocalShrink)(HLOCAL a0,\n                                      UINT a1)\n    = LocalShrink;\n#endif\n\n#if _MSC_VER < 1300\nUINT (__stdcall * Real_LocalSize)(HLOCAL a0)\n    = LocalSize;\n#else\nSIZE_T (__stdcall * Real_LocalSize)(HLOCAL a0)\n    = LocalSize;\n#endif\n\nBOOL (__stdcall * Real_LocalUnlock)(HLOCAL a0)\n    = LocalUnlock;\n\nBOOL (__stdcall * Real_LockFile)(HANDLE a0,\n                                 DWORD a1,\n                                 DWORD a2,\n                                 DWORD a3,\n                                 DWORD a4)\n    = LockFile;\n\nBOOL (__stdcall * Real_LockFileEx)(HANDLE a0,\n                                   DWORD a1,\n                                   DWORD a2,\n                                   DWORD a3,\n                                   DWORD a4,\n                                   LPOVERLAPPED a5)\n    = LockFileEx;\n\nLPVOID (__stdcall * Real_LockResource)(HGLOBAL a0)\n    = LockResource;\n\nBOOL (__stdcall * Real_LockWindowUpdate)(HWND a0)\n    = LockWindowUpdate;\n\nint (__stdcall * Real_LookupIconIdFromDirectory)(PBYTE a0,\n                                                 BOOL a1)\n    = LookupIconIdFromDirectory;\n\nint (__stdcall * Real_LookupIconIdFromDirectoryEx)(PBYTE a0,\n                                                   BOOL a1,\n                                                   int a2,\n                                                   int a3,\n                                                   UINT a4)\n    = LookupIconIdFromDirectoryEx;\n\nBOOL (__stdcall * Real_MapDialogRect)(HWND a0,\n                                      LPRECT a1)\n    = MapDialogRect;\n\nLPVOID (__stdcall * Real_MapViewOfFile)(HANDLE a0,\n                                        DWORD a1,\n                                        DWORD a2,\n                                        DWORD a3,\n                                        SIZE_T a4)\n    = MapViewOfFile;\n\nLPVOID (__stdcall * Real_MapViewOfFileEx)(HANDLE a0,\n                                          DWORD a1,\n                                          DWORD a2,\n                                          DWORD a3,\n                                          SIZE_T a4,\n                                          LPVOID a5)\n    = MapViewOfFileEx;\n\nUINT (__stdcall * Real_MapVirtualKeyA)(UINT a0,\n                                       UINT a1)\n    = MapVirtualKeyA;\n\nUINT (__stdcall * Real_MapVirtualKeyExA)(UINT a0,\n                                         UINT a1,\n                                         HKL a2)\n    = MapVirtualKeyExA;\n\nUINT (__stdcall * Real_MapVirtualKeyExW)(UINT a0,\n                                         UINT a1,\n                                         HKL a2)\n    = MapVirtualKeyExW;\n\nUINT (__stdcall * Real_MapVirtualKeyW)(UINT a0,\n                                       UINT a1)\n    = MapVirtualKeyW;\n\nint (__stdcall * Real_MapWindowPoints)(HWND a0,\n                                       HWND a1,\n                                       POINT* a2,\n                                       UINT a3)\n    = MapWindowPoints;\n\nBOOL (__stdcall * Real_MaskBlt)(HDC a0,\n                                int a1,\n                                int a2,\n                                int a3,\n                                int a4,\n                                HDC a5,\n                                int a6,\n                                int a7,\n                                HBITMAP a8,\n                                int a9,\n                                int a10,\n                                DWORD a11)\n    = MaskBlt;\n\nint (__stdcall * Real_MenuItemFromPoint)(HWND a0,\n                                         HMENU a1,\n                                         POINT a2)\n    = MenuItemFromPoint;\n\nBOOL (__stdcall * Real_MessageBeep)(UINT a0)\n    = MessageBeep;\n\nint (__stdcall * Real_MessageBoxA)(HWND a0,\n                                   LPCSTR a1,\n                                   LPCSTR a2,\n                                   UINT a3)\n    = MessageBoxA;\n\nint (__stdcall * Real_MessageBoxExA)(HWND a0,\n                                     LPCSTR a1,\n                                     LPCSTR a2,\n                                     UINT a3,\n                                     WORD a4)\n    = MessageBoxExA;\n\nint (__stdcall * Real_MessageBoxExW)(HWND a0,\n                                     LPCWSTR a1,\n                                     LPCWSTR a2,\n                                     UINT a3,\n                                     WORD a4)\n    = MessageBoxExW;\n\n#if _MSC_VER < 1300\nint (__stdcall * Real_MessageBoxIndirectA)(MSGBOXPARAMSA* a0)\n    = MessageBoxIndirectA;\n#else\nint (__stdcall * Real_MessageBoxIndirectA)(CONST MSGBOXPARAMSA* a0)\n    = MessageBoxIndirectA;\n#endif\n\n#if _MSC_VER < 1300\nint (__stdcall * Real_MessageBoxIndirectW)(MSGBOXPARAMSW* a0)\n    = MessageBoxIndirectW;\n#else\nint (__stdcall * Real_MessageBoxIndirectW)(CONST MSGBOXPARAMSW* a0)\n    = MessageBoxIndirectW;\n#endif\n\nint (__stdcall * Real_MessageBoxW)(HWND a0,\n                                   LPCWSTR a1,\n                                   LPCWSTR a2,\n                                   UINT a3)\n    = MessageBoxW;\n\nHRESULT (__stdcall * Real_MkParseDisplayName)(IBindCtx* a0,\n                                              LPCOLESTR a1,\n                                              ULONG* a2,\n                                              IMoniker** a3)\n    = MkParseDisplayName;\n\nBOOL (__stdcall * Real_ModifyMenuA)(HMENU a0,\n                                    UINT a1,\n                                    UINT a2,\n                                    UINT_PTR a3,\n                                    LPCSTR a4)\n    = ModifyMenuA;\n\nBOOL (__stdcall * Real_ModifyMenuW)(HMENU a0,\n                                    UINT a1,\n                                    UINT a2,\n                                    UINT_PTR a3,\n                                    LPCWSTR a4)\n    = ModifyMenuW;\n\nBOOL (__stdcall * Real_ModifyWorldTransform)(HDC a0,\n                                             CONST XFORM* a1,\n                                             DWORD a2)\n    = ModifyWorldTransform;\n\nHRESULT (__stdcall * Real_MonikerCommonPrefixWith)(IMoniker* a0,\n                                                   IMoniker* a1,\n                                                   IMoniker** a2)\n    = MonikerCommonPrefixWith;\n\nHRESULT (__stdcall * Real_MonikerRelativePathTo)(IMoniker* a0,\n                                                 IMoniker* a1,\n                                                 IMoniker** a2,\n                                                 BOOL a3)\n    = MonikerRelativePathTo;\n\nBOOL (__stdcall * Real_MoveFileA)(LPCSTR a0,\n                                  LPCSTR a1)\n    = MoveFileA;\n\nBOOL (__stdcall * Real_MoveFileExA)(LPCSTR a0,\n                                    LPCSTR a1,\n                                    DWORD a2)\n    = MoveFileExA;\n\nBOOL (__stdcall * Real_MoveFileExW)(LPCWSTR a0,\n                                    LPCWSTR a1,\n                                    DWORD a2)\n    = MoveFileExW;\n\nBOOL (__stdcall * Real_MoveFileW)(LPCWSTR a0,\n                                  LPCWSTR a1)\n    = MoveFileW;\n\nBOOL (__stdcall * Real_MoveToEx)(HDC a0,\n                                 int a1,\n                                 int a2,\n                                 POINT* a3)\n    = MoveToEx;\n\nBOOL (__stdcall * Real_MoveWindow)(HWND a0,\n                                   int a1,\n                                   int a2,\n                                   int a3,\n                                   int a4,\n                                   BOOL a5)\n    = MoveWindow;\n\n#if _MSC_VER < 1300\nDWORD (__stdcall * Real_MsgWaitForMultipleObjects)(DWORD a0,\n                                                   HANDLE * a1,\n                                                   BOOL a2,\n                                                   DWORD a3,\n                                                   DWORD a4)\n    = MsgWaitForMultipleObjects;\n#else\nDWORD (__stdcall * Real_MsgWaitForMultipleObjects)(DWORD a0,\n                                                   CONST HANDLE * a1,\n                                                   BOOL a2,\n                                                   DWORD a3,\n                                                   DWORD a4)\n    = MsgWaitForMultipleObjects;\n#endif\n\n#if _MSC_VER < 1300\nDWORD (__stdcall * Real_MsgWaitForMultipleObjectsEx)(DWORD a0,\n                                                     HANDLE * a1,\n                                                     DWORD a2,\n                                                     DWORD a3,\n                                                     DWORD a4)\n    = MsgWaitForMultipleObjectsEx;\n#else\nDWORD (__stdcall * Real_MsgWaitForMultipleObjectsEx)(DWORD a0,\n                                                     CONST HANDLE * a1,\n                                                     DWORD a2,\n                                                     DWORD a3,\n                                                     DWORD a4)\n    = MsgWaitForMultipleObjectsEx;\n#endif\n\nint (__stdcall * Real_MulDiv)(int a0,\n                              int a1,\n                              int a2)\n    = MulDiv;\n\nDWORD (__stdcall * Real_OemKeyScan)(WORD a0)\n    = OemKeyScan;\n\nBOOL (__stdcall * Real_OemToCharA)(LPCSTR a0,\n                                   LPSTR a1)\n    = OemToCharA;\n\nBOOL (__stdcall * Real_OemToCharBuffA)(LPCSTR a0,\n                                       LPSTR a1,\n                                       DWORD a2)\n    = OemToCharBuffA;\n\nBOOL (__stdcall * Real_OemToCharBuffW)(LPCSTR a0,\n                                       LPWSTR a1,\n                                       DWORD a2)\n    = OemToCharBuffW;\n\nBOOL (__stdcall * Real_OemToCharW)(LPCSTR a0,\n                                   LPWSTR a1)\n    = OemToCharW;\n\nint (__stdcall * Real_OffsetClipRgn)(HDC a0,\n                                     int a1,\n                                     int a2)\n    = OffsetClipRgn;\n\nBOOL (__stdcall * Real_OffsetRect)(LPRECT a0,\n                                   int a1,\n                                   int a2)\n    = OffsetRect;\n\nint (__stdcall * Real_OffsetRgn)(HRGN a0,\n                                 int a1,\n                                 int a2)\n    = OffsetRgn;\n\nBOOL (__stdcall * Real_OffsetViewportOrgEx)(HDC a0,\n                                            int a1,\n                                            int a2,\n                                            POINT* a3)\n    = OffsetViewportOrgEx;\n\nBOOL (__stdcall * Real_OffsetWindowOrgEx)(HDC a0,\n                                          int a1,\n                                          int a2,\n                                          POINT* a3)\n    = OffsetWindowOrgEx;\n\nDWORD (__stdcall * Real_OleBuildVersion)(void)\n    = OleBuildVersion;\n\nHRESULT (__stdcall * Real_OleConvertIStorageToOLESTREAM)(IStorage* a0,\n                                                         LPOLESTREAM a1)\n    = OleConvertIStorageToOLESTREAM;\n\nHRESULT (__stdcall * Real_OleConvertIStorageToOLESTREAMEx)(IStorage* a0,\n                                                           CLIPFORMAT a1,\n                                                           LONG a2,\n                                                           LONG a3,\n                                                           DWORD a4,\n                                                           LPSTGMEDIUM a5,\n                                                           LPOLESTREAM a6)\n    = OleConvertIStorageToOLESTREAMEx;\n\nHRESULT (__stdcall * Real_OleConvertOLESTREAMToIStorage)(LPOLESTREAM a0,\n                                                         LPSTORAGE a1,\n                                                         CONST DVTARGETDEVICE* a2)\n    = OleConvertOLESTREAMToIStorage;\n\nHRESULT (__stdcall * Real_OleConvertOLESTREAMToIStorageEx)(LPOLESTREAM a0,\n                                                           LPSTORAGE a1,\n                                                           CLIPFORMAT* a2,\n                                                           LONG* a3,\n                                                           LONG* a4,\n                                                           DWORD* a5,\n                                                           LPSTGMEDIUM a6)\n    = OleConvertOLESTREAMToIStorageEx;\n\nHRESULT (__stdcall * Real_OleCreate)(CONST IID& a0,\n                                     CONST IID& a1,\n                                     DWORD a2,\n                                     LPFORMATETC a3,\n                                     LPOLECLIENTSITE a4,\n                                     LPSTORAGE a5,\n                                     LPVOID* a6)\n    = OleCreate;\n\nHRESULT (__stdcall * Real_OleCreateDefaultHandler)(CONST IID& a0,\n                                                   LPUNKNOWN a1,\n                                                   CONST IID& a2,\n                                                   LPVOID* a3)\n    = OleCreateDefaultHandler;\n\nHRESULT (__stdcall * Real_OleCreateEmbeddingHelper)(CONST IID& a0,\n                                                    LPUNKNOWN a1,\n                                                    DWORD a2,\n                                                    LPCLASSFACTORY a3,\n                                                    CONST IID& a4,\n                                                    LPVOID* a5)\n    = OleCreateEmbeddingHelper;\n\nHRESULT (__stdcall * Real_OleCreateEx)(CONST IID& a0,\n                                       CONST IID& a1,\n                                       DWORD a2,\n                                       DWORD a3,\n                                       ULONG a4,\n                                       DWORD* a5,\n                                       LPFORMATETC a6,\n                                       IAdviseSink* a7,\n                                       DWORD* a8,\n                                       LPOLECLIENTSITE a9,\n                                       LPSTORAGE a10,\n                                       LPVOID* a11)\n    = OleCreateEx;\n\nHRESULT (__stdcall * Real_OleCreateFromData)(IDataObject* a0,\n                                             CONST IID& a1,\n                                             DWORD a2,\n                                             LPFORMATETC a3,\n                                             LPOLECLIENTSITE a4,\n                                             LPSTORAGE a5,\n                                             LPVOID* a6)\n    = OleCreateFromData;\n\nHRESULT (__stdcall * Real_OleCreateFromDataEx)(IDataObject* a0,\n                                               CONST IID& a1,\n                                               DWORD a2,\n                                               DWORD a3,\n                                               ULONG a4,\n                                               DWORD* a5,\n                                               LPFORMATETC a6,\n                                               IAdviseSink* a7,\n                                               DWORD* a8,\n                                               LPOLECLIENTSITE a9,\n                                               LPSTORAGE a10,\n                                               LPVOID* a11)\n    = OleCreateFromDataEx;\n\nHRESULT (__stdcall * Real_OleCreateFromFile)(CONST IID& a0,\n                                             LPCOLESTR a1,\n                                             CONST IID& a2,\n                                             DWORD a3,\n                                             LPFORMATETC a4,\n                                             LPOLECLIENTSITE a5,\n                                             LPSTORAGE a6,\n                                             LPVOID* a7)\n    = OleCreateFromFile;\n\nHRESULT (__stdcall * Real_OleCreateFromFileEx)(CONST IID& a0,\n                                               LPCOLESTR a1,\n                                               CONST IID& a2,\n                                               DWORD a3,\n                                               DWORD a4,\n                                               ULONG a5,\n                                               DWORD* a6,\n                                               LPFORMATETC a7,\n                                               IAdviseSink* a8,\n                                               DWORD* a9,\n                                               LPOLECLIENTSITE a10,\n                                               LPSTORAGE a11,\n                                               LPVOID* a12)\n    = OleCreateFromFileEx;\n\nHRESULT (__stdcall * Real_OleCreateLink)(IMoniker* a0,\n                                         CONST IID& a1,\n                                         DWORD a2,\n                                         LPFORMATETC a3,\n                                         LPOLECLIENTSITE a4,\n                                         LPSTORAGE a5,\n                                         LPVOID* a6)\n    = OleCreateLink;\n\nHRESULT (__stdcall * Real_OleCreateLinkEx)(IMoniker* a0,\n                                           CONST IID& a1,\n                                           DWORD a2,\n                                           DWORD a3,\n                                           ULONG a4,\n                                           DWORD* a5,\n                                           LPFORMATETC a6,\n                                           IAdviseSink* a7,\n                                           DWORD* a8,\n                                           LPOLECLIENTSITE a9,\n                                           LPSTORAGE a10,\n                                           LPVOID* a11)\n    = OleCreateLinkEx;\n\nHRESULT (__stdcall * Real_OleCreateLinkFromData)(IDataObject* a0,\n                                                 CONST IID& a1,\n                                                 DWORD a2,\n                                                 LPFORMATETC a3,\n                                                 LPOLECLIENTSITE a4,\n                                                 LPSTORAGE a5,\n                                                 LPVOID* a6)\n    = OleCreateLinkFromData;\n\nHRESULT (__stdcall * Real_OleCreateLinkFromDataEx)(IDataObject* a0,\n                                                   CONST IID& a1,\n                                                   DWORD a2,\n                                                   DWORD a3,\n                                                   ULONG a4,\n                                                   DWORD* a5,\n                                                   LPFORMATETC a6,\n                                                   IAdviseSink* a7,\n                                                   DWORD* a8,\n                                                   LPOLECLIENTSITE a9,\n                                                   LPSTORAGE a10,\n                                                   LPVOID* a11)\n    = OleCreateLinkFromDataEx;\n\nHRESULT (__stdcall * Real_OleCreateLinkToFile)(LPCOLESTR a0,\n                                               CONST IID& a1,\n                                               DWORD a2,\n                                               LPFORMATETC a3,\n                                               LPOLECLIENTSITE a4,\n                                               LPSTORAGE a5,\n                                               LPVOID* a6)\n    = OleCreateLinkToFile;\n\nHRESULT (__stdcall * Real_OleCreateLinkToFileEx)(LPCOLESTR a0,\n                                                 CONST IID& a1,\n                                                 DWORD a2,\n                                                 DWORD a3,\n                                                 ULONG a4,\n                                                 DWORD* a5,\n                                                 LPFORMATETC a6,\n                                                 IAdviseSink* a7,\n                                                 DWORD* a8,\n                                                 LPOLECLIENTSITE a9,\n                                                 LPSTORAGE a10,\n                                                 LPVOID* a11)\n    = OleCreateLinkToFileEx;\n\nHOLEMENU (__stdcall * Real_OleCreateMenuDescriptor)(HMENU a0,\n                                                    LPOLEMENUGROUPWIDTHS a1)\n    = OleCreateMenuDescriptor;\n\nHRESULT (__stdcall * Real_OleCreateStaticFromData)(IDataObject* a0,\n                                                   CONST IID& a1,\n                                                   DWORD a2,\n                                                   LPFORMATETC a3,\n                                                   LPOLECLIENTSITE a4,\n                                                   LPSTORAGE a5,\n                                                   LPVOID* a6)\n    = OleCreateStaticFromData;\n\nHRESULT (__stdcall * Real_OleDestroyMenuDescriptor)(HOLEMENU a0)\n    = OleDestroyMenuDescriptor;\n\nHRESULT (__stdcall * Real_OleDoAutoConvert)(LPSTORAGE a0,\n                                            LPGUID a1)\n    = OleDoAutoConvert;\n\nHRESULT (__stdcall * Real_OleDraw)(LPUNKNOWN a0,\n                                   DWORD a1,\n                                   HDC a2,\n                                   LPCRECT a3)\n    = OleDraw;\n\nHANDLE (__stdcall * Real_OleDuplicateData)(HANDLE a0,\n                                           CLIPFORMAT a1,\n                                           UINT a2)\n    = OleDuplicateData;\n\nHRESULT (__stdcall * Real_OleFlushClipboard)(void)\n    = OleFlushClipboard;\n\nHRESULT (__stdcall * Real_OleGetAutoConvert)(CONST IID& a0,\n                                             LPGUID a1)\n    = OleGetAutoConvert;\n\nHRESULT (__stdcall * Real_OleGetClipboard)(IDataObject** a0)\n    = OleGetClipboard;\n\nHGLOBAL (__stdcall * Real_OleGetIconOfClass)(CONST IID& a0,\n                                             LPOLESTR a1,\n                                             BOOL a2)\n    = OleGetIconOfClass;\n\nHGLOBAL (__stdcall * Real_OleGetIconOfFile)(LPOLESTR a0,\n                                            BOOL a1)\n    = OleGetIconOfFile;\n\nHRESULT (__stdcall * Real_OleInitialize)(LPVOID a0)\n    = OleInitialize;\n\nHRESULT (__stdcall * Real_OleIsCurrentClipboard)(IDataObject* a0)\n    = OleIsCurrentClipboard;\n\nBOOL (__stdcall * Real_OleIsRunning)(IOleObject* a0)\n    = OleIsRunning;\n\nHRESULT (__stdcall * Real_OleLoad)(LPSTORAGE a0,\n                                   CONST IID& a1,\n                                   LPOLECLIENTSITE a2,\n                                   LPVOID* a3)\n    = OleLoad;\n\nHRESULT (__stdcall * Real_OleLoadFromStream)(LPSTREAM a0,\n                                             CONST IID& a1,\n                                             LPVOID* a2)\n    = OleLoadFromStream;\n\nHRESULT (__stdcall * Real_OleLockRunning)(LPUNKNOWN a0,\n                                          BOOL a1,\n                                          BOOL a2)\n    = OleLockRunning;\n\nHGLOBAL (__stdcall * Real_OleMetafilePictFromIconAndLabel)(HICON a0,\n                                                           LPOLESTR a1,\n                                                           LPOLESTR a2,\n                                                           UINT a3)\n    = OleMetafilePictFromIconAndLabel;\n\nHRESULT (__stdcall * Real_OleNoteObjectVisible)(LPUNKNOWN a0,\n                                                BOOL a1)\n    = OleNoteObjectVisible;\n\nHRESULT (__stdcall * Real_OleQueryCreateFromData)(IDataObject* a0)\n    = OleQueryCreateFromData;\n\nHRESULT (__stdcall * Real_OleQueryLinkFromData)(IDataObject* a0)\n    = OleQueryLinkFromData;\n\nHRESULT (__stdcall * Real_OleRegEnumFormatEtc)(CONST IID& a0,\n                                               DWORD a1,\n                                               IEnumFORMATETC** a2)\n    = OleRegEnumFormatEtc;\n\nHRESULT (__stdcall * Real_OleRegEnumVerbs)(CONST IID& a0,\n                                           IEnumOLEVERB** a1)\n    = OleRegEnumVerbs;\n\nHRESULT (__stdcall * Real_OleRegGetMiscStatus)(CONST IID& a0,\n                                               DWORD a1,\n                                               DWORD* a2)\n    = OleRegGetMiscStatus;\n\nHRESULT (__stdcall * Real_OleRegGetUserType)(CONST IID& a0,\n                                             DWORD a1,\n                                             LPOLESTR* a2)\n    = OleRegGetUserType;\n\nHRESULT (__stdcall * Real_OleRun)(LPUNKNOWN a0)\n    = OleRun;\n\nHRESULT (__stdcall * Real_OleSave)(LPPERSISTSTORAGE a0,\n                                   LPSTORAGE a1,\n                                   BOOL a2)\n    = OleSave;\n\nHRESULT (__stdcall * Real_OleSaveToStream)(IPersistStream* a0,\n                                           LPSTREAM a1)\n    = OleSaveToStream;\n\nHRESULT (__stdcall * Real_OleSetAutoConvert)(CONST IID& a0,\n                                             CONST IID& a1)\n    = OleSetAutoConvert;\n\nHRESULT (__stdcall * Real_OleSetClipboard)(IDataObject* a0)\n    = OleSetClipboard;\n\nHRESULT (__stdcall * Real_OleSetContainedObject)(LPUNKNOWN a0,\n                                                 BOOL a1)\n    = OleSetContainedObject;\n\nHRESULT (__stdcall * Real_OleSetMenuDescriptor)(HOLEMENU a0,\n                                                HWND a1,\n                                                HWND a2,\n                                                LPOLEINPLACEFRAME a3,\n                                                LPOLEINPLACEACTIVEOBJECT a4)\n    = OleSetMenuDescriptor;\n\nHRESULT (__stdcall * Real_OleTranslateAccelerator)(LPOLEINPLACEFRAME a0,\n                                                   LPOLEINPLACEFRAMEINFO a1,\n                                                   LPMSG a2)\n    = OleTranslateAccelerator;\n\nvoid (__stdcall * Real_OleUninitialize)(void)\n    = OleUninitialize;\n\nBOOL (__stdcall * Real_OpenClipboard)(HWND a0)\n    = OpenClipboard;\n\n#if _MSC_VER < 1300\nHDESK (__stdcall * Real_OpenDesktopA)(LPSTR a0,\n                                      DWORD a1,\n                                      BOOL a2,\n                                      ACCESS_MASK a3)\n    = OpenDesktopA;\n#else\nHDESK (__stdcall * Real_OpenDesktopA)(LPCSTR a0,\n                                      DWORD a1,\n                                      BOOL a2,\n                                      ACCESS_MASK a3)\n    = OpenDesktopA;\n#endif\n\n#if _MSC_VER < 1300\nHDESK (__stdcall * Real_OpenDesktopW)(LPWSTR a0,\n                                      DWORD a1,\n                                      BOOL a2,\n                                      ACCESS_MASK a3)\n    = OpenDesktopW;\n#else\nHDESK (__stdcall * Real_OpenDesktopW)(LPCWSTR a0,\n                                      DWORD a1,\n                                      BOOL a2,\n                                      ACCESS_MASK a3)\n    = OpenDesktopW;\n#endif\n\nHANDLE (__stdcall * Real_OpenEventA)(DWORD a0,\n                                     BOOL a1,\n                                     LPCSTR a2)\n    = OpenEventA;\n\nHANDLE (__stdcall * Real_OpenEventW)(DWORD a0,\n                                     BOOL a1,\n                                     LPCWSTR a2)\n    = OpenEventW;\n\nHFILE (__stdcall * Real_OpenFile)(LPCSTR a0,\n                                  LPOFSTRUCT a1,\n                                  UINT a2)\n    = OpenFile;\n\nHANDLE (__stdcall * Real_OpenFileMappingA)(DWORD a0,\n                                           BOOL a1,\n                                           LPCSTR a2)\n    = OpenFileMappingA;\n\nHANDLE (__stdcall * Real_OpenFileMappingW)(DWORD a0,\n                                           BOOL a1,\n                                           LPCWSTR a2)\n    = OpenFileMappingW;\n\nBOOL (__stdcall * Real_OpenIcon)(HWND a0)\n    = OpenIcon;\n\nHDESK (__stdcall * Real_OpenInputDesktop)(DWORD a0,\n                                          BOOL a1,\n                                          ACCESS_MASK a2)\n    = OpenInputDesktop;\n\nHANDLE (__stdcall * Real_OpenMutexA)(DWORD a0,\n                                     BOOL a1,\n                                     LPCSTR a2)\n    = OpenMutexA;\n\nHANDLE (__stdcall * Real_OpenMutexW)(DWORD a0,\n                                     BOOL a1,\n                                     LPCWSTR a2)\n    = OpenMutexW;\n\nHANDLE (__stdcall * Real_OpenProcess)(DWORD a0,\n                                      BOOL a1,\n                                      DWORD pid)\n    = OpenProcess;\n\nBOOL (__stdcall * Real_OpenProcessToken)(__in   HANDLE ProcessHandle,\n                                         __in   DWORD DesiredAccess,\n                                         __out  PHANDLE TokenHandle\n                                        )\n    = OpenProcessToken;\n\nHANDLE (__stdcall * Real_OpenSemaphoreA)(DWORD a0,\n                                         BOOL a1,\n                                         LPCSTR a2)\n    = OpenSemaphoreA;\n\nHANDLE (__stdcall * Real_OpenSemaphoreW)(DWORD a0,\n                                         BOOL a1,\n                                         LPCWSTR a2)\n    = OpenSemaphoreW;\n\nHANDLE (__stdcall * Real_OpenWaitableTimerA)(DWORD a0,\n                                             BOOL a1,\n                                             LPCSTR a2)\n    = OpenWaitableTimerA;\n\nHANDLE (__stdcall * Real_OpenWaitableTimerW)(DWORD a0,\n                                             BOOL a1,\n                                             LPCWSTR a2)\n    = OpenWaitableTimerW;\n\n#if _MSC_VER < 1300\nHWINSTA (__stdcall * Real_OpenWindowStationA)(LPSTR a0,\n                                              BOOL a1,\n                                              ACCESS_MASK a2)\n    = OpenWindowStationA;\n#else\nHWINSTA (__stdcall * Real_OpenWindowStationA)(LPCSTR a0,\n                                              BOOL a1,\n                                              ACCESS_MASK a2)\n    = OpenWindowStationA;\n#endif\n\n#if _MSC_VER < 1300\nHWINSTA (__stdcall * Real_OpenWindowStationW)(LPWSTR a0,\n                                              BOOL a1,\n                                              ACCESS_MASK a2)\n    = OpenWindowStationW;\n#else\nHWINSTA (__stdcall * Real_OpenWindowStationW)(LPCWSTR a0,\n                                              BOOL a1,\n                                              ACCESS_MASK a2)\n    = OpenWindowStationW;\n#endif\n\nvoid (__stdcall * Real_OutputDebugStringA)(LPCSTR a0)\n    = OutputDebugStringA;\n\nvoid (__stdcall * Real_OutputDebugStringW)(LPCWSTR a0)\n    = OutputDebugStringW;\n\nLPARAM (__stdcall * Real_PackDDElParam)(UINT a0,\n                                        UINT_PTR a1,\n                                        UINT_PTR a2)\n    = PackDDElParam;\n\nBOOL (__stdcall * Real_PaintDesktop)(HDC a0)\n    = PaintDesktop;\n\nBOOL (__stdcall * Real_PaintRgn)(HDC a0,\n                                 HRGN a1)\n    = PaintRgn;\n\nBOOL (__stdcall * Real_PatBlt)(HDC a0,\n                               int a1,\n                               int a2,\n                               int a3,\n                               int a4,\n                               DWORD a5)\n    = PatBlt;\n\nHRGN (__stdcall * Real_PathToRegion)(HDC a0)\n    = PathToRegion;\n\nBOOL (__stdcall * Real_PeekConsoleInputA)(HANDLE a0,\n                                          PINPUT_RECORD a1,\n                                          DWORD a2,\n                                          LPDWORD a3)\n    = PeekConsoleInputA;\n\nBOOL (__stdcall * Real_PeekConsoleInputW)(HANDLE a0,\n                                          PINPUT_RECORD a1,\n                                          DWORD a2,\n                                          LPDWORD a3)\n    = PeekConsoleInputW;\n\nBOOL (__stdcall * Real_PeekMessageA)(LPMSG a0,\n                                     HWND a1,\n                                     UINT a2,\n                                     UINT a3,\n                                     UINT a4)\n    = PeekMessageA;\n\nBOOL (__stdcall * Real_PeekMessageW)(LPMSG a0,\n                                     HWND a1,\n                                     UINT a2,\n                                     UINT a3,\n                                     UINT a4)\n    = PeekMessageW;\n\nBOOL (__stdcall * Real_PeekNamedPipe)(HANDLE a0,\n                                      LPVOID a1,\n                                      DWORD a2,\n                                      LPDWORD a3,\n                                      LPDWORD a4,\n                                      LPDWORD a5)\n    = PeekNamedPipe;\n\nBOOL (__stdcall * Real_Pie)(HDC a0,\n                            int a1,\n                            int a2,\n                            int a3,\n                            int a4,\n                            int a5,\n                            int a6,\n                            int a7,\n                            int a8)\n    = Pie;\n\nBOOL (__stdcall * Real_PlayEnhMetaFile)(HDC a0,\n                                        HENHMETAFILE a1,\n                                        CONST RECT* a2)\n    = PlayEnhMetaFile;\n\nBOOL (__stdcall * Real_PlayEnhMetaFileRecord)(HDC a0,\n                                              LPHANDLETABLE a1,\n                                              CONST ENHMETARECORD* a2,\n                                              UINT a3)\n    = PlayEnhMetaFileRecord;\n\nBOOL (__stdcall * Real_PlayMetaFile)(HDC a0,\n                                     HMETAFILE a1)\n    = PlayMetaFile;\n\nBOOL (__stdcall * Real_PlayMetaFileRecord)(HDC a0,\n                                           LPHANDLETABLE a1,\n                                           LPMETARECORD a2,\n                                           UINT a3)\n    = PlayMetaFileRecord;\n\nBOOL (__stdcall * Real_PlgBlt)(HDC a0,\n                               CONST POINT* a1,\n                               HDC a2,\n                               int a3,\n                               int a4,\n                               int a5,\n                               int a6,\n                               HBITMAP a7,\n                               int a8,\n                               int a9)\n    = PlgBlt;\n\nBOOL (__stdcall * Real_PolyBezier)(HDC a0,\n                                   CONST POINT* a1,\n                                   DWORD a2)\n    = PolyBezier;\n\nBOOL (__stdcall * Real_PolyBezierTo)(HDC a0,\n                                     CONST POINT* a1,\n                                     DWORD a2)\n    = PolyBezierTo;\n\nBOOL (__stdcall * Real_PolyDraw)(HDC a0,\n                                 CONST POINT* a1,\n                                 CONST BYTE* a2,\n                                 int a3)\n    = PolyDraw;\n\nBOOL (__stdcall * Real_PolyPolygon)(HDC a0,\n                                    CONST POINT* a1,\n                                    CONST INT* a2,\n                                    int a3)\n    = PolyPolygon;\n\nBOOL (__stdcall * Real_PolyPolyline)(HDC a0,\n                                     CONST POINT* a1,\n                                     CONST DWORD* a2,\n                                     DWORD a3)\n    = PolyPolyline;\n\nBOOL (__stdcall * Real_PolyTextOutA)(HDC a0,\n                                     CONST POLYTEXTA* a1,\n                                     int a2)\n    = PolyTextOutA;\n\nBOOL (__stdcall * Real_PolyTextOutW)(HDC a0,\n                                     CONST POLYTEXTW* a1,\n                                     int a2)\n    = PolyTextOutW;\n\nBOOL (__stdcall * Real_Polygon)(HDC a0,\n                                CONST POINT* a1,\n                                int a2)\n    = Polygon;\n\nBOOL (__stdcall * Real_Polyline)(HDC a0,\n                                 CONST POINT* a1,\n                                 int a2)\n    = Polyline;\n\nBOOL (__stdcall * Real_PolylineTo)(HDC a0,\n                                   CONST POINT* a1,\n                                   DWORD a2)\n    = PolylineTo;\n\nBOOL (__stdcall * Real_PostMessageA)(HWND a0,\n                                     UINT a1,\n                                     WPARAM a2,\n                                     LPARAM a3)\n    = PostMessageA;\n\nBOOL (__stdcall * Real_PostMessageW)(HWND a0,\n                                     UINT a1,\n                                     WPARAM a2,\n                                     LPARAM a3)\n    = PostMessageW;\n\nBOOL (__stdcall * Real_PostQueuedCompletionStatus)(HANDLE a0,\n                                                   DWORD a1,\n                                                   ULONG_PTR a2,\n                                                   LPOVERLAPPED a3)\n    = PostQueuedCompletionStatus;\n\nvoid (__stdcall * Real_PostQuitMessage)(int a0)\n    = PostQuitMessage;\n\nBOOL (__stdcall * Real_PostThreadMessageA)(DWORD a0,\n                                           UINT a1,\n                                           WPARAM a2,\n                                           LPARAM a3)\n    = PostThreadMessageA;\n\nBOOL (__stdcall * Real_PostThreadMessageW)(DWORD a0,\n                                           UINT a1,\n                                           WPARAM a2,\n                                           LPARAM a3)\n    = PostThreadMessageW;\n\nDWORD (__stdcall * Real_PrepareTape)(HANDLE a0,\n                                     DWORD a1,\n                                     BOOL a2)\n    = PrepareTape;\n\nHRESULT (__stdcall * Real_ProgIDFromCLSID)(CONST IID& a0,\n                                           LPOLESTR* a1)\n    = ProgIDFromCLSID;\n\nHRESULT (__stdcall * Real_PropVariantClear)(PROPVARIANT* a0)\n    = PropVariantClear;\n\nHRESULT (__stdcall * Real_PropVariantCopy)(PROPVARIANT* a0,\n                                           CONST PROPVARIANT* a1)\n    = PropVariantCopy;\n\nBOOL (__stdcall * Real_PtInRect)(CONST RECT* a0,\n                                 POINT a1)\n    = PtInRect;\n\nBOOL (__stdcall * Real_PtInRegion)(HRGN a0,\n                                   int a1,\n                                   int a2)\n    = PtInRegion;\n\nBOOL (__stdcall * Real_PtVisible)(HDC a0,\n                                  int a1,\n                                  int a2)\n    = PtVisible;\n\nBOOL (__stdcall * Real_PulseEvent)(HANDLE a0)\n    = PulseEvent;\n\nBOOL (__stdcall * Real_PurgeComm)(HANDLE a0,\n                                  DWORD a1)\n    = PurgeComm;\n\nDWORD (__stdcall * Real_QueryDosDeviceA)(LPCSTR a0,\n                                         LPSTR a1,\n                                         DWORD a2)\n    = QueryDosDeviceA;\n\nDWORD (__stdcall * Real_QueryDosDeviceW)(LPCWSTR a0,\n                                         LPWSTR a1,\n                                         DWORD a2)\n    = QueryDosDeviceW;\n\nBOOL (__stdcall * Real_QueryPerformanceCounter)(LARGE_INTEGER* a0)\n    = QueryPerformanceCounter;\n\nBOOL (__stdcall * Real_QueryPerformanceFrequency)(LARGE_INTEGER* a0)\n    = QueryPerformanceFrequency;\n\nDWORD (__stdcall * Real_QueueUserAPC)(PAPCFUNC a0,\n                                      HANDLE a1,\n                                      ULONG_PTR a2)\n    = QueueUserAPC;\n\nvoid (__stdcall * Real_RaiseException)(DWORD a0,\n                                       DWORD a1,\n                                       DWORD a2,\n                                       CONST ULONG_PTR* a3)\n    = RaiseException;\n\nHRESULT (__stdcall * Real_ReadClassStg)(LPSTORAGE a0,\n                                        CLSID* a1)\n    = ReadClassStg;\n\nHRESULT (__stdcall * Real_ReadClassStm)(LPSTREAM a0,\n                                        CLSID* a1)\n    = ReadClassStm;\n\nBOOL (__stdcall * Real_ReadConsoleA)(\n                                     HANDLE a0,\n                                     LPVOID a1,\n                                     DWORD a2,\n                                     LPDWORD a3,\n#ifdef ENABLE_INSERT_MODE\n                                     PCONSOLE_READCONSOLE_CONTROL a4\n#else\n                                     LPVOID a4\n#endif\n                                    )\n    = ReadConsoleA;\n\nBOOL (__stdcall * Real_ReadConsoleInputA)(HANDLE a0,\n                                          PINPUT_RECORD a1,\n                                          DWORD a2,\n                                          LPDWORD a3)\n    = ReadConsoleInputA;\n\nBOOL (__stdcall * Real_ReadConsoleInputW)(HANDLE a0,\n                                          PINPUT_RECORD a1,\n                                          DWORD a2,\n                                          LPDWORD a3)\n    = ReadConsoleInputW;\n\nBOOL (__stdcall * Real_ReadConsoleOutputA)(HANDLE a0,\n                                           PCHAR_INFO a1,\n                                           COORD a2,\n                                           COORD a3,\n                                           PSMALL_RECT a4)\n    = ReadConsoleOutputA;\n\nBOOL (__stdcall * Real_ReadConsoleOutputAttribute)(HANDLE a0,\n                                                   LPWORD a1,\n                                                   DWORD a2,\n                                                   COORD a3,\n                                                   LPDWORD a4)\n    = ReadConsoleOutputAttribute;\n\nBOOL (__stdcall * Real_ReadConsoleOutputCharacterA)(HANDLE a0,\n                                                    LPSTR a1,\n                                                    DWORD a2,\n                                                    COORD a3,\n                                                    LPDWORD a4)\n    = ReadConsoleOutputCharacterA;\n\nBOOL (__stdcall * Real_ReadConsoleOutputCharacterW)(HANDLE a0,\n                                                    LPWSTR a1,\n                                                    DWORD a2,\n                                                    COORD a3,\n                                                    LPDWORD a4)\n    = ReadConsoleOutputCharacterW;\n\nBOOL (__stdcall * Real_ReadConsoleOutputW)(HANDLE a0,\n                                           PCHAR_INFO a1,\n                                           COORD a2,\n                                           COORD a3,\n                                           PSMALL_RECT a4)\n    = ReadConsoleOutputW;\n\nBOOL (__stdcall * Real_ReadConsoleW)(\n                                     HANDLE a0,\n                                     LPVOID a1,\n                                     DWORD a2,\n                                     LPDWORD a3,\n#ifdef ENABLE_INSERT_MODE\n                                     PCONSOLE_READCONSOLE_CONTROL a4\n#else\n                                     LPVOID a4\n#endif\n                                    )\n    = ReadConsoleW;\n\nBOOL (__stdcall * Real_ReadDirectoryChangesW)(HANDLE a0,\n                                              LPVOID a1,\n                                              DWORD a2,\n                                              BOOL a3,\n                                              DWORD a4,\n                                              LPDWORD a5,\n                                              LPOVERLAPPED a6,\n                                              LPOVERLAPPED_COMPLETION_ROUTINE a7)\n    = ReadDirectoryChangesW;\n\nBOOL (__stdcall * Real_ReadFile)(HANDLE a0,\n                                 LPVOID a1,\n                                 DWORD a2,\n                                 LPDWORD a3,\n                                 LPOVERLAPPED a4)\n    = ReadFile;\n\nBOOL (__stdcall * Real_ReadFileEx)(HANDLE a0,\n                                   LPVOID a1,\n                                   DWORD a2,\n                                   LPOVERLAPPED a3,\n                                   LPOVERLAPPED_COMPLETION_ROUTINE a4)\n    = ReadFileEx;\n\nHRESULT (__stdcall * Real_ReadFmtUserTypeStg)(LPSTORAGE a0,\n                                              CLIPFORMAT* a1,\n                                              LPOLESTR* a2)\n    = ReadFmtUserTypeStg;\n\nBOOL (__stdcall * Real_ReadProcessMemory)(HANDLE a0,\n                                          LPCVOID a1,\n                                          LPVOID a2,\n                                          DWORD_PTR a3,\n                                          PDWORD_PTR a4)\n    = ReadProcessMemory;\n\nUINT (__stdcall * Real_RealizePalette)(HDC a0)\n    = RealizePalette;\n\nBOOL (__stdcall * Real_RectInRegion)(HRGN a0,\n                                     CONST RECT* a1)\n    = RectInRegion;\n\nBOOL (__stdcall * Real_RectVisible)(HDC a0,\n                                    CONST RECT* a1)\n    = RectVisible;\n\nBOOL (__stdcall * Real_Rectangle)(HDC a0,\n                                  int a1,\n                                  int a2,\n                                  int a3,\n                                  int a4)\n    = Rectangle;\n\nBOOL (__stdcall * Real_RedrawWindow)(HWND a0,\n                                     CONST RECT* a1,\n                                     HRGN a2,\n                                     UINT a3)\n    = RedrawWindow;\n\nATOM (__stdcall * Real_RegisterClassA)(CONST WNDCLASSA* a0)\n    = RegisterClassA;\n\nATOM (__stdcall * Real_RegisterClassExA)(CONST WNDCLASSEXA* a0)\n    = RegisterClassExA;\n\nATOM (__stdcall * Real_RegisterClassExW)(CONST WNDCLASSEXW* a0)\n    = RegisterClassExW;\n\nATOM (__stdcall * Real_RegisterClassW)(CONST WNDCLASSW* a0)\n    = RegisterClassW;\n\nUINT (__stdcall * Real_RegisterClipboardFormatA)(LPCSTR a0)\n    = RegisterClipboardFormatA;\n\nUINT (__stdcall * Real_RegisterClipboardFormatW)(LPCWSTR a0)\n    = RegisterClipboardFormatW;\n\nHRESULT (__stdcall * Real_RegisterDragDrop)(HWND a0,\n                                            IDropTarget* a1)\n    = RegisterDragDrop;\n\nBOOL (__stdcall * Real_RegisterHotKey)(HWND a0,\n                                       int a1,\n                                       UINT a2,\n                                       UINT a3)\n    = RegisterHotKey;\n\nUINT (__stdcall * Real_RegisterWindowMessageA)(LPCSTR a0)\n    = RegisterWindowMessageA;\n\nUINT (__stdcall * Real_RegisterWindowMessageW)(LPCWSTR a0)\n    = RegisterWindowMessageW;\n\nBOOL (__stdcall * Real_ReleaseCapture)(void)\n    = ReleaseCapture;\n\nint (__stdcall * Real_ReleaseDC)(HWND a0,\n                                 HDC a1)\n    = ReleaseDC;\n\nBOOL (__stdcall * Real_ReleaseMutex)(HANDLE a0)\n    = ReleaseMutex;\n\nBOOL (__stdcall * Real_ReleaseSemaphore)(HANDLE a0,\n                                         LONG a1,\n                                         LPLONG a2)\n    = ReleaseSemaphore;\n\nvoid (__stdcall * Real_ReleaseStgMedium)(LPSTGMEDIUM a0)\n    = ReleaseStgMedium;\n\nBOOL (__stdcall * Real_RemoveDirectoryA)(LPCSTR a0)\n    = RemoveDirectoryA;\n\nBOOL (__stdcall * Real_RemoveDirectoryW)(LPCWSTR a0)\n    = RemoveDirectoryW;\n\nBOOL (__stdcall * Real_RemoveFontResourceA)(LPCSTR a0)\n    = RemoveFontResourceA;\n\nBOOL (__stdcall * Real_RemoveFontResourceW)(LPCWSTR a0)\n    = RemoveFontResourceW;\n\nBOOL (__stdcall * Real_RemoveMenu)(HMENU a0,\n                                   UINT a1,\n                                   UINT a2)\n    = RemoveMenu;\n\nHANDLE (__stdcall * Real_RemovePropA)(HWND a0,\n                                      LPCSTR a1)\n    = RemovePropA;\n\nHANDLE (__stdcall * Real_RemovePropW)(HWND a0,\n                                      LPCWSTR a1)\n    = RemovePropW;\n\nBOOL (__stdcall * Real_ReplyMessage)(LRESULT a0)\n    = ReplyMessage;\n\nHDC (__stdcall * Real_ResetDCA)(HDC a0,\n                                CONST DEVMODEA* a1)\n    = ResetDCA;\n\nHDC (__stdcall * Real_ResetDCW)(HDC a0,\n                                CONST DEVMODEW* a1)\n    = ResetDCW;\n\nBOOL (__stdcall * Real_ResetEvent)(HANDLE a0)\n    = ResetEvent;\n\nBOOL (__stdcall * Real_ResizePalette)(HPALETTE a0,\n                                      UINT a1)\n    = ResizePalette;\n\nBOOL (__stdcall * Real_RestoreDC)(HDC a0,\n                                  int a1)\n    = RestoreDC;\n\nDWORD (__stdcall * Real_ResumeThread)(HANDLE a0)\n    = ResumeThread;\n\nLPARAM (__stdcall * Real_ReuseDDElParam)(LPARAM a0,\n                                         UINT a1,\n                                         UINT a2,\n                                         UINT_PTR a3,\n                                         UINT_PTR a4)\n    = ReuseDDElParam;\n\nHRESULT (__stdcall * Real_RevokeDragDrop)(HWND a0)\n    = RevokeDragDrop;\n\nBOOL (__stdcall * Real_RoundRect)(HDC a0,\n                                  int a1,\n                                  int a2,\n                                  int a3,\n                                  int a4,\n                                  int a5,\n                                  int a6)\n    = RoundRect;\n\nint (__stdcall * Real_SaveDC)(HDC a0)\n    = SaveDC;\n\nBOOL (__stdcall * Real_ScaleViewportExtEx)(HDC a0,\n                                           int a1,\n                                           int a2,\n                                           int a3,\n                                           int a4,\n                                           SIZE* a5)\n    = ScaleViewportExtEx;\n\nBOOL (__stdcall * Real_ScaleWindowExtEx)(HDC a0,\n                                         int a1,\n                                         int a2,\n                                         int a3,\n                                         int a4,\n                                         SIZE* a5)\n    = ScaleWindowExtEx;\n\nBOOL (__stdcall * Real_ScreenToClient)(HWND a0,\n                                       POINT* a1)\n    = ScreenToClient;\n\nBOOL (__stdcall * Real_ScrollConsoleScreenBufferA)(HANDLE a0,\n                                                   CONST SMALL_RECT* a1,\n                                                   CONST SMALL_RECT* a2,\n                                                   COORD a3,\n                                                   CONST CHAR_INFO* a4)\n    = ScrollConsoleScreenBufferA;\n\nBOOL (__stdcall * Real_ScrollConsoleScreenBufferW)(HANDLE a0,\n                                                   CONST SMALL_RECT* a1,\n                                                   CONST SMALL_RECT* a2,\n                                                   COORD a3,\n                                                   CONST CHAR_INFO* a4)\n    = ScrollConsoleScreenBufferW;\n\nBOOL (__stdcall * Real_ScrollDC)(HDC a0,\n                                 int a1,\n                                 int a2,\n                                 CONST RECT* a3,\n                                 CONST RECT* a4,\n                                 HRGN a5,\n                                 LPRECT a6)\n    = ScrollDC;\n\nBOOL (__stdcall * Real_ScrollWindow)(HWND a0,\n                                     int a1,\n                                     int a2,\n                                     CONST RECT* a3,\n                                     CONST RECT* a4)\n    = ScrollWindow;\n\nint (__stdcall * Real_ScrollWindowEx)(HWND a0,\n                                      int a1,\n                                      int a2,\n                                      CONST RECT* a3,\n                                      CONST RECT* a4,\n                                      HRGN a5,\n                                      LPRECT a6,\n                                      UINT a7)\n    = ScrollWindowEx;\n\nDWORD (__stdcall * Real_SearchPathA)(LPCSTR a0,\n                                     LPCSTR a1,\n                                     LPCSTR a2,\n                                     DWORD a3,\n                                     LPSTR a4,\n                                     LPSTR* a5)\n    = SearchPathA;\n\nDWORD (__stdcall * Real_SearchPathW)(LPCWSTR a0,\n                                     LPCWSTR a1,\n                                     LPCWSTR a2,\n                                     DWORD a3,\n                                     LPWSTR a4,\n                                     LPWSTR* a5)\n    = SearchPathW;\n\nBOOL (__stdcall * Real_SelectClipPath)(HDC a0,\n                                       int a1)\n    = SelectClipPath;\n\nint (__stdcall * Real_SelectClipRgn)(HDC a0,\n                                     HRGN a1)\n    = SelectClipRgn;\n\nHGDIOBJ (__stdcall * Real_SelectObject)(HDC a0,\n                                        HGDIOBJ a1)\n    = SelectObject;\n\nHPALETTE (__stdcall * Real_SelectPalette)(HDC a0,\n                                          HPALETTE a1,\n                                          BOOL a2)\n    = SelectPalette;\n\nLRESULT (__stdcall * Real_SendDlgItemMessageA)(HWND a0,\n                                               int a1,\n                                               UINT a2,\n                                               WPARAM a3,\n                                               LPARAM a4)\n    = SendDlgItemMessageA;\n\nLRESULT (__stdcall * Real_SendDlgItemMessageW)(HWND a0,\n                                               int a1,\n                                               UINT a2,\n                                               WPARAM a3,\n                                               LPARAM a4)\n    = SendDlgItemMessageW;\n\nLRESULT (__stdcall * Real_SendMessageA)(HWND a0,\n                                        UINT a1,\n                                        WPARAM a2,\n                                        LPARAM a3)\n    = SendMessageA;\n\nBOOL (__stdcall * Real_SendMessageCallbackA)(HWND a0,\n                                             UINT a1,\n                                             WPARAM a2,\n                                             LPARAM a3,\n                                             SENDASYNCPROC a4,\n                                             ULONG_PTR a5)\n    = SendMessageCallbackA;\n\nBOOL (__stdcall * Real_SendMessageCallbackW)(HWND a0,\n                                             UINT a1,\n                                             WPARAM a2,\n                                             LPARAM a3,\n                                             SENDASYNCPROC a4,\n                                             ULONG_PTR a5)\n    = SendMessageCallbackW;\n\nLRESULT (__stdcall * Real_SendMessageTimeoutA)(HWND a0,\n                                               UINT a1,\n                                               WPARAM a2,\n                                               LPARAM a3,\n                                               UINT a4,\n                                               UINT a5,\n                                               PULONG_PTR a6)\n    = SendMessageTimeoutA;\n\nLRESULT (__stdcall * Real_SendMessageTimeoutW)(HWND a0,\n                                               UINT a1,\n                                               WPARAM a2,\n                                               LPARAM a3,\n                                               UINT a4,\n                                               UINT a5,\n                                               PULONG_PTR a6)\n    = SendMessageTimeoutW;\n\nLRESULT (__stdcall * Real_SendMessageW)(HWND a0,\n                                        UINT a1,\n                                        WPARAM a2,\n                                        LPARAM a3)\n    = SendMessageW;\n\nBOOL (__stdcall * Real_SendNotifyMessageA)(HWND a0,\n                                           UINT a1,\n                                           WPARAM a2,\n                                           LPARAM a3)\n    = SendNotifyMessageA;\n\nBOOL (__stdcall * Real_SendNotifyMessageW)(HWND a0,\n                                           UINT a1,\n                                           WPARAM a2,\n                                           LPARAM a3)\n    = SendNotifyMessageW;\n\nint (__stdcall * Real_SetAbortProc)(HDC a0,\n                                    ABORTPROC a1)\n    = SetAbortProc;\n\nHWND (__stdcall * Real_SetActiveWindow)(HWND a0)\n    = SetActiveWindow;\n\nint (__stdcall * Real_SetArcDirection)(HDC a0,\n                                       int a1)\n    = SetArcDirection;\n\nLONG (__stdcall * Real_SetBitmapBits)(HBITMAP a0,\n                                      DWORD a1,\n                                      CONST void* a2)\n    = SetBitmapBits;\n\nBOOL (__stdcall * Real_SetBitmapDimensionEx)(HBITMAP a0,\n                                             int a1,\n                                             int a2,\n                                             SIZE* a3)\n    = SetBitmapDimensionEx;\n\nCOLORREF (__stdcall * Real_SetBkColor)(HDC a0,\n                                       COLORREF a1)\n    = SetBkColor;\n\nint (__stdcall * Real_SetBkMode)(HDC a0,\n                                 int a1)\n    = SetBkMode;\n\nUINT (__stdcall * Real_SetBoundsRect)(HDC a0,\n                                      CONST RECT* a1,\n                                      UINT a2)\n    = SetBoundsRect;\n\nBOOL (__stdcall * Real_SetBrushOrgEx)(HDC a0,\n                                      int a1,\n                                      int a2,\n                                      POINT* a3)\n    = SetBrushOrgEx;\n\nHWND (__stdcall * Real_SetCapture)(HWND a0)\n    = SetCapture;\n\nBOOL (__stdcall * Real_SetCaretBlinkTime)(UINT a0)\n    = SetCaretBlinkTime;\n\nBOOL (__stdcall * Real_SetCaretPos)(int a0,\n                                    int a1)\n    = SetCaretPos;\n\nDWORD (__stdcall * Real_SetClassLongA)(HWND a0,\n                                       int a1,\n                                       LONG a2)\n    = SetClassLongA;\n\nDWORD (__stdcall * Real_SetClassLongW)(HWND a0,\n                                       int a1,\n                                       LONG a2)\n    = SetClassLongW;\n\nWORD (__stdcall * Real_SetClassWord)(HWND a0,\n                                     int a1,\n                                     WORD a2)\n    = SetClassWord;\n\nHANDLE (__stdcall * Real_SetClipboardData)(UINT a0,\n                                           HANDLE a1)\n    = SetClipboardData;\n\nHWND (__stdcall * Real_SetClipboardViewer)(HWND a0)\n    = SetClipboardViewer;\n\nBOOL (__stdcall * Real_SetColorAdjustment)(HDC a0,\n                                           CONST COLORADJUSTMENT* a1)\n    = SetColorAdjustment;\n\nHCOLORSPACE (__stdcall * Real_SetColorSpace)(HDC a0,\n                                             HCOLORSPACE a1)\n    = SetColorSpace;\n\nBOOL (__stdcall * Real_SetCommBreak)(HANDLE a0)\n    = SetCommBreak;\n\nBOOL (__stdcall * Real_SetCommConfig)(HANDLE a0,\n                                      LPCOMMCONFIG a1,\n                                      DWORD a2)\n    = SetCommConfig;\n\nBOOL (__stdcall * Real_SetCommMask)(HANDLE a0,\n                                    DWORD a1)\n    = SetCommMask;\n\nBOOL (__stdcall * Real_SetCommState)(HANDLE a0,\n                                     LPDCB a1)\n    = SetCommState;\n\nBOOL (__stdcall * Real_SetCommTimeouts)(HANDLE a0,\n                                        LPCOMMTIMEOUTS a1)\n    = SetCommTimeouts;\n\nBOOL (__stdcall * Real_SetComputerNameA)(LPCSTR a0)\n    = SetComputerNameA;\n\nBOOL (__stdcall * Real_SetComputerNameW)(LPCWSTR a0)\n    = SetComputerNameW;\n\nBOOL (__stdcall * Real_SetConsoleActiveScreenBuffer)(HANDLE a0)\n    = SetConsoleActiveScreenBuffer;\n\nBOOL (__stdcall * Real_SetConsoleCP)(UINT a0)\n    = SetConsoleCP;\n\nBOOL (__stdcall * Real_SetConsoleCtrlHandler)(PHANDLER_ROUTINE a0,\n                                              BOOL a1)\n    = SetConsoleCtrlHandler;\n\nBOOL (__stdcall * Real_SetConsoleCursorInfo)(HANDLE a0,\n                                             CONST CONSOLE_CURSOR_INFO* a1)\n    = SetConsoleCursorInfo;\n\nBOOL (__stdcall * Real_SetConsoleCursorPosition)(HANDLE a0,\n                                                 COORD a1)\n    = SetConsoleCursorPosition;\n\nBOOL (__stdcall * Real_SetConsoleMode)(HANDLE a0,\n                                       DWORD a1)\n    = SetConsoleMode;\n\nBOOL (__stdcall * Real_SetConsoleOutputCP)(UINT a0)\n    = SetConsoleOutputCP;\n\nBOOL (__stdcall * Real_SetConsoleScreenBufferSize)(HANDLE a0,\n                                                   COORD a1)\n    = SetConsoleScreenBufferSize;\n\nBOOL (__stdcall * Real_SetConsoleTextAttribute)(HANDLE a0,\n                                                WORD a1)\n    = SetConsoleTextAttribute;\n\nBOOL (__stdcall * Real_SetConsoleTitleA)(LPCSTR a0)\n    = SetConsoleTitleA;\n\nBOOL (__stdcall * Real_SetConsoleTitleW)(LPCWSTR a0)\n    = SetConsoleTitleW;\n\nBOOL (__stdcall * Real_SetConsoleWindowInfo)(HANDLE a0,\n                                             BOOL a1,\n                                             CONST SMALL_RECT* a2)\n    = SetConsoleWindowInfo;\n\nHRESULT (__stdcall * Real_SetConvertStg)(LPSTORAGE a0,\n                                         BOOL a1)\n    = SetConvertStg;\n\nBOOL (__stdcall * Real_SetCurrentDirectoryA)(LPCSTR a0)\n    = SetCurrentDirectoryA;\n\nBOOL (__stdcall * Real_SetCurrentDirectoryW)(LPCWSTR a0)\n    = SetCurrentDirectoryW;\n\nHCURSOR (__stdcall * Real_SetCursor)(HCURSOR a0)\n    = SetCursor;\n\nBOOL (__stdcall * Real_SetCursorPos)(int a0,\n                                     int a1)\n    = SetCursorPos;\n\nUINT (__stdcall * Real_SetDIBColorTable)(HDC a0,\n                                         UINT a1,\n                                         UINT a2,\n                                         CONST RGBQUAD* a3)\n    = SetDIBColorTable;\n\nint (__stdcall * Real_SetDIBits)(HDC a0,\n                                 HBITMAP a1,\n                                 UINT a2,\n                                 UINT a3,\n                                 CONST void* a4,\n                                 CONST BITMAPINFO* a5,\n                                 UINT a6)\n    = SetDIBits;\n\nint (__stdcall * Real_SetDIBitsToDevice)(HDC a0,\n                                         int a1,\n                                         int a2,\n                                         DWORD a3,\n                                         DWORD a4,\n                                         int a5,\n                                         int a6,\n                                         UINT a7,\n                                         UINT a8,\n                                         CONST void* a9,\n                                         CONST BITMAPINFO* a10,\n                                         UINT a11)\n    = SetDIBitsToDevice;\n\nBOOL (__stdcall * Real_SetDefaultCommConfigA)(LPCSTR a0,\n                                              LPCOMMCONFIG a1,\n                                              DWORD a2)\n    = SetDefaultCommConfigA;\n\nBOOL (__stdcall * Real_SetDefaultCommConfigW)(LPCWSTR a0,\n                                              LPCOMMCONFIG a1,\n                                              DWORD a2)\n    = SetDefaultCommConfigW;\n\nBOOL (__stdcall * Real_SetDeviceGammaRamp)(HDC a0,\n                                           LPVOID a1)\n    = SetDeviceGammaRamp;\n\nBOOL (__stdcall * Real_SetDlgItemInt)(HWND a0,\n                                      int a1,\n                                      UINT a2,\n                                      BOOL a3)\n    = SetDlgItemInt;\n\nBOOL (__stdcall * Real_SetDlgItemTextA)(HWND a0,\n                                        int a1,\n                                        LPCSTR a2)\n    = SetDlgItemTextA;\n\nBOOL (__stdcall * Real_SetDlgItemTextW)(HWND a0,\n                                        int a1,\n                                        LPCWSTR a2)\n    = SetDlgItemTextW;\n\nBOOL (__stdcall * Real_SetDoubleClickTime)(UINT a0)\n    = SetDoubleClickTime;\n\nBOOL (__stdcall * Real_SetEndOfFile)(HANDLE a0)\n    = SetEndOfFile;\n\nHENHMETAFILE (__stdcall * Real_SetEnhMetaFileBits)(UINT a0,\n                                                   CONST BYTE* a1)\n    = SetEnhMetaFileBits;\n\nBOOL (__stdcall * Real_SetEnvironmentVariableA)(LPCSTR a0,\n                                                LPCSTR a1)\n    = SetEnvironmentVariableA;\n\nBOOL (__stdcall * Real_SetEnvironmentVariableW)(LPCWSTR a0,\n                                                LPCWSTR a1)\n    = SetEnvironmentVariableW;\n\nUINT (__stdcall * Real_SetErrorMode)(UINT a0)\n    = SetErrorMode;\n\nBOOL (__stdcall * Real_SetEvent)(HANDLE a0)\n    = SetEvent;\n\nvoid (__stdcall * Real_SetFileApisToANSI)(void)\n    = SetFileApisToANSI;\n\nvoid (__stdcall * Real_SetFileApisToOEM)(void)\n    = SetFileApisToOEM;\n\nBOOL (__stdcall * Real_SetFileAttributesA)(LPCSTR a0,\n                                           DWORD a1)\n    = SetFileAttributesA;\n\nBOOL (__stdcall * Real_SetFileAttributesW)(LPCWSTR a0,\n                                           DWORD a1)\n    = SetFileAttributesW;\n\nDWORD (__stdcall * Real_SetFilePointer)(HANDLE a0,\n                                        LONG a1,\n                                        PLONG a2,\n                                        DWORD a3)\n    = SetFilePointer;\n\nBOOL (__stdcall * Real_SetFileTime)(HANDLE a0,\n                                    CONST FILETIME* a1,\n                                    CONST FILETIME* a2,\n                                    CONST FILETIME* a3)\n    = SetFileTime;\n\nHWND (__stdcall * Real_SetFocus)(HWND a0)\n    = SetFocus;\n\nBOOL (__stdcall * Real_SetForegroundWindow)(HWND a0)\n    = SetForegroundWindow;\n\nint (__stdcall * Real_SetGraphicsMode)(HDC a0,\n                                       int a1)\n    = SetGraphicsMode;\n\nUINT (__stdcall * Real_SetHandleCount)(UINT a0)\n    = SetHandleCount;\n\nBOOL (__stdcall * Real_SetHandleInformation)(HANDLE a0,\n                                             DWORD a1,\n                                             DWORD a2)\n    = SetHandleInformation;\n\nint (__stdcall * Real_SetICMMode)(HDC a0,\n                                  int a1)\n    = SetICMMode;\n\nBOOL (__stdcall * Real_SetICMProfileA)(HDC a0,\n                                       LPSTR a1)\n    = SetICMProfileA;\n\nBOOL (__stdcall * Real_SetICMProfileW)(HDC a0,\n                                       LPWSTR a1)\n    = SetICMProfileW;\n\nBOOL (__stdcall * Real_SetKeyboardState)(LPBYTE a0)\n    = SetKeyboardState;\n\nBOOL (__stdcall * Real_SetLocalTime)(CONST SYSTEMTIME* a0)\n    = SetLocalTime;\n\nBOOL (__stdcall * Real_SetLocaleInfoA)(LCID a0,\n                                       LCTYPE a1,\n                                       LPCSTR a2)\n    = SetLocaleInfoA;\n\nBOOL (__stdcall * Real_SetLocaleInfoW)(LCID a0,\n                                       LCTYPE a1,\n                                       LPCWSTR a2)\n    = SetLocaleInfoW;\n\nBOOL (__stdcall * Real_SetMailslotInfo)(HANDLE a0,\n                                        DWORD a1)\n    = SetMailslotInfo;\n\nint (__stdcall * Real_SetMapMode)(HDC a0,\n                                  int a1)\n    = SetMapMode;\n\nDWORD (__stdcall * Real_SetMapperFlags)(HDC a0,\n                                        DWORD a1)\n    = SetMapperFlags;\n\nBOOL (__stdcall * Real_SetMenu)(HWND a0,\n                                HMENU a1)\n    = SetMenu;\n\nBOOL (__stdcall * Real_SetMenuContextHelpId)(HMENU a0,\n                                             DWORD a1)\n    = SetMenuContextHelpId;\n\nBOOL (__stdcall * Real_SetMenuDefaultItem)(HMENU a0,\n                                           UINT a1,\n                                           UINT a2)\n    = SetMenuDefaultItem;\n\nBOOL (__stdcall * Real_SetMenuItemBitmaps)(HMENU a0,\n                                           UINT a1,\n                                           UINT a2,\n                                           HBITMAP a3,\n                                           HBITMAP a4)\n    = SetMenuItemBitmaps;\n\nBOOL (__stdcall * Real_SetMenuItemInfoA)(HMENU a0,\n                                         UINT a1,\n                                         BOOL a2,\n                                         CONST MENUITEMINFOA* a3)\n    = SetMenuItemInfoA;\n\nBOOL (__stdcall * Real_SetMenuItemInfoW)(HMENU a0,\n                                         UINT a1,\n                                         BOOL a2,\n                                         CONST MENUITEMINFOW* a3)\n    = SetMenuItemInfoW;\n\nLPARAM (__stdcall * Real_SetMessageExtraInfo)(LPARAM a0)\n    = SetMessageExtraInfo;\n\nBOOL (__stdcall * Real_SetMessageQueue)(int a0)\n    = SetMessageQueue;\n\nHMETAFILE (__stdcall * Real_SetMetaFileBitsEx)(UINT a0,\n                                               CONST BYTE* a1)\n    = SetMetaFileBitsEx;\n\nint (__stdcall * Real_SetMetaRgn)(HDC a0)\n    = SetMetaRgn;\n\nBOOL (__stdcall * Real_SetMiterLimit)(HDC a0,\n                                      FLOAT a1,\n                                      PFLOAT a2)\n    = SetMiterLimit;\n\nBOOL (__stdcall * Real_SetNamedPipeHandleState)(HANDLE a0,\n                                                LPDWORD a1,\n                                                LPDWORD a2,\n                                                LPDWORD a3)\n    = SetNamedPipeHandleState;\n\nUINT (__stdcall * Real_SetPaletteEntries)(HPALETTE a0,\n                                          UINT a1,\n                                          UINT a2,\n                                          CONST PALETTEENTRY* a3)\n    = SetPaletteEntries;\n\nHWND (__stdcall * Real_SetParent)(HWND a0,\n                                  HWND a1)\n    = SetParent;\n\nCOLORREF (__stdcall * Real_SetPixel)(HDC a0,\n                                     int a1,\n                                     int a2,\n                                     COLORREF a3)\n    = SetPixel;\n\nBOOL (__stdcall * Real_SetPixelFormat)(HDC a0,\n                                       int a1,\n                                       CONST PIXELFORMATDESCRIPTOR* a2)\n    = SetPixelFormat;\n\nBOOL (__stdcall * Real_SetPixelV)(HDC a0,\n                                  int a1,\n                                  int a2,\n                                  COLORREF a3)\n    = SetPixelV;\n\nint (__stdcall * Real_SetPolyFillMode)(HDC a0,\n                                       int a1)\n    = SetPolyFillMode;\n\nBOOL (__stdcall * Real_SetPriorityClass)(HANDLE a0,\n                                         DWORD a1)\n    = SetPriorityClass;\n\nBOOL (__stdcall * Real_SetProcessAffinityMask)(HANDLE a0,\n                                               DWORD_PTR a1)\n    = SetProcessAffinityMask;\n\nBOOL (__stdcall * Real_SetProcessShutdownParameters)(DWORD a0,\n                                                     DWORD a1)\n    = SetProcessShutdownParameters;\n\nBOOL (__stdcall * Real_SetProcessWindowStation)(HWINSTA a0)\n    = SetProcessWindowStation;\n\nBOOL (__stdcall * Real_SetProcessWorkingSetSize)(HANDLE a0,\n                                                 SIZE_T a1,\n                                                 SIZE_T a2)\n    = SetProcessWorkingSetSize;\n\nBOOL (__stdcall * Real_SetPropA)(HWND a0,\n                                 LPCSTR a1,\n                                 HANDLE a2)\n    = SetPropA;\n\nBOOL (__stdcall * Real_SetPropW)(HWND a0,\n                                 LPCWSTR a1,\n                                 HANDLE a2)\n    = SetPropW;\n\nint (__stdcall * Real_SetROP2)(HDC a0,\n                               int a1)\n    = SetROP2;\n\nBOOL (__stdcall * Real_SetRect)(LPRECT a0,\n                                int a1,\n                                int a2,\n                                int a3,\n                                int a4)\n    = SetRect;\n\nBOOL (__stdcall * Real_SetRectEmpty)(LPRECT a0)\n    = SetRectEmpty;\n\nBOOL (__stdcall * Real_SetRectRgn)(HRGN a0,\n                                   int a1,\n                                   int a2,\n                                   int a3,\n                                   int a4)\n    = SetRectRgn;\n\nint (__stdcall * Real_SetScrollInfo)(HWND a0,\n                                     int a1,\n                                     LPCSCROLLINFO a2,\n                                     BOOL a3)\n    = SetScrollInfo;\n\nint (__stdcall * Real_SetScrollPos)(HWND a0,\n                                    int a1,\n                                    int a2,\n                                    BOOL a3)\n    = SetScrollPos;\n\nBOOL (__stdcall * Real_SetScrollRange)(HWND a0,\n                                       int a1,\n                                       int a2,\n                                       int a3,\n                                       BOOL a4)\n    = SetScrollRange;\n\nBOOL (__stdcall * Real_SetStdHandle)(DWORD a0,\n                                     HANDLE a1)\n    = SetStdHandle;\n\nint (__stdcall * Real_SetStretchBltMode)(HDC a0,\n                                         int a1)\n    = SetStretchBltMode;\n\nBOOL (__stdcall * Real_SetSysColors)(int a0,\n                                     CONST INT* a1,\n                                     CONST COLORREF* a2)\n    = SetSysColors;\n\nBOOL (__stdcall * Real_SetSystemCursor)(HCURSOR a0,\n                                        DWORD a1)\n    = SetSystemCursor;\n\nUINT (__stdcall * Real_SetSystemPaletteUse)(HDC a0,\n                                            UINT a1)\n    = SetSystemPaletteUse;\n\nBOOL (__stdcall * Real_SetSystemPowerState)(BOOL a0,\n                                            BOOL a1)\n    = SetSystemPowerState;\n\nBOOL (__stdcall * Real_SetSystemTime)(CONST SYSTEMTIME* a0)\n    = SetSystemTime;\n\nBOOL (__stdcall * Real_SetSystemTimeAdjustment)(DWORD a0,\n                                                BOOL a1)\n    = SetSystemTimeAdjustment;\n\nDWORD (__stdcall * Real_SetTapeParameters)(HANDLE a0,\n                                           DWORD a1,\n                                           LPVOID a2)\n    = SetTapeParameters;\n\nDWORD (__stdcall * Real_SetTapePosition)(HANDLE a0,\n                                         DWORD a1,\n                                         DWORD a2,\n                                         DWORD a3,\n                                         DWORD a4,\n                                         BOOL a5)\n    = SetTapePosition;\n\nUINT (__stdcall * Real_SetTextAlign)(HDC a0,\n                                     UINT a1)\n    = SetTextAlign;\n\nint (__stdcall * Real_SetTextCharacterExtra)(HDC a0,\n                                             int a1)\n    = SetTextCharacterExtra;\n\nCOLORREF (__stdcall * Real_SetTextColor)(HDC a0,\n                                         COLORREF a1)\n    = SetTextColor;\n\nBOOL (__stdcall * Real_SetTextJustification)(HDC a0,\n                                             int a1,\n                                             int a2)\n    = SetTextJustification;\n\nDWORD_PTR (__stdcall * Real_SetThreadAffinityMask)(HANDLE a0,\n                                               DWORD_PTR a1)\n    = SetThreadAffinityMask;\n\nBOOL (__stdcall * Real_SetThreadContext)(HANDLE a0,\n                                         CONST CONTEXT* a1)\n    = SetThreadContext;\n\nBOOL (__stdcall * Real_SetThreadDesktop)(HDESK a0)\n    = SetThreadDesktop;\n\nDWORD (__stdcall * Real_SetThreadIdealProcessor)(HANDLE a0,\n                                                 DWORD a1)\n    = SetThreadIdealProcessor;\n\n#if(WINVER >= 0x0500)\nBOOL (__stdcall * Real_SetThreadLocale)(LCID a0)\n    = SetThreadLocale;\n#endif // (WINVER >= 0x0500)\n\nBOOL (__stdcall * Real_SetThreadPriority)(HANDLE a0,\n                                          int a1)\n    = SetThreadPriority;\n\nBOOL (__stdcall * Real_SetThreadPriorityBoost)(HANDLE a0,\n                                               BOOL a1)\n    = SetThreadPriorityBoost;\n\nBOOL (__stdcall * Real_SetTimeZoneInformation)(CONST TIME_ZONE_INFORMATION* a0)\n    = SetTimeZoneInformation;\n\nUINT_PTR (__stdcall * Real_SetTimer)(HWND a0,\n                                     UINT_PTR a1,\n                                     UINT a2,\n                                     TIMERPROC a3)\n    = SetTimer;\n\nLPTOP_LEVEL_EXCEPTION_FILTER (__stdcall * Real_SetUnhandledExceptionFilter)(LPTOP_LEVEL_EXCEPTION_FILTER a0)\n    = SetUnhandledExceptionFilter;\n\nBOOL (__stdcall * Real_SetUserObjectInformationA)(HANDLE a0,\n                                                  int a1,\n                                                  PVOID a2,\n                                                  DWORD a3)\n    = SetUserObjectInformationA;\n\nBOOL (__stdcall * Real_SetUserObjectInformationW)(HANDLE a0,\n                                                  int a1,\n                                                  PVOID a2,\n                                                  DWORD a3)\n    = SetUserObjectInformationW;\n\nBOOL (__stdcall * Real_SetUserObjectSecurity)(HANDLE a0,\n                                              PSECURITY_INFORMATION a1,\n                                              PSECURITY_DESCRIPTOR a2)\n    = SetUserObjectSecurity;\n\nBOOL (__stdcall * Real_SetViewportExtEx)(HDC a0,\n                                         int a1,\n                                         int a2,\n                                         SIZE* a3)\n    = SetViewportExtEx;\n\nBOOL (__stdcall * Real_SetViewportOrgEx)(HDC a0,\n                                         int a1,\n                                         int a2,\n                                         POINT* a3)\n    = SetViewportOrgEx;\n\nBOOL (__stdcall * Real_SetVolumeLabelA)(LPCSTR a0,\n                                        LPCSTR a1)\n    = SetVolumeLabelA;\n\nBOOL (__stdcall * Real_SetVolumeLabelW)(LPCWSTR a0,\n                                        LPCWSTR a1)\n    = SetVolumeLabelW;\n\nBOOL (__stdcall * Real_SetWaitableTimer)(HANDLE a0,\n                                         CONST LARGE_INTEGER* a1,\n                                         LONG a2,\n                                         PTIMERAPCROUTINE a3,\n                                         LPVOID a4,\n                                         BOOL a5)\n    = SetWaitableTimer;\n\nHENHMETAFILE (__stdcall * Real_SetWinMetaFileBits)(UINT a0,\n                                                   CONST BYTE* a1,\n                                                   HDC a2,\n                                                   CONST METAFILEPICT* a3)\n    = SetWinMetaFileBits;\n\nBOOL (__stdcall * Real_SetWindowContextHelpId)(HWND a0,\n                                               DWORD a1)\n    = SetWindowContextHelpId;\n\nBOOL (__stdcall * Real_SetWindowExtEx)(HDC a0,\n                                       int a1,\n                                       int a2,\n                                       SIZE* a3)\n    = SetWindowExtEx;\n\nLONG (__stdcall * Real_SetWindowLongA)(HWND a0,\n                                       int a1,\n                                       LONG a2)\n    = SetWindowLongA;\n\nLONG (__stdcall * Real_SetWindowLongW)(HWND a0,\n                                       int a1,\n                                       LONG a2)\n    = SetWindowLongW;\n\nBOOL (__stdcall * Real_SetWindowOrgEx)(HDC a0,\n                                       int a1,\n                                       int a2,\n                                       POINT* a3)\n    = SetWindowOrgEx;\n\nBOOL (__stdcall * Real_SetWindowPlacement)(HWND a0,\n                                           CONST WINDOWPLACEMENT* a1)\n    = SetWindowPlacement;\n\nBOOL (__stdcall * Real_SetWindowPos)(HWND a0,\n                                     HWND a1,\n                                     int a2,\n                                     int a3,\n                                     int a4,\n                                     int a5,\n                                     UINT a6)\n    = SetWindowPos;\n\nint (__stdcall * Real_SetWindowRgn)(HWND a0,\n                                    HRGN a1,\n                                    BOOL a2)\n    = SetWindowRgn;\n\nBOOL (__stdcall * Real_SetWindowTextA)(HWND a0,\n                                       LPCSTR a1)\n    = SetWindowTextA;\n\nBOOL (__stdcall * Real_SetWindowTextW)(HWND a0,\n                                       LPCWSTR a1)\n    = SetWindowTextW;\n\nWORD (__stdcall * Real_SetWindowWord)(HWND a0,\n                                      int a1,\n                                      WORD a2)\n    = SetWindowWord;\n\nHHOOK (__stdcall * Real_SetWindowsHookA)(int a0,\n                                         HOOKPROC a1)\n    = SetWindowsHookA;\n\nHHOOK (__stdcall * Real_SetWindowsHookExA)(int a0,\n                                           HOOKPROC a1,\n                                           HINSTANCE a2,\n                                           DWORD a3)\n    = SetWindowsHookExA;\n\nHHOOK (__stdcall * Real_SetWindowsHookExW)(int a0,\n                                           HOOKPROC a1,\n                                           HINSTANCE a2,\n                                           DWORD a3)\n    = SetWindowsHookExW;\n\nHHOOK (__stdcall * Real_SetWindowsHookW)(int a0,\n                                         HOOKPROC a1)\n    = SetWindowsHookW;\n\nBOOL (__stdcall * Real_SetWorldTransform)(HDC a0,\n                                          CONST XFORM* a1)\n    = SetWorldTransform;\n\nBOOL (__stdcall * Real_SetupComm)(HANDLE a0,\n                                  DWORD a1,\n                                  DWORD a2)\n    = SetupComm;\n\nBOOL (__stdcall * Real_ShowCaret)(HWND a0)\n    = ShowCaret;\n\nint (__stdcall * Real_ShowCursor)(BOOL a0)\n    = ShowCursor;\n\nBOOL (__stdcall * Real_ShowOwnedPopups)(HWND a0,\n                                        BOOL a1)\n    = ShowOwnedPopups;\n\nBOOL (__stdcall * Real_ShowScrollBar)(HWND a0,\n                                      int a1,\n                                      BOOL a2)\n    = ShowScrollBar;\n\nBOOL (__stdcall * Real_ShowWindow)(HWND a0,\n                                   int a1)\n    = ShowWindow;\n\nBOOL (__stdcall * Real_ShowWindowAsync)(HWND a0,\n                                        int a1)\n    = ShowWindowAsync;\n\nDWORD (__stdcall * Real_SignalObjectAndWait)(HANDLE a0,\n                                             HANDLE a1,\n                                             DWORD a2,\n                                             BOOL a3)\n    = SignalObjectAndWait;\n\nDWORD (__stdcall * Real_SizeofResource)(HMODULE a0,\n                                        HRSRC a1)\n    = SizeofResource;\n\nDWORD (__stdcall * Real_SleepEx)(DWORD a0,\n                                 BOOL a1)\n    = SleepEx;\n\nint (__stdcall * Real_StartDocA)(HDC a0,\n                                 CONST DOCINFOA* a1)\n    = StartDocA;\n\nint (__stdcall * Real_StartDocW)(HDC a0,\n                                 CONST DOCINFOW* a1)\n    = StartDocW;\n\nint (__stdcall * Real_StartPage)(HDC a0)\n    = StartPage;\n\nHRESULT (__stdcall * Real_StgCreateDocfile)(CONST OLECHAR* a0,\n                                            DWORD a1,\n                                            DWORD a2,\n                                            IStorage** a3)\n    = StgCreateDocfile;\n\nHRESULT (__stdcall * Real_StgCreateDocfileOnILockBytes)(ILockBytes* a0,\n                                                        DWORD a1,\n                                                        DWORD a2,\n                                                        IStorage** a3)\n    = StgCreateDocfileOnILockBytes;\n\nHRESULT (__stdcall * Real_StgCreatePropSetStg)(IStorage* a0,\n                                               DWORD a1,\n                                               IPropertySetStorage** a2)\n    = StgCreatePropSetStg;\n\nHRESULT (__stdcall * Real_StgCreatePropStg)(IUnknown* a0,\n                                            CONST IID& a1,\n                                            CONST CLSID* a2,\n                                            DWORD a3,\n                                            DWORD a4,\n                                            IPropertyStorage** a5)\n    = StgCreatePropStg;\n\n#if _MSC_VER < 1300\nHRESULT (__stdcall * Real_StgCreateStorageEx)(CONST WCHAR* a0,\n                                              DWORD a1,\n                                              DWORD a2,\n                                              DWORD a3,\n                                              void* a4,\n                                              void* a5,\n                                              CONST IID& a6,\n                                              void** a7)\n    = StgCreateStorageEx;\n#else\nHRESULT (__stdcall * Real_StgCreateStorageEx)(CONST WCHAR* a0,\n                                              DWORD a1,\n                                              DWORD a2,\n                                              DWORD a3,\n                                              STGOPTIONS* a4,\n                                              void* a5,\n                                              CONST IID& a6,\n                                              void** a7)\n    = StgCreateStorageEx;\n#endif\n\nHRESULT (__stdcall * Real_StgGetIFillLockBytesOnFile)(CONST OLECHAR* a0,\n                                                      IFillLockBytes** a1)\n    = StgGetIFillLockBytesOnFile;\n\nHRESULT (__stdcall * Real_StgGetIFillLockBytesOnILockBytes)(ILockBytes* a0,\n                                                            IFillLockBytes** a1)\n    = StgGetIFillLockBytesOnILockBytes;\n\nHRESULT (__stdcall * Real_StgIsStorageFile)(CONST OLECHAR* a0)\n    = StgIsStorageFile;\n\nHRESULT (__stdcall * Real_StgIsStorageILockBytes)(ILockBytes* a0)\n    = StgIsStorageILockBytes;\n\nHRESULT (__stdcall * Real_StgOpenAsyncDocfileOnIFillLockBytes)(IFillLockBytes* a0,\n                                                               DWORD a1,\n                                                               DWORD a2,\n                                                               IStorage** a3)\n    = StgOpenAsyncDocfileOnIFillLockBytes;\n\nHRESULT (__stdcall * Real_StgOpenPropStg)(IUnknown* a0,\n                                          CONST IID& a1,\n                                          DWORD a2,\n                                          DWORD a3,\n                                          IPropertyStorage** a4)\n    = StgOpenPropStg;\n\nHRESULT (__stdcall * Real_StgOpenStorage)(CONST OLECHAR* a0,\n                                          IStorage* a1,\n                                          DWORD a2,\n                                          SNB a3,\n                                          DWORD a4,\n                                          IStorage** a5)\n    = StgOpenStorage;\n\n#if _MSC_VER < 1300\nHRESULT (__stdcall * Real_StgOpenStorageEx)(CONST WCHAR* a0,\n                                            DWORD a1,\n                                            DWORD a2,\n                                            DWORD a3,\n                                            void* a4,\n                                            void* a5,\n                                            CONST IID& a6,\n                                            void** a7)\n    = StgOpenStorageEx;\n#else\nHRESULT (__stdcall * Real_StgOpenStorageEx)(CONST WCHAR* a0,\n                                            DWORD a1,\n                                            DWORD a2,\n                                            DWORD a3,\n                                            STGOPTIONS* a4,\n                                            void* a5,\n                                            CONST IID& a6,\n                                            void** a7)\n    = StgOpenStorageEx;\n#endif\n\nHRESULT (__stdcall * Real_StgOpenStorageOnILockBytes)(ILockBytes* a0,\n                                                      IStorage* a1,\n                                                      DWORD a2,\n                                                      SNB a3,\n                                                      DWORD a4,\n                                                      IStorage** a5)\n    = StgOpenStorageOnILockBytes;\n\nHRESULT (__stdcall * Real_StgSetTimes)(CONST OLECHAR* a0,\n                                       CONST FILETIME* a1,\n                                       CONST FILETIME* a2,\n                                       CONST FILETIME* a3)\n    = StgSetTimes;\n\nBOOL (__stdcall * Real_StretchBlt)(HDC a0,\n                                   int a1,\n                                   int a2,\n                                   int a3,\n                                   int a4,\n                                   HDC a5,\n                                   int a6,\n                                   int a7,\n                                   int a8,\n                                   int a9,\n                                   DWORD a10)\n    = StretchBlt;\n\nint (__stdcall * Real_StretchDIBits)(HDC a0,\n                                     int a1,\n                                     int a2,\n                                     int a3,\n                                     int a4,\n                                     int a5,\n                                     int a6,\n                                     int a7,\n                                     int a8,\n                                     CONST void* a9,\n                                     CONST BITMAPINFO* a10,\n                                     UINT a11,\n                                     DWORD a12)\n    = StretchDIBits;\n\nHRESULT (__stdcall * Real_StringFromCLSID)(CONST IID& a0,\n                                           LPOLESTR* a1)\n    = StringFromCLSID;\n\nint (__stdcall * Real_StringFromGUID2)(CONST GUID& a0,\n                                       LPOLESTR a1,\n                                       int a2)\n    = StringFromGUID2;\n\nHRESULT (__stdcall * Real_StringFromIID)(CONST IID& a0,\n                                         LPOLESTR* a1)\n    = StringFromIID;\n\nBOOL (__stdcall * Real_StrokeAndFillPath)(HDC a0)\n    = StrokeAndFillPath;\n\nBOOL (__stdcall * Real_StrokePath)(HDC a0)\n    = StrokePath;\n\nBOOL (__stdcall * Real_SubtractRect)(LPRECT a0,\n                                     CONST RECT* a1,\n                                     CONST RECT* a2)\n    = SubtractRect;\n\nDWORD (__stdcall * Real_SuspendThread)(HANDLE a0)\n    = SuspendThread;\n\nBOOL (__stdcall * Real_SwapBuffers)(HDC a0)\n    = SwapBuffers;\n\nBOOL (__stdcall * Real_SwapMouseButton)(BOOL a0)\n    = SwapMouseButton;\n\nBOOL (__stdcall * Real_SwitchDesktop)(HDESK a0)\n    = SwitchDesktop;\n\nvoid (__stdcall * Real_SwitchToFiber)(LPVOID a0)\n    = SwitchToFiber;\n\nBOOL (__stdcall * Real_SwitchToThread)(void)\n    = SwitchToThread;\n\nBOOL (__stdcall * Real_SystemParametersInfoA)(UINT a0,\n                                              UINT a1,\n                                              PVOID a2,\n                                              UINT a3)\n    = SystemParametersInfoA;\n\nBOOL (__stdcall * Real_SystemParametersInfoW)(UINT a0,\n                                              UINT a1,\n                                              PVOID a2,\n                                              UINT a3)\n    = SystemParametersInfoW;\n\nBOOL (__stdcall * Real_SystemTimeToFileTime)(CONST SYSTEMTIME* a0,\n                                             LPFILETIME a1)\n    = SystemTimeToFileTime;\n\nBOOL (__stdcall * Real_SystemTimeToTzSpecificLocalTime)(\n#ifdef PIPE_ACCEPT_REMOTE_CLIENTS\n                                                        const TIME_ZONE_INFORMATION *a0,\n                                                        const SYSTEMTIME *a1,\n#else\n                                                        LPTIME_ZONE_INFORMATION a0,\n                                                        LPSYSTEMTIME a1,\n#endif\n                                                        LPSYSTEMTIME a2\n                                                       )\n    = SystemTimeToTzSpecificLocalTime;\n\n#if _MSC_VER < 1300\nLONG (__stdcall * Real_TabbedTextOutA)(HDC a0,\n                                       int a1,\n                                       int a2,\n                                       LPCSTR a3,\n                                       int a4,\n                                       int a5,\n                                       INT* a6,\n                                       int a7)\n    = TabbedTextOutA;\n#else\nLONG (__stdcall * Real_TabbedTextOutA)(HDC a0,\n                                       int a1,\n                                       int a2,\n                                       LPCSTR a3,\n                                       int a4,\n                                       int a5,\n                                       CONST INT* a6,\n                                       int a7)\n    = TabbedTextOutA;\n#endif\n\n#if _MSC_VER < 1300\nLONG (__stdcall * Real_TabbedTextOutW)(HDC a0,\n                                       int a1,\n                                       int a2,\n                                       LPCWSTR a3,\n                                       int a4,\n                                       int a5,\n                                       INT* a6,\n                                       int a7)\n    = TabbedTextOutW;\n#else\nLONG (__stdcall * Real_TabbedTextOutW)(HDC a0,\n                                       int a1,\n                                       int a2,\n                                       LPCWSTR a3,\n                                       int a4,\n                                       int a5,\n                                       CONST INT* a6,\n                                       int a7)\n    = TabbedTextOutW;\n#endif\n\nBOOL (__stdcall * Real_TerminateProcess)(HANDLE a0,\n                                         UINT a1)\n    = TerminateProcess;\n\nBOOL (__stdcall * Real_TerminateThread)(HANDLE a0,\n                                        DWORD a1)\n    = TerminateThread;\n\nBOOL (__stdcall * Real_TextOutA)(HDC a0,\n                                 int a1,\n                                 int a2,\n                                 LPCSTR a3,\n                                 int a4)\n    = TextOutA;\n\nBOOL (__stdcall * Real_TextOutW)(HDC a0,\n                                 int a1,\n                                 int a2,\n                                 LPCWSTR a3,\n                                 int a4)\n    = TextOutW;\n\nWORD (__stdcall * Real_TileWindows)(HWND a0,\n                                    UINT a1,\n                                    CONST RECT* a2,\n                                    UINT a3,\n                                    CONST HWND * a4)\n    = TileWindows;\n\n#if _MSC_VER < 1300\nint (__stdcall * Real_ToAscii)(UINT a0,\n                               UINT a1,\n                               BYTE* a2,\n                               LPWORD a3,\n                               UINT a4)\n    = ToAscii;\n#else\nint (__stdcall * Real_ToAscii)(UINT a0,\n                               UINT a1,\n                               CONST BYTE* a2,\n                               LPWORD a3,\n                               UINT a4)\n    = ToAscii;\n#endif\n\n#if _MSC_VER < 1300\nint (__stdcall * Real_ToAsciiEx)(UINT a0,\n                                 UINT a1,\n                                 BYTE* a2,\n                                 LPWORD a3,\n                                 UINT a4,\n                                 HKL a5)\n    = ToAsciiEx;\n#else\nint (__stdcall * Real_ToAsciiEx)(UINT a0,\n                                 UINT a1,\n                                 CONST BYTE* a2,\n                                 LPWORD a3,\n                                 UINT a4,\n                                 HKL a5)\n    = ToAsciiEx;\n#endif\n\n#if _MSC_VER < 1300\nint (__stdcall * Real_ToUnicode)(UINT a0,\n                                 UINT a1,\n                                 BYTE* a2,\n                                 LPWSTR a3,\n                                 int a4,\n                                 UINT a5)\n    = ToUnicode;\n#else\nint (__stdcall * Real_ToUnicode)(UINT a0,\n                                 UINT a1,\n                                 CONST BYTE* a2,\n                                 LPWSTR a3,\n                                 int a4,\n                                 UINT a5)\n    = ToUnicode;\n#endif\n\n#if _MSC_VER < 1300\nint (__stdcall * Real_ToUnicodeEx)(UINT a0,\n                                   UINT a1,\n                                   BYTE* a2,\n                                   LPWSTR a3,\n                                   int a4,\n                                   UINT a5,\n                                   HKL a6)\n    = ToUnicodeEx;\n#else\nint (__stdcall * Real_ToUnicodeEx)(UINT a0,\n                                   UINT a1,\n                                   CONST BYTE* a2,\n                                   LPWSTR a3,\n                                   int a4,\n                                   UINT a5,\n                                   HKL a6)\n    = ToUnicodeEx;\n#endif\n\nBOOL (__stdcall * Real_TrackMouseEvent)(TRACKMOUSEEVENT* a0)\n    = TrackMouseEvent;\n\nBOOL (__stdcall * Real_TrackPopupMenu)(HMENU a0,\n                                       UINT a1,\n                                       int a2,\n                                       int a3,\n                                       int a4,\n                                       HWND a5,\n                                       CONST RECT* a6)\n    = TrackPopupMenu;\n\nBOOL (__stdcall * Real_TrackPopupMenuEx)(HMENU a0,\n                                         UINT a1,\n                                         int a2,\n                                         int a3,\n                                         HWND a4,\n                                         LPTPMPARAMS a5)\n    = TrackPopupMenuEx;\n\nBOOL (__stdcall * Real_TransactNamedPipe)(HANDLE a0,\n                                          LPVOID a1,\n                                          DWORD a2,\n                                          LPVOID a3,\n                                          DWORD a4,\n                                          LPDWORD a5,\n                                          LPOVERLAPPED a6)\n    = TransactNamedPipe;\n\nint (__stdcall * Real_TranslateAcceleratorA)(HWND a0,\n                                             HACCEL a1,\n                                             LPMSG a2)\n    = TranslateAcceleratorA;\n\nint (__stdcall * Real_TranslateAcceleratorW)(HWND a0,\n                                             HACCEL a1,\n                                             LPMSG a2)\n    = TranslateAcceleratorW;\n\nBOOL (__stdcall * Real_TranslateCharsetInfo)(DWORD* a0,\n                                             CHARSETINFO* a1,\n                                             DWORD a2)\n    = TranslateCharsetInfo;\n\nBOOL (__stdcall * Real_TranslateMDISysAccel)(HWND a0,\n                                             LPMSG a1)\n    = TranslateMDISysAccel;\n\nBOOL (__stdcall * Real_TranslateMessage)(CONST MSG* a0)\n    = TranslateMessage;\n\nBOOL (__stdcall * Real_TransmitCommChar)(HANDLE a0,\n                                         char a1)\n    = TransmitCommChar;\n\n#if DETOUR_TryEnterCriticalSection_EVEN_IF_IT_EXERCISES_A_BUG_IN_RtlLookupFunctionTable\nBOOL (__stdcall * Real_TryEnterCriticalSection)(LPCRITICAL_SECTION a0)\n    = TryEnterCriticalSection;\n#endif\n\nBOOL (__stdcall * Real_UnhookWindowsHook)(int a0,\n                                          HOOKPROC a1)\n    = UnhookWindowsHook;\n\nBOOL (__stdcall * Real_UnhookWindowsHookEx)(HHOOK a0)\n    = UnhookWindowsHookEx;\n\nBOOL (__stdcall * Real_UnionRect)(LPRECT a0,\n                                  CONST RECT* a1,\n                                  CONST RECT* a2)\n    = UnionRect;\n\nBOOL (__stdcall * Real_UnloadKeyboardLayout)(HKL a0)\n    = UnloadKeyboardLayout;\n\nBOOL (__stdcall * Real_UnlockFile)(HANDLE a0,\n                                   DWORD a1,\n                                   DWORD a2,\n                                   DWORD a3,\n                                   DWORD a4)\n    = UnlockFile;\n\nBOOL (__stdcall * Real_UnlockFileEx)(HANDLE a0,\n                                     DWORD a1,\n                                     DWORD a2,\n                                     DWORD a3,\n                                     LPOVERLAPPED a4)\n    = UnlockFileEx;\n\nBOOL (__stdcall * Real_UnmapViewOfFile)(LPCVOID a0)\n    = UnmapViewOfFile;\n\nBOOL (__stdcall * Real_UnpackDDElParam)(UINT a0,\n                                        LPARAM a1,\n                                        PUINT_PTR a2,\n                                        PUINT_PTR a3)\n    = UnpackDDElParam;\n\nBOOL (__stdcall * Real_UnrealizeObject)(HGDIOBJ a0)\n    = UnrealizeObject;\n\nBOOL (__stdcall * Real_UnregisterClassA)(LPCSTR a0,\n                                         HINSTANCE a1)\n    = UnregisterClassA;\n\nBOOL (__stdcall * Real_UnregisterClassW)(LPCWSTR a0,\n                                         HINSTANCE a1)\n    = UnregisterClassW;\n\nBOOL (__stdcall * Real_UnregisterHotKey)(HWND a0,\n                                         int a1)\n    = UnregisterHotKey;\n\nBOOL (__stdcall * Real_UpdateColors)(HDC a0)\n    = UpdateColors;\n\nBOOL (__stdcall * Real_UpdateResourceA)(HANDLE a0,\n                                        LPCSTR a1,\n                                        LPCSTR a2,\n                                        WORD a3,\n                                        LPVOID a4,\n                                        DWORD a5)\n    = UpdateResourceA;\n\nBOOL (__stdcall * Real_UpdateResourceW)(HANDLE a0,\n                                        LPCWSTR a1,\n                                        LPCWSTR a2,\n                                        WORD a3,\n                                        LPVOID a4,\n                                        DWORD a5)\n    = UpdateResourceW;\n\nBOOL (__stdcall * Real_UpdateWindow)(HWND a0)\n    = UpdateWindow;\n\nBOOL (__stdcall * Real_ValidateRect)(HWND a0,\n                                     CONST RECT* a1)\n    = ValidateRect;\n\nBOOL (__stdcall * Real_ValidateRgn)(HWND a0,\n                                    HRGN a1)\n    = ValidateRgn;\n\nDWORD (__stdcall * Real_VerLanguageNameA)(DWORD a0,\n                                          LPSTR a1,\n                                          DWORD a2)\n    = VerLanguageNameA;\n\nDWORD (__stdcall * Real_VerLanguageNameW)(DWORD a0,\n                                          LPWSTR a1,\n                                          DWORD a2)\n    = VerLanguageNameW;\n\nLPVOID (__stdcall * Real_VirtualAllocEx)(HANDLE a0,\n                                         LPVOID a1,\n                                         SIZE_T a2,\n                                         DWORD a3,\n                                         DWORD a4)\n    = VirtualAllocEx;\n\nBOOL (__stdcall * Real_VirtualFreeEx)(HANDLE a0,\n                                      LPVOID a1,\n                                      SIZE_T a2,\n                                      DWORD a3)\n    = VirtualFreeEx;\n\nBOOL (__stdcall * Real_VirtualProtectEx)(HANDLE a0,\n                                         LPVOID a1,\n                                         SIZE_T a2,\n                                         DWORD a3,\n                                         PDWORD a4)\n    = VirtualProtectEx;\n\nDWORD_PTR (__stdcall * Real_VirtualQueryEx)(HANDLE a0,\n                                        LPCVOID a1,\n                                        PMEMORY_BASIC_INFORMATION a2,\n                                        DWORD_PTR a3)\n    = VirtualQueryEx;\n\nSHORT (__stdcall * Real_VkKeyScanA)(CHAR a0)\n    = VkKeyScanA;\n\nSHORT (__stdcall * Real_VkKeyScanExA)(CHAR a0,\n                                      HKL a1)\n    = VkKeyScanExA;\n\nSHORT (__stdcall * Real_VkKeyScanExW)(WCHAR a0,\n                                      HKL a1)\n    = VkKeyScanExW;\n\nSHORT (__stdcall * Real_VkKeyScanW)(WCHAR a0)\n    = VkKeyScanW;\n\nSOCKET (__stdcall * Real_WSAAccept)(SOCKET a0,\n                                    sockaddr* a1,\n                                    LPINT a2,\n                                    LPCONDITIONPROC a3,\n                                    DWORD_PTR a4)\n    = WSAAccept;\n\nINT (__stdcall * Real_WSAAddressToStringA)(LPSOCKADDR a0,\n                                           DWORD a1,\n                                           LPWSAPROTOCOL_INFOA a2,\n                                           LPSTR a3,\n                                           LPDWORD a4)\n    = WSAAddressToStringA;\n\nINT (__stdcall * Real_WSAAddressToStringW)(LPSOCKADDR a0,\n                                           DWORD a1,\n                                           LPWSAPROTOCOL_INFOW a2,\n                                           LPWSTR a3,\n                                           LPDWORD a4)\n    = WSAAddressToStringW;\n\nHANDLE (__stdcall * Real_WSAAsyncGetHostByAddr)(HWND a0,\n                                                u_int a1,\n                                                CONST char* a2,\n                                                int a3,\n                                                int a4,\n                                                char* a5,\n                                                int a6)\n    = WSAAsyncGetHostByAddr;\n\nHANDLE (__stdcall * Real_WSAAsyncGetHostByName)(HWND a0,\n                                                u_int a1,\n                                                CONST char* a2,\n                                                char* a3,\n                                                int a4)\n    = WSAAsyncGetHostByName;\n\nHANDLE (__stdcall * Real_WSAAsyncGetProtoByName)(HWND a0,\n                                                 u_int a1,\n                                                 CONST char* a2,\n                                                 char* a3,\n                                                 int a4)\n    = WSAAsyncGetProtoByName;\n\nHANDLE (__stdcall * Real_WSAAsyncGetProtoByNumber)(HWND a0,\n                                                   u_int a1,\n                                                   int a2,\n                                                   char* a3,\n                                                   int a4)\n    = WSAAsyncGetProtoByNumber;\n\nHANDLE (__stdcall * Real_WSAAsyncGetServByName)(HWND a0,\n                                                u_int a1,\n                                                CONST char* a2,\n                                                CONST char* a3,\n                                                char* a4,\n                                                int a5)\n    = WSAAsyncGetServByName;\n\nHANDLE (__stdcall * Real_WSAAsyncGetServByPort)(HWND a0,\n                                                u_int a1,\n                                                int a2,\n                                                CONST char* a3,\n                                                char* a4,\n                                                int a5)\n    = WSAAsyncGetServByPort;\n\nint (__stdcall * Real_WSAAsyncSelect)(SOCKET a0,\n                                      HWND a1,\n                                      u_int a2,\n                                      long a3)\n    = WSAAsyncSelect;\n\nint (__stdcall * Real_WSACancelAsyncRequest)(HANDLE a0)\n    = WSACancelAsyncRequest;\n\nint (__stdcall * Real_WSACancelBlockingCall)(void)\n    = WSACancelBlockingCall;\n\nint (__stdcall * Real_WSACleanup)(void)\n    = WSACleanup;\n\nBOOL (__stdcall * Real_WSACloseEvent)(HANDLE a0)\n    = WSACloseEvent;\n\nint (__stdcall * Real_WSAConnect)(SOCKET a0,\n                                  CONST sockaddr* a1,\n                                  int a2,\n                                  LPWSABUF a3,\n                                  LPWSABUF a4,\n                                  LPQOS a5,\n                                  LPQOS a6)\n    = WSAConnect;\n\nHANDLE (__stdcall * Real_WSACreateEvent)(void)\n    = WSACreateEvent;\n\nint (__stdcall * Real_WSADuplicateSocketA)(SOCKET a0,\n                                           DWORD a1,\n                                           LPWSAPROTOCOL_INFOA a2)\n    = WSADuplicateSocketA;\n\nint (__stdcall * Real_WSADuplicateSocketW)(SOCKET a0,\n                                           DWORD a1,\n                                           LPWSAPROTOCOL_INFOW a2)\n    = WSADuplicateSocketW;\n\nINT (__stdcall * Real_WSAEnumNameSpaceProvidersA)(LPDWORD a0,\n                                                  LPWSANAMESPACE_INFOA a1)\n    = WSAEnumNameSpaceProvidersA;\n\nINT (__stdcall * Real_WSAEnumNameSpaceProvidersW)(LPDWORD a0,\n                                                  LPWSANAMESPACE_INFOW a1)\n    = WSAEnumNameSpaceProvidersW;\n\nint (__stdcall * Real_WSAEnumNetworkEvents)(SOCKET a0,\n                                            HANDLE a1,\n                                            LPWSANETWORKEVENTS a2)\n    = WSAEnumNetworkEvents;\n\nint (__stdcall * Real_WSAEnumProtocolsA)(LPINT a0,\n                                         LPWSAPROTOCOL_INFOA a1,\n                                         LPDWORD a2)\n    = WSAEnumProtocolsA;\n\nint (__stdcall * Real_WSAEnumProtocolsW)(LPINT a0,\n                                         LPWSAPROTOCOL_INFOW a1,\n                                         LPDWORD a2)\n    = WSAEnumProtocolsW;\n\nint (__stdcall * Real_WSAEventSelect)(SOCKET a0,\n                                      HANDLE a1,\n                                      long a2)\n    = WSAEventSelect;\n\nBOOL (__stdcall * Real_WSAGetOverlappedResult)(SOCKET a0,\n                                               LPWSAOVERLAPPED a1,\n                                               LPDWORD a2,\n                                               BOOL a3,\n                                               LPDWORD a4)\n    = WSAGetOverlappedResult;\n\nBOOL (__stdcall * Real_WSAGetQOSByName)(SOCKET a0,\n                                        LPWSABUF a1,\n                                        LPQOS a2)\n    = WSAGetQOSByName;\n\nINT (__stdcall * Real_WSAGetServiceClassInfoA)(LPGUID a0,\n                                               LPGUID a1,\n                                               LPDWORD a2,\n                                               LPWSASERVICECLASSINFOA a3)\n    = WSAGetServiceClassInfoA;\n\nINT (__stdcall * Real_WSAGetServiceClassInfoW)(LPGUID a0,\n                                               LPGUID a1,\n                                               LPDWORD a2,\n                                               LPWSASERVICECLASSINFOW a3)\n    = WSAGetServiceClassInfoW;\n\nINT (__stdcall * Real_WSAGetServiceClassNameByClassIdA)(LPGUID a0,\n                                                        LPSTR a1,\n                                                        LPDWORD a2)\n    = WSAGetServiceClassNameByClassIdA;\n\nINT (__stdcall * Real_WSAGetServiceClassNameByClassIdW)(LPGUID a0,\n                                                        LPWSTR a1,\n                                                        LPDWORD a2)\n    = WSAGetServiceClassNameByClassIdW;\n\nint (__stdcall * Real_WSAHtonl)(SOCKET a0,\n                                u_long a1,\n                                u_long* a2)\n    = WSAHtonl;\n\nint (__stdcall * Real_WSAHtons)(SOCKET a0,\n                                u_short a1,\n                                u_short* a2)\n    = WSAHtons;\n\nINT (__stdcall * Real_WSAInstallServiceClassA)(LPWSASERVICECLASSINFOA a0)\n    = WSAInstallServiceClassA;\n\nINT (__stdcall * Real_WSAInstallServiceClassW)(LPWSASERVICECLASSINFOW a0)\n    = WSAInstallServiceClassW;\n\nint (__stdcall * Real_WSAIoctl)(SOCKET a0,\n                                DWORD a1,\n                                LPVOID a2,\n                                DWORD a3,\n                                LPVOID a4,\n                                DWORD a5,\n                                LPDWORD a6,\n                                LPWSAOVERLAPPED a7,\n                                LPWSAOVERLAPPED_COMPLETION_ROUTINE a8)\n    = WSAIoctl;\n\nBOOL (__stdcall * Real_WSAIsBlocking)(void)\n    = WSAIsBlocking;\n\nSOCKET (__stdcall * Real_WSAJoinLeaf)(SOCKET a0,\n                                      CONST sockaddr* a1,\n                                      int a2,\n                                      LPWSABUF a3,\n                                      LPWSABUF a4,\n                                      LPQOS a5,\n                                      LPQOS a6,\n                                      DWORD a7)\n    = WSAJoinLeaf;\n\nINT (__stdcall * Real_WSALookupServiceBeginA)(LPWSAQUERYSETA a0,\n                                              DWORD a1,\n                                              LPHANDLE a2)\n    = WSALookupServiceBeginA;\n\nINT (__stdcall * Real_WSALookupServiceBeginW)(LPWSAQUERYSETW a0,\n                                              DWORD a1,\n                                              LPHANDLE a2)\n    = WSALookupServiceBeginW;\n\nINT (__stdcall * Real_WSALookupServiceEnd)(HANDLE a0)\n    = WSALookupServiceEnd;\n\nINT (__stdcall * Real_WSALookupServiceNextA)(HANDLE a0,\n                                             DWORD a1,\n                                             LPDWORD a2,\n                                             LPWSAQUERYSETA a3)\n    = WSALookupServiceNextA;\n\nINT (__stdcall * Real_WSALookupServiceNextW)(HANDLE a0,\n                                             DWORD a1,\n                                             LPDWORD a2,\n                                             LPWSAQUERYSETW a3)\n    = WSALookupServiceNextW;\n\nint (__stdcall * Real_WSANtohl)(SOCKET a0,\n                                u_long a1,\n                                u_long* a2)\n    = WSANtohl;\n\nint (__stdcall * Real_WSANtohs)(SOCKET a0,\n                                u_short a1,\n                                u_short* a2)\n    = WSANtohs;\n\nINT (__stdcall * Real_WSAProviderConfigChange)(LPHANDLE a0,\n                                               LPWSAOVERLAPPED a1,\n                                               LPWSAOVERLAPPED_COMPLETION_ROUTINE a2)\n    = WSAProviderConfigChange;\n\nint (__stdcall * Real_WSARecv)(SOCKET a0,\n                               LPWSABUF a1,\n                               DWORD a2,\n                               LPDWORD a3,\n                               LPDWORD a4,\n                               LPWSAOVERLAPPED a5,\n                               LPWSAOVERLAPPED_COMPLETION_ROUTINE a6)\n    = WSARecv;\n\nint (__stdcall * Real_WSARecvDisconnect)(SOCKET a0,\n                                         LPWSABUF a1)\n    = WSARecvDisconnect;\n\nint (__stdcall * Real_WSARecvFrom)(SOCKET a0,\n                                   LPWSABUF a1,\n                                   DWORD a2,\n                                   LPDWORD a3,\n                                   LPDWORD a4,\n                                   sockaddr* a5,\n                                   LPINT a6,\n                                   LPWSAOVERLAPPED a7,\n                                   LPWSAOVERLAPPED_COMPLETION_ROUTINE a8)\n    = WSARecvFrom;\n\nINT (__stdcall * Real_WSARemoveServiceClass)(LPGUID a0)\n    = WSARemoveServiceClass;\n\nBOOL (__stdcall * Real_WSAResetEvent)(HANDLE a0)\n    = WSAResetEvent;\n\nint (__stdcall * Real_WSASend)(SOCKET a0,\n                               LPWSABUF a1,\n                               DWORD a2,\n                               LPDWORD a3,\n                               DWORD a4,\n                               LPWSAOVERLAPPED a5,\n                               LPWSAOVERLAPPED_COMPLETION_ROUTINE a6)\n    = WSASend;\n\nint (__stdcall * Real_WSASendDisconnect)(SOCKET a0,\n                                         LPWSABUF a1)\n    = WSASendDisconnect;\n\nint (__stdcall * Real_WSASendTo)(SOCKET a0,\n                                 LPWSABUF a1,\n                                 DWORD a2,\n                                 LPDWORD a3,\n                                 DWORD a4,\n                                 CONST sockaddr* a5,\n                                 int a6,\n                                 LPWSAOVERLAPPED a7,\n                                 LPWSAOVERLAPPED_COMPLETION_ROUTINE a8)\n    = WSASendTo;\n\nFARPROC (__stdcall * Real_WSASetBlockingHook)(FARPROC a0)\n    = WSASetBlockingHook;\n\nBOOL (__stdcall * Real_WSASetEvent)(HANDLE a0)\n    = WSASetEvent;\n\nINT (__stdcall * Real_WSASetServiceA)(LPWSAQUERYSETA a0,\n                                      WSAESETSERVICEOP a1,\n                                      DWORD a2)\n    = WSASetServiceA;\n\nINT (__stdcall * Real_WSASetServiceW)(LPWSAQUERYSETW a0,\n                                      WSAESETSERVICEOP a1,\n                                      DWORD a2)\n    = WSASetServiceW;\n\nSOCKET (__stdcall * Real_WSASocketA)(int a0,\n                                     int a1,\n                                     int a2,\n                                     LPWSAPROTOCOL_INFOA a3,\n                                     GROUP a4,\n                                     DWORD a5)\n    = WSASocketA;\n\nSOCKET (__stdcall * Real_WSASocketW)(int a0,\n                                     int a1,\n                                     int a2,\n                                     LPWSAPROTOCOL_INFOW a3,\n                                     GROUP a4,\n                                     DWORD a5)\n    = WSASocketW;\n\nint (__stdcall * Real_WSAStartup)(WORD a0,\n                                  LPWSADATA a1)\n    = WSAStartup;\n\nINT (__stdcall * Real_WSAStringToAddressA)(LPSTR a0,\n                                           INT a1,\n                                           LPWSAPROTOCOL_INFOA a2,\n                                           LPSOCKADDR a3,\n                                           LPINT a4)\n    = WSAStringToAddressA;\n\nINT (__stdcall * Real_WSAStringToAddressW)(LPWSTR a0,\n                                           INT a1,\n                                           LPWSAPROTOCOL_INFOW a2,\n                                           LPSOCKADDR a3,\n                                           LPINT a4)\n    = WSAStringToAddressW;\n\nint (__stdcall * Real_WSAUnhookBlockingHook)(void)\n    = WSAUnhookBlockingHook;\n\nDWORD (__stdcall * Real_WSAWaitForMultipleEvents)(DWORD a0,\n                                                  CONST HANDLE * a1,\n                                                  BOOL a2,\n                                                  DWORD a3,\n                                                  BOOL a4)\n    = WSAWaitForMultipleEvents;\n\nBOOL (__stdcall * Real_WaitCommEvent)(HANDLE a0,\n                                      LPDWORD a1,\n                                      LPOVERLAPPED a2)\n    = WaitCommEvent;\n\n#if !defined(DETOURS_ARM)\nBOOL (__stdcall * Real_WaitForDebugEvent)(LPDEBUG_EVENT a0,\n                                          DWORD a1)\n    = WaitForDebugEvent;\n#endif // !DETOUR_ARM\n\nDWORD (__stdcall * Real_WaitForInputIdle)(HANDLE a0,\n                                          DWORD a1)\n    = WaitForInputIdle;\n\nDWORD (__stdcall * Real_WaitForMultipleObjects)(DWORD a0,\n                                                CONST HANDLE * a1,\n                                                BOOL a2,\n                                                DWORD a3)\n    = WaitForMultipleObjects;\n\nDWORD (__stdcall * Real_WaitForMultipleObjectsEx)(DWORD a0,\n                                                  CONST HANDLE * a1,\n                                                  BOOL a2,\n                                                  DWORD a3,\n                                                  BOOL a4)\n    = WaitForMultipleObjectsEx;\n\nDWORD (__stdcall * Real_WaitForSingleObject)(HANDLE a0,\n                                             DWORD a1)\n    = WaitForSingleObject;\n\nDWORD (__stdcall * Real_WaitForSingleObjectEx)(HANDLE a0,\n                                               DWORD a1,\n                                               BOOL a2)\n    = WaitForSingleObjectEx;\n\nBOOL (__stdcall * Real_WaitMessage)(void)\n    = WaitMessage;\n\nBOOL (__stdcall * Real_WaitNamedPipeA)(LPCSTR a0,\n                                       DWORD a1)\n    = WaitNamedPipeA;\n\nBOOL (__stdcall * Real_WaitNamedPipeW)(LPCWSTR a0,\n                                       DWORD a1)\n    = WaitNamedPipeW;\n\nBOOL (__stdcall * Real_WidenPath)(HDC a0)\n    = WidenPath;\n\nUINT (__stdcall * Real_WinExec)(LPCSTR a0,\n                                UINT a1)\n    = WinExec;\n\nBOOL (__stdcall * Real_WinHelpA)(HWND a0,\n                                 LPCSTR a1,\n                                 UINT a2,\n                                 ULONG_PTR a3)\n    = WinHelpA;\n\nBOOL (__stdcall * Real_WinHelpW)(HWND a0,\n                                 LPCWSTR a1,\n                                 UINT a2,\n                                 ULONG_PTR a3)\n    = WinHelpW;\n\nHWND (__stdcall * Real_WindowFromDC)(HDC a0)\n    = WindowFromDC;\n\nHWND (__stdcall * Real_WindowFromPoint)(POINT a0)\n    = WindowFromPoint;\n\nHRESULT (__stdcall * Real_WriteClassStg)(LPSTORAGE a0,\n                                         CONST IID& a1)\n    = WriteClassStg;\n\nHRESULT (__stdcall * Real_WriteClassStm)(LPSTREAM a0,\n                                         CONST IID& a1)\n    = WriteClassStm;\n\nBOOL (__stdcall * Real_WriteConsoleA)(HANDLE a0,\n                                      CONST void* a1,\n                                      DWORD a2,\n                                      LPDWORD a3,\n                                      LPVOID a4)\n    = WriteConsoleA;\n\nBOOL (__stdcall * Real_WriteConsoleInputA)(HANDLE a0,\n                                           CONST INPUT_RECORD* a1,\n                                           DWORD a2,\n                                           LPDWORD a3)\n    = WriteConsoleInputA;\n\nBOOL (__stdcall * Real_WriteConsoleInputW)(HANDLE a0,\n                                           CONST INPUT_RECORD* a1,\n                                           DWORD a2,\n                                           LPDWORD a3)\n    = WriteConsoleInputW;\n\nBOOL (__stdcall * Real_WriteConsoleOutputA)(HANDLE a0,\n                                            CONST CHAR_INFO* a1,\n                                            COORD a2,\n                                            COORD a3,\n                                            PSMALL_RECT a4)\n    = WriteConsoleOutputA;\n\nBOOL (__stdcall * Real_WriteConsoleOutputAttribute)(HANDLE a0,\n                                                    CONST WORD* a1,\n                                                    DWORD a2,\n                                                    COORD a3,\n                                                    LPDWORD a4)\n    = WriteConsoleOutputAttribute;\n\nBOOL (__stdcall * Real_WriteConsoleOutputCharacterA)(HANDLE a0,\n                                                     LPCSTR a1,\n                                                     DWORD a2,\n                                                     COORD a3,\n                                                     LPDWORD a4)\n    = WriteConsoleOutputCharacterA;\n\nBOOL (__stdcall * Real_WriteConsoleOutputCharacterW)(HANDLE a0,\n                                                     LPCWSTR a1,\n                                                     DWORD a2,\n                                                     COORD a3,\n                                                     LPDWORD a4)\n    = WriteConsoleOutputCharacterW;\n\nBOOL (__stdcall * Real_WriteConsoleOutputW)(HANDLE a0,\n                                            CONST CHAR_INFO* a1,\n                                            COORD a2,\n                                            COORD a3,\n                                            PSMALL_RECT a4)\n    = WriteConsoleOutputW;\n\nBOOL (__stdcall * Real_WriteConsoleW)(HANDLE a0,\n                                      CONST void* a1,\n                                      DWORD a2,\n                                      LPDWORD a3,\n                                      LPVOID a4)\n    = WriteConsoleW;\n\nBOOL (__stdcall * Real_WriteFile)(HANDLE a0,\n                                  LPCVOID a1,\n                                  DWORD a2,\n                                  LPDWORD a3,\n                                  LPOVERLAPPED a4)\n    = WriteFile;\n\nBOOL (__stdcall * Real_WriteFileEx)(HANDLE a0,\n                                    LPCVOID a1,\n                                    DWORD a2,\n                                    LPOVERLAPPED a3,\n                                    LPOVERLAPPED_COMPLETION_ROUTINE a4)\n    = WriteFileEx;\n\nHRESULT (__stdcall * Real_WriteFmtUserTypeStg)(LPSTORAGE a0,\n                                               CLIPFORMAT a1,\n                                               LPOLESTR a2)\n    = WriteFmtUserTypeStg;\n\nBOOL (__stdcall * Real_WritePrivateProfileSectionA)(LPCSTR a0,\n                                                    LPCSTR a1,\n                                                    LPCSTR a2)\n    = WritePrivateProfileSectionA;\n\nBOOL (__stdcall * Real_WritePrivateProfileSectionW)(LPCWSTR a0,\n                                                    LPCWSTR a1,\n                                                    LPCWSTR a2)\n    = WritePrivateProfileSectionW;\n\nBOOL (__stdcall * Real_WritePrivateProfileStringA)(LPCSTR a0,\n                                                   LPCSTR a1,\n                                                   LPCSTR a2,\n                                                   LPCSTR a3)\n    = WritePrivateProfileStringA;\n\nBOOL (__stdcall * Real_WritePrivateProfileStringW)(LPCWSTR a0,\n                                                   LPCWSTR a1,\n                                                   LPCWSTR a2,\n                                                   LPCWSTR a3)\n    = WritePrivateProfileStringW;\n\nBOOL (__stdcall * Real_WritePrivateProfileStructA)(LPCSTR a0,\n                                                   LPCSTR a1,\n                                                   LPVOID a2,\n                                                   UINT a3,\n                                                   LPCSTR a4)\n    = WritePrivateProfileStructA;\n\nBOOL (__stdcall * Real_WritePrivateProfileStructW)(LPCWSTR a0,\n                                                   LPCWSTR a1,\n                                                   LPVOID a2,\n                                                   UINT a3,\n                                                   LPCWSTR a4)\n    = WritePrivateProfileStructW;\n\n#if _MSC_VER < 1300\nBOOL (__stdcall * Real_WriteProcessMemory)(HANDLE a0,\n                                           LPVOID a1,\n                                           LPVOID a2,\n                                           DWORD_PTR a3,\n                                           PDWORD_PTR a4)\n    = WriteProcessMemory;\n#else\nBOOL (__stdcall * Real_WriteProcessMemory)(HANDLE a0,\n                                           LPVOID a1,\n                                           LPCVOID a2,\n                                           DWORD_PTR a3,\n                                           PDWORD_PTR a4)\n    = WriteProcessMemory;\n#endif\n\nBOOL (__stdcall * Real_WriteProfileSectionA)(LPCSTR a0,\n                                             LPCSTR a1)\n    = WriteProfileSectionA;\n\nBOOL (__stdcall * Real_WriteProfileSectionW)(LPCWSTR a0,\n                                             LPCWSTR a1)\n    = WriteProfileSectionW;\n\nBOOL (__stdcall * Real_WriteProfileStringA)(LPCSTR a0,\n                                            LPCSTR a1,\n                                            LPCSTR a2)\n    = WriteProfileStringA;\n\nBOOL (__stdcall * Real_WriteProfileStringW)(LPCWSTR a0,\n                                            LPCWSTR a1,\n                                            LPCWSTR a2)\n    = WriteProfileStringW;\n\nDWORD (__stdcall * Real_WriteTapemark)(HANDLE a0,\n                                       DWORD a1,\n                                       DWORD a2,\n                                       BOOL a3)\n    = WriteTapemark;\n\nint (__stdcall * Real___WSAFDIsSet)(SOCKET a0,\n                                    fd_set* a1)\n    = __WSAFDIsSet;\n\nlong (__stdcall * Real__hread)(HFILE a0,\n                               LPVOID a1,\n                               long a2)\n    = _hread;\n\nlong (__stdcall * Real__hwrite)(HFILE a0,\n                                LPCSTR a1,\n                                long a2)\n    = _hwrite;\n\nHFILE (__stdcall * Real__lclose)(HFILE a0)\n    = _lclose;\n\nHFILE (__stdcall * Real__lcreat)(LPCSTR a0,\n                                 int a1)\n    = _lcreat;\n\nLONG (__stdcall * Real__llseek)(HFILE a0,\n                                LONG a1,\n                                int a2)\n    = _llseek;\n\nHFILE (__stdcall * Real__lopen)(LPCSTR a0,\n                                int a1)\n    = _lopen;\n\nUINT (__stdcall * Real__lread)(HFILE a0,\n                               LPVOID a1,\n                               UINT a2)\n    = _lread;\n\nUINT (__stdcall * Real__lwrite)(HFILE a0,\n                                LPCSTR a1,\n                                UINT a2)\n    = _lwrite;\n\nSOCKET (__stdcall * Real_accept)(SOCKET a0,\n                                 sockaddr* a1,\n                                 int* a2)\n    = accept;\n\nint (__stdcall * Real_bind)(SOCKET a0,\n                            CONST sockaddr* a1,\n                            int a2)\n    = bind;\n\nint (__stdcall * Real_closesocket)(SOCKET a0)\n    = closesocket;\n\nint (__stdcall * Real_connect)(SOCKET a0,\n                               CONST sockaddr* a1,\n                               int a2)\n    = connect;\n\nhostent * (__stdcall * Real_gethostbyaddr)(CONST char* a0,\n                                          int a1,\n                                          int a2)\n    = gethostbyaddr;\n\nhostent * (__stdcall * Real_gethostbyname)(CONST char* a0)\n    = gethostbyname;\n\nint (__stdcall * Real_gethostname)(char* a0,\n                                   int a1)\n    = gethostname;\n\nint (__stdcall * Real_getpeername)(SOCKET a0,\n                                   sockaddr* a1,\n                                   int* a2)\n    = getpeername;\n\nprotoent * (__stdcall * Real_getprotobyname)(CONST char* a0)\n    = getprotobyname;\n\nprotoent * (__stdcall * Real_getprotobynumber)(int a0)\n    = getprotobynumber;\n\nservent * (__stdcall * Real_getservbyname)(CONST char* a0,\n                                           CONST char* a1)\n    = getservbyname;\n\nservent * (__stdcall * Real_getservbyport)(int a0,\n                                           CONST char* a1)\n    = getservbyport;\n\nint (__stdcall * Real_getsockname)(SOCKET a0,\n                                   sockaddr* a1,\n                                   int* a2)\n    = getsockname;\n\nint (__stdcall * Real_getsockopt)(SOCKET a0,\n                                  int a1,\n                                  int a2,\n                                  char* a3,\n                                  int* a4)\n    = getsockopt;\n\nu_long (__stdcall * Real_htonl)(u_long a0)\n    = htonl;\n\nu_short (__stdcall * Real_htons)(u_short a0)\n    = htons;\n\nunsigned long (__stdcall * Real_inet_addr)(CONST char* a0)\n    = inet_addr;\n\nchar * (__stdcall * Real_inet_ntoa)(in_addr a0)\n    = inet_ntoa;\n\nint (__stdcall * Real_ioctlsocket)(SOCKET a0,\n                                   long a1,\n                                   u_long* a2)\n    = ioctlsocket;\n\nvoid (__stdcall * Real_keybd_event)(BYTE a0,\n                                    BYTE a1,\n                                    DWORD a2,\n                                    ULONG_PTR a3)\n    = keybd_event;\n\nint (__stdcall * Real_listen)(SOCKET a0,\n                              int a1)\n    = listen;\n\nvoid (__stdcall * Real_mouse_event)(DWORD a0,\n                                    DWORD a1,\n                                    DWORD a2,\n                                    DWORD a3,\n                                    ULONG_PTR a4)\n    = mouse_event;\n\nu_long (__stdcall * Real_ntohl)(u_long a0)\n    = ntohl;\n\nu_short (__stdcall * Real_ntohs)(u_short a0)\n    = ntohs;\n\nint (__stdcall * Real_recv)(SOCKET a0,\n                            char* a1,\n                            int a2,\n                            int a3)\n    = recv;\n\nint (__stdcall * Real_recvfrom)(SOCKET a0,\n                                char* a1,\n                                int a2,\n                                int a3,\n                                sockaddr* a4,\n                                int* a5)\n    = recvfrom;\n\nint (__stdcall * Real_select)(int a0,\n                              fd_set* a1,\n                              fd_set* a2,\n                              fd_set* a3,\n                              CONST timeval* a4)\n    = select;\n\nint (__stdcall * Real_send)(SOCKET a0,\n                            CONST char* a1,\n                            int a2,\n                            int a3)\n    = send;\n\nint (__stdcall * Real_sendto)(SOCKET a0,\n                              CONST char* a1,\n                              int a2,\n                              int a3,\n                              CONST sockaddr* a4,\n                              int a5)\n    = sendto;\n\nint (__stdcall * Real_setsockopt)(SOCKET a0,\n                                  int a1,\n                                  int a2,\n                                  CONST char* a3,\n                                  int a4)\n    = setsockopt;\n\nint (__stdcall * Real_shutdown)(SOCKET a0,\n                                int a1)\n    = shutdown;\n\nSOCKET (__stdcall * Real_socket)(int a0,\n                                 int a1,\n                                 int a2)\n    = socket;\n\n///////////////////////////////////////////////////////////////////// Detours.\n//\n\nint __stdcall Mine_AbortDoc(HDC a0)\n{\n    _PrintEnter(\"AbortDoc(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_AbortDoc(a0);\n    } __finally {\n        _PrintExit(\"AbortDoc() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_AbortPath(HDC a0)\n{\n    _PrintEnter(\"AbortPath(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_AbortPath(a0);\n    } __finally {\n        _PrintExit(\"AbortPath() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHKL __stdcall Mine_ActivateKeyboardLayout(HKL a0,\n                                          UINT a1)\n{\n    _PrintEnter(\"ActivateKeyboardLayout(%p,%p)\\n\", a0, a1);\n\n    HKL rv = 0;\n    __try {\n        rv = Real_ActivateKeyboardLayout(a0, a1);\n    } __finally {\n        _PrintExit(\"ActivateKeyboardLayout(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nATOM __stdcall Mine_AddAtomA(LPCSTR a0)\n{\n    _PrintEnter(\"AddAtomA(%hs)\\n\", a0);\n\n    ATOM rv = 0;\n    __try {\n        rv = Real_AddAtomA(a0);\n    } __finally {\n        _PrintExit(\"AddAtomA() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nATOM __stdcall Mine_AddAtomW(LPCWSTR a0)\n{\n    _PrintEnter(\"AddAtomW(%ls)\\n\", a0);\n\n    ATOM rv = 0;\n    __try {\n        rv = Real_AddAtomW(a0);\n    } __finally {\n        _PrintExit(\"AddAtomW() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_AddFontResourceA(LPCSTR a0)\n{\n    _PrintEnter(\"AddFontResourceA(%hs)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_AddFontResourceA(a0);\n    } __finally {\n        _PrintExit(\"AddFontResourceA() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_AddFontResourceW(LPCWSTR a0)\n{\n    _PrintEnter(\"AddFontResourceW(%ls)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_AddFontResourceW(a0);\n    } __finally {\n        _PrintExit(\"AddFontResourceW() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_AdjustWindowRect(LPRECT a0,\n                                     DWORD a1,\n                                     BOOL a2)\n{\n    _PrintEnter(\"AdjustWindowRect(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_AdjustWindowRect(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"AdjustWindowRect(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_AdjustWindowRectEx(LPRECT a0,\n                                       DWORD a1,\n                                       BOOL a2,\n                                       DWORD a3)\n{\n    _PrintEnter(\"AdjustWindowRectEx(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_AdjustWindowRectEx(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"AdjustWindowRectEx(,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_AllocConsole(void)\n{\n    _PrintEnter(\"AllocConsole()\\n\");\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_AllocConsole();\n    } __finally {\n        _PrintExit(\"AllocConsole() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_AngleArc(HDC a0,\n                             int a1,\n                             int a2,\n                             DWORD a3,\n                             FLOAT a4,\n                             FLOAT a5)\n{\n    _PrintEnter(\"AngleArc(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_AngleArc(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"AngleArc(,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_AnimatePalette(HPALETTE a0,\n                                   UINT a1,\n                                   UINT a2,\n                                   PALETTEENTRY* a3)\n{\n    _PrintEnter(\"AnimatePalette(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_AnimatePalette(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"AnimatePalette(,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_AnyPopup(void)\n{\n    _PrintEnter(\"AnyPopup()\\n\");\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_AnyPopup();\n    } __finally {\n        _PrintExit(\"AnyPopup() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_AppendMenuA(HMENU a0,\n                                UINT a1,\n                                UINT_PTR a2,\n                                LPCSTR a3)\n{\n    _PrintEnter(\"AppendMenuA(%p,%p,%p,%hs)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_AppendMenuA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"AppendMenuA(,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_AppendMenuW(HMENU a0,\n                                UINT a1,\n                                UINT_PTR a2,\n                                LPCWSTR a3)\n{\n    _PrintEnter(\"AppendMenuW(%p,%p,%p,%ls)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_AppendMenuW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"AppendMenuW(,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_Arc(HDC a0,\n                        int a1,\n                        int a2,\n                        int a3,\n                        int a4,\n                        int a5,\n                        int a6,\n                        int a7,\n                        int a8)\n{\n    _PrintEnter(\"Arc(%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_Arc(a0, a1, a2, a3, a4, a5, a6, a7, a8);\n    } __finally {\n        _PrintExit(\"Arc(,,,,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ArcTo(HDC a0,\n                          int a1,\n                          int a2,\n                          int a3,\n                          int a4,\n                          int a5,\n                          int a6,\n                          int a7,\n                          int a8)\n{\n    _PrintEnter(\"ArcTo(%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ArcTo(a0, a1, a2, a3, a4, a5, a6, a7, a8);\n    } __finally {\n        _PrintExit(\"ArcTo(,,,,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_AreFileApisANSI(void)\n{\n    _PrintEnter(\"AreFileApisANSI()\\n\");\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_AreFileApisANSI();\n    } __finally {\n        _PrintExit(\"AreFileApisANSI() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_ArrangeIconicWindows(HWND a0)\n{\n    _PrintEnter(\"ArrangeIconicWindows(%p)\\n\", a0);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_ArrangeIconicWindows(a0);\n    } __finally {\n        _PrintExit(\"ArrangeIconicWindows() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_AttachThreadInput(DWORD a0,\n                                      DWORD a1,\n                                      BOOL a2)\n{\n    _PrintEnter(\"AttachThreadInput(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_AttachThreadInput(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"AttachThreadInput(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_BackupRead(HANDLE a0,\n                               LPBYTE a1,\n                               DWORD a2,\n                               LPDWORD a3,\n                               BOOL a4,\n                               BOOL a5,\n                               LPVOID* a6)\n{\n    _PrintEnter(\"BackupRead(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_BackupRead(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"BackupRead(,,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_BackupSeek(HANDLE a0,\n                               DWORD a1,\n                               DWORD a2,\n                               LPDWORD a3,\n                               LPDWORD a4,\n                               LPVOID* a5)\n{\n    _PrintEnter(\"BackupSeek(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_BackupSeek(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"BackupSeek(,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_BackupWrite(HANDLE a0,\n                                LPBYTE a1,\n                                DWORD a2,\n                                LPDWORD a3,\n                                BOOL a4,\n                                BOOL a5,\n                                LPVOID* a6)\n{\n    _PrintEnter(\"BackupWrite(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_BackupWrite(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"BackupWrite(,,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_Beep(DWORD a0,\n                         DWORD a1)\n{\n    _PrintEnter(\"Beep(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_Beep(a0, a1);\n    } __finally {\n        _PrintExit(\"Beep(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHDWP __stdcall Mine_BeginDeferWindowPos(int a0)\n{\n    _PrintEnter(\"BeginDeferWindowPos(%p)\\n\", a0);\n\n    HDWP rv = 0;\n    __try {\n        rv = Real_BeginDeferWindowPos(a0);\n    } __finally {\n        _PrintExit(\"BeginDeferWindowPos() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHDC __stdcall Mine_BeginPaint(HWND a0,\n                              LPPAINTSTRUCT a1)\n{\n    _PrintEnter(\"BeginPaint(%p,%p)\\n\", a0, a1);\n\n    HDC rv = 0;\n    __try {\n        rv = Real_BeginPaint(a0, a1);\n    } __finally {\n        _PrintExit(\"BeginPaint(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_BeginPath(HDC a0)\n{\n    _PrintEnter(\"BeginPath(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_BeginPath(a0);\n    } __finally {\n        _PrintExit(\"BeginPath() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_BeginUpdateResourceA(LPCSTR a0,\n                                           BOOL a1)\n{\n    _PrintEnter(\"BeginUpdateResourceA(%hs,%p)\\n\", a0, a1);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_BeginUpdateResourceA(a0, a1);\n    } __finally {\n        _PrintExit(\"BeginUpdateResourceA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_BeginUpdateResourceW(LPCWSTR a0,\n                                           BOOL a1)\n{\n    _PrintEnter(\"BeginUpdateResourceW(%ls,%p)\\n\", a0, a1);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_BeginUpdateResourceW(a0, a1);\n    } __finally {\n        _PrintExit(\"BeginUpdateResourceW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_BindMoniker(IMoniker* a0,\n                                   DWORD a1,\n                                   CONST IID& a2,\n                                   LPVOID* a3)\n{\n    _PrintEnter(\"BindMoniker(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_BindMoniker(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"BindMoniker(,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_BitBlt(HDC a0,\n                           int a1,\n                           int a2,\n                           int a3,\n                           int a4,\n                           HDC a5,\n                           int a6,\n                           int a7,\n                           DWORD a8)\n{\n    _PrintEnter(\"BitBlt(%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_BitBlt(a0, a1, a2, a3, a4, a5, a6, a7, a8);\n    } __finally {\n        _PrintExit(\"BitBlt(,,,,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_BringWindowToTop(HWND a0)\n{\n    _PrintEnter(\"BringWindowToTop(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_BringWindowToTop(a0);\n    } __finally {\n        _PrintExit(\"BringWindowToTop() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nlong __stdcall Mine_BroadcastSystemMessageA(DWORD a0,\n                                            LPDWORD a1,\n                                            UINT a2,\n                                            WPARAM a3,\n                                            LPARAM a4)\n{\n    _PrintEnter(\"BroadcastSystemMessageA(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    long rv = 0;\n    __try {\n        rv = Real_BroadcastSystemMessageA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"BroadcastSystemMessageA(,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nlong __stdcall Mine_BroadcastSystemMessageW(DWORD a0,\n                                            LPDWORD a1,\n                                            UINT a2,\n                                            WPARAM a3,\n                                            LPARAM a4)\n{\n    _PrintEnter(\"BroadcastSystemMessageW(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    long rv = 0;\n    __try {\n        rv = Real_BroadcastSystemMessageW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"BroadcastSystemMessageW(,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_BuildCommDCBA(LPCSTR a0,\n                                  LPDCB a1)\n{\n    _PrintEnter(\"BuildCommDCBA(%hs,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_BuildCommDCBA(a0, a1);\n    } __finally {\n        _PrintExit(\"BuildCommDCBA(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_BuildCommDCBAndTimeoutsA(LPCSTR a0,\n                                             LPDCB a1,\n                                             LPCOMMTIMEOUTS a2)\n{\n    _PrintEnter(\"BuildCommDCBAndTimeoutsA(%hs,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_BuildCommDCBAndTimeoutsA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"BuildCommDCBAndTimeoutsA(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_BuildCommDCBAndTimeoutsW(LPCWSTR a0,\n                                             LPDCB a1,\n                                             LPCOMMTIMEOUTS a2)\n{\n    _PrintEnter(\"BuildCommDCBAndTimeoutsW(%ls,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_BuildCommDCBAndTimeoutsW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"BuildCommDCBAndTimeoutsW(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_BuildCommDCBW(LPCWSTR a0,\n                                  LPDCB a1)\n{\n    _PrintEnter(\"BuildCommDCBW(%ls,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_BuildCommDCBW(a0, a1);\n    } __finally {\n        _PrintExit(\"BuildCommDCBW(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CLSIDFromProgID(LPCOLESTR a0,\n                                       LPGUID a1)\n{\n    _PrintEnter(\"CLSIDFromProgID(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CLSIDFromProgID(a0, a1);\n    } __finally {\n        _PrintExit(\"CLSIDFromProgID(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CLSIDFromString(LPOLESTR a0,\n                                       LPGUID a1)\n{\n    _PrintEnter(\"CLSIDFromString(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CLSIDFromString(a0, a1);\n    } __finally {\n        _PrintExit(\"CLSIDFromString(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CallMsgFilterA(LPMSG a0,\n                                   int a1)\n{\n    _PrintEnter(\"CallMsgFilterA(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CallMsgFilterA(a0, a1);\n    } __finally {\n        _PrintExit(\"CallMsgFilterA(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CallMsgFilterW(LPMSG a0,\n                                   int a1)\n{\n    _PrintEnter(\"CallMsgFilterW(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CallMsgFilterW(a0, a1);\n    } __finally {\n        _PrintExit(\"CallMsgFilterW(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CallNamedPipeA(LPCSTR a0,\n                                   LPVOID a1,\n                                   DWORD a2,\n                                   LPVOID a3,\n                                   DWORD a4,\n                                   LPDWORD a5,\n                                   DWORD a6)\n{\n    _PrintEnter(\"CallNamedPipeA(%hs,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CallNamedPipeA(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"CallNamedPipeA(,,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CallNamedPipeW(LPCWSTR a0,\n                                   LPVOID a1,\n                                   DWORD a2,\n                                   LPVOID a3,\n                                   DWORD a4,\n                                   LPDWORD a5,\n                                   DWORD a6)\n{\n    _PrintEnter(\"CallNamedPipeW(%ls,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CallNamedPipeW(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"CallNamedPipeW(,,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nLRESULT __stdcall Mine_CallNextHookEx(HHOOK a0,\n                                      int a1,\n                                      WPARAM a2,\n                                      LPARAM a3)\n{\n    _PrintEnter(\"CallNextHookEx(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    LRESULT rv = 0;\n    __try {\n        rv = Real_CallNextHookEx(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CallNextHookEx(,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nLRESULT __stdcall Mine_CallWindowProcA(WNDPROC a0,\n                                       HWND a1,\n                                       UINT a2,\n                                       WPARAM a3,\n                                       LPARAM a4)\n{\n    _PrintEnter(\"CallWindowProcA(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    LRESULT rv = 0;\n    __try {\n        rv = Real_CallWindowProcA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"CallWindowProcA(,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nLRESULT __stdcall Mine_CallWindowProcW(WNDPROC a0,\n                                       HWND a1,\n                                       UINT a2,\n                                       WPARAM a3,\n                                       LPARAM a4)\n{\n    _PrintEnter(\"CallWindowProcW(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    LRESULT rv = 0;\n    __try {\n        rv = Real_CallWindowProcW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"CallWindowProcW(,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CancelDC(HDC a0)\n{\n    _PrintEnter(\"CancelDC(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CancelDC(a0);\n    } __finally {\n        _PrintExit(\"CancelDC() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CancelIo(HANDLE a0)\n{\n    _PrintEnter(\"CancelIo(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CancelIo(a0);\n    } __finally {\n        _PrintExit(\"CancelIo() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CancelWaitableTimer(HANDLE a0)\n{\n    _PrintEnter(\"CancelWaitableTimer(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CancelWaitableTimer(a0);\n    } __finally {\n        _PrintExit(\"CancelWaitableTimer() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nWORD __stdcall Mine_CascadeWindows(HWND a0,\n                                   UINT a1,\n                                   RECT* a2,\n                                   UINT a3,\n                                   struct HWND__** a4)\n{\n    _PrintEnter(\"CascadeWindows(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    WORD rv = 0;\n    __try {\n        rv = Real_CascadeWindows(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"CascadeWindows(,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ChangeClipboardChain(HWND a0,\n                                         HWND a1)\n{\n    _PrintEnter(\"ChangeClipboardChain(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ChangeClipboardChain(a0, a1);\n    } __finally {\n        _PrintExit(\"ChangeClipboardChain(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nLONG __stdcall Mine_ChangeDisplaySettingsA(LPDEVMODEA a0,\n                                           DWORD a1)\n{\n    _PrintEnter(\"ChangeDisplaySettingsA(%p,%p)\\n\", a0, a1);\n\n    LONG rv = 0;\n    __try {\n        rv = Real_ChangeDisplaySettingsA(a0, a1);\n    } __finally {\n        _PrintExit(\"ChangeDisplaySettingsA(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nLONG __stdcall Mine_ChangeDisplaySettingsExA(LPCSTR a0,\n                                             LPDEVMODEA a1,\n                                             HWND a2,\n                                             DWORD a3,\n                                             LPVOID a4)\n{\n    _PrintEnter(\"ChangeDisplaySettingsExA(%hs,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    LONG rv = 0;\n    __try {\n        rv = Real_ChangeDisplaySettingsExA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"ChangeDisplaySettingsExA(,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nLONG __stdcall Mine_ChangeDisplaySettingsExW(LPCWSTR a0,\n                                             LPDEVMODEW a1,\n                                             HWND a2,\n                                             DWORD a3,\n                                             LPVOID a4)\n{\n    _PrintEnter(\"ChangeDisplaySettingsExW(%ls,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    LONG rv = 0;\n    __try {\n        rv = Real_ChangeDisplaySettingsExW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"ChangeDisplaySettingsExW(,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nLONG __stdcall Mine_ChangeDisplaySettingsW(LPDEVMODEW a0,\n                                           DWORD a1)\n{\n    _PrintEnter(\"ChangeDisplaySettingsW(%p,%p)\\n\", a0, a1);\n\n    LONG rv = 0;\n    __try {\n        rv = Real_ChangeDisplaySettingsW(a0, a1);\n    } __finally {\n        _PrintExit(\"ChangeDisplaySettingsW(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ChangeMenuA(HMENU a0,\n                                UINT a1,\n                                LPCSTR a2,\n                                UINT a3,\n                                UINT a4)\n{\n    _PrintEnter(\"ChangeMenuA(%p,%p,%hs,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ChangeMenuA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"ChangeMenuA(,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ChangeMenuW(HMENU a0,\n                                UINT a1,\n                                LPCWSTR a2,\n                                UINT a3,\n                                UINT a4)\n{\n    _PrintEnter(\"ChangeMenuW(%p,%p,%ls,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ChangeMenuW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"ChangeMenuW(,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nLPSTR __stdcall Mine_CharLowerA(LPSTR a0)\n{\n    _PrintEnter(\"CharLowerA(%hs)\\n\", a0);\n\n    LPSTR rv = 0;\n    __try {\n        rv = Real_CharLowerA(a0);\n    } __finally {\n        _PrintExit(\"CharLowerA(%hs) -> %hs\\n\", a0, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_CharLowerBuffA(LPSTR a0,\n                                    DWORD a1)\n{\n    _PrintEnter(\"CharLowerBuffA(%hs,%p)\\n\", a0, a1);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_CharLowerBuffA(a0, a1);\n    } __finally {\n        _PrintExit(\"CharLowerBuffA(%hs,) -> %x\\n\", a0, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_CharLowerBuffW(LPWSTR a0,\n                                    DWORD a1)\n{\n    _PrintEnter(\"CharLowerBuffW(%ls,%p)\\n\", a0, a1);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_CharLowerBuffW(a0, a1);\n    } __finally {\n        _PrintExit(\"CharLowerBuffW(%ls,) -> %x\\n\", a0, rv);\n    };\n    return rv;\n}\n\nLPWSTR __stdcall Mine_CharLowerW(LPWSTR a0)\n{\n    _PrintEnter(\"CharLowerW(%ls)\\n\", a0);\n\n    LPWSTR rv = 0;\n    __try {\n        rv = Real_CharLowerW(a0);\n    } __finally {\n        _PrintExit(\"CharLowerW(%ls) -> %ls\\n\", a0, rv);\n    };\n    return rv;\n}\n\nLPSTR __stdcall Mine_CharNextA(LPCSTR a0)\n{\n    _PrintEnter(\"CharNextA(%hs)\\n\", a0);\n\n    LPSTR rv = 0;\n    __try {\n        rv = Real_CharNextA(a0);\n    } __finally {\n        _PrintExit(\"CharNextA() -> %hs\\n\", rv);\n    };\n    return rv;\n}\n\nLPSTR __stdcall Mine_CharNextExA(WORD a0,\n                                 LPCSTR a1,\n                                 DWORD a2)\n{\n    _PrintEnter(\"CharNextExA(%p,%hs,%p)\\n\", a0, a1, a2);\n\n    LPSTR rv = 0;\n    __try {\n        rv = Real_CharNextExA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CharNextExA(,,) -> %hs\\n\", rv);\n    };\n    return rv;\n}\n\nLPWSTR __stdcall Mine_CharNextW(LPCWSTR a0)\n{\n    _PrintEnter(\"CharNextW(%ls)\\n\", a0);\n\n    LPWSTR rv = 0;\n    __try {\n        rv = Real_CharNextW(a0);\n    } __finally {\n        _PrintExit(\"CharNextW() -> %ls\\n\", rv);\n    };\n    return rv;\n}\n\nLPSTR __stdcall Mine_CharPrevA(LPCSTR a0,\n                               LPCSTR a1)\n{\n    _PrintEnter(\"CharPrevA(%hs,%hs)\\n\", a0, a1);\n\n    LPSTR rv = 0;\n    __try {\n        rv = Real_CharPrevA(a0, a1);\n    } __finally {\n        _PrintExit(\"CharPrevA(,) -> %hs\\n\", rv);\n    };\n    return rv;\n}\n\nLPSTR __stdcall Mine_CharPrevExA(WORD a0,\n                                 LPCSTR a1,\n                                 LPCSTR a2,\n                                 DWORD a3)\n{\n    _PrintEnter(\"CharPrevExA(%p,%hs,%hs,%p)\\n\", a0, a1, a2, a3);\n\n    LPSTR rv = 0;\n    __try {\n        rv = Real_CharPrevExA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CharPrevExA(,,,) -> %hs\\n\", rv);\n    };\n    return rv;\n}\n\nLPWSTR __stdcall Mine_CharPrevW(LPCWSTR a0,\n                                LPCWSTR a1)\n{\n    _PrintEnter(\"CharPrevW(%ls,%ls)\\n\", a0, a1);\n\n    LPWSTR rv = 0;\n    __try {\n        rv = Real_CharPrevW(a0, a1);\n    } __finally {\n        _PrintExit(\"CharPrevW(,) -> %ls\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CharToOemA(LPCSTR a0,\n                               LPSTR a1)\n{\n    _PrintEnter(\"CharToOemA(%hs,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CharToOemA(a0, a1);\n    } __finally {\n        _PrintExit(\"CharToOemA(,%hs) -> %x\\n\", a1, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CharToOemBuffA(LPCSTR a0,\n                                   LPSTR a1,\n                                   DWORD a2)\n{\n    _PrintEnter(\"CharToOemBuffA(%hs,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CharToOemBuffA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CharToOemBuffA(,%hs,) -> %x\\n\", a1, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CharToOemBuffW(LPCWSTR a0,\n                                   LPSTR a1,\n                                   DWORD a2)\n{\n    _PrintEnter(\"CharToOemBuffW(%ls,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CharToOemBuffW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CharToOemBuffW(,%hs,) -> %x\\n\", a1, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CharToOemW(LPCWSTR a0,\n                               LPSTR a1)\n{\n    _PrintEnter(\"CharToOemW(%ls,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CharToOemW(a0, a1);\n    } __finally {\n        _PrintExit(\"CharToOemW(,%hs) -> %x\\n\", a1, rv);\n    };\n    return rv;\n}\n\nLPSTR __stdcall Mine_CharUpperA(LPSTR a0)\n{\n    _PrintEnter(\"CharUpperA(%hs)\\n\", a0);\n\n    LPSTR rv = 0;\n    __try {\n        rv = Real_CharUpperA(a0);\n    } __finally {\n        _PrintExit(\"CharUpperA(%hs) -> %hs\\n\", a0, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_CharUpperBuffA(LPSTR a0,\n                                    DWORD a1)\n{\n    _PrintEnter(\"CharUpperBuffA(%hs,%p)\\n\", a0, a1);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_CharUpperBuffA(a0, a1);\n    } __finally {\n        _PrintExit(\"CharUpperBuffA(%hs,) -> %x\\n\", a0, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_CharUpperBuffW(LPWSTR a0,\n                                    DWORD a1)\n{\n    _PrintEnter(\"CharUpperBuffW(%ls,%p)\\n\", a0, a1);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_CharUpperBuffW(a0, a1);\n    } __finally {\n        _PrintExit(\"CharUpperBuffW(%ls,) -> %x\\n\", a0, rv);\n    };\n    return rv;\n}\n\nLPWSTR __stdcall Mine_CharUpperW(LPWSTR a0)\n{\n    _PrintEnter(\"CharUpperW(%ls)\\n\", a0);\n\n    LPWSTR rv = 0;\n    __try {\n        rv = Real_CharUpperW(a0);\n    } __finally {\n        _PrintExit(\"CharUpperW(%ls) -> %ls\\n\", a0, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CheckColorsInGamut(\n                                       HDC a0,\n#ifdef GDIPLUS_TS_QUERYVER\n                                       LPRGBTRIPLE a1,\n#else\n                                       LPVOID a1,\n#endif\n                                       LPVOID a2,\n                                       DWORD a3\n                                      )\n{\n    _PrintEnter(\"CheckColorsInGamut(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CheckColorsInGamut(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CheckColorsInGamut(,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CheckDlgButton(HWND a0,\n                                   int a1,\n                                   UINT a2)\n{\n    _PrintEnter(\"CheckDlgButton(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CheckDlgButton(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CheckDlgButton(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_CheckMenuItem(HMENU a0,\n                                   UINT a1,\n                                   UINT a2)\n{\n    _PrintEnter(\"CheckMenuItem(%p,%p,%p)\\n\", a0, a1, a2);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_CheckMenuItem(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CheckMenuItem(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CheckMenuRadioItem(HMENU a0,\n                                       UINT a1,\n                                       UINT a2,\n                                       UINT a3,\n                                       UINT a4)\n{\n    _PrintEnter(\"CheckMenuRadioItem(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CheckMenuRadioItem(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"CheckMenuRadioItem(,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CheckRadioButton(HWND a0,\n                                     int a1,\n                                     int a2,\n                                     int a3)\n{\n    _PrintEnter(\"CheckRadioButton(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CheckRadioButton(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CheckRadioButton(,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_ChildWindowFromPoint(HWND a0,\n                                         POINT a1)\n{\n    _PrintEnter(\"ChildWindowFromPoint(%p,%p)\\n\", a0, a1);\n\n    HWND rv = 0;\n    __try {\n        rv = Real_ChildWindowFromPoint(a0, a1);\n    } __finally {\n        _PrintExit(\"ChildWindowFromPoint(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_ChildWindowFromPointEx(HWND a0,\n                                           POINT a1,\n                                           UINT a2)\n{\n    _PrintEnter(\"ChildWindowFromPointEx(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HWND rv = 0;\n    __try {\n        rv = Real_ChildWindowFromPointEx(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"ChildWindowFromPointEx(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_ChoosePixelFormat(HDC a0,\n                                     PIXELFORMATDESCRIPTOR* a1)\n{\n    _PrintEnter(\"ChoosePixelFormat(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_ChoosePixelFormat(a0, a1);\n    } __finally {\n        _PrintExit(\"ChoosePixelFormat(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_Chord(HDC a0,\n                          int a1,\n                          int a2,\n                          int a3,\n                          int a4,\n                          int a5,\n                          int a6,\n                          int a7,\n                          int a8)\n{\n    _PrintEnter(\"Chord(%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_Chord(a0, a1, a2, a3, a4, a5, a6, a7, a8);\n    } __finally {\n        _PrintExit(\"Chord(,,,,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ClearCommBreak(HANDLE a0)\n{\n    _PrintEnter(\"ClearCommBreak(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ClearCommBreak(a0);\n    } __finally {\n        _PrintExit(\"ClearCommBreak() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ClearCommError(HANDLE a0,\n                                   LPDWORD a1,\n                                   LPCOMSTAT a2)\n{\n    _PrintEnter(\"ClearCommError(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ClearCommError(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"ClearCommError(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ClientToScreen(HWND a0,\n                                   POINT* a1)\n{\n    _PrintEnter(\"ClientToScreen(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ClientToScreen(a0, a1);\n    } __finally {\n        _PrintExit(\"ClientToScreen(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ClipCursor(RECT* a0)\n{\n    _PrintEnter(\"ClipCursor(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ClipCursor(a0);\n    } __finally {\n        _PrintExit(\"ClipCursor() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CloseClipboard(void)\n{\n    _PrintEnter(\"CloseClipboard()\\n\");\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CloseClipboard();\n    } __finally {\n        _PrintExit(\"CloseClipboard() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CloseDesktop(HDESK a0)\n{\n    _PrintEnter(\"CloseDesktop(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CloseDesktop(a0);\n    } __finally {\n        _PrintExit(\"CloseDesktop() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHENHMETAFILE __stdcall Mine_CloseEnhMetaFile(HDC a0)\n{\n    _PrintEnter(\"CloseEnhMetaFile(%p)\\n\", a0);\n\n    HENHMETAFILE rv = 0;\n    __try {\n        rv = Real_CloseEnhMetaFile(a0);\n    } __finally {\n        _PrintExit(\"CloseEnhMetaFile() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CloseFigure(HDC a0)\n{\n    _PrintEnter(\"CloseFigure(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CloseFigure(a0);\n    } __finally {\n        _PrintExit(\"CloseFigure() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CloseHandle(HANDLE a0)\n{\n    _PrintEnter(\"CloseHandle(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CloseHandle(a0);\n    } __finally {\n        _PrintExit(\"CloseHandle() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHMETAFILE __stdcall Mine_CloseMetaFile(HDC a0)\n{\n    _PrintEnter(\"CloseMetaFile(%p)\\n\", a0);\n\n    HMETAFILE rv = 0;\n    __try {\n        rv = Real_CloseMetaFile(a0);\n    } __finally {\n        _PrintExit(\"CloseMetaFile() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CloseWindow(HWND a0)\n{\n    _PrintEnter(\"CloseWindow(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CloseWindow(a0);\n    } __finally {\n        _PrintExit(\"CloseWindow() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CloseWindowStation(HWINSTA a0)\n{\n    _PrintEnter(\"CloseWindowStation(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CloseWindowStation(a0);\n    } __finally {\n        _PrintExit(\"CloseWindowStation() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nULONG __stdcall Mine_CoAddRefServerProcess(void)\n{\n    _PrintEnter(\"CoAddRefServerProcess()\\n\");\n\n    ULONG rv = 0;\n    __try {\n        rv = Real_CoAddRefServerProcess();\n    } __finally {\n        _PrintExit(\"CoAddRefServerProcess() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_CoBuildVersion(void)\n{\n    _PrintEnter(\"CoBuildVersion()\\n\");\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_CoBuildVersion();\n    } __finally {\n        _PrintExit(\"CoBuildVersion() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoCopyProxy(IUnknown* a0,\n                                   IUnknown** a1)\n{\n    _PrintEnter(\"CoCopyProxy(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoCopyProxy(a0, a1);\n    } __finally {\n        _PrintExit(\"CoCopyProxy(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoCreateFreeThreadedMarshaler(LPUNKNOWN a0,\n                                                     LPUNKNOWN* a1)\n{\n    _PrintEnter(\"CoCreateFreeThreadedMarshaler(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoCreateFreeThreadedMarshaler(a0, a1);\n    } __finally {\n        _PrintExit(\"CoCreateFreeThreadedMarshaler(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoCreateGuid(GUID* a0)\n{\n    _PrintEnter(\"CoCreateGuid(%p)\\n\", a0);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoCreateGuid(a0);\n    } __finally {\n        _PrintExit(\"CoCreateGuid() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoCreateInstance(CONST IID& a0,\n                                        LPUNKNOWN a1,\n                                        DWORD a2,\n                                        CONST IID& a3,\n                                        LPVOID* a4)\n{\n    _PrintEnter(\"CoCreateInstance(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoCreateInstance(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"CoCreateInstance(,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoCreateInstanceEx(CONST IID& a0,\n                                          IUnknown* a1,\n                                          DWORD a2,\n                                          COSERVERINFO* a3,\n                                          DWORD a4,\n                                          MULTI_QI* a5)\n{\n    _PrintEnter(\"CoCreateInstanceEx(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoCreateInstanceEx(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"CoCreateInstanceEx(,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoDisconnectObject(LPUNKNOWN a0,\n                                          DWORD a1)\n{\n    _PrintEnter(\"CoDisconnectObject(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoDisconnectObject(a0, a1);\n    } __finally {\n        _PrintExit(\"CoDisconnectObject(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CoDosDateTimeToFileTime(WORD a0,\n                                            WORD a1,\n                                            FILETIME* a2)\n{\n    _PrintEnter(\"CoDosDateTimeToFileTime(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CoDosDateTimeToFileTime(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CoDosDateTimeToFileTime(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoFileTimeNow(FILETIME* a0)\n{\n    _PrintEnter(\"CoFileTimeNow(%p)\\n\", a0);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoFileTimeNow(a0);\n    } __finally {\n        _PrintExit(\"CoFileTimeNow() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CoFileTimeToDosDateTime(FILETIME* a0,\n                                            LPWORD a1,\n                                            LPWORD a2)\n{\n    _PrintEnter(\"CoFileTimeToDosDateTime(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CoFileTimeToDosDateTime(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CoFileTimeToDosDateTime(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nvoid __stdcall Mine_CoFreeAllLibraries(void)\n{\n    _PrintEnter(\"CoFreeAllLibraries()\\n\");\n\n    __try {\n        Real_CoFreeAllLibraries();\n    } __finally {\n        _PrintExit(\"CoFreeAllLibraries() ->\\n\");\n    };\n}\n\nvoid __stdcall Mine_CoFreeLibrary(HINSTANCE a0)\n{\n    _PrintEnter(\"CoFreeLibrary(%p)\\n\", a0);\n\n    __try {\n        Real_CoFreeLibrary(a0);\n    } __finally {\n        _PrintExit(\"CoFreeLibrary() ->\\n\");\n    };\n}\n\nvoid __stdcall Mine_CoFreeUnusedLibraries(void)\n{\n    _PrintEnter(\"CoFreeUnusedLibraries()\\n\");\n\n    __try {\n        Real_CoFreeUnusedLibraries();\n    } __finally {\n        _PrintExit(\"CoFreeUnusedLibraries() ->\\n\");\n    };\n}\n\nHRESULT __stdcall Mine_CoGetCallContext(CONST IID& a0,\n                                        void** a1)\n{\n    _PrintEnter(\"CoGetCallContext(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoGetCallContext(a0, a1);\n    } __finally {\n        _PrintExit(\"CoGetCallContext(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoGetClassObject(CONST IID& a0,\n                                        DWORD a1,\n                                        LPVOID a2,\n                                        CONST IID& a3,\n                                        LPVOID* a4)\n{\n    _PrintEnter(\"CoGetClassObject(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoGetClassObject(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"CoGetClassObject(,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_CoGetCurrentProcess(void)\n{\n    _PrintEnter(\"CoGetCurrentProcess()\\n\");\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_CoGetCurrentProcess();\n    } __finally {\n        _PrintExit(\"CoGetCurrentProcess() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoGetInstanceFromFile(COSERVERINFO* a0,\n                                             CLSID* a1,\n                                             IUnknown* a2,\n                                             DWORD a3,\n                                             DWORD a4,\n                                             OLECHAR* a5,\n                                             DWORD a6,\n                                             MULTI_QI* a7)\n{\n    _PrintEnter(\"CoGetInstanceFromFile(%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoGetInstanceFromFile(a0, a1, a2, a3, a4, a5, a6, a7);\n    } __finally {\n        _PrintExit(\"CoGetInstanceFromFile(,,,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoGetInstanceFromIStorage(COSERVERINFO* a0,\n                                                 CLSID* a1,\n                                                 IUnknown* a2,\n                                                 DWORD a3,\n                                                 IStorage* a4,\n                                                 DWORD a5,\n                                                 MULTI_QI* a6)\n{\n    _PrintEnter(\"CoGetInstanceFromIStorage(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoGetInstanceFromIStorage(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"CoGetInstanceFromIStorage(,,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoGetInterfaceAndReleaseStream(LPSTREAM a0,\n                                                      CONST IID& a1,\n                                                      LPVOID* a2)\n{\n    _PrintEnter(\"CoGetInterfaceAndReleaseStream(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoGetInterfaceAndReleaseStream(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CoGetInterfaceAndReleaseStream(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoGetMalloc(DWORD a0,\n                                   IMalloc** a1)\n{\n    _PrintEnter(\"CoGetMalloc(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoGetMalloc(a0, a1);\n    } __finally {\n        _PrintExit(\"CoGetMalloc(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoGetMarshalSizeMax(ULONG* a0,\n                                           CONST IID& a1,\n                                           LPUNKNOWN a2,\n                                           DWORD a3,\n                                           LPVOID a4,\n                                           DWORD a5)\n{\n    _PrintEnter(\"CoGetMarshalSizeMax(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoGetMarshalSizeMax(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"CoGetMarshalSizeMax(,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoGetObject(LPCWSTR a0,\n                                   BIND_OPTS* a1,\n                                   CONST IID& a2,\n                                   void** a3)\n{\n    _PrintEnter(\"CoGetObject(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoGetObject(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CoGetObject(,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoGetPSClsid(CONST IID& a0,\n                                    CLSID* a1)\n{\n    _PrintEnter(\"CoGetPSClsid(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoGetPSClsid(a0, a1);\n    } __finally {\n        _PrintExit(\"CoGetPSClsid(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoGetStandardMarshal(CONST IID& a0,\n                                            LPUNKNOWN a1,\n                                            DWORD a2,\n                                            LPVOID a3,\n                                            DWORD a4,\n                                            IMarshal** a5)\n{\n    _PrintEnter(\"CoGetStandardMarshal(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoGetStandardMarshal(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"CoGetStandardMarshal(,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoGetStdMarshalEx(LPUNKNOWN a0,\n                                         DWORD a1,\n                                         LPUNKNOWN* a2)\n{\n    _PrintEnter(\"CoGetStdMarshalEx(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoGetStdMarshalEx(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CoGetStdMarshalEx(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoGetTreatAsClass(CONST IID& a0,\n                                         LPGUID a1)\n{\n    _PrintEnter(\"CoGetTreatAsClass(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoGetTreatAsClass(a0, a1);\n    } __finally {\n        _PrintExit(\"CoGetTreatAsClass(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoImpersonateClient(void)\n{\n    _PrintEnter(\"CoImpersonateClient()\\n\");\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoImpersonateClient();\n    } __finally {\n        _PrintExit(\"CoImpersonateClient() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoInitialize(LPVOID a0)\n{\n    _PrintEnter(\"CoInitialize(%p)\\n\", a0);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoInitialize(a0);\n    } __finally {\n        _PrintExit(\"CoInitialize() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoInitializeEx(LPVOID a0,\n                                      DWORD a1)\n{\n    _PrintEnter(\"CoInitializeEx(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoInitializeEx(a0, a1);\n    } __finally {\n        _PrintExit(\"CoInitializeEx(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoInitializeSecurity(PSECURITY_DESCRIPTOR a0,\n                                            LONG a1,\n                                            SOLE_AUTHENTICATION_SERVICE* a2,\n                                            void* a3,\n                                            DWORD a4,\n                                            DWORD a5,\n                                            void* a6,\n                                            DWORD a7,\n                                            void* a8)\n{\n    _PrintEnter(\"CoInitializeSecurity(%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoInitializeSecurity(a0, a1, a2, a3, a4, a5, a6, a7, a8);\n    } __finally {\n        _PrintExit(\"CoInitializeSecurity(,,,,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CoIsHandlerConnected(LPUNKNOWN a0)\n{\n    _PrintEnter(\"CoIsHandlerConnected(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CoIsHandlerConnected(a0);\n    } __finally {\n        _PrintExit(\"CoIsHandlerConnected() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CoIsOle1Class(CONST IID& a0)\n{\n    _PrintEnter(\"CoIsOle1Class(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CoIsOle1Class(a0);\n    } __finally {\n        _PrintExit(\"CoIsOle1Class() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHINSTANCE __stdcall Mine_CoLoadLibrary(LPOLESTR a0,\n                                       BOOL a1)\n{\n    _PrintEnter(\"CoLoadLibrary(%p,%p)\\n\", a0, a1);\n\n    HINSTANCE rv = 0;\n    __try {\n        rv = Real_CoLoadLibrary(a0, a1);\n    } __finally {\n        _PrintExit(\"CoLoadLibrary(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoLockObjectExternal(LPUNKNOWN a0,\n                                            BOOL a1,\n                                            BOOL a2)\n{\n    _PrintEnter(\"CoLockObjectExternal(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoLockObjectExternal(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CoLockObjectExternal(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoMarshalHresult(LPSTREAM a0,\n                                        HRESULT a1)\n{\n    _PrintEnter(\"CoMarshalHresult(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoMarshalHresult(a0, a1);\n    } __finally {\n        _PrintExit(\"CoMarshalHresult(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoMarshalInterThreadInterfaceInStream(CONST IID& a0,\n                                                             LPUNKNOWN a1,\n                                                             LPSTREAM* a2)\n{\n    _PrintEnter(\"CoMarshalInterThreadInterfaceInStream(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoMarshalInterThreadInterfaceInStream(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CoMarshalInterThreadInterfaceInStream(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoMarshalInterface(LPSTREAM a0,\n                                          CONST IID& a1,\n                                          LPUNKNOWN a2,\n                                          DWORD a3,\n                                          LPVOID a4,\n                                          DWORD a5)\n{\n    _PrintEnter(\"CoMarshalInterface(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoMarshalInterface(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"CoMarshalInterface(,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoQueryAuthenticationServices(DWORD* a0,\n                                                     SOLE_AUTHENTICATION_SERVICE** a1)\n{\n    _PrintEnter(\"CoQueryAuthenticationServices(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoQueryAuthenticationServices(a0, a1);\n    } __finally {\n        _PrintExit(\"CoQueryAuthenticationServices(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoQueryClientBlanket(DWORD* a0,\n                                            DWORD* a1,\n                                            OLECHAR** a2,\n                                            DWORD* a3,\n                                            DWORD* a4,\n                                            RPC_AUTHZ_HANDLE* a5,\n                                            DWORD* a6)\n{\n    _PrintEnter(\"CoQueryClientBlanket(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoQueryClientBlanket(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"CoQueryClientBlanket(,,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoQueryProxyBlanket(IUnknown* a0,\n                                           DWORD* a1,\n                                           DWORD* a2,\n                                           OLECHAR** a3,\n                                           DWORD* a4,\n                                           DWORD* a5,\n                                           RPC_AUTH_IDENTITY_HANDLE* a6,\n                                           DWORD* a7)\n{\n    _PrintEnter(\"CoQueryProxyBlanket(%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoQueryProxyBlanket(a0, a1, a2, a3, a4, a5, a6, a7);\n    } __finally {\n        _PrintExit(\"CoQueryProxyBlanket(,,,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoRegisterChannelHook(CONST GUID& a0,\n                                             IChannelHook* a1)\n{\n    _PrintEnter(\"CoRegisterChannelHook(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoRegisterChannelHook(a0, a1);\n    } __finally {\n        _PrintExit(\"CoRegisterChannelHook(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoRegisterClassObject(CONST IID& a0,\n                                             LPUNKNOWN a1,\n                                             DWORD a2,\n                                             DWORD a3,\n                                             LPDWORD a4)\n{\n    _PrintEnter(\"CoRegisterClassObject(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoRegisterClassObject(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"CoRegisterClassObject(,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoRegisterMallocSpy(IMallocSpy* a0)\n{\n    _PrintEnter(\"CoRegisterMallocSpy(%p)\\n\", a0);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoRegisterMallocSpy(a0);\n    } __finally {\n        _PrintExit(\"CoRegisterMallocSpy() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoRegisterMessageFilter(LPMESSAGEFILTER a0,\n                                               LPMESSAGEFILTER* a1)\n{\n    _PrintEnter(\"CoRegisterMessageFilter(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoRegisterMessageFilter(a0, a1);\n    } __finally {\n        _PrintExit(\"CoRegisterMessageFilter(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoRegisterPSClsid(CONST IID& a0,\n                                         CONST IID& a1)\n{\n    _PrintEnter(\"CoRegisterPSClsid(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoRegisterPSClsid(a0, a1);\n    } __finally {\n        _PrintExit(\"CoRegisterPSClsid(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoRegisterSurrogate(LPSURROGATE a0)\n{\n    _PrintEnter(\"CoRegisterSurrogate(%p)\\n\", a0);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoRegisterSurrogate(a0);\n    } __finally {\n        _PrintExit(\"CoRegisterSurrogate() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoReleaseMarshalData(LPSTREAM a0)\n{\n    _PrintEnter(\"CoReleaseMarshalData(%p)\\n\", a0);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoReleaseMarshalData(a0);\n    } __finally {\n        _PrintExit(\"CoReleaseMarshalData() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nULONG __stdcall Mine_CoReleaseServerProcess(void)\n{\n    _PrintEnter(\"CoReleaseServerProcess()\\n\");\n\n    ULONG rv = 0;\n    __try {\n        rv = Real_CoReleaseServerProcess();\n    } __finally {\n        _PrintExit(\"CoReleaseServerProcess() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoResumeClassObjects(void)\n{\n    _PrintEnter(\"CoResumeClassObjects()\\n\");\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoResumeClassObjects();\n    } __finally {\n        _PrintExit(\"CoResumeClassObjects() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoRevertToSelf(void)\n{\n    _PrintEnter(\"CoRevertToSelf()\\n\");\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoRevertToSelf();\n    } __finally {\n        _PrintExit(\"CoRevertToSelf() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoRevokeClassObject(DWORD a0)\n{\n    _PrintEnter(\"CoRevokeClassObject(%p)\\n\", a0);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoRevokeClassObject(a0);\n    } __finally {\n        _PrintExit(\"CoRevokeClassObject() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoRevokeMallocSpy(void)\n{\n    _PrintEnter(\"CoRevokeMallocSpy()\\n\");\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoRevokeMallocSpy();\n    } __finally {\n        _PrintExit(\"CoRevokeMallocSpy() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoSetProxyBlanket(IUnknown* a0,\n                                         DWORD a1,\n                                         DWORD a2,\n                                         OLECHAR* a3,\n                                         DWORD a4,\n                                         DWORD a5,\n                                         RPC_AUTH_IDENTITY_HANDLE a6,\n                                         DWORD a7)\n{\n    _PrintEnter(\"CoSetProxyBlanket(%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoSetProxyBlanket(a0, a1, a2, a3, a4, a5, a6, a7);\n    } __finally {\n        _PrintExit(\"CoSetProxyBlanket(,,,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoSuspendClassObjects(void)\n{\n    _PrintEnter(\"CoSuspendClassObjects()\\n\");\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoSuspendClassObjects();\n    } __finally {\n        _PrintExit(\"CoSuspendClassObjects() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoSwitchCallContext(IUnknown* a0,\n                                           IUnknown** a1)\n{\n    _PrintEnter(\"CoSwitchCallContext(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoSwitchCallContext(a0, a1);\n    } __finally {\n        _PrintExit(\"CoSwitchCallContext(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nLPVOID __stdcall Mine_CoTaskMemAlloc(SIZE_T a0)\n{\n    _PrintEnter(\"CoTaskMemAlloc(%p)\\n\", a0);\n\n    LPVOID rv = 0;\n    __try {\n        rv = Real_CoTaskMemAlloc(a0);\n    } __finally {\n        _PrintExit(\"CoTaskMemAlloc() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nvoid __stdcall Mine_CoTaskMemFree(LPVOID a0)\n{\n    _PrintEnter(\"CoTaskMemFree(%p)\\n\", a0);\n\n    __try {\n        Real_CoTaskMemFree(a0);\n    } __finally {\n        _PrintExit(\"CoTaskMemFree() ->\\n\");\n    };\n}\n\nLPVOID __stdcall Mine_CoTaskMemRealloc(LPVOID a0,\n                                       SIZE_T a1)\n{\n    _PrintEnter(\"CoTaskMemRealloc(%p,%p)\\n\", a0, a1);\n\n    LPVOID rv = 0;\n    __try {\n        rv = Real_CoTaskMemRealloc(a0, a1);\n    } __finally {\n        _PrintExit(\"CoTaskMemRealloc(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoTreatAsClass(CONST IID& a0,\n                                      CONST IID& a1)\n{\n    _PrintEnter(\"CoTreatAsClass(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoTreatAsClass(a0, a1);\n    } __finally {\n        _PrintExit(\"CoTreatAsClass(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nvoid __stdcall Mine_CoUninitialize(void)\n{\n    _PrintEnter(\"CoUninitialize()\\n\");\n\n    __try {\n        Real_CoUninitialize();\n    } __finally {\n        _PrintExit(\"CoUninitialize() ->\\n\");\n    };\n}\n\nHRESULT __stdcall Mine_CoUnmarshalHresult(LPSTREAM a0,\n                                          HRESULT* a1)\n{\n    _PrintEnter(\"CoUnmarshalHresult(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoUnmarshalHresult(a0, a1);\n    } __finally {\n        _PrintExit(\"CoUnmarshalHresult(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CoUnmarshalInterface(LPSTREAM a0,\n                                            CONST IID& a1,\n                                            LPVOID* a2)\n{\n    _PrintEnter(\"CoUnmarshalInterface(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CoUnmarshalInterface(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CoUnmarshalInterface(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ColorMatchToTarget(HDC a0,\n                                       HDC a1,\n                                       DWORD a2)\n{\n    _PrintEnter(\"ColorMatchToTarget(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ColorMatchToTarget(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"ColorMatchToTarget(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_CombineRgn(HRGN a0,\n                              HRGN a1,\n                              HRGN a2,\n                              int a3)\n{\n    _PrintEnter(\"CombineRgn(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    int rv = 0;\n    __try {\n        rv = Real_CombineRgn(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CombineRgn(,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CombineTransform(XFORM* a0,\n                                     XFORM* a1,\n                                     XFORM* a2)\n{\n    _PrintEnter(\"CombineTransform(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CombineTransform(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CombineTransform(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CommConfigDialogA(LPCSTR a0,\n                                      HWND a1,\n                                      LPCOMMCONFIG a2)\n{\n    _PrintEnter(\"CommConfigDialogA(%hs,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CommConfigDialogA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CommConfigDialogA(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CommConfigDialogW(LPCWSTR a0,\n                                      HWND a1,\n                                      LPCOMMCONFIG a2)\n{\n    _PrintEnter(\"CommConfigDialogW(%ls,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CommConfigDialogW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CommConfigDialogW(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nLONG __stdcall Mine_CompareFileTime(FILETIME* a0,\n                                    FILETIME* a1)\n{\n    _PrintEnter(\"CompareFileTime(%p,%p)\\n\", a0, a1);\n\n    LONG rv = 0;\n    __try {\n        rv = Real_CompareFileTime(a0, a1);\n    } __finally {\n        _PrintExit(\"CompareFileTime(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_CompareStringA(LCID a0,\n                                  DWORD a1,\n                                  LPCSTR a2,\n                                  int a3,\n                                  LPCSTR a4,\n                                  int a5)\n{\n    _PrintEnter(\"CompareStringA(%p,%p,%hs,%p,%hs,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    int rv = 0;\n    __try {\n        rv = Real_CompareStringA(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"CompareStringA(,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_CompareStringW(LCID a0,\n                                  DWORD a1,\n                                  LPCWSTR a2,\n                                  int a3,\n                                  LPCWSTR a4,\n                                  int a5)\n{\n    _PrintEnter(\"CompareStringW(%p,%p,%ls,%p,%ls,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    int rv = 0;\n    __try {\n        rv = Real_CompareStringW(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"CompareStringW(,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ConnectNamedPipe(HANDLE a0,\n                                     LPOVERLAPPED a1)\n{\n    _PrintEnter(\"ConnectNamedPipe(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ConnectNamedPipe(a0, a1);\n    } __finally {\n        _PrintExit(\"ConnectNamedPipe(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\n#if !defined(DETOURS_ARM)\nBOOL __stdcall Mine_ContinueDebugEvent(DWORD a0,\n                                       DWORD a1,\n                                       DWORD a2)\n{\n    _PrintEnter(\"ContinueDebugEvent(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ContinueDebugEvent(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"ContinueDebugEvent(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n#endif // !DETOURS_ARM\n\nLCID __stdcall Mine_ConvertDefaultLocale(LCID a0)\n{\n    _PrintEnter(\"ConvertDefaultLocale(%p)\\n\", a0);\n\n    LCID rv = 0;\n    __try {\n        rv = Real_ConvertDefaultLocale(a0);\n    } __finally {\n        _PrintExit(\"ConvertDefaultLocale() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nLPVOID __stdcall Mine_ConvertThreadToFiber(LPVOID a0)\n{\n    _PrintEnter(\"ConvertThreadToFiber(%p)\\n\", a0);\n\n    LPVOID rv = 0;\n    __try {\n        rv = Real_ConvertThreadToFiber(a0);\n    } __finally {\n        _PrintExit(\"ConvertThreadToFiber() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_CopyAcceleratorTableA(HACCEL a0,\n                                         ACCEL* a1,\n                                         int a2)\n{\n    _PrintEnter(\"CopyAcceleratorTableA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_CopyAcceleratorTableA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CopyAcceleratorTableA(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_CopyAcceleratorTableW(HACCEL a0,\n                                         ACCEL* a1,\n                                         int a2)\n{\n    _PrintEnter(\"CopyAcceleratorTableW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_CopyAcceleratorTableW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CopyAcceleratorTableW(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHENHMETAFILE __stdcall Mine_CopyEnhMetaFileA(HENHMETAFILE a0,\n                                             LPCSTR a1)\n{\n    _PrintEnter(\"CopyEnhMetaFileA(%p,%hs)\\n\", a0, a1);\n\n    HENHMETAFILE rv = 0;\n    __try {\n        rv = Real_CopyEnhMetaFileA(a0, a1);\n    } __finally {\n        _PrintExit(\"CopyEnhMetaFileA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHENHMETAFILE __stdcall Mine_CopyEnhMetaFileW(HENHMETAFILE a0,\n                                             LPCWSTR a1)\n{\n    _PrintEnter(\"CopyEnhMetaFileW(%p,%ls)\\n\", a0, a1);\n\n    HENHMETAFILE rv = 0;\n    __try {\n        rv = Real_CopyEnhMetaFileW(a0, a1);\n    } __finally {\n        _PrintExit(\"CopyEnhMetaFileW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CopyFileA(LPCSTR a0,\n                              LPCSTR a1,\n                              BOOL a2)\n{\n    _PrintEnter(\"CopyFileA(%hs,%hs,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CopyFileA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CopyFileA(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CopyFileExA(LPCSTR a0,\n                                LPCSTR a1,\n                                LPPROGRESS_ROUTINE a2,\n                                LPVOID a3,\n                                LPBOOL a4,\n                                DWORD a5)\n{\n    _PrintEnter(\"CopyFileExA(%hs,%hs,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CopyFileExA(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"CopyFileExA(,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CopyFileExW(LPCWSTR a0,\n                                LPCWSTR a1,\n                                LPPROGRESS_ROUTINE a2,\n                                LPVOID a3,\n                                LPBOOL a4,\n                                DWORD a5)\n{\n    _PrintEnter(\"CopyFileExW(%ls,%ls,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CopyFileExW(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"CopyFileExW(,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CopyFileW(LPCWSTR a0,\n                              LPCWSTR a1,\n                              BOOL a2)\n{\n    _PrintEnter(\"CopyFileW(%ls,%ls,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CopyFileW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CopyFileW(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHICON __stdcall Mine_CopyIcon(HICON a0)\n{\n    _PrintEnter(\"CopyIcon(%p)\\n\", a0);\n\n    HICON rv = 0;\n    __try {\n        rv = Real_CopyIcon(a0);\n    } __finally {\n        _PrintExit(\"CopyIcon() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_CopyImage(HANDLE a0,\n                                UINT a1,\n                                int a2,\n                                int a3,\n                                UINT a4)\n{\n    _PrintEnter(\"CopyImage(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_CopyImage(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"CopyImage(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHMETAFILE __stdcall Mine_CopyMetaFileA(HMETAFILE a0,\n                                       LPCSTR a1)\n{\n    _PrintEnter(\"CopyMetaFileA(%p,%hs)\\n\", a0, a1);\n\n    HMETAFILE rv = 0;\n    __try {\n        rv = Real_CopyMetaFileA(a0, a1);\n    } __finally {\n        _PrintExit(\"CopyMetaFileA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHMETAFILE __stdcall Mine_CopyMetaFileW(HMETAFILE a0,\n                                       LPCWSTR a1)\n{\n    _PrintEnter(\"CopyMetaFileW(%p,%ls)\\n\", a0, a1);\n\n    HMETAFILE rv = 0;\n    __try {\n        rv = Real_CopyMetaFileW(a0, a1);\n    } __finally {\n        _PrintExit(\"CopyMetaFileW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CopyRect(LPRECT a0,\n                             RECT* a1)\n{\n    _PrintEnter(\"CopyRect(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CopyRect(a0, a1);\n    } __finally {\n        _PrintExit(\"CopyRect(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_CountClipboardFormats(void)\n{\n    _PrintEnter(\"CountClipboardFormats()\\n\");\n\n    int rv = 0;\n    __try {\n        rv = Real_CountClipboardFormats();\n    } __finally {\n        _PrintExit(\"CountClipboardFormats() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHACCEL __stdcall Mine_CreateAcceleratorTableA(ACCEL* a0,\n                                              int a1)\n{\n    _PrintEnter(\"CreateAcceleratorTableA(%p,%p)\\n\", a0, a1);\n\n    HACCEL rv = 0;\n    __try {\n        rv = Real_CreateAcceleratorTableA(a0, a1);\n    } __finally {\n        _PrintExit(\"CreateAcceleratorTableA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHACCEL __stdcall Mine_CreateAcceleratorTableW(ACCEL* a0,\n                                              int a1)\n{\n    _PrintEnter(\"CreateAcceleratorTableW(%p,%p)\\n\", a0, a1);\n\n    HACCEL rv = 0;\n    __try {\n        rv = Real_CreateAcceleratorTableW(a0, a1);\n    } __finally {\n        _PrintExit(\"CreateAcceleratorTableW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CreateAntiMoniker(IMoniker** a0)\n{\n    _PrintEnter(\"CreateAntiMoniker(%p)\\n\", a0);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CreateAntiMoniker(a0);\n    } __finally {\n        _PrintExit(\"CreateAntiMoniker() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CreateBindCtx(DWORD a0,\n                                     IBindCtx** a1)\n{\n    _PrintEnter(\"CreateBindCtx(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CreateBindCtx(a0, a1);\n    } __finally {\n        _PrintExit(\"CreateBindCtx(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHBITMAP __stdcall Mine_CreateBitmap(int a0,\n                                    int a1,\n                                    UINT a2,\n                                    UINT a3,\n                                    void* a4)\n{\n    _PrintEnter(\"CreateBitmap(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    HBITMAP rv = 0;\n    __try {\n        rv = Real_CreateBitmap(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"CreateBitmap(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHBITMAP __stdcall Mine_CreateBitmapIndirect(BITMAP* a0)\n{\n    _PrintEnter(\"CreateBitmapIndirect(%p)\\n\", a0);\n\n    HBITMAP rv = 0;\n    __try {\n        rv = Real_CreateBitmapIndirect(a0);\n    } __finally {\n        _PrintExit(\"CreateBitmapIndirect() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHBRUSH __stdcall Mine_CreateBrushIndirect(LOGBRUSH* a0)\n{\n    _PrintEnter(\"CreateBrushIndirect(%p)\\n\", a0);\n\n    HBRUSH rv = 0;\n    __try {\n        rv = Real_CreateBrushIndirect(a0);\n    } __finally {\n        _PrintExit(\"CreateBrushIndirect() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CreateCaret(HWND a0,\n                                HBITMAP a1,\n                                int a2,\n                                int a3)\n{\n    _PrintEnter(\"CreateCaret(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CreateCaret(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CreateCaret(,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CreateClassMoniker(CONST IID& a0,\n                                          IMoniker** a1)\n{\n    _PrintEnter(\"CreateClassMoniker(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CreateClassMoniker(a0, a1);\n    } __finally {\n        _PrintExit(\"CreateClassMoniker(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHCOLORSPACE __stdcall Mine_CreateColorSpaceA(LOGCOLORSPACEA* a0)\n{\n    _PrintEnter(\"CreateColorSpaceA(%p)\\n\", a0);\n\n    HCOLORSPACE rv = 0;\n    __try {\n        rv = Real_CreateColorSpaceA(a0);\n    } __finally {\n        _PrintExit(\"CreateColorSpaceA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHCOLORSPACE __stdcall Mine_CreateColorSpaceW(LOGCOLORSPACEW* a0)\n{\n    _PrintEnter(\"CreateColorSpaceW(%p)\\n\", a0);\n\n    HCOLORSPACE rv = 0;\n    __try {\n        rv = Real_CreateColorSpaceW(a0);\n    } __finally {\n        _PrintExit(\"CreateColorSpaceW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHBITMAP __stdcall Mine_CreateCompatibleBitmap(HDC a0,\n                                              int a1,\n                                              int a2)\n{\n    _PrintEnter(\"CreateCompatibleBitmap(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HBITMAP rv = 0;\n    __try {\n        rv = Real_CreateCompatibleBitmap(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CreateCompatibleBitmap(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHDC __stdcall Mine_CreateCompatibleDC(HDC a0)\n{\n    _PrintEnter(\"CreateCompatibleDC(%p)\\n\", a0);\n\n    HDC rv = 0;\n    __try {\n        rv = Real_CreateCompatibleDC(a0);\n    } __finally {\n        _PrintExit(\"CreateCompatibleDC() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_CreateConsoleScreenBuffer(DWORD a0,\n                                                DWORD a1,\n                                                SECURITY_ATTRIBUTES* a2,\n                                                DWORD a3,\n                                                LPVOID a4)\n{\n    _PrintEnter(\"CreateConsoleScreenBuffer(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_CreateConsoleScreenBuffer(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"CreateConsoleScreenBuffer(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHCURSOR __stdcall Mine_CreateCursor(HINSTANCE a0,\n                                    int a1,\n                                    int a2,\n                                    int a3,\n                                    int a4,\n                                    void* a5,\n                                    void* a6)\n{\n    _PrintEnter(\"CreateCursor(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    HCURSOR rv = 0;\n    __try {\n        rv = Real_CreateCursor(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"CreateCursor(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHDC __stdcall Mine_CreateDCA(LPCSTR a0,\n                             LPCSTR a1,\n                             LPCSTR a2,\n                             CONST DEVMODEA* a3)\n{\n    _PrintEnter(\"CreateDCA(%hs,%hs,%hs,%p)\\n\", a0, a1, a2, a3);\n\n    HDC rv = 0;\n    __try {\n        rv = Real_CreateDCA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CreateDCA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHDC __stdcall Mine_CreateDCW(LPCWSTR a0,\n                             LPCWSTR a1,\n                             LPCWSTR a2,\n                             CONST DEVMODEW* a3)\n{\n    _PrintEnter(\"CreateDCW(%ls,%ls,%ls,%p)\\n\", a0, a1, a2, a3);\n\n    HDC rv = 0;\n    __try {\n        rv = Real_CreateDCW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CreateDCW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHBRUSH __stdcall Mine_CreateDIBPatternBrush(HGLOBAL a0,\n                                            UINT a1)\n{\n    _PrintEnter(\"CreateDIBPatternBrush(%p,%p)\\n\", a0, a1);\n\n    HBRUSH rv = 0;\n    __try {\n        rv = Real_CreateDIBPatternBrush(a0, a1);\n    } __finally {\n        _PrintExit(\"CreateDIBPatternBrush(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHBRUSH __stdcall Mine_CreateDIBPatternBrushPt(void* a0,\n                                              UINT a1)\n{\n    _PrintEnter(\"CreateDIBPatternBrushPt(%p,%p)\\n\", a0, a1);\n\n    HBRUSH rv = 0;\n    __try {\n        rv = Real_CreateDIBPatternBrushPt(a0, a1);\n    } __finally {\n        _PrintExit(\"CreateDIBPatternBrushPt(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHBITMAP __stdcall Mine_CreateDIBSection(HDC a0,\n                                        BITMAPINFO* a1,\n                                        UINT a2,\n                                        void** a3,\n                                        HANDLE a4,\n                                        DWORD a5)\n{\n    _PrintEnter(\"CreateDIBSection(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    HBITMAP rv = 0;\n    __try {\n        rv = Real_CreateDIBSection(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"CreateDIBSection(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHBITMAP __stdcall Mine_CreateDIBitmap(HDC a0,\n                                      BITMAPINFOHEADER* a1,\n                                      DWORD a2,\n                                      void* a3,\n                                      BITMAPINFO* a4,\n                                      UINT a5)\n{\n    _PrintEnter(\"CreateDIBitmap(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    HBITMAP rv = 0;\n    __try {\n        rv = Real_CreateDIBitmap(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"CreateDIBitmap(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CreateDataAdviseHolder(LPDATAADVISEHOLDER* a0)\n{\n    _PrintEnter(\"CreateDataAdviseHolder(%p)\\n\", a0);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CreateDataAdviseHolder(a0);\n    } __finally {\n        _PrintExit(\"CreateDataAdviseHolder() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CreateDataCache(LPUNKNOWN a0,\n                                       CONST IID& a1,\n                                       CONST IID& a2,\n                                       LPVOID* a3)\n{\n    _PrintEnter(\"CreateDataCache(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CreateDataCache(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CreateDataCache(,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\n#if _MSC_VER < 1300\nHDESK __stdcall Mine_CreateDesktopA(LPSTR a0,\n                                    LPSTR a1,\n                                    LPDEVMODEA a2,\n                                    DWORD a3,\n                                    ACCESS_MASK a4,\n                                    LPSECURITY_ATTRIBUTES a5)\n#else\nHDESK __stdcall Mine_CreateDesktopA(LPCSTR a0,\n                                    LPCSTR a1,\n                                    LPDEVMODEA a2,\n                                    DWORD a3,\n                                    ACCESS_MASK a4,\n                                    LPSECURITY_ATTRIBUTES a5)\n#endif\n{\n    _PrintEnter(\"CreateDesktopA(%hs,%hs,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    HDESK rv = 0;\n    __try {\n        rv = Real_CreateDesktopA(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"CreateDesktopA(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\n#if _MSC_VER < 1300\nHDESK __stdcall Mine_CreateDesktopW(LPWSTR a0, // NT 3.51 and older. NT4?\n                                    LPWSTR a1, // NT 3.51 and older. NT4?\n                                    LPDEVMODEW a2,\n                                    DWORD a3,\n                                    ACCESS_MASK a4,\n                                    LPSECURITY_ATTRIBUTES a5)\n#else\nHDESK __stdcall Mine_CreateDesktopW(LPCWSTR a0, // Windows 2000 and newer; NT4?\n                                    LPCWSTR a1, // Windows 2000 and newer; NT4?\n                                    LPDEVMODEW a2,\n                                    DWORD a3,\n                                    ACCESS_MASK a4,\n                                    LPSECURITY_ATTRIBUTES a5)\n#endif\n{\n    _PrintEnter(\"CreateDesktopW(%ls,%ls,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    HDESK rv = 0;\n    __try {\n        rv = Real_CreateDesktopW(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"CreateDesktopW(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_CreateDialogIndirectParamA(HINSTANCE a0,\n                                               LPCDLGTEMPLATEA a1,\n                                               HWND a2,\n                                               DLGPROC a3,\n                                               LPARAM a4)\n{\n    _PrintEnter(\"CreateDialogIndirectParamA(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    HWND rv = 0;\n    __try {\n        rv = Real_CreateDialogIndirectParamA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"CreateDialogIndirectParamA(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_CreateDialogIndirectParamW(HINSTANCE a0,\n                                               LPCDLGTEMPLATEW a1,\n                                               HWND a2,\n                                               DLGPROC a3,\n                                               LPARAM a4)\n{\n    _PrintEnter(\"CreateDialogIndirectParamW(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    HWND rv = 0;\n    __try {\n        rv = Real_CreateDialogIndirectParamW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"CreateDialogIndirectParamW(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_CreateDialogParamA(HINSTANCE a0,\n                                       LPCSTR a1,\n                                       HWND a2,\n                                       DLGPROC a3,\n                                       LPARAM a4)\n{\n    _PrintEnter(\"CreateDialogParamA(%p,%hs,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    HWND rv = 0;\n    __try {\n        rv = Real_CreateDialogParamA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"CreateDialogParamA(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_CreateDialogParamW(HINSTANCE a0,\n                                       LPCWSTR a1,\n                                       HWND a2,\n                                       DLGPROC a3,\n                                       LPARAM a4)\n{\n    _PrintEnter(\"CreateDialogParamW(%p,%ls,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    HWND rv = 0;\n    __try {\n        rv = Real_CreateDialogParamW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"CreateDialogParamW(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CreateDirectoryA(LPCSTR a0,\n                                     LPSECURITY_ATTRIBUTES a1)\n{\n    _PrintEnter(\"CreateDirectoryA(%hs,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CreateDirectoryA(a0, a1);\n    } __finally {\n        _PrintExit(\"CreateDirectoryA(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CreateDirectoryExA(LPCSTR a0,\n                                       LPCSTR a1,\n                                       LPSECURITY_ATTRIBUTES a2)\n{\n    _PrintEnter(\"CreateDirectoryExA(%hs,%hs,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CreateDirectoryExA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CreateDirectoryExA(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CreateDirectoryExW(LPCWSTR a0,\n                                       LPCWSTR a1,\n                                       LPSECURITY_ATTRIBUTES a2)\n{\n    _PrintEnter(\"CreateDirectoryExW(%ls,%ls,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CreateDirectoryExW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CreateDirectoryExW(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CreateDirectoryW(LPCWSTR a0,\n                                     LPSECURITY_ATTRIBUTES a1)\n{\n    _PrintEnter(\"CreateDirectoryW(%ls,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CreateDirectoryW(a0, a1);\n    } __finally {\n        _PrintExit(\"CreateDirectoryW(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHBITMAP __stdcall Mine_CreateDiscardableBitmap(HDC a0,\n                                               int a1,\n                                               int a2)\n{\n    _PrintEnter(\"CreateDiscardableBitmap(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HBITMAP rv = 0;\n    __try {\n        rv = Real_CreateDiscardableBitmap(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CreateDiscardableBitmap(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRGN __stdcall Mine_CreateEllipticRgn(int a0,\n                                      int a1,\n                                      int a2,\n                                      int a3)\n{\n    _PrintEnter(\"CreateEllipticRgn(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HRGN rv = 0;\n    __try {\n        rv = Real_CreateEllipticRgn(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CreateEllipticRgn(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRGN __stdcall Mine_CreateEllipticRgnIndirect(RECT* a0)\n{\n    _PrintEnter(\"CreateEllipticRgnIndirect(%p)\\n\", a0);\n\n    HRGN rv = 0;\n    __try {\n        rv = Real_CreateEllipticRgnIndirect(a0);\n    } __finally {\n        _PrintExit(\"CreateEllipticRgnIndirect() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHDC __stdcall Mine_CreateEnhMetaFileA(HDC a0,\n                                      LPCSTR a1,\n                                      RECT* a2,\n                                      LPCSTR a3)\n{\n    _PrintEnter(\"CreateEnhMetaFileA(%p,%hs,%p,%hs)\\n\", a0, a1, a2, a3);\n\n    HDC rv = 0;\n    __try {\n        rv = Real_CreateEnhMetaFileA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CreateEnhMetaFileA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHDC __stdcall Mine_CreateEnhMetaFileW(HDC a0,\n                                      LPCWSTR a1,\n                                      RECT* a2,\n                                      LPCWSTR a3)\n{\n    _PrintEnter(\"CreateEnhMetaFileW(%p,%ls,%p,%ls)\\n\", a0, a1, a2, a3);\n\n    HDC rv = 0;\n    __try {\n        rv = Real_CreateEnhMetaFileW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CreateEnhMetaFileW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_CreateEventA(LPSECURITY_ATTRIBUTES a0,\n                                   BOOL a1,\n                                   BOOL a2,\n                                   LPCSTR a3)\n{\n    _PrintEnter(\"CreateEventA(%p,%p,%p,%hs)\\n\", a0, a1, a2, a3);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_CreateEventA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CreateEventA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_CreateEventW(LPSECURITY_ATTRIBUTES a0,\n                                   BOOL a1,\n                                   BOOL a2,\n                                   LPCWSTR a3)\n{\n    _PrintEnter(\"CreateEventW(%p,%p,%p,%ls)\\n\", a0, a1, a2, a3);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_CreateEventW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CreateEventW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLPVOID __stdcall Mine_CreateFiber(ULONG_PTR a0,\n                                  LPFIBER_START_ROUTINE a1,\n                                  LPVOID a2)\n{\n    _PrintEnter(\"CreateFiber(%p,%p,%p)\\n\", a0, a1, a2);\n\n    LPVOID rv = 0;\n    __try {\n        rv = Real_CreateFiber(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CreateFiber(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_CreateFileA(LPCSTR a0,\n                                  DWORD a1,\n                                  DWORD a2,\n                                  LPSECURITY_ATTRIBUTES a3,\n                                  DWORD a4,\n                                  DWORD a5,\n                                  HANDLE a6)\n{\n    _PrintEnter(\"CreateFileA(%hs,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_CreateFileA(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"CreateFileA(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_CreateFileMappingA(HANDLE a0,\n                                         LPSECURITY_ATTRIBUTES a1,\n                                         DWORD a2,\n                                         DWORD a3,\n                                         DWORD a4,\n                                         LPCSTR a5)\n{\n    _PrintEnter(\"CreateFileMappingA(%p,%p,%p,%p,%p,%hs)\\n\", a0, a1, a2, a3, a4, a5);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_CreateFileMappingA(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"CreateFileMappingA(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_CreateFileMappingW(HANDLE a0,\n                                         LPSECURITY_ATTRIBUTES a1,\n                                         DWORD a2,\n                                         DWORD a3,\n                                         DWORD a4,\n                                         LPCWSTR a5)\n{\n    _PrintEnter(\"CreateFileMappingW(%p,%p,%p,%p,%p,%ls)\\n\", a0, a1, a2, a3, a4, a5);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_CreateFileMappingW(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"CreateFileMappingW(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CreateFileMoniker(LPCOLESTR a0,\n                                         IMoniker** a1)\n{\n    _PrintEnter(\"CreateFileMoniker(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CreateFileMoniker(a0, a1);\n    } __finally {\n        _PrintExit(\"CreateFileMoniker(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_CreateFileW(LPCWSTR a0,\n                                  DWORD a1,\n                                  DWORD a2,\n                                  LPSECURITY_ATTRIBUTES a3,\n                                  DWORD a4,\n                                  DWORD a5,\n                                  HANDLE a6)\n{\n    _PrintEnter(\"CreateFileW(%ls,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_CreateFileW(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"CreateFileW(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHFONT __stdcall Mine_CreateFontA(int a0,\n                                 int a1,\n                                 int a2,\n                                 int a3,\n                                 int a4,\n                                 DWORD a5,\n                                 DWORD a6,\n                                 DWORD a7,\n                                 DWORD a8,\n                                 DWORD a9,\n                                 DWORD a10,\n                                 DWORD a11,\n                                 DWORD a12,\n                                 LPCSTR a13)\n{\n    _PrintEnter(\"CreateFontA(%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%hs)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13);\n\n    HFONT rv = 0;\n    __try {\n        rv = Real_CreateFontA(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13);\n    } __finally {\n        _PrintExit(\"CreateFontA(,,,,,,,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHFONT __stdcall Mine_CreateFontIndirectA(LOGFONTA* a0)\n{\n    _PrintEnter(\"CreateFontIndirectA(%p)\\n\", a0);\n\n    HFONT rv = 0;\n    __try {\n        rv = Real_CreateFontIndirectA(a0);\n    } __finally {\n        _PrintExit(\"CreateFontIndirectA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHFONT __stdcall Mine_CreateFontIndirectW(LOGFONTW* a0)\n{\n    _PrintEnter(\"CreateFontIndirectW(%p)\\n\", a0);\n\n    HFONT rv = 0;\n    __try {\n        rv = Real_CreateFontIndirectW(a0);\n    } __finally {\n        _PrintExit(\"CreateFontIndirectW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHFONT __stdcall Mine_CreateFontW(int a0,\n                                 int a1,\n                                 int a2,\n                                 int a3,\n                                 int a4,\n                                 DWORD a5,\n                                 DWORD a6,\n                                 DWORD a7,\n                                 DWORD a8,\n                                 DWORD a9,\n                                 DWORD a10,\n                                 DWORD a11,\n                                 DWORD a12,\n                                 LPCWSTR a13)\n{\n    _PrintEnter(\"CreateFontW(%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%ls)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13);\n\n    HFONT rv = 0;\n    __try {\n        rv = Real_CreateFontW(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13);\n    } __finally {\n        _PrintExit(\"CreateFontW(,,,,,,,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CreateGenericComposite(IMoniker* a0,\n                                              IMoniker* a1,\n                                              IMoniker** a2)\n{\n    _PrintEnter(\"CreateGenericComposite(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CreateGenericComposite(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CreateGenericComposite(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHPALETTE __stdcall Mine_CreateHalftonePalette(HDC a0)\n{\n    _PrintEnter(\"CreateHalftonePalette(%p)\\n\", a0);\n\n    HPALETTE rv = 0;\n    __try {\n        rv = Real_CreateHalftonePalette(a0);\n    } __finally {\n        _PrintExit(\"CreateHalftonePalette() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHBRUSH __stdcall Mine_CreateHatchBrush(int a0,\n                                       COLORREF a1)\n{\n    _PrintEnter(\"CreateHatchBrush(%p,%p)\\n\", a0, a1);\n\n    HBRUSH rv = 0;\n    __try {\n        rv = Real_CreateHatchBrush(a0, a1);\n    } __finally {\n        _PrintExit(\"CreateHatchBrush(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHDC __stdcall Mine_CreateICA(LPCSTR a0,\n                             LPCSTR a1,\n                             LPCSTR a2,\n                             CONST DEVMODEA* a3)\n{\n    _PrintEnter(\"CreateICA(%hs,%hs,%hs,%p)\\n\", a0, a1, a2, a3);\n\n    HDC rv = 0;\n    __try {\n        rv = Real_CreateICA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CreateICA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHDC __stdcall Mine_CreateICW(LPCWSTR a0,\n                             LPCWSTR a1,\n                             LPCWSTR a2,\n                             CONST DEVMODEW* a3)\n{\n    _PrintEnter(\"CreateICW(%ls,%ls,%ls,%p)\\n\", a0, a1, a2, a3);\n\n    HDC rv = 0;\n    __try {\n        rv = Real_CreateICW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CreateICW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CreateILockBytesOnHGlobal(HGLOBAL a0,\n                                                 BOOL a1,\n                                                 ILockBytes** a2)\n{\n    _PrintEnter(\"CreateILockBytesOnHGlobal(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CreateILockBytesOnHGlobal(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CreateILockBytesOnHGlobal(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHICON __stdcall Mine_CreateIcon(HINSTANCE a0,\n                                int a1,\n                                int a2,\n                                BYTE a3,\n                                BYTE a4,\n                                BYTE* a5,\n                                BYTE* a6)\n{\n    _PrintEnter(\"CreateIcon(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    HICON rv = 0;\n    __try {\n        rv = Real_CreateIcon(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"CreateIcon(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHICON __stdcall Mine_CreateIconFromResource(PBYTE a0,\n                                            DWORD a1,\n                                            BOOL a2,\n                                            DWORD a3)\n{\n    _PrintEnter(\"CreateIconFromResource(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HICON rv = 0;\n    __try {\n        rv = Real_CreateIconFromResource(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CreateIconFromResource(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHICON __stdcall Mine_CreateIconFromResourceEx(PBYTE a0,\n                                              DWORD a1,\n                                              BOOL a2,\n                                              DWORD a3,\n                                              int a4,\n                                              int a5,\n                                              UINT a6)\n{\n    _PrintEnter(\"CreateIconFromResourceEx(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    HICON rv = 0;\n    __try {\n        rv = Real_CreateIconFromResourceEx(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"CreateIconFromResourceEx(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHICON __stdcall Mine_CreateIconIndirect(PICONINFO a0)\n{\n    _PrintEnter(\"CreateIconIndirect(%p)\\n\", a0);\n\n    HICON rv = 0;\n    __try {\n        rv = Real_CreateIconIndirect(a0);\n    } __finally {\n        _PrintExit(\"CreateIconIndirect() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_CreateIoCompletionPort(HANDLE a0,\n                                             HANDLE a1,\n                                             ULONG_PTR a2,\n                                             DWORD a3)\n{\n    _PrintEnter(\"CreateIoCompletionPort(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_CreateIoCompletionPort(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CreateIoCompletionPort(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CreateItemMoniker(LPCOLESTR a0,\n                                         LPCOLESTR a1,\n                                         IMoniker** a2)\n{\n    _PrintEnter(\"CreateItemMoniker(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CreateItemMoniker(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CreateItemMoniker(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\n#if _MSC_VER < 1300\nHWND __stdcall Mine_CreateMDIWindowA(LPSTR a0, // NT 3.51 and older. NT4?\n                                     LPSTR a1, // NT 3.51 and older. NT4?\n                                     DWORD a2,\n                                     int a3,\n                                     int a4,\n                                     int a5,\n                                     int a6,\n                                     HWND a7,\n                                     HINSTANCE a8,\n                                     LPARAM a9)\n#else\nHWND __stdcall Mine_CreateMDIWindowA(LPCSTR a0, // Windows 2000 and newer; NT4?\n                                     LPCSTR a1, // Windows 2000 and newer; NT4?\n                                     DWORD a2,\n                                     int a3,\n                                     int a4,\n                                     int a5,\n                                     int a6,\n                                     HWND a7,\n                                     HINSTANCE a8,\n                                     LPARAM a9)\n#endif\n{\n    _PrintEnter(\"CreateMDIWindowA(%hs,%hs,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);\n\n    HWND rv = 0;\n    __try {\n        rv = Real_CreateMDIWindowA(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);\n    } __finally {\n        _PrintExit(\"CreateMDIWindowA(,,,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\n#if _MSC_VER < 1300\nHWND __stdcall Mine_CreateMDIWindowW(LPWSTR a0,\n                                     LPWSTR a1,\n                                     DWORD a2,\n                                     int a3,\n                                     int a4,\n                                     int a5,\n                                     int a6,\n                                     HWND a7,\n                                     HINSTANCE a8,\n                                     LPARAM a9)\n#else\nHWND __stdcall Mine_CreateMDIWindowW(LPCWSTR a0,\n                                     LPCWSTR a1,\n                                     DWORD a2,\n                                     int a3,\n                                     int a4,\n                                     int a5,\n                                     int a6,\n                                     HWND a7,\n                                     HINSTANCE a8,\n                                     LPARAM a9)\n#endif\n{\n    _PrintEnter(\"CreateMDIWindowW(%ls,%ls,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);\n\n    HWND rv = 0;\n    __try {\n        rv = Real_CreateMDIWindowW(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);\n    } __finally {\n        _PrintExit(\"CreateMDIWindowW(,,,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_CreateMailslotA(LPCSTR a0,\n                                      DWORD a1,\n                                      DWORD a2,\n                                      LPSECURITY_ATTRIBUTES a3)\n{\n    _PrintEnter(\"CreateMailslotA(%hs,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_CreateMailslotA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CreateMailslotA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_CreateMailslotW(LPCWSTR a0,\n                                      DWORD a1,\n                                      DWORD a2,\n                                      LPSECURITY_ATTRIBUTES a3)\n{\n    _PrintEnter(\"CreateMailslotW(%ls,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_CreateMailslotW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CreateMailslotW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHMENU __stdcall Mine_CreateMenu(void)\n{\n    _PrintEnter(\"CreateMenu()\\n\");\n\n    HMENU rv = 0;\n    __try {\n        rv = Real_CreateMenu();\n    } __finally {\n        _PrintExit(\"CreateMenu() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHDC __stdcall Mine_CreateMetaFileA(LPCSTR a0)\n{\n    _PrintEnter(\"CreateMetaFileA(%hs)\\n\", a0);\n\n    HDC rv = 0;\n    __try {\n        rv = Real_CreateMetaFileA(a0);\n    } __finally {\n        _PrintExit(\"CreateMetaFileA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHDC __stdcall Mine_CreateMetaFileW(LPCWSTR a0)\n{\n    _PrintEnter(\"CreateMetaFileW(%ls)\\n\", a0);\n\n    HDC rv = 0;\n    __try {\n        rv = Real_CreateMetaFileW(a0);\n    } __finally {\n        _PrintExit(\"CreateMetaFileW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_CreateMutexA(LPSECURITY_ATTRIBUTES a0,\n                                   BOOL a1,\n                                   LPCSTR a2)\n{\n    _PrintEnter(\"CreateMutexA(%p,%p,%hs)\\n\", a0, a1, a2);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_CreateMutexA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CreateMutexA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_CreateMutexW(LPSECURITY_ATTRIBUTES a0,\n                                   BOOL a1,\n                                   LPCWSTR a2)\n{\n    _PrintEnter(\"CreateMutexW(%p,%p,%ls)\\n\", a0, a1, a2);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_CreateMutexW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CreateMutexW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_CreateNamedPipeA(LPCSTR a0,\n                                       DWORD a1,\n                                       DWORD a2,\n                                       DWORD a3,\n                                       DWORD a4,\n                                       DWORD a5,\n                                       DWORD a6,\n                                       LPSECURITY_ATTRIBUTES a7)\n{\n    _PrintEnter(\"CreateNamedPipeA(%hs,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_CreateNamedPipeA(a0, a1, a2, a3, a4, a5, a6, a7);\n    } __finally {\n        _PrintExit(\"CreateNamedPipeA(,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_CreateNamedPipeW(LPCWSTR a0,\n                                       DWORD a1,\n                                       DWORD a2,\n                                       DWORD a3,\n                                       DWORD a4,\n                                       DWORD a5,\n                                       DWORD a6,\n                                       LPSECURITY_ATTRIBUTES a7)\n{\n    _PrintEnter(\"CreateNamedPipeW(%ls,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_CreateNamedPipeW(a0, a1, a2, a3, a4, a5, a6, a7);\n    } __finally {\n        _PrintExit(\"CreateNamedPipeW(,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CreateOleAdviseHolder(LPOLEADVISEHOLDER* a0)\n{\n    _PrintEnter(\"CreateOleAdviseHolder(%p)\\n\", a0);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CreateOleAdviseHolder(a0);\n    } __finally {\n        _PrintExit(\"CreateOleAdviseHolder() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHPALETTE __stdcall Mine_CreatePalette(LOGPALETTE* a0)\n{\n    _PrintEnter(\"CreatePalette(%p)\\n\", a0);\n\n    HPALETTE rv = 0;\n    __try {\n        rv = Real_CreatePalette(a0);\n    } __finally {\n        _PrintExit(\"CreatePalette() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHBRUSH __stdcall Mine_CreatePatternBrush(HBITMAP a0)\n{\n    _PrintEnter(\"CreatePatternBrush(%p)\\n\", a0);\n\n    HBRUSH rv = 0;\n    __try {\n        rv = Real_CreatePatternBrush(a0);\n    } __finally {\n        _PrintExit(\"CreatePatternBrush() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHPEN __stdcall Mine_CreatePen(int a0,\n                              int a1,\n                              COLORREF a2)\n{\n    _PrintEnter(\"CreatePen(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HPEN rv = 0;\n    __try {\n        rv = Real_CreatePen(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CreatePen(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHPEN __stdcall Mine_CreatePenIndirect(LOGPEN* a0)\n{\n    _PrintEnter(\"CreatePenIndirect(%p)\\n\", a0);\n\n    HPEN rv = 0;\n    __try {\n        rv = Real_CreatePenIndirect(a0);\n    } __finally {\n        _PrintExit(\"CreatePenIndirect() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CreatePipe(PHANDLE a0,\n                               PHANDLE a1,\n                               LPSECURITY_ATTRIBUTES a2,\n                               DWORD a3)\n{\n    _PrintEnter(\"CreatePipe(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CreatePipe(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CreatePipe(,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CreatePointerMoniker(LPUNKNOWN a0,\n                                            IMoniker** a1)\n{\n    _PrintEnter(\"CreatePointerMoniker(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CreatePointerMoniker(a0, a1);\n    } __finally {\n        _PrintExit(\"CreatePointerMoniker(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHRGN __stdcall Mine_CreatePolyPolygonRgn(POINT* a0,\n                                         INT* a1,\n                                         int a2,\n                                         int a3)\n{\n    _PrintEnter(\"CreatePolyPolygonRgn(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HRGN rv = 0;\n    __try {\n        rv = Real_CreatePolyPolygonRgn(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CreatePolyPolygonRgn(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRGN __stdcall Mine_CreatePolygonRgn(POINT* a0,\n                                     int a1,\n                                     int a2)\n{\n    _PrintEnter(\"CreatePolygonRgn(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HRGN rv = 0;\n    __try {\n        rv = Real_CreatePolygonRgn(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CreatePolygonRgn(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHMENU __stdcall Mine_CreatePopupMenu(void)\n{\n    _PrintEnter(\"CreatePopupMenu()\\n\");\n\n    HMENU rv = 0;\n    __try {\n        rv = Real_CreatePopupMenu();\n    } __finally {\n        _PrintExit(\"CreatePopupMenu() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CreateProcessA(LPCSTR lpApplicationName,\n                                   LPSTR lpCommandLine,\n                                   LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                   LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                   BOOL bInheritHandles,\n                                   DWORD dwCreationFlags,\n                                   LPVOID lpEnvironment,\n                                   LPCSTR lpCurrentDirectory,\n                                   LPSTARTUPINFOA lpStartupInfo,\n                                   LPPROCESS_INFORMATION lpProcessInformation)\n{\n    _PrintEnter(\"CreateProcessA(%hs,%hs,%p,%p,%p,%p,%p,%hs,%p,%p)\\n\",\n                lpApplicationName,\n                lpCommandLine,\n                lpProcessAttributes,\n                lpThreadAttributes,\n                bInheritHandles,\n                dwCreationFlags,\n                lpEnvironment,\n                lpCurrentDirectory,\n                lpStartupInfo,\n                lpProcessInformation);\n\n    PROCESS_INFORMATION procInfo;\n    if (lpProcessInformation == NULL) {\n        lpProcessInformation= &procInfo;\n        ZeroMemory(&procInfo, sizeof(procInfo));\n    }\n\n    BOOL rv = 0;\n    __try {\n        rv = DetourCreateProcessWithDllExA(lpApplicationName,\n                                           lpCommandLine,\n                                           lpProcessAttributes,\n                                           lpThreadAttributes,\n                                           bInheritHandles,\n                                           dwCreationFlags,\n                                           lpEnvironment,\n                                           lpCurrentDirectory,\n                                           lpStartupInfo,\n                                           lpProcessInformation,\n                                           s_szDllPath,\n                                           Real_CreateProcessA);\n    } __finally {\n        _PrintExit(\"CreateProcessA(,,,,,,,,,) -> %x (proc:%d/%p, thrd:%d/%p\\n\", rv,\n                   lpProcessInformation->dwProcessId,\n                   lpProcessInformation->hProcess,\n                   lpProcessInformation->dwThreadId,\n                   lpProcessInformation->hThread);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CreateProcessW(LPCWSTR lpApplicationName,\n                                   LPWSTR lpCommandLine,\n                                   LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                   LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                   BOOL bInheritHandles,\n                                   DWORD dwCreationFlags,\n                                   LPVOID lpEnvironment,\n                                   LPCWSTR lpCurrentDirectory,\n                                   LPSTARTUPINFOW lpStartupInfo,\n                                   LPPROCESS_INFORMATION lpProcessInformation)\n{\n    _PrintEnter(\"CreateProcessW(%ls,%ls,%p,%p,%p,%p,%p,%ls,%p,%p)\\n\",\n                lpApplicationName,\n                lpCommandLine,\n                lpProcessAttributes,\n                lpThreadAttributes,\n                bInheritHandles,\n                dwCreationFlags,\n                lpEnvironment,\n                lpCurrentDirectory,\n                lpStartupInfo,\n                lpProcessInformation);\n\n    PROCESS_INFORMATION procInfo;\n    if (lpProcessInformation == NULL) {\n        lpProcessInformation= &procInfo;\n        ZeroMemory(&procInfo, sizeof(procInfo));\n    }\n\n    BOOL rv = 0;\n    __try {\n        rv = DetourCreateProcessWithDllExW(lpApplicationName,\n                                           lpCommandLine,\n                                           lpProcessAttributes,\n                                           lpThreadAttributes,\n                                           bInheritHandles,\n                                           dwCreationFlags,\n                                           lpEnvironment,\n                                           lpCurrentDirectory,\n                                           lpStartupInfo,\n                                           lpProcessInformation,\n                                           s_szDllPath,\n                                           Real_CreateProcessW);\n    } __finally {\n        _PrintExit(\"CreateProcessW(,,,,,,,,,) -> %x (proc:%d/%p, thrd:%d/%p\\n\", rv,\n                   lpProcessInformation->dwProcessId,\n                   lpProcessInformation->hProcess,\n                   lpProcessInformation->dwThreadId,\n                   lpProcessInformation->hThread);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CreateProcessAsUserA(\n  __in_opt     HANDLE hToken,\n  __in_opt     LPCSTR lpApplicationName,\n  __inout_opt  LPSTR lpCommandLine,\n  __in_opt     LPSECURITY_ATTRIBUTES lpProcessAttributes,\n  __in_opt     LPSECURITY_ATTRIBUTES lpThreadAttributes,\n  __in         BOOL bInheritHandles,\n  __in         DWORD dwCreationFlags,\n  __in_opt     LPVOID lpEnvironment,\n  __in_opt     LPCSTR lpCurrentDirectory,\n  __in         LPSTARTUPINFOA lpStartupInfo,\n  __out        LPPROCESS_INFORMATION lpProcessInformation\n                                        )\n{\n    _PrintEnter(\"CreateProcessAsUserA(%ls,%ls,%p,%p,%p,%p,%p,%ls,%p,%p)\\n\",\n                lpApplicationName,\n                lpCommandLine,\n                lpProcessAttributes,\n                lpThreadAttributes,\n                bInheritHandles,\n                dwCreationFlags,\n                lpEnvironment,\n                lpCurrentDirectory,\n                lpStartupInfo,\n                lpProcessInformation);\n\n    PROCESS_INFORMATION procInfo;\n    if (lpProcessInformation == NULL) {\n        lpProcessInformation= &procInfo;\n        ZeroMemory(&procInfo, sizeof(procInfo));\n    }\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CreateProcessAsUserA(hToken,\n                                       lpApplicationName,\n                                       lpCommandLine,\n                                       lpProcessAttributes,\n                                       lpThreadAttributes,\n                                       bInheritHandles,\n                                       dwCreationFlags,\n                                       lpEnvironment,\n                                       lpCurrentDirectory,\n                                       lpStartupInfo,\n                                       lpProcessInformation);\n    } __finally {\n        _PrintExit(\"CreateProcessAsUserAW(,,,,,,,,,) -> %x (proc:%d/%p, thrd:%d/%p\\n\", rv,\n                   lpProcessInformation->dwProcessId,\n                   lpProcessInformation->hProcess,\n                   lpProcessInformation->dwThreadId,\n                   lpProcessInformation->hThread);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CreateProcessAsUserW(\n  __in_opt     HANDLE hToken,\n  __in_opt     LPCWSTR lpApplicationName,\n  __inout_opt  LPWSTR lpCommandLine,\n  __in_opt     LPSECURITY_ATTRIBUTES lpProcessAttributes,\n  __in_opt     LPSECURITY_ATTRIBUTES lpThreadAttributes,\n  __in         BOOL bInheritHandles,\n  __in         DWORD dwCreationFlags,\n  __in_opt     LPVOID lpEnvironment,\n  __in_opt     LPCWSTR lpCurrentDirectory,\n  __in         LPSTARTUPINFOW lpStartupInfo,\n  __out        LPPROCESS_INFORMATION lpProcessInformation\n                                        )\n{\n    _PrintEnter(\"CreateProcessAsUserW(%ls,%ls,%p,%p,%p,%p,%p,%ls,%p,%p)\\n\",\n                lpApplicationName,\n                lpCommandLine,\n                lpProcessAttributes,\n                lpThreadAttributes,\n                bInheritHandles,\n                dwCreationFlags,\n                lpEnvironment,\n                lpCurrentDirectory,\n                lpStartupInfo,\n                lpProcessInformation);\n\n    PROCESS_INFORMATION procInfo;\n    if (lpProcessInformation == NULL) {\n        lpProcessInformation= &procInfo;\n        ZeroMemory(&procInfo, sizeof(procInfo));\n    }\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CreateProcessAsUserW(hToken,\n                                       lpApplicationName,\n                                       lpCommandLine,\n                                       lpProcessAttributes,\n                                       lpThreadAttributes,\n                                       bInheritHandles,\n                                       dwCreationFlags,\n                                       lpEnvironment,\n                                       lpCurrentDirectory,\n                                       lpStartupInfo,\n                                       lpProcessInformation);\n    } __finally {\n        _PrintExit(\"CreateProcessAsUserW(,,,,,,,,,) -> %x (proc:%d/%p, thrd:%d/%p\\n\", rv,\n                   lpProcessInformation->dwProcessId,\n                   lpProcessInformation->hProcess,\n                   lpProcessInformation->dwThreadId,\n                   lpProcessInformation->hThread);\n    };\n    return rv;\n}\n\n#if(_WIN32_WINNT >= 0x0500)\nBOOL WINAPI Mine_CreateProcessWithLogonW(\n  __in         LPCWSTR lpUsername,\n  __in_opt     LPCWSTR lpDomain,\n  __in         LPCWSTR lpPassword,\n  __in         DWORD dwLogonFlags,\n  __in_opt     LPCWSTR lpApplicationName,\n  __inout_opt  LPWSTR lpCommandLine,\n  __in         DWORD dwCreationFlags,\n  __in_opt     LPVOID lpEnvironment,\n  __in_opt     LPCWSTR lpCurrentDirectory,\n  __in         LPSTARTUPINFOW lpStartupInfo,\n  __out        LPPROCESS_INFORMATION lpProcessInfo\n                                        )\n{\n    _PrintEnter(\"CreateProcessWithLogonW(%ls,%ls,%ls,%d,%ls,%ls,%p,%p,%ls,%p,%p)\\n\",\n                lpUsername,\n                lpDomain,\n                lpPassword,\n                dwLogonFlags,\n                lpApplicationName,\n                lpCommandLine,\n                dwCreationFlags,\n                lpEnvironment,\n                lpCurrentDirectory,\n                lpStartupInfo,\n                lpProcessInfo);\n\n    PROCESS_INFORMATION procInfo;\n    if (lpProcessInfo == NULL) {\n        lpProcessInfo= &procInfo;\n        ZeroMemory(&procInfo, sizeof(procInfo));\n    }\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CreateProcessWithLogonW(\n                lpUsername,\n                lpDomain,\n                lpPassword,\n                dwLogonFlags,\n                lpApplicationName,\n                lpCommandLine,\n                dwCreationFlags,\n                lpEnvironment,\n                lpCurrentDirectory,\n                lpStartupInfo,\n                lpProcessInfo);\n    } __finally {\n        _PrintExit(\"CreateProcessWithLogonW(,,,,,,,,,) -> %x (proc:%d/%p, thrd:%d/%p\\n\", rv,\n                   lpProcessInfo->dwProcessId,\n                   lpProcessInfo->hProcess,\n                   lpProcessInfo->dwThreadId,\n                   lpProcessInfo->hThread);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_CreateProcessWithTokenW(\n  __in         HANDLE hToken,\n  __in         DWORD dwLogonFlags,\n  __in_opt     LPCWSTR lpApplicationName,\n  __inout_opt  LPWSTR lpCommandLine,\n  __in         DWORD dwCreationFlags,\n  __in_opt     LPVOID lpEnvironment,\n  __in_opt     LPCWSTR lpCurrentDirectory,\n  __in         LPSTARTUPINFOW lpStartupInfo,\n  __out        LPPROCESS_INFORMATION lpProcessInfo\n)\n{\n    _PrintEnter(\"CreateProcessWithTokenW(%ls,%ls,%p,%p,%ls,%p,%p)\\n\",\n                lpApplicationName,\n                lpCommandLine,\n                dwCreationFlags,\n                lpEnvironment,\n                lpCurrentDirectory,\n                lpStartupInfo,\n                lpProcessInfo);\n\n    PROCESS_INFORMATION procInfo;\n    if (lpProcessInfo == NULL) {\n        lpProcessInfo= &procInfo;\n        ZeroMemory(&procInfo, sizeof(procInfo));\n    }\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CreateProcessWithTokenW(hToken,\n                                          dwLogonFlags,\n                                          lpApplicationName,\n                                          lpCommandLine,\n                                          dwCreationFlags,\n                                          lpEnvironment,\n                                          lpCurrentDirectory,\n                                          lpStartupInfo,\n                                          lpProcessInfo);\n    } __finally {\n        _PrintExit(\"CreateProcessWithTokenW(,,,,,,,,,) -> %x (proc:%d/%p, thrd:%d/%p\\n\", rv,\n                   lpProcessInfo->dwProcessId,\n                   lpProcessInfo->hProcess,\n                   lpProcessInfo->dwThreadId,\n                   lpProcessInfo->hThread);\n    };\n    return rv;\n}\n#endif // (_WIN32_WINNT >= 0x0500)\n\nHRGN __stdcall Mine_CreateRectRgn(int a0,\n                                  int a1,\n                                  int a2,\n                                  int a3)\n{\n    _PrintEnter(\"CreateRectRgn(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HRGN rv = 0;\n    __try {\n        rv = Real_CreateRectRgn(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CreateRectRgn(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRGN __stdcall Mine_CreateRectRgnIndirect(RECT* a0)\n{\n    _PrintEnter(\"CreateRectRgnIndirect(%p)\\n\", a0);\n\n    HRGN rv = 0;\n    __try {\n        rv = Real_CreateRectRgnIndirect(a0);\n    } __finally {\n        _PrintExit(\"CreateRectRgnIndirect() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_CreateRemoteThread(HANDLE a0,\n                                         LPSECURITY_ATTRIBUTES a1,\n                                         ULONG_PTR a2,\n                                         LPTHREAD_START_ROUTINE a3,\n                                         LPVOID a4,\n                                         DWORD a5,\n                                         LPDWORD a6)\n{\n    _PrintEnter(\"CreateRemoteThread(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_CreateRemoteThread(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"CreateRemoteThread(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRGN __stdcall Mine_CreateRoundRectRgn(int a0,\n                                       int a1,\n                                       int a2,\n                                       int a3,\n                                       int a4,\n                                       int a5)\n{\n    _PrintEnter(\"CreateRoundRectRgn(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    HRGN rv = 0;\n    __try {\n        rv = Real_CreateRoundRectRgn(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"CreateRoundRectRgn(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CreateScalableFontResourceA(DWORD a0,\n                                                LPCSTR a1,\n                                                LPCSTR a2,\n                                                LPCSTR a3)\n{\n    _PrintEnter(\"CreateScalableFontResourceA(%p,%hs,%hs,%hs)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CreateScalableFontResourceA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CreateScalableFontResourceA(,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_CreateScalableFontResourceW(DWORD a0,\n                                                LPCWSTR a1,\n                                                LPCWSTR a2,\n                                                LPCWSTR a3)\n{\n    _PrintEnter(\"CreateScalableFontResourceW(%p,%ls,%ls,%ls)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CreateScalableFontResourceW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CreateScalableFontResourceW(,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_CreateSemaphoreA(LPSECURITY_ATTRIBUTES a0,\n                                       LONG a1,\n                                       LONG a2,\n                                       LPCSTR a3)\n{\n    _PrintEnter(\"CreateSemaphoreA(%p,%p,%p,%hs)\\n\", a0, a1, a2, a3);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_CreateSemaphoreA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CreateSemaphoreA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_CreateSemaphoreW(LPSECURITY_ATTRIBUTES a0,\n                                       LONG a1,\n                                       LONG a2,\n                                       LPCWSTR a3)\n{\n    _PrintEnter(\"CreateSemaphoreW(%p,%p,%p,%ls)\\n\", a0, a1, a2, a3);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_CreateSemaphoreW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CreateSemaphoreW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHBRUSH __stdcall Mine_CreateSolidBrush(COLORREF a0)\n{\n    _PrintEnter(\"CreateSolidBrush(%p)\\n\", a0);\n\n    HBRUSH rv = 0;\n    __try {\n        rv = Real_CreateSolidBrush(a0);\n    } __finally {\n        _PrintExit(\"CreateSolidBrush() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CreateStdProgressIndicator(HWND a0,\n                                                  LPCOLESTR a1,\n                                                  IBindStatusCallback* a2,\n                                                  IBindStatusCallback** a3)\n{\n    _PrintEnter(\"CreateStdProgressIndicator(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CreateStdProgressIndicator(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CreateStdProgressIndicator(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_CreateStreamOnHGlobal(HGLOBAL a0,\n                                             BOOL a1,\n                                             LPSTREAM* a2)\n{\n    _PrintEnter(\"CreateStreamOnHGlobal(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_CreateStreamOnHGlobal(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CreateStreamOnHGlobal(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_CreateTapePartition(HANDLE a0,\n                                         DWORD a1,\n                                         DWORD a2,\n                                         DWORD a3)\n{\n    _PrintEnter(\"CreateTapePartition(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_CreateTapePartition(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CreateTapePartition(,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_CreateThread(LPSECURITY_ATTRIBUTES a0,\n                                   ULONG_PTR a1,\n                                   LPTHREAD_START_ROUTINE a2,\n                                   LPVOID a3,\n                                   DWORD a4,\n                                   LPDWORD a5)\n{\n    _PrintEnter(\"CreateThread(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_CreateThread(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"CreateThread(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_CreateWaitableTimerA(LPSECURITY_ATTRIBUTES a0,\n                                           BOOL a1,\n                                           LPCSTR a2)\n{\n    _PrintEnter(\"CreateWaitableTimerA(%p,%p,%hs)\\n\", a0, a1, a2);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_CreateWaitableTimerA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CreateWaitableTimerA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_CreateWaitableTimerW(LPSECURITY_ATTRIBUTES a0,\n                                           BOOL a1,\n                                           LPCWSTR a2)\n{\n    _PrintEnter(\"CreateWaitableTimerW(%p,%p,%ls)\\n\", a0, a1, a2);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_CreateWaitableTimerW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CreateWaitableTimerW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_CreateWindowExA(DWORD a0,\n                                    LPCSTR a1,\n                                    LPCSTR a2,\n                                    DWORD a3,\n                                    int a4,\n                                    int a5,\n                                    int a6,\n                                    int a7,\n                                    HWND a8,\n                                    HMENU a9,\n                                    HINSTANCE a10,\n                                    LPVOID a11)\n{\n    _PrintEnter(\"CreateWindowExA(%p,%hs,%hs,%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);\n\n    HWND rv = 0;\n    __try {\n        rv = Real_CreateWindowExA(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);\n    } __finally {\n        _PrintExit(\"CreateWindowExA(,,,,,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_CreateWindowExW(DWORD a0,\n                                    LPCWSTR a1,\n                                    LPCWSTR a2,\n                                    DWORD a3,\n                                    int a4,\n                                    int a5,\n                                    int a6,\n                                    int a7,\n                                    HWND a8,\n                                    HMENU a9,\n                                    HINSTANCE a10,\n                                    LPVOID a11)\n{\n    _PrintEnter(\"CreateWindowExW(%p,%ls,%ls,%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);\n\n    HWND rv = 0;\n    __try {\n        rv = Real_CreateWindowExW(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);\n    } __finally {\n        _PrintExit(\"CreateWindowExW(,,,,,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\n#if _MSC_VER < 1300\nHWINSTA __stdcall Mine_CreateWindowStationA(LPSTR a0,\n                                            DWORD a1,\n                                            ACCESS_MASK a2,\n                                            LPSECURITY_ATTRIBUTES a3)\n#else\nHWINSTA __stdcall Mine_CreateWindowStationA(LPCSTR a0,\n                                            DWORD a1,\n                                            ACCESS_MASK a2,\n                                            LPSECURITY_ATTRIBUTES a3)\n#endif\n{\n    _PrintEnter(\"CreateWindowStationA(%hs,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HWINSTA rv = 0;\n    __try {\n        rv = Real_CreateWindowStationA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CreateWindowStationA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\n#if _MSC_VER < 1300\nHWINSTA __stdcall Mine_CreateWindowStationW(LPWSTR a0,\n                                            DWORD a1,\n                                            ACCESS_MASK a2,\n                                            LPSECURITY_ATTRIBUTES a3)\n#else\nHWINSTA __stdcall Mine_CreateWindowStationW(LPCWSTR a0,\n                                            DWORD a1,\n                                            ACCESS_MASK a2,\n                                            LPSECURITY_ATTRIBUTES a3)\n#endif\n{\n    _PrintEnter(\"CreateWindowStationW(%ls,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HWINSTA rv = 0;\n    __try {\n        rv = Real_CreateWindowStationW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"CreateWindowStationW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DPtoLP(HDC a0,\n                           POINT* a1,\n                           int a2)\n{\n    _PrintEnter(\"DPtoLP(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DPtoLP(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"DPtoLP(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DdeAbandonTransaction(DWORD a0,\n                                          HCONV a1,\n                                          DWORD a2)\n{\n    _PrintEnter(\"DdeAbandonTransaction(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DdeAbandonTransaction(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"DdeAbandonTransaction(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLPBYTE __stdcall Mine_DdeAccessData(HDDEDATA a0,\n                                    LPDWORD a1)\n{\n    _PrintEnter(\"DdeAccessData(%p,%p)\\n\", a0, a1);\n\n    LPBYTE rv = 0;\n    __try {\n        rv = Real_DdeAccessData(a0, a1);\n    } __finally {\n        _PrintExit(\"DdeAccessData(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHDDEDATA __stdcall Mine_DdeAddData(HDDEDATA a0,\n                                   LPBYTE a1,\n                                   DWORD a2,\n                                   DWORD a3)\n{\n    _PrintEnter(\"DdeAddData(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HDDEDATA rv = 0;\n    __try {\n        rv = Real_DdeAddData(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"DdeAddData(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHDDEDATA __stdcall Mine_DdeClientTransaction(LPBYTE a0,\n                                             DWORD a1,\n                                             HCONV a2,\n                                             HSZ a3,\n                                             UINT a4,\n                                             UINT a5,\n                                             DWORD a6,\n                                             LPDWORD a7)\n{\n    _PrintEnter(\"DdeClientTransaction(%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7);\n\n    HDDEDATA rv = 0;\n    __try {\n        rv = Real_DdeClientTransaction(a0, a1, a2, a3, a4, a5, a6, a7);\n    } __finally {\n        _PrintExit(\"DdeClientTransaction(,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_DdeCmpStringHandles(HSZ a0,\n                                       HSZ a1)\n{\n    _PrintEnter(\"DdeCmpStringHandles(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_DdeCmpStringHandles(a0, a1);\n    } __finally {\n        _PrintExit(\"DdeCmpStringHandles(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHCONV __stdcall Mine_DdeConnect(DWORD a0,\n                                HSZ a1,\n                                HSZ a2,\n                                PCONVCONTEXT a3)\n{\n    _PrintEnter(\"DdeConnect(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HCONV rv = 0;\n    __try {\n        rv = Real_DdeConnect(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"DdeConnect(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHCONVLIST __stdcall Mine_DdeConnectList(DWORD a0,\n                                        HSZ a1,\n                                        HSZ a2,\n                                        HCONVLIST a3,\n                                        PCONVCONTEXT a4)\n{\n    _PrintEnter(\"DdeConnectList(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    HCONVLIST rv = 0;\n    __try {\n        rv = Real_DdeConnectList(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"DdeConnectList(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHDDEDATA __stdcall Mine_DdeCreateDataHandle(DWORD a0,\n                                            LPBYTE a1,\n                                            DWORD a2,\n                                            DWORD a3,\n                                            HSZ a4,\n                                            UINT a5,\n                                            UINT a6)\n{\n    _PrintEnter(\"DdeCreateDataHandle(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    HDDEDATA rv = 0;\n    __try {\n        rv = Real_DdeCreateDataHandle(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"DdeCreateDataHandle(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHSZ __stdcall Mine_DdeCreateStringHandleA(DWORD a0,\n                                          LPCSTR a1,\n                                          int a2)\n{\n    _PrintEnter(\"DdeCreateStringHandleA(%p,%hs,%p)\\n\", a0, a1, a2);\n\n    HSZ rv = 0;\n    __try {\n        rv = Real_DdeCreateStringHandleA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"DdeCreateStringHandleA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHSZ __stdcall Mine_DdeCreateStringHandleW(DWORD a0,\n                                          LPCWSTR a1,\n                                          int a2)\n{\n    _PrintEnter(\"DdeCreateStringHandleW(%p,%ls,%p)\\n\", a0, a1, a2);\n\n    HSZ rv = 0;\n    __try {\n        rv = Real_DdeCreateStringHandleW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"DdeCreateStringHandleW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DdeDisconnect(HCONV a0)\n{\n    _PrintEnter(\"DdeDisconnect(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DdeDisconnect(a0);\n    } __finally {\n        _PrintExit(\"DdeDisconnect() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DdeDisconnectList(HCONVLIST a0)\n{\n    _PrintEnter(\"DdeDisconnectList(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DdeDisconnectList(a0);\n    } __finally {\n        _PrintExit(\"DdeDisconnectList() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DdeEnableCallback(DWORD a0,\n                                      HCONV a1,\n                                      UINT a2)\n{\n    _PrintEnter(\"DdeEnableCallback(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DdeEnableCallback(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"DdeEnableCallback(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DdeFreeDataHandle(HDDEDATA a0)\n{\n    _PrintEnter(\"DdeFreeDataHandle(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DdeFreeDataHandle(a0);\n    } __finally {\n        _PrintExit(\"DdeFreeDataHandle() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DdeFreeStringHandle(DWORD a0,\n                                        HSZ a1)\n{\n    _PrintEnter(\"DdeFreeStringHandle(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DdeFreeStringHandle(a0, a1);\n    } __finally {\n        _PrintExit(\"DdeFreeStringHandle(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_DdeGetData(HDDEDATA a0,\n                                LPBYTE a1,\n                                DWORD a2,\n                                DWORD a3)\n{\n    _PrintEnter(\"DdeGetData(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_DdeGetData(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"DdeGetData(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_DdeGetLastError(DWORD a0)\n{\n    _PrintEnter(\"DdeGetLastError(%p)\\n\", a0);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_DdeGetLastError(a0);\n    } __finally {\n        _PrintExit(\"DdeGetLastError() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DdeImpersonateClient(HCONV a0)\n{\n    _PrintEnter(\"DdeImpersonateClient(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DdeImpersonateClient(a0);\n    } __finally {\n        _PrintExit(\"DdeImpersonateClient() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DdeKeepStringHandle(DWORD a0,\n                                        HSZ a1)\n{\n    _PrintEnter(\"DdeKeepStringHandle(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DdeKeepStringHandle(a0, a1);\n    } __finally {\n        _PrintExit(\"DdeKeepStringHandle(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHDDEDATA __stdcall Mine_DdeNameService(DWORD a0,\n                                       HSZ a1,\n                                       HSZ a2,\n                                       UINT a3)\n{\n    _PrintEnter(\"DdeNameService(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HDDEDATA rv = 0;\n    __try {\n        rv = Real_DdeNameService(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"DdeNameService(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DdePostAdvise(DWORD a0,\n                                  HSZ a1,\n                                  HSZ a2)\n{\n    _PrintEnter(\"DdePostAdvise(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DdePostAdvise(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"DdePostAdvise(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_DdeQueryConvInfo(HCONV a0,\n                                     DWORD a1,\n                                     CONVINFO* a2)\n{\n    _PrintEnter(\"DdeQueryConvInfo(%p,%p,%p)\\n\", a0, a1, a2);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_DdeQueryConvInfo(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"DdeQueryConvInfo(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHCONV __stdcall Mine_DdeQueryNextServer(HCONVLIST a0,\n                                        HCONV a1)\n{\n    _PrintEnter(\"DdeQueryNextServer(%p,%p)\\n\", a0, a1);\n\n    HCONV rv = 0;\n    __try {\n        rv = Real_DdeQueryNextServer(a0, a1);\n    } __finally {\n        _PrintExit(\"DdeQueryNextServer(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_DdeQueryStringA(DWORD a0,\n                                     HSZ a1,\n                                     LPSTR a2,\n                                     DWORD a3,\n                                     int a4)\n{\n    _PrintEnter(\"DdeQueryStringA(%p,%p,%hs,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_DdeQueryStringA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"DdeQueryStringA(,,%hs,,) -> %p\\n\", a2, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_DdeQueryStringW(DWORD a0,\n                                     HSZ a1,\n                                     LPWSTR a2,\n                                     DWORD a3,\n                                     int a4)\n{\n    _PrintEnter(\"DdeQueryStringW(%p,%p,%ls,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_DdeQueryStringW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"DdeQueryStringW(,,%ls,,) -> %p\\n\", a2, rv);\n    };\n    return rv;\n}\n\nHCONV __stdcall Mine_DdeReconnect(HCONV a0)\n{\n    _PrintEnter(\"DdeReconnect(%p)\\n\", a0);\n\n    HCONV rv = 0;\n    __try {\n        rv = Real_DdeReconnect(a0);\n    } __finally {\n        _PrintExit(\"DdeReconnect() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DdeSetQualityOfService(HWND a0,\n                                           PSECURITY_QUALITY_OF_SERVICE a1,\n                                           PSECURITY_QUALITY_OF_SERVICE a2)\n{\n    _PrintEnter(\"DdeSetQualityOfService(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DdeSetQualityOfService(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"DdeSetQualityOfService(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DdeSetUserHandle(HCONV a0,\n                                     DWORD a1,\n                                     ULONG_PTR a2)\n{\n    _PrintEnter(\"DdeSetUserHandle(%p,%x,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DdeSetUserHandle(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"DdeSetUserHandle(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DdeUnaccessData(HDDEDATA a0)\n{\n    _PrintEnter(\"DdeUnaccessData(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DdeUnaccessData(a0);\n    } __finally {\n        _PrintExit(\"DdeUnaccessData() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DdeUninitialize(DWORD a0)\n{\n    _PrintEnter(\"DdeUninitialize(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DdeUninitialize(a0);\n    } __finally {\n        _PrintExit(\"DdeUninitialize() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DebugActiveProcess(DWORD a0)\n{\n    _PrintEnter(\"DebugActiveProcess(pid=%d)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DebugActiveProcess(a0);\n    } __finally {\n        _PrintExit(\"DebugActiveProcess() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DebugActiveProcessStop(DWORD a0)\n{\n    _PrintEnter(\"DebugActiveProcessStop(pid=%d)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DebugActiveProcess(a0);\n    } __finally {\n        _PrintExit(\"DebugActiveProcessStop() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nvoid __stdcall Mine_DebugBreak(void)\n{\n    _PrintEnter(\"DebugBreak()\\n\");\n\n    __try {\n        Real_DebugBreak();\n    } __finally {\n        _PrintExit(\"DebugBreak() ->\\n\");\n    };\n}\n\nLRESULT __stdcall Mine_DefDlgProcA(HWND a0,\n                                   UINT a1,\n                                   WPARAM a2,\n                                   LPARAM a3)\n{\n    _PrintEnter(\"DefDlgProcA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    LRESULT rv = 0;\n    __try {\n        rv = Real_DefDlgProcA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"DefDlgProcA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLRESULT __stdcall Mine_DefDlgProcW(HWND a0,\n                                   UINT a1,\n                                   WPARAM a2,\n                                   LPARAM a3)\n{\n    _PrintEnter(\"DefDlgProcW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    LRESULT rv = 0;\n    __try {\n        rv = Real_DefDlgProcW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"DefDlgProcW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLRESULT __stdcall Mine_DefFrameProcA(HWND a0,\n                                     HWND a1,\n                                     UINT a2,\n                                     WPARAM a3,\n                                     LPARAM a4)\n{\n    _PrintEnter(\"DefFrameProcA(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    LRESULT rv = 0;\n    __try {\n        rv = Real_DefFrameProcA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"DefFrameProcA(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLRESULT __stdcall Mine_DefFrameProcW(HWND a0,\n                                     HWND a1,\n                                     UINT a2,\n                                     WPARAM a3,\n                                     LPARAM a4)\n{\n    _PrintEnter(\"DefFrameProcW(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    LRESULT rv = 0;\n    __try {\n        rv = Real_DefFrameProcW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"DefFrameProcW(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLRESULT __stdcall Mine_DefMDIChildProcA(HWND a0,\n                                        UINT a1,\n                                        WPARAM a2,\n                                        LPARAM a3)\n{\n    _PrintEnter(\"DefMDIChildProcA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    LRESULT rv = 0;\n    __try {\n        rv = Real_DefMDIChildProcA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"DefMDIChildProcA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLRESULT __stdcall Mine_DefMDIChildProcW(HWND a0,\n                                        UINT a1,\n                                        WPARAM a2,\n                                        LPARAM a3)\n{\n    _PrintEnter(\"DefMDIChildProcW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    LRESULT rv = 0;\n    __try {\n        rv = Real_DefMDIChildProcW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"DefMDIChildProcW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLRESULT __stdcall Mine_DefWindowProcA(HWND a0,\n                                      UINT a1,\n                                      WPARAM a2,\n                                      LPARAM a3)\n{\n    _PrintEnter(\"DefWindowProcA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    LRESULT rv = 0;\n    __try {\n        rv = Real_DefWindowProcA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"DefWindowProcA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLRESULT __stdcall Mine_DefWindowProcW(HWND a0,\n                                      UINT a1,\n                                      WPARAM a2,\n                                      LPARAM a3)\n{\n    _PrintEnter(\"DefWindowProcW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    LRESULT rv = 0;\n    __try {\n        rv = Real_DefWindowProcW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"DefWindowProcW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHDWP __stdcall Mine_DeferWindowPos(HDWP a0,\n                                   HWND a1,\n                                   HWND a2,\n                                   int a3,\n                                   int a4,\n                                   int a5,\n                                   int a6,\n                                   UINT a7)\n{\n    _PrintEnter(\"DeferWindowPos(%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7);\n\n    HDWP rv = 0;\n    __try {\n        rv = Real_DeferWindowPos(a0, a1, a2, a3, a4, a5, a6, a7);\n    } __finally {\n        _PrintExit(\"DeferWindowPos(,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DefineDosDeviceA(DWORD a0,\n                                     LPCSTR a1,\n                                     LPCSTR a2)\n{\n    _PrintEnter(\"DefineDosDeviceA(%p,%hs,%hs)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DefineDosDeviceA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"DefineDosDeviceA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DefineDosDeviceW(DWORD a0,\n                                     LPCWSTR a1,\n                                     LPCWSTR a2)\n{\n    _PrintEnter(\"DefineDosDeviceW(%p,%ls,%ls)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DefineDosDeviceW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"DefineDosDeviceW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nATOM __stdcall Mine_DeleteAtom(ATOM a0)\n{\n    _PrintEnter(\"DeleteAtom(%p)\\n\", a0);\n\n    ATOM rv = 0;\n    __try {\n        rv = Real_DeleteAtom(a0);\n    } __finally {\n        _PrintExit(\"DeleteAtom() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DeleteColorSpace(HCOLORSPACE a0)\n{\n    _PrintEnter(\"DeleteColorSpace(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DeleteColorSpace(a0);\n    } __finally {\n        _PrintExit(\"DeleteColorSpace() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DeleteDC(HDC a0)\n{\n    _PrintEnter(\"DeleteDC(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DeleteDC(a0);\n    } __finally {\n        _PrintExit(\"DeleteDC() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DeleteEnhMetaFile(HENHMETAFILE a0)\n{\n    _PrintEnter(\"DeleteEnhMetaFile(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DeleteEnhMetaFile(a0);\n    } __finally {\n        _PrintExit(\"DeleteEnhMetaFile() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nvoid __stdcall Mine_DeleteFiber(LPVOID a0)\n{\n    _PrintEnter(\"DeleteFiber(%p)\\n\", a0);\n\n    __try {\n        Real_DeleteFiber(a0);\n    } __finally {\n        _PrintExit(\"DeleteFiber() ->\\n\");\n    };\n}\n\nBOOL __stdcall Mine_DeleteFileA(LPCSTR a0)\n{\n    _PrintEnter(\"DeleteFileA(%hs)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DeleteFileA(a0);\n    } __finally {\n        _PrintExit(\"DeleteFileA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DeleteFileW(LPCWSTR a0)\n{\n    _PrintEnter(\"DeleteFileW(%ls)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DeleteFileW(a0);\n    } __finally {\n        _PrintExit(\"DeleteFileW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DeleteMenu(HMENU a0,\n                               UINT a1,\n                               UINT a2)\n{\n    _PrintEnter(\"DeleteMenu(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DeleteMenu(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"DeleteMenu(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DeleteMetaFile(HMETAFILE a0)\n{\n    _PrintEnter(\"DeleteMetaFile(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DeleteMetaFile(a0);\n    } __finally {\n        _PrintExit(\"DeleteMetaFile() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DeleteObject(HGDIOBJ a0)\n{\n    _PrintEnter(\"DeleteObject(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DeleteObject(a0);\n    } __finally {\n        _PrintExit(\"DeleteObject() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_DescribePixelFormat(HDC a0,\n                                       int a1,\n                                       UINT a2,\n                                       PIXELFORMATDESCRIPTOR* a3)\n{\n    _PrintEnter(\"DescribePixelFormat(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    int rv = 0;\n    __try {\n        rv = Real_DescribePixelFormat(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"DescribePixelFormat(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DestroyAcceleratorTable(HACCEL a0)\n{\n    _PrintEnter(\"DestroyAcceleratorTable(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DestroyAcceleratorTable(a0);\n    } __finally {\n        _PrintExit(\"DestroyAcceleratorTable() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DestroyCaret(void)\n{\n    _PrintEnter(\"DestroyCaret()\\n\");\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DestroyCaret();\n    } __finally {\n        _PrintExit(\"DestroyCaret() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DestroyCursor(HCURSOR a0)\n{\n    _PrintEnter(\"DestroyCursor(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DestroyCursor(a0);\n    } __finally {\n        _PrintExit(\"DestroyCursor() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DestroyIcon(HICON a0)\n{\n    _PrintEnter(\"DestroyIcon(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DestroyIcon(a0);\n    } __finally {\n        _PrintExit(\"DestroyIcon() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DestroyMenu(HMENU a0)\n{\n    _PrintEnter(\"DestroyMenu(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DestroyMenu(a0);\n    } __finally {\n        _PrintExit(\"DestroyMenu() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DestroyWindow(HWND a0)\n{\n    _PrintEnter(\"DestroyWindow(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DestroyWindow(a0);\n    } __finally {\n        _PrintExit(\"DestroyWindow() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DeviceIoControl(HANDLE a0,\n                                    DWORD a1,\n                                    LPVOID a2,\n                                    DWORD a3,\n                                    LPVOID a4,\n                                    DWORD a5,\n                                    LPDWORD a6,\n                                    LPOVERLAPPED a7)\n{\n    _PrintEnter(\"DeviceIoControl(%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DeviceIoControl(a0, a1, a2, a3, a4, a5, a6, a7);\n    } __finally {\n        _PrintExit(\"DeviceIoControl(,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nINT_PTR __stdcall Mine_DialogBoxIndirectParamA(HINSTANCE a0,\n                                               LPCDLGTEMPLATEA a1,\n                                               HWND a2,\n                                               DLGPROC a3,\n                                               LPARAM a4)\n{\n    _PrintEnter(\"DialogBoxIndirectParamA(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    INT_PTR rv = 0;\n    __try {\n        rv = Real_DialogBoxIndirectParamA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"DialogBoxIndirectParamA(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nINT_PTR __stdcall Mine_DialogBoxIndirectParamW(HINSTANCE a0,\n                                               LPCDLGTEMPLATEW a1,\n                                               HWND a2,\n                                               DLGPROC a3,\n                                               LPARAM a4)\n{\n    _PrintEnter(\"DialogBoxIndirectParamW(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    INT_PTR rv = 0;\n    __try {\n        rv = Real_DialogBoxIndirectParamW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"DialogBoxIndirectParamW(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nINT_PTR __stdcall Mine_DialogBoxParamA(HINSTANCE a0,\n                                       LPCSTR a1,\n                                       HWND a2,\n                                       DLGPROC a3,\n                                       LPARAM a4)\n{\n    _PrintEnter(\"DialogBoxParamA(%p,%hs,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    INT_PTR rv = 0;\n    __try {\n        rv = Real_DialogBoxParamA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"DialogBoxParamA(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nINT_PTR __stdcall Mine_DialogBoxParamW(HINSTANCE a0,\n                                       LPCWSTR a1,\n                                       HWND a2,\n                                       DLGPROC a3,\n                                       LPARAM a4)\n{\n    _PrintEnter(\"DialogBoxParamW(%p,%ls,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    INT_PTR rv = 0;\n    __try {\n        rv = Real_DialogBoxParamW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"DialogBoxParamW(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DisableThreadLibraryCalls(HMODULE a0)\n{\n    _PrintEnter(\"DisableThreadLibraryCalls(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DisableThreadLibraryCalls(a0);\n    } __finally {\n        _PrintExit(\"DisableThreadLibraryCalls() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DisconnectNamedPipe(HANDLE a0)\n{\n    _PrintEnter(\"DisconnectNamedPipe(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DisconnectNamedPipe(a0);\n    } __finally {\n        _PrintExit(\"DisconnectNamedPipe() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLRESULT __stdcall Mine_DispatchMessageA(MSG* a0)\n{\n    _PrintEnter(\"DispatchMessageA(%p)\\n\", a0);\n\n    LRESULT rv = 0;\n    __try {\n        rv = Real_DispatchMessageA(a0);\n    } __finally {\n        _PrintExit(\"DispatchMessageA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLRESULT __stdcall Mine_DispatchMessageW(MSG* a0)\n{\n    _PrintEnter(\"DispatchMessageW(%p)\\n\", a0);\n\n    LRESULT rv = 0;\n    __try {\n        rv = Real_DispatchMessageW(a0);\n    } __finally {\n        _PrintExit(\"DispatchMessageW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_DlgDirListA(HWND a0,\n                               LPSTR a1,\n                               int a2,\n                               int a3,\n                               UINT a4)\n{\n    _PrintEnter(\"DlgDirListA(%p,%hs,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    int rv = 0;\n    __try {\n        rv = Real_DlgDirListA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"DlgDirListA(,%hs,,,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_DlgDirListComboBoxA(HWND a0,\n                                       LPSTR a1,\n                                       int a2,\n                                       int a3,\n                                       UINT a4)\n{\n    _PrintEnter(\"DlgDirListComboBoxA(%p,%hs,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    int rv = 0;\n    __try {\n        rv = Real_DlgDirListComboBoxA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"DlgDirListComboBoxA(,%hs,,,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_DlgDirListComboBoxW(HWND a0,\n                                       LPWSTR a1,\n                                       int a2,\n                                       int a3,\n                                       UINT a4)\n{\n    _PrintEnter(\"DlgDirListComboBoxW(%p,%ls,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    int rv = 0;\n    __try {\n        rv = Real_DlgDirListComboBoxW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"DlgDirListComboBoxW(,%ls,,,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_DlgDirListW(HWND a0,\n                               LPWSTR a1,\n                               int a2,\n                               int a3,\n                               UINT a4)\n{\n    _PrintEnter(\"DlgDirListW(%p,%ls,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    int rv = 0;\n    __try {\n        rv = Real_DlgDirListW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"DlgDirListW(,%ls,,,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DlgDirSelectComboBoxExA(HWND a0,\n                                            LPSTR a1,\n                                            int a2,\n                                            int a3)\n{\n    _PrintEnter(\"DlgDirSelectComboBoxExA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DlgDirSelectComboBoxExA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"DlgDirSelectComboBoxExA(,%hs,,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DlgDirSelectComboBoxExW(HWND a0,\n                                            LPWSTR a1,\n                                            int a2,\n                                            int a3)\n{\n    _PrintEnter(\"DlgDirSelectComboBoxExW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DlgDirSelectComboBoxExW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"DlgDirSelectComboBoxExW(,%ls,,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DlgDirSelectExA(HWND a0,\n                                    LPSTR a1,\n                                    int a2,\n                                    int a3)\n{\n    _PrintEnter(\"DlgDirSelectExA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DlgDirSelectExA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"DlgDirSelectExA(,%hs,,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DlgDirSelectExW(HWND a0,\n                                    LPWSTR a1,\n                                    int a2,\n                                    int a3)\n{\n    _PrintEnter(\"DlgDirSelectExW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DlgDirSelectExW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"DlgDirSelectExW(,%ls,,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_DoDragDrop(IDataObject* a0,\n                                  IDropSource* a1,\n                                  DWORD a2,\n                                  LPDWORD a3)\n{\n    _PrintEnter(\"DoDragDrop(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_DoDragDrop(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"DoDragDrop(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DosDateTimeToFileTime(WORD a0,\n                                          WORD a1,\n                                          LPFILETIME a2)\n{\n    _PrintEnter(\"DosDateTimeToFileTime(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DosDateTimeToFileTime(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"DosDateTimeToFileTime(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DragDetect(HWND a0,\n                               POINT a1)\n{\n    _PrintEnter(\"DragDetect(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DragDetect(a0, a1);\n    } __finally {\n        _PrintExit(\"DragDetect(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_DragObject(HWND a0,\n                                HWND a1,\n                                UINT a2,\n                                ULONG_PTR a3,\n                                HCURSOR a4)\n{\n    _PrintEnter(\"DragObject(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_DragObject(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"DragObject(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DrawAnimatedRects(HWND a0,\n                                      int a1,\n                                      RECT* a2,\n                                      RECT* a3)\n{\n    _PrintEnter(\"DrawAnimatedRects(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DrawAnimatedRects(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"DrawAnimatedRects(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DrawCaption(HWND a0,\n                                HDC a1,\n                                RECT* a2,\n                                UINT a3)\n{\n    _PrintEnter(\"DrawCaption(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DrawCaption(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"DrawCaption(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DrawEdge(HDC a0,\n                             LPRECT a1,\n                             UINT a2,\n                             UINT a3)\n{\n    _PrintEnter(\"DrawEdge(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DrawEdge(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"DrawEdge(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_DrawEscape(HDC a0,\n                              int a1,\n                              int a2,\n                              LPCSTR a3)\n{\n    _PrintEnter(\"DrawEscape(%p,%p,%p,%hs)\\n\", a0, a1, a2, a3);\n\n    int rv = 0;\n    __try {\n        rv = Real_DrawEscape(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"DrawEscape(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DrawFocusRect(HDC a0,\n                                  RECT* a1)\n{\n    _PrintEnter(\"DrawFocusRect(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DrawFocusRect(a0, a1);\n    } __finally {\n        _PrintExit(\"DrawFocusRect(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DrawFrameControl(HDC a0,\n                                     LPRECT a1,\n                                     UINT a2,\n                                     UINT a3)\n{\n    _PrintEnter(\"DrawFrameControl(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DrawFrameControl(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"DrawFrameControl(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DrawIcon(HDC a0,\n                             int a1,\n                             int a2,\n                             HICON a3)\n{\n    _PrintEnter(\"DrawIcon(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DrawIcon(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"DrawIcon(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DrawIconEx(HDC a0,\n                               int a1,\n                               int a2,\n                               HICON a3,\n                               int a4,\n                               int a5,\n                               UINT a6,\n                               HBRUSH a7,\n                               UINT a8)\n{\n    _PrintEnter(\"DrawIconEx(%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DrawIconEx(a0, a1, a2, a3, a4, a5, a6, a7, a8);\n    } __finally {\n        _PrintExit(\"DrawIconEx(,,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DrawMenuBar(HWND a0)\n{\n    _PrintEnter(\"DrawMenuBar(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DrawMenuBar(a0);\n    } __finally {\n        _PrintExit(\"DrawMenuBar() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DrawStateA(HDC a0,\n                               HBRUSH a1,\n                               DRAWSTATEPROC a2,\n                               LPARAM a3,\n                               WPARAM a4,\n                               int a5,\n                               int a6,\n                               int a7,\n                               int a8,\n                               UINT a9)\n{\n    _PrintEnter(\"DrawStateA(%p,%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DrawStateA(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);\n    } __finally {\n        _PrintExit(\"DrawStateA(,,,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DrawStateW(HDC a0,\n                               HBRUSH a1,\n                               DRAWSTATEPROC a2,\n                               LPARAM a3,\n                               WPARAM a4,\n                               int a5,\n                               int a6,\n                               int a7,\n                               int a8,\n                               UINT a9)\n{\n    _PrintEnter(\"DrawStateW(%p,%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DrawStateW(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);\n    } __finally {\n        _PrintExit(\"DrawStateW(,,,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_DrawTextA(HDC a0,\n                             LPCSTR a1,\n                             int a2,\n                             LPRECT a3,\n                             UINT a4)\n{\n    _PrintEnter(\"DrawTextA(%p,%hs,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    int rv = 0;\n    __try {\n        rv = Real_DrawTextA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"DrawTextA(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_DrawTextExA(HDC a0,\n                               LPSTR a1,\n                               int a2,\n                               LPRECT a3,\n                               UINT a4,\n                               LPDRAWTEXTPARAMS a5)\n{\n    _PrintEnter(\"DrawTextExA(%p,%hs,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    int rv = 0;\n    __try {\n        rv = Real_DrawTextExA(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"DrawTextExA(,%hs,,,,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_DrawTextExW(HDC a0,\n                               LPWSTR a1,\n                               int a2,\n                               LPRECT a3,\n                               UINT a4,\n                               LPDRAWTEXTPARAMS a5)\n{\n    _PrintEnter(\"DrawTextExW(%p,%ls,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    int rv = 0;\n    __try {\n        rv = Real_DrawTextExW(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"DrawTextExW(,%ls,,,,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_DrawTextW(HDC a0,\n                             LPCWSTR a1,\n                             int a2,\n                             LPRECT a3,\n                             UINT a4)\n{\n    _PrintEnter(\"DrawTextW(%p,%ls,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    int rv = 0;\n    __try {\n        rv = Real_DrawTextW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"DrawTextW(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_DuplicateHandle(HANDLE a0,\n                                    HANDLE a1,\n                                    HANDLE a2,\n                                    LPHANDLE a3,\n                                    DWORD a4,\n                                    BOOL a5,\n                                    DWORD a6)\n{\n    _PrintEnter(\"DuplicateHandle(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DuplicateHandle(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"DuplicateHandle(,,,%p,,,) -> %p\\n\", a3 != NULL ? *a3 : NULL, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_Ellipse(HDC a0,\n                            int a1,\n                            int a2,\n                            int a3,\n                            int a4)\n{\n    _PrintEnter(\"Ellipse(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_Ellipse(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"Ellipse(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EmptyClipboard(void)\n{\n    _PrintEnter(\"EmptyClipboard()\\n\");\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EmptyClipboard();\n    } __finally {\n        _PrintExit(\"EmptyClipboard() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EnableMenuItem(HMENU a0,\n                                   UINT a1,\n                                   UINT a2)\n{\n    _PrintEnter(\"EnableMenuItem(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnableMenuItem(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"EnableMenuItem(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EnableScrollBar(HWND a0,\n                                    UINT a1,\n                                    UINT a2)\n{\n    _PrintEnter(\"EnableScrollBar(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnableScrollBar(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"EnableScrollBar(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EnableWindow(HWND a0,\n                                 BOOL a1)\n{\n    _PrintEnter(\"EnableWindow(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnableWindow(a0, a1);\n    } __finally {\n        _PrintExit(\"EnableWindow(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EndDeferWindowPos(HDWP a0)\n{\n    _PrintEnter(\"EndDeferWindowPos(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EndDeferWindowPos(a0);\n    } __finally {\n        _PrintExit(\"EndDeferWindowPos() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EndDialog(HWND a0,\n                              INT_PTR a1)\n{\n    _PrintEnter(\"EndDialog(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EndDialog(a0, a1);\n    } __finally {\n        _PrintExit(\"EndDialog(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_EndDoc(HDC a0)\n{\n    _PrintEnter(\"EndDoc(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_EndDoc(a0);\n    } __finally {\n        _PrintExit(\"EndDoc() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_EndPage(HDC a0)\n{\n    _PrintEnter(\"EndPage(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_EndPage(a0);\n    } __finally {\n        _PrintExit(\"EndPage() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EndPaint(HWND a0,\n                             PAINTSTRUCT* a1)\n{\n    _PrintEnter(\"EndPaint(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EndPaint(a0, a1);\n    } __finally {\n        _PrintExit(\"EndPaint(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EndPath(HDC a0)\n{\n    _PrintEnter(\"EndPath(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EndPath(a0);\n    } __finally {\n        _PrintExit(\"EndPath() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EndUpdateResourceA(HANDLE a0,\n                                       BOOL a1)\n{\n    _PrintEnter(\"EndUpdateResourceA(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EndUpdateResourceA(a0, a1);\n    } __finally {\n        _PrintExit(\"EndUpdateResourceA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EndUpdateResourceW(HANDLE a0,\n                                       BOOL a1)\n{\n    _PrintEnter(\"EndUpdateResourceW(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EndUpdateResourceW(a0, a1);\n    } __finally {\n        _PrintExit(\"EndUpdateResourceW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EnumCalendarInfoA(CALINFO_ENUMPROCA a0,\n                                      LCID a1,\n                                      CALID a2,\n                                      CALTYPE a3)\n{\n    _PrintEnter(\"EnumCalendarInfoA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnumCalendarInfoA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"EnumCalendarInfoA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EnumCalendarInfoW(CALINFO_ENUMPROCW a0,\n                                      LCID a1,\n                                      CALID a2,\n                                      CALTYPE a3)\n{\n    _PrintEnter(\"EnumCalendarInfoW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnumCalendarInfoW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"EnumCalendarInfoW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EnumChildWindows(HWND a0,\n                                     WNDENUMPROC a1,\n                                     LPARAM a2)\n{\n    _PrintEnter(\"EnumChildWindows(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnumChildWindows(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"EnumChildWindows(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_EnumClipboardFormats(UINT a0)\n{\n    _PrintEnter(\"EnumClipboardFormats(%p)\\n\", a0);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_EnumClipboardFormats(a0);\n    } __finally {\n        _PrintExit(\"EnumClipboardFormats() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EnumDateFormatsA(DATEFMT_ENUMPROCA a0,\n                                     LCID a1,\n                                     DWORD a2)\n{\n    _PrintEnter(\"EnumDateFormatsA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnumDateFormatsA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"EnumDateFormatsA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EnumDateFormatsW(DATEFMT_ENUMPROCW a0,\n                                     LCID a1,\n                                     DWORD a2)\n{\n    _PrintEnter(\"EnumDateFormatsW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnumDateFormatsW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"EnumDateFormatsW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EnumDesktopWindows(HDESK a0,\n                                       WNDENUMPROC a1,\n                                       LPARAM a2)\n{\n    _PrintEnter(\"EnumDesktopWindows(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnumDesktopWindows(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"EnumDesktopWindows(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EnumDesktopsA(HWINSTA a0,\n                                  DESKTOPENUMPROCA a1,\n                                  LPARAM a2)\n{\n    _PrintEnter(\"EnumDesktopsA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnumDesktopsA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"EnumDesktopsA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EnumDesktopsW(HWINSTA a0,\n                                  DESKTOPENUMPROCW a1,\n                                  LPARAM a2)\n{\n    _PrintEnter(\"EnumDesktopsW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnumDesktopsW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"EnumDesktopsW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EnumDisplaySettingsA(LPCSTR a0,\n                                         DWORD a1,\n                                         LPDEVMODEA a2)\n{\n    _PrintEnter(\"EnumDisplaySettingsA(%hs,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnumDisplaySettingsA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"EnumDisplaySettingsA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EnumDisplaySettingsW(LPCWSTR a0,\n                                         DWORD a1,\n                                         LPDEVMODEW a2)\n{\n    _PrintEnter(\"EnumDisplaySettingsW(%ls,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnumDisplaySettingsW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"EnumDisplaySettingsW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EnumEnhMetaFile(HDC a0,\n                                    HENHMETAFILE a1,\n                                    ENHMFENUMPROC a2,\n                                    LPVOID a3,\n                                    RECT* a4)\n{\n    _PrintEnter(\"EnumEnhMetaFile(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnumEnhMetaFile(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"EnumEnhMetaFile(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_EnumFontFamiliesA(HDC a0,\n                                     LPCSTR a1,\n                                     FONTENUMPROCA a2,\n                                     LPARAM a3)\n{\n    _PrintEnter(\"EnumFontFamiliesA(%p,%hs,%p,%p)\\n\", a0, a1, a2, a3);\n\n    int rv = 0;\n    __try {\n        rv = Real_EnumFontFamiliesA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"EnumFontFamiliesA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_EnumFontFamiliesExA(HDC a0,\n                                       LPLOGFONTA a1,\n                                       FONTENUMPROCA a2,\n                                       LPARAM a3,\n                                       DWORD a4)\n{\n    _PrintEnter(\"EnumFontFamiliesExA(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    int rv = 0;\n    __try {\n        rv = Real_EnumFontFamiliesExA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"EnumFontFamiliesExA(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_EnumFontFamiliesExW(HDC a0,\n                                       LPLOGFONTW a1,\n                                       FONTENUMPROCW a2,\n                                       LPARAM a3,\n                                       DWORD a4)\n{\n    _PrintEnter(\"EnumFontFamiliesExW(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    int rv = 0;\n    __try {\n        rv = Real_EnumFontFamiliesExW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"EnumFontFamiliesExW(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_EnumFontFamiliesW(HDC a0,\n                                     LPCWSTR a1,\n                                     FONTENUMPROCW a2,\n                                     LPARAM a3)\n{\n    _PrintEnter(\"EnumFontFamiliesW(%p,%ls,%p,%p)\\n\", a0, a1, a2, a3);\n\n    int rv = 0;\n    __try {\n        rv = Real_EnumFontFamiliesW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"EnumFontFamiliesW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_EnumFontsA(HDC a0,\n                              LPCSTR a1,\n                              FONTENUMPROCA a2,\n                              LPARAM a3)\n{\n    _PrintEnter(\"EnumFontsA(%p,%hs,%p,%p)\\n\", a0, a1, a2, a3);\n\n    int rv = 0;\n    __try {\n        rv = Real_EnumFontsA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"EnumFontsA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_EnumFontsW(HDC a0,\n                              LPCWSTR a1,\n                              FONTENUMPROCW a2,\n                              LPARAM a3)\n{\n    _PrintEnter(\"EnumFontsW(%p,%ls,%p,%p)\\n\", a0, a1, a2, a3);\n\n    int rv = 0;\n    __try {\n        rv = Real_EnumFontsW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"EnumFontsW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_EnumICMProfilesA(HDC a0,\n                                    ICMENUMPROCA a1,\n                                    LPARAM a2)\n{\n    _PrintEnter(\"EnumICMProfilesA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_EnumICMProfilesA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"EnumICMProfilesA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_EnumICMProfilesW(HDC a0,\n                                    ICMENUMPROCW a1,\n                                    LPARAM a2)\n{\n    _PrintEnter(\"EnumICMProfilesW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_EnumICMProfilesW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"EnumICMProfilesW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EnumMetaFile(HDC a0,\n                                 HMETAFILE a1,\n                                 MFENUMPROC a2,\n                                 LPARAM a3)\n{\n    _PrintEnter(\"EnumMetaFile(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnumMetaFile(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"EnumMetaFile(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_EnumObjects(HDC a0,\n                               int a1,\n                               GOBJENUMPROC a2,\n                               LPARAM a3)\n{\n    _PrintEnter(\"EnumObjects(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    int rv = 0;\n    __try {\n        rv = Real_EnumObjects(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"EnumObjects(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_EnumPropsA(HWND a0,\n                              PROPENUMPROCA a1)\n{\n    _PrintEnter(\"EnumPropsA(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_EnumPropsA(a0, a1);\n    } __finally {\n        _PrintExit(\"EnumPropsA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_EnumPropsExA(HWND a0,\n                                PROPENUMPROCEXA a1,\n                                LPARAM a2)\n{\n    _PrintEnter(\"EnumPropsExA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_EnumPropsExA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"EnumPropsExA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_EnumPropsExW(HWND a0,\n                                PROPENUMPROCEXW a1,\n                                LPARAM a2)\n{\n    _PrintEnter(\"EnumPropsExW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_EnumPropsExW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"EnumPropsExW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_EnumPropsW(HWND a0,\n                              PROPENUMPROCW a1)\n{\n    _PrintEnter(\"EnumPropsW(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_EnumPropsW(a0, a1);\n    } __finally {\n        _PrintExit(\"EnumPropsW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\n#if _MSC_VER < 1300\nBOOL __stdcall Mine_EnumResourceLanguagesA(HMODULE a0,\n                                           LPCSTR a1,\n                                           LPCSTR a2,\n                                           ENUMRESLANGPROC a3,\n                                           LONG_PTR a4)\n#else\nBOOL __stdcall Mine_EnumResourceLanguagesA(HMODULE a0,\n                                           LPCSTR a1,\n                                           LPCSTR a2,\n                                           ENUMRESLANGPROCA a3,\n                                           LONG_PTR a4)\n#endif\n{\n    _PrintEnter(\"EnumResourceLanguagesA(%p,%hs,%hs,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnumResourceLanguagesA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"EnumResourceLanguagesA(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\n#if _MSC_VER < 1300\nBOOL __stdcall Mine_EnumResourceLanguagesW(HMODULE a0,\n                                           LPCWSTR a1,\n                                           LPCWSTR a2,\n                                           ENUMRESLANGPROC a3,\n                                           LONG_PTR a4)\n#else\nBOOL __stdcall Mine_EnumResourceLanguagesW(HMODULE a0,\n                                           LPCWSTR a1,\n                                           LPCWSTR a2,\n                                           ENUMRESLANGPROCW a3,\n                                           LONG_PTR a4)\n#endif\n{\n    _PrintEnter(\"EnumResourceLanguagesW(%p,%ls,%ls,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnumResourceLanguagesW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"EnumResourceLanguagesW(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\n#if _MSC_VER < 1300\nBOOL __stdcall Mine_EnumResourceNamesA(HMODULE a0,\n                                       LPCSTR a1,\n                                       ENUMRESNAMEPROC a2,\n                                       LONG_PTR a3)\n#else\nBOOL __stdcall Mine_EnumResourceNamesA(HMODULE a0,\n                                       LPCSTR a1,\n                                       ENUMRESNAMEPROCA a2,\n                                       LONG_PTR a3)\n#endif\n{\n    _PrintEnter(\"EnumResourceNamesA(%p,%hs,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnumResourceNamesA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"EnumResourceNamesA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\n#if _MSC_VER < 1300\nBOOL __stdcall Mine_EnumResourceNamesW(HMODULE a0,\n                                       LPCWSTR a1,\n                                       ENUMRESNAMEPROC a2,\n                                       LONG_PTR a3)\n#else\nBOOL __stdcall Mine_EnumResourceNamesW(HMODULE a0,\n                                       LPCWSTR a1,\n                                       ENUMRESNAMEPROCW a2,\n                                       LONG_PTR a3)\n#endif\n{\n    _PrintEnter(\"EnumResourceNamesW(%p,%ls,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnumResourceNamesW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"EnumResourceNamesW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\n#if _MSC_VER < 1300\nBOOL __stdcall Mine_EnumResourceTypesA(HMODULE a0,\n                                       ENUMRESTYPEPROC a1,\n                                       LONG_PTR a2)\n#else\nBOOL __stdcall Mine_EnumResourceTypesA(HMODULE a0,\n                                       ENUMRESTYPEPROCA a1,\n                                       LONG_PTR a2)\n#endif\n{\n    _PrintEnter(\"EnumResourceTypesA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnumResourceTypesA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"EnumResourceTypesA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\n#if _MSC_VER < 1300\nBOOL __stdcall Mine_EnumResourceTypesW(HMODULE a0,\n                                       ENUMRESTYPEPROC a1,\n                                       LONG_PTR a2)\n#else\nBOOL __stdcall Mine_EnumResourceTypesW(HMODULE a0,\n                                       ENUMRESTYPEPROCW a1,\n                                       LONG_PTR a2)\n#endif\n{\n    _PrintEnter(\"EnumResourceTypesW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnumResourceTypesW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"EnumResourceTypesW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EnumSystemCodePagesA(CODEPAGE_ENUMPROCA a0,\n                                         DWORD a1)\n{\n    _PrintEnter(\"EnumSystemCodePagesA(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnumSystemCodePagesA(a0, a1);\n    } __finally {\n        _PrintExit(\"EnumSystemCodePagesA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EnumSystemCodePagesW(CODEPAGE_ENUMPROCW a0,\n                                         DWORD a1)\n{\n    _PrintEnter(\"EnumSystemCodePagesW(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnumSystemCodePagesW(a0, a1);\n    } __finally {\n        _PrintExit(\"EnumSystemCodePagesW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\n#if(WINVER >= 0x0500)\nBOOL __stdcall Mine_EnumSystemLocalesA(LOCALE_ENUMPROCA a0,\n                                       DWORD a1)\n{\n    _PrintEnter(\"EnumSystemLocalesA(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnumSystemLocalesA(a0, a1);\n    } __finally {\n        _PrintExit(\"EnumSystemLocalesA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EnumSystemLocalesW(LOCALE_ENUMPROCW a0,\n                                       DWORD a1)\n{\n    _PrintEnter(\"EnumSystemLocalesW(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnumSystemLocalesW(a0, a1);\n    } __finally {\n        _PrintExit(\"EnumSystemLocalesW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n#endif // (WINVER >= 0x0500)\n\nBOOL __stdcall Mine_EnumThreadWindows(DWORD a0,\n                                      WNDENUMPROC a1,\n                                      LPARAM a2)\n{\n    _PrintEnter(\"EnumThreadWindows(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnumThreadWindows(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"EnumThreadWindows(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EnumTimeFormatsA(TIMEFMT_ENUMPROCA a0,\n                                     LCID a1,\n                                     DWORD a2)\n{\n    _PrintEnter(\"EnumTimeFormatsA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnumTimeFormatsA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"EnumTimeFormatsA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EnumTimeFormatsW(TIMEFMT_ENUMPROCW a0,\n                                     LCID a1,\n                                     DWORD a2)\n{\n    _PrintEnter(\"EnumTimeFormatsW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnumTimeFormatsW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"EnumTimeFormatsW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EnumWindowStationsA(WINSTAENUMPROCA a0,\n                                        LPARAM a1)\n{\n    _PrintEnter(\"EnumWindowStationsA(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnumWindowStationsA(a0, a1);\n    } __finally {\n        _PrintExit(\"EnumWindowStationsA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EnumWindowStationsW(WINSTAENUMPROCW a0,\n                                        LPARAM a1)\n{\n    _PrintEnter(\"EnumWindowStationsW(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnumWindowStationsW(a0, a1);\n    } __finally {\n        _PrintExit(\"EnumWindowStationsW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EnumWindows(WNDENUMPROC a0,\n                                LPARAM a1)\n{\n    _PrintEnter(\"EnumWindows(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EnumWindows(a0, a1);\n    } __finally {\n        _PrintExit(\"EnumWindows(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EqualRect(RECT* a0,\n                              RECT* a1)\n{\n    _PrintEnter(\"EqualRect(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EqualRect(a0, a1);\n    } __finally {\n        _PrintExit(\"EqualRect(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EqualRgn(HRGN a0,\n                             HRGN a1)\n{\n    _PrintEnter(\"EqualRgn(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EqualRgn(a0, a1);\n    } __finally {\n        _PrintExit(\"EqualRgn(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_EraseTape(HANDLE a0,\n                               DWORD a1,\n                               BOOL a2)\n{\n    _PrintEnter(\"EraseTape(%p,%p,%p)\\n\", a0, a1, a2);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_EraseTape(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"EraseTape(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_Escape(HDC a0,\n                          int a1,\n                          int a2,\n                          LPCSTR a3,\n                          LPVOID a4)\n{\n    _PrintEnter(\"Escape(%p,%p,%p,%hs,%p)\\n\", a0, a1, a2, a3, a4);\n\n    int rv = 0;\n    __try {\n        rv = Real_Escape(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"Escape(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_EscapeCommFunction(HANDLE a0,\n                                       DWORD a1)\n{\n    _PrintEnter(\"EscapeCommFunction(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EscapeCommFunction(a0, a1);\n    } __finally {\n        _PrintExit(\"EscapeCommFunction(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_ExcludeClipRect(HDC a0,\n                                   int a1,\n                                   int a2,\n                                   int a3,\n                                   int a4)\n{\n    _PrintEnter(\"ExcludeClipRect(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    int rv = 0;\n    __try {\n        rv = Real_ExcludeClipRect(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"ExcludeClipRect(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_ExcludeUpdateRgn(HDC a0,\n                                    HWND a1)\n{\n    _PrintEnter(\"ExcludeUpdateRgn(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_ExcludeUpdateRgn(a0, a1);\n    } __finally {\n        _PrintExit(\"ExcludeUpdateRgn(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nvoid __stdcall Mine_ExitProcess(UINT a0)\n{\n    _PrintEnter(\"ExitProcess(%p)\\n\", a0);\n\n    __try {\n        Real_ExitProcess(a0);\n    } __finally {\n        _PrintExit(\"ExitProcess() ->\\n\");\n    };\n}\n\nvoid __stdcall Mine_ExitThread(DWORD a0)\n{\n    _PrintEnter(\"ExitThread(%p)\\n\", a0);\n\n    __try {\n        Real_ExitThread(a0);\n    } __finally {\n        _PrintExit(\"ExitThread() ->\\n\");\n    };\n}\n\nBOOL __stdcall Mine_ExitWindowsEx(UINT a0,\n                                  DWORD a1)\n{\n    _PrintEnter(\"ExitWindowsEx(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ExitWindowsEx(a0, a1);\n    } __finally {\n        _PrintExit(\"ExitWindowsEx(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_ExpandEnvironmentStringsA(LPCSTR a0,\n                                               LPSTR a1,\n                                               DWORD a2)\n{\n    _PrintEnter(\"ExpandEnvironmentStringsA(%hs,%p,%p)\\n\", a0, a1, a2);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_ExpandEnvironmentStringsA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"ExpandEnvironmentStringsA(,%hs,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_ExpandEnvironmentStringsW(LPCWSTR a0,\n                                               LPWSTR a1,\n                                               DWORD a2)\n{\n    _PrintEnter(\"ExpandEnvironmentStringsW(%ls,%p,%p)\\n\", a0, a1, a2);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_ExpandEnvironmentStringsW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"ExpandEnvironmentStringsW(,%ls,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nHPEN __stdcall Mine_ExtCreatePen(DWORD a0,\n                                 DWORD a1,\n                                 LOGBRUSH* a2,\n                                 DWORD a3,\n                                 DWORD* a4)\n{\n    _PrintEnter(\"ExtCreatePen(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    HPEN rv = 0;\n    __try {\n        rv = Real_ExtCreatePen(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"ExtCreatePen(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRGN __stdcall Mine_ExtCreateRegion(XFORM* a0,\n                                    DWORD a1,\n                                    RGNDATA* a2)\n{\n    _PrintEnter(\"ExtCreateRegion(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HRGN rv = 0;\n    __try {\n        rv = Real_ExtCreateRegion(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"ExtCreateRegion(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_ExtEscape(HDC a0,\n                             int a1,\n                             int a2,\n                             LPCSTR a3,\n                             int a4,\n                             LPSTR a5)\n{\n    _PrintEnter(\"ExtEscape(%p,%p,%p,%hs,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    int rv = 0;\n    __try {\n        rv = Real_ExtEscape(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"ExtEscape(,,,,,%hs) -> %p\\n\", a5, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ExtFloodFill(HDC a0,\n                                 int a1,\n                                 int a2,\n                                 COLORREF a3,\n                                 UINT a4)\n{\n    _PrintEnter(\"ExtFloodFill(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ExtFloodFill(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"ExtFloodFill(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_ExtSelectClipRgn(HDC a0,\n                                    HRGN a1,\n                                    int a2)\n{\n    _PrintEnter(\"ExtSelectClipRgn(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_ExtSelectClipRgn(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"ExtSelectClipRgn(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ExtTextOutA(HDC a0,\n                                int a1,\n                                int a2,\n                                UINT a3,\n                                RECT* a4,\n                                LPCSTR a5,\n                                UINT a6,\n                                INT* a7)\n{\n    _PrintEnter(\"ExtTextOutA(%p,%p,%p,%p,%p,%hs,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ExtTextOutA(a0, a1, a2, a3, a4, a5, a6, a7);\n    } __finally {\n        _PrintExit(\"ExtTextOutA(,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ExtTextOutW(HDC a0,\n                                int a1,\n                                int a2,\n                                UINT a3,\n                                RECT* a4,\n                                LPCWSTR a5,\n                                UINT a6,\n                                INT* a7)\n{\n    _PrintEnter(\"ExtTextOutW(%p,%p,%p,%p,%p,%ls,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ExtTextOutW(a0, a1, a2, a3, a4, a5, a6, a7);\n    } __finally {\n        _PrintExit(\"ExtTextOutW(,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nvoid __stdcall Mine_FatalAppExitA(UINT a0,\n                                  LPCSTR a1)\n{\n    _PrintEnter(\"FatalAppExitA(%p,%hs)\\n\", a0, a1);\n\n    __try {\n        Real_FatalAppExitA(a0, a1);\n    } __finally {\n        _PrintExit(\"FatalAppExitA(,) ->\\n\");\n    };\n}\n\nvoid __stdcall Mine_FatalAppExitW(UINT a0,\n                                  LPCWSTR a1)\n{\n    _PrintEnter(\"FatalAppExitW(%p,%ls)\\n\", a0, a1);\n\n    __try {\n        Real_FatalAppExitW(a0, a1);\n    } __finally {\n        _PrintExit(\"FatalAppExitW(,) ->\\n\");\n    };\n}\n\nvoid __stdcall Mine_FatalExit(int a0)\n{\n    _PrintEnter(\"FatalExit(%p)\\n\", a0);\n\n    __try {\n        Real_FatalExit(a0);\n    } __finally {\n        _PrintExit(\"FatalExit() ->\\n\");\n    };\n}\n\nBOOL __stdcall Mine_FileTimeToDosDateTime(FILETIME* a0,\n                                          LPWORD a1,\n                                          LPWORD a2)\n{\n    _PrintEnter(\"FileTimeToDosDateTime(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_FileTimeToDosDateTime(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"FileTimeToDosDateTime(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_FileTimeToLocalFileTime(FILETIME* a0,\n                                            LPFILETIME a1)\n{\n    _PrintEnter(\"FileTimeToLocalFileTime(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_FileTimeToLocalFileTime(a0, a1);\n    } __finally {\n        _PrintExit(\"FileTimeToLocalFileTime(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_FileTimeToSystemTime(FILETIME* a0,\n                                         LPSYSTEMTIME a1)\n{\n    _PrintEnter(\"FileTimeToSystemTime(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_FileTimeToSystemTime(a0, a1);\n    } __finally {\n        _PrintExit(\"FileTimeToSystemTime(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_FillConsoleOutputAttribute(HANDLE a0,\n                                               WORD a1,\n                                               DWORD a2,\n                                               COORD a3,\n                                               LPDWORD a4)\n{\n    _PrintEnter(\"FillConsoleOutputAttribute(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_FillConsoleOutputAttribute(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"FillConsoleOutputAttribute(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_FillConsoleOutputCharacterA(HANDLE a0,\n                                                CHAR a1,\n                                                DWORD a2,\n                                                COORD a3,\n                                                LPDWORD a4)\n{\n    _PrintEnter(\"FillConsoleOutputCharacterA(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_FillConsoleOutputCharacterA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"FillConsoleOutputCharacterA(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_FillConsoleOutputCharacterW(HANDLE a0,\n                                                WCHAR a1,\n                                                DWORD a2,\n                                                COORD a3,\n                                                LPDWORD a4)\n{\n    _PrintEnter(\"FillConsoleOutputCharacterW(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_FillConsoleOutputCharacterW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"FillConsoleOutputCharacterW(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_FillPath(HDC a0)\n{\n    _PrintEnter(\"FillPath(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_FillPath(a0);\n    } __finally {\n        _PrintExit(\"FillPath() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_FillRect(HDC a0,\n                            RECT* a1,\n                            HBRUSH a2)\n{\n    _PrintEnter(\"FillRect(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_FillRect(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"FillRect(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_FillRgn(HDC a0,\n                            HRGN a1,\n                            HBRUSH a2)\n{\n    _PrintEnter(\"FillRgn(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_FillRgn(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"FillRgn(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nATOM __stdcall Mine_FindAtomA(LPCSTR a0)\n{\n    _PrintEnter(\"FindAtomA(%hs)\\n\", a0);\n\n    ATOM rv = 0;\n    __try {\n        rv = Real_FindAtomA(a0);\n    } __finally {\n        _PrintExit(\"FindAtomA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nATOM __stdcall Mine_FindAtomW(LPCWSTR a0)\n{\n    _PrintEnter(\"FindAtomW(%ls)\\n\", a0);\n\n    ATOM rv = 0;\n    __try {\n        rv = Real_FindAtomW(a0);\n    } __finally {\n        _PrintExit(\"FindAtomW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_FindClose(HANDLE a0)\n{\n    _PrintEnter(\"FindClose(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_FindClose(a0);\n    } __finally {\n        _PrintExit(\"FindClose() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_FindCloseChangeNotification(HANDLE a0)\n{\n    _PrintEnter(\"FindCloseChangeNotification(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_FindCloseChangeNotification(a0);\n    } __finally {\n        _PrintExit(\"FindCloseChangeNotification() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_FindFirstChangeNotificationA(LPCSTR a0,\n                                                   BOOL a1,\n                                                   DWORD a2)\n{\n    _PrintEnter(\"FindFirstChangeNotificationA(%hs,%p,%p)\\n\", a0, a1, a2);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_FindFirstChangeNotificationA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"FindFirstChangeNotificationA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_FindFirstChangeNotificationW(LPCWSTR a0,\n                                                   BOOL a1,\n                                                   DWORD a2)\n{\n    _PrintEnter(\"FindFirstChangeNotificationW(%ls,%p,%p)\\n\", a0, a1, a2);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_FindFirstChangeNotificationW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"FindFirstChangeNotificationW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_FindFirstFileA(LPCSTR a0,\n                                     LPWIN32_FIND_DATAA a1)\n{\n    _PrintEnter(\"FindFirstFileA(%hs,%p)\\n\", a0, a1);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_FindFirstFileA(a0, a1);\n    } __finally {\n        _PrintExit(\"FindFirstFileA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_FindFirstFileExA(LPCSTR a0,\n                                       FINDEX_INFO_LEVELS a1,\n                                       LPVOID a2,\n                                       FINDEX_SEARCH_OPS a3,\n                                       LPVOID a4,\n                                       DWORD a5)\n{\n    _PrintEnter(\"FindFirstFileExA(%hs,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_FindFirstFileExA(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"FindFirstFileExA(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_FindFirstFileExW(LPCWSTR a0,\n                                       FINDEX_INFO_LEVELS a1,\n                                       LPVOID a2,\n                                       FINDEX_SEARCH_OPS a3,\n                                       LPVOID a4,\n                                       DWORD a5)\n{\n    _PrintEnter(\"FindFirstFileExW(%ls,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_FindFirstFileExW(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"FindFirstFileExW(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_FindFirstFileW(LPCWSTR a0,\n                                     LPWIN32_FIND_DATAW a1)\n{\n    _PrintEnter(\"FindFirstFileW(%ls,%p)\\n\", a0, a1);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_FindFirstFileW(a0, a1);\n    } __finally {\n        _PrintExit(\"FindFirstFileW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_FindNextChangeNotification(HANDLE a0)\n{\n    _PrintEnter(\"FindNextChangeNotification(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_FindNextChangeNotification(a0);\n    } __finally {\n        _PrintExit(\"FindNextChangeNotification() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_FindNextFileA(HANDLE a0,\n                                  LPWIN32_FIND_DATAA a1)\n{\n    _PrintEnter(\"FindNextFileA(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_FindNextFileA(a0, a1);\n    } __finally {\n        _PrintExit(\"FindNextFileA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_FindNextFileW(HANDLE a0,\n                                  LPWIN32_FIND_DATAW a1)\n{\n    _PrintEnter(\"FindNextFileW(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_FindNextFileW(a0, a1);\n    } __finally {\n        _PrintExit(\"FindNextFileW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRSRC __stdcall Mine_FindResourceA(HMODULE a0,\n                                   LPCSTR a1,\n                                   LPCSTR a2)\n{\n    _PrintEnter(\"FindResourceA(%p,%hs,%hs)\\n\", a0, a1, a2);\n\n    HRSRC rv = 0;\n    __try {\n        rv = Real_FindResourceA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"FindResourceA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRSRC __stdcall Mine_FindResourceExA(HMODULE a0,\n                                     LPCSTR a1,\n                                     LPCSTR a2,\n                                     WORD a3)\n{\n    _PrintEnter(\"FindResourceExA(%p,%hs,%hs,%p)\\n\", a0, a1, a2, a3);\n\n    HRSRC rv = 0;\n    __try {\n        rv = Real_FindResourceExA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"FindResourceExA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRSRC __stdcall Mine_FindResourceExW(HMODULE a0,\n                                     LPCWSTR a1,\n                                     LPCWSTR a2,\n                                     WORD a3)\n{\n    _PrintEnter(\"FindResourceExW(%p,%ls,%ls,%p)\\n\", a0, a1, a2, a3);\n\n    HRSRC rv = 0;\n    __try {\n        rv = Real_FindResourceExW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"FindResourceExW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRSRC __stdcall Mine_FindResourceW(HMODULE a0,\n                                   LPCWSTR a1,\n                                   LPCWSTR a2)\n{\n    _PrintEnter(\"FindResourceW(%p,%ls,%ls)\\n\", a0, a1, a2);\n\n    HRSRC rv = 0;\n    __try {\n        rv = Real_FindResourceW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"FindResourceW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_FindWindowA(LPCSTR a0,\n                                LPCSTR a1)\n{\n    _PrintEnter(\"FindWindowA(%hs,%hs)\\n\", a0, a1);\n\n    HWND rv = 0;\n    __try {\n        rv = Real_FindWindowA(a0, a1);\n    } __finally {\n        _PrintExit(\"FindWindowA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_FindWindowExA(HWND a0,\n                                  HWND a1,\n                                  LPCSTR a2,\n                                  LPCSTR a3)\n{\n    _PrintEnter(\"FindWindowExA(%p,%p,%hs,%hs)\\n\", a0, a1, a2, a3);\n\n    HWND rv = 0;\n    __try {\n        rv = Real_FindWindowExA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"FindWindowExA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_FindWindowExW(HWND a0,\n                                  HWND a1,\n                                  LPCWSTR a2,\n                                  LPCWSTR a3)\n{\n    _PrintEnter(\"FindWindowExW(%p,%p,%ls,%ls)\\n\", a0, a1, a2, a3);\n\n    HWND rv = 0;\n    __try {\n        rv = Real_FindWindowExW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"FindWindowExW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_FindWindowW(LPCWSTR a0,\n                                LPCWSTR a1)\n{\n    _PrintEnter(\"FindWindowW(%ls,%ls)\\n\", a0, a1);\n\n    HWND rv = 0;\n    __try {\n        rv = Real_FindWindowW(a0, a1);\n    } __finally {\n        _PrintExit(\"FindWindowW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_FixBrushOrgEx(HDC a0,\n                                  int a1,\n                                  int a2,\n                                  POINT* a3)\n{\n    _PrintEnter(\"FixBrushOrgEx(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_FixBrushOrgEx(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"FixBrushOrgEx(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_FlashWindow(HWND a0,\n                                BOOL a1)\n{\n    _PrintEnter(\"FlashWindow(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_FlashWindow(a0, a1);\n    } __finally {\n        _PrintExit(\"FlashWindow(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_FlattenPath(HDC a0)\n{\n    _PrintEnter(\"FlattenPath(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_FlattenPath(a0);\n    } __finally {\n        _PrintExit(\"FlattenPath() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_FloodFill(HDC a0,\n                              int a1,\n                              int a2,\n                              COLORREF a3)\n{\n    _PrintEnter(\"FloodFill(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_FloodFill(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"FloodFill(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_FlushConsoleInputBuffer(HANDLE a0)\n{\n    _PrintEnter(\"FlushConsoleInputBuffer(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_FlushConsoleInputBuffer(a0);\n    } __finally {\n        _PrintExit(\"FlushConsoleInputBuffer() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_FlushFileBuffers(HANDLE a0)\n{\n    _PrintEnter(\"FlushFileBuffers(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_FlushFileBuffers(a0);\n    } __finally {\n        _PrintExit(\"FlushFileBuffers() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_FlushViewOfFile(LPCVOID a0,\n                                    SIZE_T a1)\n{\n    _PrintEnter(\"FlushViewOfFile(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_FlushViewOfFile(a0, a1);\n    } __finally {\n        _PrintExit(\"FlushViewOfFile(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_FmtIdToPropStgName(FMTID* a0,\n                                          LPOLESTR a1)\n{\n    _PrintEnter(\"FmtIdToPropStgName(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_FmtIdToPropStgName(a0, a1);\n    } __finally {\n        _PrintExit(\"FmtIdToPropStgName(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_FoldStringA(DWORD a0,\n                               LPCSTR a1,\n                               int a2,\n                               LPSTR a3,\n                               int a4)\n{\n    _PrintEnter(\"FoldStringA(%p,%hs,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    int rv = 0;\n    __try {\n        rv = Real_FoldStringA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"FoldStringA(,,,%hs,) -> %p\\n\", a3, rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_FoldStringW(DWORD a0,\n                               LPCWSTR a1,\n                               int a2,\n                               LPWSTR a3,\n                               int a4)\n{\n    _PrintEnter(\"FoldStringW(%p,%ls,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    int rv = 0;\n    __try {\n        rv = Real_FoldStringW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"FoldStringW(,,,%ls,) -> %p\\n\", a3, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_FormatMessageA(DWORD a0,\n                                    LPCVOID a1,\n                                    DWORD a2,\n                                    DWORD a3,\n                                    LPSTR a4,\n                                    DWORD a5,\n                                    va_list* a6)\n{\n    _PrintEnter(\"FormatMessageA(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_FormatMessageA(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"FormatMessageA(,,,,%hs,,) -> %p\\n\", a4, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_FormatMessageW(DWORD a0,\n                                    LPCVOID a1,\n                                    DWORD a2,\n                                    DWORD a3,\n                                    LPWSTR a4,\n                                    DWORD a5,\n                                    va_list* a6)\n{\n    _PrintEnter(\"FormatMessageW(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_FormatMessageW(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"FormatMessageW(,,,,%ls,,) -> %p\\n\", a4, rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_FrameRect(HDC a0,\n                             RECT* a1,\n                             HBRUSH a2)\n{\n    _PrintEnter(\"FrameRect(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_FrameRect(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"FrameRect(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_FrameRgn(HDC a0,\n                             HRGN a1,\n                             HBRUSH a2,\n                             int a3,\n                             int a4)\n{\n    _PrintEnter(\"FrameRgn(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_FrameRgn(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"FrameRgn(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_FreeConsole(void)\n{\n    _PrintEnter(\"FreeConsole()\\n\");\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_FreeConsole();\n    } __finally {\n        _PrintExit(\"FreeConsole() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_FreeDDElParam(UINT a0,\n                                  LPARAM a1)\n{\n    _PrintEnter(\"FreeDDElParam(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_FreeDDElParam(a0, a1);\n    } __finally {\n        _PrintExit(\"FreeDDElParam(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_FreeEnvironmentStringsA(LPSTR a0)\n{\n    _PrintEnter(\"FreeEnvironmentStringsA(%hs)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_FreeEnvironmentStringsA(a0);\n    } __finally {\n        _PrintExit(\"FreeEnvironmentStringsA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_FreeEnvironmentStringsW(LPWSTR a0)\n{\n    _PrintEnter(\"FreeEnvironmentStringsW(%ls)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_FreeEnvironmentStringsW(a0);\n    } __finally {\n        _PrintExit(\"FreeEnvironmentStringsW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_FreeLibrary(HMODULE a0)\n{\n    _PrintEnter(\"FreeLibrary(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_FreeLibrary(a0);\n    } __finally {\n        _PrintExit(\"FreeLibrary() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nvoid __stdcall Mine_FreeLibraryAndExitThread(HMODULE a0,\n                                             DWORD a1)\n{\n    _PrintEnter(\"FreeLibraryAndExitThread(%p,%p)\\n\", a0, a1);\n\n    __try {\n        Real_FreeLibraryAndExitThread(a0, a1);\n    } __finally {\n        _PrintExit(\"FreeLibraryAndExitThread(,) ->\\n\");\n    };\n}\n\nHRESULT __stdcall Mine_FreePropVariantArray(ULONG a0,\n                                            PROPVARIANT* a1)\n{\n    _PrintEnter(\"FreePropVariantArray(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_FreePropVariantArray(a0, a1);\n    } __finally {\n        _PrintExit(\"FreePropVariantArray(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_FreeResource(HGLOBAL a0)\n{\n    _PrintEnter(\"FreeResource(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_FreeResource(a0);\n    } __finally {\n        _PrintExit(\"FreeResource() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GdiComment(HDC a0,\n                               UINT a1,\n                               BYTE* a2)\n{\n    _PrintEnter(\"GdiComment(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GdiComment(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GdiComment(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GdiFlush(void)\n{\n    _PrintEnter(\"GdiFlush()\\n\");\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GdiFlush();\n    } __finally {\n        _PrintExit(\"GdiFlush() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GdiGetBatchLimit(void)\n{\n    _PrintEnter(\"GdiGetBatchLimit()\\n\");\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GdiGetBatchLimit();\n    } __finally {\n        _PrintExit(\"GdiGetBatchLimit() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GdiSetBatchLimit(DWORD a0)\n{\n    _PrintEnter(\"GdiSetBatchLimit(%p)\\n\", a0);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GdiSetBatchLimit(a0);\n    } __finally {\n        _PrintExit(\"GdiSetBatchLimit() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GenerateConsoleCtrlEvent(DWORD a0,\n                                             DWORD a1)\n{\n    _PrintEnter(\"GenerateConsoleCtrlEvent(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GenerateConsoleCtrlEvent(a0, a1);\n    } __finally {\n        _PrintExit(\"GenerateConsoleCtrlEvent(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetACP(void)\n{\n    _PrintEnter(\"GetACP()\\n\");\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetACP();\n    } __finally {\n        _PrintExit(\"GetACP() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_GetActiveWindow(void)\n{\n    _PrintEnter(\"GetActiveWindow()\\n\");\n\n    HWND rv = 0;\n    __try {\n        rv = Real_GetActiveWindow();\n    } __finally {\n        _PrintExit(\"GetActiveWindow() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetArcDirection(HDC a0)\n{\n    _PrintEnter(\"GetArcDirection(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetArcDirection(a0);\n    } __finally {\n        _PrintExit(\"GetArcDirection() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetAspectRatioFilterEx(HDC a0,\n                                           SIZE* a1)\n{\n    _PrintEnter(\"GetAspectRatioFilterEx(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetAspectRatioFilterEx(a0, a1);\n    } __finally {\n        _PrintExit(\"GetAspectRatioFilterEx(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nSHORT __stdcall Mine_GetAsyncKeyState(int a0)\n{\n    _PrintEnter(\"GetAsyncKeyState(%p)\\n\", a0);\n\n    SHORT rv = 0;\n    __try {\n        rv = Real_GetAsyncKeyState(a0);\n    } __finally {\n        _PrintExit(\"GetAsyncKeyState() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetAtomNameA(ATOM a0,\n                                 LPSTR a1,\n                                 int a2)\n{\n    _PrintEnter(\"GetAtomNameA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetAtomNameA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetAtomNameA(,%hs,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetAtomNameW(ATOM a0,\n                                 LPWSTR a1,\n                                 int a2)\n{\n    _PrintEnter(\"GetAtomNameW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetAtomNameW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetAtomNameW(,%ls,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetBinaryTypeA(LPCSTR a0,\n                                   LPDWORD a1)\n{\n    _PrintEnter(\"GetBinaryTypeA(%hs,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetBinaryTypeA(a0, a1);\n    } __finally {\n        _PrintExit(\"GetBinaryTypeA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetBinaryTypeW(LPCWSTR a0,\n                                   LPDWORD a1)\n{\n    _PrintEnter(\"GetBinaryTypeW(%ls,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetBinaryTypeW(a0, a1);\n    } __finally {\n        _PrintExit(\"GetBinaryTypeW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLONG __stdcall Mine_GetBitmapBits(HBITMAP a0,\n                                  LONG a1,\n                                  LPVOID a2)\n{\n    _PrintEnter(\"GetBitmapBits(%p,%p,%p)\\n\", a0, a1, a2);\n\n    LONG rv = 0;\n    __try {\n        rv = Real_GetBitmapBits(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetBitmapBits(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetBitmapDimensionEx(HBITMAP a0,\n                                         SIZE* a1)\n{\n    _PrintEnter(\"GetBitmapDimensionEx(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetBitmapDimensionEx(a0, a1);\n    } __finally {\n        _PrintExit(\"GetBitmapDimensionEx(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nCOLORREF __stdcall Mine_GetBkColor(HDC a0)\n{\n    _PrintEnter(\"GetBkColor(%p)\\n\", a0);\n\n    COLORREF rv = 0;\n    __try {\n        rv = Real_GetBkColor(a0);\n    } __finally {\n        _PrintExit(\"GetBkColor() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetBkMode(HDC a0)\n{\n    _PrintEnter(\"GetBkMode(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetBkMode(a0);\n    } __finally {\n        _PrintExit(\"GetBkMode() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetBoundsRect(HDC a0,\n                                  LPRECT a1,\n                                  UINT a2)\n{\n    _PrintEnter(\"GetBoundsRect(%p,%p,%p)\\n\", a0, a1, a2);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetBoundsRect(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetBoundsRect(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetBrushOrgEx(HDC a0,\n                                  POINT* a1)\n{\n    _PrintEnter(\"GetBrushOrgEx(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetBrushOrgEx(a0, a1);\n    } __finally {\n        _PrintExit(\"GetBrushOrgEx(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetCPInfo(UINT a0,\n                              LPCPINFO a1)\n{\n    _PrintEnter(\"GetCPInfo(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetCPInfo(a0, a1);\n    } __finally {\n        _PrintExit(\"GetCPInfo(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_GetCapture(void)\n{\n    _PrintEnter(\"GetCapture()\\n\");\n\n    HWND rv = 0;\n    __try {\n        rv = Real_GetCapture();\n    } __finally {\n        _PrintExit(\"GetCapture() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetCaretBlinkTime(void)\n{\n    _PrintEnter(\"GetCaretBlinkTime()\\n\");\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetCaretBlinkTime();\n    } __finally {\n        _PrintExit(\"GetCaretBlinkTime() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetCaretPos(POINT* a0)\n{\n    _PrintEnter(\"GetCaretPos(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetCaretPos(a0);\n    } __finally {\n        _PrintExit(\"GetCaretPos() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetCharABCWidthsA(HDC a0,\n                                      UINT a1,\n                                      UINT a2,\n                                      LPABC a3)\n{\n    _PrintEnter(\"GetCharABCWidthsA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetCharABCWidthsA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetCharABCWidthsA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetCharABCWidthsFloatA(HDC a0,\n                                           UINT a1,\n                                           UINT a2,\n                                           LPABCFLOAT a3)\n{\n    _PrintEnter(\"GetCharABCWidthsFloatA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetCharABCWidthsFloatA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetCharABCWidthsFloatA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetCharABCWidthsFloatW(HDC a0,\n                                           UINT a1,\n                                           UINT a2,\n                                           LPABCFLOAT a3)\n{\n    _PrintEnter(\"GetCharABCWidthsFloatW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetCharABCWidthsFloatW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetCharABCWidthsFloatW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetCharABCWidthsW(HDC a0,\n                                      UINT a1,\n                                      UINT a2,\n                                      LPABC a3)\n{\n    _PrintEnter(\"GetCharABCWidthsW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetCharABCWidthsW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetCharABCWidthsW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetCharWidth32A(HDC a0,\n                                    UINT a1,\n                                    UINT a2,\n                                    LPINT a3)\n{\n    _PrintEnter(\"GetCharWidth32A(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetCharWidth32A(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetCharWidth32A(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetCharWidth32W(HDC a0,\n                                    UINT a1,\n                                    UINT a2,\n                                    LPINT a3)\n{\n    _PrintEnter(\"GetCharWidth32W(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetCharWidth32W(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetCharWidth32W(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetCharWidthA(HDC a0,\n                                  UINT a1,\n                                  UINT a2,\n                                  LPINT a3)\n{\n    _PrintEnter(\"GetCharWidthA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetCharWidthA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetCharWidthA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetCharWidthFloatA(HDC a0,\n                                       UINT a1,\n                                       UINT a2,\n                                       PFLOAT a3)\n{\n    _PrintEnter(\"GetCharWidthFloatA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetCharWidthFloatA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetCharWidthFloatA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetCharWidthFloatW(HDC a0,\n                                       UINT a1,\n                                       UINT a2,\n                                       PFLOAT a3)\n{\n    _PrintEnter(\"GetCharWidthFloatW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetCharWidthFloatW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetCharWidthFloatW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetCharWidthW(HDC a0,\n                                  UINT a1,\n                                  UINT a2,\n                                  LPINT a3)\n{\n    _PrintEnter(\"GetCharWidthW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetCharWidthW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetCharWidthW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetCharacterPlacementA(HDC a0,\n                                            LPCSTR a1,\n                                            int a2,\n                                            int a3,\n                                            LPGCP_RESULTSA a4,\n                                            DWORD a5)\n{\n    _PrintEnter(\"GetCharacterPlacementA(%p,%hs,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetCharacterPlacementA(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"GetCharacterPlacementA(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetCharacterPlacementW(HDC a0,\n                                            LPCWSTR a1,\n                                            int a2,\n                                            int a3,\n                                            LPGCP_RESULTSW a4,\n                                            DWORD a5)\n{\n    _PrintEnter(\"GetCharacterPlacementW(%p,%ls,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetCharacterPlacementW(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"GetCharacterPlacementW(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_GetClassFile(LPCOLESTR a0,\n                                    CLSID* a1)\n{\n    _PrintEnter(\"GetClassFile(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_GetClassFile(a0, a1);\n    } __finally {\n        _PrintExit(\"GetClassFile(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetClassInfoA(HINSTANCE a0,\n                                  LPCSTR a1,\n                                  LPWNDCLASSA a2)\n{\n    _PrintEnter(\"GetClassInfoA(%p,%hs,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetClassInfoA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetClassInfoA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetClassInfoExA(HINSTANCE a0,\n                                    LPCSTR a1,\n                                    LPWNDCLASSEXA a2)\n{\n    _PrintEnter(\"GetClassInfoExA(%p,%hs,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetClassInfoExA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetClassInfoExA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetClassInfoExW(HINSTANCE a0,\n                                    LPCWSTR a1,\n                                    LPWNDCLASSEXW a2)\n{\n    _PrintEnter(\"GetClassInfoExW(%p,%ls,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetClassInfoExW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetClassInfoExW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetClassInfoW(HINSTANCE a0,\n                                  LPCWSTR a1,\n                                  LPWNDCLASSW a2)\n{\n    _PrintEnter(\"GetClassInfoW(%p,%ls,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetClassInfoW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetClassInfoW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetClassLongA(HWND a0,\n                                   int a1)\n{\n    _PrintEnter(\"GetClassLongA(%p,%p)\\n\", a0, a1);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetClassLongA(a0, a1);\n    } __finally {\n        _PrintExit(\"GetClassLongA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetClassLongW(HWND a0,\n                                   int a1)\n{\n    _PrintEnter(\"GetClassLongW(%p,%p)\\n\", a0, a1);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetClassLongW(a0, a1);\n    } __finally {\n        _PrintExit(\"GetClassLongW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetClassNameA(HWND a0,\n                                 LPSTR a1,\n                                 int a2)\n{\n    _PrintEnter(\"GetClassNameA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetClassNameA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetClassNameA(,%hs,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetClassNameW(HWND a0,\n                                 LPWSTR a1,\n                                 int a2)\n{\n    _PrintEnter(\"GetClassNameW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetClassNameW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetClassNameW(,%ls,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nWORD __stdcall Mine_GetClassWord(HWND a0,\n                                 int a1)\n{\n    _PrintEnter(\"GetClassWord(%p,%p)\\n\", a0, a1);\n\n    WORD rv = 0;\n    __try {\n        rv = Real_GetClassWord(a0, a1);\n    } __finally {\n        _PrintExit(\"GetClassWord(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetClientRect(HWND a0,\n                                  LPRECT a1)\n{\n    _PrintEnter(\"GetClientRect(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetClientRect(a0, a1);\n    } __finally {\n        _PrintExit(\"GetClientRect(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetClipBox(HDC a0,\n                              LPRECT a1)\n{\n    _PrintEnter(\"GetClipBox(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetClipBox(a0, a1);\n    } __finally {\n        _PrintExit(\"GetClipBox(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetClipCursor(LPRECT a0)\n{\n    _PrintEnter(\"GetClipCursor(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetClipCursor(a0);\n    } __finally {\n        _PrintExit(\"GetClipCursor() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetClipRgn(HDC a0,\n                              HRGN a1)\n{\n    _PrintEnter(\"GetClipRgn(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetClipRgn(a0, a1);\n    } __finally {\n        _PrintExit(\"GetClipRgn(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_GetClipboardData(UINT a0)\n{\n    _PrintEnter(\"GetClipboardData(%p)\\n\", a0);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_GetClipboardData(a0);\n    } __finally {\n        _PrintExit(\"GetClipboardData() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetClipboardFormatNameA(UINT a0,\n                                           LPSTR a1,\n                                           int a2)\n{\n    _PrintEnter(\"GetClipboardFormatNameA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetClipboardFormatNameA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetClipboardFormatNameA(,%hs,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetClipboardFormatNameW(UINT a0,\n                                           LPWSTR a1,\n                                           int a2)\n{\n    _PrintEnter(\"GetClipboardFormatNameW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetClipboardFormatNameW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetClipboardFormatNameW(,%ls,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_GetClipboardOwner(void)\n{\n    _PrintEnter(\"GetClipboardOwner()\\n\");\n\n    HWND rv = 0;\n    __try {\n        rv = Real_GetClipboardOwner();\n    } __finally {\n        _PrintExit(\"GetClipboardOwner() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_GetClipboardViewer(void)\n{\n    _PrintEnter(\"GetClipboardViewer()\\n\");\n\n    HWND rv = 0;\n    __try {\n        rv = Real_GetClipboardViewer();\n    } __finally {\n        _PrintExit(\"GetClipboardViewer() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetColorAdjustment(HDC a0,\n                                       LPCOLORADJUSTMENT a1)\n{\n    _PrintEnter(\"GetColorAdjustment(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetColorAdjustment(a0, a1);\n    } __finally {\n        _PrintExit(\"GetColorAdjustment(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHCOLORSPACE __stdcall Mine_GetColorSpace(HDC a0)\n{\n    _PrintEnter(\"GetColorSpace(%p)\\n\", a0);\n\n    HCOLORSPACE rv = 0;\n    __try {\n        rv = Real_GetColorSpace(a0);\n    } __finally {\n        _PrintExit(\"GetColorSpace() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetCommConfig(HANDLE a0,\n                                  LPCOMMCONFIG a1,\n                                  LPDWORD a2)\n{\n    _PrintEnter(\"GetCommConfig(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetCommConfig(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetCommConfig(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetCommMask(HANDLE a0,\n                                LPDWORD a1)\n{\n    _PrintEnter(\"GetCommMask(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetCommMask(a0, a1);\n    } __finally {\n        _PrintExit(\"GetCommMask(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetCommModemStatus(HANDLE a0,\n                                       LPDWORD a1)\n{\n    _PrintEnter(\"GetCommModemStatus(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetCommModemStatus(a0, a1);\n    } __finally {\n        _PrintExit(\"GetCommModemStatus(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetCommProperties(HANDLE a0,\n                                      LPCOMMPROP a1)\n{\n    _PrintEnter(\"GetCommProperties(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetCommProperties(a0, a1);\n    } __finally {\n        _PrintExit(\"GetCommProperties(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetCommState(HANDLE a0,\n                                 LPDCB a1)\n{\n    _PrintEnter(\"GetCommState(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetCommState(a0, a1);\n    } __finally {\n        _PrintExit(\"GetCommState(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetCommTimeouts(HANDLE a0,\n                                    LPCOMMTIMEOUTS a1)\n{\n    _PrintEnter(\"GetCommTimeouts(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetCommTimeouts(a0, a1);\n    } __finally {\n        _PrintExit(\"GetCommTimeouts(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLPSTR __stdcall Mine_GetCommandLineA(void)\n{\n    _PrintEnter(\"GetCommandLineA()\\n\");\n\n    LPSTR rv = 0;\n    __try {\n        rv = Real_GetCommandLineA();\n    } __finally {\n        _PrintExit(\"GetCommandLineA() -> %hs\\n\", rv);\n    };\n    return rv;\n}\n\nLPWSTR __stdcall Mine_GetCommandLineW(void)\n{\n    _PrintEnter(\"GetCommandLineW()\\n\");\n\n    LPWSTR rv = 0;\n    __try {\n        rv = Real_GetCommandLineW();\n    } __finally {\n        _PrintExit(\"GetCommandLineW() -> %ls\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetComputerNameA(LPSTR a0,\n                                     LPDWORD a1)\n{\n    _PrintEnter(\"GetComputerNameA(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetComputerNameA(a0, a1);\n    } __finally {\n        _PrintExit(\"GetComputerNameA(%hs,) -> %p\\n\", a0, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetComputerNameW(LPWSTR a0,\n                                     LPDWORD a1)\n{\n    _PrintEnter(\"GetComputerNameW(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetComputerNameW(a0, a1);\n    } __finally {\n        _PrintExit(\"GetComputerNameW(%ls,) -> %p\\n\", a0, rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetConsoleCP(void)\n{\n    _PrintEnter(\"GetConsoleCP()\\n\");\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetConsoleCP();\n    } __finally {\n        _PrintExit(\"GetConsoleCP() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetConsoleCursorInfo(HANDLE a0,\n                                         PCONSOLE_CURSOR_INFO a1)\n{\n    _PrintEnter(\"GetConsoleCursorInfo(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetConsoleCursorInfo(a0, a1);\n    } __finally {\n        _PrintExit(\"GetConsoleCursorInfo(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetConsoleMode(HANDLE a0,\n                                   LPDWORD a1)\n{\n    _PrintEnter(\"GetConsoleMode(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetConsoleMode(a0, a1);\n    } __finally {\n        _PrintExit(\"GetConsoleMode(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetConsoleOutputCP(void)\n{\n    _PrintEnter(\"GetConsoleOutputCP()\\n\");\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetConsoleOutputCP();\n    } __finally {\n        _PrintExit(\"GetConsoleOutputCP() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetConsoleScreenBufferInfo(HANDLE a0,\n                                               PCONSOLE_SCREEN_BUFFER_INFO a1)\n{\n    _PrintEnter(\"GetConsoleScreenBufferInfo(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetConsoleScreenBufferInfo(a0, a1);\n    } __finally {\n        _PrintExit(\"GetConsoleScreenBufferInfo(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetConsoleTitleA(LPSTR a0,\n                                      DWORD a1)\n{\n    _PrintEnter(\"GetConsoleTitleA(%p,%p)\\n\", a0, a1);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetConsoleTitleA(a0, a1);\n    } __finally {\n        _PrintExit(\"GetConsoleTitleA(%hs,) -> %p\\n\", a0, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetConsoleTitleW(LPWSTR a0,\n                                      DWORD a1)\n{\n    _PrintEnter(\"GetConsoleTitleW(%p,%p)\\n\", a0, a1);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetConsoleTitleW(a0, a1);\n    } __finally {\n        _PrintExit(\"GetConsoleTitleW(%ls,) -> %p\\n\", a0, rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_GetConvertStg(LPSTORAGE a0)\n{\n    _PrintEnter(\"GetConvertStg(%p)\\n\", a0);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_GetConvertStg(a0);\n    } __finally {\n        _PrintExit(\"GetConvertStg() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetCurrencyFormatA(LCID a0,\n                                      DWORD a1,\n                                      LPCSTR a2,\n                                      CURRENCYFMTA* a3,\n                                      LPSTR a4,\n                                      int a5)\n{\n    _PrintEnter(\"GetCurrencyFormatA(%p,%p,%hs,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetCurrencyFormatA(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"GetCurrencyFormatA(,,,,%hs,) -> %p\\n\", a4, rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetCurrencyFormatW(LCID a0,\n                                      DWORD a1,\n                                      LPCWSTR a2,\n                                      CURRENCYFMTW* a3,\n                                      LPWSTR a4,\n                                      int a5)\n{\n    _PrintEnter(\"GetCurrencyFormatW(%p,%p,%ls,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetCurrencyFormatW(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"GetCurrencyFormatW(,,,,%ls,) -> %p\\n\", a4, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetCurrentDirectoryA(DWORD a0,\n                                          LPSTR a1)\n{\n    _PrintEnter(\"GetCurrentDirectoryA(%p,%p)\\n\", a0, a1);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetCurrentDirectoryA(a0, a1);\n    } __finally {\n        _PrintExit(\"GetCurrentDirectoryA(,%hs) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetCurrentDirectoryW(DWORD a0,\n                                          LPWSTR a1)\n{\n    _PrintEnter(\"GetCurrentDirectoryW(%p,%p)\\n\", a0, a1);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetCurrentDirectoryW(a0, a1);\n    } __finally {\n        _PrintExit(\"GetCurrentDirectoryW(,%ls) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nHGDIOBJ __stdcall Mine_GetCurrentObject(HDC a0,\n                                        UINT a1)\n{\n    _PrintEnter(\"GetCurrentObject(%p,%p)\\n\", a0, a1);\n\n    HGDIOBJ rv = 0;\n    __try {\n        rv = Real_GetCurrentObject(a0, a1);\n    } __finally {\n        _PrintExit(\"GetCurrentObject(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetCurrentPositionEx(HDC a0,\n                                         POINT* a1)\n{\n    _PrintEnter(\"GetCurrentPositionEx(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetCurrentPositionEx(a0, a1);\n    } __finally {\n        _PrintExit(\"GetCurrentPositionEx(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_GetCurrentProcess(void)\n{\n    _PrintEnter(\"GetCurrentProcess()\\n\");\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_GetCurrentProcess();\n    } __finally {\n        _PrintExit(\"GetCurrentProcess() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetCurrentProcessId(void)\n{\n    _PrintEnter(\"GetCurrentProcessId()\\n\");\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetCurrentProcessId();\n    } __finally {\n        _PrintExit(\"GetCurrentProcessId() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetCurrentThreadId(void)\n{\n    _PrintEnter(\"GetCurrentThreadId()\\n\");\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetCurrentThreadId();\n    } __finally {\n        _PrintExit(\"GetCurrentThreadId() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHCURSOR __stdcall Mine_GetCursor(void)\n{\n    _PrintEnter(\"GetCursor()\\n\");\n\n    HCURSOR rv = 0;\n    __try {\n        rv = Real_GetCursor();\n    } __finally {\n        _PrintExit(\"GetCursor() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetCursorPos(POINT* a0)\n{\n    _PrintEnter(\"GetCursorPos(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetCursorPos(a0);\n    } __finally {\n        _PrintExit(\"GetCursorPos() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHDC __stdcall Mine_GetDC(HWND a0)\n{\n    _PrintEnter(\"GetDC(%p)\\n\", a0);\n\n    HDC rv = 0;\n    __try {\n        rv = Real_GetDC(a0);\n    } __finally {\n        _PrintExit(\"GetDC() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHDC __stdcall Mine_GetDCEx(HWND a0,\n                           HRGN a1,\n                           DWORD a2)\n{\n    _PrintEnter(\"GetDCEx(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HDC rv = 0;\n    __try {\n        rv = Real_GetDCEx(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetDCEx(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetDCOrgEx(HDC a0,\n                               POINT* a1)\n{\n    _PrintEnter(\"GetDCOrgEx(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetDCOrgEx(a0, a1);\n    } __finally {\n        _PrintExit(\"GetDCOrgEx(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetDIBColorTable(HDC a0,\n                                     UINT a1,\n                                     UINT a2,\n                                     RGBQUAD* a3)\n{\n    _PrintEnter(\"GetDIBColorTable(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetDIBColorTable(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetDIBColorTable(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetDIBits(HDC a0,\n                             HBITMAP a1,\n                             UINT a2,\n                             UINT a3,\n                             LPVOID a4,\n                             LPBITMAPINFO a5,\n                             UINT a6)\n{\n    _PrintEnter(\"GetDIBits(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetDIBits(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"GetDIBits(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetDateFormatA(LCID a0,\n                                  DWORD a1,\n                                  SYSTEMTIME* a2,\n                                  LPCSTR a3,\n                                  LPSTR a4,\n                                  int a5)\n{\n    _PrintEnter(\"GetDateFormatA(%p,%p,%p,%hs,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetDateFormatA(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"GetDateFormatA(,,,,%hs,) -> %p\\n\", a4, rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetDateFormatW(LCID a0,\n                                  DWORD a1,\n                                  SYSTEMTIME* a2,\n                                  LPCWSTR a3,\n                                  LPWSTR a4,\n                                  int a5)\n{\n    _PrintEnter(\"GetDateFormatW(%p,%p,%p,%ls,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetDateFormatW(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"GetDateFormatW(,,,,%ls,) -> %p\\n\", a4, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetDefaultCommConfigA(LPCSTR a0,\n                                          LPCOMMCONFIG a1,\n                                          LPDWORD a2)\n{\n    _PrintEnter(\"GetDefaultCommConfigA(%hs,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetDefaultCommConfigA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetDefaultCommConfigA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetDefaultCommConfigW(LPCWSTR a0,\n                                          LPCOMMCONFIG a1,\n                                          LPDWORD a2)\n{\n    _PrintEnter(\"GetDefaultCommConfigW(%ls,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetDefaultCommConfigW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetDefaultCommConfigW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_GetDesktopWindow(void)\n{\n    _PrintEnter(\"GetDesktopWindow()\\n\");\n\n    HWND rv = 0;\n    __try {\n        rv = Real_GetDesktopWindow();\n    } __finally {\n        _PrintExit(\"GetDesktopWindow() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetDeviceCaps(HDC a0,\n                                 int a1)\n{\n    _PrintEnter(\"GetDeviceCaps(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetDeviceCaps(a0, a1);\n    } __finally {\n        _PrintExit(\"GetDeviceCaps(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetDeviceGammaRamp(HDC a0,\n                                       LPVOID a1)\n{\n    _PrintEnter(\"GetDeviceGammaRamp(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetDeviceGammaRamp(a0, a1);\n    } __finally {\n        _PrintExit(\"GetDeviceGammaRamp(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nlong __stdcall Mine_GetDialogBaseUnits(void)\n{\n    _PrintEnter(\"GetDialogBaseUnits()\\n\");\n\n    long rv = 0;\n    __try {\n        rv = Real_GetDialogBaseUnits();\n    } __finally {\n        _PrintExit(\"GetDialogBaseUnits() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetDiskFreeSpaceA(LPCSTR a0,\n                                      LPDWORD a1,\n                                      LPDWORD a2,\n                                      LPDWORD a3,\n                                      LPDWORD a4)\n{\n    _PrintEnter(\"GetDiskFreeSpaceA(%hs,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetDiskFreeSpaceA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"GetDiskFreeSpaceA(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetDiskFreeSpaceExA(LPCSTR a0,\n                                        union _ULARGE_INTEGER* a1,\n                                        union _ULARGE_INTEGER* a2,\n                                        union _ULARGE_INTEGER* a3)\n{\n    _PrintEnter(\"GetDiskFreeSpaceExA(%hs,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetDiskFreeSpaceExA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetDiskFreeSpaceExA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetDiskFreeSpaceExW(LPCWSTR a0,\n                                        union _ULARGE_INTEGER* a1,\n                                        union _ULARGE_INTEGER* a2,\n                                        union _ULARGE_INTEGER* a3)\n{\n    _PrintEnter(\"GetDiskFreeSpaceExW(%ls,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetDiskFreeSpaceExW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetDiskFreeSpaceExW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetDiskFreeSpaceW(LPCWSTR a0,\n                                      LPDWORD a1,\n                                      LPDWORD a2,\n                                      LPDWORD a3,\n                                      LPDWORD a4)\n{\n    _PrintEnter(\"GetDiskFreeSpaceW(%ls,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetDiskFreeSpaceW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"GetDiskFreeSpaceW(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetDlgCtrlID(HWND a0)\n{\n    _PrintEnter(\"GetDlgCtrlID(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetDlgCtrlID(a0);\n    } __finally {\n        _PrintExit(\"GetDlgCtrlID() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_GetDlgItem(HWND a0,\n                               int a1)\n{\n    _PrintEnter(\"GetDlgItem(%p,%p)\\n\", a0, a1);\n\n    HWND rv = 0;\n    __try {\n        rv = Real_GetDlgItem(a0, a1);\n    } __finally {\n        _PrintExit(\"GetDlgItem(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetDlgItemInt(HWND a0,\n                                  int a1,\n                                  BOOL* a2,\n                                  BOOL a3)\n{\n    _PrintEnter(\"GetDlgItemInt(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetDlgItemInt(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetDlgItemInt(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetDlgItemTextA(HWND a0,\n                                    int a1,\n                                    LPSTR a2,\n                                    int a3)\n{\n    _PrintEnter(\"GetDlgItemTextA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetDlgItemTextA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetDlgItemTextA(,,%hs,) -> %p\\n\", a2, rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetDlgItemTextW(HWND a0,\n                                    int a1,\n                                    LPWSTR a2,\n                                    int a3)\n{\n    _PrintEnter(\"GetDlgItemTextW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetDlgItemTextW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetDlgItemTextW(,,%ls,) -> %p\\n\", a2, rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetDoubleClickTime(void)\n{\n    _PrintEnter(\"GetDoubleClickTime()\\n\");\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetDoubleClickTime();\n    } __finally {\n        _PrintExit(\"GetDoubleClickTime() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetDriveTypeA(LPCSTR a0)\n{\n    _PrintEnter(\"GetDriveTypeA(%hs)\\n\", a0);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetDriveTypeA(a0);\n    } __finally {\n        _PrintExit(\"GetDriveTypeA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetDriveTypeW(LPCWSTR a0)\n{\n    _PrintEnter(\"GetDriveTypeW(%ls)\\n\", a0);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetDriveTypeW(a0);\n    } __finally {\n        _PrintExit(\"GetDriveTypeW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHENHMETAFILE __stdcall Mine_GetEnhMetaFileA(LPCSTR a0)\n{\n    _PrintEnter(\"GetEnhMetaFileA(%hs)\\n\", a0);\n\n    HENHMETAFILE rv = 0;\n    __try {\n        rv = Real_GetEnhMetaFileA(a0);\n    } __finally {\n        _PrintExit(\"GetEnhMetaFileA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetEnhMetaFileBits(HENHMETAFILE a0,\n                                       UINT a1,\n                                       LPBYTE a2)\n{\n    _PrintEnter(\"GetEnhMetaFileBits(%p,%p,%p)\\n\", a0, a1, a2);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetEnhMetaFileBits(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetEnhMetaFileBits(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetEnhMetaFileDescriptionA(HENHMETAFILE a0,\n                                               UINT a1,\n                                               LPSTR a2)\n{\n    _PrintEnter(\"GetEnhMetaFileDescriptionA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetEnhMetaFileDescriptionA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetEnhMetaFileDescriptionA(,,%hs) -> %p\\n\", a2, rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetEnhMetaFileDescriptionW(HENHMETAFILE a0,\n                                               UINT a1,\n                                               LPWSTR a2)\n{\n    _PrintEnter(\"GetEnhMetaFileDescriptionW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetEnhMetaFileDescriptionW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetEnhMetaFileDescriptionW(,,%ls) -> %p\\n\", a2, rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetEnhMetaFileHeader(HENHMETAFILE a0,\n                                         UINT a1,\n                                         ENHMETAHEADER* a2)\n{\n    _PrintEnter(\"GetEnhMetaFileHeader(%p,%p,%p)\\n\", a0, a1, a2);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetEnhMetaFileHeader(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetEnhMetaFileHeader(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetEnhMetaFilePaletteEntries(HENHMETAFILE a0,\n                                                 UINT a1,\n                                                 PALETTEENTRY* a2)\n{\n    _PrintEnter(\"GetEnhMetaFilePaletteEntries(%p,%p,%p)\\n\", a0, a1, a2);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetEnhMetaFilePaletteEntries(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetEnhMetaFilePaletteEntries(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetEnhMetaFilePixelFormat(HENHMETAFILE a0,\n                                              UINT a1,\n                                              PIXELFORMATDESCRIPTOR* a2)\n{\n    _PrintEnter(\"GetEnhMetaFilePixelFormat(%p,%p,%p)\\n\", a0, a1, a2);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetEnhMetaFilePixelFormat(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetEnhMetaFilePixelFormat(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHENHMETAFILE __stdcall Mine_GetEnhMetaFileW(LPCWSTR a0)\n{\n    _PrintEnter(\"GetEnhMetaFileW(%ls)\\n\", a0);\n\n    HENHMETAFILE rv = 0;\n    __try {\n        rv = Real_GetEnhMetaFileW(a0);\n    } __finally {\n        _PrintExit(\"GetEnhMetaFileW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLPSTR __stdcall Mine_GetEnvironmentStrings(void)\n{\n    _PrintEnter(\"GetEnvironmentStrings()\\n\");\n\n    LPSTR rv = 0;\n    __try {\n        rv = Real_GetEnvironmentStrings();\n    } __finally {\n        _PrintExit(\"GetEnvironmentStrings() -> %hs\\n\", rv);\n    };\n    return rv;\n}\n\nLPWSTR __stdcall Mine_GetEnvironmentStringsW(void)\n{\n    _PrintEnter(\"GetEnvironmentStringsW()\\n\");\n\n    LPWSTR rv = 0;\n    __try {\n        rv = Real_GetEnvironmentStringsW();\n    } __finally {\n        _PrintExit(\"GetEnvironmentStringsW() -> %ls\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetEnvironmentVariableA(LPCSTR a0,\n                                             LPSTR a1,\n                                             DWORD a2)\n{\n    _PrintEnter(\"GetEnvironmentVariableA(%hs,%p,%p)\\n\", a0, a1, a2);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetEnvironmentVariableA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetEnvironmentVariableA(,%hs,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetEnvironmentVariableW(LPCWSTR a0,\n                                             LPWSTR a1,\n                                             DWORD a2)\n{\n    _PrintEnter(\"GetEnvironmentVariableW(%ls,%p,%p)\\n\", a0, a1, a2);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetEnvironmentVariableW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetEnvironmentVariableW(,%ls,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetExitCodeProcess(HANDLE a0,\n                                       LPDWORD a1)\n{\n    _PrintEnter(\"GetExitCodeProcess(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetExitCodeProcess(a0, a1);\n    } __finally {\n        _PrintExit(\"GetExitCodeProcess(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetExitCodeThread(HANDLE a0,\n                                      LPDWORD a1)\n{\n    _PrintEnter(\"GetExitCodeThread(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetExitCodeThread(a0, a1);\n    } __finally {\n        _PrintExit(\"GetExitCodeThread(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetFileAttributesA(LPCSTR a0)\n{\n    _PrintEnter(\"GetFileAttributesA(%hs)\\n\", a0);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetFileAttributesA(a0);\n    } __finally {\n        _PrintExit(\"GetFileAttributesA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetFileAttributesExA(LPCSTR a0,\n                                         enum _GET_FILEEX_INFO_LEVELS a1,\n                                         LPVOID a2)\n{\n    _PrintEnter(\"GetFileAttributesExA(%hs,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetFileAttributesExA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetFileAttributesExA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetFileAttributesExW(LPCWSTR a0,\n                                         enum _GET_FILEEX_INFO_LEVELS a1,\n                                         LPVOID a2)\n{\n    _PrintEnter(\"GetFileAttributesExW(%ls,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetFileAttributesExW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetFileAttributesExW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetFileAttributesW(LPCWSTR a0)\n{\n    _PrintEnter(\"GetFileAttributesW(%ls)\\n\", a0);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetFileAttributesW(a0);\n    } __finally {\n        _PrintExit(\"GetFileAttributesW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetFileInformationByHandle(HANDLE a0,\n                                               LPBY_HANDLE_FILE_INFORMATION a1)\n{\n    _PrintEnter(\"GetFileInformationByHandle(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetFileInformationByHandle(a0, a1);\n    } __finally {\n        _PrintExit(\"GetFileInformationByHandle(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetFileSize(HANDLE a0,\n                                 LPDWORD a1)\n{\n    _PrintEnter(\"GetFileSize(%p,%p)\\n\", a0, a1);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetFileSize(a0, a1);\n    } __finally {\n        _PrintExit(\"GetFileSize(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetFileTime(HANDLE a0,\n                                LPFILETIME a1,\n                                LPFILETIME a2,\n                                LPFILETIME a3)\n{\n    _PrintEnter(\"GetFileTime(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetFileTime(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetFileTime(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetFileType(HANDLE a0)\n{\n    _PrintEnter(\"GetFileType(%p)\\n\", a0);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetFileType(a0);\n    } __finally {\n        _PrintExit(\"GetFileType() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_GetFocus(void)\n{\n    _PrintEnter(\"GetFocus()\\n\");\n\n    HWND rv = 0;\n    __try {\n        rv = Real_GetFocus();\n    } __finally {\n        _PrintExit(\"GetFocus() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetFontData(HDC a0,\n                                 DWORD a1,\n                                 DWORD a2,\n                                 LPVOID a3,\n                                 DWORD a4)\n{\n    _PrintEnter(\"GetFontData(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetFontData(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"GetFontData(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetFontLanguageInfo(HDC a0)\n{\n    _PrintEnter(\"GetFontLanguageInfo(%p)\\n\", a0);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetFontLanguageInfo(a0);\n    } __finally {\n        _PrintExit(\"GetFontLanguageInfo() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_GetForegroundWindow(void)\n{\n    _PrintEnter(\"GetForegroundWindow()\\n\");\n\n    HWND rv = 0;\n    __try {\n        rv = Real_GetForegroundWindow();\n    } __finally {\n        _PrintExit(\"GetForegroundWindow() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetFullPathNameA(LPCSTR a0,\n                                      DWORD a1,\n                                      LPSTR a2,\n                                      LPSTR* a3)\n{\n    _PrintEnter(\"GetFullPathNameA(%hs,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetFullPathNameA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetFullPathNameA(,,%hs,) -> %p\\n\", a2, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetFullPathNameW(LPCWSTR a0,\n                                      DWORD a1,\n                                      LPWSTR a2,\n                                      LPWSTR* a3)\n{\n    _PrintEnter(\"GetFullPathNameW(%ls,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetFullPathNameW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetFullPathNameW(,,%ls,) -> %p\\n\", a2, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetGlyphOutlineA(HDC a0,\n                                      UINT a1,\n                                      UINT a2,\n                                      LPGLYPHMETRICS a3,\n                                      DWORD a4,\n                                      LPVOID a5,\n                                      MAT2* a6)\n{\n    _PrintEnter(\"GetGlyphOutlineA(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetGlyphOutlineA(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"GetGlyphOutlineA(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetGlyphOutlineW(HDC a0,\n                                      UINT a1,\n                                      UINT a2,\n                                      LPGLYPHMETRICS a3,\n                                      DWORD a4,\n                                      LPVOID a5,\n                                      MAT2* a6)\n{\n    _PrintEnter(\"GetGlyphOutlineW(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetGlyphOutlineW(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"GetGlyphOutlineW(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetGraphicsMode(HDC a0)\n{\n    _PrintEnter(\"GetGraphicsMode(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetGraphicsMode(a0);\n    } __finally {\n        _PrintExit(\"GetGraphicsMode() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_GetHGlobalFromILockBytes(ILockBytes* a0,\n                                                HGLOBAL* a1)\n{\n    _PrintEnter(\"GetHGlobalFromILockBytes(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_GetHGlobalFromILockBytes(a0, a1);\n    } __finally {\n        _PrintExit(\"GetHGlobalFromILockBytes(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_GetHGlobalFromStream(LPSTREAM a0,\n                                            HGLOBAL* a1)\n{\n    _PrintEnter(\"GetHGlobalFromStream(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_GetHGlobalFromStream(a0, a1);\n    } __finally {\n        _PrintExit(\"GetHGlobalFromStream(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetHandleInformation(HANDLE a0,\n                                         LPDWORD a1)\n{\n    _PrintEnter(\"GetHandleInformation(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetHandleInformation(a0, a1);\n    } __finally {\n        _PrintExit(\"GetHandleInformation(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetICMProfileA(HDC a0,\n                                   LPDWORD a1,\n                                   LPSTR a2)\n{\n    _PrintEnter(\"GetICMProfileA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetICMProfileA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetICMProfileA(,,%hs) -> %p\\n\", a2, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetICMProfileW(HDC a0,\n                                   LPDWORD a1,\n                                   LPWSTR a2)\n{\n    _PrintEnter(\"GetICMProfileW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetICMProfileW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetICMProfileW(,,%ls) -> %p\\n\", a2, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetIconInfo(HICON a0,\n                                PICONINFO a1)\n{\n    _PrintEnter(\"GetIconInfo(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetIconInfo(a0, a1);\n    } __finally {\n        _PrintExit(\"GetIconInfo(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetInputState(void)\n{\n    _PrintEnter(\"GetInputState()\\n\");\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetInputState();\n    } __finally {\n        _PrintExit(\"GetInputState() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetKBCodePage(void)\n{\n    _PrintEnter(\"GetKBCodePage()\\n\");\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetKBCodePage();\n    } __finally {\n        _PrintExit(\"GetKBCodePage() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetKerningPairsA(HDC a0,\n                                      DWORD a1,\n                                      KERNINGPAIR* a2)\n{\n    _PrintEnter(\"GetKerningPairsA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetKerningPairsA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetKerningPairsA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetKerningPairsW(HDC a0,\n                                      DWORD a1,\n                                      KERNINGPAIR* a2)\n{\n    _PrintEnter(\"GetKerningPairsW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetKerningPairsW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetKerningPairsW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetKeyNameTextA(LONG a0,\n                                   LPSTR a1,\n                                   int a2)\n{\n    _PrintEnter(\"GetKeyNameTextA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetKeyNameTextA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetKeyNameTextA(,%hs,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetKeyNameTextW(LONG a0,\n                                   LPWSTR a1,\n                                   int a2)\n{\n    _PrintEnter(\"GetKeyNameTextW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetKeyNameTextW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetKeyNameTextW(,%ls,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nSHORT __stdcall Mine_GetKeyState(int a0)\n{\n    _PrintEnter(\"GetKeyState(%p)\\n\", a0);\n\n    SHORT rv = 0;\n    __try {\n        rv = Real_GetKeyState(a0);\n    } __finally {\n        _PrintExit(\"GetKeyState() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHKL __stdcall Mine_GetKeyboardLayout(DWORD a0)\n{\n    _PrintEnter(\"GetKeyboardLayout(%p)\\n\", a0);\n\n    HKL rv = 0;\n    __try {\n        rv = Real_GetKeyboardLayout(a0);\n    } __finally {\n        _PrintExit(\"GetKeyboardLayout() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetKeyboardLayoutList(int a0,\n                                         HKL* a1)\n{\n    _PrintEnter(\"GetKeyboardLayoutList(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetKeyboardLayoutList(a0, a1);\n    } __finally {\n        _PrintExit(\"GetKeyboardLayoutList(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetKeyboardLayoutNameA(LPSTR a0)\n{\n    _PrintEnter(\"GetKeyboardLayoutNameA(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetKeyboardLayoutNameA(a0);\n    } __finally {\n        _PrintExit(\"GetKeyboardLayoutNameA(%hs) -> %p\\n\", a0, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetKeyboardLayoutNameW(LPWSTR a0)\n{\n    _PrintEnter(\"GetKeyboardLayoutNameW(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetKeyboardLayoutNameW(a0);\n    } __finally {\n        _PrintExit(\"GetKeyboardLayoutNameW(%ls) -> %p\\n\", a0, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetKeyboardState(PBYTE a0)\n{\n    _PrintEnter(\"GetKeyboardState(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetKeyboardState(a0);\n    } __finally {\n        _PrintExit(\"GetKeyboardState() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetKeyboardType(int a0)\n{\n    _PrintEnter(\"GetKeyboardType(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetKeyboardType(a0);\n    } __finally {\n        _PrintExit(\"GetKeyboardType() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_GetLastActivePopup(HWND a0)\n{\n    _PrintEnter(\"GetLastActivePopup(%p)\\n\", a0);\n\n    HWND rv = 0;\n    __try {\n        rv = Real_GetLastActivePopup(a0);\n    } __finally {\n        _PrintExit(\"GetLastActivePopup() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nvoid __stdcall Mine_GetLocalTime(LPSYSTEMTIME a0)\n{\n    _PrintEnter(\"GetLocalTime(%p)\\n\", a0);\n\n    __try {\n        Real_GetLocalTime(a0);\n    } __finally {\n        _PrintExit(\"GetLocalTime() ->\\n\");\n    };\n}\n\nint __stdcall Mine_GetLocaleInfoA(LCID a0,\n                                  LCTYPE a1,\n                                  LPSTR a2,\n                                  int a3)\n{\n    _PrintEnter(\"GetLocaleInfoA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetLocaleInfoA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetLocaleInfoA(,,%hs,) -> %p\\n\", a2, rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetLocaleInfoW(LCID a0,\n                                  LCTYPE a1,\n                                  LPWSTR a2,\n                                  int a3)\n{\n    _PrintEnter(\"GetLocaleInfoW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetLocaleInfoW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetLocaleInfoW(,,%ls,) -> %p\\n\", a2, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetLogColorSpaceA(HCOLORSPACE a0,\n                                      LOGCOLORSPACEA* a1,\n                                      DWORD a2)\n{\n    _PrintEnter(\"GetLogColorSpaceA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetLogColorSpaceA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetLogColorSpaceA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetLogColorSpaceW(HCOLORSPACE a0,\n                                      LOGCOLORSPACEW* a1,\n                                      DWORD a2)\n{\n    _PrintEnter(\"GetLogColorSpaceW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetLogColorSpaceW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetLogColorSpaceW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetLogicalDriveStringsA(DWORD a0,\n                                             LPSTR a1)\n{\n    _PrintEnter(\"GetLogicalDriveStringsA(%p,%p)\\n\", a0, a1);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetLogicalDriveStringsA(a0, a1);\n    } __finally {\n        _PrintExit(\"GetLogicalDriveStringsA(,%hs) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetLogicalDriveStringsW(DWORD a0,\n                                             LPWSTR a1)\n{\n    _PrintEnter(\"GetLogicalDriveStringsW(%p,%p)\\n\", a0, a1);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetLogicalDriveStringsW(a0, a1);\n    } __finally {\n        _PrintExit(\"GetLogicalDriveStringsW(,%ls) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetLogicalDrives(void)\n{\n    _PrintEnter(\"GetLogicalDrives()\\n\");\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetLogicalDrives();\n    } __finally {\n        _PrintExit(\"GetLogicalDrives() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetMailslotInfo(HANDLE a0,\n                                    LPDWORD a1,\n                                    LPDWORD a2,\n                                    LPDWORD a3,\n                                    LPDWORD a4)\n{\n    _PrintEnter(\"GetMailslotInfo(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetMailslotInfo(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"GetMailslotInfo(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetMapMode(HDC a0)\n{\n    _PrintEnter(\"GetMapMode(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetMapMode(a0);\n    } __finally {\n        _PrintExit(\"GetMapMode() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHMENU __stdcall Mine_GetMenu(HWND a0)\n{\n    _PrintEnter(\"GetMenu(%p)\\n\", a0);\n\n    HMENU rv = 0;\n    __try {\n        rv = Real_GetMenu(a0);\n    } __finally {\n        _PrintExit(\"GetMenu() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLONG __stdcall Mine_GetMenuCheckMarkDimensions(void)\n{\n    _PrintEnter(\"GetMenuCheckMarkDimensions()\\n\");\n\n    LONG rv = 0;\n    __try {\n        rv = Real_GetMenuCheckMarkDimensions();\n    } __finally {\n        _PrintExit(\"GetMenuCheckMarkDimensions() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetMenuContextHelpId(HMENU a0)\n{\n    _PrintEnter(\"GetMenuContextHelpId(%p)\\n\", a0);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetMenuContextHelpId(a0);\n    } __finally {\n        _PrintExit(\"GetMenuContextHelpId() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetMenuDefaultItem(HMENU a0,\n                                       UINT a1,\n                                       UINT a2)\n{\n    _PrintEnter(\"GetMenuDefaultItem(%p,%p,%p)\\n\", a0, a1, a2);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetMenuDefaultItem(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetMenuDefaultItem(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetMenuItemCount(HMENU a0)\n{\n    _PrintEnter(\"GetMenuItemCount(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetMenuItemCount(a0);\n    } __finally {\n        _PrintExit(\"GetMenuItemCount() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetMenuItemID(HMENU a0,\n                                  int a1)\n{\n    _PrintEnter(\"GetMenuItemID(%p,%p)\\n\", a0, a1);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetMenuItemID(a0, a1);\n    } __finally {\n        _PrintExit(\"GetMenuItemID(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetMenuItemInfoA(HMENU a0,\n                                     UINT a1,\n                                     BOOL a2,\n                                     LPMENUITEMINFOA a3)\n{\n    _PrintEnter(\"GetMenuItemInfoA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetMenuItemInfoA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetMenuItemInfoA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetMenuItemInfoW(HMENU a0,\n                                     UINT a1,\n                                     BOOL a2,\n                                     LPMENUITEMINFOW a3)\n{\n    _PrintEnter(\"GetMenuItemInfoW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetMenuItemInfoW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetMenuItemInfoW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetMenuItemRect(HWND a0,\n                                    HMENU a1,\n                                    UINT a2,\n                                    LPRECT a3)\n{\n    _PrintEnter(\"GetMenuItemRect(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetMenuItemRect(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetMenuItemRect(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetMenuState(HMENU a0,\n                                 UINT a1,\n                                 UINT a2)\n{\n    _PrintEnter(\"GetMenuState(%p,%p,%p)\\n\", a0, a1, a2);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetMenuState(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetMenuState(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetMenuStringA(HMENU a0,\n                                  UINT a1,\n                                  LPSTR a2,\n                                  int a3,\n                                  UINT a4)\n{\n    _PrintEnter(\"GetMenuStringA(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetMenuStringA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"GetMenuStringA(,,%hs,,) -> %p\\n\", a2, rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetMenuStringW(HMENU a0,\n                                  UINT a1,\n                                  LPWSTR a2,\n                                  int a3,\n                                  UINT a4)\n{\n    _PrintEnter(\"GetMenuStringW(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetMenuStringW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"GetMenuStringW(,,%ls,,) -> %p\\n\", a2, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetMessageA(LPMSG a0,\n                                HWND a1,\n                                UINT a2,\n                                UINT a3)\n{\n    _PrintEnter(\"GetMessageA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetMessageA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetMessageA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLPARAM __stdcall Mine_GetMessageExtraInfo(void)\n{\n    _PrintEnter(\"GetMessageExtraInfo()\\n\");\n\n    LPARAM rv = 0;\n    __try {\n        rv = Real_GetMessageExtraInfo();\n    } __finally {\n        _PrintExit(\"GetMessageExtraInfo() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetMessagePos(void)\n{\n    _PrintEnter(\"GetMessagePos()\\n\");\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetMessagePos();\n    } __finally {\n        _PrintExit(\"GetMessagePos() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLONG __stdcall Mine_GetMessageTime(void)\n{\n    _PrintEnter(\"GetMessageTime()\\n\");\n\n    LONG rv = 0;\n    __try {\n        rv = Real_GetMessageTime();\n    } __finally {\n        _PrintExit(\"GetMessageTime() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetMessageW(LPMSG a0,\n                                HWND a1,\n                                UINT a2,\n                                UINT a3)\n{\n    _PrintEnter(\"GetMessageW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetMessageW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetMessageW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHMETAFILE __stdcall Mine_GetMetaFileA(LPCSTR a0)\n{\n    _PrintEnter(\"GetMetaFileA(%hs)\\n\", a0);\n\n    HMETAFILE rv = 0;\n    __try {\n        rv = Real_GetMetaFileA(a0);\n    } __finally {\n        _PrintExit(\"GetMetaFileA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetMetaFileBitsEx(HMETAFILE a0,\n                                      UINT a1,\n                                      LPVOID a2)\n{\n    _PrintEnter(\"GetMetaFileBitsEx(%p,%p,%p)\\n\", a0, a1, a2);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetMetaFileBitsEx(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetMetaFileBitsEx(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHMETAFILE __stdcall Mine_GetMetaFileW(LPCWSTR a0)\n{\n    _PrintEnter(\"GetMetaFileW(%ls)\\n\", a0);\n\n    HMETAFILE rv = 0;\n    __try {\n        rv = Real_GetMetaFileW(a0);\n    } __finally {\n        _PrintExit(\"GetMetaFileW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetMetaRgn(HDC a0,\n                              HRGN a1)\n{\n    _PrintEnter(\"GetMetaRgn(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetMetaRgn(a0, a1);\n    } __finally {\n        _PrintExit(\"GetMetaRgn(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetMiterLimit(HDC a0,\n                                  PFLOAT a1)\n{\n    _PrintEnter(\"GetMiterLimit(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetMiterLimit(a0, a1);\n    } __finally {\n        _PrintExit(\"GetMiterLimit(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetModuleFileNameA(HMODULE a0,\n                                        LPSTR a1,\n                                        DWORD a2)\n{\n    _PrintEnter(\"GetModuleFileNameA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetModuleFileNameA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetModuleFileNameA(,%hs,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetModuleFileNameW(HMODULE a0,\n                                        LPWSTR a1,\n                                        DWORD a2)\n{\n    _PrintEnter(\"GetModuleFileNameW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetModuleFileNameW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetModuleFileNameW(,%ls,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nHMODULE __stdcall Mine_GetModuleHandleA(LPCSTR a0)\n{\n    _PrintEnter(\"GetModuleHandleA(%hs)\\n\", a0);\n\n    HMODULE rv = 0;\n    __try {\n        rv = Real_GetModuleHandleA(a0);\n    } __finally {\n        _PrintExit(\"GetModuleHandleA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHMODULE __stdcall Mine_GetModuleHandleW(LPCWSTR a0)\n{\n    _PrintEnter(\"GetModuleHandleW(%ls)\\n\", a0);\n\n    HMODULE rv = 0;\n    __try {\n        rv = Real_GetModuleHandleW(a0);\n    } __finally {\n        _PrintExit(\"GetModuleHandleW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetNamedPipeHandleStateA(HANDLE a0,\n                                             LPDWORD a1,\n                                             LPDWORD a2,\n                                             LPDWORD a3,\n                                             LPDWORD a4,\n                                             LPSTR a5,\n                                             DWORD a6)\n{\n    _PrintEnter(\"GetNamedPipeHandleStateA(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetNamedPipeHandleStateA(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"GetNamedPipeHandleStateA(,,,,,%hs,) -> %p\\n\", a5, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetNamedPipeHandleStateW(HANDLE a0,\n                                             LPDWORD a1,\n                                             LPDWORD a2,\n                                             LPDWORD a3,\n                                             LPDWORD a4,\n                                             LPWSTR a5,\n                                             DWORD a6)\n{\n    _PrintEnter(\"GetNamedPipeHandleStateW(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetNamedPipeHandleStateW(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"GetNamedPipeHandleStateW(,,,,,%ls,) -> %p\\n\", a5, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetNamedPipeInfo(HANDLE a0,\n                                     LPDWORD a1,\n                                     LPDWORD a2,\n                                     LPDWORD a3,\n                                     LPDWORD a4)\n{\n    _PrintEnter(\"GetNamedPipeInfo(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetNamedPipeInfo(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"GetNamedPipeInfo(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nCOLORREF __stdcall Mine_GetNearestColor(HDC a0,\n                                        COLORREF a1)\n{\n    _PrintEnter(\"GetNearestColor(%p,%p)\\n\", a0, a1);\n\n    COLORREF rv = 0;\n    __try {\n        rv = Real_GetNearestColor(a0, a1);\n    } __finally {\n        _PrintExit(\"GetNearestColor(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetNearestPaletteIndex(HPALETTE a0,\n                                           COLORREF a1)\n{\n    _PrintEnter(\"GetNearestPaletteIndex(%p,%p)\\n\", a0, a1);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetNearestPaletteIndex(a0, a1);\n    } __finally {\n        _PrintExit(\"GetNearestPaletteIndex(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_GetNextDlgGroupItem(HWND a0,\n                                        HWND a1,\n                                        BOOL a2)\n{\n    _PrintEnter(\"GetNextDlgGroupItem(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HWND rv = 0;\n    __try {\n        rv = Real_GetNextDlgGroupItem(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetNextDlgGroupItem(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_GetNextDlgTabItem(HWND a0,\n                                      HWND a1,\n                                      BOOL a2)\n{\n    _PrintEnter(\"GetNextDlgTabItem(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HWND rv = 0;\n    __try {\n        rv = Real_GetNextDlgTabItem(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetNextDlgTabItem(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetNumberFormatA(LCID a0,\n                                    DWORD a1,\n                                    LPCSTR a2,\n                                    NUMBERFMTA* a3,\n                                    LPSTR a4,\n                                    int a5)\n{\n    _PrintEnter(\"GetNumberFormatA(%p,%p,%hs,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetNumberFormatA(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"GetNumberFormatA(,,,,%hs,) -> %p\\n\", a4, rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetNumberFormatW(LCID a0,\n                                    DWORD a1,\n                                    LPCWSTR a2,\n                                    NUMBERFMTW* a3,\n                                    LPWSTR a4,\n                                    int a5)\n{\n    _PrintEnter(\"GetNumberFormatW(%p,%p,%ls,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetNumberFormatW(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"GetNumberFormatW(,,,,%ls,) -> %p\\n\", a4, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetNumberOfConsoleInputEvents(HANDLE a0,\n                                                  LPDWORD a1)\n{\n    _PrintEnter(\"GetNumberOfConsoleInputEvents(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetNumberOfConsoleInputEvents(a0, a1);\n    } __finally {\n        _PrintExit(\"GetNumberOfConsoleInputEvents(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetNumberOfConsoleMouseButtons(LPDWORD a0)\n{\n    _PrintEnter(\"GetNumberOfConsoleMouseButtons(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetNumberOfConsoleMouseButtons(a0);\n    } __finally {\n        _PrintExit(\"GetNumberOfConsoleMouseButtons() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetOEMCP(void)\n{\n    _PrintEnter(\"GetOEMCP()\\n\");\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetOEMCP();\n    } __finally {\n        _PrintExit(\"GetOEMCP() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetObjectA(HGDIOBJ a0,\n                              int a1,\n                              LPVOID a2)\n{\n    _PrintEnter(\"GetObjectA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetObjectA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetObjectA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetObjectType(HGDIOBJ a0)\n{\n    _PrintEnter(\"GetObjectType(%p)\\n\", a0);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetObjectType(a0);\n    } __finally {\n        _PrintExit(\"GetObjectType() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetObjectW(HGDIOBJ a0,\n                              int a1,\n                              LPVOID a2)\n{\n    _PrintEnter(\"GetObjectW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetObjectW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetObjectW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_GetOpenClipboardWindow(void)\n{\n    _PrintEnter(\"GetOpenClipboardWindow()\\n\");\n\n    HWND rv = 0;\n    __try {\n        rv = Real_GetOpenClipboardWindow();\n    } __finally {\n        _PrintExit(\"GetOpenClipboardWindow() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetOutlineTextMetricsA(HDC a0,\n                                           UINT a1,\n                                           LPOUTLINETEXTMETRICA a2)\n{\n    _PrintEnter(\"GetOutlineTextMetricsA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetOutlineTextMetricsA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetOutlineTextMetricsA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetOutlineTextMetricsW(HDC a0,\n                                           UINT a1,\n                                           LPOUTLINETEXTMETRICW a2)\n{\n    _PrintEnter(\"GetOutlineTextMetricsW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetOutlineTextMetricsW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetOutlineTextMetricsW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetOverlappedResult(HANDLE a0,\n                                        LPOVERLAPPED a1,\n                                        LPDWORD a2,\n                                        BOOL a3)\n{\n    _PrintEnter(\"GetOverlappedResult(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetOverlappedResult(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetOverlappedResult(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetPaletteEntries(HPALETTE a0,\n                                      UINT a1,\n                                      UINT a2,\n                                      PALETTEENTRY* a3)\n{\n    _PrintEnter(\"GetPaletteEntries(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetPaletteEntries(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetPaletteEntries(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_GetParent(HWND a0)\n{\n    _PrintEnter(\"GetParent(%p)\\n\", a0);\n\n    HWND rv = 0;\n    __try {\n        rv = Real_GetParent(a0);\n    } __finally {\n        _PrintExit(\"GetParent() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetPath(HDC a0,\n                           POINT* a1,\n                           LPBYTE a2,\n                           int a3)\n{\n    _PrintEnter(\"GetPath(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetPath(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetPath(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nCOLORREF __stdcall Mine_GetPixel(HDC a0,\n                                 int a1,\n                                 int a2)\n{\n    _PrintEnter(\"GetPixel(%p,%p,%p)\\n\", a0, a1, a2);\n\n    COLORREF rv = 0;\n    __try {\n        rv = Real_GetPixel(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetPixel(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetPixelFormat(HDC a0)\n{\n    _PrintEnter(\"GetPixelFormat(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetPixelFormat(a0);\n    } __finally {\n        _PrintExit(\"GetPixelFormat() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetPolyFillMode(HDC a0)\n{\n    _PrintEnter(\"GetPolyFillMode(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetPolyFillMode(a0);\n    } __finally {\n        _PrintExit(\"GetPolyFillMode() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetPriorityClass(HANDLE a0)\n{\n    _PrintEnter(\"GetPriorityClass(%p)\\n\", a0);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetPriorityClass(a0);\n    } __finally {\n        _PrintExit(\"GetPriorityClass() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetPriorityClipboardFormat(UINT* a0,\n                                              int a1)\n{\n    _PrintEnter(\"GetPriorityClipboardFormat(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetPriorityClipboardFormat(a0, a1);\n    } __finally {\n        _PrintExit(\"GetPriorityClipboardFormat(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetPrivateProfileIntA(LPCSTR a0,\n                                          LPCSTR a1,\n                                          INT a2,\n                                          LPCSTR a3)\n{\n    _PrintEnter(\"GetPrivateProfileIntA(%hs,%hs,%p,%hs)\\n\", a0, a1, a2, a3);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetPrivateProfileIntA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetPrivateProfileIntA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetPrivateProfileIntW(LPCWSTR a0,\n                                          LPCWSTR a1,\n                                          INT a2,\n                                          LPCWSTR a3)\n{\n    _PrintEnter(\"GetPrivateProfileIntW(%ls,%ls,%p,%ls)\\n\", a0, a1, a2, a3);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetPrivateProfileIntW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetPrivateProfileIntW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetPrivateProfileSectionA(LPCSTR a0,\n                                               LPSTR a1,\n                                               DWORD a2,\n                                               LPCSTR a3)\n{\n    _PrintEnter(\"GetPrivateProfileSectionA(%hs,%p,%p,%hs)\\n\", a0, a1, a2, a3);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetPrivateProfileSectionA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetPrivateProfileSectionA(,%hs,,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetPrivateProfileSectionNamesA(LPSTR a0,\n                                                    DWORD a1,\n                                                    LPCSTR a2)\n{\n    _PrintEnter(\"GetPrivateProfileSectionNamesA(%p,%p,%hs)\\n\", a0, a1, a2);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetPrivateProfileSectionNamesA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetPrivateProfileSectionNamesA(%hs,,) -> %p\\n\", a0, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetPrivateProfileSectionNamesW(LPWSTR a0,\n                                                    DWORD a1,\n                                                    LPCWSTR a2)\n{\n    _PrintEnter(\"GetPrivateProfileSectionNamesW(%p,%p,%ls)\\n\", a0, a1, a2);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetPrivateProfileSectionNamesW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetPrivateProfileSectionNamesW(%ls,,) -> %p\\n\", a0, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetPrivateProfileSectionW(LPCWSTR a0,\n                                               LPWSTR a1,\n                                               DWORD a2,\n                                               LPCWSTR a3)\n{\n    _PrintEnter(\"GetPrivateProfileSectionW(%ls,%p,%p,%ls)\\n\", a0, a1, a2, a3);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetPrivateProfileSectionW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetPrivateProfileSectionW(,%ls,,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetPrivateProfileStringA(LPCSTR a0,\n                                              LPCSTR a1,\n                                              LPCSTR a2,\n                                              LPSTR a3,\n                                              DWORD a4,\n                                              LPCSTR a5)\n{\n    _PrintEnter(\"GetPrivateProfileStringA(%hs,%hs,%hs,%p,%p,%hs)\\n\", a0, a1, a2, a3, a4, a5);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetPrivateProfileStringA(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"GetPrivateProfileStringA(,,,%hs,,) -> %p\\n\", a3, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetPrivateProfileStringW(LPCWSTR a0,\n                                              LPCWSTR a1,\n                                              LPCWSTR a2,\n                                              LPWSTR a3,\n                                              DWORD a4,\n                                              LPCWSTR a5)\n{\n    _PrintEnter(\"GetPrivateProfileStringW(%ls,%ls,%ls,%p,%p,%ls)\\n\", a0, a1, a2, a3, a4, a5);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetPrivateProfileStringW(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"GetPrivateProfileStringW(,,,%ls,,) -> %p\\n\", a3, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetPrivateProfileStructA(LPCSTR a0,\n                                             LPCSTR a1,\n                                             LPVOID a2,\n                                             UINT a3,\n                                             LPCSTR a4)\n{\n    _PrintEnter(\"GetPrivateProfileStructA(%hs,%hs,%p,%p,%hs)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetPrivateProfileStructA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"GetPrivateProfileStructA(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetPrivateProfileStructW(LPCWSTR a0,\n                                             LPCWSTR a1,\n                                             LPVOID a2,\n                                             UINT a3,\n                                             LPCWSTR a4)\n{\n    _PrintEnter(\"GetPrivateProfileStructW(%ls,%ls,%p,%p,%ls)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetPrivateProfileStructW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"GetPrivateProfileStructW(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nFARPROC __stdcall Mine_GetProcAddress(HMODULE a0,\n                                      LPCSTR a1)\n{\n    _PrintEnter(\"GetProcAddress(%p,%hs)\\n\", a0, a1);\n\n    FARPROC rv = 0;\n    __try {\n        rv = Real_GetProcAddress(a0, a1);\n    } __finally {\n        _PrintExit(\"GetProcAddress(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetProcessAffinityMask(HANDLE a0,\n                                           PDWORD_PTR a1,\n                                           PDWORD_PTR a2)\n{\n    _PrintEnter(\"GetProcessAffinityMask(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetProcessAffinityMask(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetProcessAffinityMask(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetProcessHeaps(DWORD a0,\n                                     PHANDLE a1)\n{\n    _PrintEnter(\"GetProcessHeaps(%p,%p)\\n\", a0, a1);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetProcessHeaps(a0, a1);\n    } __finally {\n        _PrintExit(\"GetProcessHeaps(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetProcessShutdownParameters(LPDWORD a0,\n                                                 LPDWORD a1)\n{\n    _PrintEnter(\"GetProcessShutdownParameters(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetProcessShutdownParameters(a0, a1);\n    } __finally {\n        _PrintExit(\"GetProcessShutdownParameters(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetProcessTimes(HANDLE a0,\n                                    LPFILETIME a1,\n                                    LPFILETIME a2,\n                                    LPFILETIME a3,\n                                    LPFILETIME a4)\n{\n    _PrintEnter(\"GetProcessTimes(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetProcessTimes(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"GetProcessTimes(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetProcessVersion(DWORD a0)\n{\n    _PrintEnter(\"GetProcessVersion(%p)\\n\", a0);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetProcessVersion(a0);\n    } __finally {\n        _PrintExit(\"GetProcessVersion() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWINSTA __stdcall Mine_GetProcessWindowStation(void)\n{\n    _PrintEnter(\"GetProcessWindowStation()\\n\");\n\n    HWINSTA rv = 0;\n    __try {\n        rv = Real_GetProcessWindowStation();\n    } __finally {\n        _PrintExit(\"GetProcessWindowStation() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetProcessWorkingSetSize(HANDLE a0,\n                                             PSIZE_T a1,\n                                             PSIZE_T a2)\n{\n    _PrintEnter(\"GetProcessWorkingSetSize(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetProcessWorkingSetSize(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetProcessWorkingSetSize(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetProfileIntA(LPCSTR a0,\n                                   LPCSTR a1,\n                                   INT a2)\n{\n    _PrintEnter(\"GetProfileIntA(%hs,%hs,%p)\\n\", a0, a1, a2);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetProfileIntA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetProfileIntA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetProfileIntW(LPCWSTR a0,\n                                   LPCWSTR a1,\n                                   INT a2)\n{\n    _PrintEnter(\"GetProfileIntW(%ls,%ls,%p)\\n\", a0, a1, a2);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetProfileIntW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetProfileIntW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetProfileSectionA(LPCSTR a0,\n                                        LPSTR a1,\n                                        DWORD a2)\n{\n    _PrintEnter(\"GetProfileSectionA(%hs,%p,%p)\\n\", a0, a1, a2);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetProfileSectionA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetProfileSectionA(,%hs,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetProfileSectionW(LPCWSTR a0,\n                                        LPWSTR a1,\n                                        DWORD a2)\n{\n    _PrintEnter(\"GetProfileSectionW(%ls,%p,%p)\\n\", a0, a1, a2);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetProfileSectionW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetProfileSectionW(,%ls,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetProfileStringA(LPCSTR a0,\n                                       LPCSTR a1,\n                                       LPCSTR a2,\n                                       LPSTR a3,\n                                       DWORD a4)\n{\n    _PrintEnter(\"GetProfileStringA(%hs,%hs,%hs,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetProfileStringA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"GetProfileStringA(,,,%hs,) -> %p\\n\", a3, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetProfileStringW(LPCWSTR a0,\n                                       LPCWSTR a1,\n                                       LPCWSTR a2,\n                                       LPWSTR a3,\n                                       DWORD a4)\n{\n    _PrintEnter(\"GetProfileStringW(%ls,%ls,%ls,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetProfileStringW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"GetProfileStringW(,,,%ls,) -> %p\\n\", a3, rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_GetPropA(HWND a0,\n                               LPCSTR a1)\n{\n    _PrintEnter(\"GetPropA(%p,%hs)\\n\", a0, a1);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_GetPropA(a0, a1);\n    } __finally {\n        _PrintExit(\"GetPropA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_GetPropW(HWND a0,\n                               LPCWSTR a1)\n{\n    _PrintEnter(\"GetPropW(%p,%ls)\\n\", a0, a1);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_GetPropW(a0, a1);\n    } __finally {\n        _PrintExit(\"GetPropW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetQueueStatus(UINT a0)\n{\n    _PrintEnter(\"GetQueueStatus(%p)\\n\", a0);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetQueueStatus(a0);\n    } __finally {\n        _PrintExit(\"GetQueueStatus() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetQueuedCompletionStatus(HANDLE a0,\n                                              LPDWORD a1,\n                                              PULONG_PTR a2,\n                                              LPOVERLAPPED* a3,\n                                              DWORD a4)\n{\n    _PrintEnter(\"GetQueuedCompletionStatus(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetQueuedCompletionStatus(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"GetQueuedCompletionStatus(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetROP2(HDC a0)\n{\n    _PrintEnter(\"GetROP2(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetROP2(a0);\n    } __finally {\n        _PrintExit(\"GetROP2() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetRasterizerCaps(LPRASTERIZER_STATUS a0,\n                                      UINT a1)\n{\n    _PrintEnter(\"GetRasterizerCaps(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetRasterizerCaps(a0, a1);\n    } __finally {\n        _PrintExit(\"GetRasterizerCaps(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetRegionData(HRGN a0,\n                                   DWORD a1,\n                                   LPRGNDATA a2)\n{\n    _PrintEnter(\"GetRegionData(%p,%p,%p)\\n\", a0, a1, a2);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetRegionData(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetRegionData(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetRgnBox(HRGN a0,\n                             LPRECT a1)\n{\n    _PrintEnter(\"GetRgnBox(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetRgnBox(a0, a1);\n    } __finally {\n        _PrintExit(\"GetRgnBox(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_GetRunningObjectTable(DWORD a0,\n                                             LPRUNNINGOBJECTTABLE* a1)\n{\n    _PrintEnter(\"GetRunningObjectTable(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_GetRunningObjectTable(a0, a1);\n    } __finally {\n        _PrintExit(\"GetRunningObjectTable(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetScrollInfo(HWND a0,\n                                  int a1,\n                                  LPSCROLLINFO a2)\n{\n    _PrintEnter(\"GetScrollInfo(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetScrollInfo(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetScrollInfo(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetScrollPos(HWND a0,\n                                int a1)\n{\n    _PrintEnter(\"GetScrollPos(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetScrollPos(a0, a1);\n    } __finally {\n        _PrintExit(\"GetScrollPos(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetScrollRange(HWND a0,\n                                   int a1,\n                                   LPINT a2,\n                                   LPINT a3)\n{\n    _PrintEnter(\"GetScrollRange(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetScrollRange(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetScrollRange(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetShortPathNameA(LPCSTR a0,\n                                       LPSTR a1,\n                                       DWORD a2)\n{\n    _PrintEnter(\"GetShortPathNameA(%hs,%p,%p)\\n\", a0, a1, a2);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetShortPathNameA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetShortPathNameA(,%hs,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetShortPathNameW(LPCWSTR a0,\n                                       LPWSTR a1,\n                                       DWORD a2)\n{\n    _PrintEnter(\"GetShortPathNameW(%ls,%p,%p)\\n\", a0, a1, a2);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetShortPathNameW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetShortPathNameW(,%ls,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nvoid __stdcall Mine_GetStartupInfoA(LPSTARTUPINFOA a0)\n{\n    _PrintEnter(\"GetStartupInfoA(%p)\\n\", a0);\n\n    __try {\n        Real_GetStartupInfoA(a0);\n    } __finally {\n        _PrintExit(\"GetStartupInfoA() ->\\n\");\n    };\n}\n\nvoid __stdcall Mine_GetStartupInfoW(LPSTARTUPINFOW a0)\n{\n    _PrintEnter(\"GetStartupInfoW(%p)\\n\", a0);\n\n    __try {\n        Real_GetStartupInfoW(a0);\n    } __finally {\n        _PrintExit(\"GetStartupInfoW() ->\\n\");\n    };\n}\n\nHANDLE __stdcall Mine_GetStdHandle(DWORD a0)\n{\n    _PrintEnter(\"GetStdHandle(%p)\\n\", a0);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_GetStdHandle(a0);\n    } __finally {\n        _PrintExit(\"GetStdHandle() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHGDIOBJ __stdcall Mine_GetStockObject(int a0)\n{\n    _PrintEnter(\"GetStockObject(%p)\\n\", a0);\n\n    HGDIOBJ rv = 0;\n    __try {\n        rv = Real_GetStockObject(a0);\n    } __finally {\n        _PrintExit(\"GetStockObject() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetStretchBltMode(HDC a0)\n{\n    _PrintEnter(\"GetStretchBltMode(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetStretchBltMode(a0);\n    } __finally {\n        _PrintExit(\"GetStretchBltMode() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHMENU __stdcall Mine_GetSubMenu(HMENU a0,\n                                int a1)\n{\n    _PrintEnter(\"GetSubMenu(%p,%p)\\n\", a0, a1);\n\n    HMENU rv = 0;\n    __try {\n        rv = Real_GetSubMenu(a0, a1);\n    } __finally {\n        _PrintExit(\"GetSubMenu(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetSysColor(int a0)\n{\n    _PrintEnter(\"GetSysColor(%p)\\n\", a0);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetSysColor(a0);\n    } __finally {\n        _PrintExit(\"GetSysColor() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHBRUSH __stdcall Mine_GetSysColorBrush(int a0)\n{\n    _PrintEnter(\"GetSysColorBrush(%p)\\n\", a0);\n\n    HBRUSH rv = 0;\n    __try {\n        rv = Real_GetSysColorBrush(a0);\n    } __finally {\n        _PrintExit(\"GetSysColorBrush() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLCID __stdcall Mine_GetSystemDefaultLCID(void)\n{\n    _PrintEnter(\"GetSystemDefaultLCID()\\n\");\n\n    LCID rv = 0;\n    __try {\n        rv = Real_GetSystemDefaultLCID();\n    } __finally {\n        _PrintExit(\"GetSystemDefaultLCID() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLANGID __stdcall Mine_GetSystemDefaultLangID(void)\n{\n    _PrintEnter(\"GetSystemDefaultLangID()\\n\");\n\n    LANGID rv = 0;\n    __try {\n        rv = Real_GetSystemDefaultLangID();\n    } __finally {\n        _PrintExit(\"GetSystemDefaultLangID() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetSystemDirectoryA(LPSTR a0,\n                                        UINT a1)\n{\n    _PrintEnter(\"GetSystemDirectoryA(%p,%p)\\n\", a0, a1);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetSystemDirectoryA(a0, a1);\n    } __finally {\n        _PrintExit(\"GetSystemDirectoryA(%hs,) -> %p\\n\", a0, rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetSystemDirectoryW(LPWSTR a0,\n                                        UINT a1)\n{\n    _PrintEnter(\"GetSystemDirectoryW(%p,%p)\\n\", a0, a1);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetSystemDirectoryW(a0, a1);\n    } __finally {\n        _PrintExit(\"GetSystemDirectoryW(%ls,) -> %p\\n\", a0, rv);\n    };\n    return rv;\n}\n\nvoid __stdcall Mine_GetSystemInfo(LPSYSTEM_INFO a0)\n{\n    _PrintEnter(\"GetSystemInfo(%p)\\n\", a0);\n\n    __try {\n        Real_GetSystemInfo(a0);\n    } __finally {\n        _PrintExit(\"GetSystemInfo() ->\\n\");\n    };\n}\n\nHMENU __stdcall Mine_GetSystemMenu(HWND a0,\n                                   BOOL a1)\n{\n    _PrintEnter(\"GetSystemMenu(%p,%p)\\n\", a0, a1);\n\n    HMENU rv = 0;\n    __try {\n        rv = Real_GetSystemMenu(a0, a1);\n    } __finally {\n        _PrintExit(\"GetSystemMenu(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetSystemMetrics(int a0)\n{\n    _PrintEnter(\"GetSystemMetrics(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetSystemMetrics(a0);\n    } __finally {\n        _PrintExit(\"GetSystemMetrics() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetSystemPaletteEntries(HDC a0,\n                                            UINT a1,\n                                            UINT a2,\n                                            PALETTEENTRY* a3)\n{\n    _PrintEnter(\"GetSystemPaletteEntries(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetSystemPaletteEntries(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetSystemPaletteEntries(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetSystemPaletteUse(HDC a0)\n{\n    _PrintEnter(\"GetSystemPaletteUse(%p)\\n\", a0);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetSystemPaletteUse(a0);\n    } __finally {\n        _PrintExit(\"GetSystemPaletteUse() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetSystemPowerStatus(LPSYSTEM_POWER_STATUS a0)\n{\n    _PrintEnter(\"GetSystemPowerStatus(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetSystemPowerStatus(a0);\n    } __finally {\n        _PrintExit(\"GetSystemPowerStatus() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nvoid __stdcall Mine_GetSystemTime(LPSYSTEMTIME a0)\n{\n    _PrintEnter(\"GetSystemTime(%p)\\n\", a0);\n\n    __try {\n        Real_GetSystemTime(a0);\n    } __finally {\n        _PrintExit(\"GetSystemTime() ->\\n\");\n    };\n}\n\nBOOL __stdcall Mine_GetSystemTimeAdjustment(PDWORD a0,\n                                            PDWORD a1,\n                                            PBOOL a2)\n{\n    _PrintEnter(\"GetSystemTimeAdjustment(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetSystemTimeAdjustment(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetSystemTimeAdjustment(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nvoid __stdcall Mine_GetSystemTimeAsFileTime(LPFILETIME a0)\n{\n    _PrintEnter(\"GetSystemTimeAsFileTime(%p)\\n\", a0);\n\n    __try {\n        Real_GetSystemTimeAsFileTime(a0);\n    } __finally {\n        _PrintExit(\"GetSystemTimeAsFileTime() ->\\n\");\n    };\n}\n\nDWORD __stdcall Mine_GetTabbedTextExtentA(HDC a0,\n                                          LPCSTR a1,\n                                          int a2,\n                                          int a3,\n                                          INT* a4)\n{\n    _PrintEnter(\"GetTabbedTextExtentA(%p,%hs,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetTabbedTextExtentA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"GetTabbedTextExtentA(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetTabbedTextExtentW(HDC a0,\n                                          LPCWSTR a1,\n                                          int a2,\n                                          int a3,\n                                          INT* a4)\n{\n    _PrintEnter(\"GetTabbedTextExtentW(%p,%ls,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetTabbedTextExtentW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"GetTabbedTextExtentW(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetTapeParameters(HANDLE a0,\n                                       DWORD a1,\n                                       LPDWORD a2,\n                                       LPVOID a3)\n{\n    _PrintEnter(\"GetTapeParameters(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetTapeParameters(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetTapeParameters(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetTapePosition(HANDLE a0,\n                                     DWORD a1,\n                                     LPDWORD a2,\n                                     LPDWORD a3,\n                                     LPDWORD a4)\n{\n    _PrintEnter(\"GetTapePosition(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetTapePosition(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"GetTapePosition(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetTapeStatus(HANDLE a0)\n{\n    _PrintEnter(\"GetTapeStatus(%p)\\n\", a0);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetTapeStatus(a0);\n    } __finally {\n        _PrintExit(\"GetTapeStatus() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetTempFileNameA(LPCSTR a0,\n                                     LPCSTR a1,\n                                     UINT a2,\n                                     LPSTR a3)\n{\n    _PrintEnter(\"GetTempFileNameA(%hs,%hs,%p,%p)\\n\", a0, a1, a2, a3);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetTempFileNameA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetTempFileNameA(,,,%hs) -> %p\\n\", a3, rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetTempFileNameW(LPCWSTR a0,\n                                     LPCWSTR a1,\n                                     UINT a2,\n                                     LPWSTR a3)\n{\n    _PrintEnter(\"GetTempFileNameW(%ls,%ls,%p,%p)\\n\", a0, a1, a2, a3);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetTempFileNameW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetTempFileNameW(,,,%ls) -> %p\\n\", a3, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetTempPathA(DWORD a0,\n                                  LPSTR a1)\n{\n    _PrintEnter(\"GetTempPathA(%p,%p)\\n\", a0, a1);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetTempPathA(a0, a1);\n    } __finally {\n        _PrintExit(\"GetTempPathA(,%hs) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetTempPathW(DWORD a0,\n                                  LPWSTR a1)\n{\n    _PrintEnter(\"GetTempPathW(%p,%p)\\n\", a0, a1);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetTempPathW(a0, a1);\n    } __finally {\n        _PrintExit(\"GetTempPathW(,%ls) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetTextAlign(HDC a0)\n{\n    _PrintEnter(\"GetTextAlign(%p)\\n\", a0);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetTextAlign(a0);\n    } __finally {\n        _PrintExit(\"GetTextAlign() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetTextCharacterExtra(HDC a0)\n{\n    _PrintEnter(\"GetTextCharacterExtra(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetTextCharacterExtra(a0);\n    } __finally {\n        _PrintExit(\"GetTextCharacterExtra() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetTextCharset(HDC a0)\n{\n    _PrintEnter(\"GetTextCharset(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetTextCharset(a0);\n    } __finally {\n        _PrintExit(\"GetTextCharset() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetTextCharsetInfo(HDC a0,\n                                      LPFONTSIGNATURE a1,\n                                      DWORD a2)\n{\n    _PrintEnter(\"GetTextCharsetInfo(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetTextCharsetInfo(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetTextCharsetInfo(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nCOLORREF __stdcall Mine_GetTextColor(HDC a0)\n{\n    _PrintEnter(\"GetTextColor(%p)\\n\", a0);\n\n    COLORREF rv = 0;\n    __try {\n        rv = Real_GetTextColor(a0);\n    } __finally {\n        _PrintExit(\"GetTextColor() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetTextExtentExPointA(HDC a0,\n                                          LPCSTR a1,\n                                          int a2,\n                                          int a3,\n                                          LPINT a4,\n                                          LPINT a5,\n                                          SIZE* a6)\n{\n    _PrintEnter(\"GetTextExtentExPointA(%p,%hs,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetTextExtentExPointA(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"GetTextExtentExPointA(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetTextExtentExPointW(HDC a0,\n                                          LPCWSTR a1,\n                                          int a2,\n                                          int a3,\n                                          LPINT a4,\n                                          LPINT a5,\n                                          SIZE* a6)\n{\n    _PrintEnter(\"GetTextExtentExPointW(%p,%ls,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetTextExtentExPointW(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"GetTextExtentExPointW(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetTextExtentPoint32A(HDC a0,\n                                          LPCSTR a1,\n                                          int a2,\n                                          SIZE* a3)\n{\n    _PrintEnter(\"GetTextExtentPoint32A(%p,%hs,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetTextExtentPoint32A(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetTextExtentPoint32A(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetTextExtentPoint32W(HDC a0,\n                                          LPCWSTR a1,\n                                          int a2,\n                                          SIZE* a3)\n{\n    _PrintEnter(\"GetTextExtentPoint32W(%p,%ls,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetTextExtentPoint32W(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetTextExtentPoint32W(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetTextExtentPointA(HDC a0,\n                                        LPCSTR a1,\n                                        int a2,\n                                        SIZE* a3)\n{\n    _PrintEnter(\"GetTextExtentPointA(%p,%hs,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetTextExtentPointA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetTextExtentPointA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetTextExtentPointW(HDC a0,\n                                        LPCWSTR a1,\n                                        int a2,\n                                        SIZE* a3)\n{\n    _PrintEnter(\"GetTextExtentPointW(%p,%ls,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetTextExtentPointW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetTextExtentPointW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetTextFaceA(HDC a0,\n                                int a1,\n                                LPSTR a2)\n{\n    _PrintEnter(\"GetTextFaceA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetTextFaceA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetTextFaceA(,,%hs) -> %p\\n\", a2, rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetTextFaceW(HDC a0,\n                                int a1,\n                                LPWSTR a2)\n{\n    _PrintEnter(\"GetTextFaceW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetTextFaceW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetTextFaceW(,,%ls) -> %p\\n\", a2, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetTextMetricsA(HDC a0,\n                                    LPTEXTMETRICA a1)\n{\n    _PrintEnter(\"GetTextMetricsA(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetTextMetricsA(a0, a1);\n    } __finally {\n        _PrintExit(\"GetTextMetricsA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetTextMetricsW(HDC a0,\n                                    LPTEXTMETRICW a1)\n{\n    _PrintEnter(\"GetTextMetricsW(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetTextMetricsW(a0, a1);\n    } __finally {\n        _PrintExit(\"GetTextMetricsW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetThreadContext(HANDLE a0,\n                                     LPCONTEXT a1)\n{\n    _PrintEnter(\"GetThreadContext(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetThreadContext(a0, a1);\n    } __finally {\n        _PrintExit(\"GetThreadContext(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHDESK __stdcall Mine_GetThreadDesktop(DWORD a0)\n{\n    _PrintEnter(\"GetThreadDesktop(%p)\\n\", a0);\n\n    HDESK rv = 0;\n    __try {\n        rv = Real_GetThreadDesktop(a0);\n    } __finally {\n        _PrintExit(\"GetThreadDesktop() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\n#if(WINVER >= 0x0500)\nLCID __stdcall Mine_GetThreadLocale(void)\n{\n    _PrintEnter(\"GetThreadLocale()\\n\");\n\n    LCID rv = 0;\n    __try {\n        rv = Real_GetThreadLocale();\n    } __finally {\n        _PrintExit(\"GetThreadLocale() -> %p\\n\", rv);\n    };\n    return rv;\n}\n#endif // (WINVER >= 0x0500)\n\nint __stdcall Mine_GetThreadPriority(HANDLE a0)\n{\n    _PrintEnter(\"GetThreadPriority(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetThreadPriority(a0);\n    } __finally {\n        _PrintExit(\"GetThreadPriority() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetThreadPriorityBoost(HANDLE a0,\n                                           PBOOL a1)\n{\n    _PrintEnter(\"GetThreadPriorityBoost(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetThreadPriorityBoost(a0, a1);\n    } __finally {\n        _PrintExit(\"GetThreadPriorityBoost(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetThreadSelectorEntry(HANDLE a0,\n                                           DWORD a1,\n                                           LPLDT_ENTRY a2)\n{\n    _PrintEnter(\"GetThreadSelectorEntry(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetThreadSelectorEntry(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetThreadSelectorEntry(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetThreadTimes(HANDLE a0,\n                                   LPFILETIME a1,\n                                   LPFILETIME a2,\n                                   LPFILETIME a3,\n                                   LPFILETIME a4)\n{\n    _PrintEnter(\"GetThreadTimes(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetThreadTimes(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"GetThreadTimes(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetTickCount(void)\n{\n    _PrintEnter(\"GetTickCount()\\n\");\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetTickCount();\n    } __finally {\n        _PrintExit(\"GetTickCount() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetTimeFormatA(LCID a0,\n                                  DWORD a1,\n                                  SYSTEMTIME* a2,\n                                  LPCSTR a3,\n                                  LPSTR a4,\n                                  int a5)\n{\n    _PrintEnter(\"GetTimeFormatA(%p,%p,%p,%hs,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetTimeFormatA(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"GetTimeFormatA(,,,,%hs,) -> %p\\n\", a4, rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetTimeFormatW(LCID a0,\n                                  DWORD a1,\n                                  SYSTEMTIME* a2,\n                                  LPCWSTR a3,\n                                  LPWSTR a4,\n                                  int a5)\n{\n    _PrintEnter(\"GetTimeFormatW(%p,%p,%p,%ls,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetTimeFormatW(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"GetTimeFormatW(,,,,%ls,) -> %p\\n\", a4, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetTimeZoneInformation(LPTIME_ZONE_INFORMATION a0)\n{\n    _PrintEnter(\"GetTimeZoneInformation(%p)\\n\", a0);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetTimeZoneInformation(a0);\n    } __finally {\n        _PrintExit(\"GetTimeZoneInformation() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_GetTopWindow(HWND a0)\n{\n    _PrintEnter(\"GetTopWindow(%p)\\n\", a0);\n\n    HWND rv = 0;\n    __try {\n        rv = Real_GetTopWindow(a0);\n    } __finally {\n        _PrintExit(\"GetTopWindow() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetUpdateRect(HWND a0,\n                                  LPRECT a1,\n                                  BOOL a2)\n{\n    _PrintEnter(\"GetUpdateRect(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetUpdateRect(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetUpdateRect(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetUpdateRgn(HWND a0,\n                                HRGN a1,\n                                BOOL a2)\n{\n    _PrintEnter(\"GetUpdateRgn(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetUpdateRgn(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetUpdateRgn(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLCID __stdcall Mine_GetUserDefaultLCID(void)\n{\n    _PrintEnter(\"GetUserDefaultLCID()\\n\");\n\n    LCID rv = 0;\n    __try {\n        rv = Real_GetUserDefaultLCID();\n    } __finally {\n        _PrintExit(\"GetUserDefaultLCID() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLANGID __stdcall Mine_GetUserDefaultLangID(void)\n{\n    _PrintEnter(\"GetUserDefaultLangID()\\n\");\n\n    LANGID rv = 0;\n    __try {\n        rv = Real_GetUserDefaultLangID();\n    } __finally {\n        _PrintExit(\"GetUserDefaultLangID() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetUserObjectInformationA(HANDLE a0,\n                                              int a1,\n                                              PVOID a2,\n                                              DWORD a3,\n                                              LPDWORD a4)\n{\n    _PrintEnter(\"GetUserObjectInformationA(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetUserObjectInformationA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"GetUserObjectInformationA(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetUserObjectInformationW(HANDLE a0,\n                                              int a1,\n                                              PVOID a2,\n                                              DWORD a3,\n                                              LPDWORD a4)\n{\n    _PrintEnter(\"GetUserObjectInformationW(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetUserObjectInformationW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"GetUserObjectInformationW(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetUserObjectSecurity(HANDLE a0,\n                                          PSECURITY_INFORMATION a1,\n                                          PSECURITY_DESCRIPTOR a2,\n                                          DWORD a3,\n                                          LPDWORD a4)\n{\n    _PrintEnter(\"GetUserObjectSecurity(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetUserObjectSecurity(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"GetUserObjectSecurity(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetVersion(void)\n{\n    _PrintEnter(\"GetVersion()\\n\");\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetVersion();\n    } __finally {\n        _PrintExit(\"GetVersion() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetVersionExA(LPOSVERSIONINFOA a0)\n{\n    _PrintEnter(\"GetVersionExA(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetVersionExA(a0);\n    } __finally {\n        _PrintExit(\"GetVersionExA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetVersionExW(LPOSVERSIONINFOW a0)\n{\n    _PrintEnter(\"GetVersionExW(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetVersionExW(a0);\n    } __finally {\n        _PrintExit(\"GetVersionExW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetViewportExtEx(HDC a0,\n                                     SIZE* a1)\n{\n    _PrintEnter(\"GetViewportExtEx(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetViewportExtEx(a0, a1);\n    } __finally {\n        _PrintExit(\"GetViewportExtEx(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetViewportOrgEx(HDC a0,\n                                     POINT* a1)\n{\n    _PrintEnter(\"GetViewportOrgEx(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetViewportOrgEx(a0, a1);\n    } __finally {\n        _PrintExit(\"GetViewportOrgEx(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetVolumeInformationA(LPCSTR a0,\n                                          LPSTR a1,\n                                          DWORD a2,\n                                          LPDWORD a3,\n                                          LPDWORD a4,\n                                          LPDWORD a5,\n                                          LPSTR a6,\n                                          DWORD a7)\n{\n    _PrintEnter(\"GetVolumeInformationA(%hs,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetVolumeInformationA(a0, a1, a2, a3, a4, a5, a6, a7);\n    } __finally {\n        _PrintExit(\"GetVolumeInformationA(,%hs,,,,,%hs,) -> %p\\n\", a1, a6, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetVolumeInformationW(LPCWSTR a0,\n                                          LPWSTR a1,\n                                          DWORD a2,\n                                          LPDWORD a3,\n                                          LPDWORD a4,\n                                          LPDWORD a5,\n                                          LPWSTR a6,\n                                          DWORD a7)\n{\n    _PrintEnter(\"GetVolumeInformationW(%ls,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetVolumeInformationW(a0, a1, a2, a3, a4, a5, a6, a7);\n    } __finally {\n        _PrintExit(\"GetVolumeInformationW(,%ls,,,,,%ls,) -> %p\\n\", a1, a6, rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetWinMetaFileBits(HENHMETAFILE a0,\n                                       UINT a1,\n                                       LPBYTE a2,\n                                       INT a3,\n                                       HDC a4)\n{\n    _PrintEnter(\"GetWinMetaFileBits(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetWinMetaFileBits(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"GetWinMetaFileBits(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_GetWindow(HWND a0,\n                              UINT a1)\n{\n    _PrintEnter(\"GetWindow(%p,%p)\\n\", a0, a1);\n\n    HWND rv = 0;\n    __try {\n        rv = Real_GetWindow(a0, a1);\n    } __finally {\n        _PrintExit(\"GetWindow(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetWindowContextHelpId(HWND a0)\n{\n    _PrintEnter(\"GetWindowContextHelpId(%p)\\n\", a0);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetWindowContextHelpId(a0);\n    } __finally {\n        _PrintExit(\"GetWindowContextHelpId() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHDC __stdcall Mine_GetWindowDC(HWND a0)\n{\n    _PrintEnter(\"GetWindowDC(%p)\\n\", a0);\n\n    HDC rv = 0;\n    __try {\n        rv = Real_GetWindowDC(a0);\n    } __finally {\n        _PrintExit(\"GetWindowDC() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetWindowExtEx(HDC a0,\n                                   SIZE* a1)\n{\n    _PrintEnter(\"GetWindowExtEx(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetWindowExtEx(a0, a1);\n    } __finally {\n        _PrintExit(\"GetWindowExtEx(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLONG __stdcall Mine_GetWindowLongA(HWND a0,\n                                   int a1)\n{\n    _PrintEnter(\"GetWindowLongA(%p,%p)\\n\", a0, a1);\n\n    LONG rv = 0;\n    __try {\n        rv = Real_GetWindowLongA(a0, a1);\n    } __finally {\n        _PrintExit(\"GetWindowLongA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLONG __stdcall Mine_GetWindowLongW(HWND a0,\n                                   int a1)\n{\n    _PrintEnter(\"GetWindowLongW(%p,%p)\\n\", a0, a1);\n\n    LONG rv = 0;\n    __try {\n        rv = Real_GetWindowLongW(a0, a1);\n    } __finally {\n        _PrintExit(\"GetWindowLongW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetWindowOrgEx(HDC a0,\n                                   POINT* a1)\n{\n    _PrintEnter(\"GetWindowOrgEx(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetWindowOrgEx(a0, a1);\n    } __finally {\n        _PrintExit(\"GetWindowOrgEx(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetWindowPlacement(HWND a0,\n                                       WINDOWPLACEMENT* a1)\n{\n    _PrintEnter(\"GetWindowPlacement(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetWindowPlacement(a0, a1);\n    } __finally {\n        _PrintExit(\"GetWindowPlacement(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetWindowRect(HWND a0,\n                                  LPRECT a1)\n{\n    _PrintEnter(\"GetWindowRect(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetWindowRect(a0, a1);\n    } __finally {\n        _PrintExit(\"GetWindowRect(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetWindowRgn(HWND a0,\n                                HRGN a1)\n{\n    _PrintEnter(\"GetWindowRgn(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetWindowRgn(a0, a1);\n    } __finally {\n        _PrintExit(\"GetWindowRgn(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetWindowTextA(HWND a0,\n                                  LPSTR a1,\n                                  int a2)\n{\n    _PrintEnter(\"GetWindowTextA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetWindowTextA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetWindowTextA(,%hs,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetWindowTextLengthA(HWND a0)\n{\n    _PrintEnter(\"GetWindowTextLengthA(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetWindowTextLengthA(a0);\n    } __finally {\n        _PrintExit(\"GetWindowTextLengthA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetWindowTextLengthW(HWND a0)\n{\n    _PrintEnter(\"GetWindowTextLengthW(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetWindowTextLengthW(a0);\n    } __finally {\n        _PrintExit(\"GetWindowTextLengthW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_GetWindowTextW(HWND a0,\n                                  LPWSTR a1,\n                                  int a2)\n{\n    _PrintEnter(\"GetWindowTextW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_GetWindowTextW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetWindowTextW(,%ls,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_GetWindowThreadProcessId(HWND a0,\n                                              LPDWORD a1)\n{\n    _PrintEnter(\"GetWindowThreadProcessId(%p,%p)\\n\", a0, a1);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetWindowThreadProcessId(a0, a1);\n    } __finally {\n        _PrintExit(\"GetWindowThreadProcessId(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nWORD __stdcall Mine_GetWindowWord(HWND a0,\n                                  int a1)\n{\n    _PrintEnter(\"GetWindowWord(%p,%p)\\n\", a0, a1);\n\n    WORD rv = 0;\n    __try {\n        rv = Real_GetWindowWord(a0, a1);\n    } __finally {\n        _PrintExit(\"GetWindowWord(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetWindowsDirectoryA(LPSTR a0,\n                                         UINT a1)\n{\n    _PrintEnter(\"GetWindowsDirectoryA(%p,%p)\\n\", a0, a1);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetWindowsDirectoryA(a0, a1);\n    } __finally {\n        _PrintExit(\"GetWindowsDirectoryA(%hs,) -> %p\\n\", a0, rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GetWindowsDirectoryW(LPWSTR a0,\n                                         UINT a1)\n{\n    _PrintEnter(\"GetWindowsDirectoryW(%p,%p)\\n\", a0, a1);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GetWindowsDirectoryW(a0, a1);\n    } __finally {\n        _PrintExit(\"GetWindowsDirectoryW(%ls,) -> %p\\n\", a0, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GetWorldTransform(HDC a0,\n                                      XFORM* a1)\n{\n    _PrintEnter(\"GetWorldTransform(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetWorldTransform(a0, a1);\n    } __finally {\n        _PrintExit(\"GetWorldTransform(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nATOM __stdcall Mine_GlobalAddAtomA(LPCSTR a0)\n{\n    _PrintEnter(\"GlobalAddAtomA(%hs)\\n\", a0);\n\n    ATOM rv = 0;\n    __try {\n        rv = Real_GlobalAddAtomA(a0);\n    } __finally {\n        _PrintExit(\"GlobalAddAtomA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nATOM __stdcall Mine_GlobalAddAtomW(LPCWSTR a0)\n{\n    _PrintEnter(\"GlobalAddAtomW(%ls)\\n\", a0);\n\n    ATOM rv = 0;\n    __try {\n        rv = Real_GlobalAddAtomW(a0);\n    } __finally {\n        _PrintExit(\"GlobalAddAtomW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHGLOBAL __stdcall Mine_GlobalAlloc(UINT a0,\n                                   SIZE_T a1)\n{\n    _PrintEnter(\"GlobalAlloc(%p,%p)\\n\", a0, a1);\n\n    HGLOBAL rv = 0;\n    __try {\n        rv = Real_GlobalAlloc(a0, a1);\n    } __finally {\n        _PrintExit(\"GlobalAlloc(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nSIZE_T __stdcall Mine_GlobalCompact(DWORD a0)\n{\n    _PrintEnter(\"GlobalCompact(%p)\\n\", a0);\n\n    SIZE_T rv = 0;\n    __try {\n        rv = Real_GlobalCompact(a0);\n    } __finally {\n        _PrintExit(\"GlobalCompact() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nATOM __stdcall Mine_GlobalDeleteAtom(ATOM a0)\n{\n    _PrintEnter(\"GlobalDeleteAtom(%p)\\n\", a0);\n\n    ATOM rv = 0;\n    __try {\n        rv = Real_GlobalDeleteAtom(a0);\n    } __finally {\n        _PrintExit(\"GlobalDeleteAtom() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nATOM __stdcall Mine_GlobalFindAtomA(LPCSTR a0)\n{\n    _PrintEnter(\"GlobalFindAtomA(%hs)\\n\", a0);\n\n    ATOM rv = 0;\n    __try {\n        rv = Real_GlobalFindAtomA(a0);\n    } __finally {\n        _PrintExit(\"GlobalFindAtomA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nATOM __stdcall Mine_GlobalFindAtomW(LPCWSTR a0)\n{\n    _PrintEnter(\"GlobalFindAtomW(%ls)\\n\", a0);\n\n    ATOM rv = 0;\n    __try {\n        rv = Real_GlobalFindAtomW(a0);\n    } __finally {\n        _PrintExit(\"GlobalFindAtomW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nvoid __stdcall Mine_GlobalFix(HGLOBAL a0)\n{\n    _PrintEnter(\"GlobalFix(%p)\\n\", a0);\n\n    __try {\n        Real_GlobalFix(a0);\n    } __finally {\n        _PrintExit(\"GlobalFix() ->\\n\");\n    };\n}\n\nUINT __stdcall Mine_GlobalFlags(HGLOBAL a0)\n{\n    _PrintEnter(\"GlobalFlags(%p)\\n\", a0);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GlobalFlags(a0);\n    } __finally {\n        _PrintExit(\"GlobalFlags() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHGLOBAL __stdcall Mine_GlobalFree(HGLOBAL a0)\n{\n    _PrintEnter(\"GlobalFree(%p)\\n\", a0);\n\n    HGLOBAL rv = 0;\n    __try {\n        rv = Real_GlobalFree(a0);\n    } __finally {\n        _PrintExit(\"GlobalFree() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GlobalGetAtomNameA(ATOM a0,\n                                       LPSTR a1,\n                                       int a2)\n{\n    _PrintEnter(\"GlobalGetAtomNameA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GlobalGetAtomNameA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GlobalGetAtomNameA(,%hs,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_GlobalGetAtomNameW(ATOM a0,\n                                       LPWSTR a1,\n                                       int a2)\n{\n    _PrintEnter(\"GlobalGetAtomNameW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_GlobalGetAtomNameW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GlobalGetAtomNameW(,%ls,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nHGLOBAL __stdcall Mine_GlobalHandle(LPCVOID a0)\n{\n    _PrintEnter(\"GlobalHandle(%p)\\n\", a0);\n\n    HGLOBAL rv = 0;\n    __try {\n        rv = Real_GlobalHandle(a0);\n    } __finally {\n        _PrintExit(\"GlobalHandle() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLPVOID __stdcall Mine_GlobalLock(HGLOBAL a0)\n{\n    _PrintEnter(\"GlobalLock(%p)\\n\", a0);\n\n    LPVOID rv = 0;\n    __try {\n        rv = Real_GlobalLock(a0);\n    } __finally {\n        _PrintExit(\"GlobalLock() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nvoid __stdcall Mine_GlobalMemoryStatus(LPMEMORYSTATUS a0)\n{\n    _PrintEnter(\"GlobalMemoryStatus(%p)\\n\", a0);\n\n    __try {\n        Real_GlobalMemoryStatus(a0);\n    } __finally {\n        _PrintExit(\"GlobalMemoryStatus() ->\\n\");\n    };\n}\n\nHGLOBAL __stdcall Mine_GlobalReAlloc(HGLOBAL a0,\n                                     SIZE_T a1,\n                                     UINT a2)\n{\n    _PrintEnter(\"GlobalReAlloc(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HGLOBAL rv = 0;\n    __try {\n        rv = Real_GlobalReAlloc(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GlobalReAlloc(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nSIZE_T __stdcall Mine_GlobalSize(HGLOBAL a0)\n{\n    _PrintEnter(\"GlobalSize(%p)\\n\", a0);\n\n    SIZE_T rv = 0;\n    __try {\n        rv = Real_GlobalSize(a0);\n    } __finally {\n        _PrintExit(\"GlobalSize() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GlobalUnWire(HGLOBAL a0)\n{\n    _PrintEnter(\"GlobalUnWire(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GlobalUnWire(a0);\n    } __finally {\n        _PrintExit(\"GlobalUnWire() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nvoid __stdcall Mine_GlobalUnfix(HGLOBAL a0)\n{\n    _PrintEnter(\"GlobalUnfix(%p)\\n\", a0);\n\n    __try {\n        Real_GlobalUnfix(a0);\n    } __finally {\n        _PrintExit(\"GlobalUnfix() ->\\n\");\n    };\n}\n\nBOOL __stdcall Mine_GlobalUnlock(HGLOBAL a0)\n{\n    _PrintEnter(\"GlobalUnlock(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GlobalUnlock(a0);\n    } __finally {\n        _PrintExit(\"GlobalUnlock() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLPVOID __stdcall Mine_GlobalWire(HGLOBAL a0)\n{\n    _PrintEnter(\"GlobalWire(%p)\\n\", a0);\n\n    LPVOID rv = 0;\n    __try {\n        rv = Real_GlobalWire(a0);\n    } __finally {\n        _PrintExit(\"GlobalWire() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GrayStringA(HDC a0,\n                                HBRUSH a1,\n                                GRAYSTRINGPROC a2,\n                                LPARAM a3,\n                                int a4,\n                                int a5,\n                                int a6,\n                                int a7,\n                                int a8)\n{\n    _PrintEnter(\"GrayStringA(%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GrayStringA(a0, a1, a2, a3, a4, a5, a6, a7, a8);\n    } __finally {\n        _PrintExit(\"GrayStringA(,,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_GrayStringW(HDC a0,\n                                HBRUSH a1,\n                                GRAYSTRINGPROC a2,\n                                LPARAM a3,\n                                int a4,\n                                int a5,\n                                int a6,\n                                int a7,\n                                int a8)\n{\n    _PrintEnter(\"GrayStringW(%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GrayStringW(a0, a1, a2, a3, a4, a5, a6, a7, a8);\n    } __finally {\n        _PrintExit(\"GrayStringW(,,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_HeapLock(HANDLE a0)\n{\n    _PrintEnter(\"HeapLock(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_HeapLock(a0);\n    } __finally {\n        _PrintExit(\"HeapLock() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_HeapUnlock(HANDLE a0)\n{\n    _PrintEnter(\"HeapUnlock(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_HeapUnlock(a0);\n    } __finally {\n        _PrintExit(\"HeapUnlock() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_HideCaret(HWND a0)\n{\n    _PrintEnter(\"HideCaret(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_HideCaret(a0);\n    } __finally {\n        _PrintExit(\"HideCaret() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_HiliteMenuItem(HWND a0,\n                                   HMENU a1,\n                                   UINT a2,\n                                   UINT a3)\n{\n    _PrintEnter(\"HiliteMenuItem(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_HiliteMenuItem(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"HiliteMenuItem(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_IIDFromString(LPOLESTR a0,\n                                     LPGUID a1)\n{\n    _PrintEnter(\"IIDFromString(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_IIDFromString(a0, a1);\n    } __finally {\n        _PrintExit(\"IIDFromString(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ImpersonateDdeClientWindow(HWND a0,\n                                               HWND a1)\n{\n    _PrintEnter(\"ImpersonateDdeClientWindow(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ImpersonateDdeClientWindow(a0, a1);\n    } __finally {\n        _PrintExit(\"ImpersonateDdeClientWindow(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_InSendMessage(void)\n{\n    _PrintEnter(\"InSendMessage()\\n\");\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_InSendMessage();\n    } __finally {\n        _PrintExit(\"InSendMessage() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_InflateRect(LPRECT a0,\n                                int a1,\n                                int a2)\n{\n    _PrintEnter(\"InflateRect(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_InflateRect(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"InflateRect(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_InitAtomTable(DWORD a0)\n{\n    _PrintEnter(\"InitAtomTable(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_InitAtomTable(a0);\n    } __finally {\n        _PrintExit(\"InitAtomTable() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_InsertMenuA(HMENU a0,\n                                UINT a1,\n                                UINT a2,\n                                UINT_PTR a3,\n                                LPCSTR a4)\n{\n    _PrintEnter(\"InsertMenuA(%p,%p,%p,%p,%hs)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_InsertMenuA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"InsertMenuA(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_InsertMenuItemA(HMENU a0,\n                                    UINT a1,\n                                    BOOL a2,\n                                    MENUITEMINFOA* a3)\n{\n    _PrintEnter(\"InsertMenuItemA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_InsertMenuItemA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"InsertMenuItemA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_InsertMenuItemW(HMENU a0,\n                                    UINT a1,\n                                    BOOL a2,\n                                    MENUITEMINFOW* a3)\n{\n    _PrintEnter(\"InsertMenuItemW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_InsertMenuItemW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"InsertMenuItemW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_InsertMenuW(HMENU a0,\n                                UINT a1,\n                                UINT a2,\n                                UINT_PTR a3,\n                                LPCWSTR a4)\n{\n    _PrintEnter(\"InsertMenuW(%p,%p,%p,%p,%ls)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_InsertMenuW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"InsertMenuW(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_IntersectClipRect(HDC a0,\n                                     int a1,\n                                     int a2,\n                                     int a3,\n                                     int a4)\n{\n    _PrintEnter(\"IntersectClipRect(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    int rv = 0;\n    __try {\n        rv = Real_IntersectClipRect(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"IntersectClipRect(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IntersectRect(LPRECT a0,\n                                  RECT* a1,\n                                  RECT* a2)\n{\n    _PrintEnter(\"IntersectRect(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IntersectRect(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"IntersectRect(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_InvalidateRect(HWND a0,\n                                   RECT* a1,\n                                   BOOL a2)\n{\n    _PrintEnter(\"InvalidateRect(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_InvalidateRect(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"InvalidateRect(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_InvalidateRgn(HWND a0,\n                                  HRGN a1,\n                                  BOOL a2)\n{\n    _PrintEnter(\"InvalidateRgn(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_InvalidateRgn(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"InvalidateRgn(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_InvertRect(HDC a0,\n                               RECT* a1)\n{\n    _PrintEnter(\"InvertRect(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_InvertRect(a0, a1);\n    } __finally {\n        _PrintExit(\"InvertRect(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_InvertRgn(HDC a0,\n                              HRGN a1)\n{\n    _PrintEnter(\"InvertRgn(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_InvertRgn(a0, a1);\n    } __finally {\n        _PrintExit(\"InvertRgn(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsAccelerator(HACCEL a0,\n                                  int a1,\n                                  LPMSG a2,\n                                  WORD* a3)\n{\n    _PrintEnter(\"IsAccelerator(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsAccelerator(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"IsAccelerator(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsBadCodePtr(FARPROC a0)\n{\n    _PrintEnter(\"IsBadCodePtr(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsBadCodePtr(a0);\n    } __finally {\n        _PrintExit(\"IsBadCodePtr() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsBadHugeReadPtr(void* a0,\n                                     UINT_PTR a1)\n{\n    _PrintEnter(\"IsBadHugeReadPtr(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsBadHugeReadPtr(a0, a1);\n    } __finally {\n        _PrintExit(\"IsBadHugeReadPtr(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsBadHugeWritePtr(LPVOID a0,\n                                      UINT_PTR a1)\n{\n    _PrintEnter(\"IsBadHugeWritePtr(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsBadHugeWritePtr(a0, a1);\n    } __finally {\n        _PrintExit(\"IsBadHugeWritePtr(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsBadReadPtr(void* a0,\n                                 UINT_PTR a1)\n{\n    _PrintEnter(\"IsBadReadPtr(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsBadReadPtr(a0, a1);\n    } __finally {\n        _PrintExit(\"IsBadReadPtr(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsBadStringPtrA(LPCSTR a0,\n                                    UINT_PTR a1)\n{\n    _PrintEnter(\"IsBadStringPtrA(%hs,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsBadStringPtrA(a0, a1);\n    } __finally {\n        _PrintExit(\"IsBadStringPtrA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsBadStringPtrW(LPCWSTR a0,\n                                    UINT_PTR a1)\n{\n    _PrintEnter(\"IsBadStringPtrW(%ls,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsBadStringPtrW(a0, a1);\n    } __finally {\n        _PrintExit(\"IsBadStringPtrW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsBadWritePtr(LPVOID a0,\n                                  UINT_PTR a1)\n{\n    _PrintEnter(\"IsBadWritePtr(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsBadWritePtr(a0, a1);\n    } __finally {\n        _PrintExit(\"IsBadWritePtr(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsCharAlphaA(CHAR a0)\n{\n    _PrintEnter(\"IsCharAlphaA(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsCharAlphaA(a0);\n    } __finally {\n        _PrintExit(\"IsCharAlphaA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsCharAlphaNumericA(CHAR a0)\n{\n    _PrintEnter(\"IsCharAlphaNumericA(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsCharAlphaNumericA(a0);\n    } __finally {\n        _PrintExit(\"IsCharAlphaNumericA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsCharAlphaNumericW(WCHAR a0)\n{\n    _PrintEnter(\"IsCharAlphaNumericW(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsCharAlphaNumericW(a0);\n    } __finally {\n        _PrintExit(\"IsCharAlphaNumericW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsCharAlphaW(WCHAR a0)\n{\n    _PrintEnter(\"IsCharAlphaW(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsCharAlphaW(a0);\n    } __finally {\n        _PrintExit(\"IsCharAlphaW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsCharLowerA(CHAR a0)\n{\n    _PrintEnter(\"IsCharLowerA(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsCharLowerA(a0);\n    } __finally {\n        _PrintExit(\"IsCharLowerA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsCharLowerW(WCHAR a0)\n{\n    _PrintEnter(\"IsCharLowerW(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsCharLowerW(a0);\n    } __finally {\n        _PrintExit(\"IsCharLowerW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsCharUpperA(CHAR a0)\n{\n    _PrintEnter(\"IsCharUpperA(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsCharUpperA(a0);\n    } __finally {\n        _PrintExit(\"IsCharUpperA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsCharUpperW(WCHAR a0)\n{\n    _PrintEnter(\"IsCharUpperW(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsCharUpperW(a0);\n    } __finally {\n        _PrintExit(\"IsCharUpperW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsChild(HWND a0,\n                            HWND a1)\n{\n    _PrintEnter(\"IsChild(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsChild(a0, a1);\n    } __finally {\n        _PrintExit(\"IsChild(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsClipboardFormatAvailable(UINT a0)\n{\n    _PrintEnter(\"IsClipboardFormatAvailable(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsClipboardFormatAvailable(a0);\n    } __finally {\n        _PrintExit(\"IsClipboardFormatAvailable() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsDBCSLeadByte(BYTE a0)\n{\n    _PrintEnter(\"IsDBCSLeadByte(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsDBCSLeadByte(a0);\n    } __finally {\n        _PrintExit(\"IsDBCSLeadByte() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsDBCSLeadByteEx(UINT a0,\n                                     BYTE a1)\n{\n    _PrintEnter(\"IsDBCSLeadByteEx(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsDBCSLeadByteEx(a0, a1);\n    } __finally {\n        _PrintExit(\"IsDBCSLeadByteEx(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsDebuggerPresent(void)\n{\n    _PrintEnter(\"IsDebuggerPresent()\\n\");\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsDebuggerPresent();\n    } __finally {\n        _PrintExit(\"IsDebuggerPresent() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsDialogMessageA(HWND a0,\n                                     LPMSG a1)\n{\n    _PrintEnter(\"IsDialogMessageA(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsDialogMessageA(a0, a1);\n    } __finally {\n        _PrintExit(\"IsDialogMessageA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsDialogMessageW(HWND a0,\n                                     LPMSG a1)\n{\n    _PrintEnter(\"IsDialogMessageW(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsDialogMessageW(a0, a1);\n    } __finally {\n        _PrintExit(\"IsDialogMessageW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_IsDlgButtonChecked(HWND a0,\n                                       int a1)\n{\n    _PrintEnter(\"IsDlgButtonChecked(%p,%p)\\n\", a0, a1);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_IsDlgButtonChecked(a0, a1);\n    } __finally {\n        _PrintExit(\"IsDlgButtonChecked(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsIconic(HWND a0)\n{\n    _PrintEnter(\"IsIconic(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsIconic(a0);\n    } __finally {\n        _PrintExit(\"IsIconic() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsMenu(HMENU a0)\n{\n    _PrintEnter(\"IsMenu(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsMenu(a0);\n    } __finally {\n        _PrintExit(\"IsMenu() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\n#if !defined(DETOURS_ARM)\nBOOL __stdcall Mine_IsProcessorFeaturePresent(DWORD a0)\n{\n    _PrintEnter(\"IsProcessorFeaturePresent(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsProcessorFeaturePresent(a0);\n    } __finally {\n        _PrintExit(\"IsProcessorFeaturePresent() -> %p\\n\", rv);\n    };\n    return rv;\n}\n#endif // !DETOURS_ARM\n\nBOOL __stdcall Mine_IsRectEmpty(RECT* a0)\n{\n    _PrintEnter(\"IsRectEmpty(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsRectEmpty(a0);\n    } __finally {\n        _PrintExit(\"IsRectEmpty() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsValidCodePage(UINT a0)\n{\n    _PrintEnter(\"IsValidCodePage(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsValidCodePage(a0);\n    } __finally {\n        _PrintExit(\"IsValidCodePage() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsValidLocale(LCID a0,\n                                  DWORD a1)\n{\n    _PrintEnter(\"IsValidLocale(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsValidLocale(a0, a1);\n    } __finally {\n        _PrintExit(\"IsValidLocale(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsWindow(HWND a0)\n{\n    _PrintEnter(\"IsWindow(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsWindow(a0);\n    } __finally {\n        _PrintExit(\"IsWindow() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsWindowEnabled(HWND a0)\n{\n    _PrintEnter(\"IsWindowEnabled(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsWindowEnabled(a0);\n    } __finally {\n        _PrintExit(\"IsWindowEnabled() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsWindowUnicode(HWND a0)\n{\n    _PrintEnter(\"IsWindowUnicode(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsWindowUnicode(a0);\n    } __finally {\n        _PrintExit(\"IsWindowUnicode() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsWindowVisible(HWND a0)\n{\n    _PrintEnter(\"IsWindowVisible(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsWindowVisible(a0);\n    } __finally {\n        _PrintExit(\"IsWindowVisible() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_IsZoomed(HWND a0)\n{\n    _PrintEnter(\"IsZoomed(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_IsZoomed(a0);\n    } __finally {\n        _PrintExit(\"IsZoomed() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_KillTimer(HWND a0,\n                              UINT_PTR a1)\n{\n    _PrintEnter(\"KillTimer(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_KillTimer(a0, a1);\n    } __finally {\n        _PrintExit(\"KillTimer(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_LPtoDP(HDC a0,\n                           POINT* a1,\n                           int a2)\n{\n    _PrintEnter(\"LPtoDP(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_LPtoDP(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"LPtoDP(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_LineDDA(int a0,\n                            int a1,\n                            int a2,\n                            int a3,\n                            LINEDDAPROC a4,\n                            LPARAM a5)\n{\n    _PrintEnter(\"LineDDA(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_LineDDA(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"LineDDA(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_LineTo(HDC a0,\n                           int a1,\n                           int a2)\n{\n    _PrintEnter(\"LineTo(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_LineTo(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"LineTo(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHACCEL __stdcall Mine_LoadAcceleratorsA(HINSTANCE a0,\n                                        LPCSTR a1)\n{\n    _PrintEnter(\"LoadAcceleratorsA(%p,%hs)\\n\", a0, a1);\n\n    HACCEL rv = 0;\n    __try {\n        rv = Real_LoadAcceleratorsA(a0, a1);\n    } __finally {\n        _PrintExit(\"LoadAcceleratorsA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHACCEL __stdcall Mine_LoadAcceleratorsW(HINSTANCE a0,\n                                        LPCWSTR a1)\n{\n    _PrintEnter(\"LoadAcceleratorsW(%p,%ls)\\n\", a0, a1);\n\n    HACCEL rv = 0;\n    __try {\n        rv = Real_LoadAcceleratorsW(a0, a1);\n    } __finally {\n        _PrintExit(\"LoadAcceleratorsW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHBITMAP __stdcall Mine_LoadBitmapA(HINSTANCE a0,\n                                   LPCSTR a1)\n{\n    _PrintEnter(\"LoadBitmapA(%p,%hs)\\n\", a0, a1);\n\n    HBITMAP rv = 0;\n    __try {\n        rv = Real_LoadBitmapA(a0, a1);\n    } __finally {\n        _PrintExit(\"LoadBitmapA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHBITMAP __stdcall Mine_LoadBitmapW(HINSTANCE a0,\n                                   LPCWSTR a1)\n{\n    _PrintEnter(\"LoadBitmapW(%p,%ls)\\n\", a0, a1);\n\n    HBITMAP rv = 0;\n    __try {\n        rv = Real_LoadBitmapW(a0, a1);\n    } __finally {\n        _PrintExit(\"LoadBitmapW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHCURSOR __stdcall Mine_LoadCursorA(HINSTANCE a0,\n                                   LPCSTR a1)\n{\n    _PrintEnter(\"LoadCursorA(%p,%hs)\\n\", a0, a1);\n\n    HCURSOR rv = 0;\n    __try {\n        rv = Real_LoadCursorA(a0, a1);\n    } __finally {\n        _PrintExit(\"LoadCursorA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHCURSOR __stdcall Mine_LoadCursorFromFileA(LPCSTR a0)\n{\n    _PrintEnter(\"LoadCursorFromFileA(%hs)\\n\", a0);\n\n    HCURSOR rv = 0;\n    __try {\n        rv = Real_LoadCursorFromFileA(a0);\n    } __finally {\n        _PrintExit(\"LoadCursorFromFileA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHCURSOR __stdcall Mine_LoadCursorFromFileW(LPCWSTR a0)\n{\n    _PrintEnter(\"LoadCursorFromFileW(%ls)\\n\", a0);\n\n    HCURSOR rv = 0;\n    __try {\n        rv = Real_LoadCursorFromFileW(a0);\n    } __finally {\n        _PrintExit(\"LoadCursorFromFileW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHCURSOR __stdcall Mine_LoadCursorW(HINSTANCE a0,\n                                   LPCWSTR a1)\n{\n    _PrintEnter(\"LoadCursorW(%p,%ls)\\n\", a0, a1);\n\n    HCURSOR rv = 0;\n    __try {\n        rv = Real_LoadCursorW(a0, a1);\n    } __finally {\n        _PrintExit(\"LoadCursorW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHICON __stdcall Mine_LoadIconA(HINSTANCE a0,\n                               LPCSTR a1)\n{\n    _PrintEnter(\"LoadIconA(%p,%hs)\\n\", a0, a1);\n\n    HICON rv = 0;\n    __try {\n        rv = Real_LoadIconA(a0, a1);\n    } __finally {\n        _PrintExit(\"LoadIconA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHICON __stdcall Mine_LoadIconW(HINSTANCE a0,\n                               LPCWSTR a1)\n{\n    _PrintEnter(\"LoadIconW(%p,%ls)\\n\", a0, a1);\n\n    HICON rv = 0;\n    __try {\n        rv = Real_LoadIconW(a0, a1);\n    } __finally {\n        _PrintExit(\"LoadIconW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_LoadImageA(HINSTANCE a0,\n                                 LPCSTR a1,\n                                 UINT a2,\n                                 int a3,\n                                 int a4,\n                                 UINT a5)\n{\n    _PrintEnter(\"LoadImageA(%p,%hs,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_LoadImageA(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"LoadImageA(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_LoadImageW(HINSTANCE a0,\n                                 LPCWSTR a1,\n                                 UINT a2,\n                                 int a3,\n                                 int a4,\n                                 UINT a5)\n{\n    _PrintEnter(\"LoadImageW(%p,%ls,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_LoadImageW(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"LoadImageW(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHKL __stdcall Mine_LoadKeyboardLayoutA(LPCSTR a0,\n                                       UINT a1)\n{\n    _PrintEnter(\"LoadKeyboardLayoutA(%hs,%p)\\n\", a0, a1);\n\n    HKL rv = 0;\n    __try {\n        rv = Real_LoadKeyboardLayoutA(a0, a1);\n    } __finally {\n        _PrintExit(\"LoadKeyboardLayoutA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHKL __stdcall Mine_LoadKeyboardLayoutW(LPCWSTR a0,\n                                       UINT a1)\n{\n    _PrintEnter(\"LoadKeyboardLayoutW(%ls,%p)\\n\", a0, a1);\n\n    HKL rv = 0;\n    __try {\n        rv = Real_LoadKeyboardLayoutW(a0, a1);\n    } __finally {\n        _PrintExit(\"LoadKeyboardLayoutW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHMODULE __stdcall Mine_LoadLibraryA(LPCSTR a0)\n{\n    _PrintEnter(\"LoadLibraryA(%hs)\\n\", a0);\n\n    HMODULE rv = 0;\n    __try {\n        rv = Real_LoadLibraryA(a0);\n    } __finally {\n        _PrintExit(\"LoadLibraryA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHMODULE __stdcall Mine_LoadLibraryExA(LPCSTR a0,\n                                      HANDLE a1,\n                                      DWORD a2)\n{\n    _PrintEnter(\"LoadLibraryExA(%hs,%p,%p)\\n\", a0, a1, a2);\n\n    HMODULE rv = 0;\n    __try {\n        rv = Real_LoadLibraryExA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"LoadLibraryExA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHMODULE __stdcall Mine_LoadLibraryExW(LPCWSTR a0,\n                                      HANDLE a1,\n                                      DWORD a2)\n{\n    _PrintEnter(\"LoadLibraryExW(%ls,%p,%p)\\n\", a0, a1, a2);\n\n    HMODULE rv = 0;\n    __try {\n        rv = Real_LoadLibraryExW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"LoadLibraryExW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHMODULE __stdcall Mine_LoadLibraryW(LPCWSTR a0)\n{\n    _PrintEnter(\"LoadLibraryW(%ls)\\n\", a0);\n\n    HMODULE rv = 0;\n    __try {\n        rv = Real_LoadLibraryW(a0);\n    } __finally {\n        _PrintExit(\"LoadLibraryW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHMENU __stdcall Mine_LoadMenuA(HINSTANCE a0,\n                               LPCSTR a1)\n{\n    _PrintEnter(\"LoadMenuA(%p,%hs)\\n\", a0, a1);\n\n    HMENU rv = 0;\n    __try {\n        rv = Real_LoadMenuA(a0, a1);\n    } __finally {\n        _PrintExit(\"LoadMenuA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHMENU __stdcall Mine_LoadMenuIndirectA(MENUTEMPLATEA* a0)\n{\n    _PrintEnter(\"LoadMenuIndirectA(%p)\\n\", a0);\n\n    HMENU rv = 0;\n    __try {\n        rv = Real_LoadMenuIndirectA(a0);\n    } __finally {\n        _PrintExit(\"LoadMenuIndirectA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHMENU __stdcall Mine_LoadMenuIndirectW(MENUTEMPLATEW* a0)\n{\n    _PrintEnter(\"LoadMenuIndirectW(%p)\\n\", a0);\n\n    HMENU rv = 0;\n    __try {\n        rv = Real_LoadMenuIndirectW(a0);\n    } __finally {\n        _PrintExit(\"LoadMenuIndirectW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHMENU __stdcall Mine_LoadMenuW(HINSTANCE a0,\n                               LPCWSTR a1)\n{\n    _PrintEnter(\"LoadMenuW(%p,%ls)\\n\", a0, a1);\n\n    HMENU rv = 0;\n    __try {\n        rv = Real_LoadMenuW(a0, a1);\n    } __finally {\n        _PrintExit(\"LoadMenuW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_LoadModule(LPCSTR a0,\n                                LPVOID a1)\n{\n    _PrintEnter(\"LoadModule(%hs,%p)\\n\", a0, a1);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_LoadModule(a0, a1);\n    } __finally {\n        _PrintExit(\"LoadModule(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHGLOBAL __stdcall Mine_LoadResource(HMODULE a0,\n                                    HRSRC a1)\n{\n    _PrintEnter(\"LoadResource(%p,%p)\\n\", a0, a1);\n\n    HGLOBAL rv = 0;\n    __try {\n        rv = Real_LoadResource(a0, a1);\n    } __finally {\n        _PrintExit(\"LoadResource(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_LoadStringA(HINSTANCE a0,\n                               UINT a1,\n                               LPSTR a2,\n                               int a3)\n{\n    _PrintEnter(\"LoadStringA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    int rv = 0;\n    __try {\n        rv = Real_LoadStringA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"LoadStringA(,,%hs,) -> %p\\n\", a2, rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_LoadStringW(HINSTANCE a0,\n                               UINT a1,\n                               LPWSTR a2,\n                               int a3)\n{\n    _PrintEnter(\"LoadStringW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    int rv = 0;\n    __try {\n        rv = Real_LoadStringW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"LoadStringW(,,%ls,) -> %p\\n\", a2, rv);\n    };\n    return rv;\n}\n\nHLOCAL __stdcall Mine_LocalAlloc(UINT a0,\n                                 SIZE_T a1)\n{\n    _PrintEnter(\"LocalAlloc(%p,%p)\\n\", a0, a1);\n\n    HLOCAL rv = 0;\n    __try {\n        rv = Real_LocalAlloc(a0, a1);\n    } __finally {\n        _PrintExit(\"LocalAlloc(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nSIZE_T __stdcall Mine_LocalCompact(UINT a0)\n{\n    _PrintEnter(\"LocalCompact(%p)\\n\", a0);\n\n    SIZE_T rv = 0;\n    __try {\n        rv = Real_LocalCompact(a0);\n    } __finally {\n        _PrintExit(\"LocalCompact() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_LocalFileTimeToFileTime(FILETIME* a0,\n                                            LPFILETIME a1)\n{\n    _PrintEnter(\"LocalFileTimeToFileTime(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_LocalFileTimeToFileTime(a0, a1);\n    } __finally {\n        _PrintExit(\"LocalFileTimeToFileTime(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_LocalFlags(HLOCAL a0)\n{\n    _PrintEnter(\"LocalFlags(%p)\\n\", a0);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_LocalFlags(a0);\n    } __finally {\n        _PrintExit(\"LocalFlags() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHLOCAL __stdcall Mine_LocalFree(HLOCAL a0)\n{\n    _PrintEnter(\"LocalFree(%p)\\n\", a0);\n\n    HLOCAL rv = 0;\n    __try {\n        rv = Real_LocalFree(a0);\n    } __finally {\n        _PrintExit(\"LocalFree() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHLOCAL __stdcall Mine_LocalHandle(LPCVOID a0)\n{\n    _PrintEnter(\"LocalHandle(%p)\\n\", a0);\n\n    HLOCAL rv = 0;\n    __try {\n        rv = Real_LocalHandle(a0);\n    } __finally {\n        _PrintExit(\"LocalHandle() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLPVOID __stdcall Mine_LocalLock(HLOCAL a0)\n{\n    _PrintEnter(\"LocalLock(%p)\\n\", a0);\n\n    LPVOID rv = 0;\n    __try {\n        rv = Real_LocalLock(a0);\n    } __finally {\n        _PrintExit(\"LocalLock() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHLOCAL __stdcall Mine_LocalReAlloc(HLOCAL a0,\n                                   SIZE_T a1,\n                                   UINT a2)\n{\n    _PrintEnter(\"LocalReAlloc(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HLOCAL rv = 0;\n    __try {\n        rv = Real_LocalReAlloc(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"LocalReAlloc(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nSIZE_T __stdcall Mine_LocalShrink(HLOCAL a0,\n                                  UINT a1)\n{\n    _PrintEnter(\"LocalShrink(%p,%p)\\n\", a0, a1);\n\n    SIZE_T rv = 0;\n    __try {\n        rv = Real_LocalShrink(a0, a1);\n    } __finally {\n        _PrintExit(\"LocalShrink(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nSIZE_T __stdcall Mine_LocalSize(HLOCAL a0)\n{\n    _PrintEnter(\"LocalSize(%p)\\n\", a0);\n\n    SIZE_T rv = 0;\n    __try {\n        rv = Real_LocalSize(a0);\n    } __finally {\n        _PrintExit(\"LocalSize() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_LocalUnlock(HLOCAL a0)\n{\n    _PrintEnter(\"LocalUnlock(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_LocalUnlock(a0);\n    } __finally {\n        _PrintExit(\"LocalUnlock() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_LockFile(HANDLE a0,\n                             DWORD a1,\n                             DWORD a2,\n                             DWORD a3,\n                             DWORD a4)\n{\n    _PrintEnter(\"LockFile(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_LockFile(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"LockFile(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_LockFileEx(HANDLE a0,\n                               DWORD a1,\n                               DWORD a2,\n                               DWORD a3,\n                               DWORD a4,\n                               LPOVERLAPPED a5)\n{\n    _PrintEnter(\"LockFileEx(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_LockFileEx(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"LockFileEx(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLPVOID __stdcall Mine_LockResource(HGLOBAL a0)\n{\n    _PrintEnter(\"LockResource(%p)\\n\", a0);\n\n    LPVOID rv = 0;\n    __try {\n        rv = Real_LockResource(a0);\n    } __finally {\n        _PrintExit(\"LockResource() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_LockWindowUpdate(HWND a0)\n{\n    _PrintEnter(\"LockWindowUpdate(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_LockWindowUpdate(a0);\n    } __finally {\n        _PrintExit(\"LockWindowUpdate() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_LookupIconIdFromDirectory(PBYTE a0,\n                                             BOOL a1)\n{\n    _PrintEnter(\"LookupIconIdFromDirectory(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_LookupIconIdFromDirectory(a0, a1);\n    } __finally {\n        _PrintExit(\"LookupIconIdFromDirectory(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_LookupIconIdFromDirectoryEx(PBYTE a0,\n                                               BOOL a1,\n                                               int a2,\n                                               int a3,\n                                               UINT a4)\n{\n    _PrintEnter(\"LookupIconIdFromDirectoryEx(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    int rv = 0;\n    __try {\n        rv = Real_LookupIconIdFromDirectoryEx(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"LookupIconIdFromDirectoryEx(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_MapDialogRect(HWND a0,\n                                  LPRECT a1)\n{\n    _PrintEnter(\"MapDialogRect(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_MapDialogRect(a0, a1);\n    } __finally {\n        _PrintExit(\"MapDialogRect(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLPVOID __stdcall Mine_MapViewOfFile(HANDLE a0,\n                                    DWORD a1,\n                                    DWORD a2,\n                                    DWORD a3,\n                                    SIZE_T a4)\n{\n    _PrintEnter(\"MapViewOfFile(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    LPVOID rv = 0;\n    __try {\n        rv = Real_MapViewOfFile(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"MapViewOfFile(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLPVOID __stdcall Mine_MapViewOfFileEx(HANDLE a0,\n                                      DWORD a1,\n                                      DWORD a2,\n                                      DWORD a3,\n                                      SIZE_T a4,\n                                      LPVOID a5)\n{\n    _PrintEnter(\"MapViewOfFileEx(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    LPVOID rv = 0;\n    __try {\n        rv = Real_MapViewOfFileEx(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"MapViewOfFileEx(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_MapVirtualKeyA(UINT a0,\n                                   UINT a1)\n{\n    _PrintEnter(\"MapVirtualKeyA(%p,%p)\\n\", a0, a1);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_MapVirtualKeyA(a0, a1);\n    } __finally {\n        _PrintExit(\"MapVirtualKeyA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_MapVirtualKeyExA(UINT a0,\n                                     UINT a1,\n                                     HKL a2)\n{\n    _PrintEnter(\"MapVirtualKeyExA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_MapVirtualKeyExA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"MapVirtualKeyExA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_MapVirtualKeyExW(UINT a0,\n                                     UINT a1,\n                                     HKL a2)\n{\n    _PrintEnter(\"MapVirtualKeyExW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_MapVirtualKeyExW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"MapVirtualKeyExW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_MapVirtualKeyW(UINT a0,\n                                   UINT a1)\n{\n    _PrintEnter(\"MapVirtualKeyW(%p,%p)\\n\", a0, a1);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_MapVirtualKeyW(a0, a1);\n    } __finally {\n        _PrintExit(\"MapVirtualKeyW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_MapWindowPoints(HWND a0,\n                                   HWND a1,\n                                   POINT* a2,\n                                   UINT a3)\n{\n    _PrintEnter(\"MapWindowPoints(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    int rv = 0;\n    __try {\n        rv = Real_MapWindowPoints(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"MapWindowPoints(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_MaskBlt(HDC a0,\n                            int a1,\n                            int a2,\n                            int a3,\n                            int a4,\n                            HDC a5,\n                            int a6,\n                            int a7,\n                            HBITMAP a8,\n                            int a9,\n                            int a10,\n                            DWORD a11)\n{\n    _PrintEnter(\"MaskBlt(%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_MaskBlt(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);\n    } __finally {\n        _PrintExit(\"MaskBlt(,,,,,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_MenuItemFromPoint(HWND a0,\n                                     HMENU a1,\n                                     POINT a2)\n{\n    _PrintEnter(\"MenuItemFromPoint(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_MenuItemFromPoint(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"MenuItemFromPoint(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_MessageBeep(UINT a0)\n{\n    _PrintEnter(\"MessageBeep(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_MessageBeep(a0);\n    } __finally {\n        _PrintExit(\"MessageBeep() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_MessageBoxA(HWND a0,\n                               LPCSTR a1,\n                               LPCSTR a2,\n                               UINT a3)\n{\n    _PrintEnter(\"MessageBoxA(%p,%hs,%hs,%p)\\n\", a0, a1, a2, a3);\n\n    int rv = 0;\n    __try {\n        rv = Real_MessageBoxA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"MessageBoxA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_MessageBoxExA(HWND a0,\n                                 LPCSTR a1,\n                                 LPCSTR a2,\n                                 UINT a3,\n                                 WORD a4)\n{\n    _PrintEnter(\"MessageBoxExA(%p,%hs,%hs,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    int rv = 0;\n    __try {\n        rv = Real_MessageBoxExA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"MessageBoxExA(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_MessageBoxExW(HWND a0,\n                                 LPCWSTR a1,\n                                 LPCWSTR a2,\n                                 UINT a3,\n                                 WORD a4)\n{\n    _PrintEnter(\"MessageBoxExW(%p,%ls,%ls,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    int rv = 0;\n    __try {\n        rv = Real_MessageBoxExW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"MessageBoxExW(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_MessageBoxIndirectA(MSGBOXPARAMSA* a0)\n{\n    _PrintEnter(\"MessageBoxIndirectA(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_MessageBoxIndirectA(a0);\n    } __finally {\n        _PrintExit(\"MessageBoxIndirectA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_MessageBoxIndirectW(MSGBOXPARAMSW* a0)\n{\n    _PrintEnter(\"MessageBoxIndirectW(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_MessageBoxIndirectW(a0);\n    } __finally {\n        _PrintExit(\"MessageBoxIndirectW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_MessageBoxW(HWND a0,\n                               LPCWSTR a1,\n                               LPCWSTR a2,\n                               UINT a3)\n{\n    _PrintEnter(\"MessageBoxW(%p,%ls,%ls,%p)\\n\", a0, a1, a2, a3);\n\n    int rv = 0;\n    __try {\n        rv = Real_MessageBoxW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"MessageBoxW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_MkParseDisplayName(IBindCtx* a0,\n                                          LPCOLESTR a1,\n                                          ULONG* a2,\n                                          IMoniker** a3)\n{\n    _PrintEnter(\"MkParseDisplayName(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_MkParseDisplayName(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"MkParseDisplayName(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ModifyMenuA(HMENU a0,\n                                UINT a1,\n                                UINT a2,\n                                UINT_PTR a3,\n                                LPCSTR a4)\n{\n    _PrintEnter(\"ModifyMenuA(%p,%p,%p,%p,%hs)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ModifyMenuA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"ModifyMenuA(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ModifyMenuW(HMENU a0,\n                                UINT a1,\n                                UINT a2,\n                                UINT_PTR a3,\n                                LPCWSTR a4)\n{\n    _PrintEnter(\"ModifyMenuW(%p,%p,%p,%p,%ls)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ModifyMenuW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"ModifyMenuW(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ModifyWorldTransform(HDC a0,\n                                         XFORM* a1,\n                                         DWORD a2)\n{\n    _PrintEnter(\"ModifyWorldTransform(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ModifyWorldTransform(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"ModifyWorldTransform(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_MonikerCommonPrefixWith(IMoniker* a0,\n                                               IMoniker* a1,\n                                               IMoniker** a2)\n{\n    _PrintEnter(\"MonikerCommonPrefixWith(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_MonikerCommonPrefixWith(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"MonikerCommonPrefixWith(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_MonikerRelativePathTo(IMoniker* a0,\n                                             IMoniker* a1,\n                                             IMoniker** a2,\n                                             BOOL a3)\n{\n    _PrintEnter(\"MonikerRelativePathTo(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_MonikerRelativePathTo(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"MonikerRelativePathTo(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_MoveFileA(LPCSTR a0,\n                              LPCSTR a1)\n{\n    _PrintEnter(\"MoveFileA(%hs,%hs)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_MoveFileA(a0, a1);\n    } __finally {\n        _PrintExit(\"MoveFileA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_MoveFileExA(LPCSTR a0,\n                                LPCSTR a1,\n                                DWORD a2)\n{\n    _PrintEnter(\"MoveFileExA(%hs,%hs,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_MoveFileExA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"MoveFileExA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_MoveFileExW(LPCWSTR a0,\n                                LPCWSTR a1,\n                                DWORD a2)\n{\n    _PrintEnter(\"MoveFileExW(%ls,%ls,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_MoveFileExW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"MoveFileExW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_MoveFileW(LPCWSTR a0,\n                              LPCWSTR a1)\n{\n    _PrintEnter(\"MoveFileW(%ls,%ls)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_MoveFileW(a0, a1);\n    } __finally {\n        _PrintExit(\"MoveFileW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_MoveToEx(HDC a0,\n                             int a1,\n                             int a2,\n                             POINT* a3)\n{\n    _PrintEnter(\"MoveToEx(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_MoveToEx(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"MoveToEx(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_MoveWindow(HWND a0,\n                               int a1,\n                               int a2,\n                               int a3,\n                               int a4,\n                               BOOL a5)\n{\n    _PrintEnter(\"MoveWindow(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_MoveWindow(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"MoveWindow(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_MsgWaitForMultipleObjects(DWORD a0,\n                                               void** a1,\n                                               BOOL a2,\n                                               DWORD a3,\n                                               DWORD a4)\n{\n    _PrintEnter(\"MsgWaitForMultipleObjects(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_MsgWaitForMultipleObjects(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"MsgWaitForMultipleObjects(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_MsgWaitForMultipleObjectsEx(DWORD a0,\n                                                 void** a1,\n                                                 DWORD a2,\n                                                 DWORD a3,\n                                                 DWORD a4)\n{\n    _PrintEnter(\"MsgWaitForMultipleObjectsEx(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_MsgWaitForMultipleObjectsEx(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"MsgWaitForMultipleObjectsEx(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_MulDiv(int a0,\n                          int a1,\n                          int a2)\n{\n    _PrintEnter(\"MulDiv(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_MulDiv(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"MulDiv(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_OemKeyScan(WORD a0)\n{\n    _PrintEnter(\"OemKeyScan(%p)\\n\", a0);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_OemKeyScan(a0);\n    } __finally {\n        _PrintExit(\"OemKeyScan() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_OemToCharA(LPCSTR a0,\n                               LPSTR a1)\n{\n    _PrintEnter(\"OemToCharA(%hs,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_OemToCharA(a0, a1);\n    } __finally {\n        _PrintExit(\"OemToCharA(,%hs) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_OemToCharBuffA(LPCSTR a0,\n                                   LPSTR a1,\n                                   DWORD a2)\n{\n    _PrintEnter(\"OemToCharBuffA(%hs,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_OemToCharBuffA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OemToCharBuffA(,%hs,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_OemToCharBuffW(LPCSTR a0,\n                                   LPWSTR a1,\n                                   DWORD a2)\n{\n    _PrintEnter(\"OemToCharBuffW(%hs,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_OemToCharBuffW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OemToCharBuffW(,%ls,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_OemToCharW(LPCSTR a0,\n                               LPWSTR a1)\n{\n    _PrintEnter(\"OemToCharW(%hs,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_OemToCharW(a0, a1);\n    } __finally {\n        _PrintExit(\"OemToCharW(,%ls) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_OffsetClipRgn(HDC a0,\n                                 int a1,\n                                 int a2)\n{\n    _PrintEnter(\"OffsetClipRgn(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_OffsetClipRgn(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OffsetClipRgn(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_OffsetRect(LPRECT a0,\n                               int a1,\n                               int a2)\n{\n    _PrintEnter(\"OffsetRect(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_OffsetRect(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OffsetRect(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_OffsetRgn(HRGN a0,\n                             int a1,\n                             int a2)\n{\n    _PrintEnter(\"OffsetRgn(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_OffsetRgn(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OffsetRgn(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_OffsetViewportOrgEx(HDC a0,\n                                        int a1,\n                                        int a2,\n                                        POINT* a3)\n{\n    _PrintEnter(\"OffsetViewportOrgEx(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_OffsetViewportOrgEx(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"OffsetViewportOrgEx(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_OffsetWindowOrgEx(HDC a0,\n                                      int a1,\n                                      int a2,\n                                      POINT* a3)\n{\n    _PrintEnter(\"OffsetWindowOrgEx(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_OffsetWindowOrgEx(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"OffsetWindowOrgEx(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_OleBuildVersion(void)\n{\n    _PrintEnter(\"OleBuildVersion()\\n\");\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_OleBuildVersion();\n    } __finally {\n        _PrintExit(\"OleBuildVersion() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleConvertIStorageToOLESTREAM(LPSTORAGE a0,\n                                                     LPOLESTREAM a1)\n{\n    _PrintEnter(\"OleConvertIStorageToOLESTREAM(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleConvertIStorageToOLESTREAM(a0, a1);\n    } __finally {\n        _PrintExit(\"OleConvertIStorageToOLESTREAM(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleConvertIStorageToOLESTREAMEx(LPSTORAGE a0,\n                                                       CLIPFORMAT a1,\n                                                       LONG a2,\n                                                       LONG a3,\n                                                       DWORD a4,\n                                                       LPSTGMEDIUM a5,\n                                                       LPOLESTREAM a6)\n{\n    _PrintEnter(\"OleConvertIStorageToOLESTREAMEx(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleConvertIStorageToOLESTREAMEx(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"OleConvertIStorageToOLESTREAMEx(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleConvertOLESTREAMToIStorage(LPOLESTREAM a0,\n                                                     LPSTORAGE a1,\n                                                     DVTARGETDEVICE* a2)\n{\n    _PrintEnter(\"OleConvertOLESTREAMToIStorage(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleConvertOLESTREAMToIStorage(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OleConvertOLESTREAMToIStorage(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleConvertOLESTREAMToIStorageEx(LPOLESTREAM a0,\n                                                       LPSTORAGE a1,\n                                                       CLIPFORMAT* a2,\n                                                       LONG* a3,\n                                                       LONG* a4,\n                                                       DWORD* a5,\n                                                       LPSTGMEDIUM a6)\n{\n    _PrintEnter(\"OleConvertOLESTREAMToIStorageEx(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleConvertOLESTREAMToIStorageEx(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"OleConvertOLESTREAMToIStorageEx(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleCreate(CONST IID& a0,\n                                 CONST IID& a1,\n                                 DWORD a2,\n                                 LPFORMATETC a3,\n                                 LPOLECLIENTSITE a4,\n                                 LPSTORAGE a5,\n                                 LPVOID* a6)\n{\n    _PrintEnter(\"OleCreate(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleCreate(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"OleCreate(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleCreateDefaultHandler(CONST IID& a0,\n                                               LPUNKNOWN a1,\n                                               CONST IID& a2,\n                                               LPVOID* a3)\n{\n    _PrintEnter(\"OleCreateDefaultHandler(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleCreateDefaultHandler(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"OleCreateDefaultHandler(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleCreateEmbeddingHelper(CONST IID& a0,\n                                                LPUNKNOWN a1,\n                                                DWORD a2,\n                                                LPCLASSFACTORY a3,\n                                                CONST IID& a4,\n                                                LPVOID* a5)\n{\n    _PrintEnter(\"OleCreateEmbeddingHelper(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleCreateEmbeddingHelper(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"OleCreateEmbeddingHelper(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleCreateEx(CONST IID& a0,\n                                   CONST IID& a1,\n                                   DWORD a2,\n                                   DWORD a3,\n                                   ULONG a4,\n                                   DWORD* a5,\n                                   LPFORMATETC a6,\n                                   IAdviseSink* a7,\n                                   DWORD* a8,\n                                   LPOLECLIENTSITE a9,\n                                   LPSTORAGE a10,\n                                   LPVOID* a11)\n{\n    _PrintEnter(\"OleCreateEx(%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleCreateEx(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);\n    } __finally {\n        _PrintExit(\"OleCreateEx(,,,,,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleCreateFromData(IDataObject* a0,\n                                         CONST IID& a1,\n                                         DWORD a2,\n                                         LPFORMATETC a3,\n                                         LPOLECLIENTSITE a4,\n                                         LPSTORAGE a5,\n                                         LPVOID* a6)\n{\n    _PrintEnter(\"OleCreateFromData(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleCreateFromData(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"OleCreateFromData(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleCreateFromDataEx(IDataObject* a0,\n                                           CONST IID& a1,\n                                           DWORD a2,\n                                           DWORD a3,\n                                           ULONG a4,\n                                           DWORD* a5,\n                                           LPFORMATETC a6,\n                                           IAdviseSink* a7,\n                                           DWORD* a8,\n                                           LPOLECLIENTSITE a9,\n                                           LPSTORAGE a10,\n                                           LPVOID* a11)\n{\n    _PrintEnter(\"OleCreateFromDataEx(%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleCreateFromDataEx(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);\n    } __finally {\n        _PrintExit(\"OleCreateFromDataEx(,,,,,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleCreateFromFile(CONST IID& a0,\n                                         LPCOLESTR a1,\n                                         CONST IID& a2,\n                                         DWORD a3,\n                                         LPFORMATETC a4,\n                                         LPOLECLIENTSITE a5,\n                                         LPSTORAGE a6,\n                                         LPVOID* a7)\n{\n    _PrintEnter(\"OleCreateFromFile(%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleCreateFromFile(a0, a1, a2, a3, a4, a5, a6, a7);\n    } __finally {\n        _PrintExit(\"OleCreateFromFile(,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleCreateFromFileEx(CONST IID& a0,\n                                           LPCOLESTR a1,\n                                           CONST IID& a2,\n                                           DWORD a3,\n                                           DWORD a4,\n                                           ULONG a5,\n                                           DWORD* a6,\n                                           LPFORMATETC a7,\n                                           IAdviseSink* a8,\n                                           DWORD* a9,\n                                           LPOLECLIENTSITE a10,\n                                           LPSTORAGE a11,\n                                           LPVOID* a12)\n{\n    _PrintEnter(\"OleCreateFromFileEx(%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleCreateFromFileEx(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);\n    } __finally {\n        _PrintExit(\"OleCreateFromFileEx(,,,,,,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleCreateLink(IMoniker* a0,\n                                     CONST IID& a1,\n                                     DWORD a2,\n                                     LPFORMATETC a3,\n                                     LPOLECLIENTSITE a4,\n                                     LPSTORAGE a5,\n                                     LPVOID* a6)\n{\n    _PrintEnter(\"OleCreateLink(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleCreateLink(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"OleCreateLink(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleCreateLinkEx(IMoniker* a0,\n                                       CONST IID& a1,\n                                       DWORD a2,\n                                       DWORD a3,\n                                       ULONG a4,\n                                       DWORD* a5,\n                                       LPFORMATETC a6,\n                                       IAdviseSink* a7,\n                                       DWORD* a8,\n                                       LPOLECLIENTSITE a9,\n                                       LPSTORAGE a10,\n                                       LPVOID* a11)\n{\n    _PrintEnter(\"OleCreateLinkEx(%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleCreateLinkEx(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);\n    } __finally {\n        _PrintExit(\"OleCreateLinkEx(,,,,,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleCreateLinkFromData(IDataObject* a0,\n                                             CONST IID& a1,\n                                             DWORD a2,\n                                             LPFORMATETC a3,\n                                             LPOLECLIENTSITE a4,\n                                             LPSTORAGE a5,\n                                             LPVOID* a6)\n{\n    _PrintEnter(\"OleCreateLinkFromData(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleCreateLinkFromData(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"OleCreateLinkFromData(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleCreateLinkFromDataEx(IDataObject* a0,\n                                               CONST IID& a1,\n                                               DWORD a2,\n                                               DWORD a3,\n                                               ULONG a4,\n                                               DWORD* a5,\n                                               LPFORMATETC a6,\n                                               IAdviseSink* a7,\n                                               DWORD* a8,\n                                               LPOLECLIENTSITE a9,\n                                               LPSTORAGE a10,\n                                               LPVOID* a11)\n{\n    _PrintEnter(\"OleCreateLinkFromDataEx(%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleCreateLinkFromDataEx(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);\n    } __finally {\n        _PrintExit(\"OleCreateLinkFromDataEx(,,,,,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleCreateLinkToFile(LPCOLESTR a0,\n                                           CONST IID& a1,\n                                           DWORD a2,\n                                           LPFORMATETC a3,\n                                           LPOLECLIENTSITE a4,\n                                           LPSTORAGE a5,\n                                           LPVOID* a6)\n{\n    _PrintEnter(\"OleCreateLinkToFile(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleCreateLinkToFile(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"OleCreateLinkToFile(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleCreateLinkToFileEx(LPCOLESTR a0,\n                                             CONST IID& a1,\n                                             DWORD a2,\n                                             DWORD a3,\n                                             ULONG a4,\n                                             DWORD* a5,\n                                             LPFORMATETC a6,\n                                             IAdviseSink* a7,\n                                             DWORD* a8,\n                                             LPOLECLIENTSITE a9,\n                                             LPSTORAGE a10,\n                                             LPVOID* a11)\n{\n    _PrintEnter(\"OleCreateLinkToFileEx(%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleCreateLinkToFileEx(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);\n    } __finally {\n        _PrintExit(\"OleCreateLinkToFileEx(,,,,,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHOLEMENU __stdcall Mine_OleCreateMenuDescriptor(HMENU a0,\n                                                LPOLEMENUGROUPWIDTHS a1)\n{\n    _PrintEnter(\"OleCreateMenuDescriptor(%p,%p)\\n\", a0, a1);\n\n    HOLEMENU rv = 0;\n    __try {\n        rv = Real_OleCreateMenuDescriptor(a0, a1);\n    } __finally {\n        _PrintExit(\"OleCreateMenuDescriptor(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleCreateStaticFromData(IDataObject* a0,\n                                               CONST IID& a1,\n                                               DWORD a2,\n                                               LPFORMATETC a3,\n                                               LPOLECLIENTSITE a4,\n                                               LPSTORAGE a5,\n                                               LPVOID* a6)\n{\n    _PrintEnter(\"OleCreateStaticFromData(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleCreateStaticFromData(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"OleCreateStaticFromData(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleDestroyMenuDescriptor(HOLEMENU a0)\n{\n    _PrintEnter(\"OleDestroyMenuDescriptor(%p)\\n\", a0);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleDestroyMenuDescriptor(a0);\n    } __finally {\n        _PrintExit(\"OleDestroyMenuDescriptor() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleDoAutoConvert(LPSTORAGE a0,\n                                        LPGUID a1)\n{\n    _PrintEnter(\"OleDoAutoConvert(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleDoAutoConvert(a0, a1);\n    } __finally {\n        _PrintExit(\"OleDoAutoConvert(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleDraw(LPUNKNOWN a0,\n                               DWORD a1,\n                               HDC a2,\n                               LPCRECT a3)\n{\n    _PrintEnter(\"OleDraw(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleDraw(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"OleDraw(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_OleDuplicateData(HANDLE a0,\n                                       CLIPFORMAT a1,\n                                       UINT a2)\n{\n    _PrintEnter(\"OleDuplicateData(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_OleDuplicateData(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OleDuplicateData(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleFlushClipboard(void)\n{\n    _PrintEnter(\"OleFlushClipboard()\\n\");\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleFlushClipboard();\n    } __finally {\n        _PrintExit(\"OleFlushClipboard() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleGetAutoConvert(CONST IID& a0,\n                                         LPGUID a1)\n{\n    _PrintEnter(\"OleGetAutoConvert(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleGetAutoConvert(a0, a1);\n    } __finally {\n        _PrintExit(\"OleGetAutoConvert(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleGetClipboard(IDataObject** a0)\n{\n    _PrintEnter(\"OleGetClipboard(%p)\\n\", a0);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleGetClipboard(a0);\n    } __finally {\n        _PrintExit(\"OleGetClipboard() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHGLOBAL __stdcall Mine_OleGetIconOfClass(CONST IID& a0,\n                                         LPOLESTR a1,\n                                         BOOL a2)\n{\n    _PrintEnter(\"OleGetIconOfClass(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HGLOBAL rv = 0;\n    __try {\n        rv = Real_OleGetIconOfClass(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OleGetIconOfClass(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHGLOBAL __stdcall Mine_OleGetIconOfFile(LPOLESTR a0,\n                                        BOOL a1)\n{\n    _PrintEnter(\"OleGetIconOfFile(%p,%p)\\n\", a0, a1);\n\n    HGLOBAL rv = 0;\n    __try {\n        rv = Real_OleGetIconOfFile(a0, a1);\n    } __finally {\n        _PrintExit(\"OleGetIconOfFile(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleInitialize(LPVOID a0)\n{\n    _PrintEnter(\"OleInitialize(%p)\\n\", a0);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleInitialize(a0);\n    } __finally {\n        _PrintExit(\"OleInitialize() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleIsCurrentClipboard(IDataObject* a0)\n{\n    _PrintEnter(\"OleIsCurrentClipboard(%p)\\n\", a0);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleIsCurrentClipboard(a0);\n    } __finally {\n        _PrintExit(\"OleIsCurrentClipboard() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_OleIsRunning(IOleObject* a0)\n{\n    _PrintEnter(\"OleIsRunning(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_OleIsRunning(a0);\n    } __finally {\n        _PrintExit(\"OleIsRunning() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleLoad(LPSTORAGE a0,\n                               CONST IID& a1,\n                               LPOLECLIENTSITE a2,\n                               LPVOID* a3)\n{\n    _PrintEnter(\"OleLoad(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleLoad(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"OleLoad(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleLoadFromStream(LPSTREAM a0,\n                                         CONST IID& a1,\n                                         LPVOID* a2)\n{\n    _PrintEnter(\"OleLoadFromStream(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleLoadFromStream(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OleLoadFromStream(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleLockRunning(LPUNKNOWN a0,\n                                      BOOL a1,\n                                      BOOL a2)\n{\n    _PrintEnter(\"OleLockRunning(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleLockRunning(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OleLockRunning(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHGLOBAL __stdcall Mine_OleMetafilePictFromIconAndLabel(HICON a0,\n                                                       LPOLESTR a1,\n                                                       LPOLESTR a2,\n                                                       UINT a3)\n{\n    _PrintEnter(\"OleMetafilePictFromIconAndLabel(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HGLOBAL rv = 0;\n    __try {\n        rv = Real_OleMetafilePictFromIconAndLabel(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"OleMetafilePictFromIconAndLabel(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleNoteObjectVisible(LPUNKNOWN a0,\n                                            BOOL a1)\n{\n    _PrintEnter(\"OleNoteObjectVisible(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleNoteObjectVisible(a0, a1);\n    } __finally {\n        _PrintExit(\"OleNoteObjectVisible(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleQueryCreateFromData(IDataObject* a0)\n{\n    _PrintEnter(\"OleQueryCreateFromData(%p)\\n\", a0);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleQueryCreateFromData(a0);\n    } __finally {\n        _PrintExit(\"OleQueryCreateFromData() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleQueryLinkFromData(IDataObject* a0)\n{\n    _PrintEnter(\"OleQueryLinkFromData(%p)\\n\", a0);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleQueryLinkFromData(a0);\n    } __finally {\n        _PrintExit(\"OleQueryLinkFromData() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleRegEnumFormatEtc(CONST IID& a0,\n                                           DWORD a1,\n                                           IEnumFORMATETC** a2)\n{\n    _PrintEnter(\"OleRegEnumFormatEtc(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleRegEnumFormatEtc(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OleRegEnumFormatEtc(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleRegEnumVerbs(CONST IID& a0,\n                                       IEnumOLEVERB** a1)\n{\n    _PrintEnter(\"OleRegEnumVerbs(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleRegEnumVerbs(a0, a1);\n    } __finally {\n        _PrintExit(\"OleRegEnumVerbs(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleRegGetMiscStatus(CONST IID& a0,\n                                           DWORD a1,\n                                           DWORD* a2)\n{\n    _PrintEnter(\"OleRegGetMiscStatus(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleRegGetMiscStatus(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OleRegGetMiscStatus(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleRegGetUserType(CONST IID& a0,\n                                         DWORD a1,\n                                         LPOLESTR* a2)\n{\n    _PrintEnter(\"OleRegGetUserType(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleRegGetUserType(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OleRegGetUserType(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleRun(LPUNKNOWN a0)\n{\n    _PrintEnter(\"OleRun(%p)\\n\", a0);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleRun(a0);\n    } __finally {\n        _PrintExit(\"OleRun() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleSave(LPPERSISTSTORAGE a0,\n                               LPSTORAGE a1,\n                               BOOL a2)\n{\n    _PrintEnter(\"OleSave(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleSave(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OleSave(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleSaveToStream(IPersistStream* a0,\n                                       LPSTREAM a1)\n{\n    _PrintEnter(\"OleSaveToStream(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleSaveToStream(a0, a1);\n    } __finally {\n        _PrintExit(\"OleSaveToStream(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleSetAutoConvert(CONST IID& a0,\n                                         CONST IID& a1)\n{\n    _PrintEnter(\"OleSetAutoConvert(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleSetAutoConvert(a0, a1);\n    } __finally {\n        _PrintExit(\"OleSetAutoConvert(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleSetClipboard(IDataObject* a0)\n{\n    _PrintEnter(\"OleSetClipboard(%p)\\n\", a0);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleSetClipboard(a0);\n    } __finally {\n        _PrintExit(\"OleSetClipboard() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleSetContainedObject(LPUNKNOWN a0,\n                                             BOOL a1)\n{\n    _PrintEnter(\"OleSetContainedObject(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleSetContainedObject(a0, a1);\n    } __finally {\n        _PrintExit(\"OleSetContainedObject(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleSetMenuDescriptor(HOLEMENU a0,\n                                            HWND a1,\n                                            HWND a2,\n                                            LPOLEINPLACEFRAME a3,\n                                            LPOLEINPLACEACTIVEOBJECT a4)\n{\n    _PrintEnter(\"OleSetMenuDescriptor(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleSetMenuDescriptor(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"OleSetMenuDescriptor(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_OleTranslateAccelerator(LPOLEINPLACEFRAME a0,\n                                               LPOLEINPLACEFRAMEINFO a1,\n                                               LPMSG a2)\n{\n    _PrintEnter(\"OleTranslateAccelerator(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_OleTranslateAccelerator(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OleTranslateAccelerator(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nvoid __stdcall Mine_OleUninitialize(void)\n{\n    _PrintEnter(\"OleUninitialize()\\n\");\n\n    __try {\n        Real_OleUninitialize();\n    } __finally {\n        _PrintExit(\"OleUninitialize() ->\\n\");\n    };\n}\n\nBOOL __stdcall Mine_OpenClipboard(HWND a0)\n{\n    _PrintEnter(\"OpenClipboard(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_OpenClipboard(a0);\n    } __finally {\n        _PrintExit(\"OpenClipboard() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\n#if _MSC_VER < 1300\nHDESK __stdcall Mine_OpenDesktopA(LPSTR a0,\n                                  DWORD a1,\n                                  BOOL a2,\n                                  ACCESS_MASK a3)\n#else\nHDESK __stdcall Mine_OpenDesktopA(LPCSTR a0,\n                                  DWORD a1,\n                                  BOOL a2,\n                                  ACCESS_MASK a3)\n#endif\n{\n    _PrintEnter(\"OpenDesktopA(%hs,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HDESK rv = 0;\n    __try {\n        rv = Real_OpenDesktopA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"OpenDesktopA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\n#if _MSC_VER < 1300\nHDESK __stdcall Mine_OpenDesktopW(LPWSTR a0,\n                                  DWORD a1,\n                                  BOOL a2,\n                                  ACCESS_MASK a3)\n#else\nHDESK __stdcall Mine_OpenDesktopW(LPCWSTR a0,\n                                  DWORD a1,\n                                  BOOL a2,\n                                  ACCESS_MASK a3)\n#endif\n{\n    _PrintEnter(\"OpenDesktopW(%ls,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HDESK rv = 0;\n    __try {\n        rv = Real_OpenDesktopW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"OpenDesktopW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_OpenEventA(DWORD a0,\n                                 BOOL a1,\n                                 LPCSTR a2)\n{\n    _PrintEnter(\"OpenEventA(%p,%p,%hs)\\n\", a0, a1, a2);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_OpenEventA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OpenEventA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_OpenEventW(DWORD a0,\n                                 BOOL a1,\n                                 LPCWSTR a2)\n{\n    _PrintEnter(\"OpenEventW(%p,%p,%ls)\\n\", a0, a1, a2);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_OpenEventW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OpenEventW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHFILE __stdcall Mine_OpenFile(LPCSTR a0,\n                              LPOFSTRUCT a1,\n                              UINT a2)\n{\n    _PrintEnter(\"OpenFile(%hs,%p,%p)\\n\", a0, a1, a2);\n\n    HFILE rv = 0;\n    __try {\n        rv = Real_OpenFile(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OpenFile(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_OpenFileMappingA(DWORD a0,\n                                       BOOL a1,\n                                       LPCSTR a2)\n{\n    _PrintEnter(\"OpenFileMappingA(%p,%p,%hs)\\n\", a0, a1, a2);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_OpenFileMappingA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OpenFileMappingA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_OpenFileMappingW(DWORD a0,\n                                       BOOL a1,\n                                       LPCWSTR a2)\n{\n    _PrintEnter(\"OpenFileMappingW(%p,%p,%ls)\\n\", a0, a1, a2);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_OpenFileMappingW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OpenFileMappingW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_OpenIcon(HWND a0)\n{\n    _PrintEnter(\"OpenIcon(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_OpenIcon(a0);\n    } __finally {\n        _PrintExit(\"OpenIcon() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHDESK __stdcall Mine_OpenInputDesktop(DWORD a0,\n                                      BOOL a1,\n                                      ACCESS_MASK a2)\n{\n    _PrintEnter(\"OpenInputDesktop(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HDESK rv = 0;\n    __try {\n        rv = Real_OpenInputDesktop(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OpenInputDesktop(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_OpenMutexA(DWORD a0,\n                                 BOOL a1,\n                                 LPCSTR a2)\n{\n    _PrintEnter(\"OpenMutexA(%p,%p,%hs)\\n\", a0, a1, a2);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_OpenMutexA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OpenMutexA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_OpenMutexW(DWORD a0,\n                                 BOOL a1,\n                                 LPCWSTR a2)\n{\n    _PrintEnter(\"OpenMutexW(%p,%p,%ls)\\n\", a0, a1, a2);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_OpenMutexW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OpenMutexW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_OpenProcess(DWORD a0,\n                                  BOOL a1,\n                                  DWORD pid)\n{\n    _PrintEnter(\"OpenProcess(%p,%p,pid=%d)\\n\", a0, a1, pid);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_OpenProcess(a0, a1, pid);\n    } __finally {\n        _PrintExit(\"OpenProcess(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_OpenProcessToken(__in   HANDLE ProcessHandle,\n                                     __in   DWORD DesiredAccess,\n                                     __out  PHANDLE TokenHandle\n                                    )\n{\n    _PrintEnter(\"OpenProcessToken(%p,%p,%p)\\n\",\n                ProcessHandle,\n                DesiredAccess,\n                TokenHandle);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_OpenProcessToken(ProcessHandle,\n                                   DesiredAccess,\n                                   TokenHandle);\n\n    } __finally {\n        _PrintExit(\"OpenProcessToken(,,%p) -> %p\\n\",\n                   TokenHandle != NULL ? *TokenHandle : 0,\n                   rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_OpenSemaphoreA(DWORD a0,\n                                     BOOL a1,\n                                     LPCSTR a2)\n{\n    _PrintEnter(\"OpenSemaphoreA(%p,%p,%hs)\\n\", a0, a1, a2);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_OpenSemaphoreA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OpenSemaphoreA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_OpenSemaphoreW(DWORD a0,\n                                     BOOL a1,\n                                     LPCWSTR a2)\n{\n    _PrintEnter(\"OpenSemaphoreW(%p,%p,%ls)\\n\", a0, a1, a2);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_OpenSemaphoreW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OpenSemaphoreW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_OpenWaitableTimerA(DWORD a0,\n                                         BOOL a1,\n                                         LPCSTR a2)\n{\n    _PrintEnter(\"OpenWaitableTimerA(%p,%p,%hs)\\n\", a0, a1, a2);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_OpenWaitableTimerA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OpenWaitableTimerA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_OpenWaitableTimerW(DWORD a0,\n                                         BOOL a1,\n                                         LPCWSTR a2)\n{\n    _PrintEnter(\"OpenWaitableTimerW(%p,%p,%ls)\\n\", a0, a1, a2);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_OpenWaitableTimerW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OpenWaitableTimerW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\n#if _MSC_VER < 1300\nHWINSTA __stdcall Mine_OpenWindowStationA(LPSTR a0,\n                                          BOOL a1,\n                                          ACCESS_MASK a2)\n#else\nHWINSTA __stdcall Mine_OpenWindowStationA(LPCSTR a0,\n                                          BOOL a1,\n                                          ACCESS_MASK a2)\n#endif\n{\n    _PrintEnter(\"OpenWindowStationA(%hs,%p,%p)\\n\", a0, a1, a2);\n\n    HWINSTA rv = 0;\n    __try {\n        rv = Real_OpenWindowStationA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OpenWindowStationA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\n#if _MSC_VER < 1300\nHWINSTA __stdcall Mine_OpenWindowStationW(LPWSTR a0,\n                                          BOOL a1,\n                                          ACCESS_MASK a2)\n#else\nHWINSTA __stdcall Mine_OpenWindowStationW(LPCWSTR a0,\n                                          BOOL a1,\n                                          ACCESS_MASK a2)\n#endif\n{\n    _PrintEnter(\"OpenWindowStationW(%ls,%p,%p)\\n\", a0, a1, a2);\n\n    HWINSTA rv = 0;\n    __try {\n        rv = Real_OpenWindowStationW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OpenWindowStationW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nvoid __stdcall Mine_OutputDebugStringA(LPCSTR a0)\n{\n    _PrintEnter(\"OutputDebugStringA(%hs)\\n\", a0);\n\n    __try {\n        Real_OutputDebugStringA(a0);\n    } __finally {\n        _PrintExit(\"OutputDebugStringA() ->\\n\");\n    };\n}\n\nvoid __stdcall Mine_OutputDebugStringW(LPCWSTR a0)\n{\n    _PrintEnter(\"OutputDebugStringW(%ls)\\n\", a0);\n\n    __try {\n        Real_OutputDebugStringW(a0);\n    } __finally {\n        _PrintExit(\"OutputDebugStringW() ->\\n\");\n    };\n}\n\nLPARAM __stdcall Mine_PackDDElParam(UINT a0,\n                                    UINT_PTR a1,\n                                    UINT_PTR a2)\n{\n    _PrintEnter(\"PackDDElParam(%p,%p,%p)\\n\", a0, a1, a2);\n\n    LPARAM rv = 0;\n    __try {\n        rv = Real_PackDDElParam(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"PackDDElParam(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PaintDesktop(HDC a0)\n{\n    _PrintEnter(\"PaintDesktop(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PaintDesktop(a0);\n    } __finally {\n        _PrintExit(\"PaintDesktop() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PaintRgn(HDC a0,\n                             HRGN a1)\n{\n    _PrintEnter(\"PaintRgn(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PaintRgn(a0, a1);\n    } __finally {\n        _PrintExit(\"PaintRgn(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PatBlt(HDC a0,\n                           int a1,\n                           int a2,\n                           int a3,\n                           int a4,\n                           DWORD a5)\n{\n    _PrintEnter(\"PatBlt(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PatBlt(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"PatBlt(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRGN __stdcall Mine_PathToRegion(HDC a0)\n{\n    _PrintEnter(\"PathToRegion(%p)\\n\", a0);\n\n    HRGN rv = 0;\n    __try {\n        rv = Real_PathToRegion(a0);\n    } __finally {\n        _PrintExit(\"PathToRegion() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PeekConsoleInputA(HANDLE a0,\n                                      PINPUT_RECORD a1,\n                                      DWORD a2,\n                                      LPDWORD a3)\n{\n    _PrintEnter(\"PeekConsoleInputA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PeekConsoleInputA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"PeekConsoleInputA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PeekConsoleInputW(HANDLE a0,\n                                      PINPUT_RECORD a1,\n                                      DWORD a2,\n                                      LPDWORD a3)\n{\n    _PrintEnter(\"PeekConsoleInputW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PeekConsoleInputW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"PeekConsoleInputW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PeekMessageA(LPMSG a0,\n                                 HWND a1,\n                                 UINT a2,\n                                 UINT a3,\n                                 UINT a4)\n{\n    _PrintEnter(\"PeekMessageA(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PeekMessageA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"PeekMessageA(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PeekMessageW(LPMSG a0,\n                                 HWND a1,\n                                 UINT a2,\n                                 UINT a3,\n                                 UINT a4)\n{\n    _PrintEnter(\"PeekMessageW(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PeekMessageW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"PeekMessageW(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PeekNamedPipe(HANDLE a0,\n                                  LPVOID a1,\n                                  DWORD a2,\n                                  LPDWORD a3,\n                                  LPDWORD a4,\n                                  LPDWORD a5)\n{\n    _PrintEnter(\"PeekNamedPipe(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PeekNamedPipe(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"PeekNamedPipe(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_Pie(HDC a0,\n                        int a1,\n                        int a2,\n                        int a3,\n                        int a4,\n                        int a5,\n                        int a6,\n                        int a7,\n                        int a8)\n{\n    _PrintEnter(\"Pie(%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_Pie(a0, a1, a2, a3, a4, a5, a6, a7, a8);\n    } __finally {\n        _PrintExit(\"Pie(,,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PlayEnhMetaFile(HDC a0,\n                                    HENHMETAFILE a1,\n                                    RECT* a2)\n{\n    _PrintEnter(\"PlayEnhMetaFile(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PlayEnhMetaFile(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"PlayEnhMetaFile(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PlayEnhMetaFileRecord(HDC a0,\n                                          LPHANDLETABLE a1,\n                                          ENHMETARECORD* a2,\n                                          UINT a3)\n{\n    _PrintEnter(\"PlayEnhMetaFileRecord(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PlayEnhMetaFileRecord(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"PlayEnhMetaFileRecord(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PlayMetaFile(HDC a0,\n                                 HMETAFILE a1)\n{\n    _PrintEnter(\"PlayMetaFile(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PlayMetaFile(a0, a1);\n    } __finally {\n        _PrintExit(\"PlayMetaFile(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PlayMetaFileRecord(HDC a0,\n                                       LPHANDLETABLE a1,\n                                       LPMETARECORD a2,\n                                       UINT a3)\n{\n    _PrintEnter(\"PlayMetaFileRecord(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PlayMetaFileRecord(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"PlayMetaFileRecord(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PlgBlt(HDC a0,\n                           POINT* a1,\n                           HDC a2,\n                           int a3,\n                           int a4,\n                           int a5,\n                           int a6,\n                           HBITMAP a7,\n                           int a8,\n                           int a9)\n{\n    _PrintEnter(\"PlgBlt(%p,%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PlgBlt(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);\n    } __finally {\n        _PrintExit(\"PlgBlt(,,,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PolyBezier(HDC a0,\n                               POINT* a1,\n                               DWORD a2)\n{\n    _PrintEnter(\"PolyBezier(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PolyBezier(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"PolyBezier(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PolyBezierTo(HDC a0,\n                                 POINT* a1,\n                                 DWORD a2)\n{\n    _PrintEnter(\"PolyBezierTo(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PolyBezierTo(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"PolyBezierTo(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PolyDraw(HDC a0,\n                             POINT* a1,\n                             BYTE* a2,\n                             int a3)\n{\n    _PrintEnter(\"PolyDraw(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PolyDraw(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"PolyDraw(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PolyPolygon(HDC a0,\n                                POINT* a1,\n                                INT* a2,\n                                int a3)\n{\n    _PrintEnter(\"PolyPolygon(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PolyPolygon(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"PolyPolygon(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PolyPolyline(HDC a0,\n                                 POINT* a1,\n                                 DWORD* a2,\n                                 DWORD a3)\n{\n    _PrintEnter(\"PolyPolyline(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PolyPolyline(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"PolyPolyline(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PolyTextOutA(HDC a0,\n                                 POLYTEXTA* a1,\n                                 int a2)\n{\n    _PrintEnter(\"PolyTextOutA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PolyTextOutA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"PolyTextOutA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PolyTextOutW(HDC a0,\n                                 POLYTEXTW* a1,\n                                 int a2)\n{\n    _PrintEnter(\"PolyTextOutW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PolyTextOutW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"PolyTextOutW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_Polygon(HDC a0,\n                            POINT* a1,\n                            int a2)\n{\n    _PrintEnter(\"Polygon(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_Polygon(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"Polygon(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_Polyline(HDC a0,\n                             POINT* a1,\n                             int a2)\n{\n    _PrintEnter(\"Polyline(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_Polyline(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"Polyline(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PolylineTo(HDC a0,\n                               POINT* a1,\n                               DWORD a2)\n{\n    _PrintEnter(\"PolylineTo(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PolylineTo(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"PolylineTo(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PostMessageA(HWND a0,\n                                 UINT a1,\n                                 WPARAM a2,\n                                 LPARAM a3)\n{\n    _PrintEnter(\"PostMessageA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PostMessageA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"PostMessageA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PostMessageW(HWND a0,\n                                 UINT a1,\n                                 WPARAM a2,\n                                 LPARAM a3)\n{\n    _PrintEnter(\"PostMessageW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PostMessageW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"PostMessageW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PostQueuedCompletionStatus(HANDLE a0,\n                                               DWORD a1,\n                                               ULONG_PTR a2,\n                                               LPOVERLAPPED a3)\n{\n    _PrintEnter(\"PostQueuedCompletionStatus(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PostQueuedCompletionStatus(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"PostQueuedCompletionStatus(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nvoid __stdcall Mine_PostQuitMessage(int a0)\n{\n    _PrintEnter(\"PostQuitMessage(%p)\\n\", a0);\n\n    __try {\n        Real_PostQuitMessage(a0);\n    } __finally {\n        _PrintExit(\"PostQuitMessage() ->\\n\");\n    };\n}\n\nBOOL __stdcall Mine_PostThreadMessageA(DWORD a0,\n                                       UINT a1,\n                                       WPARAM a2,\n                                       LPARAM a3)\n{\n    _PrintEnter(\"PostThreadMessageA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PostThreadMessageA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"PostThreadMessageA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PostThreadMessageW(DWORD a0,\n                                       UINT a1,\n                                       WPARAM a2,\n                                       LPARAM a3)\n{\n    _PrintEnter(\"PostThreadMessageW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PostThreadMessageW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"PostThreadMessageW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_PrepareTape(HANDLE a0,\n                                 DWORD a1,\n                                 BOOL a2)\n{\n    _PrintEnter(\"PrepareTape(%p,%p,%p)\\n\", a0, a1, a2);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_PrepareTape(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"PrepareTape(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_ProgIDFromCLSID(CONST IID& a0,\n                                       LPOLESTR* a1)\n{\n    _PrintEnter(\"ProgIDFromCLSID(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_ProgIDFromCLSID(a0, a1);\n    } __finally {\n        _PrintExit(\"ProgIDFromCLSID(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_PropVariantClear(PROPVARIANT* a0)\n{\n    _PrintEnter(\"PropVariantClear(%p)\\n\", a0);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_PropVariantClear(a0);\n    } __finally {\n        _PrintExit(\"PropVariantClear() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_PropVariantCopy(PROPVARIANT* a0,\n                                       PROPVARIANT* a1)\n{\n    _PrintEnter(\"PropVariantCopy(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_PropVariantCopy(a0, a1);\n    } __finally {\n        _PrintExit(\"PropVariantCopy(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PtInRect(RECT* a0,\n                             POINT a1)\n{\n    _PrintEnter(\"PtInRect(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PtInRect(a0, a1);\n    } __finally {\n        _PrintExit(\"PtInRect(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PtInRegion(HRGN a0,\n                               int a1,\n                               int a2)\n{\n    _PrintEnter(\"PtInRegion(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PtInRegion(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"PtInRegion(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PtVisible(HDC a0,\n                              int a1,\n                              int a2)\n{\n    _PrintEnter(\"PtVisible(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PtVisible(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"PtVisible(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PulseEvent(HANDLE a0)\n{\n    _PrintEnter(\"PulseEvent(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PulseEvent(a0);\n    } __finally {\n        _PrintExit(\"PulseEvent() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_PurgeComm(HANDLE a0,\n                              DWORD a1)\n{\n    _PrintEnter(\"PurgeComm(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PurgeComm(a0, a1);\n    } __finally {\n        _PrintExit(\"PurgeComm(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_QueryDosDeviceA(LPCSTR a0,\n                                     LPSTR a1,\n                                     DWORD a2)\n{\n    _PrintEnter(\"QueryDosDeviceA(%hs,%p,%p)\\n\", a0, a1, a2);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_QueryDosDeviceA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"QueryDosDeviceA(,%hs,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_QueryDosDeviceW(LPCWSTR a0,\n                                     LPWSTR a1,\n                                     DWORD a2)\n{\n    _PrintEnter(\"QueryDosDeviceW(%ls,%p,%p)\\n\", a0, a1, a2);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_QueryDosDeviceW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"QueryDosDeviceW(,%ls,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_QueryPerformanceCounter(LARGE_INTEGER* a0)\n{\n    _PrintEnter(\"QueryPerformanceCounter(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_QueryPerformanceCounter(a0);\n    } __finally {\n        _PrintExit(\"QueryPerformanceCounter() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_QueryPerformanceFrequency(LARGE_INTEGER* a0)\n{\n    _PrintEnter(\"QueryPerformanceFrequency(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_QueryPerformanceFrequency(a0);\n    } __finally {\n        _PrintExit(\"QueryPerformanceFrequency() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_QueueUserAPC(PAPCFUNC a0,\n                                  HANDLE a1,\n                                  ULONG_PTR a2)\n{\n    _PrintEnter(\"QueueUserAPC(%p,%p,%p)\\n\", a0, a1, a2);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_QueueUserAPC(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"QueueUserAPC(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nvoid __stdcall Mine_RaiseException(DWORD a0,\n                                   DWORD a1,\n                                   DWORD a2,\n                                   ULONG_PTR* a3)\n{\n    _PrintEnter(\"RaiseException(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    __try {\n        Real_RaiseException(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"RaiseException(,,,) ->\\n\");\n    };\n}\n\nHRESULT __stdcall Mine_ReadClassStg(LPSTORAGE a0,\n                                    CLSID* a1)\n{\n    _PrintEnter(\"ReadClassStg(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_ReadClassStg(a0, a1);\n    } __finally {\n        _PrintExit(\"ReadClassStg(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_ReadClassStm(LPSTREAM a0,\n                                    CLSID* a1)\n{\n    _PrintEnter(\"ReadClassStm(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_ReadClassStm(a0, a1);\n    } __finally {\n        _PrintExit(\"ReadClassStm(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ReadConsoleA(\n                                 HANDLE a0,\n                                 LPVOID a1,\n                                 DWORD a2,\n                                 LPDWORD a3,\n#ifdef ENABLE_INSERT_MODE\n                                 PCONSOLE_READCONSOLE_CONTROL a4\n#else\n                                 LPVOID a4\n#endif\n                                )\n{\n    _PrintEnter(\"ReadConsoleA(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ReadConsoleA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"ReadConsoleA(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ReadConsoleInputA(HANDLE a0,\n                                      PINPUT_RECORD a1,\n                                      DWORD a2,\n                                      LPDWORD a3)\n{\n    _PrintEnter(\"ReadConsoleInputA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ReadConsoleInputA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"ReadConsoleInputA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ReadConsoleInputW(HANDLE a0,\n                                      PINPUT_RECORD a1,\n                                      DWORD a2,\n                                      LPDWORD a3)\n{\n    _PrintEnter(\"ReadConsoleInputW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ReadConsoleInputW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"ReadConsoleInputW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ReadConsoleOutputA(HANDLE a0,\n                                       PCHAR_INFO a1,\n                                       COORD a2,\n                                       COORD a3,\n                                       PSMALL_RECT a4)\n{\n    _PrintEnter(\"ReadConsoleOutputA(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ReadConsoleOutputA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"ReadConsoleOutputA(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ReadConsoleOutputAttribute(HANDLE a0,\n                                               LPWORD a1,\n                                               DWORD a2,\n                                               COORD a3,\n                                               LPDWORD a4)\n{\n    _PrintEnter(\"ReadConsoleOutputAttribute(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ReadConsoleOutputAttribute(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"ReadConsoleOutputAttribute(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ReadConsoleOutputCharacterA(HANDLE a0,\n                                                LPSTR a1,\n                                                DWORD a2,\n                                                COORD a3,\n                                                LPDWORD a4)\n{\n    _PrintEnter(\"ReadConsoleOutputCharacterA(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ReadConsoleOutputCharacterA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"ReadConsoleOutputCharacterA(,%hs,,,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ReadConsoleOutputCharacterW(HANDLE a0,\n                                                LPWSTR a1,\n                                                DWORD a2,\n                                                COORD a3,\n                                                LPDWORD a4)\n{\n    _PrintEnter(\"ReadConsoleOutputCharacterW(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ReadConsoleOutputCharacterW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"ReadConsoleOutputCharacterW(,%ls,,,) -> %p\\n\", a1, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ReadConsoleOutputW(HANDLE a0,\n                                       PCHAR_INFO a1,\n                                       COORD a2,\n                                       COORD a3,\n                                       PSMALL_RECT a4)\n{\n    _PrintEnter(\"ReadConsoleOutputW(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ReadConsoleOutputW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"ReadConsoleOutputW(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ReadConsoleW(\n                                 HANDLE a0,\n                                 LPVOID a1,\n                                 DWORD a2,\n                                 LPDWORD a3,\n#ifdef ENABLE_INSERT_MODE\n                                 PCONSOLE_READCONSOLE_CONTROL a4\n#else\n                                 LPVOID a4\n#endif\n                                )\n{\n    _PrintEnter(\"ReadConsoleW(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ReadConsoleW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"ReadConsoleW(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ReadDirectoryChangesW(HANDLE a0,\n                                          LPVOID a1,\n                                          DWORD a2,\n                                          BOOL a3,\n                                          DWORD a4,\n                                          LPDWORD a5,\n                                          LPOVERLAPPED a6,\n                                          LPOVERLAPPED_COMPLETION_ROUTINE a7)\n{\n    _PrintEnter(\"ReadDirectoryChangesW(%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ReadDirectoryChangesW(a0, a1, a2, a3, a4, a5, a6, a7);\n    } __finally {\n        _PrintExit(\"ReadDirectoryChangesW(,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ReadFile(HANDLE a0,\n                             LPVOID a1,\n                             DWORD a2,\n                             LPDWORD a3,\n                             LPOVERLAPPED a4)\n{\n    _PrintEnter(\"ReadFile(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ReadFile(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"ReadFile(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ReadFileEx(HANDLE a0,\n                               LPVOID a1,\n                               DWORD a2,\n                               LPOVERLAPPED a3,\n                               LPOVERLAPPED_COMPLETION_ROUTINE a4)\n{\n    _PrintEnter(\"ReadFileEx(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ReadFileEx(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"ReadFileEx(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_ReadFmtUserTypeStg(LPSTORAGE a0,\n                                          CLIPFORMAT* a1,\n                                          LPOLESTR* a2)\n{\n    _PrintEnter(\"ReadFmtUserTypeStg(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_ReadFmtUserTypeStg(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"ReadFmtUserTypeStg(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ReadProcessMemory(HANDLE a0,\n                                      LPCVOID lpBase,\n                                      LPVOID lpBuf,\n                                      DWORD_PTR nSize,\n                                      PDWORD_PTR a4)\n{\n    _PrintEnter(\"ReadProcessMemory(%p,@%p..%p,%p,%p)\\n\",\n                a0, lpBase,\n                (PBYTE)lpBase + ((nSize > 0) ? nSize - 1 : 0),\n                lpBuf, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ReadProcessMemory(a0, lpBase, lpBuf, nSize, a4);\n    } __finally {\n        _PrintExit(\"ReadProcessMemory(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_RealizePalette(HDC a0)\n{\n    _PrintEnter(\"RealizePalette(%p)\\n\", a0);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_RealizePalette(a0);\n    } __finally {\n        _PrintExit(\"RealizePalette() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_RectInRegion(HRGN a0,\n                                 RECT* a1)\n{\n    _PrintEnter(\"RectInRegion(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_RectInRegion(a0, a1);\n    } __finally {\n        _PrintExit(\"RectInRegion(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_RectVisible(HDC a0,\n                                RECT* a1)\n{\n    _PrintEnter(\"RectVisible(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_RectVisible(a0, a1);\n    } __finally {\n        _PrintExit(\"RectVisible(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_Rectangle(HDC a0,\n                              int a1,\n                              int a2,\n                              int a3,\n                              int a4)\n{\n    _PrintEnter(\"Rectangle(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_Rectangle(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"Rectangle(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_RedrawWindow(HWND a0,\n                                 RECT* a1,\n                                 HRGN a2,\n                                 UINT a3)\n{\n    _PrintEnter(\"RedrawWindow(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_RedrawWindow(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"RedrawWindow(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nATOM __stdcall Mine_RegisterClassA(WNDCLASSA* a0)\n{\n    _PrintEnter(\"RegisterClassA(%p)\\n\", a0);\n\n    ATOM rv = 0;\n    __try {\n        rv = Real_RegisterClassA(a0);\n    } __finally {\n        _PrintExit(\"RegisterClassA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nATOM __stdcall Mine_RegisterClassExA(WNDCLASSEXA* a0)\n{\n    _PrintEnter(\"RegisterClassExA(%p)\\n\", a0);\n\n    ATOM rv = 0;\n    __try {\n        rv = Real_RegisterClassExA(a0);\n    } __finally {\n        _PrintExit(\"RegisterClassExA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nATOM __stdcall Mine_RegisterClassExW(WNDCLASSEXW* a0)\n{\n    _PrintEnter(\"RegisterClassExW(%p)\\n\", a0);\n\n    ATOM rv = 0;\n    __try {\n        rv = Real_RegisterClassExW(a0);\n    } __finally {\n        _PrintExit(\"RegisterClassExW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nATOM __stdcall Mine_RegisterClassW(WNDCLASSW* a0)\n{\n    _PrintEnter(\"RegisterClassW(%p)\\n\", a0);\n\n    ATOM rv = 0;\n    __try {\n        rv = Real_RegisterClassW(a0);\n    } __finally {\n        _PrintExit(\"RegisterClassW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_RegisterClipboardFormatA(LPCSTR a0)\n{\n    _PrintEnter(\"RegisterClipboardFormatA(%hs)\\n\", a0);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_RegisterClipboardFormatA(a0);\n    } __finally {\n        _PrintExit(\"RegisterClipboardFormatA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_RegisterClipboardFormatW(LPCWSTR a0)\n{\n    _PrintEnter(\"RegisterClipboardFormatW(%ls)\\n\", a0);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_RegisterClipboardFormatW(a0);\n    } __finally {\n        _PrintExit(\"RegisterClipboardFormatW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_RegisterDragDrop(HWND a0,\n                                        IDropTarget* a1)\n{\n    _PrintEnter(\"RegisterDragDrop(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_RegisterDragDrop(a0, a1);\n    } __finally {\n        _PrintExit(\"RegisterDragDrop(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_RegisterHotKey(HWND a0,\n                                   int a1,\n                                   UINT a2,\n                                   UINT a3)\n{\n    _PrintEnter(\"RegisterHotKey(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_RegisterHotKey(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"RegisterHotKey(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_RegisterWindowMessageA(LPCSTR a0)\n{\n    _PrintEnter(\"RegisterWindowMessageA(%hs)\\n\", a0);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_RegisterWindowMessageA(a0);\n    } __finally {\n        _PrintExit(\"RegisterWindowMessageA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_RegisterWindowMessageW(LPCWSTR a0)\n{\n    _PrintEnter(\"RegisterWindowMessageW(%ls)\\n\", a0);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_RegisterWindowMessageW(a0);\n    } __finally {\n        _PrintExit(\"RegisterWindowMessageW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ReleaseCapture(void)\n{\n    _PrintEnter(\"ReleaseCapture()\\n\");\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ReleaseCapture();\n    } __finally {\n        _PrintExit(\"ReleaseCapture() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_ReleaseDC(HWND a0,\n                             HDC a1)\n{\n    _PrintEnter(\"ReleaseDC(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_ReleaseDC(a0, a1);\n    } __finally {\n        _PrintExit(\"ReleaseDC(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ReleaseMutex(HANDLE a0)\n{\n    _PrintEnter(\"ReleaseMutex(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ReleaseMutex(a0);\n    } __finally {\n        _PrintExit(\"ReleaseMutex() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ReleaseSemaphore(HANDLE a0,\n                                     LONG a1,\n                                     LPLONG a2)\n{\n    _PrintEnter(\"ReleaseSemaphore(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ReleaseSemaphore(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"ReleaseSemaphore(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nvoid __stdcall Mine_ReleaseStgMedium(LPSTGMEDIUM a0)\n{\n    _PrintEnter(\"ReleaseStgMedium(%p)\\n\", a0);\n\n    __try {\n        Real_ReleaseStgMedium(a0);\n    } __finally {\n        _PrintExit(\"ReleaseStgMedium() ->\\n\");\n    };\n}\n\nBOOL __stdcall Mine_RemoveDirectoryA(LPCSTR a0)\n{\n    _PrintEnter(\"RemoveDirectoryA(%hs)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_RemoveDirectoryA(a0);\n    } __finally {\n        _PrintExit(\"RemoveDirectoryA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_RemoveDirectoryW(LPCWSTR a0)\n{\n    _PrintEnter(\"RemoveDirectoryW(%ls)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_RemoveDirectoryW(a0);\n    } __finally {\n        _PrintExit(\"RemoveDirectoryW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_RemoveFontResourceA(LPCSTR a0)\n{\n    _PrintEnter(\"RemoveFontResourceA(%hs)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_RemoveFontResourceA(a0);\n    } __finally {\n        _PrintExit(\"RemoveFontResourceA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_RemoveFontResourceW(LPCWSTR a0)\n{\n    _PrintEnter(\"RemoveFontResourceW(%ls)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_RemoveFontResourceW(a0);\n    } __finally {\n        _PrintExit(\"RemoveFontResourceW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_RemoveMenu(HMENU a0,\n                               UINT a1,\n                               UINT a2)\n{\n    _PrintEnter(\"RemoveMenu(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_RemoveMenu(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"RemoveMenu(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_RemovePropA(HWND a0,\n                                  LPCSTR a1)\n{\n    _PrintEnter(\"RemovePropA(%p,%hs)\\n\", a0, a1);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_RemovePropA(a0, a1);\n    } __finally {\n        _PrintExit(\"RemovePropA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_RemovePropW(HWND a0,\n                                  LPCWSTR a1)\n{\n    _PrintEnter(\"RemovePropW(%p,%ls)\\n\", a0, a1);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_RemovePropW(a0, a1);\n    } __finally {\n        _PrintExit(\"RemovePropW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ReplyMessage(LRESULT a0)\n{\n    _PrintEnter(\"ReplyMessage(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ReplyMessage(a0);\n    } __finally {\n        _PrintExit(\"ReplyMessage() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHDC __stdcall Mine_ResetDCA(HDC a0,\n                            CONST DEVMODEA* a1)\n{\n    _PrintEnter(\"ResetDCA(%p,%p)\\n\", a0, a1);\n\n    HDC rv = 0;\n    __try {\n        rv = Real_ResetDCA(a0, a1);\n    } __finally {\n        _PrintExit(\"ResetDCA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHDC __stdcall Mine_ResetDCW(HDC a0,\n                            CONST DEVMODEW* a1)\n{\n    _PrintEnter(\"ResetDCW(%p,%p)\\n\", a0, a1);\n\n    HDC rv = 0;\n    __try {\n        rv = Real_ResetDCW(a0, a1);\n    } __finally {\n        _PrintExit(\"ResetDCW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ResetEvent(HANDLE a0)\n{\n    _PrintEnter(\"ResetEvent(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ResetEvent(a0);\n    } __finally {\n        _PrintExit(\"ResetEvent() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ResizePalette(HPALETTE a0,\n                                  UINT a1)\n{\n    _PrintEnter(\"ResizePalette(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ResizePalette(a0, a1);\n    } __finally {\n        _PrintExit(\"ResizePalette(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_RestoreDC(HDC a0,\n                              int a1)\n{\n    _PrintEnter(\"RestoreDC(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_RestoreDC(a0, a1);\n    } __finally {\n        _PrintExit(\"RestoreDC(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_ResumeThread(HANDLE a0)\n{\n    _PrintEnter(\"ResumeThread(%p)\\n\", a0);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_ResumeThread(a0);\n    } __finally {\n        _PrintExit(\"ResumeThread() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLPARAM __stdcall Mine_ReuseDDElParam(LPARAM a0,\n                                     UINT a1,\n                                     UINT a2,\n                                     UINT_PTR a3,\n                                     UINT_PTR a4)\n{\n    _PrintEnter(\"ReuseDDElParam(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    LPARAM rv = 0;\n    __try {\n        rv = Real_ReuseDDElParam(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"ReuseDDElParam(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_RevokeDragDrop(HWND a0)\n{\n    _PrintEnter(\"RevokeDragDrop(%p)\\n\", a0);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_RevokeDragDrop(a0);\n    } __finally {\n        _PrintExit(\"RevokeDragDrop() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_RoundRect(HDC a0,\n                              int a1,\n                              int a2,\n                              int a3,\n                              int a4,\n                              int a5,\n                              int a6)\n{\n    _PrintEnter(\"RoundRect(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_RoundRect(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"RoundRect(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_SaveDC(HDC a0)\n{\n    _PrintEnter(\"SaveDC(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_SaveDC(a0);\n    } __finally {\n        _PrintExit(\"SaveDC() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ScaleViewportExtEx(HDC a0,\n                                       int a1,\n                                       int a2,\n                                       int a3,\n                                       int a4,\n                                       SIZE* a5)\n{\n    _PrintEnter(\"ScaleViewportExtEx(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ScaleViewportExtEx(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"ScaleViewportExtEx(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ScaleWindowExtEx(HDC a0,\n                                     int a1,\n                                     int a2,\n                                     int a3,\n                                     int a4,\n                                     SIZE* a5)\n{\n    _PrintEnter(\"ScaleWindowExtEx(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ScaleWindowExtEx(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"ScaleWindowExtEx(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ScreenToClient(HWND a0,\n                                   POINT* a1)\n{\n    _PrintEnter(\"ScreenToClient(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ScreenToClient(a0, a1);\n    } __finally {\n        _PrintExit(\"ScreenToClient(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ScrollConsoleScreenBufferA(HANDLE a0,\n                                               SMALL_RECT* a1,\n                                               SMALL_RECT* a2,\n                                               COORD a3,\n                                               CHAR_INFO* a4)\n{\n    _PrintEnter(\"ScrollConsoleScreenBufferA(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ScrollConsoleScreenBufferA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"ScrollConsoleScreenBufferA(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ScrollConsoleScreenBufferW(HANDLE a0,\n                                               SMALL_RECT* a1,\n                                               SMALL_RECT* a2,\n                                               COORD a3,\n                                               CHAR_INFO* a4)\n{\n    _PrintEnter(\"ScrollConsoleScreenBufferW(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ScrollConsoleScreenBufferW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"ScrollConsoleScreenBufferW(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ScrollDC(HDC a0,\n                             int a1,\n                             int a2,\n                             RECT* a3,\n                             RECT* a4,\n                             HRGN a5,\n                             LPRECT a6)\n{\n    _PrintEnter(\"ScrollDC(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ScrollDC(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"ScrollDC(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ScrollWindow(HWND a0,\n                                 int a1,\n                                 int a2,\n                                 RECT* a3,\n                                 RECT* a4)\n{\n    _PrintEnter(\"ScrollWindow(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ScrollWindow(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"ScrollWindow(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_ScrollWindowEx(HWND a0,\n                                  int a1,\n                                  int a2,\n                                  RECT* a3,\n                                  RECT* a4,\n                                  HRGN a5,\n                                  LPRECT a6,\n                                  UINT a7)\n{\n    _PrintEnter(\"ScrollWindowEx(%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7);\n\n    int rv = 0;\n    __try {\n        rv = Real_ScrollWindowEx(a0, a1, a2, a3, a4, a5, a6, a7);\n    } __finally {\n        _PrintExit(\"ScrollWindowEx(,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_SearchPathA(LPCSTR a0,\n                                 LPCSTR a1,\n                                 LPCSTR a2,\n                                 DWORD a3,\n                                 LPSTR a4,\n                                 LPSTR* a5)\n{\n    _PrintEnter(\"SearchPathA(%hs,%hs,%hs,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_SearchPathA(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"SearchPathA(,,,,%hs,) -> %p\\n\", a4, rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_SearchPathW(LPCWSTR a0,\n                                 LPCWSTR a1,\n                                 LPCWSTR a2,\n                                 DWORD a3,\n                                 LPWSTR a4,\n                                 LPWSTR* a5)\n{\n    _PrintEnter(\"SearchPathW(%ls,%ls,%ls,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_SearchPathW(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"SearchPathW(,,,,%ls,) -> %p\\n\", a4, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SelectClipPath(HDC a0,\n                                   int a1)\n{\n    _PrintEnter(\"SelectClipPath(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SelectClipPath(a0, a1);\n    } __finally {\n        _PrintExit(\"SelectClipPath(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_SelectClipRgn(HDC a0,\n                                 HRGN a1)\n{\n    _PrintEnter(\"SelectClipRgn(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_SelectClipRgn(a0, a1);\n    } __finally {\n        _PrintExit(\"SelectClipRgn(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHGDIOBJ __stdcall Mine_SelectObject(HDC a0,\n                                    HGDIOBJ a1)\n{\n    _PrintEnter(\"SelectObject(%p,%p)\\n\", a0, a1);\n\n    HGDIOBJ rv = 0;\n    __try {\n        rv = Real_SelectObject(a0, a1);\n    } __finally {\n        _PrintExit(\"SelectObject(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHPALETTE __stdcall Mine_SelectPalette(HDC a0,\n                                      HPALETTE a1,\n                                      BOOL a2)\n{\n    _PrintEnter(\"SelectPalette(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HPALETTE rv = 0;\n    __try {\n        rv = Real_SelectPalette(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SelectPalette(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLRESULT __stdcall Mine_SendDlgItemMessageA(HWND a0,\n                                           int a1,\n                                           UINT a2,\n                                           WPARAM a3,\n                                           LPARAM a4)\n{\n    _PrintEnter(\"SendDlgItemMessageA(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    LRESULT rv = 0;\n    __try {\n        rv = Real_SendDlgItemMessageA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"SendDlgItemMessageA(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLRESULT __stdcall Mine_SendDlgItemMessageW(HWND a0,\n                                           int a1,\n                                           UINT a2,\n                                           WPARAM a3,\n                                           LPARAM a4)\n{\n    _PrintEnter(\"SendDlgItemMessageW(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    LRESULT rv = 0;\n    __try {\n        rv = Real_SendDlgItemMessageW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"SendDlgItemMessageW(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLRESULT __stdcall Mine_SendMessageA(HWND a0,\n                                    UINT a1,\n                                    WPARAM a2,\n                                    LPARAM a3)\n{\n    _PrintEnter(\"SendMessageA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    LRESULT rv = 0;\n    __try {\n        rv = Real_SendMessageA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SendMessageA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SendMessageCallbackA(HWND a0,\n                                         UINT a1,\n                                         WPARAM a2,\n                                         LPARAM a3,\n                                         SENDASYNCPROC a4,\n                                         ULONG_PTR a5)\n{\n    _PrintEnter(\"SendMessageCallbackA(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SendMessageCallbackA(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"SendMessageCallbackA(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SendMessageCallbackW(HWND a0,\n                                         UINT a1,\n                                         WPARAM a2,\n                                         LPARAM a3,\n                                         SENDASYNCPROC a4,\n                                         ULONG_PTR a5)\n{\n    _PrintEnter(\"SendMessageCallbackW(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SendMessageCallbackW(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"SendMessageCallbackW(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLRESULT __stdcall Mine_SendMessageTimeoutA(HWND a0,\n                                           UINT a1,\n                                           WPARAM a2,\n                                           LPARAM a3,\n                                           UINT a4,\n                                           UINT a5,\n                                           PULONG_PTR a6)\n{\n    _PrintEnter(\"SendMessageTimeoutA(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    LRESULT rv = 0;\n    __try {\n        rv = Real_SendMessageTimeoutA(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"SendMessageTimeoutA(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLRESULT __stdcall Mine_SendMessageTimeoutW(HWND a0,\n                                           UINT a1,\n                                           WPARAM a2,\n                                           LPARAM a3,\n                                           UINT a4,\n                                           UINT a5,\n                                           PULONG_PTR a6)\n{\n    _PrintEnter(\"SendMessageTimeoutW(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    LRESULT rv = 0;\n    __try {\n        rv = Real_SendMessageTimeoutW(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"SendMessageTimeoutW(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLRESULT __stdcall Mine_SendMessageW(HWND a0,\n                                    UINT a1,\n                                    WPARAM a2,\n                                    LPARAM a3)\n{\n    _PrintEnter(\"SendMessageW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    LRESULT rv = 0;\n    __try {\n        rv = Real_SendMessageW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SendMessageW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SendNotifyMessageA(HWND a0,\n                                       UINT a1,\n                                       WPARAM a2,\n                                       LPARAM a3)\n{\n    _PrintEnter(\"SendNotifyMessageA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SendNotifyMessageA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SendNotifyMessageA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SendNotifyMessageW(HWND a0,\n                                       UINT a1,\n                                       WPARAM a2,\n                                       LPARAM a3)\n{\n    _PrintEnter(\"SendNotifyMessageW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SendNotifyMessageW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SendNotifyMessageW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_SetAbortProc(HDC a0,\n                                ABORTPROC a1)\n{\n    _PrintEnter(\"SetAbortProc(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_SetAbortProc(a0, a1);\n    } __finally {\n        _PrintExit(\"SetAbortProc(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_SetActiveWindow(HWND a0)\n{\n    _PrintEnter(\"SetActiveWindow(%p)\\n\", a0);\n\n    HWND rv = 0;\n    __try {\n        rv = Real_SetActiveWindow(a0);\n    } __finally {\n        _PrintExit(\"SetActiveWindow() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_SetArcDirection(HDC a0,\n                                   int a1)\n{\n    _PrintEnter(\"SetArcDirection(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_SetArcDirection(a0, a1);\n    } __finally {\n        _PrintExit(\"SetArcDirection(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLONG __stdcall Mine_SetBitmapBits(HBITMAP a0,\n                                  DWORD a1,\n                                  void* a2)\n{\n    _PrintEnter(\"SetBitmapBits(%p,%p,%p)\\n\", a0, a1, a2);\n\n    LONG rv = 0;\n    __try {\n        rv = Real_SetBitmapBits(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetBitmapBits(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetBitmapDimensionEx(HBITMAP a0,\n                                         int a1,\n                                         int a2,\n                                         SIZE* a3)\n{\n    _PrintEnter(\"SetBitmapDimensionEx(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetBitmapDimensionEx(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SetBitmapDimensionEx(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nCOLORREF __stdcall Mine_SetBkColor(HDC a0,\n                                   COLORREF a1)\n{\n    _PrintEnter(\"SetBkColor(%p,%p)\\n\", a0, a1);\n\n    COLORREF rv = 0;\n    __try {\n        rv = Real_SetBkColor(a0, a1);\n    } __finally {\n        _PrintExit(\"SetBkColor(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_SetBkMode(HDC a0,\n                             int a1)\n{\n    _PrintEnter(\"SetBkMode(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_SetBkMode(a0, a1);\n    } __finally {\n        _PrintExit(\"SetBkMode(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_SetBoundsRect(HDC a0,\n                                  RECT* a1,\n                                  UINT a2)\n{\n    _PrintEnter(\"SetBoundsRect(%p,%p,%p)\\n\", a0, a1, a2);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_SetBoundsRect(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetBoundsRect(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetBrushOrgEx(HDC a0,\n                                  int a1,\n                                  int a2,\n                                  POINT* a3)\n{\n    _PrintEnter(\"SetBrushOrgEx(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetBrushOrgEx(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SetBrushOrgEx(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_SetCapture(HWND a0)\n{\n    _PrintEnter(\"SetCapture(%p)\\n\", a0);\n\n    HWND rv = 0;\n    __try {\n        rv = Real_SetCapture(a0);\n    } __finally {\n        _PrintExit(\"SetCapture() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetCaretBlinkTime(UINT a0)\n{\n    _PrintEnter(\"SetCaretBlinkTime(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetCaretBlinkTime(a0);\n    } __finally {\n        _PrintExit(\"SetCaretBlinkTime() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetCaretPos(int a0,\n                                int a1)\n{\n    _PrintEnter(\"SetCaretPos(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetCaretPos(a0, a1);\n    } __finally {\n        _PrintExit(\"SetCaretPos(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_SetClassLongA(HWND a0,\n                                   int a1,\n                                   LONG a2)\n{\n    _PrintEnter(\"SetClassLongA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_SetClassLongA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetClassLongA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_SetClassLongW(HWND a0,\n                                   int a1,\n                                   LONG a2)\n{\n    _PrintEnter(\"SetClassLongW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_SetClassLongW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetClassLongW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nWORD __stdcall Mine_SetClassWord(HWND a0,\n                                 int a1,\n                                 WORD a2)\n{\n    _PrintEnter(\"SetClassWord(%p,%p,%p)\\n\", a0, a1, a2);\n\n    WORD rv = 0;\n    __try {\n        rv = Real_SetClassWord(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetClassWord(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_SetClipboardData(UINT a0,\n                                       HANDLE a1)\n{\n    _PrintEnter(\"SetClipboardData(%p,%p)\\n\", a0, a1);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_SetClipboardData(a0, a1);\n    } __finally {\n        _PrintExit(\"SetClipboardData(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_SetClipboardViewer(HWND a0)\n{\n    _PrintEnter(\"SetClipboardViewer(%p)\\n\", a0);\n\n    HWND rv = 0;\n    __try {\n        rv = Real_SetClipboardViewer(a0);\n    } __finally {\n        _PrintExit(\"SetClipboardViewer() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetColorAdjustment(HDC a0,\n                                       COLORADJUSTMENT* a1)\n{\n    _PrintEnter(\"SetColorAdjustment(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetColorAdjustment(a0, a1);\n    } __finally {\n        _PrintExit(\"SetColorAdjustment(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHCOLORSPACE __stdcall Mine_SetColorSpace(HDC a0,\n                                         HCOLORSPACE a1)\n{\n    _PrintEnter(\"SetColorSpace(%p,%p)\\n\", a0, a1);\n\n    HCOLORSPACE rv = 0;\n    __try {\n        rv = Real_SetColorSpace(a0, a1);\n    } __finally {\n        _PrintExit(\"SetColorSpace(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetCommBreak(HANDLE a0)\n{\n    _PrintEnter(\"SetCommBreak(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetCommBreak(a0);\n    } __finally {\n        _PrintExit(\"SetCommBreak() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetCommConfig(HANDLE a0,\n                                  LPCOMMCONFIG a1,\n                                  DWORD a2)\n{\n    _PrintEnter(\"SetCommConfig(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetCommConfig(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetCommConfig(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetCommMask(HANDLE a0,\n                                DWORD a1)\n{\n    _PrintEnter(\"SetCommMask(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetCommMask(a0, a1);\n    } __finally {\n        _PrintExit(\"SetCommMask(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetCommState(HANDLE a0,\n                                 LPDCB a1)\n{\n    _PrintEnter(\"SetCommState(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetCommState(a0, a1);\n    } __finally {\n        _PrintExit(\"SetCommState(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetCommTimeouts(HANDLE a0,\n                                    LPCOMMTIMEOUTS a1)\n{\n    _PrintEnter(\"SetCommTimeouts(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetCommTimeouts(a0, a1);\n    } __finally {\n        _PrintExit(\"SetCommTimeouts(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetComputerNameA(LPCSTR a0)\n{\n    _PrintEnter(\"SetComputerNameA(%hs)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetComputerNameA(a0);\n    } __finally {\n        _PrintExit(\"SetComputerNameA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetComputerNameW(LPCWSTR a0)\n{\n    _PrintEnter(\"SetComputerNameW(%ls)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetComputerNameW(a0);\n    } __finally {\n        _PrintExit(\"SetComputerNameW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetConsoleActiveScreenBuffer(HANDLE a0)\n{\n    _PrintEnter(\"SetConsoleActiveScreenBuffer(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetConsoleActiveScreenBuffer(a0);\n    } __finally {\n        _PrintExit(\"SetConsoleActiveScreenBuffer() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetConsoleCP(UINT a0)\n{\n    _PrintEnter(\"SetConsoleCP(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetConsoleCP(a0);\n    } __finally {\n        _PrintExit(\"SetConsoleCP() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetConsoleCtrlHandler(PHANDLER_ROUTINE a0,\n                                          BOOL a1)\n{\n    _PrintEnter(\"SetConsoleCtrlHandler(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetConsoleCtrlHandler(a0, a1);\n    } __finally {\n        _PrintExit(\"SetConsoleCtrlHandler(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetConsoleCursorInfo(HANDLE a0,\n                                         CONSOLE_CURSOR_INFO* a1)\n{\n    _PrintEnter(\"SetConsoleCursorInfo(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetConsoleCursorInfo(a0, a1);\n    } __finally {\n        _PrintExit(\"SetConsoleCursorInfo(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetConsoleCursorPosition(HANDLE a0,\n                                             COORD a1)\n{\n    _PrintEnter(\"SetConsoleCursorPosition(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetConsoleCursorPosition(a0, a1);\n    } __finally {\n        _PrintExit(\"SetConsoleCursorPosition(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetConsoleMode(HANDLE a0,\n                                   DWORD a1)\n{\n    _PrintEnter(\"SetConsoleMode(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetConsoleMode(a0, a1);\n    } __finally {\n        _PrintExit(\"SetConsoleMode(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetConsoleOutputCP(UINT a0)\n{\n    _PrintEnter(\"SetConsoleOutputCP(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetConsoleOutputCP(a0);\n    } __finally {\n        _PrintExit(\"SetConsoleOutputCP() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetConsoleScreenBufferSize(HANDLE a0,\n                                               COORD a1)\n{\n    _PrintEnter(\"SetConsoleScreenBufferSize(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetConsoleScreenBufferSize(a0, a1);\n    } __finally {\n        _PrintExit(\"SetConsoleScreenBufferSize(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetConsoleTextAttribute(HANDLE a0,\n                                            WORD a1)\n{\n    _PrintEnter(\"SetConsoleTextAttribute(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetConsoleTextAttribute(a0, a1);\n    } __finally {\n        _PrintExit(\"SetConsoleTextAttribute(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetConsoleTitleA(LPCSTR a0)\n{\n    _PrintEnter(\"SetConsoleTitleA(%hs)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetConsoleTitleA(a0);\n    } __finally {\n        _PrintExit(\"SetConsoleTitleA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetConsoleTitleW(LPCWSTR a0)\n{\n    _PrintEnter(\"SetConsoleTitleW(%ls)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetConsoleTitleW(a0);\n    } __finally {\n        _PrintExit(\"SetConsoleTitleW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetConsoleWindowInfo(HANDLE a0,\n                                         BOOL a1,\n                                         SMALL_RECT* a2)\n{\n    _PrintEnter(\"SetConsoleWindowInfo(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetConsoleWindowInfo(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetConsoleWindowInfo(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_SetConvertStg(LPSTORAGE a0,\n                                     BOOL a1)\n{\n    _PrintEnter(\"SetConvertStg(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_SetConvertStg(a0, a1);\n    } __finally {\n        _PrintExit(\"SetConvertStg(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetCurrentDirectoryA(LPCSTR a0)\n{\n    _PrintEnter(\"SetCurrentDirectoryA(%hs)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetCurrentDirectoryA(a0);\n    } __finally {\n        _PrintExit(\"SetCurrentDirectoryA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetCurrentDirectoryW(LPCWSTR a0)\n{\n    _PrintEnter(\"SetCurrentDirectoryW(%ls)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetCurrentDirectoryW(a0);\n    } __finally {\n        _PrintExit(\"SetCurrentDirectoryW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHCURSOR __stdcall Mine_SetCursor(HCURSOR a0)\n{\n    _PrintEnter(\"SetCursor(%p)\\n\", a0);\n\n    HCURSOR rv = 0;\n    __try {\n        rv = Real_SetCursor(a0);\n    } __finally {\n        _PrintExit(\"SetCursor() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetCursorPos(int a0,\n                                 int a1)\n{\n    _PrintEnter(\"SetCursorPos(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetCursorPos(a0, a1);\n    } __finally {\n        _PrintExit(\"SetCursorPos(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_SetDIBColorTable(HDC a0,\n                                     UINT a1,\n                                     UINT a2,\n                                     RGBQUAD* a3)\n{\n    _PrintEnter(\"SetDIBColorTable(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_SetDIBColorTable(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SetDIBColorTable(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_SetDIBits(HDC a0,\n                             HBITMAP a1,\n                             UINT a2,\n                             UINT a3,\n                             void* a4,\n                             BITMAPINFO* a5,\n                             UINT a6)\n{\n    _PrintEnter(\"SetDIBits(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    int rv = 0;\n    __try {\n        rv = Real_SetDIBits(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"SetDIBits(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_SetDIBitsToDevice(HDC a0,\n                                     int a1,\n                                     int a2,\n                                     DWORD a3,\n                                     DWORD a4,\n                                     int a5,\n                                     int a6,\n                                     UINT a7,\n                                     UINT a8,\n                                     void* a9,\n                                     BITMAPINFO* a10,\n                                     UINT a11)\n{\n    _PrintEnter(\"SetDIBitsToDevice(%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);\n\n    int rv = 0;\n    __try {\n        rv = Real_SetDIBitsToDevice(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);\n    } __finally {\n        _PrintExit(\"SetDIBitsToDevice(,,,,,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetDefaultCommConfigA(LPCSTR a0,\n                                          LPCOMMCONFIG a1,\n                                          DWORD a2)\n{\n    _PrintEnter(\"SetDefaultCommConfigA(%hs,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetDefaultCommConfigA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetDefaultCommConfigA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetDefaultCommConfigW(LPCWSTR a0,\n                                          LPCOMMCONFIG a1,\n                                          DWORD a2)\n{\n    _PrintEnter(\"SetDefaultCommConfigW(%ls,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetDefaultCommConfigW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetDefaultCommConfigW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetDeviceGammaRamp(HDC a0,\n                                       LPVOID a1)\n{\n    _PrintEnter(\"SetDeviceGammaRamp(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetDeviceGammaRamp(a0, a1);\n    } __finally {\n        _PrintExit(\"SetDeviceGammaRamp(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetDlgItemInt(HWND a0,\n                                  int a1,\n                                  UINT a2,\n                                  BOOL a3)\n{\n    _PrintEnter(\"SetDlgItemInt(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetDlgItemInt(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SetDlgItemInt(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetDlgItemTextA(HWND a0,\n                                    int a1,\n                                    LPCSTR a2)\n{\n    _PrintEnter(\"SetDlgItemTextA(%p,%p,%hs)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetDlgItemTextA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetDlgItemTextA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetDlgItemTextW(HWND a0,\n                                    int a1,\n                                    LPCWSTR a2)\n{\n    _PrintEnter(\"SetDlgItemTextW(%p,%p,%ls)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetDlgItemTextW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetDlgItemTextW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetDoubleClickTime(UINT a0)\n{\n    _PrintEnter(\"SetDoubleClickTime(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetDoubleClickTime(a0);\n    } __finally {\n        _PrintExit(\"SetDoubleClickTime() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetEndOfFile(HANDLE a0)\n{\n    _PrintEnter(\"SetEndOfFile(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetEndOfFile(a0);\n    } __finally {\n        _PrintExit(\"SetEndOfFile() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHENHMETAFILE __stdcall Mine_SetEnhMetaFileBits(UINT a0,\n                                               BYTE* a1)\n{\n    _PrintEnter(\"SetEnhMetaFileBits(%p,%p)\\n\", a0, a1);\n\n    HENHMETAFILE rv = 0;\n    __try {\n        rv = Real_SetEnhMetaFileBits(a0, a1);\n    } __finally {\n        _PrintExit(\"SetEnhMetaFileBits(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetEnvironmentVariableA(LPCSTR a0,\n                                            LPCSTR a1)\n{\n    _PrintEnter(\"SetEnvironmentVariableA(%hs,%hs)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetEnvironmentVariableA(a0, a1);\n    } __finally {\n        _PrintExit(\"SetEnvironmentVariableA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetEnvironmentVariableW(LPCWSTR a0,\n                                            LPCWSTR a1)\n{\n    _PrintEnter(\"SetEnvironmentVariableW(%ls,%ls)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetEnvironmentVariableW(a0, a1);\n    } __finally {\n        _PrintExit(\"SetEnvironmentVariableW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_SetErrorMode(UINT a0)\n{\n    _PrintEnter(\"SetErrorMode(%p)\\n\", a0);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_SetErrorMode(a0);\n    } __finally {\n        _PrintExit(\"SetErrorMode() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetEvent(HANDLE a0)\n{\n    _PrintEnter(\"SetEvent(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetEvent(a0);\n    } __finally {\n        _PrintExit(\"SetEvent() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nvoid __stdcall Mine_SetFileApisToANSI(void)\n{\n    _PrintEnter(\"SetFileApisToANSI()\\n\");\n\n    __try {\n        Real_SetFileApisToANSI();\n    } __finally {\n        _PrintExit(\"SetFileApisToANSI() ->\\n\");\n    };\n}\n\nvoid __stdcall Mine_SetFileApisToOEM(void)\n{\n    _PrintEnter(\"SetFileApisToOEM()\\n\");\n\n    __try {\n        Real_SetFileApisToOEM();\n    } __finally {\n        _PrintExit(\"SetFileApisToOEM() ->\\n\");\n    };\n}\n\nBOOL __stdcall Mine_SetFileAttributesA(LPCSTR a0,\n                                       DWORD a1)\n{\n    _PrintEnter(\"SetFileAttributesA(%hs,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetFileAttributesA(a0, a1);\n    } __finally {\n        _PrintExit(\"SetFileAttributesA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetFileAttributesW(LPCWSTR a0,\n                                       DWORD a1)\n{\n    _PrintEnter(\"SetFileAttributesW(%ls,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetFileAttributesW(a0, a1);\n    } __finally {\n        _PrintExit(\"SetFileAttributesW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_SetFilePointer(HANDLE a0,\n                                    LONG a1,\n                                    PLONG a2,\n                                    DWORD a3)\n{\n    _PrintEnter(\"SetFilePointer(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_SetFilePointer(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SetFilePointer(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetFileTime(HANDLE a0,\n                                FILETIME* a1,\n                                FILETIME* a2,\n                                FILETIME* a3)\n{\n    _PrintEnter(\"SetFileTime(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetFileTime(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SetFileTime(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_SetFocus(HWND a0)\n{\n    _PrintEnter(\"SetFocus(%p)\\n\", a0);\n\n    HWND rv = 0;\n    __try {\n        rv = Real_SetFocus(a0);\n    } __finally {\n        _PrintExit(\"SetFocus() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetForegroundWindow(HWND a0)\n{\n    _PrintEnter(\"SetForegroundWindow(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetForegroundWindow(a0);\n    } __finally {\n        _PrintExit(\"SetForegroundWindow() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_SetGraphicsMode(HDC a0,\n                                   int a1)\n{\n    _PrintEnter(\"SetGraphicsMode(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_SetGraphicsMode(a0, a1);\n    } __finally {\n        _PrintExit(\"SetGraphicsMode(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_SetHandleCount(UINT a0)\n{\n    _PrintEnter(\"SetHandleCount(%p)\\n\", a0);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_SetHandleCount(a0);\n    } __finally {\n        _PrintExit(\"SetHandleCount() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetHandleInformation(HANDLE a0,\n                                         DWORD a1,\n                                         DWORD a2)\n{\n    _PrintEnter(\"SetHandleInformation(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetHandleInformation(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetHandleInformation(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_SetICMMode(HDC a0,\n                              int a1)\n{\n    _PrintEnter(\"SetICMMode(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_SetICMMode(a0, a1);\n    } __finally {\n        _PrintExit(\"SetICMMode(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetICMProfileA(HDC a0,\n                                   LPSTR a1)\n{\n    _PrintEnter(\"SetICMProfileA(%p,%hs)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetICMProfileA(a0, a1);\n    } __finally {\n        _PrintExit(\"SetICMProfileA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetICMProfileW(HDC a0,\n                                   LPWSTR a1)\n{\n    _PrintEnter(\"SetICMProfileW(%p,%ls)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetICMProfileW(a0, a1);\n    } __finally {\n        _PrintExit(\"SetICMProfileW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetKeyboardState(LPBYTE a0)\n{\n    _PrintEnter(\"SetKeyboardState(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetKeyboardState(a0);\n    } __finally {\n        _PrintExit(\"SetKeyboardState() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetLocalTime(SYSTEMTIME* a0)\n{\n    _PrintEnter(\"SetLocalTime(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetLocalTime(a0);\n    } __finally {\n        _PrintExit(\"SetLocalTime() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetLocaleInfoA(LCID a0,\n                                   LCTYPE a1,\n                                   LPCSTR a2)\n{\n    _PrintEnter(\"SetLocaleInfoA(%p,%p,%hs)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetLocaleInfoA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetLocaleInfoA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetLocaleInfoW(LCID a0,\n                                   LCTYPE a1,\n                                   LPCWSTR a2)\n{\n    _PrintEnter(\"SetLocaleInfoW(%p,%p,%ls)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetLocaleInfoW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetLocaleInfoW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetMailslotInfo(HANDLE a0,\n                                    DWORD a1)\n{\n    _PrintEnter(\"SetMailslotInfo(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetMailslotInfo(a0, a1);\n    } __finally {\n        _PrintExit(\"SetMailslotInfo(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_SetMapMode(HDC a0,\n                              int a1)\n{\n    _PrintEnter(\"SetMapMode(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_SetMapMode(a0, a1);\n    } __finally {\n        _PrintExit(\"SetMapMode(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_SetMapperFlags(HDC a0,\n                                    DWORD a1)\n{\n    _PrintEnter(\"SetMapperFlags(%p,%p)\\n\", a0, a1);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_SetMapperFlags(a0, a1);\n    } __finally {\n        _PrintExit(\"SetMapperFlags(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetMenu(HWND a0,\n                            HMENU a1)\n{\n    _PrintEnter(\"SetMenu(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetMenu(a0, a1);\n    } __finally {\n        _PrintExit(\"SetMenu(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetMenuContextHelpId(HMENU a0,\n                                         DWORD a1)\n{\n    _PrintEnter(\"SetMenuContextHelpId(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetMenuContextHelpId(a0, a1);\n    } __finally {\n        _PrintExit(\"SetMenuContextHelpId(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetMenuDefaultItem(HMENU a0,\n                                       UINT a1,\n                                       UINT a2)\n{\n    _PrintEnter(\"SetMenuDefaultItem(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetMenuDefaultItem(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetMenuDefaultItem(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetMenuItemBitmaps(HMENU a0,\n                                       UINT a1,\n                                       UINT a2,\n                                       HBITMAP a3,\n                                       HBITMAP a4)\n{\n    _PrintEnter(\"SetMenuItemBitmaps(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetMenuItemBitmaps(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"SetMenuItemBitmaps(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetMenuItemInfoA(HMENU a0,\n                                     UINT a1,\n                                     BOOL a2,\n                                     MENUITEMINFOA* a3)\n{\n    _PrintEnter(\"SetMenuItemInfoA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetMenuItemInfoA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SetMenuItemInfoA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetMenuItemInfoW(HMENU a0,\n                                     UINT a1,\n                                     BOOL a2,\n                                     MENUITEMINFOW* a3)\n{\n    _PrintEnter(\"SetMenuItemInfoW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetMenuItemInfoW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SetMenuItemInfoW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLPARAM __stdcall Mine_SetMessageExtraInfo(LPARAM a0)\n{\n    _PrintEnter(\"SetMessageExtraInfo(%p)\\n\", a0);\n\n    LPARAM rv = 0;\n    __try {\n        rv = Real_SetMessageExtraInfo(a0);\n    } __finally {\n        _PrintExit(\"SetMessageExtraInfo() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetMessageQueue(int a0)\n{\n    _PrintEnter(\"SetMessageQueue(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetMessageQueue(a0);\n    } __finally {\n        _PrintExit(\"SetMessageQueue() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHMETAFILE __stdcall Mine_SetMetaFileBitsEx(UINT a0,\n                                           BYTE* a1)\n{\n    _PrintEnter(\"SetMetaFileBitsEx(%p,%p)\\n\", a0, a1);\n\n    HMETAFILE rv = 0;\n    __try {\n        rv = Real_SetMetaFileBitsEx(a0, a1);\n    } __finally {\n        _PrintExit(\"SetMetaFileBitsEx(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_SetMetaRgn(HDC a0)\n{\n    _PrintEnter(\"SetMetaRgn(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_SetMetaRgn(a0);\n    } __finally {\n        _PrintExit(\"SetMetaRgn() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetMiterLimit(HDC a0,\n                                  FLOAT a1,\n                                  PFLOAT a2)\n{\n    _PrintEnter(\"SetMiterLimit(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetMiterLimit(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetMiterLimit(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetNamedPipeHandleState(HANDLE a0,\n                                            LPDWORD a1,\n                                            LPDWORD a2,\n                                            LPDWORD a3)\n{\n    _PrintEnter(\"SetNamedPipeHandleState(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetNamedPipeHandleState(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SetNamedPipeHandleState(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_SetPaletteEntries(HPALETTE a0,\n                                      UINT a1,\n                                      UINT a2,\n                                      PALETTEENTRY* a3)\n{\n    _PrintEnter(\"SetPaletteEntries(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_SetPaletteEntries(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SetPaletteEntries(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_SetParent(HWND a0,\n                              HWND a1)\n{\n    _PrintEnter(\"SetParent(%p,%p)\\n\", a0, a1);\n\n    HWND rv = 0;\n    __try {\n        rv = Real_SetParent(a0, a1);\n    } __finally {\n        _PrintExit(\"SetParent(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nCOLORREF __stdcall Mine_SetPixel(HDC a0,\n                                 int a1,\n                                 int a2,\n                                 COLORREF a3)\n{\n    _PrintEnter(\"SetPixel(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    COLORREF rv = 0;\n    __try {\n        rv = Real_SetPixel(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SetPixel(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetPixelFormat(HDC a0,\n                                   int a1,\n                                   PIXELFORMATDESCRIPTOR* a2)\n{\n    _PrintEnter(\"SetPixelFormat(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetPixelFormat(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetPixelFormat(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetPixelV(HDC a0,\n                              int a1,\n                              int a2,\n                              COLORREF a3)\n{\n    _PrintEnter(\"SetPixelV(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetPixelV(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SetPixelV(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_SetPolyFillMode(HDC a0,\n                                   int a1)\n{\n    _PrintEnter(\"SetPolyFillMode(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_SetPolyFillMode(a0, a1);\n    } __finally {\n        _PrintExit(\"SetPolyFillMode(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetPriorityClass(HANDLE a0,\n                                     DWORD a1)\n{\n    _PrintEnter(\"SetPriorityClass(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetPriorityClass(a0, a1);\n    } __finally {\n        _PrintExit(\"SetPriorityClass(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetProcessAffinityMask(HANDLE a0,\n                                           DWORD_PTR a1)\n{\n    _PrintEnter(\"SetProcessAffinityMask(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetProcessAffinityMask(a0, a1);\n    } __finally {\n        _PrintExit(\"SetProcessAffinityMask(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetProcessShutdownParameters(DWORD a0,\n                                                 DWORD a1)\n{\n    _PrintEnter(\"SetProcessShutdownParameters(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetProcessShutdownParameters(a0, a1);\n    } __finally {\n        _PrintExit(\"SetProcessShutdownParameters(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetProcessWindowStation(HWINSTA a0)\n{\n    _PrintEnter(\"SetProcessWindowStation(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetProcessWindowStation(a0);\n    } __finally {\n        _PrintExit(\"SetProcessWindowStation() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetProcessWorkingSetSize(HANDLE a0,\n                                             SIZE_T a1,\n                                             SIZE_T a2)\n{\n    _PrintEnter(\"SetProcessWorkingSetSize(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetProcessWorkingSetSize(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetProcessWorkingSetSize(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetPropA(HWND a0,\n                             LPCSTR a1,\n                             HANDLE a2)\n{\n    _PrintEnter(\"SetPropA(%p,%hs,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetPropA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetPropA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetPropW(HWND a0,\n                             LPCWSTR a1,\n                             HANDLE a2)\n{\n    _PrintEnter(\"SetPropW(%p,%ls,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetPropW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetPropW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_SetROP2(HDC a0,\n                           int a1)\n{\n    _PrintEnter(\"SetROP2(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_SetROP2(a0, a1);\n    } __finally {\n        _PrintExit(\"SetROP2(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetRect(LPRECT a0,\n                            int a1,\n                            int a2,\n                            int a3,\n                            int a4)\n{\n    _PrintEnter(\"SetRect(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetRect(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"SetRect(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetRectEmpty(LPRECT a0)\n{\n    _PrintEnter(\"SetRectEmpty(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetRectEmpty(a0);\n    } __finally {\n        _PrintExit(\"SetRectEmpty() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetRectRgn(HRGN a0,\n                               int a1,\n                               int a2,\n                               int a3,\n                               int a4)\n{\n    _PrintEnter(\"SetRectRgn(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetRectRgn(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"SetRectRgn(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_SetScrollInfo(HWND a0,\n                                 int a1,\n                                 LPCSCROLLINFO a2,\n                                 BOOL a3)\n{\n    _PrintEnter(\"SetScrollInfo(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    int rv = 0;\n    __try {\n        rv = Real_SetScrollInfo(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SetScrollInfo(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_SetScrollPos(HWND a0,\n                                int a1,\n                                int a2,\n                                BOOL a3)\n{\n    _PrintEnter(\"SetScrollPos(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    int rv = 0;\n    __try {\n        rv = Real_SetScrollPos(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SetScrollPos(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetScrollRange(HWND a0,\n                                   int a1,\n                                   int a2,\n                                   int a3,\n                                   BOOL a4)\n{\n    _PrintEnter(\"SetScrollRange(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetScrollRange(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"SetScrollRange(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetStdHandle(DWORD a0,\n                                 HANDLE a1)\n{\n    _PrintEnter(\"SetStdHandle(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetStdHandle(a0, a1);\n    } __finally {\n        _PrintExit(\"SetStdHandle(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_SetStretchBltMode(HDC a0,\n                                     int a1)\n{\n    _PrintEnter(\"SetStretchBltMode(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_SetStretchBltMode(a0, a1);\n    } __finally {\n        _PrintExit(\"SetStretchBltMode(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetSysColors(int a0,\n                                 INT* a1,\n                                 COLORREF* a2)\n{\n    _PrintEnter(\"SetSysColors(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetSysColors(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetSysColors(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetSystemCursor(HCURSOR a0,\n                                    DWORD a1)\n{\n    _PrintEnter(\"SetSystemCursor(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetSystemCursor(a0, a1);\n    } __finally {\n        _PrintExit(\"SetSystemCursor(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_SetSystemPaletteUse(HDC a0,\n                                        UINT a1)\n{\n    _PrintEnter(\"SetSystemPaletteUse(%p,%p)\\n\", a0, a1);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_SetSystemPaletteUse(a0, a1);\n    } __finally {\n        _PrintExit(\"SetSystemPaletteUse(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetSystemPowerState(BOOL a0,\n                                        BOOL a1)\n{\n    _PrintEnter(\"SetSystemPowerState(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetSystemPowerState(a0, a1);\n    } __finally {\n        _PrintExit(\"SetSystemPowerState(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetSystemTime(SYSTEMTIME* a0)\n{\n    _PrintEnter(\"SetSystemTime(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetSystemTime(a0);\n    } __finally {\n        _PrintExit(\"SetSystemTime() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetSystemTimeAdjustment(DWORD a0,\n                                            BOOL a1)\n{\n    _PrintEnter(\"SetSystemTimeAdjustment(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetSystemTimeAdjustment(a0, a1);\n    } __finally {\n        _PrintExit(\"SetSystemTimeAdjustment(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_SetTapeParameters(HANDLE a0,\n                                       DWORD a1,\n                                       LPVOID a2)\n{\n    _PrintEnter(\"SetTapeParameters(%p,%p,%p)\\n\", a0, a1, a2);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_SetTapeParameters(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetTapeParameters(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_SetTapePosition(HANDLE a0,\n                                     DWORD a1,\n                                     DWORD a2,\n                                     DWORD a3,\n                                     DWORD a4,\n                                     BOOL a5)\n{\n    _PrintEnter(\"SetTapePosition(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_SetTapePosition(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"SetTapePosition(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_SetTextAlign(HDC a0,\n                                 UINT a1)\n{\n    _PrintEnter(\"SetTextAlign(%p,%p)\\n\", a0, a1);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_SetTextAlign(a0, a1);\n    } __finally {\n        _PrintExit(\"SetTextAlign(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_SetTextCharacterExtra(HDC a0,\n                                         int a1)\n{\n    _PrintEnter(\"SetTextCharacterExtra(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_SetTextCharacterExtra(a0, a1);\n    } __finally {\n        _PrintExit(\"SetTextCharacterExtra(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nCOLORREF __stdcall Mine_SetTextColor(HDC a0,\n                                     COLORREF a1)\n{\n    _PrintEnter(\"SetTextColor(%p,%p)\\n\", a0, a1);\n\n    COLORREF rv = 0;\n    __try {\n        rv = Real_SetTextColor(a0, a1);\n    } __finally {\n        _PrintExit(\"SetTextColor(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetTextJustification(HDC a0,\n                                         int a1,\n                                         int a2)\n{\n    _PrintEnter(\"SetTextJustification(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetTextJustification(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetTextJustification(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD_PTR __stdcall Mine_SetThreadAffinityMask(HANDLE a0,\n                                           DWORD_PTR a1)\n{\n    _PrintEnter(\"SetThreadAffinityMask(%p,%p)\\n\", a0, a1);\n\n    DWORD_PTR rv = 0;\n    __try {\n        rv = Real_SetThreadAffinityMask(a0, a1);\n    } __finally {\n        _PrintExit(\"SetThreadAffinityMask(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetThreadContext(HANDLE a0,\n                                     CONTEXT* a1)\n{\n    _PrintEnter(\"SetThreadContext(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetThreadContext(a0, a1);\n    } __finally {\n        _PrintExit(\"SetThreadContext(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetThreadDesktop(HDESK a0)\n{\n    _PrintEnter(\"SetThreadDesktop(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetThreadDesktop(a0);\n    } __finally {\n        _PrintExit(\"SetThreadDesktop() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_SetThreadIdealProcessor(HANDLE a0,\n                                             DWORD a1)\n{\n    _PrintEnter(\"SetThreadIdealProcessor(%p,%p)\\n\", a0, a1);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_SetThreadIdealProcessor(a0, a1);\n    } __finally {\n        _PrintExit(\"SetThreadIdealProcessor(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\n#if(WINVER >= 0x0500)\nBOOL __stdcall Mine_SetThreadLocale(LCID a0)\n{\n    _PrintEnter(\"SetThreadLocale(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetThreadLocale(a0);\n    } __finally {\n        _PrintExit(\"SetThreadLocale() -> %p\\n\", rv);\n    };\n    return rv;\n}\n#endif // (WINVER >= 0x0500)\n\nBOOL __stdcall Mine_SetThreadPriority(HANDLE a0,\n                                      int a1)\n{\n    _PrintEnter(\"SetThreadPriority(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetThreadPriority(a0, a1);\n    } __finally {\n        _PrintExit(\"SetThreadPriority(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetThreadPriorityBoost(HANDLE a0,\n                                           BOOL a1)\n{\n    _PrintEnter(\"SetThreadPriorityBoost(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetThreadPriorityBoost(a0, a1);\n    } __finally {\n        _PrintExit(\"SetThreadPriorityBoost(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetTimeZoneInformation(TIME_ZONE_INFORMATION* a0)\n{\n    _PrintEnter(\"SetTimeZoneInformation(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetTimeZoneInformation(a0);\n    } __finally {\n        _PrintExit(\"SetTimeZoneInformation() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT_PTR __stdcall Mine_SetTimer(HWND a0,\n                                 UINT_PTR a1,\n                                 UINT a2,\n                                 TIMERPROC a3)\n{\n    _PrintEnter(\"SetTimer(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    UINT_PTR rv = 0;\n    __try {\n        rv = Real_SetTimer(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SetTimer(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLPTOP_LEVEL_EXCEPTION_FILTER __stdcall Mine_SetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER a0)\n{\n    _PrintEnter(\"SetUnhandledExceptionFilter(%p)\\n\", a0);\n\n    LPTOP_LEVEL_EXCEPTION_FILTER rv = 0;\n    __try {\n        rv = Real_SetUnhandledExceptionFilter(a0);\n    } __finally {\n        _PrintExit(\"SetUnhandledExceptionFilter() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetUserObjectInformationA(HANDLE a0,\n                                              int a1,\n                                              PVOID a2,\n                                              DWORD a3)\n{\n    _PrintEnter(\"SetUserObjectInformationA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetUserObjectInformationA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SetUserObjectInformationA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetUserObjectInformationW(HANDLE a0,\n                                              int a1,\n                                              PVOID a2,\n                                              DWORD a3)\n{\n    _PrintEnter(\"SetUserObjectInformationW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetUserObjectInformationW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SetUserObjectInformationW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetUserObjectSecurity(HANDLE a0,\n                                          PSECURITY_INFORMATION a1,\n                                          PSECURITY_DESCRIPTOR a2)\n{\n    _PrintEnter(\"SetUserObjectSecurity(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetUserObjectSecurity(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetUserObjectSecurity(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetViewportExtEx(HDC a0,\n                                     int a1,\n                                     int a2,\n                                     SIZE* a3)\n{\n    _PrintEnter(\"SetViewportExtEx(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetViewportExtEx(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SetViewportExtEx(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetViewportOrgEx(HDC a0,\n                                     int a1,\n                                     int a2,\n                                     POINT* a3)\n{\n    _PrintEnter(\"SetViewportOrgEx(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetViewportOrgEx(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SetViewportOrgEx(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetVolumeLabelA(LPCSTR a0,\n                                    LPCSTR a1)\n{\n    _PrintEnter(\"SetVolumeLabelA(%hs,%hs)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetVolumeLabelA(a0, a1);\n    } __finally {\n        _PrintExit(\"SetVolumeLabelA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetVolumeLabelW(LPCWSTR a0,\n                                    LPCWSTR a1)\n{\n    _PrintEnter(\"SetVolumeLabelW(%ls,%ls)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetVolumeLabelW(a0, a1);\n    } __finally {\n        _PrintExit(\"SetVolumeLabelW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetWaitableTimer(HANDLE a0,\n                                     LARGE_INTEGER* a1,\n                                     LONG a2,\n                                     PTIMERAPCROUTINE a3,\n                                     LPVOID a4,\n                                     BOOL a5)\n{\n    _PrintEnter(\"SetWaitableTimer(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetWaitableTimer(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"SetWaitableTimer(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHENHMETAFILE __stdcall Mine_SetWinMetaFileBits(UINT a0,\n                                               BYTE* a1,\n                                               HDC a2,\n                                               METAFILEPICT* a3)\n{\n    _PrintEnter(\"SetWinMetaFileBits(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HENHMETAFILE rv = 0;\n    __try {\n        rv = Real_SetWinMetaFileBits(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SetWinMetaFileBits(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetWindowContextHelpId(HWND a0,\n                                           DWORD a1)\n{\n    _PrintEnter(\"SetWindowContextHelpId(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetWindowContextHelpId(a0, a1);\n    } __finally {\n        _PrintExit(\"SetWindowContextHelpId(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetWindowExtEx(HDC a0,\n                                   int a1,\n                                   int a2,\n                                   SIZE* a3)\n{\n    _PrintEnter(\"SetWindowExtEx(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetWindowExtEx(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SetWindowExtEx(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLONG __stdcall Mine_SetWindowLongA(HWND a0,\n                                   int a1,\n                                   LONG a2)\n{\n    _PrintEnter(\"SetWindowLongA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    LONG rv = 0;\n    __try {\n        rv = Real_SetWindowLongA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetWindowLongA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLONG __stdcall Mine_SetWindowLongW(HWND a0,\n                                   int a1,\n                                   LONG a2)\n{\n    _PrintEnter(\"SetWindowLongW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    LONG rv = 0;\n    __try {\n        rv = Real_SetWindowLongW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetWindowLongW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetWindowOrgEx(HDC a0,\n                                   int a1,\n                                   int a2,\n                                   POINT* a3)\n{\n    _PrintEnter(\"SetWindowOrgEx(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetWindowOrgEx(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SetWindowOrgEx(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetWindowPlacement(HWND a0,\n                                       WINDOWPLACEMENT* a1)\n{\n    _PrintEnter(\"SetWindowPlacement(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetWindowPlacement(a0, a1);\n    } __finally {\n        _PrintExit(\"SetWindowPlacement(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetWindowPos(HWND a0,\n                                 HWND a1,\n                                 int a2,\n                                 int a3,\n                                 int a4,\n                                 int a5,\n                                 UINT a6)\n{\n    _PrintEnter(\"SetWindowPos(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetWindowPos(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"SetWindowPos(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_SetWindowRgn(HWND a0,\n                                HRGN a1,\n                                BOOL a2)\n{\n    _PrintEnter(\"SetWindowRgn(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_SetWindowRgn(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetWindowRgn(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetWindowTextA(HWND a0,\n                                   LPCSTR a1)\n{\n    _PrintEnter(\"SetWindowTextA(%p,%hs)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetWindowTextA(a0, a1);\n    } __finally {\n        _PrintExit(\"SetWindowTextA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetWindowTextW(HWND a0,\n                                   LPCWSTR a1)\n{\n    _PrintEnter(\"SetWindowTextW(%p,%ls)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetWindowTextW(a0, a1);\n    } __finally {\n        _PrintExit(\"SetWindowTextW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nWORD __stdcall Mine_SetWindowWord(HWND a0,\n                                  int a1,\n                                  WORD a2)\n{\n    _PrintEnter(\"SetWindowWord(%p,%p,%p)\\n\", a0, a1, a2);\n\n    WORD rv = 0;\n    __try {\n        rv = Real_SetWindowWord(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetWindowWord(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHHOOK __stdcall Mine_SetWindowsHookA(int a0,\n                                     HOOKPROC a1)\n{\n    _PrintEnter(\"SetWindowsHookA(%p,%p)\\n\", a0, a1);\n\n    HHOOK rv = 0;\n    __try {\n        rv = Real_SetWindowsHookA(a0, a1);\n    } __finally {\n        _PrintExit(\"SetWindowsHookA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHHOOK __stdcall Mine_SetWindowsHookExA(int a0,\n                                       HOOKPROC a1,\n                                       HINSTANCE a2,\n                                       DWORD a3)\n{\n    _PrintEnter(\"SetWindowsHookExA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HHOOK rv = 0;\n    __try {\n        rv = Real_SetWindowsHookExA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SetWindowsHookExA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHHOOK __stdcall Mine_SetWindowsHookExW(int a0,\n                                       HOOKPROC a1,\n                                       HINSTANCE a2,\n                                       DWORD a3)\n{\n    _PrintEnter(\"SetWindowsHookExW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HHOOK rv = 0;\n    __try {\n        rv = Real_SetWindowsHookExW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SetWindowsHookExW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHHOOK __stdcall Mine_SetWindowsHookW(int a0,\n                                     HOOKPROC a1)\n{\n    _PrintEnter(\"SetWindowsHookW(%p,%p)\\n\", a0, a1);\n\n    HHOOK rv = 0;\n    __try {\n        rv = Real_SetWindowsHookW(a0, a1);\n    } __finally {\n        _PrintExit(\"SetWindowsHookW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetWorldTransform(HDC a0,\n                                      XFORM* a1)\n{\n    _PrintEnter(\"SetWorldTransform(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetWorldTransform(a0, a1);\n    } __finally {\n        _PrintExit(\"SetWorldTransform(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SetupComm(HANDLE a0,\n                              DWORD a1,\n                              DWORD a2)\n{\n    _PrintEnter(\"SetupComm(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetupComm(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetupComm(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ShowCaret(HWND a0)\n{\n    _PrintEnter(\"ShowCaret(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ShowCaret(a0);\n    } __finally {\n        _PrintExit(\"ShowCaret() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_ShowCursor(BOOL a0)\n{\n    _PrintEnter(\"ShowCursor(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_ShowCursor(a0);\n    } __finally {\n        _PrintExit(\"ShowCursor() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ShowOwnedPopups(HWND a0,\n                                    BOOL a1)\n{\n    _PrintEnter(\"ShowOwnedPopups(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ShowOwnedPopups(a0, a1);\n    } __finally {\n        _PrintExit(\"ShowOwnedPopups(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ShowScrollBar(HWND a0,\n                                  int a1,\n                                  BOOL a2)\n{\n    _PrintEnter(\"ShowScrollBar(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ShowScrollBar(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"ShowScrollBar(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ShowWindow(HWND a0,\n                               int a1)\n{\n    _PrintEnter(\"ShowWindow(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ShowWindow(a0, a1);\n    } __finally {\n        _PrintExit(\"ShowWindow(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ShowWindowAsync(HWND a0,\n                                    int a1)\n{\n    _PrintEnter(\"ShowWindowAsync(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ShowWindowAsync(a0, a1);\n    } __finally {\n        _PrintExit(\"ShowWindowAsync(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_SignalObjectAndWait(HANDLE a0,\n                                         HANDLE a1,\n                                         DWORD a2,\n                                         BOOL a3)\n{\n    _PrintEnter(\"SignalObjectAndWait(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_SignalObjectAndWait(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SignalObjectAndWait(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_SizeofResource(HMODULE a0,\n                                    HRSRC a1)\n{\n    _PrintEnter(\"SizeofResource(%p,%p)\\n\", a0, a1);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_SizeofResource(a0, a1);\n    } __finally {\n        _PrintExit(\"SizeofResource(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_SleepEx(DWORD a0,\n                             BOOL a1)\n{\n    _PrintEnter(\"SleepEx(%p,%p)\\n\", a0, a1);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_SleepEx(a0, a1);\n    } __finally {\n        _PrintExit(\"SleepEx(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_StartDocA(HDC a0,\n                             DOCINFOA* a1)\n{\n    _PrintEnter(\"StartDocA(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_StartDocA(a0, a1);\n    } __finally {\n        _PrintExit(\"StartDocA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_StartDocW(HDC a0,\n                             DOCINFOW* a1)\n{\n    _PrintEnter(\"StartDocW(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_StartDocW(a0, a1);\n    } __finally {\n        _PrintExit(\"StartDocW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_StartPage(HDC a0)\n{\n    _PrintEnter(\"StartPage(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_StartPage(a0);\n    } __finally {\n        _PrintExit(\"StartPage() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_StgCreateDocfile(OLECHAR* a0,\n                                        DWORD a1,\n                                        DWORD a2,\n                                        IStorage** a3)\n{\n    _PrintEnter(\"StgCreateDocfile(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_StgCreateDocfile(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"StgCreateDocfile(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_StgCreateDocfileOnILockBytes(ILockBytes* a0,\n                                                    DWORD a1,\n                                                    DWORD a2,\n                                                    IStorage** a3)\n{\n    _PrintEnter(\"StgCreateDocfileOnILockBytes(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_StgCreateDocfileOnILockBytes(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"StgCreateDocfileOnILockBytes(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_StgCreatePropSetStg(IStorage* a0,\n                                           DWORD a1,\n                                           IPropertySetStorage** a2)\n{\n    _PrintEnter(\"StgCreatePropSetStg(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_StgCreatePropSetStg(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"StgCreatePropSetStg(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_StgCreatePropStg(IUnknown* a0,\n                                        CONST IID& a1,\n                                        CLSID* a2,\n                                        DWORD a3,\n                                        DWORD a4,\n                                        IPropertyStorage** a5)\n{\n    _PrintEnter(\"StgCreatePropStg(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_StgCreatePropStg(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"StgCreatePropStg(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\n#if _MSC_VER < 1300\nHRESULT __stdcall Mine_StgCreateStorageEx(WCHAR* a0,\n                                          DWORD a1,\n                                          DWORD a2,\n                                          DWORD a3,\n                                          void* a4,\n                                          void* a5,\n                                          CONST IID& a6,\n                                          void** a7)\n#else\nHRESULT __stdcall Mine_StgCreateStorageEx(WCHAR* a0,\n                                          DWORD a1,\n                                          DWORD a2,\n                                          DWORD a3,\n                                          STGOPTIONS* a4,\n                                          void* a5,\n                                          CONST IID& a6,\n                                          void** a7)\n#endif\n{\n    _PrintEnter(\"StgCreateStorageEx(%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_StgCreateStorageEx(a0, a1, a2, a3, a4, a5, a6, a7);\n    } __finally {\n        _PrintExit(\"StgCreateStorageEx(,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_StgGetIFillLockBytesOnFile(OLECHAR* a0,\n                                                  IFillLockBytes** a1)\n{\n    _PrintEnter(\"StgGetIFillLockBytesOnFile(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_StgGetIFillLockBytesOnFile(a0, a1);\n    } __finally {\n        _PrintExit(\"StgGetIFillLockBytesOnFile(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_StgGetIFillLockBytesOnILockBytes(ILockBytes* a0,\n                                                        IFillLockBytes** a1)\n{\n    _PrintEnter(\"StgGetIFillLockBytesOnILockBytes(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_StgGetIFillLockBytesOnILockBytes(a0, a1);\n    } __finally {\n        _PrintExit(\"StgGetIFillLockBytesOnILockBytes(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_StgIsStorageFile(OLECHAR* a0)\n{\n    _PrintEnter(\"StgIsStorageFile(%p)\\n\", a0);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_StgIsStorageFile(a0);\n    } __finally {\n        _PrintExit(\"StgIsStorageFile() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_StgIsStorageILockBytes(ILockBytes* a0)\n{\n    _PrintEnter(\"StgIsStorageILockBytes(%p)\\n\", a0);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_StgIsStorageILockBytes(a0);\n    } __finally {\n        _PrintExit(\"StgIsStorageILockBytes() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_StgOpenAsyncDocfileOnIFillLockBytes(IFillLockBytes* a0,\n                                                           DWORD a1,\n                                                           DWORD a2,\n                                                           IStorage** a3)\n{\n    _PrintEnter(\"StgOpenAsyncDocfileOnIFillLockBytes(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_StgOpenAsyncDocfileOnIFillLockBytes(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"StgOpenAsyncDocfileOnIFillLockBytes(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_StgOpenPropStg(IUnknown* a0,\n                                      CONST IID& a1,\n                                      DWORD a2,\n                                      DWORD a3,\n                                      IPropertyStorage** a4)\n{\n    _PrintEnter(\"StgOpenPropStg(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_StgOpenPropStg(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"StgOpenPropStg(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_StgOpenStorage(OLECHAR* a0,\n                                      IStorage* a1,\n                                      DWORD a2,\n                                      SNB a3,\n                                      DWORD a4,\n                                      IStorage** a5)\n{\n    _PrintEnter(\"StgOpenStorage(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_StgOpenStorage(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"StgOpenStorage(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\n#if _MSC_VER < 1300\nHRESULT __stdcall Mine_StgOpenStorageEx(WCHAR* a0,\n                                        DWORD a1,\n                                        DWORD a2,\n                                        DWORD a3,\n                                        void* a4,\n                                        void* a5,\n                                        CONST IID& a6,\n                                        void** a7)\n#else\nHRESULT __stdcall Mine_StgOpenStorageEx(WCHAR* a0,\n                                        DWORD a1,\n                                        DWORD a2,\n                                        DWORD a3,\n                                        STGOPTIONS* a4,\n                                        void* a5,\n                                        CONST IID& a6,\n                                        void** a7)\n#endif\n{\n    _PrintEnter(\"StgOpenStorageEx(%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_StgOpenStorageEx(a0, a1, a2, a3, a4, a5, a6, a7);\n    } __finally {\n        _PrintExit(\"StgOpenStorageEx(,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_StgOpenStorageOnILockBytes(ILockBytes* a0,\n                                                  IStorage* a1,\n                                                  DWORD a2,\n                                                  SNB a3,\n                                                  DWORD a4,\n                                                  IStorage** a5)\n{\n    _PrintEnter(\"StgOpenStorageOnILockBytes(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_StgOpenStorageOnILockBytes(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"StgOpenStorageOnILockBytes(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_StgSetTimes(OLECHAR* a0,\n                                   FILETIME* a1,\n                                   FILETIME* a2,\n                                   FILETIME* a3)\n{\n    _PrintEnter(\"StgSetTimes(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_StgSetTimes(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"StgSetTimes(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_StretchBlt(HDC a0,\n                               int a1,\n                               int a2,\n                               int a3,\n                               int a4,\n                               HDC a5,\n                               int a6,\n                               int a7,\n                               int a8,\n                               int a9,\n                               DWORD a10)\n{\n    _PrintEnter(\"StretchBlt(%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_StretchBlt(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);\n    } __finally {\n        _PrintExit(\"StretchBlt(,,,,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_StretchDIBits(HDC a0,\n                                 int a1,\n                                 int a2,\n                                 int a3,\n                                 int a4,\n                                 int a5,\n                                 int a6,\n                                 int a7,\n                                 int a8,\n                                 void* a9,\n                                 BITMAPINFO* a10,\n                                 UINT a11,\n                                 DWORD a12)\n{\n    _PrintEnter(\"StretchDIBits(%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);\n\n    int rv = 0;\n    __try {\n        rv = Real_StretchDIBits(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);\n    } __finally {\n        _PrintExit(\"StretchDIBits(,,,,,,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_StringFromCLSID(CONST IID& a0,\n                                       LPOLESTR* a1)\n{\n    _PrintEnter(\"StringFromCLSID(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_StringFromCLSID(a0, a1);\n    } __finally {\n        _PrintExit(\"StringFromCLSID(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_StringFromGUID2(CONST GUID& a0,\n                                   LPOLESTR a1,\n                                   int a2)\n{\n    _PrintEnter(\"StringFromGUID2(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_StringFromGUID2(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"StringFromGUID2(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_StringFromIID(CONST IID& a0,\n                                     LPOLESTR* a1)\n{\n    _PrintEnter(\"StringFromIID(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_StringFromIID(a0, a1);\n    } __finally {\n        _PrintExit(\"StringFromIID(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_StrokeAndFillPath(HDC a0)\n{\n    _PrintEnter(\"StrokeAndFillPath(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_StrokeAndFillPath(a0);\n    } __finally {\n        _PrintExit(\"StrokeAndFillPath() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_StrokePath(HDC a0)\n{\n    _PrintEnter(\"StrokePath(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_StrokePath(a0);\n    } __finally {\n        _PrintExit(\"StrokePath() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SubtractRect(LPRECT a0,\n                                 RECT* a1,\n                                 RECT* a2)\n{\n    _PrintEnter(\"SubtractRect(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SubtractRect(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SubtractRect(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_SuspendThread(HANDLE a0)\n{\n    _PrintEnter(\"SuspendThread(%p)\\n\", a0);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_SuspendThread(a0);\n    } __finally {\n        _PrintExit(\"SuspendThread() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SwapBuffers(HDC a0)\n{\n    _PrintEnter(\"SwapBuffers(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SwapBuffers(a0);\n    } __finally {\n        _PrintExit(\"SwapBuffers() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SwapMouseButton(BOOL a0)\n{\n    _PrintEnter(\"SwapMouseButton(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SwapMouseButton(a0);\n    } __finally {\n        _PrintExit(\"SwapMouseButton() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SwitchDesktop(HDESK a0)\n{\n    _PrintEnter(\"SwitchDesktop(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SwitchDesktop(a0);\n    } __finally {\n        _PrintExit(\"SwitchDesktop() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nvoid __stdcall Mine_SwitchToFiber(LPVOID a0)\n{\n    _PrintEnter(\"SwitchToFiber(%p)\\n\", a0);\n\n    __try {\n        Real_SwitchToFiber(a0);\n    } __finally {\n        _PrintExit(\"SwitchToFiber() ->\\n\");\n    };\n}\n\nBOOL __stdcall Mine_SwitchToThread(void)\n{\n    _PrintEnter(\"SwitchToThread()\\n\");\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SwitchToThread();\n    } __finally {\n        _PrintExit(\"SwitchToThread() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SystemParametersInfoA(UINT a0,\n                                          UINT a1,\n                                          PVOID a2,\n                                          UINT a3)\n{\n    _PrintEnter(\"SystemParametersInfoA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SystemParametersInfoA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SystemParametersInfoA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SystemParametersInfoW(UINT a0,\n                                          UINT a1,\n                                          PVOID a2,\n                                          UINT a3)\n{\n    _PrintEnter(\"SystemParametersInfoW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SystemParametersInfoW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"SystemParametersInfoW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SystemTimeToFileTime(SYSTEMTIME* a0,\n                                         LPFILETIME a1)\n{\n    _PrintEnter(\"SystemTimeToFileTime(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SystemTimeToFileTime(a0, a1);\n    } __finally {\n        _PrintExit(\"SystemTimeToFileTime(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_SystemTimeToTzSpecificLocalTime(\n#ifdef PIPE_ACCEPT_REMOTE_CLIENTS\n                                                    const TIME_ZONE_INFORMATION *a0,\n                                                    const SYSTEMTIME *a1,\n#else\n                                                    LPTIME_ZONE_INFORMATION a0,\n                                                    LPSYSTEMTIME a1,\n#endif\n                                                    LPSYSTEMTIME a2\n                                                   )\n{\n    _PrintEnter(\"SystemTimeToTzSpecificLocalTime(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SystemTimeToTzSpecificLocalTime(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SystemTimeToTzSpecificLocalTime(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLONG __stdcall Mine_TabbedTextOutA(HDC a0,\n                                   int a1,\n                                   int a2,\n                                   LPCSTR a3,\n                                   int a4,\n                                   int a5,\n                                   INT* a6,\n                                   int a7)\n{\n    _PrintEnter(\"TabbedTextOutA(%p,%p,%p,%hs,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7);\n\n    LONG rv = 0;\n    __try {\n        rv = Real_TabbedTextOutA(a0, a1, a2, a3, a4, a5, a6, a7);\n    } __finally {\n        _PrintExit(\"TabbedTextOutA(,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLONG __stdcall Mine_TabbedTextOutW(HDC a0,\n                                   int a1,\n                                   int a2,\n                                   LPCWSTR a3,\n                                   int a4,\n                                   int a5,\n                                   INT* a6,\n                                   int a7)\n{\n    _PrintEnter(\"TabbedTextOutW(%p,%p,%p,%ls,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7);\n\n    LONG rv = 0;\n    __try {\n        rv = Real_TabbedTextOutW(a0, a1, a2, a3, a4, a5, a6, a7);\n    } __finally {\n        _PrintExit(\"TabbedTextOutW(,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_TerminateProcess(HANDLE a0,\n                                     UINT a1)\n{\n    _PrintEnter(\"TerminateProcess(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_TerminateProcess(a0, a1);\n    } __finally {\n        _PrintExit(\"TerminateProcess(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_TerminateThread(HANDLE a0,\n                                    DWORD a1)\n{\n    _PrintEnter(\"TerminateThread(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_TerminateThread(a0, a1);\n    } __finally {\n        _PrintExit(\"TerminateThread(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_TextOutA(HDC a0,\n                             int a1,\n                             int a2,\n                             LPCSTR a3,\n                             int a4)\n{\n    _PrintEnter(\"TextOutA(%p,%p,%p,%hs,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_TextOutA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"TextOutA(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_TextOutW(HDC a0,\n                             int a1,\n                             int a2,\n                             LPCWSTR a3,\n                             int a4)\n{\n    _PrintEnter(\"TextOutW(%p,%p,%p,%ls,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_TextOutW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"TextOutW(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nWORD __stdcall Mine_TileWindows(HWND a0,\n                                UINT a1,\n                                RECT* a2,\n                                UINT a3,\n                                struct HWND__** a4)\n{\n    _PrintEnter(\"TileWindows(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    WORD rv = 0;\n    __try {\n        rv = Real_TileWindows(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"TileWindows(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_ToAscii(UINT a0,\n                           UINT a1,\n                           BYTE* a2,\n                           LPWORD a3,\n                           UINT a4)\n{\n    _PrintEnter(\"ToAscii(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    int rv = 0;\n    __try {\n        rv = Real_ToAscii(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"ToAscii(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_ToAsciiEx(UINT a0,\n                             UINT a1,\n                             BYTE* a2,\n                             LPWORD a3,\n                             UINT a4,\n                             HKL a5)\n{\n    _PrintEnter(\"ToAsciiEx(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    int rv = 0;\n    __try {\n        rv = Real_ToAsciiEx(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"ToAsciiEx(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_ToUnicode(UINT a0,\n                             UINT a1,\n                             BYTE* a2,\n                             LPWSTR a3,\n                             int a4,\n                             UINT a5)\n{\n    _PrintEnter(\"ToUnicode(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    int rv = 0;\n    __try {\n        rv = Real_ToUnicode(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"ToUnicode(,,,%ls,,) -> %p\\n\", a3, rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_ToUnicodeEx(UINT a0,\n                               UINT a1,\n                               BYTE* a2,\n                               LPWSTR a3,\n                               int a4,\n                               UINT a5,\n                               HKL a6)\n{\n    _PrintEnter(\"ToUnicodeEx(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    int rv = 0;\n    __try {\n        rv = Real_ToUnicodeEx(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"ToUnicodeEx(,,,%ls,,,) -> %p\\n\", a3, rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_TrackMouseEvent(TRACKMOUSEEVENT* a0)\n{\n    _PrintEnter(\"TrackMouseEvent(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_TrackMouseEvent(a0);\n    } __finally {\n        _PrintExit(\"TrackMouseEvent() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_TrackPopupMenu(HMENU a0,\n                                   UINT a1,\n                                   int a2,\n                                   int a3,\n                                   int a4,\n                                   HWND a5,\n                                   RECT* a6)\n{\n    _PrintEnter(\"TrackPopupMenu(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_TrackPopupMenu(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"TrackPopupMenu(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_TrackPopupMenuEx(HMENU a0,\n                                     UINT a1,\n                                     int a2,\n                                     int a3,\n                                     HWND a4,\n                                     LPTPMPARAMS a5)\n{\n    _PrintEnter(\"TrackPopupMenuEx(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_TrackPopupMenuEx(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"TrackPopupMenuEx(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_TransactNamedPipe(HANDLE a0,\n                                      LPVOID a1,\n                                      DWORD a2,\n                                      LPVOID a3,\n                                      DWORD a4,\n                                      LPDWORD a5,\n                                      LPOVERLAPPED a6)\n{\n    _PrintEnter(\"TransactNamedPipe(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_TransactNamedPipe(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"TransactNamedPipe(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_TranslateAcceleratorA(HWND a0,\n                                         HACCEL a1,\n                                         LPMSG a2)\n{\n    _PrintEnter(\"TranslateAcceleratorA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_TranslateAcceleratorA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"TranslateAcceleratorA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_TranslateAcceleratorW(HWND a0,\n                                         HACCEL a1,\n                                         LPMSG a2)\n{\n    _PrintEnter(\"TranslateAcceleratorW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_TranslateAcceleratorW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"TranslateAcceleratorW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_TranslateCharsetInfo(DWORD* a0,\n                                         CHARSETINFO* a1,\n                                         DWORD a2)\n{\n    _PrintEnter(\"TranslateCharsetInfo(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_TranslateCharsetInfo(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"TranslateCharsetInfo(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_TranslateMDISysAccel(HWND a0,\n                                         LPMSG a1)\n{\n    _PrintEnter(\"TranslateMDISysAccel(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_TranslateMDISysAccel(a0, a1);\n    } __finally {\n        _PrintExit(\"TranslateMDISysAccel(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_TranslateMessage(MSG* a0)\n{\n    _PrintEnter(\"TranslateMessage(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_TranslateMessage(a0);\n    } __finally {\n        _PrintExit(\"TranslateMessage() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_TransmitCommChar(HANDLE a0,\n                                     char a1)\n{\n    _PrintEnter(\"TransmitCommChar(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_TransmitCommChar(a0, a1);\n    } __finally {\n        _PrintExit(\"TransmitCommChar(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\n#if DETOUR_TryEnterCriticalSection_EVEN_IF_IT_EXERCISES_A_BUG_IN_RtlLookupFunctionTable\nBOOL __stdcall Mine_TryEnterCriticalSection(LPCRITICAL_SECTION a0)\n{\n    _PrintEnter(\"TryEnterCriticalSection(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_TryEnterCriticalSection(a0);\n    } __finally {\n        _PrintExit(\"TryEnterCriticalSection() -> %p\\n\", rv);\n    };\n    return rv;\n}\n#endif\n\nBOOL __stdcall Mine_UnhookWindowsHook(int a0,\n                                      HOOKPROC a1)\n{\n    _PrintEnter(\"UnhookWindowsHook(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_UnhookWindowsHook(a0, a1);\n    } __finally {\n        _PrintExit(\"UnhookWindowsHook(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_UnhookWindowsHookEx(HHOOK a0)\n{\n    _PrintEnter(\"UnhookWindowsHookEx(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_UnhookWindowsHookEx(a0);\n    } __finally {\n        _PrintExit(\"UnhookWindowsHookEx() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_UnionRect(LPRECT a0,\n                              RECT* a1,\n                              RECT* a2)\n{\n    _PrintEnter(\"UnionRect(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_UnionRect(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"UnionRect(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_UnloadKeyboardLayout(HKL a0)\n{\n    _PrintEnter(\"UnloadKeyboardLayout(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_UnloadKeyboardLayout(a0);\n    } __finally {\n        _PrintExit(\"UnloadKeyboardLayout() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_UnlockFile(HANDLE a0,\n                               DWORD a1,\n                               DWORD a2,\n                               DWORD a3,\n                               DWORD a4)\n{\n    _PrintEnter(\"UnlockFile(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_UnlockFile(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"UnlockFile(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_UnlockFileEx(HANDLE a0,\n                                 DWORD a1,\n                                 DWORD a2,\n                                 DWORD a3,\n                                 LPOVERLAPPED a4)\n{\n    _PrintEnter(\"UnlockFileEx(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_UnlockFileEx(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"UnlockFileEx(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_UnmapViewOfFile(LPCVOID a0)\n{\n    _PrintEnter(\"UnmapViewOfFile(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_UnmapViewOfFile(a0);\n    } __finally {\n        _PrintExit(\"UnmapViewOfFile() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_UnpackDDElParam(UINT a0,\n                                    LPARAM a1,\n                                    PUINT_PTR a2,\n                                    PUINT_PTR a3)\n{\n    _PrintEnter(\"UnpackDDElParam(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_UnpackDDElParam(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"UnpackDDElParam(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_UnrealizeObject(HGDIOBJ a0)\n{\n    _PrintEnter(\"UnrealizeObject(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_UnrealizeObject(a0);\n    } __finally {\n        _PrintExit(\"UnrealizeObject() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_UnregisterClassA(LPCSTR a0,\n                                     HINSTANCE a1)\n{\n    _PrintEnter(\"UnregisterClassA(%hs,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_UnregisterClassA(a0, a1);\n    } __finally {\n        _PrintExit(\"UnregisterClassA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_UnregisterClassW(LPCWSTR a0,\n                                     HINSTANCE a1)\n{\n    _PrintEnter(\"UnregisterClassW(%ls,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_UnregisterClassW(a0, a1);\n    } __finally {\n        _PrintExit(\"UnregisterClassW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_UnregisterHotKey(HWND a0,\n                                     int a1)\n{\n    _PrintEnter(\"UnregisterHotKey(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_UnregisterHotKey(a0, a1);\n    } __finally {\n        _PrintExit(\"UnregisterHotKey(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_UpdateColors(HDC a0)\n{\n    _PrintEnter(\"UpdateColors(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_UpdateColors(a0);\n    } __finally {\n        _PrintExit(\"UpdateColors() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_UpdateResourceA(HANDLE a0,\n                                    LPCSTR a1,\n                                    LPCSTR a2,\n                                    WORD a3,\n                                    LPVOID a4,\n                                    DWORD a5)\n{\n    _PrintEnter(\"UpdateResourceA(%p,%hs,%hs,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_UpdateResourceA(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"UpdateResourceA(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_UpdateResourceW(HANDLE a0,\n                                    LPCWSTR a1,\n                                    LPCWSTR a2,\n                                    WORD a3,\n                                    LPVOID a4,\n                                    DWORD a5)\n{\n    _PrintEnter(\"UpdateResourceW(%p,%ls,%ls,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_UpdateResourceW(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"UpdateResourceW(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_UpdateWindow(HWND a0)\n{\n    _PrintEnter(\"UpdateWindow(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_UpdateWindow(a0);\n    } __finally {\n        _PrintExit(\"UpdateWindow() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ValidateRect(HWND a0,\n                                 RECT* a1)\n{\n    _PrintEnter(\"ValidateRect(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ValidateRect(a0, a1);\n    } __finally {\n        _PrintExit(\"ValidateRect(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_ValidateRgn(HWND a0,\n                                HRGN a1)\n{\n    _PrintEnter(\"ValidateRgn(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ValidateRgn(a0, a1);\n    } __finally {\n        _PrintExit(\"ValidateRgn(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_VerLanguageNameA(DWORD a0,\n                                      LPSTR a1,\n                                      DWORD a2)\n{\n    _PrintEnter(\"VerLanguageNameA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_VerLanguageNameA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"VerLanguageNameA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_VerLanguageNameW(DWORD a0,\n                                      LPWSTR a1,\n                                      DWORD a2)\n{\n    _PrintEnter(\"VerLanguageNameW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_VerLanguageNameW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"VerLanguageNameW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLPVOID __stdcall Mine_VirtualAllocEx(HANDLE a0,\n                                     LPVOID a1,\n                                     SIZE_T a2,\n                                     DWORD a3,\n                                     DWORD a4)\n{\n    _PrintEnter(\"VirtualAllocEx(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    LPVOID rv = 0;\n    __try {\n        rv = Real_VirtualAllocEx(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"VirtualAllocEx(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_VirtualFreeEx(HANDLE a0,\n                                  LPVOID a1,\n                                  SIZE_T a2,\n                                  DWORD a3)\n{\n    _PrintEnter(\"VirtualFreeEx(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_VirtualFreeEx(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"VirtualFreeEx(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_VirtualProtectEx(HANDLE a0,\n                                     LPVOID a1,\n                                     SIZE_T a2,\n                                     DWORD a3,\n                                     PDWORD a4)\n{\n    _PrintEnter(\"VirtualProtectEx(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_VirtualProtectEx(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"VirtualProtectEx(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD_PTR __stdcall Mine_VirtualQueryEx(HANDLE a0,\n                                        LPCVOID a1,\n                                        PMEMORY_BASIC_INFORMATION a2,\n                                        DWORD_PTR a3)\n{\n    _PrintEnter(\"VirtualQueryEx(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    DWORD_PTR rv = 0;\n    __try {\n        rv = Real_VirtualQueryEx(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"VirtualQueryEx(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nSHORT __stdcall Mine_VkKeyScanA(CHAR a0)\n{\n    _PrintEnter(\"VkKeyScanA(%p)\\n\", a0);\n\n    SHORT rv = 0;\n    __try {\n        rv = Real_VkKeyScanA(a0);\n    } __finally {\n        _PrintExit(\"VkKeyScanA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nSHORT __stdcall Mine_VkKeyScanExA(CHAR a0,\n                                  HKL a1)\n{\n    _PrintEnter(\"VkKeyScanExA(%p,%p)\\n\", a0, a1);\n\n    SHORT rv = 0;\n    __try {\n        rv = Real_VkKeyScanExA(a0, a1);\n    } __finally {\n        _PrintExit(\"VkKeyScanExA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nSHORT __stdcall Mine_VkKeyScanExW(WCHAR a0,\n                                  HKL a1)\n{\n    _PrintEnter(\"VkKeyScanExW(%p,%p)\\n\", a0, a1);\n\n    SHORT rv = 0;\n    __try {\n        rv = Real_VkKeyScanExW(a0, a1);\n    } __finally {\n        _PrintExit(\"VkKeyScanExW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nSHORT __stdcall Mine_VkKeyScanW(WCHAR a0)\n{\n    _PrintEnter(\"VkKeyScanW(%p)\\n\", a0);\n\n    SHORT rv = 0;\n    __try {\n        rv = Real_VkKeyScanW(a0);\n    } __finally {\n        _PrintExit(\"VkKeyScanW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nSOCKET __stdcall Mine_WSAAccept(SOCKET a0,\n                                sockaddr* a1,\n                                LPINT a2,\n                                LPCONDITIONPROC a3,\n                                DWORD_PTR a4)\n{\n    _PrintEnter(\"WSAAccept(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    SOCKET rv = 0;\n    __try {\n        rv = Real_WSAAccept(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WSAAccept(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nINT __stdcall Mine_WSAAddressToStringA(LPSOCKADDR a0,\n                                       DWORD a1,\n                                       LPWSAPROTOCOL_INFOA a2,\n                                       LPSTR a3,\n                                       LPDWORD a4)\n{\n    _PrintEnter(\"WSAAddressToStringA(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSAAddressToStringA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WSAAddressToStringA(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nINT __stdcall Mine_WSAAddressToStringW(LPSOCKADDR a0,\n                                       DWORD a1,\n                                       LPWSAPROTOCOL_INFOW a2,\n                                       LPWSTR a3,\n                                       LPDWORD a4)\n{\n    _PrintEnter(\"WSAAddressToStringW(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSAAddressToStringW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WSAAddressToStringW(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_WSAAsyncGetHostByAddr(HWND a0,\n                                            u_int a1,\n                                            char* a2,\n                                            int a3,\n                                            int a4,\n                                            char* a5,\n                                            int a6)\n{\n    _PrintEnter(\"WSAAsyncGetHostByAddr(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_WSAAsyncGetHostByAddr(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"WSAAsyncGetHostByAddr(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_WSAAsyncGetHostByName(HWND a0,\n                                            u_int a1,\n                                            char* a2,\n                                            char* a3,\n                                            int a4)\n{\n    _PrintEnter(\"WSAAsyncGetHostByName(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_WSAAsyncGetHostByName(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WSAAsyncGetHostByName(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_WSAAsyncGetProtoByName(HWND a0,\n                                             u_int a1,\n                                             char* a2,\n                                             char* a3,\n                                             int a4)\n{\n    _PrintEnter(\"WSAAsyncGetProtoByName(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_WSAAsyncGetProtoByName(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WSAAsyncGetProtoByName(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_WSAAsyncGetProtoByNumber(HWND a0,\n                                               u_int a1,\n                                               int a2,\n                                               char* a3,\n                                               int a4)\n{\n    _PrintEnter(\"WSAAsyncGetProtoByNumber(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_WSAAsyncGetProtoByNumber(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WSAAsyncGetProtoByNumber(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_WSAAsyncGetServByName(HWND a0,\n                                            u_int a1,\n                                            char* a2,\n                                            char* a3,\n                                            char* a4,\n                                            int a5)\n{\n    _PrintEnter(\"WSAAsyncGetServByName(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_WSAAsyncGetServByName(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"WSAAsyncGetServByName(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_WSAAsyncGetServByPort(HWND a0,\n                                            u_int a1,\n                                            int a2,\n                                            char* a3,\n                                            char* a4,\n                                            int a5)\n{\n    _PrintEnter(\"WSAAsyncGetServByPort(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_WSAAsyncGetServByPort(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"WSAAsyncGetServByPort(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_WSAAsyncSelect(SOCKET a0,\n                                  HWND a1,\n                                  u_int a2,\n                                  long a3)\n{\n    _PrintEnter(\"WSAAsyncSelect(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSAAsyncSelect(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"WSAAsyncSelect(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_WSACancelAsyncRequest(HANDLE a0)\n{\n    _PrintEnter(\"WSACancelAsyncRequest(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSACancelAsyncRequest(a0);\n    } __finally {\n        _PrintExit(\"WSACancelAsyncRequest() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_WSACancelBlockingCall(void)\n{\n    _PrintEnter(\"WSACancelBlockingCall()\\n\");\n\n    int rv = 0;\n    __try {\n        rv = Real_WSACancelBlockingCall();\n    } __finally {\n        _PrintExit(\"WSACancelBlockingCall() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_WSACleanup(void)\n{\n    _PrintEnter(\"WSACleanup()\\n\");\n\n    int rv = 0;\n    __try {\n        rv = Real_WSACleanup();\n    } __finally {\n        _PrintExit(\"WSACleanup() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WSACloseEvent(HANDLE a0)\n{\n    _PrintEnter(\"WSACloseEvent(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WSACloseEvent(a0);\n    } __finally {\n        _PrintExit(\"WSACloseEvent() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_WSAConnect(SOCKET a0,\n                              sockaddr* a1,\n                              int a2,\n                              LPWSABUF a3,\n                              LPWSABUF a4,\n                              LPQOS a5,\n                              LPQOS a6)\n{\n    _PrintEnter(\"WSAConnect(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSAConnect(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"WSAConnect(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE __stdcall Mine_WSACreateEvent(void)\n{\n    _PrintEnter(\"WSACreateEvent()\\n\");\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_WSACreateEvent();\n    } __finally {\n        _PrintExit(\"WSACreateEvent() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_WSADuplicateSocketA(SOCKET a0,\n                                       DWORD a1,\n                                       LPWSAPROTOCOL_INFOA a2)\n{\n    _PrintEnter(\"WSADuplicateSocketA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSADuplicateSocketA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WSADuplicateSocketA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_WSADuplicateSocketW(SOCKET a0,\n                                       DWORD a1,\n                                       LPWSAPROTOCOL_INFOW a2)\n{\n    _PrintEnter(\"WSADuplicateSocketW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSADuplicateSocketW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WSADuplicateSocketW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nINT __stdcall Mine_WSAEnumNameSpaceProvidersA(LPDWORD a0,\n                                              LPWSANAMESPACE_INFOA a1)\n{\n    _PrintEnter(\"WSAEnumNameSpaceProvidersA(%p,%p)\\n\", a0, a1);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSAEnumNameSpaceProvidersA(a0, a1);\n    } __finally {\n        _PrintExit(\"WSAEnumNameSpaceProvidersA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nINT __stdcall Mine_WSAEnumNameSpaceProvidersW(LPDWORD a0,\n                                              LPWSANAMESPACE_INFOW a1)\n{\n    _PrintEnter(\"WSAEnumNameSpaceProvidersW(%p,%p)\\n\", a0, a1);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSAEnumNameSpaceProvidersW(a0, a1);\n    } __finally {\n        _PrintExit(\"WSAEnumNameSpaceProvidersW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_WSAEnumNetworkEvents(SOCKET a0,\n                                        HANDLE a1,\n                                        LPWSANETWORKEVENTS a2)\n{\n    _PrintEnter(\"WSAEnumNetworkEvents(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSAEnumNetworkEvents(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WSAEnumNetworkEvents(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_WSAEnumProtocolsA(LPINT a0,\n                                     LPWSAPROTOCOL_INFOA a1,\n                                     LPDWORD a2)\n{\n    _PrintEnter(\"WSAEnumProtocolsA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSAEnumProtocolsA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WSAEnumProtocolsA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_WSAEnumProtocolsW(LPINT a0,\n                                     LPWSAPROTOCOL_INFOW a1,\n                                     LPDWORD a2)\n{\n    _PrintEnter(\"WSAEnumProtocolsW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSAEnumProtocolsW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WSAEnumProtocolsW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_WSAEventSelect(SOCKET a0,\n                                  HANDLE a1,\n                                  long a2)\n{\n    _PrintEnter(\"WSAEventSelect(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSAEventSelect(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WSAEventSelect(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WSAGetOverlappedResult(SOCKET a0,\n                                           LPWSAOVERLAPPED a1,\n                                           LPDWORD a2,\n                                           BOOL a3,\n                                           LPDWORD a4)\n{\n    _PrintEnter(\"WSAGetOverlappedResult(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WSAGetOverlappedResult(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WSAGetOverlappedResult(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WSAGetQOSByName(SOCKET a0,\n                                    LPWSABUF a1,\n                                    LPQOS a2)\n{\n    _PrintEnter(\"WSAGetQOSByName(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WSAGetQOSByName(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WSAGetQOSByName(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nINT __stdcall Mine_WSAGetServiceClassInfoA(LPGUID a0,\n                                           LPGUID a1,\n                                           LPDWORD a2,\n                                           LPWSASERVICECLASSINFOA a3)\n{\n    _PrintEnter(\"WSAGetServiceClassInfoA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSAGetServiceClassInfoA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"WSAGetServiceClassInfoA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nINT __stdcall Mine_WSAGetServiceClassInfoW(LPGUID a0,\n                                           LPGUID a1,\n                                           LPDWORD a2,\n                                           LPWSASERVICECLASSINFOW a3)\n{\n    _PrintEnter(\"WSAGetServiceClassInfoW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSAGetServiceClassInfoW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"WSAGetServiceClassInfoW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nINT __stdcall Mine_WSAGetServiceClassNameByClassIdA(LPGUID a0,\n                                                    LPSTR a1,\n                                                    LPDWORD a2)\n{\n    _PrintEnter(\"WSAGetServiceClassNameByClassIdA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSAGetServiceClassNameByClassIdA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WSAGetServiceClassNameByClassIdA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nINT __stdcall Mine_WSAGetServiceClassNameByClassIdW(LPGUID a0,\n                                                    LPWSTR a1,\n                                                    LPDWORD a2)\n{\n    _PrintEnter(\"WSAGetServiceClassNameByClassIdW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSAGetServiceClassNameByClassIdW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WSAGetServiceClassNameByClassIdW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_WSAHtonl(SOCKET a0,\n                            u_long a1,\n                            u_long* a2)\n{\n    _PrintEnter(\"WSAHtonl(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSAHtonl(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WSAHtonl(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_WSAHtons(SOCKET a0,\n                            u_short a1,\n                            u_short* a2)\n{\n    _PrintEnter(\"WSAHtons(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSAHtons(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WSAHtons(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nINT __stdcall Mine_WSAInstallServiceClassA(LPWSASERVICECLASSINFOA a0)\n{\n    _PrintEnter(\"WSAInstallServiceClassA(%p)\\n\", a0);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSAInstallServiceClassA(a0);\n    } __finally {\n        _PrintExit(\"WSAInstallServiceClassA() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nINT __stdcall Mine_WSAInstallServiceClassW(LPWSASERVICECLASSINFOW a0)\n{\n    _PrintEnter(\"WSAInstallServiceClassW(%p)\\n\", a0);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSAInstallServiceClassW(a0);\n    } __finally {\n        _PrintExit(\"WSAInstallServiceClassW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_WSAIoctl(SOCKET a0,\n                            DWORD a1,\n                            LPVOID a2,\n                            DWORD a3,\n                            LPVOID a4,\n                            DWORD a5,\n                            LPDWORD a6,\n                            LPWSAOVERLAPPED a7,\n                            LPWSAOVERLAPPED_COMPLETION_ROUTINE a8)\n{\n    _PrintEnter(\"WSAIoctl(%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSAIoctl(a0, a1, a2, a3, a4, a5, a6, a7, a8);\n    } __finally {\n        _PrintExit(\"WSAIoctl(,,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WSAIsBlocking(void)\n{\n    _PrintEnter(\"WSAIsBlocking()\\n\");\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WSAIsBlocking();\n    } __finally {\n        _PrintExit(\"WSAIsBlocking() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nSOCKET __stdcall Mine_WSAJoinLeaf(SOCKET a0,\n                                  sockaddr* a1,\n                                  int a2,\n                                  LPWSABUF a3,\n                                  LPWSABUF a4,\n                                  LPQOS a5,\n                                  LPQOS a6,\n                                  DWORD a7)\n{\n    _PrintEnter(\"WSAJoinLeaf(%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7);\n\n    SOCKET rv = 0;\n    __try {\n        rv = Real_WSAJoinLeaf(a0, a1, a2, a3, a4, a5, a6, a7);\n    } __finally {\n        _PrintExit(\"WSAJoinLeaf(,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nINT __stdcall Mine_WSALookupServiceBeginA(LPWSAQUERYSETA a0,\n                                          DWORD a1,\n                                          LPHANDLE a2)\n{\n    _PrintEnter(\"WSALookupServiceBeginA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSALookupServiceBeginA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WSALookupServiceBeginA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nINT __stdcall Mine_WSALookupServiceBeginW(LPWSAQUERYSETW a0,\n                                          DWORD a1,\n                                          LPHANDLE a2)\n{\n    _PrintEnter(\"WSALookupServiceBeginW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSALookupServiceBeginW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WSALookupServiceBeginW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nINT __stdcall Mine_WSALookupServiceEnd(HANDLE a0)\n{\n    _PrintEnter(\"WSALookupServiceEnd(%p)\\n\", a0);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSALookupServiceEnd(a0);\n    } __finally {\n        _PrintExit(\"WSALookupServiceEnd() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nINT __stdcall Mine_WSALookupServiceNextA(HANDLE a0,\n                                         DWORD a1,\n                                         LPDWORD a2,\n                                         LPWSAQUERYSETA a3)\n{\n    _PrintEnter(\"WSALookupServiceNextA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSALookupServiceNextA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"WSALookupServiceNextA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nINT __stdcall Mine_WSALookupServiceNextW(HANDLE a0,\n                                         DWORD a1,\n                                         LPDWORD a2,\n                                         LPWSAQUERYSETW a3)\n{\n    _PrintEnter(\"WSALookupServiceNextW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSALookupServiceNextW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"WSALookupServiceNextW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_WSANtohl(SOCKET a0,\n                            u_long a1,\n                            u_long* a2)\n{\n    _PrintEnter(\"WSANtohl(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSANtohl(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WSANtohl(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_WSANtohs(SOCKET a0,\n                            u_short a1,\n                            u_short* a2)\n{\n    _PrintEnter(\"WSANtohs(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSANtohs(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WSANtohs(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nINT __stdcall Mine_WSAProviderConfigChange(LPHANDLE a0,\n                                           LPWSAOVERLAPPED a1,\n                                           LPWSAOVERLAPPED_COMPLETION_ROUTINE a2)\n{\n    _PrintEnter(\"WSAProviderConfigChange(%p,%p,%p)\\n\", a0, a1, a2);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSAProviderConfigChange(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WSAProviderConfigChange(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_WSARecv(SOCKET a0,\n                           LPWSABUF a1,\n                           DWORD a2,\n                           LPDWORD a3,\n                           LPDWORD a4,\n                           LPWSAOVERLAPPED a5,\n                           LPWSAOVERLAPPED_COMPLETION_ROUTINE a6)\n{\n    _PrintEnter(\"WSARecv(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSARecv(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"WSARecv(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_WSARecvDisconnect(SOCKET a0,\n                                     LPWSABUF a1)\n{\n    _PrintEnter(\"WSARecvDisconnect(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSARecvDisconnect(a0, a1);\n    } __finally {\n        _PrintExit(\"WSARecvDisconnect(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_WSARecvFrom(SOCKET a0,\n                               LPWSABUF a1,\n                               DWORD a2,\n                               LPDWORD a3,\n                               LPDWORD a4,\n                               sockaddr* a5,\n                               LPINT a6,\n                               LPWSAOVERLAPPED a7,\n                               LPWSAOVERLAPPED_COMPLETION_ROUTINE a8)\n{\n    _PrintEnter(\"WSARecvFrom(%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSARecvFrom(a0, a1, a2, a3, a4, a5, a6, a7, a8);\n    } __finally {\n        _PrintExit(\"WSARecvFrom(,,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nINT __stdcall Mine_WSARemoveServiceClass(LPGUID a0)\n{\n    _PrintEnter(\"WSARemoveServiceClass(%p)\\n\", a0);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSARemoveServiceClass(a0);\n    } __finally {\n        _PrintExit(\"WSARemoveServiceClass() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WSAResetEvent(HANDLE a0)\n{\n    _PrintEnter(\"WSAResetEvent(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WSAResetEvent(a0);\n    } __finally {\n        _PrintExit(\"WSAResetEvent() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_WSASend(SOCKET a0,\n                           LPWSABUF a1,\n                           DWORD a2,\n                           LPDWORD a3,\n                           DWORD a4,\n                           LPWSAOVERLAPPED a5,\n                           LPWSAOVERLAPPED_COMPLETION_ROUTINE a6)\n{\n    _PrintEnter(\"WSASend(%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSASend(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"WSASend(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_WSASendDisconnect(SOCKET a0,\n                                     LPWSABUF a1)\n{\n    _PrintEnter(\"WSASendDisconnect(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSASendDisconnect(a0, a1);\n    } __finally {\n        _PrintExit(\"WSASendDisconnect(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_WSASendTo(SOCKET a0,\n                             LPWSABUF a1,\n                             DWORD a2,\n                             LPDWORD a3,\n                             DWORD a4,\n                             sockaddr* a5,\n                             int a6,\n                             LPWSAOVERLAPPED a7,\n                             LPWSAOVERLAPPED_COMPLETION_ROUTINE a8)\n{\n    _PrintEnter(\"WSASendTo(%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSASendTo(a0, a1, a2, a3, a4, a5, a6, a7, a8);\n    } __finally {\n        _PrintExit(\"WSASendTo(,,,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nFARPROC __stdcall Mine_WSASetBlockingHook(FARPROC a0)\n{\n    _PrintEnter(\"WSASetBlockingHook(%p)\\n\", a0);\n\n    FARPROC rv = 0;\n    __try {\n        rv = Real_WSASetBlockingHook(a0);\n    } __finally {\n        _PrintExit(\"WSASetBlockingHook() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WSASetEvent(HANDLE a0)\n{\n    _PrintEnter(\"WSASetEvent(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WSASetEvent(a0);\n    } __finally {\n        _PrintExit(\"WSASetEvent() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nINT __stdcall Mine_WSASetServiceA(LPWSAQUERYSETA a0,\n                                  WSAESETSERVICEOP a1,\n                                  DWORD a2)\n{\n    _PrintEnter(\"WSASetServiceA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSASetServiceA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WSASetServiceA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nINT __stdcall Mine_WSASetServiceW(LPWSAQUERYSETW a0,\n                                  WSAESETSERVICEOP a1,\n                                  DWORD a2)\n{\n    _PrintEnter(\"WSASetServiceW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSASetServiceW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WSASetServiceW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nSOCKET __stdcall Mine_WSASocketA(int a0,\n                                 int a1,\n                                 int a2,\n                                 LPWSAPROTOCOL_INFOA a3,\n                                 GROUP a4,\n                                 DWORD a5)\n{\n    _PrintEnter(\"WSASocketA(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    SOCKET rv = 0;\n    __try {\n        rv = Real_WSASocketA(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"WSASocketA(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nSOCKET __stdcall Mine_WSASocketW(int a0,\n                                 int a1,\n                                 int a2,\n                                 LPWSAPROTOCOL_INFOW a3,\n                                 GROUP a4,\n                                 DWORD a5)\n{\n    _PrintEnter(\"WSASocketW(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    SOCKET rv = 0;\n    __try {\n        rv = Real_WSASocketW(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"WSASocketW(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_WSAStartup(WORD a0,\n                              LPWSADATA a1)\n{\n    _PrintEnter(\"WSAStartup(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSAStartup(a0, a1);\n    } __finally {\n        _PrintExit(\"WSAStartup(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nINT __stdcall Mine_WSAStringToAddressA(LPSTR a0,\n                                       INT a1,\n                                       LPWSAPROTOCOL_INFOA a2,\n                                       LPSOCKADDR a3,\n                                       LPINT a4)\n{\n    _PrintEnter(\"WSAStringToAddressA(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSAStringToAddressA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WSAStringToAddressA(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nINT __stdcall Mine_WSAStringToAddressW(LPWSTR a0,\n                                       INT a1,\n                                       LPWSAPROTOCOL_INFOW a2,\n                                       LPSOCKADDR a3,\n                                       LPINT a4)\n{\n    _PrintEnter(\"WSAStringToAddressW(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSAStringToAddressW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WSAStringToAddressW(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_WSAUnhookBlockingHook(void)\n{\n    _PrintEnter(\"WSAUnhookBlockingHook()\\n\");\n\n    int rv = 0;\n    __try {\n        rv = Real_WSAUnhookBlockingHook();\n    } __finally {\n        _PrintExit(\"WSAUnhookBlockingHook() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_WSAWaitForMultipleEvents(DWORD a0,\n                                              void** a1,\n                                              BOOL a2,\n                                              DWORD a3,\n                                              BOOL a4)\n{\n    _PrintEnter(\"WSAWaitForMultipleEvents(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_WSAWaitForMultipleEvents(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WSAWaitForMultipleEvents(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WaitCommEvent(HANDLE a0,\n                                  LPDWORD a1,\n                                  LPOVERLAPPED a2)\n{\n    _PrintEnter(\"WaitCommEvent(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WaitCommEvent(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WaitCommEvent(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\n#if !defined(DETOURS_ARM)\nBOOL __stdcall Mine_WaitForDebugEvent(LPDEBUG_EVENT a0,\n                                      DWORD a1)\n{\n    _PrintEnter(\"WaitForDebugEvent(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WaitForDebugEvent(a0, a1);\n    } __finally {\n        if (rv) {\n            _PrintExit(\"WaitForDebugEvent(%d,) -> %p\\n\", a0->dwDebugEventCode, rv);\n        }\n        else {\n            _PrintExit(\"WaitForDebugEvent(,) -> %p\\n\", rv);\n        }\n    };\n    return rv;\n}\n#endif // !DETOURS_ARM\n\nDWORD __stdcall Mine_WaitForInputIdle(HANDLE a0,\n                                      DWORD a1)\n{\n    _PrintEnter(\"WaitForInputIdle(%p,%p)\\n\", a0, a1);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_WaitForInputIdle(a0, a1);\n    } __finally {\n        _PrintExit(\"WaitForInputIdle(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_WaitForMultipleObjects(DWORD a0,\n                                            void** a1,\n                                            BOOL a2,\n                                            DWORD a3)\n{\n    _PrintEnter(\"WaitForMultipleObjects(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_WaitForMultipleObjects(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"WaitForMultipleObjects(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_WaitForMultipleObjectsEx(DWORD a0,\n                                              void** a1,\n                                              BOOL a2,\n                                              DWORD a3,\n                                              BOOL a4)\n{\n    _PrintEnter(\"WaitForMultipleObjectsEx(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_WaitForMultipleObjectsEx(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WaitForMultipleObjectsEx(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_WaitForSingleObject(HANDLE a0,\n                                         DWORD a1)\n{\n    _PrintEnter(\"WaitForSingleObject(%p,%p)\\n\", a0, a1);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_WaitForSingleObject(a0, a1);\n    } __finally {\n        _PrintExit(\"WaitForSingleObject(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_WaitForSingleObjectEx(HANDLE a0,\n                                           DWORD a1,\n                                           BOOL a2)\n{\n    _PrintEnter(\"WaitForSingleObjectEx(%p,%p,%p)\\n\", a0, a1, a2);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_WaitForSingleObjectEx(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WaitForSingleObjectEx(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WaitMessage(void)\n{\n    _PrintEnter(\"WaitMessage()\\n\");\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WaitMessage();\n    } __finally {\n        _PrintExit(\"WaitMessage() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WaitNamedPipeA(LPCSTR a0,\n                                   DWORD a1)\n{\n    _PrintEnter(\"WaitNamedPipeA(%hs,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WaitNamedPipeA(a0, a1);\n    } __finally {\n        _PrintExit(\"WaitNamedPipeA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WaitNamedPipeW(LPCWSTR a0,\n                                   DWORD a1)\n{\n    _PrintEnter(\"WaitNamedPipeW(%ls,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WaitNamedPipeW(a0, a1);\n    } __finally {\n        _PrintExit(\"WaitNamedPipeW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WidenPath(HDC a0)\n{\n    _PrintEnter(\"WidenPath(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WidenPath(a0);\n    } __finally {\n        _PrintExit(\"WidenPath() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine_WinExec(LPCSTR a0,\n                            UINT a1)\n{\n    _PrintEnter(\"WinExec(%hs,%p)\\n\", a0, a1);\n\n    UINT rv = 0;\n    __try {\n        rv = Real_WinExec(a0, a1);\n    } __finally {\n        _PrintExit(\"WinExec(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WinHelpA(HWND a0,\n                             LPCSTR a1,\n                             UINT a2,\n                             ULONG_PTR a3)\n{\n    _PrintEnter(\"WinHelpA(%p,%hs,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WinHelpA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"WinHelpA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WinHelpW(HWND a0,\n                             LPCWSTR a1,\n                             UINT a2,\n                             ULONG_PTR a3)\n{\n    _PrintEnter(\"WinHelpW(%p,%ls,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WinHelpW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"WinHelpW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_WindowFromDC(HDC a0)\n{\n    _PrintEnter(\"WindowFromDC(%p)\\n\", a0);\n\n    HWND rv = 0;\n    __try {\n        rv = Real_WindowFromDC(a0);\n    } __finally {\n        _PrintExit(\"WindowFromDC() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHWND __stdcall Mine_WindowFromPoint(POINT a0)\n{\n    _PrintEnter(\"WindowFromPoint(%p)\\n\", a0);\n\n    HWND rv = 0;\n    __try {\n        rv = Real_WindowFromPoint(a0);\n    } __finally {\n        _PrintExit(\"WindowFromPoint() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_WriteClassStg(LPSTORAGE a0,\n                                     CONST IID& a1)\n{\n    _PrintEnter(\"WriteClassStg(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_WriteClassStg(a0, a1);\n    } __finally {\n        _PrintExit(\"WriteClassStg(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_WriteClassStm(LPSTREAM a0,\n                                     CONST IID& a1)\n{\n    _PrintEnter(\"WriteClassStm(%p,%p)\\n\", a0, a1);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_WriteClassStm(a0, a1);\n    } __finally {\n        _PrintExit(\"WriteClassStm(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WriteConsoleA(HANDLE a0,\n                                  void* a1,\n                                  DWORD a2,\n                                  LPDWORD a3,\n                                  LPVOID a4)\n{\n    _PrintEnter(\"WriteConsoleA(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WriteConsoleA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WriteConsoleA(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WriteConsoleInputA(HANDLE a0,\n                                       INPUT_RECORD* a1,\n                                       DWORD a2,\n                                       LPDWORD a3)\n{\n    _PrintEnter(\"WriteConsoleInputA(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WriteConsoleInputA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"WriteConsoleInputA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WriteConsoleInputW(HANDLE a0,\n                                       INPUT_RECORD* a1,\n                                       DWORD a2,\n                                       LPDWORD a3)\n{\n    _PrintEnter(\"WriteConsoleInputW(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WriteConsoleInputW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"WriteConsoleInputW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WriteConsoleOutputA(HANDLE a0,\n                                        CHAR_INFO* a1,\n                                        COORD a2,\n                                        COORD a3,\n                                        PSMALL_RECT a4)\n{\n    _PrintEnter(\"WriteConsoleOutputA(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WriteConsoleOutputA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WriteConsoleOutputA(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WriteConsoleOutputAttribute(HANDLE a0,\n                                                WORD* a1,\n                                                DWORD a2,\n                                                COORD a3,\n                                                LPDWORD a4)\n{\n    _PrintEnter(\"WriteConsoleOutputAttribute(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WriteConsoleOutputAttribute(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WriteConsoleOutputAttribute(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WriteConsoleOutputCharacterA(HANDLE a0,\n                                                 LPCSTR a1,\n                                                 DWORD a2,\n                                                 COORD a3,\n                                                 LPDWORD a4)\n{\n    _PrintEnter(\"WriteConsoleOutputCharacterA(%p,%hs,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WriteConsoleOutputCharacterA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WriteConsoleOutputCharacterA(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WriteConsoleOutputCharacterW(HANDLE a0,\n                                                 LPCWSTR a1,\n                                                 DWORD a2,\n                                                 COORD a3,\n                                                 LPDWORD a4)\n{\n    _PrintEnter(\"WriteConsoleOutputCharacterW(%p,%ls,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WriteConsoleOutputCharacterW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WriteConsoleOutputCharacterW(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WriteConsoleOutputW(HANDLE a0,\n                                        CHAR_INFO* a1,\n                                        COORD a2,\n                                        COORD a3,\n                                        PSMALL_RECT a4)\n{\n    _PrintEnter(\"WriteConsoleOutputW(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WriteConsoleOutputW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WriteConsoleOutputW(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WriteConsoleW(HANDLE a0,\n                                  void* a1,\n                                  DWORD a2,\n                                  LPDWORD a3,\n                                  LPVOID a4)\n{\n    _PrintEnter(\"WriteConsoleW(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WriteConsoleW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WriteConsoleW(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WriteFile(HANDLE a0,\n                              LPCVOID a1,\n                              DWORD a2,\n                              LPDWORD a3,\n                              LPOVERLAPPED a4)\n{\n    _PrintEnter(\"WriteFile(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WriteFile(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WriteFile(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WriteFileEx(HANDLE a0,\n                                LPCVOID a1,\n                                DWORD a2,\n                                LPOVERLAPPED a3,\n                                LPOVERLAPPED_COMPLETION_ROUTINE a4)\n{\n    _PrintEnter(\"WriteFileEx(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WriteFileEx(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WriteFileEx(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHRESULT __stdcall Mine_WriteFmtUserTypeStg(LPSTORAGE a0,\n                                           CLIPFORMAT a1,\n                                           LPOLESTR a2)\n{\n    _PrintEnter(\"WriteFmtUserTypeStg(%p,%p,%p)\\n\", a0, a1, a2);\n\n    HRESULT rv = 0;\n    __try {\n        rv = Real_WriteFmtUserTypeStg(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WriteFmtUserTypeStg(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WritePrivateProfileSectionA(LPCSTR a0,\n                                                LPCSTR a1,\n                                                LPCSTR a2)\n{\n    _PrintEnter(\"WritePrivateProfileSectionA(%hs,%hs,%hs)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WritePrivateProfileSectionA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WritePrivateProfileSectionA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WritePrivateProfileSectionW(LPCWSTR a0,\n                                                LPCWSTR a1,\n                                                LPCWSTR a2)\n{\n    _PrintEnter(\"WritePrivateProfileSectionW(%ls,%ls,%ls)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WritePrivateProfileSectionW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WritePrivateProfileSectionW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WritePrivateProfileStringA(LPCSTR a0,\n                                               LPCSTR a1,\n                                               LPCSTR a2,\n                                               LPCSTR a3)\n{\n    _PrintEnter(\"WritePrivateProfileStringA(%hs,%hs,%hs,%hs)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WritePrivateProfileStringA(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"WritePrivateProfileStringA(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WritePrivateProfileStringW(LPCWSTR a0,\n                                               LPCWSTR a1,\n                                               LPCWSTR a2,\n                                               LPCWSTR a3)\n{\n    _PrintEnter(\"WritePrivateProfileStringW(%ls,%ls,%ls,%ls)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WritePrivateProfileStringW(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"WritePrivateProfileStringW(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WritePrivateProfileStructA(LPCSTR a0,\n                                               LPCSTR a1,\n                                               LPVOID a2,\n                                               UINT a3,\n                                               LPCSTR a4)\n{\n    _PrintEnter(\"WritePrivateProfileStructA(%hs,%hs,%p,%p,%hs)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WritePrivateProfileStructA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WritePrivateProfileStructA(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WritePrivateProfileStructW(LPCWSTR a0,\n                                               LPCWSTR a1,\n                                               LPVOID a2,\n                                               UINT a3,\n                                               LPCWSTR a4)\n{\n    _PrintEnter(\"WritePrivateProfileStructW(%ls,%ls,%p,%p,%ls)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WritePrivateProfileStructW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WritePrivateProfileStructW(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WriteProcessMemory(HANDLE a0,\n                                       LPVOID lpBase,\n                                       LPVOID lpBuf,\n                                       DWORD_PTR nSize,\n                                       PDWORD_PTR a4)\n{\n    _PrintEnter(\"WriteProcessMemory(%p,@%p..%p,%p,%p)\\n\",\n                a0, lpBase,\n                (PBYTE)lpBase + ((nSize > 0) ? nSize - 1 : 0),\n                lpBuf, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WriteProcessMemory(a0, lpBase, lpBuf, nSize, a4);\n    } __finally {\n        _PrintExit(\"WriteProcessMemory(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WriteProfileSectionA(LPCSTR a0,\n                                         LPCSTR a1)\n{\n    _PrintEnter(\"WriteProfileSectionA(%hs,%hs)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WriteProfileSectionA(a0, a1);\n    } __finally {\n        _PrintExit(\"WriteProfileSectionA(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WriteProfileSectionW(LPCWSTR a0,\n                                         LPCWSTR a1)\n{\n    _PrintEnter(\"WriteProfileSectionW(%ls,%ls)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WriteProfileSectionW(a0, a1);\n    } __finally {\n        _PrintExit(\"WriteProfileSectionW(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WriteProfileStringA(LPCSTR a0,\n                                        LPCSTR a1,\n                                        LPCSTR a2)\n{\n    _PrintEnter(\"WriteProfileStringA(%hs,%hs,%hs)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WriteProfileStringA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WriteProfileStringA(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL __stdcall Mine_WriteProfileStringW(LPCWSTR a0,\n                                        LPCWSTR a1,\n                                        LPCWSTR a2)\n{\n    _PrintEnter(\"WriteProfileStringW(%ls,%ls,%ls)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WriteProfileStringW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WriteProfileStringW(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD __stdcall Mine_WriteTapemark(HANDLE a0,\n                                   DWORD a1,\n                                   DWORD a2,\n                                   BOOL a3)\n{\n    _PrintEnter(\"WriteTapemark(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_WriteTapemark(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"WriteTapemark(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine___WSAFDIsSet(SOCKET a0,\n                                fd_set* a1)\n{\n    _PrintEnter(\"__WSAFDIsSet(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real___WSAFDIsSet(a0, a1);\n    } __finally {\n        _PrintExit(\"__WSAFDIsSet(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nlong __stdcall Mine__hread(HFILE a0,\n                           LPVOID a1,\n                           long a2)\n{\n    _PrintEnter(\"_hread(%p,%p,%p)\\n\", a0, a1, a2);\n\n    long rv = 0;\n    __try {\n        rv = Real__hread(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"_hread(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nlong __stdcall Mine__hwrite(HFILE a0,\n                            LPCSTR a1,\n                            long a2)\n{\n    _PrintEnter(\"_hwrite(%p,%hs,%p)\\n\", a0, a1, a2);\n\n    long rv = 0;\n    __try {\n        rv = Real__hwrite(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"_hwrite(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHFILE __stdcall Mine__lclose(HFILE a0)\n{\n    _PrintEnter(\"_lclose(%p)\\n\", a0);\n\n    HFILE rv = 0;\n    __try {\n        rv = Real__lclose(a0);\n    } __finally {\n        _PrintExit(\"_lclose() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHFILE __stdcall Mine__lcreat(LPCSTR a0,\n                             int a1)\n{\n    _PrintEnter(\"_lcreat(%hs,%p)\\n\", a0, a1);\n\n    HFILE rv = 0;\n    __try {\n        rv = Real__lcreat(a0, a1);\n    } __finally {\n        _PrintExit(\"_lcreat(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLONG __stdcall Mine__llseek(HFILE a0,\n                            LONG a1,\n                            int a2)\n{\n    _PrintEnter(\"_llseek(%p,%p,%p)\\n\", a0, a1, a2);\n\n    LONG rv = 0;\n    __try {\n        rv = Real__llseek(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"_llseek(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHFILE __stdcall Mine__lopen(LPCSTR a0,\n                            int a1)\n{\n    _PrintEnter(\"_lopen(%hs,%p)\\n\", a0, a1);\n\n    HFILE rv = 0;\n    __try {\n        rv = Real__lopen(a0, a1);\n    } __finally {\n        _PrintExit(\"_lopen(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine__lread(HFILE a0,\n                           LPVOID a1,\n                           UINT a2)\n{\n    _PrintEnter(\"_lread(%p,%p,%p)\\n\", a0, a1, a2);\n\n    UINT rv = 0;\n    __try {\n        rv = Real__lread(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"_lread(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nUINT __stdcall Mine__lwrite(HFILE a0,\n                            LPCSTR a1,\n                            UINT a2)\n{\n    _PrintEnter(\"_lwrite(%p,%hs,%p)\\n\", a0, a1, a2);\n\n    UINT rv = 0;\n    __try {\n        rv = Real__lwrite(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"_lwrite(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nSOCKET __stdcall Mine_accept(SOCKET a0,\n                             sockaddr* a1,\n                             int* a2)\n{\n    _PrintEnter(\"accept(%p,%p,%p)\\n\", a0, a1, a2);\n\n    SOCKET rv = 0;\n    __try {\n        rv = Real_accept(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"accept(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_bind(SOCKET a0,\n                        sockaddr* a1,\n                        int a2)\n{\n    _PrintEnter(\"bind(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_bind(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"bind(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_closesocket(SOCKET a0)\n{\n    _PrintEnter(\"closesocket(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_closesocket(a0);\n    } __finally {\n        _PrintExit(\"closesocket() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_connect(SOCKET a0,\n                           sockaddr* a1,\n                           int a2)\n{\n    _PrintEnter(\"connect(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_connect(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"connect(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nhostent* __stdcall Mine_gethostbyaddr(char* a0,\n                                      int a1,\n                                      int a2)\n{\n    _PrintEnter(\"gethostbyaddr(%p,%p,%p)\\n\", a0, a1, a2);\n\n    hostent* rv = 0;\n    __try {\n        rv = Real_gethostbyaddr(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"gethostbyaddr(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nhostent* __stdcall Mine_gethostbyname(char* a0)\n{\n    _PrintEnter(\"gethostbyname(%p)\\n\", a0);\n\n    hostent* rv = 0;\n    __try {\n        rv = Real_gethostbyname(a0);\n    } __finally {\n        _PrintExit(\"gethostbyname() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_gethostname(char* a0,\n                               int a1)\n{\n    _PrintEnter(\"gethostname(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_gethostname(a0, a1);\n    } __finally {\n        _PrintExit(\"gethostname(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_getpeername(SOCKET a0,\n                               sockaddr* a1,\n                               int* a2)\n{\n    _PrintEnter(\"getpeername(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_getpeername(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"getpeername(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nprotoent* __stdcall Mine_getprotobyname(char* a0)\n{\n    _PrintEnter(\"getprotobyname(%p)\\n\", a0);\n\n    protoent* rv = 0;\n    __try {\n        rv = Real_getprotobyname(a0);\n    } __finally {\n        _PrintExit(\"getprotobyname() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nprotoent* __stdcall Mine_getprotobynumber(int a0)\n{\n    _PrintEnter(\"getprotobynumber(%p)\\n\", a0);\n\n    protoent* rv = 0;\n    __try {\n        rv = Real_getprotobynumber(a0);\n    } __finally {\n        _PrintExit(\"getprotobynumber() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nservent* __stdcall Mine_getservbyname(char* a0,\n                                      char* a1)\n{\n    _PrintEnter(\"getservbyname(%p,%p)\\n\", a0, a1);\n\n    servent* rv = 0;\n    __try {\n        rv = Real_getservbyname(a0, a1);\n    } __finally {\n        _PrintExit(\"getservbyname(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nservent* __stdcall Mine_getservbyport(int a0,\n                                      char* a1)\n{\n    _PrintEnter(\"getservbyport(%p,%p)\\n\", a0, a1);\n\n    servent* rv = 0;\n    __try {\n        rv = Real_getservbyport(a0, a1);\n    } __finally {\n        _PrintExit(\"getservbyport(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_getsockname(SOCKET a0,\n                               sockaddr* a1,\n                               int* a2)\n{\n    _PrintEnter(\"getsockname(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_getsockname(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"getsockname(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_getsockopt(SOCKET a0,\n                              int a1,\n                              int a2,\n                              char* a3,\n                              int* a4)\n{\n    _PrintEnter(\"getsockopt(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    int rv = 0;\n    __try {\n        rv = Real_getsockopt(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"getsockopt(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nu_long __stdcall Mine_htonl(u_long a0)\n{\n    _PrintEnter(\"htonl(%p)\\n\", a0);\n\n    u_long rv = 0;\n    __try {\n        rv = Real_htonl(a0);\n    } __finally {\n        _PrintExit(\"htonl() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nu_short __stdcall Mine_htons(u_short a0)\n{\n    _PrintEnter(\"htons(%p)\\n\", a0);\n\n    u_short rv = 0;\n    __try {\n        rv = Real_htons(a0);\n    } __finally {\n        _PrintExit(\"htons() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nunsigned long __stdcall Mine_inet_addr(char* a0)\n{\n    _PrintEnter(\"inet_addr(%p)\\n\", a0);\n\n    unsigned long rv = 0;\n    __try {\n        rv = Real_inet_addr(a0);\n    } __finally {\n        _PrintExit(\"inet_addr() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nchar* __stdcall Mine_inet_ntoa(in_addr a0)\n{\n    _PrintEnter(\"inet_ntoa(%p)\\n\", a0);\n\n    char* rv = 0;\n    __try {\n        rv = Real_inet_ntoa(a0);\n    } __finally {\n        _PrintExit(\"inet_ntoa() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_ioctlsocket(SOCKET a0,\n                               long a1,\n                               u_long* a2)\n{\n    _PrintEnter(\"ioctlsocket(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_ioctlsocket(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"ioctlsocket(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nvoid __stdcall Mine_keybd_event(BYTE a0,\n                                BYTE a1,\n                                DWORD a2,\n                                ULONG_PTR a3)\n{\n    _PrintEnter(\"keybd_event(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    __try {\n        Real_keybd_event(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"keybd_event(,,,) ->\\n\");\n    };\n}\n\nint __stdcall Mine_listen(SOCKET a0,\n                          int a1)\n{\n    _PrintEnter(\"listen(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_listen(a0, a1);\n    } __finally {\n        _PrintExit(\"listen(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nvoid __stdcall Mine_mouse_event(DWORD a0,\n                                DWORD a1,\n                                DWORD a2,\n                                DWORD a3,\n                                ULONG_PTR a4)\n{\n    _PrintEnter(\"mouse_event(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    __try {\n        Real_mouse_event(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"mouse_event(,,,,) ->\\n\");\n    };\n}\n\nu_long __stdcall Mine_ntohl(u_long a0)\n{\n    _PrintEnter(\"ntohl(%p)\\n\", a0);\n\n    u_long rv = 0;\n    __try {\n        rv = Real_ntohl(a0);\n    } __finally {\n        _PrintExit(\"ntohl() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nu_short __stdcall Mine_ntohs(u_short a0)\n{\n    _PrintEnter(\"ntohs(%p)\\n\", a0);\n\n    u_short rv = 0;\n    __try {\n        rv = Real_ntohs(a0);\n    } __finally {\n        _PrintExit(\"ntohs() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_recv(SOCKET a0,\n                        char* a1,\n                        int a2,\n                        int a3)\n{\n    _PrintEnter(\"recv(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    int rv = 0;\n    __try {\n        rv = Real_recv(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"recv(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_recvfrom(SOCKET a0,\n                            char* a1,\n                            int a2,\n                            int a3,\n                            sockaddr* a4,\n                            int* a5)\n{\n    _PrintEnter(\"recvfrom(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    int rv = 0;\n    __try {\n        rv = Real_recvfrom(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"recvfrom(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_select(int a0,\n                          fd_set* a1,\n                          fd_set* a2,\n                          fd_set* a3,\n                          timeval* a4)\n{\n    _PrintEnter(\"select(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    int rv = 0;\n    __try {\n        rv = Real_select(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"select(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_send(SOCKET a0,\n                        char* a1,\n                        int a2,\n                        int a3)\n{\n    _PrintEnter(\"send(%p,%p,%p,%p)\\n\", a0, a1, a2, a3);\n\n    int rv = 0;\n    __try {\n        rv = Real_send(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"send(,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_sendto(SOCKET a0,\n                          char* a1,\n                          int a2,\n                          int a3,\n                          sockaddr* a4,\n                          int a5)\n{\n    _PrintEnter(\"sendto(%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    int rv = 0;\n    __try {\n        rv = Real_sendto(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"sendto(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_setsockopt(SOCKET a0,\n                              int a1,\n                              int a2,\n                              char* a3,\n                              int a4)\n{\n    _PrintEnter(\"setsockopt(%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    int rv = 0;\n    __try {\n        rv = Real_setsockopt(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"setsockopt(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint __stdcall Mine_shutdown(SOCKET a0,\n                            int a1)\n{\n    _PrintEnter(\"shutdown(%p,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_shutdown(a0, a1);\n    } __finally {\n        _PrintExit(\"shutdown(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nSOCKET __stdcall Mine_socket(int a0,\n                             int a1,\n                             int a2)\n{\n    _PrintEnter(\"socket(%x,%x,%x)\\n\", a0, a1, a2);\n\n    SOCKET rv = 0;\n    __try {\n        rv = Real_socket(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"socket(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\n////////////////////////////////////////////////////////////// AttachDetours.\n//\nstatic PCHAR DetRealName(PCHAR psz)\n{\n    PCHAR pszBeg = psz;\n    // Move to end of name.\n    while (*psz) {\n        psz++;\n    }\n    // Move back through A-Za-z0-9 names.\n    while (psz > pszBeg &&\n           ((psz[-1] >= 'A' && psz[-1] <= 'Z') ||\n            (psz[-1] >= 'a' && psz[-1] <= 'z') ||\n            (psz[-1] >= '0' && psz[-1] <= '9'))) {\n        psz--;\n    }\n    return psz;\n}\n\nstatic VOID Dump(PBYTE pbBytes, LONG nBytes, PBYTE pbTarget)\n{\n    CHAR szBuffer[256];\n    PCHAR pszBuffer = szBuffer;\n\n    for (LONG n = 0; n < nBytes; n += 12) {\n        pszBuffer += StringCchPrintfA(pszBuffer, sizeof(szBuffer), \"  %p: \", pbBytes + n);\n        for (LONG m = n; m < n + 12; m++) {\n            if (m >= nBytes) {\n                pszBuffer += StringCchPrintfA(pszBuffer, sizeof(szBuffer), \"   \");\n            }\n            else {\n                pszBuffer += StringCchPrintfA(pszBuffer, sizeof(szBuffer), \"%02x \", pbBytes[m]);\n            }\n        }\n        if (n == 0) {\n            pszBuffer += StringCchPrintfA(pszBuffer, sizeof(szBuffer), \"[%p]\", pbTarget);\n        }\n        pszBuffer += StringCchPrintfA(pszBuffer, sizeof(szBuffer), \"\\n\");\n    }\n\n    Syelog(SYELOG_SEVERITY_INFORMATION, \"%s\", szBuffer);\n}\n\nstatic VOID Decode(PBYTE pbCode, LONG nInst)\n{\n    PBYTE pbSrc = pbCode;\n    PBYTE pbEnd;\n    PBYTE pbTarget;\n    for (LONG n = 0; n < nInst; n++) {\n        pbTarget = NULL;\n        pbEnd = (PBYTE)DetourCopyInstruction(NULL, NULL, (PVOID)pbSrc, (PVOID*)&pbTarget, NULL);\n        Dump(pbSrc, (int)(pbEnd - pbSrc), pbTarget);\n        pbSrc = pbEnd;\n\n        if (pbTarget != NULL) {\n            break;\n        }\n    }\n}\n\nVOID DetAttach(PVOID *ppvReal, PVOID pvMine, PCHAR psz)\n{\n    PVOID pvReal = NULL;\n    if (ppvReal == NULL) {\n        ppvReal = &pvReal;\n    }\n\n    LONG l = DetourAttach(ppvReal, pvMine);\n    if (l != 0) {\n        Syelog(SYELOG_SEVERITY_NOTICE,\n               \"Attach failed: `%s': error %d\\n\", DetRealName(psz), l);\n\n        Decode((PBYTE)*ppvReal, 3);\n    }\n}\n\nVOID DetDetach(PVOID *ppvReal, PVOID pvMine, PCHAR psz)\n{\n    LONG l = DetourDetach(ppvReal, pvMine);\n    if (l != 0) {\n#if 0\n        Syelog(SYELOG_SEVERITY_NOTICE,\n               \"Detach failed: `%s': error %d\\n\", DetRealName(psz), l);\n#else\n        (void)psz;\n#endif\n    }\n}\n\n#define ATTACH(x)       DetAttach(&(PVOID&)Real_##x,Mine_##x,#x)\n#define DETACH(x)       DetDetach(&(PVOID&)Real_##x,Mine_##x,#x)\n\nLONG AttachDetours(VOID)\n{\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n\n    // For this many APIs, we'll ignore one or two can't be detoured.\n    DetourSetIgnoreTooSmall(TRUE);\n\n    ATTACH(AbortDoc);\n    ATTACH(AbortPath);\n    ATTACH(ActivateKeyboardLayout);\n    ATTACH(AddAtomA);\n    ATTACH(AddAtomW);\n    ATTACH(AddFontResourceA);\n    ATTACH(AddFontResourceW);\n    ATTACH(AdjustWindowRect);\n    ATTACH(AdjustWindowRectEx);\n    ATTACH(AllocConsole);\n    ATTACH(AngleArc);\n    ATTACH(AnimatePalette);\n    ATTACH(AnyPopup);\n    ATTACH(AppendMenuA);\n    ATTACH(AppendMenuW);\n    ATTACH(Arc);\n    ATTACH(ArcTo);\n    ATTACH(AreFileApisANSI);\n    ATTACH(ArrangeIconicWindows);\n    ATTACH(AttachThreadInput);\n    ATTACH(BackupRead);\n    ATTACH(BackupSeek);\n    ATTACH(BackupWrite);\n    ATTACH(Beep);\n    ATTACH(BeginDeferWindowPos);\n    ATTACH(BeginPaint);\n    ATTACH(BeginPath);\n    ATTACH(BeginUpdateResourceA);\n    ATTACH(BeginUpdateResourceW);\n    ATTACH(BindMoniker);\n    ATTACH(BitBlt);\n    ATTACH(BringWindowToTop);\n    ATTACH(BroadcastSystemMessageA);\n    ATTACH(BroadcastSystemMessageW);\n    ATTACH(BuildCommDCBA);\n    ATTACH(BuildCommDCBAndTimeoutsA);\n    ATTACH(BuildCommDCBAndTimeoutsW);\n    ATTACH(BuildCommDCBW);\n    ATTACH(CLSIDFromProgID);\n    ATTACH(CLSIDFromString);\n    ATTACH(CallMsgFilterA);\n    ATTACH(CallMsgFilterW);\n    ATTACH(CallNamedPipeA);\n    ATTACH(CallNamedPipeW);\n    ATTACH(CallNextHookEx);\n    ATTACH(CallWindowProcA);\n    ATTACH(CallWindowProcW);\n    ATTACH(CancelDC);\n    ATTACH(CancelIo);\n    ATTACH(CancelWaitableTimer);\n    ATTACH(CascadeWindows);\n    ATTACH(ChangeClipboardChain);\n    ATTACH(ChangeDisplaySettingsA);\n    ATTACH(ChangeDisplaySettingsExA);\n    ATTACH(ChangeDisplaySettingsExW);\n    ATTACH(ChangeDisplaySettingsW);\n    ATTACH(ChangeMenuA);\n    ATTACH(ChangeMenuW);\n    ATTACH(CharLowerA);\n    ATTACH(CharLowerBuffA);\n    ATTACH(CharLowerBuffW);\n    ATTACH(CharLowerW);\n    ATTACH(CharNextA);\n    ATTACH(CharNextExA);\n    ATTACH(CharNextW);\n    ATTACH(CharPrevA);\n    ATTACH(CharPrevExA);\n    ATTACH(CharPrevW);\n    ATTACH(CharToOemA);\n    ATTACH(CharToOemBuffA);\n    ATTACH(CharToOemBuffW);\n    ATTACH(CharToOemW);\n    ATTACH(CharUpperA);\n    ATTACH(CharUpperBuffA);\n    ATTACH(CharUpperBuffW);\n    ATTACH(CharUpperW);\n    ATTACH(CheckColorsInGamut);\n    ATTACH(CheckDlgButton);\n    ATTACH(CheckMenuItem);\n    ATTACH(CheckMenuRadioItem);\n    ATTACH(CheckRadioButton);\n    ATTACH(ChildWindowFromPoint);\n    ATTACH(ChildWindowFromPointEx);\n    ATTACH(ChoosePixelFormat);\n    ATTACH(Chord);\n    ATTACH(ClearCommBreak);\n    ATTACH(ClearCommError);\n    ATTACH(ClientToScreen);\n    ATTACH(ClipCursor);\n    ATTACH(CloseClipboard);\n    ATTACH(CloseDesktop);\n    ATTACH(CloseEnhMetaFile);\n    ATTACH(CloseFigure);\n    ATTACH(CloseHandle);\n    ATTACH(CloseMetaFile);\n    ATTACH(CloseWindow);\n    ATTACH(CloseWindowStation);\n    ATTACH(CoAddRefServerProcess);\n    ATTACH(CoBuildVersion);\n    ATTACH(CoCopyProxy);\n    ATTACH(CoCreateFreeThreadedMarshaler);\n    ATTACH(CoCreateGuid);\n    ATTACH(CoCreateInstance);\n    ATTACH(CoCreateInstanceEx);\n    ATTACH(CoDisconnectObject);\n    ATTACH(CoDosDateTimeToFileTime);\n    ATTACH(CoFileTimeNow);\n    ATTACH(CoFileTimeToDosDateTime);\n    ATTACH(CoFreeAllLibraries);\n    ATTACH(CoFreeLibrary);\n    ATTACH(CoFreeUnusedLibraries);\n    ATTACH(CoGetCallContext);\n    ATTACH(CoGetClassObject);\n    ATTACH(CoGetCurrentProcess);\n    ATTACH(CoGetInstanceFromFile);\n    ATTACH(CoGetInstanceFromIStorage);\n    ATTACH(CoGetInterfaceAndReleaseStream);\n    ATTACH(CoGetMalloc);\n    ATTACH(CoGetMarshalSizeMax);\n    ATTACH(CoGetObject);\n    ATTACH(CoGetPSClsid);\n    ATTACH(CoGetStandardMarshal);\n    ATTACH(CoGetStdMarshalEx);\n    ATTACH(CoGetTreatAsClass);\n    ATTACH(CoImpersonateClient);\n    ATTACH(CoInitialize);\n    ATTACH(CoInitializeEx);\n    ATTACH(CoInitializeSecurity);\n    ATTACH(CoIsHandlerConnected);\n    ATTACH(CoIsOle1Class);\n    ATTACH(CoLoadLibrary);\n    ATTACH(CoLockObjectExternal);\n    ATTACH(CoMarshalHresult);\n    ATTACH(CoMarshalInterThreadInterfaceInStream);\n    ATTACH(CoMarshalInterface);\n    ATTACH(CoQueryAuthenticationServices);\n    ATTACH(CoQueryClientBlanket);\n    ATTACH(CoQueryProxyBlanket);\n    ATTACH(CoRegisterChannelHook);\n    ATTACH(CoRegisterClassObject);\n    ATTACH(CoRegisterMallocSpy);\n    ATTACH(CoRegisterMessageFilter);\n    ATTACH(CoRegisterPSClsid);\n    ATTACH(CoRegisterSurrogate);\n    ATTACH(CoReleaseMarshalData);\n    ATTACH(CoReleaseServerProcess);\n    ATTACH(CoResumeClassObjects);\n    ATTACH(CoRevertToSelf);\n    ATTACH(CoRevokeClassObject);\n    ATTACH(CoRevokeMallocSpy);\n    ATTACH(CoSetProxyBlanket);\n    ATTACH(CoSuspendClassObjects);\n    ATTACH(CoSwitchCallContext);\n    ATTACH(CoTaskMemAlloc);\n    ATTACH(CoTaskMemFree);\n    ATTACH(CoTaskMemRealloc);\n    ATTACH(CoTreatAsClass);\n    ATTACH(CoUninitialize);\n    ATTACH(CoUnmarshalHresult);\n    ATTACH(CoUnmarshalInterface);\n    ATTACH(ColorMatchToTarget);\n    ATTACH(CombineRgn);\n    ATTACH(CombineTransform);\n    ATTACH(CommConfigDialogA);\n    ATTACH(CommConfigDialogW);\n    ATTACH(CompareFileTime);\n    ATTACH(CompareStringA);\n    ATTACH(CompareStringW);\n    ATTACH(ConnectNamedPipe);\n#if !defined(DETOURS_ARM)\n    ATTACH(ContinueDebugEvent);\n#endif // !DETOURS_ARM\n    ATTACH(ConvertDefaultLocale);\n    ATTACH(ConvertThreadToFiber);\n    ATTACH(CopyAcceleratorTableA);\n    ATTACH(CopyAcceleratorTableW);\n    ATTACH(CopyEnhMetaFileA);\n    ATTACH(CopyEnhMetaFileW);\n    ATTACH(CopyFileA);\n    ATTACH(CopyFileExA);\n    ATTACH(CopyFileExW);\n    ATTACH(CopyFileW);\n    ATTACH(CopyIcon);\n    ATTACH(CopyImage);\n    ATTACH(CopyMetaFileA);\n    ATTACH(CopyMetaFileW);\n    ATTACH(CopyRect);\n    ATTACH(CountClipboardFormats);\n    ATTACH(CreateAcceleratorTableA);\n    ATTACH(CreateAcceleratorTableW);\n    ATTACH(CreateAntiMoniker);\n    ATTACH(CreateBindCtx);\n    ATTACH(CreateBitmap);\n    ATTACH(CreateBitmapIndirect);\n    ATTACH(CreateBrushIndirect);\n    ATTACH(CreateCaret);\n    ATTACH(CreateClassMoniker);\n    ATTACH(CreateColorSpaceA);\n    ATTACH(CreateColorSpaceW);\n    ATTACH(CreateCompatibleBitmap);\n    ATTACH(CreateCompatibleDC);\n    ATTACH(CreateConsoleScreenBuffer);\n    ATTACH(CreateCursor);\n    ATTACH(CreateDCA);\n    ATTACH(CreateDCW);\n    ATTACH(CreateDIBPatternBrush);\n    ATTACH(CreateDIBPatternBrushPt);\n    ATTACH(CreateDIBSection);\n    ATTACH(CreateDIBitmap);\n    ATTACH(CreateDataAdviseHolder);\n    ATTACH(CreateDataCache);\n    ATTACH(CreateDesktopA);\n    ATTACH(CreateDesktopW);\n    ATTACH(CreateDialogIndirectParamA);\n    ATTACH(CreateDialogIndirectParamW);\n    ATTACH(CreateDialogParamA);\n    ATTACH(CreateDialogParamW);\n    ATTACH(CreateDirectoryA);\n    ATTACH(CreateDirectoryExA);\n    ATTACH(CreateDirectoryExW);\n    ATTACH(CreateDirectoryW);\n    ATTACH(CreateDiscardableBitmap);\n    ATTACH(CreateEllipticRgn);\n    ATTACH(CreateEllipticRgnIndirect);\n    ATTACH(CreateEnhMetaFileA);\n    ATTACH(CreateEnhMetaFileW);\n    ATTACH(CreateEventA);\n    ATTACH(CreateEventW);\n    ATTACH(CreateFiber);\n    ATTACH(CreateFileA);\n    ATTACH(CreateFileMappingA);\n    ATTACH(CreateFileMappingW);\n    ATTACH(CreateFileMoniker);\n    ATTACH(CreateFileW);\n    ATTACH(CreateFontA);\n    ATTACH(CreateFontIndirectA);\n    ATTACH(CreateFontIndirectW);\n    ATTACH(CreateFontW);\n    ATTACH(CreateGenericComposite);\n    ATTACH(CreateHalftonePalette);\n    ATTACH(CreateHatchBrush);\n    ATTACH(CreateICA);\n    ATTACH(CreateICW);\n    ATTACH(CreateILockBytesOnHGlobal);\n    ATTACH(CreateIcon);\n    ATTACH(CreateIconFromResource);\n    ATTACH(CreateIconFromResourceEx);\n    ATTACH(CreateIconIndirect);\n    ATTACH(CreateIoCompletionPort);\n    ATTACH(CreateItemMoniker);\n    ATTACH(CreateMDIWindowA);\n    ATTACH(CreateMDIWindowW);\n    ATTACH(CreateMailslotA);\n    ATTACH(CreateMailslotW);\n    ATTACH(CreateMenu);\n    ATTACH(CreateMetaFileA);\n    ATTACH(CreateMetaFileW);\n    ATTACH(CreateMutexA);\n    ATTACH(CreateMutexW);\n    ATTACH(CreateNamedPipeA);\n    ATTACH(CreateNamedPipeW);\n    ATTACH(CreateOleAdviseHolder);\n    ATTACH(CreatePalette);\n    ATTACH(CreatePatternBrush);\n    ATTACH(CreatePen);\n    ATTACH(CreatePenIndirect);\n    ATTACH(CreatePipe);\n    ATTACH(CreatePointerMoniker);\n    ATTACH(CreatePolyPolygonRgn);\n    ATTACH(CreatePolygonRgn);\n    ATTACH(CreatePopupMenu);\n    ATTACH(CreateProcessA);\n    ATTACH(CreateProcessW);\n    ATTACH(CreateProcessAsUserA);\n    ATTACH(CreateProcessAsUserW);\n#if(_WIN32_WINNT >= 0x0500)\n    ATTACH(CreateProcessWithLogonW);\n    ATTACH(CreateProcessWithTokenW);\n#endif //(_WIN32_WINNT >= 0x0500)\n    ATTACH(CreateRectRgn);\n    ATTACH(CreateRectRgnIndirect);\n    ATTACH(CreateRemoteThread);\n    ATTACH(CreateRoundRectRgn);\n    ATTACH(CreateScalableFontResourceA);\n    ATTACH(CreateScalableFontResourceW);\n    ATTACH(CreateSemaphoreA);\n    ATTACH(CreateSemaphoreW);\n    ATTACH(CreateSolidBrush);\n    ATTACH(CreateStdProgressIndicator);\n    ATTACH(CreateStreamOnHGlobal);\n    ATTACH(CreateTapePartition);\n    ATTACH(CreateThread);\n    ATTACH(CreateWaitableTimerA);\n    ATTACH(CreateWaitableTimerW);\n    ATTACH(CreateWindowExA);\n    ATTACH(CreateWindowExW);\n    ATTACH(CreateWindowStationA);\n    ATTACH(CreateWindowStationW);\n    ATTACH(DPtoLP);\n    ATTACH(DdeAbandonTransaction);\n    ATTACH(DdeAccessData);\n    ATTACH(DdeAddData);\n    ATTACH(DdeClientTransaction);\n    ATTACH(DdeCmpStringHandles);\n    ATTACH(DdeConnect);\n    ATTACH(DdeConnectList);\n    ATTACH(DdeCreateDataHandle);\n    ATTACH(DdeCreateStringHandleA);\n    ATTACH(DdeCreateStringHandleW);\n    ATTACH(DdeDisconnect);\n    ATTACH(DdeDisconnectList);\n    ATTACH(DdeEnableCallback);\n    ATTACH(DdeFreeDataHandle);\n    ATTACH(DdeFreeStringHandle);\n    ATTACH(DdeGetData);\n    ATTACH(DdeGetLastError);\n    ATTACH(DdeImpersonateClient);\n    ATTACH(DdeKeepStringHandle);\n    ATTACH(DdeNameService);\n    ATTACH(DdePostAdvise);\n    ATTACH(DdeQueryConvInfo);\n    ATTACH(DdeQueryNextServer);\n    ATTACH(DdeQueryStringA);\n    ATTACH(DdeQueryStringW);\n    ATTACH(DdeReconnect);\n    ATTACH(DdeSetQualityOfService);\n    ATTACH(DdeSetUserHandle);\n    ATTACH(DdeUnaccessData);\n    ATTACH(DdeUninitialize);\n    ATTACH(DebugActiveProcess);\n    ATTACH(DebugActiveProcessStop);\n    ATTACH(DebugBreak);\n    ATTACH(DefDlgProcA);\n    ATTACH(DefDlgProcW);\n    ATTACH(DefFrameProcA);\n    ATTACH(DefFrameProcW);\n    ATTACH(DefMDIChildProcA);\n    ATTACH(DefMDIChildProcW);\n    ATTACH(DefWindowProcA);\n    ATTACH(DefWindowProcW);\n    ATTACH(DeferWindowPos);\n    ATTACH(DefineDosDeviceA);\n    ATTACH(DefineDosDeviceW);\n    ATTACH(DeleteAtom);\n    ATTACH(DeleteColorSpace);\n    ATTACH(DeleteDC);\n    ATTACH(DeleteEnhMetaFile);\n    ATTACH(DeleteFiber);\n    ATTACH(DeleteFileA);\n    ATTACH(DeleteFileW);\n    ATTACH(DeleteMenu);\n    ATTACH(DeleteMetaFile);\n    ATTACH(DeleteObject);\n    ATTACH(DescribePixelFormat);\n    ATTACH(DestroyAcceleratorTable);\n    ATTACH(DestroyCaret);\n    ATTACH(DestroyCursor);\n    ATTACH(DestroyIcon);\n    ATTACH(DestroyMenu);\n    ATTACH(DestroyWindow);\n    ATTACH(DeviceIoControl);\n    ATTACH(DialogBoxIndirectParamA);\n    ATTACH(DialogBoxIndirectParamW);\n    ATTACH(DialogBoxParamA);\n    ATTACH(DialogBoxParamW);\n    ATTACH(DisableThreadLibraryCalls);\n    ATTACH(DisconnectNamedPipe);\n    ATTACH(DispatchMessageA);\n    ATTACH(DispatchMessageW);\n    ATTACH(DlgDirListA);\n    ATTACH(DlgDirListComboBoxA);\n    ATTACH(DlgDirListComboBoxW);\n    ATTACH(DlgDirListW);\n    ATTACH(DlgDirSelectComboBoxExA);\n    ATTACH(DlgDirSelectComboBoxExW);\n    ATTACH(DlgDirSelectExA);\n    ATTACH(DlgDirSelectExW);\n    ATTACH(DoDragDrop);\n    ATTACH(DosDateTimeToFileTime);\n    ATTACH(DragDetect);\n    ATTACH(DragObject);\n    ATTACH(DrawAnimatedRects);\n    ATTACH(DrawCaption);\n    ATTACH(DrawEdge);\n    ATTACH(DrawEscape);\n    ATTACH(DrawFocusRect);\n    ATTACH(DrawFrameControl);\n    ATTACH(DrawIcon);\n    ATTACH(DrawIconEx);\n    ATTACH(DrawMenuBar);\n    ATTACH(DrawStateA);\n    ATTACH(DrawStateW);\n    ATTACH(DrawTextA);\n    ATTACH(DrawTextExA);\n    ATTACH(DrawTextExW);\n    ATTACH(DrawTextW);\n    ATTACH(DuplicateHandle);\n    ATTACH(Ellipse);\n    ATTACH(EmptyClipboard);\n    ATTACH(EnableMenuItem);\n    ATTACH(EnableScrollBar);\n    ATTACH(EnableWindow);\n    ATTACH(EndDeferWindowPos);\n    ATTACH(EndDialog);\n    ATTACH(EndDoc);\n    ATTACH(EndPage);\n    ATTACH(EndPaint);\n    ATTACH(EndPath);\n    ATTACH(EndUpdateResourceA);\n    ATTACH(EndUpdateResourceW);\n    ATTACH(EnumCalendarInfoA);\n    ATTACH(EnumCalendarInfoW);\n    ATTACH(EnumChildWindows);\n    ATTACH(EnumClipboardFormats);\n    ATTACH(EnumDateFormatsA);\n    ATTACH(EnumDateFormatsW);\n    ATTACH(EnumDesktopWindows);\n    ATTACH(EnumDesktopsA);\n    ATTACH(EnumDesktopsW);\n    ATTACH(EnumDisplaySettingsA);\n    ATTACH(EnumDisplaySettingsW);\n    ATTACH(EnumEnhMetaFile);\n    ATTACH(EnumFontFamiliesA);\n    ATTACH(EnumFontFamiliesExA);\n    ATTACH(EnumFontFamiliesExW);\n    ATTACH(EnumFontFamiliesW);\n    ATTACH(EnumFontsA);\n    ATTACH(EnumFontsW);\n    ATTACH(EnumICMProfilesA);\n    ATTACH(EnumICMProfilesW);\n    ATTACH(EnumMetaFile);\n    ATTACH(EnumObjects);\n    ATTACH(EnumPropsA);\n    ATTACH(EnumPropsExA);\n    ATTACH(EnumPropsExW);\n    ATTACH(EnumPropsW);\n    ATTACH(EnumResourceLanguagesA);\n    ATTACH(EnumResourceLanguagesW);\n    ATTACH(EnumResourceNamesA);\n    ATTACH(EnumResourceNamesW);\n    ATTACH(EnumResourceTypesA);\n    ATTACH(EnumResourceTypesW);\n    ATTACH(EnumSystemCodePagesA);\n    ATTACH(EnumSystemCodePagesW);\n#if(WINVER >= 0x0500)\n    ATTACH(EnumSystemLocalesA);\n    ATTACH(EnumSystemLocalesW);\n#endif // (WINVER >= 0x0500)\n    ATTACH(EnumThreadWindows);\n    ATTACH(EnumTimeFormatsA);\n    ATTACH(EnumTimeFormatsW);\n    ATTACH(EnumWindowStationsA);\n    ATTACH(EnumWindowStationsW);\n    ATTACH(EnumWindows);\n    ATTACH(EqualRect);\n    ATTACH(EqualRgn);\n    ATTACH(EraseTape);\n    ATTACH(Escape);\n    ATTACH(EscapeCommFunction);\n    ATTACH(ExcludeClipRect);\n    ATTACH(ExcludeUpdateRgn);\n    ATTACH(ExitProcess);\n    ATTACH(ExitThread);\n    ATTACH(ExitWindowsEx);\n    ATTACH(ExpandEnvironmentStringsA);\n    ATTACH(ExpandEnvironmentStringsW);\n    ATTACH(ExtCreatePen);\n    ATTACH(ExtCreateRegion);\n    ATTACH(ExtEscape);\n    ATTACH(ExtFloodFill);\n    ATTACH(ExtSelectClipRgn);\n    ATTACH(ExtTextOutA);\n    ATTACH(ExtTextOutW);\n    ATTACH(FatalAppExitA);\n    ATTACH(FatalAppExitW);\n    ATTACH(FatalExit);\n    ATTACH(FileTimeToDosDateTime);\n    ATTACH(FileTimeToLocalFileTime);\n    ATTACH(FileTimeToSystemTime);\n    ATTACH(FillConsoleOutputAttribute);\n    ATTACH(FillConsoleOutputCharacterA);\n    ATTACH(FillConsoleOutputCharacterW);\n    ATTACH(FillPath);\n    ATTACH(FillRect);\n    ATTACH(FillRgn);\n    ATTACH(FindAtomA);\n    ATTACH(FindAtomW);\n    ATTACH(FindClose);\n    ATTACH(FindCloseChangeNotification);\n    ATTACH(FindFirstChangeNotificationA);\n    ATTACH(FindFirstChangeNotificationW);\n    ATTACH(FindFirstFileA);\n    ATTACH(FindFirstFileExA);\n    ATTACH(FindFirstFileExW);\n    ATTACH(FindFirstFileW);\n    ATTACH(FindNextChangeNotification);\n    ATTACH(FindNextFileA);\n    ATTACH(FindNextFileW);\n    ATTACH(FindResourceA);\n    ATTACH(FindResourceExA);\n    ATTACH(FindResourceExW);\n    ATTACH(FindResourceW);\n    ATTACH(FindWindowA);\n    ATTACH(FindWindowExA);\n    ATTACH(FindWindowExW);\n    ATTACH(FindWindowW);\n    ATTACH(FixBrushOrgEx);\n    ATTACH(FlashWindow);\n    ATTACH(FlattenPath);\n    ATTACH(FloodFill);\n    ATTACH(FlushConsoleInputBuffer);\n    ATTACH(FlushFileBuffers);\n    ATTACH(FlushViewOfFile);\n    ATTACH(FmtIdToPropStgName);\n    ATTACH(FoldStringA);\n    ATTACH(FoldStringW);\n    ATTACH(FormatMessageA);\n    ATTACH(FormatMessageW);\n    ATTACH(FrameRect);\n    ATTACH(FrameRgn);\n    ATTACH(FreeConsole);\n    ATTACH(FreeDDElParam);\n    ATTACH(FreeEnvironmentStringsA);\n    ATTACH(FreeEnvironmentStringsW);\n    ATTACH(FreeLibrary);\n    ATTACH(FreeLibraryAndExitThread);\n    ATTACH(FreePropVariantArray);\n    ATTACH(FreeResource);\n    ATTACH(GdiComment);\n    ATTACH(GdiFlush);\n    ATTACH(GdiGetBatchLimit);\n    ATTACH(GdiSetBatchLimit);\n    ATTACH(GenerateConsoleCtrlEvent);\n    ATTACH(GetACP);\n    ATTACH(GetActiveWindow);\n    ATTACH(GetArcDirection);\n    ATTACH(GetAspectRatioFilterEx);\n    ATTACH(GetAsyncKeyState);\n    ATTACH(GetAtomNameA);\n    ATTACH(GetAtomNameW);\n    ATTACH(GetBinaryTypeA);\n    ATTACH(GetBinaryTypeW);\n    ATTACH(GetBitmapBits);\n    ATTACH(GetBitmapDimensionEx);\n    ATTACH(GetBkColor);\n    ATTACH(GetBkMode);\n    ATTACH(GetBoundsRect);\n    ATTACH(GetBrushOrgEx);\n    ATTACH(GetCPInfo);\n    ATTACH(GetCapture);\n    ATTACH(GetCaretBlinkTime);\n    ATTACH(GetCaretPos);\n    ATTACH(GetCharABCWidthsA);\n    ATTACH(GetCharABCWidthsFloatA);\n    ATTACH(GetCharABCWidthsFloatW);\n    ATTACH(GetCharABCWidthsW);\n    ATTACH(GetCharWidth32A);\n    ATTACH(GetCharWidth32W);\n    ATTACH(GetCharWidthA);\n    ATTACH(GetCharWidthFloatA);\n    ATTACH(GetCharWidthFloatW);\n    ATTACH(GetCharWidthW);\n    ATTACH(GetCharacterPlacementA);\n    ATTACH(GetCharacterPlacementW);\n    ATTACH(GetClassFile);\n    ATTACH(GetClassInfoA);\n    ATTACH(GetClassInfoExA);\n    ATTACH(GetClassInfoExW);\n    ATTACH(GetClassInfoW);\n    ATTACH(GetClassLongA);\n    ATTACH(GetClassLongW);\n    ATTACH(GetClassNameA);\n    ATTACH(GetClassNameW);\n    ATTACH(GetClassWord);\n    ATTACH(GetClientRect);\n    ATTACH(GetClipBox);\n    ATTACH(GetClipCursor);\n    ATTACH(GetClipRgn);\n    ATTACH(GetClipboardData);\n    ATTACH(GetClipboardFormatNameA);\n    ATTACH(GetClipboardFormatNameW);\n    ATTACH(GetClipboardOwner);\n    ATTACH(GetClipboardViewer);\n    ATTACH(GetColorAdjustment);\n    ATTACH(GetColorSpace);\n    ATTACH(GetCommConfig);\n    ATTACH(GetCommMask);\n    ATTACH(GetCommModemStatus);\n    ATTACH(GetCommProperties);\n    ATTACH(GetCommState);\n    ATTACH(GetCommTimeouts);\n    ATTACH(GetCommandLineA);\n    ATTACH(GetCommandLineW);\n    ATTACH(GetComputerNameA);\n    ATTACH(GetComputerNameW);\n    ATTACH(GetConsoleCP);\n    ATTACH(GetConsoleCursorInfo);\n    ATTACH(GetConsoleMode);\n    ATTACH(GetConsoleOutputCP);\n    ATTACH(GetConsoleScreenBufferInfo);\n    ATTACH(GetConsoleTitleA);\n    ATTACH(GetConsoleTitleW);\n    ATTACH(GetConvertStg);\n    ATTACH(GetCurrencyFormatA);\n    ATTACH(GetCurrencyFormatW);\n    ATTACH(GetCurrentDirectoryA);\n    ATTACH(GetCurrentDirectoryW);\n    ATTACH(GetCurrentObject);\n    ATTACH(GetCurrentPositionEx);\n    ATTACH(GetCurrentProcess);\n    ATTACH(GetCurrentProcessId);\n    ATTACH(GetCurrentThreadId);\n    ATTACH(GetCursor);\n    ATTACH(GetCursorPos);\n    ATTACH(GetDC);\n    ATTACH(GetDCEx);\n    ATTACH(GetDCOrgEx);\n    ATTACH(GetDIBColorTable);\n    ATTACH(GetDIBits);\n    ATTACH(GetDateFormatA);\n    ATTACH(GetDateFormatW);\n    ATTACH(GetDefaultCommConfigA);\n    ATTACH(GetDefaultCommConfigW);\n    ATTACH(GetDesktopWindow);\n    ATTACH(GetDeviceCaps);\n    ATTACH(GetDeviceGammaRamp);\n    ATTACH(GetDialogBaseUnits);\n    ATTACH(GetDiskFreeSpaceA);\n    ATTACH(GetDiskFreeSpaceExA);\n    ATTACH(GetDiskFreeSpaceExW);\n    ATTACH(GetDiskFreeSpaceW);\n    ATTACH(GetDlgCtrlID);\n    ATTACH(GetDlgItem);\n    ATTACH(GetDlgItemInt);\n    ATTACH(GetDlgItemTextA);\n    ATTACH(GetDlgItemTextW);\n    ATTACH(GetDoubleClickTime);\n    ATTACH(GetDriveTypeA);\n    ATTACH(GetDriveTypeW);\n    ATTACH(GetEnhMetaFileA);\n    ATTACH(GetEnhMetaFileBits);\n    ATTACH(GetEnhMetaFileDescriptionA);\n    ATTACH(GetEnhMetaFileDescriptionW);\n    ATTACH(GetEnhMetaFileHeader);\n    ATTACH(GetEnhMetaFilePaletteEntries);\n    ATTACH(GetEnhMetaFilePixelFormat);\n    ATTACH(GetEnhMetaFileW);\n    ATTACH(GetEnvironmentStrings);\n    ATTACH(GetEnvironmentStringsW);\n    ATTACH(GetEnvironmentVariableA);\n    ATTACH(GetEnvironmentVariableW);\n    ATTACH(GetExitCodeProcess);\n    ATTACH(GetExitCodeThread);\n    ATTACH(GetFileAttributesA);\n    ATTACH(GetFileAttributesExA);\n    ATTACH(GetFileAttributesExW);\n    ATTACH(GetFileAttributesW);\n    ATTACH(GetFileInformationByHandle);\n    ATTACH(GetFileSize);\n    ATTACH(GetFileTime);\n    ATTACH(GetFileType);\n    ATTACH(GetFocus);\n    ATTACH(GetFontData);\n    ATTACH(GetFontLanguageInfo);\n    ATTACH(GetForegroundWindow);\n    ATTACH(GetFullPathNameA);\n    ATTACH(GetFullPathNameW);\n    ATTACH(GetGlyphOutlineA);\n    ATTACH(GetGlyphOutlineW);\n    ATTACH(GetGraphicsMode);\n    ATTACH(GetHGlobalFromILockBytes);\n    ATTACH(GetHGlobalFromStream);\n    ATTACH(GetHandleInformation);\n    ATTACH(GetICMProfileA);\n    ATTACH(GetICMProfileW);\n    ATTACH(GetIconInfo);\n    ATTACH(GetInputState);\n    ATTACH(GetKBCodePage);\n    ATTACH(GetKerningPairsA);\n    ATTACH(GetKerningPairsW);\n    ATTACH(GetKeyNameTextA);\n    ATTACH(GetKeyNameTextW);\n    ATTACH(GetKeyState);\n    ATTACH(GetKeyboardLayout);\n    ATTACH(GetKeyboardLayoutList);\n    ATTACH(GetKeyboardLayoutNameA);\n    ATTACH(GetKeyboardLayoutNameW);\n    ATTACH(GetKeyboardState);\n    ATTACH(GetKeyboardType);\n    ATTACH(GetLastActivePopup);\n    ATTACH(GetLocalTime);\n    ATTACH(GetLocaleInfoA);\n    ATTACH(GetLocaleInfoW);\n    ATTACH(GetLogColorSpaceA);\n    ATTACH(GetLogColorSpaceW);\n    ATTACH(GetLogicalDriveStringsA);\n    ATTACH(GetLogicalDriveStringsW);\n    ATTACH(GetLogicalDrives);\n    ATTACH(GetMailslotInfo);\n    ATTACH(GetMapMode);\n    ATTACH(GetMenu);\n    ATTACH(GetMenuCheckMarkDimensions);\n    ATTACH(GetMenuContextHelpId);\n    ATTACH(GetMenuDefaultItem);\n    ATTACH(GetMenuItemCount);\n    ATTACH(GetMenuItemID);\n    ATTACH(GetMenuItemInfoA);\n    ATTACH(GetMenuItemInfoW);\n    ATTACH(GetMenuItemRect);\n    ATTACH(GetMenuState);\n    ATTACH(GetMenuStringA);\n    ATTACH(GetMenuStringW);\n    ATTACH(GetMessageA);\n    ATTACH(GetMessageExtraInfo);\n    ATTACH(GetMessagePos);\n    ATTACH(GetMessageTime);\n    ATTACH(GetMessageW);\n    ATTACH(GetMetaFileA);\n    ATTACH(GetMetaFileBitsEx);\n    ATTACH(GetMetaFileW);\n    ATTACH(GetMetaRgn);\n    ATTACH(GetMiterLimit);\n    ATTACH(GetModuleFileNameA);\n    ATTACH(GetModuleFileNameW);\n    ATTACH(GetModuleHandleA);\n    ATTACH(GetModuleHandleW);\n    ATTACH(GetNamedPipeHandleStateA);\n    ATTACH(GetNamedPipeHandleStateW);\n    ATTACH(GetNamedPipeInfo);\n    ATTACH(GetNearestColor);\n    ATTACH(GetNearestPaletteIndex);\n    ATTACH(GetNextDlgGroupItem);\n    ATTACH(GetNextDlgTabItem);\n    ATTACH(GetNumberFormatA);\n    ATTACH(GetNumberFormatW);\n    ATTACH(GetNumberOfConsoleInputEvents);\n    ATTACH(GetNumberOfConsoleMouseButtons);\n    ATTACH(GetOEMCP);\n    ATTACH(GetObjectA);\n    ATTACH(GetObjectType);\n    ATTACH(GetObjectW);\n    ATTACH(GetOpenClipboardWindow);\n    ATTACH(GetOutlineTextMetricsA);\n    ATTACH(GetOutlineTextMetricsW);\n    ATTACH(GetOverlappedResult);\n    ATTACH(GetPaletteEntries);\n    ATTACH(GetParent);\n    ATTACH(GetPath);\n    ATTACH(GetPixel);\n    ATTACH(GetPixelFormat);\n    ATTACH(GetPolyFillMode);\n    ATTACH(GetPriorityClass);\n    ATTACH(GetPriorityClipboardFormat);\n    ATTACH(GetPrivateProfileIntA);\n    ATTACH(GetPrivateProfileIntW);\n    ATTACH(GetPrivateProfileSectionA);\n    ATTACH(GetPrivateProfileSectionNamesA);\n    ATTACH(GetPrivateProfileSectionNamesW);\n    ATTACH(GetPrivateProfileSectionW);\n    ATTACH(GetPrivateProfileStringA);\n    ATTACH(GetPrivateProfileStringW);\n    ATTACH(GetPrivateProfileStructA);\n    ATTACH(GetPrivateProfileStructW);\n    ATTACH(GetProcAddress);\n    ATTACH(GetProcessAffinityMask);\n    ATTACH(GetProcessHeaps);\n    ATTACH(GetProcessShutdownParameters);\n    ATTACH(GetProcessTimes);\n    ATTACH(GetProcessVersion);\n    ATTACH(GetProcessWindowStation);\n    ATTACH(GetProcessWorkingSetSize);\n    ATTACH(GetProfileIntA);\n    ATTACH(GetProfileIntW);\n    ATTACH(GetProfileSectionA);\n    ATTACH(GetProfileSectionW);\n    ATTACH(GetProfileStringA);\n    ATTACH(GetProfileStringW);\n    ATTACH(GetPropA);\n    ATTACH(GetPropW);\n    ATTACH(GetQueueStatus);\n    ATTACH(GetQueuedCompletionStatus);\n    ATTACH(GetROP2);\n    ATTACH(GetRasterizerCaps);\n    ATTACH(GetRegionData);\n    ATTACH(GetRgnBox);\n    ATTACH(GetRunningObjectTable);\n    ATTACH(GetScrollInfo);\n    ATTACH(GetScrollPos);\n    ATTACH(GetScrollRange);\n    ATTACH(GetShortPathNameA);\n    ATTACH(GetShortPathNameW);\n    ATTACH(GetStartupInfoA);\n    ATTACH(GetStartupInfoW);\n    ATTACH(GetStdHandle);\n    ATTACH(GetStockObject);\n    ATTACH(GetStretchBltMode);\n    ATTACH(GetSubMenu);\n    ATTACH(GetSysColor);\n    ATTACH(GetSysColorBrush);\n    ATTACH(GetSystemDefaultLCID);\n    ATTACH(GetSystemDefaultLangID);\n    ATTACH(GetSystemDirectoryA);\n    ATTACH(GetSystemDirectoryW);\n    ATTACH(GetSystemInfo);\n    ATTACH(GetSystemMenu);\n    ATTACH(GetSystemMetrics);\n    ATTACH(GetSystemPaletteEntries);\n    ATTACH(GetSystemPaletteUse);\n    ATTACH(GetSystemPowerStatus);\n    ATTACH(GetSystemTime);\n    ATTACH(GetSystemTimeAdjustment);\n    ATTACH(GetSystemTimeAsFileTime);\n    ATTACH(GetTabbedTextExtentA);\n    ATTACH(GetTabbedTextExtentW);\n    ATTACH(GetTapeParameters);\n    ATTACH(GetTapePosition);\n    ATTACH(GetTapeStatus);\n    ATTACH(GetTempFileNameA);\n    ATTACH(GetTempFileNameW);\n    ATTACH(GetTempPathA);\n    ATTACH(GetTempPathW);\n    ATTACH(GetTextAlign);\n    ATTACH(GetTextCharacterExtra);\n    ATTACH(GetTextCharset);\n    ATTACH(GetTextCharsetInfo);\n    ATTACH(GetTextColor);\n    ATTACH(GetTextExtentExPointA);\n    ATTACH(GetTextExtentExPointW);\n    ATTACH(GetTextExtentPoint32A);\n    ATTACH(GetTextExtentPoint32W);\n    ATTACH(GetTextExtentPointA);\n    ATTACH(GetTextExtentPointW);\n    ATTACH(GetTextFaceA);\n    ATTACH(GetTextFaceW);\n    ATTACH(GetTextMetricsA);\n    ATTACH(GetTextMetricsW);\n    ATTACH(GetThreadContext);\n    ATTACH(GetThreadDesktop);\n#if(WINVER >= 0x0500)\n    ATTACH(GetThreadLocale);\n#endif // (WINVER >= 0x0500)\n    ATTACH(GetThreadPriority);\n    ATTACH(GetThreadPriorityBoost);\n    ATTACH(GetThreadSelectorEntry);\n    ATTACH(GetThreadTimes);\n    ATTACH(GetTickCount);\n    ATTACH(GetTimeFormatA);\n    ATTACH(GetTimeFormatW);\n    ATTACH(GetTimeZoneInformation);\n    ATTACH(GetTopWindow);\n    ATTACH(GetUpdateRect);\n    ATTACH(GetUpdateRgn);\n    ATTACH(GetUserDefaultLCID);\n    ATTACH(GetUserDefaultLangID);\n    ATTACH(GetUserObjectInformationA);\n    ATTACH(GetUserObjectInformationW);\n    ATTACH(GetUserObjectSecurity);\n    ATTACH(GetVersion);\n    ATTACH(GetVersionExA);\n    ATTACH(GetVersionExW);\n    ATTACH(GetViewportExtEx);\n    ATTACH(GetViewportOrgEx);\n    ATTACH(GetVolumeInformationA);\n    ATTACH(GetVolumeInformationW);\n    ATTACH(GetWinMetaFileBits);\n    ATTACH(GetWindow);\n    ATTACH(GetWindowContextHelpId);\n    ATTACH(GetWindowDC);\n    ATTACH(GetWindowExtEx);\n    ATTACH(GetWindowLongA);\n    ATTACH(GetWindowLongW);\n    ATTACH(GetWindowOrgEx);\n    ATTACH(GetWindowPlacement);\n    ATTACH(GetWindowRect);\n    ATTACH(GetWindowRgn);\n    ATTACH(GetWindowTextA);\n    ATTACH(GetWindowTextLengthA);\n    ATTACH(GetWindowTextLengthW);\n    ATTACH(GetWindowTextW);\n    ATTACH(GetWindowThreadProcessId);\n    ATTACH(GetWindowWord);\n    ATTACH(GetWindowsDirectoryA);\n    ATTACH(GetWindowsDirectoryW);\n    ATTACH(GetWorldTransform);\n    ATTACH(GlobalAddAtomA);\n    ATTACH(GlobalAddAtomW);\n    ATTACH(GlobalAlloc);\n    ATTACH(GlobalCompact);\n    ATTACH(GlobalDeleteAtom);\n    ATTACH(GlobalFindAtomA);\n    ATTACH(GlobalFindAtomW);\n    ATTACH(GlobalFix);\n    ATTACH(GlobalFlags);\n    ATTACH(GlobalFree);\n    ATTACH(GlobalGetAtomNameA);\n    ATTACH(GlobalGetAtomNameW);\n    ATTACH(GlobalHandle);\n    ATTACH(GlobalLock);\n    ATTACH(GlobalMemoryStatus);\n    ATTACH(GlobalReAlloc);\n    ATTACH(GlobalSize);\n    ATTACH(GlobalUnWire);\n    ATTACH(GlobalUnfix);\n    ATTACH(GlobalUnlock);\n    ATTACH(GlobalWire);\n    ATTACH(GrayStringA);\n    ATTACH(GrayStringW);\n    ATTACH(HeapLock);\n    ATTACH(HeapUnlock);\n    ATTACH(HideCaret);\n    ATTACH(HiliteMenuItem);\n    ATTACH(IIDFromString);\n    ATTACH(ImpersonateDdeClientWindow);\n    ATTACH(InSendMessage);\n    ATTACH(InflateRect);\n    ATTACH(InitAtomTable);\n    ATTACH(InsertMenuA);\n    ATTACH(InsertMenuItemA);\n    ATTACH(InsertMenuItemW);\n    ATTACH(InsertMenuW);\n    ATTACH(IntersectClipRect);\n    ATTACH(IntersectRect);\n    ATTACH(InvalidateRect);\n    ATTACH(InvalidateRgn);\n    ATTACH(InvertRect);\n    ATTACH(InvertRgn);\n    ATTACH(IsAccelerator);\n    ATTACH(IsBadCodePtr);\n    ATTACH(IsBadHugeReadPtr);\n    ATTACH(IsBadHugeWritePtr);\n    ATTACH(IsBadReadPtr);\n    ATTACH(IsBadStringPtrA);\n    ATTACH(IsBadStringPtrW);\n    ATTACH(IsBadWritePtr);\n    ATTACH(IsCharAlphaA);\n    ATTACH(IsCharAlphaNumericA);\n    ATTACH(IsCharAlphaNumericW);\n    ATTACH(IsCharAlphaW);\n    ATTACH(IsCharLowerA);\n    ATTACH(IsCharLowerW);\n    ATTACH(IsCharUpperA);\n    ATTACH(IsCharUpperW);\n    ATTACH(IsChild);\n    ATTACH(IsClipboardFormatAvailable);\n    ATTACH(IsDBCSLeadByte);\n    ATTACH(IsDBCSLeadByteEx);\n    ATTACH(IsDebuggerPresent);\n    ATTACH(IsDialogMessageA);\n    ATTACH(IsDialogMessageW);\n    ATTACH(IsDlgButtonChecked);\n    ATTACH(IsIconic);\n    ATTACH(IsMenu);\n#if !defined(DETOURS_ARM)\n    ATTACH(IsProcessorFeaturePresent);\n#endif // !DETOURS_ARM\n    ATTACH(IsRectEmpty);\n    ATTACH(IsValidCodePage);\n    ATTACH(IsValidLocale);\n    ATTACH(IsWindow);\n    ATTACH(IsWindowEnabled);\n    ATTACH(IsWindowUnicode);\n    ATTACH(IsWindowVisible);\n    ATTACH(IsZoomed);\n    ATTACH(KillTimer);\n    ATTACH(LPtoDP);\n    ATTACH(LineDDA);\n    ATTACH(LineTo);\n    ATTACH(LoadAcceleratorsA);\n    ATTACH(LoadAcceleratorsW);\n    ATTACH(LoadBitmapA);\n    ATTACH(LoadBitmapW);\n    ATTACH(LoadCursorA);\n    ATTACH(LoadCursorFromFileA);\n    ATTACH(LoadCursorFromFileW);\n    ATTACH(LoadCursorW);\n    ATTACH(LoadIconA);\n    ATTACH(LoadIconW);\n    ATTACH(LoadImageA);\n    ATTACH(LoadImageW);\n    ATTACH(LoadKeyboardLayoutA);\n    ATTACH(LoadKeyboardLayoutW);\n    ATTACH(LoadLibraryA);\n    ATTACH(LoadLibraryExA);\n    ATTACH(LoadLibraryExW);\n    ATTACH(LoadLibraryW);\n    ATTACH(LoadMenuA);\n    ATTACH(LoadMenuIndirectA);\n    ATTACH(LoadMenuIndirectW);\n    ATTACH(LoadMenuW);\n    ATTACH(LoadModule);\n    ATTACH(LoadResource);\n    ATTACH(LoadStringA);\n    ATTACH(LoadStringW);\n    ATTACH(LocalAlloc);\n    ATTACH(LocalCompact);\n    ATTACH(LocalFileTimeToFileTime);\n    ATTACH(LocalFlags);\n    ATTACH(LocalFree);\n    ATTACH(LocalHandle);\n    ATTACH(LocalLock);\n    ATTACH(LocalReAlloc);\n    ATTACH(LocalShrink);\n    ATTACH(LocalSize);\n    ATTACH(LocalUnlock);\n    ATTACH(LockFile);\n    ATTACH(LockFileEx);\n    ATTACH(LockResource);\n    ATTACH(LockWindowUpdate);\n    ATTACH(LookupIconIdFromDirectory);\n    ATTACH(LookupIconIdFromDirectoryEx);\n    ATTACH(MapDialogRect);\n    ATTACH(MapViewOfFile);\n    ATTACH(MapViewOfFileEx);\n    ATTACH(MapVirtualKeyA);\n    ATTACH(MapVirtualKeyExA);\n    ATTACH(MapVirtualKeyExW);\n    ATTACH(MapVirtualKeyW);\n    ATTACH(MapWindowPoints);\n    ATTACH(MaskBlt);\n    ATTACH(MenuItemFromPoint);\n    ATTACH(MessageBeep);\n    ATTACH(MessageBoxA);\n    ATTACH(MessageBoxExA);\n    ATTACH(MessageBoxExW);\n    ATTACH(MessageBoxIndirectA);\n    ATTACH(MessageBoxIndirectW);\n    ATTACH(MessageBoxW);\n    ATTACH(MkParseDisplayName);\n    ATTACH(ModifyMenuA);\n    ATTACH(ModifyMenuW);\n    ATTACH(ModifyWorldTransform);\n    ATTACH(MonikerCommonPrefixWith);\n    ATTACH(MonikerRelativePathTo);\n    ATTACH(MoveFileA);\n    ATTACH(MoveFileExA);\n    ATTACH(MoveFileExW);\n    ATTACH(MoveFileW);\n    ATTACH(MoveToEx);\n    ATTACH(MoveWindow);\n    ATTACH(MsgWaitForMultipleObjects);\n    ATTACH(MsgWaitForMultipleObjectsEx);\n    ATTACH(MulDiv);\n    ATTACH(OemKeyScan);\n    ATTACH(OemToCharA);\n    ATTACH(OemToCharBuffA);\n    ATTACH(OemToCharBuffW);\n    ATTACH(OemToCharW);\n    ATTACH(OffsetClipRgn);\n    ATTACH(OffsetRect);\n    ATTACH(OffsetRgn);\n    ATTACH(OffsetViewportOrgEx);\n    ATTACH(OffsetWindowOrgEx);\n    ATTACH(OleBuildVersion);\n    ATTACH(OleConvertIStorageToOLESTREAM);\n    ATTACH(OleConvertIStorageToOLESTREAMEx);\n    ATTACH(OleConvertOLESTREAMToIStorage);\n    ATTACH(OleConvertOLESTREAMToIStorageEx);\n    ATTACH(OleCreate);\n    ATTACH(OleCreateDefaultHandler);\n    ATTACH(OleCreateEmbeddingHelper);\n    ATTACH(OleCreateEx);\n    ATTACH(OleCreateFromData);\n    ATTACH(OleCreateFromDataEx);\n    ATTACH(OleCreateFromFile);\n    ATTACH(OleCreateFromFileEx);\n    ATTACH(OleCreateLink);\n    ATTACH(OleCreateLinkEx);\n    ATTACH(OleCreateLinkFromData);\n    ATTACH(OleCreateLinkFromDataEx);\n    ATTACH(OleCreateLinkToFile);\n    ATTACH(OleCreateLinkToFileEx);\n    ATTACH(OleCreateMenuDescriptor);\n    ATTACH(OleCreateStaticFromData);\n    ATTACH(OleDestroyMenuDescriptor);\n    ATTACH(OleDoAutoConvert);\n    ATTACH(OleDraw);\n    ATTACH(OleDuplicateData);\n    ATTACH(OleFlushClipboard);\n    ATTACH(OleGetAutoConvert);\n    ATTACH(OleGetClipboard);\n    ATTACH(OleGetIconOfClass);\n    ATTACH(OleGetIconOfFile);\n    ATTACH(OleInitialize);\n    ATTACH(OleIsCurrentClipboard);\n    ATTACH(OleIsRunning);\n    ATTACH(OleLoad);\n    ATTACH(OleLoadFromStream);\n    ATTACH(OleLockRunning);\n    ATTACH(OleMetafilePictFromIconAndLabel);\n    ATTACH(OleNoteObjectVisible);\n    ATTACH(OleQueryCreateFromData);\n    ATTACH(OleQueryLinkFromData);\n    ATTACH(OleRegEnumFormatEtc);\n    ATTACH(OleRegEnumVerbs);\n    ATTACH(OleRegGetMiscStatus);\n    ATTACH(OleRegGetUserType);\n    ATTACH(OleRun);\n    ATTACH(OleSave);\n    ATTACH(OleSaveToStream);\n    ATTACH(OleSetAutoConvert);\n    ATTACH(OleSetClipboard);\n    ATTACH(OleSetContainedObject);\n    ATTACH(OleSetMenuDescriptor);\n    ATTACH(OleTranslateAccelerator);\n    ATTACH(OleUninitialize);\n    ATTACH(OpenClipboard);\n    ATTACH(OpenDesktopA);\n    ATTACH(OpenDesktopW);\n    ATTACH(OpenEventA);\n    ATTACH(OpenEventW);\n    ATTACH(OpenFile);\n    ATTACH(OpenFileMappingA);\n    ATTACH(OpenFileMappingW);\n    ATTACH(OpenIcon);\n    ATTACH(OpenInputDesktop);\n    ATTACH(OpenMutexA);\n    ATTACH(OpenMutexW);\n    ATTACH(OpenProcess);\n    ATTACH(OpenProcessToken);\n    ATTACH(OpenSemaphoreA);\n    ATTACH(OpenSemaphoreW);\n    ATTACH(OpenWaitableTimerA);\n    ATTACH(OpenWaitableTimerW);\n    ATTACH(OpenWindowStationA);\n    ATTACH(OpenWindowStationW);\n    ATTACH(OutputDebugStringA);\n    ATTACH(OutputDebugStringW);\n    ATTACH(PackDDElParam);\n    ATTACH(PaintDesktop);\n    ATTACH(PaintRgn);\n    ATTACH(PatBlt);\n    ATTACH(PathToRegion);\n    ATTACH(PeekConsoleInputA);\n    ATTACH(PeekConsoleInputW);\n    ATTACH(PeekMessageA);\n    ATTACH(PeekMessageW);\n    ATTACH(PeekNamedPipe);\n    ATTACH(Pie);\n    ATTACH(PlayEnhMetaFile);\n    ATTACH(PlayEnhMetaFileRecord);\n    ATTACH(PlayMetaFile);\n    ATTACH(PlayMetaFileRecord);\n    ATTACH(PlgBlt);\n    ATTACH(PolyBezier);\n    ATTACH(PolyBezierTo);\n    ATTACH(PolyDraw);\n    ATTACH(PolyPolygon);\n    ATTACH(PolyPolyline);\n    ATTACH(PolyTextOutA);\n    ATTACH(PolyTextOutW);\n    ATTACH(Polygon);\n    ATTACH(Polyline);\n    ATTACH(PolylineTo);\n    ATTACH(PostMessageA);\n    ATTACH(PostMessageW);\n    ATTACH(PostQueuedCompletionStatus);\n    ATTACH(PostQuitMessage);\n    ATTACH(PostThreadMessageA);\n    ATTACH(PostThreadMessageW);\n    ATTACH(PrepareTape);\n    ATTACH(ProgIDFromCLSID);\n    ATTACH(PropVariantClear);\n    ATTACH(PropVariantCopy);\n    ATTACH(PtInRect);\n    ATTACH(PtInRegion);\n    ATTACH(PtVisible);\n    ATTACH(PulseEvent);\n    ATTACH(PurgeComm);\n    ATTACH(QueryDosDeviceA);\n    ATTACH(QueryDosDeviceW);\n    ATTACH(QueryPerformanceCounter);\n    ATTACH(QueryPerformanceFrequency);\n    ATTACH(QueueUserAPC);\n    ATTACH(RaiseException);\n    ATTACH(ReadClassStg);\n    ATTACH(ReadClassStm);\n    ATTACH(ReadConsoleA);\n    ATTACH(ReadConsoleInputA);\n    ATTACH(ReadConsoleInputW);\n    ATTACH(ReadConsoleOutputA);\n    ATTACH(ReadConsoleOutputAttribute);\n    ATTACH(ReadConsoleOutputCharacterA);\n    ATTACH(ReadConsoleOutputCharacterW);\n    ATTACH(ReadConsoleOutputW);\n    ATTACH(ReadConsoleW);\n    ATTACH(ReadDirectoryChangesW);\n    ATTACH(ReadFile);\n    ATTACH(ReadFileEx);\n    ATTACH(ReadFmtUserTypeStg);\n    ATTACH(ReadProcessMemory);\n    ATTACH(RealizePalette);\n    ATTACH(RectInRegion);\n    ATTACH(RectVisible);\n    ATTACH(Rectangle);\n    ATTACH(RedrawWindow);\n    ATTACH(RegisterClassA);\n    ATTACH(RegisterClassExA);\n    ATTACH(RegisterClassExW);\n    ATTACH(RegisterClassW);\n    ATTACH(RegisterClipboardFormatA);\n    ATTACH(RegisterClipboardFormatW);\n    ATTACH(RegisterDragDrop);\n    ATTACH(RegisterHotKey);\n    ATTACH(RegisterWindowMessageA);\n    ATTACH(RegisterWindowMessageW);\n    ATTACH(ReleaseCapture);\n    ATTACH(ReleaseDC);\n    ATTACH(ReleaseMutex);\n    ATTACH(ReleaseSemaphore);\n    ATTACH(ReleaseStgMedium);\n    ATTACH(RemoveDirectoryA);\n    ATTACH(RemoveDirectoryW);\n    ATTACH(RemoveFontResourceA);\n    ATTACH(RemoveFontResourceW);\n    ATTACH(RemoveMenu);\n    ATTACH(RemovePropA);\n    ATTACH(RemovePropW);\n    ATTACH(ReplyMessage);\n    ATTACH(ResetDCA);\n    ATTACH(ResetDCW);\n    ATTACH(ResetEvent);\n    ATTACH(ResizePalette);\n    ATTACH(RestoreDC);\n    ATTACH(ResumeThread);\n    ATTACH(ReuseDDElParam);\n    ATTACH(RevokeDragDrop);\n    ATTACH(RoundRect);\n    ATTACH(SaveDC);\n    ATTACH(ScaleViewportExtEx);\n    ATTACH(ScaleWindowExtEx);\n    ATTACH(ScreenToClient);\n    ATTACH(ScrollConsoleScreenBufferA);\n    ATTACH(ScrollConsoleScreenBufferW);\n    ATTACH(ScrollDC);\n    ATTACH(ScrollWindow);\n    ATTACH(ScrollWindowEx);\n    ATTACH(SearchPathA);\n    ATTACH(SearchPathW);\n    ATTACH(SelectClipPath);\n    ATTACH(SelectClipRgn);\n    ATTACH(SelectObject);\n    ATTACH(SelectPalette);\n    ATTACH(SendDlgItemMessageA);\n    ATTACH(SendDlgItemMessageW);\n    ATTACH(SendMessageA);\n    ATTACH(SendMessageCallbackA);\n    ATTACH(SendMessageCallbackW);\n    ATTACH(SendMessageTimeoutA);\n    ATTACH(SendMessageTimeoutW);\n    ATTACH(SendMessageW);\n    ATTACH(SendNotifyMessageA);\n    ATTACH(SendNotifyMessageW);\n    ATTACH(SetAbortProc);\n    ATTACH(SetActiveWindow);\n    ATTACH(SetArcDirection);\n    ATTACH(SetBitmapBits);\n    ATTACH(SetBitmapDimensionEx);\n    ATTACH(SetBkColor);\n    ATTACH(SetBkMode);\n    ATTACH(SetBoundsRect);\n    ATTACH(SetBrushOrgEx);\n    ATTACH(SetCapture);\n    ATTACH(SetCaretBlinkTime);\n    ATTACH(SetCaretPos);\n    ATTACH(SetClassLongA);\n    ATTACH(SetClassLongW);\n    ATTACH(SetClassWord);\n    ATTACH(SetClipboardData);\n    ATTACH(SetClipboardViewer);\n    ATTACH(SetColorAdjustment);\n    ATTACH(SetColorSpace);\n    ATTACH(SetCommBreak);\n    ATTACH(SetCommConfig);\n    ATTACH(SetCommMask);\n    ATTACH(SetCommState);\n    ATTACH(SetCommTimeouts);\n    ATTACH(SetComputerNameA);\n    ATTACH(SetComputerNameW);\n    ATTACH(SetConsoleActiveScreenBuffer);\n    ATTACH(SetConsoleCP);\n    ATTACH(SetConsoleCtrlHandler);\n    ATTACH(SetConsoleCursorInfo);\n    ATTACH(SetConsoleCursorPosition);\n    ATTACH(SetConsoleMode);\n    ATTACH(SetConsoleOutputCP);\n    ATTACH(SetConsoleScreenBufferSize);\n    ATTACH(SetConsoleTextAttribute);\n    ATTACH(SetConsoleTitleA);\n    ATTACH(SetConsoleTitleW);\n    ATTACH(SetConsoleWindowInfo);\n    ATTACH(SetConvertStg);\n    ATTACH(SetCurrentDirectoryA);\n    ATTACH(SetCurrentDirectoryW);\n    ATTACH(SetCursor);\n    ATTACH(SetCursorPos);\n    ATTACH(SetDIBColorTable);\n    ATTACH(SetDIBits);\n    ATTACH(SetDIBitsToDevice);\n    ATTACH(SetDefaultCommConfigA);\n    ATTACH(SetDefaultCommConfigW);\n    ATTACH(SetDeviceGammaRamp);\n    ATTACH(SetDlgItemInt);\n    ATTACH(SetDlgItemTextA);\n    ATTACH(SetDlgItemTextW);\n    ATTACH(SetDoubleClickTime);\n    ATTACH(SetEndOfFile);\n    ATTACH(SetEnhMetaFileBits);\n    ATTACH(SetEnvironmentVariableA);\n    ATTACH(SetEnvironmentVariableW);\n    ATTACH(SetErrorMode);\n    ATTACH(SetEvent);\n    ATTACH(SetFileApisToANSI);\n    ATTACH(SetFileApisToOEM);\n    ATTACH(SetFileAttributesA);\n    ATTACH(SetFileAttributesW);\n    ATTACH(SetFilePointer);\n    ATTACH(SetFileTime);\n    ATTACH(SetFocus);\n    ATTACH(SetForegroundWindow);\n    ATTACH(SetGraphicsMode);\n    ATTACH(SetHandleCount);\n    ATTACH(SetHandleInformation);\n    ATTACH(SetICMMode);\n    ATTACH(SetICMProfileA);\n    ATTACH(SetICMProfileW);\n    ATTACH(SetKeyboardState);\n    ATTACH(SetLocalTime);\n    ATTACH(SetLocaleInfoA);\n    ATTACH(SetLocaleInfoW);\n    ATTACH(SetMailslotInfo);\n    ATTACH(SetMapMode);\n    ATTACH(SetMapperFlags);\n    ATTACH(SetMenu);\n    ATTACH(SetMenuContextHelpId);\n    ATTACH(SetMenuDefaultItem);\n    ATTACH(SetMenuItemBitmaps);\n    ATTACH(SetMenuItemInfoA);\n    ATTACH(SetMenuItemInfoW);\n    ATTACH(SetMessageExtraInfo);\n    ATTACH(SetMessageQueue);\n    ATTACH(SetMetaFileBitsEx);\n    ATTACH(SetMetaRgn);\n    ATTACH(SetMiterLimit);\n    ATTACH(SetNamedPipeHandleState);\n    ATTACH(SetPaletteEntries);\n    ATTACH(SetParent);\n    ATTACH(SetPixel);\n    ATTACH(SetPixelFormat);\n    ATTACH(SetPixelV);\n    ATTACH(SetPolyFillMode);\n    ATTACH(SetPriorityClass);\n    ATTACH(SetProcessAffinityMask);\n    ATTACH(SetProcessShutdownParameters);\n    ATTACH(SetProcessWindowStation);\n    ATTACH(SetProcessWorkingSetSize);\n    ATTACH(SetPropA);\n    ATTACH(SetPropW);\n    ATTACH(SetROP2);\n    ATTACH(SetRect);\n    ATTACH(SetRectEmpty);\n    ATTACH(SetRectRgn);\n    ATTACH(SetScrollInfo);\n    ATTACH(SetScrollPos);\n    ATTACH(SetScrollRange);\n    ATTACH(SetStdHandle);\n    ATTACH(SetStretchBltMode);\n    ATTACH(SetSysColors);\n    ATTACH(SetSystemCursor);\n    ATTACH(SetSystemPaletteUse);\n    ATTACH(SetSystemPowerState);\n    ATTACH(SetSystemTime);\n    ATTACH(SetSystemTimeAdjustment);\n    ATTACH(SetTapeParameters);\n    ATTACH(SetTapePosition);\n    ATTACH(SetTextAlign);\n    ATTACH(SetTextCharacterExtra);\n    ATTACH(SetTextColor);\n    ATTACH(SetTextJustification);\n    ATTACH(SetThreadAffinityMask);\n    ATTACH(SetThreadContext);\n    ATTACH(SetThreadDesktop);\n    ATTACH(SetThreadIdealProcessor);\n#if(WINVER >= 0x0500)\n    ATTACH(SetThreadLocale);\n#endif // (WINVER >= 0x0500)\n    ATTACH(SetThreadPriority);\n    ATTACH(SetThreadPriorityBoost);\n    ATTACH(SetTimeZoneInformation);\n    ATTACH(SetTimer);\n    ATTACH(SetUnhandledExceptionFilter);\n    ATTACH(SetUserObjectInformationA);\n    ATTACH(SetUserObjectInformationW);\n    ATTACH(SetUserObjectSecurity);\n    ATTACH(SetViewportExtEx);\n    ATTACH(SetViewportOrgEx);\n    ATTACH(SetVolumeLabelA);\n    ATTACH(SetVolumeLabelW);\n    ATTACH(SetWaitableTimer);\n    ATTACH(SetWinMetaFileBits);\n    ATTACH(SetWindowContextHelpId);\n    ATTACH(SetWindowExtEx);\n    ATTACH(SetWindowLongA);\n    ATTACH(SetWindowLongW);\n    ATTACH(SetWindowOrgEx);\n    ATTACH(SetWindowPlacement);\n    ATTACH(SetWindowPos);\n    ATTACH(SetWindowRgn);\n    ATTACH(SetWindowTextA);\n    ATTACH(SetWindowTextW);\n    ATTACH(SetWindowWord);\n    ATTACH(SetWindowsHookA);\n    ATTACH(SetWindowsHookExA);\n    ATTACH(SetWindowsHookExW);\n    ATTACH(SetWindowsHookW);\n    ATTACH(SetWorldTransform);\n    ATTACH(SetupComm);\n    ATTACH(ShowCaret);\n    ATTACH(ShowCursor);\n    ATTACH(ShowOwnedPopups);\n    ATTACH(ShowScrollBar);\n    ATTACH(ShowWindow);\n    ATTACH(ShowWindowAsync);\n    ATTACH(SignalObjectAndWait);\n    ATTACH(SizeofResource);\n    ATTACH(SleepEx);\n    ATTACH(StartDocA);\n    ATTACH(StartDocW);\n    ATTACH(StartPage);\n    ATTACH(StgCreateDocfile);\n    ATTACH(StgCreateDocfileOnILockBytes);\n    ATTACH(StgCreatePropSetStg);\n    ATTACH(StgCreatePropStg);\n    ATTACH(StgCreateStorageEx);\n    ATTACH(StgGetIFillLockBytesOnFile);\n    ATTACH(StgGetIFillLockBytesOnILockBytes);\n    ATTACH(StgIsStorageFile);\n    ATTACH(StgIsStorageILockBytes);\n    ATTACH(StgOpenAsyncDocfileOnIFillLockBytes);\n    ATTACH(StgOpenPropStg);\n    ATTACH(StgOpenStorage);\n    ATTACH(StgOpenStorageEx);\n    ATTACH(StgOpenStorageOnILockBytes);\n    ATTACH(StgSetTimes);\n    ATTACH(StretchBlt);\n    ATTACH(StretchDIBits);\n    ATTACH(StringFromCLSID);\n    ATTACH(StringFromGUID2);\n    ATTACH(StringFromIID);\n    ATTACH(StrokeAndFillPath);\n    ATTACH(StrokePath);\n    ATTACH(SubtractRect);\n    ATTACH(SuspendThread);\n    ATTACH(SwapBuffers);\n    ATTACH(SwapMouseButton);\n    ATTACH(SwitchDesktop);\n    ATTACH(SwitchToFiber);\n    ATTACH(SwitchToThread);\n    ATTACH(SystemParametersInfoA);\n    ATTACH(SystemParametersInfoW);\n    ATTACH(SystemTimeToFileTime);\n    ATTACH(SystemTimeToTzSpecificLocalTime);\n    ATTACH(TabbedTextOutA);\n    ATTACH(TabbedTextOutW);\n    ATTACH(TerminateProcess);\n    ATTACH(TerminateThread);\n    ATTACH(TextOutA);\n    ATTACH(TextOutW);\n    ATTACH(TileWindows);\n    ATTACH(ToAscii);\n    ATTACH(ToAsciiEx);\n    ATTACH(ToUnicode);\n    ATTACH(ToUnicodeEx);\n    ATTACH(TrackMouseEvent);\n    ATTACH(TrackPopupMenu);\n    ATTACH(TrackPopupMenuEx);\n    ATTACH(TransactNamedPipe);\n    ATTACH(TranslateAcceleratorA);\n    ATTACH(TranslateAcceleratorW);\n    ATTACH(TranslateCharsetInfo);\n    ATTACH(TranslateMDISysAccel);\n    ATTACH(TranslateMessage);\n    ATTACH(TransmitCommChar);\n#if DETOUR_TryEnterCriticalSection_EVEN_IF_IT_EXERCISES_A_BUG_IN_RtlLookupFunctionTable\n    ATTACH(TryEnterCriticalSection);\n#endif\n    ATTACH(UnhookWindowsHook);\n    ATTACH(UnhookWindowsHookEx);\n    ATTACH(UnionRect);\n    ATTACH(UnloadKeyboardLayout);\n    ATTACH(UnlockFile);\n    ATTACH(UnlockFileEx);\n    ATTACH(UnmapViewOfFile);\n    ATTACH(UnpackDDElParam);\n    ATTACH(UnrealizeObject);\n    ATTACH(UnregisterClassA);\n    ATTACH(UnregisterClassW);\n    ATTACH(UnregisterHotKey);\n    ATTACH(UpdateColors);\n    ATTACH(UpdateResourceA);\n    ATTACH(UpdateResourceW);\n    ATTACH(UpdateWindow);\n    ATTACH(ValidateRect);\n    ATTACH(ValidateRgn);\n    ATTACH(VerLanguageNameA);\n    ATTACH(VerLanguageNameW);\n    ATTACH(VirtualAllocEx);\n    ATTACH(VirtualFreeEx);\n    ATTACH(VirtualProtectEx);\n    ATTACH(VirtualQueryEx);\n    ATTACH(VkKeyScanA);\n    ATTACH(VkKeyScanExA);\n    ATTACH(VkKeyScanExW);\n    ATTACH(VkKeyScanW);\n    ATTACH(WSAAccept);\n    ATTACH(WSAAddressToStringA);\n    ATTACH(WSAAddressToStringW);\n    ATTACH(WSAAsyncGetHostByAddr);\n    ATTACH(WSAAsyncGetHostByName);\n    ATTACH(WSAAsyncGetProtoByName);\n    ATTACH(WSAAsyncGetProtoByNumber);\n    ATTACH(WSAAsyncGetServByName);\n    ATTACH(WSAAsyncGetServByPort);\n    ATTACH(WSAAsyncSelect);\n    ATTACH(WSACancelAsyncRequest);\n    ATTACH(WSACancelBlockingCall);\n    ATTACH(WSACleanup);\n    ATTACH(WSACloseEvent);\n    ATTACH(WSAConnect);\n    ATTACH(WSACreateEvent);\n    ATTACH(WSADuplicateSocketA);\n    ATTACH(WSADuplicateSocketW);\n    ATTACH(WSAEnumNameSpaceProvidersA);\n    ATTACH(WSAEnumNameSpaceProvidersW);\n    ATTACH(WSAEnumNetworkEvents);\n    ATTACH(WSAEnumProtocolsA);\n    ATTACH(WSAEnumProtocolsW);\n    ATTACH(WSAEventSelect);\n    ATTACH(WSAGetOverlappedResult);\n    ATTACH(WSAGetQOSByName);\n    ATTACH(WSAGetServiceClassInfoA);\n    ATTACH(WSAGetServiceClassInfoW);\n    ATTACH(WSAGetServiceClassNameByClassIdA);\n    ATTACH(WSAGetServiceClassNameByClassIdW);\n    ATTACH(WSAHtonl);\n    ATTACH(WSAHtons);\n    ATTACH(WSAInstallServiceClassA);\n    ATTACH(WSAInstallServiceClassW);\n    ATTACH(WSAIoctl);\n    ATTACH(WSAIsBlocking);\n    ATTACH(WSAJoinLeaf);\n    ATTACH(WSALookupServiceBeginA);\n    ATTACH(WSALookupServiceBeginW);\n    ATTACH(WSALookupServiceEnd);\n    ATTACH(WSALookupServiceNextA);\n    ATTACH(WSALookupServiceNextW);\n    ATTACH(WSANtohl);\n    ATTACH(WSANtohs);\n    ATTACH(WSAProviderConfigChange);\n    ATTACH(WSARecv);\n    ATTACH(WSARecvDisconnect);\n    ATTACH(WSARecvFrom);\n    ATTACH(WSARemoveServiceClass);\n    ATTACH(WSAResetEvent);\n    ATTACH(WSASend);\n    ATTACH(WSASendDisconnect);\n    ATTACH(WSASendTo);\n    ATTACH(WSASetBlockingHook);\n    ATTACH(WSASetEvent);\n    ATTACH(WSASetServiceA);\n    ATTACH(WSASetServiceW);\n    ATTACH(WSASocketA);\n    ATTACH(WSASocketW);\n    ATTACH(WSAStartup);\n    ATTACH(WSAStringToAddressA);\n    ATTACH(WSAStringToAddressW);\n    ATTACH(WSAUnhookBlockingHook);\n    ATTACH(WSAWaitForMultipleEvents);\n    ATTACH(WaitCommEvent);\n#if !defined(DETOURS_ARM)\n    ATTACH(WaitForDebugEvent);\n#endif // !DETOURS_ARM\n    ATTACH(WaitForInputIdle);\n    ATTACH(WaitForMultipleObjects);\n    ATTACH(WaitForMultipleObjectsEx);\n    ATTACH(WaitForSingleObject);\n    ATTACH(WaitForSingleObjectEx);\n    ATTACH(WaitMessage);\n    ATTACH(WaitNamedPipeA);\n    ATTACH(WaitNamedPipeW);\n    ATTACH(WidenPath);\n    ATTACH(WinExec);\n    ATTACH(WinHelpA);\n    ATTACH(WinHelpW);\n    ATTACH(WindowFromDC);\n    ATTACH(WindowFromPoint);\n    ATTACH(WriteClassStg);\n    ATTACH(WriteClassStm);\n    ATTACH(WriteConsoleA);\n    ATTACH(WriteConsoleInputA);\n    ATTACH(WriteConsoleInputW);\n    ATTACH(WriteConsoleOutputA);\n    ATTACH(WriteConsoleOutputAttribute);\n    ATTACH(WriteConsoleOutputCharacterA);\n    ATTACH(WriteConsoleOutputCharacterW);\n    ATTACH(WriteConsoleOutputW);\n    ATTACH(WriteConsoleW);\n    ATTACH(WriteFile);\n    ATTACH(WriteFileEx);\n    ATTACH(WriteFmtUserTypeStg);\n    ATTACH(WritePrivateProfileSectionA);\n    ATTACH(WritePrivateProfileSectionW);\n    ATTACH(WritePrivateProfileStringA);\n    ATTACH(WritePrivateProfileStringW);\n    ATTACH(WritePrivateProfileStructA);\n    ATTACH(WritePrivateProfileStructW);\n    ATTACH(WriteProcessMemory);\n    ATTACH(WriteProfileSectionA);\n    ATTACH(WriteProfileSectionW);\n    ATTACH(WriteProfileStringA);\n    ATTACH(WriteProfileStringW);\n    ATTACH(WriteTapemark);\n    ATTACH(__WSAFDIsSet);\n    ATTACH(_hread);\n    ATTACH(_hwrite);\n    ATTACH(_lclose);\n    ATTACH(_lcreat);\n    ATTACH(_llseek);\n    ATTACH(_lopen);\n    ATTACH(_lread);\n    ATTACH(_lwrite);\n    ATTACH(accept);\n    ATTACH(bind);\n    ATTACH(closesocket);\n    ATTACH(connect);\n    ATTACH(gethostbyaddr);\n    ATTACH(gethostbyname);\n    ATTACH(gethostname);\n    ATTACH(getpeername);\n    ATTACH(getprotobyname);\n    ATTACH(getprotobynumber);\n    ATTACH(getservbyname);\n    ATTACH(getservbyport);\n    ATTACH(getsockname);\n    ATTACH(getsockopt);\n    ATTACH(htonl);\n    ATTACH(htons);\n    ATTACH(inet_addr);\n    ATTACH(inet_ntoa);\n    ATTACH(ioctlsocket);\n    ATTACH(keybd_event);\n    ATTACH(listen);\n    ATTACH(mouse_event);\n    ATTACH(ntohl);\n    ATTACH(ntohs);\n    ATTACH(recv);\n    ATTACH(recvfrom);\n    ATTACH(select);\n    ATTACH(send);\n    ATTACH(sendto);\n    ATTACH(setsockopt);\n    ATTACH(shutdown);\n    ATTACH(socket);\n\n    PVOID *ppbFailedPointer = NULL;\n    LONG error = DetourTransactionCommitEx(&ppbFailedPointer);\n    if (error != 0) {\n        printf(\"traceapi.dll: Attach transaction failed to commit. Error %ld (%p/%p)\",\n               error, ppbFailedPointer, *ppbFailedPointer);\n        return error;\n    }\n    return 0;\n}\n\nLONG DetachDetours(VOID)\n{\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n\n    // For this many APIs, we'll ignore one or two can't be detoured.\n    DetourSetIgnoreTooSmall(TRUE);\n\n    DETACH(AbortDoc);\n    DETACH(AbortPath);\n    DETACH(ActivateKeyboardLayout);\n    DETACH(AddAtomA);\n    DETACH(AddAtomW);\n    DETACH(AddFontResourceA);\n    DETACH(AddFontResourceW);\n    DETACH(AdjustWindowRect);\n    DETACH(AdjustWindowRectEx);\n    DETACH(AllocConsole);\n    DETACH(AngleArc);\n    DETACH(AnimatePalette);\n    DETACH(AnyPopup);\n    DETACH(AppendMenuA);\n    DETACH(AppendMenuW);\n    DETACH(Arc);\n    DETACH(ArcTo);\n    DETACH(AreFileApisANSI);\n    DETACH(ArrangeIconicWindows);\n    DETACH(AttachThreadInput);\n    DETACH(BackupRead);\n    DETACH(BackupSeek);\n    DETACH(BackupWrite);\n    DETACH(Beep);\n    DETACH(BeginDeferWindowPos);\n    DETACH(BeginPaint);\n    DETACH(BeginPath);\n    DETACH(BeginUpdateResourceA);\n    DETACH(BeginUpdateResourceW);\n    DETACH(BindMoniker);\n    DETACH(BitBlt);\n    DETACH(BringWindowToTop);\n    DETACH(BroadcastSystemMessageA);\n    DETACH(BroadcastSystemMessageW);\n    DETACH(BuildCommDCBA);\n    DETACH(BuildCommDCBAndTimeoutsA);\n    DETACH(BuildCommDCBAndTimeoutsW);\n    DETACH(BuildCommDCBW);\n    DETACH(CLSIDFromProgID);\n    DETACH(CLSIDFromString);\n    DETACH(CallMsgFilterA);\n    DETACH(CallMsgFilterW);\n    DETACH(CallNamedPipeA);\n    DETACH(CallNamedPipeW);\n    DETACH(CallNextHookEx);\n    DETACH(CallWindowProcA);\n    DETACH(CallWindowProcW);\n    DETACH(CancelDC);\n    DETACH(CancelIo);\n    DETACH(CancelWaitableTimer);\n    DETACH(CascadeWindows);\n    DETACH(ChangeClipboardChain);\n    DETACH(ChangeDisplaySettingsA);\n    DETACH(ChangeDisplaySettingsExA);\n    DETACH(ChangeDisplaySettingsExW);\n    DETACH(ChangeDisplaySettingsW);\n    DETACH(ChangeMenuA);\n    DETACH(ChangeMenuW);\n    DETACH(CharLowerA);\n    DETACH(CharLowerBuffA);\n    DETACH(CharLowerBuffW);\n    DETACH(CharLowerW);\n    DETACH(CharNextA);\n    DETACH(CharNextExA);\n    DETACH(CharNextW);\n    DETACH(CharPrevA);\n    DETACH(CharPrevExA);\n    DETACH(CharPrevW);\n    DETACH(CharToOemA);\n    DETACH(CharToOemBuffA);\n    DETACH(CharToOemBuffW);\n    DETACH(CharToOemW);\n    DETACH(CharUpperA);\n    DETACH(CharUpperBuffA);\n    DETACH(CharUpperBuffW);\n    DETACH(CharUpperW);\n    DETACH(CheckColorsInGamut);\n    DETACH(CheckDlgButton);\n    DETACH(CheckMenuItem);\n    DETACH(CheckMenuRadioItem);\n    DETACH(CheckRadioButton);\n    DETACH(ChildWindowFromPoint);\n    DETACH(ChildWindowFromPointEx);\n    DETACH(ChoosePixelFormat);\n    DETACH(Chord);\n    DETACH(ClearCommBreak);\n    DETACH(ClearCommError);\n    DETACH(ClientToScreen);\n    DETACH(ClipCursor);\n    DETACH(CloseClipboard);\n    DETACH(CloseDesktop);\n    DETACH(CloseEnhMetaFile);\n    DETACH(CloseFigure);\n    DETACH(CloseHandle);\n    DETACH(CloseMetaFile);\n    DETACH(CloseWindow);\n    DETACH(CloseWindowStation);\n    DETACH(CoAddRefServerProcess);\n    DETACH(CoBuildVersion);\n    DETACH(CoCopyProxy);\n    DETACH(CoCreateFreeThreadedMarshaler);\n    DETACH(CoCreateGuid);\n    DETACH(CoCreateInstance);\n    DETACH(CoCreateInstanceEx);\n    DETACH(CoDisconnectObject);\n    DETACH(CoDosDateTimeToFileTime);\n    DETACH(CoFileTimeNow);\n    DETACH(CoFileTimeToDosDateTime);\n    DETACH(CoFreeAllLibraries);\n    DETACH(CoFreeLibrary);\n    DETACH(CoFreeUnusedLibraries);\n    DETACH(CoGetCallContext);\n    DETACH(CoGetClassObject);\n    DETACH(CoGetCurrentProcess);\n    DETACH(CoGetInstanceFromFile);\n    DETACH(CoGetInstanceFromIStorage);\n    DETACH(CoGetInterfaceAndReleaseStream);\n    DETACH(CoGetMalloc);\n    DETACH(CoGetMarshalSizeMax);\n    DETACH(CoGetObject);\n    DETACH(CoGetPSClsid);\n    DETACH(CoGetStandardMarshal);\n    DETACH(CoGetStdMarshalEx);\n    DETACH(CoGetTreatAsClass);\n    DETACH(CoImpersonateClient);\n    DETACH(CoInitialize);\n    DETACH(CoInitializeEx);\n    DETACH(CoInitializeSecurity);\n    DETACH(CoIsHandlerConnected);\n    DETACH(CoIsOle1Class);\n    DETACH(CoLoadLibrary);\n    DETACH(CoLockObjectExternal);\n    DETACH(CoMarshalHresult);\n    DETACH(CoMarshalInterThreadInterfaceInStream);\n    DETACH(CoMarshalInterface);\n    DETACH(CoQueryAuthenticationServices);\n    DETACH(CoQueryClientBlanket);\n    DETACH(CoQueryProxyBlanket);\n    DETACH(CoRegisterChannelHook);\n    DETACH(CoRegisterClassObject);\n    DETACH(CoRegisterMallocSpy);\n    DETACH(CoRegisterMessageFilter);\n    DETACH(CoRegisterPSClsid);\n    DETACH(CoRegisterSurrogate);\n    DETACH(CoReleaseMarshalData);\n    DETACH(CoReleaseServerProcess);\n    DETACH(CoResumeClassObjects);\n    DETACH(CoRevertToSelf);\n    DETACH(CoRevokeClassObject);\n    DETACH(CoRevokeMallocSpy);\n    DETACH(CoSetProxyBlanket);\n    DETACH(CoSuspendClassObjects);\n    DETACH(CoSwitchCallContext);\n    DETACH(CoTaskMemAlloc);\n    DETACH(CoTaskMemFree);\n    DETACH(CoTaskMemRealloc);\n    DETACH(CoTreatAsClass);\n    DETACH(CoUninitialize);\n    DETACH(CoUnmarshalHresult);\n    DETACH(CoUnmarshalInterface);\n    DETACH(ColorMatchToTarget);\n    DETACH(CombineRgn);\n    DETACH(CombineTransform);\n    DETACH(CommConfigDialogA);\n    DETACH(CommConfigDialogW);\n    DETACH(CompareFileTime);\n    DETACH(CompareStringA);\n    DETACH(CompareStringW);\n    DETACH(ConnectNamedPipe);\n#if !defined(DETOURS_ARM)\n    DETACH(ContinueDebugEvent);\n#endif // !DETOURS_ARM\n    DETACH(ConvertDefaultLocale);\n    DETACH(ConvertThreadToFiber);\n    DETACH(CopyAcceleratorTableA);\n    DETACH(CopyAcceleratorTableW);\n    DETACH(CopyEnhMetaFileA);\n    DETACH(CopyEnhMetaFileW);\n    DETACH(CopyFileA);\n    DETACH(CopyFileExA);\n    DETACH(CopyFileExW);\n    DETACH(CopyFileW);\n    DETACH(CopyIcon);\n    DETACH(CopyImage);\n    DETACH(CopyMetaFileA);\n    DETACH(CopyMetaFileW);\n    DETACH(CopyRect);\n    DETACH(CountClipboardFormats);\n    DETACH(CreateAcceleratorTableA);\n    DETACH(CreateAcceleratorTableW);\n    DETACH(CreateAntiMoniker);\n    DETACH(CreateBindCtx);\n    DETACH(CreateBitmap);\n    DETACH(CreateBitmapIndirect);\n    DETACH(CreateBrushIndirect);\n    DETACH(CreateCaret);\n    DETACH(CreateClassMoniker);\n    DETACH(CreateColorSpaceA);\n    DETACH(CreateColorSpaceW);\n    DETACH(CreateCompatibleBitmap);\n    DETACH(CreateCompatibleDC);\n    DETACH(CreateConsoleScreenBuffer);\n    DETACH(CreateCursor);\n    DETACH(CreateDCA);\n    DETACH(CreateDCW);\n    DETACH(CreateDIBPatternBrush);\n    DETACH(CreateDIBPatternBrushPt);\n    DETACH(CreateDIBSection);\n    DETACH(CreateDIBitmap);\n    DETACH(CreateDataAdviseHolder);\n    DETACH(CreateDataCache);\n    DETACH(CreateDesktopA);\n    DETACH(CreateDesktopW);\n    DETACH(CreateDialogIndirectParamA);\n    DETACH(CreateDialogIndirectParamW);\n    DETACH(CreateDialogParamA);\n    DETACH(CreateDialogParamW);\n    DETACH(CreateDirectoryA);\n    DETACH(CreateDirectoryExA);\n    DETACH(CreateDirectoryExW);\n    DETACH(CreateDirectoryW);\n    DETACH(CreateDiscardableBitmap);\n    DETACH(CreateEllipticRgn);\n    DETACH(CreateEllipticRgnIndirect);\n    DETACH(CreateEnhMetaFileA);\n    DETACH(CreateEnhMetaFileW);\n    DETACH(CreateEventA);\n    DETACH(CreateEventW);\n    DETACH(CreateFiber);\n    DETACH(CreateFileA);\n    DETACH(CreateFileMappingA);\n    DETACH(CreateFileMappingW);\n    DETACH(CreateFileMoniker);\n    DETACH(CreateFileW);\n    DETACH(CreateFontA);\n    DETACH(CreateFontIndirectA);\n    DETACH(CreateFontIndirectW);\n    DETACH(CreateFontW);\n    DETACH(CreateGenericComposite);\n    DETACH(CreateHalftonePalette);\n    DETACH(CreateHatchBrush);\n    DETACH(CreateICA);\n    DETACH(CreateICW);\n    DETACH(CreateILockBytesOnHGlobal);\n    DETACH(CreateIcon);\n    DETACH(CreateIconFromResource);\n    DETACH(CreateIconFromResourceEx);\n    DETACH(CreateIconIndirect);\n    DETACH(CreateIoCompletionPort);\n    DETACH(CreateItemMoniker);\n    DETACH(CreateMDIWindowA);\n    DETACH(CreateMDIWindowW);\n    DETACH(CreateMailslotA);\n    DETACH(CreateMailslotW);\n    DETACH(CreateMenu);\n    DETACH(CreateMetaFileA);\n    DETACH(CreateMetaFileW);\n    DETACH(CreateMutexA);\n    DETACH(CreateMutexW);\n    DETACH(CreateNamedPipeA);\n    DETACH(CreateNamedPipeW);\n    DETACH(CreateOleAdviseHolder);\n    DETACH(CreatePalette);\n    DETACH(CreatePatternBrush);\n    DETACH(CreatePen);\n    DETACH(CreatePenIndirect);\n    DETACH(CreatePipe);\n    DETACH(CreatePointerMoniker);\n    DETACH(CreatePolyPolygonRgn);\n    DETACH(CreatePolygonRgn);\n    DETACH(CreatePopupMenu);\n    DETACH(CreateProcessA);\n    DETACH(CreateProcessW);\n    DETACH(CreateProcessAsUserA);\n    DETACH(CreateProcessAsUserW);\n#if(_WIN32_WINNT >= 0x0500)\n    DETACH(CreateProcessWithLogonW);\n    DETACH(CreateProcessWithTokenW);\n#endif //(_WIN32_WINNT >= 0x0500)\n    DETACH(CreateRectRgn);\n    DETACH(CreateRectRgnIndirect);\n    DETACH(CreateRemoteThread);\n    DETACH(CreateRoundRectRgn);\n    DETACH(CreateScalableFontResourceA);\n    DETACH(CreateScalableFontResourceW);\n    DETACH(CreateSemaphoreA);\n    DETACH(CreateSemaphoreW);\n    DETACH(CreateSolidBrush);\n    DETACH(CreateStdProgressIndicator);\n    DETACH(CreateStreamOnHGlobal);\n    DETACH(CreateTapePartition);\n    DETACH(CreateThread);\n    DETACH(CreateWaitableTimerA);\n    DETACH(CreateWaitableTimerW);\n    DETACH(CreateWindowExA);\n    DETACH(CreateWindowExW);\n    DETACH(CreateWindowStationA);\n    DETACH(CreateWindowStationW);\n    DETACH(DPtoLP);\n    DETACH(DdeAbandonTransaction);\n    DETACH(DdeAccessData);\n    DETACH(DdeAddData);\n    DETACH(DdeClientTransaction);\n    DETACH(DdeCmpStringHandles);\n    DETACH(DdeConnect);\n    DETACH(DdeConnectList);\n    DETACH(DdeCreateDataHandle);\n    DETACH(DdeCreateStringHandleA);\n    DETACH(DdeCreateStringHandleW);\n    DETACH(DdeDisconnect);\n    DETACH(DdeDisconnectList);\n    DETACH(DdeEnableCallback);\n    DETACH(DdeFreeDataHandle);\n    DETACH(DdeFreeStringHandle);\n    DETACH(DdeGetData);\n    DETACH(DdeGetLastError);\n    DETACH(DdeImpersonateClient);\n    DETACH(DdeKeepStringHandle);\n    DETACH(DdeNameService);\n    DETACH(DdePostAdvise);\n    DETACH(DdeQueryConvInfo);\n    DETACH(DdeQueryNextServer);\n    DETACH(DdeQueryStringA);\n    DETACH(DdeQueryStringW);\n    DETACH(DdeReconnect);\n    DETACH(DdeSetQualityOfService);\n    DETACH(DdeSetUserHandle);\n    DETACH(DdeUnaccessData);\n    DETACH(DdeUninitialize);\n    DETACH(DebugActiveProcess);\n    DETACH(DebugActiveProcessStop);\n    DETACH(DebugBreak);\n    DETACH(DefDlgProcA);\n    DETACH(DefDlgProcW);\n    DETACH(DefFrameProcA);\n    DETACH(DefFrameProcW);\n    DETACH(DefMDIChildProcA);\n    DETACH(DefMDIChildProcW);\n    DETACH(DefWindowProcA);\n    DETACH(DefWindowProcW);\n    DETACH(DeferWindowPos);\n    DETACH(DefineDosDeviceA);\n    DETACH(DefineDosDeviceW);\n    DETACH(DeleteAtom);\n    DETACH(DeleteColorSpace);\n    DETACH(DeleteDC);\n    DETACH(DeleteEnhMetaFile);\n    DETACH(DeleteFiber);\n    DETACH(DeleteFileA);\n    DETACH(DeleteFileW);\n    DETACH(DeleteMenu);\n    DETACH(DeleteMetaFile);\n    DETACH(DeleteObject);\n    DETACH(DescribePixelFormat);\n    DETACH(DestroyAcceleratorTable);\n    DETACH(DestroyCaret);\n    DETACH(DestroyCursor);\n    DETACH(DestroyIcon);\n    DETACH(DestroyMenu);\n    DETACH(DestroyWindow);\n    DETACH(DeviceIoControl);\n    DETACH(DialogBoxIndirectParamA);\n    DETACH(DialogBoxIndirectParamW);\n    DETACH(DialogBoxParamA);\n    DETACH(DialogBoxParamW);\n    DETACH(DisableThreadLibraryCalls);\n    DETACH(DisconnectNamedPipe);\n    DETACH(DispatchMessageA);\n    DETACH(DispatchMessageW);\n    DETACH(DlgDirListA);\n    DETACH(DlgDirListComboBoxA);\n    DETACH(DlgDirListComboBoxW);\n    DETACH(DlgDirListW);\n    DETACH(DlgDirSelectComboBoxExA);\n    DETACH(DlgDirSelectComboBoxExW);\n    DETACH(DlgDirSelectExA);\n    DETACH(DlgDirSelectExW);\n    DETACH(DoDragDrop);\n    DETACH(DosDateTimeToFileTime);\n    DETACH(DragDetect);\n    DETACH(DragObject);\n    DETACH(DrawAnimatedRects);\n    DETACH(DrawCaption);\n    DETACH(DrawEdge);\n    DETACH(DrawEscape);\n    DETACH(DrawFocusRect);\n    DETACH(DrawFrameControl);\n    DETACH(DrawIcon);\n    DETACH(DrawIconEx);\n    DETACH(DrawMenuBar);\n    DETACH(DrawStateA);\n    DETACH(DrawStateW);\n    DETACH(DrawTextA);\n    DETACH(DrawTextExA);\n    DETACH(DrawTextExW);\n    DETACH(DrawTextW);\n    DETACH(DuplicateHandle);\n    DETACH(Ellipse);\n    DETACH(EmptyClipboard);\n    DETACH(EnableMenuItem);\n    DETACH(EnableScrollBar);\n    DETACH(EnableWindow);\n    DETACH(EndDeferWindowPos);\n    DETACH(EndDialog);\n    DETACH(EndDoc);\n    DETACH(EndPage);\n    DETACH(EndPaint);\n    DETACH(EndPath);\n    DETACH(EndUpdateResourceA);\n    DETACH(EndUpdateResourceW);\n    DETACH(EnumCalendarInfoA);\n    DETACH(EnumCalendarInfoW);\n    DETACH(EnumChildWindows);\n    DETACH(EnumClipboardFormats);\n    DETACH(EnumDateFormatsA);\n    DETACH(EnumDateFormatsW);\n    DETACH(EnumDesktopWindows);\n    DETACH(EnumDesktopsA);\n    DETACH(EnumDesktopsW);\n    DETACH(EnumDisplaySettingsA);\n    DETACH(EnumDisplaySettingsW);\n    DETACH(EnumEnhMetaFile);\n    DETACH(EnumFontFamiliesA);\n    DETACH(EnumFontFamiliesExA);\n    DETACH(EnumFontFamiliesExW);\n    DETACH(EnumFontFamiliesW);\n    DETACH(EnumFontsA);\n    DETACH(EnumFontsW);\n    DETACH(EnumICMProfilesA);\n    DETACH(EnumICMProfilesW);\n    DETACH(EnumMetaFile);\n    DETACH(EnumObjects);\n    DETACH(EnumPropsA);\n    DETACH(EnumPropsExA);\n    DETACH(EnumPropsExW);\n    DETACH(EnumPropsW);\n    DETACH(EnumResourceLanguagesA);\n    DETACH(EnumResourceLanguagesW);\n    DETACH(EnumResourceNamesA);\n    DETACH(EnumResourceNamesW);\n    DETACH(EnumResourceTypesA);\n    DETACH(EnumResourceTypesW);\n    DETACH(EnumSystemCodePagesA);\n    DETACH(EnumSystemCodePagesW);\n#if(WINVER >= 0x0500)\n    DETACH(EnumSystemLocalesA);\n    DETACH(EnumSystemLocalesW);\n#endif // (WINVER >= 0x0500)\n    DETACH(EnumThreadWindows);\n    DETACH(EnumTimeFormatsA);\n    DETACH(EnumTimeFormatsW);\n    DETACH(EnumWindowStationsA);\n    DETACH(EnumWindowStationsW);\n    DETACH(EnumWindows);\n    DETACH(EqualRect);\n    DETACH(EqualRgn);\n    DETACH(EraseTape);\n    DETACH(Escape);\n    DETACH(EscapeCommFunction);\n    DETACH(ExcludeClipRect);\n    DETACH(ExcludeUpdateRgn);\n    DETACH(ExitProcess);\n    DETACH(ExitThread);\n    DETACH(ExitWindowsEx);\n    DETACH(ExpandEnvironmentStringsA);\n    DETACH(ExpandEnvironmentStringsW);\n    DETACH(ExtCreatePen);\n    DETACH(ExtCreateRegion);\n    DETACH(ExtEscape);\n    DETACH(ExtFloodFill);\n    DETACH(ExtSelectClipRgn);\n    DETACH(ExtTextOutA);\n    DETACH(ExtTextOutW);\n    DETACH(FatalAppExitA);\n    DETACH(FatalAppExitW);\n    DETACH(FatalExit);\n    DETACH(FileTimeToDosDateTime);\n    DETACH(FileTimeToLocalFileTime);\n    DETACH(FileTimeToSystemTime);\n    DETACH(FillConsoleOutputAttribute);\n    DETACH(FillConsoleOutputCharacterA);\n    DETACH(FillConsoleOutputCharacterW);\n    DETACH(FillPath);\n    DETACH(FillRect);\n    DETACH(FillRgn);\n    DETACH(FindAtomA);\n    DETACH(FindAtomW);\n    DETACH(FindClose);\n    DETACH(FindCloseChangeNotification);\n    DETACH(FindFirstChangeNotificationA);\n    DETACH(FindFirstChangeNotificationW);\n    DETACH(FindFirstFileA);\n    DETACH(FindFirstFileExA);\n    DETACH(FindFirstFileExW);\n    DETACH(FindFirstFileW);\n    DETACH(FindNextChangeNotification);\n    DETACH(FindNextFileA);\n    DETACH(FindNextFileW);\n    DETACH(FindResourceA);\n    DETACH(FindResourceExA);\n    DETACH(FindResourceExW);\n    DETACH(FindResourceW);\n    DETACH(FindWindowA);\n    DETACH(FindWindowExA);\n    DETACH(FindWindowExW);\n    DETACH(FindWindowW);\n    DETACH(FixBrushOrgEx);\n    DETACH(FlashWindow);\n    DETACH(FlattenPath);\n    DETACH(FloodFill);\n    DETACH(FlushConsoleInputBuffer);\n    DETACH(FlushFileBuffers);\n    DETACH(FlushViewOfFile);\n    DETACH(FmtIdToPropStgName);\n    DETACH(FoldStringA);\n    DETACH(FoldStringW);\n    DETACH(FormatMessageA);\n    DETACH(FormatMessageW);\n    DETACH(FrameRect);\n    DETACH(FrameRgn);\n    DETACH(FreeConsole);\n    DETACH(FreeDDElParam);\n    DETACH(FreeEnvironmentStringsA);\n    DETACH(FreeEnvironmentStringsW);\n    DETACH(FreeLibrary);\n    DETACH(FreeLibraryAndExitThread);\n    DETACH(FreePropVariantArray);\n    DETACH(FreeResource);\n    DETACH(GdiComment);\n    DETACH(GdiFlush);\n    DETACH(GdiGetBatchLimit);\n    DETACH(GdiSetBatchLimit);\n    DETACH(GenerateConsoleCtrlEvent);\n    DETACH(GetACP);\n    DETACH(GetActiveWindow);\n    DETACH(GetArcDirection);\n    DETACH(GetAspectRatioFilterEx);\n    DETACH(GetAsyncKeyState);\n    DETACH(GetAtomNameA);\n    DETACH(GetAtomNameW);\n    DETACH(GetBinaryTypeA);\n    DETACH(GetBinaryTypeW);\n    DETACH(GetBitmapBits);\n    DETACH(GetBitmapDimensionEx);\n    DETACH(GetBkColor);\n    DETACH(GetBkMode);\n    DETACH(GetBoundsRect);\n    DETACH(GetBrushOrgEx);\n    DETACH(GetCPInfo);\n    DETACH(GetCapture);\n    DETACH(GetCaretBlinkTime);\n    DETACH(GetCaretPos);\n    DETACH(GetCharABCWidthsA);\n    DETACH(GetCharABCWidthsFloatA);\n    DETACH(GetCharABCWidthsFloatW);\n    DETACH(GetCharABCWidthsW);\n    DETACH(GetCharWidth32A);\n    DETACH(GetCharWidth32W);\n    DETACH(GetCharWidthA);\n    DETACH(GetCharWidthFloatA);\n    DETACH(GetCharWidthFloatW);\n    DETACH(GetCharWidthW);\n    DETACH(GetCharacterPlacementA);\n    DETACH(GetCharacterPlacementW);\n    DETACH(GetClassFile);\n    DETACH(GetClassInfoA);\n    DETACH(GetClassInfoExA);\n    DETACH(GetClassInfoExW);\n    DETACH(GetClassInfoW);\n    DETACH(GetClassLongA);\n    DETACH(GetClassLongW);\n    DETACH(GetClassNameA);\n    DETACH(GetClassNameW);\n    DETACH(GetClassWord);\n    DETACH(GetClientRect);\n    DETACH(GetClipBox);\n    DETACH(GetClipCursor);\n    DETACH(GetClipRgn);\n    DETACH(GetClipboardData);\n    DETACH(GetClipboardFormatNameA);\n    DETACH(GetClipboardFormatNameW);\n    DETACH(GetClipboardOwner);\n    DETACH(GetClipboardViewer);\n    DETACH(GetColorAdjustment);\n    DETACH(GetColorSpace);\n    DETACH(GetCommConfig);\n    DETACH(GetCommMask);\n    DETACH(GetCommModemStatus);\n    DETACH(GetCommProperties);\n    DETACH(GetCommState);\n    DETACH(GetCommTimeouts);\n    DETACH(GetCommandLineA);\n    DETACH(GetCommandLineW);\n    DETACH(GetComputerNameA);\n    DETACH(GetComputerNameW);\n    DETACH(GetConsoleCP);\n    DETACH(GetConsoleCursorInfo);\n    DETACH(GetConsoleMode);\n    DETACH(GetConsoleOutputCP);\n    DETACH(GetConsoleScreenBufferInfo);\n    DETACH(GetConsoleTitleA);\n    DETACH(GetConsoleTitleW);\n    DETACH(GetConvertStg);\n    DETACH(GetCurrencyFormatA);\n    DETACH(GetCurrencyFormatW);\n    DETACH(GetCurrentDirectoryA);\n    DETACH(GetCurrentDirectoryW);\n    DETACH(GetCurrentObject);\n    DETACH(GetCurrentPositionEx);\n    DETACH(GetCurrentProcess);\n    DETACH(GetCurrentProcessId);\n    DETACH(GetCurrentThreadId);\n    DETACH(GetCursor);\n    DETACH(GetCursorPos);\n    DETACH(GetDC);\n    DETACH(GetDCEx);\n    DETACH(GetDCOrgEx);\n    DETACH(GetDIBColorTable);\n    DETACH(GetDIBits);\n    DETACH(GetDateFormatA);\n    DETACH(GetDateFormatW);\n    DETACH(GetDefaultCommConfigA);\n    DETACH(GetDefaultCommConfigW);\n    DETACH(GetDesktopWindow);\n    DETACH(GetDeviceCaps);\n    DETACH(GetDeviceGammaRamp);\n    DETACH(GetDialogBaseUnits);\n    DETACH(GetDiskFreeSpaceA);\n    DETACH(GetDiskFreeSpaceExA);\n    DETACH(GetDiskFreeSpaceExW);\n    DETACH(GetDiskFreeSpaceW);\n    DETACH(GetDlgCtrlID);\n    DETACH(GetDlgItem);\n    DETACH(GetDlgItemInt);\n    DETACH(GetDlgItemTextA);\n    DETACH(GetDlgItemTextW);\n    DETACH(GetDoubleClickTime);\n    DETACH(GetDriveTypeA);\n    DETACH(GetDriveTypeW);\n    DETACH(GetEnhMetaFileA);\n    DETACH(GetEnhMetaFileBits);\n    DETACH(GetEnhMetaFileDescriptionA);\n    DETACH(GetEnhMetaFileDescriptionW);\n    DETACH(GetEnhMetaFileHeader);\n    DETACH(GetEnhMetaFilePaletteEntries);\n    DETACH(GetEnhMetaFilePixelFormat);\n    DETACH(GetEnhMetaFileW);\n    DETACH(GetEnvironmentStrings);\n    DETACH(GetEnvironmentStringsW);\n    DETACH(GetEnvironmentVariableA);\n    DETACH(GetEnvironmentVariableW);\n    DETACH(GetExitCodeProcess);\n    DETACH(GetExitCodeThread);\n    DETACH(GetFileAttributesA);\n    DETACH(GetFileAttributesExA);\n    DETACH(GetFileAttributesExW);\n    DETACH(GetFileAttributesW);\n    DETACH(GetFileInformationByHandle);\n    DETACH(GetFileSize);\n    DETACH(GetFileTime);\n    DETACH(GetFileType);\n    DETACH(GetFocus);\n    DETACH(GetFontData);\n    DETACH(GetFontLanguageInfo);\n    DETACH(GetForegroundWindow);\n    DETACH(GetFullPathNameA);\n    DETACH(GetFullPathNameW);\n    DETACH(GetGlyphOutlineA);\n    DETACH(GetGlyphOutlineW);\n    DETACH(GetGraphicsMode);\n    DETACH(GetHGlobalFromILockBytes);\n    DETACH(GetHGlobalFromStream);\n    DETACH(GetHandleInformation);\n    DETACH(GetICMProfileA);\n    DETACH(GetICMProfileW);\n    DETACH(GetIconInfo);\n    DETACH(GetInputState);\n    DETACH(GetKBCodePage);\n    DETACH(GetKerningPairsA);\n    DETACH(GetKerningPairsW);\n    DETACH(GetKeyNameTextA);\n    DETACH(GetKeyNameTextW);\n    DETACH(GetKeyState);\n    DETACH(GetKeyboardLayout);\n    DETACH(GetKeyboardLayoutList);\n    DETACH(GetKeyboardLayoutNameA);\n    DETACH(GetKeyboardLayoutNameW);\n    DETACH(GetKeyboardState);\n    DETACH(GetKeyboardType);\n    DETACH(GetLastActivePopup);\n    DETACH(GetLocalTime);\n    DETACH(GetLocaleInfoA);\n    DETACH(GetLocaleInfoW);\n    DETACH(GetLogColorSpaceA);\n    DETACH(GetLogColorSpaceW);\n    DETACH(GetLogicalDriveStringsA);\n    DETACH(GetLogicalDriveStringsW);\n    DETACH(GetLogicalDrives);\n    DETACH(GetMailslotInfo);\n    DETACH(GetMapMode);\n    DETACH(GetMenu);\n    DETACH(GetMenuCheckMarkDimensions);\n    DETACH(GetMenuContextHelpId);\n    DETACH(GetMenuDefaultItem);\n    DETACH(GetMenuItemCount);\n    DETACH(GetMenuItemID);\n    DETACH(GetMenuItemInfoA);\n    DETACH(GetMenuItemInfoW);\n    DETACH(GetMenuItemRect);\n    DETACH(GetMenuState);\n    DETACH(GetMenuStringA);\n    DETACH(GetMenuStringW);\n    DETACH(GetMessageA);\n    DETACH(GetMessageExtraInfo);\n    DETACH(GetMessagePos);\n    DETACH(GetMessageTime);\n    DETACH(GetMessageW);\n    DETACH(GetMetaFileA);\n    DETACH(GetMetaFileBitsEx);\n    DETACH(GetMetaFileW);\n    DETACH(GetMetaRgn);\n    DETACH(GetMiterLimit);\n    DETACH(GetModuleFileNameA);\n    DETACH(GetModuleFileNameW);\n    DETACH(GetModuleHandleA);\n    DETACH(GetModuleHandleW);\n    DETACH(GetNamedPipeHandleStateA);\n    DETACH(GetNamedPipeHandleStateW);\n    DETACH(GetNamedPipeInfo);\n    DETACH(GetNearestColor);\n    DETACH(GetNearestPaletteIndex);\n    DETACH(GetNextDlgGroupItem);\n    DETACH(GetNextDlgTabItem);\n    DETACH(GetNumberFormatA);\n    DETACH(GetNumberFormatW);\n    DETACH(GetNumberOfConsoleInputEvents);\n    DETACH(GetNumberOfConsoleMouseButtons);\n    DETACH(GetOEMCP);\n    DETACH(GetObjectA);\n    DETACH(GetObjectType);\n    DETACH(GetObjectW);\n    DETACH(GetOpenClipboardWindow);\n    DETACH(GetOutlineTextMetricsA);\n    DETACH(GetOutlineTextMetricsW);\n    DETACH(GetOverlappedResult);\n    DETACH(GetPaletteEntries);\n    DETACH(GetParent);\n    DETACH(GetPath);\n    DETACH(GetPixel);\n    DETACH(GetPixelFormat);\n    DETACH(GetPolyFillMode);\n    DETACH(GetPriorityClass);\n    DETACH(GetPriorityClipboardFormat);\n    DETACH(GetPrivateProfileIntA);\n    DETACH(GetPrivateProfileIntW);\n    DETACH(GetPrivateProfileSectionA);\n    DETACH(GetPrivateProfileSectionNamesA);\n    DETACH(GetPrivateProfileSectionNamesW);\n    DETACH(GetPrivateProfileSectionW);\n    DETACH(GetPrivateProfileStringA);\n    DETACH(GetPrivateProfileStringW);\n    DETACH(GetPrivateProfileStructA);\n    DETACH(GetPrivateProfileStructW);\n    DETACH(GetProcAddress);\n    DETACH(GetProcessAffinityMask);\n    DETACH(GetProcessHeaps);\n    DETACH(GetProcessShutdownParameters);\n    DETACH(GetProcessTimes);\n    DETACH(GetProcessVersion);\n    DETACH(GetProcessWindowStation);\n    DETACH(GetProcessWorkingSetSize);\n    DETACH(GetProfileIntA);\n    DETACH(GetProfileIntW);\n    DETACH(GetProfileSectionA);\n    DETACH(GetProfileSectionW);\n    DETACH(GetProfileStringA);\n    DETACH(GetProfileStringW);\n    DETACH(GetPropA);\n    DETACH(GetPropW);\n    DETACH(GetQueueStatus);\n    DETACH(GetQueuedCompletionStatus);\n    DETACH(GetROP2);\n    DETACH(GetRasterizerCaps);\n    DETACH(GetRegionData);\n    DETACH(GetRgnBox);\n    DETACH(GetRunningObjectTable);\n    DETACH(GetScrollInfo);\n    DETACH(GetScrollPos);\n    DETACH(GetScrollRange);\n    DETACH(GetShortPathNameA);\n    DETACH(GetShortPathNameW);\n    DETACH(GetStartupInfoA);\n    DETACH(GetStartupInfoW);\n    DETACH(GetStdHandle);\n    DETACH(GetStockObject);\n    DETACH(GetStretchBltMode);\n    DETACH(GetSubMenu);\n    DETACH(GetSysColor);\n    DETACH(GetSysColorBrush);\n    DETACH(GetSystemDefaultLCID);\n    DETACH(GetSystemDefaultLangID);\n    DETACH(GetSystemDirectoryA);\n    DETACH(GetSystemDirectoryW);\n    DETACH(GetSystemInfo);\n    DETACH(GetSystemMenu);\n    DETACH(GetSystemMetrics);\n    DETACH(GetSystemPaletteEntries);\n    DETACH(GetSystemPaletteUse);\n    DETACH(GetSystemPowerStatus);\n    DETACH(GetSystemTime);\n    DETACH(GetSystemTimeAdjustment);\n    DETACH(GetSystemTimeAsFileTime);\n    DETACH(GetTabbedTextExtentA);\n    DETACH(GetTabbedTextExtentW);\n    DETACH(GetTapeParameters);\n    DETACH(GetTapePosition);\n    DETACH(GetTapeStatus);\n    DETACH(GetTempFileNameA);\n    DETACH(GetTempFileNameW);\n    DETACH(GetTempPathA);\n    DETACH(GetTempPathW);\n    DETACH(GetTextAlign);\n    DETACH(GetTextCharacterExtra);\n    DETACH(GetTextCharset);\n    DETACH(GetTextCharsetInfo);\n    DETACH(GetTextColor);\n    DETACH(GetTextExtentExPointA);\n    DETACH(GetTextExtentExPointW);\n    DETACH(GetTextExtentPoint32A);\n    DETACH(GetTextExtentPoint32W);\n    DETACH(GetTextExtentPointA);\n    DETACH(GetTextExtentPointW);\n    DETACH(GetTextFaceA);\n    DETACH(GetTextFaceW);\n    DETACH(GetTextMetricsA);\n    DETACH(GetTextMetricsW);\n    DETACH(GetThreadContext);\n    DETACH(GetThreadDesktop);\n#if(WINVER >= 0x0500)\n    DETACH(GetThreadLocale);\n#endif // (WINVER >= 0x0500)\n    DETACH(GetThreadPriority);\n    DETACH(GetThreadPriorityBoost);\n    DETACH(GetThreadSelectorEntry);\n    DETACH(GetThreadTimes);\n    DETACH(GetTickCount);\n    DETACH(GetTimeFormatA);\n    DETACH(GetTimeFormatW);\n    DETACH(GetTimeZoneInformation);\n    DETACH(GetTopWindow);\n    DETACH(GetUpdateRect);\n    DETACH(GetUpdateRgn);\n    DETACH(GetUserDefaultLCID);\n    DETACH(GetUserDefaultLangID);\n    DETACH(GetUserObjectInformationA);\n    DETACH(GetUserObjectInformationW);\n    DETACH(GetUserObjectSecurity);\n    DETACH(GetVersion);\n    DETACH(GetVersionExA);\n    DETACH(GetVersionExW);\n    DETACH(GetViewportExtEx);\n    DETACH(GetViewportOrgEx);\n    DETACH(GetVolumeInformationA);\n    DETACH(GetVolumeInformationW);\n    DETACH(GetWinMetaFileBits);\n    DETACH(GetWindow);\n    DETACH(GetWindowContextHelpId);\n    DETACH(GetWindowDC);\n    DETACH(GetWindowExtEx);\n    DETACH(GetWindowLongA);\n    DETACH(GetWindowLongW);\n    DETACH(GetWindowOrgEx);\n    DETACH(GetWindowPlacement);\n    DETACH(GetWindowRect);\n    DETACH(GetWindowRgn);\n    DETACH(GetWindowTextA);\n    DETACH(GetWindowTextLengthA);\n    DETACH(GetWindowTextLengthW);\n    DETACH(GetWindowTextW);\n    DETACH(GetWindowThreadProcessId);\n    DETACH(GetWindowWord);\n    DETACH(GetWindowsDirectoryA);\n    DETACH(GetWindowsDirectoryW);\n    DETACH(GetWorldTransform);\n    DETACH(GlobalAddAtomA);\n    DETACH(GlobalAddAtomW);\n    DETACH(GlobalAlloc);\n    DETACH(GlobalCompact);\n    DETACH(GlobalDeleteAtom);\n    DETACH(GlobalFindAtomA);\n    DETACH(GlobalFindAtomW);\n    DETACH(GlobalFix);\n    DETACH(GlobalFlags);\n    DETACH(GlobalFree);\n    DETACH(GlobalGetAtomNameA);\n    DETACH(GlobalGetAtomNameW);\n    DETACH(GlobalHandle);\n    DETACH(GlobalLock);\n    DETACH(GlobalMemoryStatus);\n    DETACH(GlobalReAlloc);\n    DETACH(GlobalSize);\n    DETACH(GlobalUnWire);\n    DETACH(GlobalUnfix);\n    DETACH(GlobalUnlock);\n    DETACH(GlobalWire);\n    DETACH(GrayStringA);\n    DETACH(GrayStringW);\n    DETACH(HeapLock);\n    DETACH(HeapUnlock);\n    DETACH(HideCaret);\n    DETACH(HiliteMenuItem);\n    DETACH(IIDFromString);\n    DETACH(ImpersonateDdeClientWindow);\n    DETACH(InSendMessage);\n    DETACH(InflateRect);\n    DETACH(InitAtomTable);\n    DETACH(InsertMenuA);\n    DETACH(InsertMenuItemA);\n    DETACH(InsertMenuItemW);\n    DETACH(InsertMenuW);\n    DETACH(IntersectClipRect);\n    DETACH(IntersectRect);\n    DETACH(InvalidateRect);\n    DETACH(InvalidateRgn);\n    DETACH(InvertRect);\n    DETACH(InvertRgn);\n    DETACH(IsAccelerator);\n    DETACH(IsBadCodePtr);\n    DETACH(IsBadHugeReadPtr);\n    DETACH(IsBadHugeWritePtr);\n    DETACH(IsBadReadPtr);\n    DETACH(IsBadStringPtrA);\n    DETACH(IsBadStringPtrW);\n    DETACH(IsBadWritePtr);\n    DETACH(IsCharAlphaA);\n    DETACH(IsCharAlphaNumericA);\n    DETACH(IsCharAlphaNumericW);\n    DETACH(IsCharAlphaW);\n    DETACH(IsCharLowerA);\n    DETACH(IsCharLowerW);\n    DETACH(IsCharUpperA);\n    DETACH(IsCharUpperW);\n    DETACH(IsChild);\n    DETACH(IsClipboardFormatAvailable);\n    DETACH(IsDBCSLeadByte);\n    DETACH(IsDBCSLeadByteEx);\n    DETACH(IsDebuggerPresent);\n    DETACH(IsDialogMessageA);\n    DETACH(IsDialogMessageW);\n    DETACH(IsDlgButtonChecked);\n    DETACH(IsIconic);\n    DETACH(IsMenu);\n#if !defined(DETOURS_ARM)\n    DETACH(IsProcessorFeaturePresent);\n#endif // !DETOURS_ARM\n    DETACH(IsRectEmpty);\n    DETACH(IsValidCodePage);\n    DETACH(IsValidLocale);\n    DETACH(IsWindow);\n    DETACH(IsWindowEnabled);\n    DETACH(IsWindowUnicode);\n    DETACH(IsWindowVisible);\n    DETACH(IsZoomed);\n    DETACH(KillTimer);\n    DETACH(LPtoDP);\n    DETACH(LineDDA);\n    DETACH(LineTo);\n    DETACH(LoadAcceleratorsA);\n    DETACH(LoadAcceleratorsW);\n    DETACH(LoadBitmapA);\n    DETACH(LoadBitmapW);\n    DETACH(LoadCursorA);\n    DETACH(LoadCursorFromFileA);\n    DETACH(LoadCursorFromFileW);\n    DETACH(LoadCursorW);\n    DETACH(LoadIconA);\n    DETACH(LoadIconW);\n    DETACH(LoadImageA);\n    DETACH(LoadImageW);\n    DETACH(LoadKeyboardLayoutA);\n    DETACH(LoadKeyboardLayoutW);\n    DETACH(LoadLibraryA);\n    DETACH(LoadLibraryExA);\n    DETACH(LoadLibraryExW);\n    DETACH(LoadLibraryW);\n    DETACH(LoadMenuA);\n    DETACH(LoadMenuIndirectA);\n    DETACH(LoadMenuIndirectW);\n    DETACH(LoadMenuW);\n    DETACH(LoadModule);\n    DETACH(LoadResource);\n    DETACH(LoadStringA);\n    DETACH(LoadStringW);\n    DETACH(LocalAlloc);\n    DETACH(LocalCompact);\n    DETACH(LocalFileTimeToFileTime);\n    DETACH(LocalFlags);\n    DETACH(LocalFree);\n    DETACH(LocalHandle);\n    DETACH(LocalLock);\n    DETACH(LocalReAlloc);\n    DETACH(LocalShrink);\n    DETACH(LocalSize);\n    DETACH(LocalUnlock);\n    DETACH(LockFile);\n    DETACH(LockFileEx);\n    DETACH(LockResource);\n    DETACH(LockWindowUpdate);\n    DETACH(LookupIconIdFromDirectory);\n    DETACH(LookupIconIdFromDirectoryEx);\n    DETACH(MapDialogRect);\n    DETACH(MapViewOfFile);\n    DETACH(MapViewOfFileEx);\n    DETACH(MapVirtualKeyA);\n    DETACH(MapVirtualKeyExA);\n    DETACH(MapVirtualKeyExW);\n    DETACH(MapVirtualKeyW);\n    DETACH(MapWindowPoints);\n    DETACH(MaskBlt);\n    DETACH(MenuItemFromPoint);\n    DETACH(MessageBeep);\n    DETACH(MessageBoxA);\n    DETACH(MessageBoxExA);\n    DETACH(MessageBoxExW);\n    DETACH(MessageBoxIndirectA);\n    DETACH(MessageBoxIndirectW);\n    DETACH(MessageBoxW);\n    DETACH(MkParseDisplayName);\n    DETACH(ModifyMenuA);\n    DETACH(ModifyMenuW);\n    DETACH(ModifyWorldTransform);\n    DETACH(MonikerCommonPrefixWith);\n    DETACH(MonikerRelativePathTo);\n    DETACH(MoveFileA);\n    DETACH(MoveFileExA);\n    DETACH(MoveFileExW);\n    DETACH(MoveFileW);\n    DETACH(MoveToEx);\n    DETACH(MoveWindow);\n    DETACH(MsgWaitForMultipleObjects);\n    DETACH(MsgWaitForMultipleObjectsEx);\n    DETACH(MulDiv);\n    DETACH(OemKeyScan);\n    DETACH(OemToCharA);\n    DETACH(OemToCharBuffA);\n    DETACH(OemToCharBuffW);\n    DETACH(OemToCharW);\n    DETACH(OffsetClipRgn);\n    DETACH(OffsetRect);\n    DETACH(OffsetRgn);\n    DETACH(OffsetViewportOrgEx);\n    DETACH(OffsetWindowOrgEx);\n    DETACH(OleBuildVersion);\n    DETACH(OleConvertIStorageToOLESTREAM);\n    DETACH(OleConvertIStorageToOLESTREAMEx);\n    DETACH(OleConvertOLESTREAMToIStorage);\n    DETACH(OleConvertOLESTREAMToIStorageEx);\n    DETACH(OleCreate);\n    DETACH(OleCreateDefaultHandler);\n    DETACH(OleCreateEmbeddingHelper);\n    DETACH(OleCreateEx);\n    DETACH(OleCreateFromData);\n    DETACH(OleCreateFromDataEx);\n    DETACH(OleCreateFromFile);\n    DETACH(OleCreateFromFileEx);\n    DETACH(OleCreateLink);\n    DETACH(OleCreateLinkEx);\n    DETACH(OleCreateLinkFromData);\n    DETACH(OleCreateLinkFromDataEx);\n    DETACH(OleCreateLinkToFile);\n    DETACH(OleCreateLinkToFileEx);\n    DETACH(OleCreateMenuDescriptor);\n    DETACH(OleCreateStaticFromData);\n    DETACH(OleDestroyMenuDescriptor);\n    DETACH(OleDoAutoConvert);\n    DETACH(OleDraw);\n    DETACH(OleDuplicateData);\n    DETACH(OleFlushClipboard);\n    DETACH(OleGetAutoConvert);\n    DETACH(OleGetClipboard);\n    DETACH(OleGetIconOfClass);\n    DETACH(OleGetIconOfFile);\n    DETACH(OleInitialize);\n    DETACH(OleIsCurrentClipboard);\n    DETACH(OleIsRunning);\n    DETACH(OleLoad);\n    DETACH(OleLoadFromStream);\n    DETACH(OleLockRunning);\n    DETACH(OleMetafilePictFromIconAndLabel);\n    DETACH(OleNoteObjectVisible);\n    DETACH(OleQueryCreateFromData);\n    DETACH(OleQueryLinkFromData);\n    DETACH(OleRegEnumFormatEtc);\n    DETACH(OleRegEnumVerbs);\n    DETACH(OleRegGetMiscStatus);\n    DETACH(OleRegGetUserType);\n    DETACH(OleRun);\n    DETACH(OleSave);\n    DETACH(OleSaveToStream);\n    DETACH(OleSetAutoConvert);\n    DETACH(OleSetClipboard);\n    DETACH(OleSetContainedObject);\n    DETACH(OleSetMenuDescriptor);\n    DETACH(OleTranslateAccelerator);\n    DETACH(OleUninitialize);\n    DETACH(OpenClipboard);\n    DETACH(OpenDesktopA);\n    DETACH(OpenDesktopW);\n    DETACH(OpenEventA);\n    DETACH(OpenEventW);\n    DETACH(OpenFile);\n    DETACH(OpenFileMappingA);\n    DETACH(OpenFileMappingW);\n    DETACH(OpenIcon);\n    DETACH(OpenInputDesktop);\n    DETACH(OpenMutexA);\n    DETACH(OpenMutexW);\n    DETACH(OpenProcess);\n    DETACH(OpenProcessToken);\n    DETACH(OpenSemaphoreA);\n    DETACH(OpenSemaphoreW);\n    DETACH(OpenWaitableTimerA);\n    DETACH(OpenWaitableTimerW);\n    DETACH(OpenWindowStationA);\n    DETACH(OpenWindowStationW);\n    DETACH(OutputDebugStringA);\n    DETACH(OutputDebugStringW);\n    DETACH(PackDDElParam);\n    DETACH(PaintDesktop);\n    DETACH(PaintRgn);\n    DETACH(PatBlt);\n    DETACH(PathToRegion);\n    DETACH(PeekConsoleInputA);\n    DETACH(PeekConsoleInputW);\n    DETACH(PeekMessageA);\n    DETACH(PeekMessageW);\n    DETACH(PeekNamedPipe);\n    DETACH(Pie);\n    DETACH(PlayEnhMetaFile);\n    DETACH(PlayEnhMetaFileRecord);\n    DETACH(PlayMetaFile);\n    DETACH(PlayMetaFileRecord);\n    DETACH(PlgBlt);\n    DETACH(PolyBezier);\n    DETACH(PolyBezierTo);\n    DETACH(PolyDraw);\n    DETACH(PolyPolygon);\n    DETACH(PolyPolyline);\n    DETACH(PolyTextOutA);\n    DETACH(PolyTextOutW);\n    DETACH(Polygon);\n    DETACH(Polyline);\n    DETACH(PolylineTo);\n    DETACH(PostMessageA);\n    DETACH(PostMessageW);\n    DETACH(PostQueuedCompletionStatus);\n    DETACH(PostQuitMessage);\n    DETACH(PostThreadMessageA);\n    DETACH(PostThreadMessageW);\n    DETACH(PrepareTape);\n    DETACH(ProgIDFromCLSID);\n    DETACH(PropVariantClear);\n    DETACH(PropVariantCopy);\n    DETACH(PtInRect);\n    DETACH(PtInRegion);\n    DETACH(PtVisible);\n    DETACH(PulseEvent);\n    DETACH(PurgeComm);\n    DETACH(QueryDosDeviceA);\n    DETACH(QueryDosDeviceW);\n    DETACH(QueryPerformanceCounter);\n    DETACH(QueryPerformanceFrequency);\n    DETACH(QueueUserAPC);\n    DETACH(RaiseException);\n    DETACH(ReadClassStg);\n    DETACH(ReadClassStm);\n    DETACH(ReadConsoleA);\n    DETACH(ReadConsoleInputA);\n    DETACH(ReadConsoleInputW);\n    DETACH(ReadConsoleOutputA);\n    DETACH(ReadConsoleOutputAttribute);\n    DETACH(ReadConsoleOutputCharacterA);\n    DETACH(ReadConsoleOutputCharacterW);\n    DETACH(ReadConsoleOutputW);\n    DETACH(ReadConsoleW);\n    DETACH(ReadDirectoryChangesW);\n    DETACH(ReadFile);\n    DETACH(ReadFileEx);\n    DETACH(ReadFmtUserTypeStg);\n    DETACH(ReadProcessMemory);\n    DETACH(RealizePalette);\n    DETACH(RectInRegion);\n    DETACH(RectVisible);\n    DETACH(Rectangle);\n    DETACH(RedrawWindow);\n    DETACH(RegisterClassA);\n    DETACH(RegisterClassExA);\n    DETACH(RegisterClassExW);\n    DETACH(RegisterClassW);\n    DETACH(RegisterClipboardFormatA);\n    DETACH(RegisterClipboardFormatW);\n    DETACH(RegisterDragDrop);\n    DETACH(RegisterHotKey);\n    DETACH(RegisterWindowMessageA);\n    DETACH(RegisterWindowMessageW);\n    DETACH(ReleaseCapture);\n    DETACH(ReleaseDC);\n    DETACH(ReleaseMutex);\n    DETACH(ReleaseSemaphore);\n    DETACH(ReleaseStgMedium);\n    DETACH(RemoveDirectoryA);\n    DETACH(RemoveDirectoryW);\n    DETACH(RemoveFontResourceA);\n    DETACH(RemoveFontResourceW);\n    DETACH(RemoveMenu);\n    DETACH(RemovePropA);\n    DETACH(RemovePropW);\n    DETACH(ReplyMessage);\n    DETACH(ResetDCA);\n    DETACH(ResetDCW);\n    DETACH(ResetEvent);\n    DETACH(ResizePalette);\n    DETACH(RestoreDC);\n    DETACH(ResumeThread);\n    DETACH(ReuseDDElParam);\n    DETACH(RevokeDragDrop);\n    DETACH(RoundRect);\n    DETACH(SaveDC);\n    DETACH(ScaleViewportExtEx);\n    DETACH(ScaleWindowExtEx);\n    DETACH(ScreenToClient);\n    DETACH(ScrollConsoleScreenBufferA);\n    DETACH(ScrollConsoleScreenBufferW);\n    DETACH(ScrollDC);\n    DETACH(ScrollWindow);\n    DETACH(ScrollWindowEx);\n    DETACH(SearchPathA);\n    DETACH(SearchPathW);\n    DETACH(SelectClipPath);\n    DETACH(SelectClipRgn);\n    DETACH(SelectObject);\n    DETACH(SelectPalette);\n    DETACH(SendDlgItemMessageA);\n    DETACH(SendDlgItemMessageW);\n    DETACH(SendMessageA);\n    DETACH(SendMessageCallbackA);\n    DETACH(SendMessageCallbackW);\n    DETACH(SendMessageTimeoutA);\n    DETACH(SendMessageTimeoutW);\n    DETACH(SendMessageW);\n    DETACH(SendNotifyMessageA);\n    DETACH(SendNotifyMessageW);\n    DETACH(SetAbortProc);\n    DETACH(SetActiveWindow);\n    DETACH(SetArcDirection);\n    DETACH(SetBitmapBits);\n    DETACH(SetBitmapDimensionEx);\n    DETACH(SetBkColor);\n    DETACH(SetBkMode);\n    DETACH(SetBoundsRect);\n    DETACH(SetBrushOrgEx);\n    DETACH(SetCapture);\n    DETACH(SetCaretBlinkTime);\n    DETACH(SetCaretPos);\n    DETACH(SetClassLongA);\n    DETACH(SetClassLongW);\n    DETACH(SetClassWord);\n    DETACH(SetClipboardData);\n    DETACH(SetClipboardViewer);\n    DETACH(SetColorAdjustment);\n    DETACH(SetColorSpace);\n    DETACH(SetCommBreak);\n    DETACH(SetCommConfig);\n    DETACH(SetCommMask);\n    DETACH(SetCommState);\n    DETACH(SetCommTimeouts);\n    DETACH(SetComputerNameA);\n    DETACH(SetComputerNameW);\n    DETACH(SetConsoleActiveScreenBuffer);\n    DETACH(SetConsoleCP);\n    DETACH(SetConsoleCtrlHandler);\n    DETACH(SetConsoleCursorInfo);\n    DETACH(SetConsoleCursorPosition);\n    DETACH(SetConsoleMode);\n    DETACH(SetConsoleOutputCP);\n    DETACH(SetConsoleScreenBufferSize);\n    DETACH(SetConsoleTextAttribute);\n    DETACH(SetConsoleTitleA);\n    DETACH(SetConsoleTitleW);\n    DETACH(SetConsoleWindowInfo);\n    DETACH(SetConvertStg);\n    DETACH(SetCurrentDirectoryA);\n    DETACH(SetCurrentDirectoryW);\n    DETACH(SetCursor);\n    DETACH(SetCursorPos);\n    DETACH(SetDIBColorTable);\n    DETACH(SetDIBits);\n    DETACH(SetDIBitsToDevice);\n    DETACH(SetDefaultCommConfigA);\n    DETACH(SetDefaultCommConfigW);\n    DETACH(SetDeviceGammaRamp);\n    DETACH(SetDlgItemInt);\n    DETACH(SetDlgItemTextA);\n    DETACH(SetDlgItemTextW);\n    DETACH(SetDoubleClickTime);\n    DETACH(SetEndOfFile);\n    DETACH(SetEnhMetaFileBits);\n    DETACH(SetEnvironmentVariableA);\n    DETACH(SetEnvironmentVariableW);\n    DETACH(SetErrorMode);\n    DETACH(SetEvent);\n    DETACH(SetFileApisToANSI);\n    DETACH(SetFileApisToOEM);\n    DETACH(SetFileAttributesA);\n    DETACH(SetFileAttributesW);\n    DETACH(SetFilePointer);\n    DETACH(SetFileTime);\n    DETACH(SetFocus);\n    DETACH(SetForegroundWindow);\n    DETACH(SetGraphicsMode);\n    DETACH(SetHandleCount);\n    DETACH(SetHandleInformation);\n    DETACH(SetICMMode);\n    DETACH(SetICMProfileA);\n    DETACH(SetICMProfileW);\n    DETACH(SetKeyboardState);\n    DETACH(SetLocalTime);\n    DETACH(SetLocaleInfoA);\n    DETACH(SetLocaleInfoW);\n    DETACH(SetMailslotInfo);\n    DETACH(SetMapMode);\n    DETACH(SetMapperFlags);\n    DETACH(SetMenu);\n    DETACH(SetMenuContextHelpId);\n    DETACH(SetMenuDefaultItem);\n    DETACH(SetMenuItemBitmaps);\n    DETACH(SetMenuItemInfoA);\n    DETACH(SetMenuItemInfoW);\n    DETACH(SetMessageExtraInfo);\n    DETACH(SetMessageQueue);\n    DETACH(SetMetaFileBitsEx);\n    DETACH(SetMetaRgn);\n    DETACH(SetMiterLimit);\n    DETACH(SetNamedPipeHandleState);\n    DETACH(SetPaletteEntries);\n    DETACH(SetParent);\n    DETACH(SetPixel);\n    DETACH(SetPixelFormat);\n    DETACH(SetPixelV);\n    DETACH(SetPolyFillMode);\n    DETACH(SetPriorityClass);\n    DETACH(SetProcessAffinityMask);\n    DETACH(SetProcessShutdownParameters);\n    DETACH(SetProcessWindowStation);\n    DETACH(SetProcessWorkingSetSize);\n    DETACH(SetPropA);\n    DETACH(SetPropW);\n    DETACH(SetROP2);\n    DETACH(SetRect);\n    DETACH(SetRectEmpty);\n    DETACH(SetRectRgn);\n    DETACH(SetScrollInfo);\n    DETACH(SetScrollPos);\n    DETACH(SetScrollRange);\n    DETACH(SetStdHandle);\n    DETACH(SetStretchBltMode);\n    DETACH(SetSysColors);\n    DETACH(SetSystemCursor);\n    DETACH(SetSystemPaletteUse);\n    DETACH(SetSystemPowerState);\n    DETACH(SetSystemTime);\n    DETACH(SetSystemTimeAdjustment);\n    DETACH(SetTapeParameters);\n    DETACH(SetTapePosition);\n    DETACH(SetTextAlign);\n    DETACH(SetTextCharacterExtra);\n    DETACH(SetTextColor);\n    DETACH(SetTextJustification);\n    DETACH(SetThreadAffinityMask);\n    DETACH(SetThreadContext);\n    DETACH(SetThreadDesktop);\n    DETACH(SetThreadIdealProcessor);\n#if(WINVER >= 0x0500)\n    DETACH(SetThreadLocale);\n#endif // (WINVER >= 0x0500)\n    DETACH(SetThreadPriority);\n    DETACH(SetThreadPriorityBoost);\n    DETACH(SetTimeZoneInformation);\n    DETACH(SetTimer);\n    DETACH(SetUnhandledExceptionFilter);\n    DETACH(SetUserObjectInformationA);\n    DETACH(SetUserObjectInformationW);\n    DETACH(SetUserObjectSecurity);\n    DETACH(SetViewportExtEx);\n    DETACH(SetViewportOrgEx);\n    DETACH(SetVolumeLabelA);\n    DETACH(SetVolumeLabelW);\n    DETACH(SetWaitableTimer);\n    DETACH(SetWinMetaFileBits);\n    DETACH(SetWindowContextHelpId);\n    DETACH(SetWindowExtEx);\n    DETACH(SetWindowLongA);\n    DETACH(SetWindowLongW);\n    DETACH(SetWindowOrgEx);\n    DETACH(SetWindowPlacement);\n    DETACH(SetWindowPos);\n    DETACH(SetWindowRgn);\n    DETACH(SetWindowTextA);\n    DETACH(SetWindowTextW);\n    DETACH(SetWindowWord);\n    DETACH(SetWindowsHookA);\n    DETACH(SetWindowsHookExA);\n    DETACH(SetWindowsHookExW);\n    DETACH(SetWindowsHookW);\n    DETACH(SetWorldTransform);\n    DETACH(SetupComm);\n    DETACH(ShowCaret);\n    DETACH(ShowCursor);\n    DETACH(ShowOwnedPopups);\n    DETACH(ShowScrollBar);\n    DETACH(ShowWindow);\n    DETACH(ShowWindowAsync);\n    DETACH(SignalObjectAndWait);\n    DETACH(SizeofResource);\n    DETACH(SleepEx);\n    DETACH(StartDocA);\n    DETACH(StartDocW);\n    DETACH(StartPage);\n    DETACH(StgCreateDocfile);\n    DETACH(StgCreateDocfileOnILockBytes);\n    DETACH(StgCreatePropSetStg);\n    DETACH(StgCreatePropStg);\n    DETACH(StgCreateStorageEx);\n    DETACH(StgGetIFillLockBytesOnFile);\n    DETACH(StgGetIFillLockBytesOnILockBytes);\n    DETACH(StgIsStorageFile);\n    DETACH(StgIsStorageILockBytes);\n    DETACH(StgOpenAsyncDocfileOnIFillLockBytes);\n    DETACH(StgOpenPropStg);\n    DETACH(StgOpenStorage);\n    DETACH(StgOpenStorageEx);\n    DETACH(StgOpenStorageOnILockBytes);\n    DETACH(StgSetTimes);\n    DETACH(StretchBlt);\n    DETACH(StretchDIBits);\n    DETACH(StringFromCLSID);\n    DETACH(StringFromGUID2);\n    DETACH(StringFromIID);\n    DETACH(StrokeAndFillPath);\n    DETACH(StrokePath);\n    DETACH(SubtractRect);\n    DETACH(SuspendThread);\n    DETACH(SwapBuffers);\n    DETACH(SwapMouseButton);\n    DETACH(SwitchDesktop);\n    DETACH(SwitchToFiber);\n    DETACH(SwitchToThread);\n    DETACH(SystemParametersInfoA);\n    DETACH(SystemParametersInfoW);\n    DETACH(SystemTimeToFileTime);\n    DETACH(SystemTimeToTzSpecificLocalTime);\n    DETACH(TabbedTextOutA);\n    DETACH(TabbedTextOutW);\n    DETACH(TerminateProcess);\n    DETACH(TerminateThread);\n    DETACH(TextOutA);\n    DETACH(TextOutW);\n    DETACH(TileWindows);\n    DETACH(ToAscii);\n    DETACH(ToAsciiEx);\n    DETACH(ToUnicode);\n    DETACH(ToUnicodeEx);\n    DETACH(TrackMouseEvent);\n    DETACH(TrackPopupMenu);\n    DETACH(TrackPopupMenuEx);\n    DETACH(TransactNamedPipe);\n    DETACH(TranslateAcceleratorA);\n    DETACH(TranslateAcceleratorW);\n    DETACH(TranslateCharsetInfo);\n    DETACH(TranslateMDISysAccel);\n    DETACH(TranslateMessage);\n    DETACH(TransmitCommChar);\n#if DETOUR_TryEnterCriticalSection_EVEN_IF_IT_EXERCISES_A_BUG_IN_RtlLookupFunctionTable\n    DETACH(TryEnterCriticalSection);\n#endif\n    DETACH(UnhookWindowsHook);\n    DETACH(UnhookWindowsHookEx);\n    DETACH(UnionRect);\n    DETACH(UnloadKeyboardLayout);\n    DETACH(UnlockFile);\n    DETACH(UnlockFileEx);\n    DETACH(UnmapViewOfFile);\n    DETACH(UnpackDDElParam);\n    DETACH(UnrealizeObject);\n    DETACH(UnregisterClassA);\n    DETACH(UnregisterClassW);\n    DETACH(UnregisterHotKey);\n    DETACH(UpdateColors);\n    DETACH(UpdateResourceA);\n    DETACH(UpdateResourceW);\n    DETACH(UpdateWindow);\n    DETACH(ValidateRect);\n    DETACH(ValidateRgn);\n    DETACH(VerLanguageNameA);\n    DETACH(VerLanguageNameW);\n    DETACH(VirtualAllocEx);\n    DETACH(VirtualFreeEx);\n    DETACH(VirtualProtectEx);\n    DETACH(VirtualQueryEx);\n    DETACH(VkKeyScanA);\n    DETACH(VkKeyScanExA);\n    DETACH(VkKeyScanExW);\n    DETACH(VkKeyScanW);\n    DETACH(WSAAccept);\n    DETACH(WSAAddressToStringA);\n    DETACH(WSAAddressToStringW);\n    DETACH(WSAAsyncGetHostByAddr);\n    DETACH(WSAAsyncGetHostByName);\n    DETACH(WSAAsyncGetProtoByName);\n    DETACH(WSAAsyncGetProtoByNumber);\n    DETACH(WSAAsyncGetServByName);\n    DETACH(WSAAsyncGetServByPort);\n    DETACH(WSAAsyncSelect);\n    DETACH(WSACancelAsyncRequest);\n    DETACH(WSACancelBlockingCall);\n    DETACH(WSACleanup);\n    DETACH(WSACloseEvent);\n    DETACH(WSAConnect);\n    DETACH(WSACreateEvent);\n    DETACH(WSADuplicateSocketA);\n    DETACH(WSADuplicateSocketW);\n    DETACH(WSAEnumNameSpaceProvidersA);\n    DETACH(WSAEnumNameSpaceProvidersW);\n    DETACH(WSAEnumNetworkEvents);\n    DETACH(WSAEnumProtocolsA);\n    DETACH(WSAEnumProtocolsW);\n    DETACH(WSAEventSelect);\n    DETACH(WSAGetOverlappedResult);\n    DETACH(WSAGetQOSByName);\n    DETACH(WSAGetServiceClassInfoA);\n    DETACH(WSAGetServiceClassInfoW);\n    DETACH(WSAGetServiceClassNameByClassIdA);\n    DETACH(WSAGetServiceClassNameByClassIdW);\n    DETACH(WSAHtonl);\n    DETACH(WSAHtons);\n    DETACH(WSAInstallServiceClassA);\n    DETACH(WSAInstallServiceClassW);\n    DETACH(WSAIoctl);\n    DETACH(WSAIsBlocking);\n    DETACH(WSAJoinLeaf);\n    DETACH(WSALookupServiceBeginA);\n    DETACH(WSALookupServiceBeginW);\n    DETACH(WSALookupServiceEnd);\n    DETACH(WSALookupServiceNextA);\n    DETACH(WSALookupServiceNextW);\n    DETACH(WSANtohl);\n    DETACH(WSANtohs);\n    DETACH(WSAProviderConfigChange);\n    DETACH(WSARecv);\n    DETACH(WSARecvDisconnect);\n    DETACH(WSARecvFrom);\n    DETACH(WSARemoveServiceClass);\n    DETACH(WSAResetEvent);\n    DETACH(WSASend);\n    DETACH(WSASendDisconnect);\n    DETACH(WSASendTo);\n    DETACH(WSASetBlockingHook);\n    DETACH(WSASetEvent);\n    DETACH(WSASetServiceA);\n    DETACH(WSASetServiceW);\n    DETACH(WSASocketA);\n    DETACH(WSASocketW);\n    DETACH(WSAStartup);\n    DETACH(WSAStringToAddressA);\n    DETACH(WSAStringToAddressW);\n    DETACH(WSAUnhookBlockingHook);\n    DETACH(WSAWaitForMultipleEvents);\n    DETACH(WaitCommEvent);\n#if !defined(DETOURS_ARM)\n    DETACH(WaitForDebugEvent);\n#endif // !DETOURS_ARM\n    DETACH(WaitForInputIdle);\n    DETACH(WaitForMultipleObjects);\n    DETACH(WaitForMultipleObjectsEx);\n    DETACH(WaitForSingleObject);\n    DETACH(WaitForSingleObjectEx);\n    DETACH(WaitMessage);\n    DETACH(WaitNamedPipeA);\n    DETACH(WaitNamedPipeW);\n    DETACH(WidenPath);\n    DETACH(WinExec);\n    DETACH(WinHelpA);\n    DETACH(WinHelpW);\n    DETACH(WindowFromDC);\n    DETACH(WindowFromPoint);\n    DETACH(WriteClassStg);\n    DETACH(WriteClassStm);\n    DETACH(WriteConsoleA);\n    DETACH(WriteConsoleInputA);\n    DETACH(WriteConsoleInputW);\n    DETACH(WriteConsoleOutputA);\n    DETACH(WriteConsoleOutputAttribute);\n    DETACH(WriteConsoleOutputCharacterA);\n    DETACH(WriteConsoleOutputCharacterW);\n    DETACH(WriteConsoleOutputW);\n    DETACH(WriteConsoleW);\n    DETACH(WriteFile);\n    DETACH(WriteFileEx);\n    DETACH(WriteFmtUserTypeStg);\n    DETACH(WritePrivateProfileSectionA);\n    DETACH(WritePrivateProfileSectionW);\n    DETACH(WritePrivateProfileStringA);\n    DETACH(WritePrivateProfileStringW);\n    DETACH(WritePrivateProfileStructA);\n    DETACH(WritePrivateProfileStructW);\n    DETACH(WriteProcessMemory);\n    DETACH(WriteProfileSectionA);\n    DETACH(WriteProfileSectionW);\n    DETACH(WriteProfileStringA);\n    DETACH(WriteProfileStringW);\n    DETACH(WriteTapemark);\n    DETACH(__WSAFDIsSet);\n    DETACH(_hread);\n    DETACH(_hwrite);\n    DETACH(_lclose);\n    DETACH(_lcreat);\n    DETACH(_llseek);\n    DETACH(_lopen);\n    DETACH(_lread);\n    DETACH(_lwrite);\n    DETACH(accept);\n    DETACH(bind);\n    DETACH(closesocket);\n    DETACH(connect);\n    DETACH(gethostbyaddr);\n    DETACH(gethostbyname);\n    DETACH(gethostname);\n    DETACH(getpeername);\n    DETACH(getprotobyname);\n    DETACH(getprotobynumber);\n    DETACH(getservbyname);\n    DETACH(getservbyport);\n    DETACH(getsockname);\n    DETACH(getsockopt);\n    DETACH(htonl);\n    DETACH(htons);\n    DETACH(inet_addr);\n    DETACH(inet_ntoa);\n    DETACH(ioctlsocket);\n    DETACH(keybd_event);\n    DETACH(listen);\n    DETACH(mouse_event);\n    DETACH(ntohl);\n    DETACH(ntohs);\n    DETACH(recv);\n    DETACH(recvfrom);\n    DETACH(select);\n    DETACH(send);\n    DETACH(sendto);\n    DETACH(setsockopt);\n    DETACH(shutdown);\n    DETACH(socket);\n\n    if (DetourTransactionCommit() != 0) {\n        PVOID *ppbFailedPointer = NULL;\n        LONG error = DetourTransactionCommitEx(&ppbFailedPointer);\n\n        printf(\"traceapi.dll: Detach transaction failed to commit. Error %ld (%p/%p)\",\n               error, ppbFailedPointer, *ppbFailedPointer);\n        return error;\n    }\n    return 0;\n}\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/traceapi/testapi.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (testapi.cpp of testapi.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#include \"trcapi.cpp\"\n\n#if (_MSC_VER < 1299)\ntypedef ULONG * PULONG_PTR;\ntypedef ULONG ULONG_PTR;\ntypedef LONG * PLONG_PTR;\ntypedef LONG LONG_PTR;\n#endif\n\nVOID SyelogOpen(PCSTR pszIdentifier, BYTE nFacility)\n{\n    (void)pszIdentifier;\n    (void)nFacility;\n}\n\nVOID SyelogExV(BOOL fTerminate, BYTE nSeverity, PCSTR pszMsgf, va_list args)\n{\n    (void)fTerminate;\n\n    CHAR szBuffer[1024];\n    PCHAR psz = szBuffer;\n    BOOL fLf = FALSE;\n\n    StringCchPrintfA(psz, szBuffer + sizeof(szBuffer) - psz, \"--.%02x: \", nSeverity);\n    while (*psz) {\n        psz++;\n    }\n\n    StringCchVPrintfA(psz, szBuffer + sizeof(szBuffer) - psz, pszMsgf, args);\n    for (psz = szBuffer; *psz; psz++) {\n        if (*psz == '\\n') {\n            if (fLf) {\n                *psz = '\\0';\n                break;\n            }\n            fLf = TRUE;\n        }\n    }\n    if (!fLf) {\n        *psz++ = '\\n';\n        *psz = '\\0';\n    }\n    printf(\"%s\", szBuffer);\n    Real_OutputDebugStringA(szBuffer);\n}\n\nVOID SyelogV(BYTE nSeverity, PCSTR pszMsgf, va_list args)\n{\n    SyelogExV(FALSE, nSeverity, pszMsgf, args);\n}\n\nVOID Syelog(BYTE nSeverity, PCSTR pszMsgf, ...)\n{\n    va_list args;\n    va_start(args, pszMsgf);\n    SyelogExV(FALSE, nSeverity, pszMsgf, args);\n    va_end(args);\n}\n\nVOID SyelogEx(BOOL fTerminate, BYTE nSeverity, PCSTR pszMsgf, ...)\n{\n    va_list args;\n    va_start(args, pszMsgf);\n    SyelogExV(fTerminate, nSeverity, pszMsgf, args);\n    va_end(args);\n}\n\nVOID SyelogClose(BOOL fTerminate)\n{\n    (void)fTerminate;\n}\n\nDWORD main(int argc, char **argv)\n{\n    (void)argc;\n    (void)argv;\n\n    printf(\"testapi: Starting\\n\");\n    ProcessAttach(NULL);\n    Sleep(100);\n    ProcessDetach(NULL);\n\n    return 0;\n}\n//\n//////////////////////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "ext/detours/samples/traceapi/trcapi.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (trcapi.cpp of trcapi.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#undef WIN32_LEAN_AND_MEAN\n#define _WIN32_WINNT        0x400\n#define WIN32\n#define NT\n#define _WINSOCK_DEPRECATED_NO_WARNINGS\n\n#define DBG_TRACE   0\n\n#if _MSC_VER >= 1300\n#include <winsock2.h>\n#endif\n#include <windows.h>\n#include <stdio.h>\n#pragma warning(push)\n#if _MSC_VER > 1400\n#pragma warning(disable:6102 6103) // /analyze warnings\n#endif\n#include <strsafe.h>\n#pragma warning(pop)\n#include \"detours.h\"\n#include \"syelog.h\"\n\n#if (_MSC_VER < 1299)\n#define LONG_PTR    LONG\n#define ULONG_PTR   ULONG\n#define PLONG_PTR   PLONG\n#define PULONG_PTR  PULONG\n#define INT_PTR     INT\n#define UINT_PTR    UINT\n#define PINT_PTR    PINT\n#define PUINT_PTR   PUINT\n#define DWORD_PTR   DWORD\n#define PDWORD_PTR  PDWORD\n#endif\n\n#pragma warning(disable:4996)   // We don't care about deprecated APIs.\n\n//////////////////////////////////////////////////////////////////////////////\n#pragma warning(disable:4127)   // Many of our asserts are constants.\n\n#define ASSERT_ALWAYS(x)   \\\n    do {                                                        \\\n    if (!(x)) {                                                 \\\n            AssertMessage(#x, __FILE__, __LINE__);              \\\n            DebugBreak();                                       \\\n    }                                                           \\\n    } while (0)\n\n#ifndef NDEBUG\n#define ASSERT(x)           ASSERT_ALWAYS(x)\n#else\n#define ASSERT(x)\n#endif\n\n#define UNUSED(c)    (c) = (c)\n\n//////////////////////////////////////////////////////////////////////////////\nstatic HMODULE s_hInst = NULL;\nstatic WCHAR s_wzDllPath[MAX_PATH];\nstatic CHAR s_szDllPath[MAX_PATH];\n\nBOOL ProcessEnumerate();\nBOOL InstanceEnumerate(HINSTANCE hInst);\n\nVOID _PrintEnter(const CHAR *psz, ...);\nVOID _PrintExit(const CHAR *psz, ...);\nVOID _Print(const CHAR *psz, ...);\nVOID _VPrint(PCSTR msg, va_list args, PCHAR pszBuf, LONG cbBuf);\n\nVOID AssertMessage(CONST PCHAR pszMsg, CONST PCHAR pszFile, ULONG nLine);\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// Trampolines\n//\nextern \"C\" {\n    //  Trampolines for SYELOG library.\n    //\n    extern HANDLE (WINAPI *Real_CreateFileW)(LPCWSTR a0, DWORD a1, DWORD a2,\n                                             LPSECURITY_ATTRIBUTES a3, DWORD a4, DWORD a5,\n                                             HANDLE a6);\n    extern BOOL (WINAPI *Real_WriteFile)(HANDLE hFile,\n                                         LPCVOID lpBuffer,\n                                         DWORD nNumberOfBytesToWrite,\n                                         LPDWORD lpNumberOfBytesWritten,\n                                         LPOVERLAPPED lpOverlapped);\n    extern BOOL (WINAPI *Real_FlushFileBuffers)(HANDLE hFile);\n    extern BOOL (WINAPI *Real_CloseHandle)(HANDLE hObject);\n    extern BOOL (WINAPI *Real_WaitNamedPipeW)(LPCWSTR lpNamedPipeName, DWORD nTimeOut);\n    extern BOOL (WINAPI *Real_SetNamedPipeHandleState)(HANDLE hNamedPipe,\n                                                       LPDWORD lpMode,\n                                                       LPDWORD lpMaxCollectionCount,\n                                                       LPDWORD lpCollectDataTimeout);\n    extern DWORD (WINAPI *Real_GetCurrentProcessId)(VOID);\n    extern VOID (WINAPI *Real_GetSystemTimeAsFileTime)(LPFILETIME lpSystemTimeAsFileTime);\n\n    VOID ( WINAPI * Real_InitializeCriticalSection)(LPCRITICAL_SECTION lpSection)\n        = InitializeCriticalSection;\n    VOID ( WINAPI * Real_EnterCriticalSection)(LPCRITICAL_SECTION lpSection)\n        = EnterCriticalSection;\n    VOID ( WINAPI * Real_LeaveCriticalSection)(LPCRITICAL_SECTION lpSection)\n        = LeaveCriticalSection;\n}\n\n#include \"_win32.cpp\"\n\n////////////////////////////////////////////////////////////// Logging System.\n//\nstatic BOOL s_bLog = FALSE;\nstatic LONG s_nTlsIndent = -1;\nstatic LONG s_nTlsThread = -1;\nstatic LONG s_nThreadCnt = 0;\n\nVOID _PrintEnter(const CHAR *psz, ...)\n{\n    DWORD dwErr = GetLastError();\n\n    LONG nIndent = 0;\n    LONG nThread = 0;\n    if (s_nTlsIndent >= 0) {\n        nIndent = (LONG)(LONG_PTR)TlsGetValue(s_nTlsIndent);\n        TlsSetValue(s_nTlsIndent, (PVOID)(LONG_PTR)(nIndent + 1));\n    }\n    if (s_nTlsThread >= 0) {\n        nThread = (LONG)(LONG_PTR)TlsGetValue(s_nTlsThread);\n    }\n\n    if (s_bLog && psz) {\n        CHAR szBuf[1024];\n        PCHAR pszBuf = szBuf;\n        PCHAR pszEnd = szBuf + ARRAYSIZE(szBuf) - 1;\n        LONG nLen = (nIndent > 0) ? (nIndent < 35 ? nIndent * 2 : 70) : 0;\n        *pszBuf++ = (CHAR)('0' + ((nThread / 100) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 10) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 1) % 10));\n        *pszBuf++ = ' ';\n        while (nLen-- > 0) {\n            *pszBuf++ = ' ';\n        }\n        *pszBuf++ = '+';\n        *pszBuf = '\\0';\n\n        va_list  args;\n        va_start(args, psz);\n\n        while ((*pszBuf++ = *psz++) != 0 && pszBuf < pszEnd) {\n            // Copy characters.\n        }\n        *pszEnd = '\\0';\n        SyelogV(SYELOG_SEVERITY_INFORMATION, szBuf, args);\n\n        va_end(args);\n    }\n    SetLastError(dwErr);\n}\n\nVOID _PrintExit(const CHAR *psz, ...)\n{\n    DWORD dwErr = GetLastError();\n\n    LONG nIndent = 0;\n    LONG nThread = 0;\n    if (s_nTlsIndent >= 0) {\n        nIndent = (LONG)(LONG_PTR)TlsGetValue(s_nTlsIndent) - 1;\n        ASSERT_ALWAYS(nIndent >= 0);\n        TlsSetValue(s_nTlsIndent, (PVOID)(LONG_PTR)nIndent);\n    }\n    if (s_nTlsThread >= 0) {\n        nThread = (LONG)(LONG_PTR)TlsGetValue(s_nTlsThread);\n    }\n\n    if (s_bLog && psz) {\n        CHAR szBuf[1024];\n        PCHAR pszEnd = szBuf + ARRAYSIZE(szBuf) - 1;\n        PCHAR pszBuf = szBuf;\n        LONG nLen = (nIndent > 0) ? (nIndent < 35 ? nIndent * 2 : 70) : 0;\n        *pszBuf++ = (CHAR)('0' + ((nThread / 100) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 10) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 1) % 10));\n        *pszBuf++ = ' ';\n        while (nLen-- > 0) {\n            *pszBuf++ = ' ';\n        }\n        *pszBuf++ = '-';\n        *pszBuf = '\\0';\n\n        va_list  args;\n        va_start(args, psz);\n\n        while ((*pszBuf++ = *psz++) != 0 && pszBuf < pszEnd) {\n            // Copy characters.\n        }\n        *pszEnd = '\\0';\n        SyelogV(SYELOG_SEVERITY_INFORMATION, szBuf, args);\n\n        va_end(args);\n    }\n    SetLastError(dwErr);\n}\n\nVOID _Print(const CHAR *psz, ...)\n{\n    DWORD dwErr = GetLastError();\n\n    LONG nIndent = 0;\n    LONG nThread = 0;\n    if (s_nTlsIndent >= 0) {\n        nIndent = (LONG)(LONG_PTR)TlsGetValue(s_nTlsIndent);\n    }\n    if (s_nTlsThread >= 0) {\n        nThread = (LONG)(LONG_PTR)TlsGetValue(s_nTlsThread);\n    }\n\n    if (s_bLog && psz) {\n        CHAR szBuf[1024];\n        PCHAR pszEnd = szBuf + ARRAYSIZE(szBuf) - 1;\n        PCHAR pszBuf = szBuf;\n        LONG nLen = (nIndent > 0) ? (nIndent < 35 ? nIndent * 2 : 70) : 0;\n        *pszBuf++ = (CHAR)('0' + ((nThread / 100) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 10) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 1) % 10));\n        *pszBuf++ = ' ';\n        while (nLen-- > 0) {\n            *pszBuf++ = ' ';\n        }\n        *pszBuf = '\\0';\n\n        va_list  args;\n        va_start(args, psz);\n\n        while ((*pszBuf++ = *psz++) != 0 && pszBuf < pszEnd) {\n            // Copy characters.\n        }\n        *pszEnd = '\\0';\n        SyelogV(SYELOG_SEVERITY_INFORMATION, szBuf, args);\n\n        va_end(args);\n    }\n    SetLastError(dwErr);\n}\n\nVOID AssertMessage(CONST PCHAR pszMsg, CONST PCHAR pszFile, ULONG nLine)\n{\n    Syelog(SYELOG_SEVERITY_FATAL,\n           \"ASSERT(%s) failed in %s, line %d.\\n\", pszMsg, pszFile, nLine);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nPIMAGE_NT_HEADERS NtHeadersForInstance(HINSTANCE hInst)\n{\n    PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hInst;\n    __try {\n        if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) {\n            SetLastError(ERROR_BAD_EXE_FORMAT);\n            return NULL;\n        }\n\n        PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)((PBYTE)pDosHeader +\n                                                          pDosHeader->e_lfanew);\n        if (pNtHeader->Signature != IMAGE_NT_SIGNATURE) {\n            SetLastError(ERROR_INVALID_EXE_SIGNATURE);\n            return NULL;\n        }\n        if (pNtHeader->FileHeader.SizeOfOptionalHeader == 0) {\n            SetLastError(ERROR_EXE_MARKED_INVALID);\n            return NULL;\n        }\n        return pNtHeader;\n    } __except(EXCEPTION_EXECUTE_HANDLER) {\n    }\n    SetLastError(ERROR_EXE_MARKED_INVALID);\n\n    return NULL;\n}\n\nBOOL InstanceEnumerate(HINSTANCE hInst)\n{\n    WCHAR wzDllName[MAX_PATH];\n\n    PIMAGE_NT_HEADERS pinh = NtHeadersForInstance(hInst);\n    if (pinh && Real_GetModuleFileNameW(hInst, wzDllName, ARRAYSIZE(wzDllName))) {\n        Syelog(SYELOG_SEVERITY_INFORMATION, \"### %p: %ls\\n\", hInst, wzDllName);\n        return TRUE;\n    }\n    return FALSE;\n}\n\nBOOL ProcessEnumerate()\n{\n    Syelog(SYELOG_SEVERITY_INFORMATION,\n           \"######################################################### Binaries\\n\");\n\n    PBYTE pbNext;\n    for (PBYTE pbRegion = (PBYTE)0x10000;; pbRegion = pbNext) {\n        MEMORY_BASIC_INFORMATION mbi;\n        ZeroMemory(&mbi, sizeof(mbi));\n\n        if (VirtualQuery((PVOID)pbRegion, &mbi, sizeof(mbi)) <= 0) {\n            break;\n        }\n        pbNext = (PBYTE)mbi.BaseAddress + mbi.RegionSize;\n\n        // Skip free regions, reserver regions, and guard pages.\n        //\n        if (mbi.State == MEM_FREE || mbi.State == MEM_RESERVE) {\n            continue;\n        }\n        if (mbi.Protect & PAGE_GUARD || mbi.Protect & PAGE_NOCACHE) {\n            continue;\n        }\n        if (mbi.Protect == PAGE_NOACCESS) {\n            continue;\n        }\n\n        // Skip over regions from the same allocation...\n        {\n            MEMORY_BASIC_INFORMATION mbiStep;\n\n            while (VirtualQuery((PVOID)pbNext, &mbiStep, sizeof(mbiStep)) > 0) {\n                if ((PBYTE)mbiStep.AllocationBase != pbRegion) {\n                    break;\n                }\n                pbNext = (PBYTE)mbiStep.BaseAddress + mbiStep.RegionSize;\n                mbi.Protect |= mbiStep.Protect;\n            }\n        }\n\n        WCHAR wzDllName[MAX_PATH];\n        PIMAGE_NT_HEADERS pinh = NtHeadersForInstance((HINSTANCE)pbRegion);\n\n        if (pinh &&\n            Real_GetModuleFileNameW((HINSTANCE)pbRegion,wzDllName,ARRAYSIZE(wzDllName))) {\n\n            Syelog(SYELOG_SEVERITY_INFORMATION,\n                   \"### %p..%p: %ls\\n\", pbRegion, pbNext, wzDllName);\n        }\n        else {\n            Syelog(SYELOG_SEVERITY_INFORMATION,\n                   \"### %p..%p: State=%04x, Protect=%08x\\n\",\n                   pbRegion, pbNext, mbi.State, mbi.Protect);\n        }\n    }\n    Syelog(SYELOG_SEVERITY_INFORMATION, \"###\\n\");\n\n    LPVOID lpvEnv = Real_GetEnvironmentStrings();\n    Syelog(SYELOG_SEVERITY_INFORMATION, \"### Env= %08x [%08x %08x]\\n\",\n           lpvEnv, ((PVOID*)lpvEnv)[0], ((PVOID*)lpvEnv)[1]);\n\n    return TRUE;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// DLL module information\n//\nBOOL ThreadAttach(HMODULE hDll)\n{\n    (void)hDll;\n\n    if (s_nTlsIndent >= 0) {\n        TlsSetValue(s_nTlsIndent, (PVOID)0);\n    }\n    if (s_nTlsThread >= 0) {\n        LONG nThread = InterlockedIncrement(&s_nThreadCnt);\n        TlsSetValue(s_nTlsThread, (PVOID)(LONG_PTR)nThread);\n    }\n    return TRUE;\n}\n\nBOOL ThreadDetach(HMODULE hDll)\n{\n    (void)hDll;\n\n    if (s_nTlsIndent >= 0) {\n        TlsSetValue(s_nTlsIndent, (PVOID)0);\n    }\n    if (s_nTlsThread >= 0) {\n        TlsSetValue(s_nTlsThread, (PVOID)0);\n    }\n    return TRUE;\n}\n\nBOOL ProcessAttach(HMODULE hDll)\n{\n    s_bLog = FALSE;\n    s_nTlsIndent = TlsAlloc();\n    s_nTlsThread = TlsAlloc();\n    ThreadAttach(hDll);\n\n    WCHAR wzExeName[MAX_PATH];\n\n    s_hInst = hDll;\n    Real_GetModuleFileNameW(hDll, s_wzDllPath, ARRAYSIZE(s_wzDllPath));\n    Real_GetModuleFileNameW(NULL, wzExeName, ARRAYSIZE(wzExeName));\n    StringCchPrintfA(s_szDllPath, ARRAYSIZE(s_szDllPath), \"%ls\", s_wzDllPath);\n\n    SyelogOpen(\"trcapi\" DETOURS_STRINGIFY(DETOURS_BITS), SYELOG_FACILITY_APPLICATION);\n    ProcessEnumerate();\n\n    LONG error = AttachDetours();\n    if (error != NO_ERROR) {\n        Syelog(SYELOG_SEVERITY_FATAL, \"### Error attaching detours: %d\\n\", error);\n    }\n\n    s_bLog = TRUE;\n    return TRUE;\n}\n\nBOOL ProcessDetach(HMODULE hDll)\n{\n    ThreadDetach(hDll);\n    s_bLog = FALSE;\n\n    LONG error = DetachDetours();\n    if (error != NO_ERROR) {\n        Syelog(SYELOG_SEVERITY_FATAL, \"### Error detaching detours: %d\\n\", error);\n    }\n\n    Syelog(SYELOG_SEVERITY_NOTICE, \"### Closing.\\n\");\n    SyelogClose(FALSE);\n\n    if (s_nTlsIndent >= 0) {\n        TlsFree(s_nTlsIndent);\n    }\n    if (s_nTlsThread >= 0) {\n        TlsFree(s_nTlsThread);\n    }\n    return TRUE;\n}\n\nBOOL APIENTRY DllMain(HINSTANCE hModule, DWORD dwReason, PVOID lpReserved)\n{\n    (void)hModule;\n    (void)lpReserved;\n    BOOL ret;\n\n    if (DetourIsHelperProcess()) {\n        return TRUE;\n    }\n\n    switch (dwReason) {\n      case DLL_PROCESS_ATTACH:\n        DetourRestoreAfterWith();\n        OutputDebugStringA(\"trcapi\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll:\"\n                           \" DllMain DLL_PROCESS_ATTACH\\n\");\n        return ProcessAttach(hModule);\n      case DLL_PROCESS_DETACH:\n        ret = ProcessDetach(hModule);\n        OutputDebugStringA(\"trcapi\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll:\"\n                           \" DllMain DLL_PROCESS_DETACH\\n\");\n        return ret;\n      case DLL_THREAD_ATTACH:\n        OutputDebugStringA(\"trcapi\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll:\"\n                           \" DllMain DLL_THREAD_ATTACH\\n\");\n        return ThreadAttach(hModule);\n      case DLL_THREAD_DETACH:\n        OutputDebugStringA(\"trcapi\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll:\"\n                           \" DllMain DLL_THREAD_DETACH\\n\");\n        return ThreadDetach(hModule);\n    }\n    return TRUE;\n}\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/traceapi/trcapi.rc",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Version information for trcapi.rc.\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include \"detver.h\"\n\n#define VER_INTERNALNAME_STR        \"trcapi\" DETOURS_STRINGIFY(DETOURS_BITS)\n#define VER_ORIGINALFILENAME_STR    \"trcapi\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\"\n#define VER_FILEDESCRIPTION_STR     \"Detours Win32 API Tracing Module\"\n#define VER_COMPANYNAME_STR         \"Microsoft Corporation\"\n\n#include \"common.ver\"\n"
  },
  {
    "path": "ext/detours/samples/tracebld/Makefile",
    "content": "##############################################################################\n##\n##  Utility to registry and file access APIs.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\nLIBS=$(LIBS) kernel32.lib\n\n##############################################################################\n\nall: dirs \\\n    $(BIND)\\trcbld$(DETOURS_BITS).dll \\\n    $(BIND)\\tracebld.exe \\\n    \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\trcbld$(DETOURS_BITS).bsc    \\\n    $(OBJD)\\tracebld.bsc    \\\n!ENDIF\n    option\n\n##############################################################################\n\nclean:\n    -del *~ test.txt log.*.xml 2>nul\n    -del $(BIND)\\tracebld.* $(BIND)\\trcbld*.* 2>nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\n##############################################################################\n\n$(OBJD)\\trcbld.obj : trcbld.cpp\n$(OBJD)\\trcbld.res : trcbld.rc\n$(BIND)\\trcbld$(DETOURS_BITS).dll : $(OBJD)\\trcbld.obj $(OBJD)\\trcbld.res $(DEPS)\n    cl /LD $(CFLAGS) /Fe$@ /Fd$(@R).pdb \\\n        $(OBJD)\\trcbld.obj $(OBJD)\\trcbld.res \\\n        /link $(LINKFLAGS) /release /subsystem:console \\\n        /export:DetourFinishHelperProcess,@1,NONAME \\\n        $(LIBS)\n\n$(OBJD)\\trcbld$(DETOURS_BITS).bsc : $(OBJD)\\trcbld.obj\n    bscmake /v /n /o $@ $(OBJD)\\trcbld.sbr\n\n$(OBJD)\\tracebld.obj : tracebld.cpp\n\n$(BIND)\\tracebld.exe : $(OBJD)\\tracebld.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb $(OBJD)\\tracebld.obj \\\n        /link $(LINKFLAGS) $(LIBS) \\\n        /subsystem:console /fixed:no\n\n$(OBJD)\\tracebld.bsc : $(OBJD)\\tracebld.obj\n    bscmake /v /n /o $@ $(OBJD)\\tracebld.sbr\n\n############################################### Install non-bit-size binaries.\n\n!IF \"$(DETOURS_OPTION_PROCESSOR)\" != \"\"\n\n$(OPTD)\\trcbld$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\trcbld$(DETOURS_OPTION_BITS).pdb:\n\n$(BIND)\\trcbld$(DETOURS_OPTION_BITS).dll : $(OPTD)\\trcbld$(DETOURS_OPTION_BITS).dll\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\trcbld$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\trcbld$(DETOURS_OPTION_BITS).pdb\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n\noption: \\\n    $(BIND)\\trcbld$(DETOURS_OPTION_BITS).dll \\\n    $(BIND)\\trcbld$(DETOURS_OPTION_BITS).pdb \\\n\n!ELSE\n\noption:\n\n!ENDIF\n\n##############################################################################\n\ntest: all\n    -del log.*.xml 2>nul\n    $(BIND)\\tracebld.exe /o:log %COMSPEC% /c dir\n    @echo -------- Log from log.00000000 ---------------------\n    type log.00000000.xml\n\ntest0: all\n    -del log.*.xml 2>nul\n    $(BIND)\\tracebld.exe /o:log %COMSPEC% /c xx.cmd\n    @echo -------- Log from log.00000000 ---------------------\n    type log.00000000.xml\n    @echo -------- Log from log.00000001 ---------------------\n    type log.00000001.xml\n\ntest1: all\n    set FooBAR=1\n    -del log.*.xml 2>nul\n    @echo -------- Logging output to log ------------\n    -rmdir /q /s obj 2>nul\n    $(BIND)\\tracebld.exe /o:log nmake.exe test2\n    @echo -------- Log from log.00000000 ---------------------\n    type log.00000000.xml | findstr /c:\"t:Line\"\n    type log.00000002.xml | findstr /c:\"t:Line\"\n\ntest1d: all\n    -del log.*.xml 2>nul\n    @echo -------- Logging output to log ------------\n    -rmdir /q /s obj 2>nul\n    windbg -g -G -o $(BIND)\\tracebld.exe /o:log nmake.exe test2\n    @echo -------- Log from log.00000000 ---------------------\n    type log.00000000.xml | findstr /c:\"t:Line\"\n    type log.00000002.xml | findstr /c:\"t:Line\"\n\n\ntest2: all\n    -del foo.txt\n    echo foo1 >> foo.txt\n    echo foo2 >> foo.txt\n    echo foo3 >> foo.txt\n    -del log.foo.xml\n    -mkdir obj\n    cmd.exe /c \"set Foo=BAR&&cmd.exe /c echo. FOO=%Foo%\"\n    cl /LD $(CFLAGS) /Tp<< @<<obj\\response.txt > log.foo.xml\n#include <windows.h>\n<<\n/Feobj\\tbtest.exe /Fd$(@R).pdb $(DET_SRC)\n/link $(LINKFLAGS) /subsystem:console\n/export:DetourFinishHelperProcess,@1 \n<<NOKEEP\n    type $(BIND)\\trcbld.cpp | findstr CreateFile\n    echo int main() { return 0; } > obj\\test.cpp\n    cl /c /Foobj\\test.obj obj\\test.cpp\n    -del tbtest.* 2>nul\n\ntest3: all\n    -del log.*.xml 2>nul\n    @echo -------- Logging output to log ------------\n    -rmdir /q /s foo\n    $(BIND)\\tracebld.exe /o:log xcopy.exe $(BIND)\\trcbld.cpp foo\\ /y\n    @echo -------- Log from log.00000000 ---------------------\n    type log.00000000.xml\n\ntest4: all\n    -del log.*.xml 2>nul\n    echo int main() { return 0; } > obj\\test.cpp\n    $(BIND)\\tracebld.exe /o:log cl /c /Foobj\\test.obj obj\\test.cpp\n    @echo -------- Log from log.00000000 ---------------------\n    type log.00000000.xml\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/tracebld/tracebld.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (tracebld.cpp of tracebld.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#include <windows.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <stddef.h>\n#pragma warning(push)\n#if _MSC_VER > 1400\n#pragma warning(disable:6102 6103) // /analyze warnings\n#endif\n#include <strsafe.h>\n#pragma warning(pop)\n#include <detours.h>\n#include \"tracebld.h\"\n\n#if (_MSC_VER < 1299)\ntypedef ULONG * PULONG_PTR;\ntypedef ULONG ULONG_PTR;\ntypedef LONG * PLONG_PTR;\ntypedef LONG LONG_PTR;\n#endif\n\n//////////////////////////////////////////////////////////////////////////////\n#pragma warning(disable:4127)   // Many of our asserts are constants.\n\n#define ASSERT_ALWAYS(x)   \\\n    do {                                                        \\\n    if (!(x)) {                                                 \\\n            AssertMessage(#x, __FILE__, __LINE__);              \\\n            DebugBreak();                                       \\\n    }                                                           \\\n    } while (0)\n\n#ifndef NDEBUG\n#define ASSERT(x)           ASSERT_ALWAYS(x)\n#else\n#define ASSERT(x)\n#endif\n\n#define UNUSED(c)       (c) = (c)\n\n//////////////////////////////////////////////////////////////////////////////\n\nenum {\n    CLIENT_AWAITING_PIPE_ACCEPT = 0x21,\n    CLIENT_AWAITING_PIPE_DATA   = 0x22,\n};\n\ntypedef struct _CLIENT : OVERLAPPED\n{\n    HANDLE          hPipe;\n    LONG            nClient;\n    HANDLE          hFile;\n    BOOL            fAwaitingAccept;\n    PVOID           Zero;\n    TBLOG_MESSAGE   Message;\n\n    BOOL LogMessage(PTBLOG_MESSAGE pMessage, DWORD nBytes);\n    BOOL LogMessageV(PCHAR pszMsg, ...);\n} CLIENT, *PCLIENT;\n\n//////////////////////////////////////////////////////////////////////////////\n//\nCHAR        s_szLogFile[MAX_PATH];\nCHAR        s_szPipe[MAX_PATH];\nLONG        s_nActiveClients = 0;\nLONG        s_nTotalClients = 0;\nLONGLONG    s_llStartTime;\nBOOL        s_fVerbose = FALSE;\nTBLOG_PAYLOAD s_Payload;\n\n//////////////////////////////////////////////////////////////////////////////\n//\nVOID MyErrExit(PCSTR pszMsg)\n{\n    DWORD error = GetLastError();\n\n    fprintf(stderr, \"TRACEBLD: Error %ld in %s.\\n\", error, pszMsg);\n    fflush(stderr);\n    exit(1);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nBOOL CLIENT::LogMessageV(PCHAR pszMsg, ...)\n{\n    DWORD cbWritten = 0;\n    CHAR szBuf[1024];\n    PCHAR pcchEnd = szBuf + ARRAYSIZE(szBuf) - 2;\n    PCHAR pcchCur = szBuf;\n    HRESULT hr;\n\n    va_list args;\n    va_start(args, pszMsg);\n    hr = StringCchVPrintfExA(pcchCur, pcchEnd - pcchCur,\n                             &pcchCur, NULL, STRSAFE_NULL_ON_FAILURE,\n                             pszMsg, args);\n    va_end(args);\n    if (FAILED(hr)) {\n        goto cleanup;\n    }\n\n    hr = StringCchPrintfExA(pcchCur, szBuf + (ARRAYSIZE(szBuf)) - pcchCur,\n                            &pcchCur, NULL, STRSAFE_NULL_ON_FAILURE,\n                            \"\\n\");\n\n  cleanup:\n    WriteFile(hFile, szBuf, (DWORD)(pcchCur - szBuf), &cbWritten, NULL);\n    return TRUE;\n}\n\nBOOL CLIENT::LogMessage(PTBLOG_MESSAGE pMessage, DWORD nBytes)\n{\n    // Sanity check the size of the message.\n    //\n    if (nBytes > pMessage->nBytes) {\n        nBytes = pMessage->nBytes;\n    }\n    if (nBytes >= sizeof(*pMessage)) {\n        nBytes = sizeof(*pMessage) - 1;\n    }\n\n    // Don't log message if there isn't and message text.\n    //\n    DWORD cbWrite = nBytes - offsetof(TBLOG_MESSAGE, szMessage);\n    if (cbWrite <= 0 ) {\n        return TRUE;\n    }\n\n    if (s_fVerbose) {\n        printf(\"[%s]\", pMessage->szMessage);\n    }\n\n    DWORD cbWritten = 0;\n    WriteFile(hFile, pMessage->szMessage, cbWrite, &cbWritten, NULL);\n    return TRUE;\n}\n\nBOOL CloseConnection(PCLIENT pClient)\n{\n    InterlockedDecrement(&s_nActiveClients);\n    if (pClient != NULL) {\n        if (pClient->hPipe != INVALID_HANDLE_VALUE) {\n            //FlushFileBuffers(pClient->hPipe);\n            if (!DisconnectNamedPipe(pClient->hPipe)) {\n                DWORD error = GetLastError();\n                pClient->LogMessageV(\"<!-- Error %d in DisconnectNamedPipe. -->\\n\", error);\n            }\n            CloseHandle(pClient->hPipe);\n            pClient->hPipe = INVALID_HANDLE_VALUE;\n        }\n        if (pClient->hFile != INVALID_HANDLE_VALUE) {\n            CloseHandle(pClient->hFile);\n            pClient->hFile = INVALID_HANDLE_VALUE;\n        }\n        GlobalFree(pClient);\n        pClient = NULL;\n    }\n    return TRUE;\n}\n\n// Creates a pipe instance and initiate an accept request.\n//\nPCLIENT CreatePipeConnection(HANDLE hCompletionPort, LONG nClient)\n{\n    HANDLE hPipe = CreateNamedPipeA(s_szPipe,                   // pipe name\n                                    PIPE_ACCESS_INBOUND |       // read-only access\n                                    FILE_FLAG_OVERLAPPED,       // overlapped mode\n                                    PIPE_TYPE_MESSAGE |         // message-type pipe\n                                    PIPE_READMODE_MESSAGE |     // message read mode\n                                    PIPE_WAIT,                  // blocking mode\n                                    PIPE_UNLIMITED_INSTANCES,   // unlimited instances\n                                    0,                          // output buffer size\n                                    0,                          // input buffer size\n                                    20000,                      // client time-out\n                                    NULL);                      // no security attributes\n    if (hPipe == INVALID_HANDLE_VALUE) {\n        MyErrExit(\"CreateNamedPipe\");\n    }\n\n    // Allocate the client data structure.\n    //\n    PCLIENT pClient = (PCLIENT) GlobalAlloc(GPTR, sizeof(CLIENT));\n    if (pClient == NULL) {\n        MyErrExit(\"GlobalAlloc pClient\");\n    }\n\n    CHAR szLogFile[MAX_PATH];\n    StringCchPrintfA(szLogFile, ARRAYSIZE(szLogFile), \"%s.%08d.xml\", s_szLogFile, nClient);\n\n    ZeroMemory(pClient, sizeof(*pClient));\n    pClient->hPipe = hPipe;\n    pClient->nClient = nClient;\n    pClient->fAwaitingAccept = TRUE;\n    pClient->hFile = CreateFileA(szLogFile,\n                                 GENERIC_WRITE,\n                                 FILE_SHARE_READ,\n                                 NULL,\n                                 CREATE_ALWAYS,\n                                 FILE_ATTRIBUTE_NORMAL |\n                                 FILE_FLAG_SEQUENTIAL_SCAN,\n                                 NULL);\n    if (pClient->hFile == INVALID_HANDLE_VALUE) {\n        fprintf(stderr, \"TRACEBLD: Error opening output file: %s: %ld\\n\\n\",\n                szLogFile, GetLastError());\n        fflush(stderr);\n        MyErrExit(\"CreateFile\");\n    }\n\n    // Associate file with our complietion port.\n    //\n    if (!CreateIoCompletionPort(pClient->hPipe, hCompletionPort, (ULONG_PTR)pClient, 0)) {\n        MyErrExit(\"CreateIoComplietionPort pClient\");\n    }\n\n    if (!ConnectNamedPipe(hPipe, pClient)) {\n        DWORD error = GetLastError();\n\n        if (error == ERROR_IO_PENDING) {\n            return NULL;\n        }\n        if (error == ERROR_PIPE_CONNECTED) {\n#if 0\n            pClient->LogMessageV(\"<!-- ConnectNamedPipe client already connected. -->\");\n#endif\n            pClient->fAwaitingAccept = FALSE;\n        }\n        else if (error != ERROR_IO_PENDING &&\n                 error != ERROR_PIPE_LISTENING) {\n\n            MyErrExit(\"ConnectNamedPipe\");\n        }\n    }\n    else {\n        fprintf(stderr, \"*** ConnectNamedPipe accepted immediately.\\n\");\n#if 0\n        pClient->LogMessageV(\"<!-- ConnectNamedPipe accepted immediately. -->\");\n#endif\n        pClient->fAwaitingAccept = FALSE;\n    }\n    return pClient;\n}\n\nBOOL DoRead(PCLIENT pClient)\n{\n    SetLastError(NO_ERROR);\n    DWORD nBytes = 0;\n    BOOL b = ReadFile(pClient->hPipe, &pClient->Message, sizeof(pClient->Message),\n                      &nBytes, pClient);\n\n    DWORD error = GetLastError();\n\n    if (b && error == NO_ERROR) {\n        return TRUE;\n    }\n    if (error == ERROR_BROKEN_PIPE) {\n        pClient->LogMessageV(\"<!-- **** ReadFile 002 *** ERROR_BROKEN_PIPE [%d] -->\\n\", nBytes);\n        CloseConnection(pClient);\n        return TRUE;\n    }\n    else if (error == ERROR_INVALID_HANDLE) {\n        // ?\n        pClient->LogMessageV(\"<!-- **** ReadFile 002 *** ERROR_INVALID_HANDLE -->\\n\");\n        // I have no idea why this happens.  Our remedy is to drop the connection.\n        return TRUE;\n    }\n    else if (error != ERROR_IO_PENDING) {\n        if (b) {\n            pClient->LogMessageV(\"<!-- **** ReadFile 002 succeeded: %d -->\\n\", error);\n        }\n        else {\n            pClient->LogMessageV(\"<!-- **** ReadFile 002 failed: %d -->\\n\", error);\n        }\n        CloseConnection(pClient);\n    }\n    return TRUE;\n}\n\nDWORD WINAPI WorkerThread(LPVOID pvVoid)\n{\n    PCLIENT pClient;\n    BOOL b;\n    LPOVERLAPPED lpo;\n    DWORD nBytes;\n    HANDLE hCompletionPort = (HANDLE)pvVoid;\n\n    for (BOOL fKeepLooping = TRUE; fKeepLooping;) {\n        pClient = NULL;\n        lpo = NULL;\n        nBytes = 0;\n        b = GetQueuedCompletionStatus(hCompletionPort,\n                                      &nBytes, (PULONG_PTR)&pClient, &lpo, INFINITE);\n\n        if (!b) {\n            if (pClient) {\n                if (GetLastError() == ERROR_BROKEN_PIPE) {\n                    pClient->LogMessageV(\"<!-- Client closed pipe. -->\");\n                }\n                else {\n                    pClient->LogMessageV(\"<!-- *** GetQueuedCompletionStatus failed %d -->\",\n                                         GetLastError());\n                }\n                CloseConnection(pClient);\n            }\n            continue;\n        }\n\n        if (pClient->fAwaitingAccept) {\n            BOOL fAgain = TRUE;\n            while (fAgain) {\n                LONG nClient = InterlockedIncrement(&s_nTotalClients);\n                InterlockedIncrement(&s_nActiveClients);\n                pClient->fAwaitingAccept = FALSE;\n\n                PCLIENT pNew = CreatePipeConnection(hCompletionPort, nClient);\n\n                fAgain = FALSE;\n                if (pNew != NULL) {\n                    fAgain = !pNew->fAwaitingAccept;\n                    DoRead(pNew);\n                }\n            }\n        }\n        else {\n            if (nBytes <= offsetof(TBLOG_MESSAGE, szMessage)) {\n                pClient->LogMessageV(\"</t:Process>\\n\");\n                CloseConnection(pClient);\n                continue;\n            }\n            pClient->LogMessage(&pClient->Message, nBytes);\n        }\n\n        DoRead(pClient);\n    }\n    return 0;\n}\n\nBOOL CreateWorkers(HANDLE hCompletionPort)\n{\n    DWORD dwThread;\n    HANDLE hThread;\n    DWORD i;\n    SYSTEM_INFO SystemInfo;\n\n    GetSystemInfo(&SystemInfo);\n\n    for (i = 0; i < 1; i++) {\n        hThread = CreateThread(NULL, 0, WorkerThread, hCompletionPort, 0, &dwThread);\n        if (!hThread) {\n            MyErrExit(\"CreateThread WorkerThread\");\n            // Unreachable: return FALSE;\n        }\n        CloseHandle(hThread);\n    }\n    return TRUE;\n}\n\nDWORD CopyEnvironment(PWCHAR pwzzOut, PCWSTR pwzzIn)\n{\n    PCWSTR pwzzBeg = pwzzOut;\n    while (*pwzzIn) {\n        while (*pwzzIn) {\n            *pwzzOut++ = *pwzzIn++;\n        }\n        *pwzzOut++ = *pwzzIn++;   // Copy zero.\n    }\n    *pwzzOut++ = '\\0';    // Add last zero.\n\n    return (DWORD)(pwzzOut - pwzzBeg);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nDWORD main(int argc, char **argv)\n{\n    HANDLE hCompletionPort;\n    BOOL fNeedHelp = FALSE;\n    WCHAR wzzDrop[1024] = L\"build\\0nmake\\0\";\n\n    GetSystemTimeAsFileTime((FILETIME *)&s_llStartTime);\n    StringCchPrintfA(s_szPipe, ARRAYSIZE(s_szPipe), \"%s.%d\", TBLOG_PIPE_NAME, GetCurrentProcessId());\n\n    int arg = 1;\n    for (; arg < argc && (argv[arg][0] == '-' || argv[arg][0] == '/'); arg++) {\n        CHAR *argn = argv[arg] + 1;\n        CHAR *argp = argn;\n        while (*argp && *argp != ':' && *argp != '=') {\n            argp++;\n        }\n        if (*argp == ':' || *argp == '=') {\n            *argp++ = '\\0';\n        }\n\n        switch (argn[0]) {\n\n          case 'd':                                     // Drop Processes\n          case 'D':\n            if (*argp) {\n                PWCHAR pwz = wzzDrop;\n                while (*argp) {\n                    if (*argp == ';') {\n                        *pwz++ = '\\0';\n                    }\n                    else {\n                        *pwz++ = *argp++;\n                    }\n                }\n                *pwz++ = '\\0';\n                *pwz = '\\0';\n            }\n          case 'o':                                 // Output file.\n          case 'O':\n            StringCchCopyA(s_szLogFile, ARRAYSIZE(s_szLogFile), argp);\n            break;\n\n          case 'v':                                     // Verbose\n          case 'V':\n            s_fVerbose = TRUE;\n            break;\n\n          case '?':                                 // Help.\n            fNeedHelp = TRUE;\n            break;\n\n          default:\n            fNeedHelp = TRUE;\n            printf(\"TRACEBLD: Bad argument: %s:%s\\n\", argn, argp);\n            break;\n        }\n    }\n\n    if (arg >= argc) {\n        fNeedHelp = TRUE;\n    }\n\n    if (fNeedHelp) {\n        printf(\"Usage:\\n\"\n               \"    tracebld [options] command {command arguments}\\n\"\n               \"Options:\\n\"\n               \"    /o:file    Log all events to the output files.\\n\"\n               \"    /?         Display this help message.\\n\"\n               \"Summary:\\n\"\n               \"    Runs the build commands and figures out which files have dependencies..\\n\"\n               \"\\n\");\n        exit(9001);\n    }\n\n    // Create the completion port.\n    hCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, 0);\n    if (hCompletionPort == NULL) {\n        MyErrExit(\"CreateIoCompletionPort\");\n    }\n\n    // Create completion port worker threads.\n    //\n    CreateWorkers(hCompletionPort);\n    CreatePipeConnection(hCompletionPort, 0);\n\n    printf(\"TRACEBLD: Ready for clients.  Press Ctrl-C to stop.\\n\");\n\n    /////////////////////////////////////////////////////////// Validate DLLs.\n    //\n    CHAR szTmpPath[MAX_PATH];\n    CHAR szExePath[MAX_PATH];\n    CHAR szDllPath[MAX_PATH];\n    PCHAR pszFilePart = NULL;\n\n    if (!GetModuleFileNameA(NULL, szTmpPath, ARRAYSIZE(szTmpPath))) {\n        printf(\"TRACEBLD: Couldn't retreive exe name.\\n\");\n        return 9002;\n    }\n    if (!GetFullPathNameA(szTmpPath, ARRAYSIZE(szExePath), szExePath, &pszFilePart) ||\n        pszFilePart == NULL) {\n        printf(\"TRACEBLD: Error: %s is not a valid path name..\\n\", szTmpPath);\n        return 9002;\n    }\n\n    StringCchCopyA(pszFilePart, szExePath + ARRAYSIZE(szExePath) - pszFilePart,\n             \"trcbld\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\");\n    StringCchCopyA(szDllPath, ARRAYSIZE(szDllPath), szExePath);\n\n    //////////////////////////////////////////////////////////////////////////\n    STARTUPINFOA si;\n    PROCESS_INFORMATION pi;\n    CHAR szCommand[2048];\n    CHAR szExe[MAX_PATH];\n    CHAR szFullExe[MAX_PATH] = \"\\0\";\n    PCHAR pszFileExe = NULL;\n\n    ZeroMemory(&si, sizeof(si));\n    ZeroMemory(&pi, sizeof(pi));\n    si.cb = sizeof(si);\n\n    szCommand[0] = L'\\0';\n\n    StringCchCopyA(szExe, sizeof(szExe), argv[arg]);\n    for (; arg < argc; arg++) {\n        if (strchr(argv[arg], ' ') != NULL || strchr(argv[arg], '\\t') != NULL) {\n            StringCchCatA(szCommand, sizeof(szCommand), \"\\\"\");\n            StringCchCatA(szCommand, sizeof(szCommand), argv[arg]);\n            StringCchCatA(szCommand, sizeof(szCommand), \"\\\"\");\n        }\n        else {\n            StringCchCatA(szCommand, sizeof(szCommand), argv[arg]);\n        }\n\n        if (arg + 1 < argc) {\n            StringCchCatA(szCommand, sizeof(szCommand), \" \");\n        }\n    }\n    printf(\"TRACEBLD: Starting: `%s'\\n\", szCommand);\n    printf(\"TRACEBLD:   with `%s'\\n\", szDllPath);\n    fflush(stdout);\n\n    DWORD dwFlags = CREATE_DEFAULT_ERROR_MODE | CREATE_SUSPENDED;\n\n    SetLastError(0);\n    SearchPathA(NULL, szExe, \".exe\", ARRAYSIZE(szFullExe), szFullExe, &pszFileExe);\n\n\n    if (!DetourCreateProcessWithDllExA(szFullExe[0] ? szFullExe : NULL, szCommand,\n                                       NULL, NULL, TRUE, dwFlags, NULL, NULL,\n                                       &si, &pi, szDllPath, NULL)) {\n        printf(\"TRACEBLD: DetourCreateProcessWithDllEx failed: %ld\\n\", GetLastError());\n        ExitProcess(9007);\n    }\n\n    ZeroMemory(&s_Payload, sizeof(s_Payload));\n    s_Payload.nParentProcessId = GetCurrentProcessId();\n    s_Payload.nTraceProcessId = GetCurrentProcessId();\n    s_Payload.nGeneology = 1;\n    s_Payload.rGeneology[0] = 0;\n    StringCchCopyW(s_Payload.wzStdin, ARRAYSIZE(s_Payload.wzStdin), L\"\\\\\\\\.\\\\CONIN$\");\n    StringCchCopyW(s_Payload.wzStdout, ARRAYSIZE(s_Payload.wzStdout), L\"\\\\\\\\.\\\\CONOUT$\");\n    StringCchCopyW(s_Payload.wzStderr, ARRAYSIZE(s_Payload.wzStderr), L\"\\\\\\\\.\\\\CONOUT$\");\n    StringCchCopyW(s_Payload.wzParents, ARRAYSIZE(s_Payload.wzParents), L\"\");\n    CopyEnvironment(s_Payload.wzzDrop, wzzDrop);\n    LPWCH pwStrings = GetEnvironmentStringsW();\n    CopyEnvironment(s_Payload.wzzEnvironment, pwStrings);\n    FreeEnvironmentStringsW(pwStrings);\n\n    if (!DetourCopyPayloadToProcess(pi.hProcess, s_guidTrace,\n                                    &s_Payload, sizeof(s_Payload))) {\n        printf(\"TRACEBLD: DetourCopyPayloadToProcess failed: %ld\\n\", GetLastError());\n        ExitProcess(9008);\n    }\n\n    ResumeThread(pi.hThread);\n\n    WaitForSingleObject(pi.hProcess, INFINITE);\n\n    DWORD dwResult = 0;\n    if (!GetExitCodeProcess(pi.hProcess, &dwResult)) {\n        printf(\"TRACEBLD: GetExitCodeProcess failed: %ld\\n\", GetLastError());\n        return 9008;\n    }\n\n    printf(\"TRACEBLD: %ld processes.\\n\", s_nTotalClients);\n\n    return dwResult;\n}\n//\n//////////////////////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "ext/detours/samples/tracebld/tracebld.h",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (tracebld.h of tracebld.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#pragma once\n#ifndef _TRACEBLD_H_\n#define _TRACEBLD_H_\n#include <stdarg.h>\n\n//////////////////////////////////////////////////////////////////////////////\n//\n//\n#define TBLOG_PIPE_NAMEA       \"\\\\\\\\.\\\\pipe\\\\tracebuild\"\n#define TBLOG_PIPE_NAMEW       L\"\\\\\\\\.\\\\pipe\\\\tracebuild\"\n#ifdef UNICODE\n#define TBLOG_PIPE_NAME        TBLOG_PIPE_NAMEW\n#else\n#define TBLOG_PIPE_NAME        TBLOG_PIPE_NAMEA\n#endif\n\n//////////////////////////////////////////////////////////////////////////////\n//\ntypedef struct _TBLOG_MESSAGE\n{\n    DWORD       nBytes;\n    CHAR        szMessage[32764]; // 32768 - sizeof(nBytes)\n} TBLOG_MESSAGE, *PTBLOG_MESSAGE;\n\ntypedef struct _TBLOG_PAYLOAD\n{\n    DWORD       nParentProcessId;\n    DWORD       nTraceProcessId;\n    DWORD       nGeneology;\n    DWORD       rGeneology[64];\n    WCHAR       wzParents[256];\n    WCHAR       wzStdin[256];\n    WCHAR       wzStdout[256];\n    WCHAR       wzStderr[256];\n    BOOL        fStdoutAppend;\n    BOOL        fStderrAppend;\n    WCHAR       wzzDrop[1024];  // Like an environment: zero terminated strings with a last zero.\n    WCHAR       wzzEnvironment[32768];\n} TBLOG_PAYLOAD, *PTBLOG_PAYLOAD;\n\n// Shared state payload guid.\n//\nconst GUID s_guidTrace = {\n    0xd8e2dc69, 0x3004, 0x453e,\n    {0x94, 0x15, 0x19, 0x0e, 0x79, 0xe8, 0x93, 0x52}\n};\n\n\n#endif //  _TRACEBLD_H_\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/tracebld/trcbld.cpp",
    "content": "/////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (trcbld.cpp of trcbld.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#define _WIN32_WINNT        0x0500\n#define WIN32\n#define NT\n\n#define DBG_TRACE   0\n\n#include <windows.h>\n#include <stdio.h>\n#pragma warning(push)\n#if _MSC_VER > 1400\n#pragma warning(disable:6102 6103) // /analyze warnings\n#endif\n#include <strsafe.h>\n#pragma warning(pop)\n#include \"detours.h\"\n#include \"tracebld.h\"\n\n#define PULONG_PTR          PVOID\n#define PLONG_PTR           PVOID\n#define ULONG_PTR           PVOID\n\n//////////////////////////////////////////////////////////////////////////////\n\n#pragma warning(disable:4127)   // Many of our asserts are constants.\n\n#define DEBUG_BREAK() DebugBreak()\n\n#define ASSERT_ALWAYS(x)   \\\n    do {                                                        \\\n        if (!(x)) {                                             \\\n            AssertFailed(#x, __FILE__, __LINE__);               \\\n            DebugBreak();                                       \\\n        }                                                       \\\n    } while (0)\n\n#ifndef NDEBUG\n#define ASSERT(x)           ASSERT_ALWAYS(x)\n#else\n#define ASSERT(x)\n#endif\n\n#define UNUSED(c)       (c) = (c)\n\n//////////////////////////////////////////////////////////////////////////////\nstatic HMODULE s_hInst = NULL;\nstatic HMODULE s_hKernel32 = NULL;\nstatic CHAR s_szDllPath[MAX_PATH];\nstatic TBLOG_PAYLOAD s_Payload;\nstatic TBLOG_PAYLOAD s_ChildPayload;\nstatic CRITICAL_SECTION s_csChildPayload;\nstatic DWORD s_nTraceProcessId = 0;\nstatic LONG s_nChildCnt = 0;\n\nstatic CRITICAL_SECTION s_csPipe;                       // Guards access to hPipe.\nstatic HANDLE           s_hPipe = INVALID_HANDLE_VALUE;\nstatic TBLOG_MESSAGE    s_rMessage;\n\n// Logging Functions.\n//\nVOID Tblog(PCSTR pszMsgf, ...);\nVOID TblogV(PCSTR pszMsgf, va_list args);\n\nVOID VSafePrintf(PCSTR pszMsg, va_list args, PCHAR pszBuffer, LONG cbBuffer);\nPCHAR SafePrintf(PCHAR pszBuffer, LONG cbBuffer, PCSTR pszMsg, ...);\n\nLONG EnterFunc();\nVOID ExitFunc();\nVOID Print(PCSTR psz, ...);\nVOID NoteRead(PCSTR psz);\nVOID NoteRead(PCWSTR pwz);\nVOID NoteWrite(PCSTR psz);\nVOID NoteWrite(PCWSTR pwz);\nVOID NoteDelete(PCSTR psz);\nVOID NoteDelete(PCWSTR pwz);\nVOID NoteCleanup(PCSTR psz);\nVOID NoteCleanup(PCWSTR pwz);\n\nPBYTE LoadFile(HANDLE hFile, DWORD cbFile);\nstatic PCHAR RemoveReturns(PCHAR pszBuffer);\nstatic PWCHAR RemoveReturns(PWCHAR pwzBuffer);\n\nVOID AssertFailed(CONST PCHAR pszMsg, CONST PCHAR pszFile, ULONG nLine);\n\nint WINAPI Mine_EntryPoint(VOID);\nVOID WINAPI Mine_ExitProcess(UINT a0);\n\n//////////////////////////////////////////////////////////////////////////////\n//\nint (WINAPI * Real_EntryPoint)(VOID)\n    = NULL;\n\nBOOL (WINAPI * Real_CreateDirectoryW)(LPCWSTR a0,\n                                      LPSECURITY_ATTRIBUTES a1)\n    = CreateDirectoryW;\n\nBOOL (WINAPI * Real_CreateDirectoryExW)(LPCWSTR a0,\n                                        LPCWSTR a1,\n                                        LPSECURITY_ATTRIBUTES a2)\n    = CreateDirectoryExW;\n\nHANDLE (WINAPI * Real_CreateFileW)(LPCWSTR a0,\n                                   DWORD a1,\n                                   DWORD a2,\n                                   LPSECURITY_ATTRIBUTES a3,\n                                   DWORD a4,\n                                   DWORD a5,\n                                   HANDLE a6)\n    = CreateFileW;\n\nHANDLE (WINAPI * Real_CreateFileMappingW)(HANDLE hFile,\n                                         LPSECURITY_ATTRIBUTES lpAttributes,\n                                         DWORD flProtect,\n                                         DWORD dwMaximumSizeHigh,\n                                         DWORD dwMaximumSizeLow,\n                                         LPCWSTR lpName\n                                        )\n    = CreateFileMappingW;\n\nBOOL (WINAPI * Real_CreatePipe)(PHANDLE hReadPipe,\n                                PHANDLE hWritePipe,\n                                LPSECURITY_ATTRIBUTES lpPipeAttributes,\n                                DWORD nSize)\n    = CreatePipe;\n\nBOOL (WINAPI * Real_CloseHandle)(HANDLE a0)\n    = CloseHandle;\n\nBOOL (WINAPI * Real_DuplicateHandle)(HANDLE hSourceProcessHandle,\n                                     HANDLE hSourceHandle,\n                                     HANDLE hTargetProcessHandle,\n                                     LPHANDLE lpTargetHandle,\n                                     DWORD dwDesiredAccess,\n                                     BOOL bInheritHandle,\n                                     DWORD dwOptions)\n    = DuplicateHandle;\n\nBOOL (WINAPI * Real_CreateProcessW)(LPCWSTR lpApplicationName,\n                                    LPWSTR lpCommandLine,\n                                    LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                    LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                    BOOL bInheritHandles,\n                                    DWORD dwCreationFlags,\n                                    LPVOID lpEnvironment,\n                                    LPCWSTR lpCurrentDirectory,\n                                    LPSTARTUPINFOW lpStartupInfo,\n                                    LPPROCESS_INFORMATION lpProcessInformation)\n    = CreateProcessW;\n\nBOOL (WINAPI * Real_CreateProcessA)(LPCSTR lpApplicationName,\n                                    LPSTR lpCommandLine,\n                                    LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                    LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                    BOOL bInheritHandles,\n                                    DWORD dwCreationFlags,\n                                    LPVOID lpEnvironment,\n                                    LPCSTR lpCurrentDirectory,\n                                    LPSTARTUPINFOA lpStartupInfo,\n                                    LPPROCESS_INFORMATION lpProcessInformation)\n    = CreateProcessA;\n\nBOOL (WINAPI * Real_DeleteFileW)(LPCWSTR a0)\n    = DeleteFileW;\nBOOL (WINAPI * Real_DeviceIoControl)(HANDLE a0,\n                                     DWORD dwIoControlCode,\n                                     LPVOID lpInBuffer,\n                                     DWORD nInBufferSize,\n                                     LPVOID lpOutBuffer,\n                                     DWORD nOutBufferSize,\n                                     LPDWORD lpBytesReturned,\n                                     LPOVERLAPPED lpOverlapped)\n    = DeviceIoControl;\n\nDWORD (WINAPI * Real_GetFileAttributesW)(LPCWSTR a0)\n    = GetFileAttributesW;\n\nBOOL (WINAPI * Real_MoveFileWithProgressW)(LPCWSTR lpExistingFileName,\n                                           LPCWSTR lpNewFileName,\n                                           LPPROGRESS_ROUTINE lpProgressRoutine,\n                                           LPVOID lpData,\n                                           DWORD dwFlags)\n    = MoveFileWithProgressW;\n\nBOOL (WINAPI * Real_MoveFileA)(LPCSTR a0,\n                               LPCSTR a1)\n    = MoveFileA;\n\nBOOL (WINAPI * Real_MoveFileW)(LPCWSTR a0,\n                               LPCWSTR a12)\n    = MoveFileW;\n\nBOOL (WINAPI * Real_MoveFileExA)(LPCSTR a0,\n                                 LPCSTR a1,\n                                 DWORD a2)\n    = MoveFileExA;\n\nBOOL (WINAPI * Real_MoveFileExW)(LPCWSTR a0,\n                                 LPCWSTR a1,\n                                 DWORD a2)\n    = MoveFileExW;\n\nBOOL (WINAPI * Real_CopyFileExA)(LPCSTR a0,\n                                 LPCSTR a1,\n                                 LPPROGRESS_ROUTINE a2,\n                                 LPVOID a4,\n                                 LPBOOL a5,\n                                 DWORD a6)\n    = CopyFileExA;\n\nBOOL (WINAPI * Real_CopyFileExW)(LPCWSTR a0,\n                                 LPCWSTR a1,\n                                 LPPROGRESS_ROUTINE a2,\n                                 LPVOID a4,\n                                 LPBOOL a5,\n                                 DWORD a6)\n    = CopyFileExW;\n\nBOOL (WINAPI * Real_PrivCopyFileExW)(LPCWSTR  lpExistingFileName,\n                                     LPCWSTR  lpNewFileName,\n                                     LPPROGRESS_ROUTINE  lpProgressRoutine,\n                                     LPVOID  lpData,\n                                     LPBOOL  pbCancel,\n                                     DWORD  dwCopyFlags)\n    = NULL;\n\nBOOL (WINAPI * Real_CreateHardLinkA)(LPCSTR a0,\n                                     LPCSTR a1,\n                                     LPSECURITY_ATTRIBUTES a2)\n    = CreateHardLinkA;\n\nBOOL (WINAPI * Real_CreateHardLinkW)(LPCWSTR a0,\n                                     LPCWSTR a1,\n                                     LPSECURITY_ATTRIBUTES a2)\n    = CreateHardLinkW;\n\nBOOL (WINAPI * Real_SetStdHandle)(DWORD a0,\n                                  HANDLE a1)\n    = SetStdHandle;\n\nHMODULE (WINAPI * Real_LoadLibraryA)(LPCSTR a0)\n    = LoadLibraryA;\n\nHMODULE (WINAPI * Real_LoadLibraryW)(LPCWSTR a0)\n    = LoadLibraryW;\n\nHMODULE (WINAPI * Real_LoadLibraryExA)(LPCSTR a0,\n                                       HANDLE a1,\n                                       DWORD a2)\n    = LoadLibraryExA;\n\nHMODULE (WINAPI * Real_LoadLibraryExW)(LPCWSTR a0,\n                                       HANDLE a1,\n                                       DWORD a2)\n    = LoadLibraryExW;\n\nDWORD (WINAPI * Real_SetFilePointer)(HANDLE hFile,\n                                     LONG lDistanceToMove,\n                                     PLONG lpDistanceToMoveHigh,\n                                     DWORD dwMoveMethod)\n    = SetFilePointer;\n\nBOOL (WINAPI * Real_SetFilePointerEx)(HANDLE hFile,\n                                      LARGE_INTEGER liDistanceToMove,\n                                      PLARGE_INTEGER lpNewFilePointer,\n                                      DWORD dwMoveMethod)\n    = SetFilePointerEx;\n\nBOOL (WINAPI * Real_ReadFile)(HANDLE a0,\n                                 LPVOID a1,\n                                 DWORD a2,\n                                 LPDWORD a3,\n                                 LPOVERLAPPED a4)\n    = ReadFile;\n\nBOOL (WINAPI * Real_ReadFileEx)(HANDLE a0,\n                                   LPVOID a1,\n                                   DWORD a2,\n                                   LPOVERLAPPED a3,\n                                   LPOVERLAPPED_COMPLETION_ROUTINE a4)\n    = ReadFileEx;\n\nBOOL (WINAPI * Real_WriteFile)(HANDLE a0,\n                                  LPCVOID a1,\n                                  DWORD a2,\n                                  LPDWORD a3,\n                                  LPOVERLAPPED a4)\n    = WriteFile;\n\nBOOL (WINAPI * Real_WriteFileEx)(HANDLE a0,\n                                    LPCVOID a1,\n                                    DWORD a2,\n                                    LPOVERLAPPED a3,\n                                    LPOVERLAPPED_COMPLETION_ROUTINE a4)\n    = WriteFileEx;\n\nBOOL (WINAPI * Real_WriteConsoleA)(HANDLE a0,\n                                      const VOID* a1,\n                                      DWORD a2,\n                                      LPDWORD a3,\n                                      LPVOID a4)\n    = WriteConsoleA;\n\nBOOL (WINAPI * Real_WriteConsoleW)(HANDLE a0,\n                                      const VOID* a1,\n                                      DWORD a2,\n                                      LPDWORD a3,\n                                      LPVOID a4)\n    = WriteConsoleW;\n\nVOID (WINAPI * Real_ExitProcess)(UINT a0)\n    = ExitProcess;\n\nDWORD (WINAPI * Real_ExpandEnvironmentStringsA)(PCSTR lpSrc, PCHAR lpDst, DWORD nSize)\n    = ExpandEnvironmentStringsA;\n\nDWORD (WINAPI * Real_ExpandEnvironmentStringsW)(PCWSTR lpSrc, PWCHAR lpDst, DWORD nSize)\n    = ExpandEnvironmentStringsW;\n\nDWORD (WINAPI * Real_GetEnvironmentVariableA)(PCSTR lpName, PCHAR lpBuffer, DWORD nSize)\n    = GetEnvironmentVariableA;\n\nDWORD (WINAPI * Real_GetEnvironmentVariableW)(PCWSTR lpName, PWCHAR lpBuffer, DWORD nSize)\n    = GetEnvironmentVariableW;\n\nPCWSTR (CDECL * Real_wgetenv)(PCWSTR var) = NULL;\nPCSTR (CDECL * Real_getenv)(PCSTR var) = NULL;\nDWORD (CDECL * Real_getenv_s)(DWORD *pValue, PCHAR pBuffer, DWORD cBuffer, PCSTR varname) = NULL;\nDWORD (CDECL * Real_wgetenv_s)(DWORD *pValue, PWCHAR pBuffer, DWORD cBuffer, PCWSTR varname) = NULL;\nDWORD (CDECL * Real_dupenv_s)(PCHAR *ppBuffer, DWORD *pcBuffer, PCSTR varname) = NULL;\nDWORD (CDECL * Real_wdupenv_s)(PWCHAR *ppBuffer, DWORD *pcBuffer, PCWSTR varname) = NULL;\n\n//////////////////////////////////////////////////////////////////////////////\n//\nstatic VOID Copy(PWCHAR pwzDst, PCWSTR pwzSrc)\n{\n    while (*pwzSrc) {\n        *pwzDst++ = *pwzSrc++;\n    }\n    *pwzDst = '\\0';\n}\n\nstatic DWORD Size(PCWSTR pwzSrc)\n{\n    DWORD c = 0;\n    while (pwzSrc[c]) {\n        c++;\n    }\n    return c;\n}\n\nstatic PCWSTR Save(PCWSTR pwzSrc)\n{\n    DWORD c = (Size(pwzSrc) + 1) * sizeof(WCHAR);\n    PWCHAR pwzDst = (PWCHAR)GlobalAlloc(GPTR, c);\n    CopyMemory(pwzDst, pwzSrc, c);\n\n    return pwzDst;\n}\n\nstatic BOOL HasSpace(PCWSTR pwz)\n{\n    for (; *pwz; pwz++) {\n        if (*pwz == ' ' || *pwz == '\\t' || *pwz == '\\r' || *pwz == '\\n') {\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\n\nstatic BOOL HasChar(PCWSTR pwz, WCHAR w)\n{\n    for (; *pwz; pwz++) {\n        if (*pwz == w) {\n            return TRUE;\n        }\n    }\n    return FALSE;\n}\n\nstatic DWORD Compare(PCWSTR pwzA, PCWSTR pwzB)\n{\n    for (;;) {\n        WCHAR cA = *pwzA++;\n        WCHAR cB = *pwzB++;\n\n        if (cA >= 'A' && cA <= 'Z') {\n            cA += ('a' - 'A');\n        }\n        if (cB >= 'A' && cB <= 'Z') {\n            cB += ('a' - 'A');\n        }\n\n        if (cA == 0 && cB == 0) {\n            return 0;\n        }\n        if (cA != cB) {\n            return cA - cB;\n        }\n    }\n}\n\nstatic DWORD Compare(PCWSTR pwzA, PCSTR pszB)\n{\n    for (;;) {\n        WCHAR cA = *pwzA++;\n        WCHAR cB = *pszB++;\n\n        if (cA >= 'A' && cA <= 'Z') {\n            cA += ('a' - 'A');\n        }\n        if (cB >= 'A' && cB <= 'Z') {\n            cB += ('a' - 'A');\n        }\n\n        if (cA == 0 && cB == 0) {\n            return 0;\n        }\n        if (cA != cB) {\n            return cA - cB;\n        }\n    }\n}\n\nstatic DWORD Compare(PCSTR pszA, PCSTR pszB)\n{\n    for (;;) {\n        CHAR cA = *pszA++;\n        CHAR cB = *pszB++;\n\n        if (cA >= 'A' && cA <= 'Z') {\n            cA += ('a' - 'A');\n        }\n        if (cB >= 'A' && cB <= 'Z') {\n            cB += ('a' - 'A');\n        }\n\n        if (cA == 0 && cB == 0) {\n            return 0;\n        }\n        if (cA != cB) {\n            return cA - cB;\n        }\n    }\n}\n\n//////////////////////////////////////////////////////////////////////////////\n\nstatic PCSTR s_rpszMsvcrNames[] = {\n    \"msvcr80.dll\",\n    \"msvcr80d.dll\",\n    \"msvcr71.dll\",\n    \"msvcr71d.dll\",\n    \"msvcr70.dll\",\n    \"msvcr70d.dll\",\n    NULL\n};\n\nHMODULE s_hMsvcr = NULL;\nPCSTR s_pszMsvcr = NULL;\n\nstatic BOOL WINAPI ImportFileCallback(PVOID pContext, HMODULE hFile, PCSTR pszFile)\n{\n    UNUSED(pContext);\n\n    if (pszFile != NULL) {\n        for (int i = 0; s_rpszMsvcrNames[i]; i++) {\n            if (Compare(pszFile, s_rpszMsvcrNames[i]) == 0) {\n                s_hMsvcr = hFile;\n                s_pszMsvcr = s_rpszMsvcrNames[i];\n                return FALSE;\n            }\n        }\n    }\n    return TRUE;\n}\n\nBOOL FindMsvcr()\n{\n    DetourEnumerateImports(NULL, NULL, ImportFileCallback, NULL);\n\n    if (s_hMsvcr != NULL) {\n        return TRUE;\n    }\n\n    return FALSE;\n}\n\nBOOL FindProc(PVOID * ppvCode, PCSTR pwzFunc)\n{\n    PVOID pv = GetProcAddress(s_hMsvcr, pwzFunc);\n    if (pv != NULL) {\n        *ppvCode = pv;\n        return TRUE;\n    }\n    else {\n        *ppvCode = NULL;\n        return FALSE;\n    }\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nstruct EnvInfo\n{\n    DWORD   m_nHash;\n    DWORD   m_nIndex;\n    PCWSTR  m_pwzVar;\n    PCWSTR  m_pwzVal;\n    BOOL    m_fDefined;\n    BOOL    m_fUsed;\n    BOOL    m_fOriginal;\n};\n\n//////////////////////////////////////////////////////////////////////////////\n//\nclass EnvVars\n{\n  private:\n    static CRITICAL_SECTION s_csLock;\n    static DWORD            s_nVars;\n    static DWORD            s_nCapacity;\n    static EnvInfo **       s_pVars;\n\n  private:\n    static DWORD Hash(PCWSTR pwzVar)\n    {\n        DWORD hash = 5381;\n        while (*pwzVar != 0) {\n            WCHAR c = *pwzVar++;\n            if (c >= 'A' && c <= 'Z') {\n                c += ('a' - 'A');\n            }\n            hash = ((hash << 5) + hash) + c;\n        }\n        return hash;\n    }\n\n    static VOID LockAcquire()\n    {\n        EnterCriticalSection(&s_csLock);\n    }\n\n    static VOID LockRelease()\n    {\n        LeaveCriticalSection(&s_csLock);\n    }\n\n    static VOID Resize(DWORD nCapacity);\n    static VOID Set(EnvInfo *info);\n    static EnvInfo * Find(PCWSTR pwzVar);\n\n  public:\n    static BOOL Equal(PCWSTR pwzA, PCWSTR pwzB)\n    {\n        return (Compare(pwzA, pwzB) == 0);\n    }\n\n  public:\n    static VOID Initialize();\n    static VOID Dump();\n\n    static VOID Add(PCWSTR pwzVar, PCWSTR pwzVal);\n\n    static VOID Used(PCWSTR pwzVar);\n    static VOID Used(PCSTR pszVar);\n};\n\nCRITICAL_SECTION    EnvVars::s_csLock;\nDWORD               EnvVars::s_nVars = 0;\nDWORD               EnvVars::s_nCapacity = 0;\nEnvInfo **          EnvVars::s_pVars = NULL;\n\nVOID EnvVars::Initialize()\n{\n    InitializeCriticalSection(&s_csLock);\n\n    Resize(919);\n}\n\nVOID EnvVars::Resize(DWORD nCapacity)\n{\n    if (nCapacity > s_nCapacity) {\n        DWORD nOld = s_nCapacity;\n        EnvInfo ** pOld = s_pVars;\n\n        // DEBUG_BREAK();\n\n        s_pVars = (EnvInfo **)GlobalAlloc(GPTR, nCapacity * sizeof(EnvInfo *));\n        s_nCapacity = nCapacity;\n\n        if (pOld != NULL) {\n            for (DWORD n = 0; n < nOld; n++) {\n                if (pOld[n] != NULL) {\n                    Set(pOld[n]);\n                }\n            }\n            GlobalFree((HGLOBAL)pOld);\n            pOld = NULL;\n        }\n    }\n}\n\nVOID EnvVars::Set(EnvInfo *info)\n{\n    DWORD hash = info->m_nHash;\n    DWORD slot = hash % s_nCapacity;\n    DWORD death = 0;\n\n    // Find an empty slot.\n    for (; s_pVars[slot] != NULL; slot = (slot + 1) % s_nCapacity) {\n        if (++death > s_nCapacity) {\n            // We should have dropped out at some point...\n            DEBUG_BREAK();\n        }\n    }\n\n    s_pVars[slot] = info;\n}\n\nEnvInfo * EnvVars::Find(PCWSTR pwzVar)\n{\n    DWORD hash = Hash(pwzVar);\n    DWORD slot = hash % s_nCapacity;\n\n    LockAcquire();\n\n    // Find the the matching slot, or an empty one.\n    for (; s_pVars[slot] != NULL; slot = (slot + 1) % s_nCapacity) {\n        if (Equal(s_pVars[slot]->m_pwzVar, pwzVar)) {\n            LockRelease();\n            return s_pVars[slot];\n        }\n    }\n    LockRelease();\n    return NULL;\n}\n\nVOID EnvVars::Add(PCWSTR pwzVar, PCWSTR pwzVal)\n{\n    if (pwzVar == NULL) {\n        return;\n    }\n\n    WCHAR wzVar[MAX_PATH];\n    PWCHAR pwzDst = wzVar;\n    while (*pwzVar) {\n        if (*pwzVar >= 'a' && *pwzVar <= 'z') {\n            *pwzDst++ = *pwzVar - ('a' - 'A');\n        }\n        else {\n            *pwzDst++ = *pwzVar;\n        }\n        pwzVar++;\n    }\n    *pwzDst = '\\0';\n    pwzVar = wzVar;\n\n    WCHAR wzVal[] = L\"\";\n    if (pwzVal != NULL) {\n        while (*pwzVal == ' ' || *pwzVal == '\\t') {\n            *pwzVal++;\n        }\n    }\n    else {\n        pwzVal = wzVal;\n    }\n\n    // Tblog(\"<!-- ::Add var=[%le] val=[%le] -->\\n\", pwzVar, pwzVal);\n    LockAcquire();\n\n    // DEBUG_BREAK();\n\n    DWORD hash = Hash(pwzVar);\n    DWORD slot = hash % s_nCapacity;\n    EnvInfo *info = NULL;\n    DWORD death = 0;\n\n    // Find the the matching slot, or an empty one.\n    for (; s_pVars[slot] != NULL; slot = (slot + 1) % s_nCapacity) {\n        if (Equal(s_pVars[slot]->m_pwzVar, pwzVar)) {\n            LockRelease();\n            return;\n        }\n        if (++death > s_nCapacity) {\n            // We should have dropped out at some point...\n            DEBUG_BREAK();\n        }\n    }\n\n    // Add the var to list of known vars.\n    info = (EnvInfo *)GlobalAlloc(GPTR, sizeof(EnvInfo));\n    info->m_nHash = hash;\n    info->m_nIndex = s_nVars++;\n    info->m_pwzVar = Save(pwzVar);\n    info->m_pwzVal = Save(pwzVal);\n    if (pwzVal[0] == '\\0') {\n        info->m_fDefined = FALSE;\n        info->m_fUsed = TRUE;\n    }\n    else {\n        info->m_fDefined = TRUE;\n    }\n    s_pVars[slot] = info;\n\n    // Check if we should grow the table.\n    if (s_nVars > (s_nCapacity / 2)) {\n        Resize(s_nCapacity * 2 - 1);\n    }\n\n    LockRelease();\n}\n\nVOID EnvVars::Used(PCWSTR pwzVar)\n{\n    if (pwzVar != NULL) {\n        // Tblog(\"<!-- Used [%le] -->\\n\", pwzVar);\n        EnvInfo *pInfo = Find(pwzVar);\n        if (pInfo) {\n            pInfo->m_fUsed = TRUE;\n        }\n#if 0\n        else {\n            Add(pwzVar, NULL);\n        }\n#endif\n    }\n}\n\nVOID EnvVars::Used(PCSTR pszVar)\n{\n    if (pszVar != NULL) {\n        WCHAR wzVar[MAX_PATH];\n        PWCHAR pwzVar = wzVar;\n        while (*pszVar) {\n            *pwzVar++ = *pszVar++;\n        }\n        *pwzVar = '\\0';\n\n        Used(wzVar);\n    }\n}\n\nVOID EnvVars::Dump()\n{\n    if (s_nVars == 0) {\n        return;\n    }\n\n    LockAcquire();\n\n    Tblog(\"<t:Vars>\\n\");\n\n    // Remove any variables that match the original environment.\n    PCWSTR pwzz = s_Payload.wzzEnvironment;\n    while (*pwzz) {\n        WCHAR wzVar[MAX_PATH];\n        PWCHAR pwzVar = wzVar;\n\n        while (*pwzz && *pwzz != '=') {\n            *pwzVar++ = *pwzz++;\n        }\n        *pwzVar = '\\0';\n        if (*pwzz == '=') {\n            pwzz++;\n        }\n\n        EnvInfo *pInfo = Find(wzVar);\n        if (pInfo) {\n            if (Compare(pwzz, pInfo->m_pwzVal) == 0) {\n                pInfo->m_fUsed = FALSE;\n            }\n        }\n        pwzz += Size(pwzz) + 1;\n    }\n\n\n    EnvInfo ** pSorted = (EnvInfo **)GlobalAlloc(GPTR, s_nVars * sizeof(EnvInfo *));\n\n    for (DWORD n = 0; n < s_nCapacity; n++) {\n        if (s_pVars[n] != NULL) {\n            if (s_pVars[n]->m_nIndex > s_nVars) {\n                DEBUG_BREAK();\n            }\n            pSorted[s_pVars[n]->m_nIndex] = s_pVars[n];\n        }\n    }\n\n    for (DWORD n = 0; n < s_nVars; n++) {\n        EnvInfo *pInfo = pSorted[n];\n\n        if (pInfo == NULL) {\n            Print(\"<!-- Warning: Missing %d of %d -->\\n\", n, s_nVars);\n            continue;\n        }\n\n        if (pInfo->m_fUsed && pInfo->m_pwzVal[0]) {\n            Print(\"<t:Var var=\\\"%le\\\">%le</t:Var>\\n\", pInfo->m_pwzVar, pInfo->m_pwzVal);\n        }\n    }\n    GlobalFree((HGLOBAL)pSorted);\n\n    Tblog(\"</t:Vars>\\n\");\n\n    LockRelease();\n}\n\nvoid SaveEnvironment()\n{\n    LPWCH pwStrings = GetEnvironmentStringsW();\n    PCWSTR pwEnv = (PCWSTR)pwStrings;\n\n    while (*pwEnv != '\\0') {\n        WCHAR wzVar[MAX_PATH];\n        PWCHAR pwzDst = wzVar;\n        PCWSTR pwzVal = NULL;\n\n        if (*pwEnv == '=') {\n            *pwzDst++ = *pwEnv++;\n        }\n        while (*pwEnv != '\\0' && *pwEnv != '=') {\n            *pwzDst++ = *pwEnv++;\n        }\n        *pwzDst++ = '\\0';\n\n        if (*pwEnv == '=') {\n            pwEnv++;\n        }\n\n        pwzVal = pwEnv;\n        while (*pwEnv != '\\0') {\n            pwEnv++;\n        }\n        if (*pwEnv == '\\0') {\n            pwEnv++;\n        }\n        if (wzVar[0] != '=') {\n            EnvVars::Add(wzVar, pwzVal);\n        }\n    }\n    FreeEnvironmentStringsW(pwStrings);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nstruct ProcInfo\n{\n    HANDLE  m_hProc;\n    DWORD   m_nProcId;\n    DWORD   m_nProc;\n};\n\nclass Procs\n{\n  private:\n    static CRITICAL_SECTION s_csLock;\n    static DWORD            s_nProcs;\n    static ProcInfo         s_rProcs[4049];\n\n  private:\n    static ProcInfo& HashToSlot(HANDLE handle)\n    {\n        return s_rProcs[((DWORD_PTR)handle) % ARRAYSIZE(s_rProcs)];\n    }\n\n    static VOID LockAcquire()\n    {\n        EnterCriticalSection(&s_csLock);\n    }\n\n    static VOID LockRelease()\n    {\n        LeaveCriticalSection(&s_csLock);\n    }\n\n  public:\n    static VOID Initialize();\n    static ProcInfo * Create(HANDLE hProc, DWORD nProcId);\n    static BOOL Close(HANDLE hProc);\n};\n\nCRITICAL_SECTION    Procs::s_csLock;\nDWORD               Procs::s_nProcs = 0;\nProcInfo            Procs::s_rProcs[4049];\n\nVOID Procs::Initialize()\n{\n    InitializeCriticalSection(&s_csLock);\n    for (DWORD i = 0; i < ARRAYSIZE(s_rProcs); i++) {\n        s_rProcs[i].m_hProc = INVALID_HANDLE_VALUE;\n    }\n}\n\nProcInfo * Procs::Create(HANDLE hProc, DWORD nProcId)\n{\n    LockAcquire();\n    s_nProcs++;\n    ProcInfo& slot = HashToSlot(hProc);\n    slot.m_hProc = hProc;\n    slot.m_nProcId = nProcId;\n    slot.m_nProc = s_nProcs;\n    Print(\"<!-- CreateProcess (%d)-->\\n\", slot.m_nProc);\n    LockRelease();\n\n    return &slot;\n}\n\nBOOL Procs::Close(HANDLE hProc)\n{\n    BOOL first = false;\n\n    LockAcquire();\n    ProcInfo& slot = HashToSlot(hProc);\n    if (slot.m_hProc == hProc) {\n        first = true;\n        Print(\"<!-- CloseProcess (%d)-->\\n\", slot.m_nProc);\n        slot.m_hProc = INVALID_HANDLE_VALUE;\n        slot.m_nProcId = 0;\n        slot.m_nProc = 0;\n        s_nProcs--;\n    }\n    LockRelease();\n\n    return first;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nstruct FileInfo\n{\n    DWORD   m_nHash;\n    DWORD   m_nIndex;\n\n    BOOL    m_fCantRead;        // Set for file that are opened Create\n    BOOL    m_fRead;\n    BOOL    m_fWrite;\n\n    BOOL    m_fDelete;\n    BOOL    m_fCleanup;\n    BOOL    m_fSystemPath;\n    BOOL    m_fTemporaryPath;\n    BOOL    m_fTemporaryFile;\n\n    DWORD   m_cbRead;\n    DWORD   m_cbWrite;\n\n    BOOL    m_fAppend;\n    BOOL    m_fAbsorbed;        // Absorbed by TraceBld.\n    BOOL    m_fDirectory;\n\n    PCWSTR  m_pwzPath;\n    PBYTE   m_pbContent;\n    DWORD   m_cbContent;\n\n};\n\n//////////////////////////////////////////////////////////////////////////////\n//\nclass FileNames\n{\n  private:\n    static CRITICAL_SECTION s_csLock;\n    static DWORD            s_nFiles;\n    static DWORD            s_nCapacity;\n    static FileInfo **      s_pFiles;\n\n  public:\n    static WCHAR            s_wzSysPath[MAX_PATH];\n    static WCHAR            s_wzS64Path[MAX_PATH];\n    static WCHAR            s_wzTmpPath[MAX_PATH];\n    static WCHAR            s_wzExePath[MAX_PATH];\n    static DWORD            s_wcSysPath;\n    static DWORD            s_wcS64Path;\n    static DWORD            s_wcTmpPath;\n    static DWORD            s_wcExePath;\n\n  private:\n    static DWORD Hash(PCWSTR pwzFile)\n    {\n        DWORD hash = 5381;\n        while (*pwzFile != 0) {\n            WCHAR c = *pwzFile++;\n            if (c >= 'A' && c <= 'Z') {\n                c += ('a' - 'A');\n            }\n            hash = ((hash << 5) + hash) + c;\n        }\n        return hash;\n    }\n\n    static VOID LockAcquire()\n    {\n        EnterCriticalSection(&s_csLock);\n    }\n\n    static VOID LockRelease()\n    {\n        LeaveCriticalSection(&s_csLock);\n    }\n\n    static VOID Resize(DWORD nCapacity);\n    static VOID Set(FileInfo *info);\n    static VOID Replace(PWCHAR pwzBuffer, PWCHAR pwzDstEnd, DWORD cwOld, PCWSTR pwzNew);\n\n  public:\n    static BOOL Equal(PCWSTR pwzA, PCWSTR pwzB)\n    {\n        return (Compare(pwzA, pwzB) == 0);\n    }\n\n    static BOOL PrefixMatch(PCWSTR pwzFile, PCWSTR pwzPrefix)\n    {\n        for (;;) {\n            WCHAR cFile = *pwzFile++;\n            WCHAR cPrefix = *pwzPrefix++;\n\n            if (cFile >= 'A' && cFile <= 'Z') {\n                cFile += ('a' - 'A');\n            }\n            if (cPrefix >= 'A' && cPrefix <= 'Z') {\n                cPrefix += ('a' - 'A');\n            }\n\n            if (cPrefix == 0) {\n                return TRUE;\n            }\n            if (cFile != cPrefix) {\n                return FALSE;\n            }\n        }\n    }\n\n    static BOOL SuffixMatch(PCWSTR pwzFile, PCWSTR pwzSuffix)\n    {\n        // Move both pointers to the end of the strings.\n        PCWSTR pwzFileBeg = pwzFile;\n        while (*pwzFile) {\n            pwzFile++;\n        }\n\n        PCWSTR pwzSuffixBeg = pwzSuffix;\n        while (*pwzSuffix) {\n            pwzSuffix++;\n        }\n\n        // Now walk backwards comparing strings.\n        for (;;) {\n            WCHAR cFile = (pwzFile > pwzFileBeg) ? *--pwzFile : 0;\n            WCHAR cSuffix = (pwzSuffix > pwzSuffixBeg) ? *--pwzSuffix : 0;\n\n            if (cFile >= 'A' && cFile <= 'Z') {\n                cFile += ('a' - 'A');\n            }\n            if (cSuffix >= 'A' && cSuffix <= 'Z') {\n                cSuffix += ('a' - 'A');\n            }\n\n            if (cSuffix == 0) {\n                return TRUE;\n            }\n            if (cFile != cSuffix) {\n                return FALSE;\n            }\n        }\n    }\n\n    static VOID EndInSlash(PWCHAR pwzPath)\n    {\n        if (*pwzPath) {\n            while (*pwzPath) {\n                pwzPath++;\n            }\n            if (pwzPath[-1] != '\\\\') {\n                *pwzPath++ = '\\\\';\n                *pwzPath = '\\0';\n            }\n        }\n    }\n\n  public:\n    static VOID Initialize();\n    static VOID Dump();\n    static FileInfo * FindPartial(PCWSTR pwzPath);\n    static FileInfo * FindPartial(PCSTR pszPath);\n    static FileInfo * FindFull(PCWSTR pwzPath);\n    static PCWSTR ParameterizeName(PWCHAR pwzDst, DWORD cMaxDst, PCWSTR pwzPath);\n    static PCWSTR ParameterizeName(PWCHAR pwzDst, DWORD cMaxDst, FileInfo *pInfo);\n    static VOID ParameterizeLine(PWCHAR pwzDst, PWCHAR pwzDstEnd);\n};\n\nCRITICAL_SECTION    FileNames::s_csLock;\nDWORD               FileNames::s_nFiles = 0;\nDWORD               FileNames::s_nCapacity = 0;\nFileInfo **         FileNames::s_pFiles;\nWCHAR               FileNames::s_wzSysPath[MAX_PATH];\nWCHAR               FileNames::s_wzS64Path[MAX_PATH];\nWCHAR               FileNames::s_wzTmpPath[MAX_PATH];\nWCHAR               FileNames::s_wzExePath[MAX_PATH];\nDWORD               FileNames::s_wcSysPath;\nDWORD               FileNames::s_wcS64Path;\nDWORD               FileNames::s_wcTmpPath;\nDWORD               FileNames::s_wcExePath;\n\nVOID FileNames::Initialize()\n{\n    InitializeCriticalSection(&s_csLock);\n\n    s_wzSysPath[0] = '\\0';\n    GetSystemDirectoryW(s_wzSysPath, ARRAYSIZE(s_wzSysPath));\n    EndInSlash(s_wzSysPath);\n\n    s_wzS64Path[0] = '\\0';\n    GetWindowsDirectoryW(s_wzS64Path, ARRAYSIZE(s_wzS64Path));\n    EndInSlash(s_wzS64Path);\n    Copy(s_wzS64Path + Size(s_wzS64Path), L\"SysWOW64\\\\\");\n\n    s_wzTmpPath[0] = '\\0';\n    GetTempPathW(ARRAYSIZE(s_wzTmpPath), s_wzTmpPath);\n    EndInSlash(s_wzTmpPath);\n\n    s_wzExePath[0] = '\\0';\n    GetModuleFileNameW(NULL, s_wzExePath, ARRAYSIZE(s_wzExePath));\n    PWCHAR pwzLast = s_wzExePath;\n    for (PWCHAR pwz = s_wzExePath; *pwz; pwz++) {\n        if (*pwz == '\\\\') {\n            pwzLast = pwz;\n        }\n    }\n    if (*pwzLast == '\\\\') {\n        *++pwzLast = '\\0';\n    }\n\n    s_wcSysPath = Size(s_wzSysPath);\n    s_wcS64Path = Size(s_wzS64Path);\n    s_wcTmpPath = Size(s_wzTmpPath);\n    s_wcExePath = Size(s_wzExePath);\n\n    Resize(4049);\n}\n\nVOID FileNames::Resize(DWORD nCapacity)\n{\n    if (nCapacity > s_nCapacity) {\n        DWORD nOld = s_nCapacity;\n        FileInfo ** pOld = s_pFiles;\n\n        s_pFiles = (FileInfo **)GlobalAlloc(GPTR, nCapacity * sizeof(FileInfo *));\n        s_nCapacity = nCapacity;\n\n        if (pOld != NULL) {\n            for (DWORD n = 0; n < nOld; n++) {\n                if (pOld[n] != NULL) {\n                    Set(pOld[n]);\n                }\n            }\n            GlobalFree((HGLOBAL)pOld);\n            pOld = NULL;\n        }\n        s_nCapacity = nCapacity;\n    }\n}\n\nVOID FileNames::Set(FileInfo *info)\n{\n    DWORD hash = info->m_nHash;\n    DWORD slot = hash % s_nCapacity;\n    DWORD death = 0;\n\n    // Find an empty slot.\n    for (; s_pFiles[slot] != NULL; slot = (slot + 1) % s_nCapacity) {\n        if (++death > s_nCapacity) {\n            // We should have dropped out at some point...\n            DEBUG_BREAK();\n        }\n    }\n\n    s_pFiles[slot] = info;\n}\n\nFileInfo * FileNames::FindFull(PCWSTR pwzPath)\n{\n    if (pwzPath == NULL) {\n        return NULL;\n    }\n\n    LockAcquire();\n\n    DWORD hash = Hash(pwzPath);\n    DWORD slot = hash % s_nCapacity;\n    FileInfo *info = NULL;\n    DWORD death = 0;\n\n    // Find the the matching slot, or an empty one.\n    for (; s_pFiles[slot] != NULL; slot = (slot + 1) % s_nCapacity) {\n        if (Equal(s_pFiles[slot]->m_pwzPath, pwzPath)) {\n            info = s_pFiles[slot];\n            goto succeed;\n        }\n        if (++death > s_nCapacity) {\n            // We should have dropped out at some point...\n            DEBUG_BREAK();\n        }\n    }\n\n    // Add the file to list of known files.\n    info = (FileInfo *)GlobalAlloc(GPTR, sizeof(FileInfo));\n    info->m_nHash = hash;\n    info->m_nIndex = s_nFiles++;\n    info->m_pwzPath = Save(pwzPath);\n    info->m_fSystemPath = (PrefixMatch(info->m_pwzPath, s_wzSysPath) ||\n                           PrefixMatch(info->m_pwzPath, s_wzS64Path));\n    info->m_fTemporaryPath = PrefixMatch(info->m_pwzPath, s_wzTmpPath);\n    info->m_fTemporaryFile = SuffixMatch(info->m_pwzPath, L\".tmp\");\n\n    s_pFiles[slot] = info;\n\n    // Check if we should grow the table.\n    if (s_nFiles > (s_nCapacity / 2)) {\n        Resize(s_nCapacity * 2 - 1);\n    }\n\n  succeed:\n    LockRelease();\n\n    return info;\n}\n\nFileInfo * FileNames::FindPartial(PCWSTR pwzPath)\n{\n    WCHAR wzPath[MAX_PATH];\n    PWCHAR pwzFile = NULL;\n\n    if (!GetFullPathNameW(pwzPath, ARRAYSIZE(wzPath), wzPath, &pwzFile)) {\n        return FindFull(pwzPath);\n    }\n    else {\n        return FindFull(wzPath);\n    }\n}\n\nFileInfo * FileNames::FindPartial(PCSTR pwzPath)\n{\n    WCHAR wzPath[MAX_PATH];\n    PWCHAR pwzFile = wzPath;\n\n    while (*pwzPath) {\n        *pwzFile++ = *pwzPath++;\n    }\n    *pwzFile = '\\0';\n\n    return FindPartial(wzPath);\n}\n\nPCWSTR FileNames::ParameterizeName(PWCHAR pwzDst, DWORD cMaxDst, FileInfo *pInfo)\n{\n    return ParameterizeName(pwzDst, cMaxDst, pInfo->m_pwzPath);\n}\n\nPCWSTR FileNames::ParameterizeName(PWCHAR pwzDst, DWORD cMaxDst, PCWSTR pwzPath)\n{\n    if (PrefixMatch(pwzPath, s_wzSysPath)) {\n        Copy(pwzDst, L\"%SYSDIR%\\\\\");\n        Copy(pwzDst + Size(pwzDst), pwzPath + s_wcSysPath);\n        goto finish;\n    }\n    else if (PrefixMatch(pwzPath, s_wzS64Path)) {\n        Copy(pwzDst, L\"%SYSDIR%\\\\\");\n        Copy(pwzDst + Size(pwzDst), pwzPath + s_wcS64Path);\n        goto finish;\n    }\n    else if (PrefixMatch(pwzPath, s_wzTmpPath)) {\n        Copy(pwzDst, L\"%TMPDIR%\\\\\");\n        Copy(pwzDst + Size(pwzDst), pwzPath + s_wcTmpPath);\n        goto finish;\n    }\n    else {\n        Copy(pwzDst, pwzPath);\n\n      finish:\n#if 0 // to convert to all lower case.\n        for (PWCHAR pwz = pwzDst; *pwz && pwz < pwzDst + cMaxDst; pwz++) {\n            if (*pwz >= 'A' && *pwz <= 'Z') {\n                *pwz = 'a' + (*pwz - 'A');\n            }\n        }\n#else\n        (void)cMaxDst;\n#endif\n        return pwzDst;\n    }\n}\n\nVOID FileNames::Replace(PWCHAR pwzDst, PWCHAR pwzDstEnd, DWORD cwOld, PCWSTR pwzNew)\n{\n    DWORD cwNew = Size(pwzNew);\n    DWORD cwDst = Size(pwzDst);\n\n    if (cwOld < cwNew) {        // We have to insert.\n        if ((cwDst + cwNew - cwOld) >= (DWORD)(pwzDstEnd - pwzDst)) {\n            // Won't fit, so abort.\n            return;\n        }\n\n        PWCHAR pwzTo = pwzDst + cwDst + (cwNew - cwOld);\n        PWCHAR pwzFm = pwzDst + cwDst;\n\n        while (pwzTo >= pwzDst) {\n            *pwzTo-- = *pwzFm--;\n        }\n    }\n    else if (cwOld > cwNew) {  // We have to remove.\n        PWCHAR pwzTo = pwzDst + cwNew;\n        PWCHAR pwzFm = pwzDst + cwOld;\n\n        while (*pwzFm) {\n            *pwzTo++ = *pwzFm++;\n        }\n        *pwzTo = '\\0';\n    }\n\n    // Now write the new string.\n    while (*pwzNew) {\n        *pwzDst++ = *pwzNew++;\n    }\n}\n\nVOID FileNames::ParameterizeLine(PWCHAR pwzDst, PWCHAR pwzDstEnd)\n{\n    for (; *pwzDst != '\\0'; pwzDst++) {\n        if (PrefixMatch(pwzDst, s_wzSysPath)) {\n            Replace(pwzDst, pwzDstEnd, s_wcSysPath, L\"%SYSDIR%\\\\\");\n        }\n        else if (PrefixMatch(pwzDst, s_wzS64Path)) {\n            Replace(pwzDst, pwzDstEnd, s_wcS64Path, L\"%SYSDIR%\\\\\");\n        }\n        else if (PrefixMatch(pwzDst, s_wzTmpPath)) {\n            Replace(pwzDst, pwzDstEnd, s_wcTmpPath, L\"%TMPDIR%\\\\\");\n        }\n    }\n}\n\nVOID FileNames::Dump()\n{\n    WCHAR wzPath[MAX_PATH];\n\n    if (s_nFiles == 0) {\n        return;\n    }\n\n    LockAcquire();\n\n    Tblog(\"<t:Files>\\n\");\n\n    FileInfo ** pSorted = (FileInfo **)GlobalAlloc(GPTR, s_nFiles * sizeof(FileInfo *));\n\n    for (DWORD n = 0; n < s_nCapacity; n++) {\n        if (s_pFiles[n] != NULL) {\n            if (s_pFiles[n]->m_nIndex > s_nFiles) {\n                DEBUG_BREAK();\n            }\n            pSorted[s_pFiles[n]->m_nIndex] = s_pFiles[n];\n        }\n    }\n\n    for (DWORD n = 0; n < s_nFiles; n++) {\n        FileInfo *pInfo = pSorted[n];\n\n        if (pInfo == NULL) {\n            Print(\"<!-- Warning: Missing %d of %d -->\\n\", n, s_nFiles);\n            continue;\n        }\n\n        BOOL fRead = pInfo->m_fRead;\n        BOOL fWrite = pInfo->m_fWrite;\n        BOOL fDelete = (pInfo->m_fDelete);\n        BOOL fCleanup = (pInfo->m_fCleanup);\n        BOOL fAppend = (pInfo->m_fAppend);\n\n#if 0\n        if (fDelete && !fRead && !fWrite) {\n            Print(\"<!-- Discarding: %ls -->\\n\", pInfo->m_pwzPath);\n            // Discard pipe files only passed to children.\n            continue;\n        }\n#endif\n        if (pInfo->m_fAbsorbed) {\n            // Discard response fles\n            continue;\n        }\n\n        if (PrefixMatch(pInfo->m_pwzPath, s_wzExePath) ||\n            PrefixMatch(pInfo->m_pwzPath, s_wzSysPath) ||\n            PrefixMatch(pInfo->m_pwzPath, s_wzS64Path)) {\n            // Discard files from exec directory (because considered internal to code).\n            continue;\n        }\n\n#if 1 // Ignore PIPEs.\n        if (FileNames::PrefixMatch(pInfo->m_pwzPath, L\"\\\\\\\\.\\\\PIPE\\\\\")) {\n            continue;\n        }\n#endif\n        if (FileNames::SuffixMatch(pInfo->m_pwzPath, L\"\\\\conout$\")) {\n            continue;\n        }\n        if (FileNames::SuffixMatch(pInfo->m_pwzPath, L\"\\\\conin$\")) {\n            continue;\n        }\n        if (FileNames::SuffixMatch(pInfo->m_pwzPath, L\"\\\\nul\")) {\n            continue;\n        }\n\n        ParameterizeName(wzPath, ARRAYSIZE(wzPath), pInfo);\n\n        if (pInfo->m_fDirectory) {\n            Print(\"<t:File mkdir=\\\"true\\\">%ls</t:File>\\n\", wzPath);\n            continue;\n        }\n\n        if (!fRead && !fWrite && !fDelete && !fCleanup) {\n            // Discard do \"none\" files.\n            continue;\n        }\n\n        if (pInfo->m_pbContent == NULL ||\n            pInfo->m_fDelete ||\n            pInfo->m_fCleanup ||\n            pInfo->m_fWrite) {\n\n            Print(\"<t:File%s%s%s%s%s>%ls</t:File>\\n\",\n                  fRead ? \" read=\\\"true\\\"\" : \"\",\n                  fWrite ? \" write=\\\"true\\\"\" : \"\",\n                  fDelete ? \" delete=\\\"true\\\"\" : \"\",\n                  fCleanup ? \" cleanup=\\\"true\\\"\" : \"\",\n                  fAppend ? \" append=\\\"true\\\"\" : \"\",\n                  // size=\\\"%d\\\" pInfo->m_cbContent,\n                  wzPath);\n        }\n        else if ((pInfo->m_pbContent)[0] == 0xff && (pInfo->m_pbContent)[1] == 0xfe) {\n            // Unicode\n            Print(\"<t:File%s%s%s%s%s>%ls<t:Data>%le</t:Data></t:File>\\n\",\n                  fRead ? \" read=\\\"true\\\"\" : \"\",\n                  fWrite ? \" write=\\\"true\\\"\" : \"\",\n                  fDelete ? \" delete=\\\"true\\\"\" : \"\",\n                  fCleanup ? \" cleanup=\\\"true\\\"\" : \"\",\n                  fAppend ? \" append=\\\"true\\\"\" : \"\",\n                  //  size=\\\"%d\\\" pInfo->m_cbContent,\n                  wzPath,\n                  RemoveReturns((PWCHAR)pInfo->m_pbContent));\n        }\n        else {\n            // Ascii\n            Print(\"<t:File%s%s%s%s%s>%ls<t:Data>%he</t:Data></t:File>\\n\",\n                  fRead ? \" read=\\\"true\\\"\" : \"\",\n                  fWrite ? \" write=\\\"true\\\"\" : \"\",\n                  fDelete ? \" delete=\\\"true\\\"\" : \"\",\n                  fCleanup ? \" cleanup=\\\"true\\\"\" : \"\",\n                  fAppend ? \" append=\\\"true\\\"\" : \"\",\n                  //  size=\\\"%d\\\" pInfo->m_cbContent,\n                  wzPath,\n                  RemoveReturns((PCHAR)pInfo->m_pbContent));\n        }\n\n        if (pInfo->m_pbContent != NULL) {\n            GlobalFree((HGLOBAL)pInfo->m_pbContent);\n            pInfo->m_pbContent = NULL;\n        }\n    }\n    GlobalFree((HGLOBAL)pSorted);\n\n    Tblog(\"</t:Files>\\n\");\n\n    LockRelease();\n}\n\n\n//////////////////////////////////////////////////////////////////////////////\n//\nclass OpenFiles\n{\n  private:\n    struct SLOT\n    {\n        HANDLE      m_hHandle;\n        FileInfo *  m_pFile;\n        ProcInfo *  m_pProc;\n    };\n\n  private:\n    static CRITICAL_SECTION s_csLock;\n    static DWORD            s_nHandles;\n    static SLOT             s_rHandles[4049];\n\n  private:\n    static SLOT& HashToSlot(HANDLE handle)\n    {\n        return s_rHandles[((DWORD_PTR)handle) % ARRAYSIZE(s_rHandles)];\n    }\n\n    static VOID LockAcquire()\n    {\n        EnterCriticalSection(&s_csLock);\n    }\n\n    static VOID LockRelease()\n    {\n        LeaveCriticalSection(&s_csLock);\n    }\n\n  public:\n    static VOID Initialize();\n\n    static VOID SetWrite(HANDLE hFile, DWORD cbData)\n    {\n        SLOT& slot = HashToSlot(hFile);\n        if (slot.m_hHandle == hFile) {\n            slot.m_pFile->m_fWrite = TRUE;\n            slot.m_pFile->m_cbWrite += cbData;\n        }\n    }\n\n    static VOID SetRead(HANDLE hFile, DWORD cbData)\n    {\n        SLOT& slot = HashToSlot(hFile);\n        if (slot.m_hHandle == hFile) {\n            slot.m_pFile->m_fRead = TRUE;\n            slot.m_pFile->m_cbRead += cbData;\n        }\n    }\n\n    static BOOL Forget(HANDLE handle);\n    static BOOL Remember(HANDLE hFile, FileInfo *pInfo);\n    static BOOL Remember(HANDLE hProc, ProcInfo *pInfo);\n    static FileInfo * RecallFile(HANDLE hFile);\n    static ProcInfo * RecallProc(HANDLE hProc);\n};\n\nCRITICAL_SECTION    OpenFiles::s_csLock;  // Guards access to OpenFile stuctures.\nDWORD               OpenFiles::s_nHandles = 0;\nOpenFiles::SLOT     OpenFiles::s_rHandles[4049];\n\nVOID OpenFiles::Initialize()\n{\n    InitializeCriticalSection(&s_csLock);\n    for (DWORD n = 0; n < ARRAYSIZE(s_rHandles); n++) {\n        s_rHandles[n].m_hHandle = INVALID_HANDLE_VALUE;\n        s_rHandles[n].m_pFile = NULL;\n        s_rHandles[n].m_pProc = NULL;\n    }\n}\n\nBOOL OpenFiles::Forget(HANDLE handle)\n{\n    LockAcquire();\n    OpenFiles::SLOT& slot = HashToSlot(handle);\n\n    if (slot.m_hHandle == handle    ) {\n        slot.m_hHandle = INVALID_HANDLE_VALUE;\n        slot.m_pFile = NULL;\n        slot.m_pProc = NULL;\n        s_nHandles--;\n    }\n    LockRelease();\n    return FALSE;\n}\n\nBOOL OpenFiles::Remember(HANDLE hFile, FileInfo *pFile)\n{\n    LockAcquire();\n\n    OpenFiles::SLOT& slot = HashToSlot(hFile);\n    if (slot.m_hHandle != hFile && slot.m_hHandle != INVALID_HANDLE_VALUE) {\n        // hash collision\n        DEBUG_BREAK();\n    }\n\n    slot.m_hHandle = hFile;\n    slot.m_pFile = pFile;\n    slot.m_pProc = NULL;\n    s_nHandles++;\n\n    LockRelease();\n\n    return TRUE;\n}\n\nBOOL OpenFiles::Remember(HANDLE hProc, ProcInfo *pProc)\n{\n    LockAcquire();\n\n    OpenFiles::SLOT& slot = HashToSlot(hProc);\n    if (slot.m_hHandle != hProc && slot.m_hHandle != INVALID_HANDLE_VALUE) {\n        // hash collision\n        DEBUG_BREAK();\n    }\n\n    slot.m_hHandle = hProc;\n    slot.m_pProc = pProc;\n    slot.m_pFile = NULL;\n    s_nHandles++;\n\n    LockRelease();\n\n    return TRUE;\n}\n\nFileInfo * OpenFiles::RecallFile(HANDLE hFile)\n{\n    LockAcquire();\n\n    OpenFiles::SLOT& slot = HashToSlot(hFile);\n\n    if (slot.m_hHandle == hFile) {\n        LockRelease();\n        return slot.m_pFile;\n    }\n    LockRelease();\n    return NULL;\n}\n\nProcInfo * OpenFiles::RecallProc(HANDLE hProc)\n{\n    LockAcquire();\n\n    OpenFiles::SLOT& slot = HashToSlot(hProc);\n\n    if (slot.m_hHandle == hProc) {\n        LockRelease();\n        return slot.m_pProc;\n    }\n    LockRelease();\n    return NULL;\n}\n\n///////////////////////////////////////////////////////////////////// VPrintf.\n//\n// Completely side-effect free printf replacement (but no FP numbers).\n//\nstatic PCHAR do_base(PCHAR pszOut, UINT64 nValue, UINT nBase, PCSTR pszDigits)\n{\n    CHAR szTmp[96];\n    int nDigit = sizeof(szTmp)-2;\n    for (; nDigit >= 0; nDigit--) {\n        szTmp[nDigit] = pszDigits[nValue % nBase];\n        nValue /= nBase;\n    }\n    for (nDigit = 0; nDigit < sizeof(szTmp) - 2 && szTmp[nDigit] == '0'; nDigit++) {\n        // skip leading zeros.\n    }\n    for (; nDigit < sizeof(szTmp) - 1; nDigit++) {\n        *pszOut++ = szTmp[nDigit];\n    }\n    *pszOut = '\\0';\n    return pszOut;\n}\n\nstatic PCHAR do_str(PCHAR pszOut, PCHAR pszEnd, PCSTR pszIn)\n{\n    while (*pszIn && pszOut < pszEnd) {\n        *pszOut++ = *pszIn++;\n    }\n    *pszOut = '\\0';\n    return pszOut;\n}\n\nstatic PCHAR do_wstr(PCHAR pszOut, PCHAR pszEnd, PCWSTR pszIn)\n{\n    while (*pszIn && pszOut < pszEnd) {\n        *pszOut++ = (CHAR)*pszIn++;\n    }\n    *pszOut = '\\0';\n    return pszOut;\n}\n\nstatic PCHAR do_estr(PCHAR pszOut, PCHAR pszEnd, PCSTR pszIn)\n{\n    while (*pszIn && pszOut < pszEnd) {\n        if (*pszIn == '<') {\n            if (pszOut + 4 > pszEnd) {\n                break;\n            }\n            pszIn++;\n            *pszOut++ = '&';\n            *pszOut++ = 'l';\n            *pszOut++ = 't';\n            *pszOut++ = ';';\n        }\n        else if (*pszIn == '>') {\n            if (pszOut + 4 > pszEnd) {\n                break;\n            }\n            pszIn++;\n            *pszOut++ = '&';\n            *pszOut++ = 'g';\n            *pszOut++ = 't';\n            *pszOut++ = ';';\n        }\n        else if (*pszIn == '&') {\n            if (pszOut + 5 > pszEnd) {\n                break;\n            }\n            pszIn++;\n            *pszOut++ = '&';\n            *pszOut++ = 'a';\n            *pszOut++ = 'm';\n            *pszOut++ = 'p';\n            *pszOut++ = ';';\n        }\n        else if (*pszIn == '\\\"') {\n            if (pszOut + 6 > pszEnd) {\n                break;\n            }\n            pszIn++;\n            *pszOut++ = '&';\n            *pszOut++ = 'q';\n            *pszOut++ = 'u';\n            *pszOut++ = 'o';\n            *pszOut++ = 't';\n            *pszOut++ = ';';\n        }\n        else if (*pszIn == '\\'') {\n            if (pszOut + 6 > pszEnd) {\n                break;\n            }\n            pszIn++;\n            *pszOut++ = '&';\n            *pszOut++ = 'a';\n            *pszOut++ = 'p';\n            *pszOut++ = 'o';\n            *pszOut++ = 's';\n            *pszOut++ = ';';\n        }\n        else if (*pszIn  < ' ') {\n            BYTE c = (BYTE)(*pszIn++);\n            if (c < 10 && pszOut + 4 <= pszEnd) {\n                *pszOut++ = '&';\n                *pszOut++ = '#';\n                *pszOut++ = '0' + (c % 10);\n                *pszOut++ = ';';\n            }\n            else if (c < 100 && pszOut + 5 <= pszEnd) {\n                *pszOut++ = '&';\n                *pszOut++ = '#';\n                *pszOut++ = '0' + ((c / 10) % 10);\n                *pszOut++ = '0' + (c % 10);\n                *pszOut++ = ';';\n            }\n            else if (c < 1000 && pszOut + 6 <= pszEnd) {\n                *pszOut++ = '&';\n                *pszOut++ = '#';\n                *pszOut++ = '0' + ((c / 100) % 10);\n                *pszOut++ = '0' + ((c / 10) % 10);\n                *pszOut++ = '0' + (c % 10);\n                *pszOut++ = ';';\n            }\n            else {\n                break;\n            }\n        }\n        else {\n            *pszOut++ = *pszIn++;\n        }\n    }\n    *pszOut = '\\0';\n    return pszOut;\n}\n\nstatic PCHAR do_ewstr(PCHAR pszOut, PCHAR pszEnd, PCWSTR pszIn)\n{\n    while (*pszIn && pszOut < pszEnd) {\n        if (*pszIn == '<') {\n            if (pszOut + 4 > pszEnd) {\n                break;\n            }\n            pszIn++;\n            *pszOut++ = '&';\n            *pszOut++ = 'l';\n            *pszOut++ = 't';\n            *pszOut++ = ';';\n        }\n        else if (*pszIn == '>') {\n            if (pszOut + 4 > pszEnd) {\n                break;\n            }\n            pszIn++;\n            *pszOut++ = '&';\n            *pszOut++ = 'g';\n            *pszOut++ = 't';\n            *pszOut++ = ';';\n        }\n        else if (*pszIn == '&') {\n            if (pszOut + 5 > pszEnd) {\n                break;\n            }\n            pszIn++;\n            *pszOut++ = '&';\n            *pszOut++ = 'a';\n            *pszOut++ = 'm';\n            *pszOut++ = 'p';\n            *pszOut++ = ';';\n        }\n        else if (*pszIn == '\\\"') {\n            if (pszOut + 6 > pszEnd) {\n                break;\n            }\n            pszIn++;\n            *pszOut++ = '&';\n            *pszOut++ = 'q';\n            *pszOut++ = 'u';\n            *pszOut++ = 'o';\n            *pszOut++ = 't';\n            *pszOut++ = ';';\n        }\n        else if (*pszIn == '\\'') {\n            if (pszOut + 6 > pszEnd) {\n                break;\n            }\n            pszIn++;\n            *pszOut++ = '&';\n            *pszOut++ = 'a';\n            *pszOut++ = 'p';\n            *pszOut++ = 'o';\n            *pszOut++ = 's';\n            *pszOut++ = ';';\n        }\n        else if (*pszIn  < ' ' || *pszIn > 127) {\n            WCHAR c = *pszIn++;\n            if (c < 10 && pszOut + 4 <= pszEnd) {\n                *pszOut++ = '&';\n                *pszOut++ = '#';\n                *pszOut++ = '0' + (CHAR)(c % 10);\n                *pszOut++ = ';';\n            }\n            else if (c < 100 && pszOut + 5 <= pszEnd) {\n                *pszOut++ = '&';\n                *pszOut++ = '#';\n                *pszOut++ = '0' + (CHAR)((c / 10) % 10);\n                *pszOut++ = '0' + (CHAR)(c % 10);\n                *pszOut++ = ';';\n            }\n            else if (c < 1000 && pszOut + 6 <= pszEnd) {\n                *pszOut++ = '&';\n                *pszOut++ = '#';\n                *pszOut++ = '0' + (CHAR)((c / 100) % 10);\n                *pszOut++ = '0' + (CHAR)((c / 10) % 10);\n                *pszOut++ = '0' + (CHAR)(c % 10);\n                *pszOut++ = ';';\n            }\n            else {\n                break;\n            }\n        }\n        else {\n            *pszOut++ = (CHAR)*pszIn++;\n        }\n    }\n    *pszOut = '\\0';\n    return pszOut;\n}\n\n#if _MSC_VER >= 1900\n#pragma warning(push)\n#pragma warning(disable:4456) // declaration hides previous local declaration\n#endif\n\nVOID VSafePrintf(PCSTR pszMsg, va_list args, PCHAR pszBuffer, LONG cbBuffer)\n{\n    PCHAR pszOut = pszBuffer;\n    PCHAR pszEnd = pszBuffer + cbBuffer - 1;\n    pszBuffer[0] = '\\0';\n\n    __try {\n        while (*pszMsg && pszOut < pszEnd) {\n            if (*pszMsg == '%') {\n                CHAR szHead[4] = \"\";\n                INT nLen;\n                INT nWidth = 0;\n                INT nPrecision = 0;\n                BOOL fLeft = FALSE;\n                BOOL fPositive = FALSE;\n                BOOL fPound = FALSE;\n                BOOL fBlank = FALSE;\n                BOOL fZero = FALSE;\n                BOOL fDigit = FALSE;\n                BOOL fSmall = FALSE;\n                BOOL fLarge = FALSE;\n                BOOL f64Bit = FALSE;\n                PCSTR pszArg = pszMsg;\n\n                pszMsg++;\n\n                for (; (*pszMsg == '-' ||\n                        *pszMsg == '+' ||\n                        *pszMsg == '#' ||\n                        *pszMsg == ' ' ||\n                        *pszMsg == '0'); pszMsg++) {\n                    switch (*pszMsg) {\n                      case '-': fLeft = TRUE; break;\n                      case '+': fPositive = TRUE; break;\n                      case '#': fPound = TRUE; break;\n                      case ' ': fBlank = TRUE; break;\n                      case '0': fZero = TRUE; break;\n                    }\n                }\n\n                if (*pszMsg == '*') {\n                    nWidth = va_arg(args, INT);\n                    pszMsg++;\n                }\n                else {\n                    while (*pszMsg >= '0' && *pszMsg <= '9') {\n                        nWidth = nWidth * 10 + (*pszMsg++ - '0');\n                    }\n                }\n                if (*pszMsg == '.') {\n                    pszMsg++;\n                    fDigit = TRUE;\n                    if (*pszMsg == '*') {\n                        nPrecision = va_arg(args, INT);\n                        pszMsg++;\n                    }\n                    else {\n                        while (*pszMsg >= '0' && *pszMsg <= '9') {\n                            nPrecision = nPrecision * 10 + (*pszMsg++ - '0');\n                        }\n                    }\n                }\n\n                if (*pszMsg == 'h') {\n                    fSmall = TRUE;\n                    pszMsg++;\n                }\n                else if (*pszMsg == 'l') {\n                    fLarge = TRUE;\n                    pszMsg++;\n                }\n                else if (*pszMsg == 'I' && pszMsg[1] == '6' && pszMsg[2] == '4') {\n                    f64Bit = TRUE;\n                    pszMsg += 3;\n                }\n\n                if (*pszMsg == 's' || *pszMsg == 'e' || *pszMsg == 'c') {\n                    // We ignore the length, precision, and alignment\n                    // to avoid using a temporary buffer.\n\n                    if (*pszMsg == 's') { // [GalenH] need to not use temp.\n                        PVOID pvData = va_arg(args, PVOID);\n\n                        pszMsg++;\n\n                        if (fSmall) {\n                            fLarge = FALSE;\n                        }\n\n                        __try {\n                            if (pvData == NULL) {\n                                pszOut = do_str(pszOut, pszEnd, \"-NULL-\");\n                            }\n                            else if (fLarge) {\n                                pszOut = do_wstr(pszOut, pszEnd, (PWCHAR)pvData);\n                            }\n                            else {\n                                pszOut = do_str(pszOut, pszEnd, (PCHAR)pvData);\n                            }\n                        } __except(EXCEPTION_EXECUTE_HANDLER) {\n                            pszOut = do_str(pszOut, pszEnd, \"-\");\n                            pszOut = do_base(pszOut, (UINT64)pvData, 16,\n                                             \"0123456789ABCDEF\");\n                            pszOut = do_str(pszOut, pszEnd, \"-\");\n                        }\n                    }\n                    else if (*pszMsg == 'e')    {   // Escape the string.\n                        PVOID pvData = va_arg(args, PVOID);\n\n                        pszMsg++;\n\n                        if (fSmall) {\n                            fLarge = FALSE;\n                        }\n\n                        __try {\n                            if (pvData == NULL) {\n                                pszOut = do_str(pszOut, pszEnd, \"-NULL-\");\n                            }\n                            else if (fLarge) {\n                                pszOut = do_ewstr(pszOut, pszEnd, (PWCHAR)pvData);\n                            }\n                            else {\n                                pszOut = do_estr(pszOut, pszEnd, (PCHAR)pvData);\n                            }\n                        } __except(EXCEPTION_EXECUTE_HANDLER) {\n                            pszOut = do_str(pszOut, pszEnd, \"-\");\n                            pszOut = do_base(pszOut, (UINT64)pvData, 16,\n                                             \"0123456789ABCDEF\");\n                            pszOut = do_str(pszOut, pszEnd, \"-\");\n                        }\n                    }\n                    else {\n                        CHAR szTemp[2];\n                        pszMsg++;\n\n                        szTemp[0] = (CHAR)va_arg(args, INT);\n                        szTemp[1] = '\\0';\n                        pszOut = do_str(pszOut, pszEnd, szTemp);\n                    }\n                }\n                else if (*pszMsg == 'd' || *pszMsg == 'i' || *pszMsg == 'o' ||\n                         *pszMsg == 'x' || *pszMsg == 'X' || *pszMsg == 'b' ||\n                         *pszMsg == 'u') {\n                    CHAR szTemp[128];\n                    UINT64 value;\n                    if (f64Bit) {\n                        value = va_arg(args, UINT64);\n                    }\n                    else {\n                        value = va_arg(args, UINT);\n                    }\n\n                    if (*pszMsg == 'x') {\n                        pszMsg++;\n                        nLen = (int)(do_base(szTemp, value, 16, \"0123456789abcdef\") - szTemp);\n                        if (fPound && value) {\n                            do_str(szHead, szHead + sizeof(szHead) - 1, \"0x\");\n                        }\n                    }\n                    else if (*pszMsg == 'X') {\n                        pszMsg++;\n                        nLen = (int)(do_base(szTemp, value, 16, \"0123456789ABCDEF\") - szTemp);\n                        if (fPound && value) {\n                            do_str(szHead, szHead + sizeof(szHead) - 1, \"0X\");\n                        }\n                    }\n                    else if (*pszMsg == 'd') {\n                        pszMsg++;\n                        if ((INT64)value < 0) {\n                            value = -(INT64)value;\n                            do_str(szHead, szHead + sizeof(szHead) - 1, \"-\");\n                        }\n                        else if (fPositive) {\n                            if (value > 0) {\n                                do_str(szHead, szHead + sizeof(szHead) - 1, \"+\");\n                            }\n                        }\n                        else if (fBlank) {\n                            if (value > 0) {\n                                do_str(szHead, szHead + sizeof(szHead) - 1, \" \");\n                            }\n                        }\n                        nLen = (int)(do_base(szTemp, value, 10, \"0123456789\") - szTemp);\n                        nPrecision = 0;\n                    }\n                    else if (*pszMsg == 'u') {\n                        pszMsg++;\n                        nLen = (int)(do_base(szTemp, value, 10, \"0123456789\") - szTemp);\n                        nPrecision = 0;\n                    }\n                    else if (*pszMsg == 'o') {\n                        pszMsg++;\n                        nLen = (int)(do_base(szTemp, value, 8, \"01234567\") - szTemp);\n                        nPrecision = 0;\n\n                        if (fPound && value) {\n                            do_str(szHead, szHead + sizeof(szHead) - 1, \"0\");\n                        }\n                    }\n                    else if (*pszMsg == 'b') {\n                        pszMsg++;\n                        nLen = (int)(do_base(szTemp, value, 2, \"01\") - szTemp);\n                        nPrecision = 0;\n\n                        if (fPound && value) {\n                            do_str(szHead, szHead + sizeof(szHead) - 1, \"0b\");\n                        }\n                    }\n                    else {\n                        pszMsg++;\n                        if ((INT64)value < 0) {\n                            value = -(INT64)value;\n                            do_str(szHead, szHead + sizeof(szHead) - 1, \"-\");\n                        }\n                        else if (fPositive) {\n                            if (value > 0) {\n                                do_str(szHead, szHead + sizeof(szHead) - 1, \"+\");\n                            }\n                        }\n                        else if (fBlank) {\n                            if (value > 0) {\n                                do_str(szHead, szHead + sizeof(szHead) - 1, \" \");\n                            }\n                        }\n                        nLen = (int)(do_base(szTemp, value, 10, \"0123456789\") - szTemp);\n                        nPrecision = 0;\n                    }\n\n                    INT nHead = 0;\n                    for (; szHead[nHead]; nHead++) {\n                        // Count characters in head string.\n                    }\n\n                    if (fLeft) {\n                        if (nHead) {\n                            pszOut = do_str(pszOut, pszEnd, szHead);\n                            nLen += nHead;\n                        }\n                        pszOut = do_str(pszOut, pszEnd, szTemp);\n                        for (; nLen < nWidth && pszOut < pszEnd; nLen++) {\n                            *pszOut++ = ' ';\n                        }\n                    }\n                    else if (fZero) {\n                        if (nHead) {\n                            pszOut = do_str(pszOut, pszEnd, szHead);\n                            nLen += nHead;\n                        }\n                        for (; nLen < nWidth && pszOut < pszEnd; nLen++) {\n                            *pszOut++ = '0';\n                        }\n                        pszOut = do_str(pszOut, pszEnd, szTemp);\n                    }\n                    else {\n                        if (nHead) {\n                            nLen += nHead;\n                        }\n                        for (; nLen < nWidth && pszOut < pszEnd; nLen++) {\n                            *pszOut++ = ' ';\n                        }\n                        if (nHead) {\n                            pszOut = do_str(pszOut, pszEnd, szHead);\n                        }\n                        pszOut = do_str(pszOut, pszEnd, szTemp);\n                    }\n                }\n                else if (*pszMsg == 'p') {\n                    CHAR szTemp[64];\n                    ULONG_PTR value;\n                    value = va_arg(args, ULONG_PTR);\n\n                    if (*pszMsg == 'p') {\n                        pszMsg++;\n                        nLen = (int)(do_base(szTemp, (UINT64)value, 16, \"0123456789abcdef\") - szTemp);\n                        if (fPound && value) {\n                            do_str(szHead, szHead + sizeof(szHead) - 1, \"0x\");\n                        }\n                    }\n                    else {\n                        pszMsg++;\n                        nLen = (int)(do_base(szTemp, (UINT64)value, 16, \"0123456789ABCDEF\") - szTemp);\n                        if (fPound && value) {\n                            do_str(szHead, szHead + sizeof(szHead) - 1, \"0x\");\n                        }\n                    }\n\n                    INT nHead = 0;\n                    for (; szHead[nHead]; nHead++) {\n                        // Count characters in head string.\n                    }\n\n                    if (nHead) {\n                        pszOut = do_str(pszOut, pszEnd, szHead);\n                        nLen += nHead;\n                    }\n                    for (; nLen < nWidth && pszOut < pszEnd; nLen++) {\n                        *pszOut++ = '0';\n                    }\n                    pszOut = do_str(pszOut, pszEnd, szTemp);\n                }\n                else {\n                    pszMsg++;\n                    while (pszArg < pszMsg && pszOut < pszEnd) {\n                        *pszOut++ = *pszArg++;\n                    }\n                }\n            }\n            else {\n                if (pszOut < pszEnd) {\n                    *pszOut++ = *pszMsg++;\n                }\n            }\n        }\n        *pszOut = '\\0';\n        pszBuffer[cbBuffer - 1] = '\\0';\n    } __except(EXCEPTION_EXECUTE_HANDLER) {\n        PCHAR pszOut = pszBuffer;\n        *pszOut = '\\0';\n        pszOut = do_str(pszOut, pszEnd, \"-exception:\");\n        pszOut = do_base(pszOut, (UINT64)GetExceptionCode(), 10, \"0123456789\");\n        pszOut = do_str(pszOut, pszEnd, \"-\");\n    }\n}\n\n#if _MSC_VER >= 1900\n#pragma warning(pop)\n#endif\n\nPCHAR SafePrintf(PCHAR pszBuffer, LONG cbBuffer, PCSTR pszMsg, ...)\n{\n    va_list args;\n    va_start(args, pszMsg);\n    VSafePrintf(pszMsg, args, pszBuffer, cbBuffer);\n    va_end(args);\n\n    while (*pszBuffer) {\n        pszBuffer++;\n    }\n    return pszBuffer;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nBOOL TblogOpen()\n{\n    EnterCriticalSection(&s_csPipe);\n\n    WCHAR wzPipe[256];\n    StringCchPrintfW(wzPipe, ARRAYSIZE(wzPipe), L\"%ls.%d\", TBLOG_PIPE_NAMEW, s_nTraceProcessId);\n\n    for (int retries = 0; retries < 10; retries++) {\n        WaitNamedPipeW(wzPipe, 10000); // Wait up to 10 seconds for a pipe to appear.\n\n        s_hPipe = Real_CreateFileW(wzPipe, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);\n        if (s_hPipe != INVALID_HANDLE_VALUE) {\n            DWORD dwMode = PIPE_READMODE_MESSAGE;\n            if (SetNamedPipeHandleState(s_hPipe, &dwMode, NULL, NULL)) {\n                LeaveCriticalSection(&s_csPipe);\n                return TRUE;\n            }\n        }\n    }\n\n    LeaveCriticalSection(&s_csPipe);\n\n    // Couldn't open pipe.\n    DEBUG_BREAK();\n    Real_ExitProcess(9990);\n    return FALSE;\n}\n\nVOID TblogV(PCSTR pszMsgf, va_list args)\n{\n    if (s_hPipe == INVALID_HANDLE_VALUE) {\n        return;\n    }\n\n    EnterCriticalSection(&s_csPipe);\n\n    DWORD cbWritten = 0;\n\n    PCHAR pszBuf = s_rMessage.szMessage;\n    VSafePrintf(pszMsgf, args,\n                pszBuf, (int)(s_rMessage.szMessage + sizeof(s_rMessage.szMessage) - pszBuf));\n\n    PCHAR pszEnd = s_rMessage.szMessage;\n    for (; *pszEnd; pszEnd++) {\n        // no internal contents.\n    }\n    s_rMessage.nBytes = (DWORD)(pszEnd - ((PCSTR)&s_rMessage));\n\n    // If the write fails, then we abort\n    if (s_hPipe != INVALID_HANDLE_VALUE) {\n        if (!Real_WriteFile(s_hPipe, &s_rMessage, s_rMessage.nBytes, &cbWritten, NULL)) {\n            Real_ExitProcess(9991);\n        }\n    }\n\n    LeaveCriticalSection(&s_csPipe);\n}\n\nVOID Tblog(PCSTR pszMsgf, ...)\n{\n    if (s_hPipe == INVALID_HANDLE_VALUE) {\n        return;\n    }\n\n    va_list args;\n    va_start(args, pszMsgf);\n    TblogV(pszMsgf, args);\n    va_end(args);\n}\n\nVOID TblogClose()\n{\n    EnterCriticalSection(&s_csPipe);\n\n    if (s_hPipe != INVALID_HANDLE_VALUE) {\n        DWORD cbWritten = 0;\n\n        s_rMessage.nBytes = 0;\n\n        Real_WriteFile(s_hPipe, &s_rMessage, 4, &cbWritten, NULL);\n        FlushFileBuffers(s_hPipe);\n        Real_CloseHandle(s_hPipe);\n        s_hPipe = INVALID_HANDLE_VALUE;\n    }\n\n    LeaveCriticalSection(&s_csPipe);\n}\n\n/////////////////////////////////////////////////////////////\n// Detours\n//\nstatic BOOL IsInherited(HANDLE hHandle)\n{\n    DWORD dwFlags;\n\n    if (GetHandleInformation(hHandle, &dwFlags)) {\n        return (dwFlags & HANDLE_FLAG_INHERIT) ? TRUE : FALSE;\n    }\n    return FALSE;\n}\n\nstatic void SaveStdHandleName(HANDLE hFile, PWCHAR pwzBuffer, BOOL *fAppend)\n{\n    pwzBuffer[0] = '\\0';\n\n    if ((hFile != INVALID_HANDLE_VALUE) && IsInherited(hFile)) {\n        FileInfo * pInfo = OpenFiles::RecallFile(hFile);\n        if (pInfo) {\n            Copy(pwzBuffer, pInfo->m_pwzPath);\n            if (pInfo->m_fAppend && fAppend != NULL) {\n                *fAppend = TRUE;\n            }\n        }\n    }\n}\n\nstatic void LoadStdHandleName(DWORD id, PCWSTR pwzBuffer, BOOL fAppend)\n{\n    HANDLE hFile = GetStdHandle(id);\n\n    if ((hFile != INVALID_HANDLE_VALUE) && pwzBuffer[0] != '\\0') {\n        FileInfo *pInfo = FileNames::FindPartial(pwzBuffer);\n        if (fAppend) {\n            pInfo->m_fAppend = TRUE;\n        }\n        OpenFiles::Remember(hFile, pInfo);\n    }\n}\n\nBOOL CreateProcessInternals(HANDLE hProcess, DWORD nProcessId, PCHAR pszId,\n                            HANDLE hStdin, HANDLE hStdout, HANDLE hStderr)\n{\n    EnterCriticalSection(&s_csChildPayload);\n\n    ProcInfo *proc = Procs::Create(hProcess, nProcessId);\n    OpenFiles::Remember(hProcess, proc);\n\n    ZeroMemory(&s_ChildPayload, sizeof(s_ChildPayload));\n    CopyMemory(&s_ChildPayload, &s_Payload, sizeof(s_ChildPayload));\n\n    s_ChildPayload.nParentProcessId = GetCurrentProcessId();\n    s_ChildPayload.rGeneology[s_ChildPayload.nGeneology]\n        = (DWORD)InterlockedIncrement(&s_nChildCnt);\n    s_ChildPayload.nGeneology++;\n\n    SaveStdHandleName(hStdin, s_ChildPayload.wzStdin, NULL);\n    SaveStdHandleName(hStdout, s_ChildPayload.wzStdout, &s_ChildPayload.fStdoutAppend);\n    SaveStdHandleName(hStderr, s_ChildPayload.wzStderr, &s_ChildPayload.fStderrAppend);\n\n    DetourCopyPayloadToProcess(hProcess, s_guidTrace, &s_ChildPayload, sizeof(s_ChildPayload));\n\n    for (DWORD i = 0; i < s_ChildPayload.nGeneology; i++) {\n        pszId = SafePrintf(pszId, 16, \"%d.\", s_ChildPayload.rGeneology[i]);\n    }\n    *pszId = '\\0';\n\n    LeaveCriticalSection(&s_csChildPayload);\n\n    return TRUE;\n}\n\nBOOL WINAPI Mine_CreateProcessW(LPCWSTR lpApplicationName,\n                                LPWSTR lpCommandLine,\n                                LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                BOOL bInheritHandles,\n                                DWORD dwCreationFlags,\n                                LPVOID lpEnvironment,\n                                LPCWSTR lpCurrentDirectory,\n                                LPSTARTUPINFOW lpStartupInfo,\n                                LPPROCESS_INFORMATION lpProcessInformation)\n{\n    EnterFunc();\n\n    if (lpCommandLine == NULL) {\n        lpCommandLine = (LPWSTR)lpApplicationName;\n    }\n\n    CHAR szProc[MAX_PATH];\n    BOOL rv = 0;\n    __try {\n        LPPROCESS_INFORMATION ppi = lpProcessInformation;\n        PROCESS_INFORMATION pi;\n        if (ppi == NULL) {\n            ppi = &pi;\n        }\n\n        rv = DetourCreateProcessWithDllExW(lpApplicationName,\n                                           lpCommandLine,\n                                           lpProcessAttributes,\n                                           lpThreadAttributes,\n                                           bInheritHandles,\n                                           dwCreationFlags | CREATE_SUSPENDED,\n                                           lpEnvironment,\n                                           lpCurrentDirectory,\n                                           lpStartupInfo,\n                                           ppi,\n                                           s_szDllPath,\n                                           Real_CreateProcessW);\n\n        if (rv) {\n            HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);\n            HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);\n            HANDLE hStderr = GetStdHandle(STD_ERROR_HANDLE);\n\n            if (lpStartupInfo != NULL && (lpStartupInfo->dwFlags & STARTF_USESTDHANDLES) != 0) {\n                hStdin = lpStartupInfo->hStdInput;\n                hStdout = lpStartupInfo->hStdOutput;\n                hStderr = lpStartupInfo->hStdError;\n            }\n            CreateProcessInternals(ppi->hProcess, ppi->dwProcessId,\n                                   szProc, hStdin, hStdout, hStderr);\n\n            Print(\"<t:Child id=\\\"::%hs::\\\">\\n\", szProc);\n\n            WCHAR wzPath[MAX_PATH];\n            FileInfo *pInfo = NULL;\n            if (lpApplicationName == NULL) {\n                PWCHAR pwzDst = wzPath;\n                PWCHAR pwzSrc = lpCommandLine;\n\n                if (*pwzSrc == '\\\"') {\n                    WCHAR cQuote = *pwzSrc++;\n\n                    while (*pwzSrc && *pwzSrc != cQuote) {\n                        *pwzDst++ = *pwzSrc++;\n                    }\n                    *pwzDst++ = '\\0';\n                }\n                else {\n                    while (*pwzSrc && *pwzSrc != ' ' && *pwzSrc != '\\t') {\n                        if (*pwzSrc == '\\t') {\n                            *pwzSrc = ' ';\n                        }\n                        *pwzDst++ = *pwzSrc++;\n                    }\n                    *pwzDst++ = '\\0';\n                }\n                pInfo = FileNames::FindPartial(wzPath);\n            }\n            else {\n                pInfo = FileNames::FindPartial(lpApplicationName);\n            }\n\n            Print(\"<t:Executable>%ls</t:Executable>\\n\",\n                  FileNames::ParameterizeName(wzPath, ARRAYSIZE(wzPath), pInfo));\n            Print(\"<t:Line>%le</t:Line>\\n\", lpCommandLine);\n            Print(\"</t:Child>\\n\");\n\n            if (pInfo) {\n                pInfo->m_fAbsorbed = true;\n            }\n\n            if (!(dwCreationFlags & CREATE_SUSPENDED)) {\n                ResumeThread(ppi->hThread);\n            }\n\n            if (ppi == &pi) {\n                Real_CloseHandle(ppi->hThread);\n                Real_CloseHandle(ppi->hProcess);\n            }\n        }\n    } __finally {\n        ExitFunc();\n        if (!rv) {\n            Print(\"<!-- Warning: CreateProcessW failed %d: %ls; %ls -->\\n\",\n                  GetLastError(), lpApplicationName, lpCommandLine);\n        }\n    }\n    return rv;\n}\n\nBOOL WINAPI Mine_CreateProcessA(LPCSTR lpApplicationName,\n                                LPSTR lpCommandLine,\n                                LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                BOOL bInheritHandles,\n                                DWORD dwCreationFlags,\n                                LPVOID lpEnvironment,\n                                LPCSTR lpCurrentDirectory,\n                                LPSTARTUPINFOA lpStartupInfo,\n                                LPPROCESS_INFORMATION lpProcessInformation)\n{\n    EnterFunc();\n\n    if (lpCommandLine == NULL) {\n        lpCommandLine = (LPSTR)lpApplicationName;\n    }\n\n    CHAR szProc[MAX_PATH];\n    BOOL rv = 0;\n    __try {\n        LPPROCESS_INFORMATION ppi = lpProcessInformation;\n        PROCESS_INFORMATION pi;\n        if (ppi == NULL) {\n            ppi = &pi;\n        }\n\n        rv = DetourCreateProcessWithDllExA(lpApplicationName,\n                                           lpCommandLine,\n                                           lpProcessAttributes,\n                                           lpThreadAttributes,\n                                           bInheritHandles,\n                                           dwCreationFlags | CREATE_SUSPENDED,\n                                           lpEnvironment,\n                                           lpCurrentDirectory,\n                                           lpStartupInfo,\n                                           ppi,\n                                           s_szDllPath,\n                                           Real_CreateProcessA);\n\n        if (rv) {\n            HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);\n            HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);\n            HANDLE hStderr = GetStdHandle(STD_ERROR_HANDLE);\n\n            if (lpStartupInfo != NULL && (lpStartupInfo->dwFlags & STARTF_USESTDHANDLES) != 0) {\n                hStdin = lpStartupInfo->hStdInput;\n                hStdout = lpStartupInfo->hStdOutput;\n                hStderr = lpStartupInfo->hStdError;\n            }\n            CreateProcessInternals(ppi->hProcess, ppi->dwProcessId,\n                                   szProc, hStdin, hStdout, hStderr);\n\n            Print(\"<t:Child id=\\\"::%hs::\\\">\\n\", szProc);\n\n            WCHAR wzPath[MAX_PATH];\n            FileInfo *pInfo = NULL;\n            if (lpApplicationName == NULL) {\n                PCHAR pszDst = szProc;\n                PCHAR pszSrc = lpCommandLine;\n\n                if (*pszSrc == '\\\"') {\n                    CHAR cQuote = *pszSrc++;\n\n                    while (*pszSrc && *pszSrc != cQuote) {\n                        *pszDst++ = *pszSrc++;\n                    }\n                    *pszDst++ = '\\0';\n                }\n                else {\n                    while (*pszSrc && *pszSrc != ' ' && *pszSrc != '\\t') {\n                        if (*pszSrc == '\\t') {\n                            *pszSrc = ' ';\n                        }\n                        *pszDst++ = *pszSrc++;\n                    }\n                    *pszDst++ = '\\0';\n                }\n                pInfo = FileNames::FindPartial(szProc);\n            }\n            else {\n                pInfo = FileNames::FindPartial(lpApplicationName);\n            }\n\n            Print(\"<t:Executable>%ls</t:Executable>\\n\",\n                  FileNames::ParameterizeName(wzPath, ARRAYSIZE(wzPath), pInfo));\n            Print(\"<t:Line>%he</t:Line>\\n\", lpCommandLine);\n            Print(\"</t:Child>\\n\");\n\n            if (pInfo) {\n                pInfo->m_fAbsorbed = true;\n            }\n\n            if (!(dwCreationFlags & CREATE_SUSPENDED)) {\n                ResumeThread(ppi->hThread);\n            }\n            if (ppi == &pi) {\n                Real_CloseHandle(ppi->hThread);\n                Real_CloseHandle(ppi->hProcess);\n            }\n        }\n    } __finally {\n        ExitFunc();\n        if (!rv) {\n            Print(\"<!-- Warning: CreateProcessA failed %d: %hs; %hs -->\\n\",\n                  GetLastError(), lpApplicationName, lpCommandLine);\n        }\n    }\n    return rv;\n}\n\n//\n//////////////////////////////////////////////////////////////////////////////\n\nBOOL WINAPI Mine_CopyFileExA(LPCSTR a0,\n                             LPCSTR a1,\n                             LPPROGRESS_ROUTINE a2,\n                             LPVOID a3,\n                             LPBOOL a4,\n                             DWORD a5)\n{\n    EnterFunc();\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CopyFileExA(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        ExitFunc();\n        if (rv) {\n#if 0\n            Print(\"<!-- CopyFileExA %he to %he -->\\n\", a0, a1);\n#endif\n            NoteRead(a0);\n            NoteWrite(a1);\n        }\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_CopyFileExW(LPCWSTR a0,\n                             LPCWSTR a1,\n                             LPPROGRESS_ROUTINE a2,\n                             LPVOID a3,\n                             LPBOOL a4,\n                             DWORD a5)\n{\n    EnterFunc();\n\n    BOOL rv = 0;\n    __try {\n#if 0\n        Print(\"\\n\");\n        Print(\"<!-- CopyFileExW %le to %le before -->\\n\", a0, a1);\n#endif\n        rv = Real_CopyFileExW(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        ExitFunc();\n        if (rv) {\n#if 0\n            Print(\"<!-- CopyFileExW %le to %le -->\\n\", a0, a1);\n#endif\n            NoteRead(a0);\n            NoteWrite(a1);\n        }\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_PrivCopyFileExW(LPCWSTR a0,\n                                 LPCWSTR a1,\n                                 LPPROGRESS_ROUTINE a2,\n                                 LPVOID a3,\n                                 LPBOOL a4,\n                                 DWORD a5)\n{\n    EnterFunc();\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PrivCopyFileExW(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        ExitFunc();\n        if (rv) {\n#if 0\n            Print(\"<!-- PrivCopyFileExW %le to %le -->\\n\", a0, a1);\n#endif\n            NoteRead(a0);\n            NoteWrite(a1);\n        }\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_CreateHardLinkA(LPCSTR a0,\n                                 LPCSTR a1,\n                                 LPSECURITY_ATTRIBUTES a2)\n{\n    EnterFunc();\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CreateHardLinkA(a0, a1, a2);\n    } __finally {\n        ExitFunc();\n        if (rv) {\n#if 0\n            Print(\"<!-- CreateHardLinkA %he to %he -->\\n\", a0, a1);\n#endif\n            NoteRead(a1);\n            NoteWrite(a0);\n        }\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_CreateHardLinkW(LPCWSTR a0,\n                                 LPCWSTR a1,\n                                 LPSECURITY_ATTRIBUTES a2)\n{\n    EnterFunc();\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CreateHardLinkW(a0, a1, a2);\n    } __finally {\n        ExitFunc();\n        if (rv) {\n#if 0\n            Print(\"<!-- CreateHardLinkW %le to %le -->\\n\", a0, a1);\n#endif\n            NoteRead(a1);\n            NoteWrite(a0);\n        }\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_CloseHandle(HANDLE a0)\n{\n    /*int nIndent =*/ EnterFunc();\n\n    BOOL rv = 0;\n    __try {\n        ProcInfo * pProc = OpenFiles::RecallProc(a0);\n        if (pProc != NULL) {\n            Procs::Close(pProc->m_hProc);\n        }\n\n        FileInfo * pFile = OpenFiles::RecallFile(a0);\n        if (pFile != NULL) {\n            DWORD dwErr = GetLastError();\n            pFile->m_cbContent = GetFileSize(a0, NULL);\n            if (pFile->m_cbContent == INVALID_FILE_SIZE) {\n                pFile->m_cbContent = 0;\n            }\n\n            if (pFile->m_fCantRead) {\n                if (pFile->m_fRead) {\n#if 0\n                    Print(\"<!-- Warning: Removing read from %le -->\\n\", pFile->m_pwzPath);\n#endif\n                    pFile->m_fRead = FALSE;\n                }\n            }\n\n            // Here we should think about reading the file contents as appropriate.\n            if (pFile->m_fTemporaryPath && pFile->m_fRead && !pFile->m_fAbsorbed &&\n                !pFile->m_fDelete && !pFile->m_fCleanup && !pFile->m_fWrite &&\n                pFile->m_pbContent == NULL &&\n                pFile->m_cbContent < 16384) {\n\n                pFile->m_pbContent = LoadFile(a0, pFile->m_cbContent);\n            }\n\n            SetLastError(dwErr);\n        }\n        rv = Real_CloseHandle(a0);\n    } __finally {\n        ExitFunc();\n        if (rv /* && nIndent == 0*/) {\n            OpenFiles::Forget(a0);\n        }\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_DuplicateHandle(HANDLE hSourceProcessHandle,\n                                 HANDLE hSourceHandle,\n                                 HANDLE hTargetProcessHandle,\n                                 LPHANDLE lpTargetHandle,\n                                 DWORD dwDesiredAccess,\n                                 BOOL bInheritHandle,\n                                 DWORD dwOptions)\n{\n    HANDLE hTemp = INVALID_HANDLE_VALUE;\n    EnterFunc();\n\n    BOOL rv = 0;\n    __try {\n        if (lpTargetHandle == NULL) {\n            lpTargetHandle = &hTemp;\n        }\n        *lpTargetHandle = INVALID_HANDLE_VALUE;\n\n        rv = Real_DuplicateHandle(hSourceProcessHandle,\n                                  hSourceHandle,\n                                  hTargetProcessHandle,\n                                  lpTargetHandle,\n                                  dwDesiredAccess,\n                                  bInheritHandle,\n                                  dwOptions);\n    } __finally {\n        ExitFunc();\n        if (*lpTargetHandle != INVALID_HANDLE_VALUE) {\n            FileInfo *pInfo = OpenFiles::RecallFile(hSourceHandle);\n            if (pInfo) {\n                OpenFiles::Remember(*lpTargetHandle, pInfo);\n            }\n        }\n    };\n    return rv;\n}\n\nstatic LONG s_nPipeCnt = 0;\n\nBOOL WINAPI Mine_CreatePipe(PHANDLE hReadPipe,\n                            PHANDLE hWritePipe,\n                            LPSECURITY_ATTRIBUTES lpPipeAttributes,\n                            DWORD nSize)\n{\n    HANDLE hRead = INVALID_HANDLE_VALUE;\n    HANDLE hWrite = INVALID_HANDLE_VALUE;\n\n    if (hReadPipe == NULL) {\n        hReadPipe = &hRead;\n    }\n    if (hWritePipe == NULL) {\n        hWritePipe = &hWrite;\n    }\n\n    /*int nIndent = */ EnterFunc();\n    BOOL rv = 0;\n    __try {\n        rv = Real_CreatePipe(hReadPipe, hWritePipe, lpPipeAttributes, nSize);\n    } __finally {\n        ExitFunc();\n        if (rv) {\n            CHAR szPipe[128];\n\n            SafePrintf(szPipe, ARRAYSIZE(szPipe), \"\\\\\\\\.\\\\PIPE\\\\Temp.%d.%d\",\n                       GetCurrentProcessId(),\n                       InterlockedIncrement(&s_nPipeCnt));\n\n            FileInfo *pInfo = FileNames::FindPartial(szPipe);\n\n            pInfo->m_fCleanup = TRUE;\n            OpenFiles::Remember(*hReadPipe, pInfo);\n            OpenFiles::Remember(*hWritePipe, pInfo);\n        }\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_CreateDirectoryW(LPCWSTR a0,\n                                  LPSECURITY_ATTRIBUTES a1)\n{\n    /* int nIndent = */ EnterFunc();\n    BOOL rv = 0;\n    __try {\n        rv = Real_CreateDirectoryW(a0, a1);\n    } __finally {\n        ExitFunc();\n        if (rv) {\n            FileInfo *pInfo = FileNames::FindPartial(a0);\n            pInfo->m_fDirectory = TRUE;\n        }\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_CreateDirectoryExW(LPCWSTR a0,\n                                    LPCWSTR a1,\n                                    LPSECURITY_ATTRIBUTES a2)\n{\n    /* int nIndent = */ EnterFunc();\n    BOOL rv = 0;\n    __try {\n        rv = Real_CreateDirectoryExW(a0, a1, a2);\n    } __finally {\n        ExitFunc();\n        if (rv) {\n            FileInfo *pInfo = FileNames::FindPartial(a1);\n            pInfo->m_fDirectory = TRUE;\n        }\n    };\n    return rv;\n}\n\nHANDLE WINAPI Mine_CreateFileW(LPCWSTR a0,\n                               DWORD access,\n                               DWORD share,\n                               LPSECURITY_ATTRIBUTES a3,\n                               DWORD create,\n                               DWORD flags,\n                               HANDLE a6)\n{\n    /* int nIndent = */ EnterFunc();\n    HANDLE rv = 0;\n    __try {\n        rv = Real_CreateFileW(a0, access, share, a3, create, flags, a6);\n    } __finally {\n        ExitFunc();\n#if 0\n            Print(\"<!-- CreateFileW(%le, ac=%08x, cr=%08x, fl=%08x -->\\n\",\n                  a0,\n                  access,\n                  create,\n                  flags);\n#endif\n\n        if (access != 0 && /* nIndent == 0 && */ rv != INVALID_HANDLE_VALUE) {\n\n            FileInfo *pInfo = FileNames::FindPartial(a0);\n\n            // FILE_FLAG_WRITE_THROUGH              0x80000000\n            // FILE_FLAG_OVERLAPPED                 0x40000000\n            // FILE_FLAG_NO_BUFFERING               0x20000000\n            // FILE_FLAG_RANDOM_ACCESS              0x10000000\n            // FILE_FLAG_SEQUENTIAL_SCAN            0x08000000\n            // FILE_FLAG_DELETE_ON_CLOSE            0x04000000\n            // FILE_FLAG_BACKUP_SEMANTICS           0x02000000\n            // FILE_FLAG_POSIX_SEMANTICS            0x01000000\n            // FILE_FLAG_OPEN_REPARSE_POINT         0x00200000\n            // FILE_FLAG_OPEN_NO_RECALL             0x00100000\n            // FILE_FLAG_FIRST_PIPE_INSTANCE        0x00080000\n            // FILE_ATTRIBUTE_ENCRYPTED             0x00004000\n            // FILE_ATTRIBUTE_NOT_CONTENT_INDEXED   0x00002000\n            // FILE_ATTRIBUTE_OFFLINE               0x00001000\n            // FILE_ATTRIBUTE_COMPRESSED            0x00000800\n            // FILE_ATTRIBUTE_REPARSE_POINT         0x00000400\n            // FILE_ATTRIBUTE_SPARSE_FILE           0x00000200\n            // FILE_ATTRIBUTE_TEMPORARY             0x00000100\n            // FILE_ATTRIBUTE_NORMAL                0x00000080\n            // FILE_ATTRIBUTE_DEVICE                0x00000040\n            // FILE_ATTRIBUTE_ARCHIVE               0x00000020\n            // FILE_ATTRIBUTE_DIRECTORY             0x00000010\n            // FILE_ATTRIBUTE_SYSTEM                0x00000004\n            // FILE_ATTRIBUTE_HIDDEN                0x00000002\n            // FILE_ATTRIBUTE_READONLY              0x00000001\n\n            // CREATE_NEW          1\n            // CREATE_ALWAYS       2\n            // OPEN_EXISTING       3\n            // OPEN_ALWAYS         4\n            // TRUNCATE_EXISTING   5\n\n            if (create == CREATE_NEW ||\n                create == CREATE_ALWAYS ||\n                create == TRUNCATE_EXISTING) {\n\n                if (!pInfo->m_fRead) {\n                    pInfo->m_fCantRead = TRUE;\n                }\n            }\n            else if (create == OPEN_EXISTING) {\n            }\n            else if (create == OPEN_ALWAYS) {\n                // pInfo->m_fAppend = TRUE;    // !!!\n            }\n\n            if ((flags & FILE_FLAG_DELETE_ON_CLOSE)) {\n                pInfo->m_fCleanup = TRUE;\n            }\n\n            OpenFiles::Remember(rv, pInfo);\n        }\n    };\n    return rv;\n}\n\nHANDLE WINAPI Mine_CreateFileMappingW(HANDLE hFile,\n                                      LPSECURITY_ATTRIBUTES a1,\n                                      DWORD flProtect,\n                                      DWORD a3,\n                                      DWORD a4,\n                                      LPCWSTR a5)\n{\n    /* int nIndent = */ EnterFunc();\n    HANDLE rv = 0;\n    __try {\n        rv = Real_CreateFileMappingW(hFile, a1, flProtect, a3, a4, a5);\n    } __finally {\n        ExitFunc();\n        if (rv != INVALID_HANDLE_VALUE) {\n\n            FileInfo *pInfo = OpenFiles::RecallFile(hFile);\n\n            if (pInfo != NULL) {\n                switch (flProtect) {\n                  case PAGE_READONLY:\n                    pInfo->m_fRead = TRUE;\n                    break;\n                  case PAGE_READWRITE:\n                    pInfo->m_fRead = TRUE;\n                    pInfo->m_fWrite = TRUE;\n                    break;\n                  case PAGE_WRITECOPY:\n                    pInfo->m_fRead = TRUE;\n                    break;\n                  case PAGE_EXECUTE_READ:\n                    pInfo->m_fRead = TRUE;\n                    break;\n                  case PAGE_EXECUTE_READWRITE:\n                    pInfo->m_fRead = TRUE;\n                    pInfo->m_fWrite = TRUE;\n                    break;\n                }\n            }\n        }\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_DeleteFileW(LPCWSTR a0)\n{\n    EnterFunc();\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DeleteFileW(a0);\n    } __finally {\n        ExitFunc();\n#if 0\n        Print(\"<!-- DeleteFileW(%le -->\\n\", a0);\n#endif\n        NoteDelete(a0);\n    };\n    return rv;\n}\n\nstatic VOID Dump(LPVOID pvData, DWORD cbData)\n{\n    CHAR szBuffer[128];\n    PBYTE pbData = (PBYTE)pvData;\n\n    for (DWORD i = 0; i < cbData; i += 16) {\n        PCHAR psz = szBuffer;\n        psz = SafePrintf(psz, (LONG)(szBuffer + ARRAYSIZE(szBuffer) - psz), \"%4d: \", i);\n\n        for (DWORD j = i; j < i + 16; j++) {\n            if (j < cbData) {\n                psz = SafePrintf(psz, (LONG)(szBuffer + ARRAYSIZE(szBuffer) - psz),\n                                 \"%02x\", pbData[j]);\n            }\n            else {\n                psz = SafePrintf(psz, (LONG)(szBuffer + ARRAYSIZE(szBuffer) - psz), \"  \");\n            }\n        }\n\n        for (DWORD j = i; j < i + 16; j++) {\n            if (j < cbData) {\n                if (pbData[j] >= ' ' && pbData[j] <= 127) {\n                    psz = SafePrintf(psz, (LONG)(szBuffer + ARRAYSIZE(szBuffer) - psz),\n                                     \"%c\", pbData[j]);\n                }\n                else {\n                    psz = SafePrintf(psz, (LONG)(szBuffer + ARRAYSIZE(szBuffer) - psz), \".\");\n                }\n            }\n            else {\n                psz = SafePrintf(psz, (LONG)(szBuffer + ARRAYSIZE(szBuffer) - psz), \" \");\n            }\n        }\n        Print(\"%s\\n\", szBuffer);\n    }\n}\n\nBOOL WINAPI Mine_DeviceIoControl(HANDLE a0,\n                                 DWORD a1,\n                                 LPVOID a2,\n                                 DWORD a3,\n                                 LPVOID a4,\n                                 DWORD a5,\n                                 LPDWORD a6,\n                                 LPOVERLAPPED a7)\n{\n    EnterFunc();\n    DWORD d6 = 0;\n    if (a6 == NULL) {\n        a6 = &d6;\n\n    }\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DeviceIoControl(a0, a1, a2, a3, a4, a5, a6, a7);\n    } __finally {\n        ExitFunc();\n        OpenFiles::SetRead(a0, 0);\n        OpenFiles::SetWrite(a0, 0);\n        if (rv && a1 != 0x390008 && a1 != 0x4d0008 && a1 != 0x6d0008) {\n            FileInfo *pInfo = OpenFiles::RecallFile(a0);\n\n            DWORD DeviceType    = (a1 & 0xffff0000) >> 16;\n            DWORD Access        = (a1 & 0x0000c000) >> 14;\n            DWORD Function      = (a1 & 0x00003ffc) >> 2;\n            DWORD Method        = (a1 & 0x00000003) >> 0;\n\n            if (pInfo) {\n                Print(\"<!-- DeviceIoControl %x [dev=%x,acc=%x,fun=%x,mth=%x] on %ls! -->\\n\",\n                      a1, DeviceType, Access, Function, Method, pInfo->m_pwzPath);\n            }\n            else {\n                Print(\"<!-- DeviceIoControl %x [dev=%x,acc=%x,fun=%x,mth=%x,in=%d,out=%d/%d] on (%x)! -->\\n\",\n                      a1, DeviceType, Access, Function, Method, a3, *a6, a5, a0);\n\n                if (a3 > 0) {\n                    Dump(a2, a3);\n                }\n                if (a5 > 0) {\n                    Dump(a4, (*a6 < a5) ? *a6 : a5);\n                }\n            }\n        }\n    };\n    return rv;\n}\n\nDWORD WINAPI Mine_GetFileAttributesW(LPCWSTR a0)\n{\n    EnterFunc();\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetFileAttributesW(a0);\n    } __finally {\n        ExitFunc();\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_MoveFileWithProgressW(LPCWSTR a0,\n                                       LPCWSTR a1,\n                                       LPPROGRESS_ROUTINE a2,\n                                       LPVOID a3,\n                                       DWORD a4)\n{\n    EnterFunc();\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_MoveFileWithProgressW(a0, a1, a2, a3, a4);\n    } __finally {\n        ExitFunc();\n        if (rv) {\n            NoteRead(a0);\n            NoteWrite(a1);\n        }\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_MoveFileA(LPCSTR a0,\n                           LPCSTR a1)\n{\n    EnterFunc();\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_MoveFileA(a0, a1);\n    } __finally {\n        ExitFunc();\n        if (rv) {\n            NoteRead(a0);\n            NoteCleanup(a0);\n            NoteWrite(a1);\n        }\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_MoveFileW(LPCWSTR a0,\n                           LPCWSTR a1)\n{\n    EnterFunc();\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_MoveFileW(a0, a1);\n    } __finally {\n        ExitFunc();\n        if (rv) {\n            NoteRead(a0);\n            NoteCleanup(a0);\n            NoteWrite(a1);\n        }\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_MoveFileExA(LPCSTR a0,\n                             LPCSTR a1,\n                             DWORD a2)\n{\n    EnterFunc();\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_MoveFileExA(a0, a1, a2);\n    } __finally {\n        ExitFunc();\n        if (rv) {\n            NoteRead(a0);\n            NoteCleanup(a0);\n            NoteWrite(a1);\n        }\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_MoveFileExW(LPCWSTR a0,\n                             LPCWSTR a1,\n                             DWORD a2)\n{\n    EnterFunc();\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_MoveFileExW(a0, a1, a2);\n    } __finally {\n        ExitFunc();\n        if (rv) {\n            NoteRead(a0);\n            NoteCleanup(a0);\n            NoteWrite(a1);\n        }\n    };\n    return rv;\n}\n\nvoid SetHandle(PCSTR pszName, HANDLE h)\n{\n#if 0\n    FileInfo *pInfo = OpenFiles::RecallFile(h);\n\n    if (pInfo != NULL) {\n        Tblog(\"<!-- hset: %hs (%x) %ls -->\\n\", pszName, h, pInfo->m_pwzPath);\n    }\n    else {\n        Tblog(\"<!-- hset: %hs (%x) ***Unknown*** -->\\n\", pszName, h);\n    }\n#else\n    (void)pszName;\n    (void)h;\n#endif\n}\n\n\nBOOL WINAPI Mine_SetStdHandle(DWORD a0,\n                              HANDLE a1)\n{\n    EnterFunc();\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetStdHandle(a0, a1);\n        if (rv && a1 != 0) {\n            switch (a0) {\n              case STD_INPUT_HANDLE:\n                SetHandle(\"stdin\", a1);\n                break;\n              case STD_OUTPUT_HANDLE:\n                SetHandle(\"stdout\", a1);\n                break;\n              case STD_ERROR_HANDLE:\n                SetHandle(\"stderr\", a1);\n                break;\n            }\n        }\n    } __finally {\n        ExitFunc();\n    };\n    return rv;\n}\n\nHMODULE WINAPI Mine_LoadLibraryA(LPCSTR a0)\n{\n    EnterFunc();\n\n    HMODULE rv = 0;\n    __try {\n        rv = Real_LoadLibraryA(a0);\n    } __finally {\n        ExitFunc();\n    };\n    return rv;\n}\n\nHMODULE WINAPI Mine_LoadLibraryW(LPCWSTR a0)\n{\n    EnterFunc();\n\n    HMODULE rv = 0;\n    __try {\n        rv = Real_LoadLibraryW(a0);\n    } __finally {\n        ExitFunc();\n    };\n    return rv;\n}\n\nHMODULE WINAPI Mine_LoadLibraryExA(LPCSTR a0,\n                                   HANDLE a1,\n                                   DWORD a2)\n{\n    EnterFunc();\n\n    HMODULE rv = 0;\n    __try {\n        rv = Real_LoadLibraryExA(a0, a1, a2);\n    } __finally {\n        ExitFunc();\n    };\n    return rv;\n}\n\nHMODULE WINAPI Mine_LoadLibraryExW(LPCWSTR a0,\n                                   HANDLE a1,\n                                   DWORD a2)\n{\n    EnterFunc();\n\n    HMODULE rv = 0;\n    __try {\n        rv = Real_LoadLibraryExW(a0, a1, a2);\n    } __finally {\n        ExitFunc();\n    };\n    return rv;\n}\n\nDWORD WINAPI Mine_SetFilePointer(HANDLE hFile,\n                                 LONG lDistanceToMove,\n                                 PLONG lpDistanceToMoveHigh,\n                                 DWORD dwMoveMethod)\n{\n    EnterFunc();\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_SetFilePointer(hFile,\n                                 lDistanceToMove,\n                                 lpDistanceToMoveHigh,\n                                 dwMoveMethod);\n    } __finally {\n        LONG high = 0;\n        if (lpDistanceToMoveHigh == NULL) {\n            lpDistanceToMoveHigh = &high;\n        }\n\n        FileInfo * pInfo = OpenFiles::RecallFile(hFile);\n        if (pInfo != NULL) {\n            if (dwMoveMethod == FILE_END && lDistanceToMove == 0xffffffff) {\n#if 0\n                Print(\"<!-- SetFilePointer(APPEND, %le) -->\\n\",\n                      pInfo->m_pwzPath);\n#endif\n                pInfo->m_fAppend = TRUE;\n            }\n#if 0\n            else if (dwMoveMethod == FILE_END) {\n                Print(\"<!-- SetFilePointer(END:%08x:%08x, %le) -->\\n\",\n                      (int)lDistanceToMove,\n                      *lpDistanceToMoveHigh,\n                      pInfo->m_pwzPath);\n            }\n            else if (dwMoveMethod == FILE_BEGIN) {\n                Print(\"<!-- SetFilePointer(BEG:%08x:%08x, %le) -->\\n\",\n                      (int)lDistanceToMove,\n                      *lpDistanceToMoveHigh,\n                      pInfo->m_pwzPath);\n            }\n            else if (dwMoveMethod == FILE_CURRENT) {\n                Print(\"<!-- SetFilePointer(CUR:%08x:%08x, %le) -->\\n\",\n                      (int)lDistanceToMove,\n                      *lpDistanceToMoveHigh,\n                      pInfo->m_pwzPath);\n            }\n#endif\n        }\n        ExitFunc();\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_SetFilePointerEx(HANDLE hFile,\n                                  LARGE_INTEGER liDistanceToMove,\n                                  PLARGE_INTEGER lpNewFilePointer,\n                                  DWORD dwMoveMethod)\n{\n    EnterFunc();\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetFilePointerEx(hFile,\n                                   liDistanceToMove,\n                                   lpNewFilePointer,\n                                   dwMoveMethod);\n    } __finally {\n#if 0\n        FileInfo * pInfo = OpenFiles::RecallFile(hFile);\n        if (pInfo != NULL) {\n            if (dwMoveMethod == FILE_END) {\n                Print(\"<!-- SetFilePointerEx(END:%I64d, %le) -->\\n\",\n                      liDistanceToMove.QuadPart,\n                      pInfo->m_pwzPath);\n            }\n            else if (dwMoveMethod == FILE_BEGIN) {\n                Print(\"<!-- SetFilePointerEx(BEG:%I64d, %le) -->\\n\",\n                      liDistanceToMove.QuadPart,\n                      pInfo->m_pwzPath);\n            }\n            else if (dwMoveMethod == FILE_CURRENT) {\n                Print(\"<!-- SetFilePointerEx(CUR:%I64d, %le) -->\\n\",\n                      liDistanceToMove.QuadPart,\n                      pInfo->m_pwzPath);\n            }\n        }\n#endif\n        ExitFunc();\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_ReadFile(HANDLE a0,\n                          LPVOID a1,\n                          DWORD a2,\n                          LPDWORD a3,\n                          LPOVERLAPPED a4)\n{\n    EnterFunc();\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ReadFile(a0, a1, a2, a3, a4);\n    } __finally {\n        if (rv) {\n            OpenFiles::SetRead(a0, a2);\n        }\n        ExitFunc();\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_ReadFileEx(HANDLE a0,\n                            LPVOID a1,\n                            DWORD a2,\n                            LPOVERLAPPED a3,\n                            LPOVERLAPPED_COMPLETION_ROUTINE a4)\n{\n    EnterFunc();\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ReadFileEx(a0, a1, a2, a3, a4);\n    } __finally {\n        if (rv) {\n            OpenFiles::SetRead(a0, a2);\n        }\n        ExitFunc();\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_WriteFile(HANDLE a0,\n                           LPCVOID a1,\n                           DWORD a2,\n                           LPDWORD a3,\n                           LPOVERLAPPED a4)\n{\n    EnterFunc();\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WriteFile(a0, a1, a2, a3, a4);\n    } __finally {\n        OpenFiles::SetWrite(a0, a2);\n        ExitFunc();\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_WriteFileEx(HANDLE a0,\n                             LPCVOID a1,\n                             DWORD a2,\n                             LPOVERLAPPED a3,\n                             LPOVERLAPPED_COMPLETION_ROUTINE a4)\n{\n    EnterFunc();\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WriteFileEx(a0, a1, a2, a3, a4);\n    } __finally {\n        OpenFiles::SetWrite(a0, a2);\n        ExitFunc();\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_WriteConsoleA(HANDLE a0,\n                                  const VOID* a1,\n                                  DWORD a2,\n                                  LPDWORD a3,\n                                  LPVOID a4)\n{\n    EnterFunc();\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WriteConsoleA(a0, a1, a2, a3, a4);\n    } __finally {\n        OpenFiles::SetWrite(a0, a2);\n        ExitFunc();\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_WriteConsoleW(HANDLE a0,\n                                  const VOID* a1,\n                                  DWORD a2,\n                                  LPDWORD a3,\n                                  LPVOID a4)\n{\n    EnterFunc();\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WriteConsoleW(a0, a1, a2, a3, a4);\n    } __finally {\n        OpenFiles::SetWrite(a0, a2);\n        ExitFunc();\n    };\n    return rv;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nDWORD WINAPI Mine_ExpandEnvironmentStringsA(PCSTR lpSrc, PCHAR lpDst, DWORD nSize)\n{\n    EnterFunc();\n    DWORD rv = 0;\n    __try {\n        rv = Real_ExpandEnvironmentStringsA(lpSrc, lpDst, nSize);\n    }\n    __finally {\n        if (rv > 0) {\n#if 0\n            Print(\"<!-- ExpandEnvironmentStringsA(%he) -->\\n\", lpSrc);\n#endif\n        }\n        ExitFunc();\n    };\n    return rv;\n}\n\nDWORD WINAPI Mine_ExpandEnvironmentStringsW(PCWSTR lpSrc, PWCHAR lpDst, DWORD nSize)\n{\n    EnterFunc();\n    DWORD rv = 0;\n    __try {\n        rv = Real_ExpandEnvironmentStringsW(lpSrc, lpDst, nSize);\n    }\n    __finally {\n        if (rv > 0) {\n#if 0\n            Print(\"<!-- ExpandEnvironmentStringsW(%le) -->\\n\", lpSrc);\n#endif\n        }\n        ExitFunc();\n    };\n    return rv;\n}\n\nDWORD WINAPI Mine_GetEnvironmentVariableA(PCSTR lpName, PCHAR lpBuffer, DWORD nSize)\n{\n    EnterFunc();\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetEnvironmentVariableA(lpName, lpBuffer, nSize);\n        //        if (rv > 0 && rv < nSize && lpBuffer != NULL) {\n        //            EnvVars::Used(lpName);\n        //        }\n    }\n    __finally {\n        EnvVars::Used(lpName);\n        ExitFunc();\n    };\n    return rv;\n}\n\nDWORD WINAPI Mine_GetEnvironmentVariableW(PCWSTR lpName, PWCHAR lpBuffer, DWORD nSize)\n{\n    EnterFunc();\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetEnvironmentVariableW(lpName, lpBuffer, nSize);\n        //        if (rv > 0 && rv < nSize && lpBuffer != NULL) {\n        //            EnvVars::Used(lpName);\n        //        }\n    }\n    __finally {\n        EnvVars::Used(lpName);\n        ExitFunc();\n    };\n    return rv;\n}\n\nPCWSTR CDECL Mine_wgetenv(PCWSTR var)\n{\n    EnterFunc();\n    PCWSTR rv = 0;\n    __try {\n        rv = Real_wgetenv(var);\n        //        if (rv != NULL) {\n        //            EnvVars::Used(var);\n        //        }\n    }\n    __finally {\n        EnvVars::Used(var);\n        ExitFunc();\n    }\n    return rv;\n}\n\nPCSTR CDECL Mine_getenv(PCSTR var)\n{\n    EnterFunc();\n    PCSTR rv = 0;\n    __try {\n        rv = Real_getenv(var);\n        //        if (rv) {\n        //            EnvVars::Used(var);\n        //        }\n    }\n    __finally {\n        EnvVars::Used(var);\n        ExitFunc();\n    }\n    return rv;\n}\n\nDWORD CDECL Mine_getenv_s(DWORD *pValue, PCHAR pBuffer, DWORD cBuffer, PCSTR varname)\n{\n    EnterFunc();\n    DWORD rv = 0;\n    __try {\n        DWORD value;\n        if (pValue == NULL) {\n            pValue = &value;\n        }\n        rv = Real_getenv_s(pValue, pBuffer, cBuffer, varname);\n        //        if (rv == 0 && *pValue > 0) {\n        //            EnvVars::Used(varname);\n        //        }\n    }\n    __finally {\n        EnvVars::Used(varname);\n        ExitFunc();\n    }\n    return rv;\n}\n\nDWORD CDECL Mine_wgetenv_s(DWORD *pValue, PWCHAR pBuffer, DWORD cBuffer, PCWSTR varname)\n{\n    EnterFunc();\n    DWORD rv = 0;\n    __try {\n        DWORD value;\n        if (pValue == NULL) {\n            pValue = &value;\n        }\n        rv = Real_wgetenv_s(pValue, pBuffer, cBuffer, varname);\n        //        if (rv == 0 && *pValue > 0) {\n        //            EnvVars::Used(varname);\n        //        }\n    }\n    __finally {\n        EnvVars::Used(varname);\n        ExitFunc();\n    }\n    return rv;\n}\n\nDWORD CDECL Mine_dupenv_s(PCHAR *ppBuffer, DWORD *pcBuffer, PCSTR varname)\n{\n    EnterFunc();\n    DWORD rv = 0;\n    __try {\n        PCHAR pb;\n        DWORD cb;\n        if (ppBuffer == NULL) {\n            ppBuffer = &pb;\n        }\n        if (pcBuffer == NULL) {\n            pcBuffer = &cb;\n        }\n        rv = Real_dupenv_s(ppBuffer, pcBuffer, varname);\n        //        if (rv == 0 && *pcBuffer > 0 && *ppBuffer != NULL) {\n        //            EnvVars::Used(varname);\n        //        }\n    }\n    __finally {\n        EnvVars::Used(varname);\n        ExitFunc();\n    }\n    return rv;\n}\n\nDWORD CDECL Mine_wdupenv_s(PWCHAR *ppBuffer, DWORD *pcBuffer, PCWSTR varname)\n{\n    EnterFunc();\n    DWORD rv = 0;\n    __try {\n        PWCHAR pb;\n        DWORD cb;\n        if (ppBuffer == NULL) {\n            ppBuffer = &pb;\n        }\n        if (pcBuffer == NULL) {\n            pcBuffer = &cb;\n        }\n        rv = Real_wdupenv_s(ppBuffer, pcBuffer, varname);\n        //        if (rv == 0 && *pcBuffer > 0 && *ppBuffer != NULL) {\n        //            EnvVars::Used(varname);\n        //        }\n    }\n    __finally {\n        EnvVars::Used(varname);\n        ExitFunc();\n    }\n    return rv;\n}\n\n\n/////////////////////////////////////////////////////////////\n// AttachDetours\n//\nLONG AttachDetours(VOID)\n{\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n\n    DetourAttach(&(PVOID&)Real_EntryPoint, Mine_EntryPoint);\n    DetourAttach(&(PVOID&)Real_ExitProcess, Mine_ExitProcess);\n    DetourAttach(&(PVOID&)Real_CopyFileExA, Mine_CopyFileExA);\n    DetourAttach(&(PVOID&)Real_CopyFileExW, Mine_CopyFileExW);\n    DetourAttach(&(PVOID&)Real_PrivCopyFileExW, Mine_PrivCopyFileExW);\n    DetourAttach(&(PVOID&)Real_CreateHardLinkA, Mine_CreateHardLinkA);\n    DetourAttach(&(PVOID&)Real_CreateHardLinkW, Mine_CreateHardLinkW);\n    DetourAttach(&(PVOID&)Real_CreateDirectoryW, Mine_CreateDirectoryW);\n    DetourAttach(&(PVOID&)Real_CreateDirectoryExW, Mine_CreateDirectoryExW);\n    DetourAttach(&(PVOID&)Real_CreateFileW, Mine_CreateFileW);\n    DetourAttach(&(PVOID&)Real_CreatePipe, Mine_CreatePipe);\n    DetourAttach(&(PVOID&)Real_CreateFileMappingW, Mine_CreateFileMappingW);\n    DetourAttach(&(PVOID&)Real_CloseHandle, Mine_CloseHandle);\n    DetourAttach(&(PVOID&)Real_DuplicateHandle, Mine_DuplicateHandle);\n    DetourAttach(&(PVOID&)Real_CreateProcessW, Mine_CreateProcessW);\n    DetourAttach(&(PVOID&)Real_CreateProcessA, Mine_CreateProcessA);\n    DetourAttach(&(PVOID&)Real_DeleteFileW, Mine_DeleteFileW);\n    DetourAttach(&(PVOID&)Real_DeviceIoControl, Mine_DeviceIoControl);\n    DetourAttach(&(PVOID&)Real_GetFileAttributesW, Mine_GetFileAttributesW);\n    DetourAttach(&(PVOID&)Real_MoveFileA, Mine_MoveFileA);\n    DetourAttach(&(PVOID&)Real_MoveFileW, Mine_MoveFileW);\n    DetourAttach(&(PVOID&)Real_MoveFileExA, Mine_MoveFileExA);\n    DetourAttach(&(PVOID&)Real_MoveFileExW, Mine_MoveFileExW);\n    DetourAttach(&(PVOID&)Real_MoveFileWithProgressW, Mine_MoveFileWithProgressW);\n    DetourAttach(&(PVOID&)Real_SetStdHandle, Mine_SetStdHandle);\n    DetourAttach(&(PVOID&)Real_LoadLibraryA, Mine_LoadLibraryA);\n    DetourAttach(&(PVOID&)Real_LoadLibraryW, Mine_LoadLibraryW);\n    DetourAttach(&(PVOID&)Real_LoadLibraryExA, Mine_LoadLibraryExA);\n    DetourAttach(&(PVOID&)Real_LoadLibraryExW, Mine_LoadLibraryExW);\n    DetourAttach(&(PVOID&)Real_SetFilePointer, Mine_SetFilePointer);\n    DetourAttach(&(PVOID&)Real_SetFilePointerEx, Mine_SetFilePointerEx);\n    DetourAttach(&(PVOID&)Real_ReadFile, Mine_ReadFile);\n    DetourAttach(&(PVOID&)Real_ReadFileEx, Mine_ReadFileEx);\n    DetourAttach(&(PVOID&)Real_WriteFile, Mine_WriteFile);\n    DetourAttach(&(PVOID&)Real_WriteFileEx, Mine_WriteFileEx);\n    DetourAttach(&(PVOID&)Real_WriteConsoleA, Mine_WriteConsoleA);\n    DetourAttach(&(PVOID&)Real_WriteConsoleW, Mine_WriteConsoleW);\n    DetourAttach(&(PVOID&)Real_ExpandEnvironmentStringsA, Mine_ExpandEnvironmentStringsA);\n    DetourAttach(&(PVOID&)Real_ExpandEnvironmentStringsW, Mine_ExpandEnvironmentStringsW);\n    DetourAttach(&(PVOID&)Real_GetEnvironmentVariableA, Mine_GetEnvironmentVariableA);\n    DetourAttach(&(PVOID&)Real_GetEnvironmentVariableW, Mine_GetEnvironmentVariableW);\n\n    return DetourTransactionCommit();\n}\n\nLONG DetachDetours(VOID)\n{\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n\n    DetourDetach(&(PVOID&)Real_EntryPoint, Mine_EntryPoint);\n    DetourAttach(&(PVOID&)Real_ExitProcess, Mine_ExitProcess);\n    DetourDetach(&(PVOID&)Real_CopyFileExA, Mine_CopyFileExA);\n    DetourDetach(&(PVOID&)Real_CopyFileExW, Mine_CopyFileExW);\n    DetourDetach(&(PVOID&)Real_PrivCopyFileExW, Mine_PrivCopyFileExW);\n    DetourDetach(&(PVOID&)Real_CreateHardLinkA, Mine_CreateHardLinkA);\n    DetourDetach(&(PVOID&)Real_CreateHardLinkW, Mine_CreateHardLinkW);\n    DetourDetach(&(PVOID&)Real_CreateDirectoryW, Mine_CreateDirectoryW);\n    DetourDetach(&(PVOID&)Real_CreateDirectoryExW, Mine_CreateDirectoryExW);\n    DetourDetach(&(PVOID&)Real_CreateFileW, Mine_CreateFileW);\n    DetourDetach(&(PVOID&)Real_CreatePipe, Mine_CreatePipe);\n    DetourDetach(&(PVOID&)Real_CreateFileMappingW, Mine_CreateFileMappingW);\n    DetourDetach(&(PVOID&)Real_CloseHandle, Mine_CloseHandle);\n    DetourDetach(&(PVOID&)Real_DuplicateHandle, Mine_DuplicateHandle);\n    DetourDetach(&(PVOID&)Real_CreateProcessW, Mine_CreateProcessW);\n    DetourDetach(&(PVOID&)Real_CreateProcessA, Mine_CreateProcessA);\n    DetourDetach(&(PVOID&)Real_DeleteFileW, Mine_DeleteFileW);\n    DetourDetach(&(PVOID&)Real_DeviceIoControl, Mine_DeviceIoControl);\n    DetourDetach(&(PVOID&)Real_GetFileAttributesW, Mine_GetFileAttributesW);\n    DetourDetach(&(PVOID&)Real_MoveFileA, Mine_MoveFileA);\n    DetourDetach(&(PVOID&)Real_MoveFileW, Mine_MoveFileW);\n    DetourDetach(&(PVOID&)Real_MoveFileExA, Mine_MoveFileExA);\n    DetourDetach(&(PVOID&)Real_MoveFileExW, Mine_MoveFileExW);\n    DetourDetach(&(PVOID&)Real_MoveFileWithProgressW, Mine_MoveFileWithProgressW);\n    DetourDetach(&(PVOID&)Real_SetStdHandle, Mine_SetStdHandle);\n    DetourDetach(&(PVOID&)Real_LoadLibraryA, Mine_LoadLibraryA);\n    DetourDetach(&(PVOID&)Real_LoadLibraryW, Mine_LoadLibraryW);\n    DetourDetach(&(PVOID&)Real_LoadLibraryExA, Mine_LoadLibraryExA);\n    DetourDetach(&(PVOID&)Real_LoadLibraryExW, Mine_LoadLibraryExW);\n    DetourDetach(&(PVOID&)Real_SetFilePointer, Mine_SetFilePointer);\n    DetourDetach(&(PVOID&)Real_SetFilePointerEx, Mine_SetFilePointerEx);\n    DetourDetach(&(PVOID&)Real_ReadFile, Mine_ReadFile);\n    DetourDetach(&(PVOID&)Real_ReadFileEx, Mine_ReadFileEx);\n    DetourDetach(&(PVOID&)Real_WriteFile, Mine_WriteFile);\n    DetourDetach(&(PVOID&)Real_WriteFileEx, Mine_WriteFileEx);\n    DetourDetach(&(PVOID&)Real_WriteConsoleA, Mine_WriteConsoleA);\n    DetourDetach(&(PVOID&)Real_WriteConsoleW, Mine_WriteConsoleW);\n    DetourDetach(&(PVOID&)Real_ExpandEnvironmentStringsA, Mine_ExpandEnvironmentStringsA);\n    DetourDetach(&(PVOID&)Real_ExpandEnvironmentStringsW, Mine_ExpandEnvironmentStringsW);\n    DetourDetach(&(PVOID&)Real_GetEnvironmentVariableA, Mine_GetEnvironmentVariableA);\n    DetourDetach(&(PVOID&)Real_GetEnvironmentVariableW, Mine_GetEnvironmentVariableW);\n\n    if (Real_getenv) { DetourDetach(&(PVOID&)Real_getenv, Mine_getenv); }\n    if (Real_getenv_s) { DetourDetach(&(PVOID&)Real_getenv_s, Mine_getenv_s); }\n    if (Real_wgetenv) { DetourDetach(&(PVOID&)Real_wgetenv, Mine_wgetenv); }\n    if (Real_wgetenv_s) { DetourDetach(&(PVOID&)Real_wgetenv, Mine_wgetenv_s); }\n    if (Real_dupenv_s) { DetourDetach(&(PVOID&)Real_dupenv_s, Mine_dupenv_s); }\n    if (Real_wdupenv_s) { DetourDetach(&(PVOID&)Real_wdupenv_s, Mine_wdupenv_s); }\n\n    return DetourTransactionCommit();\n}\n//\n//////////////////////////////////////////////////////////////////////////////\n\nVOID NoteRead(PCSTR psz)\n{\n    FileInfo *pInfo = FileNames::FindPartial(psz);\n    pInfo->m_fRead = TRUE;\n}\n\nVOID NoteRead(PCWSTR pwz)\n{\n    FileInfo *pInfo = FileNames::FindPartial(pwz);\n    pInfo->m_fRead = TRUE;\n}\n\nVOID NoteWrite(PCSTR psz)\n{\n    FileInfo *pInfo = FileNames::FindPartial(psz);\n    pInfo->m_fWrite = TRUE;\n    if (!pInfo->m_fRead) {\n        pInfo->m_fCantRead = TRUE;\n    }\n}\n\nVOID NoteWrite(PCWSTR pwz)\n{\n    FileInfo *pInfo = FileNames::FindPartial(pwz);\n    pInfo->m_fWrite = TRUE;\n    if (!pInfo->m_fRead) {\n        pInfo->m_fCantRead = TRUE;\n    }\n}\n\nVOID NoteDelete(PCSTR psz)\n{\n    FileInfo *pInfo = FileNames::FindPartial(psz);\n    if (pInfo->m_fWrite || pInfo->m_fRead) {\n        pInfo->m_fCleanup = TRUE;\n    }\n    else {\n        pInfo->m_fDelete = TRUE;\n    }\n    if (!pInfo->m_fRead) {\n        pInfo->m_fCantRead = TRUE;\n    }\n}\n\nVOID NoteDelete(PCWSTR pwz)\n{\n    FileInfo *pInfo = FileNames::FindPartial(pwz);\n    if (pInfo->m_fWrite || pInfo->m_fRead) {\n        pInfo->m_fCleanup = TRUE;\n    }\n    else {\n        pInfo->m_fDelete = TRUE;\n    }\n    if (!pInfo->m_fRead) {\n        pInfo->m_fCantRead = TRUE;\n    }\n}\n\nVOID NoteCleanup(PCSTR psz)\n{\n    FileInfo *pInfo = FileNames::FindPartial(psz);\n    pInfo->m_fCleanup = TRUE;\n}\n\nVOID NoteCleanup(PCWSTR pwz)\n{\n    FileInfo *pInfo = FileNames::FindPartial(pwz);\n    pInfo->m_fCleanup = TRUE;\n}\n\n////////////////////////////////////////////////////////////// Logging System.\n//\nstatic BOOL s_bLog = 1;\nstatic LONG s_nTlsIndent = -1;\nstatic LONG s_nTlsThread = -1;\nstatic LONG s_nThreadCnt = 0;\n\nLONG EnterFunc()\n{\n    DWORD dwErr = GetLastError();\n\n    LONG nIndent = 0;\n    LONG nThread = 0;\n    if (s_nTlsIndent >= 0) {\n        nIndent = (LONG)(LONG_PTR)TlsGetValue(s_nTlsIndent);\n        TlsSetValue(s_nTlsIndent, (PVOID)(LONG_PTR)(nIndent + 1));\n    }\n    if (s_nTlsThread >= 0) {\n        nThread = (LONG)(LONG_PTR)TlsGetValue(s_nTlsThread);\n    }\n\n    SetLastError(dwErr);\n\n    return nIndent;\n}\n\nVOID ExitFunc()\n{\n    DWORD dwErr = GetLastError();\n\n    LONG nIndent = 0;\n    LONG nThread = 0;\n    if (s_nTlsIndent >= 0) {\n        nIndent = (LONG)(LONG_PTR)TlsGetValue(s_nTlsIndent) - 1;\n        ASSERT(nIndent >= 0);\n        TlsSetValue(s_nTlsIndent, (PVOID)(LONG_PTR)nIndent);\n    }\n    if (s_nTlsThread >= 0) {\n        nThread = (LONG)(LONG_PTR)TlsGetValue(s_nTlsThread);\n    }\n\n    SetLastError(dwErr);\n}\n\nVOID Print(const CHAR *psz, ...)\n{\n    DWORD dwErr = GetLastError();\n\n    if (s_bLog && psz) {\n        va_list  args;\n        va_start(args, psz);\n\n        TblogV(psz, args);\n\n        va_end(args);\n    }\n\n    SetLastError(dwErr);\n}\n\nVOID AssertFailed(CONST PCHAR pszMsg, CONST PCHAR pszFile, ULONG nLine)\n{\n    Tblog(\"ASSERT(%hs) failed in %s, line %d.\\n\", pszMsg, pszFile, nLine);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// DLL module information\n//\nBOOL ThreadAttach(HMODULE hDll)\n{\n    (void)hDll;\n\n    if (s_nTlsIndent >= 0) {\n        TlsSetValue(s_nTlsIndent, (PVOID)0);\n    }\n    if (s_nTlsThread >= 0) {\n        LONG nThread = InterlockedIncrement(&s_nThreadCnt);\n        TlsSetValue(s_nTlsThread, (PVOID)(LONG_PTR)nThread);\n    }\n    return TRUE;\n}\n\nBOOL ThreadDetach(HMODULE hDll)\n{\n    (void)hDll;\n\n    if (s_nTlsIndent >= 0) {\n        TlsSetValue(s_nTlsIndent, (PVOID)0);\n    }\n    if (s_nTlsThread >= 0) {\n        TlsSetValue(s_nTlsThread, (PVOID)0);\n    }\n    return TRUE;\n}\n\nBOOL ProcessAttach(HMODULE hDll)\n{\n    InitializeCriticalSection(&s_csPipe);\n    InitializeCriticalSection(&s_csChildPayload);\n\n    Procs::Initialize();\n    EnvVars::Initialize();\n    FileNames::Initialize();\n    OpenFiles::Initialize();\n\n    s_bLog = FALSE;\n    s_nTlsIndent = TlsAlloc();\n    s_nTlsThread = TlsAlloc();\n\n    s_hInst = hDll;\n    s_hKernel32 = NULL;\n\n    PBYTE xCreate = (PBYTE)DetourCodeFromPointer((PVOID)Real_CreateProcessW, NULL);\n    PTBLOG_PAYLOAD pPayload = NULL;\n\n    for (HMODULE hMod = NULL; (hMod = DetourEnumerateModules(hMod)) != NULL;) {\n        ULONG cbData;\n        PVOID pvData = DetourFindPayload(hMod, s_guidTrace, &cbData);\n\n        if (pvData != NULL && pPayload == NULL) {\n            pPayload = (PTBLOG_PAYLOAD)pvData;\n        }\n\n        ULONG cbMod = DetourGetModuleSize(hMod);\n\n        if (((PBYTE)hMod) < xCreate && ((PBYTE)hMod + cbMod) > xCreate) {\n            s_hKernel32 = hMod;\n        }\n    }\n\n    ZeroMemory(&s_Payload, sizeof(s_Payload));\n\n    if (pPayload == NULL) {\n        return FALSE;\n    }\n\n    CopyMemory(&s_Payload, pPayload, sizeof(s_Payload));\n\n    LoadStdHandleName(STD_INPUT_HANDLE, s_Payload.wzStdin, FALSE);\n    LoadStdHandleName(STD_OUTPUT_HANDLE, s_Payload.wzStdout, s_Payload.fStdoutAppend);\n    LoadStdHandleName(STD_ERROR_HANDLE, s_Payload.wzStderr, s_Payload.fStderrAppend);\n    s_nTraceProcessId = s_Payload.nTraceProcessId;\n\n    GetModuleFileNameA(s_hInst, s_szDllPath, ARRAYSIZE(s_szDllPath));\n\n    // Find hidden functions.\n    Real_PrivCopyFileExW =\n        (BOOL (WINAPI *)(LPCWSTR, LPCWSTR, LPPROGRESS_ROUTINE, LPVOID, LPBOOL, DWORD))\n        GetProcAddress(s_hKernel32, \"PrivCopyFileExW\");\n    if (Real_PrivCopyFileExW == NULL) {\n        DEBUG_BREAK();\n    }\n\n    LONG error = AttachDetours();\n    if (error != NO_ERROR) {\n        DEBUG_BREAK();\n        Tblog(\"<!-- Error attaching detours: %d -->\\n\", error);\n    }\n\n    ThreadAttach(hDll);\n\n    s_bLog = TRUE;\n    return TRUE;\n}\n\nBOOL ProcessDetach(HMODULE hDll)\n{\n    ThreadDetach(hDll);\n    s_bLog = FALSE;\n\n    LONG error = DetachDetours();\n    if (error != NO_ERROR) {\n        Tblog(\"<!-- Error detaching detours: %d -->\\n\", error);\n    }\n\n    TblogClose();\n\n    if (s_nTlsIndent >= 0) {\n        TlsFree(s_nTlsIndent);\n    }\n    if (s_nTlsThread >= 0) {\n        TlsFree(s_nTlsThread);\n    }\n    return TRUE;\n}\n\ninline VOID UpdateIfRoom(PWCHAR& pwzDst, PWCHAR pwzDstEnd, WCHAR c)\n{\n    if (pwzDst < pwzDstEnd) {\n        *pwzDst++ = c;  // Write character if room in buffer.\n    }\n    else {\n        pwzDst++;       // If no room, just advance pointer (to alloc calculation)\n    }\n}\n\nstatic PCHAR RemoveReturns(PCHAR pszBuffer)\n{\n    PCHAR pszIn = pszBuffer;\n    PCHAR pszOut = pszBuffer;\n\n    while (*pszIn) {\n        if (*pszIn == '\\r') {\n            pszIn++;\n            continue;\n        }\n        *pszOut++ = *pszIn++;\n    }\n    *pszOut = '\\0';\n\n    return pszBuffer;\n}\n\nstatic PWCHAR RemoveReturns(PWCHAR pwzBuffer)\n{\n    PWCHAR pwzIn = pwzBuffer;\n    PWCHAR pwzOut = pwzBuffer;\n\n    while (*pwzIn) {\n        if (*pwzIn == '\\r') {\n            pwzIn++;\n            continue;\n        }\n        *pwzOut++ = *pwzIn++;\n    }\n    *pwzOut = '\\0';\n\n    return pwzBuffer;\n}\n\nPBYTE LoadFile(HANDLE hFile, DWORD cbFile)\n{\n    PBYTE pbFile = (PBYTE)GlobalAlloc(GPTR, cbFile + 3);\n    if (pbFile == NULL) {\n        return NULL;\n    }\n\n    DWORD cbRead = 0;\n    Real_SetFilePointer(hFile, 0, NULL, FILE_BEGIN);\n    Real_ReadFile(hFile, pbFile, cbFile, &cbRead, NULL);\n\n    // Make sure the file is zero terminated.\n    pbFile[cbRead + 0] = 0;\n    pbFile[cbRead + 1] = 0;\n    pbFile[cbRead + 2] = 0;\n\n    return pbFile;\n}\n\nPWCHAR More(PCWSTR pwzPath, PWCHAR pwzDst, PWCHAR pwzDstEnd)\n{\n    HANDLE hFile = Real_CreateFileW(pwzPath, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);\n    if (hFile == INVALID_HANDLE_VALUE) {\n        return NULL;\n    }\n\n    FileInfo *pInfo = FileNames::FindPartial(pwzPath);\n    pInfo->m_fAbsorbed = true;\n\n    DWORD cbFile = Real_SetFilePointer(hFile, 0, NULL, FILE_END);\n    DWORD cbRead = 0;\n\n    PCHAR pszFile = (PCHAR)GlobalAlloc(GPTR, cbFile + 2);   // 2 bytes null for Unicode or Ascii.\n    if (pszFile != NULL) {\n        Real_SetFilePointer(hFile, 0, NULL, FILE_BEGIN);\n        Real_ReadFile(hFile, pszFile, cbFile, &cbRead, NULL);\n\n        if (((PUCHAR)pszFile)[0] == 0xff && ((PUCHAR)pszFile)[1] == 0xfe) {\n            // Unicode\n            PWCHAR pwzFile = ((PWCHAR)pszFile) + 1;\n            PCWSTR pwzIn = pwzFile;\n            while (*pwzIn) {\n                if (*pwzIn == ' ' || *pwzIn == '\\t' || *pwzIn == '\\r' || *pwzIn == '\\n') {\n                    UpdateIfRoom(pwzDst, pwzDstEnd, ' ');\n                    while (*pwzIn == ' ' || *pwzIn == '\\t' || *pwzIn == '\\r' || *pwzIn == '\\n') {\n                        pwzIn++;\n                    }\n                }\n                else {\n                    UpdateIfRoom(pwzDst, pwzDstEnd, *pwzIn++);\n                }\n            }\n        }\n        else {\n            PCSTR pszIn = pszFile;\n            while (*pszIn) {\n                if (*pszIn == ' ' || *pszIn == '\\t' || *pszIn == '\\r' || *pszIn == '\\n') {\n                    UpdateIfRoom(pwzDst, pwzDstEnd, ' ');\n                    while (*pszIn == ' ' || *pszIn == '\\t' || *pszIn == '\\r' || *pszIn == '\\n') {\n                        pszIn++;\n                    }\n                }\n                else {\n                    UpdateIfRoom(pwzDst, pwzDstEnd, *pszIn++);\n                }\n            }\n        }\n\n        GlobalFree(pszFile);\n    }\n\n    Real_CloseHandle(hFile);\n\n    return pwzDst;\n}\n\n// This function is called twice.  On the first call, pwzDstEnd <= pwzDst and\n// no data is copied, but pwzDst is advanced so we can see how big of a\n// buffer is needed to hold the command line.\n//\n// On the second call, the command line is actually populated.\nPWCHAR LoadCommandLine(PCWSTR pwz, PWCHAR pwzDst, PWCHAR pwzDstEnd)\n{\n    while (*pwz) {\n        PCWSTR pwzArgBeg = NULL;\n        PCWSTR pwzArgEnd = NULL;\n        WCHAR cQuote = '\\0';\n        BOOL fMore = false;\n\n        if (*pwz == '@') {\n            fMore = true;\n            pwz++;\n        }\n\n        if (*pwz == '\\\"' || *pwz == '\\'') {\n            cQuote = *pwz++;\n\n            pwzArgBeg = pwz;\n            while (*pwz != '\\0' && *pwz != cQuote) {\n                pwz++;\n            }\n            pwzArgEnd = pwz;\n\n            if (*pwz == cQuote) {\n                pwz++;\n            }\n        }\n        else {\n            pwzArgBeg = pwz;\n            while (*pwz != '\\0' && *pwz != ' ' && *pwz != '\\t' && *pwz != '\\n' && *pwz != '\\r') {\n                pwz++;\n            }\n            pwzArgEnd = pwz;\n        }\n\n        if (fMore) {\n            // More arguments!\n            WCHAR wzPath[MAX_PATH];\n            PWCHAR pwzPath = wzPath;\n            PCWSTR pwzTmp = pwzArgBeg + 1;\n            while (pwzTmp < pwzArgEnd && pwzPath < wzPath + ARRAYSIZE(wzPath)-2) {\n                *pwzPath++ = *pwzTmp++;\n            }\n            *pwzPath = '\\0';\n\n            PWCHAR pwzOut = More(wzPath, pwzDst, pwzDstEnd);\n            if (pwzOut != NULL) {\n                pwzDst = pwzOut;\n\n                cQuote = 0;\n                pwzArgBeg = pwzArgEnd;\n            }\n        }\n\n        if (cQuote) {\n            UpdateIfRoom(pwzDst, pwzDstEnd, cQuote);\n        }\n        for (; pwzArgBeg < pwzArgEnd; pwzArgBeg++) {\n            UpdateIfRoom(pwzDst, pwzDstEnd, *pwzArgBeg);\n        }\n        if (cQuote) {\n            UpdateIfRoom(pwzDst, pwzDstEnd, cQuote);\n        }\n\n        if (*pwz) {\n            UpdateIfRoom(pwzDst, pwzDstEnd, ' ');\n        }\n\n        // skip over separating spaces.\n        while (*pwz == ' ' || *pwz == '\\t' || *pwz == '\\n' || *pwz == '\\r') {\n            pwz++;\n        }\n    }\n    return pwzDst;\n}\n\nvoid TestHandle(PCSTR pszName, HANDLE h)\n{\n    FileInfo *pInfo = OpenFiles::RecallFile(h);\n\n    if (pInfo != NULL) {\n#if 1 // Ignore PIPEs.\n        if (FileNames::PrefixMatch(pInfo->m_pwzPath, L\"\\\\\\\\.\\\\PIPE\\\\\")) {\n            // Ignore;\n        }\n        else\n#endif\n            if (FileNames::SuffixMatch(pInfo->m_pwzPath, L\"\\\\conout$\")) {\n            // Ignore;\n        }\n        else if (FileNames::SuffixMatch(pInfo->m_pwzPath, L\"\\\\conin$\")) {\n            // Ignore;\n        }\n        else if (FileNames::SuffixMatch(pInfo->m_pwzPath, L\"\\\\nul\")) {\n            // Ignore;\n        }\n        else {\n            Tblog(\"<%hs%hs>%le</%hs>\\n\",\n                  pszName, pInfo->m_fAppend ? \" append=\\\"true\\\"\" : \"\", pInfo->m_pwzPath, pszName);\n        }\n    }\n    else {\n        Tblog(\"<!-- hand: %hs (%x) ***Unknown*** -->\\n\", pszName, h);\n    }\n}\n\nLONG WINAPI DetourAttachIf(PVOID *ppPointer, PVOID pDetour)\n{\n    if (*ppPointer == NULL) {\n        Tblog(\"<!-- DetourAttachIf failed: %p -->\\n\", pDetour);\n        return NO_ERROR;\n    }\n\n    PDETOUR_TRAMPOLINE pRealTrampoline;\n    PVOID pRealTarget;\n    PVOID pRealDetour;\n\n    LONG err = DetourAttachEx(ppPointer, pDetour, &pRealTrampoline, &pRealTarget, &pRealDetour);\n    if (err == NO_ERROR) {\n        // Tblog(\"<!-- DetourAttachIf %p at %p -->\\n\", pDetour, pRealTarget);\n        return NO_ERROR;\n    }\n    return err;\n}\n\nint WINAPI Mine_EntryPoint(VOID)\n{\n    // This function is invoked instead of the process EntryPoint (Real_EntryPoint).\n\n    TblogOpen();\n\n    SaveEnvironment();\n\n    {\n        CHAR szExeName[MAX_PATH];\n        CHAR szId[128];\n        CHAR szParent[128];\n        WCHAR wzPath[MAX_PATH];\n        PCHAR pszExeName = szExeName;\n\n        // Get the base command line (skipping over the executable name)\n        PCWSTR pwzLine = GetCommandLineW();\n        if (*pwzLine == '\\\"') {\n            pwzLine++;\n            while (*pwzLine && *pwzLine != '\\\"') {\n                pwzLine++;\n            }\n            if (*pwzLine == '\\\"') {\n                pwzLine++;\n            }\n        }\n        else {\n            while (*pwzLine && *pwzLine != ' ' && *pwzLine != '\\t') {\n                pwzLine++;\n            }\n        }\n        while (*pwzLine && (*pwzLine == ' ' || *pwzLine == '\\t')) {\n            pwzLine++;\n        }\n\n        // Get the root executable name.\n        if (GetModuleFileNameA(0, szExeName, ARRAYSIZE(szExeName))) {\n            PCHAR psz = szExeName;\n\n            while (*psz) {\n                psz++;\n            }\n\n            while (psz > szExeName && psz[-1] != ':' && psz[-1] != '\\\\' && psz[-1] != '/') {\n                psz--;\n            }\n            pszExeName = psz;\n            while (*psz && *psz != '.') {\n                psz++;\n            }\n            *psz = '\\0';\n        }\n        else {\n            szExeName[0] = '\\0';\n        }\n\n        // Start the XML process node.\n        Tblog(\"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n\");\n        {\n            PCHAR pszId = szId;\n            PCHAR pszParent = szParent;\n            for (DWORD i = 0; i < s_Payload.nGeneology; i++) {\n                pszId = SafePrintf(pszId, 16, \"%d.\", s_Payload.rGeneology[i]);\n                if (i < s_Payload.nGeneology - 1) {\n                    pszParent = SafePrintf(pszParent, 16, \"%d.\", s_Payload.rGeneology[i]);\n                }\n            }\n            *pszId = '\\0';\n            *pszParent = '\\0';\n\n            if (szParent[0] == '\\0') {\n                Tblog(\"<t:Process id=\\\"::%hs::\\\"\", szId);\n            }\n            else {\n                Tblog(\"<t:Process id=\\\"::%hs::\\\" parentId=\\\"::%hs::\\\"\", szId, szParent);\n            }\n\n            Tblog(\" par=\\\"%ls\\\" exe=\\\"%hs\\\"\", s_Payload.wzParents, pszExeName);\n\n            BOOL drop = false;\n            PCWSTR pwzz = s_Payload.wzzDrop;\n            while (*pwzz) {\n                if (Compare(pwzz, pszExeName) == 0) {\n                    // match\n                    drop = true;\n                    break;\n                }\n                pwzz += Size(pwzz) + 1;\n            }\n            if (drop) {\n                Tblog(\" drop=\\\"true\\\"\");\n            }\n        }\n\n        {\n            PWCHAR pwz = s_Payload.wzParents;\n            while (*pwz) {\n                pwz++;\n            }\n            *pwz++ = '/';\n            PCSTR psz = pszExeName;\n            while (*psz) {\n                *pwz++ = *psz++;\n            }\n            *pwz = '\\0';\n        }\n\n\n        if (HasChar(pwzLine, '|')) {\n            Tblog(\" pipes=\\\"true\\\"\");\n        }\n        if (HasChar(pwzLine, '>')) {\n            Tblog(\" redirects=\\\"true\\\"\");\n        }\n\n        Tblog(\" xmlns:t=\\\"http://schemas.microsoft.com/research/tracebld/2008\\\">\\n\");\n\n        // Get the directory.\n        DWORD dwSize = GetCurrentDirectoryA(ARRAYSIZE(szExeName), szExeName);\n        if (dwSize > 0 && dwSize < ARRAYSIZE(szExeName)) {\n            Tblog(\"<t:Directory>%hs</t:Directory>\\n\", szExeName);\n        }\n\n        // Get the real executable name.\n        wzPath[0] = '\\0';\n        if (GetModuleFileNameA(0, szExeName, ARRAYSIZE(szExeName))) {\n            FileInfo *pInfo = FileNames::FindPartial(szExeName);\n            Tblog(\"<t:Executable>%ls</t:Executable>\\n\",\n                  FileNames::ParameterizeName(wzPath, ARRAYSIZE(wzPath), pInfo));\n        }\n\n        // Construct the processed command line.\n        PWCHAR pwzDstEnd = (PWCHAR)pwzLine;\n        PWCHAR pwzDst = pwzDstEnd;\n        pwzDst = LoadCommandLine(pwzLine, pwzDst, pwzDstEnd);\n        DWORD wcNew = (DWORD)((pwzDst - pwzDstEnd) + 1);\n        PWCHAR pwzFin = (PWCHAR)GlobalAlloc(GPTR, wcNew * sizeof(WCHAR));\n        pwzDst = pwzFin;\n        pwzDstEnd = pwzFin + wcNew;\n        pwzDst = LoadCommandLine(pwzLine, pwzDst, pwzDstEnd);\n        *pwzDst = '\\0';\n\n        FileNames::ParameterizeLine(pwzFin, pwzFin + wcNew);\n        if (HasSpace(wzPath)) {\n            Tblog(\"<t:Line>&quot;%le&quot; %le</t:Line>\\n\", wzPath, pwzFin);\n        }\n        else {\n            Tblog(\"<t:Line>%le %le</t:Line>\\n\", wzPath, pwzFin);\n        }\n\n        TestHandle(\"t:StdIn\", GetStdHandle(STD_INPUT_HANDLE));\n        TestHandle(\"t:StdOut\", GetStdHandle(STD_OUTPUT_HANDLE));\n        TestHandle(\"t:StdErr\", GetStdHandle(STD_ERROR_HANDLE));\n    }\n\n    if (FindMsvcr()) {\n        FindProc(&(PVOID&)Real_getenv, \"getenv\");\n        FindProc(&(PVOID&)Real_wgetenv, \"_wgetenv\");\n        FindProc(&(PVOID&)Real_getenv_s, \"getenv_s\");\n        FindProc(&(PVOID&)Real_wgetenv_s, \"_wgetenv_s\");\n        FindProc(&(PVOID&)Real_dupenv_s, \"_dupenv_s\");\n        FindProc(&(PVOID&)Real_wdupenv_s, \"_wdupenv_s\");\n\n        DetourTransactionBegin();\n        DetourUpdateThread(GetCurrentThread());\n\n        DetourAttachIf(&(PVOID&)Real_getenv, Mine_getenv);\n        DetourAttachIf(&(PVOID&)Real_getenv_s, Mine_getenv_s);\n        DetourAttachIf(&(PVOID&)Real_wgetenv, Mine_wgetenv);\n        DetourAttachIf(&(PVOID&)Real_wgetenv, Mine_wgetenv_s);\n        DetourAttachIf(&(PVOID&)Real_dupenv_s, Mine_dupenv_s);\n        DetourAttachIf(&(PVOID&)Real_wdupenv_s, Mine_wdupenv_s);\n\n        DetourTransactionCommit();\n    }\n\n    return Real_EntryPoint();\n}\n\nVOID WINAPI Mine_ExitProcess(UINT a0)\n{\n    if (a0 & 0x80000000) {\n        Tblog(\"<t:Return>%d</t:Return>\\n\", -(int)a0);\n    }\n    else {\n        Tblog(\"<t:Return>%d</t:Return>\\n\", a0);\n    }\n\n    FileNames::Dump();\n    EnvVars::Dump();\n\n    TblogClose();\n\n    Real_ExitProcess(a0);\n}\n\nBOOL APIENTRY DllMain(HINSTANCE hModule, DWORD dwReason, PVOID lpReserved)\n{\n    (void)hModule;\n    (void)lpReserved;\n\n    if (DetourIsHelperProcess()) {\n        return TRUE;\n    }\n\n    if (dwReason == DLL_PROCESS_ATTACH) {\n        DetourRestoreAfterWith();\n        Real_EntryPoint = (int (WINAPI *)(VOID))DetourGetEntryPoint(NULL);\n        return ProcessAttach(hModule);\n    }\n    else if (dwReason == DLL_PROCESS_DETACH) {\n        return ProcessDetach(hModule);\n    }\n    else if (dwReason == DLL_THREAD_ATTACH) {\n        return ThreadAttach(hModule);\n    }\n    else if (dwReason == DLL_THREAD_DETACH) {\n        return ThreadDetach(hModule);\n    }\n    return TRUE;\n}\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/tracebld/trcbld.rc",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Version information for trcbld.rc.\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include \"detver.h\"\n\n#define VER_INTERNALNAME_STR        \"trcbld\" DETOURS_STRINGIFY(DETOURS_BITS)\n#define VER_ORIGINALFILENAME_STR    \"trcbld\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\"\n#define VER_FILEDESCRIPTION_STR     \"Detours Build Tracing Module\"\n#define VER_COMPANYNAME_STR         \"Microsoft Corporation\"\n\n#include \"common.ver\"\n"
  },
  {
    "path": "ext/detours/samples/tracelnk/Makefile",
    "content": "##############################################################################\n##\n##  Utility to trace Dynamic Linking.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\nLIBS=$(LIBS) kernel32.lib\n\n##############################################################################\n\nall: dirs \\\n    $(BIND)\\trclnk$(DETOURS_BITS).dll \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\trclnk$(DETOURS_BITS).bsc \\\n!ENDIF\n    option\n\n##############################################################################\n\nclean:\n    -del *~ test.txt 2>nul\n    -del $(BIND)\\trclnk*.* 2>nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo .   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo .   Created $(OBJD)\n\n##############################################################################\n\n$(OBJD)\\trclnk.obj : trclnk.cpp\n\n$(OBJD)\\trclnk.res : trclnk.rc\n\n$(BIND)\\trclnk$(DETOURS_BITS).dll : $(OBJD)\\trclnk.obj $(OBJD)\\trclnk.res $(DEPS)\n    cl /LD $(CFLAGS) /Fe$@ /Fd$(@R).pdb \\\n        $(OBJD)\\trclnk.obj $(OBJD)\\trclnk.res \\\n        /link $(LINKFLAGS) /subsystem:console \\\n        /export:DetourFinishHelperProcess,@1,NONAME \\\n        $(LIBS)\n\n$(OBJD)\\trclnk$(DETOURS_BITS).bsc : $(OBJD)\\trclnk.obj\n    bscmake /v /n /o $@ $(OBJD)\\trclnk.sbr\n\n############################################### Install non-bit-size binaries.\n\n!IF \"$(DETOURS_OPTION_PROCESSOR)\" != \"\"\n\n$(OPTD)\\trclnk$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\trclnk$(DETOURS_OPTION_BITS).pdb:\n\n$(BIND)\\trclnk$(DETOURS_OPTION_BITS).dll : $(OPTD)\\trclnk$(DETOURS_OPTION_BITS).dll\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\trclnk$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\trclnk$(DETOURS_OPTION_BITS).pdb\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n\noption: \\\n    $(BIND)\\trclnk$(DETOURS_OPTION_BITS).dll \\\n    $(BIND)\\trclnk$(DETOURS_OPTION_BITS).pdb \\\n\n!ELSE\n\noption:\n\n!ENDIF\n\n##############################################################################\n\nnotepad: all\n    @echo -------- Logging output to test.txt ------------\n    start $(BIND)\\syelogd.exe /o test.txt\n    $(BIND)\\sleep5.exe 1\n    @echo -------- Should load trclnk$(DETOURS_BITS).dll dynamically using withdll.exe ------------\n    @echo .\n    @echo ** NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE **\n    @echo **\n    @echo ** Close the NotePad window to continue test.\n    @echo **\n    @echo ** NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE **\n    @echo .\n    $(BIND)\\withdll -d:$(BIND)\\trclnk$(DETOURS_BITS).dll $(SYSTEMROOT)\\system32\\notepad.exe\n    @echo -------- Log from syelog -------------\n    type test.txt\n\ntest: all\n    @echo -------- Logging output to test.txt ------------\n    start $(BIND)\\syelogd.exe /o test.txt\n    $(BIND)\\sleep5.exe 1\n    @echo -------- Should load trclnk$(DETOURS_BITS).dll dynamically using withdll.exe ------------\n    @echo .\n    $(BIND)\\withdll -d:$(BIND)\\trclnk$(DETOURS_BITS).dll $(SYSTEMROOT)\\system32\\cmd.exe /c dir\n    @echo -------- Log from syelog -------------\n    type test.txt\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/tracelnk/trclnk.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (trclnk.cpp of trclnk.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#define _WIN32_WINNT        0x0400\n#define WIN32\n#define NT\n\n#define DBG_TRACE   0\n\n#include <windows.h>\n#include <stdio.h>\n#include \"detours.h\"\n#include \"syelog.h\"\n\n#define PULONG_PTR          PVOID\n#define PLONG_PTR           PVOID\n#define ULONG_PTR           PVOID\n#define ENUMRESNAMEPROCA    PVOID\n#define ENUMRESNAMEPROCW    PVOID\n#define ENUMRESLANGPROCA    PVOID\n#define ENUMRESLANGPROCW    PVOID\n#define ENUMRESTYPEPROCA    PVOID\n#define ENUMRESTYPEPROCW    PVOID\n#define STGOPTIONS          PVOID\n\n//////////////////////////////////////////////////////////////////////////////\n#pragma warning(disable:4127)   // Many of our asserts are constants.\n\n#define ASSERT_ALWAYS(x)   \\\n    do {                                                        \\\n    if (!(x)) {                                                 \\\n            AssertMessage(#x, __FILE__, __LINE__);              \\\n            DebugBreak();                                       \\\n    }                                                           \\\n    } while (0)\n\n#ifndef NDEBUG\n#define ASSERT(x)           ASSERT_ALWAYS(x)\n#else\n#define ASSERT(x)\n#endif\n\n#define UNUSED(c)    (c) = (c)\n\n//////////////////////////////////////////////////////////////////////////////\nstatic HMODULE s_hInst = NULL;\nstatic WCHAR s_wzDllPath[MAX_PATH];\n\nBOOL ProcessEnumerate();\nBOOL InstanceEnumerate(HINSTANCE hInst);\nBOOL ImportEnumerate(HINSTANCE hInst);\n\nVOID _PrintEnter(const CHAR *psz, ...);\nVOID _PrintExit(const CHAR *psz, ...);\nVOID _Print(const CHAR *psz, ...);\nVOID _VPrint(PCSTR msg, va_list args, PCHAR pszBuf, LONG cbBuf);\n\nVOID AssertMessage(CONST PCHAR pszMsg, CONST PCHAR pszFile, ULONG nLine);\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// Trampolines\n//\nextern \"C\" {\n    //  Trampolines for SYELOG library.\n    //\n    HANDLE (WINAPI *\n            Real_CreateFileW)(LPCWSTR a0, DWORD a1, DWORD a2,\n                              LPSECURITY_ATTRIBUTES a3, DWORD a4, DWORD a5,\n                              HANDLE a6)\n        = CreateFileW;\n\n    BOOL (WINAPI *\n          Real_WriteFile)(HANDLE hFile,\n                          LPCVOID lpBuffer,\n                          DWORD nNumberOfBytesToWrite,\n                          LPDWORD lpNumberOfBytesWritten,\n                          LPOVERLAPPED lpOverlapped)\n        = WriteFile;\n    BOOL (WINAPI *\n          Real_FlushFileBuffers)(HANDLE hFile)\n        = FlushFileBuffers;\n    BOOL (WINAPI *\n          Real_CloseHandle)(HANDLE hObject)\n        = CloseHandle;\n\n    BOOL (WINAPI *\n          Real_WaitNamedPipeW)(LPCWSTR lpNamedPipeName, DWORD nTimeOut)\n        = WaitNamedPipeW;\n    BOOL (WINAPI *\n          Real_SetNamedPipeHandleState)(HANDLE hNamedPipe,\n                                        LPDWORD lpMode,\n                                        LPDWORD lpMaxCollectionCount,\n                                        LPDWORD lpCollectDataTimeout)\n        = SetNamedPipeHandleState;\n\n    DWORD (WINAPI *\n           Real_GetCurrentProcessId)(VOID)\n        = GetCurrentProcessId;\n    VOID (WINAPI *\n          Real_GetSystemTimeAsFileTime)(LPFILETIME lpSystemTimeAsFileTime)\n        = GetSystemTimeAsFileTime;\n\n    VOID (WINAPI *\n          Real_InitializeCriticalSection)(LPCRITICAL_SECTION lpSection)\n        = InitializeCriticalSection;\n    VOID (WINAPI *\n          Real_EnterCriticalSection)(LPCRITICAL_SECTION lpSection)\n        = EnterCriticalSection;\n    VOID (WINAPI *\n          Real_LeaveCriticalSection)(LPCRITICAL_SECTION lpSection)\n        = LeaveCriticalSection;\n}\n\nBOOL (WINAPI *\n      Real_FreeLibrary)(HMODULE a0)\n    = FreeLibrary;\n\nDWORD (WINAPI *\n       Real_GetModuleFileNameW)(HMODULE a0,\n                                LPWSTR a1,\n                                DWORD a2)\n    = GetModuleFileNameW;\n\nHMODULE (WINAPI *\n         Real_GetModuleHandleW)(LPCWSTR a0)\n    = GetModuleHandleW;\n\nFARPROC (WINAPI *\n         Real_GetProcAddress)(HMODULE a0,\n                              LPCSTR a1)\n    = GetProcAddress;\n\nHMODULE (WINAPI *\n         Real_LoadLibraryExW)(LPCWSTR a0,\n                              HANDLE a1,\n                              DWORD a2)\n    = LoadLibraryExW;\n\nHMODULE (WINAPI *\n         Real_LoadLibraryW)(LPCWSTR a0)\n    = LoadLibraryW;\n\n//////////////////////////////////////////////////////////////////////////////\n//\nBOOL WINAPI Mine_FreeLibrary(HMODULE a0)\n{\n    (void)a0;\n\n    return TRUE;\n}\n\nDWORD WINAPI Mine_GetModuleFileNameW(HMODULE a0,\n                                     LPWSTR a1,\n                                     DWORD a2)\n{\n    return Real_GetModuleFileNameW(a0, a1, a2);\n}\n\nHMODULE WINAPI Mine_GetModuleHandleW(LPCWSTR a0)\n{\n    return Real_GetModuleHandleW(a0);\n}\n\nFARPROC WINAPI Mine_GetProcAddress(HMODULE a0,\n                                   LPCSTR a1)\n{\n    _PrintEnter(\"GetProcAddress(%p,%hs)\\n\", a0, a1);\n\n    FARPROC rv = 0;\n    __try {\n        rv = Real_GetProcAddress(a0, a1);\n    } __finally {\n        _PrintExit(\"GetProcAddress(,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHMODULE WINAPI Mine_LoadLibraryExW(LPCWSTR a0,\n                                   HANDLE a1,\n                                   DWORD a2)\n{\n    _PrintEnter(\"LoadLibraryExW(%ls,%p,%x)\\n\", a0, a1, a2);\n\n    HMODULE rv = 0;\n    __try {\n        rv = Real_LoadLibraryExW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"LoadLibraryExW(,,) -> %p\\n\", rv);\n        if (rv) {\n            InstanceEnumerate(rv);\n            ImportEnumerate(rv);\n        }\n    };\n    return rv;\n}\n\nHMODULE WINAPI Mine_LoadLibraryW(LPCWSTR a0)\n{\n    _PrintEnter(\"LoadLibraryW(%ls)\\n\", a0);\n\n    HMODULE rv = 0;\n    __try {\n        rv = Real_LoadLibraryW(a0);\n    } __finally {\n        _PrintExit(\"LoadLibraryW() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\n/////////////////////////////////////////////////////////////\n// AttachDetours\n//\nPCHAR DetRealName(PCHAR psz)\n{\n    PCHAR pszBeg = psz;\n    // Move to end of name.\n    while (*psz) {\n        psz++;\n    }\n    // Move back through A-Za-z0-9 names.\n    while (psz > pszBeg &&\n           ((psz[-1] >= 'A' && psz[-1] <= 'Z') ||\n            (psz[-1] >= 'a' && psz[-1] <= 'z') ||\n            (psz[-1] >= '0' && psz[-1] <= '9'))) {\n        psz--;\n    }\n    return psz;\n}\n\nVOID DetAttach(PVOID *ppbReal, PVOID pbMine, PCHAR psz)\n{\n    LONG l = DetourAttach(ppbReal, pbMine);\n    if (l != 0) {\n        Syelog(SYELOG_SEVERITY_NOTICE,\n               \"Attach failed: `%s': error %d\\n\", DetRealName(psz), l);\n    }\n}\n\nVOID DetDetach(PVOID *ppbReal, PVOID pbMine, PCHAR psz)\n{\n    LONG l = DetourDetach(ppbReal, pbMine);\n    if (l != 0) {\n        Syelog(SYELOG_SEVERITY_NOTICE,\n               \"Detach failed: `%s': error %d\\n\", DetRealName(psz), l);\n    }\n}\n\n#define ATTACH(x)       DetAttach(&(PVOID&)Real_##x,Mine_##x,#x)\n#define DETACH(x)       DetDetach(&(PVOID&)Real_##x,Mine_##x,#x)\n\nLONG AttachDetours(VOID)\n{\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n\n    ATTACH(FreeLibrary);\n    ATTACH(GetModuleHandleW);\n    ATTACH(GetProcAddress);\n    ATTACH(LoadLibraryExW);\n    ATTACH(LoadLibraryW);\n\n    return DetourTransactionCommit();\n}\n\nLONG DetachDetours(VOID)\n{\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n\n    DETACH(FreeLibrary);\n    DETACH(GetModuleHandleW);\n    DETACH(GetProcAddress);\n    DETACH(LoadLibraryExW);\n    DETACH(LoadLibraryW);\n\n    return DetourTransactionCommit();\n}\n\n////////////////////////////////////////////////////////////// Logging System.\n//\nstatic BOOL s_bLog = 1;\nstatic LONG s_nTlsIndent = -1;\nstatic LONG s_nTlsThread = -1;\nstatic LONG s_nThreadCnt = 0;\n\nVOID _PrintEnter(const CHAR *psz, ...)\n{\n    DWORD dwErr = GetLastError();\n\n    LONG nIndent = 0;\n    LONG nThread = 0;\n    if (s_nTlsIndent >= 0) {\n        nIndent = (LONG)(LONG_PTR)TlsGetValue(s_nTlsIndent);\n        TlsSetValue(s_nTlsIndent, (PVOID)(LONG_PTR)(nIndent + 1));\n    }\n    if (s_nTlsThread >= 0) {\n        nThread = (LONG)(LONG_PTR)TlsGetValue(s_nTlsThread);\n    }\n\n    if (s_bLog && psz) {\n        CHAR szBuf[1024];\n        PCHAR pszBuf = szBuf;\n        PCHAR pszEnd = szBuf + ARRAYSIZE(szBuf) - 1;\n        LONG nLen = (nIndent > 0) ? (nIndent < 35 ? nIndent * 2 : 70) : 0;\n        *pszBuf++ = (CHAR)('0' + ((nThread / 100) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 10) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 1) % 10));\n        *pszBuf++ = ' ';\n        while (nLen-- > 0) {\n            *pszBuf++ = ' ';\n        }\n\n        va_list  args;\n        va_start(args, psz);\n\n        while ((*pszBuf++ = *psz++) != 0 && pszBuf < pszEnd) {\n            // Copy characters.\n        }\n        *pszEnd = '\\0';\n        SyelogV(SYELOG_SEVERITY_INFORMATION, szBuf, args);\n\n        va_end(args);\n    }\n    SetLastError(dwErr);\n}\n\nVOID _PrintExit(const CHAR *psz, ...)\n{\n    DWORD dwErr = GetLastError();\n\n    LONG nIndent = 0;\n    LONG nThread = 0;\n    if (s_nTlsIndent >= 0) {\n        nIndent = (LONG)(LONG_PTR)TlsGetValue(s_nTlsIndent) - 1;\n        ASSERT(nIndent >= 0);\n        TlsSetValue(s_nTlsIndent, (PVOID)(LONG_PTR)nIndent);\n    }\n    if (s_nTlsThread >= 0) {\n        nThread = (LONG)(LONG_PTR)TlsGetValue(s_nTlsThread);\n    }\n\n    if (s_bLog && psz) {\n        CHAR szBuf[1024];\n        PCHAR pszBuf = szBuf;\n        PCHAR pszEnd = szBuf + ARRAYSIZE(szBuf) - 1;\n        LONG nLen = (nIndent > 0) ? (nIndent < 35 ? nIndent * 2 : 70) : 0;\n        *pszBuf++ = (CHAR)('0' + ((nThread / 100) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 10) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 1) % 10));\n        *pszBuf++ = ' ';\n        while (nLen-- > 0) {\n            *pszBuf++ = ' ';\n        }\n\n        va_list  args;\n        va_start(args, psz);\n\n        while ((*pszBuf++ = *psz++) != 0 && pszBuf < pszEnd) {\n            // Copy characters.\n        }\n        *pszEnd = '\\0';\n        SyelogV(SYELOG_SEVERITY_INFORMATION, szBuf, args);\n\n        va_end(args);\n    }\n    SetLastError(dwErr);\n}\n\nVOID _Print(const CHAR *psz, ...)\n{\n    DWORD dwErr = GetLastError();\n\n    LONG nIndent = 0;\n    LONG nThread = 0;\n    if (s_nTlsIndent >= 0) {\n        nIndent = (LONG)(LONG_PTR)TlsGetValue(s_nTlsIndent);\n    }\n    if (s_nTlsThread >= 0) {\n        nThread = (LONG)(LONG_PTR)TlsGetValue(s_nTlsThread);\n    }\n\n    if (s_bLog && psz) {\n        CHAR szBuf[1024];\n        PCHAR pszBuf = szBuf;\n        PCHAR pszEnd = szBuf + ARRAYSIZE(szBuf) - 1;\n        LONG nLen = (nIndent > 0) ? (nIndent < 35 ? nIndent * 2 : 70) : 0;\n        *pszBuf++ = (CHAR)('0' + ((nThread / 100) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 10) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 1) % 10));\n        *pszBuf++ = ' ';\n        while (nLen-- > 0) {\n            *pszBuf++ = ' ';\n        }\n\n        va_list  args;\n        va_start(args, psz);\n\n        while ((*pszBuf++ = *psz++) != 0 && pszBuf < pszEnd) {\n            // Copy characters.\n        }\n        *pszEnd = '\\0';\n        SyelogV(SYELOG_SEVERITY_INFORMATION, szBuf, args);\n\n        va_end(args);\n    }\n    SetLastError(dwErr);\n}\n\nVOID AssertMessage(CONST PCHAR pszMsg, CONST PCHAR pszFile, ULONG nLine)\n{\n    Syelog(SYELOG_SEVERITY_FATAL,\n           \"ASSERT(%s) failed in %s, line %d.\\n\", pszMsg, pszFile, nLine);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nPIMAGE_NT_HEADERS NtHeadersForInstance(HINSTANCE hInst)\n{\n    PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hInst;\n    __try {\n        if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) {\n            SetLastError(ERROR_BAD_EXE_FORMAT);\n            return NULL;\n        }\n\n        PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)((PBYTE)pDosHeader +\n                                                          pDosHeader->e_lfanew);\n        if (pNtHeader->Signature != IMAGE_NT_SIGNATURE) {\n            SetLastError(ERROR_INVALID_EXE_SIGNATURE);\n            return NULL;\n        }\n        if (pNtHeader->FileHeader.SizeOfOptionalHeader == 0) {\n            SetLastError(ERROR_EXE_MARKED_INVALID);\n            return NULL;\n        }\n        return pNtHeader;\n    } __except(EXCEPTION_EXECUTE_HANDLER) {\n    }\n    SetLastError(ERROR_EXE_MARKED_INVALID);\n\n    return NULL;\n}\n\nstatic inline PBYTE RvaToVa(PBYTE pbBase, DWORD nOffset)\n{\n    return nOffset ? pbBase + nOffset : NULL;\n}\n\n#if _MSC_VER >= 1900\n#pragma warning(push)\n#pragma warning(disable:4456) // declaration hides previous local declaration\n#endif\n\nBOOL ImportEnumerate(HINSTANCE hInst)\n{\n    PBYTE pbBase = (PBYTE)hInst;\n    PIMAGE_NT_HEADERS pNtHeader;                    // Read & Write\n    PIMAGE_SECTION_HEADER pSectionHeaders;\n    DWORD nPeOffset;\n    DWORD nSectionsOffset;\n\n    ////////////////////////////////////////////////////// Process DOS Header.\n    //\n    PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)pbBase;\n    if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) {\n        return FALSE;\n    }\n    nPeOffset = pDosHeader->e_lfanew;\n\n    /////////////////////////////////////////////////////// Process PE Header.\n    //\n    pNtHeader = (PIMAGE_NT_HEADERS)RvaToVa(pbBase, nPeOffset);\n    if (pNtHeader->Signature != IMAGE_NT_SIGNATURE) {\n        return FALSE;\n    }\n    if (pNtHeader->FileHeader.SizeOfOptionalHeader == 0) {\n        return FALSE;\n    }\n    nSectionsOffset = nPeOffset\n        + sizeof(pNtHeader->Signature)\n        + sizeof(pNtHeader->FileHeader)\n        + pNtHeader->FileHeader.SizeOfOptionalHeader;\n\n    ///////////////////////////////////////////////// Process Section Headers.\n    //\n    pSectionHeaders = (PIMAGE_SECTION_HEADER)RvaToVa(pbBase, nSectionsOffset);\n\n    //////////////////////////////////////////////////////// Get Import Table.\n    //\n    DWORD rvaImageDirectory = pNtHeader->OptionalHeader\n        .DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;\n    PIMAGE_IMPORT_DESCRIPTOR iidp\n        = (PIMAGE_IMPORT_DESCRIPTOR)RvaToVa(pbBase, rvaImageDirectory);\n\n    if (iidp == NULL) {\n        return FALSE;\n    }\n\n    DWORD nFiles = 0;\n    for (; iidp[nFiles].Characteristics != 0; nFiles++) {\n        // Count the files.\n    }\n\n    for (DWORD n = 0; n < nFiles; n++, iidp++) {\n        DWORD rvaName = iidp->Name;\n        PCHAR pszName = (PCHAR)RvaToVa(pbBase, rvaName);\n\n        DWORD rvaThunk = (DWORD)iidp->OriginalFirstThunk;\n        PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA)RvaToVa(pbBase, rvaThunk);\n        rvaThunk = (DWORD)iidp->FirstThunk;\n        PIMAGE_THUNK_DATA pBoundThunk = (PIMAGE_THUNK_DATA)RvaToVa(pbBase, rvaThunk);\n\n        Syelog(SYELOG_SEVERITY_INFORMATION,\n               \"%s [%p %p]\\n\", pszName, pThunk, pBoundThunk);\n\n        DWORD nNames = 0;\n        if (pThunk == NULL) {\n            break;\n        }\n\n        for (; pThunk[nNames].u1.Ordinal; nNames++) {\n            // Count the imports.\n        }\n\n        for (DWORD f = 0; f < nNames; f++) {\n            DWORD nOrdinal = 0;\n            PCHAR pszName = NULL;\n            PDWORD pFunc = (PDWORD)pBoundThunk[f].u1.Function;\n            DWORD rvaName = (DWORD)pThunk[f].u1.Ordinal;\n\n            if (rvaName & IMAGE_ORDINAL_FLAG) {\n                nOrdinal = IMAGE_ORDINAL(rvaName);\n            }\n            else {\n                PIMAGE_IMPORT_BY_NAME pName\n                    = (PIMAGE_IMPORT_BY_NAME)RvaToVa(pbBase, rvaName);\n                if (pName) {\n                    pszName = (PCHAR)pName->Name;\n                }\n            }\n            Syelog(SYELOG_SEVERITY_INFORMATION,\n                   \"  %-32.32s %4I64d %p\\n\", pszName, nOrdinal, pFunc);\n        }\n    }\n    return TRUE;\n}\n\n#if _MSC_VER >= 1900\n#pragma warning(pop)\n#endif\n\nBOOL InstanceEnumerate(HINSTANCE hInst)\n{\n    WCHAR wzDllName[MAX_PATH];\n\n    PIMAGE_NT_HEADERS pinh = NtHeadersForInstance(hInst);\n    if (pinh && Real_GetModuleFileNameW(hInst, wzDllName, ARRAYSIZE(wzDllName))) {\n        Syelog(SYELOG_SEVERITY_INFORMATION,\n               \"### %08lx: %-43.43ls %08x\\n\",\n               hInst, wzDllName, pinh->OptionalHeader.CheckSum);\n        return TRUE;\n    }\n    return FALSE;\n}\n\nBOOL ProcessEnumerate()\n{\n    Syelog(SYELOG_SEVERITY_INFORMATION,\n           \"######################################################### Binaries\\n\");\n    for (HINSTANCE hInst = NULL; (hInst = DetourEnumerateModules(hInst)) != NULL;) {\n        InstanceEnumerate(hInst);\n    }\n    Syelog(SYELOG_SEVERITY_INFORMATION, \"###\\n\");\n\n    return ImportEnumerate(GetModuleHandle(NULL));\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// DLL module information\n//\nBOOL ThreadAttach(HMODULE hDll)\n{\n    (void)hDll;\n\n    if (s_nTlsIndent >= 0) {\n        TlsSetValue(s_nTlsIndent, (PVOID)0);\n    }\n    if (s_nTlsThread >= 0) {\n        LONG nThread = InterlockedIncrement(&s_nThreadCnt);\n        TlsSetValue(s_nTlsThread, (PVOID)(LONG_PTR)nThread);\n    }\n    return TRUE;\n}\n\nBOOL ThreadDetach(HMODULE hDll)\n{\n    (void)hDll;\n\n    if (s_nTlsIndent >= 0) {\n        TlsSetValue(s_nTlsIndent, (PVOID)0);\n    }\n    if (s_nTlsThread >= 0) {\n        TlsSetValue(s_nTlsThread, (PVOID)0);\n    }\n    return TRUE;\n}\n\nBOOL ProcessAttach(HMODULE hDll)\n{\n    s_bLog = FALSE;\n    s_nTlsIndent = TlsAlloc();\n    s_nTlsThread = TlsAlloc();\n    ThreadAttach(hDll);\n\n    WCHAR wzExeName[MAX_PATH];\n\n    s_hInst = hDll;\n    Real_GetModuleFileNameW(hDll, s_wzDllPath, ARRAYSIZE(s_wzDllPath));\n    Real_GetModuleFileNameW(NULL, wzExeName, ARRAYSIZE(wzExeName));\n\n    SyelogOpen(\"trclnk\" DETOURS_STRINGIFY(DETOURS_BITS), SYELOG_FACILITY_APPLICATION);\n    ProcessEnumerate();\n\n    LONG error = AttachDetours();\n    if (error != NO_ERROR) {\n        Syelog(SYELOG_SEVERITY_FATAL, \"### Error attaching detours: %d\\n\", error);\n    }\n\n    s_bLog = TRUE;\n    return TRUE;\n}\n\nBOOL ProcessDetach(HMODULE hDll)\n{\n    ThreadDetach(hDll);\n    s_bLog = FALSE;\n\n    LONG error = DetachDetours();\n    if (error != NO_ERROR) {\n        Syelog(SYELOG_SEVERITY_FATAL, \"### Error detaching detours: %d\\n\", error);\n    }\n\n    Syelog(SYELOG_SEVERITY_NOTICE, \"### Closing.\\n\");\n    SyelogClose(FALSE);\n\n    if (s_nTlsIndent >= 0) {\n        TlsFree(s_nTlsIndent);\n    }\n    if (s_nTlsThread >= 0) {\n        TlsFree(s_nTlsThread);\n    }\n    return TRUE;\n}\n\nBOOL APIENTRY DllMain(HINSTANCE hModule, DWORD dwReason, PVOID lpReserved)\n{\n    (void)hModule;\n    (void)lpReserved;\n\n    if (DetourIsHelperProcess()) {\n        return TRUE;\n    }\n\n    switch (dwReason) {\n      case DLL_PROCESS_ATTACH:\n        DetourRestoreAfterWith();\n        return ProcessAttach(hModule);\n      case DLL_PROCESS_DETACH:\n        return ProcessDetach(hModule);\n      case DLL_THREAD_ATTACH:\n        return ThreadAttach(hModule);\n      case DLL_THREAD_DETACH:\n        return ThreadDetach(hModule);\n    }\n    return TRUE;\n}\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/tracelnk/trclnk.rc",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Version information for trclnk.rc.\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include \"detver.h\"\n\n#define VER_INTERNALNAME_STR        \"trclnk\" DETOURS_STRINGIFY(DETOURS_BITS)\n#define VER_ORIGINALFILENAME_STR    \"trclnk\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\"\n#define VER_FILEDESCRIPTION_STR     \"Detours Dynamic Linking Trace Module\"\n#define VER_COMPANYNAME_STR         \"Microsoft Corporation\"\n\n#include \"common.ver\"\n"
  },
  {
    "path": "ext/detours/samples/tracemem/Makefile",
    "content": "##############################################################################\n##\n##  Utility to trace HeapAlloc APIs.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\nLIBS=$(LIBS) kernel32.lib\n\nall: dirs \\\n    $(BIND)\\trcmem$(DETOURS_BITS).dll \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\trcmem$(DETOURS_BITS).bsc \\\n!ENDIF\n    option\n\nclean:\n    -del *~ test.txt 2>nul\n    -del $(BIND)\\trcmem*.* 2>nul\n    -rmdir /q /s $(OBJD) 2>nul\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\n##############################################################################\n\n$(OBJD)\\trcmem.obj : trcmem.cpp\n\n$(OBJD)\\trcmem.res : trcmem.rc\n\n$(BIND)\\trcmem$(DETOURS_BITS).dll : $(OBJD)\\trcmem.obj $(OBJD)\\trcmem.res $(DEPS)\n    cl /LD $(CFLAGS) /Fe$@ /Fd$(@R).pdb \\\n        $(OBJD)\\trcmem.obj $(OBJD)\\trcmem.res \\\n        /link $(LINKFLAGS) /subsystem:console \\\n        /export:DetourFinishHelperProcess,@1,NONAME \\\n        $(LIBS)\n\n$(OBJD)\\trcmem$(DETOURS_BITS).bsc : $(OBJD)\\trcmem.obj\n    bscmake /v /n /o $@ $(OBJD)\\trcmem.sbr\n\n############################################### Install non-bit-size binaries.\n\n!IF \"$(DETOURS_OPTION_PROCESSOR)\" != \"\"\n\n$(OPTD)\\trcmem$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\trcmem$(DETOURS_OPTION_BITS).pdb:\n\n$(BIND)\\trcmem$(DETOURS_OPTION_BITS).dll : $(OPTD)\\trcmem$(DETOURS_OPTION_BITS).dll\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\trcmem$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\trcmem$(DETOURS_OPTION_BITS).pdb\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n\noption: \\\n    $(BIND)\\trcmem$(DETOURS_OPTION_BITS).dll \\\n    $(BIND)\\trcmem$(DETOURS_OPTION_BITS).pdb \\\n\n!ELSE\n\noption:\n\n!ENDIF\n\n##############################################################################\n\ntest: all\n    @echo -------- Logging output to test.txt ------------\n    start $(BIND)\\syelogd.exe /o test.txt\n    $(BIND)\\sleep5.exe 1\n    @echo -------- Should load trcmem$(DETOURS_BITS).dll dynamically using withdll.exe ------------\n    $(BIND)\\withdll -d:$(BIND)\\trcmem$(DETOURS_BITS).dll $(BIND)\\sleepold.exe\n    @echo -------- Log from syelog -------------\n    type test.txt\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/tracemem/trcmem.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (trcmem.cpp of trcmem.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#define _WIN32_WINNT        0x0400\n#define WIN32\n#define NT\n\n#define DBG_TRACE   0\n\n#include <windows.h>\n#include <stdio.h>\n#include \"detours.h\"\n#include \"syelog.h\"\n\n#define PULONG_PTR          PVOID\n#define PLONG_PTR           PVOID\n#define ULONG_PTR           PVOID\n#define ENUMRESNAMEPROCA    PVOID\n#define ENUMRESNAMEPROCW    PVOID\n#define ENUMRESLANGPROCA    PVOID\n#define ENUMRESLANGPROCW    PVOID\n#define ENUMRESTYPEPROCA    PVOID\n#define ENUMRESTYPEPROCW    PVOID\n#define STGOPTIONS          PVOID\n\n//////////////////////////////////////////////////////////////////////////////\n\n#pragma warning(disable:4127)   // Many of our asserts are constants.\n\n#define ASSERT_ALWAYS(x)   \\\n    do {                                                        \\\n    if (!(x)) {                                                 \\\n            AssertMessage(#x, __FILE__, __LINE__);              \\\n            DebugBreak();                                       \\\n    }                                                           \\\n    } while (0)\n\n#ifndef NDEBUG\n#define ASSERT(x)           ASSERT_ALWAYS(x)\n#else\n#define ASSERT(x)\n#endif\n\n#define UNUSED(c)    (c) = (c)\n\n//////////////////////////////////////////////////////////////////////////////\nstatic HMODULE s_hInst = NULL;\nstatic CHAR s_szDllPath[MAX_PATH];\n\nVOID _PrintEnter(const CHAR *psz, ...);\nVOID _PrintExit(const CHAR *psz, ...);\nVOID _Print(const CHAR *psz, ...);\nVOID _VPrint(PCSTR msg, va_list args, PCHAR pszBuf, LONG cbBuf);\n\nVOID AssertMessage(CONST PCHAR pszMsg, CONST PCHAR pszFile, ULONG nLine);\n\n//////////////////////////////////////////////////////////////////////////////\n// Trampolines\n//\nextern \"C\" {\n\n    HANDLE (WINAPI *\n            Real_CreateFileW)(LPCWSTR a0,\n                              DWORD a1,\n                              DWORD a2,\n                              LPSECURITY_ATTRIBUTES a3,\n                              DWORD a4,\n                              DWORD a5,\n                              HANDLE a6)\n        = CreateFileW;\n\n    BOOL (WINAPI *\n          Real_WriteFile)(HANDLE hFile,\n                          LPCVOID lpBuffer,\n                          DWORD nNumberOfBytesToWrite,\n                          LPDWORD lpNumberOfBytesWritten,\n                          LPOVERLAPPED lpOverlapped)\n        = WriteFile;\n    BOOL (WINAPI *\n          Real_FlushFileBuffers)(HANDLE hFile)\n        = FlushFileBuffers;\n    BOOL (WINAPI *\n          Real_CloseHandle)(HANDLE hObject)\n        = CloseHandle;\n\n    BOOL (WINAPI *\n          Real_WaitNamedPipeW)(LPCWSTR lpNamedPipeName, DWORD nTimeOut)\n        = WaitNamedPipeW;\n    BOOL (WINAPI *\n          Real_SetNamedPipeHandleState)(HANDLE hNamedPipe,\n                                        LPDWORD lpMode,\n                                        LPDWORD lpMaxCollectionCount,\n                                        LPDWORD lpCollectDataTimeout)\n        = SetNamedPipeHandleState;\n\n    DWORD (WINAPI *\n           Real_GetCurrentProcessId)(VOID)\n        = GetCurrentProcessId;\n    VOID (WINAPI *\n          Real_GetSystemTimeAsFileTime)(LPFILETIME lpSystemTimeAsFileTime)\n        = GetSystemTimeAsFileTime;\n\n    VOID (WINAPI *\n          Real_InitializeCriticalSection)(LPCRITICAL_SECTION lpSection)\n        = InitializeCriticalSection;\n    VOID (WINAPI *\n          Real_EnterCriticalSection)(LPCRITICAL_SECTION lpSection)\n        = EnterCriticalSection;\n    VOID (WINAPI *\n          Real_LeaveCriticalSection)(LPCRITICAL_SECTION lpSection)\n        = LeaveCriticalSection;\n}\n\n#if _MSC_VER < 1300\nLPVOID (WINAPI *\n        Real_HeapAlloc)(HANDLE hHeap, DWORD dwFlags, DWORD dwBytes)\n    = HeapAlloc;\n#else\nLPVOID (WINAPI *\n        Real_HeapAlloc)(HANDLE hHeap, DWORD dwFlags, DWORD_PTR dwBytes)\n    = HeapAlloc;\n#endif\n\nDWORD (WINAPI * Real_GetModuleFileNameW)(HMODULE a0,\n                                         LPWSTR a1,\n                                         DWORD a2)\n    = GetModuleFileNameW;\n\nDWORD (WINAPI * Real_GetModuleFileNameA)(HMODULE a0,\n                                         LPSTR a1,\n                                         DWORD a2)\n    = GetModuleFileNameA;\n\nBOOL (WINAPI * Real_CreateProcessW)(LPCWSTR a0,\n                                    LPWSTR a1,\n                                    LPSECURITY_ATTRIBUTES a2,\n                                    LPSECURITY_ATTRIBUTES a3,\n                                    BOOL a4,\n                                    DWORD a5,\n                                    LPVOID a6,\n                                    LPCWSTR a7,\n                                    struct _STARTUPINFOW* a8,\n                                    LPPROCESS_INFORMATION a9)\n    = CreateProcessW;\n\n//////////////////////////////////////////////////////////////////////////////\n// Detours\n//\n#if _MSC_VER < 1300\nLPVOID WINAPI Mine_HeapAlloc(HANDLE hHeap, DWORD dwFlags, DWORD dwBytes)\n#else\nLPVOID WINAPI Mine_HeapAlloc(HANDLE hHeap, DWORD dwFlags, DWORD_PTR dwBytes)\n#endif\n{\n    _PrintEnter(\"HeapAlloc(%p, %x, %p))\\n\", hHeap, dwFlags, dwBytes);\n\n    LPVOID rv = 0;\n    __try {\n        rv = Real_HeapAlloc(hHeap, dwFlags, dwBytes);\n    } __finally {\n        _PrintExit(\"HeapAlloc() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_CreateProcessW(LPCWSTR lpApplicationName,\n                                LPWSTR lpCommandLine,\n                                LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                BOOL bInheritHandles,\n                                DWORD dwCreationFlags,\n                                LPVOID lpEnvironment,\n                                LPCWSTR lpCurrentDirectory,\n                                LPSTARTUPINFOW lpStartupInfo,\n                                LPPROCESS_INFORMATION lpProcessInformation)\n{\n    _PrintEnter(\"CreateProcessW(%ls,%ls,%p,%p,%x,%x,%p,%ls,%p,%p)\\n\",\n                lpApplicationName,\n                lpCommandLine,\n                lpProcessAttributes,\n                lpThreadAttributes,\n                bInheritHandles,\n                dwCreationFlags,\n                lpEnvironment,\n                lpCurrentDirectory,\n                lpStartupInfo,\n                lpProcessInformation);\n\n    _Print(\"Calling DetourCreateProcessWithDllExW(,%hs)\\n\", s_szDllPath);\n\n    BOOL rv = 0;\n    __try {\n        rv = DetourCreateProcessWithDllExW(lpApplicationName,\n                                           lpCommandLine,\n                                           lpProcessAttributes,\n                                           lpThreadAttributes,\n                                           bInheritHandles,\n                                           dwCreationFlags,\n                                           lpEnvironment,\n                                           lpCurrentDirectory,\n                                           lpStartupInfo,\n                                           lpProcessInformation,\n                                           s_szDllPath,\n                                           Real_CreateProcessW);\n    } __finally {\n        _PrintExit(\"CreateProcessW(,,,,,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n// AttachDetours\n//\nPCHAR DetRealName(PCHAR psz)\n{\n    PCHAR pszBeg = psz;\n    // Move to end of name.\n    while (*psz) {\n        psz++;\n    }\n    // Move back through A-Za-z0-9 names.\n    while (psz > pszBeg &&\n           ((psz[-1] >= 'A' && psz[-1] <= 'Z') ||\n            (psz[-1] >= 'a' && psz[-1] <= 'z') ||\n            (psz[-1] >= '0' && psz[-1] <= '9'))) {\n        psz--;\n    }\n    return psz;\n}\n\nVOID DetAttach(PVOID *ppbReal, PVOID pbMine, PCHAR psz)\n{\n    LONG l = DetourAttach(ppbReal, pbMine);\n    if (l != 0) {\n        Syelog(SYELOG_SEVERITY_NOTICE,\n               \"Attach failed: `%s': error %d\\n\", DetRealName(psz), l);\n    }\n}\n\nVOID DetDetach(PVOID *ppbReal, PVOID pbMine, PCHAR psz)\n{\n    LONG l = DetourDetach(ppbReal, pbMine);\n    if (l != 0) {\n        Syelog(SYELOG_SEVERITY_NOTICE,\n               \"Detach failed: `%s': error %d\\n\", DetRealName(psz), l);\n    }\n}\n\n#define ATTACH(x)       DetAttach(&(PVOID&)Real_##x,Mine_##x,#x)\n#define DETACH(x)       DetDetach(&(PVOID&)Real_##x,Mine_##x,#x)\n\nLONG AttachDetours(VOID)\n{\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n\n    ATTACH(CreateProcessW);\n    ATTACH(HeapAlloc);\n\n    return DetourTransactionCommit();\n}\n\nLONG DetachDetours(VOID)\n{\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n\n    DETACH(CreateProcessW);\n    DETACH(HeapAlloc);\n\n    return DetourTransactionCommit();\n}\n\n////////////////////////////////////////////////////////////// Logging System.\n//\nstatic BOOL s_bLog = FALSE;\nstatic LONG s_nTlsIndent = -1;\nstatic LONG s_nTlsThread = -1;\nstatic LONG s_nThreadCnt = 0;\n\nVOID _PrintEnter(const CHAR *psz, ...)\n{\n    DWORD dwErr = GetLastError();\n\n    LONG nIndent = 0;\n    LONG nThread = 0;\n    if (s_nTlsIndent >= 0) {\n        nIndent = (LONG)(LONG_PTR)TlsGetValue(s_nTlsIndent);\n        TlsSetValue(s_nTlsIndent, (PVOID)(LONG_PTR)(nIndent + 1));\n    }\n    if (s_nTlsThread >= 0) {\n        nThread = (LONG)(LONG_PTR)TlsGetValue(s_nTlsThread);\n    }\n\n    if (s_bLog && psz) {\n        CHAR szBuf[1024];\n        PCHAR pszBuf = szBuf;\n        PCHAR pszEnd = szBuf + ARRAYSIZE(szBuf) - 1;\n        LONG nLen = (nIndent > 0) ? (nIndent < 35 ? nIndent * 2 : 70) : 0;\n        *pszBuf++ = (CHAR)('0' + ((nThread / 100) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 10) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 1) % 10));\n        *pszBuf++ = ' ';\n        while (nLen-- > 0) {\n            *pszBuf++ = ' ';\n        }\n\n        va_list  args;\n        va_start(args, psz);\n\n        while ((*pszBuf++ = *psz++) != 0 && pszBuf < pszEnd) {\n            // Copy characters.\n        }\n        *pszEnd = '\\0';\n        SyelogV(SYELOG_SEVERITY_INFORMATION, szBuf, args);\n\n        va_end(args);\n    }\n    SetLastError(dwErr);\n}\n\nVOID _PrintExit(const CHAR *psz, ...)\n{\n    DWORD dwErr = GetLastError();\n\n    LONG nIndent = 0;\n    LONG nThread = 0;\n    if (s_nTlsIndent >= 0) {\n        nIndent = (LONG)(LONG_PTR)TlsGetValue(s_nTlsIndent) - 1;\n        ASSERT(nIndent >= 0);\n        TlsSetValue(s_nTlsIndent, (PVOID)(LONG_PTR)nIndent);\n    }\n    if (s_nTlsThread >= 0) {\n        nThread = (LONG)(LONG_PTR)TlsGetValue(s_nTlsThread);\n    }\n\n    if (s_bLog && psz) {\n        CHAR szBuf[1024];\n        PCHAR pszBuf = szBuf;\n        PCHAR pszEnd = szBuf + ARRAYSIZE(szBuf) - 1;\n        LONG nLen = (nIndent > 0) ? (nIndent < 35 ? nIndent * 2 : 70) : 0;\n        *pszBuf++ = (CHAR)('0' + ((nThread / 100) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 10) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 1) % 10));\n        *pszBuf++ = ' ';\n        while (nLen-- > 0) {\n            *pszBuf++ = ' ';\n        }\n\n        va_list  args;\n        va_start(args, psz);\n\n        while ((*pszBuf++ = *psz++) != 0 && pszBuf < pszEnd) {\n            // Copy characters.\n        }\n        *pszEnd = '\\0';\n        SyelogV(SYELOG_SEVERITY_INFORMATION,\n                szBuf, args);\n\n        va_end(args);\n    }\n    SetLastError(dwErr);\n}\n\nVOID _Print(const CHAR *psz, ...)\n{\n    DWORD dwErr = GetLastError();\n\n    LONG nIndent = 0;\n    LONG nThread = 0;\n    if (s_nTlsIndent >= 0) {\n        nIndent = (LONG)(LONG_PTR)TlsGetValue(s_nTlsIndent);\n    }\n    if (s_nTlsThread >= 0) {\n        nThread = (LONG)(LONG_PTR)TlsGetValue(s_nTlsThread);\n    }\n\n    if (s_bLog && psz) {\n        CHAR szBuf[1024];\n        PCHAR pszBuf = szBuf;\n        PCHAR pszEnd = szBuf + ARRAYSIZE(szBuf) - 1;\n        LONG nLen = (nIndent > 0) ? (nIndent < 35 ? nIndent * 2 : 70) : 0;\n        *pszBuf++ = (CHAR)('0' + ((nThread / 100) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 10) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 1) % 10));\n        *pszBuf++ = ' ';\n        while (nLen-- > 0) {\n            *pszBuf++ = ' ';\n        }\n\n        va_list  args;\n        va_start(args, psz);\n\n        while ((*pszBuf++ = *psz++) != 0 && pszBuf < pszEnd) {\n            // Copy characters.\n        }\n        *pszEnd = '\\0';\n        SyelogV(SYELOG_SEVERITY_INFORMATION,\n                szBuf, args);\n\n        va_end(args);\n    }\n\n    SetLastError(dwErr);\n}\n\nVOID AssertMessage(CONST PCHAR pszMsg, CONST PCHAR pszFile, ULONG nLine)\n{\n    Syelog(SYELOG_SEVERITY_FATAL,\n           \"ASSERT(%s) failed in %s, line %d.\\n\", pszMsg, pszFile, nLine);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// DLL module information\n//\nBOOL ThreadAttach(HMODULE hDll)\n{\n    (void)hDll;\n\n    if (s_nTlsIndent >= 0) {\n        TlsSetValue(s_nTlsIndent, (PVOID)0);\n    }\n    if (s_nTlsThread >= 0) {\n        LONG nThread = InterlockedIncrement(&s_nThreadCnt);\n        TlsSetValue(s_nTlsThread, (PVOID)(LONG_PTR)nThread);\n    }\n    return TRUE;\n}\n\nBOOL ThreadDetach(HMODULE hDll)\n{\n    (void)hDll;\n\n    if (s_nTlsIndent >= 0) {\n        TlsSetValue(s_nTlsIndent, (PVOID)0);\n    }\n    if (s_nTlsThread >= 0) {\n        TlsSetValue(s_nTlsThread, (PVOID)0);\n    }\n    return TRUE;\n}\n\nBOOL ProcessAttach(HMODULE hDll)\n{\n    s_bLog = FALSE;\n    s_nTlsIndent = TlsAlloc();\n    s_nTlsThread = TlsAlloc();\n\n    WCHAR wzExePath[MAX_PATH];\n\n    s_hInst = hDll;\n    Real_GetModuleFileNameA(s_hInst, s_szDllPath, ARRAYSIZE(s_szDllPath));\n    Real_GetModuleFileNameW(NULL, wzExePath, ARRAYSIZE(wzExePath));\n\n    SyelogOpen(\"trcmem\" DETOURS_STRINGIFY(DETOURS_BITS), SYELOG_FACILITY_APPLICATION);\n    Syelog(SYELOG_SEVERITY_INFORMATION, \"##########################################\\n\");\n    Syelog(SYELOG_SEVERITY_INFORMATION, \"### %ls\\n\", wzExePath);\n\n    LONG error = AttachDetours();\n    if (error != NO_ERROR) {\n        Syelog(SYELOG_SEVERITY_FATAL, \"### Error attaching detours: %d\\n\", error);\n    }\n\n    ThreadAttach(hDll);\n\n    s_bLog = TRUE;\n    return TRUE;\n}\n\nBOOL ProcessDetach(HMODULE hDll)\n{\n    ThreadDetach(hDll);\n    s_bLog = FALSE;\n\n    LONG error = DetachDetours();\n    if (error != NO_ERROR) {\n        Syelog(SYELOG_SEVERITY_FATAL, \"### Error detaching detours: %d\\n\", error);\n    }\n\n    Syelog(SYELOG_SEVERITY_NOTICE, \"### Closing.\\n\");\n    SyelogClose(FALSE);\n\n    if (s_nTlsIndent >= 0) {\n        TlsFree(s_nTlsIndent);\n    }\n    if (s_nTlsThread >= 0) {\n        TlsFree(s_nTlsThread);\n    }\n    return TRUE;\n}\n\nBOOL APIENTRY DllMain(HINSTANCE hModule, DWORD dwReason, PVOID lpReserved)\n{\n    (void)hModule;\n    (void)lpReserved;\n\n    if (DetourIsHelperProcess()) {\n        return TRUE;\n    }\n\n    switch (dwReason) {\n      case DLL_PROCESS_ATTACH:\n        DetourRestoreAfterWith();\n        return ProcessAttach(hModule);\n      case DLL_PROCESS_DETACH:\n        return ProcessDetach(hModule);\n      case DLL_THREAD_ATTACH:\n        return ThreadAttach(hModule);\n      case DLL_THREAD_DETACH:\n        return ThreadDetach(hModule);\n    }\n    return TRUE;\n}\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/tracemem/trcmem.rc",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Version information for trcmem.rc.\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include \"detver.h\"\n\n#define VER_INTERNALNAME_STR        \"trcmem\" DETOURS_STRINGIFY(DETOURS_BITS)\n#define VER_ORIGINALFILENAME_STR    \"trcmem\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\"\n#define VER_FILEDESCRIPTION_STR     \"Detours Memory Trace Module\"\n#define VER_COMPANYNAME_STR         \"Microsoft Corporation\"\n\n#include \"common.ver\"\n"
  },
  {
    "path": "ext/detours/samples/tracereg/Makefile",
    "content": "##############################################################################\n##\n##  Utility to registry and file access APIs.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\nLIBS=$(LIBS) kernel32.lib advapi32.lib\n\nall: dirs \\\n    $(BIND)\\trcreg$(DETOURS_BITS).dll \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\trcreg$(DETOURS_BITS).bsc \\\n!ENDIF\n    option\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\nclean:\n    -del *~ test.txt 2>nul\n    -del $(BIND)\\trcreg*.* 2>nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\n##############################################################################\n\n$(OBJD)\\trcreg.obj : trcreg.cpp\n\n$(OBJD)\\trcreg.res : trcreg.rc\n\n$(BIND)\\trcreg$(DETOURS_BITS).dll : $(OBJD)\\trcreg.obj $(OBJD)\\trcreg.res $(DEPS)\n    cl /LD $(CFLAGS) /Fe$@ /Fd$(@R).pdb \\\n        $(OBJD)\\trcreg.obj $(OBJD)\\trcreg.res \\\n        /link $(LINKFLAGS) /subsystem:console \\\n        /export:DetourFinishHelperProcess,@1,NONAME \\\n        $(LIBS)\n\n$(OBJD)\\trcreg$(DETOURS_BITS).bsc : $(OBJD)\\trcreg.obj\n    bscmake /v /n /o $@ $(OBJD)\\trcreg.sbr\n\n############################################### Install non-bit-size binaries.\n\n!IF \"$(DETOURS_OPTION_PROCESSOR)\" != \"\"\n\n$(OPTD)\\trcreg$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\trcreg$(DETOURS_OPTION_BITS).pdb:\n\n$(BIND)\\trcreg$(DETOURS_OPTION_BITS).dll : $(OPTD)\\trcreg$(DETOURS_OPTION_BITS).dll\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\trcreg$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\trcreg$(DETOURS_OPTION_BITS).pdb\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n\noption: \\\n    $(BIND)\\trcreg$(DETOURS_OPTION_BITS).dll \\\n    $(BIND)\\trcreg$(DETOURS_OPTION_BITS).pdb \\\n\n!ELSE\n\noption:\n\n!ENDIF\n\n##############################################################################\n\ntest: all\n    @echo -------- Logging output to test.txt ------------\n    start $(BIND)\\syelogd.exe /o test.txt\n    $(BIND)\\sleep5.exe 1\n    @echo -------- Should load trcreg$(DETOURS_BITS).dll dynamically using withdll.exe ------------\n    $(BIND)\\withdll -d:$(BIND)\\trcreg$(DETOURS_BITS).dll $(BIND)\\sleepold.exe\n    @echo -------- Log from syelog -------------\n    type test.txt\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/tracereg/trcreg.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (trcreg.cpp of trcreg.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#define _WIN32_WINNT        0x0400\n#define WIN32\n#define NT\n\n#define DBG_TRACE   0\n\n#include <windows.h>\n#include <stdio.h>\n#include \"detours.h\"\n#include \"syelog.h\"\n\n#define PULONG_PTR          PVOID\n#define PLONG_PTR           PVOID\n#define ULONG_PTR           PVOID\n#define ENUMRESNAMEPROCA    PVOID\n#define ENUMRESNAMEPROCW    PVOID\n#define ENUMRESLANGPROCA    PVOID\n#define ENUMRESLANGPROCW    PVOID\n#define ENUMRESTYPEPROCA    PVOID\n#define ENUMRESTYPEPROCW    PVOID\n#define STGOPTIONS          PVOID\n\n//////////////////////////////////////////////////////////////////////////////\n#pragma warning(disable:4127)   // Many of our asserts are constants.\n\n#define ASSERT_ALWAYS(x)   \\\n    do {                                                        \\\n    if (!(x)) {                                                 \\\n            AssertMessage(#x, __FILE__, __LINE__);              \\\n            DebugBreak();                                       \\\n    }                                                           \\\n    } while (0)\n\n#ifndef NDEBUG\n#define ASSERT(x)           ASSERT_ALWAYS(x)\n#else\n#define ASSERT(x)\n#endif\n\n#define UNUSED(c)       (c) = (c)\n\n//////////////////////////////////////////////////////////////////////////////\nstatic HMODULE s_hInst = NULL;\nstatic CHAR s_szDllPath[MAX_PATH];\n\nBOOL ProcessEnumerate();\nBOOL InstanceEnumerate(HINSTANCE hInst);\n\nVOID _PrintEnter(PCSTR psz, ...);\nVOID _PrintExit(PCSTR psz, ...);\nVOID _Print(PCSTR psz, ...);\n\nVOID AssertMessage(CONST PCHAR pszMsg, CONST PCHAR pszFile, ULONG nLine);\n\n//////////////////////////////////////////////////////////////////////////////\n//\nextern \"C\" {\n    HANDLE (WINAPI *\n            Real_CreateFileW)(LPCWSTR a0,\n                              DWORD a1,\n                              DWORD a2,\n                              LPSECURITY_ATTRIBUTES a3,\n                              DWORD a4,\n                              DWORD a5,\n                              HANDLE a6)\n        = CreateFileW;\n\n    BOOL (WINAPI *\n          Real_WriteFile)(HANDLE hFile,\n                          LPCVOID lpBuffer,\n                          DWORD nNumberOfBytesToWrite,\n                          LPDWORD lpNumberOfBytesWritten,\n                          LPOVERLAPPED lpOverlapped)\n        = WriteFile;\n    BOOL (WINAPI *\n          Real_FlushFileBuffers)(HANDLE hFile)\n        = FlushFileBuffers;\n    BOOL (WINAPI *\n          Real_CloseHandle)(HANDLE hObject)\n        = CloseHandle;\n\n    BOOL (WINAPI *\n          Real_WaitNamedPipeW)(LPCWSTR lpNamedPipeName, DWORD nTimeOut)\n        = WaitNamedPipeW;\n    BOOL (WINAPI *\n          Real_SetNamedPipeHandleState)(HANDLE hNamedPipe,\n                                        LPDWORD lpMode,\n                                        LPDWORD lpMaxCollectionCount,\n                                        LPDWORD lpCollectDataTimeout)\n        = SetNamedPipeHandleState;\n\n    DWORD (WINAPI *\n           Real_GetCurrentProcessId)(VOID)\n        = GetCurrentProcessId;\n    VOID (WINAPI *\n          Real_GetSystemTimeAsFileTime)(LPFILETIME lpSystemTimeAsFileTime)\n        = GetSystemTimeAsFileTime;\n\n    VOID (WINAPI *\n          Real_InitializeCriticalSection)(LPCRITICAL_SECTION lpSection)\n        = InitializeCriticalSection;\n    VOID (WINAPI *\n          Real_EnterCriticalSection)(LPCRITICAL_SECTION lpSection)\n        = EnterCriticalSection;\n    VOID (WINAPI *\n          Real_LeaveCriticalSection)(LPCRITICAL_SECTION lpSection)\n        = LeaveCriticalSection;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\n\nBOOL (WINAPI * Real_CopyFileExA)(LPCSTR a0,\n                                 LPCSTR a1,\n                                 LPPROGRESS_ROUTINE a2,\n                                 LPVOID a3,\n                                 LPBOOL a4,\n                                 DWORD a5)\n    = CopyFileExA;\n\nBOOL (WINAPI * Real_CopyFileExW)(LPCWSTR a0,\n                                 LPCWSTR a1,\n                                 LPPROGRESS_ROUTINE a2,\n                                 LPVOID a3,\n                                 LPBOOL a4,\n                                 DWORD a5)\n    = CopyFileExW;\n\nBOOL (WINAPI * Real_CreateDirectoryExW)(LPCWSTR a0,\n                                        LPCWSTR a1,\n                                        LPSECURITY_ATTRIBUTES a2)\n    = CreateDirectoryExW;\n\nBOOL (WINAPI * Real_CreateDirectoryW)(LPCWSTR a0,\n                                      LPSECURITY_ATTRIBUTES a1)\n    = CreateDirectoryW;\n\nBOOL (WINAPI * Real_CreateProcessW)(LPCWSTR lpApplicationName,\n                                    LPWSTR lpCommandLine,\n                                    LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                    LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                    BOOL bInheritHandles,\n                                    DWORD dwCreationFlags,\n                                    LPVOID lpEnvironment,\n                                    LPCWSTR lpCurrentDirectory,\n                                    LPSTARTUPINFOW lpStartupInfo,\n                                    LPPROCESS_INFORMATION lpProcessInformation)\n    = CreateProcessW;\n\nBOOL (WINAPI * Real_DeleteFileA)(LPCSTR a0)\n    = DeleteFileA;\n\nBOOL (WINAPI * Real_DeleteFileW)(LPCWSTR a0)\n    = DeleteFileW;\n\nHANDLE (WINAPI * Real_FindFirstFileExA)(LPCSTR a0,\n                                        FINDEX_INFO_LEVELS a1,\n                                        LPVOID a2,\n                                        FINDEX_SEARCH_OPS a3,\n                                        LPVOID a4,\n                                        DWORD a5)\n    = FindFirstFileExA;\n\nHANDLE (WINAPI * Real_FindFirstFileExW)(LPCWSTR a0,\n                                        FINDEX_INFO_LEVELS a1,\n                                        LPVOID a2,\n                                        FINDEX_SEARCH_OPS a3,\n                                        LPVOID a4,\n                                        DWORD a5)\n    = FindFirstFileExW;\n\nDWORD (WINAPI * Real_GetFileAttributesW)(LPCWSTR a0)\n    = GetFileAttributesW;\n\nDWORD (WINAPI * Real_GetModuleFileNameW)(HMODULE a0,\n                                         LPWSTR a1,\n                                         DWORD a2)\n    = GetModuleFileNameW;\n\nDWORD (WINAPI * Real_GetModuleFileNameA)(HMODULE a0,\n                                         LPSTR a1,\n                                         DWORD a2)\n    = GetModuleFileNameA;\n\nFARPROC (WINAPI * Real_GetProcAddress)(struct HINSTANCE__* a0,\n                                       LPCSTR a1)\n    = GetProcAddress;\n\nHMODULE (WINAPI * Real_LoadLibraryExW)(LPCWSTR a0,\n                                       HANDLE a1,\n                                       DWORD a2)\n    = LoadLibraryExW;\n\nBOOL (WINAPI * Real_MoveFileA)(LPCSTR a0,\n                               LPCSTR a1)\n    = MoveFileA;\n\nBOOL (WINAPI * Real_MoveFileExA)(LPCSTR a0,\n                                 LPCSTR a1,\n                                 DWORD a2)\n    = MoveFileExA;\n\nBOOL (WINAPI * Real_MoveFileExW)(LPCWSTR a0,\n                                 LPCWSTR a1,\n                                 DWORD a2)\n    = MoveFileExW;\n\nBOOL (WINAPI * Real_MoveFileW)(LPCWSTR a0,\n                               LPCWSTR a1)\n    = MoveFileW;\n\nHFILE (WINAPI * Real_OpenFile)(LPCSTR a0,\n                               struct _OFSTRUCT* a1,\n                               UINT a2)\n    = OpenFile;\n\nLONG (WINAPI * Real_RegCreateKeyExA)(HKEY a0,\n                                     LPCSTR a1,\n                                     DWORD a2,\n                                     LPSTR a3,\n                                     DWORD a4,\n                                     REGSAM a5,\n                                     LPSECURITY_ATTRIBUTES a6,\n                                     PHKEY a7,\n                                     LPDWORD a8)\n    = RegCreateKeyExA;\n\nLONG (WINAPI * Real_RegCreateKeyExW)(HKEY a0,\n                                     LPCWSTR a1,\n                                     DWORD a2,\n                                     LPWSTR a3,\n                                     DWORD a4,\n                                     REGSAM a5,\n                                     LPSECURITY_ATTRIBUTES a6,\n                                     PHKEY a7,\n                                     LPDWORD a8)\n    = RegCreateKeyExW;\n\nLONG (WINAPI * Real_RegDeleteKeyA)(HKEY a0,\n                                   LPCSTR a1)\n    = RegDeleteKeyA;\n\nLONG (WINAPI * Real_RegDeleteKeyW)(HKEY a0,\n                                   LPCWSTR a1)\n    = RegDeleteKeyW;\n\nLONG (WINAPI * Real_RegDeleteValueA)(HKEY a0,\n                                     LPCSTR a1)\n    = RegDeleteValueA;\n\n\nLONG (WINAPI * Real_RegDeleteValueW)(HKEY a0,\n                                     LPCWSTR a1)\n    = RegDeleteValueW;\n\nLONG (WINAPI * Real_RegEnumKeyExA)(HKEY a0,\n                                   DWORD a1,\n                                   LPSTR a2,\n                                   LPDWORD a3,\n                                   LPDWORD a4,\n                                   LPSTR a5,\n                                   LPDWORD a6,\n                                   struct _FILETIME* a7)\n    = RegEnumKeyExA;\n\nLONG (WINAPI * Real_RegEnumKeyExW)(HKEY a0,\n                                   DWORD a1,\n                                   LPWSTR a2,\n                                   LPDWORD a3,\n                                   LPDWORD a4,\n                                   LPWSTR a5,\n                                   LPDWORD a6,\n                                   struct _FILETIME* a7)\n    = RegEnumKeyExW;\n\nLONG (WINAPI * Real_RegEnumValueA)(HKEY a0,\n                                   DWORD a1,\n                                   LPSTR a2,\n                                   LPDWORD a3,\n                                   LPDWORD a4,\n                                   LPDWORD a5,\n                                   LPBYTE a6,\n                                   LPDWORD a7)\n    = RegEnumValueA;\n\nLONG (WINAPI * Real_RegEnumValueW)(HKEY a0,\n                                   DWORD a1,\n                                   LPWSTR a2,\n                                   LPDWORD a3,\n                                   LPDWORD a4,\n                                   LPDWORD a5,\n                                   LPBYTE a6,\n                                   LPDWORD a7)\n    = RegEnumValueW;\n\nLONG (WINAPI * Real_RegOpenKeyExA)(HKEY a0,\n                                   LPCSTR a1,\n                                   DWORD a2,\n                                   REGSAM a3,\n                                   PHKEY a4)\n    = RegOpenKeyExA;\n\nLONG (WINAPI * Real_RegOpenKeyExW)(HKEY a0,\n                                   LPCWSTR a1,\n                                   DWORD a2,\n                                   REGSAM a3,\n                                   PHKEY a4)\n    = RegOpenKeyExW;\n\nLONG (WINAPI * Real_RegQueryInfoKeyA)(HKEY a0,\n                                      LPSTR a1,\n                                      LPDWORD a2,\n                                      LPDWORD a3,\n                                      LPDWORD a4,\n                                      LPDWORD a5,\n                                      LPDWORD a6,\n                                      LPDWORD a7,\n                                      LPDWORD a8,\n                                      LPDWORD a9,\n                                      LPDWORD a10,\n                                      struct _FILETIME* a11)\n    = RegQueryInfoKeyA;\n\nLONG (WINAPI * Real_RegQueryInfoKeyW)(HKEY a0,\n                                      LPWSTR a1,\n                                      LPDWORD a2,\n                                      LPDWORD a3,\n                                      LPDWORD a4,\n                                      LPDWORD a5,\n                                      LPDWORD a6,\n                                      LPDWORD a7,\n                                      LPDWORD a8,\n                                      LPDWORD a9,\n                                      LPDWORD a10,\n                                      struct _FILETIME* a11)\n    = RegQueryInfoKeyW;\n\nLONG (WINAPI * Real_RegQueryValueExA)(HKEY a0,\n                                      LPCSTR a1,\n                                      LPDWORD a2,\n                                      LPDWORD a3,\n                                      LPBYTE a4,\n                                      LPDWORD a5)\n    = RegQueryValueExA;\n\nLONG (WINAPI * Real_RegQueryValueExW)(HKEY a0,\n                                      LPCWSTR a1,\n                                      LPDWORD a2,\n                                      LPDWORD a3,\n                                      LPBYTE a4,\n                                      LPDWORD a5)\n    = RegQueryValueExW;\n\nLONG (WINAPI * Real_RegSetValueExA)(HKEY a0,\n                                    LPCSTR a1,\n                                    DWORD a2,\n                                    DWORD a3,\n                                    const BYTE* a4,\n                                    DWORD a5)\n    = RegSetValueExA;\n\nLONG (WINAPI * Real_RegSetValueExW)(HKEY a0,\n                                    LPCWSTR a1,\n                                    DWORD a2,\n                                    DWORD a3,\n                                    const BYTE* a4,\n                                    DWORD a5)\n    = RegSetValueExW;\n\nHFILE (WINAPI * Real__lcreat)(LPCSTR a0,\n                              int a1)\n    = _lcreat;\n\nHFILE (WINAPI * Real__lopen)(LPCSTR a0,\n                             int a1)\n    = _lopen;\n\n/////////////////////////////////////////////////////////////\n// Detours\n//\nBOOL WINAPI Mine_WaitNamedPipeW(LPCWSTR lpNamedPipeName, DWORD nTimeOut)\n{\n    return Real_WaitNamedPipeW(lpNamedPipeName, nTimeOut);\n}\n\nBOOL WINAPI Mine_CloseHandle(HANDLE hObject)\n{\n    return Real_CloseHandle(hObject);\n}\n\nVOID WINAPI Mine_GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime)\n{\n    Real_GetSystemTimeAsFileTime(lpSystemTimeAsFileTime);\n}\n\nBOOL WINAPI Mine_SetNamedPipeHandleState(HANDLE hNamedPipe,\n                                            LPDWORD lpMode,\n                                            LPDWORD lpMaxCollectionCount,\n                                            LPDWORD lpCollectDataTimeout)\n{\n    return Real_SetNamedPipeHandleState(hNamedPipe,\n                                        lpMode,\n                                        lpMaxCollectionCount,\n                                        lpCollectDataTimeout);\n}\n\nBOOL WINAPI Mine_WriteFile(HANDLE hFile,\n                           LPCVOID lpBuffer,\n                           DWORD nNumberOfBytesToWrite,\n                           LPDWORD lpNumberOfBytesWritten,\n                           LPOVERLAPPED lpOverlapped)\n{\n    return Real_WriteFile(hFile,\n                          lpBuffer,\n                          nNumberOfBytesToWrite,\n                          lpNumberOfBytesWritten,\n                          lpOverlapped);\n}\n\nBOOL WINAPI Mine_CreateProcessW(LPCWSTR lpApplicationName,\n                                LPWSTR lpCommandLine,\n                                LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                BOOL bInheritHandles,\n                                DWORD dwCreationFlags,\n                                LPVOID lpEnvironment,\n                                LPCWSTR lpCurrentDirectory,\n                                LPSTARTUPINFOW lpStartupInfo,\n                                LPPROCESS_INFORMATION lpProcessInformation)\n{\n    _PrintEnter(\"CreateProcessW(%ls,%ls,%p,%p,%x,%x,%p,%ls,%p,%p)\\n\",\n                lpApplicationName,\n                lpCommandLine,\n                lpProcessAttributes,\n                lpThreadAttributes,\n                bInheritHandles,\n                dwCreationFlags,\n                lpEnvironment,\n                lpCurrentDirectory,\n                lpStartupInfo,\n                lpProcessInformation);\n\n    _Print(\"Calling DetourCreateProcessWithDllExW(,%hs)\\n\", s_szDllPath);\n\n    BOOL rv = 0;\n    __try {\n        rv = DetourCreateProcessWithDllExW(lpApplicationName,\n                                           lpCommandLine,\n                                           lpProcessAttributes,\n                                           lpThreadAttributes,\n                                           bInheritHandles,\n                                           dwCreationFlags,\n                                           lpEnvironment,\n                                           lpCurrentDirectory,\n                                           lpStartupInfo,\n                                           lpProcessInformation,\n                                           s_szDllPath,\n                                           Real_CreateProcessW);\n    } __finally {\n        _PrintExit(\"CreateProcessW(,,,,,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\n//\n//////////////////////////////////////////////////////////////////////////////\n\nBOOL WINAPI Mine_CopyFileExA(LPCSTR a0,\n                             LPCSTR a1,\n                             LPPROGRESS_ROUTINE a2,\n                             LPVOID a3,\n                             LPBOOL a4,\n                             DWORD a5)\n{\n    _PrintEnter(\"CopyFileExA(%hs,%hs,%p,%p,%p,%x)\\n\", a0, a1, a2, a3, a4, a5);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CopyFileExA(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"CopyFileExA(,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_CopyFileExW(LPCWSTR a0,\n                             LPCWSTR a1,\n                             LPPROGRESS_ROUTINE a2,\n                             LPVOID a3,\n                             LPBOOL a4,\n                             DWORD a5)\n{\n    _PrintEnter(\"CopyFileExW(%ls,%ls,%p,%p,%p,%x)\\n\", a0, a1, a2, a3, a4, a5);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CopyFileExW(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"CopyFileExW(,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_CreateDirectoryExW(LPCWSTR a0,\n                                    LPCWSTR a1,\n                                    LPSECURITY_ATTRIBUTES a2)\n{\n    _PrintEnter(\"CreateDirectoryExW(%ls,%ls,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CreateDirectoryExW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"CreateDirectoryExW(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_CreateDirectoryW(LPCWSTR a0,\n                                  LPSECURITY_ATTRIBUTES a1)\n{\n    _PrintEnter(\"CreateDirectoryW(%ls,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CreateDirectoryW(a0, a1);\n    } __finally {\n        _PrintExit(\"CreateDirectoryW(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE WINAPI Mine_CreateFileW(LPCWSTR a0,\n                               DWORD a1,\n                               DWORD a2,\n                               LPSECURITY_ATTRIBUTES a3,\n                               DWORD a4,\n                               DWORD a5,\n                               HANDLE a6)\n{\n    _PrintEnter(NULL);\n    HANDLE rv = 0;\n    __try {\n        rv = Real_CreateFileW(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"CreateFileW(%ls,%x,%x,%p,%x,%x,%p) -> %p\\n\",\n                   a0, a1, a2, a3, a4, a5, a6, rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_DeleteFileA(LPCSTR a0)\n{\n    _PrintEnter(\"DeleteFileA(%hs)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DeleteFileA(a0);\n    } __finally {\n        _PrintExit(\"DeleteFileA() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_DeleteFileW(LPCWSTR a0)\n{\n    _PrintEnter(\"DeleteFileW(%ls)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_DeleteFileW(a0);\n    } __finally {\n        _PrintExit(\"DeleteFileW() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE WINAPI Mine_FindFirstFileExA(LPCSTR a0,\n                                    FINDEX_INFO_LEVELS a1,\n                                    LPVOID a2,\n                                    FINDEX_SEARCH_OPS a3,\n                                    LPVOID a4,\n                                    DWORD a5)\n{\n    _PrintEnter(\"FindFirstFileExA(%hs,%p,%p,%x,%p,%x)\\n\", a0, a1, a2, a3, a4, a5);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_FindFirstFileExA(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"FindFirstFileExA(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE WINAPI Mine_FindFirstFileExW(LPCWSTR a0,\n                                    FINDEX_INFO_LEVELS a1,\n                                    LPVOID a2,\n                                    FINDEX_SEARCH_OPS a3,\n                                    LPVOID a4,\n                                    DWORD a5)\n{\n    _PrintEnter(NULL);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_FindFirstFileExW(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"FindFirstFileExW(%ls,%x,%p,%x,%p,%x) -> %p\\n\",\n                   a0, a1, a2, a3, a4, a5, rv);\n    };\n    return rv;\n}\n\nDWORD WINAPI Mine_GetFileAttributesW(LPCWSTR a0)\n{\n    _PrintEnter(NULL);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetFileAttributesW(a0);\n    } __finally {\n        _PrintExit(\"GetFileAttributesW(%ls) -> %x\\n\", a0, rv);\n    };\n    return rv;\n}\n\nDWORD WINAPI Mine_GetModuleFileNameW(HMODULE a0, LPWSTR a1, DWORD a2)\n{\n    _PrintEnter(\"GetModuleFileNameW(%p,%p,%x)\\n\", a0, a1, a2);\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetModuleFileNameW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetModuleFileNameW(%p,%p:%ls,%p) -> %p\\n\", a0, a1, a1, a2, rv);\n    };\n    return rv;\n}\n\nFARPROC WINAPI Mine_GetProcAddress(HINSTANCE a0,\n                                   LPCSTR a1)\n{\n    WCHAR wzModule[MAX_PATH] = L\"\";\n    PWCHAR pwzModule = wzModule;\n    if (Real_GetModuleFileNameW(a0, wzModule, ARRAYSIZE(wzModule)) != 0) {\n        if ((pwzModule = wcsrchr(wzModule, '\\\\')) == NULL) {\n            if ((pwzModule = wcsrchr(wzModule, ':')) == NULL) {\n                pwzModule = wzModule;\n            }\n            else {\n                pwzModule++;                            // Skip ':'\n            }\n        }\n        else {\n            pwzModule++;                                // Skip '\\\\'\n        }\n    }\n    else {\n        wzModule[0] = '\\0';\n    }\n\n    _PrintEnter(NULL);\n    FARPROC rv = 0;\n    __try {\n        rv = Real_GetProcAddress(a0, a1);\n    } __finally {\n        if (pwzModule[0] == 0) {\n            _PrintExit(\"GetProcAddress(%p,%hs) -> %p\\n\", a0, a1, rv);\n        }\n        else {\n            _PrintExit(\"GetProcAddress(%p:%ls,%hs) -> %p\\n\", a0, pwzModule, a1, rv);\n        }\n    };\n    return rv;\n}\n\nHMODULE WINAPI Mine_LoadLibraryExW(LPCWSTR a0,\n                                   HANDLE a1,\n                                   DWORD a2)\n{\n    _PrintEnter(\"LoadLibraryExW(%ls,%p,%x)\\n\", a0, a1, a2);\n\n    HMODULE rv = 0;\n    __try {\n        rv = Real_LoadLibraryExW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"LoadLibraryExW(,,) -> %p\\n\", rv);\n        if (rv) {\n            InstanceEnumerate(rv);\n        }\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_MoveFileA(LPCSTR a0,\n                           LPCSTR a1)\n{\n    _PrintEnter(\"MoveFileA(%hs,%hs)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_MoveFileA(a0, a1);\n    } __finally {\n        _PrintExit(\"MoveFileA(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_MoveFileExA(LPCSTR a0,\n                             LPCSTR a1,\n                             DWORD a2)\n{\n    _PrintEnter(\"MoveFileExA(%hs,%hs,%x)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_MoveFileExA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"MoveFileExA(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_MoveFileExW(LPCWSTR a0,\n                             LPCWSTR a1,\n                             DWORD a2)\n{\n    _PrintEnter(\"MoveFileExW(%ls,%ls,%x)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_MoveFileExW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"MoveFileExW(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_MoveFileW(LPCWSTR a0,\n                           LPCWSTR a1)\n{\n    _PrintEnter(\"MoveFileW(%ls,%ls)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_MoveFileW(a0, a1);\n    } __finally {\n        _PrintExit(\"MoveFileW(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHFILE WINAPI Mine_OpenFile(LPCSTR a0,\n                           LPOFSTRUCT a1,\n                           UINT a2)\n{\n    _PrintEnter(\"OpenFile(%hs,%p,%x)\\n\", a0, a1, a2);\n\n    HFILE rv = 0;\n    __try {\n        rv = Real_OpenFile(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"OpenFile(,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nLONG WINAPI Mine_RegCreateKeyExA(HKEY a0,\n                                 LPCSTR a1,\n                                 DWORD a2,\n                                 LPSTR a3,\n                                 DWORD a4,\n                                 REGSAM a5,\n                                 LPSECURITY_ATTRIBUTES a6,\n                                 PHKEY a7,\n                                 LPDWORD a8)\n{\n    _PrintEnter(\"RegCreateKeyExA(%p,%hs,%x,%hs,%x,%x,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8);\n\n    LONG rv = 0;\n    __try {\n        rv = Real_RegCreateKeyExA(a0, a1, a2, a3, a4, a5, a6, a7, a8);\n    } __finally {\n        _PrintExit(\"RegCreateKeyExA(,,,,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nLONG WINAPI Mine_RegCreateKeyExW(HKEY a0,\n                                 LPCWSTR a1,\n                                 DWORD a2,\n                                 LPWSTR a3,\n                                 DWORD a4,\n                                 REGSAM a5,\n                                 LPSECURITY_ATTRIBUTES a6,\n                                 PHKEY a7,\n                                 LPDWORD a8)\n{\n    _PrintEnter(NULL);\n    LONG rv = 0;\n    __try {\n        rv = Real_RegCreateKeyExW(a0, a1, a2, a3, a4, a5, a6, a7, a8);\n    } __finally {\n        _PrintExit(\"RegCreateKeyExW(%p,%ls,%x,%ls,%x,%x,%p,%p,%p) -> %x\\n\",\n                   a0, a1, a2, a3, a4, a5, a6, a7, a8, rv);\n    };\n    return rv;\n}\n\nLONG WINAPI Mine_RegDeleteKeyA(HKEY a0,\n                               LPCSTR a1)\n{\n    _PrintEnter(NULL);\n    LONG rv = 0;\n    __try {\n        rv = Real_RegDeleteKeyA(a0, a1);\n    } __finally {\n        _PrintExit(\"RegDeleteKeyA(%p,%hs) -> %x\\n\", a0, a1, rv);\n    };\n    return rv;\n}\n\nLONG WINAPI Mine_RegDeleteKeyW(HKEY a0,\n                               LPCWSTR a1)\n{\n    _PrintEnter(NULL);\n    LONG rv = 0;\n    __try {\n        rv = Real_RegDeleteKeyW(a0, a1);\n    } __finally {\n        _PrintExit(\"RegDeleteKeyW(%p,%ls) -> %x\\n\", a0, a1, rv);\n    };\n    return rv;\n}\n\nLONG WINAPI Mine_RegDeleteValueA(HKEY a0,\n                                 LPCSTR a1)\n{\n    _PrintEnter(\"RegDeleteValueA(%p,%hs)\\n\", a0, a1);\n\n    LONG rv = 0;\n    __try {\n        rv = Real_RegDeleteValueA(a0, a1);\n    } __finally {\n        _PrintExit(\"RegDeleteValueA(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nLONG WINAPI Mine_RegDeleteValueW(HKEY a0,\n                                 LPCWSTR a1)\n{\n    _PrintEnter(\"RegDeleteValueW(%p,%ls)\\n\", a0, a1);\n\n    LONG rv = 0;\n    __try {\n        rv = Real_RegDeleteValueW(a0, a1);\n    } __finally {\n        _PrintExit(\"RegDeleteValueW(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nLONG WINAPI Mine_RegEnumKeyExA(HKEY a0,\n                               DWORD a1,\n                               LPSTR a2,\n                               LPDWORD a3,\n                               LPDWORD a4,\n                               LPSTR a5,\n                               LPDWORD a6,\n                               LPFILETIME a7)\n{\n    _PrintEnter(\"RegEnumKeyExA(%p,%x,%p,%p,%p,%hs,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7);\n\n    LONG rv = 0;\n    __try {\n        rv = Real_RegEnumKeyExA(a0, a1, a2, a3, a4, a5, a6, a7);\n    } __finally {\n        _PrintExit(\"RegEnumKeyExA(,,%hs,,,%hs,,) -> %x\\n\", a2, a5, rv);\n    };\n    return rv;\n}\n\nLONG WINAPI Mine_RegEnumKeyExW(HKEY a0,\n                               DWORD a1,\n                               LPWSTR a2,\n                               LPDWORD a3,\n                               LPDWORD a4,\n                               LPWSTR a5,\n                               LPDWORD a6,\n                               struct _FILETIME* a7)\n{\n    _PrintEnter(\"RegEnumKeyExW(%p,%x,%p,%p,%p,%ls,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7);\n\n    LONG rv = 0;\n    __try {\n        rv = Real_RegEnumKeyExW(a0, a1, a2, a3, a4, a5, a6, a7);\n    } __finally {\n        _PrintExit(\"RegEnumKeyExW(,,%ls,,,%ls,,) -> %x\\n\", a2, a5, rv);\n    };\n    return rv;\n}\n\nLONG WINAPI Mine_RegEnumValueA(HKEY a0,\n                               DWORD a1,\n                               LPSTR a2,\n                               LPDWORD a3,\n                               LPDWORD a4,\n                               LPDWORD a5,\n                               LPBYTE a6,\n                               LPDWORD a7)\n{\n    _PrintEnter(\"RegEnumValueA(%p,%x,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7);\n\n    LONG rv = 0;\n    __try {\n        rv = Real_RegEnumValueA(a0, a1, a2, a3, a4, a5, a6, a7);\n    } __finally {\n        _PrintExit(\"RegEnumValueA(,,%hs,,,,,) -> %x\\n\", a2, rv);\n    };\n    return rv;\n}\n\nLONG WINAPI Mine_RegEnumValueW(HKEY a0,\n                               DWORD a1,\n                               LPWSTR a2,\n                               LPDWORD a3,\n                               LPDWORD a4,\n                               LPDWORD a5,\n                               LPBYTE a6,\n                               LPDWORD a7)\n{\n    _PrintEnter(\"RegEnumValueW(%p,%x,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7);\n\n    LONG rv = 0;\n    __try {\n        rv = Real_RegEnumValueW(a0, a1, a2, a3, a4, a5, a6, a7);\n    } __finally {\n        _PrintExit(\"RegEnumValueW(,,%ls,,,,,) -> %x\\n\", a2, rv);\n    };\n    return rv;\n}\n\nLONG WINAPI Mine_RegOpenKeyExA(HKEY a0,\n                               LPCSTR a1,\n                               DWORD a2,\n                               REGSAM a3,\n                               PHKEY a4)\n{\n    _PrintEnter(NULL);\n\n    LONG rv = 0;\n    __try {\n        rv = Real_RegOpenKeyExA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"RegOpenKeyExA(%p,%hs,%x,%x,%p) -> %x\\n\",\n                   a0, a1, a2, a3, a4, rv);\n    };\n    return rv;\n}\n\nLONG WINAPI Mine_RegOpenKeyExW(HKEY a0,\n                               LPCWSTR a1,\n                               DWORD a2,\n                               REGSAM a3,\n                               PHKEY a4)\n{\n    _PrintEnter(NULL);\n\n    LONG rv = 0;\n    __try {\n        rv = Real_RegOpenKeyExW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"RegOpenKeyExW(%p,%ls,%x,%x,%p) -> %x\\n\",\n                   a0, a1, a2, a3, a4, rv);\n    };\n    return rv;\n}\n\nLONG WINAPI Mine_RegQueryInfoKeyA(HKEY a0,\n                                  LPSTR a1,\n                                  LPDWORD a2,\n                                  LPDWORD a3,\n                                  LPDWORD a4,\n                                  LPDWORD a5,\n                                  LPDWORD a6,\n                                  LPDWORD a7,\n                                  LPDWORD a8,\n                                  LPDWORD a9,\n                                  LPDWORD a10,\n                                  LPFILETIME a11)\n{\n    _PrintEnter(\"RegQueryInfoKeyA(%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\",\n                a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);\n\n    LONG rv = 0;\n    __try {\n        rv = Real_RegQueryInfoKeyA(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);\n    } __finally {\n        _PrintExit(\"RegQueryInfoKeyA(,%hs,,,,,,,,,,) -> %x\\n\", a1, rv);\n    };\n    return rv;\n}\n\nLONG WINAPI Mine_RegQueryInfoKeyW(HKEY a0,\n                                  LPWSTR a1,\n                                  LPDWORD a2,\n                                  LPDWORD a3,\n                                  LPDWORD a4,\n                                  LPDWORD a5,\n                                  LPDWORD a6,\n                                  LPDWORD a7,\n                                  LPDWORD a8,\n                                  LPDWORD a9,\n                                  LPDWORD a10,\n                                  LPFILETIME a11)\n{\n    _PrintEnter(\"RegQueryInfoKeyW(%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p)\\n\",\n                a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);\n\n    LONG rv = 0;\n    __try {\n        rv = Real_RegQueryInfoKeyW(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);\n    } __finally {\n        _PrintExit(\"RegQueryInfoKeyW(,%ls,,,,,,,,,,) -> %x\\n\", a1, rv);\n    };\n    return rv;\n}\n\nLONG WINAPI Mine_RegQueryValueExA(HKEY a0,\n                                  LPCSTR a1,\n                                  LPDWORD a2,\n                                  LPDWORD a3,\n                                  LPBYTE a4,\n                                  LPDWORD a5)\n{\n    _PrintEnter(NULL);\n\n    LONG rv = 0;\n    __try {\n        rv = Real_RegQueryValueExA(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"RegQueryValueExA(%p,%hs,%p,%p,%p,%p) -> %x\\n\",\n                   a0, a1, a2, a3, a4, a5, rv);\n    };\n    return rv;\n}\n\nLONG WINAPI Mine_RegQueryValueExW(HKEY a0,\n                                  LPCWSTR a1,\n                                  LPDWORD a2,\n                                  LPDWORD a3,\n                                  LPBYTE a4,\n                                  LPDWORD a5)\n{\n    _PrintEnter(NULL);\n    LONG rv = 0;\n    __try {\n        rv = Real_RegQueryValueExW(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"RegQueryValueExW(%p,%ls,%p,%p,%p,%p) -> %x\\n\",\n                    a0, a1, a2, a3, a4, a5, rv);\n    };\n    return rv;\n}\n\nLONG WINAPI Mine_RegSetValueExA(HKEY a0,\n                                LPCSTR a1,\n                                DWORD a2,\n                                DWORD a3,\n                                BYTE* a4,\n                                DWORD a5)\n{\n    _PrintEnter(NULL);\n    LONG rv = 0;\n    __try {\n        rv = Real_RegSetValueExA(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"RegSetValueExA(%p,%hs,%x,%x,%p,%x) -> %x\\n\",\n                   a0, a1, a2, a3, a4, a5, rv);\n    };\n    return rv;\n}\n\nLONG WINAPI Mine_RegSetValueExW(HKEY a0,\n                                   LPCWSTR a1,\n                                   DWORD a2,\n                                   DWORD a3,\n                                   BYTE* a4,\n                                   DWORD a5)\n{\n    _PrintEnter(NULL);\n    LONG rv = 0;\n    __try {\n        rv = Real_RegSetValueExW(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"RegSetValueExW(%p,%ls,%x,%x,%p,%x) -> %x\\n\",\n                   a0, a1, a2, a3, a4, a5, rv);\n    };\n    return rv;\n}\n\nHFILE WINAPI Mine__lcreat(LPCSTR a0, int a1)\n{\n    _PrintEnter(NULL);\n    HFILE rv = 0;\n    __try {\n        rv = Real__lcreat(a0, a1);\n    } __finally {\n        _PrintExit(\"_lcreat(%hs,%x) -> %p\\n\", a0, a1, rv);\n    };\n    return rv;\n}\n\nHFILE WINAPI Mine__lopen(LPCSTR a0, int a1)\n{\n    _PrintEnter(NULL);\n    HFILE rv = 0;\n    __try {\n        rv = Real__lopen(a0, a1);\n    } __finally {\n        _PrintEnter(\"_lopen(%hs,%x) -> %p\\n\", a0, a1, rv);\n    };\n    return rv;\n}\n\n/////////////////////////////////////////////////////////////\n// AttachDetours\n//\nPCHAR DetRealName(PCHAR psz)\n{\n    PCHAR pszBeg = psz;\n    // Move to end of name.\n    while (*psz) {\n        psz++;\n    }\n    // Move back through A-Za-z0-9 names.\n    while (psz > pszBeg &&\n           ((psz[-1] >= 'A' && psz[-1] <= 'Z') ||\n            (psz[-1] >= 'a' && psz[-1] <= 'z') ||\n            (psz[-1] >= '0' && psz[-1] <= '9'))) {\n        psz--;\n    }\n    return psz;\n}\n\nVOID DetAttach(PVOID *ppbReal, PVOID pbMine, PCHAR psz)\n{\n    LONG l = DetourAttach(ppbReal, pbMine);\n    if (l != 0) {\n        Syelog(SYELOG_SEVERITY_NOTICE,\n               \"Attach failed: `%s': error %d\\n\", DetRealName(psz), l);\n    }\n}\n\nVOID DetDetach(PVOID *ppbReal, PVOID pbMine, PCHAR psz)\n{\n    LONG l = DetourDetach(ppbReal, pbMine);\n    if (l != 0) {\n        Syelog(SYELOG_SEVERITY_NOTICE,\n               \"Detach failed: `%s': error %d\\n\", DetRealName(psz), l);\n    }\n}\n\n#define ATTACH(x)       DetAttach(&(PVOID&)Real_##x,Mine_##x,#x)\n#define DETACH(x)       DetDetach(&(PVOID&)Real_##x,Mine_##x,#x)\n\nLONG AttachDetours(VOID)\n{\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n\n    ATTACH(CloseHandle);\n    ATTACH(CopyFileExA);\n    ATTACH(CopyFileExW);\n    ATTACH(CreateDirectoryExW);\n    ATTACH(CreateDirectoryW);\n    ATTACH(CreateFileW);\n    ATTACH(CreateProcessW);\n    ATTACH(DeleteFileA);\n    ATTACH(DeleteFileW);\n    ATTACH(FindFirstFileExA);\n    ATTACH(FindFirstFileExW);\n    ATTACH(GetFileAttributesW);\n    ATTACH(GetModuleFileNameW);\n    ATTACH(GetProcAddress);\n    ATTACH(GetSystemTimeAsFileTime);\n    ATTACH(LoadLibraryExW);\n    ATTACH(MoveFileA);\n    ATTACH(MoveFileExA);\n    ATTACH(MoveFileExW);\n    ATTACH(MoveFileW);\n    ATTACH(OpenFile);\n    ATTACH(RegCreateKeyExA);\n    ATTACH(RegCreateKeyExW);\n    ATTACH(RegDeleteKeyA);\n    ATTACH(RegDeleteKeyW);\n    ATTACH(RegDeleteValueA);\n    ATTACH(RegDeleteValueW);\n    ATTACH(RegEnumKeyExA);\n    ATTACH(RegEnumKeyExW);\n    ATTACH(RegEnumValueA);\n    ATTACH(RegEnumValueW);\n    ATTACH(RegOpenKeyExA);\n    ATTACH(RegOpenKeyExW);\n    ATTACH(RegQueryInfoKeyA);\n    ATTACH(RegQueryInfoKeyW);\n    ATTACH(RegQueryValueExA);\n    ATTACH(RegQueryValueExW);\n    ATTACH(RegSetValueExA);\n    ATTACH(RegSetValueExW);\n    ATTACH(SetNamedPipeHandleState);\n    ATTACH(WaitNamedPipeW);\n    ATTACH(WriteFile);\n    ATTACH(_lcreat);\n    ATTACH(_lopen);\n\n    return DetourTransactionCommit();\n}\n\nLONG DetachDetours(VOID)\n{\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n\n    DETACH(CloseHandle);\n    DETACH(CopyFileExA);\n    DETACH(CopyFileExW);\n    DETACH(CreateDirectoryExW);\n    DETACH(CreateDirectoryW);\n    DETACH(CreateFileW);\n    DETACH(CreateProcessW);\n    DETACH(DeleteFileA);\n    DETACH(DeleteFileW);\n    DETACH(FindFirstFileExA);\n    DETACH(FindFirstFileExW);\n    DETACH(GetFileAttributesW);\n    DETACH(GetModuleFileNameW);\n    DETACH(GetProcAddress);\n    DETACH(GetSystemTimeAsFileTime);\n    DETACH(LoadLibraryExW);\n    DETACH(MoveFileA);\n    DETACH(MoveFileExA);\n    DETACH(MoveFileExW);\n    DETACH(MoveFileW);\n    DETACH(OpenFile);\n    DETACH(RegCreateKeyExA);\n    DETACH(RegCreateKeyExW);\n    DETACH(RegDeleteKeyA);\n    DETACH(RegDeleteKeyW);\n    DETACH(RegDeleteValueA);\n    DETACH(RegDeleteValueW);\n    DETACH(RegEnumKeyExA);\n    DETACH(RegEnumKeyExW);\n    DETACH(RegEnumValueA);\n    DETACH(RegEnumValueW);\n    DETACH(RegOpenKeyExA);\n    DETACH(RegOpenKeyExW);\n    DETACH(RegQueryInfoKeyA);\n    DETACH(RegQueryInfoKeyW);\n    DETACH(RegQueryValueExA);\n    DETACH(RegQueryValueExW);\n    DETACH(RegSetValueExA);\n    DETACH(RegSetValueExW);\n    DETACH(SetNamedPipeHandleState);\n    DETACH(WaitNamedPipeW);\n    DETACH(WriteFile);\n    DETACH(_lcreat);\n    DETACH(_lopen);\n\n    return DetourTransactionCommit();\n}\n//\n//////////////////////////////////////////////////////////////////////////////\n\n\n////////////////////////////////////////////////////////////// Logging System.\n//\nstatic BOOL s_bLog = 1;\nstatic LONG s_nTlsIndent = -1;\nstatic LONG s_nTlsThread = -1;\nstatic LONG s_nThreadCnt = 0;\n\nVOID _PrintEnter(const CHAR *psz, ...)\n{\n    DWORD dwErr = GetLastError();\n\n    LONG nIndent = 0;\n    LONG nThread = 0;\n    if (s_nTlsIndent >= 0) {\n        nIndent = (LONG)(LONG_PTR)TlsGetValue(s_nTlsIndent);\n        TlsSetValue(s_nTlsIndent, (PVOID)(LONG_PTR)(nIndent + 1));\n    }\n    if (s_nTlsThread >= 0) {\n        nThread = (LONG)(LONG_PTR)TlsGetValue(s_nTlsThread);\n    }\n\n    if (s_bLog && psz) {\n        CHAR szBuf[1024];\n        PCHAR pszBuf = szBuf;\n        PCHAR pszEnd = szBuf + ARRAYSIZE(szBuf) - 1;\n        LONG nLen = (nIndent > 0) ? (nIndent < 35 ? nIndent * 2 : 70) : 0;\n        *pszBuf++ = (CHAR)('0' + ((nThread / 100) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 10) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 1) % 10));\n        *pszBuf++ = ' ';\n        while (nLen-- > 0) {\n            *pszBuf++ = ' ';\n        }\n\n        va_list  args;\n        va_start(args, psz);\n\n        while ((*pszBuf++ = *psz++) != 0 && pszBuf < pszEnd) {\n            // Copy characters.\n        }\n        *pszEnd = '\\0';\n        SyelogV(SYELOG_SEVERITY_INFORMATION,\n                szBuf, args);\n\n        va_end(args);\n    }\n    SetLastError(dwErr);\n}\n\nVOID _PrintExit(const CHAR *psz, ...)\n{\n    DWORD dwErr = GetLastError();\n\n    LONG nIndent = 0;\n    LONG nThread = 0;\n    if (s_nTlsIndent >= 0) {\n        nIndent = (LONG)(LONG_PTR)TlsGetValue(s_nTlsIndent) - 1;\n        ASSERT(nIndent >= 0);\n        TlsSetValue(s_nTlsIndent, (PVOID)(LONG_PTR)nIndent);\n    }\n    if (s_nTlsThread >= 0) {\n        nThread = (LONG)(LONG_PTR)TlsGetValue(s_nTlsThread);\n    }\n\n    if (s_bLog && psz) {\n        CHAR szBuf[1024];\n        PCHAR pszBuf = szBuf;\n        PCHAR pszEnd = szBuf + ARRAYSIZE(szBuf) - 1;\n        LONG nLen = (nIndent > 0) ? (nIndent < 35 ? nIndent * 2 : 70) : 0;\n        *pszBuf++ = (CHAR)('0' + ((nThread / 100) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 10) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 1) % 10));\n        *pszBuf++ = ' ';\n        while (nLen-- > 0) {\n            *pszBuf++ = ' ';\n        }\n\n        va_list  args;\n        va_start(args, psz);\n\n        while ((*pszBuf++ = *psz++) != 0 && pszBuf < pszEnd) {\n            // Copy characters.\n        }\n        *pszEnd = '\\0';\n        SyelogV(SYELOG_SEVERITY_INFORMATION,\n                szBuf, args);\n\n        va_end(args);\n    }\n    SetLastError(dwErr);\n}\n\nVOID _Print(const CHAR *psz, ...)\n{\n    DWORD dwErr = GetLastError();\n\n    LONG nIndent = 0;\n    LONG nThread = 0;\n    if (s_nTlsIndent >= 0) {\n        nIndent = (LONG)(LONG_PTR)TlsGetValue(s_nTlsIndent);\n    }\n    if (s_nTlsThread >= 0) {\n        nThread = (LONG)(LONG_PTR)TlsGetValue(s_nTlsThread);\n    }\n\n    if (s_bLog && psz) {\n        CHAR szBuf[1024];\n        PCHAR pszBuf = szBuf;\n        PCHAR pszEnd = szBuf + ARRAYSIZE(szBuf) - 1;\n        LONG nLen = (nIndent > 0) ? (nIndent < 35 ? nIndent * 2 : 70) : 0;\n        *pszBuf++ = (CHAR)('0' + ((nThread / 100) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 10) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 1) % 10));\n        *pszBuf++ = ' ';\n        while (nLen-- > 0) {\n            *pszBuf++ = ' ';\n        }\n\n        va_list  args;\n        va_start(args, psz);\n\n        while ((*pszBuf++ = *psz++) != 0 && pszBuf < pszEnd) {\n            // Copy characters.\n        }\n        *pszEnd = '\\0';\n        SyelogV(SYELOG_SEVERITY_INFORMATION,\n                szBuf, args);\n\n        va_end(args);\n    }\n\n    SetLastError(dwErr);\n}\n\nVOID AssertMessage(CONST PCHAR pszMsg, CONST PCHAR pszFile, ULONG nLine)\n{\n    Syelog(SYELOG_SEVERITY_FATAL,\n           \"ASSERT(%s) failed in %s, line %d.\\n\", pszMsg, pszFile, nLine);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nPIMAGE_NT_HEADERS NtHeadersForInstance(HINSTANCE hInst)\n{\n    PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hInst;\n    __try {\n        if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) {\n            SetLastError(ERROR_BAD_EXE_FORMAT);\n            return NULL;\n        }\n\n        PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)((PBYTE)pDosHeader +\n                                                          pDosHeader->e_lfanew);\n        if (pNtHeader->Signature != IMAGE_NT_SIGNATURE) {\n            SetLastError(ERROR_INVALID_EXE_SIGNATURE);\n            return NULL;\n        }\n        if (pNtHeader->FileHeader.SizeOfOptionalHeader == 0) {\n            SetLastError(ERROR_EXE_MARKED_INVALID);\n            return NULL;\n        }\n        return pNtHeader;\n    } __except(EXCEPTION_EXECUTE_HANDLER) {\n    }\n    SetLastError(ERROR_EXE_MARKED_INVALID);\n\n    return NULL;\n}\n\nBOOL InstanceEnumerate(HINSTANCE hInst)\n{\n    WCHAR wzDllName[MAX_PATH];\n\n    PIMAGE_NT_HEADERS pinh = NtHeadersForInstance(hInst);\n    if (pinh && Real_GetModuleFileNameW(hInst, wzDllName, ARRAYSIZE(wzDllName))) {\n        Syelog(SYELOG_SEVERITY_INFORMATION,\n               \"### %08lx: %-43.43ls %08x\\n\",\n               hInst, wzDllName, pinh->OptionalHeader.CheckSum);\n        return TRUE;\n    }\n    return FALSE;\n}\n\nBOOL ProcessEnumerate()\n{\n    Syelog(SYELOG_SEVERITY_INFORMATION,\n           \"######################################################### Binaries\\n\");\n    for (HINSTANCE hInst = NULL; (hInst = DetourEnumerateModules(hInst)) != NULL;) {\n        InstanceEnumerate(hInst);\n    }\n    return TRUE;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// DLL module information\n//\nBOOL ThreadAttach(HMODULE hDll)\n{\n    (void)hDll;\n\n    if (s_nTlsIndent >= 0) {\n        TlsSetValue(s_nTlsIndent, (PVOID)0);\n    }\n    if (s_nTlsThread >= 0) {\n        LONG nThread = InterlockedIncrement(&s_nThreadCnt);\n        TlsSetValue(s_nTlsThread, (PVOID)(LONG_PTR)nThread);\n    }\n    return TRUE;\n}\n\nBOOL ThreadDetach(HMODULE hDll)\n{\n    (void)hDll;\n\n    if (s_nTlsIndent >= 0) {\n        TlsSetValue(s_nTlsIndent, (PVOID)0);\n    }\n    if (s_nTlsThread >= 0) {\n        TlsSetValue(s_nTlsThread, (PVOID)0);\n    }\n    return TRUE;\n}\n\nBOOL ProcessAttach(HMODULE hDll)\n{\n    s_bLog = FALSE;\n    s_nTlsIndent = TlsAlloc();\n    s_nTlsThread = TlsAlloc();\n\n    s_hInst = hDll;\n    Real_GetModuleFileNameA(s_hInst, s_szDllPath, ARRAYSIZE(s_szDllPath));\n\n    SyelogOpen(\"trcreg\" DETOURS_STRINGIFY(DETOURS_BITS), SYELOG_FACILITY_APPLICATION);\n    ProcessEnumerate();\n\n    LONG error = AttachDetours();\n    if (error != NO_ERROR) {\n        Syelog(SYELOG_SEVERITY_FATAL, \"### Error attaching detours: %d\\n\", error);\n    }\n\n    ThreadAttach(hDll);\n\n    s_bLog = TRUE;\n    return TRUE;\n}\n\nBOOL ProcessDetach(HMODULE hDll)\n{\n    ThreadDetach(hDll);\n    s_bLog = FALSE;\n\n    LONG error = DetachDetours();\n    if (error != NO_ERROR) {\n        Syelog(SYELOG_SEVERITY_FATAL, \"### Error detaching detours: %d\\n\", error);\n    }\n\n    Syelog(SYELOG_SEVERITY_NOTICE, \"### Closing.\\n\");\n    SyelogClose(FALSE);\n\n    if (s_nTlsIndent >= 0) {\n        TlsFree(s_nTlsIndent);\n    }\n    if (s_nTlsThread >= 0) {\n        TlsFree(s_nTlsThread);\n    }\n    return TRUE;\n}\n\nBOOL APIENTRY DllMain(HINSTANCE hModule, DWORD dwReason, PVOID lpReserved)\n{\n    (void)hModule;\n    (void)lpReserved;\n\n    if (DetourIsHelperProcess()) {\n        return TRUE;\n    }\n\n    switch (dwReason) {\n      case DLL_PROCESS_ATTACH:\n        DetourRestoreAfterWith();\n        return ProcessAttach(hModule);\n      case DLL_PROCESS_DETACH:\n        return ProcessDetach(hModule);\n      case DLL_THREAD_ATTACH:\n        return ThreadAttach(hModule);\n      case DLL_THREAD_DETACH:\n        return ThreadDetach(hModule);\n    }\n    return TRUE;\n}\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/tracereg/trcreg.rc",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Version information for trcreg.rc.\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include \"detver.h\"\n\n#define VER_INTERNALNAME_STR        \"trcreg\" DETOURS_STRINGIFY(DETOURS_BITS)\n#define VER_ORIGINALFILENAME_STR    \"trcreg\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\"\n#define VER_FILEDESCRIPTION_STR     \"Detours Registry Trace Module\"\n#define VER_COMPANYNAME_STR         \"Microsoft Corporation\"\n\n#include \"common.ver\"\n"
  },
  {
    "path": "ext/detours/samples/traceser/Makefile",
    "content": "##############################################################################\n##\n##  Utility to trace serial (COM1, COM2, etc.) APIs.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\nLIBS=$(LIBS) kernel32.lib\n\nall: dirs \\\n    $(BIND)\\trcser$(DETOURS_BITS).dll \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\trcser$(DETOURS_BITS).bsc \\\n!ENDIF\n    option\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\nclean:\n    -del *~ test.txt 2>nul\n    -del $(BIND)\\trcser*.* 2>nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\n##############################################################################\n\n$(OBJD)\\trcser.obj: trcser.cpp\n\n$(OBJD)\\trcser.res: trcser.rc\n\n$(BIND)\\trcser$(DETOURS_BITS).dll: $(OBJD)\\trcser.obj $(OBJD)\\trcser.res $(DEPS)\n    cl /LD $(CFLAGS) /Fe$@ /Fd$(@R).pdb \\\n        $(OBJD)\\trcser.obj $(OBJD)\\trcser.res \\\n        /link $(LINKFLAGS) /subsystem:console \\\n        /export:DetourFinishHelperProcess,@1,NONAME \\\n        $(LIBS)\n\n$(OBJD)\\trcser$(DETOURS_BITS).bsc : $(OBJD)\\trcser.obj\n    bscmake /v /n /o $@ $(OBJD)\\trcser.sbr\n\n############################################### Install non-bit-size binaries.\n\n!IF \"$(DETOURS_OPTION_PROCESSOR)\" != \"\"\n\n$(OPTD)\\trcser$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\trcser$(DETOURS_OPTION_BITS).pdb:\n\n$(BIND)\\trcser$(DETOURS_OPTION_BITS).dll : $(OPTD)\\trcser$(DETOURS_OPTION_BITS).dll\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\trcser$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\trcser$(DETOURS_OPTION_BITS).pdb\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n\noption: \\\n    $(BIND)\\trcser$(DETOURS_OPTION_BITS).dll \\\n    $(BIND)\\trcser$(DETOURS_OPTION_BITS).pdb \\\n\n!ELSE\n\noption:\n\n!ENDIF\n\n##############################################################################\n\ntest: all\n    @echo -------- Logging output to test.txt ------------\n    start $(BIND)\\syelogd.exe /o test.txt\n    $(BIND)\\sleep5.exe 1\n    @echo -------- Should load trcser$(DETOURS_BITS).dll dynamically using withdll.exe ------------\n    $(BIND)\\withdll -d:$(BIND)\\trcser$(DETOURS_BITS).dll $(BIND)\\sleepold.exe\n    @echo -------- Log from syelog -------------\n    type test.txt\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/traceser/trcser.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (trcser.cpp of trcser.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#define _WIN32_WINNT        0x0400\n#define WIN32\n#define NT\n\n#define DBG_TRACE   0\n\n#include <windows.h>\n#include <stdio.h>\n#include \"detours.h\"\n#include \"syelog.h\"\n\n#define PULONG_PTR          PVOID\n#define PLONG_PTR           PVOID\n#define ULONG_PTR           PVOID\n#define ENUMRESNAMEPROCA    PVOID\n#define ENUMRESNAMEPROCW    PVOID\n#define ENUMRESLANGPROCA    PVOID\n#define ENUMRESLANGPROCW    PVOID\n#define ENUMRESTYPEPROCA    PVOID\n#define ENUMRESTYPEPROCW    PVOID\n#define STGOPTIONS          PVOID\n\n//////////////////////////////////////////////////////////////////////\n#pragma warning(disable:4127)   // Many of our asserts are constants.\n\n#define ASSERT_ALWAYS(x)   \\\n    do {                                                        \\\n    if (!(x)) {                                                 \\\n            AssertMessage(#x, __FILE__, __LINE__);              \\\n            DebugBreak();                                       \\\n    }                                                           \\\n    } while (0)\n\n#ifndef NDEBUG\n#define ASSERT(x)           ASSERT_ALWAYS(x)\n#else\n#define ASSERT(x)\n#endif\n\n#define UNUSED(c)       (c) = (c)\n\n//////////////////////////////////////////////////////////////////////\nstatic HMODULE s_hInst = NULL;\nstatic CHAR s_szDllPath[MAX_PATH];\n\nVOID _PrintDump(HANDLE h, PCHAR pszData, INT cbData);\nVOID _PrintEnter(PCSTR psz, ...);\nVOID _PrintExit(PCSTR psz, ...);\nVOID _Print(PCSTR psz, ...);\n\nVOID AssertMessage(CONST PCHAR pszMsg, CONST PCHAR pszFile, ULONG nLine);\n\n//////////////////////////////////////////////////////////////////////////////\n//\nextern \"C\" {\n    HANDLE (WINAPI * Real_CreateFileW)(LPCWSTR a0,\n                                       DWORD a1,\n                                       DWORD a2,\n                                       LPSECURITY_ATTRIBUTES a3,\n                                       DWORD a4,\n                                       DWORD a5,\n                                       HANDLE a6)\n        = CreateFileW;\n\n    BOOL (WINAPI * Real_WriteFile)(HANDLE hFile,\n                                     LPCVOID lpBuffer,\n                                     DWORD nNumberOfBytesToWrite,\n                                     LPDWORD lpNumberOfBytesWritten,\n                                     LPOVERLAPPED lpOverlapped)\n        = WriteFile;\n    BOOL (WINAPI * Real_FlushFileBuffers)(HANDLE hFile)\n        = FlushFileBuffers;\n    BOOL (WINAPI * Real_CloseHandle)(HANDLE hObject)\n        = CloseHandle;\n\n    BOOL (WINAPI * Real_WaitNamedPipeW)(LPCWSTR lpNamedPipeName, DWORD nTimeOut)\n        = WaitNamedPipeW;\n    BOOL (WINAPI * Real_SetNamedPipeHandleState)(HANDLE hNamedPipe,\n                                                   LPDWORD lpMode,\n                                                   LPDWORD lpMaxCollectionCount,\n                                                   LPDWORD lpCollectDataTimeout)\n        = SetNamedPipeHandleState;\n\n    DWORD (WINAPI * Real_GetCurrentProcessId)(VOID)\n        = GetCurrentProcessId;\n    VOID (WINAPI * Real_GetSystemTimeAsFileTime)(LPFILETIME lpSystemTimeAsFileTime)\n        = GetSystemTimeAsFileTime;\n\n    VOID (WINAPI * Real_InitializeCriticalSection)(LPCRITICAL_SECTION lpSection)\n        = InitializeCriticalSection;\n    VOID (WINAPI * Real_EnterCriticalSection)(LPCRITICAL_SECTION lpSection)\n        = EnterCriticalSection;\n    VOID (WINAPI * Real_LeaveCriticalSection)(LPCRITICAL_SECTION lpSection)\n        = LeaveCriticalSection;\n}\n\nDWORD (WINAPI * Real_GetModuleFileNameW)(HMODULE a0,\n                                         LPWSTR a1,\n                                         DWORD a2)\n    = GetModuleFileNameW;\n\nDWORD (WINAPI * Real_GetModuleFileNameA)(HMODULE a0,\n                                         LPSTR a1,\n                                         DWORD a2)\n    = GetModuleFileNameA;\n\nBOOL (WINAPI * Real_CreateProcessW)(LPCWSTR a0,\n                                    LPWSTR a1,\n                                    LPSECURITY_ATTRIBUTES a2,\n                                    LPSECURITY_ATTRIBUTES a3,\n                                    BOOL a4,\n                                    DWORD a5,\n                                    LPVOID a6,\n                                    LPCWSTR a7,\n                                    struct _STARTUPINFOW* a8,\n                                    LPPROCESS_INFORMATION a9)\n    = CreateProcessW;\n\nBOOL (WINAPI * Real_BuildCommDCBA)(LPCSTR a0,\n                                   struct _DCB* a1)\n    = BuildCommDCBA;\n\nBOOL (WINAPI * Real_BuildCommDCBAndTimeoutsA)(LPCSTR a0,\n                                              struct _DCB* a1,\n                                              struct _COMMTIMEOUTS* a2)\n    = BuildCommDCBAndTimeoutsA;\n\nBOOL (WINAPI * Real_BuildCommDCBAndTimeoutsW)(LPCWSTR a0,\n                                              struct _DCB* a1,\n                                              struct _COMMTIMEOUTS* a2)\n    = BuildCommDCBAndTimeoutsW;\n\nBOOL (WINAPI * Real_BuildCommDCBW)(LPCWSTR a0,\n                                   struct _DCB* a1)\n    = BuildCommDCBW;\n\nBOOL (WINAPI * Real_ClearCommBreak)(HANDLE a0)\n    = ClearCommBreak;\n\nBOOL (WINAPI * Real_ClearCommError)(HANDLE a0,\n                                    LPDWORD a1,\n                                    struct _COMSTAT* a2)\n    = ClearCommError;\n\nHANDLE (WINAPI * Real_CreateFileA)(LPCSTR a0,\n                                   DWORD a1,\n                                   DWORD a2,\n                                   LPSECURITY_ATTRIBUTES a3,\n                                   DWORD a4,\n                                   DWORD a5,\n                                   HANDLE a6)\n    = CreateFileA;\n\nBOOL (WINAPI * Real_EscapeCommFunction)(HANDLE a0,\n                                        DWORD a1)\n    = EscapeCommFunction;\n\nBOOL (WINAPI * Real_GetCommConfig)(HANDLE a0,\n                                   LPCOMMCONFIG a1,\n                                   LPDWORD a2)\n    = GetCommConfig;\n\nBOOL (WINAPI * Real_GetCommMask)(HANDLE a0,\n                                 LPDWORD a1)\n    = GetCommMask;\n\nBOOL (WINAPI * Real_GetCommModemStatus)(HANDLE a0,\n                                        LPDWORD a1)\n    = GetCommModemStatus;\n\nBOOL (WINAPI * Real_GetCommProperties)(HANDLE a0,\n                                       LPCOMMPROP a1)\n    = GetCommProperties;\n\nBOOL (WINAPI * Real_GetCommState)(HANDLE a0,\n                                  struct _DCB* a1)\n    = GetCommState;\n\nBOOL (WINAPI * Real_GetCommTimeouts)(HANDLE a0,\n                                     struct _COMMTIMEOUTS* a1)\n    = GetCommTimeouts;\n\nDWORD (WINAPI * Real_GetCurrentThreadId)(void)\n    = GetCurrentThreadId;\n\nBOOL (WINAPI * Real_GetOverlappedResult)(HANDLE a0,\n                                         LPOVERLAPPED a1,\n                                         LPDWORD a2,\n                                         BOOL a3)\n    = GetOverlappedResult;\n\nBOOL (WINAPI * Real_PurgeComm)(HANDLE a0,\n                               DWORD a1)\n    = PurgeComm;\n\nBOOL (WINAPI * Real_ReadFile)(HANDLE a0,\n                              LPVOID a1,\n                              DWORD a2,\n                              LPDWORD a3,\n                              LPOVERLAPPED a4)\n    = ReadFile;\n\nBOOL (WINAPI * Real_SetCommBreak)(HANDLE a0)\n    = SetCommBreak;\n\nBOOL (WINAPI * Real_SetCommConfig)(HANDLE a0,\n                                   LPCOMMCONFIG a1,\n                                   DWORD a2)\n    = SetCommConfig;\n\nBOOL (WINAPI * Real_SetCommMask)(HANDLE a0,\n                                 DWORD a1)\n    = SetCommMask;\n\nBOOL (WINAPI * Real_SetCommState)(HANDLE a0,\n                                  struct _DCB* a1)\n    = SetCommState;\n\nBOOL (WINAPI * Real_SetCommTimeouts)(HANDLE a0,\n                                     struct _COMMTIMEOUTS* a1)\n    = SetCommTimeouts;\n\nBOOL (WINAPI * Real_SetupComm)(HANDLE a0,\n                               DWORD a1,\n                               DWORD a2)\n    = SetupComm;\n\nBOOL (WINAPI * Real_TransmitCommChar)(HANDLE a0,\n                                      char a1)\n    = TransmitCommChar;\n\nBOOL (WINAPI * Real_WaitCommEvent)(HANDLE a0,\n                                   LPDWORD a1,\n                                   LPOVERLAPPED a2)\n    = WaitCommEvent;\n\n/////////////////////////////////////////////////////////////\n// Detours\n//\n\nBOOL WINAPI Mine_CreateProcessW(LPCWSTR lpApplicationName,\n                                LPWSTR lpCommandLine,\n                                LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                BOOL bInheritHandles,\n                                DWORD dwCreationFlags,\n                                LPVOID lpEnvironment,\n                                LPCWSTR lpCurrentDirectory,\n                                LPSTARTUPINFOW lpStartupInfo,\n                                LPPROCESS_INFORMATION lpProcessInformation)\n{\n    _PrintEnter(\"CreateProcessW(%ls,%ls,%p,%p,%x,%x,%p,%ls,%p,%p)\\n\",\n                lpApplicationName,\n                lpCommandLine,\n                lpProcessAttributes,\n                lpThreadAttributes,\n                bInheritHandles,\n                dwCreationFlags,\n                lpEnvironment,\n                lpCurrentDirectory,\n                lpStartupInfo,\n                lpProcessInformation);\n\n    _Print(\"Calling DetourCreateProcessWithDllExW(,%hs)\\n\", s_szDllPath);\n\n    BOOL rv = 0;\n    __try {\n        rv = DetourCreateProcessWithDllExW(lpApplicationName,\n                                           lpCommandLine,\n                                           lpProcessAttributes,\n                                           lpThreadAttributes,\n                                           bInheritHandles,\n                                           dwCreationFlags,\n                                           lpEnvironment,\n                                           lpCurrentDirectory,\n                                           lpStartupInfo,\n                                           lpProcessInformation,\n                                           s_szDllPath,\n                                           Real_CreateProcessW);\n    } __finally {\n        _PrintExit(\"CreateProcessW(,,,,,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_BuildCommDCBA(LPCSTR a0,\n                               LPDCB a1)\n{\n    _PrintEnter(\"BuildCommDCBA(%hs,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_BuildCommDCBA(a0, a1);\n    } __finally {\n        _PrintExit(\"BuildCommDCBA(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_BuildCommDCBAndTimeoutsA(LPCSTR a0,\n                                          LPDCB a1,\n                                          LPCOMMTIMEOUTS a2)\n{\n    _PrintEnter(\"BuildCommDCBAndTimeoutsA(%hs,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_BuildCommDCBAndTimeoutsA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"BuildCommDCBAndTimeoutsA(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_BuildCommDCBAndTimeoutsW(LPCWSTR a0,\n                                          LPDCB a1,\n                                          LPCOMMTIMEOUTS a2)\n{\n    _PrintEnter(\"BuildCommDCBAndTimeoutsW(%ls,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_BuildCommDCBAndTimeoutsW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"BuildCommDCBAndTimeoutsW(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_BuildCommDCBW(LPCWSTR a0,\n                               LPDCB a1)\n{\n    _PrintEnter(\"BuildCommDCBW(%ls,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_BuildCommDCBW(a0, a1);\n    } __finally {\n        _PrintExit(\"BuildCommDCBW(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_ClearCommBreak(HANDLE a0)\n{\n    _PrintEnter(\"ClearCommBreak(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ClearCommBreak(a0);\n    } __finally {\n        _PrintExit(\"ClearCommBreak() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_ClearCommError(HANDLE a0,\n                                LPDWORD a1,\n                                LPCOMSTAT a2)\n{\n    _PrintEnter(\"ClearCommError(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ClearCommError(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"ClearCommError(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_CloseHandle(HANDLE a0)\n{\n    _PrintEnter(\"CloseHandle(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CloseHandle(a0);\n    } __finally {\n        _PrintExit(\"CloseHandle() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE WINAPI Mine_CreateFileA(LPCSTR a0,\n                               DWORD a1,\n                               DWORD a2,\n                               LPSECURITY_ATTRIBUTES a3,\n                               DWORD a4,\n                               DWORD a5,\n                               HANDLE a6)\n{\n    _PrintEnter(\"CreateFileA(%hs,%x,%x,%p,%x,%x,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_CreateFileA(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"CreateFileA(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE WINAPI Mine_CreateFileW(LPCWSTR a0,\n                               DWORD a1,\n                               DWORD a2,\n                               LPSECURITY_ATTRIBUTES a3,\n                               DWORD a4,\n                               DWORD a5,\n                               HANDLE a6)\n{\n    _PrintEnter(\"CreateFileW(%ls,%x,%x,%p,%x,%x,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_CreateFileW(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"CreateFileW(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_EscapeCommFunction(HANDLE a0,\n                                    DWORD a1)\n{\n    _PrintEnter(\"EscapeCommFunction(%p,%x)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_EscapeCommFunction(a0, a1);\n    } __finally {\n        _PrintExit(\"EscapeCommFunction(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_GetCommConfig(HANDLE a0,\n                               LPCOMMCONFIG a1,\n                               LPDWORD a2)\n{\n    _PrintEnter(\"GetCommConfig(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetCommConfig(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetCommConfig(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_GetCommMask(HANDLE a0,\n                                LPDWORD a1)\n{\n    _PrintEnter(\"GetCommMask(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetCommMask(a0, a1);\n    } __finally {\n        _PrintExit(\"GetCommMask(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_GetCommModemStatus(HANDLE a0,\n                                    LPDWORD a1)\n{\n    _PrintEnter(\"GetCommModemStatus(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetCommModemStatus(a0, a1);\n    } __finally {\n        _PrintExit(\"GetCommModemStatus(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_GetCommProperties(HANDLE a0,\n                                   LPCOMMPROP a1)\n{\n    _PrintEnter(\"GetCommProperties(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetCommProperties(a0, a1);\n    } __finally {\n        _PrintExit(\"GetCommProperties(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_GetCommState(HANDLE a0,\n                              LPDCB a1)\n{\n    _PrintEnter(\"GetCommState(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetCommState(a0, a1);\n    } __finally {\n        _PrintExit(\"GetCommState(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_GetCommTimeouts(HANDLE a0,\n                                 LPCOMMTIMEOUTS a1)\n{\n    _PrintEnter(\"GetCommTimeouts(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetCommTimeouts(a0, a1);\n    } __finally {\n        _PrintExit(\"GetCommTimeouts(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD WINAPI Mine_GetCurrentThreadId(void)\n{\n    _PrintEnter(\"GetCurrentThreadId()\\n\");\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetCurrentThreadId();\n    } __finally {\n        _PrintExit(\"GetCurrentThreadId() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD WINAPI Mine_GetModuleFileNameW(HINSTANCE a0,\n                                     LPWSTR a1,\n                                     DWORD a2)\n{\n    _PrintEnter(\"GetModuleFileNameW(%p,%p,%x)\\n\", a0, a1, a2);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_GetModuleFileNameW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"GetModuleFileNameW(,%ls,) -> %x\\n\", a1, rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_GetOverlappedResult(HANDLE a0,\n                                     LPOVERLAPPED a1,\n                                     LPDWORD a2,\n                                     BOOL a3)\n{\n    _PrintEnter(\"GetOverlappedResult(%p,%p,%p,%x)\\n\", a0, a1, a2, a3);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_GetOverlappedResult(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"GetOverlappedResult(,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_PurgeComm(HANDLE a0,\n                           DWORD a1)\n{\n    _PrintEnter(\"PurgeComm(%p,%x)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_PurgeComm(a0, a1);\n    } __finally {\n        _PrintExit(\"PurgeComm(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_ReadFile(HANDLE a0,\n                          LPVOID a1,\n                          DWORD a2,\n                          LPDWORD a3,\n                          LPOVERLAPPED a4)\n{\n    _PrintEnter(\"ReadFile(%p,%p,%x,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_ReadFile(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"ReadFile(,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_SetCommBreak(HANDLE a0)\n{\n    _PrintEnter(\"SetCommBreak(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetCommBreak(a0);\n    } __finally {\n        _PrintExit(\"SetCommBreak() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_SetCommConfig(HANDLE a0,\n                               LPCOMMCONFIG a1,\n                               DWORD a2)\n{\n    _PrintEnter(\"SetCommConfig(%p,%p,%x)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetCommConfig(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetCommConfig(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_SetCommMask(HANDLE a0,\n                             DWORD a1)\n{\n    _PrintEnter(\"SetCommMask(%p,%x)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetCommMask(a0, a1);\n    } __finally {\n        _PrintExit(\"SetCommMask(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_SetCommState(HANDLE a0,\n                              LPDCB a1)\n{\n    _PrintEnter(\"SetCommState(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetCommState(a0, a1);\n    } __finally {\n        _PrintExit(\"SetCommState(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_SetCommTimeouts(HANDLE a0,\n                                 LPCOMMTIMEOUTS a1)\n{\n    _PrintEnter(\"SetCommTimeouts(%p,%p)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetCommTimeouts(a0, a1);\n    } __finally {\n        _PrintExit(\"SetCommTimeouts(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_SetupComm(HANDLE a0,\n                           DWORD a1,\n                           DWORD a2)\n{\n    _PrintEnter(\"SetupComm(%p,%x,%x)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_SetupComm(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"SetupComm(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_TransmitCommChar(HANDLE a0,\n                                  char a1)\n{\n    _PrintEnter(\"TransmitCommChar(%p,%x)\\n\", a0, a1);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_TransmitCommChar(a0, a1);\n    } __finally {\n        _PrintExit(\"TransmitCommChar(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_WaitCommEvent(HANDLE a0,\n                               LPDWORD a1,\n                               LPOVERLAPPED a2)\n{\n    _PrintEnter(\"WaitCommEvent(%p,%p,%p)\\n\", a0, a1, a2);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WaitCommEvent(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WaitCommEvent(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_WriteFile(HANDLE a0,\n                           LPCVOID a1,\n                           DWORD a2,\n                           LPDWORD a3,\n                           LPOVERLAPPED a4)\n{\n    _PrintEnter(\"WriteFile(%p,%p,%x,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        _PrintDump(a0, (PCHAR)a1, a2);\n        rv = Real_WriteFile(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WriteFile(,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\n/////////////////////////////////////////////////////////////\n// AttachDetours\n//\nPCHAR DetRealName(PCHAR psz)\n{\n    PCHAR pszBeg = psz;\n    // Move to end of name.\n    while (*psz) {\n        psz++;\n    }\n    // Move back through A-Za-z0-9 names.\n    while (psz > pszBeg &&\n           ((psz[-1] >= 'A' && psz[-1] <= 'Z') ||\n            (psz[-1] >= 'a' && psz[-1] <= 'z') ||\n            (psz[-1] >= '0' && psz[-1] <= '9'))) {\n        psz--;\n    }\n    return psz;\n}\n\nVOID DetAttach(PVOID *ppbReal, PVOID pbMine, PCHAR psz)\n{\n    LONG l = DetourAttach(ppbReal, pbMine);\n    if (l != 0) {\n        Syelog(SYELOG_SEVERITY_NOTICE,\n               \"Attach failed: `%s': error %d\\n\", DetRealName(psz), l);\n    }\n}\n\nVOID DetDetach(PVOID *ppbReal, PVOID pbMine, PCHAR psz)\n{\n    LONG l = DetourDetach(ppbReal, pbMine);\n    if (l != 0) {\n        Syelog(SYELOG_SEVERITY_NOTICE,\n               \"Detach failed: `%s': error %d\\n\", DetRealName(psz), l);\n    }\n}\n\n#define ATTACH(x)       DetAttach(&(PVOID&)Real_##x,Mine_##x,#x)\n#define DETACH(x)       DetDetach(&(PVOID&)Real_##x,Mine_##x,#x)\n\nLONG AttachDetours(VOID)\n{\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n\n    ATTACH(BuildCommDCBA);\n    ATTACH(BuildCommDCBAndTimeoutsA);\n    ATTACH(BuildCommDCBAndTimeoutsW);\n    ATTACH(BuildCommDCBW);\n    ATTACH(ClearCommBreak);\n    ATTACH(ClearCommError);\n    ATTACH(CloseHandle);\n    ATTACH(CreateFileA);\n    ATTACH(CreateFileW);\n    ATTACH(EscapeCommFunction);\n    ATTACH(GetCommConfig);\n    ATTACH(GetCommMask);\n    ATTACH(GetCommModemStatus);\n    ATTACH(GetCommProperties);\n    ATTACH(GetCommState);\n    ATTACH(GetCommTimeouts);\n    ATTACH(GetCurrentThreadId);\n    ATTACH(GetModuleFileNameW);\n    ATTACH(GetOverlappedResult);\n    ATTACH(PurgeComm);\n    ATTACH(ReadFile);\n    ATTACH(SetCommBreak);\n    ATTACH(SetCommConfig);\n    ATTACH(SetCommMask);\n    ATTACH(SetCommState);\n    ATTACH(SetCommTimeouts);\n    ATTACH(SetupComm);\n    ATTACH(TransmitCommChar);\n    ATTACH(WaitCommEvent);\n    ATTACH(WriteFile);\n\n    return DetourTransactionCommit();\n}\n\nLONG DetachDetours(VOID)\n{\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n\n    DETACH(BuildCommDCBA);\n    DETACH(BuildCommDCBAndTimeoutsA);\n    DETACH(BuildCommDCBAndTimeoutsW);\n    DETACH(BuildCommDCBW);\n    DETACH(ClearCommBreak);\n    DETACH(ClearCommError);\n    DETACH(CloseHandle);\n    DETACH(CreateFileA);\n    DETACH(CreateFileW);\n    DETACH(EscapeCommFunction);\n    DETACH(GetCommConfig);\n    DETACH(GetCommMask);\n    DETACH(GetCommModemStatus);\n    DETACH(GetCommProperties);\n    DETACH(GetCommState);\n    DETACH(GetCommTimeouts);\n    DETACH(GetCurrentThreadId);\n    DETACH(GetModuleFileNameW);\n    DETACH(GetOverlappedResult);\n    DETACH(PurgeComm);\n    DETACH(ReadFile);\n    DETACH(SetCommBreak);\n    DETACH(SetCommConfig);\n    DETACH(SetCommMask);\n    DETACH(SetCommState);\n    DETACH(SetCommTimeouts);\n    DETACH(SetupComm);\n    DETACH(TransmitCommChar);\n    DETACH(WaitCommEvent);\n    DETACH(WriteFile);\n\n    return DetourTransactionCommit();\n}\n\n/////////////////////////////////////////////////////////////\n// Detours\n//\n\nVOID _PrintDump(HANDLE h, PCHAR pszData, INT cbData)\n{\n    if (pszData && cbData > 0) {\n        CHAR szBuffer[256];\n        PCHAR pszBuffer = szBuffer;\n        INT cbBuffer = 0;\n        INT nLines = 0;\n\n        while (cbData > 0) {\n            if (nLines > 20) {\n                *pszBuffer++ = '.';\n                *pszBuffer++ = '.';\n                *pszBuffer++ = '.';\n                cbBuffer += 3;\n                break;\n            }\n\n            if (*pszData == '\\t') {\n                *pszBuffer++ = '\\\\';\n                *pszBuffer++ = 't';\n                cbBuffer += 2;\n                pszData++;\n                cbData--;\n                continue;\n            }\n            if (*pszData == '\\r') {\n                *pszBuffer++ = '\\\\';\n                *pszBuffer++ = 'r';\n                cbBuffer += 2;\n                pszData++;\n                cbData--;\n                continue;\n            }\n            else if (*pszData == '\\n') {\n                *pszBuffer++ = '\\\\';\n                *pszBuffer++ = 'n';\n                cbBuffer += 2;\n                *pszBuffer++ = '\\0';\n                _Print(\"%p:   %hs\\n\", h, szBuffer);\n                nLines++;\n                pszBuffer = szBuffer;\n                cbBuffer = 0;\n                pszData++;\n                cbData--;\n                continue;\n            }\n            else if (cbBuffer >= 80) {\n                *pszBuffer++ = '\\0';\n                _Print(\"%p:   %hs\\n\", h, szBuffer);\n                nLines++;\n                pszBuffer = szBuffer;\n                cbBuffer = 0;\n            }\n\n            if (*pszData < ' ' || *pszData >= 127) {\n                *pszBuffer++ = '\\\\';\n                *pszBuffer++ = 'x';\n                *pszBuffer++ = \"0123456789ABCDEF\"[(*pszData & 0xf0) >> 4];\n                *pszBuffer++ = \"0123456789ABCDEF\"[(*pszData & 0x0f)];\n                cbBuffer += 4;\n            }\n            else {\n                *pszBuffer++ = *pszData;\n            }\n            cbBuffer++;\n            pszData++;\n            cbData--;\n        }\n\n        if (cbBuffer > 0) {\n            *pszBuffer++ = '\\0';\n            _Print(\"%p:   %hs\\n\", h, szBuffer);\n        }\n    }\n}\n\n////////////////////////////////////////////////////////////// Logging System.\n//\nstatic BOOL s_bLog = 1;\nstatic LONG s_nTlsIndent = -1;\nstatic LONG s_nTlsThread = -1;\nstatic LONG s_nThreadCnt = 0;\n\nVOID _PrintEnter(const CHAR *psz, ...)\n{\n    DWORD dwErr = GetLastError();\n\n    LONG nIndent = 0;\n    LONG nThread = 0;\n    if (s_nTlsIndent >= 0) {\n        nIndent = (LONG)(LONG_PTR)TlsGetValue(s_nTlsIndent);\n        TlsSetValue(s_nTlsIndent, (PVOID)(LONG_PTR)(nIndent + 1));\n    }\n    if (s_nTlsThread >= 0) {\n        nThread = (LONG)(LONG_PTR)TlsGetValue(s_nTlsThread);\n    }\n\n    if (s_bLog && psz) {\n        CHAR szBuf[1024];\n        PCHAR pszBuf = szBuf;\n        PCHAR pszEnd = szBuf + ARRAYSIZE(szBuf) - 1;\n        LONG nLen = (nIndent > 0) ? (nIndent < 35 ? nIndent * 2 : 70) : 0;\n        *pszBuf++ = (CHAR)('0' + ((nThread / 100) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 10) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 1) % 10));\n        *pszBuf++ = ' ';\n        while (nLen-- > 0) {\n            *pszBuf++ = ' ';\n        }\n\n        va_list  args;\n        va_start(args, psz);\n\n        while ((*pszBuf++ = *psz++) != 0 && pszBuf < pszEnd) {\n            // Copy characters.\n        }\n        *pszEnd = '\\0';\n        SyelogV(SYELOG_SEVERITY_INFORMATION,\n                szBuf, args);\n\n        va_end(args);\n    }\n    SetLastError(dwErr);\n}\n\nVOID _PrintExit(const CHAR *psz, ...)\n{\n    DWORD dwErr = GetLastError();\n\n    LONG nIndent = 0;\n    LONG nThread = 0;\n    if (s_nTlsIndent >= 0) {\n        nIndent = (LONG)(LONG_PTR)TlsGetValue(s_nTlsIndent) - 1;\n        ASSERT(nIndent >= 0);\n        TlsSetValue(s_nTlsIndent, (PVOID)(LONG_PTR)nIndent);\n    }\n    if (s_nTlsThread >= 0) {\n        nThread = (LONG)(LONG_PTR)TlsGetValue(s_nTlsThread);\n    }\n\n    if (s_bLog && psz) {\n        CHAR szBuf[1024];\n        PCHAR pszBuf = szBuf;\n        PCHAR pszEnd = szBuf + ARRAYSIZE(szBuf) - 1;\n        LONG nLen = (nIndent > 0) ? (nIndent < 35 ? nIndent * 2 : 70) : 0;\n        *pszBuf++ = (CHAR)('0' + ((nThread / 100) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 10) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 1) % 10));\n        *pszBuf++ = ' ';\n        while (nLen-- > 0) {\n            *pszBuf++ = ' ';\n        }\n\n        va_list  args;\n        va_start(args, psz);\n\n        while ((*pszBuf++ = *psz++) != 0 && pszBuf < pszEnd) {\n            // Copy characters.\n        }\n        *pszEnd = '\\0';\n        SyelogV(SYELOG_SEVERITY_INFORMATION,\n                szBuf, args);\n\n        va_end(args);\n    }\n    SetLastError(dwErr);\n}\n\nVOID _Print(const CHAR *psz, ...)\n{\n    DWORD dwErr = GetLastError();\n\n    LONG nIndent = 0;\n    LONG nThread = 0;\n    if (s_nTlsIndent >= 0) {\n        nIndent = (LONG)(LONG_PTR)TlsGetValue(s_nTlsIndent);\n    }\n    if (s_nTlsThread >= 0) {\n        nThread = (LONG)(LONG_PTR)TlsGetValue(s_nTlsThread);\n    }\n\n    if (s_bLog && psz) {\n        CHAR szBuf[1024];\n        PCHAR pszBuf = szBuf;\n        PCHAR pszEnd = szBuf + ARRAYSIZE(szBuf) - 1;\n        LONG nLen = (nIndent > 0) ? (nIndent < 35 ? nIndent * 2 : 70) : 0;\n        *pszBuf++ = (CHAR)('0' + ((nThread / 100) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 10) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 1) % 10));\n        *pszBuf++ = ' ';\n        while (nLen-- > 0) {\n            *pszBuf++ = ' ';\n        }\n\n        va_list  args;\n        va_start(args, psz);\n\n        while ((*pszBuf++ = *psz++) != 0 && pszBuf < pszEnd) {\n            // Copy characters.\n        }\n        *pszEnd = '\\0';\n        SyelogV(SYELOG_SEVERITY_INFORMATION,\n                szBuf, args);\n\n        va_end(args);\n    }\n\n    SetLastError(dwErr);\n}\n\nVOID AssertMessage(CONST PCHAR pszMsg, CONST PCHAR pszFile, ULONG nLine)\n{\n    Syelog(SYELOG_SEVERITY_FATAL,\n           \"ASSERT(%s) failed in %s, line %d.\\n\", pszMsg, pszFile, nLine);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// DLL module information\n//\nBOOL ThreadAttach(HMODULE hDll)\n{\n    (void)hDll;\n\n    if (s_nTlsIndent >= 0) {\n        TlsSetValue(s_nTlsIndent, (PVOID)0);\n    }\n    if (s_nTlsThread >= 0) {\n        LONG nThread = InterlockedIncrement(&s_nThreadCnt);\n        TlsSetValue(s_nTlsThread, (PVOID)(LONG_PTR)nThread);\n    }\n    return TRUE;\n}\n\nBOOL ThreadDetach(HMODULE hDll)\n{\n    (void)hDll;\n\n    if (s_nTlsIndent >= 0) {\n        TlsSetValue(s_nTlsIndent, (PVOID)0);\n    }\n    if (s_nTlsThread >= 0) {\n        TlsSetValue(s_nTlsThread, (PVOID)0);\n    }\n    return TRUE;\n}\n\nBOOL ProcessAttach(HMODULE hDll)\n{\n    s_bLog = FALSE;\n    s_nTlsIndent = TlsAlloc();\n    s_nTlsThread = TlsAlloc();\n\n    WCHAR wzExePath[MAX_PATH];\n\n    s_hInst = hDll;\n    Real_GetModuleFileNameA(s_hInst, s_szDllPath, ARRAYSIZE(s_szDllPath));\n    Real_GetModuleFileNameW(NULL, wzExePath, ARRAYSIZE(wzExePath));\n\n    SyelogOpen(\"trcser\" DETOURS_STRINGIFY(DETOURS_BITS), SYELOG_FACILITY_APPLICATION);\n    Syelog(SYELOG_SEVERITY_INFORMATION,\n           \"##################################################################\\n\");\n    Syelog(SYELOG_SEVERITY_INFORMATION,\n           \"### %ls\\n\", wzExePath);\n    LONG error = AttachDetours();\n    if (error != NO_ERROR) {\n        Syelog(SYELOG_SEVERITY_FATAL, \"### Error attaching detours: %d\\n\", error);\n    }\n\n    ThreadAttach(hDll);\n\n    s_bLog = TRUE;\n    return TRUE;\n}\n\nBOOL ProcessDetach(HMODULE hDll)\n{\n    ThreadDetach(hDll);\n    s_bLog = FALSE;\n\n    LONG error = DetachDetours();\n    if (error != NO_ERROR) {\n        Syelog(SYELOG_SEVERITY_FATAL, \"### Error detaching detours: %d\\n\", error);\n    }\n\n    Syelog(SYELOG_SEVERITY_NOTICE, \"### Closing.\\n\");\n    SyelogClose(FALSE);\n\n    if (s_nTlsIndent >= 0) {\n        TlsFree(s_nTlsIndent);\n    }\n    if (s_nTlsThread >= 0) {\n        TlsFree(s_nTlsThread);\n    }\n    return TRUE;\n}\n\nBOOL APIENTRY DllMain(HINSTANCE hModule, DWORD dwReason, PVOID lpReserved)\n{\n    (void)hModule;\n    (void)lpReserved;\n\n    if (DetourIsHelperProcess()) {\n        return TRUE;\n    }\n\n    switch (dwReason) {\n      case DLL_PROCESS_ATTACH:\n        DetourRestoreAfterWith();\n        return ProcessAttach(hModule);\n      case DLL_PROCESS_DETACH:\n        return ProcessDetach(hModule);\n      case DLL_THREAD_ATTACH:\n        return ThreadAttach(hModule);\n      case DLL_THREAD_DETACH:\n        return ThreadDetach(hModule);\n    }\n    return TRUE;\n}\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/traceser/trcser.rc",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Version information for trcser.rc.\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include \"detver.h\"\n\n#define VER_INTERNALNAME_STR        \"trcser\" DETOURS_STRINGIFY(DETOURS_BITS)\n#define VER_ORIGINALFILENAME_STR    \"trcsrc\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\"\n#define VER_FILEDESCRIPTION_STR     \"Detours Serial Trace Module\"\n#define VER_COMPANYNAME_STR         \"Microsoft Corporation\"\n\n#include \"common.ver\"\n"
  },
  {
    "path": "ext/detours/samples/tracessl/Makefile",
    "content": "##############################################################################\n##\n##  Utility to trace WinSock SSL APIs.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\nLIBS=$(LIBS) kernel32.lib ws2_32.lib secur32.lib\n\n##############################################################################\n\nall: dirs \\\n    $(BIND)\\trcssl$(DETOURS_BITS).dll \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\trcssl$(DETOURS_BITS).bsc \\\n!ENDIF\n    option\n\n##############################################################################\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\n$(OBJD)\\trcssl.obj : trcssl.cpp\n\n$(OBJD)\\trcssl.res : trcssl.rc\n\n$(BIND)\\trcssl$(DETOURS_BITS).dll : $(OBJD)\\trcssl.obj $(OBJD)\\trcssl.res $(DEPS)\n    cl /LD $(CFLAGS) /Fe$@ /Fd$(@R).pdb \\\n        $(OBJD)\\trcssl.obj $(OBJD)\\trcssl.res \\\n        /link $(LINKFLAGS) /subsystem:console \\\n        /export:DetourFinishHelperProcess,@1,NONAME \\\n        $(LIBS)\n\n$(OBJD)\\trcssl$(DETOURS_BITS).bsc : $(OBJD)\\trcssl.obj\n    bscmake /v /n /o $@ $(OBJD)\\trcssl.sbr\n\n##############################################################################\n\nclean:\n    -del *~ test.txt 2>nul\n    -del $(BIND)\\trcssl*.* 2>nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\n############################################### Install non-bit-size binaries.\n\n!IF \"$(DETOURS_OPTION_PROCESSOR)\" != \"\"\n\n$(OPTD)\\trcssl$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\trcssl$(DETOURS_OPTION_BITS).pdb:\n\n$(BIND)\\trcssl$(DETOURS_OPTION_BITS).dll : $(OPTD)\\trcssl$(DETOURS_OPTION_BITS).dll\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\trcssl$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\trcssl$(DETOURS_OPTION_BITS).pdb\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n\noption: \\\n    $(BIND)\\trcssl$(DETOURS_OPTION_BITS).dll \\\n    $(BIND)\\trcssl$(DETOURS_OPTION_BITS).pdb \\\n\n!ELSE\n\noption:\n\n!ENDIF\n\n##############################################################################\n\ntest: all\n    @echo -------- Logging output to test.txt ------------\n    start $(BIND)\\syelogd.exe /o test.txt\n    $(BIND)\\sleep5.exe 1\n    @echo -------- Should load trcssl$(DETOURS_BITS).dll dynamically using withdll.exe ------------\n    @echo.\n    @echo ** NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE **\n    @echo **\n    @echo ** Close the Internet Explorer window to continue test.\n    @echo **\n    @echo ** NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE **\n    @echo.\n    $(BIND)\\withdll -d:$(BIND)\\trcssl$(DETOURS_BITS).dll \\\n        \"c:\\program files\\Internet Explorer\\iexplore.exe\" \"https://www.microsoft.com\"\n    @echo -------- Log from syelog -------------\n    type test.txt\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/tracessl/trcssl.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (trcssl.cpp of trcssl.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#define _WIN32_WINNT        0x0400\n#define WIN32\n#define NT\n#define SECURITY_WIN32\n#define _WINSOCK_DEPRECATED_NO_WARNINGS\n\n#define DBG_TRACE   0\n\n#if _MSC_VER >= 1300\n#include <winsock2.h>\n#endif\n#include <windows.h>\n#include <security.h>\n#include <stdio.h>\n#include \"detours.h\"\n#include \"syelog.h\"\n\n#define PULONG_PTR          PVOID\n#define PLONG_PTR           PVOID\n#define ULONG_PTR           PVOID\n#define ENUMRESNAMEPROCA    PVOID\n#define ENUMRESNAMEPROCW    PVOID\n#define ENUMRESLANGPROCA    PVOID\n#define ENUMRESLANGPROCW    PVOID\n#define ENUMRESTYPEPROCA    PVOID\n#define ENUMRESTYPEPROCW    PVOID\n#define STGOPTIONS          PVOID\n\n//////////////////////////////////////////////////////////////////////////////\n#pragma warning(disable:4127)   // Many of our asserts are constants.\n\n#define ASSERT_ALWAYS(x)   \\\n    do {                                                        \\\n    if (!(x)) {                                                 \\\n            AssertMessage(#x, __FILE__, __LINE__);              \\\n            DebugBreak();                                       \\\n    }                                                           \\\n    } while (0)\n\n#ifndef NDEBUG\n#define ASSERT(x)           ASSERT_ALWAYS(x)\n#else\n#define ASSERT(x)\n#endif\n\n#define UNUSED(c)       (c) = (c)\n\n//////////////////////////////////////////////////////////////////////////////\nstatic HMODULE s_hInst = NULL;\nstatic WCHAR s_wzDllPath[MAX_PATH];\n\nVOID _PrintDump(SOCKET socket, PCHAR pszData, INT cbData);\nVOID _PrintEnter(PCSTR psz, ...);\nVOID _PrintExit(PCSTR psz, ...);\nVOID _Print(PCSTR psz, ...);\n\nVOID AssertMessage(CONST PCHAR pszMsg, CONST PCHAR pszFile, ULONG nLine);\n\n//////////////////////////////////////////////////////////////////////////////\n//\nextern \"C\" {\n    HANDLE (WINAPI * Real_CreateFileW)(LPCWSTR a0,\n                                       DWORD a1,\n                                       DWORD a2,\n                                       LPSECURITY_ATTRIBUTES a3,\n                                       DWORD a4,\n                                       DWORD a5,\n                                       HANDLE a6)\n        = CreateFileW;\n\n    BOOL (WINAPI * Real_WriteFile)(HANDLE hFile,\n                                   LPCVOID lpBuffer,\n                                   DWORD nNumberOfBytesToWrite,\n                                   LPDWORD lpNumberOfBytesWritten,\n                                   LPOVERLAPPED lpOverlapped)\n        = WriteFile;\n\n    BOOL (WINAPI * Real_FlushFileBuffers)(HANDLE hFile)\n        = FlushFileBuffers;\n\n    BOOL (WINAPI * Real_CloseHandle)(HANDLE hObject)\n        = CloseHandle;\n\n    BOOL (WINAPI * Real_WaitNamedPipeW)(LPCWSTR lpNamedPipeName, DWORD nTimeOut)\n        = WaitNamedPipeW;\n\n    BOOL (WINAPI * Real_SetNamedPipeHandleState)(HANDLE hNamedPipe,\n                                                 LPDWORD lpMode,\n                                                 LPDWORD lpMaxCollectionCount,\n                                                 LPDWORD lpCollectDataTimeout)\n        = SetNamedPipeHandleState;\n\n    DWORD (WINAPI * Real_GetCurrentProcessId)(VOID)\n        = GetCurrentProcessId;\n\n    VOID (WINAPI * Real_GetSystemTimeAsFileTime)(LPFILETIME lpSystemTimeAsFileTime)\n        = GetSystemTimeAsFileTime;\n\n    VOID (WINAPI * Real_InitializeCriticalSection)(LPCRITICAL_SECTION lpSection)\n        = InitializeCriticalSection;\n\n    VOID (WINAPI * Real_EnterCriticalSection)(LPCRITICAL_SECTION lpSection)\n        = EnterCriticalSection;\n\n    VOID (WINAPI * Real_LeaveCriticalSection)(LPCRITICAL_SECTION lpSection)\n        = LeaveCriticalSection;\n}\n\nDWORD (WINAPI * Real_GetModuleFileNameW)(HMODULE a0,\n                                         LPWSTR a1,\n                                         DWORD a2)\n    = GetModuleFileNameW;\n\nBOOL (WINAPI * Real_CreateProcessW)(LPCWSTR a0,\n                                    LPWSTR a1,\n                                    LPSECURITY_ATTRIBUTES a2,\n                                    LPSECURITY_ATTRIBUTES a3,\n                                    BOOL a4,\n                                    DWORD a5,\n                                    LPVOID a6,\n                                    LPCWSTR a7,\n                                    LPSTARTUPINFOW a8,\n                                    LPPROCESS_INFORMATION a9)\n    = CreateProcessW;\n\n#if _MSC_VER < 1300\nSOCKET (WINAPI * Real_WSAAccept)(SOCKET a0,\n                                 sockaddr* a1,\n                                 LPINT a2,\n                                 LPCONDITIONPROC a3,\n                                 DWORD a4)\n    = WSAAccept;\n#else\nSOCKET (WINAPI * Real_WSAAccept)(SOCKET a0,\n                                 sockaddr* a1,\n                                 LPINT a2,\n                                 LPCONDITIONPROC a3,\n                                 DWORD_PTR a4)\n    = WSAAccept;\n#endif\n\nINT (WINAPI * Real_WSAAddressToStringA)(LPSOCKADDR a0,\n                                        DWORD a1,\n                                        LPWSAPROTOCOL_INFOA a2,\n                                        LPSTR a3,\n                                        LPDWORD a4)\n    = WSAAddressToStringA;\n\nINT (WINAPI * Real_WSAAddressToStringW)(LPSOCKADDR a0,\n                                        DWORD a1,\n                                        LPWSAPROTOCOL_INFOW a2,\n                                        LPWSTR a3,\n                                        LPDWORD a4)\n    = WSAAddressToStringW;\n\nHANDLE (WINAPI * Real_WSAAsyncGetHostByAddr)(HWND a0,\n                                             u_int a1,\n                                             CONST char* a2,\n                                             int a3,\n                                             int a4,\n                                             char* a5,\n                                             int a6)\n    = WSAAsyncGetHostByAddr;\n\nHANDLE (WINAPI * Real_WSAAsyncGetHostByName)(HWND a0,\n                                             u_int a1,\n                                             CONST char* a2,\n                                             char* a3,\n                                             int a4)\n    = WSAAsyncGetHostByName;\n\nHANDLE (WINAPI * Real_WSAAsyncGetProtoByName)(HWND a0,\n                                              u_int a1,\n                                              CONST char* a2,\n                                              char* a3,\n                                              int a4)\n    = WSAAsyncGetProtoByName;\n\nHANDLE (WINAPI * Real_WSAAsyncGetProtoByNumber)(HWND a0,\n                                                u_int a1,\n                                                int a2,\n                                                char* a3,\n                                                int a4)\n    = WSAAsyncGetProtoByNumber;\n\nHANDLE (WINAPI * Real_WSAAsyncGetServByName)(HWND a0,\n                                             u_int a1,\n                                             CONST char* a2,\n                                             CONST char* a3,\n                                             char* a4,\n                                             int a5)\n    = WSAAsyncGetServByName;\n\nHANDLE (WINAPI * Real_WSAAsyncGetServByPort)(HWND a0,\n                                             u_int a1,\n                                             int a2,\n                                             CONST char* a3,\n                                             char* a4,\n                                             int a5)\n    = WSAAsyncGetServByPort;\n\nint (WINAPI * Real_WSACancelAsyncRequest)(HANDLE a0)\n    = WSACancelAsyncRequest;\n\nint (WINAPI * Real_WSACancelBlockingCall)(void)\n    = WSACancelBlockingCall;\n\nint (WINAPI * Real_WSACleanup)(void)\n    = WSACleanup;\n\nBOOL (WINAPI * Real_WSACloseEvent)(HANDLE a0)\n    = WSACloseEvent;\n\nint (WINAPI * Real_WSAConnect)(SOCKET a0,\n                               CONST sockaddr* a1,\n                               int a2,\n                               LPWSABUF a3,\n                               LPWSABUF a4,\n                               LPQOS a5,\n                               LPQOS a6)\n    = WSAConnect;\n\nHANDLE (WINAPI * Real_WSACreateEvent)(void)\n    = WSACreateEvent;\n\nint (WINAPI * Real_WSADuplicateSocketA)(SOCKET a0,\n                                        DWORD a1,\n                                        LPWSAPROTOCOL_INFOA a2)\n    = WSADuplicateSocketA;\n\nint (WINAPI * Real_WSADuplicateSocketW)(SOCKET a0,\n                                        DWORD a1,\n                                        LPWSAPROTOCOL_INFOW a2)\n    = WSADuplicateSocketW;\n\nINT (WINAPI * Real_WSAEnumNameSpaceProvidersA)(LPDWORD a0,\n                                               LPWSANAMESPACE_INFOA a1)\n    = WSAEnumNameSpaceProvidersA;\n\nINT (WINAPI * Real_WSAEnumNameSpaceProvidersW)(LPDWORD a0,\n                                               LPWSANAMESPACE_INFOW a1)\n    = WSAEnumNameSpaceProvidersW;\n\nint (WINAPI * Real_WSAEnumNetworkEvents)(SOCKET a0,\n                                         HANDLE a1,\n                                         LPWSANETWORKEVENTS a2)\n    = WSAEnumNetworkEvents;\n\nint (WINAPI * Real_WSAEnumProtocolsA)(LPINT a0,\n                                      LPWSAPROTOCOL_INFOA a1,\n                                      LPDWORD a2)\n    = WSAEnumProtocolsA;\n\nint (WINAPI * Real_WSAEnumProtocolsW)(LPINT a0,\n                                      LPWSAPROTOCOL_INFOW a1,\n                                      LPDWORD a2)\n    = WSAEnumProtocolsW;\n\nBOOL (WINAPI * Real_WSAGetOverlappedResult)(SOCKET a0,\n                                            LPWSAOVERLAPPED a1,\n                                            LPDWORD a2,\n                                            BOOL a3,\n                                            LPDWORD a4)\n    = WSAGetOverlappedResult;\n\nBOOL (WINAPI * Real_WSAIsBlocking)(void)\n    = WSAIsBlocking;\n\nSOCKET (WINAPI * Real_WSAJoinLeaf)(SOCKET a0,\n                                   CONST sockaddr* a1,\n                                   int a2,\n                                   LPWSABUF a3,\n                                   LPWSABUF a4,\n                                   LPQOS a5,\n                                   LPQOS a6,\n                                   DWORD a7)\n    = WSAJoinLeaf;\n\nINT (WINAPI * Real_WSAProviderConfigChange)(LPHANDLE a0,\n                                            LPWSAOVERLAPPED a1,\n                                            LPWSAOVERLAPPED_COMPLETION_ROUTINE a2)\n    = WSAProviderConfigChange;\n\nint (WINAPI * Real_WSARecv)(SOCKET a0,\n                            LPWSABUF a1,\n                            DWORD a2,\n                            LPDWORD a3,\n                            LPDWORD a4,\n                            LPWSAOVERLAPPED a5,\n                            LPWSAOVERLAPPED_COMPLETION_ROUTINE a6)\n    = WSARecv;\n\nint (WINAPI * Real_WSARecvDisconnect)(SOCKET a0,\n                                      LPWSABUF a1)\n    = WSARecvDisconnect;\n\nint (WINAPI * Real_WSARecvFrom)(SOCKET a0,\n                                LPWSABUF a1,\n                                DWORD a2,\n                                LPDWORD a3,\n                                LPDWORD a4,\n                                sockaddr* a5,\n                                LPINT a6,\n                                LPWSAOVERLAPPED a7,\n                                LPWSAOVERLAPPED_COMPLETION_ROUTINE a8)\n    = WSARecvFrom;\n\nBOOL (WINAPI * Real_WSAResetEvent)(HANDLE a0)\n    = WSAResetEvent;\n\nint (WINAPI * Real_WSASend)(SOCKET a0,\n                            LPWSABUF a1,\n                            DWORD a2,\n                            LPDWORD a3,\n                            DWORD a4,\n                            LPWSAOVERLAPPED a5,\n                            LPWSAOVERLAPPED_COMPLETION_ROUTINE a6)\n    = WSASend;\n\nint (WINAPI * Real_WSASendDisconnect)(SOCKET a0,\n                                      LPWSABUF a1)\n    = WSASendDisconnect;\n\nint (WINAPI * Real_WSASendTo)(SOCKET a0,\n                              LPWSABUF a1,\n                              DWORD a2,\n                              LPDWORD a3,\n                              DWORD a4,\n                              CONST sockaddr* a5,\n                              int a6,\n                              LPWSAOVERLAPPED a7,\n                              LPWSAOVERLAPPED_COMPLETION_ROUTINE a8)\n    = WSASendTo;\n\nINT (WINAPI * Real_WSAStringToAddressA)(LPSTR a0,\n                                        INT a1,\n                                        LPWSAPROTOCOL_INFOA a2,\n                                        LPSOCKADDR a3,\n                                        LPINT a4)\n    = WSAStringToAddressA;\n\nINT (WINAPI * Real_WSAStringToAddressW)(LPWSTR a0,\n                                        INT a1,\n                                        LPWSAPROTOCOL_INFOW a2,\n                                        LPSOCKADDR a3,\n                                        LPINT a4)\n    = WSAStringToAddressW;\n\nDWORD (WINAPI * Real_WSAWaitForMultipleEvents)(DWORD a0,\n                                               CONST HANDLE * a1,\n                                               BOOL a2,\n                                               DWORD a3,\n                                               BOOL a4)\n    = WSAWaitForMultipleEvents;\n\nSOCKET (WINAPI * Real_accept)(SOCKET a0,\n                              sockaddr* a1,\n                              int* a2)\n    = accept;\n\nint (WINAPI * Real_closesocket)(SOCKET a0)\n    = closesocket;\n\nint (WINAPI * Real_connect)(SOCKET a0,\n                            CONST sockaddr* a1,\n                            int a2)\n    = connect;\n\nint (WINAPI * Real_listen)(SOCKET a0,\n                           int a1)\n    = listen;\n\nint (WINAPI * Real_recv)(SOCKET a0,\n                         char* a1,\n                         int a2,\n                         int a3)\n    = recv;\n\nint (WINAPI * Real_recvfrom)(SOCKET a0,\n                             char* a1,\n                             int a2,\n                             int a3,\n                             sockaddr* a4,\n                             int* a5)\n    = recvfrom;\n\nint (WINAPI * Real_send)(SOCKET a0,\n                         CONST char* a1,\n                         int a2,\n                         int a3)\n    = send;\n\nint (WINAPI * Real_sendto)(SOCKET a0,\n                           CONST char* a1,\n                           int a2,\n                           int a3,\n                           CONST sockaddr* a4,\n                           int a5)\n    = sendto;\n\nint (WINAPI * Real_shutdown)(SOCKET a0,\n                             int a1)\n    = shutdown;\n\nSECURITY_STATUS (SEC_ENTRY * Real_EncryptMessage)( PCtxtHandle         phContext,\n                                                   unsigned long       fQOP,\n                                                   PSecBufferDesc      pMessage,\n                                                   unsigned long       MessageSeqNo)\n    = EncryptMessage;\n\nSECURITY_STATUS (SEC_ENTRY * Real_DecryptMessage)( PCtxtHandle         phContext,\n                                                   PSecBufferDesc      pMessage,\n                                                   unsigned long       MessageSeqNo,\n                                                   unsigned long *     pfQOP)\n    = DecryptMessage;\n\n//////////////////////////////////////////////////////////////////////////////\n// Detours\n//\nBOOL WINAPI Mine_CreateProcessW(LPCWSTR lpApplicationName,\n                                LPWSTR lpCommandLine,\n                                LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                BOOL bInheritHandles,\n                                DWORD dwCreationFlags,\n                                LPVOID lpEnvironment,\n                                LPCWSTR lpCurrentDirectory,\n                                LPSTARTUPINFOW lpStartupInfo,\n                                LPPROCESS_INFORMATION lpProcessInformation)\n{\n    _PrintEnter(\"CreateProcessW(%ls,%ls,%p,%p,%x,%x,%p,%ls,%p,%p)\\n\",\n                lpApplicationName,\n                lpCommandLine,\n                lpProcessAttributes,\n                lpThreadAttributes,\n                bInheritHandles,\n                dwCreationFlags,\n                lpEnvironment,\n                lpCurrentDirectory,\n                lpStartupInfo,\n                lpProcessInformation);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CreateProcessW(lpApplicationName,\n                                 lpCommandLine,\n                                 lpProcessAttributes,\n                                 lpThreadAttributes,\n                                 bInheritHandles,\n                                 dwCreationFlags,\n                                 lpEnvironment,\n                                 lpCurrentDirectory,\n                                 lpStartupInfo,\n                                 lpProcessInformation);\n    } __finally {\n        _PrintExit(\"CreateProcessW(,,,,,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\n#if _MSC_VER < 1300\nSOCKET WINAPI Mine_WSAAccept(SOCKET a0,\n                             sockaddr* a1,\n                             LPINT a2,\n                             LPCONDITIONPROC a3,\n                             DWORD a4)\n#else\nSOCKET WINAPI Mine_WSAAccept(SOCKET a0,\n                             sockaddr* a1,\n                             LPINT a2,\n                             LPCONDITIONPROC a3,\n                             DWORD_PTR a4)\n#endif\n{\n\n    SOCKET rv = 0;\n    __try {\n        rv = Real_WSAAccept(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintEnter(\"%p: WSAAccept(,%p,%p,%p,%p) -> %p\\n\", a0, a1, a2, a3, a4, rv);\n        _PrintExit(NULL);\n    };\n    return rv;\n}\n\nINT WINAPI Mine_WSAAddressToStringA(LPSOCKADDR a0,\n                                    DWORD a1,\n                                    LPWSAPROTOCOL_INFOA a2,\n                                    LPSTR a3,\n                                    LPDWORD a4)\n{\n    _PrintEnter(\"WSAAddressToStringA(%p,%x,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSAAddressToStringA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WSAAddressToStringA(,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nINT WINAPI Mine_WSAAddressToStringW(LPSOCKADDR a0,\n                                    DWORD a1,\n                                    LPWSAPROTOCOL_INFOW a2,\n                                    LPWSTR a3,\n                                    LPDWORD a4)\n{\n    _PrintEnter(\"WSAAddressToStringW(%p,%x,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSAAddressToStringW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WSAAddressToStringW(,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE WINAPI Mine_WSAAsyncGetHostByAddr(HWND a0,\n                                         u_int a1,\n                                         char* a2,\n                                         int a3,\n                                         int a4,\n                                         char* a5,\n                                         int a6)\n{\n    _PrintEnter(\"WSAAsyncGetHostByAddr(%p,%x,%p,%x,%x,%p,%x)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_WSAAsyncGetHostByAddr(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"WSAAsyncGetHostByAddr(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE WINAPI Mine_WSAAsyncGetHostByName(HWND a0,\n                                         u_int a1,\n                                         char* a2,\n                                         char* a3,\n                                         int a4)\n{\n    _PrintEnter(\"WSAAsyncGetHostByName(%p,%x,%p,%p,%x)\\n\", a0, a1, a2, a3, a4);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_WSAAsyncGetHostByName(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WSAAsyncGetHostByName(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE WINAPI Mine_WSAAsyncGetProtoByName(HWND a0,\n                                          u_int a1,\n                                          char* a2,\n                                          char* a3,\n                                          int a4)\n{\n    _PrintEnter(\"WSAAsyncGetProtoByName(%p,%x,%p,%p,%x)\\n\", a0, a1, a2, a3, a4);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_WSAAsyncGetProtoByName(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WSAAsyncGetProtoByName(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE WINAPI Mine_WSAAsyncGetProtoByNumber(HWND a0,\n                                            u_int a1,\n                                            int a2,\n                                            char* a3,\n                                            int a4)\n{\n    _PrintEnter(\"WSAAsyncGetProtoByNumber(%p,%x,%p,%p,%x)\\n\", a0, a1, a2, a3, a4);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_WSAAsyncGetProtoByNumber(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WSAAsyncGetProtoByNumber(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE WINAPI Mine_WSAAsyncGetServByName(HWND a0,\n                                         u_int a1,\n                                         char* a2,\n                                         char* a3,\n                                         char* a4,\n                                         int a5)\n{\n    _PrintEnter(\"WSAAsyncGetServByName(%p,%x,%p,%p,%p,%x)\\n\", a0, a1, a2, a3, a4, a5);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_WSAAsyncGetServByName(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"WSAAsyncGetServByName(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE WINAPI Mine_WSAAsyncGetServByPort(HWND a0,\n                                         u_int a1,\n                                         int a2,\n                                         char* a3,\n                                         char* a4,\n                                         int a5)\n{\n    _PrintEnter(\"WSAAsyncGetServByPort(%p,%x,%x,%p,%p,%x)\\n\", a0, a1, a2, a3, a4, a5);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_WSAAsyncGetServByPort(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"WSAAsyncGetServByPort(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSACancelAsyncRequest(HANDLE a0)\n{\n    _PrintEnter(\"WSACancelAsyncRequest(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSACancelAsyncRequest(a0);\n    } __finally {\n        _PrintExit(\"WSACancelAsyncRequest() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSACancelBlockingCall(void)\n{\n    _PrintEnter(\"WSACancelBlockingCall()\\n\");\n\n    int rv = 0;\n    __try {\n        rv = Real_WSACancelBlockingCall();\n    } __finally {\n        _PrintExit(\"WSACancelBlockingCall() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSACleanup(void)\n{\n    _PrintEnter(\"WSACleanup()\\n\");\n\n    int rv = 0;\n    __try {\n        rv = Real_WSACleanup();\n    } __finally {\n        _PrintExit(\"WSACleanup() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_WSACloseEvent(HANDLE a0)\n{\n    _PrintEnter(\"WSACloseEvent(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WSACloseEvent(a0);\n    } __finally {\n        _PrintExit(\"WSACloseEvent() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSAConnect(SOCKET a0,\n                           sockaddr* a1,\n                           int a2,\n                           LPWSABUF a3,\n                           LPWSABUF a4,\n                           LPQOS a5,\n                           LPQOS a6)\n{\n    int rv = 0;\n    __try {\n        rv = Real_WSAConnect(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintEnter(\"%p: WSAConnect(,%p,%x,%p,%p,%p,%p) -> %x\\n\",\n                    a0, a1, a2, a3, a4, a5, a6, rv);\n        _PrintExit(NULL);\n    };\n    return rv;\n}\n\nHANDLE WINAPI Mine_WSACreateEvent(void)\n{\n    _PrintEnter(\"WSACreateEvent()\\n\");\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_WSACreateEvent();\n    } __finally {\n        _PrintExit(\"WSACreateEvent() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSADuplicateSocketA(SOCKET a0,\n                                    DWORD a1,\n                                    LPWSAPROTOCOL_INFOA a2)\n{\n    _PrintEnter(\"%p: WSADuplicateSocketA(,%x,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSADuplicateSocketA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"%p: WSADuplicateSocketA(,,) -> %x\\n\", a0, rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSADuplicateSocketW(SOCKET a0,\n                                    DWORD a1,\n                                    LPWSAPROTOCOL_INFOW a2)\n{\n    _PrintEnter(\"%p: WSADuplicateSocketW(,%x,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSADuplicateSocketW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"%p: WSADuplicateSocketW(,,) -> %x\\n\", a0, rv);\n    };\n    return rv;\n}\n\nINT WINAPI Mine_WSAEnumNameSpaceProvidersA(LPDWORD a0,\n                                           LPWSANAMESPACE_INFOA a1)\n{\n    _PrintEnter(\"WSAEnumNameSpaceProvidersA(%p,%p)\\n\", a0, a1);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSAEnumNameSpaceProvidersA(a0, a1);\n    } __finally {\n        _PrintExit(\"WSAEnumNameSpaceProvidersA(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nINT WINAPI Mine_WSAEnumNameSpaceProvidersW(LPDWORD a0,\n                                           LPWSANAMESPACE_INFOW a1)\n{\n    _PrintEnter(\"WSAEnumNameSpaceProvidersW(%p,%p)\\n\", a0, a1);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSAEnumNameSpaceProvidersW(a0, a1);\n    } __finally {\n        _PrintExit(\"WSAEnumNameSpaceProvidersW(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSAEnumNetworkEvents(SOCKET a0,\n                                     HANDLE a1,\n                                     LPWSANETWORKEVENTS a2)\n{\n    _PrintEnter(\"%p: WSAEnumNetworkEvents(,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSAEnumNetworkEvents(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"%p: WSAEnumNetworkEvents(,,) -> %x\\n\", a0, rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSAEnumProtocolsA(LPINT a0,\n                                  LPWSAPROTOCOL_INFOA a1,\n                                  LPDWORD a2)\n{\n    _PrintEnter(\"WSAEnumProtocolsA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSAEnumProtocolsA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WSAEnumProtocolsA(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSAEnumProtocolsW(LPINT a0,\n                                  LPWSAPROTOCOL_INFOW a1,\n                                  LPDWORD a2)\n{\n    _PrintEnter(\"WSAEnumProtocolsW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSAEnumProtocolsW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WSAEnumProtocolsW(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_WSAGetOverlappedResult(SOCKET a0,\n                                        LPWSAOVERLAPPED a1,\n                                        LPDWORD a2,\n                                        BOOL a3,\n                                        LPDWORD a4)\n{\n    _PrintEnter(\"%p: WSAGetOverlappedResult(,%p,%p,%x,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WSAGetOverlappedResult(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"%p: WSAGetOverlappedResult(,,,,) -> %x\\n\", a0, rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_WSAIsBlocking(void)\n{\n    _PrintEnter(\"WSAIsBlocking()\\n\");\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WSAIsBlocking();\n    } __finally {\n        _PrintExit(\"WSAIsBlocking() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nSOCKET WINAPI Mine_WSAJoinLeaf(SOCKET a0,\n                               sockaddr* a1,\n                               int a2,\n                               LPWSABUF a3,\n                               LPWSABUF a4,\n                               LPQOS a5,\n                               LPQOS a6,\n                               DWORD a7)\n{\n    _PrintEnter(\"%p: WSAJoinLeaf(,%p,%x,%p,%p,%p,%p,%x)\\n\", a0, a1, a2, a3, a4, a5, a6, a7);\n\n    SOCKET rv = 0;\n    __try {\n        rv = Real_WSAJoinLeaf(a0, a1, a2, a3, a4, a5, a6, a7);\n    } __finally {\n        _PrintExit(\"%p: WSAJoinLeaf(,,,,,,,) -> %p\\n\", a0, rv);\n    };\n    return rv;\n}\n\nINT WINAPI Mine_WSAProviderConfigChange(LPHANDLE a0,\n                                        LPWSAOVERLAPPED a1,\n                                        LPWSAOVERLAPPED_COMPLETION_ROUTINE a2)\n{\n    _PrintEnter(\"WSAProviderConfigChange(%p,%p,%p)\\n\", a0, a1, a2);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSAProviderConfigChange(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WSAProviderConfigChange(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSARecv(SOCKET a0,\n                        LPWSABUF a1,\n                        DWORD a2,\n                        LPDWORD a3,\n                        LPDWORD a4,\n                        LPWSAOVERLAPPED a5,\n                        LPWSAOVERLAPPED_COMPLETION_ROUTINE a6)\n{\n    int rv = -1;\n    __try {\n        rv = Real_WSARecv(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        if (rv == 0) {\n            _PrintEnter(\"%p: WSARecv(,%p,%x,%p,%p,%p,%p)\\n\",\n                        a0, a1, a2, a3, a4, a5, a6);\n#if 0\n            _PrintDump(a0, a1[0].buf, a1[0].len < *a3 ? a1[0].len : *a3);\n#endif\n            _PrintExit(\"%p: WSARecv(,,,,,,) -> %x\\n\", a0, rv);\n        }\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSARecvDisconnect(SOCKET a0,\n                                  LPWSABUF a1)\n{\n    _PrintEnter(\"%p: WSARecvDisconnect(,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSARecvDisconnect(a0, a1);\n    } __finally {\n        _PrintExit(\"%p: WSARecvDisconnect(,) -> %x\\n\", a0, rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSARecvFrom(SOCKET a0,\n                            LPWSABUF a1,\n                            DWORD a2,\n                            LPDWORD a3,\n                            LPDWORD a4,\n                            sockaddr* a5,\n                            LPINT a6,\n                            LPWSAOVERLAPPED a7,\n                            LPWSAOVERLAPPED_COMPLETION_ROUTINE a8)\n{\n    _PrintEnter(\"%p: WSARecvFrom(,%p,%x,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSARecvFrom(a0, a1, a2, a3, a4, a5, a6, a7, a8);\n    } __finally {\n        _PrintExit(\"%p: WSARecvFrom(,,,,,,,,) -> %x\\n\", a0, rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_WSAResetEvent(HANDLE a0)\n{\n    _PrintEnter(\"WSAResetEvent(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WSAResetEvent(a0);\n    } __finally {\n        _PrintExit(\"WSAResetEvent() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSASend(SOCKET a0,\n                        LPWSABUF a1,\n                        DWORD a2,\n                        LPDWORD a3,\n                        DWORD a4,\n                        LPWSAOVERLAPPED a5,\n                        LPWSAOVERLAPPED_COMPLETION_ROUTINE a6)\n{\n    _PrintEnter(\"%p: WSASend(,%p,%x,%p,%x,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSASend(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"%p: WSASend(,,,,,,) -> %x\\n\", a0, rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSASendDisconnect(SOCKET a0,\n                                  LPWSABUF a1)\n{\n    _PrintEnter(\"%p: WSASendDisconnect(,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSASendDisconnect(a0, a1);\n    } __finally {\n        _PrintExit(\"%p: WSASendDisconnect(,) -> %x\\n\", a0, rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSASendTo(SOCKET a0,\n                          LPWSABUF a1,\n                          DWORD a2,\n                          LPDWORD a3,\n                          DWORD a4,\n                          sockaddr* a5,\n                          int a6,\n                          LPWSAOVERLAPPED a7,\n                          LPWSAOVERLAPPED_COMPLETION_ROUTINE a8)\n{\n    _PrintEnter(\"%p: WSASendTo(,%p,%x,%p,%x,%p,%x,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSASendTo(a0, a1, a2, a3, a4, a5, a6, a7, a8);\n    } __finally {\n        _PrintExit(\"%p: WSASendTo(,,,,,,,,) -> %x\\n\", a0, rv);\n    };\n    return rv;\n}\n\nINT WINAPI Mine_WSAStringToAddressA(LPSTR a0,\n                                    INT a1,\n                                    LPWSAPROTOCOL_INFOA a2,\n                                    LPSOCKADDR a3,\n                                    LPINT a4)\n{\n    _PrintEnter(\"WSAStringToAddressA(%p,%x,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSAStringToAddressA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WSAStringToAddressA(,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nINT WINAPI Mine_WSAStringToAddressW(LPWSTR a0,\n                                    INT a1,\n                                    LPWSAPROTOCOL_INFOW a2,\n                                    LPSOCKADDR a3,\n                                    LPINT a4)\n{\n    _PrintEnter(\"WSAStringToAddressW(%p,%x,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSAStringToAddressW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WSAStringToAddressW(,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD WINAPI Mine_WSAWaitForMultipleEvents(DWORD a0,\n                                           void** a1,\n                                           BOOL a2,\n                                           DWORD a3,\n                                           BOOL a4)\n{\n    _PrintEnter(\"WSAWaitForMultipleEvents(%x,%p,%x,%x,%x)\\n\", a0, a1, a2, a3, a4);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_WSAWaitForMultipleEvents(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WSAWaitForMultipleEvents(,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nSOCKET WINAPI Mine_accept(SOCKET a0,\n                          sockaddr* a1,\n                          int* a2)\n{\n    SOCKET rv = 0;\n    __try {\n        rv = Real_accept(a0, a1, a2);\n    } __finally {\n        WCHAR wzAddress[512] = L\"\";\n        int err = WSAGetLastError();\n        if (rv != INVALID_SOCKET) {\n            DWORD nAddress = ARRAYSIZE(wzAddress);\n            if (Real_WSAAddressToStringW(a1, *a2, NULL, wzAddress, &nAddress) != 0) {\n                wzAddress[0] = 0;\n            }\n        }\n        WSASetLastError(err);\n\n        if (wzAddress[0]) {\n            _PrintEnter(\"%p: accept(,%ls,%p) -> %p\\n\", a0, wzAddress, a2, rv);\n        }\n        else {\n            _PrintEnter(\"%p: accept(,%p,%p) -> %p\\n\", a0, a1, a2, rv);\n        }\n        _PrintExit(NULL);\n    };\n    return rv;\n}\n\nint WINAPI Mine_closesocket(SOCKET a0)\n{\n    int rv = 0;\n    __try {\n        rv = Real_closesocket(a0);\n    } __finally {\n        _PrintEnter(\"%p: closesocket() -> %x\\n\", a0, rv);\n        _PrintExit(NULL);\n    };\n    return rv;\n}\n\nint WINAPI Mine_connect(SOCKET a0,\n                        sockaddr* name,\n                        int namelen)\n{\n    int rv = 0;\n    __try {\n        rv = Real_connect(a0, name, namelen);\n    } __finally {\n        WCHAR wzAddress[512];\n        DWORD nAddress = ARRAYSIZE(wzAddress);\n        int err = WSAGetLastError();\n        if (Real_WSAAddressToStringW(name, namelen, NULL, wzAddress, &nAddress) == 0) {\n            if (rv == SOCKET_ERROR) {\n                _PrintEnter(\"%p: connect(,%p:%ls,%x) -> %x [%d]\\n\",\n                            a0, name, wzAddress, namelen, rv, err);\n            }\n            else {\n                _PrintEnter(\"%p: connect(,%p:%ls,%x) -> %x\\n\",\n                            a0, name, wzAddress, namelen, rv);\n            }\n        }\n        else {\n            if (rv == SOCKET_ERROR) {\n                _PrintEnter(\"%p: connect(,%p,%x) -> %x [%d]\\n\",\n                            a0, name, namelen, rv, err);\n            }\n            else {\n                _PrintEnter(\"%p: connect(,%p,%x) -> %x\\n\",\n                            a0, name, namelen, rv);\n            }\n        }\n        WSASetLastError(err);\n        _PrintExit(NULL);\n    };\n    return rv;\n}\n\nint WINAPI Mine_listen(SOCKET a0,\n                       int a1)\n{\n    _PrintEnter(\"%p: listen(,%x)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_listen(a0, a1);\n    } __finally {\n        _PrintExit(\"%p: listen(,) -> %x\\n\", a0, rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_recv(SOCKET a0,\n                     char* a1,\n                     int a2,\n                     int a3)\n{\n    _PrintEnter(\"%p: recv(,%p,%x,%x)\\n\", a0, a1, a2, a3);\n\n    int rv = 0;\n    __try {\n        rv = Real_recv(a0, a1, a2, a3);\n#if 0\n        _PrintDump(a0, a1, rv);\n#endif\n    } __finally {\n        _PrintExit(\"%p: recv(,%p,,) -> %x\\n\", a0, a1, rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_recvfrom(SOCKET a0,\n                         char* a1,\n                         int a2,\n                         int a3,\n                         sockaddr* a4,\n                         int* a5)\n{\n    _PrintEnter(\"%p: recvfrom(,%p,%x,%x,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    int rv = 0;\n    __try {\n        rv = Real_recvfrom(a0, a1, a2, a3, a4, a5);\n#if 0\n        _PrintDump(a0, a1, rv);\n#endif\n    } __finally {\n        _PrintExit(\"%p: recvfrom(,%p,,,,) -> %x\\n\", a0, a1, rv);\n    };\n    return rv;\n}\n\nVOID _PrintDump(SOCKET socket, PCHAR pszData, INT cbData)\n{\n    if (pszData && cbData > 0) {\n        CHAR szBuffer[256];\n        PCHAR pszBuffer = szBuffer;\n        INT cbBuffer = 0;\n        INT nLines = 0;\n\n        while (cbData > 0) {\n#if ABBREVIATE\n            if (nLines > 20) {\n                *pszBuffer++ = '.';\n                *pszBuffer++ = '.';\n                *pszBuffer++ = '.';\n                cbBuffer += 3;\n                break;\n            }\n#endif\n\n            if (*pszData == '\\t') {\n                *pszBuffer++ = '\\\\';\n                *pszBuffer++ = 't';\n                cbBuffer += 2;\n                pszData++;\n                cbData--;\n                continue;\n            }\n            if (*pszData == '\\r') {\n                *pszBuffer++ = '\\\\';\n                *pszBuffer++ = 'r';\n                cbBuffer += 2;\n                pszData++;\n                cbData--;\n                continue;\n            }\n            else if (*pszData == '\\n') {\n                *pszBuffer++ = '\\\\';\n                *pszBuffer++ = 'n';\n                cbBuffer += 2;\n                *pszBuffer++ = '\\0';\n                _Print(\"%p:   %hs\\n\", socket, szBuffer);\n                nLines++;\n                pszBuffer = szBuffer;\n                cbBuffer = 0;\n                pszData++;\n                cbData--;\n                continue;\n            }\n            else if (cbBuffer >= 80) {\n                *pszBuffer++ = '\\0';\n                _Print(\"%p:   %hs\\n\", socket, szBuffer);\n                nLines++;\n                pszBuffer = szBuffer;\n                cbBuffer = 0;\n            }\n\n            if (*pszData < ' ' || *pszData >= 127) {\n                *pszBuffer++ = '\\\\';\n                *pszBuffer++ = 'x';\n                *pszBuffer++ = \"0123456789ABCDEF\"[(*pszData & 0xf0) >> 4];\n                *pszBuffer++ = \"0123456789ABCDEF\"[(*pszData & 0x0f)];\n                cbBuffer += 4;\n            }\n            else {\n                *pszBuffer++ = *pszData;\n            }\n            cbBuffer++;\n            pszData++;\n            cbData--;\n        }\n\n        if (cbBuffer > 0) {\n            *pszBuffer++ = '\\0';\n            _Print(\"%p:   %hs\\n\", socket, szBuffer);\n        }\n    }\n}\n\nint WINAPI Mine_send(SOCKET a0,\n                     char* a1,\n                     int a2,\n                     int a3)\n{\n    _PrintEnter(\"%p: send(,%p,%x,%x)\\n\", a0, a1, a2, a3);\n#if 0\n    _PrintDump(a0, a1, a2);\n#endif\n\n    int rv = 0;\n    __try {\n        rv = Real_send(a0, a1, a2, a3);\n    } __finally {\n        if (rv == SOCKET_ERROR) {\n            int err = WSAGetLastError();\n            _PrintExit(\"%p: send(,,,) -> %x (%d)\\n\", a0, rv, err);\n        }\n        else {\n            _PrintExit(\"%p: send(,,,) -> %x\\n\", a0, rv);\n        }\n    };\n    return rv;\n}\n\nint WINAPI Mine_sendto(SOCKET a0,\n                       char* a1,\n                       int a2,\n                       int a3,\n                       sockaddr* a4,\n                       int a5)\n{\n    _PrintEnter(\"%p: sendto(,%s,%x,%x,%p,%x)\\n\", a0, a1, a2, a3, a4, a5);\n\n    int rv = 0;\n    __try {\n        rv = Real_sendto(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"%p: sendto(%ls,,,,,) -> %x\\n\", a0, a1, rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_shutdown(SOCKET a0,\n                         int a1)\n{\n    _PrintEnter(\"%p: shutdown(,%x)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_shutdown(a0, a1);\n    } __finally {\n        _PrintExit(\"%p: shutdown(,) -> %x\\n\", a0, rv);\n    };\n    return rv;\n}\n\nSECURITY_STATUS SEC_ENTRY Mine_EncryptMessage( PCtxtHandle         phContext,\n                                               unsigned long       fQOP,\n                                               PSecBufferDesc      pMessage,\n                                               unsigned long       MessageSeqNo)\n{\n    _PrintEnter(\"%p: EncryptMessage(%x,%x,%x)\\n\", phContext, fQOP, pMessage, MessageSeqNo);\n\n    SECURITY_STATUS rv = 0;\n    __try {\n        if (pMessage != NULL) {\n            for (unsigned b = 0; b < pMessage->cBuffers; b++) {\n                PSecBuffer pBuffer = &pMessage->pBuffers[b];\n                if ((pBuffer->BufferType & 0xfff) == 1) {\n                    _Print(\"%p:  Type=%08x Size=%d\\n\", phContext,\n                           pBuffer->BufferType,\n                           pBuffer->cbBuffer);\n                    _PrintDump((SOCKET)phContext, (PCHAR)pBuffer->pvBuffer, pBuffer->cbBuffer);\n                }\n            }\n        }\n        rv = Real_EncryptMessage(phContext, fQOP, pMessage, MessageSeqNo);\n    } __finally {\n        _PrintExit(\"%p: EncryptMessage(,) -> %x\\n\", phContext, rv);\n    };\n    return rv;\n}\n\nSECURITY_STATUS SEC_ENTRY Mine_DecryptMessage( PCtxtHandle         phContext,\n                                               PSecBufferDesc      pMessage,\n                                               unsigned long       MessageSeqNo,\n                                               unsigned long *     pfQOP)\n{\n    _PrintEnter(\"%p: DecryptMessage(%x,%x,%x)\\n\", phContext, pMessage, MessageSeqNo, pfQOP);\n\n    SECURITY_STATUS rv = 0;\n    __try {\n        rv = Real_DecryptMessage(phContext, pMessage, MessageSeqNo, pfQOP);\n        for (unsigned b = 0; b < pMessage->cBuffers; b++) {\n            PSecBuffer pBuffer = &pMessage->pBuffers[b];\n            if ((pBuffer->BufferType & 0xfff) == 1) {\n                _Print(\"%p:  Type=%08x Size=%d\\n\", phContext,\n                       pBuffer->BufferType,\n                       pBuffer->cbBuffer);\n                _PrintDump((SOCKET)phContext, (PCHAR)pBuffer->pvBuffer, pBuffer->cbBuffer);\n            }\n        }\n    } __finally {\n        _PrintExit(\"%p: DecryptMessage(,) -> %x\\n\", phContext, rv);\n    };\n    return rv;\n}\n\n/////////////////////////////////////////////////////////////\n// AttachDetours\n//\nPCHAR DetRealName(PCHAR psz)\n{\n    PCHAR pszBeg = psz;\n    // Move to end of name.\n    while (*psz) {\n        psz++;\n    }\n    // Move back through A-Za-z0-9 names.\n    while (psz > pszBeg &&\n           ((psz[-1] >= 'A' && psz[-1] <= 'Z') ||\n            (psz[-1] >= 'a' && psz[-1] <= 'z') ||\n            (psz[-1] >= '0' && psz[-1] <= '9'))) {\n        psz--;\n    }\n    return psz;\n}\n\nVOID DetAttach(PVOID *ppbReal, PVOID pbMine, PCHAR psz)\n{\n    LONG l = DetourAttach(ppbReal, pbMine);\n    if (l != 0) {\n        Syelog(SYELOG_SEVERITY_NOTICE,\n               \"Attach failed: `%s': error %d\\n\", DetRealName(psz), l);\n    }\n}\n\nVOID DetDetach(PVOID *ppbReal, PVOID pbMine, PCHAR psz)\n{\n    LONG l = DetourDetach(ppbReal, pbMine);\n    if (l != 0) {\n        Syelog(SYELOG_SEVERITY_NOTICE,\n               \"Detach failed: `%s': error %d\\n\", DetRealName(psz), l);\n    }\n}\n\n#define ATTACH(x)       DetAttach(&(PVOID&)Real_##x,Mine_##x,#x)\n#define DETACH(x)       DetDetach(&(PVOID&)Real_##x,Mine_##x,#x)\n\nLONG AttachDetours(VOID)\n{\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n\n    ATTACH(CreateProcessW);\n    ATTACH(DecryptMessage);\n    ATTACH(EncryptMessage);\n    ATTACH(WSAAccept);\n    ATTACH(WSAAddressToStringA);\n    ATTACH(WSAAddressToStringW);\n    ATTACH(WSAAsyncGetHostByAddr);\n    ATTACH(WSAAsyncGetHostByName);\n    ATTACH(WSAAsyncGetProtoByName);\n    ATTACH(WSAAsyncGetProtoByNumber);\n    ATTACH(WSAAsyncGetServByName);\n    ATTACH(WSAAsyncGetServByPort);\n    ATTACH(WSACancelAsyncRequest);\n    ATTACH(WSACancelBlockingCall);\n    ATTACH(WSACleanup);\n    ATTACH(WSACloseEvent);\n    ATTACH(WSAConnect);\n    ATTACH(WSACreateEvent);\n    ATTACH(WSADuplicateSocketA);\n    ATTACH(WSADuplicateSocketW);\n    ATTACH(WSAEnumNameSpaceProvidersA);\n    ATTACH(WSAEnumNameSpaceProvidersW);\n    ATTACH(WSAEnumNetworkEvents);\n    ATTACH(WSAEnumProtocolsA);\n    ATTACH(WSAEnumProtocolsW);\n    ATTACH(WSAIsBlocking);\n    ATTACH(WSAJoinLeaf);\n    ATTACH(WSAProviderConfigChange);\n    ATTACH(WSARecv);\n    ATTACH(WSARecvDisconnect);\n    ATTACH(WSARecvFrom);\n    ATTACH(WSAResetEvent);\n    ATTACH(WSASend);\n    ATTACH(WSASendDisconnect);\n    ATTACH(WSASendTo);\n    ATTACH(WSAStringToAddressA);\n    ATTACH(WSAStringToAddressW);\n    ATTACH(WSAWaitForMultipleEvents);\n    ATTACH(accept);\n    ATTACH(closesocket);\n    ATTACH(connect);\n    ATTACH(listen);\n    ATTACH(recv);\n    ATTACH(recvfrom);\n    ATTACH(send);\n    ATTACH(sendto);\n    ATTACH(shutdown);\n\n    return DetourTransactionCommit();\n}\n\nLONG DetachDetours(VOID)\n{\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n\n    DETACH(CreateProcessW);\n    DETACH(DecryptMessage);\n    DETACH(EncryptMessage);\n    DETACH(WSAAccept);\n    DETACH(WSAAddressToStringA);\n    DETACH(WSAAddressToStringW);\n    DETACH(WSAAsyncGetHostByAddr);\n    DETACH(WSAAsyncGetHostByName);\n    DETACH(WSAAsyncGetProtoByName);\n    DETACH(WSAAsyncGetProtoByNumber);\n    DETACH(WSAAsyncGetServByName);\n    DETACH(WSAAsyncGetServByPort);\n    DETACH(WSACancelAsyncRequest);\n    DETACH(WSACancelBlockingCall);\n    DETACH(WSACleanup);\n    DETACH(WSACloseEvent);\n    DETACH(WSAConnect);\n    DETACH(WSACreateEvent);\n    DETACH(WSADuplicateSocketA);\n    DETACH(WSADuplicateSocketW);\n    DETACH(WSAEnumNameSpaceProvidersA);\n    DETACH(WSAEnumNameSpaceProvidersW);\n    DETACH(WSAEnumNetworkEvents);\n    DETACH(WSAEnumProtocolsA);\n    DETACH(WSAEnumProtocolsW);\n    DETACH(WSAIsBlocking);\n    DETACH(WSAJoinLeaf);\n    DETACH(WSAProviderConfigChange);\n    DETACH(WSARecv);\n    DETACH(WSARecvDisconnect);\n    DETACH(WSARecvFrom);\n    DETACH(WSAResetEvent);\n    DETACH(WSASend);\n    DETACH(WSASendDisconnect);\n    DETACH(WSASendTo);\n    DETACH(WSAStringToAddressA);\n    DETACH(WSAStringToAddressW);\n    DETACH(WSAWaitForMultipleEvents);\n    DETACH(accept);\n    DETACH(closesocket);\n    DETACH(connect);\n    DETACH(listen);\n    DETACH(recv);\n    DETACH(recvfrom);\n    DETACH(send);\n    DETACH(sendto);\n    DETACH(shutdown);\n\n    return DetourTransactionCommit();\n}\n\n//\n//////////////////////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////// Logging System.\n//\nstatic BOOL s_bLog = 1;\nstatic LONG s_nTlsIndent = -1;\nstatic LONG s_nTlsThread = -1;\nstatic LONG s_nThreadCnt = 0;\n\nVOID _PrintEnter(const CHAR *psz, ...)\n{\n    DWORD dwErr = GetLastError();\n\n    LONG nIndent = 0;\n    LONG nThread = 0;\n    if (s_nTlsIndent >= 0) {\n        nIndent = (LONG)(LONG_PTR)TlsGetValue(s_nTlsIndent);\n        TlsSetValue(s_nTlsIndent, (PVOID)(LONG_PTR)(nIndent + 1));\n    }\n    if (s_nTlsThread >= 0) {\n        nThread = (LONG)(LONG_PTR)TlsGetValue(s_nTlsThread);\n    }\n\n    if (s_bLog && psz) {\n        CHAR szBuf[1024];\n        PCHAR pszBuf = szBuf;\n        PCHAR pszEnd = szBuf + ARRAYSIZE(szBuf) - 1;\n        LONG nLen = (nIndent > 0) ? (nIndent < 35 ? nIndent * 2 : 70) : 0;\n        *pszBuf++ = (CHAR)('0' + ((nThread / 100) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 10) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 1) % 10));\n        *pszBuf++ = ' ';\n        while (nLen-- > 0) {\n            *pszBuf++ = ' ';\n        }\n\n        va_list  args;\n        va_start(args, psz);\n\n        while ((*pszBuf++ = *psz++) != 0 && pszBuf < pszEnd) {\n            // Copy characters.\n        }\n        *pszEnd = '\\0';\n        SyelogV(SYELOG_SEVERITY_INFORMATION,\n                szBuf, args);\n\n        va_end(args);\n    }\n    SetLastError(dwErr);\n}\n\nVOID _PrintExit(const CHAR *psz, ...)\n{\n    DWORD dwErr = GetLastError();\n\n    LONG nIndent = 0;\n    LONG nThread = 0;\n    if (s_nTlsIndent >= 0) {\n        nIndent = (LONG)(LONG_PTR)TlsGetValue(s_nTlsIndent) - 1;\n        ASSERT(nIndent >= 0);\n        TlsSetValue(s_nTlsIndent, (PVOID)(LONG_PTR)nIndent);\n    }\n    if (s_nTlsThread >= 0) {\n        nThread = (LONG)(LONG_PTR)TlsGetValue(s_nTlsThread);\n    }\n\n    if (s_bLog && psz) {\n        CHAR szBuf[1024];\n        PCHAR pszBuf = szBuf;\n        PCHAR pszEnd = szBuf + ARRAYSIZE(szBuf) - 1;\n        LONG nLen = (nIndent > 0) ? (nIndent < 35 ? nIndent * 2 : 70) : 0;\n        *pszBuf++ = (CHAR)('0' + ((nThread / 100) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 10) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 1) % 10));\n        *pszBuf++ = ' ';\n        while (nLen-- > 0) {\n            *pszBuf++ = ' ';\n        }\n\n        va_list  args;\n        va_start(args, psz);\n\n        while ((*pszBuf++ = *psz++) != 0 && pszBuf < pszEnd) {\n            // Copy characters.\n        }\n        *pszEnd = '\\0';\n        SyelogV(SYELOG_SEVERITY_INFORMATION,\n                szBuf, args);\n\n        va_end(args);\n    }\n    SetLastError(dwErr);\n}\n\nVOID _Print(const CHAR *psz, ...)\n{\n    DWORD dwErr = GetLastError();\n\n    LONG nIndent = 0;\n    LONG nThread = 0;\n    if (s_nTlsIndent >= 0) {\n        nIndent = (LONG)(LONG_PTR)TlsGetValue(s_nTlsIndent);\n    }\n    if (s_nTlsThread >= 0) {\n        nThread = (LONG)(LONG_PTR)TlsGetValue(s_nTlsThread);\n    }\n\n    if (s_bLog && psz) {\n        CHAR szBuf[1024];\n        PCHAR pszBuf = szBuf;\n        PCHAR pszEnd = szBuf + ARRAYSIZE(szBuf) - 1;\n        LONG nLen = (nIndent > 0) ? (nIndent < 35 ? nIndent * 2 : 70) : 0;\n        *pszBuf++ = (CHAR)('0' + ((nThread / 100) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 10) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 1) % 10));\n        *pszBuf++ = ' ';\n        while (nLen-- > 0) {\n            *pszBuf++ = ' ';\n        }\n\n        va_list  args;\n        va_start(args, psz);\n\n        while ((*pszBuf++ = *psz++) != 0 && pszBuf < pszEnd) {\n            // Copy characters.\n        }\n        *pszEnd = '\\0';\n        SyelogV(SYELOG_SEVERITY_INFORMATION,\n                szBuf, args);\n\n        va_end(args);\n    }\n\n    SetLastError(dwErr);\n}\n\nVOID AssertMessage(CONST PCHAR pszMsg, CONST PCHAR pszFile, ULONG nLine)\n{\n    Syelog(SYELOG_SEVERITY_FATAL,\n           \"ASSERT(%s) failed in %s, line %d.\\n\", pszMsg, pszFile, nLine);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// DLL module information\n//\nBOOL ThreadAttach(HMODULE hDll)\n{\n    (void)hDll;\n\n    if (s_nTlsIndent >= 0) {\n        TlsSetValue(s_nTlsIndent, (PVOID)0);\n    }\n    if (s_nTlsThread >= 0) {\n        LONG nThread = InterlockedIncrement(&s_nThreadCnt);\n        TlsSetValue(s_nTlsThread, (PVOID)(LONG_PTR)nThread);\n    }\n    return TRUE;\n}\n\nBOOL ThreadDetach(HMODULE hDll)\n{\n    (void)hDll;\n\n    if (s_nTlsIndent >= 0) {\n        TlsSetValue(s_nTlsIndent, (PVOID)0);\n    }\n    if (s_nTlsThread >= 0) {\n        TlsSetValue(s_nTlsThread, (PVOID)0);\n    }\n    return TRUE;\n}\n\nBOOL ProcessAttach(HMODULE hDll)\n{\n    s_bLog = FALSE;\n    s_nTlsIndent = TlsAlloc();\n    s_nTlsThread = TlsAlloc();\n\n    WCHAR wzExeName[MAX_PATH];\n    s_hInst = hDll;\n\n    Real_GetModuleFileNameW(hDll, s_wzDllPath, ARRAYSIZE(s_wzDllPath));\n    Real_GetModuleFileNameW(NULL, wzExeName, ARRAYSIZE(wzExeName));\n\n    SyelogOpen(\"trcssl\" DETOURS_STRINGIFY(DETOURS_BITS), SYELOG_FACILITY_APPLICATION);\n    Syelog(SYELOG_SEVERITY_INFORMATION,\n           \"##################################################################\\n\");\n    Syelog(SYELOG_SEVERITY_INFORMATION,\n           \"### %ls\\n\", wzExeName);\n    LONG error = AttachDetours();\n    if (error != NO_ERROR) {\n        Syelog(SYELOG_SEVERITY_FATAL, \"### Error attaching detours: %d\\n\", error);\n    }\n\n    ThreadAttach(hDll);\n\n    s_bLog = TRUE;\n    return TRUE;\n}\n\nBOOL ProcessDetach(HMODULE hDll)\n{\n    ThreadDetach(hDll);\n    s_bLog = FALSE;\n\n    LONG error = DetachDetours();\n    if (error != NO_ERROR) {\n        Syelog(SYELOG_SEVERITY_FATAL, \"### Error detaching detours: %d\\n\", error);\n    }\n\n    Syelog(SYELOG_SEVERITY_NOTICE, \"### Closing.\\n\");\n    SyelogClose(FALSE);\n\n    if (s_nTlsIndent >= 0) {\n        TlsFree(s_nTlsIndent);\n    }\n    if (s_nTlsThread >= 0) {\n        TlsFree(s_nTlsThread);\n    }\n    return TRUE;\n}\n\nBOOL APIENTRY DllMain(HINSTANCE hModule, DWORD dwReason, PVOID lpReserved)\n{\n    (void)hModule;\n    (void)lpReserved;\n\n    if (DetourIsHelperProcess()) {\n        return TRUE;\n    }\n\n    switch (dwReason) {\n      case DLL_PROCESS_ATTACH:\n        DetourRestoreAfterWith();\n        return ProcessAttach(hModule);\n      case DLL_PROCESS_DETACH:\n        return ProcessDetach(hModule);\n      case DLL_THREAD_ATTACH:\n        return ThreadAttach(hModule);\n      case DLL_THREAD_DETACH:\n        return ThreadDetach(hModule);\n    }\n    return TRUE;\n}\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/tracessl/trcssl.rc",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Version information for trcssl.rc.\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include \"detver.h\"\n\n#define VER_INTERNALNAME_STR        \"trcssl\" DETOURS_STRINGIFY(DETOURS_BITS)\n#define VER_ORIGINALFILENAME_STR    \"trcsll\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\"\n#define VER_FILEDESCRIPTION_STR     \"Detours SSL Trace Module\"\n#define VER_COMPANYNAME_STR         \"Microsoft Corporation\"\n\n#include \"common.ver\"\n"
  },
  {
    "path": "ext/detours/samples/tracetcp/Makefile",
    "content": "##############################################################################\n##\n##  Utility to trace WinSock TCP APIs.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\nLIBS=$(LIBS) kernel32.lib ws2_32.lib\n\n##############################################################################\n\nall: dirs \\\n    $(BIND)\\trctcp$(DETOURS_BITS).dll \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\trctcp$(DETOURS_BITS).bsc \\\n!ENDIF\n    option\n\n##############################################################################\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\n$(OBJD)\\trctcp.obj: trctcp.cpp\n\n$(OBJD)\\trctcp.res: trctcp.rc\n\n$(BIND)\\trctcp$(DETOURS_BITS).dll: $(OBJD)\\trctcp.obj $(OBJD)\\trctcp.res $(DEPS)\n    cl /LD $(CFLAGS) /Fe$@ /Fd$(@R).pdb \\\n        $(OBJD)\\trctcp.obj $(OBJD)\\trctcp.res \\\n        /link $(LINKFLAGS) /subsystem:console \\\n        /export:DetourFinishHelperProcess,@1,NONAME \\\n        $(LIBS)\n\n$(OBJD)\\trctcp$(DETOURS_BITS).bsc : $(OBJD)\\trctcp.obj\n    bscmake /v /n /o $@ $(OBJD)\\trctcp.sbr\n\n##############################################################################\n\nclean:\n    -del *~ test.txt 2>nul\n    -del $(BIND)\\trctcp*.* 2>nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\n############################################### Install non-bit-size binaries.\n\n!IF \"$(DETOURS_OPTION_PROCESSOR)\" != \"\"\n\n$(OPTD)\\trctcp$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\trctcp$(DETOURS_OPTION_BITS).pdb:\n\n$(BIND)\\trctcp$(DETOURS_OPTION_BITS).dll : $(OPTD)\\trctcp$(DETOURS_OPTION_BITS).dll\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n$(BIND)\\trctcp$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\trctcp$(DETOURS_OPTION_BITS).pdb\n    @if exist $? copy /y $? $(BIND) >nul && echo $@ copied from $(DETOURS_OPTION_PROCESSOR).\n\noption: \\\n    $(BIND)\\trctcp$(DETOURS_OPTION_BITS).dll \\\n    $(BIND)\\trctcp$(DETOURS_OPTION_BITS).pdb \\\n\n!ELSE\n\noption:\n\n!ENDIF\n\n##############################################################################\n\ntest: all\n    @echo -------- Logging output to test.txt ------------\n    start $(BIND)\\syelogd.exe /o test.txt\n    $(BIND)\\sleep5.exe 1\n    @echo -------- Should load trctcp$(DETOURS_BITS).dll dynamically using withdll.exe ------------\n    @echo.\n    @echo ** NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE **\n    @echo **\n    @echo ** Close the Internet Explorer window to continue test.\n    @echo **\n    @echo ** NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE **\n    @echo.\n    $(BIND)\\withdll -d:$(BIND)\\trctcp$(DETOURS_BITS).dll \\\n        \"c:\\program files\\Internet Explorer\\iexplore.exe\" \"http://www.microsoft.com\"\n    @echo -------- Log from syelog -------------\n    type test.txt\n\ndebug: all\n    windbg -g -G -o $(BIND)\\withdll -d:$(BIND)\\trctcp$(DETOURS_BITS).dll \\\n        \"c:\\program files\\Internet Explorer\\iexplore.exe\" \"http://www.microsoft.com\"\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/tracetcp/trctcp.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (trctcp.cpp of trctcp.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#define _WIN32_WINNT        0x0400\n#define WIN32\n#define NT\n#define _WINSOCK_DEPRECATED_NO_WARNINGS\n\n#define DBG_TRACE   0\n\n#if _MSC_VER >= 1300\n#include <winsock2.h>\n#endif\n#include <windows.h>\n#include <stdio.h>\n#include \"detours.h\"\n#include \"syelog.h\"\n\n#define PULONG_PTR          PVOID\n#define PLONG_PTR           PVOID\n#define ULONG_PTR           PVOID\n#define ENUMRESNAMEPROCA    PVOID\n#define ENUMRESNAMEPROCW    PVOID\n#define ENUMRESLANGPROCA    PVOID\n#define ENUMRESLANGPROCW    PVOID\n#define ENUMRESTYPEPROCA    PVOID\n#define ENUMRESTYPEPROCW    PVOID\n#define STGOPTIONS          PVOID\n\n//////////////////////////////////////////////////////////////////////////////\n#pragma warning(disable:4127)   // Many of our asserts are constants.\n\n#define ASSERT_ALWAYS(x)   \\\n    do {                                                        \\\n    if (!(x)) {                                                 \\\n            AssertMessage(#x, __FILE__, __LINE__);              \\\n            DebugBreak();                                       \\\n    }                                                           \\\n    } while (0)\n\n#ifndef NDEBUG\n#define ASSERT(x)           ASSERT_ALWAYS(x)\n#else\n#define ASSERT(x)\n#endif\n\n#define UNUSED(c)       (c) = (c)\n\n//////////////////////////////////////////////////////////////////////////////\nstatic HMODULE s_hInst = NULL;\nstatic WCHAR s_wzDllPath[MAX_PATH];\n\nVOID _PrintDump(SOCKET socket, PCHAR pszData, INT cbData);\nVOID _PrintEnter(PCSTR psz, ...);\nVOID _PrintExit(PCSTR psz, ...);\nVOID _Print(PCSTR psz, ...);\n\nVOID AssertMessage(CONST PCHAR pszMsg, CONST PCHAR pszFile, ULONG nLine);\n\n//////////////////////////////////////////////////////////////////////////////\n//\nextern \"C\" {\n    HANDLE (WINAPI * Real_CreateFileW)(LPCWSTR a0,\n                                       DWORD a1,\n                                       DWORD a2,\n                                       LPSECURITY_ATTRIBUTES a3,\n                                       DWORD a4,\n                                       DWORD a5,\n                                       HANDLE a6)\n        = CreateFileW;\n\n    BOOL (WINAPI * Real_WriteFile)(HANDLE hFile,\n                                   LPCVOID lpBuffer,\n                                   DWORD nNumberOfBytesToWrite,\n                                   LPDWORD lpNumberOfBytesWritten,\n                                   LPOVERLAPPED lpOverlapped)\n        = WriteFile;\n\n    BOOL (WINAPI * Real_FlushFileBuffers)(HANDLE hFile)\n        = FlushFileBuffers;\n\n    BOOL (WINAPI * Real_CloseHandle)(HANDLE hObject)\n        = CloseHandle;\n\n    BOOL (WINAPI * Real_WaitNamedPipeW)(LPCWSTR lpNamedPipeName, DWORD nTimeOut)\n        = WaitNamedPipeW;\n\n    BOOL (WINAPI * Real_SetNamedPipeHandleState)(HANDLE hNamedPipe,\n                                                 LPDWORD lpMode,\n                                                 LPDWORD lpMaxCollectionCount,\n                                                 LPDWORD lpCollectDataTimeout)\n        = SetNamedPipeHandleState;\n\n    DWORD (WINAPI * Real_GetCurrentProcessId)(VOID)\n        = GetCurrentProcessId;\n\n    VOID (WINAPI * Real_GetSystemTimeAsFileTime)(LPFILETIME lpSystemTimeAsFileTime)\n        = GetSystemTimeAsFileTime;\n\n    VOID (WINAPI * Real_InitializeCriticalSection)(LPCRITICAL_SECTION lpSection)\n        = InitializeCriticalSection;\n\n    VOID (WINAPI * Real_EnterCriticalSection)(LPCRITICAL_SECTION lpSection)\n        = EnterCriticalSection;\n\n    VOID (WINAPI * Real_LeaveCriticalSection)(LPCRITICAL_SECTION lpSection)\n        = LeaveCriticalSection;\n}\n\nDWORD (WINAPI * Real_GetModuleFileNameW)(HMODULE a0,\n                                         LPWSTR a1,\n                                         DWORD a2)\n    = GetModuleFileNameW;\n\nBOOL (WINAPI * Real_CreateProcessW)(LPCWSTR a0,\n                                    LPWSTR a1,\n                                    LPSECURITY_ATTRIBUTES a2,\n                                    LPSECURITY_ATTRIBUTES a3,\n                                    BOOL a4,\n                                    DWORD a5,\n                                    LPVOID a6,\n                                    LPCWSTR a7,\n                                    LPSTARTUPINFOW a8,\n                                    LPPROCESS_INFORMATION a9)\n    = CreateProcessW;\n\n#if _MSC_VER < 1300\nSOCKET (WINAPI * Real_WSAAccept)(SOCKET a0,\n                                 sockaddr* a1,\n                                 LPINT a2,\n                                 LPCONDITIONPROC a3,\n                                 DWORD a4)\n    = WSAAccept;\n#else\nSOCKET (WINAPI * Real_WSAAccept)(SOCKET a0,\n                                 sockaddr* a1,\n                                 LPINT a2,\n                                 LPCONDITIONPROC a3,\n                                 DWORD_PTR a4)\n    = WSAAccept;\n#endif\n\nINT (WINAPI * Real_WSAAddressToStringA)(LPSOCKADDR a0,\n                                        DWORD a1,\n                                        LPWSAPROTOCOL_INFOA a2,\n                                        LPSTR a3,\n                                        LPDWORD a4)\n    = WSAAddressToStringA;\n\nINT (WINAPI * Real_WSAAddressToStringW)(LPSOCKADDR a0,\n                                        DWORD a1,\n                                        LPWSAPROTOCOL_INFOW a2,\n                                        LPWSTR a3,\n                                        LPDWORD a4)\n    = WSAAddressToStringW;\n\nHANDLE (WINAPI * Real_WSAAsyncGetHostByAddr)(HWND a0,\n                                             u_int a1,\n                                             CONST char* a2,\n                                             int a3,\n                                             int a4,\n                                             char* a5,\n                                             int a6)\n    = WSAAsyncGetHostByAddr;\n\nHANDLE (WINAPI * Real_WSAAsyncGetHostByName)(HWND a0,\n                                             u_int a1,\n                                             CONST char* a2,\n                                             char* a3,\n                                             int a4)\n    = WSAAsyncGetHostByName;\n\nHANDLE (WINAPI * Real_WSAAsyncGetProtoByName)(HWND a0,\n                                              u_int a1,\n                                              CONST char* a2,\n                                              char* a3,\n                                              int a4)\n    = WSAAsyncGetProtoByName;\n\nHANDLE (WINAPI * Real_WSAAsyncGetProtoByNumber)(HWND a0,\n                                                u_int a1,\n                                                int a2,\n                                                char* a3,\n                                                int a4)\n    = WSAAsyncGetProtoByNumber;\n\nHANDLE (WINAPI * Real_WSAAsyncGetServByName)(HWND a0,\n                                             u_int a1,\n                                             CONST char* a2,\n                                             CONST char* a3,\n                                             char* a4,\n                                             int a5)\n    = WSAAsyncGetServByName;\n\nHANDLE (WINAPI * Real_WSAAsyncGetServByPort)(HWND a0,\n                                             u_int a1,\n                                             int a2,\n                                             CONST char* a3,\n                                             char* a4,\n                                             int a5)\n    = WSAAsyncGetServByPort;\n\nint (WINAPI * Real_WSACancelAsyncRequest)(HANDLE a0)\n    = WSACancelAsyncRequest;\n\nint (WINAPI * Real_WSACancelBlockingCall)(void)\n    = WSACancelBlockingCall;\n\nint (WINAPI * Real_WSACleanup)(void)\n    = WSACleanup;\n\nBOOL (WINAPI * Real_WSACloseEvent)(HANDLE a0)\n    = WSACloseEvent;\n\nint (WINAPI * Real_WSAConnect)(SOCKET a0,\n                               CONST sockaddr* a1,\n                               int a2,\n                               LPWSABUF a3,\n                               LPWSABUF a4,\n                               LPQOS a5,\n                               LPQOS a6)\n    = WSAConnect;\n\nHANDLE (WINAPI * Real_WSACreateEvent)(void)\n    = WSACreateEvent;\n\nint (WINAPI * Real_WSADuplicateSocketA)(SOCKET a0,\n                                        DWORD a1,\n                                        LPWSAPROTOCOL_INFOA a2)\n    = WSADuplicateSocketA;\n\nint (WINAPI * Real_WSADuplicateSocketW)(SOCKET a0,\n                                        DWORD a1,\n                                        LPWSAPROTOCOL_INFOW a2)\n    = WSADuplicateSocketW;\n\nINT (WINAPI * Real_WSAEnumNameSpaceProvidersA)(LPDWORD a0,\n                                               LPWSANAMESPACE_INFOA a1)\n    = WSAEnumNameSpaceProvidersA;\n\nINT (WINAPI * Real_WSAEnumNameSpaceProvidersW)(LPDWORD a0,\n                                               LPWSANAMESPACE_INFOW a1)\n    = WSAEnumNameSpaceProvidersW;\n\nint (WINAPI * Real_WSAEnumNetworkEvents)(SOCKET a0,\n                                         HANDLE a1,\n                                         LPWSANETWORKEVENTS a2)\n    = WSAEnumNetworkEvents;\n\nint (WINAPI * Real_WSAEnumProtocolsA)(LPINT a0,\n                                      LPWSAPROTOCOL_INFOA a1,\n                                      LPDWORD a2)\n    = WSAEnumProtocolsA;\n\nint (WINAPI * Real_WSAEnumProtocolsW)(LPINT a0,\n                                      LPWSAPROTOCOL_INFOW a1,\n                                      LPDWORD a2)\n    = WSAEnumProtocolsW;\n\nBOOL (WINAPI * Real_WSAGetOverlappedResult)(SOCKET a0,\n                                            LPWSAOVERLAPPED a1,\n                                            LPDWORD a2,\n                                            BOOL a3,\n                                            LPDWORD a4)\n    = WSAGetOverlappedResult;\n\nBOOL (WINAPI * Real_WSAIsBlocking)(void)\n    = WSAIsBlocking;\n\nSOCKET (WINAPI * Real_WSAJoinLeaf)(SOCKET a0,\n                                   CONST sockaddr* a1,\n                                   int a2,\n                                   LPWSABUF a3,\n                                   LPWSABUF a4,\n                                   LPQOS a5,\n                                   LPQOS a6,\n                                   DWORD a7)\n    = WSAJoinLeaf;\n\nINT (WINAPI * Real_WSALookupServiceBeginA)(\n                                           LPWSAQUERYSETA lpqsRestrictions,\n                                           DWORD          dwControlFlags,\n                                           LPHANDLE       lphLookup\n                                          )\n    = WSALookupServiceBeginA;\n\nINT (WINAPI * Real_WSALookupServiceBeginW)(\n                                           LPWSAQUERYSETW lpqsRestrictions,\n                                           DWORD          dwControlFlags,\n                                           LPHANDLE       lphLookup\n                                          )\n    = WSALookupServiceBeginW;\n\nINT (WINAPI * Real_WSALookupServiceNextA)(\n                                          HANDLE           hLookup,\n                                          DWORD            dwControlFlags,\n                                          LPDWORD       lpdwBufferLength,\n                                          LPWSAQUERYSETA lpqsResults\n                                         ) = WSALookupServiceNextA;\n\nINT (WINAPI * Real_WSALookupServiceNextW)(\n                                          HANDLE         hLookup,\n                                          DWORD          dwControlFlags,\n                                          LPDWORD        lpdwBufferLength,\n                                          LPWSAQUERYSETW lpqsResults\n                                         ) = WSALookupServiceNextW;\n\nINT (WINAPI * Real_WSALookupServiceEnd)(\n                                        HANDLE  hLookup\n                                       ) = WSALookupServiceEnd;\n\nINT (WINAPI * Real_WSAProviderConfigChange)(LPHANDLE a0,\n                                            LPWSAOVERLAPPED a1,\n                                            LPWSAOVERLAPPED_COMPLETION_ROUTINE a2)\n    = WSAProviderConfigChange;\n\nint (WINAPI * Real_WSARecv)(SOCKET a0,\n                            LPWSABUF a1,\n                            DWORD a2,\n                            LPDWORD a3,\n                            LPDWORD a4,\n                            LPWSAOVERLAPPED a5,\n                            LPWSAOVERLAPPED_COMPLETION_ROUTINE a6)\n    = WSARecv;\n\nint (WINAPI * Real_WSARecvDisconnect)(SOCKET a0,\n                                      LPWSABUF a1)\n    = WSARecvDisconnect;\n\nint (WINAPI * Real_WSARecvFrom)(SOCKET a0,\n                                LPWSABUF a1,\n                                DWORD a2,\n                                LPDWORD a3,\n                                LPDWORD a4,\n                                sockaddr* a5,\n                                LPINT a6,\n                                LPWSAOVERLAPPED a7,\n                                LPWSAOVERLAPPED_COMPLETION_ROUTINE a8)\n    = WSARecvFrom;\n\nBOOL (WINAPI * Real_WSAResetEvent)(HANDLE a0)\n    = WSAResetEvent;\n\nint (WINAPI * Real_WSASend)(SOCKET a0,\n                            LPWSABUF a1,\n                            DWORD a2,\n                            LPDWORD a3,\n                            DWORD a4,\n                            LPWSAOVERLAPPED a5,\n                            LPWSAOVERLAPPED_COMPLETION_ROUTINE a6)\n    = WSASend;\n\nint (WINAPI * Real_WSASendDisconnect)(SOCKET a0,\n                                      LPWSABUF a1)\n    = WSASendDisconnect;\n\nint (WINAPI * Real_WSASendTo)(SOCKET a0,\n                              LPWSABUF a1,\n                              DWORD a2,\n                              LPDWORD a3,\n                              DWORD a4,\n                              CONST sockaddr* a5,\n                              int a6,\n                              LPWSAOVERLAPPED a7,\n                              LPWSAOVERLAPPED_COMPLETION_ROUTINE a8)\n    = WSASendTo;\n\nINT (WINAPI * Real_WSAStringToAddressA)(LPSTR a0,\n                                        INT a1,\n                                        LPWSAPROTOCOL_INFOA a2,\n                                        LPSOCKADDR a3,\n                                        LPINT a4)\n    = WSAStringToAddressA;\n\nINT (WINAPI * Real_WSAStringToAddressW)(LPWSTR a0,\n                                        INT a1,\n                                        LPWSAPROTOCOL_INFOW a2,\n                                        LPSOCKADDR a3,\n                                        LPINT a4)\n    = WSAStringToAddressW;\n\nDWORD (WINAPI * Real_WSAWaitForMultipleEvents)(DWORD a0,\n                                               CONST HANDLE * a1,\n                                               BOOL a2,\n                                               DWORD a3,\n                                               BOOL a4)\n    = WSAWaitForMultipleEvents;\n\nSOCKET (WINAPI * Real_accept)(SOCKET a0,\n                              sockaddr* a1,\n                              int* a2)\n    = accept;\n\nint (WINAPI * Real_closesocket)(SOCKET a0)\n    = closesocket;\n\nint (WINAPI * Real_connect)(SOCKET a0,\n                            CONST sockaddr* a1,\n                            int a2)\n    = connect;\n\nint (WINAPI * Real_listen)(SOCKET a0,\n                           int a1)\n    = listen;\n\nint (WINAPI * Real_recv)(SOCKET a0,\n                         char* a1,\n                         int a2,\n                         int a3)\n    = recv;\n\nint (WINAPI * Real_recvfrom)(SOCKET a0,\n                             char* a1,\n                             int a2,\n                             int a3,\n                             sockaddr* a4,\n                             int* a5)\n    = recvfrom;\n\nint (WINAPI * Real_send)(SOCKET a0,\n                         CONST char* a1,\n                         int a2,\n                         int a3)\n    = send;\n\nint (WINAPI * Real_sendto)(SOCKET a0,\n                           CONST char* a1,\n                           int a2,\n                           int a3,\n                           CONST sockaddr* a4,\n                           int a5)\n    = sendto;\n\nint (WINAPI * Real_shutdown)(SOCKET a0,\n                             int a1)\n    = shutdown;\n\n/////////////////////////////////////////////////////////////\n// Detours\n//\nBOOL WINAPI Mine_CreateProcessW(LPCWSTR lpApplicationName,\n                                LPWSTR lpCommandLine,\n                                LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                BOOL bInheritHandles,\n                                DWORD dwCreationFlags,\n                                LPVOID lpEnvironment,\n                                LPCWSTR lpCurrentDirectory,\n                                LPSTARTUPINFOW lpStartupInfo,\n                                LPPROCESS_INFORMATION lpProcessInformation)\n{\n    _PrintEnter(\"CreateProcessW(%ls,%ls,%p,%p,%x,%x,%p,%ls,%p,%p)\\n\",\n                lpApplicationName,\n                lpCommandLine,\n                lpProcessAttributes,\n                lpThreadAttributes,\n                bInheritHandles,\n                dwCreationFlags,\n                lpEnvironment,\n                lpCurrentDirectory,\n                lpStartupInfo,\n                lpProcessInformation);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_CreateProcessW(lpApplicationName,\n                                 lpCommandLine,\n                                 lpProcessAttributes,\n                                 lpThreadAttributes,\n                                 bInheritHandles,\n                                 dwCreationFlags,\n                                 lpEnvironment,\n                                 lpCurrentDirectory,\n                                 lpStartupInfo,\n                                 lpProcessInformation);\n    } __finally {\n        _PrintExit(\"CreateProcessW(,,,,,,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\n#if _MSC_VER < 1300\nSOCKET WINAPI Mine_WSAAccept(SOCKET a0,\n                             sockaddr* a1,\n                             LPINT a2,\n                             LPCONDITIONPROC a3,\n                             DWORD a4)\n#else\nSOCKET WINAPI Mine_WSAAccept(SOCKET a0,\n                             sockaddr* a1,\n                             LPINT a2,\n                             LPCONDITIONPROC a3,\n                             DWORD_PTR a4)\n#endif\n{\n\n    SOCKET rv = 0;\n    __try {\n        rv = Real_WSAAccept(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintEnter(\"%p: WSAAccept(,%p,%p,%p,%p) -> %p\\n\", a0, a1, a2, a3, a4, rv);\n        _PrintExit(NULL);\n    };\n    return rv;\n}\n\nINT WINAPI Mine_WSAAddressToStringA(LPSOCKADDR a0,\n                                    DWORD a1,\n                                    LPWSAPROTOCOL_INFOA a2,\n                                    LPSTR a3,\n                                    LPDWORD a4)\n{\n    _PrintEnter(\"WSAAddressToStringA(%p,%x,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    INT rv = 0;\n    __try {\n        __try {\n            sockaddr_in *in = (sockaddr_in *)a0;\n            _Print(\"in=%d.%d.%d.%d\\n\",\n                   in->sin_addr.S_un.S_un_b.s_b1,\n                   in->sin_addr.S_un.S_un_b.s_b2,\n                   in->sin_addr.S_un.S_un_b.s_b3,\n                   in->sin_addr.S_un.S_un_b.s_b4);\n        }\n        __finally {\n        }\n\n        rv = Real_WSAAddressToStringA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WSAAddressToStringA(,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nINT WINAPI Mine_WSAAddressToStringW(LPSOCKADDR a0,\n                                    DWORD a1,\n                                    LPWSAPROTOCOL_INFOW a2,\n                                    LPWSTR a3,\n                                    LPDWORD a4)\n{\n    _PrintEnter(\"WSAAddressToStringW(%p,%x,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    INT rv = 0;\n    __try {\n        __try {\n            sockaddr_in *in = (sockaddr_in *)a0;\n            _Print(\"in=%d.%d.%d.%d\\n\",\n                   in->sin_addr.S_un.S_un_b.s_b1,\n                   in->sin_addr.S_un.S_un_b.s_b2,\n                   in->sin_addr.S_un.S_un_b.s_b3,\n                   in->sin_addr.S_un.S_un_b.s_b4);\n        }\n        __finally {\n        }\n        rv = Real_WSAAddressToStringW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WSAAddressToStringW(,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE WINAPI Mine_WSAAsyncGetHostByAddr(HWND a0,\n                                         u_int a1,\n                                         char* a2,\n                                         int a3,\n                                         int a4,\n                                         char* a5,\n                                         int a6)\n{\n    _PrintEnter(\"WSAAsyncGetHostByAddr(%p,%x,%p,%x,%x,%p,%x)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_WSAAsyncGetHostByAddr(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"WSAAsyncGetHostByAddr(,,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE WINAPI Mine_WSAAsyncGetHostByName(HWND a0,\n                                         u_int a1,\n                                         char* a2,\n                                         char* a3,\n                                         int a4)\n{\n    _PrintEnter(\"WSAAsyncGetHostByName(%p,%x,%p,%p,%x)\\n\", a0, a1, a2, a3, a4);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_WSAAsyncGetHostByName(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WSAAsyncGetHostByName(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE WINAPI Mine_WSAAsyncGetProtoByName(HWND a0,\n                                          u_int a1,\n                                          char* a2,\n                                          char* a3,\n                                          int a4)\n{\n    _PrintEnter(\"WSAAsyncGetProtoByName(%p,%x,%p,%p,%x)\\n\", a0, a1, a2, a3, a4);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_WSAAsyncGetProtoByName(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WSAAsyncGetProtoByName(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE WINAPI Mine_WSAAsyncGetProtoByNumber(HWND a0,\n                                            u_int a1,\n                                            int a2,\n                                            char* a3,\n                                            int a4)\n{\n    _PrintEnter(\"WSAAsyncGetProtoByNumber(%p,%x,%p,%p,%x)\\n\", a0, a1, a2, a3, a4);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_WSAAsyncGetProtoByNumber(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WSAAsyncGetProtoByNumber(,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE WINAPI Mine_WSAAsyncGetServByName(HWND a0,\n                                         u_int a1,\n                                         char* a2,\n                                         char* a3,\n                                         char* a4,\n                                         int a5)\n{\n    _PrintEnter(\"WSAAsyncGetServByName(%p,%x,%p,%p,%p,%x)\\n\", a0, a1, a2, a3, a4, a5);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_WSAAsyncGetServByName(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"WSAAsyncGetServByName(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nHANDLE WINAPI Mine_WSAAsyncGetServByPort(HWND a0,\n                                         u_int a1,\n                                         int a2,\n                                         char* a3,\n                                         char* a4,\n                                         int a5)\n{\n    _PrintEnter(\"WSAAsyncGetServByPort(%p,%x,%x,%p,%p,%x)\\n\", a0, a1, a2, a3, a4, a5);\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_WSAAsyncGetServByPort(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"WSAAsyncGetServByPort(,,,,,) -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSACancelAsyncRequest(HANDLE a0)\n{\n    _PrintEnter(\"WSACancelAsyncRequest(%p)\\n\", a0);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSACancelAsyncRequest(a0);\n    } __finally {\n        _PrintExit(\"WSACancelAsyncRequest() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSACancelBlockingCall(void)\n{\n    _PrintEnter(\"WSACancelBlockingCall()\\n\");\n\n    int rv = 0;\n    __try {\n        rv = Real_WSACancelBlockingCall();\n    } __finally {\n        _PrintExit(\"WSACancelBlockingCall() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSACleanup(void)\n{\n    _PrintEnter(\"WSACleanup()\\n\");\n\n    int rv = 0;\n    __try {\n        rv = Real_WSACleanup();\n    } __finally {\n        _PrintExit(\"WSACleanup() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_WSACloseEvent(HANDLE a0)\n{\n    _PrintEnter(\"WSACloseEvent(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WSACloseEvent(a0);\n    } __finally {\n        _PrintExit(\"WSACloseEvent() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSAConnect(SOCKET a0,\n                           sockaddr* a1,\n                           int a2,\n                           LPWSABUF a3,\n                           LPWSABUF a4,\n                           LPQOS a5,\n                           LPQOS a6)\n{\n    int rv = 0;\n    __try {\n        rv = Real_WSAConnect(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintEnter(\"%p: WSAConnect(,%p,%x,%p,%p,%p,%p) -> %x\\n\",\n                    a0, a1, a2, a3, a4, a5, a6, rv);\n        _PrintExit(NULL);\n    };\n    return rv;\n}\n\nHANDLE WINAPI Mine_WSACreateEvent(void)\n{\n    _PrintEnter(\"WSACreateEvent()\\n\");\n\n    HANDLE rv = 0;\n    __try {\n        rv = Real_WSACreateEvent();\n    } __finally {\n        _PrintExit(\"WSACreateEvent() -> %p\\n\", rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSADuplicateSocketA(SOCKET a0,\n                                    DWORD a1,\n                                    LPWSAPROTOCOL_INFOA a2)\n{\n    _PrintEnter(\"%p: WSADuplicateSocketA(,%x,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSADuplicateSocketA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"%p: WSADuplicateSocketA(,,) -> %x\\n\", a0, rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSADuplicateSocketW(SOCKET a0,\n                                    DWORD a1,\n                                    LPWSAPROTOCOL_INFOW a2)\n{\n    _PrintEnter(\"%p: WSADuplicateSocketW(,%x,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSADuplicateSocketW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"%p: WSADuplicateSocketW(,,) -> %x\\n\", a0, rv);\n    };\n    return rv;\n}\n\nINT WINAPI Mine_WSAEnumNameSpaceProvidersA(LPDWORD a0,\n                                           LPWSANAMESPACE_INFOA a1)\n{\n    _PrintEnter(\"WSAEnumNameSpaceProvidersA(%p,%p)\\n\", a0, a1);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSAEnumNameSpaceProvidersA(a0, a1);\n    } __finally {\n        _PrintExit(\"WSAEnumNameSpaceProvidersA(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nINT WINAPI Mine_WSAEnumNameSpaceProvidersW(LPDWORD a0,\n                                           LPWSANAMESPACE_INFOW a1)\n{\n    _PrintEnter(\"WSAEnumNameSpaceProvidersW(%p,%p)\\n\", a0, a1);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSAEnumNameSpaceProvidersW(a0, a1);\n    } __finally {\n        _PrintExit(\"WSAEnumNameSpaceProvidersW(,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSAEnumNetworkEvents(SOCKET a0,\n                                     HANDLE a1,\n                                     LPWSANETWORKEVENTS a2)\n{\n    _PrintEnter(\"%p: WSAEnumNetworkEvents(,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSAEnumNetworkEvents(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"%p: WSAEnumNetworkEvents(,,) -> %x\\n\", a0, rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSAEnumProtocolsA(LPINT a0,\n                                  LPWSAPROTOCOL_INFOA a1,\n                                  LPDWORD a2)\n{\n    _PrintEnter(\"WSAEnumProtocolsA(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSAEnumProtocolsA(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WSAEnumProtocolsA(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSAEnumProtocolsW(LPINT a0,\n                                  LPWSAPROTOCOL_INFOW a1,\n                                  LPDWORD a2)\n{\n    _PrintEnter(\"WSAEnumProtocolsW(%p,%p,%p)\\n\", a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSAEnumProtocolsW(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WSAEnumProtocolsW(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_WSAGetOverlappedResult(SOCKET a0,\n                                        LPWSAOVERLAPPED a1,\n                                        LPDWORD a2,\n                                        BOOL a3,\n                                        LPDWORD a4)\n{\n    _PrintEnter(\"%p: WSAGetOverlappedResult(,%p,%p,%x,%p)\\n\", a0, a1, a2, a3, a4);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WSAGetOverlappedResult(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"%p: WSAGetOverlappedResult(,,,,) -> %x\\n\", a0, rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_WSAIsBlocking(void)\n{\n    _PrintEnter(\"WSAIsBlocking()\\n\");\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WSAIsBlocking();\n    } __finally {\n        _PrintExit(\"WSAIsBlocking() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nSOCKET WINAPI Mine_WSAJoinLeaf(SOCKET a0,\n                               sockaddr* a1,\n                               int a2,\n                               LPWSABUF a3,\n                               LPWSABUF a4,\n                               LPQOS a5,\n                               LPQOS a6,\n                               DWORD a7)\n{\n    _PrintEnter(\"%p: WSAJoinLeaf(,%p,%x,%p,%p,%p,%p,%x)\\n\", a0, a1, a2, a3, a4, a5, a6, a7);\n\n    SOCKET rv = 0;\n    __try {\n        rv = Real_WSAJoinLeaf(a0, a1, a2, a3, a4, a5, a6, a7);\n    } __finally {\n        _PrintExit(\"%p: WSAJoinLeaf(,,,,,,,) -> %p\\n\", a0, rv);\n    };\n    return rv;\n}\n\nINT WINAPI Mine_WSALookupServiceBeginA(\n                                       LPWSAQUERYSETA lpqsRestrictions,\n                                       DWORD          dwControlFlags,\n                                       LPHANDLE       lphLookup\n                                      )\n{\n    _PrintEnter(\"WSALookupServiceBeginA(%p,%x,%p)\\n\",\n                lpqsRestrictions,\n                dwControlFlags,\n                lphLookup);\n\n    INT rv = 0;\n    __try {\n        __try {\n            _Print(\"service: [%hs]\", lpqsRestrictions->lpszServiceInstanceName);\n            _Print(\"queries: [%hs]\", lpqsRestrictions->lpszQueryString);\n        }\n        __finally {\n        }\n\n        rv = Real_WSALookupServiceBeginA(\n                                          lpqsRestrictions,\n                                          dwControlFlags,\n                                          lphLookup);\n    } __finally {\n        _PrintExit(\"WSALookupServiceBeginA(,,) -> %x\\n\", rv);\n    };\n    return rv;\n\n}\n\nINT WINAPI Mine_WSALookupServiceBeginW(\n                                       LPWSAQUERYSETW lpqsRestrictions,\n                                       DWORD          dwControlFlags,\n                                       LPHANDLE       lphLookup\n                               )\n{\n    _PrintEnter(\"WSALookupServiceBeginW(%p,%p,%p)\\n\",\n                lpqsRestrictions,\n                dwControlFlags,\n                lphLookup);\n    __debugbreak();\n\n    INT rv = 0;\n    __try {\n        __try {\n            _Print(\"service: [%ls]\", lpqsRestrictions->lpszServiceInstanceName);\n            _Print(\"queries: [%ls]\", lpqsRestrictions->lpszQueryString);\n        }\n        __finally {\n        }\n\n        rv = Real_WSALookupServiceBeginW(\n                                         lpqsRestrictions,\n                                         dwControlFlags,\n                                         lphLookup);\n    } __finally {\n        _PrintExit(\"WSALookupServiceBeginW(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nINT WINAPI Mine_WSALookupServiceNextA(\n                               HANDLE           hLookup,\n                               DWORD            dwControlFlags,\n                               LPDWORD       lpdwBufferLength,\n                               LPWSAQUERYSETA lpqsResults\n                              )\n{\n    _PrintEnter(\"WSALookupServiceNextA(%p,%p,%p,%p)\\n\",\n                hLookup,\n                dwControlFlags,\n                lpdwBufferLength,\n                lpqsResults);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSALookupServiceNextA(\n                                        hLookup,\n                                        dwControlFlags,\n                                        lpdwBufferLength,\n                                        lpqsResults);\n    } __finally {\n        _PrintExit(\"WSALookupServiceNextA(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nINT WINAPI Mine_WSALookupServiceNextW(\n                               HANDLE         hLookup,\n                               DWORD          dwControlFlags,\n                               LPDWORD        lpdwBufferLength,\n                               LPWSAQUERYSETW lpqsResults\n                              )\n{\n    _PrintEnter(\"WSALookupServiceNextW(%p,%p,%p,%p)\\n\",\n                hLookup,\n                dwControlFlags,\n                lpdwBufferLength,\n                lpqsResults);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSALookupServiceNextW(\n                                        hLookup,\n                                        dwControlFlags,\n                                        lpdwBufferLength,\n                                        lpqsResults);\n    } __finally {\n        _PrintExit(\"WSALookupServiceNextW(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nINT WINAPI Mine_WSALookupServiceEnd(\n                                        HANDLE  hLookup\n                                    )\n{\n    _PrintEnter(\"WSALookupServiceEnd(%p)\\n\", hLookup);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSALookupServiceEnd(hLookup);\n    } __finally {\n        _PrintExit(\"WSALookupServiceEnd(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nINT WINAPI Mine_WSAProviderConfigChange(LPHANDLE a0,\n                                        LPWSAOVERLAPPED a1,\n                                        LPWSAOVERLAPPED_COMPLETION_ROUTINE a2)\n{\n    _PrintEnter(\"WSAProviderConfigChange(%p,%p,%p)\\n\", a0, a1, a2);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSAProviderConfigChange(a0, a1, a2);\n    } __finally {\n        _PrintExit(\"WSAProviderConfigChange(,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSARecv(SOCKET a0,\n                        LPWSABUF a1,\n                        DWORD a2,\n                        LPDWORD a3,\n                        LPDWORD a4,\n                        LPWSAOVERLAPPED a5,\n                        LPWSAOVERLAPPED_COMPLETION_ROUTINE a6)\n{\n    int rv = -1;\n    __try {\n        rv = Real_WSARecv(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        if (rv == 0) {\n            _PrintEnter(\"%p: WSARecv(,%p,%x,%p,%p,%p,%p)\\n\",\n                        a0, a1, a2, a3, a4, a5, a6);\n            _PrintDump(a0, a1[0].buf, a1[0].len < *a3 ? a1[0].len : *a3);\n            _PrintExit(\"%p: WSARecv(,,,,,,) -> %x\\n\", a0, rv);\n        }\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSARecvDisconnect(SOCKET a0,\n                                  LPWSABUF a1)\n{\n    _PrintEnter(\"%p: WSARecvDisconnect(,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSARecvDisconnect(a0, a1);\n    } __finally {\n        _PrintExit(\"%p: WSARecvDisconnect(,) -> %x\\n\", a0, rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSARecvFrom(SOCKET a0,\n                            LPWSABUF a1,\n                            DWORD a2,\n                            LPDWORD a3,\n                            LPDWORD a4,\n                            sockaddr* a5,\n                            LPINT a6,\n                            LPWSAOVERLAPPED a7,\n                            LPWSAOVERLAPPED_COMPLETION_ROUTINE a8)\n{\n    _PrintEnter(\"%p: WSARecvFrom(,%p,%x,%p,%p,%p,%p,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSARecvFrom(a0, a1, a2, a3, a4, a5, a6, a7, a8);\n    } __finally {\n        _PrintExit(\"%p: WSARecvFrom(,,,,,,,,) -> %x\\n\", a0, rv);\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_WSAResetEvent(HANDLE a0)\n{\n    _PrintEnter(\"WSAResetEvent(%p)\\n\", a0);\n\n    BOOL rv = 0;\n    __try {\n        rv = Real_WSAResetEvent(a0);\n    } __finally {\n        _PrintExit(\"WSAResetEvent() -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSASend(SOCKET a0,\n                        LPWSABUF a1,\n                        DWORD a2,\n                        LPDWORD a3,\n                        DWORD a4,\n                        LPWSAOVERLAPPED a5,\n                        LPWSAOVERLAPPED_COMPLETION_ROUTINE a6)\n{\n    _PrintEnter(\"%p: WSASend(,%p,%x,%p,%x,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSASend(a0, a1, a2, a3, a4, a5, a6);\n    } __finally {\n        _PrintExit(\"%p: WSASend(,,,,,,) -> %x\\n\", a0, rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSASendDisconnect(SOCKET a0,\n                                  LPWSABUF a1)\n{\n    _PrintEnter(\"%p: WSASendDisconnect(,%p)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSASendDisconnect(a0, a1);\n    } __finally {\n        _PrintExit(\"%p: WSASendDisconnect(,) -> %x\\n\", a0, rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_WSASendTo(SOCKET a0,\n                          LPWSABUF a1,\n                          DWORD a2,\n                          LPDWORD a3,\n                          DWORD a4,\n                          sockaddr* a5,\n                          int a6,\n                          LPWSAOVERLAPPED a7,\n                          LPWSAOVERLAPPED_COMPLETION_ROUTINE a8)\n{\n    _PrintEnter(\"%p: WSASendTo(,%p,%x,%p,%x,%p,%x,%p,%p)\\n\", a0, a1, a2, a3, a4, a5, a6, a7, a8);\n\n    int rv = 0;\n    __try {\n        rv = Real_WSASendTo(a0, a1, a2, a3, a4, a5, a6, a7, a8);\n    } __finally {\n        _PrintExit(\"%p: WSASendTo(,,,,,,,,) -> %x\\n\", a0, rv);\n    };\n    return rv;\n}\n\nINT WINAPI Mine_WSAStringToAddressA(LPSTR a0,\n                                    INT a1,\n                                    LPWSAPROTOCOL_INFOA a2,\n                                    LPSOCKADDR a3,\n                                    LPINT a4)\n{\n    _PrintEnter(\"WSAStringToAddressA(%p,%x,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSAStringToAddressA(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WSAStringToAddressA(,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nINT WINAPI Mine_WSAStringToAddressW(LPWSTR a0,\n                                    INT a1,\n                                    LPWSAPROTOCOL_INFOW a2,\n                                    LPSOCKADDR a3,\n                                    LPINT a4)\n{\n    _PrintEnter(\"WSAStringToAddressW(%p,%x,%p,%p,%p)\\n\", a0, a1, a2, a3, a4);\n\n    INT rv = 0;\n    __try {\n        rv = Real_WSAStringToAddressW(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WSAStringToAddressW(,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nDWORD WINAPI Mine_WSAWaitForMultipleEvents(DWORD a0,\n                                           void** a1,\n                                           BOOL a2,\n                                           DWORD a3,\n                                           BOOL a4)\n{\n    _PrintEnter(\"WSAWaitForMultipleEvents(%x,%p,%x,%x,%x)\\n\", a0, a1, a2, a3, a4);\n\n    DWORD rv = 0;\n    __try {\n        rv = Real_WSAWaitForMultipleEvents(a0, a1, a2, a3, a4);\n    } __finally {\n        _PrintExit(\"WSAWaitForMultipleEvents(,,,,) -> %x\\n\", rv);\n    };\n    return rv;\n}\n\nSOCKET WINAPI Mine_accept(SOCKET a0,\n                          sockaddr* a1,\n                          int* a2)\n{\n    SOCKET rv = 0;\n    __try {\n        rv = Real_accept(a0, a1, a2);\n    } __finally {\n        WCHAR wzAddress[512] = L\"\";\n        int err = WSAGetLastError();\n        if (rv != INVALID_SOCKET) {\n            DWORD nAddress = ARRAYSIZE(wzAddress);\n            if (Real_WSAAddressToStringW(a1, *a2, NULL, wzAddress, &nAddress) != 0) {\n                wzAddress[0] = 0;\n            }\n        }\n        WSASetLastError(err);\n\n        if (wzAddress[0]) {\n            _PrintEnter(\"%p: accept(,%ls,%p) -> %p\\n\", a0, wzAddress, a2, rv);\n        }\n        else {\n            _PrintEnter(\"%p: accept(,%p,%p) -> %p\\n\", a0, a1, a2, rv);\n        }\n        _PrintExit(NULL);\n    };\n    return rv;\n}\n\nint WINAPI Mine_closesocket(SOCKET a0)\n{\n    int rv = 0;\n    __try {\n        rv = Real_closesocket(a0);\n    } __finally {\n        _PrintEnter(\"%p: closesocket() -> %x\\n\", a0, rv);\n        _PrintExit(NULL);\n    };\n    return rv;\n}\n\nint WINAPI Mine_connect(SOCKET a0,\n                        sockaddr* name,\n                        int namelen)\n{\n    int rv = 0;\n    __try {\n        rv = Real_connect(a0, name, namelen);\n    } __finally {\n        WCHAR wzAddress[512];\n        DWORD nAddress = ARRAYSIZE(wzAddress);\n        int err = WSAGetLastError();\n        if (Real_WSAAddressToStringW(name, namelen, NULL, wzAddress, &nAddress) == 0) {\n            if (rv == SOCKET_ERROR) {\n                _PrintEnter(\"%p: connect(,%p:%ls,%x) -> %x [%d]\\n\",\n                            a0, name, wzAddress, namelen, rv, err);\n            }\n            else {\n                _PrintEnter(\"%p: connect(,%p:%ls,%x) -> %x\\n\",\n                            a0, name, wzAddress, namelen, rv);\n            }\n        }\n        else {\n            if (rv == SOCKET_ERROR) {\n                _PrintEnter(\"%p: connect(,%p,%x) -> %x [%d]\\n\",\n                            a0, name, namelen, rv, err);\n            }\n            else {\n                _PrintEnter(\"%p: connect(,%p,%x) -> %x\\n\",\n                            a0, name, namelen, rv);\n            }\n        }\n        WSASetLastError(err);\n        _PrintExit(NULL);\n    };\n    return rv;\n}\n\nint WINAPI Mine_listen(SOCKET a0,\n                       int a1)\n{\n    _PrintEnter(\"%p: listen(,%x)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_listen(a0, a1);\n    } __finally {\n        _PrintExit(\"%p: listen(,) -> %x\\n\", a0, rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_recv(SOCKET a0,\n                     char* a1,\n                     int a2,\n                     int a3)\n{\n    _PrintEnter(\"%p: recv(,%p,%x,%x)\\n\", a0, a1, a2, a3);\n\n    int rv = 0;\n    __try {\n        rv = Real_recv(a0, a1, a2, a3);\n    } __finally {\n        _PrintExit(\"%p: recv(,%s,,) -> %x\\n\", a0, a1, rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_recvfrom(SOCKET a0,\n                         char* a1,\n                         int a2,\n                         int a3,\n                         sockaddr* a4,\n                         int* a5)\n{\n    _PrintEnter(\"%p: recvfrom(,%p,%x,%x,%p,%p)\\n\", a0, a1, a2, a3, a4, a5);\n\n    int rv = 0;\n    __try {\n        rv = Real_recvfrom(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"%p: recvfrom(,%s,,,,) -> %x\\n\", a0, a1, rv);\n    };\n    return rv;\n}\n\nVOID _PrintDump(SOCKET socket, PCHAR pszData, INT cbData)\n{\n    if (pszData && cbData > 0) {\n        CHAR szBuffer[256];\n        PCHAR pszBuffer = szBuffer;\n        INT cbBuffer = 0;\n        INT nLines = 0;\n\n        while (cbData > 0) {\n            if (nLines > 20) {\n                *pszBuffer++ = '.';\n                *pszBuffer++ = '.';\n                *pszBuffer++ = '.';\n                cbBuffer += 3;\n                break;\n            }\n\n            if (*pszData == '\\t') {\n                *pszBuffer++ = '\\\\';\n                *pszBuffer++ = 't';\n                cbBuffer += 2;\n                pszData++;\n                cbData--;\n                continue;\n            }\n            if (*pszData == '\\r') {\n                *pszBuffer++ = '\\\\';\n                *pszBuffer++ = 'r';\n                cbBuffer += 2;\n                pszData++;\n                cbData--;\n                continue;\n            }\n            else if (*pszData == '\\n') {\n                *pszBuffer++ = '\\\\';\n                *pszBuffer++ = 'n';\n                cbBuffer += 2;\n                *pszBuffer++ = '\\0';\n                _Print(\"%p:   %hs\\n\", socket, szBuffer);\n                nLines++;\n                pszBuffer = szBuffer;\n                cbBuffer = 0;\n                pszData++;\n                cbData--;\n                continue;\n            }\n            else if (cbBuffer >= 80) {\n                *pszBuffer++ = '\\0';\n                _Print(\"%p:   %hs\\n\", socket, szBuffer);\n                nLines++;\n                pszBuffer = szBuffer;\n                cbBuffer = 0;\n            }\n\n            if (*pszData < ' ' || *pszData >= 127) {\n                *pszBuffer++ = '\\\\';\n                *pszBuffer++ = 'x';\n                *pszBuffer++ = \"0123456789ABCDEF\"[(*pszData & 0xf0) >> 4];\n                *pszBuffer++ = \"0123456789ABCDEF\"[(*pszData & 0x0f)];\n                cbBuffer += 4;\n            }\n            else {\n                *pszBuffer++ = *pszData;\n            }\n            cbBuffer++;\n            pszData++;\n            cbData--;\n        }\n\n        if (cbBuffer > 0) {\n            *pszBuffer++ = '\\0';\n            _Print(\"%p:   %hs\\n\", socket, szBuffer);\n        }\n    }\n}\n\nint WINAPI Mine_send(SOCKET a0,\n                     char* a1,\n                     int a2,\n                     int a3)\n{\n    _PrintEnter(\"%p: send(,%p,%x,%x)\\n\", a0, a1, a2, a3);\n    _PrintDump(a0, a1, a2);\n\n    int rv = 0;\n    __try {\n        rv = Real_send(a0, a1, a2, a3);\n    } __finally {\n        if (rv == SOCKET_ERROR) {\n            int err = WSAGetLastError();\n            _PrintExit(\"%p: send(,,,) -> %x (%d)\\n\", a0, rv, err);\n        }\n        else {\n            _PrintExit(\"%p: send(,,,) -> %x\\n\", a0, rv);\n        }\n    };\n    return rv;\n}\n\nint WINAPI Mine_sendto(SOCKET a0,\n                       char* a1,\n                       int a2,\n                       int a3,\n                       sockaddr* a4,\n                       int a5)\n{\n    _PrintEnter(\"%p: sendto(,%s,%x,%x,%p,%x)\\n\", a0, a1, a2, a3, a4, a5);\n\n    int rv = 0;\n    __try {\n        rv = Real_sendto(a0, a1, a2, a3, a4, a5);\n    } __finally {\n        _PrintExit(\"%p: sendto(%ls,,,,,) -> %x\\n\", a0, a1, rv);\n    };\n    return rv;\n}\n\nint WINAPI Mine_shutdown(SOCKET a0,\n                         int a1)\n{\n    _PrintEnter(\"%p: shutdown(,%x)\\n\", a0, a1);\n\n    int rv = 0;\n    __try {\n        rv = Real_shutdown(a0, a1);\n    } __finally {\n        _PrintExit(\"%p: shutdown(,) -> %x\\n\", a0, rv);\n    };\n    return rv;\n}\n\n/////////////////////////////////////////////////////////////\n// AttachDetours\n//\nPCHAR DetRealName(PCHAR psz)\n{\n    PCHAR pszBeg = psz;\n    // Move to end of name.\n    while (*psz) {\n        psz++;\n    }\n    // Move back through A-Za-z0-9 names.\n    while (psz > pszBeg &&\n           ((psz[-1] >= 'A' && psz[-1] <= 'Z') ||\n            (psz[-1] >= 'a' && psz[-1] <= 'z') ||\n            (psz[-1] >= '0' && psz[-1] <= '9'))) {\n        psz--;\n    }\n    return psz;\n}\n\nVOID DetAttach(PVOID *ppbReal, PVOID pbMine, PCHAR psz)\n{\n    LONG l = DetourAttach(ppbReal, pbMine);\n    if (l != 0) {\n        Syelog(SYELOG_SEVERITY_NOTICE,\n               \"Attach failed: `%s': error %d\\n\", DetRealName(psz), l);\n    }\n}\n\nVOID DetDetach(PVOID *ppbReal, PVOID pbMine, PCHAR psz)\n{\n    LONG l = DetourDetach(ppbReal, pbMine);\n    if (l != 0) {\n        Syelog(SYELOG_SEVERITY_NOTICE,\n               \"Detach failed: `%s': error %d\\n\", DetRealName(psz), l);\n    }\n}\n\n#define ATTACH(x)       DetAttach(&(PVOID&)Real_##x,Mine_##x,#x)\n#define DETACH(x)       DetDetach(&(PVOID&)Real_##x,Mine_##x,#x)\n\nLONG AttachDetours(VOID)\n{\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n\n    ATTACH(CreateProcessW);\n    ATTACH(WSAAccept);\n    ATTACH(WSAAddressToStringA);\n    ATTACH(WSAAddressToStringW);\n    ATTACH(WSAAsyncGetHostByAddr);\n    ATTACH(WSAAsyncGetHostByName);\n    ATTACH(WSAAsyncGetProtoByName);\n    ATTACH(WSAAsyncGetProtoByNumber);\n    ATTACH(WSAAsyncGetServByName);\n    ATTACH(WSAAsyncGetServByPort);\n    ATTACH(WSACancelAsyncRequest);\n    ATTACH(WSACancelBlockingCall);\n    ATTACH(WSACleanup);\n    ATTACH(WSACloseEvent);\n    ATTACH(WSAConnect);\n    ATTACH(WSACreateEvent);\n    ATTACH(WSADuplicateSocketA);\n    ATTACH(WSADuplicateSocketW);\n    ATTACH(WSAEnumNameSpaceProvidersA);\n    ATTACH(WSAEnumNameSpaceProvidersW);\n    ATTACH(WSAEnumNetworkEvents);\n    ATTACH(WSAEnumProtocolsA);\n    ATTACH(WSAEnumProtocolsW);\n    ATTACH(WSAIsBlocking);\n    ATTACH(WSAJoinLeaf);\n    ATTACH(WSALookupServiceBeginA);\n    ATTACH(WSALookupServiceBeginW);\n    ATTACH(WSALookupServiceNextA);\n    ATTACH(WSALookupServiceNextW);\n    ATTACH(WSALookupServiceEnd);\n    ATTACH(WSAProviderConfigChange);\n    ATTACH(WSARecv);\n    ATTACH(WSARecvDisconnect);\n    ATTACH(WSARecvFrom);\n    ATTACH(WSAResetEvent);\n    ATTACH(WSASend);\n    ATTACH(WSASendDisconnect);\n    ATTACH(WSASendTo);\n    ATTACH(WSAStringToAddressA);\n    ATTACH(WSAStringToAddressW);\n    ATTACH(WSAWaitForMultipleEvents);\n    ATTACH(accept);\n    ATTACH(closesocket);\n    ATTACH(connect);\n    ATTACH(listen);\n    ATTACH(recv);\n    ATTACH(recvfrom);\n    ATTACH(send);\n    ATTACH(sendto);\n    ATTACH(shutdown);\n\n    return DetourTransactionCommit();\n}\n\nLONG DetachDetours(VOID)\n{\n    DetourTransactionBegin();\n    DetourUpdateThread(GetCurrentThread());\n\n    DETACH(CreateProcessW);\n    DETACH(WSAAccept);\n    DETACH(WSAAddressToStringA);\n    DETACH(WSAAddressToStringW);\n    DETACH(WSAAsyncGetHostByAddr);\n    DETACH(WSAAsyncGetHostByName);\n    DETACH(WSAAsyncGetProtoByName);\n    DETACH(WSAAsyncGetProtoByNumber);\n    DETACH(WSAAsyncGetServByName);\n    DETACH(WSAAsyncGetServByPort);\n    DETACH(WSACancelAsyncRequest);\n    DETACH(WSACancelBlockingCall);\n    DETACH(WSACleanup);\n    DETACH(WSACloseEvent);\n    DETACH(WSAConnect);\n    DETACH(WSACreateEvent);\n    DETACH(WSADuplicateSocketA);\n    DETACH(WSADuplicateSocketW);\n    DETACH(WSAEnumNameSpaceProvidersA);\n    DETACH(WSAEnumNameSpaceProvidersW);\n    DETACH(WSAEnumNetworkEvents);\n    DETACH(WSAEnumProtocolsA);\n    DETACH(WSAEnumProtocolsW);\n    DETACH(WSAIsBlocking);\n    DETACH(WSAJoinLeaf);\n    DETACH(WSALookupServiceBeginA);\n    DETACH(WSALookupServiceBeginW);\n    DETACH(WSALookupServiceNextA);\n    DETACH(WSALookupServiceNextW);\n    DETACH(WSALookupServiceEnd);\n    DETACH(WSAProviderConfigChange);\n    DETACH(WSARecv);\n    DETACH(WSARecvDisconnect);\n    DETACH(WSARecvFrom);\n    DETACH(WSAResetEvent);\n    DETACH(WSASend);\n    DETACH(WSASendDisconnect);\n    DETACH(WSASendTo);\n    DETACH(WSAStringToAddressA);\n    DETACH(WSAStringToAddressW);\n    DETACH(WSAWaitForMultipleEvents);\n    DETACH(accept);\n    DETACH(closesocket);\n    DETACH(connect);\n    DETACH(listen);\n    DETACH(recv);\n    DETACH(recvfrom);\n    DETACH(send);\n    DETACH(sendto);\n    DETACH(shutdown);\n\n    return DetourTransactionCommit();\n}\n\n//\n//////////////////////////////////////////////////////////////////////////////\n\n////////////////////////////////////////////////////////////// Logging System.\n//\nstatic BOOL s_bLog = 1;\nstatic LONG s_nTlsIndent = -1;\nstatic LONG s_nTlsThread = -1;\nstatic LONG s_nThreadCnt = 0;\n\nVOID _PrintEnter(const CHAR *psz, ...)\n{\n    DWORD dwErr = GetLastError();\n\n    LONG nIndent = 0;\n    LONG nThread = 0;\n    if (s_nTlsIndent >= 0) {\n        nIndent = (LONG)(LONG_PTR)TlsGetValue(s_nTlsIndent);\n        TlsSetValue(s_nTlsIndent, (PVOID)(LONG_PTR)(nIndent + 1));\n    }\n    if (s_nTlsThread >= 0) {\n        nThread = (LONG)(LONG_PTR)TlsGetValue(s_nTlsThread);\n    }\n\n    if (s_bLog && psz) {\n        CHAR szBuf[1024];\n        PCHAR pszBuf = szBuf;\n        PCHAR pszEnd = szBuf + ARRAYSIZE(szBuf) - 1;\n        LONG nLen = (nIndent > 0) ? (nIndent < 35 ? nIndent * 2 : 70) : 0;\n        *pszBuf++ = (CHAR)('0' + ((nThread / 100) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 10) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 1) % 10));\n        *pszBuf++ = ' ';\n        while (nLen-- > 0) {\n            *pszBuf++ = ' ';\n        }\n\n        va_list  args;\n        va_start(args, psz);\n\n        while ((*pszBuf++ = *psz++) != 0 && pszBuf < pszEnd) {\n            // Copy characters.\n        }\n        *pszEnd = '\\0';\n        SyelogV(SYELOG_SEVERITY_INFORMATION,\n                szBuf, args);\n\n        va_end(args);\n    }\n    SetLastError(dwErr);\n}\n\nVOID _PrintExit(const CHAR *psz, ...)\n{\n    DWORD dwErr = GetLastError();\n\n    LONG nIndent = 0;\n    LONG nThread = 0;\n    if (s_nTlsIndent >= 0) {\n        nIndent = (LONG)(LONG_PTR)TlsGetValue(s_nTlsIndent) - 1;\n        ASSERT(nIndent >= 0);\n        TlsSetValue(s_nTlsIndent, (PVOID)(LONG_PTR)nIndent);\n    }\n    if (s_nTlsThread >= 0) {\n        nThread = (LONG)(LONG_PTR)TlsGetValue(s_nTlsThread);\n    }\n\n    if (s_bLog && psz) {\n        CHAR szBuf[1024];\n        PCHAR pszBuf = szBuf;\n        PCHAR pszEnd = szBuf + ARRAYSIZE(szBuf) - 1;\n        LONG nLen = (nIndent > 0) ? (nIndent < 35 ? nIndent * 2 : 70) : 0;\n        *pszBuf++ = (CHAR)('0' + ((nThread / 100) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 10) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 1) % 10));\n        *pszBuf++ = ' ';\n        while (nLen-- > 0) {\n            *pszBuf++ = ' ';\n        }\n\n        va_list  args;\n        va_start(args, psz);\n\n        while ((*pszBuf++ = *psz++) != 0 && pszBuf < pszEnd) {\n            // Copy characters.\n        }\n        *pszEnd = '\\0';\n        SyelogV(SYELOG_SEVERITY_INFORMATION,\n                szBuf, args);\n\n        va_end(args);\n    }\n    SetLastError(dwErr);\n}\n\nVOID _Print(const CHAR *psz, ...)\n{\n    DWORD dwErr = GetLastError();\n\n    LONG nIndent = 0;\n    LONG nThread = 0;\n    if (s_nTlsIndent >= 0) {\n        nIndent = (LONG)(LONG_PTR)TlsGetValue(s_nTlsIndent);\n    }\n    if (s_nTlsThread >= 0) {\n        nThread = (LONG)(LONG_PTR)TlsGetValue(s_nTlsThread);\n    }\n\n    if (s_bLog && psz) {\n        CHAR szBuf[1024];\n        PCHAR pszBuf = szBuf;\n        PCHAR pszEnd = szBuf + ARRAYSIZE(szBuf) - 1;\n        LONG nLen = (nIndent > 0) ? (nIndent < 35 ? nIndent * 2 : 70) : 0;\n        *pszBuf++ = (CHAR)('0' + ((nThread / 100) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 10) % 10));\n        *pszBuf++ = (CHAR)('0' + ((nThread / 1) % 10));\n        *pszBuf++ = ' ';\n        while (nLen-- > 0) {\n            *pszBuf++ = ' ';\n        }\n\n        va_list  args;\n        va_start(args, psz);\n\n        while ((*pszBuf++ = *psz++) != 0 && pszBuf < pszEnd) {\n            // Copy characters.\n        }\n        *pszEnd = '\\0';\n        SyelogV(SYELOG_SEVERITY_INFORMATION,\n                szBuf, args);\n\n        va_end(args);\n    }\n\n    SetLastError(dwErr);\n}\n\nVOID AssertMessage(CONST PCHAR pszMsg, CONST PCHAR pszFile, ULONG nLine)\n{\n    Syelog(SYELOG_SEVERITY_FATAL,\n           \"ASSERT(%s) failed in %s, line %d.\\n\", pszMsg, pszFile, nLine);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// DLL module information\n//\nBOOL ThreadAttach(HMODULE hDll)\n{\n    (void)hDll;\n\n    if (s_nTlsIndent >= 0) {\n        TlsSetValue(s_nTlsIndent, (PVOID)0);\n    }\n    if (s_nTlsThread >= 0) {\n        LONG nThread = InterlockedIncrement(&s_nThreadCnt);\n        TlsSetValue(s_nTlsThread, (PVOID)(LONG_PTR)nThread);\n    }\n    return TRUE;\n}\n\nBOOL ThreadDetach(HMODULE hDll)\n{\n    (void)hDll;\n\n    if (s_nTlsIndent >= 0) {\n        TlsSetValue(s_nTlsIndent, (PVOID)0);\n    }\n    if (s_nTlsThread >= 0) {\n        TlsSetValue(s_nTlsThread, (PVOID)0);\n    }\n    return TRUE;\n}\n\nBOOL ProcessAttach(HMODULE hDll)\n{\n    s_bLog = FALSE;\n    s_nTlsIndent = TlsAlloc();\n    s_nTlsThread = TlsAlloc();\n\n    WCHAR wzExeName[MAX_PATH];\n    s_hInst = hDll;\n\n    Real_GetModuleFileNameW(hDll, s_wzDllPath, ARRAYSIZE(s_wzDllPath));\n    Real_GetModuleFileNameW(NULL, wzExeName, ARRAYSIZE(wzExeName));\n\n    SyelogOpen(\"trctcp\" DETOURS_STRINGIFY(DETOURS_BITS), SYELOG_FACILITY_APPLICATION);\n    Syelog(SYELOG_SEVERITY_INFORMATION,\n           \"##################################################################\\n\");\n    Syelog(SYELOG_SEVERITY_INFORMATION,\n           \"### %ls\\n\", wzExeName);\n    LONG error = AttachDetours();\n    if (error != NO_ERROR) {\n        Syelog(SYELOG_SEVERITY_FATAL, \"### Error attaching detours: %d\\n\", error);\n    }\n\n    ThreadAttach(hDll);\n\n    s_bLog = TRUE;\n    return TRUE;\n}\n\nBOOL ProcessDetach(HMODULE hDll)\n{\n    ThreadDetach(hDll);\n    s_bLog = FALSE;\n\n    LONG error = DetachDetours();\n    if (error != NO_ERROR) {\n        Syelog(SYELOG_SEVERITY_FATAL, \"### Error detaching detours: %d\\n\", error);\n    }\n\n    Syelog(SYELOG_SEVERITY_NOTICE, \"### Closing.\\n\");\n    SyelogClose(FALSE);\n\n    if (s_nTlsIndent >= 0) {\n        TlsFree(s_nTlsIndent);\n    }\n    if (s_nTlsThread >= 0) {\n        TlsFree(s_nTlsThread);\n    }\n    return TRUE;\n}\n\nBOOL APIENTRY DllMain(HINSTANCE hModule, DWORD dwReason, PVOID lpReserved)\n{\n    (void)hModule;\n    (void)lpReserved;\n\n    if (DetourIsHelperProcess()) {\n        return TRUE;\n    }\n\n    switch (dwReason) {\n      case DLL_PROCESS_ATTACH:\n        DetourRestoreAfterWith();\n        printf(\"trctcp\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll: Starting.\\n\");\n        fflush(stdout);\n        return ProcessAttach(hModule);\n      case DLL_PROCESS_DETACH:\n        return ProcessDetach(hModule);\n      case DLL_THREAD_ATTACH:\n        return ThreadAttach(hModule);\n      case DLL_THREAD_DETACH:\n        return ThreadDetach(hModule);\n    }\n    return TRUE;\n}\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/tracetcp/trctcp.rc",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Version information for trctcp.rc.\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include \"detver.h\"\n\n#define VER_INTERNALNAME_STR        \"trctcp\" DETOURS_STRINGIFY(DETOURS_BITS)\n#define VER_ORIGINALFILENAME_STR    \"trctcp\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\"\n#define VER_FILEDESCRIPTION_STR     \"Detours TCP Trace Module\"\n#define VER_COMPANYNAME_STR         \"Microsoft Corporation\"\n\n#include \"common.ver\"\n"
  },
  {
    "path": "ext/detours/samples/tryman/Makefile",
    "content": "##############################################################################\n##\n##  Detours Test Program\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\nBIND_X86=$(ROOT)\\bin.x86\nBIND_X64=$(ROOT)\\bin.x64\n\nLIBS = $(LIBS) kernel32.lib\n\n##############################################################################\n\nall: dirs \\\n    $(BIND)\\tstman$(DETOURS_BITS).dll \\\n    $(BIND)\\tryman$(DETOURS_BITS).exe \\\n    $(BIND)\\size$(DETOURS_BITS).exe \\\n    \\\n    $(BIND)\\managed-x64.exe \\\n    $(BIND)\\managed-ia64.exe \\\n    $(BIND)\\managed-x86.exe \\\n    $(BIND)\\managed-any.exe \\\n    $(BIND)\\managed-any32.exe \\\n    \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\tstman$(DETOURS_BITS).bsc \\\n    $(OBJD)\\tryman$(DETOURS_BITS).bsc \\\n!ENDIF\n    option\n\n##############################################################################\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(BIND)\n\n$(OBJD)\\tstman.obj : tstman.cpp\n\n$(OBJD)\\tstman.res : tstman.rc\n\n$(BIND)\\tstman$(DETOURS_BITS).dll $(BIND)\\tstman$(DETOURS_BITS).lib: \\\n\t\t$(OBJD)\\tstman.obj $(OBJD)\\tstman.res $(DEPS)\n    cl /LD $(CFLAGS) /Fe$(@R).dll /Fd$(@R).pdb \\\n        $(OBJD)\\tstman.obj $(OBJD)\\tstman.res \\\n        /link $(LINKFLAGS) /subsystem:console \\\n        /export:DetourFinishHelperProcess,@1,NONAME \\\n        /export:Test3264 \\\n        $(LIBS)\n\n$(OBJD)\\tstman$(DETOURS_BITS).bsc : tstman.obj\n    bscmake /v /n /o $@ tstman.sbr\n\n$(OBJD)\\tryman.obj : tryman.cpp\n\n$(BIND)\\tryman$(DETOURS_BITS).exe : $(OBJD)\\tryman.obj $(DEPS) $(BIND)\\tstman$(DETOURS_BITS).lib\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb $(OBJD)\\tryman.obj \\\n        /link $(LINKFLAGS) $(LIBS) $(BIND)\\tstman$(DETOURS_BITS).lib \\\n        /subsystem:console\n\n$(OBJD)\\tryman$(DETOURS_BITS).bsc : $(OBJD)\\tryman.obj\n    bscmake /v /n /o $@ $(OBJD)\\tryman.sbr\n\n$(OBJD)\\size.obj : size.cpp\n\n$(BIND)\\size$(DETOURS_BITS).exe : $(OBJD)\\size.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb $(OBJD)\\size.obj \\\n        /link $(LINKFLAGS) $(LIBS) \\\n        /subsystem:console /fixed:no\n\n$(OBJD)\\size$(DETOURS_BITS).bsc : $(OBJD)\\size.obj\n    bscmake /v /n /o $@ $(OBJD)\\size.sbr\n\n$(BIND)\\key.snk:\n    if not exist $(BIND)\\key.snk sn -k $(BIND)\\key.snk\n\nCSCFLAGS=/nowarn:1607 /unsafe- /optimize+ /debug+ /warnaserror\n\n$(BIND)\\managed-x64.exe : $(BIND)\\key.snk managed.cs\n    csc /nologo $(CSCFLAGS) /platform:x64 /keyfile:$(BIND)\\key.snk \\\n        /out:$(BIND)\\managed-x64.exe managed.cs\n\n$(BIND)\\managed-ia64.exe : $(BIND)\\key.snk managed.cs\n    csc /nologo $(CSCFLAGS) /platform:itanium /keyfile:$(BIND)\\key.snk \\\n        /out:$(BIND)\\managed-ia64.exe managed.cs\n\n$(BIND)\\managed-x86.exe : $(BIND)\\key.snk managed.cs\n    csc /nologo $(CSCFLAGS) /platform:x86 /keyfile:$(BIND)\\key.snk \\\n        /out:$(BIND)\\managed-x86.exe managed.cs\n\n$(BIND)\\managed-any.exe : $(BIND)\\key.snk managed.cs\n    csc /nologo $(CSCFLAGS) /platform:anycpu /keyfile:$(BIND)\\key.snk \\\n        /out:$(BIND)\\managed-any.exe managed.cs\n\n$(BIND)\\managed-any32.exe : $(BIND)\\key.snk managed.cs\n    -csc /nologo $(CSCFLAGS) /platform:anycpu32bitpreferred /keyfile:$(BIND)\\key.snk \\\n        /out:$(BIND)\\managed-any32.exe managed.cs\n\n##############################################################################\n\nclean:\n    -del *~ 2>nul\n    -del $(BIND)\\managed-*.* 2>nul\n    -del $(BIND)\\tstman*.* 2>nul\n    -del $(BIND)\\tryman*.* 2>nul\n    -del $(BIND)\\size*.* 2>nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\n############################################### Install non-bit-size binaries.\n\n!IF \"$(DETOURS_OPTION_PROCESSOR)\" != \"\"\n\n$(OPTD)\\tstman$(DETOURS_OPTION_BITS).dll:\n$(OPTD)\\tstman$(DETOURS_OPTION_BITS).pdb:\n$(OPTD)\\tryman$(DETOURS_OPTION_BITS).exe:\n$(OPTD)\\tryman$(DETOURS_OPTION_BITS).pdb:\n$(OPTD)\\size$(DETOURS_OPTION_BITS).exe:\n$(OPTD)\\size$(DETOURS_OPTION_BITS).pdb:\n\n$(BIND)\\tstman$(DETOURS_OPTION_BITS).dll : $(OPTD)\\tstman$(DETOURS_OPTION_BITS).dll\n    @if exist $? copy /y $? $(BIND) >nul >nul && echo.   $@ copied.\n$(BIND)\\tstman$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\tstman$(DETOURS_OPTION_BITS).pdb\n    @if exist $? copy /y $? $(BIND) >nul >nul && echo.   $@ copied.\n$(BIND)\\tryman$(DETOURS_OPTION_BITS).exe : $(OPTD)\\tryman$(DETOURS_OPTION_BITS).exe\n    @if exist $? copy /y $? $(BIND) >nul >nul && echo.   $@ copied.\n$(BIND)\\tryman$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\tryman$(DETOURS_OPTION_BITS).pdb\n    @if exist $? copy /y $? $(BIND) >nul >nul && echo.   $@ copied.\n$(BIND)\\size$(DETOURS_OPTION_BITS).exe : $(OPTD)\\size$(DETOURS_OPTION_BITS).exe\n    @if exist $? copy /y $? $(BIND) >nul >nul && echo.   $@ copied.\n$(BIND)\\size$(DETOURS_OPTION_BITS).pdb : $(OPTD)\\size$(DETOURS_OPTION_BITS).pdb\n    @if exist $? copy /y $? $(BIND) >nul >nul && echo.   $@ copied.\n\noption: \\\n    $(BIND)\\tstman$(DETOURS_OPTION_BITS).dll \\\n    $(BIND)\\tstman$(DETOURS_OPTION_BITS).pdb \\\n    $(BIND)\\tryman$(DETOURS_OPTION_BITS).exe \\\n    $(BIND)\\tryman$(DETOURS_OPTION_BITS).pdb \\\n    $(BIND)\\size$(DETOURS_OPTION_BITS).exe \\\n    $(BIND)\\size$(DETOURS_OPTION_BITS).pdb \\\n\n!ELSE\n\noption:\n\n!ENDIF\n\n##############################################################################\n\n# !IF \"$(DETOURS_TARGET_PROCESSOR)\" == \"X64\"\n# #!MESSAGE Building for 64-bit X64.\n# DETOURS_SOURCE_BROWSING = 0\n# !ELSEIF \"$(DETOURS_TARGET_PROCESSOR)\" == \"IA64\"\n# #!MESSAGE Building for 64-bit IA64.\n# !ELSEIF \"$(DETOURS_TARGET_PROCESSOR)\" == \"X86\"\n# #!MESSAGE Building for 32-bit X86.\n# !ELSE\n\n!if \"$(DETOURS_OPTION_PROCESSOR)\" != \"\"\ntest: all size32 size64\n!else\ntest: all\n!endif\n    @echo ---- Trying native binary w/o test ----------------------\n    $(BIND)\\tryman$(DETOURS_BITS).exe\n    @echo.\n    @echo ---- Trying native binary -------------------------------\n    $(BIND)\\withdll.exe -d:$(BIND)\\tstman$(DETOURS_BITS).dll $(BIND)\\tryman$(DETOURS_BITS).exe\n    @echo.\n    @echo ---- Trying anycpu managed binary -----------------------\n    -$(BIND)\\withdll.exe -d:$(BIND)\\tstman$(DETOURS_BITS).dll $(BIND)\\managed-any.exe\n    @echo.\n    @echo ---- Trying anycpu managed 32-bit preferrred binary -----\n    -if exist $(BIND)\\managed-any32.exe $(BIND)\\withdll.exe -d:$(BIND)\\tstman$(DETOURS_BITS).dll $(BIND)\\managed-any32.exe\n    @echo.\n    @echo ---- Trying x86 managed binary --------------------------\n    -$(BIND)\\withdll.exe -d:$(BIND)\\tstman$(DETOURS_BITS).dll $(BIND)\\managed-x86.exe\n    @echo.\n    @echo ---- Trying x64 managed binary --------------------------\n    -$(BIND)\\withdll.exe -d:$(BIND)\\tstman$(DETOURS_BITS).dll $(BIND)\\managed-x64.exe\n    @echo.\n    @echo ---- Trying ia64 managed binary -------------------------\n    -$(BIND)\\withdll.exe -d:$(BIND)\\tstman$(DETOURS_BITS).dll $(BIND)\\managed-ia64.exe\n    @echo.\n\ntestm: all\n    csc managed.cs\n    @echo.\n    $(BIND)\\withdll.exe -d:$(BIND)\\tstman$(DETOURS_BITS).dll $(BIND)\\managed-any.exe\n    @echo.\n\nsize: all\n    @echo.\n    $(BIND)\\withdll.exe -d:$(BIND)\\tstman$(DETOURS_BITS).dll $(BIND)\\size$(DETOURS_BITS).exe 10\n    @echo.\n\nsize32: all\n    @echo.\n    $(BIND)\\withdll.exe -d:$(BIND)\\tstman$(DETOURS_BITS).dll $(BIND)\\size32.exe 10\n    @echo.\n\nsize64: all\n    @echo.\n    $(BIND)\\withdll.exe -d:$(BIND)\\tstman$(DETOURS_BITS).dll $(BIND)\\size64.exe 10\n    @echo.\n\nsizedbg: all\n    @echo.\n    windbg -o $(BIND)\\withdll.exe -d:$(BIND)\\tstman$(DETOURS_BITS).dll $(BIND)\\size$(DETOURS_BITS).exe 10\n    @echo.\n\ntx: all\n    cd $(MAKEDIR)\\..\\..\\src\n    nmake /nologo\n    cd $(MAKEDIR)\\..\\..\\samples\\withdll\n    nmake /nologo\n    cd $(MAKEDIR)\n    rem $(BIND)\\withdll.exe -d:$(BIND)\\tstman$(DETOURS_BITS).dll $(BIND)\\managed.exe\n    windbg -g -o $(BIND)\\withdll.exe -d:$(BIND)\\tstman$(DETOURS_BITS).dll $(BIND)\\managed-any.exe\n\nmx: all\n    cd $(MAKEDIR)\\..\\..\\src\n    nmake /nologo\n    cd $(MAKEDIR)\\..\\..\\samples\\withdll\n    nmake /nologo\n    cd $(MAKEDIR)\n    $(BIND)\\withdll.exe -d:$(BIND)\\tstman$(DETOURS_BITS).dll $(BIND)\\tryman$(DETOURS_BITS).exe\n\ntest-managed: all\n    @echo ---- Trying anycpu managed binary -----------------------\n    -$(BIND)\\withdll.exe -d:$(BIND)\\tstman$(DETOURS_BITS).dll $(BIND)\\managed-any.exe\n    @echo.\n    @echo ---- Trying x86 managed binary --------------------------\n    -$(BIND_X86)\\withdll.exe -d:$(BIND_X86)\\tstman32.dll $(BIND_X86)\\managed-x86.exe\n    @echo.\n    @echo ---- Trying anycpu managed 32-bit preferrred binary -----\n    -if exist $(BIND_X86)\\managed-any32.exe $(BIND_X86)\\withdll.exe -d:$(BIND_X86)\\tstman32.dll $(BIND_X86)\\managed-any32.exe\n    @echo.\n    @echo ---- Trying x64 managed binary --------------------------\n    -$(BIND)\\withdll.exe -d:$(BIND_X64)\\tstman64.dll $(BIND)\\managed-x64.exe\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/tryman/managed.cs",
    "content": "using System;\nusing System.Reflection;\nusing System.Runtime.InteropServices;\n\n[assembly: AssemblyProduct(\"Microsoft Research Detours\")]\n[assembly: AssemblyCompany(\"Microsoft Corporation\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n\npublic class Test\n{\n    //    [DllImport(\"kernel32.dll\", CharSet=CharSet.Auto, SetLastError=true)]\n    //    static extern IntPtr LoadLibrary([In, MarshalAs(UnmanagedType.LPStr)] string lpFileName);\n\n    [DllImport(\"kernel32\", CharSet=CharSet.Auto, SetLastError=true)]\n    static extern IntPtr LoadLibrary(string lpFileName);\n\n    public static int Main()\n    {\n        if (IntPtr.Size == 4) {\n            Console.WriteLine(\"  *** Managed code with 32-bit runtime ({0})\",\n                              Environment.Version);\n        }\n        else if (IntPtr.Size == 8) {\n            Console.WriteLine(\"  *** Managed code with 64-bit runtime ({0})\",\n                              Environment.Version);\n        }\n        else {\n            Console.WriteLine(\"  *** Managed code of unknown IntPtr.Size: {0}\", IntPtr.Size);\n        }\n\n        if (IntPtr.Size == 4) {\n            if (LoadLibrary(\"tstman32.dll\") == (IntPtr)0) {\n                Console.WriteLine(\"--------: managed code failed to load tstman32.dll\");\n\n            }\n        }\n        else {\n            if (LoadLibrary(\"tstman64.dll\") == (IntPtr)0) {\n                Console.WriteLine(\"--------: managed code failed to load tstman64.dll\");\n\n            }\n        }\n\n        return 0;\n    }\n}\n\n\n"
  },
  {
    "path": "ext/detours/samples/tryman/size.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detour Test Program (sleepold.cpp of sleepold.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include <windows.h>\n#include <stdio.h>\n#include <stdlib.h>\n#pragma warning(push)\n#if _MSC_VER > 1400\n#pragma warning(disable:6102 6103) // /analyze warnings\n#endif\n#include <strsafe.h>\n#pragma warning(pop)\n#include <detours.h>\n\nint __cdecl main(int argc, char **argv)\n{\n    STARTUPINFOA si;\n    PROCESS_INFORMATION pi;\n    CHAR szFullExe[MAX_PATH];\n    CHAR szCommand[MAX_PATH];\n    PCHAR pszFileExe;\n    PCHAR pszExe;\n\n    ZeroMemory(&si, sizeof(si));\n    ZeroMemory(&pi, sizeof(pi));\n    si.cb = sizeof(si);\n\n\n    if (argc != 2) {\n        printf(\"size\" DETOURS_STRINGIFY(DETOURS_BITS) \".exe:\"\n               \" must take a single integer argument.\\n\");\n        fflush(stdout);\n        return 3;\n    }\n\n    int repeats = atoi(argv[1]);\n\n    if (repeats <= 0) {\n        printf(\"size\" DETOURS_STRINGIFY(DETOURS_BITS) \".exe:\"\n               \" End of the road, repeats=0.\\n\");\n        fflush(stdout);\n        return 0;\n    }\n\n    if ((repeats % 2) == 0) {\n#ifdef DETOURS_OPTION_BITS\n        pszExe = \"size\" DETOURS_STRINGIFY(DETOURS_OPTION_BITS) \".exe\";\n#else\n        pszExe = \"size\" DETOURS_STRINGIFY(DETOURS_BITS) \".exe\";\n#endif\n    }\n    else {\n        pszExe = \"size\" DETOURS_STRINGIFY(DETOURS_BITS) \".exe\";\n    }\n\n    if (!SearchPathA(NULL, pszExe, \".exe\", ARRAYSIZE(szFullExe), szFullExe, &pszFileExe)) {\n        pszExe = \"size\" DETOURS_STRINGIFY(DETOURS_BITS) \".exe\";\n        SearchPathA(NULL, pszExe, \".exe\", ARRAYSIZE(szFullExe), szFullExe, &pszFileExe);\n    }\n\n    StringCchPrintfA(szCommand, sizeof(szCommand), \"%s %d\", pszExe, repeats - 1);\n\n    printf(\"size\" DETOURS_STRINGIFY(DETOURS_BITS) \".exe:\"\n           \" [%s]\\n\", szCommand);\n    fflush(stdout);\n\n    SetLastError(0);\n    if (!CreateProcessA(szFullExe[0] ? szFullExe : NULL, szCommand,\n                        NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) {\n        DWORD dwError = GetLastError();\n        printf(\"size\" DETOURS_STRINGIFY(DETOURS_BITS) \".exe:\"\n               \" CreateProcess failed: %ld\\n\", dwError);\n        return 1;\n    }\n\n    WaitForSingleObject(pi.hProcess, INFINITE);\n\n    DWORD dwResult = 0;\n    if (!GetExitCodeProcess(pi.hProcess, &dwResult)) {\n        printf(\"size\" DETOURS_STRINGIFY(DETOURS_BITS) \".exe:\"\n               \" GetExitCodeProcess failed: %ld\\n\", GetLastError());\n        return 9010;\n    }\n\n    return 0;\n}\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/tryman/tryman.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (tryman.cpp of tryman.exe)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include <windows.h>\n\nextern int WINAPI Test3264(int arg);\n\nint __cdecl main(int argc, char ** argv)\n{\n    (void)argv;\n    int ret = 0;\n\n    ret = Test3264(argc);\n    return ret == 0 ? ret : 0;\n}\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/tryman/tstman.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Test Program (tstman.cpp of tstman.dll)\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n//  This DLL doesn't detour any APIs, but it does enumerate the modules\n//  loaded in a process and look at their size and processor target.\n//\n\n#include <stdio.h>\n#include <windows.h>\n#pragma warning(push)\n#if _MSC_VER > 1400\n#pragma warning(disable:6102 6103) // /analyze warnings\n#endif\n#include <strsafe.h>\n#pragma warning(pop)\n#include \"detours.h\"\n\nstatic HMODULE s_hInst = NULL;\nstatic CHAR s_szDllPath[MAX_PATH];\n\nstatic int (WINAPI * TrueEntryPoint)(VOID) = NULL;\nstatic int (WINAPI * RawEntryPoint)(VOID) = NULL;\n\nBOOL (WINAPI * Real_CreateProcessA)(LPCSTR a0,\n                                    LPSTR a1,\n                                    LPSECURITY_ATTRIBUTES a2,\n                                    LPSECURITY_ATTRIBUTES a3,\n                                    BOOL a4,\n                                    DWORD a5,\n                                    LPVOID a6,\n                                    LPCSTR a7,\n                                    struct _STARTUPINFOA* a8,\n                                    LPPROCESS_INFORMATION a9)\n    = CreateProcessA;\n\nBOOL (WINAPI * Real_CreateProcessW)(LPCWSTR a0,\n                                    LPWSTR a1,\n                                    LPSECURITY_ATTRIBUTES a2,\n                                    LPSECURITY_ATTRIBUTES a3,\n                                    BOOL a4,\n                                    DWORD a5,\n                                    LPVOID a6,\n                                    LPCWSTR a7,\n                                    struct _STARTUPINFOW* a8,\n                                    LPPROCESS_INFORMATION a9)\n    = CreateProcessW;\n\n\nBOOL WINAPI Mine_CreateProcessA(LPCSTR lpApplicationName,\n                                LPSTR lpCommandLine,\n                                LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                BOOL bInheritHandles,\n                                DWORD dwCreationFlags,\n                                LPVOID lpEnvironment,\n                                LPCSTR lpCurrentDirectory,\n                                LPSTARTUPINFOA lpStartupInfo,\n                                LPPROCESS_INFORMATION lpProcessInformation)\n{\n    BOOL rv = 0;\n    __try {\n        rv = DetourCreateProcessWithDllExA(lpApplicationName,\n                                           lpCommandLine,\n                                           lpProcessAttributes,\n                                           lpThreadAttributes,\n                                           bInheritHandles,\n                                           dwCreationFlags,\n                                           lpEnvironment,\n                                           lpCurrentDirectory,\n                                           lpStartupInfo,\n                                           lpProcessInformation,\n                                           s_szDllPath,\n                                           Real_CreateProcessA);\n    } __finally {\n    };\n    return rv;\n}\n\nBOOL WINAPI Mine_CreateProcessW(LPCWSTR lpApplicationName,\n                                LPWSTR lpCommandLine,\n                                LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                BOOL bInheritHandles,\n                                DWORD dwCreationFlags,\n                                LPVOID lpEnvironment,\n                                LPCWSTR lpCurrentDirectory,\n                                LPSTARTUPINFOW lpStartupInfo,\n                                LPPROCESS_INFORMATION lpProcessInformation)\n{\n    BOOL rv = 0;\n    __try {\n        rv = DetourCreateProcessWithDllExW(lpApplicationName,\n                                           lpCommandLine,\n                                           lpProcessAttributes,\n                                           lpThreadAttributes,\n                                           bInheritHandles,\n                                           dwCreationFlags,\n                                           lpEnvironment,\n                                           lpCurrentDirectory,\n                                           lpStartupInfo,\n                                           lpProcessInformation,\n                                           s_szDllPath,\n                                           Real_CreateProcessW);\n    } __finally {\n    };\n    return rv;\n}\n\nvoid DumpModuleInfo(HMODULE hModule)\n{\n    PBYTE pbModule = (PBYTE)hModule;\n    PIMAGE_DOS_HEADER pidh = (PIMAGE_DOS_HEADER)pbModule;\n    PIMAGE_NT_HEADERS pinh = (PIMAGE_NT_HEADERS)(pbModule + pidh->e_lfanew);\n    CHAR szFile[MAX_PATH] = \"\";\n\n    GetModuleFileNameA(hModule, szFile, sizeof(szFile));\n\n    CHAR szMagic[64];\n    CHAR szMachine[64];\n    CHAR szClr[64];\n\n    PIMAGE_DATA_DIRECTORY pdir\n        = (pinh->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC)\n        ? ((PIMAGE_NT_HEADERS32)pinh)->OptionalHeader.DataDirectory\n        : ((PIMAGE_NT_HEADERS64)pinh)->OptionalHeader.DataDirectory;\n\n    if (pdir[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR].VirtualAddress != 0 &&\n        pdir[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR].Size != 0) {\n\n        PDETOUR_CLR_HEADER pch\n            = (PDETOUR_CLR_HEADER)\n            (pbModule + pdir[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR].VirtualAddress);\n\n        if ((pch->Flags & 0x3) == 0x0) {\n            StringCchPrintfA(szClr, ARRAYSIZE(szClr), \"clr   \");   // 32- or 64-bit.\n        }\n        else if ((pch->Flags & 0x3) == 0x1) {\n            StringCchPrintfA(szClr, ARRAYSIZE(szClr), \"clri  \");   // IL-Only, 32- or 64-bit.\n        }\n        else if ((pch->Flags & 0x3) == 0x2) {\n            StringCchPrintfA(szClr, ARRAYSIZE(szClr), \"clr32 \");   // must be 32-bit.\n        }\n        else if ((pch->Flags & 0x3) == 0x3) {\n            StringCchPrintfA(szClr, ARRAYSIZE(szClr), \"clr32i\");   // IL-Only, must be 32-bit.\n        }\n    }\n    else {\n        StringCchPrintfA(szClr, ARRAYSIZE(szClr), \"      \");\n    }\n\n    if (pinh->OptionalHeader.Magic == 0x10b) {\n        StringCchPrintfA(szMagic, ARRAYSIZE(szMagic), \"32\");\n    }\n    else if (pinh->OptionalHeader.Magic == 0x20b) {\n        StringCchPrintfA(szMagic, ARRAYSIZE(szMagic), \"64\");\n    }\n    else {\n        StringCchPrintfA(szMagic, ARRAYSIZE(szMagic), \"??\");\n    }\n\n    if (pinh->FileHeader.Machine == 0x8664) {\n        StringCchPrintfA(szMachine, ARRAYSIZE(szMachine), \"x64\", pinh->FileHeader.Machine);\n    }\n    else if (pinh->FileHeader.Machine == 0x014c) {\n        StringCchPrintfA(szMachine, ARRAYSIZE(szMachine), \"x86\", pinh->FileHeader.Machine);\n    }\n    else if (pinh->FileHeader.Machine == 0x0200) {\n        StringCchPrintfA(szMachine, ARRAYSIZE(szMachine), \"i64\", pinh->FileHeader.Machine);\n    }\n    else if (pinh->FileHeader.Machine == 0x01c0) {\n        StringCchPrintfA(szMachine, ARRAYSIZE(szMachine), \"arm\", pinh->FileHeader.Machine);\n    }\n    else {\n        StringCchPrintfA(szMachine, ARRAYSIZE(szMachine), \"%04x\", pinh->FileHeader.Machine);\n        DWORD dwSize = DetourGetSizeOfPayloads(hModule);\n        if (dwSize > 0) {\n            StringCchPrintfA(szMachine, ARRAYSIZE(szMachine), \"     \");\n            StringCchPrintfA(szFile, ARRAYSIZE(szFile), \"-- %d byte payload.\", dwSize);\n        }\n    }\n\n    printf(\"%16I64x: %s %s %s %s\\n\", (ULONG64)hModule, szMagic, szMachine, szClr, szFile);\n}\n\nvoid DumpMemory(PBYTE pbData, DWORD cbData)\n{\n    for (DWORD i = 0; i < cbData; i += 16) {\n        printf(\"  %p:\", pbData + i);\n        for (DWORD j = 0; j < 16; j++) {\n            if (i + j < cbData) {\n                printf(\"%02x\", pbData[i+j]);\n            }\n            else {\n                printf(\"  \");\n            }\n        }\n        printf(\" \");\n        for (DWORD j = 0; j < 16; j++) {\n            if (i + j < cbData) {\n                if ( pbData[i+j] >= ' ' && pbData[i+j] < 127) {\n                    printf(\"%c\", pbData[i+j]);\n                }\n                else {\n                    printf(\".\");\n                }\n            }\n            else {\n                printf(\" \");\n            }\n        }\n        printf(\"\\n\");\n    }\n}\n\nint WINAPI Test3264(int arg)\n{\n    return arg + 1;\n}\n\nint WINAPI TestEntryPoint(VOID)\n{\n#if DETOURS_64BIT\n    printf(\"----------------: \");\n#else\n    printf(\"--------: \");\n#endif\n\n    printf(\"Calling EntryPoint() from detour.\\n\");\n    fflush(stdout);\n\n    return TrueEntryPoint();\n}\n\nBOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)\n{\n    (void)hinst;\n    (void)reserved;\n\n    if (DetourIsHelperProcess()) {\n        return TRUE;\n    }\n\n    if (dwReason == DLL_PROCESS_ATTACH) {\n        DetourRestoreAfterWith();\n\n        s_hInst = hinst;\n        GetModuleFileNameA(s_hInst, s_szDllPath, ARRAYSIZE(s_szDllPath));\n\n#if DETOURS_64BIT\n        printf(\"----------------: \");\n#else\n        printf(\"--------: \");\n#endif\n\n        SYSTEM_INFO si;\n        GetSystemInfo(&si);\n\n        if (si.wProcessorArchitecture == 9) {\n            printf(\"x64 Processor\\n\");\n        }\n        else if (si.wProcessorArchitecture == 0) {\n            printf(\"x86 Processor\\n\");\n        }\n        else if (si.wProcessorArchitecture == 6) {\n            printf(\"ia64 Processor\\n\");\n        }\n        else {\n            printf(\"%04x Processor\\n\", si.wProcessorArchitecture);\n        }\n\n        HMODULE hSelf = GetModuleHandle(NULL);\n        HMODULE hTest = (HMODULE)DetourGetContainingModule(DetourCodeFromPointer(Test3264, NULL));\n        HMODULE hKern = (HMODULE)DetourGetContainingModule(DetourCodeFromPointer(CreateProcessW, NULL));\n\n        DumpModuleInfo(hSelf);\n        DumpModuleInfo(hTest);\n        DumpModuleInfo(hKern);\n        for (HINSTANCE hInst = NULL; (hInst = DetourEnumerateModules(hInst)) != NULL;) {\n            if (hInst == hSelf || hInst == hTest || hInst == hKern) {\n                continue;\n            }\n\n            DumpModuleInfo(hInst);\n        }\n        fflush(stdout);\n\n        TrueEntryPoint = (int (WINAPI *)(VOID))DetourGetEntryPoint(NULL);\n        RawEntryPoint = TrueEntryPoint;\n\n        DetourTransactionBegin();\n        DetourUpdateThread(GetCurrentThread());\n        DetourAttach(&(PVOID&)TrueEntryPoint, TestEntryPoint);\n        DetourAttach(&(PVOID&)Real_CreateProcessA, Mine_CreateProcessA);\n        DetourAttach(&(PVOID&)Real_CreateProcessW, Mine_CreateProcessW);\n        LONG error = DetourTransactionCommit();\n\n#if DETOURS_64BIT\n        printf(\"----------------: \");\n#else\n        printf(\"--------: \");\n#endif\n\n        if (error == NO_ERROR) {\n            printf(\"Detoured EntryPoint().\\n\");\n        }\n        else {\n            printf(\"Error detouring EntryPoint(): %ld (@ %p)\\n\", error, RawEntryPoint);\n            __debugbreak();\n        }\n    }\n    else if (dwReason == DLL_PROCESS_DETACH) {\n\n        DetourTransactionBegin();\n        DetourUpdateThread(GetCurrentThread());\n        DetourDetach(&(PVOID&)TrueEntryPoint, TestEntryPoint);\n        DetourDetach(&(PVOID&)Real_CreateProcessA, Mine_CreateProcessA);\n        DetourDetach(&(PVOID&)Real_CreateProcessW, Mine_CreateProcessW);\n        LONG error = DetourTransactionCommit();\n\n        if (error != NO_ERROR) {\n            printf(\"Error detach detours failed: %ld\\n\", error);\n        }\n    }\n\n    return TRUE;\n}\n\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/samples/tryman/tstman.rc",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Version information for tstman.rc.\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#include \"detver.h\"\n\n#define VER_INTERNALNAME_STR        \"tstman\" DETOURS_STRINGIFY(DETOURS_BITS)\n#define VER_ORIGINALFILENAME_STR    \"tstman\" DETOURS_STRINGIFY(DETOURS_BITS) \".dll\"\n#define VER_FILEDESCRIPTION_STR     \"Detours 32/64-bit Test Module\"\n#define VER_COMPANYNAME_STR         \"Microsoft Corporation\"\n\n#include \"common.ver\"\n"
  },
  {
    "path": "ext/detours/samples/withdll/Makefile",
    "content": "##############################################################################\n##\n##  Makefile for Detours Test Programs.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n!include ..\\common.mak\n\nLIBS=$(LIBS) kernel32.lib\n\n##############################################################################\n\nall: dirs \\\n    $(BIND)\\withdll.exe \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\withdll.bsc \\\n!ENDIF\n\toption\n\nclean:\n    -del *~ 2>nul\n    -del $(BIND)\\withdll.* 2>nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\n##############################################################################\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\n$(OBJD)\\withdll.obj : withdll.cpp\n\n$(BIND)\\withdll.exe : $(OBJD)\\withdll.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb $(OBJD)\\withdll.obj \\\n        /link $(LINKFLAGS) $(LIBS) /subsystem:console\n\n$(OBJD)\\withdll.bsc : $(OBJD)\\withdll.obj\n    bscmake /v /n /o $@ $(OBJD)\\withdll.sbr\n\n############################################### Install non-bit-size binaries.\n\noption:\n\n##############################################################################\n\ntest: all\n    $(BIND)\\withdll.exe -d:$(BIND)\\slept$(DETOURS_BITS).dll $(BIND)\\sleepold.exe\n    $(BIND)\\withdll.exe -v -d:$(BIND)\\slept$(DETOURS_BITS).dll $(BIND)\\sleepold.exe\n\ndebug: all\n    windbg  -c \".srcfix;l+s;l+t\" -o \\\n\t\t$(BIND)\\withdll.exe -d:$(BIND)\\slept$(DETOURS_BITS).dll $(BIND)\\sleepold.exe\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/samples/withdll/withdll.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Test DetourCreateProcessWithDll function (withdll.cpp).\n//\n//  Microsoft Research Detours Package\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n#include <stdio.h>\n#include <windows.h>\n#include <detours.h>\n#pragma warning(push)\n#if _MSC_VER > 1400\n#pragma warning(disable:6102 6103) // /analyze warnings\n#endif\n#include <strsafe.h>\n#pragma warning(pop)\n\n//////////////////////////////////////////////////////////////////////////////\n//\nvoid PrintUsage(void)\n{\n    printf(\"Usage:\\n\"\n           \"    withdll.exe [options] [command line]\\n\"\n           \"Options:\\n\"\n           \"    /d:file.dll   : Start the process with file.dll.\\n\"\n           \"    /v            : Verbose, display memory at start.\\n\"\n           \"    /?            : This help screen.\\n\");\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\n//  This code verifies that the named DLL has been configured correctly\n//  to be imported into the target process.  DLLs must export a function with\n//  ordinal #1 so that the import table touch-up magic works.\n//\nstruct ExportContext\n{\n    BOOL    fHasOrdinal1;\n    ULONG   nExports;\n};\n\nstatic BOOL CALLBACK ExportCallback(_In_opt_ PVOID pContext,\n                                    _In_ ULONG nOrdinal,\n                                    _In_opt_ LPCSTR pszSymbol,\n                                    _In_opt_ PVOID pbTarget)\n{\n    (void)pContext;\n    (void)pbTarget;\n    (void)pszSymbol;\n\n    ExportContext *pec = (ExportContext *)pContext;\n\n    if (nOrdinal == 1) {\n        pec->fHasOrdinal1 = TRUE;\n    }\n    pec->nExports++;\n\n    return TRUE;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\n\n//////////////////////////////////////////////////////////////////////////////\n//\n\nvoid TypeToString(DWORD Type, char *pszBuffer, size_t cBuffer)\n{\n    if (Type == MEM_IMAGE) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"img\");\n    }\n    else if (Type == MEM_MAPPED) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"map\");\n    }\n    else if (Type == MEM_PRIVATE) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"pri\");\n    }\n    else {\n        StringCchPrintfA(pszBuffer, cBuffer, \"%x\", Type);\n    }\n}\n\nvoid StateToString(DWORD State, char *pszBuffer, size_t cBuffer)\n{\n    if (State == MEM_COMMIT) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"com\");\n    }\n    else if (State == MEM_FREE) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"fre\");\n    }\n    else if (State == MEM_RESERVE) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"res\");\n    }\n    else {\n        StringCchPrintfA(pszBuffer, cBuffer, \"%x\", State);\n    }\n}\n\nvoid ProtectToString(DWORD Protect, char *pszBuffer, size_t cBuffer)\n{\n    if (Protect == 0) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"\");\n    }\n    else if (Protect == PAGE_EXECUTE) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"--x\");\n    }\n    else if (Protect == PAGE_EXECUTE_READ) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"r-x\");\n    }\n    else if (Protect == PAGE_EXECUTE_READWRITE) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"rwx\");\n    }\n    else if (Protect == PAGE_EXECUTE_WRITECOPY) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"rcx\");\n    }\n    else if (Protect == PAGE_NOACCESS) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"---\");\n    }\n    else if (Protect == PAGE_READONLY) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"r--\");\n    }\n    else if (Protect == PAGE_READWRITE) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"rw-\");\n    }\n    else if (Protect == PAGE_WRITECOPY) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"rc-\");\n    }\n    else if (Protect == (PAGE_GUARD | PAGE_EXECUTE)) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"g--x\");\n    }\n    else if (Protect == (PAGE_GUARD | PAGE_EXECUTE_READ)) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"gr-x\");\n    }\n    else if (Protect == (PAGE_GUARD | PAGE_EXECUTE_READWRITE)) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"grwx\");\n    }\n    else if (Protect == (PAGE_GUARD | PAGE_EXECUTE_WRITECOPY)) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"grcx\");\n    }\n    else if (Protect == (PAGE_GUARD | PAGE_NOACCESS)) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"g---\");\n    }\n    else if (Protect == (PAGE_GUARD | PAGE_READONLY)) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"gr--\");\n    }\n    else if (Protect == (PAGE_GUARD | PAGE_READWRITE)) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"grw-\");\n    }\n    else if (Protect == (PAGE_GUARD | PAGE_WRITECOPY)) {\n        StringCchPrintfA(pszBuffer, cBuffer, \"grc-\");\n    }\n    else {\n        StringCchPrintfA(pszBuffer, cBuffer, \"%x\", Protect);\n    }\n}\n\ntypedef union\n{\n    struct\n    {\n        DWORD Signature;\n        IMAGE_FILE_HEADER FileHeader;\n    } ih;\n\n    IMAGE_NT_HEADERS32 ih32;\n    IMAGE_NT_HEADERS64 ih64;\n} IMAGE_NT_HEADER;\n\nstruct SECTIONS\n{\n    PBYTE   pbBeg;\n    PBYTE   pbEnd;\n    CHAR    szName[16];\n} Sections[256];\nDWORD SectionCount = 0;\nDWORD Bitness = 0;\n\nPCHAR FindSectionName(PBYTE pbBase, PBYTE& pbEnd)\n{\n    for (DWORD n = 0; n < SectionCount; n++) {\n        if (Sections[n].pbBeg == pbBase) {\n            pbEnd = Sections[n].pbEnd;\n            return Sections[n].szName;\n        }\n    }\n    pbEnd = NULL;\n    return NULL;\n}\n\nULONG PadToPage(ULONG Size)\n{\n    return (Size & 0xfff)\n        ? Size + 0x1000 - (Size & 0xfff)\n        : Size;\n}\n\nBOOL GetSections(HANDLE hp, PBYTE pbBase)\n{\n    DWORD beg = 0;\n    DWORD cnt = 0;\n    SIZE_T done;\n    IMAGE_DOS_HEADER idh;\n\n    if (!ReadProcessMemory(hp, pbBase, &idh, sizeof(idh), &done) || done != sizeof(idh)) {\n        return FALSE;\n    }\n\n    if (idh.e_magic != IMAGE_DOS_SIGNATURE) {\n        return FALSE;\n    }\n\n    IMAGE_NT_HEADER inh;\n    if (!ReadProcessMemory(hp, pbBase + idh.e_lfanew, &inh, sizeof(inh), &done) || done != sizeof(inh)) {\n        printf(\"No Read\\n\");\n        return FALSE;\n    }\n\n    if (inh.ih.Signature != IMAGE_NT_SIGNATURE) {\n        printf(\"No NT\\n\");\n        return FALSE;\n    }\n\n    beg = idh.e_lfanew\n        + FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader )\n        + inh.ih.FileHeader.SizeOfOptionalHeader;\n    cnt = inh.ih.FileHeader.NumberOfSections;\n    Bitness = (inh.ih32.OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC) ? 32 : 64;\n#if 0\n    printf(\"%d %d count=%d\\n\", beg, Bitness, cnt);\n#endif\n\n    IMAGE_SECTION_HEADER ish;\n    for (DWORD n = 0; n < cnt; n++) {\n        if (!ReadProcessMemory(hp, pbBase + beg + n * sizeof(ish), &ish, sizeof(ish), &done) || done != sizeof(ish)) {\n            printf(\"No Read\\n\");\n            return FALSE;\n        }\n        Sections[n].pbBeg = pbBase + ish.VirtualAddress;\n        Sections[n].pbEnd = pbBase + ish.VirtualAddress + PadToPage(ish.Misc.VirtualSize);\n        memcpy(Sections[n].szName, ish.Name, sizeof(ish.Name));\n        Sections[n].szName[sizeof(ish.Name)] = '\\0';\n#if 0\n        printf(\"--- %p %s\\n\", Sections[n].pbBeg, Sections[n].szName);\n#endif\n    }\n    SectionCount = cnt;\n\n    return TRUE;\n}\n\nBOOL DumpProcess(HANDLE hp)\n{\n    ULONG64 base;\n    ULONG64 next;\n\n    MEMORY_BASIC_INFORMATION mbi;\n\n    printf(\"  %12s %8s %8s: %3s %3s %4s %3s : %8s\\n\", \"Address\", \"Offset\", \"Size\", \"Typ\", \"Sta\", \"Prot\", \"Ini\", \"Contents\");\n    printf(\"  %12s %8s %8s: %3s %3s %4s %3s : %8s\\n\", \"------------\", \"--------\", \"--------\", \"---\", \"---\", \"----\", \"---\", \"-----------------\");\n\n    for (next = 0;;) {\n        base = next;\n        ZeroMemory(&mbi, sizeof(mbi));\n        if (VirtualQueryEx(hp, (PVOID)base, &mbi, sizeof(mbi)) == 0) {\n            break;\n        }\n        if ((mbi.RegionSize & 0xfff) == 0xfff) {\n            break;\n        }\n\n        next = (ULONG64)mbi.BaseAddress + mbi.RegionSize;\n\n        if (mbi.State == MEM_FREE) {\n            continue;\n        }\n\n        CHAR szType[16];\n        TypeToString(mbi.Type, szType, ARRAYSIZE(szType));\n        CHAR szState[16];\n        StateToString(mbi.State, szState, ARRAYSIZE(szState));\n        CHAR szProtect[16];\n        ProtectToString(mbi.Protect, szProtect, ARRAYSIZE(szProtect));\n        CHAR szAllocProtect[16];\n        ProtectToString(mbi.AllocationProtect, szAllocProtect, ARRAYSIZE(szAllocProtect));\n\n        CHAR szFile[MAX_PATH];\n        szFile[0] = '\\0';\n        DWORD cb = 0;\n        PCHAR pszFile = szFile;\n\n        if (base == (ULONG64)mbi.AllocationBase) {\n#if 0\n            cb = pfGetMappedFileName(hp, (PVOID)mbi.AllocationBase, szFile, ARRAYSIZE(szFile));\n#endif\n            if (GetSections(hp, (PBYTE)mbi.AllocationBase)) {\n                next = base + 0x1000;\n                StringCchPrintfA(szFile, ARRAYSIZE(szFile), \"%d-bit PE\", Bitness);\n            }\n        }\n        if (cb > 0) {\n            for (DWORD c = 0; c < cb; c++) {\n                szFile[c] = (szFile[c] >= 'a' && szFile[c] <= 'z')\n                    ? szFile[c] - 'a' + 'A' : szFile[c];\n            }\n            szFile[cb] = '\\0';\n        }\n\n        if ((pszFile = strrchr(szFile, '\\\\')) == NULL) {\n            pszFile = szFile;\n        }\n        else {\n            pszFile++;\n        }\n\n        PBYTE pbEnd;\n        PCHAR pszSect = FindSectionName((PBYTE)base, pbEnd);\n        if (pszSect != NULL) {\n            pszFile = pszSect;\n            if (next > (ULONG64)pbEnd) {\n                next = (ULONG64)pbEnd;\n            }\n        }\n\n        CHAR szDesc[128];\n        ZeroMemory(&szDesc, ARRAYSIZE(szDesc));\n        if (base == (ULONG64)mbi.AllocationBase) {\n            StringCchPrintfA(szDesc, ARRAYSIZE(szDesc), \"  %12I64x %8I64x %8I64x: %3s %3s %4s %3s : %s\",\n                             (ULONG64)base,\n                             (ULONG64)base - (ULONG64)mbi.AllocationBase,\n                             (ULONG64)next - (ULONG64)base,\n                             szType,\n                             szState,\n                             szProtect,\n                             szAllocProtect,\n                             pszFile);\n\n\n        }\n        else {\n            StringCchPrintfA(szDesc, ARRAYSIZE(szDesc), \"  %12s %8I64x %8I64x: %3s %3s %4s %3s : %s\",\n                             \"-\",\n                             (ULONG64)base - (ULONG64)mbi.AllocationBase,\n                             (ULONG64)next - (ULONG64)base,\n                             szType,\n                             szState,\n                             szProtect,\n                             szAllocProtect,\n                             pszFile);\n        }\n        printf(\"%s\\n\", szDesc);\n    }\n    return TRUE;\n}\n\n//////////////////////////////////////////////////////////////////////// main.\n//\nint CDECL main(int argc, char **argv)\n{\n    BOOLEAN fNeedHelp = FALSE;\n    BOOLEAN fVerbose = FALSE;\n    LPCSTR rpszDllsRaw[256];\n    LPCSTR rpszDllsOut[256];\n    DWORD nDlls = 0;\n\n    for (DWORD n = 0; n < ARRAYSIZE(rpszDllsRaw); n++) {\n        rpszDllsRaw[n] = NULL;\n        rpszDllsOut[n] = NULL;\n    }\n\n    int arg = 1;\n    for (; arg < argc && (argv[arg][0] == '-' || argv[arg][0] == '/'); arg++) {\n\n        CHAR *argn = argv[arg] + 1;\n        CHAR *argp = argn;\n        while (*argp && *argp != ':' && *argp != '=')\n            argp++;\n        if (*argp == ':' || *argp == '=')\n            *argp++ = '\\0';\n\n        switch (argn[0]) {\n          case 'd':                                     // Set DLL Name\n          case 'D':\n            if (nDlls < ARRAYSIZE(rpszDllsRaw)) {\n                rpszDllsRaw[nDlls++] = argp;\n            }\n            else {\n                printf(\"withdll.exe: Too many DLLs.\\n\");\n                fNeedHelp = TRUE;\n                break;\n            }\n            break;\n\n          case 'v':                                     // Verbose\n          case 'V':\n            fVerbose = TRUE;\n            break;\n\n          case '?':                                     // Help\n            fNeedHelp = TRUE;\n            break;\n\n          default:\n            fNeedHelp = TRUE;\n            printf(\"withdll.exe: Bad argument: %s\\n\", argv[arg]);\n            break;\n        }\n    }\n\n    if (arg >= argc) {\n        fNeedHelp = TRUE;\n    }\n\n    if (nDlls == 0) {\n        fNeedHelp = TRUE;\n    }\n\n    if (fNeedHelp) {\n        PrintUsage();\n        return 9001;\n    }\n\n    /////////////////////////////////////////////////////////// Validate DLLs.\n    //\n    for (DWORD n = 0; n < nDlls; n++) {\n        CHAR szDllPath[1024];\n        PCHAR pszFilePart = NULL;\n\n        if (!GetFullPathNameA(rpszDllsRaw[n], ARRAYSIZE(szDllPath), szDllPath, &pszFilePart)) {\n            printf(\"withdll.exe: Error: %s is not a valid path name..\\n\",\n                   rpszDllsRaw[n]);\n            return 9002;\n        }\n\n        DWORD c = (DWORD)strlen(szDllPath) + 1;\n        PCHAR psz = new CHAR [c];\n        StringCchCopyA(psz, c, szDllPath);\n        rpszDllsOut[n] = psz;\n\n        HMODULE hDll = LoadLibraryExA(rpszDllsOut[n], NULL, DONT_RESOLVE_DLL_REFERENCES);\n        if (hDll == NULL) {\n            printf(\"withdll.exe: Error: %s failed to load (error %ld).\\n\",\n                   rpszDllsOut[n],\n                   GetLastError());\n            return 9003;\n        }\n\n        ExportContext ec;\n        ec.fHasOrdinal1 = FALSE;\n        ec.nExports = 0;\n        DetourEnumerateExports(hDll, &ec, ExportCallback);\n        FreeLibrary(hDll);\n\n        if (!ec.fHasOrdinal1) {\n            printf(\"withdll.exe: Error: %s does not export ordinal #1.\\n\",\n                   rpszDllsOut[n]);\n            printf(\"             See help entry DetourCreateProcessWithDllEx in Detours.chm.\\n\");\n            return 9004;\n        }\n    }\n\n    //////////////////////////////////////////////////////////////////////////\n    STARTUPINFOA si;\n    PROCESS_INFORMATION pi;\n    CHAR szCommand[2048];\n    CHAR szExe[1024];\n    CHAR szFullExe[1024] = \"\\0\";\n    PCHAR pszFileExe = NULL;\n\n    ZeroMemory(&si, sizeof(si));\n    ZeroMemory(&pi, sizeof(pi));\n    si.cb = sizeof(si);\n\n    szCommand[0] = L'\\0';\n\n    StringCchCopyA(szExe, sizeof(szExe), argv[arg]);\n    for (; arg < argc; arg++) {\n        if (strchr(argv[arg], ' ') != NULL || strchr(argv[arg], '\\t') != NULL) {\n            StringCchCatA(szCommand, sizeof(szCommand), \"\\\"\");\n            StringCchCatA(szCommand, sizeof(szCommand), argv[arg]);\n            StringCchCatA(szCommand, sizeof(szCommand), \"\\\"\");\n        }\n        else {\n            StringCchCatA(szCommand, sizeof(szCommand), argv[arg]);\n        }\n\n        if (arg + 1 < argc) {\n            StringCchCatA(szCommand, sizeof(szCommand), \" \");\n        }\n    }\n    printf(\"withdll.exe: Starting: `%s'\\n\", szCommand);\n    for (DWORD n = 0; n < nDlls; n++) {\n        printf(\"withdll.exe:   with `%s'\\n\", rpszDllsOut[n]);\n    }\n    fflush(stdout);\n\n    DWORD dwFlags = CREATE_DEFAULT_ERROR_MODE | CREATE_SUSPENDED;\n\n    SetLastError(0);\n    SearchPathA(NULL, szExe, \".exe\", ARRAYSIZE(szFullExe), szFullExe, &pszFileExe);\n    if (!DetourCreateProcessWithDllsA(szFullExe[0] ? szFullExe : NULL, szCommand,\n                                     NULL, NULL, TRUE, dwFlags, NULL, NULL,\n                                     &si, &pi, nDlls, rpszDllsOut, NULL)) {\n        DWORD dwError = GetLastError();\n        printf(\"withdll.exe: DetourCreateProcessWithDllEx failed: %ld\\n\", dwError);\n        if (dwError == ERROR_INVALID_HANDLE) {\n#if DETOURS_64BIT\n            printf(\"withdll.exe: Can't detour a 32-bit target process from a 64-bit parent process.\\n\");\n#else\n            printf(\"withdll.exe: Can't detour a 64-bit target process from a 32-bit parent process.\\n\");\n#endif\n        }\n        ExitProcess(9009);\n    }\n\n    if (fVerbose) {\n        DumpProcess(pi.hProcess);\n    }\n\n    ResumeThread(pi.hThread);\n\n    WaitForSingleObject(pi.hProcess, INFINITE);\n\n    DWORD dwResult = 0;\n    if (!GetExitCodeProcess(pi.hProcess, &dwResult)) {\n        printf(\"withdll.exe: GetExitCodeProcess failed: %ld\\n\", GetLastError());\n        return 9010;\n    }\n\n    for (DWORD n = 0; n < nDlls; n++) {\n        if (rpszDllsOut[n] != NULL) {\n            delete[] rpszDllsOut[n];\n            rpszDllsOut[n] = NULL;\n        }\n    }\n\n    return dwResult;\n}\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/src/Makefile",
    "content": "##############################################################################\n##\n##  Makefile for Detours.\n##\n##  Microsoft Research Detours Package, Version 4.0.1\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\nROOT = ..\n!include \"$(ROOT)\\system.mak\"\n\n!IF \"$(DETOURS_SOURCE_BROWSING)\" == \"\"\nDETOURS_SOURCE_BROWSING = 0\n!ENDIF\n\n#######################/#######################################################\n##\nCFLAGS=/nologo /W4 /WX /we4777 /we4800 /Zi /MT /Gy /Gm- /Zl /Od\n\n!IF $(DETOURS_SOURCE_BROWSING)==1\nCFLAGS=$(CFLAGS) /FR\n!ELSE\nCFLAGS=$(CFLAGS) /DWIN32_LEAN_AND_MEAN /D_WIN32_WINNT=0x501\n!ENDIF\n\n!IF \"$(DETOURS_TARGET_PROCESSOR)\" == \"IA64\"\nCFLAGS=$(CFLAGS) /wd4163 # intrinsic rdtebex not available; using newer Windows headers with older compiler\n!ENDIF\n\n!if defined(DETOURS_WIN_7) && defined(DETOURS_CL_17_OR_NEWER)\nCFLAGS=$(CFLAGS) /D_USING_V110_SDK71_\n!elseif defined(DETOURS_ANALYZE)\nCFLAGS=$(CFLAGS) /analyze\n!endif\n\nOBJS = \\\n    $(OBJD)\\detours.obj     \\\n    $(OBJD)\\modules.obj     \\\n    $(OBJD)\\disasm.obj      \\\n    $(OBJD)\\image.obj       \\\n    $(OBJD)\\creatwth.obj    \\\n    $(OBJD)\\disolx86.obj    \\\n    $(OBJD)\\disolx64.obj    \\\n    $(OBJD)\\disolia64.obj   \\\n    $(OBJD)\\disolarm.obj    \\\n    $(OBJD)\\disolarm64.obj  \\\n\n##############################################################################\n##\n.SUFFIXES: .cpp .h .obj\n\n!ifdef DETOURS_ANALYZE\n.cpp{$(OBJD)}.obj:\n    $(CC) $(CFLAGS) /Fd$(LIBD)\\detours.pdb /Fo$(OBJD)\\ /c $<\n!else\n.cpp{$(OBJD)}.obj::\n    $(CC) $(CFLAGS) /Fd$(LIBD)\\detours.pdb /Fo$(OBJD)\\ /c $<\n!endif\n\n##############################################################################\n\nall: dirs \\\n    $(LIBD)\\detours.lib \\\n    $(INCD)\\detours.h   \\\n    $(INCD)\\detver.h    \\\n!IF $(DETOURS_SOURCE_BROWSING)==1\n    $(OBJD)\\detours.bsc \\\n!endif\n\n##############################################################################\n\nclean:\n    -del *~ 2>nul\n    -del $(LIBD)\\detours.pdb $(LIBD)\\detours.lib 2>nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\n##############################################################################\n\ndirs:\n    @if not exist \"$(INCD)\" mkdir \"$(INCD)\" && echo.   Created $(INCD)\n    @if not exist \"$(LIBD)\" mkdir \"$(LIBD)\" && echo.   Created $(LIBD)\n    @if not exist \"$(BIND)\" mkdir \"$(BIND)\" && echo.   Created $(BIND)\n    @if not exist \"$(OBJD)\" mkdir \"$(OBJD)\" && echo.   Created $(OBJD)\n\n$(OBJD)\\detours.bsc : $(OBJS)\n    bscmake /v /n /o $@ $(OBJS:.obj=.sbr)\n\n$(LIBD)\\detours.lib : $(OBJS)\n    link /lib /out:$@ /nologo $(OBJS)\n\n$(INCD)\\detours.h : detours.h\n    copy detours.h $@\n\n$(INCD)\\detver.h : detver.h\n    copy detver.h $@\n\n$(OBJD)\\detours.obj : detours.cpp detours.h\n$(OBJD)\\modules.obj : modules.cpp detours.h\n$(OBJD)\\disasm.obj : disasm.cpp detours.h\n$(OBJD)\\image.obj : image.cpp detours.h\n$(OBJD)\\creatwth.obj : creatwth.cpp uimports.cpp detours.h\n$(OBJD)\\disolx86.obj: disasm.cpp detours.h\n$(OBJD)\\disolx64.obj: disasm.cpp detours.h\n$(OBJD)\\disolia64.obj: disasm.cpp detours.h\n$(OBJD)\\disolarm.obj: disasm.cpp detours.h\n$(OBJD)\\disolarm64.obj: disasm.cpp detours.h\n\ntest: all\n    cd $(MAKEDIR)\\..\\samples\\slept\n    nmake /nologo test\n    cd $(MAKEDIR)\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/src/creatwth.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Create a process with a DLL (creatwth.cpp of detours.lib)\n//\n//  Microsoft Research Detours Package, Version 4.0.1\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n// #define DETOUR_DEBUG 1\n#define DETOURS_INTERNAL\n#include \"detours.h\"\n#include <stddef.h>\n#include <strsafe.h>\n\n#if DETOURS_VERSION != 0x4c0c1   // 0xMAJORcMINORcPATCH\n#error detours.h version mismatch\n#endif\n\n#define IMPORT_DIRECTORY OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]\n#define BOUND_DIRECTORY OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT]\n#define CLR_DIRECTORY OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR]\n#define IAT_DIRECTORY OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT]\n\n//////////////////////////////////////////////////////////////////////////////\n//\nconst GUID DETOUR_EXE_HELPER_GUID = { /* ea0251b9-5cde-41b5-98d0-2af4a26b0fee */\n    0xea0251b9, 0x5cde, 0x41b5,\n    { 0x98, 0xd0, 0x2a, 0xf4, 0xa2, 0x6b, 0x0f, 0xee }};\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// Enumate through modules in the target process.\n//\nstatic BOOL WINAPI LoadNtHeaderFromProcess(HANDLE hProcess,\n                                           HMODULE hModule,\n                                           PIMAGE_NT_HEADERS32 pNtHeader)\n{\n    PBYTE pbModule = (PBYTE)hModule;\n\n    if (pbModule == NULL) {\n        SetLastError(ERROR_INVALID_PARAMETER);\n        return FALSE;\n    }\n\n    MEMORY_BASIC_INFORMATION mbi;\n    ZeroMemory(&mbi, sizeof(mbi));\n\n    if (VirtualQueryEx(hProcess, hModule, &mbi, sizeof(mbi)) == 0) {\n        return FALSE;\n    }\n\n    IMAGE_DOS_HEADER idh;\n\n    if (!ReadProcessMemory(hProcess, pbModule, &idh, sizeof(idh), NULL)) {\n        DETOUR_TRACE((\"ReadProcessMemory(idh@%p..%p) failed: %d\\n\",\n                      pbModule, pbModule + sizeof(idh), GetLastError()));\n        return FALSE;\n    }\n\n    if (idh.e_magic != IMAGE_DOS_SIGNATURE ||\n        (DWORD)idh.e_lfanew > mbi.RegionSize ||\n        (DWORD)idh.e_lfanew < sizeof(idh)) {\n\n        SetLastError(ERROR_BAD_EXE_FORMAT);\n        return FALSE;\n    }\n\n    if (!ReadProcessMemory(hProcess, pbModule + idh.e_lfanew,\n                           pNtHeader, sizeof(*pNtHeader), NULL)) {\n        DETOUR_TRACE((\"ReadProcessMemory(inh@%p..%p:%p) failed: %d\\n\",\n                      pbModule + idh.e_lfanew,\n                      pbModule + idh.e_lfanew + sizeof(*pNtHeader),\n                      pbModule,\n                      GetLastError()));\n        return FALSE;\n    }\n\n    if (pNtHeader->Signature != IMAGE_NT_SIGNATURE) {\n        SetLastError(ERROR_BAD_EXE_FORMAT);\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic HMODULE WINAPI EnumerateModulesInProcess(HANDLE hProcess,\n                                                HMODULE hModuleLast,\n                                                PIMAGE_NT_HEADERS32 pNtHeader)\n{\n    PBYTE pbLast = (PBYTE)hModuleLast + MM_ALLOCATION_GRANULARITY;\n\n    MEMORY_BASIC_INFORMATION mbi;\n    ZeroMemory(&mbi, sizeof(mbi));\n\n    // Find the next memory region that contains a mapped PE image.\n    //\n\n    for (;; pbLast = (PBYTE)mbi.BaseAddress + mbi.RegionSize) {\n        if (VirtualQueryEx(hProcess, (PVOID)pbLast, &mbi, sizeof(mbi)) == 0) {\n            break;\n        }\n\n        // Usermode address space has such an unaligned region size always at the\n        // end and only at the end.\n        //\n        if ((mbi.RegionSize & 0xfff) == 0xfff) {\n            break;\n        }\n        if (((PBYTE)mbi.BaseAddress + mbi.RegionSize) < pbLast) {\n            break;\n        }\n\n        // Skip uncommitted regions and guard pages.\n        //\n        if ((mbi.State != MEM_COMMIT) ||\n            ((mbi.Protect & 0xff) == PAGE_NOACCESS) ||\n            (mbi.Protect & PAGE_GUARD)) {\n            continue;\n        }\n\n        if (LoadNtHeaderFromProcess(hProcess, (HMODULE)pbLast, pNtHeader)) {\n            return (HMODULE)pbLast;\n        }\n    }\n    return NULL;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// Find a region of memory in which we can create a replacement import table.\n//\nstatic PBYTE FindAndAllocateNearBase(HANDLE hProcess, PBYTE pbModule, PBYTE pbBase, DWORD cbAlloc)\n{\n    MEMORY_BASIC_INFORMATION mbi;\n    ZeroMemory(&mbi, sizeof(mbi));\n\n    PBYTE pbLast = pbBase;\n    for (;; pbLast = (PBYTE)mbi.BaseAddress + mbi.RegionSize) {\n\n        ZeroMemory(&mbi, sizeof(mbi));\n        if (VirtualQueryEx(hProcess, (PVOID)pbLast, &mbi, sizeof(mbi)) == 0) {\n            if (GetLastError() == ERROR_INVALID_PARAMETER) {\n                break;\n            }\n            DETOUR_TRACE((\"VirtualQueryEx(%p) failed: %d\\n\",\n                          pbLast, GetLastError()));\n            break;\n        }\n        // Usermode address space has such an unaligned region size always at the\n        // end and only at the end.\n        //\n        if ((mbi.RegionSize & 0xfff) == 0xfff) {\n            break;\n        }\n\n        // Skip anything other than a pure free region.\n        //\n        if (mbi.State != MEM_FREE) {\n            continue;\n        }\n\n        // Use the max of mbi.BaseAddress and pbBase, in case mbi.BaseAddress < pbBase.\n        PBYTE pbAddress = (PBYTE)mbi.BaseAddress > pbBase ? (PBYTE)mbi.BaseAddress : pbBase;\n\n        // Round pbAddress up to the nearest MM allocation boundary.\n        const DWORD_PTR mmGranularityMinusOne = (DWORD_PTR)(MM_ALLOCATION_GRANULARITY -1);\n        pbAddress = (PBYTE)(((DWORD_PTR)pbAddress + mmGranularityMinusOne) & ~mmGranularityMinusOne);\n\n#ifdef _WIN64\n        // The offset from pbModule to any replacement import must fit into 32 bits.\n        // For simplicity, we check that the offset to the last byte fits into 32 bits,\n        // instead of the largest offset we'll actually use. The values are very similar.\n        const size_t GB4 = ((((size_t)1) << 32) - 1);\n        if ((size_t)(pbAddress + cbAlloc - 1 - pbModule) > GB4) {\n            DETOUR_TRACE((\"FindAndAllocateNearBase(1) failing due to distance >4GB %p\\n\", pbAddress));\n            return NULL;\n        }\n#else\n        UNREFERENCED_PARAMETER(pbModule);\n#endif\n\n        DETOUR_TRACE((\"Free region %p..%p\\n\",\n                      mbi.BaseAddress,\n                      (PBYTE)mbi.BaseAddress + mbi.RegionSize));\n\n        for (; pbAddress < (PBYTE)mbi.BaseAddress + mbi.RegionSize; pbAddress += MM_ALLOCATION_GRANULARITY) {\n            PBYTE pbAlloc = (PBYTE)VirtualAllocEx(hProcess, pbAddress, cbAlloc,\n                                                  MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);\n            if (pbAlloc == NULL) {\n                DETOUR_TRACE((\"VirtualAllocEx(%p) failed: %d\\n\", pbAddress, GetLastError()));\n                continue;\n            }\n#ifdef _WIN64\n            // The offset from pbModule to any replacement import must fit into 32 bits.\n            if ((size_t)(pbAddress + cbAlloc - 1 - pbModule) > GB4) {\n                DETOUR_TRACE((\"FindAndAllocateNearBase(2) failing due to distance >4GB %p\\n\", pbAddress));\n                return NULL;\n            }\n#endif\n            DETOUR_TRACE((\"[%p..%p] Allocated for import table.\\n\",\n                          pbAlloc, pbAlloc + cbAlloc));\n            return pbAlloc;\n        }\n    }\n    return NULL;\n}\n\nstatic inline DWORD PadToDword(DWORD dw)\n{\n    return (dw + 3) & ~3u;\n}\n\nstatic inline DWORD PadToDwordPtr(DWORD dw)\n{\n    return (dw + 7) & ~7u;\n}\n\nstatic inline HRESULT ReplaceOptionalSizeA(_Inout_z_count_(cchDest) LPSTR pszDest,\n                                           _In_ size_t cchDest,\n                                           _In_z_ LPCSTR pszSize)\n{\n    if (cchDest == 0 || pszDest == NULL || pszSize == NULL ||\n        pszSize[0] == '\\0' || pszSize[1] == '\\0' || pszSize[2] != '\\0') {\n\n        // can not write into empty buffer or with string other than two chars.\n        return ERROR_INVALID_PARAMETER;\n    }\n\n    for (; cchDest >= 2; cchDest--, pszDest++) {\n        if (pszDest[0] == '?' && pszDest[1] == '?') {\n            pszDest[0] = pszSize[0];\n            pszDest[1] = pszSize[1];\n            break;\n        }\n    }\n\n    return S_OK;\n}\n\nstatic BOOL RecordExeRestore(HANDLE hProcess, HMODULE hModule, DETOUR_EXE_RESTORE& der)\n{\n    // Save the various headers for DetourRestoreAfterWith.\n    ZeroMemory(&der, sizeof(der));\n    der.cb = sizeof(der);\n\n    der.pidh = (PBYTE)hModule;\n    der.cbidh = sizeof(der.idh);\n    if (!ReadProcessMemory(hProcess, der.pidh, &der.idh, sizeof(der.idh), NULL)) {\n        DETOUR_TRACE((\"ReadProcessMemory(idh@%p..%p) failed: %d\\n\",\n                      der.pidh, der.pidh + der.cbidh, GetLastError()));\n        return FALSE;\n    }\n    DETOUR_TRACE((\"IDH: %p..%p\\n\", der.pidh, der.pidh + der.cbidh));\n\n    // We read the NT header in two passes to get the full size.\n    // First we read just the Signature and FileHeader.\n    der.pinh = der.pidh + der.idh.e_lfanew;\n    der.cbinh = FIELD_OFFSET(IMAGE_NT_HEADERS, OptionalHeader);\n    if (!ReadProcessMemory(hProcess, der.pinh, &der.inh, der.cbinh, NULL)) {\n        DETOUR_TRACE((\"ReadProcessMemory(inh@%p..%p) failed: %d\\n\",\n                      der.pinh, der.pinh + der.cbinh, GetLastError()));\n        return FALSE;\n    }\n\n    // Second we read the OptionalHeader and Section headers.\n    der.cbinh = (FIELD_OFFSET(IMAGE_NT_HEADERS, OptionalHeader) +\n                 der.inh.FileHeader.SizeOfOptionalHeader +\n                 der.inh.FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER));\n\n    if (der.cbinh > sizeof(der.raw)) {\n        return FALSE;\n    }\n\n    if (!ReadProcessMemory(hProcess, der.pinh, &der.inh, der.cbinh, NULL)) {\n        DETOUR_TRACE((\"ReadProcessMemory(inh@%p..%p) failed: %d\\n\",\n                      der.pinh, der.pinh + der.cbinh, GetLastError()));\n        return FALSE;\n    }\n    DETOUR_TRACE((\"INH: %p..%p\\n\", der.pinh, der.pinh + der.cbinh));\n\n    // Third, we read the CLR header\n\n    if (der.inh.OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\n        if (der.inh32.CLR_DIRECTORY.VirtualAddress != 0 &&\n            der.inh32.CLR_DIRECTORY.Size != 0) {\n\n            DETOUR_TRACE((\"CLR32.VirtAddr=%x, CLR.Size=%x\\n\",\n                          der.inh32.CLR_DIRECTORY.VirtualAddress,\n                          der.inh32.CLR_DIRECTORY.Size));\n\n            der.pclr = ((PBYTE)hModule) + der.inh32.CLR_DIRECTORY.VirtualAddress;\n        }\n    }\n    else if (der.inh.OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC) {\n        if (der.inh64.CLR_DIRECTORY.VirtualAddress != 0 &&\n            der.inh64.CLR_DIRECTORY.Size != 0) {\n\n            DETOUR_TRACE((\"CLR64.VirtAddr=%x, CLR.Size=%x\\n\",\n                          der.inh64.CLR_DIRECTORY.VirtualAddress,\n                          der.inh64.CLR_DIRECTORY.Size));\n\n            der.pclr = ((PBYTE)hModule) + der.inh64.CLR_DIRECTORY.VirtualAddress;\n        }\n    }\n\n    if (der.pclr != 0) {\n        der.cbclr = sizeof(der.clr);\n        if (!ReadProcessMemory(hProcess, der.pclr, &der.clr, der.cbclr, NULL)) {\n            DETOUR_TRACE((\"ReadProcessMemory(clr@%p..%p) failed: %d\\n\",\n                          der.pclr, der.pclr + der.cbclr, GetLastError()));\n            return FALSE;\n        }\n        DETOUR_TRACE((\"CLR: %p..%p\\n\", der.pclr, der.pclr + der.cbclr));\n    }\n\n    return TRUE;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\n#if DETOURS_32BIT\n#define DWORD_XX                        DWORD32\n#define IMAGE_NT_HEADERS_XX             IMAGE_NT_HEADERS32\n#define IMAGE_NT_OPTIONAL_HDR_MAGIC_XX  IMAGE_NT_OPTIONAL_HDR32_MAGIC\n#define IMAGE_ORDINAL_FLAG_XX           IMAGE_ORDINAL_FLAG32\n#define IMAGE_THUNK_DATAXX              IMAGE_THUNK_DATA32\n#define UPDATE_IMPORTS_XX               UpdateImports32\n#define DETOURS_BITS_XX                 32\n#include \"uimports.cpp\"\n#undef DETOUR_EXE_RESTORE_FIELD_XX\n#undef DWORD_XX\n#undef IMAGE_NT_HEADERS_XX\n#undef IMAGE_NT_OPTIONAL_HDR_MAGIC_XX\n#undef IMAGE_ORDINAL_FLAG_XX\n#undef UPDATE_IMPORTS_XX\n#endif // DETOURS_32BIT\n\n#if DETOURS_64BIT\n#define DWORD_XX                        DWORD64\n#define IMAGE_NT_HEADERS_XX             IMAGE_NT_HEADERS64\n#define IMAGE_NT_OPTIONAL_HDR_MAGIC_XX  IMAGE_NT_OPTIONAL_HDR64_MAGIC\n#define IMAGE_ORDINAL_FLAG_XX           IMAGE_ORDINAL_FLAG64\n#define IMAGE_THUNK_DATAXX           \t  IMAGE_THUNK_DATA64\n#define UPDATE_IMPORTS_XX               UpdateImports64\n#define DETOURS_BITS_XX                 64\n#include \"uimports.cpp\"\n#undef DETOUR_EXE_RESTORE_FIELD_XX\n#undef DWORD_XX\n#undef IMAGE_NT_HEADERS_XX\n#undef IMAGE_NT_OPTIONAL_HDR_MAGIC_XX\n#undef IMAGE_ORDINAL_FLAG_XX\n#undef UPDATE_IMPORTS_XX\n#endif // DETOURS_64BIT\n\n//////////////////////////////////////////////////////////////////////////////\n//\n#if DETOURS_64BIT\n\nC_ASSERT(sizeof(IMAGE_NT_HEADERS64) == sizeof(IMAGE_NT_HEADERS32) + 16);\n\nstatic BOOL UpdateFrom32To64(HANDLE hProcess, HMODULE hModule, WORD machine,\n                             DETOUR_EXE_RESTORE& der)\n{\n    IMAGE_DOS_HEADER idh;\n    IMAGE_NT_HEADERS32 inh32;\n    IMAGE_NT_HEADERS64 inh64;\n    IMAGE_SECTION_HEADER sects[32];\n    PBYTE pbModule = (PBYTE)hModule;\n    DWORD n;\n\n    ZeroMemory(&inh32, sizeof(inh32));\n    ZeroMemory(&inh64, sizeof(inh64));\n    ZeroMemory(sects, sizeof(sects));\n\n    DETOUR_TRACE((\"UpdateFrom32To64(%04x)\\n\", machine));\n    //////////////////////////////////////////////////////// Read old headers.\n    //\n    if (!ReadProcessMemory(hProcess, pbModule, &idh, sizeof(idh), NULL)) {\n        DETOUR_TRACE((\"ReadProcessMemory(idh@%p..%p) failed: %d\\n\",\n                      pbModule, pbModule + sizeof(idh), GetLastError()));\n        return FALSE;\n    }\n    DETOUR_TRACE((\"ReadProcessMemory(idh@%p..%p)\\n\",\n                  pbModule, pbModule + sizeof(idh)));\n\n    PBYTE pnh = pbModule + idh.e_lfanew;\n    if (!ReadProcessMemory(hProcess, pnh, &inh32, sizeof(inh32), NULL)) {\n        DETOUR_TRACE((\"ReadProcessMemory(inh@%p..%p) failed: %d\\n\",\n                      pnh, pnh + sizeof(inh32), GetLastError()));\n        return FALSE;\n    }\n    DETOUR_TRACE((\"ReadProcessMemory(inh@%p..%p)\\n\", pnh, pnh + sizeof(inh32)));\n\n    if (inh32.FileHeader.NumberOfSections > (sizeof(sects)/sizeof(sects[0]))) {\n        return FALSE;\n    }\n\n    PBYTE psects = pnh +\n        FIELD_OFFSET(IMAGE_NT_HEADERS, OptionalHeader) +\n        inh32.FileHeader.SizeOfOptionalHeader;\n    ULONG cb = inh32.FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER);\n    if (!ReadProcessMemory(hProcess, psects, &sects, cb, NULL)) {\n        DETOUR_TRACE((\"ReadProcessMemory(ish@%p..%p) failed: %d\\n\",\n                      psects, psects + cb, GetLastError()));\n        return FALSE;\n    }\n    DETOUR_TRACE((\"ReadProcessMemory(ish@%p..%p)\\n\", psects, psects + cb));\n\n    ////////////////////////////////////////////////////////// Convert header.\n    //\n    inh64.Signature = inh32.Signature;\n    inh64.FileHeader = inh32.FileHeader;\n    inh64.FileHeader.Machine = machine;\n    inh64.FileHeader.SizeOfOptionalHeader = sizeof(IMAGE_OPTIONAL_HEADER64);\n\n    inh64.OptionalHeader.Magic = IMAGE_NT_OPTIONAL_HDR64_MAGIC;\n    inh64.OptionalHeader.MajorLinkerVersion = inh32.OptionalHeader.MajorLinkerVersion;\n    inh64.OptionalHeader.MinorLinkerVersion = inh32.OptionalHeader.MinorLinkerVersion;\n    inh64.OptionalHeader.SizeOfCode = inh32.OptionalHeader.SizeOfCode;\n    inh64.OptionalHeader.SizeOfInitializedData = inh32.OptionalHeader.SizeOfInitializedData;\n    inh64.OptionalHeader.SizeOfUninitializedData = inh32.OptionalHeader.SizeOfUninitializedData;\n    inh64.OptionalHeader.AddressOfEntryPoint = inh32.OptionalHeader.AddressOfEntryPoint;\n    inh64.OptionalHeader.BaseOfCode = inh32.OptionalHeader.BaseOfCode;\n    inh64.OptionalHeader.ImageBase = inh32.OptionalHeader.ImageBase;\n    inh64.OptionalHeader.SectionAlignment = inh32.OptionalHeader.SectionAlignment;\n    inh64.OptionalHeader.FileAlignment = inh32.OptionalHeader.FileAlignment;\n    inh64.OptionalHeader.MajorOperatingSystemVersion\n        = inh32.OptionalHeader.MajorOperatingSystemVersion;\n    inh64.OptionalHeader.MinorOperatingSystemVersion\n        = inh32.OptionalHeader.MinorOperatingSystemVersion;\n    inh64.OptionalHeader.MajorImageVersion = inh32.OptionalHeader.MajorImageVersion;\n    inh64.OptionalHeader.MinorImageVersion = inh32.OptionalHeader.MinorImageVersion;\n    inh64.OptionalHeader.MajorSubsystemVersion = inh32.OptionalHeader.MajorSubsystemVersion;\n    inh64.OptionalHeader.MinorSubsystemVersion = inh32.OptionalHeader.MinorSubsystemVersion;\n    inh64.OptionalHeader.Win32VersionValue = inh32.OptionalHeader.Win32VersionValue;\n    inh64.OptionalHeader.SizeOfImage = inh32.OptionalHeader.SizeOfImage;\n    inh64.OptionalHeader.SizeOfHeaders = inh32.OptionalHeader.SizeOfHeaders;\n    inh64.OptionalHeader.CheckSum = inh32.OptionalHeader.CheckSum;\n    inh64.OptionalHeader.Subsystem = inh32.OptionalHeader.Subsystem;\n    inh64.OptionalHeader.DllCharacteristics = inh32.OptionalHeader.DllCharacteristics;\n    inh64.OptionalHeader.SizeOfStackReserve = inh32.OptionalHeader.SizeOfStackReserve;\n    inh64.OptionalHeader.SizeOfStackCommit = inh32.OptionalHeader.SizeOfStackCommit;\n    inh64.OptionalHeader.SizeOfHeapReserve = inh32.OptionalHeader.SizeOfHeapReserve;\n    inh64.OptionalHeader.SizeOfHeapCommit = inh32.OptionalHeader.SizeOfHeapCommit;\n    inh64.OptionalHeader.LoaderFlags = inh32.OptionalHeader.LoaderFlags;\n    inh64.OptionalHeader.NumberOfRvaAndSizes = inh32.OptionalHeader.NumberOfRvaAndSizes;\n    for (n = 0; n < IMAGE_NUMBEROF_DIRECTORY_ENTRIES; n++) {\n        inh64.OptionalHeader.DataDirectory[n] = inh32.OptionalHeader.DataDirectory[n];\n    }\n\n    /////////////////////////////////////////////////////// Write new headers.\n    //\n    DWORD dwProtect = 0;\n    if (!DetourVirtualProtectSameExecuteEx(hProcess, pbModule, inh64.OptionalHeader.SizeOfHeaders,\n                                           PAGE_EXECUTE_READWRITE, &dwProtect)) {\n        return FALSE;\n    }\n\n    if (!WriteProcessMemory(hProcess, pnh, &inh64, sizeof(inh64), NULL)) {\n        DETOUR_TRACE((\"WriteProcessMemory(inh@%p..%p) failed: %d\\n\",\n                      pnh, pnh + sizeof(inh64), GetLastError()));\n        return FALSE;\n    }\n    DETOUR_TRACE((\"WriteProcessMemory(inh@%p..%p)\\n\", pnh, pnh + sizeof(inh64)));\n\n    psects = pnh +\n        FIELD_OFFSET(IMAGE_NT_HEADERS, OptionalHeader) +\n        inh64.FileHeader.SizeOfOptionalHeader;\n    cb = inh64.FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER);\n    if (!WriteProcessMemory(hProcess, psects, &sects, cb, NULL)) {\n        DETOUR_TRACE((\"WriteProcessMemory(ish@%p..%p) failed: %d\\n\",\n                      psects, psects + cb, GetLastError()));\n        return FALSE;\n    }\n    DETOUR_TRACE((\"WriteProcessMemory(ish@%p..%p)\\n\", psects, psects + cb));\n\n    // Record the updated headers.\n    if (!RecordExeRestore(hProcess, hModule, der)) {\n        return FALSE;\n    }\n\n    // Remove the import table.\n    if (der.pclr != NULL && (der.clr.Flags & COMIMAGE_FLAGS_ILONLY)) {\n        inh64.IMPORT_DIRECTORY.VirtualAddress = 0;\n        inh64.IMPORT_DIRECTORY.Size = 0;\n\n        if (!WriteProcessMemory(hProcess, pnh, &inh64, sizeof(inh64), NULL)) {\n            DETOUR_TRACE((\"WriteProcessMemory(inh@%p..%p) failed: %d\\n\",\n                          pnh, pnh + sizeof(inh64), GetLastError()));\n            return FALSE;\n        }\n    }\n\n    DWORD dwOld = 0;\n    if (!VirtualProtectEx(hProcess, pbModule, inh64.OptionalHeader.SizeOfHeaders,\n                          dwProtect, &dwOld)) {\n        return FALSE;\n    }\n\n    return TRUE;\n}\n#endif // DETOURS_64BIT\n\ntypedef BOOL(WINAPI *LPFN_ISWOW64PROCESS)(HANDLE, PBOOL);\n\nstatic BOOL IsWow64ProcessHelper(HANDLE hProcess,\n                                 PBOOL Wow64Process)\n{\n#ifdef _X86_\n    if (Wow64Process == NULL) {\n        return FALSE;\n    }\n\n    // IsWow64Process is not available on all supported versions of Windows.\n    //\n    HMODULE hKernel32 = LoadLibraryW(L\"KERNEL32.DLL\");\n    if (hKernel32 == NULL) {\n        DETOUR_TRACE((\"LoadLibraryW failed: %d\\n\", GetLastError()));\n        return FALSE;\n    }\n\n    LPFN_ISWOW64PROCESS pfnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(\n        hKernel32, \"IsWow64Process\");\n\n    if (pfnIsWow64Process == NULL) {\n        DETOUR_TRACE((\"GetProcAddress failed: %d\\n\", GetLastError()));\n        return FALSE;\n    }\n    return pfnIsWow64Process(hProcess, Wow64Process);\n#else\n    return IsWow64Process(hProcess, Wow64Process);\n#endif\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nBOOL WINAPI DetourUpdateProcessWithDll(_In_ HANDLE hProcess,\n                                       _In_reads_(nDlls) LPCSTR *rlpDlls,\n                                       _In_ DWORD nDlls)\n{\n    // Find the next memory region that contains a mapped PE image.\n    //\n    BOOL bIs32BitProcess;\n    BOOL bIs64BitOS = FALSE;\n    HMODULE hModule = NULL;\n    HMODULE hLast = NULL;\n\n    DETOUR_TRACE((\"DetourUpdateProcessWithDll(%p,dlls=%d)\\n\", hProcess, nDlls));\n\n    for (;;) {\n        IMAGE_NT_HEADERS32 inh;\n\n        if ((hLast = EnumerateModulesInProcess(hProcess, hLast, &inh)) == NULL) {\n            break;\n        }\n\n        DETOUR_TRACE((\"%p  machine=%04x magic=%04x\\n\",\n                      hLast, inh.FileHeader.Machine, inh.OptionalHeader.Magic));\n\n        if ((inh.FileHeader.Characteristics & IMAGE_FILE_DLL) == 0) {\n            hModule = hLast;\n            DETOUR_TRACE((\"%p  Found EXE\\n\", hLast));\n        }\n    }\n\n    if (hModule == NULL) {\n        SetLastError(ERROR_INVALID_OPERATION);\n        return FALSE;\n    }\n\n    // Determine if the target process is 32bit or 64bit. This is a two-stop process:\n    //\n    // 1. First, determine if we're running on a 64bit operating system.\n    //   - If we're running 64bit code (i.e. _WIN64 is defined), this is trivially true.\n    //   - If we're running 32bit code (i.e. _WIN64 is not defined), test if\n    //   we're running under Wow64. If so, it implies that the operating system\n    //   is 64bit.\n    //\n#ifdef _WIN64\n    bIs64BitOS = TRUE;\n#else\n    if (!IsWow64ProcessHelper(GetCurrentProcess(), &bIs64BitOS)) {\n        return FALSE;\n    }\n#endif\n\n    // 2. With the operating system bitness known, we can now consider the target process:\n    //   - If we're running on a 64bit OS, the target process is 32bit in case\n    //   it is running under Wow64. Otherwise, it's 64bit, running natively\n    //   (without Wow64).\n    //   - If we're running on a 32bit OS, the target process must be 32bit, too.\n    //\n    if (bIs64BitOS) {\n        if (!IsWow64ProcessHelper(hProcess, &bIs32BitProcess)) {\n            return FALSE;\n        }\n    } else {\n        bIs32BitProcess = TRUE;\n    }\n\n    DETOUR_TRACE((\"    32BitExe=%d 32BitProcess\\n\", bHas32BitExe, bIs32BitProcess));\n\n    return DetourUpdateProcessWithDllEx(hProcess,\n                                        hModule,\n                                        bIs32BitProcess,\n                                        rlpDlls,\n                                        nDlls);\n}\n\nBOOL WINAPI DetourUpdateProcessWithDllEx(_In_ HANDLE hProcess,\n                                         _In_ HMODULE hModule,\n                                         _In_ BOOL bIs32BitProcess,\n                                         _In_reads_(nDlls) LPCSTR *rlpDlls,\n                                         _In_ DWORD nDlls)\n{\n    // Find the next memory region that contains a mapped PE image.\n    //\n    BOOL bIs32BitExe = FALSE;\n\n    DETOUR_TRACE((\"DetourUpdateProcessWithDllEx(%p,%p,dlls=%d)\\n\", hProcess, hModule, nDlls));\n\n    IMAGE_NT_HEADERS32 inh;\n\n    if (hModule == NULL || LoadNtHeaderFromProcess(hProcess, hModule, &inh) == NULL) {\n        SetLastError(ERROR_INVALID_OPERATION);\n        return FALSE;\n    }\n\n    if (inh.OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC\n        && inh.FileHeader.Machine != 0) {\n\n        bIs32BitExe = TRUE;\n    }\n\n    DETOUR_TRACE((\"    32BitExe=%d 32BitProcess\\n\", bIs32BitExe, bIs32BitProcess));\n\n    if (hModule == NULL) {\n        SetLastError(ERROR_INVALID_OPERATION);\n        return FALSE;\n    }\n\n    // Save the various headers for DetourRestoreAfterWith.\n    //\n    DETOUR_EXE_RESTORE der;\n\n    if (!RecordExeRestore(hProcess, hModule, der)) {\n        return FALSE;\n    }\n\n#if defined(DETOURS_64BIT)\n    // Try to convert a neutral 32-bit managed binary to a 64-bit managed binary.\n    if (bIs32BitExe && !bIs32BitProcess) {\n        if (!der.pclr                       // Native binary\n            || (der.clr.Flags & COMIMAGE_FLAGS_ILONLY) == 0     // Or mixed-mode MSIL\n            || (der.clr.Flags & COMIMAGE_FLAGS_32BITREQUIRED) != 0) {  // Or 32BIT Required MSIL\n\n            SetLastError(ERROR_INVALID_HANDLE);\n            return FALSE;\n        }\n\n        if (!UpdateFrom32To64(hProcess, hModule,\n#if defined(DETOURS_X64)\n                              IMAGE_FILE_MACHINE_AMD64,\n#elif defined(DETOURS_IA64)\n                              IMAGE_FILE_MACHINE_IA64,\n#elif defined(DETOURS_ARM64)\n                              IMAGE_FILE_MACHINE_ARM64,\n#else\n#error Must define one of DETOURS_X64 or DETOURS_IA64 or DETOURS_ARM64 on 64-bit.\n#endif\n                              der)) {\n            return FALSE;\n        }\n        bIs32BitExe = FALSE;\n    }\n#endif // DETOURS_64BIT\n\n    // Now decide if we can insert the detour.\n\n#if defined(DETOURS_32BIT)\n    if (bIs32BitProcess) {\n        // 32-bit native or 32-bit managed process on any platform.\n        if (!UpdateImports32(hProcess, hModule, rlpDlls, nDlls)) {\n            return FALSE;\n        }\n    }\n    else {\n        // 64-bit native or 64-bit managed process.\n        //\n        // Can't detour a 64-bit process with 32-bit code.\n        // Note: This happens for 32-bit PE binaries containing only\n        // manage code that have been marked as 64-bit ready.\n        //\n        SetLastError(ERROR_INVALID_HANDLE);\n        return FALSE;\n    }\n#elif defined(DETOURS_64BIT)\n    if (bIs32BitProcess || bIs32BitExe) {\n        // Can't detour a 32-bit process with 64-bit code.\n        SetLastError(ERROR_INVALID_HANDLE);\n        return FALSE;\n    }\n    else {\n        // 64-bit native or 64-bit managed process on any platform.\n        if (!UpdateImports64(hProcess, hModule, rlpDlls, nDlls)) {\n            return FALSE;\n        }\n    }\n#else\n#pragma Must define one of DETOURS_32BIT or DETOURS_64BIT.\n#endif // DETOURS_64BIT\n\n    /////////////////////////////////////////////////// Update the CLR header.\n    //\n    if (der.pclr != NULL) {\n        DETOUR_CLR_HEADER clr;\n        CopyMemory(&clr, &der.clr, sizeof(clr));\n        clr.Flags &= ~COMIMAGE_FLAGS_ILONLY;    // Clear the IL_ONLY flag.\n\n        DWORD dwProtect;\n        if (!DetourVirtualProtectSameExecuteEx(hProcess, der.pclr, sizeof(clr), PAGE_READWRITE, &dwProtect)) {\n            DETOUR_TRACE((\"VirtualProtectEx(clr) write failed: %d\\n\", GetLastError()));\n            return FALSE;\n        }\n\n        if (!WriteProcessMemory(hProcess, der.pclr, &clr, sizeof(clr), NULL)) {\n            DETOUR_TRACE((\"WriteProcessMemory(clr) failed: %d\\n\", GetLastError()));\n            return FALSE;\n        }\n\n        if (!VirtualProtectEx(hProcess, der.pclr, sizeof(clr), dwProtect, &dwProtect)) {\n            DETOUR_TRACE((\"VirtualProtectEx(clr) restore failed: %d\\n\", GetLastError()));\n            return FALSE;\n        }\n        DETOUR_TRACE((\"CLR: %p..%p\\n\", der.pclr, der.pclr + der.cbclr));\n\n#if DETOURS_64BIT\n        if (der.clr.Flags & COMIMAGE_FLAGS_32BITREQUIRED) { // Is the 32BIT Required Flag set?\n            // X64 never gets here because the process appears as a WOW64 process.\n            // However, on IA64, it doesn't appear to be a WOW process.\n            DETOUR_TRACE((\"CLR Requires 32-bit\\n\", der.pclr, der.pclr + der.cbclr));\n            SetLastError(ERROR_INVALID_HANDLE);\n            return FALSE;\n        }\n#endif // DETOURS_64BIT\n    }\n\n    //////////////////////////////// Save the undo data to the target process.\n    //\n    if (!DetourCopyPayloadToProcess(hProcess, DETOUR_EXE_RESTORE_GUID, &der, sizeof(der))) {\n        DETOUR_TRACE((\"DetourCopyPayloadToProcess failed: %d\\n\", GetLastError()));\n        return FALSE;\n    }\n    return TRUE;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nBOOL WINAPI DetourCreateProcessWithDllA(_In_opt_ LPCSTR lpApplicationName,\n                                        _Inout_opt_ LPSTR lpCommandLine,\n                                        _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                        _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                        _In_ BOOL bInheritHandles,\n                                        _In_ DWORD dwCreationFlags,\n                                        _In_opt_ LPVOID lpEnvironment,\n                                        _In_opt_ LPCSTR lpCurrentDirectory,\n                                        _In_ LPSTARTUPINFOA lpStartupInfo,\n                                        _Out_ LPPROCESS_INFORMATION lpProcessInformation,\n                                        _In_ LPCSTR lpDllName,\n                                        _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEA pfCreateProcessA)\n{\n    DWORD dwMyCreationFlags = (dwCreationFlags | CREATE_SUSPENDED);\n    PROCESS_INFORMATION pi;\n    BOOL fResult = FALSE;\n\n    if (pfCreateProcessA == NULL) {\n        pfCreateProcessA = CreateProcessA;\n    }\n\n    fResult = pfCreateProcessA(lpApplicationName,\n                               lpCommandLine,\n                               lpProcessAttributes,\n                               lpThreadAttributes,\n                               bInheritHandles,\n                               dwMyCreationFlags,\n                               lpEnvironment,\n                               lpCurrentDirectory,\n                               lpStartupInfo,\n                               &pi);\n\n    if (lpProcessInformation != NULL) {\n        CopyMemory(lpProcessInformation, &pi, sizeof(pi));\n    }\n\n    if (!fResult) {\n        return FALSE;\n    }\n\n    LPCSTR rlpDlls[2];\n    DWORD nDlls = 0;\n    if (lpDllName != NULL) {\n        rlpDlls[nDlls++] = lpDllName;\n    }\n\n    if (!DetourUpdateProcessWithDll(pi.hProcess, rlpDlls, nDlls)) {\n        TerminateProcess(pi.hProcess, ~0u);\n        return FALSE;\n    }\n\n    if (!(dwCreationFlags & CREATE_SUSPENDED)) {\n        ResumeThread(pi.hThread);\n    }\n    return TRUE;\n}\n\n\nBOOL WINAPI DetourCreateProcessWithDllW(_In_opt_ LPCWSTR lpApplicationName,\n                                        _Inout_opt_ LPWSTR lpCommandLine,\n                                        _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                        _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                        _In_ BOOL bInheritHandles,\n                                        _In_ DWORD dwCreationFlags,\n                                        _In_opt_ LPVOID lpEnvironment,\n                                        _In_opt_ LPCWSTR lpCurrentDirectory,\n                                        _In_ LPSTARTUPINFOW lpStartupInfo,\n                                        _Out_ LPPROCESS_INFORMATION lpProcessInformation,\n                                        _In_ LPCSTR lpDllName,\n                                        _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEW pfCreateProcessW)\n{\n    DWORD dwMyCreationFlags = (dwCreationFlags | CREATE_SUSPENDED);\n    PROCESS_INFORMATION pi;\n\n    if (pfCreateProcessW == NULL) {\n        pfCreateProcessW = CreateProcessW;\n    }\n\n    BOOL fResult = pfCreateProcessW(lpApplicationName,\n                                    lpCommandLine,\n                                    lpProcessAttributes,\n                                    lpThreadAttributes,\n                                    bInheritHandles,\n                                    dwMyCreationFlags,\n                                    lpEnvironment,\n                                    lpCurrentDirectory,\n                                    lpStartupInfo,\n                                    &pi);\n\n    if (lpProcessInformation) {\n        CopyMemory(lpProcessInformation, &pi, sizeof(pi));\n    }\n\n    if (!fResult) {\n        return FALSE;\n    }\n\n    LPCSTR rlpDlls[2];\n    DWORD nDlls = 0;\n    if (lpDllName != NULL) {\n        rlpDlls[nDlls++] = lpDllName;\n    }\n\n    if (!DetourUpdateProcessWithDll(pi.hProcess, rlpDlls, nDlls)) {\n        TerminateProcess(pi.hProcess, ~0u);\n        return FALSE;\n    }\n\n    if (!(dwCreationFlags & CREATE_SUSPENDED)) {\n        ResumeThread(pi.hThread);\n    }\n    return TRUE;\n}\n\nBOOL WINAPI DetourCopyPayloadToProcess(_In_ HANDLE hProcess,\n                                       _In_ REFGUID rguid,\n                                       _In_reads_bytes_(cbData) PVOID pvData,\n                                       _In_ DWORD cbData)\n{\n    DWORD cbTotal = (sizeof(IMAGE_DOS_HEADER) +\n                     sizeof(IMAGE_NT_HEADERS) +\n                     sizeof(IMAGE_SECTION_HEADER) +\n                     sizeof(DETOUR_SECTION_HEADER) +\n                     sizeof(DETOUR_SECTION_RECORD) +\n                     cbData);\n\n    PBYTE pbBase = (PBYTE)VirtualAllocEx(hProcess, NULL, cbTotal,\n                                         MEM_COMMIT, PAGE_READWRITE);\n    if (pbBase == NULL) {\n        DETOUR_TRACE((\"VirtualAllocEx(%d) failed: %d\\n\", cbTotal, GetLastError()));\n        return FALSE;\n    }\n\n    PBYTE pbTarget = pbBase;\n    IMAGE_DOS_HEADER idh;\n    IMAGE_NT_HEADERS inh;\n    IMAGE_SECTION_HEADER ish;\n    DETOUR_SECTION_HEADER dsh;\n    DETOUR_SECTION_RECORD dsr;\n    SIZE_T cbWrote = 0;\n\n    ZeroMemory(&idh, sizeof(idh));\n    idh.e_magic = IMAGE_DOS_SIGNATURE;\n    idh.e_lfanew = sizeof(idh);\n    if (!WriteProcessMemory(hProcess, pbTarget, &idh, sizeof(idh), &cbWrote) ||\n        cbWrote != sizeof(idh)) {\n        DETOUR_TRACE((\"WriteProcessMemory(idh) failed: %d\\n\", GetLastError()));\n        return FALSE;\n    }\n    pbTarget += sizeof(idh);\n\n    ZeroMemory(&inh, sizeof(inh));\n    inh.Signature = IMAGE_NT_SIGNATURE;\n    inh.FileHeader.SizeOfOptionalHeader = sizeof(inh.OptionalHeader);\n    inh.FileHeader.Characteristics = IMAGE_FILE_DLL;\n    inh.FileHeader.NumberOfSections = 1;\n    inh.OptionalHeader.Magic = IMAGE_NT_OPTIONAL_HDR_MAGIC;\n    if (!WriteProcessMemory(hProcess, pbTarget, &inh, sizeof(inh), &cbWrote) ||\n        cbWrote != sizeof(inh)) {\n        return FALSE;\n    }\n    pbTarget += sizeof(inh);\n\n    ZeroMemory(&ish, sizeof(ish));\n    memcpy(ish.Name, \".detour\", sizeof(ish.Name));\n    ish.VirtualAddress = (DWORD)((pbTarget + sizeof(ish)) - pbBase);\n    ish.SizeOfRawData = (sizeof(DETOUR_SECTION_HEADER) +\n                         sizeof(DETOUR_SECTION_RECORD) +\n                         cbData);\n    if (!WriteProcessMemory(hProcess, pbTarget, &ish, sizeof(ish), &cbWrote) ||\n        cbWrote != sizeof(ish)) {\n        return FALSE;\n    }\n    pbTarget += sizeof(ish);\n\n    ZeroMemory(&dsh, sizeof(dsh));\n    dsh.cbHeaderSize = sizeof(dsh);\n    dsh.nSignature = DETOUR_SECTION_HEADER_SIGNATURE;\n    dsh.nDataOffset = sizeof(DETOUR_SECTION_HEADER);\n    dsh.cbDataSize = (sizeof(DETOUR_SECTION_HEADER) +\n                      sizeof(DETOUR_SECTION_RECORD) +\n                      cbData);\n    if (!WriteProcessMemory(hProcess, pbTarget, &dsh, sizeof(dsh), &cbWrote) ||\n        cbWrote != sizeof(dsh)) {\n        return FALSE;\n    }\n    pbTarget += sizeof(dsh);\n\n    ZeroMemory(&dsr, sizeof(dsr));\n    dsr.cbBytes = cbData + sizeof(DETOUR_SECTION_RECORD);\n    dsr.nReserved = 0;\n    dsr.guid = rguid;\n    if (!WriteProcessMemory(hProcess, pbTarget, &dsr, sizeof(dsr), &cbWrote) ||\n        cbWrote != sizeof(dsr)) {\n        return FALSE;\n    }\n    pbTarget += sizeof(dsr);\n\n    if (!WriteProcessMemory(hProcess, pbTarget, pvData, cbData, &cbWrote) ||\n        cbWrote != cbData) {\n        return FALSE;\n    }\n    pbTarget += cbData;\n\n    DETOUR_TRACE((\"Copied %d byte payload into target process at %p\\n\",\n                  cbTotal, pbTarget - cbTotal));\n    return TRUE;\n}\n\nstatic BOOL s_fSearchedForHelper = FALSE;\nstatic PDETOUR_EXE_HELPER s_pHelper = NULL;\n\nVOID CALLBACK DetourFinishHelperProcess(_In_ HWND,\n                                        _In_ HINSTANCE,\n                                        _In_ LPSTR,\n                                        _In_ INT)\n{\n    LPCSTR * rlpDlls = NULL;\n    DWORD Result = 9900;\n    DWORD cOffset = 0;\n    DWORD cSize = 0;\n    HANDLE hProcess = NULL;\n\n    if (s_pHelper == NULL) {\n        DETOUR_TRACE((\"DetourFinishHelperProcess called with s_pHelper = NULL.\\n\"));\n        Result = 9905;\n        goto Cleanup;\n    }\n\n    hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, s_pHelper->pid);\n    if (hProcess == NULL) {\n        DETOUR_TRACE((\"OpenProcess(pid=%d) failed: %d\\n\",\n                      s_pHelper->pid, GetLastError()));\n        Result = 9901;\n        goto Cleanup;\n    }\n\n    rlpDlls = new NOTHROW LPCSTR [s_pHelper->nDlls];\n    cSize = s_pHelper->cb - sizeof(DETOUR_EXE_HELPER);\n    for (DWORD n = 0; n < s_pHelper->nDlls; n++) {\n        size_t cchDest = 0;\n        HRESULT hr = StringCchLengthA(&s_pHelper->rDlls[cOffset], cSize - cOffset, &cchDest);\n        if (!SUCCEEDED(hr)) {\n            Result = 9902;\n            goto Cleanup;\n        }\n\n        rlpDlls[n] = &s_pHelper->rDlls[cOffset];\n        cOffset += (DWORD)cchDest + 1;\n    }\n\n    if (!DetourUpdateProcessWithDll(hProcess, rlpDlls, s_pHelper->nDlls)) {\n        DETOUR_TRACE((\"DetourUpdateProcessWithDll(pid=%d) failed: %d\\n\",\n                      s_pHelper->pid, GetLastError()));\n        Result = 9903;\n        goto Cleanup;\n    }\n    Result = 0;\n\n  Cleanup:\n    if (rlpDlls != NULL) {\n        delete[] rlpDlls;\n        rlpDlls = NULL;\n    }\n\n    ExitProcess(Result);\n}\n\nBOOL WINAPI DetourIsHelperProcess(VOID)\n{\n    PVOID pvData;\n    DWORD cbData;\n\n    if (s_fSearchedForHelper) {\n        return (s_pHelper != NULL);\n    }\n\n    s_fSearchedForHelper = TRUE;\n    pvData = DetourFindPayloadEx(DETOUR_EXE_HELPER_GUID, &cbData);\n\n    if (pvData == NULL || cbData < sizeof(DETOUR_EXE_HELPER)) {\n        return FALSE;\n    }\n\n    s_pHelper = (PDETOUR_EXE_HELPER)pvData;\n    if (s_pHelper->cb < sizeof(*s_pHelper)) {\n        s_pHelper = NULL;\n        return FALSE;\n    }\n\n    return TRUE;\n}\n\nstatic\nBOOL WINAPI AllocExeHelper(_Out_ PDETOUR_EXE_HELPER *pHelper,\n                           _In_ DWORD dwTargetPid,\n                           _In_ DWORD nDlls,\n                           _In_reads_(nDlls) LPCSTR *rlpDlls)\n{\n    PDETOUR_EXE_HELPER Helper = NULL;\n    BOOL Result = FALSE;\n    _Field_range_(0, cSize - 4) DWORD cOffset = 0;\n    DWORD cSize = 4;\n\n    if (pHelper == NULL) {\n        goto Cleanup;\n    }\n    *pHelper = NULL;\n\n    if (nDlls < 1 || nDlls > 4096) {\n        SetLastError(ERROR_INVALID_PARAMETER);\n        goto Cleanup;\n    }\n\n    for (DWORD n = 0; n < nDlls; n++) {\n        HRESULT hr;\n        size_t cchDest = 0;\n\n        hr = StringCchLengthA(rlpDlls[n], 4096, &cchDest);\n        if (!SUCCEEDED(hr)) {\n            goto Cleanup;\n        }\n\n        cSize += (DWORD)cchDest + 1;\n    }\n\n    Helper = (PDETOUR_EXE_HELPER) new NOTHROW BYTE[sizeof(DETOUR_EXE_HELPER) + cSize];\n    if (Helper == NULL) {\n        goto Cleanup;\n    }\n\n    Helper->cb = sizeof(DETOUR_EXE_HELPER) + cSize;\n    Helper->pid = dwTargetPid;\n    Helper->nDlls = nDlls;\n\n    for (DWORD n = 0; n < nDlls; n++) {\n        HRESULT hr;\n        size_t cchDest = 0;\n\n        if (cOffset > 0x10000 || cSize > 0x10000 || cOffset + 2 >= cSize) {\n            goto Cleanup;\n        }\n\n        if (cOffset + 2 >= cSize || cOffset + 65536 < cSize) {\n            goto Cleanup;\n        }\n\n        _Analysis_assume_(cOffset + 1 < cSize);\n        _Analysis_assume_(cOffset < 0x10000);\n        _Analysis_assume_(cSize < 0x10000);\n\n        PCHAR psz = &Helper->rDlls[cOffset];\n\n        hr = StringCchCopyA(psz, cSize - cOffset, rlpDlls[n]);\n        if (!SUCCEEDED(hr)) {\n            goto Cleanup;\n        }\n\n// REVIEW 28020 The expression '1<=_Param_(2)& &_Param_(2)<=2147483647' is not true at this call.\n// REVIEW 28313 Analysis will not proceed past this point because of annotation evaluation. The annotation expression *_Param_(3)<_Param_(2)&&*_Param_(3)<=stringLength$(_Param_(1)) cannot be true under any assumptions at this point in the program.\n#pragma warning(suppress:28020 28313)\n        hr = StringCchLengthA(psz, cSize - cOffset, &cchDest);\n        if (!SUCCEEDED(hr)) {\n            goto Cleanup;\n        }\n\n        // Replace \"32.\" with \"64.\" or \"64.\" with \"32.\"\n\n        for (DWORD c = (DWORD)cchDest + 1; c > 3; c--) {\n#if DETOURS_32BIT\n            if (psz[c - 3] == '3' && psz[c - 2] == '2' && psz[c - 1] == '.') {\n                psz[c - 3] = '6'; psz[c - 2] = '4';\n                break;\n            }\n#else\n            if (psz[c - 3] == '6' && psz[c - 2] == '4' && psz[c - 1] == '.') {\n                psz[c - 3] = '3'; psz[c - 2] = '2';\n                break;\n            }\n#endif\n        }\n\n        cOffset += (DWORD)cchDest + 1;\n    }\n\n    *pHelper = Helper;\n    Helper = NULL;\n    Result = TRUE;\n\n  Cleanup:\n    if (Helper != NULL) {\n        delete[] (PBYTE)Helper;\n        Helper = NULL;\n    }\n    return Result;\n}\n\nstatic\nVOID WINAPI FreeExeHelper(PDETOUR_EXE_HELPER *pHelper)\n{\n    if (*pHelper != NULL) {\n        delete[] (PBYTE)*pHelper;\n        *pHelper = NULL;\n    }\n}\n\nBOOL WINAPI DetourProcessViaHelperA(_In_ DWORD dwTargetPid,\n                                    _In_ LPCSTR lpDllName,\n                                    _In_ PDETOUR_CREATE_PROCESS_ROUTINEA pfCreateProcessA)\n{\n    return DetourProcessViaHelperDllsA(dwTargetPid, 1, &lpDllName, pfCreateProcessA);\n}\n\n\nBOOL WINAPI DetourProcessViaHelperDllsA(_In_ DWORD dwTargetPid,\n                                        _In_ DWORD nDlls,\n                                        _In_reads_(nDlls) LPCSTR *rlpDlls,\n                                        _In_ PDETOUR_CREATE_PROCESS_ROUTINEA pfCreateProcessA)\n{\n    BOOL Result = FALSE;\n    PROCESS_INFORMATION pi;\n    STARTUPINFOA si;\n    CHAR szExe[MAX_PATH];\n    CHAR szCommand[MAX_PATH];\n    PDETOUR_EXE_HELPER helper = NULL;\n    HRESULT hr;\n    DWORD nLen = GetEnvironmentVariableA(\"WINDIR\", szExe, ARRAYSIZE(szExe));\n\n    DETOUR_TRACE((\"DetourProcessViaHelperDlls(pid=%d,dlls=%d)\\n\", dwTargetPid, nDlls));\n    if (nDlls < 1 || nDlls > 4096) {\n        SetLastError(ERROR_INVALID_PARAMETER);\n        goto Cleanup;\n    }\n    if (!AllocExeHelper(&helper, dwTargetPid, nDlls, rlpDlls)) {\n        goto Cleanup;\n    }\n\n    if (nLen == 0 || nLen >= ARRAYSIZE(szExe)) {\n        goto Cleanup;\n    }\n\n#if DETOURS_OPTION_BITS\n#if DETOURS_32BIT\n    hr = StringCchCatA(szExe, ARRAYSIZE(szExe), \"\\\\sysnative\\\\rundll32.exe\");\n#else // !DETOURS_32BIT\n    hr = StringCchCatA(szExe, ARRAYSIZE(szExe), \"\\\\syswow64\\\\rundll32.exe\");\n#endif // !DETOURS_32BIT\n#else // DETOURS_OPTIONS_BITS\n    hr = StringCchCatA(szExe, ARRAYSIZE(szExe), \"\\\\system32\\\\rundll32.exe\");\n#endif // DETOURS_OPTIONS_BITS\n    if (!SUCCEEDED(hr)) {\n        goto Cleanup;\n    }\n\n    //for East Asia languages and so on, like Chinese, print format with \"%hs\" can not work fine before user call _tsetlocale(LC_ALL,_T(\".ACP\"));\n    //so we can't use \"%hs\" in format string, because the dll that contain this code would inject to any process, even not call _tsetlocale(LC_ALL,_T(\".ACP\")) before\n    hr = StringCchPrintfA(szCommand, ARRAYSIZE(szCommand),\n                          \"rundll32.exe \\\"%s\\\",#1\", &helper->rDlls[0]);\n    if (!SUCCEEDED(hr)) {\n        goto Cleanup;\n    }\n\n    ZeroMemory(&pi, sizeof(pi));\n    ZeroMemory(&si, sizeof(si));\n    si.cb = sizeof(si);\n\n    DETOUR_TRACE((\"DetourProcessViaHelperDlls(\\\"%hs\\\", \\\"%hs\\\")\\n\", szExe, szCommand));\n    if (pfCreateProcessA(szExe, szCommand, NULL, NULL, FALSE, CREATE_SUSPENDED,\n                         NULL, NULL, &si, &pi)) {\n\n        if (!DetourCopyPayloadToProcess(pi.hProcess,\n                                        DETOUR_EXE_HELPER_GUID,\n                                        helper, helper->cb)) {\n            DETOUR_TRACE((\"DetourCopyPayloadToProcess failed: %d\\n\", GetLastError()));\n            TerminateProcess(pi.hProcess, ~0u);\n            CloseHandle(pi.hProcess);\n            CloseHandle(pi.hThread);\n            goto Cleanup;\n        }\n\n        ResumeThread(pi.hThread);\n        WaitForSingleObject(pi.hProcess, INFINITE);\n\n        DWORD dwResult = 500;\n        GetExitCodeProcess(pi.hProcess, &dwResult);\n\n        CloseHandle(pi.hProcess);\n        CloseHandle(pi.hThread);\n\n        if (dwResult != 0) {\n            DETOUR_TRACE((\"Rundll32.exe failed: result=%d\\n\", dwResult));\n            goto Cleanup;\n        }\n        Result = TRUE;\n    }\n    else {\n        DETOUR_TRACE((\"CreateProcess failed: %d\\n\", GetLastError()));\n        goto Cleanup;\n    }\n\n  Cleanup:\n    FreeExeHelper(&helper);\n    return Result;\n}\n\nBOOL WINAPI DetourProcessViaHelperW(_In_ DWORD dwTargetPid,\n                                    _In_ LPCSTR lpDllName,\n                                    _In_ PDETOUR_CREATE_PROCESS_ROUTINEW pfCreateProcessW)\n{\n    return DetourProcessViaHelperDllsW(dwTargetPid, 1, &lpDllName, pfCreateProcessW);\n}\n\nBOOL WINAPI DetourProcessViaHelperDllsW(_In_ DWORD dwTargetPid,\n                                        _In_ DWORD nDlls,\n                                        _In_reads_(nDlls) LPCSTR *rlpDlls,\n                                        _In_ PDETOUR_CREATE_PROCESS_ROUTINEW pfCreateProcessW)\n{\n    BOOL Result = FALSE;\n    PROCESS_INFORMATION pi;\n    STARTUPINFOW si;\n    WCHAR szExe[MAX_PATH];\n    WCHAR szCommand[MAX_PATH];\n    PDETOUR_EXE_HELPER helper = NULL;\n    HRESULT hr;\n    WCHAR szDllName[MAX_PATH];\n    int cchWrittenWideChar;\n    DWORD nLen = GetEnvironmentVariableW(L\"WINDIR\", szExe, ARRAYSIZE(szExe));\n\n    DETOUR_TRACE((\"DetourProcessViaHelperDlls(pid=%d,dlls=%d)\\n\", dwTargetPid, nDlls));\n    if (nDlls < 1 || nDlls > 4096) {\n        SetLastError(ERROR_INVALID_PARAMETER);\n        goto Cleanup;\n    }\n    if (!AllocExeHelper(&helper, dwTargetPid, nDlls, rlpDlls)) {\n        goto Cleanup;\n    }\n\n    if (nLen == 0 || nLen >= ARRAYSIZE(szExe)) {\n        goto Cleanup;\n    }\n\n#if DETOURS_OPTION_BITS\n#if DETOURS_32BIT\n    hr = StringCchCatW(szExe, ARRAYSIZE(szExe), L\"\\\\sysnative\\\\rundll32.exe\");\n#else // !DETOURS_32BIT\n    hr = StringCchCatW(szExe, ARRAYSIZE(szExe), L\"\\\\syswow64\\\\rundll32.exe\");\n#endif // !DETOURS_32BIT\n#else // DETOURS_OPTIONS_BITS\n    hr = StringCchCatW(szExe, ARRAYSIZE(szExe), L\"\\\\system32\\\\rundll32.exe\");\n#endif // DETOURS_OPTIONS_BITS\n    if (!SUCCEEDED(hr)) {\n        goto Cleanup;\n    }\n\n    //for East Asia languages and so on, like Chinese, print format with \"%hs\" can not work fine before user call _tsetlocale(LC_ALL,_T(\".ACP\"));\n    //so we can't use \"%hs\" in format string, because the dll that contain this code would inject to any process, even not call _tsetlocale(LC_ALL,_T(\".ACP\")) before\n    \n    cchWrittenWideChar = MultiByteToWideChar(CP_ACP, 0, &helper->rDlls[0], -1, szDllName, ARRAYSIZE(szDllName));\n    if (cchWrittenWideChar >= ARRAYSIZE(szDllName) || cchWrittenWideChar <= 0) {\n        goto Cleanup;\n    }\n    hr = StringCchPrintfW(szCommand, ARRAYSIZE(szCommand),\n        L\"rundll32.exe \\\"%s\\\",#1\", szDllName);\n    if (!SUCCEEDED(hr)) {\n        goto Cleanup;\n    }\n\n    ZeroMemory(&pi, sizeof(pi));\n    ZeroMemory(&si, sizeof(si));\n    si.cb = sizeof(si);\n\n    DETOUR_TRACE((\"DetourProcessViaHelperDlls(\\\"%ls\\\", \\\"%ls\\\")\\n\", szExe, szCommand));\n    if (pfCreateProcessW(szExe, szCommand, NULL, NULL, FALSE, CREATE_SUSPENDED,\n                         NULL, NULL, &si, &pi)) {\n\n        if (!DetourCopyPayloadToProcess(pi.hProcess,\n                                        DETOUR_EXE_HELPER_GUID,\n                                        helper, helper->cb)) {\n            DETOUR_TRACE((\"DetourCopyPayloadToProcess failed: %d\\n\", GetLastError()));\n            TerminateProcess(pi.hProcess, ~0u);\n            CloseHandle(pi.hProcess);\n            CloseHandle(pi.hThread);\n            goto Cleanup;\n        }\n\n        ResumeThread(pi.hThread);\n        WaitForSingleObject(pi.hProcess, INFINITE);\n\n        DWORD dwResult = 500;\n        GetExitCodeProcess(pi.hProcess, &dwResult);\n\n        CloseHandle(pi.hProcess);\n        CloseHandle(pi.hThread);\n\n        if (dwResult != 0) {\n            DETOUR_TRACE((\"Rundll32.exe failed: result=%d\\n\", dwResult));\n            goto Cleanup;\n        }\n        Result = TRUE;\n    }\n    else {\n        DETOUR_TRACE((\"CreateProcess failed: %d\\n\", GetLastError()));\n        goto Cleanup;\n    }\n\n  Cleanup:\n    FreeExeHelper(&helper);\n    return Result;\n}\n\nBOOL WINAPI DetourCreateProcessWithDllExA(_In_opt_ LPCSTR lpApplicationName,\n                                          _Inout_opt_ LPSTR lpCommandLine,\n                                          _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                          _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                          _In_ BOOL bInheritHandles,\n                                          _In_ DWORD dwCreationFlags,\n                                          _In_opt_ LPVOID lpEnvironment,\n                                          _In_opt_ LPCSTR lpCurrentDirectory,\n                                          _In_ LPSTARTUPINFOA lpStartupInfo,\n                                          _Out_ LPPROCESS_INFORMATION lpProcessInformation,\n                                          _In_ LPCSTR lpDllName,\n                                          _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEA pfCreateProcessA)\n{\n    if (pfCreateProcessA == NULL) {\n        pfCreateProcessA = CreateProcessA;\n    }\n\n    PROCESS_INFORMATION backup;\n    if (lpProcessInformation == NULL) {\n        lpProcessInformation = &backup;\n        ZeroMemory(&backup, sizeof(backup));\n    }\n\n    if (!pfCreateProcessA(lpApplicationName,\n                          lpCommandLine,\n                          lpProcessAttributes,\n                          lpThreadAttributes,\n                          bInheritHandles,\n                          dwCreationFlags | CREATE_SUSPENDED,\n                          lpEnvironment,\n                          lpCurrentDirectory,\n                          lpStartupInfo,\n                          lpProcessInformation)) {\n        return FALSE;\n    }\n\n    LPCSTR szDll = lpDllName;\n\n    if (!DetourUpdateProcessWithDll(lpProcessInformation->hProcess, &szDll, 1) &&\n        !DetourProcessViaHelperA(lpProcessInformation->dwProcessId,\n                                 lpDllName,\n                                 pfCreateProcessA)) {\n\n        TerminateProcess(lpProcessInformation->hProcess, ~0u);\n        CloseHandle(lpProcessInformation->hProcess);\n        CloseHandle(lpProcessInformation->hThread);\n        return FALSE;\n    }\n\n    if (!(dwCreationFlags & CREATE_SUSPENDED)) {\n        ResumeThread(lpProcessInformation->hThread);\n    }\n\n    if (lpProcessInformation == &backup) {\n        CloseHandle(lpProcessInformation->hProcess);\n        CloseHandle(lpProcessInformation->hThread);\n    }\n\n    return TRUE;\n}\n\nBOOL WINAPI DetourCreateProcessWithDllExW(_In_opt_ LPCWSTR lpApplicationName,\n                                          _Inout_opt_  LPWSTR lpCommandLine,\n                                          _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                          _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                          _In_ BOOL bInheritHandles,\n                                          _In_ DWORD dwCreationFlags,\n                                          _In_opt_ LPVOID lpEnvironment,\n                                          _In_opt_ LPCWSTR lpCurrentDirectory,\n                                          _In_ LPSTARTUPINFOW lpStartupInfo,\n                                          _Out_ LPPROCESS_INFORMATION lpProcessInformation,\n                                          _In_ LPCSTR lpDllName,\n                                          _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEW pfCreateProcessW)\n{\n    if (pfCreateProcessW == NULL) {\n        pfCreateProcessW = CreateProcessW;\n    }\n\n    PROCESS_INFORMATION backup;\n    if (lpProcessInformation == NULL) {\n        lpProcessInformation = &backup;\n        ZeroMemory(&backup, sizeof(backup));\n    }\n\n    if (!pfCreateProcessW(lpApplicationName,\n                          lpCommandLine,\n                          lpProcessAttributes,\n                          lpThreadAttributes,\n                          bInheritHandles,\n                          dwCreationFlags | CREATE_SUSPENDED,\n                          lpEnvironment,\n                          lpCurrentDirectory,\n                          lpStartupInfo,\n                          lpProcessInformation)) {\n        return FALSE;\n    }\n\n\n    LPCSTR sz = lpDllName;\n\n    if (!DetourUpdateProcessWithDll(lpProcessInformation->hProcess, &sz, 1) &&\n        !DetourProcessViaHelperW(lpProcessInformation->dwProcessId,\n                                 lpDllName,\n                                 pfCreateProcessW)) {\n\n        TerminateProcess(lpProcessInformation->hProcess, ~0u);\n        CloseHandle(lpProcessInformation->hProcess);\n        CloseHandle(lpProcessInformation->hThread);\n        return FALSE;\n    }\n\n    if (!(dwCreationFlags & CREATE_SUSPENDED)) {\n        ResumeThread(lpProcessInformation->hThread);\n    }\n\n    if (lpProcessInformation == &backup) {\n        CloseHandle(lpProcessInformation->hProcess);\n        CloseHandle(lpProcessInformation->hThread);\n    }\n    return TRUE;\n}\n\nBOOL WINAPI DetourCreateProcessWithDllsA(_In_opt_ LPCSTR lpApplicationName,\n                                         _Inout_opt_ LPSTR lpCommandLine,\n                                         _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                         _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                         _In_ BOOL bInheritHandles,\n                                         _In_ DWORD dwCreationFlags,\n                                         _In_opt_ LPVOID lpEnvironment,\n                                         _In_opt_ LPCSTR lpCurrentDirectory,\n                                         _In_ LPSTARTUPINFOA lpStartupInfo,\n                                         _Out_ LPPROCESS_INFORMATION lpProcessInformation,\n                                         _In_ DWORD nDlls,\n                                         _In_reads_(nDlls) LPCSTR *rlpDlls,\n                                         _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEA pfCreateProcessA)\n{\n    if (pfCreateProcessA == NULL) {\n        pfCreateProcessA = CreateProcessA;\n    }\n\n    PROCESS_INFORMATION backup;\n    if (lpProcessInformation == NULL) {\n        lpProcessInformation = &backup;\n        ZeroMemory(&backup, sizeof(backup));\n    }\n\n    if (!pfCreateProcessA(lpApplicationName,\n                          lpCommandLine,\n                          lpProcessAttributes,\n                          lpThreadAttributes,\n                          bInheritHandles,\n                          dwCreationFlags | CREATE_SUSPENDED,\n                          lpEnvironment,\n                          lpCurrentDirectory,\n                          lpStartupInfo,\n                          lpProcessInformation)) {\n        return FALSE;\n    }\n\n    if (!DetourUpdateProcessWithDll(lpProcessInformation->hProcess, rlpDlls, nDlls) &&\n        !DetourProcessViaHelperDllsA(lpProcessInformation->dwProcessId,\n                                     nDlls,\n                                     rlpDlls,\n                                     pfCreateProcessA)) {\n\n        TerminateProcess(lpProcessInformation->hProcess, ~0u);\n        CloseHandle(lpProcessInformation->hProcess);\n        CloseHandle(lpProcessInformation->hThread);\n        return FALSE;\n    }\n\n    if (!(dwCreationFlags & CREATE_SUSPENDED)) {\n        ResumeThread(lpProcessInformation->hThread);\n    }\n\n    if (lpProcessInformation == &backup) {\n        CloseHandle(lpProcessInformation->hProcess);\n        CloseHandle(lpProcessInformation->hThread);\n    }\n\n    return TRUE;\n}\n\nBOOL WINAPI DetourCreateProcessWithDllsW(_In_opt_ LPCWSTR lpApplicationName,\n                                         _Inout_opt_ LPWSTR lpCommandLine,\n                                         _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                         _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                         _In_ BOOL bInheritHandles,\n                                         _In_ DWORD dwCreationFlags,\n                                         _In_opt_ LPVOID lpEnvironment,\n                                         _In_opt_ LPCWSTR lpCurrentDirectory,\n                                         _In_ LPSTARTUPINFOW lpStartupInfo,\n                                         _Out_ LPPROCESS_INFORMATION lpProcessInformation,\n                                         _In_ DWORD nDlls,\n                                         _In_reads_(nDlls) LPCSTR *rlpDlls,\n                                         _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEW pfCreateProcessW)\n{\n    if (pfCreateProcessW == NULL) {\n        pfCreateProcessW = CreateProcessW;\n    }\n\n    PROCESS_INFORMATION backup;\n    if (lpProcessInformation == NULL) {\n        lpProcessInformation = &backup;\n        ZeroMemory(&backup, sizeof(backup));\n    }\n\n    if (!pfCreateProcessW(lpApplicationName,\n                          lpCommandLine,\n                          lpProcessAttributes,\n                          lpThreadAttributes,\n                          bInheritHandles,\n                          dwCreationFlags | CREATE_SUSPENDED,\n                          lpEnvironment,\n                          lpCurrentDirectory,\n                          lpStartupInfo,\n                          lpProcessInformation)) {\n        return FALSE;\n    }\n\n\n    if (!DetourUpdateProcessWithDll(lpProcessInformation->hProcess, rlpDlls, nDlls) &&\n        !DetourProcessViaHelperDllsW(lpProcessInformation->dwProcessId,\n                                     nDlls,\n                                     rlpDlls,\n                                     pfCreateProcessW)) {\n\n        TerminateProcess(lpProcessInformation->hProcess, ~0u);\n        CloseHandle(lpProcessInformation->hProcess);\n        CloseHandle(lpProcessInformation->hThread);\n        return FALSE;\n    }\n\n    if (!(dwCreationFlags & CREATE_SUSPENDED)) {\n        ResumeThread(lpProcessInformation->hThread);\n    }\n\n    if (lpProcessInformation == &backup) {\n        CloseHandle(lpProcessInformation->hProcess);\n        CloseHandle(lpProcessInformation->hThread);\n    }\n    return TRUE;\n}\n\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/src/detours.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Core Detours Functionality (detours.cpp of detours.lib)\n//\n//  Microsoft Research Detours Package, Version 4.0.1\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n\n//#define DETOUR_DEBUG 1\n#define DETOURS_INTERNAL\n#include \"detours.h\"\n\n#if DETOURS_VERSION != 0x4c0c1   // 0xMAJORcMINORcPATCH\n#error detours.h version mismatch\n#endif\n\n#define NOTHROW\n\n//////////////////////////////////////////////////////////////////////////////\n//\nstruct _DETOUR_ALIGN\n{\n    BYTE    obTarget        : 3;\n    BYTE    obTrampoline    : 5;\n};\n\nC_ASSERT(sizeof(_DETOUR_ALIGN) == 1);\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// Region reserved for system DLLs, which cannot be used for trampolines.\n//\nstatic PVOID    s_pSystemRegionLowerBound   = (PVOID)(ULONG_PTR)0x70000000;\nstatic PVOID    s_pSystemRegionUpperBound   = (PVOID)(ULONG_PTR)0x80000000;\n\n//////////////////////////////////////////////////////////////////////////////\n//\nstatic bool detour_is_imported(PBYTE pbCode, PBYTE pbAddress)\n{\n    MEMORY_BASIC_INFORMATION mbi;\n    VirtualQuery((PVOID)pbCode, &mbi, sizeof(mbi));\n    __try {\n        PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)mbi.AllocationBase;\n        if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) {\n            return false;\n        }\n\n        PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)((PBYTE)pDosHeader +\n                                                          pDosHeader->e_lfanew);\n        if (pNtHeader->Signature != IMAGE_NT_SIGNATURE) {\n            return false;\n        }\n\n        if (pbAddress >= ((PBYTE)pDosHeader +\n                          pNtHeader->OptionalHeader\n                          .DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress) &&\n            pbAddress < ((PBYTE)pDosHeader +\n                         pNtHeader->OptionalHeader\n                         .DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress +\n                         pNtHeader->OptionalHeader\n                         .DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].Size)) {\n            return true;\n        }\n    }\n#pragma prefast(suppress:28940, \"A bad pointer means this probably isn't a PE header.\")\n    __except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?\n             EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {\n        return false;\n    }\n    return false;\n}\n\ninline ULONG_PTR detour_2gb_below(ULONG_PTR address)\n{\n    return (address > (ULONG_PTR)0x7ff80000) ? address - 0x7ff80000 : 0x80000;\n}\n\ninline ULONG_PTR detour_2gb_above(ULONG_PTR address)\n{\n#if defined(DETOURS_64BIT)\n    return (address < (ULONG_PTR)0xffffffff80000000) ? address + 0x7ff80000 : (ULONG_PTR)0xfffffffffff80000;\n#else\n    return (address < (ULONG_PTR)0x80000000) ? address + 0x7ff80000 : (ULONG_PTR)0xfff80000;\n#endif\n}\n\n///////////////////////////////////////////////////////////////////////// X86.\n//\n#ifdef DETOURS_X86\n\nstruct _DETOUR_TRAMPOLINE\n{\n    BYTE            rbCode[30];     // target code + jmp to pbRemain\n    BYTE            cbCode;         // size of moved target code.\n    BYTE            cbCodeBreak;    // padding to make debugging easier.\n    BYTE            rbRestore[22];  // original target code.\n    BYTE            cbRestore;      // size of original target code.\n    BYTE            cbRestoreBreak; // padding to make debugging easier.\n    _DETOUR_ALIGN   rAlign[8];      // instruction alignment array.\n    PBYTE           pbRemain;       // first instruction after moved code. [free list]\n    PBYTE           pbDetour;       // first instruction of detour function.\n};\n\nC_ASSERT(sizeof(_DETOUR_TRAMPOLINE) == 72);\n\nenum {\n    SIZE_OF_JMP = 5\n};\n\ninline PBYTE detour_gen_jmp_immediate(PBYTE pbCode, PBYTE pbJmpVal)\n{\n    PBYTE pbJmpSrc = pbCode + 5;\n    *pbCode++ = 0xE9;   // jmp +imm32\n    *((INT32*&)pbCode)++ = (INT32)(pbJmpVal - pbJmpSrc);\n    return pbCode;\n}\n\ninline PBYTE detour_gen_jmp_indirect(PBYTE pbCode, PBYTE *ppbJmpVal)\n{\n    *pbCode++ = 0xff;   // jmp [+imm32]\n    *pbCode++ = 0x25;\n    *((INT32*&)pbCode)++ = (INT32)((PBYTE)ppbJmpVal);\n    return pbCode;\n}\n\ninline PBYTE detour_gen_brk(PBYTE pbCode, PBYTE pbLimit)\n{\n    while (pbCode < pbLimit) {\n        *pbCode++ = 0xcc;   // brk;\n    }\n    return pbCode;\n}\n\ninline PBYTE detour_skip_jmp(PBYTE pbCode, PVOID *ppGlobals)\n{\n    if (pbCode == NULL) {\n        return NULL;\n    }\n    if (ppGlobals != NULL) {\n        *ppGlobals = NULL;\n    }\n\n    // First, skip over the import vector if there is one.\n    if (pbCode[0] == 0xff && pbCode[1] == 0x25) {   // jmp [imm32]\n        // Looks like an import alias jump, then get the code it points to.\n        PBYTE pbTarget = *(UNALIGNED PBYTE *)&pbCode[2];\n        if (detour_is_imported(pbCode, pbTarget)) {\n            PBYTE pbNew = *(UNALIGNED PBYTE *)pbTarget;\n            DETOUR_TRACE((\"%p->%p: skipped over import table.\\n\", pbCode, pbNew));\n            pbCode = pbNew;\n        }\n    }\n\n    // Then, skip over a patch jump\n    if (pbCode[0] == 0xeb) {   // jmp +imm8\n        PBYTE pbNew = pbCode + 2 + *(CHAR *)&pbCode[1];\n        DETOUR_TRACE((\"%p->%p: skipped over short jump.\\n\", pbCode, pbNew));\n        pbCode = pbNew;\n\n        // First, skip over the import vector if there is one.\n        if (pbCode[0] == 0xff && pbCode[1] == 0x25) {   // jmp [imm32]\n            // Looks like an import alias jump, then get the code it points to.\n            PBYTE pbTarget = *(UNALIGNED PBYTE *)&pbCode[2];\n            if (detour_is_imported(pbCode, pbTarget)) {\n                pbNew = *(UNALIGNED PBYTE *)pbTarget;\n                DETOUR_TRACE((\"%p->%p: skipped over import table.\\n\", pbCode, pbNew));\n                pbCode = pbNew;\n            }\n        }\n        // Finally, skip over a long jump if it is the target of the patch jump.\n        else if (pbCode[0] == 0xe9) {   // jmp +imm32\n            pbNew = pbCode + 5 + *(UNALIGNED INT32 *)&pbCode[1];\n            DETOUR_TRACE((\"%p->%p: skipped over long jump.\\n\", pbCode, pbNew));\n            pbCode = pbNew;\n        }\n    }\n    return pbCode;\n}\n\ninline void detour_find_jmp_bounds(PBYTE pbCode,\n                                   PDETOUR_TRAMPOLINE *ppLower,\n                                   PDETOUR_TRAMPOLINE *ppUpper)\n{\n    // We have to place trampolines within +/- 2GB of code.\n    ULONG_PTR lo = detour_2gb_below((ULONG_PTR)pbCode);\n    ULONG_PTR hi = detour_2gb_above((ULONG_PTR)pbCode);\n    DETOUR_TRACE((\"[%p..%p..%p]\\n\", lo, pbCode, hi));\n\n    // And, within +/- 2GB of relative jmp targets.\n    if (pbCode[0] == 0xe9) {   // jmp +imm32\n        PBYTE pbNew = pbCode + 5 + *(UNALIGNED INT32 *)&pbCode[1];\n\n        if (pbNew < pbCode) {\n            hi = detour_2gb_above((ULONG_PTR)pbNew);\n        }\n        else {\n            lo = detour_2gb_below((ULONG_PTR)pbNew);\n        }\n        DETOUR_TRACE((\"[%p..%p..%p] +imm32\\n\", lo, pbCode, hi));\n    }\n\n    *ppLower = (PDETOUR_TRAMPOLINE)lo;\n    *ppUpper = (PDETOUR_TRAMPOLINE)hi;\n}\n\ninline BOOL detour_does_code_end_function(PBYTE pbCode)\n{\n    if (pbCode[0] == 0xeb ||    // jmp +imm8\n        pbCode[0] == 0xe9 ||    // jmp +imm32\n        pbCode[0] == 0xe0 ||    // jmp eax\n        pbCode[0] == 0xc2 ||    // ret +imm8\n        pbCode[0] == 0xc3 ||    // ret\n        pbCode[0] == 0xcc) {    // brk\n        return TRUE;\n    }\n    else if (pbCode[0] == 0xf3 && pbCode[1] == 0xc3) {  // rep ret\n        return TRUE;\n    }\n    else if (pbCode[0] == 0xff && pbCode[1] == 0x25) {  // jmp [+imm32]\n        return TRUE;\n    }\n    else if ((pbCode[0] == 0x26 ||      // jmp es:\n              pbCode[0] == 0x2e ||      // jmp cs:\n              pbCode[0] == 0x36 ||      // jmp ss:\n              pbCode[0] == 0x3e ||      // jmp ds:\n              pbCode[0] == 0x64 ||      // jmp fs:\n              pbCode[0] == 0x65) &&     // jmp gs:\n             pbCode[1] == 0xff &&       // jmp [+imm32]\n             pbCode[2] == 0x25) {\n        return TRUE;\n    }\n    return FALSE;\n}\n\ninline ULONG detour_is_code_filler(PBYTE pbCode)\n{\n    // 1-byte through 11-byte NOPs.\n    if (pbCode[0] == 0x90) {\n        return 1;\n    }\n    if (pbCode[0] == 0x66 && pbCode[1] == 0x90) {\n        return 2;\n    }\n    if (pbCode[0] == 0x0F && pbCode[1] == 0x1F && pbCode[2] == 0x00) {\n        return 3;\n    }\n    if (pbCode[0] == 0x0F && pbCode[1] == 0x1F && pbCode[2] == 0x40 &&\n        pbCode[3] == 0x00) {\n        return 4;\n    }\n    if (pbCode[0] == 0x0F && pbCode[1] == 0x1F && pbCode[2] == 0x44 &&\n        pbCode[3] == 0x00 && pbCode[4] == 0x00) {\n        return 5;\n    }\n    if (pbCode[0] == 0x66 && pbCode[1] == 0x0F && pbCode[2] == 0x1F &&\n        pbCode[3] == 0x44 && pbCode[4] == 0x00 && pbCode[5] == 0x00) {\n        return 6;\n    }\n    if (pbCode[0] == 0x0F && pbCode[1] == 0x1F && pbCode[2] == 0x80 &&\n        pbCode[3] == 0x00 && pbCode[4] == 0x00 && pbCode[5] == 0x00 &&\n        pbCode[6] == 0x00) {\n        return 7;\n    }\n    if (pbCode[0] == 0x0F && pbCode[1] == 0x1F && pbCode[2] == 0x84 &&\n        pbCode[3] == 0x00 && pbCode[4] == 0x00 && pbCode[5] == 0x00 &&\n        pbCode[6] == 0x00 && pbCode[7] == 0x00) {\n        return 8;\n    }\n    if (pbCode[0] == 0x66 && pbCode[1] == 0x0F && pbCode[2] == 0x1F &&\n        pbCode[3] == 0x84 && pbCode[4] == 0x00 && pbCode[5] == 0x00 &&\n        pbCode[6] == 0x00 && pbCode[7] == 0x00 && pbCode[8] == 0x00) {\n        return 9;\n    }\n    if (pbCode[0] == 0x66 && pbCode[1] == 0x66 && pbCode[2] == 0x0F &&\n        pbCode[3] == 0x1F && pbCode[4] == 0x84 && pbCode[5] == 0x00 &&\n        pbCode[6] == 0x00 && pbCode[7] == 0x00 && pbCode[8] == 0x00 &&\n        pbCode[9] == 0x00) {\n        return 10;\n    }\n    if (pbCode[0] == 0x66 && pbCode[1] == 0x66 && pbCode[2] == 0x66 &&\n        pbCode[3] == 0x0F && pbCode[4] == 0x1F && pbCode[5] == 0x84 &&\n        pbCode[6] == 0x00 && pbCode[7] == 0x00 && pbCode[8] == 0x00 &&\n        pbCode[9] == 0x00 && pbCode[10] == 0x00) {\n        return 11;\n    }\n\n    // int 3.\n    if (pbCode[0] == 0xcc) {\n        return 1;\n    }\n    return 0;\n}\n\n#endif // DETOURS_X86\n\n///////////////////////////////////////////////////////////////////////// X64.\n//\n#ifdef DETOURS_X64\n\nstruct _DETOUR_TRAMPOLINE\n{\n    // An X64 instuction can be 15 bytes long.\n    // In practice 11 seems to be the limit.\n    BYTE            rbCode[30];     // target code + jmp to pbRemain.\n    BYTE            cbCode;         // size of moved target code.\n    BYTE            cbCodeBreak;    // padding to make debugging easier.\n    BYTE            rbRestore[30];  // original target code.\n    BYTE            cbRestore;      // size of original target code.\n    BYTE            cbRestoreBreak; // padding to make debugging easier.\n    _DETOUR_ALIGN   rAlign[8];      // instruction alignment array.\n    PBYTE           pbRemain;       // first instruction after moved code. [free list]\n    PBYTE           pbDetour;       // first instruction of detour function.\n    BYTE            rbCodeIn[8];    // jmp [pbDetour]\n};\n\nC_ASSERT(sizeof(_DETOUR_TRAMPOLINE) == 96);\n\nenum {\n    SIZE_OF_JMP = 5\n};\n\ninline PBYTE detour_gen_jmp_immediate(PBYTE pbCode, PBYTE pbJmpVal)\n{\n    PBYTE pbJmpSrc = pbCode + 5;\n    *pbCode++ = 0xE9;   // jmp +imm32\n    *((INT32*&)pbCode)++ = (INT32)(pbJmpVal - pbJmpSrc);\n    return pbCode;\n}\n\ninline PBYTE detour_gen_jmp_indirect(PBYTE pbCode, PBYTE *ppbJmpVal)\n{\n    PBYTE pbJmpSrc = pbCode + 6;\n    *pbCode++ = 0xff;   // jmp [+imm32]\n    *pbCode++ = 0x25;\n    *((INT32*&)pbCode)++ = (INT32)((PBYTE)ppbJmpVal - pbJmpSrc);\n    return pbCode;\n}\n\ninline PBYTE detour_gen_brk(PBYTE pbCode, PBYTE pbLimit)\n{\n    while (pbCode < pbLimit) {\n        *pbCode++ = 0xcc;   // brk;\n    }\n    return pbCode;\n}\n\ninline PBYTE detour_skip_jmp(PBYTE pbCode, PVOID *ppGlobals)\n{\n    if (pbCode == NULL) {\n        return NULL;\n    }\n    if (ppGlobals != NULL) {\n        *ppGlobals = NULL;\n    }\n\n    // First, skip over the import vector if there is one.\n    if (pbCode[0] == 0xff && pbCode[1] == 0x25) {   // jmp [+imm32]\n        // Looks like an import alias jump, then get the code it points to.\n        PBYTE pbTarget = pbCode + 6 + *(UNALIGNED INT32 *)&pbCode[2];\n        if (detour_is_imported(pbCode, pbTarget)) {\n            PBYTE pbNew = *(UNALIGNED PBYTE *)pbTarget;\n            DETOUR_TRACE((\"%p->%p: skipped over import table.\\n\", pbCode, pbNew));\n            pbCode = pbNew;\n        }\n    }\n\n    // Then, skip over a patch jump\n    if (pbCode[0] == 0xeb) {   // jmp +imm8\n        PBYTE pbNew = pbCode + 2 + *(CHAR *)&pbCode[1];\n        DETOUR_TRACE((\"%p->%p: skipped over short jump.\\n\", pbCode, pbNew));\n        pbCode = pbNew;\n\n        // First, skip over the import vector if there is one.\n        if (pbCode[0] == 0xff && pbCode[1] == 0x25) {   // jmp [+imm32]\n            // Looks like an import alias jump, then get the code it points to.\n            PBYTE pbTarget = pbCode + 6 + *(UNALIGNED INT32 *)&pbCode[2];\n            if (detour_is_imported(pbCode, pbTarget)) {\n                pbNew = *(UNALIGNED PBYTE *)pbTarget;\n                DETOUR_TRACE((\"%p->%p: skipped over import table.\\n\", pbCode, pbNew));\n                pbCode = pbNew;\n            }\n        }\n        // Finally, skip over a long jump if it is the target of the patch jump.\n        else if (pbCode[0] == 0xe9) {   // jmp +imm32\n            pbNew = pbCode + 5 + *(UNALIGNED INT32 *)&pbCode[1];\n            DETOUR_TRACE((\"%p->%p: skipped over long jump.\\n\", pbCode, pbNew));\n            pbCode = pbNew;\n        }\n    }\n    return pbCode;\n}\n\ninline void detour_find_jmp_bounds(PBYTE pbCode,\n                                   PDETOUR_TRAMPOLINE *ppLower,\n                                   PDETOUR_TRAMPOLINE *ppUpper)\n{\n    // We have to place trampolines within +/- 2GB of code.\n    ULONG_PTR lo = detour_2gb_below((ULONG_PTR)pbCode);\n    ULONG_PTR hi = detour_2gb_above((ULONG_PTR)pbCode);\n    DETOUR_TRACE((\"[%p..%p..%p]\\n\", lo, pbCode, hi));\n\n    // And, within +/- 2GB of relative jmp vectors.\n    if (pbCode[0] == 0xff && pbCode[1] == 0x25) {   // jmp [+imm32]\n        PBYTE pbNew = pbCode + 6 + *(UNALIGNED INT32 *)&pbCode[2];\n\n        if (pbNew < pbCode) {\n            hi = detour_2gb_above((ULONG_PTR)pbNew);\n        }\n        else {\n            lo = detour_2gb_below((ULONG_PTR)pbNew);\n        }\n        DETOUR_TRACE((\"[%p..%p..%p] [+imm32]\\n\", lo, pbCode, hi));\n    }\n    // And, within +/- 2GB of relative jmp targets.\n    else if (pbCode[0] == 0xe9) {   // jmp +imm32\n        PBYTE pbNew = pbCode + 5 + *(UNALIGNED INT32 *)&pbCode[1];\n\n        if (pbNew < pbCode) {\n            hi = detour_2gb_above((ULONG_PTR)pbNew);\n        }\n        else {\n            lo = detour_2gb_below((ULONG_PTR)pbNew);\n        }\n        DETOUR_TRACE((\"[%p..%p..%p] +imm32\\n\", lo, pbCode, hi));\n    }\n\n    *ppLower = (PDETOUR_TRAMPOLINE)lo;\n    *ppUpper = (PDETOUR_TRAMPOLINE)hi;\n}\n\ninline BOOL detour_does_code_end_function(PBYTE pbCode)\n{\n    if (pbCode[0] == 0xeb ||    // jmp +imm8\n        pbCode[0] == 0xe9 ||    // jmp +imm32\n        pbCode[0] == 0xe0 ||    // jmp eax\n        pbCode[0] == 0xc2 ||    // ret +imm8\n        pbCode[0] == 0xc3 ||    // ret\n        pbCode[0] == 0xcc) {    // brk\n        return TRUE;\n    }\n    else if (pbCode[0] == 0xf3 && pbCode[1] == 0xc3) {  // rep ret\n        return TRUE;\n    }\n    else if (pbCode[0] == 0xff && pbCode[1] == 0x25) {  // jmp [+imm32]\n        return TRUE;\n    }\n    else if ((pbCode[0] == 0x26 ||      // jmp es:\n              pbCode[0] == 0x2e ||      // jmp cs:\n              pbCode[0] == 0x36 ||      // jmp ss:\n              pbCode[0] == 0x3e ||      // jmp ds:\n              pbCode[0] == 0x64 ||      // jmp fs:\n              pbCode[0] == 0x65) &&     // jmp gs:\n             pbCode[1] == 0xff &&       // jmp [+imm32]\n             pbCode[2] == 0x25) {\n        return TRUE;\n    }\n    return FALSE;\n}\n\ninline ULONG detour_is_code_filler(PBYTE pbCode)\n{\n    // 1-byte through 11-byte NOPs.\n    if (pbCode[0] == 0x90) {\n        return 1;\n    }\n    if (pbCode[0] == 0x66 && pbCode[1] == 0x90) {\n        return 2;\n    }\n    if (pbCode[0] == 0x0F && pbCode[1] == 0x1F && pbCode[2] == 0x00) {\n        return 3;\n    }\n    if (pbCode[0] == 0x0F && pbCode[1] == 0x1F && pbCode[2] == 0x40 &&\n        pbCode[3] == 0x00) {\n        return 4;\n    }\n    if (pbCode[0] == 0x0F && pbCode[1] == 0x1F && pbCode[2] == 0x44 &&\n        pbCode[3] == 0x00 && pbCode[4] == 0x00) {\n        return 5;\n    }\n    if (pbCode[0] == 0x66 && pbCode[1] == 0x0F && pbCode[2] == 0x1F &&\n        pbCode[3] == 0x44 && pbCode[4] == 0x00 && pbCode[5] == 0x00) {\n        return 6;\n    }\n    if (pbCode[0] == 0x0F && pbCode[1] == 0x1F && pbCode[2] == 0x80 &&\n        pbCode[3] == 0x00 && pbCode[4] == 0x00 && pbCode[5] == 0x00 &&\n        pbCode[6] == 0x00) {\n        return 7;\n    }\n    if (pbCode[0] == 0x0F && pbCode[1] == 0x1F && pbCode[2] == 0x84 &&\n        pbCode[3] == 0x00 && pbCode[4] == 0x00 && pbCode[5] == 0x00 &&\n        pbCode[6] == 0x00 && pbCode[7] == 0x00) {\n        return 8;\n    }\n    if (pbCode[0] == 0x66 && pbCode[1] == 0x0F && pbCode[2] == 0x1F &&\n        pbCode[3] == 0x84 && pbCode[4] == 0x00 && pbCode[5] == 0x00 &&\n        pbCode[6] == 0x00 && pbCode[7] == 0x00 && pbCode[8] == 0x00) {\n        return 9;\n    }\n    if (pbCode[0] == 0x66 && pbCode[1] == 0x66 && pbCode[2] == 0x0F &&\n        pbCode[3] == 0x1F && pbCode[4] == 0x84 && pbCode[5] == 0x00 &&\n        pbCode[6] == 0x00 && pbCode[7] == 0x00 && pbCode[8] == 0x00 &&\n        pbCode[9] == 0x00) {\n        return 10;\n    }\n    if (pbCode[0] == 0x66 && pbCode[1] == 0x66 && pbCode[2] == 0x66 &&\n        pbCode[3] == 0x0F && pbCode[4] == 0x1F && pbCode[5] == 0x84 &&\n        pbCode[6] == 0x00 && pbCode[7] == 0x00 && pbCode[8] == 0x00 &&\n        pbCode[9] == 0x00 && pbCode[10] == 0x00) {\n        return 11;\n    }\n\n    // int 3.\n    if (pbCode[0] == 0xcc) {\n        return 1;\n    }\n    return 0;\n}\n\n#endif // DETOURS_X64\n\n//////////////////////////////////////////////////////////////////////// IA64.\n//\n#ifdef DETOURS_IA64\n\nstruct _DETOUR_TRAMPOLINE\n{\n    // On the IA64, a trampoline is used for both incoming and outgoing calls.\n    //\n    // The trampoline contains the following bundles for the outgoing call:\n    //      movl gp=target_gp;\n    //      <relocated target bundle>\n    //      brl  target_code;\n    //\n    // The trampoline contains the following bundles for the incoming call:\n    //      alloc  r41=ar.pfs, b, 0, 8, 0\n    //      mov    r40=rp\n    //\n    //      adds   r50=0, r39\n    //      adds   r49=0, r38\n    //      adds   r48=0, r37 ;;\n    //\n    //      adds   r47=0, r36\n    //      adds   r46=0, r35\n    //      adds   r45=0, r34\n    //\n    //      adds   r44=0, r33\n    //      adds   r43=0, r32\n    //      adds   r42=0, gp ;;\n    //\n    //      movl   gp=ffffffff`ffffffff ;;\n    //\n    //      brl.call.sptk.few rp=disas!TestCodes+20e0 (00000000`00404ea0) ;;\n    //\n    //      adds   gp=0, r42\n    //      mov    rp=r40, +0 ;;\n    //      mov.i  ar.pfs=r41\n    //\n    //      br.ret.sptk.many rp ;;\n    //\n    // This way, we only have to relocate a single bundle.\n    //\n    // The complicated incoming trampoline is required because we have to\n    // create an additional stack frame so that we save and restore the gp.\n    // We must do this because gp is a caller-saved register, but not saved\n    // if the caller thinks the target is in the same DLL, which changes\n    // when we insert a detour.\n    //\n    DETOUR_IA64_BUNDLE  bMovlTargetGp;  // Bundle which sets target GP\n    BYTE                rbCode[sizeof(DETOUR_IA64_BUNDLE)]; // moved bundle.\n    DETOUR_IA64_BUNDLE  bBrlRemainEip;  // Brl to pbRemain\n    // This must be adjacent to bBranchIslands.\n\n    // Each instruction in the moved bundle could be a IP-relative chk or branch or call.\n    // Any such instructions are changed to point to a brl in bBranchIslands.\n    // This must be adjacent to bBrlRemainEip -- see \"pbPool\".\n    DETOUR_IA64_BUNDLE bBranchIslands[DETOUR_IA64_INSTRUCTIONS_PER_BUNDLE];\n\n    // Target of brl inserted in target function\n    DETOUR_IA64_BUNDLE  bAllocFrame;    // alloc frame\n    DETOUR_IA64_BUNDLE  bSave37to39;    // save r37, r38, r39.\n    DETOUR_IA64_BUNDLE  bSave34to36;    // save r34, r35, r36.\n    DETOUR_IA64_BUNDLE  bSaveGPto33;    // save gp, r32, r33.\n    DETOUR_IA64_BUNDLE  bMovlDetourGp;  // set detour GP.\n    DETOUR_IA64_BUNDLE  bCallDetour;    // call detour.\n    DETOUR_IA64_BUNDLE  bPopFrameGp;    // pop frame and restore gp.\n    DETOUR_IA64_BUNDLE  bReturn;        // return to caller.\n\n    PLABEL_DESCRIPTOR   pldTrampoline;\n\n    BYTE                rbRestore[sizeof(DETOUR_IA64_BUNDLE)]; // original target bundle.\n    BYTE                cbRestore;      // size of original target code.\n    BYTE                cbCode;         // size of moved target code.\n    _DETOUR_ALIGN       rAlign[14];     // instruction alignment array.\n    PBYTE               pbRemain;       // first instruction after moved code. [free list]\n    PBYTE               pbDetour;       // first instruction of detour function.\n    PPLABEL_DESCRIPTOR  ppldDetour;     // [pbDetour,gpDetour]\n    PPLABEL_DESCRIPTOR  ppldTarget;     // [pbTarget,gpDetour]\n};\n\nC_ASSERT(sizeof(DETOUR_IA64_BUNDLE) == 16);\nC_ASSERT(sizeof(_DETOUR_TRAMPOLINE) == 256 + DETOUR_IA64_INSTRUCTIONS_PER_BUNDLE * 16);\n\nenum {\n    SIZE_OF_JMP = sizeof(DETOUR_IA64_BUNDLE)\n};\n\ninline PBYTE detour_skip_jmp(PBYTE pPointer, PVOID *ppGlobals)\n{\n    PBYTE pGlobals = NULL;\n    PBYTE pbCode = NULL;\n\n    if (pPointer != NULL) {\n        PPLABEL_DESCRIPTOR ppld = (PPLABEL_DESCRIPTOR)pPointer;\n        pbCode = (PBYTE)ppld->EntryPoint;\n        pGlobals = (PBYTE)ppld->GlobalPointer;\n    }\n    if (ppGlobals != NULL) {\n        *ppGlobals = pGlobals;\n    }\n    if (pbCode == NULL) {\n        return NULL;\n    }\n\n    DETOUR_IA64_BUNDLE *pb = (DETOUR_IA64_BUNDLE *)pbCode;\n\n    // IA64 Local Import Jumps look like:\n    //      addl   r2=ffffffff`ffe021c0, gp ;;\n    //      ld8    r2=[r2]\n    //      nop.i  0 ;;\n    //\n    //      ld8    r3=[r2], 8 ;;\n    //      ld8    gp=[r2]\n    //      mov    b6=r3, +0\n    //\n    //      nop.m  0\n    //      nop.i  0\n    //      br.cond.sptk.few b6\n    //\n\n    //                     002024000200100b\n    if ((pb[0].wide[0] & 0xfffffc000603ffff) == 0x002024000200100b &&\n        pb[0].wide[1] == 0x0004000000203008 &&\n        pb[1].wide[0] == 0x001014180420180a &&\n        pb[1].wide[1] == 0x07000830c0203008 &&\n        pb[2].wide[0] == 0x0000000100000010 &&\n        pb[2].wide[1] == 0x0080006000000200) {\n\n        ULONG64 offset =\n            ((pb[0].wide[0] & 0x0000000001fc0000) >> 18) |  // imm7b\n            ((pb[0].wide[0] & 0x000001ff00000000) >> 25) |  // imm9d\n            ((pb[0].wide[0] & 0x00000000f8000000) >> 11);   // imm5c\n        if (pb[0].wide[0] & 0x0000020000000000) {           // sign\n            offset |= 0xffffffffffe00000;\n        }\n        PBYTE pbTarget = pGlobals + offset;\n        DETOUR_TRACE((\"%p: potential import jump, target=%p\\n\", pb, pbTarget));\n\n        if (detour_is_imported(pbCode, pbTarget) && *(PBYTE*)pbTarget != NULL) {\n            DETOUR_TRACE((\"%p: is import jump, label=%p\\n\", pb, *(PBYTE *)pbTarget));\n\n            PPLABEL_DESCRIPTOR ppld = (PPLABEL_DESCRIPTOR)*(PBYTE *)pbTarget;\n            pbCode = (PBYTE)ppld->EntryPoint;\n            pGlobals = (PBYTE)ppld->GlobalPointer;\n            if (ppGlobals != NULL) {\n                *ppGlobals = pGlobals;\n            }\n        }\n    }\n    return pbCode;\n}\n\n\ninline void detour_find_jmp_bounds(PBYTE pbCode,\n                                   PDETOUR_TRAMPOLINE *ppLower,\n                                   PDETOUR_TRAMPOLINE *ppUpper)\n{\n    (void)pbCode;\n    *ppLower = (PDETOUR_TRAMPOLINE)(ULONG_PTR)0x0000000000080000;\n    *ppUpper = (PDETOUR_TRAMPOLINE)(ULONG_PTR)0xfffffffffff80000;\n}\n\ninline BOOL detour_does_code_end_function(PBYTE pbCode)\n{\n    // Routine not needed on IA64.\n    (void)pbCode;\n    return FALSE;\n}\n\ninline ULONG detour_is_code_filler(PBYTE pbCode)\n{\n    // Routine not needed on IA64.\n    (void)pbCode;\n    return 0;\n}\n\n#endif // DETOURS_IA64\n\n#ifdef DETOURS_ARM\n\nstruct _DETOUR_TRAMPOLINE\n{\n    // A Thumb-2 instruction can be 2 or 4 bytes long.\n    BYTE            rbCode[62];     // target code + jmp to pbRemain\n    BYTE            cbCode;         // size of moved target code.\n    BYTE            cbCodeBreak;    // padding to make debugging easier.\n    BYTE            rbRestore[22];  // original target code.\n    BYTE            cbRestore;      // size of original target code.\n    BYTE            cbRestoreBreak; // padding to make debugging easier.\n    _DETOUR_ALIGN   rAlign[8];      // instruction alignment array.\n    PBYTE           pbRemain;       // first instruction after moved code. [free list]\n    PBYTE           pbDetour;       // first instruction of detour function.\n};\n\nC_ASSERT(sizeof(_DETOUR_TRAMPOLINE) == 104);\n\nenum {\n    SIZE_OF_JMP = 8\n};\n\ninline PBYTE align4(PBYTE pValue)\n{\n    return (PBYTE)(((ULONG)pValue) & ~(ULONG)3u);\n}\n\ninline ULONG fetch_thumb_opcode(PBYTE pbCode)\n{\n    ULONG Opcode = *(UINT16 *)&pbCode[0];\n    if (Opcode >= 0xe800) {\n        Opcode = (Opcode << 16) | *(UINT16 *)&pbCode[2];\n    }\n    return Opcode;\n}\n\ninline void write_thumb_opcode(PBYTE &pbCode, ULONG Opcode)\n{\n    if (Opcode >= 0x10000) {\n        *((UINT16*&)pbCode)++ = Opcode >> 16;\n    }\n    *((UINT16*&)pbCode)++ = (UINT16)Opcode;\n}\n\nPBYTE detour_gen_jmp_immediate(PBYTE pbCode, PBYTE *ppPool, PBYTE pbJmpVal)\n{\n    PBYTE pbLiteral;\n    if (ppPool != NULL) {\n        *ppPool = *ppPool - 4;\n        pbLiteral = *ppPool;\n    }\n    else {\n        pbLiteral = align4(pbCode + 6);\n    }\n\n    *((PBYTE*&)pbLiteral) = DETOURS_PBYTE_TO_PFUNC(pbJmpVal);\n    LONG delta = pbLiteral - align4(pbCode + 4);\n\n    write_thumb_opcode(pbCode, 0xf8dff000 | delta);     // LDR PC,[PC+n]\n\n    if (ppPool == NULL) {\n        if (((ULONG)pbCode & 2) != 0) {\n            write_thumb_opcode(pbCode, 0xdefe);         // BREAK\n        }\n        pbCode += 4;\n    }\n    return pbCode;\n}\n\ninline PBYTE detour_gen_brk(PBYTE pbCode, PBYTE pbLimit)\n{\n    while (pbCode < pbLimit) {\n        write_thumb_opcode(pbCode, 0xdefe);\n    }\n    return pbCode;\n}\n\ninline PBYTE detour_skip_jmp(PBYTE pbCode, PVOID *ppGlobals)\n{\n    if (pbCode == NULL) {\n        return NULL;\n    }\n    if (ppGlobals != NULL) {\n        *ppGlobals = NULL;\n    }\n\n    // Skip over the import jump if there is one.\n    pbCode = (PBYTE)DETOURS_PFUNC_TO_PBYTE(pbCode);\n    ULONG Opcode = fetch_thumb_opcode(pbCode);\n\n    if ((Opcode & 0xfbf08f00) == 0xf2400c00) {          // movw r12,#xxxx\n        ULONG Opcode2 = fetch_thumb_opcode(pbCode+4);\n\n        if ((Opcode2 & 0xfbf08f00) == 0xf2c00c00) {      // movt r12,#xxxx\n            ULONG Opcode3 = fetch_thumb_opcode(pbCode+8);\n            if (Opcode3 == 0xf8dcf000) {                 // ldr  pc,[r12]\n                PBYTE pbTarget = (PBYTE)(((Opcode2 << 12) & 0xf7000000) |\n                                         ((Opcode2 <<  1) & 0x08000000) |\n                                         ((Opcode2 << 16) & 0x00ff0000) |\n                                         ((Opcode  >>  4) & 0x0000f700) |\n                                         ((Opcode  >> 15) & 0x00000800) |\n                                         ((Opcode  >>  0) & 0x000000ff));\n                if (detour_is_imported(pbCode, pbTarget)) {\n                    PBYTE pbNew = *(PBYTE *)pbTarget;\n                    pbNew = DETOURS_PFUNC_TO_PBYTE(pbNew);\n                    DETOUR_TRACE((\"%p->%p: skipped over import table.\\n\", pbCode, pbNew));\n                    return pbNew;\n                }\n            }\n        }\n    }\n    return pbCode;\n}\n\ninline void detour_find_jmp_bounds(PBYTE pbCode,\n                                   PDETOUR_TRAMPOLINE *ppLower,\n                                   PDETOUR_TRAMPOLINE *ppUpper)\n{\n    // We have to place trampolines within +/- 2GB of code.\n    ULONG_PTR lo = detour_2gb_below((ULONG_PTR)pbCode);\n    ULONG_PTR hi = detour_2gb_above((ULONG_PTR)pbCode);\n    DETOUR_TRACE((\"[%p..%p..%p]\\n\", lo, pbCode, hi));\n\n    *ppLower = (PDETOUR_TRAMPOLINE)lo;\n    *ppUpper = (PDETOUR_TRAMPOLINE)hi;\n}\n\n\ninline BOOL detour_does_code_end_function(PBYTE pbCode)\n{\n    ULONG Opcode = fetch_thumb_opcode(pbCode);\n    if ((Opcode & 0xffffff87) == 0x4700 ||          // bx <reg>\n        (Opcode & 0xf800d000) == 0xf0009000) {      // b <imm20>\n        return TRUE;\n    }\n    if ((Opcode & 0xffff8000) == 0xe8bd8000) {      // pop {...,pc}\n        __debugbreak();\n        return TRUE;\n    }\n    if ((Opcode & 0xffffff00) == 0x0000bd00) {      // pop {...,pc}\n        __debugbreak();\n        return TRUE;\n    }\n    return FALSE;\n}\n\ninline ULONG detour_is_code_filler(PBYTE pbCode)\n{\n    if (pbCode[0] == 0x00 && pbCode[1] == 0xbf) { // nop.\n        return 2;\n    }\n    if (pbCode[0] == 0x00 && pbCode[1] == 0x00) { // zero-filled padding.\n        return 2;\n    }\n    return 0;\n}\n\n#endif // DETOURS_ARM\n\n#ifdef DETOURS_ARM64\n\nstruct _DETOUR_TRAMPOLINE\n{\n    // An ARM64 instruction is 4 bytes long.\n    //\n    // The overwrite is always composed of 3 instructions (12 bytes) which perform an indirect jump\n\t// using _DETOUR_TRAMPOLINE::pbDetour as the address holding the target location.\n    //\n    // Copied instructions can expand.\n    //\n    // The scheme using MovImmediate can cause an instruction\n    // to grow as much as 6 times.\n    // That would be Bcc or Tbz with a large address space:\n    //   4 instructions to form immediate\n    //   inverted tbz/bcc\n    //   br\n    //\n    // An expansion of 4 is not uncommon -- bl/blr and small address space:\n    //   3 instructions to form immediate\n    //   br or brl\n    //\n    // A theoretical maximum for rbCode is thefore 4*4*6 + 16 = 112 (another 16 for jmp to pbRemain).\n    //\n    // With literals, the maximum expansion is 5, including the literals: 4*4*5 + 16 = 96.\n    //\n    // The number is rounded up to 128. m_rbScratchDst should match this.\n    //\n    BYTE            rbCode[128];    // target code + jmp to pbRemain\n    BYTE            cbCode;         // size of moved target code.\n    BYTE            cbCodeBreak[3]; // padding to make debugging easier.\n    BYTE            rbRestore[24];  // original target code.\n    BYTE            cbRestore;      // size of original target code.\n    BYTE            cbRestoreBreak[3]; // padding to make debugging easier.\n    _DETOUR_ALIGN   rAlign[8];      // instruction alignment array.\n    PBYTE           pbRemain;       // first instruction after moved code. [free list]\n    PBYTE           pbDetour;       // first instruction of detour function.\n};\n\nC_ASSERT(sizeof(_DETOUR_TRAMPOLINE) == 184);\n\nenum {\n    SIZE_OF_JMP = 12\n};\n\ninline ULONG fetch_opcode(PBYTE pbCode)\n{\n    return *(ULONG *)pbCode;\n}\n\ninline void write_opcode(PBYTE &pbCode, ULONG Opcode)\n{\n    *(ULONG *)pbCode = Opcode;\n    pbCode += 4;\n}\n\nstruct ARM64_INDIRECT_JMP {\n    struct {\n        ULONG Rd : 5;\n        ULONG immhi : 19;\n        ULONG iop : 5;\n        ULONG immlo : 2;\n        ULONG op : 1;\n    } ardp;\n\n    struct {\n        ULONG Rt : 5;\n        ULONG Rn : 5;\n        ULONG imm : 12;\n        ULONG opc : 2;\n        ULONG iop1 : 2;\n        ULONG V : 1;\n        ULONG iop2 : 3;\n        ULONG size : 2;\n    } ldr;\n\n    ULONG br;\n};\n\n#pragma warning(push)\n#pragma warning(disable:4201)\n\nunion ARM64_INDIRECT_IMM {\n    struct {\n        ULONG64 pad : 12;\n        ULONG64 adrp_immlo : 2;\n        ULONG64 adrp_immhi : 19;\n    };\n\n    LONG64 value;\n};\n\n#pragma warning(pop)\n\nPBYTE detour_gen_jmp_indirect(BYTE *pbCode, ULONG64 *pbJmpVal)\n{\n    // adrp x17, [jmpval]\n    // ldr x17, [x17, jmpval]\n    // br x17\n\n    struct ARM64_INDIRECT_JMP *pIndJmp;\n    union ARM64_INDIRECT_IMM jmpIndAddr;\n\n    jmpIndAddr.value = (((LONG64)pbJmpVal) & 0xFFFFFFFFFFFFF000) - \n                       (((LONG64)pbCode) & 0xFFFFFFFFFFFFF000);\n\n    pIndJmp = (struct ARM64_INDIRECT_JMP *)pbCode;\n    pbCode = (BYTE *)(pIndJmp + 1);\n\n    pIndJmp->ardp.Rd = 17;\n    pIndJmp->ardp.immhi = jmpIndAddr.adrp_immhi;\n    pIndJmp->ardp.iop = 0x10;\n    pIndJmp->ardp.immlo = jmpIndAddr.adrp_immlo;\n    pIndJmp->ardp.op = 1;\n\n    pIndJmp->ldr.Rt = 17;\n    pIndJmp->ldr.Rn = 17;\n    pIndJmp->ldr.imm = (((ULONG64)pbJmpVal) & 0xFFF) / 8;\n    pIndJmp->ldr.opc = 1;\n    pIndJmp->ldr.iop1 = 1;\n    pIndJmp->ldr.V = 0;\n    pIndJmp->ldr.iop2 = 7;\n    pIndJmp->ldr.size = 3;\n\n    pIndJmp->br = 0xD61F0220;\n\n    return pbCode;\n}\n\nPBYTE detour_gen_jmp_immediate(PBYTE pbCode, PBYTE *ppPool, PBYTE pbJmpVal)\n{\n    PBYTE pbLiteral;\n    if (ppPool != NULL) {\n        *ppPool = *ppPool - 8;\n        pbLiteral = *ppPool;\n    }\n    else {\n        pbLiteral = pbCode + 8;\n    }\n\n    *((PBYTE*&)pbLiteral) = pbJmpVal;\n    LONG delta = (LONG)(pbLiteral - pbCode);\n\n    write_opcode(pbCode, 0x58000011 | ((delta / 4) << 5));  // LDR X17,[PC+n]\n    write_opcode(pbCode, 0xd61f0000 | (17 << 5));           // BR X17\n\n    if (ppPool == NULL) {\n        pbCode += 8;\n    }\n    return pbCode;\n}\n\ninline PBYTE detour_gen_brk(PBYTE pbCode, PBYTE pbLimit)\n{\n    while (pbCode < pbLimit) {\n        write_opcode(pbCode, 0xd4100000 | (0xf000 << 5));\n    }\n    return pbCode;\n}\n\ninline INT64 detour_sign_extend(UINT64 value, UINT bits)\n{\n    const UINT left = 64 - bits;\n    const INT64 m1 = -1;\n    const INT64 wide = (INT64)(value << left);\n    const INT64 sign = (wide < 0) ? (m1 << left) : 0;\n    return value | sign;\n}\n\ninline PBYTE detour_skip_jmp(PBYTE pbCode, PVOID *ppGlobals)\n{\n    if (pbCode == NULL) {\n        return NULL;\n    }\n    if (ppGlobals != NULL) {\n        *ppGlobals = NULL;\n    }\n\n    // Skip over the import jump if there is one.\n    pbCode = (PBYTE)pbCode;\n    ULONG Opcode = fetch_opcode(pbCode);\n\n    if ((Opcode & 0x9f00001f) == 0x90000010) {           // adrp  x16, IAT\n        ULONG Opcode2 = fetch_opcode(pbCode + 4);\n\n        if ((Opcode2 & 0xffe003ff) == 0xf9400210) {      // ldr   x16, [x16, IAT]\n            ULONG Opcode3 = fetch_opcode(pbCode + 8);\n\n            if (Opcode3 == 0xd61f0200) {                 // br    x16\n\n/* https://static.docs.arm.com/ddi0487/bb/DDI0487B_b_armv8_arm.pdf\n    The ADRP instruction shifts a signed, 21-bit immediate left by 12 bits, adds it to the value of the program counter with\n    the bottom 12 bits cleared to zero, and then writes the result to a general-purpose register. This permits the\n    calculation of the address at a 4KB aligned memory region. In conjunction with an ADD (immediate) instruction, or\n    a Load/Store instruction with a 12-bit immediate offset, this allows for the calculation of, or access to, any address\n    within +/- 4GB of the current PC.\n\nPC-rel. addressing\n    This section describes the encoding of the PC-rel. addressing instruction class. The encodings in this section are\n    decoded from Data Processing -- Immediate on page C4-226.\n    Add/subtract (immediate)\n    This section describes the encoding of the Add/subtract (immediate) instruction class. The encodings in this section\n    are decoded from Data Processing -- Immediate on page C4-226.\n    Decode fields\n    Instruction page\n    op\n    0 ADR\n    1 ADRP\n\nC6.2.10 ADRP\n    Form PC-relative address to 4KB page adds an immediate value that is shifted left by 12 bits, to the PC value to\n    form a PC-relative address, with the bottom 12 bits masked out, and writes the result to the destination register.\n    ADRP <Xd>, <label>\n    imm = SignExtend(immhi:immlo:Zeros(12), 64);\n\n    31  30 29 28 27 26 25 24 23 5    4 0\n    1   immlo  1  0  0  0  0  immhi  Rd\n         9             0\n\nRd is hardcoded as 0x10 above.\nImmediate is 21 signed bits split into 2 bits and 19 bits, and is scaled by 4K.\n*/\n                UINT64 const pageLow2 = (Opcode >> 29) & 3;\n                UINT64 const pageHigh19 = (Opcode >> 5) & ~(~0ui64 << 19);\n                INT64 const page = detour_sign_extend((pageHigh19 << 2) | pageLow2, 21) << 12;\n\n/* https://static.docs.arm.com/ddi0487/bb/DDI0487B_b_armv8_arm.pdf\n\n    C6.2.101 LDR (immediate)\n    Load Register (immediate) loads a word or doubleword from memory and writes it to a register. The address that is\n    used for the load is calculated from a base register and an immediate offset.\n    The Unsigned offset variant scales the immediate offset value by the size of the value accessed before adding it\n    to the base register value.\n\nUnsigned offset\n64-bit variant Applies when size == 11.\n    31 30 29 28  27 26 25 24  23 22  21   10   9 5   4 0\n     1  x  1  1   1  0  0  1   0  1  imm12      Rn    Rt\n         F             9        4              200    10\n\nThat is, two low 5 bit fields are registers, hardcoded as 0x10 and 0x10 << 5 above,\nthen unsigned size-unscaled (8) 12-bit offset, then opcode bits 0xF94.\n*/\n                UINT64 const offset = ((Opcode2 >> 10) & ~(~0ui64 << 12)) << 3;\n\n                PBYTE const pbTarget = (PBYTE)((ULONG64)pbCode & 0xfffffffffffff000ULL) + page + offset;\n\n                if (detour_is_imported(pbCode, pbTarget)) {\n                    PBYTE pbNew = *(PBYTE *)pbTarget;\n                    DETOUR_TRACE((\"%p->%p: skipped over import table.\\n\", pbCode, pbNew));\n                    return pbNew;\n                }\n            }\n        }\n    }\n    return pbCode;\n}\n\ninline void detour_find_jmp_bounds(PBYTE pbCode,\n                                   PDETOUR_TRAMPOLINE *ppLower,\n                                   PDETOUR_TRAMPOLINE *ppUpper)\n{\n    // The encoding used by detour_gen_jmp_indirect actually enables a\n    // displacement of +/- 4GiB. In the future, this could be changed to\n    // reflect that. For now, just reuse the x86 logic which is plenty.\n\n    ULONG_PTR lo = detour_2gb_below((ULONG_PTR)pbCode);\n    ULONG_PTR hi = detour_2gb_above((ULONG_PTR)pbCode);\n    DETOUR_TRACE((\"[%p..%p..%p]\\n\", lo, pbCode, hi));\n\n    *ppLower = (PDETOUR_TRAMPOLINE)lo;\n    *ppUpper = (PDETOUR_TRAMPOLINE)hi;\n}\n\ninline BOOL detour_does_code_end_function(PBYTE pbCode)\n{\n    ULONG Opcode = fetch_opcode(pbCode);\n    if ((Opcode & 0xfffffc1f) == 0xd65f0000 ||      // br <reg>\n        (Opcode & 0xfc000000) == 0x14000000) {      // b <imm26>\n        return TRUE;\n    }\n    return FALSE;\n}\n\ninline ULONG detour_is_code_filler(PBYTE pbCode)\n{\n    if (*(ULONG *)pbCode == 0xd503201f) {   // nop.\n        return 4;\n    }\n    if (*(ULONG *)pbCode == 0x00000000) {   // zero-filled padding.\n        return 4;\n    }\n    return 0;\n}\n\n#endif // DETOURS_ARM64\n\n//////////////////////////////////////////////// Trampoline Memory Management.\n//\nstruct DETOUR_REGION\n{\n    ULONG               dwSignature;\n    DETOUR_REGION *     pNext;  // Next region in list of regions.\n    DETOUR_TRAMPOLINE * pFree;  // List of free trampolines in this region.\n};\ntypedef DETOUR_REGION * PDETOUR_REGION;\n\nconst ULONG DETOUR_REGION_SIGNATURE = 'Rrtd';\nconst ULONG DETOUR_REGION_SIZE = 0x10000;\nconst ULONG DETOUR_TRAMPOLINES_PER_REGION = (DETOUR_REGION_SIZE\n                                             / sizeof(DETOUR_TRAMPOLINE)) - 1;\nstatic PDETOUR_REGION s_pRegions = NULL;            // List of all regions.\nstatic PDETOUR_REGION s_pRegion = NULL;             // Default region.\n\nstatic DWORD detour_writable_trampoline_regions()\n{\n    // Mark all of the regions as writable.\n    for (PDETOUR_REGION pRegion = s_pRegions; pRegion != NULL; pRegion = pRegion->pNext) {\n        DWORD dwOld;\n        if (!VirtualProtect(pRegion, DETOUR_REGION_SIZE, PAGE_EXECUTE_READWRITE, &dwOld)) {\n            return GetLastError();\n        }\n    }\n    return NO_ERROR;\n}\n\nstatic void detour_runnable_trampoline_regions()\n{\n    HANDLE hProcess = GetCurrentProcess();\n\n    // Mark all of the regions as executable.\n    for (PDETOUR_REGION pRegion = s_pRegions; pRegion != NULL; pRegion = pRegion->pNext) {\n        DWORD dwOld;\n        VirtualProtect(pRegion, DETOUR_REGION_SIZE, PAGE_EXECUTE_READ, &dwOld);\n        FlushInstructionCache(hProcess, pRegion, DETOUR_REGION_SIZE);\n    }\n}\n\nstatic PBYTE detour_alloc_round_down_to_region(PBYTE pbTry)\n{\n    // WinXP64 returns free areas that aren't REGION aligned to 32-bit applications.\n    ULONG_PTR extra = ((ULONG_PTR)pbTry) & (DETOUR_REGION_SIZE - 1);\n    if (extra != 0) {\n        pbTry -= extra;\n    }\n    return pbTry;\n}\n\nstatic PBYTE detour_alloc_round_up_to_region(PBYTE pbTry)\n{\n    // WinXP64 returns free areas that aren't REGION aligned to 32-bit applications.\n    ULONG_PTR extra = ((ULONG_PTR)pbTry) & (DETOUR_REGION_SIZE - 1);\n    if (extra != 0) {\n        ULONG_PTR adjust = DETOUR_REGION_SIZE - extra;\n        pbTry += adjust;\n    }\n    return pbTry;\n}\n\n// Starting at pbLo, try to allocate a memory region, continue until pbHi.\n\nstatic PVOID detour_alloc_region_from_lo(PBYTE pbLo, PBYTE pbHi)\n{\n    PBYTE pbTry = detour_alloc_round_up_to_region(pbLo);\n\n    DETOUR_TRACE((\" Looking for free region in %p..%p from %p:\\n\", pbLo, pbHi, pbTry));\n\n    for (; pbTry < pbHi;) {\n        MEMORY_BASIC_INFORMATION mbi;\n\n        if (pbTry >= s_pSystemRegionLowerBound && pbTry <= s_pSystemRegionUpperBound) {\n            // Skip region reserved for system DLLs, but preserve address space entropy.\n            pbTry += 0x08000000;\n            continue;\n        }\n\n        ZeroMemory(&mbi, sizeof(mbi));\n        if (!VirtualQuery(pbTry, &mbi, sizeof(mbi))) {\n            break;\n        }\n\n        DETOUR_TRACE((\"  Try %p => %p..%p %6x\\n\",\n                      pbTry,\n                      mbi.BaseAddress,\n                      (PBYTE)mbi.BaseAddress + mbi.RegionSize - 1,\n                      mbi.State));\n\n        if (mbi.State == MEM_FREE && mbi.RegionSize >= DETOUR_REGION_SIZE) {\n\n            PVOID pv = VirtualAlloc(pbTry,\n                                    DETOUR_REGION_SIZE,\n                                    MEM_COMMIT|MEM_RESERVE,\n                                    PAGE_EXECUTE_READWRITE);\n            if (pv != NULL) {\n                return pv;\n            }\n            else if (GetLastError() == ERROR_DYNAMIC_CODE_BLOCKED) {\n                return NULL;\n            }\n            pbTry += DETOUR_REGION_SIZE;\n        }\n        else {\n            pbTry = detour_alloc_round_up_to_region((PBYTE)mbi.BaseAddress + mbi.RegionSize);\n        }\n    }\n    return NULL;\n}\n\n// Starting at pbHi, try to allocate a memory region, continue until pbLo.\n\nstatic PVOID detour_alloc_region_from_hi(PBYTE pbLo, PBYTE pbHi)\n{\n    PBYTE pbTry = detour_alloc_round_down_to_region(pbHi - DETOUR_REGION_SIZE);\n\n    DETOUR_TRACE((\" Looking for free region in %p..%p from %p:\\n\", pbLo, pbHi, pbTry));\n\n    for (; pbTry > pbLo;) {\n        MEMORY_BASIC_INFORMATION mbi;\n\n        DETOUR_TRACE((\"  Try %p\\n\", pbTry));\n        if (pbTry >= s_pSystemRegionLowerBound && pbTry <= s_pSystemRegionUpperBound) {\n            // Skip region reserved for system DLLs, but preserve address space entropy.\n            pbTry -= 0x08000000;\n            continue;\n        }\n\n        ZeroMemory(&mbi, sizeof(mbi));\n        if (!VirtualQuery(pbTry, &mbi, sizeof(mbi))) {\n            break;\n        }\n\n        DETOUR_TRACE((\"  Try %p => %p..%p %6x\\n\",\n                      pbTry,\n                      mbi.BaseAddress,\n                      (PBYTE)mbi.BaseAddress + mbi.RegionSize - 1,\n                      mbi.State));\n\n        if (mbi.State == MEM_FREE && mbi.RegionSize >= DETOUR_REGION_SIZE) {\n\n            PVOID pv = VirtualAlloc(pbTry,\n                                    DETOUR_REGION_SIZE,\n                                    MEM_COMMIT|MEM_RESERVE,\n                                    PAGE_EXECUTE_READWRITE);\n            if (pv != NULL) {\n                return pv;\n            }\n            else if (GetLastError() == ERROR_DYNAMIC_CODE_BLOCKED) {\n                return NULL;\n            }\n            pbTry -= DETOUR_REGION_SIZE;\n        }\n        else {\n            pbTry = detour_alloc_round_down_to_region((PBYTE)mbi.AllocationBase\n                                                      - DETOUR_REGION_SIZE);\n        }\n    }\n    return NULL;\n}\n\nstatic PVOID detour_alloc_trampoline_allocate_new(PBYTE pbTarget,\n                                                  PDETOUR_TRAMPOLINE pLo,\n                                                  PDETOUR_TRAMPOLINE pHi)\n{\n    PVOID pbTry = NULL;\n\n    // NB: We must always also start the search at an offset from pbTarget\n    //     in order to maintain ASLR entropy.\n\n#if defined(DETOURS_64BIT)\n    // Try looking 1GB below or lower.\n    if (pbTry == NULL && pbTarget > (PBYTE)0x40000000) {\n        pbTry = detour_alloc_region_from_hi((PBYTE)pLo, pbTarget - 0x40000000);\n    }\n    // Try looking 1GB above or higher.\n    if (pbTry == NULL && pbTarget < (PBYTE)0xffffffff40000000) {\n        pbTry = detour_alloc_region_from_lo(pbTarget + 0x40000000, (PBYTE)pHi);\n    }\n    // Try looking 1GB below or higher.\n    if (pbTry == NULL && pbTarget > (PBYTE)0x40000000) {\n        pbTry = detour_alloc_region_from_lo(pbTarget - 0x40000000, pbTarget);\n    }\n    // Try looking 1GB above or lower.\n    if (pbTry == NULL && pbTarget < (PBYTE)0xffffffff40000000) {\n        pbTry = detour_alloc_region_from_hi(pbTarget, pbTarget + 0x40000000);\n    }\n#endif\n\n    // Try anything below.\n    if (pbTry == NULL) {\n        pbTry = detour_alloc_region_from_hi((PBYTE)pLo, pbTarget);\n    }\n    // try anything above.\n    if (pbTry == NULL) {\n        pbTry = detour_alloc_region_from_lo(pbTarget, (PBYTE)pHi);\n    }\n\n    return pbTry;\n}\n\nPVOID WINAPI DetourAllocateRegionWithinJumpBounds(_In_ LPCVOID pbTarget,\n                                                  _Out_ PDWORD pcbAllocatedSize)\n{\n    PDETOUR_TRAMPOLINE pLo;\n    PDETOUR_TRAMPOLINE pHi;\n    detour_find_jmp_bounds((PBYTE)pbTarget, &pLo, &pHi);\n\n    PVOID pbNewlyAllocated =\n        detour_alloc_trampoline_allocate_new((PBYTE)pbTarget, pLo, pHi);\n    if (pbNewlyAllocated == NULL) {\n        DETOUR_TRACE((\"Couldn't find available memory region!\\n\"));\n        *pcbAllocatedSize = 0;\n        return NULL;\n    }\n\n    *pcbAllocatedSize = DETOUR_REGION_SIZE;\n    return pbNewlyAllocated;\n}\n\nstatic PDETOUR_TRAMPOLINE detour_alloc_trampoline(PBYTE pbTarget)\n{\n    // We have to place trampolines within +/- 2GB of target.\n\n    PDETOUR_TRAMPOLINE pLo;\n    PDETOUR_TRAMPOLINE pHi;\n\n    detour_find_jmp_bounds(pbTarget, &pLo, &pHi);\n\n    PDETOUR_TRAMPOLINE pTrampoline = NULL;\n\n    // Insure that there is a default region.\n    if (s_pRegion == NULL && s_pRegions != NULL) {\n        s_pRegion = s_pRegions;\n    }\n\n    // First check the default region for an valid free block.\n    if (s_pRegion != NULL && s_pRegion->pFree != NULL &&\n        s_pRegion->pFree >= pLo && s_pRegion->pFree <= pHi) {\n\n      found_region:\n        pTrampoline = s_pRegion->pFree;\n        // do a last sanity check on region.\n        if (pTrampoline < pLo || pTrampoline > pHi) {\n            return NULL;\n        }\n        s_pRegion->pFree = (PDETOUR_TRAMPOLINE)pTrampoline->pbRemain;\n        memset(pTrampoline, 0xcc, sizeof(*pTrampoline));\n        return pTrampoline;\n    }\n\n    // Then check the existing regions for a valid free block.\n    for (s_pRegion = s_pRegions; s_pRegion != NULL; s_pRegion = s_pRegion->pNext) {\n        if (s_pRegion != NULL && s_pRegion->pFree != NULL &&\n            s_pRegion->pFree >= pLo && s_pRegion->pFree <= pHi) {\n            goto found_region;\n        }\n    }\n\n    // We need to allocate a new region.\n\n    // Round pbTarget down to 64KB block.\n    pbTarget = pbTarget - (PtrToUlong(pbTarget) & 0xffff);\n\n    PVOID pbNewlyAllocated =\n        detour_alloc_trampoline_allocate_new(pbTarget, pLo, pHi);\n    if (pbNewlyAllocated != NULL) {\n        s_pRegion = (DETOUR_REGION*)pbNewlyAllocated;\n        s_pRegion->dwSignature = DETOUR_REGION_SIGNATURE;\n        s_pRegion->pFree = NULL;\n        s_pRegion->pNext = s_pRegions;\n        s_pRegions = s_pRegion;\n        DETOUR_TRACE((\"  Allocated region %p..%p\\n\\n\",\n                      s_pRegion, ((PBYTE)s_pRegion) + DETOUR_REGION_SIZE - 1));\n\n        // Put everything but the first trampoline on the free list.\n        PBYTE pFree = NULL;\n        pTrampoline = ((PDETOUR_TRAMPOLINE)s_pRegion) + 1;\n        for (int i = DETOUR_TRAMPOLINES_PER_REGION - 1; i > 1; i--) {\n            pTrampoline[i].pbRemain = pFree;\n            pFree = (PBYTE)&pTrampoline[i];\n        }\n        s_pRegion->pFree = (PDETOUR_TRAMPOLINE)pFree;\n        goto found_region;\n    }\n\n    DETOUR_TRACE((\"Couldn't find available memory region!\\n\"));\n    return NULL;\n}\n\nstatic void detour_free_trampoline(PDETOUR_TRAMPOLINE pTrampoline)\n{\n    PDETOUR_REGION pRegion = (PDETOUR_REGION)\n        ((ULONG_PTR)pTrampoline & ~(ULONG_PTR)0xffff);\n\n    memset(pTrampoline, 0, sizeof(*pTrampoline));\n    pTrampoline->pbRemain = (PBYTE)pRegion->pFree;\n    pRegion->pFree = pTrampoline;\n}\n\nstatic BOOL detour_is_region_empty(PDETOUR_REGION pRegion)\n{\n    // Stop if the region isn't a region (this would be bad).\n    if (pRegion->dwSignature != DETOUR_REGION_SIGNATURE) {\n        return FALSE;\n    }\n\n    PBYTE pbRegionBeg = (PBYTE)pRegion;\n    PBYTE pbRegionLim  = pbRegionBeg + DETOUR_REGION_SIZE;\n\n    // Stop if any of the trampolines aren't free.\n    PDETOUR_TRAMPOLINE pTrampoline = ((PDETOUR_TRAMPOLINE)pRegion) + 1;\n    for (int i = 0; i < DETOUR_TRAMPOLINES_PER_REGION; i++) {\n        if (pTrampoline[i].pbRemain != NULL &&\n            (pTrampoline[i].pbRemain < pbRegionBeg ||\n             pTrampoline[i].pbRemain >= pbRegionLim)) {\n            return FALSE;\n        }\n    }\n\n    // OK, the region is empty.\n    return TRUE;\n}\n\nstatic void detour_free_unused_trampoline_regions()\n{\n    PDETOUR_REGION *ppRegionBase = &s_pRegions;\n    PDETOUR_REGION pRegion = s_pRegions;\n\n    while (pRegion != NULL) {\n        if (detour_is_region_empty(pRegion)) {\n            *ppRegionBase = pRegion->pNext;\n\n            VirtualFree(pRegion, 0, MEM_RELEASE);\n            s_pRegion = NULL;\n        }\n        else {\n            ppRegionBase = &pRegion->pNext;\n        }\n        pRegion = *ppRegionBase;\n    }\n}\n\n///////////////////////////////////////////////////////// Transaction Structs.\n//\nstruct DetourThread\n{\n    DetourThread *      pNext;\n    HANDLE              hThread;\n};\n\nstruct DetourOperation\n{\n    DetourOperation *   pNext;\n    BOOL                fIsRemove;\n    PBYTE *             ppbPointer;\n    PBYTE               pbTarget;\n    PDETOUR_TRAMPOLINE  pTrampoline;\n    ULONG               dwPerm;\n};\n\nstatic BOOL                 s_fIgnoreTooSmall       = FALSE;\nstatic BOOL                 s_fRetainRegions        = FALSE;\n\nstatic LONG                 s_nPendingThreadId      = 0; // Thread owning pending transaction.\nstatic LONG                 s_nPendingError         = NO_ERROR;\nstatic PVOID *              s_ppPendingError        = NULL;\nstatic DetourThread *       s_pPendingThreads       = NULL;\nstatic DetourOperation *    s_pPendingOperations    = NULL;\n\n//////////////////////////////////////////////////////////////////////////////\n//\nPVOID WINAPI DetourCodeFromPointer(_In_ PVOID pPointer,\n                                   _Out_opt_ PVOID *ppGlobals)\n{\n    return detour_skip_jmp((PBYTE)pPointer, ppGlobals);\n}\n\n//////////////////////////////////////////////////////////// Transaction APIs.\n//\nBOOL WINAPI DetourSetIgnoreTooSmall(_In_ BOOL fIgnore)\n{\n    BOOL fPrevious = s_fIgnoreTooSmall;\n    s_fIgnoreTooSmall = fIgnore;\n    return fPrevious;\n}\n\nBOOL WINAPI DetourSetRetainRegions(_In_ BOOL fRetain)\n{\n    BOOL fPrevious = s_fRetainRegions;\n    s_fRetainRegions = fRetain;\n    return fPrevious;\n}\n\nPVOID WINAPI DetourSetSystemRegionLowerBound(_In_ PVOID pSystemRegionLowerBound)\n{\n    PVOID pPrevious = s_pSystemRegionLowerBound;\n    s_pSystemRegionLowerBound = pSystemRegionLowerBound;\n    return pPrevious;\n}\n\nPVOID WINAPI DetourSetSystemRegionUpperBound(_In_ PVOID pSystemRegionUpperBound)\n{\n    PVOID pPrevious = s_pSystemRegionUpperBound;\n    s_pSystemRegionUpperBound = pSystemRegionUpperBound;\n    return pPrevious;\n}\n\nLONG WINAPI DetourTransactionBegin()\n{\n    // Only one transaction is allowed at a time.\n_Benign_race_begin_\n    if (s_nPendingThreadId != 0) {\n        return ERROR_INVALID_OPERATION;\n    }\n_Benign_race_end_\n\n    // Make sure only one thread can start a transaction.\n    if (InterlockedCompareExchange(&s_nPendingThreadId, (LONG)GetCurrentThreadId(), 0) != 0) {\n        return ERROR_INVALID_OPERATION;\n    }\n\n    s_pPendingOperations = NULL;\n    s_pPendingThreads = NULL;\n    s_ppPendingError = NULL;\n\n    // Make sure the trampoline pages are writable.\n    s_nPendingError = detour_writable_trampoline_regions();\n\n    return s_nPendingError;\n}\n\nLONG WINAPI DetourTransactionAbort()\n{\n    if (s_nPendingThreadId != (LONG)GetCurrentThreadId()) {\n        return ERROR_INVALID_OPERATION;\n    }\n\n    // Restore all of the page permissions.\n    for (DetourOperation *o = s_pPendingOperations; o != NULL;) {\n        // We don't care if this fails, because the code is still accessible.\n        DWORD dwOld;\n        VirtualProtect(o->pbTarget, o->pTrampoline->cbRestore,\n                       o->dwPerm, &dwOld);\n\n        if (!o->fIsRemove) {\n            if (o->pTrampoline) {\n                detour_free_trampoline(o->pTrampoline);\n                o->pTrampoline = NULL;\n            }\n        }\n\n        DetourOperation *n = o->pNext;\n        delete o;\n        o = n;\n    }\n    s_pPendingOperations = NULL;\n\n    // Make sure the trampoline pages are no longer writable.\n    detour_runnable_trampoline_regions();\n\n    // Resume any suspended threads.\n    for (DetourThread *t = s_pPendingThreads; t != NULL;) {\n        // There is nothing we can do if this fails.\n        ResumeThread(t->hThread);\n\n        DetourThread *n = t->pNext;\n        delete t;\n        t = n;\n    }\n    s_pPendingThreads = NULL;\n    s_nPendingThreadId = 0;\n\n    return NO_ERROR;\n}\n\nLONG WINAPI DetourTransactionCommit()\n{\n    return DetourTransactionCommitEx(NULL);\n}\n\nstatic BYTE detour_align_from_trampoline(PDETOUR_TRAMPOLINE pTrampoline, BYTE obTrampoline)\n{\n    for (LONG n = 0; n < ARRAYSIZE(pTrampoline->rAlign); n++) {\n        if (pTrampoline->rAlign[n].obTrampoline == obTrampoline) {\n            return pTrampoline->rAlign[n].obTarget;\n        }\n    }\n    return 0;\n}\n\nstatic LONG detour_align_from_target(PDETOUR_TRAMPOLINE pTrampoline, LONG obTarget)\n{\n    for (LONG n = 0; n < ARRAYSIZE(pTrampoline->rAlign); n++) {\n        if (pTrampoline->rAlign[n].obTarget == obTarget) {\n            return pTrampoline->rAlign[n].obTrampoline;\n        }\n    }\n    return 0;\n}\n\nLONG WINAPI DetourTransactionCommitEx(_Out_opt_ PVOID **pppFailedPointer)\n{\n    if (pppFailedPointer != NULL) {\n        // Used to get the last error.\n        *pppFailedPointer = s_ppPendingError;\n    }\n    if (s_nPendingThreadId != (LONG)GetCurrentThreadId()) {\n        return ERROR_INVALID_OPERATION;\n    }\n\n    // If any of the pending operations failed, then we abort the whole transaction.\n    if (s_nPendingError != NO_ERROR) {\n        DETOUR_BREAK();\n        DetourTransactionAbort();\n        return s_nPendingError;\n    }\n\n    // Common variables.\n    DetourOperation *o;\n    DetourThread *t;\n    BOOL freed = FALSE;\n\n    // Insert or remove each of the detours.\n    for (o = s_pPendingOperations; o != NULL; o = o->pNext) {\n        if (o->fIsRemove) {\n            CopyMemory(o->pbTarget,\n                       o->pTrampoline->rbRestore,\n                       o->pTrampoline->cbRestore);\n#ifdef DETOURS_IA64\n            *o->ppbPointer = (PBYTE)o->pTrampoline->ppldTarget;\n#endif // DETOURS_IA64\n\n#ifdef DETOURS_X86\n            *o->ppbPointer = o->pbTarget;\n#endif // DETOURS_X86\n\n#ifdef DETOURS_X64\n            *o->ppbPointer = o->pbTarget;\n#endif // DETOURS_X64\n\n#ifdef DETOURS_ARM\n            *o->ppbPointer = DETOURS_PBYTE_TO_PFUNC(o->pbTarget);\n#endif // DETOURS_ARM\n\n#ifdef DETOURS_ARM64\n            *o->ppbPointer = o->pbTarget;\n#endif // DETOURS_ARM\n        }\n        else {\n            DETOUR_TRACE((\"detours: pbTramp =%p, pbRemain=%p, pbDetour=%p, cbRestore=%d\\n\",\n                          o->pTrampoline,\n                          o->pTrampoline->pbRemain,\n                          o->pTrampoline->pbDetour,\n                          o->pTrampoline->cbRestore));\n\n            DETOUR_TRACE((\"detours: pbTarget=%p: \"\n                          \"%02x %02x %02x %02x \"\n                          \"%02x %02x %02x %02x \"\n                          \"%02x %02x %02x %02x [before]\\n\",\n                          o->pbTarget,\n                          o->pbTarget[0], o->pbTarget[1], o->pbTarget[2], o->pbTarget[3],\n                          o->pbTarget[4], o->pbTarget[5], o->pbTarget[6], o->pbTarget[7],\n                          o->pbTarget[8], o->pbTarget[9], o->pbTarget[10], o->pbTarget[11]));\n\n#ifdef DETOURS_IA64\n            ((DETOUR_IA64_BUNDLE*)o->pbTarget)\n                ->SetBrl((UINT64)&o->pTrampoline->bAllocFrame);\n            *o->ppbPointer = (PBYTE)&o->pTrampoline->pldTrampoline;\n#endif // DETOURS_IA64\n\n#ifdef DETOURS_X64\n            detour_gen_jmp_indirect(o->pTrampoline->rbCodeIn, &o->pTrampoline->pbDetour);\n            PBYTE pbCode = detour_gen_jmp_immediate(o->pbTarget, o->pTrampoline->rbCodeIn);\n            pbCode = detour_gen_brk(pbCode, o->pTrampoline->pbRemain);\n            *o->ppbPointer = o->pTrampoline->rbCode;\n            UNREFERENCED_PARAMETER(pbCode);\n#endif // DETOURS_X64\n\n#ifdef DETOURS_X86\n            PBYTE pbCode = detour_gen_jmp_immediate(o->pbTarget, o->pTrampoline->pbDetour);\n            pbCode = detour_gen_brk(pbCode, o->pTrampoline->pbRemain);\n            *o->ppbPointer = o->pTrampoline->rbCode;\n            UNREFERENCED_PARAMETER(pbCode);\n#endif // DETOURS_X86\n\n#ifdef DETOURS_ARM\n            PBYTE pbCode = detour_gen_jmp_immediate(o->pbTarget, NULL, o->pTrampoline->pbDetour);\n            pbCode = detour_gen_brk(pbCode, o->pTrampoline->pbRemain);\n            *o->ppbPointer = DETOURS_PBYTE_TO_PFUNC(o->pTrampoline->rbCode);\n            UNREFERENCED_PARAMETER(pbCode);\n#endif // DETOURS_ARM\n\n#ifdef DETOURS_ARM64\n            PBYTE pbCode = detour_gen_jmp_indirect(o->pbTarget, (ULONG64*)&(o->pTrampoline->pbDetour));\n            pbCode = detour_gen_brk(pbCode, o->pTrampoline->pbRemain);\n            *o->ppbPointer = o->pTrampoline->rbCode;\n            UNREFERENCED_PARAMETER(pbCode);\n#endif // DETOURS_ARM64\n\n            DETOUR_TRACE((\"detours: pbTarget=%p: \"\n                          \"%02x %02x %02x %02x \"\n                          \"%02x %02x %02x %02x \"\n                          \"%02x %02x %02x %02x [after]\\n\",\n                          o->pbTarget,\n                          o->pbTarget[0], o->pbTarget[1], o->pbTarget[2], o->pbTarget[3],\n                          o->pbTarget[4], o->pbTarget[5], o->pbTarget[6], o->pbTarget[7],\n                          o->pbTarget[8], o->pbTarget[9], o->pbTarget[10], o->pbTarget[11]));\n\n            DETOUR_TRACE((\"detours: pbTramp =%p: \"\n                          \"%02x %02x %02x %02x \"\n                          \"%02x %02x %02x %02x \"\n                          \"%02x %02x %02x %02x\\n\",\n                          o->pTrampoline,\n                          o->pTrampoline->rbCode[0], o->pTrampoline->rbCode[1],\n                          o->pTrampoline->rbCode[2], o->pTrampoline->rbCode[3],\n                          o->pTrampoline->rbCode[4], o->pTrampoline->rbCode[5],\n                          o->pTrampoline->rbCode[6], o->pTrampoline->rbCode[7],\n                          o->pTrampoline->rbCode[8], o->pTrampoline->rbCode[9],\n                          o->pTrampoline->rbCode[10], o->pTrampoline->rbCode[11]));\n\n#ifdef DETOURS_IA64\n            DETOUR_TRACE((\"\\n\"));\n            DETOUR_TRACE((\"detours:  &pldTrampoline  =%p\\n\",\n                          &o->pTrampoline->pldTrampoline));\n            DETOUR_TRACE((\"detours:  &bMovlTargetGp  =%p [%p]\\n\",\n                          &o->pTrampoline->bMovlTargetGp,\n                          o->pTrampoline->bMovlTargetGp.GetMovlGp()));\n            DETOUR_TRACE((\"detours:  &rbCode         =%p [%p]\\n\",\n                          &o->pTrampoline->rbCode,\n                          ((DETOUR_IA64_BUNDLE&)o->pTrampoline->rbCode).GetBrlTarget()));\n            DETOUR_TRACE((\"detours:  &bBrlRemainEip  =%p [%p]\\n\",\n                          &o->pTrampoline->bBrlRemainEip,\n                          o->pTrampoline->bBrlRemainEip.GetBrlTarget()));\n            DETOUR_TRACE((\"detours:  &bMovlDetourGp  =%p [%p]\\n\",\n                          &o->pTrampoline->bMovlDetourGp,\n                          o->pTrampoline->bMovlDetourGp.GetMovlGp()));\n            DETOUR_TRACE((\"detours:  &bBrlDetourEip  =%p [%p]\\n\",\n                          &o->pTrampoline->bCallDetour,\n                          o->pTrampoline->bCallDetour.GetBrlTarget()));\n            DETOUR_TRACE((\"detours:  pldDetour       =%p [%p]\\n\",\n                          o->pTrampoline->ppldDetour->EntryPoint,\n                          o->pTrampoline->ppldDetour->GlobalPointer));\n            DETOUR_TRACE((\"detours:  pldTarget       =%p [%p]\\n\",\n                          o->pTrampoline->ppldTarget->EntryPoint,\n                          o->pTrampoline->ppldTarget->GlobalPointer));\n            DETOUR_TRACE((\"detours:  pbRemain        =%p\\n\",\n                          o->pTrampoline->pbRemain));\n            DETOUR_TRACE((\"detours:  pbDetour        =%p\\n\",\n                          o->pTrampoline->pbDetour));\n            DETOUR_TRACE((\"\\n\"));\n#endif // DETOURS_IA64\n        }\n    }\n\n    // Update any suspended threads.\n    for (t = s_pPendingThreads; t != NULL; t = t->pNext) {\n        CONTEXT cxt;\n        cxt.ContextFlags = CONTEXT_CONTROL;\n\n#undef DETOURS_EIP\n\n#ifdef DETOURS_X86\n#define DETOURS_EIP         Eip\n#endif // DETOURS_X86\n\n#ifdef DETOURS_X64\n#define DETOURS_EIP         Rip\n#endif // DETOURS_X64\n\n#ifdef DETOURS_IA64\n#define DETOURS_EIP         StIIP\n#endif // DETOURS_IA64\n\n#ifdef DETOURS_ARM\n#define DETOURS_EIP         Pc\n#endif // DETOURS_ARM\n\n#ifdef DETOURS_ARM64\n#define DETOURS_EIP         Pc\n#endif // DETOURS_ARM64\n\ntypedef ULONG_PTR DETOURS_EIP_TYPE;\n\n        if (GetThreadContext(t->hThread, &cxt)) {\n            for (o = s_pPendingOperations; o != NULL; o = o->pNext) {\n                if (o->fIsRemove) {\n                    if (cxt.DETOURS_EIP >= (DETOURS_EIP_TYPE)(ULONG_PTR)o->pTrampoline &&\n                        cxt.DETOURS_EIP < (DETOURS_EIP_TYPE)((ULONG_PTR)o->pTrampoline\n                                                             + sizeof(o->pTrampoline))\n                       ) {\n\n                        cxt.DETOURS_EIP = (DETOURS_EIP_TYPE)\n                            ((ULONG_PTR)o->pbTarget\n                             + detour_align_from_trampoline(o->pTrampoline,\n                                                            (BYTE)(cxt.DETOURS_EIP\n                                                                   - (DETOURS_EIP_TYPE)(ULONG_PTR)\n                                                                   o->pTrampoline)));\n\n                        SetThreadContext(t->hThread, &cxt);\n                    }\n                }\n                else {\n                    if (cxt.DETOURS_EIP >= (DETOURS_EIP_TYPE)(ULONG_PTR)o->pbTarget &&\n                        cxt.DETOURS_EIP < (DETOURS_EIP_TYPE)((ULONG_PTR)o->pbTarget\n                                                             + o->pTrampoline->cbRestore)\n                       ) {\n\n                        cxt.DETOURS_EIP = (DETOURS_EIP_TYPE)\n                            ((ULONG_PTR)o->pTrampoline\n                             + detour_align_from_target(o->pTrampoline,\n                                                        (BYTE)(cxt.DETOURS_EIP\n                                                               - (DETOURS_EIP_TYPE)(ULONG_PTR)\n                                                               o->pbTarget)));\n\n                        SetThreadContext(t->hThread, &cxt);\n                    }\n                }\n            }\n        }\n#undef DETOURS_EIP\n    }\n\n    // Restore all of the page permissions and flush the icache.\n    HANDLE hProcess = GetCurrentProcess();\n    for (o = s_pPendingOperations; o != NULL;) {\n        // We don't care if this fails, because the code is still accessible.\n        DWORD dwOld;\n        VirtualProtect(o->pbTarget, o->pTrampoline->cbRestore, o->dwPerm, &dwOld);\n        FlushInstructionCache(hProcess, o->pbTarget, o->pTrampoline->cbRestore);\n\n        if (o->fIsRemove && o->pTrampoline) {\n            detour_free_trampoline(o->pTrampoline);\n            o->pTrampoline = NULL;\n            freed = true;\n        }\n\n        DetourOperation *n = o->pNext;\n        delete o;\n        o = n;\n    }\n    s_pPendingOperations = NULL;\n\n    // Free any trampoline regions that are now unused.\n    if (freed && !s_fRetainRegions) {\n        detour_free_unused_trampoline_regions();\n    }\n\n    // Make sure the trampoline pages are no longer writable.\n    detour_runnable_trampoline_regions();\n\n    // Resume any suspended threads.\n    for (t = s_pPendingThreads; t != NULL;) {\n        // There is nothing we can do if this fails.\n        ResumeThread(t->hThread);\n\n        DetourThread *n = t->pNext;\n        delete t;\n        t = n;\n    }\n    s_pPendingThreads = NULL;\n    s_nPendingThreadId = 0;\n\n    if (pppFailedPointer != NULL) {\n        *pppFailedPointer = s_ppPendingError;\n    }\n\n    return s_nPendingError;\n}\n\nLONG WINAPI DetourUpdateThread(_In_ HANDLE hThread)\n{\n    LONG error;\n\n    // If any of the pending operations failed, then we don't need to do this.\n    if (s_nPendingError != NO_ERROR) {\n        return s_nPendingError;\n    }\n\n    // Silently (and safely) drop any attempt to suspend our own thread.\n    if (hThread == GetCurrentThread()) {\n        return NO_ERROR;\n    }\n\n    DetourThread *t = new NOTHROW DetourThread;\n    if (t == NULL) {\n        error = ERROR_NOT_ENOUGH_MEMORY;\n      fail:\n        if (t != NULL) {\n            delete t;\n            t = NULL;\n        }\n        s_nPendingError = error;\n        s_ppPendingError = NULL;\n        DETOUR_BREAK();\n        return error;\n    }\n\n    if (SuspendThread(hThread) == (DWORD)-1) {\n        error = GetLastError();\n        DETOUR_BREAK();\n        goto fail;\n    }\n\n    t->hThread = hThread;\n    t->pNext = s_pPendingThreads;\n    s_pPendingThreads = t;\n\n    return NO_ERROR;\n}\n\n///////////////////////////////////////////////////////////// Transacted APIs.\n//\nLONG WINAPI DetourAttach(_Inout_ PVOID *ppPointer,\n                         _In_ PVOID pDetour)\n{\n    return DetourAttachEx(ppPointer, pDetour, NULL, NULL, NULL);\n}\n\nLONG WINAPI DetourAttachEx(_Inout_ PVOID *ppPointer,\n                           _In_ PVOID pDetour,\n                           _Out_opt_ PDETOUR_TRAMPOLINE *ppRealTrampoline,\n                           _Out_opt_ PVOID *ppRealTarget,\n                           _Out_opt_ PVOID *ppRealDetour)\n{\n    LONG error = NO_ERROR;\n\n    if (ppRealTrampoline != NULL) {\n        *ppRealTrampoline = NULL;\n    }\n    if (ppRealTarget != NULL) {\n        *ppRealTarget = NULL;\n    }\n    if (ppRealDetour != NULL) {\n        *ppRealDetour = NULL;\n    }\n    if (pDetour == NULL) {\n        DETOUR_TRACE((\"empty detour\\n\"));\n        return ERROR_INVALID_PARAMETER;\n    }\n\n    if (s_nPendingThreadId != (LONG)GetCurrentThreadId()) {\n        DETOUR_TRACE((\"transaction conflict with thread id=%d\\n\", s_nPendingThreadId));\n        return ERROR_INVALID_OPERATION;\n    }\n\n    // If any of the pending operations failed, then we don't need to do this.\n    if (s_nPendingError != NO_ERROR) {\n        DETOUR_TRACE((\"pending transaction error=%d\\n\", s_nPendingError));\n        return s_nPendingError;\n    }\n\n    if (ppPointer == NULL) {\n        DETOUR_TRACE((\"ppPointer is null\\n\"));\n        return ERROR_INVALID_HANDLE;\n    }\n    if (*ppPointer == NULL) {\n        error = ERROR_INVALID_HANDLE;\n        s_nPendingError = error;\n        s_ppPendingError = ppPointer;\n        DETOUR_TRACE((\"*ppPointer is null (ppPointer=%p)\\n\", ppPointer));\n        DETOUR_BREAK();\n        return error;\n    }\n\n    PBYTE pbTarget = (PBYTE)*ppPointer;\n    PDETOUR_TRAMPOLINE pTrampoline = NULL;\n    DetourOperation *o = NULL;\n\n#ifdef DETOURS_IA64\n    PPLABEL_DESCRIPTOR ppldDetour = (PPLABEL_DESCRIPTOR)pDetour;\n    PPLABEL_DESCRIPTOR ppldTarget = (PPLABEL_DESCRIPTOR)pbTarget;\n    PVOID pDetourGlobals = NULL;\n    PVOID pTargetGlobals = NULL;\n\n    pDetour = (PBYTE)DetourCodeFromPointer(ppldDetour, &pDetourGlobals);\n    pbTarget = (PBYTE)DetourCodeFromPointer(ppldTarget, &pTargetGlobals);\n    DETOUR_TRACE((\"  ppldDetour=%p, code=%p [gp=%p]\\n\",\n                  ppldDetour, pDetour, pDetourGlobals));\n    DETOUR_TRACE((\"  ppldTarget=%p, code=%p [gp=%p]\\n\",\n                  ppldTarget, pbTarget, pTargetGlobals));\n#else // DETOURS_IA64\n    pbTarget = (PBYTE)DetourCodeFromPointer(pbTarget, NULL);\n    pDetour = DetourCodeFromPointer(pDetour, NULL);\n#endif // !DETOURS_IA64\n\n    // Don't follow a jump if its destination is the target function.\n    // This happens when the detour does nothing other than call the target.\n    if (pDetour == (PVOID)pbTarget) {\n        if (s_fIgnoreTooSmall) {\n            goto stop;\n        }\n        else {\n            DETOUR_BREAK();\n            goto fail;\n        }\n    }\n\n    if (ppRealTarget != NULL) {\n        *ppRealTarget = pbTarget;\n    }\n    if (ppRealDetour != NULL) {\n        *ppRealDetour = pDetour;\n    }\n\n    o = new NOTHROW DetourOperation;\n    if (o == NULL) {\n        error = ERROR_NOT_ENOUGH_MEMORY;\n      fail:\n        s_nPendingError = error;\n        DETOUR_BREAK();\n      stop:\n        if (pTrampoline != NULL) {\n            detour_free_trampoline(pTrampoline);\n            pTrampoline = NULL;\n            if (ppRealTrampoline != NULL) {\n                *ppRealTrampoline = NULL;\n            }\n        }\n        if (o != NULL) {\n            delete o;\n            o = NULL;\n        }\n        s_ppPendingError = ppPointer;\n        return error;\n    }\n\n    pTrampoline = detour_alloc_trampoline(pbTarget);\n    if (pTrampoline == NULL) {\n        error = ERROR_NOT_ENOUGH_MEMORY;\n        DETOUR_BREAK();\n        goto fail;\n    }\n\n    if (ppRealTrampoline != NULL) {\n        *ppRealTrampoline = pTrampoline;\n    }\n\n    DETOUR_TRACE((\"detours: pbTramp=%p, pDetour=%p\\n\", pTrampoline, pDetour));\n\n    memset(pTrampoline->rAlign, 0, sizeof(pTrampoline->rAlign));\n\n    // Determine the number of movable target instructions.\n    PBYTE pbSrc = pbTarget;\n    PBYTE pbTrampoline = pTrampoline->rbCode;\n#ifdef DETOURS_IA64\n    PBYTE pbPool = (PBYTE)(&pTrampoline->bBranchIslands + 1);\n#else\n    PBYTE pbPool = pbTrampoline + sizeof(pTrampoline->rbCode);\n#endif\n    ULONG cbTarget = 0;\n    ULONG cbJump = SIZE_OF_JMP;\n    ULONG nAlign = 0;\n\n#ifdef DETOURS_ARM\n    // On ARM, we need an extra instruction when the function isn't 32-bit aligned.\n    // Check if the existing code is another detour (or at least a similar\n    // \"ldr pc, [PC+0]\" jump.\n    if ((ULONG)pbTarget & 2) {\n        cbJump += 2;\n\n        ULONG op = fetch_thumb_opcode(pbSrc);\n        if (op == 0xbf00) {\n            op = fetch_thumb_opcode(pbSrc + 2);\n            if (op == 0xf8dff000) { // LDR PC,[PC]\n                *((PUSHORT&)pbTrampoline)++ = *((PUSHORT&)pbSrc)++;\n                *((PULONG&)pbTrampoline)++ = *((PULONG&)pbSrc)++;\n                *((PULONG&)pbTrampoline)++ = *((PULONG&)pbSrc)++;\n                cbTarget = (LONG)(pbSrc - pbTarget);\n                // We will fall through the \"while\" because cbTarget is now >= cbJump.\n            }\n        }\n    }\n    else {\n        ULONG op = fetch_thumb_opcode(pbSrc);\n        if (op == 0xf8dff000) { // LDR PC,[PC]\n            *((PULONG&)pbTrampoline)++ = *((PULONG&)pbSrc)++;\n            *((PULONG&)pbTrampoline)++ = *((PULONG&)pbSrc)++;\n            cbTarget = (LONG)(pbSrc - pbTarget);\n            // We will fall through the \"while\" because cbTarget is now >= cbJump.\n        }\n    }\n#endif\n\n    while (cbTarget < cbJump) {\n        PBYTE pbOp = pbSrc;\n        LONG lExtra = 0;\n\n        DETOUR_TRACE((\" DetourCopyInstruction(%p,%p)\\n\",\n                      pbTrampoline, pbSrc));\n        pbSrc = (PBYTE)\n            DetourCopyInstruction(pbTrampoline, (PVOID*)&pbPool, pbSrc, NULL, &lExtra);\n        DETOUR_TRACE((\" DetourCopyInstruction() = %p (%d bytes)\\n\",\n                      pbSrc, (int)(pbSrc - pbOp)));\n        pbTrampoline += (pbSrc - pbOp) + lExtra;\n        cbTarget = (LONG)(pbSrc - pbTarget);\n        pTrampoline->rAlign[nAlign].obTarget = cbTarget;\n        pTrampoline->rAlign[nAlign].obTrampoline = pbTrampoline - pTrampoline->rbCode;\n        nAlign++;\n\n        if (nAlign >= ARRAYSIZE(pTrampoline->rAlign)) {\n            break;\n        }\n\n        if (detour_does_code_end_function(pbOp)) {\n            break;\n        }\n    }\n\n    // Consume, but don't duplicate padding if it is needed and available.\n    while (cbTarget < cbJump) {\n        LONG cFiller = detour_is_code_filler(pbSrc);\n        if (cFiller == 0) {\n            break;\n        }\n\n        pbSrc += cFiller;\n        cbTarget = (LONG)(pbSrc - pbTarget);\n    }\n\n#if DETOUR_DEBUG\n    {\n        DETOUR_TRACE((\" detours: rAlign [\"));\n        LONG n = 0;\n        for (n = 0; n < ARRAYSIZE(pTrampoline->rAlign); n++) {\n            if (pTrampoline->rAlign[n].obTarget == 0 &&\n                pTrampoline->rAlign[n].obTrampoline == 0) {\n                break;\n            }\n            DETOUR_TRACE((\" %d/%d\",\n                          pTrampoline->rAlign[n].obTarget,\n                          pTrampoline->rAlign[n].obTrampoline\n                          ));\n\n        }\n        DETOUR_TRACE((\" ]\\n\"));\n    }\n#endif\n\n    if (cbTarget < cbJump || nAlign > ARRAYSIZE(pTrampoline->rAlign)) {\n        // Too few instructions.\n\n        error = ERROR_INVALID_BLOCK;\n        if (s_fIgnoreTooSmall) {\n            goto stop;\n        }\n        else {\n            DETOUR_BREAK();\n            goto fail;\n        }\n    }\n\n    if (pbTrampoline > pbPool) {\n        __debugbreak();\n    }\n\n    pTrampoline->cbCode = (BYTE)(pbTrampoline - pTrampoline->rbCode);\n    pTrampoline->cbRestore = (BYTE)cbTarget;\n    CopyMemory(pTrampoline->rbRestore, pbTarget, cbTarget);\n\n#if !defined(DETOURS_IA64)\n    if (cbTarget > sizeof(pTrampoline->rbCode) - cbJump) {\n        // Too many instructions.\n        error = ERROR_INVALID_HANDLE;\n        DETOUR_BREAK();\n        goto fail;\n    }\n#endif // !DETOURS_IA64\n\n    pTrampoline->pbRemain = pbTarget + cbTarget;\n    pTrampoline->pbDetour = (PBYTE)pDetour;\n\n#ifdef DETOURS_IA64\n    pTrampoline->ppldDetour = ppldDetour;\n    pTrampoline->ppldTarget = ppldTarget;\n    pTrampoline->pldTrampoline.EntryPoint = (UINT64)&pTrampoline->bMovlTargetGp;\n    pTrampoline->pldTrampoline.GlobalPointer = (UINT64)pDetourGlobals;\n\n    ((DETOUR_IA64_BUNDLE *)pTrampoline->rbCode)->SetStop();\n\n    pTrampoline->bMovlTargetGp.SetMovlGp((UINT64)pTargetGlobals);\n    pTrampoline->bBrlRemainEip.SetBrl((UINT64)pTrampoline->pbRemain);\n\n    // Alloc frame:      alloc r41=ar.pfs,11,0,8,0; mov r40=rp\n    pTrampoline->bAllocFrame.wide[0] = 0x00000580164d480c;\n    pTrampoline->bAllocFrame.wide[1] = 0x00c4000500000200;\n    // save r36, r37, r38.\n    pTrampoline->bSave37to39.wide[0] = 0x031021004e019001;\n    pTrampoline->bSave37to39.wide[1] = 0x8401280600420098;\n    // save r34,r35,r36: adds r47=0,r36; adds r46=0,r35; adds r45=0,r34\n    pTrampoline->bSave34to36.wide[0] = 0x02e0210048017800;\n    pTrampoline->bSave34to36.wide[1] = 0x84011005a042008c;\n    // save gp,r32,r33\"  adds r44=0,r33; adds r43=0,r32; adds r42=0,gp ;;\n    pTrampoline->bSaveGPto33.wide[0] = 0x02b0210042016001;\n    pTrampoline->bSaveGPto33.wide[1] = 0x8400080540420080;\n    // set detour GP.\n    pTrampoline->bMovlDetourGp.SetMovlGp((UINT64)pDetourGlobals);\n    // call detour:      brl.call.sptk.few rp=detour ;;\n    pTrampoline->bCallDetour.wide[0] = 0x0000000100000005;\n    pTrampoline->bCallDetour.wide[1] = 0xd000001000000000;\n    pTrampoline->bCallDetour.SetBrlTarget((UINT64)pDetour);\n    // pop frame & gp:   adds gp=0,r42; mov rp=r40,+0;; mov.i ar.pfs=r41\n    pTrampoline->bPopFrameGp.wide[0] = 0x4000210054000802;\n    pTrampoline->bPopFrameGp.wide[1] = 0x00aa029000038005;\n    // return to caller: br.ret.sptk.many rp ;;\n    pTrampoline->bReturn.wide[0] = 0x0000000100000019;\n    pTrampoline->bReturn.wide[1] = 0x0084000880000200;\n\n    DETOUR_TRACE((\"detours: &bMovlTargetGp=%p\\n\", &pTrampoline->bMovlTargetGp));\n    DETOUR_TRACE((\"detours: &bMovlDetourGp=%p\\n\", &pTrampoline->bMovlDetourGp));\n#endif // DETOURS_IA64\n\n    pbTrampoline = pTrampoline->rbCode + pTrampoline->cbCode;\n#ifdef DETOURS_X64\n    pbTrampoline = detour_gen_jmp_indirect(pbTrampoline, &pTrampoline->pbRemain);\n    pbTrampoline = detour_gen_brk(pbTrampoline, pbPool);\n#endif // DETOURS_X64\n\n#ifdef DETOURS_X86\n    pbTrampoline = detour_gen_jmp_immediate(pbTrampoline, pTrampoline->pbRemain);\n    pbTrampoline = detour_gen_brk(pbTrampoline, pbPool);\n#endif // DETOURS_X86\n\n#ifdef DETOURS_ARM\n    pbTrampoline = detour_gen_jmp_immediate(pbTrampoline, &pbPool, pTrampoline->pbRemain);\n    pbTrampoline = detour_gen_brk(pbTrampoline, pbPool);\n#endif // DETOURS_ARM\n\n#ifdef DETOURS_ARM64\n    pbTrampoline = detour_gen_jmp_immediate(pbTrampoline, &pbPool, pTrampoline->pbRemain);\n    pbTrampoline = detour_gen_brk(pbTrampoline, pbPool);\n#endif // DETOURS_ARM64\n\n    (void)pbTrampoline;\n\n    DWORD dwOld = 0;\n    if (!VirtualProtect(pbTarget, cbTarget, PAGE_EXECUTE_READWRITE, &dwOld)) {\n        error = GetLastError();\n        DETOUR_BREAK();\n        goto fail;\n    }\n\n    DETOUR_TRACE((\"detours: pbTarget=%p: \"\n                  \"%02x %02x %02x %02x \"\n                  \"%02x %02x %02x %02x \"\n                  \"%02x %02x %02x %02x\\n\",\n                  pbTarget,\n                  pbTarget[0], pbTarget[1], pbTarget[2], pbTarget[3],\n                  pbTarget[4], pbTarget[5], pbTarget[6], pbTarget[7],\n                  pbTarget[8], pbTarget[9], pbTarget[10], pbTarget[11]));\n    DETOUR_TRACE((\"detours: pbTramp =%p: \"\n                  \"%02x %02x %02x %02x \"\n                  \"%02x %02x %02x %02x \"\n                  \"%02x %02x %02x %02x\\n\",\n                  pTrampoline,\n                  pTrampoline->rbCode[0], pTrampoline->rbCode[1],\n                  pTrampoline->rbCode[2], pTrampoline->rbCode[3],\n                  pTrampoline->rbCode[4], pTrampoline->rbCode[5],\n                  pTrampoline->rbCode[6], pTrampoline->rbCode[7],\n                  pTrampoline->rbCode[8], pTrampoline->rbCode[9],\n                  pTrampoline->rbCode[10], pTrampoline->rbCode[11]));\n\n    o->fIsRemove = FALSE;\n    o->ppbPointer = (PBYTE*)ppPointer;\n    o->pTrampoline = pTrampoline;\n    o->pbTarget = pbTarget;\n    o->dwPerm = dwOld;\n    o->pNext = s_pPendingOperations;\n    s_pPendingOperations = o;\n\n    return NO_ERROR;\n}\n\nLONG WINAPI DetourDetach(_Inout_ PVOID *ppPointer,\n                         _In_ PVOID pDetour)\n{\n    LONG error = NO_ERROR;\n\n    if (s_nPendingThreadId != (LONG)GetCurrentThreadId()) {\n        return ERROR_INVALID_OPERATION;\n    }\n\n    // If any of the pending operations failed, then we don't need to do this.\n    if (s_nPendingError != NO_ERROR) {\n        return s_nPendingError;\n    }\n\n    if (pDetour == NULL) {\n        return ERROR_INVALID_PARAMETER;\n    }\n    if (ppPointer == NULL) {\n        return ERROR_INVALID_HANDLE;\n    }\n    if (*ppPointer == NULL) {\n        error = ERROR_INVALID_HANDLE;\n        s_nPendingError = error;\n        s_ppPendingError = ppPointer;\n        DETOUR_BREAK();\n        return error;\n    }\n\n    DetourOperation *o = new NOTHROW DetourOperation;\n    if (o == NULL) {\n        error = ERROR_NOT_ENOUGH_MEMORY;\n      fail:\n        s_nPendingError = error;\n        DETOUR_BREAK();\n      stop:\n        if (o != NULL) {\n            delete o;\n            o = NULL;\n        }\n        s_ppPendingError = ppPointer;\n        return error;\n    }\n\n\n#ifdef DETOURS_IA64\n    PPLABEL_DESCRIPTOR ppldTrampo = (PPLABEL_DESCRIPTOR)*ppPointer;\n    PPLABEL_DESCRIPTOR ppldDetour = (PPLABEL_DESCRIPTOR)pDetour;\n    PVOID pDetourGlobals = NULL;\n    PVOID pTrampoGlobals = NULL;\n\n    pDetour = (PBYTE)DetourCodeFromPointer(ppldDetour, &pDetourGlobals);\n    PDETOUR_TRAMPOLINE pTrampoline = (PDETOUR_TRAMPOLINE)\n        DetourCodeFromPointer(ppldTrampo, &pTrampoGlobals);\n    DETOUR_TRACE((\"  ppldDetour=%p, code=%p [gp=%p]\\n\",\n                  ppldDetour, pDetour, pDetourGlobals));\n    DETOUR_TRACE((\"  ppldTrampo=%p, code=%p [gp=%p]\\n\",\n                  ppldTrampo, pTrampoline, pTrampoGlobals));\n\n\n    DETOUR_TRACE((\"\\n\"));\n    DETOUR_TRACE((\"detours:  &pldTrampoline  =%p\\n\",\n                  &pTrampoline->pldTrampoline));\n    DETOUR_TRACE((\"detours:  &bMovlTargetGp  =%p [%p]\\n\",\n                  &pTrampoline->bMovlTargetGp,\n                  pTrampoline->bMovlTargetGp.GetMovlGp()));\n    DETOUR_TRACE((\"detours:  &rbCode         =%p [%p]\\n\",\n                  &pTrampoline->rbCode,\n                  ((DETOUR_IA64_BUNDLE&)pTrampoline->rbCode).GetBrlTarget()));\n    DETOUR_TRACE((\"detours:  &bBrlRemainEip  =%p [%p]\\n\",\n                  &pTrampoline->bBrlRemainEip,\n                  pTrampoline->bBrlRemainEip.GetBrlTarget()));\n    DETOUR_TRACE((\"detours:  &bMovlDetourGp  =%p [%p]\\n\",\n                  &pTrampoline->bMovlDetourGp,\n                  pTrampoline->bMovlDetourGp.GetMovlGp()));\n    DETOUR_TRACE((\"detours:  &bBrlDetourEip  =%p [%p]\\n\",\n                  &pTrampoline->bCallDetour,\n                  pTrampoline->bCallDetour.GetBrlTarget()));\n    DETOUR_TRACE((\"detours:  pldDetour       =%p [%p]\\n\",\n                  pTrampoline->ppldDetour->EntryPoint,\n                  pTrampoline->ppldDetour->GlobalPointer));\n    DETOUR_TRACE((\"detours:  pldTarget       =%p [%p]\\n\",\n                  pTrampoline->ppldTarget->EntryPoint,\n                  pTrampoline->ppldTarget->GlobalPointer));\n    DETOUR_TRACE((\"detours:  pbRemain        =%p\\n\",\n                  pTrampoline->pbRemain));\n    DETOUR_TRACE((\"detours:  pbDetour        =%p\\n\",\n                  pTrampoline->pbDetour));\n    DETOUR_TRACE((\"\\n\"));\n#else // !DETOURS_IA64\n    PDETOUR_TRAMPOLINE pTrampoline =\n        (PDETOUR_TRAMPOLINE)DetourCodeFromPointer(*ppPointer, NULL);\n    pDetour = DetourCodeFromPointer(pDetour, NULL);\n#endif // !DETOURS_IA64\n\n    ////////////////////////////////////// Verify that Trampoline is in place.\n    //\n    LONG cbTarget = pTrampoline->cbRestore;\n    PBYTE pbTarget = pTrampoline->pbRemain - cbTarget;\n    if (cbTarget == 0 || cbTarget > sizeof(pTrampoline->rbCode)) {\n        error = ERROR_INVALID_BLOCK;\n        if (s_fIgnoreTooSmall) {\n            goto stop;\n        }\n        else {\n            DETOUR_BREAK();\n            goto fail;\n        }\n    }\n\n    if (pTrampoline->pbDetour != pDetour) {\n        error = ERROR_INVALID_BLOCK;\n        if (s_fIgnoreTooSmall) {\n            goto stop;\n        }\n        else {\n            DETOUR_BREAK();\n            goto fail;\n        }\n    }\n\n    DWORD dwOld = 0;\n    if (!VirtualProtect(pbTarget, cbTarget,\n                        PAGE_EXECUTE_READWRITE, &dwOld)) {\n        error = GetLastError();\n        DETOUR_BREAK();\n        goto fail;\n    }\n\n    o->fIsRemove = TRUE;\n    o->ppbPointer = (PBYTE*)ppPointer;\n    o->pTrampoline = pTrampoline;\n    o->pbTarget = pbTarget;\n    o->dwPerm = dwOld;\n    o->pNext = s_pPendingOperations;\n    s_pPendingOperations = o;\n\n    return NO_ERROR;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// Helpers for manipulating page protection.\n//\n\n// For reference:\n//   PAGE_NOACCESS          0x01\n//   PAGE_READONLY          0x02\n//   PAGE_READWRITE         0x04\n//   PAGE_WRITECOPY         0x08\n//   PAGE_EXECUTE           0x10\n//   PAGE_EXECUTE_READ      0x20\n//   PAGE_EXECUTE_READWRITE 0x40\n//   PAGE_EXECUTE_WRITECOPY 0x80\n//   PAGE_GUARD             ...\n//   PAGE_NOCACHE           ...\n//   PAGE_WRITECOMBINE      ...\n\n#define DETOUR_PAGE_EXECUTE_ALL    (PAGE_EXECUTE |              \\\n                                    PAGE_EXECUTE_READ |         \\\n                                    PAGE_EXECUTE_READWRITE |    \\\n                                    PAGE_EXECUTE_WRITECOPY)\n\n#define DETOUR_PAGE_NO_EXECUTE_ALL (PAGE_NOACCESS |             \\\n                                    PAGE_READONLY |             \\\n                                    PAGE_READWRITE |            \\\n                                    PAGE_WRITECOPY)\n\n#define DETOUR_PAGE_ATTRIBUTES     (~(DETOUR_PAGE_EXECUTE_ALL | DETOUR_PAGE_NO_EXECUTE_ALL))\n\nC_ASSERT((DETOUR_PAGE_NO_EXECUTE_ALL << 4) == DETOUR_PAGE_EXECUTE_ALL);\n\nstatic DWORD DetourPageProtectAdjustExecute(_In_  DWORD dwOldProtect,\n                                            _In_  DWORD dwNewProtect)\n//  Copy EXECUTE from dwOldProtect to dwNewProtect.\n{\n    bool const fOldExecute = ((dwOldProtect & DETOUR_PAGE_EXECUTE_ALL) != 0);\n    bool const fNewExecute = ((dwNewProtect & DETOUR_PAGE_EXECUTE_ALL) != 0);\n\n    if (fOldExecute && !fNewExecute) {\n        dwNewProtect = ((dwNewProtect & DETOUR_PAGE_NO_EXECUTE_ALL) << 4)\n            | (dwNewProtect & DETOUR_PAGE_ATTRIBUTES);\n    }\n    else if (!fOldExecute && fNewExecute) {\n        dwNewProtect = ((dwNewProtect & DETOUR_PAGE_EXECUTE_ALL) >> 4)\n            | (dwNewProtect & DETOUR_PAGE_ATTRIBUTES);\n    }\n    return dwNewProtect;\n}\n\n_Success_(return != FALSE)\nBOOL WINAPI DetourVirtualProtectSameExecuteEx(_In_  HANDLE hProcess,\n                                              _In_  PVOID pAddress,\n                                              _In_  SIZE_T nSize,\n                                              _In_  DWORD dwNewProtect,\n                                              _Out_ PDWORD pdwOldProtect)\n// Some systems do not allow executability of a page to change. This function applies\n// dwNewProtect to [pAddress, nSize), but preserving the previous executability.\n// This function is meant to be a drop-in replacement for some uses of VirtualProtectEx.\n// When \"restoring\" page protection, there is no need to use this function.\n{\n    MEMORY_BASIC_INFORMATION mbi;\n\n    // Query to get existing execute access.\n\n    ZeroMemory(&mbi, sizeof(mbi));\n\n    if (VirtualQueryEx(hProcess, pAddress, &mbi, sizeof(mbi)) == 0) {\n        return FALSE;\n    }\n    return VirtualProtectEx(hProcess, pAddress, nSize,\n                            DetourPageProtectAdjustExecute(mbi.Protect, dwNewProtect),\n                            pdwOldProtect);\n}\n\n_Success_(return != FALSE)\nBOOL WINAPI DetourVirtualProtectSameExecute(_In_  PVOID pAddress,\n                                            _In_  SIZE_T nSize,\n                                            _In_  DWORD dwNewProtect,\n                                            _Out_ PDWORD pdwOldProtect)\n{\n    return DetourVirtualProtectSameExecuteEx(GetCurrentProcess(),\n                                             pAddress, nSize, dwNewProtect, pdwOldProtect);\n}\n\n//  End of File\n"
  },
  {
    "path": "ext/detours/src/detours.h",
    "content": "/////////////////////////////////////////////////////////////////////////////\n//\n//  Core Detours Functionality (detours.h of detours.lib)\n//\n//  Microsoft Research Detours Package, Version 4.0.1\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#pragma once\n#ifndef _DETOURS_H_\n#define _DETOURS_H_\n\n#define DETOURS_VERSION     0x4c0c1   // 0xMAJORcMINORcPATCH\n\n//////////////////////////////////////////////////////////////////////////////\n//\n\n#ifdef DETOURS_INTERNAL\n\n#define _CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS 1\n#define _ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE 1\n\n#pragma warning(disable:4068) // unknown pragma (suppress)\n\n#if _MSC_VER >= 1900\n#pragma warning(push)\n#pragma warning(disable:4091) // empty typedef\n#endif\n\n// Suppress declspec(dllimport) for the sake of Detours\n// users that provide kernel32 functionality themselves.\n// This is ok in the mainstream case, it will just cost\n// an extra instruction calling some functions, which\n// LTCG optimizes away.\n//\n#define _KERNEL32_ 1\n#define _USER32_ 1\n\n#include <windows.h>\n#if (_MSC_VER < 1310)\n#else\n#pragma warning(push)\n#if _MSC_VER > 1400\n#pragma warning(disable:6102 6103) // /analyze warnings\n#endif\n#include <strsafe.h>\n#pragma warning(pop)\n#endif\n\n// From winerror.h, as this error isn't found in some SDKs:\n//\n// MessageId: ERROR_DYNAMIC_CODE_BLOCKED\n//\n// MessageText:\n//\n// The operation was blocked as the process prohibits dynamic code generation.\n//\n#define ERROR_DYNAMIC_CODE_BLOCKED       1655L\n\n#endif // DETOURS_INTERNAL\n\n//////////////////////////////////////////////////////////////////////////////\n//\n\n#undef DETOURS_X64\n#undef DETOURS_X86\n#undef DETOURS_IA64\n#undef DETOURS_ARM\n#undef DETOURS_ARM64\n#undef DETOURS_BITS\n#undef DETOURS_32BIT\n#undef DETOURS_64BIT\n\n#if defined(_X86_)\n#define DETOURS_X86\n#define DETOURS_OPTION_BITS 64\n\n#elif defined(_AMD64_)\n#define DETOURS_X64\n#define DETOURS_OPTION_BITS 32\n\n#elif defined(_IA64_)\n#define DETOURS_IA64\n#define DETOURS_OPTION_BITS 32\n\n#elif defined(_ARM_)\n#define DETOURS_ARM\n\n#elif defined(_ARM64_)\n#define DETOURS_ARM64\n\n#else\n#error Unknown architecture (x86, amd64, ia64, arm, arm64)\n#endif\n\n#ifdef _WIN64\n#undef DETOURS_32BIT\n#define DETOURS_64BIT 1\n#define DETOURS_BITS 64\n// If all 64bit kernels can run one and only one 32bit architecture.\n//#define DETOURS_OPTION_BITS 32\n#else\n#define DETOURS_32BIT 1\n#undef DETOURS_64BIT\n#define DETOURS_BITS 32\n// If all 64bit kernels can run one and only one 32bit architecture.\n//#define DETOURS_OPTION_BITS 32\n#endif\n\n/////////////////////////////////////////////////////////////// Helper Macros.\n//\n#define DETOURS_STRINGIFY_(x)    #x\n#define DETOURS_STRINGIFY(x)    DETOURS_STRINGIFY_(x)\n\n#define VER_DETOURS_BITS    DETOURS_STRINGIFY(DETOURS_BITS)\n\n//////////////////////////////////////////////////////////////////////////////\n//\n\n///////////////////////////////////////////////// SAL 2.0 Annotations w/o SAL.\n//\n//  These definitions are include so that Detours will build even if the\n//  compiler doesn't have full SAL 2.0 support.\n//\n#ifndef DETOURS_DONT_REMOVE_SAL_20\n\n#ifdef DETOURS_TEST_REMOVE_SAL_20\n#undef _Analysis_assume_\n#undef _Benign_race_begin_\n#undef _Benign_race_end_\n#undef _Field_range_\n#undef _Field_size_\n#undef _In_\n#undef _In_bytecount_\n#undef _In_count_\n#undef __in_ecount\n#undef _In_opt_\n#undef _In_opt_bytecount_\n#undef _In_opt_count_\n#undef _In_opt_z_\n#undef _In_range_\n#undef _In_reads_\n#undef _In_reads_bytes_\n#undef _In_reads_opt_\n#undef _In_reads_opt_bytes_\n#undef _In_reads_or_z_\n#undef _In_z_\n#undef _Inout_\n#undef _Inout_opt_\n#undef _Inout_z_count_\n#undef _Out_\n#undef _Out_opt_\n#undef _Out_writes_\n#undef _Outptr_result_maybenull_\n#undef _Readable_bytes_\n#undef _Success_\n#undef _Writable_bytes_\n#undef _Pre_notnull_\n#endif\n\n#if defined(_Deref_out_opt_z_) && !defined(_Outptr_result_maybenull_)\n#define _Outptr_result_maybenull_ _Deref_out_opt_z_\n#endif\n\n#if defined(_In_count_) && !defined(_In_reads_)\n#define _In_reads_(x) _In_count_(x)\n#endif\n\n#if defined(_In_opt_count_) && !defined(_In_reads_opt_)\n#define _In_reads_opt_(x) _In_opt_count_(x)\n#endif\n\n#if defined(_In_opt_bytecount_) && !defined(_In_reads_opt_bytes_)\n#define _In_reads_opt_bytes_(x) _In_opt_bytecount_(x)\n#endif\n\n#if defined(_In_bytecount_) && !defined(_In_reads_bytes_)\n#define _In_reads_bytes_(x) _In_bytecount_(x)\n#endif\n\n#ifndef _In_\n#define _In_\n#endif\n\n#ifndef _In_bytecount_\n#define _In_bytecount_(x)\n#endif\n\n#ifndef _In_count_\n#define _In_count_(x)\n#endif\n\n#ifndef __in_ecount\n#define __in_ecount(x)\n#endif\n\n#ifndef _In_opt_\n#define _In_opt_\n#endif\n\n#ifndef _In_opt_bytecount_\n#define _In_opt_bytecount_(x)\n#endif\n\n#ifndef _In_opt_count_\n#define _In_opt_count_(x)\n#endif\n\n#ifndef _In_opt_z_\n#define _In_opt_z_\n#endif\n\n#ifndef _In_range_\n#define _In_range_(x,y)\n#endif\n\n#ifndef _In_reads_\n#define _In_reads_(x)\n#endif\n\n#ifndef _In_reads_bytes_\n#define _In_reads_bytes_(x)\n#endif\n\n#ifndef _In_reads_opt_\n#define _In_reads_opt_(x)\n#endif\n\n#ifndef _In_reads_opt_bytes_\n#define _In_reads_opt_bytes_(x)\n#endif\n\n#ifndef _In_reads_or_z_\n#define _In_reads_or_z_\n#endif\n\n#ifndef _In_z_\n#define _In_z_\n#endif\n\n#ifndef _Inout_\n#define _Inout_\n#endif\n\n#ifndef _Inout_opt_\n#define _Inout_opt_\n#endif\n\n#ifndef _Inout_z_count_\n#define _Inout_z_count_(x)\n#endif\n\n#ifndef _Out_\n#define _Out_\n#endif\n\n#ifndef _Out_opt_\n#define _Out_opt_\n#endif\n\n#ifndef _Out_writes_\n#define _Out_writes_(x)\n#endif\n\n#ifndef _Outptr_result_maybenull_\n#define _Outptr_result_maybenull_\n#endif\n\n#ifndef _Writable_bytes_\n#define _Writable_bytes_(x)\n#endif\n\n#ifndef _Readable_bytes_\n#define _Readable_bytes_(x)\n#endif\n\n#ifndef _Success_\n#define _Success_(x)\n#endif\n\n#ifndef _Pre_notnull_\n#define _Pre_notnull_\n#endif\n\n#ifdef DETOURS_INTERNAL\n\n#pragma warning(disable:4615) // unknown warning type (suppress with older compilers)\n\n#ifndef _Benign_race_begin_\n#define _Benign_race_begin_\n#endif\n\n#ifndef _Benign_race_end_\n#define _Benign_race_end_\n#endif\n\n#ifndef _Field_size_\n#define _Field_size_(x)\n#endif\n\n#ifndef _Field_range_\n#define _Field_range_(x,y)\n#endif\n\n#ifndef _Analysis_assume_\n#define _Analysis_assume_(x)\n#endif\n\n#endif // DETOURS_INTERNAL\n#endif // DETOURS_DONT_REMOVE_SAL_20\n\n//////////////////////////////////////////////////////////////////////////////\n//\n#ifndef GUID_DEFINED\n#define GUID_DEFINED\ntypedef struct  _GUID\n{\n    DWORD Data1;\n    WORD Data2;\n    WORD Data3;\n    BYTE Data4[ 8 ];\n} GUID;\n\n#ifdef INITGUID\n#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \\\n        const GUID name \\\n                = { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } }\n#else\n#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \\\n    const GUID name\n#endif // INITGUID\n#endif // !GUID_DEFINED\n\n#if defined(__cplusplus)\n#ifndef _REFGUID_DEFINED\n#define _REFGUID_DEFINED\n#define REFGUID             const GUID &\n#endif // !_REFGUID_DEFINED\n#else // !__cplusplus\n#ifndef _REFGUID_DEFINED\n#define _REFGUID_DEFINED\n#define REFGUID             const GUID * const\n#endif // !_REFGUID_DEFINED\n#endif // !__cplusplus\n\n#ifndef ARRAYSIZE\n#define ARRAYSIZE(x)    (sizeof(x)/sizeof(x[0]))\n#endif\n\n//\n//////////////////////////////////////////////////////////////////////////////\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif // __cplusplus\n\n/////////////////////////////////////////////////// Instruction Target Macros.\n//\n#define DETOUR_INSTRUCTION_TARGET_NONE          ((PVOID)0)\n#define DETOUR_INSTRUCTION_TARGET_DYNAMIC       ((PVOID)(LONG_PTR)-1)\n#define DETOUR_SECTION_HEADER_SIGNATURE         0x00727444   // \"Dtr\\0\"\n\nextern const GUID DETOUR_EXE_RESTORE_GUID;\nextern const GUID DETOUR_EXE_HELPER_GUID;\n\n#define DETOUR_TRAMPOLINE_SIGNATURE             0x21727444  // Dtr!\ntypedef struct _DETOUR_TRAMPOLINE DETOUR_TRAMPOLINE, *PDETOUR_TRAMPOLINE;\n\n/////////////////////////////////////////////////////////// Binary Structures.\n//\n#pragma pack(push, 8)\ntypedef struct _DETOUR_SECTION_HEADER\n{\n    DWORD       cbHeaderSize;\n    DWORD       nSignature;\n    DWORD       nDataOffset;\n    DWORD       cbDataSize;\n\n    DWORD       nOriginalImportVirtualAddress;\n    DWORD       nOriginalImportSize;\n    DWORD       nOriginalBoundImportVirtualAddress;\n    DWORD       nOriginalBoundImportSize;\n\n    DWORD       nOriginalIatVirtualAddress;\n    DWORD       nOriginalIatSize;\n    DWORD       nOriginalSizeOfImage;\n    DWORD       cbPrePE;\n\n    DWORD       nOriginalClrFlags;\n    DWORD       reserved1;\n    DWORD       reserved2;\n    DWORD       reserved3;\n\n    // Followed by cbPrePE bytes of data.\n} DETOUR_SECTION_HEADER, *PDETOUR_SECTION_HEADER;\n\ntypedef struct _DETOUR_SECTION_RECORD\n{\n    DWORD       cbBytes;\n    DWORD       nReserved;\n    GUID        guid;\n} DETOUR_SECTION_RECORD, *PDETOUR_SECTION_RECORD;\n\ntypedef struct _DETOUR_CLR_HEADER\n{\n    // Header versioning\n    ULONG                   cb;\n    USHORT                  MajorRuntimeVersion;\n    USHORT                  MinorRuntimeVersion;\n\n    // Symbol table and startup information\n    IMAGE_DATA_DIRECTORY    MetaData;\n    ULONG                   Flags;\n\n    // Followed by the rest of the IMAGE_COR20_HEADER\n} DETOUR_CLR_HEADER, *PDETOUR_CLR_HEADER;\n\ntypedef struct _DETOUR_EXE_RESTORE\n{\n    DWORD               cb;\n    DWORD               cbidh;\n    DWORD               cbinh;\n    DWORD               cbclr;\n\n    PBYTE               pidh;\n    PBYTE               pinh;\n    PBYTE               pclr;\n\n    IMAGE_DOS_HEADER    idh;\n    union {\n        IMAGE_NT_HEADERS    inh;        // all environments have this\n#ifdef IMAGE_NT_OPTIONAL_HDR32_MAGIC    // some environments do not have this\n        IMAGE_NT_HEADERS32  inh32;\n#endif\n#ifdef IMAGE_NT_OPTIONAL_HDR64_MAGIC    // some environments do not have this\n        IMAGE_NT_HEADERS64  inh64;\n#endif\n#ifdef IMAGE_NT_OPTIONAL_HDR64_MAGIC    // some environments do not have this\n        BYTE                raw[sizeof(IMAGE_NT_HEADERS64) +\n                                sizeof(IMAGE_SECTION_HEADER) * 32];\n#else\n        BYTE                raw[0x108 + sizeof(IMAGE_SECTION_HEADER) * 32];\n#endif\n    };\n    DETOUR_CLR_HEADER   clr;\n\n} DETOUR_EXE_RESTORE, *PDETOUR_EXE_RESTORE;\n\n#ifdef IMAGE_NT_OPTIONAL_HDR64_MAGIC\nC_ASSERT(sizeof(IMAGE_NT_HEADERS64) == 0x108);\n#endif\n\n// The size can change, but assert for clarity due to the muddying #ifdefs.\n#ifdef _WIN64\nC_ASSERT(sizeof(DETOUR_EXE_RESTORE) == 0x688);\n#else\nC_ASSERT(sizeof(DETOUR_EXE_RESTORE) == 0x678);\n#endif\n\ntypedef struct _DETOUR_EXE_HELPER\n{\n    DWORD               cb;\n    DWORD               pid;\n    DWORD               nDlls;\n    CHAR                rDlls[4];\n} DETOUR_EXE_HELPER, *PDETOUR_EXE_HELPER;\n\n#pragma pack(pop)\n\n#define DETOUR_SECTION_HEADER_DECLARE(cbSectionSize) \\\n{ \\\n      sizeof(DETOUR_SECTION_HEADER),\\\n      DETOUR_SECTION_HEADER_SIGNATURE,\\\n      sizeof(DETOUR_SECTION_HEADER),\\\n      (cbSectionSize),\\\n      \\\n      0,\\\n      0,\\\n      0,\\\n      0,\\\n      \\\n      0,\\\n      0,\\\n      0,\\\n      0,\\\n}\n\n///////////////////////////////////////////////////////////// Binary Typedefs.\n//\ntypedef BOOL (CALLBACK *PF_DETOUR_BINARY_BYWAY_CALLBACK)(\n    _In_opt_ PVOID pContext,\n    _In_opt_ LPCSTR pszFile,\n    _Outptr_result_maybenull_ LPCSTR *ppszOutFile);\n\ntypedef BOOL (CALLBACK *PF_DETOUR_BINARY_FILE_CALLBACK)(\n    _In_opt_ PVOID pContext,\n    _In_ LPCSTR pszOrigFile,\n    _In_ LPCSTR pszFile,\n    _Outptr_result_maybenull_ LPCSTR *ppszOutFile);\n\ntypedef BOOL (CALLBACK *PF_DETOUR_BINARY_SYMBOL_CALLBACK)(\n    _In_opt_ PVOID pContext,\n    _In_ ULONG nOrigOrdinal,\n    _In_ ULONG nOrdinal,\n    _Out_ ULONG *pnOutOrdinal,\n    _In_opt_ LPCSTR pszOrigSymbol,\n    _In_opt_ LPCSTR pszSymbol,\n    _Outptr_result_maybenull_ LPCSTR *ppszOutSymbol);\n\ntypedef BOOL (CALLBACK *PF_DETOUR_BINARY_COMMIT_CALLBACK)(\n    _In_opt_ PVOID pContext);\n\ntypedef BOOL (CALLBACK *PF_DETOUR_ENUMERATE_EXPORT_CALLBACK)(_In_opt_ PVOID pContext,\n                                                             _In_ ULONG nOrdinal,\n                                                             _In_opt_ LPCSTR pszName,\n                                                             _In_opt_ PVOID pCode);\n\ntypedef BOOL (CALLBACK *PF_DETOUR_IMPORT_FILE_CALLBACK)(_In_opt_ PVOID pContext,\n                                                        _In_opt_ HMODULE hModule,\n                                                        _In_opt_ LPCSTR pszFile);\n\ntypedef BOOL (CALLBACK *PF_DETOUR_IMPORT_FUNC_CALLBACK)(_In_opt_ PVOID pContext,\n                                                        _In_ DWORD nOrdinal,\n                                                        _In_opt_ LPCSTR pszFunc,\n                                                        _In_opt_ PVOID pvFunc);\n\n// Same as PF_DETOUR_IMPORT_FUNC_CALLBACK but extra indirection on last parameter.\ntypedef BOOL (CALLBACK *PF_DETOUR_IMPORT_FUNC_CALLBACK_EX)(_In_opt_ PVOID pContext,\n                                                           _In_ DWORD nOrdinal,\n                                                           _In_opt_ LPCSTR pszFunc,\n                                                           _In_opt_ PVOID* ppvFunc);\n\ntypedef VOID * PDETOUR_BINARY;\ntypedef VOID * PDETOUR_LOADED_BINARY;\n\n//////////////////////////////////////////////////////////// Transaction APIs.\n//\nLONG WINAPI DetourTransactionBegin(VOID);\nLONG WINAPI DetourTransactionAbort(VOID);\nLONG WINAPI DetourTransactionCommit(VOID);\nLONG WINAPI DetourTransactionCommitEx(_Out_opt_ PVOID **pppFailedPointer);\n\nLONG WINAPI DetourUpdateThread(_In_ HANDLE hThread);\n\nLONG WINAPI DetourAttach(_Inout_ PVOID *ppPointer,\n                         _In_ PVOID pDetour);\n\nLONG WINAPI DetourAttachEx(_Inout_ PVOID *ppPointer,\n                           _In_ PVOID pDetour,\n                           _Out_opt_ PDETOUR_TRAMPOLINE *ppRealTrampoline,\n                           _Out_opt_ PVOID *ppRealTarget,\n                           _Out_opt_ PVOID *ppRealDetour);\n\nLONG WINAPI DetourDetach(_Inout_ PVOID *ppPointer,\n                         _In_ PVOID pDetour);\n\nBOOL WINAPI DetourSetIgnoreTooSmall(_In_ BOOL fIgnore);\nBOOL WINAPI DetourSetRetainRegions(_In_ BOOL fRetain);\nPVOID WINAPI DetourSetSystemRegionLowerBound(_In_ PVOID pSystemRegionLowerBound);\nPVOID WINAPI DetourSetSystemRegionUpperBound(_In_ PVOID pSystemRegionUpperBound);\n\n////////////////////////////////////////////////////////////// Code Functions.\n//\nPVOID WINAPI DetourFindFunction(_In_ LPCSTR pszModule,\n                                _In_ LPCSTR pszFunction);\nPVOID WINAPI DetourCodeFromPointer(_In_ PVOID pPointer,\n                                   _Out_opt_ PVOID *ppGlobals);\nPVOID WINAPI DetourCopyInstruction(_In_opt_ PVOID pDst,\n                                   _Inout_opt_ PVOID *ppDstPool,\n                                   _In_ PVOID pSrc,\n                                   _Out_opt_ PVOID *ppTarget,\n                                   _Out_opt_ LONG *plExtra);\nBOOL WINAPI DetourSetCodeModule(_In_ HMODULE hModule,\n                                _In_ BOOL fLimitReferencesToModule);\nPVOID WINAPI DetourAllocateRegionWithinJumpBounds(_In_ LPCVOID pbTarget,\n                                                  _Out_ PDWORD pcbAllocatedSize);\n\n///////////////////////////////////////////////////// Loaded Binary Functions.\n//\nHMODULE WINAPI DetourGetContainingModule(_In_ PVOID pvAddr);\nHMODULE WINAPI DetourEnumerateModules(_In_opt_ HMODULE hModuleLast);\nPVOID WINAPI DetourGetEntryPoint(_In_opt_ HMODULE hModule);\nULONG WINAPI DetourGetModuleSize(_In_opt_ HMODULE hModule);\nBOOL WINAPI DetourEnumerateExports(_In_ HMODULE hModule,\n                                   _In_opt_ PVOID pContext,\n                                   _In_ PF_DETOUR_ENUMERATE_EXPORT_CALLBACK pfExport);\nBOOL WINAPI DetourEnumerateImports(_In_opt_ HMODULE hModule,\n                                   _In_opt_ PVOID pContext,\n                                   _In_opt_ PF_DETOUR_IMPORT_FILE_CALLBACK pfImportFile,\n                                   _In_opt_ PF_DETOUR_IMPORT_FUNC_CALLBACK pfImportFunc);\n\nBOOL WINAPI DetourEnumerateImportsEx(_In_opt_ HMODULE hModule,\n                                     _In_opt_ PVOID pContext,\n                                     _In_opt_ PF_DETOUR_IMPORT_FILE_CALLBACK pfImportFile,\n                                     _In_opt_ PF_DETOUR_IMPORT_FUNC_CALLBACK_EX pfImportFuncEx);\n\n_Writable_bytes_(*pcbData)\n_Readable_bytes_(*pcbData)\n_Success_(return != NULL)\nPVOID WINAPI DetourFindPayload(_In_opt_ HMODULE hModule,\n                               _In_ REFGUID rguid,\n                               _Out_ DWORD *pcbData);\n\n_Writable_bytes_(*pcbData)\n_Readable_bytes_(*pcbData)\n_Success_(return != NULL)\nPVOID WINAPI DetourFindPayloadEx(_In_ REFGUID rguid,\n                                 _Out_ DWORD * pcbData);\n\nDWORD WINAPI DetourGetSizeOfPayloads(_In_opt_ HMODULE hModule);\n\n///////////////////////////////////////////////// Persistent Binary Functions.\n//\n\nPDETOUR_BINARY WINAPI DetourBinaryOpen(_In_ HANDLE hFile);\n\n_Writable_bytes_(*pcbData)\n_Readable_bytes_(*pcbData)\n_Success_(return != NULL)\nPVOID WINAPI DetourBinaryEnumeratePayloads(_In_ PDETOUR_BINARY pBinary,\n                                           _Out_opt_ GUID *pGuid,\n                                           _Out_ DWORD *pcbData,\n                                           _Inout_ DWORD *pnIterator);\n\n_Writable_bytes_(*pcbData)\n_Readable_bytes_(*pcbData)\n_Success_(return != NULL)\nPVOID WINAPI DetourBinaryFindPayload(_In_ PDETOUR_BINARY pBinary,\n                                     _In_ REFGUID rguid,\n                                     _Out_ DWORD *pcbData);\n\nPVOID WINAPI DetourBinarySetPayload(_In_ PDETOUR_BINARY pBinary,\n                                    _In_ REFGUID rguid,\n                                    _In_reads_opt_(cbData) PVOID pData,\n                                    _In_ DWORD cbData);\nBOOL WINAPI DetourBinaryDeletePayload(_In_ PDETOUR_BINARY pBinary, _In_ REFGUID rguid);\nBOOL WINAPI DetourBinaryPurgePayloads(_In_ PDETOUR_BINARY pBinary);\nBOOL WINAPI DetourBinaryResetImports(_In_ PDETOUR_BINARY pBinary);\nBOOL WINAPI DetourBinaryEditImports(_In_ PDETOUR_BINARY pBinary,\n                                    _In_opt_ PVOID pContext,\n                                    _In_opt_ PF_DETOUR_BINARY_BYWAY_CALLBACK pfByway,\n                                    _In_opt_ PF_DETOUR_BINARY_FILE_CALLBACK pfFile,\n                                    _In_opt_ PF_DETOUR_BINARY_SYMBOL_CALLBACK pfSymbol,\n                                    _In_opt_ PF_DETOUR_BINARY_COMMIT_CALLBACK pfCommit);\nBOOL WINAPI DetourBinaryWrite(_In_ PDETOUR_BINARY pBinary, _In_ HANDLE hFile);\nBOOL WINAPI DetourBinaryClose(_In_ PDETOUR_BINARY pBinary);\n\n/////////////////////////////////////////////////// Create Process & Load Dll.\n//\ntypedef BOOL (WINAPI *PDETOUR_CREATE_PROCESS_ROUTINEA)(\n    _In_opt_ LPCSTR lpApplicationName,\n    _Inout_opt_ LPSTR lpCommandLine,\n    _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,\n    _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,\n    _In_ BOOL bInheritHandles,\n    _In_ DWORD dwCreationFlags,\n    _In_opt_ LPVOID lpEnvironment,\n    _In_opt_ LPCSTR lpCurrentDirectory,\n    _In_ LPSTARTUPINFOA lpStartupInfo,\n    _Out_ LPPROCESS_INFORMATION lpProcessInformation);\n\ntypedef BOOL (WINAPI *PDETOUR_CREATE_PROCESS_ROUTINEW)(\n    _In_opt_ LPCWSTR lpApplicationName,\n    _Inout_opt_ LPWSTR lpCommandLine,\n    _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,\n    _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,\n    _In_ BOOL bInheritHandles,\n    _In_ DWORD dwCreationFlags,\n    _In_opt_ LPVOID lpEnvironment,\n    _In_opt_ LPCWSTR lpCurrentDirectory,\n    _In_ LPSTARTUPINFOW lpStartupInfo,\n    _Out_ LPPROCESS_INFORMATION lpProcessInformation);\n\nBOOL WINAPI DetourCreateProcessWithDllA(_In_opt_ LPCSTR lpApplicationName,\n                                        _Inout_opt_ LPSTR lpCommandLine,\n                                        _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                        _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                        _In_ BOOL bInheritHandles,\n                                        _In_ DWORD dwCreationFlags,\n                                        _In_opt_ LPVOID lpEnvironment,\n                                        _In_opt_ LPCSTR lpCurrentDirectory,\n                                        _In_ LPSTARTUPINFOA lpStartupInfo,\n                                        _Out_ LPPROCESS_INFORMATION lpProcessInformation,\n                                        _In_ LPCSTR lpDllName,\n                                        _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEA pfCreateProcessA);\n\nBOOL WINAPI DetourCreateProcessWithDllW(_In_opt_ LPCWSTR lpApplicationName,\n                                        _Inout_opt_ LPWSTR lpCommandLine,\n                                        _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                        _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                        _In_ BOOL bInheritHandles,\n                                        _In_ DWORD dwCreationFlags,\n                                        _In_opt_ LPVOID lpEnvironment,\n                                        _In_opt_ LPCWSTR lpCurrentDirectory,\n                                        _In_ LPSTARTUPINFOW lpStartupInfo,\n                                        _Out_ LPPROCESS_INFORMATION lpProcessInformation,\n                                        _In_ LPCSTR lpDllName,\n                                        _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEW pfCreateProcessW);\n\n#ifdef UNICODE\n#define DetourCreateProcessWithDll      DetourCreateProcessWithDllW\n#define PDETOUR_CREATE_PROCESS_ROUTINE  PDETOUR_CREATE_PROCESS_ROUTINEW\n#else\n#define DetourCreateProcessWithDll      DetourCreateProcessWithDllA\n#define PDETOUR_CREATE_PROCESS_ROUTINE  PDETOUR_CREATE_PROCESS_ROUTINEA\n#endif // !UNICODE\n\nBOOL WINAPI DetourCreateProcessWithDllExA(_In_opt_ LPCSTR lpApplicationName,\n                                          _Inout_opt_ LPSTR lpCommandLine,\n                                          _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                          _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                          _In_ BOOL bInheritHandles,\n                                          _In_ DWORD dwCreationFlags,\n                                          _In_opt_ LPVOID lpEnvironment,\n                                          _In_opt_ LPCSTR lpCurrentDirectory,\n                                          _In_ LPSTARTUPINFOA lpStartupInfo,\n                                          _Out_ LPPROCESS_INFORMATION lpProcessInformation,\n                                          _In_ LPCSTR lpDllName,\n                                          _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEA pfCreateProcessA);\n\nBOOL WINAPI DetourCreateProcessWithDllExW(_In_opt_ LPCWSTR lpApplicationName,\n                                          _Inout_opt_  LPWSTR lpCommandLine,\n                                          _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                          _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                          _In_ BOOL bInheritHandles,\n                                          _In_ DWORD dwCreationFlags,\n                                          _In_opt_ LPVOID lpEnvironment,\n                                          _In_opt_ LPCWSTR lpCurrentDirectory,\n                                          _In_ LPSTARTUPINFOW lpStartupInfo,\n                                          _Out_ LPPROCESS_INFORMATION lpProcessInformation,\n                                          _In_ LPCSTR lpDllName,\n                                          _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEW pfCreateProcessW);\n\n#ifdef UNICODE\n#define DetourCreateProcessWithDllEx    DetourCreateProcessWithDllExW\n#else\n#define DetourCreateProcessWithDllEx    DetourCreateProcessWithDllExA\n#endif // !UNICODE\n\nBOOL WINAPI DetourCreateProcessWithDllsA(_In_opt_ LPCSTR lpApplicationName,\n                                         _Inout_opt_ LPSTR lpCommandLine,\n                                         _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                         _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                         _In_ BOOL bInheritHandles,\n                                         _In_ DWORD dwCreationFlags,\n                                         _In_opt_ LPVOID lpEnvironment,\n                                         _In_opt_ LPCSTR lpCurrentDirectory,\n                                         _In_ LPSTARTUPINFOA lpStartupInfo,\n                                         _Out_ LPPROCESS_INFORMATION lpProcessInformation,\n                                         _In_ DWORD nDlls,\n                                         _In_reads_(nDlls) LPCSTR *rlpDlls,\n                                         _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEA pfCreateProcessA);\n\nBOOL WINAPI DetourCreateProcessWithDllsW(_In_opt_ LPCWSTR lpApplicationName,\n                                         _Inout_opt_ LPWSTR lpCommandLine,\n                                         _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,\n                                         _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,\n                                         _In_ BOOL bInheritHandles,\n                                         _In_ DWORD dwCreationFlags,\n                                         _In_opt_ LPVOID lpEnvironment,\n                                         _In_opt_ LPCWSTR lpCurrentDirectory,\n                                         _In_ LPSTARTUPINFOW lpStartupInfo,\n                                         _Out_ LPPROCESS_INFORMATION lpProcessInformation,\n                                         _In_ DWORD nDlls,\n                                         _In_reads_(nDlls) LPCSTR *rlpDlls,\n                                         _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEW pfCreateProcessW);\n\n#ifdef UNICODE\n#define DetourCreateProcessWithDlls     DetourCreateProcessWithDllsW\n#else\n#define DetourCreateProcessWithDlls     DetourCreateProcessWithDllsA\n#endif // !UNICODE\n\nBOOL WINAPI DetourProcessViaHelperA(_In_ DWORD dwTargetPid,\n                                    _In_ LPCSTR lpDllName,\n                                    _In_ PDETOUR_CREATE_PROCESS_ROUTINEA pfCreateProcessA);\n\nBOOL WINAPI DetourProcessViaHelperW(_In_ DWORD dwTargetPid,\n                                    _In_ LPCSTR lpDllName,\n                                    _In_ PDETOUR_CREATE_PROCESS_ROUTINEW pfCreateProcessW);\n\n#ifdef UNICODE\n#define DetourProcessViaHelper          DetourProcessViaHelperW\n#else\n#define DetourProcessViaHelper          DetourProcessViaHelperA\n#endif // !UNICODE\n\nBOOL WINAPI DetourProcessViaHelperDllsA(_In_ DWORD dwTargetPid,\n                                        _In_ DWORD nDlls,\n                                        _In_reads_(nDlls) LPCSTR *rlpDlls,\n                                        _In_ PDETOUR_CREATE_PROCESS_ROUTINEA pfCreateProcessA);\n\nBOOL WINAPI DetourProcessViaHelperDllsW(_In_ DWORD dwTargetPid,\n                                        _In_ DWORD nDlls,\n                                        _In_reads_(nDlls) LPCSTR *rlpDlls,\n                                        _In_ PDETOUR_CREATE_PROCESS_ROUTINEW pfCreateProcessW);\n\n#ifdef UNICODE\n#define DetourProcessViaHelperDlls      DetourProcessViaHelperDllsW\n#else\n#define DetourProcessViaHelperDlls      DetourProcessViaHelperDllsA\n#endif // !UNICODE\n\nBOOL WINAPI DetourUpdateProcessWithDll(_In_ HANDLE hProcess,\n                                       _In_reads_(nDlls) LPCSTR *rlpDlls,\n                                       _In_ DWORD nDlls);\n\nBOOL WINAPI DetourUpdateProcessWithDllEx(_In_ HANDLE hProcess,\n                                         _In_ HMODULE hImage,\n                                         _In_ BOOL bIs32Bit,\n                                         _In_reads_(nDlls) LPCSTR *rlpDlls,\n                                         _In_ DWORD nDlls);\n\nBOOL WINAPI DetourCopyPayloadToProcess(_In_ HANDLE hProcess,\n                                       _In_ REFGUID rguid,\n                                       _In_reads_bytes_(cbData) PVOID pvData,\n                                       _In_ DWORD cbData);\nBOOL WINAPI DetourRestoreAfterWith(VOID);\nBOOL WINAPI DetourRestoreAfterWithEx(_In_reads_bytes_(cbData) PVOID pvData,\n                                     _In_ DWORD cbData);\nBOOL WINAPI DetourIsHelperProcess(VOID);\nVOID CALLBACK DetourFinishHelperProcess(_In_ HWND,\n                                        _In_ HINSTANCE,\n                                        _In_ LPSTR,\n                                        _In_ INT);\n\n//\n//////////////////////////////////////////////////////////////////////////////\n#ifdef __cplusplus\n}\n#endif // __cplusplus\n\n//////////////////////////////////////////////// Detours Internal Definitions.\n//\n#ifdef __cplusplus\n#ifdef DETOURS_INTERNAL\n\n#define NOTHROW\n// #define NOTHROW (nothrow)\n\n//////////////////////////////////////////////////////////////////////////////\n//\n#pragma warning(push)\n#pragma warning(disable:4091) // empty typedef\n#include <dbghelp.h>\n#pragma warning(pop)\n\n#ifdef IMAGEAPI // defined by DBGHELP.H\ntypedef LPAPI_VERSION (NTAPI *PF_ImagehlpApiVersionEx)(_In_ LPAPI_VERSION AppVersion);\n\ntypedef BOOL (NTAPI *PF_SymInitialize)(_In_ HANDLE hProcess,\n                                       _In_opt_ LPCSTR UserSearchPath,\n                                       _In_ BOOL fInvadeProcess);\ntypedef DWORD (NTAPI *PF_SymSetOptions)(_In_ DWORD SymOptions);\ntypedef DWORD (NTAPI *PF_SymGetOptions)(VOID);\ntypedef DWORD64 (NTAPI *PF_SymLoadModule64)(_In_ HANDLE hProcess,\n                                            _In_opt_ HANDLE hFile,\n                                            _In_ LPSTR ImageName,\n                                            _In_opt_ LPSTR ModuleName,\n                                            _In_ DWORD64 BaseOfDll,\n                                            _In_opt_ DWORD SizeOfDll);\ntypedef BOOL (NTAPI *PF_SymGetModuleInfo64)(_In_ HANDLE hProcess,\n                                            _In_ DWORD64 qwAddr,\n                                            _Out_ PIMAGEHLP_MODULE64 ModuleInfo);\ntypedef BOOL (NTAPI *PF_SymFromName)(_In_ HANDLE hProcess,\n                                     _In_ LPSTR Name,\n                                     _Out_ PSYMBOL_INFO Symbol);\n\ntypedef struct _DETOUR_SYM_INFO\n{\n    HANDLE                  hProcess;\n    HMODULE                 hDbgHelp;\n    PF_ImagehlpApiVersionEx pfImagehlpApiVersionEx;\n    PF_SymInitialize        pfSymInitialize;\n    PF_SymSetOptions        pfSymSetOptions;\n    PF_SymGetOptions        pfSymGetOptions;\n    PF_SymLoadModule64      pfSymLoadModule64;\n    PF_SymGetModuleInfo64   pfSymGetModuleInfo64;\n    PF_SymFromName          pfSymFromName;\n} DETOUR_SYM_INFO, *PDETOUR_SYM_INFO;\n\nPDETOUR_SYM_INFO DetourLoadImageHlp(VOID);\n\n#endif // IMAGEAPI\n\n#if defined(_INC_STDIO) && !defined(_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS)\n#error detours.h must be included before stdio.h (or at least define _CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS earlier)\n#endif\n#define _CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS 1\n\n#ifndef DETOUR_TRACE\n#if DETOUR_DEBUG\n#define DETOUR_TRACE(x) printf x\n#define DETOUR_BREAK()  __debugbreak()\n#include <stdio.h>\n#include <limits.h>\n#else\n#define DETOUR_TRACE(x)\n#define DETOUR_BREAK()\n#endif\n#endif\n\n#if 1 || defined(DETOURS_IA64)\n\n//\n// IA64 instructions are 41 bits, 3 per bundle, plus 5 bit bundle template => 128 bits per bundle.\n//\n\n#define DETOUR_IA64_INSTRUCTIONS_PER_BUNDLE (3)\n\n#define DETOUR_IA64_TEMPLATE_OFFSET (0)\n#define DETOUR_IA64_TEMPLATE_SIZE   (5)\n\n#define DETOUR_IA64_INSTRUCTION_SIZE (41)\n#define DETOUR_IA64_INSTRUCTION0_OFFSET (DETOUR_IA64_TEMPLATE_SIZE)\n#define DETOUR_IA64_INSTRUCTION1_OFFSET (DETOUR_IA64_TEMPLATE_SIZE + DETOUR_IA64_INSTRUCTION_SIZE)\n#define DETOUR_IA64_INSTRUCTION2_OFFSET (DETOUR_IA64_TEMPLATE_SIZE + DETOUR_IA64_INSTRUCTION_SIZE + DETOUR_IA64_INSTRUCTION_SIZE)\n\nC_ASSERT(DETOUR_IA64_TEMPLATE_SIZE + DETOUR_IA64_INSTRUCTIONS_PER_BUNDLE * DETOUR_IA64_INSTRUCTION_SIZE == 128);\n\n__declspec(align(16)) struct DETOUR_IA64_BUNDLE\n{\n  public:\n    union\n    {\n        BYTE    data[16];\n        UINT64  wide[2];\n    };\n\n    enum {\n        A_UNIT  = 1u,\n        I_UNIT  = 2u,\n        M_UNIT  = 3u,\n        B_UNIT  = 4u,\n        F_UNIT  = 5u,\n        L_UNIT  = 6u,\n        X_UNIT  = 7u,\n    };\n    struct DETOUR_IA64_METADATA\n    {\n        ULONG       nTemplate       : 8;    // Instruction template.\n        ULONG       nUnit0          : 4;    // Unit for slot 0\n        ULONG       nUnit1          : 4;    // Unit for slot 1\n        ULONG       nUnit2          : 4;    // Unit for slot 2\n    };\n\n  protected:\n    static const DETOUR_IA64_METADATA s_rceCopyTable[33];\n\n    UINT RelocateBundle(_Inout_ DETOUR_IA64_BUNDLE* pDst, _Inout_opt_ DETOUR_IA64_BUNDLE* pBundleExtra) const;\n\n    bool RelocateInstruction(_Inout_ DETOUR_IA64_BUNDLE* pDst,\n                             _In_ BYTE slot,\n                             _Inout_opt_ DETOUR_IA64_BUNDLE* pBundleExtra) const;\n\n    // 120 112 104 96 88 80 72 64 56 48 40 32 24 16  8  0\n    //  f.  e.  d. c. b. a. 9. 8. 7. 6. 5. 4. 3. 2. 1. 0.\n\n    //                                      00\n    // f.e. d.c. b.a. 9.8. 7.6. 5.4. 3.2. 1.0.\n    // 0000 0000 0000 0000 0000 0000 0000 001f : Template [4..0]\n    // 0000 0000 0000 0000 0000 03ff ffff ffe0 : Zero [ 41..  5]\n    // 0000 0000 0000 0000 0000 3c00 0000 0000 : Zero [ 45.. 42]\n    // 0000 0000 0007 ffff ffff c000 0000 0000 : One  [ 82.. 46]\n    // 0000 0000 0078 0000 0000 0000 0000 0000 : One  [ 86.. 83]\n    // 0fff ffff ff80 0000 0000 0000 0000 0000 : Two  [123.. 87]\n    // f000 0000 0000 0000 0000 0000 0000 0000 : Two  [127..124]\n    BYTE    GetTemplate() const;\n    // Get 4 bit opcodes.\n    BYTE    GetInst0() const;\n    BYTE    GetInst1() const;\n    BYTE    GetInst2() const;\n    BYTE    GetUnit(BYTE slot) const;\n    BYTE    GetUnit0() const;\n    BYTE    GetUnit1() const;\n    BYTE    GetUnit2() const;\n    // Get 37 bit data.\n    UINT64  GetData0() const;\n    UINT64  GetData1() const;\n    UINT64  GetData2() const;\n\n    // Get/set the full 41 bit instructions.\n    UINT64  GetInstruction(BYTE slot) const;\n    UINT64  GetInstruction0() const;\n    UINT64  GetInstruction1() const;\n    UINT64  GetInstruction2() const;\n    void    SetInstruction(BYTE slot, UINT64 instruction);\n    void    SetInstruction0(UINT64 instruction);\n    void    SetInstruction1(UINT64 instruction);\n    void    SetInstruction2(UINT64 instruction);\n\n    // Get/set bitfields.\n    static UINT64 GetBits(UINT64 Value, UINT64 Offset, UINT64 Count);\n    static UINT64 SetBits(UINT64 Value, UINT64 Offset, UINT64 Count, UINT64 Field);\n\n    // Get specific read-only fields.\n    static UINT64 GetOpcode(UINT64 instruction); // 4bit opcode\n    static UINT64 GetX(UINT64 instruction); // 1bit opcode extension\n    static UINT64 GetX3(UINT64 instruction); // 3bit opcode extension\n    static UINT64 GetX6(UINT64 instruction); // 6bit opcode extension\n\n    // Get/set specific fields.\n    static UINT64 GetImm7a(UINT64 instruction);\n    static UINT64 SetImm7a(UINT64 instruction, UINT64 imm7a);\n    static UINT64 GetImm13c(UINT64 instruction);\n    static UINT64 SetImm13c(UINT64 instruction, UINT64 imm13c);\n    static UINT64 GetSignBit(UINT64 instruction);\n    static UINT64 SetSignBit(UINT64 instruction, UINT64 signBit);\n    static UINT64 GetImm20a(UINT64 instruction);\n    static UINT64 SetImm20a(UINT64 instruction, UINT64 imm20a);\n    static UINT64 GetImm20b(UINT64 instruction);\n    static UINT64 SetImm20b(UINT64 instruction, UINT64 imm20b);\n\n    static UINT64 SignExtend(UINT64 Value, UINT64 Offset);\n\n    BOOL    IsMovlGp() const;\n\n    VOID    SetInst(BYTE Slot, BYTE nInst);\n    VOID    SetInst0(BYTE nInst);\n    VOID    SetInst1(BYTE nInst);\n    VOID    SetInst2(BYTE nInst);\n    VOID    SetData(BYTE Slot, UINT64 nData);\n    VOID    SetData0(UINT64 nData);\n    VOID    SetData1(UINT64 nData);\n    VOID    SetData2(UINT64 nData);\n    BOOL    SetNop(BYTE Slot);\n    BOOL    SetNop0();\n    BOOL    SetNop1();\n    BOOL    SetNop2();\n\n  public:\n    BOOL    IsBrl() const;\n    VOID    SetBrl();\n    VOID    SetBrl(UINT64 target);\n    UINT64  GetBrlTarget() const;\n    VOID    SetBrlTarget(UINT64 target);\n    VOID    SetBrlImm(UINT64 imm);\n    UINT64  GetBrlImm() const;\n\n    UINT64  GetMovlGp() const;\n    VOID    SetMovlGp(UINT64 gp);\n\n    VOID    SetStop();\n\n    UINT    Copy(_Out_ DETOUR_IA64_BUNDLE *pDst, _Inout_opt_ DETOUR_IA64_BUNDLE* pBundleExtra = NULL) const;\n};\n#endif // DETOURS_IA64\n\n#ifdef DETOURS_ARM\n\n#define DETOURS_PFUNC_TO_PBYTE(p)  ((PBYTE)(((ULONG_PTR)(p)) & ~(ULONG_PTR)1))\n#define DETOURS_PBYTE_TO_PFUNC(p)  ((PBYTE)(((ULONG_PTR)(p)) | (ULONG_PTR)1))\n\n#endif // DETOURS_ARM\n\n//////////////////////////////////////////////////////////////////////////////\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif // __cplusplus\n\n#define DETOUR_OFFLINE_LIBRARY(x)                                       \\\nPVOID WINAPI DetourCopyInstruction##x(_In_opt_ PVOID pDst,              \\\n                                      _Inout_opt_ PVOID *ppDstPool,     \\\n                                      _In_ PVOID pSrc,                  \\\n                                      _Out_opt_ PVOID *ppTarget,        \\\n                                      _Out_opt_ LONG *plExtra);         \\\n                                                                        \\\nBOOL WINAPI DetourSetCodeModule##x(_In_ HMODULE hModule,                \\\n                                   _In_ BOOL fLimitReferencesToModule); \\\n\nDETOUR_OFFLINE_LIBRARY(X86)\nDETOUR_OFFLINE_LIBRARY(X64)\nDETOUR_OFFLINE_LIBRARY(ARM)\nDETOUR_OFFLINE_LIBRARY(ARM64)\nDETOUR_OFFLINE_LIBRARY(IA64)\n\n#undef DETOUR_OFFLINE_LIBRARY\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// Helpers for manipulating page protection.\n//\n\n_Success_(return != FALSE)\nBOOL WINAPI DetourVirtualProtectSameExecuteEx(_In_  HANDLE hProcess,\n                                              _In_  PVOID pAddress,\n                                              _In_  SIZE_T nSize,\n                                              _In_  DWORD dwNewProtect,\n                                              _Out_ PDWORD pdwOldProtect);\n\n_Success_(return != FALSE)\nBOOL WINAPI DetourVirtualProtectSameExecute(_In_  PVOID pAddress,\n                                            _In_  SIZE_T nSize,\n                                            _In_  DWORD dwNewProtect,\n                                            _Out_ PDWORD pdwOldProtect);\n#ifdef __cplusplus\n}\n#endif // __cplusplus\n\n//////////////////////////////////////////////////////////////////////////////\n\n#define MM_ALLOCATION_GRANULARITY 0x10000\n\n//////////////////////////////////////////////////////////////////////////////\n\n#endif // DETOURS_INTERNAL\n#endif // __cplusplus\n\n#endif // _DETOURS_H_\n//\n////////////////////////////////////////////////////////////////  End of File.\n"
  },
  {
    "path": "ext/detours/src/detver.h",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Common version parameters.\n//\n//  Microsoft Research Detours Package, Version 4.0.1\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n#define _USING_V110_SDK71_ 1\n#include \"winver.h\"\n#if 0\n#include <windows.h>\n#include <detours.h>\n#else\n#ifndef DETOURS_STRINGIFY\n#define DETOURS_STRINGIFY_(x)    #x\n#define DETOURS_STRINGIFY(x)    DETOURS_STRINGIFY_(x)\n#endif\n\n#define VER_FILEFLAGSMASK   0x3fL\n#define VER_FILEFLAGS       0x0L\n#define VER_FILEOS          0x00040004L\n#define VER_FILETYPE        0x00000002L\n#define VER_FILESUBTYPE     0x00000000L\n#endif\n#define VER_DETOURS_BITS    DETOURS_STRINGIFY(DETOURS_BITS)\n"
  },
  {
    "path": "ext/detours/src/disasm.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Detours Disassembler (disasm.cpp of detours.lib)\n//\n//  Microsoft Research Detours Package, Version 4.0.1\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n\n// #define DETOUR_DEBUG 1\n#define DETOURS_INTERNAL\n#include \"detours.h\"\n#include <limits.h>\n\n#if DETOURS_VERSION != 0x4c0c1   // 0xMAJORcMINORcPATCH\n#error detours.h version mismatch\n#endif\n\n#undef ASSERT\n#define ASSERT(x)\n\n//////////////////////////////////////////////////////////////////////////////\n//\n//  Special macros to handle the case when we are building disassembler for\n//  offline processing.\n//\n\n\n#if defined(DETOURS_X86_OFFLINE_LIBRARY) \\\n || defined(DETOURS_X64_OFFLINE_LIBRARY) \\\n || defined(DETOURS_ARM_OFFLINE_LIBRARY) \\\n || defined(DETOURS_ARM64_OFFLINE_LIBRARY) \\\n || defined(DETOURS_IA64_OFFLINE_LIBRARY)\n\n#undef DETOURS_X64\n#undef DETOURS_X86\n#undef DETOURS_IA64\n#undef DETOURS_ARM\n#undef DETOURS_ARM64\n\n#if defined(DETOURS_X86_OFFLINE_LIBRARY)\n\n#define DetourCopyInstruction   DetourCopyInstructionX86\n#define DetourSetCodeModule     DetourSetCodeModuleX86\n#define CDetourDis              CDetourDisX86\n#define DETOURS_X86\n\n#elif defined(DETOURS_X64_OFFLINE_LIBRARY)\n\n#if !defined(DETOURS_64BIT)\n// Fix this as/if bugs are discovered.\n//#error X64 disassembler can only build for 64-bit.\n#endif\n\n#define DetourCopyInstruction   DetourCopyInstructionX64\n#define DetourSetCodeModule     DetourSetCodeModuleX64\n#define CDetourDis              CDetourDisX64\n#define DETOURS_X64\n\n#elif defined(DETOURS_ARM_OFFLINE_LIBRARY)\n\n#define DetourCopyInstruction   DetourCopyInstructionARM\n#define DetourSetCodeModule     DetourSetCodeModuleARM\n#define CDetourDis              CDetourDisARM\n#define DETOURS_ARM\n\n#elif defined(DETOURS_ARM64_OFFLINE_LIBRARY)\n\n#define DetourCopyInstruction   DetourCopyInstructionARM64\n#define DetourSetCodeModule     DetourSetCodeModuleARM64\n#define CDetourDis              CDetourDisARM64\n#define DETOURS_ARM64\n\n#elif defined(DETOURS_IA64_OFFLINE_LIBRARY)\n\n#define DetourCopyInstruction   DetourCopyInstructionIA64\n#define DetourSetCodeModule     DetourSetCodeModuleIA64\n#define DETOURS_IA64\n\n#else\n\n#error\n\n#endif\n#endif\n\n//////////////////////////////////////////////////////////////////////////////\n//\n//  Function:\n//      DetourCopyInstruction(PVOID pDst,\n//                            PVOID *ppDstPool\n//                            PVOID pSrc,\n//                            PVOID *ppTarget,\n//                            LONG *plExtra)\n//  Purpose:\n//      Copy a single instruction from pSrc to pDst.\n//\n//  Arguments:\n//      pDst:\n//          Destination address for the instruction.  May be NULL in which\n//          case DetourCopyInstruction is used to measure an instruction.\n//          If not NULL then the source instruction is copied to the\n//          destination instruction and any relative arguments are adjusted.\n//      ppDstPool:\n//          Destination address for the end of the constant pool.  The\n//          constant pool works backwards toward pDst.  All memory between\n//          pDst and *ppDstPool must be available for use by this function.\n//          ppDstPool may be NULL if pDst is NULL.\n//      pSrc:\n//          Source address of the instruction.\n//      ppTarget:\n//          Out parameter for any target instruction address pointed to by\n//          the instruction.  For example, a branch or a jump insruction has\n//          a target, but a load or store instruction doesn't.  A target is\n//          another instruction that may be executed as a result of this\n//          instruction.  ppTarget may be NULL.\n//      plExtra:\n//          Out parameter for the number of extra bytes needed by the\n//          instruction to reach the target.  For example, lExtra = 3 if the\n//          instruction had an 8-bit relative offset, but needs a 32-bit\n//          relative offset.\n//\n//  Returns:\n//      Returns the address of the next instruction (following in the source)\n//      instruction.  By subtracting pSrc from the return value, the caller\n//      can determinte the size of the instruction copied.\n//\n//  Comments:\n//      By following the pTarget, the caller can follow alternate\n//      instruction streams.  However, it is not always possible to determine\n//      the target based on static analysis.  For example, the destination of\n//      a jump relative to a register cannot be determined from just the\n//      instruction stream.  The output value, pTarget, can have any of the\n//      following outputs:\n//          DETOUR_INSTRUCTION_TARGET_NONE:\n//              The instruction has no targets.\n//          DETOUR_INSTRUCTION_TARGET_DYNAMIC:\n//              The instruction has a non-deterministic (dynamic) target.\n//              (i.e. the jump is to an address held in a register.)\n//          Address:   The instruction has the specified target.\n//\n//      When copying instructions, DetourCopyInstruction insures that any\n//      targets remain constant.  It does so by adjusting any IP relative\n//      offsets.\n//\n\n#pragma data_seg(\".detourd\")\n#pragma const_seg(\".detourc\")\n\n//////////////////////////////////////////////////// X86 and X64 Disassembler.\n//\n//  Includes full support for all x86 chips prior to the Pentium III, and some newer stuff.\n//\n#if defined(DETOURS_X64) || defined(DETOURS_X86)\n\nclass CDetourDis\n{\n  public:\n    CDetourDis(_Out_opt_ PBYTE *ppbTarget,\n               _Out_opt_ LONG *plExtra);\n\n    PBYTE   CopyInstruction(PBYTE pbDst, PBYTE pbSrc);\n    static BOOL SanityCheckSystem();\n    static BOOL SetCodeModule(PBYTE pbBeg, PBYTE pbEnd, BOOL fLimitReferencesToModule);\n\n  public:\n    struct COPYENTRY;\n    typedef const COPYENTRY * REFCOPYENTRY;\n\n    typedef PBYTE (CDetourDis::* COPYFUNC)(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc);\n\n    // nFlagBits flags.\n    enum {\n        DYNAMIC     = 0x1u,\n        ADDRESS     = 0x2u,\n        NOENLARGE   = 0x4u,\n        RAX         = 0x8u,\n    };\n\n    // ModR/M Flags\n    enum {\n        SIB         = 0x10u,\n        RIP         = 0x20u,\n        NOTSIB      = 0x0fu,\n    };\n\n    struct COPYENTRY\n    {\n        // Many of these fields are often ignored. See ENTRY_DataIgnored.\n        ULONG       nFixedSize      : 4;    // Fixed size of opcode\n        ULONG       nFixedSize16    : 4;    // Fixed size when 16 bit operand\n        ULONG       nModOffset      : 4;    // Offset to mod/rm byte (0=none)\n        ULONG       nRelOffset      : 4;    // Offset to relative target.\n        ULONG       nFlagBits       : 4;    // Flags for DYNAMIC, etc.\n        COPYFUNC    pfCopy;                 // Function pointer.\n    };\n\n  protected:\n// These macros define common uses of nFixedSize, nFixedSize16, nModOffset, nRelOffset, nFlagBits, pfCopy.\n#define ENTRY_DataIgnored           0, 0, 0, 0, 0,\n#define ENTRY_CopyBytes1            { 1, 1, 0, 0, 0, &CDetourDis::CopyBytes }\n#ifdef DETOURS_X64\n#define ENTRY_CopyBytes1Address     { 9, 5, 0, 0, ADDRESS, &CDetourDis::CopyBytes }\n#else\n#define ENTRY_CopyBytes1Address     { 5, 3, 0, 0, ADDRESS, &CDetourDis::CopyBytes }\n#endif\n#define ENTRY_CopyBytes1Dynamic     { 1, 1, 0, 0, DYNAMIC, &CDetourDis::CopyBytes }\n#define ENTRY_CopyBytes2            { 2, 2, 0, 0, 0, &CDetourDis::CopyBytes }\n#define ENTRY_CopyBytes2Jump        { ENTRY_DataIgnored &CDetourDis::CopyBytesJump }\n#define ENTRY_CopyBytes2CantJump    { 2, 2, 0, 1, NOENLARGE, &CDetourDis::CopyBytes }\n#define ENTRY_CopyBytes2Dynamic     { 2, 2, 0, 0, DYNAMIC, &CDetourDis::CopyBytes }\n#define ENTRY_CopyBytes3            { 3, 3, 0, 0, 0, &CDetourDis::CopyBytes }\n#define ENTRY_CopyBytes3Dynamic     { 3, 3, 0, 0, DYNAMIC, &CDetourDis::CopyBytes }\n#define ENTRY_CopyBytes3Or5         { 5, 3, 0, 0, 0, &CDetourDis::CopyBytes }\n#define ENTRY_CopyBytes3Or5Dynamic  { 5, 3, 0, 0, DYNAMIC, &CDetourDis::CopyBytes }// x86 only\n#ifdef DETOURS_X64\n#define ENTRY_CopyBytes3Or5Rax      { 5, 3, 0, 0, RAX, &CDetourDis::CopyBytes }\n#define ENTRY_CopyBytes3Or5Target   { 5, 5, 0, 1, 0, &CDetourDis::CopyBytes }\n#else\n#define ENTRY_CopyBytes3Or5Rax      { 5, 3, 0, 0, 0, &CDetourDis::CopyBytes }\n#define ENTRY_CopyBytes3Or5Target   { 5, 3, 0, 1, 0, &CDetourDis::CopyBytes }\n#endif\n#define ENTRY_CopyBytes4            { 4, 4, 0, 0, 0, &CDetourDis::CopyBytes }\n#define ENTRY_CopyBytes5            { 5, 5, 0, 0, 0, &CDetourDis::CopyBytes }\n#define ENTRY_CopyBytes5Or7Dynamic  { 7, 5, 0, 0, DYNAMIC, &CDetourDis::CopyBytes }\n#define ENTRY_CopyBytes7            { 7, 7, 0, 0, 0, &CDetourDis::CopyBytes }\n#define ENTRY_CopyBytes2Mod         { 2, 2, 1, 0, 0, &CDetourDis::CopyBytes }\n#define ENTRY_CopyBytes2ModDynamic  { 2, 2, 1, 0, DYNAMIC, &CDetourDis::CopyBytes }\n#define ENTRY_CopyBytes2Mod1        { 3, 3, 1, 0, 0, &CDetourDis::CopyBytes }\n#define ENTRY_CopyBytes2ModOperand  { 6, 4, 1, 0, 0, &CDetourDis::CopyBytes }\n#define ENTRY_CopyBytes3Mod         { 3, 3, 2, 0, 0, &CDetourDis::CopyBytes } // SSE3 0F 38 opcode modrm\n#define ENTRY_CopyBytes3Mod1        { 4, 4, 2, 0, 0, &CDetourDis::CopyBytes } // SSE3 0F 3A opcode modrm .. imm8\n#define ENTRY_CopyBytesPrefix       { ENTRY_DataIgnored &CDetourDis::CopyBytesPrefix }\n#define ENTRY_CopyBytesSegment      { ENTRY_DataIgnored &CDetourDis::CopyBytesSegment }\n#define ENTRY_CopyBytesRax          { ENTRY_DataIgnored &CDetourDis::CopyBytesRax }\n#define ENTRY_CopyF2                { ENTRY_DataIgnored &CDetourDis::CopyF2 }\n#define ENTRY_CopyF3                { ENTRY_DataIgnored &CDetourDis::CopyF3 } // 32bit x86 only\n#define ENTRY_Copy0F                { ENTRY_DataIgnored &CDetourDis::Copy0F }\n#define ENTRY_Copy0F78              { ENTRY_DataIgnored &CDetourDis::Copy0F78 }\n#define ENTRY_Copy0F00              { ENTRY_DataIgnored &CDetourDis::Copy0F00 } // 32bit x86 only\n#define ENTRY_Copy0FB8              { ENTRY_DataIgnored &CDetourDis::Copy0FB8 } // 32bit x86 only\n#define ENTRY_Copy66                { ENTRY_DataIgnored &CDetourDis::Copy66 }\n#define ENTRY_Copy67                { ENTRY_DataIgnored &CDetourDis::Copy67 }\n#define ENTRY_CopyF6                { ENTRY_DataIgnored &CDetourDis::CopyF6 }\n#define ENTRY_CopyF7                { ENTRY_DataIgnored &CDetourDis::CopyF7 }\n#define ENTRY_CopyFF                { ENTRY_DataIgnored &CDetourDis::CopyFF }\n#define ENTRY_CopyVex2              { ENTRY_DataIgnored &CDetourDis::CopyVex2 }\n#define ENTRY_CopyVex3              { ENTRY_DataIgnored &CDetourDis::CopyVex3 }\n#define ENTRY_CopyEvex              { ENTRY_DataIgnored &CDetourDis::CopyEvex } // 62, 3 byte payload, then normal with implied prefixes like vex\n#define ENTRY_CopyXop               { ENTRY_DataIgnored &CDetourDis::CopyXop }   // 0x8F ... POP /0 or AMD XOP\n#define ENTRY_CopyBytesXop          { 5, 5, 4, 0, 0, &CDetourDis::CopyBytes } // 0x8F xop1 xop2 opcode modrm\n#define ENTRY_CopyBytesXop1         { 6, 6, 4, 0, 0, &CDetourDis::CopyBytes } // 0x8F xop1 xop2 opcode modrm ... imm8\n#define ENTRY_CopyBytesXop4         { 9, 9, 4, 0, 0, &CDetourDis::CopyBytes } // 0x8F xop1 xop2 opcode modrm ... imm32\n#define ENTRY_Invalid               { ENTRY_DataIgnored &CDetourDis::Invalid }\n\n    PBYTE CopyBytes(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc);\n    PBYTE CopyBytesPrefix(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc);\n    PBYTE CopyBytesSegment(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc);\n    PBYTE CopyBytesRax(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc);\n    PBYTE CopyBytesJump(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc);\n\n    PBYTE Invalid(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc);\n\n    PBYTE AdjustTarget(PBYTE pbDst, PBYTE pbSrc, UINT cbOp,\n                       UINT cbTargetOffset, UINT cbTargetSize);\n\n  protected:\n    PBYTE Copy0F(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc);\n    PBYTE Copy0F00(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc); // x86 only sldt/0 str/1 lldt/2 ltr/3 err/4 verw/5 jmpe/6/dynamic invalid/7\n    PBYTE Copy0F78(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc); // vmread, 66/extrq/ib/ib, F2/insertq/ib/ib\n    PBYTE Copy0FB8(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc); // jmpe or F3/popcnt\n    PBYTE Copy66(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc);\n    PBYTE Copy67(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc);\n    PBYTE CopyF2(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc);\n    PBYTE CopyF3(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc); // x86 only\n    PBYTE CopyF6(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc);\n    PBYTE CopyF7(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc);\n    PBYTE CopyFF(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc);\n    PBYTE CopyVex2(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc);\n    PBYTE CopyVex3(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc);\n    PBYTE CopyVexCommon(BYTE m, PBYTE pbDst, PBYTE pbSrc);\n    PBYTE CopyVexEvexCommon(BYTE m, PBYTE pbDst, PBYTE pbSrc, BYTE p);\n    PBYTE CopyEvex(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc);\n    PBYTE CopyXop(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc);\n\n  protected:\n    static const COPYENTRY  s_rceCopyTable[];\n    static const COPYENTRY  s_rceCopyTable0F[];\n    static const BYTE       s_rbModRm[256];\n    static PBYTE            s_pbModuleBeg;\n    static PBYTE            s_pbModuleEnd;\n    static BOOL             s_fLimitReferencesToModule;\n\n  protected:\n    BOOL                m_bOperandOverride;\n    BOOL                m_bAddressOverride;\n    BOOL                m_bRaxOverride; // AMD64 only\n    BOOL                m_bVex;\n    BOOL                m_bEvex;\n    BOOL                m_bF2;\n    BOOL                m_bF3; // x86 only\n    BYTE                m_nSegmentOverride;\n\n    PBYTE *             m_ppbTarget;\n    LONG *              m_plExtra;\n\n    LONG                m_lScratchExtra;\n    PBYTE               m_pbScratchTarget;\n    BYTE                m_rbScratchDst[64]; // matches or exceeds rbCode\n};\n\nPVOID WINAPI DetourCopyInstruction(_In_opt_ PVOID pDst,\n                                   _Inout_opt_ PVOID *ppDstPool,\n                                   _In_ PVOID pSrc,\n                                   _Out_opt_ PVOID *ppTarget,\n                                   _Out_opt_ LONG *plExtra)\n{\n    UNREFERENCED_PARAMETER(ppDstPool);  // x86 & x64 don't use a constant pool.\n\n    CDetourDis oDetourDisasm((PBYTE*)ppTarget, plExtra);\n    return oDetourDisasm.CopyInstruction((PBYTE)pDst, (PBYTE)pSrc);\n}\n\n/////////////////////////////////////////////////////////// Disassembler Code.\n//\nCDetourDis::CDetourDis(_Out_opt_ PBYTE *ppbTarget, _Out_opt_ LONG *plExtra) :\n    m_bOperandOverride(FALSE),\n    m_bAddressOverride(FALSE),\n    m_bRaxOverride(FALSE),\n    m_bF2(FALSE),\n    m_bF3(FALSE),\n    m_bVex(FALSE),\n    m_bEvex(FALSE)\n{\n    m_ppbTarget = ppbTarget ? ppbTarget : &m_pbScratchTarget;\n    m_plExtra = plExtra ? plExtra : &m_lScratchExtra;\n\n    *m_ppbTarget = (PBYTE)DETOUR_INSTRUCTION_TARGET_NONE;\n    *m_plExtra = 0;\n}\n\nPBYTE CDetourDis::CopyInstruction(PBYTE pbDst, PBYTE pbSrc)\n{\n    // Configure scratch areas if real areas are not available.\n    if (NULL == pbDst) {\n        pbDst = m_rbScratchDst;\n    }\n    if (NULL == pbSrc) {\n        // We can't copy a non-existent instruction.\n        SetLastError(ERROR_INVALID_DATA);\n        return NULL;\n    }\n\n    // Figure out how big the instruction is, do the appropriate copy,\n    // and figure out what the target of the instruction is if any.\n    //\n    REFCOPYENTRY pEntry = &s_rceCopyTable[pbSrc[0]];\n    return (this->*pEntry->pfCopy)(pEntry, pbDst, pbSrc);\n}\n\nPBYTE CDetourDis::CopyBytes(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc)\n{\n    UINT nBytesFixed;\n\n    if (m_bVex || m_bEvex)\n    {\n        ASSERT(pEntry->nFlagBits == 0);\n        ASSERT(pEntry->nFixedSize == pEntry->nFixedSize16);\n    }\n\n    UINT const nModOffset = pEntry->nModOffset;\n    UINT const nFlagBits = pEntry->nFlagBits;\n    UINT const nFixedSize = pEntry->nFixedSize;\n    UINT const nFixedSize16 = pEntry->nFixedSize16;\n\n    if (nFlagBits & ADDRESS) {\n        nBytesFixed = m_bAddressOverride ? nFixedSize16 : nFixedSize;\n    }\n#ifdef DETOURS_X64\n    // REX.W trumps 66\n    else if (m_bRaxOverride) {\n        nBytesFixed = nFixedSize + ((nFlagBits & RAX) ? 4 : 0);\n    }\n#endif\n    else {\n        nBytesFixed = m_bOperandOverride ? nFixedSize16 : nFixedSize;\n    }\n\n    UINT nBytes = nBytesFixed;\n    UINT nRelOffset = pEntry->nRelOffset;\n    UINT cbTarget = nBytes - nRelOffset;\n    if (nModOffset > 0) {\n        ASSERT(nRelOffset == 0);\n        BYTE const bModRm = pbSrc[nModOffset];\n        BYTE const bFlags = s_rbModRm[bModRm];\n\n        nBytes += bFlags & NOTSIB;\n\n        if (bFlags & SIB) {\n            BYTE const bSib = pbSrc[nModOffset + 1];\n\n            if ((bSib & 0x07) == 0x05) {\n                if ((bModRm & 0xc0) == 0x00) {\n                    nBytes += 4;\n                }\n                else if ((bModRm & 0xc0) == 0x40) {\n                    nBytes += 1;\n                }\n                else if ((bModRm & 0xc0) == 0x80) {\n                    nBytes += 4;\n                }\n            }\n            cbTarget = nBytes - nRelOffset;\n        }\n#ifdef DETOURS_X64\n        else if (bFlags & RIP) {\n            nRelOffset = nModOffset + 1;\n            cbTarget = 4;\n        }\n#endif\n    }\n    CopyMemory(pbDst, pbSrc, nBytes);\n\n    if (nRelOffset) {\n        *m_ppbTarget = AdjustTarget(pbDst, pbSrc, nBytes, nRelOffset, cbTarget);\n#ifdef DETOURS_X64\n        if (pEntry->nRelOffset == 0) {\n            // This is a data target, not a code target, so we shouldn't return it.\n            *m_ppbTarget = NULL;\n        }\n#endif\n    }\n    if (nFlagBits & NOENLARGE) {\n        *m_plExtra = -*m_plExtra;\n    }\n    if (nFlagBits & DYNAMIC) {\n        *m_ppbTarget = (PBYTE)DETOUR_INSTRUCTION_TARGET_DYNAMIC;\n    }\n    return pbSrc + nBytes;\n}\n\nPBYTE CDetourDis::CopyBytesPrefix(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc)\n{\n    pbDst[0] = pbSrc[0];\n    pEntry = &s_rceCopyTable[pbSrc[1]];\n    return (this->*pEntry->pfCopy)(pEntry, pbDst + 1, pbSrc + 1);\n}\n\nPBYTE CDetourDis::CopyBytesSegment(REFCOPYENTRY, PBYTE pbDst, PBYTE pbSrc)\n{\n    m_nSegmentOverride = pbSrc[0];\n    return CopyBytesPrefix(0, pbDst, pbSrc);\n}\n\nPBYTE CDetourDis::CopyBytesRax(REFCOPYENTRY, PBYTE pbDst, PBYTE pbSrc)\n{ // AMD64 only\n    if (pbSrc[0] & 0x8) {\n        m_bRaxOverride = TRUE;\n    }\n    return CopyBytesPrefix(0, pbDst, pbSrc);\n}\n\nPBYTE CDetourDis::CopyBytesJump(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc)\n{\n    (void)pEntry;\n\n    PVOID pvSrcAddr = &pbSrc[1];\n    PVOID pvDstAddr = NULL;\n    LONG_PTR nOldOffset = (LONG_PTR)*(signed char*&)pvSrcAddr;\n    LONG_PTR nNewOffset = 0;\n\n    *m_ppbTarget = pbSrc + 2 + nOldOffset;\n\n    if (pbSrc[0] == 0xeb) {\n        pbDst[0] = 0xe9;\n        pvDstAddr = &pbDst[1];\n        nNewOffset = nOldOffset - ((pbDst - pbSrc) + 3);\n        *(UNALIGNED LONG*&)pvDstAddr = (LONG)nNewOffset;\n\n        *m_plExtra = 3;\n        return pbSrc + 2;\n    }\n\n    ASSERT(pbSrc[0] >= 0x70 && pbSrc[0] <= 0x7f);\n\n    pbDst[0] = 0x0f;\n    pbDst[1] = 0x80 | (pbSrc[0] & 0xf);\n    pvDstAddr = &pbDst[2];\n    nNewOffset = nOldOffset - ((pbDst - pbSrc) + 4);\n    *(UNALIGNED LONG*&)pvDstAddr = (LONG)nNewOffset;\n\n    *m_plExtra = 4;\n    return pbSrc + 2;\n}\n\nPBYTE CDetourDis::AdjustTarget(PBYTE pbDst, PBYTE pbSrc, UINT cbOp,\n                               UINT cbTargetOffset, UINT cbTargetSize)\n{\n    PBYTE pbTarget = NULL;\n#if 1 // fault injection to test test code\n#if defined(DETOURS_X64)\n    typedef LONGLONG T;\n#else\n    typedef LONG T;\n#endif\n    T nOldOffset;\n    T nNewOffset;\n    PVOID pvTargetAddr = &pbDst[cbTargetOffset];\n\n    switch (cbTargetSize) {\n      case 1:\n        nOldOffset = *(signed char*&)pvTargetAddr;\n        break;\n      case 2:\n        nOldOffset = *(UNALIGNED SHORT*&)pvTargetAddr;\n        break;\n      case 4:\n        nOldOffset = *(UNALIGNED LONG*&)pvTargetAddr;\n        break;\n#if defined(DETOURS_X64)\n      case 8:\n        nOldOffset = *(UNALIGNED LONGLONG*&)pvTargetAddr;\n        break;\n#endif\n      default:\n        ASSERT(!\"cbTargetSize is invalid.\");\n        nOldOffset = 0;\n        break;\n    }\n\n    pbTarget = pbSrc + cbOp + nOldOffset;\n    nNewOffset = nOldOffset - (T)(pbDst - pbSrc);\n\n    switch (cbTargetSize) {\n      case 1:\n        *(CHAR*&)pvTargetAddr = (CHAR)nNewOffset;\n        if (nNewOffset < SCHAR_MIN || nNewOffset > SCHAR_MAX) {\n            *m_plExtra = sizeof(ULONG) - 1;\n        }\n        break;\n      case 2:\n        *(UNALIGNED SHORT*&)pvTargetAddr = (SHORT)nNewOffset;\n        if (nNewOffset < SHRT_MIN || nNewOffset > SHRT_MAX) {\n            *m_plExtra = sizeof(ULONG) - 2;\n        }\n        break;\n      case 4:\n        *(UNALIGNED LONG*&)pvTargetAddr = (LONG)nNewOffset;\n        if (nNewOffset < LONG_MIN || nNewOffset > LONG_MAX) {\n            *m_plExtra = sizeof(ULONG) - 4;\n        }\n        break;\n#if defined(DETOURS_X64)\n      case 8:\n        *(UNALIGNED LONGLONG*&)pvTargetAddr = nNewOffset;\n        break;\n#endif\n    }\n#ifdef DETOURS_X64\n    // When we are only computing size, source and dest can be\n    // far apart, distance not encodable in 32bits. Ok.\n    // At least still check the lower 32bits.\n\n    if (pbDst >= m_rbScratchDst && pbDst < (sizeof(m_rbScratchDst) + m_rbScratchDst)) {\n        ASSERT((((size_t)pbDst + cbOp + nNewOffset) & 0xFFFFFFFF) == (((size_t)pbTarget) & 0xFFFFFFFF));\n    }\n    else\n#endif\n    {\n        ASSERT(pbDst + cbOp + nNewOffset == pbTarget);\n    }\n#endif\n    return pbTarget;\n}\n\nPBYTE CDetourDis::Invalid(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc)\n{\n    (void)pbDst;\n    (void)pEntry;\n    ASSERT(!\"Invalid Instruction\");\n    return pbSrc + 1;\n}\n\n////////////////////////////////////////////////////// Individual Bytes Codes.\n//\nPBYTE CDetourDis::Copy0F(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc)\n{\n    pbDst[0] = pbSrc[0];\n    pEntry = &s_rceCopyTable0F[pbSrc[1]];\n    return (this->*pEntry->pfCopy)(pEntry, pbDst + 1, pbSrc + 1);\n}\n\nPBYTE CDetourDis::Copy0F78(REFCOPYENTRY, PBYTE pbDst, PBYTE pbSrc)\n{\n    // vmread, 66/extrq, F2/insertq\n\n    static const COPYENTRY vmread = /* 78 */ ENTRY_CopyBytes2Mod;\n    static const COPYENTRY extrq_insertq = /* 78 */ ENTRY_CopyBytes4;\n\n    ASSERT(!(m_bF2 && m_bOperandOverride));\n\n    // For insertq and presumably despite documentation extrq, mode must be 11, not checked.\n    // insertq/extrq/78 are followed by two immediate bytes, and given mode == 11, mod/rm byte is always one byte,\n    // and the 0x78 makes 4 bytes (not counting the 66/F2/F which are accounted for elsewhere)\n\n    REFCOPYENTRY const pEntry = ((m_bF2 || m_bOperandOverride) ? &extrq_insertq : &vmread);\n\n    return (this->*pEntry->pfCopy)(pEntry, pbDst, pbSrc);\n}\n\nPBYTE CDetourDis::Copy0F00(REFCOPYENTRY, PBYTE pbDst, PBYTE pbSrc)\n{\n    // jmpe is 32bit x86 only\n    // Notice that the sizes are the same either way, but jmpe is marked as \"dynamic\".\n\n    static const COPYENTRY other = /* B8 */ ENTRY_CopyBytes2Mod; // sldt/0 str/1 lldt/2 ltr/3 err/4 verw/5 jmpe/6 invalid/7\n    static const COPYENTRY jmpe = /* B8 */ ENTRY_CopyBytes2ModDynamic; // jmpe/6 x86-on-IA64 syscalls\n\n    REFCOPYENTRY const pEntry = (((6 << 3) == ((7 << 3) & pbSrc[1])) ?  &jmpe : &other);\n    return (this->*pEntry->pfCopy)(pEntry, pbDst, pbSrc);\n}\n\nPBYTE CDetourDis::Copy0FB8(REFCOPYENTRY, PBYTE pbDst, PBYTE pbSrc)\n{\n    // jmpe is 32bit x86 only\n\n    static const COPYENTRY popcnt = /* B8 */ ENTRY_CopyBytes2Mod;\n    static const COPYENTRY jmpe = /* B8 */ ENTRY_CopyBytes3Or5Dynamic; // jmpe x86-on-IA64 syscalls\n    REFCOPYENTRY const pEntry = m_bF3 ? &popcnt : &jmpe;\n    return (this->*pEntry->pfCopy)(pEntry, pbDst, pbSrc);\n}\n\nPBYTE CDetourDis::Copy66(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc)\n{   // Operand-size override prefix\n    m_bOperandOverride = TRUE;\n    return CopyBytesPrefix(pEntry, pbDst, pbSrc);\n}\n\nPBYTE CDetourDis::Copy67(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc)\n{   // Address size override prefix\n    m_bAddressOverride = TRUE;\n    return CopyBytesPrefix(pEntry, pbDst, pbSrc);\n}\n\nPBYTE CDetourDis::CopyF2(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc)\n{\n    m_bF2 = TRUE;\n    return CopyBytesPrefix(pEntry, pbDst, pbSrc);\n}\n\nPBYTE CDetourDis::CopyF3(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc)\n{ // x86 only\n    m_bF3 = TRUE;\n    return CopyBytesPrefix(pEntry, pbDst, pbSrc);\n}\n\nPBYTE CDetourDis::CopyF6(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc)\n{\n    (void)pEntry;\n\n    // TEST BYTE /0\n    if (0x00 == (0x38 & pbSrc[1])) {    // reg(bits 543) of ModR/M == 0\n        static const COPYENTRY ce = /* f6 */ ENTRY_CopyBytes2Mod1;\n        return (this->*ce.pfCopy)(&ce, pbDst, pbSrc);\n    }\n    // DIV /6\n    // IDIV /7\n    // IMUL /5\n    // MUL /4\n    // NEG /3\n    // NOT /2\n\n    static const COPYENTRY ce = /* f6 */ ENTRY_CopyBytes2Mod;\n    return (this->*ce.pfCopy)(&ce, pbDst, pbSrc);\n}\n\nPBYTE CDetourDis::CopyF7(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc)\n{\n    (void)pEntry;\n\n    // TEST WORD /0\n    if (0x00 == (0x38 & pbSrc[1])) {    // reg(bits 543) of ModR/M == 0\n        static const COPYENTRY ce = /* f7 */ ENTRY_CopyBytes2ModOperand;\n        return (this->*ce.pfCopy)(&ce, pbDst, pbSrc);\n    }\n\n    // DIV /6\n    // IDIV /7\n    // IMUL /5\n    // MUL /4\n    // NEG /3\n    // NOT /2\n    static const COPYENTRY ce = /* f7 */ ENTRY_CopyBytes2Mod;\n    return (this->*ce.pfCopy)(&ce, pbDst, pbSrc);\n}\n\nPBYTE CDetourDis::CopyFF(REFCOPYENTRY pEntry, PBYTE pbDst, PBYTE pbSrc)\n{   // INC /0\n    // DEC /1\n    // CALL /2\n    // CALL /3\n    // JMP /4\n    // JMP /5\n    // PUSH /6\n    // invalid/7\n    (void)pEntry;\n\n    static const COPYENTRY ce = /* ff */ ENTRY_CopyBytes2Mod;\n    PBYTE pbOut = (this->*ce.pfCopy)(&ce, pbDst, pbSrc);\n\n    BYTE const b1 = pbSrc[1];\n\n    if (0x15 == b1 || 0x25 == b1) {         // CALL [], JMP []\n#ifdef DETOURS_X64\n        // All segments but FS and GS are equivalent.\n        if (m_nSegmentOverride != 0x64 && m_nSegmentOverride != 0x65)\n#else\n        if (m_nSegmentOverride == 0 || m_nSegmentOverride == 0x2E)\n#endif\n        {\n#ifdef DETOURS_X64\n            INT32 offset = *(UNALIGNED INT32*)&pbSrc[2];\n            PBYTE *ppbTarget = (PBYTE *)(pbSrc + 6 + offset);\n#else\n            PBYTE *ppbTarget = (PBYTE *)(SIZE_T)*(UNALIGNED ULONG*)&pbSrc[2];\n#endif\n            if (s_fLimitReferencesToModule &&\n                (ppbTarget < (PVOID)s_pbModuleBeg || ppbTarget >= (PVOID)s_pbModuleEnd)) {\n\n                *m_ppbTarget = (PBYTE)DETOUR_INSTRUCTION_TARGET_DYNAMIC;\n            }\n            else {\n                // This can access violate on random bytes. Use DetourSetCodeModule.\n                *m_ppbTarget = *ppbTarget;\n            }\n        }\n        else {\n            *m_ppbTarget = (PBYTE)DETOUR_INSTRUCTION_TARGET_DYNAMIC;\n        }\n    }\n    else if (0x10 == (0x30 & b1) || // CALL /2 or /3  --> reg(bits 543) of ModR/M == 010 or 011\n             0x20 == (0x30 & b1)) { // JMP /4 or /5 --> reg(bits 543) of ModR/M == 100 or 101\n        *m_ppbTarget = (PBYTE)DETOUR_INSTRUCTION_TARGET_DYNAMIC;\n    }\n    return pbOut;\n}\n\nPBYTE CDetourDis::CopyVexEvexCommon(BYTE m, PBYTE pbDst, PBYTE pbSrc, BYTE p)\n// m is first instead of last in the hopes of pbDst/pbSrc being\n// passed along efficiently in the registers they were already in.\n{\n    static const COPYENTRY ceF38 = /* 38 */ ENTRY_CopyBytes2Mod;\n    static const COPYENTRY ceF3A = /* 3A */ ENTRY_CopyBytes2Mod1;\n    static const COPYENTRY ceInvalid = /* C4 */ ENTRY_Invalid;\n\n    switch (p & 3) {\n    case 0: break;\n    case 1: m_bOperandOverride = TRUE; break;\n    case 2: m_bF3 = TRUE; break;\n    case 3: m_bF2 = TRUE; break;\n    }\n\n    REFCOPYENTRY pEntry;\n\n    switch (m) {\n    default: return Invalid(&ceInvalid, pbDst, pbSrc);\n    case 1:  pEntry = &s_rceCopyTable0F[pbSrc[0]];\n             return (this->*pEntry->pfCopy)(pEntry, pbDst, pbSrc);\n    case 2:  return CopyBytes(&ceF38, pbDst, pbSrc);\n    case 3:  return CopyBytes(&ceF3A, pbDst, pbSrc);\n    }\n}\n\nPBYTE CDetourDis::CopyVexCommon(BYTE m, PBYTE pbDst, PBYTE pbSrc)\n// m is first instead of last in the hopes of pbDst/pbSrc being\n// passed along efficiently in the registers they were already in.\n{\n    m_bVex = TRUE;\n    BYTE const p = (BYTE)(pbSrc[-1] & 3); // p in last byte\n    return CopyVexEvexCommon(m, pbDst, pbSrc, p);\n}\n\n\nPBYTE CDetourDis::CopyVex3(REFCOPYENTRY, PBYTE pbDst, PBYTE pbSrc)\n// 3 byte VEX prefix 0xC4\n{\n#ifdef DETOURS_X86\n    const static COPYENTRY ceLES = /* C4 */ ENTRY_CopyBytes2Mod;\n    if ((pbSrc[1] & 0xC0) != 0xC0) {\n        REFCOPYENTRY pEntry = &ceLES;\n        return (this->*pEntry->pfCopy)(pEntry, pbDst, pbSrc);\n    }\n#endif\n    pbDst[0] = pbSrc[0];\n    pbDst[1] = pbSrc[1];\n    pbDst[2] = pbSrc[2];\n#ifdef DETOURS_X64\n    m_bRaxOverride |= !!(pbSrc[2] & 0x80); // w in last byte, see CopyBytesRax\n#else\n    //\n    // TODO\n    //\n    // Usually the VEX.W bit changes the size of a general purpose register and is ignored for 32bit.\n    // Sometimes it is an opcode extension.\n    // Look in the Intel manual, in the instruction-by-instruction reference, for \".W1\",\n    // without nearby wording saying it is ignored for 32bit.\n    // For example: \"VFMADD132PD/VFMADD213PD/VFMADD231PD Fused Multiply-Add of Packed Double-Precision Floating-Point Values\".\n    //\n    // Then, go through each such case and determine if W0 vs. W1 affect the size of the instruction. Probably not.\n    // Look for the same encoding but with \"W1\" changed to \"W0\".\n    // Here is one such pairing:\n    // VFMADD132PD/VFMADD213PD/VFMADD231PD Fused Multiply-Add of Packed Double-Precision Floating-Point Values\n    //\n    // VEX.DDS.128.66.0F38.W1 98 /r A V/V FMA Multiply packed double-precision floating-point values\n    // from xmm0 and xmm2/mem, add to xmm1 and\n    // put result in xmm0.\n    // VFMADD132PD xmm0, xmm1, xmm2/m128\n    //\n    // VFMADD132PS/VFMADD213PS/VFMADD231PS Fused Multiply-Add of Packed Single-Precision Floating-Point Values\n    // VEX.DDS.128.66.0F38.W0 98 /r A V/V FMA Multiply packed single-precision floating-point values\n    // from xmm0 and xmm2/mem, add to xmm1 and put\n    // result in xmm0.\n    // VFMADD132PS xmm0, xmm1, xmm2/m128\n    //\n#endif\n    return CopyVexCommon(pbSrc[1] & 0x1F, pbDst + 3, pbSrc + 3);\n}\n\nPBYTE CDetourDis::CopyVex2(REFCOPYENTRY, PBYTE pbDst, PBYTE pbSrc)\n// 2 byte VEX prefix 0xC5\n{\n#ifdef DETOURS_X86\n    const static COPYENTRY ceLDS = /* C5 */ ENTRY_CopyBytes2Mod;\n    if ((pbSrc[1] & 0xC0) != 0xC0) {\n        REFCOPYENTRY pEntry = &ceLDS;\n        return (this->*pEntry->pfCopy)(pEntry, pbDst, pbSrc);\n    }\n#endif\n    pbDst[0] = pbSrc[0];\n    pbDst[1] = pbSrc[1];\n    return CopyVexCommon(1, pbDst + 2, pbSrc + 2);\n}\n\nPBYTE CDetourDis::CopyEvex(REFCOPYENTRY, PBYTE pbDst, PBYTE pbSrc)\n// 62, 3 byte payload, x86 with implied prefixes like Vex\n// for 32bit, mode 0xC0 else fallback to bound /r\n{\n    // NOTE: Intel and Wikipedia number these differently.\n    // Intel says 0-2, Wikipedia says 1-3.\n\n    BYTE const p0 = pbSrc[1];\n\n#ifdef DETOURS_X86\n    const static COPYENTRY ceBound = /* 62 */ ENTRY_CopyBytes2Mod;\n    if ((p0 & 0xC0) != 0xC0) {\n        return CopyBytes(&ceBound, pbDst, pbSrc);\n    }\n#endif\n\n    static const COPYENTRY ceInvalid = /* 62 */ ENTRY_Invalid;\n\n    if ((p0 & 0x0C) != 0)\n        return Invalid(&ceInvalid, pbDst, pbSrc);\n\n    BYTE const p1 = pbSrc[2];\n\n    if ((p1 & 0x04) != 0x04)\n        return Invalid(&ceInvalid, pbDst, pbSrc);\n\n    // Copy 4 byte prefix.\n    *(UNALIGNED ULONG *)pbDst = *(UNALIGNED ULONG*)pbSrc;\n\n    m_bEvex = TRUE;\n\n#ifdef DETOURS_X64\n    m_bRaxOverride |= !!(p1 & 0x80); // w\n#endif\n\n    return CopyVexEvexCommon(p0 & 3u, pbDst + 4, pbSrc + 4, p1 & 3u);\n}\n\nPBYTE CDetourDis::CopyXop(REFCOPYENTRY, PBYTE pbDst, PBYTE pbSrc)\n/* 3 byte AMD XOP prefix 0x8F\nbyte0: 0x8F\nbyte1: RXBmmmmm\nbyte2: WvvvvLpp\nbyte3: opcode\nmmmmm >= 8, else pop\nmmmmm only otherwise defined for 8, 9, A.\npp is like VEX but only instructions with 0 are defined\n*/\n{\n    const static COPYENTRY cePop = /* 8F */ ENTRY_CopyBytes2Mod;\n    const static COPYENTRY ceXop = /* 8F */ ENTRY_CopyBytesXop;\n    const static COPYENTRY ceXop1 = /* 8F */ ENTRY_CopyBytesXop1;\n    const static COPYENTRY ceXop4 = /* 8F */ ENTRY_CopyBytesXop4;\n\n    BYTE const m = (BYTE)(pbSrc[1] & 0x1F);\n    ASSERT(m <= 10);\n    switch (m)\n    {\n    default:\n        return CopyBytes(&cePop, pbDst, pbSrc);\n\n    case 8: // modrm with 8bit immediate\n        return CopyBytes(&ceXop1, pbDst, pbSrc);\n\n    case 9: // modrm with no immediate\n        return CopyBytes(&ceXop, pbDst, pbSrc);\n\n    case 10: // modrm with 32bit immediate\n        return CopyBytes(&ceXop4, pbDst, pbSrc);\n    }\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nPBYTE CDetourDis::s_pbModuleBeg = NULL;\nPBYTE CDetourDis::s_pbModuleEnd = (PBYTE)~(ULONG_PTR)0;\nBOOL CDetourDis::s_fLimitReferencesToModule = FALSE;\n\nBOOL CDetourDis::SetCodeModule(PBYTE pbBeg, PBYTE pbEnd, BOOL fLimitReferencesToModule)\n{\n    if (pbEnd < pbBeg) {\n        return FALSE;\n    }\n\n    s_pbModuleBeg = pbBeg;\n    s_pbModuleEnd = pbEnd;\n    s_fLimitReferencesToModule = fLimitReferencesToModule;\n\n    return TRUE;\n}\n\n///////////////////////////////////////////////////////// Disassembler Tables.\n//\nconst BYTE CDetourDis::s_rbModRm[256] = {\n    0,0,0,0, SIB|1,RIP|4,0,0, 0,0,0,0, SIB|1,RIP|4,0,0, // 0x\n    0,0,0,0, SIB|1,RIP|4,0,0, 0,0,0,0, SIB|1,RIP|4,0,0, // 1x\n    0,0,0,0, SIB|1,RIP|4,0,0, 0,0,0,0, SIB|1,RIP|4,0,0, // 2x\n    0,0,0,0, SIB|1,RIP|4,0,0, 0,0,0,0, SIB|1,RIP|4,0,0, // 3x\n    1,1,1,1, 2,1,1,1, 1,1,1,1, 2,1,1,1,                 // 4x\n    1,1,1,1, 2,1,1,1, 1,1,1,1, 2,1,1,1,                 // 5x\n    1,1,1,1, 2,1,1,1, 1,1,1,1, 2,1,1,1,                 // 6x\n    1,1,1,1, 2,1,1,1, 1,1,1,1, 2,1,1,1,                 // 7x\n    4,4,4,4, 5,4,4,4, 4,4,4,4, 5,4,4,4,                 // 8x\n    4,4,4,4, 5,4,4,4, 4,4,4,4, 5,4,4,4,                 // 9x\n    4,4,4,4, 5,4,4,4, 4,4,4,4, 5,4,4,4,                 // Ax\n    4,4,4,4, 5,4,4,4, 4,4,4,4, 5,4,4,4,                 // Bx\n    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,                 // Cx\n    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,                 // Dx\n    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,                 // Ex\n    0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0                  // Fx\n};\n\nconst CDetourDis::COPYENTRY CDetourDis::s_rceCopyTable[] =\n{\n    /* 00 */ ENTRY_CopyBytes2Mod,                      // ADD /r\n    /* 01 */ ENTRY_CopyBytes2Mod,                      // ADD /r\n    /* 02 */ ENTRY_CopyBytes2Mod,                      // ADD /r\n    /* 03 */ ENTRY_CopyBytes2Mod,                      // ADD /r\n    /* 04 */ ENTRY_CopyBytes2,                         // ADD ib\n    /* 05 */ ENTRY_CopyBytes3Or5,                      // ADD iw\n#ifdef DETOURS_X64\n    /* 06 */ ENTRY_Invalid,                            // Invalid\n    /* 07 */ ENTRY_Invalid,                            // Invalid\n#else\n    /* 06 */ ENTRY_CopyBytes1,                         // PUSH\n    /* 07 */ ENTRY_CopyBytes1,                         // POP\n#endif\n    /* 08 */ ENTRY_CopyBytes2Mod,                      // OR /r\n    /* 09 */ ENTRY_CopyBytes2Mod,                      // OR /r\n    /* 0A */ ENTRY_CopyBytes2Mod,                      // OR /r\n    /* 0B */ ENTRY_CopyBytes2Mod,                      // OR /r\n    /* 0C */ ENTRY_CopyBytes2,                         // OR ib\n    /* 0D */ ENTRY_CopyBytes3Or5,                      // OR iw\n#ifdef DETOURS_X64\n    /* 0E */ ENTRY_Invalid,                            // Invalid\n#else\n    /* 0E */ ENTRY_CopyBytes1,                         // PUSH\n#endif\n    /* 0F */ ENTRY_Copy0F,                             // Extension Ops\n    /* 10 */ ENTRY_CopyBytes2Mod,                      // ADC /r\n    /* 11 */ ENTRY_CopyBytes2Mod,                      // ADC /r\n    /* 12 */ ENTRY_CopyBytes2Mod,                      // ADC /r\n    /* 13 */ ENTRY_CopyBytes2Mod,                      // ADC /r\n    /* 14 */ ENTRY_CopyBytes2,                         // ADC ib\n    /* 15 */ ENTRY_CopyBytes3Or5,                      // ADC id\n#ifdef DETOURS_X64\n    /* 16 */ ENTRY_Invalid,                            // Invalid\n    /* 17 */ ENTRY_Invalid,                            // Invalid\n#else\n    /* 16 */ ENTRY_CopyBytes1,                         // PUSH\n    /* 17 */ ENTRY_CopyBytes1,                         // POP\n#endif\n    /* 18 */ ENTRY_CopyBytes2Mod,                      // SBB /r\n    /* 19 */ ENTRY_CopyBytes2Mod,                      // SBB /r\n    /* 1A */ ENTRY_CopyBytes2Mod,                      // SBB /r\n    /* 1B */ ENTRY_CopyBytes2Mod,                      // SBB /r\n    /* 1C */ ENTRY_CopyBytes2,                         // SBB ib\n    /* 1D */ ENTRY_CopyBytes3Or5,                      // SBB id\n#ifdef DETOURS_X64\n    /* 1E */ ENTRY_Invalid,                            // Invalid\n    /* 1F */ ENTRY_Invalid,                            // Invalid\n#else\n    /* 1E */ ENTRY_CopyBytes1,                         // PUSH\n    /* 1F */ ENTRY_CopyBytes1,                         // POP\n#endif\n    /* 20 */ ENTRY_CopyBytes2Mod,                      // AND /r\n    /* 21 */ ENTRY_CopyBytes2Mod,                      // AND /r\n    /* 22 */ ENTRY_CopyBytes2Mod,                      // AND /r\n    /* 23 */ ENTRY_CopyBytes2Mod,                      // AND /r\n    /* 24 */ ENTRY_CopyBytes2,                         // AND ib\n    /* 25 */ ENTRY_CopyBytes3Or5,                      // AND id\n    /* 26 */ ENTRY_CopyBytesSegment,                   // ES prefix\n#ifdef DETOURS_X64\n    /* 27 */ ENTRY_Invalid,                            // Invalid\n#else\n    /* 27 */ ENTRY_CopyBytes1,                         // DAA\n#endif\n    /* 28 */ ENTRY_CopyBytes2Mod,                      // SUB /r\n    /* 29 */ ENTRY_CopyBytes2Mod,                      // SUB /r\n    /* 2A */ ENTRY_CopyBytes2Mod,                      // SUB /r\n    /* 2B */ ENTRY_CopyBytes2Mod,                      // SUB /r\n    /* 2C */ ENTRY_CopyBytes2,                         // SUB ib\n    /* 2D */ ENTRY_CopyBytes3Or5,                      // SUB id\n    /* 2E */ ENTRY_CopyBytesSegment,                   // CS prefix\n#ifdef DETOURS_X64\n    /* 2F */ ENTRY_Invalid,                            // Invalid\n#else\n    /* 2F */ ENTRY_CopyBytes1,                         // DAS\n#endif\n    /* 30 */ ENTRY_CopyBytes2Mod,                      // XOR /r\n    /* 31 */ ENTRY_CopyBytes2Mod,                      // XOR /r\n    /* 32 */ ENTRY_CopyBytes2Mod,                      // XOR /r\n    /* 33 */ ENTRY_CopyBytes2Mod,                      // XOR /r\n    /* 34 */ ENTRY_CopyBytes2,                         // XOR ib\n    /* 35 */ ENTRY_CopyBytes3Or5,                      // XOR id\n    /* 36 */ ENTRY_CopyBytesSegment,                   // SS prefix\n#ifdef DETOURS_X64\n    /* 37 */ ENTRY_Invalid,                            // Invalid\n#else\n    /* 37 */ ENTRY_CopyBytes1,                         // AAA\n#endif\n    /* 38 */ ENTRY_CopyBytes2Mod,                      // CMP /r\n    /* 39 */ ENTRY_CopyBytes2Mod,                      // CMP /r\n    /* 3A */ ENTRY_CopyBytes2Mod,                      // CMP /r\n    /* 3B */ ENTRY_CopyBytes2Mod,                      // CMP /r\n    /* 3C */ ENTRY_CopyBytes2,                         // CMP ib\n    /* 3D */ ENTRY_CopyBytes3Or5,                      // CMP id\n    /* 3E */ ENTRY_CopyBytesSegment,                   // DS prefix\n#ifdef DETOURS_X64\n    /* 3F */ ENTRY_Invalid,                            // Invalid\n#else\n    /* 3F */ ENTRY_CopyBytes1,                         // AAS\n#endif\n#ifdef DETOURS_X64 // For Rax Prefix\n    /* 40 */ ENTRY_CopyBytesRax,                       // Rax\n    /* 41 */ ENTRY_CopyBytesRax,                       // Rax\n    /* 42 */ ENTRY_CopyBytesRax,                       // Rax\n    /* 43 */ ENTRY_CopyBytesRax,                       // Rax\n    /* 44 */ ENTRY_CopyBytesRax,                       // Rax\n    /* 45 */ ENTRY_CopyBytesRax,                       // Rax\n    /* 46 */ ENTRY_CopyBytesRax,                       // Rax\n    /* 47 */ ENTRY_CopyBytesRax,                       // Rax\n    /* 48 */ ENTRY_CopyBytesRax,                       // Rax\n    /* 49 */ ENTRY_CopyBytesRax,                       // Rax\n    /* 4A */ ENTRY_CopyBytesRax,                       // Rax\n    /* 4B */ ENTRY_CopyBytesRax,                       // Rax\n    /* 4C */ ENTRY_CopyBytesRax,                       // Rax\n    /* 4D */ ENTRY_CopyBytesRax,                       // Rax\n    /* 4E */ ENTRY_CopyBytesRax,                       // Rax\n    /* 4F */ ENTRY_CopyBytesRax,                       // Rax\n#else\n    /* 40 */ ENTRY_CopyBytes1,                         // INC\n    /* 41 */ ENTRY_CopyBytes1,                         // INC\n    /* 42 */ ENTRY_CopyBytes1,                         // INC\n    /* 43 */ ENTRY_CopyBytes1,                         // INC\n    /* 44 */ ENTRY_CopyBytes1,                         // INC\n    /* 45 */ ENTRY_CopyBytes1,                         // INC\n    /* 46 */ ENTRY_CopyBytes1,                         // INC\n    /* 47 */ ENTRY_CopyBytes1,                         // INC\n    /* 48 */ ENTRY_CopyBytes1,                         // DEC\n    /* 49 */ ENTRY_CopyBytes1,                         // DEC\n    /* 4A */ ENTRY_CopyBytes1,                         // DEC\n    /* 4B */ ENTRY_CopyBytes1,                         // DEC\n    /* 4C */ ENTRY_CopyBytes1,                         // DEC\n    /* 4D */ ENTRY_CopyBytes1,                         // DEC\n    /* 4E */ ENTRY_CopyBytes1,                         // DEC\n    /* 4F */ ENTRY_CopyBytes1,                         // DEC\n#endif\n    /* 50 */ ENTRY_CopyBytes1,                         // PUSH\n    /* 51 */ ENTRY_CopyBytes1,                         // PUSH\n    /* 52 */ ENTRY_CopyBytes1,                         // PUSH\n    /* 53 */ ENTRY_CopyBytes1,                         // PUSH\n    /* 54 */ ENTRY_CopyBytes1,                         // PUSH\n    /* 55 */ ENTRY_CopyBytes1,                         // PUSH\n    /* 56 */ ENTRY_CopyBytes1,                         // PUSH\n    /* 57 */ ENTRY_CopyBytes1,                         // PUSH\n    /* 58 */ ENTRY_CopyBytes1,                         // POP\n    /* 59 */ ENTRY_CopyBytes1,                         // POP\n    /* 5A */ ENTRY_CopyBytes1,                         // POP\n    /* 5B */ ENTRY_CopyBytes1,                         // POP\n    /* 5C */ ENTRY_CopyBytes1,                         // POP\n    /* 5D */ ENTRY_CopyBytes1,                         // POP\n    /* 5E */ ENTRY_CopyBytes1,                         // POP\n    /* 5F */ ENTRY_CopyBytes1,                         // POP\n#ifdef DETOURS_X64\n    /* 60 */ ENTRY_Invalid,                            // Invalid\n    /* 61 */ ENTRY_Invalid,                            // Invalid\n    /* 62 */ ENTRY_CopyEvex,                           // EVEX / AVX512\n#else\n    /* 60 */ ENTRY_CopyBytes1,                         // PUSHAD\n    /* 61 */ ENTRY_CopyBytes1,                         // POPAD\n    /* 62 */ ENTRY_CopyEvex,                           // BOUND /r and EVEX / AVX512\n#endif\n    /* 63 */ ENTRY_CopyBytes2Mod,                      // 32bit ARPL /r, 64bit MOVSXD\n    /* 64 */ ENTRY_CopyBytesSegment,                   // FS prefix\n    /* 65 */ ENTRY_CopyBytesSegment,                   // GS prefix\n    /* 66 */ ENTRY_Copy66,                             // Operand Prefix\n    /* 67 */ ENTRY_Copy67,                             // Address Prefix\n    /* 68 */ ENTRY_CopyBytes3Or5,                      // PUSH\n    /* 69 */ ENTRY_CopyBytes2ModOperand,               // IMUL /r iz\n    /* 6A */ ENTRY_CopyBytes2,                         // PUSH\n    /* 6B */ ENTRY_CopyBytes2Mod1,                     // IMUL /r ib\n    /* 6C */ ENTRY_CopyBytes1,                         // INS\n    /* 6D */ ENTRY_CopyBytes1,                         // INS\n    /* 6E */ ENTRY_CopyBytes1,                         // OUTS/OUTSB\n    /* 6F */ ENTRY_CopyBytes1,                         // OUTS/OUTSW\n    /* 70 */ ENTRY_CopyBytes2Jump,                     // JO           // 0f80\n    /* 71 */ ENTRY_CopyBytes2Jump,                     // JNO          // 0f81\n    /* 72 */ ENTRY_CopyBytes2Jump,                     // JB/JC/JNAE   // 0f82\n    /* 73 */ ENTRY_CopyBytes2Jump,                     // JAE/JNB/JNC  // 0f83\n    /* 74 */ ENTRY_CopyBytes2Jump,                     // JE/JZ        // 0f84\n    /* 75 */ ENTRY_CopyBytes2Jump,                     // JNE/JNZ      // 0f85\n    /* 76 */ ENTRY_CopyBytes2Jump,                     // JBE/JNA      // 0f86\n    /* 77 */ ENTRY_CopyBytes2Jump,                     // JA/JNBE      // 0f87\n    /* 78 */ ENTRY_CopyBytes2Jump,                     // JS           // 0f88\n    /* 79 */ ENTRY_CopyBytes2Jump,                     // JNS          // 0f89\n    /* 7A */ ENTRY_CopyBytes2Jump,                     // JP/JPE       // 0f8a\n    /* 7B */ ENTRY_CopyBytes2Jump,                     // JNP/JPO      // 0f8b\n    /* 7C */ ENTRY_CopyBytes2Jump,                     // JL/JNGE      // 0f8c\n    /* 7D */ ENTRY_CopyBytes2Jump,                     // JGE/JNL      // 0f8d\n    /* 7E */ ENTRY_CopyBytes2Jump,                     // JLE/JNG      // 0f8e\n    /* 7F */ ENTRY_CopyBytes2Jump,                     // JG/JNLE      // 0f8f\n    /* 80 */ ENTRY_CopyBytes2Mod1,                     // ADD/0 OR/1 ADC/2 SBB/3 AND/4 SUB/5 XOR/6 CMP/7 byte reg, immediate byte\n    /* 81 */ ENTRY_CopyBytes2ModOperand,               // ADD/0 OR/1 ADC/2 SBB/3 AND/4 SUB/5 XOR/6 CMP/7 byte reg, immediate word or dword\n#ifdef DETOURS_X64\n    /* 82 */ ENTRY_Invalid,                            // Invalid\n#else\n    /* 82 */ ENTRY_CopyBytes2Mod1,                     // MOV al,x\n#endif\n    /* 83 */ ENTRY_CopyBytes2Mod1,                     // ADD/0 OR/1 ADC/2 SBB/3 AND/4 SUB/5 XOR/6 CMP/7 reg, immediate byte\n    /* 84 */ ENTRY_CopyBytes2Mod,                      // TEST /r\n    /* 85 */ ENTRY_CopyBytes2Mod,                      // TEST /r\n    /* 86 */ ENTRY_CopyBytes2Mod,                      // XCHG /r @todo\n    /* 87 */ ENTRY_CopyBytes2Mod,                      // XCHG /r @todo\n    /* 88 */ ENTRY_CopyBytes2Mod,                      // MOV /r\n    /* 89 */ ENTRY_CopyBytes2Mod,                      // MOV /r\n    /* 8A */ ENTRY_CopyBytes2Mod,                      // MOV /r\n    /* 8B */ ENTRY_CopyBytes2Mod,                      // MOV /r\n    /* 8C */ ENTRY_CopyBytes2Mod,                      // MOV /r\n    /* 8D */ ENTRY_CopyBytes2Mod,                      // LEA /r\n    /* 8E */ ENTRY_CopyBytes2Mod,                      // MOV /r\n    /* 8F */ ENTRY_CopyXop,                            // POP /0 or AMD XOP\n    /* 90 */ ENTRY_CopyBytes1,                         // NOP\n    /* 91 */ ENTRY_CopyBytes1,                         // XCHG\n    /* 92 */ ENTRY_CopyBytes1,                         // XCHG\n    /* 93 */ ENTRY_CopyBytes1,                         // XCHG\n    /* 94 */ ENTRY_CopyBytes1,                         // XCHG\n    /* 95 */ ENTRY_CopyBytes1,                         // XCHG\n    /* 96 */ ENTRY_CopyBytes1,                         // XCHG\n    /* 97 */ ENTRY_CopyBytes1,                         // XCHG\n    /* 98 */ ENTRY_CopyBytes1,                         // CWDE\n    /* 99 */ ENTRY_CopyBytes1,                         // CDQ\n#ifdef DETOURS_X64\n    /* 9A */ ENTRY_Invalid,                            // Invalid\n#else\n    /* 9A */ ENTRY_CopyBytes5Or7Dynamic,               // CALL cp\n#endif\n    /* 9B */ ENTRY_CopyBytes1,                         // WAIT/FWAIT\n    /* 9C */ ENTRY_CopyBytes1,                         // PUSHFD\n    /* 9D */ ENTRY_CopyBytes1,                         // POPFD\n    /* 9E */ ENTRY_CopyBytes1,                         // SAHF\n    /* 9F */ ENTRY_CopyBytes1,                         // LAHF\n    /* A0 */ ENTRY_CopyBytes1Address,                  // MOV\n    /* A1 */ ENTRY_CopyBytes1Address,                  // MOV\n    /* A2 */ ENTRY_CopyBytes1Address,                  // MOV\n    /* A3 */ ENTRY_CopyBytes1Address,                  // MOV\n    /* A4 */ ENTRY_CopyBytes1,                         // MOVS\n    /* A5 */ ENTRY_CopyBytes1,                         // MOVS/MOVSD\n    /* A6 */ ENTRY_CopyBytes1,                         // CMPS/CMPSB\n    /* A7 */ ENTRY_CopyBytes1,                         // CMPS/CMPSW\n    /* A8 */ ENTRY_CopyBytes2,                         // TEST\n    /* A9 */ ENTRY_CopyBytes3Or5,                      // TEST\n    /* AA */ ENTRY_CopyBytes1,                         // STOS/STOSB\n    /* AB */ ENTRY_CopyBytes1,                         // STOS/STOSW\n    /* AC */ ENTRY_CopyBytes1,                         // LODS/LODSB\n    /* AD */ ENTRY_CopyBytes1,                         // LODS/LODSW\n    /* AE */ ENTRY_CopyBytes1,                         // SCAS/SCASB\n    /* AF */ ENTRY_CopyBytes1,                         // SCAS/SCASD\n    /* B0 */ ENTRY_CopyBytes2,                         // MOV B0+rb\n    /* B1 */ ENTRY_CopyBytes2,                         // MOV B0+rb\n    /* B2 */ ENTRY_CopyBytes2,                         // MOV B0+rb\n    /* B3 */ ENTRY_CopyBytes2,                         // MOV B0+rb\n    /* B4 */ ENTRY_CopyBytes2,                         // MOV B0+rb\n    /* B5 */ ENTRY_CopyBytes2,                         // MOV B0+rb\n    /* B6 */ ENTRY_CopyBytes2,                         // MOV B0+rb\n    /* B7 */ ENTRY_CopyBytes2,                         // MOV B0+rb\n    /* B8 */ ENTRY_CopyBytes3Or5Rax,                   // MOV B8+rb\n    /* B9 */ ENTRY_CopyBytes3Or5Rax,                   // MOV B8+rb\n    /* BA */ ENTRY_CopyBytes3Or5Rax,                   // MOV B8+rb\n    /* BB */ ENTRY_CopyBytes3Or5Rax,                   // MOV B8+rb\n    /* BC */ ENTRY_CopyBytes3Or5Rax,                   // MOV B8+rb\n    /* BD */ ENTRY_CopyBytes3Or5Rax,                   // MOV B8+rb\n    /* BE */ ENTRY_CopyBytes3Or5Rax,                   // MOV B8+rb\n    /* BF */ ENTRY_CopyBytes3Or5Rax,                   // MOV B8+rb\n    /* C0 */ ENTRY_CopyBytes2Mod1,                     // RCL/2 ib, etc.\n    /* C1 */ ENTRY_CopyBytes2Mod1,                     // RCL/2 ib, etc.\n    /* C2 */ ENTRY_CopyBytes3,                         // RET\n    /* C3 */ ENTRY_CopyBytes1,                         // RET\n    /* C4 */ ENTRY_CopyVex3,                           // LES, VEX 3-byte opcodes.\n    /* C5 */ ENTRY_CopyVex2,                           // LDS, VEX 2-byte opcodes.\n    /* C6 */ ENTRY_CopyBytes2Mod1,                     // MOV\n    /* C7 */ ENTRY_CopyBytes2ModOperand,               // MOV/0 XBEGIN/7\n    /* C8 */ ENTRY_CopyBytes4,                         // ENTER\n    /* C9 */ ENTRY_CopyBytes1,                         // LEAVE\n    /* CA */ ENTRY_CopyBytes3Dynamic,                  // RET\n    /* CB */ ENTRY_CopyBytes1Dynamic,                  // RET\n    /* CC */ ENTRY_CopyBytes1Dynamic,                  // INT 3\n    /* CD */ ENTRY_CopyBytes2Dynamic,                  // INT ib\n#ifdef DETOURS_X64\n    /* CE */ ENTRY_Invalid,                            // Invalid\n#else\n    /* CE */ ENTRY_CopyBytes1Dynamic,                  // INTO\n#endif\n    /* CF */ ENTRY_CopyBytes1Dynamic,                  // IRET\n    /* D0 */ ENTRY_CopyBytes2Mod,                      // RCL/2, etc.\n    /* D1 */ ENTRY_CopyBytes2Mod,                      // RCL/2, etc.\n    /* D2 */ ENTRY_CopyBytes2Mod,                      // RCL/2, etc.\n    /* D3 */ ENTRY_CopyBytes2Mod,                      // RCL/2, etc.\n#ifdef DETOURS_X64\n    /* D4 */ ENTRY_Invalid,                            // Invalid\n    /* D5 */ ENTRY_Invalid,                            // Invalid\n#else\n    /* D4 */ ENTRY_CopyBytes2,                         // AAM\n    /* D5 */ ENTRY_CopyBytes2,                         // AAD\n#endif\n    /* D6 */ ENTRY_Invalid,                            // Invalid\n    /* D7 */ ENTRY_CopyBytes1,                         // XLAT/XLATB\n    /* D8 */ ENTRY_CopyBytes2Mod,                      // FADD, etc.\n    /* D9 */ ENTRY_CopyBytes2Mod,                      // F2XM1, etc.\n    /* DA */ ENTRY_CopyBytes2Mod,                      // FLADD, etc.\n    /* DB */ ENTRY_CopyBytes2Mod,                      // FCLEX, etc.\n    /* DC */ ENTRY_CopyBytes2Mod,                      // FADD/0, etc.\n    /* DD */ ENTRY_CopyBytes2Mod,                      // FFREE, etc.\n    /* DE */ ENTRY_CopyBytes2Mod,                      // FADDP, etc.\n    /* DF */ ENTRY_CopyBytes2Mod,                      // FBLD/4, etc.\n    /* E0 */ ENTRY_CopyBytes2CantJump,                 // LOOPNE cb\n    /* E1 */ ENTRY_CopyBytes2CantJump,                 // LOOPE cb\n    /* E2 */ ENTRY_CopyBytes2CantJump,                 // LOOP cb\n    /* E3 */ ENTRY_CopyBytes2CantJump,                 // JCXZ/JECXZ\n    /* E4 */ ENTRY_CopyBytes2,                         // IN ib\n    /* E5 */ ENTRY_CopyBytes2,                         // IN id\n    /* E6 */ ENTRY_CopyBytes2,                         // OUT ib\n    /* E7 */ ENTRY_CopyBytes2,                         // OUT ib\n    /* E8 */ ENTRY_CopyBytes3Or5Target,                // CALL cd\n    /* E9 */ ENTRY_CopyBytes3Or5Target,                // JMP cd\n#ifdef DETOURS_X64\n    /* EA */ ENTRY_Invalid,                            // Invalid\n#else\n    /* EA */ ENTRY_CopyBytes5Or7Dynamic,               // JMP cp\n#endif\n    /* EB */ ENTRY_CopyBytes2Jump,                     // JMP cb\n    /* EC */ ENTRY_CopyBytes1,                         // IN ib\n    /* ED */ ENTRY_CopyBytes1,                         // IN id\n    /* EE */ ENTRY_CopyBytes1,                         // OUT\n    /* EF */ ENTRY_CopyBytes1,                         // OUT\n    /* F0 */ ENTRY_CopyBytesPrefix,                    // LOCK prefix\n    /* F1 */ ENTRY_CopyBytes1Dynamic,                  // INT1 / ICEBP somewhat documented by AMD, not by Intel\n    /* F2 */ ENTRY_CopyF2,                             // REPNE prefix\n//#ifdef DETOURS_X86\n    /* F3 */ ENTRY_CopyF3,                             // REPE prefix\n//#else\n// This does presently suffice for AMD64 but it requires tracing\n// through a bunch of code to verify and seems not worth maintaining.\n//  /* F3 */ ENTRY_CopyBytesPrefix,                    // REPE prefix\n//#endif\n    /* F4 */ ENTRY_CopyBytes1,                         // HLT\n    /* F5 */ ENTRY_CopyBytes1,                         // CMC\n    /* F6 */ ENTRY_CopyF6,                             // TEST/0, DIV/6\n    /* F7 */ ENTRY_CopyF7,                             // TEST/0, DIV/6\n    /* F8 */ ENTRY_CopyBytes1,                         // CLC\n    /* F9 */ ENTRY_CopyBytes1,                         // STC\n    /* FA */ ENTRY_CopyBytes1,                         // CLI\n    /* FB */ ENTRY_CopyBytes1,                         // STI\n    /* FC */ ENTRY_CopyBytes1,                         // CLD\n    /* FD */ ENTRY_CopyBytes1,                         // STD\n    /* FE */ ENTRY_CopyBytes2Mod,                      // DEC/1,INC/0\n    /* FF */ ENTRY_CopyFF,                             // CALL/2\n};\n\nconst CDetourDis::COPYENTRY CDetourDis::s_rceCopyTable0F[] =\n{\n#ifdef DETOURS_X86\n    /* 00 */ ENTRY_Copy0F00,                           // sldt/0 str/1 lldt/2 ltr/3 err/4 verw/5 jmpe/6/dynamic invalid/7\n#else\n    /* 00 */ ENTRY_CopyBytes2Mod,                      // sldt/0 str/1 lldt/2 ltr/3 err/4 verw/5 jmpe/6/dynamic invalid/7\n#endif\n    /* 01 */ ENTRY_CopyBytes2Mod,                      // INVLPG/7, etc.\n    /* 02 */ ENTRY_CopyBytes2Mod,                      // LAR/r\n    /* 03 */ ENTRY_CopyBytes2Mod,                      // LSL/r\n    /* 04 */ ENTRY_Invalid,                            // _04\n    /* 05 */ ENTRY_CopyBytes1,                         // SYSCALL\n    /* 06 */ ENTRY_CopyBytes1,                         // CLTS\n    /* 07 */ ENTRY_CopyBytes1,                         // SYSRET\n    /* 08 */ ENTRY_CopyBytes1,                         // INVD\n    /* 09 */ ENTRY_CopyBytes1,                         // WBINVD\n    /* 0A */ ENTRY_Invalid,                            // _0A\n    /* 0B */ ENTRY_CopyBytes1,                         // UD2\n    /* 0C */ ENTRY_Invalid,                            // _0C\n    /* 0D */ ENTRY_CopyBytes2Mod,                      // PREFETCH\n    /* 0E */ ENTRY_CopyBytes1,                         // FEMMS (3DNow -- not in Intel documentation)\n    /* 0F */ ENTRY_CopyBytes2Mod1,                     // 3DNow Opcodes\n    /* 10 */ ENTRY_CopyBytes2Mod,                      // MOVSS MOVUPD MOVSD\n    /* 11 */ ENTRY_CopyBytes2Mod,                      // MOVSS MOVUPD MOVSD\n    /* 12 */ ENTRY_CopyBytes2Mod,                      // MOVLPD\n    /* 13 */ ENTRY_CopyBytes2Mod,                      // MOVLPD\n    /* 14 */ ENTRY_CopyBytes2Mod,                      // UNPCKLPD\n    /* 15 */ ENTRY_CopyBytes2Mod,                      // UNPCKHPD\n    /* 16 */ ENTRY_CopyBytes2Mod,                      // MOVHPD\n    /* 17 */ ENTRY_CopyBytes2Mod,                      // MOVHPD\n    /* 18 */ ENTRY_CopyBytes2Mod,                      // PREFETCHINTA...\n    /* 19 */ ENTRY_CopyBytes2Mod,                      // NOP/r multi byte nop, not documented by Intel, documented by AMD\n    /* 1A */ ENTRY_CopyBytes2Mod,                      // NOP/r multi byte nop, not documented by Intel, documented by AMD\n    /* 1B */ ENTRY_CopyBytes2Mod,                      // NOP/r multi byte nop, not documented by Intel, documented by AMD\n    /* 1C */ ENTRY_CopyBytes2Mod,                      // NOP/r multi byte nop, not documented by Intel, documented by AMD\n    /* 1D */ ENTRY_CopyBytes2Mod,                      // NOP/r multi byte nop, not documented by Intel, documented by AMD\n    /* 1E */ ENTRY_CopyBytes2Mod,                      // NOP/r multi byte nop, not documented by Intel, documented by AMD\n    /* 1F */ ENTRY_CopyBytes2Mod,                      // NOP/r multi byte nop\n    /* 20 */ ENTRY_CopyBytes2Mod,                      // MOV/r\n    /* 21 */ ENTRY_CopyBytes2Mod,                      // MOV/r\n    /* 22 */ ENTRY_CopyBytes2Mod,                      // MOV/r\n    /* 23 */ ENTRY_CopyBytes2Mod,                      // MOV/r\n#ifdef DETOURS_X64\n    /* 24 */ ENTRY_Invalid,                            // _24\n#else\n    /* 24 */ ENTRY_CopyBytes2Mod,                      // MOV/r,TR TR is test register on 80386 and 80486, removed in Pentium\n#endif\n    /* 25 */ ENTRY_Invalid,                            // _25\n#ifdef DETOURS_X64\n    /* 26 */ ENTRY_Invalid,                            // _26\n#else\n    /* 26 */ ENTRY_CopyBytes2Mod,                      // MOV TR/r TR is test register on 80386 and 80486, removed in Pentium\n#endif\n    /* 27 */ ENTRY_Invalid,                            // _27\n    /* 28 */ ENTRY_CopyBytes2Mod,                      // MOVAPS MOVAPD\n    /* 29 */ ENTRY_CopyBytes2Mod,                      // MOVAPS MOVAPD\n    /* 2A */ ENTRY_CopyBytes2Mod,                      // CVPI2PS &\n    /* 2B */ ENTRY_CopyBytes2Mod,                      // MOVNTPS MOVNTPD\n    /* 2C */ ENTRY_CopyBytes2Mod,                      // CVTTPS2PI &\n    /* 2D */ ENTRY_CopyBytes2Mod,                      // CVTPS2PI &\n    /* 2E */ ENTRY_CopyBytes2Mod,                      // UCOMISS UCOMISD\n    /* 2F */ ENTRY_CopyBytes2Mod,                      // COMISS COMISD\n    /* 30 */ ENTRY_CopyBytes1,                         // WRMSR\n    /* 31 */ ENTRY_CopyBytes1,                         // RDTSC\n    /* 32 */ ENTRY_CopyBytes1,                         // RDMSR\n    /* 33 */ ENTRY_CopyBytes1,                         // RDPMC\n    /* 34 */ ENTRY_CopyBytes1,                         // SYSENTER\n    /* 35 */ ENTRY_CopyBytes1,                         // SYSEXIT\n    /* 36 */ ENTRY_Invalid,                            // _36\n    /* 37 */ ENTRY_CopyBytes1,                         // GETSEC\n    /* 38 */ ENTRY_CopyBytes3Mod,                      // SSE3 Opcodes\n    /* 39 */ ENTRY_Invalid,                            // _39\n    /* 3A */ ENTRY_CopyBytes3Mod1,                      // SSE3 Opcodes\n    /* 3B */ ENTRY_Invalid,                            // _3B\n    /* 3C */ ENTRY_Invalid,                            // _3C\n    /* 3D */ ENTRY_Invalid,                            // _3D\n    /* 3E */ ENTRY_Invalid,                            // _3E\n    /* 3F */ ENTRY_Invalid,                            // _3F\n    /* 40 */ ENTRY_CopyBytes2Mod,                      // CMOVO (0F 40)\n    /* 41 */ ENTRY_CopyBytes2Mod,                      // CMOVNO (0F 41)\n    /* 42 */ ENTRY_CopyBytes2Mod,                      // CMOVB & CMOVNE (0F 42)\n    /* 43 */ ENTRY_CopyBytes2Mod,                      // CMOVAE & CMOVNB (0F 43)\n    /* 44 */ ENTRY_CopyBytes2Mod,                      // CMOVE & CMOVZ (0F 44)\n    /* 45 */ ENTRY_CopyBytes2Mod,                      // CMOVNE & CMOVNZ (0F 45)\n    /* 46 */ ENTRY_CopyBytes2Mod,                      // CMOVBE & CMOVNA (0F 46)\n    /* 47 */ ENTRY_CopyBytes2Mod,                      // CMOVA & CMOVNBE (0F 47)\n    /* 48 */ ENTRY_CopyBytes2Mod,                      // CMOVS (0F 48)\n    /* 49 */ ENTRY_CopyBytes2Mod,                      // CMOVNS (0F 49)\n    /* 4A */ ENTRY_CopyBytes2Mod,                      // CMOVP & CMOVPE (0F 4A)\n    /* 4B */ ENTRY_CopyBytes2Mod,                      // CMOVNP & CMOVPO (0F 4B)\n    /* 4C */ ENTRY_CopyBytes2Mod,                      // CMOVL & CMOVNGE (0F 4C)\n    /* 4D */ ENTRY_CopyBytes2Mod,                      // CMOVGE & CMOVNL (0F 4D)\n    /* 4E */ ENTRY_CopyBytes2Mod,                      // CMOVLE & CMOVNG (0F 4E)\n    /* 4F */ ENTRY_CopyBytes2Mod,                      // CMOVG & CMOVNLE (0F 4F)\n    /* 50 */ ENTRY_CopyBytes2Mod,                      // MOVMSKPD MOVMSKPD\n    /* 51 */ ENTRY_CopyBytes2Mod,                      // SQRTPS &\n    /* 52 */ ENTRY_CopyBytes2Mod,                      // RSQRTTS RSQRTPS\n    /* 53 */ ENTRY_CopyBytes2Mod,                      // RCPPS RCPSS\n    /* 54 */ ENTRY_CopyBytes2Mod,                      // ANDPS ANDPD\n    /* 55 */ ENTRY_CopyBytes2Mod,                      // ANDNPS ANDNPD\n    /* 56 */ ENTRY_CopyBytes2Mod,                      // ORPS ORPD\n    /* 57 */ ENTRY_CopyBytes2Mod,                      // XORPS XORPD\n    /* 58 */ ENTRY_CopyBytes2Mod,                      // ADDPS &\n    /* 59 */ ENTRY_CopyBytes2Mod,                      // MULPS &\n    /* 5A */ ENTRY_CopyBytes2Mod,                      // CVTPS2PD &\n    /* 5B */ ENTRY_CopyBytes2Mod,                      // CVTDQ2PS &\n    /* 5C */ ENTRY_CopyBytes2Mod,                      // SUBPS &\n    /* 5D */ ENTRY_CopyBytes2Mod,                      // MINPS &\n    /* 5E */ ENTRY_CopyBytes2Mod,                      // DIVPS &\n    /* 5F */ ENTRY_CopyBytes2Mod,                      // MASPS &\n    /* 60 */ ENTRY_CopyBytes2Mod,                      // PUNPCKLBW/r\n    /* 61 */ ENTRY_CopyBytes2Mod,                      // PUNPCKLWD/r\n    /* 62 */ ENTRY_CopyBytes2Mod,                      // PUNPCKLWD/r\n    /* 63 */ ENTRY_CopyBytes2Mod,                      // PACKSSWB/r\n    /* 64 */ ENTRY_CopyBytes2Mod,                      // PCMPGTB/r\n    /* 65 */ ENTRY_CopyBytes2Mod,                      // PCMPGTW/r\n    /* 66 */ ENTRY_CopyBytes2Mod,                      // PCMPGTD/r\n    /* 67 */ ENTRY_CopyBytes2Mod,                      // PACKUSWB/r\n    /* 68 */ ENTRY_CopyBytes2Mod,                      // PUNPCKHBW/r\n    /* 69 */ ENTRY_CopyBytes2Mod,                      // PUNPCKHWD/r\n    /* 6A */ ENTRY_CopyBytes2Mod,                      // PUNPCKHDQ/r\n    /* 6B */ ENTRY_CopyBytes2Mod,                      // PACKSSDW/r\n    /* 6C */ ENTRY_CopyBytes2Mod,                      // PUNPCKLQDQ\n    /* 6D */ ENTRY_CopyBytes2Mod,                      // PUNPCKHQDQ\n    /* 6E */ ENTRY_CopyBytes2Mod,                      // MOVD/r\n    /* 6F */ ENTRY_CopyBytes2Mod,                      // MOV/r\n    /* 70 */ ENTRY_CopyBytes2Mod1,                     // PSHUFW/r ib\n    /* 71 */ ENTRY_CopyBytes2Mod1,                     // PSLLW/6 ib,PSRAW/4 ib,PSRLW/2 ib\n    /* 72 */ ENTRY_CopyBytes2Mod1,                     // PSLLD/6 ib,PSRAD/4 ib,PSRLD/2 ib\n    /* 73 */ ENTRY_CopyBytes2Mod1,                     // PSLLQ/6 ib,PSRLQ/2 ib\n    /* 74 */ ENTRY_CopyBytes2Mod,                      // PCMPEQB/r\n    /* 75 */ ENTRY_CopyBytes2Mod,                      // PCMPEQW/r\n    /* 76 */ ENTRY_CopyBytes2Mod,                      // PCMPEQD/r\n    /* 77 */ ENTRY_CopyBytes1,                         // EMMS\n    // extrq/insertq require mode=3 and are followed by two immediate bytes\n    /* 78 */ ENTRY_Copy0F78,                           // VMREAD/r, 66/EXTRQ/r/ib/ib, F2/INSERTQ/r/ib/ib\n    // extrq/insertq require mod=3, therefore ENTRY_CopyBytes2, but it ends up the same\n    /* 79 */ ENTRY_CopyBytes2Mod,                      // VMWRITE/r, 66/EXTRQ/r, F2/INSERTQ/r\n    /* 7A */ ENTRY_Invalid,                            // _7A\n    /* 7B */ ENTRY_Invalid,                            // _7B\n    /* 7C */ ENTRY_CopyBytes2Mod,                      // HADDPS\n    /* 7D */ ENTRY_CopyBytes2Mod,                      // HSUBPS\n    /* 7E */ ENTRY_CopyBytes2Mod,                      // MOVD/r\n    /* 7F */ ENTRY_CopyBytes2Mod,                      // MOV/r\n    /* 80 */ ENTRY_CopyBytes3Or5Target,                // JO\n    /* 81 */ ENTRY_CopyBytes3Or5Target,                // JNO\n    /* 82 */ ENTRY_CopyBytes3Or5Target,                // JB,JC,JNAE\n    /* 83 */ ENTRY_CopyBytes3Or5Target,                // JAE,JNB,JNC\n    /* 84 */ ENTRY_CopyBytes3Or5Target,                // JE,JZ,JZ\n    /* 85 */ ENTRY_CopyBytes3Or5Target,                // JNE,JNZ\n    /* 86 */ ENTRY_CopyBytes3Or5Target,                // JBE,JNA\n    /* 87 */ ENTRY_CopyBytes3Or5Target,                // JA,JNBE\n    /* 88 */ ENTRY_CopyBytes3Or5Target,                // JS\n    /* 89 */ ENTRY_CopyBytes3Or5Target,                // JNS\n    /* 8A */ ENTRY_CopyBytes3Or5Target,                // JP,JPE\n    /* 8B */ ENTRY_CopyBytes3Or5Target,                // JNP,JPO\n    /* 8C */ ENTRY_CopyBytes3Or5Target,                // JL,NGE\n    /* 8D */ ENTRY_CopyBytes3Or5Target,                // JGE,JNL\n    /* 8E */ ENTRY_CopyBytes3Or5Target,                // JLE,JNG\n    /* 8F */ ENTRY_CopyBytes3Or5Target,                // JG,JNLE\n    /* 90 */ ENTRY_CopyBytes2Mod,                      // CMOVO (0F 40)\n    /* 91 */ ENTRY_CopyBytes2Mod,                      // CMOVNO (0F 41)\n    /* 92 */ ENTRY_CopyBytes2Mod,                      // CMOVB & CMOVC & CMOVNAE (0F 42)\n    /* 93 */ ENTRY_CopyBytes2Mod,                      // CMOVAE & CMOVNB & CMOVNC (0F 43)\n    /* 94 */ ENTRY_CopyBytes2Mod,                      // CMOVE & CMOVZ (0F 44)\n    /* 95 */ ENTRY_CopyBytes2Mod,                      // CMOVNE & CMOVNZ (0F 45)\n    /* 96 */ ENTRY_CopyBytes2Mod,                      // CMOVBE & CMOVNA (0F 46)\n    /* 97 */ ENTRY_CopyBytes2Mod,                      // CMOVA & CMOVNBE (0F 47)\n    /* 98 */ ENTRY_CopyBytes2Mod,                      // CMOVS (0F 48)\n    /* 99 */ ENTRY_CopyBytes2Mod,                      // CMOVNS (0F 49)\n    /* 9A */ ENTRY_CopyBytes2Mod,                      // CMOVP & CMOVPE (0F 4A)\n    /* 9B */ ENTRY_CopyBytes2Mod,                      // CMOVNP & CMOVPO (0F 4B)\n    /* 9C */ ENTRY_CopyBytes2Mod,                      // CMOVL & CMOVNGE (0F 4C)\n    /* 9D */ ENTRY_CopyBytes2Mod,                      // CMOVGE & CMOVNL (0F 4D)\n    /* 9E */ ENTRY_CopyBytes2Mod,                      // CMOVLE & CMOVNG (0F 4E)\n    /* 9F */ ENTRY_CopyBytes2Mod,                      // CMOVG & CMOVNLE (0F 4F)\n    /* A0 */ ENTRY_CopyBytes1,                         // PUSH\n    /* A1 */ ENTRY_CopyBytes1,                         // POP\n    /* A2 */ ENTRY_CopyBytes1,                         // CPUID\n    /* A3 */ ENTRY_CopyBytes2Mod,                      // BT  (0F A3)\n    /* A4 */ ENTRY_CopyBytes2Mod1,                     // SHLD\n    /* A5 */ ENTRY_CopyBytes2Mod,                      // SHLD\n    /* A6 */ ENTRY_CopyBytes2Mod,                      // XBTS\n    /* A7 */ ENTRY_CopyBytes2Mod,                      // IBTS\n    /* A8 */ ENTRY_CopyBytes1,                         // PUSH\n    /* A9 */ ENTRY_CopyBytes1,                         // POP\n    /* AA */ ENTRY_CopyBytes1,                         // RSM\n    /* AB */ ENTRY_CopyBytes2Mod,                      // BTS (0F AB)\n    /* AC */ ENTRY_CopyBytes2Mod1,                     // SHRD\n    /* AD */ ENTRY_CopyBytes2Mod,                      // SHRD\n\n    // 0F AE mod76=mem mod543=0 fxsave\n    // 0F AE mod76=mem mod543=1 fxrstor\n    // 0F AE mod76=mem mod543=2 ldmxcsr\n    // 0F AE mod76=mem mod543=3 stmxcsr\n    // 0F AE mod76=mem mod543=4 xsave\n    // 0F AE mod76=mem mod543=5 xrstor\n    // 0F AE mod76=mem mod543=6 saveopt\n    // 0F AE mod76=mem mod543=7 clflush\n    // 0F AE mod76=11b mod543=5 lfence\n    // 0F AE mod76=11b mod543=6 mfence\n    // 0F AE mod76=11b mod543=7 sfence\n    // F3 0F AE mod76=11b mod543=0 rdfsbase\n    // F3 0F AE mod76=11b mod543=1 rdgsbase\n    // F3 0F AE mod76=11b mod543=2 wrfsbase\n    // F3 0F AE mod76=11b mod543=3 wrgsbase\n    /* AE */ ENTRY_CopyBytes2Mod,                      // fxsave fxrstor ldmxcsr stmxcsr xsave xrstor saveopt clflush lfence mfence sfence rdfsbase rdgsbase wrfsbase wrgsbase\n    /* AF */ ENTRY_CopyBytes2Mod,                      // IMUL (0F AF)\n    /* B0 */ ENTRY_CopyBytes2Mod,                      // CMPXCHG (0F B0)\n    /* B1 */ ENTRY_CopyBytes2Mod,                      // CMPXCHG (0F B1)\n    /* B2 */ ENTRY_CopyBytes2Mod,                      // LSS/r\n    /* B3 */ ENTRY_CopyBytes2Mod,                      // BTR (0F B3)\n    /* B4 */ ENTRY_CopyBytes2Mod,                      // LFS/r\n    /* B5 */ ENTRY_CopyBytes2Mod,                      // LGS/r\n    /* B6 */ ENTRY_CopyBytes2Mod,                      // MOVZX/r\n    /* B7 */ ENTRY_CopyBytes2Mod,                      // MOVZX/r\n#ifdef DETOURS_X86\n    /* B8 */ ENTRY_Copy0FB8,                           // jmpe f3/popcnt\n#else\n    /* B8 */ ENTRY_CopyBytes2Mod,                      // f3/popcnt\n#endif\n    /* B9 */ ENTRY_Invalid,                            // _B9\n    /* BA */ ENTRY_CopyBytes2Mod1,                     // BT & BTC & BTR & BTS (0F BA)\n    /* BB */ ENTRY_CopyBytes2Mod,                      // BTC (0F BB)\n    /* BC */ ENTRY_CopyBytes2Mod,                      // BSF (0F BC)\n    /* BD */ ENTRY_CopyBytes2Mod,                      // BSR (0F BD)\n    /* BE */ ENTRY_CopyBytes2Mod,                      // MOVSX/r\n    /* BF */ ENTRY_CopyBytes2Mod,                      // MOVSX/r\n    /* C0 */ ENTRY_CopyBytes2Mod,                      // XADD/r\n    /* C1 */ ENTRY_CopyBytes2Mod,                      // XADD/r\n    /* C2 */ ENTRY_CopyBytes2Mod1,                     // CMPPS &\n    /* C3 */ ENTRY_CopyBytes2Mod,                      // MOVNTI\n    /* C4 */ ENTRY_CopyBytes2Mod1,                     // PINSRW /r ib\n    /* C5 */ ENTRY_CopyBytes2Mod1,                     // PEXTRW /r ib\n    /* C6 */ ENTRY_CopyBytes2Mod1,                     // SHUFPS & SHUFPD\n    /* C7 */ ENTRY_CopyBytes2Mod,                      // CMPXCHG8B (0F C7)\n    /* C8 */ ENTRY_CopyBytes1,                         // BSWAP 0F C8 + rd\n    /* C9 */ ENTRY_CopyBytes1,                         // BSWAP 0F C8 + rd\n    /* CA */ ENTRY_CopyBytes1,                         // BSWAP 0F C8 + rd\n    /* CB */ ENTRY_CopyBytes1,                         // CVTPD2PI BSWAP 0F C8 + rd\n    /* CC */ ENTRY_CopyBytes1,                         // BSWAP 0F C8 + rd\n    /* CD */ ENTRY_CopyBytes1,                         // BSWAP 0F C8 + rd\n    /* CE */ ENTRY_CopyBytes1,                         // BSWAP 0F C8 + rd\n    /* CF */ ENTRY_CopyBytes1,                         // BSWAP 0F C8 + rd\n    /* D0 */ ENTRY_CopyBytes2Mod,                      // ADDSUBPS (untestd)\n    /* D1 */ ENTRY_CopyBytes2Mod,                      // PSRLW/r\n    /* D2 */ ENTRY_CopyBytes2Mod,                      // PSRLD/r\n    /* D3 */ ENTRY_CopyBytes2Mod,                      // PSRLQ/r\n    /* D4 */ ENTRY_CopyBytes2Mod,                      // PADDQ\n    /* D5 */ ENTRY_CopyBytes2Mod,                      // PMULLW/r\n    /* D6 */ ENTRY_CopyBytes2Mod,                      // MOVDQ2Q / MOVQ2DQ\n    /* D7 */ ENTRY_CopyBytes2Mod,                      // PMOVMSKB/r\n    /* D8 */ ENTRY_CopyBytes2Mod,                      // PSUBUSB/r\n    /* D9 */ ENTRY_CopyBytes2Mod,                      // PSUBUSW/r\n    /* DA */ ENTRY_CopyBytes2Mod,                      // PMINUB/r\n    /* DB */ ENTRY_CopyBytes2Mod,                      // PAND/r\n    /* DC */ ENTRY_CopyBytes2Mod,                      // PADDUSB/r\n    /* DD */ ENTRY_CopyBytes2Mod,                      // PADDUSW/r\n    /* DE */ ENTRY_CopyBytes2Mod,                      // PMAXUB/r\n    /* DF */ ENTRY_CopyBytes2Mod,                      // PANDN/r\n    /* E0 */ ENTRY_CopyBytes2Mod ,                     // PAVGB\n    /* E1 */ ENTRY_CopyBytes2Mod,                      // PSRAW/r\n    /* E2 */ ENTRY_CopyBytes2Mod,                      // PSRAD/r\n    /* E3 */ ENTRY_CopyBytes2Mod,                      // PAVGW\n    /* E4 */ ENTRY_CopyBytes2Mod,                      // PMULHUW/r\n    /* E5 */ ENTRY_CopyBytes2Mod,                      // PMULHW/r\n    /* E6 */ ENTRY_CopyBytes2Mod,                      // CTDQ2PD &\n    /* E7 */ ENTRY_CopyBytes2Mod,                      // MOVNTQ\n    /* E8 */ ENTRY_CopyBytes2Mod,                      // PSUBB/r\n    /* E9 */ ENTRY_CopyBytes2Mod,                      // PSUBW/r\n    /* EA */ ENTRY_CopyBytes2Mod,                      // PMINSW/r\n    /* EB */ ENTRY_CopyBytes2Mod,                      // POR/r\n    /* EC */ ENTRY_CopyBytes2Mod,                      // PADDSB/r\n    /* ED */ ENTRY_CopyBytes2Mod,                      // PADDSW/r\n    /* EE */ ENTRY_CopyBytes2Mod,                      // PMAXSW /r\n    /* EF */ ENTRY_CopyBytes2Mod,                      // PXOR/r\n    /* F0 */ ENTRY_CopyBytes2Mod,                      // LDDQU\n    /* F1 */ ENTRY_CopyBytes2Mod,                      // PSLLW/r\n    /* F2 */ ENTRY_CopyBytes2Mod,                      // PSLLD/r\n    /* F3 */ ENTRY_CopyBytes2Mod,                      // PSLLQ/r\n    /* F4 */ ENTRY_CopyBytes2Mod,                      // PMULUDQ/r\n    /* F5 */ ENTRY_CopyBytes2Mod,                      // PMADDWD/r\n    /* F6 */ ENTRY_CopyBytes2Mod,                      // PSADBW/r\n    /* F7 */ ENTRY_CopyBytes2Mod,                      // MASKMOVQ\n    /* F8 */ ENTRY_CopyBytes2Mod,                      // PSUBB/r\n    /* F9 */ ENTRY_CopyBytes2Mod,                      // PSUBW/r\n    /* FA */ ENTRY_CopyBytes2Mod,                      // PSUBD/r\n    /* FB */ ENTRY_CopyBytes2Mod,                      // FSUBQ/r\n    /* FC */ ENTRY_CopyBytes2Mod,                      // PADDB/r\n    /* FD */ ENTRY_CopyBytes2Mod,                      // PADDW/r\n    /* FE */ ENTRY_CopyBytes2Mod,                      // PADDD/r\n    /* FF */ ENTRY_Invalid,                            // _FF\n};\n\nBOOL CDetourDis::SanityCheckSystem()\n{\r\n    C_ASSERT(ARRAYSIZE(CDetourDis::s_rceCopyTable) == 256);\r\n    C_ASSERT(ARRAYSIZE(CDetourDis::s_rceCopyTable0F) == 256);\n    return TRUE;\n}\n#endif // defined(DETOURS_X64) || defined(DETOURS_X86)\n\n/////////////////////////////////////////////////////////// IA64 Disassembler.\n//\n#ifdef DETOURS_IA64\n\n#if defined(_IA64_) != defined(DETOURS_IA64_OFFLINE_LIBRARY)\n// Compile DETOUR_IA64_BUNDLE for native IA64 or cross, but not both -- we get duplicates otherwise.\nconst DETOUR_IA64_BUNDLE::DETOUR_IA64_METADATA DETOUR_IA64_BUNDLE::s_rceCopyTable[33] =\n{\n    { 0x00, M_UNIT,      I_UNIT,      I_UNIT,   },\n    { 0x01, M_UNIT,      I_UNIT,      I_UNIT,   },\n    { 0x02, M_UNIT,      I_UNIT,      I_UNIT,   },\n    { 0x03, M_UNIT,      I_UNIT,      I_UNIT,   },\n    { 0x04, M_UNIT,      L_UNIT,      X_UNIT,   },\n    { 0x05, M_UNIT,      L_UNIT,      X_UNIT,   },\n    { 0x06, 0,           0,           0,        },\n    { 0x07, 0,           0,           0,        },\n    { 0x08, M_UNIT,      M_UNIT,      I_UNIT,   },\n    { 0x09, M_UNIT,      M_UNIT,      I_UNIT,   },\n    { 0x0a, M_UNIT,      M_UNIT,      I_UNIT,   },\n    { 0x0b, M_UNIT,      M_UNIT,      I_UNIT,   },\n    { 0x0c, M_UNIT,      F_UNIT,      I_UNIT,   },\n    { 0x0d, M_UNIT,      F_UNIT,      I_UNIT,   },\n    { 0x0e, M_UNIT,      M_UNIT,      F_UNIT,   },\n    { 0x0f, M_UNIT,      M_UNIT,      F_UNIT,   },\n    { 0x10, M_UNIT,      I_UNIT,      B_UNIT,   },\n    { 0x11, M_UNIT,      I_UNIT,      B_UNIT,   },\n    { 0x12, M_UNIT,      B_UNIT,      B_UNIT,   },\n    { 0x13, M_UNIT,      B_UNIT,      B_UNIT,   },\n    { 0x14, 0,           0,           0,        },\n    { 0x15, 0,           0,           0,        },\n    { 0x16, B_UNIT,      B_UNIT,      B_UNIT,   },\n    { 0x17, B_UNIT,      B_UNIT,      B_UNIT,   },\n    { 0x18, M_UNIT,      M_UNIT,      B_UNIT,   },\n    { 0x19, M_UNIT,      M_UNIT,      B_UNIT,   },\n    { 0x1a, 0,           0,           0,        },\n    { 0x1b, 0,           0,           0,        },\n    { 0x1c, M_UNIT,      F_UNIT,      B_UNIT,   },\n    { 0x1d, M_UNIT,      F_UNIT,      B_UNIT,   },\n    { 0x1e, 0,           0,           0,        },\n    { 0x1f, 0,           0,           0,        },\n    { 0x00, 0,           0,           0,        },\n};\n\n// 120 112 104 96 88 80 72 64 56 48 40 32 24 16  8  0\n//  f.  e.  d. c. b. a. 9. 8. 7. 6. 5. 4. 3. 2. 1. 0.\n\n//                                      00\n// f.e. d.c. b.a. 9.8. 7.6. 5.4. 3.2. 1.0.\n// 0000 0000 0000 0000 0000 0000 0000 001f : Template [4..0]\n// 0000 0000 0000 0000 0000 03ff ffff ffe0 : Zero [ 41..  5]\n// 0000 0000 0000 0000 0000 3c00 0000 0000 : Zero [ 45.. 42]\n// 0000 0000 0007 ffff ffff c000 0000 0000 : One  [ 82.. 46]\n// 0000 0000 0078 0000 0000 0000 0000 0000 : One  [ 86.. 83]\n// 0fff ffff ff80 0000 0000 0000 0000 0000 : Two  [123.. 87]\n// f000 0000 0000 0000 0000 0000 0000 0000 : Two  [127..124]\nBYTE DETOUR_IA64_BUNDLE::GetTemplate() const\n{\n    return (data[0] & 0x1f);\n}\n\nBYTE DETOUR_IA64_BUNDLE::GetInst0() const\n{\n    return ((data[5] & 0x3c) >> 2);\n}\n\nBYTE DETOUR_IA64_BUNDLE::GetInst1() const\n{\n    return ((data[10] & 0x78) >> 3);\n}\n\nBYTE DETOUR_IA64_BUNDLE::GetInst2() const\n{\n    return ((data[15] & 0xf0) >> 4);\n}\n\nBYTE DETOUR_IA64_BUNDLE::GetUnit(BYTE slot) const\n{\n    switch (slot) {\n    case 0: return GetUnit0();\n    case 1: return GetUnit1();\n    case 2: return GetUnit2();\n    }\n    __debugbreak();\n    return 0;\n}\n\nBYTE DETOUR_IA64_BUNDLE::GetUnit0() const\n{\n    return s_rceCopyTable[data[0] & 0x1f].nUnit0;\n}\n\nBYTE DETOUR_IA64_BUNDLE::GetUnit1() const\n{\n    return s_rceCopyTable[data[0] & 0x1f].nUnit1;\n}\n\nBYTE DETOUR_IA64_BUNDLE::GetUnit2() const\n{\n    return s_rceCopyTable[data[0] & 0x1f].nUnit2;\n}\n\nUINT64 DETOUR_IA64_BUNDLE::GetData0() const\n{\n    return (((wide[0] & 0x000003ffffffffe0) >> 5));\n}\n\nUINT64 DETOUR_IA64_BUNDLE::GetData1() const\n{\n    return (((wide[0] & 0xffffc00000000000) >> 46) |\n            ((wide[1] & 0x000000000007ffff) << 18));\n}\n\nUINT64 DETOUR_IA64_BUNDLE::GetData2() const\n{\n    return (((wide[1] & 0x0fffffffff800000) >> 23));\n}\n\nVOID DETOUR_IA64_BUNDLE::SetInst(BYTE slot, BYTE nInst)\n{\n    switch (slot)\n    {\n    case 0: SetInst0(nInst); return;\n    case 1: SetInst1(nInst); return;\n    case 2: SetInst2(nInst); return;\n    }\n    __debugbreak();\n}\n\nVOID DETOUR_IA64_BUNDLE::SetInst0(BYTE nInst)\n{\n    data[5] = (data[5] & ~0x3c) | ((nInst << 2) & 0x3c);\n}\n\nVOID DETOUR_IA64_BUNDLE::SetInst1(BYTE nInst)\n{\n    data[10] = (data[10] & ~0x78) | ((nInst << 3) & 0x78);\n}\n\nVOID DETOUR_IA64_BUNDLE::SetInst2(BYTE nInst)\n{\n    data[15] = (data[15] & ~0xf0) | ((nInst << 4) & 0xf0);\n}\n\nVOID DETOUR_IA64_BUNDLE::SetData(BYTE slot, UINT64 nData)\n{\n    switch (slot)\n    {\n    case 0: SetData0(nData); return;\n    case 1: SetData1(nData); return;\n    case 2: SetData2(nData); return;\n    }\n    __debugbreak();\n}\n\nVOID DETOUR_IA64_BUNDLE::SetData0(UINT64 nData)\n{\n    wide[0] = (wide[0] & ~0x000003ffffffffe0) | (( nData << 5)  & 0x000003ffffffffe0);\n}\n\nVOID DETOUR_IA64_BUNDLE::SetData1(UINT64 nData)\n{\n    wide[0] = (wide[0] & ~0xffffc00000000000) | ((nData << 46) & 0xffffc00000000000);\n    wide[1] = (wide[1] & ~0x000000000007ffff) | ((nData >> 18) & 0x000000000007ffff);\n}\n\nVOID DETOUR_IA64_BUNDLE::SetData2(UINT64 nData)\n{\n    wide[1] = (wide[1] & ~0x0fffffffff800000) | ((nData << 23) & 0x0fffffffff800000);\n}\n\nUINT64 DETOUR_IA64_BUNDLE::GetInstruction(BYTE slot) const\n{\n    switch (slot) {\n    case 0: return GetInstruction0();\n    case 1: return GetInstruction1();\n    case 2: return GetInstruction2();\n    }\n    __debugbreak();\n    return 0;\n}\n\nUINT64 DETOUR_IA64_BUNDLE::GetInstruction0() const\n{\n    // 41 bits from wide[0], skipping the 5 bit template.\n    return GetBits(wide[0], DETOUR_IA64_INSTRUCTION0_OFFSET, DETOUR_IA64_INSTRUCTION_SIZE);\n}\n\nUINT64 DETOUR_IA64_BUNDLE::GetInstruction1() const\n{\n    // 64-46 bits from wide[0] and the rest from wide[1].\n    const UINT count0 = 64 - DETOUR_IA64_INSTRUCTION1_OFFSET;\n    const UINT count1 = DETOUR_IA64_INSTRUCTION_SIZE - count0;\n    return GetBits(wide[0], DETOUR_IA64_INSTRUCTION1_OFFSET, count0) | (GetBits(wide[1], 0, count1) << count0);\n}\n\nUINT64 DETOUR_IA64_BUNDLE::GetInstruction2() const\n{\n    // Upper 41 bits of wide[1].\n    return wide[1] >> (64 - DETOUR_IA64_INSTRUCTION_SIZE);\n}\n\nvoid DETOUR_IA64_BUNDLE::SetInstruction(BYTE slot, UINT64 instruction)\n{\n    switch (slot) {\n    case 0: SetInstruction0(instruction); return;\n    case 1: SetInstruction1(instruction); return;\n    case 2: SetInstruction2(instruction); return;\n    }\n    __debugbreak();\n}\n\nvoid DETOUR_IA64_BUNDLE::SetInstruction0(UINT64 instruction)\n{\n    wide[0] = SetBits(wide[0], DETOUR_IA64_INSTRUCTION0_OFFSET, DETOUR_IA64_INSTRUCTION_SIZE, instruction);\n}\n\nvoid DETOUR_IA64_BUNDLE::SetInstruction1(UINT64 instruction)\n{\n    UINT const count0 = 64 - DETOUR_IA64_INSTRUCTION1_OFFSET;\n    UINT const count1 = DETOUR_IA64_INSTRUCTION_SIZE - count0;\n    UINT64 const wide0 = SetBits(wide[0], DETOUR_IA64_INSTRUCTION1_OFFSET, count0, instruction);\n    UINT64 const wide1 = SetBits(wide[1], 0, count1, instruction >> count0);\n    wide[0] = wide0;\n    wide[1] = wide1;\n}\n\nvoid DETOUR_IA64_BUNDLE::SetInstruction2(UINT64 instruction)\n{\n    // Set upper 41 bits of wide[1].\n    wide[1] = SetBits(wide[1], 64 - DETOUR_IA64_INSTRUCTION_SIZE, DETOUR_IA64_INSTRUCTION_SIZE, instruction);\n}\n\nUINT64 DETOUR_IA64_BUNDLE::SignExtend(UINT64 Value, UINT64 Offset)\n// This definition is from the IA64 manual.\n{\n    if ((Value & (((UINT64)1) << (Offset - 1))) == 0)\n        return Value;\n    UINT64 const new_value = Value | ((~(UINT64)0) << Offset);\n    return new_value;\n}\n\nUINT64 DETOUR_IA64_BUNDLE::GetBits(UINT64 Value, UINT64 Offset, UINT64 Count)\n{\n    UINT64 const new_value = (Value >> Offset) & ~(~((UINT64)0) << Count);\n    return new_value;\n}\n\nUINT64 DETOUR_IA64_BUNDLE::SetBits(UINT64 Value, UINT64 Offset, UINT64 Count, UINT64 Field)\n{\n    UINT64 const mask = (~((~(UINT64)0) << Count)) << Offset;\n    UINT64 const new_value = (Value & ~mask) | ((Field << Offset) & mask);\n    return new_value;\n}\n\nUINT64 DETOUR_IA64_BUNDLE::GetOpcode(UINT64 instruction)\n// Get 4bit primary opcode.\n{\n    UINT64 const opcode = GetBits(instruction, DETOUR_IA64_INSTRUCTION_SIZE - 4, 4);\n    return opcode;\n}\n\nUINT64 DETOUR_IA64_BUNDLE::GetX(UINT64 instruction)\n// Get 1bit opcode extension.\n{\n    UINT64 const x = GetBits(instruction, 33, 1);\n    return x;\n}\n\nUINT64 DETOUR_IA64_BUNDLE::GetX3(UINT64 instruction)\n// Get 3bit opcode extension.\n{\n    UINT64 const x3 = GetBits(instruction, 33, 3);\n    return x3;\n}\n\nUINT64 DETOUR_IA64_BUNDLE::GetX6(UINT64 instruction)\n// Get 6bit opcode extension.\n{\n    UINT64 const x6 = GetBits(instruction, 27, 6);\n    return x6;\n}\n\nUINT64 DETOUR_IA64_BUNDLE::GetImm7a(UINT64 instruction)\n{\n    UINT64 const imm7a = GetBits(instruction, 6, 7);\n    return imm7a;\n}\n\nUINT64 DETOUR_IA64_BUNDLE::SetImm7a(UINT64 instruction, UINT64 imm7a)\n{\n    UINT64 const new_instruction = SetBits(instruction, 6, 7, imm7a);\n    return new_instruction;\n}\n\nUINT64 DETOUR_IA64_BUNDLE::GetImm13c(UINT64 instruction)\n{\n    UINT64 const imm13c = GetBits(instruction, 20, 13);\n    return imm13c;\n}\n\nUINT64 DETOUR_IA64_BUNDLE::SetImm13c(UINT64 instruction, UINT64 imm13c)\n{\n    UINT64 const new_instruction = SetBits(instruction, 20, 13, imm13c);\n    return new_instruction;\n}\n\nUINT64 DETOUR_IA64_BUNDLE::GetSignBit(UINT64 instruction)\n{\n    UINT64 const signBit = GetBits(instruction, 36, 1);\n    return signBit;\n}\n\nUINT64 DETOUR_IA64_BUNDLE::SetSignBit(UINT64 instruction, UINT64 signBit)\n{\n    UINT64 const new_instruction = SetBits(instruction, 36, 1, signBit);\n    return new_instruction;\n}\n\nUINT64 DETOUR_IA64_BUNDLE::GetImm20a(UINT64 instruction)\n{\n    UINT64 const imm20a = GetBits(instruction, 6, 20);\n    return imm20a;\n}\n\nUINT64 DETOUR_IA64_BUNDLE::SetImm20a(UINT64 instruction, UINT64 imm20a)\n{\n    UINT64 const new_instruction = SetBits(instruction, 6, 20, imm20a);\n    return new_instruction;\n}\n\nUINT64 DETOUR_IA64_BUNDLE::GetImm20b(UINT64 instruction)\n{\n    UINT64 const imm20b = GetBits(instruction, 13, 20);\n    return imm20b;\n}\n\nUINT64 DETOUR_IA64_BUNDLE::SetImm20b(UINT64 instruction, UINT64 imm20b)\n{\n    UINT64 const new_instruction = SetBits(instruction, 13, 20, imm20b);\n    return new_instruction;\n}\n\nbool DETOUR_IA64_BUNDLE::RelocateInstruction(_Inout_ DETOUR_IA64_BUNDLE* pDst,\n                                             _In_ BYTE slot,\n                                             _Inout_opt_ DETOUR_IA64_BUNDLE* pBundleExtra) const\n/*\n    If pBundleExtra is provided and instruction is IP-relative,\n    this function relocates instruction to target pBundleExtra,\n    pBundleExtra is set to brl the original target, and return true.\n\n    [Not used] If pBundleExtra is not provided and instruction is IP-relative, return true.\n\n    Else return false.\n\n    The following IP-relative forms are recognized:\n        br and br.call\n        chk.s.m integer and float\n        chk.a.nc integer and float\n        chk.a.clr integer and float\n        chk.s.i\n        fchkf\n\n    Brl is handled elsewhere, because the code was previously written.\n\n    Branch prediction hints are not relocated.\n*/\n{\n    UINT64 const instruction = GetInstruction(slot);\n    UINT64 const opcode = GetOpcode(instruction);\n    size_t const dest = (size_t)pDst;\n    size_t const extra = (size_t)pBundleExtra;\n\n    switch (GetUnit(slot)) {\n    case F_UNIT:\n        // F14 fchkf\n        if (opcode == 0 && GetX(instruction) == 0 && GetX6(instruction) == 8) {\n            goto imm20a;\n        }\n        return false;\n\n    case M_UNIT:\n        // M20 x3 == 1 integer chk.s.m\n        // M21 x3 == 3 floating point chk.s\n        if (opcode == 1) {\n            UINT64 const x3 = GetX3(instruction);\n            if (x3 == 1 || x3 == 3) {\n                goto imm13_7;\n            }\n        }\n\n        // M22 x3 == 4 integer chk.a.nc\n        // M22 x3 == 5 integer chk.a.clr\n        // M23 x3 == 6 floating point chk.a.nc\n        // M23 x3 == 7 floating point chk.a.clr\n        if (opcode == 0) {\n            UINT64 const x3 = GetX3(instruction);\n            if (x3 == 4 || x3 == 5 || x3 == 6 || x3 == 7) {\n                goto imm20b;\n            }\n        }\n        return false;\n    case I_UNIT:\n        // I20\n        if (opcode == 0 && GetX3(instruction) == 1) { // chk.s.i\n            goto imm13_7;\n        }\n        return false;\n    case B_UNIT:\n        // B1 B2 B3\n        // 4 br\n        // 5 br.call\n        if (opcode == 4 || opcode == 5) {\n            goto imm20b;\n        }\n        return false;\n    }\n    return false;\n\n    UINT64 imm;\n    UINT64 new_instruction;\n\nimm13_7:\n    imm = SignExtend((GetSignBit(instruction) << 20) | (GetImm13c(instruction) << 7) | GetImm7a(instruction), 21) << 4;\n    new_instruction = SetSignBit(SetImm13c(SetImm7a(instruction, (extra - dest) >> 4), (extra - dest) >> 11), extra < dest);\n    goto set_brl;\n\nimm20a:\n    imm = SignExtend((GetSignBit(instruction) << 20) | GetImm20a(instruction), 21) << 4;\n    new_instruction = SetSignBit(SetImm20a(instruction, (extra - dest) >> 4), extra < dest);\n    goto set_brl;\n\nimm20b:\n    imm = SignExtend((GetSignBit(instruction) << 20) | GetImm20b(instruction), 21) << 4;\n    new_instruction = SetSignBit(SetImm20b(instruction, (extra - dest) >> 4), extra < dest);\n    goto set_brl;\n\nset_brl:\n    if (pBundleExtra != NULL) {\n        pDst->SetInstruction(slot, new_instruction);\n        pBundleExtra->SetBrl((size_t)this + imm);\n    }\n    return true;\n}\n\nUINT DETOUR_IA64_BUNDLE::RelocateBundle(_Inout_ DETOUR_IA64_BUNDLE* pDst,\n                                        _Inout_opt_ DETOUR_IA64_BUNDLE* pBundleExtra) const\n/*\n    Having already copied the bundle unchanged, then relocate its instructions one at a time.\n    Return how many extra bytes are required to relocate the bundle.\n*/\n{\n    UINT nExtraBytes = 0;\n    for (BYTE slot = 0; slot < DETOUR_IA64_INSTRUCTIONS_PER_BUNDLE; ++slot) {\n        if (!RelocateInstruction(pDst, slot, pBundleExtra)) {\n            continue;\n        }\n        pBundleExtra -= !!pBundleExtra;\n        nExtraBytes += sizeof(DETOUR_IA64_BUNDLE);\n    }\n    return nExtraBytes;\n}\n\nBOOL DETOUR_IA64_BUNDLE::IsBrl() const\n{\n    // f.e. d.c. b.a. 9.8. 7.6. 5. 4. 3. 2. 1. 0.\n    // c000 0070 0000 0000 0000 00 01 00 00 00 05 : brl.sptk.few\n    // c8ff fff0 007f fff0 ffff 00 01 00 00 00 05 : brl.sptk.few\n    // c000 0048 0000 0000 0001 00 00 00 00 00 05 : brl.sptk.many\n    return ((wide[0] & 0x000000000000001e) == 0x0000000000000004 && // 4 or 5.\n            (wide[1] & 0xe000000000000000) == 0xc000000000000000);  // c or d.\n}\n\nVOID DETOUR_IA64_BUNDLE::SetBrl()\n{\n    wide[0] = 0x0000000100000005;   // few\n    //wide[0] = 0x0000000180000005; // many\n    wide[1] = 0xc000000800000000;\n}\n\nUINT64 DETOUR_IA64_BUNDLE::GetBrlImm() const\n{\n    return (\n            //          0x0000000000fffff0\n            ((wide[1] & 0x00fffff000000000) >> 32) |    // all 20 bits of imm20b.\n            //          0x000000ffff000000\n            ((wide[0] & 0xffff000000000000) >> 24) |    // bottom 16 bits of imm39.\n            //          0x7fffff0000000000\n            ((wide[1] & 0x00000000007fffff) << 40) |    // top 23 bits of imm39.\n            //          0x8000000000000000\n            ((wide[1] & 0x0800000000000000) <<  4)      // single bit of i.\n           );\n}\n\nVOID DETOUR_IA64_BUNDLE::SetBrlImm(UINT64 imm)\n{\n    wide[0] = ((wide[0] & ~0xffff000000000000) |\n               //      0xffff000000000000\n               ((imm & 0x000000ffff000000) << 24)       // bottom 16 bits of imm39.\n              );\n    wide[1] = ((wide[1] & ~0x08fffff0007fffff) |\n               //      0x00fffff000000000\n               ((imm & 0x0000000000fffff0) << 32) |     // all 20 bits of imm20b.\n               //      0x00000000007fffff\n               ((imm & 0x7fffff0000000000) >> 40) |     // top 23 bits of imm39.\n               //      0x0800000000000000\n               ((imm & 0x8000000000000000) >>  4)       // single bit of i.\n              );\n}\n\nUINT64 DETOUR_IA64_BUNDLE::GetBrlTarget() const\n{\n    return (UINT64)this + GetBrlImm();\n}\n\nVOID DETOUR_IA64_BUNDLE::SetBrl(UINT64 target)\n{\n    UINT64 imm = target - (UINT64)this;\n    SetBrl();\n    SetBrlImm(imm);\n}\n\nVOID DETOUR_IA64_BUNDLE::SetBrlTarget(UINT64 target)\n{\n    UINT64 imm = target - (UINT64)this;\n    SetBrlImm(imm);\n}\n\nBOOL DETOUR_IA64_BUNDLE::IsMovlGp() const\n{\n    // f.e. d.c. b.a. 9.8. 7.6. 5.4. 3.2. 1.0.\n    // 6fff f7f0 207f ffff ffff c001 0000 0004\n    // 6000 0000 2000 0000 0000 0001 0000 0004\n    return ((wide[0] & 0x00003ffffffffffe) == 0x0000000100000004 &&\n            (wide[1] & 0xf000080fff800000) == 0x6000000020000000);\n}\n\nUINT64 DETOUR_IA64_BUNDLE::GetMovlGp() const\n{\n    UINT64 raw = (\n                  //          0x0000000000000070\n                  ((wide[1] & 0x000007f000000000) >> 36) |\n                  //          0x000000000000ff80\n                  ((wide[1] & 0x07fc000000000000) >> 43) |\n                  //          0x00000000001f0000\n                  ((wide[1] & 0x0003e00000000000) >> 29) |\n                  //          0x0000000000200000\n                  ((wide[1] & 0x0000100000000000) >> 23) |\n                  //          0x000000ffffc00000\n                  ((wide[0] & 0xffffc00000000000) >> 24) |\n                  //          0x7fffff0000000000\n                  ((wide[1] & 0x00000000007fffff) << 40) |\n                  //          0x8000000000000000\n                  ((wide[1] & 0x0800000000000000) <<  4)\n                 );\n\n    return (INT64)raw;\n}\n\nVOID DETOUR_IA64_BUNDLE::SetMovlGp(UINT64 gp)\n{\n    UINT64 raw = (UINT64)gp;\n\n    wide[0] = (0x0000000100000005 |\n               //      0xffffc00000000000\n               ((raw & 0x000000ffffc00000) << 24)\n              );\n    wide[1] = (\n               0x6000000020000000 |\n               //      0x0000070000000000\n               ((raw & 0x0000000000000070) << 36) |\n               //      0x07fc000000000000\n               ((raw & 0x000000000000ff80) << 43) |\n               //      0x0003e00000000000\n               ((raw & 0x00000000001f0000) << 29) |\n               //      0x0000100000000000\n               ((raw & 0x0000000000200000) << 23) |\n               //      0x00000000007fffff\n               ((raw & 0x7fffff0000000000) >> 40) |\n               //      0x0800000000000000\n               ((raw & 0x8000000000000000) >>  4)\n              );\n}\n\nUINT DETOUR_IA64_BUNDLE::Copy(_Out_ DETOUR_IA64_BUNDLE *pDst,\n                              _Inout_opt_ DETOUR_IA64_BUNDLE* pBundleExtra) const\n{\n    // Copy the bytes unchanged.\n\n#pragma warning(suppress:6001) // using uninitialized *pDst\n    pDst->wide[0] = wide[0];\n    pDst->wide[1] = wide[1];\n\n    // Relocate if necessary.\n\n    UINT nExtraBytes = RelocateBundle(pDst, pBundleExtra);\n\n    if (GetUnit1() == L_UNIT && IsBrl()) {\n        pDst->SetBrlTarget(GetBrlTarget());\n    }\n\n    return nExtraBytes;\n}\n\nBOOL DETOUR_IA64_BUNDLE::SetNop(BYTE slot)\n{\n    switch (GetUnit(slot)) {\n      case I_UNIT:\n      case M_UNIT:\n      case F_UNIT:\n        SetInst(slot, 0);\n        SetData(slot, 0x8000000);\n        return true;\n      case B_UNIT:\n        SetInst(slot, 2);\n        SetData(slot, 0);\n        return true;\n    }\n    DebugBreak();\n    return false;\n}\n\nBOOL DETOUR_IA64_BUNDLE::SetNop0()\n{\n    return SetNop(0);\n}\n\nBOOL DETOUR_IA64_BUNDLE::SetNop1()\n{\n    return SetNop(1);\n}\n\nBOOL DETOUR_IA64_BUNDLE::SetNop2()\n{\n    return SetNop(2);\n}\n\nVOID DETOUR_IA64_BUNDLE::SetStop()\n{\n    data[0] |= 0x01;\n}\n\n#endif // DETOURS_IA64\n\nPVOID WINAPI DetourCopyInstruction(_In_opt_ PVOID pDst,\n                                   _Inout_opt_ PVOID *ppDstPool,\n                                   _In_ PVOID pSrc,\n                                   _Out_opt_ PVOID *ppTarget,\n                                   _Out_opt_ LONG *plExtra)\n{\n    LONG nExtra;\n    DETOUR_IA64_BUNDLE bExtra;\n    DETOUR_IA64_BUNDLE *pbSrc = (DETOUR_IA64_BUNDLE *)pSrc;\n    DETOUR_IA64_BUNDLE *pbDst = pDst ? (DETOUR_IA64_BUNDLE *)pDst : &bExtra;\n\n    plExtra = plExtra ? plExtra : &nExtra;\n    *plExtra = 0;\n\n    if (ppTarget != NULL) {\n        if (pbSrc->IsBrl()) {\n            *ppTarget = (PVOID)pbSrc->GetBrlTarget();\n        }\n        else {\n            *ppTarget = DETOUR_INSTRUCTION_TARGET_NONE;\n        }\n    }\n    *plExtra = (LONG)pbSrc->Copy(pbDst, ppDstPool ? ((DETOUR_IA64_BUNDLE*)*ppDstPool) - 1 : (DETOUR_IA64_BUNDLE*)NULL);\n    return pbSrc + 1;\n}\n\n#endif // DETOURS_IA64\n\n#ifdef DETOURS_ARM\n\n#define DETOURS_PFUNC_TO_PBYTE(p)  ((PBYTE)(((ULONG_PTR)(p)) & ~(ULONG_PTR)1))\n#define DETOURS_PBYTE_TO_PFUNC(p)  ((PBYTE)(((ULONG_PTR)(p)) | (ULONG_PTR)1))\n\n#define c_PCAdjust  4       // The PC value of an instruction is the PC address plus 4.\n#define c_PC        15      // The register number for the Program Counter\n#define c_LR        14      // The register number for the Link Register\n#define c_SP        13      // The register number for the Stack Pointer\n#define c_NOP       0xbf00  // A nop instruction\n#define c_BREAK     0xdefe  // A nop instruction\n\nclass CDetourDis\n{\n  public:\n    CDetourDis();\n\n    PBYTE   CopyInstruction(PBYTE pDst,\n                            PBYTE *ppDstPool,\n                            PBYTE pSrc,\n                            PBYTE *ppTarget,\n                            LONG *plExtra);\n\n  public:\n    typedef BYTE (CDetourDis::* COPYFUNC)(PBYTE pbDst, PBYTE pbSrc);\n\n    struct COPYENTRY {\n        USHORT      nOpcode;\n        COPYFUNC    pfCopy;\n    };\n\n    typedef const COPYENTRY * REFCOPYENTRY;\n\n    struct Branch5\n    {\n        DWORD Register : 3;\n        DWORD Imm5 : 5;\n        DWORD Padding : 1;\n        DWORD I : 1;\n        DWORD OpCode : 6;\n    };\n\n    struct Branch5Target\n    {\n        DWORD Padding : 1;\n        DWORD Imm5 : 5;\n        DWORD I : 1;\n        DWORD Padding2 : 25;\n    };\n\n    struct Branch8\n    {\n        DWORD Imm8 : 8;\n        DWORD Condition : 4;\n        DWORD OpCode : 4;\n    };\n\n    struct Branch8Target\n    {\n        DWORD Padding : 1;\n        DWORD Imm8 : 8;\n        DWORD Padding2 : 23;\n    };\n\n    struct Branch11\n    {\n        DWORD Imm11 : 11;\n        DWORD OpCode : 5;\n    };\n\n    struct Branch11Target\n    {\n        DWORD Padding : 1;\n        DWORD Imm11 : 11;\n        DWORD Padding2 : 20;\n    };\n\n    struct Branch20\n    {\n        DWORD Imm11 : 11;\n        DWORD J2 : 1;\n        DWORD IT : 1;\n        DWORD J1 : 1;\n        DWORD Other : 2;\n        DWORD Imm6 : 6;\n        DWORD Condition : 4;\n        DWORD Sign : 1;\n        DWORD OpCode : 5;\n    };\n\n    struct Branch20Target\n    {\n        DWORD Padding : 1;\n        DWORD Imm11 : 11;\n        DWORD Imm6 : 6;\n        DWORD J1 : 1;\n        DWORD J2 : 1;\n        DWORD Sign : 1;\n        INT32 Padding2 : 11;\n    };\n\n    struct Branch24\n    {\n        DWORD Imm11             : 11;\n        DWORD J2                : 1;\n        DWORD InstructionSet    : 1;\n        DWORD J1                : 1;\n        DWORD Link              : 1;\n        DWORD Branch            : 1;\n        DWORD Imm10             : 10;\n        DWORD Sign              : 1;\n        DWORD OpCode            : 5;\n    };\n\n    struct Branch24Target\n    {\n        DWORD Padding : 1;\n        DWORD Imm11 : 11;\n        DWORD Imm10 : 10;\n        DWORD I2 : 1;\n        DWORD I1 : 1;\n        DWORD Sign : 1;\n        INT32 Padding2 : 7;\n    };\n\n    struct LiteralLoad8\n    {\n        DWORD Imm8 : 8;\n        DWORD Register : 3;\n        DWORD OpCode : 5;\n    };\n\n    struct LiteralLoad8Target\n    {\n        DWORD Padding : 2;\n        DWORD Imm8 : 8;\n        DWORD Padding2 : 22;\n    };\n\n    struct LiteralLoad12\n    {\n        DWORD Imm12 : 12;\n        DWORD Register : 4;\n        DWORD OpCodeSuffix : 7;\n        DWORD Add : 1;\n        DWORD OpCodePrefix : 8;\n    };\n\n    struct LiteralLoad12Target\n    {\n        DWORD Imm12 : 12;\n        DWORD Padding : 20;\n    };\n\n    struct ImmediateRegisterLoad32\n    {\n        DWORD Imm12 : 12;\n        DWORD DestinationRegister : 4;\n        DWORD SourceRegister: 4;\n        DWORD OpCode : 12;\n    };\n\n    struct ImmediateRegisterLoad16\n    {\n        DWORD DestinationRegister : 3;\n        DWORD SourceRegister: 3;\n        DWORD OpCode : 10;\n    };\n\n    struct TableBranch\n    {\n        DWORD IndexRegister : 4;\n        DWORD HalfWord : 1;\n        DWORD OpCodeSuffix : 11;\n        DWORD BaseRegister : 4;\n        DWORD OpCodePrefix : 12;\n    };\n\n    struct Shift\n    {\n        DWORD Imm2 : 2;\n        DWORD Imm3 : 3;\n    };\n\n    struct Add32\n    {\n        DWORD SecondOperandRegister : 4;\n        DWORD Type : 2;\n        DWORD Imm2 : 2;\n        DWORD DestinationRegister : 4;\n        DWORD Imm3 : 3;\n        DWORD Padding : 1;\n        DWORD FirstOperandRegister : 4;\n        DWORD SetFlags : 1;\n        DWORD OpCode : 11;\n    };\n\n    struct LogicalShiftLeft32\n    {\n        DWORD SourceRegister : 4;\n        DWORD Padding : 2;\n        DWORD Imm2 : 2;\n        DWORD DestinationRegister : 4;\n        DWORD Imm3 : 3;\n        DWORD Padding2 : 5;\n        DWORD SetFlags : 1;\n        DWORD OpCode : 11;\n    };\n\n    struct StoreImmediate12\n    {\n        DWORD Imm12 : 12;\n        DWORD SourceRegister : 4;\n        DWORD BaseRegister : 4;\n        DWORD OpCode : 12;\n    };\n\n  protected:\n    BYTE    PureCopy16(BYTE* pSource, BYTE* pDest);\n    BYTE    PureCopy32(BYTE* pSource, BYTE* pDest);\n    BYTE    CopyMiscellaneous16(BYTE* pSource, BYTE* pDest);\n    BYTE    CopyConditionalBranchOrOther16(BYTE* pSource, BYTE* pDest);\n    BYTE    CopyUnConditionalBranch16(BYTE* pSource, BYTE* pDest);\n    BYTE    CopyLiteralLoad16(BYTE* pSource, BYTE* pDest);\n    BYTE    CopyBranchExchangeOrDataProcessing16(BYTE* pSource, BYTE* pDest);\n    BYTE    CopyBranch24(BYTE* pSource, BYTE* pDest);\n    BYTE    CopyBranchOrMiscellaneous32(BYTE* pSource, BYTE* pDest);\n    BYTE    CopyLiteralLoad32(BYTE* pSource, BYTE* pDest);\n    BYTE    CopyLoadAndStoreSingle(BYTE* pSource, BYTE* pDest);\n    BYTE    CopyLoadAndStoreMultipleAndSRS(BYTE* pSource, BYTE* pDest);\n    BYTE    CopyTableBranch(BYTE* pSource, BYTE* pDest);\n    BYTE    BeginCopy32(BYTE* pSource, BYTE* pDest);\n\n    LONG    DecodeBranch5(ULONG opcode);\n    USHORT  EncodeBranch5(ULONG originalOpCode, LONG delta);\n    LONG    DecodeBranch8(ULONG opcode);\n    USHORT  EncodeBranch8(ULONG originalOpCode, LONG delta);\n    LONG    DecodeBranch11(ULONG opcode);\n    USHORT  EncodeBranch11(ULONG originalOpCode, LONG delta);\n    BYTE    EmitBranch11(PUSHORT& pDest, LONG relativeAddress);\n    LONG    DecodeBranch20(ULONG opcode);\n    ULONG   EncodeBranch20(ULONG originalOpCode, LONG delta);\n    LONG    DecodeBranch24(ULONG opcode, BOOL& fLink);\n    ULONG   EncodeBranch24(ULONG originalOpCode, LONG delta, BOOL fLink);\n    LONG    DecodeLiteralLoad8(ULONG instruction);\n    LONG    DecodeLiteralLoad12(ULONG instruction);\n    BYTE    EmitLiteralLoad8(PUSHORT& pDest, BYTE targetRegister, PBYTE pLiteral);\n    BYTE    EmitLiteralLoad12(PUSHORT& pDest, BYTE targetRegister, PBYTE pLiteral);\n    BYTE    EmitImmediateRegisterLoad32(PUSHORT& pDest, BYTE reg);\n    BYTE    EmitImmediateRegisterLoad16(PUSHORT& pDest, BYTE reg);\n    BYTE    EmitLongLiteralLoad(PUSHORT& pDest, BYTE reg, PVOID pTarget);\n    BYTE    EmitLongBranch(PUSHORT& pDest, PVOID pTarget);\n    USHORT  CalculateExtra(BYTE sourceLength, BYTE* pDestStart, BYTE* pDestEnd);\n\n  protected:\n    ULONG GetLongInstruction(BYTE* pSource)\n    {\n        return (((PUSHORT)pSource)[0] << 16) | (((PUSHORT)pSource)[1]);\n    }\n\n    BYTE EmitLongInstruction(PUSHORT& pDstInst, ULONG instruction)\n    {\n        *pDstInst++ = (USHORT)(instruction >> 16);\n        *pDstInst++ = (USHORT)instruction;\n        return sizeof(ULONG);\n    }\n\n    BYTE EmitShortInstruction(PUSHORT& pDstInst, USHORT instruction)\n    {\n        *pDstInst++ = instruction;\n        return sizeof(USHORT);\n    }\n\n    PBYTE Align4(PBYTE pValue)\n    {\n        return (PBYTE)(((size_t)pValue) & ~(ULONG)3u);\n    }\n\n    PBYTE CalculateTarget(PBYTE pSource, LONG delta)\n    {\n        return (pSource + delta + c_PCAdjust);\n    }\n\n    LONG CalculateNewDelta(PBYTE pTarget, BYTE* pDest)\n    {\n        return (LONG)(pTarget - (pDest + c_PCAdjust));\n    }\n\n    BYTE    EmitAdd32(PUSHORT& pDstInst, BYTE op1Reg, BYTE op2Reg, BYTE dstReg, BYTE shiftAmount)\n    {\n        Shift& shift = (Shift&)(shiftAmount);\n        const BYTE shiftType = 0x00; // LSL\n        Add32 add = { op2Reg, shiftType, shift.Imm2, dstReg, shift.Imm3,\n                      0x0, op1Reg, 0x0, 0x758 };\n        return EmitLongInstruction(pDstInst, (ULONG&)add);\n    }\n\n    BYTE    EmitLogicalShiftLeft32(PUSHORT& pDstInst, BYTE srcReg, BYTE dstReg, BYTE shiftAmount)\n    {\n        Shift& shift = (Shift&)(shiftAmount);\n        LogicalShiftLeft32 shiftLeft = { srcReg, 0x00, shift.Imm2, dstReg, shift.Imm3, 0x1E,\n                                         0x00, 0x752 };\n        return EmitLongInstruction(pDstInst, (ULONG&)shiftLeft);\n    }\n\n    BYTE    EmitStoreImmediate12(PUSHORT& pDstInst, BYTE srcReg, BYTE baseReg, USHORT offset)\n    {\n        StoreImmediate12 store = { offset, srcReg, baseReg, 0xF8C };\n        return EmitLongInstruction(pDstInst, (ULONG&)store);\n    }\n\n  protected:\n    PBYTE   m_pbTarget;\n    PBYTE   m_pbPool;\n    LONG    m_lExtra;\n\n    BYTE    m_rbScratchDst[64]; // matches or exceeds rbCode\n\n    static const COPYENTRY s_rceCopyTable[33];\n};\n\nLONG CDetourDis::DecodeBranch5(ULONG opcode)\n{\n    Branch5& branch = (Branch5&)(opcode);\n\n    Branch5Target target;\n    ZeroMemory(&target, sizeof(target));\n    target.Imm5 = branch.Imm5;\n    target.I = branch.I;\n\n    // Return zero-extended value\n    return (LONG&)target;\n}\n\nUSHORT CDetourDis::EncodeBranch5(ULONG originalOpCode, LONG delta)\n{\n    // Too large for a 5 bit branch (5 bit branches can be up to 7 bits due to I and the trailing 0)\n    if (delta < 0 || delta > 0x7F) {\n        return 0;\n    }\n\n    Branch5& branch = (Branch5&)(originalOpCode);\n    Branch5Target& target = (Branch5Target&)(delta);\n\n    branch.Imm5 = target.Imm5;\n    branch.I = target.I;\n\n    return (USHORT&)branch;\n}\n\nLONG CDetourDis::DecodeBranch8(ULONG opcode)\n{\n    Branch8& branch = (Branch8&)(opcode);\n\n    Branch8Target target;\n    ZeroMemory(&target, sizeof(target));\n    target.Imm8 = branch.Imm8;\n\n    // Return sign extended value\n    return (((LONG&)target) << 23) >> 23;\n}\n\nUSHORT CDetourDis::EncodeBranch8(ULONG originalOpCode, LONG delta)\n{\n    // Too large for 8 bit branch (8 bit branches can be up to 9 bits due to the trailing 0)\n    if (delta < (-(int)0x100) || delta > 0xFF) {\n        return 0;\n    }\n\n    Branch8& branch = (Branch8&)(originalOpCode);\n    Branch8Target& target = (Branch8Target&)(delta);\n\n    branch.Imm8 = target.Imm8;\n\n    return (USHORT&)branch;\n}\n\nLONG CDetourDis::DecodeBranch11(ULONG opcode)\n{\n    Branch11& branch = (Branch11&)(opcode);\n\n    Branch11Target target;\n    ZeroMemory(&target, sizeof(target));\n    target.Imm11 = branch.Imm11;\n\n    // Return sign extended value\n    return (((LONG&)target) << 20) >> 20;\n}\n\nUSHORT CDetourDis::EncodeBranch11(ULONG originalOpCode, LONG delta)\n{\n    // Too large for an 11 bit branch (11 bit branches can be up to 12 bits due to the trailing 0)\n    if (delta < (-(int)0x800) || delta > 0x7FF) {\n        return 0;\n    }\n\n    Branch11& branch = (Branch11&)(originalOpCode);\n    Branch11Target& target = (Branch11Target&)(delta);\n\n    branch.Imm11 = target.Imm11;\n\n    return (USHORT&)branch;\n}\n\nBYTE CDetourDis::EmitBranch11(PUSHORT& pDest, LONG relativeAddress)\n{\n    Branch11Target& target = (Branch11Target&)(relativeAddress);\n    Branch11 branch11 = { target.Imm11, 0x1C };\n\n    *pDest++ = (USHORT&)branch11;\n    return sizeof(USHORT);\n}\n\nLONG CDetourDis::DecodeBranch20(ULONG opcode)\n{\n    Branch20& branch = (Branch20&)(opcode);\n\n    Branch20Target target;\n    ZeroMemory(&target, sizeof(target));\n    target.Imm11 = branch.Imm11;\n    target.Imm6 = branch.Imm6;\n    target.Sign = branch.Sign;\n    target.J1 = branch.J1;\n    target.J2 = branch.J2;\n\n    // Sign extend\n    if (target.Sign) {\n        target.Padding2 = -1;\n    }\n\n    return (LONG&)target;\n}\n\nULONG CDetourDis::EncodeBranch20(ULONG originalOpCode, LONG delta)\n{\n    // Too large for 20 bit branch (20 bit branches can be up to 21 bits due to the trailing 0)\n    if (delta < (-(int)0x100000) || delta > 0xFFFFF) {\n        return 0;\n    }\n\n    Branch20& branch = (Branch20&)(originalOpCode);\n    Branch20Target& target = (Branch20Target&)(delta);\n\n    branch.Imm11 = target.Imm11;\n    branch.Imm6 = target.Imm6;\n    branch.Sign = target.Sign;\n    branch.J1 = target.J1;\n    branch.J2 = target.J2;\n\n    return (ULONG&)branch;\n}\n\nLONG CDetourDis::DecodeBranch24(ULONG opcode, BOOL& fLink)\n{\n    Branch24& branch = (Branch24&)(opcode);\n\n    Branch24Target target;\n    ZeroMemory(&target, sizeof(target));\n    target.Imm11 = branch.Imm11;\n    target.Imm10 = branch.Imm10;\n    target.Sign = branch.Sign;\n    target.I1 = ~(branch.J1 ^ target.Sign);\n    target.I2 = ~(branch.J2 ^ target.Sign);\n    fLink = branch.Link;\n\n    // Sign extend\n    if (target.Sign) {\n        target.Padding2 = -1;\n    }\n\n    return (LONG&)target;\n}\n\nULONG CDetourDis::EncodeBranch24(ULONG originalOpCode, LONG delta, BOOL fLink)\n{\n    // Too large for 24 bit branch (24 bit branches can be up to 25 bits due to the trailing 0)\n    if (delta < static_cast<int>(0xFF000000) || delta > static_cast<int>(0xFFFFFF)) {\n        return 0;\n    }\n\n    Branch24& branch = (Branch24&)(originalOpCode);\n    Branch24Target& target = (Branch24Target&)(delta);\n\n    branch.Imm11 = target.Imm11;\n    branch.Imm10 = target.Imm10;\n    branch.Link = fLink;\n    branch.Sign = target.Sign;\n    branch.J1 = ~(target.I1 ^ branch.Sign);\n    branch.J2 = ~(target.I2 ^ branch.Sign);\n\n    return (ULONG&)branch;\n}\n\nLONG CDetourDis::DecodeLiteralLoad8(ULONG instruction)\n{\n    LiteralLoad8& load = (LiteralLoad8&)(instruction);\n\n    LiteralLoad8Target target;\n    ZeroMemory(&target, sizeof(target));\n    target.Imm8 = load.Imm8;\n\n    return (LONG&)target;\n}\n\nBYTE CDetourDis::EmitLiteralLoad8(PUSHORT& pDest, BYTE targetRegister, PBYTE pLiteral)\n{\n    // Note: We add 2 (which gets rounded down) because literals must be 32-bit\n    //       aligned, but the ldr can be 16-bit aligned.\n    LONG newDelta = CalculateNewDelta((PBYTE)pLiteral + 2, (PBYTE)pDest);\n    LONG relative = ((newDelta > 0 ? newDelta : -newDelta) & 0x3FF);\n\n    LiteralLoad8Target& target = (LiteralLoad8Target&)(relative);\n    LiteralLoad8 load = { target.Imm8, targetRegister, 0x9 };\n\n    return EmitShortInstruction(pDest, (USHORT&)load);\n}\n\nLONG CDetourDis::DecodeLiteralLoad12(ULONG instruction)\n{\n    LiteralLoad12& load = (LiteralLoad12&)(instruction);\n\n    LiteralLoad12Target target;\n    ZeroMemory(&target, sizeof(target));\n    target.Imm12 = load.Imm12;\n\n    return (LONG&)target;\n}\n\nBYTE CDetourDis::EmitLiteralLoad12(PUSHORT& pDest, BYTE targetRegister, PBYTE pLiteral)\n{\n    // Note: We add 2 (which gets rounded down) because literals must be 32-bit\n    //       aligned, but the ldr can be 16-bit aligned.\n    LONG newDelta = CalculateNewDelta((PBYTE)pLiteral + 2, (PBYTE)pDest);\n    LONG relative = ((newDelta > 0 ? newDelta : -newDelta) & 0xFFF);\n\n    LiteralLoad12Target& target = (LiteralLoad12Target&)(relative);\n    target.Imm12 -= target.Imm12 & 3;\n    LiteralLoad12 load = { target.Imm12, targetRegister, 0x5F, (DWORD)(newDelta > 0),  0xF8 };\n\n    return EmitLongInstruction(pDest, (ULONG&)load);\n}\n\nBYTE CDetourDis::EmitImmediateRegisterLoad32(PUSHORT& pDest, BYTE reg)\n{\n    ImmediateRegisterLoad32 load = { 0, reg, reg, 0xF8D };\n    return EmitLongInstruction(pDest, (ULONG&)load);\n}\n\nBYTE CDetourDis::EmitImmediateRegisterLoad16(PUSHORT& pDest, BYTE reg)\n{\n    ImmediateRegisterLoad16 load = { reg, reg, 0x680 >> 2 };\n    return EmitShortInstruction(pDest, (USHORT&)load);\n}\n\nBYTE CDetourDis::EmitLongLiteralLoad(PUSHORT& pDest, BYTE targetRegister, PVOID pTarget)\n{\n    *--((PULONG&)m_pbPool) = (ULONG)(size_t)pTarget;\n\n    // ldr rn, target.\n    BYTE size = EmitLiteralLoad12(pDest, targetRegister, m_pbPool);\n\n    // This only makes sense if targetRegister != PC;\n    // otherwise, we would have branched with the previous instruction anyway\n    if (targetRegister != c_PC) {\n        // ldr rn, [rn]\n        if (targetRegister <= 7) {\n            size = (BYTE)(size + EmitImmediateRegisterLoad16(pDest, targetRegister));\n        }\n        else {\n            size = (BYTE)(size + EmitImmediateRegisterLoad32(pDest, targetRegister));\n        }\n    }\n\n    return size;\n}\n\nBYTE CDetourDis::EmitLongBranch(PUSHORT& pDest, PVOID pTarget)\n{\n    // Emit a long literal load into PC\n    BYTE size = EmitLongLiteralLoad(pDest, c_PC, DETOURS_PBYTE_TO_PFUNC(pTarget));\n    return size;\n}\n\nBYTE CDetourDis::PureCopy16(BYTE* pSource, BYTE* pDest)\n{\n    *(USHORT *)pDest = *(USHORT *)pSource;\n    return sizeof(USHORT);\n}\n\nBYTE CDetourDis::PureCopy32(BYTE* pSource, BYTE* pDest)\n{\n    *(UNALIGNED ULONG *)pDest = *(UNALIGNED ULONG*)pSource;\n    return sizeof(DWORD);\n}\n\nUSHORT CDetourDis::CalculateExtra(BYTE sourceLength, BYTE* pDestStart, BYTE* pDestEnd)\n{\n    ULONG destinationLength = (ULONG)(pDestEnd - pDestStart);\n    return static_cast<USHORT>((destinationLength > sourceLength) ? (destinationLength - sourceLength) : 0);\n}\n\nBYTE CDetourDis::CopyMiscellaneous16(BYTE* pSource, BYTE* pDest)\n{\n    USHORT instruction = *(PUSHORT)(pSource);\n\n    // Compare and branch imm5 (CBZ, CBNZ)\n    if ((instruction & 0x100) && !(instruction & 0x400)) { // (1011x0x1xxxxxxxx)\n        LONG oldDelta = DecodeBranch5(instruction);\n        PBYTE pTarget = CalculateTarget(pSource, oldDelta);\n        m_pbTarget = pTarget;\n\n        LONG newDelta = CalculateNewDelta(pTarget, pDest);\n        instruction = EncodeBranch5(instruction, newDelta);\n\n        if (instruction) {\n            // Copy the 16 bit instruction over\n            *(PUSHORT)(pDest) = instruction;\n            return sizeof(USHORT); // The source instruction was 16 bits\n        }\n\n        // If that fails, re-encode with 'conditional branch' logic, without using the condition flags\n        // For example, cbz r2,+0x56 (0x90432) becomes:\n        //\n        //  001df73a b92a     cbnz        r2,001df748\n        //  001df73c e002     b           001df744\n        //  001df73e bf00     nop\n        //  001df740 0432     dc.h        0432\n        //  001df742 0009     dc.h        0009\n        //  001df744 f85ff008 ldr         pc,=0x90432\n        //\n\n        // Store where we will be writing our conditional branch, and move past it so we can emit a long branch\n        PUSHORT pDstInst = (PUSHORT)(pDest);\n        PUSHORT pConditionalBranchInstruction = pDstInst++;\n\n        // Emit the long branch instruction\n        BYTE longBranchSize = EmitLongBranch(pDstInst, pTarget);\n\n        // Invert the CBZ/CBNZ instruction to move past our 'long branch' if the inverse comparison succeeds\n        // Write the CBZ/CBNZ instruction *before* the long branch we emitted above\n        // This had to be done out of order, since the size of a long branch can vary due to alignment restrictions\n        instruction = EncodeBranch5(*(PUSHORT)(pSource), longBranchSize - c_PCAdjust + sizeof(USHORT));\n        Branch5& branch = (Branch5&)(instruction);\n        branch.OpCode = (branch.OpCode & 0x02) ? 0x2C : 0x2E; // Invert the CBZ/CBNZ comparison\n        *pConditionalBranchInstruction = instruction;\n\n        // Compute the extra space needed for the branch sequence\n        m_lExtra = CalculateExtra(sizeof(USHORT), pDest, (BYTE*)(pDstInst));\n        return sizeof(USHORT); // The source instruction was 16 bits\n    }\n\n    // If-Then Instruction (IT)\n    if ((instruction >> 8 == 0xBF) && (instruction & 0xF)) { //(10111111xxxx(mask != 0b0000))\n        // ToDo: Implement IT handler\n        ASSERT(false);\n        return sizeof(USHORT);\n    }\n\n    // ADD/SUB, SXTH, SXTB, UXTH, UXTB, CBZ, CBNZ, PUSH, POP, REV, REV15, REVSH, NOP, YIELD, WFE, WFI, SEV, etc.\n    return PureCopy16(pSource, pDest);\n}\n\nBYTE CDetourDis::CopyConditionalBranchOrOther16(BYTE* pSource, BYTE* pDest)\n{\n    USHORT instruction = *(PUSHORT)(pSource);\n\n    // Could be a conditional branch, an Undefined instruction or a Service System Call\n    // Only the former needs special logic\n    if ((instruction & 0xE00) != 0xE00) { // 1101(!=111x)xxxxxxxx\n        LONG oldDelta = DecodeBranch8(instruction);\n        PBYTE pTarget = CalculateTarget(pSource, oldDelta);\n        m_pbTarget = pTarget;\n\n        LONG newDelta = CalculateNewDelta(pTarget, pDest);\n        instruction = EncodeBranch8(instruction, newDelta);\n        if (instruction) {\n            // Copy the 16 bit instruction over\n            *(PUSHORT)(pDest) = instruction;\n            return sizeof(USHORT); // The source instruction was 16 bits\n        }\n\n        // If that fails, re-encode as a sequence of branches\n        // For example, bne +0x6E (0x90452) becomes:\n        //\n        // 001df758 d100     bne         001df75c\n        // 001df75a e005     b           001df768\n        // 001df75c e002     b           001df764\n        // 001df75e bf00     nop\n        // 001df760 0452     dc.h        0452\n        // 001df762 0009     dc.h        0009\n        // 001df764 f85ff008 ldr         pc,=0x90452\n        //\n\n        // First, reuse the existing conditional branch to, if successful, branch down to a 'long branch' that we will emit below\n        USHORT newInstruction = EncodeBranch8(*(PUSHORT)(pSource), 0); // Due to the size of c_PCAdjust a zero-length branch moves 4 bytes forward, past the following unconditional branch\n        ASSERT(newInstruction);\n        PUSHORT pDstInst = (PUSHORT)(pDest);\n        *pDstInst++ = newInstruction;\n\n        // Next, prepare to insert an unconditional branch that will be hit if the condition above is not met.  This branch will branch over the following 'long branch'\n        // We can't actually encode this branch yet though, because 'long branches' can vary in size\n        PUSHORT pUnconditionalBranchInstruction = pDstInst++;\n\n        // Then, emit a 'long branch' that will be hit if the original condition is met\n        BYTE longBranchSize = EmitLongBranch(pDstInst, pTarget);\n\n        // Finally, encode and emit the unconditional branch that will be used to branch past the 'long branch' if the initial condition was not met\n        Branch11 branch11 = { 0x00, 0x1C };\n        newInstruction = EncodeBranch11(*(DWORD*)(&branch11), longBranchSize - c_PCAdjust + sizeof(USHORT));\n        ASSERT(newInstruction);\n        *pUnconditionalBranchInstruction = newInstruction;\n\n        // Compute the extra space needed for the branch sequence\n        m_lExtra = CalculateExtra(sizeof(USHORT), pDest, (BYTE*)(pDstInst));\n        return sizeof(USHORT); // The source instruction was 16 bits\n    }\n\n    return PureCopy16(pSource, pDest);\n}\n\nBYTE CDetourDis::CopyUnConditionalBranch16(BYTE* pSource, BYTE* pDest)\n{\n    ULONG instruction = *(PUSHORT)(pSource);\n\n    LONG oldDelta = DecodeBranch11(instruction);\n    PBYTE pTarget = CalculateTarget(pSource, oldDelta);\n    m_pbTarget = pTarget;\n\n    LONG newDelta = CalculateNewDelta(pTarget, pDest);\n    instruction = EncodeBranch11(instruction, newDelta);\n    if (instruction) {\n        // Copy the 16 bit instruction over\n        *(PUSHORT)(pDest) = (USHORT)instruction;\n        return sizeof(USHORT); // The source instruction was 16 bits\n    }\n\n    // If that fails, re-encode as 32-bit\n    PUSHORT pDstInst = (PUSHORT)(pDest);\n    instruction = EncodeBranch24(0xf0009000, newDelta, FALSE);\n    if (instruction) {\n        // Copy both bytes of the instruction\n        EmitLongInstruction(pDstInst, instruction);\n\n        m_lExtra = sizeof(DWORD) - sizeof(USHORT); // The destination instruction was 32 bits\n        return sizeof(USHORT); // The source instruction was 16 bits\n    }\n\n    // If that fails, emit as a 'long branch'\n    if (!instruction) {\n        // For example, b +0x7FE (00090be6) becomes:\n        // 003f6d02 e001     b           003f6d08\n        // 003f6d04 0be6     dc.h        0be6\n        // 003f6d06 0009     dc.h        0009\n        // 003f6d08 f85ff008 ldr         pc,=0x90BE6\n        EmitLongBranch(pDstInst, pTarget);\n\n        // Compute the extra space needed for the branch sequence\n        m_lExtra = CalculateExtra(sizeof(USHORT), pDest, (BYTE*)(pDstInst));\n        return sizeof(USHORT); // The source instruction was 16 bits\n    }\n\n    return sizeof(USHORT); // The source instruction was 16 bits\n}\n\nBYTE CDetourDis::CopyLiteralLoad16(BYTE* pSource, BYTE* pDest)\n{\n    PBYTE pStart = pDest;\n    USHORT instruction = *(PUSHORT)(pSource);\n\n    LONG oldDelta = DecodeLiteralLoad8(instruction);\n    PBYTE pTarget = CalculateTarget(Align4(pSource), oldDelta);\n\n    // Re-encode as a 'long literal load'\n    // For example, ldr r0, [PC + 1E0] (0x905B4) becomes:\n    //\n    // 001df72c f85f0008 ldr         r0,=0x905B4\n    // 001df730 f8d00000 ldr.w       r0,[r0]\n    LiteralLoad8& load8 = (LiteralLoad8&)(instruction);\n    EmitLongLiteralLoad((PUSHORT&)pDest, load8.Register, pTarget);\n\n    m_lExtra = (LONG)(pDest - pStart - sizeof(USHORT));\n    return sizeof(USHORT); // The source instruction was 16 bits\n}\n\nBYTE CDetourDis::CopyBranchExchangeOrDataProcessing16(BYTE* pSource, BYTE* pDest)\n{\n    ULONG instruction = *(PUSHORT)(pSource);\n\n    // BX\n    if ((instruction & 0xff80) == 0x4700) {\n        // The target is stored in a register\n        m_pbTarget = (PBYTE)DETOUR_INSTRUCTION_TARGET_DYNAMIC;\n    }\n\n    // AND, LSR, TST, ADD, CMP, MOV\n    return PureCopy16(pSource, pDest);\n}\n\nconst CDetourDis::COPYENTRY CDetourDis::s_rceCopyTable[33] =\n{\n    // Shift by immediate, move register\n    // ToDo: Not handling moves from PC\n    /* 0b00000 */ { 0x00, &CDetourDis::PureCopy16 },\n    /* 0b00001 */ { 0x01, &CDetourDis::PureCopy16 },\n    /* 0b00010 */ { 0x02, &CDetourDis::PureCopy16 },\n\n    // Add/subtract register\n    // Add/subtract immediate\n    /* 0b00011 */ { 0x03, &CDetourDis::PureCopy16},\n\n    // Add/subtract/compare/move immediate\n    /* 0b00100 */ { 0x04, &CDetourDis::PureCopy16 },\n    /* 0b00101 */ { 0x05, &CDetourDis::PureCopy16 },\n    /* 0b00110 */ { 0x06, &CDetourDis::PureCopy16 },\n    /* 0b00111 */ { 0x07, &CDetourDis::PureCopy16 },\n\n    // Data-processing register\n    // Special data processing\n    // Branch/exchange instruction set\n    /* 0b01000 */ { 0x08, &CDetourDis::CopyBranchExchangeOrDataProcessing16 },\n\n    // Load from literal pool\n    /* 0b01001 */ { 0x09, &CDetourDis::CopyLiteralLoad16 },\n\n    // Load/store register offset\n    /* 0b01010 */ { 0x0a, &CDetourDis::PureCopy16 },\n    /* 0b01011 */ { 0x0b, &CDetourDis::PureCopy16 },\n\n    //  Load/store word/byte immediate offset.\n    /* 0b01100 */ { 0x0c, &CDetourDis::PureCopy16 },\n    /* 0b01101 */ { 0x0d, &CDetourDis::PureCopy16 },\n    /* 0b01110 */ { 0x0e, &CDetourDis::PureCopy16 },\n    /* 0b01111 */ { 0x0f, &CDetourDis::PureCopy16 },\n\n    //  Load/store halfword immediate offset.\n    /* 0b10000 */ { 0x10, &CDetourDis::PureCopy16 },\n    /* 0b10001 */ { 0x11, &CDetourDis::PureCopy16 },\n\n    // Load from or store to stack\n    /* 0b10010 */ { 0x12, &CDetourDis::PureCopy16 },\n    /* 0b10011 */ { 0x13, &CDetourDis::PureCopy16 },\n\n    // Add to SP or PC\n    /* 0b10100 */ { 0x14, &CDetourDis::PureCopy16 },\n    //   ToDo: Is ADR (T1) blitt-able?\n    //     It adds a value to PC and stores the result in a register.\n    //     Does this count as a 'target' for detours?\n    /* 0b10101 */ { 0x15, &CDetourDis::PureCopy16 },\n\n    // Miscellaneous\n    /* 0b10110 */ { 0x16, &CDetourDis::CopyMiscellaneous16 },\n    /* 0b10111 */ { 0x17, &CDetourDis::CopyMiscellaneous16 },\n\n    // Load/store multiple\n    /* 0b11000 */ { 0x18, &CDetourDis::PureCopy16 },\n    /* 0b11001 */ { 0x19, &CDetourDis::PureCopy16 },\n    //   ToDo: Are we sure these are all safe?\n    //     LDMIA, for example, can include an 'embedded' branch.\n    //     Does this count as a 'target' for detours?\n\n    // Conditional branch\n    /* 0b11010 */ { 0x1a, &CDetourDis::CopyConditionalBranchOrOther16 },\n\n    // Conditional branch\n    // Undefined instruction\n    // Service (system) call\n    /* 0b11011 */ { 0x1b, &CDetourDis::CopyConditionalBranchOrOther16 },\n\n    // Unconditional branch\n    /* 0b11100 */ { 0x1c, &CDetourDis::CopyUnConditionalBranch16 },\n\n    // 32-bit instruction\n    /* 0b11101 */ { 0x1d, &CDetourDis::BeginCopy32 },\n    /* 0b11110 */ { 0x1e, &CDetourDis::BeginCopy32 },\n    /* 0b11111 */ { 0x1f, &CDetourDis::BeginCopy32 },\n    { 0, NULL }\n};\n\nBYTE CDetourDis::CopyBranch24(BYTE* pSource, BYTE* pDest)\n{\n    ULONG instruction = GetLongInstruction(pSource);\n    BOOL fLink;\n    LONG oldDelta = DecodeBranch24(instruction, fLink);\n    PBYTE pTarget = CalculateTarget(pSource, oldDelta);\n    m_pbTarget = pTarget;\n\n    // Re-encode as 32-bit\n    PUSHORT pDstInst = (PUSHORT)(pDest);\n    LONG newDelta = CalculateNewDelta(pTarget, pDest);\n    instruction = EncodeBranch24(instruction, newDelta, fLink);\n    if (instruction) {\n        // Copy both bytes of the instruction\n        EmitLongInstruction(pDstInst, instruction);\n        return sizeof(DWORD);\n    }\n\n    // If that fails, re-encode as a 'long branch'\n    EmitLongBranch(pDstInst, pTarget);\n\n    // Compute the extra space needed for the instruction\n    m_lExtra = CalculateExtra(sizeof(DWORD), pDest, (BYTE*)(pDstInst));\n    return sizeof(DWORD); // The source instruction was 32 bits\n}\n\nBYTE CDetourDis::CopyBranchOrMiscellaneous32(BYTE* pSource, BYTE* pDest)\n{\n    ULONG instruction = GetLongInstruction(pSource);\n    if ((instruction & 0xf800d000) == 0xf0008000) { // B<c>.W <label>\n        LONG oldDelta = DecodeBranch20(instruction);\n        PBYTE pTarget = CalculateTarget(pSource, oldDelta);\n        m_pbTarget = pTarget;\n\n        // Re-encode as 32-bit\n        PUSHORT pDstInst = (PUSHORT)(pDest);\n        LONG newDelta = CalculateNewDelta(pTarget, pDest);\n        instruction = EncodeBranch20(instruction, newDelta);\n        if (instruction) {\n            // Copy both bytes of the instruction\n            EmitLongInstruction(pDstInst, instruction);\n            return sizeof(DWORD);\n        }\n\n        // If that fails, re-encode as a sequence of branches\n        // For example, bls.w +0x86 (00090480)| becomes:\n        //\n        // 001df788 f2408001 bls.w       001df78e\n        // 001df78c e004     b           001df798\n        // 001df78e e001     b           001df794\n        // 001df790 0480     dc.h        0480\n        // 001df792 0009     dc.h        0009\n        // 001df794 f85ff008 ldr         pc,=0x90480\n        //\n\n        // First, reuse the existing conditional branch to, if successful,\n        // branch down to a 'long branch' that we will emit below\n        instruction = EncodeBranch20(GetLongInstruction(pSource), 2);\n        // Due to the size of c_PCAdjust a two-length branch moves 6 bytes forward,\n        // past the following unconditional branch\n        ASSERT(instruction);\n        EmitLongInstruction(pDstInst, instruction);\n\n        // Next, prepare to insert an unconditional branch that will be hit\n        // if the condition above is not met.  This branch will branch over\n        // the following 'long branch'\n        // We can't actually encode this branch yet though, because\n        // 'long branches' can vary in size\n        PUSHORT pUnconditionalBranchInstruction = pDstInst++;\n\n        // Then, emit a 'long branch' that will be hit if the original condition is met\n        BYTE longBranchSize = EmitLongBranch(pDstInst, pTarget);\n\n        // Finally, encode and emit the unconditional branch that will be used\n        // to branch past the 'long branch' if the initial condition was not met\n        Branch11 branch11 = { 0x00, 0x1C };\n        instruction = EncodeBranch11(*(DWORD*)(&branch11), longBranchSize - c_PCAdjust + sizeof(USHORT));\n        ASSERT(instruction);\n        *pUnconditionalBranchInstruction = static_cast<USHORT>(instruction);\n\n        // Compute the extra space needed for the instruction\n        m_lExtra = CalculateExtra(sizeof(DWORD), pDest, (BYTE*)(pDstInst));\n        return sizeof(DWORD); // The source instruction was 32 bits\n    }\n\n    if ((instruction & 0xf800d000) == 0xf0009000) { // B.W <label>\n        // B <label>  11110xxxxxxxxxxx10xxxxxxxxxxxxxx\n        return CopyBranch24(pSource, pDest);\n    }\n\n    if ((instruction & 0xf800d000) == 0xf000d000) { // BL.W <label>\n        // B <label>  11110xxxxxxxxxxx10xxxxxxxxxxxxxx\n\n        PUSHORT pDstInst = (PUSHORT)(pDest);\n        BOOL fLink;\n        LONG oldDelta = DecodeBranch24(instruction, fLink);\n        PBYTE pTarget = CalculateTarget(pSource, oldDelta);\n        m_pbTarget = pTarget;\n\n        *--((PULONG&)m_pbPool) = (ULONG)(size_t)DETOURS_PBYTE_TO_PFUNC(pTarget);\n\n        // ldr lr, target.\n        EmitLiteralLoad12(pDstInst, c_LR, m_pbPool);\n        // blx lr\n        EmitShortInstruction(pDstInst, 0x47f0);\n\n        // Compute the extra space needed for the instruction\n        m_lExtra = CalculateExtra(sizeof(DWORD), pDest, (BYTE*)(pDstInst));\n        return sizeof(DWORD); // The source instruction was 32 bits\n    }\n\n    if ((instruction & 0xFFF0FFFF) == 0xF3C08F00) {\n        // BXJ 111100111100xxxx1000111100000000\n        // BXJ switches to Jazelle mode, which is not supported\n        ASSERT(false);\n    }\n\n    if ((instruction & 0xFFFFFF00) == 0xF3DE8F00) {\n        // SUBS PC, LR 111100111101111010001111xxxxxxxx\n        m_pbTarget = (PBYTE)DETOUR_INSTRUCTION_TARGET_DYNAMIC;\n    }\n\n    // Everything else should be blitt-able\n    return PureCopy32(pSource, pDest);\n}\n\nBYTE CDetourDis::CopyLiteralLoad32(BYTE* pSource, BYTE* pDest)\n{\n    BYTE* pStart = pDest;\n    ULONG instruction = GetLongInstruction(pSource);\n\n    LONG oldDelta = DecodeLiteralLoad12(instruction);\n    PBYTE pTarget = CalculateTarget(Align4(pSource), oldDelta);\n\n    LiteralLoad12& load = (LiteralLoad12&)(instruction);\n\n    EmitLongLiteralLoad((PUSHORT&)pDest, load.Register, pTarget);\n\n    m_lExtra = (LONG)(pDest - pStart - sizeof(DWORD));\n\n    return sizeof(DWORD); // The source instruction was 32 bits\n}\n\nBYTE CDetourDis::CopyLoadAndStoreSingle(BYTE* pSource, BYTE* pDest)\n{\n    ULONG instruction = GetLongInstruction(pSource);\n\n    // Note: The following masks only look at the interesting bits\n    // (not the opCode prefix, since that check was performed in\n    // order to get to this function)\n    if (!(instruction & 0x100000)) {\n        // 1111 100x xxx0 xxxxxxxxxxxxxxxxxxxx : STR, STRB, STRH, etc.\n        return PureCopy32(pSource, pDest);\n    }\n\n    if ((instruction & 0xF81F0000) == 0xF81F0000) {\n        // 1111100xxxx11111xxxxxxxxxxxxxxxx : PC +/- Imm12\n        return CopyLiteralLoad32(pSource, pDest);\n    }\n\n    if ((instruction & 0xFE70F000) == 0xF81FF000) {\n        // 1111100xx001xxxx1111xxxxxxxxxxxx : PLD, PLI\n        // Convert PC-Relative PLD/PLI instructions to noops (1111100Xx00111111111xxxxxxxxxxxx)\n        if ((instruction & 0xFE7FF000) == 0xF81FF000) {\n            PUSHORT pDstInst = (PUSHORT)(pDest);\n            *pDstInst++ = c_NOP;\n            *pDstInst++ = c_NOP;\n            return sizeof(DWORD);  // The source instruction was 32 bits\n        }\n\n        // All other PLD/PLI instructions are blitt-able\n        return PureCopy32(pSource, pDest);\n    }\n\n    // If the load is writing to PC\n    if ((instruction & 0xF950F000) == 0xF850F000) {\n        m_pbTarget = (PBYTE)DETOUR_INSTRUCTION_TARGET_DYNAMIC;\n    }\n\n    // All other loads LDR (immediate), etc.\n    return PureCopy32(pSource, pDest);\n}\n\nBYTE CDetourDis::CopyLoadAndStoreMultipleAndSRS(BYTE* pSource, BYTE* pDest)\n{\n    // Probably all blitt-able, although not positive since some of these can result in a branch (LDMIA, POP, etc.)\n    return PureCopy32(pSource, pDest);\n}\n\nBYTE CDetourDis::CopyTableBranch(BYTE* pSource, BYTE* pDest)\n{\n    m_pbTarget = (PBYTE)DETOUR_INSTRUCTION_TARGET_DYNAMIC;\n    ULONG instruction = GetLongInstruction(pSource);\n    TableBranch& tableBranch = (TableBranch&)(instruction);\n\n    // If the base register is anything other than PC, we can simply copy the instruction\n    if (tableBranch.BaseRegister != c_PC) {\n        return PureCopy32(pSource, pDest);\n    }\n\n    __debugbreak();\n\n    // If the base register is PC, we need to manually perform the table lookup\n    // For example, this:\n    //\n    //        7ef40000 e8dff002 tbb         [pc,r2]\n    //\n    // becomes this:\n    //\n    //        7ef40404 b401     push        {r0}            ; pushed as a placeholder for the target address\n    //        7ef40406 e92d0005 push.w      {r0,r2}         ; scratch register and another register are pushed; there's a minimum of two registers in the list for push.w\n    //        7ef40410 4820     ldr         r0,=0x7EF40004  ; load the table address from the literal pool\n    //        7ef40414 eb000042 add         r0,r0,r2,lsl #1 ; add the index value to the address of the table to get the table entry; lsl only used if it's a TBH instruction\n    //        7ef40418 f8d00000 ldr.w       r0,[r0]         ; dereference the table entry to get the value of the target\n    //        7ef4041c ea4f0040 lsl         r0,r0,#1        ; multiply the offset by 2 (per the spec)\n    //        7ef40420 eb00000f add.w       r0,r0,pc        ; Add the offset to pc to get the target address\n    //        7ef40424 f8cd000c str.w       r0,[sp,#0xC]    ; store the target address on the stack (into the first push)\n    //        7ef40428 e8bd0005 pop.w       {r0,r2}         ; scratch register and another register are popped; there's a minimum of two registers in the list for pop.w\n    //        7ef4042c bd00     pop         {pc}            ; pop the address into pc\n    //\n\n    // Push r0 to make room for our jump address on the stack\n    PUSHORT pDstInst = (PUSHORT)(pDest);\n    *pDstInst++ = 0xb401;\n\n    // Locate a scratch register\n    BYTE scrReg = 0;\n    while (scrReg == tableBranch.IndexRegister) {\n        ++scrReg;\n    }\n\n    // Push scrReg and tableBranch.IndexRegister (push.w doesn't support pushing just 1 register)\n    DWORD pushInstruction = 0xe92d0000;\n    pushInstruction |= 1 << scrReg;\n    pushInstruction |= 1 << tableBranch.IndexRegister;\n    EmitLongInstruction(pDstInst, pushInstruction);\n\n    // Write the target address out to the 'literal pool';\n    // when the base register of a TBB/TBH is PC,\n    // the branch table immediately follows the instruction\n    BYTE* pTarget = CalculateTarget(pSource, 0);\n    *--((PUSHORT&)m_pbPool) = (USHORT)((size_t)pTarget & 0xffff);\n    *--((PUSHORT&)m_pbPool) = (USHORT)((size_t)pTarget >> 16);\n\n    // Load the literal pool value into our scratch register (this contains the address of the branch table)\n    // ldr rn, target\n    EmitLiteralLoad8(pDstInst, scrReg, m_pbPool);\n\n    // Add the index offset to the address of the branch table; the result will be the value within the table that contains the branch offset\n    // We need to multiply the index by two if we are using halfword indexing\n    // Will shift tableBranch.IndexRegister by 1 (multiply by 2) if using a TBH\n    EmitAdd32(pDstInst, scrReg, tableBranch.IndexRegister, scrReg, tableBranch.HalfWord);\n\n    // Dereference rn into rn, to load the value within the table\n    // ldr rn, [rn]\n    if (scrReg < 0x7) {\n        EmitImmediateRegisterLoad16(pDstInst, scrReg);\n    }\n    else {\n        EmitImmediateRegisterLoad32(pDstInst, scrReg);\n    }\n\n    // Multiply the offset by two to get the true offset value (as per the spec)\n    EmitLogicalShiftLeft32(pDstInst, scrReg, scrReg, 1);\n\n    // Add the offset to PC to get the target\n    EmitAdd32(pDstInst, scrReg, c_PC, scrReg, 0);\n\n    // Now write the contents of scrReg to the stack, so we can pop it into PC\n    // Write the address of the branch table entry to the stack, so we can pop it into PC\n    EmitStoreImmediate12(pDstInst, scrReg, c_SP, sizeof(DWORD) * 3);\n\n    // Pop scrReg and tableBranch.IndexRegister (pop.w doesn't support popping just 1 register)\n    DWORD popInstruction = 0xe8bd0000;\n    popInstruction |= 1 << scrReg;\n    popInstruction |= 1 << tableBranch.IndexRegister;\n    EmitLongInstruction(pDstInst, popInstruction);\n\n    // Pop PC\n    *pDstInst++ = 0xbd00;\n\n    // Compute the extra space needed for the branch sequence\n    m_lExtra = CalculateExtra(sizeof(USHORT), pDest, (BYTE*)(pDstInst));\n    return sizeof(DWORD);\n}\n\nBYTE CDetourDis::BeginCopy32(BYTE* pSource, BYTE* pDest)\n{\n    ULONG instruction = GetLongInstruction(pSource);\n\n    // Immediate data processing instructions; ADD, SUB, MOV, MOVN, ADR, MOVT, BFC, SSAT16, etc.\n    if ((instruction & 0xF8008000) == 0xF0000000) { // 11110xxxxxxxxxxx0xxxxxxxxxxxxxxx\n        // Should all be blitt-able\n        // ToDo: What about ADR?  Is it safe to do a straight-copy?\n        // ToDo: Not handling moves to or from PC\n        return PureCopy32(pSource, pDest);\n    }\n\n    // Non-Immediate data processing instructions; ADD, EOR, TST, etc.\n    if ((instruction & 0xEE000000) == 0xEA000000) { // 111x101xxxxxxxxxxxxxxxxxxxxxxx\n        // Should all be blitt-able\n        return PureCopy32(pSource, pDest);\n    }\n\n    // Load and store single data item, memory hints\n    if ((instruction & 0xFE000000) == 0xF8000000) { // 1111100xxxxxxxxxxxxxxxxxxxxxxxxx\n        return CopyLoadAndStoreSingle(pSource, pDest);\n    }\n\n    // Load and store, double and exclusive, and table branch\n    if ((instruction & 0xFE400000) == 0xE8400000) { // 1110100xx1xxxxxxxxxxxxxxxxxxxxxx\n        // Load and store double\n        if (instruction & 0x1200000) {\n            // LDRD, STRD (immediate) : xxxxxxxPxxWxxxxxxxxxxxxxxxxxxxxx where PW != 0b00\n            // The source register is PC\n            if ((instruction & 0xF0000) == 0xF0000) {\n                // ToDo: If the source register is PC, what should we do?\n                ASSERT(false);\n            }\n\n            // If either target registers are PC\n            if (((instruction & 0xF000) == 0xF000) ||\n                ((instruction & 0xF00) == 0xF00)) {\n                m_pbTarget = (PBYTE)DETOUR_INSTRUCTION_TARGET_DYNAMIC;\n            }\n\n            return PureCopy32(pSource, pDest);\n        }\n\n        // Load and store exclusive\n        if (!(instruction & 0x800000)) { // LDREX, STREX : xxxxxxxx0xxxxxxxxxxxxxxxxxxxxxxx\n            if ((instruction & 0xF000) == 0xF000) { // xxxxxxxxxxxx1111xxxxxxxxxxxx\n                m_pbTarget = (PBYTE)DETOUR_INSTRUCTION_TARGET_DYNAMIC;\n            }\n            return PureCopy32(pSource, pDest);\n        }\n\n        // Table branch\n        if ((instruction & 0x1000F0) == 0x100000 ||  // TBB : xxxxxxxxxxx1xxxxxxxxxxxx0000xxxx\n            (instruction & 0x1000F0) == 0x100010) { // TBH : xxxxxxxxxxx1xxxxxxxxxxxx0001xxxx\n            return CopyTableBranch(pSource, pDest);\n        }\n\n        // Load and store exclusive byte, halfword, doubleword (LDREXB, LDREXH, LDREXD, STREXB, STREXH, STREXD, etc.)\n        return PureCopy32(pSource, pDest);\n    }\n\n    // Load and store multiple, RFE and SRS\n    if ((instruction & 0xFE400000) == 0xE8000000) { // 1110100xx0xxxxxxxxxxxxxxxxxxxxxx\n        // Return from exception (RFE)\n        if ((instruction & 0xE9900000) == 0xE9900000 || // 1110100110x1xxxxxxxxxxxxxxxxxxxx\n            (instruction & 0xE8100000) == 0xE8100000) { // 1110100000x1xxxxxxxxxxxxxxxxxxxx\n            return PureCopy32(pSource, pDest);\n        }\n\n        return CopyLoadAndStoreMultipleAndSRS(pSource, pDest);\n    }\n\n    // Branches, miscellaneous control\n    if ((instruction & 0xF8008000) == 0xF0008000) { // 11110xxxxxxxxxxx0xxxxxxxxxxxxxxx\n        // Branches, miscellaneous control\n        return CopyBranchOrMiscellaneous32(pSource, pDest);\n    }\n\n    // Coprocessor instructions\n    if ((instruction & 0xEC000000) == 0xEC000000) { // 111x11xxxxxxxxxxxxxxxxxxxxxxxxxx\n        return PureCopy32(pSource, pDest);\n    }\n\n    // Unhandled instruction; should never make it this far\n    ASSERT(false);\n    return PureCopy32(pSource, pDest);\n}\n\n/////////////////////////////////////////////////////////// Disassembler Code.\n//\nCDetourDis::CDetourDis() :\n    m_pbTarget((PBYTE)DETOUR_INSTRUCTION_TARGET_NONE),\n    m_pbPool(NULL),\n    m_lExtra(0)\n{\n}\n\nPBYTE CDetourDis::CopyInstruction(PBYTE pDst,\n                                  PBYTE *ppDstPool,\n                                  PBYTE pSrc,\n                                  PBYTE *ppTarget,\n                                  LONG *plExtra)\n{\n    if (pDst && ppDstPool && ppDstPool != NULL) {\n        m_pbPool = (PBYTE)*ppDstPool;\n    }\n    else {\n        pDst = m_rbScratchDst;\n        m_pbPool = m_rbScratchDst + sizeof(m_rbScratchDst);\n    }\n    // Make sure the constant pool is 32-bit aligned.\n    m_pbPool -= ((ULONG_PTR)m_pbPool) & 3;\n\n    REFCOPYENTRY pEntry = &s_rceCopyTable[pSrc[1] >> 3];\n    ULONG size = (this->*pEntry->pfCopy)(pSrc, pDst);\n\n    pSrc += size;\n\n    // If the target is needed, store our target\n    if (ppTarget) {\n        *ppTarget = m_pbTarget;\n    }\n    if (plExtra) {\n        *plExtra = m_lExtra;\n    }\n    if (ppDstPool) {\n        *ppDstPool = m_pbPool;\n    }\n\n    return pSrc;\n}\n\n\nPVOID WINAPI DetourCopyInstruction(_In_opt_ PVOID pDst,\n                                   _Inout_opt_ PVOID *ppDstPool,\n                                   _In_ PVOID pSrc,\n                                   _Out_opt_ PVOID *ppTarget,\n                                   _Out_opt_ LONG *plExtra)\n{\n    CDetourDis state;\n    return (PVOID)state.CopyInstruction((PBYTE)pDst,\n                                        (PBYTE*)ppDstPool,\n                                        (PBYTE)pSrc,\n                                        (PBYTE*)ppTarget,\n                                        plExtra);\n}\n\n#endif // DETOURS_ARM\n\n#ifdef DETOURS_ARM64\n\n#define c_LR        30          // The register number for the Link Register\n#define c_SP        31          // The register number for the Stack Pointer\n#define c_NOP       0xd503201f  // A nop instruction\n#define c_BREAK     (0xd4200000 | (0xf000 << 5)) // A break instruction\n\n//\n// Problematic instructions:\n//\n// ADR     0ll10000 hhhhhhhh hhhhhhhh hhhddddd  & 0x9f000000 == 0x10000000  (l = low, h = high, d = Rd)\n// ADRP    1ll10000 hhhhhhhh hhhhhhhh hhhddddd  & 0x9f000000 == 0x90000000  (l = low, h = high, d = Rd)\n//\n// B.cond  01010100 iiiiiiii iiiiiiii iii0cccc  & 0xff000010 == 0x54000000  (i = delta = SignExtend(imm19:00, 64), c = cond)\n//\n// B       000101ii iiiiiiii iiiiiiii iiiiiiii  & 0xfc000000 == 0x14000000  (i = delta = SignExtend(imm26:00, 64))\n// BL      100101ii iiiiiiii iiiiiiii iiiiiiii  & 0xfc000000 == 0x94000000  (i = delta = SignExtend(imm26:00, 64))\n//\n// CBNZ    z0110101 iiiiiiii iiiiiiii iiittttt  & 0x7f000000 == 0x35000000  (z = size, i = delta = SignExtend(imm19:00, 64), t = Rt)\n// CBZ     z0110100 iiiiiiii iiiiiiii iiittttt  & 0x7f000000 == 0x34000000  (z = size, i = delta = SignExtend(imm19:00, 64), t = Rt)\n//\n// LDR Wt  00011000 iiiiiiii iiiiiiii iiittttt  & 0xff000000 == 0x18000000  (i = SignExtend(imm19:00, 64), t = Rt)\n// LDR Xt  01011000 iiiiiiii iiiiiiii iiittttt  & 0xff000000 == 0x58000000  (i = SignExtend(imm19:00, 64), t = Rt)\n// LDRSW   10011000 iiiiiiii iiiiiiii iiittttt  & 0xff000000 == 0x98000000  (i = SignExtend(imm19:00, 64), t = Rt)\n// PRFM    11011000 iiiiiiii iiiiiiii iiittttt  & 0xff000000 == 0xd8000000  (i = SignExtend(imm19:00, 64), t = Rt)\n// LDR St  00011100 iiiiiiii iiiiiiii iiittttt  & 0xff000000 == 0x1c000000  (i = SignExtend(imm19:00, 64), t = Rt)\n// LDR Dt  01011100 iiiiiiii iiiiiiii iiittttt  & 0xff000000 == 0x5c000000  (i = SignExtend(imm19:00, 64), t = Rt)\n// LDR Qt  10011100 iiiiiiii iiiiiiii iiittttt  & 0xff000000 == 0x9c000000  (i = SignExtend(imm19:00, 64), t = Rt)\n// LDR inv 11011100 iiiiiiii iiiiiiii iiittttt  & 0xff000000 == 0xdc000000  (i = SignExtend(imm19:00, 64), t = Rt)\n//\n// TBNZ    z0110111 bbbbbiii iiiiiiii iiittttt  & 0x7f000000 == 0x37000000  (z = size, b = bitnum, i = SignExtend(imm14:00, 64), t = Rt)\n// TBZ     z0110110 bbbbbiii iiiiiiii iiittttt  & 0x7f000000 == 0x36000000  (z = size, b = bitnum, i = SignExtend(imm14:00, 64), t = Rt)\n//\n\nclass CDetourDis\n{\n  public:\n    CDetourDis();\n\n    PBYTE   CopyInstruction(PBYTE pDst,\n                            PBYTE pSrc,\n                            PBYTE *ppTarget,\n                            LONG *plExtra);\n\n  public:\n    typedef BYTE (CDetourDis::* COPYFUNC)(PBYTE pbDst, PBYTE pbSrc);\n\n    union AddImm12\n    {\n        DWORD Assembled;\n        struct\n        {\n            DWORD Rd : 5;           // Destination register\n            DWORD Rn : 5;           // Source register\n            DWORD Imm12 : 12;       // 12-bit immediate\n            DWORD Shift : 2;        // shift (must be 0 or 1)\n            DWORD Opcode1 : 7;      // Must be 0010001 == 0x11\n            DWORD Size : 1;         // 0 = 32-bit, 1 = 64-bit\n        } s;\n        static DWORD Assemble(DWORD size, DWORD rd, DWORD rn, ULONG imm, DWORD shift)\n        {\n            AddImm12 temp;\n            temp.s.Rd = rd;\n            temp.s.Rn = rn;\n            temp.s.Imm12 = imm & 0xfff;\n            temp.s.Shift = shift;\n            temp.s.Opcode1 = 0x11;\n            temp.s.Size = size;\n            return temp.Assembled;\n        }\n        static DWORD AssembleAdd32(DWORD rd, DWORD rn, ULONG imm, DWORD shift) { return Assemble(0, rd, rn, imm, shift); }\n        static DWORD AssembleAdd64(DWORD rd, DWORD rn, ULONG imm, DWORD shift) { return Assemble(1, rd, rn, imm, shift); }\n    };\n\n    union Adr19\n    {\n        DWORD Assembled;\n        struct\n        {\n            DWORD Rd : 5;           // Destination register\n            DWORD Imm19 : 19;       // 19-bit upper immediate\n            DWORD Opcode1 : 5;      // Must be 10000 == 0x10\n            DWORD Imm2 : 2;         // 2-bit lower immediate\n            DWORD Type : 1;         // 0 = ADR, 1 = ADRP\n        } s;\n        inline LONG Imm() const { DWORD Imm = (s.Imm19 << 2) | s.Imm2; return (LONG)(Imm << 11) >> 11; }\n        static DWORD Assemble(DWORD type, DWORD rd, LONG delta)\n        {\n            Adr19 temp;\n            temp.s.Rd = rd;\n            temp.s.Imm19 = (delta >> 2) & 0x7ffff;\n            temp.s.Opcode1 = 0x10;\n            temp.s.Imm2 = delta & 3;\n            temp.s.Type = type;\n            return temp.Assembled;\n        }\n        static DWORD AssembleAdr(DWORD rd, LONG delta) { return Assemble(0, rd, delta); }\n        static DWORD AssembleAdrp(DWORD rd, LONG delta) { return Assemble(1, rd, delta); }\n    };\n\n    union Bcc19\n    {\n        DWORD Assembled;\n        struct\n        {\n            DWORD Condition : 4;    // Condition\n            DWORD Opcode1 : 1;      // Must be 0\n            DWORD Imm19 : 19;       // 19-bit immediate\n            DWORD Opcode2 : 8;      // Must be 01010100 == 0x54\n        } s;\n        inline LONG Imm() const { return (LONG)(s.Imm19 << 13) >> 11; }\n        static DWORD AssembleBcc(DWORD condition, LONG delta)\n        {\n            Bcc19 temp;\n            temp.s.Condition = condition;\n            temp.s.Opcode1 = 0;\n            temp.s.Imm19 = delta >> 2;\n            temp.s.Opcode2 = 0x54;\n            return temp.Assembled;\n        }\n    };\n\n    union Branch26\n    {\n        DWORD Assembled;\n        struct\n        {\n            DWORD Imm26 : 26;       // 26-bit immediate\n            DWORD Opcode1 : 5;      // Must be 00101 == 0x5\n            DWORD Link : 1;         // 0 = B, 1 = BL\n        } s;\n        inline LONG Imm() const { return (LONG)(s.Imm26 << 6) >> 4; }\n        static DWORD Assemble(DWORD link, LONG delta)\n        {\n            Branch26 temp;\n            temp.s.Imm26 = delta >> 2;\n            temp.s.Opcode1 = 0x5;\n            temp.s.Link = link;\n            return temp.Assembled;\n        }\n        static DWORD AssembleB(LONG delta) { return Assemble(0, delta); }\n        static DWORD AssembleBl(LONG delta) { return Assemble(1, delta); }\n    };\n\n    union Br\n    {\n        DWORD Assembled;\n        struct\n        {\n            DWORD Opcode1 : 5;      // Must be 00000 == 0\n            DWORD Rn : 5;           // Register number\n            DWORD Opcode2 : 22;     // Must be 1101011000011111000000 == 0x3587c0 for Br\n                                    //                                   0x358fc0 for Brl\n        } s;\n        static DWORD Assemble(DWORD rn, bool link)\n        {\n            Br temp;\n            temp.s.Opcode1 = 0;\n            temp.s.Rn = rn;\n            temp.s.Opcode2 = 0x3587c0;\n            if (link)\n                temp.Assembled |= 0x00200000;\n            return temp.Assembled;\n        }\n        static DWORD AssembleBr(DWORD rn)\n        {\n            return Assemble(rn, false);\n        }\n        static DWORD AssembleBrl(DWORD rn)\n        {\n            return Assemble(rn, true);\n        }\n    };\n\n    union Cbz19\n    {\n        DWORD Assembled;\n        struct\n        {\n            DWORD Rt : 5;           // Register to test\n            DWORD Imm19 : 19;       // 19-bit immediate\n            DWORD Nz : 1;           // 0 = CBZ, 1 = CBNZ\n            DWORD Opcode1 : 6;      // Must be 011010 == 0x1a\n            DWORD Size : 1;         // 0 = 32-bit, 1 = 64-bit\n        } s;\n        inline LONG Imm() const { return (LONG)(s.Imm19 << 13) >> 11; }\n        static DWORD Assemble(DWORD size, DWORD nz, DWORD rt, LONG delta)\n        {\n            Cbz19 temp;\n            temp.s.Rt = rt;\n            temp.s.Imm19 = delta >> 2;\n            temp.s.Nz = nz;\n            temp.s.Opcode1 = 0x1a;\n            temp.s.Size = size;\n            return temp.Assembled;\n        }\n    };\n\n    union LdrLit19\n    {\n        DWORD Assembled;\n        struct\n        {\n            DWORD Rt : 5;           // Destination register\n            DWORD Imm19 : 19;       // 19-bit immediate\n            DWORD Opcode1 : 2;      // Must be 0\n            DWORD FpNeon : 1;       // 0 = LDR Wt/LDR Xt/LDRSW/PRFM, 1 = LDR St/LDR Dt/LDR Qt\n            DWORD Opcode2 : 3;      // Must be 011 = 3\n            DWORD Size : 2;         // 00 = LDR Wt/LDR St, 01 = LDR Xt/LDR Dt, 10 = LDRSW/LDR Qt, 11 = PRFM/invalid\n        } s;\n        inline LONG Imm() const { return (LONG)(s.Imm19 << 13) >> 11; }\n        static DWORD Assemble(DWORD size, DWORD fpneon, DWORD rt, LONG delta)\n        {\n            LdrLit19 temp;\n            temp.s.Rt = rt;\n            temp.s.Imm19 = delta >> 2;\n            temp.s.Opcode1 = 0;\n            temp.s.FpNeon = fpneon;\n            temp.s.Opcode2 = 3;\n            temp.s.Size = size;\n            return temp.Assembled;\n        }\n    };\n\n    union LdrFpNeonImm9\n    {\n        DWORD Assembled;\n        struct\n        {\n            DWORD Rt : 5;           // Destination register\n            DWORD Rn : 5;           // Base register\n            DWORD Imm12 : 12;       // 12-bit immediate\n            DWORD Opcode1 : 1;      // Must be 1 == 1\n            DWORD Opc : 1;          // Part of size\n            DWORD Opcode2 : 6;      // Must be 111101 == 0x3d\n            DWORD Size : 2;         // Size (0=8-bit, 1=16-bit, 2=32-bit, 3=64-bit, 4=128-bit)\n        } s;\n        static DWORD Assemble(DWORD size, DWORD rt, DWORD rn, ULONG imm)\n        {\n            LdrFpNeonImm9 temp;\n            temp.s.Rt = rt;\n            temp.s.Rn = rn;\n            temp.s.Imm12 = imm;\n            temp.s.Opcode1 = 1;\n            temp.s.Opc = size >> 2;\n            temp.s.Opcode2 = 0x3d;\n            temp.s.Size = size & 3;\n            return temp.Assembled;\n        }\n    };\n\n    union Mov16\n    {\n        DWORD Assembled;\n        struct\n        {\n            DWORD Rd : 5;           // Destination register\n            DWORD Imm16 : 16;       // Immediate\n            DWORD Shift : 2;        // Shift amount (0=0, 1=16, 2=32, 3=48)\n            DWORD Opcode : 6;       // Must be 100101 == 0x25\n            DWORD Type : 2;         // 0 = MOVN, 1 = reserved, 2 = MOVZ, 3 = MOVK\n            DWORD Size : 1;         // 0 = 32-bit, 1 = 64-bit\n        } s;\n        static DWORD Assemble(DWORD size, DWORD type, DWORD rd, DWORD imm, DWORD shift)\n        {\n            Mov16 temp;\n            temp.s.Rd = rd;\n            temp.s.Imm16 = imm;\n            temp.s.Shift = shift;\n            temp.s.Opcode = 0x25;\n            temp.s.Type = type;\n            temp.s.Size = size;\n            return temp.Assembled;\n        }\n        static DWORD AssembleMovn32(DWORD rd, DWORD imm, DWORD shift) { return Assemble(0, 0, rd, imm, shift); }\n        static DWORD AssembleMovn64(DWORD rd, DWORD imm, DWORD shift) { return Assemble(1, 0, rd, imm, shift); }\n        static DWORD AssembleMovz32(DWORD rd, DWORD imm, DWORD shift) { return Assemble(0, 2, rd, imm, shift); }\n        static DWORD AssembleMovz64(DWORD rd, DWORD imm, DWORD shift) { return Assemble(1, 2, rd, imm, shift); }\n        static DWORD AssembleMovk32(DWORD rd, DWORD imm, DWORD shift) { return Assemble(0, 3, rd, imm, shift); }\n        static DWORD AssembleMovk64(DWORD rd, DWORD imm, DWORD shift) { return Assemble(1, 3, rd, imm, shift); }\n    };\n\n    union Tbz14\n    {\n        DWORD Assembled;\n        struct\n        {\n            DWORD Rt : 5;           // Register to test\n            DWORD Imm14 : 14;       // 14-bit immediate\n            DWORD Bit : 5;          // 5-bit index\n            DWORD Nz : 1;           // 0 = TBZ, 1 = TBNZ\n            DWORD Opcode1 : 6;      // Must be 011011 == 0x1b\n            DWORD Size : 1;         // 0 = 32-bit, 1 = 64-bit\n        } s;\n        inline LONG Imm() const { return (LONG)(s.Imm14 << 18) >> 16; }\n        static DWORD Assemble(DWORD size, DWORD nz, DWORD rt, DWORD bit, LONG delta)\n        {\n            Tbz14 temp;\n            temp.s.Rt = rt;\n            temp.s.Imm14 = delta >> 2;\n            temp.s.Bit = bit;\n            temp.s.Nz = nz;\n            temp.s.Opcode1 = 0x1b;\n            temp.s.Size = size;\n            return temp.Assembled;\n        }\n    };\n\n\n  protected:\n    BYTE    PureCopy32(BYTE* pSource, BYTE* pDest);\n    BYTE    EmitMovImmediate(PULONG& pDstInst, BYTE rd, UINT64 immediate);\n    BYTE    CopyAdr(BYTE* pSource, BYTE* pDest, ULONG instruction);\n    BYTE    CopyBcc(BYTE* pSource, BYTE* pDest, ULONG instruction);\n    BYTE    CopyB(BYTE* pSource, BYTE* pDest, ULONG instruction);\n    BYTE    CopyBl(BYTE* pSource, BYTE* pDest, ULONG instruction);\n    BYTE    CopyB_or_Bl(BYTE* pSource, BYTE* pDest, ULONG instruction, bool link);\n    BYTE    CopyCbz(BYTE* pSource, BYTE* pDest, ULONG instruction);\n    BYTE    CopyTbz(BYTE* pSource, BYTE* pDest, ULONG instruction);\n    BYTE    CopyLdrLiteral(BYTE* pSource, BYTE* pDest, ULONG instruction);\n\n  protected:\n    ULONG GetInstruction(BYTE* pSource)\n    {\n        return ((PULONG)pSource)[0];\n    }\n\n    BYTE EmitInstruction(PULONG& pDstInst, ULONG instruction)\n    {\n        *pDstInst++ = instruction;\n        return sizeof(ULONG);\n    }\n\n  protected:\n    PBYTE   m_pbTarget;\n    BYTE    m_rbScratchDst[128]; // matches or exceeds rbCode\n};\n\nBYTE CDetourDis::PureCopy32(BYTE* pSource, BYTE* pDest)\n{\n    *(ULONG *)pDest = *(ULONG*)pSource;\n    return sizeof(DWORD);\n}\n\n/////////////////////////////////////////////////////////// Disassembler Code.\n//\nCDetourDis::CDetourDis() :\n    m_pbTarget((PBYTE)DETOUR_INSTRUCTION_TARGET_NONE)\n{\n}\n\nPBYTE CDetourDis::CopyInstruction(PBYTE pDst,\n                                  PBYTE pSrc,\n                                  PBYTE *ppTarget,\n                                  LONG *plExtra)\n{\n    if (pDst == NULL) {\n        pDst = m_rbScratchDst;\n    }\n\n    DWORD Instruction = GetInstruction(pSrc);\n\n    ULONG CopiedSize;\n    if ((Instruction & 0x1f000000) == 0x10000000) {\n        CopiedSize = CopyAdr(pSrc, pDst, Instruction);\n    } else if ((Instruction & 0xff000010) == 0x54000000) {\n        CopiedSize = CopyBcc(pSrc, pDst, Instruction);\n    } else if ((Instruction & 0x7c000000) == 0x14000000) {\n        CopiedSize = CopyB_or_Bl(pSrc, pDst, Instruction, (Instruction & 0x80000000) != 0);\n    } else if ((Instruction & 0x7e000000) == 0x34000000) {\n        CopiedSize = CopyCbz(pSrc, pDst, Instruction);\n    } else if ((Instruction & 0x7e000000) == 0x36000000) {\n        CopiedSize = CopyTbz(pSrc, pDst, Instruction);\n    } else if ((Instruction & 0x3b000000) == 0x18000000) {\n        CopiedSize = CopyLdrLiteral(pSrc, pDst, Instruction);\n    } else {\n        CopiedSize = PureCopy32(pSrc, pDst);\n    }\n\n    // If the target is needed, store our target\n    if (ppTarget) {\n        *ppTarget = m_pbTarget;\n    }\n    if (plExtra) {\n        *plExtra = CopiedSize - sizeof(DWORD);\n    }\n\n    return pSrc + 4;\n}\n\nBYTE CDetourDis::EmitMovImmediate(PULONG& pDstInst, BYTE rd, UINT64 immediate)\n{\n    DWORD piece[4];\n    piece[3] = (DWORD)((immediate >> 48) & 0xffff);\n    piece[2] = (DWORD)((immediate >> 32) & 0xffff);\n    piece[1] = (DWORD)((immediate >> 16) & 0xffff);\n    piece[0] = (DWORD)((immediate >> 0) & 0xffff);\n    int count = 0;\n\n    // special case: MOVN with 32-bit dest\n    if (piece[3] == 0 && piece[2] == 0 && piece[1] == 0xffff)\n    {\n        EmitInstruction(pDstInst, Mov16::AssembleMovn32(rd, piece[0] ^ 0xffff, 0));\n        count++;\n    }\n\n    // MOVN/MOVZ with 64-bit dest\n    else\n    {\n        int zero_pieces = (piece[3] == 0x0000) + (piece[2] == 0x0000) + (piece[1] == 0x0000) + (piece[0] == 0x0000);\n        int ffff_pieces = (piece[3] == 0xffff) + (piece[2] == 0xffff) + (piece[1] == 0xffff) + (piece[0] == 0xffff);\n        DWORD defaultPiece = (ffff_pieces > zero_pieces) ? 0xffff : 0x0000;\n        bool first = true;\n        for (int pieceNum = 3; pieceNum >= 0; pieceNum--)\n        {\n            DWORD curPiece = piece[pieceNum];\n            if (curPiece != defaultPiece || (pieceNum == 0 && first))\n            {\n                count++;\n                if (first)\n                {\n                    if (defaultPiece == 0xffff)\n                    {\n                        EmitInstruction(pDstInst, Mov16::AssembleMovn64(rd, curPiece ^ 0xffff, pieceNum));\n                    }\n                    else\n                    {\n                        EmitInstruction(pDstInst, Mov16::AssembleMovz64(rd, curPiece, pieceNum));\n                    }\n                    first = false;\n                }\n                else\n                {\n                    EmitInstruction(pDstInst, Mov16::AssembleMovk64(rd, curPiece, pieceNum));\n                }\n            }\n        }\n    }\n    return (BYTE)(count * sizeof(DWORD));\n}\n\nBYTE CDetourDis::CopyAdr(BYTE* pSource, BYTE* pDest, ULONG instruction)\n{\n    Adr19& decoded = (Adr19&)(instruction);\n    PULONG pDstInst = (PULONG)(pDest);\n\n    // ADR case\n    if (decoded.s.Type == 0)\n    {\n        BYTE* pTarget = pSource + decoded.Imm();\n        LONG64 delta = pTarget - pDest;\n        LONG64 deltaPage = ((ULONG_PTR)pTarget >> 12) - ((ULONG_PTR)pDest >> 12);\n\n        // output as ADR\n        if (delta >= -(1 << 20) && delta < (1 << 20))\n        {\n            EmitInstruction(pDstInst, Adr19::AssembleAdr(decoded.s.Rd, (LONG)delta));\n        }\n\n        // output as ADRP; ADD\n        else if (deltaPage >= -(1 << 20) && (deltaPage < (1 << 20)))\n        {\n            EmitInstruction(pDstInst, Adr19::AssembleAdrp(decoded.s.Rd, (LONG)deltaPage));\n            EmitInstruction(pDstInst, AddImm12::AssembleAdd32(decoded.s.Rd, decoded.s.Rd, ((ULONG)(ULONG_PTR)pTarget) & 0xfff, 0));\n        }\n\n        // output as immediate move\n        else\n        {\n            EmitMovImmediate(pDstInst, decoded.s.Rd, (ULONG_PTR)pTarget);\n        }\n    }\n\n    // ADRP case\n    else\n    {\n        BYTE* pTarget = (BYTE*)((((ULONG_PTR)pSource >> 12) + decoded.Imm()) << 12);\n        LONG64 deltaPage = ((ULONG_PTR)pTarget >> 12) - ((ULONG_PTR)pDest >> 12);\n\n        // output as ADRP\n        if (deltaPage >= -(1 << 20) && (deltaPage < (1 << 20)))\n        {\n            EmitInstruction(pDstInst, Adr19::AssembleAdrp(decoded.s.Rd, (LONG)deltaPage));\n        }\n\n        // output as immediate move\n        else\n        {\n            EmitMovImmediate(pDstInst, decoded.s.Rd, (ULONG_PTR)pTarget);\n        }\n    }\n\n    return (BYTE)((BYTE*)pDstInst - pDest);\n}\n\nBYTE CDetourDis::CopyBcc(BYTE* pSource, BYTE* pDest, ULONG instruction)\n{\n    Bcc19& decoded = (Bcc19&)(instruction);\n    PULONG pDstInst = (PULONG)(pDest);\n\n    BYTE* pTarget = pSource + decoded.Imm();\n    m_pbTarget = pTarget;\n    LONG64 delta = pTarget - pDest;\n    LONG64 delta4 = pTarget - (pDest + 4);\n\n    // output as BCC\n    if (delta >= -(1 << 20) && delta < (1 << 20))\n    {\n        EmitInstruction(pDstInst, Bcc19::AssembleBcc(decoded.s.Condition, (LONG)delta));\n    }\n\n    // output as BCC <skip>; B\n    else if (delta4 >= -(1 << 27) && (delta4 < (1 << 27)))\n    {\n        EmitInstruction(pDstInst, Bcc19::AssembleBcc(decoded.s.Condition ^ 1, 8));\n        EmitInstruction(pDstInst, Branch26::AssembleB((LONG)delta4));\n    }\n\n    // output as MOV x17, Target; BCC <skip>; BR x17 (BIG assumption that x17 isn't being used for anything!!)\n    else\n    {\n        EmitMovImmediate(pDstInst, 17, (ULONG_PTR)pTarget);\n        EmitInstruction(pDstInst, Bcc19::AssembleBcc(decoded.s.Condition ^ 1, 8));\n        EmitInstruction(pDstInst, Br::AssembleBr(17));\n    }\n\n    return (BYTE)((BYTE*)pDstInst - pDest);\n}\n\nBYTE CDetourDis::CopyB_or_Bl(BYTE* pSource, BYTE* pDest, ULONG instruction, bool link)\n{\n    Branch26& decoded = (Branch26&)(instruction);\n    PULONG pDstInst = (PULONG)(pDest);\n\n    BYTE* pTarget = pSource + decoded.Imm();\n    m_pbTarget = pTarget;\n    LONG64 delta = pTarget - pDest;\n\n    // output as B or BRL\n    if (delta >= -(1 << 27) && (delta < (1 << 27)))\n    {\n        EmitInstruction(pDstInst, Branch26::Assemble(link, (LONG)delta));\n    }\n\n    // output as MOV x17, Target; BR or BRL x17 (BIG assumption that x17 isn't being used for anything!!)\n    else\n    {\n        EmitMovImmediate(pDstInst, 17, (ULONG_PTR)pTarget);\n        EmitInstruction(pDstInst, Br::Assemble(17, link));\n    }\n\n    return (BYTE)((BYTE*)pDstInst - pDest);\n}\n\nBYTE CDetourDis::CopyB(BYTE* pSource, BYTE* pDest, ULONG instruction)\n{\n    return CopyB_or_Bl(pSource, pDest, instruction, false);\n}\n\nBYTE CDetourDis::CopyBl(BYTE* pSource, BYTE* pDest, ULONG instruction)\n{\n    return CopyB_or_Bl(pSource, pDest, instruction, true);\n}\n\nBYTE CDetourDis::CopyCbz(BYTE* pSource, BYTE* pDest, ULONG instruction)\n{\n    Cbz19& decoded = (Cbz19&)(instruction);\n    PULONG pDstInst = (PULONG)(pDest);\n\n    BYTE* pTarget = pSource + decoded.Imm();\n    m_pbTarget = pTarget;\n    LONG64 delta = pTarget - pDest;\n    LONG64 delta4 = pTarget - (pDest + 4);\n\n    // output as CBZ/NZ\n    if (delta >= -(1 << 20) && delta < (1 << 20))\n    {\n        EmitInstruction(pDstInst, Cbz19::Assemble(decoded.s.Size, decoded.s.Nz, decoded.s.Rt, (LONG)delta));\n    }\n\n    // output as CBNZ/Z <skip>; B\n    else if (delta4 >= -(1 << 27) && (delta4 < (1 << 27)))\n    {\n        EmitInstruction(pDstInst, Cbz19::Assemble(decoded.s.Size, decoded.s.Nz ^ 1, decoded.s.Rt, 8));\n        EmitInstruction(pDstInst, Branch26::AssembleB((LONG)delta4));\n    }\n\n    // output as MOV x17, Target; CBNZ/Z <skip>; BR x17 (BIG assumption that x17 isn't being used for anything!!)\n    else\n    {\n        EmitMovImmediate(pDstInst, 17, (ULONG_PTR)pTarget);\n        EmitInstruction(pDstInst, Cbz19::Assemble(decoded.s.Size, decoded.s.Nz ^ 1, decoded.s.Rt, 8));\n        EmitInstruction(pDstInst, Br::AssembleBr(17));\n    }\n\n    return (BYTE)((BYTE*)pDstInst - pDest);\n}\n\nBYTE CDetourDis::CopyTbz(BYTE* pSource, BYTE* pDest, ULONG instruction)\n{\n    Tbz14& decoded = (Tbz14&)(instruction);\n    PULONG pDstInst = (PULONG)(pDest);\n\n    BYTE* pTarget = pSource + decoded.Imm();\n    m_pbTarget = pTarget;\n    LONG64 delta = pTarget - pDest;\n    LONG64 delta4 = pTarget - (pDest + 4);\n\n    // output as TBZ/NZ\n    if (delta >= -(1 << 13) && delta < (1 << 13))\n    {\n        EmitInstruction(pDstInst, Tbz14::Assemble(decoded.s.Size, decoded.s.Nz, decoded.s.Rt, decoded.s.Bit, (LONG)delta));\n    }\n\n    // output as TBNZ/Z <skip>; B\n    else if (delta4 >= -(1 << 27) && (delta4 < (1 << 27)))\n    {\n        EmitInstruction(pDstInst, Tbz14::Assemble(decoded.s.Size, decoded.s.Nz ^ 1, decoded.s.Rt, decoded.s.Bit, 8));\n        EmitInstruction(pDstInst, Branch26::AssembleB((LONG)delta4));\n    }\n\n    // output as MOV x17, Target; TBNZ/Z <skip>; BR x17 (BIG assumption that x17 isn't being used for anything!!)\n    else\n    {\n        EmitMovImmediate(pDstInst, 17, (ULONG_PTR)pTarget);\n        EmitInstruction(pDstInst, Tbz14::Assemble(decoded.s.Size, decoded.s.Nz ^ 1, decoded.s.Rt, decoded.s.Bit, 8));\n        EmitInstruction(pDstInst, Br::AssembleBr(17));\n    }\n\n    return (BYTE)((BYTE*)pDstInst - pDest);\n}\n\nBYTE CDetourDis::CopyLdrLiteral(BYTE* pSource, BYTE* pDest, ULONG instruction)\n{\n    LdrLit19& decoded = (LdrLit19&)(instruction);\n    PULONG pDstInst = (PULONG)(pDest);\n\n    BYTE* pTarget = pSource + decoded.Imm();\n    LONG64 delta = pTarget - pDest;\n\n    // output as LDR\n    if (delta >= -(1 << 21) && delta < (1 << 21))\n    {\n        EmitInstruction(pDstInst, LdrLit19::Assemble(decoded.s.Size, decoded.s.FpNeon, decoded.s.Rt, (LONG)delta));\n    }\n\n    // output as move immediate\n    else if (decoded.s.FpNeon == 0)\n    {\n        UINT64 value = 0;\n        switch (decoded.s.Size)\n        {\n            case 0: value = *(ULONG*)pTarget;       break;\n            case 1: value = *(UINT64*)pTarget;   break;\n            case 2: value = *(LONG*)pTarget;        break;\n        }\n        EmitMovImmediate(pDstInst, decoded.s.Rt, value);\n    }\n\n    // FP/NEON register: compute address in x17 and load from there (BIG assumption that x17 isn't being used for anything!!)\n    else\n    {\n        EmitMovImmediate(pDstInst, 17, (ULONG_PTR)pTarget);\n        EmitInstruction(pDstInst, LdrFpNeonImm9::Assemble(2 + decoded.s.Size, decoded.s.Rt, 17, 0));\n    }\n\n    return (BYTE)((BYTE*)pDstInst - pDest);\n}\n\n\nPVOID WINAPI DetourCopyInstruction(_In_opt_ PVOID pDst,\n                                   _Inout_opt_ PVOID *ppDstPool,\n                                   _In_ PVOID pSrc,\n                                   _Out_opt_ PVOID *ppTarget,\n                                   _Out_opt_ LONG *plExtra)\n{\n    UNREFERENCED_PARAMETER(ppDstPool);\n\n    CDetourDis state;\n    return (PVOID)state.CopyInstruction((PBYTE)pDst,\n                                        (PBYTE)pSrc,\n                                        (PBYTE*)ppTarget,\n                                        plExtra);\n}\n\n#endif // DETOURS_ARM64\n\nBOOL WINAPI DetourSetCodeModule(_In_ HMODULE hModule,\n                                _In_ BOOL fLimitReferencesToModule)\n{\n#if defined(DETOURS_X64) || defined(DETOURS_X86)\n    PBYTE pbBeg = NULL;\n    PBYTE pbEnd = (PBYTE)~(ULONG_PTR)0;\n\n    if (hModule != NULL) {\n        ULONG cbModule = DetourGetModuleSize(hModule);\n\n        pbBeg = (PBYTE)hModule;\n        pbEnd = (PBYTE)hModule + cbModule;\n    }\n\n    return CDetourDis::SetCodeModule(pbBeg, pbEnd, fLimitReferencesToModule);\n#elif defined(DETOURS_ARM) || defined(DETOURS_ARM64) || defined(DETOURS_IA64)\n    (void)hModule;\n    (void)fLimitReferencesToModule;\n    return TRUE;\n#else\n#error unknown architecture (x86, x64, arm, arm64, ia64)\n#endif\n}\n\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/src/disolarm.cpp",
    "content": "#define DETOURS_ARM_OFFLINE_LIBRARY\n#include \"disasm.cpp\"\n"
  },
  {
    "path": "ext/detours/src/disolarm64.cpp",
    "content": "#define DETOURS_ARM64_OFFLINE_LIBRARY\n#include \"disasm.cpp\"\n"
  },
  {
    "path": "ext/detours/src/disolia64.cpp",
    "content": "#define DETOURS_IA64_OFFLINE_LIBRARY\n#include \"disasm.cpp\"\n"
  },
  {
    "path": "ext/detours/src/disolx64.cpp",
    "content": "#define DETOURS_X64_OFFLINE_LIBRARY\n#include \"disasm.cpp\"\n"
  },
  {
    "path": "ext/detours/src/disolx86.cpp",
    "content": "#define DETOURS_X86_OFFLINE_LIBRARY\n#include \"disasm.cpp\"\n"
  },
  {
    "path": "ext/detours/src/image.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Image manipulation functions (image.cpp of detours.lib)\n//\n//  Microsoft Research Detours Package, Version 4.0.1\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n//  Used for for payloads, byways, and imports.\n//\n\n#if _MSC_VER < 1299\n#pragma warning(disable: 4710)\n#endif\n\n// #define DETOUR_DEBUG 1\n#define DETOURS_INTERNAL\n#include \"detours.h\"\n\n#if DETOURS_VERSION != 0x4c0c1   // 0xMAJORcMINORcPATCH\n#error detours.h version mismatch\n#endif\n\nnamespace Detour\n{\n//////////////////////////////////////////////////////////////////////////////\n//\n#ifndef _STRSAFE_H_INCLUDED_\n_Must_inspect_result_\nstatic inline HRESULT StringCchLengthA(\n    _In_reads_or_z_(cchMax) LPCSTR psz,\n    _In_\n    _In_range_(1, STRSAFE_MAX_CCH) size_t cchMax,\n    _Out_opt_\n    _Deref_out_range_(<, cchMax)\n    _Deref_out_range_(<=, _String_length_(psz))\n    _Out_ size_t* pcch)\n{\n    HRESULT hr = S_OK;\n    size_t cchMaxPrev = cchMax;\n\n    if (cchMax > 2147483647) {\n        return ERROR_INVALID_PARAMETER;\n    }\n\n    while (cchMax && (*psz != '\\0')) {\n        psz++;\n        cchMax--;\n    }\n\n    if (cchMax == 0) {\n        // the string is longer than cchMax\n        hr = ERROR_INVALID_PARAMETER;\n    }\n\n    if (SUCCEEDED(hr) && pcch) {\n        *pcch = cchMaxPrev - cchMax;\n    }\n\n    return hr;\n}\n\n_Must_inspect_result_\nstatic inline HRESULT StringCchCopyA(\n    _Out_writes_(cchDest) _Always_(_Post_z_) LPSTR pszDest,\n    _In_ size_t cchDest,\n    _In_ LPCSTR pszSrc)\n{\n    HRESULT hr = S_OK;\n\n    if (cchDest == 0) {\n        // can not null terminate a zero-byte dest buffer\n        hr = ERROR_INVALID_PARAMETER;\n    }\n    else {\n        while (cchDest && (*pszSrc != '\\0')) {\n            *pszDest++ = *pszSrc++;\n            cchDest--;\n        }\n\n        if (cchDest == 0) {\n            // we are going to truncate pszDest\n            pszDest--;\n            hr = ERROR_INVALID_PARAMETER;\n        }\n\n        *pszDest= '\\0';\n    }\n\n    return hr;\n}\n\n_Must_inspect_result_\nstatic inline HRESULT StringCchCatA(\n    _Out_writes_(cchDest) _Always_(_Post_z_) LPSTR pszDest,\n    _In_ size_t cchDest,\n    _In_ LPCSTR pszSrc)\n{\n    HRESULT hr;\n    size_t cchDestCurrent;\n\n    if (cchDest > 2147483647){\n        return ERROR_INVALID_PARAMETER;\n    }\n\n    hr = StringCchLengthA(pszDest, cchDest, &cchDestCurrent);\n\n    if (SUCCEEDED(hr) && cchDestCurrent < cchDest) {\n        hr = StringCchCopyA(pszDest + cchDestCurrent,\n                            cchDest - cchDestCurrent,\n                            pszSrc);\n    }\n\n    return hr;\n}\n\n#endif\n\n///////////////////////////////////////////////////////////////////////////////\n//\nclass CImageData\n{\n    friend class CImage;\n\npublic:\n    CImageData(PBYTE pbData, DWORD cbData);\n    ~CImageData();\n\n    PBYTE                   Enumerate(GUID *pGuid, DWORD *pcbData, DWORD *pnIterator);\n    PBYTE                   Find(REFGUID rguid, DWORD *pcbData);\n    PBYTE                   Set(REFGUID rguid, PBYTE pbData, DWORD cbData);\n\n    BOOL                    Delete(REFGUID rguid);\n    BOOL                    Purge();\n\n    BOOL                    IsEmpty()           { return m_cbData == 0; }\n    BOOL                    IsValid();\n\nprotected:\n    BOOL                    SizeTo(DWORD cbData);\n\nprotected:\n    _Field_size_(m_cbAlloc)\n    PBYTE                   m_pbData;\n    DWORD                   m_cbData;\n    DWORD                   m_cbAlloc;\n};\n\nclass CImageImportName;\n\nclass CImageImportFile\n{\n    friend class CImage;\n    friend class CImageImportName;\n\npublic:\n    CImageImportFile();\n    ~CImageImportFile();\n\npublic:\n    CImageImportFile *      m_pNextFile;\n    BOOL                    m_fByway;\n\n    _Field_size_(m_nImportNames)\n    CImageImportName *      m_pImportNames;\n    DWORD                   m_nImportNames;\n\n    DWORD                   m_rvaOriginalFirstThunk;\n    DWORD                   m_rvaFirstThunk;\n\n    DWORD                   m_nForwarderChain;\n    LPCSTR                  m_pszOrig;\n    LPCSTR                  m_pszName;\n};\n\nclass CImageImportName\n{\n    friend class CImage;\n    friend class CImageImportFile;\n\npublic:\n    CImageImportName();\n    ~CImageImportName();\n\npublic:\n    WORD        m_nHint;\n    ULONG       m_nOrig;\n    ULONG       m_nOrdinal;\n    LPCSTR      m_pszOrig;\n    LPCSTR      m_pszName;\n};\n\nclass CImage\n{\n    friend class CImageThunks;\n    friend class CImageChars;\n    friend class CImageImportFile;\n    friend class CImageImportName;\n\npublic:\n    CImage();\n    ~CImage();\n\n    static CImage *         IsValid(PDETOUR_BINARY pBinary);\n\npublic:                                                 // File Functions\n    BOOL                    Read(HANDLE hFile);\n    BOOL                    Write(HANDLE hFile);\n    BOOL                    Close();\n\npublic:                                                 // Manipulation Functions\n    PBYTE                   DataEnum(GUID *pGuid, DWORD *pcbData, DWORD *pnIterator);\n    PBYTE                   DataFind(REFGUID rguid, DWORD *pcbData);\n    PBYTE                   DataSet(REFGUID rguid, PBYTE pbData, DWORD cbData);\n    BOOL                    DataDelete(REFGUID rguid);\n    BOOL                    DataPurge();\n\n    BOOL                    EditImports(PVOID pContext,\n                                        PF_DETOUR_BINARY_BYWAY_CALLBACK pfBywayCallback,\n                                        PF_DETOUR_BINARY_FILE_CALLBACK pfFileCallback,\n                                        PF_DETOUR_BINARY_SYMBOL_CALLBACK pfSymbolCallback,\n                                        PF_DETOUR_BINARY_COMMIT_CALLBACK pfCommitCallback);\n\nprotected:\n    BOOL                    WriteFile(HANDLE hFile,\n                                      LPCVOID lpBuffer,\n                                      DWORD nNumberOfBytesToWrite,\n                                      LPDWORD lpNumberOfBytesWritten);\n    BOOL                    CopyFileData(HANDLE hFile, DWORD nOldPos, DWORD cbData);\n    BOOL                    ZeroFileData(HANDLE hFile, DWORD cbData);\n    BOOL                    AlignFileData(HANDLE hFile);\n\n    BOOL                    SizeOutputBuffer(DWORD cbData);\n    PBYTE                   AllocateOutput(DWORD cbData, DWORD *pnVirtAddr);\n\n    PVOID                   RvaToVa(ULONG_PTR nRva);\n    DWORD                   RvaToFileOffset(DWORD nRva);\n\n    DWORD                   FileAlign(DWORD nAddr);\n    DWORD                   SectionAlign(DWORD nAddr);\n\n    BOOL                    CheckImportsNeeded(DWORD *pnTables,\n                                               DWORD *pnThunks,\n                                               DWORD *pnChars);\n\n    CImageImportFile *      NewByway(_In_ LPCSTR pszName);\n\nprivate:\n    DWORD                   m_dwValidSignature;\n    CImageData *            m_pImageData;               // Read & Write\n\n    HANDLE                  m_hMap;                     // Read & Write\n    PBYTE                   m_pMap;                     // Read & Write\n\n    DWORD                   m_nNextFileAddr;            // Write\n    DWORD                   m_nNextVirtAddr;            // Write\n\n    IMAGE_DOS_HEADER        m_DosHeader;                // Read & Write\n    IMAGE_NT_HEADERS        m_NtHeader;                 // Read & Write\n    IMAGE_SECTION_HEADER    m_SectionHeaders[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];\n\n    DWORD                   m_nPrePE;\n    DWORD                   m_cbPrePE;\n    DWORD                   m_cbPostPE;\n\n    DWORD                   m_nPeOffset;\n    DWORD                   m_nSectionsOffset;\n    DWORD                   m_nExtraOffset;\n    DWORD                   m_nFileSize;\n\n    DWORD                   m_nOutputVirtAddr;\n    DWORD                   m_nOutputVirtSize;\n    DWORD                   m_nOutputFileAddr;\n\n    _Field_size_(m_cbOutputBuffer)\n    PBYTE                   m_pbOutputBuffer;\n    DWORD                   m_cbOutputBuffer;\n\n    CImageImportFile *      m_pImportFiles;\n    DWORD                   m_nImportFiles;\n\n    BOOL                    m_fHadDetourSection;\n\nprivate:\n    enum {\n        DETOUR_IMAGE_VALID_SIGNATURE = 0xfedcba01,      // \"Dtr\\0\"\n    };\n};\n\n//////////////////////////////////////////////////////////////////////////////\n//\nstatic BYTE s_rbDosCode[0x10] = {\n    0x0E,0x1F,0xBA,0x0E,0x00,0xB4,0x09,0xCD,\n    0x21,0xB8,0x01,0x4C,0xCD,0x21,'*','*'\n};\n\nstatic inline DWORD Max(DWORD a, DWORD b)\n{\n    return a > b ? a : b;\n}\n\nstatic inline DWORD Align(DWORD a, DWORD size)\n{\n    size--;\n    return (a + size) & ~size;\n}\n\nstatic inline DWORD QuadAlign(DWORD a)\n{\n    return Align(a, 8);\n}\n\nstatic LPCSTR DuplicateString(_In_ LPCSTR pszIn)\n{\n    if (pszIn == NULL) {\n        return NULL;\n    }\n\n    size_t cch;\n    HRESULT hr = StringCchLengthA(pszIn, 8192, &cch);\n    if (FAILED(hr)) {\n        SetLastError(ERROR_INVALID_PARAMETER);\n        return NULL;\n    }\n\n    PCHAR pszOut = new NOTHROW CHAR [cch + 1];\n    if (pszOut == NULL) {\n        SetLastError(ERROR_OUTOFMEMORY);\n        return NULL;\n    }\n\n    hr = StringCchCopyA(pszOut, cch + 1, pszIn);\n    if (FAILED(hr)) {\n        delete[] pszOut;\n        return NULL;\n    }\n\n    return pszOut;\n}\n\nstatic VOID ReleaseString(_In_opt_ LPCSTR psz)\n{\n    if (psz != NULL) {\n        delete[] psz;\n    }\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nCImageImportFile::CImageImportFile()\n{\n    m_pNextFile = NULL;\n    m_fByway = FALSE;\n\n    m_pImportNames = NULL;\n    m_nImportNames = 0;\n\n    m_rvaOriginalFirstThunk = 0;\n    m_rvaFirstThunk = 0;\n\n    m_nForwarderChain = (UINT)0;\n    m_pszName = NULL;\n    m_pszOrig = NULL;\n}\n\nCImageImportFile::~CImageImportFile()\n{\n    if (m_pNextFile) {\n        delete m_pNextFile;\n        m_pNextFile = NULL;\n    }\n    if (m_pImportNames) {\n        delete[] m_pImportNames;\n        m_pImportNames = NULL;\n        m_nImportNames = 0;\n    }\n    if (m_pszName) {\n        delete[] m_pszName;\n        m_pszName = NULL;\n    }\n    if (m_pszOrig) {\n        delete[] m_pszOrig;\n        m_pszOrig = NULL;\n    }\n}\n\nCImageImportName::CImageImportName()\n{\n    m_nOrig = 0;\n    m_nOrdinal = 0;\n    m_nHint = 0;\n    m_pszName = NULL;\n    m_pszOrig = NULL;\n}\n\nCImageImportName::~CImageImportName()\n{\n    if (m_pszName) {\n        delete[] m_pszName;\n        m_pszName = NULL;\n    }\n    if (m_pszOrig) {\n        delete[] m_pszOrig;\n        m_pszOrig = NULL;\n    }\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nCImageData::CImageData(PBYTE pbData, DWORD cbData)\n{\n    m_pbData = pbData;\n    m_cbData = cbData;\n    m_cbAlloc = 0;\n}\n\nCImageData::~CImageData()\n{\n    IsValid();\n\n    if (m_cbAlloc == 0) {\n        m_pbData = NULL;\n    }\n    if (m_pbData) {\n        delete[] m_pbData;\n        m_pbData = NULL;\n    }\n    m_cbData = 0;\n    m_cbAlloc = 0;\n}\n\nBOOL CImageData::SizeTo(DWORD cbData)\n{\n    IsValid();\n\n    if (cbData <= m_cbAlloc) {\n        return TRUE;\n    }\n\n    PBYTE pbNew = new NOTHROW BYTE [cbData];\n    if (pbNew == NULL) {\n        SetLastError(ERROR_OUTOFMEMORY);\n        return FALSE;\n    }\n\n    if (m_pbData) {\n        CopyMemory(pbNew, m_pbData, m_cbData);\n        if (m_cbAlloc > 0) {\n            delete[] m_pbData;\n        }\n        m_pbData = NULL;\n    }\n    m_pbData = pbNew;\n    m_cbAlloc = cbData;\n\n    IsValid();\n\n    return TRUE;\n}\n\nBOOL CImageData::Purge()\n{\n    m_cbData = 0;\n\n    IsValid();\n\n    return TRUE;\n}\n\nBOOL CImageData::IsValid()\n{\n    if (m_pbData == NULL) {\n        return TRUE;\n    }\n\n    PBYTE pbBeg = m_pbData;\n    PBYTE pbEnd = m_pbData + m_cbData;\n\n    for (PBYTE pbIter = pbBeg; pbIter < pbEnd;) {\n        PDETOUR_SECTION_RECORD pRecord = (PDETOUR_SECTION_RECORD)pbIter;\n\n        if (pRecord->cbBytes < sizeof(DETOUR_SECTION_RECORD)) {\n            return FALSE;\n        }\n        if (pRecord->nReserved != 0) {\n            return FALSE;\n        }\n\n        pbIter += pRecord->cbBytes;\n    }\n    return TRUE;\n}\n\nPBYTE CImageData::Enumerate(GUID *pGuid, DWORD *pcbData, DWORD *pnIterator)\n{\n    IsValid();\n\n    if (pnIterator == NULL ||\n        m_cbData < *pnIterator + sizeof(DETOUR_SECTION_RECORD)) {\n\n        if (pcbData) {\n            *pcbData = 0;\n        }\n        if (pGuid) {\n            ZeroMemory(pGuid, sizeof(*pGuid));\n        }\n        return NULL;\n    }\n\n    PDETOUR_SECTION_RECORD pRecord = (PDETOUR_SECTION_RECORD)(m_pbData + *pnIterator);\n\n    if (pGuid) {\n        *pGuid = pRecord->guid;\n    }\n    if (pcbData) {\n        *pcbData = pRecord->cbBytes - sizeof(DETOUR_SECTION_RECORD);\n    }\n    *pnIterator = (LONG)(((PBYTE)pRecord - m_pbData) + pRecord->cbBytes);\n\n    return (PBYTE)(pRecord + 1);\n}\n\nPBYTE CImageData::Find(REFGUID rguid, DWORD *pcbData)\n{\n    IsValid();\n\n    DWORD cbBytes = sizeof(DETOUR_SECTION_RECORD);\n    for (DWORD nOffset = 0; nOffset < m_cbData; nOffset += cbBytes) {\n        PDETOUR_SECTION_RECORD pRecord = (PDETOUR_SECTION_RECORD)(m_pbData + nOffset);\n\n        cbBytes = pRecord->cbBytes;\n        if (cbBytes > m_cbData) {\n            break;\n        }\n        if (cbBytes < sizeof(DETOUR_SECTION_RECORD)) {\n            continue;\n        }\n\n        if (pRecord->guid.Data1 == rguid.Data1 &&\n            pRecord->guid.Data2 == rguid.Data2 &&\n            pRecord->guid.Data3 == rguid.Data3 &&\n            pRecord->guid.Data4[0] == rguid.Data4[0] &&\n            pRecord->guid.Data4[1] == rguid.Data4[1] &&\n            pRecord->guid.Data4[2] == rguid.Data4[2] &&\n            pRecord->guid.Data4[3] == rguid.Data4[3] &&\n            pRecord->guid.Data4[4] == rguid.Data4[4] &&\n            pRecord->guid.Data4[5] == rguid.Data4[5] &&\n            pRecord->guid.Data4[6] == rguid.Data4[6] &&\n            pRecord->guid.Data4[7] == rguid.Data4[7]) {\n\n            *pcbData = cbBytes - sizeof(DETOUR_SECTION_RECORD);\n            return (PBYTE)(pRecord + 1);\n        }\n    }\n\n    if (pcbData) {\n        *pcbData = 0;\n    }\n    return NULL;\n}\n\nBOOL CImageData::Delete(REFGUID rguid)\n{\n    IsValid();\n\n    PBYTE pbFound = NULL;\n    DWORD cbFound = 0;\n\n    pbFound = Find(rguid, &cbFound);\n    if (pbFound == NULL) {\n        SetLastError(ERROR_MOD_NOT_FOUND);\n        return FALSE;\n    }\n\n    pbFound -= sizeof(DETOUR_SECTION_RECORD);\n    cbFound += sizeof(DETOUR_SECTION_RECORD);\n\n    PBYTE pbRestData = pbFound + cbFound;\n    DWORD cbRestData = m_cbData - (LONG)(pbRestData - m_pbData);\n\n    if (cbRestData) {\n        MoveMemory(pbFound, pbRestData, cbRestData);\n    }\n    m_cbData -= cbFound;\n\n    IsValid();\n    return TRUE;\n}\n\nPBYTE CImageData::Set(REFGUID rguid, PBYTE pbData, DWORD cbData)\n{\n    IsValid();\n    Delete(rguid);\n\n    DWORD cbAlloc = QuadAlign(cbData);\n\n    if (!SizeTo(m_cbData + cbAlloc + sizeof(DETOUR_SECTION_RECORD))) {\n        return NULL;\n    }\n\n    PDETOUR_SECTION_RECORD pRecord = (PDETOUR_SECTION_RECORD)(m_pbData + m_cbData);\n    pRecord->cbBytes = cbAlloc + sizeof(DETOUR_SECTION_RECORD);\n    pRecord->nReserved = 0;\n    pRecord->guid = rguid;\n\n    PBYTE pbDest = (PBYTE)(pRecord + 1);\n    if (pbData) {\n        CopyMemory(pbDest, pbData, cbData);\n        if (cbData < cbAlloc) {\n            ZeroMemory(pbDest + cbData, cbAlloc - cbData);\n        }\n    }\n    else {\n        if (cbAlloc > 0) {\n            ZeroMemory(pbDest, cbAlloc);\n        }\n    }\n\n    m_cbData += cbAlloc + sizeof(DETOUR_SECTION_RECORD);\n\n    IsValid();\n    return pbDest;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nclass CImageThunks\n{\nprivate:\n    CImage *            m_pImage;\n    PIMAGE_THUNK_DATA   m_pThunks;\n    DWORD               m_nThunks;\n    DWORD               m_nThunksMax;\n    DWORD               m_nThunkVirtAddr;\n\npublic:\n    CImageThunks(CImage *pImage, DWORD nThunksMax, DWORD *pnAddr)\n    {\n        m_pImage = pImage;\n        m_nThunks = 0;\n        m_nThunksMax = nThunksMax;\n        m_pThunks = (PIMAGE_THUNK_DATA)\n            m_pImage->AllocateOutput(sizeof(IMAGE_THUNK_DATA) * nThunksMax,\n                                     &m_nThunkVirtAddr);\n        *pnAddr = m_nThunkVirtAddr;\n    }\n\n    PIMAGE_THUNK_DATA Current(DWORD *pnVirtAddr)\n    {\n        if (m_nThunksMax > 1) {\n            *pnVirtAddr = m_nThunkVirtAddr;\n            return m_pThunks;\n        }\n        *pnVirtAddr = 0;\n        return NULL;\n    }\n\n    PIMAGE_THUNK_DATA Allocate(ULONG_PTR nData, DWORD *pnVirtAddr)\n    {\n        if (m_nThunks < m_nThunksMax) {\n            *pnVirtAddr = m_nThunkVirtAddr;\n\n            m_nThunks++;\n            m_nThunkVirtAddr += sizeof(IMAGE_THUNK_DATA);\n            m_pThunks->u1.Ordinal = nData;\n            return m_pThunks++;\n        }\n        *pnVirtAddr = 0;\n        return NULL;\n    }\n\n    DWORD   Size()\n    {\n        return m_nThunksMax * sizeof(IMAGE_THUNK_DATA);\n    }\n};\n\n//////////////////////////////////////////////////////////////////////////////\n//\nclass CImageChars\n{\nprivate:\n    CImage *        m_pImage;\n    PCHAR           m_pChars;\n    DWORD           m_nChars;\n    DWORD           m_nCharsMax;\n    DWORD           m_nCharVirtAddr;\n\npublic:\n    CImageChars(CImage *pImage, _In_ DWORD nCharsMax, _Out_ DWORD *pnAddr)\n    {\n        m_pImage = pImage;\n        m_nChars = 0;\n        m_nCharsMax = nCharsMax;\n        m_pChars = (PCHAR)m_pImage->AllocateOutput(nCharsMax, &m_nCharVirtAddr);\n        *pnAddr = m_nCharVirtAddr;\n    }\n\n    LPCSTR Allocate(_In_ LPCSTR pszString, _Out_ DWORD *pnVirtAddr)\n    {\n        DWORD nLen = (DWORD)strlen(pszString) + 1;\n        nLen += (nLen & 1);\n\n        if (m_nChars + nLen > m_nCharsMax) {\n            *pnVirtAddr = 0;\n            return NULL;\n        }\n\n        *pnVirtAddr = m_nCharVirtAddr;\n        HRESULT hrRet = StringCchCopyA(m_pChars, m_nCharsMax, pszString);\n\n        if (FAILED(hrRet)) {\n            return NULL;\n        }\n\n        pszString = m_pChars;\n\n        m_pChars += nLen;\n        m_nChars += nLen;\n        m_nCharVirtAddr += nLen;\n\n        return pszString;\n    }\n\n    LPCSTR Allocate(_In_ LPCSTR pszString, _In_ DWORD nHint, _Out_ DWORD *pnVirtAddr)\n    {\n        DWORD nLen = (DWORD)strlen(pszString) + 1 + sizeof(USHORT);\n        nLen += (nLen & 1);\n\n        if (m_nChars + nLen > m_nCharsMax) {\n            *pnVirtAddr = 0;\n            return NULL;\n        }\n\n        *pnVirtAddr = m_nCharVirtAddr;\n        *(USHORT *)m_pChars = (USHORT)nHint;\n\n        HRESULT hrRet = StringCchCopyA(m_pChars + sizeof(USHORT), m_nCharsMax, pszString);\n        if (FAILED(hrRet)) {\n            return NULL;\n        }\n\n        pszString = m_pChars + sizeof(USHORT);\n\n        m_pChars += nLen;\n        m_nChars += nLen;\n        m_nCharVirtAddr += nLen;\n\n        return pszString;\n    }\n\n    DWORD Size()\n    {\n        return m_nChars;\n    }\n};\n\n//////////////////////////////////////////////////////////////////////////////\n//\nCImage * CImage::IsValid(PDETOUR_BINARY pBinary)\n{\n    if (pBinary) {\n        CImage *pImage = (CImage *)pBinary;\n\n        if (pImage->m_dwValidSignature == DETOUR_IMAGE_VALID_SIGNATURE) {\n            return pImage;\n        }\n    }\n    SetLastError(ERROR_INVALID_HANDLE);\n    return NULL;\n}\n\nCImage::CImage()\n{\n    m_dwValidSignature = (DWORD)DETOUR_IMAGE_VALID_SIGNATURE;\n\n    m_hMap = NULL;\n    m_pMap = NULL;\n\n    m_nPeOffset = 0;\n    m_nSectionsOffset = 0;\n\n    m_pbOutputBuffer = NULL;\n    m_cbOutputBuffer = 0;\n\n    m_pImageData = NULL;\n\n    m_pImportFiles = NULL;\n    m_nImportFiles = 0;\n\n    m_fHadDetourSection = FALSE;\n}\n\nCImage::~CImage()\n{\n    Close();\n    m_dwValidSignature = 0;\n}\n\nBOOL CImage::Close()\n{\n    if (m_pImportFiles) {\n        delete m_pImportFiles;\n        m_pImportFiles = NULL;\n        m_nImportFiles = 0;\n    }\n\n    if (m_pImageData) {\n        delete m_pImageData;\n        m_pImageData = NULL;\n    }\n\n    if (m_pMap != NULL) {\n        UnmapViewOfFile(m_pMap);\n        m_pMap = NULL;\n    }\n\n    if (m_hMap) {\n        CloseHandle(m_hMap);\n        m_hMap = NULL;\n    }\n\n    if (m_pbOutputBuffer) {\n        delete[] m_pbOutputBuffer;\n        m_pbOutputBuffer = NULL;\n        m_cbOutputBuffer = 0;\n    }\n    return TRUE;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nPBYTE CImage::DataEnum(GUID *pGuid, DWORD *pcbData, DWORD *pnIterator)\n{\n    if (m_pImageData == NULL) {\n        return NULL;\n    }\n    return m_pImageData->Enumerate(pGuid, pcbData, pnIterator);\n}\n\nPBYTE CImage::DataFind(REFGUID rguid, DWORD *pcbData)\n{\n    if (m_pImageData == NULL) {\n        return NULL;\n    }\n    return m_pImageData->Find(rguid, pcbData);\n}\n\nPBYTE CImage::DataSet(REFGUID rguid, PBYTE pbData, DWORD cbData)\n{\n    if (m_pImageData == NULL) {\n        return NULL;\n    }\n    return m_pImageData->Set(rguid, pbData, cbData);\n}\n\nBOOL CImage::DataDelete(REFGUID rguid)\n{\n    if (m_pImageData == NULL) {\n        return FALSE;\n    }\n    return m_pImageData->Delete(rguid);\n}\n\nBOOL CImage::DataPurge()\n{\n    if (m_pImageData == NULL) {\n        return TRUE;\n    }\n    return m_pImageData->Purge();\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nBOOL CImage::SizeOutputBuffer(DWORD cbData)\n{\n    if (m_cbOutputBuffer < cbData) {\n        if (cbData < 1024) {//65536\n            cbData = 1024;\n        }\n        cbData = FileAlign(cbData);\n\n        PBYTE pOutput = new NOTHROW BYTE [cbData];\n        if (pOutput == NULL) {\n            SetLastError(ERROR_OUTOFMEMORY);\n            return FALSE;\n        }\n\n        if (m_pbOutputBuffer) {\n            CopyMemory(pOutput, m_pbOutputBuffer, m_cbOutputBuffer);\n\n            delete[] m_pbOutputBuffer;\n            m_pbOutputBuffer = NULL;\n        }\n\n        ZeroMemory(pOutput + m_cbOutputBuffer, cbData - m_cbOutputBuffer),\n\n        m_pbOutputBuffer = pOutput;\n        m_cbOutputBuffer = cbData;\n    }\n    return TRUE;\n}\n\nPBYTE CImage::AllocateOutput(DWORD cbData, DWORD *pnVirtAddr)\n{\n    cbData = QuadAlign(cbData);\n\n    PBYTE pbData = m_pbOutputBuffer + m_nOutputVirtSize;\n\n    *pnVirtAddr = m_nOutputVirtAddr + m_nOutputVirtSize;\n    m_nOutputVirtSize += cbData;\n\n    if (m_nOutputVirtSize > m_cbOutputBuffer) {\n        SetLastError(ERROR_OUTOFMEMORY);\n        return NULL;\n    }\n\n    ZeroMemory(pbData, cbData);\n\n    return pbData;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nDWORD CImage::FileAlign(DWORD nAddr)\n{\n    return Align(nAddr, m_NtHeader.OptionalHeader.FileAlignment);\n}\n\nDWORD CImage::SectionAlign(DWORD nAddr)\n{\n    return Align(nAddr, m_NtHeader.OptionalHeader.SectionAlignment);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nPVOID CImage::RvaToVa(ULONG_PTR nRva)\n{\n    if (nRva == 0) {\n        return NULL;\n    }\n\n    for (DWORD n = 0; n < m_NtHeader.FileHeader.NumberOfSections; n++) {\n        DWORD vaStart = m_SectionHeaders[n].VirtualAddress;\n        DWORD vaEnd = vaStart + m_SectionHeaders[n].SizeOfRawData;\n\n        if (nRva >= vaStart && nRva < vaEnd) {\n            return (PBYTE)m_pMap\n                + m_SectionHeaders[n].PointerToRawData\n                + nRva - m_SectionHeaders[n].VirtualAddress;\n        }\n    }\n    return NULL;\n}\n\nDWORD CImage::RvaToFileOffset(DWORD nRva)\n{\n    DWORD n;\n    for (n = 0; n < m_NtHeader.FileHeader.NumberOfSections; n++) {\n        DWORD vaStart = m_SectionHeaders[n].VirtualAddress;\n        DWORD vaEnd = vaStart + m_SectionHeaders[n].SizeOfRawData;\n\n        if (nRva >= vaStart && nRva < vaEnd) {\n            return m_SectionHeaders[n].PointerToRawData\n                + nRva - m_SectionHeaders[n].VirtualAddress;\n        }\n    }\n    return 0;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nBOOL CImage::WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite,\n                       LPDWORD lpNumberOfBytesWritten)\n{\n    return ::WriteFile(hFile,\n                       lpBuffer,\n                       nNumberOfBytesToWrite,\n                       lpNumberOfBytesWritten,\n                       NULL);\n}\n\n\nBOOL CImage::CopyFileData(HANDLE hFile, DWORD nOldPos, DWORD cbData)\n{\n    DWORD cbDone = 0;\n    return WriteFile(hFile, m_pMap + nOldPos, cbData, &cbDone);\n}\n\nBOOL CImage::ZeroFileData(HANDLE hFile, DWORD cbData)\n{\n    if (!SizeOutputBuffer(4096)) {\n        return FALSE;\n    }\n\n    ZeroMemory(m_pbOutputBuffer, 4096);\n\n    for (DWORD cbLeft = cbData; cbLeft > 0;) {\n        DWORD cbStep = cbLeft > sizeof(m_pbOutputBuffer)\n            ? sizeof(m_pbOutputBuffer) : cbLeft;\n        DWORD cbDone = 0;\n\n        if (!WriteFile(hFile, m_pbOutputBuffer, cbStep, &cbDone)) {\n            return FALSE;\n        }\n        if (cbDone == 0) {\n            break;\n        }\n\n        cbLeft -= cbDone;\n    }\n    return TRUE;\n}\n\nBOOL CImage::AlignFileData(HANDLE hFile)\n{\n    DWORD nLastFileAddr = m_nNextFileAddr;\n\n    m_nNextFileAddr = FileAlign(m_nNextFileAddr);\n    m_nNextVirtAddr = SectionAlign(m_nNextVirtAddr);\n\n    if (hFile != INVALID_HANDLE_VALUE) {\n        if (m_nNextFileAddr > nLastFileAddr) {\n            if (SetFilePointer(hFile, nLastFileAddr, NULL, FILE_BEGIN) == ~0u) {\n                return FALSE;\n            }\n            return ZeroFileData(hFile, m_nNextFileAddr - nLastFileAddr);\n        }\n    }\n    return TRUE;\n}\n\nBOOL CImage::Read(HANDLE hFile)\n{\n    DWORD n;\n    PBYTE pbData = NULL;\n    DWORD cbData = 0;\n\n    if (hFile == INVALID_HANDLE_VALUE) {\n        SetLastError(ERROR_INVALID_HANDLE);\n        return FALSE;\n    }\n\n    ///////////////////////////////////////////////////////// Create mapping.\n    //\n    m_nFileSize = GetFileSize(hFile, NULL);\n    if (m_nFileSize == (DWORD)-1) {\n        return FALSE;\n    }\n\n    m_hMap = CreateFileMappingW(hFile, NULL, PAGE_READONLY, 0, 0, NULL);\n    if (m_hMap == NULL) {\n        return FALSE;\n    }\n\n    m_pMap = (PBYTE)MapViewOfFileEx(m_hMap, FILE_MAP_READ, 0, 0, 0, NULL);\n    if (m_pMap == NULL) {\n        return FALSE;\n    }\n\n    ////////////////////////////////////////////////////// Process DOS Header.\n    //\n    PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)m_pMap;\n    if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) {\n        SetLastError(ERROR_BAD_EXE_FORMAT);\n        return FALSE;\n    }\n    m_nPeOffset = pDosHeader->e_lfanew;\n    m_nPrePE = 0;\n    m_cbPrePE = QuadAlign(pDosHeader->e_lfanew);\n\n    if (m_nPeOffset > m_nFileSize ||\n        m_nPeOffset + sizeof(m_NtHeader) > m_nFileSize) {\n\n        SetLastError(ERROR_BAD_EXE_FORMAT);\n        return FALSE;\n    }\n\n    CopyMemory(&m_DosHeader, m_pMap + m_nPrePE, sizeof(m_DosHeader));\n\n    /////////////////////////////////////////////////////// Process PE Header.\n    //\n    CopyMemory(&m_NtHeader, m_pMap + m_nPeOffset, sizeof(m_NtHeader));\n    if (m_NtHeader.Signature != IMAGE_NT_SIGNATURE) {\n        SetLastError(ERROR_INVALID_EXE_SIGNATURE);\n        return FALSE;\n    }\n    if (m_NtHeader.FileHeader.SizeOfOptionalHeader == 0) {\n        SetLastError(ERROR_EXE_MARKED_INVALID);\n        return FALSE;\n    }\n    m_nSectionsOffset = m_nPeOffset\n        + sizeof(m_NtHeader.Signature)\n        + sizeof(m_NtHeader.FileHeader)\n        + m_NtHeader.FileHeader.SizeOfOptionalHeader;\n\n    ///////////////////////////////////////////////// Process Section Headers.\n    //\n    if (m_NtHeader.FileHeader.NumberOfSections > ARRAYSIZE(m_SectionHeaders)) {\n        SetLastError(ERROR_EXE_MARKED_INVALID);\n        return FALSE;\n    }\n    CopyMemory(&m_SectionHeaders,\n               m_pMap + m_nSectionsOffset,\n               sizeof(m_SectionHeaders[0]) * m_NtHeader.FileHeader.NumberOfSections);\n\n    /////////////////////////////////////////////////// Parse .detour Section.\n    //\n    DWORD rvaOriginalImageDirectory = 0;\n    DWORD rvaDetourBeg = 0;\n    DWORD rvaDetourEnd = 0;\n\n    _Analysis_assume_(m_NtHeader.FileHeader.NumberOfSections <= ARRAYSIZE(m_SectionHeaders));\n\n    for (n = 0; n < m_NtHeader.FileHeader.NumberOfSections; n++) {\n        if (strcmp((PCHAR)m_SectionHeaders[n].Name, \".detour\") == 0) {\n            DETOUR_SECTION_HEADER dh;\n            CopyMemory(&dh,\n                       m_pMap + m_SectionHeaders[n].PointerToRawData,\n                       sizeof(dh));\n\n            rvaOriginalImageDirectory = dh.nOriginalImportVirtualAddress;\n            if (dh.cbPrePE != 0) {\n                m_nPrePE = m_SectionHeaders[n].PointerToRawData + sizeof(dh);\n                m_cbPrePE = dh.cbPrePE;\n            }\n            rvaDetourBeg = m_SectionHeaders[n].VirtualAddress;\n            rvaDetourEnd = rvaDetourBeg + m_SectionHeaders[n].SizeOfRawData;\n        }\n    }\n\n    //////////////////////////////////////////////////////// Get Import Table.\n    //\n    DWORD rvaImageDirectory = m_NtHeader.OptionalHeader\n        .DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;\n    PIMAGE_IMPORT_DESCRIPTOR iidp\n        = (PIMAGE_IMPORT_DESCRIPTOR)RvaToVa(rvaImageDirectory);\n    PIMAGE_IMPORT_DESCRIPTOR oidp\n        = (PIMAGE_IMPORT_DESCRIPTOR)RvaToVa(rvaOriginalImageDirectory);\n\n    if (oidp == NULL) {\n        oidp = iidp;\n    }\n    if (iidp == NULL || oidp == NULL) {\n        SetLastError(ERROR_EXE_MARKED_INVALID);\n        return FALSE;\n    }\n\n    DWORD nFiles = 0;\n    for (; iidp[nFiles].OriginalFirstThunk != 0 || iidp[nFiles].FirstThunk != 0; nFiles++) {\n    }\n\n    CImageImportFile **ppLastFile = &m_pImportFiles;\n    m_pImportFiles = NULL;\n\n    for (n = 0; n < nFiles; n++, iidp++) {\n        ULONG_PTR rvaName = iidp->Name;\n        PCHAR pszName = (PCHAR)RvaToVa(rvaName);\n        if (pszName == NULL) {\n            SetLastError(ERROR_EXE_MARKED_INVALID);\n            goto fail;\n        }\n\n        CImageImportFile *pImportFile = new NOTHROW CImageImportFile;\n        if (pImportFile == NULL) {\n            SetLastError(ERROR_OUTOFMEMORY);\n            goto fail;\n        }\n\n        *ppLastFile = pImportFile;\n        ppLastFile = &pImportFile->m_pNextFile;\n        m_nImportFiles++;\n\n        pImportFile->m_pszName = DuplicateString(pszName);\n        if (pImportFile->m_pszName == NULL) {\n            goto fail;\n        }\n\n        pImportFile->m_rvaOriginalFirstThunk = iidp->OriginalFirstThunk;\n        pImportFile->m_rvaFirstThunk = iidp->FirstThunk;\n        pImportFile->m_nForwarderChain = iidp->ForwarderChain;\n        pImportFile->m_pImportNames = NULL;\n        pImportFile->m_nImportNames = 0;\n        pImportFile->m_fByway = FALSE;\n\n        if ((ULONG)iidp->FirstThunk >= rvaDetourBeg &&\n            (ULONG)iidp->FirstThunk < rvaDetourEnd) {\n\n            pImportFile->m_pszOrig = NULL;\n            pImportFile->m_fByway = TRUE;\n            continue;\n        }\n\n        rvaName = oidp->Name;\n        pszName = (PCHAR)RvaToVa(rvaName);\n        if (pszName == NULL) {\n            SetLastError(ERROR_EXE_MARKED_INVALID);\n            goto fail;\n        }\n        pImportFile->m_pszOrig = DuplicateString(pszName);\n        if (pImportFile->m_pszOrig == NULL) {\n            goto fail;\n        }\n\n        DWORD rvaThunk = iidp->OriginalFirstThunk;\n        if( !rvaThunk ) {\n            rvaThunk = iidp->FirstThunk;\n        }\n        PIMAGE_THUNK_DATA pAddrThunk = (PIMAGE_THUNK_DATA)RvaToVa(rvaThunk);\n        rvaThunk = oidp->OriginalFirstThunk;\n        if( !rvaThunk ) {\n            rvaThunk = oidp->FirstThunk;\n        }\n        PIMAGE_THUNK_DATA pLookThunk = (PIMAGE_THUNK_DATA)RvaToVa(rvaThunk);\n\n        DWORD nNames = 0;\n        if (pAddrThunk) {\n            for (; pAddrThunk[nNames].u1.Ordinal; nNames++) {\n            }\n        }\n\n        if (pAddrThunk && nNames) {\n            pImportFile->m_nImportNames = nNames;\n            pImportFile->m_pImportNames = new NOTHROW CImageImportName [nNames];\n            if (pImportFile->m_pImportNames == NULL) {\n                SetLastError(ERROR_OUTOFMEMORY);\n                goto fail;\n            }\n\n            CImageImportName *pImportName = &pImportFile->m_pImportNames[0];\n\n            for (DWORD f = 0; f < nNames; f++, pImportName++) {\n                pImportName->m_nOrig = 0;\n                pImportName->m_nOrdinal = 0;\n                pImportName->m_nHint = 0;\n                pImportName->m_pszName = NULL;\n                pImportName->m_pszOrig = NULL;\n\n                rvaName = pAddrThunk[f].u1.Ordinal;\n                if (rvaName & IMAGE_ORDINAL_FLAG) {\n                    pImportName->m_nOrig = (ULONG)IMAGE_ORDINAL(rvaName);\n                    pImportName->m_nOrdinal = pImportName->m_nOrig;\n                }\n                else {\n                    PIMAGE_IMPORT_BY_NAME pName\n                        = (PIMAGE_IMPORT_BY_NAME)RvaToVa(rvaName);\n                    if (pName) {\n                        pImportName->m_nHint = pName->Hint;\n                        pImportName->m_pszName = DuplicateString((PCHAR)pName->Name);\n                        if (pImportName->m_pszName == NULL) {\n                            goto fail;\n                        }\n                    }\n\n                    rvaName = pLookThunk[f].u1.Ordinal;\n                    if (rvaName & IMAGE_ORDINAL_FLAG) {\n                        pImportName->m_nOrig = (ULONG)IMAGE_ORDINAL(rvaName);\n                        pImportName->m_nOrdinal = (ULONG)IMAGE_ORDINAL(rvaName);\n                    }\n                    else {\n                        pName = (PIMAGE_IMPORT_BY_NAME)RvaToVa(rvaName);\n                        if (pName) {\n                            pImportName->m_pszOrig\n                                = DuplicateString((PCHAR)pName->Name);\n                            if (pImportName->m_pszOrig == NULL) {\n                                goto fail;\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        oidp++;\n    }\n\n    ////////////////////////////////////////////////////////// Parse Sections.\n    //\n    m_nExtraOffset = 0;\n    for (n = 0; n < m_NtHeader.FileHeader.NumberOfSections; n++) {\n        m_nExtraOffset = Max(m_SectionHeaders[n].PointerToRawData +\n                             m_SectionHeaders[n].SizeOfRawData,\n                             m_nExtraOffset);\n\n        if (strcmp((PCHAR)m_SectionHeaders[n].Name, \".detour\") == 0) {\n            DETOUR_SECTION_HEADER dh;\n            CopyMemory(&dh,\n                       m_pMap + m_SectionHeaders[n].PointerToRawData,\n                       sizeof(dh));\n\n            if (dh.nDataOffset == 0) {\n                dh.nDataOffset = dh.cbHeaderSize;\n            }\n\n            cbData = dh.cbDataSize - dh.nDataOffset;\n            pbData = (m_pMap +\n                      m_SectionHeaders[n].PointerToRawData +\n                      dh.nDataOffset);\n\n            m_nExtraOffset = Max(m_SectionHeaders[n].PointerToRawData +\n                                 m_SectionHeaders[n].SizeOfRawData,\n                                 m_nExtraOffset);\n\n            m_NtHeader.FileHeader.NumberOfSections--;\n\n            m_NtHeader.OptionalHeader\n                .DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress\n                = dh.nOriginalImportVirtualAddress;\n            m_NtHeader.OptionalHeader\n                .DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size\n                = dh.nOriginalImportSize;\n\n            m_NtHeader.OptionalHeader\n                .DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].VirtualAddress\n                = dh.nOriginalBoundImportVirtualAddress;\n            m_NtHeader.OptionalHeader\n                .DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Size\n                = dh.nOriginalBoundImportSize;\n\n            m_NtHeader.OptionalHeader\n                .DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress\n                = dh.nOriginalIatVirtualAddress;\n            m_NtHeader.OptionalHeader\n                .DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].Size\n                = dh.nOriginalIatSize;\n\n            m_NtHeader.OptionalHeader.CheckSum = 0;\n            m_NtHeader.OptionalHeader.SizeOfImage\n                = dh.nOriginalSizeOfImage;\n\n            m_fHadDetourSection = TRUE;\n        }\n    }\n\n    m_pImageData = new NOTHROW CImageData(pbData, cbData);\n    if (m_pImageData == NULL) {\n        SetLastError(ERROR_OUTOFMEMORY);\n    }\n    return TRUE;\n\nfail:\n    return FALSE;\n}\n\nstatic inline BOOL strneq(_In_ LPCSTR pszOne, _In_ LPCSTR pszTwo)\n{\n    if (pszOne == pszTwo) {\n        return FALSE;\n    }\n    if (!pszOne || !pszTwo) {\n        return TRUE;\n    }\n    return (strcmp(pszOne, pszTwo) != 0);\n}\n\nBOOL CImage::CheckImportsNeeded(DWORD *pnTables, DWORD *pnThunks, DWORD *pnChars)\n{\n    DWORD nTables = 0;\n    DWORD nThunks = 0;\n    DWORD nChars = 0;\n    BOOL fNeedDetourSection = FALSE;\n\n    for (CImageImportFile *pImportFile = m_pImportFiles;\n         pImportFile != NULL; pImportFile = pImportFile->m_pNextFile) {\n\n        nChars += (int)strlen(pImportFile->m_pszName) + 1;\n        nChars += nChars & 1;\n\n        if (pImportFile->m_fByway) {\n            fNeedDetourSection = TRUE;\n            nThunks++;\n        }\n        else {\n            if (!fNeedDetourSection &&\n                strneq(pImportFile->m_pszName, pImportFile->m_pszOrig)) {\n\n                fNeedDetourSection = TRUE;\n            }\n            for (DWORD n = 0; n < pImportFile->m_nImportNames; n++) {\n                CImageImportName *pImportName = &pImportFile->m_pImportNames[n];\n\n                if (!fNeedDetourSection &&\n                    strneq(pImportName->m_pszName, pImportName->m_pszOrig)) {\n\n                    fNeedDetourSection = TRUE;\n                }\n\n                if (pImportName->m_pszName) {\n                    nChars += sizeof(WORD);             // Hint\n                    nChars += (int)strlen(pImportName->m_pszName) + 1;\n                    nChars += nChars & 1;\n                }\n                nThunks++;\n            }\n        }\n        nThunks++;\n        nTables++;\n    }\n    nTables++;\n\n    *pnTables = nTables;\n    *pnThunks = nThunks;\n    *pnChars = nChars;\n\n    return fNeedDetourSection;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nCImageImportFile * CImage::NewByway(_In_ LPCSTR pszName)\n{\n    CImageImportFile *pImportFile = new NOTHROW CImageImportFile;\n    if (pImportFile == NULL) {\n        SetLastError(ERROR_OUTOFMEMORY);\n        goto fail;\n    }\n\n    pImportFile->m_pNextFile = NULL;\n    pImportFile->m_fByway = TRUE;\n\n    pImportFile->m_pszName = DuplicateString(pszName);\n    if (pImportFile->m_pszName == NULL) {\n        goto fail;\n    }\n\n    pImportFile->m_rvaOriginalFirstThunk = 0;\n    pImportFile->m_rvaFirstThunk = 0;\n    pImportFile->m_nForwarderChain = (UINT)0;\n    pImportFile->m_pImportNames = NULL;\n    pImportFile->m_nImportNames = 0;\n\n    m_nImportFiles++;\n    return pImportFile;\n\nfail:\n    if (pImportFile) {\n        delete pImportFile;\n        pImportFile = NULL;\n    }\n    return NULL;\n}\n\nBOOL CImage::EditImports(PVOID pContext,\n                         PF_DETOUR_BINARY_BYWAY_CALLBACK pfBywayCallback,\n                         PF_DETOUR_BINARY_FILE_CALLBACK pfFileCallback,\n                         PF_DETOUR_BINARY_SYMBOL_CALLBACK pfSymbolCallback,\n                         PF_DETOUR_BINARY_COMMIT_CALLBACK pfCommitCallback)\n{\n    CImageImportFile *pImportFile = NULL;\n    CImageImportFile **ppLastFile = &m_pImportFiles;\n\n    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);\n\n    while ((pImportFile = *ppLastFile) != NULL) {\n\n        if (pfBywayCallback != NULL) {\n            LPCSTR pszFile = NULL;\n            if (!(*pfBywayCallback)(pContext, NULL, &pszFile)) {\n                goto fail;\n            }\n\n            if (pszFile != NULL) {\n                // Insert a new Byway.\n                CImageImportFile *pByway = NewByway(pszFile);\n                if (pByway == NULL) {\n                    return FALSE;\n                }\n\n                pByway->m_pNextFile = pImportFile;\n                *ppLastFile = pByway;\n                ppLastFile = &pByway->m_pNextFile;\n                continue;                               // Retry after Byway.\n            }\n        }\n\n        if (pImportFile->m_fByway) {\n            if (pfBywayCallback != NULL) {\n                LPCSTR pszFile = NULL;\n\n                if (!(*pfBywayCallback)(pContext, pImportFile->m_pszName, &pszFile)) {\n                    goto fail;\n                }\n\n                if (pszFile != NULL) {\n                    // Replace? Byway\n                    if (pszFile != pImportFile->m_pszName) {\n                        LPCSTR pszLast = pImportFile->m_pszName;\n                        pImportFile->m_pszName = DuplicateString(pszFile);\n                        ReleaseString(pszLast);\n\n                        if (pImportFile->m_pszName == NULL) {\n                            goto fail;\n                        }\n                    }\n                }\n                else {                                  // Delete Byway\n                    *ppLastFile = pImportFile->m_pNextFile;\n                    pImportFile->m_pNextFile = NULL;\n                    delete pImportFile;\n                    m_nImportFiles--;\n                    continue;                           // Retry after delete.\n                }\n            }\n        }\n        else {\n            if (pfFileCallback != NULL) {\n                LPCSTR pszFile = NULL;\n\n                if (!(*pfFileCallback)(pContext,\n                                       pImportFile->m_pszOrig,\n                                       pImportFile->m_pszName,\n                                       &pszFile)) {\n                    goto fail;\n                }\n\n                if (pszFile != NULL) {\n                    if (pszFile != pImportFile->m_pszName) {\n                        LPCSTR pszLast = pImportFile->m_pszName;\n                        pImportFile->m_pszName = DuplicateString(pszFile);\n                        ReleaseString(pszLast);\n\n                        if (pImportFile->m_pszName == NULL) {\n                            goto fail;\n                        }\n                    }\n                }\n            }\n\n            if (pfSymbolCallback != NULL) {\n                for (DWORD n = 0; n < pImportFile->m_nImportNames; n++) {\n                    CImageImportName *pImportName = &pImportFile->m_pImportNames[n];\n\n                    LPCSTR pszName = NULL;\n                    ULONG nOrdinal = 0;\n                    if (!(*pfSymbolCallback)(pContext,\n                                             pImportName->m_nOrig,\n                                             pImportName->m_nOrdinal,\n                                             &nOrdinal,\n                                             pImportName->m_pszOrig,\n                                             pImportName->m_pszName,\n                                             &pszName)) {\n                        goto fail;\n                    }\n\n                    if (pszName != NULL) {\n                        if (pszName != pImportName->m_pszName) {\n                            pImportName->m_nOrdinal = 0;\n\n                            LPCSTR pszLast = pImportName->m_pszName;\n                            pImportName->m_pszName = DuplicateString(pszName);\n                            ReleaseString(pszLast);\n\n                            if (pImportName->m_pszName == NULL) {\n                                goto fail;\n                            }\n                        }\n                    }\n                    else if (nOrdinal != 0) {\n                        pImportName->m_nOrdinal = nOrdinal;\n\n                        if (pImportName->m_pszName != NULL) {\n                            delete[] pImportName->m_pszName;\n                            pImportName->m_pszName = NULL;\n                        }\n                    }\n                }\n            }\n        }\n\n        ppLastFile = &pImportFile->m_pNextFile;\n        pImportFile = pImportFile->m_pNextFile;\n    }\n\n    for (;;) {\n        if (pfBywayCallback != NULL) {\n            LPCSTR pszFile = NULL;\n            if (!(*pfBywayCallback)(pContext, NULL, &pszFile)) {\n                goto fail;\n            }\n            if (pszFile != NULL) {\n                // Insert a new Byway.\n                CImageImportFile *pByway = NewByway(pszFile);\n                if (pByway == NULL) {\n                    return FALSE;\n                }\n\n                pByway->m_pNextFile = pImportFile;\n                *ppLastFile = pByway;\n                ppLastFile = &pByway->m_pNextFile;\n                continue;                               // Retry after Byway.\n            }\n        }\n        break;\n    }\n\n    if (pfCommitCallback != NULL) {\n        if (!(*pfCommitCallback)(pContext)) {\n            goto fail;\n        }\n    }\n\n    SetLastError(NO_ERROR);\n    return TRUE;\n\n  fail:\n    return FALSE;\n}\n\nBOOL CImage::Write(HANDLE hFile)\n{\n    DWORD cbDone;\n\n    if (hFile == INVALID_HANDLE_VALUE) {\n        SetLastError(ERROR_INVALID_HANDLE);\n        return FALSE;\n    }\n\n    m_nNextFileAddr = 0;\n    m_nNextVirtAddr = 0;\n\n    DWORD nTables = 0;\n    DWORD nThunks = 0;\n    DWORD nChars = 0;\n    BOOL fNeedDetourSection = CheckImportsNeeded(&nTables, &nThunks, &nChars);\n\n    //////////////////////////////////////////////////////////// Copy Headers.\n    //\n    if (SetFilePointer(hFile, 0, NULL, FILE_BEGIN) == ~0u) {\n        return FALSE;\n    }\n    if (!CopyFileData(hFile, 0, m_NtHeader.OptionalHeader.SizeOfHeaders)) {\n        return FALSE;\n    }\n\n    if (fNeedDetourSection || !m_pImageData->IsEmpty()) {\n        // Replace the file's DOS header with our own.\n        m_nPeOffset = sizeof(m_DosHeader) + sizeof(s_rbDosCode);\n        m_nSectionsOffset = m_nPeOffset\n            + sizeof(m_NtHeader.Signature)\n            + sizeof(m_NtHeader.FileHeader)\n            + m_NtHeader.FileHeader.SizeOfOptionalHeader;\n        m_DosHeader.e_lfanew = m_nPeOffset;\n\n        if (SetFilePointer(hFile, 0, NULL, FILE_BEGIN) == ~0u) {\n            return FALSE;\n        }\n        if (!WriteFile(hFile, &m_DosHeader, sizeof(m_DosHeader), &cbDone)) {\n            return FALSE;\n        }\n        if (!WriteFile(hFile, &s_rbDosCode, sizeof(s_rbDosCode), &cbDone)) {\n            return FALSE;\n        }\n    }\n    else {\n        // Restore the file's original DOS header.\n        if (m_nPrePE != 0) {\n            m_nPeOffset = m_cbPrePE;\n            m_nSectionsOffset = m_nPeOffset\n                + sizeof(m_NtHeader.Signature)\n                + sizeof(m_NtHeader.FileHeader)\n                + m_NtHeader.FileHeader.SizeOfOptionalHeader;\n            m_DosHeader.e_lfanew = m_nPeOffset;\n\n\n            if (SetFilePointer(hFile, 0, NULL, FILE_BEGIN) == ~0u) {\n                return FALSE;\n            }\n            if (!CopyFileData(hFile, m_nPrePE, m_cbPrePE)) {\n                return FALSE;\n            }\n        }\n    }\n\n    m_nNextFileAddr = m_NtHeader.OptionalHeader.SizeOfHeaders;\n    m_nNextVirtAddr = 0;\n    if (!AlignFileData(hFile)) {\n        return FALSE;\n    }\n\n    /////////////////////////////////////////////////////////// Copy Sections.\n    //\n    DWORD n = 0;\n    for (; n < m_NtHeader.FileHeader.NumberOfSections; n++) {\n        if (m_SectionHeaders[n].SizeOfRawData) {\n            if (SetFilePointer(hFile,\n                               m_SectionHeaders[n].PointerToRawData,\n                               NULL, FILE_BEGIN) == ~0u) {\n                return FALSE;\n            }\n            if (!CopyFileData(hFile,\n                              m_SectionHeaders[n].PointerToRawData,\n                              m_SectionHeaders[n].SizeOfRawData)) {\n                return FALSE;\n            }\n        }\n        m_nNextFileAddr = Max(m_SectionHeaders[n].PointerToRawData +\n                              m_SectionHeaders[n].SizeOfRawData,\n                              m_nNextFileAddr);\n        // Old images have VirtualSize == 0 as a matter of course, e.g. NT 3.1.\n        // In which case, use SizeOfRawData instead.\n        m_nNextVirtAddr = Max(m_SectionHeaders[n].VirtualAddress +\n                              (m_SectionHeaders[n].Misc.VirtualSize\n                               ? m_SectionHeaders[n].Misc.VirtualSize\n                               : SectionAlign(m_SectionHeaders[n].SizeOfRawData)),\n                              m_nNextVirtAddr);\n\n        m_nExtraOffset = Max(m_nNextFileAddr, m_nExtraOffset);\n\n        if (!AlignFileData(hFile)) {\n            return FALSE;\n        }\n    }\n\n    if (fNeedDetourSection || !m_pImageData->IsEmpty()) {\n\n        if (m_NtHeader.FileHeader.NumberOfSections >= ARRAYSIZE(m_SectionHeaders)) {\n            SetLastError(ERROR_EXE_MARKED_INVALID);\n            return FALSE;\n        }\n\n        ////////////////////////////////////////////// Insert .detour Section.\n        //\n        DWORD nSection = m_NtHeader.FileHeader.NumberOfSections++;\n        DETOUR_SECTION_HEADER dh;\n\n        ZeroMemory(&dh, sizeof(dh));\n        ZeroMemory(&m_SectionHeaders[nSection], sizeof(m_SectionHeaders[nSection]));\n\n        dh.cbHeaderSize = sizeof(DETOUR_SECTION_HEADER);\n        dh.nSignature = DETOUR_SECTION_HEADER_SIGNATURE;\n\n        dh.nOriginalImportVirtualAddress = m_NtHeader.OptionalHeader\n            .DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;\n        dh.nOriginalImportSize = m_NtHeader.OptionalHeader\n            .DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size;\n\n        dh.nOriginalBoundImportVirtualAddress\n            = m_NtHeader.OptionalHeader\n            .DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].VirtualAddress;\n        dh.nOriginalBoundImportSize = m_NtHeader.OptionalHeader\n            .DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Size;\n\n        dh.nOriginalIatVirtualAddress = m_NtHeader.OptionalHeader\n            .DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress;\n        dh.nOriginalIatSize = m_NtHeader.OptionalHeader\n            .DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT].Size;\n\n        dh.nOriginalSizeOfImage = m_NtHeader.OptionalHeader.SizeOfImage;\n\n        DWORD clrAddr = m_NtHeader.OptionalHeader\n            .DataDirectory[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR].VirtualAddress;\n        DWORD clrSize = m_NtHeader.OptionalHeader\n            .DataDirectory[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR].Size;\n        if (clrAddr && clrSize) {\n            PDETOUR_CLR_HEADER pHdr = (PDETOUR_CLR_HEADER)RvaToVa(clrAddr);\n            if (pHdr != NULL) {\n                DETOUR_CLR_HEADER hdr;\n                hdr = *pHdr;\n\n                dh.nOriginalClrFlags = hdr.Flags;\n            }\n        }\n\n        HRESULT hrRet = StringCchCopyA((PCHAR)m_SectionHeaders[nSection].Name, IMAGE_SIZEOF_SHORT_NAME , \".detour\");\n        if (FAILED(hrRet))\n            return FALSE;\n\n        m_SectionHeaders[nSection].Characteristics\n            = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE;\n\n        m_nOutputVirtAddr = m_nNextVirtAddr;\n        m_nOutputVirtSize = 0;\n        m_nOutputFileAddr = m_nNextFileAddr;\n\n        dh.nDataOffset = 0;                     // pbData\n        dh.cbDataSize = m_pImageData->m_cbData;\n        dh.cbPrePE = m_cbPrePE;\n\n        //////////////////////////////////////////////////////////////////////////\n        //\n\n        DWORD rvaImportTable = 0;\n        DWORD rvaLookupTable = 0;\n        DWORD rvaBoundTable = 0;\n        DWORD rvaNameTable = 0;\n        DWORD nImportTableSize = nTables * sizeof(IMAGE_IMPORT_DESCRIPTOR);\n\n        if (!SizeOutputBuffer(QuadAlign(sizeof(dh))\n                              + m_cbPrePE\n                              + QuadAlign(m_pImageData->m_cbData)\n                              + QuadAlign(sizeof(IMAGE_THUNK_DATA) * nThunks)\n                              + QuadAlign(sizeof(IMAGE_THUNK_DATA) * nThunks)\n                              + QuadAlign(nChars)\n                              + QuadAlign(nImportTableSize))) {\n            return FALSE;\n        }\n\n        DWORD vaHead = 0;\n        PBYTE pbHead = NULL;\n        DWORD vaPrePE = 0;\n        PBYTE pbPrePE = NULL;\n        DWORD vaData = 0;\n        PBYTE pbData = NULL;\n\n        if ((pbHead = AllocateOutput(sizeof(dh), &vaHead)) == NULL) {\n            return FALSE;\n        }\n\n        if ((pbPrePE = AllocateOutput(m_cbPrePE, &vaPrePE)) == NULL) {\n            return FALSE;\n        }\n\n        CImageThunks lookupTable(this, nThunks, &rvaLookupTable);\n        CImageThunks boundTable(this, nThunks, &rvaBoundTable);\n        CImageChars nameTable(this, nChars, &rvaNameTable);\n\n        if ((pbData = AllocateOutput(m_pImageData->m_cbData, &vaData)) == NULL) {\n            return FALSE;\n        }\n\n        dh.nDataOffset = vaData - vaHead;\n        dh.cbDataSize = dh.nDataOffset + m_pImageData->m_cbData;\n        CopyMemory(pbHead, &dh, sizeof(dh));\n        CopyMemory(pbPrePE, m_pMap + m_nPrePE, m_cbPrePE);\n        CopyMemory(pbData, m_pImageData->m_pbData, m_pImageData->m_cbData);\n\n        PIMAGE_IMPORT_DESCRIPTOR piidDst = (PIMAGE_IMPORT_DESCRIPTOR)\n            AllocateOutput(nImportTableSize, &rvaImportTable);\n        if (piidDst == NULL) {\n            return FALSE;\n        }\n\n        //////////////////////////////////////////////// Step Through Imports.\n        //\n        for (CImageImportFile *pImportFile = m_pImportFiles;\n             pImportFile != NULL; pImportFile = pImportFile->m_pNextFile) {\n\n            ZeroMemory(piidDst, sizeof(*piidDst));\n            nameTable.Allocate(pImportFile->m_pszName, (DWORD *)&piidDst->Name);\n            piidDst->TimeDateStamp = 0;\n            piidDst->ForwarderChain = pImportFile->m_nForwarderChain;\n\n            if (pImportFile->m_fByway) {\n                ULONG rvaIgnored;\n\n                lookupTable.Allocate(IMAGE_ORDINAL_FLAG+1,\n                                     (DWORD *)&piidDst->OriginalFirstThunk);\n                boundTable.Allocate(IMAGE_ORDINAL_FLAG+1,\n                                    (DWORD *)&piidDst->FirstThunk);\n\n                lookupTable.Allocate(0, &rvaIgnored);\n                boundTable.Allocate(0, &rvaIgnored);\n            }\n            else {\n                ULONG rvaIgnored;\n\n                piidDst->FirstThunk = (ULONG)pImportFile->m_rvaFirstThunk;\n                lookupTable.Current((DWORD *)&piidDst->OriginalFirstThunk);\n\n                for (n = 0; n < pImportFile->m_nImportNames; n++) {\n                    CImageImportName *pImportName = &pImportFile->m_pImportNames[n];\n\n                    if (pImportName->m_pszName) {\n                        ULONG nDstName = 0;\n\n                        nameTable.Allocate(pImportName->m_pszName,\n                                           pImportName->m_nHint,\n                                           &nDstName);\n                        lookupTable.Allocate(nDstName, &rvaIgnored);\n                    }\n                    else {\n                        lookupTable.Allocate(IMAGE_ORDINAL_FLAG + pImportName->m_nOrdinal,\n                                             &rvaIgnored);\n                    }\n                }\n                lookupTable.Allocate(0, &rvaIgnored);\n            }\n            piidDst++;\n        }\n        ZeroMemory(piidDst, sizeof(*piidDst));\n\n        //////////////////////////////////////////////////////////////////////////\n        //\n        m_nNextVirtAddr += m_nOutputVirtSize;\n        m_nNextFileAddr += FileAlign(m_nOutputVirtSize);\n\n        if (!AlignFileData(hFile)) {\n            return FALSE;\n        }\n\n        //////////////////////////////////////////////////////////////////////////\n        //\n        m_SectionHeaders[nSection].VirtualAddress = m_nOutputVirtAddr;\n        m_SectionHeaders[nSection].Misc.VirtualSize = m_nOutputVirtSize;\n        m_SectionHeaders[nSection].PointerToRawData = m_nOutputFileAddr;\n        m_SectionHeaders[nSection].SizeOfRawData = FileAlign(m_nOutputVirtSize);\n\n        m_NtHeader.OptionalHeader\n            .DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress\n            = rvaImportTable;\n        m_NtHeader.OptionalHeader\n            .DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size\n            = nImportTableSize;\n\n        m_NtHeader.OptionalHeader\n            .DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].VirtualAddress = 0;\n        m_NtHeader.OptionalHeader\n            .DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Size = 0;\n\n        //////////////////////////////////////////////////////////////////////////\n        //\n        if (SetFilePointer(hFile, m_SectionHeaders[nSection].PointerToRawData,\n                           NULL, FILE_BEGIN) == ~0u) {\n            return FALSE;\n        }\n        if (!WriteFile(hFile, m_pbOutputBuffer, m_SectionHeaders[nSection].SizeOfRawData,\n                       &cbDone)) {\n            return FALSE;\n        }\n    }\n\n    ///////////////////////////////////////////////////// Adjust Extra Data.\n    //\n    LONG nExtraAdjust = m_nNextFileAddr - m_nExtraOffset;\n    for (n = 0; n < m_NtHeader.FileHeader.NumberOfSections; n++) {\n        if (m_SectionHeaders[n].PointerToRawData > m_nExtraOffset) {\n            m_SectionHeaders[n].PointerToRawData += nExtraAdjust;\n        }\n        if (m_SectionHeaders[n].PointerToRelocations > m_nExtraOffset) {\n            m_SectionHeaders[n].PointerToRelocations += nExtraAdjust;\n        }\n        if (m_SectionHeaders[n].PointerToLinenumbers > m_nExtraOffset) {\n            m_SectionHeaders[n].PointerToLinenumbers += nExtraAdjust;\n        }\n    }\n    if (m_NtHeader.FileHeader.PointerToSymbolTable > m_nExtraOffset) {\n        m_NtHeader.FileHeader.PointerToSymbolTable += nExtraAdjust;\n    }\n\n    m_NtHeader.OptionalHeader.CheckSum = 0;\n    m_NtHeader.OptionalHeader.SizeOfImage = m_nNextVirtAddr;\n\n    ////////////////////////////////////////////////// Adjust Debug Directory.\n    //\n    DWORD debugAddr = m_NtHeader.OptionalHeader\n        .DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress;\n    DWORD debugSize = m_NtHeader.OptionalHeader\n        .DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].Size;\n    if (debugAddr && debugSize) {\n        DWORD nFileOffset = RvaToFileOffset(debugAddr);\n        if (SetFilePointer(hFile, nFileOffset, NULL, FILE_BEGIN) == ~0u) {\n            return FALSE;\n        }\n\n        PIMAGE_DEBUG_DIRECTORY pDir = (PIMAGE_DEBUG_DIRECTORY)RvaToVa(debugAddr);\n        if (pDir == NULL) {\n            return FALSE;\n        }\n\n        DWORD nEntries = debugSize / sizeof(*pDir);\n        for (n = 0; n < nEntries; n++) {\n            IMAGE_DEBUG_DIRECTORY dir = pDir[n];\n\n            if (dir.PointerToRawData > m_nExtraOffset) {\n                dir.PointerToRawData += nExtraAdjust;\n            }\n            if (!WriteFile(hFile, &dir, sizeof(dir), &cbDone)) {\n                return FALSE;\n            }\n        }\n    }\n\n    /////////////////////////////////////////////////////// Adjust CLR Header.\n    //\n    DWORD clrAddr = m_NtHeader.OptionalHeader\n        .DataDirectory[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR].VirtualAddress;\n    DWORD clrSize = m_NtHeader.OptionalHeader\n        .DataDirectory[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR].Size;\n    if (clrAddr && clrSize && fNeedDetourSection) {\n        DWORD nFileOffset = RvaToFileOffset(clrAddr);\n        if (SetFilePointer(hFile, nFileOffset, NULL, FILE_BEGIN) == ~0u) {\n            return FALSE;\n        }\n\n        PDETOUR_CLR_HEADER pHdr = (PDETOUR_CLR_HEADER)RvaToVa(clrAddr);\n        if (pHdr == NULL) {\n            return FALSE;\n        }\n\n        DETOUR_CLR_HEADER hdr;\n        hdr = *pHdr;\n        hdr.Flags &= 0xfffffffe;    // Clear the IL_ONLY flag.\n\n        if (!WriteFile(hFile, &hdr, sizeof(hdr), &cbDone)) {\n            return FALSE;\n        }\n    }\n\n    ///////////////////////////////////////////////// Copy Left-over Data.\n    //\n    if (m_nFileSize > m_nExtraOffset) {\n        if (SetFilePointer(hFile, m_nNextFileAddr, NULL, FILE_BEGIN) == ~0u) {\n            return FALSE;\n        }\n        if (!CopyFileData(hFile, m_nExtraOffset, m_nFileSize - m_nExtraOffset)) {\n            return FALSE;\n        }\n    }\n\n\n    //////////////////////////////////////////////////// Finalize Headers.\n    //\n\n    if (SetFilePointer(hFile, m_nPeOffset, NULL, FILE_BEGIN) == ~0u) {\n        return FALSE;\n    }\n    if (!WriteFile(hFile, &m_NtHeader, sizeof(m_NtHeader), &cbDone)) {\n        return FALSE;\n    }\n\n    if (SetFilePointer(hFile, m_nSectionsOffset, NULL, FILE_BEGIN) == ~0u) {\n        return FALSE;\n    }\n    if (!WriteFile(hFile, &m_SectionHeaders,\n                   sizeof(m_SectionHeaders[0])\n                   * m_NtHeader.FileHeader.NumberOfSections,\n                   &cbDone)) {\n        return FALSE;\n    }\n\n    m_cbPostPE = SetFilePointer(hFile, 0, NULL, FILE_CURRENT);\n    if (m_cbPostPE == ~0u) {\n        return FALSE;\n    }\n    m_cbPostPE = m_NtHeader.OptionalHeader.SizeOfHeaders - m_cbPostPE;\n\n    return TRUE;\n}\n\n};                                                      // namespace Detour\n\n//////////////////////////////////////////////////////////////////////////////\n//\nPDETOUR_BINARY WINAPI DetourBinaryOpen(_In_ HANDLE hFile)\n{\n    Detour::CImage *pImage = new NOTHROW\n        Detour::CImage;\n    if (pImage == NULL) {\n        SetLastError(ERROR_OUTOFMEMORY);\n        return FALSE;\n    }\n\n    if (!pImage->Read(hFile)) {\n        delete pImage;\n        return FALSE;\n    }\n\n    return (PDETOUR_BINARY)pImage;\n}\n\nBOOL WINAPI DetourBinaryWrite(_In_ PDETOUR_BINARY pdi,\n                              _In_ HANDLE hFile)\n{\n    Detour::CImage *pImage = Detour::CImage::IsValid(pdi);\n    if (pImage == NULL) {\n        return FALSE;\n    }\n\n    return pImage->Write(hFile);\n}\n\n_Writable_bytes_(*pcbData)\n_Readable_bytes_(*pcbData)\n_Success_(return != NULL)\nPVOID WINAPI DetourBinaryEnumeratePayloads(_In_ PDETOUR_BINARY pBinary,\n                                           _Out_opt_ GUID *pGuid,\n                                           _Out_ DWORD *pcbData,\n                                           _Inout_ DWORD *pnIterator)\n{\n    Detour::CImage *pImage = Detour::CImage::IsValid(pBinary);\n    if (pImage == NULL) {\n        return FALSE;\n    }\n\n    return pImage->DataEnum(pGuid, pcbData, pnIterator);\n}\n\n_Writable_bytes_(*pcbData)\n_Readable_bytes_(*pcbData)\n_Success_(return != NULL)\nPVOID WINAPI DetourBinaryFindPayload(_In_ PDETOUR_BINARY pBinary,\n                                     _In_ REFGUID rguid,\n                                     _Out_ DWORD *pcbData)\n{\n    Detour::CImage *pImage = Detour::CImage::IsValid(pBinary);\n    if (pImage == NULL) {\n        return FALSE;\n    }\n\n    return pImage->DataFind(rguid, pcbData);\n}\n\nPVOID WINAPI DetourBinarySetPayload(_In_ PDETOUR_BINARY pBinary,\n                                    _In_ REFGUID rguid,\n                                    _In_reads_opt_(cbData) PVOID pvData,\n                                    _In_ DWORD cbData)\n{\n    Detour::CImage *pImage = Detour::CImage::IsValid(pBinary);\n    if (pImage == NULL) {\n        return NULL;\n    }\n\n    return pImage->DataSet(rguid, (PBYTE)pvData, cbData);\n}\n\nBOOL WINAPI DetourBinaryDeletePayload(_In_ PDETOUR_BINARY pBinary,\n                                      _In_ REFGUID rguid)\n{\n    Detour::CImage *pImage = Detour::CImage::IsValid(pBinary);\n    if (pImage == NULL) {\n        return FALSE;\n    }\n\n    return pImage->DataDelete(rguid);\n}\n\nBOOL WINAPI DetourBinaryPurgePayloads(_In_ PDETOUR_BINARY pBinary)\n{\n    Detour::CImage *pImage = Detour::CImage::IsValid(pBinary);\n    if (pImage == NULL) {\n        return FALSE;\n    }\n\n    return pImage->DataPurge();\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nstatic BOOL CALLBACK ResetBywayCallback(_In_opt_ PVOID pContext,\n                                        _In_opt_ LPCSTR pszFile,\n                                        _Outptr_result_maybenull_ LPCSTR *ppszOutFile)\n{\n    UNREFERENCED_PARAMETER(pContext);\n    UNREFERENCED_PARAMETER(pszFile);\n\n    *ppszOutFile = NULL;\n    return TRUE;\n}\n\nstatic BOOL CALLBACK ResetFileCallback(_In_opt_ PVOID pContext,\n                                       _In_ LPCSTR pszOrigFile,\n                                       _In_ LPCSTR pszFile,\n                                       _Outptr_result_maybenull_ LPCSTR *ppszOutFile)\n{\n    UNREFERENCED_PARAMETER(pContext);\n    UNREFERENCED_PARAMETER(pszFile);\n\n    *ppszOutFile = pszOrigFile;\n    return TRUE;\n}\n\nstatic BOOL CALLBACK ResetSymbolCallback(_In_opt_ PVOID pContext,\n                                         _In_ ULONG nOrigOrdinal,\n                                         _In_ ULONG nOrdinal,\n                                         _Out_ ULONG *pnOutOrdinal,\n                                         _In_opt_ LPCSTR pszOrigSymbol,\n                                         _In_opt_ LPCSTR pszSymbol,\n                                         _Outptr_result_maybenull_ LPCSTR *ppszOutSymbol)\n{\n    UNREFERENCED_PARAMETER(pContext);\n    UNREFERENCED_PARAMETER(nOrdinal);\n    UNREFERENCED_PARAMETER(pszSymbol);\n\n    *pnOutOrdinal = nOrigOrdinal;\n    *ppszOutSymbol = pszOrigSymbol;\n    return TRUE;\n}\n\nBOOL WINAPI DetourBinaryResetImports(_In_ PDETOUR_BINARY pBinary)\n{\n    Detour::CImage *pImage = Detour::CImage::IsValid(pBinary);\n    if (pImage == NULL) {\n        return FALSE;\n    }\n\n    return pImage->EditImports(NULL,\n                               ResetBywayCallback,\n                               ResetFileCallback,\n                               ResetSymbolCallback,\n                               NULL);\n}\n\n//////////////////////////////////////////////////////////////////////////////\n//\nBOOL WINAPI DetourBinaryEditImports(_In_ PDETOUR_BINARY pBinary,\n                                    _In_opt_ PVOID pContext,\n                                    _In_opt_ PF_DETOUR_BINARY_BYWAY_CALLBACK pfByway,\n                                    _In_opt_ PF_DETOUR_BINARY_FILE_CALLBACK pfFile,\n                                    _In_opt_ PF_DETOUR_BINARY_SYMBOL_CALLBACK pfSymbol,\n                                    _In_opt_ PF_DETOUR_BINARY_COMMIT_CALLBACK pfCommit)\n{\n    Detour::CImage *pImage = Detour::CImage::IsValid(pBinary);\n    if (pImage == NULL) {\n        return FALSE;\n    }\n\n    return pImage->EditImports(pContext,\n                               pfByway,\n                               pfFile,\n                               pfSymbol,\n                               pfCommit);\n}\n\nBOOL WINAPI DetourBinaryClose(_In_ PDETOUR_BINARY pBinary)\n{\n    Detour::CImage *pImage = Detour::CImage::IsValid(pBinary);\n    if (pImage == NULL) {\n        return FALSE;\n    }\n\n    BOOL bSuccess = pImage->Close();\n    delete pImage;\n    pImage = NULL;\n\n    return bSuccess;\n}\n\n//\n///////////////////////////////////////////////////////////////// End of File.\n"
  },
  {
    "path": "ext/detours/src/modules.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Module Enumeration Functions (modules.cpp of detours.lib)\n//\n//  Microsoft Research Detours Package, Version 4.0.1\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n//  Module enumeration functions.\n//\n\n// #define DETOUR_DEBUG 1\n#define DETOURS_INTERNAL\n#include \"detours.h\"\n#include <strsafe.h>\n#include <libloaderapi.h>\n\n#if DETOURS_VERSION != 0x4c0c1   // 0xMAJORcMINORcPATCH\n#error detours.h version mismatch\n#endif\n\n#define CLR_DIRECTORY OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR]\n#define IAT_DIRECTORY OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT]\n\n//////////////////////////////////////////////////////////////////////////////\n//\nconst GUID DETOUR_EXE_RESTORE_GUID = {\n    0x2ed7a3ff, 0x3339, 0x4a8d,\n    { 0x80, 0x5c, 0xd4, 0x98, 0x15, 0x3f, 0xc2, 0x8f }};\n\n//////////////////////////////////////////////////////////////////////////////\n//\nPDETOUR_SYM_INFO DetourLoadImageHlp(VOID)\n{\n    static DETOUR_SYM_INFO symInfo;\n    static PDETOUR_SYM_INFO pSymInfo = NULL;\n    static BOOL failed = false;\n\n    if (failed) {\n        return NULL;\n    }\n    if (pSymInfo != NULL) {\n        return pSymInfo;\n    }\n\n    ZeroMemory(&symInfo, sizeof(symInfo));\n    // Create a real handle to the process.\n#if 0\n    DuplicateHandle(GetCurrentProcess(),\n                    GetCurrentProcess(),\n                    GetCurrentProcess(),\n                    &symInfo.hProcess,\n                    0,\n                    FALSE,\n                    DUPLICATE_SAME_ACCESS);\n#else\n    symInfo.hProcess = GetCurrentProcess();\n#endif\n\n    symInfo.hDbgHelp = LoadLibraryExW(L\"dbghelp.dll\", NULL, 0);\n    if (symInfo.hDbgHelp == NULL) {\n      abort:\n        failed = true;\n        if (symInfo.hDbgHelp != NULL) {\n            FreeLibrary(symInfo.hDbgHelp);\n        }\n        symInfo.pfImagehlpApiVersionEx = NULL;\n        symInfo.pfSymInitialize = NULL;\n        symInfo.pfSymSetOptions = NULL;\n        symInfo.pfSymGetOptions = NULL;\n        symInfo.pfSymLoadModule64 = NULL;\n        symInfo.pfSymGetModuleInfo64 = NULL;\n        symInfo.pfSymFromName = NULL;\n        return NULL;\n    }\n\n    symInfo.pfImagehlpApiVersionEx\n        = (PF_ImagehlpApiVersionEx)GetProcAddress(symInfo.hDbgHelp,\n                                                  \"ImagehlpApiVersionEx\");\n    symInfo.pfSymInitialize\n        = (PF_SymInitialize)GetProcAddress(symInfo.hDbgHelp, \"SymInitialize\");\n    symInfo.pfSymSetOptions\n        = (PF_SymSetOptions)GetProcAddress(symInfo.hDbgHelp, \"SymSetOptions\");\n    symInfo.pfSymGetOptions\n        = (PF_SymGetOptions)GetProcAddress(symInfo.hDbgHelp, \"SymGetOptions\");\n    symInfo.pfSymLoadModule64\n        = (PF_SymLoadModule64)GetProcAddress(symInfo.hDbgHelp, \"SymLoadModule64\");\n    symInfo.pfSymGetModuleInfo64\n        = (PF_SymGetModuleInfo64)GetProcAddress(symInfo.hDbgHelp, \"SymGetModuleInfo64\");\n    symInfo.pfSymFromName\n        = (PF_SymFromName)GetProcAddress(symInfo.hDbgHelp, \"SymFromName\");\n\n    API_VERSION av;\n    ZeroMemory(&av, sizeof(av));\n    av.MajorVersion = API_VERSION_NUMBER;\n\n    if (symInfo.pfImagehlpApiVersionEx == NULL ||\n        symInfo.pfSymInitialize == NULL ||\n        symInfo.pfSymLoadModule64 == NULL ||\n        symInfo.pfSymGetModuleInfo64 == NULL ||\n        symInfo.pfSymFromName == NULL) {\n        goto abort;\n    }\n\n    symInfo.pfImagehlpApiVersionEx(&av);\n    if (av.MajorVersion < API_VERSION_NUMBER) {\n        goto abort;\n    }\n\n    if (!symInfo.pfSymInitialize(symInfo.hProcess, NULL, FALSE)) {\n        // We won't retry the initialize if it fails.\n        goto abort;\n    }\n\n    if (symInfo.pfSymGetOptions != NULL && symInfo.pfSymSetOptions != NULL) {\n        DWORD dw = symInfo.pfSymGetOptions();\n\n        dw &= ~(SYMOPT_CASE_INSENSITIVE |\n                SYMOPT_UNDNAME |\n                SYMOPT_DEFERRED_LOADS |\n                0);\n        dw |= (\n#if defined(SYMOPT_EXACT_SYMBOLS)\n               SYMOPT_EXACT_SYMBOLS |\n#endif\n#if defined(SYMOPT_NO_UNQUALIFIED_LOADS)\n               SYMOPT_NO_UNQUALIFIED_LOADS |\n#endif\n               SYMOPT_DEFERRED_LOADS |\n#if defined(SYMOPT_FAIL_CRITICAL_ERRORS)\n               SYMOPT_FAIL_CRITICAL_ERRORS |\n#endif\n#if defined(SYMOPT_INCLUDE_32BIT_MODULES)\n               SYMOPT_INCLUDE_32BIT_MODULES |\n#endif\n               0);\n        symInfo.pfSymSetOptions(dw);\n    }\n\n    pSymInfo = &symInfo;\n    return pSymInfo;\n}\n\nPVOID WINAPI DetourFindFunction(_In_ LPCSTR pszModule,\n                                _In_ LPCSTR pszFunction)\n{\n    /////////////////////////////////////////////// First, try GetProcAddress.\n    //\n#pragma prefast(suppress:28752, \"We don't do the unicode conversion for LoadLibraryExA.\")\n    HMODULE hModule = LoadLibraryExA(pszModule, NULL, 0);\n    if (hModule == NULL) {\n        return NULL;\n    }\n\n    PBYTE pbCode = (PBYTE)GetProcAddress(hModule, pszFunction);\n    if (pbCode) {\n        return pbCode;\n    }\n\n    ////////////////////////////////////////////////////// Then try ImageHelp.\n    //\n    DETOUR_TRACE((\"DetourFindFunction(%hs, %hs)\\n\", pszModule, pszFunction));\n    PDETOUR_SYM_INFO pSymInfo = DetourLoadImageHlp();\n    if (pSymInfo == NULL) {\n        DETOUR_TRACE((\"DetourLoadImageHlp failed: %d\\n\",\n                      GetLastError()));\n        return NULL;\n    }\n\n    if (pSymInfo->pfSymLoadModule64(pSymInfo->hProcess, NULL,\n                                    (PCHAR)pszModule, NULL,\n                                    (DWORD64)hModule, 0) == 0) {\n        if (ERROR_SUCCESS != GetLastError()) {\n            DETOUR_TRACE((\"SymLoadModule64(%p) failed: %d\\n\",\n                          pSymInfo->hProcess, GetLastError()));\n            return NULL;\n        }\n    }\n\n    HRESULT hrRet;\n    CHAR szFullName[512];\n    IMAGEHLP_MODULE64 modinfo;\n    ZeroMemory(&modinfo, sizeof(modinfo));\n    modinfo.SizeOfStruct = sizeof(modinfo);\n    if (!pSymInfo->pfSymGetModuleInfo64(pSymInfo->hProcess, (DWORD64)hModule, &modinfo)) {\n        DETOUR_TRACE((\"SymGetModuleInfo64(%p, %p) failed: %d\\n\",\n                      pSymInfo->hProcess, hModule, GetLastError()));\n        return NULL;\n    }\n\n    hrRet = StringCchCopyA(szFullName, sizeof(szFullName)/sizeof(CHAR), modinfo.ModuleName);\n    if (FAILED(hrRet)) {\n        DETOUR_TRACE((\"StringCchCopyA failed: %08x\\n\", hrRet));\n        return NULL;\n    }\n    hrRet = StringCchCatA(szFullName, sizeof(szFullName)/sizeof(CHAR), \"!\");\n    if (FAILED(hrRet)) {\n        DETOUR_TRACE((\"StringCchCatA failed: %08x\\n\", hrRet));\n        return NULL;\n    }\n    hrRet = StringCchCatA(szFullName, sizeof(szFullName)/sizeof(CHAR), pszFunction);\n    if (FAILED(hrRet)) {\n        DETOUR_TRACE((\"StringCchCatA failed: %08x\\n\", hrRet));\n        return NULL;\n    }\n\n    struct CFullSymbol : SYMBOL_INFO {\n        CHAR szRestOfName[512];\n    } symbol;\n    ZeroMemory(&symbol, sizeof(symbol));\n    //symbol.ModBase = (ULONG64)hModule;\n    symbol.SizeOfStruct = sizeof(SYMBOL_INFO);\n#ifdef DBHLPAPI\n    symbol.MaxNameLen = sizeof(symbol.szRestOfName)/sizeof(symbol.szRestOfName[0]);\n#else\n    symbol.MaxNameLength = sizeof(symbol.szRestOfName)/sizeof(symbol.szRestOfName[0]);\n#endif\n\n    if (!pSymInfo->pfSymFromName(pSymInfo->hProcess, szFullName, &symbol)) {\n        DETOUR_TRACE((\"SymFromName(%hs) failed: %d\\n\", szFullName, GetLastError()));\n        return NULL;\n    }\n\n#if defined(DETOURS_IA64)\n    // On the IA64, we get a raw code pointer from the symbol engine\n    // and have to convert it to a wrapped [code pointer, global pointer].\n    //\n    PPLABEL_DESCRIPTOR pldEntry = (PPLABEL_DESCRIPTOR)DetourGetEntryPoint(hModule);\n    PPLABEL_DESCRIPTOR pldSymbol = new PLABEL_DESCRIPTOR;\n\n    pldSymbol->EntryPoint = symbol.Address;\n    pldSymbol->GlobalPointer = pldEntry->GlobalPointer;\n    return (PBYTE)pldSymbol;\n#elif defined(DETOURS_ARM)\n    // On the ARM, we get a raw code pointer, which we must convert into a\n    // valied Thumb2 function pointer.\n    return DETOURS_PBYTE_TO_PFUNC(symbol.Address);\n#else\n    return (PBYTE)symbol.Address;\n#endif\n}\n\n//////////////////////////////////////////////////// Module Image Functions.\n//\n\nHMODULE WINAPI DetourEnumerateModules(_In_opt_ HMODULE hModuleLast)\n{\n    PBYTE pbLast = (PBYTE)hModuleLast + MM_ALLOCATION_GRANULARITY;\n\n    MEMORY_BASIC_INFORMATION mbi;\n    ZeroMemory(&mbi, sizeof(mbi));\n\n    // Find the next memory region that contains a mapped PE image.\n    //\n    for (;; pbLast = (PBYTE)mbi.BaseAddress + mbi.RegionSize) {\n        if (VirtualQuery(pbLast, &mbi, sizeof(mbi)) <= 0) {\n            break;\n        }\n\n        // Skip uncommitted regions and guard pages.\n        //\n        if ((mbi.State != MEM_COMMIT) ||\n            ((mbi.Protect & 0xff) == PAGE_NOACCESS) ||\n            (mbi.Protect & PAGE_GUARD)) {\n            continue;\n        }\n\n        __try {\n            PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)pbLast;\n            if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE ||\n                (DWORD)pDosHeader->e_lfanew > mbi.RegionSize ||\n                (DWORD)pDosHeader->e_lfanew < sizeof(*pDosHeader)) {\n                continue;\n            }\n\n            PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)((PBYTE)pDosHeader +\n                                                              pDosHeader->e_lfanew);\n            if (pNtHeader->Signature != IMAGE_NT_SIGNATURE) {\n                continue;\n            }\n\n            return (HMODULE)pDosHeader;\n        }\n#pragma prefast(suppress:28940, \"A bad pointer means this probably isn't a PE header.\")\n        __except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?\n                 EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {\n            continue;\n        }\n    }\n    return NULL;\n}\n\nPVOID WINAPI DetourGetEntryPoint(_In_opt_ HMODULE hModule)\n{\n    PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hModule;\n    if (hModule == NULL) {\n        pDosHeader = (PIMAGE_DOS_HEADER)GetModuleHandleW(NULL);\n    }\n\n    __try {\n#pragma warning(suppress:6011) // GetModuleHandleW(NULL) never returns NULL.\n        if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) {\n            SetLastError(ERROR_BAD_EXE_FORMAT);\n            return NULL;\n        }\n\n        PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)((PBYTE)pDosHeader +\n                                                          pDosHeader->e_lfanew);\n        if (pNtHeader->Signature != IMAGE_NT_SIGNATURE) {\n            SetLastError(ERROR_INVALID_EXE_SIGNATURE);\n            return NULL;\n        }\n        if (pNtHeader->FileHeader.SizeOfOptionalHeader == 0) {\n            SetLastError(ERROR_EXE_MARKED_INVALID);\n            return NULL;\n        }\n\n        PDETOUR_CLR_HEADER pClrHeader = NULL;\n        if (pNtHeader->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\n            if (((PIMAGE_NT_HEADERS32)pNtHeader)->CLR_DIRECTORY.VirtualAddress != 0 &&\n                ((PIMAGE_NT_HEADERS32)pNtHeader)->CLR_DIRECTORY.Size != 0) {\n                pClrHeader = (PDETOUR_CLR_HEADER)\n                    (((PBYTE)pDosHeader)\n                     + ((PIMAGE_NT_HEADERS32)pNtHeader)->CLR_DIRECTORY.VirtualAddress);\n            }\n        }\n        else if (pNtHeader->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC) {\n            if (((PIMAGE_NT_HEADERS64)pNtHeader)->CLR_DIRECTORY.VirtualAddress != 0 &&\n                ((PIMAGE_NT_HEADERS64)pNtHeader)->CLR_DIRECTORY.Size != 0) {\n                pClrHeader = (PDETOUR_CLR_HEADER)\n                    (((PBYTE)pDosHeader)\n                     + ((PIMAGE_NT_HEADERS64)pNtHeader)->CLR_DIRECTORY.VirtualAddress);\n            }\n        }\n\n        if (pClrHeader != NULL) {\n            // For MSIL assemblies, we want to use the _Cor entry points.\n\n            HMODULE hClr = GetModuleHandleW(L\"MSCOREE.DLL\");\n            if (hClr == NULL) {\n                return NULL;\n            }\n\n            SetLastError(NO_ERROR);\n            return (PVOID)GetProcAddress(hClr, \"_CorExeMain\");\n        }\n\n        SetLastError(NO_ERROR);\n\n        // Pure resource DLLs have neither an entry point nor CLR information\n        // so handle them by returning NULL (LastError is NO_ERROR)\n        if (pNtHeader->OptionalHeader.AddressOfEntryPoint == 0) {\n            return NULL;\n        }\n\n        return ((PBYTE)pDosHeader) +\n            pNtHeader->OptionalHeader.AddressOfEntryPoint;\n    }\n    __except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?\n             EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {\n        SetLastError(ERROR_EXE_MARKED_INVALID);\n        return NULL;\n    }\n}\n\nULONG WINAPI DetourGetModuleSize(_In_opt_ HMODULE hModule)\n{\n    PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hModule;\n    if (hModule == NULL) {\n        pDosHeader = (PIMAGE_DOS_HEADER)GetModuleHandleW(NULL);\n    }\n\n    __try {\n#pragma warning(suppress:6011) // GetModuleHandleW(NULL) never returns NULL.\n        if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) {\n            SetLastError(ERROR_BAD_EXE_FORMAT);\n            return NULL;\n        }\n\n        PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)((PBYTE)pDosHeader +\n                                                          pDosHeader->e_lfanew);\n        if (pNtHeader->Signature != IMAGE_NT_SIGNATURE) {\n            SetLastError(ERROR_INVALID_EXE_SIGNATURE);\n            return NULL;\n        }\n        if (pNtHeader->FileHeader.SizeOfOptionalHeader == 0) {\n            SetLastError(ERROR_EXE_MARKED_INVALID);\n            return NULL;\n        }\n        SetLastError(NO_ERROR);\n\n        return (pNtHeader->OptionalHeader.SizeOfImage);\n    }\n    __except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?\n             EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {\n        SetLastError(ERROR_EXE_MARKED_INVALID);\n        return NULL;\n    }\n}\n\nHMODULE WINAPI DetourGetContainingModule(_In_ PVOID pvAddr)\n{\n    MEMORY_BASIC_INFORMATION mbi;\n    ZeroMemory(&mbi, sizeof(mbi));\n\n    __try {\n        if (VirtualQuery(pvAddr, &mbi, sizeof(mbi)) <= 0) {\n            SetLastError(ERROR_BAD_EXE_FORMAT);\n            return NULL;\n        }\n\n        // Skip uncommitted regions and guard pages.\n        //\n        if ((mbi.State != MEM_COMMIT) ||\n            ((mbi.Protect & 0xff) == PAGE_NOACCESS) ||\n            (mbi.Protect & PAGE_GUARD)) {\n            SetLastError(ERROR_BAD_EXE_FORMAT);\n            return NULL;\n        }\n\n        PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)mbi.AllocationBase;\n        if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) {\n            SetLastError(ERROR_BAD_EXE_FORMAT);\n            return NULL;\n        }\n\n        PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)((PBYTE)pDosHeader +\n                                                          pDosHeader->e_lfanew);\n        if (pNtHeader->Signature != IMAGE_NT_SIGNATURE) {\n            SetLastError(ERROR_INVALID_EXE_SIGNATURE);\n            return NULL;\n        }\n        if (pNtHeader->FileHeader.SizeOfOptionalHeader == 0) {\n            SetLastError(ERROR_EXE_MARKED_INVALID);\n            return NULL;\n        }\n        SetLastError(NO_ERROR);\n\n        return (HMODULE)pDosHeader;\n    }\n    __except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?\n             EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {\n        SetLastError(ERROR_INVALID_EXE_SIGNATURE);\n        return NULL;\n    }\n}\n\n\nstatic inline PBYTE RvaAdjust(_Pre_notnull_ PIMAGE_DOS_HEADER pDosHeader, _In_ DWORD raddr)\n{\n    if (raddr != NULL) {\n        return ((PBYTE)pDosHeader) + raddr;\n    }\n    return NULL;\n}\n\nBOOL WINAPI DetourEnumerateExports(_In_ HMODULE hModule,\n                                   _In_opt_ PVOID pContext,\n                                   _In_ PF_DETOUR_ENUMERATE_EXPORT_CALLBACK pfExport)\n{\n    PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hModule;\n    if (hModule == NULL) {\n        pDosHeader = (PIMAGE_DOS_HEADER)GetModuleHandleW(NULL);\n    }\n\n    __try {\n#pragma warning(suppress:6011) // GetModuleHandleW(NULL) never returns NULL.\n        if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) {\n            SetLastError(ERROR_BAD_EXE_FORMAT);\n            return NULL;\n        }\n\n        PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)((PBYTE)pDosHeader +\n                                                          pDosHeader->e_lfanew);\n        if (pNtHeader->Signature != IMAGE_NT_SIGNATURE) {\n            SetLastError(ERROR_INVALID_EXE_SIGNATURE);\n            return FALSE;\n        }\n        if (pNtHeader->FileHeader.SizeOfOptionalHeader == 0) {\n            SetLastError(ERROR_EXE_MARKED_INVALID);\n            return FALSE;\n        }\n\n        PIMAGE_EXPORT_DIRECTORY pExportDir\n            = (PIMAGE_EXPORT_DIRECTORY)\n            RvaAdjust(pDosHeader,\n                      pNtHeader->OptionalHeader\n                      .DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);\n\n        if (pExportDir == NULL) {\n            SetLastError(ERROR_EXE_MARKED_INVALID);\n            return FALSE;\n        }\n\n        PBYTE pExportDirEnd = (PBYTE)pExportDir + pNtHeader->OptionalHeader\n            .DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;\n        PDWORD pdwFunctions = (PDWORD)RvaAdjust(pDosHeader, pExportDir->AddressOfFunctions);\n        PDWORD pdwNames = (PDWORD)RvaAdjust(pDosHeader, pExportDir->AddressOfNames);\n        PWORD pwOrdinals = (PWORD)RvaAdjust(pDosHeader, pExportDir->AddressOfNameOrdinals);\n\n        for (DWORD nFunc = 0; nFunc < pExportDir->NumberOfFunctions; nFunc++) {\n            PBYTE pbCode = (pdwFunctions != NULL)\n                ? (PBYTE)RvaAdjust(pDosHeader, pdwFunctions[nFunc]) : NULL;\n            PCHAR pszName = NULL;\n\n            // if the pointer is in the export region, then it is a forwarder.\n            if (pbCode > (PBYTE)pExportDir && pbCode < pExportDirEnd) {\n                pbCode = NULL;\n            }\n\n            for (DWORD n = 0; n < pExportDir->NumberOfNames; n++) {\n                if (pwOrdinals[n] == nFunc) {\n                    pszName = (pdwNames != NULL)\n                        ? (PCHAR)RvaAdjust(pDosHeader, pdwNames[n]) : NULL;\n                    break;\n                }\n            }\n            ULONG nOrdinal = pExportDir->Base + nFunc;\n\n            if (!pfExport(pContext, nOrdinal, pszName, pbCode)) {\n                break;\n            }\n        }\n        SetLastError(NO_ERROR);\n        return TRUE;\n    }\n    __except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?\n             EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {\n        SetLastError(ERROR_EXE_MARKED_INVALID);\n        return NULL;\n    }\n}\n\nBOOL WINAPI DetourEnumerateImportsEx(_In_opt_ HMODULE hModule,\n                                     _In_opt_ PVOID pContext,\n                                     _In_opt_ PF_DETOUR_IMPORT_FILE_CALLBACK pfImportFile,\n                                     _In_opt_ PF_DETOUR_IMPORT_FUNC_CALLBACK_EX pfImportFunc)\n{\n    PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hModule;\n    if (hModule == NULL) {\n        pDosHeader = (PIMAGE_DOS_HEADER)GetModuleHandleW(NULL);\n    }\n\n    __try {\n#pragma warning(suppress:6011) // GetModuleHandleW(NULL) never returns NULL.\n        if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) {\n            SetLastError(ERROR_BAD_EXE_FORMAT);\n            return FALSE;\n        }\n\n        PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)((PBYTE)pDosHeader +\n                                                          pDosHeader->e_lfanew);\n        if (pNtHeader->Signature != IMAGE_NT_SIGNATURE) {\n            SetLastError(ERROR_INVALID_EXE_SIGNATURE);\n            return FALSE;\n        }\n        if (pNtHeader->FileHeader.SizeOfOptionalHeader == 0) {\n            SetLastError(ERROR_EXE_MARKED_INVALID);\n            return FALSE;\n        }\n\n        PIMAGE_IMPORT_DESCRIPTOR iidp\n            = (PIMAGE_IMPORT_DESCRIPTOR)\n            RvaAdjust(pDosHeader,\n                      pNtHeader->OptionalHeader\n                      .DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);\n\n        if (iidp == NULL) {\n            SetLastError(ERROR_EXE_MARKED_INVALID);\n            return FALSE;\n        }\n\n        for (; iidp->OriginalFirstThunk != 0; iidp++) {\n\n            PCSTR pszName = (PCHAR)RvaAdjust(pDosHeader, iidp->Name);\n            if (pszName == NULL) {\n                SetLastError(ERROR_EXE_MARKED_INVALID);\n                return FALSE;\n            }\n\n            PIMAGE_THUNK_DATA pThunks = (PIMAGE_THUNK_DATA)\n                RvaAdjust(pDosHeader, iidp->OriginalFirstThunk);\n            PVOID * pAddrs = (PVOID *)\n                RvaAdjust(pDosHeader, iidp->FirstThunk);\n\n            HMODULE hFile = DetourGetContainingModule(pAddrs[0]);\n\n            if (pfImportFile != NULL) {\n                if (!pfImportFile(pContext, hFile, pszName)) {\n                    break;\n                }\n            }\n\n            DWORD nNames = 0;\n            if (pThunks) {\n                for (; pThunks[nNames].u1.Ordinal; nNames++) {\n                    DWORD nOrdinal = 0;\n                    PCSTR pszFunc = NULL;\n\n                    if (IMAGE_SNAP_BY_ORDINAL(pThunks[nNames].u1.Ordinal)) {\n                        nOrdinal = (DWORD)IMAGE_ORDINAL(pThunks[nNames].u1.Ordinal);\n                    }\n                    else {\n                        pszFunc = (PCSTR)RvaAdjust(pDosHeader,\n                                                   (DWORD)pThunks[nNames].u1.AddressOfData + 2);\n                    }\n\n                    if (pfImportFunc != NULL) {\n                        if (!pfImportFunc(pContext,\n                                          nOrdinal,\n                                          pszFunc,\n                                          &pAddrs[nNames])) {\n                            break;\n                        }\n                    }\n                }\n                if (pfImportFunc != NULL) {\n                    pfImportFunc(pContext, 0, NULL, NULL);\n                }\n            }\n        }\n        if (pfImportFile != NULL) {\n            pfImportFile(pContext, NULL, NULL);\n        }\n        SetLastError(NO_ERROR);\n        return TRUE;\n    }\n    __except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?\n             EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {\n        SetLastError(ERROR_EXE_MARKED_INVALID);\n        return FALSE;\n    }\n}\n\n// Context for DetourEnumerateImportsThunk, which adapts \"regular\" callbacks for use with \"Ex\".\nstruct _DETOUR_ENUMERATE_IMPORTS_THUNK_CONTEXT\n{\n    PVOID pContext;\n    PF_DETOUR_IMPORT_FUNC_CALLBACK pfImportFunc;\n};\n\n// Callback for DetourEnumerateImportsEx that adapts DetourEnumerateImportsEx\n// for use with a DetourEnumerateImports callback -- derefence the IAT and pass the value on.\n\nstatic\nBOOL\nCALLBACK\nDetourEnumerateImportsThunk(_In_ PVOID VoidContext,\n                            _In_ DWORD nOrdinal,\n                            _In_opt_ PCSTR pszFunc,\n                            _In_opt_ PVOID* ppvFunc)\n{\n    _DETOUR_ENUMERATE_IMPORTS_THUNK_CONTEXT const * const\n        pContext = (_DETOUR_ENUMERATE_IMPORTS_THUNK_CONTEXT*)VoidContext;\n    return pContext->pfImportFunc(pContext->pContext, nOrdinal, pszFunc, ppvFunc ? *ppvFunc : NULL);\n}\n\nBOOL WINAPI DetourEnumerateImports(_In_opt_ HMODULE hModule,\n                                   _In_opt_ PVOID pContext,\n                                   _In_opt_ PF_DETOUR_IMPORT_FILE_CALLBACK pfImportFile,\n                                   _In_opt_ PF_DETOUR_IMPORT_FUNC_CALLBACK pfImportFunc)\n{\n    _DETOUR_ENUMERATE_IMPORTS_THUNK_CONTEXT const context = { pContext, pfImportFunc };\n\n    return DetourEnumerateImportsEx(hModule,\n                                    (PVOID)&context,\n                                    pfImportFile,\n                                    &DetourEnumerateImportsThunk);\n}\n\nstatic PDETOUR_LOADED_BINARY WINAPI GetPayloadSectionFromModule(HMODULE hModule)\n{\n    PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hModule;\n    if (hModule == NULL) {\n        pDosHeader = (PIMAGE_DOS_HEADER)GetModuleHandleW(NULL);\n    }\n\n    __try {\n#pragma warning(suppress:6011) // GetModuleHandleW(NULL) never returns NULL.\n        if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) {\n            SetLastError(ERROR_BAD_EXE_FORMAT);\n            return NULL;\n        }\n\n        PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)((PBYTE)pDosHeader +\n                                                          pDosHeader->e_lfanew);\n        if (pNtHeader->Signature != IMAGE_NT_SIGNATURE) {\n            SetLastError(ERROR_INVALID_EXE_SIGNATURE);\n            return NULL;\n        }\n        if (pNtHeader->FileHeader.SizeOfOptionalHeader == 0) {\n            SetLastError(ERROR_EXE_MARKED_INVALID);\n            return NULL;\n        }\n\n        PIMAGE_SECTION_HEADER pSectionHeaders\n            = (PIMAGE_SECTION_HEADER)((PBYTE)pNtHeader\n                                      + sizeof(pNtHeader->Signature)\n                                      + sizeof(pNtHeader->FileHeader)\n                                      + pNtHeader->FileHeader.SizeOfOptionalHeader);\n\n        for (DWORD n = 0; n < pNtHeader->FileHeader.NumberOfSections; n++) {\n            if (strcmp((PCHAR)pSectionHeaders[n].Name, \".detour\") == 0) {\n                if (pSectionHeaders[n].VirtualAddress == 0 ||\n                    pSectionHeaders[n].SizeOfRawData == 0) {\n\n                    break;\n                }\n\n                PBYTE pbData = (PBYTE)pDosHeader + pSectionHeaders[n].VirtualAddress;\n                DETOUR_SECTION_HEADER *pHeader = (DETOUR_SECTION_HEADER *)pbData;\n                if (pHeader->cbHeaderSize < sizeof(DETOUR_SECTION_HEADER) ||\n                    pHeader->nSignature != DETOUR_SECTION_HEADER_SIGNATURE) {\n\n                    break;\n                }\n\n                if (pHeader->nDataOffset == 0) {\n                    pHeader->nDataOffset = pHeader->cbHeaderSize;\n                }\n                SetLastError(NO_ERROR);\n                return (PBYTE)pHeader;\n            }\n        }\n        SetLastError(ERROR_EXE_MARKED_INVALID);\n        return NULL;\n    }\n    __except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?\n             EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {\n        SetLastError(ERROR_EXE_MARKED_INVALID);\n        return NULL;\n    }\n}\n\nDWORD WINAPI DetourGetSizeOfPayloads(_In_opt_ HMODULE hModule)\n{\n    PDETOUR_LOADED_BINARY pBinary = GetPayloadSectionFromModule(hModule);\n    if (pBinary == NULL) {\n        // Error set by GetPayloadSectionFromModule.\n        return 0;\n    }\n\n    __try {\n        DETOUR_SECTION_HEADER *pHeader = (DETOUR_SECTION_HEADER *)pBinary;\n        if (pHeader->cbHeaderSize < sizeof(DETOUR_SECTION_HEADER) ||\n            pHeader->nSignature != DETOUR_SECTION_HEADER_SIGNATURE) {\n\n            SetLastError(ERROR_INVALID_HANDLE);\n            return 0;\n        }\n        SetLastError(NO_ERROR);\n        return pHeader->cbDataSize;\n    }\n    __except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?\n             EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {\n        SetLastError(ERROR_INVALID_HANDLE);\n        return 0;\n    }\n}\n\n_Writable_bytes_(*pcbData)\n_Readable_bytes_(*pcbData)\n_Success_(return != NULL)\nPVOID WINAPI DetourFindPayload(_In_opt_ HMODULE hModule,\n                               _In_ REFGUID rguid,\n                               _Out_ DWORD *pcbData)\n{\n    PBYTE pbData = NULL;\n    if (pcbData) {\n        *pcbData = 0;\n    }\n\n    PDETOUR_LOADED_BINARY pBinary = GetPayloadSectionFromModule(hModule);\n    if (pBinary == NULL) {\n        // Error set by GetPayloadSectionFromModule.\n        return NULL;\n    }\n\n    __try {\n        DETOUR_SECTION_HEADER *pHeader = (DETOUR_SECTION_HEADER *)pBinary;\n        if (pHeader->cbHeaderSize < sizeof(DETOUR_SECTION_HEADER) ||\n            pHeader->nSignature != DETOUR_SECTION_HEADER_SIGNATURE) {\n\n            SetLastError(ERROR_INVALID_EXE_SIGNATURE);\n            return NULL;\n        }\n\n        PBYTE pbBeg = ((PBYTE)pHeader) + pHeader->nDataOffset;\n        PBYTE pbEnd = ((PBYTE)pHeader) + pHeader->cbDataSize;\n\n        for (pbData = pbBeg; pbData < pbEnd;) {\n            DETOUR_SECTION_RECORD *pSection = (DETOUR_SECTION_RECORD *)pbData;\n\n            if (pSection->guid.Data1 == rguid.Data1 &&\n                pSection->guid.Data2 == rguid.Data2 &&\n                pSection->guid.Data3 == rguid.Data3 &&\n                pSection->guid.Data4[0] == rguid.Data4[0] &&\n                pSection->guid.Data4[1] == rguid.Data4[1] &&\n                pSection->guid.Data4[2] == rguid.Data4[2] &&\n                pSection->guid.Data4[3] == rguid.Data4[3] &&\n                pSection->guid.Data4[4] == rguid.Data4[4] &&\n                pSection->guid.Data4[5] == rguid.Data4[5] &&\n                pSection->guid.Data4[6] == rguid.Data4[6] &&\n                pSection->guid.Data4[7] == rguid.Data4[7]) {\n\n                if (pcbData) {\n                    *pcbData = pSection->cbBytes - sizeof(*pSection);\n                }\n                SetLastError(NO_ERROR);\n                return (PBYTE)(pSection + 1);\n            }\n\n            pbData = (PBYTE)pSection + pSection->cbBytes;\n        }\n        SetLastError(ERROR_INVALID_HANDLE);\n        return NULL;\n    }\n    __except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?\n             EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {\n        SetLastError(ERROR_INVALID_HANDLE);\n        return NULL;\n    }\n}\n\n_Writable_bytes_(*pcbData)\n_Readable_bytes_(*pcbData)\n_Success_(return != NULL)\nPVOID WINAPI DetourFindPayloadEx(_In_ REFGUID rguid,\n                                 _Out_ DWORD * pcbData)\n{\n    for (HMODULE hMod = NULL; (hMod = DetourEnumerateModules(hMod)) != NULL;) {\n        PVOID pvData;\n\n        pvData = DetourFindPayload(hMod, rguid, pcbData);\n        if (pvData != NULL) {\n            return pvData;\n        }\n    }\n    SetLastError(ERROR_MOD_NOT_FOUND);\n    return NULL;\n}\n\nBOOL WINAPI DetourRestoreAfterWithEx(_In_reads_bytes_(cbData) PVOID pvData,\n                                     _In_ DWORD cbData)\n{\n    PDETOUR_EXE_RESTORE pder = (PDETOUR_EXE_RESTORE)pvData;\n\n    if (pder->cb != sizeof(*pder) || pder->cb > cbData) {\n        SetLastError(ERROR_BAD_EXE_FORMAT);\n        return FALSE;\n    }\n\n    DWORD dwPermIdh = ~0u;\n    DWORD dwPermInh = ~0u;\n    DWORD dwPermClr = ~0u;\n    DWORD dwIgnore;\n    BOOL fSucceeded = FALSE;\n    BOOL fUpdated32To64 = FALSE;\n\n    if (pder->pclr != NULL && pder->clr.Flags != ((PDETOUR_CLR_HEADER)pder->pclr)->Flags) {\n        // If we had to promote the 32/64-bit agnostic IL to 64-bit, we can't restore\n        // that.\n        fUpdated32To64 = TRUE;\n    }\n\n    if (DetourVirtualProtectSameExecute(pder->pidh, pder->cbidh,\n                                        PAGE_EXECUTE_READWRITE, &dwPermIdh)) {\n        if (DetourVirtualProtectSameExecute(pder->pinh, pder->cbinh,\n                                            PAGE_EXECUTE_READWRITE, &dwPermInh)) {\n\n            CopyMemory(pder->pidh, &pder->idh, pder->cbidh);\n            CopyMemory(pder->pinh, &pder->inh, pder->cbinh);\n\n            if (pder->pclr != NULL && !fUpdated32To64) {\n                if (DetourVirtualProtectSameExecute(pder->pclr, pder->cbclr,\n                                                    PAGE_EXECUTE_READWRITE, &dwPermClr)) {\n                    CopyMemory(pder->pclr, &pder->clr, pder->cbclr);\n                    VirtualProtect(pder->pclr, pder->cbclr, dwPermClr, &dwIgnore);\n                    fSucceeded = TRUE;\n                }\n            }\n            else {\n                fSucceeded = TRUE;\n            }\n            VirtualProtect(pder->pinh, pder->cbinh, dwPermInh, &dwIgnore);\n        }\n        VirtualProtect(pder->pidh, pder->cbidh, dwPermIdh, &dwIgnore);\n    }\n    return fSucceeded;\n}\n\nBOOL WINAPI DetourRestoreAfterWith()\n{\n    PVOID pvData;\n    DWORD cbData;\n\n    pvData = DetourFindPayloadEx(DETOUR_EXE_RESTORE_GUID, &cbData);\n\n    if (pvData != NULL && cbData != 0) {\n        return DetourRestoreAfterWithEx(pvData, cbData);\n    }\n    SetLastError(ERROR_MOD_NOT_FOUND);\n    return FALSE;\n}\n\n//  End of File\n"
  },
  {
    "path": "ext/detours/src/uimports.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\n//\n//  Add DLLs to a module import table (uimports.cpp of detours.lib)\n//\n//  Microsoft Research Detours Package, Version 4.0.1\n//\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\n//\n//  Note that this file is included into creatwth.cpp one or more times\n//  (once for each supported module format).\n//\n\n#if DETOURS_VERSION != 0x4c0c1   // 0xMAJORcMINORcPATCH\n#error detours.h version mismatch\n#endif\n\n// UpdateImports32 aka UpdateImports64\nstatic BOOL UPDATE_IMPORTS_XX(HANDLE hProcess,\n                              HMODULE hModule,\n                              __in_ecount(nDlls) LPCSTR *plpDlls,\n                              DWORD nDlls)\n{\n    BOOL fSucceeded = FALSE;\n    DWORD cbNew = 0;\n\n    BYTE * pbNew = NULL;\n    DWORD i;\n    SIZE_T cbRead;\n    DWORD n;\n\n    PBYTE pbModule = (PBYTE)hModule;\n\n    IMAGE_DOS_HEADER idh;\n    ZeroMemory(&idh, sizeof(idh));\n    if (!ReadProcessMemory(hProcess, pbModule, &idh, sizeof(idh), &cbRead)\n        || cbRead < sizeof(idh)) {\n\n        DETOUR_TRACE((\"ReadProcessMemory(idh@%p..%p) failed: %d\\n\",\n                      pbModule, pbModule + sizeof(idh), GetLastError()));\n\n      finish:\n        if (pbNew != NULL) {\n            delete[] pbNew;\n            pbNew = NULL;\n        }\n        return fSucceeded;\n    }\n\n    IMAGE_NT_HEADERS_XX inh;\n    ZeroMemory(&inh, sizeof(inh));\n\n    if (!ReadProcessMemory(hProcess, pbModule + idh.e_lfanew, &inh, sizeof(inh), &cbRead)\n        || cbRead < sizeof(inh)) {\n        DETOUR_TRACE((\"ReadProcessMemory(inh@%p..%p) failed: %d\\n\",\n                      pbModule + idh.e_lfanew,\n                      pbModule + idh.e_lfanew + sizeof(inh),\n                      GetLastError()));\n        goto finish;\n    }\n\n    if (inh.OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR_MAGIC_XX) {\n        DETOUR_TRACE((\"Wrong size image (%04x != %04x).\\n\",\n                      inh.OptionalHeader.Magic, IMAGE_NT_OPTIONAL_HDR_MAGIC_XX));\n        SetLastError(ERROR_INVALID_BLOCK);\n        goto finish;\n    }\n\n    // Zero out the bound table so loader doesn't use it instead of our new table.\n    inh.BOUND_DIRECTORY.VirtualAddress = 0;\n    inh.BOUND_DIRECTORY.Size = 0;\n\n    // Find the size of the mapped file.\n    DWORD dwSec = idh.e_lfanew +\n        FIELD_OFFSET(IMAGE_NT_HEADERS_XX, OptionalHeader) +\n        inh.FileHeader.SizeOfOptionalHeader;\n\n    for (i = 0; i < inh.FileHeader.NumberOfSections; i++) {\n        IMAGE_SECTION_HEADER ish;\n        ZeroMemory(&ish, sizeof(ish));\n\n        if (!ReadProcessMemory(hProcess, pbModule + dwSec + sizeof(ish) * i, &ish,\n                               sizeof(ish), &cbRead)\n            || cbRead < sizeof(ish)) {\n\n            DETOUR_TRACE((\"ReadProcessMemory(ish@%p..%p) failed: %d\\n\",\n                          pbModule + dwSec + sizeof(ish) * i,\n                          pbModule + dwSec + sizeof(ish) * (i + 1),\n                          GetLastError()));\n            goto finish;\n        }\n\n        DETOUR_TRACE((\"ish[%d] : va=%08x sr=%d\\n\", i, ish.VirtualAddress, ish.SizeOfRawData));\n        \n        // If the linker didn't suggest an IAT in the data directories, the\n        // loader will look for the section of the import directory to be used\n        // for this instead. Since we put out new IMPORT_DIRECTORY outside any\n        // section boundary, the loader will not find it. So we provide one\n        // explicitly to avoid the search.\n        //\n        if (inh.IAT_DIRECTORY.VirtualAddress == 0 &&\n            inh.IMPORT_DIRECTORY.VirtualAddress >= ish.VirtualAddress &&\n            inh.IMPORT_DIRECTORY.VirtualAddress < ish.VirtualAddress + ish.SizeOfRawData) {\n\n            inh.IAT_DIRECTORY.VirtualAddress = ish.VirtualAddress;\n            inh.IAT_DIRECTORY.Size = ish.SizeOfRawData;\n        }\n    }\n\n    DETOUR_TRACE((\"     Imports: %p..%p\\n\",\n                  (DWORD_PTR)pbModule + inh.IMPORT_DIRECTORY.VirtualAddress,\n                  (DWORD_PTR)pbModule + inh.IMPORT_DIRECTORY.VirtualAddress +\n                  inh.IMPORT_DIRECTORY.Size));\n\n    DWORD nOldDlls = inh.IMPORT_DIRECTORY.Size / sizeof(IMAGE_IMPORT_DESCRIPTOR);\n    DWORD obRem = sizeof(IMAGE_IMPORT_DESCRIPTOR) * nDlls;\n    DWORD obOld = obRem + sizeof(IMAGE_IMPORT_DESCRIPTOR) * nOldDlls;\n    DWORD obTab = PadToDwordPtr(obOld);\n    DWORD obDll = obTab + sizeof(DWORD_XX) * 4 * nDlls;\n    DWORD obStr = obDll;\n    cbNew = obStr;\n    for (n = 0; n < nDlls; n++) {\n        cbNew += PadToDword((DWORD)strlen(plpDlls[n]) + 1);\n    }\n\n    _Analysis_assume_(cbNew >\n                      sizeof(IMAGE_IMPORT_DESCRIPTOR) * (nDlls + nOldDlls)\n                      + sizeof(DWORD_XX) * 4 * nDlls);\n    pbNew = new BYTE [cbNew];\n    if (pbNew == NULL) {\n        DETOUR_TRACE((\"new BYTE [cbNew] failed.\\n\"));\n        goto finish;\n    }\n    ZeroMemory(pbNew, cbNew);\n\n    PBYTE pbBase = pbModule;\n    PBYTE pbNext = pbBase\n        + inh.OptionalHeader.BaseOfCode\n        + inh.OptionalHeader.SizeOfCode\n        + inh.OptionalHeader.SizeOfInitializedData\n        + inh.OptionalHeader.SizeOfUninitializedData;\n    if (pbBase < pbNext) {\n        pbBase = pbNext;\n    }\n    DETOUR_TRACE((\"pbBase = %p\\n\", pbBase));\n\n    PBYTE pbNewIid = FindAndAllocateNearBase(hProcess, pbModule, pbBase, cbNew);\n    if (pbNewIid == NULL) {\n        DETOUR_TRACE((\"FindAndAllocateNearBase failed.\\n\"));\n        goto finish;\n    }\n\n    PIMAGE_IMPORT_DESCRIPTOR piid = (PIMAGE_IMPORT_DESCRIPTOR)pbNew;\n    IMAGE_THUNK_DATAXX *pt = NULL;\n\n    DWORD obBase = (DWORD)(pbNewIid - pbModule);\n    DWORD dwProtect = 0;\n\n    if (inh.IMPORT_DIRECTORY.VirtualAddress != 0) {\n        // Read the old import directory if it exists.\n        DETOUR_TRACE((\"IMPORT_DIRECTORY perms=%x\\n\", dwProtect));\n\n        if (!ReadProcessMemory(hProcess,\n                               pbModule + inh.IMPORT_DIRECTORY.VirtualAddress,\n                               &piid[nDlls],\n                               nOldDlls * sizeof(IMAGE_IMPORT_DESCRIPTOR), &cbRead)\n            || cbRead < nOldDlls * sizeof(IMAGE_IMPORT_DESCRIPTOR)) {\n\n            DETOUR_TRACE((\"ReadProcessMemory(imports) failed: %d\\n\", GetLastError()));\n            goto finish;\n        }\n    }\n\n    for (n = 0; n < nDlls; n++) {\n        HRESULT hrRet = StringCchCopyA((char*)pbNew + obStr, cbNew - obStr, plpDlls[n]);\n        if (FAILED(hrRet)) {\n            DETOUR_TRACE((\"StringCchCopyA failed: %d\\n\", GetLastError()));\n            goto finish;\n        }\n\n        // After copying the string, we patch up the size \"??\" bits if any.\n        hrRet = ReplaceOptionalSizeA((char*)pbNew + obStr,\n                                     cbNew - obStr,\n                                     DETOURS_STRINGIFY(DETOURS_BITS_XX));\n        if (FAILED(hrRet)) {\n            DETOUR_TRACE((\"ReplaceOptionalSizeA failed: %d\\n\", GetLastError()));\n            goto finish;\n        }\n\n        DWORD nOffset = obTab + (sizeof(IMAGE_THUNK_DATAXX) * (4 * n));\n        piid[n].OriginalFirstThunk = obBase + nOffset;\n      \n        // We need 2 thunks for the import table and 2 thunks for the IAT.\n        // One for an ordinal import and one to mark the end of the list.\n\t  pt = ((IMAGE_THUNK_DATAXX*)(pbNew + nOffset));\n        pt[0].u1.Ordinal = IMAGE_ORDINAL_FLAG_XX + 1;\n        pt[1].u1.Ordinal = 0;\n\n        nOffset = obTab + (sizeof(IMAGE_THUNK_DATAXX) * ((4 * n) + 2));\n        piid[n].FirstThunk = obBase + nOffset;\n        pt = ((IMAGE_THUNK_DATAXX*)(pbNew + nOffset));\n        pt[0].u1.Ordinal = IMAGE_ORDINAL_FLAG_XX + 1;\n        pt[1].u1.Ordinal = 0;\n        piid[n].TimeDateStamp = 0;\n        piid[n].ForwarderChain = 0;\n        piid[n].Name = obBase + obStr;\n\n        obStr += PadToDword((DWORD)strlen(plpDlls[n]) + 1);\n    }\n    _Analysis_assume_(obStr <= cbNew);\n\n#if 0\n    for (i = 0; i < nDlls + nOldDlls; i++) {\n        DETOUR_TRACE((\"%8d. Look=%08x Time=%08x Fore=%08x Name=%08x Addr=%08x\\n\",\n                      i,\n                      piid[i].OriginalFirstThunk,\n                      piid[i].TimeDateStamp,\n                      piid[i].ForwarderChain,\n                      piid[i].Name,\n                      piid[i].FirstThunk));\n        if (piid[i].OriginalFirstThunk == 0 && piid[i].FirstThunk == 0) {\n            break;\n        }\n    }\n#endif\n\n    if (!WriteProcessMemory(hProcess, pbNewIid, pbNew, obStr, NULL)) {\n        DETOUR_TRACE((\"WriteProcessMemory(iid) failed: %d\\n\", GetLastError()));\n        goto finish;\n    }\n\n    DETOUR_TRACE((\"obBaseBef = %08x..%08x\\n\",\n                  inh.IMPORT_DIRECTORY.VirtualAddress,\n                  inh.IMPORT_DIRECTORY.VirtualAddress + inh.IMPORT_DIRECTORY.Size));\n    DETOUR_TRACE((\"obBaseAft = %08x..%08x\\n\", obBase, obBase + obStr));\n\n    // In this case the file didn't have an import directory in first place,\n    // so we couldn't fix the missing IAT above. We still need to explicitly\n    // provide an IAT to prevent to loader from looking for one.\n    //\n    if (inh.IAT_DIRECTORY.VirtualAddress == 0) {\n        inh.IAT_DIRECTORY.VirtualAddress = obBase;\n        inh.IAT_DIRECTORY.Size = cbNew;\n    }\n\n    inh.IMPORT_DIRECTORY.VirtualAddress = obBase;\n    inh.IMPORT_DIRECTORY.Size = cbNew;\n\n    /////////////////////// Update the NT header for the new import directory.\n    //\n    if (!DetourVirtualProtectSameExecuteEx(hProcess, pbModule, inh.OptionalHeader.SizeOfHeaders,\n                                           PAGE_EXECUTE_READWRITE, &dwProtect)) {\n        DETOUR_TRACE((\"VirtualProtectEx(inh) write failed: %d\\n\", GetLastError()));\n        goto finish;\n    }\n\n    inh.OptionalHeader.CheckSum = 0;\n\n    if (!WriteProcessMemory(hProcess, pbModule, &idh, sizeof(idh), NULL)) {\n        DETOUR_TRACE((\"WriteProcessMemory(idh) failed: %d\\n\", GetLastError()));\n        goto finish;\n    }\n    DETOUR_TRACE((\"WriteProcessMemory(idh:%p..%p)\\n\", pbModule, pbModule + sizeof(idh)));\n\n    if (!WriteProcessMemory(hProcess, pbModule + idh.e_lfanew, &inh, sizeof(inh), NULL)) {\n        DETOUR_TRACE((\"WriteProcessMemory(inh) failed: %d\\n\", GetLastError()));\n        goto finish;\n    }\n    DETOUR_TRACE((\"WriteProcessMemory(inh:%p..%p)\\n\",\n                  pbModule + idh.e_lfanew,\n                  pbModule + idh.e_lfanew + sizeof(inh)));\n\n    if (!VirtualProtectEx(hProcess, pbModule, inh.OptionalHeader.SizeOfHeaders,\n                          dwProtect, &dwProtect)) {\n        DETOUR_TRACE((\"VirtualProtectEx(idh) restore failed: %d\\n\", GetLastError()));\n        goto finish;\n    }\n\n    fSucceeded = TRUE;\n    goto finish;\n}\n"
  },
  {
    "path": "ext/detours/system.mak",
    "content": "##############################################################################\n##\n##  Establish build target type for Detours.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\n############################################## Determine Processor Build Type.\n#\n# Default the detours architecture to match the compiler target that\n# has been selected by the user via the VS Developer Command Prompt\n# they launched.\n!IF \"$(DETOURS_TARGET_PROCESSOR)\" == \"\" && \"$(VSCMD_ARG_TGT_ARCH)\" != \"\"\nDETOURS_TARGET_PROCESSOR = $(VSCMD_ARG_TGT_ARCH)\n!ENDIF\n\n!IF \"$(DETOURS_TARGET_PROCESSOR)\" == \"\" && \"$(PROCESSOR_ARCHITEW6432)\" != \"\"\nDETOURS_TARGET_PROCESSOR = X86\n!ENDIF\n\n!IF \"$(DETOURS_TARGET_PROCESSOR)\" == \"\"\nDETOURS_TARGET_PROCESSOR = $(PROCESSOR_ARCHITECTURE)\n!ENDIF\n\n# Uppercase DETOURS_TARGET_PROCESSOR\nDETOURS_TARGET_PROCESSOR=$(DETOURS_TARGET_PROCESSOR:a=A)\nDETOURS_TARGET_PROCESSOR=$(DETOURS_TARGET_PROCESSOR:b=B)\nDETOURS_TARGET_PROCESSOR=$(DETOURS_TARGET_PROCESSOR:c=C)\nDETOURS_TARGET_PROCESSOR=$(DETOURS_TARGET_PROCESSOR:d=D)\nDETOURS_TARGET_PROCESSOR=$(DETOURS_TARGET_PROCESSOR:e=E)\nDETOURS_TARGET_PROCESSOR=$(DETOURS_TARGET_PROCESSOR:f=F)\nDETOURS_TARGET_PROCESSOR=$(DETOURS_TARGET_PROCESSOR:g=G)\nDETOURS_TARGET_PROCESSOR=$(DETOURS_TARGET_PROCESSOR:h=H)\nDETOURS_TARGET_PROCESSOR=$(DETOURS_TARGET_PROCESSOR:i=I)\nDETOURS_TARGET_PROCESSOR=$(DETOURS_TARGET_PROCESSOR:j=J)\nDETOURS_TARGET_PROCESSOR=$(DETOURS_TARGET_PROCESSOR:k=K)\nDETOURS_TARGET_PROCESSOR=$(DETOURS_TARGET_PROCESSOR:l=L)\nDETOURS_TARGET_PROCESSOR=$(DETOURS_TARGET_PROCESSOR:m=M)\nDETOURS_TARGET_PROCESSOR=$(DETOURS_TARGET_PROCESSOR:n=N)\nDETOURS_TARGET_PROCESSOR=$(DETOURS_TARGET_PROCESSOR:o=O)\nDETOURS_TARGET_PROCESSOR=$(DETOURS_TARGET_PROCESSOR:p=P)\nDETOURS_TARGET_PROCESSOR=$(DETOURS_TARGET_PROCESSOR:q=Q)\nDETOURS_TARGET_PROCESSOR=$(DETOURS_TARGET_PROCESSOR:r=R)\nDETOURS_TARGET_PROCESSOR=$(DETOURS_TARGET_PROCESSOR:s=S)\nDETOURS_TARGET_PROCESSOR=$(DETOURS_TARGET_PROCESSOR:t=T)\nDETOURS_TARGET_PROCESSOR=$(DETOURS_TARGET_PROCESSOR:u=U)\nDETOURS_TARGET_PROCESSOR=$(DETOURS_TARGET_PROCESSOR:v=V)\nDETOURS_TARGET_PROCESSOR=$(DETOURS_TARGET_PROCESSOR:w=W)\nDETOURS_TARGET_PROCESSOR=$(DETOURS_TARGET_PROCESSOR:x=X)\nDETOURS_TARGET_PROCESSOR=$(DETOURS_TARGET_PROCESSOR:y=Y)\nDETOURS_TARGET_PROCESSOR=$(DETOURS_TARGET_PROCESSOR:z=Z)\n\n!IF \"$(DETOURS_TARGET_PROCESSOR)\" == \"AMD64\"\nDETOURS_TARGET_PROCESSOR = X64\n!ENDIF\n\n\n!if \"$(DETOURS_TARGET_PROCESSOR:64=)\" == \"$(DETOURS_TARGET_PROCESSOR)\"\nDETOURS_32BIT=1\nDETOURS_BITS=32\n!else\nDETOURS_64BIT=1\nDETOURS_BITS=64\n!endif\n\n########################################## Configure build based on Processor.\n##\n## DETOURS_OPTION_PROCESSOR: Set this macro if the processor *will* run code\n##                           from another ISA (i.e. x86 on x64).\n##\n##      DETOURS_OPTION_BITS: Set this macro if the processor *may* have\n##                           an alternative word size.\n##\n!IF \"$(DETOURS_TARGET_PROCESSOR)\" == \"X64\"\n#!MESSAGE Building for 64-bit X64.\nDETOURS_SOURCE_BROWSING = 0\nDETOURS_OPTION_PROCESSOR=X86\nDETOURS_OPTION_BITS=32\n!ELSEIF \"$(DETOURS_TARGET_PROCESSOR)\" == \"IA64\"\n#!MESSAGE Building for 64-bit IA64.\nDETOURS_OPTION_PROCESSOR=X86\nDETOURS_OPTION_BITS=32\n!ELSEIF \"$(DETOURS_TARGET_PROCESSOR)\" == \"X86\"\n#!MESSAGE Building for 32-bit X86.\nDETOURS_OPTION_BITS=64\n# Don't set DETOURS_OPTION_PROCESSOR for x64 because we don't *know* that\n# we'll run on a 64-bit machine.\n!ELSEIF \"$(DETOURS_TARGET_PROCESSOR)\" == \"ARM\"\n#!MESSAGE Building for 32-bit ARM.\n!ELSEIF \"$(DETOURS_TARGET_PROCESSOR)\" == \"ARM64\"\n#!MESSAGE Building for 64-bit ARM.\n!ELSE\n!MESSAGE Note: To select the target processor architecture set either\n!MESSAGE       PROCESSOR_ARCHITECTURE or DETOURS_TARGET_PROCESSOR.\n!MESSAGE\n!ERROR Unknown target processor: \"$(DETOURS_TARGET_PROCESSOR)\"\n!ENDIF\n\n##############################################################################\n##\nINCD = $(ROOT)\\include\nLIBD = $(ROOT)\\lib.$(DETOURS_TARGET_PROCESSOR)$(DETOURS_CONFIG)\nBIND = $(ROOT)\\bin.$(DETOURS_TARGET_PROCESSOR)$(DETOURS_CONFIG)\nOBJD = obj.$(DETOURS_TARGET_PROCESSOR)$(DETOURS_CONFIG)\n!IF \"$(DETOURS_OPTION_PROCESSOR)\" != \"\"\nOPTD = $(ROOT)\\bin.$(DETOURS_OPTION_PROCESSOR)$(DETOURS_CONFIG)\n!ENDIF\n\nINCDS = $(ROOT)\\include\n\nLIBDS = \\\n        $(ROOT)\\lib.x86$(DETOURS_CONFIG) \\\n        $(ROOT)\\lib.x64$(DETOURS_CONFIG) \\\n        $(ROOT)\\lib.ia64$(DETOURS_CONFIG) \\\n        $(ROOT)\\lib.arm$(DETOURS_CONFIG) \\\n        $(ROOT)\\lib.arm64$(DETOURS_CONFIG) \\\n\nBINDS = \\\n        $(ROOT)\\bin.x86$(DETOURS_CONFIG) \\\n        $(ROOT)\\bin.x64$(DETOURS_CONFIG) \\\n        $(ROOT)\\bin.ia64$(DETOURS_CONFIG) \\\n        $(ROOT)\\bin.arm$(DETOURS_CONFIG) \\\n        $(ROOT)\\bin.arm64$(DETOURS_CONFIG) \\\n\nOBJDS = \\\n        obj.x86$(DETOURS_CONFIG) \\\n        obj.x64$(DETOURS_CONFIG) \\\n        obj.ia64$(DETOURS_CONFIG) \\\n        obj.arm$(DETOURS_CONFIG) \\\n        obj.arm64$(DETOURS_CONFIG) \\\n\n##############################################################################\n"
  },
  {
    "path": "ext/detours/tests/Makefile",
    "content": "##############################################################################\n##\n##  Detours Unit Tests.\n##\n##  Microsoft Research Detours Package\n##\n##  Copyright (c) Microsoft Corporation.  All rights reserved.\n##\n\nROOT = ..\n!include ..\\samples\\common.mak\n\nDEPS = $(LIBD)\\detours.lib\nLIBS=$(LIBS) kernel32.lib\nCFLAGS=$(CFLAGS) /EHsc /DCATCH_CONFIG_NO_WINDOWS_SEH\n\n##############################################################################\n\nall: dirs \\\n    $(BIND)\\unittests.exe \\\n    \\\n\n##############################################################################\n\ndirs:\n    @if not exist $(BIND) mkdir $(BIND) && echo.   Created $(BIND)\n    @if not exist $(OBJD) mkdir $(OBJD) && echo.   Created $(OBJD)\n\n$(OBJD)\\main.obj : main.cpp\n$(OBJD)\\test_module_api.obj : test_module_api.cpp\n$(OBJD)\\test_image_api.obj : test_image_api.cpp\n$(OBJD)\\corruptor.obj : corruptor.cpp\n\n$(BIND)\\unittests.exe : $(OBJD)\\main.obj \\\n   \t\t\t\t\t\t$(OBJD)\\test_module_api.obj \\\n   \t\t\t\t\t\t$(OBJD)\\test_image_api.obj \\\n\t\t\t\t\t\t$(OBJD)\\corruptor.obj $(DEPS)\n    cl $(CFLAGS) /Fe$@ /Fd$(@R).pdb \\\n\t   \t$(OBJD)\\main.obj \\\n\t   \t$(OBJD)\\test_module_api.obj \\\n\t   \t$(OBJD)\\test_image_api.obj \\\n\t   \t$(OBJD)\\corruptor.obj \\\n        /link $(LINKFLAGS) $(LIBS) /subsystem:console\n\n##############################################################################\n\nclean:\n    -del *~ 2>nul\n    -del $(BIND)\\unittests*.* 2>nul\n    -rmdir /q /s $(OBJD) 2>nul\n\nrealclean: clean\n    -rmdir /q /s $(OBJDS) 2>nul\n\noption:\n##############################################################################\n\ntest: all\n\t@cls\n\t$(BIND)\\unittests.exe --reporter console --success --durations yes\n\ndebug: all\n    windbg -o $(BIND)\\unittests.exe\n\n\n################################################################# End of File.\n"
  },
  {
    "path": "ext/detours/tests/catch.hpp",
    "content": "/*\n *  Catch v2.13.0\n *  Generated: 2020-07-12 20:07:49.015950\n *  ----------------------------------------------------------\n *  This file has been merged from multiple headers. Please don't edit it directly\n *  Copyright (c) 2020 Two Blue Cubes Ltd. All rights reserved.\n *\n *  Distributed under the Boost Software License, Version 1.0. (See accompanying\n *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n */\n#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED\n#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED\n// start catch.hpp\n\n\n#define CATCH_VERSION_MAJOR 2\n#define CATCH_VERSION_MINOR 13\n#define CATCH_VERSION_PATCH 0\n\n#ifdef __clang__\n#    pragma clang system_header\n#elif defined __GNUC__\n#    pragma GCC system_header\n#endif\n\n// start catch_suppress_warnings.h\n\n#ifdef __clang__\n#   ifdef __ICC // icpc defines the __clang__ macro\n#       pragma warning(push)\n#       pragma warning(disable: 161 1682)\n#   else // __ICC\n#       pragma clang diagnostic push\n#       pragma clang diagnostic ignored \"-Wpadded\"\n#       pragma clang diagnostic ignored \"-Wswitch-enum\"\n#       pragma clang diagnostic ignored \"-Wcovered-switch-default\"\n#    endif\n#elif defined __GNUC__\n     // Because REQUIREs trigger GCC's -Wparentheses, and because still\n     // supported version of g++ have only buggy support for _Pragmas,\n     // Wparentheses have to be suppressed globally.\n#    pragma GCC diagnostic ignored \"-Wparentheses\" // See #674 for details\n\n#    pragma GCC diagnostic push\n#    pragma GCC diagnostic ignored \"-Wunused-variable\"\n#    pragma GCC diagnostic ignored \"-Wpadded\"\n#endif\n// end catch_suppress_warnings.h\n#if defined(CATCH_CONFIG_MAIN) || defined(CATCH_CONFIG_RUNNER)\n#  define CATCH_IMPL\n#  define CATCH_CONFIG_ALL_PARTS\n#endif\n\n// In the impl file, we want to have access to all parts of the headers\n// Can also be used to sanely support PCHs\n#if defined(CATCH_CONFIG_ALL_PARTS)\n#  define CATCH_CONFIG_EXTERNAL_INTERFACES\n#  if defined(CATCH_CONFIG_DISABLE_MATCHERS)\n#    undef CATCH_CONFIG_DISABLE_MATCHERS\n#  endif\n#  if !defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER)\n#    define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER\n#  endif\n#endif\n\n#if !defined(CATCH_CONFIG_IMPL_ONLY)\n// start catch_platform.h\n\n#ifdef __APPLE__\n# include <TargetConditionals.h>\n# if TARGET_OS_OSX == 1\n#  define CATCH_PLATFORM_MAC\n# elif TARGET_OS_IPHONE == 1\n#  define CATCH_PLATFORM_IPHONE\n# endif\n\n#elif defined(linux) || defined(__linux) || defined(__linux__)\n#  define CATCH_PLATFORM_LINUX\n\n#elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) || defined(__MINGW32__)\n#  define CATCH_PLATFORM_WINDOWS\n#endif\n\n// end catch_platform.h\n\n#ifdef CATCH_IMPL\n#  ifndef CLARA_CONFIG_MAIN\n#    define CLARA_CONFIG_MAIN_NOT_DEFINED\n#    define CLARA_CONFIG_MAIN\n#  endif\n#endif\n\n// start catch_user_interfaces.h\n\nnamespace Catch {\n    unsigned int rngSeed();\n}\n\n// end catch_user_interfaces.h\n// start catch_tag_alias_autoregistrar.h\n\n// start catch_common.h\n\n// start catch_compiler_capabilities.h\n\n// Detect a number of compiler features - by compiler\n// The following features are defined:\n//\n// CATCH_CONFIG_COUNTER : is the __COUNTER__ macro supported?\n// CATCH_CONFIG_WINDOWS_SEH : is Windows SEH supported?\n// CATCH_CONFIG_POSIX_SIGNALS : are POSIX signals supported?\n// CATCH_CONFIG_DISABLE_EXCEPTIONS : Are exceptions enabled?\n// ****************\n// Note to maintainers: if new toggles are added please document them\n// in configuration.md, too\n// ****************\n\n// In general each macro has a _NO_<feature name> form\n// (e.g. CATCH_CONFIG_NO_POSIX_SIGNALS) which disables the feature.\n// Many features, at point of detection, define an _INTERNAL_ macro, so they\n// can be combined, en-mass, with the _NO_ forms later.\n\n#ifdef __cplusplus\n\n#  if (__cplusplus >= 201402L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201402L)\n#    define CATCH_CPP14_OR_GREATER\n#  endif\n\n#  if (__cplusplus >= 201703L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)\n#    define CATCH_CPP17_OR_GREATER\n#  endif\n\n#endif\n\n#if defined(__cpp_lib_uncaught_exceptions)\n#  define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS\n#endif\n\n// We have to avoid both ICC and Clang, because they try to mask themselves\n// as gcc, and we want only GCC in this block\n#if defined(__GNUC__) && !defined(__clang__) && !defined(__ICC)\n#    define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( \"GCC diagnostic push\" )\n#    define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION  _Pragma( \"GCC diagnostic pop\" )\n\n#    define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__)\n\n#endif\n\n#if defined(__clang__)\n\n#    define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( \"clang diagnostic push\" )\n#    define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION  _Pragma( \"clang diagnostic pop\" )\n\n// As of this writing, IBM XL's implementation of __builtin_constant_p has a bug\n// which results in calls to destructors being emitted for each temporary,\n// without a matching initialization. In practice, this can result in something\n// like `std::string::~string` being called on an uninitialized value.\n//\n// For example, this code will likely segfault under IBM XL:\n// ```\n// REQUIRE(std::string(\"12\") + \"34\" == \"1234\")\n// ```\n//\n// Therefore, `CATCH_INTERNAL_IGNORE_BUT_WARN` is not implemented.\n#  if !defined(__ibmxl__)\n#    define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) /* NOLINT(cppcoreguidelines-pro-type-vararg, hicpp-vararg) */\n#  endif\n\n#    define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \\\n         _Pragma( \"clang diagnostic ignored \\\"-Wexit-time-destructors\\\"\" ) \\\n         _Pragma( \"clang diagnostic ignored \\\"-Wglobal-constructors\\\"\")\n\n#    define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \\\n         _Pragma( \"clang diagnostic ignored \\\"-Wparentheses\\\"\" )\n\n#    define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \\\n         _Pragma( \"clang diagnostic ignored \\\"-Wunused-variable\\\"\" )\n\n#    define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \\\n         _Pragma( \"clang diagnostic ignored \\\"-Wgnu-zero-variadic-macro-arguments\\\"\" )\n\n#    define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \\\n         _Pragma( \"clang diagnostic ignored \\\"-Wunused-template\\\"\" )\n\n#endif // __clang__\n\n////////////////////////////////////////////////////////////////////////////////\n// Assume that non-Windows platforms support posix signals by default\n#if !defined(CATCH_PLATFORM_WINDOWS)\n    #define CATCH_INTERNAL_CONFIG_POSIX_SIGNALS\n#endif\n\n////////////////////////////////////////////////////////////////////////////////\n// We know some environments not to support full POSIX signals\n#if defined(__CYGWIN__) || defined(__QNX__) || defined(__EMSCRIPTEN__) || defined(__DJGPP__)\n    #define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS\n#endif\n\n#ifdef __OS400__\n#       define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS\n#       define CATCH_CONFIG_COLOUR_NONE\n#endif\n\n////////////////////////////////////////////////////////////////////////////////\n// Android somehow still does not support std::to_string\n#if defined(__ANDROID__)\n#    define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING\n#    define CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE\n#endif\n\n////////////////////////////////////////////////////////////////////////////////\n// Not all Windows environments support SEH properly\n#if defined(__MINGW32__)\n#    define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH\n#endif\n\n////////////////////////////////////////////////////////////////////////////////\n// PS4\n#if defined(__ORBIS__)\n#    define CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE\n#endif\n\n////////////////////////////////////////////////////////////////////////////////\n// Cygwin\n#ifdef __CYGWIN__\n\n// Required for some versions of Cygwin to declare gettimeofday\n// see: http://stackoverflow.com/questions/36901803/gettimeofday-not-declared-in-this-scope-cygwin\n#   define _BSD_SOURCE\n// some versions of cygwin (most) do not support std::to_string. Use the libstd check.\n// https://gcc.gnu.org/onlinedocs/gcc-4.8.2/libstdc++/api/a01053_source.html line 2812-2813\n# if !((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \\\n           && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))\n\n#    define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING\n\n# endif\n#endif // __CYGWIN__\n\n////////////////////////////////////////////////////////////////////////////////\n// Visual C++\n#if defined(_MSC_VER)\n\n#  define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION __pragma( warning(push) )\n#  define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION  __pragma( warning(pop) )\n\n#  if _MSC_VER >= 1900 // Visual Studio 2015 or newer\n#    define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS\n#  endif\n\n// Universal Windows platform does not support SEH\n// Or console colours (or console at all...)\n#  if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP)\n#    define CATCH_CONFIG_COLOUR_NONE\n#  else\n#    define CATCH_INTERNAL_CONFIG_WINDOWS_SEH\n#  endif\n\n// MSVC traditional preprocessor needs some workaround for __VA_ARGS__\n// _MSVC_TRADITIONAL == 0 means new conformant preprocessor\n// _MSVC_TRADITIONAL == 1 means old traditional non-conformant preprocessor\n#  if !defined(__clang__) // Handle Clang masquerading for msvc\n#    if !defined(_MSVC_TRADITIONAL) || (defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL)\n#      define CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n#    endif // MSVC_TRADITIONAL\n#  endif // __clang__\n\n#endif // _MSC_VER\n\n#if defined(_REENTRANT) || defined(_MSC_VER)\n// Enable async processing, as -pthread is specified or no additional linking is required\n# define CATCH_INTERNAL_CONFIG_USE_ASYNC\n#endif // _MSC_VER\n\n////////////////////////////////////////////////////////////////////////////////\n// Check if we are compiled with -fno-exceptions or equivalent\n#if defined(__EXCEPTIONS) || defined(__cpp_exceptions) || defined(_CPPUNWIND)\n#  define CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED\n#endif\n\n////////////////////////////////////////////////////////////////////////////////\n// DJGPP\n#ifdef __DJGPP__\n#  define CATCH_INTERNAL_CONFIG_NO_WCHAR\n#endif // __DJGPP__\n\n////////////////////////////////////////////////////////////////////////////////\n// Embarcadero C++Build\n#if defined(__BORLANDC__)\n    #define CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN\n#endif\n\n////////////////////////////////////////////////////////////////////////////////\n\n// Use of __COUNTER__ is suppressed during code analysis in\n// CLion/AppCode 2017.2.x and former, because __COUNTER__ is not properly\n// handled by it.\n// Otherwise all supported compilers support COUNTER macro,\n// but user still might want to turn it off\n#if ( !defined(__JETBRAINS_IDE__) || __JETBRAINS_IDE__ >= 20170300L )\n    #define CATCH_INTERNAL_CONFIG_COUNTER\n#endif\n\n////////////////////////////////////////////////////////////////////////////////\n\n// RTX is a special version of Windows that is real time.\n// This means that it is detected as Windows, but does not provide\n// the same set of capabilities as real Windows does.\n#if defined(UNDER_RTSS) || defined(RTX64_BUILD)\n    #define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH\n    #define CATCH_INTERNAL_CONFIG_NO_ASYNC\n    #define CATCH_CONFIG_COLOUR_NONE\n#endif\n\n#if !defined(_GLIBCXX_USE_C99_MATH_TR1)\n#define CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER\n#endif\n\n// Various stdlib support checks that require __has_include\n#if defined(__has_include)\n  // Check if string_view is available and usable\n  #if __has_include(<string_view>) && defined(CATCH_CPP17_OR_GREATER)\n  #    define CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW\n  #endif\n\n  // Check if optional is available and usable\n  #  if __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER)\n  #    define CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL\n  #  endif // __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER)\n\n  // Check if byte is available and usable\n  #  if __has_include(<cstddef>) && defined(CATCH_CPP17_OR_GREATER)\n  #    define CATCH_INTERNAL_CONFIG_CPP17_BYTE\n  #  endif // __has_include(<cstddef>) && defined(CATCH_CPP17_OR_GREATER)\n\n  // Check if variant is available and usable\n  #  if __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER)\n  #    if defined(__clang__) && (__clang_major__ < 8)\n         // work around clang bug with libstdc++ https://bugs.llvm.org/show_bug.cgi?id=31852\n         // fix should be in clang 8, workaround in libstdc++ 8.2\n  #      include <ciso646>\n  #      if defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9)\n  #        define CATCH_CONFIG_NO_CPP17_VARIANT\n  #      else\n  #        define CATCH_INTERNAL_CONFIG_CPP17_VARIANT\n  #      endif // defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9)\n  #    else\n  #      define CATCH_INTERNAL_CONFIG_CPP17_VARIANT\n  #    endif // defined(__clang__) && (__clang_major__ < 8)\n  #  endif // __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER)\n#endif // defined(__has_include)\n\n#if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER)\n#   define CATCH_CONFIG_COUNTER\n#endif\n#if defined(CATCH_INTERNAL_CONFIG_WINDOWS_SEH) && !defined(CATCH_CONFIG_NO_WINDOWS_SEH) && !defined(CATCH_CONFIG_WINDOWS_SEH) && !defined(CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH)\n#   define CATCH_CONFIG_WINDOWS_SEH\n#endif\n// This is set by default, because we assume that unix compilers are posix-signal-compatible by default.\n#if defined(CATCH_INTERNAL_CONFIG_POSIX_SIGNALS) && !defined(CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_POSIX_SIGNALS)\n#   define CATCH_CONFIG_POSIX_SIGNALS\n#endif\n// This is set by default, because we assume that compilers with no wchar_t support are just rare exceptions.\n#if !defined(CATCH_INTERNAL_CONFIG_NO_WCHAR) && !defined(CATCH_CONFIG_NO_WCHAR) && !defined(CATCH_CONFIG_WCHAR)\n#   define CATCH_CONFIG_WCHAR\n#endif\n\n#if !defined(CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_CPP11_TO_STRING)\n#    define CATCH_CONFIG_CPP11_TO_STRING\n#endif\n\n#if defined(CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL) && !defined(CATCH_CONFIG_NO_CPP17_OPTIONAL) && !defined(CATCH_CONFIG_CPP17_OPTIONAL)\n#  define CATCH_CONFIG_CPP17_OPTIONAL\n#endif\n\n#if defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS)\n#  define CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS\n#endif\n\n#if defined(CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_NO_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_CPP17_STRING_VIEW)\n#  define CATCH_CONFIG_CPP17_STRING_VIEW\n#endif\n\n#if defined(CATCH_INTERNAL_CONFIG_CPP17_VARIANT) && !defined(CATCH_CONFIG_NO_CPP17_VARIANT) && !defined(CATCH_CONFIG_CPP17_VARIANT)\n#  define CATCH_CONFIG_CPP17_VARIANT\n#endif\n\n#if defined(CATCH_INTERNAL_CONFIG_CPP17_BYTE) && !defined(CATCH_CONFIG_NO_CPP17_BYTE) && !defined(CATCH_CONFIG_CPP17_BYTE)\n#  define CATCH_CONFIG_CPP17_BYTE\n#endif\n\n#if defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT)\n#  define CATCH_INTERNAL_CONFIG_NEW_CAPTURE\n#endif\n\n#if defined(CATCH_INTERNAL_CONFIG_NEW_CAPTURE) && !defined(CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE) && !defined(CATCH_CONFIG_NO_NEW_CAPTURE) && !defined(CATCH_CONFIG_NEW_CAPTURE)\n#  define CATCH_CONFIG_NEW_CAPTURE\n#endif\n\n#if !defined(CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED) && !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)\n#  define CATCH_CONFIG_DISABLE_EXCEPTIONS\n#endif\n\n#if defined(CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_NO_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_POLYFILL_ISNAN)\n#  define CATCH_CONFIG_POLYFILL_ISNAN\n#endif\n\n#if defined(CATCH_INTERNAL_CONFIG_USE_ASYNC)  && !defined(CATCH_INTERNAL_CONFIG_NO_ASYNC) && !defined(CATCH_CONFIG_NO_USE_ASYNC) && !defined(CATCH_CONFIG_USE_ASYNC)\n#  define CATCH_CONFIG_USE_ASYNC\n#endif\n\n#if defined(CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE) && !defined(CATCH_CONFIG_NO_ANDROID_LOGWRITE) && !defined(CATCH_CONFIG_ANDROID_LOGWRITE)\n#  define CATCH_CONFIG_ANDROID_LOGWRITE\n#endif\n\n#if defined(CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_NO_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_GLOBAL_NEXTAFTER)\n#  define CATCH_CONFIG_GLOBAL_NEXTAFTER\n#endif\n\n// Even if we do not think the compiler has that warning, we still have\n// to provide a macro that can be used by the code.\n#if !defined(CATCH_INTERNAL_START_WARNINGS_SUPPRESSION)\n#   define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION\n#endif\n#if !defined(CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION)\n#   define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION\n#endif\n#if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS)\n#   define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS\n#endif\n#if !defined(CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS)\n#   define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS\n#endif\n#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS)\n#   define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS\n#endif\n#if !defined(CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS)\n#   define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS\n#endif\n\n// The goal of this macro is to avoid evaluation of the arguments, but\n// still have the compiler warn on problems inside...\n#if !defined(CATCH_INTERNAL_IGNORE_BUT_WARN)\n#   define CATCH_INTERNAL_IGNORE_BUT_WARN(...)\n#endif\n\n#if defined(__APPLE__) && defined(__apple_build_version__) && (__clang_major__ < 10)\n#   undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS\n#elif defined(__clang__) && (__clang_major__ < 5)\n#   undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS\n#endif\n\n#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS)\n#   define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS\n#endif\n\n#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)\n#define CATCH_TRY if ((true))\n#define CATCH_CATCH_ALL if ((false))\n#define CATCH_CATCH_ANON(type) if ((false))\n#else\n#define CATCH_TRY try\n#define CATCH_CATCH_ALL catch (...)\n#define CATCH_CATCH_ANON(type) catch (type)\n#endif\n\n#if defined(CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR) && !defined(CATCH_CONFIG_NO_TRADITIONAL_MSVC_PREPROCESSOR) && !defined(CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR)\n#define CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n#endif\n\n// end catch_compiler_capabilities.h\n#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line\n#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line )\n#ifdef CATCH_CONFIG_COUNTER\n#  define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __COUNTER__ )\n#else\n#  define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ )\n#endif\n\n#include <iosfwd>\n#include <string>\n#include <cstdint>\n\n// We need a dummy global operator<< so we can bring it into Catch namespace later\nstruct Catch_global_namespace_dummy {};\nstd::ostream& operator<<(std::ostream&, Catch_global_namespace_dummy);\n\nnamespace Catch {\n\n    struct CaseSensitive { enum Choice {\n        Yes,\n        No\n    }; };\n\n    class NonCopyable {\n        NonCopyable( NonCopyable const& )              = delete;\n        NonCopyable( NonCopyable && )                  = delete;\n        NonCopyable& operator = ( NonCopyable const& ) = delete;\n        NonCopyable& operator = ( NonCopyable && )     = delete;\n\n    protected:\n        NonCopyable();\n        virtual ~NonCopyable();\n    };\n\n    struct SourceLineInfo {\n\n        SourceLineInfo() = delete;\n        SourceLineInfo( char const* _file, std::size_t _line ) noexcept\n        :   file( _file ),\n            line( _line )\n        {}\n\n        SourceLineInfo( SourceLineInfo const& other )            = default;\n        SourceLineInfo& operator = ( SourceLineInfo const& )     = default;\n        SourceLineInfo( SourceLineInfo&& )              noexcept = default;\n        SourceLineInfo& operator = ( SourceLineInfo&& ) noexcept = default;\n\n        bool empty() const noexcept { return file[0] == '\\0'; }\n        bool operator == ( SourceLineInfo const& other ) const noexcept;\n        bool operator < ( SourceLineInfo const& other ) const noexcept;\n\n        char const* file;\n        std::size_t line;\n    };\n\n    std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info );\n\n    // Bring in operator<< from global namespace into Catch namespace\n    // This is necessary because the overload of operator<< above makes\n    // lookup stop at namespace Catch\n    using ::operator<<;\n\n    // Use this in variadic streaming macros to allow\n    //    >> +StreamEndStop\n    // as well as\n    //    >> stuff +StreamEndStop\n    struct StreamEndStop {\n        std::string operator+() const;\n    };\n    template<typename T>\n    T const& operator + ( T const& value, StreamEndStop ) {\n        return value;\n    }\n}\n\n#define CATCH_INTERNAL_LINEINFO \\\n    ::Catch::SourceLineInfo( __FILE__, static_cast<std::size_t>( __LINE__ ) )\n\n// end catch_common.h\nnamespace Catch {\n\n    struct RegistrarForTagAliases {\n        RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo );\n    };\n\n} // end namespace Catch\n\n#define CATCH_REGISTER_TAG_ALIAS( alias, spec ) \\\n    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \\\n    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \\\n    namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } \\\n    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION\n\n// end catch_tag_alias_autoregistrar.h\n// start catch_test_registry.h\n\n// start catch_interfaces_testcase.h\n\n#include <vector>\n\nnamespace Catch {\n\n    class TestSpec;\n\n    struct ITestInvoker {\n        virtual void invoke () const = 0;\n        virtual ~ITestInvoker();\n    };\n\n    class TestCase;\n    struct IConfig;\n\n    struct ITestCaseRegistry {\n        virtual ~ITestCaseRegistry();\n        virtual std::vector<TestCase> const& getAllTests() const = 0;\n        virtual std::vector<TestCase> const& getAllTestsSorted( IConfig const& config ) const = 0;\n    };\n\n    bool isThrowSafe( TestCase const& testCase, IConfig const& config );\n    bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config );\n    std::vector<TestCase> filterTests( std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config );\n    std::vector<TestCase> const& getAllTestCasesSorted( IConfig const& config );\n\n}\n\n// end catch_interfaces_testcase.h\n// start catch_stringref.h\n\n#include <cstddef>\n#include <string>\n#include <iosfwd>\n#include <cassert>\n\nnamespace Catch {\n\n    /// A non-owning string class (similar to the forthcoming std::string_view)\n    /// Note that, because a StringRef may be a substring of another string,\n    /// it may not be null terminated.\n    class StringRef {\n    public:\n        using size_type = std::size_t;\n        using const_iterator = const char*;\n\n    private:\n        static constexpr char const* const s_empty = \"\";\n\n        char const* m_start = s_empty;\n        size_type m_size = 0;\n\n    public: // construction\n        constexpr StringRef() noexcept = default;\n\n        StringRef( char const* rawChars ) noexcept;\n\n        constexpr StringRef( char const* rawChars, size_type size ) noexcept\n        :   m_start( rawChars ),\n            m_size( size )\n        {}\n\n        StringRef( std::string const& stdString ) noexcept\n        :   m_start( stdString.c_str() ),\n            m_size( stdString.size() )\n        {}\n\n        explicit operator std::string() const {\n            return std::string(m_start, m_size);\n        }\n\n    public: // operators\n        auto operator == ( StringRef const& other ) const noexcept -> bool;\n        auto operator != (StringRef const& other) const noexcept -> bool {\n            return !(*this == other);\n        }\n\n        auto operator[] ( size_type index ) const noexcept -> char {\n            assert(index < m_size);\n            return m_start[index];\n        }\n\n    public: // named queries\n        constexpr auto empty() const noexcept -> bool {\n            return m_size == 0;\n        }\n        constexpr auto size() const noexcept -> size_type {\n            return m_size;\n        }\n\n        // Returns the current start pointer. If the StringRef is not\n        // null-terminated, throws std::domain_exception\n        auto c_str() const -> char const*;\n\n    public: // substrings and searches\n        // Returns a substring of [start, start + length).\n        // If start + length > size(), then the substring is [start, size()).\n        // If start > size(), then the substring is empty.\n        auto substr( size_type start, size_type length ) const noexcept -> StringRef;\n\n        // Returns the current start pointer. May not be null-terminated.\n        auto data() const noexcept -> char const*;\n\n        constexpr auto isNullTerminated() const noexcept -> bool {\n            return m_start[m_size] == '\\0';\n        }\n\n    public: // iterators\n        constexpr const_iterator begin() const { return m_start; }\n        constexpr const_iterator end() const { return m_start + m_size; }\n    };\n\n    auto operator += ( std::string& lhs, StringRef const& sr ) -> std::string&;\n    auto operator << ( std::ostream& os, StringRef const& sr ) -> std::ostream&;\n\n    constexpr auto operator \"\" _sr( char const* rawChars, std::size_t size ) noexcept -> StringRef {\n        return StringRef( rawChars, size );\n    }\n} // namespace Catch\n\nconstexpr auto operator \"\" _catch_sr( char const* rawChars, std::size_t size ) noexcept -> Catch::StringRef {\n    return Catch::StringRef( rawChars, size );\n}\n\n// end catch_stringref.h\n// start catch_preprocessor.hpp\n\n\n#define CATCH_RECURSION_LEVEL0(...) __VA_ARGS__\n#define CATCH_RECURSION_LEVEL1(...) CATCH_RECURSION_LEVEL0(CATCH_RECURSION_LEVEL0(CATCH_RECURSION_LEVEL0(__VA_ARGS__)))\n#define CATCH_RECURSION_LEVEL2(...) CATCH_RECURSION_LEVEL1(CATCH_RECURSION_LEVEL1(CATCH_RECURSION_LEVEL1(__VA_ARGS__)))\n#define CATCH_RECURSION_LEVEL3(...) CATCH_RECURSION_LEVEL2(CATCH_RECURSION_LEVEL2(CATCH_RECURSION_LEVEL2(__VA_ARGS__)))\n#define CATCH_RECURSION_LEVEL4(...) CATCH_RECURSION_LEVEL3(CATCH_RECURSION_LEVEL3(CATCH_RECURSION_LEVEL3(__VA_ARGS__)))\n#define CATCH_RECURSION_LEVEL5(...) CATCH_RECURSION_LEVEL4(CATCH_RECURSION_LEVEL4(CATCH_RECURSION_LEVEL4(__VA_ARGS__)))\n\n#ifdef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n#define INTERNAL_CATCH_EXPAND_VARGS(...) __VA_ARGS__\n// MSVC needs more evaluations\n#define CATCH_RECURSION_LEVEL6(...) CATCH_RECURSION_LEVEL5(CATCH_RECURSION_LEVEL5(CATCH_RECURSION_LEVEL5(__VA_ARGS__)))\n#define CATCH_RECURSE(...)  CATCH_RECURSION_LEVEL6(CATCH_RECURSION_LEVEL6(__VA_ARGS__))\n#else\n#define CATCH_RECURSE(...)  CATCH_RECURSION_LEVEL5(__VA_ARGS__)\n#endif\n\n#define CATCH_REC_END(...)\n#define CATCH_REC_OUT\n\n#define CATCH_EMPTY()\n#define CATCH_DEFER(id) id CATCH_EMPTY()\n\n#define CATCH_REC_GET_END2() 0, CATCH_REC_END\n#define CATCH_REC_GET_END1(...) CATCH_REC_GET_END2\n#define CATCH_REC_GET_END(...) CATCH_REC_GET_END1\n#define CATCH_REC_NEXT0(test, next, ...) next CATCH_REC_OUT\n#define CATCH_REC_NEXT1(test, next) CATCH_DEFER ( CATCH_REC_NEXT0 ) ( test, next, 0)\n#define CATCH_REC_NEXT(test, next)  CATCH_REC_NEXT1(CATCH_REC_GET_END test, next)\n\n#define CATCH_REC_LIST0(f, x, peek, ...) , f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1) ) ( f, peek, __VA_ARGS__ )\n#define CATCH_REC_LIST1(f, x, peek, ...) , f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST0) ) ( f, peek, __VA_ARGS__ )\n#define CATCH_REC_LIST2(f, x, peek, ...)   f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1) ) ( f, peek, __VA_ARGS__ )\n\n#define CATCH_REC_LIST0_UD(f, userdata, x, peek, ...) , f(userdata, x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1_UD) ) ( f, userdata, peek, __VA_ARGS__ )\n#define CATCH_REC_LIST1_UD(f, userdata, x, peek, ...) , f(userdata, x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST0_UD) ) ( f, userdata, peek, __VA_ARGS__ )\n#define CATCH_REC_LIST2_UD(f, userdata, x, peek, ...)   f(userdata, x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1_UD) ) ( f, userdata, peek, __VA_ARGS__ )\n\n// Applies the function macro `f` to each of the remaining parameters, inserts commas between the results,\n// and passes userdata as the first parameter to each invocation,\n// e.g. CATCH_REC_LIST_UD(f, x, a, b, c) evaluates to f(x, a), f(x, b), f(x, c)\n#define CATCH_REC_LIST_UD(f, userdata, ...) CATCH_RECURSE(CATCH_REC_LIST2_UD(f, userdata, __VA_ARGS__, ()()(), ()()(), ()()(), 0))\n\n#define CATCH_REC_LIST(f, ...) CATCH_RECURSE(CATCH_REC_LIST2(f, __VA_ARGS__, ()()(), ()()(), ()()(), 0))\n\n#define INTERNAL_CATCH_EXPAND1(param) INTERNAL_CATCH_EXPAND2(param)\n#define INTERNAL_CATCH_EXPAND2(...) INTERNAL_CATCH_NO## __VA_ARGS__\n#define INTERNAL_CATCH_DEF(...) INTERNAL_CATCH_DEF __VA_ARGS__\n#define INTERNAL_CATCH_NOINTERNAL_CATCH_DEF\n#define INTERNAL_CATCH_STRINGIZE(...) INTERNAL_CATCH_STRINGIZE2(__VA_ARGS__)\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n#define INTERNAL_CATCH_STRINGIZE2(...) #__VA_ARGS__\n#define INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS(param) INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_REMOVE_PARENS(param))\n#else\n// MSVC is adding extra space and needs another indirection to expand INTERNAL_CATCH_NOINTERNAL_CATCH_DEF\n#define INTERNAL_CATCH_STRINGIZE2(...) INTERNAL_CATCH_STRINGIZE3(__VA_ARGS__)\n#define INTERNAL_CATCH_STRINGIZE3(...) #__VA_ARGS__\n#define INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS(param) (INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_REMOVE_PARENS(param)) + 1)\n#endif\n\n#define INTERNAL_CATCH_MAKE_NAMESPACE2(...) ns_##__VA_ARGS__\n#define INTERNAL_CATCH_MAKE_NAMESPACE(name) INTERNAL_CATCH_MAKE_NAMESPACE2(name)\n\n#define INTERNAL_CATCH_REMOVE_PARENS(...) INTERNAL_CATCH_EXPAND1(INTERNAL_CATCH_DEF __VA_ARGS__)\n\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n#define INTERNAL_CATCH_MAKE_TYPE_LIST2(...) decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS_GEN(__VA_ARGS__)>())\n#define INTERNAL_CATCH_MAKE_TYPE_LIST(...) INTERNAL_CATCH_MAKE_TYPE_LIST2(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__))\n#else\n#define INTERNAL_CATCH_MAKE_TYPE_LIST2(...) INTERNAL_CATCH_EXPAND_VARGS(decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS_GEN(__VA_ARGS__)>()))\n#define INTERNAL_CATCH_MAKE_TYPE_LIST(...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_MAKE_TYPE_LIST2(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__)))\n#endif\n\n#define INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(...)\\\n    CATCH_REC_LIST(INTERNAL_CATCH_MAKE_TYPE_LIST,__VA_ARGS__)\n\n#define INTERNAL_CATCH_REMOVE_PARENS_1_ARG(_0) INTERNAL_CATCH_REMOVE_PARENS(_0)\n#define INTERNAL_CATCH_REMOVE_PARENS_2_ARG(_0, _1) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_1_ARG(_1)\n#define INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_0, _1, _2) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_2_ARG(_1, _2)\n#define INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_0, _1, _2, _3) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_1, _2, _3)\n#define INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_0, _1, _2, _3, _4) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_1, _2, _3, _4)\n#define INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_0, _1, _2, _3, _4, _5) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_1, _2, _3, _4, _5)\n#define INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_0, _1, _2, _3, _4, _5, _6) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_1, _2, _3, _4, _5, _6)\n#define INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_0, _1, _2, _3, _4, _5, _6, _7) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_1, _2, _3, _4, _5, _6, _7)\n#define INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_1, _2, _3, _4, _5, _6, _7, _8)\n#define INTERNAL_CATCH_REMOVE_PARENS_10_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9)\n#define INTERNAL_CATCH_REMOVE_PARENS_11_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_10_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10)\n\n#define INTERNAL_CATCH_VA_NARGS_IMPL(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N\n\n#define INTERNAL_CATCH_TYPE_GEN\\\n    template<typename...> struct TypeList {};\\\n    template<typename...Ts>\\\n    constexpr auto get_wrapper() noexcept -> TypeList<Ts...> { return {}; }\\\n    template<template<typename...> class...> struct TemplateTypeList{};\\\n    template<template<typename...> class...Cs>\\\n    constexpr auto get_wrapper() noexcept -> TemplateTypeList<Cs...> { return {}; }\\\n    template<typename...>\\\n    struct append;\\\n    template<typename...>\\\n    struct rewrap;\\\n    template<template<typename...> class, typename...>\\\n    struct create;\\\n    template<template<typename...> class, typename>\\\n    struct convert;\\\n    \\\n    template<typename T> \\\n    struct append<T> { using type = T; };\\\n    template< template<typename...> class L1, typename...E1, template<typename...> class L2, typename...E2, typename...Rest>\\\n    struct append<L1<E1...>, L2<E2...>, Rest...> { using type = typename append<L1<E1...,E2...>, Rest...>::type; };\\\n    template< template<typename...> class L1, typename...E1, typename...Rest>\\\n    struct append<L1<E1...>, TypeList<mpl_::na>, Rest...> { using type = L1<E1...>; };\\\n    \\\n    template< template<typename...> class Container, template<typename...> class List, typename...elems>\\\n    struct rewrap<TemplateTypeList<Container>, List<elems...>> { using type = TypeList<Container<elems...>>; };\\\n    template< template<typename...> class Container, template<typename...> class List, class...Elems, typename...Elements>\\\n    struct rewrap<TemplateTypeList<Container>, List<Elems...>, Elements...> { using type = typename append<TypeList<Container<Elems...>>, typename rewrap<TemplateTypeList<Container>, Elements...>::type>::type; };\\\n    \\\n    template<template <typename...> class Final, template< typename...> class...Containers, typename...Types>\\\n    struct create<Final, TemplateTypeList<Containers...>, TypeList<Types...>> { using type = typename append<Final<>, typename rewrap<TemplateTypeList<Containers>, Types...>::type...>::type; };\\\n    template<template <typename...> class Final, template <typename...> class List, typename...Ts>\\\n    struct convert<Final, List<Ts...>> { using type = typename append<Final<>,TypeList<Ts>...>::type; };\n\n#define INTERNAL_CATCH_NTTP_1(signature, ...)\\\n    template<INTERNAL_CATCH_REMOVE_PARENS(signature)> struct Nttp{};\\\n    template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\\\n    constexpr auto get_wrapper() noexcept -> Nttp<__VA_ARGS__> { return {}; } \\\n    template<template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class...> struct NttpTemplateTypeList{};\\\n    template<template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class...Cs>\\\n    constexpr auto get_wrapper() noexcept -> NttpTemplateTypeList<Cs...> { return {}; } \\\n    \\\n    template< template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class Container, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class List, INTERNAL_CATCH_REMOVE_PARENS(signature)>\\\n    struct rewrap<NttpTemplateTypeList<Container>, List<__VA_ARGS__>> { using type = TypeList<Container<__VA_ARGS__>>; };\\\n    template< template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class Container, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class List, INTERNAL_CATCH_REMOVE_PARENS(signature), typename...Elements>\\\n    struct rewrap<NttpTemplateTypeList<Container>, List<__VA_ARGS__>, Elements...> { using type = typename append<TypeList<Container<__VA_ARGS__>>, typename rewrap<NttpTemplateTypeList<Container>, Elements...>::type>::type; };\\\n    template<template <typename...> class Final, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class...Containers, typename...Types>\\\n    struct create<Final, NttpTemplateTypeList<Containers...>, TypeList<Types...>> { using type = typename append<Final<>, typename rewrap<NttpTemplateTypeList<Containers>, Types...>::type...>::type; };\n\n#define INTERNAL_CATCH_DECLARE_SIG_TEST0(TestName)\n#define INTERNAL_CATCH_DECLARE_SIG_TEST1(TestName, signature)\\\n    template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\\\n    static void TestName()\n#define INTERNAL_CATCH_DECLARE_SIG_TEST_X(TestName, signature, ...)\\\n    template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\\\n    static void TestName()\n\n#define INTERNAL_CATCH_DEFINE_SIG_TEST0(TestName)\n#define INTERNAL_CATCH_DEFINE_SIG_TEST1(TestName, signature)\\\n    template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\\\n    static void TestName()\n#define INTERNAL_CATCH_DEFINE_SIG_TEST_X(TestName, signature,...)\\\n    template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\\\n    static void TestName()\n\n#define INTERNAL_CATCH_NTTP_REGISTER0(TestFunc, signature)\\\n    template<typename Type>\\\n    void reg_test(TypeList<Type>, Catch::NameAndTags nameAndTags)\\\n    {\\\n        Catch::AutoReg( Catch::makeTestInvoker(&TestFunc<Type>), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), nameAndTags);\\\n    }\n\n#define INTERNAL_CATCH_NTTP_REGISTER(TestFunc, signature, ...)\\\n    template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\\\n    void reg_test(Nttp<__VA_ARGS__>, Catch::NameAndTags nameAndTags)\\\n    {\\\n        Catch::AutoReg( Catch::makeTestInvoker(&TestFunc<__VA_ARGS__>), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), nameAndTags);\\\n    }\n\n#define INTERNAL_CATCH_NTTP_REGISTER_METHOD0(TestName, signature, ...)\\\n    template<typename Type>\\\n    void reg_test(TypeList<Type>, Catch::StringRef className, Catch::NameAndTags nameAndTags)\\\n    {\\\n        Catch::AutoReg( Catch::makeTestInvoker(&TestName<Type>::test), CATCH_INTERNAL_LINEINFO, className, nameAndTags);\\\n    }\n\n#define INTERNAL_CATCH_NTTP_REGISTER_METHOD(TestName, signature, ...)\\\n    template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\\\n    void reg_test(Nttp<__VA_ARGS__>, Catch::StringRef className, Catch::NameAndTags nameAndTags)\\\n    {\\\n        Catch::AutoReg( Catch::makeTestInvoker(&TestName<__VA_ARGS__>::test), CATCH_INTERNAL_LINEINFO, className, nameAndTags);\\\n    }\n\n#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD0(TestName, ClassName)\n#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD1(TestName, ClassName, signature)\\\n    template<typename TestType> \\\n    struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName)<TestType> { \\\n        void test();\\\n    }\n\n#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X(TestName, ClassName, signature, ...)\\\n    template<INTERNAL_CATCH_REMOVE_PARENS(signature)> \\\n    struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName)<__VA_ARGS__> { \\\n        void test();\\\n    }\n\n#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD0(TestName)\n#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD1(TestName, signature)\\\n    template<typename TestType> \\\n    void INTERNAL_CATCH_MAKE_NAMESPACE(TestName)::TestName<TestType>::test()\n#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X(TestName, signature, ...)\\\n    template<INTERNAL_CATCH_REMOVE_PARENS(signature)> \\\n    void INTERNAL_CATCH_MAKE_NAMESPACE(TestName)::TestName<__VA_ARGS__>::test()\n\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n#define INTERNAL_CATCH_NTTP_0\n#define INTERNAL_CATCH_NTTP_GEN(...) INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__, INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1( __VA_ARGS__), INTERNAL_CATCH_NTTP_1( __VA_ARGS__), INTERNAL_CATCH_NTTP_1( __VA_ARGS__), INTERNAL_CATCH_NTTP_1( __VA_ARGS__),INTERNAL_CATCH_NTTP_1( __VA_ARGS__), INTERNAL_CATCH_NTTP_0)\n#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( \"dummy\", __VA_ARGS__, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD1, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD0)(TestName, __VA_ARGS__)\n#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( \"dummy\", __VA_ARGS__, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD1, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD0)(TestName, ClassName, __VA_ARGS__)\n#define INTERNAL_CATCH_NTTP_REG_METHOD_GEN(TestName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( \"dummy\", __VA_ARGS__, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD0, INTERNAL_CATCH_NTTP_REGISTER_METHOD0)(TestName, __VA_ARGS__)\n#define INTERNAL_CATCH_NTTP_REG_GEN(TestFunc, ...) INTERNAL_CATCH_VA_NARGS_IMPL( \"dummy\", __VA_ARGS__, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER0, INTERNAL_CATCH_NTTP_REGISTER0)(TestFunc, __VA_ARGS__)\n#define INTERNAL_CATCH_DEFINE_SIG_TEST(TestName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( \"dummy\", __VA_ARGS__, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DEFINE_SIG_TEST1, INTERNAL_CATCH_DEFINE_SIG_TEST0)(TestName, __VA_ARGS__)\n#define INTERNAL_CATCH_DECLARE_SIG_TEST(TestName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( \"dummy\", __VA_ARGS__, INTERNAL_CATCH_DECLARE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST1, INTERNAL_CATCH_DECLARE_SIG_TEST0)(TestName, __VA_ARGS__)\n#define INTERNAL_CATCH_REMOVE_PARENS_GEN(...) INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__, INTERNAL_CATCH_REMOVE_PARENS_11_ARG,INTERNAL_CATCH_REMOVE_PARENS_10_ARG,INTERNAL_CATCH_REMOVE_PARENS_9_ARG,INTERNAL_CATCH_REMOVE_PARENS_8_ARG,INTERNAL_CATCH_REMOVE_PARENS_7_ARG,INTERNAL_CATCH_REMOVE_PARENS_6_ARG,INTERNAL_CATCH_REMOVE_PARENS_5_ARG,INTERNAL_CATCH_REMOVE_PARENS_4_ARG,INTERNAL_CATCH_REMOVE_PARENS_3_ARG,INTERNAL_CATCH_REMOVE_PARENS_2_ARG,INTERNAL_CATCH_REMOVE_PARENS_1_ARG)(__VA_ARGS__)\n#else\n#define INTERNAL_CATCH_NTTP_0(signature)\n#define INTERNAL_CATCH_NTTP_GEN(...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1,INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_0)( __VA_ARGS__))\n#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( \"dummy\", __VA_ARGS__, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD1, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD0)(TestName, __VA_ARGS__))\n#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( \"dummy\", __VA_ARGS__, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD1, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD0)(TestName, ClassName, __VA_ARGS__))\n#define INTERNAL_CATCH_NTTP_REG_METHOD_GEN(TestName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( \"dummy\", __VA_ARGS__, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD0, INTERNAL_CATCH_NTTP_REGISTER_METHOD0)(TestName, __VA_ARGS__))\n#define INTERNAL_CATCH_NTTP_REG_GEN(TestFunc, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( \"dummy\", __VA_ARGS__, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER0, INTERNAL_CATCH_NTTP_REGISTER0)(TestFunc, __VA_ARGS__))\n#define INTERNAL_CATCH_DEFINE_SIG_TEST(TestName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( \"dummy\", __VA_ARGS__, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DEFINE_SIG_TEST1, INTERNAL_CATCH_DEFINE_SIG_TEST0)(TestName, __VA_ARGS__))\n#define INTERNAL_CATCH_DECLARE_SIG_TEST(TestName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( \"dummy\", __VA_ARGS__, INTERNAL_CATCH_DECLARE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST1, INTERNAL_CATCH_DECLARE_SIG_TEST0)(TestName, __VA_ARGS__))\n#define INTERNAL_CATCH_REMOVE_PARENS_GEN(...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__, INTERNAL_CATCH_REMOVE_PARENS_11_ARG,INTERNAL_CATCH_REMOVE_PARENS_10_ARG,INTERNAL_CATCH_REMOVE_PARENS_9_ARG,INTERNAL_CATCH_REMOVE_PARENS_8_ARG,INTERNAL_CATCH_REMOVE_PARENS_7_ARG,INTERNAL_CATCH_REMOVE_PARENS_6_ARG,INTERNAL_CATCH_REMOVE_PARENS_5_ARG,INTERNAL_CATCH_REMOVE_PARENS_4_ARG,INTERNAL_CATCH_REMOVE_PARENS_3_ARG,INTERNAL_CATCH_REMOVE_PARENS_2_ARG,INTERNAL_CATCH_REMOVE_PARENS_1_ARG)(__VA_ARGS__))\n#endif\n\n// end catch_preprocessor.hpp\n// start catch_meta.hpp\n\n\n#include <type_traits>\n\nnamespace Catch {\n    template<typename T>\n    struct always_false : std::false_type {};\n\n    template <typename> struct true_given : std::true_type {};\n    struct is_callable_tester {\n        template <typename Fun, typename... Args>\n        true_given<decltype(std::declval<Fun>()(std::declval<Args>()...))> static test(int);\n        template <typename...>\n        std::false_type static test(...);\n    };\n\n    template <typename T>\n    struct is_callable;\n\n    template <typename Fun, typename... Args>\n    struct is_callable<Fun(Args...)> : decltype(is_callable_tester::test<Fun, Args...>(0)) {};\n\n#if defined(__cpp_lib_is_invocable) && __cpp_lib_is_invocable >= 201703\n    // std::result_of is deprecated in C++17 and removed in C++20. Hence, it is\n    // replaced with std::invoke_result here.\n    template <typename Func, typename... U>\n    using FunctionReturnType = std::remove_reference_t<std::remove_cv_t<std::invoke_result_t<Func, U...>>>;\n#else\n    // Keep ::type here because we still support C++11\n    template <typename Func, typename... U>\n    using FunctionReturnType = typename std::remove_reference<typename std::remove_cv<typename std::result_of<Func(U...)>::type>::type>::type;\n#endif\n\n} // namespace Catch\n\nnamespace mpl_{\n    struct na;\n}\n\n// end catch_meta.hpp\nnamespace Catch {\n\ntemplate<typename C>\nclass TestInvokerAsMethod : public ITestInvoker {\n    void (C::*m_testAsMethod)();\npublic:\n    TestInvokerAsMethod( void (C::*testAsMethod)() ) noexcept : m_testAsMethod( testAsMethod ) {}\n\n    void invoke() const override {\n        C obj;\n        (obj.*m_testAsMethod)();\n    }\n};\n\nauto makeTestInvoker( void(*testAsFunction)() ) noexcept -> ITestInvoker*;\n\ntemplate<typename C>\nauto makeTestInvoker( void (C::*testAsMethod)() ) noexcept -> ITestInvoker* {\n    return new(std::nothrow) TestInvokerAsMethod<C>( testAsMethod );\n}\n\nstruct NameAndTags {\n    NameAndTags( StringRef const& name_ = StringRef(), StringRef const& tags_ = StringRef() ) noexcept;\n    StringRef name;\n    StringRef tags;\n};\n\nstruct AutoReg : NonCopyable {\n    AutoReg( ITestInvoker* invoker, SourceLineInfo const& lineInfo, StringRef const& classOrMethod, NameAndTags const& nameAndTags ) noexcept;\n    ~AutoReg();\n};\n\n} // end namespace Catch\n\n#if defined(CATCH_CONFIG_DISABLE)\n    #define INTERNAL_CATCH_TESTCASE_NO_REGISTRATION( TestName, ... ) \\\n        static void TestName()\n    #define INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION( TestName, ClassName, ... ) \\\n        namespace{                        \\\n            struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName) { \\\n                void test();              \\\n            };                            \\\n        }                                 \\\n        void TestName::test()\n    #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( TestName, TestFunc, Name, Tags, Signature, ... )  \\\n        INTERNAL_CATCH_DEFINE_SIG_TEST(TestFunc, INTERNAL_CATCH_REMOVE_PARENS(Signature))\n    #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( TestNameClass, TestName, ClassName, Name, Tags, Signature, ... )    \\\n        namespace{                                                                                  \\\n            namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName) {                                      \\\n            INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, INTERNAL_CATCH_REMOVE_PARENS(Signature));\\\n        }                                                                                           \\\n        }                                                                                           \\\n        INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature))\n\n    #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n        #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(Name, Tags, ...) \\\n            INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename TestType, __VA_ARGS__ )\n    #else\n        #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(Name, Tags, ...) \\\n            INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename TestType, __VA_ARGS__ ) )\n    #endif\n\n    #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n        #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(Name, Tags, Signature, ...) \\\n            INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ )\n    #else\n        #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(Name, Tags, Signature, ...) \\\n            INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) )\n    #endif\n\n    #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n        #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION( ClassName, Name, Tags,... ) \\\n            INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ )\n    #else\n        #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION( ClassName, Name, Tags,... ) \\\n            INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ ) )\n    #endif\n\n    #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n        #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION( ClassName, Name, Tags, Signature, ... ) \\\n            INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ )\n    #else\n        #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION( ClassName, Name, Tags, Signature, ... ) \\\n            INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ ) )\n    #endif\n#endif\n\n    ///////////////////////////////////////////////////////////////////////////////\n    #define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \\\n        static void TestName(); \\\n        CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \\\n        CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \\\n        namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( &TestName ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ __VA_ARGS__ } ); } /* NOLINT */ \\\n        CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \\\n        static void TestName()\n    #define INTERNAL_CATCH_TESTCASE( ... ) \\\n        INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), __VA_ARGS__ )\n\n    ///////////////////////////////////////////////////////////////////////////////\n    #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \\\n        CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \\\n        CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \\\n        namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( &QualifiedMethod ), CATCH_INTERNAL_LINEINFO, \"&\" #QualifiedMethod, Catch::NameAndTags{ __VA_ARGS__ } ); } /* NOLINT */ \\\n        CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION\n\n    ///////////////////////////////////////////////////////////////////////////////\n    #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\\\n        CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \\\n        CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \\\n        namespace{ \\\n            struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName) { \\\n                void test(); \\\n            }; \\\n            Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( Catch::makeTestInvoker( &TestName::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ __VA_ARGS__ } ); /* NOLINT */ \\\n        } \\\n        CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \\\n        void TestName::test()\n    #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... ) \\\n        INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, __VA_ARGS__ )\n\n    ///////////////////////////////////////////////////////////////////////////////\n    #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \\\n        CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \\\n        CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \\\n        Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( Function ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ __VA_ARGS__ } ); /* NOLINT */ \\\n        CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION\n\n    ///////////////////////////////////////////////////////////////////////////////\n    #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_2(TestName, TestFunc, Name, Tags, Signature, ... )\\\n        CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \\\n        CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \\\n        CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \\\n        CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \\\n        INTERNAL_CATCH_DECLARE_SIG_TEST(TestFunc, INTERNAL_CATCH_REMOVE_PARENS(Signature));\\\n        namespace {\\\n        namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){\\\n            INTERNAL_CATCH_TYPE_GEN\\\n            INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))\\\n            INTERNAL_CATCH_NTTP_REG_GEN(TestFunc,INTERNAL_CATCH_REMOVE_PARENS(Signature))\\\n            template<typename...Types> \\\n            struct TestName{\\\n                TestName(){\\\n                    int index = 0;                                    \\\n                    constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, __VA_ARGS__)};\\\n                    using expander = int[];\\\n                    (void)expander{(reg_test(Types{}, Catch::NameAndTags{ Name \" - \" + std::string(tmpl_types[index]), Tags } ), index++, 0)... };/* NOLINT */ \\\n                }\\\n            };\\\n            static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\\\n            TestName<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(__VA_ARGS__)>();\\\n            return 0;\\\n        }();\\\n        }\\\n        }\\\n        CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \\\n        INTERNAL_CATCH_DEFINE_SIG_TEST(TestFunc,INTERNAL_CATCH_REMOVE_PARENS(Signature))\n\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n    #define INTERNAL_CATCH_TEMPLATE_TEST_CASE(Name, Tags, ...) \\\n        INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename TestType, __VA_ARGS__ )\n#else\n    #define INTERNAL_CATCH_TEMPLATE_TEST_CASE(Name, Tags, ...) \\\n        INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename TestType, __VA_ARGS__ ) )\n#endif\n\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n    #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(Name, Tags, Signature, ...) \\\n        INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ )\n#else\n    #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(Name, Tags, Signature, ...) \\\n        INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) )\n#endif\n\n    #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(TestName, TestFuncName, Name, Tags, Signature, TmplTypes, TypesList) \\\n        CATCH_INTERNAL_START_WARNINGS_SUPPRESSION                      \\\n        CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS                      \\\n        CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS                \\\n        CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS              \\\n        template<typename TestType> static void TestFuncName();       \\\n        namespace {\\\n        namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName) {                                     \\\n            INTERNAL_CATCH_TYPE_GEN                                                  \\\n            INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))         \\\n            template<typename... Types>                               \\\n            struct TestName {                                         \\\n                void reg_tests() {                                          \\\n                    int index = 0;                                    \\\n                    using expander = int[];                           \\\n                    constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes))};\\\n                    constexpr char const* types_list[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TypesList))};\\\n                    constexpr auto num_types = sizeof(types_list) / sizeof(types_list[0]);\\\n                    (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFuncName<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ Name \" - \" + std::string(tmpl_types[index / num_types]) + \"<\" + std::string(types_list[index % num_types]) + \">\", Tags } ), index++, 0)... };/* NOLINT */\\\n                }                                                     \\\n            };                                                        \\\n            static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \\\n                using TestInit = typename create<TestName, decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>()), TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(INTERNAL_CATCH_REMOVE_PARENS(TypesList))>>::type; \\\n                TestInit t;                                           \\\n                t.reg_tests();                                        \\\n                return 0;                                             \\\n            }();                                                      \\\n        }                                                             \\\n        }                                                             \\\n        CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION                       \\\n        template<typename TestType>                                   \\\n        static void TestFuncName()\n\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n    #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(Name, Tags, ...)\\\n        INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename T,__VA_ARGS__)\n#else\n    #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(Name, Tags, ...)\\\n        INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename T, __VA_ARGS__ ) )\n#endif\n\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n    #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(Name, Tags, Signature, ...)\\\n        INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__)\n#else\n    #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(Name, Tags, Signature, ...)\\\n        INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) )\n#endif\n\n    #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_2(TestName, TestFunc, Name, Tags, TmplList)\\\n        CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \\\n        CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \\\n        CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \\\n        template<typename TestType> static void TestFunc();       \\\n        namespace {\\\n        namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){\\\n        INTERNAL_CATCH_TYPE_GEN\\\n        template<typename... Types>                               \\\n        struct TestName {                                         \\\n            void reg_tests() {                                          \\\n                int index = 0;                                    \\\n                using expander = int[];                           \\\n                (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFunc<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ Name \" - \" + std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) + \" - \" + std::to_string(index), Tags } ), index++, 0)... };/* NOLINT */\\\n            }                                                     \\\n        };\\\n        static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \\\n                using TestInit = typename convert<TestName, TmplList>::type; \\\n                TestInit t;                                           \\\n                t.reg_tests();                                        \\\n                return 0;                                             \\\n            }();                                                      \\\n        }}\\\n        CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION                       \\\n        template<typename TestType>                                   \\\n        static void TestFunc()\n\n    #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE(Name, Tags, TmplList) \\\n        INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, TmplList )\n\n    #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( TestNameClass, TestName, ClassName, Name, Tags, Signature, ... ) \\\n        CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \\\n        CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \\\n        CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \\\n        CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \\\n        namespace {\\\n        namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){ \\\n            INTERNAL_CATCH_TYPE_GEN\\\n            INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))\\\n            INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, INTERNAL_CATCH_REMOVE_PARENS(Signature));\\\n            INTERNAL_CATCH_NTTP_REG_METHOD_GEN(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature))\\\n            template<typename...Types> \\\n            struct TestNameClass{\\\n                TestNameClass(){\\\n                    int index = 0;                                    \\\n                    constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, __VA_ARGS__)};\\\n                    using expander = int[];\\\n                    (void)expander{(reg_test(Types{}, #ClassName, Catch::NameAndTags{ Name \" - \" + std::string(tmpl_types[index]), Tags } ), index++, 0)... };/* NOLINT */ \\\n                }\\\n            };\\\n            static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\\\n                TestNameClass<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(__VA_ARGS__)>();\\\n                return 0;\\\n        }();\\\n        }\\\n        }\\\n        CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \\\n        INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature))\n\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n    #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( ClassName, Name, Tags,... ) \\\n        INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ )\n#else\n    #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( ClassName, Name, Tags,... ) \\\n        INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ ) )\n#endif\n\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n    #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... ) \\\n        INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ )\n#else\n    #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... ) \\\n        INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ ) )\n#endif\n\n    #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2(TestNameClass, TestName, ClassName, Name, Tags, Signature, TmplTypes, TypesList)\\\n        CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \\\n        CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \\\n        CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \\\n        CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \\\n        template<typename TestType> \\\n            struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName <TestType>) { \\\n                void test();\\\n            };\\\n        namespace {\\\n        namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestNameClass) {\\\n            INTERNAL_CATCH_TYPE_GEN                  \\\n            INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))\\\n            template<typename...Types>\\\n            struct TestNameClass{\\\n                void reg_tests(){\\\n                    int index = 0;\\\n                    using expander = int[];\\\n                    constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes))};\\\n                    constexpr char const* types_list[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TypesList))};\\\n                    constexpr auto num_types = sizeof(types_list) / sizeof(types_list[0]);\\\n                    (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ Name \" - \" + std::string(tmpl_types[index / num_types]) + \"<\" + std::string(types_list[index % num_types]) + \">\", Tags } ), index++, 0)... };/* NOLINT */ \\\n                }\\\n            };\\\n            static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\\\n                using TestInit = typename create<TestNameClass, decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>()), TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(INTERNAL_CATCH_REMOVE_PARENS(TypesList))>>::type;\\\n                TestInit t;\\\n                t.reg_tests();\\\n                return 0;\\\n            }(); \\\n        }\\\n        }\\\n        CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \\\n        template<typename TestType> \\\n        void TestName<TestType>::test()\n\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n    #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( ClassName, Name, Tags, ... )\\\n        INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, typename T, __VA_ARGS__ )\n#else\n    #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( ClassName, Name, Tags, ... )\\\n        INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, typename T,__VA_ARGS__ ) )\n#endif\n\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n    #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... )\\\n        INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, Signature, __VA_ARGS__ )\n#else\n    #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... )\\\n        INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, Signature,__VA_ARGS__ ) )\n#endif\n\n    #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD_2( TestNameClass, TestName, ClassName, Name, Tags, TmplList) \\\n        CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \\\n        CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \\\n        CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \\\n        template<typename TestType> \\\n        struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName <TestType>) { \\\n            void test();\\\n        };\\\n        namespace {\\\n        namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){ \\\n            INTERNAL_CATCH_TYPE_GEN\\\n            template<typename...Types>\\\n            struct TestNameClass{\\\n                void reg_tests(){\\\n                    int index = 0;\\\n                    using expander = int[];\\\n                    (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ Name \" - \" + std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) + \" - \" + std::to_string(index), Tags } ), index++, 0)... };/* NOLINT */ \\\n                }\\\n            };\\\n            static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\\\n                using TestInit = typename convert<TestNameClass, TmplList>::type;\\\n                TestInit t;\\\n                t.reg_tests();\\\n                return 0;\\\n            }(); \\\n        }}\\\n        CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \\\n        template<typename TestType> \\\n        void TestName<TestType>::test()\n\n#define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD(ClassName, Name, Tags, TmplList) \\\n        INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, TmplList )\n\n// end catch_test_registry.h\n// start catch_capture.hpp\n\n// start catch_assertionhandler.h\n\n// start catch_assertioninfo.h\n\n// start catch_result_type.h\n\nnamespace Catch {\n\n    // ResultWas::OfType enum\n    struct ResultWas { enum OfType {\n        Unknown = -1,\n        Ok = 0,\n        Info = 1,\n        Warning = 2,\n\n        FailureBit = 0x10,\n\n        ExpressionFailed = FailureBit | 1,\n        ExplicitFailure = FailureBit | 2,\n\n        Exception = 0x100 | FailureBit,\n\n        ThrewException = Exception | 1,\n        DidntThrowException = Exception | 2,\n\n        FatalErrorCondition = 0x200 | FailureBit\n\n    }; };\n\n    bool isOk( ResultWas::OfType resultType );\n    bool isJustInfo( int flags );\n\n    // ResultDisposition::Flags enum\n    struct ResultDisposition { enum Flags {\n        Normal = 0x01,\n\n        ContinueOnFailure = 0x02,   // Failures fail test, but execution continues\n        FalseTest = 0x04,           // Prefix expression with !\n        SuppressFail = 0x08         // Failures are reported but do not fail the test\n    }; };\n\n    ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs );\n\n    bool shouldContinueOnFailure( int flags );\n    inline bool isFalseTest( int flags ) { return ( flags & ResultDisposition::FalseTest ) != 0; }\n    bool shouldSuppressFailure( int flags );\n\n} // end namespace Catch\n\n// end catch_result_type.h\nnamespace Catch {\n\n    struct AssertionInfo\n    {\n        StringRef macroName;\n        SourceLineInfo lineInfo;\n        StringRef capturedExpression;\n        ResultDisposition::Flags resultDisposition;\n\n        // We want to delete this constructor but a compiler bug in 4.8 means\n        // the struct is then treated as non-aggregate\n        //AssertionInfo() = delete;\n    };\n\n} // end namespace Catch\n\n// end catch_assertioninfo.h\n// start catch_decomposer.h\n\n// start catch_tostring.h\n\n#include <vector>\n#include <cstddef>\n#include <type_traits>\n#include <string>\n// start catch_stream.h\n\n#include <iosfwd>\n#include <cstddef>\n#include <ostream>\n\nnamespace Catch {\n\n    std::ostream& cout();\n    std::ostream& cerr();\n    std::ostream& clog();\n\n    class StringRef;\n\n    struct IStream {\n        virtual ~IStream();\n        virtual std::ostream& stream() const = 0;\n    };\n\n    auto makeStream( StringRef const &filename ) -> IStream const*;\n\n    class ReusableStringStream : NonCopyable {\n        std::size_t m_index;\n        std::ostream* m_oss;\n    public:\n        ReusableStringStream();\n        ~ReusableStringStream();\n\n        auto str() const -> std::string;\n\n        template<typename T>\n        auto operator << ( T const& value ) -> ReusableStringStream& {\n            *m_oss << value;\n            return *this;\n        }\n        auto get() -> std::ostream& { return *m_oss; }\n    };\n}\n\n// end catch_stream.h\n// start catch_interfaces_enum_values_registry.h\n\n#include <vector>\n\nnamespace Catch {\n\n    namespace Detail {\n        struct EnumInfo {\n            StringRef m_name;\n            std::vector<std::pair<int, StringRef>> m_values;\n\n            ~EnumInfo();\n\n            StringRef lookup( int value ) const;\n        };\n    } // namespace Detail\n\n    struct IMutableEnumValuesRegistry {\n        virtual ~IMutableEnumValuesRegistry();\n\n        virtual Detail::EnumInfo const& registerEnum( StringRef enumName, StringRef allEnums, std::vector<int> const& values ) = 0;\n\n        template<typename E>\n        Detail::EnumInfo const& registerEnum( StringRef enumName, StringRef allEnums, std::initializer_list<E> values ) {\n            static_assert(sizeof(int) >= sizeof(E), \"Cannot serialize enum to int\");\n            std::vector<int> intValues;\n            intValues.reserve( values.size() );\n            for( auto enumValue : values )\n                intValues.push_back( static_cast<int>( enumValue ) );\n            return registerEnum( enumName, allEnums, intValues );\n        }\n    };\n\n} // Catch\n\n// end catch_interfaces_enum_values_registry.h\n\n#ifdef CATCH_CONFIG_CPP17_STRING_VIEW\n#include <string_view>\n#endif\n\n#ifdef __OBJC__\n// start catch_objc_arc.hpp\n\n#import <Foundation/Foundation.h>\n\n#ifdef __has_feature\n#define CATCH_ARC_ENABLED __has_feature(objc_arc)\n#else\n#define CATCH_ARC_ENABLED 0\n#endif\n\nvoid arcSafeRelease( NSObject* obj );\nid performOptionalSelector( id obj, SEL sel );\n\n#if !CATCH_ARC_ENABLED\ninline void arcSafeRelease( NSObject* obj ) {\n    [obj release];\n}\ninline id performOptionalSelector( id obj, SEL sel ) {\n    if( [obj respondsToSelector: sel] )\n        return [obj performSelector: sel];\n    return nil;\n}\n#define CATCH_UNSAFE_UNRETAINED\n#define CATCH_ARC_STRONG\n#else\ninline void arcSafeRelease( NSObject* ){}\ninline id performOptionalSelector( id obj, SEL sel ) {\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Warc-performSelector-leaks\"\n#endif\n    if( [obj respondsToSelector: sel] )\n        return [obj performSelector: sel];\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n    return nil;\n}\n#define CATCH_UNSAFE_UNRETAINED __unsafe_unretained\n#define CATCH_ARC_STRONG __strong\n#endif\n\n// end catch_objc_arc.hpp\n#endif\n\n#ifdef _MSC_VER\n#pragma warning(push)\n#pragma warning(disable:4180) // We attempt to stream a function (address) by const&, which MSVC complains about but is harmless\n#endif\n\nnamespace Catch {\n    namespace Detail {\n\n        extern const std::string unprintableString;\n\n        std::string rawMemoryToString( const void *object, std::size_t size );\n\n        template<typename T>\n        std::string rawMemoryToString( const T& object ) {\n          return rawMemoryToString( &object, sizeof(object) );\n        }\n\n        template<typename T>\n        class IsStreamInsertable {\n            template<typename Stream, typename U>\n            static auto test(int)\n                -> decltype(std::declval<Stream&>() << std::declval<U>(), std::true_type());\n\n            template<typename, typename>\n            static auto test(...)->std::false_type;\n\n        public:\n            static const bool value = decltype(test<std::ostream, const T&>(0))::value;\n        };\n\n        template<typename E>\n        std::string convertUnknownEnumToString( E e );\n\n        template<typename T>\n        typename std::enable_if<\n            !std::is_enum<T>::value && !std::is_base_of<std::exception, T>::value,\n        std::string>::type convertUnstreamable( T const& ) {\n            return Detail::unprintableString;\n        }\n        template<typename T>\n        typename std::enable_if<\n            !std::is_enum<T>::value && std::is_base_of<std::exception, T>::value,\n         std::string>::type convertUnstreamable(T const& ex) {\n            return ex.what();\n        }\n\n        template<typename T>\n        typename std::enable_if<\n            std::is_enum<T>::value\n        , std::string>::type convertUnstreamable( T const& value ) {\n            return convertUnknownEnumToString( value );\n        }\n\n#if defined(_MANAGED)\n        //! Convert a CLR string to a utf8 std::string\n        template<typename T>\n        std::string clrReferenceToString( T^ ref ) {\n            if (ref == nullptr)\n                return std::string(\"null\");\n            auto bytes = System::Text::Encoding::UTF8->GetBytes(ref->ToString());\n            cli::pin_ptr<System::Byte> p = &bytes[0];\n            return std::string(reinterpret_cast<char const *>(p), bytes->Length);\n        }\n#endif\n\n    } // namespace Detail\n\n    // If we decide for C++14, change these to enable_if_ts\n    template <typename T, typename = void>\n    struct StringMaker {\n        template <typename Fake = T>\n        static\n        typename std::enable_if<::Catch::Detail::IsStreamInsertable<Fake>::value, std::string>::type\n            convert(const Fake& value) {\n                ReusableStringStream rss;\n                // NB: call using the function-like syntax to avoid ambiguity with\n                // user-defined templated operator<< under clang.\n                rss.operator<<(value);\n                return rss.str();\n        }\n\n        template <typename Fake = T>\n        static\n        typename std::enable_if<!::Catch::Detail::IsStreamInsertable<Fake>::value, std::string>::type\n            convert( const Fake& value ) {\n#if !defined(CATCH_CONFIG_FALLBACK_STRINGIFIER)\n            return Detail::convertUnstreamable(value);\n#else\n            return CATCH_CONFIG_FALLBACK_STRINGIFIER(value);\n#endif\n        }\n    };\n\n    namespace Detail {\n\n        // This function dispatches all stringification requests inside of Catch.\n        // Should be preferably called fully qualified, like ::Catch::Detail::stringify\n        template <typename T>\n        std::string stringify(const T& e) {\n            return ::Catch::StringMaker<typename std::remove_cv<typename std::remove_reference<T>::type>::type>::convert(e);\n        }\n\n        template<typename E>\n        std::string convertUnknownEnumToString( E e ) {\n            return ::Catch::Detail::stringify(static_cast<typename std::underlying_type<E>::type>(e));\n        }\n\n#if defined(_MANAGED)\n        template <typename T>\n        std::string stringify( T^ e ) {\n            return ::Catch::StringMaker<T^>::convert(e);\n        }\n#endif\n\n    } // namespace Detail\n\n    // Some predefined specializations\n\n    template<>\n    struct StringMaker<std::string> {\n        static std::string convert(const std::string& str);\n    };\n\n#ifdef CATCH_CONFIG_CPP17_STRING_VIEW\n    template<>\n    struct StringMaker<std::string_view> {\n        static std::string convert(std::string_view str);\n    };\n#endif\n\n    template<>\n    struct StringMaker<char const *> {\n        static std::string convert(char const * str);\n    };\n    template<>\n    struct StringMaker<char *> {\n        static std::string convert(char * str);\n    };\n\n#ifdef CATCH_CONFIG_WCHAR\n    template<>\n    struct StringMaker<std::wstring> {\n        static std::string convert(const std::wstring& wstr);\n    };\n\n# ifdef CATCH_CONFIG_CPP17_STRING_VIEW\n    template<>\n    struct StringMaker<std::wstring_view> {\n        static std::string convert(std::wstring_view str);\n    };\n# endif\n\n    template<>\n    struct StringMaker<wchar_t const *> {\n        static std::string convert(wchar_t const * str);\n    };\n    template<>\n    struct StringMaker<wchar_t *> {\n        static std::string convert(wchar_t * str);\n    };\n#endif\n\n    // TBD: Should we use `strnlen` to ensure that we don't go out of the buffer,\n    //      while keeping string semantics?\n    template<int SZ>\n    struct StringMaker<char[SZ]> {\n        static std::string convert(char const* str) {\n            return ::Catch::Detail::stringify(std::string{ str });\n        }\n    };\n    template<int SZ>\n    struct StringMaker<signed char[SZ]> {\n        static std::string convert(signed char const* str) {\n            return ::Catch::Detail::stringify(std::string{ reinterpret_cast<char const *>(str) });\n        }\n    };\n    template<int SZ>\n    struct StringMaker<unsigned char[SZ]> {\n        static std::string convert(unsigned char const* str) {\n            return ::Catch::Detail::stringify(std::string{ reinterpret_cast<char const *>(str) });\n        }\n    };\n\n#if defined(CATCH_CONFIG_CPP17_BYTE)\n    template<>\n    struct StringMaker<std::byte> {\n        static std::string convert(std::byte value);\n    };\n#endif // defined(CATCH_CONFIG_CPP17_BYTE)\n    template<>\n    struct StringMaker<int> {\n        static std::string convert(int value);\n    };\n    template<>\n    struct StringMaker<long> {\n        static std::string convert(long value);\n    };\n    template<>\n    struct StringMaker<long long> {\n        static std::string convert(long long value);\n    };\n    template<>\n    struct StringMaker<unsigned int> {\n        static std::string convert(unsigned int value);\n    };\n    template<>\n    struct StringMaker<unsigned long> {\n        static std::string convert(unsigned long value);\n    };\n    template<>\n    struct StringMaker<unsigned long long> {\n        static std::string convert(unsigned long long value);\n    };\n\n    template<>\n    struct StringMaker<bool> {\n        static std::string convert(bool b);\n    };\n\n    template<>\n    struct StringMaker<char> {\n        static std::string convert(char c);\n    };\n    template<>\n    struct StringMaker<signed char> {\n        static std::string convert(signed char c);\n    };\n    template<>\n    struct StringMaker<unsigned char> {\n        static std::string convert(unsigned char c);\n    };\n\n    template<>\n    struct StringMaker<std::nullptr_t> {\n        static std::string convert(std::nullptr_t);\n    };\n\n    template<>\n    struct StringMaker<float> {\n        static std::string convert(float value);\n        static int precision;\n    };\n\n    template<>\n    struct StringMaker<double> {\n        static std::string convert(double value);\n        static int precision;\n    };\n\n    template <typename T>\n    struct StringMaker<T*> {\n        template <typename U>\n        static std::string convert(U* p) {\n            if (p) {\n                return ::Catch::Detail::rawMemoryToString(p);\n            } else {\n                return \"nullptr\";\n            }\n        }\n    };\n\n    template <typename R, typename C>\n    struct StringMaker<R C::*> {\n        static std::string convert(R C::* p) {\n            if (p) {\n                return ::Catch::Detail::rawMemoryToString(p);\n            } else {\n                return \"nullptr\";\n            }\n        }\n    };\n\n#if defined(_MANAGED)\n    template <typename T>\n    struct StringMaker<T^> {\n        static std::string convert( T^ ref ) {\n            return ::Catch::Detail::clrReferenceToString(ref);\n        }\n    };\n#endif\n\n    namespace Detail {\n        template<typename InputIterator>\n        std::string rangeToString(InputIterator first, InputIterator last) {\n            ReusableStringStream rss;\n            rss << \"{ \";\n            if (first != last) {\n                rss << ::Catch::Detail::stringify(*first);\n                for (++first; first != last; ++first)\n                    rss << \", \" << ::Catch::Detail::stringify(*first);\n            }\n            rss << \" }\";\n            return rss.str();\n        }\n    }\n\n#ifdef __OBJC__\n    template<>\n    struct StringMaker<NSString*> {\n        static std::string convert(NSString * nsstring) {\n            if (!nsstring)\n                return \"nil\";\n            return std::string(\"@\") + [nsstring UTF8String];\n        }\n    };\n    template<>\n    struct StringMaker<NSObject*> {\n        static std::string convert(NSObject* nsObject) {\n            return ::Catch::Detail::stringify([nsObject description]);\n        }\n\n    };\n    namespace Detail {\n        inline std::string stringify( NSString* nsstring ) {\n            return StringMaker<NSString*>::convert( nsstring );\n        }\n\n    } // namespace Detail\n#endif // __OBJC__\n\n} // namespace Catch\n\n//////////////////////////////////////////////////////\n// Separate std-lib types stringification, so it can be selectively enabled\n// This means that we do not bring in\n\n#if defined(CATCH_CONFIG_ENABLE_ALL_STRINGMAKERS)\n#  define CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER\n#  define CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER\n#  define CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER\n#  define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER\n#  define CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER\n#endif\n\n// Separate std::pair specialization\n#if defined(CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER)\n#include <utility>\nnamespace Catch {\n    template<typename T1, typename T2>\n    struct StringMaker<std::pair<T1, T2> > {\n        static std::string convert(const std::pair<T1, T2>& pair) {\n            ReusableStringStream rss;\n            rss << \"{ \"\n                << ::Catch::Detail::stringify(pair.first)\n                << \", \"\n                << ::Catch::Detail::stringify(pair.second)\n                << \" }\";\n            return rss.str();\n        }\n    };\n}\n#endif // CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER\n\n#if defined(CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER) && defined(CATCH_CONFIG_CPP17_OPTIONAL)\n#include <optional>\nnamespace Catch {\n    template<typename T>\n    struct StringMaker<std::optional<T> > {\n        static std::string convert(const std::optional<T>& optional) {\n            ReusableStringStream rss;\n            if (optional.has_value()) {\n                rss << ::Catch::Detail::stringify(*optional);\n            } else {\n                rss << \"{ }\";\n            }\n            return rss.str();\n        }\n    };\n}\n#endif // CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER\n\n// Separate std::tuple specialization\n#if defined(CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER)\n#include <tuple>\nnamespace Catch {\n    namespace Detail {\n        template<\n            typename Tuple,\n            std::size_t N = 0,\n            bool = (N < std::tuple_size<Tuple>::value)\n            >\n            struct TupleElementPrinter {\n            static void print(const Tuple& tuple, std::ostream& os) {\n                os << (N ? \", \" : \" \")\n                    << ::Catch::Detail::stringify(std::get<N>(tuple));\n                TupleElementPrinter<Tuple, N + 1>::print(tuple, os);\n            }\n        };\n\n        template<\n            typename Tuple,\n            std::size_t N\n        >\n            struct TupleElementPrinter<Tuple, N, false> {\n            static void print(const Tuple&, std::ostream&) {}\n        };\n\n    }\n\n    template<typename ...Types>\n    struct StringMaker<std::tuple<Types...>> {\n        static std::string convert(const std::tuple<Types...>& tuple) {\n            ReusableStringStream rss;\n            rss << '{';\n            Detail::TupleElementPrinter<std::tuple<Types...>>::print(tuple, rss.get());\n            rss << \" }\";\n            return rss.str();\n        }\n    };\n}\n#endif // CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER\n\n#if defined(CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER) && defined(CATCH_CONFIG_CPP17_VARIANT)\n#include <variant>\nnamespace Catch {\n    template<>\n    struct StringMaker<std::monostate> {\n        static std::string convert(const std::monostate&) {\n            return \"{ }\";\n        }\n    };\n\n    template<typename... Elements>\n    struct StringMaker<std::variant<Elements...>> {\n        static std::string convert(const std::variant<Elements...>& variant) {\n            if (variant.valueless_by_exception()) {\n                return \"{valueless variant}\";\n            } else {\n                return std::visit(\n                    [](const auto& value) {\n                        return ::Catch::Detail::stringify(value);\n                    },\n                    variant\n                );\n            }\n        }\n    };\n}\n#endif // CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER\n\nnamespace Catch {\n    // Import begin/ end from std here\n    using std::begin;\n    using std::end;\n\n    namespace detail {\n        template <typename...>\n        struct void_type {\n            using type = void;\n        };\n\n        template <typename T, typename = void>\n        struct is_range_impl : std::false_type {\n        };\n\n        template <typename T>\n        struct is_range_impl<T, typename void_type<decltype(begin(std::declval<T>()))>::type> : std::true_type {\n        };\n    } // namespace detail\n\n    template <typename T>\n    struct is_range : detail::is_range_impl<T> {\n    };\n\n#if defined(_MANAGED) // Managed types are never ranges\n    template <typename T>\n    struct is_range<T^> {\n        static const bool value = false;\n    };\n#endif\n\n    template<typename Range>\n    std::string rangeToString( Range const& range ) {\n        return ::Catch::Detail::rangeToString( begin( range ), end( range ) );\n    }\n\n    // Handle vector<bool> specially\n    template<typename Allocator>\n    std::string rangeToString( std::vector<bool, Allocator> const& v ) {\n        ReusableStringStream rss;\n        rss << \"{ \";\n        bool first = true;\n        for( bool b : v ) {\n            if( first )\n                first = false;\n            else\n                rss << \", \";\n            rss << ::Catch::Detail::stringify( b );\n        }\n        rss << \" }\";\n        return rss.str();\n    }\n\n    template<typename R>\n    struct StringMaker<R, typename std::enable_if<is_range<R>::value && !::Catch::Detail::IsStreamInsertable<R>::value>::type> {\n        static std::string convert( R const& range ) {\n            return rangeToString( range );\n        }\n    };\n\n    template <typename T, int SZ>\n    struct StringMaker<T[SZ]> {\n        static std::string convert(T const(&arr)[SZ]) {\n            return rangeToString(arr);\n        }\n    };\n\n} // namespace Catch\n\n// Separate std::chrono::duration specialization\n#if defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER)\n#include <ctime>\n#include <ratio>\n#include <chrono>\n\nnamespace Catch {\n\ntemplate <class Ratio>\nstruct ratio_string {\n    static std::string symbol();\n};\n\ntemplate <class Ratio>\nstd::string ratio_string<Ratio>::symbol() {\n    Catch::ReusableStringStream rss;\n    rss << '[' << Ratio::num << '/'\n        << Ratio::den << ']';\n    return rss.str();\n}\ntemplate <>\nstruct ratio_string<std::atto> {\n    static std::string symbol();\n};\ntemplate <>\nstruct ratio_string<std::femto> {\n    static std::string symbol();\n};\ntemplate <>\nstruct ratio_string<std::pico> {\n    static std::string symbol();\n};\ntemplate <>\nstruct ratio_string<std::nano> {\n    static std::string symbol();\n};\ntemplate <>\nstruct ratio_string<std::micro> {\n    static std::string symbol();\n};\ntemplate <>\nstruct ratio_string<std::milli> {\n    static std::string symbol();\n};\n\n    ////////////\n    // std::chrono::duration specializations\n    template<typename Value, typename Ratio>\n    struct StringMaker<std::chrono::duration<Value, Ratio>> {\n        static std::string convert(std::chrono::duration<Value, Ratio> const& duration) {\n            ReusableStringStream rss;\n            rss << duration.count() << ' ' << ratio_string<Ratio>::symbol() << 's';\n            return rss.str();\n        }\n    };\n    template<typename Value>\n    struct StringMaker<std::chrono::duration<Value, std::ratio<1>>> {\n        static std::string convert(std::chrono::duration<Value, std::ratio<1>> const& duration) {\n            ReusableStringStream rss;\n            rss << duration.count() << \" s\";\n            return rss.str();\n        }\n    };\n    template<typename Value>\n    struct StringMaker<std::chrono::duration<Value, std::ratio<60>>> {\n        static std::string convert(std::chrono::duration<Value, std::ratio<60>> const& duration) {\n            ReusableStringStream rss;\n            rss << duration.count() << \" m\";\n            return rss.str();\n        }\n    };\n    template<typename Value>\n    struct StringMaker<std::chrono::duration<Value, std::ratio<3600>>> {\n        static std::string convert(std::chrono::duration<Value, std::ratio<3600>> const& duration) {\n            ReusableStringStream rss;\n            rss << duration.count() << \" h\";\n            return rss.str();\n        }\n    };\n\n    ////////////\n    // std::chrono::time_point specialization\n    // Generic time_point cannot be specialized, only std::chrono::time_point<system_clock>\n    template<typename Clock, typename Duration>\n    struct StringMaker<std::chrono::time_point<Clock, Duration>> {\n        static std::string convert(std::chrono::time_point<Clock, Duration> const& time_point) {\n            return ::Catch::Detail::stringify(time_point.time_since_epoch()) + \" since epoch\";\n        }\n    };\n    // std::chrono::time_point<system_clock> specialization\n    template<typename Duration>\n    struct StringMaker<std::chrono::time_point<std::chrono::system_clock, Duration>> {\n        static std::string convert(std::chrono::time_point<std::chrono::system_clock, Duration> const& time_point) {\n            auto converted = std::chrono::system_clock::to_time_t(time_point);\n\n#ifdef _MSC_VER\n            std::tm timeInfo = {};\n            gmtime_s(&timeInfo, &converted);\n#else\n            std::tm* timeInfo = std::gmtime(&converted);\n#endif\n\n            auto const timeStampSize = sizeof(\"2017-01-16T17:06:45Z\");\n            char timeStamp[timeStampSize];\n            const char * const fmt = \"%Y-%m-%dT%H:%M:%SZ\";\n\n#ifdef _MSC_VER\n            std::strftime(timeStamp, timeStampSize, fmt, &timeInfo);\n#else\n            std::strftime(timeStamp, timeStampSize, fmt, timeInfo);\n#endif\n            return std::string(timeStamp);\n        }\n    };\n}\n#endif // CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER\n\n#define INTERNAL_CATCH_REGISTER_ENUM( enumName, ... ) \\\nnamespace Catch { \\\n    template<> struct StringMaker<enumName> { \\\n        static std::string convert( enumName value ) { \\\n            static const auto& enumInfo = ::Catch::getMutableRegistryHub().getMutableEnumValuesRegistry().registerEnum( #enumName, #__VA_ARGS__, { __VA_ARGS__ } ); \\\n            return static_cast<std::string>(enumInfo.lookup( static_cast<int>( value ) )); \\\n        } \\\n    }; \\\n}\n\n#define CATCH_REGISTER_ENUM( enumName, ... ) INTERNAL_CATCH_REGISTER_ENUM( enumName, __VA_ARGS__ )\n\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif\n\n// end catch_tostring.h\n#include <iosfwd>\n\n#ifdef _MSC_VER\n#pragma warning(push)\n#pragma warning(disable:4389) // '==' : signed/unsigned mismatch\n#pragma warning(disable:4018) // more \"signed/unsigned mismatch\"\n#pragma warning(disable:4312) // Converting int to T* using reinterpret_cast (issue on x64 platform)\n#pragma warning(disable:4180) // qualifier applied to function type has no meaning\n#pragma warning(disable:4800) // Forcing result to true or false\n#endif\n\nnamespace Catch {\n\n    struct ITransientExpression {\n        auto isBinaryExpression() const -> bool { return m_isBinaryExpression; }\n        auto getResult() const -> bool { return m_result; }\n        virtual void streamReconstructedExpression( std::ostream &os ) const = 0;\n\n        ITransientExpression( bool isBinaryExpression, bool result )\n        :   m_isBinaryExpression( isBinaryExpression ),\n            m_result( result )\n        {}\n\n        // We don't actually need a virtual destructor, but many static analysers\n        // complain if it's not here :-(\n        virtual ~ITransientExpression();\n\n        bool m_isBinaryExpression;\n        bool m_result;\n\n    };\n\n    void formatReconstructedExpression( std::ostream &os, std::string const& lhs, StringRef op, std::string const& rhs );\n\n    template<typename LhsT, typename RhsT>\n    class BinaryExpr  : public ITransientExpression {\n        LhsT m_lhs;\n        StringRef m_op;\n        RhsT m_rhs;\n\n        void streamReconstructedExpression( std::ostream &os ) const override {\n            formatReconstructedExpression\n                    ( os, Catch::Detail::stringify( m_lhs ), m_op, Catch::Detail::stringify( m_rhs ) );\n        }\n\n    public:\n        BinaryExpr( bool comparisonResult, LhsT lhs, StringRef op, RhsT rhs )\n        :   ITransientExpression{ true, comparisonResult },\n            m_lhs( lhs ),\n            m_op( op ),\n            m_rhs( rhs )\n        {}\n\n        template<typename T>\n        auto operator && ( T ) const -> BinaryExpr<LhsT, RhsT const&> const {\n            static_assert(always_false<T>::value,\n            \"chained comparisons are not supported inside assertions, \"\n            \"wrap the expression inside parentheses, or decompose it\");\n        }\n\n        template<typename T>\n        auto operator || ( T ) const -> BinaryExpr<LhsT, RhsT const&> const {\n            static_assert(always_false<T>::value,\n            \"chained comparisons are not supported inside assertions, \"\n            \"wrap the expression inside parentheses, or decompose it\");\n        }\n\n        template<typename T>\n        auto operator == ( T ) const -> BinaryExpr<LhsT, RhsT const&> const {\n            static_assert(always_false<T>::value,\n            \"chained comparisons are not supported inside assertions, \"\n            \"wrap the expression inside parentheses, or decompose it\");\n        }\n\n        template<typename T>\n        auto operator != ( T ) const -> BinaryExpr<LhsT, RhsT const&> const {\n            static_assert(always_false<T>::value,\n            \"chained comparisons are not supported inside assertions, \"\n            \"wrap the expression inside parentheses, or decompose it\");\n        }\n\n        template<typename T>\n        auto operator > ( T ) const -> BinaryExpr<LhsT, RhsT const&> const {\n            static_assert(always_false<T>::value,\n            \"chained comparisons are not supported inside assertions, \"\n            \"wrap the expression inside parentheses, or decompose it\");\n        }\n\n        template<typename T>\n        auto operator < ( T ) const -> BinaryExpr<LhsT, RhsT const&> const {\n            static_assert(always_false<T>::value,\n            \"chained comparisons are not supported inside assertions, \"\n            \"wrap the expression inside parentheses, or decompose it\");\n        }\n\n        template<typename T>\n        auto operator >= ( T ) const -> BinaryExpr<LhsT, RhsT const&> const {\n            static_assert(always_false<T>::value,\n            \"chained comparisons are not supported inside assertions, \"\n            \"wrap the expression inside parentheses, or decompose it\");\n        }\n\n        template<typename T>\n        auto operator <= ( T ) const -> BinaryExpr<LhsT, RhsT const&> const {\n            static_assert(always_false<T>::value,\n            \"chained comparisons are not supported inside assertions, \"\n            \"wrap the expression inside parentheses, or decompose it\");\n        }\n    };\n\n    template<typename LhsT>\n    class UnaryExpr : public ITransientExpression {\n        LhsT m_lhs;\n\n        void streamReconstructedExpression( std::ostream &os ) const override {\n            os << Catch::Detail::stringify( m_lhs );\n        }\n\n    public:\n        explicit UnaryExpr( LhsT lhs )\n        :   ITransientExpression{ false, static_cast<bool>(lhs) },\n            m_lhs( lhs )\n        {}\n    };\n\n    // Specialised comparison functions to handle equality comparisons between ints and pointers (NULL deduces as an int)\n    template<typename LhsT, typename RhsT>\n    auto compareEqual( LhsT const& lhs, RhsT const& rhs ) -> bool { return static_cast<bool>(lhs == rhs); }\n    template<typename T>\n    auto compareEqual( T* const& lhs, int rhs ) -> bool { return lhs == reinterpret_cast<void const*>( rhs ); }\n    template<typename T>\n    auto compareEqual( T* const& lhs, long rhs ) -> bool { return lhs == reinterpret_cast<void const*>( rhs ); }\n    template<typename T>\n    auto compareEqual( int lhs, T* const& rhs ) -> bool { return reinterpret_cast<void const*>( lhs ) == rhs; }\n    template<typename T>\n    auto compareEqual( long lhs, T* const& rhs ) -> bool { return reinterpret_cast<void const*>( lhs ) == rhs; }\n\n    template<typename LhsT, typename RhsT>\n    auto compareNotEqual( LhsT const& lhs, RhsT&& rhs ) -> bool { return static_cast<bool>(lhs != rhs); }\n    template<typename T>\n    auto compareNotEqual( T* const& lhs, int rhs ) -> bool { return lhs != reinterpret_cast<void const*>( rhs ); }\n    template<typename T>\n    auto compareNotEqual( T* const& lhs, long rhs ) -> bool { return lhs != reinterpret_cast<void const*>( rhs ); }\n    template<typename T>\n    auto compareNotEqual( int lhs, T* const& rhs ) -> bool { return reinterpret_cast<void const*>( lhs ) != rhs; }\n    template<typename T>\n    auto compareNotEqual( long lhs, T* const& rhs ) -> bool { return reinterpret_cast<void const*>( lhs ) != rhs; }\n\n    template<typename LhsT>\n    class ExprLhs {\n        LhsT m_lhs;\n    public:\n        explicit ExprLhs( LhsT lhs ) : m_lhs( lhs ) {}\n\n        template<typename RhsT>\n        auto operator == ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const {\n            return { compareEqual( m_lhs, rhs ), m_lhs, \"==\", rhs };\n        }\n        auto operator == ( bool rhs ) -> BinaryExpr<LhsT, bool> const {\n            return { m_lhs == rhs, m_lhs, \"==\", rhs };\n        }\n\n        template<typename RhsT>\n        auto operator != ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const {\n            return { compareNotEqual( m_lhs, rhs ), m_lhs, \"!=\", rhs };\n        }\n        auto operator != ( bool rhs ) -> BinaryExpr<LhsT, bool> const {\n            return { m_lhs != rhs, m_lhs, \"!=\", rhs };\n        }\n\n        template<typename RhsT>\n        auto operator > ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const {\n            return { static_cast<bool>(m_lhs > rhs), m_lhs, \">\", rhs };\n        }\n        template<typename RhsT>\n        auto operator < ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const {\n            return { static_cast<bool>(m_lhs < rhs), m_lhs, \"<\", rhs };\n        }\n        template<typename RhsT>\n        auto operator >= ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const {\n            return { static_cast<bool>(m_lhs >= rhs), m_lhs, \">=\", rhs };\n        }\n        template<typename RhsT>\n        auto operator <= ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const {\n            return { static_cast<bool>(m_lhs <= rhs), m_lhs, \"<=\", rhs };\n        }\n        template <typename RhsT>\n        auto operator | (RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const {\n            return { static_cast<bool>(m_lhs | rhs), m_lhs, \"|\", rhs };\n        }\n        template <typename RhsT>\n        auto operator & (RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const {\n            return { static_cast<bool>(m_lhs & rhs), m_lhs, \"&\", rhs };\n        }\n        template <typename RhsT>\n        auto operator ^ (RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const {\n            return { static_cast<bool>(m_lhs ^ rhs), m_lhs, \"^\", rhs };\n        }\n\n        template<typename RhsT>\n        auto operator && ( RhsT const& ) -> BinaryExpr<LhsT, RhsT const&> const {\n            static_assert(always_false<RhsT>::value,\n            \"operator&& is not supported inside assertions, \"\n            \"wrap the expression inside parentheses, or decompose it\");\n        }\n\n        template<typename RhsT>\n        auto operator || ( RhsT const& ) -> BinaryExpr<LhsT, RhsT const&> const {\n            static_assert(always_false<RhsT>::value,\n            \"operator|| is not supported inside assertions, \"\n            \"wrap the expression inside parentheses, or decompose it\");\n        }\n\n        auto makeUnaryExpr() const -> UnaryExpr<LhsT> {\n            return UnaryExpr<LhsT>{ m_lhs };\n        }\n    };\n\n    void handleExpression( ITransientExpression const& expr );\n\n    template<typename T>\n    void handleExpression( ExprLhs<T> const& expr ) {\n        handleExpression( expr.makeUnaryExpr() );\n    }\n\n    struct Decomposer {\n        template<typename T>\n        auto operator <= ( T const& lhs ) -> ExprLhs<T const&> {\n            return ExprLhs<T const&>{ lhs };\n        }\n\n        auto operator <=( bool value ) -> ExprLhs<bool> {\n            return ExprLhs<bool>{ value };\n        }\n    };\n\n} // end namespace Catch\n\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif\n\n// end catch_decomposer.h\n// start catch_interfaces_capture.h\n\n#include <string>\n#include <chrono>\n\nnamespace Catch {\n\n    class AssertionResult;\n    struct AssertionInfo;\n    struct SectionInfo;\n    struct SectionEndInfo;\n    struct MessageInfo;\n    struct MessageBuilder;\n    struct Counts;\n    struct AssertionReaction;\n    struct SourceLineInfo;\n\n    struct ITransientExpression;\n    struct IGeneratorTracker;\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n    struct BenchmarkInfo;\n    template <typename Duration = std::chrono::duration<double, std::nano>>\n    struct BenchmarkStats;\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\n    struct IResultCapture {\n\n        virtual ~IResultCapture();\n\n        virtual bool sectionStarted(    SectionInfo const& sectionInfo,\n                                        Counts& assertions ) = 0;\n        virtual void sectionEnded( SectionEndInfo const& endInfo ) = 0;\n        virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) = 0;\n\n        virtual auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& = 0;\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n        virtual void benchmarkPreparing( std::string const& name ) = 0;\n        virtual void benchmarkStarting( BenchmarkInfo const& info ) = 0;\n        virtual void benchmarkEnded( BenchmarkStats<> const& stats ) = 0;\n        virtual void benchmarkFailed( std::string const& error ) = 0;\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\n        virtual void pushScopedMessage( MessageInfo const& message ) = 0;\n        virtual void popScopedMessage( MessageInfo const& message ) = 0;\n\n        virtual void emplaceUnscopedMessage( MessageBuilder const& builder ) = 0;\n\n        virtual void handleFatalErrorCondition( StringRef message ) = 0;\n\n        virtual void handleExpr\n                (   AssertionInfo const& info,\n                    ITransientExpression const& expr,\n                    AssertionReaction& reaction ) = 0;\n        virtual void handleMessage\n                (   AssertionInfo const& info,\n                    ResultWas::OfType resultType,\n                    StringRef const& message,\n                    AssertionReaction& reaction ) = 0;\n        virtual void handleUnexpectedExceptionNotThrown\n                (   AssertionInfo const& info,\n                    AssertionReaction& reaction ) = 0;\n        virtual void handleUnexpectedInflightException\n                (   AssertionInfo const& info,\n                    std::string const& message,\n                    AssertionReaction& reaction ) = 0;\n        virtual void handleIncomplete\n                (   AssertionInfo const& info ) = 0;\n        virtual void handleNonExpr\n                (   AssertionInfo const &info,\n                    ResultWas::OfType resultType,\n                    AssertionReaction &reaction ) = 0;\n\n        virtual bool lastAssertionPassed() = 0;\n        virtual void assertionPassed() = 0;\n\n        // Deprecated, do not use:\n        virtual std::string getCurrentTestName() const = 0;\n        virtual const AssertionResult* getLastResult() const = 0;\n        virtual void exceptionEarlyReported() = 0;\n    };\n\n    IResultCapture& getResultCapture();\n}\n\n// end catch_interfaces_capture.h\nnamespace Catch {\n\n    struct TestFailureException{};\n    struct AssertionResultData;\n    struct IResultCapture;\n    class RunContext;\n\n    class LazyExpression {\n        friend class AssertionHandler;\n        friend struct AssertionStats;\n        friend class RunContext;\n\n        ITransientExpression const* m_transientExpression = nullptr;\n        bool m_isNegated;\n    public:\n        LazyExpression( bool isNegated );\n        LazyExpression( LazyExpression const& other );\n        LazyExpression& operator = ( LazyExpression const& ) = delete;\n\n        explicit operator bool() const;\n\n        friend auto operator << ( std::ostream& os, LazyExpression const& lazyExpr ) -> std::ostream&;\n    };\n\n    struct AssertionReaction {\n        bool shouldDebugBreak = false;\n        bool shouldThrow = false;\n    };\n\n    class AssertionHandler {\n        AssertionInfo m_assertionInfo;\n        AssertionReaction m_reaction;\n        bool m_completed = false;\n        IResultCapture& m_resultCapture;\n\n    public:\n        AssertionHandler\n            (   StringRef const& macroName,\n                SourceLineInfo const& lineInfo,\n                StringRef capturedExpression,\n                ResultDisposition::Flags resultDisposition );\n        ~AssertionHandler() {\n            if ( !m_completed ) {\n                m_resultCapture.handleIncomplete( m_assertionInfo );\n            }\n        }\n\n        template<typename T>\n        void handleExpr( ExprLhs<T> const& expr ) {\n            handleExpr( expr.makeUnaryExpr() );\n        }\n        void handleExpr( ITransientExpression const& expr );\n\n        void handleMessage(ResultWas::OfType resultType, StringRef const& message);\n\n        void handleExceptionThrownAsExpected();\n        void handleUnexpectedExceptionNotThrown();\n        void handleExceptionNotThrownAsExpected();\n        void handleThrowingCallSkipped();\n        void handleUnexpectedInflightException();\n\n        void complete();\n        void setCompleted();\n\n        // query\n        auto allowThrows() const -> bool;\n    };\n\n    void handleExceptionMatchExpr( AssertionHandler& handler, std::string const& str, StringRef const& matcherString );\n\n} // namespace Catch\n\n// end catch_assertionhandler.h\n// start catch_message.h\n\n#include <string>\n#include <vector>\n\nnamespace Catch {\n\n    struct MessageInfo {\n        MessageInfo(    StringRef const& _macroName,\n                        SourceLineInfo const& _lineInfo,\n                        ResultWas::OfType _type );\n\n        StringRef macroName;\n        std::string message;\n        SourceLineInfo lineInfo;\n        ResultWas::OfType type;\n        unsigned int sequence;\n\n        bool operator == ( MessageInfo const& other ) const;\n        bool operator < ( MessageInfo const& other ) const;\n    private:\n        static unsigned int globalCount;\n    };\n\n    struct MessageStream {\n\n        template<typename T>\n        MessageStream& operator << ( T const& value ) {\n            m_stream << value;\n            return *this;\n        }\n\n        ReusableStringStream m_stream;\n    };\n\n    struct MessageBuilder : MessageStream {\n        MessageBuilder( StringRef const& macroName,\n                        SourceLineInfo const& lineInfo,\n                        ResultWas::OfType type );\n\n        template<typename T>\n        MessageBuilder& operator << ( T const& value ) {\n            m_stream << value;\n            return *this;\n        }\n\n        MessageInfo m_info;\n    };\n\n    class ScopedMessage {\n    public:\n        explicit ScopedMessage( MessageBuilder const& builder );\n        ScopedMessage( ScopedMessage& duplicate ) = delete;\n        ScopedMessage( ScopedMessage&& old );\n        ~ScopedMessage();\n\n        MessageInfo m_info;\n        bool m_moved;\n    };\n\n    class Capturer {\n        std::vector<MessageInfo> m_messages;\n        IResultCapture& m_resultCapture = getResultCapture();\n        size_t m_captured = 0;\n    public:\n        Capturer( StringRef macroName, SourceLineInfo const& lineInfo, ResultWas::OfType resultType, StringRef names );\n        ~Capturer();\n\n        void captureValue( size_t index, std::string const& value );\n\n        template<typename T>\n        void captureValues( size_t index, T const& value ) {\n            captureValue( index, Catch::Detail::stringify( value ) );\n        }\n\n        template<typename T, typename... Ts>\n        void captureValues( size_t index, T const& value, Ts const&... values ) {\n            captureValue( index, Catch::Detail::stringify(value) );\n            captureValues( index+1, values... );\n        }\n    };\n\n} // end namespace Catch\n\n// end catch_message.h\n#if !defined(CATCH_CONFIG_DISABLE)\n\n#if !defined(CATCH_CONFIG_DISABLE_STRINGIFICATION)\n  #define CATCH_INTERNAL_STRINGIFY(...) #__VA_ARGS__\n#else\n  #define CATCH_INTERNAL_STRINGIFY(...) \"Disabled by CATCH_CONFIG_DISABLE_STRINGIFICATION\"\n#endif\n\n#if defined(CATCH_CONFIG_FAST_COMPILE) || defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)\n\n///////////////////////////////////////////////////////////////////////////////\n// Another way to speed-up compilation is to omit local try-catch for REQUIRE*\n// macros.\n#define INTERNAL_CATCH_TRY\n#define INTERNAL_CATCH_CATCH( capturer )\n\n#else // CATCH_CONFIG_FAST_COMPILE\n\n#define INTERNAL_CATCH_TRY try\n#define INTERNAL_CATCH_CATCH( handler ) catch(...) { handler.handleUnexpectedInflightException(); }\n\n#endif\n\n#define INTERNAL_CATCH_REACT( handler ) handler.complete();\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_TEST( macroName, resultDisposition, ... ) \\\n    do { \\\n        CATCH_INTERNAL_IGNORE_BUT_WARN(__VA_ARGS__); \\\n        Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition ); \\\n        INTERNAL_CATCH_TRY { \\\n            CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \\\n            CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \\\n            catchAssertionHandler.handleExpr( Catch::Decomposer() <= __VA_ARGS__ ); \\\n            CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \\\n        } INTERNAL_CATCH_CATCH( catchAssertionHandler ) \\\n        INTERNAL_CATCH_REACT( catchAssertionHandler ) \\\n    } while( (void)0, (false) && static_cast<bool>( !!(__VA_ARGS__) ) )\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_IF( macroName, resultDisposition, ... ) \\\n    INTERNAL_CATCH_TEST( macroName, resultDisposition, __VA_ARGS__ ); \\\n    if( Catch::getResultCapture().lastAssertionPassed() )\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_ELSE( macroName, resultDisposition, ... ) \\\n    INTERNAL_CATCH_TEST( macroName, resultDisposition, __VA_ARGS__ ); \\\n    if( !Catch::getResultCapture().lastAssertionPassed() )\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_NO_THROW( macroName, resultDisposition, ... ) \\\n    do { \\\n        Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition ); \\\n        try { \\\n            static_cast<void>(__VA_ARGS__); \\\n            catchAssertionHandler.handleExceptionNotThrownAsExpected(); \\\n        } \\\n        catch( ... ) { \\\n            catchAssertionHandler.handleUnexpectedInflightException(); \\\n        } \\\n        INTERNAL_CATCH_REACT( catchAssertionHandler ) \\\n    } while( false )\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_THROWS( macroName, resultDisposition, ... ) \\\n    do { \\\n        Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition); \\\n        if( catchAssertionHandler.allowThrows() ) \\\n            try { \\\n                static_cast<void>(__VA_ARGS__); \\\n                catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \\\n            } \\\n            catch( ... ) { \\\n                catchAssertionHandler.handleExceptionThrownAsExpected(); \\\n            } \\\n        else \\\n            catchAssertionHandler.handleThrowingCallSkipped(); \\\n        INTERNAL_CATCH_REACT( catchAssertionHandler ) \\\n    } while( false )\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_THROWS_AS( macroName, exceptionType, resultDisposition, expr ) \\\n    do { \\\n        Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(expr) \", \" CATCH_INTERNAL_STRINGIFY(exceptionType), resultDisposition ); \\\n        if( catchAssertionHandler.allowThrows() ) \\\n            try { \\\n                static_cast<void>(expr); \\\n                catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \\\n            } \\\n            catch( exceptionType const& ) { \\\n                catchAssertionHandler.handleExceptionThrownAsExpected(); \\\n            } \\\n            catch( ... ) { \\\n                catchAssertionHandler.handleUnexpectedInflightException(); \\\n            } \\\n        else \\\n            catchAssertionHandler.handleThrowingCallSkipped(); \\\n        INTERNAL_CATCH_REACT( catchAssertionHandler ) \\\n    } while( false )\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_MSG( macroName, messageType, resultDisposition, ... ) \\\n    do { \\\n        Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::StringRef(), resultDisposition ); \\\n        catchAssertionHandler.handleMessage( messageType, ( Catch::MessageStream() << __VA_ARGS__ + ::Catch::StreamEndStop() ).m_stream.str() ); \\\n        INTERNAL_CATCH_REACT( catchAssertionHandler ) \\\n    } while( false )\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_CAPTURE( varName, macroName, ... ) \\\n    auto varName = Catch::Capturer( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info, #__VA_ARGS__ ); \\\n    varName.captureValues( 0, __VA_ARGS__ )\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_INFO( macroName, log ) \\\n    Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage )( Catch::MessageBuilder( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log );\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_UNSCOPED_INFO( macroName, log ) \\\n    Catch::getResultCapture().emplaceUnscopedMessage( Catch::MessageBuilder( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log )\n\n///////////////////////////////////////////////////////////////////////////////\n// Although this is matcher-based, it can be used with just a string\n#define INTERNAL_CATCH_THROWS_STR_MATCHES( macroName, resultDisposition, matcher, ... ) \\\n    do { \\\n        Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__) \", \" CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \\\n        if( catchAssertionHandler.allowThrows() ) \\\n            try { \\\n                static_cast<void>(__VA_ARGS__); \\\n                catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \\\n            } \\\n            catch( ... ) { \\\n                Catch::handleExceptionMatchExpr( catchAssertionHandler, matcher, #matcher##_catch_sr ); \\\n            } \\\n        else \\\n            catchAssertionHandler.handleThrowingCallSkipped(); \\\n        INTERNAL_CATCH_REACT( catchAssertionHandler ) \\\n    } while( false )\n\n#endif // CATCH_CONFIG_DISABLE\n\n// end catch_capture.hpp\n// start catch_section.h\n\n// start catch_section_info.h\n\n// start catch_totals.h\n\n#include <cstddef>\n\nnamespace Catch {\n\n    struct Counts {\n        Counts operator - ( Counts const& other ) const;\n        Counts& operator += ( Counts const& other );\n\n        std::size_t total() const;\n        bool allPassed() const;\n        bool allOk() const;\n\n        std::size_t passed = 0;\n        std::size_t failed = 0;\n        std::size_t failedButOk = 0;\n    };\n\n    struct Totals {\n\n        Totals operator - ( Totals const& other ) const;\n        Totals& operator += ( Totals const& other );\n\n        Totals delta( Totals const& prevTotals ) const;\n\n        int error = 0;\n        Counts assertions;\n        Counts testCases;\n    };\n}\n\n// end catch_totals.h\n#include <string>\n\nnamespace Catch {\n\n    struct SectionInfo {\n        SectionInfo\n            (   SourceLineInfo const& _lineInfo,\n                std::string const& _name );\n\n        // Deprecated\n        SectionInfo\n            (   SourceLineInfo const& _lineInfo,\n                std::string const& _name,\n                std::string const& ) : SectionInfo( _lineInfo, _name ) {}\n\n        std::string name;\n        std::string description; // !Deprecated: this will always be empty\n        SourceLineInfo lineInfo;\n    };\n\n    struct SectionEndInfo {\n        SectionInfo sectionInfo;\n        Counts prevAssertions;\n        double durationInSeconds;\n    };\n\n} // end namespace Catch\n\n// end catch_section_info.h\n// start catch_timer.h\n\n#include <cstdint>\n\nnamespace Catch {\n\n    auto getCurrentNanosecondsSinceEpoch() -> uint64_t;\n    auto getEstimatedClockResolution() -> uint64_t;\n\n    class Timer {\n        uint64_t m_nanoseconds = 0;\n    public:\n        void start();\n        auto getElapsedNanoseconds() const -> uint64_t;\n        auto getElapsedMicroseconds() const -> uint64_t;\n        auto getElapsedMilliseconds() const -> unsigned int;\n        auto getElapsedSeconds() const -> double;\n    };\n\n} // namespace Catch\n\n// end catch_timer.h\n#include <string>\n\nnamespace Catch {\n\n    class Section : NonCopyable {\n    public:\n        Section( SectionInfo const& info );\n        ~Section();\n\n        // This indicates whether the section should be executed or not\n        explicit operator bool() const;\n\n    private:\n        SectionInfo m_info;\n\n        std::string m_name;\n        Counts m_assertions;\n        bool m_sectionIncluded;\n        Timer m_timer;\n    };\n\n} // end namespace Catch\n\n#define INTERNAL_CATCH_SECTION( ... ) \\\n    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \\\n    CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \\\n    if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) ) \\\n    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION\n\n#define INTERNAL_CATCH_DYNAMIC_SECTION( ... ) \\\n    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \\\n    CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \\\n    if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, (Catch::ReusableStringStream() << __VA_ARGS__).str() ) ) \\\n    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION\n\n// end catch_section.h\n// start catch_interfaces_exception.h\n\n// start catch_interfaces_registry_hub.h\n\n#include <string>\n#include <memory>\n\nnamespace Catch {\n\n    class TestCase;\n    struct ITestCaseRegistry;\n    struct IExceptionTranslatorRegistry;\n    struct IExceptionTranslator;\n    struct IReporterRegistry;\n    struct IReporterFactory;\n    struct ITagAliasRegistry;\n    struct IMutableEnumValuesRegistry;\n\n    class StartupExceptionRegistry;\n\n    using IReporterFactoryPtr = std::shared_ptr<IReporterFactory>;\n\n    struct IRegistryHub {\n        virtual ~IRegistryHub();\n\n        virtual IReporterRegistry const& getReporterRegistry() const = 0;\n        virtual ITestCaseRegistry const& getTestCaseRegistry() const = 0;\n        virtual ITagAliasRegistry const& getTagAliasRegistry() const = 0;\n        virtual IExceptionTranslatorRegistry const& getExceptionTranslatorRegistry() const = 0;\n\n        virtual StartupExceptionRegistry const& getStartupExceptionRegistry() const = 0;\n    };\n\n    struct IMutableRegistryHub {\n        virtual ~IMutableRegistryHub();\n        virtual void registerReporter( std::string const& name, IReporterFactoryPtr const& factory ) = 0;\n        virtual void registerListener( IReporterFactoryPtr const& factory ) = 0;\n        virtual void registerTest( TestCase const& testInfo ) = 0;\n        virtual void registerTranslator( const IExceptionTranslator* translator ) = 0;\n        virtual void registerTagAlias( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) = 0;\n        virtual void registerStartupException() noexcept = 0;\n        virtual IMutableEnumValuesRegistry& getMutableEnumValuesRegistry() = 0;\n    };\n\n    IRegistryHub const& getRegistryHub();\n    IMutableRegistryHub& getMutableRegistryHub();\n    void cleanUp();\n    std::string translateActiveException();\n\n}\n\n// end catch_interfaces_registry_hub.h\n#if defined(CATCH_CONFIG_DISABLE)\n    #define INTERNAL_CATCH_TRANSLATE_EXCEPTION_NO_REG( translatorName, signature) \\\n        static std::string translatorName( signature )\n#endif\n\n#include <exception>\n#include <string>\n#include <vector>\n\nnamespace Catch {\n    using exceptionTranslateFunction = std::string(*)();\n\n    struct IExceptionTranslator;\n    using ExceptionTranslators = std::vector<std::unique_ptr<IExceptionTranslator const>>;\n\n    struct IExceptionTranslator {\n        virtual ~IExceptionTranslator();\n        virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const = 0;\n    };\n\n    struct IExceptionTranslatorRegistry {\n        virtual ~IExceptionTranslatorRegistry();\n\n        virtual std::string translateActiveException() const = 0;\n    };\n\n    class ExceptionTranslatorRegistrar {\n        template<typename T>\n        class ExceptionTranslator : public IExceptionTranslator {\n        public:\n\n            ExceptionTranslator( std::string(*translateFunction)( T& ) )\n            : m_translateFunction( translateFunction )\n            {}\n\n            std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const override {\n#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)\n                return \"\";\n#else\n                try {\n                    if( it == itEnd )\n                        std::rethrow_exception(std::current_exception());\n                    else\n                        return (*it)->translate( it+1, itEnd );\n                }\n                catch( T& ex ) {\n                    return m_translateFunction( ex );\n                }\n#endif\n            }\n\n        protected:\n            std::string(*m_translateFunction)( T& );\n        };\n\n    public:\n        template<typename T>\n        ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) {\n            getMutableRegistryHub().registerTranslator\n                ( new ExceptionTranslator<T>( translateFunction ) );\n        }\n    };\n}\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_TRANSLATE_EXCEPTION2( translatorName, signature ) \\\n    static std::string translatorName( signature ); \\\n    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \\\n    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \\\n    namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &translatorName ); } \\\n    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \\\n    static std::string translatorName( signature )\n\n#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION2( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature )\n\n// end catch_interfaces_exception.h\n// start catch_approx.h\n\n#include <type_traits>\n\nnamespace Catch {\nnamespace Detail {\n\n    class Approx {\n    private:\n        bool equalityComparisonImpl(double other) const;\n        // Validates the new margin (margin >= 0)\n        // out-of-line to avoid including stdexcept in the header\n        void setMargin(double margin);\n        // Validates the new epsilon (0 < epsilon < 1)\n        // out-of-line to avoid including stdexcept in the header\n        void setEpsilon(double epsilon);\n\n    public:\n        explicit Approx ( double value );\n\n        static Approx custom();\n\n        Approx operator-() const;\n\n        template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n        Approx operator()( T const& value ) {\n            Approx approx( static_cast<double>(value) );\n            approx.m_epsilon = m_epsilon;\n            approx.m_margin = m_margin;\n            approx.m_scale = m_scale;\n            return approx;\n        }\n\n        template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n        explicit Approx( T const& value ): Approx(static_cast<double>(value))\n        {}\n\n        template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n        friend bool operator == ( const T& lhs, Approx const& rhs ) {\n            auto lhs_v = static_cast<double>(lhs);\n            return rhs.equalityComparisonImpl(lhs_v);\n        }\n\n        template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n        friend bool operator == ( Approx const& lhs, const T& rhs ) {\n            return operator==( rhs, lhs );\n        }\n\n        template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n        friend bool operator != ( T const& lhs, Approx const& rhs ) {\n            return !operator==( lhs, rhs );\n        }\n\n        template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n        friend bool operator != ( Approx const& lhs, T const& rhs ) {\n            return !operator==( rhs, lhs );\n        }\n\n        template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n        friend bool operator <= ( T const& lhs, Approx const& rhs ) {\n            return static_cast<double>(lhs) < rhs.m_value || lhs == rhs;\n        }\n\n        template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n        friend bool operator <= ( Approx const& lhs, T const& rhs ) {\n            return lhs.m_value < static_cast<double>(rhs) || lhs == rhs;\n        }\n\n        template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n        friend bool operator >= ( T const& lhs, Approx const& rhs ) {\n            return static_cast<double>(lhs) > rhs.m_value || lhs == rhs;\n        }\n\n        template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n        friend bool operator >= ( Approx const& lhs, T const& rhs ) {\n            return lhs.m_value > static_cast<double>(rhs) || lhs == rhs;\n        }\n\n        template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n        Approx& epsilon( T const& newEpsilon ) {\n            double epsilonAsDouble = static_cast<double>(newEpsilon);\n            setEpsilon(epsilonAsDouble);\n            return *this;\n        }\n\n        template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n        Approx& margin( T const& newMargin ) {\n            double marginAsDouble = static_cast<double>(newMargin);\n            setMargin(marginAsDouble);\n            return *this;\n        }\n\n        template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n        Approx& scale( T const& newScale ) {\n            m_scale = static_cast<double>(newScale);\n            return *this;\n        }\n\n        std::string toString() const;\n\n    private:\n        double m_epsilon;\n        double m_margin;\n        double m_scale;\n        double m_value;\n    };\n} // end namespace Detail\n\nnamespace literals {\n    Detail::Approx operator \"\" _a(long double val);\n    Detail::Approx operator \"\" _a(unsigned long long val);\n} // end namespace literals\n\ntemplate<>\nstruct StringMaker<Catch::Detail::Approx> {\n    static std::string convert(Catch::Detail::Approx const& value);\n};\n\n} // end namespace Catch\n\n// end catch_approx.h\n// start catch_string_manip.h\n\n#include <string>\n#include <iosfwd>\n#include <vector>\n\nnamespace Catch {\n\n    bool startsWith( std::string const& s, std::string const& prefix );\n    bool startsWith( std::string const& s, char prefix );\n    bool endsWith( std::string const& s, std::string const& suffix );\n    bool endsWith( std::string const& s, char suffix );\n    bool contains( std::string const& s, std::string const& infix );\n    void toLowerInPlace( std::string& s );\n    std::string toLower( std::string const& s );\n    //! Returns a new string without whitespace at the start/end\n    std::string trim( std::string const& str );\n    //! Returns a substring of the original ref without whitespace. Beware lifetimes!\n    StringRef trim(StringRef ref);\n\n    // !!! Be aware, returns refs into original string - make sure original string outlives them\n    std::vector<StringRef> splitStringRef( StringRef str, char delimiter );\n    bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis );\n\n    struct pluralise {\n        pluralise( std::size_t count, std::string const& label );\n\n        friend std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser );\n\n        std::size_t m_count;\n        std::string m_label;\n    };\n}\n\n// end catch_string_manip.h\n#ifndef CATCH_CONFIG_DISABLE_MATCHERS\n// start catch_capture_matchers.h\n\n// start catch_matchers.h\n\n#include <string>\n#include <vector>\n\nnamespace Catch {\nnamespace Matchers {\n    namespace Impl {\n\n        template<typename ArgT> struct MatchAllOf;\n        template<typename ArgT> struct MatchAnyOf;\n        template<typename ArgT> struct MatchNotOf;\n\n        class MatcherUntypedBase {\n        public:\n            MatcherUntypedBase() = default;\n            MatcherUntypedBase ( MatcherUntypedBase const& ) = default;\n            MatcherUntypedBase& operator = ( MatcherUntypedBase const& ) = delete;\n            std::string toString() const;\n\n        protected:\n            virtual ~MatcherUntypedBase();\n            virtual std::string describe() const = 0;\n            mutable std::string m_cachedToString;\n        };\n\n#ifdef __clang__\n#    pragma clang diagnostic push\n#    pragma clang diagnostic ignored \"-Wnon-virtual-dtor\"\n#endif\n\n        template<typename ObjectT>\n        struct MatcherMethod {\n            virtual bool match( ObjectT const& arg ) const = 0;\n        };\n\n#if defined(__OBJC__)\n        // Hack to fix Catch GH issue #1661. Could use id for generic Object support.\n        // use of const for Object pointers is very uncommon and under ARC it causes some kind of signature mismatch that breaks compilation\n        template<>\n        struct MatcherMethod<NSString*> {\n            virtual bool match( NSString* arg ) const = 0;\n        };\n#endif\n\n#ifdef __clang__\n#    pragma clang diagnostic pop\n#endif\n\n        template<typename T>\n        struct MatcherBase : MatcherUntypedBase, MatcherMethod<T> {\n\n            MatchAllOf<T> operator && ( MatcherBase const& other ) const;\n            MatchAnyOf<T> operator || ( MatcherBase const& other ) const;\n            MatchNotOf<T> operator ! () const;\n        };\n\n        template<typename ArgT>\n        struct MatchAllOf : MatcherBase<ArgT> {\n            bool match( ArgT const& arg ) const override {\n                for( auto matcher : m_matchers ) {\n                    if (!matcher->match(arg))\n                        return false;\n                }\n                return true;\n            }\n            std::string describe() const override {\n                std::string description;\n                description.reserve( 4 + m_matchers.size()*32 );\n                description += \"( \";\n                bool first = true;\n                for( auto matcher : m_matchers ) {\n                    if( first )\n                        first = false;\n                    else\n                        description += \" and \";\n                    description += matcher->toString();\n                }\n                description += \" )\";\n                return description;\n            }\n\n            MatchAllOf<ArgT> operator && ( MatcherBase<ArgT> const& other ) {\n                auto copy(*this);\n                copy.m_matchers.push_back( &other );\n                return copy;\n            }\n\n            std::vector<MatcherBase<ArgT> const*> m_matchers;\n        };\n        template<typename ArgT>\n        struct MatchAnyOf : MatcherBase<ArgT> {\n\n            bool match( ArgT const& arg ) const override {\n                for( auto matcher : m_matchers ) {\n                    if (matcher->match(arg))\n                        return true;\n                }\n                return false;\n            }\n            std::string describe() const override {\n                std::string description;\n                description.reserve( 4 + m_matchers.size()*32 );\n                description += \"( \";\n                bool first = true;\n                for( auto matcher : m_matchers ) {\n                    if( first )\n                        first = false;\n                    else\n                        description += \" or \";\n                    description += matcher->toString();\n                }\n                description += \" )\";\n                return description;\n            }\n\n            MatchAnyOf<ArgT> operator || ( MatcherBase<ArgT> const& other ) {\n                auto copy(*this);\n                copy.m_matchers.push_back( &other );\n                return copy;\n            }\n\n            std::vector<MatcherBase<ArgT> const*> m_matchers;\n        };\n\n        template<typename ArgT>\n        struct MatchNotOf : MatcherBase<ArgT> {\n\n            MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_underlyingMatcher( underlyingMatcher ) {}\n\n            bool match( ArgT const& arg ) const override {\n                return !m_underlyingMatcher.match( arg );\n            }\n\n            std::string describe() const override {\n                return \"not \" + m_underlyingMatcher.toString();\n            }\n            MatcherBase<ArgT> const& m_underlyingMatcher;\n        };\n\n        template<typename T>\n        MatchAllOf<T> MatcherBase<T>::operator && ( MatcherBase const& other ) const {\n            return MatchAllOf<T>() && *this && other;\n        }\n        template<typename T>\n        MatchAnyOf<T> MatcherBase<T>::operator || ( MatcherBase const& other ) const {\n            return MatchAnyOf<T>() || *this || other;\n        }\n        template<typename T>\n        MatchNotOf<T> MatcherBase<T>::operator ! () const {\n            return MatchNotOf<T>( *this );\n        }\n\n    } // namespace Impl\n\n} // namespace Matchers\n\nusing namespace Matchers;\nusing Matchers::Impl::MatcherBase;\n\n} // namespace Catch\n\n// end catch_matchers.h\n// start catch_matchers_exception.hpp\n\nnamespace Catch {\nnamespace Matchers {\nnamespace Exception {\n\nclass ExceptionMessageMatcher : public MatcherBase<std::exception> {\n    std::string m_message;\npublic:\n\n    ExceptionMessageMatcher(std::string const& message):\n        m_message(message)\n    {}\n\n    bool match(std::exception const& ex) const override;\n\n    std::string describe() const override;\n};\n\n} // namespace Exception\n\nException::ExceptionMessageMatcher Message(std::string const& message);\n\n} // namespace Matchers\n} // namespace Catch\n\n// end catch_matchers_exception.hpp\n// start catch_matchers_floating.h\n\nnamespace Catch {\nnamespace Matchers {\n\n    namespace Floating {\n\n        enum class FloatingPointKind : uint8_t;\n\n        struct WithinAbsMatcher : MatcherBase<double> {\n            WithinAbsMatcher(double target, double margin);\n            bool match(double const& matchee) const override;\n            std::string describe() const override;\n        private:\n            double m_target;\n            double m_margin;\n        };\n\n        struct WithinUlpsMatcher : MatcherBase<double> {\n            WithinUlpsMatcher(double target, uint64_t ulps, FloatingPointKind baseType);\n            bool match(double const& matchee) const override;\n            std::string describe() const override;\n        private:\n            double m_target;\n            uint64_t m_ulps;\n            FloatingPointKind m_type;\n        };\n\n        // Given IEEE-754 format for floats and doubles, we can assume\n        // that float -> double promotion is lossless. Given this, we can\n        // assume that if we do the standard relative comparison of\n        // |lhs - rhs| <= epsilon * max(fabs(lhs), fabs(rhs)), then we get\n        // the same result if we do this for floats, as if we do this for\n        // doubles that were promoted from floats.\n        struct WithinRelMatcher : MatcherBase<double> {\n            WithinRelMatcher(double target, double epsilon);\n            bool match(double const& matchee) const override;\n            std::string describe() const override;\n        private:\n            double m_target;\n            double m_epsilon;\n        };\n\n    } // namespace Floating\n\n    // The following functions create the actual matcher objects.\n    // This allows the types to be inferred\n    Floating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlpDiff);\n    Floating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpDiff);\n    Floating::WithinAbsMatcher WithinAbs(double target, double margin);\n    Floating::WithinRelMatcher WithinRel(double target, double eps);\n    // defaults epsilon to 100*numeric_limits<double>::epsilon()\n    Floating::WithinRelMatcher WithinRel(double target);\n    Floating::WithinRelMatcher WithinRel(float target, float eps);\n    // defaults epsilon to 100*numeric_limits<float>::epsilon()\n    Floating::WithinRelMatcher WithinRel(float target);\n\n} // namespace Matchers\n} // namespace Catch\n\n// end catch_matchers_floating.h\n// start catch_matchers_generic.hpp\n\n#include <functional>\n#include <string>\n\nnamespace Catch {\nnamespace Matchers {\nnamespace Generic {\n\nnamespace Detail {\n    std::string finalizeDescription(const std::string& desc);\n}\n\ntemplate <typename T>\nclass PredicateMatcher : public MatcherBase<T> {\n    std::function<bool(T const&)> m_predicate;\n    std::string m_description;\npublic:\n\n    PredicateMatcher(std::function<bool(T const&)> const& elem, std::string const& descr)\n        :m_predicate(std::move(elem)),\n        m_description(Detail::finalizeDescription(descr))\n    {}\n\n    bool match( T const& item ) const override {\n        return m_predicate(item);\n    }\n\n    std::string describe() const override {\n        return m_description;\n    }\n};\n\n} // namespace Generic\n\n    // The following functions create the actual matcher objects.\n    // The user has to explicitly specify type to the function, because\n    // inferring std::function<bool(T const&)> is hard (but possible) and\n    // requires a lot of TMP.\n    template<typename T>\n    Generic::PredicateMatcher<T> Predicate(std::function<bool(T const&)> const& predicate, std::string const& description = \"\") {\n        return Generic::PredicateMatcher<T>(predicate, description);\n    }\n\n} // namespace Matchers\n} // namespace Catch\n\n// end catch_matchers_generic.hpp\n// start catch_matchers_string.h\n\n#include <string>\n\nnamespace Catch {\nnamespace Matchers {\n\n    namespace StdString {\n\n        struct CasedString\n        {\n            CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity );\n            std::string adjustString( std::string const& str ) const;\n            std::string caseSensitivitySuffix() const;\n\n            CaseSensitive::Choice m_caseSensitivity;\n            std::string m_str;\n        };\n\n        struct StringMatcherBase : MatcherBase<std::string> {\n            StringMatcherBase( std::string const& operation, CasedString const& comparator );\n            std::string describe() const override;\n\n            CasedString m_comparator;\n            std::string m_operation;\n        };\n\n        struct EqualsMatcher : StringMatcherBase {\n            EqualsMatcher( CasedString const& comparator );\n            bool match( std::string const& source ) const override;\n        };\n        struct ContainsMatcher : StringMatcherBase {\n            ContainsMatcher( CasedString const& comparator );\n            bool match( std::string const& source ) const override;\n        };\n        struct StartsWithMatcher : StringMatcherBase {\n            StartsWithMatcher( CasedString const& comparator );\n            bool match( std::string const& source ) const override;\n        };\n        struct EndsWithMatcher : StringMatcherBase {\n            EndsWithMatcher( CasedString const& comparator );\n            bool match( std::string const& source ) const override;\n        };\n\n        struct RegexMatcher : MatcherBase<std::string> {\n            RegexMatcher( std::string regex, CaseSensitive::Choice caseSensitivity );\n            bool match( std::string const& matchee ) const override;\n            std::string describe() const override;\n\n        private:\n            std::string m_regex;\n            CaseSensitive::Choice m_caseSensitivity;\n        };\n\n    } // namespace StdString\n\n    // The following functions create the actual matcher objects.\n    // This allows the types to be inferred\n\n    StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes );\n    StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes );\n    StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes );\n    StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes );\n    StdString::RegexMatcher Matches( std::string const& regex, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes );\n\n} // namespace Matchers\n} // namespace Catch\n\n// end catch_matchers_string.h\n// start catch_matchers_vector.h\n\n#include <algorithm>\n\nnamespace Catch {\nnamespace Matchers {\n\n    namespace Vector {\n        template<typename T, typename Alloc>\n        struct ContainsElementMatcher : MatcherBase<std::vector<T, Alloc>> {\n\n            ContainsElementMatcher(T const &comparator) : m_comparator( comparator) {}\n\n            bool match(std::vector<T, Alloc> const &v) const override {\n                for (auto const& el : v) {\n                    if (el == m_comparator) {\n                        return true;\n                    }\n                }\n                return false;\n            }\n\n            std::string describe() const override {\n                return \"Contains: \" + ::Catch::Detail::stringify( m_comparator );\n            }\n\n            T const& m_comparator;\n        };\n\n        template<typename T, typename AllocComp, typename AllocMatch>\n        struct ContainsMatcher : MatcherBase<std::vector<T, AllocMatch>> {\n\n            ContainsMatcher(std::vector<T, AllocComp> const &comparator) : m_comparator( comparator ) {}\n\n            bool match(std::vector<T, AllocMatch> const &v) const override {\n                // !TBD: see note in EqualsMatcher\n                if (m_comparator.size() > v.size())\n                    return false;\n                for (auto const& comparator : m_comparator) {\n                    auto present = false;\n                    for (const auto& el : v) {\n                        if (el == comparator) {\n                            present = true;\n                            break;\n                        }\n                    }\n                    if (!present) {\n                        return false;\n                    }\n                }\n                return true;\n            }\n            std::string describe() const override {\n                return \"Contains: \" + ::Catch::Detail::stringify( m_comparator );\n            }\n\n            std::vector<T, AllocComp> const& m_comparator;\n        };\n\n        template<typename T, typename AllocComp, typename AllocMatch>\n        struct EqualsMatcher : MatcherBase<std::vector<T, AllocMatch>> {\n\n            EqualsMatcher(std::vector<T, AllocComp> const &comparator) : m_comparator( comparator ) {}\n\n            bool match(std::vector<T, AllocMatch> const &v) const override {\n                // !TBD: This currently works if all elements can be compared using !=\n                // - a more general approach would be via a compare template that defaults\n                // to using !=. but could be specialised for, e.g. std::vector<T, Alloc> etc\n                // - then just call that directly\n                if (m_comparator.size() != v.size())\n                    return false;\n                for (std::size_t i = 0; i < v.size(); ++i)\n                    if (m_comparator[i] != v[i])\n                        return false;\n                return true;\n            }\n            std::string describe() const override {\n                return \"Equals: \" + ::Catch::Detail::stringify( m_comparator );\n            }\n            std::vector<T, AllocComp> const& m_comparator;\n        };\n\n        template<typename T, typename AllocComp, typename AllocMatch>\n        struct ApproxMatcher : MatcherBase<std::vector<T, AllocMatch>> {\n\n            ApproxMatcher(std::vector<T, AllocComp> const& comparator) : m_comparator( comparator ) {}\n\n            bool match(std::vector<T, AllocMatch> const &v) const override {\n                if (m_comparator.size() != v.size())\n                    return false;\n                for (std::size_t i = 0; i < v.size(); ++i)\n                    if (m_comparator[i] != approx(v[i]))\n                        return false;\n                return true;\n            }\n            std::string describe() const override {\n                return \"is approx: \" + ::Catch::Detail::stringify( m_comparator );\n            }\n            template <typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n            ApproxMatcher& epsilon( T const& newEpsilon ) {\n                approx.epsilon(newEpsilon);\n                return *this;\n            }\n            template <typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n            ApproxMatcher& margin( T const& newMargin ) {\n                approx.margin(newMargin);\n                return *this;\n            }\n            template <typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>\n            ApproxMatcher& scale( T const& newScale ) {\n                approx.scale(newScale);\n                return *this;\n            }\n\n            std::vector<T, AllocComp> const& m_comparator;\n            mutable Catch::Detail::Approx approx = Catch::Detail::Approx::custom();\n        };\n\n        template<typename T, typename AllocComp, typename AllocMatch>\n        struct UnorderedEqualsMatcher : MatcherBase<std::vector<T, AllocMatch>> {\n            UnorderedEqualsMatcher(std::vector<T, AllocComp> const& target) : m_target(target) {}\n            bool match(std::vector<T, AllocMatch> const& vec) const override {\n                if (m_target.size() != vec.size()) {\n                    return false;\n                }\n                return std::is_permutation(m_target.begin(), m_target.end(), vec.begin());\n            }\n\n            std::string describe() const override {\n                return \"UnorderedEquals: \" + ::Catch::Detail::stringify(m_target);\n            }\n        private:\n            std::vector<T, AllocComp> const& m_target;\n        };\n\n    } // namespace Vector\n\n    // The following functions create the actual matcher objects.\n    // This allows the types to be inferred\n\n    template<typename T, typename AllocComp = std::allocator<T>, typename AllocMatch = AllocComp>\n    Vector::ContainsMatcher<T, AllocComp, AllocMatch> Contains( std::vector<T, AllocComp> const& comparator ) {\n        return Vector::ContainsMatcher<T, AllocComp, AllocMatch>( comparator );\n    }\n\n    template<typename T, typename Alloc = std::allocator<T>>\n    Vector::ContainsElementMatcher<T, Alloc> VectorContains( T const& comparator ) {\n        return Vector::ContainsElementMatcher<T, Alloc>( comparator );\n    }\n\n    template<typename T, typename AllocComp = std::allocator<T>, typename AllocMatch = AllocComp>\n    Vector::EqualsMatcher<T, AllocComp, AllocMatch> Equals( std::vector<T, AllocComp> const& comparator ) {\n        return Vector::EqualsMatcher<T, AllocComp, AllocMatch>( comparator );\n    }\n\n    template<typename T, typename AllocComp = std::allocator<T>, typename AllocMatch = AllocComp>\n    Vector::ApproxMatcher<T, AllocComp, AllocMatch> Approx( std::vector<T, AllocComp> const& comparator ) {\n        return Vector::ApproxMatcher<T, AllocComp, AllocMatch>( comparator );\n    }\n\n    template<typename T, typename AllocComp = std::allocator<T>, typename AllocMatch = AllocComp>\n    Vector::UnorderedEqualsMatcher<T, AllocComp, AllocMatch> UnorderedEquals(std::vector<T, AllocComp> const& target) {\n        return Vector::UnorderedEqualsMatcher<T, AllocComp, AllocMatch>( target );\n    }\n\n} // namespace Matchers\n} // namespace Catch\n\n// end catch_matchers_vector.h\nnamespace Catch {\n\n    template<typename ArgT, typename MatcherT>\n    class MatchExpr : public ITransientExpression {\n        ArgT const& m_arg;\n        MatcherT m_matcher;\n        StringRef m_matcherString;\n    public:\n        MatchExpr( ArgT const& arg, MatcherT const& matcher, StringRef const& matcherString )\n        :   ITransientExpression{ true, matcher.match( arg ) },\n            m_arg( arg ),\n            m_matcher( matcher ),\n            m_matcherString( matcherString )\n        {}\n\n        void streamReconstructedExpression( std::ostream &os ) const override {\n            auto matcherAsString = m_matcher.toString();\n            os << Catch::Detail::stringify( m_arg ) << ' ';\n            if( matcherAsString == Detail::unprintableString )\n                os << m_matcherString;\n            else\n                os << matcherAsString;\n        }\n    };\n\n    using StringMatcher = Matchers::Impl::MatcherBase<std::string>;\n\n    void handleExceptionMatchExpr( AssertionHandler& handler, StringMatcher const& matcher, StringRef const& matcherString  );\n\n    template<typename ArgT, typename MatcherT>\n    auto makeMatchExpr( ArgT const& arg, MatcherT const& matcher, StringRef const& matcherString  ) -> MatchExpr<ArgT, MatcherT> {\n        return MatchExpr<ArgT, MatcherT>( arg, matcher, matcherString );\n    }\n\n} // namespace Catch\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CHECK_THAT( macroName, matcher, resultDisposition, arg ) \\\n    do { \\\n        Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(arg) \", \" CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \\\n        INTERNAL_CATCH_TRY { \\\n            catchAssertionHandler.handleExpr( Catch::makeMatchExpr( arg, matcher, #matcher##_catch_sr ) ); \\\n        } INTERNAL_CATCH_CATCH( catchAssertionHandler ) \\\n        INTERNAL_CATCH_REACT( catchAssertionHandler ) \\\n    } while( false )\n\n///////////////////////////////////////////////////////////////////////////////\n#define INTERNAL_CATCH_THROWS_MATCHES( macroName, exceptionType, resultDisposition, matcher, ... ) \\\n    do { \\\n        Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__) \", \" CATCH_INTERNAL_STRINGIFY(exceptionType) \", \" CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \\\n        if( catchAssertionHandler.allowThrows() ) \\\n            try { \\\n                static_cast<void>(__VA_ARGS__ ); \\\n                catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \\\n            } \\\n            catch( exceptionType const& ex ) { \\\n                catchAssertionHandler.handleExpr( Catch::makeMatchExpr( ex, matcher, #matcher##_catch_sr ) ); \\\n            } \\\n            catch( ... ) { \\\n                catchAssertionHandler.handleUnexpectedInflightException(); \\\n            } \\\n        else \\\n            catchAssertionHandler.handleThrowingCallSkipped(); \\\n        INTERNAL_CATCH_REACT( catchAssertionHandler ) \\\n    } while( false )\n\n// end catch_capture_matchers.h\n#endif\n// start catch_generators.hpp\n\n// start catch_interfaces_generatortracker.h\n\n\n#include <memory>\n\nnamespace Catch {\n\n    namespace Generators {\n        class GeneratorUntypedBase {\n        public:\n            GeneratorUntypedBase() = default;\n            virtual ~GeneratorUntypedBase();\n            // Attempts to move the generator to the next element\n             //\n             // Returns true iff the move succeeded (and a valid element\n             // can be retrieved).\n            virtual bool next() = 0;\n        };\n        using GeneratorBasePtr = std::unique_ptr<GeneratorUntypedBase>;\n\n    } // namespace Generators\n\n    struct IGeneratorTracker {\n        virtual ~IGeneratorTracker();\n        virtual auto hasGenerator() const -> bool = 0;\n        virtual auto getGenerator() const -> Generators::GeneratorBasePtr const& = 0;\n        virtual void setGenerator( Generators::GeneratorBasePtr&& generator ) = 0;\n    };\n\n} // namespace Catch\n\n// end catch_interfaces_generatortracker.h\n// start catch_enforce.h\n\n#include <exception>\n\nnamespace Catch {\n#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)\n    template <typename Ex>\n    [[noreturn]]\n    void throw_exception(Ex const& e) {\n        throw e;\n    }\n#else // ^^ Exceptions are enabled //  Exceptions are disabled vv\n    [[noreturn]]\n    void throw_exception(std::exception const& e);\n#endif\n\n    [[noreturn]]\n    void throw_logic_error(std::string const& msg);\n    [[noreturn]]\n    void throw_domain_error(std::string const& msg);\n    [[noreturn]]\n    void throw_runtime_error(std::string const& msg);\n\n} // namespace Catch;\n\n#define CATCH_MAKE_MSG(...) \\\n    (Catch::ReusableStringStream() << __VA_ARGS__).str()\n\n#define CATCH_INTERNAL_ERROR(...) \\\n    Catch::throw_logic_error(CATCH_MAKE_MSG( CATCH_INTERNAL_LINEINFO << \": Internal Catch2 error: \" << __VA_ARGS__))\n\n#define CATCH_ERROR(...) \\\n    Catch::throw_domain_error(CATCH_MAKE_MSG( __VA_ARGS__ ))\n\n#define CATCH_RUNTIME_ERROR(...) \\\n    Catch::throw_runtime_error(CATCH_MAKE_MSG( __VA_ARGS__ ))\n\n#define CATCH_ENFORCE( condition, ... ) \\\n    do{ if( !(condition) ) CATCH_ERROR( __VA_ARGS__ ); } while(false)\n\n// end catch_enforce.h\n#include <memory>\n#include <vector>\n#include <cassert>\n\n#include <utility>\n#include <exception>\n\nnamespace Catch {\n\nclass GeneratorException : public std::exception {\n    const char* const m_msg = \"\";\n\npublic:\n    GeneratorException(const char* msg):\n        m_msg(msg)\n    {}\n\n    const char* what() const noexcept override final;\n};\n\nnamespace Generators {\n\n    // !TBD move this into its own location?\n    namespace pf{\n        template<typename T, typename... Args>\n        std::unique_ptr<T> make_unique( Args&&... args ) {\n            return std::unique_ptr<T>(new T(std::forward<Args>(args)...));\n        }\n    }\n\n    template<typename T>\n    struct IGenerator : GeneratorUntypedBase {\n        virtual ~IGenerator() = default;\n\n        // Returns the current element of the generator\n        //\n        // \\Precondition The generator is either freshly constructed,\n        // or the last call to `next()` returned true\n        virtual T const& get() const = 0;\n        using type = T;\n    };\n\n    template<typename T>\n    class SingleValueGenerator final : public IGenerator<T> {\n        T m_value;\n    public:\n        SingleValueGenerator(T&& value) : m_value(std::move(value)) {}\n\n        T const& get() const override {\n            return m_value;\n        }\n        bool next() override {\n            return false;\n        }\n    };\n\n    template<typename T>\n    class FixedValuesGenerator final : public IGenerator<T> {\n        static_assert(!std::is_same<T, bool>::value,\n            \"FixedValuesGenerator does not support bools because of std::vector<bool>\"\n            \"specialization, use SingleValue Generator instead.\");\n        std::vector<T> m_values;\n        size_t m_idx = 0;\n    public:\n        FixedValuesGenerator( std::initializer_list<T> values ) : m_values( values ) {}\n\n        T const& get() const override {\n            return m_values[m_idx];\n        }\n        bool next() override {\n            ++m_idx;\n            return m_idx < m_values.size();\n        }\n    };\n\n    template <typename T>\n    class GeneratorWrapper final {\n        std::unique_ptr<IGenerator<T>> m_generator;\n    public:\n        GeneratorWrapper(std::unique_ptr<IGenerator<T>> generator):\n            m_generator(std::move(generator))\n        {}\n        T const& get() const {\n            return m_generator->get();\n        }\n        bool next() {\n            return m_generator->next();\n        }\n    };\n\n    template <typename T>\n    GeneratorWrapper<T> value(T&& value) {\n        return GeneratorWrapper<T>(pf::make_unique<SingleValueGenerator<T>>(std::forward<T>(value)));\n    }\n    template <typename T>\n    GeneratorWrapper<T> values(std::initializer_list<T> values) {\n        return GeneratorWrapper<T>(pf::make_unique<FixedValuesGenerator<T>>(values));\n    }\n\n    template<typename T>\n    class Generators : public IGenerator<T> {\n        std::vector<GeneratorWrapper<T>> m_generators;\n        size_t m_current = 0;\n\n        void populate(GeneratorWrapper<T>&& generator) {\n            m_generators.emplace_back(std::move(generator));\n        }\n        void populate(T&& val) {\n            m_generators.emplace_back(value(std::forward<T>(val)));\n        }\n        template<typename U>\n        void populate(U&& val) {\n            populate(T(std::forward<U>(val)));\n        }\n        template<typename U, typename... Gs>\n        void populate(U&& valueOrGenerator, Gs &&... moreGenerators) {\n            populate(std::forward<U>(valueOrGenerator));\n            populate(std::forward<Gs>(moreGenerators)...);\n        }\n\n    public:\n        template <typename... Gs>\n        Generators(Gs &&... moreGenerators) {\n            m_generators.reserve(sizeof...(Gs));\n            populate(std::forward<Gs>(moreGenerators)...);\n        }\n\n        T const& get() const override {\n            return m_generators[m_current].get();\n        }\n\n        bool next() override {\n            if (m_current >= m_generators.size()) {\n                return false;\n            }\n            const bool current_status = m_generators[m_current].next();\n            if (!current_status) {\n                ++m_current;\n            }\n            return m_current < m_generators.size();\n        }\n    };\n\n    template<typename... Ts>\n    GeneratorWrapper<std::tuple<Ts...>> table( std::initializer_list<std::tuple<typename std::decay<Ts>::type...>> tuples ) {\n        return values<std::tuple<Ts...>>( tuples );\n    }\n\n    // Tag type to signal that a generator sequence should convert arguments to a specific type\n    template <typename T>\n    struct as {};\n\n    template<typename T, typename... Gs>\n    auto makeGenerators( GeneratorWrapper<T>&& generator, Gs &&... moreGenerators ) -> Generators<T> {\n        return Generators<T>(std::move(generator), std::forward<Gs>(moreGenerators)...);\n    }\n    template<typename T>\n    auto makeGenerators( GeneratorWrapper<T>&& generator ) -> Generators<T> {\n        return Generators<T>(std::move(generator));\n    }\n    template<typename T, typename... Gs>\n    auto makeGenerators( T&& val, Gs &&... moreGenerators ) -> Generators<T> {\n        return makeGenerators( value( std::forward<T>( val ) ), std::forward<Gs>( moreGenerators )... );\n    }\n    template<typename T, typename U, typename... Gs>\n    auto makeGenerators( as<T>, U&& val, Gs &&... moreGenerators ) -> Generators<T> {\n        return makeGenerators( value( T( std::forward<U>( val ) ) ), std::forward<Gs>( moreGenerators )... );\n    }\n\n    auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker&;\n\n    template<typename L>\n    // Note: The type after -> is weird, because VS2015 cannot parse\n    //       the expression used in the typedef inside, when it is in\n    //       return type. Yeah.\n    auto generate( StringRef generatorName, SourceLineInfo const& lineInfo, L const& generatorExpression ) -> decltype(std::declval<decltype(generatorExpression())>().get()) {\n        using UnderlyingType = typename decltype(generatorExpression())::type;\n\n        IGeneratorTracker& tracker = acquireGeneratorTracker( generatorName, lineInfo );\n        if (!tracker.hasGenerator()) {\n            tracker.setGenerator(pf::make_unique<Generators<UnderlyingType>>(generatorExpression()));\n        }\n\n        auto const& generator = static_cast<IGenerator<UnderlyingType> const&>( *tracker.getGenerator() );\n        return generator.get();\n    }\n\n} // namespace Generators\n} // namespace Catch\n\n#define GENERATE( ... ) \\\n    Catch::Generators::generate( INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)), \\\n                                 CATCH_INTERNAL_LINEINFO, \\\n                                 [ ]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace)\n#define GENERATE_COPY( ... ) \\\n    Catch::Generators::generate( INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)), \\\n                                 CATCH_INTERNAL_LINEINFO, \\\n                                 [=]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace)\n#define GENERATE_REF( ... ) \\\n    Catch::Generators::generate( INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)), \\\n                                 CATCH_INTERNAL_LINEINFO, \\\n                                 [&]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace)\n\n// end catch_generators.hpp\n// start catch_generators_generic.hpp\n\nnamespace Catch {\nnamespace Generators {\n\n    template <typename T>\n    class TakeGenerator : public IGenerator<T> {\n        GeneratorWrapper<T> m_generator;\n        size_t m_returned = 0;\n        size_t m_target;\n    public:\n        TakeGenerator(size_t target, GeneratorWrapper<T>&& generator):\n            m_generator(std::move(generator)),\n            m_target(target)\n        {\n            assert(target != 0 && \"Empty generators are not allowed\");\n        }\n        T const& get() const override {\n            return m_generator.get();\n        }\n        bool next() override {\n            ++m_returned;\n            if (m_returned >= m_target) {\n                return false;\n            }\n\n            const auto success = m_generator.next();\n            // If the underlying generator does not contain enough values\n            // then we cut short as well\n            if (!success) {\n                m_returned = m_target;\n            }\n            return success;\n        }\n    };\n\n    template <typename T>\n    GeneratorWrapper<T> take(size_t target, GeneratorWrapper<T>&& generator) {\n        return GeneratorWrapper<T>(pf::make_unique<TakeGenerator<T>>(target, std::move(generator)));\n    }\n\n    template <typename T, typename Predicate>\n    class FilterGenerator : public IGenerator<T> {\n        GeneratorWrapper<T> m_generator;\n        Predicate m_predicate;\n    public:\n        template <typename P = Predicate>\n        FilterGenerator(P&& pred, GeneratorWrapper<T>&& generator):\n            m_generator(std::move(generator)),\n            m_predicate(std::forward<P>(pred))\n        {\n            if (!m_predicate(m_generator.get())) {\n                // It might happen that there are no values that pass the\n                // filter. In that case we throw an exception.\n                auto has_initial_value = next();\n                if (!has_initial_value) {\n                    Catch::throw_exception(GeneratorException(\"No valid value found in filtered generator\"));\n                }\n            }\n        }\n\n        T const& get() const override {\n            return m_generator.get();\n        }\n\n        bool next() override {\n            bool success = m_generator.next();\n            if (!success) {\n                return false;\n            }\n            while (!m_predicate(m_generator.get()) && (success = m_generator.next()) == true);\n            return success;\n        }\n    };\n\n    template <typename T, typename Predicate>\n    GeneratorWrapper<T> filter(Predicate&& pred, GeneratorWrapper<T>&& generator) {\n        return GeneratorWrapper<T>(std::unique_ptr<IGenerator<T>>(pf::make_unique<FilterGenerator<T, Predicate>>(std::forward<Predicate>(pred), std::move(generator))));\n    }\n\n    template <typename T>\n    class RepeatGenerator : public IGenerator<T> {\n        static_assert(!std::is_same<T, bool>::value,\n            \"RepeatGenerator currently does not support bools\"\n            \"because of std::vector<bool> specialization\");\n        GeneratorWrapper<T> m_generator;\n        mutable std::vector<T> m_returned;\n        size_t m_target_repeats;\n        size_t m_current_repeat = 0;\n        size_t m_repeat_index = 0;\n    public:\n        RepeatGenerator(size_t repeats, GeneratorWrapper<T>&& generator):\n            m_generator(std::move(generator)),\n            m_target_repeats(repeats)\n        {\n            assert(m_target_repeats > 0 && \"Repeat generator must repeat at least once\");\n        }\n\n        T const& get() const override {\n            if (m_current_repeat == 0) {\n                m_returned.push_back(m_generator.get());\n                return m_returned.back();\n            }\n            return m_returned[m_repeat_index];\n        }\n\n        bool next() override {\n            // There are 2 basic cases:\n            // 1) We are still reading the generator\n            // 2) We are reading our own cache\n\n            // In the first case, we need to poke the underlying generator.\n            // If it happily moves, we are left in that state, otherwise it is time to start reading from our cache\n            if (m_current_repeat == 0) {\n                const auto success = m_generator.next();\n                if (!success) {\n                    ++m_current_repeat;\n                }\n                return m_current_repeat < m_target_repeats;\n            }\n\n            // In the second case, we need to move indices forward and check that we haven't run up against the end\n            ++m_repeat_index;\n            if (m_repeat_index == m_returned.size()) {\n                m_repeat_index = 0;\n                ++m_current_repeat;\n            }\n            return m_current_repeat < m_target_repeats;\n        }\n    };\n\n    template <typename T>\n    GeneratorWrapper<T> repeat(size_t repeats, GeneratorWrapper<T>&& generator) {\n        return GeneratorWrapper<T>(pf::make_unique<RepeatGenerator<T>>(repeats, std::move(generator)));\n    }\n\n    template <typename T, typename U, typename Func>\n    class MapGenerator : public IGenerator<T> {\n        // TBD: provide static assert for mapping function, for friendly error message\n        GeneratorWrapper<U> m_generator;\n        Func m_function;\n        // To avoid returning dangling reference, we have to save the values\n        T m_cache;\n    public:\n        template <typename F2 = Func>\n        MapGenerator(F2&& function, GeneratorWrapper<U>&& generator) :\n            m_generator(std::move(generator)),\n            m_function(std::forward<F2>(function)),\n            m_cache(m_function(m_generator.get()))\n        {}\n\n        T const& get() const override {\n            return m_cache;\n        }\n        bool next() override {\n            const auto success = m_generator.next();\n            if (success) {\n                m_cache = m_function(m_generator.get());\n            }\n            return success;\n        }\n    };\n\n    template <typename Func, typename U, typename T = FunctionReturnType<Func, U>>\n    GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& generator) {\n        return GeneratorWrapper<T>(\n            pf::make_unique<MapGenerator<T, U, Func>>(std::forward<Func>(function), std::move(generator))\n        );\n    }\n\n    template <typename T, typename U, typename Func>\n    GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& generator) {\n        return GeneratorWrapper<T>(\n            pf::make_unique<MapGenerator<T, U, Func>>(std::forward<Func>(function), std::move(generator))\n        );\n    }\n\n    template <typename T>\n    class ChunkGenerator final : public IGenerator<std::vector<T>> {\n        std::vector<T> m_chunk;\n        size_t m_chunk_size;\n        GeneratorWrapper<T> m_generator;\n        bool m_used_up = false;\n    public:\n        ChunkGenerator(size_t size, GeneratorWrapper<T> generator) :\n            m_chunk_size(size), m_generator(std::move(generator))\n        {\n            m_chunk.reserve(m_chunk_size);\n            if (m_chunk_size != 0) {\n                m_chunk.push_back(m_generator.get());\n                for (size_t i = 1; i < m_chunk_size; ++i) {\n                    if (!m_generator.next()) {\n                        Catch::throw_exception(GeneratorException(\"Not enough values to initialize the first chunk\"));\n                    }\n                    m_chunk.push_back(m_generator.get());\n                }\n            }\n        }\n        std::vector<T> const& get() const override {\n            return m_chunk;\n        }\n        bool next() override {\n            m_chunk.clear();\n            for (size_t idx = 0; idx < m_chunk_size; ++idx) {\n                if (!m_generator.next()) {\n                    return false;\n                }\n                m_chunk.push_back(m_generator.get());\n            }\n            return true;\n        }\n    };\n\n    template <typename T>\n    GeneratorWrapper<std::vector<T>> chunk(size_t size, GeneratorWrapper<T>&& generator) {\n        return GeneratorWrapper<std::vector<T>>(\n            pf::make_unique<ChunkGenerator<T>>(size, std::move(generator))\n        );\n    }\n\n} // namespace Generators\n} // namespace Catch\n\n// end catch_generators_generic.hpp\n// start catch_generators_specific.hpp\n\n// start catch_context.h\n\n#include <memory>\n\nnamespace Catch {\n\n    struct IResultCapture;\n    struct IRunner;\n    struct IConfig;\n    struct IMutableContext;\n\n    using IConfigPtr = std::shared_ptr<IConfig const>;\n\n    struct IContext\n    {\n        virtual ~IContext();\n\n        virtual IResultCapture* getResultCapture() = 0;\n        virtual IRunner* getRunner() = 0;\n        virtual IConfigPtr const& getConfig() const = 0;\n    };\n\n    struct IMutableContext : IContext\n    {\n        virtual ~IMutableContext();\n        virtual void setResultCapture( IResultCapture* resultCapture ) = 0;\n        virtual void setRunner( IRunner* runner ) = 0;\n        virtual void setConfig( IConfigPtr const& config ) = 0;\n\n    private:\n        static IMutableContext *currentContext;\n        friend IMutableContext& getCurrentMutableContext();\n        friend void cleanUpContext();\n        static void createContext();\n    };\n\n    inline IMutableContext& getCurrentMutableContext()\n    {\n        if( !IMutableContext::currentContext )\n            IMutableContext::createContext();\n        // NOLINTNEXTLINE(clang-analyzer-core.uninitialized.UndefReturn)\n        return *IMutableContext::currentContext;\n    }\n\n    inline IContext& getCurrentContext()\n    {\n        return getCurrentMutableContext();\n    }\n\n    void cleanUpContext();\n\n    class SimplePcg32;\n    SimplePcg32& rng();\n}\n\n// end catch_context.h\n// start catch_interfaces_config.h\n\n// start catch_option.hpp\n\nnamespace Catch {\n\n    // An optional type\n    template<typename T>\n    class Option {\n    public:\n        Option() : nullableValue( nullptr ) {}\n        Option( T const& _value )\n        : nullableValue( new( storage ) T( _value ) )\n        {}\n        Option( Option const& _other )\n        : nullableValue( _other ? new( storage ) T( *_other ) : nullptr )\n        {}\n\n        ~Option() {\n            reset();\n        }\n\n        Option& operator= ( Option const& _other ) {\n            if( &_other != this ) {\n                reset();\n                if( _other )\n                    nullableValue = new( storage ) T( *_other );\n            }\n            return *this;\n        }\n        Option& operator = ( T const& _value ) {\n            reset();\n            nullableValue = new( storage ) T( _value );\n            return *this;\n        }\n\n        void reset() {\n            if( nullableValue )\n                nullableValue->~T();\n            nullableValue = nullptr;\n        }\n\n        T& operator*() { return *nullableValue; }\n        T const& operator*() const { return *nullableValue; }\n        T* operator->() { return nullableValue; }\n        const T* operator->() const { return nullableValue; }\n\n        T valueOr( T const& defaultValue ) const {\n            return nullableValue ? *nullableValue : defaultValue;\n        }\n\n        bool some() const { return nullableValue != nullptr; }\n        bool none() const { return nullableValue == nullptr; }\n\n        bool operator !() const { return nullableValue == nullptr; }\n        explicit operator bool() const {\n            return some();\n        }\n\n    private:\n        T *nullableValue;\n        alignas(alignof(T)) char storage[sizeof(T)];\n    };\n\n} // end namespace Catch\n\n// end catch_option.hpp\n#include <chrono>\n#include <iosfwd>\n#include <string>\n#include <vector>\n#include <memory>\n\nnamespace Catch {\n\n    enum class Verbosity {\n        Quiet = 0,\n        Normal,\n        High\n    };\n\n    struct WarnAbout { enum What {\n        Nothing = 0x00,\n        NoAssertions = 0x01,\n        NoTests = 0x02\n    }; };\n\n    struct ShowDurations { enum OrNot {\n        DefaultForReporter,\n        Always,\n        Never\n    }; };\n    struct RunTests { enum InWhatOrder {\n        InDeclarationOrder,\n        InLexicographicalOrder,\n        InRandomOrder\n    }; };\n    struct UseColour { enum YesOrNo {\n        Auto,\n        Yes,\n        No\n    }; };\n    struct WaitForKeypress { enum When {\n        Never,\n        BeforeStart = 1,\n        BeforeExit = 2,\n        BeforeStartAndExit = BeforeStart | BeforeExit\n    }; };\n\n    class TestSpec;\n\n    struct IConfig : NonCopyable {\n\n        virtual ~IConfig();\n\n        virtual bool allowThrows() const = 0;\n        virtual std::ostream& stream() const = 0;\n        virtual std::string name() const = 0;\n        virtual bool includeSuccessfulResults() const = 0;\n        virtual bool shouldDebugBreak() const = 0;\n        virtual bool warnAboutMissingAssertions() const = 0;\n        virtual bool warnAboutNoTests() const = 0;\n        virtual int abortAfter() const = 0;\n        virtual bool showInvisibles() const = 0;\n        virtual ShowDurations::OrNot showDurations() const = 0;\n        virtual double minDuration() const = 0;\n        virtual TestSpec const& testSpec() const = 0;\n        virtual bool hasTestFilters() const = 0;\n        virtual std::vector<std::string> const& getTestsOrTags() const = 0;\n        virtual RunTests::InWhatOrder runOrder() const = 0;\n        virtual unsigned int rngSeed() const = 0;\n        virtual UseColour::YesOrNo useColour() const = 0;\n        virtual std::vector<std::string> const& getSectionsToRun() const = 0;\n        virtual Verbosity verbosity() const = 0;\n\n        virtual bool benchmarkNoAnalysis() const = 0;\n        virtual int benchmarkSamples() const = 0;\n        virtual double benchmarkConfidenceInterval() const = 0;\n        virtual unsigned int benchmarkResamples() const = 0;\n        virtual std::chrono::milliseconds benchmarkWarmupTime() const = 0;\n    };\n\n    using IConfigPtr = std::shared_ptr<IConfig const>;\n}\n\n// end catch_interfaces_config.h\n// start catch_random_number_generator.h\n\n#include <cstdint>\n\nnamespace Catch {\n\n    // This is a simple implementation of C++11 Uniform Random Number\n    // Generator. It does not provide all operators, because Catch2\n    // does not use it, but it should behave as expected inside stdlib's\n    // distributions.\n    // The implementation is based on the PCG family (http://pcg-random.org)\n    class SimplePcg32 {\n        using state_type = std::uint64_t;\n    public:\n        using result_type = std::uint32_t;\n        static constexpr result_type (min)() {\n            return 0;\n        }\n        static constexpr result_type (max)() {\n            return static_cast<result_type>(-1);\n        }\n\n        // Provide some default initial state for the default constructor\n        SimplePcg32():SimplePcg32(0xed743cc4U) {}\n\n        explicit SimplePcg32(result_type seed_);\n\n        void seed(result_type seed_);\n        void discard(uint64_t skip);\n\n        result_type operator()();\n\n    private:\n        friend bool operator==(SimplePcg32 const& lhs, SimplePcg32 const& rhs);\n        friend bool operator!=(SimplePcg32 const& lhs, SimplePcg32 const& rhs);\n\n        // In theory we also need operator<< and operator>>\n        // In practice we do not use them, so we will skip them for now\n\n        std::uint64_t m_state;\n        // This part of the state determines which \"stream\" of the numbers\n        // is chosen -- we take it as a constant for Catch2, so we only\n        // need to deal with seeding the main state.\n        // Picked by reading 8 bytes from `/dev/random` :-)\n        static const std::uint64_t s_inc = (0x13ed0cc53f939476ULL << 1ULL) | 1ULL;\n    };\n\n} // end namespace Catch\n\n// end catch_random_number_generator.h\n#include <random>\n\nnamespace Catch {\nnamespace Generators {\n\ntemplate <typename Float>\nclass RandomFloatingGenerator final : public IGenerator<Float> {\n    Catch::SimplePcg32& m_rng;\n    std::uniform_real_distribution<Float> m_dist;\n    Float m_current_number;\npublic:\n\n    RandomFloatingGenerator(Float a, Float b):\n        m_rng(rng()),\n        m_dist(a, b) {\n        static_cast<void>(next());\n    }\n\n    Float const& get() const override {\n        return m_current_number;\n    }\n    bool next() override {\n        m_current_number = m_dist(m_rng);\n        return true;\n    }\n};\n\ntemplate <typename Integer>\nclass RandomIntegerGenerator final : public IGenerator<Integer> {\n    Catch::SimplePcg32& m_rng;\n    std::uniform_int_distribution<Integer> m_dist;\n    Integer m_current_number;\npublic:\n\n    RandomIntegerGenerator(Integer a, Integer b):\n        m_rng(rng()),\n        m_dist(a, b) {\n        static_cast<void>(next());\n    }\n\n    Integer const& get() const override {\n        return m_current_number;\n    }\n    bool next() override {\n        m_current_number = m_dist(m_rng);\n        return true;\n    }\n};\n\n// TODO: Ideally this would be also constrained against the various char types,\n//       but I don't expect users to run into that in practice.\ntemplate <typename T>\ntypename std::enable_if<std::is_integral<T>::value && !std::is_same<T, bool>::value,\nGeneratorWrapper<T>>::type\nrandom(T a, T b) {\n    return GeneratorWrapper<T>(\n        pf::make_unique<RandomIntegerGenerator<T>>(a, b)\n    );\n}\n\ntemplate <typename T>\ntypename std::enable_if<std::is_floating_point<T>::value,\nGeneratorWrapper<T>>::type\nrandom(T a, T b) {\n    return GeneratorWrapper<T>(\n        pf::make_unique<RandomFloatingGenerator<T>>(a, b)\n    );\n}\n\ntemplate <typename T>\nclass RangeGenerator final : public IGenerator<T> {\n    T m_current;\n    T m_end;\n    T m_step;\n    bool m_positive;\n\npublic:\n    RangeGenerator(T const& start, T const& end, T const& step):\n        m_current(start),\n        m_end(end),\n        m_step(step),\n        m_positive(m_step > T(0))\n    {\n        assert(m_current != m_end && \"Range start and end cannot be equal\");\n        assert(m_step != T(0) && \"Step size cannot be zero\");\n        assert(((m_positive && m_current <= m_end) || (!m_positive && m_current >= m_end)) && \"Step moves away from end\");\n    }\n\n    RangeGenerator(T const& start, T const& end):\n        RangeGenerator(start, end, (start < end) ? T(1) : T(-1))\n    {}\n\n    T const& get() const override {\n        return m_current;\n    }\n\n    bool next() override {\n        m_current += m_step;\n        return (m_positive) ? (m_current < m_end) : (m_current > m_end);\n    }\n};\n\ntemplate <typename T>\nGeneratorWrapper<T> range(T const& start, T const& end, T const& step) {\n    static_assert(std::is_arithmetic<T>::value && !std::is_same<T, bool>::value, \"Type must be numeric\");\n    return GeneratorWrapper<T>(pf::make_unique<RangeGenerator<T>>(start, end, step));\n}\n\ntemplate <typename T>\nGeneratorWrapper<T> range(T const& start, T const& end) {\n    static_assert(std::is_integral<T>::value && !std::is_same<T, bool>::value, \"Type must be an integer\");\n    return GeneratorWrapper<T>(pf::make_unique<RangeGenerator<T>>(start, end));\n}\n\ntemplate <typename T>\nclass IteratorGenerator final : public IGenerator<T> {\n    static_assert(!std::is_same<T, bool>::value,\n        \"IteratorGenerator currently does not support bools\"\n        \"because of std::vector<bool> specialization\");\n\n    std::vector<T> m_elems;\n    size_t m_current = 0;\npublic:\n    template <typename InputIterator, typename InputSentinel>\n    IteratorGenerator(InputIterator first, InputSentinel last):m_elems(first, last) {\n        if (m_elems.empty()) {\n            Catch::throw_exception(GeneratorException(\"IteratorGenerator received no valid values\"));\n        }\n    }\n\n    T const& get() const override {\n        return m_elems[m_current];\n    }\n\n    bool next() override {\n        ++m_current;\n        return m_current != m_elems.size();\n    }\n};\n\ntemplate <typename InputIterator,\n          typename InputSentinel,\n          typename ResultType = typename std::iterator_traits<InputIterator>::value_type>\nGeneratorWrapper<ResultType> from_range(InputIterator from, InputSentinel to) {\n    return GeneratorWrapper<ResultType>(pf::make_unique<IteratorGenerator<ResultType>>(from, to));\n}\n\ntemplate <typename Container,\n          typename ResultType = typename Container::value_type>\nGeneratorWrapper<ResultType> from_range(Container const& cnt) {\n    return GeneratorWrapper<ResultType>(pf::make_unique<IteratorGenerator<ResultType>>(cnt.begin(), cnt.end()));\n}\n\n} // namespace Generators\n} // namespace Catch\n\n// end catch_generators_specific.hpp\n\n// These files are included here so the single_include script doesn't put them\n// in the conditionally compiled sections\n// start catch_test_case_info.h\n\n#include <string>\n#include <vector>\n#include <memory>\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wpadded\"\n#endif\n\nnamespace Catch {\n\n    struct ITestInvoker;\n\n    struct TestCaseInfo {\n        enum SpecialProperties{\n            None = 0,\n            IsHidden = 1 << 1,\n            ShouldFail = 1 << 2,\n            MayFail = 1 << 3,\n            Throws = 1 << 4,\n            NonPortable = 1 << 5,\n            Benchmark = 1 << 6\n        };\n\n        TestCaseInfo(   std::string const& _name,\n                        std::string const& _className,\n                        std::string const& _description,\n                        std::vector<std::string> const& _tags,\n                        SourceLineInfo const& _lineInfo );\n\n        friend void setTags( TestCaseInfo& testCaseInfo, std::vector<std::string> tags );\n\n        bool isHidden() const;\n        bool throws() const;\n        bool okToFail() const;\n        bool expectedToFail() const;\n\n        std::string tagsAsString() const;\n\n        std::string name;\n        std::string className;\n        std::string description;\n        std::vector<std::string> tags;\n        std::vector<std::string> lcaseTags;\n        SourceLineInfo lineInfo;\n        SpecialProperties properties;\n    };\n\n    class TestCase : public TestCaseInfo {\n    public:\n\n        TestCase( ITestInvoker* testCase, TestCaseInfo&& info );\n\n        TestCase withName( std::string const& _newName ) const;\n\n        void invoke() const;\n\n        TestCaseInfo const& getTestCaseInfo() const;\n\n        bool operator == ( TestCase const& other ) const;\n        bool operator < ( TestCase const& other ) const;\n\n    private:\n        std::shared_ptr<ITestInvoker> test;\n    };\n\n    TestCase makeTestCase(  ITestInvoker* testCase,\n                            std::string const& className,\n                            NameAndTags const& nameAndTags,\n                            SourceLineInfo const& lineInfo );\n}\n\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n\n// end catch_test_case_info.h\n// start catch_interfaces_runner.h\n\nnamespace Catch {\n\n    struct IRunner {\n        virtual ~IRunner();\n        virtual bool aborting() const = 0;\n    };\n}\n\n// end catch_interfaces_runner.h\n\n#ifdef __OBJC__\n// start catch_objc.hpp\n\n#import <objc/runtime.h>\n\n#include <string>\n\n// NB. Any general catch headers included here must be included\n// in catch.hpp first to make sure they are included by the single\n// header for non obj-usage\n\n///////////////////////////////////////////////////////////////////////////////\n// This protocol is really only here for (self) documenting purposes, since\n// all its methods are optional.\n@protocol OcFixture\n\n@optional\n\n-(void) setUp;\n-(void) tearDown;\n\n@end\n\nnamespace Catch {\n\n    class OcMethod : public ITestInvoker {\n\n    public:\n        OcMethod( Class cls, SEL sel ) : m_cls( cls ), m_sel( sel ) {}\n\n        virtual void invoke() const {\n            id obj = [[m_cls alloc] init];\n\n            performOptionalSelector( obj, @selector(setUp)  );\n            performOptionalSelector( obj, m_sel );\n            performOptionalSelector( obj, @selector(tearDown)  );\n\n            arcSafeRelease( obj );\n        }\n    private:\n        virtual ~OcMethod() {}\n\n        Class m_cls;\n        SEL m_sel;\n    };\n\n    namespace Detail{\n\n        inline std::string getAnnotation(   Class cls,\n                                            std::string const& annotationName,\n                                            std::string const& testCaseName ) {\n            NSString* selStr = [[NSString alloc] initWithFormat:@\"Catch_%s_%s\", annotationName.c_str(), testCaseName.c_str()];\n            SEL sel = NSSelectorFromString( selStr );\n            arcSafeRelease( selStr );\n            id value = performOptionalSelector( cls, sel );\n            if( value )\n                return [(NSString*)value UTF8String];\n            return \"\";\n        }\n    }\n\n    inline std::size_t registerTestMethods() {\n        std::size_t noTestMethods = 0;\n        int noClasses = objc_getClassList( nullptr, 0 );\n\n        Class* classes = (CATCH_UNSAFE_UNRETAINED Class *)malloc( sizeof(Class) * noClasses);\n        objc_getClassList( classes, noClasses );\n\n        for( int c = 0; c < noClasses; c++ ) {\n            Class cls = classes[c];\n            {\n                u_int count;\n                Method* methods = class_copyMethodList( cls, &count );\n                for( u_int m = 0; m < count ; m++ ) {\n                    SEL selector = method_getName(methods[m]);\n                    std::string methodName = sel_getName(selector);\n                    if( startsWith( methodName, \"Catch_TestCase_\" ) ) {\n                        std::string testCaseName = methodName.substr( 15 );\n                        std::string name = Detail::getAnnotation( cls, \"Name\", testCaseName );\n                        std::string desc = Detail::getAnnotation( cls, \"Description\", testCaseName );\n                        const char* className = class_getName( cls );\n\n                        getMutableRegistryHub().registerTest( makeTestCase( new OcMethod( cls, selector ), className, NameAndTags( name.c_str(), desc.c_str() ), SourceLineInfo(\"\",0) ) );\n                        noTestMethods++;\n                    }\n                }\n                free(methods);\n            }\n        }\n        return noTestMethods;\n    }\n\n#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)\n\n    namespace Matchers {\n        namespace Impl {\n        namespace NSStringMatchers {\n\n            struct StringHolder : MatcherBase<NSString*>{\n                StringHolder( NSString* substr ) : m_substr( [substr copy] ){}\n                StringHolder( StringHolder const& other ) : m_substr( [other.m_substr copy] ){}\n                StringHolder() {\n                    arcSafeRelease( m_substr );\n                }\n\n                bool match( NSString* str ) const override {\n                    return false;\n                }\n\n                NSString* CATCH_ARC_STRONG m_substr;\n            };\n\n            struct Equals : StringHolder {\n                Equals( NSString* substr ) : StringHolder( substr ){}\n\n                bool match( NSString* str ) const override {\n                    return  (str != nil || m_substr == nil ) &&\n                            [str isEqualToString:m_substr];\n                }\n\n                std::string describe() const override {\n                    return \"equals string: \" + Catch::Detail::stringify( m_substr );\n                }\n            };\n\n            struct Contains : StringHolder {\n                Contains( NSString* substr ) : StringHolder( substr ){}\n\n                bool match( NSString* str ) const override {\n                    return  (str != nil || m_substr == nil ) &&\n                            [str rangeOfString:m_substr].location != NSNotFound;\n                }\n\n                std::string describe() const override {\n                    return \"contains string: \" + Catch::Detail::stringify( m_substr );\n                }\n            };\n\n            struct StartsWith : StringHolder {\n                StartsWith( NSString* substr ) : StringHolder( substr ){}\n\n                bool match( NSString* str ) const override {\n                    return  (str != nil || m_substr == nil ) &&\n                            [str rangeOfString:m_substr].location == 0;\n                }\n\n                std::string describe() const override {\n                    return \"starts with: \" + Catch::Detail::stringify( m_substr );\n                }\n            };\n            struct EndsWith : StringHolder {\n                EndsWith( NSString* substr ) : StringHolder( substr ){}\n\n                bool match( NSString* str ) const override {\n                    return  (str != nil || m_substr == nil ) &&\n                            [str rangeOfString:m_substr].location == [str length] - [m_substr length];\n                }\n\n                std::string describe() const override {\n                    return \"ends with: \" + Catch::Detail::stringify( m_substr );\n                }\n            };\n\n        } // namespace NSStringMatchers\n        } // namespace Impl\n\n        inline Impl::NSStringMatchers::Equals\n            Equals( NSString* substr ){ return Impl::NSStringMatchers::Equals( substr ); }\n\n        inline Impl::NSStringMatchers::Contains\n            Contains( NSString* substr ){ return Impl::NSStringMatchers::Contains( substr ); }\n\n        inline Impl::NSStringMatchers::StartsWith\n            StartsWith( NSString* substr ){ return Impl::NSStringMatchers::StartsWith( substr ); }\n\n        inline Impl::NSStringMatchers::EndsWith\n            EndsWith( NSString* substr ){ return Impl::NSStringMatchers::EndsWith( substr ); }\n\n    } // namespace Matchers\n\n    using namespace Matchers;\n\n#endif // CATCH_CONFIG_DISABLE_MATCHERS\n\n} // namespace Catch\n\n///////////////////////////////////////////////////////////////////////////////\n#define OC_MAKE_UNIQUE_NAME( root, uniqueSuffix ) root##uniqueSuffix\n#define OC_TEST_CASE2( name, desc, uniqueSuffix ) \\\n+(NSString*) OC_MAKE_UNIQUE_NAME( Catch_Name_test_, uniqueSuffix ) \\\n{ \\\nreturn @ name; \\\n} \\\n+(NSString*) OC_MAKE_UNIQUE_NAME( Catch_Description_test_, uniqueSuffix ) \\\n{ \\\nreturn @ desc; \\\n} \\\n-(void) OC_MAKE_UNIQUE_NAME( Catch_TestCase_test_, uniqueSuffix )\n\n#define OC_TEST_CASE( name, desc ) OC_TEST_CASE2( name, desc, __LINE__ )\n\n// end catch_objc.hpp\n#endif\n\n// Benchmarking needs the externally-facing parts of reporters to work\n#if defined(CATCH_CONFIG_EXTERNAL_INTERFACES) || defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n// start catch_external_interfaces.h\n\n// start catch_reporter_bases.hpp\n\n// start catch_interfaces_reporter.h\n\n// start catch_config.hpp\n\n// start catch_test_spec_parser.h\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wpadded\"\n#endif\n\n// start catch_test_spec.h\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wpadded\"\n#endif\n\n// start catch_wildcard_pattern.h\n\nnamespace Catch\n{\n    class WildcardPattern {\n        enum WildcardPosition {\n            NoWildcard = 0,\n            WildcardAtStart = 1,\n            WildcardAtEnd = 2,\n            WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd\n        };\n\n    public:\n\n        WildcardPattern( std::string const& pattern, CaseSensitive::Choice caseSensitivity );\n        virtual ~WildcardPattern() = default;\n        virtual bool matches( std::string const& str ) const;\n\n    private:\n        std::string normaliseString( std::string const& str ) const;\n        CaseSensitive::Choice m_caseSensitivity;\n        WildcardPosition m_wildcard = NoWildcard;\n        std::string m_pattern;\n    };\n}\n\n// end catch_wildcard_pattern.h\n#include <string>\n#include <vector>\n#include <memory>\n\nnamespace Catch {\n\n    struct IConfig;\n\n    class TestSpec {\n        class Pattern {\n        public:\n            explicit Pattern( std::string const& name );\n            virtual ~Pattern();\n            virtual bool matches( TestCaseInfo const& testCase ) const = 0;\n            std::string const& name() const;\n        private:\n            std::string const m_name;\n        };\n        using PatternPtr = std::shared_ptr<Pattern>;\n\n        class NamePattern : public Pattern {\n        public:\n            explicit NamePattern( std::string const& name, std::string const& filterString );\n            bool matches( TestCaseInfo const& testCase ) const override;\n        private:\n            WildcardPattern m_wildcardPattern;\n        };\n\n        class TagPattern : public Pattern {\n        public:\n            explicit TagPattern( std::string const& tag, std::string const& filterString );\n            bool matches( TestCaseInfo const& testCase ) const override;\n        private:\n            std::string m_tag;\n        };\n\n        class ExcludedPattern : public Pattern {\n        public:\n            explicit ExcludedPattern( PatternPtr const& underlyingPattern );\n            bool matches( TestCaseInfo const& testCase ) const override;\n        private:\n            PatternPtr m_underlyingPattern;\n        };\n\n        struct Filter {\n            std::vector<PatternPtr> m_patterns;\n\n            bool matches( TestCaseInfo const& testCase ) const;\n            std::string name() const;\n        };\n\n    public:\n        struct FilterMatch {\n            std::string name;\n            std::vector<TestCase const*> tests;\n        };\n        using Matches = std::vector<FilterMatch>;\n        using vectorStrings = std::vector<std::string>;\n\n        bool hasFilters() const;\n        bool matches( TestCaseInfo const& testCase ) const;\n        Matches matchesByFilter( std::vector<TestCase> const& testCases, IConfig const& config ) const;\n        const vectorStrings & getInvalidArgs() const;\n\n    private:\n        std::vector<Filter> m_filters;\n        std::vector<std::string> m_invalidArgs;\n        friend class TestSpecParser;\n    };\n}\n\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n\n// end catch_test_spec.h\n// start catch_interfaces_tag_alias_registry.h\n\n#include <string>\n\nnamespace Catch {\n\n    struct TagAlias;\n\n    struct ITagAliasRegistry {\n        virtual ~ITagAliasRegistry();\n        // Nullptr if not present\n        virtual TagAlias const* find( std::string const& alias ) const = 0;\n        virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const = 0;\n\n        static ITagAliasRegistry const& get();\n    };\n\n} // end namespace Catch\n\n// end catch_interfaces_tag_alias_registry.h\nnamespace Catch {\n\n    class TestSpecParser {\n        enum Mode{ None, Name, QuotedName, Tag, EscapedName };\n        Mode m_mode = None;\n        Mode lastMode = None;\n        bool m_exclusion = false;\n        std::size_t m_pos = 0;\n        std::size_t m_realPatternPos = 0;\n        std::string m_arg;\n        std::string m_substring;\n        std::string m_patternName;\n        std::vector<std::size_t> m_escapeChars;\n        TestSpec::Filter m_currentFilter;\n        TestSpec m_testSpec;\n        ITagAliasRegistry const* m_tagAliases = nullptr;\n\n    public:\n        TestSpecParser( ITagAliasRegistry const& tagAliases );\n\n        TestSpecParser& parse( std::string const& arg );\n        TestSpec testSpec();\n\n    private:\n        bool visitChar( char c );\n        void startNewMode( Mode mode );\n        bool processNoneChar( char c );\n        void processNameChar( char c );\n        bool processOtherChar( char c );\n        void endMode();\n        void escape();\n        bool isControlChar( char c ) const;\n        void saveLastMode();\n        void revertBackToLastMode();\n        void addFilter();\n        bool separate();\n\n        // Handles common preprocessing of the pattern for name/tag patterns\n        std::string preprocessPattern();\n        // Adds the current pattern as a test name\n        void addNamePattern();\n        // Adds the current pattern as a tag\n        void addTagPattern();\n\n        inline void addCharToPattern(char c) {\n            m_substring += c;\n            m_patternName += c;\n            m_realPatternPos++;\n        }\n\n    };\n    TestSpec parseTestSpec( std::string const& arg );\n\n} // namespace Catch\n\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n\n// end catch_test_spec_parser.h\n// Libstdc++ doesn't like incomplete classes for unique_ptr\n\n#include <memory>\n#include <vector>\n#include <string>\n\n#ifndef CATCH_CONFIG_CONSOLE_WIDTH\n#define CATCH_CONFIG_CONSOLE_WIDTH 80\n#endif\n\nnamespace Catch {\n\n    struct IStream;\n\n    struct ConfigData {\n        bool listTests = false;\n        bool listTags = false;\n        bool listReporters = false;\n        bool listTestNamesOnly = false;\n\n        bool showSuccessfulTests = false;\n        bool shouldDebugBreak = false;\n        bool noThrow = false;\n        bool showHelp = false;\n        bool showInvisibles = false;\n        bool filenamesAsTags = false;\n        bool libIdentify = false;\n\n        int abortAfter = -1;\n        unsigned int rngSeed = 0;\n\n        bool benchmarkNoAnalysis = false;\n        unsigned int benchmarkSamples = 100;\n        double benchmarkConfidenceInterval = 0.95;\n        unsigned int benchmarkResamples = 100000;\n        std::chrono::milliseconds::rep benchmarkWarmupTime = 100;\n\n        Verbosity verbosity = Verbosity::Normal;\n        WarnAbout::What warnings = WarnAbout::Nothing;\n        ShowDurations::OrNot showDurations = ShowDurations::DefaultForReporter;\n        double minDuration = -1;\n        RunTests::InWhatOrder runOrder = RunTests::InDeclarationOrder;\n        UseColour::YesOrNo useColour = UseColour::Auto;\n        WaitForKeypress::When waitForKeypress = WaitForKeypress::Never;\n\n        std::string outputFilename;\n        std::string name;\n        std::string processName;\n#ifndef CATCH_CONFIG_DEFAULT_REPORTER\n#define CATCH_CONFIG_DEFAULT_REPORTER \"console\"\n#endif\n        std::string reporterName = CATCH_CONFIG_DEFAULT_REPORTER;\n#undef CATCH_CONFIG_DEFAULT_REPORTER\n\n        std::vector<std::string> testsOrTags;\n        std::vector<std::string> sectionsToRun;\n    };\n\n    class Config : public IConfig {\n    public:\n\n        Config() = default;\n        Config( ConfigData const& data );\n        virtual ~Config() = default;\n\n        std::string const& getFilename() const;\n\n        bool listTests() const;\n        bool listTestNamesOnly() const;\n        bool listTags() const;\n        bool listReporters() const;\n\n        std::string getProcessName() const;\n        std::string const& getReporterName() const;\n\n        std::vector<std::string> const& getTestsOrTags() const override;\n        std::vector<std::string> const& getSectionsToRun() const override;\n\n        TestSpec const& testSpec() const override;\n        bool hasTestFilters() const override;\n\n        bool showHelp() const;\n\n        // IConfig interface\n        bool allowThrows() const override;\n        std::ostream& stream() const override;\n        std::string name() const override;\n        bool includeSuccessfulResults() const override;\n        bool warnAboutMissingAssertions() const override;\n        bool warnAboutNoTests() const override;\n        ShowDurations::OrNot showDurations() const override;\n        double minDuration() const override;\n        RunTests::InWhatOrder runOrder() const override;\n        unsigned int rngSeed() const override;\n        UseColour::YesOrNo useColour() const override;\n        bool shouldDebugBreak() const override;\n        int abortAfter() const override;\n        bool showInvisibles() const override;\n        Verbosity verbosity() const override;\n        bool benchmarkNoAnalysis() const override;\n        int benchmarkSamples() const override;\n        double benchmarkConfidenceInterval() const override;\n        unsigned int benchmarkResamples() const override;\n        std::chrono::milliseconds benchmarkWarmupTime() const override;\n\n    private:\n\n        IStream const* openStream();\n        ConfigData m_data;\n\n        std::unique_ptr<IStream const> m_stream;\n        TestSpec m_testSpec;\n        bool m_hasTestFilters = false;\n    };\n\n} // end namespace Catch\n\n// end catch_config.hpp\n// start catch_assertionresult.h\n\n#include <string>\n\nnamespace Catch {\n\n    struct AssertionResultData\n    {\n        AssertionResultData() = delete;\n\n        AssertionResultData( ResultWas::OfType _resultType, LazyExpression const& _lazyExpression );\n\n        std::string message;\n        mutable std::string reconstructedExpression;\n        LazyExpression lazyExpression;\n        ResultWas::OfType resultType;\n\n        std::string reconstructExpression() const;\n    };\n\n    class AssertionResult {\n    public:\n        AssertionResult() = delete;\n        AssertionResult( AssertionInfo const& info, AssertionResultData const& data );\n\n        bool isOk() const;\n        bool succeeded() const;\n        ResultWas::OfType getResultType() const;\n        bool hasExpression() const;\n        bool hasMessage() const;\n        std::string getExpression() const;\n        std::string getExpressionInMacro() const;\n        bool hasExpandedExpression() const;\n        std::string getExpandedExpression() const;\n        std::string getMessage() const;\n        SourceLineInfo getSourceInfo() const;\n        StringRef getTestMacroName() const;\n\n    //protected:\n        AssertionInfo m_info;\n        AssertionResultData m_resultData;\n    };\n\n} // end namespace Catch\n\n// end catch_assertionresult.h\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n// start catch_estimate.hpp\n\n // Statistics estimates\n\n\nnamespace Catch {\n    namespace Benchmark {\n        template <typename Duration>\n        struct Estimate {\n            Duration point;\n            Duration lower_bound;\n            Duration upper_bound;\n            double confidence_interval;\n\n            template <typename Duration2>\n            operator Estimate<Duration2>() const {\n                return { point, lower_bound, upper_bound, confidence_interval };\n            }\n        };\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_estimate.hpp\n// start catch_outlier_classification.hpp\n\n// Outlier information\n\nnamespace Catch {\n    namespace Benchmark {\n        struct OutlierClassification {\n            int samples_seen = 0;\n            int low_severe = 0;     // more than 3 times IQR below Q1\n            int low_mild = 0;       // 1.5 to 3 times IQR below Q1\n            int high_mild = 0;      // 1.5 to 3 times IQR above Q3\n            int high_severe = 0;    // more than 3 times IQR above Q3\n\n            int total() const {\n                return low_severe + low_mild + high_mild + high_severe;\n            }\n        };\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_outlier_classification.hpp\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\n#include <string>\n#include <iosfwd>\n#include <map>\n#include <set>\n#include <memory>\n#include <algorithm>\n\nnamespace Catch {\n\n    struct ReporterConfig {\n        explicit ReporterConfig( IConfigPtr const& _fullConfig );\n\n        ReporterConfig( IConfigPtr const& _fullConfig, std::ostream& _stream );\n\n        std::ostream& stream() const;\n        IConfigPtr fullConfig() const;\n\n    private:\n        std::ostream* m_stream;\n        IConfigPtr m_fullConfig;\n    };\n\n    struct ReporterPreferences {\n        bool shouldRedirectStdOut = false;\n        bool shouldReportAllAssertions = false;\n    };\n\n    template<typename T>\n    struct LazyStat : Option<T> {\n        LazyStat& operator=( T const& _value ) {\n            Option<T>::operator=( _value );\n            used = false;\n            return *this;\n        }\n        void reset() {\n            Option<T>::reset();\n            used = false;\n        }\n        bool used = false;\n    };\n\n    struct TestRunInfo {\n        TestRunInfo( std::string const& _name );\n        std::string name;\n    };\n    struct GroupInfo {\n        GroupInfo(  std::string const& _name,\n                    std::size_t _groupIndex,\n                    std::size_t _groupsCount );\n\n        std::string name;\n        std::size_t groupIndex;\n        std::size_t groupsCounts;\n    };\n\n    struct AssertionStats {\n        AssertionStats( AssertionResult const& _assertionResult,\n                        std::vector<MessageInfo> const& _infoMessages,\n                        Totals const& _totals );\n\n        AssertionStats( AssertionStats const& )              = default;\n        AssertionStats( AssertionStats && )                  = default;\n        AssertionStats& operator = ( AssertionStats const& ) = delete;\n        AssertionStats& operator = ( AssertionStats && )     = delete;\n        virtual ~AssertionStats();\n\n        AssertionResult assertionResult;\n        std::vector<MessageInfo> infoMessages;\n        Totals totals;\n    };\n\n    struct SectionStats {\n        SectionStats(   SectionInfo const& _sectionInfo,\n                        Counts const& _assertions,\n                        double _durationInSeconds,\n                        bool _missingAssertions );\n        SectionStats( SectionStats const& )              = default;\n        SectionStats( SectionStats && )                  = default;\n        SectionStats& operator = ( SectionStats const& ) = default;\n        SectionStats& operator = ( SectionStats && )     = default;\n        virtual ~SectionStats();\n\n        SectionInfo sectionInfo;\n        Counts assertions;\n        double durationInSeconds;\n        bool missingAssertions;\n    };\n\n    struct TestCaseStats {\n        TestCaseStats(  TestCaseInfo const& _testInfo,\n                        Totals const& _totals,\n                        std::string const& _stdOut,\n                        std::string const& _stdErr,\n                        bool _aborting );\n\n        TestCaseStats( TestCaseStats const& )              = default;\n        TestCaseStats( TestCaseStats && )                  = default;\n        TestCaseStats& operator = ( TestCaseStats const& ) = default;\n        TestCaseStats& operator = ( TestCaseStats && )     = default;\n        virtual ~TestCaseStats();\n\n        TestCaseInfo testInfo;\n        Totals totals;\n        std::string stdOut;\n        std::string stdErr;\n        bool aborting;\n    };\n\n    struct TestGroupStats {\n        TestGroupStats( GroupInfo const& _groupInfo,\n                        Totals const& _totals,\n                        bool _aborting );\n        TestGroupStats( GroupInfo const& _groupInfo );\n\n        TestGroupStats( TestGroupStats const& )              = default;\n        TestGroupStats( TestGroupStats && )                  = default;\n        TestGroupStats& operator = ( TestGroupStats const& ) = default;\n        TestGroupStats& operator = ( TestGroupStats && )     = default;\n        virtual ~TestGroupStats();\n\n        GroupInfo groupInfo;\n        Totals totals;\n        bool aborting;\n    };\n\n    struct TestRunStats {\n        TestRunStats(   TestRunInfo const& _runInfo,\n                        Totals const& _totals,\n                        bool _aborting );\n\n        TestRunStats( TestRunStats const& )              = default;\n        TestRunStats( TestRunStats && )                  = default;\n        TestRunStats& operator = ( TestRunStats const& ) = default;\n        TestRunStats& operator = ( TestRunStats && )     = default;\n        virtual ~TestRunStats();\n\n        TestRunInfo runInfo;\n        Totals totals;\n        bool aborting;\n    };\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n    struct BenchmarkInfo {\n        std::string name;\n        double estimatedDuration;\n        int iterations;\n        int samples;\n        unsigned int resamples;\n        double clockResolution;\n        double clockCost;\n    };\n\n    template <class Duration>\n    struct BenchmarkStats {\n        BenchmarkInfo info;\n\n        std::vector<Duration> samples;\n        Benchmark::Estimate<Duration> mean;\n        Benchmark::Estimate<Duration> standardDeviation;\n        Benchmark::OutlierClassification outliers;\n        double outlierVariance;\n\n        template <typename Duration2>\n        operator BenchmarkStats<Duration2>() const {\n            std::vector<Duration2> samples2;\n            samples2.reserve(samples.size());\n            std::transform(samples.begin(), samples.end(), std::back_inserter(samples2), [](Duration d) { return Duration2(d); });\n            return {\n                info,\n                std::move(samples2),\n                mean,\n                standardDeviation,\n                outliers,\n                outlierVariance,\n            };\n        }\n    };\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\n    struct IStreamingReporter {\n        virtual ~IStreamingReporter() = default;\n\n        // Implementing class must also provide the following static methods:\n        // static std::string getDescription();\n        // static std::set<Verbosity> getSupportedVerbosities()\n\n        virtual ReporterPreferences getPreferences() const = 0;\n\n        virtual void noMatchingTestCases( std::string const& spec ) = 0;\n\n        virtual void reportInvalidArguments(std::string const&) {}\n\n        virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0;\n        virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0;\n\n        virtual void testCaseStarting( TestCaseInfo const& testInfo ) = 0;\n        virtual void sectionStarting( SectionInfo const& sectionInfo ) = 0;\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n        virtual void benchmarkPreparing( std::string const& ) {}\n        virtual void benchmarkStarting( BenchmarkInfo const& ) {}\n        virtual void benchmarkEnded( BenchmarkStats<> const& ) {}\n        virtual void benchmarkFailed( std::string const& ) {}\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\n        virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0;\n\n        // The return value indicates if the messages buffer should be cleared:\n        virtual bool assertionEnded( AssertionStats const& assertionStats ) = 0;\n\n        virtual void sectionEnded( SectionStats const& sectionStats ) = 0;\n        virtual void testCaseEnded( TestCaseStats const& testCaseStats ) = 0;\n        virtual void testGroupEnded( TestGroupStats const& testGroupStats ) = 0;\n        virtual void testRunEnded( TestRunStats const& testRunStats ) = 0;\n\n        virtual void skipTest( TestCaseInfo const& testInfo ) = 0;\n\n        // Default empty implementation provided\n        virtual void fatalErrorEncountered( StringRef name );\n\n        virtual bool isMulti() const;\n    };\n    using IStreamingReporterPtr = std::unique_ptr<IStreamingReporter>;\n\n    struct IReporterFactory {\n        virtual ~IReporterFactory();\n        virtual IStreamingReporterPtr create( ReporterConfig const& config ) const = 0;\n        virtual std::string getDescription() const = 0;\n    };\n    using IReporterFactoryPtr = std::shared_ptr<IReporterFactory>;\n\n    struct IReporterRegistry {\n        using FactoryMap = std::map<std::string, IReporterFactoryPtr>;\n        using Listeners = std::vector<IReporterFactoryPtr>;\n\n        virtual ~IReporterRegistry();\n        virtual IStreamingReporterPtr create( std::string const& name, IConfigPtr const& config ) const = 0;\n        virtual FactoryMap const& getFactories() const = 0;\n        virtual Listeners const& getListeners() const = 0;\n    };\n\n} // end namespace Catch\n\n// end catch_interfaces_reporter.h\n#include <algorithm>\n#include <cstring>\n#include <cfloat>\n#include <cstdio>\n#include <cassert>\n#include <memory>\n#include <ostream>\n\nnamespace Catch {\n    void prepareExpandedExpression(AssertionResult& result);\n\n    // Returns double formatted as %.3f (format expected on output)\n    std::string getFormattedDuration( double duration );\n\n    //! Should the reporter show\n    bool shouldShowDuration( IConfig const& config, double duration );\n\n    std::string serializeFilters( std::vector<std::string> const& container );\n\n    template<typename DerivedT>\n    struct StreamingReporterBase : IStreamingReporter {\n\n        StreamingReporterBase( ReporterConfig const& _config )\n        :   m_config( _config.fullConfig() ),\n            stream( _config.stream() )\n        {\n            m_reporterPrefs.shouldRedirectStdOut = false;\n            if( !DerivedT::getSupportedVerbosities().count( m_config->verbosity() ) )\n                CATCH_ERROR( \"Verbosity level not supported by this reporter\" );\n        }\n\n        ReporterPreferences getPreferences() const override {\n            return m_reporterPrefs;\n        }\n\n        static std::set<Verbosity> getSupportedVerbosities() {\n            return { Verbosity::Normal };\n        }\n\n        ~StreamingReporterBase() override = default;\n\n        void noMatchingTestCases(std::string const&) override {}\n\n        void reportInvalidArguments(std::string const&) override {}\n\n        void testRunStarting(TestRunInfo const& _testRunInfo) override {\n            currentTestRunInfo = _testRunInfo;\n        }\n\n        void testGroupStarting(GroupInfo const& _groupInfo) override {\n            currentGroupInfo = _groupInfo;\n        }\n\n        void testCaseStarting(TestCaseInfo const& _testInfo) override  {\n            currentTestCaseInfo = _testInfo;\n        }\n        void sectionStarting(SectionInfo const& _sectionInfo) override {\n            m_sectionStack.push_back(_sectionInfo);\n        }\n\n        void sectionEnded(SectionStats const& /* _sectionStats */) override {\n            m_sectionStack.pop_back();\n        }\n        void testCaseEnded(TestCaseStats const& /* _testCaseStats */) override {\n            currentTestCaseInfo.reset();\n        }\n        void testGroupEnded(TestGroupStats const& /* _testGroupStats */) override {\n            currentGroupInfo.reset();\n        }\n        void testRunEnded(TestRunStats const& /* _testRunStats */) override {\n            currentTestCaseInfo.reset();\n            currentGroupInfo.reset();\n            currentTestRunInfo.reset();\n        }\n\n        void skipTest(TestCaseInfo const&) override {\n            // Don't do anything with this by default.\n            // It can optionally be overridden in the derived class.\n        }\n\n        IConfigPtr m_config;\n        std::ostream& stream;\n\n        LazyStat<TestRunInfo> currentTestRunInfo;\n        LazyStat<GroupInfo> currentGroupInfo;\n        LazyStat<TestCaseInfo> currentTestCaseInfo;\n\n        std::vector<SectionInfo> m_sectionStack;\n        ReporterPreferences m_reporterPrefs;\n    };\n\n    template<typename DerivedT>\n    struct CumulativeReporterBase : IStreamingReporter {\n        template<typename T, typename ChildNodeT>\n        struct Node {\n            explicit Node( T const& _value ) : value( _value ) {}\n            virtual ~Node() {}\n\n            using ChildNodes = std::vector<std::shared_ptr<ChildNodeT>>;\n            T value;\n            ChildNodes children;\n        };\n        struct SectionNode {\n            explicit SectionNode(SectionStats const& _stats) : stats(_stats) {}\n            virtual ~SectionNode() = default;\n\n            bool operator == (SectionNode const& other) const {\n                return stats.sectionInfo.lineInfo == other.stats.sectionInfo.lineInfo;\n            }\n            bool operator == (std::shared_ptr<SectionNode> const& other) const {\n                return operator==(*other);\n            }\n\n            SectionStats stats;\n            using ChildSections = std::vector<std::shared_ptr<SectionNode>>;\n            using Assertions = std::vector<AssertionStats>;\n            ChildSections childSections;\n            Assertions assertions;\n            std::string stdOut;\n            std::string stdErr;\n        };\n\n        struct BySectionInfo {\n            BySectionInfo( SectionInfo const& other ) : m_other( other ) {}\n            BySectionInfo( BySectionInfo const& other ) : m_other( other.m_other ) {}\n            bool operator() (std::shared_ptr<SectionNode> const& node) const {\n                return ((node->stats.sectionInfo.name == m_other.name) &&\n                        (node->stats.sectionInfo.lineInfo == m_other.lineInfo));\n            }\n            void operator=(BySectionInfo const&) = delete;\n\n        private:\n            SectionInfo const& m_other;\n        };\n\n        using TestCaseNode = Node<TestCaseStats, SectionNode>;\n        using TestGroupNode = Node<TestGroupStats, TestCaseNode>;\n        using TestRunNode = Node<TestRunStats, TestGroupNode>;\n\n        CumulativeReporterBase( ReporterConfig const& _config )\n        :   m_config( _config.fullConfig() ),\n            stream( _config.stream() )\n        {\n            m_reporterPrefs.shouldRedirectStdOut = false;\n            if( !DerivedT::getSupportedVerbosities().count( m_config->verbosity() ) )\n                CATCH_ERROR( \"Verbosity level not supported by this reporter\" );\n        }\n        ~CumulativeReporterBase() override = default;\n\n        ReporterPreferences getPreferences() const override {\n            return m_reporterPrefs;\n        }\n\n        static std::set<Verbosity> getSupportedVerbosities() {\n            return { Verbosity::Normal };\n        }\n\n        void testRunStarting( TestRunInfo const& ) override {}\n        void testGroupStarting( GroupInfo const& ) override {}\n\n        void testCaseStarting( TestCaseInfo const& ) override {}\n\n        void sectionStarting( SectionInfo const& sectionInfo ) override {\n            SectionStats incompleteStats( sectionInfo, Counts(), 0, false );\n            std::shared_ptr<SectionNode> node;\n            if( m_sectionStack.empty() ) {\n                if( !m_rootSection )\n                    m_rootSection = std::make_shared<SectionNode>( incompleteStats );\n                node = m_rootSection;\n            }\n            else {\n                SectionNode& parentNode = *m_sectionStack.back();\n                auto it =\n                    std::find_if(   parentNode.childSections.begin(),\n                                    parentNode.childSections.end(),\n                                    BySectionInfo( sectionInfo ) );\n                if( it == parentNode.childSections.end() ) {\n                    node = std::make_shared<SectionNode>( incompleteStats );\n                    parentNode.childSections.push_back( node );\n                }\n                else\n                    node = *it;\n            }\n            m_sectionStack.push_back( node );\n            m_deepestSection = std::move(node);\n        }\n\n        void assertionStarting(AssertionInfo const&) override {}\n\n        bool assertionEnded(AssertionStats const& assertionStats) override {\n            assert(!m_sectionStack.empty());\n            // AssertionResult holds a pointer to a temporary DecomposedExpression,\n            // which getExpandedExpression() calls to build the expression string.\n            // Our section stack copy of the assertionResult will likely outlive the\n            // temporary, so it must be expanded or discarded now to avoid calling\n            // a destroyed object later.\n            prepareExpandedExpression(const_cast<AssertionResult&>( assertionStats.assertionResult ) );\n            SectionNode& sectionNode = *m_sectionStack.back();\n            sectionNode.assertions.push_back(assertionStats);\n            return true;\n        }\n        void sectionEnded(SectionStats const& sectionStats) override {\n            assert(!m_sectionStack.empty());\n            SectionNode& node = *m_sectionStack.back();\n            node.stats = sectionStats;\n            m_sectionStack.pop_back();\n        }\n        void testCaseEnded(TestCaseStats const& testCaseStats) override {\n            auto node = std::make_shared<TestCaseNode>(testCaseStats);\n            assert(m_sectionStack.size() == 0);\n            node->children.push_back(m_rootSection);\n            m_testCases.push_back(node);\n            m_rootSection.reset();\n\n            assert(m_deepestSection);\n            m_deepestSection->stdOut = testCaseStats.stdOut;\n            m_deepestSection->stdErr = testCaseStats.stdErr;\n        }\n        void testGroupEnded(TestGroupStats const& testGroupStats) override {\n            auto node = std::make_shared<TestGroupNode>(testGroupStats);\n            node->children.swap(m_testCases);\n            m_testGroups.push_back(node);\n        }\n        void testRunEnded(TestRunStats const& testRunStats) override {\n            auto node = std::make_shared<TestRunNode>(testRunStats);\n            node->children.swap(m_testGroups);\n            m_testRuns.push_back(node);\n            testRunEndedCumulative();\n        }\n        virtual void testRunEndedCumulative() = 0;\n\n        void skipTest(TestCaseInfo const&) override {}\n\n        IConfigPtr m_config;\n        std::ostream& stream;\n        std::vector<AssertionStats> m_assertions;\n        std::vector<std::vector<std::shared_ptr<SectionNode>>> m_sections;\n        std::vector<std::shared_ptr<TestCaseNode>> m_testCases;\n        std::vector<std::shared_ptr<TestGroupNode>> m_testGroups;\n\n        std::vector<std::shared_ptr<TestRunNode>> m_testRuns;\n\n        std::shared_ptr<SectionNode> m_rootSection;\n        std::shared_ptr<SectionNode> m_deepestSection;\n        std::vector<std::shared_ptr<SectionNode>> m_sectionStack;\n        ReporterPreferences m_reporterPrefs;\n    };\n\n    template<char C>\n    char const* getLineOfChars() {\n        static char line[CATCH_CONFIG_CONSOLE_WIDTH] = {0};\n        if( !*line ) {\n            std::memset( line, C, CATCH_CONFIG_CONSOLE_WIDTH-1 );\n            line[CATCH_CONFIG_CONSOLE_WIDTH-1] = 0;\n        }\n        return line;\n    }\n\n    struct TestEventListenerBase : StreamingReporterBase<TestEventListenerBase> {\n        TestEventListenerBase( ReporterConfig const& _config );\n\n        static std::set<Verbosity> getSupportedVerbosities();\n\n        void assertionStarting(AssertionInfo const&) override;\n        bool assertionEnded(AssertionStats const&) override;\n    };\n\n} // end namespace Catch\n\n// end catch_reporter_bases.hpp\n// start catch_console_colour.h\n\nnamespace Catch {\n\n    struct Colour {\n        enum Code {\n            None = 0,\n\n            White,\n            Red,\n            Green,\n            Blue,\n            Cyan,\n            Yellow,\n            Grey,\n\n            Bright = 0x10,\n\n            BrightRed = Bright | Red,\n            BrightGreen = Bright | Green,\n            LightGrey = Bright | Grey,\n            BrightWhite = Bright | White,\n            BrightYellow = Bright | Yellow,\n\n            // By intention\n            FileName = LightGrey,\n            Warning = BrightYellow,\n            ResultError = BrightRed,\n            ResultSuccess = BrightGreen,\n            ResultExpectedFailure = Warning,\n\n            Error = BrightRed,\n            Success = Green,\n\n            OriginalExpression = Cyan,\n            ReconstructedExpression = BrightYellow,\n\n            SecondaryText = LightGrey,\n            Headers = White\n        };\n\n        // Use constructed object for RAII guard\n        Colour( Code _colourCode );\n        Colour( Colour&& other ) noexcept;\n        Colour& operator=( Colour&& other ) noexcept;\n        ~Colour();\n\n        // Use static method for one-shot changes\n        static void use( Code _colourCode );\n\n    private:\n        bool m_moved = false;\n    };\n\n    std::ostream& operator << ( std::ostream& os, Colour const& );\n\n} // end namespace Catch\n\n// end catch_console_colour.h\n// start catch_reporter_registrars.hpp\n\n\nnamespace Catch {\n\n    template<typename T>\n    class ReporterRegistrar {\n\n        class ReporterFactory : public IReporterFactory {\n\n            IStreamingReporterPtr create( ReporterConfig const& config ) const override {\n                return std::unique_ptr<T>( new T( config ) );\n            }\n\n            std::string getDescription() const override {\n                return T::getDescription();\n            }\n        };\n\n    public:\n\n        explicit ReporterRegistrar( std::string const& name ) {\n            getMutableRegistryHub().registerReporter( name, std::make_shared<ReporterFactory>() );\n        }\n    };\n\n    template<typename T>\n    class ListenerRegistrar {\n\n        class ListenerFactory : public IReporterFactory {\n\n            IStreamingReporterPtr create( ReporterConfig const& config ) const override {\n                return std::unique_ptr<T>( new T( config ) );\n            }\n            std::string getDescription() const override {\n                return std::string();\n            }\n        };\n\n    public:\n\n        ListenerRegistrar() {\n            getMutableRegistryHub().registerListener( std::make_shared<ListenerFactory>() );\n        }\n    };\n}\n\n#if !defined(CATCH_CONFIG_DISABLE)\n\n#define CATCH_REGISTER_REPORTER( name, reporterType ) \\\n    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION         \\\n    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS          \\\n    namespace{ Catch::ReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType( name ); } \\\n    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION\n\n#define CATCH_REGISTER_LISTENER( listenerType ) \\\n    CATCH_INTERNAL_START_WARNINGS_SUPPRESSION   \\\n    CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS    \\\n    namespace{ Catch::ListenerRegistrar<listenerType> catch_internal_RegistrarFor##listenerType; } \\\n    CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION\n#else // CATCH_CONFIG_DISABLE\n\n#define CATCH_REGISTER_REPORTER(name, reporterType)\n#define CATCH_REGISTER_LISTENER(listenerType)\n\n#endif // CATCH_CONFIG_DISABLE\n\n// end catch_reporter_registrars.hpp\n// Allow users to base their work off existing reporters\n// start catch_reporter_compact.h\n\nnamespace Catch {\n\n    struct CompactReporter : StreamingReporterBase<CompactReporter> {\n\n        using StreamingReporterBase::StreamingReporterBase;\n\n        ~CompactReporter() override;\n\n        static std::string getDescription();\n\n        void noMatchingTestCases(std::string const& spec) override;\n\n        void assertionStarting(AssertionInfo const&) override;\n\n        bool assertionEnded(AssertionStats const& _assertionStats) override;\n\n        void sectionEnded(SectionStats const& _sectionStats) override;\n\n        void testRunEnded(TestRunStats const& _testRunStats) override;\n\n    };\n\n} // end namespace Catch\n\n// end catch_reporter_compact.h\n// start catch_reporter_console.h\n\n#if defined(_MSC_VER)\n#pragma warning(push)\n#pragma warning(disable:4061) // Not all labels are EXPLICITLY handled in switch\n                              // Note that 4062 (not all labels are handled\n                              // and default is missing) is enabled\n#endif\n\nnamespace Catch {\n    // Fwd decls\n    struct SummaryColumn;\n    class TablePrinter;\n\n    struct ConsoleReporter : StreamingReporterBase<ConsoleReporter> {\n        std::unique_ptr<TablePrinter> m_tablePrinter;\n\n        ConsoleReporter(ReporterConfig const& config);\n        ~ConsoleReporter() override;\n        static std::string getDescription();\n\n        void noMatchingTestCases(std::string const& spec) override;\n\n        void reportInvalidArguments(std::string const&arg) override;\n\n        void assertionStarting(AssertionInfo const&) override;\n\n        bool assertionEnded(AssertionStats const& _assertionStats) override;\n\n        void sectionStarting(SectionInfo const& _sectionInfo) override;\n        void sectionEnded(SectionStats const& _sectionStats) override;\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n        void benchmarkPreparing(std::string const& name) override;\n        void benchmarkStarting(BenchmarkInfo const& info) override;\n        void benchmarkEnded(BenchmarkStats<> const& stats) override;\n        void benchmarkFailed(std::string const& error) override;\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\n        void testCaseEnded(TestCaseStats const& _testCaseStats) override;\n        void testGroupEnded(TestGroupStats const& _testGroupStats) override;\n        void testRunEnded(TestRunStats const& _testRunStats) override;\n        void testRunStarting(TestRunInfo const& _testRunInfo) override;\n    private:\n\n        void lazyPrint();\n\n        void lazyPrintWithoutClosingBenchmarkTable();\n        void lazyPrintRunInfo();\n        void lazyPrintGroupInfo();\n        void printTestCaseAndSectionHeader();\n\n        void printClosedHeader(std::string const& _name);\n        void printOpenHeader(std::string const& _name);\n\n        // if string has a : in first line will set indent to follow it on\n        // subsequent lines\n        void printHeaderString(std::string const& _string, std::size_t indent = 0);\n\n        void printTotals(Totals const& totals);\n        void printSummaryRow(std::string const& label, std::vector<SummaryColumn> const& cols, std::size_t row);\n\n        void printTotalsDivider(Totals const& totals);\n        void printSummaryDivider();\n        void printTestFilters();\n\n    private:\n        bool m_headerPrinted = false;\n    };\n\n} // end namespace Catch\n\n#if defined(_MSC_VER)\n#pragma warning(pop)\n#endif\n\n// end catch_reporter_console.h\n// start catch_reporter_junit.h\n\n// start catch_xmlwriter.h\n\n#include <vector>\n\nnamespace Catch {\n    enum class XmlFormatting {\n        None = 0x00,\n        Indent = 0x01,\n        Newline = 0x02,\n    };\n\n    XmlFormatting operator | (XmlFormatting lhs, XmlFormatting rhs);\n    XmlFormatting operator & (XmlFormatting lhs, XmlFormatting rhs);\n\n    class XmlEncode {\n    public:\n        enum ForWhat { ForTextNodes, ForAttributes };\n\n        XmlEncode( std::string const& str, ForWhat forWhat = ForTextNodes );\n\n        void encodeTo( std::ostream& os ) const;\n\n        friend std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode );\n\n    private:\n        std::string m_str;\n        ForWhat m_forWhat;\n    };\n\n    class XmlWriter {\n    public:\n\n        class ScopedElement {\n        public:\n            ScopedElement( XmlWriter* writer, XmlFormatting fmt );\n\n            ScopedElement( ScopedElement&& other ) noexcept;\n            ScopedElement& operator=( ScopedElement&& other ) noexcept;\n\n            ~ScopedElement();\n\n            ScopedElement& writeText( std::string const& text, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent );\n\n            template<typename T>\n            ScopedElement& writeAttribute( std::string const& name, T const& attribute ) {\n                m_writer->writeAttribute( name, attribute );\n                return *this;\n            }\n\n        private:\n            mutable XmlWriter* m_writer = nullptr;\n            XmlFormatting m_fmt;\n        };\n\n        XmlWriter( std::ostream& os = Catch::cout() );\n        ~XmlWriter();\n\n        XmlWriter( XmlWriter const& ) = delete;\n        XmlWriter& operator=( XmlWriter const& ) = delete;\n\n        XmlWriter& startElement( std::string const& name, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent);\n\n        ScopedElement scopedElement( std::string const& name, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent);\n\n        XmlWriter& endElement(XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent);\n\n        XmlWriter& writeAttribute( std::string const& name, std::string const& attribute );\n\n        XmlWriter& writeAttribute( std::string const& name, bool attribute );\n\n        template<typename T>\n        XmlWriter& writeAttribute( std::string const& name, T const& attribute ) {\n            ReusableStringStream rss;\n            rss << attribute;\n            return writeAttribute( name, rss.str() );\n        }\n\n        XmlWriter& writeText( std::string const& text, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent);\n\n        XmlWriter& writeComment(std::string const& text, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent);\n\n        void writeStylesheetRef( std::string const& url );\n\n        XmlWriter& writeBlankLine();\n\n        void ensureTagClosed();\n\n    private:\n\n        void applyFormatting(XmlFormatting fmt);\n\n        void writeDeclaration();\n\n        void newlineIfNecessary();\n\n        bool m_tagIsOpen = false;\n        bool m_needsNewline = false;\n        std::vector<std::string> m_tags;\n        std::string m_indent;\n        std::ostream& m_os;\n    };\n\n}\n\n// end catch_xmlwriter.h\nnamespace Catch {\n\n    class JunitReporter : public CumulativeReporterBase<JunitReporter> {\n    public:\n        JunitReporter(ReporterConfig const& _config);\n\n        ~JunitReporter() override;\n\n        static std::string getDescription();\n\n        void noMatchingTestCases(std::string const& /*spec*/) override;\n\n        void testRunStarting(TestRunInfo const& runInfo) override;\n\n        void testGroupStarting(GroupInfo const& groupInfo) override;\n\n        void testCaseStarting(TestCaseInfo const& testCaseInfo) override;\n        bool assertionEnded(AssertionStats const& assertionStats) override;\n\n        void testCaseEnded(TestCaseStats const& testCaseStats) override;\n\n        void testGroupEnded(TestGroupStats const& testGroupStats) override;\n\n        void testRunEndedCumulative() override;\n\n        void writeGroup(TestGroupNode const& groupNode, double suiteTime);\n\n        void writeTestCase(TestCaseNode const& testCaseNode);\n\n        void writeSection(std::string const& className,\n                          std::string const& rootName,\n                          SectionNode const& sectionNode);\n\n        void writeAssertions(SectionNode const& sectionNode);\n        void writeAssertion(AssertionStats const& stats);\n\n        XmlWriter xml;\n        Timer suiteTimer;\n        std::string stdOutForSuite;\n        std::string stdErrForSuite;\n        unsigned int unexpectedExceptions = 0;\n        bool m_okToFail = false;\n    };\n\n} // end namespace Catch\n\n// end catch_reporter_junit.h\n// start catch_reporter_xml.h\n\nnamespace Catch {\n    class XmlReporter : public StreamingReporterBase<XmlReporter> {\n    public:\n        XmlReporter(ReporterConfig const& _config);\n\n        ~XmlReporter() override;\n\n        static std::string getDescription();\n\n        virtual std::string getStylesheetRef() const;\n\n        void writeSourceInfo(SourceLineInfo const& sourceInfo);\n\n    public: // StreamingReporterBase\n\n        void noMatchingTestCases(std::string const& s) override;\n\n        void testRunStarting(TestRunInfo const& testInfo) override;\n\n        void testGroupStarting(GroupInfo const& groupInfo) override;\n\n        void testCaseStarting(TestCaseInfo const& testInfo) override;\n\n        void sectionStarting(SectionInfo const& sectionInfo) override;\n\n        void assertionStarting(AssertionInfo const&) override;\n\n        bool assertionEnded(AssertionStats const& assertionStats) override;\n\n        void sectionEnded(SectionStats const& sectionStats) override;\n\n        void testCaseEnded(TestCaseStats const& testCaseStats) override;\n\n        void testGroupEnded(TestGroupStats const& testGroupStats) override;\n\n        void testRunEnded(TestRunStats const& testRunStats) override;\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n        void benchmarkPreparing(std::string const& name) override;\n        void benchmarkStarting(BenchmarkInfo const&) override;\n        void benchmarkEnded(BenchmarkStats<> const&) override;\n        void benchmarkFailed(std::string const&) override;\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\n    private:\n        Timer m_testCaseTimer;\n        XmlWriter m_xml;\n        int m_sectionDepth = 0;\n    };\n\n} // end namespace Catch\n\n// end catch_reporter_xml.h\n\n// end catch_external_interfaces.h\n#endif\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n// start catch_benchmarking_all.hpp\n\n// A proxy header that includes all of the benchmarking headers to allow\n// concise include of the benchmarking features. You should prefer the\n// individual includes in standard use.\n\n// start catch_benchmark.hpp\n\n // Benchmark\n\n// start catch_chronometer.hpp\n\n// User-facing chronometer\n\n\n// start catch_clock.hpp\n\n// Clocks\n\n\n#include <chrono>\n#include <ratio>\n\nnamespace Catch {\n    namespace Benchmark {\n        template <typename Clock>\n        using ClockDuration = typename Clock::duration;\n        template <typename Clock>\n        using FloatDuration = std::chrono::duration<double, typename Clock::period>;\n\n        template <typename Clock>\n        using TimePoint = typename Clock::time_point;\n\n        using default_clock = std::chrono::steady_clock;\n\n        template <typename Clock>\n        struct now {\n            TimePoint<Clock> operator()() const {\n                return Clock::now();\n            }\n        };\n\n        using fp_seconds = std::chrono::duration<double, std::ratio<1>>;\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_clock.hpp\n// start catch_optimizer.hpp\n\n // Hinting the optimizer\n\n\n#if defined(_MSC_VER)\n#   include <atomic> // atomic_thread_fence\n#endif\n\nnamespace Catch {\n    namespace Benchmark {\n#if defined(__GNUC__) || defined(__clang__)\n        template <typename T>\n        inline void keep_memory(T* p) {\n            asm volatile(\"\" : : \"g\"(p) : \"memory\");\n        }\n        inline void keep_memory() {\n            asm volatile(\"\" : : : \"memory\");\n        }\n\n        namespace Detail {\n            inline void optimizer_barrier() { keep_memory(); }\n        } // namespace Detail\n#elif defined(_MSC_VER)\n\n#pragma optimize(\"\", off)\n        template <typename T>\n        inline void keep_memory(T* p) {\n            // thanks @milleniumbug\n            *reinterpret_cast<char volatile*>(p) = *reinterpret_cast<char const volatile*>(p);\n        }\n        // TODO equivalent keep_memory()\n#pragma optimize(\"\", on)\n\n        namespace Detail {\n            inline void optimizer_barrier() {\n                std::atomic_thread_fence(std::memory_order_seq_cst);\n            }\n        } // namespace Detail\n\n#endif\n\n        template <typename T>\n        inline void deoptimize_value(T&& x) {\n            keep_memory(&x);\n        }\n\n        template <typename Fn, typename... Args>\n        inline auto invoke_deoptimized(Fn&& fn, Args&&... args) -> typename std::enable_if<!std::is_same<void, decltype(fn(args...))>::value>::type {\n            deoptimize_value(std::forward<Fn>(fn) (std::forward<Args...>(args...)));\n        }\n\n        template <typename Fn, typename... Args>\n        inline auto invoke_deoptimized(Fn&& fn, Args&&... args) -> typename std::enable_if<std::is_same<void, decltype(fn(args...))>::value>::type {\n            std::forward<Fn>(fn) (std::forward<Args...>(args...));\n        }\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_optimizer.hpp\n// start catch_complete_invoke.hpp\n\n// Invoke with a special case for void\n\n\n#include <type_traits>\n#include <utility>\n\nnamespace Catch {\n    namespace Benchmark {\n        namespace Detail {\n            template <typename T>\n            struct CompleteType { using type = T; };\n            template <>\n            struct CompleteType<void> { struct type {}; };\n\n            template <typename T>\n            using CompleteType_t = typename CompleteType<T>::type;\n\n            template <typename Result>\n            struct CompleteInvoker {\n                template <typename Fun, typename... Args>\n                static Result invoke(Fun&& fun, Args&&... args) {\n                    return std::forward<Fun>(fun)(std::forward<Args>(args)...);\n                }\n            };\n            template <>\n            struct CompleteInvoker<void> {\n                template <typename Fun, typename... Args>\n                static CompleteType_t<void> invoke(Fun&& fun, Args&&... args) {\n                    std::forward<Fun>(fun)(std::forward<Args>(args)...);\n                    return {};\n                }\n            };\n\n            // invoke and not return void :(\n            template <typename Fun, typename... Args>\n            CompleteType_t<FunctionReturnType<Fun, Args...>> complete_invoke(Fun&& fun, Args&&... args) {\n                return CompleteInvoker<FunctionReturnType<Fun, Args...>>::invoke(std::forward<Fun>(fun), std::forward<Args>(args)...);\n            }\n\n            const std::string benchmarkErrorMsg = \"a benchmark failed to run successfully\";\n        } // namespace Detail\n\n        template <typename Fun>\n        Detail::CompleteType_t<FunctionReturnType<Fun>> user_code(Fun&& fun) {\n            CATCH_TRY{\n                return Detail::complete_invoke(std::forward<Fun>(fun));\n            } CATCH_CATCH_ALL{\n                getResultCapture().benchmarkFailed(translateActiveException());\n                CATCH_RUNTIME_ERROR(Detail::benchmarkErrorMsg);\n            }\n        }\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_complete_invoke.hpp\nnamespace Catch {\n    namespace Benchmark {\n        namespace Detail {\n            struct ChronometerConcept {\n                virtual void start() = 0;\n                virtual void finish() = 0;\n                virtual ~ChronometerConcept() = default;\n            };\n            template <typename Clock>\n            struct ChronometerModel final : public ChronometerConcept {\n                void start() override { started = Clock::now(); }\n                void finish() override { finished = Clock::now(); }\n\n                ClockDuration<Clock> elapsed() const { return finished - started; }\n\n                TimePoint<Clock> started;\n                TimePoint<Clock> finished;\n            };\n        } // namespace Detail\n\n        struct Chronometer {\n        public:\n            template <typename Fun>\n            void measure(Fun&& fun) { measure(std::forward<Fun>(fun), is_callable<Fun(int)>()); }\n\n            int runs() const { return k; }\n\n            Chronometer(Detail::ChronometerConcept& meter, int k)\n                : impl(&meter)\n                , k(k) {}\n\n        private:\n            template <typename Fun>\n            void measure(Fun&& fun, std::false_type) {\n                measure([&fun](int) { return fun(); }, std::true_type());\n            }\n\n            template <typename Fun>\n            void measure(Fun&& fun, std::true_type) {\n                Detail::optimizer_barrier();\n                impl->start();\n                for (int i = 0; i < k; ++i) invoke_deoptimized(fun, i);\n                impl->finish();\n                Detail::optimizer_barrier();\n            }\n\n            Detail::ChronometerConcept* impl;\n            int k;\n        };\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_chronometer.hpp\n// start catch_environment.hpp\n\n// Environment information\n\n\nnamespace Catch {\n    namespace Benchmark {\n        template <typename Duration>\n        struct EnvironmentEstimate {\n            Duration mean;\n            OutlierClassification outliers;\n\n            template <typename Duration2>\n            operator EnvironmentEstimate<Duration2>() const {\n                return { mean, outliers };\n            }\n        };\n        template <typename Clock>\n        struct Environment {\n            using clock_type = Clock;\n            EnvironmentEstimate<FloatDuration<Clock>> clock_resolution;\n            EnvironmentEstimate<FloatDuration<Clock>> clock_cost;\n        };\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_environment.hpp\n// start catch_execution_plan.hpp\n\n // Execution plan\n\n\n// start catch_benchmark_function.hpp\n\n // Dumb std::function implementation for consistent call overhead\n\n\n#include <cassert>\n#include <type_traits>\n#include <utility>\n#include <memory>\n\nnamespace Catch {\n    namespace Benchmark {\n        namespace Detail {\n            template <typename T>\n            using Decay = typename std::decay<T>::type;\n            template <typename T, typename U>\n            struct is_related\n                : std::is_same<Decay<T>, Decay<U>> {};\n\n            /// We need to reinvent std::function because every piece of code that might add overhead\n            /// in a measurement context needs to have consistent performance characteristics so that we\n            /// can account for it in the measurement.\n            /// Implementations of std::function with optimizations that aren't always applicable, like\n            /// small buffer optimizations, are not uncommon.\n            /// This is effectively an implementation of std::function without any such optimizations;\n            /// it may be slow, but it is consistently slow.\n            struct BenchmarkFunction {\n            private:\n                struct callable {\n                    virtual void call(Chronometer meter) const = 0;\n                    virtual callable* clone() const = 0;\n                    virtual ~callable() = default;\n                };\n                template <typename Fun>\n                struct model : public callable {\n                    model(Fun&& fun) : fun(std::move(fun)) {}\n                    model(Fun const& fun) : fun(fun) {}\n\n                    model<Fun>* clone() const override { return new model<Fun>(*this); }\n\n                    void call(Chronometer meter) const override {\n                        call(meter, is_callable<Fun(Chronometer)>());\n                    }\n                    void call(Chronometer meter, std::true_type) const {\n                        fun(meter);\n                    }\n                    void call(Chronometer meter, std::false_type) const {\n                        meter.measure(fun);\n                    }\n\n                    Fun fun;\n                };\n\n                struct do_nothing { void operator()() const {} };\n\n                template <typename T>\n                BenchmarkFunction(model<T>* c) : f(c) {}\n\n            public:\n                BenchmarkFunction()\n                    : f(new model<do_nothing>{ {} }) {}\n\n                template <typename Fun,\n                    typename std::enable_if<!is_related<Fun, BenchmarkFunction>::value, int>::type = 0>\n                    BenchmarkFunction(Fun&& fun)\n                    : f(new model<typename std::decay<Fun>::type>(std::forward<Fun>(fun))) {}\n\n                BenchmarkFunction(BenchmarkFunction&& that)\n                    : f(std::move(that.f)) {}\n\n                BenchmarkFunction(BenchmarkFunction const& that)\n                    : f(that.f->clone()) {}\n\n                BenchmarkFunction& operator=(BenchmarkFunction&& that) {\n                    f = std::move(that.f);\n                    return *this;\n                }\n\n                BenchmarkFunction& operator=(BenchmarkFunction const& that) {\n                    f.reset(that.f->clone());\n                    return *this;\n                }\n\n                void operator()(Chronometer meter) const { f->call(meter); }\n\n            private:\n                std::unique_ptr<callable> f;\n            };\n        } // namespace Detail\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_benchmark_function.hpp\n// start catch_repeat.hpp\n\n// repeat algorithm\n\n\n#include <type_traits>\n#include <utility>\n\nnamespace Catch {\n    namespace Benchmark {\n        namespace Detail {\n            template <typename Fun>\n            struct repeater {\n                void operator()(int k) const {\n                    for (int i = 0; i < k; ++i) {\n                        fun();\n                    }\n                }\n                Fun fun;\n            };\n            template <typename Fun>\n            repeater<typename std::decay<Fun>::type> repeat(Fun&& fun) {\n                return { std::forward<Fun>(fun) };\n            }\n        } // namespace Detail\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_repeat.hpp\n// start catch_run_for_at_least.hpp\n\n// Run a function for a minimum amount of time\n\n\n// start catch_measure.hpp\n\n// Measure\n\n\n// start catch_timing.hpp\n\n// Timing\n\n\n#include <tuple>\n#include <type_traits>\n\nnamespace Catch {\n    namespace Benchmark {\n        template <typename Duration, typename Result>\n        struct Timing {\n            Duration elapsed;\n            Result result;\n            int iterations;\n        };\n        template <typename Clock, typename Func, typename... Args>\n        using TimingOf = Timing<ClockDuration<Clock>, Detail::CompleteType_t<FunctionReturnType<Func, Args...>>>;\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_timing.hpp\n#include <utility>\n\nnamespace Catch {\n    namespace Benchmark {\n        namespace Detail {\n            template <typename Clock, typename Fun, typename... Args>\n            TimingOf<Clock, Fun, Args...> measure(Fun&& fun, Args&&... args) {\n                auto start = Clock::now();\n                auto&& r = Detail::complete_invoke(fun, std::forward<Args>(args)...);\n                auto end = Clock::now();\n                auto delta = end - start;\n                return { delta, std::forward<decltype(r)>(r), 1 };\n            }\n        } // namespace Detail\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_measure.hpp\n#include <utility>\n#include <type_traits>\n\nnamespace Catch {\n    namespace Benchmark {\n        namespace Detail {\n            template <typename Clock, typename Fun>\n            TimingOf<Clock, Fun, int> measure_one(Fun&& fun, int iters, std::false_type) {\n                return Detail::measure<Clock>(fun, iters);\n            }\n            template <typename Clock, typename Fun>\n            TimingOf<Clock, Fun, Chronometer> measure_one(Fun&& fun, int iters, std::true_type) {\n                Detail::ChronometerModel<Clock> meter;\n                auto&& result = Detail::complete_invoke(fun, Chronometer(meter, iters));\n\n                return { meter.elapsed(), std::move(result), iters };\n            }\n\n            template <typename Clock, typename Fun>\n            using run_for_at_least_argument_t = typename std::conditional<is_callable<Fun(Chronometer)>::value, Chronometer, int>::type;\n\n            struct optimized_away_error : std::exception {\n                const char* what() const noexcept override {\n                    return \"could not measure benchmark, maybe it was optimized away\";\n                }\n            };\n\n            template <typename Clock, typename Fun>\n            TimingOf<Clock, Fun, run_for_at_least_argument_t<Clock, Fun>> run_for_at_least(ClockDuration<Clock> how_long, int seed, Fun&& fun) {\n                auto iters = seed;\n                while (iters < (1 << 30)) {\n                    auto&& Timing = measure_one<Clock>(fun, iters, is_callable<Fun(Chronometer)>());\n\n                    if (Timing.elapsed >= how_long) {\n                        return { Timing.elapsed, std::move(Timing.result), iters };\n                    }\n                    iters *= 2;\n                }\n                throw optimized_away_error{};\n            }\n        } // namespace Detail\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_run_for_at_least.hpp\n#include <algorithm>\n\nnamespace Catch {\n    namespace Benchmark {\n        template <typename Duration>\n        struct ExecutionPlan {\n            int iterations_per_sample;\n            Duration estimated_duration;\n            Detail::BenchmarkFunction benchmark;\n            Duration warmup_time;\n            int warmup_iterations;\n\n            template <typename Duration2>\n            operator ExecutionPlan<Duration2>() const {\n                return { iterations_per_sample, estimated_duration, benchmark, warmup_time, warmup_iterations };\n            }\n\n            template <typename Clock>\n            std::vector<FloatDuration<Clock>> run(const IConfig &cfg, Environment<FloatDuration<Clock>> env) const {\n                // warmup a bit\n                Detail::run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(warmup_time), warmup_iterations, Detail::repeat(now<Clock>{}));\n\n                std::vector<FloatDuration<Clock>> times;\n                times.reserve(cfg.benchmarkSamples());\n                std::generate_n(std::back_inserter(times), cfg.benchmarkSamples(), [this, env] {\n                    Detail::ChronometerModel<Clock> model;\n                    this->benchmark(Chronometer(model, iterations_per_sample));\n                    auto sample_time = model.elapsed() - env.clock_cost.mean;\n                    if (sample_time < FloatDuration<Clock>::zero()) sample_time = FloatDuration<Clock>::zero();\n                    return sample_time / iterations_per_sample;\n                });\n                return times;\n            }\n        };\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_execution_plan.hpp\n// start catch_estimate_clock.hpp\n\n // Environment measurement\n\n\n// start catch_stats.hpp\n\n// Statistical analysis tools\n\n\n#include <algorithm>\n#include <functional>\n#include <vector>\n#include <iterator>\n#include <numeric>\n#include <tuple>\n#include <cmath>\n#include <utility>\n#include <cstddef>\n#include <random>\n\nnamespace Catch {\n    namespace Benchmark {\n        namespace Detail {\n            using sample = std::vector<double>;\n\n            double weighted_average_quantile(int k, int q, std::vector<double>::iterator first, std::vector<double>::iterator last);\n\n            template <typename Iterator>\n            OutlierClassification classify_outliers(Iterator first, Iterator last) {\n                std::vector<double> copy(first, last);\n\n                auto q1 = weighted_average_quantile(1, 4, copy.begin(), copy.end());\n                auto q3 = weighted_average_quantile(3, 4, copy.begin(), copy.end());\n                auto iqr = q3 - q1;\n                auto los = q1 - (iqr * 3.);\n                auto lom = q1 - (iqr * 1.5);\n                auto him = q3 + (iqr * 1.5);\n                auto his = q3 + (iqr * 3.);\n\n                OutlierClassification o;\n                for (; first != last; ++first) {\n                    auto&& t = *first;\n                    if (t < los) ++o.low_severe;\n                    else if (t < lom) ++o.low_mild;\n                    else if (t > his) ++o.high_severe;\n                    else if (t > him) ++o.high_mild;\n                    ++o.samples_seen;\n                }\n                return o;\n            }\n\n            template <typename Iterator>\n            double mean(Iterator first, Iterator last) {\n                auto count = last - first;\n                double sum = std::accumulate(first, last, 0.);\n                return sum / count;\n            }\n\n            template <typename URng, typename Iterator, typename Estimator>\n            sample resample(URng& rng, int resamples, Iterator first, Iterator last, Estimator& estimator) {\n                auto n = last - first;\n                std::uniform_int_distribution<decltype(n)> dist(0, n - 1);\n\n                sample out;\n                out.reserve(resamples);\n                std::generate_n(std::back_inserter(out), resamples, [n, first, &estimator, &dist, &rng] {\n                    std::vector<double> resampled;\n                    resampled.reserve(n);\n                    std::generate_n(std::back_inserter(resampled), n, [first, &dist, &rng] { return first[dist(rng)]; });\n                    return estimator(resampled.begin(), resampled.end());\n                });\n                std::sort(out.begin(), out.end());\n                return out;\n            }\n\n            template <typename Estimator, typename Iterator>\n            sample jackknife(Estimator&& estimator, Iterator first, Iterator last) {\n                auto n = last - first;\n                auto second = std::next(first);\n                sample results;\n                results.reserve(n);\n\n                for (auto it = first; it != last; ++it) {\n                    std::iter_swap(it, first);\n                    results.push_back(estimator(second, last));\n                }\n\n                return results;\n            }\n\n            inline double normal_cdf(double x) {\n                return std::erfc(-x / std::sqrt(2.0)) / 2.0;\n            }\n\n            double erfc_inv(double x);\n\n            double normal_quantile(double p);\n\n            template <typename Iterator, typename Estimator>\n            Estimate<double> bootstrap(double confidence_level, Iterator first, Iterator last, sample const& resample, Estimator&& estimator) {\n                auto n_samples = last - first;\n\n                double point = estimator(first, last);\n                // Degenerate case with a single sample\n                if (n_samples == 1) return { point, point, point, confidence_level };\n\n                sample jack = jackknife(estimator, first, last);\n                double jack_mean = mean(jack.begin(), jack.end());\n                double sum_squares, sum_cubes;\n                std::tie(sum_squares, sum_cubes) = std::accumulate(jack.begin(), jack.end(), std::make_pair(0., 0.), [jack_mean](std::pair<double, double> sqcb, double x) -> std::pair<double, double> {\n                    auto d = jack_mean - x;\n                    auto d2 = d * d;\n                    auto d3 = d2 * d;\n                    return { sqcb.first + d2, sqcb.second + d3 };\n                });\n\n                double accel = sum_cubes / (6 * std::pow(sum_squares, 1.5));\n                int n = static_cast<int>(resample.size());\n                double prob_n = std::count_if(resample.begin(), resample.end(), [point](double x) { return x < point; }) / (double)n;\n                // degenerate case with uniform samples\n                if (prob_n == 0) return { point, point, point, confidence_level };\n\n                double bias = normal_quantile(prob_n);\n                double z1 = normal_quantile((1. - confidence_level) / 2.);\n\n                auto cumn = [n](double x) -> int {\n                    return std::lround(normal_cdf(x) * n); };\n                auto a = [bias, accel](double b) { return bias + b / (1. - accel * b); };\n                double b1 = bias + z1;\n                double b2 = bias - z1;\n                double a1 = a(b1);\n                double a2 = a(b2);\n                auto lo = std::max(cumn(a1), 0);\n                auto hi = std::min(cumn(a2), n - 1);\n\n                return { point, resample[lo], resample[hi], confidence_level };\n            }\n\n            double outlier_variance(Estimate<double> mean, Estimate<double> stddev, int n);\n\n            struct bootstrap_analysis {\n                Estimate<double> mean;\n                Estimate<double> standard_deviation;\n                double outlier_variance;\n            };\n\n            bootstrap_analysis analyse_samples(double confidence_level, int n_resamples, std::vector<double>::iterator first, std::vector<double>::iterator last);\n        } // namespace Detail\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_stats.hpp\n#include <algorithm>\n#include <iterator>\n#include <tuple>\n#include <vector>\n#include <cmath>\n\nnamespace Catch {\n    namespace Benchmark {\n        namespace Detail {\n            template <typename Clock>\n            std::vector<double> resolution(int k) {\n                std::vector<TimePoint<Clock>> times;\n                times.reserve(k + 1);\n                std::generate_n(std::back_inserter(times), k + 1, now<Clock>{});\n\n                std::vector<double> deltas;\n                deltas.reserve(k);\n                std::transform(std::next(times.begin()), times.end(), times.begin(),\n                    std::back_inserter(deltas),\n                    [](TimePoint<Clock> a, TimePoint<Clock> b) { return static_cast<double>((a - b).count()); });\n\n                return deltas;\n            }\n\n            const auto warmup_iterations = 10000;\n            const auto warmup_time = std::chrono::milliseconds(100);\n            const auto minimum_ticks = 1000;\n            const auto warmup_seed = 10000;\n            const auto clock_resolution_estimation_time = std::chrono::milliseconds(500);\n            const auto clock_cost_estimation_time_limit = std::chrono::seconds(1);\n            const auto clock_cost_estimation_tick_limit = 100000;\n            const auto clock_cost_estimation_time = std::chrono::milliseconds(10);\n            const auto clock_cost_estimation_iterations = 10000;\n\n            template <typename Clock>\n            int warmup() {\n                return run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(warmup_time), warmup_seed, &resolution<Clock>)\n                    .iterations;\n            }\n            template <typename Clock>\n            EnvironmentEstimate<FloatDuration<Clock>> estimate_clock_resolution(int iterations) {\n                auto r = run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(clock_resolution_estimation_time), iterations, &resolution<Clock>)\n                    .result;\n                return {\n                    FloatDuration<Clock>(mean(r.begin(), r.end())),\n                    classify_outliers(r.begin(), r.end()),\n                };\n            }\n            template <typename Clock>\n            EnvironmentEstimate<FloatDuration<Clock>> estimate_clock_cost(FloatDuration<Clock> resolution) {\n                auto time_limit = std::min(resolution * clock_cost_estimation_tick_limit, FloatDuration<Clock>(clock_cost_estimation_time_limit));\n                auto time_clock = [](int k) {\n                    return Detail::measure<Clock>([k] {\n                        for (int i = 0; i < k; ++i) {\n                            volatile auto ignored = Clock::now();\n                            (void)ignored;\n                        }\n                    }).elapsed;\n                };\n                time_clock(1);\n                int iters = clock_cost_estimation_iterations;\n                auto&& r = run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(clock_cost_estimation_time), iters, time_clock);\n                std::vector<double> times;\n                int nsamples = static_cast<int>(std::ceil(time_limit / r.elapsed));\n                times.reserve(nsamples);\n                std::generate_n(std::back_inserter(times), nsamples, [time_clock, &r] {\n                    return static_cast<double>((time_clock(r.iterations) / r.iterations).count());\n                });\n                return {\n                    FloatDuration<Clock>(mean(times.begin(), times.end())),\n                    classify_outliers(times.begin(), times.end()),\n                };\n            }\n\n            template <typename Clock>\n            Environment<FloatDuration<Clock>> measure_environment() {\n                static Environment<FloatDuration<Clock>>* env = nullptr;\n                if (env) {\n                    return *env;\n                }\n\n                auto iters = Detail::warmup<Clock>();\n                auto resolution = Detail::estimate_clock_resolution<Clock>(iters);\n                auto cost = Detail::estimate_clock_cost<Clock>(resolution.mean);\n\n                env = new Environment<FloatDuration<Clock>>{ resolution, cost };\n                return *env;\n            }\n        } // namespace Detail\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_estimate_clock.hpp\n// start catch_analyse.hpp\n\n // Run and analyse one benchmark\n\n\n// start catch_sample_analysis.hpp\n\n// Benchmark results\n\n\n#include <algorithm>\n#include <vector>\n#include <string>\n#include <iterator>\n\nnamespace Catch {\n    namespace Benchmark {\n        template <typename Duration>\n        struct SampleAnalysis {\n            std::vector<Duration> samples;\n            Estimate<Duration> mean;\n            Estimate<Duration> standard_deviation;\n            OutlierClassification outliers;\n            double outlier_variance;\n\n            template <typename Duration2>\n            operator SampleAnalysis<Duration2>() const {\n                std::vector<Duration2> samples2;\n                samples2.reserve(samples.size());\n                std::transform(samples.begin(), samples.end(), std::back_inserter(samples2), [](Duration d) { return Duration2(d); });\n                return {\n                    std::move(samples2),\n                    mean,\n                    standard_deviation,\n                    outliers,\n                    outlier_variance,\n                };\n            }\n        };\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_sample_analysis.hpp\n#include <algorithm>\n#include <iterator>\n#include <vector>\n\nnamespace Catch {\n    namespace Benchmark {\n        namespace Detail {\n            template <typename Duration, typename Iterator>\n            SampleAnalysis<Duration> analyse(const IConfig &cfg, Environment<Duration>, Iterator first, Iterator last) {\n                if (!cfg.benchmarkNoAnalysis()) {\n                    std::vector<double> samples;\n                    samples.reserve(last - first);\n                    std::transform(first, last, std::back_inserter(samples), [](Duration d) { return d.count(); });\n\n                    auto analysis = Catch::Benchmark::Detail::analyse_samples(cfg.benchmarkConfidenceInterval(), cfg.benchmarkResamples(), samples.begin(), samples.end());\n                    auto outliers = Catch::Benchmark::Detail::classify_outliers(samples.begin(), samples.end());\n\n                    auto wrap_estimate = [](Estimate<double> e) {\n                        return Estimate<Duration> {\n                            Duration(e.point),\n                                Duration(e.lower_bound),\n                                Duration(e.upper_bound),\n                                e.confidence_interval,\n                        };\n                    };\n                    std::vector<Duration> samples2;\n                    samples2.reserve(samples.size());\n                    std::transform(samples.begin(), samples.end(), std::back_inserter(samples2), [](double d) { return Duration(d); });\n                    return {\n                        std::move(samples2),\n                        wrap_estimate(analysis.mean),\n                        wrap_estimate(analysis.standard_deviation),\n                        outliers,\n                        analysis.outlier_variance,\n                    };\n                } else {\n                    std::vector<Duration> samples;\n                    samples.reserve(last - first);\n\n                    Duration mean = Duration(0);\n                    int i = 0;\n                    for (auto it = first; it < last; ++it, ++i) {\n                        samples.push_back(Duration(*it));\n                        mean += Duration(*it);\n                    }\n                    mean /= i;\n\n                    return {\n                        std::move(samples),\n                        Estimate<Duration>{mean, mean, mean, 0.0},\n                        Estimate<Duration>{Duration(0), Duration(0), Duration(0), 0.0},\n                        OutlierClassification{},\n                        0.0\n                    };\n                }\n            }\n        } // namespace Detail\n    } // namespace Benchmark\n} // namespace Catch\n\n// end catch_analyse.hpp\n#include <algorithm>\n#include <functional>\n#include <string>\n#include <vector>\n#include <cmath>\n\nnamespace Catch {\n    namespace Benchmark {\n        struct Benchmark {\n            Benchmark(std::string &&name)\n                : name(std::move(name)) {}\n\n            template <class FUN>\n            Benchmark(std::string &&name, FUN &&func)\n                : fun(std::move(func)), name(std::move(name)) {}\n\n            template <typename Clock>\n            ExecutionPlan<FloatDuration<Clock>> prepare(const IConfig &cfg, Environment<FloatDuration<Clock>> env) const {\n                auto min_time = env.clock_resolution.mean * Detail::minimum_ticks;\n                auto run_time = std::max(min_time, std::chrono::duration_cast<decltype(min_time)>(cfg.benchmarkWarmupTime()));\n                auto&& test = Detail::run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(run_time), 1, fun);\n                int new_iters = static_cast<int>(std::ceil(min_time * test.iterations / test.elapsed));\n                return { new_iters, test.elapsed / test.iterations * new_iters * cfg.benchmarkSamples(), fun, std::chrono::duration_cast<FloatDuration<Clock>>(cfg.benchmarkWarmupTime()), Detail::warmup_iterations };\n            }\n\n            template <typename Clock = default_clock>\n            void run() {\n                IConfigPtr cfg = getCurrentContext().getConfig();\n\n                auto env = Detail::measure_environment<Clock>();\n\n                getResultCapture().benchmarkPreparing(name);\n                CATCH_TRY{\n                    auto plan = user_code([&] {\n                        return prepare<Clock>(*cfg, env);\n                    });\n\n                    BenchmarkInfo info {\n                        name,\n                        plan.estimated_duration.count(),\n                        plan.iterations_per_sample,\n                        cfg->benchmarkSamples(),\n                        cfg->benchmarkResamples(),\n                        env.clock_resolution.mean.count(),\n                        env.clock_cost.mean.count()\n                    };\n\n                    getResultCapture().benchmarkStarting(info);\n\n                    auto samples = user_code([&] {\n                        return plan.template run<Clock>(*cfg, env);\n                    });\n\n                    auto analysis = Detail::analyse(*cfg, env, samples.begin(), samples.end());\n                    BenchmarkStats<FloatDuration<Clock>> stats{ info, analysis.samples, analysis.mean, analysis.standard_deviation, analysis.outliers, analysis.outlier_variance };\n                    getResultCapture().benchmarkEnded(stats);\n\n                } CATCH_CATCH_ALL{\n                    if (translateActiveException() != Detail::benchmarkErrorMsg) // benchmark errors have been reported, otherwise rethrow.\n                        std::rethrow_exception(std::current_exception());\n                }\n            }\n\n            // sets lambda to be used in fun *and* executes benchmark!\n            template <typename Fun,\n                typename std::enable_if<!Detail::is_related<Fun, Benchmark>::value, int>::type = 0>\n                Benchmark & operator=(Fun func) {\n                fun = Detail::BenchmarkFunction(func);\n                run();\n                return *this;\n            }\n\n            explicit operator bool() {\n                return true;\n            }\n\n        private:\n            Detail::BenchmarkFunction fun;\n            std::string name;\n        };\n    }\n} // namespace Catch\n\n#define INTERNAL_CATCH_GET_1_ARG(arg1, arg2, ...) arg1\n#define INTERNAL_CATCH_GET_2_ARG(arg1, arg2, ...) arg2\n\n#define INTERNAL_CATCH_BENCHMARK(BenchmarkName, name, benchmarkIndex)\\\n    if( Catch::Benchmark::Benchmark BenchmarkName{name} ) \\\n        BenchmarkName = [&](int benchmarkIndex)\n\n#define INTERNAL_CATCH_BENCHMARK_ADVANCED(BenchmarkName, name)\\\n    if( Catch::Benchmark::Benchmark BenchmarkName{name} ) \\\n        BenchmarkName = [&]\n\n// end catch_benchmark.hpp\n// start catch_constructor.hpp\n\n// Constructor and destructor helpers\n\n\n#include <type_traits>\n\nnamespace Catch {\n    namespace Benchmark {\n        namespace Detail {\n            template <typename T, bool Destruct>\n            struct ObjectStorage\n            {\n                using TStorage = typename std::aligned_storage<sizeof(T), std::alignment_of<T>::value>::type;\n\n                ObjectStorage() : data() {}\n\n                ObjectStorage(const ObjectStorage& other)\n                {\n                    new(&data) T(other.stored_object());\n                }\n\n                ObjectStorage(ObjectStorage&& other)\n                {\n                    new(&data) T(std::move(other.stored_object()));\n                }\n\n                ~ObjectStorage() { destruct_on_exit<T>(); }\n\n                template <typename... Args>\n                void construct(Args&&... args)\n                {\n                    new (&data) T(std::forward<Args>(args)...);\n                }\n\n                template <bool AllowManualDestruction = !Destruct>\n                typename std::enable_if<AllowManualDestruction>::type destruct()\n                {\n                    stored_object().~T();\n                }\n\n            private:\n                // If this is a constructor benchmark, destruct the underlying object\n                template <typename U>\n                void destruct_on_exit(typename std::enable_if<Destruct, U>::type* = 0) { destruct<true>(); }\n                // Otherwise, don't\n                template <typename U>\n                void destruct_on_exit(typename std::enable_if<!Destruct, U>::type* = 0) { }\n\n                T& stored_object() {\n                    return *static_cast<T*>(static_cast<void*>(&data));\n                }\n\n                T const& stored_object() const {\n                    return *static_cast<T*>(static_cast<void*>(&data));\n                }\n\n                TStorage data;\n            };\n        }\n\n        template <typename T>\n        using storage_for = Detail::ObjectStorage<T, true>;\n\n        template <typename T>\n        using destructable_object = Detail::ObjectStorage<T, false>;\n    }\n}\n\n// end catch_constructor.hpp\n// end catch_benchmarking_all.hpp\n#endif\n\n#endif // ! CATCH_CONFIG_IMPL_ONLY\n\n#ifdef CATCH_IMPL\n// start catch_impl.hpp\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wweak-vtables\"\n#endif\n\n// Keep these here for external reporters\n// start catch_test_case_tracker.h\n\n#include <string>\n#include <vector>\n#include <memory>\n\nnamespace Catch {\nnamespace TestCaseTracking {\n\n    struct NameAndLocation {\n        std::string name;\n        SourceLineInfo location;\n\n        NameAndLocation( std::string const& _name, SourceLineInfo const& _location );\n        friend bool operator==(NameAndLocation const& lhs, NameAndLocation const& rhs) {\n            return lhs.name == rhs.name\n                && lhs.location == rhs.location;\n        }\n    };\n\n    class ITracker;\n\n    using ITrackerPtr = std::shared_ptr<ITracker>;\n\n    class  ITracker {\n        NameAndLocation m_nameAndLocation;\n\n    public:\n        ITracker(NameAndLocation const& nameAndLoc) :\n            m_nameAndLocation(nameAndLoc)\n        {}\n\n        // static queries\n        NameAndLocation const& nameAndLocation() const {\n            return m_nameAndLocation;\n        }\n\n        virtual ~ITracker();\n\n        // dynamic queries\n        virtual bool isComplete() const = 0; // Successfully completed or failed\n        virtual bool isSuccessfullyCompleted() const = 0;\n        virtual bool isOpen() const = 0; // Started but not complete\n        virtual bool hasChildren() const = 0;\n        virtual bool hasStarted() const = 0;\n\n        virtual ITracker& parent() = 0;\n\n        // actions\n        virtual void close() = 0; // Successfully complete\n        virtual void fail() = 0;\n        virtual void markAsNeedingAnotherRun() = 0;\n\n        virtual void addChild( ITrackerPtr const& child ) = 0;\n        virtual ITrackerPtr findChild( NameAndLocation const& nameAndLocation ) = 0;\n        virtual void openChild() = 0;\n\n        // Debug/ checking\n        virtual bool isSectionTracker() const = 0;\n        virtual bool isGeneratorTracker() const = 0;\n    };\n\n    class TrackerContext {\n\n        enum RunState {\n            NotStarted,\n            Executing,\n            CompletedCycle\n        };\n\n        ITrackerPtr m_rootTracker;\n        ITracker* m_currentTracker = nullptr;\n        RunState m_runState = NotStarted;\n\n    public:\n\n        ITracker& startRun();\n        void endRun();\n\n        void startCycle();\n        void completeCycle();\n\n        bool completedCycle() const;\n        ITracker& currentTracker();\n        void setCurrentTracker( ITracker* tracker );\n    };\n\n    class TrackerBase : public ITracker {\n    protected:\n        enum CycleState {\n            NotStarted,\n            Executing,\n            ExecutingChildren,\n            NeedsAnotherRun,\n            CompletedSuccessfully,\n            Failed\n        };\n\n        using Children = std::vector<ITrackerPtr>;\n        TrackerContext& m_ctx;\n        ITracker* m_parent;\n        Children m_children;\n        CycleState m_runState = NotStarted;\n\n    public:\n        TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent );\n\n        bool isComplete() const override;\n        bool isSuccessfullyCompleted() const override;\n        bool isOpen() const override;\n        bool hasChildren() const override;\n        bool hasStarted() const override {\n            return m_runState != NotStarted;\n        }\n\n        void addChild( ITrackerPtr const& child ) override;\n\n        ITrackerPtr findChild( NameAndLocation const& nameAndLocation ) override;\n        ITracker& parent() override;\n\n        void openChild() override;\n\n        bool isSectionTracker() const override;\n        bool isGeneratorTracker() const override;\n\n        void open();\n\n        void close() override;\n        void fail() override;\n        void markAsNeedingAnotherRun() override;\n\n    private:\n        void moveToParent();\n        void moveToThis();\n    };\n\n    class SectionTracker : public TrackerBase {\n        std::vector<std::string> m_filters;\n        std::string m_trimmed_name;\n    public:\n        SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent );\n\n        bool isSectionTracker() const override;\n\n        bool isComplete() const override;\n\n        static SectionTracker& acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation );\n\n        void tryOpen();\n\n        void addInitialFilters( std::vector<std::string> const& filters );\n        void addNextFilters( std::vector<std::string> const& filters );\n    };\n\n} // namespace TestCaseTracking\n\nusing TestCaseTracking::ITracker;\nusing TestCaseTracking::TrackerContext;\nusing TestCaseTracking::SectionTracker;\n\n} // namespace Catch\n\n// end catch_test_case_tracker.h\n\n// start catch_leak_detector.h\n\nnamespace Catch {\n\n    struct LeakDetector {\n        LeakDetector();\n        ~LeakDetector();\n    };\n\n}\n// end catch_leak_detector.h\n// Cpp files will be included in the single-header file here\n// start catch_stats.cpp\n\n// Statistical analysis tools\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n\n#include <cassert>\n#include <random>\n\n#if defined(CATCH_CONFIG_USE_ASYNC)\n#include <future>\n#endif\n\nnamespace {\n    double erf_inv(double x) {\n        // Code accompanying the article \"Approximating the erfinv function\" in GPU Computing Gems, Volume 2\n        double w, p;\n\n        w = -log((1.0 - x) * (1.0 + x));\n\n        if (w < 6.250000) {\n            w = w - 3.125000;\n            p = -3.6444120640178196996e-21;\n            p = -1.685059138182016589e-19 + p * w;\n            p = 1.2858480715256400167e-18 + p * w;\n            p = 1.115787767802518096e-17 + p * w;\n            p = -1.333171662854620906e-16 + p * w;\n            p = 2.0972767875968561637e-17 + p * w;\n            p = 6.6376381343583238325e-15 + p * w;\n            p = -4.0545662729752068639e-14 + p * w;\n            p = -8.1519341976054721522e-14 + p * w;\n            p = 2.6335093153082322977e-12 + p * w;\n            p = -1.2975133253453532498e-11 + p * w;\n            p = -5.4154120542946279317e-11 + p * w;\n            p = 1.051212273321532285e-09 + p * w;\n            p = -4.1126339803469836976e-09 + p * w;\n            p = -2.9070369957882005086e-08 + p * w;\n            p = 4.2347877827932403518e-07 + p * w;\n            p = -1.3654692000834678645e-06 + p * w;\n            p = -1.3882523362786468719e-05 + p * w;\n            p = 0.0001867342080340571352 + p * w;\n            p = -0.00074070253416626697512 + p * w;\n            p = -0.0060336708714301490533 + p * w;\n            p = 0.24015818242558961693 + p * w;\n            p = 1.6536545626831027356 + p * w;\n        } else if (w < 16.000000) {\n            w = sqrt(w) - 3.250000;\n            p = 2.2137376921775787049e-09;\n            p = 9.0756561938885390979e-08 + p * w;\n            p = -2.7517406297064545428e-07 + p * w;\n            p = 1.8239629214389227755e-08 + p * w;\n            p = 1.5027403968909827627e-06 + p * w;\n            p = -4.013867526981545969e-06 + p * w;\n            p = 2.9234449089955446044e-06 + p * w;\n            p = 1.2475304481671778723e-05 + p * w;\n            p = -4.7318229009055733981e-05 + p * w;\n            p = 6.8284851459573175448e-05 + p * w;\n            p = 2.4031110387097893999e-05 + p * w;\n            p = -0.0003550375203628474796 + p * w;\n            p = 0.00095328937973738049703 + p * w;\n            p = -0.0016882755560235047313 + p * w;\n            p = 0.0024914420961078508066 + p * w;\n            p = -0.0037512085075692412107 + p * w;\n            p = 0.005370914553590063617 + p * w;\n            p = 1.0052589676941592334 + p * w;\n            p = 3.0838856104922207635 + p * w;\n        } else {\n            w = sqrt(w) - 5.000000;\n            p = -2.7109920616438573243e-11;\n            p = -2.5556418169965252055e-10 + p * w;\n            p = 1.5076572693500548083e-09 + p * w;\n            p = -3.7894654401267369937e-09 + p * w;\n            p = 7.6157012080783393804e-09 + p * w;\n            p = -1.4960026627149240478e-08 + p * w;\n            p = 2.9147953450901080826e-08 + p * w;\n            p = -6.7711997758452339498e-08 + p * w;\n            p = 2.2900482228026654717e-07 + p * w;\n            p = -9.9298272942317002539e-07 + p * w;\n            p = 4.5260625972231537039e-06 + p * w;\n            p = -1.9681778105531670567e-05 + p * w;\n            p = 7.5995277030017761139e-05 + p * w;\n            p = -0.00021503011930044477347 + p * w;\n            p = -0.00013871931833623122026 + p * w;\n            p = 1.0103004648645343977 + p * w;\n            p = 4.8499064014085844221 + p * w;\n        }\n        return p * x;\n    }\n\n    double standard_deviation(std::vector<double>::iterator first, std::vector<double>::iterator last) {\n        auto m = Catch::Benchmark::Detail::mean(first, last);\n        double variance = std::accumulate(first, last, 0., [m](double a, double b) {\n            double diff = b - m;\n            return a + diff * diff;\n            }) / (last - first);\n            return std::sqrt(variance);\n    }\n\n}\n\nnamespace Catch {\n    namespace Benchmark {\n        namespace Detail {\n\n            double weighted_average_quantile(int k, int q, std::vector<double>::iterator first, std::vector<double>::iterator last) {\n                auto count = last - first;\n                double idx = (count - 1) * k / static_cast<double>(q);\n                int j = static_cast<int>(idx);\n                double g = idx - j;\n                std::nth_element(first, first + j, last);\n                auto xj = first[j];\n                if (g == 0) return xj;\n\n                auto xj1 = *std::min_element(first + (j + 1), last);\n                return xj + g * (xj1 - xj);\n            }\n\n            double erfc_inv(double x) {\n                return erf_inv(1.0 - x);\n            }\n\n            double normal_quantile(double p) {\n                static const double ROOT_TWO = std::sqrt(2.0);\n\n                double result = 0.0;\n                assert(p >= 0 && p <= 1);\n                if (p < 0 || p > 1) {\n                    return result;\n                }\n\n                result = -erfc_inv(2.0 * p);\n                // result *= normal distribution standard deviation (1.0) * sqrt(2)\n                result *= /*sd * */ ROOT_TWO;\n                // result += normal disttribution mean (0)\n                return result;\n            }\n\n            double outlier_variance(Estimate<double> mean, Estimate<double> stddev, int n) {\n                double sb = stddev.point;\n                double mn = mean.point / n;\n                double mg_min = mn / 2.;\n                double sg = std::min(mg_min / 4., sb / std::sqrt(n));\n                double sg2 = sg * sg;\n                double sb2 = sb * sb;\n\n                auto c_max = [n, mn, sb2, sg2](double x) -> double {\n                    double k = mn - x;\n                    double d = k * k;\n                    double nd = n * d;\n                    double k0 = -n * nd;\n                    double k1 = sb2 - n * sg2 + nd;\n                    double det = k1 * k1 - 4 * sg2 * k0;\n                    return (int)(-2. * k0 / (k1 + std::sqrt(det)));\n                };\n\n                auto var_out = [n, sb2, sg2](double c) {\n                    double nc = n - c;\n                    return (nc / n) * (sb2 - nc * sg2);\n                };\n\n                return std::min(var_out(1), var_out(std::min(c_max(0.), c_max(mg_min)))) / sb2;\n            }\n\n            bootstrap_analysis analyse_samples(double confidence_level, int n_resamples, std::vector<double>::iterator first, std::vector<double>::iterator last) {\n                CATCH_INTERNAL_START_WARNINGS_SUPPRESSION\n                CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS\n                static std::random_device entropy;\n                CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION\n\n                auto n = static_cast<int>(last - first); // seriously, one can't use integral types without hell in C++\n\n                auto mean = &Detail::mean<std::vector<double>::iterator>;\n                auto stddev = &standard_deviation;\n\n#if defined(CATCH_CONFIG_USE_ASYNC)\n                auto Estimate = [=](double(*f)(std::vector<double>::iterator, std::vector<double>::iterator)) {\n                    auto seed = entropy();\n                    return std::async(std::launch::async, [=] {\n                        std::mt19937 rng(seed);\n                        auto resampled = resample(rng, n_resamples, first, last, f);\n                        return bootstrap(confidence_level, first, last, resampled, f);\n                    });\n                };\n\n                auto mean_future = Estimate(mean);\n                auto stddev_future = Estimate(stddev);\n\n                auto mean_estimate = mean_future.get();\n                auto stddev_estimate = stddev_future.get();\n#else\n                auto Estimate = [=](double(*f)(std::vector<double>::iterator, std::vector<double>::iterator)) {\n                    auto seed = entropy();\n                    std::mt19937 rng(seed);\n                    auto resampled = resample(rng, n_resamples, first, last, f);\n                    return bootstrap(confidence_level, first, last, resampled, f);\n                };\n\n                auto mean_estimate = Estimate(mean);\n                auto stddev_estimate = Estimate(stddev);\n#endif // CATCH_USE_ASYNC\n\n                double outlier_variance = Detail::outlier_variance(mean_estimate, stddev_estimate, n);\n\n                return { mean_estimate, stddev_estimate, outlier_variance };\n            }\n        } // namespace Detail\n    } // namespace Benchmark\n} // namespace Catch\n\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n// end catch_stats.cpp\n// start catch_approx.cpp\n\n#include <cmath>\n#include <limits>\n\nnamespace {\n\n// Performs equivalent check of std::fabs(lhs - rhs) <= margin\n// But without the subtraction to allow for INFINITY in comparison\nbool marginComparison(double lhs, double rhs, double margin) {\n    return (lhs + margin >= rhs) && (rhs + margin >= lhs);\n}\n\n}\n\nnamespace Catch {\nnamespace Detail {\n\n    Approx::Approx ( double value )\n    :   m_epsilon( std::numeric_limits<float>::epsilon()*100 ),\n        m_margin( 0.0 ),\n        m_scale( 0.0 ),\n        m_value( value )\n    {}\n\n    Approx Approx::custom() {\n        return Approx( 0 );\n    }\n\n    Approx Approx::operator-() const {\n        auto temp(*this);\n        temp.m_value = -temp.m_value;\n        return temp;\n    }\n\n    std::string Approx::toString() const {\n        ReusableStringStream rss;\n        rss << \"Approx( \" << ::Catch::Detail::stringify( m_value ) << \" )\";\n        return rss.str();\n    }\n\n    bool Approx::equalityComparisonImpl(const double other) const {\n        // First try with fixed margin, then compute margin based on epsilon, scale and Approx's value\n        // Thanks to Richard Harris for his help refining the scaled margin value\n        return marginComparison(m_value, other, m_margin)\n            || marginComparison(m_value, other, m_epsilon * (m_scale + std::fabs(std::isinf(m_value)? 0 : m_value)));\n    }\n\n    void Approx::setMargin(double newMargin) {\n        CATCH_ENFORCE(newMargin >= 0,\n            \"Invalid Approx::margin: \" << newMargin << '.'\n            << \" Approx::Margin has to be non-negative.\");\n        m_margin = newMargin;\n    }\n\n    void Approx::setEpsilon(double newEpsilon) {\n        CATCH_ENFORCE(newEpsilon >= 0 && newEpsilon <= 1.0,\n            \"Invalid Approx::epsilon: \" << newEpsilon << '.'\n            << \" Approx::epsilon has to be in [0, 1]\");\n        m_epsilon = newEpsilon;\n    }\n\n} // end namespace Detail\n\nnamespace literals {\n    Detail::Approx operator \"\" _a(long double val) {\n        return Detail::Approx(val);\n    }\n    Detail::Approx operator \"\" _a(unsigned long long val) {\n        return Detail::Approx(val);\n    }\n} // end namespace literals\n\nstd::string StringMaker<Catch::Detail::Approx>::convert(Catch::Detail::Approx const& value) {\n    return value.toString();\n}\n\n} // end namespace Catch\n// end catch_approx.cpp\n// start catch_assertionhandler.cpp\n\n// start catch_debugger.h\n\nnamespace Catch {\n    bool isDebuggerActive();\n}\n\n#ifdef CATCH_PLATFORM_MAC\n\n    #if defined(__i386__) || defined(__x86_64__)\n        #define CATCH_TRAP() __asm__(\"int $3\\n\" : : ) /* NOLINT */\n    #elif defined(__aarch64__)\n        #define CATCH_TRAP()  __asm__(\".inst 0xd4200000\")\n    #endif\n\n#elif defined(CATCH_PLATFORM_IPHONE)\n\n    // use inline assembler\n    #if defined(__i386__) || defined(__x86_64__)\n        #define CATCH_TRAP()  __asm__(\"int $3\")\n    #elif defined(__aarch64__)\n        #define CATCH_TRAP()  __asm__(\".inst 0xd4200000\")\n    #elif defined(__arm__) && !defined(__thumb__)\n        #define CATCH_TRAP()  __asm__(\".inst 0xe7f001f0\")\n    #elif defined(__arm__) &&  defined(__thumb__)\n        #define CATCH_TRAP()  __asm__(\".inst 0xde01\")\n    #endif\n\n#elif defined(CATCH_PLATFORM_LINUX)\n    // If we can use inline assembler, do it because this allows us to break\n    // directly at the location of the failing check instead of breaking inside\n    // raise() called from it, i.e. one stack frame below.\n    #if defined(__GNUC__) && (defined(__i386) || defined(__x86_64))\n        #define CATCH_TRAP() asm volatile (\"int $3\") /* NOLINT */\n    #else // Fall back to the generic way.\n        #include <signal.h>\n\n        #define CATCH_TRAP() raise(SIGTRAP)\n    #endif\n#elif defined(_MSC_VER)\n    #define CATCH_TRAP() __debugbreak()\n#elif defined(__MINGW32__)\n    extern \"C\" __declspec(dllimport) void __stdcall DebugBreak();\n    #define CATCH_TRAP() DebugBreak()\n#endif\n\n#ifndef CATCH_BREAK_INTO_DEBUGGER\n    #ifdef CATCH_TRAP\n        #define CATCH_BREAK_INTO_DEBUGGER() []{ if( Catch::isDebuggerActive() ) { CATCH_TRAP(); } }()\n    #else\n        #define CATCH_BREAK_INTO_DEBUGGER() []{}()\n    #endif\n#endif\n\n// end catch_debugger.h\n// start catch_run_context.h\n\n// start catch_fatal_condition.h\n\n// start catch_windows_h_proxy.h\n\n\n#if defined(CATCH_PLATFORM_WINDOWS)\n\n#if !defined(NOMINMAX) && !defined(CATCH_CONFIG_NO_NOMINMAX)\n#  define CATCH_DEFINED_NOMINMAX\n#  define NOMINMAX\n#endif\n#if !defined(WIN32_LEAN_AND_MEAN) && !defined(CATCH_CONFIG_NO_WIN32_LEAN_AND_MEAN)\n#  define CATCH_DEFINED_WIN32_LEAN_AND_MEAN\n#  define WIN32_LEAN_AND_MEAN\n#endif\n\n#ifdef __AFXDLL\n#include <AfxWin.h>\n#else\n#include <windows.h>\n#endif\n\n#ifdef CATCH_DEFINED_NOMINMAX\n#  undef NOMINMAX\n#endif\n#ifdef CATCH_DEFINED_WIN32_LEAN_AND_MEAN\n#  undef WIN32_LEAN_AND_MEAN\n#endif\n\n#endif // defined(CATCH_PLATFORM_WINDOWS)\n\n// end catch_windows_h_proxy.h\n#if defined( CATCH_CONFIG_WINDOWS_SEH )\n\nnamespace Catch {\n\n    struct FatalConditionHandler {\n\n        static LONG CALLBACK handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo);\n        FatalConditionHandler();\n        static void reset();\n        ~FatalConditionHandler();\n\n    private:\n        static bool isSet;\n        static ULONG guaranteeSize;\n        static PVOID exceptionHandlerHandle;\n    };\n\n} // namespace Catch\n\n#elif defined ( CATCH_CONFIG_POSIX_SIGNALS )\n\n#include <signal.h>\n\nnamespace Catch {\n\n    struct FatalConditionHandler {\n\n        static bool isSet;\n        static struct sigaction oldSigActions[];\n        static stack_t oldSigStack;\n        static char altStackMem[];\n\n        static void handleSignal( int sig );\n\n        FatalConditionHandler();\n        ~FatalConditionHandler();\n        static void reset();\n    };\n\n} // namespace Catch\n\n#else\n\nnamespace Catch {\n    struct FatalConditionHandler {\n        void reset();\n    };\n}\n\n#endif\n\n// end catch_fatal_condition.h\n#include <string>\n\nnamespace Catch {\n\n    struct IMutableContext;\n\n    ///////////////////////////////////////////////////////////////////////////\n\n    class RunContext : public IResultCapture, public IRunner {\n\n    public:\n        RunContext( RunContext const& ) = delete;\n        RunContext& operator =( RunContext const& ) = delete;\n\n        explicit RunContext( IConfigPtr const& _config, IStreamingReporterPtr&& reporter );\n\n        ~RunContext() override;\n\n        void testGroupStarting( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount );\n        void testGroupEnded( std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount );\n\n        Totals runTest(TestCase const& testCase);\n\n        IConfigPtr config() const;\n        IStreamingReporter& reporter() const;\n\n    public: // IResultCapture\n\n        // Assertion handlers\n        void handleExpr\n                (   AssertionInfo const& info,\n                    ITransientExpression const& expr,\n                    AssertionReaction& reaction ) override;\n        void handleMessage\n                (   AssertionInfo const& info,\n                    ResultWas::OfType resultType,\n                    StringRef const& message,\n                    AssertionReaction& reaction ) override;\n        void handleUnexpectedExceptionNotThrown\n                (   AssertionInfo const& info,\n                    AssertionReaction& reaction ) override;\n        void handleUnexpectedInflightException\n                (   AssertionInfo const& info,\n                    std::string const& message,\n                    AssertionReaction& reaction ) override;\n        void handleIncomplete\n                (   AssertionInfo const& info ) override;\n        void handleNonExpr\n                (   AssertionInfo const &info,\n                    ResultWas::OfType resultType,\n                    AssertionReaction &reaction ) override;\n\n        bool sectionStarted( SectionInfo const& sectionInfo, Counts& assertions ) override;\n\n        void sectionEnded( SectionEndInfo const& endInfo ) override;\n        void sectionEndedEarly( SectionEndInfo const& endInfo ) override;\n\n        auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& override;\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n        void benchmarkPreparing( std::string const& name ) override;\n        void benchmarkStarting( BenchmarkInfo const& info ) override;\n        void benchmarkEnded( BenchmarkStats<> const& stats ) override;\n        void benchmarkFailed( std::string const& error ) override;\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\n        void pushScopedMessage( MessageInfo const& message ) override;\n        void popScopedMessage( MessageInfo const& message ) override;\n\n        void emplaceUnscopedMessage( MessageBuilder const& builder ) override;\n\n        std::string getCurrentTestName() const override;\n\n        const AssertionResult* getLastResult() const override;\n\n        void exceptionEarlyReported() override;\n\n        void handleFatalErrorCondition( StringRef message ) override;\n\n        bool lastAssertionPassed() override;\n\n        void assertionPassed() override;\n\n    public:\n        // !TBD We need to do this another way!\n        bool aborting() const final;\n\n    private:\n\n        void runCurrentTest( std::string& redirectedCout, std::string& redirectedCerr );\n        void invokeActiveTestCase();\n\n        void resetAssertionInfo();\n        bool testForMissingAssertions( Counts& assertions );\n\n        void assertionEnded( AssertionResult const& result );\n        void reportExpr\n                (   AssertionInfo const &info,\n                    ResultWas::OfType resultType,\n                    ITransientExpression const *expr,\n                    bool negated );\n\n        void populateReaction( AssertionReaction& reaction );\n\n    private:\n\n        void handleUnfinishedSections();\n\n        TestRunInfo m_runInfo;\n        IMutableContext& m_context;\n        TestCase const* m_activeTestCase = nullptr;\n        ITracker* m_testCaseTracker = nullptr;\n        Option<AssertionResult> m_lastResult;\n\n        IConfigPtr m_config;\n        Totals m_totals;\n        IStreamingReporterPtr m_reporter;\n        std::vector<MessageInfo> m_messages;\n        std::vector<ScopedMessage> m_messageScopes; /* Keeps owners of so-called unscoped messages. */\n        AssertionInfo m_lastAssertionInfo;\n        std::vector<SectionEndInfo> m_unfinishedSections;\n        std::vector<ITracker*> m_activeSections;\n        TrackerContext m_trackerContext;\n        bool m_lastAssertionPassed = false;\n        bool m_shouldReportUnexpected = true;\n        bool m_includeSuccessfulResults;\n    };\n\n    void seedRng(IConfig const& config);\n    unsigned int rngSeed();\n} // end namespace Catch\n\n// end catch_run_context.h\nnamespace Catch {\n\n    namespace {\n        auto operator <<( std::ostream& os, ITransientExpression const& expr ) -> std::ostream& {\n            expr.streamReconstructedExpression( os );\n            return os;\n        }\n    }\n\n    LazyExpression::LazyExpression( bool isNegated )\n    :   m_isNegated( isNegated )\n    {}\n\n    LazyExpression::LazyExpression( LazyExpression const& other ) : m_isNegated( other.m_isNegated ) {}\n\n    LazyExpression::operator bool() const {\n        return m_transientExpression != nullptr;\n    }\n\n    auto operator << ( std::ostream& os, LazyExpression const& lazyExpr ) -> std::ostream& {\n        if( lazyExpr.m_isNegated )\n            os << \"!\";\n\n        if( lazyExpr ) {\n            if( lazyExpr.m_isNegated && lazyExpr.m_transientExpression->isBinaryExpression() )\n                os << \"(\" << *lazyExpr.m_transientExpression << \")\";\n            else\n                os << *lazyExpr.m_transientExpression;\n        }\n        else {\n            os << \"{** error - unchecked empty expression requested **}\";\n        }\n        return os;\n    }\n\n    AssertionHandler::AssertionHandler\n        (   StringRef const& macroName,\n            SourceLineInfo const& lineInfo,\n            StringRef capturedExpression,\n            ResultDisposition::Flags resultDisposition )\n    :   m_assertionInfo{ macroName, lineInfo, capturedExpression, resultDisposition },\n        m_resultCapture( getResultCapture() )\n    {}\n\n    void AssertionHandler::handleExpr( ITransientExpression const& expr ) {\n        m_resultCapture.handleExpr( m_assertionInfo, expr, m_reaction );\n    }\n    void AssertionHandler::handleMessage(ResultWas::OfType resultType, StringRef const& message) {\n        m_resultCapture.handleMessage( m_assertionInfo, resultType, message, m_reaction );\n    }\n\n    auto AssertionHandler::allowThrows() const -> bool {\n        return getCurrentContext().getConfig()->allowThrows();\n    }\n\n    void AssertionHandler::complete() {\n        setCompleted();\n        if( m_reaction.shouldDebugBreak ) {\n\n            // If you find your debugger stopping you here then go one level up on the\n            // call-stack for the code that caused it (typically a failed assertion)\n\n            // (To go back to the test and change execution, jump over the throw, next)\n            CATCH_BREAK_INTO_DEBUGGER();\n        }\n        if (m_reaction.shouldThrow) {\n#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)\n            throw Catch::TestFailureException();\n#else\n            CATCH_ERROR( \"Test failure requires aborting test!\" );\n#endif\n        }\n    }\n    void AssertionHandler::setCompleted() {\n        m_completed = true;\n    }\n\n    void AssertionHandler::handleUnexpectedInflightException() {\n        m_resultCapture.handleUnexpectedInflightException( m_assertionInfo, Catch::translateActiveException(), m_reaction );\n    }\n\n    void AssertionHandler::handleExceptionThrownAsExpected() {\n        m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction);\n    }\n    void AssertionHandler::handleExceptionNotThrownAsExpected() {\n        m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction);\n    }\n\n    void AssertionHandler::handleUnexpectedExceptionNotThrown() {\n        m_resultCapture.handleUnexpectedExceptionNotThrown( m_assertionInfo, m_reaction );\n    }\n\n    void AssertionHandler::handleThrowingCallSkipped() {\n        m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction);\n    }\n\n    // This is the overload that takes a string and infers the Equals matcher from it\n    // The more general overload, that takes any string matcher, is in catch_capture_matchers.cpp\n    void handleExceptionMatchExpr( AssertionHandler& handler, std::string const& str, StringRef const& matcherString  ) {\n        handleExceptionMatchExpr( handler, Matchers::Equals( str ), matcherString );\n    }\n\n} // namespace Catch\n// end catch_assertionhandler.cpp\n// start catch_assertionresult.cpp\n\nnamespace Catch {\n    AssertionResultData::AssertionResultData(ResultWas::OfType _resultType, LazyExpression const & _lazyExpression):\n        lazyExpression(_lazyExpression),\n        resultType(_resultType) {}\n\n    std::string AssertionResultData::reconstructExpression() const {\n\n        if( reconstructedExpression.empty() ) {\n            if( lazyExpression ) {\n                ReusableStringStream rss;\n                rss << lazyExpression;\n                reconstructedExpression = rss.str();\n            }\n        }\n        return reconstructedExpression;\n    }\n\n    AssertionResult::AssertionResult( AssertionInfo const& info, AssertionResultData const& data )\n    :   m_info( info ),\n        m_resultData( data )\n    {}\n\n    // Result was a success\n    bool AssertionResult::succeeded() const {\n        return Catch::isOk( m_resultData.resultType );\n    }\n\n    // Result was a success, or failure is suppressed\n    bool AssertionResult::isOk() const {\n        return Catch::isOk( m_resultData.resultType ) || shouldSuppressFailure( m_info.resultDisposition );\n    }\n\n    ResultWas::OfType AssertionResult::getResultType() const {\n        return m_resultData.resultType;\n    }\n\n    bool AssertionResult::hasExpression() const {\n        return !m_info.capturedExpression.empty();\n    }\n\n    bool AssertionResult::hasMessage() const {\n        return !m_resultData.message.empty();\n    }\n\n    std::string AssertionResult::getExpression() const {\n        // Possibly overallocating by 3 characters should be basically free\n        std::string expr; expr.reserve(m_info.capturedExpression.size() + 3);\n        if (isFalseTest(m_info.resultDisposition)) {\n            expr += \"!(\";\n        }\n        expr += m_info.capturedExpression;\n        if (isFalseTest(m_info.resultDisposition)) {\n            expr += ')';\n        }\n        return expr;\n    }\n\n    std::string AssertionResult::getExpressionInMacro() const {\n        std::string expr;\n        if( m_info.macroName.empty() )\n            expr = static_cast<std::string>(m_info.capturedExpression);\n        else {\n            expr.reserve( m_info.macroName.size() + m_info.capturedExpression.size() + 4 );\n            expr += m_info.macroName;\n            expr += \"( \";\n            expr += m_info.capturedExpression;\n            expr += \" )\";\n        }\n        return expr;\n    }\n\n    bool AssertionResult::hasExpandedExpression() const {\n        return hasExpression() && getExpandedExpression() != getExpression();\n    }\n\n    std::string AssertionResult::getExpandedExpression() const {\n        std::string expr = m_resultData.reconstructExpression();\n        return expr.empty()\n                ? getExpression()\n                : expr;\n    }\n\n    std::string AssertionResult::getMessage() const {\n        return m_resultData.message;\n    }\n    SourceLineInfo AssertionResult::getSourceInfo() const {\n        return m_info.lineInfo;\n    }\n\n    StringRef AssertionResult::getTestMacroName() const {\n        return m_info.macroName;\n    }\n\n} // end namespace Catch\n// end catch_assertionresult.cpp\n// start catch_capture_matchers.cpp\n\nnamespace Catch {\n\n    using StringMatcher = Matchers::Impl::MatcherBase<std::string>;\n\n    // This is the general overload that takes a any string matcher\n    // There is another overload, in catch_assertionhandler.h/.cpp, that only takes a string and infers\n    // the Equals matcher (so the header does not mention matchers)\n    void handleExceptionMatchExpr( AssertionHandler& handler, StringMatcher const& matcher, StringRef const& matcherString  ) {\n        std::string exceptionMessage = Catch::translateActiveException();\n        MatchExpr<std::string, StringMatcher const&> expr( exceptionMessage, matcher, matcherString );\n        handler.handleExpr( expr );\n    }\n\n} // namespace Catch\n// end catch_capture_matchers.cpp\n// start catch_commandline.cpp\n\n// start catch_commandline.h\n\n// start catch_clara.h\n\n// Use Catch's value for console width (store Clara's off to the side, if present)\n#ifdef CLARA_CONFIG_CONSOLE_WIDTH\n#define CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH\n#undef CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH\n#endif\n#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH-1\n\n#ifdef __clang__\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wweak-vtables\"\n#pragma clang diagnostic ignored \"-Wexit-time-destructors\"\n#pragma clang diagnostic ignored \"-Wshadow\"\n#endif\n\n// start clara.hpp\n// Copyright 2017 Two Blue Cubes Ltd. All rights reserved.\n//\n// Distributed under the Boost Software License, Version 1.0. (See accompanying\n// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n// See https://github.com/philsquared/Clara for more details\n\n// Clara v1.1.5\n\n\n#ifndef CATCH_CLARA_CONFIG_CONSOLE_WIDTH\n#define CATCH_CLARA_CONFIG_CONSOLE_WIDTH 80\n#endif\n\n#ifndef CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH\n#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH CATCH_CLARA_CONFIG_CONSOLE_WIDTH\n#endif\n\n#ifndef CLARA_CONFIG_OPTIONAL_TYPE\n#ifdef __has_include\n#if __has_include(<optional>) && __cplusplus >= 201703L\n#include <optional>\n#define CLARA_CONFIG_OPTIONAL_TYPE std::optional\n#endif\n#endif\n#endif\n\n// ----------- #included from clara_textflow.hpp -----------\n\n// TextFlowCpp\n//\n// A single-header library for wrapping and laying out basic text, by Phil Nash\n//\n// Distributed under the Boost Software License, Version 1.0. (See accompanying\n// file LICENSE.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n// This project is hosted at https://github.com/philsquared/textflowcpp\n\n\n#include <cassert>\n#include <ostream>\n#include <sstream>\n#include <vector>\n\n#ifndef CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH\n#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH 80\n#endif\n\nnamespace Catch {\nnamespace clara {\nnamespace TextFlow {\n\ninline auto isWhitespace(char c) -> bool {\n\tstatic std::string chars = \" \\t\\n\\r\";\n\treturn chars.find(c) != std::string::npos;\n}\ninline auto isBreakableBefore(char c) -> bool {\n\tstatic std::string chars = \"[({<|\";\n\treturn chars.find(c) != std::string::npos;\n}\ninline auto isBreakableAfter(char c) -> bool {\n\tstatic std::string chars = \"])}>.,:;*+-=&/\\\\\";\n\treturn chars.find(c) != std::string::npos;\n}\n\nclass Columns;\n\nclass Column {\n\tstd::vector<std::string> m_strings;\n\tsize_t m_width = CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH;\n\tsize_t m_indent = 0;\n\tsize_t m_initialIndent = std::string::npos;\n\npublic:\n\tclass iterator {\n\t\tfriend Column;\n\n\t\tColumn const& m_column;\n\t\tsize_t m_stringIndex = 0;\n\t\tsize_t m_pos = 0;\n\n\t\tsize_t m_len = 0;\n\t\tsize_t m_end = 0;\n\t\tbool m_suffix = false;\n\n\t\titerator(Column const& column, size_t stringIndex)\n\t\t\t: m_column(column),\n\t\t\tm_stringIndex(stringIndex) {}\n\n\t\tauto line() const -> std::string const& { return m_column.m_strings[m_stringIndex]; }\n\n\t\tauto isBoundary(size_t at) const -> bool {\n\t\t\tassert(at > 0);\n\t\t\tassert(at <= line().size());\n\n\t\t\treturn at == line().size() ||\n\t\t\t\t(isWhitespace(line()[at]) && !isWhitespace(line()[at - 1])) ||\n\t\t\t\tisBreakableBefore(line()[at]) ||\n\t\t\t\tisBreakableAfter(line()[at - 1]);\n\t\t}\n\n\t\tvoid calcLength() {\n\t\t\tassert(m_stringIndex < m_column.m_strings.size());\n\n\t\t\tm_suffix = false;\n\t\t\tauto width = m_column.m_width - indent();\n\t\t\tm_end = m_pos;\n\t\t\tif (line()[m_pos] == '\\n') {\n\t\t\t\t++m_end;\n\t\t\t}\n\t\t\twhile (m_end < line().size() && line()[m_end] != '\\n')\n\t\t\t\t++m_end;\n\n\t\t\tif (m_end < m_pos + width) {\n\t\t\t\tm_len = m_end - m_pos;\n\t\t\t} else {\n\t\t\t\tsize_t len = width;\n\t\t\t\twhile (len > 0 && !isBoundary(m_pos + len))\n\t\t\t\t\t--len;\n\t\t\t\twhile (len > 0 && isWhitespace(line()[m_pos + len - 1]))\n\t\t\t\t\t--len;\n\n\t\t\t\tif (len > 0) {\n\t\t\t\t\tm_len = len;\n\t\t\t\t} else {\n\t\t\t\t\tm_suffix = true;\n\t\t\t\t\tm_len = width - 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tauto indent() const -> size_t {\n\t\t\tauto initial = m_pos == 0 && m_stringIndex == 0 ? m_column.m_initialIndent : std::string::npos;\n\t\t\treturn initial == std::string::npos ? m_column.m_indent : initial;\n\t\t}\n\n\t\tauto addIndentAndSuffix(std::string const &plain) const -> std::string {\n\t\t\treturn std::string(indent(), ' ') + (m_suffix ? plain + \"-\" : plain);\n\t\t}\n\n\tpublic:\n\t\tusing difference_type = std::ptrdiff_t;\n\t\tusing value_type = std::string;\n\t\tusing pointer = value_type * ;\n\t\tusing reference = value_type & ;\n\t\tusing iterator_category = std::forward_iterator_tag;\n\n\t\texplicit iterator(Column const& column) : m_column(column) {\n\t\t\tassert(m_column.m_width > m_column.m_indent);\n\t\t\tassert(m_column.m_initialIndent == std::string::npos || m_column.m_width > m_column.m_initialIndent);\n\t\t\tcalcLength();\n\t\t\tif (m_len == 0)\n\t\t\t\tm_stringIndex++; // Empty string\n\t\t}\n\n\t\tauto operator *() const -> std::string {\n\t\t\tassert(m_stringIndex < m_column.m_strings.size());\n\t\t\tassert(m_pos <= m_end);\n\t\t\treturn addIndentAndSuffix(line().substr(m_pos, m_len));\n\t\t}\n\n\t\tauto operator ++() -> iterator& {\n\t\t\tm_pos += m_len;\n\t\t\tif (m_pos < line().size() && line()[m_pos] == '\\n')\n\t\t\t\tm_pos += 1;\n\t\t\telse\n\t\t\t\twhile (m_pos < line().size() && isWhitespace(line()[m_pos]))\n\t\t\t\t\t++m_pos;\n\n\t\t\tif (m_pos == line().size()) {\n\t\t\t\tm_pos = 0;\n\t\t\t\t++m_stringIndex;\n\t\t\t}\n\t\t\tif (m_stringIndex < m_column.m_strings.size())\n\t\t\t\tcalcLength();\n\t\t\treturn *this;\n\t\t}\n\t\tauto operator ++(int) -> iterator {\n\t\t\titerator prev(*this);\n\t\t\toperator++();\n\t\t\treturn prev;\n\t\t}\n\n\t\tauto operator ==(iterator const& other) const -> bool {\n\t\t\treturn\n\t\t\t\tm_pos == other.m_pos &&\n\t\t\t\tm_stringIndex == other.m_stringIndex &&\n\t\t\t\t&m_column == &other.m_column;\n\t\t}\n\t\tauto operator !=(iterator const& other) const -> bool {\n\t\t\treturn !operator==(other);\n\t\t}\n\t};\n\tusing const_iterator = iterator;\n\n\texplicit Column(std::string const& text) { m_strings.push_back(text); }\n\n\tauto width(size_t newWidth) -> Column& {\n\t\tassert(newWidth > 0);\n\t\tm_width = newWidth;\n\t\treturn *this;\n\t}\n\tauto indent(size_t newIndent) -> Column& {\n\t\tm_indent = newIndent;\n\t\treturn *this;\n\t}\n\tauto initialIndent(size_t newIndent) -> Column& {\n\t\tm_initialIndent = newIndent;\n\t\treturn *this;\n\t}\n\n\tauto width() const -> size_t { return m_width; }\n\tauto begin() const -> iterator { return iterator(*this); }\n\tauto end() const -> iterator { return { *this, m_strings.size() }; }\n\n\tinline friend std::ostream& operator << (std::ostream& os, Column const& col) {\n\t\tbool first = true;\n\t\tfor (auto line : col) {\n\t\t\tif (first)\n\t\t\t\tfirst = false;\n\t\t\telse\n\t\t\t\tos << \"\\n\";\n\t\t\tos << line;\n\t\t}\n\t\treturn os;\n\t}\n\n\tauto operator + (Column const& other)->Columns;\n\n\tauto toString() const -> std::string {\n\t\tstd::ostringstream oss;\n\t\toss << *this;\n\t\treturn oss.str();\n\t}\n};\n\nclass Spacer : public Column {\n\npublic:\n\texplicit Spacer(size_t spaceWidth) : Column(\"\") {\n\t\twidth(spaceWidth);\n\t}\n};\n\nclass Columns {\n\tstd::vector<Column> m_columns;\n\npublic:\n\n\tclass iterator {\n\t\tfriend Columns;\n\t\tstruct EndTag {};\n\n\t\tstd::vector<Column> const& m_columns;\n\t\tstd::vector<Column::iterator> m_iterators;\n\t\tsize_t m_activeIterators;\n\n\t\titerator(Columns const& columns, EndTag)\n\t\t\t: m_columns(columns.m_columns),\n\t\t\tm_activeIterators(0) {\n\t\t\tm_iterators.reserve(m_columns.size());\n\n\t\t\tfor (auto const& col : m_columns)\n\t\t\t\tm_iterators.push_back(col.end());\n\t\t}\n\n\tpublic:\n\t\tusing difference_type = std::ptrdiff_t;\n\t\tusing value_type = std::string;\n\t\tusing pointer = value_type * ;\n\t\tusing reference = value_type & ;\n\t\tusing iterator_category = std::forward_iterator_tag;\n\n\t\texplicit iterator(Columns const& columns)\n\t\t\t: m_columns(columns.m_columns),\n\t\t\tm_activeIterators(m_columns.size()) {\n\t\t\tm_iterators.reserve(m_columns.size());\n\n\t\t\tfor (auto const& col : m_columns)\n\t\t\t\tm_iterators.push_back(col.begin());\n\t\t}\n\n\t\tauto operator ==(iterator const& other) const -> bool {\n\t\t\treturn m_iterators == other.m_iterators;\n\t\t}\n\t\tauto operator !=(iterator const& other) const -> bool {\n\t\t\treturn m_iterators != other.m_iterators;\n\t\t}\n\t\tauto operator *() const -> std::string {\n\t\t\tstd::string row, padding;\n\n\t\t\tfor (size_t i = 0; i < m_columns.size(); ++i) {\n\t\t\t\tauto width = m_columns[i].width();\n\t\t\t\tif (m_iterators[i] != m_columns[i].end()) {\n\t\t\t\t\tstd::string col = *m_iterators[i];\n\t\t\t\t\trow += padding + col;\n\t\t\t\t\tif (col.size() < width)\n\t\t\t\t\t\tpadding = std::string(width - col.size(), ' ');\n\t\t\t\t\telse\n\t\t\t\t\t\tpadding = \"\";\n\t\t\t\t} else {\n\t\t\t\t\tpadding += std::string(width, ' ');\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn row;\n\t\t}\n\t\tauto operator ++() -> iterator& {\n\t\t\tfor (size_t i = 0; i < m_columns.size(); ++i) {\n\t\t\t\tif (m_iterators[i] != m_columns[i].end())\n\t\t\t\t\t++m_iterators[i];\n\t\t\t}\n\t\t\treturn *this;\n\t\t}\n\t\tauto operator ++(int) -> iterator {\n\t\t\titerator prev(*this);\n\t\t\toperator++();\n\t\t\treturn prev;\n\t\t}\n\t};\n\tusing const_iterator = iterator;\n\n\tauto begin() const -> iterator { return iterator(*this); }\n\tauto end() const -> iterator { return { *this, iterator::EndTag() }; }\n\n\tauto operator += (Column const& col) -> Columns& {\n\t\tm_columns.push_back(col);\n\t\treturn *this;\n\t}\n\tauto operator + (Column const& col) -> Columns {\n\t\tColumns combined = *this;\n\t\tcombined += col;\n\t\treturn combined;\n\t}\n\n\tinline friend std::ostream& operator << (std::ostream& os, Columns const& cols) {\n\n\t\tbool first = true;\n\t\tfor (auto line : cols) {\n\t\t\tif (first)\n\t\t\t\tfirst = false;\n\t\t\telse\n\t\t\t\tos << \"\\n\";\n\t\t\tos << line;\n\t\t}\n\t\treturn os;\n\t}\n\n\tauto toString() const -> std::string {\n\t\tstd::ostringstream oss;\n\t\toss << *this;\n\t\treturn oss.str();\n\t}\n};\n\ninline auto Column::operator + (Column const& other) -> Columns {\n\tColumns cols;\n\tcols += *this;\n\tcols += other;\n\treturn cols;\n}\n}\n\n}\n}\n\n// ----------- end of #include from clara_textflow.hpp -----------\n// ........... back in clara.hpp\n\n#include <cctype>\n#include <string>\n#include <memory>\n#include <set>\n#include <algorithm>\n\n#if !defined(CATCH_PLATFORM_WINDOWS) && ( defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) )\n#define CATCH_PLATFORM_WINDOWS\n#endif\n\nnamespace Catch { namespace clara {\nnamespace detail {\n\n    // Traits for extracting arg and return type of lambdas (for single argument lambdas)\n    template<typename L>\n    struct UnaryLambdaTraits : UnaryLambdaTraits<decltype( &L::operator() )> {};\n\n    template<typename ClassT, typename ReturnT, typename... Args>\n    struct UnaryLambdaTraits<ReturnT( ClassT::* )( Args... ) const> {\n        static const bool isValid = false;\n    };\n\n    template<typename ClassT, typename ReturnT, typename ArgT>\n    struct UnaryLambdaTraits<ReturnT( ClassT::* )( ArgT ) const> {\n        static const bool isValid = true;\n        using ArgType = typename std::remove_const<typename std::remove_reference<ArgT>::type>::type;\n        using ReturnType = ReturnT;\n    };\n\n    class TokenStream;\n\n    // Transport for raw args (copied from main args, or supplied via init list for testing)\n    class Args {\n        friend TokenStream;\n        std::string m_exeName;\n        std::vector<std::string> m_args;\n\n    public:\n        Args( int argc, char const* const* argv )\n            : m_exeName(argv[0]),\n              m_args(argv + 1, argv + argc) {}\n\n        Args( std::initializer_list<std::string> args )\n        :   m_exeName( *args.begin() ),\n            m_args( args.begin()+1, args.end() )\n        {}\n\n        auto exeName() const -> std::string {\n            return m_exeName;\n        }\n    };\n\n    // Wraps a token coming from a token stream. These may not directly correspond to strings as a single string\n    // may encode an option + its argument if the : or = form is used\n    enum class TokenType {\n        Option, Argument\n    };\n    struct Token {\n        TokenType type;\n        std::string token;\n    };\n\n    inline auto isOptPrefix( char c ) -> bool {\n        return c == '-'\n#ifdef CATCH_PLATFORM_WINDOWS\n            || c == '/'\n#endif\n        ;\n    }\n\n    // Abstracts iterators into args as a stream of tokens, with option arguments uniformly handled\n    class TokenStream {\n        using Iterator = std::vector<std::string>::const_iterator;\n        Iterator it;\n        Iterator itEnd;\n        std::vector<Token> m_tokenBuffer;\n\n        void loadBuffer() {\n            m_tokenBuffer.resize( 0 );\n\n            // Skip any empty strings\n            while( it != itEnd && it->empty() )\n                ++it;\n\n            if( it != itEnd ) {\n                auto const &next = *it;\n                if( isOptPrefix( next[0] ) ) {\n                    auto delimiterPos = next.find_first_of( \" :=\" );\n                    if( delimiterPos != std::string::npos ) {\n                        m_tokenBuffer.push_back( { TokenType::Option, next.substr( 0, delimiterPos ) } );\n                        m_tokenBuffer.push_back( { TokenType::Argument, next.substr( delimiterPos + 1 ) } );\n                    } else {\n                        if( next[1] != '-' && next.size() > 2 ) {\n                            std::string opt = \"- \";\n                            for( size_t i = 1; i < next.size(); ++i ) {\n                                opt[1] = next[i];\n                                m_tokenBuffer.push_back( { TokenType::Option, opt } );\n                            }\n                        } else {\n                            m_tokenBuffer.push_back( { TokenType::Option, next } );\n                        }\n                    }\n                } else {\n                    m_tokenBuffer.push_back( { TokenType::Argument, next } );\n                }\n            }\n        }\n\n    public:\n        explicit TokenStream( Args const &args ) : TokenStream( args.m_args.begin(), args.m_args.end() ) {}\n\n        TokenStream( Iterator it, Iterator itEnd ) : it( it ), itEnd( itEnd ) {\n            loadBuffer();\n        }\n\n        explicit operator bool() const {\n            return !m_tokenBuffer.empty() || it != itEnd;\n        }\n\n        auto count() const -> size_t { return m_tokenBuffer.size() + (itEnd - it); }\n\n        auto operator*() const -> Token {\n            assert( !m_tokenBuffer.empty() );\n            return m_tokenBuffer.front();\n        }\n\n        auto operator->() const -> Token const * {\n            assert( !m_tokenBuffer.empty() );\n            return &m_tokenBuffer.front();\n        }\n\n        auto operator++() -> TokenStream & {\n            if( m_tokenBuffer.size() >= 2 ) {\n                m_tokenBuffer.erase( m_tokenBuffer.begin() );\n            } else {\n                if( it != itEnd )\n                    ++it;\n                loadBuffer();\n            }\n            return *this;\n        }\n    };\n\n    class ResultBase {\n    public:\n        enum Type {\n            Ok, LogicError, RuntimeError\n        };\n\n    protected:\n        ResultBase( Type type ) : m_type( type ) {}\n        virtual ~ResultBase() = default;\n\n        virtual void enforceOk() const = 0;\n\n        Type m_type;\n    };\n\n    template<typename T>\n    class ResultValueBase : public ResultBase {\n    public:\n        auto value() const -> T const & {\n            enforceOk();\n            return m_value;\n        }\n\n    protected:\n        ResultValueBase( Type type ) : ResultBase( type ) {}\n\n        ResultValueBase( ResultValueBase const &other ) : ResultBase( other ) {\n            if( m_type == ResultBase::Ok )\n                new( &m_value ) T( other.m_value );\n        }\n\n        ResultValueBase( Type, T const &value ) : ResultBase( Ok ) {\n            new( &m_value ) T( value );\n        }\n\n        auto operator=( ResultValueBase const &other ) -> ResultValueBase & {\n            if( m_type == ResultBase::Ok )\n                m_value.~T();\n            ResultBase::operator=(other);\n            if( m_type == ResultBase::Ok )\n                new( &m_value ) T( other.m_value );\n            return *this;\n        }\n\n        ~ResultValueBase() override {\n            if( m_type == Ok )\n                m_value.~T();\n        }\n\n        union {\n            T m_value;\n        };\n    };\n\n    template<>\n    class ResultValueBase<void> : public ResultBase {\n    protected:\n        using ResultBase::ResultBase;\n    };\n\n    template<typename T = void>\n    class BasicResult : public ResultValueBase<T> {\n    public:\n        template<typename U>\n        explicit BasicResult( BasicResult<U> const &other )\n        :   ResultValueBase<T>( other.type() ),\n            m_errorMessage( other.errorMessage() )\n        {\n            assert( type() != ResultBase::Ok );\n        }\n\n        template<typename U>\n        static auto ok( U const &value ) -> BasicResult { return { ResultBase::Ok, value }; }\n        static auto ok() -> BasicResult { return { ResultBase::Ok }; }\n        static auto logicError( std::string const &message ) -> BasicResult { return { ResultBase::LogicError, message }; }\n        static auto runtimeError( std::string const &message ) -> BasicResult { return { ResultBase::RuntimeError, message }; }\n\n        explicit operator bool() const { return m_type == ResultBase::Ok; }\n        auto type() const -> ResultBase::Type { return m_type; }\n        auto errorMessage() const -> std::string { return m_errorMessage; }\n\n    protected:\n        void enforceOk() const override {\n\n            // Errors shouldn't reach this point, but if they do\n            // the actual error message will be in m_errorMessage\n            assert( m_type != ResultBase::LogicError );\n            assert( m_type != ResultBase::RuntimeError );\n            if( m_type != ResultBase::Ok )\n                std::abort();\n        }\n\n        std::string m_errorMessage; // Only populated if resultType is an error\n\n        BasicResult( ResultBase::Type type, std::string const &message )\n        :   ResultValueBase<T>(type),\n            m_errorMessage(message)\n        {\n            assert( m_type != ResultBase::Ok );\n        }\n\n        using ResultValueBase<T>::ResultValueBase;\n        using ResultBase::m_type;\n    };\n\n    enum class ParseResultType {\n        Matched, NoMatch, ShortCircuitAll, ShortCircuitSame\n    };\n\n    class ParseState {\n    public:\n\n        ParseState( ParseResultType type, TokenStream const &remainingTokens )\n        : m_type(type),\n          m_remainingTokens( remainingTokens )\n        {}\n\n        auto type() const -> ParseResultType { return m_type; }\n        auto remainingTokens() const -> TokenStream { return m_remainingTokens; }\n\n    private:\n        ParseResultType m_type;\n        TokenStream m_remainingTokens;\n    };\n\n    using Result = BasicResult<void>;\n    using ParserResult = BasicResult<ParseResultType>;\n    using InternalParseResult = BasicResult<ParseState>;\n\n    struct HelpColumns {\n        std::string left;\n        std::string right;\n    };\n\n    template<typename T>\n    inline auto convertInto( std::string const &source, T& target ) -> ParserResult {\n        std::stringstream ss;\n        ss << source;\n        ss >> target;\n        if( ss.fail() )\n            return ParserResult::runtimeError( \"Unable to convert '\" + source + \"' to destination type\" );\n        else\n            return ParserResult::ok( ParseResultType::Matched );\n    }\n    inline auto convertInto( std::string const &source, std::string& target ) -> ParserResult {\n        target = source;\n        return ParserResult::ok( ParseResultType::Matched );\n    }\n    inline auto convertInto( std::string const &source, bool &target ) -> ParserResult {\n        std::string srcLC = source;\n        std::transform( srcLC.begin(), srcLC.end(), srcLC.begin(), []( unsigned char c ) { return static_cast<char>( std::tolower(c) ); } );\n        if (srcLC == \"y\" || srcLC == \"1\" || srcLC == \"true\" || srcLC == \"yes\" || srcLC == \"on\")\n            target = true;\n        else if (srcLC == \"n\" || srcLC == \"0\" || srcLC == \"false\" || srcLC == \"no\" || srcLC == \"off\")\n            target = false;\n        else\n            return ParserResult::runtimeError( \"Expected a boolean value but did not recognise: '\" + source + \"'\" );\n        return ParserResult::ok( ParseResultType::Matched );\n    }\n#ifdef CLARA_CONFIG_OPTIONAL_TYPE\n    template<typename T>\n    inline auto convertInto( std::string const &source, CLARA_CONFIG_OPTIONAL_TYPE<T>& target ) -> ParserResult {\n        T temp;\n        auto result = convertInto( source, temp );\n        if( result )\n            target = std::move(temp);\n        return result;\n    }\n#endif // CLARA_CONFIG_OPTIONAL_TYPE\n\n    struct NonCopyable {\n        NonCopyable() = default;\n        NonCopyable( NonCopyable const & ) = delete;\n        NonCopyable( NonCopyable && ) = delete;\n        NonCopyable &operator=( NonCopyable const & ) = delete;\n        NonCopyable &operator=( NonCopyable && ) = delete;\n    };\n\n    struct BoundRef : NonCopyable {\n        virtual ~BoundRef() = default;\n        virtual auto isContainer() const -> bool { return false; }\n        virtual auto isFlag() const -> bool { return false; }\n    };\n    struct BoundValueRefBase : BoundRef {\n        virtual auto setValue( std::string const &arg ) -> ParserResult = 0;\n    };\n    struct BoundFlagRefBase : BoundRef {\n        virtual auto setFlag( bool flag ) -> ParserResult = 0;\n        virtual auto isFlag() const -> bool { return true; }\n    };\n\n    template<typename T>\n    struct BoundValueRef : BoundValueRefBase {\n        T &m_ref;\n\n        explicit BoundValueRef( T &ref ) : m_ref( ref ) {}\n\n        auto setValue( std::string const &arg ) -> ParserResult override {\n            return convertInto( arg, m_ref );\n        }\n    };\n\n    template<typename T>\n    struct BoundValueRef<std::vector<T>> : BoundValueRefBase {\n        std::vector<T> &m_ref;\n\n        explicit BoundValueRef( std::vector<T> &ref ) : m_ref( ref ) {}\n\n        auto isContainer() const -> bool override { return true; }\n\n        auto setValue( std::string const &arg ) -> ParserResult override {\n            T temp;\n            auto result = convertInto( arg, temp );\n            if( result )\n                m_ref.push_back( temp );\n            return result;\n        }\n    };\n\n    struct BoundFlagRef : BoundFlagRefBase {\n        bool &m_ref;\n\n        explicit BoundFlagRef( bool &ref ) : m_ref( ref ) {}\n\n        auto setFlag( bool flag ) -> ParserResult override {\n            m_ref = flag;\n            return ParserResult::ok( ParseResultType::Matched );\n        }\n    };\n\n    template<typename ReturnType>\n    struct LambdaInvoker {\n        static_assert( std::is_same<ReturnType, ParserResult>::value, \"Lambda must return void or clara::ParserResult\" );\n\n        template<typename L, typename ArgType>\n        static auto invoke( L const &lambda, ArgType const &arg ) -> ParserResult {\n            return lambda( arg );\n        }\n    };\n\n    template<>\n    struct LambdaInvoker<void> {\n        template<typename L, typename ArgType>\n        static auto invoke( L const &lambda, ArgType const &arg ) -> ParserResult {\n            lambda( arg );\n            return ParserResult::ok( ParseResultType::Matched );\n        }\n    };\n\n    template<typename ArgType, typename L>\n    inline auto invokeLambda( L const &lambda, std::string const &arg ) -> ParserResult {\n        ArgType temp{};\n        auto result = convertInto( arg, temp );\n        return !result\n           ? result\n           : LambdaInvoker<typename UnaryLambdaTraits<L>::ReturnType>::invoke( lambda, temp );\n    }\n\n    template<typename L>\n    struct BoundLambda : BoundValueRefBase {\n        L m_lambda;\n\n        static_assert( UnaryLambdaTraits<L>::isValid, \"Supplied lambda must take exactly one argument\" );\n        explicit BoundLambda( L const &lambda ) : m_lambda( lambda ) {}\n\n        auto setValue( std::string const &arg ) -> ParserResult override {\n            return invokeLambda<typename UnaryLambdaTraits<L>::ArgType>( m_lambda, arg );\n        }\n    };\n\n    template<typename L>\n    struct BoundFlagLambda : BoundFlagRefBase {\n        L m_lambda;\n\n        static_assert( UnaryLambdaTraits<L>::isValid, \"Supplied lambda must take exactly one argument\" );\n        static_assert( std::is_same<typename UnaryLambdaTraits<L>::ArgType, bool>::value, \"flags must be boolean\" );\n\n        explicit BoundFlagLambda( L const &lambda ) : m_lambda( lambda ) {}\n\n        auto setFlag( bool flag ) -> ParserResult override {\n            return LambdaInvoker<typename UnaryLambdaTraits<L>::ReturnType>::invoke( m_lambda, flag );\n        }\n    };\n\n    enum class Optionality { Optional, Required };\n\n    struct Parser;\n\n    class ParserBase {\n    public:\n        virtual ~ParserBase() = default;\n        virtual auto validate() const -> Result { return Result::ok(); }\n        virtual auto parse( std::string const& exeName, TokenStream const &tokens) const -> InternalParseResult  = 0;\n        virtual auto cardinality() const -> size_t { return 1; }\n\n        auto parse( Args const &args ) const -> InternalParseResult {\n            return parse( args.exeName(), TokenStream( args ) );\n        }\n    };\n\n    template<typename DerivedT>\n    class ComposableParserImpl : public ParserBase {\n    public:\n        template<typename T>\n        auto operator|( T const &other ) const -> Parser;\n\n\t\ttemplate<typename T>\n        auto operator+( T const &other ) const -> Parser;\n    };\n\n    // Common code and state for Args and Opts\n    template<typename DerivedT>\n    class ParserRefImpl : public ComposableParserImpl<DerivedT> {\n    protected:\n        Optionality m_optionality = Optionality::Optional;\n        std::shared_ptr<BoundRef> m_ref;\n        std::string m_hint;\n        std::string m_description;\n\n        explicit ParserRefImpl( std::shared_ptr<BoundRef> const &ref ) : m_ref( ref ) {}\n\n    public:\n        template<typename T>\n        ParserRefImpl( T &ref, std::string const &hint )\n        :   m_ref( std::make_shared<BoundValueRef<T>>( ref ) ),\n            m_hint( hint )\n        {}\n\n        template<typename LambdaT>\n        ParserRefImpl( LambdaT const &ref, std::string const &hint )\n        :   m_ref( std::make_shared<BoundLambda<LambdaT>>( ref ) ),\n            m_hint(hint)\n        {}\n\n        auto operator()( std::string const &description ) -> DerivedT & {\n            m_description = description;\n            return static_cast<DerivedT &>( *this );\n        }\n\n        auto optional() -> DerivedT & {\n            m_optionality = Optionality::Optional;\n            return static_cast<DerivedT &>( *this );\n        };\n\n        auto required() -> DerivedT & {\n            m_optionality = Optionality::Required;\n            return static_cast<DerivedT &>( *this );\n        };\n\n        auto isOptional() const -> bool {\n            return m_optionality == Optionality::Optional;\n        }\n\n        auto cardinality() const -> size_t override {\n            if( m_ref->isContainer() )\n                return 0;\n            else\n                return 1;\n        }\n\n        auto hint() const -> std::string { return m_hint; }\n    };\n\n    class ExeName : public ComposableParserImpl<ExeName> {\n        std::shared_ptr<std::string> m_name;\n        std::shared_ptr<BoundValueRefBase> m_ref;\n\n        template<typename LambdaT>\n        static auto makeRef(LambdaT const &lambda) -> std::shared_ptr<BoundValueRefBase> {\n            return std::make_shared<BoundLambda<LambdaT>>( lambda) ;\n        }\n\n    public:\n        ExeName() : m_name( std::make_shared<std::string>( \"<executable>\" ) ) {}\n\n        explicit ExeName( std::string &ref ) : ExeName() {\n            m_ref = std::make_shared<BoundValueRef<std::string>>( ref );\n        }\n\n        template<typename LambdaT>\n        explicit ExeName( LambdaT const& lambda ) : ExeName() {\n            m_ref = std::make_shared<BoundLambda<LambdaT>>( lambda );\n        }\n\n        // The exe name is not parsed out of the normal tokens, but is handled specially\n        auto parse( std::string const&, TokenStream const &tokens ) const -> InternalParseResult override {\n            return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, tokens ) );\n        }\n\n        auto name() const -> std::string { return *m_name; }\n        auto set( std::string const& newName ) -> ParserResult {\n\n            auto lastSlash = newName.find_last_of( \"\\\\/\" );\n            auto filename = ( lastSlash == std::string::npos )\n                    ? newName\n                    : newName.substr( lastSlash+1 );\n\n            *m_name = filename;\n            if( m_ref )\n                return m_ref->setValue( filename );\n            else\n                return ParserResult::ok( ParseResultType::Matched );\n        }\n    };\n\n    class Arg : public ParserRefImpl<Arg> {\n    public:\n        using ParserRefImpl::ParserRefImpl;\n\n        auto parse( std::string const &, TokenStream const &tokens ) const -> InternalParseResult override {\n            auto validationResult = validate();\n            if( !validationResult )\n                return InternalParseResult( validationResult );\n\n            auto remainingTokens = tokens;\n            auto const &token = *remainingTokens;\n            if( token.type != TokenType::Argument )\n                return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, remainingTokens ) );\n\n            assert( !m_ref->isFlag() );\n            auto valueRef = static_cast<detail::BoundValueRefBase*>( m_ref.get() );\n\n            auto result = valueRef->setValue( remainingTokens->token );\n            if( !result )\n                return InternalParseResult( result );\n            else\n                return InternalParseResult::ok( ParseState( ParseResultType::Matched, ++remainingTokens ) );\n        }\n    };\n\n    inline auto normaliseOpt( std::string const &optName ) -> std::string {\n#ifdef CATCH_PLATFORM_WINDOWS\n        if( optName[0] == '/' )\n            return \"-\" + optName.substr( 1 );\n        else\n#endif\n            return optName;\n    }\n\n    class Opt : public ParserRefImpl<Opt> {\n    protected:\n        std::vector<std::string> m_optNames;\n\n    public:\n        template<typename LambdaT>\n        explicit Opt( LambdaT const &ref ) : ParserRefImpl( std::make_shared<BoundFlagLambda<LambdaT>>( ref ) ) {}\n\n        explicit Opt( bool &ref ) : ParserRefImpl( std::make_shared<BoundFlagRef>( ref ) ) {}\n\n        template<typename LambdaT>\n        Opt( LambdaT const &ref, std::string const &hint ) : ParserRefImpl( ref, hint ) {}\n\n        template<typename T>\n        Opt( T &ref, std::string const &hint ) : ParserRefImpl( ref, hint ) {}\n\n        auto operator[]( std::string const &optName ) -> Opt & {\n            m_optNames.push_back( optName );\n            return *this;\n        }\n\n        auto getHelpColumns() const -> std::vector<HelpColumns> {\n            std::ostringstream oss;\n            bool first = true;\n            for( auto const &opt : m_optNames ) {\n                if (first)\n                    first = false;\n                else\n                    oss << \", \";\n                oss << opt;\n            }\n            if( !m_hint.empty() )\n                oss << \" <\" << m_hint << \">\";\n            return { { oss.str(), m_description } };\n        }\n\n        auto isMatch( std::string const &optToken ) const -> bool {\n            auto normalisedToken = normaliseOpt( optToken );\n            for( auto const &name : m_optNames ) {\n                if( normaliseOpt( name ) == normalisedToken )\n                    return true;\n            }\n            return false;\n        }\n\n        using ParserBase::parse;\n\n        auto parse( std::string const&, TokenStream const &tokens ) const -> InternalParseResult override {\n            auto validationResult = validate();\n            if( !validationResult )\n                return InternalParseResult( validationResult );\n\n            auto remainingTokens = tokens;\n            if( remainingTokens && remainingTokens->type == TokenType::Option ) {\n                auto const &token = *remainingTokens;\n                if( isMatch(token.token ) ) {\n                    if( m_ref->isFlag() ) {\n                        auto flagRef = static_cast<detail::BoundFlagRefBase*>( m_ref.get() );\n                        auto result = flagRef->setFlag( true );\n                        if( !result )\n                            return InternalParseResult( result );\n                        if( result.value() == ParseResultType::ShortCircuitAll )\n                            return InternalParseResult::ok( ParseState( result.value(), remainingTokens ) );\n                    } else {\n                        auto valueRef = static_cast<detail::BoundValueRefBase*>( m_ref.get() );\n                        ++remainingTokens;\n                        if( !remainingTokens )\n                            return InternalParseResult::runtimeError( \"Expected argument following \" + token.token );\n                        auto const &argToken = *remainingTokens;\n                        if( argToken.type != TokenType::Argument )\n                            return InternalParseResult::runtimeError( \"Expected argument following \" + token.token );\n                        auto result = valueRef->setValue( argToken.token );\n                        if( !result )\n                            return InternalParseResult( result );\n                        if( result.value() == ParseResultType::ShortCircuitAll )\n                            return InternalParseResult::ok( ParseState( result.value(), remainingTokens ) );\n                    }\n                    return InternalParseResult::ok( ParseState( ParseResultType::Matched, ++remainingTokens ) );\n                }\n            }\n            return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, remainingTokens ) );\n        }\n\n        auto validate() const -> Result override {\n            if( m_optNames.empty() )\n                return Result::logicError( \"No options supplied to Opt\" );\n            for( auto const &name : m_optNames ) {\n                if( name.empty() )\n                    return Result::logicError( \"Option name cannot be empty\" );\n#ifdef CATCH_PLATFORM_WINDOWS\n                if( name[0] != '-' && name[0] != '/' )\n                    return Result::logicError( \"Option name must begin with '-' or '/'\" );\n#else\n                if( name[0] != '-' )\n                    return Result::logicError( \"Option name must begin with '-'\" );\n#endif\n            }\n            return ParserRefImpl::validate();\n        }\n    };\n\n    struct Help : Opt {\n        Help( bool &showHelpFlag )\n        :   Opt([&]( bool flag ) {\n                showHelpFlag = flag;\n                return ParserResult::ok( ParseResultType::ShortCircuitAll );\n            })\n        {\n            static_cast<Opt &>( *this )\n                    (\"display usage information\")\n                    [\"-?\"][\"-h\"][\"--help\"]\n                    .optional();\n        }\n    };\n\n    struct Parser : ParserBase {\n\n        mutable ExeName m_exeName;\n        std::vector<Opt> m_options;\n        std::vector<Arg> m_args;\n\n        auto operator|=( ExeName const &exeName ) -> Parser & {\n            m_exeName = exeName;\n            return *this;\n        }\n\n        auto operator|=( Arg const &arg ) -> Parser & {\n            m_args.push_back(arg);\n            return *this;\n        }\n\n        auto operator|=( Opt const &opt ) -> Parser & {\n            m_options.push_back(opt);\n            return *this;\n        }\n\n        auto operator|=( Parser const &other ) -> Parser & {\n            m_options.insert(m_options.end(), other.m_options.begin(), other.m_options.end());\n            m_args.insert(m_args.end(), other.m_args.begin(), other.m_args.end());\n            return *this;\n        }\n\n        template<typename T>\n        auto operator|( T const &other ) const -> Parser {\n            return Parser( *this ) |= other;\n        }\n\n        // Forward deprecated interface with '+' instead of '|'\n        template<typename T>\n        auto operator+=( T const &other ) -> Parser & { return operator|=( other ); }\n        template<typename T>\n        auto operator+( T const &other ) const -> Parser { return operator|( other ); }\n\n        auto getHelpColumns() const -> std::vector<HelpColumns> {\n            std::vector<HelpColumns> cols;\n            for (auto const &o : m_options) {\n                auto childCols = o.getHelpColumns();\n                cols.insert( cols.end(), childCols.begin(), childCols.end() );\n            }\n            return cols;\n        }\n\n        void writeToStream( std::ostream &os ) const {\n            if (!m_exeName.name().empty()) {\n                os << \"usage:\\n\" << \"  \" << m_exeName.name() << \" \";\n                bool required = true, first = true;\n                for( auto const &arg : m_args ) {\n                    if (first)\n                        first = false;\n                    else\n                        os << \" \";\n                    if( arg.isOptional() && required ) {\n                        os << \"[\";\n                        required = false;\n                    }\n                    os << \"<\" << arg.hint() << \">\";\n                    if( arg.cardinality() == 0 )\n                        os << \" ... \";\n                }\n                if( !required )\n                    os << \"]\";\n                if( !m_options.empty() )\n                    os << \" options\";\n                os << \"\\n\\nwhere options are:\" << std::endl;\n            }\n\n            auto rows = getHelpColumns();\n            size_t consoleWidth = CATCH_CLARA_CONFIG_CONSOLE_WIDTH;\n            size_t optWidth = 0;\n            for( auto const &cols : rows )\n                optWidth = (std::max)(optWidth, cols.left.size() + 2);\n\n            optWidth = (std::min)(optWidth, consoleWidth/2);\n\n            for( auto const &cols : rows ) {\n                auto row =\n                        TextFlow::Column( cols.left ).width( optWidth ).indent( 2 ) +\n                        TextFlow::Spacer(4) +\n                        TextFlow::Column( cols.right ).width( consoleWidth - 7 - optWidth );\n                os << row << std::endl;\n            }\n        }\n\n        friend auto operator<<( std::ostream &os, Parser const &parser ) -> std::ostream& {\n            parser.writeToStream( os );\n            return os;\n        }\n\n        auto validate() const -> Result override {\n            for( auto const &opt : m_options ) {\n                auto result = opt.validate();\n                if( !result )\n                    return result;\n            }\n            for( auto const &arg : m_args ) {\n                auto result = arg.validate();\n                if( !result )\n                    return result;\n            }\n            return Result::ok();\n        }\n\n        using ParserBase::parse;\n\n        auto parse( std::string const& exeName, TokenStream const &tokens ) const -> InternalParseResult override {\n\n            struct ParserInfo {\n                ParserBase const* parser = nullptr;\n                size_t count = 0;\n            };\n            const size_t totalParsers = m_options.size() + m_args.size();\n            assert( totalParsers < 512 );\n            // ParserInfo parseInfos[totalParsers]; // <-- this is what we really want to do\n            ParserInfo parseInfos[512];\n\n            {\n                size_t i = 0;\n                for (auto const &opt : m_options) parseInfos[i++].parser = &opt;\n                for (auto const &arg : m_args) parseInfos[i++].parser = &arg;\n            }\n\n            m_exeName.set( exeName );\n\n            auto result = InternalParseResult::ok( ParseState( ParseResultType::NoMatch, tokens ) );\n            while( result.value().remainingTokens() ) {\n                bool tokenParsed = false;\n\n                for( size_t i = 0; i < totalParsers; ++i ) {\n                    auto&  parseInfo = parseInfos[i];\n                    if( parseInfo.parser->cardinality() == 0 || parseInfo.count < parseInfo.parser->cardinality() ) {\n                        result = parseInfo.parser->parse(exeName, result.value().remainingTokens());\n                        if (!result)\n                            return result;\n                        if (result.value().type() != ParseResultType::NoMatch) {\n                            tokenParsed = true;\n                            ++parseInfo.count;\n                            break;\n                        }\n                    }\n                }\n\n                if( result.value().type() == ParseResultType::ShortCircuitAll )\n                    return result;\n                if( !tokenParsed )\n                    return InternalParseResult::runtimeError( \"Unrecognised token: \" + result.value().remainingTokens()->token );\n            }\n            // !TBD Check missing required options\n            return result;\n        }\n    };\n\n    template<typename DerivedT>\n    template<typename T>\n    auto ComposableParserImpl<DerivedT>::operator|( T const &other ) const -> Parser {\n        return Parser() | static_cast<DerivedT const &>( *this ) | other;\n    }\n} // namespace detail\n\n// A Combined parser\nusing detail::Parser;\n\n// A parser for options\nusing detail::Opt;\n\n// A parser for arguments\nusing detail::Arg;\n\n// Wrapper for argc, argv from main()\nusing detail::Args;\n\n// Specifies the name of the executable\nusing detail::ExeName;\n\n// Convenience wrapper for option parser that specifies the help option\nusing detail::Help;\n\n// enum of result types from a parse\nusing detail::ParseResultType;\n\n// Result type for parser operation\nusing detail::ParserResult;\n\n}} // namespace Catch::clara\n\n// end clara.hpp\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n\n// Restore Clara's value for console width, if present\n#ifdef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH\n#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH\n#undef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH\n#endif\n\n// end catch_clara.h\nnamespace Catch {\n\n    clara::Parser makeCommandLineParser( ConfigData& config );\n\n} // end namespace Catch\n\n// end catch_commandline.h\n#include <fstream>\n#include <ctime>\n\nnamespace Catch {\n\n    clara::Parser makeCommandLineParser( ConfigData& config ) {\n\n        using namespace clara;\n\n        auto const setWarning = [&]( std::string const& warning ) {\n                auto warningSet = [&]() {\n                    if( warning == \"NoAssertions\" )\n                        return WarnAbout::NoAssertions;\n\n                    if ( warning == \"NoTests\" )\n                        return WarnAbout::NoTests;\n\n                    return WarnAbout::Nothing;\n                }();\n\n                if (warningSet == WarnAbout::Nothing)\n                    return ParserResult::runtimeError( \"Unrecognised warning: '\" + warning + \"'\" );\n                config.warnings = static_cast<WarnAbout::What>( config.warnings | warningSet );\n                return ParserResult::ok( ParseResultType::Matched );\n            };\n        auto const loadTestNamesFromFile = [&]( std::string const& filename ) {\n                std::ifstream f( filename.c_str() );\n                if( !f.is_open() )\n                    return ParserResult::runtimeError( \"Unable to load input file: '\" + filename + \"'\" );\n\n                std::string line;\n                while( std::getline( f, line ) ) {\n                    line = trim(line);\n                    if( !line.empty() && !startsWith( line, '#' ) ) {\n                        if( !startsWith( line, '\"' ) )\n                            line = '\"' + line + '\"';\n                        config.testsOrTags.push_back( line );\n                        config.testsOrTags.emplace_back( \",\" );\n                    }\n                }\n                //Remove comma in the end\n                if(!config.testsOrTags.empty())\n                    config.testsOrTags.erase( config.testsOrTags.end()-1 );\n\n                return ParserResult::ok( ParseResultType::Matched );\n            };\n        auto const setTestOrder = [&]( std::string const& order ) {\n                if( startsWith( \"declared\", order ) )\n                    config.runOrder = RunTests::InDeclarationOrder;\n                else if( startsWith( \"lexical\", order ) )\n                    config.runOrder = RunTests::InLexicographicalOrder;\n                else if( startsWith( \"random\", order ) )\n                    config.runOrder = RunTests::InRandomOrder;\n                else\n                    return clara::ParserResult::runtimeError( \"Unrecognised ordering: '\" + order + \"'\" );\n                return ParserResult::ok( ParseResultType::Matched );\n            };\n        auto const setRngSeed = [&]( std::string const& seed ) {\n                if( seed != \"time\" )\n                    return clara::detail::convertInto( seed, config.rngSeed );\n                config.rngSeed = static_cast<unsigned int>( std::time(nullptr) );\n                return ParserResult::ok( ParseResultType::Matched );\n            };\n        auto const setColourUsage = [&]( std::string const& useColour ) {\n                    auto mode = toLower( useColour );\n\n                    if( mode == \"yes\" )\n                        config.useColour = UseColour::Yes;\n                    else if( mode == \"no\" )\n                        config.useColour = UseColour::No;\n                    else if( mode == \"auto\" )\n                        config.useColour = UseColour::Auto;\n                    else\n                        return ParserResult::runtimeError( \"colour mode must be one of: auto, yes or no. '\" + useColour + \"' not recognised\" );\n                return ParserResult::ok( ParseResultType::Matched );\n            };\n        auto const setWaitForKeypress = [&]( std::string const& keypress ) {\n                auto keypressLc = toLower( keypress );\n                if (keypressLc == \"never\")\n                    config.waitForKeypress = WaitForKeypress::Never;\n                else if( keypressLc == \"start\" )\n                    config.waitForKeypress = WaitForKeypress::BeforeStart;\n                else if( keypressLc == \"exit\" )\n                    config.waitForKeypress = WaitForKeypress::BeforeExit;\n                else if( keypressLc == \"both\" )\n                    config.waitForKeypress = WaitForKeypress::BeforeStartAndExit;\n                else\n                    return ParserResult::runtimeError( \"keypress argument must be one of: never, start, exit or both. '\" + keypress + \"' not recognised\" );\n            return ParserResult::ok( ParseResultType::Matched );\n            };\n        auto const setVerbosity = [&]( std::string const& verbosity ) {\n            auto lcVerbosity = toLower( verbosity );\n            if( lcVerbosity == \"quiet\" )\n                config.verbosity = Verbosity::Quiet;\n            else if( lcVerbosity == \"normal\" )\n                config.verbosity = Verbosity::Normal;\n            else if( lcVerbosity == \"high\" )\n                config.verbosity = Verbosity::High;\n            else\n                return ParserResult::runtimeError( \"Unrecognised verbosity, '\" + verbosity + \"'\" );\n            return ParserResult::ok( ParseResultType::Matched );\n        };\n        auto const setReporter = [&]( std::string const& reporter ) {\n            IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories();\n\n            auto lcReporter = toLower( reporter );\n            auto result = factories.find( lcReporter );\n\n            if( factories.end() != result )\n                config.reporterName = lcReporter;\n            else\n                return ParserResult::runtimeError( \"Unrecognized reporter, '\" + reporter + \"'. Check available with --list-reporters\" );\n            return ParserResult::ok( ParseResultType::Matched );\n        };\n\n        auto cli\n            = ExeName( config.processName )\n            | Help( config.showHelp )\n            | Opt( config.listTests )\n                [\"-l\"][\"--list-tests\"]\n                ( \"list all/matching test cases\" )\n            | Opt( config.listTags )\n                [\"-t\"][\"--list-tags\"]\n                ( \"list all/matching tags\" )\n            | Opt( config.showSuccessfulTests )\n                [\"-s\"][\"--success\"]\n                ( \"include successful tests in output\" )\n            | Opt( config.shouldDebugBreak )\n                [\"-b\"][\"--break\"]\n                ( \"break into debugger on failure\" )\n            | Opt( config.noThrow )\n                [\"-e\"][\"--nothrow\"]\n                ( \"skip exception tests\" )\n            | Opt( config.showInvisibles )\n                [\"-i\"][\"--invisibles\"]\n                ( \"show invisibles (tabs, newlines)\" )\n            | Opt( config.outputFilename, \"filename\" )\n                [\"-o\"][\"--out\"]\n                ( \"output filename\" )\n            | Opt( setReporter, \"name\" )\n                [\"-r\"][\"--reporter\"]\n                ( \"reporter to use (defaults to console)\" )\n            | Opt( config.name, \"name\" )\n                [\"-n\"][\"--name\"]\n                ( \"suite name\" )\n            | Opt( [&]( bool ){ config.abortAfter = 1; } )\n                [\"-a\"][\"--abort\"]\n                ( \"abort at first failure\" )\n            | Opt( [&]( int x ){ config.abortAfter = x; }, \"no. failures\" )\n                [\"-x\"][\"--abortx\"]\n                ( \"abort after x failures\" )\n            | Opt( setWarning, \"warning name\" )\n                [\"-w\"][\"--warn\"]\n                ( \"enable warnings\" )\n            | Opt( [&]( bool flag ) { config.showDurations = flag ? ShowDurations::Always : ShowDurations::Never; }, \"yes|no\" )\n                [\"-d\"][\"--durations\"]\n                ( \"show test durations\" )\n            | Opt( config.minDuration, \"seconds\" )\n                [\"-D\"][\"--min-duration\"]\n                ( \"show test durations for tests taking at least the given number of seconds\" )\n            | Opt( loadTestNamesFromFile, \"filename\" )\n                [\"-f\"][\"--input-file\"]\n                ( \"load test names to run from a file\" )\n            | Opt( config.filenamesAsTags )\n                [\"-#\"][\"--filenames-as-tags\"]\n                ( \"adds a tag for the filename\" )\n            | Opt( config.sectionsToRun, \"section name\" )\n                [\"-c\"][\"--section\"]\n                ( \"specify section to run\" )\n            | Opt( setVerbosity, \"quiet|normal|high\" )\n                [\"-v\"][\"--verbosity\"]\n                ( \"set output verbosity\" )\n            | Opt( config.listTestNamesOnly )\n                [\"--list-test-names-only\"]\n                ( \"list all/matching test cases names only\" )\n            | Opt( config.listReporters )\n                [\"--list-reporters\"]\n                ( \"list all reporters\" )\n            | Opt( setTestOrder, \"decl|lex|rand\" )\n                [\"--order\"]\n                ( \"test case order (defaults to decl)\" )\n            | Opt( setRngSeed, \"'time'|number\" )\n                [\"--rng-seed\"]\n                ( \"set a specific seed for random numbers\" )\n            | Opt( setColourUsage, \"yes|no\" )\n                [\"--use-colour\"]\n                ( \"should output be colourised\" )\n            | Opt( config.libIdentify )\n                [\"--libidentify\"]\n                ( \"report name and version according to libidentify standard\" )\n            | Opt( setWaitForKeypress, \"never|start|exit|both\" )\n                [\"--wait-for-keypress\"]\n                ( \"waits for a keypress before exiting\" )\n            | Opt( config.benchmarkSamples, \"samples\" )\n                [\"--benchmark-samples\"]\n                ( \"number of samples to collect (default: 100)\" )\n            | Opt( config.benchmarkResamples, \"resamples\" )\n                [\"--benchmark-resamples\"]\n                ( \"number of resamples for the bootstrap (default: 100000)\" )\n            | Opt( config.benchmarkConfidenceInterval, \"confidence interval\" )\n                [\"--benchmark-confidence-interval\"]\n                ( \"confidence interval for the bootstrap (between 0 and 1, default: 0.95)\" )\n            | Opt( config.benchmarkNoAnalysis )\n                [\"--benchmark-no-analysis\"]\n                ( \"perform only measurements; do not perform any analysis\" )\n            | Opt( config.benchmarkWarmupTime, \"benchmarkWarmupTime\" )\n                [\"--benchmark-warmup-time\"]\n                ( \"amount of time in milliseconds spent on warming up each test (default: 100)\" )\n            | Arg( config.testsOrTags, \"test name|pattern|tags\" )\n                ( \"which test or tests to use\" );\n\n        return cli;\n    }\n\n} // end namespace Catch\n// end catch_commandline.cpp\n// start catch_common.cpp\n\n#include <cstring>\n#include <ostream>\n\nnamespace Catch {\n\n    bool SourceLineInfo::operator == ( SourceLineInfo const& other ) const noexcept {\n        return line == other.line && (file == other.file || std::strcmp(file, other.file) == 0);\n    }\n    bool SourceLineInfo::operator < ( SourceLineInfo const& other ) const noexcept {\n        // We can assume that the same file will usually have the same pointer.\n        // Thus, if the pointers are the same, there is no point in calling the strcmp\n        return line < other.line || ( line == other.line && file != other.file && (std::strcmp(file, other.file) < 0));\n    }\n\n    std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ) {\n#ifndef __GNUG__\n        os << info.file << '(' << info.line << ')';\n#else\n        os << info.file << ':' << info.line;\n#endif\n        return os;\n    }\n\n    std::string StreamEndStop::operator+() const {\n        return std::string();\n    }\n\n    NonCopyable::NonCopyable() = default;\n    NonCopyable::~NonCopyable() = default;\n\n}\n// end catch_common.cpp\n// start catch_config.cpp\n\nnamespace Catch {\n\n    Config::Config( ConfigData const& data )\n    :   m_data( data ),\n        m_stream( openStream() )\n    {\n        // We need to trim filter specs to avoid trouble with superfluous\n        // whitespace (esp. important for bdd macros, as those are manually\n        // aligned with whitespace).\n\n        for (auto& elem : m_data.testsOrTags) {\n            elem = trim(elem);\n        }\n        for (auto& elem : m_data.sectionsToRun) {\n            elem = trim(elem);\n        }\n\n        TestSpecParser parser(ITagAliasRegistry::get());\n        if (!m_data.testsOrTags.empty()) {\n            m_hasTestFilters = true;\n            for (auto const& testOrTags : m_data.testsOrTags) {\n                parser.parse(testOrTags);\n            }\n        }\n        m_testSpec = parser.testSpec();\n    }\n\n    std::string const& Config::getFilename() const {\n        return m_data.outputFilename ;\n    }\n\n    bool Config::listTests() const          { return m_data.listTests; }\n    bool Config::listTestNamesOnly() const  { return m_data.listTestNamesOnly; }\n    bool Config::listTags() const           { return m_data.listTags; }\n    bool Config::listReporters() const      { return m_data.listReporters; }\n\n    std::string Config::getProcessName() const { return m_data.processName; }\n    std::string const& Config::getReporterName() const { return m_data.reporterName; }\n\n    std::vector<std::string> const& Config::getTestsOrTags() const { return m_data.testsOrTags; }\n    std::vector<std::string> const& Config::getSectionsToRun() const { return m_data.sectionsToRun; }\n\n    TestSpec const& Config::testSpec() const { return m_testSpec; }\n    bool Config::hasTestFilters() const { return m_hasTestFilters; }\n\n    bool Config::showHelp() const { return m_data.showHelp; }\n\n    // IConfig interface\n    bool Config::allowThrows() const                   { return !m_data.noThrow; }\n    std::ostream& Config::stream() const               { return m_stream->stream(); }\n    std::string Config::name() const                   { return m_data.name.empty() ? m_data.processName : m_data.name; }\n    bool Config::includeSuccessfulResults() const      { return m_data.showSuccessfulTests; }\n    bool Config::warnAboutMissingAssertions() const    { return !!(m_data.warnings & WarnAbout::NoAssertions); }\n    bool Config::warnAboutNoTests() const              { return !!(m_data.warnings & WarnAbout::NoTests); }\n    ShowDurations::OrNot Config::showDurations() const { return m_data.showDurations; }\n    double Config::minDuration() const                 { return m_data.minDuration; }\n    RunTests::InWhatOrder Config::runOrder() const     { return m_data.runOrder; }\n    unsigned int Config::rngSeed() const               { return m_data.rngSeed; }\n    UseColour::YesOrNo Config::useColour() const       { return m_data.useColour; }\n    bool Config::shouldDebugBreak() const              { return m_data.shouldDebugBreak; }\n    int Config::abortAfter() const                     { return m_data.abortAfter; }\n    bool Config::showInvisibles() const                { return m_data.showInvisibles; }\n    Verbosity Config::verbosity() const                { return m_data.verbosity; }\n\n    bool Config::benchmarkNoAnalysis() const                      { return m_data.benchmarkNoAnalysis; }\n    int Config::benchmarkSamples() const                          { return m_data.benchmarkSamples; }\n    double Config::benchmarkConfidenceInterval() const            { return m_data.benchmarkConfidenceInterval; }\n    unsigned int Config::benchmarkResamples() const               { return m_data.benchmarkResamples; }\n    std::chrono::milliseconds Config::benchmarkWarmupTime() const { return std::chrono::milliseconds(m_data.benchmarkWarmupTime); }\n\n    IStream const* Config::openStream() {\n        return Catch::makeStream(m_data.outputFilename);\n    }\n\n} // end namespace Catch\n// end catch_config.cpp\n// start catch_console_colour.cpp\n\n#if defined(__clang__)\n#    pragma clang diagnostic push\n#    pragma clang diagnostic ignored \"-Wexit-time-destructors\"\n#endif\n\n// start catch_errno_guard.h\n\nnamespace Catch {\n\n    class ErrnoGuard {\n    public:\n        ErrnoGuard();\n        ~ErrnoGuard();\n    private:\n        int m_oldErrno;\n    };\n\n}\n\n// end catch_errno_guard.h\n#include <sstream>\n\nnamespace Catch {\n    namespace {\n\n        struct IColourImpl {\n            virtual ~IColourImpl() = default;\n            virtual void use( Colour::Code _colourCode ) = 0;\n        };\n\n        struct NoColourImpl : IColourImpl {\n            void use( Colour::Code ) override {}\n\n            static IColourImpl* instance() {\n                static NoColourImpl s_instance;\n                return &s_instance;\n            }\n        };\n\n    } // anon namespace\n} // namespace Catch\n\n#if !defined( CATCH_CONFIG_COLOUR_NONE ) && !defined( CATCH_CONFIG_COLOUR_WINDOWS ) && !defined( CATCH_CONFIG_COLOUR_ANSI )\n#   ifdef CATCH_PLATFORM_WINDOWS\n#       define CATCH_CONFIG_COLOUR_WINDOWS\n#   else\n#       define CATCH_CONFIG_COLOUR_ANSI\n#   endif\n#endif\n\n#if defined ( CATCH_CONFIG_COLOUR_WINDOWS ) /////////////////////////////////////////\n\nnamespace Catch {\nnamespace {\n\n    class Win32ColourImpl : public IColourImpl {\n    public:\n        Win32ColourImpl() : stdoutHandle( GetStdHandle(STD_OUTPUT_HANDLE) )\n        {\n            CONSOLE_SCREEN_BUFFER_INFO csbiInfo;\n            GetConsoleScreenBufferInfo( stdoutHandle, &csbiInfo );\n            originalForegroundAttributes = csbiInfo.wAttributes & ~( BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY );\n            originalBackgroundAttributes = csbiInfo.wAttributes & ~( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY );\n        }\n\n        void use( Colour::Code _colourCode ) override {\n            switch( _colourCode ) {\n                case Colour::None:      return setTextAttribute( originalForegroundAttributes );\n                case Colour::White:     return setTextAttribute( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE );\n                case Colour::Red:       return setTextAttribute( FOREGROUND_RED );\n                case Colour::Green:     return setTextAttribute( FOREGROUND_GREEN );\n                case Colour::Blue:      return setTextAttribute( FOREGROUND_BLUE );\n                case Colour::Cyan:      return setTextAttribute( FOREGROUND_BLUE | FOREGROUND_GREEN );\n                case Colour::Yellow:    return setTextAttribute( FOREGROUND_RED | FOREGROUND_GREEN );\n                case Colour::Grey:      return setTextAttribute( 0 );\n\n                case Colour::LightGrey:     return setTextAttribute( FOREGROUND_INTENSITY );\n                case Colour::BrightRed:     return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED );\n                case Colour::BrightGreen:   return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN );\n                case Colour::BrightWhite:   return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE );\n                case Colour::BrightYellow:  return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN );\n\n                case Colour::Bright: CATCH_INTERNAL_ERROR( \"not a colour\" );\n\n                default:\n                    CATCH_ERROR( \"Unknown colour requested\" );\n            }\n        }\n\n    private:\n        void setTextAttribute( WORD _textAttribute ) {\n            SetConsoleTextAttribute( stdoutHandle, _textAttribute | originalBackgroundAttributes );\n        }\n        HANDLE stdoutHandle;\n        WORD originalForegroundAttributes;\n        WORD originalBackgroundAttributes;\n    };\n\n    IColourImpl* platformColourInstance() {\n        static Win32ColourImpl s_instance;\n\n        IConfigPtr config = getCurrentContext().getConfig();\n        UseColour::YesOrNo colourMode = config\n            ? config->useColour()\n            : UseColour::Auto;\n        if( colourMode == UseColour::Auto )\n            colourMode = UseColour::Yes;\n        return colourMode == UseColour::Yes\n            ? &s_instance\n            : NoColourImpl::instance();\n    }\n\n} // end anon namespace\n} // end namespace Catch\n\n#elif defined( CATCH_CONFIG_COLOUR_ANSI ) //////////////////////////////////////\n\n#include <unistd.h>\n\nnamespace Catch {\nnamespace {\n\n    // use POSIX/ ANSI console terminal codes\n    // Thanks to Adam Strzelecki for original contribution\n    // (http://github.com/nanoant)\n    // https://github.com/philsquared/Catch/pull/131\n    class PosixColourImpl : public IColourImpl {\n    public:\n        void use( Colour::Code _colourCode ) override {\n            switch( _colourCode ) {\n                case Colour::None:\n                case Colour::White:     return setColour( \"[0m\" );\n                case Colour::Red:       return setColour( \"[0;31m\" );\n                case Colour::Green:     return setColour( \"[0;32m\" );\n                case Colour::Blue:      return setColour( \"[0;34m\" );\n                case Colour::Cyan:      return setColour( \"[0;36m\" );\n                case Colour::Yellow:    return setColour( \"[0;33m\" );\n                case Colour::Grey:      return setColour( \"[1;30m\" );\n\n                case Colour::LightGrey:     return setColour( \"[0;37m\" );\n                case Colour::BrightRed:     return setColour( \"[1;31m\" );\n                case Colour::BrightGreen:   return setColour( \"[1;32m\" );\n                case Colour::BrightWhite:   return setColour( \"[1;37m\" );\n                case Colour::BrightYellow:  return setColour( \"[1;33m\" );\n\n                case Colour::Bright: CATCH_INTERNAL_ERROR( \"not a colour\" );\n                default: CATCH_INTERNAL_ERROR( \"Unknown colour requested\" );\n            }\n        }\n        static IColourImpl* instance() {\n            static PosixColourImpl s_instance;\n            return &s_instance;\n        }\n\n    private:\n        void setColour( const char* _escapeCode ) {\n            getCurrentContext().getConfig()->stream()\n                << '\\033' << _escapeCode;\n        }\n    };\n\n    bool useColourOnPlatform() {\n        return\n#if defined(CATCH_PLATFORM_MAC) || defined(CATCH_PLATFORM_IPHONE)\n            !isDebuggerActive() &&\n#endif\n#if !(defined(__DJGPP__) && defined(__STRICT_ANSI__))\n            isatty(STDOUT_FILENO)\n#else\n            false\n#endif\n            ;\n    }\n    IColourImpl* platformColourInstance() {\n        ErrnoGuard guard;\n        IConfigPtr config = getCurrentContext().getConfig();\n        UseColour::YesOrNo colourMode = config\n            ? config->useColour()\n            : UseColour::Auto;\n        if( colourMode == UseColour::Auto )\n            colourMode = useColourOnPlatform()\n                ? UseColour::Yes\n                : UseColour::No;\n        return colourMode == UseColour::Yes\n            ? PosixColourImpl::instance()\n            : NoColourImpl::instance();\n    }\n\n} // end anon namespace\n} // end namespace Catch\n\n#else  // not Windows or ANSI ///////////////////////////////////////////////\n\nnamespace Catch {\n\n    static IColourImpl* platformColourInstance() { return NoColourImpl::instance(); }\n\n} // end namespace Catch\n\n#endif // Windows/ ANSI/ None\n\nnamespace Catch {\n\n    Colour::Colour( Code _colourCode ) { use( _colourCode ); }\n    Colour::Colour( Colour&& other ) noexcept {\n        m_moved = other.m_moved;\n        other.m_moved = true;\n    }\n    Colour& Colour::operator=( Colour&& other ) noexcept {\n        m_moved = other.m_moved;\n        other.m_moved  = true;\n        return *this;\n    }\n\n    Colour::~Colour(){ if( !m_moved ) use( None ); }\n\n    void Colour::use( Code _colourCode ) {\n        static IColourImpl* impl = platformColourInstance();\n        // Strictly speaking, this cannot possibly happen.\n        // However, under some conditions it does happen (see #1626),\n        // and this change is small enough that we can let practicality\n        // triumph over purity in this case.\n        if (impl != nullptr) {\n            impl->use( _colourCode );\n        }\n    }\n\n    std::ostream& operator << ( std::ostream& os, Colour const& ) {\n        return os;\n    }\n\n} // end namespace Catch\n\n#if defined(__clang__)\n#    pragma clang diagnostic pop\n#endif\n\n// end catch_console_colour.cpp\n// start catch_context.cpp\n\nnamespace Catch {\n\n    class Context : public IMutableContext, NonCopyable {\n\n    public: // IContext\n        IResultCapture* getResultCapture() override {\n            return m_resultCapture;\n        }\n        IRunner* getRunner() override {\n            return m_runner;\n        }\n\n        IConfigPtr const& getConfig() const override {\n            return m_config;\n        }\n\n        ~Context() override;\n\n    public: // IMutableContext\n        void setResultCapture( IResultCapture* resultCapture ) override {\n            m_resultCapture = resultCapture;\n        }\n        void setRunner( IRunner* runner ) override {\n            m_runner = runner;\n        }\n        void setConfig( IConfigPtr const& config ) override {\n            m_config = config;\n        }\n\n        friend IMutableContext& getCurrentMutableContext();\n\n    private:\n        IConfigPtr m_config;\n        IRunner* m_runner = nullptr;\n        IResultCapture* m_resultCapture = nullptr;\n    };\n\n    IMutableContext *IMutableContext::currentContext = nullptr;\n\n    void IMutableContext::createContext()\n    {\n        currentContext = new Context();\n    }\n\n    void cleanUpContext() {\n        delete IMutableContext::currentContext;\n        IMutableContext::currentContext = nullptr;\n    }\n    IContext::~IContext() = default;\n    IMutableContext::~IMutableContext() = default;\n    Context::~Context() = default;\n\n    SimplePcg32& rng() {\n        static SimplePcg32 s_rng;\n        return s_rng;\n    }\n\n}\n// end catch_context.cpp\n// start catch_debug_console.cpp\n\n// start catch_debug_console.h\n\n#include <string>\n\nnamespace Catch {\n    void writeToDebugConsole( std::string const& text );\n}\n\n// end catch_debug_console.h\n#if defined(CATCH_CONFIG_ANDROID_LOGWRITE)\n#include <android/log.h>\n\n    namespace Catch {\n        void writeToDebugConsole( std::string const& text ) {\n            __android_log_write( ANDROID_LOG_DEBUG, \"Catch\", text.c_str() );\n        }\n    }\n\n#elif defined(CATCH_PLATFORM_WINDOWS)\n\n    namespace Catch {\n        void writeToDebugConsole( std::string const& text ) {\n            ::OutputDebugStringA( text.c_str() );\n        }\n    }\n\n#else\n\n    namespace Catch {\n        void writeToDebugConsole( std::string const& text ) {\n            // !TBD: Need a version for Mac/ XCode and other IDEs\n            Catch::cout() << text;\n        }\n    }\n\n#endif // Platform\n// end catch_debug_console.cpp\n// start catch_debugger.cpp\n\n#if defined(CATCH_PLATFORM_MAC) || defined(CATCH_PLATFORM_IPHONE)\n\n#  include <cassert>\n#  include <sys/types.h>\n#  include <unistd.h>\n#  include <cstddef>\n#  include <ostream>\n\n#ifdef __apple_build_version__\n    // These headers will only compile with AppleClang (XCode)\n    // For other compilers (Clang, GCC, ... ) we need to exclude them\n#  include <sys/sysctl.h>\n#endif\n\n    namespace Catch {\n        #ifdef __apple_build_version__\n        // The following function is taken directly from the following technical note:\n        // https://developer.apple.com/library/archive/qa/qa1361/_index.html\n\n        // Returns true if the current process is being debugged (either\n        // running under the debugger or has a debugger attached post facto).\n        bool isDebuggerActive(){\n            int                 mib[4];\n            struct kinfo_proc   info;\n            std::size_t         size;\n\n            // Initialize the flags so that, if sysctl fails for some bizarre\n            // reason, we get a predictable result.\n\n            info.kp_proc.p_flag = 0;\n\n            // Initialize mib, which tells sysctl the info we want, in this case\n            // we're looking for information about a specific process ID.\n\n            mib[0] = CTL_KERN;\n            mib[1] = KERN_PROC;\n            mib[2] = KERN_PROC_PID;\n            mib[3] = getpid();\n\n            // Call sysctl.\n\n            size = sizeof(info);\n            if( sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, nullptr, 0) != 0 ) {\n                Catch::cerr() << \"\\n** Call to sysctl failed - unable to determine if debugger is active **\\n\" << std::endl;\n                return false;\n            }\n\n            // We're being debugged if the P_TRACED flag is set.\n\n            return ( (info.kp_proc.p_flag & P_TRACED) != 0 );\n        }\n        #else\n        bool isDebuggerActive() {\n            // We need to find another way to determine this for non-appleclang compilers on macOS\n            return false;\n        }\n        #endif\n    } // namespace Catch\n\n#elif defined(CATCH_PLATFORM_LINUX)\n    #include <fstream>\n    #include <string>\n\n    namespace Catch{\n        // The standard POSIX way of detecting a debugger is to attempt to\n        // ptrace() the process, but this needs to be done from a child and not\n        // this process itself to still allow attaching to this process later\n        // if wanted, so is rather heavy. Under Linux we have the PID of the\n        // \"debugger\" (which doesn't need to be gdb, of course, it could also\n        // be strace, for example) in /proc/$PID/status, so just get it from\n        // there instead.\n        bool isDebuggerActive(){\n            // Libstdc++ has a bug, where std::ifstream sets errno to 0\n            // This way our users can properly assert over errno values\n            ErrnoGuard guard;\n            std::ifstream in(\"/proc/self/status\");\n            for( std::string line; std::getline(in, line); ) {\n                static const int PREFIX_LEN = 11;\n                if( line.compare(0, PREFIX_LEN, \"TracerPid:\\t\") == 0 ) {\n                    // We're traced if the PID is not 0 and no other PID starts\n                    // with 0 digit, so it's enough to check for just a single\n                    // character.\n                    return line.length() > PREFIX_LEN && line[PREFIX_LEN] != '0';\n                }\n            }\n\n            return false;\n        }\n    } // namespace Catch\n#elif defined(_MSC_VER)\n    extern \"C\" __declspec(dllimport) int __stdcall IsDebuggerPresent();\n    namespace Catch {\n        bool isDebuggerActive() {\n            return IsDebuggerPresent() != 0;\n        }\n    }\n#elif defined(__MINGW32__)\n    extern \"C\" __declspec(dllimport) int __stdcall IsDebuggerPresent();\n    namespace Catch {\n        bool isDebuggerActive() {\n            return IsDebuggerPresent() != 0;\n        }\n    }\n#else\n    namespace Catch {\n       bool isDebuggerActive() { return false; }\n    }\n#endif // Platform\n// end catch_debugger.cpp\n// start catch_decomposer.cpp\n\nnamespace Catch {\n\n    ITransientExpression::~ITransientExpression() = default;\n\n    void formatReconstructedExpression( std::ostream &os, std::string const& lhs, StringRef op, std::string const& rhs ) {\n        if( lhs.size() + rhs.size() < 40 &&\n                lhs.find('\\n') == std::string::npos &&\n                rhs.find('\\n') == std::string::npos )\n            os << lhs << \" \" << op << \" \" << rhs;\n        else\n            os << lhs << \"\\n\" << op << \"\\n\" << rhs;\n    }\n}\n// end catch_decomposer.cpp\n// start catch_enforce.cpp\n\n#include <stdexcept>\n\nnamespace Catch {\n#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) && !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS_CUSTOM_HANDLER)\n    [[noreturn]]\n    void throw_exception(std::exception const& e) {\n        Catch::cerr() << \"Catch will terminate because it needed to throw an exception.\\n\"\n                      << \"The message was: \" << e.what() << '\\n';\n        std::terminate();\n    }\n#endif\n\n    [[noreturn]]\n    void throw_logic_error(std::string const& msg) {\n        throw_exception(std::logic_error(msg));\n    }\n\n    [[noreturn]]\n    void throw_domain_error(std::string const& msg) {\n        throw_exception(std::domain_error(msg));\n    }\n\n    [[noreturn]]\n    void throw_runtime_error(std::string const& msg) {\n        throw_exception(std::runtime_error(msg));\n    }\n\n} // namespace Catch;\n// end catch_enforce.cpp\n// start catch_enum_values_registry.cpp\n// start catch_enum_values_registry.h\n\n#include <vector>\n#include <memory>\n\nnamespace Catch {\n\n    namespace Detail {\n\n        std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRef allValueNames, std::vector<int> const& values );\n\n        class EnumValuesRegistry : public IMutableEnumValuesRegistry {\n\n            std::vector<std::unique_ptr<EnumInfo>> m_enumInfos;\n\n            EnumInfo const& registerEnum( StringRef enumName, StringRef allEnums, std::vector<int> const& values) override;\n        };\n\n        std::vector<StringRef> parseEnums( StringRef enums );\n\n    } // Detail\n\n} // Catch\n\n// end catch_enum_values_registry.h\n\n#include <map>\n#include <cassert>\n\nnamespace Catch {\n\n    IMutableEnumValuesRegistry::~IMutableEnumValuesRegistry() {}\n\n    namespace Detail {\n\n        namespace {\n            // Extracts the actual name part of an enum instance\n            // In other words, it returns the Blue part of Bikeshed::Colour::Blue\n            StringRef extractInstanceName(StringRef enumInstance) {\n                // Find last occurence of \":\"\n                size_t name_start = enumInstance.size();\n                while (name_start > 0 && enumInstance[name_start - 1] != ':') {\n                    --name_start;\n                }\n                return enumInstance.substr(name_start, enumInstance.size() - name_start);\n            }\n        }\n\n        std::vector<StringRef> parseEnums( StringRef enums ) {\n            auto enumValues = splitStringRef( enums, ',' );\n            std::vector<StringRef> parsed;\n            parsed.reserve( enumValues.size() );\n            for( auto const& enumValue : enumValues ) {\n                parsed.push_back(trim(extractInstanceName(enumValue)));\n            }\n            return parsed;\n        }\n\n        EnumInfo::~EnumInfo() {}\n\n        StringRef EnumInfo::lookup( int value ) const {\n            for( auto const& valueToName : m_values ) {\n                if( valueToName.first == value )\n                    return valueToName.second;\n            }\n            return \"{** unexpected enum value **}\"_sr;\n        }\n\n        std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRef allValueNames, std::vector<int> const& values ) {\n            std::unique_ptr<EnumInfo> enumInfo( new EnumInfo );\n            enumInfo->m_name = enumName;\n            enumInfo->m_values.reserve( values.size() );\n\n            const auto valueNames = Catch::Detail::parseEnums( allValueNames );\n            assert( valueNames.size() == values.size() );\n            std::size_t i = 0;\n            for( auto value : values )\n                enumInfo->m_values.emplace_back(value, valueNames[i++]);\n\n            return enumInfo;\n        }\n\n        EnumInfo const& EnumValuesRegistry::registerEnum( StringRef enumName, StringRef allValueNames, std::vector<int> const& values ) {\n            m_enumInfos.push_back(makeEnumInfo(enumName, allValueNames, values));\n            return *m_enumInfos.back();\n        }\n\n    } // Detail\n} // Catch\n\n// end catch_enum_values_registry.cpp\n// start catch_errno_guard.cpp\n\n#include <cerrno>\n\nnamespace Catch {\n        ErrnoGuard::ErrnoGuard():m_oldErrno(errno){}\n        ErrnoGuard::~ErrnoGuard() { errno = m_oldErrno; }\n}\n// end catch_errno_guard.cpp\n// start catch_exception_translator_registry.cpp\n\n// start catch_exception_translator_registry.h\n\n#include <vector>\n#include <string>\n#include <memory>\n\nnamespace Catch {\n\n    class ExceptionTranslatorRegistry : public IExceptionTranslatorRegistry {\n    public:\n        ~ExceptionTranslatorRegistry();\n        virtual void registerTranslator( const IExceptionTranslator* translator );\n        std::string translateActiveException() const override;\n        std::string tryTranslators() const;\n\n    private:\n        std::vector<std::unique_ptr<IExceptionTranslator const>> m_translators;\n    };\n}\n\n// end catch_exception_translator_registry.h\n#ifdef __OBJC__\n#import \"Foundation/Foundation.h\"\n#endif\n\nnamespace Catch {\n\n    ExceptionTranslatorRegistry::~ExceptionTranslatorRegistry() {\n    }\n\n    void ExceptionTranslatorRegistry::registerTranslator( const IExceptionTranslator* translator ) {\n        m_translators.push_back( std::unique_ptr<const IExceptionTranslator>( translator ) );\n    }\n\n#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)\n    std::string ExceptionTranslatorRegistry::translateActiveException() const {\n        try {\n#ifdef __OBJC__\n            // In Objective-C try objective-c exceptions first\n            @try {\n                return tryTranslators();\n            }\n            @catch (NSException *exception) {\n                return Catch::Detail::stringify( [exception description] );\n            }\n#else\n            // Compiling a mixed mode project with MSVC means that CLR\n            // exceptions will be caught in (...) as well. However, these\n            // do not fill-in std::current_exception and thus lead to crash\n            // when attempting rethrow.\n            // /EHa switch also causes structured exceptions to be caught\n            // here, but they fill-in current_exception properly, so\n            // at worst the output should be a little weird, instead of\n            // causing a crash.\n            if (std::current_exception() == nullptr) {\n                return \"Non C++ exception. Possibly a CLR exception.\";\n            }\n            return tryTranslators();\n#endif\n        }\n        catch( TestFailureException& ) {\n            std::rethrow_exception(std::current_exception());\n        }\n        catch( std::exception& ex ) {\n            return ex.what();\n        }\n        catch( std::string& msg ) {\n            return msg;\n        }\n        catch( const char* msg ) {\n            return msg;\n        }\n        catch(...) {\n            return \"Unknown exception\";\n        }\n    }\n\n    std::string ExceptionTranslatorRegistry::tryTranslators() const {\n        if (m_translators.empty()) {\n            std::rethrow_exception(std::current_exception());\n        } else {\n            return m_translators[0]->translate(m_translators.begin() + 1, m_translators.end());\n        }\n    }\n\n#else // ^^ Exceptions are enabled // Exceptions are disabled vv\n    std::string ExceptionTranslatorRegistry::translateActiveException() const {\n        CATCH_INTERNAL_ERROR(\"Attempted to translate active exception under CATCH_CONFIG_DISABLE_EXCEPTIONS!\");\n    }\n\n    std::string ExceptionTranslatorRegistry::tryTranslators() const {\n        CATCH_INTERNAL_ERROR(\"Attempted to use exception translators under CATCH_CONFIG_DISABLE_EXCEPTIONS!\");\n    }\n#endif\n\n}\n// end catch_exception_translator_registry.cpp\n// start catch_fatal_condition.cpp\n\n#if defined(__GNUC__)\n#    pragma GCC diagnostic push\n#    pragma GCC diagnostic ignored \"-Wmissing-field-initializers\"\n#endif\n\n#if defined( CATCH_CONFIG_WINDOWS_SEH ) || defined( CATCH_CONFIG_POSIX_SIGNALS )\n\nnamespace {\n    // Report the error condition\n    void reportFatal( char const * const message ) {\n        Catch::getCurrentContext().getResultCapture()->handleFatalErrorCondition( message );\n    }\n}\n\n#endif // signals/SEH handling\n\n#if defined( CATCH_CONFIG_WINDOWS_SEH )\n\nnamespace Catch {\n    struct SignalDefs { DWORD id; const char* name; };\n\n    // There is no 1-1 mapping between signals and windows exceptions.\n    // Windows can easily distinguish between SO and SigSegV,\n    // but SigInt, SigTerm, etc are handled differently.\n    static SignalDefs signalDefs[] = {\n        { static_cast<DWORD>(EXCEPTION_ILLEGAL_INSTRUCTION),  \"SIGILL - Illegal instruction signal\" },\n        { static_cast<DWORD>(EXCEPTION_STACK_OVERFLOW), \"SIGSEGV - Stack overflow\" },\n        { static_cast<DWORD>(EXCEPTION_ACCESS_VIOLATION), \"SIGSEGV - Segmentation violation signal\" },\n        { static_cast<DWORD>(EXCEPTION_INT_DIVIDE_BY_ZERO), \"Divide by zero error\" },\n    };\n\n    LONG CALLBACK FatalConditionHandler::handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo) {\n        for (auto const& def : signalDefs) {\n            if (ExceptionInfo->ExceptionRecord->ExceptionCode == def.id) {\n                reportFatal(def.name);\n            }\n        }\n        // If its not an exception we care about, pass it along.\n        // This stops us from eating debugger breaks etc.\n        return EXCEPTION_CONTINUE_SEARCH;\n    }\n\n    FatalConditionHandler::FatalConditionHandler() {\n        isSet = true;\n        // 32k seems enough for Catch to handle stack overflow,\n        // but the value was found experimentally, so there is no strong guarantee\n        guaranteeSize = 32 * 1024;\n        exceptionHandlerHandle = nullptr;\n        // Register as first handler in current chain\n        exceptionHandlerHandle = AddVectoredExceptionHandler(1, handleVectoredException);\n        // Pass in guarantee size to be filled\n        SetThreadStackGuarantee(&guaranteeSize);\n    }\n\n    void FatalConditionHandler::reset() {\n        if (isSet) {\n            RemoveVectoredExceptionHandler(exceptionHandlerHandle);\n            SetThreadStackGuarantee(&guaranteeSize);\n            exceptionHandlerHandle = nullptr;\n            isSet = false;\n        }\n    }\n\n    FatalConditionHandler::~FatalConditionHandler() {\n        reset();\n    }\n\nbool FatalConditionHandler::isSet = false;\nULONG FatalConditionHandler::guaranteeSize = 0;\nPVOID FatalConditionHandler::exceptionHandlerHandle = nullptr;\n\n} // namespace Catch\n\n#elif defined( CATCH_CONFIG_POSIX_SIGNALS )\n\nnamespace Catch {\n\n    struct SignalDefs {\n        int id;\n        const char* name;\n    };\n\n    // 32kb for the alternate stack seems to be sufficient. However, this value\n    // is experimentally determined, so that's not guaranteed.\n    static constexpr std::size_t sigStackSize = 32768 >= MINSIGSTKSZ ? 32768 : MINSIGSTKSZ;\n\n    static SignalDefs signalDefs[] = {\n        { SIGINT,  \"SIGINT - Terminal interrupt signal\" },\n        { SIGILL,  \"SIGILL - Illegal instruction signal\" },\n        { SIGFPE,  \"SIGFPE - Floating point error signal\" },\n        { SIGSEGV, \"SIGSEGV - Segmentation violation signal\" },\n        { SIGTERM, \"SIGTERM - Termination request signal\" },\n        { SIGABRT, \"SIGABRT - Abort (abnormal termination) signal\" }\n    };\n\n    void FatalConditionHandler::handleSignal( int sig ) {\n        char const * name = \"<unknown signal>\";\n        for (auto const& def : signalDefs) {\n            if (sig == def.id) {\n                name = def.name;\n                break;\n            }\n        }\n        reset();\n        reportFatal(name);\n        raise( sig );\n    }\n\n    FatalConditionHandler::FatalConditionHandler() {\n        isSet = true;\n        stack_t sigStack;\n        sigStack.ss_sp = altStackMem;\n        sigStack.ss_size = sigStackSize;\n        sigStack.ss_flags = 0;\n        sigaltstack(&sigStack, &oldSigStack);\n        struct sigaction sa = { };\n\n        sa.sa_handler = handleSignal;\n        sa.sa_flags = SA_ONSTACK;\n        for (std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i) {\n            sigaction(signalDefs[i].id, &sa, &oldSigActions[i]);\n        }\n    }\n\n    FatalConditionHandler::~FatalConditionHandler() {\n        reset();\n    }\n\n    void FatalConditionHandler::reset() {\n        if( isSet ) {\n            // Set signals back to previous values -- hopefully nobody overwrote them in the meantime\n            for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i ) {\n                sigaction(signalDefs[i].id, &oldSigActions[i], nullptr);\n            }\n            // Return the old stack\n            sigaltstack(&oldSigStack, nullptr);\n            isSet = false;\n        }\n    }\n\n    bool FatalConditionHandler::isSet = false;\n    struct sigaction FatalConditionHandler::oldSigActions[sizeof(signalDefs)/sizeof(SignalDefs)] = {};\n    stack_t FatalConditionHandler::oldSigStack = {};\n    char FatalConditionHandler::altStackMem[sigStackSize] = {};\n\n} // namespace Catch\n\n#else\n\nnamespace Catch {\n    void FatalConditionHandler::reset() {}\n}\n\n#endif // signals/SEH handling\n\n#if defined(__GNUC__)\n#    pragma GCC diagnostic pop\n#endif\n// end catch_fatal_condition.cpp\n// start catch_generators.cpp\n\n#include <limits>\n#include <set>\n\nnamespace Catch {\n\nIGeneratorTracker::~IGeneratorTracker() {}\n\nconst char* GeneratorException::what() const noexcept {\n    return m_msg;\n}\n\nnamespace Generators {\n\n    GeneratorUntypedBase::~GeneratorUntypedBase() {}\n\n    auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& {\n        return getResultCapture().acquireGeneratorTracker( generatorName, lineInfo );\n    }\n\n} // namespace Generators\n} // namespace Catch\n// end catch_generators.cpp\n// start catch_interfaces_capture.cpp\n\nnamespace Catch {\n    IResultCapture::~IResultCapture() = default;\n}\n// end catch_interfaces_capture.cpp\n// start catch_interfaces_config.cpp\n\nnamespace Catch {\n    IConfig::~IConfig() = default;\n}\n// end catch_interfaces_config.cpp\n// start catch_interfaces_exception.cpp\n\nnamespace Catch {\n    IExceptionTranslator::~IExceptionTranslator() = default;\n    IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() = default;\n}\n// end catch_interfaces_exception.cpp\n// start catch_interfaces_registry_hub.cpp\n\nnamespace Catch {\n    IRegistryHub::~IRegistryHub() = default;\n    IMutableRegistryHub::~IMutableRegistryHub() = default;\n}\n// end catch_interfaces_registry_hub.cpp\n// start catch_interfaces_reporter.cpp\n\n// start catch_reporter_listening.h\n\nnamespace Catch {\n\n    class ListeningReporter : public IStreamingReporter {\n        using Reporters = std::vector<IStreamingReporterPtr>;\n        Reporters m_listeners;\n        IStreamingReporterPtr m_reporter = nullptr;\n        ReporterPreferences m_preferences;\n\n    public:\n        ListeningReporter();\n\n        void addListener( IStreamingReporterPtr&& listener );\n        void addReporter( IStreamingReporterPtr&& reporter );\n\n    public: // IStreamingReporter\n\n        ReporterPreferences getPreferences() const override;\n\n        void noMatchingTestCases( std::string const& spec ) override;\n\n        void reportInvalidArguments(std::string const&arg) override;\n\n        static std::set<Verbosity> getSupportedVerbosities();\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n        void benchmarkPreparing(std::string const& name) override;\n        void benchmarkStarting( BenchmarkInfo const& benchmarkInfo ) override;\n        void benchmarkEnded( BenchmarkStats<> const& benchmarkStats ) override;\n        void benchmarkFailed(std::string const&) override;\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\n        void testRunStarting( TestRunInfo const& testRunInfo ) override;\n        void testGroupStarting( GroupInfo const& groupInfo ) override;\n        void testCaseStarting( TestCaseInfo const& testInfo ) override;\n        void sectionStarting( SectionInfo const& sectionInfo ) override;\n        void assertionStarting( AssertionInfo const& assertionInfo ) override;\n\n        // The return value indicates if the messages buffer should be cleared:\n        bool assertionEnded( AssertionStats const& assertionStats ) override;\n        void sectionEnded( SectionStats const& sectionStats ) override;\n        void testCaseEnded( TestCaseStats const& testCaseStats ) override;\n        void testGroupEnded( TestGroupStats const& testGroupStats ) override;\n        void testRunEnded( TestRunStats const& testRunStats ) override;\n\n        void skipTest( TestCaseInfo const& testInfo ) override;\n        bool isMulti() const override;\n\n    };\n\n} // end namespace Catch\n\n// end catch_reporter_listening.h\nnamespace Catch {\n\n    ReporterConfig::ReporterConfig( IConfigPtr const& _fullConfig )\n    :   m_stream( &_fullConfig->stream() ), m_fullConfig( _fullConfig ) {}\n\n    ReporterConfig::ReporterConfig( IConfigPtr const& _fullConfig, std::ostream& _stream )\n    :   m_stream( &_stream ), m_fullConfig( _fullConfig ) {}\n\n    std::ostream& ReporterConfig::stream() const { return *m_stream; }\n    IConfigPtr ReporterConfig::fullConfig() const { return m_fullConfig; }\n\n    TestRunInfo::TestRunInfo( std::string const& _name ) : name( _name ) {}\n\n    GroupInfo::GroupInfo(  std::string const& _name,\n                           std::size_t _groupIndex,\n                           std::size_t _groupsCount )\n    :   name( _name ),\n        groupIndex( _groupIndex ),\n        groupsCounts( _groupsCount )\n    {}\n\n     AssertionStats::AssertionStats( AssertionResult const& _assertionResult,\n                                     std::vector<MessageInfo> const& _infoMessages,\n                                     Totals const& _totals )\n    :   assertionResult( _assertionResult ),\n        infoMessages( _infoMessages ),\n        totals( _totals )\n    {\n        assertionResult.m_resultData.lazyExpression.m_transientExpression = _assertionResult.m_resultData.lazyExpression.m_transientExpression;\n\n        if( assertionResult.hasMessage() ) {\n            // Copy message into messages list.\n            // !TBD This should have been done earlier, somewhere\n            MessageBuilder builder( assertionResult.getTestMacroName(), assertionResult.getSourceInfo(), assertionResult.getResultType() );\n            builder << assertionResult.getMessage();\n            builder.m_info.message = builder.m_stream.str();\n\n            infoMessages.push_back( builder.m_info );\n        }\n    }\n\n     AssertionStats::~AssertionStats() = default;\n\n    SectionStats::SectionStats(  SectionInfo const& _sectionInfo,\n                                 Counts const& _assertions,\n                                 double _durationInSeconds,\n                                 bool _missingAssertions )\n    :   sectionInfo( _sectionInfo ),\n        assertions( _assertions ),\n        durationInSeconds( _durationInSeconds ),\n        missingAssertions( _missingAssertions )\n    {}\n\n    SectionStats::~SectionStats() = default;\n\n    TestCaseStats::TestCaseStats(  TestCaseInfo const& _testInfo,\n                                   Totals const& _totals,\n                                   std::string const& _stdOut,\n                                   std::string const& _stdErr,\n                                   bool _aborting )\n    : testInfo( _testInfo ),\n        totals( _totals ),\n        stdOut( _stdOut ),\n        stdErr( _stdErr ),\n        aborting( _aborting )\n    {}\n\n    TestCaseStats::~TestCaseStats() = default;\n\n    TestGroupStats::TestGroupStats( GroupInfo const& _groupInfo,\n                                    Totals const& _totals,\n                                    bool _aborting )\n    :   groupInfo( _groupInfo ),\n        totals( _totals ),\n        aborting( _aborting )\n    {}\n\n    TestGroupStats::TestGroupStats( GroupInfo const& _groupInfo )\n    :   groupInfo( _groupInfo ),\n        aborting( false )\n    {}\n\n    TestGroupStats::~TestGroupStats() = default;\n\n    TestRunStats::TestRunStats(   TestRunInfo const& _runInfo,\n                    Totals const& _totals,\n                    bool _aborting )\n    :   runInfo( _runInfo ),\n        totals( _totals ),\n        aborting( _aborting )\n    {}\n\n    TestRunStats::~TestRunStats() = default;\n\n    void IStreamingReporter::fatalErrorEncountered( StringRef ) {}\n    bool IStreamingReporter::isMulti() const { return false; }\n\n    IReporterFactory::~IReporterFactory() = default;\n    IReporterRegistry::~IReporterRegistry() = default;\n\n} // end namespace Catch\n// end catch_interfaces_reporter.cpp\n// start catch_interfaces_runner.cpp\n\nnamespace Catch {\n    IRunner::~IRunner() = default;\n}\n// end catch_interfaces_runner.cpp\n// start catch_interfaces_testcase.cpp\n\nnamespace Catch {\n    ITestInvoker::~ITestInvoker() = default;\n    ITestCaseRegistry::~ITestCaseRegistry() = default;\n}\n// end catch_interfaces_testcase.cpp\n// start catch_leak_detector.cpp\n\n#ifdef CATCH_CONFIG_WINDOWS_CRTDBG\n#include <crtdbg.h>\n\nnamespace Catch {\n\n    LeakDetector::LeakDetector() {\n        int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);\n        flag |= _CRTDBG_LEAK_CHECK_DF;\n        flag |= _CRTDBG_ALLOC_MEM_DF;\n        _CrtSetDbgFlag(flag);\n        _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);\n        _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);\n        // Change this to leaking allocation's number to break there\n        _CrtSetBreakAlloc(-1);\n    }\n}\n\n#else\n\n    Catch::LeakDetector::LeakDetector() {}\n\n#endif\n\nCatch::LeakDetector::~LeakDetector() {\n    Catch::cleanUp();\n}\n// end catch_leak_detector.cpp\n// start catch_list.cpp\n\n// start catch_list.h\n\n#include <set>\n\nnamespace Catch {\n\n    std::size_t listTests( Config const& config );\n\n    std::size_t listTestsNamesOnly( Config const& config );\n\n    struct TagInfo {\n        void add( std::string const& spelling );\n        std::string all() const;\n\n        std::set<std::string> spellings;\n        std::size_t count = 0;\n    };\n\n    std::size_t listTags( Config const& config );\n\n    std::size_t listReporters();\n\n    Option<std::size_t> list( std::shared_ptr<Config> const& config );\n\n} // end namespace Catch\n\n// end catch_list.h\n// start catch_text.h\n\nnamespace Catch {\n    using namespace clara::TextFlow;\n}\n\n// end catch_text.h\n#include <limits>\n#include <algorithm>\n#include <iomanip>\n\nnamespace Catch {\n\n    std::size_t listTests( Config const& config ) {\n        TestSpec const& testSpec = config.testSpec();\n        if( config.hasTestFilters() )\n            Catch::cout() << \"Matching test cases:\\n\";\n        else {\n            Catch::cout() << \"All available test cases:\\n\";\n        }\n\n        auto matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config );\n        for( auto const& testCaseInfo : matchedTestCases ) {\n            Colour::Code colour = testCaseInfo.isHidden()\n                ? Colour::SecondaryText\n                : Colour::None;\n            Colour colourGuard( colour );\n\n            Catch::cout() << Column( testCaseInfo.name ).initialIndent( 2 ).indent( 4 ) << \"\\n\";\n            if( config.verbosity() >= Verbosity::High ) {\n                Catch::cout() << Column( Catch::Detail::stringify( testCaseInfo.lineInfo ) ).indent(4) << std::endl;\n                std::string description = testCaseInfo.description;\n                if( description.empty() )\n                    description = \"(NO DESCRIPTION)\";\n                Catch::cout() << Column( description ).indent(4) << std::endl;\n            }\n            if( !testCaseInfo.tags.empty() )\n                Catch::cout() << Column( testCaseInfo.tagsAsString() ).indent( 6 ) << \"\\n\";\n        }\n\n        if( !config.hasTestFilters() )\n            Catch::cout() << pluralise( matchedTestCases.size(), \"test case\" ) << '\\n' << std::endl;\n        else\n            Catch::cout() << pluralise( matchedTestCases.size(), \"matching test case\" ) << '\\n' << std::endl;\n        return matchedTestCases.size();\n    }\n\n    std::size_t listTestsNamesOnly( Config const& config ) {\n        TestSpec const& testSpec = config.testSpec();\n        std::size_t matchedTests = 0;\n        std::vector<TestCase> matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config );\n        for( auto const& testCaseInfo : matchedTestCases ) {\n            matchedTests++;\n            if( startsWith( testCaseInfo.name, '#' ) )\n               Catch::cout() << '\"' << testCaseInfo.name << '\"';\n            else\n               Catch::cout() << testCaseInfo.name;\n            if ( config.verbosity() >= Verbosity::High )\n                Catch::cout() << \"\\t@\" << testCaseInfo.lineInfo;\n            Catch::cout() << std::endl;\n        }\n        return matchedTests;\n    }\n\n    void TagInfo::add( std::string const& spelling ) {\n        ++count;\n        spellings.insert( spelling );\n    }\n\n    std::string TagInfo::all() const {\n        size_t size = 0;\n        for (auto const& spelling : spellings) {\n            // Add 2 for the brackes\n            size += spelling.size() + 2;\n        }\n\n        std::string out; out.reserve(size);\n        for (auto const& spelling : spellings) {\n            out += '[';\n            out += spelling;\n            out += ']';\n        }\n        return out;\n    }\n\n    std::size_t listTags( Config const& config ) {\n        TestSpec const& testSpec = config.testSpec();\n        if( config.hasTestFilters() )\n            Catch::cout() << \"Tags for matching test cases:\\n\";\n        else {\n            Catch::cout() << \"All available tags:\\n\";\n        }\n\n        std::map<std::string, TagInfo> tagCounts;\n\n        std::vector<TestCase> matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config );\n        for( auto const& testCase : matchedTestCases ) {\n            for( auto const& tagName : testCase.getTestCaseInfo().tags ) {\n                std::string lcaseTagName = toLower( tagName );\n                auto countIt = tagCounts.find( lcaseTagName );\n                if( countIt == tagCounts.end() )\n                    countIt = tagCounts.insert( std::make_pair( lcaseTagName, TagInfo() ) ).first;\n                countIt->second.add( tagName );\n            }\n        }\n\n        for( auto const& tagCount : tagCounts ) {\n            ReusableStringStream rss;\n            rss << \"  \" << std::setw(2) << tagCount.second.count << \"  \";\n            auto str = rss.str();\n            auto wrapper = Column( tagCount.second.all() )\n                                                    .initialIndent( 0 )\n                                                    .indent( str.size() )\n                                                    .width( CATCH_CONFIG_CONSOLE_WIDTH-10 );\n            Catch::cout() << str << wrapper << '\\n';\n        }\n        Catch::cout() << pluralise( tagCounts.size(), \"tag\" ) << '\\n' << std::endl;\n        return tagCounts.size();\n    }\n\n    std::size_t listReporters() {\n        Catch::cout() << \"Available reporters:\\n\";\n        IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories();\n        std::size_t maxNameLen = 0;\n        for( auto const& factoryKvp : factories )\n            maxNameLen = (std::max)( maxNameLen, factoryKvp.first.size() );\n\n        for( auto const& factoryKvp : factories ) {\n            Catch::cout()\n                    << Column( factoryKvp.first + \":\" )\n                            .indent(2)\n                            .width( 5+maxNameLen )\n                    +  Column( factoryKvp.second->getDescription() )\n                            .initialIndent(0)\n                            .indent(2)\n                            .width( CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen-8 )\n                    << \"\\n\";\n        }\n        Catch::cout() << std::endl;\n        return factories.size();\n    }\n\n    Option<std::size_t> list( std::shared_ptr<Config> const& config ) {\n        Option<std::size_t> listedCount;\n        getCurrentMutableContext().setConfig( config );\n        if( config->listTests() )\n            listedCount = listedCount.valueOr(0) + listTests( *config );\n        if( config->listTestNamesOnly() )\n            listedCount = listedCount.valueOr(0) + listTestsNamesOnly( *config );\n        if( config->listTags() )\n            listedCount = listedCount.valueOr(0) + listTags( *config );\n        if( config->listReporters() )\n            listedCount = listedCount.valueOr(0) + listReporters();\n        return listedCount;\n    }\n\n} // end namespace Catch\n// end catch_list.cpp\n// start catch_matchers.cpp\n\nnamespace Catch {\nnamespace Matchers {\n    namespace Impl {\n\n        std::string MatcherUntypedBase::toString() const {\n            if( m_cachedToString.empty() )\n                m_cachedToString = describe();\n            return m_cachedToString;\n        }\n\n        MatcherUntypedBase::~MatcherUntypedBase() = default;\n\n    } // namespace Impl\n} // namespace Matchers\n\nusing namespace Matchers;\nusing Matchers::Impl::MatcherBase;\n\n} // namespace Catch\n// end catch_matchers.cpp\n// start catch_matchers_exception.cpp\n\nnamespace Catch {\nnamespace Matchers {\nnamespace Exception {\n\nbool ExceptionMessageMatcher::match(std::exception const& ex) const {\n    return ex.what() == m_message;\n}\n\nstd::string ExceptionMessageMatcher::describe() const {\n    return \"exception message matches \\\"\" + m_message + \"\\\"\";\n}\n\n}\nException::ExceptionMessageMatcher Message(std::string const& message) {\n    return Exception::ExceptionMessageMatcher(message);\n}\n\n// namespace Exception\n} // namespace Matchers\n} // namespace Catch\n// end catch_matchers_exception.cpp\n// start catch_matchers_floating.cpp\n\n// start catch_polyfills.hpp\n\nnamespace Catch {\n    bool isnan(float f);\n    bool isnan(double d);\n}\n\n// end catch_polyfills.hpp\n// start catch_to_string.hpp\n\n#include <string>\n\nnamespace Catch {\n    template <typename T>\n    std::string to_string(T const& t) {\n#if defined(CATCH_CONFIG_CPP11_TO_STRING)\n        return std::to_string(t);\n#else\n        ReusableStringStream rss;\n        rss << t;\n        return rss.str();\n#endif\n    }\n} // end namespace Catch\n\n// end catch_to_string.hpp\n#include <algorithm>\n#include <cmath>\n#include <cstdlib>\n#include <cstdint>\n#include <cstring>\n#include <sstream>\n#include <type_traits>\n#include <iomanip>\n#include <limits>\n\nnamespace Catch {\nnamespace {\n\n    int32_t convert(float f) {\n        static_assert(sizeof(float) == sizeof(int32_t), \"Important ULP matcher assumption violated\");\n        int32_t i;\n        std::memcpy(&i, &f, sizeof(f));\n        return i;\n    }\n\n    int64_t convert(double d) {\n        static_assert(sizeof(double) == sizeof(int64_t), \"Important ULP matcher assumption violated\");\n        int64_t i;\n        std::memcpy(&i, &d, sizeof(d));\n        return i;\n    }\n\n    template <typename FP>\n    bool almostEqualUlps(FP lhs, FP rhs, uint64_t maxUlpDiff) {\n        // Comparison with NaN should always be false.\n        // This way we can rule it out before getting into the ugly details\n        if (Catch::isnan(lhs) || Catch::isnan(rhs)) {\n            return false;\n        }\n\n        auto lc = convert(lhs);\n        auto rc = convert(rhs);\n\n        if ((lc < 0) != (rc < 0)) {\n            // Potentially we can have +0 and -0\n            return lhs == rhs;\n        }\n\n        auto ulpDiff = std::abs(lc - rc);\n        return static_cast<uint64_t>(ulpDiff) <= maxUlpDiff;\n    }\n\n#if defined(CATCH_CONFIG_GLOBAL_NEXTAFTER)\n\n    float nextafter(float x, float y) {\n        return ::nextafterf(x, y);\n    }\n\n    double nextafter(double x, double y) {\n        return ::nextafter(x, y);\n    }\n\n#endif // ^^^ CATCH_CONFIG_GLOBAL_NEXTAFTER ^^^\n\ntemplate <typename FP>\nFP step(FP start, FP direction, uint64_t steps) {\n    for (uint64_t i = 0; i < steps; ++i) {\n#if defined(CATCH_CONFIG_GLOBAL_NEXTAFTER)\n        start = Catch::nextafter(start, direction);\n#else\n        start = std::nextafter(start, direction);\n#endif\n    }\n    return start;\n}\n\n// Performs equivalent check of std::fabs(lhs - rhs) <= margin\n// But without the subtraction to allow for INFINITY in comparison\nbool marginComparison(double lhs, double rhs, double margin) {\n    return (lhs + margin >= rhs) && (rhs + margin >= lhs);\n}\n\ntemplate <typename FloatingPoint>\nvoid write(std::ostream& out, FloatingPoint num) {\n    out << std::scientific\n        << std::setprecision(std::numeric_limits<FloatingPoint>::max_digits10 - 1)\n        << num;\n}\n\n} // end anonymous namespace\n\nnamespace Matchers {\nnamespace Floating {\n\n    enum class FloatingPointKind : uint8_t {\n        Float,\n        Double\n    };\n\n    WithinAbsMatcher::WithinAbsMatcher(double target, double margin)\n        :m_target{ target }, m_margin{ margin } {\n        CATCH_ENFORCE(margin >= 0, \"Invalid margin: \" << margin << '.'\n            << \" Margin has to be non-negative.\");\n    }\n\n    // Performs equivalent check of std::fabs(lhs - rhs) <= margin\n    // But without the subtraction to allow for INFINITY in comparison\n    bool WithinAbsMatcher::match(double const& matchee) const {\n        return (matchee + m_margin >= m_target) && (m_target + m_margin >= matchee);\n    }\n\n    std::string WithinAbsMatcher::describe() const {\n        return \"is within \" + ::Catch::Detail::stringify(m_margin) + \" of \" + ::Catch::Detail::stringify(m_target);\n    }\n\n    WithinUlpsMatcher::WithinUlpsMatcher(double target, uint64_t ulps, FloatingPointKind baseType)\n        :m_target{ target }, m_ulps{ ulps }, m_type{ baseType } {\n        CATCH_ENFORCE(m_type == FloatingPointKind::Double\n                   || m_ulps < (std::numeric_limits<uint32_t>::max)(),\n            \"Provided ULP is impossibly large for a float comparison.\");\n    }\n\n#if defined(__clang__)\n#pragma clang diagnostic push\n// Clang <3.5 reports on the default branch in the switch below\n#pragma clang diagnostic ignored \"-Wunreachable-code\"\n#endif\n\n    bool WithinUlpsMatcher::match(double const& matchee) const {\n        switch (m_type) {\n        case FloatingPointKind::Float:\n            return almostEqualUlps<float>(static_cast<float>(matchee), static_cast<float>(m_target), m_ulps);\n        case FloatingPointKind::Double:\n            return almostEqualUlps<double>(matchee, m_target, m_ulps);\n        default:\n            CATCH_INTERNAL_ERROR( \"Unknown FloatingPointKind value\" );\n        }\n    }\n\n#if defined(__clang__)\n#pragma clang diagnostic pop\n#endif\n\n    std::string WithinUlpsMatcher::describe() const {\n        std::stringstream ret;\n\n        ret << \"is within \" << m_ulps << \" ULPs of \";\n\n        if (m_type == FloatingPointKind::Float) {\n            write(ret, static_cast<float>(m_target));\n            ret << 'f';\n        } else {\n            write(ret, m_target);\n        }\n\n        ret << \" ([\";\n        if (m_type == FloatingPointKind::Double) {\n            write(ret, step(m_target, static_cast<double>(-INFINITY), m_ulps));\n            ret << \", \";\n            write(ret, step(m_target, static_cast<double>( INFINITY), m_ulps));\n        } else {\n            // We have to cast INFINITY to float because of MinGW, see #1782\n            write(ret, step(static_cast<float>(m_target), static_cast<float>(-INFINITY), m_ulps));\n            ret << \", \";\n            write(ret, step(static_cast<float>(m_target), static_cast<float>( INFINITY), m_ulps));\n        }\n        ret << \"])\";\n\n        return ret.str();\n    }\n\n    WithinRelMatcher::WithinRelMatcher(double target, double epsilon):\n        m_target(target),\n        m_epsilon(epsilon){\n        CATCH_ENFORCE(m_epsilon >= 0., \"Relative comparison with epsilon <  0 does not make sense.\");\n        CATCH_ENFORCE(m_epsilon  < 1., \"Relative comparison with epsilon >= 1 does not make sense.\");\n    }\n\n    bool WithinRelMatcher::match(double const& matchee) const {\n        const auto relMargin = m_epsilon * (std::max)(std::fabs(matchee), std::fabs(m_target));\n        return marginComparison(matchee, m_target,\n                                std::isinf(relMargin)? 0 : relMargin);\n    }\n\n    std::string WithinRelMatcher::describe() const {\n        Catch::ReusableStringStream sstr;\n        sstr << \"and \" << m_target << \" are within \" << m_epsilon * 100. << \"% of each other\";\n        return sstr.str();\n    }\n\n}// namespace Floating\n\nFloating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlpDiff) {\n    return Floating::WithinUlpsMatcher(target, maxUlpDiff, Floating::FloatingPointKind::Double);\n}\n\nFloating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpDiff) {\n    return Floating::WithinUlpsMatcher(target, maxUlpDiff, Floating::FloatingPointKind::Float);\n}\n\nFloating::WithinAbsMatcher WithinAbs(double target, double margin) {\n    return Floating::WithinAbsMatcher(target, margin);\n}\n\nFloating::WithinRelMatcher WithinRel(double target, double eps) {\n    return Floating::WithinRelMatcher(target, eps);\n}\n\nFloating::WithinRelMatcher WithinRel(double target) {\n    return Floating::WithinRelMatcher(target, std::numeric_limits<double>::epsilon() * 100);\n}\n\nFloating::WithinRelMatcher WithinRel(float target, float eps) {\n    return Floating::WithinRelMatcher(target, eps);\n}\n\nFloating::WithinRelMatcher WithinRel(float target) {\n    return Floating::WithinRelMatcher(target, std::numeric_limits<float>::epsilon() * 100);\n}\n\n} // namespace Matchers\n} // namespace Catch\n\n// end catch_matchers_floating.cpp\n// start catch_matchers_generic.cpp\n\nstd::string Catch::Matchers::Generic::Detail::finalizeDescription(const std::string& desc) {\n    if (desc.empty()) {\n        return \"matches undescribed predicate\";\n    } else {\n        return \"matches predicate: \\\"\" + desc + '\"';\n    }\n}\n// end catch_matchers_generic.cpp\n// start catch_matchers_string.cpp\n\n#include <regex>\n\nnamespace Catch {\nnamespace Matchers {\n\n    namespace StdString {\n\n        CasedString::CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity )\n        :   m_caseSensitivity( caseSensitivity ),\n            m_str( adjustString( str ) )\n        {}\n        std::string CasedString::adjustString( std::string const& str ) const {\n            return m_caseSensitivity == CaseSensitive::No\n                   ? toLower( str )\n                   : str;\n        }\n        std::string CasedString::caseSensitivitySuffix() const {\n            return m_caseSensitivity == CaseSensitive::No\n                   ? \" (case insensitive)\"\n                   : std::string();\n        }\n\n        StringMatcherBase::StringMatcherBase( std::string const& operation, CasedString const& comparator )\n        : m_comparator( comparator ),\n          m_operation( operation ) {\n        }\n\n        std::string StringMatcherBase::describe() const {\n            std::string description;\n            description.reserve(5 + m_operation.size() + m_comparator.m_str.size() +\n                                        m_comparator.caseSensitivitySuffix().size());\n            description += m_operation;\n            description += \": \\\"\";\n            description += m_comparator.m_str;\n            description += \"\\\"\";\n            description += m_comparator.caseSensitivitySuffix();\n            return description;\n        }\n\n        EqualsMatcher::EqualsMatcher( CasedString const& comparator ) : StringMatcherBase( \"equals\", comparator ) {}\n\n        bool EqualsMatcher::match( std::string const& source ) const {\n            return m_comparator.adjustString( source ) == m_comparator.m_str;\n        }\n\n        ContainsMatcher::ContainsMatcher( CasedString const& comparator ) : StringMatcherBase( \"contains\", comparator ) {}\n\n        bool ContainsMatcher::match( std::string const& source ) const {\n            return contains( m_comparator.adjustString( source ), m_comparator.m_str );\n        }\n\n        StartsWithMatcher::StartsWithMatcher( CasedString const& comparator ) : StringMatcherBase( \"starts with\", comparator ) {}\n\n        bool StartsWithMatcher::match( std::string const& source ) const {\n            return startsWith( m_comparator.adjustString( source ), m_comparator.m_str );\n        }\n\n        EndsWithMatcher::EndsWithMatcher( CasedString const& comparator ) : StringMatcherBase( \"ends with\", comparator ) {}\n\n        bool EndsWithMatcher::match( std::string const& source ) const {\n            return endsWith( m_comparator.adjustString( source ), m_comparator.m_str );\n        }\n\n        RegexMatcher::RegexMatcher(std::string regex, CaseSensitive::Choice caseSensitivity): m_regex(std::move(regex)), m_caseSensitivity(caseSensitivity) {}\n\n        bool RegexMatcher::match(std::string const& matchee) const {\n            auto flags = std::regex::ECMAScript; // ECMAScript is the default syntax option anyway\n            if (m_caseSensitivity == CaseSensitive::Choice::No) {\n                flags |= std::regex::icase;\n            }\n            auto reg = std::regex(m_regex, flags);\n            return std::regex_match(matchee, reg);\n        }\n\n        std::string RegexMatcher::describe() const {\n            return \"matches \" + ::Catch::Detail::stringify(m_regex) + ((m_caseSensitivity == CaseSensitive::Choice::Yes)? \" case sensitively\" : \" case insensitively\");\n        }\n\n    } // namespace StdString\n\n    StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity ) {\n        return StdString::EqualsMatcher( StdString::CasedString( str, caseSensitivity) );\n    }\n    StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity ) {\n        return StdString::ContainsMatcher( StdString::CasedString( str, caseSensitivity) );\n    }\n    StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) {\n        return StdString::EndsWithMatcher( StdString::CasedString( str, caseSensitivity) );\n    }\n    StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) {\n        return StdString::StartsWithMatcher( StdString::CasedString( str, caseSensitivity) );\n    }\n\n    StdString::RegexMatcher Matches(std::string const& regex, CaseSensitive::Choice caseSensitivity) {\n        return StdString::RegexMatcher(regex, caseSensitivity);\n    }\n\n} // namespace Matchers\n} // namespace Catch\n// end catch_matchers_string.cpp\n// start catch_message.cpp\n\n// start catch_uncaught_exceptions.h\n\nnamespace Catch {\n    bool uncaught_exceptions();\n} // end namespace Catch\n\n// end catch_uncaught_exceptions.h\n#include <cassert>\n#include <stack>\n\nnamespace Catch {\n\n    MessageInfo::MessageInfo(   StringRef const& _macroName,\n                                SourceLineInfo const& _lineInfo,\n                                ResultWas::OfType _type )\n    :   macroName( _macroName ),\n        lineInfo( _lineInfo ),\n        type( _type ),\n        sequence( ++globalCount )\n    {}\n\n    bool MessageInfo::operator==( MessageInfo const& other ) const {\n        return sequence == other.sequence;\n    }\n\n    bool MessageInfo::operator<( MessageInfo const& other ) const {\n        return sequence < other.sequence;\n    }\n\n    // This may need protecting if threading support is added\n    unsigned int MessageInfo::globalCount = 0;\n\n    ////////////////////////////////////////////////////////////////////////////\n\n    Catch::MessageBuilder::MessageBuilder( StringRef const& macroName,\n                                           SourceLineInfo const& lineInfo,\n                                           ResultWas::OfType type )\n        :m_info(macroName, lineInfo, type) {}\n\n    ////////////////////////////////////////////////////////////////////////////\n\n    ScopedMessage::ScopedMessage( MessageBuilder const& builder )\n    : m_info( builder.m_info ), m_moved()\n    {\n        m_info.message = builder.m_stream.str();\n        getResultCapture().pushScopedMessage( m_info );\n    }\n\n    ScopedMessage::ScopedMessage( ScopedMessage&& old )\n    : m_info( old.m_info ), m_moved()\n    {\n        old.m_moved = true;\n    }\n\n    ScopedMessage::~ScopedMessage() {\n        if ( !uncaught_exceptions() && !m_moved ){\n            getResultCapture().popScopedMessage(m_info);\n        }\n    }\n\n    Capturer::Capturer( StringRef macroName, SourceLineInfo const& lineInfo, ResultWas::OfType resultType, StringRef names ) {\n        auto trimmed = [&] (size_t start, size_t end) {\n            while (names[start] == ',' || isspace(static_cast<unsigned char>(names[start]))) {\n                ++start;\n            }\n            while (names[end] == ',' || isspace(static_cast<unsigned char>(names[end]))) {\n                --end;\n            }\n            return names.substr(start, end - start + 1);\n        };\n        auto skipq = [&] (size_t start, char quote) {\n            for (auto i = start + 1; i < names.size() ; ++i) {\n                if (names[i] == quote)\n                    return i;\n                if (names[i] == '\\\\')\n                    ++i;\n            }\n            CATCH_INTERNAL_ERROR(\"CAPTURE parsing encountered unmatched quote\");\n        };\n\n        size_t start = 0;\n        std::stack<char> openings;\n        for (size_t pos = 0; pos < names.size(); ++pos) {\n            char c = names[pos];\n            switch (c) {\n            case '[':\n            case '{':\n            case '(':\n            // It is basically impossible to disambiguate between\n            // comparison and start of template args in this context\n//            case '<':\n                openings.push(c);\n                break;\n            case ']':\n            case '}':\n            case ')':\n//           case '>':\n                openings.pop();\n                break;\n            case '\"':\n            case '\\'':\n                pos = skipq(pos, c);\n                break;\n            case ',':\n                if (start != pos && openings.empty()) {\n                    m_messages.emplace_back(macroName, lineInfo, resultType);\n                    m_messages.back().message = static_cast<std::string>(trimmed(start, pos));\n                    m_messages.back().message += \" := \";\n                    start = pos;\n                }\n            }\n        }\n        assert(openings.empty() && \"Mismatched openings\");\n        m_messages.emplace_back(macroName, lineInfo, resultType);\n        m_messages.back().message = static_cast<std::string>(trimmed(start, names.size() - 1));\n        m_messages.back().message += \" := \";\n    }\n    Capturer::~Capturer() {\n        if ( !uncaught_exceptions() ){\n            assert( m_captured == m_messages.size() );\n            for( size_t i = 0; i < m_captured; ++i  )\n                m_resultCapture.popScopedMessage( m_messages[i] );\n        }\n    }\n\n    void Capturer::captureValue( size_t index, std::string const& value ) {\n        assert( index < m_messages.size() );\n        m_messages[index].message += value;\n        m_resultCapture.pushScopedMessage( m_messages[index] );\n        m_captured++;\n    }\n\n} // end namespace Catch\n// end catch_message.cpp\n// start catch_output_redirect.cpp\n\n// start catch_output_redirect.h\n#ifndef TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H\n#define TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H\n\n#include <cstdio>\n#include <iosfwd>\n#include <string>\n\nnamespace Catch {\n\n    class RedirectedStream {\n        std::ostream& m_originalStream;\n        std::ostream& m_redirectionStream;\n        std::streambuf* m_prevBuf;\n\n    public:\n        RedirectedStream( std::ostream& originalStream, std::ostream& redirectionStream );\n        ~RedirectedStream();\n    };\n\n    class RedirectedStdOut {\n        ReusableStringStream m_rss;\n        RedirectedStream m_cout;\n    public:\n        RedirectedStdOut();\n        auto str() const -> std::string;\n    };\n\n    // StdErr has two constituent streams in C++, std::cerr and std::clog\n    // This means that we need to redirect 2 streams into 1 to keep proper\n    // order of writes\n    class RedirectedStdErr {\n        ReusableStringStream m_rss;\n        RedirectedStream m_cerr;\n        RedirectedStream m_clog;\n    public:\n        RedirectedStdErr();\n        auto str() const -> std::string;\n    };\n\n    class RedirectedStreams {\n    public:\n        RedirectedStreams(RedirectedStreams const&) = delete;\n        RedirectedStreams& operator=(RedirectedStreams const&) = delete;\n        RedirectedStreams(RedirectedStreams&&) = delete;\n        RedirectedStreams& operator=(RedirectedStreams&&) = delete;\n\n        RedirectedStreams(std::string& redirectedCout, std::string& redirectedCerr);\n        ~RedirectedStreams();\n    private:\n        std::string& m_redirectedCout;\n        std::string& m_redirectedCerr;\n        RedirectedStdOut m_redirectedStdOut;\n        RedirectedStdErr m_redirectedStdErr;\n    };\n\n#if defined(CATCH_CONFIG_NEW_CAPTURE)\n\n    // Windows's implementation of std::tmpfile is terrible (it tries\n    // to create a file inside system folder, thus requiring elevated\n    // privileges for the binary), so we have to use tmpnam(_s) and\n    // create the file ourselves there.\n    class TempFile {\n    public:\n        TempFile(TempFile const&) = delete;\n        TempFile& operator=(TempFile const&) = delete;\n        TempFile(TempFile&&) = delete;\n        TempFile& operator=(TempFile&&) = delete;\n\n        TempFile();\n        ~TempFile();\n\n        std::FILE* getFile();\n        std::string getContents();\n\n    private:\n        std::FILE* m_file = nullptr;\n    #if defined(_MSC_VER)\n        char m_buffer[L_tmpnam] = { 0 };\n    #endif\n    };\n\n    class OutputRedirect {\n    public:\n        OutputRedirect(OutputRedirect const&) = delete;\n        OutputRedirect& operator=(OutputRedirect const&) = delete;\n        OutputRedirect(OutputRedirect&&) = delete;\n        OutputRedirect& operator=(OutputRedirect&&) = delete;\n\n        OutputRedirect(std::string& stdout_dest, std::string& stderr_dest);\n        ~OutputRedirect();\n\n    private:\n        int m_originalStdout = -1;\n        int m_originalStderr = -1;\n        TempFile m_stdoutFile;\n        TempFile m_stderrFile;\n        std::string& m_stdoutDest;\n        std::string& m_stderrDest;\n    };\n\n#endif\n\n} // end namespace Catch\n\n#endif // TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H\n// end catch_output_redirect.h\n#include <cstdio>\n#include <cstring>\n#include <fstream>\n#include <sstream>\n#include <stdexcept>\n\n#if defined(CATCH_CONFIG_NEW_CAPTURE)\n    #if defined(_MSC_VER)\n    #include <io.h>      //_dup and _dup2\n    #define dup _dup\n    #define dup2 _dup2\n    #define fileno _fileno\n    #else\n    #include <unistd.h>  // dup and dup2\n    #endif\n#endif\n\nnamespace Catch {\n\n    RedirectedStream::RedirectedStream( std::ostream& originalStream, std::ostream& redirectionStream )\n    :   m_originalStream( originalStream ),\n        m_redirectionStream( redirectionStream ),\n        m_prevBuf( m_originalStream.rdbuf() )\n    {\n        m_originalStream.rdbuf( m_redirectionStream.rdbuf() );\n    }\n\n    RedirectedStream::~RedirectedStream() {\n        m_originalStream.rdbuf( m_prevBuf );\n    }\n\n    RedirectedStdOut::RedirectedStdOut() : m_cout( Catch::cout(), m_rss.get() ) {}\n    auto RedirectedStdOut::str() const -> std::string { return m_rss.str(); }\n\n    RedirectedStdErr::RedirectedStdErr()\n    :   m_cerr( Catch::cerr(), m_rss.get() ),\n        m_clog( Catch::clog(), m_rss.get() )\n    {}\n    auto RedirectedStdErr::str() const -> std::string { return m_rss.str(); }\n\n    RedirectedStreams::RedirectedStreams(std::string& redirectedCout, std::string& redirectedCerr)\n    :   m_redirectedCout(redirectedCout),\n        m_redirectedCerr(redirectedCerr)\n    {}\n\n    RedirectedStreams::~RedirectedStreams() {\n        m_redirectedCout += m_redirectedStdOut.str();\n        m_redirectedCerr += m_redirectedStdErr.str();\n    }\n\n#if defined(CATCH_CONFIG_NEW_CAPTURE)\n\n#if defined(_MSC_VER)\n    TempFile::TempFile() {\n        if (tmpnam_s(m_buffer)) {\n            CATCH_RUNTIME_ERROR(\"Could not get a temp filename\");\n        }\n        if (fopen_s(&m_file, m_buffer, \"w\")) {\n            char buffer[100];\n            if (strerror_s(buffer, errno)) {\n                CATCH_RUNTIME_ERROR(\"Could not translate errno to a string\");\n            }\n            CATCH_RUNTIME_ERROR(\"Could not open the temp file: '\" << m_buffer << \"' because: \" << buffer);\n        }\n    }\n#else\n    TempFile::TempFile() {\n        m_file = std::tmpfile();\n        if (!m_file) {\n            CATCH_RUNTIME_ERROR(\"Could not create a temp file.\");\n        }\n    }\n\n#endif\n\n    TempFile::~TempFile() {\n         // TBD: What to do about errors here?\n         std::fclose(m_file);\n         // We manually create the file on Windows only, on Linux\n         // it will be autodeleted\n#if defined(_MSC_VER)\n         std::remove(m_buffer);\n#endif\n    }\n\n    FILE* TempFile::getFile() {\n        return m_file;\n    }\n\n    std::string TempFile::getContents() {\n        std::stringstream sstr;\n        char buffer[100] = {};\n        std::rewind(m_file);\n        while (std::fgets(buffer, sizeof(buffer), m_file)) {\n            sstr << buffer;\n        }\n        return sstr.str();\n    }\n\n    OutputRedirect::OutputRedirect(std::string& stdout_dest, std::string& stderr_dest) :\n        m_originalStdout(dup(1)),\n        m_originalStderr(dup(2)),\n        m_stdoutDest(stdout_dest),\n        m_stderrDest(stderr_dest) {\n        dup2(fileno(m_stdoutFile.getFile()), 1);\n        dup2(fileno(m_stderrFile.getFile()), 2);\n    }\n\n    OutputRedirect::~OutputRedirect() {\n        Catch::cout() << std::flush;\n        fflush(stdout);\n        // Since we support overriding these streams, we flush cerr\n        // even though std::cerr is unbuffered\n        Catch::cerr() << std::flush;\n        Catch::clog() << std::flush;\n        fflush(stderr);\n\n        dup2(m_originalStdout, 1);\n        dup2(m_originalStderr, 2);\n\n        m_stdoutDest += m_stdoutFile.getContents();\n        m_stderrDest += m_stderrFile.getContents();\n    }\n\n#endif // CATCH_CONFIG_NEW_CAPTURE\n\n} // namespace Catch\n\n#if defined(CATCH_CONFIG_NEW_CAPTURE)\n    #if defined(_MSC_VER)\n    #undef dup\n    #undef dup2\n    #undef fileno\n    #endif\n#endif\n// end catch_output_redirect.cpp\n// start catch_polyfills.cpp\n\n#include <cmath>\n\nnamespace Catch {\n\n#if !defined(CATCH_CONFIG_POLYFILL_ISNAN)\n    bool isnan(float f) {\n        return std::isnan(f);\n    }\n    bool isnan(double d) {\n        return std::isnan(d);\n    }\n#else\n    // For now we only use this for embarcadero\n    bool isnan(float f) {\n        return std::_isnan(f);\n    }\n    bool isnan(double d) {\n        return std::_isnan(d);\n    }\n#endif\n\n} // end namespace Catch\n// end catch_polyfills.cpp\n// start catch_random_number_generator.cpp\n\nnamespace Catch {\n\nnamespace {\n\n#if defined(_MSC_VER)\n#pragma warning(push)\n#pragma warning(disable:4146) // we negate uint32 during the rotate\n#endif\n        // Safe rotr implementation thanks to John Regehr\n        uint32_t rotate_right(uint32_t val, uint32_t count) {\n            const uint32_t mask = 31;\n            count &= mask;\n            return (val >> count) | (val << (-count & mask));\n        }\n\n#if defined(_MSC_VER)\n#pragma warning(pop)\n#endif\n\n}\n\n    SimplePcg32::SimplePcg32(result_type seed_) {\n        seed(seed_);\n    }\n\n    void SimplePcg32::seed(result_type seed_) {\n        m_state = 0;\n        (*this)();\n        m_state += seed_;\n        (*this)();\n    }\n\n    void SimplePcg32::discard(uint64_t skip) {\n        // We could implement this to run in O(log n) steps, but this\n        // should suffice for our use case.\n        for (uint64_t s = 0; s < skip; ++s) {\n            static_cast<void>((*this)());\n        }\n    }\n\n    SimplePcg32::result_type SimplePcg32::operator()() {\n        // prepare the output value\n        const uint32_t xorshifted = static_cast<uint32_t>(((m_state >> 18u) ^ m_state) >> 27u);\n        const auto output = rotate_right(xorshifted, m_state >> 59u);\n\n        // advance state\n        m_state = m_state * 6364136223846793005ULL + s_inc;\n\n        return output;\n    }\n\n    bool operator==(SimplePcg32 const& lhs, SimplePcg32 const& rhs) {\n        return lhs.m_state == rhs.m_state;\n    }\n\n    bool operator!=(SimplePcg32 const& lhs, SimplePcg32 const& rhs) {\n        return lhs.m_state != rhs.m_state;\n    }\n}\n// end catch_random_number_generator.cpp\n// start catch_registry_hub.cpp\n\n// start catch_test_case_registry_impl.h\n\n#include <vector>\n#include <set>\n#include <algorithm>\n#include <ios>\n\nnamespace Catch {\n\n    class TestCase;\n    struct IConfig;\n\n    std::vector<TestCase> sortTests( IConfig const& config, std::vector<TestCase> const& unsortedTestCases );\n\n    bool isThrowSafe( TestCase const& testCase, IConfig const& config );\n    bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config );\n\n    void enforceNoDuplicateTestCases( std::vector<TestCase> const& functions );\n\n    std::vector<TestCase> filterTests( std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config );\n    std::vector<TestCase> const& getAllTestCasesSorted( IConfig const& config );\n\n    class TestRegistry : public ITestCaseRegistry {\n    public:\n        virtual ~TestRegistry() = default;\n\n        virtual void registerTest( TestCase const& testCase );\n\n        std::vector<TestCase> const& getAllTests() const override;\n        std::vector<TestCase> const& getAllTestsSorted( IConfig const& config ) const override;\n\n    private:\n        std::vector<TestCase> m_functions;\n        mutable RunTests::InWhatOrder m_currentSortOrder = RunTests::InDeclarationOrder;\n        mutable std::vector<TestCase> m_sortedFunctions;\n        std::size_t m_unnamedCount = 0;\n        std::ios_base::Init m_ostreamInit; // Forces cout/ cerr to be initialised\n    };\n\n    ///////////////////////////////////////////////////////////////////////////\n\n    class TestInvokerAsFunction : public ITestInvoker {\n        void(*m_testAsFunction)();\n    public:\n        TestInvokerAsFunction( void(*testAsFunction)() ) noexcept;\n\n        void invoke() const override;\n    };\n\n    std::string extractClassName( StringRef const& classOrQualifiedMethodName );\n\n    ///////////////////////////////////////////////////////////////////////////\n\n} // end namespace Catch\n\n// end catch_test_case_registry_impl.h\n// start catch_reporter_registry.h\n\n#include <map>\n\nnamespace Catch {\n\n    class ReporterRegistry : public IReporterRegistry {\n\n    public:\n\n        ~ReporterRegistry() override;\n\n        IStreamingReporterPtr create( std::string const& name, IConfigPtr const& config ) const override;\n\n        void registerReporter( std::string const& name, IReporterFactoryPtr const& factory );\n        void registerListener( IReporterFactoryPtr const& factory );\n\n        FactoryMap const& getFactories() const override;\n        Listeners const& getListeners() const override;\n\n    private:\n        FactoryMap m_factories;\n        Listeners m_listeners;\n    };\n}\n\n// end catch_reporter_registry.h\n// start catch_tag_alias_registry.h\n\n// start catch_tag_alias.h\n\n#include <string>\n\nnamespace Catch {\n\n    struct TagAlias {\n        TagAlias(std::string const& _tag, SourceLineInfo _lineInfo);\n\n        std::string tag;\n        SourceLineInfo lineInfo;\n    };\n\n} // end namespace Catch\n\n// end catch_tag_alias.h\n#include <map>\n\nnamespace Catch {\n\n    class TagAliasRegistry : public ITagAliasRegistry {\n    public:\n        ~TagAliasRegistry() override;\n        TagAlias const* find( std::string const& alias ) const override;\n        std::string expandAliases( std::string const& unexpandedTestSpec ) const override;\n        void add( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo );\n\n    private:\n        std::map<std::string, TagAlias> m_registry;\n    };\n\n} // end namespace Catch\n\n// end catch_tag_alias_registry.h\n// start catch_startup_exception_registry.h\n\n#include <vector>\n#include <exception>\n\nnamespace Catch {\n\n    class StartupExceptionRegistry {\n#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)\n    public:\n        void add(std::exception_ptr const& exception) noexcept;\n        std::vector<std::exception_ptr> const& getExceptions() const noexcept;\n    private:\n        std::vector<std::exception_ptr> m_exceptions;\n#endif\n    };\n\n} // end namespace Catch\n\n// end catch_startup_exception_registry.h\n// start catch_singletons.hpp\n\nnamespace Catch {\n\n    struct ISingleton {\n        virtual ~ISingleton();\n    };\n\n    void addSingleton( ISingleton* singleton );\n    void cleanupSingletons();\n\n    template<typename SingletonImplT, typename InterfaceT = SingletonImplT, typename MutableInterfaceT = InterfaceT>\n    class Singleton : SingletonImplT, public ISingleton {\n\n        static auto getInternal() -> Singleton* {\n            static Singleton* s_instance = nullptr;\n            if( !s_instance ) {\n                s_instance = new Singleton;\n                addSingleton( s_instance );\n            }\n            return s_instance;\n        }\n\n    public:\n        static auto get() -> InterfaceT const& {\n            return *getInternal();\n        }\n        static auto getMutable() -> MutableInterfaceT& {\n            return *getInternal();\n        }\n    };\n\n} // namespace Catch\n\n// end catch_singletons.hpp\nnamespace Catch {\n\n    namespace {\n\n        class RegistryHub : public IRegistryHub, public IMutableRegistryHub,\n                            private NonCopyable {\n\n        public: // IRegistryHub\n            RegistryHub() = default;\n            IReporterRegistry const& getReporterRegistry() const override {\n                return m_reporterRegistry;\n            }\n            ITestCaseRegistry const& getTestCaseRegistry() const override {\n                return m_testCaseRegistry;\n            }\n            IExceptionTranslatorRegistry const& getExceptionTranslatorRegistry() const override {\n                return m_exceptionTranslatorRegistry;\n            }\n            ITagAliasRegistry const& getTagAliasRegistry() const override {\n                return m_tagAliasRegistry;\n            }\n            StartupExceptionRegistry const& getStartupExceptionRegistry() const override {\n                return m_exceptionRegistry;\n            }\n\n        public: // IMutableRegistryHub\n            void registerReporter( std::string const& name, IReporterFactoryPtr const& factory ) override {\n                m_reporterRegistry.registerReporter( name, factory );\n            }\n            void registerListener( IReporterFactoryPtr const& factory ) override {\n                m_reporterRegistry.registerListener( factory );\n            }\n            void registerTest( TestCase const& testInfo ) override {\n                m_testCaseRegistry.registerTest( testInfo );\n            }\n            void registerTranslator( const IExceptionTranslator* translator ) override {\n                m_exceptionTranslatorRegistry.registerTranslator( translator );\n            }\n            void registerTagAlias( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) override {\n                m_tagAliasRegistry.add( alias, tag, lineInfo );\n            }\n            void registerStartupException() noexcept override {\n#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)\n                m_exceptionRegistry.add(std::current_exception());\n#else\n                CATCH_INTERNAL_ERROR(\"Attempted to register active exception under CATCH_CONFIG_DISABLE_EXCEPTIONS!\");\n#endif\n            }\n            IMutableEnumValuesRegistry& getMutableEnumValuesRegistry() override {\n                return m_enumValuesRegistry;\n            }\n\n        private:\n            TestRegistry m_testCaseRegistry;\n            ReporterRegistry m_reporterRegistry;\n            ExceptionTranslatorRegistry m_exceptionTranslatorRegistry;\n            TagAliasRegistry m_tagAliasRegistry;\n            StartupExceptionRegistry m_exceptionRegistry;\n            Detail::EnumValuesRegistry m_enumValuesRegistry;\n        };\n    }\n\n    using RegistryHubSingleton = Singleton<RegistryHub, IRegistryHub, IMutableRegistryHub>;\n\n    IRegistryHub const& getRegistryHub() {\n        return RegistryHubSingleton::get();\n    }\n    IMutableRegistryHub& getMutableRegistryHub() {\n        return RegistryHubSingleton::getMutable();\n    }\n    void cleanUp() {\n        cleanupSingletons();\n        cleanUpContext();\n    }\n    std::string translateActiveException() {\n        return getRegistryHub().getExceptionTranslatorRegistry().translateActiveException();\n    }\n\n} // end namespace Catch\n// end catch_registry_hub.cpp\n// start catch_reporter_registry.cpp\n\nnamespace Catch {\n\n    ReporterRegistry::~ReporterRegistry() = default;\n\n    IStreamingReporterPtr ReporterRegistry::create( std::string const& name, IConfigPtr const& config ) const {\n        auto it =  m_factories.find( name );\n        if( it == m_factories.end() )\n            return nullptr;\n        return it->second->create( ReporterConfig( config ) );\n    }\n\n    void ReporterRegistry::registerReporter( std::string const& name, IReporterFactoryPtr const& factory ) {\n        m_factories.emplace(name, factory);\n    }\n    void ReporterRegistry::registerListener( IReporterFactoryPtr const& factory ) {\n        m_listeners.push_back( factory );\n    }\n\n    IReporterRegistry::FactoryMap const& ReporterRegistry::getFactories() const {\n        return m_factories;\n    }\n    IReporterRegistry::Listeners const& ReporterRegistry::getListeners() const {\n        return m_listeners;\n    }\n\n}\n// end catch_reporter_registry.cpp\n// start catch_result_type.cpp\n\nnamespace Catch {\n\n    bool isOk( ResultWas::OfType resultType ) {\n        return ( resultType & ResultWas::FailureBit ) == 0;\n    }\n    bool isJustInfo( int flags ) {\n        return flags == ResultWas::Info;\n    }\n\n    ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) {\n        return static_cast<ResultDisposition::Flags>( static_cast<int>( lhs ) | static_cast<int>( rhs ) );\n    }\n\n    bool shouldContinueOnFailure( int flags )    { return ( flags & ResultDisposition::ContinueOnFailure ) != 0; }\n    bool shouldSuppressFailure( int flags )      { return ( flags & ResultDisposition::SuppressFail ) != 0; }\n\n} // end namespace Catch\n// end catch_result_type.cpp\n// start catch_run_context.cpp\n\n#include <cassert>\n#include <algorithm>\n#include <sstream>\n\nnamespace Catch {\n\n    namespace Generators {\n        struct GeneratorTracker : TestCaseTracking::TrackerBase, IGeneratorTracker {\n            GeneratorBasePtr m_generator;\n\n            GeneratorTracker( TestCaseTracking::NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent )\n            :   TrackerBase( nameAndLocation, ctx, parent )\n            {}\n            ~GeneratorTracker();\n\n            static GeneratorTracker& acquire( TrackerContext& ctx, TestCaseTracking::NameAndLocation const& nameAndLocation ) {\n                std::shared_ptr<GeneratorTracker> tracker;\n\n                ITracker& currentTracker = ctx.currentTracker();\n                // Under specific circumstances, the generator we want\n                // to acquire is also the current tracker. If this is\n                // the case, we have to avoid looking through current\n                // tracker's children, and instead return the current\n                // tracker.\n                // A case where this check is important is e.g.\n                //     for (int i = 0; i < 5; ++i) {\n                //         int n = GENERATE(1, 2);\n                //     }\n                //\n                // without it, the code above creates 5 nested generators.\n                if (currentTracker.nameAndLocation() == nameAndLocation) {\n                    auto thisTracker = currentTracker.parent().findChild(nameAndLocation);\n                    assert(thisTracker);\n                    assert(thisTracker->isGeneratorTracker());\n                    tracker = std::static_pointer_cast<GeneratorTracker>(thisTracker);\n                } else if ( TestCaseTracking::ITrackerPtr childTracker = currentTracker.findChild( nameAndLocation ) ) {\n                    assert( childTracker );\n                    assert( childTracker->isGeneratorTracker() );\n                    tracker = std::static_pointer_cast<GeneratorTracker>( childTracker );\n                } else {\n                    tracker = std::make_shared<GeneratorTracker>( nameAndLocation, ctx, &currentTracker );\n                    currentTracker.addChild( tracker );\n                }\n\n                if( !tracker->isComplete() ) {\n                    tracker->open();\n                }\n\n                return *tracker;\n            }\n\n            // TrackerBase interface\n            bool isGeneratorTracker() const override { return true; }\n            auto hasGenerator() const -> bool override {\n                return !!m_generator;\n            }\n            void close() override {\n                TrackerBase::close();\n                // If a generator has a child (it is followed by a section)\n                // and none of its children have started, then we must wait\n                // until later to start consuming its values.\n                // This catches cases where `GENERATE` is placed between two\n                // `SECTION`s.\n                // **The check for m_children.empty cannot be removed**.\n                // doing so would break `GENERATE` _not_ followed by `SECTION`s.\n                const bool should_wait_for_child =\n                    !m_children.empty() &&\n                    std::find_if( m_children.begin(),\n                                  m_children.end(),\n                                  []( TestCaseTracking::ITrackerPtr tracker ) {\n                                      return tracker->hasStarted();\n                                  } ) == m_children.end();\n\n                // This check is a bit tricky, because m_generator->next()\n                // has a side-effect, where it consumes generator's current\n                // value, but we do not want to invoke the side-effect if\n                // this generator is still waiting for any child to start.\n                if ( should_wait_for_child ||\n                     ( m_runState == CompletedSuccessfully &&\n                       m_generator->next() ) ) {\n                    m_children.clear();\n                    m_runState = Executing;\n                }\n            }\n\n            // IGeneratorTracker interface\n            auto getGenerator() const -> GeneratorBasePtr const& override {\n                return m_generator;\n            }\n            void setGenerator( GeneratorBasePtr&& generator ) override {\n                m_generator = std::move( generator );\n            }\n        };\n        GeneratorTracker::~GeneratorTracker() {}\n    }\n\n    RunContext::RunContext(IConfigPtr const& _config, IStreamingReporterPtr&& reporter)\n    :   m_runInfo(_config->name()),\n        m_context(getCurrentMutableContext()),\n        m_config(_config),\n        m_reporter(std::move(reporter)),\n        m_lastAssertionInfo{ StringRef(), SourceLineInfo(\"\",0), StringRef(), ResultDisposition::Normal },\n        m_includeSuccessfulResults( m_config->includeSuccessfulResults() || m_reporter->getPreferences().shouldReportAllAssertions )\n    {\n        m_context.setRunner(this);\n        m_context.setConfig(m_config);\n        m_context.setResultCapture(this);\n        m_reporter->testRunStarting(m_runInfo);\n    }\n\n    RunContext::~RunContext() {\n        m_reporter->testRunEnded(TestRunStats(m_runInfo, m_totals, aborting()));\n    }\n\n    void RunContext::testGroupStarting(std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount) {\n        m_reporter->testGroupStarting(GroupInfo(testSpec, groupIndex, groupsCount));\n    }\n\n    void RunContext::testGroupEnded(std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount) {\n        m_reporter->testGroupEnded(TestGroupStats(GroupInfo(testSpec, groupIndex, groupsCount), totals, aborting()));\n    }\n\n    Totals RunContext::runTest(TestCase const& testCase) {\n        Totals prevTotals = m_totals;\n\n        std::string redirectedCout;\n        std::string redirectedCerr;\n\n        auto const& testInfo = testCase.getTestCaseInfo();\n\n        m_reporter->testCaseStarting(testInfo);\n\n        m_activeTestCase = &testCase;\n\n        ITracker& rootTracker = m_trackerContext.startRun();\n        assert(rootTracker.isSectionTracker());\n        static_cast<SectionTracker&>(rootTracker).addInitialFilters(m_config->getSectionsToRun());\n        do {\n            m_trackerContext.startCycle();\n            m_testCaseTracker = &SectionTracker::acquire(m_trackerContext, TestCaseTracking::NameAndLocation(testInfo.name, testInfo.lineInfo));\n            runCurrentTest(redirectedCout, redirectedCerr);\n        } while (!m_testCaseTracker->isSuccessfullyCompleted() && !aborting());\n\n        Totals deltaTotals = m_totals.delta(prevTotals);\n        if (testInfo.expectedToFail() && deltaTotals.testCases.passed > 0) {\n            deltaTotals.assertions.failed++;\n            deltaTotals.testCases.passed--;\n            deltaTotals.testCases.failed++;\n        }\n        m_totals.testCases += deltaTotals.testCases;\n        m_reporter->testCaseEnded(TestCaseStats(testInfo,\n                                  deltaTotals,\n                                  redirectedCout,\n                                  redirectedCerr,\n                                  aborting()));\n\n        m_activeTestCase = nullptr;\n        m_testCaseTracker = nullptr;\n\n        return deltaTotals;\n    }\n\n    IConfigPtr RunContext::config() const {\n        return m_config;\n    }\n\n    IStreamingReporter& RunContext::reporter() const {\n        return *m_reporter;\n    }\n\n    void RunContext::assertionEnded(AssertionResult const & result) {\n        if (result.getResultType() == ResultWas::Ok) {\n            m_totals.assertions.passed++;\n            m_lastAssertionPassed = true;\n        } else if (!result.isOk()) {\n            m_lastAssertionPassed = false;\n            if( m_activeTestCase->getTestCaseInfo().okToFail() )\n                m_totals.assertions.failedButOk++;\n            else\n                m_totals.assertions.failed++;\n        }\n        else {\n            m_lastAssertionPassed = true;\n        }\n\n        // We have no use for the return value (whether messages should be cleared), because messages were made scoped\n        // and should be let to clear themselves out.\n        static_cast<void>(m_reporter->assertionEnded(AssertionStats(result, m_messages, m_totals)));\n\n        if (result.getResultType() != ResultWas::Warning)\n            m_messageScopes.clear();\n\n        // Reset working state\n        resetAssertionInfo();\n        m_lastResult = result;\n    }\n    void RunContext::resetAssertionInfo() {\n        m_lastAssertionInfo.macroName = StringRef();\n        m_lastAssertionInfo.capturedExpression = \"{Unknown expression after the reported line}\"_sr;\n    }\n\n    bool RunContext::sectionStarted(SectionInfo const & sectionInfo, Counts & assertions) {\n        ITracker& sectionTracker = SectionTracker::acquire(m_trackerContext, TestCaseTracking::NameAndLocation(sectionInfo.name, sectionInfo.lineInfo));\n        if (!sectionTracker.isOpen())\n            return false;\n        m_activeSections.push_back(&sectionTracker);\n\n        m_lastAssertionInfo.lineInfo = sectionInfo.lineInfo;\n\n        m_reporter->sectionStarting(sectionInfo);\n\n        assertions = m_totals.assertions;\n\n        return true;\n    }\n    auto RunContext::acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& {\n        using namespace Generators;\n        GeneratorTracker& tracker = GeneratorTracker::acquire(m_trackerContext,\n                                                              TestCaseTracking::NameAndLocation( static_cast<std::string>(generatorName), lineInfo ) );\n        m_lastAssertionInfo.lineInfo = lineInfo;\n        return tracker;\n    }\n\n    bool RunContext::testForMissingAssertions(Counts& assertions) {\n        if (assertions.total() != 0)\n            return false;\n        if (!m_config->warnAboutMissingAssertions())\n            return false;\n        if (m_trackerContext.currentTracker().hasChildren())\n            return false;\n        m_totals.assertions.failed++;\n        assertions.failed++;\n        return true;\n    }\n\n    void RunContext::sectionEnded(SectionEndInfo const & endInfo) {\n        Counts assertions = m_totals.assertions - endInfo.prevAssertions;\n        bool missingAssertions = testForMissingAssertions(assertions);\n\n        if (!m_activeSections.empty()) {\n            m_activeSections.back()->close();\n            m_activeSections.pop_back();\n        }\n\n        m_reporter->sectionEnded(SectionStats(endInfo.sectionInfo, assertions, endInfo.durationInSeconds, missingAssertions));\n        m_messages.clear();\n        m_messageScopes.clear();\n    }\n\n    void RunContext::sectionEndedEarly(SectionEndInfo const & endInfo) {\n        if (m_unfinishedSections.empty())\n            m_activeSections.back()->fail();\n        else\n            m_activeSections.back()->close();\n        m_activeSections.pop_back();\n\n        m_unfinishedSections.push_back(endInfo);\n    }\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n    void RunContext::benchmarkPreparing(std::string const& name) {\n        m_reporter->benchmarkPreparing(name);\n    }\n    void RunContext::benchmarkStarting( BenchmarkInfo const& info ) {\n        m_reporter->benchmarkStarting( info );\n    }\n    void RunContext::benchmarkEnded( BenchmarkStats<> const& stats ) {\n        m_reporter->benchmarkEnded( stats );\n    }\n    void RunContext::benchmarkFailed(std::string const & error) {\n        m_reporter->benchmarkFailed(error);\n    }\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\n    void RunContext::pushScopedMessage(MessageInfo const & message) {\n        m_messages.push_back(message);\n    }\n\n    void RunContext::popScopedMessage(MessageInfo const & message) {\n        m_messages.erase(std::remove(m_messages.begin(), m_messages.end(), message), m_messages.end());\n    }\n\n    void RunContext::emplaceUnscopedMessage( MessageBuilder const& builder ) {\n        m_messageScopes.emplace_back( builder );\n    }\n\n    std::string RunContext::getCurrentTestName() const {\n        return m_activeTestCase\n            ? m_activeTestCase->getTestCaseInfo().name\n            : std::string();\n    }\n\n    const AssertionResult * RunContext::getLastResult() const {\n        return &(*m_lastResult);\n    }\n\n    void RunContext::exceptionEarlyReported() {\n        m_shouldReportUnexpected = false;\n    }\n\n    void RunContext::handleFatalErrorCondition( StringRef message ) {\n        // First notify reporter that bad things happened\n        m_reporter->fatalErrorEncountered(message);\n\n        // Don't rebuild the result -- the stringification itself can cause more fatal errors\n        // Instead, fake a result data.\n        AssertionResultData tempResult( ResultWas::FatalErrorCondition, { false } );\n        tempResult.message = static_cast<std::string>(message);\n        AssertionResult result(m_lastAssertionInfo, tempResult);\n\n        assertionEnded(result);\n\n        handleUnfinishedSections();\n\n        // Recreate section for test case (as we will lose the one that was in scope)\n        auto const& testCaseInfo = m_activeTestCase->getTestCaseInfo();\n        SectionInfo testCaseSection(testCaseInfo.lineInfo, testCaseInfo.name);\n\n        Counts assertions;\n        assertions.failed = 1;\n        SectionStats testCaseSectionStats(testCaseSection, assertions, 0, false);\n        m_reporter->sectionEnded(testCaseSectionStats);\n\n        auto const& testInfo = m_activeTestCase->getTestCaseInfo();\n\n        Totals deltaTotals;\n        deltaTotals.testCases.failed = 1;\n        deltaTotals.assertions.failed = 1;\n        m_reporter->testCaseEnded(TestCaseStats(testInfo,\n                                  deltaTotals,\n                                  std::string(),\n                                  std::string(),\n                                  false));\n        m_totals.testCases.failed++;\n        testGroupEnded(std::string(), m_totals, 1, 1);\n        m_reporter->testRunEnded(TestRunStats(m_runInfo, m_totals, false));\n    }\n\n    bool RunContext::lastAssertionPassed() {\n         return m_lastAssertionPassed;\n    }\n\n    void RunContext::assertionPassed() {\n        m_lastAssertionPassed = true;\n        ++m_totals.assertions.passed;\n        resetAssertionInfo();\n        m_messageScopes.clear();\n    }\n\n    bool RunContext::aborting() const {\n        return m_totals.assertions.failed >= static_cast<std::size_t>(m_config->abortAfter());\n    }\n\n    void RunContext::runCurrentTest(std::string & redirectedCout, std::string & redirectedCerr) {\n        auto const& testCaseInfo = m_activeTestCase->getTestCaseInfo();\n        SectionInfo testCaseSection(testCaseInfo.lineInfo, testCaseInfo.name);\n        m_reporter->sectionStarting(testCaseSection);\n        Counts prevAssertions = m_totals.assertions;\n        double duration = 0;\n        m_shouldReportUnexpected = true;\n        m_lastAssertionInfo = { \"TEST_CASE\"_sr, testCaseInfo.lineInfo, StringRef(), ResultDisposition::Normal };\n\n        seedRng(*m_config);\n\n        Timer timer;\n        CATCH_TRY {\n            if (m_reporter->getPreferences().shouldRedirectStdOut) {\n#if !defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT)\n                RedirectedStreams redirectedStreams(redirectedCout, redirectedCerr);\n\n                timer.start();\n                invokeActiveTestCase();\n#else\n                OutputRedirect r(redirectedCout, redirectedCerr);\n                timer.start();\n                invokeActiveTestCase();\n#endif\n            } else {\n                timer.start();\n                invokeActiveTestCase();\n            }\n            duration = timer.getElapsedSeconds();\n        } CATCH_CATCH_ANON (TestFailureException&) {\n            // This just means the test was aborted due to failure\n        } CATCH_CATCH_ALL {\n            // Under CATCH_CONFIG_FAST_COMPILE, unexpected exceptions under REQUIRE assertions\n            // are reported without translation at the point of origin.\n            if( m_shouldReportUnexpected ) {\n                AssertionReaction dummyReaction;\n                handleUnexpectedInflightException( m_lastAssertionInfo, translateActiveException(), dummyReaction );\n            }\n        }\n        Counts assertions = m_totals.assertions - prevAssertions;\n        bool missingAssertions = testForMissingAssertions(assertions);\n\n        m_testCaseTracker->close();\n        handleUnfinishedSections();\n        m_messages.clear();\n        m_messageScopes.clear();\n\n        SectionStats testCaseSectionStats(testCaseSection, assertions, duration, missingAssertions);\n        m_reporter->sectionEnded(testCaseSectionStats);\n    }\n\n    void RunContext::invokeActiveTestCase() {\n        FatalConditionHandler fatalConditionHandler; // Handle signals\n        m_activeTestCase->invoke();\n        fatalConditionHandler.reset();\n    }\n\n    void RunContext::handleUnfinishedSections() {\n        // If sections ended prematurely due to an exception we stored their\n        // infos here so we can tear them down outside the unwind process.\n        for (auto it = m_unfinishedSections.rbegin(),\n             itEnd = m_unfinishedSections.rend();\n             it != itEnd;\n             ++it)\n            sectionEnded(*it);\n        m_unfinishedSections.clear();\n    }\n\n    void RunContext::handleExpr(\n        AssertionInfo const& info,\n        ITransientExpression const& expr,\n        AssertionReaction& reaction\n    ) {\n        m_reporter->assertionStarting( info );\n\n        bool negated = isFalseTest( info.resultDisposition );\n        bool result = expr.getResult() != negated;\n\n        if( result ) {\n            if (!m_includeSuccessfulResults) {\n                assertionPassed();\n            }\n            else {\n                reportExpr(info, ResultWas::Ok, &expr, negated);\n            }\n        }\n        else {\n            reportExpr(info, ResultWas::ExpressionFailed, &expr, negated );\n            populateReaction( reaction );\n        }\n    }\n    void RunContext::reportExpr(\n            AssertionInfo const &info,\n            ResultWas::OfType resultType,\n            ITransientExpression const *expr,\n            bool negated ) {\n\n        m_lastAssertionInfo = info;\n        AssertionResultData data( resultType, LazyExpression( negated ) );\n\n        AssertionResult assertionResult{ info, data };\n        assertionResult.m_resultData.lazyExpression.m_transientExpression = expr;\n\n        assertionEnded( assertionResult );\n    }\n\n    void RunContext::handleMessage(\n            AssertionInfo const& info,\n            ResultWas::OfType resultType,\n            StringRef const& message,\n            AssertionReaction& reaction\n    ) {\n        m_reporter->assertionStarting( info );\n\n        m_lastAssertionInfo = info;\n\n        AssertionResultData data( resultType, LazyExpression( false ) );\n        data.message = static_cast<std::string>(message);\n        AssertionResult assertionResult{ m_lastAssertionInfo, data };\n        assertionEnded( assertionResult );\n        if( !assertionResult.isOk() )\n            populateReaction( reaction );\n    }\n    void RunContext::handleUnexpectedExceptionNotThrown(\n            AssertionInfo const& info,\n            AssertionReaction& reaction\n    ) {\n        handleNonExpr(info, Catch::ResultWas::DidntThrowException, reaction);\n    }\n\n    void RunContext::handleUnexpectedInflightException(\n            AssertionInfo const& info,\n            std::string const& message,\n            AssertionReaction& reaction\n    ) {\n        m_lastAssertionInfo = info;\n\n        AssertionResultData data( ResultWas::ThrewException, LazyExpression( false ) );\n        data.message = message;\n        AssertionResult assertionResult{ info, data };\n        assertionEnded( assertionResult );\n        populateReaction( reaction );\n    }\n\n    void RunContext::populateReaction( AssertionReaction& reaction ) {\n        reaction.shouldDebugBreak = m_config->shouldDebugBreak();\n        reaction.shouldThrow = aborting() || (m_lastAssertionInfo.resultDisposition & ResultDisposition::Normal);\n    }\n\n    void RunContext::handleIncomplete(\n            AssertionInfo const& info\n    ) {\n        m_lastAssertionInfo = info;\n\n        AssertionResultData data( ResultWas::ThrewException, LazyExpression( false ) );\n        data.message = \"Exception translation was disabled by CATCH_CONFIG_FAST_COMPILE\";\n        AssertionResult assertionResult{ info, data };\n        assertionEnded( assertionResult );\n    }\n    void RunContext::handleNonExpr(\n            AssertionInfo const &info,\n            ResultWas::OfType resultType,\n            AssertionReaction &reaction\n    ) {\n        m_lastAssertionInfo = info;\n\n        AssertionResultData data( resultType, LazyExpression( false ) );\n        AssertionResult assertionResult{ info, data };\n        assertionEnded( assertionResult );\n\n        if( !assertionResult.isOk() )\n            populateReaction( reaction );\n    }\n\n    IResultCapture& getResultCapture() {\n        if (auto* capture = getCurrentContext().getResultCapture())\n            return *capture;\n        else\n            CATCH_INTERNAL_ERROR(\"No result capture instance\");\n    }\n\n    void seedRng(IConfig const& config) {\n        if (config.rngSeed() != 0) {\n            std::srand(config.rngSeed());\n            rng().seed(config.rngSeed());\n        }\n    }\n\n    unsigned int rngSeed() {\n        return getCurrentContext().getConfig()->rngSeed();\n    }\n\n}\n// end catch_run_context.cpp\n// start catch_section.cpp\n\nnamespace Catch {\n\n    Section::Section( SectionInfo const& info )\n    :   m_info( info ),\n        m_sectionIncluded( getResultCapture().sectionStarted( m_info, m_assertions ) )\n    {\n        m_timer.start();\n    }\n\n    Section::~Section() {\n        if( m_sectionIncluded ) {\n            SectionEndInfo endInfo{ m_info, m_assertions, m_timer.getElapsedSeconds() };\n            if( uncaught_exceptions() )\n                getResultCapture().sectionEndedEarly( endInfo );\n            else\n                getResultCapture().sectionEnded( endInfo );\n        }\n    }\n\n    // This indicates whether the section should be executed or not\n    Section::operator bool() const {\n        return m_sectionIncluded;\n    }\n\n} // end namespace Catch\n// end catch_section.cpp\n// start catch_section_info.cpp\n\nnamespace Catch {\n\n    SectionInfo::SectionInfo\n        (   SourceLineInfo const& _lineInfo,\n            std::string const& _name )\n    :   name( _name ),\n        lineInfo( _lineInfo )\n    {}\n\n} // end namespace Catch\n// end catch_section_info.cpp\n// start catch_session.cpp\n\n// start catch_session.h\n\n#include <memory>\n\nnamespace Catch {\n\n    class Session : NonCopyable {\n    public:\n\n        Session();\n        ~Session() override;\n\n        void showHelp() const;\n        void libIdentify();\n\n        int applyCommandLine( int argc, char const * const * argv );\n    #if defined(CATCH_CONFIG_WCHAR) && defined(_WIN32) && defined(UNICODE)\n        int applyCommandLine( int argc, wchar_t const * const * argv );\n    #endif\n\n        void useConfigData( ConfigData const& configData );\n\n        template<typename CharT>\n        int run(int argc, CharT const * const argv[]) {\n            if (m_startupExceptions)\n                return 1;\n            int returnCode = applyCommandLine(argc, argv);\n            if (returnCode == 0)\n                returnCode = run();\n            return returnCode;\n        }\n\n        int run();\n\n        clara::Parser const& cli() const;\n        void cli( clara::Parser const& newParser );\n        ConfigData& configData();\n        Config& config();\n    private:\n        int runInternal();\n\n        clara::Parser m_cli;\n        ConfigData m_configData;\n        std::shared_ptr<Config> m_config;\n        bool m_startupExceptions = false;\n    };\n\n} // end namespace Catch\n\n// end catch_session.h\n// start catch_version.h\n\n#include <iosfwd>\n\nnamespace Catch {\n\n    // Versioning information\n    struct Version {\n        Version( Version const& ) = delete;\n        Version& operator=( Version const& ) = delete;\n        Version(    unsigned int _majorVersion,\n                    unsigned int _minorVersion,\n                    unsigned int _patchNumber,\n                    char const * const _branchName,\n                    unsigned int _buildNumber );\n\n        unsigned int const majorVersion;\n        unsigned int const minorVersion;\n        unsigned int const patchNumber;\n\n        // buildNumber is only used if branchName is not null\n        char const * const branchName;\n        unsigned int const buildNumber;\n\n        friend std::ostream& operator << ( std::ostream& os, Version const& version );\n    };\n\n    Version const& libraryVersion();\n}\n\n// end catch_version.h\n#include <cstdlib>\n#include <iomanip>\n#include <set>\n#include <iterator>\n\nnamespace Catch {\n\n    namespace {\n        const int MaxExitCode = 255;\n\n        IStreamingReporterPtr createReporter(std::string const& reporterName, IConfigPtr const& config) {\n            auto reporter = Catch::getRegistryHub().getReporterRegistry().create(reporterName, config);\n            CATCH_ENFORCE(reporter, \"No reporter registered with name: '\" << reporterName << \"'\");\n\n            return reporter;\n        }\n\n        IStreamingReporterPtr makeReporter(std::shared_ptr<Config> const& config) {\n            if (Catch::getRegistryHub().getReporterRegistry().getListeners().empty()) {\n                return createReporter(config->getReporterName(), config);\n            }\n\n            // On older platforms, returning std::unique_ptr<ListeningReporter>\n            // when the return type is std::unique_ptr<IStreamingReporter>\n            // doesn't compile without a std::move call. However, this causes\n            // a warning on newer platforms. Thus, we have to work around\n            // it a bit and downcast the pointer manually.\n            auto ret = std::unique_ptr<IStreamingReporter>(new ListeningReporter);\n            auto& multi = static_cast<ListeningReporter&>(*ret);\n            auto const& listeners = Catch::getRegistryHub().getReporterRegistry().getListeners();\n            for (auto const& listener : listeners) {\n                multi.addListener(listener->create(Catch::ReporterConfig(config)));\n            }\n            multi.addReporter(createReporter(config->getReporterName(), config));\n            return ret;\n        }\n\n        class TestGroup {\n        public:\n            explicit TestGroup(std::shared_ptr<Config> const& config)\n            : m_config{config}\n            , m_context{config, makeReporter(config)}\n            {\n                auto const& allTestCases = getAllTestCasesSorted(*m_config);\n                m_matches = m_config->testSpec().matchesByFilter(allTestCases, *m_config);\n                auto const& invalidArgs = m_config->testSpec().getInvalidArgs();\n\n                if (m_matches.empty() && invalidArgs.empty()) {\n                    for (auto const& test : allTestCases)\n                        if (!test.isHidden())\n                            m_tests.emplace(&test);\n                } else {\n                    for (auto const& match : m_matches)\n                        m_tests.insert(match.tests.begin(), match.tests.end());\n                }\n            }\n\n            Totals execute() {\n                auto const& invalidArgs = m_config->testSpec().getInvalidArgs();\n                Totals totals;\n                m_context.testGroupStarting(m_config->name(), 1, 1);\n                for (auto const& testCase : m_tests) {\n                    if (!m_context.aborting())\n                        totals += m_context.runTest(*testCase);\n                    else\n                        m_context.reporter().skipTest(*testCase);\n                }\n\n                for (auto const& match : m_matches) {\n                    if (match.tests.empty()) {\n                        m_context.reporter().noMatchingTestCases(match.name);\n                        totals.error = -1;\n                    }\n                }\n\n                if (!invalidArgs.empty()) {\n                    for (auto const& invalidArg: invalidArgs)\n                         m_context.reporter().reportInvalidArguments(invalidArg);\n                }\n\n                m_context.testGroupEnded(m_config->name(), totals, 1, 1);\n                return totals;\n            }\n\n        private:\n            using Tests = std::set<TestCase const*>;\n\n            std::shared_ptr<Config> m_config;\n            RunContext m_context;\n            Tests m_tests;\n            TestSpec::Matches m_matches;\n        };\n\n        void applyFilenamesAsTags(Catch::IConfig const& config) {\n            auto& tests = const_cast<std::vector<TestCase>&>(getAllTestCasesSorted(config));\n            for (auto& testCase : tests) {\n                auto tags = testCase.tags;\n\n                std::string filename = testCase.lineInfo.file;\n                auto lastSlash = filename.find_last_of(\"\\\\/\");\n                if (lastSlash != std::string::npos) {\n                    filename.erase(0, lastSlash);\n                    filename[0] = '#';\n                }\n\n                auto lastDot = filename.find_last_of('.');\n                if (lastDot != std::string::npos) {\n                    filename.erase(lastDot);\n                }\n\n                tags.push_back(std::move(filename));\n                setTags(testCase, tags);\n            }\n        }\n\n    } // anon namespace\n\n    Session::Session() {\n        static bool alreadyInstantiated = false;\n        if( alreadyInstantiated ) {\n            CATCH_TRY { CATCH_INTERNAL_ERROR( \"Only one instance of Catch::Session can ever be used\" ); }\n            CATCH_CATCH_ALL { getMutableRegistryHub().registerStartupException(); }\n        }\n\n        // There cannot be exceptions at startup in no-exception mode.\n#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)\n        const auto& exceptions = getRegistryHub().getStartupExceptionRegistry().getExceptions();\n        if ( !exceptions.empty() ) {\n            config();\n            getCurrentMutableContext().setConfig(m_config);\n\n            m_startupExceptions = true;\n            Colour colourGuard( Colour::Red );\n            Catch::cerr() << \"Errors occurred during startup!\" << '\\n';\n            // iterate over all exceptions and notify user\n            for ( const auto& ex_ptr : exceptions ) {\n                try {\n                    std::rethrow_exception(ex_ptr);\n                } catch ( std::exception const& ex ) {\n                    Catch::cerr() << Column( ex.what() ).indent(2) << '\\n';\n                }\n            }\n        }\n#endif\n\n        alreadyInstantiated = true;\n        m_cli = makeCommandLineParser( m_configData );\n    }\n    Session::~Session() {\n        Catch::cleanUp();\n    }\n\n    void Session::showHelp() const {\n        Catch::cout()\n                << \"\\nCatch v\" << libraryVersion() << \"\\n\"\n                << m_cli << std::endl\n                << \"For more detailed usage please see the project docs\\n\" << std::endl;\n    }\n    void Session::libIdentify() {\n        Catch::cout()\n                << std::left << std::setw(16) << \"description: \" << \"A Catch2 test executable\\n\"\n                << std::left << std::setw(16) << \"category: \" << \"testframework\\n\"\n                << std::left << std::setw(16) << \"framework: \" << \"Catch Test\\n\"\n                << std::left << std::setw(16) << \"version: \" << libraryVersion() << std::endl;\n    }\n\n    int Session::applyCommandLine( int argc, char const * const * argv ) {\n        if( m_startupExceptions )\n            return 1;\n\n        auto result = m_cli.parse( clara::Args( argc, argv ) );\n        if( !result ) {\n            config();\n            getCurrentMutableContext().setConfig(m_config);\n            Catch::cerr()\n                << Colour( Colour::Red )\n                << \"\\nError(s) in input:\\n\"\n                << Column( result.errorMessage() ).indent( 2 )\n                << \"\\n\\n\";\n            Catch::cerr() << \"Run with -? for usage\\n\" << std::endl;\n            return MaxExitCode;\n        }\n\n        if( m_configData.showHelp )\n            showHelp();\n        if( m_configData.libIdentify )\n            libIdentify();\n        m_config.reset();\n        return 0;\n    }\n\n#if defined(CATCH_CONFIG_WCHAR) && defined(_WIN32) && defined(UNICODE)\n    int Session::applyCommandLine( int argc, wchar_t const * const * argv ) {\n\n        char **utf8Argv = new char *[ argc ];\n\n        for ( int i = 0; i < argc; ++i ) {\n            int bufSize = WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, nullptr, 0, nullptr, nullptr );\n\n            utf8Argv[ i ] = new char[ bufSize ];\n\n            WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, utf8Argv[i], bufSize, nullptr, nullptr );\n        }\n\n        int returnCode = applyCommandLine( argc, utf8Argv );\n\n        for ( int i = 0; i < argc; ++i )\n            delete [] utf8Argv[ i ];\n\n        delete [] utf8Argv;\n\n        return returnCode;\n    }\n#endif\n\n    void Session::useConfigData( ConfigData const& configData ) {\n        m_configData = configData;\n        m_config.reset();\n    }\n\n    int Session::run() {\n        if( ( m_configData.waitForKeypress & WaitForKeypress::BeforeStart ) != 0 ) {\n            Catch::cout() << \"...waiting for enter/ return before starting\" << std::endl;\n            static_cast<void>(std::getchar());\n        }\n        int exitCode = runInternal();\n        if( ( m_configData.waitForKeypress & WaitForKeypress::BeforeExit ) != 0 ) {\n            Catch::cout() << \"...waiting for enter/ return before exiting, with code: \" << exitCode << std::endl;\n            static_cast<void>(std::getchar());\n        }\n        return exitCode;\n    }\n\n    clara::Parser const& Session::cli() const {\n        return m_cli;\n    }\n    void Session::cli( clara::Parser const& newParser ) {\n        m_cli = newParser;\n    }\n    ConfigData& Session::configData() {\n        return m_configData;\n    }\n    Config& Session::config() {\n        if( !m_config )\n            m_config = std::make_shared<Config>( m_configData );\n        return *m_config;\n    }\n\n    int Session::runInternal() {\n        if( m_startupExceptions )\n            return 1;\n\n        if (m_configData.showHelp || m_configData.libIdentify) {\n            return 0;\n        }\n\n        CATCH_TRY {\n            config(); // Force config to be constructed\n\n            seedRng( *m_config );\n\n            if( m_configData.filenamesAsTags )\n                applyFilenamesAsTags( *m_config );\n\n            // Handle list request\n            if( Option<std::size_t> listed = list( m_config ) )\n                return static_cast<int>( *listed );\n\n            TestGroup tests { m_config };\n            auto const totals = tests.execute();\n\n            if( m_config->warnAboutNoTests() && totals.error == -1 )\n                return 2;\n\n            // Note that on unices only the lower 8 bits are usually used, clamping\n            // the return value to 255 prevents false negative when some multiple\n            // of 256 tests has failed\n            return (std::min) (MaxExitCode, (std::max) (totals.error, static_cast<int>(totals.assertions.failed)));\n        }\n#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)\n        catch( std::exception& ex ) {\n            Catch::cerr() << ex.what() << std::endl;\n            return MaxExitCode;\n        }\n#endif\n    }\n\n} // end namespace Catch\n// end catch_session.cpp\n// start catch_singletons.cpp\n\n#include <vector>\n\nnamespace Catch {\n\n    namespace {\n        static auto getSingletons() -> std::vector<ISingleton*>*& {\n            static std::vector<ISingleton*>* g_singletons = nullptr;\n            if( !g_singletons )\n                g_singletons = new std::vector<ISingleton*>();\n            return g_singletons;\n        }\n    }\n\n    ISingleton::~ISingleton() {}\n\n    void addSingleton(ISingleton* singleton ) {\n        getSingletons()->push_back( singleton );\n    }\n    void cleanupSingletons() {\n        auto& singletons = getSingletons();\n        for( auto singleton : *singletons )\n            delete singleton;\n        delete singletons;\n        singletons = nullptr;\n    }\n\n} // namespace Catch\n// end catch_singletons.cpp\n// start catch_startup_exception_registry.cpp\n\n#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)\nnamespace Catch {\nvoid StartupExceptionRegistry::add( std::exception_ptr const& exception ) noexcept {\n        CATCH_TRY {\n            m_exceptions.push_back(exception);\n        } CATCH_CATCH_ALL {\n            // If we run out of memory during start-up there's really not a lot more we can do about it\n            std::terminate();\n        }\n    }\n\n    std::vector<std::exception_ptr> const& StartupExceptionRegistry::getExceptions() const noexcept {\n        return m_exceptions;\n    }\n\n} // end namespace Catch\n#endif\n// end catch_startup_exception_registry.cpp\n// start catch_stream.cpp\n\n#include <cstdio>\n#include <iostream>\n#include <fstream>\n#include <sstream>\n#include <vector>\n#include <memory>\n\nnamespace Catch {\n\n    Catch::IStream::~IStream() = default;\n\n    namespace Detail { namespace {\n        template<typename WriterF, std::size_t bufferSize=256>\n        class StreamBufImpl : public std::streambuf {\n            char data[bufferSize];\n            WriterF m_writer;\n\n        public:\n            StreamBufImpl() {\n                setp( data, data + sizeof(data) );\n            }\n\n            ~StreamBufImpl() noexcept {\n                StreamBufImpl::sync();\n            }\n\n        private:\n            int overflow( int c ) override {\n                sync();\n\n                if( c != EOF ) {\n                    if( pbase() == epptr() )\n                        m_writer( std::string( 1, static_cast<char>( c ) ) );\n                    else\n                        sputc( static_cast<char>( c ) );\n                }\n                return 0;\n            }\n\n            int sync() override {\n                if( pbase() != pptr() ) {\n                    m_writer( std::string( pbase(), static_cast<std::string::size_type>( pptr() - pbase() ) ) );\n                    setp( pbase(), epptr() );\n                }\n                return 0;\n            }\n        };\n\n        ///////////////////////////////////////////////////////////////////////////\n\n        struct OutputDebugWriter {\n\n            void operator()( std::string const&str ) {\n                writeToDebugConsole( str );\n            }\n        };\n\n        ///////////////////////////////////////////////////////////////////////////\n\n        class FileStream : public IStream {\n            mutable std::ofstream m_ofs;\n        public:\n            FileStream( StringRef filename ) {\n                m_ofs.open( filename.c_str() );\n                CATCH_ENFORCE( !m_ofs.fail(), \"Unable to open file: '\" << filename << \"'\" );\n            }\n            ~FileStream() override = default;\n        public: // IStream\n            std::ostream& stream() const override {\n                return m_ofs;\n            }\n        };\n\n        ///////////////////////////////////////////////////////////////////////////\n\n        class CoutStream : public IStream {\n            mutable std::ostream m_os;\n        public:\n            // Store the streambuf from cout up-front because\n            // cout may get redirected when running tests\n            CoutStream() : m_os( Catch::cout().rdbuf() ) {}\n            ~CoutStream() override = default;\n\n        public: // IStream\n            std::ostream& stream() const override { return m_os; }\n        };\n\n        ///////////////////////////////////////////////////////////////////////////\n\n        class DebugOutStream : public IStream {\n            std::unique_ptr<StreamBufImpl<OutputDebugWriter>> m_streamBuf;\n            mutable std::ostream m_os;\n        public:\n            DebugOutStream()\n            :   m_streamBuf( new StreamBufImpl<OutputDebugWriter>() ),\n                m_os( m_streamBuf.get() )\n            {}\n\n            ~DebugOutStream() override = default;\n\n        public: // IStream\n            std::ostream& stream() const override { return m_os; }\n        };\n\n    }} // namespace anon::detail\n\n    ///////////////////////////////////////////////////////////////////////////\n\n    auto makeStream( StringRef const &filename ) -> IStream const* {\n        if( filename.empty() )\n            return new Detail::CoutStream();\n        else if( filename[0] == '%' ) {\n            if( filename == \"%debug\" )\n                return new Detail::DebugOutStream();\n            else\n                CATCH_ERROR( \"Unrecognised stream: '\" << filename << \"'\" );\n        }\n        else\n            return new Detail::FileStream( filename );\n    }\n\n    // This class encapsulates the idea of a pool of ostringstreams that can be reused.\n    struct StringStreams {\n        std::vector<std::unique_ptr<std::ostringstream>> m_streams;\n        std::vector<std::size_t> m_unused;\n        std::ostringstream m_referenceStream; // Used for copy state/ flags from\n\n        auto add() -> std::size_t {\n            if( m_unused.empty() ) {\n                m_streams.push_back( std::unique_ptr<std::ostringstream>( new std::ostringstream ) );\n                return m_streams.size()-1;\n            }\n            else {\n                auto index = m_unused.back();\n                m_unused.pop_back();\n                return index;\n            }\n        }\n\n        void release( std::size_t index ) {\n            m_streams[index]->copyfmt( m_referenceStream ); // Restore initial flags and other state\n            m_unused.push_back(index);\n        }\n    };\n\n    ReusableStringStream::ReusableStringStream()\n    :   m_index( Singleton<StringStreams>::getMutable().add() ),\n        m_oss( Singleton<StringStreams>::getMutable().m_streams[m_index].get() )\n    {}\n\n    ReusableStringStream::~ReusableStringStream() {\n        static_cast<std::ostringstream*>( m_oss )->str(\"\");\n        m_oss->clear();\n        Singleton<StringStreams>::getMutable().release( m_index );\n    }\n\n    auto ReusableStringStream::str() const -> std::string {\n        return static_cast<std::ostringstream*>( m_oss )->str();\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n\n#ifndef CATCH_CONFIG_NOSTDOUT // If you #define this you must implement these functions\n    std::ostream& cout() { return std::cout; }\n    std::ostream& cerr() { return std::cerr; }\n    std::ostream& clog() { return std::clog; }\n#endif\n}\n// end catch_stream.cpp\n// start catch_string_manip.cpp\n\n#include <algorithm>\n#include <ostream>\n#include <cstring>\n#include <cctype>\n#include <vector>\n\nnamespace Catch {\n\n    namespace {\n        char toLowerCh(char c) {\n            return static_cast<char>( std::tolower( static_cast<unsigned char>(c) ) );\n        }\n    }\n\n    bool startsWith( std::string const& s, std::string const& prefix ) {\n        return s.size() >= prefix.size() && std::equal(prefix.begin(), prefix.end(), s.begin());\n    }\n    bool startsWith( std::string const& s, char prefix ) {\n        return !s.empty() && s[0] == prefix;\n    }\n    bool endsWith( std::string const& s, std::string const& suffix ) {\n        return s.size() >= suffix.size() && std::equal(suffix.rbegin(), suffix.rend(), s.rbegin());\n    }\n    bool endsWith( std::string const& s, char suffix ) {\n        return !s.empty() && s[s.size()-1] == suffix;\n    }\n    bool contains( std::string const& s, std::string const& infix ) {\n        return s.find( infix ) != std::string::npos;\n    }\n    void toLowerInPlace( std::string& s ) {\n        std::transform( s.begin(), s.end(), s.begin(), toLowerCh );\n    }\n    std::string toLower( std::string const& s ) {\n        std::string lc = s;\n        toLowerInPlace( lc );\n        return lc;\n    }\n    std::string trim( std::string const& str ) {\n        static char const* whitespaceChars = \"\\n\\r\\t \";\n        std::string::size_type start = str.find_first_not_of( whitespaceChars );\n        std::string::size_type end = str.find_last_not_of( whitespaceChars );\n\n        return start != std::string::npos ? str.substr( start, 1+end-start ) : std::string();\n    }\n\n    StringRef trim(StringRef ref) {\n        const auto is_ws = [](char c) {\n            return c == ' ' || c == '\\t' || c == '\\n' || c == '\\r';\n        };\n        size_t real_begin = 0;\n        while (real_begin < ref.size() && is_ws(ref[real_begin])) { ++real_begin; }\n        size_t real_end = ref.size();\n        while (real_end > real_begin && is_ws(ref[real_end - 1])) { --real_end; }\n\n        return ref.substr(real_begin, real_end - real_begin);\n    }\n\n    bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ) {\n        bool replaced = false;\n        std::size_t i = str.find( replaceThis );\n        while( i != std::string::npos ) {\n            replaced = true;\n            str = str.substr( 0, i ) + withThis + str.substr( i+replaceThis.size() );\n            if( i < str.size()-withThis.size() )\n                i = str.find( replaceThis, i+withThis.size() );\n            else\n                i = std::string::npos;\n        }\n        return replaced;\n    }\n\n    std::vector<StringRef> splitStringRef( StringRef str, char delimiter ) {\n        std::vector<StringRef> subStrings;\n        std::size_t start = 0;\n        for(std::size_t pos = 0; pos < str.size(); ++pos ) {\n            if( str[pos] == delimiter ) {\n                if( pos - start > 1 )\n                    subStrings.push_back( str.substr( start, pos-start ) );\n                start = pos+1;\n            }\n        }\n        if( start < str.size() )\n            subStrings.push_back( str.substr( start, str.size()-start ) );\n        return subStrings;\n    }\n\n    pluralise::pluralise( std::size_t count, std::string const& label )\n    :   m_count( count ),\n        m_label( label )\n    {}\n\n    std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ) {\n        os << pluraliser.m_count << ' ' << pluraliser.m_label;\n        if( pluraliser.m_count != 1 )\n            os << 's';\n        return os;\n    }\n\n}\n// end catch_string_manip.cpp\n// start catch_stringref.cpp\n\n#include <algorithm>\n#include <ostream>\n#include <cstring>\n#include <cstdint>\n\nnamespace Catch {\n    StringRef::StringRef( char const* rawChars ) noexcept\n    : StringRef( rawChars, static_cast<StringRef::size_type>(std::strlen(rawChars) ) )\n    {}\n\n    auto StringRef::c_str() const -> char const* {\n        CATCH_ENFORCE(isNullTerminated(), \"Called StringRef::c_str() on a non-null-terminated instance\");\n        return m_start;\n    }\n    auto StringRef::data() const noexcept -> char const* {\n        return m_start;\n    }\n\n    auto StringRef::substr( size_type start, size_type size ) const noexcept -> StringRef {\n        if (start < m_size) {\n            return StringRef(m_start + start, (std::min)(m_size - start, size));\n        } else {\n            return StringRef();\n        }\n    }\n    auto StringRef::operator == ( StringRef const& other ) const noexcept -> bool {\n        return m_size == other.m_size\n            && (std::memcmp( m_start, other.m_start, m_size ) == 0);\n    }\n\n    auto operator << ( std::ostream& os, StringRef const& str ) -> std::ostream& {\n        return os.write(str.data(), str.size());\n    }\n\n    auto operator+=( std::string& lhs, StringRef const& rhs ) -> std::string& {\n        lhs.append(rhs.data(), rhs.size());\n        return lhs;\n    }\n\n} // namespace Catch\n// end catch_stringref.cpp\n// start catch_tag_alias.cpp\n\nnamespace Catch {\n    TagAlias::TagAlias(std::string const & _tag, SourceLineInfo _lineInfo): tag(_tag), lineInfo(_lineInfo) {}\n}\n// end catch_tag_alias.cpp\n// start catch_tag_alias_autoregistrar.cpp\n\nnamespace Catch {\n\n    RegistrarForTagAliases::RegistrarForTagAliases(char const* alias, char const* tag, SourceLineInfo const& lineInfo) {\n        CATCH_TRY {\n            getMutableRegistryHub().registerTagAlias(alias, tag, lineInfo);\n        } CATCH_CATCH_ALL {\n            // Do not throw when constructing global objects, instead register the exception to be processed later\n            getMutableRegistryHub().registerStartupException();\n        }\n    }\n\n}\n// end catch_tag_alias_autoregistrar.cpp\n// start catch_tag_alias_registry.cpp\n\n#include <sstream>\n\nnamespace Catch {\n\n    TagAliasRegistry::~TagAliasRegistry() {}\n\n    TagAlias const* TagAliasRegistry::find( std::string const& alias ) const {\n        auto it = m_registry.find( alias );\n        if( it != m_registry.end() )\n            return &(it->second);\n        else\n            return nullptr;\n    }\n\n    std::string TagAliasRegistry::expandAliases( std::string const& unexpandedTestSpec ) const {\n        std::string expandedTestSpec = unexpandedTestSpec;\n        for( auto const& registryKvp : m_registry ) {\n            std::size_t pos = expandedTestSpec.find( registryKvp.first );\n            if( pos != std::string::npos ) {\n                expandedTestSpec =  expandedTestSpec.substr( 0, pos ) +\n                                    registryKvp.second.tag +\n                                    expandedTestSpec.substr( pos + registryKvp.first.size() );\n            }\n        }\n        return expandedTestSpec;\n    }\n\n    void TagAliasRegistry::add( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) {\n        CATCH_ENFORCE( startsWith(alias, \"[@\") && endsWith(alias, ']'),\n                      \"error: tag alias, '\" << alias << \"' is not of the form [@alias name].\\n\" << lineInfo );\n\n        CATCH_ENFORCE( m_registry.insert(std::make_pair(alias, TagAlias(tag, lineInfo))).second,\n                      \"error: tag alias, '\" << alias << \"' already registered.\\n\"\n                      << \"\\tFirst seen at: \" << find(alias)->lineInfo << \"\\n\"\n                      << \"\\tRedefined at: \" << lineInfo );\n    }\n\n    ITagAliasRegistry::~ITagAliasRegistry() {}\n\n    ITagAliasRegistry const& ITagAliasRegistry::get() {\n        return getRegistryHub().getTagAliasRegistry();\n    }\n\n} // end namespace Catch\n// end catch_tag_alias_registry.cpp\n// start catch_test_case_info.cpp\n\n#include <cctype>\n#include <exception>\n#include <algorithm>\n#include <sstream>\n\nnamespace Catch {\n\n    namespace {\n        TestCaseInfo::SpecialProperties parseSpecialTag( std::string const& tag ) {\n            if( startsWith( tag, '.' ) ||\n                tag == \"!hide\" )\n                return TestCaseInfo::IsHidden;\n            else if( tag == \"!throws\" )\n                return TestCaseInfo::Throws;\n            else if( tag == \"!shouldfail\" )\n                return TestCaseInfo::ShouldFail;\n            else if( tag == \"!mayfail\" )\n                return TestCaseInfo::MayFail;\n            else if( tag == \"!nonportable\" )\n                return TestCaseInfo::NonPortable;\n            else if( tag == \"!benchmark\" )\n                return static_cast<TestCaseInfo::SpecialProperties>( TestCaseInfo::Benchmark | TestCaseInfo::IsHidden );\n            else\n                return TestCaseInfo::None;\n        }\n        bool isReservedTag( std::string const& tag ) {\n            return parseSpecialTag( tag ) == TestCaseInfo::None && tag.size() > 0 && !std::isalnum( static_cast<unsigned char>(tag[0]) );\n        }\n        void enforceNotReservedTag( std::string const& tag, SourceLineInfo const& _lineInfo ) {\n            CATCH_ENFORCE( !isReservedTag(tag),\n                          \"Tag name: [\" << tag << \"] is not allowed.\\n\"\n                          << \"Tag names starting with non alphanumeric characters are reserved\\n\"\n                          << _lineInfo );\n        }\n    }\n\n    TestCase makeTestCase(  ITestInvoker* _testCase,\n                            std::string const& _className,\n                            NameAndTags const& nameAndTags,\n                            SourceLineInfo const& _lineInfo )\n    {\n        bool isHidden = false;\n\n        // Parse out tags\n        std::vector<std::string> tags;\n        std::string desc, tag;\n        bool inTag = false;\n        for (char c : nameAndTags.tags) {\n            if( !inTag ) {\n                if( c == '[' )\n                    inTag = true;\n                else\n                    desc += c;\n            }\n            else {\n                if( c == ']' ) {\n                    TestCaseInfo::SpecialProperties prop = parseSpecialTag( tag );\n                    if( ( prop & TestCaseInfo::IsHidden ) != 0 )\n                        isHidden = true;\n                    else if( prop == TestCaseInfo::None )\n                        enforceNotReservedTag( tag, _lineInfo );\n\n                    // Merged hide tags like `[.approvals]` should be added as\n                    // `[.][approvals]`. The `[.]` is added at later point, so\n                    // we only strip the prefix\n                    if (startsWith(tag, '.') && tag.size() > 1) {\n                        tag.erase(0, 1);\n                    }\n                    tags.push_back( tag );\n                    tag.clear();\n                    inTag = false;\n                }\n                else\n                    tag += c;\n            }\n        }\n        if( isHidden ) {\n            // Add all \"hidden\" tags to make them behave identically\n            tags.insert( tags.end(), { \".\", \"!hide\" } );\n        }\n\n        TestCaseInfo info( static_cast<std::string>(nameAndTags.name), _className, desc, tags, _lineInfo );\n        return TestCase( _testCase, std::move(info) );\n    }\n\n    void setTags( TestCaseInfo& testCaseInfo, std::vector<std::string> tags ) {\n        std::sort(begin(tags), end(tags));\n        tags.erase(std::unique(begin(tags), end(tags)), end(tags));\n        testCaseInfo.lcaseTags.clear();\n\n        for( auto const& tag : tags ) {\n            std::string lcaseTag = toLower( tag );\n            testCaseInfo.properties = static_cast<TestCaseInfo::SpecialProperties>( testCaseInfo.properties | parseSpecialTag( lcaseTag ) );\n            testCaseInfo.lcaseTags.push_back( lcaseTag );\n        }\n        testCaseInfo.tags = std::move(tags);\n    }\n\n    TestCaseInfo::TestCaseInfo( std::string const& _name,\n                                std::string const& _className,\n                                std::string const& _description,\n                                std::vector<std::string> const& _tags,\n                                SourceLineInfo const& _lineInfo )\n    :   name( _name ),\n        className( _className ),\n        description( _description ),\n        lineInfo( _lineInfo ),\n        properties( None )\n    {\n        setTags( *this, _tags );\n    }\n\n    bool TestCaseInfo::isHidden() const {\n        return ( properties & IsHidden ) != 0;\n    }\n    bool TestCaseInfo::throws() const {\n        return ( properties & Throws ) != 0;\n    }\n    bool TestCaseInfo::okToFail() const {\n        return ( properties & (ShouldFail | MayFail ) ) != 0;\n    }\n    bool TestCaseInfo::expectedToFail() const {\n        return ( properties & (ShouldFail ) ) != 0;\n    }\n\n    std::string TestCaseInfo::tagsAsString() const {\n        std::string ret;\n        // '[' and ']' per tag\n        std::size_t full_size = 2 * tags.size();\n        for (const auto& tag : tags) {\n            full_size += tag.size();\n        }\n        ret.reserve(full_size);\n        for (const auto& tag : tags) {\n            ret.push_back('[');\n            ret.append(tag);\n            ret.push_back(']');\n        }\n\n        return ret;\n    }\n\n    TestCase::TestCase( ITestInvoker* testCase, TestCaseInfo&& info ) : TestCaseInfo( std::move(info) ), test( testCase ) {}\n\n    TestCase TestCase::withName( std::string const& _newName ) const {\n        TestCase other( *this );\n        other.name = _newName;\n        return other;\n    }\n\n    void TestCase::invoke() const {\n        test->invoke();\n    }\n\n    bool TestCase::operator == ( TestCase const& other ) const {\n        return  test.get() == other.test.get() &&\n                name == other.name &&\n                className == other.className;\n    }\n\n    bool TestCase::operator < ( TestCase const& other ) const {\n        return name < other.name;\n    }\n\n    TestCaseInfo const& TestCase::getTestCaseInfo() const\n    {\n        return *this;\n    }\n\n} // end namespace Catch\n// end catch_test_case_info.cpp\n// start catch_test_case_registry_impl.cpp\n\n#include <algorithm>\n#include <sstream>\n\nnamespace Catch {\n\n    namespace {\n        struct TestHasher {\n            explicit TestHasher(Catch::SimplePcg32& rng) {\n                basis = rng();\n                basis <<= 32;\n                basis |= rng();\n            }\n\n            uint64_t basis;\n\n            uint64_t operator()(TestCase const& t) const {\n                // Modified FNV-1a hash\n                static constexpr uint64_t prime = 1099511628211;\n                uint64_t hash = basis;\n                for (const char c : t.name) {\n                    hash ^= c;\n                    hash *= prime;\n                }\n                return hash;\n            }\n        };\n    } // end unnamed namespace\n\n    std::vector<TestCase> sortTests( IConfig const& config, std::vector<TestCase> const& unsortedTestCases ) {\n        switch( config.runOrder() ) {\n            case RunTests::InDeclarationOrder:\n                // already in declaration order\n                break;\n\n            case RunTests::InLexicographicalOrder: {\n                std::vector<TestCase> sorted = unsortedTestCases;\n                std::sort( sorted.begin(), sorted.end() );\n                return sorted;\n            }\n\n            case RunTests::InRandomOrder: {\n                seedRng( config );\n                TestHasher h( rng() );\n\n                using hashedTest = std::pair<uint64_t, TestCase const*>;\n                std::vector<hashedTest> indexed_tests;\n                indexed_tests.reserve( unsortedTestCases.size() );\n\n                for (auto const& testCase : unsortedTestCases) {\n                    indexed_tests.emplace_back(h(testCase), &testCase);\n                }\n\n                std::sort(indexed_tests.begin(), indexed_tests.end(),\n                          [](hashedTest const& lhs, hashedTest const& rhs) {\n                          if (lhs.first == rhs.first) {\n                              return lhs.second->name < rhs.second->name;\n                          }\n                          return lhs.first < rhs.first;\n                });\n\n                std::vector<TestCase> sorted;\n                sorted.reserve( indexed_tests.size() );\n\n                for (auto const& hashed : indexed_tests) {\n                    sorted.emplace_back(*hashed.second);\n                }\n\n                return sorted;\n            }\n        }\n        return unsortedTestCases;\n    }\n\n    bool isThrowSafe( TestCase const& testCase, IConfig const& config ) {\n        return !testCase.throws() || config.allowThrows();\n    }\n\n    bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ) {\n        return testSpec.matches( testCase ) && isThrowSafe( testCase, config );\n    }\n\n    void enforceNoDuplicateTestCases( std::vector<TestCase> const& functions ) {\n        std::set<TestCase> seenFunctions;\n        for( auto const& function : functions ) {\n            auto prev = seenFunctions.insert( function );\n            CATCH_ENFORCE( prev.second,\n                    \"error: TEST_CASE( \\\"\" << function.name << \"\\\" ) already defined.\\n\"\n                    << \"\\tFirst seen at \" << prev.first->getTestCaseInfo().lineInfo << \"\\n\"\n                    << \"\\tRedefined at \" << function.getTestCaseInfo().lineInfo );\n        }\n    }\n\n    std::vector<TestCase> filterTests( std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config ) {\n        std::vector<TestCase> filtered;\n        filtered.reserve( testCases.size() );\n        for (auto const& testCase : testCases) {\n            if ((!testSpec.hasFilters() && !testCase.isHidden()) ||\n                (testSpec.hasFilters() && matchTest(testCase, testSpec, config))) {\n                filtered.push_back(testCase);\n            }\n        }\n        return filtered;\n    }\n    std::vector<TestCase> const& getAllTestCasesSorted( IConfig const& config ) {\n        return getRegistryHub().getTestCaseRegistry().getAllTestsSorted( config );\n    }\n\n    void TestRegistry::registerTest( TestCase const& testCase ) {\n        std::string name = testCase.getTestCaseInfo().name;\n        if( name.empty() ) {\n            ReusableStringStream rss;\n            rss << \"Anonymous test case \" << ++m_unnamedCount;\n            return registerTest( testCase.withName( rss.str() ) );\n        }\n        m_functions.push_back( testCase );\n    }\n\n    std::vector<TestCase> const& TestRegistry::getAllTests() const {\n        return m_functions;\n    }\n    std::vector<TestCase> const& TestRegistry::getAllTestsSorted( IConfig const& config ) const {\n        if( m_sortedFunctions.empty() )\n            enforceNoDuplicateTestCases( m_functions );\n\n        if(  m_currentSortOrder != config.runOrder() || m_sortedFunctions.empty() ) {\n            m_sortedFunctions = sortTests( config, m_functions );\n            m_currentSortOrder = config.runOrder();\n        }\n        return m_sortedFunctions;\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    TestInvokerAsFunction::TestInvokerAsFunction( void(*testAsFunction)() ) noexcept : m_testAsFunction( testAsFunction ) {}\n\n    void TestInvokerAsFunction::invoke() const {\n        m_testAsFunction();\n    }\n\n    std::string extractClassName( StringRef const& classOrQualifiedMethodName ) {\n        std::string className(classOrQualifiedMethodName);\n        if( startsWith( className, '&' ) )\n        {\n            std::size_t lastColons = className.rfind( \"::\" );\n            std::size_t penultimateColons = className.rfind( \"::\", lastColons-1 );\n            if( penultimateColons == std::string::npos )\n                penultimateColons = 1;\n            className = className.substr( penultimateColons, lastColons-penultimateColons );\n        }\n        return className;\n    }\n\n} // end namespace Catch\n// end catch_test_case_registry_impl.cpp\n// start catch_test_case_tracker.cpp\n\n#include <algorithm>\n#include <cassert>\n#include <stdexcept>\n#include <memory>\n#include <sstream>\n\n#if defined(__clang__)\n#    pragma clang diagnostic push\n#    pragma clang diagnostic ignored \"-Wexit-time-destructors\"\n#endif\n\nnamespace Catch {\nnamespace TestCaseTracking {\n\n    NameAndLocation::NameAndLocation( std::string const& _name, SourceLineInfo const& _location )\n    :   name( _name ),\n        location( _location )\n    {}\n\n    ITracker::~ITracker() = default;\n\n    ITracker& TrackerContext::startRun() {\n        m_rootTracker = std::make_shared<SectionTracker>( NameAndLocation( \"{root}\", CATCH_INTERNAL_LINEINFO ), *this, nullptr );\n        m_currentTracker = nullptr;\n        m_runState = Executing;\n        return *m_rootTracker;\n    }\n\n    void TrackerContext::endRun() {\n        m_rootTracker.reset();\n        m_currentTracker = nullptr;\n        m_runState = NotStarted;\n    }\n\n    void TrackerContext::startCycle() {\n        m_currentTracker = m_rootTracker.get();\n        m_runState = Executing;\n    }\n    void TrackerContext::completeCycle() {\n        m_runState = CompletedCycle;\n    }\n\n    bool TrackerContext::completedCycle() const {\n        return m_runState == CompletedCycle;\n    }\n    ITracker& TrackerContext::currentTracker() {\n        return *m_currentTracker;\n    }\n    void TrackerContext::setCurrentTracker( ITracker* tracker ) {\n        m_currentTracker = tracker;\n    }\n\n    TrackerBase::TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ):\n        ITracker(nameAndLocation),\n        m_ctx( ctx ),\n        m_parent( parent )\n    {}\n\n    bool TrackerBase::isComplete() const {\n        return m_runState == CompletedSuccessfully || m_runState == Failed;\n    }\n    bool TrackerBase::isSuccessfullyCompleted() const {\n        return m_runState == CompletedSuccessfully;\n    }\n    bool TrackerBase::isOpen() const {\n        return m_runState != NotStarted && !isComplete();\n    }\n    bool TrackerBase::hasChildren() const {\n        return !m_children.empty();\n    }\n\n    void TrackerBase::addChild( ITrackerPtr const& child ) {\n        m_children.push_back( child );\n    }\n\n    ITrackerPtr TrackerBase::findChild( NameAndLocation const& nameAndLocation ) {\n        auto it = std::find_if( m_children.begin(), m_children.end(),\n            [&nameAndLocation]( ITrackerPtr const& tracker ){\n                return\n                    tracker->nameAndLocation().location == nameAndLocation.location &&\n                    tracker->nameAndLocation().name == nameAndLocation.name;\n            } );\n        return( it != m_children.end() )\n            ? *it\n            : nullptr;\n    }\n    ITracker& TrackerBase::parent() {\n        assert( m_parent ); // Should always be non-null except for root\n        return *m_parent;\n    }\n\n    void TrackerBase::openChild() {\n        if( m_runState != ExecutingChildren ) {\n            m_runState = ExecutingChildren;\n            if( m_parent )\n                m_parent->openChild();\n        }\n    }\n\n    bool TrackerBase::isSectionTracker() const { return false; }\n    bool TrackerBase::isGeneratorTracker() const { return false; }\n\n    void TrackerBase::open() {\n        m_runState = Executing;\n        moveToThis();\n        if( m_parent )\n            m_parent->openChild();\n    }\n\n    void TrackerBase::close() {\n\n        // Close any still open children (e.g. generators)\n        while( &m_ctx.currentTracker() != this )\n            m_ctx.currentTracker().close();\n\n        switch( m_runState ) {\n            case NeedsAnotherRun:\n                break;\n\n            case Executing:\n                m_runState = CompletedSuccessfully;\n                break;\n            case ExecutingChildren:\n                if( std::all_of(m_children.begin(), m_children.end(), [](ITrackerPtr const& t){ return t->isComplete(); }) )\n                    m_runState = CompletedSuccessfully;\n                break;\n\n            case NotStarted:\n            case CompletedSuccessfully:\n            case Failed:\n                CATCH_INTERNAL_ERROR( \"Illogical state: \" << m_runState );\n\n            default:\n                CATCH_INTERNAL_ERROR( \"Unknown state: \" << m_runState );\n        }\n        moveToParent();\n        m_ctx.completeCycle();\n    }\n    void TrackerBase::fail() {\n        m_runState = Failed;\n        if( m_parent )\n            m_parent->markAsNeedingAnotherRun();\n        moveToParent();\n        m_ctx.completeCycle();\n    }\n    void TrackerBase::markAsNeedingAnotherRun() {\n        m_runState = NeedsAnotherRun;\n    }\n\n    void TrackerBase::moveToParent() {\n        assert( m_parent );\n        m_ctx.setCurrentTracker( m_parent );\n    }\n    void TrackerBase::moveToThis() {\n        m_ctx.setCurrentTracker( this );\n    }\n\n    SectionTracker::SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent )\n    :   TrackerBase( nameAndLocation, ctx, parent ),\n        m_trimmed_name(trim(nameAndLocation.name))\n    {\n        if( parent ) {\n            while( !parent->isSectionTracker() )\n                parent = &parent->parent();\n\n            SectionTracker& parentSection = static_cast<SectionTracker&>( *parent );\n            addNextFilters( parentSection.m_filters );\n        }\n    }\n\n    bool SectionTracker::isComplete() const {\n        bool complete = true;\n\n        if (m_filters.empty()\n            || m_filters[0] == \"\"\n            || std::find(m_filters.begin(), m_filters.end(), m_trimmed_name) != m_filters.end()) {\n            complete = TrackerBase::isComplete();\n        }\n        return complete;\n    }\n\n    bool SectionTracker::isSectionTracker() const { return true; }\n\n    SectionTracker& SectionTracker::acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation ) {\n        std::shared_ptr<SectionTracker> section;\n\n        ITracker& currentTracker = ctx.currentTracker();\n        if( ITrackerPtr childTracker = currentTracker.findChild( nameAndLocation ) ) {\n            assert( childTracker );\n            assert( childTracker->isSectionTracker() );\n            section = std::static_pointer_cast<SectionTracker>( childTracker );\n        }\n        else {\n            section = std::make_shared<SectionTracker>( nameAndLocation, ctx, &currentTracker );\n            currentTracker.addChild( section );\n        }\n        if( !ctx.completedCycle() )\n            section->tryOpen();\n        return *section;\n    }\n\n    void SectionTracker::tryOpen() {\n        if( !isComplete() )\n            open();\n    }\n\n    void SectionTracker::addInitialFilters( std::vector<std::string> const& filters ) {\n        if( !filters.empty() ) {\n            m_filters.reserve( m_filters.size() + filters.size() + 2 );\n            m_filters.emplace_back(\"\"); // Root - should never be consulted\n            m_filters.emplace_back(\"\"); // Test Case - not a section filter\n            m_filters.insert( m_filters.end(), filters.begin(), filters.end() );\n        }\n    }\n    void SectionTracker::addNextFilters( std::vector<std::string> const& filters ) {\n        if( filters.size() > 1 )\n            m_filters.insert( m_filters.end(), filters.begin()+1, filters.end() );\n    }\n\n} // namespace TestCaseTracking\n\nusing TestCaseTracking::ITracker;\nusing TestCaseTracking::TrackerContext;\nusing TestCaseTracking::SectionTracker;\n\n} // namespace Catch\n\n#if defined(__clang__)\n#    pragma clang diagnostic pop\n#endif\n// end catch_test_case_tracker.cpp\n// start catch_test_registry.cpp\n\nnamespace Catch {\n\n    auto makeTestInvoker( void(*testAsFunction)() ) noexcept -> ITestInvoker* {\n        return new(std::nothrow) TestInvokerAsFunction( testAsFunction );\n    }\n\n    NameAndTags::NameAndTags( StringRef const& name_ , StringRef const& tags_ ) noexcept : name( name_ ), tags( tags_ ) {}\n\n    AutoReg::AutoReg( ITestInvoker* invoker, SourceLineInfo const& lineInfo, StringRef const& classOrMethod, NameAndTags const& nameAndTags ) noexcept {\n        CATCH_TRY {\n            getMutableRegistryHub()\n                    .registerTest(\n                        makeTestCase(\n                            invoker,\n                            extractClassName( classOrMethod ),\n                            nameAndTags,\n                            lineInfo));\n        } CATCH_CATCH_ALL {\n            // Do not throw when constructing global objects, instead register the exception to be processed later\n            getMutableRegistryHub().registerStartupException();\n        }\n    }\n\n    AutoReg::~AutoReg() = default;\n}\n// end catch_test_registry.cpp\n// start catch_test_spec.cpp\n\n#include <algorithm>\n#include <string>\n#include <vector>\n#include <memory>\n\nnamespace Catch {\n\n    TestSpec::Pattern::Pattern( std::string const& name )\n    : m_name( name )\n    {}\n\n    TestSpec::Pattern::~Pattern() = default;\n\n    std::string const& TestSpec::Pattern::name() const {\n        return m_name;\n    }\n\n    TestSpec::NamePattern::NamePattern( std::string const& name, std::string const& filterString )\n    : Pattern( filterString )\n    , m_wildcardPattern( toLower( name ), CaseSensitive::No )\n    {}\n\n    bool TestSpec::NamePattern::matches( TestCaseInfo const& testCase ) const {\n        return m_wildcardPattern.matches( testCase.name );\n    }\n\n    TestSpec::TagPattern::TagPattern( std::string const& tag, std::string const& filterString )\n    : Pattern( filterString )\n    , m_tag( toLower( tag ) )\n    {}\n\n    bool TestSpec::TagPattern::matches( TestCaseInfo const& testCase ) const {\n        return std::find(begin(testCase.lcaseTags),\n                         end(testCase.lcaseTags),\n                         m_tag) != end(testCase.lcaseTags);\n    }\n\n    TestSpec::ExcludedPattern::ExcludedPattern( PatternPtr const& underlyingPattern )\n    : Pattern( underlyingPattern->name() )\n    , m_underlyingPattern( underlyingPattern )\n    {}\n\n    bool TestSpec::ExcludedPattern::matches( TestCaseInfo const& testCase ) const {\n        return !m_underlyingPattern->matches( testCase );\n    }\n\n    bool TestSpec::Filter::matches( TestCaseInfo const& testCase ) const {\n        return std::all_of( m_patterns.begin(), m_patterns.end(), [&]( PatternPtr const& p ){ return p->matches( testCase ); } );\n    }\n\n    std::string TestSpec::Filter::name() const {\n        std::string name;\n        for( auto const& p : m_patterns )\n            name += p->name();\n        return name;\n    }\n\n    bool TestSpec::hasFilters() const {\n        return !m_filters.empty();\n    }\n\n    bool TestSpec::matches( TestCaseInfo const& testCase ) const {\n        return std::any_of( m_filters.begin(), m_filters.end(), [&]( Filter const& f ){ return f.matches( testCase ); } );\n    }\n\n    TestSpec::Matches TestSpec::matchesByFilter( std::vector<TestCase> const& testCases, IConfig const& config ) const\n    {\n        Matches matches( m_filters.size() );\n        std::transform( m_filters.begin(), m_filters.end(), matches.begin(), [&]( Filter const& filter ){\n            std::vector<TestCase const*> currentMatches;\n            for( auto const& test : testCases )\n                if( isThrowSafe( test, config ) && filter.matches( test ) )\n                    currentMatches.emplace_back( &test );\n            return FilterMatch{ filter.name(), currentMatches };\n        } );\n        return matches;\n    }\n\n    const TestSpec::vectorStrings& TestSpec::getInvalidArgs() const{\n        return  (m_invalidArgs);\n    }\n\n}\n// end catch_test_spec.cpp\n// start catch_test_spec_parser.cpp\n\nnamespace Catch {\n\n    TestSpecParser::TestSpecParser( ITagAliasRegistry const& tagAliases ) : m_tagAliases( &tagAliases ) {}\n\n    TestSpecParser& TestSpecParser::parse( std::string const& arg ) {\n        m_mode = None;\n        m_exclusion = false;\n        m_arg = m_tagAliases->expandAliases( arg );\n        m_escapeChars.clear();\n        m_substring.reserve(m_arg.size());\n        m_patternName.reserve(m_arg.size());\n        m_realPatternPos = 0;\n\n        for( m_pos = 0; m_pos < m_arg.size(); ++m_pos )\n          //if visitChar fails\n           if( !visitChar( m_arg[m_pos] ) ){\n               m_testSpec.m_invalidArgs.push_back(arg);\n               break;\n           }\n        endMode();\n        return *this;\n    }\n    TestSpec TestSpecParser::testSpec() {\n        addFilter();\n        return m_testSpec;\n    }\n    bool TestSpecParser::visitChar( char c ) {\n        if( (m_mode != EscapedName) && (c == '\\\\') ) {\n            escape();\n            addCharToPattern(c);\n            return true;\n        }else if((m_mode != EscapedName) && (c == ',') )  {\n            return separate();\n        }\n\n        switch( m_mode ) {\n        case None:\n            if( processNoneChar( c ) )\n                return true;\n            break;\n        case Name:\n            processNameChar( c );\n            break;\n        case EscapedName:\n            endMode();\n            addCharToPattern(c);\n            return true;\n        default:\n        case Tag:\n        case QuotedName:\n            if( processOtherChar( c ) )\n                return true;\n            break;\n        }\n\n        m_substring += c;\n        if( !isControlChar( c ) ) {\n            m_patternName += c;\n            m_realPatternPos++;\n        }\n        return true;\n    }\n    // Two of the processing methods return true to signal the caller to return\n    // without adding the given character to the current pattern strings\n    bool TestSpecParser::processNoneChar( char c ) {\n        switch( c ) {\n        case ' ':\n            return true;\n        case '~':\n            m_exclusion = true;\n            return false;\n        case '[':\n            startNewMode( Tag );\n            return false;\n        case '\"':\n            startNewMode( QuotedName );\n            return false;\n        default:\n            startNewMode( Name );\n            return false;\n        }\n    }\n    void TestSpecParser::processNameChar( char c ) {\n        if( c == '[' ) {\n            if( m_substring == \"exclude:\" )\n                m_exclusion = true;\n            else\n                endMode();\n            startNewMode( Tag );\n        }\n    }\n    bool TestSpecParser::processOtherChar( char c ) {\n        if( !isControlChar( c ) )\n            return false;\n        m_substring += c;\n        endMode();\n        return true;\n    }\n    void TestSpecParser::startNewMode( Mode mode ) {\n        m_mode = mode;\n    }\n    void TestSpecParser::endMode() {\n        switch( m_mode ) {\n        case Name:\n        case QuotedName:\n            return addNamePattern();\n        case Tag:\n            return addTagPattern();\n        case EscapedName:\n            revertBackToLastMode();\n            return;\n        case None:\n        default:\n            return startNewMode( None );\n        }\n    }\n    void TestSpecParser::escape() {\n        saveLastMode();\n        m_mode = EscapedName;\n        m_escapeChars.push_back(m_realPatternPos);\n    }\n    bool TestSpecParser::isControlChar( char c ) const {\n        switch( m_mode ) {\n            default:\n                return false;\n            case None:\n                return c == '~';\n            case Name:\n                return c == '[';\n            case EscapedName:\n                return true;\n            case QuotedName:\n                return c == '\"';\n            case Tag:\n                return c == '[' || c == ']';\n        }\n    }\n\n    void TestSpecParser::addFilter() {\n        if( !m_currentFilter.m_patterns.empty() ) {\n            m_testSpec.m_filters.push_back( m_currentFilter );\n            m_currentFilter = TestSpec::Filter();\n        }\n    }\n\n    void TestSpecParser::saveLastMode() {\n      lastMode = m_mode;\n    }\n\n    void TestSpecParser::revertBackToLastMode() {\n      m_mode = lastMode;\n    }\n\n    bool TestSpecParser::separate() {\n      if( (m_mode==QuotedName) || (m_mode==Tag) ){\n         //invalid argument, signal failure to previous scope.\n         m_mode = None;\n         m_pos = m_arg.size();\n         m_substring.clear();\n         m_patternName.clear();\n         m_realPatternPos = 0;\n         return false;\n      }\n      endMode();\n      addFilter();\n      return true; //success\n    }\n\n    std::string TestSpecParser::preprocessPattern() {\n        std::string token = m_patternName;\n        for (std::size_t i = 0; i < m_escapeChars.size(); ++i)\n            token = token.substr(0, m_escapeChars[i] - i) + token.substr(m_escapeChars[i] - i + 1);\n        m_escapeChars.clear();\n        if (startsWith(token, \"exclude:\")) {\n            m_exclusion = true;\n            token = token.substr(8);\n        }\n\n        m_patternName.clear();\n        m_realPatternPos = 0;\n\n        return token;\n    }\n\n    void TestSpecParser::addNamePattern() {\n        auto token = preprocessPattern();\n\n        if (!token.empty()) {\n            TestSpec::PatternPtr pattern = std::make_shared<TestSpec::NamePattern>(token, m_substring);\n            if (m_exclusion)\n                pattern = std::make_shared<TestSpec::ExcludedPattern>(pattern);\n            m_currentFilter.m_patterns.push_back(pattern);\n        }\n        m_substring.clear();\n        m_exclusion = false;\n        m_mode = None;\n    }\n\n    void TestSpecParser::addTagPattern() {\n        auto token = preprocessPattern();\n\n        if (!token.empty()) {\n            // If the tag pattern is the \"hide and tag\" shorthand (e.g. [.foo])\n            // we have to create a separate hide tag and shorten the real one\n            if (token.size() > 1 && token[0] == '.') {\n                token.erase(token.begin());\n                TestSpec::PatternPtr pattern = std::make_shared<TestSpec::TagPattern>(\".\", m_substring);\n                if (m_exclusion) {\n                    pattern = std::make_shared<TestSpec::ExcludedPattern>(pattern);\n                }\n                m_currentFilter.m_patterns.push_back(pattern);\n            }\n\n            TestSpec::PatternPtr pattern = std::make_shared<TestSpec::TagPattern>(token, m_substring);\n\n            if (m_exclusion) {\n                pattern = std::make_shared<TestSpec::ExcludedPattern>(pattern);\n            }\n            m_currentFilter.m_patterns.push_back(pattern);\n        }\n        m_substring.clear();\n        m_exclusion = false;\n        m_mode = None;\n    }\n\n    TestSpec parseTestSpec( std::string const& arg ) {\n        return TestSpecParser( ITagAliasRegistry::get() ).parse( arg ).testSpec();\n    }\n\n} // namespace Catch\n// end catch_test_spec_parser.cpp\n// start catch_timer.cpp\n\n#include <chrono>\n\nstatic const uint64_t nanosecondsInSecond = 1000000000;\n\nnamespace Catch {\n\n    auto getCurrentNanosecondsSinceEpoch() -> uint64_t {\n        return std::chrono::duration_cast<std::chrono::nanoseconds>( std::chrono::high_resolution_clock::now().time_since_epoch() ).count();\n    }\n\n    namespace {\n        auto estimateClockResolution() -> uint64_t {\n            uint64_t sum = 0;\n            static const uint64_t iterations = 1000000;\n\n            auto startTime = getCurrentNanosecondsSinceEpoch();\n\n            for( std::size_t i = 0; i < iterations; ++i ) {\n\n                uint64_t ticks;\n                uint64_t baseTicks = getCurrentNanosecondsSinceEpoch();\n                do {\n                    ticks = getCurrentNanosecondsSinceEpoch();\n                } while( ticks == baseTicks );\n\n                auto delta = ticks - baseTicks;\n                sum += delta;\n\n                // If we have been calibrating for over 3 seconds -- the clock\n                // is terrible and we should move on.\n                // TBD: How to signal that the measured resolution is probably wrong?\n                if (ticks > startTime + 3 * nanosecondsInSecond) {\n                    return sum / ( i + 1u );\n                }\n            }\n\n            // We're just taking the mean, here. To do better we could take the std. dev and exclude outliers\n            // - and potentially do more iterations if there's a high variance.\n            return sum/iterations;\n        }\n    }\n    auto getEstimatedClockResolution() -> uint64_t {\n        static auto s_resolution = estimateClockResolution();\n        return s_resolution;\n    }\n\n    void Timer::start() {\n       m_nanoseconds = getCurrentNanosecondsSinceEpoch();\n    }\n    auto Timer::getElapsedNanoseconds() const -> uint64_t {\n        return getCurrentNanosecondsSinceEpoch() - m_nanoseconds;\n    }\n    auto Timer::getElapsedMicroseconds() const -> uint64_t {\n        return getElapsedNanoseconds()/1000;\n    }\n    auto Timer::getElapsedMilliseconds() const -> unsigned int {\n        return static_cast<unsigned int>(getElapsedMicroseconds()/1000);\n    }\n    auto Timer::getElapsedSeconds() const -> double {\n        return getElapsedMicroseconds()/1000000.0;\n    }\n\n} // namespace Catch\n// end catch_timer.cpp\n// start catch_tostring.cpp\n\n#if defined(__clang__)\n#    pragma clang diagnostic push\n#    pragma clang diagnostic ignored \"-Wexit-time-destructors\"\n#    pragma clang diagnostic ignored \"-Wglobal-constructors\"\n#endif\n\n// Enable specific decls locally\n#if !defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER)\n#define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER\n#endif\n\n#include <cmath>\n#include <iomanip>\n\nnamespace Catch {\n\nnamespace Detail {\n\n    const std::string unprintableString = \"{?}\";\n\n    namespace {\n        const int hexThreshold = 255;\n\n        struct Endianness {\n            enum Arch { Big, Little };\n\n            static Arch which() {\n                int one = 1;\n                // If the lowest byte we read is non-zero, we can assume\n                // that little endian format is used.\n                auto value = *reinterpret_cast<char*>(&one);\n                return value ? Little : Big;\n            }\n        };\n    }\n\n    std::string rawMemoryToString( const void *object, std::size_t size ) {\n        // Reverse order for little endian architectures\n        int i = 0, end = static_cast<int>( size ), inc = 1;\n        if( Endianness::which() == Endianness::Little ) {\n            i = end-1;\n            end = inc = -1;\n        }\n\n        unsigned char const *bytes = static_cast<unsigned char const *>(object);\n        ReusableStringStream rss;\n        rss << \"0x\" << std::setfill('0') << std::hex;\n        for( ; i != end; i += inc )\n             rss << std::setw(2) << static_cast<unsigned>(bytes[i]);\n       return rss.str();\n    }\n}\n\ntemplate<typename T>\nstd::string fpToString( T value, int precision ) {\n    if (Catch::isnan(value)) {\n        return \"nan\";\n    }\n\n    ReusableStringStream rss;\n    rss << std::setprecision( precision )\n        << std::fixed\n        << value;\n    std::string d = rss.str();\n    std::size_t i = d.find_last_not_of( '0' );\n    if( i != std::string::npos && i != d.size()-1 ) {\n        if( d[i] == '.' )\n            i++;\n        d = d.substr( 0, i+1 );\n    }\n    return d;\n}\n\n//// ======================================================= ////\n//\n//   Out-of-line defs for full specialization of StringMaker\n//\n//// ======================================================= ////\n\nstd::string StringMaker<std::string>::convert(const std::string& str) {\n    if (!getCurrentContext().getConfig()->showInvisibles()) {\n        return '\"' + str + '\"';\n    }\n\n    std::string s(\"\\\"\");\n    for (char c : str) {\n        switch (c) {\n        case '\\n':\n            s.append(\"\\\\n\");\n            break;\n        case '\\t':\n            s.append(\"\\\\t\");\n            break;\n        default:\n            s.push_back(c);\n            break;\n        }\n    }\n    s.append(\"\\\"\");\n    return s;\n}\n\n#ifdef CATCH_CONFIG_CPP17_STRING_VIEW\nstd::string StringMaker<std::string_view>::convert(std::string_view str) {\n    return ::Catch::Detail::stringify(std::string{ str });\n}\n#endif\n\nstd::string StringMaker<char const*>::convert(char const* str) {\n    if (str) {\n        return ::Catch::Detail::stringify(std::string{ str });\n    } else {\n        return{ \"{null string}\" };\n    }\n}\nstd::string StringMaker<char*>::convert(char* str) {\n    if (str) {\n        return ::Catch::Detail::stringify(std::string{ str });\n    } else {\n        return{ \"{null string}\" };\n    }\n}\n\n#ifdef CATCH_CONFIG_WCHAR\nstd::string StringMaker<std::wstring>::convert(const std::wstring& wstr) {\n    std::string s;\n    s.reserve(wstr.size());\n    for (auto c : wstr) {\n        s += (c <= 0xff) ? static_cast<char>(c) : '?';\n    }\n    return ::Catch::Detail::stringify(s);\n}\n\n# ifdef CATCH_CONFIG_CPP17_STRING_VIEW\nstd::string StringMaker<std::wstring_view>::convert(std::wstring_view str) {\n    return StringMaker<std::wstring>::convert(std::wstring(str));\n}\n# endif\n\nstd::string StringMaker<wchar_t const*>::convert(wchar_t const * str) {\n    if (str) {\n        return ::Catch::Detail::stringify(std::wstring{ str });\n    } else {\n        return{ \"{null string}\" };\n    }\n}\nstd::string StringMaker<wchar_t *>::convert(wchar_t * str) {\n    if (str) {\n        return ::Catch::Detail::stringify(std::wstring{ str });\n    } else {\n        return{ \"{null string}\" };\n    }\n}\n#endif\n\n#if defined(CATCH_CONFIG_CPP17_BYTE)\n#include <cstddef>\nstd::string StringMaker<std::byte>::convert(std::byte value) {\n    return ::Catch::Detail::stringify(std::to_integer<unsigned long long>(value));\n}\n#endif // defined(CATCH_CONFIG_CPP17_BYTE)\n\nstd::string StringMaker<int>::convert(int value) {\n    return ::Catch::Detail::stringify(static_cast<long long>(value));\n}\nstd::string StringMaker<long>::convert(long value) {\n    return ::Catch::Detail::stringify(static_cast<long long>(value));\n}\nstd::string StringMaker<long long>::convert(long long value) {\n    ReusableStringStream rss;\n    rss << value;\n    if (value > Detail::hexThreshold) {\n        rss << \" (0x\" << std::hex << value << ')';\n    }\n    return rss.str();\n}\n\nstd::string StringMaker<unsigned int>::convert(unsigned int value) {\n    return ::Catch::Detail::stringify(static_cast<unsigned long long>(value));\n}\nstd::string StringMaker<unsigned long>::convert(unsigned long value) {\n    return ::Catch::Detail::stringify(static_cast<unsigned long long>(value));\n}\nstd::string StringMaker<unsigned long long>::convert(unsigned long long value) {\n    ReusableStringStream rss;\n    rss << value;\n    if (value > Detail::hexThreshold) {\n        rss << \" (0x\" << std::hex << value << ')';\n    }\n    return rss.str();\n}\n\nstd::string StringMaker<bool>::convert(bool b) {\n    return b ? \"true\" : \"false\";\n}\n\nstd::string StringMaker<signed char>::convert(signed char value) {\n    if (value == '\\r') {\n        return \"'\\\\r'\";\n    } else if (value == '\\f') {\n        return \"'\\\\f'\";\n    } else if (value == '\\n') {\n        return \"'\\\\n'\";\n    } else if (value == '\\t') {\n        return \"'\\\\t'\";\n    } else if ('\\0' <= value && value < ' ') {\n        return ::Catch::Detail::stringify(static_cast<unsigned int>(value));\n    } else {\n        char chstr[] = \"' '\";\n        chstr[1] = value;\n        return chstr;\n    }\n}\nstd::string StringMaker<char>::convert(char c) {\n    return ::Catch::Detail::stringify(static_cast<signed char>(c));\n}\nstd::string StringMaker<unsigned char>::convert(unsigned char c) {\n    return ::Catch::Detail::stringify(static_cast<char>(c));\n}\n\nstd::string StringMaker<std::nullptr_t>::convert(std::nullptr_t) {\n    return \"nullptr\";\n}\n\nint StringMaker<float>::precision = 5;\n\nstd::string StringMaker<float>::convert(float value) {\n    return fpToString(value, precision) + 'f';\n}\n\nint StringMaker<double>::precision = 10;\n\nstd::string StringMaker<double>::convert(double value) {\n    return fpToString(value, precision);\n}\n\nstd::string ratio_string<std::atto>::symbol() { return \"a\"; }\nstd::string ratio_string<std::femto>::symbol() { return \"f\"; }\nstd::string ratio_string<std::pico>::symbol() { return \"p\"; }\nstd::string ratio_string<std::nano>::symbol() { return \"n\"; }\nstd::string ratio_string<std::micro>::symbol() { return \"u\"; }\nstd::string ratio_string<std::milli>::symbol() { return \"m\"; }\n\n} // end namespace Catch\n\n#if defined(__clang__)\n#    pragma clang diagnostic pop\n#endif\n\n// end catch_tostring.cpp\n// start catch_totals.cpp\n\nnamespace Catch {\n\n    Counts Counts::operator - ( Counts const& other ) const {\n        Counts diff;\n        diff.passed = passed - other.passed;\n        diff.failed = failed - other.failed;\n        diff.failedButOk = failedButOk - other.failedButOk;\n        return diff;\n    }\n\n    Counts& Counts::operator += ( Counts const& other ) {\n        passed += other.passed;\n        failed += other.failed;\n        failedButOk += other.failedButOk;\n        return *this;\n    }\n\n    std::size_t Counts::total() const {\n        return passed + failed + failedButOk;\n    }\n    bool Counts::allPassed() const {\n        return failed == 0 && failedButOk == 0;\n    }\n    bool Counts::allOk() const {\n        return failed == 0;\n    }\n\n    Totals Totals::operator - ( Totals const& other ) const {\n        Totals diff;\n        diff.assertions = assertions - other.assertions;\n        diff.testCases = testCases - other.testCases;\n        return diff;\n    }\n\n    Totals& Totals::operator += ( Totals const& other ) {\n        assertions += other.assertions;\n        testCases += other.testCases;\n        return *this;\n    }\n\n    Totals Totals::delta( Totals const& prevTotals ) const {\n        Totals diff = *this - prevTotals;\n        if( diff.assertions.failed > 0 )\n            ++diff.testCases.failed;\n        else if( diff.assertions.failedButOk > 0 )\n            ++diff.testCases.failedButOk;\n        else\n            ++diff.testCases.passed;\n        return diff;\n    }\n\n}\n// end catch_totals.cpp\n// start catch_uncaught_exceptions.cpp\n\n#include <exception>\n\nnamespace Catch {\n    bool uncaught_exceptions() {\n#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)\n        return false;\n#elif defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS)\n        return std::uncaught_exceptions() > 0;\n#else\n        return std::uncaught_exception();\n#endif\n  }\n} // end namespace Catch\n// end catch_uncaught_exceptions.cpp\n// start catch_version.cpp\n\n#include <ostream>\n\nnamespace Catch {\n\n    Version::Version\n        (   unsigned int _majorVersion,\n            unsigned int _minorVersion,\n            unsigned int _patchNumber,\n            char const * const _branchName,\n            unsigned int _buildNumber )\n    :   majorVersion( _majorVersion ),\n        minorVersion( _minorVersion ),\n        patchNumber( _patchNumber ),\n        branchName( _branchName ),\n        buildNumber( _buildNumber )\n    {}\n\n    std::ostream& operator << ( std::ostream& os, Version const& version ) {\n        os  << version.majorVersion << '.'\n            << version.minorVersion << '.'\n            << version.patchNumber;\n        // branchName is never null -> 0th char is \\0 if it is empty\n        if (version.branchName[0]) {\n            os << '-' << version.branchName\n               << '.' << version.buildNumber;\n        }\n        return os;\n    }\n\n    Version const& libraryVersion() {\n        static Version version( 2, 13, 0, \"\", 0 );\n        return version;\n    }\n\n}\n// end catch_version.cpp\n// start catch_wildcard_pattern.cpp\n\nnamespace Catch {\n\n    WildcardPattern::WildcardPattern( std::string const& pattern,\n                                      CaseSensitive::Choice caseSensitivity )\n    :   m_caseSensitivity( caseSensitivity ),\n        m_pattern( normaliseString( pattern ) )\n    {\n        if( startsWith( m_pattern, '*' ) ) {\n            m_pattern = m_pattern.substr( 1 );\n            m_wildcard = WildcardAtStart;\n        }\n        if( endsWith( m_pattern, '*' ) ) {\n            m_pattern = m_pattern.substr( 0, m_pattern.size()-1 );\n            m_wildcard = static_cast<WildcardPosition>( m_wildcard | WildcardAtEnd );\n        }\n    }\n\n    bool WildcardPattern::matches( std::string const& str ) const {\n        switch( m_wildcard ) {\n            case NoWildcard:\n                return m_pattern == normaliseString( str );\n            case WildcardAtStart:\n                return endsWith( normaliseString( str ), m_pattern );\n            case WildcardAtEnd:\n                return startsWith( normaliseString( str ), m_pattern );\n            case WildcardAtBothEnds:\n                return contains( normaliseString( str ), m_pattern );\n            default:\n                CATCH_INTERNAL_ERROR( \"Unknown enum\" );\n        }\n    }\n\n    std::string WildcardPattern::normaliseString( std::string const& str ) const {\n        return trim( m_caseSensitivity == CaseSensitive::No ? toLower( str ) : str );\n    }\n}\n// end catch_wildcard_pattern.cpp\n// start catch_xmlwriter.cpp\n\n#include <iomanip>\n#include <type_traits>\n\nnamespace Catch {\n\nnamespace {\n\n    size_t trailingBytes(unsigned char c) {\n        if ((c & 0xE0) == 0xC0) {\n            return 2;\n        }\n        if ((c & 0xF0) == 0xE0) {\n            return 3;\n        }\n        if ((c & 0xF8) == 0xF0) {\n            return 4;\n        }\n        CATCH_INTERNAL_ERROR(\"Invalid multibyte utf-8 start byte encountered\");\n    }\n\n    uint32_t headerValue(unsigned char c) {\n        if ((c & 0xE0) == 0xC0) {\n            return c & 0x1F;\n        }\n        if ((c & 0xF0) == 0xE0) {\n            return c & 0x0F;\n        }\n        if ((c & 0xF8) == 0xF0) {\n            return c & 0x07;\n        }\n        CATCH_INTERNAL_ERROR(\"Invalid multibyte utf-8 start byte encountered\");\n    }\n\n    void hexEscapeChar(std::ostream& os, unsigned char c) {\n        std::ios_base::fmtflags f(os.flags());\n        os << \"\\\\x\"\n            << std::uppercase << std::hex << std::setfill('0') << std::setw(2)\n            << static_cast<int>(c);\n        os.flags(f);\n    }\n\n    bool shouldNewline(XmlFormatting fmt) {\n        return !!(static_cast<std::underlying_type<XmlFormatting>::type>(fmt & XmlFormatting::Newline));\n    }\n\n    bool shouldIndent(XmlFormatting fmt) {\n        return !!(static_cast<std::underlying_type<XmlFormatting>::type>(fmt & XmlFormatting::Indent));\n    }\n\n} // anonymous namespace\n\n    XmlFormatting operator | (XmlFormatting lhs, XmlFormatting rhs) {\n        return static_cast<XmlFormatting>(\n            static_cast<std::underlying_type<XmlFormatting>::type>(lhs) |\n            static_cast<std::underlying_type<XmlFormatting>::type>(rhs)\n        );\n    }\n\n    XmlFormatting operator & (XmlFormatting lhs, XmlFormatting rhs) {\n        return static_cast<XmlFormatting>(\n            static_cast<std::underlying_type<XmlFormatting>::type>(lhs) &\n            static_cast<std::underlying_type<XmlFormatting>::type>(rhs)\n        );\n    }\n\n    XmlEncode::XmlEncode( std::string const& str, ForWhat forWhat )\n    :   m_str( str ),\n        m_forWhat( forWhat )\n    {}\n\n    void XmlEncode::encodeTo( std::ostream& os ) const {\n        // Apostrophe escaping not necessary if we always use \" to write attributes\n        // (see: http://www.w3.org/TR/xml/#syntax)\n\n        for( std::size_t idx = 0; idx < m_str.size(); ++ idx ) {\n            unsigned char c = m_str[idx];\n            switch (c) {\n            case '<':   os << \"&lt;\"; break;\n            case '&':   os << \"&amp;\"; break;\n\n            case '>':\n                // See: http://www.w3.org/TR/xml/#syntax\n                if (idx > 2 && m_str[idx - 1] == ']' && m_str[idx - 2] == ']')\n                    os << \"&gt;\";\n                else\n                    os << c;\n                break;\n\n            case '\\\"':\n                if (m_forWhat == ForAttributes)\n                    os << \"&quot;\";\n                else\n                    os << c;\n                break;\n\n            default:\n                // Check for control characters and invalid utf-8\n\n                // Escape control characters in standard ascii\n                // see http://stackoverflow.com/questions/404107/why-are-control-characters-illegal-in-xml-1-0\n                if (c < 0x09 || (c > 0x0D && c < 0x20) || c == 0x7F) {\n                    hexEscapeChar(os, c);\n                    break;\n                }\n\n                // Plain ASCII: Write it to stream\n                if (c < 0x7F) {\n                    os << c;\n                    break;\n                }\n\n                // UTF-8 territory\n                // Check if the encoding is valid and if it is not, hex escape bytes.\n                // Important: We do not check the exact decoded values for validity, only the encoding format\n                // First check that this bytes is a valid lead byte:\n                // This means that it is not encoded as 1111 1XXX\n                // Or as 10XX XXXX\n                if (c <  0xC0 ||\n                    c >= 0xF8) {\n                    hexEscapeChar(os, c);\n                    break;\n                }\n\n                auto encBytes = trailingBytes(c);\n                // Are there enough bytes left to avoid accessing out-of-bounds memory?\n                if (idx + encBytes - 1 >= m_str.size()) {\n                    hexEscapeChar(os, c);\n                    break;\n                }\n                // The header is valid, check data\n                // The next encBytes bytes must together be a valid utf-8\n                // This means: bitpattern 10XX XXXX and the extracted value is sane (ish)\n                bool valid = true;\n                uint32_t value = headerValue(c);\n                for (std::size_t n = 1; n < encBytes; ++n) {\n                    unsigned char nc = m_str[idx + n];\n                    valid &= ((nc & 0xC0) == 0x80);\n                    value = (value << 6) | (nc & 0x3F);\n                }\n\n                if (\n                    // Wrong bit pattern of following bytes\n                    (!valid) ||\n                    // Overlong encodings\n                    (value < 0x80) ||\n                    (0x80 <= value && value < 0x800   && encBytes > 2) ||\n                    (0x800 < value && value < 0x10000 && encBytes > 3) ||\n                    // Encoded value out of range\n                    (value >= 0x110000)\n                    ) {\n                    hexEscapeChar(os, c);\n                    break;\n                }\n\n                // If we got here, this is in fact a valid(ish) utf-8 sequence\n                for (std::size_t n = 0; n < encBytes; ++n) {\n                    os << m_str[idx + n];\n                }\n                idx += encBytes - 1;\n                break;\n            }\n        }\n    }\n\n    std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode ) {\n        xmlEncode.encodeTo( os );\n        return os;\n    }\n\n    XmlWriter::ScopedElement::ScopedElement( XmlWriter* writer, XmlFormatting fmt )\n    :   m_writer( writer ),\n        m_fmt(fmt)\n    {}\n\n    XmlWriter::ScopedElement::ScopedElement( ScopedElement&& other ) noexcept\n    :   m_writer( other.m_writer ),\n        m_fmt(other.m_fmt)\n    {\n        other.m_writer = nullptr;\n        other.m_fmt = XmlFormatting::None;\n    }\n    XmlWriter::ScopedElement& XmlWriter::ScopedElement::operator=( ScopedElement&& other ) noexcept {\n        if ( m_writer ) {\n            m_writer->endElement();\n        }\n        m_writer = other.m_writer;\n        other.m_writer = nullptr;\n        m_fmt = other.m_fmt;\n        other.m_fmt = XmlFormatting::None;\n        return *this;\n    }\n\n    XmlWriter::ScopedElement::~ScopedElement() {\n        if (m_writer) {\n            m_writer->endElement(m_fmt);\n        }\n    }\n\n    XmlWriter::ScopedElement& XmlWriter::ScopedElement::writeText( std::string const& text, XmlFormatting fmt ) {\n        m_writer->writeText( text, fmt );\n        return *this;\n    }\n\n    XmlWriter::XmlWriter( std::ostream& os ) : m_os( os )\n    {\n        writeDeclaration();\n    }\n\n    XmlWriter::~XmlWriter() {\n        while (!m_tags.empty()) {\n            endElement();\n        }\n        newlineIfNecessary();\n    }\n\n    XmlWriter& XmlWriter::startElement( std::string const& name, XmlFormatting fmt ) {\n        ensureTagClosed();\n        newlineIfNecessary();\n        if (shouldIndent(fmt)) {\n            m_os << m_indent;\n            m_indent += \"  \";\n        }\n        m_os << '<' << name;\n        m_tags.push_back( name );\n        m_tagIsOpen = true;\n        applyFormatting(fmt);\n        return *this;\n    }\n\n    XmlWriter::ScopedElement XmlWriter::scopedElement( std::string const& name, XmlFormatting fmt ) {\n        ScopedElement scoped( this, fmt );\n        startElement( name, fmt );\n        return scoped;\n    }\n\n    XmlWriter& XmlWriter::endElement(XmlFormatting fmt) {\n        m_indent = m_indent.substr(0, m_indent.size() - 2);\n\n        if( m_tagIsOpen ) {\n            m_os << \"/>\";\n            m_tagIsOpen = false;\n        } else {\n            newlineIfNecessary();\n            if (shouldIndent(fmt)) {\n                m_os << m_indent;\n            }\n            m_os << \"</\" << m_tags.back() << \">\";\n        }\n        m_os << std::flush;\n        applyFormatting(fmt);\n        m_tags.pop_back();\n        return *this;\n    }\n\n    XmlWriter& XmlWriter::writeAttribute( std::string const& name, std::string const& attribute ) {\n        if( !name.empty() && !attribute.empty() )\n            m_os << ' ' << name << \"=\\\"\" << XmlEncode( attribute, XmlEncode::ForAttributes ) << '\"';\n        return *this;\n    }\n\n    XmlWriter& XmlWriter::writeAttribute( std::string const& name, bool attribute ) {\n        m_os << ' ' << name << \"=\\\"\" << ( attribute ? \"true\" : \"false\" ) << '\"';\n        return *this;\n    }\n\n    XmlWriter& XmlWriter::writeText( std::string const& text, XmlFormatting fmt) {\n        if( !text.empty() ){\n            bool tagWasOpen = m_tagIsOpen;\n            ensureTagClosed();\n            if (tagWasOpen && shouldIndent(fmt)) {\n                m_os << m_indent;\n            }\n            m_os << XmlEncode( text );\n            applyFormatting(fmt);\n        }\n        return *this;\n    }\n\n    XmlWriter& XmlWriter::writeComment( std::string const& text, XmlFormatting fmt) {\n        ensureTagClosed();\n        if (shouldIndent(fmt)) {\n            m_os << m_indent;\n        }\n        m_os << \"<!--\" << text << \"-->\";\n        applyFormatting(fmt);\n        return *this;\n    }\n\n    void XmlWriter::writeStylesheetRef( std::string const& url ) {\n        m_os << \"<?xml-stylesheet type=\\\"text/xsl\\\" href=\\\"\" << url << \"\\\"?>\\n\";\n    }\n\n    XmlWriter& XmlWriter::writeBlankLine() {\n        ensureTagClosed();\n        m_os << '\\n';\n        return *this;\n    }\n\n    void XmlWriter::ensureTagClosed() {\n        if( m_tagIsOpen ) {\n            m_os << '>' << std::flush;\n            newlineIfNecessary();\n            m_tagIsOpen = false;\n        }\n    }\n\n    void XmlWriter::applyFormatting(XmlFormatting fmt) {\n        m_needsNewline = shouldNewline(fmt);\n    }\n\n    void XmlWriter::writeDeclaration() {\n        m_os << \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n\";\n    }\n\n    void XmlWriter::newlineIfNecessary() {\n        if( m_needsNewline ) {\n            m_os << std::endl;\n            m_needsNewline = false;\n        }\n    }\n}\n// end catch_xmlwriter.cpp\n// start catch_reporter_bases.cpp\n\n#include <cstring>\n#include <cfloat>\n#include <cstdio>\n#include <cassert>\n#include <memory>\n\nnamespace Catch {\n    void prepareExpandedExpression(AssertionResult& result) {\n        result.getExpandedExpression();\n    }\n\n    // Because formatting using c++ streams is stateful, drop down to C is required\n    // Alternatively we could use stringstream, but its performance is... not good.\n    std::string getFormattedDuration( double duration ) {\n        // Max exponent + 1 is required to represent the whole part\n        // + 1 for decimal point\n        // + 3 for the 3 decimal places\n        // + 1 for null terminator\n        const std::size_t maxDoubleSize = DBL_MAX_10_EXP + 1 + 1 + 3 + 1;\n        char buffer[maxDoubleSize];\n\n        // Save previous errno, to prevent sprintf from overwriting it\n        ErrnoGuard guard;\n#ifdef _MSC_VER\n        sprintf_s(buffer, \"%.3f\", duration);\n#else\n        std::sprintf(buffer, \"%.3f\", duration);\n#endif\n        return std::string(buffer);\n    }\n\n    bool shouldShowDuration( IConfig const& config, double duration ) {\n        if ( config.showDurations() == ShowDurations::Always ) {\n            return true;\n        }\n        if ( config.showDurations() == ShowDurations::Never ) {\n            return false;\n        }\n        const double min = config.minDuration();\n        return min >= 0 && duration >= min;\n    }\n\n    std::string serializeFilters( std::vector<std::string> const& container ) {\n        ReusableStringStream oss;\n        bool first = true;\n        for (auto&& filter : container)\n        {\n            if (!first)\n                oss << ' ';\n            else\n                first = false;\n\n            oss << filter;\n        }\n        return oss.str();\n    }\n\n    TestEventListenerBase::TestEventListenerBase(ReporterConfig const & _config)\n        :StreamingReporterBase(_config) {}\n\n    std::set<Verbosity> TestEventListenerBase::getSupportedVerbosities() {\n        return { Verbosity::Quiet, Verbosity::Normal, Verbosity::High };\n    }\n\n    void TestEventListenerBase::assertionStarting(AssertionInfo const &) {}\n\n    bool TestEventListenerBase::assertionEnded(AssertionStats const &) {\n        return false;\n    }\n\n} // end namespace Catch\n// end catch_reporter_bases.cpp\n// start catch_reporter_compact.cpp\n\nnamespace {\n\n#ifdef CATCH_PLATFORM_MAC\n    const char* failedString() { return \"FAILED\"; }\n    const char* passedString() { return \"PASSED\"; }\n#else\n    const char* failedString() { return \"failed\"; }\n    const char* passedString() { return \"passed\"; }\n#endif\n\n    // Colour::LightGrey\n    Catch::Colour::Code dimColour() { return Catch::Colour::FileName; }\n\n    std::string bothOrAll( std::size_t count ) {\n        return count == 1 ? std::string() :\n               count == 2 ? \"both \" : \"all \" ;\n    }\n\n} // anon namespace\n\nnamespace Catch {\nnamespace {\n// Colour, message variants:\n// - white: No tests ran.\n// -   red: Failed [both/all] N test cases, failed [both/all] M assertions.\n// - white: Passed [both/all] N test cases (no assertions).\n// -   red: Failed N tests cases, failed M assertions.\n// - green: Passed [both/all] N tests cases with M assertions.\nvoid printTotals(std::ostream& out, const Totals& totals) {\n    if (totals.testCases.total() == 0) {\n        out << \"No tests ran.\";\n    } else if (totals.testCases.failed == totals.testCases.total()) {\n        Colour colour(Colour::ResultError);\n        const std::string qualify_assertions_failed =\n            totals.assertions.failed == totals.assertions.total() ?\n            bothOrAll(totals.assertions.failed) : std::string();\n        out <<\n            \"Failed \" << bothOrAll(totals.testCases.failed)\n            << pluralise(totals.testCases.failed, \"test case\") << \", \"\n            \"failed \" << qualify_assertions_failed <<\n            pluralise(totals.assertions.failed, \"assertion\") << '.';\n    } else if (totals.assertions.total() == 0) {\n        out <<\n            \"Passed \" << bothOrAll(totals.testCases.total())\n            << pluralise(totals.testCases.total(), \"test case\")\n            << \" (no assertions).\";\n    } else if (totals.assertions.failed) {\n        Colour colour(Colour::ResultError);\n        out <<\n            \"Failed \" << pluralise(totals.testCases.failed, \"test case\") << \", \"\n            \"failed \" << pluralise(totals.assertions.failed, \"assertion\") << '.';\n    } else {\n        Colour colour(Colour::ResultSuccess);\n        out <<\n            \"Passed \" << bothOrAll(totals.testCases.passed)\n            << pluralise(totals.testCases.passed, \"test case\") <<\n            \" with \" << pluralise(totals.assertions.passed, \"assertion\") << '.';\n    }\n}\n\n// Implementation of CompactReporter formatting\nclass AssertionPrinter {\npublic:\n    AssertionPrinter& operator= (AssertionPrinter const&) = delete;\n    AssertionPrinter(AssertionPrinter const&) = delete;\n    AssertionPrinter(std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages)\n        : stream(_stream)\n        , result(_stats.assertionResult)\n        , messages(_stats.infoMessages)\n        , itMessage(_stats.infoMessages.begin())\n        , printInfoMessages(_printInfoMessages) {}\n\n    void print() {\n        printSourceInfo();\n\n        itMessage = messages.begin();\n\n        switch (result.getResultType()) {\n        case ResultWas::Ok:\n            printResultType(Colour::ResultSuccess, passedString());\n            printOriginalExpression();\n            printReconstructedExpression();\n            if (!result.hasExpression())\n                printRemainingMessages(Colour::None);\n            else\n                printRemainingMessages();\n            break;\n        case ResultWas::ExpressionFailed:\n            if (result.isOk())\n                printResultType(Colour::ResultSuccess, failedString() + std::string(\" - but was ok\"));\n            else\n                printResultType(Colour::Error, failedString());\n            printOriginalExpression();\n            printReconstructedExpression();\n            printRemainingMessages();\n            break;\n        case ResultWas::ThrewException:\n            printResultType(Colour::Error, failedString());\n            printIssue(\"unexpected exception with message:\");\n            printMessage();\n            printExpressionWas();\n            printRemainingMessages();\n            break;\n        case ResultWas::FatalErrorCondition:\n            printResultType(Colour::Error, failedString());\n            printIssue(\"fatal error condition with message:\");\n            printMessage();\n            printExpressionWas();\n            printRemainingMessages();\n            break;\n        case ResultWas::DidntThrowException:\n            printResultType(Colour::Error, failedString());\n            printIssue(\"expected exception, got none\");\n            printExpressionWas();\n            printRemainingMessages();\n            break;\n        case ResultWas::Info:\n            printResultType(Colour::None, \"info\");\n            printMessage();\n            printRemainingMessages();\n            break;\n        case ResultWas::Warning:\n            printResultType(Colour::None, \"warning\");\n            printMessage();\n            printRemainingMessages();\n            break;\n        case ResultWas::ExplicitFailure:\n            printResultType(Colour::Error, failedString());\n            printIssue(\"explicitly\");\n            printRemainingMessages(Colour::None);\n            break;\n            // These cases are here to prevent compiler warnings\n        case ResultWas::Unknown:\n        case ResultWas::FailureBit:\n        case ResultWas::Exception:\n            printResultType(Colour::Error, \"** internal error **\");\n            break;\n        }\n    }\n\nprivate:\n    void printSourceInfo() const {\n        Colour colourGuard(Colour::FileName);\n        stream << result.getSourceInfo() << ':';\n    }\n\n    void printResultType(Colour::Code colour, std::string const& passOrFail) const {\n        if (!passOrFail.empty()) {\n            {\n                Colour colourGuard(colour);\n                stream << ' ' << passOrFail;\n            }\n            stream << ':';\n        }\n    }\n\n    void printIssue(std::string const& issue) const {\n        stream << ' ' << issue;\n    }\n\n    void printExpressionWas() {\n        if (result.hasExpression()) {\n            stream << ';';\n            {\n                Colour colour(dimColour());\n                stream << \" expression was:\";\n            }\n            printOriginalExpression();\n        }\n    }\n\n    void printOriginalExpression() const {\n        if (result.hasExpression()) {\n            stream << ' ' << result.getExpression();\n        }\n    }\n\n    void printReconstructedExpression() const {\n        if (result.hasExpandedExpression()) {\n            {\n                Colour colour(dimColour());\n                stream << \" for: \";\n            }\n            stream << result.getExpandedExpression();\n        }\n    }\n\n    void printMessage() {\n        if (itMessage != messages.end()) {\n            stream << \" '\" << itMessage->message << '\\'';\n            ++itMessage;\n        }\n    }\n\n    void printRemainingMessages(Colour::Code colour = dimColour()) {\n        if (itMessage == messages.end())\n            return;\n\n        const auto itEnd = messages.cend();\n        const auto N = static_cast<std::size_t>(std::distance(itMessage, itEnd));\n\n        {\n            Colour colourGuard(colour);\n            stream << \" with \" << pluralise(N, \"message\") << ':';\n        }\n\n        while (itMessage != itEnd) {\n            // If this assertion is a warning ignore any INFO messages\n            if (printInfoMessages || itMessage->type != ResultWas::Info) {\n                printMessage();\n                if (itMessage != itEnd) {\n                    Colour colourGuard(dimColour());\n                    stream << \" and\";\n                }\n                continue;\n            }\n            ++itMessage;\n        }\n    }\n\nprivate:\n    std::ostream& stream;\n    AssertionResult const& result;\n    std::vector<MessageInfo> messages;\n    std::vector<MessageInfo>::const_iterator itMessage;\n    bool printInfoMessages;\n};\n\n} // anon namespace\n\n        std::string CompactReporter::getDescription() {\n            return \"Reports test results on a single line, suitable for IDEs\";\n        }\n\n        void CompactReporter::noMatchingTestCases( std::string const& spec ) {\n            stream << \"No test cases matched '\" << spec << '\\'' << std::endl;\n        }\n\n        void CompactReporter::assertionStarting( AssertionInfo const& ) {}\n\n        bool CompactReporter::assertionEnded( AssertionStats const& _assertionStats ) {\n            AssertionResult const& result = _assertionStats.assertionResult;\n\n            bool printInfoMessages = true;\n\n            // Drop out if result was successful and we're not printing those\n            if( !m_config->includeSuccessfulResults() && result.isOk() ) {\n                if( result.getResultType() != ResultWas::Warning )\n                    return false;\n                printInfoMessages = false;\n            }\n\n            AssertionPrinter printer( stream, _assertionStats, printInfoMessages );\n            printer.print();\n\n            stream << std::endl;\n            return true;\n        }\n\n        void CompactReporter::sectionEnded(SectionStats const& _sectionStats) {\n            double dur = _sectionStats.durationInSeconds;\n            if ( shouldShowDuration( *m_config, dur ) ) {\n                stream << getFormattedDuration( dur ) << \" s: \" << _sectionStats.sectionInfo.name << std::endl;\n            }\n        }\n\n        void CompactReporter::testRunEnded( TestRunStats const& _testRunStats ) {\n            printTotals( stream, _testRunStats.totals );\n            stream << '\\n' << std::endl;\n            StreamingReporterBase::testRunEnded( _testRunStats );\n        }\n\n        CompactReporter::~CompactReporter() {}\n\n    CATCH_REGISTER_REPORTER( \"compact\", CompactReporter )\n\n} // end namespace Catch\n// end catch_reporter_compact.cpp\n// start catch_reporter_console.cpp\n\n#include <cfloat>\n#include <cstdio>\n\n#if defined(_MSC_VER)\n#pragma warning(push)\n#pragma warning(disable:4061) // Not all labels are EXPLICITLY handled in switch\n // Note that 4062 (not all labels are handled and default is missing) is enabled\n#endif\n\n#if defined(__clang__)\n#  pragma clang diagnostic push\n// For simplicity, benchmarking-only helpers are always enabled\n#  pragma clang diagnostic ignored \"-Wunused-function\"\n#endif\n\nnamespace Catch {\n\nnamespace {\n\n// Formatter impl for ConsoleReporter\nclass ConsoleAssertionPrinter {\npublic:\n    ConsoleAssertionPrinter& operator= (ConsoleAssertionPrinter const&) = delete;\n    ConsoleAssertionPrinter(ConsoleAssertionPrinter const&) = delete;\n    ConsoleAssertionPrinter(std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages)\n        : stream(_stream),\n        stats(_stats),\n        result(_stats.assertionResult),\n        colour(Colour::None),\n        message(result.getMessage()),\n        messages(_stats.infoMessages),\n        printInfoMessages(_printInfoMessages) {\n        switch (result.getResultType()) {\n        case ResultWas::Ok:\n            colour = Colour::Success;\n            passOrFail = \"PASSED\";\n            //if( result.hasMessage() )\n            if (_stats.infoMessages.size() == 1)\n                messageLabel = \"with message\";\n            if (_stats.infoMessages.size() > 1)\n                messageLabel = \"with messages\";\n            break;\n        case ResultWas::ExpressionFailed:\n            if (result.isOk()) {\n                colour = Colour::Success;\n                passOrFail = \"FAILED - but was ok\";\n            } else {\n                colour = Colour::Error;\n                passOrFail = \"FAILED\";\n            }\n            if (_stats.infoMessages.size() == 1)\n                messageLabel = \"with message\";\n            if (_stats.infoMessages.size() > 1)\n                messageLabel = \"with messages\";\n            break;\n        case ResultWas::ThrewException:\n            colour = Colour::Error;\n            passOrFail = \"FAILED\";\n            messageLabel = \"due to unexpected exception with \";\n            if (_stats.infoMessages.size() == 1)\n                messageLabel += \"message\";\n            if (_stats.infoMessages.size() > 1)\n                messageLabel += \"messages\";\n            break;\n        case ResultWas::FatalErrorCondition:\n            colour = Colour::Error;\n            passOrFail = \"FAILED\";\n            messageLabel = \"due to a fatal error condition\";\n            break;\n        case ResultWas::DidntThrowException:\n            colour = Colour::Error;\n            passOrFail = \"FAILED\";\n            messageLabel = \"because no exception was thrown where one was expected\";\n            break;\n        case ResultWas::Info:\n            messageLabel = \"info\";\n            break;\n        case ResultWas::Warning:\n            messageLabel = \"warning\";\n            break;\n        case ResultWas::ExplicitFailure:\n            passOrFail = \"FAILED\";\n            colour = Colour::Error;\n            if (_stats.infoMessages.size() == 1)\n                messageLabel = \"explicitly with message\";\n            if (_stats.infoMessages.size() > 1)\n                messageLabel = \"explicitly with messages\";\n            break;\n            // These cases are here to prevent compiler warnings\n        case ResultWas::Unknown:\n        case ResultWas::FailureBit:\n        case ResultWas::Exception:\n            passOrFail = \"** internal error **\";\n            colour = Colour::Error;\n            break;\n        }\n    }\n\n    void print() const {\n        printSourceInfo();\n        if (stats.totals.assertions.total() > 0) {\n            printResultType();\n            printOriginalExpression();\n            printReconstructedExpression();\n        } else {\n            stream << '\\n';\n        }\n        printMessage();\n    }\n\nprivate:\n    void printResultType() const {\n        if (!passOrFail.empty()) {\n            Colour colourGuard(colour);\n            stream << passOrFail << \":\\n\";\n        }\n    }\n    void printOriginalExpression() const {\n        if (result.hasExpression()) {\n            Colour colourGuard(Colour::OriginalExpression);\n            stream << \"  \";\n            stream << result.getExpressionInMacro();\n            stream << '\\n';\n        }\n    }\n    void printReconstructedExpression() const {\n        if (result.hasExpandedExpression()) {\n            stream << \"with expansion:\\n\";\n            Colour colourGuard(Colour::ReconstructedExpression);\n            stream << Column(result.getExpandedExpression()).indent(2) << '\\n';\n        }\n    }\n    void printMessage() const {\n        if (!messageLabel.empty())\n            stream << messageLabel << ':' << '\\n';\n        for (auto const& msg : messages) {\n            // If this assertion is a warning ignore any INFO messages\n            if (printInfoMessages || msg.type != ResultWas::Info)\n                stream << Column(msg.message).indent(2) << '\\n';\n        }\n    }\n    void printSourceInfo() const {\n        Colour colourGuard(Colour::FileName);\n        stream << result.getSourceInfo() << \": \";\n    }\n\n    std::ostream& stream;\n    AssertionStats const& stats;\n    AssertionResult const& result;\n    Colour::Code colour;\n    std::string passOrFail;\n    std::string messageLabel;\n    std::string message;\n    std::vector<MessageInfo> messages;\n    bool printInfoMessages;\n};\n\nstd::size_t makeRatio(std::size_t number, std::size_t total) {\n    std::size_t ratio = total > 0 ? CATCH_CONFIG_CONSOLE_WIDTH * number / total : 0;\n    return (ratio == 0 && number > 0) ? 1 : ratio;\n}\n\nstd::size_t& findMax(std::size_t& i, std::size_t& j, std::size_t& k) {\n    if (i > j && i > k)\n        return i;\n    else if (j > k)\n        return j;\n    else\n        return k;\n}\n\nstruct ColumnInfo {\n    enum Justification { Left, Right };\n    std::string name;\n    int width;\n    Justification justification;\n};\nstruct ColumnBreak {};\nstruct RowBreak {};\n\nclass Duration {\n    enum class Unit {\n        Auto,\n        Nanoseconds,\n        Microseconds,\n        Milliseconds,\n        Seconds,\n        Minutes\n    };\n    static const uint64_t s_nanosecondsInAMicrosecond = 1000;\n    static const uint64_t s_nanosecondsInAMillisecond = 1000 * s_nanosecondsInAMicrosecond;\n    static const uint64_t s_nanosecondsInASecond = 1000 * s_nanosecondsInAMillisecond;\n    static const uint64_t s_nanosecondsInAMinute = 60 * s_nanosecondsInASecond;\n\n    double m_inNanoseconds;\n    Unit m_units;\n\npublic:\n    explicit Duration(double inNanoseconds, Unit units = Unit::Auto)\n        : m_inNanoseconds(inNanoseconds),\n        m_units(units) {\n        if (m_units == Unit::Auto) {\n            if (m_inNanoseconds < s_nanosecondsInAMicrosecond)\n                m_units = Unit::Nanoseconds;\n            else if (m_inNanoseconds < s_nanosecondsInAMillisecond)\n                m_units = Unit::Microseconds;\n            else if (m_inNanoseconds < s_nanosecondsInASecond)\n                m_units = Unit::Milliseconds;\n            else if (m_inNanoseconds < s_nanosecondsInAMinute)\n                m_units = Unit::Seconds;\n            else\n                m_units = Unit::Minutes;\n        }\n\n    }\n\n    auto value() const -> double {\n        switch (m_units) {\n        case Unit::Microseconds:\n            return m_inNanoseconds / static_cast<double>(s_nanosecondsInAMicrosecond);\n        case Unit::Milliseconds:\n            return m_inNanoseconds / static_cast<double>(s_nanosecondsInAMillisecond);\n        case Unit::Seconds:\n            return m_inNanoseconds / static_cast<double>(s_nanosecondsInASecond);\n        case Unit::Minutes:\n            return m_inNanoseconds / static_cast<double>(s_nanosecondsInAMinute);\n        default:\n            return m_inNanoseconds;\n        }\n    }\n    auto unitsAsString() const -> std::string {\n        switch (m_units) {\n        case Unit::Nanoseconds:\n            return \"ns\";\n        case Unit::Microseconds:\n            return \"us\";\n        case Unit::Milliseconds:\n            return \"ms\";\n        case Unit::Seconds:\n            return \"s\";\n        case Unit::Minutes:\n            return \"m\";\n        default:\n            return \"** internal error **\";\n        }\n\n    }\n    friend auto operator << (std::ostream& os, Duration const& duration) -> std::ostream& {\n        return os << duration.value() << ' ' << duration.unitsAsString();\n    }\n};\n} // end anon namespace\n\nclass TablePrinter {\n    std::ostream& m_os;\n    std::vector<ColumnInfo> m_columnInfos;\n    std::ostringstream m_oss;\n    int m_currentColumn = -1;\n    bool m_isOpen = false;\n\npublic:\n    TablePrinter( std::ostream& os, std::vector<ColumnInfo> columnInfos )\n    :   m_os( os ),\n        m_columnInfos( std::move( columnInfos ) ) {}\n\n    auto columnInfos() const -> std::vector<ColumnInfo> const& {\n        return m_columnInfos;\n    }\n\n    void open() {\n        if (!m_isOpen) {\n            m_isOpen = true;\n            *this << RowBreak();\n\n\t\t\tColumns headerCols;\n\t\t\tSpacer spacer(2);\n\t\t\tfor (auto const& info : m_columnInfos) {\n\t\t\t\theaderCols += Column(info.name).width(static_cast<std::size_t>(info.width - 2));\n\t\t\t\theaderCols += spacer;\n\t\t\t}\n\t\t\tm_os << headerCols << '\\n';\n\n            m_os << Catch::getLineOfChars<'-'>() << '\\n';\n        }\n    }\n    void close() {\n        if (m_isOpen) {\n            *this << RowBreak();\n            m_os << std::endl;\n            m_isOpen = false;\n        }\n    }\n\n    template<typename T>\n    friend TablePrinter& operator << (TablePrinter& tp, T const& value) {\n        tp.m_oss << value;\n        return tp;\n    }\n\n    friend TablePrinter& operator << (TablePrinter& tp, ColumnBreak) {\n        auto colStr = tp.m_oss.str();\n        const auto strSize = colStr.size();\n        tp.m_oss.str(\"\");\n        tp.open();\n        if (tp.m_currentColumn == static_cast<int>(tp.m_columnInfos.size() - 1)) {\n            tp.m_currentColumn = -1;\n            tp.m_os << '\\n';\n        }\n        tp.m_currentColumn++;\n\n        auto colInfo = tp.m_columnInfos[tp.m_currentColumn];\n        auto padding = (strSize + 1 < static_cast<std::size_t>(colInfo.width))\n            ? std::string(colInfo.width - (strSize + 1), ' ')\n            : std::string();\n        if (colInfo.justification == ColumnInfo::Left)\n            tp.m_os << colStr << padding << ' ';\n        else\n            tp.m_os << padding << colStr << ' ';\n        return tp;\n    }\n\n    friend TablePrinter& operator << (TablePrinter& tp, RowBreak) {\n        if (tp.m_currentColumn > 0) {\n            tp.m_os << '\\n';\n            tp.m_currentColumn = -1;\n        }\n        return tp;\n    }\n};\n\nConsoleReporter::ConsoleReporter(ReporterConfig const& config)\n    : StreamingReporterBase(config),\n    m_tablePrinter(new TablePrinter(config.stream(),\n        [&config]() -> std::vector<ColumnInfo> {\n        if (config.fullConfig()->benchmarkNoAnalysis())\n        {\n            return{\n                { \"benchmark name\", CATCH_CONFIG_CONSOLE_WIDTH - 43, ColumnInfo::Left },\n                { \"     samples\", 14, ColumnInfo::Right },\n                { \"  iterations\", 14, ColumnInfo::Right },\n                { \"        mean\", 14, ColumnInfo::Right }\n            };\n        }\n        else\n        {\n            return{\n                { \"benchmark name\", CATCH_CONFIG_CONSOLE_WIDTH - 43, ColumnInfo::Left },\n                { \"samples      mean       std dev\", 14, ColumnInfo::Right },\n                { \"iterations   low mean   low std dev\", 14, ColumnInfo::Right },\n                { \"estimated    high mean  high std dev\", 14, ColumnInfo::Right }\n            };\n        }\n    }())) {}\nConsoleReporter::~ConsoleReporter() = default;\n\nstd::string ConsoleReporter::getDescription() {\n    return \"Reports test results as plain lines of text\";\n}\n\nvoid ConsoleReporter::noMatchingTestCases(std::string const& spec) {\n    stream << \"No test cases matched '\" << spec << '\\'' << std::endl;\n}\n\nvoid ConsoleReporter::reportInvalidArguments(std::string const&arg){\n    stream << \"Invalid Filter: \" << arg << std::endl;\n}\n\nvoid ConsoleReporter::assertionStarting(AssertionInfo const&) {}\n\nbool ConsoleReporter::assertionEnded(AssertionStats const& _assertionStats) {\n    AssertionResult const& result = _assertionStats.assertionResult;\n\n    bool includeResults = m_config->includeSuccessfulResults() || !result.isOk();\n\n    // Drop out if result was successful but we're not printing them.\n    if (!includeResults && result.getResultType() != ResultWas::Warning)\n        return false;\n\n    lazyPrint();\n\n    ConsoleAssertionPrinter printer(stream, _assertionStats, includeResults);\n    printer.print();\n    stream << std::endl;\n    return true;\n}\n\nvoid ConsoleReporter::sectionStarting(SectionInfo const& _sectionInfo) {\n    m_tablePrinter->close();\n    m_headerPrinted = false;\n    StreamingReporterBase::sectionStarting(_sectionInfo);\n}\nvoid ConsoleReporter::sectionEnded(SectionStats const& _sectionStats) {\n    m_tablePrinter->close();\n    if (_sectionStats.missingAssertions) {\n        lazyPrint();\n        Colour colour(Colour::ResultError);\n        if (m_sectionStack.size() > 1)\n            stream << \"\\nNo assertions in section\";\n        else\n            stream << \"\\nNo assertions in test case\";\n        stream << \" '\" << _sectionStats.sectionInfo.name << \"'\\n\" << std::endl;\n    }\n    double dur = _sectionStats.durationInSeconds;\n    if (shouldShowDuration(*m_config, dur)) {\n        stream << getFormattedDuration(dur) << \" s: \" << _sectionStats.sectionInfo.name << std::endl;\n    }\n    if (m_headerPrinted) {\n        m_headerPrinted = false;\n    }\n    StreamingReporterBase::sectionEnded(_sectionStats);\n}\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\nvoid ConsoleReporter::benchmarkPreparing(std::string const& name) {\n\tlazyPrintWithoutClosingBenchmarkTable();\n\n\tauto nameCol = Column(name).width(static_cast<std::size_t>(m_tablePrinter->columnInfos()[0].width - 2));\n\n\tbool firstLine = true;\n\tfor (auto line : nameCol) {\n\t\tif (!firstLine)\n\t\t\t(*m_tablePrinter) << ColumnBreak() << ColumnBreak() << ColumnBreak();\n\t\telse\n\t\t\tfirstLine = false;\n\n\t\t(*m_tablePrinter) << line << ColumnBreak();\n\t}\n}\n\nvoid ConsoleReporter::benchmarkStarting(BenchmarkInfo const& info) {\n    (*m_tablePrinter) << info.samples << ColumnBreak()\n        << info.iterations << ColumnBreak();\n    if (!m_config->benchmarkNoAnalysis())\n        (*m_tablePrinter) << Duration(info.estimatedDuration) << ColumnBreak();\n}\nvoid ConsoleReporter::benchmarkEnded(BenchmarkStats<> const& stats) {\n    if (m_config->benchmarkNoAnalysis())\n    {\n        (*m_tablePrinter) << Duration(stats.mean.point.count()) << ColumnBreak();\n    }\n    else\n    {\n        (*m_tablePrinter) << ColumnBreak()\n            << Duration(stats.mean.point.count()) << ColumnBreak()\n            << Duration(stats.mean.lower_bound.count()) << ColumnBreak()\n            << Duration(stats.mean.upper_bound.count()) << ColumnBreak() << ColumnBreak()\n            << Duration(stats.standardDeviation.point.count()) << ColumnBreak()\n            << Duration(stats.standardDeviation.lower_bound.count()) << ColumnBreak()\n            << Duration(stats.standardDeviation.upper_bound.count()) << ColumnBreak() << ColumnBreak() << ColumnBreak() << ColumnBreak() << ColumnBreak();\n    }\n}\n\nvoid ConsoleReporter::benchmarkFailed(std::string const& error) {\n\tColour colour(Colour::Red);\n    (*m_tablePrinter)\n        << \"Benchmark failed (\" << error << ')'\n        << ColumnBreak() << RowBreak();\n}\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\nvoid ConsoleReporter::testCaseEnded(TestCaseStats const& _testCaseStats) {\n    m_tablePrinter->close();\n    StreamingReporterBase::testCaseEnded(_testCaseStats);\n    m_headerPrinted = false;\n}\nvoid ConsoleReporter::testGroupEnded(TestGroupStats const& _testGroupStats) {\n    if (currentGroupInfo.used) {\n        printSummaryDivider();\n        stream << \"Summary for group '\" << _testGroupStats.groupInfo.name << \"':\\n\";\n        printTotals(_testGroupStats.totals);\n        stream << '\\n' << std::endl;\n    }\n    StreamingReporterBase::testGroupEnded(_testGroupStats);\n}\nvoid ConsoleReporter::testRunEnded(TestRunStats const& _testRunStats) {\n    printTotalsDivider(_testRunStats.totals);\n    printTotals(_testRunStats.totals);\n    stream << std::endl;\n    StreamingReporterBase::testRunEnded(_testRunStats);\n}\nvoid ConsoleReporter::testRunStarting(TestRunInfo const& _testInfo) {\n    StreamingReporterBase::testRunStarting(_testInfo);\n    printTestFilters();\n}\n\nvoid ConsoleReporter::lazyPrint() {\n\n    m_tablePrinter->close();\n    lazyPrintWithoutClosingBenchmarkTable();\n}\n\nvoid ConsoleReporter::lazyPrintWithoutClosingBenchmarkTable() {\n\n    if (!currentTestRunInfo.used)\n        lazyPrintRunInfo();\n    if (!currentGroupInfo.used)\n        lazyPrintGroupInfo();\n\n    if (!m_headerPrinted) {\n        printTestCaseAndSectionHeader();\n        m_headerPrinted = true;\n    }\n}\nvoid ConsoleReporter::lazyPrintRunInfo() {\n    stream << '\\n' << getLineOfChars<'~'>() << '\\n';\n    Colour colour(Colour::SecondaryText);\n    stream << currentTestRunInfo->name\n        << \" is a Catch v\" << libraryVersion() << \" host application.\\n\"\n        << \"Run with -? for options\\n\\n\";\n\n    if (m_config->rngSeed() != 0)\n        stream << \"Randomness seeded to: \" << m_config->rngSeed() << \"\\n\\n\";\n\n    currentTestRunInfo.used = true;\n}\nvoid ConsoleReporter::lazyPrintGroupInfo() {\n    if (!currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1) {\n        printClosedHeader(\"Group: \" + currentGroupInfo->name);\n        currentGroupInfo.used = true;\n    }\n}\nvoid ConsoleReporter::printTestCaseAndSectionHeader() {\n    assert(!m_sectionStack.empty());\n    printOpenHeader(currentTestCaseInfo->name);\n\n    if (m_sectionStack.size() > 1) {\n        Colour colourGuard(Colour::Headers);\n\n        auto\n            it = m_sectionStack.begin() + 1, // Skip first section (test case)\n            itEnd = m_sectionStack.end();\n        for (; it != itEnd; ++it)\n            printHeaderString(it->name, 2);\n    }\n\n    SourceLineInfo lineInfo = m_sectionStack.back().lineInfo;\n\n    stream << getLineOfChars<'-'>() << '\\n';\n    Colour colourGuard(Colour::FileName);\n    stream << lineInfo << '\\n';\n    stream << getLineOfChars<'.'>() << '\\n' << std::endl;\n}\n\nvoid ConsoleReporter::printClosedHeader(std::string const& _name) {\n    printOpenHeader(_name);\n    stream << getLineOfChars<'.'>() << '\\n';\n}\nvoid ConsoleReporter::printOpenHeader(std::string const& _name) {\n    stream << getLineOfChars<'-'>() << '\\n';\n    {\n        Colour colourGuard(Colour::Headers);\n        printHeaderString(_name);\n    }\n}\n\n// if string has a : in first line will set indent to follow it on\n// subsequent lines\nvoid ConsoleReporter::printHeaderString(std::string const& _string, std::size_t indent) {\n    std::size_t i = _string.find(\": \");\n    if (i != std::string::npos)\n        i += 2;\n    else\n        i = 0;\n    stream << Column(_string).indent(indent + i).initialIndent(indent) << '\\n';\n}\n\nstruct SummaryColumn {\n\n    SummaryColumn( std::string _label, Colour::Code _colour )\n    :   label( std::move( _label ) ),\n        colour( _colour ) {}\n    SummaryColumn addRow( std::size_t count ) {\n        ReusableStringStream rss;\n        rss << count;\n        std::string row = rss.str();\n        for (auto& oldRow : rows) {\n            while (oldRow.size() < row.size())\n                oldRow = ' ' + oldRow;\n            while (oldRow.size() > row.size())\n                row = ' ' + row;\n        }\n        rows.push_back(row);\n        return *this;\n    }\n\n    std::string label;\n    Colour::Code colour;\n    std::vector<std::string> rows;\n\n};\n\nvoid ConsoleReporter::printTotals( Totals const& totals ) {\n    if (totals.testCases.total() == 0) {\n        stream << Colour(Colour::Warning) << \"No tests ran\\n\";\n    } else if (totals.assertions.total() > 0 && totals.testCases.allPassed()) {\n        stream << Colour(Colour::ResultSuccess) << \"All tests passed\";\n        stream << \" (\"\n            << pluralise(totals.assertions.passed, \"assertion\") << \" in \"\n            << pluralise(totals.testCases.passed, \"test case\") << ')'\n            << '\\n';\n    } else {\n\n        std::vector<SummaryColumn> columns;\n        columns.push_back(SummaryColumn(\"\", Colour::None)\n                          .addRow(totals.testCases.total())\n                          .addRow(totals.assertions.total()));\n        columns.push_back(SummaryColumn(\"passed\", Colour::Success)\n                          .addRow(totals.testCases.passed)\n                          .addRow(totals.assertions.passed));\n        columns.push_back(SummaryColumn(\"failed\", Colour::ResultError)\n                          .addRow(totals.testCases.failed)\n                          .addRow(totals.assertions.failed));\n        columns.push_back(SummaryColumn(\"failed as expected\", Colour::ResultExpectedFailure)\n                          .addRow(totals.testCases.failedButOk)\n                          .addRow(totals.assertions.failedButOk));\n\n        printSummaryRow(\"test cases\", columns, 0);\n        printSummaryRow(\"assertions\", columns, 1);\n    }\n}\nvoid ConsoleReporter::printSummaryRow(std::string const& label, std::vector<SummaryColumn> const& cols, std::size_t row) {\n    for (auto col : cols) {\n        std::string value = col.rows[row];\n        if (col.label.empty()) {\n            stream << label << \": \";\n            if (value != \"0\")\n                stream << value;\n            else\n                stream << Colour(Colour::Warning) << \"- none -\";\n        } else if (value != \"0\") {\n            stream << Colour(Colour::LightGrey) << \" | \";\n            stream << Colour(col.colour)\n                << value << ' ' << col.label;\n        }\n    }\n    stream << '\\n';\n}\n\nvoid ConsoleReporter::printTotalsDivider(Totals const& totals) {\n    if (totals.testCases.total() > 0) {\n        std::size_t failedRatio = makeRatio(totals.testCases.failed, totals.testCases.total());\n        std::size_t failedButOkRatio = makeRatio(totals.testCases.failedButOk, totals.testCases.total());\n        std::size_t passedRatio = makeRatio(totals.testCases.passed, totals.testCases.total());\n        while (failedRatio + failedButOkRatio + passedRatio < CATCH_CONFIG_CONSOLE_WIDTH - 1)\n            findMax(failedRatio, failedButOkRatio, passedRatio)++;\n        while (failedRatio + failedButOkRatio + passedRatio > CATCH_CONFIG_CONSOLE_WIDTH - 1)\n            findMax(failedRatio, failedButOkRatio, passedRatio)--;\n\n        stream << Colour(Colour::Error) << std::string(failedRatio, '=');\n        stream << Colour(Colour::ResultExpectedFailure) << std::string(failedButOkRatio, '=');\n        if (totals.testCases.allPassed())\n            stream << Colour(Colour::ResultSuccess) << std::string(passedRatio, '=');\n        else\n            stream << Colour(Colour::Success) << std::string(passedRatio, '=');\n    } else {\n        stream << Colour(Colour::Warning) << std::string(CATCH_CONFIG_CONSOLE_WIDTH - 1, '=');\n    }\n    stream << '\\n';\n}\nvoid ConsoleReporter::printSummaryDivider() {\n    stream << getLineOfChars<'-'>() << '\\n';\n}\n\nvoid ConsoleReporter::printTestFilters() {\n    if (m_config->testSpec().hasFilters()) {\n        Colour guard(Colour::BrightYellow);\n        stream << \"Filters: \" << serializeFilters(m_config->getTestsOrTags()) << '\\n';\n    }\n}\n\nCATCH_REGISTER_REPORTER(\"console\", ConsoleReporter)\n\n} // end namespace Catch\n\n#if defined(_MSC_VER)\n#pragma warning(pop)\n#endif\n\n#if defined(__clang__)\n#  pragma clang diagnostic pop\n#endif\n// end catch_reporter_console.cpp\n// start catch_reporter_junit.cpp\n\n#include <cassert>\n#include <sstream>\n#include <ctime>\n#include <algorithm>\n\nnamespace Catch {\n\n    namespace {\n        std::string getCurrentTimestamp() {\n            // Beware, this is not reentrant because of backward compatibility issues\n            // Also, UTC only, again because of backward compatibility (%z is C++11)\n            time_t rawtime;\n            std::time(&rawtime);\n            auto const timeStampSize = sizeof(\"2017-01-16T17:06:45Z\");\n\n#ifdef _MSC_VER\n            std::tm timeInfo = {};\n            gmtime_s(&timeInfo, &rawtime);\n#else\n            std::tm* timeInfo;\n            timeInfo = std::gmtime(&rawtime);\n#endif\n\n            char timeStamp[timeStampSize];\n            const char * const fmt = \"%Y-%m-%dT%H:%M:%SZ\";\n\n#ifdef _MSC_VER\n            std::strftime(timeStamp, timeStampSize, fmt, &timeInfo);\n#else\n            std::strftime(timeStamp, timeStampSize, fmt, timeInfo);\n#endif\n            return std::string(timeStamp);\n        }\n\n        std::string fileNameTag(const std::vector<std::string> &tags) {\n            auto it = std::find_if(begin(tags),\n                                   end(tags),\n                                   [] (std::string const& tag) {return tag.front() == '#'; });\n            if (it != tags.end())\n                return it->substr(1);\n            return std::string();\n        }\n    } // anonymous namespace\n\n    JunitReporter::JunitReporter( ReporterConfig const& _config )\n        :   CumulativeReporterBase( _config ),\n            xml( _config.stream() )\n        {\n            m_reporterPrefs.shouldRedirectStdOut = true;\n            m_reporterPrefs.shouldReportAllAssertions = true;\n        }\n\n    JunitReporter::~JunitReporter() {}\n\n    std::string JunitReporter::getDescription() {\n        return \"Reports test results in an XML format that looks like Ant's junitreport target\";\n    }\n\n    void JunitReporter::noMatchingTestCases( std::string const& /*spec*/ ) {}\n\n    void JunitReporter::testRunStarting( TestRunInfo const& runInfo )  {\n        CumulativeReporterBase::testRunStarting( runInfo );\n        xml.startElement( \"testsuites\" );\n    }\n\n    void JunitReporter::testGroupStarting( GroupInfo const& groupInfo ) {\n        suiteTimer.start();\n        stdOutForSuite.clear();\n        stdErrForSuite.clear();\n        unexpectedExceptions = 0;\n        CumulativeReporterBase::testGroupStarting( groupInfo );\n    }\n\n    void JunitReporter::testCaseStarting( TestCaseInfo const& testCaseInfo ) {\n        m_okToFail = testCaseInfo.okToFail();\n    }\n\n    bool JunitReporter::assertionEnded( AssertionStats const& assertionStats ) {\n        if( assertionStats.assertionResult.getResultType() == ResultWas::ThrewException && !m_okToFail )\n            unexpectedExceptions++;\n        return CumulativeReporterBase::assertionEnded( assertionStats );\n    }\n\n    void JunitReporter::testCaseEnded( TestCaseStats const& testCaseStats ) {\n        stdOutForSuite += testCaseStats.stdOut;\n        stdErrForSuite += testCaseStats.stdErr;\n        CumulativeReporterBase::testCaseEnded( testCaseStats );\n    }\n\n    void JunitReporter::testGroupEnded( TestGroupStats const& testGroupStats ) {\n        double suiteTime = suiteTimer.getElapsedSeconds();\n        CumulativeReporterBase::testGroupEnded( testGroupStats );\n        writeGroup( *m_testGroups.back(), suiteTime );\n    }\n\n    void JunitReporter::testRunEndedCumulative() {\n        xml.endElement();\n    }\n\n    void JunitReporter::writeGroup( TestGroupNode const& groupNode, double suiteTime ) {\n        XmlWriter::ScopedElement e = xml.scopedElement( \"testsuite\" );\n\n        TestGroupStats const& stats = groupNode.value;\n        xml.writeAttribute( \"name\", stats.groupInfo.name );\n        xml.writeAttribute( \"errors\", unexpectedExceptions );\n        xml.writeAttribute( \"failures\", stats.totals.assertions.failed-unexpectedExceptions );\n        xml.writeAttribute( \"tests\", stats.totals.assertions.total() );\n        xml.writeAttribute( \"hostname\", \"tbd\" ); // !TBD\n        if( m_config->showDurations() == ShowDurations::Never )\n            xml.writeAttribute( \"time\", \"\" );\n        else\n            xml.writeAttribute( \"time\", suiteTime );\n        xml.writeAttribute( \"timestamp\", getCurrentTimestamp() );\n\n        // Write properties if there are any\n        if (m_config->hasTestFilters() || m_config->rngSeed() != 0) {\n            auto properties = xml.scopedElement(\"properties\");\n            if (m_config->hasTestFilters()) {\n                xml.scopedElement(\"property\")\n                    .writeAttribute(\"name\", \"filters\")\n                    .writeAttribute(\"value\", serializeFilters(m_config->getTestsOrTags()));\n            }\n            if (m_config->rngSeed() != 0) {\n                xml.scopedElement(\"property\")\n                    .writeAttribute(\"name\", \"random-seed\")\n                    .writeAttribute(\"value\", m_config->rngSeed());\n            }\n        }\n\n        // Write test cases\n        for( auto const& child : groupNode.children )\n            writeTestCase( *child );\n\n        xml.scopedElement( \"system-out\" ).writeText( trim( stdOutForSuite ), XmlFormatting::Newline );\n        xml.scopedElement( \"system-err\" ).writeText( trim( stdErrForSuite ), XmlFormatting::Newline );\n    }\n\n    void JunitReporter::writeTestCase( TestCaseNode const& testCaseNode ) {\n        TestCaseStats const& stats = testCaseNode.value;\n\n        // All test cases have exactly one section - which represents the\n        // test case itself. That section may have 0-n nested sections\n        assert( testCaseNode.children.size() == 1 );\n        SectionNode const& rootSection = *testCaseNode.children.front();\n\n        std::string className = stats.testInfo.className;\n\n        if( className.empty() ) {\n            className = fileNameTag(stats.testInfo.tags);\n            if ( className.empty() )\n                className = \"global\";\n        }\n\n        if ( !m_config->name().empty() )\n            className = m_config->name() + \".\" + className;\n\n        writeSection( className, \"\", rootSection );\n    }\n\n    void JunitReporter::writeSection(  std::string const& className,\n                        std::string const& rootName,\n                        SectionNode const& sectionNode ) {\n        std::string name = trim( sectionNode.stats.sectionInfo.name );\n        if( !rootName.empty() )\n            name = rootName + '/' + name;\n\n        if( !sectionNode.assertions.empty() ||\n            !sectionNode.stdOut.empty() ||\n            !sectionNode.stdErr.empty() ) {\n            XmlWriter::ScopedElement e = xml.scopedElement( \"testcase\" );\n            if( className.empty() ) {\n                xml.writeAttribute( \"classname\", name );\n                xml.writeAttribute( \"name\", \"root\" );\n            }\n            else {\n                xml.writeAttribute( \"classname\", className );\n                xml.writeAttribute( \"name\", name );\n            }\n            xml.writeAttribute( \"time\", ::Catch::Detail::stringify( sectionNode.stats.durationInSeconds ) );\n            // This is not ideal, but it should be enough to mimic gtest's\n            // junit output.\n            // Ideally the JUnit reporter would also handle `skipTest`\n            // events and write those out appropriately.\n            xml.writeAttribute( \"status\", \"run\" );\n\n            writeAssertions( sectionNode );\n\n            if( !sectionNode.stdOut.empty() )\n                xml.scopedElement( \"system-out\" ).writeText( trim( sectionNode.stdOut ), XmlFormatting::Newline );\n            if( !sectionNode.stdErr.empty() )\n                xml.scopedElement( \"system-err\" ).writeText( trim( sectionNode.stdErr ), XmlFormatting::Newline );\n        }\n        for( auto const& childNode : sectionNode.childSections )\n            if( className.empty() )\n                writeSection( name, \"\", *childNode );\n            else\n                writeSection( className, name, *childNode );\n    }\n\n    void JunitReporter::writeAssertions( SectionNode const& sectionNode ) {\n        for( auto const& assertion : sectionNode.assertions )\n            writeAssertion( assertion );\n    }\n\n    void JunitReporter::writeAssertion( AssertionStats const& stats ) {\n        AssertionResult const& result = stats.assertionResult;\n        if( !result.isOk() ) {\n            std::string elementName;\n            switch( result.getResultType() ) {\n                case ResultWas::ThrewException:\n                case ResultWas::FatalErrorCondition:\n                    elementName = \"error\";\n                    break;\n                case ResultWas::ExplicitFailure:\n                case ResultWas::ExpressionFailed:\n                case ResultWas::DidntThrowException:\n                    elementName = \"failure\";\n                    break;\n\n                // We should never see these here:\n                case ResultWas::Info:\n                case ResultWas::Warning:\n                case ResultWas::Ok:\n                case ResultWas::Unknown:\n                case ResultWas::FailureBit:\n                case ResultWas::Exception:\n                    elementName = \"internalError\";\n                    break;\n            }\n\n            XmlWriter::ScopedElement e = xml.scopedElement( elementName );\n\n            xml.writeAttribute( \"message\", result.getExpression() );\n            xml.writeAttribute( \"type\", result.getTestMacroName() );\n\n            ReusableStringStream rss;\n            if (stats.totals.assertions.total() > 0) {\n                rss << \"FAILED\" << \":\\n\";\n                if (result.hasExpression()) {\n                    rss << \"  \";\n                    rss << result.getExpressionInMacro();\n                    rss << '\\n';\n                }\n                if (result.hasExpandedExpression()) {\n                    rss << \"with expansion:\\n\";\n                    rss << Column(result.getExpandedExpression()).indent(2) << '\\n';\n                }\n            } else {\n                rss << '\\n';\n            }\n\n            if( !result.getMessage().empty() )\n                rss << result.getMessage() << '\\n';\n            for( auto const& msg : stats.infoMessages )\n                if( msg.type == ResultWas::Info )\n                    rss << msg.message << '\\n';\n\n            rss << \"at \" << result.getSourceInfo();\n            xml.writeText( rss.str(), XmlFormatting::Newline );\n        }\n    }\n\n    CATCH_REGISTER_REPORTER( \"junit\", JunitReporter )\n\n} // end namespace Catch\n// end catch_reporter_junit.cpp\n// start catch_reporter_listening.cpp\n\n#include <cassert>\n\nnamespace Catch {\n\n    ListeningReporter::ListeningReporter() {\n        // We will assume that listeners will always want all assertions\n        m_preferences.shouldReportAllAssertions = true;\n    }\n\n    void ListeningReporter::addListener( IStreamingReporterPtr&& listener ) {\n        m_listeners.push_back( std::move( listener ) );\n    }\n\n    void ListeningReporter::addReporter(IStreamingReporterPtr&& reporter) {\n        assert(!m_reporter && \"Listening reporter can wrap only 1 real reporter\");\n        m_reporter = std::move( reporter );\n        m_preferences.shouldRedirectStdOut = m_reporter->getPreferences().shouldRedirectStdOut;\n    }\n\n    ReporterPreferences ListeningReporter::getPreferences() const {\n        return m_preferences;\n    }\n\n    std::set<Verbosity> ListeningReporter::getSupportedVerbosities() {\n        return std::set<Verbosity>{ };\n    }\n\n    void ListeningReporter::noMatchingTestCases( std::string const& spec ) {\n        for ( auto const& listener : m_listeners ) {\n            listener->noMatchingTestCases( spec );\n        }\n        m_reporter->noMatchingTestCases( spec );\n    }\n\n    void ListeningReporter::reportInvalidArguments(std::string const&arg){\n        for ( auto const& listener : m_listeners ) {\n            listener->reportInvalidArguments( arg );\n        }\n        m_reporter->reportInvalidArguments( arg );\n    }\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n    void ListeningReporter::benchmarkPreparing( std::string const& name ) {\n\t\tfor (auto const& listener : m_listeners) {\n\t\t\tlistener->benchmarkPreparing(name);\n\t\t}\n\t\tm_reporter->benchmarkPreparing(name);\n\t}\n    void ListeningReporter::benchmarkStarting( BenchmarkInfo const& benchmarkInfo ) {\n        for ( auto const& listener : m_listeners ) {\n            listener->benchmarkStarting( benchmarkInfo );\n        }\n        m_reporter->benchmarkStarting( benchmarkInfo );\n    }\n    void ListeningReporter::benchmarkEnded( BenchmarkStats<> const& benchmarkStats ) {\n        for ( auto const& listener : m_listeners ) {\n            listener->benchmarkEnded( benchmarkStats );\n        }\n        m_reporter->benchmarkEnded( benchmarkStats );\n    }\n\n\tvoid ListeningReporter::benchmarkFailed( std::string const& error ) {\n\t\tfor (auto const& listener : m_listeners) {\n\t\t\tlistener->benchmarkFailed(error);\n\t\t}\n\t\tm_reporter->benchmarkFailed(error);\n\t}\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\n    void ListeningReporter::testRunStarting( TestRunInfo const& testRunInfo ) {\n        for ( auto const& listener : m_listeners ) {\n            listener->testRunStarting( testRunInfo );\n        }\n        m_reporter->testRunStarting( testRunInfo );\n    }\n\n    void ListeningReporter::testGroupStarting( GroupInfo const& groupInfo ) {\n        for ( auto const& listener : m_listeners ) {\n            listener->testGroupStarting( groupInfo );\n        }\n        m_reporter->testGroupStarting( groupInfo );\n    }\n\n    void ListeningReporter::testCaseStarting( TestCaseInfo const& testInfo ) {\n        for ( auto const& listener : m_listeners ) {\n            listener->testCaseStarting( testInfo );\n        }\n        m_reporter->testCaseStarting( testInfo );\n    }\n\n    void ListeningReporter::sectionStarting( SectionInfo const& sectionInfo ) {\n        for ( auto const& listener : m_listeners ) {\n            listener->sectionStarting( sectionInfo );\n        }\n        m_reporter->sectionStarting( sectionInfo );\n    }\n\n    void ListeningReporter::assertionStarting( AssertionInfo const& assertionInfo ) {\n        for ( auto const& listener : m_listeners ) {\n            listener->assertionStarting( assertionInfo );\n        }\n        m_reporter->assertionStarting( assertionInfo );\n    }\n\n    // The return value indicates if the messages buffer should be cleared:\n    bool ListeningReporter::assertionEnded( AssertionStats const& assertionStats ) {\n        for( auto const& listener : m_listeners ) {\n            static_cast<void>( listener->assertionEnded( assertionStats ) );\n        }\n        return m_reporter->assertionEnded( assertionStats );\n    }\n\n    void ListeningReporter::sectionEnded( SectionStats const& sectionStats ) {\n        for ( auto const& listener : m_listeners ) {\n            listener->sectionEnded( sectionStats );\n        }\n        m_reporter->sectionEnded( sectionStats );\n    }\n\n    void ListeningReporter::testCaseEnded( TestCaseStats const& testCaseStats ) {\n        for ( auto const& listener : m_listeners ) {\n            listener->testCaseEnded( testCaseStats );\n        }\n        m_reporter->testCaseEnded( testCaseStats );\n    }\n\n    void ListeningReporter::testGroupEnded( TestGroupStats const& testGroupStats ) {\n        for ( auto const& listener : m_listeners ) {\n            listener->testGroupEnded( testGroupStats );\n        }\n        m_reporter->testGroupEnded( testGroupStats );\n    }\n\n    void ListeningReporter::testRunEnded( TestRunStats const& testRunStats ) {\n        for ( auto const& listener : m_listeners ) {\n            listener->testRunEnded( testRunStats );\n        }\n        m_reporter->testRunEnded( testRunStats );\n    }\n\n    void ListeningReporter::skipTest( TestCaseInfo const& testInfo ) {\n        for ( auto const& listener : m_listeners ) {\n            listener->skipTest( testInfo );\n        }\n        m_reporter->skipTest( testInfo );\n    }\n\n    bool ListeningReporter::isMulti() const {\n        return true;\n    }\n\n} // end namespace Catch\n// end catch_reporter_listening.cpp\n// start catch_reporter_xml.cpp\n\n#if defined(_MSC_VER)\n#pragma warning(push)\n#pragma warning(disable:4061) // Not all labels are EXPLICITLY handled in switch\n                              // Note that 4062 (not all labels are handled\n                              // and default is missing) is enabled\n#endif\n\nnamespace Catch {\n    XmlReporter::XmlReporter( ReporterConfig const& _config )\n    :   StreamingReporterBase( _config ),\n        m_xml(_config.stream())\n    {\n        m_reporterPrefs.shouldRedirectStdOut = true;\n        m_reporterPrefs.shouldReportAllAssertions = true;\n    }\n\n    XmlReporter::~XmlReporter() = default;\n\n    std::string XmlReporter::getDescription() {\n        return \"Reports test results as an XML document\";\n    }\n\n    std::string XmlReporter::getStylesheetRef() const {\n        return std::string();\n    }\n\n    void XmlReporter::writeSourceInfo( SourceLineInfo const& sourceInfo ) {\n        m_xml\n            .writeAttribute( \"filename\", sourceInfo.file )\n            .writeAttribute( \"line\", sourceInfo.line );\n    }\n\n    void XmlReporter::noMatchingTestCases( std::string const& s ) {\n        StreamingReporterBase::noMatchingTestCases( s );\n    }\n\n    void XmlReporter::testRunStarting( TestRunInfo const& testInfo ) {\n        StreamingReporterBase::testRunStarting( testInfo );\n        std::string stylesheetRef = getStylesheetRef();\n        if( !stylesheetRef.empty() )\n            m_xml.writeStylesheetRef( stylesheetRef );\n        m_xml.startElement( \"Catch\" );\n        if( !m_config->name().empty() )\n            m_xml.writeAttribute( \"name\", m_config->name() );\n        if (m_config->testSpec().hasFilters())\n            m_xml.writeAttribute( \"filters\", serializeFilters( m_config->getTestsOrTags() ) );\n        if( m_config->rngSeed() != 0 )\n            m_xml.scopedElement( \"Randomness\" )\n                .writeAttribute( \"seed\", m_config->rngSeed() );\n    }\n\n    void XmlReporter::testGroupStarting( GroupInfo const& groupInfo ) {\n        StreamingReporterBase::testGroupStarting( groupInfo );\n        m_xml.startElement( \"Group\" )\n            .writeAttribute( \"name\", groupInfo.name );\n    }\n\n    void XmlReporter::testCaseStarting( TestCaseInfo const& testInfo ) {\n        StreamingReporterBase::testCaseStarting(testInfo);\n        m_xml.startElement( \"TestCase\" )\n            .writeAttribute( \"name\", trim( testInfo.name ) )\n            .writeAttribute( \"description\", testInfo.description )\n            .writeAttribute( \"tags\", testInfo.tagsAsString() );\n\n        writeSourceInfo( testInfo.lineInfo );\n\n        if ( m_config->showDurations() == ShowDurations::Always )\n            m_testCaseTimer.start();\n        m_xml.ensureTagClosed();\n    }\n\n    void XmlReporter::sectionStarting( SectionInfo const& sectionInfo ) {\n        StreamingReporterBase::sectionStarting( sectionInfo );\n        if( m_sectionDepth++ > 0 ) {\n            m_xml.startElement( \"Section\" )\n                .writeAttribute( \"name\", trim( sectionInfo.name ) );\n            writeSourceInfo( sectionInfo.lineInfo );\n            m_xml.ensureTagClosed();\n        }\n    }\n\n    void XmlReporter::assertionStarting( AssertionInfo const& ) { }\n\n    bool XmlReporter::assertionEnded( AssertionStats const& assertionStats ) {\n\n        AssertionResult const& result = assertionStats.assertionResult;\n\n        bool includeResults = m_config->includeSuccessfulResults() || !result.isOk();\n\n        if( includeResults || result.getResultType() == ResultWas::Warning ) {\n            // Print any info messages in <Info> tags.\n            for( auto const& msg : assertionStats.infoMessages ) {\n                if( msg.type == ResultWas::Info && includeResults ) {\n                    m_xml.scopedElement( \"Info\" )\n                            .writeText( msg.message );\n                } else if ( msg.type == ResultWas::Warning ) {\n                    m_xml.scopedElement( \"Warning\" )\n                            .writeText( msg.message );\n                }\n            }\n        }\n\n        // Drop out if result was successful but we're not printing them.\n        if( !includeResults && result.getResultType() != ResultWas::Warning )\n            return true;\n\n        // Print the expression if there is one.\n        if( result.hasExpression() ) {\n            m_xml.startElement( \"Expression\" )\n                .writeAttribute( \"success\", result.succeeded() )\n                .writeAttribute( \"type\", result.getTestMacroName() );\n\n            writeSourceInfo( result.getSourceInfo() );\n\n            m_xml.scopedElement( \"Original\" )\n                .writeText( result.getExpression() );\n            m_xml.scopedElement( \"Expanded\" )\n                .writeText( result.getExpandedExpression() );\n        }\n\n        // And... Print a result applicable to each result type.\n        switch( result.getResultType() ) {\n            case ResultWas::ThrewException:\n                m_xml.startElement( \"Exception\" );\n                writeSourceInfo( result.getSourceInfo() );\n                m_xml.writeText( result.getMessage() );\n                m_xml.endElement();\n                break;\n            case ResultWas::FatalErrorCondition:\n                m_xml.startElement( \"FatalErrorCondition\" );\n                writeSourceInfo( result.getSourceInfo() );\n                m_xml.writeText( result.getMessage() );\n                m_xml.endElement();\n                break;\n            case ResultWas::Info:\n                m_xml.scopedElement( \"Info\" )\n                    .writeText( result.getMessage() );\n                break;\n            case ResultWas::Warning:\n                // Warning will already have been written\n                break;\n            case ResultWas::ExplicitFailure:\n                m_xml.startElement( \"Failure\" );\n                writeSourceInfo( result.getSourceInfo() );\n                m_xml.writeText( result.getMessage() );\n                m_xml.endElement();\n                break;\n            default:\n                break;\n        }\n\n        if( result.hasExpression() )\n            m_xml.endElement();\n\n        return true;\n    }\n\n    void XmlReporter::sectionEnded( SectionStats const& sectionStats ) {\n        StreamingReporterBase::sectionEnded( sectionStats );\n        if( --m_sectionDepth > 0 ) {\n            XmlWriter::ScopedElement e = m_xml.scopedElement( \"OverallResults\" );\n            e.writeAttribute( \"successes\", sectionStats.assertions.passed );\n            e.writeAttribute( \"failures\", sectionStats.assertions.failed );\n            e.writeAttribute( \"expectedFailures\", sectionStats.assertions.failedButOk );\n\n            if ( m_config->showDurations() == ShowDurations::Always )\n                e.writeAttribute( \"durationInSeconds\", sectionStats.durationInSeconds );\n\n            m_xml.endElement();\n        }\n    }\n\n    void XmlReporter::testCaseEnded( TestCaseStats const& testCaseStats ) {\n        StreamingReporterBase::testCaseEnded( testCaseStats );\n        XmlWriter::ScopedElement e = m_xml.scopedElement( \"OverallResult\" );\n        e.writeAttribute( \"success\", testCaseStats.totals.assertions.allOk() );\n\n        if ( m_config->showDurations() == ShowDurations::Always )\n            e.writeAttribute( \"durationInSeconds\", m_testCaseTimer.getElapsedSeconds() );\n\n        if( !testCaseStats.stdOut.empty() )\n            m_xml.scopedElement( \"StdOut\" ).writeText( trim( testCaseStats.stdOut ), XmlFormatting::Newline );\n        if( !testCaseStats.stdErr.empty() )\n            m_xml.scopedElement( \"StdErr\" ).writeText( trim( testCaseStats.stdErr ), XmlFormatting::Newline );\n\n        m_xml.endElement();\n    }\n\n    void XmlReporter::testGroupEnded( TestGroupStats const& testGroupStats ) {\n        StreamingReporterBase::testGroupEnded( testGroupStats );\n        // TODO: Check testGroupStats.aborting and act accordingly.\n        m_xml.scopedElement( \"OverallResults\" )\n            .writeAttribute( \"successes\", testGroupStats.totals.assertions.passed )\n            .writeAttribute( \"failures\", testGroupStats.totals.assertions.failed )\n            .writeAttribute( \"expectedFailures\", testGroupStats.totals.assertions.failedButOk );\n        m_xml.scopedElement( \"OverallResultsCases\")\n            .writeAttribute( \"successes\", testGroupStats.totals.testCases.passed )\n            .writeAttribute( \"failures\", testGroupStats.totals.testCases.failed )\n            .writeAttribute( \"expectedFailures\", testGroupStats.totals.testCases.failedButOk );\n        m_xml.endElement();\n    }\n\n    void XmlReporter::testRunEnded( TestRunStats const& testRunStats ) {\n        StreamingReporterBase::testRunEnded( testRunStats );\n        m_xml.scopedElement( \"OverallResults\" )\n            .writeAttribute( \"successes\", testRunStats.totals.assertions.passed )\n            .writeAttribute( \"failures\", testRunStats.totals.assertions.failed )\n            .writeAttribute( \"expectedFailures\", testRunStats.totals.assertions.failedButOk );\n        m_xml.scopedElement( \"OverallResultsCases\")\n            .writeAttribute( \"successes\", testRunStats.totals.testCases.passed )\n            .writeAttribute( \"failures\", testRunStats.totals.testCases.failed )\n            .writeAttribute( \"expectedFailures\", testRunStats.totals.testCases.failedButOk );\n        m_xml.endElement();\n    }\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n    void XmlReporter::benchmarkPreparing(std::string const& name) {\n        m_xml.startElement(\"BenchmarkResults\")\n            .writeAttribute(\"name\", name);\n    }\n\n    void XmlReporter::benchmarkStarting(BenchmarkInfo const &info) {\n        m_xml.writeAttribute(\"samples\", info.samples)\n            .writeAttribute(\"resamples\", info.resamples)\n            .writeAttribute(\"iterations\", info.iterations)\n            .writeAttribute(\"clockResolution\", info.clockResolution)\n            .writeAttribute(\"estimatedDuration\", info.estimatedDuration)\n            .writeComment(\"All values in nano seconds\");\n    }\n\n    void XmlReporter::benchmarkEnded(BenchmarkStats<> const& benchmarkStats) {\n        m_xml.startElement(\"mean\")\n            .writeAttribute(\"value\", benchmarkStats.mean.point.count())\n            .writeAttribute(\"lowerBound\", benchmarkStats.mean.lower_bound.count())\n            .writeAttribute(\"upperBound\", benchmarkStats.mean.upper_bound.count())\n            .writeAttribute(\"ci\", benchmarkStats.mean.confidence_interval);\n        m_xml.endElement();\n        m_xml.startElement(\"standardDeviation\")\n            .writeAttribute(\"value\", benchmarkStats.standardDeviation.point.count())\n            .writeAttribute(\"lowerBound\", benchmarkStats.standardDeviation.lower_bound.count())\n            .writeAttribute(\"upperBound\", benchmarkStats.standardDeviation.upper_bound.count())\n            .writeAttribute(\"ci\", benchmarkStats.standardDeviation.confidence_interval);\n        m_xml.endElement();\n        m_xml.startElement(\"outliers\")\n            .writeAttribute(\"variance\", benchmarkStats.outlierVariance)\n            .writeAttribute(\"lowMild\", benchmarkStats.outliers.low_mild)\n            .writeAttribute(\"lowSevere\", benchmarkStats.outliers.low_severe)\n            .writeAttribute(\"highMild\", benchmarkStats.outliers.high_mild)\n            .writeAttribute(\"highSevere\", benchmarkStats.outliers.high_severe);\n        m_xml.endElement();\n        m_xml.endElement();\n    }\n\n    void XmlReporter::benchmarkFailed(std::string const &error) {\n        m_xml.scopedElement(\"failed\").\n            writeAttribute(\"message\", error);\n        m_xml.endElement();\n    }\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\n    CATCH_REGISTER_REPORTER( \"xml\", XmlReporter )\n\n} // end namespace Catch\n\n#if defined(_MSC_VER)\n#pragma warning(pop)\n#endif\n// end catch_reporter_xml.cpp\n\nnamespace Catch {\n    LeakDetector leakDetector;\n}\n\n#ifdef __clang__\n#pragma clang diagnostic pop\n#endif\n\n// end catch_impl.hpp\n#endif\n\n#ifdef CATCH_CONFIG_MAIN\n// start catch_default_main.hpp\n\n#ifndef __OBJC__\n\n#if defined(CATCH_CONFIG_WCHAR) && defined(CATCH_PLATFORM_WINDOWS) && defined(_UNICODE) && !defined(DO_NOT_USE_WMAIN)\n// Standard C/C++ Win32 Unicode wmain entry point\nextern \"C\" int wmain (int argc, wchar_t * argv[], wchar_t * []) {\n#else\n// Standard C/C++ main entry point\nint main (int argc, char * argv[]) {\n#endif\n\n    return Catch::Session().run( argc, argv );\n}\n\n#else // __OBJC__\n\n// Objective-C entry point\nint main (int argc, char * const argv[]) {\n#if !CATCH_ARC_ENABLED\n    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];\n#endif\n\n    Catch::registerTestMethods();\n    int result = Catch::Session().run( argc, (char**)argv );\n\n#if !CATCH_ARC_ENABLED\n    [pool drain];\n#endif\n\n    return result;\n}\n\n#endif // __OBJC__\n\n// end catch_default_main.hpp\n#endif\n\n#if !defined(CATCH_CONFIG_IMPL_ONLY)\n\n#ifdef CLARA_CONFIG_MAIN_NOT_DEFINED\n#  undef CLARA_CONFIG_MAIN\n#endif\n\n#if !defined(CATCH_CONFIG_DISABLE)\n//////\n// If this config identifier is defined then all CATCH macros are prefixed with CATCH_\n#ifdef CATCH_CONFIG_PREFIX_ALL\n\n#define CATCH_REQUIRE( ... ) INTERNAL_CATCH_TEST( \"CATCH_REQUIRE\", Catch::ResultDisposition::Normal, __VA_ARGS__ )\n#define CATCH_REQUIRE_FALSE( ... ) INTERNAL_CATCH_TEST( \"CATCH_REQUIRE_FALSE\", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, __VA_ARGS__ )\n\n#define CATCH_REQUIRE_THROWS( ... ) INTERNAL_CATCH_THROWS( \"CATCH_REQUIRE_THROWS\", Catch::ResultDisposition::Normal, __VA_ARGS__ )\n#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( \"CATCH_REQUIRE_THROWS_AS\", exceptionType, Catch::ResultDisposition::Normal, expr )\n#define CATCH_REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS_STR_MATCHES( \"CATCH_REQUIRE_THROWS_WITH\", Catch::ResultDisposition::Normal, matcher, expr )\n#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)\n#define CATCH_REQUIRE_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( \"CATCH_REQUIRE_THROWS_MATCHES\", exceptionType, Catch::ResultDisposition::Normal, matcher, expr )\n#endif// CATCH_CONFIG_DISABLE_MATCHERS\n#define CATCH_REQUIRE_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( \"CATCH_REQUIRE_NOTHROW\", Catch::ResultDisposition::Normal, __VA_ARGS__ )\n\n#define CATCH_CHECK( ... ) INTERNAL_CATCH_TEST( \"CATCH_CHECK\", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )\n#define CATCH_CHECK_FALSE( ... ) INTERNAL_CATCH_TEST( \"CATCH_CHECK_FALSE\", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, __VA_ARGS__ )\n#define CATCH_CHECKED_IF( ... ) INTERNAL_CATCH_IF( \"CATCH_CHECKED_IF\", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )\n#define CATCH_CHECKED_ELSE( ... ) INTERNAL_CATCH_ELSE( \"CATCH_CHECKED_ELSE\", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )\n#define CATCH_CHECK_NOFAIL( ... ) INTERNAL_CATCH_TEST( \"CATCH_CHECK_NOFAIL\", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, __VA_ARGS__ )\n\n#define CATCH_CHECK_THROWS( ... )  INTERNAL_CATCH_THROWS( \"CATCH_CHECK_THROWS\", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )\n#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( \"CATCH_CHECK_THROWS_AS\", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr )\n#define CATCH_CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS_STR_MATCHES( \"CATCH_CHECK_THROWS_WITH\", Catch::ResultDisposition::ContinueOnFailure, matcher, expr )\n#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)\n#define CATCH_CHECK_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( \"CATCH_CHECK_THROWS_MATCHES\", exceptionType, Catch::ResultDisposition::ContinueOnFailure, matcher, expr )\n#endif // CATCH_CONFIG_DISABLE_MATCHERS\n#define CATCH_CHECK_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( \"CATCH_CHECK_NOTHROW\", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )\n\n#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)\n#define CATCH_CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( \"CATCH_CHECK_THAT\", matcher, Catch::ResultDisposition::ContinueOnFailure, arg )\n\n#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( \"CATCH_REQUIRE_THAT\", matcher, Catch::ResultDisposition::Normal, arg )\n#endif // CATCH_CONFIG_DISABLE_MATCHERS\n\n#define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( \"CATCH_INFO\", msg )\n#define CATCH_UNSCOPED_INFO( msg ) INTERNAL_CATCH_UNSCOPED_INFO( \"CATCH_UNSCOPED_INFO\", msg )\n#define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( \"CATCH_WARN\", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg )\n#define CATCH_CAPTURE( ... ) INTERNAL_CATCH_CAPTURE( INTERNAL_CATCH_UNIQUE_NAME(capturer), \"CATCH_CAPTURE\",__VA_ARGS__ )\n\n#define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ )\n#define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ )\n#define CATCH_REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ )\n#define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ )\n#define CATCH_DYNAMIC_SECTION( ... ) INTERNAL_CATCH_DYNAMIC_SECTION( __VA_ARGS__ )\n#define CATCH_FAIL( ... ) INTERNAL_CATCH_MSG( \"CATCH_FAIL\", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ )\n#define CATCH_FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( \"CATCH_FAIL_CHECK\", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )\n#define CATCH_SUCCEED( ... ) INTERNAL_CATCH_MSG( \"CATCH_SUCCEED\", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )\n\n#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE()\n\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n#define CATCH_TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ )\n#define CATCH_TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG( __VA_ARGS__ )\n#define CATCH_TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE( __VA_ARGS__ )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( __VA_ARGS__ )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ )\n#else\n#define CATCH_TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) )\n#define CATCH_TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG( __VA_ARGS__ ) )\n#define CATCH_TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) )\n#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE( __VA_ARGS__ ) )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( __VA_ARGS__ ) )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, __VA_ARGS__ ) )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) )\n#endif\n\n#if !defined(CATCH_CONFIG_RUNTIME_STATIC_REQUIRE)\n#define CATCH_STATIC_REQUIRE( ... )       static_assert(   __VA_ARGS__ ,      #__VA_ARGS__ );     CATCH_SUCCEED( #__VA_ARGS__ )\n#define CATCH_STATIC_REQUIRE_FALSE( ... ) static_assert( !(__VA_ARGS__), \"!(\" #__VA_ARGS__ \")\" ); CATCH_SUCCEED( #__VA_ARGS__ )\n#else\n#define CATCH_STATIC_REQUIRE( ... )       CATCH_REQUIRE( __VA_ARGS__ )\n#define CATCH_STATIC_REQUIRE_FALSE( ... ) CATCH_REQUIRE_FALSE( __VA_ARGS__ )\n#endif\n\n// \"BDD-style\" convenience wrappers\n#define CATCH_SCENARIO( ... ) CATCH_TEST_CASE( \"Scenario: \" __VA_ARGS__ )\n#define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, \"Scenario: \" __VA_ARGS__ )\n#define CATCH_GIVEN( desc )     INTERNAL_CATCH_DYNAMIC_SECTION( \"    Given: \" << desc )\n#define CATCH_AND_GIVEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( \"And given: \" << desc )\n#define CATCH_WHEN( desc )      INTERNAL_CATCH_DYNAMIC_SECTION( \"     When: \" << desc )\n#define CATCH_AND_WHEN( desc )  INTERNAL_CATCH_DYNAMIC_SECTION( \" And when: \" << desc )\n#define CATCH_THEN( desc )      INTERNAL_CATCH_DYNAMIC_SECTION( \"     Then: \" << desc )\n#define CATCH_AND_THEN( desc )  INTERNAL_CATCH_DYNAMIC_SECTION( \"      And: \" << desc )\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n#define CATCH_BENCHMARK(...) \\\n    INTERNAL_CATCH_BENCHMARK(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____), INTERNAL_CATCH_GET_1_ARG(__VA_ARGS__,,), INTERNAL_CATCH_GET_2_ARG(__VA_ARGS__,,))\n#define CATCH_BENCHMARK_ADVANCED(name) \\\n    INTERNAL_CATCH_BENCHMARK_ADVANCED(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____), name)\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\n// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required\n#else\n\n#define REQUIRE( ... ) INTERNAL_CATCH_TEST( \"REQUIRE\", Catch::ResultDisposition::Normal, __VA_ARGS__  )\n#define REQUIRE_FALSE( ... ) INTERNAL_CATCH_TEST( \"REQUIRE_FALSE\", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, __VA_ARGS__ )\n\n#define REQUIRE_THROWS( ... ) INTERNAL_CATCH_THROWS( \"REQUIRE_THROWS\", Catch::ResultDisposition::Normal, __VA_ARGS__ )\n#define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( \"REQUIRE_THROWS_AS\", exceptionType, Catch::ResultDisposition::Normal, expr )\n#define REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS_STR_MATCHES( \"REQUIRE_THROWS_WITH\", Catch::ResultDisposition::Normal, matcher, expr )\n#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)\n#define REQUIRE_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( \"REQUIRE_THROWS_MATCHES\", exceptionType, Catch::ResultDisposition::Normal, matcher, expr )\n#endif // CATCH_CONFIG_DISABLE_MATCHERS\n#define REQUIRE_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( \"REQUIRE_NOTHROW\", Catch::ResultDisposition::Normal, __VA_ARGS__ )\n\n#define CHECK( ... ) INTERNAL_CATCH_TEST( \"CHECK\", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )\n#define CHECK_FALSE( ... ) INTERNAL_CATCH_TEST( \"CHECK_FALSE\", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, __VA_ARGS__ )\n#define CHECKED_IF( ... ) INTERNAL_CATCH_IF( \"CHECKED_IF\", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )\n#define CHECKED_ELSE( ... ) INTERNAL_CATCH_ELSE( \"CHECKED_ELSE\", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )\n#define CHECK_NOFAIL( ... ) INTERNAL_CATCH_TEST( \"CHECK_NOFAIL\", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, __VA_ARGS__ )\n\n#define CHECK_THROWS( ... )  INTERNAL_CATCH_THROWS( \"CHECK_THROWS\", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )\n#define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( \"CHECK_THROWS_AS\", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr )\n#define CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS_STR_MATCHES( \"CHECK_THROWS_WITH\", Catch::ResultDisposition::ContinueOnFailure, matcher, expr )\n#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)\n#define CHECK_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( \"CHECK_THROWS_MATCHES\", exceptionType, Catch::ResultDisposition::ContinueOnFailure, matcher, expr )\n#endif // CATCH_CONFIG_DISABLE_MATCHERS\n#define CHECK_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( \"CHECK_NOTHROW\", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )\n\n#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)\n#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( \"CHECK_THAT\", matcher, Catch::ResultDisposition::ContinueOnFailure, arg )\n\n#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( \"REQUIRE_THAT\", matcher, Catch::ResultDisposition::Normal, arg )\n#endif // CATCH_CONFIG_DISABLE_MATCHERS\n\n#define INFO( msg ) INTERNAL_CATCH_INFO( \"INFO\", msg )\n#define UNSCOPED_INFO( msg ) INTERNAL_CATCH_UNSCOPED_INFO( \"UNSCOPED_INFO\", msg )\n#define WARN( msg ) INTERNAL_CATCH_MSG( \"WARN\", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg )\n#define CAPTURE( ... ) INTERNAL_CATCH_CAPTURE( INTERNAL_CATCH_UNIQUE_NAME(capturer), \"CAPTURE\",__VA_ARGS__ )\n\n#define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ )\n#define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ )\n#define REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ )\n#define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ )\n#define DYNAMIC_SECTION( ... ) INTERNAL_CATCH_DYNAMIC_SECTION( __VA_ARGS__ )\n#define FAIL( ... ) INTERNAL_CATCH_MSG( \"FAIL\", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ )\n#define FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( \"FAIL_CHECK\", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )\n#define SUCCEED( ... ) INTERNAL_CATCH_MSG( \"SUCCEED\", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ )\n#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE()\n\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n#define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ )\n#define TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG( __VA_ARGS__ )\n#define TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#define TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ )\n#define TEMPLATE_PRODUCT_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE( __VA_ARGS__ )\n#define TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( __VA_ARGS__ )\n#define TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ )\n#define TEMPLATE_LIST_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE(__VA_ARGS__)\n#define TEMPLATE_LIST_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#else\n#define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) )\n#define TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG( __VA_ARGS__ ) )\n#define TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) )\n#define TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) )\n#define TEMPLATE_PRODUCT_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE( __VA_ARGS__ ) )\n#define TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( __VA_ARGS__ ) )\n#define TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, __VA_ARGS__ ) )\n#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) )\n#define TEMPLATE_LIST_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE( __VA_ARGS__ ) )\n#define TEMPLATE_LIST_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD( className, __VA_ARGS__ ) )\n#endif\n\n#if !defined(CATCH_CONFIG_RUNTIME_STATIC_REQUIRE)\n#define STATIC_REQUIRE( ... )       static_assert(   __VA_ARGS__,  #__VA_ARGS__ ); SUCCEED( #__VA_ARGS__ )\n#define STATIC_REQUIRE_FALSE( ... ) static_assert( !(__VA_ARGS__), \"!(\" #__VA_ARGS__ \")\" ); SUCCEED( \"!(\" #__VA_ARGS__ \")\" )\n#else\n#define STATIC_REQUIRE( ... )       REQUIRE( __VA_ARGS__ )\n#define STATIC_REQUIRE_FALSE( ... ) REQUIRE_FALSE( __VA_ARGS__ )\n#endif\n\n#endif\n\n#define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature )\n\n// \"BDD-style\" convenience wrappers\n#define SCENARIO( ... ) TEST_CASE( \"Scenario: \" __VA_ARGS__ )\n#define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, \"Scenario: \" __VA_ARGS__ )\n\n#define GIVEN( desc )     INTERNAL_CATCH_DYNAMIC_SECTION( \"    Given: \" << desc )\n#define AND_GIVEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( \"And given: \" << desc )\n#define WHEN( desc )      INTERNAL_CATCH_DYNAMIC_SECTION( \"     When: \" << desc )\n#define AND_WHEN( desc )  INTERNAL_CATCH_DYNAMIC_SECTION( \" And when: \" << desc )\n#define THEN( desc )      INTERNAL_CATCH_DYNAMIC_SECTION( \"     Then: \" << desc )\n#define AND_THEN( desc )  INTERNAL_CATCH_DYNAMIC_SECTION( \"      And: \" << desc )\n\n#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)\n#define BENCHMARK(...) \\\n    INTERNAL_CATCH_BENCHMARK(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____), INTERNAL_CATCH_GET_1_ARG(__VA_ARGS__,,), INTERNAL_CATCH_GET_2_ARG(__VA_ARGS__,,))\n#define BENCHMARK_ADVANCED(name) \\\n    INTERNAL_CATCH_BENCHMARK_ADVANCED(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____), name)\n#endif // CATCH_CONFIG_ENABLE_BENCHMARKING\n\nusing Catch::Detail::Approx;\n\n#else // CATCH_CONFIG_DISABLE\n\n//////\n// If this config identifier is defined then all CATCH macros are prefixed with CATCH_\n#ifdef CATCH_CONFIG_PREFIX_ALL\n\n#define CATCH_REQUIRE( ... )        (void)(0)\n#define CATCH_REQUIRE_FALSE( ... )  (void)(0)\n\n#define CATCH_REQUIRE_THROWS( ... ) (void)(0)\n#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) (void)(0)\n#define CATCH_REQUIRE_THROWS_WITH( expr, matcher )     (void)(0)\n#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)\n#define CATCH_REQUIRE_THROWS_MATCHES( expr, exceptionType, matcher ) (void)(0)\n#endif// CATCH_CONFIG_DISABLE_MATCHERS\n#define CATCH_REQUIRE_NOTHROW( ... ) (void)(0)\n\n#define CATCH_CHECK( ... )         (void)(0)\n#define CATCH_CHECK_FALSE( ... )   (void)(0)\n#define CATCH_CHECKED_IF( ... )    if (__VA_ARGS__)\n#define CATCH_CHECKED_ELSE( ... )  if (!(__VA_ARGS__))\n#define CATCH_CHECK_NOFAIL( ... )  (void)(0)\n\n#define CATCH_CHECK_THROWS( ... )  (void)(0)\n#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) (void)(0)\n#define CATCH_CHECK_THROWS_WITH( expr, matcher )     (void)(0)\n#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)\n#define CATCH_CHECK_THROWS_MATCHES( expr, exceptionType, matcher ) (void)(0)\n#endif // CATCH_CONFIG_DISABLE_MATCHERS\n#define CATCH_CHECK_NOTHROW( ... ) (void)(0)\n\n#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)\n#define CATCH_CHECK_THAT( arg, matcher )   (void)(0)\n\n#define CATCH_REQUIRE_THAT( arg, matcher ) (void)(0)\n#endif // CATCH_CONFIG_DISABLE_MATCHERS\n\n#define CATCH_INFO( msg )          (void)(0)\n#define CATCH_UNSCOPED_INFO( msg ) (void)(0)\n#define CATCH_WARN( msg )          (void)(0)\n#define CATCH_CAPTURE( msg )       (void)(0)\n\n#define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ))\n#define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ))\n#define CATCH_METHOD_AS_TEST_CASE( method, ... )\n#define CATCH_REGISTER_TEST_CASE( Function, ... ) (void)(0)\n#define CATCH_SECTION( ... )\n#define CATCH_DYNAMIC_SECTION( ... )\n#define CATCH_FAIL( ... ) (void)(0)\n#define CATCH_FAIL_CHECK( ... ) (void)(0)\n#define CATCH_SUCCEED( ... ) (void)(0)\n\n#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ))\n\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n#define CATCH_TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__)\n#define CATCH_TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__)\n#define CATCH_TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__)\n#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(className, __VA_ARGS__ )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE( ... ) CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#else\n#define CATCH_TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__) )\n#define CATCH_TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__) )\n#define CATCH_TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__ ) )\n#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(className, __VA_ARGS__ ) )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE( ... ) CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#endif\n\n// \"BDD-style\" convenience wrappers\n#define CATCH_SCENARIO( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ))\n#define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), className )\n#define CATCH_GIVEN( desc )\n#define CATCH_AND_GIVEN( desc )\n#define CATCH_WHEN( desc )\n#define CATCH_AND_WHEN( desc )\n#define CATCH_THEN( desc )\n#define CATCH_AND_THEN( desc )\n\n#define CATCH_STATIC_REQUIRE( ... )       (void)(0)\n#define CATCH_STATIC_REQUIRE_FALSE( ... ) (void)(0)\n\n// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required\n#else\n\n#define REQUIRE( ... )       (void)(0)\n#define REQUIRE_FALSE( ... ) (void)(0)\n\n#define REQUIRE_THROWS( ... ) (void)(0)\n#define REQUIRE_THROWS_AS( expr, exceptionType ) (void)(0)\n#define REQUIRE_THROWS_WITH( expr, matcher ) (void)(0)\n#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)\n#define REQUIRE_THROWS_MATCHES( expr, exceptionType, matcher ) (void)(0)\n#endif // CATCH_CONFIG_DISABLE_MATCHERS\n#define REQUIRE_NOTHROW( ... ) (void)(0)\n\n#define CHECK( ... ) (void)(0)\n#define CHECK_FALSE( ... ) (void)(0)\n#define CHECKED_IF( ... ) if (__VA_ARGS__)\n#define CHECKED_ELSE( ... ) if (!(__VA_ARGS__))\n#define CHECK_NOFAIL( ... ) (void)(0)\n\n#define CHECK_THROWS( ... )  (void)(0)\n#define CHECK_THROWS_AS( expr, exceptionType ) (void)(0)\n#define CHECK_THROWS_WITH( expr, matcher ) (void)(0)\n#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)\n#define CHECK_THROWS_MATCHES( expr, exceptionType, matcher ) (void)(0)\n#endif // CATCH_CONFIG_DISABLE_MATCHERS\n#define CHECK_NOTHROW( ... ) (void)(0)\n\n#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)\n#define CHECK_THAT( arg, matcher ) (void)(0)\n\n#define REQUIRE_THAT( arg, matcher ) (void)(0)\n#endif // CATCH_CONFIG_DISABLE_MATCHERS\n\n#define INFO( msg ) (void)(0)\n#define UNSCOPED_INFO( msg ) (void)(0)\n#define WARN( msg ) (void)(0)\n#define CAPTURE( msg ) (void)(0)\n\n#define TEST_CASE( ... )  INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ))\n#define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ))\n#define METHOD_AS_TEST_CASE( method, ... )\n#define REGISTER_TEST_CASE( Function, ... ) (void)(0)\n#define SECTION( ... )\n#define DYNAMIC_SECTION( ... )\n#define FAIL( ... ) (void)(0)\n#define FAIL_CHECK( ... ) (void)(0)\n#define SUCCEED( ... ) (void)(0)\n#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ))\n\n#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR\n#define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__)\n#define TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__)\n#define TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__)\n#define TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(className, __VA_ARGS__ )\n#define TEMPLATE_PRODUCT_TEST_CASE( ... ) TEMPLATE_TEST_CASE( __VA_ARGS__ )\n#define TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) TEMPLATE_TEST_CASE( __VA_ARGS__ )\n#define TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#else\n#define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__) )\n#define TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__) )\n#define TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__ ) )\n#define TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(className, __VA_ARGS__ ) )\n#define TEMPLATE_PRODUCT_TEST_CASE( ... ) TEMPLATE_TEST_CASE( __VA_ARGS__ )\n#define TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) TEMPLATE_TEST_CASE( __VA_ARGS__ )\n#define TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ )\n#endif\n\n#define STATIC_REQUIRE( ... )       (void)(0)\n#define STATIC_REQUIRE_FALSE( ... ) (void)(0)\n\n#endif\n\n#define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION_NO_REG( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature )\n\n// \"BDD-style\" convenience wrappers\n#define SCENARIO( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) )\n#define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), className )\n\n#define GIVEN( desc )\n#define AND_GIVEN( desc )\n#define WHEN( desc )\n#define AND_WHEN( desc )\n#define THEN( desc )\n#define AND_THEN( desc )\n\nusing Catch::Detail::Approx;\n\n#endif\n\n#endif // ! CATCH_CONFIG_IMPL_ONLY\n\n// start catch_reenable_warnings.h\n\n\n#ifdef __clang__\n#    ifdef __ICC // icpc defines the __clang__ macro\n#        pragma warning(pop)\n#    else\n#        pragma clang diagnostic pop\n#    endif\n#elif defined __GNUC__\n#    pragma GCC diagnostic pop\n#endif\n\n// end catch_reenable_warnings.h\n// end catch.hpp\n#endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED\n\n"
  },
  {
    "path": "ext/detours/tests/corruptor.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\r\n//\r\n//  Unit Test Image Corruptor (corruptor.cpp of unittests.exe)\r\n//\r\n//  Microsoft Research Detours Package\r\n//\r\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\r\n//\r\n#include \"windows.h\"\r\n#include \"corruptor.h\"\r\n\r\nImageCorruptor::ImageCorruptor(PIMAGE_DOS_HEADER Header)\r\n{\r\n    m_TargetDosHeader = Header;\r\n    m_OriginalDosHeader = *Header;\r\n    m_OriginalDosProtection = 0;\r\n    m_TargetNtHeaders = (PIMAGE_NT_HEADERS)((PBYTE)Header + Header->e_lfanew);\r\n    m_OriginalNtHeaders = *m_TargetNtHeaders;\r\n    m_OriginalNtProtection = 0;\r\n\r\n    VirtualProtect(\r\n            m_TargetDosHeader,\r\n            sizeof(*m_TargetDosHeader),\r\n            PAGE_READWRITE,\r\n            &m_OriginalDosProtection);\r\n\r\n    VirtualProtect(\r\n            m_TargetNtHeaders,\r\n            sizeof(*m_TargetNtHeaders),\r\n            PAGE_READWRITE,\r\n            &m_OriginalNtProtection);\r\n}\r\n\r\nImageCorruptor::~ImageCorruptor()\r\n{\r\n    // Restore original header contents.\r\n    //\r\n    *m_TargetDosHeader = m_OriginalDosHeader;\r\n    *m_TargetNtHeaders = m_OriginalNtHeaders;\r\n\r\n    // Restore original protection of DOS header.\r\n    //\r\n    DWORD OldProtection {};\r\n    VirtualProtect(\r\n            m_TargetDosHeader,\r\n            sizeof(*m_TargetDosHeader),\r\n            m_OriginalDosProtection,\r\n            &OldProtection);\r\n\r\n    // Restore original protection of NT headers.\r\n    //\r\n    VirtualProtect(\r\n            m_TargetNtHeaders,\r\n            sizeof(*m_TargetNtHeaders),\r\n            m_OriginalNtProtection,\r\n            &OldProtection);\r\n}\r\n\r\nvoid ImageCorruptor::ModifyDosMagic(WORD Value)\r\n{\r\n    m_TargetDosHeader->e_magic = Value;\r\n}\r\n\r\nvoid ImageCorruptor::ModifyNtSignature(ULONG Value)\r\n{\r\n    m_TargetNtHeaders->Signature = Value;\r\n}\r\n"
  },
  {
    "path": "ext/detours/tests/corruptor.h",
    "content": "//////////////////////////////////////////////////////\r\n//\r\n//  Unit Test Image Corruptor (corruptor.h of unittests.exe)\r\n//\r\n//  Microsoft Research Detours Package\r\n//\r\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\r\n//\r\n#pragma once\r\n\r\nclass ImageCorruptor final\r\n{\r\npublic:\r\n\r\n    ImageCorruptor(PIMAGE_DOS_HEADER Header);\r\n\r\n    ~ImageCorruptor();\r\n\r\n    void ModifyDosMagic(WORD Value);\r\n\r\n    void ModifyNtSignature(ULONG Value);\r\n\r\nprivate:\r\n    // Pointer to the target image header to corrupt.\r\n    //\r\n    PIMAGE_DOS_HEADER m_TargetDosHeader;\r\n\r\n    // Cached copy of the DOS header, to restore state with.\r\n    //\r\n    IMAGE_DOS_HEADER m_OriginalDosHeader;\r\n\r\n    // The original protection of the DOS header.\r\n    //\r\n    DWORD m_OriginalDosProtection;\r\n\r\n    // Pointer to the target NT image header to corrupt.\r\n    //\r\n    PIMAGE_NT_HEADERS m_TargetNtHeaders;\r\n\r\n    // Cached copy of the NT headers, to restore state with.\r\n    //\r\n    IMAGE_NT_HEADERS m_OriginalNtHeaders;\r\n\r\n    // The original protection of the NT headers.\r\n    //\r\n    DWORD m_OriginalNtProtection;\r\n};\r\n"
  },
  {
    "path": "ext/detours/tests/main.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\r\n//\r\n//  Unit Test Main (main.cpp of unittests.exe)\r\n//\r\n//  Microsoft Research Detours Package\r\n//\r\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\r\n//\r\n#define CATCH_CONFIG_MAIN\r\n#include \"catch.hpp\"\r\n"
  },
  {
    "path": "ext/detours/tests/test_image_api.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\r\n//\r\n//  Unit Tests for Detours Image API (test_image_api.cpp of unittests.exe)\r\n//\r\n//  Microsoft Research Detours Package\r\n//\r\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\r\n//\r\n#include \"catch.hpp\"\r\n#include \"windows.h\"\r\n#include \"detours.h\"\r\n\r\nTEST_CASE(\"DetourBinaryOpen\", \"[image]\")\r\n{\r\n    SECTION(\"Passing INVALID_HANDLE, results in error\")\r\n    {\r\n        auto binary = DetourBinaryOpen(INVALID_HANDLE_VALUE);\r\n        REQUIRE( GetLastError() == ERROR_INVALID_HANDLE );\r\n        REQUIRE( binary == nullptr );\r\n    }\r\n}\r\n"
  },
  {
    "path": "ext/detours/tests/test_module_api.cpp",
    "content": "//////////////////////////////////////////////////////////////////////////////\r\n//\r\n//  Unit Tests for Detours Module API (test_module_api.cpp of unittests.exe)\r\n//\r\n//  Microsoft Research Detours Package\r\n//\r\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\r\n//\r\n#include \"catch.hpp\"\r\n#include \"windows.h\"\r\n#include \"detours.h\"\r\n#include \"corruptor.h\"\r\n\r\n// Expose the image base of the current module for test assertions.\r\n//\r\nextern \"C\" IMAGE_DOS_HEADER __ImageBase;\r\n\r\n// Expose default module entry point for test assertions.\r\n//\r\nextern \"C\" int mainCRTStartup();\r\n\r\n// Dummy function pointer used for tests.\r\n//\r\nvoid NoopFunction() { }\r\n\r\nTEST_CASE(\"DetourGetContainingModule\", \"[module]\")\r\n{\r\n    SECTION(\"Passing nullptr, results in nullptr\")\r\n    {\r\n        auto mod = DetourGetContainingModule(nullptr);\r\n        REQUIRE( GetLastError() == ERROR_BAD_EXE_FORMAT );\r\n        REQUIRE( mod == nullptr );\r\n    }\r\n\r\n    SECTION(\"Passing GetCommandLineW, results in kernel32 HMODULE\")\r\n    {\r\n        auto mod = DetourGetContainingModule(GetCommandLineW);\r\n        REQUIRE( GetLastError() == NO_ERROR );\r\n        REQUIRE( mod == LoadLibrary(\"kernel32.dll\") );\r\n    }\r\n\r\n    SECTION(\"Passing own function, results in own HMODULE\")\r\n    {\r\n        auto mod = DetourGetContainingModule(NoopFunction);\r\n        REQUIRE( GetLastError() == NO_ERROR );\r\n        REQUIRE( mod == reinterpret_cast<HMODULE>(&__ImageBase) );\r\n    }\r\n}\r\n\r\nTEST_CASE(\"DetourGetEntyPoint\", \"[module]\")\r\n{\r\n    SECTION(\"Passing nullptr, results in CRT entrypoint\")\r\n    {\r\n        auto entry = DetourGetEntryPoint(nullptr);\r\n        REQUIRE( GetLastError() == NO_ERROR );\r\n        REQUIRE( entry == mainCRTStartup );\r\n    }\r\n\r\n    SECTION(\"Passing nullptr, equals executing image\")\r\n    {\r\n        REQUIRE( DetourGetEntryPoint(nullptr) ==\r\n                 DetourGetEntryPoint(reinterpret_cast<HMODULE>(&__ImageBase)) );\r\n    }\r\n\r\n    SECTION(\"Passing ImageBase, results in CRT main\")\r\n    {\r\n        auto entry = DetourGetEntryPoint(reinterpret_cast<HMODULE>(&__ImageBase));\r\n        REQUIRE( GetLastError() == NO_ERROR );\r\n        REQUIRE( entry == mainCRTStartup );\r\n    }\r\n\r\n    SECTION(\"Corrupt image DOS header magic, results in bad exe format error\")\r\n    {\r\n        ImageCorruptor corruptor(&__ImageBase);\r\n        corruptor.ModifyDosMagic(0xDEAD);\r\n\r\n        auto entry = DetourGetEntryPoint(reinterpret_cast<HMODULE>(&__ImageBase));\r\n        REQUIRE( GetLastError() == ERROR_BAD_EXE_FORMAT );\r\n        REQUIRE( entry == nullptr );\r\n    }\r\n\r\n    SECTION(\"Corrupt image NT header signature, results in invalid signature error\")\r\n    {\r\n        ImageCorruptor corruptor(&__ImageBase);\r\n        corruptor.ModifyNtSignature(0xDEADBEEF);\r\n\r\n        auto entry = DetourGetEntryPoint(reinterpret_cast<HMODULE>(&__ImageBase));\r\n        REQUIRE( GetLastError() == ERROR_INVALID_EXE_SIGNATURE );\r\n        REQUIRE( entry == nullptr );\r\n    }\r\n}\r\n\r\nTEST_CASE(\"DetourGetModuleSize\", \"[module]\")\r\n{\r\n    SECTION(\"Passing nullptr, results in current module size\")\r\n    {\r\n        auto size = DetourGetModuleSize(nullptr);\r\n        REQUIRE( GetLastError() == NO_ERROR );\r\n        REQUIRE( size >= 0 );\r\n    }\r\n\r\n    SECTION(\"Passing stack, results in error\")\r\n    {\r\n        int value;\r\n        auto size = DetourGetModuleSize(reinterpret_cast<HMODULE>(&value));\r\n        REQUIRE( GetLastError() == ERROR_BAD_EXE_FORMAT);\r\n        REQUIRE( size == 0 );\r\n    }\r\n\r\n    SECTION(\"Passing nullptr, equals executing image\")\r\n    {\r\n        REQUIRE( DetourGetModuleSize(nullptr) ==\r\n                 DetourGetModuleSize(reinterpret_cast<HMODULE>(&__ImageBase)) );\r\n    }\r\n\r\n    SECTION(\"Corrupt image DOS header magic, results in bad exe format error\")\r\n    {\r\n        ImageCorruptor corruptor(&__ImageBase);\r\n        corruptor.ModifyDosMagic(0xDEAD);\r\n\r\n        auto size = DetourGetModuleSize(reinterpret_cast<HMODULE>(&__ImageBase));\r\n        REQUIRE( GetLastError() == ERROR_BAD_EXE_FORMAT );\r\n        REQUIRE( size == 0 );\r\n    }\r\n\r\n    SECTION(\"Corrupt image NT header signature, results in invalid signature error\")\r\n    {\r\n        ImageCorruptor corruptor(&__ImageBase);\r\n        corruptor.ModifyNtSignature(0xDEADBEEF);\r\n\r\n        auto size = DetourGetModuleSize(reinterpret_cast<HMODULE>(&__ImageBase));\r\n        REQUIRE( GetLastError() == ERROR_INVALID_EXE_SIGNATURE );\r\n        REQUIRE( size == 0 );\r\n    }\r\n}\r\n"
  },
  {
    "path": "ext/detours/vc/Detours.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio Version 16\r\nVisualStudioVersion = 16.0.29519.181\r\nMinimumVisualStudioVersion = 10.0.40219.1\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"Detours\", \"Detours.vcxproj\", \"{37489709-8054-4903-9C49-A79846049FC9}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebugMDd|ARM = DebugMDd|ARM\r\n\t\tDebugMDd|ARM64 = DebugMDd|ARM64\r\n\t\tDebugMDd|x64 = DebugMDd|x64\r\n\t\tDebugMDd|x86 = DebugMDd|x86\r\n\t\tReleaseMD|ARM = ReleaseMD|ARM\r\n\t\tReleaseMD|ARM64 = ReleaseMD|ARM64\r\n\t\tReleaseMD|x64 = ReleaseMD|x64\r\n\t\tReleaseMD|x86 = ReleaseMD|x86\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{37489709-8054-4903-9C49-A79846049FC9}.DebugMDd|ARM.ActiveCfg = DebugMDd|ARM\r\n\t\t{37489709-8054-4903-9C49-A79846049FC9}.DebugMDd|ARM.Build.0 = DebugMDd|ARM\r\n\t\t{37489709-8054-4903-9C49-A79846049FC9}.DebugMDd|ARM64.ActiveCfg = DebugMDd|ARM64\r\n\t\t{37489709-8054-4903-9C49-A79846049FC9}.DebugMDd|ARM64.Build.0 = DebugMDd|ARM64\r\n\t\t{37489709-8054-4903-9C49-A79846049FC9}.DebugMDd|x64.ActiveCfg = DebugMDd|x64\r\n\t\t{37489709-8054-4903-9C49-A79846049FC9}.DebugMDd|x64.Build.0 = DebugMDd|x64\r\n\t\t{37489709-8054-4903-9C49-A79846049FC9}.DebugMDd|x86.ActiveCfg = DebugMDd|Win32\r\n\t\t{37489709-8054-4903-9C49-A79846049FC9}.DebugMDd|x86.Build.0 = DebugMDd|Win32\r\n\t\t{37489709-8054-4903-9C49-A79846049FC9}.ReleaseMD|ARM.ActiveCfg = ReleaseMD|ARM\r\n\t\t{37489709-8054-4903-9C49-A79846049FC9}.ReleaseMD|ARM.Build.0 = ReleaseMD|ARM\r\n\t\t{37489709-8054-4903-9C49-A79846049FC9}.ReleaseMD|ARM64.ActiveCfg = ReleaseMD|ARM64\r\n\t\t{37489709-8054-4903-9C49-A79846049FC9}.ReleaseMD|ARM64.Build.0 = ReleaseMD|ARM64\r\n\t\t{37489709-8054-4903-9C49-A79846049FC9}.ReleaseMD|x64.ActiveCfg = ReleaseMD|x64\r\n\t\t{37489709-8054-4903-9C49-A79846049FC9}.ReleaseMD|x64.Build.0 = ReleaseMD|x64\r\n\t\t{37489709-8054-4903-9C49-A79846049FC9}.ReleaseMD|x86.ActiveCfg = ReleaseMD|Win32\r\n\t\t{37489709-8054-4903-9C49-A79846049FC9}.ReleaseMD|x86.Build.0 = ReleaseMD|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\n\tGlobalSection(ExtensibilityGlobals) = postSolution\r\n\t\tSolutionGuid = {1E71C644-7F30-4025-B1DF-6A4F07A2EDB3}\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "ext/detours/vc/Detours.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup Label=\"ProjectConfigurations\">\r\n    <ProjectConfiguration Include=\"DebugMDd|ARM\">\r\n      <Configuration>DebugMDd</Configuration>\r\n      <Platform>ARM</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"DebugMDd|ARM64\">\r\n      <Configuration>DebugMDd</Configuration>\r\n      <Platform>ARM64</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"DebugMDd|Win32\">\r\n      <Configuration>DebugMDd</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"ReleaseMD|ARM\">\r\n      <Configuration>ReleaseMD</Configuration>\r\n      <Platform>ARM</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"ReleaseMD|ARM64\">\r\n      <Configuration>ReleaseMD</Configuration>\r\n      <Platform>ARM64</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"ReleaseMD|Win32\">\r\n      <Configuration>ReleaseMD</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"DebugMDd|x64\">\r\n      <Configuration>DebugMDd</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"ReleaseMD|x64\">\r\n      <Configuration>ReleaseMD</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n  </ItemGroup>\r\n  <PropertyGroup Label=\"Globals\">\r\n    <VCProjectVersion>15.0</VCProjectVersion>\r\n    <ProjectGuid>{37489709-8054-4903-9C49-A79846049FC9}</ProjectGuid>\r\n    <Keyword>Win32Proj</Keyword>\r\n    <RootNamespace>Detours</RootNamespace>\r\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='DebugMDd|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Makefile</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <PlatformToolset>v142</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseMD|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Makefile</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <PlatformToolset>v142</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='DebugMDd|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>Makefile</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <PlatformToolset>v142</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='DebugMDd|ARM'\" Label=\"Configuration\">\r\n    <ConfigurationType>Makefile</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <PlatformToolset>v142</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='DebugMDd|ARM64'\" Label=\"Configuration\">\r\n    <ConfigurationType>Makefile</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <PlatformToolset>v142</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseMD|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>Makefile</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <PlatformToolset>v142</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseMD|ARM'\" Label=\"Configuration\">\r\n    <ConfigurationType>Makefile</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <PlatformToolset>v142</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseMD|ARM64'\" Label=\"Configuration\">\r\n    <ConfigurationType>Makefile</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <PlatformToolset>v142</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\r\n  <ImportGroup Label=\"ExtensionSettings\">\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"Shared\">\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='DebugMDd|Win32'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='ReleaseMD|Win32'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='DebugMDd|x64'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='DebugMDd|ARM'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='DebugMDd|ARM64'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='ReleaseMD|x64'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseMD|ARM'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseMD|ARM64'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='DebugMDd|x64'\">\r\n    <NMakeBuildCommandLine>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake</NMakeBuildCommandLine>\r\n    <NMakeReBuildCommandLine>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake clean\r\nnmake</NMakeReBuildCommandLine>\r\n    <NMakeCleanCommandLine>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake clean</NMakeCleanCommandLine>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='DebugMDd|ARM'\">\r\n    <NMakeBuildCommandLine>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake</NMakeBuildCommandLine>\r\n    <NMakeReBuildCommandLine>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake clean\r\nnmake</NMakeReBuildCommandLine>\r\n    <NMakeCleanCommandLine>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake clean</NMakeCleanCommandLine>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='DebugMDd|ARM64'\">\r\n    <NMakeBuildCommandLine>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake</NMakeBuildCommandLine>\r\n    <NMakeReBuildCommandLine>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake clean\r\nnmake</NMakeReBuildCommandLine>\r\n    <NMakeCleanCommandLine>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake clean</NMakeCleanCommandLine>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseMD|x64'\">\r\n    <NMakeBuildCommandLine>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake</NMakeBuildCommandLine>\r\n    <NMakeReBuildCommandLine>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake clean\r\nnmake</NMakeReBuildCommandLine>\r\n    <NMakeCleanCommandLine>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake clean</NMakeCleanCommandLine>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseMD|ARM'\">\r\n    <NMakeBuildCommandLine>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake</NMakeBuildCommandLine>\r\n    <NMakeReBuildCommandLine>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake clean\r\nnmake</NMakeReBuildCommandLine>\r\n    <NMakeCleanCommandLine>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake clean</NMakeCleanCommandLine>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='DebugMDd|Win32'\">\r\n    <NMakeBuildCommandLine>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake</NMakeBuildCommandLine>\r\n    <NMakeReBuildCommandLine>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake clean\r\nnmake</NMakeReBuildCommandLine>\r\n    <NMakeCleanCommandLine>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake clean</NMakeCleanCommandLine>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseMD|Win32'\">\r\n    <NMakeBuildCommandLine>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake</NMakeBuildCommandLine>\r\n    <NMakeReBuildCommandLine>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake clean\r\nnmake</NMakeReBuildCommandLine>\r\n    <NMakeCleanCommandLine>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake clean</NMakeCleanCommandLine>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseMD|ARM64'\">\r\n    <NMakeBuildCommandLine>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake</NMakeBuildCommandLine>\r\n    <NMakeReBuildCommandLine>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake clean\r\nnmake</NMakeReBuildCommandLine>\r\n    <NMakeCleanCommandLine>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake clean</NMakeCleanCommandLine>\r\n  </PropertyGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='DebugMDd|Win32'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level4</WarningLevel>\r\n      <SDLCheck>true</SDLCheck>\r\n      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <TreatWarningAsError>true</TreatWarningAsError>\r\n      <ConformanceMode>true</ConformanceMode>\r\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r\n      <ProgramDataBaseFileName>$(OutputPath)$(TargetName).pdb</ProgramDataBaseFileName>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Windows</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n    </Link>\r\n    <PostBuildEvent />\r\n    <PreBuildEvent>\r\n      <Command>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake</Command>\r\n    </PreBuildEvent>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='DebugMDd|x64'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level4</WarningLevel>\r\n      <Optimization>Disabled</Optimization>\r\n      <SDLCheck>true</SDLCheck>\r\n      <PreprocessorDefinitions>_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <TreatWarningAsError>true</TreatWarningAsError>\r\n      <ConformanceMode>true</ConformanceMode>\r\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r\n      <PrecompiledHeaderFile />\r\n      <PrecompiledHeaderOutputFile />\r\n      <ProgramDataBaseFileName>$(OutputPath)$(TargetName).pdb</ProgramDataBaseFileName>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Windows</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n    </Link>\r\n    <PostBuildEvent />\r\n    <PreBuildEvent>\r\n      <Command>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake</Command>\r\n    </PreBuildEvent>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='DebugMDd|ARM'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level4</WarningLevel>\r\n      <Optimization>Disabled</Optimization>\r\n      <SDLCheck>true</SDLCheck>\r\n      <PreprocessorDefinitions>_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <TreatWarningAsError>true</TreatWarningAsError>\r\n      <ConformanceMode>true</ConformanceMode>\r\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r\n      <PrecompiledHeaderFile>\r\n      </PrecompiledHeaderFile>\r\n      <PrecompiledHeaderOutputFile>\r\n      </PrecompiledHeaderOutputFile>\r\n      <ProgramDataBaseFileName>$(OutputPath)$(TargetName).pdb</ProgramDataBaseFileName>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Windows</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n    </Link>\r\n    <PostBuildEvent />\r\n    <PreBuildEvent>\r\n      <Command>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake</Command>\r\n    </PreBuildEvent>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='DebugMDd|ARM64'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level4</WarningLevel>\r\n      <Optimization>Disabled</Optimization>\r\n      <SDLCheck>true</SDLCheck>\r\n      <PreprocessorDefinitions>_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <TreatWarningAsError>true</TreatWarningAsError>\r\n      <ConformanceMode>true</ConformanceMode>\r\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r\n      <PrecompiledHeaderFile>\r\n      </PrecompiledHeaderFile>\r\n      <PrecompiledHeaderOutputFile>\r\n      </PrecompiledHeaderOutputFile>\r\n      <ProgramDataBaseFileName>$(OutputPath)$(TargetName).pdb</ProgramDataBaseFileName>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Windows</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n    </Link>\r\n    <PostBuildEvent />\r\n    <PreBuildEvent>\r\n      <Command>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake</Command>\r\n    </PreBuildEvent>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseMD|Win32'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level4</WarningLevel>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <SDLCheck>true</SDLCheck>\r\n      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <TreatWarningAsError>true</TreatWarningAsError>\r\n      <ConformanceMode>true</ConformanceMode>\r\n      <ProgramDataBaseFileName>$(OutputPath)$(TargetName).pdb</ProgramDataBaseFileName>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Windows</SubSystem>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n    </Link>\r\n    <PostBuildEvent />\r\n    <PreBuildEvent>\r\n      <Command>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake</Command>\r\n    </PreBuildEvent>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseMD|x64'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level4</WarningLevel>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <SDLCheck>true</SDLCheck>\r\n      <PreprocessorDefinitions>NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <TreatWarningAsError>true</TreatWarningAsError>\r\n      <ConformanceMode>true</ConformanceMode>\r\n      <PrecompiledHeaderFile />\r\n      <PrecompiledHeaderOutputFile />\r\n      <ProgramDataBaseFileName>$(OutputPath)$(TargetName).pdb</ProgramDataBaseFileName>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Windows</SubSystem>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n    </Link>\r\n    <PostBuildEvent />\r\n    <PreBuildEvent>\r\n      <Command>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake</Command>\r\n    </PreBuildEvent>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseMD|ARM'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level4</WarningLevel>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <SDLCheck>true</SDLCheck>\r\n      <PreprocessorDefinitions>NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <TreatWarningAsError>true</TreatWarningAsError>\r\n      <ConformanceMode>true</ConformanceMode>\r\n      <PrecompiledHeaderFile>\r\n      </PrecompiledHeaderFile>\r\n      <PrecompiledHeaderOutputFile>\r\n      </PrecompiledHeaderOutputFile>\r\n      <ProgramDataBaseFileName>$(OutputPath)$(TargetName).pdb</ProgramDataBaseFileName>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Windows</SubSystem>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n    </Link>\r\n    <PostBuildEvent />\r\n    <PreBuildEvent>\r\n      <Command>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake</Command>\r\n    </PreBuildEvent>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseMD|ARM64'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level4</WarningLevel>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <SDLCheck>true</SDLCheck>\r\n      <PreprocessorDefinitions>NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <TreatWarningAsError>true</TreatWarningAsError>\r\n      <ConformanceMode>true</ConformanceMode>\r\n      <PrecompiledHeaderFile>\r\n      </PrecompiledHeaderFile>\r\n      <PrecompiledHeaderOutputFile>\r\n      </PrecompiledHeaderOutputFile>\r\n      <ProgramDataBaseFileName>$(OutputPath)$(TargetName).pdb</ProgramDataBaseFileName>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Windows</SubSystem>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n    </Link>\r\n    <PostBuildEvent />\r\n    <PreBuildEvent>\r\n      <Command>SET DETOURS_TARGET_PROCESSOR=$(PlatformTarget)\r\ncd ..\r\nnmake</Command>\r\n    </PreBuildEvent>\r\n  </ItemDefinitionGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"..\\samples\\comeasy\\comeasy.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\comeasy\\wrotei.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\commem\\commem.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\cping\\cping.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\disas\\disas.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\disas\\unk.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\disas\\x86.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\dtest\\dtarge.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\dtest\\dtest.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\dumpe\\dumpe.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\dumpi\\dumpi.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\dynamic_alloc\\main.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\echo\\echofx.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\echo\\echonul.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\echo\\main.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\einst\\edll1x.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\einst\\edll2x.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\einst\\edll3x.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\einst\\einst.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\excep\\excep.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\excep\\firstexc.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\findfunc\\extend.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\findfunc\\findfunc.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\findfunc\\symtest.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\findfunc\\target.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\impmunge\\impmunge.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\member\\member.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\opengl\\ogldet.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\opengl\\testogl.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\region\\region.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\setdll\\setdll.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\simple\\simple.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\simple\\sleep5.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\slept\\dslept.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\slept\\sleepbed.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\slept\\sleepnew.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\slept\\sleepold.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\slept\\slept.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\slept\\verify.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\syelog\\sltest.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\syelog\\sltestp.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\syelog\\syelog.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\syelog\\syelogd.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\talloc\\talloc.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\talloc\\tdll1x.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\talloc\\tdll2x.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\talloc\\tdll3x.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\talloc\\tdll4x.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\talloc\\tdll5x.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\talloc\\tdll6x.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\talloc\\tdll7x.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\talloc\\tdll8x.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\talloc\\tdll9x.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\traceapi\\testapi.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\traceapi\\trcapi.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\traceapi\\_win32.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\tracebld\\tracebld.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\tracebld\\trcbld.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\tracelnk\\trclnk.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\tracemem\\trcmem.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\tracereg\\trcreg.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\traceser\\trcser.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\tracessl\\trcssl.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\tracetcp\\trctcp.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\tryman\\size.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\tryman\\tryman.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\tryman\\tstman.cpp\" />\r\n    <ClCompile Include=\"..\\samples\\withdll\\withdll.cpp\" />\r\n    <ClCompile Include=\"..\\src\\creatwth.cpp\" />\r\n    <ClCompile Include=\"..\\src\\detours.cpp\" />\r\n    <ClCompile Include=\"..\\src\\disasm.cpp\" />\r\n    <ClCompile Include=\"..\\src\\disolarm.cpp\" />\r\n    <ClCompile Include=\"..\\src\\disolarm64.cpp\" />\r\n    <ClCompile Include=\"..\\src\\disolia64.cpp\" />\r\n    <ClCompile Include=\"..\\src\\disolx64.cpp\" />\r\n    <ClCompile Include=\"..\\src\\disolx86.cpp\" />\r\n    <ClCompile Include=\"..\\src\\image.cpp\" />\r\n    <ClCompile Include=\"..\\src\\modules.cpp\" />\r\n    <ClCompile Include=\"..\\src\\uimports.cpp\">\r\n      <ExcludedFromBuild>true</ExcludedFromBuild>\r\n    </ClCompile>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"..\\samples\\dtest\\dtarge.h\" />\r\n    <ClInclude Include=\"..\\samples\\excep\\firstexc.h\" />\r\n    <ClInclude Include=\"..\\samples\\findfunc\\target.h\" />\r\n    <ClInclude Include=\"..\\samples\\slept\\slept.h\" />\r\n    <ClInclude Include=\"..\\samples\\syelog\\syelog.h\" />\r\n    <ClInclude Include=\"..\\samples\\tracebld\\tracebld.h\" />\r\n    <ClInclude Include=\"..\\src\\detours.h\" />\r\n    <ClInclude Include=\"..\\src\\detver.h\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"..\\.gitignore\" />\r\n    <None Include=\"..\\LICENSE.md\" />\r\n    <None Include=\"..\\Makefile\" />\r\n    <None Include=\"..\\README.md\" />\r\n    <None Include=\"..\\samples\\comeasy\\Makefile\" />\r\n    <None Include=\"..\\samples\\commem\\Makefile\" />\r\n    <None Include=\"..\\samples\\common.mak\" />\r\n    <None Include=\"..\\samples\\cping\\cping.dat\" />\r\n    <None Include=\"..\\samples\\cping\\Makefile\" />\r\n    <None Include=\"..\\samples\\disas\\arm.asm\" />\r\n    <None Include=\"..\\samples\\disas\\ia64.asm\" />\r\n    <None Include=\"..\\samples\\disas\\Makefile\" />\r\n    <None Include=\"..\\samples\\disas\\x64.asm\" />\r\n    <None Include=\"..\\samples\\dtest\\Makefile\" />\r\n    <None Include=\"..\\samples\\dumpe\\Makefile\" />\r\n    <None Include=\"..\\samples\\dumpi\\Makefile\" />\r\n    <None Include=\"..\\samples\\dynamic_alloc\\Makefile\" />\r\n    <None Include=\"..\\samples\\dynamic_alloc\\x64.asm\" />\r\n    <None Include=\"..\\samples\\dynamic_alloc\\x86.asm\" />\r\n    <None Include=\"..\\samples\\echo\\Makefile\" />\r\n    <None Include=\"..\\samples\\einst\\Makefile\" />\r\n    <None Include=\"..\\samples\\excep\\Makefile\" />\r\n    <None Include=\"..\\samples\\findfunc\\Makefile\" />\r\n    <None Include=\"..\\samples\\impmunge\\Makefile\" />\r\n    <None Include=\"..\\samples\\Makefile\" />\r\n    <None Include=\"..\\samples\\member\\Makefile\" />\r\n    <None Include=\"..\\samples\\opengl\\Makefile\" />\r\n    <None Include=\"..\\samples\\region\\Makefile\" />\r\n    <None Include=\"..\\samples\\setdll\\Makefile\" />\r\n    <None Include=\"..\\samples\\simple\\Makefile\" />\r\n    <None Include=\"..\\samples\\slept\\Makefile\" />\r\n    <None Include=\"..\\samples\\syelog\\Makefile\" />\r\n    <None Include=\"..\\samples\\talloc\\Makefile\" />\r\n    <None Include=\"..\\samples\\traceapi\\Makefile\" />\r\n    <None Include=\"..\\samples\\tracebld\\Makefile\" />\r\n    <None Include=\"..\\samples\\tracelnk\\Makefile\" />\r\n    <None Include=\"..\\samples\\tracemem\\Makefile\" />\r\n    <None Include=\"..\\samples\\tracereg\\Makefile\" />\r\n    <None Include=\"..\\samples\\traceser\\Makefile\" />\r\n    <None Include=\"..\\samples\\tracessl\\Makefile\" />\r\n    <None Include=\"..\\samples\\tracetcp\\Makefile\" />\r\n    <None Include=\"..\\samples\\tryman\\Makefile\" />\r\n    <None Include=\"..\\samples\\tryman\\managed.cs\" />\r\n    <None Include=\"..\\samples\\withdll\\Makefile\" />\r\n    <None Include=\"..\\system.mak\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Text Include=\"..\\CREDITS.TXT\" />\r\n    <Text Include=\"..\\samples\\cping\\ReadMe.Txt\" />\r\n    <Text Include=\"..\\samples\\dtest\\NORMAL_IA64.TXT\" />\r\n    <Text Include=\"..\\samples\\dtest\\NORMAL_X64.TXT\" />\r\n    <Text Include=\"..\\samples\\dtest\\NORMAL_X86.TXT\" />\r\n    <Text Include=\"..\\samples\\README.TXT\" />\r\n    <Text Include=\"..\\samples\\slept\\NORMAL_IA64.TXT\" />\r\n    <Text Include=\"..\\samples\\slept\\NORMAL_X64.TXT\" />\r\n    <Text Include=\"..\\samples\\slept\\NORMAL_X86.TXT\" />\r\n    <Text Include=\"..\\samples\\talloc\\NORMAL_IA64.TXT\" />\r\n    <Text Include=\"..\\samples\\talloc\\NORMAL_X64.TXT\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ResourceCompile Include=\"..\\samples\\comeasy\\wrotei.rc\" />\r\n    <ResourceCompile Include=\"..\\samples\\dtest\\dtarge.rc\" />\r\n    <ResourceCompile Include=\"..\\samples\\echo\\echofx.rc\" />\r\n    <ResourceCompile Include=\"..\\samples\\findfunc\\extend.rc\" />\r\n    <ResourceCompile Include=\"..\\samples\\findfunc\\target.rc\" />\r\n    <ResourceCompile Include=\"..\\samples\\opengl\\ogldet.rc\" />\r\n    <ResourceCompile Include=\"..\\samples\\simple\\simple.rc\" />\r\n    <ResourceCompile Include=\"..\\samples\\slept\\dslept.rc\" />\r\n    <ResourceCompile Include=\"..\\samples\\slept\\slept.rc\" />\r\n    <ResourceCompile Include=\"..\\samples\\traceapi\\trcapi.rc\" />\r\n    <ResourceCompile Include=\"..\\samples\\tracebld\\trcbld.rc\" />\r\n    <ResourceCompile Include=\"..\\samples\\tracelnk\\trclnk.rc\" />\r\n    <ResourceCompile Include=\"..\\samples\\tracemem\\trcmem.rc\" />\r\n    <ResourceCompile Include=\"..\\samples\\tracereg\\trcreg.rc\" />\r\n    <ResourceCompile Include=\"..\\samples\\traceser\\trcser.rc\" />\r\n    <ResourceCompile Include=\"..\\samples\\tracessl\\trcssl.rc\" />\r\n    <ResourceCompile Include=\"..\\samples\\tracetcp\\trctcp.rc\" />\r\n    <ResourceCompile Include=\"..\\samples\\tryman\\tstman.rc\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Midl Include=\"..\\samples\\cping\\iping.idl\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\r\n  <ImportGroup Label=\"ExtensionTargets\">\r\n  </ImportGroup>\r\n</Project>"
  },
  {
    "path": "ext/detours/vc/Detours.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup>\r\n    <Filter Include=\"samples\">\r\n      <UniqueIdentifier>{4DE3849F-647A-48FF-8873-256D44DFF3CA}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\comeasy\">\r\n      <UniqueIdentifier>{6215A674-4251-4F64-AA56-6F80297E5F8B}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\commem\">\r\n      <UniqueIdentifier>{B581B77F-AE4D-43BC-8C4F-EDE0E61EFFD3}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\cping\">\r\n      <UniqueIdentifier>{BF2ACC0E-890D-4BD0-B532-6228AF011E3E}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\disas\">\r\n      <UniqueIdentifier>{32F50667-320C-4799-B7DA-D1878C358D64}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\dtest\">\r\n      <UniqueIdentifier>{314C251E-4D8E-4837-9C36-4741399ED2A1}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\dumpe\">\r\n      <UniqueIdentifier>{53C9A890-D5AB-4FD1-B898-6107C0E676E7}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\dumpi\">\r\n      <UniqueIdentifier>{17467834-9161-4FB2-BBEF-E3233CBBC818}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\dynamic_alloc\">\r\n      <UniqueIdentifier>{5A3371DC-E827-47CC-901A-F3D91162EFB2}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\echo\">\r\n      <UniqueIdentifier>{A2B9B912-8C03-400F-B271-51EEB4CE6843}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\einst\">\r\n      <UniqueIdentifier>{571B99A3-B6D5-4838-B189-4A038B104B2A}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\excep\">\r\n      <UniqueIdentifier>{F1740406-C1BB-49C7-A602-9DDACBD4ABCA}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\findfunc\">\r\n      <UniqueIdentifier>{58CCECE5-A38B-4C56-8E3F-3E0722393F56}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\impmunge\">\r\n      <UniqueIdentifier>{B3E06AC8-3F78-43C8-B7AC-84546475F960}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\member\">\r\n      <UniqueIdentifier>{CD32F55E-60C5-4ED6-ACCC-4B43E6AC195D}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\opengl\">\r\n      <UniqueIdentifier>{1ABFBA92-4E60-481A-9007-8150D95E072F}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\region\">\r\n      <UniqueIdentifier>{0929821A-9C85-4D74-B969-865D6DA40D2A}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\setdll\">\r\n      <UniqueIdentifier>{9017F1FA-4DCB-44D1-854D-2F14358791F5}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\simple\">\r\n      <UniqueIdentifier>{D9D7E0B0-4E14-473F-AE28-B4A5AF4EB427}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\slept\">\r\n      <UniqueIdentifier>{88EFC740-5E28-484E-97FC-E7BBA6D36454}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\syelog\">\r\n      <UniqueIdentifier>{EA900A65-64CA-417B-8DE7-4174C9CB1E5A}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\talloc\">\r\n      <UniqueIdentifier>{7A1582F0-0A25-4A0E-B7E5-14F6E332BDFA}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\traceapi\">\r\n      <UniqueIdentifier>{B99E03FF-320A-4D13-BFB8-674E102E306D}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\tracebld\">\r\n      <UniqueIdentifier>{6169E241-5297-4B63-8D32-407D592EF103}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\tracelnk\">\r\n      <UniqueIdentifier>{EFD841EC-A8B1-4CD6-AC2D-0D286669BA3B}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\tracemem\">\r\n      <UniqueIdentifier>{14F0CAFF-0470-4D28-9083-3FD5656E7B27}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\tracereg\">\r\n      <UniqueIdentifier>{A3CE1454-F707-4A29-B389-2E762651CDD7}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\traceser\">\r\n      <UniqueIdentifier>{D3299D5A-9CE3-45E6-9784-4166606BA70B}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\tracessl\">\r\n      <UniqueIdentifier>{6E1471A7-7B40-4528-8210-64CFC4663258}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\tracetcp\">\r\n      <UniqueIdentifier>{62236214-1B41-4765-9D9D-1E313B4E5AB7}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\tryman\">\r\n      <UniqueIdentifier>{24AC6634-A8C9-430B-8D95-45DEB57070C9}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"samples\\withdll\">\r\n      <UniqueIdentifier>{077E7134-5AA3-4151-8313-88106FCBDAB3}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"src\">\r\n      <UniqueIdentifier>{E980771B-0BA5-4B01-947A-B99D33E31E89}</UniqueIdentifier>\r\n    </Filter>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"..\\src\\uimports.cpp\">\r\n      <Filter>src</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\src\\creatwth.cpp\">\r\n      <Filter>src</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\src\\detours.cpp\">\r\n      <Filter>src</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\src\\disasm.cpp\">\r\n      <Filter>src</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\src\\disolarm.cpp\">\r\n      <Filter>src</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\src\\disolarm64.cpp\">\r\n      <Filter>src</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\src\\disolia64.cpp\">\r\n      <Filter>src</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\src\\disolx64.cpp\">\r\n      <Filter>src</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\src\\disolx86.cpp\">\r\n      <Filter>src</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\src\\image.cpp\">\r\n      <Filter>src</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\src\\modules.cpp\">\r\n      <Filter>src</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\tryman\\size.cpp\">\r\n      <Filter>samples\\tryman</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\tracebld\\tracebld.cpp\">\r\n      <Filter>samples\\tracebld</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\tracebld\\trcbld.cpp\">\r\n      <Filter>samples\\tracebld</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\tracelnk\\trclnk.cpp\">\r\n      <Filter>samples\\tracelnk</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\tracemem\\trcmem.cpp\">\r\n      <Filter>samples\\tracemem</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\tracereg\\trcreg.cpp\">\r\n      <Filter>samples\\tracereg</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\traceser\\trcser.cpp\">\r\n      <Filter>samples\\traceser</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\tracessl\\trcssl.cpp\">\r\n      <Filter>samples\\tracessl</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\tracetcp\\trctcp.cpp\">\r\n      <Filter>samples\\tracetcp</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\tryman\\tryman.cpp\">\r\n      <Filter>samples\\tryman</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\tryman\\tstman.cpp\">\r\n      <Filter>samples\\tryman</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\withdll\\withdll.cpp\">\r\n      <Filter>samples\\withdll</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\traceapi\\_win32.cpp\">\r\n      <Filter>samples\\traceapi</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\slept\\dslept.cpp\">\r\n      <Filter>samples\\slept</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\simple\\simple.cpp\">\r\n      <Filter>samples\\simple</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\simple\\sleep5.cpp\">\r\n      <Filter>samples\\simple</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\slept\\sleepbed.cpp\">\r\n      <Filter>samples\\slept</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\slept\\sleepnew.cpp\">\r\n      <Filter>samples\\slept</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\slept\\sleepold.cpp\">\r\n      <Filter>samples\\slept</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\slept\\slept.cpp\">\r\n      <Filter>samples\\slept</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\syelog\\sltest.cpp\">\r\n      <Filter>samples\\syelog</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\syelog\\sltestp.cpp\">\r\n      <Filter>samples\\syelog</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\syelog\\syelog.cpp\">\r\n      <Filter>samples\\syelog</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\syelog\\syelogd.cpp\">\r\n      <Filter>samples\\syelog</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\talloc\\talloc.cpp\">\r\n      <Filter>samples\\talloc</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\talloc\\tdll1x.cpp\">\r\n      <Filter>samples\\talloc</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\talloc\\tdll2x.cpp\">\r\n      <Filter>samples\\talloc</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\talloc\\tdll3x.cpp\">\r\n      <Filter>samples\\talloc</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\talloc\\tdll4x.cpp\">\r\n      <Filter>samples\\talloc</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\talloc\\tdll5x.cpp\">\r\n      <Filter>samples\\talloc</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\talloc\\tdll6x.cpp\">\r\n      <Filter>samples\\talloc</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\talloc\\tdll7x.cpp\">\r\n      <Filter>samples\\talloc</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\talloc\\tdll8x.cpp\">\r\n      <Filter>samples\\talloc</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\talloc\\tdll9x.cpp\">\r\n      <Filter>samples\\talloc</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\traceapi\\testapi.cpp\">\r\n      <Filter>samples\\traceapi</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\traceapi\\trcapi.cpp\">\r\n      <Filter>samples\\traceapi</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\slept\\verify.cpp\">\r\n      <Filter>samples\\slept</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\dtest\\dtarge.cpp\">\r\n      <Filter>samples\\dtest</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\dtest\\dtest.cpp\">\r\n      <Filter>samples\\dtest</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\dumpe\\dumpe.cpp\">\r\n      <Filter>samples\\dumpe</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\dumpi\\dumpi.cpp\">\r\n      <Filter>samples\\dumpi</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\echo\\echofx.cpp\">\r\n      <Filter>samples\\echo</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\echo\\echonul.cpp\">\r\n      <Filter>samples\\echo</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\einst\\edll1x.cpp\">\r\n      <Filter>samples\\einst</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\einst\\edll2x.cpp\">\r\n      <Filter>samples\\einst</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\einst\\edll3x.cpp\">\r\n      <Filter>samples\\einst</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\einst\\einst.cpp\">\r\n      <Filter>samples\\einst</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\excep\\excep.cpp\">\r\n      <Filter>samples\\excep</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\findfunc\\extend.cpp\">\r\n      <Filter>samples\\findfunc</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\findfunc\\findfunc.cpp\">\r\n      <Filter>samples\\findfunc</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\excep\\firstexc.cpp\">\r\n      <Filter>samples\\excep</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\impmunge\\impmunge.cpp\">\r\n      <Filter>samples\\impmunge</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\dynamic_alloc\\main.cpp\">\r\n      <Filter>samples\\dynamic_alloc</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\echo\\main.cpp\">\r\n      <Filter>samples\\echo</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\member\\member.cpp\">\r\n      <Filter>samples\\member</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\opengl\\ogldet.cpp\">\r\n      <Filter>samples\\opengl</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\region\\region.cpp\">\r\n      <Filter>samples\\region</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\setdll\\setdll.cpp\">\r\n      <Filter>samples\\setdll</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\findfunc\\symtest.cpp\">\r\n      <Filter>samples\\findfunc</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\findfunc\\target.cpp\">\r\n      <Filter>samples\\findfunc</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\opengl\\testogl.cpp\">\r\n      <Filter>samples\\opengl</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\comeasy\\comeasy.cpp\">\r\n      <Filter>samples\\comeasy</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\commem\\commem.cpp\">\r\n      <Filter>samples\\commem</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\cping\\cping.cpp\">\r\n      <Filter>samples\\cping</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\disas\\disas.cpp\">\r\n      <Filter>samples\\disas</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\disas\\unk.cpp\">\r\n      <Filter>samples\\disas</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\comeasy\\wrotei.cpp\">\r\n      <Filter>samples\\comeasy</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\samples\\disas\\x86.cpp\">\r\n      <Filter>samples\\disas</Filter>\r\n    </ClCompile>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"..\\src\\detours.h\">\r\n      <Filter>src</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\src\\detver.h\">\r\n      <Filter>src</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\samples\\tracebld\\tracebld.h\">\r\n      <Filter>samples\\tracebld</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\samples\\slept\\slept.h\">\r\n      <Filter>samples\\slept</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\samples\\syelog\\syelog.h\">\r\n      <Filter>samples\\syelog</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\samples\\dtest\\dtarge.h\">\r\n      <Filter>samples\\dtest</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\samples\\excep\\firstexc.h\">\r\n      <Filter>samples\\excep</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\samples\\findfunc\\target.h\">\r\n      <Filter>samples\\findfunc</Filter>\r\n    </ClInclude>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"..\\samples\\tracebld\\Makefile\">\r\n      <Filter>samples\\tracebld</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\tracelnk\\Makefile\">\r\n      <Filter>samples\\tracelnk</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\tracemem\\Makefile\">\r\n      <Filter>samples\\tracemem</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\tracereg\\Makefile\">\r\n      <Filter>samples\\tracereg</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\traceser\\Makefile\">\r\n      <Filter>samples\\traceser</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\tracessl\\Makefile\">\r\n      <Filter>samples\\tracessl</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\tracetcp\\Makefile\">\r\n      <Filter>samples\\tracetcp</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\tryman\\Makefile\">\r\n      <Filter>samples\\tryman</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\withdll\\Makefile\">\r\n      <Filter>samples\\withdll</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\tryman\\managed.cs\">\r\n      <Filter>samples\\tryman</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\simple\\Makefile\">\r\n      <Filter>samples\\simple</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\slept\\Makefile\">\r\n      <Filter>samples\\slept</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\syelog\\Makefile\">\r\n      <Filter>samples\\syelog</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\talloc\\Makefile\">\r\n      <Filter>samples\\talloc</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\traceapi\\Makefile\">\r\n      <Filter>samples\\traceapi</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\dumpe\\Makefile\">\r\n      <Filter>samples\\dumpe</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\dumpi\\Makefile\">\r\n      <Filter>samples\\dumpi</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\dynamic_alloc\\Makefile\">\r\n      <Filter>samples\\dynamic_alloc</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\echo\\Makefile\">\r\n      <Filter>samples\\echo</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\einst\\Makefile\">\r\n      <Filter>samples\\einst</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\excep\\Makefile\">\r\n      <Filter>samples\\excep</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\findfunc\\Makefile\">\r\n      <Filter>samples\\findfunc</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\impmunge\\Makefile\">\r\n      <Filter>samples\\impmunge</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\member\\Makefile\">\r\n      <Filter>samples\\member</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\opengl\\Makefile\">\r\n      <Filter>samples\\opengl</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\region\\Makefile\">\r\n      <Filter>samples\\region</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\setdll\\Makefile\">\r\n      <Filter>samples\\setdll</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\dynamic_alloc\\x64.asm\">\r\n      <Filter>samples\\dynamic_alloc</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\dynamic_alloc\\x86.asm\">\r\n      <Filter>samples\\dynamic_alloc</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\disas\\arm.asm\">\r\n      <Filter>samples\\disas</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\common.mak\">\r\n      <Filter>samples</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\cping\\cping.dat\">\r\n      <Filter>samples\\cping</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\disas\\ia64.asm\">\r\n      <Filter>samples\\disas</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\comeasy\\Makefile\">\r\n      <Filter>samples\\comeasy</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\commem\\Makefile\">\r\n      <Filter>samples\\commem</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\cping\\Makefile\">\r\n      <Filter>samples\\cping</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\disas\\Makefile\">\r\n      <Filter>samples\\disas</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\dtest\\Makefile\">\r\n      <Filter>samples\\dtest</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\Makefile\">\r\n      <Filter>samples</Filter>\r\n    </None>\r\n    <None Include=\"..\\samples\\disas\\x64.asm\">\r\n      <Filter>samples\\disas</Filter>\r\n    </None>\r\n    <None Include=\"..\\.gitignore\" />\r\n    <None Include=\"..\\LICENSE.md\" />\r\n    <None Include=\"..\\Makefile\" />\r\n    <None Include=\"..\\README.md\" />\r\n    <None Include=\"..\\system.mak\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Text Include=\"..\\samples\\slept\\NORMAL_IA64.TXT\">\r\n      <Filter>samples\\slept</Filter>\r\n    </Text>\r\n    <Text Include=\"..\\samples\\talloc\\NORMAL_IA64.TXT\">\r\n      <Filter>samples\\talloc</Filter>\r\n    </Text>\r\n    <Text Include=\"..\\samples\\slept\\NORMAL_X64.TXT\">\r\n      <Filter>samples\\slept</Filter>\r\n    </Text>\r\n    <Text Include=\"..\\samples\\talloc\\NORMAL_X64.TXT\">\r\n      <Filter>samples\\talloc</Filter>\r\n    </Text>\r\n    <Text Include=\"..\\samples\\slept\\NORMAL_X86.TXT\">\r\n      <Filter>samples\\slept</Filter>\r\n    </Text>\r\n    <Text Include=\"..\\samples\\dtest\\NORMAL_IA64.TXT\">\r\n      <Filter>samples\\dtest</Filter>\r\n    </Text>\r\n    <Text Include=\"..\\samples\\dtest\\NORMAL_X64.TXT\">\r\n      <Filter>samples\\dtest</Filter>\r\n    </Text>\r\n    <Text Include=\"..\\samples\\dtest\\NORMAL_X86.TXT\">\r\n      <Filter>samples\\dtest</Filter>\r\n    </Text>\r\n    <Text Include=\"..\\samples\\cping\\ReadMe.Txt\">\r\n      <Filter>samples\\cping</Filter>\r\n    </Text>\r\n    <Text Include=\"..\\samples\\README.TXT\">\r\n      <Filter>samples</Filter>\r\n    </Text>\r\n    <Text Include=\"..\\CREDITS.TXT\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ResourceCompile Include=\"..\\samples\\traceapi\\trcapi.rc\">\r\n      <Filter>samples\\traceapi</Filter>\r\n    </ResourceCompile>\r\n    <ResourceCompile Include=\"..\\samples\\tracebld\\trcbld.rc\">\r\n      <Filter>samples\\tracebld</Filter>\r\n    </ResourceCompile>\r\n    <ResourceCompile Include=\"..\\samples\\tracelnk\\trclnk.rc\">\r\n      <Filter>samples\\tracelnk</Filter>\r\n    </ResourceCompile>\r\n    <ResourceCompile Include=\"..\\samples\\tracemem\\trcmem.rc\">\r\n      <Filter>samples\\tracemem</Filter>\r\n    </ResourceCompile>\r\n    <ResourceCompile Include=\"..\\samples\\tracereg\\trcreg.rc\">\r\n      <Filter>samples\\tracereg</Filter>\r\n    </ResourceCompile>\r\n    <ResourceCompile Include=\"..\\samples\\traceser\\trcser.rc\">\r\n      <Filter>samples\\traceser</Filter>\r\n    </ResourceCompile>\r\n    <ResourceCompile Include=\"..\\samples\\tracessl\\trcssl.rc\">\r\n      <Filter>samples\\tracessl</Filter>\r\n    </ResourceCompile>\r\n    <ResourceCompile Include=\"..\\samples\\tracetcp\\trctcp.rc\">\r\n      <Filter>samples\\tracetcp</Filter>\r\n    </ResourceCompile>\r\n    <ResourceCompile Include=\"..\\samples\\tryman\\tstman.rc\">\r\n      <Filter>samples\\tryman</Filter>\r\n    </ResourceCompile>\r\n    <ResourceCompile Include=\"..\\samples\\slept\\dslept.rc\">\r\n      <Filter>samples\\slept</Filter>\r\n    </ResourceCompile>\r\n    <ResourceCompile Include=\"..\\samples\\simple\\simple.rc\">\r\n      <Filter>samples\\simple</Filter>\r\n    </ResourceCompile>\r\n    <ResourceCompile Include=\"..\\samples\\slept\\slept.rc\">\r\n      <Filter>samples\\slept</Filter>\r\n    </ResourceCompile>\r\n    <ResourceCompile Include=\"..\\samples\\dtest\\dtarge.rc\">\r\n      <Filter>samples\\dtest</Filter>\r\n    </ResourceCompile>\r\n    <ResourceCompile Include=\"..\\samples\\echo\\echofx.rc\">\r\n      <Filter>samples\\echo</Filter>\r\n    </ResourceCompile>\r\n    <ResourceCompile Include=\"..\\samples\\findfunc\\extend.rc\">\r\n      <Filter>samples\\findfunc</Filter>\r\n    </ResourceCompile>\r\n    <ResourceCompile Include=\"..\\samples\\opengl\\ogldet.rc\">\r\n      <Filter>samples\\opengl</Filter>\r\n    </ResourceCompile>\r\n    <ResourceCompile Include=\"..\\samples\\findfunc\\target.rc\">\r\n      <Filter>samples\\findfunc</Filter>\r\n    </ResourceCompile>\r\n    <ResourceCompile Include=\"..\\samples\\comeasy\\wrotei.rc\">\r\n      <Filter>samples\\comeasy</Filter>\r\n    </ResourceCompile>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Midl Include=\"..\\samples\\cping\\iping.idl\">\r\n      <Filter>samples\\cping</Filter>\r\n    </Midl>\r\n  </ItemGroup>\r\n</Project>"
  },
  {
    "path": "ext/highs-sys/Cargo.toml",
    "content": "[package]\nname = \"highs-sys\"\nversion = \"1.11.0\"\nauthors = [\"Ophir LOJKINE\"]\nedition = \"2018\"\ndescription = \"Rust binding for the HiGHS linear programming solver. See http://highs.dev.\"\nlicense = \"MIT\"\nrepository = \"https://github.com/rust-or/highs-sys\"\nkeywords = [\"linear-programming\", \"optimization\", \"math\", \"solver\"]\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\n\n[build-dependencies]\nbindgen = \"0.71.1\"\ncmake = { version = \"0.1.49\", optional = true }\npkg-config = { version = \"0.3.27\", optional = true }\n\n[features]\ndefault = [\"build\", \"highs_release\"]\ndiscover = [\"dep:pkg-config\"]\nbuild = [\"dep:cmake\"]\nhighs_release = []\nninja = []\nlibz = []\n"
  },
  {
    "path": "ext/highs-sys/README.md",
    "content": "# highs-sys\n\n[![docs.rs badge](https://docs.rs/highs-sys/badge.svg)](https://docs.rs/highs-sys)\n[![rust crate](https://img.shields.io/crates/v/highs-sys.svg)](https://lib.rs/highs-sys)\n\nRust binding for the HiGHS linear programming solver.\nSee http://highs.dev.\n\nThis repository contains the source for HiGHS itself as a submodule.\nYou should clone it with \n\n```\ngit clone --recursive git@github.com:rust-or/highs-sys.git\n```\n\nThis crate can either use and link a version of HiGHS that is already installed and available on your system or build and statically link HiGHS itself.\n\n## Usage\n\nAt runtime, HiGHS depends at the minimum on the C++ standard library.\nIt needs to be installed both on your system and any system you want to deploy your application to.\n\nHow you install these depends on your operating system.\n\n#### Debian\n\n```\nsudo apt-get install libstdc++6\n```\n\n(but it is probably already installed on your system)\n\n#### macOS\n\nlibc++ comes by default when installing XCode.\n\n### Building HiGHS\n\nThis crate can either build HiGHS itself and link it statically or [link against an already installed version](#using-a-pre-installed-version-of-highs).\nTo build HiGHS, you need at least a C++ compiler and cmake.\nEnabling additional features may incur additional runtime dependencies.\n\n#### Linux\n\nThese can be easily installed using your distribution's package manager.\nFor example, on Debian: `sudo apt install g++ cmake`.\n\n#### macOS\n\nTo install a C++ compiler, run `xcode-select --install`.\nThe easiest way to obtain cmake is via brew: `brew install cmake`.\n\nIf you enable the `libz` or `ninja` features, you should also install these via brew.\n\n#### Windows\n\nYou need to install [CMake](https://cmake.org/download/) and [Clang (available in LLVM)](https://releases.llvm.org/download.html).\n\nThey are available in [winget](https://winget.run/).\n\n```powershell\nwinget install -e --id Kitware.CMake\nwinget install -e --id LLVM.LLVM\n```\n\nIf you enable the Ninja feature, you can also obtain Ninja from winget:\n\n```powershell\nwinget install -e --id Ninja-build.Ninja\n```\n\nIf desired, libz needs to be installed and made discoverable by adding the `libz-sys` crate as a dependency in your project or manually setting up libz and setting the `ZLIB_ROOT` environment variable.\n\n### Using a pre-installed version of HiGHS\n\nRather than building HiGHS, you can link against a version you have already installed on your system.\nTo do that, install pkg-config on your system and enable the `discover` feature on this crate.\n\nThis will generally cause HiGHS to be linked dynamically, which means it also needs to be installed on the system you deploy to.\n\nNote that at the time of writing, HiGHS is packaged in few package managers, so you may need to build and install HiGHS from source.\n\n#### Feature Flags\n\n`build` (enabled by default): build HiGHS and link it statically\n`highs_release`: set CMake profile to \"Release\" regardless of build profile; only takes effect when `build` is enabled.\n`libz`: enable HiGHS libz linking to enable support for reading 'mps.gz'; only takes effect when `build` is enabled.\n`ninja`: set CMake generator to Ninja; only takes effect when `build` is enabled.\n`discover`: use pkg-config to discover and link against an already installed version of HiGHS; takes precedence over `build` if both are enabled\n\n## Example\n\n```rust\n    // This illustrates the use of Highs_call, the simple C interface to\n// HiGHS. It's designed to solve the general LP problem\n//\n// Min c^Tx subject to L <= Ax <= U; l <= x <= u\n//\n// where A is a matrix with m rows and n columns\n//\n// The scalar n is numcol\n// The scalar m is numrow\n//\n// The vector c is colcost\n// The vector l is collower\n// The vector u is colupper\n// The vector L is rowlower\n// The vector U is rowupper\n//\n// The matrix A is represented in packed column-wise form: only its\n// nonzeros are stored\n//\n// * The number of nonzeros in A is nnz\n//\n// * The row indices of the nonnzeros in A are stored column-by-column\n// in aindex\n//\n// * The values of the nonnzeros in A are stored column-by-column in\n// avalue\n//\n// * The position in aindex/avalue of the index/value of the first\n// nonzero in each column is stored in astart\n//\n// Note that astart[0] must be zero\n//\n// After a successful call to Highs_call, the primal and dual\n// solution, and the simplex basis are returned as follows\n//\n// The vector x is colvalue\n// The vector Ax is rowvalue\n// The vector of dual values for the variables x is coldual\n// The vector of dual values for the variables Ax is rowdual\n// The basic/nonbasic status of the variables x is colbasisstatus\n// The basic/nonbasic status of the variables Ax is rowbasisstatus\n//\n// The status of the solution obtained is modelstatus\n//\n// To solve maximization problems, the values in c must be negated\n//\n// The use of Highs_call is illustrated for the LP\n//\n// Min    f  = 2x_0 + 3x_1\n// s.t.                x_1 <= 6\n//       10 <=  x_0 + 2x_1 <= 14\n//        8 <= 2x_0 +  x_1\n// 0 <= x_0 <= 3; 1 <= x_1\n\nfn main() {\n    let numcol: usize = 2;\n    let numrow: usize = 3;\n    let nnz: usize = 5;\n\n    // Define the column costs, lower bounds and upper bounds\n    let colcost: &mut [f64] = &mut [2.0, 3.0];\n    let collower: &mut [f64] = &mut [0.0, 1.0];\n    let colupper: &mut [f64] = &mut [3.0, 1.0e30];\n    // Define the row lower bounds and upper bounds\n    let rowlower: &mut [f64] = &mut [-1.0e30, 10.0, 8.0];\n    let rowupper: &mut [f64] = &mut [6.0, 14.0, 1.0e30];\n    // Define the constraint matrix column-wise\n    let astart: &mut [c_int] = &mut [0, 2];\n    let aindex: &mut [c_int] = &mut [1, 2, 0, 1, 2];\n    let avalue: &mut [f64] = &mut [1.0, 2.0, 1.0, 2.0, 1.0];\n\n    let colvalue: &mut [f64] = &mut vec![0.; numcol];\n    let coldual: &mut [f64] = &mut vec![0.; numcol];\n    let rowvalue: &mut [f64] = &mut vec![0.; numrow];\n    let rowdual: &mut [f64] = &mut vec![0.; numrow];\n\n    let colbasisstatus: &mut [c_int] = &mut vec![0; numcol];\n    let rowbasisstatus: &mut [c_int] = &mut vec![0; numrow];\n\n    let modelstatus: &mut c_int = &mut 0;\n\n    let status: c_int = unsafe {\n        Highs_call(\n            numcol.try_into().unwrap(),\n            numrow.try_into().unwrap(),\n            nnz.try_into().unwrap(),\n            colcost.as_mut_ptr(),\n            collower.as_mut_ptr(),\n            colupper.as_mut_ptr(),\n            rowlower.as_mut_ptr(),\n            rowupper.as_mut_ptr(),\n            astart.as_mut_ptr(),\n            aindex.as_mut_ptr(),\n            avalue.as_mut_ptr(),\n            colvalue.as_mut_ptr(),\n            coldual.as_mut_ptr(),\n            rowvalue.as_mut_ptr(),\n            rowdual.as_mut_ptr(),\n            colbasisstatus.as_mut_ptr(),\n            rowbasisstatus.as_mut_ptr(),\n            modelstatus\n        )\n    };\n\n    assert_eq!(status, 0);\n    // The solution is x_0 = 2 and x_1 = 4\n    assert_eq!(colvalue, &[2., 4.]);\n}\n```\n\nFor more examples, have a look at [`tests`](https://github.com/lovasoa/highs-sys/blob/master/tests).\n"
  },
  {
    "path": "ext/highs-sys/build.rs",
    "content": "use std::env;\n\n/*\nuse std::path::Path;\n\nfn generate_bindings<'a>(include_paths: impl Iterator<Item = &'a Path>) {\n    // The bindgen::Builder is the main entry point\n    // to bindgen, and lets you build up options for\n    // the resulting bindings.\n    let builder = include_paths.fold(bindgen::Builder::default(), |builder, path| {\n        builder.clang_arg(format!(\"-I{}\", path.to_string_lossy()))\n    });\n    let c_bindings = builder\n        // The input header we would like to generate bindings for.\n        // This is a trivial wrapper header so that the HiGHS headers\n        // can be discovered from the include path.\n        .header(\"wrapper.h\")\n        // Tell cargo to invalidate the built crate whenever any of the\n        // included header files changed.\n        .parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))\n        .allowlist_function(\"^Highs.*\")\n        // Finish the builder and generate the bindings.\n        .generate()\n        // Unwrap the Result and panic on failure.\n        .expect(\"Unable to generate bindings\");\n\n    // Write the bindings to the $OUT_DIR/bindings.rs file.\n    c_bindings\n        .write_to_file(\"src/c_bindings.rs\")\n        .expect(\"Couldn't write bindings!\");\n}\n*/\n\n#[cfg(feature = \"build\")]\nfn build() -> bool {\n    use cmake::Config;\n    let mut dst = Config::new(\"../HiGHS\");\n    try_use_sccache(&mut dst);\n    try_use_ninja(&mut dst);\n\n    // Avoid using downstream project's profile setting for HiGHS build.\n    if cfg!(feature = \"highs_release\") {\n        dst.profile(\"Release\");\n    }\n\n    let dst = dst\n        .define(\"FAST_BUILD\", \"ON\")\n        .define(\"BUILD_SHARED_LIBS\", \"OFF\")\n        .define(\"CMAKE_MSVC_RUNTIME_LIBRARY\", \"MultiThreaded\")\n        .define(\"ZLIB\", if cfg!(feature = \"libz\") { \"ON\" } else { \"OFF\" })\n        .build();\n\n    //let include_path = dst.join(\"include\").join(\"highs\");\n    //generate_bindings(Some(include_path.as_path()).into_iter());\n\n    println!(\"cargo:rustc-link-search=native={}/lib\", dst.display());\n    println!(\"cargo:rustc-link-search=native={}/lib64\", dst.display());\n    println!(\"cargo:rustc-link-lib=static=highs\");\n\n    if cfg!(feature = \"libz\") {\n        println!(\"cargo:rustc-link-lib=z\");\n    }\n\n    let target = env::var(\"TARGET\").unwrap();\n    let apple = target.contains(\"apple\");\n    let linux = target.contains(\"linux\");\n    let mingw = target.contains(\"pc-windows-gnu\");\n    if apple {\n        println!(\"cargo:rustc-link-lib=dylib=c++\");\n    } else if linux || mingw {\n        println!(\"cargo:rustc-link-lib=dylib=stdc++\");\n    }\n    println!(\"cargo:rerun-if-changed=../HiGHS/highs/interfaces/highs_c_api.h\");\n\n    true\n}\n\n// https://github.com/mozilla/sccache/blob/main/README.md#usage\nfn try_use_sccache(cmake: &mut cmake::Config) {\n    if let Ok(sccache) = std::env::var(\"SCCACHE_PATH\") {\n        cmake.define(\"CMAKE_CXX_COMPILER_LAUNCHER\", &*sccache);\n        cmake.define(\"CMAKE_C_COMPILER_LAUNCHER\", &*sccache);\n        match std::env::var_os(\"CARGO_CFG_TARGET_OS\") {\n            Some(os) if os == \"windows\" => {\n                cmake.define(\n                    \"CMAKE_MSVC_DEBUG_INFORMATION_FORMAT\",\n                    \"$<$<CONFIG:Debug,RelWithDebInfo>:Embedded>\",\n                );\n                cmake.define(\"CMAKE_POLICY_CMP0141\", \"NEW\");\n            }\n            _ => {}\n        }\n    }\n}\n\nfn try_use_ninja(cmake: &mut cmake::Config) {\n    let mut cmd = std::process::Command::new(\"ninja\");\n    cmd.arg(\"--version\");\n    if let Ok(status) = cmd.status() {\n        if status.success() {\n            cmake.generator(\"Ninja\");\n        }\n    }\n}\n\n#[cfg(not(feature = \"build\"))]\nfn build() -> bool {\n    false\n}\n\n#[cfg(feature = \"discover\")]\nfn discover() -> bool {\n    let lib = match pkg_config::Config::new()\n        .atleast_version(\"1.5.0\")\n        .probe(\"highs\")\n    {\n        Ok(lib) => lib,\n        Err(_e) => return false,\n    };\n\n    generate_bindings(lib.include_paths.iter().map(|p| p.as_path()));\n\n    true\n}\n\n#[cfg(not(feature = \"discover\"))]\nfn discover() -> bool {\n    false\n}\n\nfn main() {\n    if cfg!(all(\n        any(\n            feature = \"highs_release\",\n            feature = \"libz\",\n            feature = \"ninja\"\n        ),\n        not(feature = \"build\")\n    )) {\n        panic!(\"You have enabled features that control how HiGHS is built, but have not enabled the 'build' feature.\\n\\\n               Thus, your features will never have any effect. Please enable the 'build' feature on highs-sys if you want to build HiGHS or disable the 'libz', 'ninja' and 'highs_release' features.\");\n    }\n\n    if !discover() && !build() {\n        panic!(\"Could neither discover nor build HiGHS\");\n    }\n}\n"
  },
  {
    "path": "ext/highs-sys/install-dependencies.sh",
    "content": "set -x\nif test -x \"$(which apt-get)\"; then\n  sudo apt-get install libstdc++6 cmake\nelif test -x \"$(which dnf)\"; then\n  sudo dnf install libstdc++ cmake\nelif test -x \"$(which brew)\"; then\n  brew install cmake\nelse\n  echo \"system not supported\"\n  exit 1\nfi\n"
  },
  {
    "path": "ext/highs-sys/src/c_bindings.rs",
    "content": "/* automatically generated by rust-bindgen 0.71.1 */\n\npub type HighsInt = ::std::os::raw::c_int;\n#[doc = \" Struct to handle callback output data\\n\"]\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct HighsCallbackDataOut {\n    pub cbdata: *mut ::std::os::raw::c_void,\n    pub log_type: ::std::os::raw::c_int,\n    pub running_time: f64,\n    pub simplex_iteration_count: HighsInt,\n    pub ipm_iteration_count: HighsInt,\n    pub pdlp_iteration_count: HighsInt,\n    pub objective_function_value: f64,\n    pub mip_node_count: i64,\n    pub mip_total_lp_iterations: i64,\n    pub mip_primal_bound: f64,\n    pub mip_dual_bound: f64,\n    pub mip_gap: f64,\n    pub mip_solution: *mut f64,\n    pub mip_solution_size: HighsInt,\n    pub cutpool_num_col: HighsInt,\n    pub cutpool_num_cut: HighsInt,\n    pub cutpool_num_nz: HighsInt,\n    pub cutpool_start: *mut HighsInt,\n    pub cutpool_index: *mut HighsInt,\n    pub cutpool_value: *mut f64,\n    pub cutpool_lower: *mut f64,\n    pub cutpool_upper: *mut f64,\n    pub user_solution_callback_origin: HighsInt,\n}\n#[allow(clippy::unnecessary_operation, clippy::identity_op)]\nconst _: () = {\n    [\"Size of HighsCallbackDataOut\"][::std::mem::size_of::<HighsCallbackDataOut>() - 160usize];\n    [\"Alignment of HighsCallbackDataOut\"][::std::mem::align_of::<HighsCallbackDataOut>() - 8usize];\n    [\"Offset of field: HighsCallbackDataOut::cbdata\"]\n        [::std::mem::offset_of!(HighsCallbackDataOut, cbdata) - 0usize];\n    [\"Offset of field: HighsCallbackDataOut::log_type\"]\n        [::std::mem::offset_of!(HighsCallbackDataOut, log_type) - 8usize];\n    [\"Offset of field: HighsCallbackDataOut::running_time\"]\n        [::std::mem::offset_of!(HighsCallbackDataOut, running_time) - 16usize];\n    [\"Offset of field: HighsCallbackDataOut::simplex_iteration_count\"]\n        [::std::mem::offset_of!(HighsCallbackDataOut, simplex_iteration_count) - 24usize];\n    [\"Offset of field: HighsCallbackDataOut::ipm_iteration_count\"]\n        [::std::mem::offset_of!(HighsCallbackDataOut, ipm_iteration_count) - 28usize];\n    [\"Offset of field: HighsCallbackDataOut::pdlp_iteration_count\"]\n        [::std::mem::offset_of!(HighsCallbackDataOut, pdlp_iteration_count) - 32usize];\n    [\"Offset of field: HighsCallbackDataOut::objective_function_value\"]\n        [::std::mem::offset_of!(HighsCallbackDataOut, objective_function_value) - 40usize];\n    [\"Offset of field: HighsCallbackDataOut::mip_node_count\"]\n        [::std::mem::offset_of!(HighsCallbackDataOut, mip_node_count) - 48usize];\n    [\"Offset of field: HighsCallbackDataOut::mip_total_lp_iterations\"]\n        [::std::mem::offset_of!(HighsCallbackDataOut, mip_total_lp_iterations) - 56usize];\n    [\"Offset of field: HighsCallbackDataOut::mip_primal_bound\"]\n        [::std::mem::offset_of!(HighsCallbackDataOut, mip_primal_bound) - 64usize];\n    [\"Offset of field: HighsCallbackDataOut::mip_dual_bound\"]\n        [::std::mem::offset_of!(HighsCallbackDataOut, mip_dual_bound) - 72usize];\n    [\"Offset of field: HighsCallbackDataOut::mip_gap\"]\n        [::std::mem::offset_of!(HighsCallbackDataOut, mip_gap) - 80usize];\n    [\"Offset of field: HighsCallbackDataOut::mip_solution\"]\n        [::std::mem::offset_of!(HighsCallbackDataOut, mip_solution) - 88usize];\n    [\"Offset of field: HighsCallbackDataOut::mip_solution_size\"]\n        [::std::mem::offset_of!(HighsCallbackDataOut, mip_solution_size) - 96usize];\n    [\"Offset of field: HighsCallbackDataOut::cutpool_num_col\"]\n        [::std::mem::offset_of!(HighsCallbackDataOut, cutpool_num_col) - 100usize];\n    [\"Offset of field: HighsCallbackDataOut::cutpool_num_cut\"]\n        [::std::mem::offset_of!(HighsCallbackDataOut, cutpool_num_cut) - 104usize];\n    [\"Offset of field: HighsCallbackDataOut::cutpool_num_nz\"]\n        [::std::mem::offset_of!(HighsCallbackDataOut, cutpool_num_nz) - 108usize];\n    [\"Offset of field: HighsCallbackDataOut::cutpool_start\"]\n        [::std::mem::offset_of!(HighsCallbackDataOut, cutpool_start) - 112usize];\n    [\"Offset of field: HighsCallbackDataOut::cutpool_index\"]\n        [::std::mem::offset_of!(HighsCallbackDataOut, cutpool_index) - 120usize];\n    [\"Offset of field: HighsCallbackDataOut::cutpool_value\"]\n        [::std::mem::offset_of!(HighsCallbackDataOut, cutpool_value) - 128usize];\n    [\"Offset of field: HighsCallbackDataOut::cutpool_lower\"]\n        [::std::mem::offset_of!(HighsCallbackDataOut, cutpool_lower) - 136usize];\n    [\"Offset of field: HighsCallbackDataOut::cutpool_upper\"]\n        [::std::mem::offset_of!(HighsCallbackDataOut, cutpool_upper) - 144usize];\n    [\"Offset of field: HighsCallbackDataOut::user_solution_callback_origin\"]\n        [::std::mem::offset_of!(HighsCallbackDataOut, user_solution_callback_origin) - 152usize];\n};\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct HighsCallbackDataIn {\n    pub user_interrupt: ::std::os::raw::c_int,\n    pub user_solution: *mut f64,\n    pub cbdata: *mut ::std::os::raw::c_void,\n    pub user_has_solution: ::std::os::raw::c_int,\n    pub user_solution_size: HighsInt,\n}\n#[allow(clippy::unnecessary_operation, clippy::identity_op)]\nconst _: () = {\n    [\"Size of HighsCallbackDataIn\"][::std::mem::size_of::<HighsCallbackDataIn>() - 32usize];\n    [\"Alignment of HighsCallbackDataIn\"][::std::mem::align_of::<HighsCallbackDataIn>() - 8usize];\n    [\"Offset of field: HighsCallbackDataIn::user_interrupt\"]\n        [::std::mem::offset_of!(HighsCallbackDataIn, user_interrupt) - 0usize];\n    [\"Offset of field: HighsCallbackDataIn::user_solution\"]\n        [::std::mem::offset_of!(HighsCallbackDataIn, user_solution) - 8usize];\n    [\"Offset of field: HighsCallbackDataIn::cbdata\"]\n        [::std::mem::offset_of!(HighsCallbackDataIn, cbdata) - 16usize];\n    [\"Offset of field: HighsCallbackDataIn::user_has_solution\"]\n        [::std::mem::offset_of!(HighsCallbackDataIn, user_has_solution) - 24usize];\n    [\"Offset of field: HighsCallbackDataIn::user_solution_size\"]\n        [::std::mem::offset_of!(HighsCallbackDataIn, user_solution_size) - 28usize];\n};\npub type HighsCCallbackType = ::std::option::Option<\n    unsafe extern \"C\" fn(\n        arg1: ::std::os::raw::c_int,\n        arg2: *const ::std::os::raw::c_char,\n        arg3: *const HighsCallbackDataOut,\n        arg4: *mut HighsCallbackDataIn,\n        arg5: *mut ::std::os::raw::c_void,\n    ),\n>;\nunsafe extern \"C\" {\n    #[doc = \" Formulate and solve a linear program using HiGHS.\\n\\n @param num_col   The number of columns.\\n @param num_row   The number of rows.\\n @param num_nz    The number of nonzeros in the constraint matrix.\\n @param a_format  The format of the constraint matrix as a\\n                  `kHighsMatrixFormat` constant.\\n @param sense     The optimization sense as a `kHighsObjSense` constant.\\n @param offset    The objective constant.\\n @param col_cost  An array of length [num_col] with the column costs.\\n @param col_lower An array of length [num_col] with the column lower bounds.\\n @param col_upper An array of length [num_col] with the column upper bounds.\\n @param row_lower An array of length [num_row] with the row lower bounds.\\n @param row_upper An array of length [num_row] with the row upper bounds.\\n @param a_start   The constraint matrix is provided to HiGHS in compressed\\n                  sparse column form (if `a_format` is\\n                  `kHighsMatrixFormatColwise`, otherwise compressed sparse row\\n                  form). The sparse matrix consists of three arrays,\\n                  `a_start`, `a_index`, and `a_value`. `a_start` is an array\\n                  of length [num_col] containing the starting index of each\\n                  column in `a_index`. If `a_format` is\\n                  `kHighsMatrixFormatRowwise` the array is of length [num_row]\\n                  corresponding to each row.\\n @param a_index   An array of length [num_nz] with indices of matrix entries.\\n @param a_value   An array of length [num_nz] with values of matrix entries.\\n\\n @param col_value      An array of length [num_col], to be filled with the\\n                       primal column solution.\\n @param col_dual       An array of length [num_col], to be filled with the\\n                       dual column solution.\\n @param row_value      An array of length [num_row], to be filled with the\\n                       primal row solution.\\n @param row_dual       An array of length [num_row], to be filled with the\\n                       dual row solution.\\n @param col_basis_status  An array of length [num_col], to be filled with the\\n                          basis status of the columns in the form of a\\n                          `kHighsBasisStatus` constant.\\n @param row_basis_status  An array of length [num_row], to be filled with the\\n                          basis status of the rows in the form of a\\n                          `kHighsBasisStatus` constant.\\n @param model_status      The location in which to place the termination\\n                          status of the model after the solve in the form of a\\n                          `kHighsModelStatus` constant.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_lpCall(\n        num_col: HighsInt,\n        num_row: HighsInt,\n        num_nz: HighsInt,\n        a_format: HighsInt,\n        sense: HighsInt,\n        offset: f64,\n        col_cost: *const f64,\n        col_lower: *const f64,\n        col_upper: *const f64,\n        row_lower: *const f64,\n        row_upper: *const f64,\n        a_start: *const HighsInt,\n        a_index: *const HighsInt,\n        a_value: *const f64,\n        col_value: *mut f64,\n        col_dual: *mut f64,\n        row_value: *mut f64,\n        row_dual: *mut f64,\n        col_basis_status: *mut HighsInt,\n        row_basis_status: *mut HighsInt,\n        model_status: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Formulate and solve a mixed-integer linear program using HiGHS.\\n\\n The signature of this method is identical to `Highs_lpCall`, except that it\\n has an additional `integrality` argument, and that it is missing the\\n `col_dual`, `row_dual`, `col_basis_status` and `row_basis_status` arguments.\\n\\n @param integrality   An array of length [num_col], containing a\\n                      `kHighsVarType` constant for each column.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_mipCall(\n        num_col: HighsInt,\n        num_row: HighsInt,\n        num_nz: HighsInt,\n        a_format: HighsInt,\n        sense: HighsInt,\n        offset: f64,\n        col_cost: *const f64,\n        col_lower: *const f64,\n        col_upper: *const f64,\n        row_lower: *const f64,\n        row_upper: *const f64,\n        a_start: *const HighsInt,\n        a_index: *const HighsInt,\n        a_value: *const f64,\n        integrality: *const HighsInt,\n        col_value: *mut f64,\n        row_value: *mut f64,\n        model_status: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Formulate and solve a quadratic program using HiGHS.\\n\\n The signature of this method is identical to `Highs_lpCall`, except that it\\n has additional arguments for specifying the Hessian matrix.\\n\\n @param q_num_nz  The number of nonzeros in the Hessian matrix.\\n @param q_format  The format of the Hessian matrix in the form of a\\n                  `kHighsHessianStatus` constant. If q_num_nz > 0, this must\\n                  be `kHighsHessianFormatTriangular`.\\n @param q_start   The Hessian matrix is provided to HiGHS as the lower\\n                  triangular component in compressed sparse column form\\n                  (or, equivalently, as the upper triangular component\\n                  in compressed sparse row form). The sparse matrix consists\\n                  of three arrays, `q_start`, `q_index`, and `q_value`.\\n                  `q_start` is an array of length [num_col].\\n @param q_index   An array of length [q_num_nz] with indices of matrix\\n                  entries.\\n @param q_value   An array of length [q_num_nz] with values of matrix entries.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_qpCall(\n        num_col: HighsInt,\n        num_row: HighsInt,\n        num_nz: HighsInt,\n        q_num_nz: HighsInt,\n        a_format: HighsInt,\n        q_format: HighsInt,\n        sense: HighsInt,\n        offset: f64,\n        col_cost: *const f64,\n        col_lower: *const f64,\n        col_upper: *const f64,\n        row_lower: *const f64,\n        row_upper: *const f64,\n        a_start: *const HighsInt,\n        a_index: *const HighsInt,\n        a_value: *const f64,\n        q_start: *const HighsInt,\n        q_index: *const HighsInt,\n        q_value: *const f64,\n        col_value: *mut f64,\n        col_dual: *mut f64,\n        row_value: *mut f64,\n        row_dual: *mut f64,\n        col_basis_status: *mut HighsInt,\n        row_basis_status: *mut HighsInt,\n        model_status: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Create a Highs instance and return the reference.\\n\\n Call `Highs_destroy` on the returned reference to clean up allocated memory.\\n\\n @returns A pointer to the Highs instance.\"]\n    pub fn Highs_create() -> *mut ::std::os::raw::c_void;\n}\nunsafe extern \"C\" {\n    #[doc = \" Destroy the model `highs` created by `Highs_create` and free all\\n corresponding memory. Future calls using `highs` are not allowed.\\n\\n To empty a model without invalidating `highs`, see `Highs_clearModel`.\\n\\n @param highs     A pointer to the Highs instance.\"]\n    pub fn Highs_destroy(highs: *mut ::std::os::raw::c_void);\n}\nunsafe extern \"C\" {\n    #[doc = \" Return the HiGHS version number as a string of the form \\\"vX.Y.Z\\\".\\n\\n @returns The HiGHS version as a `char*`.\"]\n    pub fn Highs_version() -> *const ::std::os::raw::c_char;\n}\nunsafe extern \"C\" {\n    #[doc = \" Return the HiGHS major version number.\\n\\n @returns The HiGHS major version number.\"]\n    pub fn Highs_versionMajor() -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Return the HiGHS minor version number.\\n\\n @returns The HiGHS minor version number.\"]\n    pub fn Highs_versionMinor() -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Return the HiGHS patch version number.\\n\\n @returns The HiGHS patch version number.\"]\n    pub fn Highs_versionPatch() -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Return the HiGHS githash.\\n\\n @returns The HiGHS githash.\"]\n    pub fn Highs_githash() -> *const ::std::os::raw::c_char;\n}\nunsafe extern \"C\" {\n    #[doc = \" Read a model from `filename` into `highs`.\\n\\n @param highs     A pointer to the Highs instance.\\n @param filename  The filename to read.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_readModel(\n        highs: *mut ::std::os::raw::c_void,\n        filename: *const ::std::os::raw::c_char,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Write the model in `highs` to `filename`.\\n\\n @param highs     A pointer to the Highs instance.\\n @param filename  The filename to write.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_writeModel(\n        highs: *mut ::std::os::raw::c_void,\n        filename: *const ::std::os::raw::c_char,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Write the presolved model in `highs` to `filename`.\\n\\n @param highs     A pointer to the Highs instance.\\n @param filename  The filename to write.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_writePresolvedModel(\n        highs: *mut ::std::os::raw::c_void,\n        filename: *const ::std::os::raw::c_char,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Reset the options and then call `clearModel`.\\n\\n See `Highs_destroy` to free all associated memory.\\n\\n @param highs     A pointer to the Highs instance.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_clear(highs: *mut ::std::os::raw::c_void) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Remove all variables and constraints from the model `highs`, but do not\\n invalidate the pointer `highs`. Future calls (for example, adding new\\n variables and constraints) are allowed.\\n\\n @param highs     A pointer to the Highs instance.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_clearModel(highs: *mut ::std::os::raw::c_void) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Clear all solution data associated with the model.\\n\\n See `Highs_destroy` to clear the model and free all associated memory.\\n\\n @param highs     A pointer to the Highs instance.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_clearSolver(highs: *mut ::std::os::raw::c_void) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Presolve a model.\\n\\n @param highs     A pointer to the Highs instance.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_presolve(highs: *mut ::std::os::raw::c_void) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Optimize a model. The algorithm used by HiGHS depends on the options that\\n have been set.\\n\\n @param highs     A pointer to the Highs instance.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_run(highs: *mut ::std::os::raw::c_void) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Postsolve a model using a primal (and possibly dual) solution.\\n\\n @param highs       A pointer to the Highs instance.\\n @param col_value   An array of length [num_col] with the column solution\\n                    values.\\n @param col_dual    An array of length [num_col] with the column dual\\n                    values, or a null pointer if not known.\\n @param row_dual    An array of length [num_row] with the row dual values,\\n                    or a null pointer if not known.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_postsolve(\n        highs: *mut ::std::os::raw::c_void,\n        col_value: *const f64,\n        col_dual: *const f64,\n        row_dual: *const f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Write the solution information (including dual and basis status, if\\n available) to a file.\\n\\n See also: `Highs_writeSolutionPretty`.\\n\\n @param highs     A pointer to the Highs instance.\\n @param filename  The name of the file to write the results to.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_writeSolution(\n        highs: *const ::std::os::raw::c_void,\n        filename: *const ::std::os::raw::c_char,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Write the solution information (including dual and basis status, if\\n available) to a file in a human-readable format.\\n\\n The method identical to `Highs_writeSolution`, except that the\\n printout is in a human-readable format.\\n\\n @param highs     A pointer to the Highs instance.\\n @param filename  The name of the file to write the results to.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_writeSolutionPretty(\n        highs: *const ::std::os::raw::c_void,\n        filename: *const ::std::os::raw::c_char,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Pass a linear program (LP) to HiGHS in a single function call.\\n\\n The signature of this function is identical to `Highs_passModel`, without the\\n arguments for passing the Hessian matrix of a quadratic program and the\\n integrality vector.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_passLp(\n        highs: *mut ::std::os::raw::c_void,\n        num_col: HighsInt,\n        num_row: HighsInt,\n        num_nz: HighsInt,\n        a_format: HighsInt,\n        sense: HighsInt,\n        offset: f64,\n        col_cost: *const f64,\n        col_lower: *const f64,\n        col_upper: *const f64,\n        row_lower: *const f64,\n        row_upper: *const f64,\n        a_start: *const HighsInt,\n        a_index: *const HighsInt,\n        a_value: *const f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Pass a mixed-integer linear program (MILP) to HiGHS in a single function\\n call.\\n\\n The signature of function is identical to `Highs_passModel`, without the\\n arguments for passing the Hessian matrix of a quadratic program.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_passMip(\n        highs: *mut ::std::os::raw::c_void,\n        num_col: HighsInt,\n        num_row: HighsInt,\n        num_nz: HighsInt,\n        a_format: HighsInt,\n        sense: HighsInt,\n        offset: f64,\n        col_cost: *const f64,\n        col_lower: *const f64,\n        col_upper: *const f64,\n        row_lower: *const f64,\n        row_upper: *const f64,\n        a_start: *const HighsInt,\n        a_index: *const HighsInt,\n        a_value: *const f64,\n        integrality: *const HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Pass a model to HiGHS in a single function call. This is faster than\\n constructing the model using `Highs_addRow` and `Highs_addCol`.\\n\\n @param highs       A pointer to the Highs instance.\\n @param num_col     The number of columns.\\n @param num_row     The number of rows.\\n @param num_nz      The number of elements in the constraint matrix.\\n @param q_num_nz    The number of elements in the Hessian matrix.\\n @param a_format    The format of the constraint matrix to use in the form of\\n                    a `kHighsMatrixFormat` constant.\\n @param q_format    The format of the Hessian matrix to use in the form of a\\n                    `kHighsHessianFormat` constant.\\n @param sense       The optimization sense in the form of a `kHighsObjSense`\\n                    constant.\\n @param offset      The constant term in the objective function.\\n @param col_cost    An array of length [num_col] with the objective\\n                    coefficients.\\n @param col_lower   An array of length [num_col] with the lower column bounds.\\n @param col_upper   An array of length [num_col] with the upper column bounds.\\n @param row_lower   An array of length [num_row] with the upper row bounds.\\n @param row_upper   An array of length [num_row] with the upper row bounds.\\n @param a_start     The constraint matrix is provided to HiGHS in compressed\\n                    sparse column form (if `a_format` is\\n                    `kHighsMatrixFormatColwise`, otherwise compressed sparse\\n                    row form). The sparse matrix consists of three arrays,\\n                    `a_start`, `a_index`, and `a_value`. `a_start` is an array\\n                    of length [num_col] containing the starting index of each\\n                    column in `a_index`. If `a_format` is\\n                    `kHighsMatrixFormatRowwise` the array is of length\\n                    [num_row] corresponding to each row.\\n @param a_index     An array of length [num_nz] with indices of matrix\\n                    entries.\\n @param a_value     An array of length [num_nz] with values of matrix entries.\\n @param q_start     The Hessian matrix is provided to HiGHS as the lower\\n                    triangular component in compressed sparse column form\\n                    (or, equivalently, as the upper triangular component\\n                    in compressed sparse row form). The sparse matrix consists\\n                    of three arrays, `q_start`, `q_index`, and `q_value`.\\n                    `q_start` is an array of length [num_col]. If the model\\n                    is linear, pass NULL.\\n @param q_index     An array of length [q_num_nz] with indices of matrix\\n                    entries. If the model is linear, pass NULL.\\n @param q_value     An array of length [q_num_nz] with values of matrix\\n                     entries. If the model is linear, pass NULL.\\n @param integrality An array of length [num_col] containing a `kHighsVarType`\\n                    constant for each column.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_passModel(\n        highs: *mut ::std::os::raw::c_void,\n        num_col: HighsInt,\n        num_row: HighsInt,\n        num_nz: HighsInt,\n        q_num_nz: HighsInt,\n        a_format: HighsInt,\n        q_format: HighsInt,\n        sense: HighsInt,\n        offset: f64,\n        col_cost: *const f64,\n        col_lower: *const f64,\n        col_upper: *const f64,\n        row_lower: *const f64,\n        row_upper: *const f64,\n        a_start: *const HighsInt,\n        a_index: *const HighsInt,\n        a_value: *const f64,\n        q_start: *const HighsInt,\n        q_index: *const HighsInt,\n        q_value: *const f64,\n        integrality: *const HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Set the Hessian matrix for a quadratic objective.\\n\\n @param highs     A pointer to the Highs instance.\\n @param dim       The dimension of the Hessian matrix. Should be [num_col].\\n @param num_nz    The number of non-zero elements in the Hessian matrix.\\n @param format    The format of the Hessian matrix as a `kHighsHessianFormat`\\n                  constant. This must be `kHighsHessianFormatTriangular`.\\n @param start     The Hessian matrix is provided to HiGHS as the lower\\n                  triangular component in compressed sparse column form\\n                  (or, equivalently, as the upper triangular component\\n                  in compressed sparse row form), using `q_start`, `q_index`,\\n                  and `q_value`.The Hessian matrix is provided to HiGHS as the\\n                  lower triangular component in compressed sparse column form.\\n                  The sparse matrix consists of three arrays, `start`,\\n                  `index`, and `value`. `start` is an array of length\\n                  [num_col] containing the starting index of each column in\\n                  `index`.\\n @param index     An array of length [num_nz] with indices of matrix entries.\\n @param value     An array of length [num_nz] with values of matrix entries.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_passHessian(\n        highs: *mut ::std::os::raw::c_void,\n        dim: HighsInt,\n        num_nz: HighsInt,\n        format: HighsInt,\n        start: *const HighsInt,\n        index: *const HighsInt,\n        value: *const f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Passes multiple linear objective data to HiGHS, clearing any such\\n data already in HiGHS\\n\\n @param highs         A pointer to the Highs instance.\\n @param weight        A pointer to the weights of the linear objective, with\\n                      its positive/negative sign determining whether it is\\n                      minimized or maximized during lexicographic optimization\\n @param offset        A pointer to the objective offsets\\n @param coefficients  A pointer to the objective coefficients\\n @param abs_tolerance A pointer to the absolute tolerances used when\\n                      constructing objective constraints during lexicographic\\n                      optimization\\n @param rel_tolerance A pointer to the relative tolerances used when\\n                      constructing objective constraints during lexicographic\\n                      optimization\\n @param priority      A pointer to the priorities of the objectives during\\n                      lexicographic optimization\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_passLinearObjectives(\n        highs: *const ::std::os::raw::c_void,\n        num_linear_objective: HighsInt,\n        weight: *const f64,\n        offset: *const f64,\n        coefficients: *const f64,\n        abs_tolerance: *const f64,\n        rel_tolerance: *const f64,\n        priority: *const HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Adds linear objective data to HiGHS\\n\\n @param highs         A pointer to the Highs instance.\\n @param weight        The weight of the linear objective, with its\\n                      positive/negative sign determining whether it is\\n                      minimized or maximized during lexicographic\\n                      optimization\\n @param offset        The objective offset\\n @param coefficients  A pointer to the objective coefficients\\n @param abs_tolerance The absolute tolerance used when constructing an\\n                      objective constraint during lexicographic optimization\\n @param rel_tolerance The relative tolerance used when constructing an\\n                      objective constraint during lexicographic optimization\\n @param priority      The priority of this objective during lexicographic\\n                      optimization\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_addLinearObjective(\n        highs: *const ::std::os::raw::c_void,\n        weight: f64,\n        offset: f64,\n        coefficients: *const f64,\n        abs_tolerance: f64,\n        rel_tolerance: f64,\n        priority: HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Clears any multiple linear objective data in HiGHS\\n\\n @param highs A pointer to the Highs instance.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_clearLinearObjectives(highs: *const ::std::os::raw::c_void) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Pass the name of a row.\\n\\n @param highs A pointer to the Highs instance.\\n @param row   The row for which the name is supplied.\\n @param name  The name of the row.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_passRowName(\n        highs: *const ::std::os::raw::c_void,\n        row: HighsInt,\n        name: *const ::std::os::raw::c_char,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Pass the name of a column.\\n\\n @param highs A pointer to the Highs instance.\\n @param col   The column for which the name is supplied.\\n @param name  The name of the column.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_passColName(\n        highs: *const ::std::os::raw::c_void,\n        col: HighsInt,\n        name: *const ::std::os::raw::c_char,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Pass the name of the model.\\n\\n @param highs A pointer to the Highs instance.\\n @param name  The name of the model.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_passModelName(\n        highs: *const ::std::os::raw::c_void,\n        name: *const ::std::os::raw::c_char,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Read the option values from file.\\n\\n @param highs     A pointer to the Highs instance.\\n @param filename  The filename from which to read the option values.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_readOptions(\n        highs: *const ::std::os::raw::c_void,\n        filename: *const ::std::os::raw::c_char,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Set a boolean-valued option.\\n\\n @param highs     A pointer to the Highs instance.\\n @param option    The name of the option.\\n @param value     The new value of the option.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_setBoolOptionValue(\n        highs: *mut ::std::os::raw::c_void,\n        option: *const ::std::os::raw::c_char,\n        value: HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Set an int-valued option.\\n\\n @param highs     A pointer to the Highs instance.\\n @param option    The name of the option.\\n @param value     The new value of the option.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_setIntOptionValue(\n        highs: *mut ::std::os::raw::c_void,\n        option: *const ::std::os::raw::c_char,\n        value: HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Set a double-valued option.\\n\\n @param highs     A pointer to the Highs instance.\\n @param option    The name of the option.\\n @param value     The new value of the option.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_setDoubleOptionValue(\n        highs: *mut ::std::os::raw::c_void,\n        option: *const ::std::os::raw::c_char,\n        value: f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Set a string-valued option.\\n\\n @param highs     A pointer to the Highs instance.\\n @param option    The name of the option.\\n @param value     The new value of the option.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_setStringOptionValue(\n        highs: *mut ::std::os::raw::c_void,\n        option: *const ::std::os::raw::c_char,\n        value: *const ::std::os::raw::c_char,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get a boolean-valued option.\\n\\n @param highs     A pointer to the Highs instance.\\n @param option    The name of the option.\\n @param value     The location in which the current value of the option should\\n                  be placed.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getBoolOptionValue(\n        highs: *const ::std::os::raw::c_void,\n        option: *const ::std::os::raw::c_char,\n        value: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get an int-valued option.\\n\\n @param highs     A pointer to the Highs instance.\\n @param option    The name of the option.\\n @param value     The location in which the current value of the option should\\n                  be placed.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getIntOptionValue(\n        highs: *const ::std::os::raw::c_void,\n        option: *const ::std::os::raw::c_char,\n        value: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get a double-valued option.\\n\\n @param highs     A pointer to the Highs instance.\\n @param option    The name of the option.\\n @param value     The location in which the current value of the option should\\n                  be placed.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getDoubleOptionValue(\n        highs: *const ::std::os::raw::c_void,\n        option: *const ::std::os::raw::c_char,\n        value: *mut f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get a string-valued option.\\n\\n @param highs     A pointer to the Highs instance.\\n @param option    The name of the option.\\n @param value     A pointer to allocated memory (of at least\\n                  `kMaximumStringLength`) to store the current value of the\\n                  option.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getStringOptionValue(\n        highs: *const ::std::os::raw::c_void,\n        option: *const ::std::os::raw::c_char,\n        value: *mut ::std::os::raw::c_char,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get the type expected by an option.\\n\\n @param highs     A pointer to the Highs instance.\\n @param option    The name of the option.\\n @param type      A HighsInt in which the corresponding `kHighsOptionType`\\n                  constant should be placed.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getOptionType(\n        highs: *const ::std::os::raw::c_void,\n        option: *const ::std::os::raw::c_char,\n        type_: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Reset all options to their default value.\\n\\n @param highs     A pointer to the Highs instance.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_resetOptions(highs: *mut ::std::os::raw::c_void) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Write the current options to file.\\n\\n @param highs     A pointer to the Highs instance.\\n @param filename  The filename to write the options to.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_writeOptions(\n        highs: *const ::std::os::raw::c_void,\n        filename: *const ::std::os::raw::c_char,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Write the value of non-default options to file.\\n\\n This is similar to `Highs_writeOptions`, except only options with\\n non-default value are written to `filename`.\\n\\n @param highs     A pointer to the Highs instance.\\n @param filename  The filename to write the options to.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_writeOptionsDeviations(\n        highs: *const ::std::os::raw::c_void,\n        filename: *const ::std::os::raw::c_char,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Return the number of options\\n\\n @param highs     A pointer to the Highs instance.\"]\n    pub fn Highs_getNumOptions(highs: *const ::std::os::raw::c_void) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get the name of an option identified by index\\n\\n @param highs     A pointer to the Highs instance.\\n @param index     The index of the option.\\n @param name      The name of the option.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getOptionName(\n        highs: *const ::std::os::raw::c_void,\n        index: HighsInt,\n        name: *mut *mut ::std::os::raw::c_char,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get the current and default values of a bool option\\n\\n @param highs         A pointer to the Highs instance.\\n @param current_value A pointer to the current value of the option.\\n @param default_value A pointer to the default value of the option.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getBoolOptionValues(\n        highs: *const ::std::os::raw::c_void,\n        option: *const ::std::os::raw::c_char,\n        current_value: *mut HighsInt,\n        default_value: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get the current and default values of a HighsInt option\\n\\n @param highs         A pointer to the Highs instance.\\n @param current_value A pointer to the current value of the option.\\n @param min_value     A pointer to the minimum value of the option.\\n @param max_value     A pointer to the maximum value of the option.\\n @param default_value A pointer to the default value of the option.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getIntOptionValues(\n        highs: *const ::std::os::raw::c_void,\n        option: *const ::std::os::raw::c_char,\n        current_value: *mut HighsInt,\n        min_value: *mut HighsInt,\n        max_value: *mut HighsInt,\n        default_value: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get the current and default values of a double option\\n\\n @param highs         A pointer to the Highs instance.\\n @param current_value A pointer to the current value of the option.\\n @param min_value     A pointer to the minimum value of the option.\\n @param max_value     A pointer to the maximum value of the option.\\n @param default_value A pointer to the default value of the option.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getDoubleOptionValues(\n        highs: *const ::std::os::raw::c_void,\n        option: *const ::std::os::raw::c_char,\n        current_value: *mut f64,\n        min_value: *mut f64,\n        max_value: *mut f64,\n        default_value: *mut f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get the current and default values of a string option\\n\\n @param highs         A pointer to the Highs instance.\\n @param current_value A pointer to the current value of the option.\\n @param default_value A pointer to the default value of the option.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getStringOptionValues(\n        highs: *const ::std::os::raw::c_void,\n        option: *const ::std::os::raw::c_char,\n        current_value: *mut ::std::os::raw::c_char,\n        default_value: *mut ::std::os::raw::c_char,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get an int-valued info value.\\n\\n @param highs     A pointer to the Highs instance.\\n @param info      The name of the info item.\\n @param value     A reference to an integer that the result will be stored in.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getIntInfoValue(\n        highs: *const ::std::os::raw::c_void,\n        info: *const ::std::os::raw::c_char,\n        value: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get a double-valued info value.\\n\\n @param highs     A pointer to the Highs instance.\\n @param info      The name of the info item.\\n @param value     A reference to a double that the result will be stored in.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getDoubleInfoValue(\n        highs: *const ::std::os::raw::c_void,\n        info: *const ::std::os::raw::c_char,\n        value: *mut f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get an int64-valued info value.\\n\\n @param highs     A pointer to the Highs instance.\\n @param info      The name of the info item.\\n @param value     A reference to an int64 that the result will be stored in.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getInt64InfoValue(\n        highs: *const ::std::os::raw::c_void,\n        info: *const ::std::os::raw::c_char,\n        value: *mut i64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get the type expected by an info item.\\n\\n @param highs     A pointer to the Highs instance.\\n @param info      The name of the info item.\\n @param type      A HighsInt in which the corresponding `kHighsOptionType`\\n                  constant is stored.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getInfoType(\n        highs: *const ::std::os::raw::c_void,\n        info: *const ::std::os::raw::c_char,\n        type_: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get the primal and dual solution from an optimized model.\\n\\n @param highs      A pointer to the Highs instance.\\n @param col_value  An array of length [num_col], to be filled with primal\\n                   column values.\\n @param col_dual   An array of length [num_col], to be filled with dual column\\n                   values.\\n @param row_value  An array of length [num_row], to be filled with primal row\\n                   values.\\n @param row_dual   An array of length [num_row], to be filled with dual row\\n                   values.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getSolution(\n        highs: *const ::std::os::raw::c_void,\n        col_value: *mut f64,\n        col_dual: *mut f64,\n        row_value: *mut f64,\n        row_dual: *mut f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Given a linear program with a basic feasible solution, get the column and row\\n basis statuses.\\n\\n @param highs       A pointer to the Highs instance.\\n @param col_status  An array of length [num_col], to be filled with the column\\n                    basis statuses in the form of a `kHighsBasisStatus`\\n                    constant.\\n @param row_status  An array of length [num_row], to be filled with the row\\n                    basis statuses in the form of a `kHighsBasisStatus`\\n                    constant.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getBasis(\n        highs: *const ::std::os::raw::c_void,\n        col_status: *mut HighsInt,\n        row_status: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Return the optimization status of the model in the form of a\\n `kHighsModelStatus` constant.\\n\\n @param highs     A pointer to the Highs instance.\\n\\n @returns An integer corresponding to the `kHighsModelStatus` constant\"]\n    pub fn Highs_getModelStatus(highs: *const ::std::os::raw::c_void) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Indicates whether a dual ray that is a certificate of primal\\n infeasibility currently exists, and (at the expense of solving an\\n LP) gets it if it does not and dual_ray_value is not nullptr.\\n\\n @param highs             A pointer to the Highs instance.\\n @param has_dual_ray      A pointer to a HighsInt to store 1 if a dual ray\\n                          currently exists.\\n @param dual_ray_value    An array of length [num_row] filled with the\\n                          unbounded ray.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getDualRay(\n        highs: *const ::std::os::raw::c_void,\n        has_dual_ray: *mut HighsInt,\n        dual_ray_value: *mut f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Indicates whether a dual unboundedness direction (corresponding to a\\n certificate of primal infeasibility) exists, and (at the expense of\\n solving an LP) gets it if it does not and\\n dual_unboundedness_direction is not nullptr\\n\\n @param highs                                   A pointer to the Highs\\n                                                instance.\\n @param has_dual_unboundedness_direction        A pointer to a HighsInt to\\n                                                store 1 if the dual\\n                                                unboundedness direction\\n                                                exists.\\n @param dual_unboundedness_direction_value      An array of length [num_col]\\n                                                filled with the unboundedness\\n                                                direction.\"]\n    pub fn Highs_getDualUnboundednessDirection(\n        highs: *const ::std::os::raw::c_void,\n        has_dual_unboundedness_direction: *mut HighsInt,\n        dual_unboundedness_direction_value: *mut f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Indicates whether a primal ray that is a certificate of primal\\n unboundedness currently exists, and (at the expense of solving an\\n LP) gets it if it does not and primal_ray_value is not nullptr.\\n\\n @param highs             A pointer to the Highs instance.\\n @param has_primal_ray    A pointer to a HighsInt to store 1 if the primal ray\\n                          exists.\\n @param primal_ray_value  An array of length [num_col] filled with the\\n                          unbounded ray.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getPrimalRay(\n        highs: *const ::std::os::raw::c_void,\n        has_primal_ray: *mut HighsInt,\n        primal_ray_value: *mut f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get the primal objective function value.\\n\\n @param highs     A pointer to the Highs instance.\\n\\n @returns The primal objective function value\"]\n    pub fn Highs_getObjectiveValue(highs: *const ::std::os::raw::c_void) -> f64;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get the indices of the rows and columns that make up the basis matrix ``B``\\n of a basic feasible solution.\\n\\n Non-negative entries are indices of columns, and negative entries are\\n `-row_index - 1`. For example, `{1, -1}` would be the second column and first\\n row.\\n\\n The order of these rows and columns is important for calls to the functions:\\n\\n  - `Highs_getBasisInverseRow`\\n  - `Highs_getBasisInverseCol`\\n  - `Highs_getBasisSolve`\\n  - `Highs_getBasisTransposeSolve`\\n  - `Highs_getReducedRow`\\n  - `Highs_getReducedColumn`\\n\\n @param highs             A pointer to the Highs instance.\\n @param basic_variables   An array of size [num_rows], filled with the indices\\n                          of the basic variables.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getBasicVariables(\n        highs: *const ::std::os::raw::c_void,\n        basic_variables: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get a row of the inverse basis matrix ``B^{-1}``.\\n\\n See `Highs_getBasicVariables` for a description of the ``B`` matrix.\\n\\n The arrays `row_vector` and `row_index` must have an allocated length of\\n [num_row]. However, check `row_num_nz` to see how many non-zero elements are\\n actually stored.\\n\\n @param highs         A pointer to the Highs instance.\\n @param row           The index of the row to compute.\\n @param row_vector    An array of length [num_row] in which to store the\\n                      values of the non-zero elements.\\n @param row_num_nz    The number of non-zeros in the row.\\n @param row_index     An array of length [num_row] in which to store the\\n                      indices of the non-zero elements.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getBasisInverseRow(\n        highs: *const ::std::os::raw::c_void,\n        row: HighsInt,\n        row_vector: *mut f64,\n        row_num_nz: *mut HighsInt,\n        row_index: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get a column of the inverse basis matrix ``B^{-1}``.\\n\\n See `Highs_getBasicVariables` for a description of the ``B`` matrix.\\n\\n The arrays `col_vector` and `col_index` must have an allocated length of\\n [num_row]. However, check `col_num_nz` to see how many non-zero elements are\\n actually stored.\\n\\n @param highs         A pointer to the Highs instance.\\n @param col           The index of the column to compute.\\n @param col_vector    An array of length [num_row] in which to store the\\n                      values of the non-zero elements.\\n @param col_num_nz    The number of non-zeros in the column.\\n @param col_index     An array of length [num_row] in which to store the\\n                      indices of the non-zero elements.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getBasisInverseCol(\n        highs: *const ::std::os::raw::c_void,\n        col: HighsInt,\n        col_vector: *mut f64,\n        col_num_nz: *mut HighsInt,\n        col_index: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Compute ``\\\\mathbf{x}=B^{-1}\\\\mathbf{b}`` for a given vector\\n ``\\\\mathbf{b}``.\\n\\n See `Highs_getBasicVariables` for a description of the ``B`` matrix.\\n\\n The arrays `solution_vector` and `solution_index` must have an allocated\\n length of [num_row]. However, check `solution_num_nz` to see how many\\n non-zero elements are actually stored.\\n\\n @param highs             A pointer to the Highs instance.\\n @param rhs               The right-hand side vector ``b``.\\n @param solution_vector   An array of length [num_row] in which to store the\\n                          values of the non-zero elements.\\n @param solution_num_nz   The number of non-zeros in the solution.\\n @param solution_index    An array of length [num_row] in which to store the\\n                          indices of the non-zero elements.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getBasisSolve(\n        highs: *const ::std::os::raw::c_void,\n        rhs: *const f64,\n        solution_vector: *mut f64,\n        solution_num_nz: *mut HighsInt,\n        solution_index: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Compute ``\\\\mathbf{x}=B^{-T}\\\\mathbf{b}`` for a given vector\\n ``\\\\mathbf{b}``.\\n\\n See `Highs_getBasicVariables` for a description of the ``B`` matrix.\\n\\n The arrays `solution_vector` and `solution_index` must have an allocated\\n length of [num_row]. However, check `solution_num_nz` to see how many\\n non-zero elements are actually stored.\\n\\n @param highs             A pointer to the Highs instance.\\n @param rhs               The right-hand side vector ``b``\\n @param solution_vector   An array of length [num_row] in which to store the\\n                          values of the non-zero elements.\\n @param solution_num_nz   The number of non-zeros in the solution.\\n @param solution_index    An array of length [num_row] in which to store the\\n                          indices of the non-zero elements.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getBasisTransposeSolve(\n        highs: *const ::std::os::raw::c_void,\n        rhs: *const f64,\n        solution_vector: *mut f64,\n        solution_nz: *mut HighsInt,\n        solution_index: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Compute a row of ``B^{-1}A``.\\n\\n See `Highs_getBasicVariables` for a description of the ``B`` matrix.\\n\\n The arrays `row_vector` and `row_index` must have an allocated length of\\n [num_col]. However, check `row_num_nz` to see how many non-zero elements are\\n actually stored.\\n\\n @param highs         A pointer to the Highs instance.\\n @param row           The index of the row to compute.\\n @param row_vector    An array of length [num_col] in which to store the\\n                      values of the non-zero elements.\\n @param row_num_nz    The number of non-zeros in the row.\\n @param row_index     An array of length [num_col] in which to store the\\n                      indices of the non-zero elements.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getReducedRow(\n        highs: *const ::std::os::raw::c_void,\n        row: HighsInt,\n        row_vector: *mut f64,\n        row_num_nz: *mut HighsInt,\n        row_index: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Compute a column of ``B^{-1}A``.\\n\\n See `Highs_getBasicVariables` for a description of the ``B`` matrix.\\n\\n The arrays `col_vector` and `col_index` must have an allocated length of\\n [num_row]. However, check `col_num_nz` to see how many non-zero elements are\\n actually stored.\\n\\n @param highs         A pointer to the Highs instance.\\n @param col           The index of the column to compute.\\n @param col_vector    An array of length [num_row] in which to store the\\n                       values of the non-zero elements.\\n @param col_num_nz    The number of non-zeros in the column.\\n @param col_index     An array of length [num_row] in which to store the\\n                       indices of the non-zero elements.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getReducedColumn(\n        highs: *const ::std::os::raw::c_void,\n        col: HighsInt,\n        col_vector: *mut f64,\n        col_num_nz: *mut HighsInt,\n        col_index: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Set a basic feasible solution by passing the column and row basis statuses to\\n the model.\\n\\n @param highs       A pointer to the Highs instance.\\n @param col_status  an array of length [num_col] with the column basis status\\n                    in the form of `kHighsBasisStatus` constants\\n @param row_status  an array of length [num_row] with the row basis status\\n                    in the form of `kHighsBasisStatus` constants\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_setBasis(\n        highs: *mut ::std::os::raw::c_void,\n        col_status: *const HighsInt,\n        row_status: *const HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Set a logical basis in the model.\\n\\n @param highs     A pointer to the Highs instance.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_setLogicalBasis(highs: *mut ::std::os::raw::c_void) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Set a solution by passing the column and row primal and dual solution values.\\n\\n For any values that are unavailable, pass NULL.\\n\\n @param highs       A pointer to the Highs instance.\\n @param col_value   An array of length [num_col] with the column solution\\n                    values.\\n @param row_value   An array of length [num_row] with the row solution\\n                    values.\\n @param col_dual    An array of length [num_col] with the column dual values.\\n @param row_dual    An array of length [num_row] with the row dual values.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_setSolution(\n        highs: *mut ::std::os::raw::c_void,\n        col_value: *const f64,\n        row_value: *const f64,\n        col_dual: *const f64,\n        row_dual: *const f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Set a partial primal solution by passing values for a set of variables\\n\\n @param highs       A pointer to the Highs instance.\\n @param num_entries Number of variables in the set\\n @param index       Indices of variables in the set\\n @param value       Values of variables in the set\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_setSparseSolution(\n        highs: *mut ::std::os::raw::c_void,\n        num_entries: HighsInt,\n        index: *const HighsInt,\n        value: *const f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Set the callback method to use for HiGHS\\n\\n @param highs              A pointer to the Highs instance.\\n @param user_callback      A pointer to the user callback\\n @param user_callback_data A pointer to the user callback data\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_setCallback(\n        highs: *mut ::std::os::raw::c_void,\n        user_callback: HighsCCallbackType,\n        user_callback_data: *mut ::std::os::raw::c_void,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Start callback of given type\\n\\n @param highs         A pointer to the Highs instance.\\n @param callback_type The type of callback to be started\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_startCallback(\n        highs: *mut ::std::os::raw::c_void,\n        callback_type: HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Stop callback of given type\\n\\n @param highs         A pointer to the Highs instance.\\n @param callback_type The type of callback to be stopped\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_stopCallback(\n        highs: *mut ::std::os::raw::c_void,\n        callback_type: HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Return the cumulative wall-clock time spent in `Highs_run`.\\n\\n @param highs     A pointer to the Highs instance.\\n\\n @returns The cumulative wall-clock time spent in `Highs_run`\"]\n    pub fn Highs_getRunTime(highs: *const ::std::os::raw::c_void) -> f64;\n}\nunsafe extern \"C\" {\n    #[doc = \" Reset the clocks in a `highs` model.\\n\\n Each `highs` model contains a single instance of clock that records how much\\n time is spent in various parts of the algorithm. This clock is not reset on\\n entry to `Highs_run`, so repeated calls to `Highs_run` report the cumulative\\n time spent in the algorithm. A side-effect is that this will trigger a time\\n limit termination once the cumulative run time exceeds the time limit, rather\\n than the run time of each individual call to `Highs_run`.\\n\\n As a work-around, call `Highs_zeroAllClocks` before each call to `Highs_run`.\\n\\n @param highs     A pointer to the Highs instance.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_zeroAllClocks(highs: *const ::std::os::raw::c_void) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Add a new column (variable) to the model.\\n\\n @param highs         A pointer to the Highs instance.\\n @param cost          The objective coefficient of the column.\\n @param lower         The lower bound of the column.\\n @param upper         The upper bound of the column.\\n @param num_new_nz    The number of non-zeros in the column.\\n @param index         An array of size [num_new_nz] with the row indices.\\n @param value         An array of size [num_new_nz] with row values.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_addCol(\n        highs: *mut ::std::os::raw::c_void,\n        cost: f64,\n        lower: f64,\n        upper: f64,\n        num_new_nz: HighsInt,\n        index: *const HighsInt,\n        value: *const f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Add multiple columns (variables) to the model.\\n\\n @param highs         A pointer to the Highs instance.\\n @param num_new_col   The number of new columns to add.\\n @param costs         An array of size [num_new_col] with objective\\n                      coefficients.\\n @param lower         An array of size [num_new_col] with lower bounds.\\n @param upper         An array of size [num_new_col] with upper bounds.\\n @param num_new_nz    The number of new nonzeros in the constraint matrix.\\n @param starts        The constraint coefficients are given as a matrix in\\n                      compressed sparse column form by the arrays `starts`,\\n                      `index`, and `value`. `starts` is an array of size\\n                      [num_new_cols] with the start index of each row in\\n                      indices and values.\\n @param index         An array of size [num_new_nz] with row indices.\\n @param value         An array of size [num_new_nz] with row values.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_addCols(\n        highs: *mut ::std::os::raw::c_void,\n        num_new_col: HighsInt,\n        costs: *const f64,\n        lower: *const f64,\n        upper: *const f64,\n        num_new_nz: HighsInt,\n        starts: *const HighsInt,\n        index: *const HighsInt,\n        value: *const f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Add a new variable to the model.\\n\\n @param highs         A pointer to the Highs instance.\\n @param lower         The lower bound of the column.\\n @param upper         The upper bound of the column.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_addVar(highs: *mut ::std::os::raw::c_void, lower: f64, upper: f64) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Add multiple variables to the model.\\n\\n @param highs         A pointer to the Highs instance.\\n @param num_new_var   The number of new variables to add.\\n @param lower         An array of size [num_new_var] with lower bounds.\\n @param upper         An array of size [num_new_var] with upper bounds.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_addVars(\n        highs: *mut ::std::os::raw::c_void,\n        num_new_var: HighsInt,\n        lower: *const f64,\n        upper: *const f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Add a new row (a linear constraint) to the model.\\n\\n @param highs         A pointer to the Highs instance.\\n @param lower         The lower bound of the row.\\n @param upper         The upper bound of the row.\\n @param num_new_nz    The number of non-zeros in the row\\n @param index         An array of size [num_new_nz] with column indices.\\n @param value         An array of size [num_new_nz] with column values.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_addRow(\n        highs: *mut ::std::os::raw::c_void,\n        lower: f64,\n        upper: f64,\n        num_new_nz: HighsInt,\n        index: *const HighsInt,\n        value: *const f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Add multiple rows (linear constraints) to the model.\\n\\n @param highs         A pointer to the Highs instance.\\n @param num_new_row   The number of new rows to add\\n @param lower         An array of size [num_new_row] with the lower bounds of\\n                      the rows.\\n @param upper         An array of size [num_new_row] with the upper bounds of\\n                      the rows.\\n @param num_new_nz    The number of non-zeros in the rows.\\n @param starts        The constraint coefficients are given as a matrix in\\n                      compressed sparse row form by the arrays `starts`,\\n                      `index`, and `value`. `starts` is an array of size\\n                      [num_new_rows] with the start index of each row in\\n                      indices and values.\\n @param index         An array of size [num_new_nz] with column indices.\\n @param value         An array of size [num_new_nz] with column values.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_addRows(\n        highs: *mut ::std::os::raw::c_void,\n        num_new_row: HighsInt,\n        lower: *const f64,\n        upper: *const f64,\n        num_new_nz: HighsInt,\n        starts: *const HighsInt,\n        index: *const HighsInt,\n        value: *const f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Ensure that the constraint matrix of the incumbent model is stored\\n column-wise.\\n\\n @param highs         A pointer to the Highs instance.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_ensureColwise(highs: *mut ::std::os::raw::c_void) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Ensure that the constraint matrix of the incumbent model is stored row-wise.\\n\\n @param highs         A pointer to the Highs instance.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_ensureRowwise(highs: *mut ::std::os::raw::c_void) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Change the objective sense of the model.\\n\\n @param highs     A pointer to the Highs instance.\\n @param sense     The new optimization sense in the form of a `kHighsObjSense`\\n                  constant.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_changeObjectiveSense(\n        highs: *mut ::std::os::raw::c_void,\n        sense: HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Change the objective offset of the model.\\n\\n @param highs     A pointer to the Highs instance.\\n @param offset    The new objective offset.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_changeObjectiveOffset(highs: *mut ::std::os::raw::c_void, offset: f64)\n        -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Change the integrality of a column.\\n\\n @param highs         A pointer to the Highs instance.\\n @param col           The column index to change.\\n @param integrality   The new integrality of the column in the form of a\\n                      `kHighsVarType` constant.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_changeColIntegrality(\n        highs: *mut ::std::os::raw::c_void,\n        col: HighsInt,\n        integrality: HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Change the integrality of multiple adjacent columns.\\n\\n @param highs         A pointer to the Highs instance.\\n @param from_col      The index of the first column whose integrality changes.\\n @param to_col        The index of the last column whose integrality\\n                      changes.\\n @param integrality   An array of length [to_col - from_col + 1] with the new\\n                      integralities of the columns in the form of\\n                      `kHighsVarType` constants.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_changeColsIntegralityByRange(\n        highs: *mut ::std::os::raw::c_void,\n        from_col: HighsInt,\n        to_col: HighsInt,\n        integrality: *const HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Change the integrality of multiple columns given by an array of indices.\\n\\n @param highs             A pointer to the Highs instance.\\n @param num_set_entries   The number of columns to change.\\n @param set               An array of size [num_set_entries] with the indices\\n                          of the columns to change.\\n @param integrality       An array of length [num_set_entries] with the new\\n                          integralities of the columns in the form of\\n                          `kHighsVarType` constants.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_changeColsIntegralityBySet(\n        highs: *mut ::std::os::raw::c_void,\n        num_set_entries: HighsInt,\n        set: *const HighsInt,\n        integrality: *const HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Change the integrality of multiple columns given by a mask.\\n\\n @param highs         A pointer to the Highs instance.\\n @param mask          An array of length [num_col] with 1 if the column\\n                      integrality should be changed and 0 otherwise.\\n @param integrality   An array of length [num_col] with the new\\n                      integralities of the columns in the form of\\n                      `kHighsVarType` constants.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_changeColsIntegralityByMask(\n        highs: *mut ::std::os::raw::c_void,\n        mask: *const HighsInt,\n        integrality: *const HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Clear the integrality of all columns\\n\\n @param highs         A pointer to the Highs instance.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_clearIntegrality(highs: *mut ::std::os::raw::c_void) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Change the objective coefficient of a column.\\n\\n @param highs     A pointer to the Highs instance.\\n @param col       The index of the column fo change.\\n @param cost      The new objective coefficient.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_changeColCost(\n        highs: *mut ::std::os::raw::c_void,\n        col: HighsInt,\n        cost: f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Change the cost coefficients of multiple adjacent columns.\\n\\n @param highs     A pointer to the Highs instance.\\n @param from_col  The index of the first column whose cost changes.\\n @param to_col    The index of the last column whose cost changes.\\n @param cost      An array of length [to_col - from_col + 1] with the new\\n                  objective coefficients.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_changeColsCostByRange(\n        highs: *mut ::std::os::raw::c_void,\n        from_col: HighsInt,\n        to_col: HighsInt,\n        cost: *const f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Change the cost of multiple columns given by an array of indices.\\n\\n @param highs             A pointer to the Highs instance.\\n @param num_set_entries   The number of columns to change.\\n @param set               An array of size [num_set_entries] with the indices\\n                          of the columns to change.\\n @param cost              An array of length [num_set_entries] with the new\\n                          costs of the columns.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_changeColsCostBySet(\n        highs: *mut ::std::os::raw::c_void,\n        num_set_entries: HighsInt,\n        set: *const HighsInt,\n        cost: *const f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Change the cost of multiple columns given by a mask.\\n\\n @param highs     A pointer to the Highs instance.\\n @param mask      An array of length [num_col] with 1 if the column\\n                  cost should be changed and 0 otherwise.\\n @param cost      An array of length [num_col] with the new costs.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_changeColsCostByMask(\n        highs: *mut ::std::os::raw::c_void,\n        mask: *const HighsInt,\n        cost: *const f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Change the variable bounds of a column.\\n\\n @param highs     A pointer to the Highs instance.\\n @param col       The index of the column whose bounds are to change.\\n @param lower     The new lower bound.\\n @param upper     The new upper bound.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_changeColBounds(\n        highs: *mut ::std::os::raw::c_void,\n        col: HighsInt,\n        lower: f64,\n        upper: f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Change the variable bounds of multiple adjacent columns.\\n\\n @param highs     A pointer to the Highs instance.\\n @param from_col  The index of the first column whose bound changes.\\n @param to_col    The index of the last column whose bound changes.\\n @param lower     An array of length [to_col - from_col + 1] with the new\\n                  lower bounds.\\n @param upper     An array of length [to_col - from_col + 1] with the new\\n                  upper bounds.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_changeColsBoundsByRange(\n        highs: *mut ::std::os::raw::c_void,\n        from_col: HighsInt,\n        to_col: HighsInt,\n        lower: *const f64,\n        upper: *const f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Change the bounds of multiple columns given by an array of indices.\\n\\n @param highs             A pointer to the Highs instance.\\n @param num_set_entries   The number of columns to change.\\n @param set               An array of size [num_set_entries] with the indices\\n                          of the columns to change.\\n @param lower             An array of length [num_set_entries] with the new\\n                          lower bounds.\\n @param upper             An array of length [num_set_entries] with the new\\n                          upper bounds.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_changeColsBoundsBySet(\n        highs: *mut ::std::os::raw::c_void,\n        num_set_entries: HighsInt,\n        set: *const HighsInt,\n        lower: *const f64,\n        upper: *const f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Change the variable bounds of multiple columns given by a mask.\\n\\n @param highs     A pointer to the Highs instance.\\n @param mask      An array of length [num_col] with 1 if the column\\n                  bounds should be changed and 0 otherwise.\\n @param lower     An array of length [num_col] with the new lower bounds.\\n @param upper     An array of length [num_col] with the new upper bounds.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_changeColsBoundsByMask(\n        highs: *mut ::std::os::raw::c_void,\n        mask: *const HighsInt,\n        lower: *const f64,\n        upper: *const f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Change the bounds of a row.\\n\\n @param highs     A pointer to the Highs instance.\\n @param row       The index of the row whose bounds are to change.\\n @param lower     The new lower bound.\\n @param upper     The new upper bound.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_changeRowBounds(\n        highs: *mut ::std::os::raw::c_void,\n        row: HighsInt,\n        lower: f64,\n        upper: f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Change the variable bounds of multiple adjacent rows.\\n\\n @param highs     A pointer to the Highs instance.\\n @param from_row  The index of the first row whose bound changes.\\n @param to_row    The index of the last row whose bound changes.\\n @param lower     An array of length [to_row - from_row + 1] with the new\\n                  lower bounds.\\n @param upper     An array of length [to_row - from_row + 1] with the new\\n                  upper bounds.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_changeRowsBoundsByRange(\n        highs: *mut ::std::os::raw::c_void,\n        from_row: HighsInt,\n        to_row: HighsInt,\n        lower: *const f64,\n        upper: *const f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Change the bounds of multiple rows given by an array of indices.\\n\\n @param highs             A pointer to the Highs instance.\\n @param num_set_entries   The number of rows to change.\\n @param set               An array of size [num_set_entries] with the indices\\n                          of the rows to change.\\n @param lower             An array of length [num_set_entries] with the new\\n                          lower bounds.\\n @param upper             An array of length [num_set_entries] with the new\\n                          upper bounds.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_changeRowsBoundsBySet(\n        highs: *mut ::std::os::raw::c_void,\n        num_set_entries: HighsInt,\n        set: *const HighsInt,\n        lower: *const f64,\n        upper: *const f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Change the bounds of multiple rows given by a mask.\\n\\n @param highs     A pointer to the Highs instance.\\n @param mask      An array of length [num_row] with 1 if the row\\n                  bounds should be changed and 0 otherwise.\\n @param lower     An array of length [num_row] with the new lower bounds.\\n @param upper     An array of length [num_row] with the new upper bounds.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_changeRowsBoundsByMask(\n        highs: *mut ::std::os::raw::c_void,\n        mask: *const HighsInt,\n        lower: *const f64,\n        upper: *const f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Change a coefficient in the constraint matrix.\\n\\n @param highs     A pointer to the Highs instance.\\n @param row       The index of the row to change.\\n @param col       The index of the column to change.\\n @param value     The new constraint coefficient.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_changeCoeff(\n        highs: *mut ::std::os::raw::c_void,\n        row: HighsInt,\n        col: HighsInt,\n        value: f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get the objective sense.\\n\\n @param highs     A pointer to the Highs instance.\\n @param sense     The location in which the current objective sense should be\\n                  placed. The sense is a `kHighsObjSense` constant.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getObjectiveSense(\n        highs: *const ::std::os::raw::c_void,\n        sense: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get the objective offset.\\n\\n @param highs     A pointer to the Highs instance.\\n @param offset    The location in which the current objective offset should be\\n                  placed.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getObjectiveOffset(\n        highs: *const ::std::os::raw::c_void,\n        offset: *mut f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get data associated with multiple adjacent columns from the model.\\n\\n To query the constraint coefficients, this function should be called twice.\\n\\n First, call this function with `matrix_start`, `matrix_index`, and\\n `matrix_value` as `NULL`. This call will populate `num_nz` with the number of\\n nonzero elements in the corresponding section of the constraint matrix.\\n\\n Second, allocate new `matrix_index` and `matrix_value` arrays of length\\n `num_nz` and call this function again to populate the new arrays with their\\n contents.\\n\\n @param highs         A pointer to the Highs instance.\\n @param from_col      The first column for which to query data for.\\n @param to_col        The last column (inclusive) for which to query data for.\\n @param num_col       A HighsInt populated with the number of columns got from\\n                      the model (this should equal `to_col - from_col + 1`).\\n @param costs         An array of size [to_col - from_col + 1] for the column\\n                      cost coefficients.\\n @param lower         An array of size [to_col - from_col + 1] for the column\\n                      lower bounds.\\n @param upper         An array of size [to_col - from_col + 1] for the column\\n                      upper bounds.\\n @param num_nz        A HighsInt to be populated with the number of non-zero\\n                      elements in the constraint matrix.\\n @param matrix_start  An array of size [to_col - from_col + 1] with the start\\n                      indices of each column in `matrix_index` and\\n                      `matrix_value`.\\n @param matrix_index  An array of size [num_nz] with the row indices of each\\n                      element in the constraint matrix.\\n @param matrix_value  An array of size [num_nz] with the non-zero elements of\\n                      the constraint matrix.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getColsByRange(\n        highs: *const ::std::os::raw::c_void,\n        from_col: HighsInt,\n        to_col: HighsInt,\n        num_col: *mut HighsInt,\n        costs: *mut f64,\n        lower: *mut f64,\n        upper: *mut f64,\n        num_nz: *mut HighsInt,\n        matrix_start: *mut HighsInt,\n        matrix_index: *mut HighsInt,\n        matrix_value: *mut f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get data associated with multiple columns given by an array.\\n\\n This function is identical to `Highs_getColsByRange`, except for how the\\n columns are specified.\\n\\n @param num_set_indices   The number of indices in `set`.\\n @param set               An array of size [num_set_entries] with the column\\n                          indices to get.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getColsBySet(\n        highs: *const ::std::os::raw::c_void,\n        num_set_entries: HighsInt,\n        set: *const HighsInt,\n        num_col: *mut HighsInt,\n        costs: *mut f64,\n        lower: *mut f64,\n        upper: *mut f64,\n        num_nz: *mut HighsInt,\n        matrix_start: *mut HighsInt,\n        matrix_index: *mut HighsInt,\n        matrix_value: *mut f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get data associated with multiple columns given by a mask.\\n\\n This function is identical to `Highs_getColsByRange`, except for how the\\n columns are specified.\\n\\n @param mask  An array of length [num_col] containing a `1` to get the column\\n              and `0` otherwise.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getColsByMask(\n        highs: *const ::std::os::raw::c_void,\n        mask: *const HighsInt,\n        num_col: *mut HighsInt,\n        costs: *mut f64,\n        lower: *mut f64,\n        upper: *mut f64,\n        num_nz: *mut HighsInt,\n        matrix_start: *mut HighsInt,\n        matrix_index: *mut HighsInt,\n        matrix_value: *mut f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get data associated with multiple adjacent rows from the model.\\n\\n To query the constraint coefficients, this function should be called twice.\\n\\n First, call this function with `matrix_start`, `matrix_index`, and\\n `matrix_value` as `NULL`. This call will populate `num_nz` with the number of\\n nonzero elements in the corresponding section of the constraint matrix.\\n\\n Second, allocate new `matrix_index` and `matrix_value` arrays of length\\n `num_nz` and call this function again to populate the new arrays with their\\n contents.\\n\\n @param highs         A pointer to the Highs instance.\\n @param from_row      The first row for which to query data for.\\n @param to_row        The last row (inclusive) for which to query data for.\\n @param num_row       A HighsInt to be populated with the number of rows got\\n                      from the model.\\n @param lower         An array of size [to_row - from_row + 1] for the row\\n                      lower bounds.\\n @param upper         An array of size [to_row - from_row + 1] for the row\\n                      upper bounds.\\n @param num_nz        A HighsInt to be populated with the number of non-zero\\n                      elements in the constraint matrix.\\n @param matrix_start  An array of size [to_row - from_row + 1] with the start\\n                      indices of each row in `matrix_index` and\\n                      `matrix_value`.\\n @param matrix_index  An array of size [num_nz] with the column indices of\\n                      each element in the constraint matrix.\\n @param matrix_value  An array of size [num_nz] with the non-zero elements of\\n                      the constraint matrix.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getRowsByRange(\n        highs: *const ::std::os::raw::c_void,\n        from_row: HighsInt,\n        to_row: HighsInt,\n        num_row: *mut HighsInt,\n        lower: *mut f64,\n        upper: *mut f64,\n        num_nz: *mut HighsInt,\n        matrix_start: *mut HighsInt,\n        matrix_index: *mut HighsInt,\n        matrix_value: *mut f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get data associated with multiple rows given by an array.\\n\\n This function is identical to `Highs_getRowsByRange`, except for how the\\n rows are specified.\\n\\n @param num_set_indices   The number of indices in `set`.\\n @param set               An array of size [num_set_entries] containing the\\n                          row indices to get.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getRowsBySet(\n        highs: *const ::std::os::raw::c_void,\n        num_set_entries: HighsInt,\n        set: *const HighsInt,\n        num_row: *mut HighsInt,\n        lower: *mut f64,\n        upper: *mut f64,\n        num_nz: *mut HighsInt,\n        matrix_start: *mut HighsInt,\n        matrix_index: *mut HighsInt,\n        matrix_value: *mut f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get data associated with multiple rows given by a mask.\\n\\n This function is identical to `Highs_getRowsByRange`, except for how the\\n rows are specified.\\n\\n @param mask  An array of length [num_row] containing a `1` to get the row and\\n              `0` otherwise.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getRowsByMask(\n        highs: *const ::std::os::raw::c_void,\n        mask: *const HighsInt,\n        num_row: *mut HighsInt,\n        lower: *mut f64,\n        upper: *mut f64,\n        num_nz: *mut HighsInt,\n        matrix_start: *mut HighsInt,\n        matrix_index: *mut HighsInt,\n        matrix_value: *mut f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get the name of a row.\\n\\n @param row   The index of the row to query.\\n @param name  A pointer in which to store the name of the row. This must have\\n              length `kHighsMaximumStringLength`.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getRowName(\n        highs: *const ::std::os::raw::c_void,\n        row: HighsInt,\n        name: *mut ::std::os::raw::c_char,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get the index of a row from its name.\\n\\n If multiple rows have the same name, or if no row exists with `name`, this\\n function returns `kHighsStatusError`.\\n\\n @param name A pointer of the name of the row to query.\\n @param row  A pointer in which to store the index of the row\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getRowByName(\n        highs: *const ::std::os::raw::c_void,\n        name: *const ::std::os::raw::c_char,\n        row: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get the name of a column.\\n\\n @param col   The index of the column to query.\\n @param name  A pointer in which to store the name of the column. This must\\n              have length `kHighsMaximumStringLength`.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getColName(\n        highs: *const ::std::os::raw::c_void,\n        col: HighsInt,\n        name: *mut ::std::os::raw::c_char,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get the index of a column from its name.\\n\\n If multiple columns have the same name, or if no column exists with `name`,\\n this function returns `kHighsStatusError`.\\n\\n @param name A pointer of the name of the column to query.\\n @param col  A pointer in which to store the index of the column\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getColByName(\n        highs: *const ::std::os::raw::c_void,\n        name: *const ::std::os::raw::c_char,\n        col: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get the integrality of a column.\\n\\n @param col          The index of the column to query.\\n @param integrality  A HighsInt in which the integrality of the column should\\n                     be placed. The integer is one of the `kHighsVarTypeXXX`\\n                     constants.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getColIntegrality(\n        highs: *const ::std::os::raw::c_void,\n        col: HighsInt,\n        integrality: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Delete multiple adjacent columns.\\n\\n @param highs     A pointer to the Highs instance.\\n @param from_col  The index of the first column to delete.\\n @param to_col    The index of the last column to delete.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_deleteColsByRange(\n        highs: *mut ::std::os::raw::c_void,\n        from_col: HighsInt,\n        to_col: HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Delete multiple columns given by an array of indices.\\n\\n @param highs             A pointer to the Highs instance.\\n @param num_set_entries   The number of columns to delete.\\n @param set               An array of size [num_set_entries] with the indices\\n                          of the columns to delete.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_deleteColsBySet(\n        highs: *mut ::std::os::raw::c_void,\n        num_set_entries: HighsInt,\n        set: *const HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Delete multiple columns given by a mask.\\n\\n @param highs     A pointer to the Highs instance.\\n @param mask      An array of length [num_col] with 1 if the column\\n                  should be deleted and 0 otherwise.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_deleteColsByMask(\n        highs: *mut ::std::os::raw::c_void,\n        mask: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Delete multiple adjacent rows.\\n\\n @param highs     A pointer to the Highs instance.\\n @param from_row  The index of the first row to delete.\\n @param to_row    The index of the last row to delete.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_deleteRowsByRange(\n        highs: *mut ::std::os::raw::c_void,\n        from_row: HighsInt,\n        to_row: HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Delete multiple rows given by an array of indices.\\n\\n @param highs             A pointer to the Highs instance.\\n @param num_set_entries   The number of rows to delete.\\n @param set               An array of size [num_set_entries] with the indices\\n                          of the rows to delete.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_deleteRowsBySet(\n        highs: *mut ::std::os::raw::c_void,\n        num_set_entries: HighsInt,\n        set: *const HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Delete multiple rows given by a mask.\\n\\n @param highs     A pointer to the Highs instance.\\n @param mask      An array of length [num_row] with `1` if the row should be\\n                  deleted and `0` otherwise. The new index of any column not\\n                  deleted is stored in place of the value `0`.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_deleteRowsByMask(\n        highs: *mut ::std::os::raw::c_void,\n        mask: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Scale a column by a constant.\\n\\n Scaling a column modifies the elements in the constraint matrix, the variable\\n bounds, and the objective coefficient.\\n\\n @param highs     A pointer to the Highs instance.\\n @param col       The index of the column to scale.\\n @param scaleval  The value by which to scale the column. If `scaleval < 0`,\\n                  the variable bounds flipped.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_scaleCol(\n        highs: *mut ::std::os::raw::c_void,\n        col: HighsInt,\n        scaleval: f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Scale a row by a constant.\\n\\n @param highs     A pointer to the Highs instance.\\n @param row       The index of the row to scale.\\n @param scaleval  The value by which to scale the row. If `scaleval < 0`, the\\n                  row bounds are flipped.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_scaleRow(\n        highs: *mut ::std::os::raw::c_void,\n        row: HighsInt,\n        scaleval: f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Return the value of infinity used by HiGHS.\\n\\n @param highs     A pointer to the Highs instance.\\n\\n @returns The value of infinity used by HiGHS.\"]\n    pub fn Highs_getInfinity(highs: *const ::std::os::raw::c_void) -> f64;\n}\nunsafe extern \"C\" {\n    #[doc = \" Return the size of integers used by HiGHS.\\n\\n @param highs     A pointer to the Highs instance.\\n\\n @returns The size of integers used by HiGHS.\"]\n    pub fn Highs_getSizeofHighsInt(highs: *const ::std::os::raw::c_void) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Return the number of columns in the model.\\n\\n @param highs     A pointer to the Highs instance.\\n\\n @returns The number of columns in the model.\"]\n    pub fn Highs_getNumCol(highs: *const ::std::os::raw::c_void) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Return the number of rows in the model.\\n\\n @param highs     A pointer to the Highs instance.\\n\\n @returns The number of rows in the model.\"]\n    pub fn Highs_getNumRow(highs: *const ::std::os::raw::c_void) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Return the number of nonzeros in the constraint matrix of the model.\\n\\n @param highs     A pointer to the Highs instance.\\n\\n @returns The number of nonzeros in the constraint matrix of the model.\"]\n    pub fn Highs_getNumNz(highs: *const ::std::os::raw::c_void) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Return the number of nonzeroes in the Hessian matrix of the model.\\n\\n @param highs     A pointer to the Highs instance.\\n\\n @returns The number of nonzeroes in the Hessian matrix of the model.\"]\n    pub fn Highs_getHessianNumNz(highs: *const ::std::os::raw::c_void) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Return the number of columns in the presolved model.\\n\\n @param highs     A pointer to the Highs instance.\\n\\n @returns The number of columns in the presolved model.\"]\n    pub fn Highs_getPresolvedNumCol(highs: *const ::std::os::raw::c_void) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Return the number of rows in the presolved model.\\n\\n @param highs     A pointer to the Highs instance.\\n\\n @returns The number of rows in the presolved model.\"]\n    pub fn Highs_getPresolvedNumRow(highs: *const ::std::os::raw::c_void) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Return the number of nonzeros in the constraint matrix of the presolved\\n model.\\n\\n @param highs     A pointer to the Highs instance.\\n\\n @returns The number of nonzeros in the constraint matrix of the presolved\\n model.\"]\n    pub fn Highs_getPresolvedNumNz(highs: *const ::std::os::raw::c_void) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get the data from a HiGHS model.\\n\\n The input arguments have the same meaning (in a different order) to those\\n used in `Highs_passModel`.\\n\\n Note that all arrays must be pre-allocated to the correct size before calling\\n `Highs_getModel`. Use the following query methods to check the appropriate\\n size:\\n  - `Highs_getNumCol`\\n  - `Highs_getNumRow`\\n  - `Highs_getNumNz`\\n  - `Highs_getHessianNumNz`\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getModel(\n        highs: *const ::std::os::raw::c_void,\n        a_format: HighsInt,\n        q_format: HighsInt,\n        num_col: *mut HighsInt,\n        num_row: *mut HighsInt,\n        num_nz: *mut HighsInt,\n        hessian_num_nz: *mut HighsInt,\n        sense: *mut HighsInt,\n        offset: *mut f64,\n        col_cost: *mut f64,\n        col_lower: *mut f64,\n        col_upper: *mut f64,\n        row_lower: *mut f64,\n        row_upper: *mut f64,\n        a_start: *mut HighsInt,\n        a_index: *mut HighsInt,\n        a_value: *mut f64,\n        q_start: *mut HighsInt,\n        q_index: *mut HighsInt,\n        q_value: *mut f64,\n        integrality: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get the data from a HiGHS LP.\\n\\n The input arguments have the same meaning (in a different order) to those\\n used in `Highs_passModel`.\\n\\n Note that all arrays must be pre-allocated to the correct size before calling\\n `Highs_getModel`. Use the following query methods to check the appropriate\\n size:\\n  - `Highs_getNumCol`\\n  - `Highs_getNumRow`\\n  - `Highs_getNumNz`\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getLp(\n        highs: *const ::std::os::raw::c_void,\n        a_format: HighsInt,\n        num_col: *mut HighsInt,\n        num_row: *mut HighsInt,\n        num_nz: *mut HighsInt,\n        sense: *mut HighsInt,\n        offset: *mut f64,\n        col_cost: *mut f64,\n        col_lower: *mut f64,\n        col_upper: *mut f64,\n        row_lower: *mut f64,\n        row_upper: *mut f64,\n        a_start: *mut HighsInt,\n        a_index: *mut HighsInt,\n        a_value: *mut f64,\n        integrality: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Get the data from a HiGHS presolved LP.\\n\\n The input arguments have the same meaning (in a different order) to those\\n used in `Highs_passModel`.\\n\\n Note that all arrays must be pre-allocated to the correct size before calling\\n `Highs_getModel`. Use the following query methods to check the appropriate\\n size:\\n  - `Highs_getPresolvedNumCol`\\n  - `Highs_getPresolvedNumRow`\\n  - `Highs_getPresolvedNumNz`\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getPresolvedLp(\n        highs: *const ::std::os::raw::c_void,\n        a_format: HighsInt,\n        num_col: *mut HighsInt,\n        num_row: *mut HighsInt,\n        num_nz: *mut HighsInt,\n        sense: *mut HighsInt,\n        offset: *mut f64,\n        col_cost: *mut f64,\n        col_lower: *mut f64,\n        col_upper: *mut f64,\n        row_lower: *mut f64,\n        row_upper: *mut f64,\n        a_start: *mut HighsInt,\n        a_index: *mut HighsInt,\n        a_value: *mut f64,\n        integrality: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Set a primal (and possibly dual) solution as a starting point, then run\\n crossover to compute a basic feasible solution.\\n\\n @param highs      A pointer to the Highs instance.\\n @param num_col    The number of variables.\\n @param num_row    The number of rows.\\n @param col_value  An array of length [num_col] with optimal primal solution\\n                   for each column.\\n @param col_dual   An array of length [num_col] with optimal dual solution for\\n                   each column. May be `NULL`, in which case no dual solution\\n                   is passed.\\n @param row_dual   An array of length [num_row] with optimal dual solution for\\n                   each row. . May be `NULL`, in which case no dual solution\\n                   is passed.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_crossover(\n        highs: *mut ::std::os::raw::c_void,\n        num_col: HighsInt,\n        num_row: HighsInt,\n        col_value: *const f64,\n        col_dual: *const f64,\n        row_dual: *const f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Compute the ranging information for all costs and bounds. For\\n nonbasic variables the ranging information is relative to the\\n active bound. For basic variables the ranging information relates\\n to...\\n\\n For any values that are not required, pass NULL.\\n\\n @param highs                  A pointer to the Highs instance.\\n @param col_cost_up_value      The upper range of the cost value\\n @param col_cost_up_objective  The objective at the upper cost range\\n @param col_cost_up_in_var     The variable entering the basis at the upper\\n                               cost range\\n @param col_cost_up_ou_var     The variable leaving the basis at the upper\\n                               cost range\\n @param col_cost_dn_value      The lower range of the cost value\\n @param col_cost_dn_objective  The objective at the lower cost range\\n @param col_cost_dn_in_var     The variable entering the basis at the lower\\n                               cost range\\n @param col_cost_dn_ou_var     The variable leaving the basis at the lower\\n                               cost range\\n @param col_bound_up_value     The upper range of the column bound value\\n @param col_bound_up_objective The objective at the upper column bound range\\n @param col_bound_up_in_var    The variable entering the basis at the upper\\n                               column bound range\\n @param col_bound_up_ou_var    The variable leaving the basis at the upper\\n                               column bound range\\n @param col_bound_dn_value     The lower range of the column bound value\\n @param col_bound_dn_objective The objective at the lower column bound range\\n @param col_bound_dn_in_var    The variable entering the basis at the lower\\n                               column bound range\\n @param col_bound_dn_ou_var    The variable leaving the basis at the lower\\n                               column bound range\\n @param row_bound_up_value     The upper range of the row bound value\\n @param row_bound_up_objective The objective at the upper row bound range\\n @param row_bound_up_in_var    The variable entering the basis at the upper\\n                               row bound range\\n @param row_bound_up_ou_var    The variable leaving the basis at the upper row\\n                               bound range\\n @param row_bound_dn_value     The lower range of the row bound value\\n @param row_bound_dn_objective The objective at the lower row bound range\\n @param row_bound_dn_in_var    The variable entering the basis at the lower\\n                               row bound range\\n @param row_bound_dn_ou_var    The variable leaving the basis at the lower row\\n                               bound range\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_getRanging(\n        highs: *mut ::std::os::raw::c_void,\n        col_cost_up_value: *mut f64,\n        col_cost_up_objective: *mut f64,\n        col_cost_up_in_var: *mut HighsInt,\n        col_cost_up_ou_var: *mut HighsInt,\n        col_cost_dn_value: *mut f64,\n        col_cost_dn_objective: *mut f64,\n        col_cost_dn_in_var: *mut HighsInt,\n        col_cost_dn_ou_var: *mut HighsInt,\n        col_bound_up_value: *mut f64,\n        col_bound_up_objective: *mut f64,\n        col_bound_up_in_var: *mut HighsInt,\n        col_bound_up_ou_var: *mut HighsInt,\n        col_bound_dn_value: *mut f64,\n        col_bound_dn_objective: *mut f64,\n        col_bound_dn_in_var: *mut HighsInt,\n        col_bound_dn_ou_var: *mut HighsInt,\n        row_bound_up_value: *mut f64,\n        row_bound_up_objective: *mut f64,\n        row_bound_up_in_var: *mut HighsInt,\n        row_bound_up_ou_var: *mut HighsInt,\n        row_bound_dn_value: *mut f64,\n        row_bound_dn_objective: *mut f64,\n        row_bound_dn_in_var: *mut HighsInt,\n        row_bound_dn_ou_var: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Compute the solution corresponding to a (possibly weighted) sum of\\n (allowable) infeasibilities in an LP/MIP.\\n\\n If local penalties are not defined, pass NULL, and the global\\n penalty will be used. Negative penalty values imply that the bound\\n or RHS value cannot be violated\\n\\n @param highs                             A pointer to the Highs instance.\\n @param const double global_lower_penalty The penalty for violating lower\\n bounds on variables\\n @param const double global_upper_penalty The penalty for violating upper\\n bounds on variables\\n @param const double global_rhs_penalty   The penalty for violating constraint\\n RHS values\\n @param const double* local_lower_penalty The penalties for violating specific\\n lower bounds on variables\\n @param const double* local_upper_penalty The penalties for violating specific\\n upper bounds on variables\\n @param const double* local_rhs_penalty   The penalties for violating specific\\n constraint RHS values\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_feasibilityRelaxation(\n        highs: *mut ::std::os::raw::c_void,\n        global_lower_penalty: f64,\n        global_upper_penalty: f64,\n        global_rhs_penalty: f64,\n        local_lower_penalty: *const f64,\n        local_upper_penalty: *const f64,\n        local_rhs_penalty: *const f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Releases all resources held by the global scheduler instance.\\n\\n It is not thread-safe to call this function while calling `Highs_run` or one\\n of the `Highs_XXXcall` methods on any other Highs instance in any thread.\\n\\n After this function has terminated, it is guaranteed that eventually all\\n previously created scheduler threads will terminate and allocated memory will\\n be released.\\n\\n After this function has returned, the option value for the number of threads\\n may be altered to a new value before the next call to `Highs_run` or one of\\n the `Highs_XXXcall` methods.\\n\\n @param blocking   If the `blocking` parameter has a nonzero value, then this\\n                   function will not return until all memory is freed, which\\n                   might be desirable when debugging heap memory, but it\\n                   requires the calling thread to wait for all scheduler\\n                   threads to wake-up which is usually not necessary.\\n\\n @returns No status is returned since the function call cannot fail. Calling\\n this function while any Highs instance is in use on any thread is\\n undefined behavior and may cause crashes, but cannot be detected and hence\\n is fully in the callers responsibility.\"]\n    pub fn Highs_resetGlobalScheduler(blocking: HighsInt);\n}\nunsafe extern \"C\" {\n    #[doc = \" Get a void* pointer to a callback data item\\n\\n @param data_out      A pointer to the HighsCallbackDataOut instance.\\n @param item_name     The name of the item.\\n\\n @returns A void* pointer to the callback data item, or NULL if item_name not\\n valid\"]\n    pub fn Highs_getCallbackDataOutItem(\n        data_out: *const HighsCallbackDataOut,\n        item_name: *const ::std::os::raw::c_char,\n    ) -> *const ::std::os::raw::c_void;\n}\nunsafe extern \"C\" {\n    #[doc = \" Set a solution within a callback by passing a subset of the values.\\n\\n For any values that are unavailable/unknown, pass kHighsUndefined.\\n\\n @param data_in     A pointer to the callback input data instance.\\n @param num_entries Number of variables in the set\\n @param value       An array of length [num_entries <= num_col] with\\n                    column solution values.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_setCallbackSolution(\n        data_in: *mut HighsCallbackDataIn,\n        num_entries: HighsInt,\n        value: *const f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Set a partial primal solution by passing values for a set of variables,\\n within a valid callback.\\n\\n @param data_in     A pointer to the callback input data instance.\\n @param num_entries Number of variables in the set\\n @param index       Indices of variables in the set\\n @param value       Values of variables in the set\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_setCallbackSparseSolution(\n        data_in: *mut HighsCallbackDataIn,\n        num_entries: HighsInt,\n        index: *const HighsInt,\n        value: *const f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Finds a feasible solution for a given (partial) primal user solution,\\n within a valid callback.\\n\\n On success, the user solution is updated within the callback input data\\n instance.\\n\\n @returns A `kHighsStatus` constant indicating whether the call succeeded.\"]\n    pub fn Highs_repairCallbackSolution(data_in: *mut HighsCallbackDataIn) -> HighsInt;\n}\nunsafe extern \"C\" {\n    #[doc = \" Return the HiGHS compilation date.\\n\\n @returns Thse HiGHS compilation date.\"]\n    pub fn Highs_compilationDate() -> *const ::std::os::raw::c_char;\n}\nunsafe extern \"C\" {\n    pub fn Highs_call(\n        num_col: HighsInt,\n        num_row: HighsInt,\n        num_nz: HighsInt,\n        col_cost: *const f64,\n        col_lower: *const f64,\n        col_upper: *const f64,\n        row_lower: *const f64,\n        row_upper: *const f64,\n        a_start: *const HighsInt,\n        a_index: *const HighsInt,\n        a_value: *const f64,\n        col_value: *mut f64,\n        col_dual: *mut f64,\n        row_value: *mut f64,\n        row_dual: *mut f64,\n        col_basis_status: *mut HighsInt,\n        row_basis_status: *mut HighsInt,\n        model_status: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    pub fn Highs_runQuiet(highs: *mut ::std::os::raw::c_void) -> HighsInt;\n}\nunsafe extern \"C\" {\n    pub fn Highs_setHighsLogfile(\n        highs: *mut ::std::os::raw::c_void,\n        logfile: *const ::std::os::raw::c_void,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    pub fn Highs_setHighsOutput(\n        highs: *mut ::std::os::raw::c_void,\n        outputfile: *const ::std::os::raw::c_void,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    pub fn Highs_getIterationCount(highs: *const ::std::os::raw::c_void) -> HighsInt;\n}\nunsafe extern \"C\" {\n    pub fn Highs_getSimplexIterationCount(highs: *const ::std::os::raw::c_void) -> HighsInt;\n}\nunsafe extern \"C\" {\n    pub fn Highs_setHighsBoolOptionValue(\n        highs: *mut ::std::os::raw::c_void,\n        option: *const ::std::os::raw::c_char,\n        value: HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    pub fn Highs_setHighsIntOptionValue(\n        highs: *mut ::std::os::raw::c_void,\n        option: *const ::std::os::raw::c_char,\n        value: HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    pub fn Highs_setHighsDoubleOptionValue(\n        highs: *mut ::std::os::raw::c_void,\n        option: *const ::std::os::raw::c_char,\n        value: f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    pub fn Highs_setHighsStringOptionValue(\n        highs: *mut ::std::os::raw::c_void,\n        option: *const ::std::os::raw::c_char,\n        value: *const ::std::os::raw::c_char,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    pub fn Highs_setHighsOptionValue(\n        highs: *mut ::std::os::raw::c_void,\n        option: *const ::std::os::raw::c_char,\n        value: *const ::std::os::raw::c_char,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    pub fn Highs_getHighsBoolOptionValue(\n        highs: *const ::std::os::raw::c_void,\n        option: *const ::std::os::raw::c_char,\n        value: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    pub fn Highs_getHighsIntOptionValue(\n        highs: *const ::std::os::raw::c_void,\n        option: *const ::std::os::raw::c_char,\n        value: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    pub fn Highs_getHighsDoubleOptionValue(\n        highs: *const ::std::os::raw::c_void,\n        option: *const ::std::os::raw::c_char,\n        value: *mut f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    pub fn Highs_getHighsStringOptionValue(\n        highs: *const ::std::os::raw::c_void,\n        option: *const ::std::os::raw::c_char,\n        value: *mut ::std::os::raw::c_char,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    pub fn Highs_getHighsOptionType(\n        highs: *const ::std::os::raw::c_void,\n        option: *const ::std::os::raw::c_char,\n        type_: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    pub fn Highs_resetHighsOptions(highs: *mut ::std::os::raw::c_void) -> HighsInt;\n}\nunsafe extern \"C\" {\n    pub fn Highs_getHighsIntInfoValue(\n        highs: *const ::std::os::raw::c_void,\n        info: *const ::std::os::raw::c_char,\n        value: *mut HighsInt,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    pub fn Highs_getHighsDoubleInfoValue(\n        highs: *const ::std::os::raw::c_void,\n        info: *const ::std::os::raw::c_char,\n        value: *mut f64,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    pub fn Highs_getNumCols(highs: *const ::std::os::raw::c_void) -> HighsInt;\n}\nunsafe extern \"C\" {\n    pub fn Highs_getNumRows(highs: *const ::std::os::raw::c_void) -> HighsInt;\n}\nunsafe extern \"C\" {\n    pub fn Highs_getHighsInfinity(highs: *const ::std::os::raw::c_void) -> f64;\n}\nunsafe extern \"C\" {\n    pub fn Highs_getHighsRunTime(highs: *const ::std::os::raw::c_void) -> f64;\n}\nunsafe extern \"C\" {\n    pub fn Highs_setOptionValue(\n        highs: *mut ::std::os::raw::c_void,\n        option: *const ::std::os::raw::c_char,\n        value: *const ::std::os::raw::c_char,\n    ) -> HighsInt;\n}\nunsafe extern \"C\" {\n    pub fn Highs_getScaledModelStatus(highs: *const ::std::os::raw::c_void) -> HighsInt;\n}\n"
  },
  {
    "path": "ext/highs-sys/src/lib.rs",
    "content": "#![allow(non_upper_case_globals)]\n#![allow(non_camel_case_types)]\n#![allow(non_snake_case)]\n\ninclude!(\"c_bindings.rs\");\n\npub const MODEL_STATUS_NOTSET: HighsInt = 0;\npub const MODEL_STATUS_LOAD_ERROR: HighsInt = 1;\npub const MODEL_STATUS_MODEL_ERROR: HighsInt = 2;\npub const MODEL_STATUS_PRESOLVE_ERROR: HighsInt = 3;\npub const MODEL_STATUS_SOLVE_ERROR: HighsInt = 4;\npub const MODEL_STATUS_POSTSOLVE_ERROR: HighsInt = 5;\npub const MODEL_STATUS_MODEL_EMPTY: HighsInt = 6;\npub const MODEL_STATUS_OPTIMAL: HighsInt = 7;\npub const MODEL_STATUS_INFEASIBLE: HighsInt = 8;\npub const MODEL_STATUS_UNBOUNDED_OR_INFEASIBLE: HighsInt = 9;\npub const MODEL_STATUS_UNBOUNDED: HighsInt = 10;\npub const MODEL_STATUS_OBJECTIVE_BOUND: HighsInt = 11;\npub const MODEL_STATUS_OBJECTIVE_TARGET: HighsInt = 12;\npub const MODEL_STATUS_REACHED_TIME_LIMIT: HighsInt = 13;\npub const MODEL_STATUS_REACHED_ITERATION_LIMIT: HighsInt = 14;\npub const MODEL_STATUS_UNKNOWN: HighsInt = 15;\npub const MODEL_STATUS_MIN: HighsInt = MODEL_STATUS_NOTSET;\npub const MODEL_STATUS_MAX: HighsInt = MODEL_STATUS_UNKNOWN;\n\npub const STATUS_OK: HighsInt = 0;\npub const STATUS_WARNING: HighsInt = 1;\npub const STATUS_ERROR: HighsInt = -1;\n\npub const MATRIX_FORMAT_NONE: HighsInt = 0;\npub const MATRIX_FORMAT_COLUMN_WISE: HighsInt = 1;\npub const MATRIX_FORMAT_ROW_WISE: HighsInt = 2;\n\npub const OBJECTIVE_SENSE_MINIMIZE: HighsInt = 1;\npub const OBJECTIVE_SENSE_MAXIMIZE: HighsInt = -1;\n"
  },
  {
    "path": "ext/highs-sys/tests/test_highs_call.rs",
    "content": "use highs_sys::*;\nuse std::convert::TryInto;\n\n#[test]\nfn highs_call() {\n    // This illustrates the use of Highs_call, the simple C interface to\n    // HiGHS. It's designed to solve the general LP problem\n    //\n    // Min c^Tx subject to L <= Ax <= U; l <= x <= u\n    //\n    // where A is a matrix with m rows and n columns\n    //\n    // The scalar n is numcol\n    // The scalar m is numrow\n    //\n    // The vector c is colcost\n    // The vector l is collower\n    // The vector u is colupper\n    // The vector L is rowlower\n    // The vector U is rowupper\n    //\n    // The matrix A is represented in packed column-wise form: only its\n    // nonzeros are stored\n    //\n    // * The number of nonzeros in A is nnz\n    //\n    // * The row indices of the nonnzeros in A are stored column-by-column\n    // in aindex\n    //\n    // * The values of the nonnzeros in A are stored column-by-column in\n    // avalue\n    //\n    // * The position in aindex/avalue of the index/value of the first\n    // nonzero in each column is stored in astart\n    //\n    // Note that astart[0] must be zero\n    //\n    // After a successful call to Highs_call, the primal and dual\n    // solution, and the simplex basis are returned as follows\n    //\n    // The vector x is colvalue\n    // The vector Ax is rowvalue\n    // The vector of dual values for the variables x is coldual\n    // The vector of dual values for the variables Ax is rowdual\n    // The basic/nonbasic status of the variables x is colbasisstatus\n    // The basic/nonbasic status of the variables Ax is rowbasisstatus\n    //\n    // The status of the solution obtained is modelstatus\n    //\n    // To solve maximization problems, the values in c must be negated\n    //\n    // The use of Highs_call is illustrated for the LP\n    //\n    // Min    f  = 2x_0 + 3x_1\n    // s.t.                x_1 <= 6\n    //       10 <=  x_0 + 2x_1 <= 14\n    //        8 <= 2x_0 +  x_1\n    // 0 <= x_0 <= 3; 1 <= x_1\n\n    let numcol: usize = 2;\n    let numrow: usize = 3;\n    let nnz: usize = 5;\n\n    // Define the column costs, lower bounds and upper bounds\n    let colcost: &[f64] = &[2.0, 3.0];\n    let collower: &[f64] = &[0.0, 1.0];\n    let colupper: &[f64] = &[3.0, 1.0e30];\n    // Define the row lower bounds and upper bounds\n    let rowlower: &[f64] = &[-1.0e30, 10.0, 8.0];\n    let rowupper: &[f64] = &[6.0, 14.0, 1.0e30];\n    // Define the constraint matrix column-wise\n    let astart: &[HighsInt] = &[0, 2];\n    let aindex: &[HighsInt] = &[1, 2, 0, 1, 2];\n    let avalue: &[f64] = &[1.0, 2.0, 1.0, 2.0, 1.0];\n\n    let colvalue: &mut [f64] = &mut vec![0.; numcol];\n    let coldual: &mut [f64] = &mut vec![0.; numcol];\n    let rowvalue: &mut [f64] = &mut vec![0.; numrow];\n    let rowdual: &mut [f64] = &mut vec![0.; numrow];\n\n    let colbasisstatus: &mut [HighsInt] = &mut vec![0; numcol];\n    let rowbasisstatus: &mut [HighsInt] = &mut vec![0; numrow];\n\n    let modelstatus: &mut HighsInt = &mut 0;\n    let offset = 0.0;\n\n    let status: HighsInt = unsafe {\n        Highs_lpCall(\n            numcol.try_into().unwrap(),\n            numrow.try_into().unwrap(),\n            nnz.try_into().unwrap(),\n            MATRIX_FORMAT_COLUMN_WISE,\n            OBJECTIVE_SENSE_MINIMIZE,\n            offset,\n            colcost.as_ptr(),\n            collower.as_ptr(),\n            colupper.as_ptr(),\n            rowlower.as_ptr(),\n            rowupper.as_ptr(),\n            astart.as_ptr(),\n            aindex.as_ptr(),\n            avalue.as_ptr(),\n            colvalue.as_mut_ptr(),\n            coldual.as_mut_ptr(),\n            rowvalue.as_mut_ptr(),\n            rowdual.as_mut_ptr(),\n            colbasisstatus.as_mut_ptr(),\n            rowbasisstatus.as_mut_ptr(),\n            modelstatus,\n        )\n    };\n\n    assert_eq!(status, STATUS_OK);\n    assert_eq!(colvalue, &[2., 4.]);\n}\n"
  },
  {
    "path": "ext/highs-sys/tests/test_highs_functions.rs",
    "content": "use std::convert::TryInto;\nuse std::ffi::CString;\n\nuse highs_sys::*;\n\nfn c(n: usize) -> HighsInt {\n    n.try_into().unwrap()\n}\n\nfn ptr<T>(a: &mut [T]) -> *mut T {\n    a.as_mut_ptr()\n}\n\n#[test]\nfn highs_functions() {\n    unsafe {\n        // Form and solve the LP\n        // Max    f  = 2x_0 + 3x_1\n        // s.t.                x_1 <= 6\n        //       10 <=  x_0 + 2x_1 <= 14\n        //        8 <= 2x_0 +  x_1\n        // 0 <= x_0 <= 3; 1 <= x_1\n\n        let highs = Highs_create();\n\n        // Solving the problem without printing to the standard output\n        let option_name = CString::new(\"output_flag\").unwrap();\n        Highs_setBoolOptionValue(highs, option_name.as_ptr(), 0);\n\n        let numcol: usize = 2;\n        let numrow: usize = 3;\n        let nnz: usize = 5;\n\n        let inf = Highs_getInfinity(highs);\n\n        // Define the column costs, lower bounds and upper bounds\n        let colcost: &mut [f64] = &mut [2.0, 3.0];\n        let collower: &mut [f64] = &mut [0.0, 1.0];\n        let colupper: &mut [f64] = &mut [3.0, inf];\n        // Define the row lower bounds and upper bounds\n        let rowlower: &mut [f64] = &mut [-inf, 10.0, 8.0];\n        let rowupper: &mut [f64] = &mut [6.0, 14.0, inf];\n\n        // Define the constraint matrix row-wise, as it is added to the LP\n        // with the rows\n        let arstart: &mut [HighsInt] = &mut [0, 1, 3];\n        let arindex: &mut [HighsInt] = &mut [1, 0, 1, 0, 1];\n        let arvalue: &mut [f64] = &mut [1.0, 1.0, 2.0, 2.0, 1.0];\n\n        use std::ptr::null;\n\n        // Add two columns to the empty LP\n        let success = Highs_addCols(\n            highs,\n            c(numcol),\n            ptr(colcost),\n            ptr(collower),\n            ptr(colupper),\n            0,\n            null(),\n            null(),\n            null(),\n        );\n        assert_eq!(STATUS_OK, success, \"addCols\");\n        // Add three rows to the 2-column LP\n        let success = Highs_addRows(\n            highs,\n            c(numrow),\n            ptr(rowlower),\n            ptr(rowupper),\n            c(nnz),\n            ptr(arstart),\n            ptr(arindex),\n            ptr(arvalue),\n        );\n        assert_eq!(STATUS_OK, success, \"addRows\");\n\n        let success = Highs_changeObjectiveSense(highs, OBJECTIVE_SENSE_MAXIMIZE);\n        assert_eq!(success, STATUS_OK);\n\n        let simplex_scale_strategy = 3;\n        let option_name = CString::new(\"simplex_scale_strategy\").unwrap();\n        Highs_setIntOptionValue(highs, option_name.as_ptr(), simplex_scale_strategy);\n\n        let status = Highs_run(highs);\n        assert_eq!(status, STATUS_OK);\n\n        let model_status = Highs_getModelStatus(highs);\n        assert_eq!(model_status, MODEL_STATUS_OPTIMAL);\n\n        let mut objective_function_value = 0.;\n        let info_name = CString::new(\"objective_function_value\").unwrap();\n        Highs_getHighsDoubleInfoValue(\n            highs,\n            info_name.as_ptr(),\n            (&mut objective_function_value) as *mut f64,\n        );\n        assert_eq!(objective_function_value, 2. * 3. + 3. * 5.5);\n\n        let colvalue: &mut [f64] = &mut vec![0.; numcol];\n        let coldual: &mut [f64] = &mut vec![0.; numcol];\n        let rowvalue: &mut [f64] = &mut vec![0.; numrow];\n        let rowdual: &mut [f64] = &mut vec![0.; numrow];\n\n        // Get the primal and dual solution\n        Highs_getSolution(\n            highs,\n            ptr(colvalue),\n            ptr(coldual),\n            ptr(rowvalue),\n            ptr(rowdual),\n        );\n        assert_eq!(colvalue, &[3.0, 5.5]);\n\n        let colbasisstatus: &mut [HighsInt] = &mut vec![0; numcol];\n        let rowbasisstatus: &mut [HighsInt] = &mut vec![0; numrow];\n        // Get the basis\n        Highs_getBasis(highs, ptr(colbasisstatus), ptr(rowbasisstatus));\n        assert_eq!(colbasisstatus, &[2, 1]);\n\n        Highs_destroy(highs);\n    }\n}\n\n#[cfg(not(target_os = \"windows\"))] // broken on windows\n#[test]\nfn highs_functions_multithread() {\n    let threads: Vec<_> = (0..128)\n        .map(|_| std::thread::spawn(highs_functions))\n        .collect();\n    for t in threads {\n        t.join().expect(\"Thread should not panic\");\n    }\n}\n"
  },
  {
    "path": "ext/highs-sys/wrapper.h",
    "content": "#include <interfaces/highs_c_api.h>\n"
  },
  {
    "path": "ext/hip_runtime-sys/.rustfmt.toml",
    "content": "disable_all_formatting = true\n"
  },
  {
    "path": "ext/hip_runtime-sys/Cargo.toml",
    "content": "[package]\nname = \"hip_runtime-sys\"\nversion = \"0.0.0\"\nauthors = [\"Andrzej Janik <vosen@vosen.pl>\"]\nedition = \"2021\"\nlinks = \"amdhip\"\n\n[lib]\n"
  },
  {
    "path": "ext/hip_runtime-sys/build.rs",
    "content": "fn main() {\n    if cfg!(windows) {\n        println!(\"cargo:rustc-link-arg=/DELAYLOAD:amdhip64_7.dll\");\n    } else {\n        println!(\"cargo:rustc-link-lib=dylib=amdhip64\");\n        println!(\"cargo:rustc-link-search=native=/opt/rocm/lib/\");\n    }\n}\n"
  },
  {
    "path": "ext/hip_runtime-sys/src/lib.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\n#[repr(C)]\n#[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]\npub struct __BindgenBitfieldUnit<Storage> {\n    storage: Storage,\n}\nimpl<Storage> __BindgenBitfieldUnit<Storage> {\n    #[inline]\n    pub const fn new(storage: Storage) -> Self {\n        Self { storage }\n    }\n}\nimpl<Storage> __BindgenBitfieldUnit<Storage>\nwhere\n    Storage: AsRef<[u8]> + AsMut<[u8]>,\n{\n    #[inline]\n    pub fn get_bit(&self, index: usize) -> bool {\n        debug_assert!(index / 8 < self.storage.as_ref().len());\n        let byte_index = index / 8;\n        let byte = self.storage.as_ref()[byte_index];\n        let bit_index = if cfg!(target_endian = \"big\") {\n            7 - (index % 8)\n        } else {\n            index % 8\n        };\n        let mask = 1 << bit_index;\n        byte & mask == mask\n    }\n    #[inline]\n    pub fn set_bit(&mut self, index: usize, val: bool) {\n        debug_assert!(index / 8 < self.storage.as_ref().len());\n        let byte_index = index / 8;\n        let byte = &mut self.storage.as_mut()[byte_index];\n        let bit_index = if cfg!(target_endian = \"big\") {\n            7 - (index % 8)\n        } else {\n            index % 8\n        };\n        let mask = 1 << bit_index;\n        if val {\n            *byte |= mask;\n        } else {\n            *byte &= !mask;\n        }\n    }\n    #[inline]\n    pub fn get(&self, bit_offset: usize, bit_width: u8) -> u64 {\n        debug_assert!(bit_width <= 64);\n        debug_assert!(bit_offset / 8 < self.storage.as_ref().len());\n        debug_assert!(\n            (bit_offset + (bit_width as usize)) / 8 <= self.storage.as_ref().len(),\n        );\n        let mut val = 0;\n        for i in 0..(bit_width as usize) {\n            if self.get_bit(i + bit_offset) {\n                let index = if cfg!(target_endian = \"big\") {\n                    bit_width as usize - 1 - i\n                } else {\n                    i\n                };\n                val |= 1 << index;\n            }\n        }\n        val\n    }\n    #[inline]\n    pub fn set(&mut self, bit_offset: usize, bit_width: u8, val: u64) {\n        debug_assert!(bit_width <= 64);\n        debug_assert!(bit_offset / 8 < self.storage.as_ref().len());\n        debug_assert!(\n            (bit_offset + (bit_width as usize)) / 8 <= self.storage.as_ref().len(),\n        );\n        for i in 0..(bit_width as usize) {\n            let mask = 1 << i;\n            let val_bit_is_set = val & mask == mask;\n            let index = if cfg!(target_endian = \"big\") {\n                bit_width as usize - 1 - i\n            } else {\n                i\n            };\n            self.set_bit(index + bit_offset, val_bit_is_set);\n        }\n    }\n}\npub const hipTextureType1D: u32 = 1;\npub const hipTextureType2D: u32 = 2;\npub const hipTextureType3D: u32 = 3;\npub const hipTextureTypeCubemap: u32 = 12;\npub const hipTextureType1DLayered: u32 = 241;\npub const hipTextureType2DLayered: u32 = 242;\npub const hipTextureTypeCubemapLayered: u32 = 252;\npub const hipIpcMemLazyEnablePeerAccess: u32 = 1;\npub const hipStreamDefault: u32 = 0;\npub const hipStreamNonBlocking: u32 = 1;\npub const hipEventDefault: u32 = 0;\npub const hipEventBlockingSync: u32 = 1;\npub const hipEventDisableTiming: u32 = 2;\npub const hipEventInterprocess: u32 = 4;\npub const hipEventRecordDefault: u32 = 0;\npub const hipEventRecordExternal: u32 = 1;\npub const hipEventWaitDefault: u32 = 0;\npub const hipEventWaitExternal: u32 = 1;\npub const hipEventDisableSystemFence: u32 = 536870912;\npub const hipEventReleaseToDevice: u32 = 1073741824;\npub const hipEventReleaseToSystem: u32 = 2147483648;\npub const hipHostAllocDefault: u32 = 0;\npub const hipHostMallocDefault: u32 = 0;\npub const hipHostAllocPortable: u32 = 1;\npub const hipHostMallocPortable: u32 = 1;\npub const hipHostAllocMapped: u32 = 2;\npub const hipHostMallocMapped: u32 = 2;\npub const hipHostAllocWriteCombined: u32 = 4;\npub const hipHostMallocWriteCombined: u32 = 4;\npub const hipHostMallocNumaUser: u32 = 536870912;\npub const hipHostMallocCoherent: u32 = 1073741824;\npub const hipHostMallocNonCoherent: u32 = 2147483648;\npub const hipMemAttachGlobal: u32 = 1;\npub const hipMemAttachHost: u32 = 2;\npub const hipMemAttachSingle: u32 = 4;\npub const hipDeviceMallocDefault: u32 = 0;\npub const hipDeviceMallocFinegrained: u32 = 1;\npub const hipMallocSignalMemory: u32 = 2;\npub const hipDeviceMallocUncached: u32 = 3;\npub const hipDeviceMallocContiguous: u32 = 4;\npub const hipHostRegisterDefault: u32 = 0;\npub const hipHostRegisterPortable: u32 = 1;\npub const hipHostRegisterMapped: u32 = 2;\npub const hipHostRegisterIoMemory: u32 = 4;\npub const hipHostRegisterReadOnly: u32 = 8;\npub const hipExtHostRegisterCoarseGrained: u32 = 8;\npub const hipDeviceScheduleAuto: u32 = 0;\npub const hipDeviceScheduleSpin: u32 = 1;\npub const hipDeviceScheduleYield: u32 = 2;\npub const hipDeviceScheduleBlockingSync: u32 = 4;\npub const hipDeviceScheduleMask: u32 = 7;\npub const hipDeviceMapHost: u32 = 8;\npub const hipDeviceLmemResizeToMax: u32 = 16;\npub const hipArrayDefault: u32 = 0;\npub const hipArrayLayered: u32 = 1;\npub const hipArraySurfaceLoadStore: u32 = 2;\npub const hipArrayCubemap: u32 = 4;\npub const hipArrayTextureGather: u32 = 8;\npub const hipOccupancyDefault: u32 = 0;\npub const hipOccupancyDisableCachingOverride: u32 = 1;\npub const hipCooperativeLaunchMultiDeviceNoPreSync: u32 = 1;\npub const hipCooperativeLaunchMultiDeviceNoPostSync: u32 = 2;\npub const hipExtAnyOrderLaunch: u32 = 1;\npub const hipStreamWaitValueGte: u32 = 0;\npub const hipStreamWaitValueEq: u32 = 1;\npub const hipStreamWaitValueAnd: u32 = 2;\npub const hipStreamWaitValueNor: u32 = 3;\npub const hipExternalMemoryDedicated: u32 = 1;\npub const hipGraphKernelNodePortDefault: u32 = 0;\npub const hipGraphKernelNodePortLaunchCompletion: u32 = 2;\npub const hipGraphKernelNodePortProgrammatic: u32 = 1;\nimpl hipJitOption {\n    /**< CUDA Only Maximum registers may be used in a thread,\n< passed to compiler*/\n    pub const hipJitOptionMaxRegisters: hipJitOption = hipJitOption(0);\n}\nimpl hipJitOption {\n    ///< CUDA Only Number of thread per block\n    pub const hipJitOptionThreadsPerBlock: hipJitOption = hipJitOption(1);\n}\nimpl hipJitOption {\n    ///< CUDA Only Value for total wall clock time\n    pub const hipJitOptionWallTime: hipJitOption = hipJitOption(2);\n}\nimpl hipJitOption {\n    ///< CUDA Only Pointer to the buffer with logged information\n    pub const hipJitOptionInfoLogBuffer: hipJitOption = hipJitOption(3);\n}\nimpl hipJitOption {\n    ///< CUDA Only Size of the buffer in bytes for logged info\n    pub const hipJitOptionInfoLogBufferSizeBytes: hipJitOption = hipJitOption(4);\n}\nimpl hipJitOption {\n    ///< CUDA Only Pointer to the buffer with logged error(s)\n    pub const hipJitOptionErrorLogBuffer: hipJitOption = hipJitOption(5);\n}\nimpl hipJitOption {\n    ///< CUDA Only Size of the buffer in bytes for logged error(s)\n    pub const hipJitOptionErrorLogBufferSizeBytes: hipJitOption = hipJitOption(6);\n}\nimpl hipJitOption {\n    /**< Value of optimization level for generated codes, acceptable options\n< -O0, -O1, -O2, -O3*/\n    pub const hipJitOptionOptimizationLevel: hipJitOption = hipJitOption(7);\n}\nimpl hipJitOption {\n    ///< CUDA Only The target context, which is the default\n    pub const hipJitOptionTargetFromContext: hipJitOption = hipJitOption(8);\n}\nimpl hipJitOption {\n    ///< CUDA Only JIT target\n    pub const hipJitOptionTarget: hipJitOption = hipJitOption(9);\n}\nimpl hipJitOption {\n    ///< CUDA Only Fallback strategy\n    pub const hipJitOptionFallbackStrategy: hipJitOption = hipJitOption(10);\n}\nimpl hipJitOption {\n    ///< CUDA Only Generate debug information\n    pub const hipJitOptionGenerateDebugInfo: hipJitOption = hipJitOption(11);\n}\nimpl hipJitOption {\n    ///< CUDA Only Generate log verbose\n    pub const hipJitOptionLogVerbose: hipJitOption = hipJitOption(12);\n}\nimpl hipJitOption {\n    ///< CUDA Only Generate line number information\n    pub const hipJitOptionGenerateLineInfo: hipJitOption = hipJitOption(13);\n}\nimpl hipJitOption {\n    ///< CUDA Only Set cache mode\n    pub const hipJitOptionCacheMode: hipJitOption = hipJitOption(14);\n}\nimpl hipJitOption {\n    ///< @deprecated CUDA Only New SM3X option.\n    pub const hipJitOptionSm3xOpt: hipJitOption = hipJitOption(15);\n}\nimpl hipJitOption {\n    ///< CUDA Only Set fast compile\n    pub const hipJitOptionFastCompile: hipJitOption = hipJitOption(16);\n}\nimpl hipJitOption {\n    ///< CUDA Only Array of device symbol names to be relocated to the host\n    pub const hipJitOptionGlobalSymbolNames: hipJitOption = hipJitOption(17);\n}\nimpl hipJitOption {\n    ///< CUDA Only Array of host addresses to be relocated to the device\n    pub const hipJitOptionGlobalSymbolAddresses: hipJitOption = hipJitOption(18);\n}\nimpl hipJitOption {\n    ///< CUDA Only Number of symbol count.\n    pub const hipJitOptionGlobalSymbolCount: hipJitOption = hipJitOption(19);\n}\nimpl hipJitOption {\n    ///< @deprecated CUDA Only Enable link-time optimization for device code\n    pub const hipJitOptionLto: hipJitOption = hipJitOption(20);\n}\nimpl hipJitOption {\n    ///< @deprecated CUDA Only Set single-precision denormals.\n    pub const hipJitOptionFtz: hipJitOption = hipJitOption(21);\n}\nimpl hipJitOption {\n    /**< @deprecated CUDA Only Set single-precision floating-point division\n< and reciprocals*/\n    pub const hipJitOptionPrecDiv: hipJitOption = hipJitOption(22);\n}\nimpl hipJitOption {\n    ///< @deprecated CUDA Only Set single-precision floating-point square root\n    pub const hipJitOptionPrecSqrt: hipJitOption = hipJitOption(23);\n}\nimpl hipJitOption {\n    /**< @deprecated CUDA Only Enable floating-point multiplies and\n< adds/subtracts operations*/\n    pub const hipJitOptionFma: hipJitOption = hipJitOption(24);\n}\nimpl hipJitOption {\n    ///< CUDA Only Generates Position Independent code\n    pub const hipJitOptionPositionIndependentCode: hipJitOption = hipJitOption(25);\n}\nimpl hipJitOption {\n    /**< CUDA Only Hints to JIT compiler the minimum number of CTAs frin kernel's\n< grid to be mapped to SM*/\n    pub const hipJitOptionMinCTAPerSM: hipJitOption = hipJitOption(26);\n}\nimpl hipJitOption {\n    ///< CUDA only Maximum number of threads in a thread block\n    pub const hipJitOptionMaxThreadsPerBlock: hipJitOption = hipJitOption(27);\n}\nimpl hipJitOption {\n    ///< Cuda only Override Directive values\n    pub const hipJitOptionOverrideDirectiveValues: hipJitOption = hipJitOption(28);\n}\nimpl hipJitOption {\n    ///< Number of options\n    pub const hipJitOptionNumOptions: hipJitOption = hipJitOption(29);\n}\nimpl hipJitOption {\n    ///< Hip Only Linker options to be passed on to compiler\n    pub const hipJitOptionIRtoISAOptExt: hipJitOption = hipJitOption(10000);\n}\nimpl hipJitOption {\n    ///< Hip Only Count of linker options to be passed on to compiler\n    pub const hipJitOptionIRtoISAOptCountExt: hipJitOption = hipJitOption(10001);\n}\n#[repr(transparent)]\n/// hipJitOption\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipJitOption(pub ::core::ffi::c_uint);\nimpl hipJitInputType {\n    ///< Cuda only Input cubin\n    pub const hipJitInputCubin: hipJitInputType = hipJitInputType(0);\n}\nimpl hipJitInputType {\n    ///< Cuda only Input PTX\n    pub const hipJitInputPtx: hipJitInputType = hipJitInputType(1);\n}\nimpl hipJitInputType {\n    ///< Cuda Only Input FAT Binary\n    pub const hipJitInputFatBinary: hipJitInputType = hipJitInputType(2);\n}\nimpl hipJitInputType {\n    ///< Cuda Only Host Object with embedded device code\n    pub const hipJitInputObject: hipJitInputType = hipJitInputType(3);\n}\nimpl hipJitInputType {\n    /**< Cuda Only Archive of Host Objects with embedded\n< device code*/\n    pub const hipJitInputLibrary: hipJitInputType = hipJitInputType(4);\n}\nimpl hipJitInputType {\n    /**< @deprecated Cuda only High Level intermediate\n< code for LTO*/\n    pub const hipJitInputNvvm: hipJitInputType = hipJitInputType(5);\n}\nimpl hipJitInputType {\n    ///< Count of Legacy Input Types\n    pub const hipJitNumLegacyInputTypes: hipJitInputType = hipJitInputType(6);\n}\nimpl hipJitInputType {\n    ///< HIP Only LLVM Bitcode or IR assembly\n    pub const hipJitInputLLVMBitcode: hipJitInputType = hipJitInputType(100);\n}\nimpl hipJitInputType {\n    ///< HIP Only LLVM Clang Bundled Code\n    pub const hipJitInputLLVMBundledBitcode: hipJitInputType = hipJitInputType(101);\n}\nimpl hipJitInputType {\n    ///< HIP Only LLVM Archive of Bundled Bitcode\n    pub const hipJitInputLLVMArchivesOfBundledBitcode: hipJitInputType = hipJitInputType(\n        102,\n    );\n}\nimpl hipJitInputType {\n    ///< HIP Only SPIRV Code Object\n    pub const hipJitInputSpirv: hipJitInputType = hipJitInputType(103);\n}\nimpl hipJitInputType {\n    ///< Count of Input Types\n    pub const hipJitNumInputTypes: hipJitInputType = hipJitInputType(10);\n}\n#[repr(transparent)]\n/// hipJitInputType\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipJitInputType(pub ::core::ffi::c_uint);\nimpl hipJitCacheMode {\n    pub const hipJitCacheOptionNone: hipJitCacheMode = hipJitCacheMode(0);\n}\nimpl hipJitCacheMode {\n    pub const hipJitCacheOptionCG: hipJitCacheMode = hipJitCacheMode(1);\n}\nimpl hipJitCacheMode {\n    pub const hipJitCacheOptionCA: hipJitCacheMode = hipJitCacheMode(2);\n}\n#[repr(transparent)]\n/// hipJitCacheMode\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipJitCacheMode(pub ::core::ffi::c_uint);\nimpl hipJitFallback {\n    pub const hipJitPreferPTX: hipJitFallback = hipJitFallback(0);\n}\nimpl hipJitFallback {\n    pub const hipJitPreferBinary: hipJitFallback = hipJitFallback(1);\n}\n#[repr(transparent)]\n/// hipJitFallback\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipJitFallback(pub ::core::ffi::c_uint);\n#[doc = \" @defgroup GlobalDefs Global enum and defines\\n @{\\n\\n/\\n/**\\n hipDeviceArch_t\\n\"]\n#[repr(C)]\n#[repr(align(4))]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipDeviceArch_t {\n    pub _bitfield_align_1: [u8; 0],\n    pub _bitfield_1: __BindgenBitfieldUnit<[u8; 3usize]>,\n    pub __bindgen_padding_0: u8,\n}\nimpl hipDeviceArch_t {\n    #[inline]\n    pub fn hasGlobalInt32Atomics(&self) -> ::core::ffi::c_uint {\n        unsafe { ::core::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u32) }\n    }\n    #[inline]\n    pub fn set_hasGlobalInt32Atomics(&mut self, val: ::core::ffi::c_uint) {\n        unsafe {\n            let val: u32 = ::core::mem::transmute(val);\n            self._bitfield_1.set(0usize, 1u8, val as u64)\n        }\n    }\n    #[inline]\n    pub fn hasGlobalFloatAtomicExch(&self) -> ::core::ffi::c_uint {\n        unsafe { ::core::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u32) }\n    }\n    #[inline]\n    pub fn set_hasGlobalFloatAtomicExch(&mut self, val: ::core::ffi::c_uint) {\n        unsafe {\n            let val: u32 = ::core::mem::transmute(val);\n            self._bitfield_1.set(1usize, 1u8, val as u64)\n        }\n    }\n    #[inline]\n    pub fn hasSharedInt32Atomics(&self) -> ::core::ffi::c_uint {\n        unsafe { ::core::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u32) }\n    }\n    #[inline]\n    pub fn set_hasSharedInt32Atomics(&mut self, val: ::core::ffi::c_uint) {\n        unsafe {\n            let val: u32 = ::core::mem::transmute(val);\n            self._bitfield_1.set(2usize, 1u8, val as u64)\n        }\n    }\n    #[inline]\n    pub fn hasSharedFloatAtomicExch(&self) -> ::core::ffi::c_uint {\n        unsafe { ::core::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u32) }\n    }\n    #[inline]\n    pub fn set_hasSharedFloatAtomicExch(&mut self, val: ::core::ffi::c_uint) {\n        unsafe {\n            let val: u32 = ::core::mem::transmute(val);\n            self._bitfield_1.set(3usize, 1u8, val as u64)\n        }\n    }\n    #[inline]\n    pub fn hasFloatAtomicAdd(&self) -> ::core::ffi::c_uint {\n        unsafe { ::core::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u32) }\n    }\n    #[inline]\n    pub fn set_hasFloatAtomicAdd(&mut self, val: ::core::ffi::c_uint) {\n        unsafe {\n            let val: u32 = ::core::mem::transmute(val);\n            self._bitfield_1.set(4usize, 1u8, val as u64)\n        }\n    }\n    #[inline]\n    pub fn hasGlobalInt64Atomics(&self) -> ::core::ffi::c_uint {\n        unsafe { ::core::mem::transmute(self._bitfield_1.get(5usize, 1u8) as u32) }\n    }\n    #[inline]\n    pub fn set_hasGlobalInt64Atomics(&mut self, val: ::core::ffi::c_uint) {\n        unsafe {\n            let val: u32 = ::core::mem::transmute(val);\n            self._bitfield_1.set(5usize, 1u8, val as u64)\n        }\n    }\n    #[inline]\n    pub fn hasSharedInt64Atomics(&self) -> ::core::ffi::c_uint {\n        unsafe { ::core::mem::transmute(self._bitfield_1.get(6usize, 1u8) as u32) }\n    }\n    #[inline]\n    pub fn set_hasSharedInt64Atomics(&mut self, val: ::core::ffi::c_uint) {\n        unsafe {\n            let val: u32 = ::core::mem::transmute(val);\n            self._bitfield_1.set(6usize, 1u8, val as u64)\n        }\n    }\n    #[inline]\n    pub fn hasDoubles(&self) -> ::core::ffi::c_uint {\n        unsafe { ::core::mem::transmute(self._bitfield_1.get(7usize, 1u8) as u32) }\n    }\n    #[inline]\n    pub fn set_hasDoubles(&mut self, val: ::core::ffi::c_uint) {\n        unsafe {\n            let val: u32 = ::core::mem::transmute(val);\n            self._bitfield_1.set(7usize, 1u8, val as u64)\n        }\n    }\n    #[inline]\n    pub fn hasWarpVote(&self) -> ::core::ffi::c_uint {\n        unsafe { ::core::mem::transmute(self._bitfield_1.get(8usize, 1u8) as u32) }\n    }\n    #[inline]\n    pub fn set_hasWarpVote(&mut self, val: ::core::ffi::c_uint) {\n        unsafe {\n            let val: u32 = ::core::mem::transmute(val);\n            self._bitfield_1.set(8usize, 1u8, val as u64)\n        }\n    }\n    #[inline]\n    pub fn hasWarpBallot(&self) -> ::core::ffi::c_uint {\n        unsafe { ::core::mem::transmute(self._bitfield_1.get(9usize, 1u8) as u32) }\n    }\n    #[inline]\n    pub fn set_hasWarpBallot(&mut self, val: ::core::ffi::c_uint) {\n        unsafe {\n            let val: u32 = ::core::mem::transmute(val);\n            self._bitfield_1.set(9usize, 1u8, val as u64)\n        }\n    }\n    #[inline]\n    pub fn hasWarpShuffle(&self) -> ::core::ffi::c_uint {\n        unsafe { ::core::mem::transmute(self._bitfield_1.get(10usize, 1u8) as u32) }\n    }\n    #[inline]\n    pub fn set_hasWarpShuffle(&mut self, val: ::core::ffi::c_uint) {\n        unsafe {\n            let val: u32 = ::core::mem::transmute(val);\n            self._bitfield_1.set(10usize, 1u8, val as u64)\n        }\n    }\n    #[inline]\n    pub fn hasFunnelShift(&self) -> ::core::ffi::c_uint {\n        unsafe { ::core::mem::transmute(self._bitfield_1.get(11usize, 1u8) as u32) }\n    }\n    #[inline]\n    pub fn set_hasFunnelShift(&mut self, val: ::core::ffi::c_uint) {\n        unsafe {\n            let val: u32 = ::core::mem::transmute(val);\n            self._bitfield_1.set(11usize, 1u8, val as u64)\n        }\n    }\n    #[inline]\n    pub fn hasThreadFenceSystem(&self) -> ::core::ffi::c_uint {\n        unsafe { ::core::mem::transmute(self._bitfield_1.get(12usize, 1u8) as u32) }\n    }\n    #[inline]\n    pub fn set_hasThreadFenceSystem(&mut self, val: ::core::ffi::c_uint) {\n        unsafe {\n            let val: u32 = ::core::mem::transmute(val);\n            self._bitfield_1.set(12usize, 1u8, val as u64)\n        }\n    }\n    #[inline]\n    pub fn hasSyncThreadsExt(&self) -> ::core::ffi::c_uint {\n        unsafe { ::core::mem::transmute(self._bitfield_1.get(13usize, 1u8) as u32) }\n    }\n    #[inline]\n    pub fn set_hasSyncThreadsExt(&mut self, val: ::core::ffi::c_uint) {\n        unsafe {\n            let val: u32 = ::core::mem::transmute(val);\n            self._bitfield_1.set(13usize, 1u8, val as u64)\n        }\n    }\n    #[inline]\n    pub fn hasSurfaceFuncs(&self) -> ::core::ffi::c_uint {\n        unsafe { ::core::mem::transmute(self._bitfield_1.get(14usize, 1u8) as u32) }\n    }\n    #[inline]\n    pub fn set_hasSurfaceFuncs(&mut self, val: ::core::ffi::c_uint) {\n        unsafe {\n            let val: u32 = ::core::mem::transmute(val);\n            self._bitfield_1.set(14usize, 1u8, val as u64)\n        }\n    }\n    #[inline]\n    pub fn has3dGrid(&self) -> ::core::ffi::c_uint {\n        unsafe { ::core::mem::transmute(self._bitfield_1.get(15usize, 1u8) as u32) }\n    }\n    #[inline]\n    pub fn set_has3dGrid(&mut self, val: ::core::ffi::c_uint) {\n        unsafe {\n            let val: u32 = ::core::mem::transmute(val);\n            self._bitfield_1.set(15usize, 1u8, val as u64)\n        }\n    }\n    #[inline]\n    pub fn hasDynamicParallelism(&self) -> ::core::ffi::c_uint {\n        unsafe { ::core::mem::transmute(self._bitfield_1.get(16usize, 1u8) as u32) }\n    }\n    #[inline]\n    pub fn set_hasDynamicParallelism(&mut self, val: ::core::ffi::c_uint) {\n        unsafe {\n            let val: u32 = ::core::mem::transmute(val);\n            self._bitfield_1.set(16usize, 1u8, val as u64)\n        }\n    }\n    #[inline]\n    pub fn new_bitfield_1(\n        hasGlobalInt32Atomics: ::core::ffi::c_uint,\n        hasGlobalFloatAtomicExch: ::core::ffi::c_uint,\n        hasSharedInt32Atomics: ::core::ffi::c_uint,\n        hasSharedFloatAtomicExch: ::core::ffi::c_uint,\n        hasFloatAtomicAdd: ::core::ffi::c_uint,\n        hasGlobalInt64Atomics: ::core::ffi::c_uint,\n        hasSharedInt64Atomics: ::core::ffi::c_uint,\n        hasDoubles: ::core::ffi::c_uint,\n        hasWarpVote: ::core::ffi::c_uint,\n        hasWarpBallot: ::core::ffi::c_uint,\n        hasWarpShuffle: ::core::ffi::c_uint,\n        hasFunnelShift: ::core::ffi::c_uint,\n        hasThreadFenceSystem: ::core::ffi::c_uint,\n        hasSyncThreadsExt: ::core::ffi::c_uint,\n        hasSurfaceFuncs: ::core::ffi::c_uint,\n        has3dGrid: ::core::ffi::c_uint,\n        hasDynamicParallelism: ::core::ffi::c_uint,\n    ) -> __BindgenBitfieldUnit<[u8; 3usize]> {\n        let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 3usize]> = Default::default();\n        __bindgen_bitfield_unit\n            .set(\n                0usize,\n                1u8,\n                {\n                    let hasGlobalInt32Atomics: u32 = unsafe {\n                        ::core::mem::transmute(hasGlobalInt32Atomics)\n                    };\n                    hasGlobalInt32Atomics as u64\n                },\n            );\n        __bindgen_bitfield_unit\n            .set(\n                1usize,\n                1u8,\n                {\n                    let hasGlobalFloatAtomicExch: u32 = unsafe {\n                        ::core::mem::transmute(hasGlobalFloatAtomicExch)\n                    };\n                    hasGlobalFloatAtomicExch as u64\n                },\n            );\n        __bindgen_bitfield_unit\n            .set(\n                2usize,\n                1u8,\n                {\n                    let hasSharedInt32Atomics: u32 = unsafe {\n                        ::core::mem::transmute(hasSharedInt32Atomics)\n                    };\n                    hasSharedInt32Atomics as u64\n                },\n            );\n        __bindgen_bitfield_unit\n            .set(\n                3usize,\n                1u8,\n                {\n                    let hasSharedFloatAtomicExch: u32 = unsafe {\n                        ::core::mem::transmute(hasSharedFloatAtomicExch)\n                    };\n                    hasSharedFloatAtomicExch as u64\n                },\n            );\n        __bindgen_bitfield_unit\n            .set(\n                4usize,\n                1u8,\n                {\n                    let hasFloatAtomicAdd: u32 = unsafe {\n                        ::core::mem::transmute(hasFloatAtomicAdd)\n                    };\n                    hasFloatAtomicAdd as u64\n                },\n            );\n        __bindgen_bitfield_unit\n            .set(\n                5usize,\n                1u8,\n                {\n                    let hasGlobalInt64Atomics: u32 = unsafe {\n                        ::core::mem::transmute(hasGlobalInt64Atomics)\n                    };\n                    hasGlobalInt64Atomics as u64\n                },\n            );\n        __bindgen_bitfield_unit\n            .set(\n                6usize,\n                1u8,\n                {\n                    let hasSharedInt64Atomics: u32 = unsafe {\n                        ::core::mem::transmute(hasSharedInt64Atomics)\n                    };\n                    hasSharedInt64Atomics as u64\n                },\n            );\n        __bindgen_bitfield_unit\n            .set(\n                7usize,\n                1u8,\n                {\n                    let hasDoubles: u32 = unsafe { ::core::mem::transmute(hasDoubles) };\n                    hasDoubles as u64\n                },\n            );\n        __bindgen_bitfield_unit\n            .set(\n                8usize,\n                1u8,\n                {\n                    let hasWarpVote: u32 = unsafe {\n                        ::core::mem::transmute(hasWarpVote)\n                    };\n                    hasWarpVote as u64\n                },\n            );\n        __bindgen_bitfield_unit\n            .set(\n                9usize,\n                1u8,\n                {\n                    let hasWarpBallot: u32 = unsafe {\n                        ::core::mem::transmute(hasWarpBallot)\n                    };\n                    hasWarpBallot as u64\n                },\n            );\n        __bindgen_bitfield_unit\n            .set(\n                10usize,\n                1u8,\n                {\n                    let hasWarpShuffle: u32 = unsafe {\n                        ::core::mem::transmute(hasWarpShuffle)\n                    };\n                    hasWarpShuffle as u64\n                },\n            );\n        __bindgen_bitfield_unit\n            .set(\n                11usize,\n                1u8,\n                {\n                    let hasFunnelShift: u32 = unsafe {\n                        ::core::mem::transmute(hasFunnelShift)\n                    };\n                    hasFunnelShift as u64\n                },\n            );\n        __bindgen_bitfield_unit\n            .set(\n                12usize,\n                1u8,\n                {\n                    let hasThreadFenceSystem: u32 = unsafe {\n                        ::core::mem::transmute(hasThreadFenceSystem)\n                    };\n                    hasThreadFenceSystem as u64\n                },\n            );\n        __bindgen_bitfield_unit\n            .set(\n                13usize,\n                1u8,\n                {\n                    let hasSyncThreadsExt: u32 = unsafe {\n                        ::core::mem::transmute(hasSyncThreadsExt)\n                    };\n                    hasSyncThreadsExt as u64\n                },\n            );\n        __bindgen_bitfield_unit\n            .set(\n                14usize,\n                1u8,\n                {\n                    let hasSurfaceFuncs: u32 = unsafe {\n                        ::core::mem::transmute(hasSurfaceFuncs)\n                    };\n                    hasSurfaceFuncs as u64\n                },\n            );\n        __bindgen_bitfield_unit\n            .set(\n                15usize,\n                1u8,\n                {\n                    let has3dGrid: u32 = unsafe { ::core::mem::transmute(has3dGrid) };\n                    has3dGrid as u64\n                },\n            );\n        __bindgen_bitfield_unit\n            .set(\n                16usize,\n                1u8,\n                {\n                    let hasDynamicParallelism: u32 = unsafe {\n                        ::core::mem::transmute(hasDynamicParallelism)\n                    };\n                    hasDynamicParallelism as u64\n                },\n            );\n        __bindgen_bitfield_unit\n    }\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipUUID_t {\n    pub bytes: [::core::ffi::c_char; 16usize],\n}\npub type hipUUID = hipUUID_t;\n/** hipDeviceProp\n*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipDeviceProp_tR0600 {\n    ///< Device name.\n    pub name: [::core::ffi::c_char; 256usize],\n    ///< UUID of a device\n    pub uuid: hipUUID,\n    ///< 8-byte unique identifier. Only valid on windows\n    pub luid: [::core::ffi::c_char; 8usize],\n    ///< LUID node mask\n    pub luidDeviceNodeMask: ::core::ffi::c_uint,\n    ///< Size of global memory region (in bytes).\n    pub totalGlobalMem: usize,\n    ///< Size of shared memory per block (in bytes).\n    pub sharedMemPerBlock: usize,\n    ///< Registers per block.\n    pub regsPerBlock: ::core::ffi::c_int,\n    ///< Warp size.\n    pub warpSize: ::core::ffi::c_int,\n    /**< Maximum pitch in bytes allowed by memory copies\n< pitched memory*/\n    pub memPitch: usize,\n    ///< Max work items per work group or workgroup max size.\n    pub maxThreadsPerBlock: ::core::ffi::c_int,\n    ///< Max number of threads in each dimension (XYZ) of a block.\n    pub maxThreadsDim: [::core::ffi::c_int; 3usize],\n    ///< Max grid dimensions (XYZ).\n    pub maxGridSize: [::core::ffi::c_int; 3usize],\n    ///< Max clock frequency of the multiProcessors in khz.\n    pub clockRate: ::core::ffi::c_int,\n    /**< Size of shared constant memory region on the device\n< (in bytes).*/\n    pub totalConstMem: usize,\n    /**< Major compute capability.  On HCC, this is an approximation and features may\n< differ from CUDA CC.  See the arch feature flags for portable ways to query\n< feature caps.*/\n    pub major: ::core::ffi::c_int,\n    /**< Minor compute capability.  On HCC, this is an approximation and features may\n< differ from CUDA CC.  See the arch feature flags for portable ways to query\n< feature caps.*/\n    pub minor: ::core::ffi::c_int,\n    ///< Alignment requirement for textures\n    pub textureAlignment: usize,\n    ///< Pitch alignment requirement for texture references bound to\n    pub texturePitchAlignment: usize,\n    ///< Deprecated. Use asyncEngineCount instead\n    pub deviceOverlap: ::core::ffi::c_int,\n    ///< Number of multi-processors (compute units).\n    pub multiProcessorCount: ::core::ffi::c_int,\n    ///< Run time limit for kernels executed on the device\n    pub kernelExecTimeoutEnabled: ::core::ffi::c_int,\n    ///< APU vs dGPU\n    pub integrated: ::core::ffi::c_int,\n    ///< Check whether HIP can map host memory\n    pub canMapHostMemory: ::core::ffi::c_int,\n    ///< Compute mode.\n    pub computeMode: ::core::ffi::c_int,\n    ///< Maximum number of elements in 1D images\n    pub maxTexture1D: ::core::ffi::c_int,\n    ///< Maximum 1D mipmap texture size\n    pub maxTexture1DMipmap: ::core::ffi::c_int,\n    ///< Maximum size for 1D textures bound to linear memory\n    pub maxTexture1DLinear: ::core::ffi::c_int,\n    ///< Maximum dimensions (width, height) of 2D images, in image elements\n    pub maxTexture2D: [::core::ffi::c_int; 2usize],\n    ///< Maximum number of elements in 2D array mipmap of images\n    pub maxTexture2DMipmap: [::core::ffi::c_int; 2usize],\n    ///< Maximum 2D tex dimensions if tex are bound to pitched memory\n    pub maxTexture2DLinear: [::core::ffi::c_int; 3usize],\n    ///< Maximum 2D tex dimensions if gather has to be performed\n    pub maxTexture2DGather: [::core::ffi::c_int; 2usize],\n    /**< Maximum dimensions (width, height, depth) of 3D images, in image\n< elements*/\n    pub maxTexture3D: [::core::ffi::c_int; 3usize],\n    ///< Maximum alternate 3D texture dims\n    pub maxTexture3DAlt: [::core::ffi::c_int; 3usize],\n    ///< Maximum cubemap texture dims\n    pub maxTextureCubemap: ::core::ffi::c_int,\n    ///< Maximum number of elements in 1D array images\n    pub maxTexture1DLayered: [::core::ffi::c_int; 2usize],\n    ///< Maximum number of elements in 2D array images\n    pub maxTexture2DLayered: [::core::ffi::c_int; 3usize],\n    ///< Maximum cubemaps layered texture dims\n    pub maxTextureCubemapLayered: [::core::ffi::c_int; 2usize],\n    ///< Maximum 1D surface size\n    pub maxSurface1D: ::core::ffi::c_int,\n    ///< Maximum 2D surface size\n    pub maxSurface2D: [::core::ffi::c_int; 2usize],\n    ///< Maximum 3D surface size\n    pub maxSurface3D: [::core::ffi::c_int; 3usize],\n    ///< Maximum 1D layered surface size\n    pub maxSurface1DLayered: [::core::ffi::c_int; 2usize],\n    ///< Maximum 2D layared surface size\n    pub maxSurface2DLayered: [::core::ffi::c_int; 3usize],\n    ///< Maximum cubemap surface size\n    pub maxSurfaceCubemap: ::core::ffi::c_int,\n    ///< Maximum cubemap layered surface size\n    pub maxSurfaceCubemapLayered: [::core::ffi::c_int; 2usize],\n    ///< Alignment requirement for surface\n    pub surfaceAlignment: usize,\n    ///< Device can possibly execute multiple kernels concurrently.\n    pub concurrentKernels: ::core::ffi::c_int,\n    ///< Device has ECC support enabled\n    pub ECCEnabled: ::core::ffi::c_int,\n    ///< PCI Bus ID.\n    pub pciBusID: ::core::ffi::c_int,\n    ///< PCI Device ID.\n    pub pciDeviceID: ::core::ffi::c_int,\n    ///< PCI Domain ID\n    pub pciDomainID: ::core::ffi::c_int,\n    ///< 1:If device is Tesla device using TCC driver, else 0\n    pub tccDriver: ::core::ffi::c_int,\n    ///< Number of async engines\n    pub asyncEngineCount: ::core::ffi::c_int,\n    ///< Does device and host share unified address space\n    pub unifiedAddressing: ::core::ffi::c_int,\n    ///< Max global memory clock frequency in khz.\n    pub memoryClockRate: ::core::ffi::c_int,\n    ///< Global memory bus width in bits.\n    pub memoryBusWidth: ::core::ffi::c_int,\n    ///< L2 cache size.\n    pub l2CacheSize: ::core::ffi::c_int,\n    ///< Device's max L2 persisting lines in bytes\n    pub persistingL2CacheMaxSize: ::core::ffi::c_int,\n    ///< Maximum resident threads per multi-processor.\n    pub maxThreadsPerMultiProcessor: ::core::ffi::c_int,\n    ///< Device supports stream priority\n    pub streamPrioritiesSupported: ::core::ffi::c_int,\n    ///< Indicates globals are cached in L1\n    pub globalL1CacheSupported: ::core::ffi::c_int,\n    ///< Locals are cahced in L1\n    pub localL1CacheSupported: ::core::ffi::c_int,\n    ///< Amount of shared memory available per multiprocessor.\n    pub sharedMemPerMultiprocessor: usize,\n    ///< registers available per multiprocessor\n    pub regsPerMultiprocessor: ::core::ffi::c_int,\n    ///< Device supports allocating managed memory on this system\n    pub managedMemory: ::core::ffi::c_int,\n    ///< 1 if device is on a multi-GPU board, 0 if not.\n    pub isMultiGpuBoard: ::core::ffi::c_int,\n    ///< Unique identifier for a group of devices on same multiboard GPU\n    pub multiGpuBoardGroupID: ::core::ffi::c_int,\n    ///< Link between host and device supports native atomics\n    pub hostNativeAtomicSupported: ::core::ffi::c_int,\n    ///< Deprecated. CUDA only.\n    pub singleToDoublePrecisionPerfRatio: ::core::ffi::c_int,\n    /**< Device supports coherently accessing pageable memory\n< without calling hipHostRegister on it*/\n    pub pageableMemoryAccess: ::core::ffi::c_int,\n    /**< Device can coherently access managed memory concurrently with\n< the CPU*/\n    pub concurrentManagedAccess: ::core::ffi::c_int,\n    ///< Is compute preemption supported on the device\n    pub computePreemptionSupported: ::core::ffi::c_int,\n    /**< Device can access host registered memory with same\n< address as the host*/\n    pub canUseHostPointerForRegisteredMem: ::core::ffi::c_int,\n    ///< HIP device supports cooperative launch\n    pub cooperativeLaunch: ::core::ffi::c_int,\n    /**< HIP device supports cooperative launch on multiple\n< devices*/\n    pub cooperativeMultiDeviceLaunch: ::core::ffi::c_int,\n    ///< Per device m ax shared mem per block usable by special opt in\n    pub sharedMemPerBlockOptin: usize,\n    /**< Device accesses pageable memory via the host's\n< page tables*/\n    pub pageableMemoryAccessUsesHostPageTables: ::core::ffi::c_int,\n    /**< Host can directly access managed memory on the device\n< without migration*/\n    pub directManagedMemAccessFromHost: ::core::ffi::c_int,\n    ///< Max number of blocks on CU\n    pub maxBlocksPerMultiProcessor: ::core::ffi::c_int,\n    ///< Max value of access policy window\n    pub accessPolicyMaxWindowSize: ::core::ffi::c_int,\n    ///< Shared memory reserved by driver per block\n    pub reservedSharedMemPerBlock: usize,\n    ///< Device supports hipHostRegister\n    pub hostRegisterSupported: ::core::ffi::c_int,\n    ///< Indicates if device supports sparse hip arrays\n    pub sparseHipArraySupported: ::core::ffi::c_int,\n    /**< Device supports using the hipHostRegisterReadOnly flag\n< with hipHostRegistger*/\n    pub hostRegisterReadOnlySupported: ::core::ffi::c_int,\n    ///< Indicates external timeline semaphore support\n    pub timelineSemaphoreInteropSupported: ::core::ffi::c_int,\n    ///< Indicates if device supports hipMallocAsync and hipMemPool APIs\n    pub memoryPoolsSupported: ::core::ffi::c_int,\n    ///< Indicates device support of RDMA APIs\n    pub gpuDirectRDMASupported: ::core::ffi::c_int,\n    /**< Bitmask to be interpreted according to\n< hipFlushGPUDirectRDMAWritesOptions*/\n    pub gpuDirectRDMAFlushWritesOptions: ::core::ffi::c_uint,\n    ///< value of hipGPUDirectRDMAWritesOrdering\n    pub gpuDirectRDMAWritesOrdering: ::core::ffi::c_int,\n    ///< Bitmask of handle types support with mempool based IPC\n    pub memoryPoolSupportedHandleTypes: ::core::ffi::c_uint,\n    /**< Device supports deferred mapping HIP arrays and HIP\n< mipmapped arrays*/\n    pub deferredMappingHipArraySupported: ::core::ffi::c_int,\n    ///< Device supports IPC events\n    pub ipcEventSupported: ::core::ffi::c_int,\n    ///< Device supports cluster launch\n    pub clusterLaunch: ::core::ffi::c_int,\n    ///< Indicates device supports unified function pointers\n    pub unifiedFunctionPointers: ::core::ffi::c_int,\n    ///< CUDA Reserved.\n    pub reserved: [::core::ffi::c_int; 63usize],\n    ///< Reserved for adding new entries for HIP/CUDA.\n    pub hipReserved: [::core::ffi::c_int; 32usize],\n    ///< AMD GCN Arch Name. HIP Only.\n    pub gcnArchName: [::core::ffi::c_char; 256usize],\n    ///< Maximum Shared Memory Per CU. HIP Only.\n    pub maxSharedMemoryPerMultiProcessor: usize,\n    /**< Frequency in khz of the timer used by the device-side \"clock*\"\n< instructions.  New for HIP.*/\n    pub clockInstructionRate: ::core::ffi::c_int,\n    ///< Architectural feature flags.  New for HIP.\n    pub arch: hipDeviceArch_t,\n    ///< Addres of HDP_MEM_COHERENCY_FLUSH_CNTL register\n    pub hdpMemFlushCntl: *mut ::core::ffi::c_uint,\n    ///< Addres of HDP_REG_COHERENCY_FLUSH_CNTL register\n    pub hdpRegFlushCntl: *mut ::core::ffi::c_uint,\n    /**< HIP device supports cooperative launch on\n< multiple*/\n    pub cooperativeMultiDeviceUnmatchedFunc: ::core::ffi::c_int,\n    /**< HIP device supports cooperative launch on\n< multiple*/\n    pub cooperativeMultiDeviceUnmatchedGridDim: ::core::ffi::c_int,\n    /**< HIP device supports cooperative launch on\n< multiple*/\n    pub cooperativeMultiDeviceUnmatchedBlockDim: ::core::ffi::c_int,\n    /**< HIP device supports cooperative launch on\n< multiple*/\n    pub cooperativeMultiDeviceUnmatchedSharedMem: ::core::ffi::c_int,\n    ///< 1: if it is a large PCI bar device, else 0\n    pub isLargeBar: ::core::ffi::c_int,\n    ///< Revision of the GPU in this device\n    pub asicRevision: ::core::ffi::c_int,\n}\nimpl hipMemoryType {\n    ///< Unregistered memory\n    pub const hipMemoryTypeUnregistered: hipMemoryType = hipMemoryType(0);\n}\nimpl hipMemoryType {\n    ///< Memory is physically located on host\n    pub const hipMemoryTypeHost: hipMemoryType = hipMemoryType(1);\n}\nimpl hipMemoryType {\n    /**< Memory is physically located on device. (see deviceId for\n< specific device)*/\n    pub const hipMemoryTypeDevice: hipMemoryType = hipMemoryType(2);\n}\nimpl hipMemoryType {\n    /**< Managed memory, automaticallly managed by the unified\n< memory system\n< place holder for new values.*/\n    pub const hipMemoryTypeManaged: hipMemoryType = hipMemoryType(3);\n}\nimpl hipMemoryType {\n    /**< Array memory, physically located on device. (see deviceId for\n< specific device)*/\n    pub const hipMemoryTypeArray: hipMemoryType = hipMemoryType(10);\n}\nimpl hipMemoryType {\n    ///< unified address space\n    pub const hipMemoryTypeUnified: hipMemoryType = hipMemoryType(11);\n}\n#[repr(transparent)]\n/** hipMemoryType (for pointer attributes)\n\n @note hipMemoryType enum values are combination of cudaMemoryType and cuMemoryType and AMD specific enum values.\n*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipMemoryType(pub ::core::ffi::c_uint);\n/// Pointer attributes\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipPointerAttribute_t {\n    pub type_: hipMemoryType,\n    pub device: ::core::ffi::c_int,\n    pub devicePointer: *mut ::core::ffi::c_void,\n    pub hostPointer: *mut ::core::ffi::c_void,\n    pub isManaged: ::core::ffi::c_int,\n    pub allocationFlags: ::core::ffi::c_uint,\n}\nimpl hipDeviceAttribute_t {\n    pub const hipDeviceAttributeCudaCompatibleBegin: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        0,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Whether ECC support is enabled.\n    pub const hipDeviceAttributeEccEnabled: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        0,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Cuda only. The maximum size of the window policy in bytes.\n    pub const hipDeviceAttributeAccessPolicyMaxWindowSize: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        1,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Asynchronous engines number.\n    pub const hipDeviceAttributeAsyncEngineCount: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        2,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Whether host memory can be mapped into device address space\n    pub const hipDeviceAttributeCanMapHostMemory: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        3,\n    );\n}\nimpl hipDeviceAttribute_t {\n    /**< Device can access host registered memory\n< at the same virtual address as the CPU*/\n    pub const hipDeviceAttributeCanUseHostPointerForRegisteredMem: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        4,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Peak clock frequency in kilohertz.\n    pub const hipDeviceAttributeClockRate: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        5,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Compute mode that device is currently in.\n    pub const hipDeviceAttributeComputeMode: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        6,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Device supports Compute Preemption.\n    pub const hipDeviceAttributeComputePreemptionSupported: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        7,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Device can possibly execute multiple kernels concurrently.\n    pub const hipDeviceAttributeConcurrentKernels: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        8,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Device can coherently access managed memory concurrently with the CPU\n    pub const hipDeviceAttributeConcurrentManagedAccess: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        9,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Support cooperative launch\n    pub const hipDeviceAttributeCooperativeLaunch: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        10,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Support cooperative launch on multiple devices\n    pub const hipDeviceAttributeCooperativeMultiDeviceLaunch: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        11,\n    );\n}\nimpl hipDeviceAttribute_t {\n    /**< Device can concurrently copy memory and execute a kernel.\n< Deprecated. Use instead asyncEngineCount.*/\n    pub const hipDeviceAttributeDeviceOverlap: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        12,\n    );\n}\nimpl hipDeviceAttribute_t {\n    /**< Host can directly access managed memory on\n< the device without migration*/\n    pub const hipDeviceAttributeDirectManagedMemAccessFromHost: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        13,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Device supports caching globals in L1\n    pub const hipDeviceAttributeGlobalL1CacheSupported: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        14,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Link between the device and the host supports native atomic operations\n    pub const hipDeviceAttributeHostNativeAtomicSupported: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        15,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Device is integrated GPU\n    pub const hipDeviceAttributeIntegrated: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        16,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Multiple GPU devices.\n    pub const hipDeviceAttributeIsMultiGpuBoard: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        17,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Run time limit for kernels executed on the device\n    pub const hipDeviceAttributeKernelExecTimeout: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        18,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Size of L2 cache in bytes. 0 if the device doesn't have L2 cache.\n    pub const hipDeviceAttributeL2CacheSize: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        19,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< caching locals in L1 is supported\n    pub const hipDeviceAttributeLocalL1CacheSupported: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        20,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< 8-byte locally unique identifier in 8 bytes. Undefined on TCC and non-Windows platforms\n    pub const hipDeviceAttributeLuid: hipDeviceAttribute_t = hipDeviceAttribute_t(21);\n}\nimpl hipDeviceAttribute_t {\n    ///< Luid device node mask. Undefined on TCC and non-Windows platforms\n    pub const hipDeviceAttributeLuidDeviceNodeMask: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        22,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Major compute capability version number.\n    pub const hipDeviceAttributeComputeCapabilityMajor: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        23,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Device supports allocating managed memory on this system\n    pub const hipDeviceAttributeManagedMemory: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        24,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Max block size per multiprocessor\n    pub const hipDeviceAttributeMaxBlocksPerMultiProcessor: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        25,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Max block size in width.\n    pub const hipDeviceAttributeMaxBlockDimX: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        26,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Max block size in height.\n    pub const hipDeviceAttributeMaxBlockDimY: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        27,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Max block size in depth.\n    pub const hipDeviceAttributeMaxBlockDimZ: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        28,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Max grid size  in width.\n    pub const hipDeviceAttributeMaxGridDimX: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        29,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Max grid size  in height.\n    pub const hipDeviceAttributeMaxGridDimY: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        30,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Max grid size  in depth.\n    pub const hipDeviceAttributeMaxGridDimZ: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        31,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Maximum size of 1D surface.\n    pub const hipDeviceAttributeMaxSurface1D: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        32,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Cuda only. Maximum dimensions of 1D layered surface.\n    pub const hipDeviceAttributeMaxSurface1DLayered: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        33,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Maximum dimension (width, height) of 2D surface.\n    pub const hipDeviceAttributeMaxSurface2D: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        34,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Cuda only. Maximum dimensions of 2D layered surface.\n    pub const hipDeviceAttributeMaxSurface2DLayered: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        35,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Maximum dimension (width, height, depth) of 3D surface.\n    pub const hipDeviceAttributeMaxSurface3D: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        36,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Cuda only. Maximum dimensions of Cubemap surface.\n    pub const hipDeviceAttributeMaxSurfaceCubemap: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        37,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Cuda only. Maximum dimension of Cubemap layered surface.\n    pub const hipDeviceAttributeMaxSurfaceCubemapLayered: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        38,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Maximum size of 1D texture.\n    pub const hipDeviceAttributeMaxTexture1DWidth: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        39,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Maximum dimensions of 1D layered texture.\n    pub const hipDeviceAttributeMaxTexture1DLayered: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        40,\n    );\n}\nimpl hipDeviceAttribute_t {\n    /**< Maximum number of elements allocatable in a 1D linear texture.\n< Use cudaDeviceGetTexture1DLinearMaxWidth() instead on Cuda.*/\n    pub const hipDeviceAttributeMaxTexture1DLinear: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        41,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Maximum size of 1D mipmapped texture.\n    pub const hipDeviceAttributeMaxTexture1DMipmap: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        42,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Maximum dimension width of 2D texture.\n    pub const hipDeviceAttributeMaxTexture2DWidth: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        43,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Maximum dimension hight of 2D texture.\n    pub const hipDeviceAttributeMaxTexture2DHeight: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        44,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Maximum dimensions of 2D texture if gather operations  performed.\n    pub const hipDeviceAttributeMaxTexture2DGather: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        45,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Maximum dimensions of 2D layered texture.\n    pub const hipDeviceAttributeMaxTexture2DLayered: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        46,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Maximum dimensions (width, height, pitch) of 2D textures bound to pitched memory.\n    pub const hipDeviceAttributeMaxTexture2DLinear: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        47,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Maximum dimensions of 2D mipmapped texture.\n    pub const hipDeviceAttributeMaxTexture2DMipmap: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        48,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Maximum dimension width of 3D texture.\n    pub const hipDeviceAttributeMaxTexture3DWidth: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        49,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Maximum dimension height of 3D texture.\n    pub const hipDeviceAttributeMaxTexture3DHeight: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        50,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Maximum dimension depth of 3D texture.\n    pub const hipDeviceAttributeMaxTexture3DDepth: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        51,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Maximum dimensions of alternate 3D texture.\n    pub const hipDeviceAttributeMaxTexture3DAlt: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        52,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Maximum dimensions of Cubemap texture\n    pub const hipDeviceAttributeMaxTextureCubemap: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        53,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Maximum dimensions of Cubemap layered texture.\n    pub const hipDeviceAttributeMaxTextureCubemapLayered: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        54,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Maximum dimension of a block\n    pub const hipDeviceAttributeMaxThreadsDim: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        55,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Maximum number of threads per block.\n    pub const hipDeviceAttributeMaxThreadsPerBlock: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        56,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Maximum resident threads per multiprocessor.\n    pub const hipDeviceAttributeMaxThreadsPerMultiProcessor: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        57,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Maximum pitch in bytes allowed by memory copies\n    pub const hipDeviceAttributeMaxPitch: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        58,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Global memory bus width in bits.\n    pub const hipDeviceAttributeMemoryBusWidth: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        59,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Peak memory clock frequency in kilohertz.\n    pub const hipDeviceAttributeMemoryClockRate: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        60,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Minor compute capability version number.\n    pub const hipDeviceAttributeComputeCapabilityMinor: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        61,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Unique ID of device group on the same multi-GPU board\n    pub const hipDeviceAttributeMultiGpuBoardGroupID: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        62,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Number of multiprocessors on the device.\n    pub const hipDeviceAttributeMultiprocessorCount: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        63,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Previously hipDeviceAttributeName\n    pub const hipDeviceAttributeUnused1: hipDeviceAttribute_t = hipDeviceAttribute_t(64);\n}\nimpl hipDeviceAttribute_t {\n    /**< Device supports coherently accessing pageable memory\n< without calling hipHostRegister on it*/\n    pub const hipDeviceAttributePageableMemoryAccess: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        65,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Device accesses pageable memory via the host's page tables\n    pub const hipDeviceAttributePageableMemoryAccessUsesHostPageTables: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        66,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< PCI Bus ID.\n    pub const hipDeviceAttributePciBusId: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        67,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< PCI Device ID.\n    pub const hipDeviceAttributePciDeviceId: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        68,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< PCI Domain ID.\n    pub const hipDeviceAttributePciDomainID: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        69,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Maximum l2 persisting lines capacity in bytes\n    pub const hipDeviceAttributePersistingL2CacheMaxSize: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        70,\n    );\n}\nimpl hipDeviceAttribute_t {\n    /**< 32-bit registers available to a thread block. This number is shared\n< by all thread blocks simultaneously resident on a multiprocessor.*/\n    pub const hipDeviceAttributeMaxRegistersPerBlock: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        71,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< 32-bit registers available per block.\n    pub const hipDeviceAttributeMaxRegistersPerMultiprocessor: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        72,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Shared memory reserved by CUDA driver per block.\n    pub const hipDeviceAttributeReservedSharedMemPerBlock: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        73,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Maximum shared memory available per block in bytes.\n    pub const hipDeviceAttributeMaxSharedMemoryPerBlock: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        74,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Maximum shared memory per block usable by special opt in.\n    pub const hipDeviceAttributeSharedMemPerBlockOptin: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        75,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Shared memory available per multiprocessor.\n    pub const hipDeviceAttributeSharedMemPerMultiprocessor: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        76,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Cuda only. Performance ratio of single precision to double precision.\n    pub const hipDeviceAttributeSingleToDoublePrecisionPerfRatio: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        77,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Whether to support stream priorities.\n    pub const hipDeviceAttributeStreamPrioritiesSupported: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        78,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Alignment requirement for surfaces\n    pub const hipDeviceAttributeSurfaceAlignment: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        79,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Cuda only. Whether device is a Tesla device using TCC driver\n    pub const hipDeviceAttributeTccDriver: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        80,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Alignment requirement for textures\n    pub const hipDeviceAttributeTextureAlignment: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        81,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Pitch alignment requirement for 2D texture references bound to pitched memory;\n    pub const hipDeviceAttributeTexturePitchAlignment: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        82,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Constant memory size in bytes.\n    pub const hipDeviceAttributeTotalConstantMemory: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        83,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Global memory available on devicice.\n    pub const hipDeviceAttributeTotalGlobalMem: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        84,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Cuda only. An unified address space shared with the host.\n    pub const hipDeviceAttributeUnifiedAddressing: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        85,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Previously hipDeviceAttributeUuid\n    pub const hipDeviceAttributeUnused2: hipDeviceAttribute_t = hipDeviceAttribute_t(86);\n}\nimpl hipDeviceAttribute_t {\n    ///< Warp size in threads.\n    pub const hipDeviceAttributeWarpSize: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        87,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Device supports HIP Stream Ordered Memory Allocator\n    pub const hipDeviceAttributeMemoryPoolsSupported: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        88,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Device supports HIP virtual memory management\n    pub const hipDeviceAttributeVirtualMemoryManagementSupported: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        89,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Can device support host memory registration via hipHostRegister\n    pub const hipDeviceAttributeHostRegisterSupported: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        90,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Supported handle mask for HIP Stream Ordered Memory Allocator\n    pub const hipDeviceAttributeMemoryPoolSupportedHandleTypes: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        91,\n    );\n}\nimpl hipDeviceAttribute_t {\n    pub const hipDeviceAttributeCudaCompatibleEnd: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        9999,\n    );\n}\nimpl hipDeviceAttribute_t {\n    pub const hipDeviceAttributeAmdSpecificBegin: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        10000,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Frequency in khz of the timer used by the device-side \"clock*\"\n    pub const hipDeviceAttributeClockInstructionRate: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        10000,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Previously hipDeviceAttributeArch\n    pub const hipDeviceAttributeUnused3: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        10001,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Maximum Shared Memory PerMultiprocessor.\n    pub const hipDeviceAttributeMaxSharedMemoryPerMultiprocessor: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        10002,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Previously hipDeviceAttributeGcnArch\n    pub const hipDeviceAttributeUnused4: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        10003,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Previously hipDeviceAttributeGcnArchName\n    pub const hipDeviceAttributeUnused5: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        10004,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Address of the HDP_MEM_COHERENCY_FLUSH_CNTL register\n    pub const hipDeviceAttributeHdpMemFlushCntl: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        10005,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Address of the HDP_REG_COHERENCY_FLUSH_CNTL register\n    pub const hipDeviceAttributeHdpRegFlushCntl: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        10006,\n    );\n}\nimpl hipDeviceAttribute_t {\n    /**< Supports cooperative launch on multiple\n< devices with unmatched functions*/\n    pub const hipDeviceAttributeCooperativeMultiDeviceUnmatchedFunc: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        10007,\n    );\n}\nimpl hipDeviceAttribute_t {\n    /**< Supports cooperative launch on multiple\n< devices with unmatched grid dimensions*/\n    pub const hipDeviceAttributeCooperativeMultiDeviceUnmatchedGridDim: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        10008,\n    );\n}\nimpl hipDeviceAttribute_t {\n    /**< Supports cooperative launch on multiple\n< devices with unmatched block dimensions*/\n    pub const hipDeviceAttributeCooperativeMultiDeviceUnmatchedBlockDim: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        10009,\n    );\n}\nimpl hipDeviceAttribute_t {\n    /**< Supports cooperative launch on multiple\n< devices with unmatched shared memories*/\n    pub const hipDeviceAttributeCooperativeMultiDeviceUnmatchedSharedMem: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        10010,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Whether it is LargeBar\n    pub const hipDeviceAttributeIsLargeBar: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        10011,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Revision of the GPU in this device\n    pub const hipDeviceAttributeAsicRevision: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        10012,\n    );\n}\nimpl hipDeviceAttribute_t {\n    /**< '1' if Device supports hipStreamWaitValue32() and\n< hipStreamWaitValue64(), '0' otherwise.*/\n    pub const hipDeviceAttributeCanUseStreamWaitValue: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        10013,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< '1' if Device supports image, '0' otherwise.\n    pub const hipDeviceAttributeImageSupport: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        10014,\n    );\n}\nimpl hipDeviceAttribute_t {\n    /**< All available physical compute\n< units for the device*/\n    pub const hipDeviceAttributePhysicalMultiProcessorCount: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        10015,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< '1' if Device supports fine grain, '0' otherwise\n    pub const hipDeviceAttributeFineGrainSupport: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        10016,\n    );\n}\nimpl hipDeviceAttribute_t {\n    ///< Constant frequency of wall clock in kilohertz.\n    pub const hipDeviceAttributeWallClockRate: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        10017,\n    );\n}\nimpl hipDeviceAttribute_t {\n    pub const hipDeviceAttributeAmdSpecificEnd: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        19999,\n    );\n}\nimpl hipDeviceAttribute_t {\n    pub const hipDeviceAttributeVendorSpecificBegin: hipDeviceAttribute_t = hipDeviceAttribute_t(\n        20000,\n    );\n}\n#[repr(transparent)]\n/** hipDeviceAttribute_t\n hipDeviceAttributeUnused number: 5*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipDeviceAttribute_t(pub ::core::ffi::c_uint);\nimpl hipDriverProcAddressQueryResult {\n    pub const HIP_GET_PROC_ADDRESS_SUCCESS: hipDriverProcAddressQueryResult = hipDriverProcAddressQueryResult(\n        0,\n    );\n}\nimpl hipDriverProcAddressQueryResult {\n    pub const HIP_GET_PROC_ADDRESS_SYMBOL_NOT_FOUND: hipDriverProcAddressQueryResult = hipDriverProcAddressQueryResult(\n        1,\n    );\n}\nimpl hipDriverProcAddressQueryResult {\n    pub const HIP_GET_PROC_ADDRESS_VERSION_NOT_SUFFICIENT: hipDriverProcAddressQueryResult = hipDriverProcAddressQueryResult(\n        2,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipDriverProcAddressQueryResult(pub ::core::ffi::c_uint);\nimpl hipComputeMode {\n    pub const hipComputeModeDefault: hipComputeMode = hipComputeMode(0);\n}\nimpl hipComputeMode {\n    pub const hipComputeModeExclusive: hipComputeMode = hipComputeMode(1);\n}\nimpl hipComputeMode {\n    pub const hipComputeModeProhibited: hipComputeMode = hipComputeMode(2);\n}\nimpl hipComputeMode {\n    pub const hipComputeModeExclusiveProcess: hipComputeMode = hipComputeMode(3);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipComputeMode(pub ::core::ffi::c_uint);\nimpl hipFlushGPUDirectRDMAWritesOptions {\n    pub const hipFlushGPUDirectRDMAWritesOptionHost: hipFlushGPUDirectRDMAWritesOptions = hipFlushGPUDirectRDMAWritesOptions(\n        1,\n    );\n}\nimpl hipFlushGPUDirectRDMAWritesOptions {\n    pub const hipFlushGPUDirectRDMAWritesOptionMemOps: hipFlushGPUDirectRDMAWritesOptions = hipFlushGPUDirectRDMAWritesOptions(\n        2,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipFlushGPUDirectRDMAWritesOptions(pub ::core::ffi::c_uint);\nimpl hipGPUDirectRDMAWritesOrdering {\n    pub const hipGPUDirectRDMAWritesOrderingNone: hipGPUDirectRDMAWritesOrdering = hipGPUDirectRDMAWritesOrdering(\n        0,\n    );\n}\nimpl hipGPUDirectRDMAWritesOrdering {\n    pub const hipGPUDirectRDMAWritesOrderingOwner: hipGPUDirectRDMAWritesOrdering = hipGPUDirectRDMAWritesOrdering(\n        100,\n    );\n}\nimpl hipGPUDirectRDMAWritesOrdering {\n    pub const hipGPUDirectRDMAWritesOrderingAllDevices: hipGPUDirectRDMAWritesOrdering = hipGPUDirectRDMAWritesOrdering(\n        200,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipGPUDirectRDMAWritesOrdering(pub ::core::ffi::c_uint);\n/**  @defgroup DriverTypes Driver Types\n  @{\n  This section describes the driver data types.\n*/\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipDeviceptr_t(pub *mut ::core::ffi::c_void);\nimpl hipChannelFormatKind {\n    ///< Signed channel format\n    pub const hipChannelFormatKindSigned: hipChannelFormatKind = hipChannelFormatKind(0);\n}\nimpl hipChannelFormatKind {\n    ///< Unsigned channel format\n    pub const hipChannelFormatKindUnsigned: hipChannelFormatKind = hipChannelFormatKind(\n        1,\n    );\n}\nimpl hipChannelFormatKind {\n    ///< Float channel format\n    pub const hipChannelFormatKindFloat: hipChannelFormatKind = hipChannelFormatKind(2);\n}\nimpl hipChannelFormatKind {\n    ///< No channel format\n    pub const hipChannelFormatKindNone: hipChannelFormatKind = hipChannelFormatKind(3);\n}\n#[repr(transparent)]\n/// HIP channel format kinds\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipChannelFormatKind(pub ::core::ffi::c_uint);\n/// HIP channel format descriptor\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipChannelFormatDesc {\n    pub x: ::core::ffi::c_int,\n    pub y: ::core::ffi::c_int,\n    pub z: ::core::ffi::c_int,\n    pub w: ::core::ffi::c_int,\n    ///< Channel format kind\n    pub f: hipChannelFormatKind,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct hipArray {\n    _unused: [u8; 0],\n}\npub type hipArray_t = *mut hipArray;\npub type hipArray_const_t = *const hipArray;\nimpl hipArray_Format {\n    ///< Unsigned 8-bit array format\n    pub const HIP_AD_FORMAT_UNSIGNED_INT8: hipArray_Format = hipArray_Format(1);\n}\nimpl hipArray_Format {\n    ///< Unsigned 16-bit array format\n    pub const HIP_AD_FORMAT_UNSIGNED_INT16: hipArray_Format = hipArray_Format(2);\n}\nimpl hipArray_Format {\n    ///< Unsigned 32-bit array format\n    pub const HIP_AD_FORMAT_UNSIGNED_INT32: hipArray_Format = hipArray_Format(3);\n}\nimpl hipArray_Format {\n    ///< Signed 8-bit array format\n    pub const HIP_AD_FORMAT_SIGNED_INT8: hipArray_Format = hipArray_Format(8);\n}\nimpl hipArray_Format {\n    ///< Signed 16-bit array format\n    pub const HIP_AD_FORMAT_SIGNED_INT16: hipArray_Format = hipArray_Format(9);\n}\nimpl hipArray_Format {\n    ///< Signed 32-bit array format\n    pub const HIP_AD_FORMAT_SIGNED_INT32: hipArray_Format = hipArray_Format(10);\n}\nimpl hipArray_Format {\n    ///< Half array format\n    pub const HIP_AD_FORMAT_HALF: hipArray_Format = hipArray_Format(16);\n}\nimpl hipArray_Format {\n    ///< Float array format\n    pub const HIP_AD_FORMAT_FLOAT: hipArray_Format = hipArray_Format(32);\n}\n#[repr(transparent)]\n/// HIP array format\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipArray_Format(pub ::core::ffi::c_uint);\n/// HIP array descriptor\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct HIP_ARRAY_DESCRIPTOR {\n    ///< Width of the array\n    pub Width: usize,\n    ///< Height of the array\n    pub Height: usize,\n    ///< Format of the array\n    pub Format: hipArray_Format,\n    ///< Number of channels of the array\n    pub NumChannels: ::core::ffi::c_uint,\n}\n/// HIP 3D array descriptor\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct HIP_ARRAY3D_DESCRIPTOR {\n    ///< Width of the array\n    pub Width: usize,\n    ///< Height of the array\n    pub Height: usize,\n    ///< Depth of the array\n    pub Depth: usize,\n    ///< Format of the array\n    pub Format: hipArray_Format,\n    ///< Number of channels of the array\n    pub NumChannels: ::core::ffi::c_uint,\n    ///< Flags of the array\n    pub Flags: ::core::ffi::c_uint,\n}\n/// HIP 2D memory copy parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hip_Memcpy2D {\n    ///< Source width in bytes\n    pub srcXInBytes: usize,\n    ///< Source height\n    pub srcY: usize,\n    ///< Source memory type\n    pub srcMemoryType: hipMemoryType,\n    ///< Source pointer\n    pub srcHost: *const ::core::ffi::c_void,\n    ///< Source device\n    pub srcDevice: hipDeviceptr_t,\n    ///< Source array\n    pub srcArray: hipArray_t,\n    ///< Source pitch\n    pub srcPitch: usize,\n    ///< Destination width in bytes\n    pub dstXInBytes: usize,\n    ///< Destination height\n    pub dstY: usize,\n    ///< Destination memory type\n    pub dstMemoryType: hipMemoryType,\n    ///< Destination pointer\n    pub dstHost: *mut ::core::ffi::c_void,\n    ///< Destination device\n    pub dstDevice: hipDeviceptr_t,\n    ///< Destination array\n    pub dstArray: hipArray_t,\n    ///< Destination pitch\n    pub dstPitch: usize,\n    ///< Width in bytes of the 2D memory copy\n    pub WidthInBytes: usize,\n    ///< Height of the 2D memory copy\n    pub Height: usize,\n}\n/// HIP mipmapped array\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipMipmappedArray {\n    ///< Data pointer of the mipmapped array\n    pub data: *mut ::core::ffi::c_void,\n    ///< Description of the mipmapped array\n    pub desc: hipChannelFormatDesc,\n    ///< Type of the mipmapped array\n    pub type_: ::core::ffi::c_uint,\n    ///< Width of the mipmapped array\n    pub width: ::core::ffi::c_uint,\n    ///< Height of the mipmapped array\n    pub height: ::core::ffi::c_uint,\n    ///< Depth of the mipmapped array\n    pub depth: ::core::ffi::c_uint,\n    ///< Minimum level of the mipmapped array\n    pub min_mipmap_level: ::core::ffi::c_uint,\n    ///< Maximum level of the mipmapped array\n    pub max_mipmap_level: ::core::ffi::c_uint,\n    ///< Flags of the mipmapped array\n    pub flags: ::core::ffi::c_uint,\n    ///< Format of the mipmapped array\n    pub format: hipArray_Format,\n    ///< Number of channels of the mipmapped array\n    pub num_channels: ::core::ffi::c_uint,\n}\n/// HIP mipmapped array pointer\npub type hipMipmappedArray_t = *mut hipMipmappedArray;\npub type hipmipmappedArray = hipMipmappedArray_t;\npub type hipMipmappedArray_const_t = *const hipMipmappedArray;\nimpl hipResourceType {\n    ///< Array resource\n    pub const hipResourceTypeArray: hipResourceType = hipResourceType(0);\n}\nimpl hipResourceType {\n    ///< Mipmapped array resource\n    pub const hipResourceTypeMipmappedArray: hipResourceType = hipResourceType(1);\n}\nimpl hipResourceType {\n    ///< Linear resource\n    pub const hipResourceTypeLinear: hipResourceType = hipResourceType(2);\n}\nimpl hipResourceType {\n    ///< Pitch 2D resource\n    pub const hipResourceTypePitch2D: hipResourceType = hipResourceType(3);\n}\n#[repr(transparent)]\n/// HIP resource types\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipResourceType(pub ::core::ffi::c_uint);\nimpl HIPresourcetype_enum {\n    ///< Array resource\n    pub const HIP_RESOURCE_TYPE_ARRAY: HIPresourcetype_enum = HIPresourcetype_enum(0);\n}\nimpl HIPresourcetype_enum {\n    ///< Mipmapped array resource\n    pub const HIP_RESOURCE_TYPE_MIPMAPPED_ARRAY: HIPresourcetype_enum = HIPresourcetype_enum(\n        1,\n    );\n}\nimpl HIPresourcetype_enum {\n    ///< Linear resource\n    pub const HIP_RESOURCE_TYPE_LINEAR: HIPresourcetype_enum = HIPresourcetype_enum(2);\n}\nimpl HIPresourcetype_enum {\n    ///< Pitch 2D resource\n    pub const HIP_RESOURCE_TYPE_PITCH2D: HIPresourcetype_enum = HIPresourcetype_enum(3);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct HIPresourcetype_enum(pub ::core::ffi::c_uint);\npub use self::HIPresourcetype_enum as HIPresourcetype;\npub use self::HIPresourcetype_enum as hipResourcetype;\nimpl HIPaddress_mode_enum {\n    ///< Wrap address mode\n    pub const HIP_TR_ADDRESS_MODE_WRAP: HIPaddress_mode_enum = HIPaddress_mode_enum(0);\n}\nimpl HIPaddress_mode_enum {\n    ///< Clamp address mode\n    pub const HIP_TR_ADDRESS_MODE_CLAMP: HIPaddress_mode_enum = HIPaddress_mode_enum(1);\n}\nimpl HIPaddress_mode_enum {\n    ///< Mirror address mode\n    pub const HIP_TR_ADDRESS_MODE_MIRROR: HIPaddress_mode_enum = HIPaddress_mode_enum(2);\n}\nimpl HIPaddress_mode_enum {\n    ///< Border address mode\n    pub const HIP_TR_ADDRESS_MODE_BORDER: HIPaddress_mode_enum = HIPaddress_mode_enum(3);\n}\n#[repr(transparent)]\n/// HIP texture address modes\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct HIPaddress_mode_enum(pub ::core::ffi::c_uint);\n/// HIP texture address modes\npub use self::HIPaddress_mode_enum as HIPaddress_mode;\nimpl HIPfilter_mode_enum {\n    ///< Filter mode point\n    pub const HIP_TR_FILTER_MODE_POINT: HIPfilter_mode_enum = HIPfilter_mode_enum(0);\n}\nimpl HIPfilter_mode_enum {\n    ///< Filter mode linear\n    pub const HIP_TR_FILTER_MODE_LINEAR: HIPfilter_mode_enum = HIPfilter_mode_enum(1);\n}\n#[repr(transparent)]\n/// HIP filter modes\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct HIPfilter_mode_enum(pub ::core::ffi::c_uint);\n/// HIP filter modes\npub use self::HIPfilter_mode_enum as HIPfilter_mode;\n/// HIP texture descriptor\n#[repr(C)]\n#[derive(Debug, Copy, Clone, PartialEq)]\npub struct HIP_TEXTURE_DESC_st {\n    ///< Address modes\n    pub addressMode: [HIPaddress_mode; 3usize],\n    ///< Filter mode\n    pub filterMode: HIPfilter_mode,\n    ///< Flags\n    pub flags: ::core::ffi::c_uint,\n    ///< Maximum anisotropy ratio\n    pub maxAnisotropy: ::core::ffi::c_uint,\n    ///< Mipmap filter mode\n    pub mipmapFilterMode: HIPfilter_mode,\n    ///< Mipmap level bias\n    pub mipmapLevelBias: f32,\n    ///< Mipmap minimum level clamp\n    pub minMipmapLevelClamp: f32,\n    ///< Mipmap maximum level clamp\n    pub maxMipmapLevelClamp: f32,\n    ///< Border Color\n    pub borderColor: [f32; 4usize],\n    pub reserved: [::core::ffi::c_int; 12usize],\n}\n/// HIP texture descriptor\npub type HIP_TEXTURE_DESC = HIP_TEXTURE_DESC_st;\nimpl hipResourceViewFormat {\n    ///< No resource view format (use underlying resource format)\n    pub const hipResViewFormatNone: hipResourceViewFormat = hipResourceViewFormat(0);\n}\nimpl hipResourceViewFormat {\n    ///< 1 channel, unsigned 8-bit integers\n    pub const hipResViewFormatUnsignedChar1: hipResourceViewFormat = hipResourceViewFormat(\n        1,\n    );\n}\nimpl hipResourceViewFormat {\n    ///< 2 channels, unsigned 8-bit integers\n    pub const hipResViewFormatUnsignedChar2: hipResourceViewFormat = hipResourceViewFormat(\n        2,\n    );\n}\nimpl hipResourceViewFormat {\n    ///< 4 channels, unsigned 8-bit integers\n    pub const hipResViewFormatUnsignedChar4: hipResourceViewFormat = hipResourceViewFormat(\n        3,\n    );\n}\nimpl hipResourceViewFormat {\n    ///< 1 channel, signed 8-bit integers\n    pub const hipResViewFormatSignedChar1: hipResourceViewFormat = hipResourceViewFormat(\n        4,\n    );\n}\nimpl hipResourceViewFormat {\n    ///< 2 channels, signed 8-bit integers\n    pub const hipResViewFormatSignedChar2: hipResourceViewFormat = hipResourceViewFormat(\n        5,\n    );\n}\nimpl hipResourceViewFormat {\n    ///< 4 channels, signed 8-bit integers\n    pub const hipResViewFormatSignedChar4: hipResourceViewFormat = hipResourceViewFormat(\n        6,\n    );\n}\nimpl hipResourceViewFormat {\n    ///< 1 channel, unsigned 16-bit integers\n    pub const hipResViewFormatUnsignedShort1: hipResourceViewFormat = hipResourceViewFormat(\n        7,\n    );\n}\nimpl hipResourceViewFormat {\n    ///< 2 channels, unsigned 16-bit integers\n    pub const hipResViewFormatUnsignedShort2: hipResourceViewFormat = hipResourceViewFormat(\n        8,\n    );\n}\nimpl hipResourceViewFormat {\n    ///< 4 channels, unsigned 16-bit integers\n    pub const hipResViewFormatUnsignedShort4: hipResourceViewFormat = hipResourceViewFormat(\n        9,\n    );\n}\nimpl hipResourceViewFormat {\n    ///< 1 channel, signed 16-bit integers\n    pub const hipResViewFormatSignedShort1: hipResourceViewFormat = hipResourceViewFormat(\n        10,\n    );\n}\nimpl hipResourceViewFormat {\n    ///< 2 channels, signed 16-bit integers\n    pub const hipResViewFormatSignedShort2: hipResourceViewFormat = hipResourceViewFormat(\n        11,\n    );\n}\nimpl hipResourceViewFormat {\n    ///< 4 channels, signed 16-bit integers\n    pub const hipResViewFormatSignedShort4: hipResourceViewFormat = hipResourceViewFormat(\n        12,\n    );\n}\nimpl hipResourceViewFormat {\n    ///< 1 channel, unsigned 32-bit integers\n    pub const hipResViewFormatUnsignedInt1: hipResourceViewFormat = hipResourceViewFormat(\n        13,\n    );\n}\nimpl hipResourceViewFormat {\n    ///< 2 channels, unsigned 32-bit integers\n    pub const hipResViewFormatUnsignedInt2: hipResourceViewFormat = hipResourceViewFormat(\n        14,\n    );\n}\nimpl hipResourceViewFormat {\n    ///< 4 channels, unsigned 32-bit integers\n    pub const hipResViewFormatUnsignedInt4: hipResourceViewFormat = hipResourceViewFormat(\n        15,\n    );\n}\nimpl hipResourceViewFormat {\n    ///< 1 channel, signed 32-bit integers\n    pub const hipResViewFormatSignedInt1: hipResourceViewFormat = hipResourceViewFormat(\n        16,\n    );\n}\nimpl hipResourceViewFormat {\n    ///< 2 channels, signed 32-bit integers\n    pub const hipResViewFormatSignedInt2: hipResourceViewFormat = hipResourceViewFormat(\n        17,\n    );\n}\nimpl hipResourceViewFormat {\n    ///< 4 channels, signed 32-bit integers\n    pub const hipResViewFormatSignedInt4: hipResourceViewFormat = hipResourceViewFormat(\n        18,\n    );\n}\nimpl hipResourceViewFormat {\n    ///< 1 channel, 16-bit floating point\n    pub const hipResViewFormatHalf1: hipResourceViewFormat = hipResourceViewFormat(19);\n}\nimpl hipResourceViewFormat {\n    ///< 2 channels, 16-bit floating point\n    pub const hipResViewFormatHalf2: hipResourceViewFormat = hipResourceViewFormat(20);\n}\nimpl hipResourceViewFormat {\n    ///< 4 channels, 16-bit floating point\n    pub const hipResViewFormatHalf4: hipResourceViewFormat = hipResourceViewFormat(21);\n}\nimpl hipResourceViewFormat {\n    ///< 1 channel, 32-bit floating point\n    pub const hipResViewFormatFloat1: hipResourceViewFormat = hipResourceViewFormat(22);\n}\nimpl hipResourceViewFormat {\n    ///< 2 channels, 32-bit floating point\n    pub const hipResViewFormatFloat2: hipResourceViewFormat = hipResourceViewFormat(23);\n}\nimpl hipResourceViewFormat {\n    ///< 4 channels, 32-bit floating point\n    pub const hipResViewFormatFloat4: hipResourceViewFormat = hipResourceViewFormat(24);\n}\nimpl hipResourceViewFormat {\n    ///< Block-compressed 1\n    pub const hipResViewFormatUnsignedBlockCompressed1: hipResourceViewFormat = hipResourceViewFormat(\n        25,\n    );\n}\nimpl hipResourceViewFormat {\n    ///< Block-compressed 2\n    pub const hipResViewFormatUnsignedBlockCompressed2: hipResourceViewFormat = hipResourceViewFormat(\n        26,\n    );\n}\nimpl hipResourceViewFormat {\n    ///< Block-compressed 3\n    pub const hipResViewFormatUnsignedBlockCompressed3: hipResourceViewFormat = hipResourceViewFormat(\n        27,\n    );\n}\nimpl hipResourceViewFormat {\n    ///< Block-compressed 4 unsigned\n    pub const hipResViewFormatUnsignedBlockCompressed4: hipResourceViewFormat = hipResourceViewFormat(\n        28,\n    );\n}\nimpl hipResourceViewFormat {\n    ///< Block-compressed 4 signed\n    pub const hipResViewFormatSignedBlockCompressed4: hipResourceViewFormat = hipResourceViewFormat(\n        29,\n    );\n}\nimpl hipResourceViewFormat {\n    ///< Block-compressed 5 unsigned\n    pub const hipResViewFormatUnsignedBlockCompressed5: hipResourceViewFormat = hipResourceViewFormat(\n        30,\n    );\n}\nimpl hipResourceViewFormat {\n    ///< Block-compressed 5 signed\n    pub const hipResViewFormatSignedBlockCompressed5: hipResourceViewFormat = hipResourceViewFormat(\n        31,\n    );\n}\nimpl hipResourceViewFormat {\n    ///< Block-compressed 6 unsigned half-float\n    pub const hipResViewFormatUnsignedBlockCompressed6H: hipResourceViewFormat = hipResourceViewFormat(\n        32,\n    );\n}\nimpl hipResourceViewFormat {\n    ///< Block-compressed 6 signed half-float\n    pub const hipResViewFormatSignedBlockCompressed6H: hipResourceViewFormat = hipResourceViewFormat(\n        33,\n    );\n}\nimpl hipResourceViewFormat {\n    ///< Block-compressed 7\n    pub const hipResViewFormatUnsignedBlockCompressed7: hipResourceViewFormat = hipResourceViewFormat(\n        34,\n    );\n}\n#[repr(transparent)]\n/// HIP texture resource view formats\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipResourceViewFormat(pub ::core::ffi::c_uint);\nimpl HIPresourceViewFormat_enum {\n    ///< No resource view format (use underlying resource format)\n    pub const HIP_RES_VIEW_FORMAT_NONE: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        0,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< 1 channel, unsigned 8-bit integers\n    pub const HIP_RES_VIEW_FORMAT_UINT_1X8: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        1,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< 2 channels, unsigned 8-bit integers\n    pub const HIP_RES_VIEW_FORMAT_UINT_2X8: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        2,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< 4 channels, unsigned 8-bit integers\n    pub const HIP_RES_VIEW_FORMAT_UINT_4X8: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        3,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< 1 channel, signed 8-bit integers\n    pub const HIP_RES_VIEW_FORMAT_SINT_1X8: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        4,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< 2 channels, signed 8-bit integers\n    pub const HIP_RES_VIEW_FORMAT_SINT_2X8: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        5,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< 4 channels, signed 8-bit integers\n    pub const HIP_RES_VIEW_FORMAT_SINT_4X8: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        6,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< 1 channel, unsigned 16-bit integers\n    pub const HIP_RES_VIEW_FORMAT_UINT_1X16: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        7,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< 2 channels, unsigned 16-bit integers\n    pub const HIP_RES_VIEW_FORMAT_UINT_2X16: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        8,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< 4 channels, unsigned 16-bit integers\n    pub const HIP_RES_VIEW_FORMAT_UINT_4X16: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        9,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< 1 channel, signed 16-bit integers\n    pub const HIP_RES_VIEW_FORMAT_SINT_1X16: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        10,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< 2 channels, signed 16-bit integers\n    pub const HIP_RES_VIEW_FORMAT_SINT_2X16: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        11,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< 4 channels, signed 16-bit integers\n    pub const HIP_RES_VIEW_FORMAT_SINT_4X16: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        12,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< 1 channel, unsigned 32-bit integers\n    pub const HIP_RES_VIEW_FORMAT_UINT_1X32: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        13,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< 2 channels, unsigned 32-bit integers\n    pub const HIP_RES_VIEW_FORMAT_UINT_2X32: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        14,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< 4 channels, unsigned 32-bit integers\n    pub const HIP_RES_VIEW_FORMAT_UINT_4X32: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        15,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< 1 channel, signed 32-bit integers\n    pub const HIP_RES_VIEW_FORMAT_SINT_1X32: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        16,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< 2 channels, signed 32-bit integers\n    pub const HIP_RES_VIEW_FORMAT_SINT_2X32: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        17,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< 4 channels, signed 32-bit integers\n    pub const HIP_RES_VIEW_FORMAT_SINT_4X32: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        18,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< 1 channel, 16-bit floating point\n    pub const HIP_RES_VIEW_FORMAT_FLOAT_1X16: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        19,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< 2 channels, 16-bit floating point\n    pub const HIP_RES_VIEW_FORMAT_FLOAT_2X16: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        20,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< 4 channels, 16-bit floating point\n    pub const HIP_RES_VIEW_FORMAT_FLOAT_4X16: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        21,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< 1 channel, 32-bit floating point\n    pub const HIP_RES_VIEW_FORMAT_FLOAT_1X32: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        22,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< 2 channels, 32-bit floating point\n    pub const HIP_RES_VIEW_FORMAT_FLOAT_2X32: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        23,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< 4 channels, 32-bit floating point\n    pub const HIP_RES_VIEW_FORMAT_FLOAT_4X32: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        24,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< Block-compressed 1\n    pub const HIP_RES_VIEW_FORMAT_UNSIGNED_BC1: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        25,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< Block-compressed 2\n    pub const HIP_RES_VIEW_FORMAT_UNSIGNED_BC2: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        26,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< Block-compressed 3\n    pub const HIP_RES_VIEW_FORMAT_UNSIGNED_BC3: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        27,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< Block-compressed 4 unsigned\n    pub const HIP_RES_VIEW_FORMAT_UNSIGNED_BC4: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        28,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< Block-compressed 4 signed\n    pub const HIP_RES_VIEW_FORMAT_SIGNED_BC4: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        29,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< Block-compressed 5 unsigned\n    pub const HIP_RES_VIEW_FORMAT_UNSIGNED_BC5: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        30,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< Block-compressed 5 signed\n    pub const HIP_RES_VIEW_FORMAT_SIGNED_BC5: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        31,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< Block-compressed 6 unsigned half-float\n    pub const HIP_RES_VIEW_FORMAT_UNSIGNED_BC6H: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        32,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< Block-compressed 6 signed half-float\n    pub const HIP_RES_VIEW_FORMAT_SIGNED_BC6H: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        33,\n    );\n}\nimpl HIPresourceViewFormat_enum {\n    ///< Block-compressed 7\n    pub const HIP_RES_VIEW_FORMAT_UNSIGNED_BC7: HIPresourceViewFormat_enum = HIPresourceViewFormat_enum(\n        34,\n    );\n}\n#[repr(transparent)]\n/// HIP texture resource view formats\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct HIPresourceViewFormat_enum(pub ::core::ffi::c_uint);\n/// HIP texture resource view formats\npub use self::HIPresourceViewFormat_enum as HIPresourceViewFormat;\n/// HIP resource descriptor\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct hipResourceDesc {\n    ///< Resource type\n    pub resType: hipResourceType,\n    pub res: hipResourceDesc__bindgen_ty_1,\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union hipResourceDesc__bindgen_ty_1 {\n    pub array: hipResourceDesc__bindgen_ty_1__bindgen_ty_1,\n    pub mipmap: hipResourceDesc__bindgen_ty_1__bindgen_ty_2,\n    pub linear: hipResourceDesc__bindgen_ty_1__bindgen_ty_3,\n    pub pitch2D: hipResourceDesc__bindgen_ty_1__bindgen_ty_4,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipResourceDesc__bindgen_ty_1__bindgen_ty_1 {\n    ///< HIP array\n    pub array: hipArray_t,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipResourceDesc__bindgen_ty_1__bindgen_ty_2 {\n    ///< HIP mipmapped array\n    pub mipmap: hipMipmappedArray_t,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipResourceDesc__bindgen_ty_1__bindgen_ty_3 {\n    ///< Device pointer\n    pub devPtr: *mut ::core::ffi::c_void,\n    ///< Channel format description\n    pub desc: hipChannelFormatDesc,\n    ///< Size in bytes\n    pub sizeInBytes: usize,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipResourceDesc__bindgen_ty_1__bindgen_ty_4 {\n    ///< Device pointer\n    pub devPtr: *mut ::core::ffi::c_void,\n    ///< Channel format description\n    pub desc: hipChannelFormatDesc,\n    ///< Width of the array in elements\n    pub width: usize,\n    ///< Height of the array in elements\n    pub height: usize,\n    ///< Pitch between two rows in bytes\n    pub pitchInBytes: usize,\n}\n/// HIP resource view descriptor struct\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct HIP_RESOURCE_DESC_st {\n    ///< Resource type\n    pub resType: HIPresourcetype,\n    pub res: HIP_RESOURCE_DESC_st__bindgen_ty_1,\n    ///< Flags (must be zero)\n    pub flags: ::core::ffi::c_uint,\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union HIP_RESOURCE_DESC_st__bindgen_ty_1 {\n    pub array: HIP_RESOURCE_DESC_st__bindgen_ty_1__bindgen_ty_1,\n    pub mipmap: HIP_RESOURCE_DESC_st__bindgen_ty_1__bindgen_ty_2,\n    pub linear: HIP_RESOURCE_DESC_st__bindgen_ty_1__bindgen_ty_3,\n    pub pitch2D: HIP_RESOURCE_DESC_st__bindgen_ty_1__bindgen_ty_4,\n    pub reserved: HIP_RESOURCE_DESC_st__bindgen_ty_1__bindgen_ty_5,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct HIP_RESOURCE_DESC_st__bindgen_ty_1__bindgen_ty_1 {\n    ///< HIP array\n    pub hArray: hipArray_t,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct HIP_RESOURCE_DESC_st__bindgen_ty_1__bindgen_ty_2 {\n    ///< HIP mipmapped array\n    pub hMipmappedArray: hipMipmappedArray_t,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct HIP_RESOURCE_DESC_st__bindgen_ty_1__bindgen_ty_3 {\n    ///< Device pointer\n    pub devPtr: hipDeviceptr_t,\n    ///< Array format\n    pub format: hipArray_Format,\n    ///< Channels per array element\n    pub numChannels: ::core::ffi::c_uint,\n    ///< Size in bytes\n    pub sizeInBytes: usize,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct HIP_RESOURCE_DESC_st__bindgen_ty_1__bindgen_ty_4 {\n    ///< Device pointer\n    pub devPtr: hipDeviceptr_t,\n    ///< Array format\n    pub format: hipArray_Format,\n    ///< Channels per array element\n    pub numChannels: ::core::ffi::c_uint,\n    ///< Width of the array in elements\n    pub width: usize,\n    ///< Height of the array in elements\n    pub height: usize,\n    ///< Pitch between two rows in bytes\n    pub pitchInBytes: usize,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct HIP_RESOURCE_DESC_st__bindgen_ty_1__bindgen_ty_5 {\n    pub reserved: [::core::ffi::c_int; 32usize],\n}\n/// HIP resource view descriptor struct\npub type HIP_RESOURCE_DESC = HIP_RESOURCE_DESC_st;\n/// HIP resource view descriptor\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipResourceViewDesc {\n    ///< Resource view format\n    pub format: hipResourceViewFormat,\n    ///< Width of the resource view\n    pub width: usize,\n    ///< Height of the resource view\n    pub height: usize,\n    ///< Depth of the resource view\n    pub depth: usize,\n    ///< First defined mipmap level\n    pub firstMipmapLevel: ::core::ffi::c_uint,\n    ///< Last defined mipmap level\n    pub lastMipmapLevel: ::core::ffi::c_uint,\n    ///< First layer index\n    pub firstLayer: ::core::ffi::c_uint,\n    ///< Last layer index\n    pub lastLayer: ::core::ffi::c_uint,\n}\n/// Resource view descriptor\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct HIP_RESOURCE_VIEW_DESC_st {\n    ///< Resource view format\n    pub format: HIPresourceViewFormat,\n    ///< Width of the resource view\n    pub width: usize,\n    ///< Height of the resource view\n    pub height: usize,\n    ///< Depth of the resource view\n    pub depth: usize,\n    ///< First defined mipmap level\n    pub firstMipmapLevel: ::core::ffi::c_uint,\n    ///< Last defined mipmap level\n    pub lastMipmapLevel: ::core::ffi::c_uint,\n    ///< First layer index\n    pub firstLayer: ::core::ffi::c_uint,\n    ///< Last layer index\n    pub lastLayer: ::core::ffi::c_uint,\n    pub reserved: [::core::ffi::c_uint; 16usize],\n}\n/// Resource view descriptor\npub type HIP_RESOURCE_VIEW_DESC = HIP_RESOURCE_VIEW_DESC_st;\nimpl hipMemcpyKind {\n    ///< Host-to-Host Copy\n    pub const hipMemcpyHostToHost: hipMemcpyKind = hipMemcpyKind(0);\n}\nimpl hipMemcpyKind {\n    ///< Host-to-Device Copy\n    pub const hipMemcpyHostToDevice: hipMemcpyKind = hipMemcpyKind(1);\n}\nimpl hipMemcpyKind {\n    ///< Device-to-Host Copy\n    pub const hipMemcpyDeviceToHost: hipMemcpyKind = hipMemcpyKind(2);\n}\nimpl hipMemcpyKind {\n    ///< Device-to-Device Copy\n    pub const hipMemcpyDeviceToDevice: hipMemcpyKind = hipMemcpyKind(3);\n}\nimpl hipMemcpyKind {\n    /**< Runtime will automatically determine\n<copy-kind based on virtual addresses.*/\n    pub const hipMemcpyDefault: hipMemcpyKind = hipMemcpyKind(4);\n}\nimpl hipMemcpyKind {\n    ///< Device-to-Device Copy without using compute units\n    pub const hipMemcpyDeviceToDeviceNoCU: hipMemcpyKind = hipMemcpyKind(1024);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipMemcpyKind(pub ::core::ffi::c_uint);\n/// HIP pithed pointer\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipPitchedPtr {\n    ///< Pointer to the allocated memory\n    pub ptr: *mut ::core::ffi::c_void,\n    ///< Pitch in bytes\n    pub pitch: usize,\n    ///< Logical size of the first dimension of allocation in elements\n    pub xsize: usize,\n    ///< Logical size of the second dimension of allocation in elements\n    pub ysize: usize,\n}\n/// HIP extent\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipExtent {\n    pub width: usize,\n    pub height: usize,\n    pub depth: usize,\n}\n///  HIP position\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipPos {\n    ///< X coordinate\n    pub x: usize,\n    ///< Y coordinate\n    pub y: usize,\n    ///< Z coordinate\n    pub z: usize,\n}\n/// HIP 3D memory copy parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipMemcpy3DParms {\n    ///< Source array\n    pub srcArray: hipArray_t,\n    ///< Source position\n    pub srcPos: hipPos,\n    ///< Source pointer\n    pub srcPtr: hipPitchedPtr,\n    ///< Destination array\n    pub dstArray: hipArray_t,\n    ///< Destination position\n    pub dstPos: hipPos,\n    ///< Destination pointer\n    pub dstPtr: hipPitchedPtr,\n    ///< Extent of 3D memory copy\n    pub extent: hipExtent,\n    ///< Kind of 3D memory copy\n    pub kind: hipMemcpyKind,\n}\n/// HIP 3D memory copy\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct HIP_MEMCPY3D {\n    ///< Source X in bytes\n    pub srcXInBytes: usize,\n    ///< Source Y\n    pub srcY: usize,\n    ///< Source Z\n    pub srcZ: usize,\n    ///< Source LOD\n    pub srcLOD: usize,\n    ///< Source memory type\n    pub srcMemoryType: hipMemoryType,\n    ///< Source host pointer\n    pub srcHost: *const ::core::ffi::c_void,\n    ///< Source device\n    pub srcDevice: hipDeviceptr_t,\n    ///< Source array\n    pub srcArray: hipArray_t,\n    ///< Source pitch\n    pub srcPitch: usize,\n    ///< Source height\n    pub srcHeight: usize,\n    ///< Destination X in bytes\n    pub dstXInBytes: usize,\n    ///< Destination Y\n    pub dstY: usize,\n    ///< Destination Z\n    pub dstZ: usize,\n    ///< Destination LOD\n    pub dstLOD: usize,\n    ///< Destination memory type\n    pub dstMemoryType: hipMemoryType,\n    ///< Destination host pointer\n    pub dstHost: *mut ::core::ffi::c_void,\n    ///< Destination device\n    pub dstDevice: hipDeviceptr_t,\n    ///< Destination array\n    pub dstArray: hipArray_t,\n    ///< Destination pitch\n    pub dstPitch: usize,\n    ///< Destination height\n    pub dstHeight: usize,\n    ///< Width in bytes of 3D memory copy\n    pub WidthInBytes: usize,\n    ///< Height in bytes of 3D memory copy\n    pub Height: usize,\n    ///< Depth in bytes of 3D memory copy\n    pub Depth: usize,\n}\nimpl hipFunction_attribute {\n    ///< The maximum number of threads per block. Depends on function and device.\n    pub const HIP_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK: hipFunction_attribute = hipFunction_attribute(\n        0,\n    );\n}\nimpl hipFunction_attribute {\n    ///< The statically allocated shared memory size in bytes per block required by the function.\n    pub const HIP_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES: hipFunction_attribute = hipFunction_attribute(\n        1,\n    );\n}\nimpl hipFunction_attribute {\n    ///< The user-allocated constant memory by the function in bytes.\n    pub const HIP_FUNC_ATTRIBUTE_CONST_SIZE_BYTES: hipFunction_attribute = hipFunction_attribute(\n        2,\n    );\n}\nimpl hipFunction_attribute {\n    ///< The local memory usage of each thread by this function in bytes.\n    pub const HIP_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES: hipFunction_attribute = hipFunction_attribute(\n        3,\n    );\n}\nimpl hipFunction_attribute {\n    ///< The number of registers used by each thread of this function.\n    pub const HIP_FUNC_ATTRIBUTE_NUM_REGS: hipFunction_attribute = hipFunction_attribute(\n        4,\n    );\n}\nimpl hipFunction_attribute {\n    ///< PTX version\n    pub const HIP_FUNC_ATTRIBUTE_PTX_VERSION: hipFunction_attribute = hipFunction_attribute(\n        5,\n    );\n}\nimpl hipFunction_attribute {\n    ///< Binary version\n    pub const HIP_FUNC_ATTRIBUTE_BINARY_VERSION: hipFunction_attribute = hipFunction_attribute(\n        6,\n    );\n}\nimpl hipFunction_attribute {\n    ///< Cache mode\n    pub const HIP_FUNC_ATTRIBUTE_CACHE_MODE_CA: hipFunction_attribute = hipFunction_attribute(\n        7,\n    );\n}\nimpl hipFunction_attribute {\n    ///< The maximum dynamic shared memory per block for this function in bytes.\n    pub const HIP_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES: hipFunction_attribute = hipFunction_attribute(\n        8,\n    );\n}\nimpl hipFunction_attribute {\n    ///< The shared memory carveout preference in percent of the maximum shared memory.\n    pub const HIP_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT: hipFunction_attribute = hipFunction_attribute(\n        9,\n    );\n}\nimpl hipFunction_attribute {\n    pub const HIP_FUNC_ATTRIBUTE_MAX: hipFunction_attribute = hipFunction_attribute(10);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipFunction_attribute(pub ::core::ffi::c_uint);\nimpl hipPointer_attribute {\n    /**< The context on which a pointer was allocated\n< @warning This attribute is not supported in HIP*/\n    pub const HIP_POINTER_ATTRIBUTE_CONTEXT: hipPointer_attribute = hipPointer_attribute(\n        1,\n    );\n}\nimpl hipPointer_attribute {\n    ///< memory type describing the location of a pointer\n    pub const HIP_POINTER_ATTRIBUTE_MEMORY_TYPE: hipPointer_attribute = hipPointer_attribute(\n        2,\n    );\n}\nimpl hipPointer_attribute {\n    ///< address at which the pointer is allocated on the device\n    pub const HIP_POINTER_ATTRIBUTE_DEVICE_POINTER: hipPointer_attribute = hipPointer_attribute(\n        3,\n    );\n}\nimpl hipPointer_attribute {\n    ///< address at which the pointer is allocated on the host\n    pub const HIP_POINTER_ATTRIBUTE_HOST_POINTER: hipPointer_attribute = hipPointer_attribute(\n        4,\n    );\n}\nimpl hipPointer_attribute {\n    /**< A pair of tokens for use with Linux kernel interface\n< @warning This attribute is not supported in HIP*/\n    pub const HIP_POINTER_ATTRIBUTE_P2P_TOKENS: hipPointer_attribute = hipPointer_attribute(\n        5,\n    );\n}\nimpl hipPointer_attribute {\n    /**< Synchronize every synchronous memory operation\n< initiated on this region*/\n    pub const HIP_POINTER_ATTRIBUTE_SYNC_MEMOPS: hipPointer_attribute = hipPointer_attribute(\n        6,\n    );\n}\nimpl hipPointer_attribute {\n    ///< Unique ID for an allocated memory region\n    pub const HIP_POINTER_ATTRIBUTE_BUFFER_ID: hipPointer_attribute = hipPointer_attribute(\n        7,\n    );\n}\nimpl hipPointer_attribute {\n    ///< Indicates if the pointer points to managed memory\n    pub const HIP_POINTER_ATTRIBUTE_IS_MANAGED: hipPointer_attribute = hipPointer_attribute(\n        8,\n    );\n}\nimpl hipPointer_attribute {\n    /**< device ordinal of a device on which a pointer\n< was allocated or registered*/\n    pub const HIP_POINTER_ATTRIBUTE_DEVICE_ORDINAL: hipPointer_attribute = hipPointer_attribute(\n        9,\n    );\n}\nimpl hipPointer_attribute {\n    /**< if this pointer maps to an allocation\n< that is suitable for hipIpcGetMemHandle\n< @warning This attribute is not supported in HIP*/\n    pub const HIP_POINTER_ATTRIBUTE_IS_LEGACY_HIP_IPC_CAPABLE: hipPointer_attribute = hipPointer_attribute(\n        10,\n    );\n}\nimpl hipPointer_attribute {\n    ///< Starting address for this requested pointer\n    pub const HIP_POINTER_ATTRIBUTE_RANGE_START_ADDR: hipPointer_attribute = hipPointer_attribute(\n        11,\n    );\n}\nimpl hipPointer_attribute {\n    ///< Size of the address range for this requested pointer\n    pub const HIP_POINTER_ATTRIBUTE_RANGE_SIZE: hipPointer_attribute = hipPointer_attribute(\n        12,\n    );\n}\nimpl hipPointer_attribute {\n    /**< tells if this pointer is in a valid address range\n< that is mapped to a backing allocation*/\n    pub const HIP_POINTER_ATTRIBUTE_MAPPED: hipPointer_attribute = hipPointer_attribute(\n        13,\n    );\n}\nimpl hipPointer_attribute {\n    /**< Bitmask of allowed hipmemAllocationHandleType\n< for this allocation @warning This attribute is not supported in HIP*/\n    pub const HIP_POINTER_ATTRIBUTE_ALLOWED_HANDLE_TYPES: hipPointer_attribute = hipPointer_attribute(\n        14,\n    );\n}\nimpl hipPointer_attribute {\n    /**< returns if the memory referenced by\n< this pointer can be used with the GPUDirect RDMA API\n< @warning This attribute is not supported in HIP*/\n    pub const HIP_POINTER_ATTRIBUTE_IS_GPU_DIRECT_RDMA_CAPABLE: hipPointer_attribute = hipPointer_attribute(\n        15,\n    );\n}\nimpl hipPointer_attribute {\n    /**< Returns the access flags the device associated with\n< for the corresponding memory referenced by the ptr*/\n    pub const HIP_POINTER_ATTRIBUTE_ACCESS_FLAGS: hipPointer_attribute = hipPointer_attribute(\n        16,\n    );\n}\nimpl hipPointer_attribute {\n    /**< Returns the mempool handle for the allocation if\n< it was allocated from a mempool\n< @warning This attribute is not supported in HIP*/\n    pub const HIP_POINTER_ATTRIBUTE_MEMPOOL_HANDLE: hipPointer_attribute = hipPointer_attribute(\n        17,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipPointer_attribute(pub ::core::ffi::c_uint);\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    pub fn hipCreateChannelDesc(\n        x: ::core::ffi::c_int,\n        y: ::core::ffi::c_int,\n        z: ::core::ffi::c_int,\n        w: ::core::ffi::c_int,\n        f: hipChannelFormatKind,\n    ) -> hipChannelFormatDesc;\n}\n/// An opaque value that represents a hip texture object\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct __hip_texture {\n    _unused: [u8; 0],\n}\npub type hipTextureObject_t = *mut __hip_texture;\nimpl hipTextureAddressMode {\n    pub const hipAddressModeWrap: hipTextureAddressMode = hipTextureAddressMode(0);\n}\nimpl hipTextureAddressMode {\n    pub const hipAddressModeClamp: hipTextureAddressMode = hipTextureAddressMode(1);\n}\nimpl hipTextureAddressMode {\n    pub const hipAddressModeMirror: hipTextureAddressMode = hipTextureAddressMode(2);\n}\nimpl hipTextureAddressMode {\n    pub const hipAddressModeBorder: hipTextureAddressMode = hipTextureAddressMode(3);\n}\n#[repr(transparent)]\n/// hip texture address modes\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipTextureAddressMode(pub ::core::ffi::c_uint);\nimpl hipTextureFilterMode {\n    pub const hipFilterModePoint: hipTextureFilterMode = hipTextureFilterMode(0);\n}\nimpl hipTextureFilterMode {\n    pub const hipFilterModeLinear: hipTextureFilterMode = hipTextureFilterMode(1);\n}\n#[repr(transparent)]\n/// hip texture filter modes\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipTextureFilterMode(pub ::core::ffi::c_uint);\nimpl hipTextureReadMode {\n    pub const hipReadModeElementType: hipTextureReadMode = hipTextureReadMode(0);\n}\nimpl hipTextureReadMode {\n    pub const hipReadModeNormalizedFloat: hipTextureReadMode = hipTextureReadMode(1);\n}\n#[repr(transparent)]\n/// hip texture read modes\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipTextureReadMode(pub ::core::ffi::c_uint);\n/// hip texture reference\n#[repr(C)]\n#[derive(Debug, Copy, Clone, PartialEq)]\npub struct textureReference {\n    pub normalized: ::core::ffi::c_int,\n    pub readMode: hipTextureReadMode,\n    pub filterMode: hipTextureFilterMode,\n    pub addressMode: [hipTextureAddressMode; 3usize],\n    pub channelDesc: hipChannelFormatDesc,\n    pub sRGB: ::core::ffi::c_int,\n    pub maxAnisotropy: ::core::ffi::c_uint,\n    pub mipmapFilterMode: hipTextureFilterMode,\n    pub mipmapLevelBias: f32,\n    pub minMipmapLevelClamp: f32,\n    pub maxMipmapLevelClamp: f32,\n    pub textureObject: hipTextureObject_t,\n    pub numChannels: ::core::ffi::c_int,\n    pub format: hipArray_Format,\n}\n/// hip texture descriptor\n#[repr(C)]\n#[derive(Debug, Copy, Clone, PartialEq)]\npub struct hipTextureDesc {\n    pub addressMode: [hipTextureAddressMode; 3usize],\n    pub filterMode: hipTextureFilterMode,\n    pub readMode: hipTextureReadMode,\n    pub sRGB: ::core::ffi::c_int,\n    pub borderColor: [f32; 4usize],\n    pub normalizedCoords: ::core::ffi::c_int,\n    pub maxAnisotropy: ::core::ffi::c_uint,\n    pub mipmapFilterMode: hipTextureFilterMode,\n    pub mipmapLevelBias: f32,\n    pub minMipmapLevelClamp: f32,\n    pub maxMipmapLevelClamp: f32,\n}\n/// An opaque value that represents a hip surface object\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct __hip_surface {\n    _unused: [u8; 0],\n}\npub type hipSurfaceObject_t = *mut __hip_surface;\nimpl hipSurfaceBoundaryMode {\n    pub const hipBoundaryModeZero: hipSurfaceBoundaryMode = hipSurfaceBoundaryMode(0);\n}\nimpl hipSurfaceBoundaryMode {\n    pub const hipBoundaryModeTrap: hipSurfaceBoundaryMode = hipSurfaceBoundaryMode(1);\n}\nimpl hipSurfaceBoundaryMode {\n    pub const hipBoundaryModeClamp: hipSurfaceBoundaryMode = hipSurfaceBoundaryMode(2);\n}\n#[repr(transparent)]\n/// hip surface boundary modes\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipSurfaceBoundaryMode(pub ::core::ffi::c_uint);\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct ihipCtx_t {\n    _unused: [u8; 0],\n}\npub type hipCtx_t = *mut ihipCtx_t;\npub type hipDevice_t = ::core::ffi::c_int;\nimpl hipDeviceP2PAttr {\n    pub const hipDevP2PAttrPerformanceRank: hipDeviceP2PAttr = hipDeviceP2PAttr(0);\n}\nimpl hipDeviceP2PAttr {\n    pub const hipDevP2PAttrAccessSupported: hipDeviceP2PAttr = hipDeviceP2PAttr(1);\n}\nimpl hipDeviceP2PAttr {\n    pub const hipDevP2PAttrNativeAtomicSupported: hipDeviceP2PAttr = hipDeviceP2PAttr(2);\n}\nimpl hipDeviceP2PAttr {\n    pub const hipDevP2PAttrHipArrayAccessSupported: hipDeviceP2PAttr = hipDeviceP2PAttr(\n        3,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipDeviceP2PAttr(pub ::core::ffi::c_uint);\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct ihipStream_t {\n    _unused: [u8; 0],\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipStream_t(pub *mut ihipStream_t);\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipIpcMemHandle_st {\n    pub reserved: [::core::ffi::c_char; 64usize],\n}\npub type hipIpcMemHandle_t = hipIpcMemHandle_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipIpcEventHandle_st {\n    pub reserved: [::core::ffi::c_char; 64usize],\n}\npub type hipIpcEventHandle_t = hipIpcEventHandle_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct ihipModule_t {\n    _unused: [u8; 0],\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipModule_t(pub *mut ihipModule_t);\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct ihipModuleSymbol_t {\n    _unused: [u8; 0],\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipFunction_t(pub *mut ihipModuleSymbol_t);\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct ihipLinkState_t {\n    _unused: [u8; 0],\n}\npub type hipLinkState_t = *mut ihipLinkState_t;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct ihipMemPoolHandle_t {\n    _unused: [u8; 0],\n}\n/// HIP memory pool\npub type hipMemPool_t = *mut ihipMemPoolHandle_t;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipFuncAttributes {\n    pub binaryVersion: ::core::ffi::c_int,\n    pub cacheModeCA: ::core::ffi::c_int,\n    pub constSizeBytes: usize,\n    pub localSizeBytes: usize,\n    pub maxDynamicSharedSizeBytes: ::core::ffi::c_int,\n    pub maxThreadsPerBlock: ::core::ffi::c_int,\n    pub numRegs: ::core::ffi::c_int,\n    pub preferredShmemCarveout: ::core::ffi::c_int,\n    pub ptxVersion: ::core::ffi::c_int,\n    pub sharedSizeBytes: usize,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct ihipEvent_t {\n    _unused: [u8; 0],\n}\npub type hipEvent_t = *mut ihipEvent_t;\nimpl hipLimit_t {\n    /**< Limit of stack size in bytes on the current device, per\n< thread. The size is in units of 256 dwords, up to the\n< limit of (128K - 16)*/\n    pub const hipLimitStackSize: hipLimit_t = hipLimit_t(0);\n}\nimpl hipLimit_t {\n    /**< Size limit in bytes of fifo used by printf call on the\n< device. Currently not supported*/\n    pub const hipLimitPrintfFifoSize: hipLimit_t = hipLimit_t(1);\n}\nimpl hipLimit_t {\n    /**< Limit of heap size in bytes on the current device, should\n< be less than the global memory size on the device*/\n    pub const hipLimitMallocHeapSize: hipLimit_t = hipLimit_t(2);\n}\nimpl hipLimit_t {\n    ///< Supported limit range\n    pub const hipLimitRange: hipLimit_t = hipLimit_t(3);\n}\n#[repr(transparent)]\n/** hipLimit\n\n @note In HIP device limit-related APIs, any input limit value other than those defined in the\n enum is treated as \"UnsupportedLimit\" by default.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipLimit_t(pub ::core::ffi::c_uint);\nimpl hipStreamBatchMemOpType {\n    pub const hipStreamMemOpWaitValue32: hipStreamBatchMemOpType = hipStreamBatchMemOpType(\n        1,\n    );\n}\nimpl hipStreamBatchMemOpType {\n    pub const hipStreamMemOpWriteValue32: hipStreamBatchMemOpType = hipStreamBatchMemOpType(\n        2,\n    );\n}\nimpl hipStreamBatchMemOpType {\n    pub const hipStreamMemOpWaitValue64: hipStreamBatchMemOpType = hipStreamBatchMemOpType(\n        4,\n    );\n}\nimpl hipStreamBatchMemOpType {\n    pub const hipStreamMemOpWriteValue64: hipStreamBatchMemOpType = hipStreamBatchMemOpType(\n        5,\n    );\n}\nimpl hipStreamBatchMemOpType {\n    ///< Currently not supported\n    pub const hipStreamMemOpBarrier: hipStreamBatchMemOpType = hipStreamBatchMemOpType(\n        6,\n    );\n}\nimpl hipStreamBatchMemOpType {\n    ///< Currently not supported\n    pub const hipStreamMemOpFlushRemoteWrites: hipStreamBatchMemOpType = hipStreamBatchMemOpType(\n        3,\n    );\n}\n#[repr(transparent)]\n/// Operations for hipStreamBatchMemOp\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipStreamBatchMemOpType(pub ::core::ffi::c_uint);\n/** @brief Union representing batch memory operation parameters for HIP streams.\n\n hipStreamBatchMemOpParams is used to specify the parameters for batch memory\n operations in a HIP stream. This union supports various operations including\n waiting for a specific value, writing a value, and different flags for wait conditions.\n\n @details\n The union includes fields for different types of operations defined in the\n enum hipStreamBatchMemOpType:\n - hipStreamMemOpWaitValue32:  Wait for a 32-bit value.\n - hipStreamMemOpWriteValue32: Write a 32-bit value.\n - hipStreamMemOpWaitValue64:  Wait for a 64-bit value.\n - hipStreamMemOpWriteValue64: Write a 64-bit value.\n\n Each operation type includes an address, the value to wait for or write, flags, and an\n optional alias that is not relevant on AMD GPUs. Flags can be used to specify different\n wait conditions such as equality, bitwise AND, greater than or equal, and bitwise NOR.\n\n Example usage:\n @code\n hipStreamBatchMemOpParams myArray[2];\n myArray[0].operation = hipStreamMemOpWaitValue32;\n myArray[0].waitValue.address = waitAddr1;\n myArray[0].waitValue.value = 0x1;\n myArray[0].waitValue.flags = CU_STREAM_WAIT_VALUE_EQ;\n\n myArray[1].operation = hipStreamMemOpWriteValue32;\n myArray[1].writeValue.address = writeAddr1;\n myArray[1].writeValue.value = 0x1;\n myArray[1].writeValue.flags = 0x0;\n\n result = hipStreamBatchMemOp(stream, 2, myArray, 0);\n @endcode*/\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union hipStreamBatchMemOpParams_union {\n    pub operation: hipStreamBatchMemOpType,\n    pub waitValue: hipStreamBatchMemOpParams_union_hipStreamMemOpWaitValueParams_t,\n    pub writeValue: hipStreamBatchMemOpParams_union_hipStreamMemOpWriteValueParams_t,\n    ///< Currently not supported on AMD\n    pub flushRemoteWrites: hipStreamBatchMemOpParams_union_hipStreamMemOpFlushRemoteWritesParams_t,\n    ///< Currently not supported on AMD\n    pub memoryBarrier: hipStreamBatchMemOpParams_union_hipStreamMemOpMemoryBarrierParams_t,\n    pub pad: [u64; 6usize],\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct hipStreamBatchMemOpParams_union_hipStreamMemOpWaitValueParams_t {\n    pub operation: hipStreamBatchMemOpType,\n    pub address: hipDeviceptr_t,\n    pub __bindgen_anon_1: hipStreamBatchMemOpParams_union_hipStreamMemOpWaitValueParams_t__bindgen_ty_1,\n    pub flags: ::core::ffi::c_uint,\n    ///< Not valid for AMD backend. Initial value is unimportant\n    pub alias: hipDeviceptr_t,\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union hipStreamBatchMemOpParams_union_hipStreamMemOpWaitValueParams_t__bindgen_ty_1 {\n    pub value: u32,\n    pub value64: u64,\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct hipStreamBatchMemOpParams_union_hipStreamMemOpWriteValueParams_t {\n    pub operation: hipStreamBatchMemOpType,\n    pub address: hipDeviceptr_t,\n    pub __bindgen_anon_1: hipStreamBatchMemOpParams_union_hipStreamMemOpWriteValueParams_t__bindgen_ty_1,\n    pub flags: ::core::ffi::c_uint,\n    ///< Not valid for AMD backend. Initial value is unimportant\n    pub alias: hipDeviceptr_t,\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union hipStreamBatchMemOpParams_union_hipStreamMemOpWriteValueParams_t__bindgen_ty_1 {\n    pub value: u32,\n    pub value64: u64,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipStreamBatchMemOpParams_union_hipStreamMemOpFlushRemoteWritesParams_t {\n    pub operation: hipStreamBatchMemOpType,\n    pub flags: ::core::ffi::c_uint,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipStreamBatchMemOpParams_union_hipStreamMemOpMemoryBarrierParams_t {\n    pub operation: hipStreamBatchMemOpType,\n    pub flags: ::core::ffi::c_uint,\n}\n/** @brief Union representing batch memory operation parameters for HIP streams.\n\n hipStreamBatchMemOpParams is used to specify the parameters for batch memory\n operations in a HIP stream. This union supports various operations including\n waiting for a specific value, writing a value, and different flags for wait conditions.\n\n @details\n The union includes fields for different types of operations defined in the\n enum hipStreamBatchMemOpType:\n - hipStreamMemOpWaitValue32:  Wait for a 32-bit value.\n - hipStreamMemOpWriteValue32: Write a 32-bit value.\n - hipStreamMemOpWaitValue64:  Wait for a 64-bit value.\n - hipStreamMemOpWriteValue64: Write a 64-bit value.\n\n Each operation type includes an address, the value to wait for or write, flags, and an\n optional alias that is not relevant on AMD GPUs. Flags can be used to specify different\n wait conditions such as equality, bitwise AND, greater than or equal, and bitwise NOR.\n\n Example usage:\n @code\n hipStreamBatchMemOpParams myArray[2];\n myArray[0].operation = hipStreamMemOpWaitValue32;\n myArray[0].waitValue.address = waitAddr1;\n myArray[0].waitValue.value = 0x1;\n myArray[0].waitValue.flags = CU_STREAM_WAIT_VALUE_EQ;\n\n myArray[1].operation = hipStreamMemOpWriteValue32;\n myArray[1].writeValue.address = writeAddr1;\n myArray[1].writeValue.value = 0x1;\n myArray[1].writeValue.flags = 0x0;\n\n result = hipStreamBatchMemOp(stream, 2, myArray, 0);\n @endcode*/\npub type hipStreamBatchMemOpParams = hipStreamBatchMemOpParams_union;\n/** @brief Structure representing node parameters for batch memory operations in HIP graphs.\n\n hipBatchMemOpNodeParams is used to specify the parameters for batch memory\n operations in HIP graphs. This struct includes the context to use for the operations, the\n number of operations, and an array of hipStreamBatchMemOpParams that describe the operations.\n\n @details\n The structure includes the following fields:\n - ctx: The HIP context to use for the operations.\n - count: The number of operations in the paramArray.\n - paramArray: A pointer to an array of hipStreamBatchMemOpParams.\n - flags: Flags to control the node.\n\n Example usage:\n @code\n hipBatchMemOpNodeParams nodeParams;\n nodeParams.ctx = context;\n nodeParams.count = ARRAY_SIZE;\n nodeParams.paramArray = myArray;\n nodeParams.flags = 0;\n\n Pass nodeParams to a HIP graph APIs hipGraphAddBatchMemOpNode, hipGraphBatchMemOpNodeGetParams,\n hipGraphBatchMemOpNodeSetParams, hipGraphExecBatchMemOpNodeSetParams\n @endcode*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipBatchMemOpNodeParams {\n    pub ctx: hipCtx_t,\n    pub count: ::core::ffi::c_uint,\n    pub paramArray: *mut hipStreamBatchMemOpParams,\n    pub flags: ::core::ffi::c_uint,\n}\nimpl hipMemoryAdvise {\n    /**< Data will mostly be read and only occassionally\n< be written to*/\n    pub const hipMemAdviseSetReadMostly: hipMemoryAdvise = hipMemoryAdvise(1);\n}\nimpl hipMemoryAdvise {\n    ///< Undo the effect of hipMemAdviseSetReadMostly\n    pub const hipMemAdviseUnsetReadMostly: hipMemoryAdvise = hipMemoryAdvise(2);\n}\nimpl hipMemoryAdvise {\n    /**< Set the preferred location for the data as\n< the specified device*/\n    pub const hipMemAdviseSetPreferredLocation: hipMemoryAdvise = hipMemoryAdvise(3);\n}\nimpl hipMemoryAdvise {\n    ///< Clear the preferred location for the data\n    pub const hipMemAdviseUnsetPreferredLocation: hipMemoryAdvise = hipMemoryAdvise(4);\n}\nimpl hipMemoryAdvise {\n    /**< Data will be accessed by the specified device\n< so prevent page faults as much as possible*/\n    pub const hipMemAdviseSetAccessedBy: hipMemoryAdvise = hipMemoryAdvise(5);\n}\nimpl hipMemoryAdvise {\n    /**< Let HIP to decide on the page faulting policy\n< for the specified device*/\n    pub const hipMemAdviseUnsetAccessedBy: hipMemoryAdvise = hipMemoryAdvise(6);\n}\nimpl hipMemoryAdvise {\n    /**< The default memory model is fine-grain. That allows\n< coherent operations between host and device, while\n< executing kernels. The coarse-grain can be used\n< for data that only needs to be coherent at dispatch\n< boundaries for better performance*/\n    pub const hipMemAdviseSetCoarseGrain: hipMemoryAdvise = hipMemoryAdvise(100);\n}\nimpl hipMemoryAdvise {\n    ///< Restores cache coherency policy back to fine-grain\n    pub const hipMemAdviseUnsetCoarseGrain: hipMemoryAdvise = hipMemoryAdvise(101);\n}\n#[repr(transparent)]\n/** HIP Memory Advise values\n\n @note This memory advise enumeration is used on Linux, not Windows.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipMemoryAdvise(pub ::core::ffi::c_uint);\nimpl hipMemRangeCoherencyMode {\n    /**< Updates to memory with this attribute can be\n< done coherently from all devices*/\n    pub const hipMemRangeCoherencyModeFineGrain: hipMemRangeCoherencyMode = hipMemRangeCoherencyMode(\n        0,\n    );\n}\nimpl hipMemRangeCoherencyMode {\n    /**< Writes to memory with this attribute can be\n< performed by a single device at a time*/\n    pub const hipMemRangeCoherencyModeCoarseGrain: hipMemRangeCoherencyMode = hipMemRangeCoherencyMode(\n        1,\n    );\n}\nimpl hipMemRangeCoherencyMode {\n    /**< Memory region queried contains subregions with\n< both hipMemRangeCoherencyModeFineGrain and\n< hipMemRangeCoherencyModeCoarseGrain attributes*/\n    pub const hipMemRangeCoherencyModeIndeterminate: hipMemRangeCoherencyMode = hipMemRangeCoherencyMode(\n        2,\n    );\n}\n#[repr(transparent)]\n/// HIP Coherency Mode\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipMemRangeCoherencyMode(pub ::core::ffi::c_uint);\nimpl hipMemRangeAttribute {\n    /**< Whether the range will mostly be read and\n< only occassionally be written to*/\n    pub const hipMemRangeAttributeReadMostly: hipMemRangeAttribute = hipMemRangeAttribute(\n        1,\n    );\n}\nimpl hipMemRangeAttribute {\n    ///< The preferred location of the range\n    pub const hipMemRangeAttributePreferredLocation: hipMemRangeAttribute = hipMemRangeAttribute(\n        2,\n    );\n}\nimpl hipMemRangeAttribute {\n    /**< Memory range has hipMemAdviseSetAccessedBy\n< set for the specified device*/\n    pub const hipMemRangeAttributeAccessedBy: hipMemRangeAttribute = hipMemRangeAttribute(\n        3,\n    );\n}\nimpl hipMemRangeAttribute {\n    /**< The last location to where the range was\n< prefetched*/\n    pub const hipMemRangeAttributeLastPrefetchLocation: hipMemRangeAttribute = hipMemRangeAttribute(\n        4,\n    );\n}\nimpl hipMemRangeAttribute {\n    /**< Returns coherency mode\n< @ref hipMemRangeCoherencyMode for the range*/\n    pub const hipMemRangeAttributeCoherencyMode: hipMemRangeAttribute = hipMemRangeAttribute(\n        100,\n    );\n}\n#[repr(transparent)]\n/// HIP range attributes\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipMemRangeAttribute(pub ::core::ffi::c_uint);\nimpl hipMemPoolAttr {\n    /** (value type = int)\n Allow @p hipMemAllocAsync to use memory asynchronously freed\n in another streams as long as a stream ordering dependency\n of the allocating stream on the free action exists.\n hip events and null stream interactions can create the required\n stream ordered dependencies. (default enabled)*/\n    pub const hipMemPoolReuseFollowEventDependencies: hipMemPoolAttr = hipMemPoolAttr(1);\n}\nimpl hipMemPoolAttr {\n    /** (value type = int)\n Allow reuse of already completed frees when there is no dependency\n between the free and allocation. (default enabled)*/\n    pub const hipMemPoolReuseAllowOpportunistic: hipMemPoolAttr = hipMemPoolAttr(2);\n}\nimpl hipMemPoolAttr {\n    /** (value type = int)\n Allow @p hipMemAllocAsync to insert new stream dependencies\n in order to establish the stream ordering required to reuse\n a piece of memory released by cuFreeAsync (default enabled).*/\n    pub const hipMemPoolReuseAllowInternalDependencies: hipMemPoolAttr = hipMemPoolAttr(\n        3,\n    );\n}\nimpl hipMemPoolAttr {\n    /** (value type = uint64_t)\n Amount of reserved memory in bytes to hold onto before trying\n to release memory back to the OS. When more than the release\n threshold bytes of memory are held by the memory pool, the\n allocator will try to release memory back to the OS on the\n next call to stream, event or context synchronize. (default 0)*/\n    pub const hipMemPoolAttrReleaseThreshold: hipMemPoolAttr = hipMemPoolAttr(4);\n}\nimpl hipMemPoolAttr {\n    /** (value type = uint64_t)\n Amount of backing memory currently allocated for the mempool.*/\n    pub const hipMemPoolAttrReservedMemCurrent: hipMemPoolAttr = hipMemPoolAttr(5);\n}\nimpl hipMemPoolAttr {\n    /** (value type = uint64_t)\n High watermark of backing memory allocated for the mempool since the\n last time it was reset. High watermark can only be reset to zero.*/\n    pub const hipMemPoolAttrReservedMemHigh: hipMemPoolAttr = hipMemPoolAttr(6);\n}\nimpl hipMemPoolAttr {\n    /** (value type = uint64_t)\n Amount of memory from the pool that is currently in use by the application.*/\n    pub const hipMemPoolAttrUsedMemCurrent: hipMemPoolAttr = hipMemPoolAttr(7);\n}\nimpl hipMemPoolAttr {\n    /** (value type = uint64_t)\n High watermark of the amount of memory from the pool that was in use by the application since\n the last time it was reset. High watermark can only be reset to zero.*/\n    pub const hipMemPoolAttrUsedMemHigh: hipMemPoolAttr = hipMemPoolAttr(8);\n}\n#[repr(transparent)]\n/// HIP memory pool attributes\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipMemPoolAttr(pub ::core::ffi::c_uint);\nimpl hipMemLocationType {\n    pub const hipMemLocationTypeInvalid: hipMemLocationType = hipMemLocationType(0);\n}\nimpl hipMemLocationType {\n    ///< Device location, thus it's HIP device ID\n    pub const hipMemLocationTypeDevice: hipMemLocationType = hipMemLocationType(1);\n}\n#[repr(transparent)]\n/// Specifies the type of location\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipMemLocationType(pub ::core::ffi::c_uint);\n/** Specifies a memory location.\n\n To specify a gpu, set type = @p hipMemLocationTypeDevice and set id = the gpu's device ID*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipMemLocation {\n    ///< Specifies the location type, which describes the meaning of id\n    pub type_: hipMemLocationType,\n    ///< Identifier for the provided location type @p hipMemLocationType\n    pub id: ::core::ffi::c_int,\n}\nimpl hipMemAccessFlags {\n    ///< Default, make the address range not accessible\n    pub const hipMemAccessFlagsProtNone: hipMemAccessFlags = hipMemAccessFlags(0);\n}\nimpl hipMemAccessFlags {\n    ///< Set the address range read accessible\n    pub const hipMemAccessFlagsProtRead: hipMemAccessFlags = hipMemAccessFlags(1);\n}\nimpl hipMemAccessFlags {\n    ///< Set the address range read-write accessible\n    pub const hipMemAccessFlagsProtReadWrite: hipMemAccessFlags = hipMemAccessFlags(3);\n}\n#[repr(transparent)]\n/** Specifies the memory protection flags for mapping\n*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipMemAccessFlags(pub ::core::ffi::c_uint);\n/// Memory access descriptor\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipMemAccessDesc {\n    ///< Location on which the accessibility has to change\n    pub location: hipMemLocation,\n    ///< Accessibility flags to set\n    pub flags: hipMemAccessFlags,\n}\nimpl hipMemAllocationType {\n    pub const hipMemAllocationTypeInvalid: hipMemAllocationType = hipMemAllocationType(\n        0,\n    );\n}\nimpl hipMemAllocationType {\n    /** This allocation type is 'pinned', i.e. cannot migrate from its current\n location while the application is actively using it*/\n    pub const hipMemAllocationTypePinned: hipMemAllocationType = hipMemAllocationType(1);\n}\nimpl hipMemAllocationType {\n    /** This allocation type is 'pinned', i.e. cannot migrate from its current\n location while the application is actively using it*/\n    pub const hipMemAllocationTypeMax: hipMemAllocationType = hipMemAllocationType(\n        2147483647,\n    );\n}\n#[repr(transparent)]\n/// Defines the allocation types\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipMemAllocationType(pub ::core::ffi::c_uint);\nimpl hipMemAllocationHandleType {\n    ///< Does not allow any export mechanism\n    pub const hipMemHandleTypeNone: hipMemAllocationHandleType = hipMemAllocationHandleType(\n        0,\n    );\n}\nimpl hipMemAllocationHandleType {\n    ///< Allows a file descriptor for exporting. Permitted only on POSIX systems\n    pub const hipMemHandleTypePosixFileDescriptor: hipMemAllocationHandleType = hipMemAllocationHandleType(\n        1,\n    );\n}\nimpl hipMemAllocationHandleType {\n    ///< Allows a Win32 NT handle for exporting. (HANDLE)\n    pub const hipMemHandleTypeWin32: hipMemAllocationHandleType = hipMemAllocationHandleType(\n        2,\n    );\n}\nimpl hipMemAllocationHandleType {\n    ///< Allows a Win32 KMT handle for exporting. (D3DKMT_HANDLE)\n    pub const hipMemHandleTypeWin32Kmt: hipMemAllocationHandleType = hipMemAllocationHandleType(\n        4,\n    );\n}\n#[repr(transparent)]\n/** Flags for specifying handle types for memory pool allocations\n*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipMemAllocationHandleType(pub ::core::ffi::c_uint);\n/// Specifies the properties of allocations made from the pool.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipMemPoolProps {\n    ///< Allocation type. Currently must be specified as @p hipMemAllocationTypePinned\n    pub allocType: hipMemAllocationType,\n    ///< Handle types that will be supported by allocations from the pool\n    pub handleTypes: hipMemAllocationHandleType,\n    ///< Location where allocations should reside\n    pub location: hipMemLocation,\n    /// Windows-specific LPSECURITYATTRIBUTES required when @p hipMemHandleTypeWin32 is specified\n    pub win32SecurityAttributes: *mut ::core::ffi::c_void,\n    ///< Maximum pool size. When set to 0, defaults to a system dependent value\n    pub maxSize: usize,\n    ///< Reserved for future use, must be 0\n    pub reserved: [::core::ffi::c_uchar; 56usize],\n}\n/// Opaque data structure for exporting a pool allocation\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipMemPoolPtrExportData {\n    pub reserved: [::core::ffi::c_uchar; 64usize],\n}\nimpl hipFuncAttribute {\n    pub const hipFuncAttributeMaxDynamicSharedMemorySize: hipFuncAttribute = hipFuncAttribute(\n        8,\n    );\n}\nimpl hipFuncAttribute {\n    pub const hipFuncAttributePreferredSharedMemoryCarveout: hipFuncAttribute = hipFuncAttribute(\n        9,\n    );\n}\nimpl hipFuncAttribute {\n    pub const hipFuncAttributeMax: hipFuncAttribute = hipFuncAttribute(10);\n}\n#[repr(transparent)]\n/// @warning On AMD devices and some Nvidia devices, these hints and controls are ignored.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipFuncAttribute(pub ::core::ffi::c_uint);\nimpl hipFuncCache_t {\n    ///< no preference for shared memory or L1 (default)\n    pub const hipFuncCachePreferNone: hipFuncCache_t = hipFuncCache_t(0);\n}\nimpl hipFuncCache_t {\n    ///< prefer larger shared memory and smaller L1 cache\n    pub const hipFuncCachePreferShared: hipFuncCache_t = hipFuncCache_t(1);\n}\nimpl hipFuncCache_t {\n    ///< prefer larger L1 cache and smaller shared memory\n    pub const hipFuncCachePreferL1: hipFuncCache_t = hipFuncCache_t(2);\n}\nimpl hipFuncCache_t {\n    ///< prefer equal size L1 cache and shared memory\n    pub const hipFuncCachePreferEqual: hipFuncCache_t = hipFuncCache_t(3);\n}\n#[repr(transparent)]\n/// @warning On AMD devices and some Nvidia devices, these hints and controls are ignored.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipFuncCache_t(pub ::core::ffi::c_uint);\nimpl hipSharedMemConfig {\n    ///< The compiler selects a device-specific value for the banking.\n    pub const hipSharedMemBankSizeDefault: hipSharedMemConfig = hipSharedMemConfig(0);\n}\nimpl hipSharedMemConfig {\n    /**< Shared mem is banked at 4-bytes intervals and performs best\n< when adjacent threads access data 4 bytes apart.*/\n    pub const hipSharedMemBankSizeFourByte: hipSharedMemConfig = hipSharedMemConfig(1);\n}\nimpl hipSharedMemConfig {\n    /**< Shared mem is banked at 8-byte intervals and performs best\n< when adjacent threads access data 4 bytes apart.*/\n    pub const hipSharedMemBankSizeEightByte: hipSharedMemConfig = hipSharedMemConfig(2);\n}\n#[repr(transparent)]\n/// @warning On AMD devices and some Nvidia devices, these hints and controls are ignored.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipSharedMemConfig(pub ::core::ffi::c_uint);\n/// Struct for data in 3D\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct dim3 {\n    ///< x\n    pub x: u32,\n    ///< y\n    pub y: u32,\n    ///< z\n    pub z: u32,\n}\n/// struct hipLaunchParams_t\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipLaunchParams_t {\n    ///< Device function symbol\n    pub func: *mut ::core::ffi::c_void,\n    ///< Grid dimensions\n    pub gridDim: dim3,\n    ///< Block dimensions\n    pub blockDim: dim3,\n    ///< Arguments\n    pub args: *mut *mut ::core::ffi::c_void,\n    ///< Shared memory\n    pub sharedMem: usize,\n    ///< Stream identifier\n    pub stream: hipStream_t,\n}\n/// struct hipLaunchParams_t\npub type hipLaunchParams = hipLaunchParams_t;\n/// struct hipFunctionLaunchParams_t\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipFunctionLaunchParams_t {\n    ///< Kernel to launch\n    pub function: hipFunction_t,\n    ///< Width(X) of grid in blocks\n    pub gridDimX: ::core::ffi::c_uint,\n    ///< Height(Y) of grid in blocks\n    pub gridDimY: ::core::ffi::c_uint,\n    ///< Depth(Z) of grid in blocks\n    pub gridDimZ: ::core::ffi::c_uint,\n    ///< X dimension of each thread block\n    pub blockDimX: ::core::ffi::c_uint,\n    ///< Y dimension of each thread block\n    pub blockDimY: ::core::ffi::c_uint,\n    ///< Z dimension of each thread block\n    pub blockDimZ: ::core::ffi::c_uint,\n    ///< Shared memory\n    pub sharedMemBytes: ::core::ffi::c_uint,\n    ///< Stream identifier\n    pub hStream: hipStream_t,\n    ///< Kernel parameters\n    pub kernelParams: *mut *mut ::core::ffi::c_void,\n}\n/// struct hipFunctionLaunchParams_t\npub type hipFunctionLaunchParams = hipFunctionLaunchParams_t;\nimpl hipExternalMemoryHandleType_enum {\n    pub const hipExternalMemoryHandleTypeOpaqueFd: hipExternalMemoryHandleType_enum = hipExternalMemoryHandleType_enum(\n        1,\n    );\n}\nimpl hipExternalMemoryHandleType_enum {\n    pub const hipExternalMemoryHandleTypeOpaqueWin32: hipExternalMemoryHandleType_enum = hipExternalMemoryHandleType_enum(\n        2,\n    );\n}\nimpl hipExternalMemoryHandleType_enum {\n    pub const hipExternalMemoryHandleTypeOpaqueWin32Kmt: hipExternalMemoryHandleType_enum = hipExternalMemoryHandleType_enum(\n        3,\n    );\n}\nimpl hipExternalMemoryHandleType_enum {\n    pub const hipExternalMemoryHandleTypeD3D12Heap: hipExternalMemoryHandleType_enum = hipExternalMemoryHandleType_enum(\n        4,\n    );\n}\nimpl hipExternalMemoryHandleType_enum {\n    pub const hipExternalMemoryHandleTypeD3D12Resource: hipExternalMemoryHandleType_enum = hipExternalMemoryHandleType_enum(\n        5,\n    );\n}\nimpl hipExternalMemoryHandleType_enum {\n    pub const hipExternalMemoryHandleTypeD3D11Resource: hipExternalMemoryHandleType_enum = hipExternalMemoryHandleType_enum(\n        6,\n    );\n}\nimpl hipExternalMemoryHandleType_enum {\n    pub const hipExternalMemoryHandleTypeD3D11ResourceKmt: hipExternalMemoryHandleType_enum = hipExternalMemoryHandleType_enum(\n        7,\n    );\n}\nimpl hipExternalMemoryHandleType_enum {\n    pub const hipExternalMemoryHandleTypeNvSciBuf: hipExternalMemoryHandleType_enum = hipExternalMemoryHandleType_enum(\n        8,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipExternalMemoryHandleType_enum(pub ::core::ffi::c_uint);\npub use self::hipExternalMemoryHandleType_enum as hipExternalMemoryHandleType;\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct hipExternalMemoryHandleDesc_st {\n    pub type_: hipExternalMemoryHandleType,\n    pub handle: hipExternalMemoryHandleDesc_st__bindgen_ty_1,\n    pub size: ::core::ffi::c_ulonglong,\n    pub flags: ::core::ffi::c_uint,\n    pub reserved: [::core::ffi::c_uint; 16usize],\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union hipExternalMemoryHandleDesc_st__bindgen_ty_1 {\n    pub fd: ::core::ffi::c_int,\n    pub win32: hipExternalMemoryHandleDesc_st__bindgen_ty_1__bindgen_ty_1,\n    pub nvSciBufObject: *const ::core::ffi::c_void,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipExternalMemoryHandleDesc_st__bindgen_ty_1__bindgen_ty_1 {\n    pub handle: *mut ::core::ffi::c_void,\n    pub name: *const ::core::ffi::c_void,\n}\npub type hipExternalMemoryHandleDesc = hipExternalMemoryHandleDesc_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipExternalMemoryBufferDesc_st {\n    pub offset: ::core::ffi::c_ulonglong,\n    pub size: ::core::ffi::c_ulonglong,\n    pub flags: ::core::ffi::c_uint,\n    pub reserved: [::core::ffi::c_uint; 16usize],\n}\npub type hipExternalMemoryBufferDesc = hipExternalMemoryBufferDesc_st;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipExternalMemoryMipmappedArrayDesc_st {\n    pub offset: ::core::ffi::c_ulonglong,\n    pub formatDesc: hipChannelFormatDesc,\n    pub extent: hipExtent,\n    pub flags: ::core::ffi::c_uint,\n    pub numLevels: ::core::ffi::c_uint,\n}\npub type hipExternalMemoryMipmappedArrayDesc = hipExternalMemoryMipmappedArrayDesc_st;\npub type hipExternalMemory_t = *mut ::core::ffi::c_void;\nimpl hipExternalSemaphoreHandleType_enum {\n    pub const hipExternalSemaphoreHandleTypeOpaqueFd: hipExternalSemaphoreHandleType_enum = hipExternalSemaphoreHandleType_enum(\n        1,\n    );\n}\nimpl hipExternalSemaphoreHandleType_enum {\n    pub const hipExternalSemaphoreHandleTypeOpaqueWin32: hipExternalSemaphoreHandleType_enum = hipExternalSemaphoreHandleType_enum(\n        2,\n    );\n}\nimpl hipExternalSemaphoreHandleType_enum {\n    pub const hipExternalSemaphoreHandleTypeOpaqueWin32Kmt: hipExternalSemaphoreHandleType_enum = hipExternalSemaphoreHandleType_enum(\n        3,\n    );\n}\nimpl hipExternalSemaphoreHandleType_enum {\n    pub const hipExternalSemaphoreHandleTypeD3D12Fence: hipExternalSemaphoreHandleType_enum = hipExternalSemaphoreHandleType_enum(\n        4,\n    );\n}\nimpl hipExternalSemaphoreHandleType_enum {\n    pub const hipExternalSemaphoreHandleTypeD3D11Fence: hipExternalSemaphoreHandleType_enum = hipExternalSemaphoreHandleType_enum(\n        5,\n    );\n}\nimpl hipExternalSemaphoreHandleType_enum {\n    pub const hipExternalSemaphoreHandleTypeNvSciSync: hipExternalSemaphoreHandleType_enum = hipExternalSemaphoreHandleType_enum(\n        6,\n    );\n}\nimpl hipExternalSemaphoreHandleType_enum {\n    pub const hipExternalSemaphoreHandleTypeKeyedMutex: hipExternalSemaphoreHandleType_enum = hipExternalSemaphoreHandleType_enum(\n        7,\n    );\n}\nimpl hipExternalSemaphoreHandleType_enum {\n    pub const hipExternalSemaphoreHandleTypeKeyedMutexKmt: hipExternalSemaphoreHandleType_enum = hipExternalSemaphoreHandleType_enum(\n        8,\n    );\n}\nimpl hipExternalSemaphoreHandleType_enum {\n    pub const hipExternalSemaphoreHandleTypeTimelineSemaphoreFd: hipExternalSemaphoreHandleType_enum = hipExternalSemaphoreHandleType_enum(\n        9,\n    );\n}\nimpl hipExternalSemaphoreHandleType_enum {\n    pub const hipExternalSemaphoreHandleTypeTimelineSemaphoreWin32: hipExternalSemaphoreHandleType_enum = hipExternalSemaphoreHandleType_enum(\n        10,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipExternalSemaphoreHandleType_enum(pub ::core::ffi::c_uint);\npub use self::hipExternalSemaphoreHandleType_enum as hipExternalSemaphoreHandleType;\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct hipExternalSemaphoreHandleDesc_st {\n    pub type_: hipExternalSemaphoreHandleType,\n    pub handle: hipExternalSemaphoreHandleDesc_st__bindgen_ty_1,\n    pub flags: ::core::ffi::c_uint,\n    pub reserved: [::core::ffi::c_uint; 16usize],\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union hipExternalSemaphoreHandleDesc_st__bindgen_ty_1 {\n    pub fd: ::core::ffi::c_int,\n    pub win32: hipExternalSemaphoreHandleDesc_st__bindgen_ty_1__bindgen_ty_1,\n    pub NvSciSyncObj: *const ::core::ffi::c_void,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipExternalSemaphoreHandleDesc_st__bindgen_ty_1__bindgen_ty_1 {\n    pub handle: *mut ::core::ffi::c_void,\n    pub name: *const ::core::ffi::c_void,\n}\npub type hipExternalSemaphoreHandleDesc = hipExternalSemaphoreHandleDesc_st;\npub type hipExternalSemaphore_t = *mut ::core::ffi::c_void;\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct hipExternalSemaphoreSignalParams_st {\n    pub params: hipExternalSemaphoreSignalParams_st__bindgen_ty_1,\n    pub flags: ::core::ffi::c_uint,\n    pub reserved: [::core::ffi::c_uint; 16usize],\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct hipExternalSemaphoreSignalParams_st__bindgen_ty_1 {\n    pub fence: hipExternalSemaphoreSignalParams_st__bindgen_ty_1__bindgen_ty_1,\n    pub nvSciSync: hipExternalSemaphoreSignalParams_st__bindgen_ty_1__bindgen_ty_2,\n    pub keyedMutex: hipExternalSemaphoreSignalParams_st__bindgen_ty_1__bindgen_ty_3,\n    pub reserved: [::core::ffi::c_uint; 12usize],\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipExternalSemaphoreSignalParams_st__bindgen_ty_1__bindgen_ty_1 {\n    pub value: ::core::ffi::c_ulonglong,\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union hipExternalSemaphoreSignalParams_st__bindgen_ty_1__bindgen_ty_2 {\n    pub fence: *mut ::core::ffi::c_void,\n    pub reserved: ::core::ffi::c_ulonglong,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipExternalSemaphoreSignalParams_st__bindgen_ty_1__bindgen_ty_3 {\n    pub key: ::core::ffi::c_ulonglong,\n}\npub type hipExternalSemaphoreSignalParams = hipExternalSemaphoreSignalParams_st;\n/// External semaphore wait parameters, compatible with driver type\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct hipExternalSemaphoreWaitParams_st {\n    pub params: hipExternalSemaphoreWaitParams_st__bindgen_ty_1,\n    pub flags: ::core::ffi::c_uint,\n    pub reserved: [::core::ffi::c_uint; 16usize],\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct hipExternalSemaphoreWaitParams_st__bindgen_ty_1 {\n    pub fence: hipExternalSemaphoreWaitParams_st__bindgen_ty_1__bindgen_ty_1,\n    pub nvSciSync: hipExternalSemaphoreWaitParams_st__bindgen_ty_1__bindgen_ty_2,\n    pub keyedMutex: hipExternalSemaphoreWaitParams_st__bindgen_ty_1__bindgen_ty_3,\n    pub reserved: [::core::ffi::c_uint; 10usize],\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipExternalSemaphoreWaitParams_st__bindgen_ty_1__bindgen_ty_1 {\n    pub value: ::core::ffi::c_ulonglong,\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union hipExternalSemaphoreWaitParams_st__bindgen_ty_1__bindgen_ty_2 {\n    pub fence: *mut ::core::ffi::c_void,\n    pub reserved: ::core::ffi::c_ulonglong,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipExternalSemaphoreWaitParams_st__bindgen_ty_1__bindgen_ty_3 {\n    pub key: ::core::ffi::c_ulonglong,\n    pub timeoutMs: ::core::ffi::c_uint,\n}\n/// External semaphore wait parameters, compatible with driver type\npub type hipExternalSemaphoreWaitParams = hipExternalSemaphoreWaitParams_st;\nimpl hipGraphicsRegisterFlags {\n    pub const hipGraphicsRegisterFlagsNone: hipGraphicsRegisterFlags = hipGraphicsRegisterFlags(\n        0,\n    );\n}\nimpl hipGraphicsRegisterFlags {\n    ///< HIP will not write to this registered resource\n    pub const hipGraphicsRegisterFlagsReadOnly: hipGraphicsRegisterFlags = hipGraphicsRegisterFlags(\n        1,\n    );\n}\nimpl hipGraphicsRegisterFlags {\n    pub const hipGraphicsRegisterFlagsWriteDiscard: hipGraphicsRegisterFlags = hipGraphicsRegisterFlags(\n        2,\n    );\n}\nimpl hipGraphicsRegisterFlags {\n    ///< HIP will bind this resource to a surface\n    pub const hipGraphicsRegisterFlagsSurfaceLoadStore: hipGraphicsRegisterFlags = hipGraphicsRegisterFlags(\n        4,\n    );\n}\nimpl hipGraphicsRegisterFlags {\n    pub const hipGraphicsRegisterFlagsTextureGather: hipGraphicsRegisterFlags = hipGraphicsRegisterFlags(\n        8,\n    );\n}\n#[repr(transparent)]\n/// HIP Access falgs for Interop resources.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipGraphicsRegisterFlags(pub ::core::ffi::c_uint);\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct _hipGraphicsResource {\n    _unused: [u8; 0],\n}\npub type hipGraphicsResource = _hipGraphicsResource;\npub type hipGraphicsResource_t = *mut hipGraphicsResource;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct ihipGraph {\n    _unused: [u8; 0],\n}\n/// An opaque value that represents a hip graph\npub type hipGraph_t = *mut ihipGraph;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct hipGraphNode {\n    _unused: [u8; 0],\n}\n/// An opaque value that represents a hip graph node\npub type hipGraphNode_t = *mut hipGraphNode;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct hipGraphExec {\n    _unused: [u8; 0],\n}\n/// An opaque value that represents a hip graph Exec\npub type hipGraphExec_t = *mut hipGraphExec;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct hipUserObject {\n    _unused: [u8; 0],\n}\n/// An opaque value that represents a user obj\npub type hipUserObject_t = *mut hipUserObject;\nimpl hipGraphNodeType {\n    ///< GPU kernel node\n    pub const hipGraphNodeTypeKernel: hipGraphNodeType = hipGraphNodeType(0);\n}\nimpl hipGraphNodeType {\n    ///< Memcpy node\n    pub const hipGraphNodeTypeMemcpy: hipGraphNodeType = hipGraphNodeType(1);\n}\nimpl hipGraphNodeType {\n    ///< Memset node\n    pub const hipGraphNodeTypeMemset: hipGraphNodeType = hipGraphNodeType(2);\n}\nimpl hipGraphNodeType {\n    ///< Host (executable) node\n    pub const hipGraphNodeTypeHost: hipGraphNodeType = hipGraphNodeType(3);\n}\nimpl hipGraphNodeType {\n    ///< Node which executes an embedded graph\n    pub const hipGraphNodeTypeGraph: hipGraphNodeType = hipGraphNodeType(4);\n}\nimpl hipGraphNodeType {\n    ///< Empty (no-op) node\n    pub const hipGraphNodeTypeEmpty: hipGraphNodeType = hipGraphNodeType(5);\n}\nimpl hipGraphNodeType {\n    ///< External event wait node\n    pub const hipGraphNodeTypeWaitEvent: hipGraphNodeType = hipGraphNodeType(6);\n}\nimpl hipGraphNodeType {\n    ///< External event record node\n    pub const hipGraphNodeTypeEventRecord: hipGraphNodeType = hipGraphNodeType(7);\n}\nimpl hipGraphNodeType {\n    ///< External Semaphore signal node\n    pub const hipGraphNodeTypeExtSemaphoreSignal: hipGraphNodeType = hipGraphNodeType(8);\n}\nimpl hipGraphNodeType {\n    ///< External Semaphore wait node\n    pub const hipGraphNodeTypeExtSemaphoreWait: hipGraphNodeType = hipGraphNodeType(9);\n}\nimpl hipGraphNodeType {\n    ///< Memory alloc node\n    pub const hipGraphNodeTypeMemAlloc: hipGraphNodeType = hipGraphNodeType(10);\n}\nimpl hipGraphNodeType {\n    ///< Memory free node\n    pub const hipGraphNodeTypeMemFree: hipGraphNodeType = hipGraphNodeType(11);\n}\nimpl hipGraphNodeType {\n    ///< MemcpyFromSymbol node\n    pub const hipGraphNodeTypeMemcpyFromSymbol: hipGraphNodeType = hipGraphNodeType(12);\n}\nimpl hipGraphNodeType {\n    ///< MemcpyToSymbol node\n    pub const hipGraphNodeTypeMemcpyToSymbol: hipGraphNodeType = hipGraphNodeType(13);\n}\nimpl hipGraphNodeType {\n    ///< BatchMemOp node\n    pub const hipGraphNodeTypeBatchMemOp: hipGraphNodeType = hipGraphNodeType(14);\n}\nimpl hipGraphNodeType {\n    pub const hipGraphNodeTypeCount: hipGraphNodeType = hipGraphNodeType(15);\n}\n#[repr(transparent)]\n/// hipGraphNodeType\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipGraphNodeType(pub ::core::ffi::c_uint);\npub type hipHostFn_t = ::core::option::Option<\n    unsafe extern \"C\" fn(userData: *mut ::core::ffi::c_void),\n>;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipHostNodeParams {\n    pub fn_: hipHostFn_t,\n    pub userData: *mut ::core::ffi::c_void,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipKernelNodeParams {\n    pub blockDim: dim3,\n    pub extra: *mut *mut ::core::ffi::c_void,\n    pub func: *mut ::core::ffi::c_void,\n    pub gridDim: dim3,\n    pub kernelParams: *mut *mut ::core::ffi::c_void,\n    pub sharedMemBytes: ::core::ffi::c_uint,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipMemsetParams {\n    pub dst: *mut ::core::ffi::c_void,\n    pub elementSize: ::core::ffi::c_uint,\n    pub height: usize,\n    pub pitch: usize,\n    pub value: ::core::ffi::c_uint,\n    pub width: usize,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipMemAllocNodeParams {\n    /**< Pool properties, which contain where\n< the location should reside*/\n    pub poolProps: hipMemPoolProps,\n    ///< The number of memory access descriptors.\n    pub accessDescs: *const hipMemAccessDesc,\n    /**< The number of access descriptors.\n< Must not be bigger than the number of GPUs*/\n    pub accessDescCount: usize,\n    ///< The size of the requested allocation in bytes\n    pub bytesize: usize,\n    ///< Returned device address of the allocation\n    pub dptr: *mut ::core::ffi::c_void,\n}\nimpl hipAccessProperty {\n    pub const hipAccessPropertyNormal: hipAccessProperty = hipAccessProperty(0);\n}\nimpl hipAccessProperty {\n    pub const hipAccessPropertyStreaming: hipAccessProperty = hipAccessProperty(1);\n}\nimpl hipAccessProperty {\n    pub const hipAccessPropertyPersisting: hipAccessProperty = hipAccessProperty(2);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipAccessProperty(pub ::core::ffi::c_uint);\n#[repr(C)]\n#[derive(Debug, Copy, Clone, PartialEq)]\npub struct hipAccessPolicyWindow {\n    pub base_ptr: *mut ::core::ffi::c_void,\n    pub hitProp: hipAccessProperty,\n    pub hitRatio: f32,\n    pub missProp: hipAccessProperty,\n    pub num_bytes: usize,\n}\nimpl hipLaunchAttributeID {\n    ///< Valid for Streams, graph nodes, launches\n    pub const hipLaunchAttributeAccessPolicyWindow: hipLaunchAttributeID = hipLaunchAttributeID(\n        1,\n    );\n}\nimpl hipLaunchAttributeID {\n    ///< Valid for graph nodes, launches\n    pub const hipLaunchAttributeCooperative: hipLaunchAttributeID = hipLaunchAttributeID(\n        2,\n    );\n}\nimpl hipLaunchAttributeID {\n    ///< Valid for graph node, streams, launches\n    pub const hipLaunchAttributePriority: hipLaunchAttributeID = hipLaunchAttributeID(8);\n}\n#[repr(transparent)]\n///  Launch Attribute ID\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipLaunchAttributeID(pub ::core::ffi::c_uint);\n///  Launch Attribute Value\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union hipLaunchAttributeValue {\n    /**< Value of launch attribute::\nhipLaunchAttributePolicyWindow.*/\n    pub accessPolicyWindow: hipAccessPolicyWindow,\n    ///< Value of launch attribute ::hipLaunchAttributeCooperative\n    pub cooperative: ::core::ffi::c_int,\n    /**< Value of launch attribute :: hipLaunchAttributePriority. Execution\npriority of kernel.*/\n    pub priority: ::core::ffi::c_int,\n}\n/// Memset node params\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct HIP_MEMSET_NODE_PARAMS {\n    ///< Destination pointer on device\n    pub dst: hipDeviceptr_t,\n    ///< Destination device pointer pitch. Unused if height equals 1\n    pub pitch: usize,\n    ///< Value of memset to be set\n    pub value: ::core::ffi::c_uint,\n    ///< Element in bytes. Must be 1, 2, or 4.\n    pub elementSize: ::core::ffi::c_uint,\n    ///< Width of a row\n    pub width: usize,\n    ///< Number of rows\n    pub height: usize,\n}\nimpl hipGraphExecUpdateResult {\n    ///< The update succeeded\n    pub const hipGraphExecUpdateSuccess: hipGraphExecUpdateResult = hipGraphExecUpdateResult(\n        0,\n    );\n}\nimpl hipGraphExecUpdateResult {\n    /**< The update failed for an unexpected reason which is described\n< in the return value of the function*/\n    pub const hipGraphExecUpdateError: hipGraphExecUpdateResult = hipGraphExecUpdateResult(\n        1,\n    );\n}\nimpl hipGraphExecUpdateResult {\n    ///< The update failed because the topology changed\n    pub const hipGraphExecUpdateErrorTopologyChanged: hipGraphExecUpdateResult = hipGraphExecUpdateResult(\n        2,\n    );\n}\nimpl hipGraphExecUpdateResult {\n    ///< The update failed because a node type changed\n    pub const hipGraphExecUpdateErrorNodeTypeChanged: hipGraphExecUpdateResult = hipGraphExecUpdateResult(\n        3,\n    );\n}\nimpl hipGraphExecUpdateResult {\n    pub const hipGraphExecUpdateErrorFunctionChanged: hipGraphExecUpdateResult = hipGraphExecUpdateResult(\n        4,\n    );\n}\nimpl hipGraphExecUpdateResult {\n    pub const hipGraphExecUpdateErrorParametersChanged: hipGraphExecUpdateResult = hipGraphExecUpdateResult(\n        5,\n    );\n}\nimpl hipGraphExecUpdateResult {\n    pub const hipGraphExecUpdateErrorNotSupported: hipGraphExecUpdateResult = hipGraphExecUpdateResult(\n        6,\n    );\n}\nimpl hipGraphExecUpdateResult {\n    pub const hipGraphExecUpdateErrorUnsupportedFunctionChange: hipGraphExecUpdateResult = hipGraphExecUpdateResult(\n        7,\n    );\n}\n#[repr(transparent)]\n/// Graph execution update result\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipGraphExecUpdateResult(pub ::core::ffi::c_uint);\nimpl hipStreamCaptureMode {\n    pub const hipStreamCaptureModeGlobal: hipStreamCaptureMode = hipStreamCaptureMode(0);\n}\nimpl hipStreamCaptureMode {\n    pub const hipStreamCaptureModeThreadLocal: hipStreamCaptureMode = hipStreamCaptureMode(\n        1,\n    );\n}\nimpl hipStreamCaptureMode {\n    pub const hipStreamCaptureModeRelaxed: hipStreamCaptureMode = hipStreamCaptureMode(\n        2,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipStreamCaptureMode(pub ::core::ffi::c_uint);\nimpl hipStreamCaptureStatus {\n    ///< Stream is not capturing\n    pub const hipStreamCaptureStatusNone: hipStreamCaptureStatus = hipStreamCaptureStatus(\n        0,\n    );\n}\nimpl hipStreamCaptureStatus {\n    ///< Stream is actively capturing\n    pub const hipStreamCaptureStatusActive: hipStreamCaptureStatus = hipStreamCaptureStatus(\n        1,\n    );\n}\nimpl hipStreamCaptureStatus {\n    /**< Stream is part of a capture sequence that has been\n< invalidated, but not terminated*/\n    pub const hipStreamCaptureStatusInvalidated: hipStreamCaptureStatus = hipStreamCaptureStatus(\n        2,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipStreamCaptureStatus(pub ::core::ffi::c_uint);\nimpl hipStreamUpdateCaptureDependenciesFlags {\n    ///< Add new nodes to the dependency set\n    pub const hipStreamAddCaptureDependencies: hipStreamUpdateCaptureDependenciesFlags = hipStreamUpdateCaptureDependenciesFlags(\n        0,\n    );\n}\nimpl hipStreamUpdateCaptureDependenciesFlags {\n    ///< Replace the dependency set with the new nodes\n    pub const hipStreamSetCaptureDependencies: hipStreamUpdateCaptureDependenciesFlags = hipStreamUpdateCaptureDependenciesFlags(\n        1,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipStreamUpdateCaptureDependenciesFlags(pub ::core::ffi::c_uint);\nimpl hipGraphMemAttributeType {\n    ///< Amount of memory, in bytes, currently associated with graphs\n    pub const hipGraphMemAttrUsedMemCurrent: hipGraphMemAttributeType = hipGraphMemAttributeType(\n        0,\n    );\n}\nimpl hipGraphMemAttributeType {\n    ///< High watermark of memory, in bytes, associated with graphs since the last time.\n    pub const hipGraphMemAttrUsedMemHigh: hipGraphMemAttributeType = hipGraphMemAttributeType(\n        1,\n    );\n}\nimpl hipGraphMemAttributeType {\n    ///< Amount of memory, in bytes, currently allocated for graphs.\n    pub const hipGraphMemAttrReservedMemCurrent: hipGraphMemAttributeType = hipGraphMemAttributeType(\n        2,\n    );\n}\nimpl hipGraphMemAttributeType {\n    ///< High watermark of memory, in bytes, currently allocated for graphs\n    pub const hipGraphMemAttrReservedMemHigh: hipGraphMemAttributeType = hipGraphMemAttributeType(\n        3,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipGraphMemAttributeType(pub ::core::ffi::c_uint);\nimpl hipUserObjectFlags {\n    ///< Destructor execution is not synchronized.\n    pub const hipUserObjectNoDestructorSync: hipUserObjectFlags = hipUserObjectFlags(1);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipUserObjectFlags(pub ::core::ffi::c_uint);\nimpl hipUserObjectRetainFlags {\n    ///< Add new reference or retain.\n    pub const hipGraphUserObjectMove: hipUserObjectRetainFlags = hipUserObjectRetainFlags(\n        1,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipUserObjectRetainFlags(pub ::core::ffi::c_uint);\nimpl hipGraphInstantiateFlags {\n    pub const hipGraphInstantiateFlagAutoFreeOnLaunch: hipGraphInstantiateFlags = hipGraphInstantiateFlags(\n        1,\n    );\n}\nimpl hipGraphInstantiateFlags {\n    pub const hipGraphInstantiateFlagUpload: hipGraphInstantiateFlags = hipGraphInstantiateFlags(\n        2,\n    );\n}\nimpl hipGraphInstantiateFlags {\n    pub const hipGraphInstantiateFlagDeviceLaunch: hipGraphInstantiateFlags = hipGraphInstantiateFlags(\n        4,\n    );\n}\nimpl hipGraphInstantiateFlags {\n    pub const hipGraphInstantiateFlagUseNodePriority: hipGraphInstantiateFlags = hipGraphInstantiateFlags(\n        8,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipGraphInstantiateFlags(pub ::core::ffi::c_uint);\nimpl hipGraphDebugDotFlags {\n    pub const hipGraphDebugDotFlagsVerbose: hipGraphDebugDotFlags = hipGraphDebugDotFlags(\n        1,\n    );\n}\nimpl hipGraphDebugDotFlags {\n    ///< Adds hipKernelNodeParams to output\n    pub const hipGraphDebugDotFlagsKernelNodeParams: hipGraphDebugDotFlags = hipGraphDebugDotFlags(\n        4,\n    );\n}\nimpl hipGraphDebugDotFlags {\n    ///< Adds hipMemcpy3DParms to output\n    pub const hipGraphDebugDotFlagsMemcpyNodeParams: hipGraphDebugDotFlags = hipGraphDebugDotFlags(\n        8,\n    );\n}\nimpl hipGraphDebugDotFlags {\n    ///< Adds hipMemsetParams to output\n    pub const hipGraphDebugDotFlagsMemsetNodeParams: hipGraphDebugDotFlags = hipGraphDebugDotFlags(\n        16,\n    );\n}\nimpl hipGraphDebugDotFlags {\n    ///< Adds hipHostNodeParams to output\n    pub const hipGraphDebugDotFlagsHostNodeParams: hipGraphDebugDotFlags = hipGraphDebugDotFlags(\n        32,\n    );\n}\nimpl hipGraphDebugDotFlags {\n    pub const hipGraphDebugDotFlagsEventNodeParams: hipGraphDebugDotFlags = hipGraphDebugDotFlags(\n        64,\n    );\n}\nimpl hipGraphDebugDotFlags {\n    pub const hipGraphDebugDotFlagsExtSemasSignalNodeParams: hipGraphDebugDotFlags = hipGraphDebugDotFlags(\n        128,\n    );\n}\nimpl hipGraphDebugDotFlags {\n    pub const hipGraphDebugDotFlagsExtSemasWaitNodeParams: hipGraphDebugDotFlags = hipGraphDebugDotFlags(\n        256,\n    );\n}\nimpl hipGraphDebugDotFlags {\n    pub const hipGraphDebugDotFlagsKernelNodeAttributes: hipGraphDebugDotFlags = hipGraphDebugDotFlags(\n        512,\n    );\n}\nimpl hipGraphDebugDotFlags {\n    pub const hipGraphDebugDotFlagsHandles: hipGraphDebugDotFlags = hipGraphDebugDotFlags(\n        1024,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipGraphDebugDotFlags(pub ::core::ffi::c_uint);\nimpl hipGraphInstantiateResult {\n    ///< Instantiation Success\n    pub const hipGraphInstantiateSuccess: hipGraphInstantiateResult = hipGraphInstantiateResult(\n        0,\n    );\n}\nimpl hipGraphInstantiateResult {\n    /**< Instantiation failed for an\nunexpected reason which is described in the return value of the function*/\n    pub const hipGraphInstantiateError: hipGraphInstantiateResult = hipGraphInstantiateResult(\n        1,\n    );\n}\nimpl hipGraphInstantiateResult {\n    /**< Instantiation failed due\nto invalid structure, such as cycles*/\n    pub const hipGraphInstantiateInvalidStructure: hipGraphInstantiateResult = hipGraphInstantiateResult(\n        2,\n    );\n}\nimpl hipGraphInstantiateResult {\n    /**< Instantiation for device launch failed\nbecause the graph contained an unsupported operation*/\n    pub const hipGraphInstantiateNodeOperationNotSupported: hipGraphInstantiateResult = hipGraphInstantiateResult(\n        3,\n    );\n}\nimpl hipGraphInstantiateResult {\n    /**< Instantiation for device launch failed\ndue to the nodes belonging to different contexts*/\n    pub const hipGraphInstantiateMultipleDevicesNotSupported: hipGraphInstantiateResult = hipGraphInstantiateResult(\n        4,\n    );\n}\n#[repr(transparent)]\n/// hipGraphInstantiateWithParams results\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipGraphInstantiateResult(pub ::core::ffi::c_uint);\n/// Graph Instantiation parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipGraphInstantiateParams {\n    ///< The node which caused instantiation to fail, if any\n    pub errNode_out: hipGraphNode_t,\n    ///< Instantiation flags\n    pub flags: ::core::ffi::c_ulonglong,\n    /**< Whether instantiation was successful.\nIf it failed, the reason why*/\n    pub result_out: hipGraphInstantiateResult,\n    ///< Upload stream\n    pub uploadStream: hipStream_t,\n}\n/// Memory allocation properties\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipMemAllocationProp {\n    ///< Memory allocation type\n    pub type_: hipMemAllocationType,\n    ///< Requested handle type\n    pub requestedHandleType: hipMemAllocationHandleType,\n    ///< Memory location\n    pub location: hipMemLocation,\n    ///< Metadata for Win32 handles\n    pub win32HandleMetaData: *mut ::core::ffi::c_void,\n    pub allocFlags: hipMemAllocationProp__bindgen_ty_1,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipMemAllocationProp__bindgen_ty_1 {\n    ///< Compression type\n    pub compressionType: ::core::ffi::c_uchar,\n    ///< RDMA capable\n    pub gpuDirectRDMACapable: ::core::ffi::c_uchar,\n    ///< Usage\n    pub usage: ::core::ffi::c_ushort,\n}\n/// External semaphore signal node parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipExternalSemaphoreSignalNodeParams {\n    pub extSemArray: *mut hipExternalSemaphore_t,\n    pub paramsArray: *const hipExternalSemaphoreSignalParams,\n    pub numExtSems: ::core::ffi::c_uint,\n}\n/// External semaphore wait node parameters\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipExternalSemaphoreWaitNodeParams {\n    pub extSemArray: *mut hipExternalSemaphore_t,\n    pub paramsArray: *const hipExternalSemaphoreWaitParams,\n    pub numExtSems: ::core::ffi::c_uint,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct ihipMemGenericAllocationHandle {\n    _unused: [u8; 0],\n}\n/// Generic handle for memory allocation\npub type hipMemGenericAllocationHandle_t = *mut ihipMemGenericAllocationHandle;\nimpl hipMemAllocationGranularity_flags {\n    ///< Minimum granularity\n    pub const hipMemAllocationGranularityMinimum: hipMemAllocationGranularity_flags = hipMemAllocationGranularity_flags(\n        0,\n    );\n}\nimpl hipMemAllocationGranularity_flags {\n    ///< Recommended granularity for performance\n    pub const hipMemAllocationGranularityRecommended: hipMemAllocationGranularity_flags = hipMemAllocationGranularity_flags(\n        1,\n    );\n}\n#[repr(transparent)]\n/// Flags for granularity\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipMemAllocationGranularity_flags(pub ::core::ffi::c_uint);\nimpl hipMemHandleType {\n    ///< Generic handle type\n    pub const hipMemHandleTypeGeneric: hipMemHandleType = hipMemHandleType(0);\n}\n#[repr(transparent)]\n/// Memory handle type\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipMemHandleType(pub ::core::ffi::c_uint);\nimpl hipMemOperationType {\n    ///< Map operation\n    pub const hipMemOperationTypeMap: hipMemOperationType = hipMemOperationType(1);\n}\nimpl hipMemOperationType {\n    ///< Unmap operation\n    pub const hipMemOperationTypeUnmap: hipMemOperationType = hipMemOperationType(2);\n}\n#[repr(transparent)]\n/// Memory operation types\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipMemOperationType(pub ::core::ffi::c_uint);\nimpl hipArraySparseSubresourceType {\n    ///< Sparse level\n    pub const hipArraySparseSubresourceTypeSparseLevel: hipArraySparseSubresourceType = hipArraySparseSubresourceType(\n        0,\n    );\n}\nimpl hipArraySparseSubresourceType {\n    ///< Miptail\n    pub const hipArraySparseSubresourceTypeMiptail: hipArraySparseSubresourceType = hipArraySparseSubresourceType(\n        1,\n    );\n}\n#[repr(transparent)]\n/// Subresource types for sparse arrays\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipArraySparseSubresourceType(pub ::core::ffi::c_uint);\n/// Map info for arrays\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct hipArrayMapInfo {\n    ///< Resource type\n    pub resourceType: hipResourceType,\n    pub resource: hipArrayMapInfo__bindgen_ty_1,\n    ///< Sparse subresource type\n    pub subresourceType: hipArraySparseSubresourceType,\n    pub subresource: hipArrayMapInfo__bindgen_ty_2,\n    ///< Memory operation type\n    pub memOperationType: hipMemOperationType,\n    ///< Memory handle type\n    pub memHandleType: hipMemHandleType,\n    pub memHandle: hipArrayMapInfo__bindgen_ty_3,\n    ///< Offset within the memory\n    pub offset: ::core::ffi::c_ulonglong,\n    ///< Device ordinal bit mask\n    pub deviceBitMask: ::core::ffi::c_uint,\n    ///< flags for future use, must be zero now.\n    pub flags: ::core::ffi::c_uint,\n    ///< Reserved for future use, must be zero now.\n    pub reserved: [::core::ffi::c_uint; 2usize],\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union hipArrayMapInfo__bindgen_ty_1 {\n    pub mipmap: hipMipmappedArray,\n    pub array: hipArray_t,\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union hipArrayMapInfo__bindgen_ty_2 {\n    pub sparseLevel: hipArrayMapInfo__bindgen_ty_2__bindgen_ty_1,\n    pub miptail: hipArrayMapInfo__bindgen_ty_2__bindgen_ty_2,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipArrayMapInfo__bindgen_ty_2__bindgen_ty_1 {\n    ///< For mipmapped arrays must be a valid mipmap level. For arrays must be zero\n    pub level: ::core::ffi::c_uint,\n    ///< For layered arrays must be a valid layer index. Otherwise, must be zero\n    pub layer: ::core::ffi::c_uint,\n    ///< X offset in elements\n    pub offsetX: ::core::ffi::c_uint,\n    ///< Y offset in elements\n    pub offsetY: ::core::ffi::c_uint,\n    ///< Z offset in elements\n    pub offsetZ: ::core::ffi::c_uint,\n    ///< Width in elements\n    pub extentWidth: ::core::ffi::c_uint,\n    ///< Height in elements\n    pub extentHeight: ::core::ffi::c_uint,\n    ///< Depth in elements\n    pub extentDepth: ::core::ffi::c_uint,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipArrayMapInfo__bindgen_ty_2__bindgen_ty_2 {\n    ///< For layered arrays must be a valid layer index. Otherwise, must be zero\n    pub layer: ::core::ffi::c_uint,\n    ///< Offset within mip tail\n    pub offset: ::core::ffi::c_ulonglong,\n    ///< Extent in bytes\n    pub size: ::core::ffi::c_ulonglong,\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union hipArrayMapInfo__bindgen_ty_3 {\n    pub memHandle: hipMemGenericAllocationHandle_t,\n}\n/// Memcpy node params\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipMemcpyNodeParams {\n    ///< Must be zero.\n    pub flags: ::core::ffi::c_int,\n    ///< Must be zero.\n    pub reserved: [::core::ffi::c_int; 3usize],\n    ///< Params set for the memory copy.\n    pub copyParams: hipMemcpy3DParms,\n}\n/// Child graph node params\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipChildGraphNodeParams {\n    /**< Either the child graph to clone into the node, or\n< a handle to the graph possesed by the node used during query*/\n    pub graph: hipGraph_t,\n}\n/// Event record node params\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipEventWaitNodeParams {\n    ///< Event to wait on\n    pub event: hipEvent_t,\n}\n/// Event record node params\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipEventRecordNodeParams {\n    ///< The event to be recorded when node executes\n    pub event: hipEvent_t,\n}\n/// Memory free node params\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipMemFreeNodeParams {\n    ///< the pointer to be freed\n    pub dptr: *mut ::core::ffi::c_void,\n}\n/// Params for different graph nodes\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct hipGraphNodeParams {\n    pub type_: hipGraphNodeType,\n    pub reserved0: [::core::ffi::c_int; 3usize],\n    pub __bindgen_anon_1: hipGraphNodeParams__bindgen_ty_1,\n    pub reserved2: ::core::ffi::c_longlong,\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union hipGraphNodeParams__bindgen_ty_1 {\n    pub reserved1: [::core::ffi::c_longlong; 29usize],\n    pub kernel: hipKernelNodeParams,\n    pub memcpy: hipMemcpyNodeParams,\n    pub memset: hipMemsetParams,\n    pub host: hipHostNodeParams,\n    pub graph: hipChildGraphNodeParams,\n    pub eventWait: hipEventWaitNodeParams,\n    pub eventRecord: hipEventRecordNodeParams,\n    pub extSemSignal: hipExternalSemaphoreSignalNodeParams,\n    pub extSemWait: hipExternalSemaphoreWaitNodeParams,\n    pub alloc: hipMemAllocNodeParams,\n    pub free: hipMemFreeNodeParams,\n}\nimpl hipGraphDependencyType {\n    pub const hipGraphDependencyTypeDefault: hipGraphDependencyType = hipGraphDependencyType(\n        0,\n    );\n}\nimpl hipGraphDependencyType {\n    pub const hipGraphDependencyTypeProgrammatic: hipGraphDependencyType = hipGraphDependencyType(\n        1,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipGraphDependencyType(pub ::core::ffi::c_uint);\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipGraphEdgeData {\n    /**< This indicates when the dependency is triggered from the upstream node on the\n< edge. The meaning is specfic to the node type. A value of 0 in all cases\n< means full completion of the upstream node, with memory visibility to the\n< downstream node or portion thereof (indicated by to_port). Only kernel nodes\n< define non-zero ports. A kernel node can use the following output port types:\n< hipGraphKernelNodePortDefault, hipGraphKernelNodePortProgrammatic, or\n< hipGraphKernelNodePortLaunchCompletion.*/\n    pub from_port: ::core::ffi::c_uchar,\n    ///< These bytes are unused and must be zeroed\n    pub reserved: [::core::ffi::c_uchar; 5usize],\n    ///< Currently no node types define non-zero ports. This field must be set to zero.\n    pub to_port: ::core::ffi::c_uchar,\n    ///< This should be populated with a value from hipGraphDependencyType\n    pub type_: ::core::ffi::c_uchar,\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" @}\\n/\\n/**\\n  @defgroup API HIP API\\n  @{\\n\\n  Defines the HIP API.  See the individual sections for more information.\\n/\\n/**\\n  @defgroup Driver Initialization and Version\\n  @{\\n  This section describes the initializtion and version functions of HIP runtime API.\\n\\n/\\n/**\\n @brief Explicitly initializes the HIP runtime.\\n\\n @param [in] flags  Initialization flag, should be zero.\\n\\n Most HIP APIs implicitly initialize the HIP runtime.\\n This API provides control over the timing of the initialization.\\n\\n @returns #hipSuccess, #hipErrorInvalidValue\"]\n    pub fn hipInit(flags: ::core::ffi::c_uint) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns the approximate HIP driver version.\n\n @param [out] driverVersion driver version\n\n HIP driver version shows up in the format:\n HIP_VERSION_MAJOR * 10000000 + HIP_VERSION_MINOR * 100000 + HIP_VERSION_PATCH.\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @warning The HIP driver version does not correspond to an exact CUDA driver revision.\n On AMD platform, the API returns the HIP driver version, while on NVIDIA platform, it calls\n the corresponding CUDA runtime API and returns the CUDA driver version.\n There is no mapping/correlation between HIP driver version and CUDA driver version.\n\n @see hipRuntimeGetVersion*/\n    pub fn hipDriverGetVersion(driverVersion: *mut ::core::ffi::c_int) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns the approximate HIP Runtime version.\n\n @param [out] runtimeVersion HIP runtime version\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @warning The version definition of HIP runtime is different from CUDA.\n On AMD platform, the function returns HIP runtime version,\n while on NVIDIA platform, it returns CUDA runtime version.\n And there is no mapping/correlation between HIP version and CUDA version.\n\n @see hipDriverGetVersion*/\n    pub fn hipRuntimeGetVersion(runtimeVersion: *mut ::core::ffi::c_int) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns a handle to a compute device\n @param [out] device Handle of device\n @param [in] ordinal Device ordinal\n\n @returns #hipSuccess, #hipErrorInvalidDevice*/\n    pub fn hipDeviceGet(\n        device: *mut hipDevice_t,\n        ordinal: ::core::ffi::c_int,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns the compute capability of the device\n @param [out] major Major compute capability version number\n @param [out] minor Minor compute capability version number\n @param [in] device Device ordinal\n\n @returns #hipSuccess, #hipErrorInvalidDevice*/\n    pub fn hipDeviceComputeCapability(\n        major: *mut ::core::ffi::c_int,\n        minor: *mut ::core::ffi::c_int,\n        device: hipDevice_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns an identifer string for the device.\n @param [out] name String of the device name\n @param [in] len Maximum length of string to store in device name\n @param [in] device Device ordinal\n\n @returns #hipSuccess, #hipErrorInvalidDevice*/\n    pub fn hipDeviceGetName(\n        name: *mut ::core::ffi::c_char,\n        len: ::core::ffi::c_int,\n        device: hipDevice_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns an UUID for the device.[BETA]\n @param [out] uuid UUID for the device\n @param [in] device device ordinal\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @returns #hipSuccess, #hipErrorInvalidDevice, #hipErrorInvalidValue, #hipErrorNotInitialized,\n #hipErrorDeinitialized*/\n    pub fn hipDeviceGetUuid(uuid: *mut hipUUID, device: hipDevice_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns a value for attribute of link between two devices\n @param [out] value Pointer of the value for the attrubute\n @param [in] attr enum of hipDeviceP2PAttr to query\n @param [in] srcDevice The source device of the link\n @param [in] dstDevice The destination device of the link\n\n @returns #hipSuccess, #hipErrorInvalidDevice*/\n    pub fn hipDeviceGetP2PAttribute(\n        value: *mut ::core::ffi::c_int,\n        attr: hipDeviceP2PAttr,\n        srcDevice: ::core::ffi::c_int,\n        dstDevice: ::core::ffi::c_int,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns a PCI Bus Id string for the device, overloaded to take int device ID.\n @param [out] pciBusId The string of PCI Bus Id format for the device\n @param [in] len Maximum length of string\n @param [in] device The device ordinal\n\n @returns #hipSuccess, #hipErrorInvalidDevice*/\n    pub fn hipDeviceGetPCIBusId(\n        pciBusId: *mut ::core::ffi::c_char,\n        len: ::core::ffi::c_int,\n        device: ::core::ffi::c_int,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns a handle to a compute device.\n @param [out] device The handle of the device\n @param [in] pciBusId The string of PCI Bus Id for the device\n\n @returns #hipSuccess, #hipErrorInvalidDevice, #hipErrorInvalidValue*/\n    pub fn hipDeviceGetByPCIBusId(\n        device: *mut ::core::ffi::c_int,\n        pciBusId: *const ::core::ffi::c_char,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns the total amount of memory on the device.\n @param [out] bytes The size of memory in bytes, on the device\n @param [in] device The ordinal of the device\n\n @returns #hipSuccess, #hipErrorInvalidDevice*/\n    pub fn hipDeviceTotalMem(bytes: *mut usize, device: hipDevice_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" @}\\n/\\n/**\\n  @defgroup Device Device Management\\n  @{\\n  This section describes the device management functions of HIP runtime API.\\n/\\n/**\\n @brief Waits on all active streams on current device\\n\\n When this command is invoked, the host thread gets blocked until all the commands associated\\n with streams associated with the device. HIP does not support multiple blocking modes (yet!).\\n\\n @returns #hipSuccess\\n\\n @see hipSetDevice, hipDeviceReset\"]\n    pub fn hipDeviceSynchronize() -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief The state of current device is discarded and updated to a fresh state.\n\n Calling this function deletes all streams created, memory allocated, kernels running, events\n created. Make sure that no other thread is using the device or streams, memory, kernels, events\n associated with the current device.\n\n @returns #hipSuccess\n\n @see hipDeviceSynchronize*/\n    pub fn hipDeviceReset() -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set default device to be used for subsequent hip API calls from this thread.\n\n @param[in] deviceId Valid device in range 0...hipGetDeviceCount().\n\n Sets @p device as the default device for the calling host thread.  Valid device id's are 0...\n (hipGetDeviceCount()-1).\n\n Many HIP APIs implicitly use the \"default device\" :\n\n - Any device memory subsequently allocated from this host thread (using hipMalloc) will be\n allocated on device.\n - Any streams or events created from this host thread will be associated with device.\n - Any kernels launched from this host thread (using hipLaunchKernel) will be executed on device\n (unless a specific stream is specified, in which case the device associated with that stream will\n be used).\n\n This function may be called from any host thread.  Multiple host threads may use the same device.\n This function does no synchronization with the previous or new device, and has very little\n runtime overhead. Applications can use hipSetDevice to quickly switch the default device before\n making a HIP runtime call which uses the default device.\n\n The default device is stored in thread-local-storage for each thread.\n Thread-pool implementations may inherit the default device of the previous thread.  A good\n practice is to always call hipSetDevice at the start of HIP coding sequency to establish a known\n standard device.\n\n @returns #hipSuccess, #hipErrorInvalidDevice, #hipErrorNoDevice\n\n @see #hipGetDevice, #hipGetDeviceCount*/\n    pub fn hipSetDevice(deviceId: ::core::ffi::c_int) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set a list of devices that can be used.\n\n @param[in] device_arr List of devices to try\n @param[in] len Number of devices in specified list\n\n @returns #hipSuccess, #hipErrorInvalidDevice, #hipErrorInvalidValue\n\n @see #hipGetDevice, #hipGetDeviceCount. #hipSetDevice. #hipGetDeviceProperties. #hipSetDeviceFlags. #hipChooseDevice\n*/\n    pub fn hipSetValidDevices(\n        device_arr: *mut ::core::ffi::c_int,\n        len: ::core::ffi::c_int,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Return the default device id for the calling host thread.\n\n @param [out] deviceId *device is written with the default device\n\n HIP maintains an default device for each thread using thread-local-storage.\n This device is used implicitly for HIP runtime APIs called by this thread.\n hipGetDevice returns in * @p device the default device for the calling host thread.\n\n @returns #hipSuccess, #hipErrorInvalidDevice, #hipErrorInvalidValue\n\n @see hipSetDevice, hipGetDevicesizeBytes*/\n    pub fn hipGetDevice(deviceId: *mut ::core::ffi::c_int) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Return number of compute-capable devices.\n\n @param [out] count Returns number of compute-capable devices.\n\n @returns #hipSuccess, #hipErrorNoDevice\n\n\n Returns in @p *count the number of devices that have ability to run compute commands.  If there\n are no such devices, then @ref hipGetDeviceCount will return #hipErrorNoDevice. If 1 or more\n devices can be found, then hipGetDeviceCount returns #hipSuccess.*/\n    pub fn hipGetDeviceCount(count: *mut ::core::ffi::c_int) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Query for a specific device attribute.\n\n @param [out] pi pointer to value to return\n @param [in] attr attribute to query\n @param [in] deviceId which device to query for information\n\n @returns #hipSuccess, #hipErrorInvalidDevice, #hipErrorInvalidValue*/\n    pub fn hipDeviceGetAttribute(\n        pi: *mut ::core::ffi::c_int,\n        attr: hipDeviceAttribute_t,\n        deviceId: ::core::ffi::c_int,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns the default memory pool of the specified device\n\n @param [out] mem_pool Default memory pool to return\n @param [in] device    Device index for query the default memory pool\n\n @returns #hipSuccess, #hipErrorInvalidDevice, #hipErrorInvalidValue, #hipErrorNotSupported\n\n @see hipDeviceGetDefaultMemPool, hipMallocAsync, hipMemPoolTrimTo, hipMemPoolGetAttribute,\n hipDeviceSetMemPool, hipMemPoolSetAttribute, hipMemPoolSetAccess, hipMemPoolGetAccess\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipDeviceGetDefaultMemPool(\n        mem_pool: *mut hipMemPool_t,\n        device: ::core::ffi::c_int,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets the current memory pool of a device\n\n The memory pool must be local to the specified device.\n @p hipMallocAsync allocates from the current mempool of the provided stream's device.\n By default, a device's current memory pool is its default memory pool.\n\n @note Use @p hipMallocFromPoolAsync for asynchronous memory allocations from a device\n different than the one the stream runs on.\n\n @param [in] device   Device index for the update\n @param [in] mem_pool Memory pool for update as the current on the specified device\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidDevice, #hipErrorNotSupported\n\n @see hipDeviceGetDefaultMemPool, hipMallocAsync, hipMemPoolTrimTo, hipMemPoolGetAttribute,\n hipDeviceSetMemPool, hipMemPoolSetAttribute, hipMemPoolSetAccess, hipMemPoolGetAccess\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipDeviceSetMemPool(\n        device: ::core::ffi::c_int,\n        mem_pool: hipMemPool_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets the current memory pool for the specified device\n\n Returns the last pool provided to @p hipDeviceSetMemPool for this device\n or the device's default memory pool if @p hipDeviceSetMemPool has never been called.\n By default the current mempool is the default mempool for a device,\n otherwise the returned pool must have been set with @p hipDeviceSetMemPool.\n\n @param [out] mem_pool Current memory pool on the specified device\n @param [in] device    Device index to query the current memory pool\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n\n @see hipDeviceGetDefaultMemPool, hipMallocAsync, hipMemPoolTrimTo, hipMemPoolGetAttribute,\n hipDeviceSetMemPool, hipMemPoolSetAttribute, hipMemPoolSetAccess, hipMemPoolGetAccess\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipDeviceGetMemPool(\n        mem_pool: *mut hipMemPool_t,\n        device: ::core::ffi::c_int,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns device properties.\n\n @param [out] prop written with device properties\n @param [in]  deviceId which device to query for information\n\n @returns #hipSuccess, #hipErrorInvalidDevice\n @bug HCC always returns 0 for maxThreadsPerMultiProcessor\n @bug HCC always returns 0 for regsPerBlock\n @bug HCC always returns 0 for l2CacheSize\n\n Populates hipGetDeviceProperties with information for the specified device.*/\n    pub fn hipGetDevicePropertiesR0600(\n        prop: *mut hipDeviceProp_tR0600,\n        deviceId: ::core::ffi::c_int,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets the maximum width for 1D linear textures on the specified device\n\n This function queries the maximum width, in elements, of 1D linear textures that can be allocated\n on the specified device. The maximum width depends on the texture element size and the hardware\n limitations of the device.\n\n @param [out] max_width Maximum width, in elements, of 1D linear textures that the device can support\n @param [in] device     Device index to query for maximum 1D texture width\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidDevice\n\n @see hipDeviceGetAttribute, hipMalloc, hipTexRefSetAddressMode*/\n    pub fn hipDeviceGetTexture1DLinearMaxWidth(\n        mem_pool: *mut hipMemPool_t,\n        device: ::core::ffi::c_int,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set L1/Shared cache partition.\n\n @param [in] cacheConfig Cache configuration\n\n @returns #hipSuccess, #hipErrorNotInitialized, #hipErrorNotSupported\n\n Note: AMD devices do not support reconfigurable cache. This API is not implemented\n on AMD platform. If the function is called, it will return hipErrorNotSupported.\n*/\n    pub fn hipDeviceSetCacheConfig(cacheConfig: hipFuncCache_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get Cache configuration for a specific Device\n\n @param [out] cacheConfig Pointer of cache configuration\n\n @returns #hipSuccess, #hipErrorNotInitialized\n Note: AMD devices do not support reconfigurable cache. This hint is ignored\n on these architectures.\n*/\n    pub fn hipDeviceGetCacheConfig(cacheConfig: *mut hipFuncCache_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets resource limits of current device\n\n The function queries the size of limit value, as required by the input enum value hipLimit_t,\n which can be either #hipLimitStackSize, or #hipLimitMallocHeapSize. Any other input as\n default, the function will return #hipErrorUnsupportedLimit.\n\n @param [out] pValue Returns the size of the limit in bytes\n @param [in]  limit The limit to query\n\n @returns #hipSuccess, #hipErrorUnsupportedLimit, #hipErrorInvalidValue\n*/\n    pub fn hipDeviceGetLimit(pValue: *mut usize, limit: hipLimit_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets resource limits of current device.\n\n As the input enum limit,\n #hipLimitStackSize sets the limit value of the stack size on the current GPU device, per thread.\n The limit size can get via hipDeviceGetLimit. The size is in units of 256 dwords, up to the limit\n (128K - 16).\n\n #hipLimitMallocHeapSize sets the limit value of the heap used by the malloc()/free()\n calls. For limit size, use the #hipDeviceGetLimit API.\n\n Any other input as default, the funtion will return hipErrorUnsupportedLimit.\n\n @param [in] limit Enum of hipLimit_t to set\n @param [in] value The size of limit value in bytes\n\n @returns #hipSuccess, #hipErrorUnsupportedLimit, #hipErrorInvalidValue\n*/\n    pub fn hipDeviceSetLimit(limit: hipLimit_t, value: usize) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns bank width of shared memory for current device\n\n @param [out] pConfig The pointer of the bank width for shared memory\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotInitialized\n\n Note: AMD devices and some Nvidia GPUS do not support shared cache banking, and the hint is\n ignored on those architectures.\n*/\n    pub fn hipDeviceGetSharedMemConfig(pConfig: *mut hipSharedMemConfig) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets the flags set for current device\n\n @param [out] flags Pointer of the flags\n\n @returns #hipSuccess, #hipErrorInvalidDevice, #hipErrorInvalidValue*/\n    pub fn hipGetDeviceFlags(flags: *mut ::core::ffi::c_uint) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief The bank width of shared memory on current device is set\n\n @param [in] config Configuration for the bank width of shared memory\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotInitialized\n\n Note: AMD devices and some Nvidia GPUS do not support shared cache banking, and the hint is\n ignored on those architectures.\n*/\n    pub fn hipDeviceSetSharedMemConfig(config: hipSharedMemConfig) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief The current device behavior is changed according to the flags passed.\n\n @param [in] flags Flag to set on the current device\n\n The schedule flags impact how HIP waits for the completion of a command running on a device.\n\n #hipDeviceScheduleSpin         : HIP runtime will actively spin in the thread which submitted\n the work until the command completes.  This offers the lowest latency, but will consume a CPU\n core and may increase power.\n\n #hipDeviceScheduleYield        : The HIP runtime will yield the CPU to system so that other\n tasks can use it. This may increase latency to detect the completion but will consume less\n power and is friendlier to other tasks in the system.\n\n #hipDeviceScheduleBlockingSync : On ROCm platform, this is a synonym for hipDeviceScheduleYield.\n\n #hipDeviceScheduleAuto         : This is the default value if the input 'flags' is zero.\n Uses a heuristic to select between Spin and Yield modes. If the number of HIP contexts is\n greater than the number of logical processors in the system, uses Spin scheduling, otherwise\n uses Yield scheduling.\n\n #hipDeviceMapHost              : Allows mapping host memory. On ROCm, this is always allowed and\n the flag is ignored.\n\n #hipDeviceLmemResizeToMax      : This flag is silently ignored on ROCm.\n\n @returns #hipSuccess, #hipErrorNoDevice, #hipErrorInvalidDevice, #hipErrorSetOnActiveProcess\n\n*/\n    pub fn hipSetDeviceFlags(flags: ::core::ffi::c_uint) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Device which matches hipDeviceProp_t is returned\n\n @param [out] device Pointer of the device\n @param [in]  prop Pointer of the properties\n\n @returns #hipSuccess, #hipErrorInvalidValue*/\n    pub fn hipChooseDeviceR0600(\n        device: *mut ::core::ffi::c_int,\n        prop: *const hipDeviceProp_tR0600,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns the link type and hop count between two devices\n\n @param [in] device1 Ordinal for device1\n @param [in] device2 Ordinal for device2\n @param [out] linktype Returns the link type (See hsa_amd_link_info_type_t) between the two devices\n @param [out] hopcount Returns the hop count between the two devices\n\n Queries and returns the HSA link type and the hop count between the two specified devices.\n\n @returns #hipSuccess, #hipErrorInvalidValue*/\n    pub fn hipExtGetLinkTypeAndHopCount(\n        device1: ::core::ffi::c_int,\n        device2: ::core::ffi::c_int,\n        linktype: *mut u32,\n        hopcount: *mut u32,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets an interprocess memory handle for an existing device memory allocation.\n\n Takes a pointer to the base of an existing device memory allocation created with ::hipMalloc\n and exports it for use in another process. This is a lightweight operation and may be called\n multiple times on an allocation without adverse effects.\n\n If a region of memory is freed with ::hipFree and a subsequent call to ::hipMalloc returns\n memory with the same device address, ::hipIpcGetMemHandle will return a unique handle for\n the new memory.\n\n @param handle - Pointer to user allocated hipIpcMemHandle to return the handle in.\n @param devPtr - Base pointer to previously allocated device memory.\n\n @returns #hipSuccess, #hipErrorInvalidHandle, #hipErrorOutOfMemory, #hipErrorMapFailed\n\n @note This IPC memory related feature API on Windows may behave differently from Linux.\n*/\n    pub fn hipIpcGetMemHandle(\n        handle: *mut hipIpcMemHandle_t,\n        devPtr: *mut ::core::ffi::c_void,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Opens an interprocess memory handle exported from another process and returns a device\n pointer usable in the local process.\n\n Maps memory exported from another process with ::hipIpcGetMemHandle into the current device\n address space. For contexts on different devices ::hipIpcOpenMemHandle can attempt to enable\n peer access between the devices like the user called ::hipDeviceEnablePeerAccess.\n This behavior is controlled by the flag #hipIpcMemLazyEnablePeerAccess.\n The API ::hipDeviceCanAccessPeer can determine if a mapping is possible.\n\n hipIpcMemHandles from each device in a given process may only be opened by one context per\n device per other process.\n\n Memory returned from ::hipIpcOpenMemHandle must be freed with ::hipIpcCloseMemHandle.\n\n Calling ::hipFree on an exported memory region before calling ::hipIpcCloseMemHandle in the\n importing context will result in undefined behavior.\n\n @param devPtr - Returned device pointer\n @param handle - hipIpcMemHandle to open\n @param flags  - Flags for this operation. Must be specified as hipIpcMemLazyEnablePeerAccess\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidContext,\n #hipErrorInvalidDevicePointer\n\n @note During multiple processes, using the same memory handle opened by the current context,\n there is no guarantee that the same device pointer will be returned in @p *devPtr.\n This is diffrent from CUDA.\n\n @note This IPC memory related feature API on Windows may behave differently from Linux.\n*/\n    pub fn hipIpcOpenMemHandle(\n        devPtr: *mut *mut ::core::ffi::c_void,\n        handle: hipIpcMemHandle_t,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Close memory mapped with ::hipIpcOpenMemHandle\n\n Unmaps memory returned by ::hipIpcOpenMemHandle. The original allocation in the exporting\n process as well as imported mappings in other processes will be unaffected.\n\n Any resources used to enable peer access will be freed if this is the last mapping using them.\n\n @param devPtr - Device pointer returned by ::hipIpcOpenMemHandle\n\n @returns #hipSuccess, #hipErrorMapFailed, #hipErrorInvalidHandle\n\n @note This IPC memory related feature API on Windows may behave differently from Linux.\n*/\n    pub fn hipIpcCloseMemHandle(devPtr: *mut ::core::ffi::c_void) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets an opaque interprocess handle for an event.\n\n The event is previously allocated with #hipEventInterprocess and #hipEventDisableTiming flags.\n The opaque interprocess handle may be copied into other processes and opened with\n ::hipIpcOpenEventHandle. Then ::hipEventRecord, ::hipEventSynchronize, ::hipStreamWaitEvent and\n ::hipEventQuery may be used in either process. After the exported event has been freed with\n ::hipEventDestroy, operations on the imported event will result in undefined behavior.\n\n @param[out]  handle Pointer to #hipIpcEventHandle to return the opaque event handle\n @param[in]   event  Event allocated with #hipEventInterprocess and #hipEventDisableTiming flags\n\n @returns #hipSuccess, #hipErrorInvalidConfiguration, #hipErrorInvalidValue\n\n @note This IPC event related feature API is currently applicable on Linux.\n*/\n    pub fn hipIpcGetEventHandle(\n        handle: *mut hipIpcEventHandle_t,\n        event: hipEvent_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Opens an interprocess event handle.\n\n Opens an interprocess event handle exported from another process with ::hipIpcGetEventHandle.\n The returned #hipEvent_t behaves like a locally created event with the #hipEventDisableTiming\n flag specified. This event needs be freed with ::hipEventDestroy. After the exported event\n has been freed with ::hipEventDestroy, operations on the imported event will result in\n undefined behavior. If the input handle is from the same process, it will return\n #hipErrorInvalidContext.\n\n @param[out]  event  Pointer to hipEvent_t to return the imported event\n @param[in]   handle The opaque interprocess handle to open\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidContext\n\n @note This IPC event related feature API is currently applicable on Linux.\n*/\n    pub fn hipIpcOpenEventHandle(\n        event: *mut hipEvent_t,\n        handle: hipIpcEventHandle_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" @}\\n/\\n/**\\n\\n  @defgroup Execution Execution Control\\n  @{\\n  This section describes the execution control functions of HIP runtime API.\\n\\n/\\n/**\\n @brief Set attribute for a specific function\\n\\n @param [in] func Pointer of the function\\n @param [in] attr Attribute to set\\n @param [in] value Value to set\\n\\n @returns #hipSuccess, #hipErrorInvalidDeviceFunction, #hipErrorInvalidValue\\n\\n Note: AMD devices and some Nvidia GPUS do not support shared cache banking, and the hint is\\n ignored on those architectures.\\n\"]\n    pub fn hipFuncSetAttribute(\n        func: *const ::core::ffi::c_void,\n        attr: hipFuncAttribute,\n        value: ::core::ffi::c_int,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set Cache configuration for a specific function\n\n @param [in] func Pointer of the function.\n @param [in] config Configuration to set.\n\n @returns #hipSuccess, #hipErrorNotInitialized\n Note: AMD devices and some Nvidia GPUS do not support reconfigurable cache.  This hint is ignored\n on those architectures.\n*/\n    pub fn hipFuncSetCacheConfig(\n        func: *const ::core::ffi::c_void,\n        config: hipFuncCache_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set shared memory configuation for a specific function\n\n @param [in] func Pointer of the function\n @param [in] config Configuration\n\n @returns #hipSuccess, #hipErrorInvalidDeviceFunction, #hipErrorInvalidValue\n\n Note: AMD devices and some Nvidia GPUS do not support shared cache banking, and the hint is\n ignored on those architectures.\n*/\n    pub fn hipFuncSetSharedMemConfig(\n        func: *const ::core::ffi::c_void,\n        config: hipSharedMemConfig,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" @}\\n/\\n/**\\n-------------------------------------------------------------------------------------------------\\n-------------------------------------------------------------------------------------------------\\n  @defgroup Error Error Handling\\n  @{\\n  This section describes the error handling functions of HIP runtime API.\\n/\\n/**\\n @brief Return last error returned by any HIP runtime API call and resets the stored error code to\\n #hipSuccess\\n\\n @returns return code from last HIP called from the active host thread\\n\\n Returns the last error that has been returned by any of the runtime calls in the same host\\n thread, and then resets the saved error to #hipSuccess.\\n\\n @see hipGetErrorString, hipGetLastError, hipPeakAtLastError, hipError_t\"]\n    pub fn hipGetLastError() -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Return last error returned by any HIP runtime API call and resets the stored error code to\n #hipSuccess\n\n @returns return code from last HIP called from the active host thread\n\n Returns the last error that has been returned by any of the runtime calls in the same host\n thread, and then resets the saved error to #hipSuccess.\n\n @see hipGetErrorString, hipGetLastError, hipPeakAtLastError, hipError_t*/\n    pub fn hipExtGetLastError() -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Return last error returned by any HIP runtime API call.\n\n @returns #hipSuccess\n\n Returns the last error that has been returned by any of the runtime calls in the same host\n thread. Unlike hipGetLastError, this function does not reset the saved error code.\n\n @see hipGetErrorString, hipGetLastError, hipPeakAtLastError, hipError_t*/\n    pub fn hipPeekAtLastError() -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    /** @brief Return hip error as text string form.\n\n @param hip_error Error code to convert to name.\n @returns const char pointer to the NULL-terminated error name\n\n @see hipGetErrorString, hipGetLastError, hipPeakAtLastError, hipError_t*/\n    pub fn hipGetErrorName(hip_error: hipError_t) -> *const ::core::ffi::c_char;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    /** @brief Return handy text string message to explain the error which occurred\n\n @param hipError Error code to convert to string.\n @returns const char pointer to the NULL-terminated error string\n\n @see hipGetErrorName, hipGetLastError, hipPeakAtLastError, hipError_t*/\n    pub fn hipGetErrorString(hipError: hipError_t) -> *const ::core::ffi::c_char;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Return hip error as text string form.\n\n @param [in] hipError Error code to convert to string.\n @param [out] errorString char pointer to the NULL-terminated error string\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @see hipGetErrorName, hipGetLastError, hipPeakAtLastError, hipError_t*/\n    pub fn hipDrvGetErrorName(\n        hipError: hipError_t,\n        errorString: *mut *const ::core::ffi::c_char,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Return handy text string message to explain the error which occurred\n\n @param [in] hipError Error code to convert to string.\n @param [out] errorString char pointer to the NULL-terminated error string\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @see hipGetErrorName, hipGetLastError, hipPeakAtLastError, hipError_t*/\n    pub fn hipDrvGetErrorString(\n        hipError: hipError_t,\n        errorString: *mut *const ::core::ffi::c_char,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Create an asynchronous stream.\n\n @param[in, out] stream Valid pointer to hipStream_t.  This function writes the memory with the\n newly created stream.\n @returns #hipSuccess, #hipErrorInvalidValue\n\n Create a new asynchronous stream.  @p stream returns an opaque handle that can be used to\n reference the newly created stream in subsequent hipStream* commands.  The stream is allocated on\n the heap and will remain allocated even if the handle goes out-of-scope.  To release the memory\n used by the stream, application must call hipStreamDestroy.\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @see hipStreamCreateWithFlags, hipStreamCreateWithPriority, hipStreamSynchronize, hipStreamWaitEvent, hipStreamDestroy*/\n    pub fn hipStreamCreate(stream: *mut hipStream_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Create an asynchronous stream.\n\n @param[in, out] stream Pointer to new stream\n @param[in ] flags to control stream creation.\n @returns #hipSuccess, #hipErrorInvalidValue\n\n Create a new asynchronous stream.  @p stream returns an opaque handle that can be used to\n reference the newly created stream in subsequent hipStream* commands.  The stream is allocated on\n the heap and will remain allocated even if the handle goes out-of-scope.  To release the memory\n used by the stream, application must call hipStreamDestroy. Flags controls behavior of the\n stream.  See #hipStreamDefault, #hipStreamNonBlocking.\n\n\n @see hipStreamCreate, hipStreamCreateWithPriority, hipStreamSynchronize, hipStreamWaitEvent, hipStreamDestroy*/\n    pub fn hipStreamCreateWithFlags(\n        stream: *mut hipStream_t,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Create an asynchronous stream with the specified priority.\n\n @param[in, out] stream Pointer to new stream\n @param[in ] flags to control stream creation.\n @param[in ] priority of the stream. Lower numbers represent higher priorities.\n @returns #hipSuccess, #hipErrorInvalidValue\n\n Create a new asynchronous stream with the specified priority.  @p stream returns an opaque handle\n that can be used to reference the newly created stream in subsequent hipStream* commands.  The\n stream is allocated on the heap and will remain allocated even if the handle goes out-of-scope.\n To release the memory used by the stream, application must call hipStreamDestroy. Flags controls\n behavior of the stream.  See #hipStreamDefault, #hipStreamNonBlocking.\n\n\n @see hipStreamCreate, hipStreamSynchronize, hipStreamWaitEvent, hipStreamDestroy*/\n    pub fn hipStreamCreateWithPriority(\n        stream: *mut hipStream_t,\n        flags: ::core::ffi::c_uint,\n        priority: ::core::ffi::c_int,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns numerical values that correspond to the least and greatest stream priority.\n\n @param[in, out] leastPriority pointer in which value corresponding to least priority is returned.\n @param[in, out] greatestPriority pointer in which value corresponding to greatest priority is returned.\n @returns #hipSuccess\n\n Returns in *leastPriority and *greatestPriority the numerical values that correspond to the least\n and greatest stream priority respectively. Stream priorities follow a convention where lower numbers\n imply greater priorities. The range of meaningful stream priorities is given by\n [*greatestPriority, *leastPriority]. If the user attempts to create a stream with a priority value\n that is outside the meaningful range as specified by this API, the priority is automatically\n clamped to within the valid range.*/\n    pub fn hipDeviceGetStreamPriorityRange(\n        leastPriority: *mut ::core::ffi::c_int,\n        greatestPriority: *mut ::core::ffi::c_int,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Destroys the specified stream.\n\n @param[in] stream stream identifier.\n @returns #hipSuccess #hipErrorInvalidHandle\n\n Destroys the specified stream.\n\n If commands are still executing on the specified stream, some may complete execution before the\n queue is deleted.\n\n The queue may be destroyed while some commands are still inflight, or may wait for all commands\n queued to the stream before destroying it.\n\n @see hipStreamCreate, hipStreamCreateWithFlags, hipStreamCreateWithPriority, hipStreamQuery,\n hipStreamWaitEvent, hipStreamSynchronize*/\n    pub fn hipStreamDestroy(stream: hipStream_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Return #hipSuccess if all of the operations in the specified @p stream have completed, or\n #hipErrorNotReady if not.\n\n @param[in] stream stream to query\n\n @returns #hipSuccess, #hipErrorNotReady, #hipErrorInvalidHandle\n\n This is thread-safe and returns a snapshot of the current state of the queue.  However, if other\n host threads are sending work to the stream, the status may change immediately after the function\n is called.  It is typically used for debug.\n\n @see hipStreamCreate, hipStreamCreateWithFlags, hipStreamCreateWithPriority, hipStreamWaitEvent,\n hipStreamSynchronize, hipStreamDestroy*/\n    pub fn hipStreamQuery(stream: hipStream_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Wait for all commands in stream to complete.\n\n @param[in] stream stream identifier.\n\n @returns #hipSuccess, #hipErrorInvalidHandle\n\n This command is host-synchronous : the host will block until the specified stream is empty.\n\n This command follows standard null-stream semantics.  Specifically, specifying the null stream\n will cause the command to wait for other streams on the same device to complete all pending\n operations.\n\n This command honors the hipDeviceLaunchBlocking flag, which controls whether the wait is active\n or blocking.\n\n @see hipStreamCreate, hipStreamCreateWithFlags, hipStreamCreateWithPriority, hipStreamWaitEvent,\n hipStreamDestroy\n*/\n    pub fn hipStreamSynchronize(stream: hipStream_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Make the specified compute stream wait for an event\n\n @param[in] stream  Stream to make wait\n @param[in] event  Event to wait on\n @param[in] flags  Parameters to control the operation\n\n @returns #hipSuccess, #hipErrorInvalidHandle, #hipErrorInvalidValue,\n #hipErrorStreamCaptureIsolation\n\n This function inserts a wait operation into the specified stream.\n All future work submitted to @p stream will wait until @p event reports completion before\n beginning execution.\n\n Flags include:\n   hipEventWaitDefault: Default event creation flag.\n   hipEventWaitExternal: Wait is captured in the graph as an external event node when\n                           performing stream capture\n\n This function only waits for commands in the current stream to complete.  Notably, this function\n does not implicitly wait for commands in the default stream to complete, even if the specified\n stream is created with hipStreamNonBlocking = 0.\n\n @see hipStreamCreate, hipStreamCreateWithFlags, hipStreamCreateWithPriority, hipStreamSynchronize, hipStreamDestroy*/\n    pub fn hipStreamWaitEvent(\n        stream: hipStream_t,\n        event: hipEvent_t,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Return flags associated with this stream.\n\n @param[in] stream stream to be queried\n @param[in,out] flags Pointer to an unsigned integer in which the stream's flags are returned\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidHandle\n\n @returns #hipSuccess #hipErrorInvalidValue #hipErrorInvalidHandle\n\n Return flags associated with this stream in *@p flags.\n\n @see hipStreamCreateWithFlags*/\n    pub fn hipStreamGetFlags(\n        stream: hipStream_t,\n        flags: *mut ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Query the priority of a stream.\n\n @param[in] stream stream to be queried\n @param[in,out] priority Pointer to an unsigned integer in which the stream's priority is returned\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidHandle\n\n @returns #hipSuccess #hipErrorInvalidValue #hipErrorInvalidHandle\n\n Query the priority of a stream. The priority is returned in in priority.\n\n @see hipStreamCreateWithFlags*/\n    pub fn hipStreamGetPriority(\n        stream: hipStream_t,\n        priority: *mut ::core::ffi::c_int,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get the device assocaited with the stream\n\n @param[in] stream stream to be queried\n @param[out] device device associated with the stream\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorContextIsDestroyed, #hipErrorInvalidHandle,\n #hipErrorNotInitialized, #hipErrorDeinitialized, #hipErrorInvalidContext\n\n @see hipStreamCreate, hipStreamDestroy, hipDeviceGetStreamPriorityRange*/\n    pub fn hipStreamGetDevice(\n        stream: hipStream_t,\n        device: *mut hipDevice_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Create an asynchronous stream with the specified CU mask.\n\n @param[in, out] stream Pointer to new stream\n @param[in ] cuMaskSize Size of CU mask bit array passed in.\n @param[in ] cuMask Bit-vector representing the CU mask. Each active bit represents using one CU.\n The first 32 bits represent the first 32 CUs, and so on. If its size is greater than physical\n CU number (i.e., multiProcessorCount member of hipDeviceProp_t), the extra elements are ignored.\n It is user's responsibility to make sure the input is meaningful.\n @returns #hipSuccess, #hipErrorInvalidHandle, #hipErrorInvalidValue\n\n Create a new asynchronous stream with the specified CU mask.  @p stream returns an opaque handle\n that can be used to reference the newly created stream in subsequent hipStream* commands.  The\n stream is allocated on the heap and will remain allocated even if the handle goes out-of-scope.\n To release the memory used by the stream, application must call hipStreamDestroy.\n\n\n @see hipStreamCreate, hipStreamSynchronize, hipStreamWaitEvent, hipStreamDestroy*/\n    pub fn hipExtStreamCreateWithCUMask(\n        stream: *mut hipStream_t,\n        cuMaskSize: u32,\n        cuMask: *const u32,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get CU mask associated with an asynchronous stream\n\n @param[in] stream stream to be queried\n @param[in] cuMaskSize number of the block of memories (uint32_t *) allocated by user\n @param[out] cuMask Pointer to a pre-allocated block of memories (uint32_t *) in which\n the stream's CU mask is returned. The CU mask is returned in a chunck of 32 bits where\n each active bit represents one active CU\n @returns #hipSuccess, #hipErrorInvalidHandle, #hipErrorInvalidValue\n\n @see hipStreamCreate, hipStreamSynchronize, hipStreamWaitEvent, hipStreamDestroy*/\n    pub fn hipExtStreamGetCUMask(\n        stream: hipStream_t,\n        cuMaskSize: u32,\n        cuMask: *mut u32,\n    ) -> hipError_t;\n}\n/// Stream CallBack struct\npub type hipStreamCallback_t = ::core::option::Option<\n    unsafe extern \"C\" fn(\n        stream: hipStream_t,\n        status: hipError_t,\n        userData: *mut ::core::ffi::c_void,\n    ),\n>;\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Adds a callback to be called on the host after all currently enqueued\n items in the stream have completed.  For each\n hipStreamAddCallback call, a callback will be executed exactly once.\n The callback will block later work in the stream until it is finished.\n @param[in] stream   - Stream to add callback to\n @param[in] callback - The function to call once preceding stream operations are complete\n @param[in] userData - User specified data to be passed to the callback function\n @param[in] flags    - Reserved for future use, must be 0\n @returns #hipSuccess, #hipErrorInvalidHandle, #hipErrorNotSupported\n\n @see hipStreamCreate, hipStreamCreateWithFlags, hipStreamQuery, hipStreamSynchronize,\n hipStreamWaitEvent, hipStreamDestroy, hipStreamCreateWithPriority\n*/\n    pub fn hipStreamAddCallback(\n        stream: hipStream_t,\n        callback: hipStreamCallback_t,\n        userData: *mut ::core::ffi::c_void,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Enqueues a wait command to the stream.[BETA]\n\n @param [in] stream - Stream identifier\n @param [in] ptr    - Pointer to memory object allocated using #hipMallocSignalMemory flag\n @param [in] value  - Value to be used in compare operation\n @param [in] flags  - Defines the compare operation, supported values are #hipStreamWaitValueGte\n #hipStreamWaitValueEq, #hipStreamWaitValueAnd and #hipStreamWaitValueNor\n @param [in] mask   - Mask to be applied on value at memory before it is compared with value,\n default value is set to enable every bit\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n Enqueues a wait command to the stream, all operations enqueued  on this stream after this, will\n not execute until the defined wait condition is true.\n\n #hipStreamWaitValueGte: waits until *ptr&mask >= value\n\n #hipStreamWaitValueEq : waits until *ptr&mask == value\n\n #hipStreamWaitValueAnd: waits until ((*ptr&mask) & value) != 0\n\n #hipStreamWaitValueNor: waits until ~((*ptr&mask) | (value&mask)) != 0\n\n @note when using #hipStreamWaitValueNor, mask is applied on both 'value' and '*ptr'.\n\n @note Support for #hipStreamWaitValue32 can be queried using 'hipDeviceGetAttribute()' and\n 'hipDeviceAttributeCanUseStreamWaitValue' flag.\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @see hipExtMallocWithFlags, hipFree, hipStreamWaitValue64, hipStreamWriteValue64,\n hipStreamWriteValue32, hipDeviceGetAttribute*/\n    pub fn hipStreamWaitValue32(\n        stream: hipStream_t,\n        ptr: *mut ::core::ffi::c_void,\n        value: u32,\n        flags: ::core::ffi::c_uint,\n        mask: u32,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Enqueues a wait command to the stream.[BETA]\n\n @param [in] stream - Stream identifier\n @param [in] ptr    - Pointer to memory object allocated using 'hipMallocSignalMemory' flag\n @param [in] value  - Value to be used in compare operation\n @param [in] flags  - Defines the compare operation, supported values are #hipStreamWaitValueGte\n #hipStreamWaitValueEq, #hipStreamWaitValueAnd and #hipStreamWaitValueNor.\n @param [in] mask   - Mask to be applied on value at memory before it is compared with value\n default value is set to enable every bit\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n Enqueues a wait command to the stream, all operations enqueued  on this stream after this, will\n not execute until the defined wait condition is true.\n\n #hipStreamWaitValueGte: waits until *ptr&mask >= value\n\n #hipStreamWaitValueEq : waits until *ptr&mask == value\n\n #hipStreamWaitValueAnd: waits until ((*ptr&mask) & value) != 0\n\n #hipStreamWaitValueNor: waits until ~((*ptr&mask) | (value&mask)) != 0\n\n @note when using #hipStreamWaitValueNor, mask is applied on both 'value' and '*ptr'.\n\n @note Support for hipStreamWaitValue64 can be queried using 'hipDeviceGetAttribute()' and\n 'hipDeviceAttributeCanUseStreamWaitValue' flag.\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @see hipExtMallocWithFlags, hipFree, hipStreamWaitValue32, hipStreamWriteValue64,\n hipStreamWriteValue32, hipDeviceGetAttribute*/\n    pub fn hipStreamWaitValue64(\n        stream: hipStream_t,\n        ptr: *mut ::core::ffi::c_void,\n        value: u64,\n        flags: ::core::ffi::c_uint,\n        mask: u64,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Enqueues a write command to the stream.[BETA]\n\n @param [in] stream - Stream identifier\n @param [in] ptr    - Pointer to a GPU accessible memory object\n @param [in] value  - Value to be written\n @param [in] flags  - reserved, ignored for now, will be used in future releases\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n Enqueues a write command to the stream, write operation is performed after all earlier commands\n on this stream have completed the execution.\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @see hipExtMallocWithFlags, hipFree, hipStreamWriteValue32, hipStreamWaitValue32,\n hipStreamWaitValue64*/\n    pub fn hipStreamWriteValue32(\n        stream: hipStream_t,\n        ptr: *mut ::core::ffi::c_void,\n        value: u32,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Enqueues a write command to the stream.[BETA]\n\n @param [in] stream - Stream identifier\n @param [in] ptr    - Pointer to a GPU accessible memory object\n @param [in] value  - Value to be written\n @param [in] flags  - reserved, ignored for now, will be used in future releases\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n Enqueues a write command to the stream, write operation is performed after all earlier commands\n on this stream have completed the execution.\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @see hipExtMallocWithFlags, hipFree, hipStreamWriteValue32, hipStreamWaitValue32,\n hipStreamWaitValue64*/\n    pub fn hipStreamWriteValue64(\n        stream: hipStream_t,\n        ptr: *mut ::core::ffi::c_void,\n        value: u64,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Enqueues an array of stream memory operations in the stream.[BETA]\n\n @param [in] stream      - Stream identifier\n @param [in] count       - The number of operations in the array. Must be less than 256\n @param [in] paramArray  - The types and parameters of the individual operations.\n @param [in] flags       - Reserved for future expansion; must be 0.\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n Batch operations to synchronize the stream via memory operations.\n\n @warning This API is marked as beta, meaning, while this is feature complete,\n it is still open to changes and may have outstanding issues.\n\n @see hipStreamWriteValue32, hipStreamWaitValue32,\n hipStreamWaitValue64. hipStreamWriteValue64*/\n    pub fn hipStreamBatchMemOp(\n        stream: hipStream_t,\n        count: ::core::ffi::c_uint,\n        paramArray: *mut hipStreamBatchMemOpParams,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a batch memory operation node and adds it to a graph.[BETA]\n\n @param [in] phGraphNode      - Returns the newly created node\n @param [in] hGraph           - Graph to which to add the node\n @param [in] dependencies     -  Dependencies of the node\n @param [in] numDependencies  - Number of dependencies\n @param [in] nodeParams       - Parameters for the node\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @warning This API is marked as beta, meaning, while this is feature complete,\n it is still open to changes and may have outstanding issues.\n\n @see hipStreamWriteValue32, hipStreamWaitValue32,\n hipStreamWaitValue64. hipStreamWriteValue64, hipStreamBatchMemOp*/\n    pub fn hipGraphAddBatchMemOpNode(\n        phGraphNode: *mut hipGraphNode_t,\n        hGraph: hipGraph_t,\n        dependencies: *const hipGraphNode_t,\n        numDependencies: usize,\n        nodeParams: *const hipBatchMemOpNodeParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns a batch mem op node's parameters.[BETA]\n\n @param [in] hNode           - Node to get the parameters for\n @param [in] nodeParams_out  - Pointer to return the parameters\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n Returns the parameters of batch mem op node hNode in nodeParams_out.\n The paramArray returned in nodeParams_out is owned by the node.\n This memory remains valid until the node is destroyed or its parameters are modified,\n and should not be modified directly.\n\n @warning This API is marked as beta, meaning, while this is feature complete,\n it is still open to changes and may have outstanding issues.\n\n @see hipStreamWriteValue32, hipStreamWaitValue32,\n hipStreamWaitValue64. hipStreamWriteValue64. hipGraphBatchMemOpNodeSetParams*/\n    pub fn hipGraphBatchMemOpNodeGetParams(\n        hNode: hipGraphNode_t,\n        nodeParams_out: *mut hipBatchMemOpNodeParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets the batch mem op node's parameters.[BETA]\n\n @param [in] hNode       - Node to set the parameters for\n @param [in] nodeParams  - Parameters to copy\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n Sets the parameters of batch mem op node hNode to nodeParams.\n\n @warning This API is marked as beta, meaning, while this is feature complete,\n it is still open to changes and may have outstanding issues.\n\n @see hipStreamWriteValue32, hipStreamWaitValue32,\n hipStreamWaitValue64. hipStreamWriteValue64, hipGraphBatchMemOpNodeGetParams*/\n    pub fn hipGraphBatchMemOpNodeSetParams(\n        hNode: hipGraphNode_t,\n        nodeParams: *mut hipBatchMemOpNodeParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets the parameters for a batch mem op node in the given graphExec.[BETA]\n\n @param [in] hGraphExec  - The executable graph in which to set the specified node\n @param [in] hNode       - Batch mem op node from the graph from which graphExec was instantiated\n @param [in] nodeParams  - Updated Parameters to set\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n Sets the parameters of a batch mem op node in an executable graph hGraphExec.\n The node is identified by the corresponding node hNode in the non-executable graph,\n from which the executable graph was instantiated.\n\n @warning This API is marked as beta, meaning, while this is feature complete,\n it is still open to changes and may have outstanding issues.\n\n @see hipStreamWriteValue32, hipStreamWaitValue32,\n hipStreamWaitValue64. hipStreamWriteValue64, hipStreamBatchMemOp*/\n    pub fn hipGraphExecBatchMemOpNodeSetParams(\n        hGraphExec: hipGraphExec_t,\n        hNode: hipGraphNode_t,\n        nodeParams: *const hipBatchMemOpNodeParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" @}\\n/\\n/**\\n-------------------------------------------------------------------------------------------------\\n-------------------------------------------------------------------------------------------------\\n  @defgroup Event Event Management\\n  @{\\n  This section describes the event management functions of HIP runtime API.\\n/\\n/**\\n @brief Create an event with the specified flags\\n\\n @param[in,out] event Returns the newly created event.\\n @param[in] flags     Flags to control event behavior.  Valid values are #hipEventDefault,\\n#hipEventBlockingSync, #hipEventDisableTiming, #hipEventInterprocess\\n #hipEventDefault : Default flag.  The event will use active synchronization and will support\\ntiming.  Blocking synchronization provides lowest possible latency at the expense of dedicating a\\nCPU to poll on the event.\\n #hipEventBlockingSync : The event will use blocking synchronization : if hipEventSynchronize is\\ncalled on this event, the thread will block until the event completes.  This can increase latency\\nfor the synchroniation but can result in lower power and more resources for other CPU threads.\\n #hipEventDisableTiming : Disable recording of timing information. Events created with this flag\\nwould not record profiling data and provide best performance if used for synchronization.\\n #hipEventInterprocess : The event can be used as an interprocess event. hipEventDisableTiming\\nflag also must be set when hipEventInterprocess flag is set.\\n #hipEventDisableSystemFence : Disable acquire and release system scope fence. This may\\nimprove performance but device memory may not be visible to the host and other devices\\nif this flag is set.\\n\\n @returns #hipSuccess, #hipErrorNotInitialized, #hipErrorInvalidValue,\\n#hipErrorLaunchFailure, #hipErrorOutOfMemory\\n\\n @see hipEventCreate, hipEventSynchronize, hipEventDestroy, hipEventElapsedTime\"]\n    pub fn hipEventCreateWithFlags(\n        event: *mut hipEvent_t,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  Create an event\n\n @param[in,out] event Returns the newly created event.\n\n @returns #hipSuccess, #hipErrorNotInitialized, #hipErrorInvalidValue,\n #hipErrorLaunchFailure, #hipErrorOutOfMemory\n\n @see hipEventCreateWithFlags, hipEventRecord, hipEventQuery, hipEventSynchronize,\n hipEventDestroy, hipEventElapsedTime*/\n    pub fn hipEventCreate(event: *mut hipEvent_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Record an event in the specified stream.\n\n @param[in] event event to record.\n @param[in] stream stream in which to record event.\n @param[in] flags parameter for operations\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotInitialized,\n #hipErrorInvalidHandle, #hipErrorLaunchFailure\n\n hipEventQuery() or hipEventSynchronize() must be used to determine when the event\n transitions from \"recording\" (after hipEventRecord() is called) to \"recorded\"\n (when timestamps are set, if requested).\n\n Events which are recorded in a non-NULL stream will transition to\n from recording to \"recorded\" state when they reach the head of\n the specified stream, after all previous\n commands in that stream have completed executing.\n\n Flags include:\n   hipEventRecordDefault: Default event creation flag.\n   hipEventRecordExternal: Event is captured in the graph as an external event node when\n                           performing stream capture\n\n If hipEventRecord() has been previously called on this event, then this call will overwrite any\n existing state in event.\n\n If this function is called on an event that is currently being recorded, results are undefined\n - either outstanding recording may save state into the event, and the order is not guaranteed.\n\n @note: If this function is not called before use hipEventQuery() or hipEventSynchronize(),\n #hipSuccess is returned, meaning no pending event in the stream.\n\n @see hipEventCreate, hipEventCreateWithFlags, hipEventQuery, hipEventSynchronize,\n hipEventDestroy, hipEventElapsedTime\n*/\n    pub fn hipEventRecordWithFlags(\n        event: hipEvent_t,\n        stream: hipStream_t,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipEventRecord(event: hipEvent_t, stream: hipStream_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Destroy the specified event.\n\n  @param[in] event Event to destroy.\n  @returns #hipSuccess, #hipErrorNotInitialized, #hipErrorInvalidValue,\n #hipErrorLaunchFailure\n\n  Releases memory associated with the event.  If the event is recording but has not completed\n recording when hipEventDestroy() is called, the function will return immediately and the\n completion_future resources will be released later, when the hipDevice is synchronized.\n\n @see hipEventCreate, hipEventCreateWithFlags, hipEventQuery, hipEventSynchronize, hipEventRecord,\n hipEventElapsedTime\n\n @returns #hipSuccess*/\n    pub fn hipEventDestroy(event: hipEvent_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Wait for an event to complete.\n\n  This function will block until the event is ready, waiting for all previous work in the stream\n specified when event was recorded with hipEventRecord().\n\n  If hipEventRecord() has not been called on @p event, this function returns #hipSuccess when no\n  event is captured.\n\n\n  @param[in] event Event on which to wait.\n\n  @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotInitialized,\n #hipErrorInvalidHandle, #hipErrorLaunchFailure\n\n  @see hipEventCreate, hipEventCreateWithFlags, hipEventQuery, hipEventDestroy, hipEventRecord,\n hipEventElapsedTime*/\n    pub fn hipEventSynchronize(event: hipEvent_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Return the elapsed time between two events.\n\n @param[out] ms : Return time between start and stop in ms.\n @param[in]   start : Start event.\n @param[in]   stop  : Stop event.\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotReady, #hipErrorInvalidHandle,\n #hipErrorNotInitialized, #hipErrorLaunchFailure\n\n Computes the elapsed time between two events. Time is computed in ms, with\n a resolution of approximately 1 us.\n\n Events which are recorded in a NULL stream will block until all commands\n on all other streams complete execution, and then record the timestamp.\n\n Events which are recorded in a non-NULL stream will record their timestamp\n when they reach the head of the specified stream, after all previous\n commands in that stream have completed executing.  Thus the time that\n the event recorded may be significantly after the host calls hipEventRecord().\n\n If hipEventRecord() has not been called on either event, then #hipErrorInvalidHandle is\n returned. If hipEventRecord() has been called on both events, but the timestamp has not yet been\n recorded on one or both events (that is, hipEventQuery() would return #hipErrorNotReady on at\n least one of the events), then #hipErrorNotReady is returned.\n\n @see hipEventCreate, hipEventCreateWithFlags, hipEventQuery, hipEventDestroy, hipEventRecord,\n hipEventSynchronize*/\n    pub fn hipEventElapsedTime(\n        ms: *mut f32,\n        start: hipEvent_t,\n        stop: hipEvent_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Query event status\n\n @param[in] event Event to query.\n @returns #hipSuccess, #hipErrorNotReady, #hipErrorInvalidHandle, #hipErrorInvalidValue,\n #hipErrorNotInitialized, #hipErrorLaunchFailure\n\n Query the status of the specified event.  This function will return #hipSuccess if all\n commands in the appropriate stream (specified to hipEventRecord()) have completed.  If any execution\n has not completed, then #hipErrorNotReady is returned.\n\n @note This API returns #hipSuccess, if hipEventRecord() is not called before this API.\n\n @see hipEventCreate, hipEventCreateWithFlags, hipEventRecord, hipEventDestroy,\n hipEventSynchronize, hipEventElapsedTime*/\n    pub fn hipEventQuery(event: hipEvent_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Sets information on the specified pointer.[BETA]\n\n  @param [in]      value     Sets pointer attribute value\n  @param [in]      attribute  Attribute to set\n  @param [in]      ptr      Pointer to set attributes for\n\n  @returns #hipSuccess, #hipErrorInvalidDevice, #hipErrorInvalidValue\n\n  @warning This API is marked as Beta. While this feature is complete, it can\n           change and might have outstanding issues.\n*/\n    pub fn hipPointerSetAttribute(\n        value: *const ::core::ffi::c_void,\n        attribute: hipPointer_attribute,\n        ptr: hipDeviceptr_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Returns attributes for the specified pointer\n\n  @param [out]  attributes  attributes for the specified pointer\n  @param [in]   ptr         pointer to get attributes for\n\n  The output parameter 'attributes' has a member named 'type' that describes what memory the\n  pointer is associated with, such as device memory, host memory, managed memory, and others.\n  Otherwise, the API cannot handle the pointer and returns #hipErrorInvalidValue.\n\n  @note  The unrecognized memory type is unsupported to keep the HIP functionality backward\n  compatibility due to #hipMemoryType enum values.\n\n  @returns #hipSuccess, #hipErrorInvalidDevice, #hipErrorInvalidValue\n\n  @note  The current behavior of this HIP API corresponds to the CUDA API before version 11.0.\n\n  @see hipPointerGetAttribute*/\n    pub fn hipPointerGetAttributes(\n        attributes: *mut hipPointerAttribute_t,\n        ptr: *const ::core::ffi::c_void,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Returns information about the specified pointer.[BETA]\n\n  @param [in, out] data     Returned pointer attribute value\n  @param [in]      attribute  Attribute to query for\n  @param [in]      ptr      Pointer to get attributes for\n\n  @returns #hipSuccess, #hipErrorInvalidDevice, #hipErrorInvalidValue\n\n  @warning This API is marked as Beta. While this feature is complete, it can\n           change and might have outstanding issues.\n\n  @see hipPointerGetAttributes*/\n    pub fn hipPointerGetAttribute(\n        data: *mut ::core::ffi::c_void,\n        attribute: hipPointer_attribute,\n        ptr: hipDeviceptr_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Returns information about the specified pointer.[BETA]\n\n  @param [in]  numAttributes   number of attributes to query for\n  @param [in]  attributes      attributes to query for\n  @param [in, out] data        a two-dimensional containing pointers to memory locations\n                               where the result of each attribute query will be written to\n  @param [in]  ptr             pointer to get attributes for\n\n  @returns #hipSuccess, #hipErrorInvalidDevice, #hipErrorInvalidValue\n\n  @warning This API is marked as Beta. While this feature is complete, it can\n           change and might have outstanding issues.\n\n  @see hipPointerGetAttribute*/\n    pub fn hipDrvPointerGetAttributes(\n        numAttributes: ::core::ffi::c_uint,\n        attributes: *mut hipPointer_attribute,\n        data: *mut *mut ::core::ffi::c_void,\n        ptr: hipDeviceptr_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \"-------------------------------------------------------------------------------------------------\\n-------------------------------------------------------------------------------------------------\\n  @defgroup External External Resource Interoperability\\n  @{\\n  @ingroup API\\n\\n  This section describes the external resource interoperability functions of HIP runtime API.\\n\\n/\\n/**\\n  @brief Imports an external semaphore.\\n\\n  @param[out] extSem_out  External semaphores to be waited on\\n  @param[in] semHandleDesc Semaphore import handle descriptor\\n\\n  @returns #hipSuccess, #hipErrorInvalidDevice, #hipErrorInvalidValue\\n\\n  @see\\n\\n  @note  This API is currently not supported on Linux.\\n\"]\n    pub fn hipImportExternalSemaphore(\n        extSem_out: *mut hipExternalSemaphore_t,\n        semHandleDesc: *const hipExternalSemaphoreHandleDesc,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Signals a set of external semaphore objects.\n\n  @param[in] extSemArray  External semaphores to be waited on\n  @param[in] paramsArray Array of semaphore parameters\n  @param[in] numExtSems Number of semaphores to wait on\n  @param[in] stream Stream to enqueue the wait operations in\n\n  @returns #hipSuccess, #hipErrorInvalidDevice, #hipErrorInvalidValue\n\n  @see\n\n  @note  This API is currently not supported on Linux.\n*/\n    pub fn hipSignalExternalSemaphoresAsync(\n        extSemArray: *const hipExternalSemaphore_t,\n        paramsArray: *const hipExternalSemaphoreSignalParams,\n        numExtSems: ::core::ffi::c_uint,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Waits on a set of external semaphore objects\n\n  @param[in] extSemArray  External semaphores to be waited on\n  @param[in] paramsArray Array of semaphore parameters\n  @param[in] numExtSems Number of semaphores to wait on\n  @param[in] stream Stream to enqueue the wait operations in\n\n  @returns #hipSuccess, #hipErrorInvalidDevice, #hipErrorInvalidValue\n\n  @see\n\n  @note  This API is currently not supported on Linux.\n*/\n    pub fn hipWaitExternalSemaphoresAsync(\n        extSemArray: *const hipExternalSemaphore_t,\n        paramsArray: *const hipExternalSemaphoreWaitParams,\n        numExtSems: ::core::ffi::c_uint,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Destroys an external semaphore object and releases any references to the underlying resource. Any outstanding signals or waits must have completed before the semaphore is destroyed.\n\n  @param[in] extSem handle to an external memory object\n\n  @returns #hipSuccess, #hipErrorInvalidDevice, #hipErrorInvalidValue\n\n  @see\n\n  @note  This API is currently not supported on Linux.\n*/\n    pub fn hipDestroyExternalSemaphore(extSem: hipExternalSemaphore_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Imports an external memory object.\n\n  @param[out] extMem_out  Returned handle to an external memory object\n  @param[in]  memHandleDesc Memory import handle descriptor\n\n  @returns #hipSuccess, #hipErrorInvalidDevice, #hipErrorInvalidValue\n\n  @see*/\n    pub fn hipImportExternalMemory(\n        extMem_out: *mut hipExternalMemory_t,\n        memHandleDesc: *const hipExternalMemoryHandleDesc,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Maps a buffer onto an imported memory object.\n\n  @param[out] devPtr Returned device pointer to buffer\n  @param[in]  extMem  Handle to external memory object\n  @param[in]  bufferDesc  Buffer descriptor\n\n  @returns #hipSuccess, #hipErrorInvalidDevice, #hipErrorInvalidValue\n\n  @see*/\n    pub fn hipExternalMemoryGetMappedBuffer(\n        devPtr: *mut *mut ::core::ffi::c_void,\n        extMem: hipExternalMemory_t,\n        bufferDesc: *const hipExternalMemoryBufferDesc,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Destroys an external memory object.\n\n  @param[in] extMem  External memory object to be destroyed\n\n  @returns #hipSuccess, #hipErrorInvalidDevice, #hipErrorInvalidValue\n\n  @see*/\n    pub fn hipDestroyExternalMemory(extMem: hipExternalMemory_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Maps a mipmapped array onto an external memory object.\n\n  @param[out] mipmap mipmapped array to return\n  @param[in]  extMem external memory object handle\n  @param[in]  mipmapDesc external mipmapped array descriptor\n\n  Returned mipmapped array must be freed using hipFreeMipmappedArray.\n\n  @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidResourceHandle\n\n  @see hipImportExternalMemory, hipDestroyExternalMemory, hipExternalMemoryGetMappedBuffer, hipFreeMipmappedArray*/\n    pub fn hipExternalMemoryGetMappedMipmappedArray(\n        mipmap: *mut hipMipmappedArray_t,\n        extMem: hipExternalMemory_t,\n        mipmapDesc: *const hipExternalMemoryMipmappedArrayDesc,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" @}\\n/\\n/**\\n  @brief Allocate memory on the default accelerator\\n\\n  @param[out] ptr Pointer to the allocated memory\\n  @param[in]  size Requested memory size\\n\\n  If size is 0, no memory is allocated, *ptr returns nullptr, and hipSuccess is returned.\\n\\n  @returns #hipSuccess, #hipErrorOutOfMemory, #hipErrorInvalidValue (bad context, null *ptr)\\n\\n  @see hipMallocPitch, hipFree, hipMallocArray, hipFreeArray, hipMalloc3D, hipMalloc3DArray,\\n hipHostFree, hipHostMalloc\"]\n    pub fn hipMalloc(ptr: *mut *mut ::core::ffi::c_void, size: usize) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Allocate memory on the default accelerator\n\n  @param[out] ptr  Pointer to the allocated memory\n  @param[in]  sizeBytes  Requested memory size\n  @param[in]  flags  Type of memory allocation\n\n  If requested memory size is 0, no memory is allocated, *ptr returns nullptr, and #hipSuccess\n  is returned.\n\n  The memory allocation flag should be either #hipDeviceMallocDefault,\n  #hipDeviceMallocFinegrained, #hipDeviceMallocUncached, or #hipMallocSignalMemory.\n  If the flag is any other value, the API returns #hipErrorInvalidValue.\n\n  @returns #hipSuccess, #hipErrorOutOfMemory, #hipErrorInvalidValue (bad context, null *ptr)\n\n  @see hipMallocPitch, hipFree, hipMallocArray, hipFreeArray, hipMalloc3D, hipMalloc3DArray,\n hipHostFree, hiHostMalloc*/\n    pub fn hipExtMallocWithFlags(\n        ptr: *mut *mut ::core::ffi::c_void,\n        sizeBytes: usize,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Allocate pinned host memory [Deprecated]\n\n  @param[out] ptr Pointer to the allocated host pinned memory\n  @param[in]  size Requested memory size\n\n  If size is 0, no memory is allocated, *ptr returns nullptr, and hipSuccess is returned.\n\n  @returns #hipSuccess, #hipErrorOutOfMemory\n\n  @warning  This API is deprecated, use hipHostMalloc() instead*/\n    pub fn hipMallocHost(ptr: *mut *mut ::core::ffi::c_void, size: usize) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Allocate pinned host memory [Deprecated]\n\n  @param[out] ptr Pointer to the allocated host pinned memory\n  @param[in]  size Requested memory size\n\n  If size is 0, no memory is allocated, *ptr returns nullptr, and hipSuccess is returned.\n\n  @returns #hipSuccess, #hipErrorOutOfMemory\n\n  @warning  This API is deprecated, use hipHostMalloc() instead*/\n    pub fn hipMemAllocHost(\n        ptr: *mut *mut ::core::ffi::c_void,\n        size: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Allocates device accessible page locked (pinned) host memory\n\n  This API allocates pinned host memory which is mapped into the address space of all GPUs\n  in the system, the memory can be accessed directly by the GPU device, and can be read or\n  written with much higher bandwidth than pageable memory obtained with functions such as\n  malloc().\n\n  Using the pinned host memory, applications can implement faster data transfers for HostToDevice\n  and DeviceToHost. The runtime tracks the hipHostMalloc allocations and can avoid some of the\n  setup required for regular unpinned memory.\n\n  When the memory accesses are infrequent, zero-copy memory can be a good choice, for coherent\n  allocation. GPU can directly access the host memory over the CPU/GPU interconnect, without need\n  to copy the data.\n\n  Currently the allocation granularity is 4KB for the API.\n\n  Developers need to choose proper allocation flag with consideration of synchronization.\n\n  @param[out] ptr Pointer to the allocated host pinned memory\n  @param[in]  size Requested memory size in bytes\n  If size is 0, no memory is allocated, *ptr returns nullptr, and hipSuccess is returned.\n  @param[in]  flags Type of host memory allocation. See the description of flags in\n  hipSetDeviceFlags.\n\n  If no input for flags, it will be the default pinned memory allocation on the host.\n\n  @returns #hipSuccess, #hipErrorOutOfMemory\n\n\n  @see hipSetDeviceFlags, hiptHostFree*/\n    pub fn hipHostMalloc(\n        ptr: *mut *mut ::core::ffi::c_void,\n        size: usize,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \"-------------------------------------------------------------------------------------------------\\n-------------------------------------------------------------------------------------------------\\n  @defgroup MemoryM Managed Memory\\n\\n  @ingroup Memory\\n @{\\n  This section describes the managed memory management functions of HIP runtime API.\\n\\n  @note  The managed memory management APIs are implemented on Linux, under developement\\n  on Windows.\\n\\n/\\n/**\\n @brief Allocates memory that will be automatically managed by HIP.\\n\\n This API is used for managed memory, allows data be shared and accessible to both CPU and\\n GPU using a single pointer.\\n\\n The API returns the allocation pointer, managed by HMM, can be used further to execute kernels\\n on device and fetch data between the host and device as needed.\\n\\n @note   It is recommend to do the capability check before call this API.\\n\\n @param [out] dev_ptr - pointer to allocated device memory\\n @param [in]  size    - requested allocation size in bytes, it should be granularity of 4KB\\n @param [in]  flags   - must be either hipMemAttachGlobal or hipMemAttachHost\\n                        (defaults to hipMemAttachGlobal)\\n\\n @returns #hipSuccess, #hipErrorMemoryAllocation, #hipErrorNotSupported, #hipErrorInvalidValue\\n\"]\n    pub fn hipMallocManaged(\n        dev_ptr: *mut *mut ::core::ffi::c_void,\n        size: usize,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Prefetches memory to the specified destination device using HIP.\n\n @param [in] dev_ptr  pointer to be prefetched\n @param [in] count    size in bytes for prefetching\n @param [in] device   destination device to prefetch to\n @param [in] stream   stream to enqueue prefetch operation\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMemPrefetchAsync(\n        dev_ptr: *const ::core::ffi::c_void,\n        count: usize,\n        device: ::core::ffi::c_int,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Advise about the usage of a given memory range to HIP.\n\n @param [in] dev_ptr  pointer to memory to set the advice for\n @param [in] count    size in bytes of the memory range, it should be CPU page size alligned.\n @param [in] advice   advice to be applied for the specified memory range\n @param [in] device   device to apply the advice for\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n This HIP API advises about the usage to be applied on unified memory allocation in the\n range starting from the pointer address devPtr, with the size of count bytes.\n The memory range must refer to managed memory allocated via the API hipMallocManaged, and the\n range will be handled with proper round down and round up respectively in the driver to\n be aligned to CPU page size, the same way as corresponding CUDA API behaves in CUDA version 8.0\n and afterwards.\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMemAdvise(\n        dev_ptr: *const ::core::ffi::c_void,\n        count: usize,\n        advice: hipMemoryAdvise,\n        device: ::core::ffi::c_int,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Query an attribute of a given memory range in HIP.\n\n @param [in,out] data   a pointer to a memory location where the result of each\n                        attribute query will be written to\n @param [in] data_size  the size of data\n @param [in] attribute  the attribute to query\n @param [in] dev_ptr    start of the range to query\n @param [in] count      size of the range to query\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMemRangeGetAttribute(\n        data: *mut ::core::ffi::c_void,\n        data_size: usize,\n        attribute: hipMemRangeAttribute,\n        dev_ptr: *const ::core::ffi::c_void,\n        count: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Query attributes of a given memory range in HIP.\n\n @param [in,out] data     a two-dimensional array containing pointers to memory locations\n                          where the result of each attribute query will be written to\n @param [in] data_sizes   an array, containing the sizes of each result\n @param [in] attributes   the attribute to query\n @param [in] num_attributes  an array of attributes to query (numAttributes and the number\n                          of attributes in this array should match)\n @param [in] dev_ptr      start of the range to query\n @param [in] count        size of the range to query\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMemRangeGetAttributes(\n        data: *mut *mut ::core::ffi::c_void,\n        data_sizes: *mut usize,\n        attributes: *mut hipMemRangeAttribute,\n        num_attributes: usize,\n        dev_ptr: *const ::core::ffi::c_void,\n        count: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Attach memory to a stream asynchronously in HIP.\n\n @param [in] stream     - stream in which to enqueue the attach operation\n @param [in] dev_ptr    - pointer to memory (must be a pointer to managed memory or\n                          to a valid host-accessible region of system-allocated memory)\n @param [in] length     - length of memory (defaults to zero)\n @param [in] flags      - must be one of hipMemAttachGlobal, hipMemAttachHost or\n                          hipMemAttachSingle (defaults to hipMemAttachSingle)\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @warning This API is under development. Currently it is a no-operation (NOP)\n          function on AMD GPUs and returns #hipSuccess.*/\n    pub fn hipStreamAttachMemAsync(\n        stream: hipStream_t,\n        dev_ptr: *mut ::core::ffi::c_void,\n        length: usize,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Allocates memory with stream ordered semantics\n\n Inserts a memory allocation operation into @p stream.\n A pointer to the allocated memory is returned immediately in *dptr.\n The allocation must not be accessed until the allocation operation completes.\n The allocation comes from the memory pool associated with the stream's device.\n\n @note The default memory pool of a device contains device memory from that device.\n @note Basic stream ordering allows future work submitted into the same stream to use the\n  allocation. Stream query, stream synchronize, and HIP events can be used to guarantee that\n  the allocation operation completes before work submitted in a separate stream runs.\n @note During stream capture, this function results in the creation of an allocation node.\n  In this case, the allocation is owned by the graph instead of the memory pool. The memory\n  pool's properties are used to set the node's creation parameters.\n\n @param [out] dev_ptr  Returned device pointer of memory allocation\n @param [in] size      Number of bytes to allocate\n @param [in] stream    The stream establishing the stream ordering contract and\n                       the memory pool to allocate from\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported, #hipErrorOutOfMemory\n\n @see hipMallocFromPoolAsync, hipFreeAsync, hipMemPoolTrimTo, hipMemPoolGetAttribute,\n hipDeviceSetMemPool, hipMemPoolSetAttribute, hipMemPoolSetAccess, hipMemPoolGetAccess\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMallocAsync(\n        dev_ptr: *mut *mut ::core::ffi::c_void,\n        size: usize,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Frees memory with stream ordered semantics\n\n Inserts a free operation into @p stream.\n The allocation must not be used after stream execution reaches the free.\n After this API returns, accessing the memory from any subsequent work launched on the GPU\n or querying its pointer attributes results in undefined behavior.\n\n @note During stream capture, this function results in the creation of a free node and\n must therefore be passed the address of a graph allocation.\n\n @param [in] dev_ptr Pointer to device memory to free\n @param [in] stream  The stream, where the destruciton will occur according to the execution order\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n\n @see hipMallocFromPoolAsync, hipMallocAsync, hipMemPoolTrimTo, hipMemPoolGetAttribute,\n hipDeviceSetMemPool, hipMemPoolSetAttribute, hipMemPoolSetAccess, hipMemPoolGetAccess\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipFreeAsync(\n        dev_ptr: *mut ::core::ffi::c_void,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Releases freed memory back to the OS\n\n Releases memory back to the OS until the pool contains fewer than @p min_bytes_to_keep\n reserved bytes, or there is no more memory that the allocator can safely release.\n The allocator cannot release OS allocations that back outstanding asynchronous allocations.\n The OS allocations may happen at different granularity from the user allocations.\n\n @note Allocations that have not been freed count as outstanding.\n @note Allocations that have been asynchronously freed but whose completion has\n not been observed on the host (eg. by a synchronize) can count as outstanding.\n\n @param[in] mem_pool          The memory pool to trim allocations\n @param[in] min_bytes_to_hold If the pool has less than min_bytes_to_hold reserved,\n then the TrimTo operation is a no-op.  Otherwise the memory pool will contain\n at least min_bytes_to_hold bytes reserved after the operation.\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @see hipMallocFromPoolAsync, hipMallocAsync, hipFreeAsync, hipMemPoolGetAttribute,\n hipDeviceSetMemPool, hipMemPoolSetAttribute, hipMemPoolSetAccess, hipMemPoolGetAccess\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMemPoolTrimTo(\n        mem_pool: hipMemPool_t,\n        min_bytes_to_hold: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets attributes of a memory pool\n\n Supported attributes are:\n - @p hipMemPoolAttrReleaseThreshold: (value type = cuuint64_t)\n                                  Amount of reserved memory in bytes to hold onto before trying\n                                  to release memory back to the OS. When more than the release\n                                  threshold bytes of memory are held by the memory pool, the\n                                  allocator will try to release memory back to the OS on the\n                                  next call to stream, event or context synchronize. (default 0)\n - @p hipMemPoolReuseFollowEventDependencies: (value type = int)\n                                  Allow @p hipMallocAsync to use memory asynchronously freed\n                                  in another stream as long as a stream ordering dependency\n                                  of the allocating stream on the free action exists.\n                                  HIP events and null stream interactions can create the required\n                                  stream ordered dependencies. (default enabled)\n - @p hipMemPoolReuseAllowOpportunistic: (value type = int)\n                                  Allow reuse of already completed frees when there is no dependency\n                                  between the free and allocation. (default enabled)\n - @p hipMemPoolReuseAllowInternalDependencies: (value type = int)\n                                  Allow @p hipMallocAsync to insert new stream dependencies\n                                  in order to establish the stream ordering required to reuse\n                                  a piece of memory released by @p hipFreeAsync (default enabled).\n\n @param [in] mem_pool The memory pool to modify\n @param [in] attr     The attribute to modify\n @param [in] value    Pointer to the value to assign\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @see hipMallocFromPoolAsync, hipMallocAsync, hipFreeAsync, hipMemPoolGetAttribute,\n hipMemPoolTrimTo, hipDeviceSetMemPool, hipMemPoolSetAccess, hipMemPoolGetAccess\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMemPoolSetAttribute(\n        mem_pool: hipMemPool_t,\n        attr: hipMemPoolAttr,\n        value: *mut ::core::ffi::c_void,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets attributes of a memory pool\n\n Supported attributes are:\n - @p hipMemPoolAttrReleaseThreshold: (value type = cuuint64_t)\n                                  Amount of reserved memory in bytes to hold onto before trying\n                                  to release memory back to the OS. When more than the release\n                                  threshold bytes of memory are held by the memory pool, the\n                                  allocator will try to release memory back to the OS on the\n                                  next call to stream, event or context synchronize. (default 0)\n - @p hipMemPoolReuseFollowEventDependencies: (value type = int)\n                                  Allow @p hipMallocAsync to use memory asynchronously freed\n                                  in another stream as long as a stream ordering dependency\n                                  of the allocating stream on the free action exists.\n                                  HIP events and null stream interactions can create the required\n                                  stream ordered dependencies. (default enabled)\n - @p hipMemPoolReuseAllowOpportunistic: (value type = int)\n                                  Allow reuse of already completed frees when there is no dependency\n                                  between the free and allocation. (default enabled)\n - @p hipMemPoolReuseAllowInternalDependencies: (value type = int)\n                                  Allow @p hipMallocAsync to insert new stream dependencies\n                                  in order to establish the stream ordering required to reuse\n                                  a piece of memory released by @p hipFreeAsync (default enabled).\n\n @param [in] mem_pool The memory pool to get attributes of\n @param [in] attr     The attribute to get\n @param [in] value    Retrieved value\n\n @returns  #hipSuccess, #hipErrorInvalidValue\n\n @see hipMallocFromPoolAsync, hipMallocAsync, hipFreeAsync,\n hipMemPoolTrimTo, hipDeviceSetMemPool, hipMemPoolSetAttribute, hipMemPoolSetAccess, hipMemPoolGetAccess\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMemPoolGetAttribute(\n        mem_pool: hipMemPool_t,\n        attr: hipMemPoolAttr,\n        value: *mut ::core::ffi::c_void,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Controls visibility of the specified pool between devices\n\n @param [in] mem_pool   Memory pool for acccess change\n @param [in] desc_list  Array of access descriptors. Each descriptor instructs the access to enable for a single gpu\n @param [in] count  Number of descriptors in the map array.\n\n @returns  #hipSuccess, #hipErrorInvalidValue\n\n @see hipMallocFromPoolAsync, hipMallocAsync, hipFreeAsync, hipMemPoolGetAttribute,\n hipMemPoolTrimTo, hipDeviceSetMemPool, hipMemPoolSetAttribute, hipMemPoolGetAccess\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMemPoolSetAccess(\n        mem_pool: hipMemPool_t,\n        desc_list: *const hipMemAccessDesc,\n        count: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns the accessibility of a pool from a device\n\n Returns the accessibility of the pool's memory from the specified location.\n\n @param [out] flags    Accessibility of the memory pool from the specified location/device\n @param [in] mem_pool   Memory pool being queried\n @param [in] location  Location/device for memory pool access\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @see hipMallocFromPoolAsync, hipMallocAsync, hipFreeAsync, hipMemPoolGetAttribute,\n hipMemPoolTrimTo, hipDeviceSetMemPool, hipMemPoolSetAttribute, hipMemPoolSetAccess\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMemPoolGetAccess(\n        flags: *mut hipMemAccessFlags,\n        mem_pool: hipMemPool_t,\n        location: *mut hipMemLocation,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a memory pool\n\n Creates a HIP memory pool and returns the handle in @p mem_pool. The @p pool_props determines\n the properties of the pool such as the backing device and IPC capabilities.\n\n By default, the memory pool will be accessible from the device it is allocated on.\n\n @param [out] mem_pool    Contains createed memory pool\n @param [in] pool_props   Memory pool properties\n\n @note Specifying hipMemHandleTypeNone creates a memory pool that will not support IPC.\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n\n @see hipMallocFromPoolAsync, hipMallocAsync, hipFreeAsync, hipMemPoolGetAttribute, hipMemPoolDestroy,\n hipMemPoolTrimTo, hipDeviceSetMemPool, hipMemPoolSetAttribute, hipMemPoolSetAccess, hipMemPoolGetAccess\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMemPoolCreate(\n        mem_pool: *mut hipMemPool_t,\n        pool_props: *const hipMemPoolProps,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Destroys the specified memory pool\n\n If any pointers obtained from this pool haven't been freed or\n the pool has free operations that haven't completed\n when @p hipMemPoolDestroy is invoked, the function will return immediately and the\n resources associated with the pool will be released automatically\n once there are no more outstanding allocations.\n\n Destroying the current mempool of a device sets the default mempool of\n that device as the current mempool for that device.\n\n @param [in] mem_pool Memory pool for destruction\n\n @note A device's default memory pool cannot be destroyed.\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @see hipMallocFromPoolAsync, hipMallocAsync, hipFreeAsync, hipMemPoolGetAttribute, hipMemPoolCreate\n hipMemPoolTrimTo, hipDeviceSetMemPool, hipMemPoolSetAttribute, hipMemPoolSetAccess, hipMemPoolGetAccess\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMemPoolDestroy(mem_pool: hipMemPool_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Allocates memory from a specified pool with stream ordered semantics.\n\n Inserts an allocation operation into @p stream.\n A pointer to the allocated memory is returned immediately in @p dev_ptr.\n The allocation must not be accessed until the allocation operation completes.\n The allocation comes from the specified memory pool.\n\n @note The specified memory pool may be from a device different than that of the specified @p stream.\n\n Basic stream ordering allows future work submitted into the same stream to use the allocation.\n Stream query, stream synchronize, and HIP events can be used to guarantee that the allocation\n operation completes before work submitted in a separate stream runs.\n\n @note During stream capture, this function results in the creation of an allocation node. In this case,\n the allocation is owned by the graph instead of the memory pool. The memory pool's properties\n are used to set the node's creation parameters.\n\n @param [out] dev_ptr Returned device pointer\n @param [in] size     Number of bytes to allocate\n @param [in] mem_pool The pool to allocate from\n @param [in] stream   The stream establishing the stream ordering semantic\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported, #hipErrorOutOfMemory\n\n @see hipMallocAsync, hipFreeAsync, hipMemPoolGetAttribute, hipMemPoolCreate\n hipMemPoolTrimTo, hipDeviceSetMemPool, hipMemPoolSetAttribute, hipMemPoolSetAccess, hipMemPoolGetAccess,\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMallocFromPoolAsync(\n        dev_ptr: *mut *mut ::core::ffi::c_void,\n        size: usize,\n        mem_pool: hipMemPool_t,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Exports a memory pool to the requested handle type.\n\n Given an IPC capable mempool, create an OS handle to share the pool with another process.\n A recipient process can convert the shareable handle into a mempool with @p hipMemPoolImportFromShareableHandle.\n Individual pointers can then be shared with the @p hipMemPoolExportPointer and @p hipMemPoolImportPointer APIs.\n The implementation of what the shareable handle is and how it can be transferred is defined by the requested\n handle type.\n\n @note To create an IPC capable mempool, create a mempool with a @p hipMemAllocationHandleType other\n than @p hipMemHandleTypeNone.\n\n @param [out] shared_handle Pointer to the location in which to store the requested handle\n @param [in] mem_pool       Pool to export\n @param [in] handle_type    The type of handle to create\n @param [in] flags          Must be 0\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorOutOfMemory\n\n @see hipMemPoolImportFromShareableHandle\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMemPoolExportToShareableHandle(\n        shared_handle: *mut ::core::ffi::c_void,\n        mem_pool: hipMemPool_t,\n        handle_type: hipMemAllocationHandleType,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Imports a memory pool from a shared handle.\n\n Specific allocations can be imported from the imported pool with @p hipMemPoolImportPointer.\n\n @note Imported memory pools do not support creating new allocations.\n As such imported memory pools may not be used in @p hipDeviceSetMemPool\n or @p hipMallocFromPoolAsync calls.\n\n @param [out] mem_pool     Returned memory pool\n @param [in] shared_handle OS handle of the pool to open\n @param [in] handle_type   The type of handle being imported\n @param [in] flags         Must be 0\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorOutOfMemory\n\n @see hipMemPoolExportToShareableHandle\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMemPoolImportFromShareableHandle(\n        mem_pool: *mut hipMemPool_t,\n        shared_handle: *mut ::core::ffi::c_void,\n        handle_type: hipMemAllocationHandleType,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Export data to share a memory pool allocation between processes.\n\n Constructs @p export_data for sharing a specific allocation from an already shared memory pool.\n The recipient process can import the allocation with the @p hipMemPoolImportPointer api.\n The data is not a handle and may be shared through any IPC mechanism.\n\n @param[out] export_data  Returned export data\n @param[in] dev_ptr       Pointer to memory being exported\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorOutOfMemory\n\n @see hipMemPoolImportPointer\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMemPoolExportPointer(\n        export_data: *mut hipMemPoolPtrExportData,\n        dev_ptr: *mut ::core::ffi::c_void,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Import a memory pool allocation from another process.\n\n Returns in @p dev_ptr a pointer to the imported memory.\n The imported memory must not be accessed before the allocation operation completes\n in the exporting process. The imported memory must be freed from all importing processes before\n being freed in the exporting process. The pointer may be freed with @p hipFree\n or @p hipFreeAsync. If @p hipFreeAsync is used, the free must be completed\n on the importing process before the free operation on the exporting process.\n\n @note The @p hipFreeAsync api may be used in the exporting process before\n the @p hipFreeAsync operation completes in its stream as long as the\n @p hipFreeAsync in the exporting process specifies a stream with\n a stream dependency on the importing process's @p hipFreeAsync.\n\n @param [out] dev_ptr     Pointer to imported memory\n @param [in] mem_pool     Memory pool from which to import a pointer\n @param [in] export_data  Data specifying the memory to import\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotInitialized, #hipErrorOutOfMemory\n\n @see hipMemPoolExportPointer\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMemPoolImportPointer(\n        dev_ptr: *mut *mut ::core::ffi::c_void,\n        mem_pool: hipMemPool_t,\n        export_data: *mut hipMemPoolPtrExportData,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Allocate device accessible page locked host memory\n\n  @param[out] ptr Pointer to the allocated host pinned memory\n  @param[in]  size Requested memory size in bytes\n  @param[in]  flags Type of host memory allocation see below\n\n  If size is 0, no memory is allocated, *ptr returns nullptr, and hipSuccess is returned.\n\n  Flags:\n  - #hipHostAllocDefault   Default pinned memory allocation on the host.\n  - #hipHostAllocPortable  Memory is considered allocated by all contexts.\n  - #hipHostAllocMapped    Map the allocation into the address space for the current device.\n  - #hipHostAllocWriteCombined  Allocates the memory as write-combined.\n\n  @return #hipSuccess, #hipErrorOutOfMemory, #hipErrorInvalidValue*/\n    pub fn hipHostAlloc(\n        ptr: *mut *mut ::core::ffi::c_void,\n        size: usize,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get Device pointer from Host Pointer allocated through hipHostMalloc\n\n  @param[out] devPtr Device Pointer mapped to passed host pointer\n  @param[in]  hstPtr Host Pointer allocated through hipHostMalloc\n  @param[in]  flags Flags to be passed for extension\n\n  @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorOutOfMemory\n\n  @see hipSetDeviceFlags, hipHostMalloc*/\n    pub fn hipHostGetDevicePointer(\n        devPtr: *mut *mut ::core::ffi::c_void,\n        hstPtr: *mut ::core::ffi::c_void,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Return flags associated with host pointer\n\n  @param[out] flagsPtr Memory location to store flags\n  @param[in]  hostPtr Host Pointer allocated through hipHostMalloc\n  @returns #hipSuccess, #hipErrorInvalidValue\n\n  @see hipHostMalloc*/\n    pub fn hipHostGetFlags(\n        flagsPtr: *mut ::core::ffi::c_uint,\n        hostPtr: *mut ::core::ffi::c_void,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Register host memory so it can be accessed from the current device.\n\n  @param[out] hostPtr Pointer to host memory to be registered.\n  @param[in] sizeBytes Size of the host memory\n  @param[in] flags  See below.\n\n  Flags:\n  - #hipHostRegisterDefault   Memory is Mapped and Portable\n  - #hipHostRegisterPortable  Memory is considered registered by all contexts.  HIP only supports\n one context so this is always assumed true.\n  - #hipHostRegisterMapped    Map the allocation into the address space for the current device.\n The device pointer can be obtained with #hipHostGetDevicePointer.\n\n\n  After registering the memory, use #hipHostGetDevicePointer to obtain the mapped device pointer.\n  On many systems, the mapped device pointer will have a different value than the mapped host\n pointer.  Applications must use the device pointer in device code, and the host pointer in host\n code.\n\n  On some systems, registered memory is pinned.  On some systems, registered memory may not be\n actually be pinned but uses OS or hardware facilities to all GPU access to the host memory.\n\n  Developers are strongly encouraged to register memory blocks which are aligned to the host\n cache-line size. (typically 64-bytes but can be obtains from the CPUID instruction).\n\n  If registering non-aligned pointers, the application must take care when register pointers from\n the same cache line on different devices.  HIP's coarse-grained synchronization model does not\n guarantee correct results if different devices write to different parts of the same cache block -\n typically one of the writes will \"win\" and overwrite data from the other registered memory\n region.\n\n  @returns #hipSuccess, #hipErrorOutOfMemory\n\n  @see hipHostUnregister, hipHostGetFlags, hipHostGetDevicePointer*/\n    pub fn hipHostRegister(\n        hostPtr: *mut ::core::ffi::c_void,\n        sizeBytes: usize,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Un-register host pointer\n\n  @param[in] hostPtr Host pointer previously registered with #hipHostRegister\n  @returns Error code\n\n  @see hipHostRegister*/\n    pub fn hipHostUnregister(hostPtr: *mut ::core::ffi::c_void) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  Allocates at least width (in bytes) * height bytes of linear memory\n  Padding may occur to ensure alighnment requirements are met for the given row\n  The change in width size due to padding will be returned in *pitch.\n  Currently the alignment is set to 128 bytes\n\n  @param[out] ptr Pointer to the allocated device memory\n  @param[out] pitch Pitch for allocation (in bytes)\n  @param[in]  width Requested pitched allocation width (in bytes)\n  @param[in]  height Requested pitched allocation height\n\n  If size is 0, no memory is allocated, *ptr returns nullptr, and hipSuccess is returned.\n\n  @returns Error code\n\n  @see hipMalloc, hipFree, hipMallocArray, hipFreeArray, hipHostFree, hipMalloc3D,\n hipMalloc3DArray, hipHostMalloc*/\n    pub fn hipMallocPitch(\n        ptr: *mut *mut ::core::ffi::c_void,\n        pitch: *mut usize,\n        width: usize,\n        height: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  Allocates at least width (in bytes) * height bytes of linear memory\n  Padding may occur to ensure alighnment requirements are met for the given row\n  The change in width size due to padding will be returned in *pitch.\n  Currently the alignment is set to 128 bytes\n\n  @param[out] dptr  Pointer to the allocated device memory\n  @param[out] pitch  Pitch for allocation (in bytes)\n  @param[in]  widthInBytes  Requested pitched allocation width (in bytes)\n  @param[in]  height  Requested pitched allocation height\n  @param[in]  elementSizeBytes  The size of element bytes, should be 4, 8 or 16\n\n  If size is 0, no memory is allocated, *ptr returns nullptr, and hipSuccess is returned.\n  The intended usage of pitch is as a separate parameter of the allocation, used to compute addresses within the 2D array.\n  Given the row and column of an array element of type T, the address is computed as:\n  T* pElement = (T*)((char*)BaseAddress + Row * Pitch) + Column;\n\n  @returns Error code\n\n  @see hipMalloc, hipFree, hipMallocArray, hipFreeArray, hipHostFree, hipMalloc3D,\n hipMalloc3DArray, hipHostMalloc*/\n    pub fn hipMemAllocPitch(\n        dptr: *mut hipDeviceptr_t,\n        pitch: *mut usize,\n        widthInBytes: usize,\n        height: usize,\n        elementSizeBytes: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Free memory allocated by the hcc hip memory allocation API.\n  This API performs an implicit hipDeviceSynchronize() call.\n  If pointer is NULL, the hip runtime is initialized and hipSuccess is returned.\n\n  @param[in] ptr Pointer to memory to be freed\n  @returns #hipSuccess\n  @returns #hipErrorInvalidDevicePointer (if pointer is invalid, including host pointers allocated\n with hipHostMalloc)\n\n  @see hipMalloc, hipMallocPitch, hipMallocArray, hipFreeArray, hipHostFree, hipMalloc3D,\n hipMalloc3DArray, hipHostMalloc*/\n    pub fn hipFree(ptr: *mut ::core::ffi::c_void) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Frees page-locked memory\n  This API performs an implicit hipDeviceSynchronize() call.\n  If pointer is NULL, the hip runtime is initialized and hipSuccess is returned.\n\n  @param[in] ptr Pointer to memory to be freed\n  @returns #hipSuccess,\n          #hipErrorInvalidValue (if pointer is invalid, including device pointers allocated\n  with hipMalloc)\n*/\n    pub fn hipFreeHost(ptr: *mut ::core::ffi::c_void) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Free memory allocated by the hcc hip host memory allocation API\n  This API performs an implicit hipDeviceSynchronize() call.\n  If pointer is NULL, the hip runtime is initialized and hipSuccess is returned.\n\n  @ingroup MemoryD\n\n  @param[in] ptr Pointer to memory to be freed\n  @returns #hipSuccess,\n          #hipErrorInvalidValue (if pointer is invalid, including device pointers allocated with\n hipMalloc)\n\n  @see hipMalloc, hipMallocPitch, hipFree, hipMallocArray, hipFreeArray, hipMalloc3D,\n hipMalloc3DArray, hipHostMalloc\n*/\n    pub fn hipHostFree(ptr: *mut ::core::ffi::c_void) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copy data from src to dst.\n\n  It supports memory from host to device,\n  device to host, device to device and host to host\n  The src and dst must not overlap.\n\n  For hipMemcpy, the copy is always performed by the current device (set by hipSetDevice).\n  For multi-gpu or peer-to-peer configurations, it is recommended to set the current device to the\n  device where the src data is physically located. For optimal peer-to-peer copies, the copy device\n  must be able to access the src and dst pointers (by calling hipDeviceEnablePeerAccess with copy\n  agent as the current device and src/dest as the peerDevice argument.  if this is not done, the\n  hipMemcpy will still work, but will perform the copy using a staging buffer on the host.\n  Calling hipMemcpy with dst and src pointers that do not match the hipMemcpyKind results in\n  undefined behavior.\n\n  @param[out]  dst Data being copy to\n  @param[in]  src Data being copy from\n  @param[in]  sizeBytes Data size in bytes\n  @param[in]  kind Kind of transfer\n  @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorUnknown\n\n  @see hipArrayCreate, hipArrayDestroy, hipArrayGetDescriptor, hipMemAlloc, hipMemAllocHost,\n hipMemAllocPitch, hipMemcpy2D, hipMemcpy2DAsync, hipMemcpy2DUnaligned, hipMemcpyAtoA,\n hipMemcpyAtoD, hipMemcpyAtoH, hipMemcpyAtoHAsync, hipMemcpyDtoA, hipMemcpyDtoD,\n hipMemcpyDtoDAsync, hipMemcpyDtoH, hipMemcpyDtoHAsync, hipMemcpyHtoA, hipMemcpyHtoAAsync,\n hipMemcpyHtoDAsync, hipMemFree, hipMemFreeHost, hipMemGetAddressRange, hipMemGetInfo,\n hipMemHostAlloc, hipMemHostGetDevicePointer*/\n    pub fn hipMemcpy(\n        dst: *mut ::core::ffi::c_void,\n        src: *const ::core::ffi::c_void,\n        sizeBytes: usize,\n        kind: hipMemcpyKind,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Memory copy on the stream.\n  It allows single or multiple devices to do memory copy on single or multiple streams.\n\n  @param[out]  dst Data being copy to\n  @param[in]  src Data being copy from\n  @param[in]  sizeBytes Data size in bytes\n  @param[in]  kind Kind of transfer\n  @param[in]  stream Valid stream\n  @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorUnknown, #hipErrorContextIsDestroyed\n\n  @see hipMemcpy, hipStreamCreate, hipStreamSynchronize, hipStreamDestroy, hipSetDevice, hipLaunchKernelGGL\n*/\n    pub fn hipMemcpyWithStream(\n        dst: *mut ::core::ffi::c_void,\n        src: *const ::core::ffi::c_void,\n        sizeBytes: usize,\n        kind: hipMemcpyKind,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copy data from Host to Device\n\n  @param[out]  dst Data being copy to\n  @param[in]   src Data being copy from\n  @param[in]   sizeBytes Data size in bytes\n\n  @returns #hipSuccess, #hipErrorDeinitialized, #hipErrorNotInitialized, #hipErrorInvalidContext,\n #hipErrorInvalidValue\n\n  @see hipArrayCreate, hipArrayDestroy, hipArrayGetDescriptor, hipMemAlloc, hipMemAllocHost,\n hipMemAllocPitch, hipMemcpy2D, hipMemcpy2DAsync, hipMemcpy2DUnaligned, hipMemcpyAtoA,\n hipMemcpyAtoD, hipMemcpyAtoH, hipMemcpyAtoHAsync, hipMemcpyDtoA, hipMemcpyDtoD,\n hipMemcpyDtoDAsync, hipMemcpyDtoH, hipMemcpyDtoHAsync, hipMemcpyHtoA, hipMemcpyHtoAAsync,\n hipMemcpyHtoDAsync, hipMemFree, hipMemFreeHost, hipMemGetAddressRange, hipMemGetInfo,\n hipMemHostAlloc, hipMemHostGetDevicePointer*/\n    pub fn hipMemcpyHtoD(\n        dst: hipDeviceptr_t,\n        src: *mut ::core::ffi::c_void,\n        sizeBytes: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copy data from Device to Host\n\n  @param[out]  dst Data being copy to\n  @param[in]   src Data being copy from\n  @param[in]   sizeBytes Data size in bytes\n\n  @returns #hipSuccess, #hipErrorDeinitialized, #hipErrorNotInitialized, #hipErrorInvalidContext,\n #hipErrorInvalidValue\n\n  @see hipArrayCreate, hipArrayDestroy, hipArrayGetDescriptor, hipMemAlloc, hipMemAllocHost,\n hipMemAllocPitch, hipMemcpy2D, hipMemcpy2DAsync, hipMemcpy2DUnaligned, hipMemcpyAtoA,\n hipMemcpyAtoD, hipMemcpyAtoH, hipMemcpyAtoHAsync, hipMemcpyDtoA, hipMemcpyDtoD,\n hipMemcpyDtoDAsync, hipMemcpyDtoH, hipMemcpyDtoHAsync, hipMemcpyHtoA, hipMemcpyHtoAAsync,\n hipMemcpyHtoDAsync, hipMemFree, hipMemFreeHost, hipMemGetAddressRange, hipMemGetInfo,\n hipMemHostAlloc, hipMemHostGetDevicePointer*/\n    pub fn hipMemcpyDtoH(\n        dst: *mut ::core::ffi::c_void,\n        src: hipDeviceptr_t,\n        sizeBytes: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copy data from Device to Device\n\n  @param[out]  dst Data being copy to\n  @param[in]   src Data being copy from\n  @param[in]   sizeBytes Data size in bytes\n\n  @returns #hipSuccess, #hipErrorDeinitialized, #hipErrorNotInitialized, #hipErrorInvalidContext,\n #hipErrorInvalidValue\n\n  @see hipArrayCreate, hipArrayDestroy, hipArrayGetDescriptor, hipMemAlloc, hipMemAllocHost,\n hipMemAllocPitch, hipMemcpy2D, hipMemcpy2DAsync, hipMemcpy2DUnaligned, hipMemcpyAtoA,\n hipMemcpyAtoD, hipMemcpyAtoH, hipMemcpyAtoHAsync, hipMemcpyDtoA, hipMemcpyDtoD,\n hipMemcpyDtoDAsync, hipMemcpyDtoH, hipMemcpyDtoHAsync, hipMemcpyHtoA, hipMemcpyHtoAAsync,\n hipMemcpyHtoDAsync, hipMemFree, hipMemFreeHost, hipMemGetAddressRange, hipMemGetInfo,\n hipMemHostAlloc, hipMemHostGetDevicePointer*/\n    pub fn hipMemcpyDtoD(\n        dst: hipDeviceptr_t,\n        src: hipDeviceptr_t,\n        sizeBytes: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copies from one 1D array to device memory.\n\n  @param[out]  dstDevice Destination device pointer\n  @param[in]   srcArray Source array\n  @param[in]   srcOffset Offset in bytes of source array\n  @param[in]   ByteCount Size of memory copy in bytes\n\n  @returns #hipSuccess, #hipErrorDeinitialized, #hipErrorNotInitialized, #hipErrorInvalidContext,\n #hipErrorInvalidValue\n\n  @see hipArrayCreate, hipArrayDestroy, hipArrayGetDescriptor, hipMemAlloc, hipMemAllocHost,\n hipMemAllocPitch, hipMemcpy2D, hipMemcpy2DAsync, hipMemcpy2DUnaligned, hipMemcpyAtoA,\n hipMemcpyAtoD, hipMemcpyAtoH, hipMemcpyAtoHAsync, hipMemcpyDtoA, hipMemcpyDtoD,\n hipMemcpyDtoDAsync, hipMemcpyDtoH, hipMemcpyDtoHAsync, hipMemcpyHtoA, hipMemcpyHtoAAsync,\n hipMemcpyHtoDAsync, hipMemFree, hipMemFreeHost, hipMemGetAddressRange, hipMemGetInfo,\n hipMemHostAlloc, hipMemHostGetDevicePointer*/\n    pub fn hipMemcpyAtoD(\n        dstDevice: hipDeviceptr_t,\n        srcArray: hipArray_t,\n        srcOffset: usize,\n        ByteCount: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copies from device memory to a 1D array.\n\n  @param[out]  dstArray Destination array\n  @param[in]   dstOffset Offset in bytes of destination array\n  @param[in]   srcDevice Source device pointer\n  @param[in]   ByteCount Size of memory copy in bytes\n\n  @returns #hipSuccess, #hipErrorDeinitialized, #hipErrorNotInitialized, #hipErrorInvalidContext,\n #hipErrorInvalidValue\n\n  @see hipArrayCreate, hipArrayDestroy, hipArrayGetDescriptor, hipMemAlloc, hipMemAllocHost,\n hipMemAllocPitch, hipMemcpy2D, hipMemcpy2DAsync, hipMemcpy2DUnaligned, hipMemcpyAtoA,\n hipMemcpyAtoD, hipMemcpyAtoH, hipMemcpyAtoHAsync, hipMemcpyDtoA, hipMemcpyDtoD,\n hipMemcpyDtoDAsync, hipMemcpyDtoH, hipMemcpyDtoHAsync, hipMemcpyHtoA, hipMemcpyHtoAAsync,\n hipMemcpyHtoDAsync, hipMemFree, hipMemFreeHost, hipMemGetAddressRange, hipMemGetInfo,\n hipMemHostAlloc, hipMemHostGetDevicePointer*/\n    pub fn hipMemcpyDtoA(\n        dstArray: hipArray_t,\n        dstOffset: usize,\n        srcDevice: hipDeviceptr_t,\n        ByteCount: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copies from one 1D array to another.\n\n  @param[out]  dstArray Destination array\n  @param[in]   dstOffset Offset in bytes of destination array\n  @param[in]   srcArray Source array\n  @param[in]   srcOffset Offset in bytes of source array\n  @param[in]   ByteCount Size of memory copy in bytes\n\n  @returns #hipSuccess, #hipErrorDeinitialized, #hipErrorNotInitialized, #hipErrorInvalidContext,\n #hipErrorInvalidValue\n\n  @see hipArrayCreate, hipArrayDestroy, hipArrayGetDescriptor, hipMemAlloc, hipMemAllocHost,\n hipMemAllocPitch, hipMemcpy2D, hipMemcpy2DAsync, hipMemcpy2DUnaligned, hipMemcpyAtoA,\n hipMemcpyAtoD, hipMemcpyAtoH, hipMemcpyAtoHAsync, hipMemcpyDtoA, hipMemcpyDtoD,\n hipMemcpyDtoDAsync, hipMemcpyDtoH, hipMemcpyDtoHAsync, hipMemcpyHtoA, hipMemcpyHtoAAsync,\n hipMemcpyHtoDAsync, hipMemFree, hipMemFreeHost, hipMemGetAddressRange, hipMemGetInfo,\n hipMemHostAlloc, hipMemHostGetDevicePointer*/\n    pub fn hipMemcpyAtoA(\n        dstArray: hipArray_t,\n        dstOffset: usize,\n        srcArray: hipArray_t,\n        srcOffset: usize,\n        ByteCount: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copy data from Host to Device asynchronously\n\n  @param[out]  dst  Data being copy to\n  @param[in]   src  Data being copy from\n  @param[in]   sizeBytes  Data size in bytes\n  @param[in]   stream  Stream identifier\n\n  @returns #hipSuccess, #hipErrorDeinitialized, #hipErrorNotInitialized, #hipErrorInvalidContext,\n #hipErrorInvalidValue\n\n  @see hipArrayCreate, hipArrayDestroy, hipArrayGetDescriptor, hipMemAlloc, hipMemAllocHost,\n hipMemAllocPitch, hipMemcpy2D, hipMemcpy2DAsync, hipMemcpy2DUnaligned, hipMemcpyAtoA,\n hipMemcpyAtoD, hipMemcpyAtoH, hipMemcpyAtoHAsync, hipMemcpyDtoA, hipMemcpyDtoD,\n hipMemcpyDtoDAsync, hipMemcpyDtoH, hipMemcpyDtoHAsync, hipMemcpyHtoA, hipMemcpyHtoAAsync,\n hipMemcpyHtoDAsync, hipMemFree, hipMemFreeHost, hipMemGetAddressRange, hipMemGetInfo,\n hipMemHostAlloc, hipMemHostGetDevicePointer*/\n    pub fn hipMemcpyHtoDAsync(\n        dst: hipDeviceptr_t,\n        src: *mut ::core::ffi::c_void,\n        sizeBytes: usize,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copy data from Device to Host asynchronously\n\n  @param[out]  dst Data being copy to\n  @param[in]   src Data being copy from\n  @param[in]   sizeBytes Data size in bytes\n  @param[in]   stream  Stream identifier\n\n  @returns #hipSuccess, #hipErrorDeinitialized, #hipErrorNotInitialized, #hipErrorInvalidContext,\n #hipErrorInvalidValue\n\n  @see hipArrayCreate, hipArrayDestroy, hipArrayGetDescriptor, hipMemAlloc, hipMemAllocHost,\n hipMemAllocPitch, hipMemcpy2D, hipMemcpy2DAsync, hipMemcpy2DUnaligned, hipMemcpyAtoA,\n hipMemcpyAtoD, hipMemcpyAtoH, hipMemcpyAtoHAsync, hipMemcpyDtoA, hipMemcpyDtoD,\n hipMemcpyDtoDAsync, hipMemcpyDtoH, hipMemcpyDtoHAsync, hipMemcpyHtoA, hipMemcpyHtoAAsync,\n hipMemcpyHtoDAsync, hipMemFree, hipMemFreeHost, hipMemGetAddressRange, hipMemGetInfo,\n hipMemHostAlloc, hipMemHostGetDevicePointer*/\n    pub fn hipMemcpyDtoHAsync(\n        dst: *mut ::core::ffi::c_void,\n        src: hipDeviceptr_t,\n        sizeBytes: usize,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copy data from Device to Device asynchronously\n\n  @param[out]  dst  Data being copy to\n  @param[in]   src  Data being copy from\n  @param[in]   sizeBytes  Data size in bytes\n  @param[in]   stream  Stream identifier\n\n  @returns #hipSuccess, #hipErrorDeinitialized, #hipErrorNotInitialized, #hipErrorInvalidContext,\n #hipErrorInvalidValue\n\n  @see hipArrayCreate, hipArrayDestroy, hipArrayGetDescriptor, hipMemAlloc, hipMemAllocHost,\n hipMemAllocPitch, hipMemcpy2D, hipMemcpy2DAsync, hipMemcpy2DUnaligned, hipMemcpyAtoA,\n hipMemcpyAtoD, hipMemcpyAtoH, hipMemcpyAtoHAsync, hipMemcpyDtoA, hipMemcpyDtoD,\n hipMemcpyDtoDAsync, hipMemcpyDtoH, hipMemcpyDtoHAsync, hipMemcpyHtoA, hipMemcpyHtoAAsync,\n hipMemcpyHtoDAsync, hipMemFree, hipMemFreeHost, hipMemGetAddressRange, hipMemGetInfo,\n hipMemHostAlloc, hipMemHostGetDevicePointer*/\n    pub fn hipMemcpyDtoDAsync(\n        dst: hipDeviceptr_t,\n        src: hipDeviceptr_t,\n        sizeBytes: usize,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Copies from one 1D array to host memory.\n\n  @param[out]  dstHost Destination pointer\n  @param[in]   srcArray Source array\n  @param[in]   srcOffset Offset in bytes of source array\n  @param[in]   ByteCount Size of memory copy in bytes\n  @param[in]   stream Stream identifier\n\n  @returns #hipSuccess, #hipErrorDeinitialized, #hipErrorNotInitialized, #hipErrorInvalidContext,\n #hipErrorInvalidValue\n\n  @see hipArrayCreate, hipArrayDestroy, hipArrayGetDescriptor, hipMemAlloc, hipMemAllocHost,\n hipMemAllocPitch, hipMemcpy2D, hipMemcpy2DAsync, hipMemcpy2DUnaligned, hipMemcpyAtoA,\n hipMemcpyAtoD, hipMemcpyAtoH, hipMemcpyAtoHAsync, hipMemcpyDtoA, hipMemcpyDtoD,\n hipMemcpyDtoDAsync, hipMemcpyDtoH, hipMemcpyDtoHAsync, hipMemcpyHtoA, hipMemcpyHtoAAsync,\n hipMemcpyHtoDAsync, hipMemFree, hipMemFreeHost, hipMemGetAddressRange, hipMemGetInfo,\n hipMemHostAlloc, hipMemHostGetDevicePointer*/\n    pub fn hipMemcpyAtoHAsync(\n        dstHost: *mut ::core::ffi::c_void,\n        srcArray: hipArray_t,\n        srcOffset: usize,\n        ByteCount: usize,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Copies from host memory to a 1D array.\n\n  @param[out]  dstArray Destination array\n  @param[in]   dstOffset Offset in bytes of destination array\n  @param[in]   srcHost Source host pointer\n  @param[in]   ByteCount Size of memory copy in bytes\n  @param[in]   stream Stream identifier\n\n  @returns #hipSuccess, #hipErrorDeinitialized, #hipErrorNotInitialized, #hipErrorInvalidContext,\n #hipErrorInvalidValue\n\n  @see hipArrayCreate, hipArrayDestroy, hipArrayGetDescriptor, hipMemAlloc, hipMemAllocHost,\n hipMemAllocPitch, hipMemcpy2D, hipMemcpy2DAsync, hipMemcpy2DUnaligned, hipMemcpyAtoA,\n hipMemcpyAtoD, hipMemcpyAtoH, hipMemcpyAtoHAsync, hipMemcpyDtoA, hipMemcpyDtoD,\n hipMemcpyDtoDAsync, hipMemcpyDtoH, hipMemcpyDtoHAsync, hipMemcpyHtoA, hipMemcpyHtoAAsync,\n hipMemcpyHtoDAsync, hipMemFree, hipMemFreeHost, hipMemGetAddressRange, hipMemGetInfo,\n hipMemHostAlloc, hipMemHostGetDevicePointer*/\n    pub fn hipMemcpyHtoAAsync(\n        dstArray: hipArray_t,\n        dstOffset: usize,\n        srcHost: *const ::core::ffi::c_void,\n        ByteCount: usize,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Returns a global pointer from a module.\n  @ingroup Module\n\n  Returns in *dptr and *bytes the pointer and size of the global of name name located in module hmod.\n  If no variable of that name exists, it returns hipErrorNotFound. Both parameters dptr and bytes are optional.\n  If one of them is NULL, it is ignored and hipSuccess is returned.\n\n  @param[out]  dptr  Returns global device pointer\n  @param[out]  bytes Returns global size in bytes\n  @param[in]   hmod  Module to retrieve global from\n  @param[in]   name  Name of global to retrieve\n\n  @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotFound, #hipErrorInvalidContext\n*/\n    pub fn hipModuleGetGlobal(\n        dptr: *mut hipDeviceptr_t,\n        bytes: *mut usize,\n        hmod: hipModule_t,\n        name: *const ::core::ffi::c_char,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Gets device pointer associated with symbol on the device.\n\n  @param[out]  devPtr  pointer to the device associated the symbole\n  @param[in]   symbol  pointer to the symbole of the device\n\n  @returns #hipSuccess, #hipErrorInvalidValue\n*/\n    pub fn hipGetSymbolAddress(\n        devPtr: *mut *mut ::core::ffi::c_void,\n        symbol: *const ::core::ffi::c_void,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Gets the size of the given symbol on the device.\n\n  @param[in]   symbol  pointer to the device symbole\n  @param[out]  size  pointer to the size\n\n  @returns #hipSuccess, #hipErrorInvalidValue\n*/\n    pub fn hipGetSymbolSize(\n        size: *mut usize,\n        symbol: *const ::core::ffi::c_void,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets the pointer of requested HIP driver function.\n\n @param[in] symbol  The Symbol name of the driver function to request.\n @param[out] pfn  Output pointer to the requested driver function.\n @param[in] hipVersion  The HIP version for the requested driver function symbol.\n HIP version is defined as 100*version_major + version_minor. For example, in HIP 6.1, the\n hipversion is 601, for the symbol function \"hipGetDeviceProperties\", the specified hipVersion 601\n is greater or equal to the version 600, the symbol function will be handle properly as backend\n compatible function.\n\n @param[in] flags  Currently only default flag is suppported.\n @param[out] symbolStatus  Optional enumeration for returned status of searching for symbol driver\n function based on the input hipVersion.\n\n Returns hipSuccess if the returned pfn is addressed to the pointer of found driver function.\n\n @returns #hipSuccess, #hipErrorInvalidValue.*/\n    pub fn hipGetProcAddress(\n        symbol: *const ::core::ffi::c_char,\n        pfn: *mut *mut ::core::ffi::c_void,\n        hipVersion: ::core::ffi::c_int,\n        flags: u64,\n        symbolStatus: *mut hipDriverProcAddressQueryResult,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copies data to the given symbol on the device.\n Symbol HIP APIs allow a kernel to define a device-side data symbol which can be accessed on\n the host side. The symbol can be in __constant or device space.\n Note that the symbol name needs to be encased in the HIP_SYMBOL macro.\n This also applies to hipMemcpyFromSymbol, hipGetSymbolAddress, and hipGetSymbolSize.\n For detailed usage, see the\n <a href=\"https://rocm.docs.amd.com/projects/HIP/en/latest/how-to/hip_porting_guide.html#memcpytosymbol\">memcpyToSymbol example</a>\n in the HIP Porting Guide.\n\n\n  @param[out]  symbol  pointer to the device symbole\n  @param[in]   src  pointer to the source address\n  @param[in]   sizeBytes  size in bytes to copy\n  @param[in]   offset  offset in bytes from start of symbole\n  @param[in]   kind  type of memory transfer\n\n  @returns #hipSuccess, #hipErrorInvalidValue\n*/\n    pub fn hipMemcpyToSymbol(\n        symbol: *const ::core::ffi::c_void,\n        src: *const ::core::ffi::c_void,\n        sizeBytes: usize,\n        offset: usize,\n        kind: hipMemcpyKind,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copies data to the given symbol on the device asynchronously.\n\n  @param[out]  symbol  pointer to the device symbole\n  @param[in]   src  pointer to the source address\n  @param[in]   sizeBytes  size in bytes to copy\n  @param[in]   offset  offset in bytes from start of symbole\n  @param[in]   kind  type of memory transfer\n  @param[in]   stream  stream identifier\n\n  @returns #hipSuccess, #hipErrorInvalidValue\n*/\n    pub fn hipMemcpyToSymbolAsync(\n        symbol: *const ::core::ffi::c_void,\n        src: *const ::core::ffi::c_void,\n        sizeBytes: usize,\n        offset: usize,\n        kind: hipMemcpyKind,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copies data from the given symbol on the device.\n\n  @param[out]  dst  Returns pointer to destinition memory address\n  @param[in]   symbol  Pointer to the symbole address on the device\n  @param[in]   sizeBytes  Size in bytes to copy\n  @param[in]   offset  Offset in bytes from the start of symbole\n  @param[in]   kind  Type of memory transfer\n\n  @returns #hipSuccess, #hipErrorInvalidValue\n*/\n    pub fn hipMemcpyFromSymbol(\n        dst: *mut ::core::ffi::c_void,\n        symbol: *const ::core::ffi::c_void,\n        sizeBytes: usize,\n        offset: usize,\n        kind: hipMemcpyKind,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copies data from the given symbol on the device asynchronously.\n\n  @param[out]  dst  Returns pointer to destinition memory address\n  @param[in]   symbol  pointer to the symbole address on the device\n  @param[in]   sizeBytes  size in bytes to copy\n  @param[in]   offset  offset in bytes from the start of symbole\n  @param[in]   kind  type of memory transfer\n  @param[in]   stream  stream identifier\n\n  @returns #hipSuccess, #hipErrorInvalidValue\n*/\n    pub fn hipMemcpyFromSymbolAsync(\n        dst: *mut ::core::ffi::c_void,\n        symbol: *const ::core::ffi::c_void,\n        sizeBytes: usize,\n        offset: usize,\n        kind: hipMemcpyKind,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copy data from src to dst asynchronously.\n\n  @warning If host or dest are not pinned, the memory copy will be performed synchronously.  For\n best performance, use hipHostMalloc to allocate host memory that is transferred asynchronously.\n\n  @warning on HCC hipMemcpyAsync does not support overlapped H2D and D2H copies.\n  For hipMemcpy, the copy is always performed by the device associated with the specified stream.\n\n  For multi-gpu or peer-to-peer configurations, it is recommended to use a stream which is a\n attached to the device where the src data is physically located. For optimal peer-to-peer copies,\n the copy device must be able to access the src and dst pointers (by calling\n hipDeviceEnablePeerAccess with copy agent as the current device and src/dest as the peerDevice\n argument.  if this is not done, the hipMemcpy will still work, but will perform the copy using a\n staging buffer on the host.\n\n  @param[out] dst Data being copy to\n  @param[in]  src Data being copy from\n  @param[in]  sizeBytes Data size in bytes\n  @param[in]  kind  Type of memory transfer\n  @param[in]  stream  Stream identifier\n  @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorUnknown\n\n  @see hipMemcpy, hipMemcpy2D, hipMemcpyToArray, hipMemcpy2DToArray, hipMemcpyFromArray,\n hipMemcpy2DFromArray, hipMemcpyArrayToArray, hipMemcpy2DArrayToArray, hipMemcpyToSymbol,\n hipMemcpyFromSymbol, hipMemcpy2DAsync, hipMemcpyToArrayAsync, hipMemcpy2DToArrayAsync,\n hipMemcpyFromArrayAsync, hipMemcpy2DFromArrayAsync, hipMemcpyToSymbolAsync,\n hipMemcpyFromSymbolAsync*/\n    pub fn hipMemcpyAsync(\n        dst: *mut ::core::ffi::c_void,\n        src: *const ::core::ffi::c_void,\n        sizeBytes: usize,\n        kind: hipMemcpyKind,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Fills the first sizeBytes bytes of the memory area pointed to by dest with the constant\n byte value value.\n\n  @param[out] dst  Data being filled\n  @param[in]  value  Value to be set\n  @param[in]  sizeBytes  Data size in bytes\n  @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotInitialized*/\n    pub fn hipMemset(\n        dst: *mut ::core::ffi::c_void,\n        value: ::core::ffi::c_int,\n        sizeBytes: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Fills the first sizeBytes bytes of the memory area pointed to by dest with the constant\n byte value value.\n\n  @param[out] dest  Data ptr to be filled\n  @param[in]  value  Value to be set\n  @param[in]  count  Number of values to be set\n  @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotInitialized*/\n    pub fn hipMemsetD8(\n        dest: hipDeviceptr_t,\n        value: ::core::ffi::c_uchar,\n        count: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Fills the first sizeBytes bytes of the memory area pointed to by dest with the constant\n byte value value.\n\n hipMemsetD8Async() is asynchronous with respect to the host, so the call may return before the\n memset is complete. The operation can optionally be associated to a stream by passing a non-zero\n stream argument. If stream is non-zero, the operation may overlap with operations in other\n streams.\n\n  @param[out] dest  Data ptr to be filled\n  @param[in]  value  Constant value to be set\n  @param[in]  count  Number of values to be set\n  @param[in]  stream  Stream identifier\n  @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotInitialized*/\n    pub fn hipMemsetD8Async(\n        dest: hipDeviceptr_t,\n        value: ::core::ffi::c_uchar,\n        count: usize,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Fills the first sizeBytes bytes of the memory area pointed to by dest with the constant\n short value value.\n\n  @param[out] dest  Data ptr to be filled\n  @param[in]  value  Constant value to be set\n  @param[in]  count  Number of values to be set\n  @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotInitialized*/\n    pub fn hipMemsetD16(\n        dest: hipDeviceptr_t,\n        value: ::core::ffi::c_ushort,\n        count: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Fills the first sizeBytes bytes of the memory area pointed to by dest with the constant\n short value value.\n\n hipMemsetD16Async() is asynchronous with respect to the host, so the call may return before the\n memset is complete. The operation can optionally be associated to a stream by passing a non-zero\n stream argument. If stream is non-zero, the operation may overlap with operations in other\n streams.\n\n  @param[out] dest  Data ptr to be filled\n  @param[in]  value  Constant value to be set\n  @param[in]  count  Number of values to be set\n  @param[in]  stream  Stream identifier\n  @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotInitialized*/\n    pub fn hipMemsetD16Async(\n        dest: hipDeviceptr_t,\n        value: ::core::ffi::c_ushort,\n        count: usize,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Fills the memory area pointed to by dest with the constant integer\n value for specified number of times.\n\n  @param[out] dest  Data being filled\n  @param[in]  value  Constant value to be set\n  @param[in]  count  Number of values to be set\n  @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotInitialized*/\n    pub fn hipMemsetD32(\n        dest: hipDeviceptr_t,\n        value: ::core::ffi::c_int,\n        count: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Fills the first sizeBytes bytes of the memory area pointed to by dev with the constant\n byte value value.\n\n hipMemsetAsync() is asynchronous with respect to the host, so the call may return before the\n memset is complete. The operation can optionally be associated to a stream by passing a non-zero\n stream argument. If stream is non-zero, the operation may overlap with operations in other\n streams.\n\n  @param[out] dst Pointer to device memory\n  @param[in]  value  Value to set for each byte of specified memory\n  @param[in]  sizeBytes  Size in bytes to set\n  @param[in]  stream  Stream identifier\n  @return #hipSuccess, #hipErrorInvalidValue*/\n    pub fn hipMemsetAsync(\n        dst: *mut ::core::ffi::c_void,\n        value: ::core::ffi::c_int,\n        sizeBytes: usize,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Fills the memory area pointed to by dev with the constant integer\n value for specified number of times.\n\n  hipMemsetD32Async() is asynchronous with respect to the host, so the call may return before the\n memset is complete. The operation can optionally be associated to a stream by passing a non-zero\n stream argument. If stream is non-zero, the operation may overlap with operations in other\n streams.\n\n  @param[out] dst Pointer to device memory\n  @param[in]  value  Value to set for each byte of specified memory\n  @param[in]  count  Number of values to be set\n  @param[in]  stream  Stream identifier\n  @return #hipSuccess, #hipErrorInvalidValue*/\n    pub fn hipMemsetD32Async(\n        dst: hipDeviceptr_t,\n        value: ::core::ffi::c_int,\n        count: usize,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Fills the memory area pointed to by dst with the constant value.\n\n  @param[out] dst Pointer to device memory\n  @param[in]  pitch  Data size in bytes\n  @param[in]  value  Constant value to be set\n  @param[in]  width\n  @param[in]  height\n  @returns #hipSuccess, #hipErrorInvalidValue*/\n    pub fn hipMemset2D(\n        dst: *mut ::core::ffi::c_void,\n        pitch: usize,\n        value: ::core::ffi::c_int,\n        width: usize,\n        height: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Fills asynchronously the memory area pointed to by dst with the constant value.\n\n  @param[in]  dst Pointer to 2D device memory\n  @param[in]  pitch  Pitch size in bytes\n  @param[in]  value  Value to be set for each byte of specified memory\n  @param[in]  width  Width of matrix set columns in bytes\n  @param[in]  height  Height of matrix set rows in bytes\n  @param[in]  stream  Stream identifier\n  @returns #hipSuccess, #hipErrorInvalidValue*/\n    pub fn hipMemset2DAsync(\n        dst: *mut ::core::ffi::c_void,\n        pitch: usize,\n        value: ::core::ffi::c_int,\n        width: usize,\n        height: usize,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Fills synchronously the memory area pointed to by pitchedDevPtr with the constant value.\n\n  @param[in] pitchedDevPtr  Pointer to pitched device memory\n  @param[in]  value  Value to set for each byte of specified memory\n  @param[in]  extent  Size parameters for width field in bytes in device memory\n  @returns #hipSuccess, #hipErrorInvalidValue*/\n    pub fn hipMemset3D(\n        pitchedDevPtr: hipPitchedPtr,\n        value: ::core::ffi::c_int,\n        extent: hipExtent,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Fills asynchronously the memory area pointed to by pitchedDevPtr with the constant value.\n\n  @param[in] pitchedDevPtr  Pointer to pitched device memory\n  @param[in]  value  Value to set for each byte of specified memory\n  @param[in]  extent  Size parameters for width field in bytes in device memory\n  @param[in]  stream  Stream identifier\n  @returns #hipSuccess, #hipErrorInvalidValue*/\n    pub fn hipMemset3DAsync(\n        pitchedDevPtr: hipPitchedPtr,\n        value: ::core::ffi::c_int,\n        extent: hipExtent,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Query memory info.\n\n On ROCM, this function gets the actual free memory left on the current device, so supports\n the cases while running multi-workload (such as multiple processes, multiple threads, and\n multiple GPUs).\n\n @warning On Windows, the free memory only accounts for memory allocated by this process and may\n be optimistic.\n\n @param[out] free Returns free memory on the current device in bytes\n @param[out] total Returns total allocatable memory on the current device in bytes\n\n @returns #hipSuccess, #hipErrorInvalidDevice, #hipErrorInvalidValue\n*/\n    pub fn hipMemGetInfo(free: *mut usize, total: *mut usize) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get allocated memory size via memory pointer.\n\n This function gets the allocated shared virtual memory size from memory pointer.\n\n @param[in] ptr Pointer to allocated memory\n @param[out] size Returns the allocated memory size in bytes\n\n @returns #hipSuccess, #hipErrorInvalidValue\n*/\n    pub fn hipMemPtrGetInfo(\n        ptr: *mut ::core::ffi::c_void,\n        size: *mut usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Allocate an array on the device.\n\n  @param[out]  array  Pointer to allocated array in device memory\n  @param[in]   desc   Requested channel format\n  @param[in]   width  Requested array allocation width\n  @param[in]   height Requested array allocation height\n  @param[in]   flags  Requested properties of allocated array\n  @returns     #hipSuccess, #hipErrorOutOfMemory\n\n  @see hipMalloc, hipMallocPitch, hipFree, hipFreeArray, hipHostMalloc, hipHostFree*/\n    pub fn hipMallocArray(\n        array: *mut hipArray_t,\n        desc: *const hipChannelFormatDesc,\n        width: usize,\n        height: usize,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Create an array memory pointer on the device.\n\n  @param[out]  pHandle  Pointer to the array memory\n  @param[in]   pAllocateArray   Requested array desciptor\n\n  @returns     #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n\n  @see hipMallocArray, hipArrayDestroy, hipFreeArray*/\n    pub fn hipArrayCreate(\n        pHandle: *mut hipArray_t,\n        pAllocateArray: *const HIP_ARRAY_DESCRIPTOR,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Destroy an array memory pointer on the device.\n\n  @param[in]  array  Pointer to the array memory\n\n  @returns     #hipSuccess, #hipErrorInvalidValue\n\n  @see hipArrayCreate, hipArrayDestroy, hipFreeArray*/\n    pub fn hipArrayDestroy(array: hipArray_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Create a 3D array memory pointer on the device.\n\n  @param[out]  array  Pointer to the 3D array memory\n  @param[in]   pAllocateArray   Requested array desciptor\n\n  @returns     #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n\n  @see hipMallocArray, hipArrayDestroy, hipFreeArray*/\n    pub fn hipArray3DCreate(\n        array: *mut hipArray_t,\n        pAllocateArray: *const HIP_ARRAY3D_DESCRIPTOR,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Create a 3D memory pointer on the device.\n\n  @param[out]  pitchedDevPtr  Pointer to the 3D memory\n  @param[in]   extent   Requested extent\n\n  @returns     #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n\n  @see hipMallocPitch, hipMemGetInfo, hipFree*/\n    pub fn hipMalloc3D(\n        pitchedDevPtr: *mut hipPitchedPtr,\n        extent: hipExtent,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Frees an array on the device.\n\n  @param[in]  array  Pointer to array to free\n  @returns    #hipSuccess, #hipErrorInvalidValue, #hipErrorNotInitialized\n\n  @see hipMalloc, hipMallocPitch, hipFree, hipMallocArray, hipHostMalloc, hipHostFree*/\n    pub fn hipFreeArray(array: hipArray_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Allocate an array on the device.\n\n  @param[out]  array  Pointer to allocated array in device memory\n  @param[in]   desc   Requested channel format\n  @param[in]   extent Requested array allocation width, height and depth\n  @param[in]   flags  Requested properties of allocated array\n  @returns     #hipSuccess, #hipErrorOutOfMemory\n\n  @see hipMalloc, hipMallocPitch, hipFree, hipFreeArray, hipHostMalloc, hipHostFree*/\n    pub fn hipMalloc3DArray(\n        array: *mut hipArray_t,\n        desc: *const hipChannelFormatDesc,\n        extent: hipExtent,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets info about the specified array\n\n @param[out] desc   - Returned array type\n @param[out] extent - Returned array shape. 2D arrays will have depth of zero\n @param[out] flags  - Returned array flags\n @param[in]  array  - The HIP array to get info for\n\n @returns #hipSuccess, #hipErrorInvalidValue #hipErrorInvalidHandle\n\n @see hipArrayGetDescriptor, hipArray3DGetDescriptor*/\n    pub fn hipArrayGetInfo(\n        desc: *mut hipChannelFormatDesc,\n        extent: *mut hipExtent,\n        flags: *mut ::core::ffi::c_uint,\n        array: hipArray_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets a 1D or 2D array descriptor\n\n @param[out] pArrayDescriptor - Returned array descriptor\n @param[in]  array            - Array to get descriptor of\n\n @returns #hipSuccess, #hipErrorDeinitialized, #hipErrorNotInitialized, #hipErrorInvalidContext,\n #hipErrorInvalidValue #hipErrorInvalidHandle\n\n @see hipArray3DCreate, hipArray3DGetDescriptor, hipArrayCreate, hipArrayDestroy, hipMemAlloc,\n hipMemAllocHost, hipMemAllocPitch, hipMemcpy2D, hipMemcpy2DAsync, hipMemcpy2DUnaligned,\n hipMemcpy3D, hipMemcpy3DAsync, hipMemcpyAtoA, hipMemcpyAtoD, hipMemcpyAtoH, hipMemcpyAtoHAsync,\n hipMemcpyDtoA, hipMemcpyDtoD, hipMemcpyDtoDAsync, hipMemcpyDtoH, hipMemcpyDtoHAsync,\n hipMemcpyHtoA, hipMemcpyHtoAAsync, hipMemcpyHtoD, hipMemcpyHtoDAsync, hipMemFree,\n hipMemFreeHost, hipMemGetAddressRange, hipMemGetInfo, hipMemHostAlloc,\n hipMemHostGetDevicePointer, hipMemsetD8, hipMemsetD16, hipMemsetD32, hipArrayGetInfo*/\n    pub fn hipArrayGetDescriptor(\n        pArrayDescriptor: *mut HIP_ARRAY_DESCRIPTOR,\n        array: hipArray_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets a 3D array descriptor\n\n @param[out] pArrayDescriptor - Returned 3D array descriptor\n @param[in]  array            - 3D array to get descriptor of\n\n @returns #hipSuccess, #hipErrorDeinitialized, #hipErrorNotInitialized, #hipErrorInvalidContext,\n #hipErrorInvalidValue #hipErrorInvalidHandle, #hipErrorContextIsDestroyed\n\n @see hipArray3DCreate, hipArrayCreate, hipArrayDestroy, hipArrayGetDescriptor, hipMemAlloc,\n hipMemAllocHost, hipMemAllocPitch, hipMemcpy2D, hipMemcpy2DAsync, hipMemcpy2DUnaligned,\n hipMemcpy3D, hipMemcpy3DAsync, hipMemcpyAtoA, hipMemcpyAtoD, hipMemcpyAtoH, hipMemcpyAtoHAsync,\n hipMemcpyDtoA, hipMemcpyDtoD, hipMemcpyDtoDAsync, hipMemcpyDtoH, hipMemcpyDtoHAsync,\n hipMemcpyHtoA, hipMemcpyHtoAAsync, hipMemcpyHtoD, hipMemcpyHtoDAsync, hipMemFree,\n hipMemFreeHost, hipMemGetAddressRange, hipMemGetInfo, hipMemHostAlloc,\n hipMemHostGetDevicePointer, hipMemsetD8, hipMemsetD16, hipMemsetD32, hipArrayGetInfo*/\n    pub fn hipArray3DGetDescriptor(\n        pArrayDescriptor: *mut HIP_ARRAY3D_DESCRIPTOR,\n        array: hipArray_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copies data between host and device.\n\n  @param[in]   dst    Destination memory address\n  @param[in]   dpitch Pitch of destination memory\n  @param[in]   src    Source memory address\n  @param[in]   spitch Pitch of source memory\n  @param[in]   width  Width of matrix transfer (columns in bytes)\n  @param[in]   height Height of matrix transfer (rows)\n  @param[in]   kind   Type of transfer\n  @returns     #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue,\n #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection\n\n  @see hipMemcpy, hipMemcpyToArray, hipMemcpy2DToArray, hipMemcpyFromArray, hipMemcpyToSymbol,\n hipMemcpyAsync*/\n    pub fn hipMemcpy2D(\n        dst: *mut ::core::ffi::c_void,\n        dpitch: usize,\n        src: *const ::core::ffi::c_void,\n        spitch: usize,\n        width: usize,\n        height: usize,\n        kind: hipMemcpyKind,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copies memory for 2D arrays.\n  @param[in]   pCopy Parameters for the memory copy\n  @returns     #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue,\n  #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection\n\n  @see hipMemcpy, hipMemcpy2D, hipMemcpyToArray, hipMemcpy2DToArray, hipMemcpyFromArray,\n hipMemcpyToSymbol, hipMemcpyAsync*/\n    pub fn hipMemcpyParam2D(pCopy: *const hip_Memcpy2D) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copies memory for 2D arrays.\n  @param[in]   pCopy Parameters for the memory copy\n  @param[in]   stream Stream to use\n  @returns     #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue,\n #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection\n\n  @see hipMemcpy, hipMemcpy2D, hipMemcpyToArray, hipMemcpy2DToArray, hipMemcpyFromArray,\n hipMemcpyToSymbol, hipMemcpyAsync*/\n    pub fn hipMemcpyParam2DAsync(\n        pCopy: *const hip_Memcpy2D,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copies data between host and device.\n\n  @param[in]   dst    Destination memory address\n  @param[in]   dpitch Pitch of destination memory\n  @param[in]   src    Source memory address\n  @param[in]   spitch Pitch of source memory\n  @param[in]   width  Width of matrix transfer (columns in bytes)\n  @param[in]   height Height of matrix transfer (rows)\n  @param[in]   kind   Type of transfer\n  @param[in]   stream Stream to use\n  @returns     #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue,\n #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection\n\n  @see hipMemcpy, hipMemcpyToArray, hipMemcpy2DToArray, hipMemcpyFromArray, hipMemcpyToSymbol,\n hipMemcpyAsync*/\n    pub fn hipMemcpy2DAsync(\n        dst: *mut ::core::ffi::c_void,\n        dpitch: usize,\n        src: *const ::core::ffi::c_void,\n        spitch: usize,\n        width: usize,\n        height: usize,\n        kind: hipMemcpyKind,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copies data between host and device.\n\n  @param[in]   dst     Destination memory address\n  @param[in]   wOffset Destination starting X offset\n  @param[in]   hOffset Destination starting Y offset\n  @param[in]   src     Source memory address\n  @param[in]   spitch  Pitch of source memory\n  @param[in]   width   Width of matrix transfer (columns in bytes)\n  @param[in]   height  Height of matrix transfer (rows)\n  @param[in]   kind    Type of transfer\n  @returns     #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue,\n #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection\n\n  @see hipMemcpy, hipMemcpyToArray, hipMemcpy2D, hipMemcpyFromArray, hipMemcpyToSymbol,\n hipMemcpyAsync*/\n    pub fn hipMemcpy2DToArray(\n        dst: hipArray_t,\n        wOffset: usize,\n        hOffset: usize,\n        src: *const ::core::ffi::c_void,\n        spitch: usize,\n        width: usize,\n        height: usize,\n        kind: hipMemcpyKind,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copies data between host and device.\n\n  @param[in]   dst     Destination memory address\n  @param[in]   wOffset Destination starting X offset\n  @param[in]   hOffset Destination starting Y offset\n  @param[in]   src     Source memory address\n  @param[in]   spitch  Pitch of source memory\n  @param[in]   width   Width of matrix transfer (columns in bytes)\n  @param[in]   height  Height of matrix transfer (rows)\n  @param[in]   kind    Type of transfer\n  @param[in]   stream    Accelerator view which the copy is being enqueued\n  @returns     #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue,\n #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection\n\n  @see hipMemcpy, hipMemcpyToArray, hipMemcpy2D, hipMemcpyFromArray, hipMemcpyToSymbol,\n hipMemcpyAsync*/\n    pub fn hipMemcpy2DToArrayAsync(\n        dst: hipArray_t,\n        wOffset: usize,\n        hOffset: usize,\n        src: *const ::core::ffi::c_void,\n        spitch: usize,\n        width: usize,\n        height: usize,\n        kind: hipMemcpyKind,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copies data between host and device.\n\n  @param[in]   dst Destination memory address\n  @param[in]   wOffsetDst Destination starting X offset\n  @param[in]   hOffsetDst Destination starting Y offset\n  @param[in]   src  Source memory address\n  @param[in]   wOffsetSrc Source starting X offset\n  @param[in]   hOffsetSrc Source starting Y offset (columns in bytes)\n  @param[in]   width  Width of matrix transfer (columns in bytes)\n  @param[in]   height  Height of matrix transfer (rows)\n  @param[in]   kind Type of transfer\n\n  @returns     #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidMemcpyDirection\n\n  @see hipMemcpy, hipMemcpyToArray, hipMemcpy2D, hipMemcpyFromArray, hipMemcpyToSymbol,\n hipMemcpyAsync*/\n    pub fn hipMemcpy2DArrayToArray(\n        dst: hipArray_t,\n        wOffsetDst: usize,\n        hOffsetDst: usize,\n        src: hipArray_const_t,\n        wOffsetSrc: usize,\n        hOffsetSrc: usize,\n        width: usize,\n        height: usize,\n        kind: hipMemcpyKind,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copies data between host and device [Deprecated]\n\n  @ingroup MemoryD\n\n  @param[in]   dst     Destination memory address\n  @param[in]   wOffset Destination starting X offset\n  @param[in]   hOffset Destination starting Y offset\n  @param[in]   src     Source memory address\n  @param[in]   count   size in bytes to copy\n  @param[in]   kind    Type of transfer\n  @returns     #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue,\n #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection\n\n  @see hipMemcpy, hipMemcpy2DToArray, hipMemcpy2D, hipMemcpyFromArray, hipMemcpyToSymbol,\n  hipMemcpyAsync\n  @warning  This API is deprecated.*/\n    pub fn hipMemcpyToArray(\n        dst: hipArray_t,\n        wOffset: usize,\n        hOffset: usize,\n        src: *const ::core::ffi::c_void,\n        count: usize,\n        kind: hipMemcpyKind,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copies data between host and device [Deprecated]\n\n  @ingroup MemoryD\n\n  @param[in]   dst       Destination memory address\n  @param[in]   srcArray  Source memory address\n  @param[in]   wOffset   Source starting X offset\n  @param[in]   hOffset   Source starting Y offset\n  @param[in]   count     Size in bytes to copy\n  @param[in]   kind      Type of transfer\n  @returns     #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue,\n #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection\n\n  @see hipMemcpy, hipMemcpy2DToArray, hipMemcpy2D, hipMemcpyFromArray, hipMemcpyToSymbol,\n hipMemcpyAsync\n @warning  This API is deprecated.*/\n    pub fn hipMemcpyFromArray(\n        dst: *mut ::core::ffi::c_void,\n        srcArray: hipArray_const_t,\n        wOffset: usize,\n        hOffset: usize,\n        count: usize,\n        kind: hipMemcpyKind,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copies data between host and device.\n\n  @param[in]   dst       Destination memory address\n  @param[in]   dpitch    Pitch of destination memory\n  @param[in]   src       Source memory address\n  @param[in]   wOffset   Source starting X offset\n  @param[in]   hOffset   Source starting Y offset\n  @param[in]   width     Width of matrix transfer (columns in bytes)\n  @param[in]   height    Height of matrix transfer (rows)\n  @param[in]   kind      Type of transfer\n  @returns     #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue,\n #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection\n\n  @see hipMemcpy, hipMemcpy2DToArray, hipMemcpy2D, hipMemcpyFromArray, hipMemcpyToSymbol,\n hipMemcpyAsync*/\n    pub fn hipMemcpy2DFromArray(\n        dst: *mut ::core::ffi::c_void,\n        dpitch: usize,\n        src: hipArray_const_t,\n        wOffset: usize,\n        hOffset: usize,\n        width: usize,\n        height: usize,\n        kind: hipMemcpyKind,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copies data between host and device asynchronously.\n\n  @param[in]   dst       Destination memory address\n  @param[in]   dpitch    Pitch of destination memory\n  @param[in]   src       Source memory address\n  @param[in]   wOffset   Source starting X offset\n  @param[in]   hOffset   Source starting Y offset\n  @param[in]   width     Width of matrix transfer (columns in bytes)\n  @param[in]   height    Height of matrix transfer (rows)\n  @param[in]   kind      Type of transfer\n  @param[in]   stream    Accelerator view which the copy is being enqueued\n  @returns     #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue,\n #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection\n\n  @see hipMemcpy, hipMemcpy2DToArray, hipMemcpy2D, hipMemcpyFromArray, hipMemcpyToSymbol,\n hipMemcpyAsync*/\n    pub fn hipMemcpy2DFromArrayAsync(\n        dst: *mut ::core::ffi::c_void,\n        dpitch: usize,\n        src: hipArray_const_t,\n        wOffset: usize,\n        hOffset: usize,\n        width: usize,\n        height: usize,\n        kind: hipMemcpyKind,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copies data between host and device.\n\n  @param[in]   dst       Destination memory address\n  @param[in]   srcArray  Source array\n  @param[in]   srcOffset Offset in bytes of source array\n  @param[in]   count     Size of memory copy in bytes\n  @returns     #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue,\n #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection\n\n  @see hipMemcpy, hipMemcpy2DToArray, hipMemcpy2D, hipMemcpyFromArray, hipMemcpyToSymbol,\n hipMemcpyAsync*/\n    pub fn hipMemcpyAtoH(\n        dst: *mut ::core::ffi::c_void,\n        srcArray: hipArray_t,\n        srcOffset: usize,\n        count: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copies data between host and device.\n\n  @param[in]   dstArray   Destination memory address\n  @param[in]   dstOffset  Offset in bytes of destination array\n  @param[in]   srcHost    Source host pointer\n  @param[in]   count      Size of memory copy in bytes\n  @returns     #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue,\n #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection\n\n  @see hipMemcpy, hipMemcpy2DToArray, hipMemcpy2D, hipMemcpyFromArray, hipMemcpyToSymbol,\n hipMemcpyAsync*/\n    pub fn hipMemcpyHtoA(\n        dstArray: hipArray_t,\n        dstOffset: usize,\n        srcHost: *const ::core::ffi::c_void,\n        count: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copies data between host and device.\n\n  @param[in]   p   3D memory copy parameters\n  @returns     #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue,\n #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection\n\n  @see hipMemcpy, hipMemcpy2DToArray, hipMemcpy2D, hipMemcpyFromArray, hipMemcpyToSymbol,\n hipMemcpyAsync*/\n    pub fn hipMemcpy3D(p: *const hipMemcpy3DParms) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copies data between host and device asynchronously.\n\n  @param[in]   p        3D memory copy parameters\n  @param[in]   stream   Stream to use\n  @returns     #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue,\n #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection\n\n  @see hipMemcpy, hipMemcpy2DToArray, hipMemcpy2D, hipMemcpyFromArray, hipMemcpyToSymbol,\n hipMemcpyAsync*/\n    pub fn hipMemcpy3DAsync(\n        p: *const hipMemcpy3DParms,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copies data between host and device.\n\n  @param[in]   pCopy   3D memory copy parameters\n  @returns     #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue,\n  #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection\n\n  @see hipMemcpy, hipMemcpy2DToArray, hipMemcpy2D, hipMemcpyFromArray, hipMemcpyToSymbol,\n hipMemcpyAsync*/\n    pub fn hipDrvMemcpy3D(pCopy: *const HIP_MEMCPY3D) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /**  @brief Copies data between host and device asynchronously.\n\n  @param[in]   pCopy    3D memory copy parameters\n  @param[in]   stream   Stream to use\n  @returns     #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidPitchValue,\n  #hipErrorInvalidDevicePointer, #hipErrorInvalidMemcpyDirection\n\n  @see hipMemcpy, hipMemcpy2DToArray, hipMemcpy2D, hipMemcpyFromArray, hipMemcpyToSymbol,\n hipMemcpyAsync*/\n    pub fn hipDrvMemcpy3DAsync(\n        pCopy: *const HIP_MEMCPY3D,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" @}\\n/\\n/**\\n-------------------------------------------------------------------------------------------------\\n-------------------------------------------------------------------------------------------------\\n  @defgroup PeerToPeer PeerToPeer Device Memory Access\\n  @{\\n  @warning PeerToPeer support is experimental.\\n  This section describes the PeerToPeer device memory access functions of HIP runtime API.\\n/\\n/**\\n @brief Determine if a device can access a peer's memory.\\n\\n @param [out] canAccessPeer Returns the peer access capability (0 or 1)\\n @param [in] deviceId - device from where memory may be accessed.\\n @param [in] peerDeviceId - device where memory is physically located\\n\\n Returns \\\"1\\\" in @p canAccessPeer if the specified @p device is capable\\n of directly accessing memory physically located on peerDevice , or \\\"0\\\" if not.\\n\\n Returns \\\"0\\\" in @p canAccessPeer if deviceId == peerDeviceId, and both are valid devices : a\\n device is not a peer of itself.\\n\\n @returns #hipSuccess,\\n @returns #hipErrorInvalidDevice if deviceId or peerDeviceId are not valid devices\"]\n    pub fn hipDeviceCanAccessPeer(\n        canAccessPeer: *mut ::core::ffi::c_int,\n        deviceId: ::core::ffi::c_int,\n        peerDeviceId: ::core::ffi::c_int,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Enable direct access from current device's virtual address space to memory allocations\n physically located on a peer device.\n\n Memory which already allocated on peer device will be mapped into the address space of the\n current device.  In addition, all future memory allocations on peerDeviceId will be mapped into\n the address space of the current device when the memory is allocated. The peer memory remains\n accessible from the current device until a call to hipDeviceDisablePeerAccess or hipDeviceReset.\n\n\n @param [in] peerDeviceId  Peer device to enable direct access to from the current device\n @param [in] flags  Reserved for future use, must be zero\n\n Returns #hipSuccess, #hipErrorInvalidDevice, #hipErrorInvalidValue,\n @returns #hipErrorPeerAccessAlreadyEnabled if peer access is already enabled for this device.*/\n    pub fn hipDeviceEnablePeerAccess(\n        peerDeviceId: ::core::ffi::c_int,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Disable direct access from current device's virtual address space to memory allocations\n physically located on a peer device.\n\n Returns hipErrorPeerAccessNotEnabled if direct access to memory on peerDevice has not yet been\n enabled from the current device.\n\n @param [in] peerDeviceId  Peer device to disable direct access to\n\n @returns #hipSuccess, #hipErrorPeerAccessNotEnabled*/\n    pub fn hipDeviceDisablePeerAccess(peerDeviceId: ::core::ffi::c_int) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get information on memory allocations.\n\n @param [out] pbase - BAse pointer address\n @param [out] psize - Size of allocation\n @param [in]  dptr- Device Pointer\n\n @returns #hipSuccess, #hipErrorNotFound\n\n @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent,\n hipCtxSetCurrent, hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice*/\n    pub fn hipMemGetAddressRange(\n        pbase: *mut hipDeviceptr_t,\n        psize: *mut usize,\n        dptr: hipDeviceptr_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Copies memory from one device to memory on another device.\n\n @param [out] dst - Destination device pointer.\n @param [in] dstDeviceId - Destination device\n @param [in] src - Source device pointer\n @param [in] srcDeviceId - Source device\n @param [in] sizeBytes - Size of memory copy in bytes\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidDevice*/\n    pub fn hipMemcpyPeer(\n        dst: *mut ::core::ffi::c_void,\n        dstDeviceId: ::core::ffi::c_int,\n        src: *const ::core::ffi::c_void,\n        srcDeviceId: ::core::ffi::c_int,\n        sizeBytes: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Copies memory from one device to memory on another device.\n\n @param [out] dst - Destination device pointer.\n @param [in] dstDeviceId - Destination device\n @param [in] src - Source device pointer\n @param [in] srcDevice - Source device\n @param [in] sizeBytes - Size of memory copy in bytes\n @param [in] stream - Stream identifier\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidDevice*/\n    pub fn hipMemcpyPeerAsync(\n        dst: *mut ::core::ffi::c_void,\n        dstDeviceId: ::core::ffi::c_int,\n        src: *const ::core::ffi::c_void,\n        srcDevice: ::core::ffi::c_int,\n        sizeBytes: usize,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Create a context and set it as current/default context\n\n @param [out] ctx  Context to create\n @param [in] flags  Context creation flags\n @param [in] device  device handle\n\n @returns #hipSuccess\n\n @see hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent, hipCtxPushCurrent,\n hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice\n\n @warning  This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the\n NVIDIA platform.\n*/\n    pub fn hipCtxCreate(\n        ctx: *mut hipCtx_t,\n        flags: ::core::ffi::c_uint,\n        device: hipDevice_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Destroy a HIP context [Deprecated]\n\n @param [in] ctx Context to destroy\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @see hipCtxCreate, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent,hipCtxSetCurrent,\n hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize , hipCtxGetDevice\n\n @warning  This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the\n NVIDIA platform.*/\n    pub fn hipCtxDestroy(ctx: hipCtx_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Pop the current/default context and return the popped context [Deprecated]\n\n @param [out] ctx  The current context to pop\n\n @returns #hipSuccess, #hipErrorInvalidContext\n\n @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxSetCurrent, hipCtxGetCurrent,\n hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice\n\n @warning  This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the\n NVIDIA platform.*/\n    pub fn hipCtxPopCurrent(ctx: *mut hipCtx_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Push the context to be set as current/ default context [Deprecated]\n\n @param [in] ctx  The current context to push\n\n @returns #hipSuccess, #hipErrorInvalidContext\n\n @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent,\n hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize , hipCtxGetDevice\n\n @warning  This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the\n NVIDIA platform.*/\n    pub fn hipCtxPushCurrent(ctx: hipCtx_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set the passed context as current/default [Deprecated]\n\n @param [in] ctx The context to set as current\n\n @returns #hipSuccess, #hipErrorInvalidContext\n\n @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent,\n hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize , hipCtxGetDevice\n\n @warning  This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the\n NVIDIA platform.*/\n    pub fn hipCtxSetCurrent(ctx: hipCtx_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get the handle of the current/ default context [Deprecated]\n\n @param [out] ctx  The context to get as current\n\n @returns #hipSuccess, #hipErrorInvalidContext\n\n @see hipCtxCreate, hipCtxDestroy, hipCtxGetDevice, hipCtxGetFlags, hipCtxPopCurrent,\n hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice\n\n @warning  This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the\n NVIDIA platform.*/\n    pub fn hipCtxGetCurrent(ctx: *mut hipCtx_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get the handle of the device associated with current/default context [Deprecated]\n\n @param [out] device The device from the current context\n\n @returns #hipSuccess, #hipErrorInvalidContext\n\n @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent,\n hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize\n\n @warning  This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the\n NVIDIA platform.*/\n    pub fn hipCtxGetDevice(device: *mut hipDevice_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns the approximate HIP api version.\n\n @param [in]  ctx Context to check [Deprecated]\n @param [out] apiVersion API version to get\n\n @returns #hipSuccess\n\n @warning The HIP feature set does not correspond to an exact CUDA SDK api revision.\n This function always set *apiVersion to 4 as an approximation though HIP supports\n some features which were introduced in later CUDA SDK revisions.\n HIP apps code should not rely on the api revision number here and should\n use arch feature flags to test device capabilities or conditional compilation.\n\n @see hipCtxCreate, hipCtxDestroy, hipCtxGetDevice, hipCtxGetFlags, hipCtxPopCurrent,\n hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice\n\n @warning  This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the\n NVIDIA platform.*/\n    pub fn hipCtxGetApiVersion(\n        ctx: hipCtx_t,\n        apiVersion: *mut ::core::ffi::c_int,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get Cache configuration for a specific function [Deprecated]\n\n @param [out] cacheConfig  Cache configuration\n\n @returns #hipSuccess\n\n @warning AMD devices and some Nvidia GPUS do not support reconfigurable cache.  This hint is\n ignored on those architectures.\n\n @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent,\n hipCtxSetCurrent, hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice\n\n @warning  This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the\n NVIDIA platform.*/\n    pub fn hipCtxGetCacheConfig(cacheConfig: *mut hipFuncCache_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set L1/Shared cache partition [Deprecated]\n\n @param [in] cacheConfig  Cache configuration to set\n\n @return #hipSuccess\n\n @warning AMD devices and some Nvidia GPUS do not support reconfigurable cache.  This hint is\n ignored on those architectures.\n\n @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent,\n hipCtxSetCurrent, hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice\n\n @warning  This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the\n NVIDIA platform.*/\n    pub fn hipCtxSetCacheConfig(cacheConfig: hipFuncCache_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set Shared memory bank configuration  [Deprecated]\n\n @param [in] config  Shared memory configuration to set\n\n @return #hipSuccess\n\n @warning AMD devices and some Nvidia GPUS do not support shared cache banking, and the hint is\n ignored on those architectures.\n\n @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent,\n hipCtxSetCurrent, hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice\n\n @warning  This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the\n NVIDIA platform.*/\n    pub fn hipCtxSetSharedMemConfig(config: hipSharedMemConfig) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get Shared memory bank configuration [Deprecated]\n\n @param [out] pConfig  Pointer of shared memory configuration\n\n @return #hipSuccess\n\n @warning AMD devices and some Nvidia GPUS do not support shared cache banking, and the hint is\n ignored on those architectures.\n\n @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent,\n hipCtxSetCurrent, hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice\n\n @warning  This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the\n NVIDIA platform.*/\n    pub fn hipCtxGetSharedMemConfig(pConfig: *mut hipSharedMemConfig) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Blocks until the default context has completed all preceding requested tasks [Deprecated]\n\n @return #hipSuccess\n\n @warning This function waits for all streams on the default context to complete execution, and\n then returns.\n\n @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent,\n hipCtxSetCurrent, hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxGetDevice\n\n @warning  This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the\n NVIDIA platform.*/\n    pub fn hipCtxSynchronize() -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Return flags used for creating default context [Deprecated]\n\n @param [out] flags  Pointer of flags\n\n @returns #hipSuccess\n\n @see hipCtxCreate, hipCtxDestroy, hipCtxPopCurrent, hipCtxGetCurrent, hipCtxGetCurrent,\n hipCtxSetCurrent, hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice\n\n @warning  This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the\n NVIDIA platform.*/\n    pub fn hipCtxGetFlags(flags: *mut ::core::ffi::c_uint) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Enables direct access to memory allocations in a peer context [Deprecated]\n\n Memory which already allocated on peer device will be mapped into the address space of the\n current device.  In addition, all future memory allocations on peerDeviceId will be mapped into\n the address space of the current device when the memory is allocated. The peer memory remains\n accessible from the current device until a call to hipDeviceDisablePeerAccess or hipDeviceReset.\n\n\n @param [in] peerCtx  Peer context\n @param [in] flags  flags, need to set as 0\n\n @returns #hipSuccess, #hipErrorInvalidDevice, #hipErrorInvalidValue,\n #hipErrorPeerAccessAlreadyEnabled\n\n @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent,\n hipCtxSetCurrent, hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice\n @warning PeerToPeer support is experimental.\n\n @warning  This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the\n NVIDIA platform.*/\n    pub fn hipCtxEnablePeerAccess(\n        peerCtx: hipCtx_t,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Disable direct access from current context's virtual address space to memory allocations\n physically located on a peer context.Disables direct access to memory allocations in a peer\n context and unregisters any registered allocations [Deprecated]\n\n Returns #hipErrorPeerAccessNotEnabled if direct access to memory on peerDevice has not yet been\n enabled from the current device.\n\n @param [in] peerCtx  Peer context to be disabled\n\n @returns #hipSuccess, #hipErrorPeerAccessNotEnabled\n\n @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent,\n hipCtxSetCurrent, hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice\n @warning PeerToPeer support is experimental.\n\n @warning  This API is deprecated on the AMD platform, only for equivalent cuCtx driver API on the\n NVIDIA platform.*/\n    pub fn hipCtxDisablePeerAccess(peerCtx: hipCtx_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get the state of the primary context [Deprecated]\n\n @param [in] dev  Device to get primary context flags for\n @param [out] flags  Pointer to store flags\n @param [out] active  Pointer to store context state; 0 = inactive, 1 = active\n\n @returns #hipSuccess\n\n @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent,\n hipCtxSetCurrent, hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice\n\n @warning  This API is deprecated on the AMD platform, only for equivalent driver API on the\n NVIDIA platform.*/\n    pub fn hipDevicePrimaryCtxGetState(\n        dev: hipDevice_t,\n        flags: *mut ::core::ffi::c_uint,\n        active: *mut ::core::ffi::c_int,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Release the primary context on the GPU.\n\n @param [in] dev  Device which primary context is released [Deprecated]\n\n @returns #hipSuccess\n\n @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent,\n hipCtxSetCurrent, hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice\n @warning This function return #hipSuccess though doesn't release the primaryCtx by design on\n HIP/HCC path.\n\n @warning  This API is deprecated on the AMD platform, only for equivalent driver API on the NVIDIA\n platform.*/\n    pub fn hipDevicePrimaryCtxRelease(dev: hipDevice_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Retain the primary context on the GPU [Deprecated]\n\n @param [out] pctx  Returned context handle of the new context\n @param [in] dev  Device which primary context is released\n\n @returns #hipSuccess\n\n @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent,\n hipCtxSetCurrent, hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice\n\n @warning  This API is deprecated on the AMD platform, only for equivalent driver API on the NVIDIA\n platform.*/\n    pub fn hipDevicePrimaryCtxRetain(\n        pctx: *mut hipCtx_t,\n        dev: hipDevice_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Resets the primary context on the GPU [Deprecated]\n\n @param [in] dev  Device which primary context is reset\n\n @returns #hipSuccess\n\n @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent,\n hipCtxSetCurrent, hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice\n\n @warning  This API is deprecated on the AMD platform, only for equivalent driver API on the NVIDIA\n platform.*/\n    pub fn hipDevicePrimaryCtxReset(dev: hipDevice_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set flags for the primary context [Deprecated]\n\n @param [in] dev  Device for which the primary context flags are set\n @param [in] flags  New flags for the device\n\n @returns #hipSuccess, #hipErrorContextAlreadyInUse\n\n @see hipCtxCreate, hipCtxDestroy, hipCtxGetFlags, hipCtxPopCurrent, hipCtxGetCurrent,\n hipCtxSetCurrent, hipCtxPushCurrent, hipCtxSetCacheConfig, hipCtxSynchronize, hipCtxGetDevice\n\n @warning  This API is deprecated on the AMD platform, only for equivalent driver API on the NVIDIA\n platform.*/\n    pub fn hipDevicePrimaryCtxSetFlags(\n        dev: hipDevice_t,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" @}\\n/\\n/**\\n-------------------------------------------------------------------------------------------------\\n-------------------------------------------------------------------------------------------------\\n\\n  @defgroup Module Module Management\\n  @{\\n  @ingroup API\\n  This section describes the module management functions of HIP runtime API.\\n\\n/\\n/**\\n @brief Loads code object from file into a module the currrent context.\\n\\n @param [in] fname  Filename of code object to load\\n\\n @param [out] module  Module\\n\\n @warning File/memory resources allocated in this function are released only in hipModuleUnload.\\n\\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidContext, #hipErrorFileNotFound,\\n #hipErrorOutOfMemory, #hipErrorSharedObjectInitFailed, #hipErrorNotInitialized\\n\"]\n    pub fn hipModuleLoad(\n        module: *mut hipModule_t,\n        fname: *const ::core::ffi::c_char,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Frees the module\n\n @param [in] module  Module to free\n\n @returns #hipSuccess, #hipErrorInvalidResourceHandle\n\n The module is freed, and the code objects associated with it are destroyed.*/\n    pub fn hipModuleUnload(module: hipModule_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Function with kname will be extracted if present in module\n\n @param [in] module  Module to get function from\n @param [in] kname  Pointer to the name of function\n @param [out] function  Pointer to function handle\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidContext, #hipErrorNotInitialized,\n #hipErrorNotFound,*/\n    pub fn hipModuleGetFunction(\n        function: *mut hipFunction_t,\n        module: hipModule_t,\n        kname: *const ::core::ffi::c_char,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Find out attributes for a given function.\n @ingroup Execution\n @param [out] attr  Attributes of funtion\n @param [in] func  Pointer to the function handle\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidDeviceFunction*/\n    pub fn hipFuncGetAttributes(\n        attr: *mut hipFuncAttributes,\n        func: *const ::core::ffi::c_void,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Find out a specific attribute for a given function.\n @ingroup Execution\n @param [out] value  Pointer to the value\n @param [in]  attrib  Attributes of the given funtion\n @param [in]  hfunc  Function to get attributes from\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidDeviceFunction*/\n    pub fn hipFuncGetAttribute(\n        value: *mut ::core::ffi::c_int,\n        attrib: hipFunction_attribute,\n        hfunc: hipFunction_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets pointer to device entry function that matches entry function symbolPtr.\n\n @param [out] functionPtr  Device entry function\n @param [in]  symbolPtr  Pointer to device entry function to search for\n\n @returns #hipSuccess, #hipErrorInvalidDeviceFunction\n*/\n    pub fn hipGetFuncBySymbol(\n        functionPtr: *mut hipFunction_t,\n        symbolPtr: *const ::core::ffi::c_void,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief returns the handle of the texture reference with the name from the module.\n\n @param [in] hmod  Module\n @param [in] name  Pointer of name of texture reference\n @param [out] texRef  Pointer of texture reference\n\n @returns #hipSuccess, #hipErrorNotInitialized, #hipErrorNotFound, #hipErrorInvalidValue*/\n    pub fn hipModuleGetTexRef(\n        texRef: *mut *mut textureReference,\n        hmod: hipModule_t,\n        name: *const ::core::ffi::c_char,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief builds module from code object which resides in host memory. Image is pointer to that\n location.\n\n @param [in] image  The pointer to the location of data\n @param [out] module  Retuned module\n\n @returns hipSuccess, hipErrorNotInitialized, hipErrorOutOfMemory, hipErrorNotInitialized*/\n    pub fn hipModuleLoadData(\n        module: *mut hipModule_t,\n        image: *const ::core::ffi::c_void,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief builds module from code object which resides in host memory. Image is pointer to that\n location. Options are not used. hipModuleLoadData is called.\n\n @param [in] image  The pointer to the location of data\n @param [out] module  Retuned module\n @param [in] numOptions Number of options\n @param [in] options Options for JIT\n @param [in] optionValues  Option values for JIT\n\n @returns hipSuccess, hipErrorNotInitialized, hipErrorOutOfMemory, hipErrorNotInitialized*/\n    pub fn hipModuleLoadDataEx(\n        module: *mut hipModule_t,\n        image: *const ::core::ffi::c_void,\n        numOptions: ::core::ffi::c_uint,\n        options: *mut hipJitOption,\n        optionValues: *mut *mut ::core::ffi::c_void,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Completes the linking of the given program.\n @param [in] state hip link state\n @param [in] type  Type of the input data or bitcode\n @param [in] data  Input data which is null terminated\n @param [in] size  Size of the input data\n @param [in] name  Optional name for this input\n @param [in] numOptions  Size of the options\n @param [in] options  Array of options applied to this input\n @param [in] optionValues  Array of option values cast to void*\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidHandle\n\n If adding the file fails, it will\n @return #hipErrorInvalidConfiguration\n\n @see hipError_t*/\n    pub fn hipLinkAddData(\n        state: hipLinkState_t,\n        type_: hipJitInputType,\n        data: *mut ::core::ffi::c_void,\n        size: usize,\n        name: *const ::core::ffi::c_char,\n        numOptions: ::core::ffi::c_uint,\n        options: *mut hipJitOption,\n        optionValues: *mut *mut ::core::ffi::c_void,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Adds a file with bit code to be linked with options\n @param [in] state hip link state\n @param [in] type  Type of the input data or bitcode\n @param [in] path  Path to the input file where bitcode is present\n @param [in] numOptions  Size of the options\n @param [in] options  Array of options applied to this input\n @param [in] optionValues  Array of option values cast to void*\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n If adding the file fails, it will\n @return #hipErrorInvalidConfiguration\n\n @see hipError_t*/\n    pub fn hipLinkAddFile(\n        state: hipLinkState_t,\n        type_: hipJitInputType,\n        path: *const ::core::ffi::c_char,\n        numOptions: ::core::ffi::c_uint,\n        options: *mut hipJitOption,\n        optionValues: *mut *mut ::core::ffi::c_void,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Completes the linking of the given program.\n @param [in]   state hip link state\n @param [out]  hipBinOut  Upon success, points to the output binary\n @param [out]  sizeOut  Size of the binary is stored (optional)\n\n @returns #hipSuccess #hipErrorInvalidValue\n\n If adding the data fails, it will\n @return #hipErrorInvalidConfiguration\n\n @see hipError_t*/\n    pub fn hipLinkComplete(\n        state: hipLinkState_t,\n        hipBinOut: *mut *mut ::core::ffi::c_void,\n        sizeOut: *mut usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates the link instance via hip APIs.\n @param [in] numOptions  Number of options\n @param [in] option  Array of options\n @param [in] optionValues  Array of option values cast to void*\n @param [out] stateOut  hip link state created upon success\n\n @returns #hipSuccess #hipErrorInvalidValue #hipErrorInvalidConfiguration\n\n @see hipSuccess*/\n    pub fn hipLinkCreate(\n        numOptions: ::core::ffi::c_uint,\n        options: *mut hipJitOption,\n        optionValues: *mut *mut ::core::ffi::c_void,\n        stateOut: *mut hipLinkState_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Deletes the link instance via hip APIs.\n @param [in] state link state instance\n\n @returns #hipSuccess #hipErrorInvalidValue\n\n @see hipSuccess*/\n    pub fn hipLinkDestroy(state: hipLinkState_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief launches kernel f with launch parameters and shared memory on stream with arguments passed\n to kernelparams or extra\n @ingroup Execution\n @param [in] f         Kernel to launch.\n @param [in] gridDimX  X grid dimension specified as multiple of blockDimX.\n @param [in] gridDimY  Y grid dimension specified as multiple of blockDimY.\n @param [in] gridDimZ  Z grid dimension specified as multiple of blockDimZ.\n @param [in] blockDimX X block dimensions specified in work-items\n @param [in] blockDimY Y grid dimension specified in work-items\n @param [in] blockDimZ Z grid dimension specified in work-items\n @param [in] sharedMemBytes Amount of dynamic shared memory to allocate for this kernel. The\n HIP-Clang compiler provides support for extern shared declarations.\n @param [in] stream    Stream where the kernel should be dispatched.  May be 0, in which case th\n default stream is used with associated synchronization rules.\n @param [in] kernelParams  Kernel parameters to launch\n @param [in] extra     Pointer to kernel arguments.   These are passed directly to the kernel and\n must be in the memory layout and alignment expected by the kernel.\n All passed arguments must be naturally aligned according to their type. The memory address of each\n argument should be a multiple of its size in bytes. Please refer to hip_porting_driver_api.md\n for sample usage.\n\n Please note, HIP does not support kernel launch with total work items defined in dimension with\n size gridDim x blockDim >= 2^32. So gridDim.x * blockDim.x, gridDim.y * blockDim.y\n and gridDim.z * blockDim.z are always less than 2^32.\n\n @returns #hipSuccess, #hipErrorNotInitialized, #hipErrorInvalidValue*/\n    pub fn hipModuleLaunchKernel(\n        f: hipFunction_t,\n        gridDimX: ::core::ffi::c_uint,\n        gridDimY: ::core::ffi::c_uint,\n        gridDimZ: ::core::ffi::c_uint,\n        blockDimX: ::core::ffi::c_uint,\n        blockDimY: ::core::ffi::c_uint,\n        blockDimZ: ::core::ffi::c_uint,\n        sharedMemBytes: ::core::ffi::c_uint,\n        stream: hipStream_t,\n        kernelParams: *mut *mut ::core::ffi::c_void,\n        extra: *mut *mut ::core::ffi::c_void,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\addtogroup ModuleCooperativeG Cooperative groups kernel launch of Module management.\\n \\\\ingroup Module\\n  @{ */\\n/**\\n @brief launches kernel f with launch parameters and shared memory on stream with arguments passed\\n to kernelParams, where thread blocks can cooperate and synchronize as they execute\\n\\n @param [in] f              Kernel to launch.\\n @param [in] gridDimX       X grid dimension specified as multiple of blockDimX.\\n @param [in] gridDimY       Y grid dimension specified as multiple of blockDimY.\\n @param [in] gridDimZ       Z grid dimension specified as multiple of blockDimZ.\\n @param [in] blockDimX      X block dimension specified in work-items.\\n @param [in] blockDimY      Y block dimension specified in work-items.\\n @param [in] blockDimZ      Z block dimension specified in work-items.\\n @param [in] sharedMemBytes Amount of dynamic shared memory to allocate for this kernel. The\\n HIP-Clang compiler provides support for extern shared declarations.\\n @param [in] stream         Stream where the kernel should be dispatched. May be 0,\\n in which case the default stream is used with associated synchronization rules.\\n @param [in] kernelParams   A list of kernel arguments.\\n\\n Please note, HIP does not support kernel launch with total work items defined in dimension with\\n size \\\\f$ gridDim \\\\cdot blockDim \\\\geq 2^{32} \\\\f$.\\n\\n @returns #hipSuccess, #hipErrorDeinitialized, #hipErrorNotInitialized, #hipErrorInvalidContext,\\n #hipErrorInvalidHandle, #hipErrorInvalidImage, #hipErrorInvalidValue,\\n #hipErrorInvalidConfiguration, #hipErrorLaunchFailure, #hipErrorLaunchOutOfResources,\\n #hipErrorLaunchTimeOut, #hipErrorCooperativeLaunchTooLarge, #hipErrorSharedObjectInitFailed\"]\n    pub fn hipModuleLaunchCooperativeKernel(\n        f: hipFunction_t,\n        gridDimX: ::core::ffi::c_uint,\n        gridDimY: ::core::ffi::c_uint,\n        gridDimZ: ::core::ffi::c_uint,\n        blockDimX: ::core::ffi::c_uint,\n        blockDimY: ::core::ffi::c_uint,\n        blockDimZ: ::core::ffi::c_uint,\n        sharedMemBytes: ::core::ffi::c_uint,\n        stream: hipStream_t,\n        kernelParams: *mut *mut ::core::ffi::c_void,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Launches kernels on multiple devices where thread blocks can cooperate and\n synchronize as they execute.\n\n @param [in] launchParamsList         List of launch parameters, one per device.\n @param [in] numDevices               Size of the launchParamsList array.\n @param [in] flags                    Flags to control launch behavior.\n\n @returns #hipSuccess, #hipErrorDeinitialized, #hipErrorNotInitialized, #hipErrorInvalidContext,\n #hipErrorInvalidHandle, #hipErrorInvalidImage, #hipErrorInvalidValue,\n #hipErrorInvalidConfiguration, #hipErrorInvalidResourceHandle, #hipErrorLaunchFailure,\n #hipErrorLaunchOutOfResources, #hipErrorLaunchTimeOut, #hipErrorCooperativeLaunchTooLarge,\n #hipErrorSharedObjectInitFailed*/\n    pub fn hipModuleLaunchCooperativeKernelMultiDevice(\n        launchParamsList: *mut hipFunctionLaunchParams,\n        numDevices: ::core::ffi::c_uint,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Launches kernel f with launch parameters and shared memory on stream with arguments passed\n to kernelparams or extra, where thread blocks can cooperate and synchronize as they execute.\n\n @param [in] f - Kernel to launch.\n @param [in] gridDim - Grid dimensions specified as multiple of blockDim.\n @param [in] blockDimX - Block dimensions specified in work-items\n @param [in] kernelParams - Pointer of arguments passed to the kernel. If the kernel has multiple\n parameters, 'kernelParams' should be array of pointers, each points the corresponding argument.\n @param [in] sharedMemBytes - Amount of dynamic shared memory to allocate for this kernel. The\n HIP-Clang compiler provides support for extern shared declarations.\n @param [in] stream - Stream where the kernel should be dispatched.  May be 0, in which case th\n default stream is used with associated synchronization rules.\n\n Please note, HIP does not support kernel launch with total work items defined in dimension with\n size \\f$ gridDim \\cdot blockDim \\geq 2^{32} \\f$.\n\n @returns #hipSuccess, #hipErrorNotInitialized, #hipErrorInvalidValue,\n #hipErrorCooperativeLaunchTooLarge*/\n    pub fn hipLaunchCooperativeKernel(\n        f: *const ::core::ffi::c_void,\n        gridDim: dim3,\n        blockDimX: dim3,\n        kernelParams: *mut *mut ::core::ffi::c_void,\n        sharedMemBytes: ::core::ffi::c_uint,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Launches kernels on multiple devices where thread blocks can cooperate and\n synchronize as they execute.\n\n @param [in] launchParamsList         List of launch parameters, one per device.\n @param [in] numDevices               Size of the launchParamsList array.\n @param [in] flags                    Flags to control launch behavior.\n\n @returns #hipSuccess, #hipErrorNotInitialized, #hipErrorInvalidValue,\n  #hipErrorCooperativeLaunchTooLarge*/\n    pub fn hipLaunchCooperativeKernelMultiDevice(\n        launchParamsList: *mut hipLaunchParams,\n        numDevices: ::core::ffi::c_int,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Launches kernels on multiple devices and guarantees all specified kernels are dispatched\n on respective streams before enqueuing any other work on the specified streams from any other threads\n @ingroup Execution\n @param [in] launchParamsList          List of launch parameters, one per device.\n @param [in] numDevices               Size of the launchParamsList array.\n @param [in] flags                    Flags to control launch behavior.\n\n @returns #hipSuccess, #hipErrorNotInitialized, #hipErrorInvalidValue*/\n    pub fn hipExtLaunchMultiKernelMultiDevice(\n        launchParamsList: *mut hipLaunchParams,\n        numDevices: ::core::ffi::c_int,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \"-------------------------------------------------------------------------------------------------\\n-------------------------------------------------------------------------------------------------\\n  @defgroup Occupancy Occupancy\\n  @{\\n  This section describes the occupancy functions of HIP runtime API.\\n\\n/\\n/**\\n @brief determine the grid and block sizes to achieves maximum occupancy for a kernel\\n\\n @param [out] gridSize           minimum grid size for maximum potential occupancy\\n @param [out] blockSize          block size for maximum potential occupancy\\n @param [in]  f                  kernel function for which occupancy is calulated\\n @param [in]  dynSharedMemPerBlk dynamic shared memory usage (in bytes) intended for each block\\n @param [in]  blockSizeLimit     the maximum block size for the kernel, use 0 for no limit\\n\\n Please note, HIP does not support kernel launch with total work items defined in dimension with\\n size gridDim x blockDim >= 2^32.\\n\\n @returns #hipSuccess, #hipErrorInvalidValue\"]\n    pub fn hipModuleOccupancyMaxPotentialBlockSize(\n        gridSize: *mut ::core::ffi::c_int,\n        blockSize: *mut ::core::ffi::c_int,\n        f: hipFunction_t,\n        dynSharedMemPerBlk: usize,\n        blockSizeLimit: ::core::ffi::c_int,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief determine the grid and block sizes to achieves maximum occupancy for a kernel\n\n @param [out] gridSize           minimum grid size for maximum potential occupancy\n @param [out] blockSize          block size for maximum potential occupancy\n @param [in]  f                  kernel function for which occupancy is calulated\n @param [in]  dynSharedMemPerBlk dynamic shared memory usage (in bytes) intended for each block\n @param [in]  blockSizeLimit     the maximum block size for the kernel, use 0 for no limit\n @param [in]  flags            Extra flags for occupancy calculation (only default supported)\n\n Please note, HIP does not support kernel launch with total work items defined in dimension with\n size gridDim x blockDim >= 2^32.\n\n @returns #hipSuccess, #hipErrorInvalidValue*/\n    pub fn hipModuleOccupancyMaxPotentialBlockSizeWithFlags(\n        gridSize: *mut ::core::ffi::c_int,\n        blockSize: *mut ::core::ffi::c_int,\n        f: hipFunction_t,\n        dynSharedMemPerBlk: usize,\n        blockSizeLimit: ::core::ffi::c_int,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns occupancy for a device function.\n\n @param [out] numBlocks        Returned occupancy\n @param [in]  f                Kernel function (hipFunction) for which occupancy is calulated\n @param [in]  blockSize        Block size the kernel is intended to be launched with\n @param [in]  dynSharedMemPerBlk Dynamic shared memory usage (in bytes) intended for each block\n @returns  #hipSuccess, #hipErrorInvalidValue*/\n    pub fn hipModuleOccupancyMaxActiveBlocksPerMultiprocessor(\n        numBlocks: *mut ::core::ffi::c_int,\n        f: hipFunction_t,\n        blockSize: ::core::ffi::c_int,\n        dynSharedMemPerBlk: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns occupancy for a device function.\n\n @param [out] numBlocks        Returned occupancy\n @param [in]  f                Kernel function(hipFunction_t) for which occupancy is calulated\n @param [in]  blockSize        Block size the kernel is intended to be launched with\n @param [in]  dynSharedMemPerBlk Dynamic shared memory usage (in bytes) intended for each block\n @param [in]  flags            Extra flags for occupancy calculation (only default supported)\n @returns  #hipSuccess, #hipErrorInvalidValue*/\n    pub fn hipModuleOccupancyMaxActiveBlocksPerMultiprocessorWithFlags(\n        numBlocks: *mut ::core::ffi::c_int,\n        f: hipFunction_t,\n        blockSize: ::core::ffi::c_int,\n        dynSharedMemPerBlk: usize,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns occupancy for a device function.\n\n @param [out] numBlocks        Returned occupancy\n @param [in]  f                Kernel function for which occupancy is calulated\n @param [in]  blockSize        Block size the kernel is intended to be launched with\n @param [in]  dynSharedMemPerBlk Dynamic shared memory usage (in bytes) intended for each block\n @returns  #hipSuccess, #hipErrorInvalidDeviceFunction, #hipErrorInvalidValue*/\n    pub fn hipOccupancyMaxActiveBlocksPerMultiprocessor(\n        numBlocks: *mut ::core::ffi::c_int,\n        f: *const ::core::ffi::c_void,\n        blockSize: ::core::ffi::c_int,\n        dynSharedMemPerBlk: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns occupancy for a device function.\n\n @param [out] numBlocks        Returned occupancy\n @param [in]  f                Kernel function for which occupancy is calulated\n @param [in]  blockSize        Block size the kernel is intended to be launched with\n @param [in]  dynSharedMemPerBlk Dynamic shared memory usage (in bytes) intended for each block\n @param [in]  flags            Extra flags for occupancy calculation (currently ignored)\n @returns  #hipSuccess, #hipErrorInvalidDeviceFunction, #hipErrorInvalidValue*/\n    pub fn hipOccupancyMaxActiveBlocksPerMultiprocessorWithFlags(\n        numBlocks: *mut ::core::ffi::c_int,\n        f: *const ::core::ffi::c_void,\n        blockSize: ::core::ffi::c_int,\n        dynSharedMemPerBlk: usize,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief determine the grid and block sizes to achieves maximum occupancy for a kernel\n\n @param [out] gridSize           minimum grid size for maximum potential occupancy\n @param [out] blockSize          block size for maximum potential occupancy\n @param [in]  f                  kernel function for which occupancy is calulated\n @param [in]  dynSharedMemPerBlk dynamic shared memory usage (in bytes) intended for each block\n @param [in]  blockSizeLimit     the maximum block size for the kernel, use 0 for no limit\n\n Please note, HIP does not support kernel launch with total work items defined in dimension with\n size gridDim x blockDim >= 2^32.\n\n @returns #hipSuccess, #hipErrorInvalidValue*/\n    pub fn hipOccupancyMaxPotentialBlockSize(\n        gridSize: *mut ::core::ffi::c_int,\n        blockSize: *mut ::core::ffi::c_int,\n        f: *const ::core::ffi::c_void,\n        dynSharedMemPerBlk: usize,\n        blockSizeLimit: ::core::ffi::c_int,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Start recording of profiling information [Deprecated]\n When using this API, start the profiler with profiling disabled.  (--startdisabled)\n @returns  #hipErrorNotSupported\n @warning hipProfilerStart API is deprecated, use roctracer/rocTX instead.*/\n    pub fn hipProfilerStart() -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Stop recording of profiling information [Deprecated]\n When using this API, start the profiler with profiling disabled.  (--startdisabled)\n @returns  #hipErrorNotSupported\n @warning  hipProfilerStart API is deprecated, use roctracer/rocTX instead.*/\n    pub fn hipProfilerStop() -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" @}\\n/\\n/**\\n-------------------------------------------------------------------------------------------------\\n-------------------------------------------------------------------------------------------------\\n  @defgroup Clang Launch API to support the triple-chevron syntax\\n  @{\\n  This section describes the API to support the triple-chevron syntax.\\n/\\n/**\\n @brief Configure a kernel launch.\\n\\n @param [in] gridDim   grid dimension specified as multiple of blockDim.\\n @param [in] blockDim  block dimensions specified in work-items\\n @param [in] sharedMem Amount of dynamic shared memory to allocate for this kernel. The\\n HIP-Clang compiler provides support for extern shared declarations.\\n @param [in] stream    Stream where the kernel should be dispatched.  May be 0, in which case the\\n default stream is used with associated synchronization rules.\\n\\n Please note, HIP does not support kernel launch with total work items defined in dimension with\\n size gridDim x blockDim >= 2^32.\\n\\n @returns #hipSuccess, #hipErrorNotInitialized, #hipErrorInvalidValue\\n\"]\n    pub fn hipConfigureCall(\n        gridDim: dim3,\n        blockDim: dim3,\n        sharedMem: usize,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set a kernel argument.\n\n @returns #hipSuccess, #hipErrorNotInitialized, #hipErrorInvalidValue\n\n @param [in] arg    Pointer the argument in host memory.\n @param [in] size   Size of the argument.\n @param [in] offset Offset of the argument on the argument stack.\n*/\n    pub fn hipSetupArgument(\n        arg: *const ::core::ffi::c_void,\n        size: usize,\n        offset: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Launch a kernel.\n\n @param [in] func Kernel to launch.\n\n @returns #hipSuccess, #hipErrorNotInitialized, #hipErrorInvalidValue\n*/\n    pub fn hipLaunchByPtr(func: *const ::core::ffi::c_void) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief C compliant kernel launch API\n\n @param [in] function_address - Kernel stub function pointer.\n @param [in] numBlocks - Number of blocks.\n @param [in] dimBlocks - Dimension of a block\n @param [in] args - Pointer of arguments passed to the kernel. If the kernel has multiple\n parameters, 'args' should be array of pointers, each points the corresponding argument.\n @param [in] sharedMemBytes - Amount of dynamic shared memory to allocate for this kernel. The\n HIP-Clang compiler provides support for extern shared declarations.\n @param [in] stream - Stream where the kernel should be dispatched.  May be 0, in which case th\n  default stream is used with associated synchronization rules.\n\n @returns #hipSuccess, #hipErrorInvalidValue\n*/\n    pub fn hipLaunchKernel(\n        function_address: *const ::core::ffi::c_void,\n        numBlocks: dim3,\n        dimBlocks: dim3,\n        args: *mut *mut ::core::ffi::c_void,\n        sharedMemBytes: usize,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Enqueues a host function call in a stream.\n\n @param [in] stream - The stream to enqueue work in.\n @param [in] fn - The function to call once enqueued preceeding operations are complete.\n @param [in] userData - User-specified data to be passed to the function.\n\n @returns #hipSuccess, #hipErrorInvalidResourceHandle, #hipErrorInvalidValue,\n #hipErrorNotSupported\n\n The host function to call in this API will be executed after the preceding operations in\n the stream are complete. The function is a blocking operation that blocks operations in the\n stream that follow it, until the function is returned.\n Event synchronization and internal callback functions make sure enqueued operations will\n execute in order, in the stream.\n\n The host function must not make any HIP API calls. The host function is non-reentrant. It must\n not perform sychronization with any operation that may depend on other processing execution\n but is not enqueued to run earlier in the stream.\n\n Host functions that are enqueued respectively in different non-blocking streams can run concurrently.\n\n @warning  This API is marked as beta, meaning, while this is feature complete,\n it is still open to changes and may have outstanding issues.*/\n    pub fn hipLaunchHostFunc(\n        stream: hipStream_t,\n        fn_: hipHostFn_t,\n        userData: *mut ::core::ffi::c_void,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** Copies memory for 2D arrays.\n\n @param pCopy           - Parameters for the memory copy\n\n @returns #hipSuccess, #hipErrorInvalidValue*/\n    pub fn hipDrvMemcpy2DUnaligned(pCopy: *const hip_Memcpy2D) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Launches kernel from the pointer address, with arguments and shared memory on stream.\n\n @param [in] function_address - Pointer to the Kernel to launch.\n @param [in] numBlocks -  Number of blocks.\n @param [in] dimBlocks - Dimension of a block.\n @param [in] args - Pointer of arguments passed to the kernel. If the kernel has multiple\n parameters, 'args' should be array of pointers, each points the corresponding argument.\n @param [in] sharedMemBytes - Amount of dynamic shared memory to allocate for this kernel.\n HIP-Clang compiler provides support for extern shared declarations.\n @param [in] stream - Stream where the kernel should be dispatched.\n May be 0, in which case the default stream is used with associated synchronization rules.\n @param [in] startEvent - If non-null, specified event will be updated to track the start time of\n the kernel launch. The event must be created before calling this API.\n @param [in] stopEvent - If non-null, specified event will be updated to track the stop time of\n the kernel launch. The event must be created before calling this API.\n @param [in] flags - The value of hipExtAnyOrderLaunch, signifies if kernel can be\n launched in any order.\n @returns #hipSuccess, #hipErrorNotInitialized, #hipErrorInvalidValue.\n*/\n    pub fn hipExtLaunchKernel(\n        function_address: *const ::core::ffi::c_void,\n        numBlocks: dim3,\n        dimBlocks: dim3,\n        args: *mut *mut ::core::ffi::c_void,\n        sharedMemBytes: usize,\n        stream: hipStream_t,\n        startEvent: hipEvent_t,\n        stopEvent: hipEvent_t,\n        flags: ::core::ffi::c_int,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a texture object.\n\n @param [out] pTexObject  pointer to the texture object to create\n @param [in] pResDesc  pointer to resource descriptor\n @param [in] pTexDesc  pointer to texture descriptor\n @param [in] pResViewDesc  pointer to resource view descriptor\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported, #hipErrorOutOfMemory\n\n @note 3D liner filter isn't supported on GFX90A boards, on which the API @p hipCreateTextureObject will\n return hipErrorNotSupported.\n*/\n    pub fn hipCreateTextureObject(\n        pTexObject: *mut hipTextureObject_t,\n        pResDesc: *const hipResourceDesc,\n        pTexDesc: *const hipTextureDesc,\n        pResViewDesc: *const hipResourceViewDesc,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Destroys a texture object.\n\n @param [in] textureObject  texture object to destroy\n\n @returns #hipSuccess, #hipErrorInvalidValue\n*/\n    pub fn hipDestroyTextureObject(textureObject: hipTextureObject_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets the channel descriptor in an array.\n\n @param [in] desc  pointer to channel format descriptor\n @param [out] array  memory array on the device\n\n @returns #hipSuccess, #hipErrorInvalidValue\n*/\n    pub fn hipGetChannelDesc(\n        desc: *mut hipChannelFormatDesc,\n        array: hipArray_const_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets resource descriptor for the texture object.\n\n @param [out] pResDesc  pointer to resource descriptor\n @param [in] textureObject  texture object\n\n @returns #hipSuccess, #hipErrorInvalidValue\n*/\n    pub fn hipGetTextureObjectResourceDesc(\n        pResDesc: *mut hipResourceDesc,\n        textureObject: hipTextureObject_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets resource view descriptor for the texture object.\n\n @param [out] pResViewDesc  pointer to resource view descriptor\n @param [in] textureObject  texture object\n\n @returns #hipSuccess, #hipErrorInvalidValue\n*/\n    pub fn hipGetTextureObjectResourceViewDesc(\n        pResViewDesc: *mut hipResourceViewDesc,\n        textureObject: hipTextureObject_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets texture descriptor for the texture object.\n\n @param [out] pTexDesc  pointer to texture descriptor\n @param [in] textureObject  texture object\n\n @returns #hipSuccess, #hipErrorInvalidValue\n*/\n    pub fn hipGetTextureObjectTextureDesc(\n        pTexDesc: *mut hipTextureDesc,\n        textureObject: hipTextureObject_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a texture object.\n\n @param [out] pTexObject  pointer to texture object to create\n @param [in] pResDesc  pointer to resource descriptor\n @param [in] pTexDesc  pointer to texture descriptor\n @param [in] pResViewDesc  pointer to resource view descriptor\n\n @returns #hipSuccess, #hipErrorInvalidValue\n*/\n    pub fn hipTexObjectCreate(\n        pTexObject: *mut hipTextureObject_t,\n        pResDesc: *const HIP_RESOURCE_DESC,\n        pTexDesc: *const HIP_TEXTURE_DESC,\n        pResViewDesc: *const HIP_RESOURCE_VIEW_DESC,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Destroys a texture object.\n\n @param [in] texObject  texture object to destroy\n\n @returns #hipSuccess, #hipErrorInvalidValue\n*/\n    pub fn hipTexObjectDestroy(texObject: hipTextureObject_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets resource descriptor of a texture object.\n\n @param [out] pResDesc  pointer to resource descriptor\n @param [in] texObject  texture object\n\n @returns #hipSuccess, #hipErrorNotSupported, #hipErrorInvalidValue\n*/\n    pub fn hipTexObjectGetResourceDesc(\n        pResDesc: *mut HIP_RESOURCE_DESC,\n        texObject: hipTextureObject_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets resource view descriptor of a texture object.\n\n @param [out] pResViewDesc  pointer to resource view descriptor\n @param [in] texObject  texture object\n\n @returns #hipSuccess, #hipErrorNotSupported, #hipErrorInvalidValue\n*/\n    pub fn hipTexObjectGetResourceViewDesc(\n        pResViewDesc: *mut HIP_RESOURCE_VIEW_DESC,\n        texObject: hipTextureObject_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets texture descriptor of a texture object.\n\n @param [out] pTexDesc  pointer to texture descriptor\n @param [in] texObject  texture object\n\n @returns #hipSuccess, #hipErrorNotSupported, #hipErrorInvalidValue\n*/\n    pub fn hipTexObjectGetTextureDesc(\n        pTexDesc: *mut HIP_TEXTURE_DESC,\n        texObject: hipTextureObject_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Allocate a mipmapped array on the device.\n\n @param[out] mipmappedArray  - Pointer to allocated mipmapped array in device memory\n @param[in]  desc            - Requested channel format\n @param[in]  extent          - Requested allocation size (width field in elements)\n @param[in]  numLevels       - Number of mipmap levels to allocate\n @param[in]  flags           - Flags for extensions\n\n @return #hipSuccess, #hipErrorInvalidValue, #hipErrorMemoryAllocation\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.\n*/\n    pub fn hipMallocMipmappedArray(\n        mipmappedArray: *mut hipMipmappedArray_t,\n        desc: *const hipChannelFormatDesc,\n        extent: hipExtent,\n        numLevels: ::core::ffi::c_uint,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Frees a mipmapped array on the device.\n\n @param[in] mipmappedArray - Pointer to mipmapped array to free\n\n @return #hipSuccess, #hipErrorInvalidValue\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.\n*/\n    pub fn hipFreeMipmappedArray(mipmappedArray: hipMipmappedArray_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets a mipmap level of a HIP mipmapped array.\n\n @param[out] levelArray     - Returned mipmap level HIP array\n @param[in]  mipmappedArray - HIP mipmapped array\n @param[in]  level          - Mipmap level\n\n @return #hipSuccess, #hipErrorInvalidValue\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.\n*/\n    pub fn hipGetMipmappedArrayLevel(\n        levelArray: *mut hipArray_t,\n        mipmappedArray: hipMipmappedArray_const_t,\n        level: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Create a mipmapped array.\n\n @param [out] pHandle  pointer to mipmapped array\n @param [in] pMipmappedArrayDesc  mipmapped array descriptor\n @param [in] numMipmapLevels  mipmap level\n\n @returns #hipSuccess, #hipErrorNotSupported, #hipErrorInvalidValue\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMipmappedArrayCreate(\n        pHandle: *mut hipMipmappedArray_t,\n        pMipmappedArrayDesc: *mut HIP_ARRAY3D_DESCRIPTOR,\n        numMipmapLevels: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Destroy a mipmapped array.\n\n @param [out] hMipmappedArray  pointer to mipmapped array to destroy\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.\n*/\n    pub fn hipMipmappedArrayDestroy(hMipmappedArray: hipMipmappedArray_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get a mipmapped array on a mipmapped level.\n\n @param [in] pLevelArray Pointer of array\n @param [out] hMipMappedArray Pointer of mipmapped array on the requested mipmap level\n @param [out] level  Mipmap level\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.\n*/\n    pub fn hipMipmappedArrayGetLevel(\n        pLevelArray: *mut hipArray_t,\n        hMipMappedArray: hipMipmappedArray_t,\n        level: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief  Binds a mipmapped array to a texture [Deprecated]\n\n @param [in] tex  pointer to the texture reference to bind\n @param [in] mipmappedArray memory mipmapped array on the device\n @param [in] desc  opointer to the channel format\n\n @returns #hipSuccess, #hipErrorInvalidValue\n*/\n    pub fn hipBindTextureToMipmappedArray(\n        tex: *const textureReference,\n        mipmappedArray: hipMipmappedArray_const_t,\n        desc: *const hipChannelFormatDesc,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets the texture reference related with the symbol [Deprecated]\n\n @param [out] texref  texture reference\n @param [in] symbol  pointer to the symbol related with the texture for the reference\n\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is deprecated.\n*/\n    pub fn hipGetTextureReference(\n        texref: *mut *const textureReference,\n        symbol: *const ::core::ffi::c_void,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets the border color used by a texture reference [Deprecated]\n\n @param [out] pBorderColor  Returned Type and Value of RGBA color.\n @param [in] texRef  Texture reference.\n\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is deprecated.\n*/\n    pub fn hipTexRefGetBorderColor(\n        pBorderColor: *mut f32,\n        texRef: *const textureReference,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets the array bound to a texture reference [Deprecated]\n\n\n @param [in] pArray  Returned array.\n @param [in] texRef  texture reference.\n\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is deprecated.\n*/\n    pub fn hipTexRefGetArray(\n        pArray: *mut hipArray_t,\n        texRef: *const textureReference,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets address mode for a texture reference [Deprecated]\n\n @param [in] texRef  texture reference.\n @param [in] dim  Dimension of the texture.\n @param [in] am  Value of the texture address mode.\n\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is deprecated.\n*/\n    pub fn hipTexRefSetAddressMode(\n        texRef: *mut textureReference,\n        dim: ::core::ffi::c_int,\n        am: hipTextureAddressMode,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Binds an array as a texture reference [Deprecated]\n\n @param [in] tex  Pointer texture reference.\n @param [in] array  Array to bind.\n @param [in] flags  Flags should be set as HIP_TRSA_OVERRIDE_FORMAT, as a valid value.\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @warning This API is deprecated.\n*/\n    pub fn hipTexRefSetArray(\n        tex: *mut textureReference,\n        array: hipArray_const_t,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set filter mode for a texture reference [Deprecated]\n\n @param [in] texRef  Pointer texture reference.\n @param [in] fm  Value of texture filter mode.\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @warning This API is deprecated.\n*/\n    pub fn hipTexRefSetFilterMode(\n        texRef: *mut textureReference,\n        fm: hipTextureFilterMode,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set flags for a texture reference [Deprecated]\n\n @param [in] texRef  Pointer texture reference.\n @param [in] Flags  Value of flags.\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @warning This API is deprecated.\n*/\n    pub fn hipTexRefSetFlags(\n        texRef: *mut textureReference,\n        Flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set format for a texture reference [Deprecated]\n\n @param [in] texRef  Pointer texture reference.\n @param [in] fmt  Value of format.\n @param [in] NumPackedComponents  Number of components per array.\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @warning This API is deprecated.\n*/\n    pub fn hipTexRefSetFormat(\n        texRef: *mut textureReference,\n        fmt: hipArray_Format,\n        NumPackedComponents: ::core::ffi::c_int,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Binds a memory area to a texture [Deprecated]\n\n @param [in] offset  Offset in bytes.\n @param [in] tex  Texture to bind.\n @param [in] devPtr  Pointer of memory on the device.\n @param [in] desc  Pointer of channel format descriptor.\n @param [in] size  Size of memory in bites.\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n\n @warning This API is deprecated.\n*/\n    pub fn hipBindTexture(\n        offset: *mut usize,\n        tex: *const textureReference,\n        devPtr: *const ::core::ffi::c_void,\n        desc: *const hipChannelFormatDesc,\n        size: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Binds a 2D memory area to a texture [Deprecated]\n\n @param [in] offset  Offset in bytes.\n @param [in] tex  Texture to bind.\n @param [in] devPtr  Pointer of 2D memory area on the device.\n @param [in] desc  Pointer of channel format descriptor.\n @param [in] width  Width in texel units.\n @param [in] height  Height in texel units.\n @param [in] pitch  Pitch in bytes.\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n\n @warning This API is deprecated.\n*/\n    pub fn hipBindTexture2D(\n        offset: *mut usize,\n        tex: *const textureReference,\n        devPtr: *const ::core::ffi::c_void,\n        desc: *const hipChannelFormatDesc,\n        width: usize,\n        height: usize,\n        pitch: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Binds a memory area to a texture [Deprecated]\n\n @param [in] tex  Pointer of texture reference.\n @param [in] array  Array to bind.\n @param [in] desc  Pointer of channel format descriptor.\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n\n @warning This API is deprecated.\n*/\n    pub fn hipBindTextureToArray(\n        tex: *const textureReference,\n        array: hipArray_const_t,\n        desc: *const hipChannelFormatDesc,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get the offset of the alignment in a texture [Deprecated]\n\n @param [in] offset  Offset in bytes.\n @param [in] texref  Pointer of texture reference.\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n\n @warning This API is deprecated.\n*/\n    pub fn hipGetTextureAlignmentOffset(\n        offset: *mut usize,\n        texref: *const textureReference,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Unbinds a texture [Deprecated]\n\n @param [in] tex  Texture to unbind.\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n\n @warning This API is deprecated.\n*/\n    pub fn hipUnbindTexture(tex: *const textureReference) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets the address for a texture reference [Deprecated]\n\n @param [out] dev_ptr  Pointer of device address.\n @param [in] texRef  Pointer of texture reference.\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n\n @warning This API is deprecated.\n*/\n    pub fn hipTexRefGetAddress(\n        dev_ptr: *mut hipDeviceptr_t,\n        texRef: *const textureReference,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets the address mode for a texture reference [Deprecated]\n\n @param [out] pam  Pointer of address mode.\n @param [in] texRef  Pointer of texture reference.\n @param [in] dim  Dimension.\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n\n @warning This API is deprecated.\n*/\n    pub fn hipTexRefGetAddressMode(\n        pam: *mut hipTextureAddressMode,\n        texRef: *const textureReference,\n        dim: ::core::ffi::c_int,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets filter mode for a texture reference [Deprecated]\n\n @param [out] pfm  Pointer of filter mode.\n @param [in] texRef  Pointer of texture reference.\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n\n @warning This API is deprecated.\n*/\n    pub fn hipTexRefGetFilterMode(\n        pfm: *mut hipTextureFilterMode,\n        texRef: *const textureReference,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets flags for a texture reference [Deprecated]\n\n @param [out] pFlags  Pointer of flags.\n @param [in] texRef  Pointer of texture reference.\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n\n @warning This API is deprecated.\n*/\n    pub fn hipTexRefGetFlags(\n        pFlags: *mut ::core::ffi::c_uint,\n        texRef: *const textureReference,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets texture format for a texture reference [Deprecated]\n\n @param [out] pFormat  Pointer of the format.\n @param [out] pNumChannels  Pointer of number of channels.\n @param [in] texRef  Pointer of texture reference.\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n\n @warning This API is deprecated.\n*/\n    pub fn hipTexRefGetFormat(\n        pFormat: *mut hipArray_Format,\n        pNumChannels: *mut ::core::ffi::c_int,\n        texRef: *const textureReference,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets the maximum anisotropy for a texture reference [Deprecated]\n\n @param [out] pmaxAnsio  Pointer of the maximum anisotropy.\n @param [in] texRef  Pointer of texture reference.\n\n @returns #hipErrorInvalidValue, #hipErrorNotSupported\n\n @warning This API is deprecated.\n*/\n    pub fn hipTexRefGetMaxAnisotropy(\n        pmaxAnsio: *mut ::core::ffi::c_int,\n        texRef: *const textureReference,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets the mipmap filter mode for a texture reference [Deprecated]\n\n @param [out] pfm  Pointer of the mipmap filter mode.\n @param [in] texRef  Pointer of texture reference.\n\n @returns #hipErrorInvalidValue, #hipErrorNotSupported\n\n @warning This API is deprecated.\n*/\n    pub fn hipTexRefGetMipmapFilterMode(\n        pfm: *mut hipTextureFilterMode,\n        texRef: *const textureReference,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets the mipmap level bias for a texture reference [Deprecated]\n\n @param [out] pbias  Pointer of the mipmap level bias.\n @param [in] texRef  Pointer of texture reference.\n\n @returns #hipErrorInvalidValue, #hipErrorNotSupported\n\n @warning This API is deprecated.\n*/\n    pub fn hipTexRefGetMipmapLevelBias(\n        pbias: *mut f32,\n        texRef: *const textureReference,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets the minimum and maximum mipmap level clamps for a texture reference [Deprecated]\n\n @param [out] pminMipmapLevelClamp  Pointer of the minimum mipmap level clamp.\n @param [out] pmaxMipmapLevelClamp  Pointer of the maximum mipmap level clamp.\n @param [in] texRef  Pointer of texture reference.\n\n @returns #hipErrorInvalidValue, #hipErrorNotSupported\n\n @warning This API is deprecated.\n*/\n    pub fn hipTexRefGetMipmapLevelClamp(\n        pminMipmapLevelClamp: *mut f32,\n        pmaxMipmapLevelClamp: *mut f32,\n        texRef: *const textureReference,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets the mipmapped array bound to a texture reference [Deprecated]\n\n @param [out] pArray  Pointer of the mipmapped array.\n @param [in] texRef  Pointer of texture reference.\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n\n @warning This API is deprecated.\n*/\n    pub fn hipTexRefGetMipMappedArray(\n        pArray: *mut hipMipmappedArray_t,\n        texRef: *const textureReference,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets an bound address for a texture reference [Deprecated]\n\n @param [out] ByteOffset  Pointer of the offset in bytes.\n @param [in] texRef  Pointer of texture reference.\n @param [in] dptr  Pointer of device address to bind.\n @param [in] bytes  Size in bytes.\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @warning This API is deprecated.\n*/\n    pub fn hipTexRefSetAddress(\n        ByteOffset: *mut usize,\n        texRef: *mut textureReference,\n        dptr: hipDeviceptr_t,\n        bytes: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set a bind an address as a 2D texture reference [Deprecated]\n\n @param [in] texRef  Pointer of texture reference.\n @param [in] desc  Pointer of array descriptor.\n @param [in] dptr  Pointer of device address to bind.\n @param [in] Pitch  Pitch in bytes.\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n\n @warning This API is deprecated.\n*/\n    pub fn hipTexRefSetAddress2D(\n        texRef: *mut textureReference,\n        desc: *const HIP_ARRAY_DESCRIPTOR,\n        dptr: hipDeviceptr_t,\n        Pitch: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets the maximum anisotropy for a texture reference [Deprecated]\n\n @param [in] texRef  Pointer of texture reference.\n @param [out] maxAniso  Value of the maximum anisotropy.\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n\n @warning This API is deprecated.\n*/\n    pub fn hipTexRefSetMaxAnisotropy(\n        texRef: *mut textureReference,\n        maxAniso: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets border color for a texture reference [Deprecated]\n\n @param [in] texRef  Pointer of texture reference.\n @param [in] pBorderColor  Pointer of border color.\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n\n @warning This API is deprecated.\n*/\n    pub fn hipTexRefSetBorderColor(\n        texRef: *mut textureReference,\n        pBorderColor: *mut f32,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets mipmap filter mode for a texture reference [Deprecated]\n\n @param [in] texRef  Pointer of texture reference.\n @param [in] fm  Value of filter mode.\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n\n @warning This API is deprecated.\n*/\n    pub fn hipTexRefSetMipmapFilterMode(\n        texRef: *mut textureReference,\n        fm: hipTextureFilterMode,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets mipmap level bias for a texture reference [Deprecated]\n\n @param [in] texRef  Pointer of texture reference.\n @param [in] bias  Value of mipmap bias.\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n\n @warning This API is deprecated.\n*/\n    pub fn hipTexRefSetMipmapLevelBias(\n        texRef: *mut textureReference,\n        bias: f32,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets mipmap level clamp for a texture reference [Deprecated]\n\n @param [in] texRef  Pointer of texture reference.\n @param [in] minMipMapLevelClamp  Value of minimum mipmap level clamp.\n @param [in] maxMipMapLevelClamp  Value of maximum mipmap level clamp.\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n\n @warning This API is deprecated.\n*/\n    pub fn hipTexRefSetMipmapLevelClamp(\n        texRef: *mut textureReference,\n        minMipMapLevelClamp: f32,\n        maxMipMapLevelClamp: f32,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Binds mipmapped array to a texture reference [Deprecated]\n\n @param [in] texRef  Pointer of texture reference to bind.\n @param [in] mipmappedArray  Pointer of mipmapped array to bind.\n @param [in] Flags  Flags should be set as HIP_TRSA_OVERRIDE_FORMAT, as a valid value.\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @warning This API is deprecated.\n*/\n    pub fn hipTexRefSetMipmappedArray(\n        texRef: *mut textureReference,\n        mipmappedArray: *mut hipMipmappedArray,\n        Flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[doc = \"  @defgroup Callback Callback Activity APIs\\n  @{\\n  This section describes the callback/Activity of HIP runtime API.\\n/\\n/**\\n @brief Returns HIP API name by ID.\\n\\n @param [in] id ID of HIP API\\n\\n @returns #hipSuccess, #hipErrorInvalidValue\\n\"]\n    pub fn hipApiName(id: u32) -> *const ::core::ffi::c_char;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    /** @brief Returns kernel name reference by function name.\n\n @param [in] f Name of function\n\n @returns #hipSuccess, #hipErrorInvalidValue\n*/\n    pub fn hipKernelNameRef(f: hipFunction_t) -> *const ::core::ffi::c_char;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    /** @brief Retrives kernel for a given host pointer, unless stated otherwise.\n\n @param [in] hostFunction Pointer of host function.\n @param [in] stream Stream the kernel is executed on.\n\n @returns #hipSuccess, #hipErrorInvalidValue\n*/\n    pub fn hipKernelNameRefByPtr(\n        hostFunction: *const ::core::ffi::c_void,\n        stream: hipStream_t,\n    ) -> *const ::core::ffi::c_char;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    /** @brief Returns device ID on the stream.\n\n @param [in] stream Stream of device executed on.\n\n @returns #hipSuccess, #hipErrorInvalidValue\n*/\n    pub fn hipGetStreamDeviceId(stream: hipStream_t) -> ::core::ffi::c_int;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Begins graph capture on a stream.\n\n @param [in] stream - Stream to initiate capture.\n @param [in] mode - Controls the interaction of this capture sequence with other API calls that\n are not safe.\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n*/\n    pub fn hipStreamBeginCapture(\n        stream: hipStream_t,\n        mode: hipStreamCaptureMode,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Begins graph capture on a stream to an existing graph.\n\n @param [in] stream - Stream to initiate capture.\n @param [in] graph - Graph to capture into.\n @param [in] dependencies - Dependencies of the first node captured in the stream. Can be NULL if\n numDependencies is 0.\n @param [in] dependencyData - Optional array of data associated with each dependency.\n @param [in] numDependencies - Number of dependencies.\n @param [in] mode - Controls the interaction of this capture sequence with other API calls that\nare not safe.\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @warning param \"const hipGraphEdgeData* dependencyData\" is currently not supported and has to be\npassed as nullptr. This API is marked as beta, meaning, while this is feature complete, it is still\nopen to changes and may have outstanding issues.*/\n    pub fn hipStreamBeginCaptureToGraph(\n        stream: hipStream_t,\n        graph: hipGraph_t,\n        dependencies: *const hipGraphNode_t,\n        dependencyData: *const hipGraphEdgeData,\n        numDependencies: usize,\n        mode: hipStreamCaptureMode,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Ends capture on a stream, returning the captured graph.\n\n @param [in] stream - Stream to end capture.\n @param [out] pGraph - Captured graph.\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n*/\n    pub fn hipStreamEndCapture(\n        stream: hipStream_t,\n        pGraph: *mut hipGraph_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get capture status of a stream.\n\n @param [in] stream - Stream of which to get capture status from.\n @param [out] pCaptureStatus - Returns current capture status.\n @param [out] pId - Unique capture ID.\n\n @returns #hipSuccess, #hipErrorStreamCaptureImplicit\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n*/\n    pub fn hipStreamGetCaptureInfo(\n        stream: hipStream_t,\n        pCaptureStatus: *mut hipStreamCaptureStatus,\n        pId: *mut ::core::ffi::c_ulonglong,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get stream's capture state\n\n @param [in] stream - Stream of which to get capture status from.\n @param [out] captureStatus_out - Returns current capture status.\n @param [out] id_out - Unique capture ID.\n @param [out] graph_out - Returns the graph being captured into.\n @param [out] dependencies_out - Pointer to an array of nodes representing the graphs dependencies.\n @param [out] numDependencies_out - Returns size of the array returned in dependencies_out.\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorStreamCaptureImplicit\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n*/\n    pub fn hipStreamGetCaptureInfo_v2(\n        stream: hipStream_t,\n        captureStatus_out: *mut hipStreamCaptureStatus,\n        id_out: *mut ::core::ffi::c_ulonglong,\n        graph_out: *mut hipGraph_t,\n        dependencies_out: *mut *const hipGraphNode_t,\n        numDependencies_out: *mut usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get stream's capture state\n\n @param [in] stream - Stream of which to get capture status from.\n @param [out] pCaptureStatus - Returns current capture status.\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorStreamCaptureImplicit\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n*/\n    pub fn hipStreamIsCapturing(\n        stream: hipStream_t,\n        pCaptureStatus: *mut hipStreamCaptureStatus,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Update the set of dependencies in a capturing stream\n\n @param [in] stream  Stream that is being captured.\n @param [in] dependencies  Pointer to an array of nodes to add/replace.\n @param [in] numDependencies  Size of the dependencies array.\n @param [in] flags  Flag to update dependency set. Should be one of the values\n in enum #hipStreamUpdateCaptureDependenciesFlags.\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorIllegalState\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n*/\n    pub fn hipStreamUpdateCaptureDependencies(\n        stream: hipStream_t,\n        dependencies: *mut hipGraphNode_t,\n        numDependencies: usize,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Swaps the stream capture mode of a thread.\n\n @param [in] mode - Pointer to mode value to swap with the current mode.\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n*/\n    pub fn hipThreadExchangeStreamCaptureMode(\n        mode: *mut hipStreamCaptureMode,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a graph\n\n @param [out] pGraph - pointer to graph to create.\n @param [in] flags - flags for graph creation, must be 0.\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorMemoryAllocation\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n*/\n    pub fn hipGraphCreate(\n        pGraph: *mut hipGraph_t,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Destroys a graph\n\n @param [in] graph - instance of graph to destroy.\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n*/\n    pub fn hipGraphDestroy(graph: hipGraph_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Adds dependency edges to a graph.\n\n @param [in] graph - Instance of the graph to add dependencies to.\n @param [in] from - Pointer to the graph nodes with dependencies to add from.\n @param [in] to - Pointer to the graph nodes to add dependencies to.\n @param [in] numDependencies - Number of dependencies to add.\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n*/\n    pub fn hipGraphAddDependencies(\n        graph: hipGraph_t,\n        from: *const hipGraphNode_t,\n        to: *const hipGraphNode_t,\n        numDependencies: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Removes dependency edges from a graph.\n\n @param [in] graph - Instance of the graph to remove dependencies from.\n @param [in] from - Array of nodes that provide the dependencies.\n @param [in] to - Array of dependent nodes.\n @param [in] numDependencies - Number of dependencies to remove.\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n*/\n    pub fn hipGraphRemoveDependencies(\n        graph: hipGraph_t,\n        from: *const hipGraphNode_t,\n        to: *const hipGraphNode_t,\n        numDependencies: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns a graph's dependency edges.\n\n @param [in] graph - Instance of the graph to get the edges from.\n @param [out] from - Pointer to the graph nodes to return edge endpoints.\n @param [out] to - Pointer to the graph nodes to return edge endpoints.\n @param [out] numEdges - Returns number of edges.\n @returns #hipSuccess, #hipErrorInvalidValue\n\n from and to may both be NULL, in which case this function only returns the number of edges in\n numEdges. Otherwise, numEdges entries will be filled in. If numEdges is higher than the actual\n number of edges, the remaining entries in from and to will be set to NULL, and the number of\n edges actually returned will be written to numEdges.\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n*/\n    pub fn hipGraphGetEdges(\n        graph: hipGraph_t,\n        from: *mut hipGraphNode_t,\n        to: *mut hipGraphNode_t,\n        numEdges: *mut usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns a graph's nodes.\n\n @param [in] graph - Instance of graph to get the nodes from.\n @param [out] nodes - Pointer to return the  graph nodes.\n @param [out] numNodes - Returns the number of graph nodes.\n @returns #hipSuccess, #hipErrorInvalidValue\n\n nodes may be NULL, in which case this function will return the number of nodes in numNodes.\n Otherwise, numNodes entries will be filled in. If numNodes is higher than the actual number of\n nodes, the remaining entries in nodes will be set to NULL, and the number of nodes actually\n obtained will be returned in numNodes.\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n*/\n    pub fn hipGraphGetNodes(\n        graph: hipGraph_t,\n        nodes: *mut hipGraphNode_t,\n        numNodes: *mut usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns a graph's root nodes.\n\n @param [in] graph - Instance of the graph to get the nodes from.\n @param [out] pRootNodes - Pointer to return the graph's root nodes.\n @param [out] pNumRootNodes - Returns the number of graph's root nodes.\n @returns #hipSuccess, #hipErrorInvalidValue\n\n pRootNodes may be NULL, in which case this function will return the number of root nodes in\n pNumRootNodes. Otherwise, pNumRootNodes entries will be filled in. If pNumRootNodes is higher\n than the actual number of root nodes, the remaining entries in pRootNodes will be set to NULL,\n and the number of nodes actually obtained will be returned in pNumRootNodes.\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n*/\n    pub fn hipGraphGetRootNodes(\n        graph: hipGraph_t,\n        pRootNodes: *mut hipGraphNode_t,\n        pNumRootNodes: *mut usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns a node's dependencies.\n\n @param [in] node - Graph node to get the dependencies from.\n @param [out] pDependencies - Pointer to return the dependencies.\n @param [out] pNumDependencies -  Returns the number of graph node dependencies.\n @returns #hipSuccess, #hipErrorInvalidValue\n\n pDependencies may be NULL, in which case this function will return the number of dependencies in\n pNumDependencies. Otherwise, pNumDependencies entries will be filled in. If pNumDependencies is\n higher than the actual number of dependencies, the remaining entries in pDependencies will be set\n to NULL, and the number of nodes actually obtained will be returned in pNumDependencies.\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n*/\n    pub fn hipGraphNodeGetDependencies(\n        node: hipGraphNode_t,\n        pDependencies: *mut hipGraphNode_t,\n        pNumDependencies: *mut usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns a node's dependent nodes.\n\n @param [in] node - Graph node to get the dependent nodes from.\n @param [out] pDependentNodes - Pointer to return the graph dependent nodes.\n @param [out] pNumDependentNodes - Returns the number of graph node dependent nodes.\n @returns #hipSuccess, #hipErrorInvalidValue\n\n pDependentNodes may be NULL, in which case this function will return the number of dependent nodes\n in pNumDependentNodes. Otherwise, pNumDependentNodes entries will be filled in. If\n pNumDependentNodes is higher than the actual number of dependent nodes, the remaining entries in\n pDependentNodes will be set to NULL, and the number of nodes actually obtained will be returned\n in pNumDependentNodes.\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n*/\n    pub fn hipGraphNodeGetDependentNodes(\n        node: hipGraphNode_t,\n        pDependentNodes: *mut hipGraphNode_t,\n        pNumDependentNodes: *mut usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns a node's type.\n\n @param [in] node - Node to get type of.\n @param [out] pType - Returns the node's type.\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n*/\n    pub fn hipGraphNodeGetType(\n        node: hipGraphNode_t,\n        pType: *mut hipGraphNodeType,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Remove a node from the graph.\n\n @param [in] node - graph node to remove\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n*/\n    pub fn hipGraphDestroyNode(node: hipGraphNode_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Clones a graph.\n\n @param [out] pGraphClone - Returns newly created cloned graph.\n @param [in] originalGraph - original graph to clone from.\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorMemoryAllocation\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n*/\n    pub fn hipGraphClone(\n        pGraphClone: *mut hipGraph_t,\n        originalGraph: hipGraph_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Finds a cloned version of a node.\n\n @param [out] pNode - Returns the cloned node.\n @param [in] originalNode - original node handle.\n @param [in] clonedGraph - Cloned graph to query.\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n*/\n    pub fn hipGraphNodeFindInClone(\n        pNode: *mut hipGraphNode_t,\n        originalNode: hipGraphNode_t,\n        clonedGraph: hipGraph_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates an executable graph from a graph\n\n @param [out] pGraphExec - Pointer to instantiated executable graph.\n @param [in] graph - Instance of graph to instantiate.\n @param [out] pErrorNode - Pointer to error node. In case an error occured during\n graph instantiation, it could modify the corresponding node.\n @param [out] pLogBuffer - Pointer to log buffer.\n @param [out] bufferSize - Size of the log buffer.\n\n @returns #hipSuccess, #hipErrorOutOfMemory\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n*/\n    pub fn hipGraphInstantiate(\n        pGraphExec: *mut hipGraphExec_t,\n        graph: hipGraph_t,\n        pErrorNode: *mut hipGraphNode_t,\n        pLogBuffer: *mut ::core::ffi::c_char,\n        bufferSize: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates an executable graph from a graph.\n\n @param [out] pGraphExec - Pointer to instantiated executable graph.\n @param [in] graph - Instance of graph to instantiate.\n @param [in] flags - Flags to control instantiation.\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues. It does not support any of\n          flag and is behaving as hipGraphInstantiate.*/\n    pub fn hipGraphInstantiateWithFlags(\n        pGraphExec: *mut hipGraphExec_t,\n        graph: hipGraph_t,\n        flags: ::core::ffi::c_ulonglong,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates an executable graph from a graph.\n\n @param [out] pGraphExec - Pointer to instantiated executable graph.\n @param [in] graph - Instance of graph to instantiate.\n @param [in] instantiateParams - Graph instantiation Params\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphInstantiateWithParams(\n        pGraphExec: *mut hipGraphExec_t,\n        graph: hipGraph_t,\n        instantiateParams: *mut hipGraphInstantiateParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Launches an executable graph in the specified stream.\n\n @param [in] graphExec - Instance of executable graph to launch.\n @param [in] stream - Instance of stream in which to launch executable graph.\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphLaunch(graphExec: hipGraphExec_t, stream: hipStream_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Uploads an executable graph to a stream\n\n @param [in] graphExec - Instance of executable graph to be uploaded.\n @param [in] stream - Instance of stream to which the executable graph is uploaded to.\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphUpload(graphExec: hipGraphExec_t, stream: hipStream_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a kernel execution node and adds it to a graph.\n\n @param [out] pGraphNode - Pointer to kernel graph node that is created.\n @param [in] graph - Instance of graph to add the created node to.\n @param [in] pDependencies - Pointer to the dependencies on the kernel execution node.\n @param [in] numDependencies - Number of dependencies.\n @param [in] nodeParams - Pointer to the node parameters.\n @returns #hipSuccess, #hipErrorInvalidValue.\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphAddNode(\n        pGraphNode: *mut hipGraphNode_t,\n        graph: hipGraph_t,\n        pDependencies: *const hipGraphNode_t,\n        numDependencies: usize,\n        nodeParams: *mut hipGraphNodeParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Return the flags of an executable graph.\n\n @param [in] graphExec - Executable graph to get the flags from.\n @param [out] flags - Flags used to instantiate this executable graph.\n @returns #hipSuccess, #hipErrorInvalidValue.\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphExecGetFlags(\n        graphExec: hipGraphExec_t,\n        flags: *mut ::core::ffi::c_ulonglong,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Updates parameters of a graph's node.\n\n @param [in] node - Instance of the node to set parameters for.\n @param [in] nodeParams - Pointer to the parameters to be set.\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidDeviceFunction, #hipErrorNotSupported.\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphNodeSetParams(\n        node: hipGraphNode_t,\n        nodeParams: *mut hipGraphNodeParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Updates parameters of an executable graph's node.\n\n @param [in] graphExec - Instance of the executable graph.\n @param [in] node - Instance of the node to set parameters to.\n @param [in] nodeParams - Pointer to the parameters to be set.\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidDeviceFunction, #hipErrorNotSupported.\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphExecNodeSetParams(\n        graphExec: hipGraphExec_t,\n        node: hipGraphNode_t,\n        nodeParams: *mut hipGraphNodeParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Destroys an executable graph\n\n @param [in] graphExec - Instance of executable graph to destroy.\n\n @returns #hipSuccess.\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphExecDestroy(graphExec: hipGraphExec_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Check whether an executable graph can be updated with a graph and perform the update if  *\n possible.\n\n @param [in] hGraphExec - instance of executable graph to update.\n @param [in] hGraph - graph that contains the updated parameters.\n @param [in] hErrorNode_out -  node which caused the permissibility check to forbid the update.\n @param [in] updateResult_out - Return code whether the graph update was performed.\n @returns #hipSuccess, #hipErrorGraphExecUpdateFailure\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphExecUpdate(\n        hGraphExec: hipGraphExec_t,\n        hGraph: hipGraph_t,\n        hErrorNode_out: *mut hipGraphNode_t,\n        updateResult_out: *mut hipGraphExecUpdateResult,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a kernel execution node and adds it to a graph.\n\n @param [out] pGraphNode - Pointer to graph node that is created\n @param [in] graph - Instance of graph to add the created node to.\n @param [in] pDependencies - Pointer to the dependencies of the kernel execution node.\n @param [in] numDependencies - The number of the dependencies.\n @param [in] pNodeParams - Pointer to the parameters of the kernel execution node.\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorInvalidDeviceFunction\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphAddKernelNode(\n        pGraphNode: *mut hipGraphNode_t,\n        graph: hipGraph_t,\n        pDependencies: *const hipGraphNode_t,\n        numDependencies: usize,\n        pNodeParams: *const hipKernelNodeParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets kernel node's parameters.\n\n @param [in] node - instance of the node to get parameters from.\n @param [out] pNodeParams - pointer to the parameters\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphKernelNodeGetParams(\n        node: hipGraphNode_t,\n        pNodeParams: *mut hipKernelNodeParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets a kernel node's parameters.\n\n @param [in] node - Instance of the node to set parameters of.\n @param [in] pNodeParams - const pointer to the parameters.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphKernelNodeSetParams(\n        node: hipGraphNode_t,\n        pNodeParams: *const hipKernelNodeParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets the parameters for a kernel node in the given graphExec.\n\n @param [in] hGraphExec - Instance of the executable graph with the node.\n @param [in] node - Instance of the node to set parameters of.\n @param [in] pNodeParams - const pointer to the kernel node parameters.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphExecKernelNodeSetParams(\n        hGraphExec: hipGraphExec_t,\n        node: hipGraphNode_t,\n        pNodeParams: *const hipKernelNodeParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a memcpy node and adds it to a graph.\n\n @param [out] phGraphNode - Pointer to graph node that is created.\n @param [in] hGraph - Instance of graph to add the created node to.\n @param [in] dependencies - const pointer to the dependencies of the memcpy execution node.\n @param [in] numDependencies - The number of dependencies.\n @param [in] copyParams - const pointer to the parameters for the memory copy.\n @param [in] ctx - context related to current device.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipDrvGraphAddMemcpyNode(\n        phGraphNode: *mut hipGraphNode_t,\n        hGraph: hipGraph_t,\n        dependencies: *const hipGraphNode_t,\n        numDependencies: usize,\n        copyParams: *const HIP_MEMCPY3D,\n        ctx: hipCtx_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a memcpy node and adds it to a graph.\n\n @param [out] pGraphNode - Pointer to graph node that is created.\n @param [in] graph - Instance of graph to add the created node to.\n @param [in] pDependencies - const pointer to the dependencies of the memcpy execution node.\n @param [in] numDependencies - The number of dependencies.\n @param [in] pCopyParams - const pointer to the parameters for the memory copy.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphAddMemcpyNode(\n        pGraphNode: *mut hipGraphNode_t,\n        graph: hipGraph_t,\n        pDependencies: *const hipGraphNode_t,\n        numDependencies: usize,\n        pCopyParams: *const hipMemcpy3DParms,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets a memcpy node's parameters.\n\n @param [in] node - instance of the node to get parameters from.\n @param [out] pNodeParams - pointer to the parameters.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphMemcpyNodeGetParams(\n        node: hipGraphNode_t,\n        pNodeParams: *mut hipMemcpy3DParms,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets a memcpy node's parameters.\n\n @param [in] node - instance of the node to set parameters to.\n @param [in] pNodeParams - const pointer to the parameters.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphMemcpyNodeSetParams(\n        node: hipGraphNode_t,\n        pNodeParams: *const hipMemcpy3DParms,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets a node's attribute.\n\n @param [in] hNode - Instance of the node to set parameters of.\n @param [in] attr - The attribute type to be set.\n @param [in] value - const pointer to the parameters.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphKernelNodeSetAttribute(\n        hNode: hipGraphNode_t,\n        attr: hipLaunchAttributeID,\n        value: *const hipLaunchAttributeValue,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets a node's attribute.\n\n @param [in] hNode - Instance of the node to set parameters of.\n @param [in] attr - The attribute type to be set.\n @param [in] value - const pointer to the parameters.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphKernelNodeGetAttribute(\n        hNode: hipGraphNode_t,\n        attr: hipLaunchAttributeID,\n        value: *mut hipLaunchAttributeValue,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets the parameters of a memcpy node in the given graphExec.\n\n @param [in] hGraphExec - Instance of the executable graph with the node.\n @param [in] node - Instance of the node to set parameters of.\n @param [in] pNodeParams - const pointer to the kernel node parameters.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphExecMemcpyNodeSetParams(\n        hGraphExec: hipGraphExec_t,\n        node: hipGraphNode_t,\n        pNodeParams: *mut hipMemcpy3DParms,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a 1D memcpy node and adds it to a graph.\n\n @param [out] pGraphNode - Pointer to graph node that is created.\n @param [in] graph - Instance of graph to add the created node to.\n @param [in] pDependencies - const pointer to the dependencies of the memcpy execution node.\n @param [in] numDependencies - The number of dependencies.\n @param [in] dst - Pointer to memory address of the destination.\n @param [in] src - Pointer to memory address of the source.\n @param [in] count - Size of the memory to copy.\n @param [in] kind - Type of memory copy.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphAddMemcpyNode1D(\n        pGraphNode: *mut hipGraphNode_t,\n        graph: hipGraph_t,\n        pDependencies: *const hipGraphNode_t,\n        numDependencies: usize,\n        dst: *mut ::core::ffi::c_void,\n        src: *const ::core::ffi::c_void,\n        count: usize,\n        kind: hipMemcpyKind,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets a memcpy node's parameters to perform a 1-dimensional copy.\n\n @param [in] node - Instance of the node to set parameters of.\n @param [in] dst - Pointer to memory address of the destination.\n @param [in] src - Pointer to memory address of the source.\n @param [in] count - Size of the memory to copy.\n @param [in] kind - Type of memory copy.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphMemcpyNodeSetParams1D(\n        node: hipGraphNode_t,\n        dst: *mut ::core::ffi::c_void,\n        src: *const ::core::ffi::c_void,\n        count: usize,\n        kind: hipMemcpyKind,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets the parameters for a memcpy node in the given graphExec to perform a 1-dimensional\n copy.\n\n @param [in] hGraphExec - Instance of the executable graph with the node.\n @param [in] node - Instance of the node to set parameters of.\n @param [in] dst - Pointer to memory address of the destination.\n @param [in] src - Pointer to memory address of the source.\n @param [in] count - Size of the memory to copy.\n @param [in] kind - Type of memory copy.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphExecMemcpyNodeSetParams1D(\n        hGraphExec: hipGraphExec_t,\n        node: hipGraphNode_t,\n        dst: *mut ::core::ffi::c_void,\n        src: *const ::core::ffi::c_void,\n        count: usize,\n        kind: hipMemcpyKind,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a memcpy node to copy from a symbol on the device and adds it to a graph.\n\n @param [out] pGraphNode - Pointer to graph node that is created.\n @param [in] graph - Instance of graph to add the created node to.\n @param [in] pDependencies - const pointer to the dependencies of the memcpy execution node.\n @param [in] numDependencies - Number of the dependencies.\n @param [in] dst - Pointer to memory address of the destination.\n @param [in] symbol - Device symbol address.\n @param [in] count - Size of the memory to copy.\n @param [in] offset - Offset from start of symbol in bytes.\n @param [in] kind - Type of memory copy.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphAddMemcpyNodeFromSymbol(\n        pGraphNode: *mut hipGraphNode_t,\n        graph: hipGraph_t,\n        pDependencies: *const hipGraphNode_t,\n        numDependencies: usize,\n        dst: *mut ::core::ffi::c_void,\n        symbol: *const ::core::ffi::c_void,\n        count: usize,\n        offset: usize,\n        kind: hipMemcpyKind,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets a memcpy node's parameters to copy from a symbol on the device.\n\n @param [in] node - Instance of the node to set parameters of.\n @param [in] dst - Pointer to memory address of the destination.\n @param [in] symbol - Device symbol address.\n @param [in] count - Size of the memory to copy.\n @param [in] offset - Offset from start of symbol in bytes.\n @param [in] kind - Type of memory copy.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphMemcpyNodeSetParamsFromSymbol(\n        node: hipGraphNode_t,\n        dst: *mut ::core::ffi::c_void,\n        symbol: *const ::core::ffi::c_void,\n        count: usize,\n        offset: usize,\n        kind: hipMemcpyKind,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets the parameters for a memcpy node in the given graphExec to copy from a symbol on the\n * device.\n\n @param [in] hGraphExec - Instance of the executable graph with the node.\n @param [in] node - Instance of the node to set parameters of.\n @param [in] dst - Pointer to memory address of the destination.\n @param [in] symbol - Device symbol address.\n @param [in] count - Size of the memory to copy.\n @param [in] offset - Offset from start of symbol in bytes.\n @param [in] kind - Type of memory copy.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphExecMemcpyNodeSetParamsFromSymbol(\n        hGraphExec: hipGraphExec_t,\n        node: hipGraphNode_t,\n        dst: *mut ::core::ffi::c_void,\n        symbol: *const ::core::ffi::c_void,\n        count: usize,\n        offset: usize,\n        kind: hipMemcpyKind,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a memcpy node to copy to a symbol on the device and adds it to a graph.\n\n @param [out] pGraphNode - Pointer to graph node that is created.\n @param [in] graph - Instance of graph to add the created node to.\n @param [in] pDependencies - const pointer to the dependencies on the memcpy execution node.\n @param [in] numDependencies - Number of dependencies.\n @param [in] symbol - Device symbol address.\n @param [in] src - Pointer to memory address of the src.\n @param [in] count - Size of the memory to copy.\n @param [in] offset - Offset from start of symbol in bytes.\n @param [in] kind - Type of memory copy.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphAddMemcpyNodeToSymbol(\n        pGraphNode: *mut hipGraphNode_t,\n        graph: hipGraph_t,\n        pDependencies: *const hipGraphNode_t,\n        numDependencies: usize,\n        symbol: *const ::core::ffi::c_void,\n        src: *const ::core::ffi::c_void,\n        count: usize,\n        offset: usize,\n        kind: hipMemcpyKind,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets a memcpy node's parameters to copy to a symbol on the device.\n\n @param [in] node - Instance of the node to set parameters of.\n @param [in] symbol - Device symbol address.\n @param [in] src - Pointer to memory address of the src.\n @param [in] count - Size of the memory to copy.\n @param [in] offset - Offset from start of symbol in bytes.\n @param [in] kind - Type of memory copy.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphMemcpyNodeSetParamsToSymbol(\n        node: hipGraphNode_t,\n        symbol: *const ::core::ffi::c_void,\n        src: *const ::core::ffi::c_void,\n        count: usize,\n        offset: usize,\n        kind: hipMemcpyKind,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets the parameters for a memcpy node in the given graphExec to copy to a symbol on the\n device.\n @param [in] hGraphExec - Instance of the executable graph with the node.\n @param [in] node - Instance of the node to set parameters of.\n @param [in] symbol - Device symbol address.\n @param [in] src - Pointer to memory address of the src.\n @param [in] count - Size of the memory to copy.\n @param [in] offset - Offset from start of symbol in bytes.\n @param [in] kind - Type of memory copy.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphExecMemcpyNodeSetParamsToSymbol(\n        hGraphExec: hipGraphExec_t,\n        node: hipGraphNode_t,\n        symbol: *const ::core::ffi::c_void,\n        src: *const ::core::ffi::c_void,\n        count: usize,\n        offset: usize,\n        kind: hipMemcpyKind,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a memset node and adds it to a graph.\n\n @param [out] pGraphNode - Pointer to graph node that is created.\n @param [in] graph - Instance of the graph to add the created node to.\n @param [in] pDependencies - const pointer to the dependencies on the memset execution node.\n @param [in] numDependencies - Number of dependencies.\n @param [in] pMemsetParams - const pointer to the parameters for the memory set.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphAddMemsetNode(\n        pGraphNode: *mut hipGraphNode_t,\n        graph: hipGraph_t,\n        pDependencies: *const hipGraphNode_t,\n        numDependencies: usize,\n        pMemsetParams: *const hipMemsetParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets a memset node's parameters.\n\n @param [in] node - Instance of the node to get parameters of.\n @param [out] pNodeParams - Pointer to the parameters.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphMemsetNodeGetParams(\n        node: hipGraphNode_t,\n        pNodeParams: *mut hipMemsetParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets a memset node's parameters.\n\n @param [in] node - Instance of the node to set parameters of.\n @param [in] pNodeParams - Pointer to the parameters.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphMemsetNodeSetParams(\n        node: hipGraphNode_t,\n        pNodeParams: *const hipMemsetParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets the parameters for a memset node in the given graphExec.\n\n @param [in] hGraphExec - Instance of the executable graph with the node.\n @param [in] node - Instance of the node to set parameters of.\n @param [in] pNodeParams - Pointer to the parameters.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphExecMemsetNodeSetParams(\n        hGraphExec: hipGraphExec_t,\n        node: hipGraphNode_t,\n        pNodeParams: *const hipMemsetParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a host execution node and adds it to a graph.\n\n @param [out] pGraphNode - Pointer to graph node that is created.\n @param [in] graph - Instance of the graph to add the created node to.\n @param [in] pDependencies - const pointer to the dependencies of the memset execution node.\n @param [in] numDependencies - Number of dependencies.\n @param [in] pNodeParams - Pointer to the parameters.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphAddHostNode(\n        pGraphNode: *mut hipGraphNode_t,\n        graph: hipGraph_t,\n        pDependencies: *const hipGraphNode_t,\n        numDependencies: usize,\n        pNodeParams: *const hipHostNodeParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns a host node's parameters.\n\n @param [in] node - Instance of the node to get parameters of.\n @param [out] pNodeParams - Pointer to the parameters.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphHostNodeGetParams(\n        node: hipGraphNode_t,\n        pNodeParams: *mut hipHostNodeParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets a host node's parameters.\n\n @param [in] node - Instance of the node to set parameters of.\n @param [in] pNodeParams - Pointer to the parameters.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphHostNodeSetParams(\n        node: hipGraphNode_t,\n        pNodeParams: *const hipHostNodeParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets the parameters for a host node in the given graphExec.\n\n @param [in] hGraphExec - Instance of the executable graph with the node.\n @param [in] node - Instance of the node to set parameters of.\n @param [in] pNodeParams - Pointer to the parameters.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphExecHostNodeSetParams(\n        hGraphExec: hipGraphExec_t,\n        node: hipGraphNode_t,\n        pNodeParams: *const hipHostNodeParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a child graph node and adds it to a graph.\n\n @param [out] pGraphNode - Pointer to graph node that is created.\n @param [in] graph - Instance of the graph to add the created node.\n @param [in] pDependencies - const pointer to the dependencies of the memset execution node.\n @param [in] numDependencies - Number of dependencies.\n @param [in] childGraph - Graph to clone into this node\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphAddChildGraphNode(\n        pGraphNode: *mut hipGraphNode_t,\n        graph: hipGraph_t,\n        pDependencies: *const hipGraphNode_t,\n        numDependencies: usize,\n        childGraph: hipGraph_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets a handle to the embedded graph of a child graph node.\n\n @param [in] node - Instance of the node to get child graph of.\n @param [out] pGraph - Pointer to get the graph.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphChildGraphNodeGetGraph(\n        node: hipGraphNode_t,\n        pGraph: *mut hipGraph_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Updates node parameters in the child graph node in the given graphExec.\n\n @param [in] hGraphExec - instance of the executable graph with the node.\n @param [in] node - node from the graph which was used to instantiate graphExec.\n @param [in] childGraph - child graph with updated parameters.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphExecChildGraphNodeSetParams(\n        hGraphExec: hipGraphExec_t,\n        node: hipGraphNode_t,\n        childGraph: hipGraph_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates an empty node and adds it to a graph.\n\n @param [out] pGraphNode - Pointer to graph node that is created.\n @param [in] graph - Instance of the graph the node is added to.\n @param [in] pDependencies - const pointer to the node dependencies.\n @param [in] numDependencies - Number of dependencies.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphAddEmptyNode(\n        pGraphNode: *mut hipGraphNode_t,\n        graph: hipGraph_t,\n        pDependencies: *const hipGraphNode_t,\n        numDependencies: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates an event record node and adds it to a graph.\n\n @param [out] pGraphNode - Pointer to graph node that is created.\n @param [in] graph - Instance of the graph the node is added to.\n @param [in] pDependencies - const pointer to the node dependencies.\n @param [in] numDependencies - Number of dependencies.\n @param [in] event - Event of the node.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphAddEventRecordNode(\n        pGraphNode: *mut hipGraphNode_t,\n        graph: hipGraph_t,\n        pDependencies: *const hipGraphNode_t,\n        numDependencies: usize,\n        event: hipEvent_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns the event associated with an event record node.\n\n @param [in] node -  Instance of the node to get event of.\n @param [out] event_out - Pointer to return the event.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphEventRecordNodeGetEvent(\n        node: hipGraphNode_t,\n        event_out: *mut hipEvent_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets an event record node's event.\n\n @param [in] node - Instance of the node to set event to.\n @param [in] event - Pointer to the event.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphEventRecordNodeSetEvent(\n        node: hipGraphNode_t,\n        event: hipEvent_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets the event for an event record node in the given graphExec.\n\n @param [in] hGraphExec - instance of the executable graph with the node.\n @param [in] hNode - node from the graph which was used to instantiate graphExec.\n @param [in] event - pointer to the event.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphExecEventRecordNodeSetEvent(\n        hGraphExec: hipGraphExec_t,\n        hNode: hipGraphNode_t,\n        event: hipEvent_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates an event wait node and adds it to a graph.\n\n @param [out] pGraphNode - Pointer to graph node that is created.\n @param [in] graph - Instance of the graph the node to be added.\n @param [in] pDependencies - const pointer to the node dependencies.\n @param [in] numDependencies - Number of dependencies.\n @param [in] event - Event for the node.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphAddEventWaitNode(\n        pGraphNode: *mut hipGraphNode_t,\n        graph: hipGraph_t,\n        pDependencies: *const hipGraphNode_t,\n        numDependencies: usize,\n        event: hipEvent_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns the event associated with an event wait node.\n\n @param [in] node -  Instance of the node to get event of.\n @param [out] event_out - Pointer to return the event.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphEventWaitNodeGetEvent(\n        node: hipGraphNode_t,\n        event_out: *mut hipEvent_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets an event wait node's event.\n\n @param [in] node - Instance of the node to set event of.\n @param [in] event - Pointer to the event.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphEventWaitNodeSetEvent(\n        node: hipGraphNode_t,\n        event: hipEvent_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets the event for an event record node in the given graphExec.\n\n @param [in] hGraphExec - instance of the executable graph with the node.\n @param [in] hNode - node from the graph which was used to instantiate graphExec.\n @param [in] event - pointer to the event.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphExecEventWaitNodeSetEvent(\n        hGraphExec: hipGraphExec_t,\n        hNode: hipGraphNode_t,\n        event: hipEvent_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a memory allocation node and adds it to a graph\n\n @param [out] pGraphNode      - Pointer to the graph node to create and add to the graph\n @param [in] graph            - Instance of the graph node to be added\n @param [in] pDependencies    - Const pointer to the node dependencies\n @param [in] numDependencies  - The number of dependencies\n @param [in, out] pNodeParams - Node parameters for memory allocation, returns a pointer to the allocated memory.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphAddMemAllocNode(\n        pGraphNode: *mut hipGraphNode_t,\n        graph: hipGraph_t,\n        pDependencies: *const hipGraphNode_t,\n        numDependencies: usize,\n        pNodeParams: *mut hipMemAllocNodeParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns parameters for memory allocation node\n\n @param [in] node         - Memory allocation node to query\n @param [out] pNodeParams - Parameters for the specified memory allocation node\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphMemAllocNodeGetParams(\n        node: hipGraphNode_t,\n        pNodeParams: *mut hipMemAllocNodeParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a memory free node and adds it to a graph\n\n @param [out] pGraphNode      - Pointer to the graph node to create and add to the graph\n @param [in] graph            - Instance of the graph node to be added\n @param [in] pDependencies    - Const pointer to the node dependencies\n @param [in] numDependencies  - The number of dependencies\n @param [in] dev_ptr          - Pointer to the memory to be freed\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphAddMemFreeNode(\n        pGraphNode: *mut hipGraphNode_t,\n        graph: hipGraph_t,\n        pDependencies: *const hipGraphNode_t,\n        numDependencies: usize,\n        dev_ptr: *mut ::core::ffi::c_void,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns parameters for memory free node\n\n @param [in] node     - Memory free node to query\n @param [out] dev_ptr - Device pointer of the specified memory free node\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphMemFreeNodeGetParams(\n        node: hipGraphNode_t,\n        dev_ptr: *mut ::core::ffi::c_void,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get the mem attribute for graphs.\n\n @param [in] device - Device to get attributes from\n @param [in] attr - Attribute type to be queried\n @param [out] value - Value of the queried attribute\n @returns #hipSuccess, #hipErrorInvalidDevice\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipDeviceGetGraphMemAttribute(\n        device: ::core::ffi::c_int,\n        attr: hipGraphMemAttributeType,\n        value: *mut ::core::ffi::c_void,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set the mem attribute for graphs.\n\n @param [in] device - Device to set attribute of.\n @param [in] attr - Attribute type to be set.\n @param [in] value - Value of the attribute.\n @returns #hipSuccess, #hipErrorInvalidDevice\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipDeviceSetGraphMemAttribute(\n        device: ::core::ffi::c_int,\n        attr: hipGraphMemAttributeType,\n        value: *mut ::core::ffi::c_void,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Free unused memory reserved for graphs on a specific device and return it back to the OS.\n\n @param [in] device - Device for which memory should be trimmed\n @returns #hipSuccess, #hipErrorInvalidDevice\n\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipDeviceGraphMemTrim(device: ::core::ffi::c_int) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Create an instance of userObject to manage lifetime of a resource.\n\n @param [out] object_out - pointer to instace of userobj.\n @param [in] ptr - pointer to pass to destroy function.\n @param [in] destroy - destroy callback to remove resource.\n @param [in] initialRefcount - reference to resource.\n @param [in] flags - flags passed to API.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipUserObjectCreate(\n        object_out: *mut hipUserObject_t,\n        ptr: *mut ::core::ffi::c_void,\n        destroy: hipHostFn_t,\n        initialRefcount: ::core::ffi::c_uint,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Release number of references to resource.\n\n @param [in] object - pointer to instace of userobj.\n @param [in] count - reference to resource to be retained.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipUserObjectRelease(\n        object: hipUserObject_t,\n        count: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Retain number of references to resource.\n\n @param [in] object - pointer to instace of userobj.\n @param [in] count - reference to resource to be retained.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipUserObjectRetain(\n        object: hipUserObject_t,\n        count: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Retain user object for graphs.\n\n @param [in] graph - pointer to graph to retain the user object for.\n @param [in] object - pointer to instace of userobj.\n @param [in] count - reference to resource to be retained.\n @param [in] flags - flags passed to API.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphRetainUserObject(\n        graph: hipGraph_t,\n        object: hipUserObject_t,\n        count: ::core::ffi::c_uint,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Release user object from graphs.\n\n @param [in] graph - pointer to graph to retain the user object for.\n @param [in] object - pointer to instace of userobj.\n @param [in] count - reference to resource to be retained.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphReleaseUserObject(\n        graph: hipGraph_t,\n        object: hipUserObject_t,\n        count: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Write a DOT file describing graph structure.\n\n @param [in] graph - graph object for which DOT file has to be generated.\n @param [in] path - path to write the DOT file.\n @param [in] flags - Flags from hipGraphDebugDotFlags to get additional node information.\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorOperatingSystem\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphDebugDotPrint(\n        graph: hipGraph_t,\n        path: *const ::core::ffi::c_char,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Copies attributes from source node to destination node.\n\n Copies attributes from source node to destination node.\n Both node must have the same context.\n\n @param [out] hDst - Destination node.\n @param [in] hSrc - Source node.\n For list of attributes see ::hipKernelNodeAttrID.\n\n @returns #hipSuccess, #hipErrorInvalidContext\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphKernelNodeCopyAttributes(\n        hSrc: hipGraphNode_t,\n        hDst: hipGraphNode_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Enables or disables the specified node in the given graphExec\n\n Sets hNode to be either enabled or disabled. Disabled nodes are functionally equivalent\n to empty nodes until they are reenabled. Existing node parameters are not affected by\n disabling/enabling the node.\n\n The node is identified by the corresponding hNode in the non-executable graph, from which the\n executable graph was instantiated.\n\n hNode must not have been removed from the original graph.\n\n @note Currently only kernel, memset and memcpy nodes are supported.\n\n @param [in] hGraphExec - The executable graph in which to set the specified node.\n @param [in] hNode      - Node from the graph from which graphExec was instantiated.\n @param [in] isEnabled  - Node is enabled if != 0, otherwise the node is disabled.\n\n @returns #hipSuccess, #hipErrorInvalidValue,\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphNodeSetEnabled(\n        hGraphExec: hipGraphExec_t,\n        hNode: hipGraphNode_t,\n        isEnabled: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Query whether a node in the given graphExec is enabled\n\n Sets isEnabled to 1 if hNode is enabled, or 0 if it is disabled.\n\n The node is identified by the corresponding node in the non-executable graph, from which the\n executable graph was instantiated.\n\n hNode must not have been removed from the original graph.\n\n @note Currently only kernel, memset and memcpy nodes are supported.\n\n @param [in]  hGraphExec - The executable graph in which to set the specified node.\n @param [in]  hNode      - Node from the graph from which graphExec was instantiated.\n @param [out] isEnabled  - Location to return the enabled status of the node.\n\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphNodeGetEnabled(\n        hGraphExec: hipGraphExec_t,\n        hNode: hipGraphNode_t,\n        isEnabled: *mut ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a external semaphor wait node and adds it to a graph.\n\n @param [out] pGraphNode - pointer to the graph node to create.\n @param [in] graph - instance of the graph to add the created node.\n @param [in] pDependencies - const pointer to the dependencies on the memset execution node.\n @param [in] numDependencies - the number of the dependencies.\n @param [in] nodeParams -pointer to the parameters.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphAddExternalSemaphoresWaitNode(\n        pGraphNode: *mut hipGraphNode_t,\n        graph: hipGraph_t,\n        pDependencies: *const hipGraphNode_t,\n        numDependencies: usize,\n        nodeParams: *const hipExternalSemaphoreWaitNodeParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a external semaphor signal node and adds it to a graph.\n\n @param [out] pGraphNode - pointer to the graph node to create.\n @param [in] graph - instance of the graph to add the created node.\n @param [in] pDependencies - const pointer to the dependencies on the memset execution node.\n @param [in] numDependencies - the number of the dependencies.\n @param [in] nodeParams -pointer to the parameters.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphAddExternalSemaphoresSignalNode(\n        pGraphNode: *mut hipGraphNode_t,\n        graph: hipGraph_t,\n        pDependencies: *const hipGraphNode_t,\n        numDependencies: usize,\n        nodeParams: *const hipExternalSemaphoreSignalNodeParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Updates node parameters in the external semaphore signal node.\n\n @param [in]  hNode      - Node from the graph from which graphExec was instantiated.\n @param [in]  nodeParams  - Pointer to the params to be set.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphExternalSemaphoresSignalNodeSetParams(\n        hNode: hipGraphNode_t,\n        nodeParams: *const hipExternalSemaphoreSignalNodeParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Updates node parameters in the external semaphore wait node.\n\n @param [in]  hNode      - Node from the graph from which graphExec was instantiated.\n @param [in]  nodeParams  - Pointer to the params to be set.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphExternalSemaphoresWaitNodeSetParams(\n        hNode: hipGraphNode_t,\n        nodeParams: *const hipExternalSemaphoreWaitNodeParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns external semaphore signal node params.\n\n @param [in]   hNode       - Node from the graph from which graphExec was instantiated.\n @param [out]  params_out  - Pointer to params.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphExternalSemaphoresSignalNodeGetParams(\n        hNode: hipGraphNode_t,\n        params_out: *mut hipExternalSemaphoreSignalNodeParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns external semaphore wait node params.\n\n @param [in]   hNode       - Node from the graph from which graphExec was instantiated.\n @param [out]  params_out  - Pointer to params.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphExternalSemaphoresWaitNodeGetParams(\n        hNode: hipGraphNode_t,\n        params_out: *mut hipExternalSemaphoreWaitNodeParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Updates node parameters in the external semaphore signal node in the given graphExec.\n\n @param [in]  hGraphExec - The executable graph in which to set the specified node.\n @param [in]  hNode      - Node from the graph from which graphExec was instantiated.\n @param [in]  nodeParams  - Pointer to the params to be set.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphExecExternalSemaphoresSignalNodeSetParams(\n        hGraphExec: hipGraphExec_t,\n        hNode: hipGraphNode_t,\n        nodeParams: *const hipExternalSemaphoreSignalNodeParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Updates node parameters in the external semaphore wait node in the given graphExec.\n\n @param [in]  hGraphExec - The executable graph in which to set the specified node.\n @param [in]  hNode      - Node from the graph from which graphExec was instantiated.\n @param [in]  nodeParams  - Pointer to the params to be set.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipGraphExecExternalSemaphoresWaitNodeSetParams(\n        hGraphExec: hipGraphExec_t,\n        hNode: hipGraphNode_t,\n        nodeParams: *const hipExternalSemaphoreWaitNodeParams,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets a memcpy node's parameters.\n\n @param [in] hNode - instance of the node to get parameters from.\n @param [out] nodeParams - pointer to the parameters.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipDrvGraphMemcpyNodeGetParams(\n        hNode: hipGraphNode_t,\n        nodeParams: *mut HIP_MEMCPY3D,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets a memcpy node's parameters.\n\n @param [in] hNode - instance of the node to Set parameters for.\n @param [out] nodeParams - pointer to the parameters.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipDrvGraphMemcpyNodeSetParams(\n        hNode: hipGraphNode_t,\n        nodeParams: *const HIP_MEMCPY3D,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a memory free node and adds it to a graph\n\n @param [out] phGraphNode - Pointer to the graph node to create and add to the graph\n @param [in]  hGraph - Instance of the graph the node to be added\n @param [in]  dependencies - Const pointer to the node dependencies\n @param [in]  numDependencies - The number of dependencies\n @param [in]  dptr - Pointer to the memory to be freed\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipDrvGraphAddMemFreeNode(\n        phGraphNode: *mut hipGraphNode_t,\n        hGraph: hipGraph_t,\n        dependencies: *const hipGraphNode_t,\n        numDependencies: usize,\n        dptr: hipDeviceptr_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets the parameters for a memcpy node in the given graphExec.\n\n @param [in] hGraphExec - instance of the executable graph with the node.\n @param [in] hNode - instance of the node to set parameters to.\n @param [in] copyParams - const pointer to the memcpy node params.\n @param [in] ctx - cotext related to current device.\n @returns #hipSuccess, #hipErrorInvalidValue\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.*/\n    pub fn hipDrvGraphExecMemcpyNodeSetParams(\n        hGraphExec: hipGraphExec_t,\n        hNode: hipGraphNode_t,\n        copyParams: *const HIP_MEMCPY3D,\n        ctx: hipCtx_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Frees an address range reservation made via hipMemAddressReserve\n\n @param [in] devPtr - starting address of the range.\n @param [in] size - size of the range.\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMemAddressFree(\n        devPtr: *mut ::core::ffi::c_void,\n        size: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Reserves an address range\n\n @param [out] ptr - starting address of the reserved range.\n @param [in] size - size of the reservation.\n @param [in] alignment - alignment of the address.\n @param [in] addr - requested starting address of the range.\n @param [in] flags - currently unused, must be zero.\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMemAddressReserve(\n        ptr: *mut *mut ::core::ffi::c_void,\n        size: usize,\n        alignment: usize,\n        addr: *mut ::core::ffi::c_void,\n        flags: ::core::ffi::c_ulonglong,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a memory allocation described by the properties and size\n\n @param [out] handle - value of the returned handle.\n @param [in] size - size of the allocation.\n @param [in] prop - properties of the allocation.\n @param [in] flags - currently unused, must be zero.\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMemCreate(\n        handle: *mut hipMemGenericAllocationHandle_t,\n        size: usize,\n        prop: *const hipMemAllocationProp,\n        flags: ::core::ffi::c_ulonglong,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Exports an allocation to a requested shareable handle type.\n\n @param [out] shareableHandle - value of the returned handle.\n @param [in] handle - handle to share.\n @param [in] handleType - type of the shareable handle.\n @param [in] flags - currently unused, must be zero.\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMemExportToShareableHandle(\n        shareableHandle: *mut ::core::ffi::c_void,\n        handle: hipMemGenericAllocationHandle_t,\n        handleType: hipMemAllocationHandleType,\n        flags: ::core::ffi::c_ulonglong,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get the access flags set for the given location and ptr.\n\n @param [out] flags - flags for this location.\n @param [in] location - target location.\n @param [in] ptr - address to check the access flags.\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMemGetAccess(\n        flags: *mut ::core::ffi::c_ulonglong,\n        location: *const hipMemLocation,\n        ptr: *mut ::core::ffi::c_void,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Calculates either the minimal or recommended granularity.\n\n @param [out] granularity - returned granularity.\n @param [in] prop - location properties.\n @param [in] option - determines which granularity to return.\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.\n*/\n    pub fn hipMemGetAllocationGranularity(\n        granularity: *mut usize,\n        prop: *const hipMemAllocationProp,\n        option: hipMemAllocationGranularity_flags,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Retrieve the property structure of the given handle.\n\n @param [out] prop - properties of the given handle.\n @param [in] handle - handle to perform the query on.\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMemGetAllocationPropertiesFromHandle(\n        prop: *mut hipMemAllocationProp,\n        handle: hipMemGenericAllocationHandle_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Imports an allocation from a requested shareable handle type.\n\n @param [out] handle - returned value.\n @param [in] osHandle - shareable handle representing the memory allocation.\n @param [in] shHandleType - handle type.\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMemImportFromShareableHandle(\n        handle: *mut hipMemGenericAllocationHandle_t,\n        osHandle: *mut ::core::ffi::c_void,\n        shHandleType: hipMemAllocationHandleType,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Maps an allocation handle to a reserved virtual address range.\n\n @param [in] ptr - address where the memory will be mapped.\n @param [in] size - size of the mapping.\n @param [in] offset - offset into the memory, currently must be zero.\n @param [in] handle - memory allocation to be mapped.\n @param [in] flags - currently unused, must be zero.\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMemMap(\n        ptr: *mut ::core::ffi::c_void,\n        size: usize,\n        offset: usize,\n        handle: hipMemGenericAllocationHandle_t,\n        flags: ::core::ffi::c_ulonglong,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Maps or unmaps subregions of sparse HIP arrays and sparse HIP mipmapped arrays.\n\n @param [in] mapInfoList - list of hipArrayMapInfo.\n @param [in] count - number of hipArrayMapInfo in mapInfoList.\n @param [in] stream - stream identifier for the stream to use for map or unmap operations.\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n @warning This API is under development. Currently it is not supported on AMD\n          GPUs and returns #hipErrorNotSupported.*/\n    pub fn hipMemMapArrayAsync(\n        mapInfoList: *mut hipArrayMapInfo,\n        count: ::core::ffi::c_uint,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Release a memory handle representing a memory allocation which was previously allocated through hipMemCreate.\n\n @param [in] handle - handle of the memory allocation.\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMemRelease(handle: hipMemGenericAllocationHandle_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns the allocation handle of the backing memory allocation given the address.\n\n @param [out] handle - handle representing addr.\n @param [in] addr - address to look up.\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMemRetainAllocationHandle(\n        handle: *mut hipMemGenericAllocationHandle_t,\n        addr: *mut ::core::ffi::c_void,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set the access flags for each location specified in desc for the given virtual address range.\n\n @param [in] ptr - starting address of the virtual address range.\n @param [in] size - size of the range.\n @param [in] desc - array of hipMemAccessDesc.\n @param [in] count - number of hipMemAccessDesc in desc.\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMemSetAccess(\n        ptr: *mut ::core::ffi::c_void,\n        size: usize,\n        desc: *const hipMemAccessDesc,\n        count: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Unmap memory allocation of a given address range.\n\n @param [in] ptr - starting address of the range to unmap.\n @param [in] size - size of the virtual address range.\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorNotSupported\n @warning This API is marked as Beta. While this feature is complete, it can\n          change and might have outstanding issues.\n\n @note  This API is implemented on Linux and is under development on Microsoft Windows.*/\n    pub fn hipMemUnmap(ptr: *mut ::core::ffi::c_void, size: usize) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Maps a graphics resource for access.\n\n @param [in] count - Number of resources to map.\n @param [in] resources - Pointer of resources to map.\n @param [in] stream - Stream for synchronization.\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorUnknown, #hipErrorInvalidResourceHandle\n*/\n    pub fn hipGraphicsMapResources(\n        count: ::core::ffi::c_int,\n        resources: *mut hipGraphicsResource_t,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get an array through which to access a subresource of a mapped graphics resource.\n\n @param [out] array - Pointer of array through which a subresource of resource may be accessed.\n @param [in] resource - Mapped resource to access.\n @param [in] arrayIndex - Array index for the subresource to access.\n @param [in] mipLevel - Mipmap level for the subresource to access.\n\n @returns #hipSuccess, #hipErrorInvalidValue\n\n @note  In this API, the value of arrayIndex higher than zero is currently not supported.\n*/\n    pub fn hipGraphicsSubResourceGetMappedArray(\n        array: *mut hipArray_t,\n        resource: hipGraphicsResource_t,\n        arrayIndex: ::core::ffi::c_uint,\n        mipLevel: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets device accessible address of a graphics resource.\n\n @param [out] devPtr - Pointer of device through which graphic resource may be accessed.\n @param [out] size - Size of the buffer accessible from devPtr.\n @param [in] resource - Mapped resource to access.\n\n @returns #hipSuccess, #hipErrorInvalidValue\n*/\n    pub fn hipGraphicsResourceGetMappedPointer(\n        devPtr: *mut *mut ::core::ffi::c_void,\n        size: *mut usize,\n        resource: hipGraphicsResource_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Unmaps graphics resources.\n\n @param [in] count - Number of resources to unmap.\n @param [in] resources - Pointer of resources to unmap.\n @param [in] stream - Stream for synchronization.\n\n @returns #hipSuccess, #hipErrorInvalidValue, #hipErrorUnknown, #hipErrorContextIsDestroyed\n*/\n    pub fn hipGraphicsUnmapResources(\n        count: ::core::ffi::c_int,\n        resources: *mut hipGraphicsResource_t,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Unregisters a graphics resource.\n\n @param [in] resource - Graphics resources to unregister.\n\n @returns #hipSuccess\n*/\n    pub fn hipGraphicsUnregisterResource(resource: hipGraphicsResource_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Create a surface object.\n\n @param [out] pSurfObject  Pointer of surface object to be created.\n @param [in] pResDesc  Pointer of suface object descriptor.\n\n @returns #hipSuccess, #hipErrorInvalidValue\n*/\n    pub fn hipCreateSurfaceObject(\n        pSurfObject: *mut hipSurfaceObject_t,\n        pResDesc: *const hipResourceDesc,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Destroy a surface object.\n\n @param [in] surfaceObject  Surface object to be destroyed.\n\n @returns #hipSuccess, #hipErrorInvalidValue*/\n    pub fn hipDestroySurfaceObject(surfaceObject: hipSurfaceObject_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipMemcpy_spt(\n        dst: *mut ::core::ffi::c_void,\n        src: *const ::core::ffi::c_void,\n        sizeBytes: usize,\n        kind: hipMemcpyKind,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipMemcpyToSymbol_spt(\n        symbol: *const ::core::ffi::c_void,\n        src: *const ::core::ffi::c_void,\n        sizeBytes: usize,\n        offset: usize,\n        kind: hipMemcpyKind,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipMemcpyFromSymbol_spt(\n        dst: *mut ::core::ffi::c_void,\n        symbol: *const ::core::ffi::c_void,\n        sizeBytes: usize,\n        offset: usize,\n        kind: hipMemcpyKind,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipMemcpy2D_spt(\n        dst: *mut ::core::ffi::c_void,\n        dpitch: usize,\n        src: *const ::core::ffi::c_void,\n        spitch: usize,\n        width: usize,\n        height: usize,\n        kind: hipMemcpyKind,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipMemcpy2DFromArray_spt(\n        dst: *mut ::core::ffi::c_void,\n        dpitch: usize,\n        src: hipArray_const_t,\n        wOffset: usize,\n        hOffset: usize,\n        width: usize,\n        height: usize,\n        kind: hipMemcpyKind,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipMemcpy3D_spt(p: *const hipMemcpy3DParms) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipMemset_spt(\n        dst: *mut ::core::ffi::c_void,\n        value: ::core::ffi::c_int,\n        sizeBytes: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipMemsetAsync_spt(\n        dst: *mut ::core::ffi::c_void,\n        value: ::core::ffi::c_int,\n        sizeBytes: usize,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipMemset2D_spt(\n        dst: *mut ::core::ffi::c_void,\n        pitch: usize,\n        value: ::core::ffi::c_int,\n        width: usize,\n        height: usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipMemset2DAsync_spt(\n        dst: *mut ::core::ffi::c_void,\n        pitch: usize,\n        value: ::core::ffi::c_int,\n        width: usize,\n        height: usize,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipMemset3DAsync_spt(\n        pitchedDevPtr: hipPitchedPtr,\n        value: ::core::ffi::c_int,\n        extent: hipExtent,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipMemset3D_spt(\n        pitchedDevPtr: hipPitchedPtr,\n        value: ::core::ffi::c_int,\n        extent: hipExtent,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipMemcpyAsync_spt(\n        dst: *mut ::core::ffi::c_void,\n        src: *const ::core::ffi::c_void,\n        sizeBytes: usize,\n        kind: hipMemcpyKind,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipMemcpy3DAsync_spt(\n        p: *const hipMemcpy3DParms,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipMemcpy2DAsync_spt(\n        dst: *mut ::core::ffi::c_void,\n        dpitch: usize,\n        src: *const ::core::ffi::c_void,\n        spitch: usize,\n        width: usize,\n        height: usize,\n        kind: hipMemcpyKind,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipMemcpyFromSymbolAsync_spt(\n        dst: *mut ::core::ffi::c_void,\n        symbol: *const ::core::ffi::c_void,\n        sizeBytes: usize,\n        offset: usize,\n        kind: hipMemcpyKind,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipMemcpyToSymbolAsync_spt(\n        symbol: *const ::core::ffi::c_void,\n        src: *const ::core::ffi::c_void,\n        sizeBytes: usize,\n        offset: usize,\n        kind: hipMemcpyKind,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipMemcpyFromArray_spt(\n        dst: *mut ::core::ffi::c_void,\n        src: hipArray_const_t,\n        wOffsetSrc: usize,\n        hOffset: usize,\n        count: usize,\n        kind: hipMemcpyKind,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipMemcpy2DToArray_spt(\n        dst: hipArray_t,\n        wOffset: usize,\n        hOffset: usize,\n        src: *const ::core::ffi::c_void,\n        spitch: usize,\n        width: usize,\n        height: usize,\n        kind: hipMemcpyKind,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipMemcpy2DFromArrayAsync_spt(\n        dst: *mut ::core::ffi::c_void,\n        dpitch: usize,\n        src: hipArray_const_t,\n        wOffsetSrc: usize,\n        hOffsetSrc: usize,\n        width: usize,\n        height: usize,\n        kind: hipMemcpyKind,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipMemcpy2DToArrayAsync_spt(\n        dst: hipArray_t,\n        wOffset: usize,\n        hOffset: usize,\n        src: *const ::core::ffi::c_void,\n        spitch: usize,\n        width: usize,\n        height: usize,\n        kind: hipMemcpyKind,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipStreamQuery_spt(stream: hipStream_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipStreamSynchronize_spt(stream: hipStream_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipStreamGetPriority_spt(\n        stream: hipStream_t,\n        priority: *mut ::core::ffi::c_int,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipStreamWaitEvent_spt(\n        stream: hipStream_t,\n        event: hipEvent_t,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipStreamGetFlags_spt(\n        stream: hipStream_t,\n        flags: *mut ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipStreamAddCallback_spt(\n        stream: hipStream_t,\n        callback: hipStreamCallback_t,\n        userData: *mut ::core::ffi::c_void,\n        flags: ::core::ffi::c_uint,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipEventRecord_spt(event: hipEvent_t, stream: hipStream_t) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipLaunchCooperativeKernel_spt(\n        f: *const ::core::ffi::c_void,\n        gridDim: dim3,\n        blockDim: dim3,\n        kernelParams: *mut *mut ::core::ffi::c_void,\n        sharedMemBytes: u32,\n        hStream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipLaunchKernel_spt(\n        function_address: *const ::core::ffi::c_void,\n        numBlocks: dim3,\n        dimBlocks: dim3,\n        args: *mut *mut ::core::ffi::c_void,\n        sharedMemBytes: usize,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipGraphLaunch_spt(\n        graphExec: hipGraphExec_t,\n        stream: hipStream_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipStreamBeginCapture_spt(\n        stream: hipStream_t,\n        mode: hipStreamCaptureMode,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipStreamEndCapture_spt(\n        stream: hipStream_t,\n        pGraph: *mut hipGraph_t,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipStreamIsCapturing_spt(\n        stream: hipStream_t,\n        pCaptureStatus: *mut hipStreamCaptureStatus,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipStreamGetCaptureInfo_spt(\n        stream: hipStream_t,\n        pCaptureStatus: *mut hipStreamCaptureStatus,\n        pId: *mut ::core::ffi::c_ulonglong,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipStreamGetCaptureInfo_v2_spt(\n        stream: hipStream_t,\n        captureStatus_out: *mut hipStreamCaptureStatus,\n        id_out: *mut ::core::ffi::c_ulonglong,\n        graph_out: *mut hipGraph_t,\n        dependencies_out: *mut *const hipGraphNode_t,\n        numDependencies_out: *mut usize,\n    ) -> hipError_t;\n}\n#[cfg_attr(windows, link(name = \"amdhip64_7\", kind = \"raw-dylib\"))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipLaunchHostFunc_spt(\n        stream: hipStream_t,\n        fn_: hipHostFn_t,\n        userData: *mut ::core::ffi::c_void,\n    ) -> hipError_t;\n}\nimpl hipErrorCode_t {\n    pub const r#InvalidValue: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(1)\n    });\n    pub const r#OutOfMemory: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(2)\n    });\n    pub const r#MemoryAllocation: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(2)\n    });\n    pub const r#NotInitialized: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3)\n    });\n    pub const r#InitializationError: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3)\n    });\n    pub const r#Deinitialized: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(4)\n    });\n    pub const r#ProfilerDisabled: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(5)\n    });\n    pub const r#ProfilerNotInitialized: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(6)\n    });\n    pub const r#ProfilerAlreadyStarted: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(7)\n    });\n    pub const r#ProfilerAlreadyStopped: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(8)\n    });\n    pub const r#InvalidConfiguration: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(9)\n    });\n    pub const r#InvalidPitchValue: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(12)\n    });\n    pub const r#InvalidSymbol: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(13)\n    });\n    pub const r#InvalidDevicePointer: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(17)\n    });\n    pub const r#InvalidMemcpyDirection: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(21)\n    });\n    pub const r#InsufficientDriver: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(35)\n    });\n    pub const r#MissingConfiguration: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(52)\n    });\n    pub const r#PriorLaunchFailure: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(53)\n    });\n    pub const r#InvalidDeviceFunction: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(98)\n    });\n    pub const r#NoDevice: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(100)\n    });\n    pub const r#InvalidDevice: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(101)\n    });\n    pub const r#InvalidImage: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(200)\n    });\n    pub const r#InvalidContext: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(201)\n    });\n    pub const r#ContextAlreadyCurrent: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(202)\n    });\n    pub const r#MapFailed: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(205)\n    });\n    pub const r#MapBufferObjectFailed: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(205)\n    });\n    pub const r#UnmapFailed: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(206)\n    });\n    pub const r#ArrayIsMapped: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(207)\n    });\n    pub const r#AlreadyMapped: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(208)\n    });\n    pub const r#NoBinaryForGpu: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(209)\n    });\n    pub const r#AlreadyAcquired: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(210)\n    });\n    pub const r#NotMapped: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(211)\n    });\n    pub const r#NotMappedAsArray: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(212)\n    });\n    pub const r#NotMappedAsPointer: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(213)\n    });\n    pub const r#ECCNotCorrectable: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(214)\n    });\n    pub const r#UnsupportedLimit: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(215)\n    });\n    pub const r#ContextAlreadyInUse: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(216)\n    });\n    pub const r#PeerAccessUnsupported: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(217)\n    });\n    pub const r#InvalidKernelFile: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(218)\n    });\n    pub const r#InvalidGraphicsContext: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(219)\n    });\n    pub const r#InvalidSource: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(300)\n    });\n    pub const r#FileNotFound: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(301)\n    });\n    pub const r#SharedObjectSymbolNotFound: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(302)\n    });\n    pub const r#SharedObjectInitFailed: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(303)\n    });\n    pub const r#OperatingSystem: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(304)\n    });\n    pub const r#InvalidHandle: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(400)\n    });\n    pub const r#InvalidResourceHandle: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(400)\n    });\n    pub const r#IllegalState: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(401)\n    });\n    pub const r#NotFound: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(500)\n    });\n    pub const r#NotReady: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(600)\n    });\n    pub const r#IllegalAddress: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(700)\n    });\n    pub const r#LaunchOutOfResources: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(701)\n    });\n    pub const r#LaunchTimeOut: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(702)\n    });\n    pub const r#PeerAccessAlreadyEnabled: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(704)\n    });\n    pub const r#PeerAccessNotEnabled: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(705)\n    });\n    pub const r#SetOnActiveProcess: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(708)\n    });\n    pub const r#ContextIsDestroyed: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(709)\n    });\n    pub const r#Assert: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(710)\n    });\n    pub const r#HostMemoryAlreadyRegistered: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(712)\n    });\n    pub const r#HostMemoryNotRegistered: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(713)\n    });\n    pub const r#LaunchFailure: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(719)\n    });\n    pub const r#CooperativeLaunchTooLarge: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(720)\n    });\n    pub const r#NotSupported: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(801)\n    });\n    pub const r#StreamCaptureUnsupported: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(900)\n    });\n    pub const r#StreamCaptureInvalidated: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(901)\n    });\n    pub const r#StreamCaptureMerge: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(902)\n    });\n    pub const r#StreamCaptureUnmatched: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(903)\n    });\n    pub const r#StreamCaptureUnjoined: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(904)\n    });\n    pub const r#StreamCaptureIsolation: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(905)\n    });\n    pub const r#StreamCaptureImplicit: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(906)\n    });\n    pub const r#CapturedEvent: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(907)\n    });\n    pub const r#StreamCaptureWrongThread: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(908)\n    });\n    pub const r#GraphExecUpdateFailure: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(910)\n    });\n    pub const r#InvalidChannelDescriptor: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(911)\n    });\n    pub const r#InvalidTexture: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(912)\n    });\n    pub const r#Unknown: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(999)\n    });\n    pub const r#RuntimeMemory: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(1052)\n    });\n    pub const r#RuntimeOther: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(1053)\n    });\n    pub const r#Tbd: hipErrorCode_t = hipErrorCode_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(1054)\n    });\n}\n#[repr(transparent)]\n#[derive(Debug, Hash, Copy, Clone, PartialEq, Eq)]\npub struct hipErrorCode_t(pub ::core::num::NonZeroU32);\npub trait hipError_tConsts {\n    const Success: hipError_t = hipError_t::Ok(());\n    const ErrorInvalidValue: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#InvalidValue,\n    );\n    const ErrorOutOfMemory: hipError_t = hipError_t::Err(hipErrorCode_t::r#OutOfMemory);\n    const ErrorMemoryAllocation: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#MemoryAllocation,\n    );\n    const ErrorNotInitialized: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#NotInitialized,\n    );\n    const ErrorInitializationError: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#InitializationError,\n    );\n    const ErrorDeinitialized: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#Deinitialized,\n    );\n    const ErrorProfilerDisabled: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#ProfilerDisabled,\n    );\n    const ErrorProfilerNotInitialized: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#ProfilerNotInitialized,\n    );\n    const ErrorProfilerAlreadyStarted: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#ProfilerAlreadyStarted,\n    );\n    const ErrorProfilerAlreadyStopped: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#ProfilerAlreadyStopped,\n    );\n    const ErrorInvalidConfiguration: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#InvalidConfiguration,\n    );\n    const ErrorInvalidPitchValue: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#InvalidPitchValue,\n    );\n    const ErrorInvalidSymbol: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#InvalidSymbol,\n    );\n    const ErrorInvalidDevicePointer: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#InvalidDevicePointer,\n    );\n    const ErrorInvalidMemcpyDirection: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#InvalidMemcpyDirection,\n    );\n    const ErrorInsufficientDriver: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#InsufficientDriver,\n    );\n    const ErrorMissingConfiguration: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#MissingConfiguration,\n    );\n    const ErrorPriorLaunchFailure: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#PriorLaunchFailure,\n    );\n    const ErrorInvalidDeviceFunction: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#InvalidDeviceFunction,\n    );\n    const ErrorNoDevice: hipError_t = hipError_t::Err(hipErrorCode_t::r#NoDevice);\n    const ErrorInvalidDevice: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#InvalidDevice,\n    );\n    const ErrorInvalidImage: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#InvalidImage,\n    );\n    const ErrorInvalidContext: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#InvalidContext,\n    );\n    const ErrorContextAlreadyCurrent: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#ContextAlreadyCurrent,\n    );\n    const ErrorMapFailed: hipError_t = hipError_t::Err(hipErrorCode_t::r#MapFailed);\n    const ErrorMapBufferObjectFailed: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#MapBufferObjectFailed,\n    );\n    const ErrorUnmapFailed: hipError_t = hipError_t::Err(hipErrorCode_t::r#UnmapFailed);\n    const ErrorArrayIsMapped: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#ArrayIsMapped,\n    );\n    const ErrorAlreadyMapped: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#AlreadyMapped,\n    );\n    const ErrorNoBinaryForGpu: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#NoBinaryForGpu,\n    );\n    const ErrorAlreadyAcquired: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#AlreadyAcquired,\n    );\n    const ErrorNotMapped: hipError_t = hipError_t::Err(hipErrorCode_t::r#NotMapped);\n    const ErrorNotMappedAsArray: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#NotMappedAsArray,\n    );\n    const ErrorNotMappedAsPointer: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#NotMappedAsPointer,\n    );\n    const ErrorECCNotCorrectable: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#ECCNotCorrectable,\n    );\n    const ErrorUnsupportedLimit: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#UnsupportedLimit,\n    );\n    const ErrorContextAlreadyInUse: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#ContextAlreadyInUse,\n    );\n    const ErrorPeerAccessUnsupported: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#PeerAccessUnsupported,\n    );\n    const ErrorInvalidKernelFile: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#InvalidKernelFile,\n    );\n    const ErrorInvalidGraphicsContext: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#InvalidGraphicsContext,\n    );\n    const ErrorInvalidSource: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#InvalidSource,\n    );\n    const ErrorFileNotFound: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#FileNotFound,\n    );\n    const ErrorSharedObjectSymbolNotFound: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#SharedObjectSymbolNotFound,\n    );\n    const ErrorSharedObjectInitFailed: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#SharedObjectInitFailed,\n    );\n    const ErrorOperatingSystem: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#OperatingSystem,\n    );\n    const ErrorInvalidHandle: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#InvalidHandle,\n    );\n    const ErrorInvalidResourceHandle: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#InvalidResourceHandle,\n    );\n    const ErrorIllegalState: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#IllegalState,\n    );\n    const ErrorNotFound: hipError_t = hipError_t::Err(hipErrorCode_t::r#NotFound);\n    const ErrorNotReady: hipError_t = hipError_t::Err(hipErrorCode_t::r#NotReady);\n    const ErrorIllegalAddress: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#IllegalAddress,\n    );\n    const ErrorLaunchOutOfResources: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#LaunchOutOfResources,\n    );\n    const ErrorLaunchTimeOut: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#LaunchTimeOut,\n    );\n    const ErrorPeerAccessAlreadyEnabled: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#PeerAccessAlreadyEnabled,\n    );\n    const ErrorPeerAccessNotEnabled: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#PeerAccessNotEnabled,\n    );\n    const ErrorSetOnActiveProcess: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#SetOnActiveProcess,\n    );\n    const ErrorContextIsDestroyed: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#ContextIsDestroyed,\n    );\n    const ErrorAssert: hipError_t = hipError_t::Err(hipErrorCode_t::r#Assert);\n    const ErrorHostMemoryAlreadyRegistered: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#HostMemoryAlreadyRegistered,\n    );\n    const ErrorHostMemoryNotRegistered: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#HostMemoryNotRegistered,\n    );\n    const ErrorLaunchFailure: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#LaunchFailure,\n    );\n    const ErrorCooperativeLaunchTooLarge: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#CooperativeLaunchTooLarge,\n    );\n    const ErrorNotSupported: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#NotSupported,\n    );\n    const ErrorStreamCaptureUnsupported: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#StreamCaptureUnsupported,\n    );\n    const ErrorStreamCaptureInvalidated: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#StreamCaptureInvalidated,\n    );\n    const ErrorStreamCaptureMerge: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#StreamCaptureMerge,\n    );\n    const ErrorStreamCaptureUnmatched: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#StreamCaptureUnmatched,\n    );\n    const ErrorStreamCaptureUnjoined: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#StreamCaptureUnjoined,\n    );\n    const ErrorStreamCaptureIsolation: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#StreamCaptureIsolation,\n    );\n    const ErrorStreamCaptureImplicit: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#StreamCaptureImplicit,\n    );\n    const ErrorCapturedEvent: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#CapturedEvent,\n    );\n    const ErrorStreamCaptureWrongThread: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#StreamCaptureWrongThread,\n    );\n    const ErrorGraphExecUpdateFailure: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#GraphExecUpdateFailure,\n    );\n    const ErrorInvalidChannelDescriptor: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#InvalidChannelDescriptor,\n    );\n    const ErrorInvalidTexture: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#InvalidTexture,\n    );\n    const ErrorUnknown: hipError_t = hipError_t::Err(hipErrorCode_t::r#Unknown);\n    const ErrorRuntimeMemory: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#RuntimeMemory,\n    );\n    const ErrorRuntimeOther: hipError_t = hipError_t::Err(\n        hipErrorCode_t::r#RuntimeOther,\n    );\n    const ErrorTbd: hipError_t = hipError_t::Err(hipErrorCode_t::r#Tbd);\n}\nimpl hipError_tConsts for hipError_t {}\n#[must_use]\npub type hipError_t = ::core::result::Result<(), hipErrorCode_t>;\nconst _: fn() = || {\n    let _ = std::mem::transmute::<hipError_t, u32>;\n};\nunsafe impl Send for hipDeviceptr_t {}\nunsafe impl Sync for hipDeviceptr_t {}\nunsafe impl Send for hipStream_t {}\nunsafe impl Sync for hipStream_t {}\nunsafe impl Send for hipModule_t {}\nunsafe impl Sync for hipModule_t {}\nunsafe impl Send for hipFunction_t {}\nunsafe impl Sync for hipFunction_t {}\n"
  },
  {
    "path": "ext/hipblaslt-sys/.rustfmt.toml",
    "content": "disable_all_formatting = true\n"
  },
  {
    "path": "ext/hipblaslt-sys/Cargo.toml",
    "content": "[package]\nname = \"hipblaslt-sys\"\nversion = \"0.1.0\"\nauthors = [\"Violet <c01368481@gmail.com>\"]\nedition = \"2021\"\n\n[lib]\n\n[dependencies]\nhip_runtime-sys = { version = \"0.0.0\", path = \"../hip_runtime-sys\" }\n"
  },
  {
    "path": "ext/hipblaslt-sys/build.rs",
    "content": "use std::env::VarError;\n\nfn main() -> Result<(), VarError> {\n    if !cfg!(windows) {\n        println!(\"cargo:rustc-link-lib=dylib=hipblaslt\");\n        println!(\"cargo:rustc-link-search=native=/opt/rocm/lib/\");\n    }\n    Ok(())\n}\n"
  },
  {
    "path": "ext/hipblaslt-sys/src/lib.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\nimpl hipblasOperation_t {\n    ///<  Operate with the matrix.\n    pub const HIPBLAS_OP_N: hipblasOperation_t = hipblasOperation_t(111);\n}\nimpl hipblasOperation_t {\n    ///<  Operate with the transpose of the matrix.\n    pub const HIPBLAS_OP_T: hipblasOperation_t = hipblasOperation_t(112);\n}\nimpl hipblasOperation_t {\n    ///< Operate with the conjugate transpose of the matrix.\n    pub const HIPBLAS_OP_C: hipblasOperation_t = hipblasOperation_t(113);\n}\n#[repr(transparent)]\n/// \\brief Used to specify whether the matrix is to be transposed or not.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipblasOperation_t(pub ::core::ffi::c_uint);\nimpl hipblasComputeType_t {\n    ///< compute will be at least 16-bit precision\n    pub const HIPBLAS_COMPUTE_16F: hipblasComputeType_t = hipblasComputeType_t(0);\n}\nimpl hipblasComputeType_t {\n    ///< compute will be exactly 16-bit precision\n    pub const HIPBLAS_COMPUTE_16F_PEDANTIC: hipblasComputeType_t = hipblasComputeType_t(\n        1,\n    );\n}\nimpl hipblasComputeType_t {\n    ///< compute will be at least 32-bit precision\n    pub const HIPBLAS_COMPUTE_32F: hipblasComputeType_t = hipblasComputeType_t(2);\n}\nimpl hipblasComputeType_t {\n    ///< compute will be exactly 32-bit precision\n    pub const HIPBLAS_COMPUTE_32F_PEDANTIC: hipblasComputeType_t = hipblasComputeType_t(\n        3,\n    );\n}\nimpl hipblasComputeType_t {\n    ///< 32-bit input can use 16-bit compute\n    pub const HIPBLAS_COMPUTE_32F_FAST_16F: hipblasComputeType_t = hipblasComputeType_t(\n        4,\n    );\n}\nimpl hipblasComputeType_t {\n    ///< 32-bit input can is bf16 compute\n    pub const HIPBLAS_COMPUTE_32F_FAST_16BF: hipblasComputeType_t = hipblasComputeType_t(\n        5,\n    );\n}\nimpl hipblasComputeType_t {\n    pub const HIPBLAS_COMPUTE_32F_FAST_TF32: hipblasComputeType_t = hipblasComputeType_t(\n        6,\n    );\n}\nimpl hipblasComputeType_t {\n    ///< compute will be at least 64-bit precision\n    pub const HIPBLAS_COMPUTE_64F: hipblasComputeType_t = hipblasComputeType_t(7);\n}\nimpl hipblasComputeType_t {\n    ///< compute will be exactly 64-bit precision\n    pub const HIPBLAS_COMPUTE_64F_PEDANTIC: hipblasComputeType_t = hipblasComputeType_t(\n        8,\n    );\n}\nimpl hipblasComputeType_t {\n    ///< compute will be at least 32-bit integer precision\n    pub const HIPBLAS_COMPUTE_32I: hipblasComputeType_t = hipblasComputeType_t(9);\n}\nimpl hipblasComputeType_t {\n    ///< compute will be exactly 32-bit integer precision\n    pub const HIPBLAS_COMPUTE_32I_PEDANTIC: hipblasComputeType_t = hipblasComputeType_t(\n        10,\n    );\n}\n#[repr(transparent)]\n/** \\brief The compute type to be used. Currently only used with GemmEx with the HIPBLAS_V2 interface.\n         Note that support for compute types is largely dependent on backend.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipblasComputeType_t(pub ::core::ffi::c_uint);\n/// \\brief Struct to represent a 16 bit brain floating point number.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hip_bfloat16 {\n    pub data: u16,\n}\nimpl hipDataType {\n    pub const HIP_R_32F: hipDataType = hipDataType(0);\n}\nimpl hipDataType {\n    pub const HIP_R_64F: hipDataType = hipDataType(1);\n}\nimpl hipDataType {\n    pub const HIP_R_16F: hipDataType = hipDataType(2);\n}\nimpl hipDataType {\n    pub const HIP_R_8I: hipDataType = hipDataType(3);\n}\nimpl hipDataType {\n    pub const HIP_C_32F: hipDataType = hipDataType(4);\n}\nimpl hipDataType {\n    pub const HIP_C_64F: hipDataType = hipDataType(5);\n}\nimpl hipDataType {\n    pub const HIP_C_16F: hipDataType = hipDataType(6);\n}\nimpl hipDataType {\n    pub const HIP_C_8I: hipDataType = hipDataType(7);\n}\nimpl hipDataType {\n    pub const HIP_R_8U: hipDataType = hipDataType(8);\n}\nimpl hipDataType {\n    pub const HIP_C_8U: hipDataType = hipDataType(9);\n}\nimpl hipDataType {\n    pub const HIP_R_32I: hipDataType = hipDataType(10);\n}\nimpl hipDataType {\n    pub const HIP_C_32I: hipDataType = hipDataType(11);\n}\nimpl hipDataType {\n    pub const HIP_R_32U: hipDataType = hipDataType(12);\n}\nimpl hipDataType {\n    pub const HIP_C_32U: hipDataType = hipDataType(13);\n}\nimpl hipDataType {\n    pub const HIP_R_16BF: hipDataType = hipDataType(14);\n}\nimpl hipDataType {\n    pub const HIP_C_16BF: hipDataType = hipDataType(15);\n}\nimpl hipDataType {\n    pub const HIP_R_4I: hipDataType = hipDataType(16);\n}\nimpl hipDataType {\n    pub const HIP_C_4I: hipDataType = hipDataType(17);\n}\nimpl hipDataType {\n    pub const HIP_R_4U: hipDataType = hipDataType(18);\n}\nimpl hipDataType {\n    pub const HIP_C_4U: hipDataType = hipDataType(19);\n}\nimpl hipDataType {\n    pub const HIP_R_16I: hipDataType = hipDataType(20);\n}\nimpl hipDataType {\n    pub const HIP_C_16I: hipDataType = hipDataType(21);\n}\nimpl hipDataType {\n    pub const HIP_R_16U: hipDataType = hipDataType(22);\n}\nimpl hipDataType {\n    pub const HIP_C_16U: hipDataType = hipDataType(23);\n}\nimpl hipDataType {\n    pub const HIP_R_64I: hipDataType = hipDataType(24);\n}\nimpl hipDataType {\n    pub const HIP_C_64I: hipDataType = hipDataType(25);\n}\nimpl hipDataType {\n    pub const HIP_R_64U: hipDataType = hipDataType(26);\n}\nimpl hipDataType {\n    pub const HIP_C_64U: hipDataType = hipDataType(27);\n}\nimpl hipDataType {\n    pub const HIP_R_8F_E4M3: hipDataType = hipDataType(28);\n}\nimpl hipDataType {\n    pub const HIP_R_8F_E5M2: hipDataType = hipDataType(29);\n}\nimpl hipDataType {\n    pub const HIP_R_8F_E4M3_FNUZ: hipDataType = hipDataType(1000);\n}\nimpl hipDataType {\n    pub const HIP_R_8F_E5M2_FNUZ: hipDataType = hipDataType(1001);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipDataType(pub ::core::ffi::c_uint);\n/// \\brief Single precision floating point type\npub type hipblasLtFloat = f32;\n/// \\brief Structure definition for hipblasLtHalf\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct _hipblasLtHalf {\n    pub data: u16,\n}\n/// \\brief Structure definition for hipblasLtHalf\npub type hipblasLtHalf = _hipblasLtHalf;\n/// \\brief Struct to represent a 16 bit brain floating point number.\npub type hipblasLtBfloat16 = hip_bfloat16;\npub type hipblasLtInt8 = i8;\npub type hipblasLtInt32 = i32;\nimpl hipblasLtEpilogue_t {\n    ///<No special postprocessing, just scale and quantize the results if necessary.\n    pub const HIPBLASLT_EPILOGUE_DEFAULT: hipblasLtEpilogue_t = hipblasLtEpilogue_t(1);\n}\nimpl hipblasLtEpilogue_t {\n    ///<Apply ReLU point-wise transform to the results:(x:=max(x, 0))\n    pub const HIPBLASLT_EPILOGUE_RELU: hipblasLtEpilogue_t = hipblasLtEpilogue_t(2);\n}\nimpl hipblasLtEpilogue_t {\n    ///<Apply (broadcast) bias from the bias vector. Bias vector length must match matrix D rows, and it must be packed (such as stride between vector elements is 1). Bias vector is broadcast to all columns and added before applying the final postprocessing.\n    pub const HIPBLASLT_EPILOGUE_BIAS: hipblasLtEpilogue_t = hipblasLtEpilogue_t(4);\n}\nimpl hipblasLtEpilogue_t {\n    ///<Apply bias and then ReLU transform.\n    pub const HIPBLASLT_EPILOGUE_RELU_BIAS: hipblasLtEpilogue_t = hipblasLtEpilogue_t(6);\n}\nimpl hipblasLtEpilogue_t {\n    ///<Apply GELU point-wise transform to the results (x:=GELU(x)).\n    pub const HIPBLASLT_EPILOGUE_GELU: hipblasLtEpilogue_t = hipblasLtEpilogue_t(32);\n}\nimpl hipblasLtEpilogue_t {\n    ///<Apply Bias and then GELU transform.\n    pub const HIPBLASLT_EPILOGUE_GELU_BIAS: hipblasLtEpilogue_t = hipblasLtEpilogue_t(\n        36,\n    );\n}\nimpl hipblasLtEpilogue_t {\n    ///<Output GEMM results before applying GELU transform.\n    pub const HIPBLASLT_EPILOGUE_GELU_AUX: hipblasLtEpilogue_t = hipblasLtEpilogue_t(\n        160,\n    );\n}\nimpl hipblasLtEpilogue_t {\n    ///<Output GEMM results after applying bias but before applying GELU transform.\n    pub const HIPBLASLT_EPILOGUE_GELU_AUX_BIAS: hipblasLtEpilogue_t = hipblasLtEpilogue_t(\n        164,\n    );\n}\nimpl hipblasLtEpilogue_t {\n    ///<Apply gradient GELU transform. Requires additional aux input.\n    pub const HIPBLASLT_EPILOGUE_DGELU: hipblasLtEpilogue_t = hipblasLtEpilogue_t(192);\n}\nimpl hipblasLtEpilogue_t {\n    ///<Apply gradient GELU transform and bias gradient to the results. Requires additional aux input.\n    pub const HIPBLASLT_EPILOGUE_DGELU_BGRAD: hipblasLtEpilogue_t = hipblasLtEpilogue_t(\n        208,\n    );\n}\nimpl hipblasLtEpilogue_t {\n    ///<Apply bias gradient to A and output gemm result.\n    pub const HIPBLASLT_EPILOGUE_BGRADA: hipblasLtEpilogue_t = hipblasLtEpilogue_t(256);\n}\nimpl hipblasLtEpilogue_t {\n    ///<Apply bias gradient to B and output gemm result.\n    pub const HIPBLASLT_EPILOGUE_BGRADB: hipblasLtEpilogue_t = hipblasLtEpilogue_t(512);\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief Specify the enum type to set the postprocessing options for the epilogue.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipblasLtEpilogue_t(pub ::core::ffi::c_uint);\nimpl hipblasLtMatrixLayoutAttribute_t {\n    ///<Number of batch of this matrix. Default value is 1. Data Type: int32_t\n    pub const HIPBLASLT_MATRIX_LAYOUT_BATCH_COUNT: hipblasLtMatrixLayoutAttribute_t = hipblasLtMatrixLayoutAttribute_t(\n        0,\n    );\n}\nimpl hipblasLtMatrixLayoutAttribute_t {\n    ///<Stride (in elements) to the next matrix for the strided batch operation. Default value is 0. Data Type: int64_t\n    pub const HIPBLASLT_MATRIX_LAYOUT_STRIDED_BATCH_OFFSET: hipblasLtMatrixLayoutAttribute_t = hipblasLtMatrixLayoutAttribute_t(\n        1,\n    );\n}\nimpl hipblasLtMatrixLayoutAttribute_t {\n    /** Data type, see hipDataType.\n\n uint32_t*/\n    pub const HIPBLASLT_MATRIX_LAYOUT_TYPE: hipblasLtMatrixLayoutAttribute_t = hipblasLtMatrixLayoutAttribute_t(\n        2,\n    );\n}\nimpl hipblasLtMatrixLayoutAttribute_t {\n    /** Memory order of the data, see hipblasLtOrder_t.\n\n int32_t, default: HIPBLASLT_ORDER_COL*/\n    pub const HIPBLASLT_MATRIX_LAYOUT_ORDER: hipblasLtMatrixLayoutAttribute_t = hipblasLtMatrixLayoutAttribute_t(\n        3,\n    );\n}\nimpl hipblasLtMatrixLayoutAttribute_t {\n    /** Number of rows.\n\n Usually only values that can be expressed as int32_t are supported.\n\n uint64_t*/\n    pub const HIPBLASLT_MATRIX_LAYOUT_ROWS: hipblasLtMatrixLayoutAttribute_t = hipblasLtMatrixLayoutAttribute_t(\n        4,\n    );\n}\nimpl hipblasLtMatrixLayoutAttribute_t {\n    /** Number of columns.\n\n Usually only values that can be expressed as int32_t are supported.\n\n uint64_t*/\n    pub const HIPBLASLT_MATRIX_LAYOUT_COLS: hipblasLtMatrixLayoutAttribute_t = hipblasLtMatrixLayoutAttribute_t(\n        5,\n    );\n}\nimpl hipblasLtMatrixLayoutAttribute_t {\n    /** Matrix leading dimension.\n\n For HIPBLASLT_ORDER_COL this is stride (in elements) of matrix column, for more details and documentation for\n other memory orders see documentation for hipblasLtOrder_t values.\n\n Currently only non-negative values are supported, must be large enough so that matrix memory locations are not\n overlapping (e.g. greater or equal to HIPBLASLT_MATRIX_LAYOUT_ROWS in case of HIPBLASLT_ORDER_COL).\n\n int64_t;*/\n    pub const HIPBLASLT_MATRIX_LAYOUT_LD: hipblasLtMatrixLayoutAttribute_t = hipblasLtMatrixLayoutAttribute_t(\n        6,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief Specify the attributes that define the details of the matrix.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipblasLtMatrixLayoutAttribute_t(pub ::core::ffi::c_uint);\nimpl hipblasLtPointerMode_t {\n    pub const HIPBLASLT_POINTER_MODE_HOST: hipblasLtPointerMode_t = hipblasLtPointerMode_t(\n        0,\n    );\n}\nimpl hipblasLtPointerMode_t {\n    /// targets host memory\n    pub const HIPBLASLT_POINTER_MODE_DEVICE: hipblasLtPointerMode_t = hipblasLtPointerMode_t(\n        1,\n    );\n}\nimpl hipblasLtPointerMode_t {\n    /// targets device memory\n    pub const HIPBLASLT_POINTER_MODE_ALPHA_DEVICE_VECTOR_BETA_HOST: hipblasLtPointerMode_t = hipblasLtPointerMode_t(\n        4,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief Pointer mode to use for alpha.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipblasLtPointerMode_t(pub ::core::ffi::c_uint);\nimpl hipblasLtMatmulDescAttributes_t {\n    ///<Specifies the type of transformation operation that should be performed on matrix A. Default value is HIPBLAS_OP_N (for example, non-transpose operation). See hipblasOperation_t. Data Type:int32_t\n    pub const HIPBLASLT_MATMUL_DESC_TRANSA: hipblasLtMatmulDescAttributes_t = hipblasLtMatmulDescAttributes_t(\n        0,\n    );\n}\nimpl hipblasLtMatmulDescAttributes_t {\n    ///<Specifies the type of transformation operation that should be performed on matrix B. Default value is HIPBLAS_OP_N (for example, non-transpose operation). See hipblasOperation_t. Data Type:int32_t\n    pub const HIPBLASLT_MATMUL_DESC_TRANSB: hipblasLtMatmulDescAttributes_t = hipblasLtMatmulDescAttributes_t(\n        1,\n    );\n}\nimpl hipblasLtMatmulDescAttributes_t {\n    ///<Epilogue function. See hipblasLtEpilogue_t. Default value is: HIPBLASLT_EPILOGUE_DEFAULT. Data Type: uint32_t\n    pub const HIPBLASLT_MATMUL_DESC_EPILOGUE: hipblasLtMatmulDescAttributes_t = hipblasLtMatmulDescAttributes_t(\n        2,\n    );\n}\nimpl hipblasLtMatmulDescAttributes_t {\n    ///<Bias or Bias gradient vector pointer in the device memory. Data Type:void* /const void*\n    pub const HIPBLASLT_MATMUL_DESC_BIAS_POINTER: hipblasLtMatmulDescAttributes_t = hipblasLtMatmulDescAttributes_t(\n        3,\n    );\n}\nimpl hipblasLtMatmulDescAttributes_t {\n    ///<Type of the bias vector in the device memory. Can be set same as D matrix type or Scale type. Bias case: see HIPBLASLT_EPILOGUE_BIAS. Data Type:int32_t based on hipDataType\n    pub const HIPBLASLT_MATMUL_DESC_BIAS_DATA_TYPE: hipblasLtMatmulDescAttributes_t = hipblasLtMatmulDescAttributes_t(\n        4,\n    );\n}\nimpl hipblasLtMatmulDescAttributes_t {\n    ///<Device pointer to the scale factor value that converts data in matrix A to the compute data type range. The scaling factor must have the same type as the compute type. If not specified, or set to NULL, the scaling factor is assumed to be 1. If set for an unsupported matrix data, scale, and compute type combination, calling hipblasLtMatmul() will return HIPBLAS_INVALID_VALUE. Default value: NULL Data Type: void* /const void*\n    pub const HIPBLASLT_MATMUL_DESC_A_SCALE_POINTER: hipblasLtMatmulDescAttributes_t = hipblasLtMatmulDescAttributes_t(\n        5,\n    );\n}\nimpl hipblasLtMatmulDescAttributes_t {\n    ///<Equivalent to HIPBLASLT_MATMUL_DESC_A_SCALE_POINTER for matrix B. Default value: NULL Type: void* /const void*\n    pub const HIPBLASLT_MATMUL_DESC_B_SCALE_POINTER: hipblasLtMatmulDescAttributes_t = hipblasLtMatmulDescAttributes_t(\n        6,\n    );\n}\nimpl hipblasLtMatmulDescAttributes_t {\n    ///<Equivalent to HIPBLASLT_MATMUL_DESC_A_SCALE_POINTER for matrix C. Default value: NULL Type: void* /const void*\n    pub const HIPBLASLT_MATMUL_DESC_C_SCALE_POINTER: hipblasLtMatmulDescAttributes_t = hipblasLtMatmulDescAttributes_t(\n        7,\n    );\n}\nimpl hipblasLtMatmulDescAttributes_t {\n    ///<Equivalent to HIPBLASLT_MATMUL_DESC_A_SCALE_POINTER for matrix D. Default value: NULL Type: void* /const void*\n    pub const HIPBLASLT_MATMUL_DESC_D_SCALE_POINTER: hipblasLtMatmulDescAttributes_t = hipblasLtMatmulDescAttributes_t(\n        8,\n    );\n}\nimpl hipblasLtMatmulDescAttributes_t {\n    ///<Equivalent to HIPBLASLT_MATMUL_DESC_A_SCALE_POINTER for matrix AUX. Default value: NULL Type: void* /const void*\n    pub const HIPBLASLT_MATMUL_DESC_EPILOGUE_AUX_SCALE_POINTER: hipblasLtMatmulDescAttributes_t = hipblasLtMatmulDescAttributes_t(\n        9,\n    );\n}\nimpl hipblasLtMatmulDescAttributes_t {\n    ///<Epilogue auxiliary buffer pointer in the device memory. Data Type:void* /const void*\n    pub const HIPBLASLT_MATMUL_DESC_EPILOGUE_AUX_POINTER: hipblasLtMatmulDescAttributes_t = hipblasLtMatmulDescAttributes_t(\n        10,\n    );\n}\nimpl hipblasLtMatmulDescAttributes_t {\n    ///<The leading dimension of the epilogue auxiliary buffer pointer in the device memory. Data Type:int64_t\n    pub const HIPBLASLT_MATMUL_DESC_EPILOGUE_AUX_LD: hipblasLtMatmulDescAttributes_t = hipblasLtMatmulDescAttributes_t(\n        11,\n    );\n}\nimpl hipblasLtMatmulDescAttributes_t {\n    ///<The batch stride of the epilogue auxiliary buffer pointer in the device memory. Data Type:int64_t\n    pub const HIPBLASLT_MATMUL_DESC_EPILOGUE_AUX_BATCH_STRIDE: hipblasLtMatmulDescAttributes_t = hipblasLtMatmulDescAttributes_t(\n        12,\n    );\n}\nimpl hipblasLtMatmulDescAttributes_t {\n    ///<Specifies alpha and beta are passed by reference, whether they are scalars on the host or on the device, or device vectors. Default value is: HIPBLASLT_POINTER_MODE_HOST (i.e., on the host). Data Type: int32_t based on hipblasLtPointerMode_t\n    pub const HIPBLASLT_MATMUL_DESC_POINTER_MODE: hipblasLtMatmulDescAttributes_t = hipblasLtMatmulDescAttributes_t(\n        13,\n    );\n}\nimpl hipblasLtMatmulDescAttributes_t {\n    ///<Device pointer to the memory location that on completion will be set to the maximum of absolute values in the output matrix. Data Type:void* /const void*\n    pub const HIPBLASLT_MATMUL_DESC_AMAX_D_POINTER: hipblasLtMatmulDescAttributes_t = hipblasLtMatmulDescAttributes_t(\n        14,\n    );\n}\nimpl hipblasLtMatmulDescAttributes_t {\n    ///<Compute input A types. Defines the data type used for the input A of matrix multiply.\n    pub const HIPBLASLT_MATMUL_DESC_COMPUTE_INPUT_TYPE_A_EXT: hipblasLtMatmulDescAttributes_t = hipblasLtMatmulDescAttributes_t(\n        100,\n    );\n}\nimpl hipblasLtMatmulDescAttributes_t {\n    ///<Compute input B types. Defines the data type used for the input B of matrix multiply.\n    pub const HIPBLASLT_MATMUL_DESC_COMPUTE_INPUT_TYPE_B_EXT: hipblasLtMatmulDescAttributes_t = hipblasLtMatmulDescAttributes_t(\n        101,\n    );\n}\nimpl hipblasLtMatmulDescAttributes_t {\n    ///<Equivalent to HIPBLASLT_MATMUL_DESC_A_SCALE_POINTER but in vector. Default value: NULL Type: void* /const void*\n    pub const HIPBLASLT_MATMUL_DESC_A_SCALE_POINTER_VEC_EXT: hipblasLtMatmulDescAttributes_t = hipblasLtMatmulDescAttributes_t(\n        102,\n    );\n}\nimpl hipblasLtMatmulDescAttributes_t {\n    ///<Equivalent to HIPBLASLT_MATMUL_DESC_B_SCALE_POINTER but in vector. Default value: NULL Type: void* /const void*\n    pub const HIPBLASLT_MATMUL_DESC_B_SCALE_POINTER_VEC_EXT: hipblasLtMatmulDescAttributes_t = hipblasLtMatmulDescAttributes_t(\n        103,\n    );\n}\nimpl hipblasLtMatmulDescAttributes_t {\n    pub const HIPBLASLT_MATMUL_DESC_MAX: hipblasLtMatmulDescAttributes_t = hipblasLtMatmulDescAttributes_t(\n        104,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief Specify the attributes that define the specifics of the matrix multiply operation.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipblasLtMatmulDescAttributes_t(pub ::core::ffi::c_uint);\nimpl hipblasLtMatmulPreferenceAttributes_t {\n    ///<Search mode. Data Type: uint32_t\n    pub const HIPBLASLT_MATMUL_PREF_SEARCH_MODE: hipblasLtMatmulPreferenceAttributes_t = hipblasLtMatmulPreferenceAttributes_t(\n        0,\n    );\n}\nimpl hipblasLtMatmulPreferenceAttributes_t {\n    ///<Maximum allowed workspace memory. Default is 0 (no workspace memory allowed). Data Type: uint64_t\n    pub const HIPBLASLT_MATMUL_PREF_MAX_WORKSPACE_BYTES: hipblasLtMatmulPreferenceAttributes_t = hipblasLtMatmulPreferenceAttributes_t(\n        1,\n    );\n}\nimpl hipblasLtMatmulPreferenceAttributes_t {\n    pub const HIPBLASLT_MATMUL_PREF_MAX: hipblasLtMatmulPreferenceAttributes_t = hipblasLtMatmulPreferenceAttributes_t(\n        2,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief It is an enumerated type used to apply algorithm search preferences while fine-tuning the heuristic function.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipblasLtMatmulPreferenceAttributes_t(pub ::core::ffi::c_uint);\nimpl hipblasLtOrder_t {\n    /** Column-major\n\n Leading dimension is the stride (in elements) to the beginning of next column in memory.*/\n    pub const HIPBLASLT_ORDER_COL: hipblasLtOrder_t = hipblasLtOrder_t(0);\n}\nimpl hipblasLtOrder_t {\n    /** Row major\n\n Leading dimension is the stride (in elements) to the beginning of next row in memory.*/\n    pub const HIPBLASLT_ORDER_ROW: hipblasLtOrder_t = hipblasLtOrder_t(1);\n}\n#[repr(transparent)]\n/// Enum for data ordering\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipblasLtOrder_t(pub ::core::ffi::c_uint);\nimpl hipblasLtMatrixTransformDescAttributes_t {\n    /** Scale type, see hipDataType. Inputs are converted to scale type for scaling and summation and results are then\n converted to output type to store in memory.\n\n int32_t*/\n    pub const HIPBLASLT_MATRIX_TRANSFORM_DESC_SCALE_TYPE: hipblasLtMatrixTransformDescAttributes_t = hipblasLtMatrixTransformDescAttributes_t(\n        0,\n    );\n}\nimpl hipblasLtMatrixTransformDescAttributes_t {\n    /** Pointer mode of alpha and beta, see hipblasLtPointerMode_t.\n\n int32_t, default: HIPBLASLT_POINTER_MODE_HOST*/\n    pub const HIPBLASLT_MATRIX_TRANSFORM_DESC_POINTER_MODE: hipblasLtMatrixTransformDescAttributes_t = hipblasLtMatrixTransformDescAttributes_t(\n        1,\n    );\n}\nimpl hipblasLtMatrixTransformDescAttributes_t {\n    /** Transform of matrix A, see hipblasOperation_t.\n\n int32_t, default: HIPBLAS_OP_N*/\n    pub const HIPBLASLT_MATRIX_TRANSFORM_DESC_TRANSA: hipblasLtMatrixTransformDescAttributes_t = hipblasLtMatrixTransformDescAttributes_t(\n        2,\n    );\n}\nimpl hipblasLtMatrixTransformDescAttributes_t {\n    /** Transform of matrix B, see hipblasOperation_t.\n\n int32_t, default: HIPBLAS_OP_N*/\n    pub const HIPBLASLT_MATRIX_TRANSFORM_DESC_TRANSB: hipblasLtMatrixTransformDescAttributes_t = hipblasLtMatrixTransformDescAttributes_t(\n        3,\n    );\n}\n#[repr(transparent)]\n/// Matrix transform descriptor attributes to define details of the operation.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipblasLtMatrixTransformDescAttributes_t(pub ::core::ffi::c_uint);\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipblasLtMatmulDescOpaque_t {\n    pub data: [u64; 4usize],\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipblasLtMatrixLayoutOpaque_t {\n    pub data: [u64; 4usize],\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipblasLtMatmulPreferenceOpaque_t {\n    pub data: [u64; 5usize],\n}\n/// Semi-opaque descriptor for hipblasLtMatrixTransform() operation details\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipblasLtMatrixTransformDescOpaque_t {\n    pub data: [u64; 8usize],\n}\n/** \\ingroup types_module\n  \\brief Opaque descriptor for hipblasLtMatrixTransform() operation details\n\n  \\details\n  The hipblasLtMatrixTransformDesc_t is a pointer to an opaque structure holding the description of a matrix transformation operation.\n  \\ref hipblasLtMatrixTransformDescCreate():\n  To create one instance of the descriptor.\n  \\ref hipblasLtMatrixTransformDescDestroy():\n  To destroy a previously created descriptor and release the resources.*/\npub type hipblasLtMatrixTransformDesc_t = *mut hipblasLtMatrixTransformDescOpaque_t;\n/** \\ingroup types_module\n  \\brief Handle to the hipBLASLt library context queue\n\n  \\details\n  The hipblasLtHandle_t type is a pointer type to an opaque structure holding the hipBLASLt library context. Use the following functions to manipulate this library context:\n\n  \\ref hipblasLtCreate():\n  To initialize the hipBLASLt library context and return a handle to an opaque structure holding the hipBLASLt library context.\n  \\ref hipblasLtDestroy():\n  To destroy a previously created hipBLASLt library context descriptor and release the resources.*/\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipblasLtHandle_t(pub *mut ::core::ffi::c_void);\n/** \\ingroup types_module\n  \\brief Descriptor of the matrix multiplication operation\n\n  \\details\n  This is a pointer to an opaque structure holding the description of the matrix multiplication operation \\ref hipblasLtMatmul().\n  Use the following functions to manipulate this descriptor:\n  \\ref hipblasLtMatmulDescCreate(): To create one instance of the descriptor.\n  \\ref hipblasLtMatmulDescDestroy(): To destroy a previously created descriptor and release the resources.*/\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipblasLtMatmulDesc_t(pub *mut hipblasLtMatmulDescOpaque_t);\n/** \\ingroup types_module\n  \\brief Descriptor of the matrix layout\n\n  \\details\n  This is a pointer to an opaque structure holding the description of a matrix layout.\n  Use the following functions to manipulate this descriptor:\n  \\ref hipblasLtMatrixLayoutCreate(): To create one instance of the descriptor.\n  \\ref hipblasLtMatrixLayoutDestroy(): To destroy a previously created descriptor and release the resources.*/\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipblasLtMatrixLayout_t(pub *mut hipblasLtMatrixLayoutOpaque_t);\n/** \\ingroup types_module\n  \\brief Descriptor of the matrix multiplication preference\n\n  \\details\n  This is a pointer to an opaque structure holding the description of the preferences for \\ref hipblasLtMatmulAlgoGetHeuristic() configuration.\n  Use the following functions to manipulate this descriptor:\n  \\ref hipblasLtMatmulPreferenceCreate(): To create one instance of the descriptor.\n  \\ref hipblasLtMatmulPreferenceDestroy(): To destroy a previously created descriptor and release the resources.*/\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct hipblasLtMatmulPreference_t(pub *mut hipblasLtMatmulPreferenceOpaque_t);\n/** \\ingroup types_module\n  \\struct hipblasLtMatmulAlgo_t\n  \\brief Description of the matrix multiplication algorithm\n\n  \\details\n  This is an opaque structure holding the description of the matrix multiplication algorithm.\n  This structure can be trivially serialized and later restored for use with the same version of hipBLASLt library to save on selecting the right configuration again.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct _hipblasLtMatmulAlgo_t {\n    pub data: [u8; 16usize],\n    pub max_workspace_bytes: usize,\n}\n/** \\ingroup types_module\n  \\struct hipblasLtMatmulAlgo_t\n  \\brief Description of the matrix multiplication algorithm\n\n  \\details\n  This is an opaque structure holding the description of the matrix multiplication algorithm.\n  This structure can be trivially serialized and later restored for use with the same version of hipBLASLt library to save on selecting the right configuration again.*/\npub type hipblasLtMatmulAlgo_t = _hipblasLtMatmulAlgo_t;\n/** \\ingroup types_module\n  \\struct hipblasLtMatmulHeuristicResult_t\n  \\brief Description of the matrix multiplication algorithm\n\n  \\details\n  This is a descriptor that holds the configured matrix multiplication algorithm descriptor and its runtime properties.\n  This structure can be trivially serialized and later restored for use with the same version of hipBLASLt library to save on selecting the right configuration again.\n  @param algo \\ref hipblasLtMatmulAlgo_t struct\n  @param workspaceSize Actual size of workspace memory required\n  @param state Result status. Other fields are valid only if, after call to hipblasLtMatmulAlgoGetHeuristic(), this member is set to HIPBLAS_STATUS_SUCCESS*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, PartialEq)]\npub struct _hipblasLtMatmulHeuristicResult_t {\n    ///<Algo struct\n    pub algo: hipblasLtMatmulAlgo_t,\n    ///<Actual size of workspace memory required.\n    pub workspaceSize: usize,\n    ///<Result status. Other fields are valid only if, after call to hipblasLtMatmulAlgoGetHeuristic(), this member is set to HIPBLAS_STATUS_SUCCESS..\n    pub state: hipblasStatus_t,\n    ///<Waves count is a device utilization metric. A wavesCount value of 1.0f suggests that when the kernel is launched it will fully occupy the GPU.\n    pub wavesCount: f32,\n    ///<Reserved.\n    pub reserved: [::core::ffi::c_int; 4usize],\n}\n/** \\ingroup types_module\n  \\struct hipblasLtMatmulHeuristicResult_t\n  \\brief Description of the matrix multiplication algorithm\n\n  \\details\n  This is a descriptor that holds the configured matrix multiplication algorithm descriptor and its runtime properties.\n  This structure can be trivially serialized and later restored for use with the same version of hipBLASLt library to save on selecting the right configuration again.\n  @param algo \\ref hipblasLtMatmulAlgo_t struct\n  @param workspaceSize Actual size of workspace memory required\n  @param state Result status. Other fields are valid only if, after call to hipblasLtMatmulAlgoGetHeuristic(), this member is set to HIPBLAS_STATUS_SUCCESS*/\npub type hipblasLtMatmulHeuristicResult_t = _hipblasLtMatmulHeuristicResult_t;\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipblasLtGetVersion(\n        handle: hipblasLtHandle_t,\n        version: *mut ::core::ffi::c_int,\n    ) -> hipblasStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipblasLtGetGitRevision(\n        handle: hipblasLtHandle_t,\n        rev: *mut ::core::ffi::c_char,\n    ) -> hipblasStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn hipblasLtGetArchName(\n        archName: *mut *mut ::core::ffi::c_char,\n    ) -> hipblasStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup library_module\n  \\brief Create a hipblaslt handle\n\n  \\details\n  This function initializes the hipBLASLt library and creates a handle to an\n opaque structure holding the hipBLASLt library context. It allocates light\n hardware resources on the host and device, and must be called prior to making\n any other hipBLASLt library calls. The hipBLASLt library context is tied to\n the current ROCm device. To use the library on multiple devices, one\n hipBLASLt handle should be created for each device.\n\n  @param[out]\n  handle  Pointer to the allocated hipBLASLt handle for the created hipBLASLt\n context.\n\n  \\retval HIPBLAS_STATUS_SUCCESS The allocation completed successfully.\n  \\retval HIPBLAS_STATUS_INVALID_VALUE \\p handle == NULL.*/\n    pub fn hipblasLtCreate(handle: *mut hipblasLtHandle_t) -> hipblasStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup library_module\n  \\brief Destory a hipblaslt handle\n\n  \\details\n  This function releases hardware resources used by the hipBLASLt library.\n  This function is usually the last call with a particular handle to the\n hipBLASLt library. Because hipblasLtCreate() allocates some internal\n resources and the release of those resources by calling hipblasLtDestroy()\n will implicitly call hipDeviceSynchronize(), it is recommended to minimize\n the number of hipblasLtCreate()/hipblasLtDestroy() occurrences.\n\n  @param[in]\n  handle  Pointer to the hipBLASLt handle to be destroyed.\n\n  \\retval HIPBLAS_STATUS_SUCCESS The hipBLASLt context was successfully\n destroyed. \\retval HIPBLAS_STATUS_NOT_INITIALIZED The hipBLASLt library was\n not initialized. \\retval HIPBLAS_STATUS_INVALID_VALUE \\p handle == NULL.*/\n    pub fn hipblasLtDestroy(handle: hipblasLtHandle_t) -> hipblasStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup library_module\n  \\brief Create a matrix layout descriptor\n\n  \\details\n  This function creates a matrix layout descriptor by allocating the memory\n needed to hold its opaque structure.\n\n  @param[out]\n  matLayout Pointer to the structure holding the matrix layout descriptor\n created by this function. see \\ref hipblasLtMatrixLayout_t .\n  @param[in]\n  type Enumerant that specifies the data precision for the matrix layout\n descriptor this function creates. See hipDataType.\n  @param[in]\n  rows Number of rows of the matrix.\n  @param[in]\n  cols Number of columns of the matrix.\n  @param[in]\n  ld The leading dimension of the matrix. In column major layout, this is the\n number of elements to jump to reach the next column. Thus ld >= m (number of\n rows).\n\n  \\retval HIPBLAS_STATUS_SUCCESS If the descriptor was created successfully.\n  \\retval HIPBLAS_STATUS_ALLOC_FAILED If the memory could not be allocated.*/\n    pub fn hipblasLtMatrixLayoutCreate(\n        matLayout: *mut hipblasLtMatrixLayout_t,\n        type_: hipDataType,\n        rows: u64,\n        cols: u64,\n        ld: i64,\n    ) -> hipblasStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup library_module\n  \\brief Destory a matrix layout descriptor\n\n  \\details\n  This function destroys a previously created matrix layout descriptor object.\n\n  @param[in]\n  matLayout Pointer to the structure holding the matrix layout descriptor that\n should be destroyed by this function. see \\ref hipblasLtMatrixLayout_t .\n\n  \\retval HIPBLAS_STATUS_SUCCESS If the operation was successful.*/\n    pub fn hipblasLtMatrixLayoutDestroy(\n        matLayout: hipblasLtMatrixLayout_t,\n    ) -> hipblasStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup library_module\n  \\brief  Set attribute to a matrix descriptor\n\n  \\details\n  This function sets the value of the specified attribute belonging to a\n previously created matrix descriptor.\n\n  @param[in]\n  matLayout  Pointer to the previously created structure holding the matrix\n mdescriptor queried by this function. See \\ref hipblasLtMatrixLayout_t.\n  @param[in]\n  attr  \tThe attribute that will be set by this function. See \\ref\n hipblasLtMatrixLayoutAttribute_t.\n  @param[in]\n  buf  The value to which the specified attribute should be set.\n  @param[in]\n  sizeInBytes Size of buf buffer (in bytes) for verification.\n\n  \\retval HIPBLAS_STATUS_SUCCESS If the attribute was set successfully..\n  \\retval HIPBLAS_STATUS_INVALID_VALUE If \\p buf is NULL or \\p sizeInBytes\n doesn't match the size of the internal storage for the selected attribute.*/\n    pub fn hipblasLtMatrixLayoutSetAttribute(\n        matLayout: hipblasLtMatrixLayout_t,\n        attr: hipblasLtMatrixLayoutAttribute_t,\n        buf: *const ::core::ffi::c_void,\n        sizeInBytes: usize,\n    ) -> hipblasStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup library_module\n  \\brief Query attribute from a matrix descriptor\n\n  \\details\n  This function returns the value of the queried attribute belonging to a\n previously created matrix descriptor.\n\n  @param[in]\n  matLayout  Pointer to the previously created structure holding the matrix\n descriptor queried by this function. See \\ref hipblasLtMatrixLayout_t.\n  @param[in]\n  attr  \t    The attribute that will be retrieved by this function. See\n \\ref hipblasLtMatrixLayoutAttribute_t.\n  @param[out]\n  buf         Memory address containing the attribute value retrieved by this\n function.\n  @param[in]\n  sizeInBytes Size of \\p buf buffer (in bytes) for verification.\n  @param[out]\n  sizeWritten Valid only when the return value is HIPBLAS_STATUS_SUCCESS. If\n sizeInBytes is non-zero: then sizeWritten is the number of bytes actually\n written; if sizeInBytes is 0: then sizeWritten is the number of bytes needed\n to write full contents.\n\n  \\retval HIPBLAS_STATUS_SUCCESS       If attribute's value was successfully\n written to user memory. \\retval HIPBLAS_STATUS_INVALID_VALUE If \\p\n sizeInBytes is 0 and \\p sizeWritten is NULL, or if \\p sizeInBytes is non-zero\n and \\p buf is NULL, or \\p sizeInBytes doesn't match size of internal storage\n for the selected attribute.*/\n    pub fn hipblasLtMatrixLayoutGetAttribute(\n        matLayout: hipblasLtMatrixLayout_t,\n        attr: hipblasLtMatrixLayoutAttribute_t,\n        buf: *mut ::core::ffi::c_void,\n        sizeInBytes: usize,\n        sizeWritten: *mut usize,\n    ) -> hipblasStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup library_module\n  \\brief Create a matrix multiply descriptor\n\n  \\details\n  This function creates a matrix multiply descriptor by allocating the memory\n needed to hold its opaque structure.\n\n  @param[out]\n  matmulDesc  Pointer to the structure holding the matrix multiply descriptor\n created by this function. See \\ref hipblasLtMatmulDesc_t .\n  @param[in]\n  computeType  Enumerant that specifies the data precision for the matrix\n multiply descriptor this function creates. See hipblasComputeType_t .\n  @param[in]\n  scaleType  Enumerant that specifies the data precision for the matrix\n transform descriptor this function creates. See hipDataType.\n\n  \\retval HIPBLAS_STATUS_SUCCESS If the descriptor was created successfully.\n  \\retval HIPBLAS_STATUS_ALLOC_FAILED If the memory could not be allocated.*/\n    pub fn hipblasLtMatmulDescCreate(\n        matmulDesc: *mut hipblasLtMatmulDesc_t,\n        computeType: hipblasComputeType_t,\n        scaleType: hipDataType,\n    ) -> hipblasStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup library_module\n  \\brief Destory a matrix multiply descriptor\n\n  \\details\n  This function destroys a previously created matrix multiply descriptor\n object.\n\n  @param[in]\n  matmulDesc  Pointer to the structure holding the matrix multiply descriptor\n that should be destroyed by this function. See \\ref hipblasLtMatmulDesc_t .\n\n  \\retval HIPBLAS_STATUS_SUCCESS If operation was successful.*/\n    pub fn hipblasLtMatmulDescDestroy(\n        matmulDesc: hipblasLtMatmulDesc_t,\n    ) -> hipblasStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup library_module\n  \\brief  Set attribute to a matrix multiply descriptor\n\n  \\details\n  This function sets the value of the specified attribute belonging to a\n previously created matrix multiply descriptor.\n\n  @param[in]\n  matmulDesc  Pointer to the previously created structure holding the matrix\n multiply descriptor queried by this function. See \\ref hipblasLtMatmulDesc_t.\n  @param[in]\n  attr  \tThe attribute that will be set by this function. See \\ref\n hipblasLtMatmulDescAttributes_t.\n  @param[in]\n  buf  The value to which the specified attribute should be set.\n  @param[in]\n  sizeInBytes Size of buf buffer (in bytes) for verification.\n\n  \\retval HIPBLAS_STATUS_SUCCESS If the attribute was set successfully..\n  \\retval HIPBLAS_STATUS_INVALID_VALUE If \\p buf is NULL or \\p sizeInBytes\n doesn't match the size of the internal storage for the selected attribute.*/\n    pub fn hipblasLtMatmulDescSetAttribute(\n        matmulDesc: hipblasLtMatmulDesc_t,\n        attr: hipblasLtMatmulDescAttributes_t,\n        buf: *const ::core::ffi::c_void,\n        sizeInBytes: usize,\n    ) -> hipblasStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup library_module\n  \\brief Query attribute from a matrix multiply descriptor\n\n  \\details\n  This function returns the value of the queried attribute belonging to a\n previously created matrix multiply descriptor.\n\n  @param[in]\n  matmulDesc  Pointer to the previously created structure holding the matrix\n multiply descriptor queried by this function. See \\ref hipblasLtMatmulDesc_t.\n  @param[in]\n  attr  \t    The attribute that will be retrieved by this function. See\n \\ref hipblasLtMatmulDescAttributes_t.\n  @param[out]\n  buf         Memory address containing the attribute value retrieved by this\n function.\n  @param[in]\n  sizeInBytes Size of \\p buf buffer (in bytes) for verification.\n  @param[out]\n  sizeWritten Valid only when the return value is HIPBLAS_STATUS_SUCCESS. If\n sizeInBytes is non-zero: then sizeWritten is the number of bytes actually\n written; if sizeInBytes is 0: then sizeWritten is the number of bytes needed\n to write full contents.\n\n  \\retval HIPBLAS_STATUS_SUCCESS       If attribute's value was successfully\n written to user memory. \\retval HIPBLAS_STATUS_INVALID_VALUE If \\p\n sizeInBytes is 0 and \\p sizeWritten is NULL, or if \\p sizeInBytes is non-zero\n and \\p buf is NULL, or \\p sizeInBytes doesn't match size of internal storage\n for the selected attribute.*/\n    pub fn hipblasLtMatmulDescGetAttribute(\n        matmulDesc: hipblasLtMatmulDesc_t,\n        attr: hipblasLtMatmulDescAttributes_t,\n        buf: *mut ::core::ffi::c_void,\n        sizeInBytes: usize,\n        sizeWritten: *mut usize,\n    ) -> hipblasStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup library_module\n  \\brief Create a preference descriptor\n\n  \\details\n  This function creates a matrix multiply heuristic search preferences\n descriptor by allocating the memory needed to hold its opaque structure.\n\n  @param[out]\n  pref  Pointer to the structure holding the matrix multiply preferences\n descriptor created by this function. see \\ref hipblasLtMatmulPreference_t .\n\n  \\retval HIPBLAS_STATUS_SUCCESS         If the descriptor was created\n successfully. \\retval HIPBLAS_STATUS_ALLOC_FAILED    If memory could not be\n allocated.*/\n    pub fn hipblasLtMatmulPreferenceCreate(\n        pref: *mut hipblasLtMatmulPreference_t,\n    ) -> hipblasStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup library_module\n  \\brief Destory a preferences descriptor\n\n  \\details\n  This function destroys a previously created matrix multiply preferences\n descriptor object.\n\n  @param[in]\n  pref  Pointer to the structure holding the matrix multiply preferences\n descriptor that should be destroyed by this function. See \\ref\n hipblasLtMatmulPreference_t .\n\n  \\retval HIPBLAS_STATUS_SUCCESS If operation was successful.*/\n    pub fn hipblasLtMatmulPreferenceDestroy(\n        pref: hipblasLtMatmulPreference_t,\n    ) -> hipblasStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup library_module\n  \\brief Set attribute to a preference descriptor\n\n  \\details\n  This function sets the value of the specified attribute belonging to a\n previously created matrix multiply preferences descriptor.\n\n  @param[in]\n  pref        Pointer to the previously created structure holding the matrix\n multiply preferences descriptor queried by this function. See \\ref\n hipblasLtMatmulPreference_t\n  @param[in]\n  attr  \t    The attribute that will be set by this function. See \\ref\n hipblasLtMatmulPreferenceAttributes_t.\n  @param[in]\n  buf         The value to which the specified attribute should be set.\n  @param[in]\n  sizeInBytes Size of \\p buf buffer (in bytes) for verification.\n\n  \\retval HIPBLAS_STATUS_SUCCESS If the attribute was set successfully..\n  \\retval HIPBLAS_STATUS_INVALID_VALUE If \\p buf is NULL or \\p sizeInBytes\n doesn't match the size of the internal storage for the selected attribute.*/\n    pub fn hipblasLtMatmulPreferenceSetAttribute(\n        pref: hipblasLtMatmulPreference_t,\n        attr: hipblasLtMatmulPreferenceAttributes_t,\n        buf: *const ::core::ffi::c_void,\n        sizeInBytes: usize,\n    ) -> hipblasStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup library_module\n  \\brief Query attribute from a preference descriptor\n\n  \\details\n  This function returns the value of the queried attribute belonging to a\n previously created matrix multiply heuristic search preferences descriptor.\n\n  @param[in]\n  pref        Pointer to the previously created structure holding the matrix\n multiply heuristic search preferences descriptor queried by this function.\n See \\ref hipblasLtMatmulPreference_t.\n  @param[in]\n  attr  \t    The attribute that will be retrieved by this function. See\n \\ref hipblasLtMatmulPreferenceAttributes_t.\n  @param[out]\n  buf         Memory address containing the attribute value retrieved by this\n function.\n  @param[in]\n  sizeInBytes Size of \\p buf buffer (in bytes) for verification.\n  @param[out]\n  sizeWritten Valid only when the return value is HIPBLAS_STATUS_SUCCESS. If\n sizeInBytes is non-zero: then sizeWritten is the number of bytes actually\n written; if sizeInBytes is 0: then sizeWritten is the number of bytes needed\n to write full contents.\n\n  \\retval HIPBLAS_STATUS_SUCCESS       If attribute's value was successfully\n written to user memory. \\retval HIPBLAS_STATUS_INVALID_VALUE If \\p\n sizeInBytes is 0 and \\p sizeWritten is NULL, or if \\p sizeInBytes is non-zero\n and \\p buf is NULL, or \\p sizeInBytes doesn't match size of internal storage\n for the selected attribute.*/\n    pub fn hipblasLtMatmulPreferenceGetAttribute(\n        pref: hipblasLtMatmulPreference_t,\n        attr: hipblasLtMatmulPreferenceAttributes_t,\n        buf: *mut ::core::ffi::c_void,\n        sizeInBytes: usize,\n        sizeWritten: *mut usize,\n    ) -> hipblasStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup library_module\n  \\brief Retrieve the possible algorithms\n\n  \\details\n  This function retrieves the possible algorithms for the matrix multiply\n operation hipblasLtMatmul() function with the given input matrices A, B and\n C, and the output matrix D. The output is placed in heuristicResultsArray[]\n in the order of increasing estimated compute time. Note that the wall duration\n increases if the requestedAlgoCount increases.\n\n  @param[in]\n  handle                  Pointer to the allocated hipBLASLt handle for the\n hipBLASLt context. See \\ref hipblasLtHandle_t .\n  @param[in]\n  matmulDesc              Handle to a previously created matrix multiplication\n descriptor of type \\ref hipblasLtMatmulDesc_t .\n  @param[in]\n  Adesc,Bdesc,Cdesc,Ddesc Handles to the previously created matrix layout\n descriptors of the type \\ref hipblasLtMatrixLayout_t .\n  @param[in]\n  pref                    Pointer to the structure holding the heuristic\n search preferences descriptor. See \\ref hipblasLtMatmulPreference_t .\n  @param[in]\n  requestedAlgoCount      Size of the \\p heuristicResultsArray (in elements).\n This is the requested maximum number of algorithms to return.\n  @param[out]\n  heuristicResultsArray[] Array containing the algorithm heuristics and\n associated runtime characteristics, returned by this function, in the order\n of increasing estimated compute time.\n  @param[out]\n  returnAlgoCount         Number of algorithms returned by this function. This\n is the number of \\p heuristicResultsArray elements written.\n\n  \\retval HIPBLAS_STATUS_SUCCESS           If query was successful. Inspect\n heuristicResultsArray[0 to (returnAlgoCount -1)].state for the status of the\n results. \\retval HIPBLAS_STATUS_NOT_SUPPORTED     If no heuristic function\n available for current configuration. \\retval HIPBLAS_STATUS_INVALID_VALUE If\n \\p requestedAlgoCount is less or equal to zero.*/\n    pub fn hipblasLtMatmulAlgoGetHeuristic(\n        handle: hipblasLtHandle_t,\n        matmulDesc: hipblasLtMatmulDesc_t,\n        Adesc: hipblasLtMatrixLayout_t,\n        Bdesc: hipblasLtMatrixLayout_t,\n        Cdesc: hipblasLtMatrixLayout_t,\n        Ddesc: hipblasLtMatrixLayout_t,\n        pref: hipblasLtMatmulPreference_t,\n        requestedAlgoCount: ::core::ffi::c_int,\n        heuristicResultsArray: *mut hipblasLtMatmulHeuristicResult_t,\n        returnAlgoCount: *mut ::core::ffi::c_int,\n    ) -> hipblasStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup library_module\n  \\brief Retrieve the possible algorithms\n\n  \\details\n  This function computes the matrix multiplication of matrices A and B to\n produce the output matrix D, according to the following operation: \\p D = \\p\n alpha*( \\p A *\\p B) + \\p beta*( \\p C ), where \\p A, \\p B, and \\p C are input\n matrices, and \\p alpha and \\p beta are input scalars. Note: This function\n supports both in-place matrix multiplication (C == D and Cdesc == Ddesc) and\n out-of-place matrix multiplication (C != D, both matrices must have the same\n data type, number of rows, number of columns, batch size, and memory order).\n In the out-of-place case, the leading dimension of C can be different from\n the leading dimension of D. Specifically the leading dimension of C can be 0\n to achieve row or column broadcast. If Cdesc is omitted, this function\n assumes it to be equal to Ddesc.\n\n  @param[in]\n  handle                  Pointer to the allocated hipBLASLt handle for the\n hipBLASLt context. See \\ref hipblasLtHandle_t .\n  @param[in]\n  matmulDesc              Handle to a previously created matrix multiplication\n descriptor of type \\ref hipblasLtMatmulDesc_t .\n  @param[in]\n  alpha,beta              Pointers to the scalars used in the multiplication.\n  @param[in]\n  Adesc,Bdesc,Cdesc,Ddesc Handles to the previously created matrix layout\n descriptors of the type \\ref hipblasLtMatrixLayout_t .\n  @param[in]\n  A,B,C                   Pointers to the GPU memory associated with the\n corresponding descriptors \\p Adesc, \\p Bdesc and \\p Cdesc .\n  @param[out]\n  D                       Pointer to the GPU memory associated with the\n descriptor \\p Ddesc .\n  @param[in]\n  algo                    Handle for matrix multiplication algorithm to be\n used. See \\ref hipblasLtMatmulAlgo_t . When NULL, an implicit heuristics query\n with default search preferences will be performed to determine actual\n algorithm to use.\n  @param[in]\n  workspace               Pointer to the workspace buffer allocated in the GPU\n memory. Pointer must be 16B aligned (that is, lowest 4 bits of address must\n be 0).\n  @param[in]\n  workspaceSizeInBytes    Size of the workspace.\n  @param[in]\n  stream                  The HIP stream where all the GPU work will be\n submitted.\n\n  \\retval HIPBLAS_STATUS_SUCCESS           If the operation completed\n successfully. \\retval HIPBLAS_STATUS_EXECUTION_FAILED  If HIP reported an\n execution error from the device. \\retval HIPBLAS_STATUS_ARCH_MISMATCH     If\n the configured operation cannot be run using the selected device. \\retval\n HIPBLAS_STATUS_NOT_SUPPORTED     If the current implementation on the\n selected device doesn't support the configured operation. \\retval\n HIPBLAS_STATUS_INVALID_VALUE     If the parameters are unexpectedly NULL, in\n conflict or in an impossible configuration. For example, when\n workspaceSizeInBytes is less than workspace required by the configured algo.\n  \\retval HIBLAS_STATUS_NOT_INITIALIZED    If hipBLASLt handle has not been\n initialized.*/\n    pub fn hipblasLtMatmul(\n        handle: hipblasLtHandle_t,\n        matmulDesc: hipblasLtMatmulDesc_t,\n        alpha: *const ::core::ffi::c_void,\n        A: *const ::core::ffi::c_void,\n        Adesc: hipblasLtMatrixLayout_t,\n        B: *const ::core::ffi::c_void,\n        Bdesc: hipblasLtMatrixLayout_t,\n        beta: *const ::core::ffi::c_void,\n        C: *const ::core::ffi::c_void,\n        Cdesc: hipblasLtMatrixLayout_t,\n        D: *mut ::core::ffi::c_void,\n        Ddesc: hipblasLtMatrixLayout_t,\n        algo: *const hipblasLtMatmulAlgo_t,\n        workspace: *mut ::core::ffi::c_void,\n        workspaceSizeInBytes: usize,\n        stream: hip_runtime_sys::hipStream_t,\n    ) -> hipblasStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** Create new matrix transform operation descriptor.\n\n \\retval     HIPBLAS_STATUS_ALLOC_FAILED  if memory could not be allocated\n \\retval     HIPBLAS_STATUS_SUCCESS       if desciptor was created successfully*/\n    pub fn hipblasLtMatrixTransformDescCreate(\n        transformDesc: *mut hipblasLtMatrixTransformDesc_t,\n        scaleType: hipDataType,\n    ) -> hipblasStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** Destroy matrix transform operation descriptor.\n\n \\retval     HIPBLAS_STATUS_SUCCESS  if operation was successful*/\n    pub fn hipblasLtMatrixTransformDescDestroy(\n        transformDesc: hipblasLtMatrixTransformDesc_t,\n    ) -> hipblasStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** Set matrix transform operation descriptor attribute.\n\n \\param[in]  transformDesc  The descriptor\n \\param[in]  attr           The attribute\n \\param[in]  buf            memory address containing the new value\n \\param[in]  sizeInBytes    size of buf buffer for verification (in bytes)\n\n \\retval     HIPBLAS_STATUS_INVALID_VALUE  if buf is NULL or sizeInBytes doesn't match size of internal storage for\n                                          selected attribute\n \\retval     HIPBLAS_STATUS_SUCCESS        if attribute was set successfully*/\n    pub fn hipblasLtMatrixTransformDescSetAttribute(\n        transformDesc: hipblasLtMatrixTransformDesc_t,\n        attr: hipblasLtMatrixTransformDescAttributes_t,\n        buf: *const ::core::ffi::c_void,\n        sizeInBytes: usize,\n    ) -> hipblasStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup library_module\n  \\brief Matrix transform operation getter\n  \\details Get matrix transform operation descriptor attribute.\n\n @param[in]  transformDesc  The descriptor\n @param[in]  attr           The attribute\n @param[out] buf            memory address containing the new value\n @param[in]  sizeInBytes    size of buf buffer for verification (in bytes)\n @param[out] sizeWritten    only valid when return value is HIPBLAS_STATUS_SUCCESS. If sizeInBytes is non-zero: number\n of bytes actually written, if sizeInBytes is 0: number of bytes needed to write full contents\n\n \\retval HIPBLAS_STATUS_INVALID_VALUE  if sizeInBytes is 0 and sizeWritten is NULL, or if  sizeInBytes is non-zero\n                                          and buf is NULL or sizeInBytes doesn't match size of internal storage for\n                                          selected attribute\n \\retval HIPBLAS_STATUS_SUCCESS        if attribute's value was successfully written to user memory*/\n    pub fn hipblasLtMatrixTransformDescGetAttribute(\n        transformDesc: hipblasLtMatrixTransformDesc_t,\n        attr: hipblasLtMatrixTransformDescAttributes_t,\n        buf: *mut ::core::ffi::c_void,\n        sizeInBytes: usize,\n        sizeWritten: *mut usize,\n    ) -> hipblasStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup library_module\n  \\brief Matrix layout conversion helper\n  \\details\n   Matrix layout conversion helper (C = alpha * op(A) + beta * op(B)),\n can be used to change memory order of data or to scale and shift the values.\n @param[in]  lightHandle   Pointer to the allocated hipBLASLt handle for the\n hipBLASLt context. See \\ref hipblasLtHandle_t .\n @param[in]  transformDesc Pointer to allocated matrix transform descriptor.\n @param[in]  alpha         Pointer to scalar alpha, either pointer to host or device address.\n @param[in]  A             Pointer to matrix A, must be pointer to device address.\n @param[in]  Adesc         Pointer to layout for input matrix A.\n @param[in]  beta          Pointer to scalar beta, either pointer to host or device address.\n @param[in]  B             Pointer to layout for matrix B, must be pointer to device address\n @param[in]  Bdesc         Pointer to layout for inputmatrix B.\n @param[in]  C             Pointer to matrix C, must be pointer to device address\n @param[out] Cdesc         Pointer to layout for output matrix C.\n @param[in] stream         The HIP stream where all the GPU work will be submitted.\n\n \\retval HIPBLAS_STATUS_NOT_INITIALIZED   if hipBLASLt handle has not been initialized\n \\retval HIPBLAS_STATUS_INVALID_VALUE     if parameters are in conflict or in an impossible configuration; e.g.\n                                              when A is not NULL, but Adesc is NULL\n \\retval HIPBLAS_STATUS_NOT_SUPPORTED     if current implementation on selected device doesn't support configured\n                                              operation\n \\retval HIPBLAS_STATUS_ARCH_MISMATCH     if configured operation cannot be run using selected device\n \\retval HIPBLAS_STATUS_EXECUTION_FAILED  if HIP reported execution error from the device\n \\retval HIPBLAS_STATUS_SUCCESS           if the operation completed successfully*/\n    pub fn hipblasLtMatrixTransform(\n        lightHandle: hipblasLtHandle_t,\n        transformDesc: hipblasLtMatrixTransformDesc_t,\n        alpha: *const ::core::ffi::c_void,\n        A: *const ::core::ffi::c_void,\n        Adesc: hipblasLtMatrixLayout_t,\n        beta: *const ::core::ffi::c_void,\n        B: *const ::core::ffi::c_void,\n        Bdesc: hipblasLtMatrixLayout_t,\n        C: *mut ::core::ffi::c_void,\n        Cdesc: hipblasLtMatrixLayout_t,\n        stream: hip_runtime_sys::hipStream_t,\n    ) -> hipblasStatus_t;\n}\nimpl hipblasLtError {\n    pub const r#NOT_INITIALIZED: hipblasLtError = hipblasLtError(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(1)\n    });\n    pub const r#ALLOC_FAILED: hipblasLtError = hipblasLtError(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(2)\n    });\n    pub const r#INVALID_VALUE: hipblasLtError = hipblasLtError(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3)\n    });\n    pub const r#MAPPING_ERROR: hipblasLtError = hipblasLtError(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(4)\n    });\n    pub const r#EXECUTION_FAILED: hipblasLtError = hipblasLtError(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(5)\n    });\n    pub const r#INTERNAL_ERROR: hipblasLtError = hipblasLtError(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(6)\n    });\n    pub const r#NOT_SUPPORTED: hipblasLtError = hipblasLtError(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(7)\n    });\n    pub const r#ARCH_MISMATCH: hipblasLtError = hipblasLtError(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(8)\n    });\n    pub const r#HANDLE_IS_NULLPTR: hipblasLtError = hipblasLtError(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(9)\n    });\n    pub const r#INVALID_ENUM: hipblasLtError = hipblasLtError(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(10)\n    });\n    pub const r#UNKNOWN: hipblasLtError = hipblasLtError(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(11)\n    });\n}\n#[repr(transparent)]\n#[derive(Debug, Hash, Copy, Clone, PartialEq, Eq)]\npub struct hipblasLtError(pub ::core::num::NonZeroU32);\npub trait hipblasStatus_tConsts {\n    const SUCCESS: hipblasStatus_t = hipblasStatus_t::Ok(());\n    const ERROR_NOT_INITIALIZED: hipblasStatus_t = hipblasStatus_t::Err(\n        hipblasLtError::r#NOT_INITIALIZED,\n    );\n    const ERROR_ALLOC_FAILED: hipblasStatus_t = hipblasStatus_t::Err(\n        hipblasLtError::r#ALLOC_FAILED,\n    );\n    const ERROR_INVALID_VALUE: hipblasStatus_t = hipblasStatus_t::Err(\n        hipblasLtError::r#INVALID_VALUE,\n    );\n    const ERROR_MAPPING_ERROR: hipblasStatus_t = hipblasStatus_t::Err(\n        hipblasLtError::r#MAPPING_ERROR,\n    );\n    const ERROR_EXECUTION_FAILED: hipblasStatus_t = hipblasStatus_t::Err(\n        hipblasLtError::r#EXECUTION_FAILED,\n    );\n    const ERROR_INTERNAL_ERROR: hipblasStatus_t = hipblasStatus_t::Err(\n        hipblasLtError::r#INTERNAL_ERROR,\n    );\n    const ERROR_NOT_SUPPORTED: hipblasStatus_t = hipblasStatus_t::Err(\n        hipblasLtError::r#NOT_SUPPORTED,\n    );\n    const ERROR_ARCH_MISMATCH: hipblasStatus_t = hipblasStatus_t::Err(\n        hipblasLtError::r#ARCH_MISMATCH,\n    );\n    const ERROR_HANDLE_IS_NULLPTR: hipblasStatus_t = hipblasStatus_t::Err(\n        hipblasLtError::r#HANDLE_IS_NULLPTR,\n    );\n    const ERROR_INVALID_ENUM: hipblasStatus_t = hipblasStatus_t::Err(\n        hipblasLtError::r#INVALID_ENUM,\n    );\n    const ERROR_UNKNOWN: hipblasStatus_t = hipblasStatus_t::Err(\n        hipblasLtError::r#UNKNOWN,\n    );\n}\nimpl hipblasStatus_tConsts for hipblasStatus_t {}\n#[must_use]\npub type hipblasStatus_t = ::core::result::Result<(), hipblasLtError>;\nconst _: fn() = || {\n    let _ = std::mem::transmute::<hipblasStatus_t, u32>;\n};\nunsafe impl Send for hipblasLtHandle_t {}\nunsafe impl Sync for hipblasLtHandle_t {}\nunsafe impl Send for hipblasLtMatmulDesc_t {}\nunsafe impl Sync for hipblasLtMatmulDesc_t {}\nunsafe impl Send for hipblasLtMatmulPreference_t {}\nunsafe impl Sync for hipblasLtMatmulPreference_t {}\nunsafe impl Send for hipblasLtMatrixLayout_t {}\nunsafe impl Sync for hipblasLtMatrixLayout_t {}\n"
  },
  {
    "path": "ext/miopen-sys/.rustfmt.toml",
    "content": "disable_all_formatting = true\n"
  },
  {
    "path": "ext/miopen-sys/Cargo.toml",
    "content": "[package]\nname = \"miopen-sys\"\nversion = \"0.0.0\"\nedition = \"2021\"\n\n[lib]\n\n[dependencies]\nhip_runtime-sys = { version = \"0.0.0\", path = \"../hip_runtime-sys\" }\n"
  },
  {
    "path": "ext/miopen-sys/build.rs",
    "content": "use std::env::VarError;\n\nfn main() -> Result<(), VarError> {\n    if !cfg!(windows) {\n        println!(\"cargo:rustc-link-lib=dylib=MIOpen\");\n        println!(\"cargo:rustc-link-search=native=/opt/rocm/lib/\");\n    }\n    Ok(())\n}\n"
  },
  {
    "path": "ext/miopen-sys/src/lib.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\npub const MIOPEN_BACKEND_OPENCL: u32 = 0;\npub const MIOPEN_BACKEND_HIP: u32 = 1;\npub const MIOPEN_MODE_NOGPU: u32 = 0;\npub const MIOPEN_USE_ROCBLAS: u32 = 1;\npub const MIOPEN_USE_HIPBLASLT: u32 = 1;\npub const MIOPEN_USE_ROCTRACER: u32 = 1;\npub const MIOPEN_BUILD_DEV: u32 = 0;\npub const MIOPEN_GPU_SYNC: u32 = 0;\npub const MIOPEN_ENABLE_SQLITE: u32 = 1;\npub const MIOPEN_ENABLE_SQLITE_KERN_CACHE: u32 = 1;\npub const MIOPEN_DEBUG_FIND_DB_CACHING: u32 = 1;\npub const MIOPEN_USE_COMGR: u32 = 1;\npub const MIOPEN_USE_HIPRTC: u32 = 1;\npub const MIOPEN_USE_HIP_KERNELS: u32 = 1;\npub const MIOPEN_DISABLE_USERDB: u32 = 0;\npub const MIOPEN_EMBED_DB: u32 = 0;\npub const MIOPEN_DISABLE_SYSDB: u32 = 0;\npub const MIOPEN_LOG_FUNC_TIME_ENABLE: u32 = 0;\npub const MIOPEN_ENABLE_SQLITE_BACKOFF: u32 = 1;\npub const MIOPEN_USE_MLIR: u32 = 1;\npub const MIOPEN_USE_COMPOSABLEKERNEL: u32 = 1;\npub const MIOPEN_BUILD_DRIVER: u32 = 1;\npub const MIOPEN_ENABLE_AI_IMMED_MODE_FALLBACK: u32 = 1;\npub const MIOPEN_ENABLE_AI_KERNEL_TUNING: u32 = 1;\npub const MIOPEN_HIP_COMPILER_HAS_OPTION_OFFLOAD_UNIFORM_BLOCK: u32 = 1;\npub const MIOPEN_WORKAROUND_USE_BOOST_FILESYSTEM: u32 = 0;\npub const MIOPEN_ENABLE_FIN_INTERFACE: u32 = 0;\npub const MIOPEN_AMD_COMGR_VERSION_MAJOR: u32 = 3;\npub const MIOPEN_AMD_COMGR_VERSION_MINOR: u32 = 0;\npub const MIOPEN_AMD_COMGR_VERSION_PATCH: u32 = 0;\npub const MIOPEN_USE_RNE_BFLOAT16: u32 = 1;\npub const MIOPEN_FP8_IEEE_EXPONENT_BIAS: u32 = 0;\npub const MIOPEN_FP8_CLIPPING: u32 = 1;\npub const MIOPEN_OFFLINE_COMPILER_PATHS_V2: u32 = 1;\npub const MIOPEN_CACHE_DIR: &[u8; 17] = b\"~/.cache/miopen/\\0\";\npub const MIOPEN_USE_SQLITE_PERFDB: u32 = 0;\npub const MIOPEN_NDEBUG: u32 = 0;\npub const MIOPEN_ALLOC_BUFFERS: u32 = 0;\npub const MIOPEN_ROCBLAS_VERSION_MAJOR: u32 = 4;\npub const MIOPEN_ROCBLAS_VERSION_MINOR: u32 = 4;\npub const MIOPEN_ROCBLAS_VERSION_PATCH: u32 = 1;\npub const MIOPEN_ROCBLAS_VERSION_FLAT: u32 = 4004001;\npub const MIOPEN_HIPBLASLT_VERSION_MAJOR: u32 = 0;\npub const MIOPEN_HIPBLASLT_VERSION_MINOR: u32 = 12;\npub const MIOPEN_HIPBLASLT_VERSION_PATCH: u32 = 1;\npub const MIOPEN_HIPBLASLT_VERSION_FLAT: u32 = 12001;\npub const MIOPEN_GOLDEN_DB_VERSION: u32 = 21;\npub const MIOPEN_API_VERSION_REDUCE_TENSOR: u32 = 1;\npub type miopenAcceleratorQueue_t = hip_runtime_sys::hipStream_t;\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenHandle {\n    pub _address: u8,\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenHandle_t(pub *mut miopenHandle);\nimpl miopenF8RoundingMode_t {\n    pub const miopenF8RoundingModeStandard: miopenF8RoundingMode_t = miopenF8RoundingMode_t(\n        0,\n    );\n}\nimpl miopenF8RoundingMode_t {\n    pub const miopenF8RoundingModeStochastic: miopenF8RoundingMode_t = miopenF8RoundingMode_t(\n        1,\n    );\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenF8RoundingMode_t(pub ::core::ffi::c_uint);\n#[cfg(not(windows))]\nextern \"C\" {\n    /** @brief Get character string for an error code.\n\n A function which returns a NULL terminated character string of the error code.\n\n @param error  miopenStatus_t type error status (input)\n @return       errorString*/\n    pub fn miopenGetErrorString(error: miopenStatus_t) -> *const ::core::ffi::c_char;\n}\n/** @brief Custom allocator function\n\n This function allow for user-defined custom allocator\n\n @param context     A pointer a context (input)\n @param sizeBytes   Number of bytes to allocate (input)\n*/\npub type miopenAllocatorFunction = ::core::option::Option<\n    unsafe extern \"C\" fn(\n        context: *mut ::core::ffi::c_void,\n        sizeBytes: usize,\n    ) -> *mut ::core::ffi::c_void,\n>;\n/** @brief Custom deallocator function\n\n This function allow for user-defined custom deallocation function\n\n @param context     A pointer context (input)\n @param memory      A pointer allocated memory (input)\n*/\npub type miopenDeallocatorFunction = ::core::option::Option<\n    unsafe extern \"C\" fn(\n        context: *mut ::core::ffi::c_void,\n        memory: *mut ::core::ffi::c_void,\n    ),\n>;\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Method to return version of MIOpen\n\n The output values of this call follow from the versioning\n format major.minor.patch\n\n Pointers that are NULL will be ignored.\n\n @param major     Major version number (output)\n @param minor     Minor version number (output)\n @param patch     Patch version number (output)\n\n @return          miopenStatus_t*/\n    pub fn miopenGetVersion(\n        major: *mut usize,\n        minor: *mut usize,\n        patch: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Method to create the MIOpen handle object.\n\n This function creates a MIOpen handle. This is called at the very start to initialize the MIOpen\n environment.\n @param handle     A pointer to a MIOpen handle type (output)\n\n @return           miopenStatus_t*/\n    pub fn miopenCreate(handle: *mut miopenHandle_t) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Create a MIOpen handle with an accelerator stream.\n\n The HIP side uses a hip_runtime_sys::hipStream_t type for the stream, while OpenCL will use a\n cl_command_queue.\n\n Create a handle with a previously created accelerator command queue.\n @param handle     A pointer to a MIOpen handle type (output)\n @param stream      An accelerator queue type (input)\n\n @return           miopenStatus_t*/\n    pub fn miopenCreateWithStream(\n        handle: *mut miopenHandle_t,\n        stream: miopenAcceleratorQueue_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Destroys the MIOpen handle.\n\n This is called when breaking down the MIOpen environment.\n @param handle     MIOpen handle (input)\n @return           miopenStatus_t*/\n    pub fn miopenDestroy(handle: miopenHandle_t) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set accelerator command queue previously created\n\n Set a command queue for an accelerator device\n @param handle     MIOpen handle (input)\n @param streamID   An accelerator queue type (input)\n @return           miopenStatus_t*/\n    pub fn miopenSetStream(\n        handle: miopenHandle_t,\n        streamID: miopenAcceleratorQueue_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get the previously created accelerator command queue\n\n Creates a command queue for an accelerator device\n @param handle     MIOpen handle (input)\n @param streamID   Pointer to a accelerator queue type (output)\n @return           miopenStatus_t*/\n    pub fn miopenGetStream(\n        handle: miopenHandle_t,\n        streamID: *mut miopenAcceleratorQueue_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set allocator for previously created miopenHandle\n\n Set a command queue for an accelerator device\n @param handle     MIOpen handle\n @param allocator  A callback function MIOpen will use for internal memory allocations.\n      The provided callback function should allocate device memory with requested size\n      and return a pointer to this memory.\n      Passing 0 will restore the default MIOpen allocator and deallocator.\n @param deallocator  A callback function MIOpen will use to for internal memory deallocation.\n      The provided callback function should free the specified memory pointer\n @param allocatorContext  User-specified pointer which is passed to \\p allocator and \\p\n deallocator\n      This allows the callback function to access state set by the caller to this function,\n      for example a stateful heap allocator or a c++ class.\n @return           miopenStatus_t*/\n    pub fn miopenSetAllocator(\n        handle: miopenHandle_t,\n        allocator: miopenAllocatorFunction,\n        deallocator: miopenDeallocatorFunction,\n        allocatorContext: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get time for last kernel launched\n\n This function is used only when profiling mode has been enabled.\n Kernel timings are based on the MIOpen handle and is not thread-safe.\n In order to use multi-threaded profiling, create an MIOpen handle for each\n concurrent thread.\n\n @param handle     MIOpen handle (input)\n @param time       Pointer to a float type to contain kernel time in milliseconds (output)\n @return           miopenStatus_t*/\n    pub fn miopenGetKernelTime(handle: miopenHandle_t, time: *mut f32) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Enable profiling to retrieve kernel time\n\n Enable or disable kernel profiling. This profiling is only for kernel time.\n @param handle     MIOpen handle (input)\n @param enable     Boolean to toggle profiling (input)\n @return           miopenStatus_t*/\n    pub fn miopenEnableProfiling(handle: miopenHandle_t, enable: bool) -> miopenStatus_t;\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenFusionOpDescriptor {\n    pub _address: u8,\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenFusionOpDescriptor_t(pub *mut miopenFusionOpDescriptor);\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenTensorDescriptor {\n    pub _address: u8,\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenTensorDescriptor_t(pub *mut miopenTensorDescriptor);\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenSeqTensorDescriptor {\n    pub _address: u8,\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenSeqTensorDescriptor_t(pub *mut miopenSeqTensorDescriptor);\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenConvolutionDescriptor {\n    pub _address: u8,\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenConvolutionDescriptor_t(pub *mut miopenConvolutionDescriptor);\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenPoolingDescriptor {\n    pub _address: u8,\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenPoolingDescriptor_t(pub *mut miopenPoolingDescriptor);\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenLRNDescriptor {\n    pub _address: u8,\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenLRNDescriptor_t(pub *mut miopenLRNDescriptor);\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenActivationDescriptor {\n    pub _address: u8,\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenActivationDescriptor_t(pub *mut miopenActivationDescriptor);\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenRNNDescriptor {\n    pub _address: u8,\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenRNNDescriptor_t(pub *mut miopenRNNDescriptor);\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenCTCLossDescriptor {\n    pub _address: u8,\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenCTCLossDescriptor_t(pub *mut miopenCTCLossDescriptor);\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenDropoutDescriptor {\n    pub _address: u8,\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenDropoutDescriptor_t(pub *mut miopenDropoutDescriptor);\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenReduceTensorDescriptor {\n    pub _address: u8,\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenReduceTensorDescriptor_t(pub *mut miopenReduceTensorDescriptor);\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenMhaDescriptor {\n    pub _address: u8,\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenMhaDescriptor_t(pub *mut miopenMhaDescriptor);\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenSoftmaxDescriptor {\n    pub _address: u8,\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenSoftmaxDescriptor_t(pub *mut miopenSoftmaxDescriptor);\nimpl miopenDataType_t {\n    ///< 16-bit floating point (Fully supported)\n    pub const miopenHalf: miopenDataType_t = miopenDataType_t(0);\n}\nimpl miopenDataType_t {\n    ///< 32-bit floating point (Fully supported)\n    pub const miopenFloat: miopenDataType_t = miopenDataType_t(1);\n}\nimpl miopenDataType_t {\n    ///< 32-bit integer (Partially supported)\n    pub const miopenInt32: miopenDataType_t = miopenDataType_t(2);\n}\nimpl miopenDataType_t {\n    ///< 8-bit integer (Partially supported)\n    pub const miopenInt8: miopenDataType_t = miopenDataType_t(3);\n}\nimpl miopenDataType_t {\n    /**< 16-bit binary floating point (8-bit exponent, 7-bit fraction)\n(Partially supported)*/\n    pub const miopenBFloat16: miopenDataType_t = miopenDataType_t(5);\n}\nimpl miopenDataType_t {\n    ///< 64-bit floating point (Partially supported)\n    pub const miopenDouble: miopenDataType_t = miopenDataType_t(6);\n}\nimpl miopenDataType_t {\n    pub const miopenFloat8: miopenDataType_t = miopenDataType_t(7);\n}\nimpl miopenDataType_t {\n    pub const miopenBFloat8: miopenDataType_t = miopenDataType_t(8);\n}\nimpl miopenDataType_t {\n    pub const miopenInt64: miopenDataType_t = miopenDataType_t(9);\n}\n#[repr(transparent)]\n/** @ingroup tensor\n @enum miopenDataType_t\n MIOpen floating point datatypes. Both 32-bit and 16-bit floats are supported in MIOpen.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenDataType_t(pub ::core::ffi::c_uint);\nimpl miopenTensorLayout_t {\n    ///< NCHW memory layout (Fully supported)\n    pub const miopenTensorNCHW: miopenTensorLayout_t = miopenTensorLayout_t(0);\n}\nimpl miopenTensorLayout_t {\n    ///< NHWC memory layout (Fully supported)\n    pub const miopenTensorNHWC: miopenTensorLayout_t = miopenTensorLayout_t(1);\n}\nimpl miopenTensorLayout_t {\n    ///< CHWN memory layout (Not supported)\n    pub const miopenTensorCHWN: miopenTensorLayout_t = miopenTensorLayout_t(2);\n}\nimpl miopenTensorLayout_t {\n    ///< NCHWc4 memory layout (Partially supported)\n    pub const miopenTensorNCHWc4: miopenTensorLayout_t = miopenTensorLayout_t(3);\n}\nimpl miopenTensorLayout_t {\n    ///< NCHWc8 memory layout (Partially supported)\n    pub const miopenTensorNCHWc8: miopenTensorLayout_t = miopenTensorLayout_t(4);\n}\nimpl miopenTensorLayout_t {\n    ///< CHWNc4 memory layout (Partially supported)\n    pub const miopenTensorCHWNc4: miopenTensorLayout_t = miopenTensorLayout_t(5);\n}\nimpl miopenTensorLayout_t {\n    ///< CHWNc8 memory layout (Partially supported)\n    pub const miopenTensorCHWNc8: miopenTensorLayout_t = miopenTensorLayout_t(6);\n}\nimpl miopenTensorLayout_t {\n    ///< NCDHW memory layout (Fully supported)\n    pub const miopenTensorNCDHW: miopenTensorLayout_t = miopenTensorLayout_t(7);\n}\nimpl miopenTensorLayout_t {\n    ///< NCDHW memory layout (Fully supported)\n    pub const miopenTensorNDHWC: miopenTensorLayout_t = miopenTensorLayout_t(8);\n}\n#[repr(transparent)]\n/** @ingroup tensor\n @enum miopenTensorLayout_t\n Tensor layouts supported by MIOpen.\n miopenTensorCHWNc4 and miopenTensorCHWNc8 layout only support weight tensor.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenTensorLayout_t(pub ::core::ffi::c_uint);\nimpl miopenIndexType_t {\n    ///<  8-bit unsigned\n    pub const miopenIndexUint8: miopenIndexType_t = miopenIndexType_t(0);\n}\nimpl miopenIndexType_t {\n    ///< 16-bit unsigned\n    pub const miopenIndexUint16: miopenIndexType_t = miopenIndexType_t(1);\n}\nimpl miopenIndexType_t {\n    ///< 32-bit unsigned\n    pub const miopenIndexUint32: miopenIndexType_t = miopenIndexType_t(2);\n}\nimpl miopenIndexType_t {\n    ///< 64-bit unsigned\n    pub const miopenIndexUint64: miopenIndexType_t = miopenIndexType_t(3);\n}\n#[repr(transparent)]\n/** @ingroup pooling\n @enum miopenIndexType_t\n MIOpen index datatypes.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenIndexType_t(pub ::core::ffi::c_uint);\nimpl miopenTensorOp_t {\n    ///< Add tensors element-wise\n    pub const miopenTensorOpAdd: miopenTensorOp_t = miopenTensorOp_t(0);\n}\nimpl miopenTensorOp_t {\n    ///< Multiply two tensors element-wise\n    pub const miopenTensorOpMul: miopenTensorOp_t = miopenTensorOp_t(1);\n}\nimpl miopenTensorOp_t {\n    ///< Minimum of tensor element pairs\n    pub const miopenTensorOpMin: miopenTensorOp_t = miopenTensorOp_t(2);\n}\nimpl miopenTensorOp_t {\n    ///< Maximum of tensor element pairs\n    pub const miopenTensorOpMax: miopenTensorOp_t = miopenTensorOp_t(3);\n}\n#[repr(transparent)]\n/** @ingroup tensor\n @enum miopenTensorOp_t\n Element-wise tensor operation modes*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenTensorOp_t(pub ::core::ffi::c_uint);\nimpl miopenConvolutionMode_t {\n    ///< Cross-Correlation convolution\n    pub const miopenConvolution: miopenConvolutionMode_t = miopenConvolutionMode_t(0);\n}\nimpl miopenConvolutionMode_t {\n    ///< Transpose convolutions -- deconvolution\n    pub const miopenTranspose: miopenConvolutionMode_t = miopenConvolutionMode_t(1);\n}\nimpl miopenConvolutionMode_t {\n    ///< Deprecated Group convolution legacy, ToBe Removed\n    pub const miopenGroupConv: miopenConvolutionMode_t = miopenConvolutionMode_t(2);\n}\nimpl miopenConvolutionMode_t {\n    ///< Deprecated Depthwise convolution legacy, ToBe Removed\n    pub const miopenDepthwise: miopenConvolutionMode_t = miopenConvolutionMode_t(3);\n}\n#[repr(transparent)]\n/** @ingroup convolutions\n  @enum miopenConvolutionMode_t\n Convolution mode selection for convolution layer preference.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenConvolutionMode_t(pub ::core::ffi::c_uint);\nimpl miopenPaddingMode_t {\n    ///< MIOPEN Default Padding\n    pub const miopenPaddingDefault: miopenPaddingMode_t = miopenPaddingMode_t(0);\n}\nimpl miopenPaddingMode_t {\n    ///< Tensorflow SAME Padding\n    pub const miopenPaddingSame: miopenPaddingMode_t = miopenPaddingMode_t(1);\n}\nimpl miopenPaddingMode_t {\n    ///< Tensorflow VALID Padding\n    pub const miopenPaddingValid: miopenPaddingMode_t = miopenPaddingMode_t(2);\n}\n#[repr(transparent)]\n/** @ingroup padding\n  @enum miopenPaddingMode_t\n Padding mode selection for convolution/Pooling layer preference*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenPaddingMode_t(pub ::core::ffi::c_uint);\nimpl miopenPoolingMode_t {\n    ///< Maximum pooling\n    pub const miopenPoolingMax: miopenPoolingMode_t = miopenPoolingMode_t(0);\n}\nimpl miopenPoolingMode_t {\n    ///< Average pooling\n    pub const miopenPoolingAverage: miopenPoolingMode_t = miopenPoolingMode_t(1);\n}\nimpl miopenPoolingMode_t {\n    ///< Inclusive Average pooling\n    pub const miopenPoolingAverageInclusive: miopenPoolingMode_t = miopenPoolingMode_t(\n        2,\n    );\n}\n#[repr(transparent)]\n/** @ingroup pooling\n @enum miopenPoolingMode_t\n Pooling layer mode*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenPoolingMode_t(pub ::core::ffi::c_uint);\nimpl miopenPoolingWorkspaceIndexMode_t {\n    ///< Use mask indices, 2D pooling only\n    pub const miopenPoolingWorkspaceIndexMask: miopenPoolingWorkspaceIndexMode_t = miopenPoolingWorkspaceIndexMode_t(\n        0,\n    );\n}\nimpl miopenPoolingWorkspaceIndexMode_t {\n    ///< Use image indices\n    pub const miopenPoolingWorkspaceIndexImage: miopenPoolingWorkspaceIndexMode_t = miopenPoolingWorkspaceIndexMode_t(\n        1,\n    );\n}\n#[repr(transparent)]\n/** @ingroup pooling\n @enum miopenPoolingWorkspaceIndexMode_t\n Pooling layer workspace index mode. miopenPoolingWorkspaceIndexMask mode records indices\n indicating the max values' positions in the filter/mask. miopenPoolingWorkspaceIndexImage mode\n records indices indicating the max values' positions in the image.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenPoolingWorkspaceIndexMode_t(pub ::core::ffi::c_uint);\nimpl miopenLRNMode_t {\n    ///< Channel independent\n    pub const miopenLRNWithinChannel: miopenLRNMode_t = miopenLRNMode_t(0);\n}\nimpl miopenLRNMode_t {\n    ///< Cross Channel\n    pub const miopenLRNCrossChannel: miopenLRNMode_t = miopenLRNMode_t(1);\n}\n#[repr(transparent)]\n/** @ingroup LRN\n @enum miopenLRNMode_t\n Local Response Normalization layer mode*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenLRNMode_t(pub ::core::ffi::c_uint);\nimpl miopenNormMode_t {\n    ///< initialized to ones for weights and zeros for biases\n    pub const MIOPEN_ELEMENTWISE_AFFINE: miopenNormMode_t = miopenNormMode_t(0);\n}\nimpl miopenNormMode_t {\n    pub const MIOPEN_WEIGHT_BIAS: miopenNormMode_t = miopenNormMode_t(1);\n}\nimpl miopenNormMode_t {\n    pub const MIOPEN_ELEMENTWISE_AFFINE_FUSED_ADD: miopenNormMode_t = miopenNormMode_t(\n        2,\n    );\n}\nimpl miopenNormMode_t {\n    /**< learnable weights and biases of the module of shape\nnormalized_shape in addlayernorm*/\n    pub const MIOPEN_WEIGHT_BIAS_FUSED_ADD: miopenNormMode_t = miopenNormMode_t(3);\n}\nimpl miopenNormMode_t {\n    pub const MIOPEN_ELEMENTWISE_AFFINE_T5: miopenNormMode_t = miopenNormMode_t(4);\n}\nimpl miopenNormMode_t {\n    /**< learnable weights and biases of the module of shape\nnormalized_shape in t5layernorm*/\n    pub const MIOPEN_WEIGHT_BIAS_T5: miopenNormMode_t = miopenNormMode_t(5);\n}\n#[repr(transparent)]\n/** @ingroup layernorm\n @enum miopenNormMode_t\n LayerNorm mode*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenNormMode_t(pub ::core::ffi::c_uint);\nimpl miopenBatchNormMode_t {\n    ///< Element-wise normalization for fully connected layer\n    pub const miopenBNPerActivation: miopenBatchNormMode_t = miopenBatchNormMode_t(0);\n}\nimpl miopenBatchNormMode_t {\n    ///< Mini-batch spatial normalization for convolutional layers\n    pub const miopenBNSpatial: miopenBatchNormMode_t = miopenBatchNormMode_t(1);\n}\n#[repr(transparent)]\n/** @ingroup batchnorm\n @enum miopenBatchNormMode_t\n Batch Normalization layer mode*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenBatchNormMode_t(pub ::core::ffi::c_uint);\nimpl miopenActivationMode_t {\n    ///< No activation, pass through the data\n    pub const miopenActivationPASTHRU: miopenActivationMode_t = miopenActivationMode_t(\n        0,\n    );\n}\nimpl miopenActivationMode_t {\n    ///< Sigmoid function: \\f$1 / (1 + e^{-x})\\f$\n    pub const miopenActivationLOGISTIC: miopenActivationMode_t = miopenActivationMode_t(\n        1,\n    );\n}\nimpl miopenActivationMode_t {\n    ///< Tanh activation \\f$ \\beta * tanh( \\alpha * x) \\f$\n    pub const miopenActivationTANH: miopenActivationMode_t = miopenActivationMode_t(2);\n}\nimpl miopenActivationMode_t {\n    ///< Rectified Linear Unit \\f$ max(0, x) \\f$\n    pub const miopenActivationRELU: miopenActivationMode_t = miopenActivationMode_t(3);\n}\nimpl miopenActivationMode_t {\n    ///< \\f$log(1 + e^x)\\f$\n    pub const miopenActivationSOFTRELU: miopenActivationMode_t = miopenActivationMode_t(\n        4,\n    );\n}\nimpl miopenActivationMode_t {\n    ///< Absolute value \\f$abs(x)\\f$\n    pub const miopenActivationABS: miopenActivationMode_t = miopenActivationMode_t(5);\n}\nimpl miopenActivationMode_t {\n    ///< Scaled and shifted power \\f$(\\alpha + \\beta * x)^{gamma}\\f$\n    pub const miopenActivationPOWER: miopenActivationMode_t = miopenActivationMode_t(6);\n}\nimpl miopenActivationMode_t {\n    pub const miopenActivationCLIPPEDRELU: miopenActivationMode_t = miopenActivationMode_t(\n        7,\n    );\n}\nimpl miopenActivationMode_t {\n    pub const miopenActivationLEAKYRELU: miopenActivationMode_t = miopenActivationMode_t(\n        8,\n    );\n}\nimpl miopenActivationMode_t {\n    pub const miopenActivationELU: miopenActivationMode_t = miopenActivationMode_t(9);\n}\n#[repr(transparent)]\n/** @ingroup activation\n @enum miopenActivationMode_t\n Activation layer modes*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenActivationMode_t(pub ::core::ffi::c_uint);\nimpl miopenSoftmaxAlgorithm_t {\n    ///< straightforward softmax\n    pub const MIOPEN_SOFTMAX_FAST: miopenSoftmaxAlgorithm_t = miopenSoftmaxAlgorithm_t(\n        0,\n    );\n}\nimpl miopenSoftmaxAlgorithm_t {\n    ///< scaled softmax by maximum value in input domain\n    pub const MIOPEN_SOFTMAX_ACCURATE: miopenSoftmaxAlgorithm_t = miopenSoftmaxAlgorithm_t(\n        1,\n    );\n}\nimpl miopenSoftmaxAlgorithm_t {\n    ///< log softmax\n    pub const MIOPEN_SOFTMAX_LOG: miopenSoftmaxAlgorithm_t = miopenSoftmaxAlgorithm_t(2);\n}\n#[repr(transparent)]\n/** @ingroup softmax\n @enum miopenSoftmaxAlgorithm_t\n Softmax implementation algorithms*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenSoftmaxAlgorithm_t(pub ::core::ffi::c_uint);\nimpl miopenSoftmaxMode_t {\n    ///< compute per image (N) across C, H, W\n    pub const MIOPEN_SOFTMAX_MODE_INSTANCE: miopenSoftmaxMode_t = miopenSoftmaxMode_t(0);\n}\nimpl miopenSoftmaxMode_t {\n    pub const MIOPEN_SOFTMAX_MODE_CHANNEL: miopenSoftmaxMode_t = miopenSoftmaxMode_t(1);\n}\n#[repr(transparent)]\n/** @ingroup softmax\n @enum miopenSoftmaxMode_t\n Softmax modes*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenSoftmaxMode_t(pub ::core::ffi::c_uint);\nimpl miopenReduceTensorOp_t {\n    ///< the operation is adding the values of the reduced elements\n    pub const MIOPEN_REDUCE_TENSOR_ADD: miopenReduceTensorOp_t = miopenReduceTensorOp_t(\n        0,\n    );\n}\nimpl miopenReduceTensorOp_t {\n    pub const MIOPEN_REDUCE_TENSOR_MUL: miopenReduceTensorOp_t = miopenReduceTensorOp_t(\n        1,\n    );\n}\nimpl miopenReduceTensorOp_t {\n    pub const MIOPEN_REDUCE_TENSOR_MIN: miopenReduceTensorOp_t = miopenReduceTensorOp_t(\n        2,\n    );\n}\nimpl miopenReduceTensorOp_t {\n    pub const MIOPEN_REDUCE_TENSOR_MAX: miopenReduceTensorOp_t = miopenReduceTensorOp_t(\n        3,\n    );\n}\nimpl miopenReduceTensorOp_t {\n    pub const MIOPEN_REDUCE_TENSOR_AMAX: miopenReduceTensorOp_t = miopenReduceTensorOp_t(\n        4,\n    );\n}\nimpl miopenReduceTensorOp_t {\n    pub const MIOPEN_REDUCE_TENSOR_AVG: miopenReduceTensorOp_t = miopenReduceTensorOp_t(\n        5,\n    );\n}\nimpl miopenReduceTensorOp_t {\n    pub const MIOPEN_REDUCE_TENSOR_NORM1: miopenReduceTensorOp_t = miopenReduceTensorOp_t(\n        6,\n    );\n}\nimpl miopenReduceTensorOp_t {\n    /**< the operation is getting the square root of the sum of\nsquares of the reduced elements*/\n    pub const MIOPEN_REDUCE_TENSOR_NORM2: miopenReduceTensorOp_t = miopenReduceTensorOp_t(\n        7,\n    );\n}\n#[repr(transparent)]\n/** @ingroup TensorReduce\n @enum miopenReduceTensorOp_t\n Tensor Reduction operation types*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenReduceTensorOp_t(pub ::core::ffi::c_uint);\nimpl miopenNanPropagation_t {\n    ///< does not propagate Nan number\n    pub const MIOPEN_NOT_PROPAGATE_NAN: miopenNanPropagation_t = miopenNanPropagation_t(\n        0,\n    );\n}\nimpl miopenNanPropagation_t {\n    ///< propagate the Nan number by the Reduction operation\n    pub const MIOPEN_PROPAGATE_NAN: miopenNanPropagation_t = miopenNanPropagation_t(1);\n}\n#[repr(transparent)]\n/** @ingroup TensorReduce\n @enum miopenReduceTensorOp_t\n Nan numbers propagation modes*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenNanPropagation_t(pub ::core::ffi::c_uint);\nimpl miopenReduceTensorIndices_t {\n    ///< Does not compuate indices\n    pub const MIOPEN_REDUCE_TENSOR_NO_INDICES: miopenReduceTensorIndices_t = miopenReduceTensorIndices_t(\n        0,\n    );\n}\nimpl miopenReduceTensorIndices_t {\n    ///< Compute the relative, flatted indices\n    pub const MIOPEN_REDUCE_TENSOR_FLATTENED_INDICES: miopenReduceTensorIndices_t = miopenReduceTensorIndices_t(\n        1,\n    );\n}\n#[repr(transparent)]\n/** @ingroup TensorReduce\n @enum miopenReduceTensorIndices_t\n Reduction Indices computation modes*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenReduceTensorIndices_t(pub ::core::ffi::c_uint);\nimpl miopenIndicesType_t {\n    ///< 32-bit unsigned integer indices\n    pub const MIOPEN_32BIT_INDICES: miopenIndicesType_t = miopenIndicesType_t(0);\n}\nimpl miopenIndicesType_t {\n    ///< 64-bit unsigned integer indices\n    pub const MIOPEN_64BIT_INDICES: miopenIndicesType_t = miopenIndicesType_t(1);\n}\nimpl miopenIndicesType_t {\n    ///< 16-bit unsigned integer indices\n    pub const MIOPEN_16BIT_INDICES: miopenIndicesType_t = miopenIndicesType_t(2);\n}\nimpl miopenIndicesType_t {\n    ///< 8-bit unsigned integer indices\n    pub const MIOPEN_8BIT_INDICES: miopenIndicesType_t = miopenIndicesType_t(3);\n}\n#[repr(transparent)]\n/** @ingroup TensorReduce\n @enum miopenIndicesType_t\n Reduction Indices types*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenIndicesType_t(pub ::core::ffi::c_uint);\nimpl miopenConvolutionAttrib_t {\n    pub const MIOPEN_CONVOLUTION_ATTRIB_FP16_ALT_IMPL: miopenConvolutionAttrib_t = miopenConvolutionAttrib_t(\n        0,\n    );\n}\nimpl miopenConvolutionAttrib_t {\n    pub const MIOPEN_CONVOLUTION_ATTRIB_DETERMINISTIC: miopenConvolutionAttrib_t = miopenConvolutionAttrib_t(\n        1,\n    );\n}\nimpl miopenConvolutionAttrib_t {\n    pub const MIOPEN_CONVOLUTION_ATTRIB_FP8_ROUNDING_MODE: miopenConvolutionAttrib_t = miopenConvolutionAttrib_t(\n        2,\n    );\n}\n#[repr(transparent)]\n/** @ingroup convolutions\n  @enum miopenConvolutionAttrib_t\n Attribute for convolution descriptor, used for alternating the convolution behavior*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenConvolutionAttrib_t(pub ::core::ffi::c_uint);\nimpl miopenConvolutionFindMode_t {\n    pub const miopenConvolutionFindModeNormal: miopenConvolutionFindMode_t = miopenConvolutionFindMode_t(\n        1,\n    );\n}\nimpl miopenConvolutionFindMode_t {\n    pub const miopenConvolutionFindModeFast: miopenConvolutionFindMode_t = miopenConvolutionFindMode_t(\n        2,\n    );\n}\nimpl miopenConvolutionFindMode_t {\n    pub const miopenConvolutionFindModeHybrid: miopenConvolutionFindMode_t = miopenConvolutionFindMode_t(\n        3,\n    );\n}\nimpl miopenConvolutionFindMode_t {\n    pub const miopenConvolutionFindModeDynamicHybrid: miopenConvolutionFindMode_t = miopenConvolutionFindMode_t(\n        5,\n    );\n}\nimpl miopenConvolutionFindMode_t {\n    pub const miopenConvolutionFindModeDefault: miopenConvolutionFindMode_t = miopenConvolutionFindMode_t(\n        5,\n    );\n}\n#[repr(transparent)]\n/** @ingroup convolutions\n  @enum miopenConvolutionFindMode_t\n Findmode for convolution descriptor, used for changing the find behavior when calling\n miopenFindConvolutionForwardAlgorithm(), miopenFindConvolutionBackwardDataAlgorithm(), or\n miopenFindConvolutionBackwardWeightsAlgorithm().*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenConvolutionFindMode_t(pub ::core::ffi::c_uint);\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Create a Tensor Descriptor\n\n API for creating an uninitialized tensor descriptor.\n @param tensorDesc Pointer to a tensor descriptor type (output)\n @return           miopenStatus_t*/\n    pub fn miopenCreateTensorDescriptor(\n        tensorDesc: *mut miopenTensorDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set shape of 4D tensor\n\n Interface for setting 4-D tensor shape. MIOpen currently implements NCHW and NHWC layout.\n\n @param tensorDesc Tensor descriptor (input/output)\n @param dataType   MIOpen datatype (input)\n @param n          Mini-batch size (input)\n @param c          Number of channels (input)\n @param h          Data height dimension size (input)\n @param w          Data width dimension size (input)\n @return           miopenStatus_t*/\n    pub fn miopenSet4dTensorDescriptor(\n        tensorDesc: miopenTensorDescriptor_t,\n        dataType: miopenDataType_t,\n        n: ::core::ffi::c_int,\n        c: ::core::ffi::c_int,\n        h: ::core::ffi::c_int,\n        w: ::core::ffi::c_int,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set shape of ND tensor with specific layout\n\n Interface for setting N-D packed tensor shape. This interface support NHWC, NCHW, NCHWc*, CHWNc*\n @param tensorDesc   Tensor descriptor (input/output)\n @param dataType     MIOpen datatype (input)\n @param tensorLayout Tensor layout (input)\n @param lens         Tensor dimensions (input)\n @param num_lens     Tensor dimension size (input)\n @return             miopenStatus_t*/\n    pub fn miopenSetNdTensorDescriptorWithLayout(\n        tensorDesc: miopenTensorDescriptor_t,\n        dataType: miopenDataType_t,\n        tensorLayout: miopenTensorLayout_t,\n        lens: *const ::core::ffi::c_int,\n        num_lens: ::core::ffi::c_int,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set shape and stride of 4D tensor\n\n Interface for setting 4-D tensor shape and stride. It allows to create the non-packed tensor.\n A non-packed tensor refers to the tensor where the elements are not compressed or packed in any\n specific way. Each element in the tensor is stored individually, and there is no special\n compression applied to the storage.\n\n @param tensorDesc Tensor descriptor (input/output)\n @param dataType   MIOpen datatype (input)\n @param n          Mini-batch size (input)\n @param c          Number of channels (input)\n @param h          Data height dimension size (input)\n @param w          Data width dimension size (input)\n @param nStride    Mini-batch dimension stride (input)\n @param cStride    Channel dimension stride (input)\n @param hStride    Height dimension stride (input)\n @param wStride    Width dimension stride (input)\n @return           miopenStatus_t*/\n    pub fn miopenSet4dTensorDescriptorEx(\n        tensorDesc: miopenTensorDescriptor_t,\n        dataType: miopenDataType_t,\n        n: ::core::ffi::c_int,\n        c: ::core::ffi::c_int,\n        h: ::core::ffi::c_int,\n        w: ::core::ffi::c_int,\n        nStride: ::core::ffi::c_int,\n        cStride: ::core::ffi::c_int,\n        hStride: ::core::ffi::c_int,\n        wStride: ::core::ffi::c_int,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get the details of the tensor descriptor\n\n Interface to query the 4-D tensor shape.\n\n @param tensorDesc Tensor descriptor (input)\n @param dataType   MIOpen datatype (output)\n @param n          Mini-batch size (output)\n @param c          Number of channels (output)\n @param h          Data height dimension size (output)\n @param w          Data width dimension size (output)\n @param nStride    Mini-batch dimension stride (output)\n @param cStride    Channel dimension stride (output)\n @param hStride    Height dimension stride (output)\n @param wStride    Width dimension stride (output)\n @return           miopenStatus_t*/\n    pub fn miopenGet4dTensorDescriptor(\n        tensorDesc: miopenTensorDescriptor_t,\n        dataType: *mut miopenDataType_t,\n        n: *mut ::core::ffi::c_int,\n        c: *mut ::core::ffi::c_int,\n        h: *mut ::core::ffi::c_int,\n        w: *mut ::core::ffi::c_int,\n        nStride: *mut ::core::ffi::c_int,\n        cStride: *mut ::core::ffi::c_int,\n        hStride: *mut ::core::ffi::c_int,\n        wStride: *mut ::core::ffi::c_int,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set shape of N-dimensional tensor\n\n Interface for setting non-packed tensor shape.\n @param tensorDesc   Tensor descriptor (input/output)\n @param dataType     MIOpen datatype (input)\n @param nbDims       Number of dimensions in the dimsA array (input)\n @param dimsA        Array containing the size of dimensions (input)\n @param stridesA     Array containing the size of stride (input)\n @return             miopenStatus_t*/\n    pub fn miopenSetTensorDescriptor(\n        tensorDesc: miopenTensorDescriptor_t,\n        dataType: miopenDataType_t,\n        nbDims: ::core::ffi::c_int,\n        dimsA: *const ::core::ffi::c_int,\n        stridesA: *const ::core::ffi::c_int,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /// @copydoc miopenSetTensorDescriptor()\n    pub fn miopenSetTensorDescriptorV2(\n        tensorDesc: miopenTensorDescriptor_t,\n        dataType: miopenDataType_t,\n        nbDims: ::core::ffi::c_int,\n        dimsA: *const usize,\n        stridesA: *const usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set the tensor cast type\n\n  For tensors where the cast_type attribute is set, the tensor elements would be converted to the\n target type before the target operation is applied. Currently, only supported for convolution\n operations targeting the FP8 datatype\n\n  @param tensorDesc Tensor descriptor type (input)\n  @param cast_type  MIOpen datatype (input)*/\n    pub fn miopenSetTensorCastType(\n        tensorDesc: miopenTensorDescriptor_t,\n        cast_type: miopenDataType_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set shape of N-dimensional tensor\n\n Interface for querying tensor size. MIOpen has support for 1, 2, 3, 4, 5 dimensional tensor of\n layout.\n @param tensorDesc   Tensor descriptor (input)\n @param size         number of elements in tensor described by the descriptor (output)\n @return             miopenStatus_t*/\n    pub fn miopenGetTensorDescriptorSize(\n        tensorDesc: miopenTensorDescriptor_t,\n        size: *mut ::core::ffi::c_int,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get the details of the N-dimensional tensor descriptor.\n\n @param tensorDesc Tensor descriptor (input)\n @param dataType   MIOpen datatype (output)\n @param dimsA      Array containing the size of dimensions (output)\n @param stridesA   Array containing the size of stride (output)\n @return           miopenStatus_t*/\n    pub fn miopenGetTensorDescriptor(\n        tensorDesc: miopenTensorDescriptor_t,\n        dataType: *mut miopenDataType_t,\n        dimsA: *mut ::core::ffi::c_int,\n        stridesA: *mut ::core::ffi::c_int,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Destroys the tensor descriptor\n\n @param tensorDesc Tensor descriptor (input)\n @return           miopenStatus_t*/\n    pub fn miopenDestroyTensorDescriptor(\n        tensorDesc: miopenTensorDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Create a Tensor Descriptor for sequence data\n\n API for creating an uninitialized sequence data tensor descriptor.\n @param tensorDesc Pointer to a sequence data tensor descriptor type (output)\n @return           miopenStatus_t*/\n    pub fn miopenCreateSeqTensorDescriptor(\n        tensorDesc: *mut miopenSeqTensorDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Destroys the sequence data tensor descriptor\n\n @param tensorDesc Tensor descriptor (input)\n @return           miopenStatus_t*/\n    pub fn miopenDestroySeqTensorDescriptor(\n        tensorDesc: miopenSeqTensorDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute element-wise tensor operations\n\n This function implements: \\f$ C = op ( alpha1[0] * A, alpha2[0] * B ) + beta[0] * C \\f$\n\n For Forward Bias one can also use, miopenConvolutionForwardBias()\n\n @param handle     MIOpen handle (input)\n @param tensorOp   Operation from miopenTensorOp_t (input)\n @param alpha1     Tensor A's floating point scaling factor, allocated on the host (input)\n @param aDesc      Tensor descriptor for tensor A (input)\n @param A          Tensor A (input)\n @param alpha2     Tensor B's floating point scaling factor, allocated on the host (input)\n @param bDesc      Tensor descriptor for tensor B (input)\n @param B          Tensor B (input)\n @param beta       Tensor C's floating point scaling factor, allocated on the host (input)\n @param cDesc      Tensor descriptor for tensor C (input)\n @param C          Tensor C (input and output)\n @return           miopenStatus_t*/\n    pub fn miopenOpTensor(\n        handle: miopenHandle_t,\n        tensorOp: miopenTensorOp_t,\n        alpha1: *const ::core::ffi::c_void,\n        aDesc: miopenTensorDescriptor_t,\n        A: *const ::core::ffi::c_void,\n        alpha2: *const ::core::ffi::c_void,\n        bDesc: miopenTensorDescriptor_t,\n        B: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        cDesc: miopenTensorDescriptor_t,\n        C: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Fills a tensor with a single value.\n\n Supported datatypes are fp32, fp16, and bfp16\n\n @param handle     MIOpen handle (input)\n @param yDesc      Tensor descriptor for tensor y (input)\n @param y          Tensor y (input)\n @param alpha      Pointer to fill value (input)\n @return           miopenStatus_t*/\n    pub fn miopenSetTensor(\n        handle: miopenHandle_t,\n        yDesc: miopenTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        alpha: *const ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Scales all elements in a tensor by a single value.\n\n Supported datatypes are fp32 and fp16\n\n @param handle     MIOpen handle (input)\n @param yDesc      Tensor descriptor for tensor y (input)\n @param y          Tensor y (input and output)\n @param alpha      Floating point scaling factor, allocated on the host (input)\n @return           miopenStatus_t*/\n    pub fn miopenScaleTensor(\n        handle: miopenHandle_t,\n        yDesc: miopenTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        alpha: *const ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns number of bytes associated with tensor descriptor\n\n @param tensorDesc Tensor descriptor (input)\n @param numBytes   Number of bytes associated with tensor descriptor (output)\n @return           miopenStatus_t*/\n    pub fn miopenGetTensorNumBytes(\n        tensorDesc: miopenTensorDescriptor_t,\n        numBytes: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Copies one tensor to another tensor with a different layout/scale.\n\n This function implements:\n 1. \\f$ Y = alpha * X + beta * Y \\f$ for fp32 and fp16 datatype\n 2. Vectorize/de-vectorize along channel dimension C for int8 datatype\n\n Currently this is used for transforming from int8 to int8x4 vector datatypes\n\n @param handle     MIOpen handle (input)\n @param alpha      Floating point scaling factor, allocated on the host (input)\n @param xDesc      Source Tensor descriptor for tensor x (input)\n @param x          Source Tensor x (input)\n @param beta       Floating point scaling factor, allocated on the host (input)\n @param yDesc      Destination Tensor descriptor for tensor y (input)\n @param y          Destination Tensor y (output)\n @return           miopenStatus_t*/\n    pub fn miopenTransformTensor(\n        handle: miopenHandle_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        yDesc: miopenTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a convolution layer descriptor\n\n @param convDesc   Convolution layer descriptor\n @return           miopenStatus_t*/\n    pub fn miopenCreateConvolutionDescriptor(\n        convDesc: *mut miopenConvolutionDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a 2-D convolution layer descriptor\n\n For group/depthwise convolution dilation height and width, only a dilation value of 1 is\n supported.\n\n @param convDesc   Convolution layer descriptor (output)\n @param c_mode     Convolutional mode (input)\n @param pad_h      Height input data padding (input)\n @param pad_w      Width input data padding (input)\n @param stride_h   Stride for the height of input data (input)\n @param stride_w   Stride for the width of input data (input)\n @param dilation_h Dilation height (input)\n @param dilation_w Dilation width (input)\n @return           miopenStatus_t*/\n    pub fn miopenInitConvolutionDescriptor(\n        convDesc: miopenConvolutionDescriptor_t,\n        c_mode: miopenConvolutionMode_t,\n        pad_h: ::core::ffi::c_int,\n        pad_w: ::core::ffi::c_int,\n        stride_h: ::core::ffi::c_int,\n        stride_w: ::core::ffi::c_int,\n        dilation_h: ::core::ffi::c_int,\n        dilation_w: ::core::ffi::c_int,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a N-dimensional convolution layer descriptor\n\n @param convDesc      Convolution layer descriptor (output)\n @param spatialDim    Convolutional spatial dimension (input)\n @param padA          Array of input data padding (input)\n @param strideA       Array of convolution stride (input)\n @param dilationA     Array of convolution dilation (input)\n @param c_mode        Convolutional mode (input)\n @return              miopenStatus_t*/\n    pub fn miopenInitConvolutionNdDescriptor(\n        convDesc: miopenConvolutionDescriptor_t,\n        spatialDim: ::core::ffi::c_int,\n        padA: *const ::core::ffi::c_int,\n        strideA: *const ::core::ffi::c_int,\n        dilationA: *const ::core::ffi::c_int,\n        c_mode: miopenConvolutionMode_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Retrieves the spatial dimension of a convolution layer descriptor\n\n @param convDesc              Convolution layer descriptor (input)\n @param spatialDim            Spatial dimension of convolution descriptor (output)\n @return                      miopenStatus_t*/\n    pub fn miopenGetConvolutionSpatialDim(\n        convDesc: miopenConvolutionDescriptor_t,\n        spatialDim: *mut ::core::ffi::c_int,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Retrieves a 2-D convolution layer descriptor's details\n\n For group/depthwise convolution dilation height and width, only a dilation value of 1 is\n supported.\n\n @param convDesc   Convolution layer descriptor (input)\n @param c_mode     Convolutional mode (output)\n @param pad_h      Height input data padding (output)\n @param pad_w      Width input data padding (output)\n @param stride_h   Stride for the height of input data (output)\n @param stride_w   Stride for the width of input data (output)\n @param dilation_h Dilation height (output)\n @param dilation_w Dilation width (output)\n @return           miopenStatus_t*/\n    pub fn miopenGetConvolutionDescriptor(\n        convDesc: miopenConvolutionDescriptor_t,\n        c_mode: *mut miopenConvolutionMode_t,\n        pad_h: *mut ::core::ffi::c_int,\n        pad_w: *mut ::core::ffi::c_int,\n        stride_h: *mut ::core::ffi::c_int,\n        stride_w: *mut ::core::ffi::c_int,\n        dilation_h: *mut ::core::ffi::c_int,\n        dilation_w: *mut ::core::ffi::c_int,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Retrieves a N-dimensional convolution layer descriptor's details\n\n @param convDesc               Convolution layer descriptor (input)\n @param requestedSpatialDim    Expected convolution spatial dimension (intput)\n @param spatialDim             Convolutional spatial dimension (output)\n @param padA                   Array of input data padding (output)\n @param strideA                Array of convolution stride (output)\n @param dilationA              Array of convolution dilation (output)\n @param c_mode                 Convolutional mode (output)\n @return                       miopenStatus_t*/\n    pub fn miopenGetConvolutionNdDescriptor(\n        convDesc: miopenConvolutionDescriptor_t,\n        requestedSpatialDim: ::core::ffi::c_int,\n        spatialDim: *mut ::core::ffi::c_int,\n        padA: *mut ::core::ffi::c_int,\n        strideA: *mut ::core::ffi::c_int,\n        dilationA: *mut ::core::ffi::c_int,\n        c_mode: *mut miopenConvolutionMode_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get the number of groups to be used in Group/Depthwise convolution\n\n @param convDesc   Convolution layer descriptor (input)\n @param groupCount Pointer to number of groups in group/depthwise convolution (output)\n @return           miopenStatus_t*/\n    pub fn miopenGetConvolutionGroupCount(\n        convDesc: miopenConvolutionDescriptor_t,\n        groupCount: *mut ::core::ffi::c_int,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set the number of groups to be used in Group/Depthwise convolution\n\n Must be called before all computational APIs of group/depthwise convolution, it is preferable to\n call miopenInitConvolutionDescriptor() first, then miopenSetConvolutionGroupCount() to fully\n initialize group convolutions. Both Convolution Mode and Transpose Convolution Mode support\n group/depthwise convolution. To run depthwise convolution, set groupCount value equal to number\n of channels.\n\n @param convDesc   Convolution layer descriptor (output)\n @param groupCount      number of groups, in depthwise conv using filter_number/channel_multiplier\n (input)\n @return           miopenStatus_t*/\n    pub fn miopenSetConvolutionGroupCount(\n        convDesc: miopenConvolutionDescriptor_t,\n        groupCount: ::core::ffi::c_int,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set the output padding to be used in 2-D Transpose convolution\n\n This function is optional for initialization of Transpose convolution. If applicable, it must be\n called before all computational APIs of Transpose convolution. It is preferable to call\n miopenInitConvolutionDescriptor() first, then miopenSetTransposeConvOutputPadding() to fully\n initialize transpose convolutions.\n\n @param convDesc   Convolution layer descriptor (output)\n @param adj_h      output padding for the height of output data (input)\n @param adj_w      output padding for the width of output data (input)\n @return           miopenStatus_t*/\n    pub fn miopenSetTransposeConvOutputPadding(\n        convDesc: miopenConvolutionDescriptor_t,\n        adj_h: ::core::ffi::c_int,\n        adj_w: ::core::ffi::c_int,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set the output padding to be used in N-dimensional Transpose convolution\n\n This function is optional for initialization of Transpose convolution. If applicable, it must be\n called before all computational APIs of Transpose convolution. It is preferable to call\n miopenInitConvolutionNdDescriptor() first, then miopenSetTransposeConvNdOutputPadding() to fully\n initialize transpose convolutions. Currently, 2-D and 3-D convolutions are supported.\n\n @param convDesc      Convolution layer descriptor (output)\n @param spatialDim    Convolutional spatial dimension (input)\n @param adjA          array of output padding for output data (input)\n @return              miopenStatus_t*/\n    pub fn miopenSetTransposeConvNdOutputPadding(\n        convDesc: miopenConvolutionDescriptor_t,\n        spatialDim: ::core::ffi::c_int,\n        adjA: *const ::core::ffi::c_int,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get the shape of a resulting 4-D tensor from a 2-D convolution\n\n This function returns the dimensions of the resulting 4D tensor of a 2D\n convolution, given the convolution descriptor, the input tensor descriptor\n and the filter descriptor. This function can help to setup the output tensor\n and allocate the proper amount of memory prior to launch the actual\n convolution.\n\n @param convDesc          Convolution layer descriptor (input)\n @param inputTensorDesc   Input data tensor descriptor (input)\n @param filterDesc        Weight descriptor (input)\n @param n                 Mini-batch size (output)\n @param c                 Number of channels (output)\n @param h                 Data height dimension size (output)\n @param w                 Data width dimension size (output)\n @return                  miopenStatus_t*/\n    pub fn miopenGetConvolutionForwardOutputDim(\n        convDesc: miopenConvolutionDescriptor_t,\n        inputTensorDesc: miopenTensorDescriptor_t,\n        filterDesc: miopenTensorDescriptor_t,\n        n: *mut ::core::ffi::c_int,\n        c: *mut ::core::ffi::c_int,\n        h: *mut ::core::ffi::c_int,\n        w: *mut ::core::ffi::c_int,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get the shape of a resulting N-dimensional tensor from a (N-2)-dimensional convolution\n\n This function returns the dimensions of the resulting N-dimensional tensor of a (N-2)-dimensional\n convolution, given the convolution descriptor, the input tensor descriptor\n and the filter descriptor. It is used to setup the output tensor descriptor prior to executing\n the convolution layer.\n\n @param convDesc          Convolution layer descriptor (input)\n @param inputTensorDesc   Input data tensor descriptor (input)\n @param filterDesc        Weight descriptor (input)\n @param nDim              Pointer to Output data tensor dimension (output)\n @param outputTensorDimA  Array of Output data tensor length (output)*/\n    pub fn miopenGetConvolutionNdForwardOutputDim(\n        convDesc: miopenConvolutionDescriptor_t,\n        inputTensorDesc: miopenTensorDescriptor_t,\n        filterDesc: miopenTensorDescriptor_t,\n        nDim: *mut ::core::ffi::c_int,\n        outputTensorDimA: *mut ::core::ffi::c_int,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Destroys the tensor descriptor object\n\n @param convDesc Convolution tensor descriptor type (input)\n @return           miopenStatus_t*/\n    pub fn miopenDestroyConvolutionDescriptor(\n        convDesc: miopenConvolutionDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set the attribute of the convolution descriptor\n\n @param convDesc          Convolution layer descriptor (input)\n @param attr              Attribute of this convolution to set (input)\n @param value             Value of this attribute (input)*/\n    pub fn miopenSetConvolutionAttribute(\n        convDesc: miopenConvolutionDescriptor_t,\n        attr: miopenConvolutionAttrib_t,\n        value: ::core::ffi::c_int,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get the attribute of the convolution descriptor\n\n @param convDesc          Convolution layer descriptor (input)\n @param attr              Attribute of this convolution to get (input)\n @param value             Value of this attribute (output)*/\n    pub fn miopenGetConvolutionAttribute(\n        convDesc: miopenConvolutionDescriptor_t,\n        attr: miopenConvolutionAttrib_t,\n        value: *mut ::core::ffi::c_int,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets the Find Mode attribute in the convolution descriptor.\n\n The subsequent calls of miopenFindConvolutionForwardAlgorithm(),\n miopenFindConvolutionBackwardDataAlgorithm(), or miopenFindConvolutionBackwardWeightsAlgorithm()\n invoked with convDesc, will follow the findMode set by this call.\n\n Note that the default Find Mode is overriden by the MIOPEN_FIND_MODE environment variable,\n if it is set. If unset, the default is as specified by miopenConvolutionFindModeDefault.\n\n @param convDesc   Convolution layer descriptor (input)\n @param findMode   Find Mode of convDesc (input)\n @return           miopenStatus_t*/\n    pub fn miopenSetConvolutionFindMode(\n        convDesc: miopenConvolutionDescriptor_t,\n        findMode: miopenConvolutionFindMode_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Reads the Find Mode attribute from the convolution descriptor.\n\n @param convDesc   Convolution layer descriptor (input)\n @param findMode   Find Mode of convDesc (output)\n @return           miopenStatus_t*/\n    pub fn miopenGetConvolutionFindMode(\n        convDesc: miopenConvolutionDescriptor_t,\n        findMode: *mut miopenConvolutionFindMode_t,\n    ) -> miopenStatus_t;\n}\nimpl miopenConvFwdAlgorithm_t {\n    ///< GEMM variant\n    pub const miopenConvolutionFwdAlgoGEMM: miopenConvFwdAlgorithm_t = miopenConvFwdAlgorithm_t(\n        0,\n    );\n}\nimpl miopenConvFwdAlgorithm_t {\n    ///< Direct convolutions\n    pub const miopenConvolutionFwdAlgoDirect: miopenConvFwdAlgorithm_t = miopenConvFwdAlgorithm_t(\n        1,\n    );\n}\nimpl miopenConvFwdAlgorithm_t {\n    ///< Fast Fourier Transform indirect convolutions\n    pub const miopenConvolutionFwdAlgoFFT: miopenConvFwdAlgorithm_t = miopenConvFwdAlgorithm_t(\n        2,\n    );\n}\nimpl miopenConvFwdAlgorithm_t {\n    ///< Winograd indirect convolutions\n    pub const miopenConvolutionFwdAlgoWinograd: miopenConvFwdAlgorithm_t = miopenConvFwdAlgorithm_t(\n        3,\n    );\n}\nimpl miopenConvFwdAlgorithm_t {\n    ///< Implicit GEMM convolutions\n    pub const miopenConvolutionFwdAlgoImplicitGEMM: miopenConvFwdAlgorithm_t = miopenConvFwdAlgorithm_t(\n        5,\n    );\n}\n#[repr(transparent)]\n/** @enum miopenConvFwdAlgorithm_t\n Convolutional algorithm mode for forward propagation. MIOpen use cross-correlation for its\n convolution implementation.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenConvFwdAlgorithm_t(pub ::core::ffi::c_uint);\nimpl miopenConvBwdWeightsAlgorithm_t {\n    ///< GEMM variant\n    pub const miopenConvolutionBwdWeightsAlgoGEMM: miopenConvBwdWeightsAlgorithm_t = miopenConvBwdWeightsAlgorithm_t(\n        0,\n    );\n}\nimpl miopenConvBwdWeightsAlgorithm_t {\n    ///< Direct convolution algorithm\n    pub const miopenConvolutionBwdWeightsAlgoDirect: miopenConvBwdWeightsAlgorithm_t = miopenConvBwdWeightsAlgorithm_t(\n        1,\n    );\n}\nimpl miopenConvBwdWeightsAlgorithm_t {\n    ///< Winograd convolutions\n    pub const miopenConvolutionBwdWeightsAlgoWinograd: miopenConvBwdWeightsAlgorithm_t = miopenConvBwdWeightsAlgorithm_t(\n        3,\n    );\n}\nimpl miopenConvBwdWeightsAlgorithm_t {\n    ///< Implicit GEMM convolutions\n    pub const miopenConvolutionBwdWeightsAlgoImplicitGEMM: miopenConvBwdWeightsAlgorithm_t = miopenConvBwdWeightsAlgorithm_t(\n        5,\n    );\n}\n#[repr(transparent)]\n/** @enum miopenConvBwdWeightsAlgorithm_t\n Convolutional algorithm mode for back propagation on weights.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenConvBwdWeightsAlgorithm_t(pub ::core::ffi::c_uint);\nimpl miopenConvBwdDataAlgorithm_t {\n    ///< GEMM variant\n    pub const miopenConvolutionBwdDataAlgoGEMM: miopenConvBwdDataAlgorithm_t = miopenConvBwdDataAlgorithm_t(\n        0,\n    );\n}\nimpl miopenConvBwdDataAlgorithm_t {\n    ///< Direct convolutions\n    pub const miopenConvolutionBwdDataAlgoDirect: miopenConvBwdDataAlgorithm_t = miopenConvBwdDataAlgorithm_t(\n        1,\n    );\n}\nimpl miopenConvBwdDataAlgorithm_t {\n    ///< Fast Fourier Transform indirect convolutions\n    pub const miopenConvolutionBwdDataAlgoFFT: miopenConvBwdDataAlgorithm_t = miopenConvBwdDataAlgorithm_t(\n        2,\n    );\n}\nimpl miopenConvBwdDataAlgorithm_t {\n    ///< Winograd indirect convolutions\n    pub const miopenConvolutionBwdDataAlgoWinograd: miopenConvBwdDataAlgorithm_t = miopenConvBwdDataAlgorithm_t(\n        3,\n    );\n}\nimpl miopenConvBwdDataAlgorithm_t {\n    pub const miopenTransposeBwdDataAlgoGEMM: miopenConvBwdDataAlgorithm_t = miopenConvBwdDataAlgorithm_t(\n        4,\n    );\n}\nimpl miopenConvBwdDataAlgorithm_t {\n    ///< Implicit GEMM convolutions\n    pub const miopenConvolutionBwdDataAlgoImplicitGEMM: miopenConvBwdDataAlgorithm_t = miopenConvBwdDataAlgorithm_t(\n        5,\n    );\n}\n#[repr(transparent)]\n/** @enum miopenConvBwdDataAlgorithm_t\n Convolutional algorithm mode for back propagation on data.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenConvBwdDataAlgorithm_t(pub ::core::ffi::c_uint);\nimpl miopenConvAlgorithm_t {\n    ///< GEMM variant\n    pub const miopenConvolutionAlgoGEMM: miopenConvAlgorithm_t = miopenConvAlgorithm_t(\n        0,\n    );\n}\nimpl miopenConvAlgorithm_t {\n    ///< Direct convolutions\n    pub const miopenConvolutionAlgoDirect: miopenConvAlgorithm_t = miopenConvAlgorithm_t(\n        1,\n    );\n}\nimpl miopenConvAlgorithm_t {\n    ///< Fast Fourier Transform indirect convolutions\n    pub const miopenConvolutionAlgoFFT: miopenConvAlgorithm_t = miopenConvAlgorithm_t(2);\n}\nimpl miopenConvAlgorithm_t {\n    ///< Winograd indirect convolutions\n    pub const miopenConvolutionAlgoWinograd: miopenConvAlgorithm_t = miopenConvAlgorithm_t(\n        3,\n    );\n}\nimpl miopenConvAlgorithm_t {\n    ///< Implicit GEMM convolutions\n    pub const miopenConvolutionAlgoImplicitGEMM: miopenConvAlgorithm_t = miopenConvAlgorithm_t(\n        5,\n    );\n}\n#[repr(transparent)]\n/** @enum miopenConvAlgorithm_t\n Top-level convolutional algorithm mode*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenConvAlgorithm_t(pub ::core::ffi::c_uint);\n/** @brief Perf struct for forward, backward filter, or backward data algorithms\n\n Contains the union to hold the selected convolution algorithm for forward, or backwards layers,\n and also contains the time it took to run the algorithm and the workspace required to run the\n algorithm. The workspace in this structure can be used when executing the convolution layer.*/\n#[repr(C)]\n#[derive(Copy, Clone)]\npub struct miopenConvAlgoPerf_t {\n    pub __bindgen_anon_1: miopenConvAlgoPerf_t__bindgen_ty_1,\n    ///< Time to exectued the selected algorithm represented in the union\n    pub time: f32,\n    ///< Workspace required to run the selected algorithm represented in the union\n    pub memory: usize,\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union miopenConvAlgoPerf_t__bindgen_ty_1 {\n    ///< Forward convolution algorithm enum selection\n    pub fwd_algo: miopenConvFwdAlgorithm_t,\n    /**< Back propagation on weights\nconvolution algorithm enum selection*/\n    pub bwd_weights_algo: miopenConvBwdWeightsAlgorithm_t,\n    ///< Back propagation on data convolution algorithm enum selection\n    pub bwd_data_algo: miopenConvBwdDataAlgorithm_t,\n}\n/** @brief Performance struct for forward, backward filter, or backward data algorithms in\n immediate mode\n\n Contains a 64-bit integer identifying the solution and the algorithm for the solution,\n as well as the runtime, workspace size and a boolean flag indicating whether the returned\n solution is a heuristic or resulting from an actual run\n*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, PartialEq)]\npub struct miopenConvSolution_t {\n    /**< Represents the approximate time required to execute this solution on the GPU,\nin milliseconds. This value may either be based on an acutal kernel run or an\nestimate based on a heuristic.*/\n    pub time: f32,\n    /**< Workspace required to run the selected algorithm represented in the\nunion*/\n    pub workspace_size: usize,\n    ///< Identifier for the returned solution\n    pub solution_id: u64,\n    ///< The algorithm used to compute the solution\n    pub algorithm: miopenConvAlgorithm_t,\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Query the maximum number of solutions applicable for the given input/output and weights\n  tensor descriptor for Convolution in the Forward direction.\n\n This call returns the maximum number of applicable solutions for a forward convolution problem.\n The \\c solutionCount returned may be used to allocate the memory required for the\n \\c miopenConvAlgoPerf_t which is required by miopenConvolutionGetSolution API calls.\n\n @param handle         MIOpen handle (input)\n @param wDesc          Tensor descriptor for weight tensor w (input)\n @param xDesc          Tensor descriptor for input data tensor x (input)\n @param convDesc       Convolution layer descriptor (input)\n @param yDesc          Tensor descriptor for output data tensor y (input)\n @param solutionCount  Pointer to memory to return number of applicable solutions (output)\n @return               miopenStatus_t*/\n    pub fn miopenConvolutionForwardGetSolutionCount(\n        handle: miopenHandle_t,\n        wDesc: miopenTensorDescriptor_t,\n        xDesc: miopenTensorDescriptor_t,\n        convDesc: miopenConvolutionDescriptor_t,\n        yDesc: miopenTensorDescriptor_t,\n        solutionCount: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Query the applicable solutions for a convolution configuration described by\n  input, output and convolution descriptors.\n\n  The returned solutions array is sorted in the order of decreasing performance. The returned\n solutions\n might be based\n  on heuristics and for more consistent performance results the user the advised to run the Find\n step.\n  The maximum length of the solutions array may be queried using\n miopenConvolutionForwardGetSolutionCount\n\n @param handle         MIOpen handle (input)\n @param wDesc          Tensor descriptor for weight tensor w (input)\n @param xDesc          Tensor descriptor for input data tensor x (input)\n @param convDesc       Convolution layer descriptor (input)\n @param yDesc          Tensor descriptor for output data tensor y (input)\n @param maxSolutionCount The size of the solutions array passed in below (input)\n @param solutionCount The size of the solutions array returned (output)\n @param solutions      A pointer to an array of type miopenConvSolution_t allocated by the user,\n                      filled in by MIOpen with applicable solutions. (output)\n @return               miopenStatus_t\n*/\n    pub fn miopenConvolutionForwardGetSolution(\n        handle: miopenHandle_t,\n        wDesc: miopenTensorDescriptor_t,\n        xDesc: miopenTensorDescriptor_t,\n        convDesc: miopenConvolutionDescriptor_t,\n        yDesc: miopenTensorDescriptor_t,\n        maxSolutionCount: usize,\n        solutionCount: *mut usize,\n        solutions: *mut miopenConvSolution_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns the workspace size required for a particular solution id.\n\n This is an optional call for users who may have serialized the solution id and just need the\n workspace\n size for it. The same information is returned by the miopenConvolutionForwardGetSolution as part\n of the\n miopenConvSolution_t struct.\n\n @param handle         MIOpen handle (input)\n @param wDesc          Tensor descriptor for weight tensor w (input)\n @param xDesc          Tensor descriptor for input data tensor x (input)\n @param convDesc       Convolution layer descriptor (input)\n @param yDesc          Tensor descriptor for output data tensor y (input)\n @param solution_id      ID of the solution for which workspace size is required (input)\n @param workSpaceSize  The size of the workspace (output)\n @return               miopenStatus_t*/\n    pub fn miopenConvolutionForwardGetSolutionWorkspaceSize(\n        handle: miopenHandle_t,\n        wDesc: miopenTensorDescriptor_t,\n        xDesc: miopenTensorDescriptor_t,\n        convDesc: miopenConvolutionDescriptor_t,\n        yDesc: miopenTensorDescriptor_t,\n        solution_id: u64,\n        workSpaceSize: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Compiles the solution provided by the user, this solution may be acquired by the\n miopenConvolutionForwardGetSolution API call above.\n   Compiling the solution ensures that the first API call to miopenConvolutionForwardImmediate\n does\n not cause a compile.\n\n   This is an optional step and may be skipped if a slow first miopenConvolutionForwardImmediate\n invocation is acceptable.\n\n @param handle         MIOpen handle (input)\n @param wDesc          Tensor descriptor for weight tensor w (input)\n @param xDesc          Tensor descriptor for input data tensor x (input)\n @param convDesc       Convolution layer descriptor (input)\n @param yDesc          Tensor descriptor for output data tensor y (input)\n @param solution_id      ID of the solution to be compiled, as chosen by the user\n @return               miopenStatus_t*/\n    pub fn miopenConvolutionForwardCompileSolution(\n        handle: miopenHandle_t,\n        wDesc: miopenTensorDescriptor_t,\n        xDesc: miopenTensorDescriptor_t,\n        convDesc: miopenConvolutionDescriptor_t,\n        yDesc: miopenTensorDescriptor_t,\n        solution_id: u64,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Executes the Forward convolution operation based on the provided solution ID.\n\n Supported datatypes are fp32, fp16, bfp16, and int8\n\n @param handle         MIOpen handle (input)\n @param wDesc          Tensor descriptor for weight tensor w (input)\n @param w              Weights tensor w (input)\n @param xDesc          Tensor descriptor for input data tensor x (input)\n @param x              Data tensor x (input)\n @param convDesc       Convolution layer descriptor (input)\n @param yDesc          Tensor descriptor for output data tensor y (input)\n @param y              Data tensor y (output)\n @param workSpace      Workspace tensor (input)\n @param workSpaceSize  Size of the memory in bytes pointed to by workSpace above\n @param solution_id      ID of the solution to be compiled, as chosen by the user\n @return               miopenStatus_t*/\n    pub fn miopenConvolutionForwardImmediate(\n        handle: miopenHandle_t,\n        wDesc: miopenTensorDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        convDesc: miopenConvolutionDescriptor_t,\n        yDesc: miopenTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSize: usize,\n        solution_id: u64,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Query the maximum number of solutions applicable for the given input/output and weights\n  tensor descriptor for backward Convolution w-r-t Data.\n\n  This call returns the maximum number of applicable solutions for a the convolution problem, the\n number\n  returned may be used to allocate the memory required for the miopenConvAlgoPert2_t which is\n required\n  by miopenConvolutionBackwardDataGetSolution API calls.\n\n @param handle         MIOpen handle (input)\n @param dyDesc         Tensor descriptor for data input tensor dy (input)\n @param wDesc          Tensor descriptor for weight tensor w (input)\n @param convDesc       Convolution layer descriptor (input)\n @param dxDesc         Tensor descriptor for output data tensor dx (input)\n @param solutionCount  Pointer to memory to return number of applicable solutions (output)\n @return               miopenStatus_t*/\n    pub fn miopenConvolutionBackwardDataGetSolutionCount(\n        handle: miopenHandle_t,\n        dyDesc: miopenTensorDescriptor_t,\n        wDesc: miopenTensorDescriptor_t,\n        convDesc: miopenConvolutionDescriptor_t,\n        dxDesc: miopenTensorDescriptor_t,\n        solutionCount: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Query the applicable solutions for a backward convolution w-r-t data as described by\n  input, output and convolution descriptors.\n\n  The returned solutions array is sorted in the order of decreasing performance. The returned\n solutions\n  ns\n might be based\n  on heuristics and for more consistent performance results the user the advised to run the Find\n step.\n  The maximum length of the solutions array may be queried using\n miopenConvolutionBackwardDataGetSolutionCount\n\n @param handle           MIOpen handle (input)\n @param dyDesc           Tensor descriptor for data input tensor dy (input)\n @param wDesc            Tensor descriptor for weight tensor w (input)\n @param convDesc         Convolution layer descriptor (input)\n @param dxDesc           Tensor descriptor for output data tensor dx (input)\n @param maxSolutionCount The size of the solutions array passed in below (input)\n @param solutionCount    The size of the solutions array returned (output)\n @param solutions        A pointer to an array of type miopenConvSolution_t allocated by the user,\n                         filled in by MIOpen with applicable solutions. (output)\n @return                 miopenStatus_t\n*/\n    pub fn miopenConvolutionBackwardDataGetSolution(\n        handle: miopenHandle_t,\n        dyDesc: miopenTensorDescriptor_t,\n        wDesc: miopenTensorDescriptor_t,\n        convDesc: miopenConvolutionDescriptor_t,\n        dxDesc: miopenTensorDescriptor_t,\n        maxSolutionCount: usize,\n        solutionCount: *mut usize,\n        solutions: *mut miopenConvSolution_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns the workspace size required for a particular solution id.\n\n This is an optional call for users who may have serialized the solution id and just need the\n workspace\n size for it. The same information is returned by the miopenConvolutionBackwardDataGetSolution as\n part of the\n miopenConvSolution_t struct.\n\n @param handle         MIOpen handle (input)\n @param dyDesc           Tensor descriptor for data input tensor dy (input)\n @param wDesc            Tensor descriptor for weight tensor w (input)\n @param convDesc         Convolution layer descriptor (input)\n @param dxDesc           Tensor descriptor for output data tensor dx (input)\n @param solution_id      ID of the solution for which workspace size is required (input)\n @param workSpaceSize  The size of the workspace (output)\n @return               miopenStatus_t*/\n    pub fn miopenConvolutionBackwardDataGetSolutionWorkspaceSize(\n        handle: miopenHandle_t,\n        dyDesc: miopenTensorDescriptor_t,\n        wDesc: miopenTensorDescriptor_t,\n        convDesc: miopenConvolutionDescriptor_t,\n        dxDesc: miopenTensorDescriptor_t,\n        solution_id: u64,\n        workSpaceSize: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Compiles the solution provided by the user, this solution may be acquired by the\n miopenConvolutionBackwardDataGetSolution API call above.\n   Compiling the solution ensures that the first API call to\n miopenConvolutionBackwardDataImmediate\n does not cause a compile.\n\n   This is an optional step and may be skipped if a slow first\n miopenConvolutionBackwardDataImmediate\n invocation is acceptable.\n\n @param handle         MIOpen handle (input)\n @param dyDesc         Tensor descriptor for data input tensor dy (input)\n @param wDesc          Tensor descriptor for weight tensor w (input)\n @param convDesc       Convolution layer descriptor (input)\n @param dxDesc         Tensor descriptor for output data tensor dx (input)\n @param solution_id      ID of the solution to be compiled, as chosen by the user\n @return               miopenStatus_t*/\n    pub fn miopenConvolutionBackwardDataCompileSolution(\n        handle: miopenHandle_t,\n        dyDesc: miopenTensorDescriptor_t,\n        wDesc: miopenTensorDescriptor_t,\n        convDesc: miopenConvolutionDescriptor_t,\n        dxDesc: miopenTensorDescriptor_t,\n        solution_id: u64,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Executes the Backward convolution w-r-t data  operation based on the provided solution\n ID.\n\n\n @param handle         MIOpen handle (input)\n @param dyDesc         Tensor descriptor for data input tensor dy (input)\n @param dy             Data delta tensor dy (input)\n @param wDesc          Tensor descriptor for weight tensor w (input)\n @param w              Weights tensor w (input)\n @param convDesc       Convolution layer descriptor (input)\n @param dxDesc         Tensor descriptor for output data tensor dx (input)\n @param dx             Data delta tensor dx (output)\n @param workSpace      Workspace tensor (input)\n @param workSpaceSize  Size in bytes of the workspace memory pointed to by workSpace\n @param solution_id      ID of the solution to be compiled, as chosen by the user\n @return               miopenStatus_t*/\n    pub fn miopenConvolutionBackwardDataImmediate(\n        handle: miopenHandle_t,\n        dyDesc: miopenTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        wDesc: miopenTensorDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        convDesc: miopenConvolutionDescriptor_t,\n        dxDesc: miopenTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSize: usize,\n        solution_id: u64,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Query the maximum number of solutions applicable for the given input/output and weights\n  tensor descriptor for backward Convolution w-r-t Weights.\n\n  This call returns the maximum number of applicable solutions for a the convolution problem, the\n number\n  returned may be used to allocate the memory required for the miopenConvAlgoPert2_t which is\n required\n  by miopenConvolutionBackwardWeightsGetSolution API calls.\n\n @param handle         MIOpen handle (input)\n @param dyDesc         Tensor descriptor for data tensor dy (input)\n @param xDesc          Tensor descriptor for data tensor x (input)\n @param convDesc       Convolution layer descriptor (input)\n @param dwDesc         Tensor descriptor for weight tensor dw (input)\n @param solutionCount  Pointer to memory to return number of applicable solutions (output)\n @return               miopenStatus_t*/\n    pub fn miopenConvolutionBackwardWeightsGetSolutionCount(\n        handle: miopenHandle_t,\n        dyDesc: miopenTensorDescriptor_t,\n        xDesc: miopenTensorDescriptor_t,\n        convDesc: miopenConvolutionDescriptor_t,\n        dwDesc: miopenTensorDescriptor_t,\n        solutionCount: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Query the applicable solutions for a backward convolution w-r-t weights as described by\n  input, output and convolution descriptors.\n\n  The returned solutions array is sorted in the order of decreasing performance. The returned\n solutions\n might be based\n  on heuristics and for more consistent performance results the user the advised to run the Find\n step.\n  The maximum length of the solutions array may be queried using\n miopenConvolutionBackwardWeightsGetSolutionCount\n\n @param handle           MIOpen handle (input)\n @param dyDesc           Tensor descriptor for data tensor dy (input)\n @param xDesc            Tensor descriptor for data tensor x (input)\n @param convDesc         Convolution layer descriptor (input)\n @param dwDesc           Tensor descriptor for weight tensor dw (input)\n @param maxSolutionCount The size of the solutions array passed in below (input)\n @param solutionCount    The size of the solutions array returned (output)\n @param solutions        A pointer to an array of type miopenConvSolution_t allocated by the user,\n                         filled in by MIOpen with applicable solutions. (output)\n @return                 miopenStatus_t\n*/\n    pub fn miopenConvolutionBackwardWeightsGetSolution(\n        handle: miopenHandle_t,\n        dyDesc: miopenTensorDescriptor_t,\n        xDesc: miopenTensorDescriptor_t,\n        convDesc: miopenConvolutionDescriptor_t,\n        dwDesc: miopenTensorDescriptor_t,\n        maxSolutionCount: usize,\n        solutionCount: *mut usize,\n        solutions: *mut miopenConvSolution_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns the workspace size required for a particular solution id.\n\n This is an optional call for users who may have serialized the solution id and just need the\n workspace\n size for it. The same information is returned by the miopenConvolutionBackwardWeightsGetSolution\n as part of the\n miopenConvSolution_t struct.\n\n @param handle         MIOpen handle (input)\n @param dyDesc         Tensor descriptor for data tensor dy (input)\n @param xDesc          Tensor descriptor for data tensor x (input)\n @param convDesc       Convolution layer descriptor (input)\n @param dwDesc         Tensor descriptor for weight tensor dw (input)\n @param solution_id      ID of the solution for which workspace size is required (input)\n @param workSpaceSize  The size of the workspace (output)\n @return               miopenStatus_t*/\n    pub fn miopenConvolutionBackwardWeightsGetSolutionWorkspaceSize(\n        handle: miopenHandle_t,\n        dyDesc: miopenTensorDescriptor_t,\n        xDesc: miopenTensorDescriptor_t,\n        convDesc: miopenConvolutionDescriptor_t,\n        dwDesc: miopenTensorDescriptor_t,\n        solution_id: u64,\n        workSpaceSize: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Compiles the solution provided by the user, this solution may be acquired by the\n miopenConvolutionBackwardWeightsGetSolution API call above.\n   Compiling the solution ensures that the first API call to\n miopenConvolutionBackwardWeightsImmediate\n does not cause a compile.\n\n   This is an optional step and may be skipped if a slow first\n miopenConvolutionBackwardWeightsImmediate invocation is acceptable.\n\n @param handle         MIOpen handle (input)\n @param dyDesc         Tensor descriptor for data tensor dy (input)\n @param xDesc          Tensor descriptor for data tensor x (input)\n @param convDesc       Convolution layer descriptor (input)\n @param dwDesc         Tensor descriptor for weight tensor dw (input)\n @param solution_id      ID of the solution to be compiled, as chosen by the user\n @return               miopenStatus_t*/\n    pub fn miopenConvolutionBackwardWeightsCompileSolution(\n        handle: miopenHandle_t,\n        dyDesc: miopenTensorDescriptor_t,\n        xDesc: miopenTensorDescriptor_t,\n        convDesc: miopenConvolutionDescriptor_t,\n        dwDesc: miopenTensorDescriptor_t,\n        solution_id: u64,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Executes the Backward convolution w-r-t weights  operation based on the provided solution\n ID.\n\n\n @param handle         MIOpen handle (input)\n @param dyDesc         Tensor descriptor for data tensor dy (input)\n @param dy             Data delta tensor dy (input)\n @param xDesc          Tensor descriptor for data tensor x (input)\n @param x              Data tensor x (input)\n @param convDesc       Convolution layer descriptor (input)\n @param dwDesc         Tensor descriptor for weight tensor dw (input)\n @param dw             Weights delta tensor dw (output)\n @param workSpace      Workspace tensor (input)\n @param workSpaceSize  Size in bytes of the memory passed in, pointed to by workSpace pointer\n above\n @param solution_id      ID of the solution to be compiled, as chosen by the user\n @return               miopenStatus_t*/\n    pub fn miopenConvolutionBackwardWeightsImmediate(\n        handle: miopenHandle_t,\n        dyDesc: miopenTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        convDesc: miopenConvolutionDescriptor_t,\n        dwDesc: miopenTensorDescriptor_t,\n        dw: *mut ::core::ffi::c_void,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSize: usize,\n        solution_id: u64,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Query the workspace size required for a forward convolution algorithm.\n\n For given tensor and convolution descriptors, this function calculates and returns the minimum\n size of the workspace that must be provided to miopenFindConvolutionForwardAlgorithm() in order\n for the latter to find the best candidate from the available forward data convolution algorithms.\n\n WARNING: Providing smaller workspace may result in the selection of a slow convolution\n algorithm, and therefore affect library performance.\n\n It should be assumed that the required workspace size is different for each convolution\n configuration. Therefore, typically this function should be called at least once for each\n convolution configuration used.\n\n Since the convolution configuration is determined by tensor and convolution descriptors, the user\n should ensure that all descriptors contain complete information. For example, if Group/Depthwise\n convolution mode is used, then miopenSetConvolutionGroupCount() should be called before running\n this, and so on.\n\n @param handle         MIOpen handle (input)\n @param wDesc          Tensor descriptor for weight tensor w (input)\n @param xDesc          Tensor descriptor for input data tensor x (input)\n @param convDesc       Convolution layer descriptor (input)\n @param yDesc          Tensor descriptor for output data tensor y (input)\n @param workSpaceSize  Pointer to memory to return size in bytes (output)\n @return               miopenStatus_t*/\n    pub fn miopenConvolutionForwardGetWorkSpaceSize(\n        handle: miopenHandle_t,\n        wDesc: miopenTensorDescriptor_t,\n        xDesc: miopenTensorDescriptor_t,\n        convDesc: miopenConvolutionDescriptor_t,\n        yDesc: miopenTensorDescriptor_t,\n        workSpaceSize: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Search and run the forward convolutional algorithms and return a list of kernel times.\n\n This function attempts all MIOpen forward convolution algorithms based on\n the input configuration, and outputs performance metrics to a\n user-allocated array of type miopenConvAlgoPerf_t. These metrics are written\n in a sorted fashion where the first element has the lowest compute time.\n Users can chose the top-most algorithm if they only care about the fastest\n algorithm.\n\n This function is mandatory before using miopenConvolutionForward(). In order\n to execute this function, miopenConvolutionForwardGetWorkSpaceSize() must be\n run to determine the required memory for this search.\n\n * If exhaustiveSearch == 0, MIOpen will look for the first kernel with a configuration match. If\n a configuration match is not found, a default configuration will be returned.\n\n * If exhaustiveSearch == 1, MIOpen will look for the best kernel for the provided configuration.\n If a match is not found, an exhaustive search is performed by running individual algorithms.\n\n If using Group/Depthwise convolution mode, call miopenSetConvolutionGroupCount() before running\n this.\n\n @param handle             MIOpen handle (input)\n @param xDesc              Tensor descriptor for data input tensor x (input)\n @param x                  Data tensor x (input)\n @param wDesc              Tensor descriptor for weight tensor w (input)\n @param w                  Weights tensor w (input)\n @param convDesc           Convolution layer descriptor (input)\n @param yDesc              Tensor descriptor for output data tensor y (input)\n @param y                  Data tensor y (output)\n @param requestAlgoCount   Number of algorithms to return kernel times (input)\n @param returnedAlgoCount  Pointer to number of algorithms returned (output)\n @param perfResults        Pointer to union of best algorithm for forward and backwards (input)\n @param workSpace          Pointer to workspace buffer (input).\n @param workSpaceSize      Size in bytes of the workspace buffer (input).\n                           The buffer must be allocated on the device by the caller.\n                           The size of the buffer should be determined by calling\n                           miopenConvolutionForwardGetWorkSpaceSize(), see its\n                           documentation for details.\n @param exhaustiveSearch   A boolean to toggle a full search of all algorithms\n                           and configurations (input)\n @return                   miopenStatus_t*/\n    pub fn miopenFindConvolutionForwardAlgorithm(\n        handle: miopenHandle_t,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        wDesc: miopenTensorDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        convDesc: miopenConvolutionDescriptor_t,\n        yDesc: miopenTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        requestAlgoCount: ::core::ffi::c_int,\n        returnedAlgoCount: *mut ::core::ffi::c_int,\n        perfResults: *mut miopenConvAlgoPerf_t,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSize: usize,\n        exhaustiveSearch: bool,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute a forward convolution layer\n\n Runs the forward convolution layer based on the selected algorithm. The function\n miopenFindConvolutionForwardAlgorithm() must have been executed previously to\n determine the required memory needed for the workspace and the best convolutional algorithm.\n The scaling parameter alpha (float) and shift parameter beta (float) are only supported for\n alpha = 1 and beta = 0 in 2D. In 3D, these parameters can take other values.\n\n The forward convolution is designed to accommodate both packed and non-packed tensor strides for\n multiple data types and dimensions across various platforms. This flexibility ensures optimal\n performance in handling diverse computational scenarios. To configure tensor parameters,\n including strides, users can utilize the APIs miopenSetTensorDescriptor() and\n miopenGetTensorDescriptor(). These APIs empower developers to seamlessly set and retrieve tensor\n information, facilitating a more intuitive and efficient workflow. The tensor strides are\n non-packed by default.\n\n If using Group/Depthwise convolution mode, call miopenSetConvolutionGroupCount() before running\n this.\n\n @param handle         MIOpen handle (input)\n @param alpha          Floating point scaling factor, allocated on the host (input)\n @param xDesc          Tensor descriptor for data input tensor x (input)\n @param x              Data tensor x (input)\n @param wDesc          Tensor descriptor for weight tensor w (input)\n @param w              Weights tensor w (inputs)\n @param convDesc       Convolution layer descriptor (inputs)\n @param algo           Algorithm selected (inputs)\n @param beta           Floating point shift factor, allocated on the host (input)\n @param yDesc          Tensor descriptor for output data tensor y (input)\n @param y              Data tensor y (output)\n @param workSpace      Pointer to workspace required (input)\n @param workSpaceSize  Size in bytes of the memory determined by the find step (input)\n @return               miopenStatus_t*/\n    pub fn miopenConvolutionForward(\n        handle: miopenHandle_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        wDesc: miopenTensorDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        convDesc: miopenConvolutionDescriptor_t,\n        algo: miopenConvFwdAlgorithm_t,\n        beta: *const ::core::ffi::c_void,\n        yDesc: miopenTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSize: usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Calculate element-wise scale and shift of a tensor via a bias tensor\n\n  This function applies an element-wise bias to a data tensor from an input bias tensor.\n  The scaling parameter alpha (float) and shift parameter beta (float) are only supported for\n  alpha = 1 and beta = 0.\n\n @param handle         MIOpen handle (input)\n @param alpha          Floating point scaling factor, allocated on the host (input)\n @param bDesc          Tensor descriptor for bias tensor b (input)\n @param b              Bias tensor b (input)\n @param beta           Floating point shift factor, allocated on the host (input)\n @param yDesc          Tensor descriptor for data tensor y (input)\n @param y              Data tensor y (input and output)\n @return               miopenStatus_t*/\n    pub fn miopenConvolutionForwardBias(\n        handle: miopenHandle_t,\n        alpha: *const ::core::ffi::c_void,\n        bDesc: miopenTensorDescriptor_t,\n        b: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        yDesc: miopenTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Query the workspace size required for a backward data convolution algorithm.\n\n For given tensor and convolution descriptors, this function calculates and returns the minimum\n size of the workspace that must be provided to miopenFindConvolutionBackwardDataAlgorithm() in\n order for the latter to find the best candidate from the available backward data convolution\n algorithms.\n\n WARNING: Providing smaller workspace may result in the selection of a slow convolution\n algorithm, and therefore affect library performance.\n\n It should be assumed that the required workspace size is different for each convolution\n configuration. Therefore, typically this function should be called at least once for each\n convolution configuration used.\n\n Since the convolution configuration is determined by tensor and convolution descriptors, the user\n should ensure that all descriptors contain complete information. For example, if Group/Depthwise\n convolution mode is used, then miopenSetConvolutionGroupCount() should be called before running\n this, and so on.\n\n @param handle         MIOpen handle (input)\n @param dyDesc         Tensor descriptor for data input tensor dy (input)\n @param wDesc          Tensor descriptor for weight tensor w (input)\n @param convDesc       Convolution layer descriptor (input)\n @param dxDesc         Tensor descriptor for output data tensor dx (input)\n @param workSpaceSize  Size in bytes of the memory required (output)\n @return               miopenStatus_t*/\n    pub fn miopenConvolutionBackwardDataGetWorkSpaceSize(\n        handle: miopenHandle_t,\n        dyDesc: miopenTensorDescriptor_t,\n        wDesc: miopenTensorDescriptor_t,\n        convDesc: miopenConvolutionDescriptor_t,\n        dxDesc: miopenTensorDescriptor_t,\n        workSpaceSize: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Search and run the backwards data convolution algorithms and return a list of kernel\n times.\n\n This function attempts all MIOpen backward data convolution algorithms, and outputs the\n performance metrics to a user-allocated array of type miopenConvAlgoPerf_t.\n These metrics are written in sorted fashion where the first element has the lowest compute time.\n This function is mandatory before using backwards convolutions. Users can chose the top-most\n algorithm if they only care about the fastest algorithm.\n\n This function is mandatory before using miopenConvolutionBackwardData(). In order to\n execute this function, miopenConvolutionBackwardsDataGetWorkSpaceSize() must be run to determine\n the required memory for this search.\n\n * If exhaustiveSearch == 0, MIOpen will look for the first kernel with a configuration match. If\n a configuration match is not found, a default configuration will be returned.\n\n * If exhaustiveSearch == 1, MIOpen will look for the best kernel for the provided configuration.\n If a match is not found, an exhaustive search is performed by running individual algorithms.\n\n If using Group/Depthwise convolution mode, call miopenSetConvolutionGroupCount() before running\n this.\n\n @param handle             MIOpen handle (input)\n @param dyDesc             Tensor descriptor for data input tensor dy (input)\n @param dy                 Data delta tensor dy (input)\n @param wDesc              Tensor descriptor for weight tensor w (input)\n @param w                  Weights tensor w (input)\n @param convDesc           Convolution layer descriptor (input)\n @param dxDesc             Tensor descriptor for output data tensor dx (input)\n @param dx                 Data delta tensor dx (input)\n @param requestAlgoCount   Number of algorithms to return kernel times (input)\n @param returnedAlgoCount  Pointer to number of algorithms returned (output)\n @param perfResults        Pointer to union of best algorithm for forward and backwards (output)\n @param workSpace          Pointer to workspace buffer (input).\n @param workSpaceSize      Size in bytes of the workspace buffer (input).\n                           The buffer must be allocated on the device by the caller.\n                           The size of the buffer should be determined by calling\n                           miopenConvolutionBackwardDataGetWorkSpaceSize(), see its\n                           documentation for details.\n @param exhaustiveSearch   A boolean to toggle a full search of all algorithms\n                           and configurations (input)\n @return                   miopenStatus_t*/\n    pub fn miopenFindConvolutionBackwardDataAlgorithm(\n        handle: miopenHandle_t,\n        dyDesc: miopenTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        wDesc: miopenTensorDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        convDesc: miopenConvolutionDescriptor_t,\n        dxDesc: miopenTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n        requestAlgoCount: ::core::ffi::c_int,\n        returnedAlgoCount: *mut ::core::ffi::c_int,\n        perfResults: *mut miopenConvAlgoPerf_t,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSize: usize,\n        exhaustiveSearch: bool,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute a backward data convolution layer\n\n Runs the backward data convolution layer based on the selected algorithm. The function\n miopenFindConvolutionBackwardDataAlgorithm() must have been executed previously to\n determine the required memory needed for the workspace and the best convolutional\n algorithm.\n\n The backward data convolution is designed to accommodate both packed and non-packed tensor\n strides for multiple data types and dimensions across various platforms. This flexibility ensures\n optimal performance in handling diverse computational scenarios. To configure tensor parameters,\n including strides, users can utilize the APIs miopenSetTensorDescriptor() and\n miopenGetTensorDescriptor(). These APIs empower developers to seamlessly set and retrieve tensor\n information, facilitating a more intuitive and efficient workflow. The tensor strides are\n non-packed by default.\n\n If using Group/Depthwise convolution mode, call miopenSetConvolutionGroupCount() before running\n this.\n\n @param handle         MIOpen handle (input)\n @param alpha          Floating point scaling factor, allocated on the host (input)\n @param dyDesc         Tensor descriptor for data input tensor dy (input)\n @param dy             Data delta tensor dy (input)\n @param wDesc          Tensor descriptor for weight tensor w (input)\n @param w              Weights tensor w (input)\n @param convDesc       Convolution layer descriptor (input)\n @param algo           Algorithm selected (input)\n @param beta           Floating point shift factor, allocated on the host (input)\n @param dxDesc         Tensor descriptor for output data tensor dx (input)\n @param dx             Data delta tensor dx (output)\n @param workSpace      Pointer to workspace required for the search (input)\n @param workSpaceSize  Size in bytes of the memory needed for find (input)\n @return               miopenStatus_t*/\n    pub fn miopenConvolutionBackwardData(\n        handle: miopenHandle_t,\n        alpha: *const ::core::ffi::c_void,\n        dyDesc: miopenTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        wDesc: miopenTensorDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        convDesc: miopenConvolutionDescriptor_t,\n        algo: miopenConvBwdDataAlgorithm_t,\n        beta: *const ::core::ffi::c_void,\n        dxDesc: miopenTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSize: usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get the GPU memory required for the backward weights convolution algorithm.\n\n For given tensor and convolution descriptors, this function calculates and returns the minimum\n size of the workspace that must be provided to miopenFindConvolutionBackwardWeightsAlgorithm() in\n order for the latter to find the best candidate from the available backward weights convolution\n algorithms.\n\n WARNING: Providing smaller workspace may result in the selection of a slow convolution\n algorithm, and therefore affect library performance.\n\n It should be assumed that the required workspace size is different for each convolution\n configuration. Therefore, typically this function should be called at least once for each\n convolution configuration used.\n\n Since the convolution configuration is determined by tensor and convolution descriptors, the user\n should ensure that all descriptors contain complete information. For example, if Group/Depthwise\n convolution mode is used, then miopenSetConvolutionGroupCount() should be called before running\n this, and so on.\n\n @param handle         MIOpen handle (input)\n @param dyDesc         Tensor descriptor for data input tensor dy (input)\n @param xDesc          Tensor descriptor for data tensor x (input)\n @param convDesc       Convolution layer descriptor (input)\n @param dwDesc         Tensor descriptor for output weights tensor dw (input)\n @param workSpaceSize  Size in bytes of the memory required (output)\n @return               miopenStatus_t*/\n    pub fn miopenConvolutionBackwardWeightsGetWorkSpaceSize(\n        handle: miopenHandle_t,\n        dyDesc: miopenTensorDescriptor_t,\n        xDesc: miopenTensorDescriptor_t,\n        convDesc: miopenConvolutionDescriptor_t,\n        dwDesc: miopenTensorDescriptor_t,\n        workSpaceSize: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Search and run the backwards weights convolutional algorithms and return a list of kernel\n times.\n\n This function attempts all MIOpen backward weights convolution algorithms, and outputs\n the performance metrics to a user-allocated array of type miopenConvAlgoPerf_t. These metrics are\n written in sorted fashion where the first element has the lowest compute time.\n This function is mandatory before using backwards weight convolutions. Users can chose the\n top-most algorithm if they only care about the fastest algorithm.\n\n This function is mandatory before using miopenConvolutionBackwardWeights(). In order to\n execute this function, miopenConvolutionBackwardsWeightsGetWorkSpaceSize() must be run to\n determine the required memory for this search.\n\n * If exhaustiveSearch == 0, MIOpen will look for the first kernel with a configuration match. If\n a configuration match is not found, a default configuration will be returned.\n\n * If exhaustiveSearch == 1, MIOpen will look for the best kernel for the provided configuration.\n If a match is not found, an exhaustive search is performed by running individual algorithms.\n\n If using Group/Depthwise convolution mode, call miopenSetConvolutionGroupCount() before running\n this.\n\n @param handle             MIOpen handle (input)\n @param dyDesc             Tensor descriptor for data input tensor dy (input)\n @param dy                 Data delta tensor dy (input)\n @param xDesc              Tensor descriptor for output data tensor x (input)\n @param x                  Data delta tensor dx (input)\n @param convDesc           Convolution layer descriptor (input)\n @param dwDesc             Tensor descriptor for weight tensor dw (input)\n @param dw                 Weights delta tensor dw (input)\n @param requestAlgoCount   Number of algorithms to return kernel times (input)\n @param returnedAlgoCount  Pointer to number of algorithms returned (output)\n @param perfResults        Pointer to union of best algorithm for forward and backwards (output)\n @param workSpace          Pointer to workspace buffer (input).\n @param workSpaceSize      Size in bytes of the workspace buffer (input).\n                           The buffer must be allocated on the device by the caller.\n                           The size of the buffer should be determined by calling\n                           miopenConvolutionBackwardWeightsGetWorkSpaceSize(), see its\n                           documentation for details.\n @param exhaustiveSearch   A boolean to toggle a full search of all algorithms\n                           and configurations (input)\n @return                   miopenStatus_t*/\n    pub fn miopenFindConvolutionBackwardWeightsAlgorithm(\n        handle: miopenHandle_t,\n        dyDesc: miopenTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        convDesc: miopenConvolutionDescriptor_t,\n        dwDesc: miopenTensorDescriptor_t,\n        dw: *mut ::core::ffi::c_void,\n        requestAlgoCount: ::core::ffi::c_int,\n        returnedAlgoCount: *mut ::core::ffi::c_int,\n        perfResults: *mut miopenConvAlgoPerf_t,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSize: usize,\n        exhaustiveSearch: bool,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute a backward weights convolution layer\n\n Runs the backward weights convolution layer based on the selected algorithm. The function\n miopenFindConvolutionBackwardWeightsAlgorithm() must have\n been executed previously to determine the required memory needed for the workspace and the\n best convolutional algorithm.\n\n The backward weights convolution is designed to accommodate both packed and non-packed tensor\n strides for multiple data types and dimensions across various platforms. This flexibility ensures\n optimal performance in handling diverse computational scenarios. To configure tensor parameters,\n including strides, users can utilize the APIs miopenSetTensorDescriptor() and\n miopenGetTensorDescriptor(). These APIs empower developers to seamlessly set and retrieve tensor\n information, facilitating a more intuitive and efficient workflow. The tensor strides are\n non-packed by default.\n\n If using Group/Depthwise convolution mode, call miopenSetConvolutionGroupCount() before running\n this.\n\n @param handle         MIOpen handle (input)\n @param alpha          Floating point scaling factor, allocated on the host (input)\n @param dyDesc         Tensor descriptor for data tensor dy (input)\n @param dy             Data delta tensor dy (input)\n @param xDesc          Tensor descriptor for data tensor x (input)\n @param x              Data tensor x (input)\n @param convDesc       Convolution layer descriptor (input)\n @param algo           Algorithm selected (input)\n @param beta           Floating point shift factor, allocated on the host (input)\n @param dwDesc         Tensor descriptor for weight tensor dw (input)\n @param dw             Weights delta tensor dw (output)\n @param workSpace      Pointer to workspace required for the search (input)\n @param workSpaceSize  Size in bytes of the memory needed for find (input)\n @return               miopenStatus_t*/\n    pub fn miopenConvolutionBackwardWeights(\n        handle: miopenHandle_t,\n        alpha: *const ::core::ffi::c_void,\n        dyDesc: miopenTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        convDesc: miopenConvolutionDescriptor_t,\n        algo: miopenConvBwdWeightsAlgorithm_t,\n        beta: *const ::core::ffi::c_void,\n        dwDesc: miopenTensorDescriptor_t,\n        dw: *mut ::core::ffi::c_void,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSize: usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Calculates the gradient with respect to the bias.\n\n Compute the convolution backwards gradient with respect to the bias tensor.\n The scaling parameter alpha (float) and shift parameter beta (float) are only supported for\n alpha = 1 and beta = 0.\n\n @param handle         MIOpen handle (input)\n @param alpha          Floating point scaling factor, allocated on the host (input)\n @param dyDesc         Tensor descriptor for data input tensor dy (input)\n @param dy             Data delta tensor dy (input)\n @param beta           Floating point shift factor, allocated on the host (input)\n @param dbDesc         Tensor descriptor for input bias tensor db (input)\n @param db             Bias delta tensor db (output)\n @return               miopenStatus_t*/\n    pub fn miopenConvolutionBackwardBias(\n        handle: miopenHandle_t,\n        alpha: *const ::core::ffi::c_void,\n        dyDesc: miopenTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        dbDesc: miopenTensorDescriptor_t,\n        db: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a pooling layer descriptor\n\n @param poolDesc   Pointer to a pooling layer descriptor (output)\n @return           miopenStatus_t*/\n    pub fn miopenCreatePoolingDescriptor(\n        poolDesc: *mut miopenPoolingDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set index data type for pooling layer. The default indexing type is uint8_t.\n Users can set the index type to any of the miopenIndexType_t sizes; 8, 16, 32, or 64 bit\n unsigned integers.\n\n @param poolDesc     Pointer to a pooling layer descriptor (input)\n @param index_type   Index type (input)\n @return             miopenStatus_t*/\n    pub fn miopenSetPoolingIndexType(\n        poolDesc: miopenPoolingDescriptor_t,\n        index_type: miopenIndexType_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get the index data type for pooling layer. The index type to any of the\n miopenIndexType_t sizes; 8, 16, 32, or 64 bit unsigned integers.\n\n @param poolDesc     Pointer to a pooling layer descriptor (input)\n @param index_type   Index type (output)\n @return             miopenStatus_t*/\n    pub fn miopenGetPoolingIndexType(\n        poolDesc: miopenPoolingDescriptor_t,\n        index_type: *mut miopenIndexType_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set workspace index mode for pooling layer. The default mode is\n miopenPoolingWorkSpaceIndexMask.\n\n @param poolDesc         Pointer to a pooling layer descriptor (input/output)\n @param workspace_index  Workspace index mode (input)\n @return                 miopenStatus_t*/\n    pub fn miopenSetPoolingWorkSpaceIndexMode(\n        poolDesc: miopenPoolingDescriptor_t,\n        workspace_index: miopenPoolingWorkspaceIndexMode_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get workspace index mode for pooling layer.\n\n @param poolDesc         Pointer to a pooling layer descriptor (input)\n @param workspace_index  Workspace index mode (output)\n @return                 miopenStatus_t*/\n    pub fn miopenGetPoolingWorkSpaceIndexMode(\n        poolDesc: miopenPoolingDescriptor_t,\n        workspace_index: *mut miopenPoolingWorkspaceIndexMode_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets a 2-D pooling layer descriptor details.\n\n Sets the window shape, padding, and stride for a previously created 2-D pooling descriptor.\n\n @param poolDesc       Pointer to a pooling layer descriptor (output)\n @param mode           Pooling mode enum (input)\n @param windowHeight   Input window height dimension (input)\n @param windowWidth    Input window width dimension (input)\n @param pad_h          Number of elements to pad height (input)\n @param pad_w          Number of elements to pad width (input)\n @param stride_h       Vertical stride (input)\n @param stride_w       Horizontal stride (input)\n @return               miopenStatus_t*/\n    pub fn miopenSet2dPoolingDescriptor(\n        poolDesc: miopenPoolingDescriptor_t,\n        mode: miopenPoolingMode_t,\n        windowHeight: ::core::ffi::c_int,\n        windowWidth: ::core::ffi::c_int,\n        pad_h: ::core::ffi::c_int,\n        pad_w: ::core::ffi::c_int,\n        stride_h: ::core::ffi::c_int,\n        stride_w: ::core::ffi::c_int,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets a 2-D pooling layer descriptor details\n\n Gets the window shape, padding, and stride for a previously created 2-D pooling descriptor.\n\n @param poolDesc       Pointer to a pooling layer descriptor (input)\n @param mode           Pooling mode enum (output)\n @param windowHeight   Input window height dimension (output)\n @param windowWidth    Input window width dimension (output)\n @param pad_h          Number of elements to pad height (output)\n @param pad_w          Number of elements to pad width (output)\n @param stride_h       Vertical stride (output)\n @param stride_w       Horizontal stride (output)\n @return               miopenStatus_t*/\n    pub fn miopenGet2dPoolingDescriptor(\n        poolDesc: miopenPoolingDescriptor_t,\n        mode: *mut miopenPoolingMode_t,\n        windowHeight: *mut ::core::ffi::c_int,\n        windowWidth: *mut ::core::ffi::c_int,\n        pad_h: *mut ::core::ffi::c_int,\n        pad_w: *mut ::core::ffi::c_int,\n        stride_h: *mut ::core::ffi::c_int,\n        stride_w: *mut ::core::ffi::c_int,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets the shape of the output tensor for 2-D pooling\n\n Retrieve the tensor dimensions for the forward 2-D pooling. This call is required for\n the forward if the output dimensions are different than the input tensor\n dimensions.\n\n @param poolDesc   Pointer to a pooling layer descriptor (input)\n @param tensorDesc Input tensor descriptor (input)\n @param n\t         Mini-batch dim (output)\n @param c\t         Number of channels (output)\n @param h          Heights of input map (output)\n @param w          Width of input map (output)\n @return           miopenStatus_t*/\n    pub fn miopenGetPoolingForwardOutputDim(\n        poolDesc: miopenPoolingDescriptor_t,\n        tensorDesc: miopenTensorDescriptor_t,\n        n: *mut ::core::ffi::c_int,\n        c: *mut ::core::ffi::c_int,\n        h: *mut ::core::ffi::c_int,\n        w: *mut ::core::ffi::c_int,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set details of a N-D pooling layer descriptor\n\n Set the window shape, padding, and stride for a previously created N-D pooling descriptor.\n\n @param poolDesc     Pointer to a pooling layer descriptor (input/output)\n @param mode         Pooling mode enum (input)\n @param nbDims       Dimension of the pooling (input)\n @param windowDimA   Array of input window dimensions with length equal to or larger than\n dimsRequested (input)\n @param padA         Array of number of elements to padding with length equal to or larger than\n dimsRequested (input)\n @param stridesA     Array of stride parameter with length equal to or larger than dimsRequested\n (input)\n @return               miopenStatus_t*/\n    pub fn miopenSetNdPoolingDescriptor(\n        poolDesc: miopenPoolingDescriptor_t,\n        mode: miopenPoolingMode_t,\n        nbDims: ::core::ffi::c_int,\n        windowDimA: *const ::core::ffi::c_int,\n        padA: *const ::core::ffi::c_int,\n        stridesA: *const ::core::ffi::c_int,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get details of a N-D pooling layer descriptor\n\n Get the window shape, padding, and stride for a previously created N-D pooling descriptor.\n\n @param poolDesc         Pointer to a pooling layer descriptor (input)\n @param nbDimsRequested  Dimension of the expected pooling descriptor (input)\n @param mode             Pooling mode enum (output)\n @param nbDims           Actual dimension of the pooling descriptor (output)\n @param windowDimA       Array of input window dimensions with length equal to or larger than\n dimsRequested (output)\n @param padA             Array of number of elements to padding with length equal to or larger\n than dimsRequested (output)\n @param stridesA         Array of stride parameter with length equal to or larger than\n dimsRequested (output)\n @return                 miopenStatus_t*/\n    pub fn miopenGetNdPoolingDescriptor(\n        poolDesc: miopenPoolingDescriptor_t,\n        nbDimsRequested: ::core::ffi::c_int,\n        mode: *mut miopenPoolingMode_t,\n        nbDims: *mut ::core::ffi::c_int,\n        windowDimA: *mut ::core::ffi::c_int,\n        padA: *mut ::core::ffi::c_int,\n        stridesA: *mut ::core::ffi::c_int,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets the shape of the output tensor for N-D pooling\n\n Retrieve the tensor dimensions for the forward N-D pooling. This call is required for\n the forward if the output dimensions are different than the input tensor\n dimensions.\n\n @param poolDesc      Pointer to a pooling layer descriptor (input)\n @param tensorDesc    Input tensor descriptor (input)\n @param dims          Dimension of the pooling (input)\n @param tensorDimArr  Array of tensor dimension (output)\n @return           miopenStatus_t*/\n    pub fn miopenGetPoolingNdForwardOutputDim(\n        poolDesc: miopenPoolingDescriptor_t,\n        tensorDesc: miopenTensorDescriptor_t,\n        dims: ::core::ffi::c_int,\n        tensorDimArr: *mut ::core::ffi::c_int,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get the amount of GPU memory required for pooling\n\n Retrieves the amount of workspace in bytes require for pooling. This call is required to\n determine the amount of GPU memory needed for the backwards pooling algorithms. For max-\n pooling, an assumption is that index data type is uint8_t, therefore the returned\n workspace size will be based on this assumption even if the user sets the index type with\n miopenSetPoolingIndexType().\n\n @param yDesc          Descriptor for pooling layer (input)\n @param workSpaceSize  Pointer to workSpaceSize (output)\n @return               miopenStatus_t*/\n    pub fn miopenPoolingGetWorkSpaceSize(\n        yDesc: miopenTensorDescriptor_t,\n        workSpaceSize: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get the amount of GPU memory required for pooling\n\n Retrieves the amount of workspace in bytes require for pooling. This call is required to\n determine the amount of GPU memory needed for the backwards pooling algorithms. For max-\n pooling, there is no assumption on index data type. As the user can set the index datatype\n size using miopenSetPoolingIndexType().\n\n @param poolDesc       Pointer to a pooling layer descriptor (input)\n @param yDesc          Descriptor for pooling layer (input)\n @param workSpaceSize  Pointer to workSpaceSize (output)\n @return               miopenStatus_t*/\n    pub fn miopenPoolingGetWorkSpaceSizeV2(\n        poolDesc: miopenPoolingDescriptor_t,\n        yDesc: miopenTensorDescriptor_t,\n        workSpaceSize: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute a forward pooling layer\n\n Runs forward pooling. miopenGetPoolingForwardOutputDim() should be called before\n miopenPoolingForward().\n If the parameter do_backward == 0, then set workSpace = nullptr and workSpaceSize = 0. However,\n for back-propagation do_backwards must be set to 1 in miopenPoolingForward().\n\n @param handle         MIOpen handle (input)\n @param poolDesc       Descriptor for pooling layer (input)\n @param alpha          Floating point scaling factor, allocated on the host (input)\n @param xDesc          Tensor descriptor for data input tensor x (input)\n @param x              Data tensor x (input)\n @param beta           Floating point shift factor, allocated on the host (input)\n @param yDesc          Tensor descriptor for output data tensor y (input)\n @param y              Data tensor y (output)\n @param do_backward    Boolean to toggle save data in workspace for backwards pass (input)\n @param workSpace      Pointer user allocated memory (input)\n @param workSpaceSize  Size in bytes of the memory needed (input)\n @return               miopenStatus_t*/\n    pub fn miopenPoolingForward(\n        handle: miopenHandle_t,\n        poolDesc: miopenPoolingDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        yDesc: miopenTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        do_backward: bool,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSize: usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute a backward pooling layer\n\n Runs backward pooling. miopenPoolingGetWorkSpaceSize() must be called before\n miopenPoolingBackward() to determine the amount of workSpace to be allocated.\n\n @param handle         MIOpen handle (input)\n @param poolDesc       Descriptor for pooling layer (input)\n @param alpha          Floating point scaling factor, allocated on the host (input)\n @param yDesc          Tensor descriptor for output data tensor y (input)\n @param y              Data tensor y (input)\n @param dyDesc         Tensor descriptor for data input tensor dy (input)\n @param dy             Data delta tensor dy (input)\n @param xDesc          Tensor descriptor for output data tensor x (input)\n @param x              Data tensor x (output)\n @param beta           Floating point shift factor, allocated on the host (input)\n @param dxDesc         Tensor descriptor for tensor dx (input)\n @param dx             Weights delta tensor dx (output)\n @param workSpace      Pointer to user allocated workspace (input)\n @return               miopenStatus_t*/\n    pub fn miopenPoolingBackward(\n        handle: miopenHandle_t,\n        poolDesc: miopenPoolingDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        yDesc: miopenTensorDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        dyDesc: miopenTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        dxDesc: miopenTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n        workSpace: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Destroys the pooling descriptor object\n\n @param poolDesc Pooling tensor descriptor type (input)\n @return           miopenStatus_t*/\n    pub fn miopenDestroyPoolingDescriptor(\n        poolDesc: miopenPoolingDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" @addtogroup LRN\\n\\n  @{\\n/\\n/*! @brief Creates a local response normalization (LRN) layer descriptor\\n\\n @param lrnDesc    Pointer to a local response normalization layer descriptor type\\n @return           miopenStatus_t\"]\n    pub fn miopenCreateLRNDescriptor(\n        lrnDesc: *mut miopenLRNDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets a LRN layer descriptor details\n\n Sets all of the descriptor details for the LRN layer. The number of window elements lrnN is\n a diameter and always odd.\n\n @param lrnDesc      Pointer to a LRN layer descriptor (output)\n @param mode         LRN mode enum (input)\n @param lrnN         Number of normalization window elements (input)\n @param lrnAlpha     Scaling factor (input)\n @param lrnBeta      Shift factor (input)\n @param lrnK         K factor (input)\n @return             miopenStatus_t*/\n    pub fn miopenSetLRNDescriptor(\n        lrnDesc: miopenLRNDescriptor_t,\n        mode: miopenLRNMode_t,\n        lrnN: ::core::ffi::c_uint,\n        lrnAlpha: f64,\n        lrnBeta: f64,\n        lrnK: f64,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets a LRN layer descriptor details\n\n Retrieve the LRN descriptor details.\n\n @param lrnDesc      Pointer to a LRN layer descriptor (input)\n @param mode         LRN mode enum (output)\n @param lrnN         Number of normalization window elements (output)\n @param lrnAlpha     Scaling factor (output)\n @param lrnBeta      Shift factor (output)\n @param lrnK         K factor (output)\n @return             miopenStatus_t*/\n    pub fn miopenGetLRNDescriptor(\n        lrnDesc: miopenLRNDescriptor_t,\n        mode: *mut miopenLRNMode_t,\n        lrnN: *mut ::core::ffi::c_uint,\n        lrnAlpha: *mut f64,\n        lrnBeta: *mut f64,\n        lrnK: *mut f64,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Determine the workspace requirements.\n\n This function determines the GPU memory allocation required to execute the LRN layer based on the\n LRN descriptor.\n\n @param yDesc           Pointer to a LRN layer descriptor (input)\n @param workSpaceSize   Output variable for workspace size (output)\n @return                miopenStatus_t*/\n    pub fn miopenLRNGetWorkSpaceSize(\n        yDesc: miopenTensorDescriptor_t,\n        workSpaceSize: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute a LRN forward layer\n\n Runs the forward layer normalization in the forward direction. If do_backward == 0, then\n set workSpace = nullptr and workSpaceSize = 0. However, if the user wishes to execute backwards,\n then they must set do_backwards = 1 in miopenLRNForward().\n\n @param handle         MIOpen handle (input)\n @param lrnDesc        Descriptor for LRN layer (input)\n @param alpha          Floating point scaling factor, allocated on the host (input)\n @param xDesc          Tensor descriptor for data input tensor x (input)\n @param x              Data tensor x (input)\n @param beta           Floating point shift factor, allocated on the host (input)\n @param yDesc          Tensor descriptor for output data tensor y (input)\n @param y              Data tensor y (output)\n @param do_backward    Boolean to toggle save data in workspace for backwards pass (input)\n @param workSpace      Pointer user allocated memory (input)\n @return               miopenStatus_t*/\n    pub fn miopenLRNForward(\n        handle: miopenHandle_t,\n        lrnDesc: miopenLRNDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        yDesc: miopenTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        do_backward: bool,\n        workSpace: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute a LRN backward layer\n\n @param handle         MIOpen handle (input)\n @param lrnDesc        Descriptor for LRN layer (input)\n @param alpha          Floating point scaling factor, allocated on the host (input)\n @param yDesc          Tensor descriptor for data input tensor y (input)\n @param y              Data tensor y (input)\n @param dyDesc         Tensor descriptor for data input tensor dy (input)\n @param dy             Data delta tensor dy (input)\n @param xDesc          Tensor descriptor for input data tensor x (input)\n @param x              Data tensor x (input)\n @param beta           Floating point shift factor, allocated on the host (input)\n @param dxDesc         Tensor descriptor for output data tensor dx(input)\n @param dx             Data delta tensor x (output)\n @param workSpace      Pointer user allocated memory (input)\n @return               miopenStatus_t*/\n    pub fn miopenLRNBackward(\n        handle: miopenHandle_t,\n        lrnDesc: miopenLRNDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        yDesc: miopenTensorDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        dyDesc: miopenTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        dxDesc: miopenTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n        workSpace: *const ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Destroys the LRN descriptor object\n\n @param lrnDesc   LRN tensor descriptor type (input)\n @return          miopenStatus_t*/\n    pub fn miopenDestroyLRNDescriptor(lrnDesc: miopenLRNDescriptor_t) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" @addtogroup layernorm\\n\\n  @{\\n/\\n/*! @brief Execute a layernorm forward layer\\n\\n @param handle         MIOpen handle (input)\\n @param mode           LayerNorm mode (input)\\n @param xDesc          Tensor descriptor for data input tensor x (input)\\n @param x              Data tensor x (input)\\n @param weightDesc     Tensor descriptor for data input tensor weight (input)\\n @param weight         Data tensor weight (input)\\n @param biasDesc       Tensor descriptor for data input tensor bias (input)\\n @param bias           Data tensor bias (input)\\n @param epsilon        Value to stablize inverse variance calculation (input)\\n @param normalized_dim Nomalized dimensions in the input array (input)\\n @param yDesc          Tensor descriptor for output data tensor y (input)\\n @param y              Data tensor y (output)\\n @param meanDesc       Tensor descriptor for output data tensor mean (input)\\n @param mean           Data tensor mean (output)\\n @param rstdDesc       Tensor descriptor for output data tensor rstd (input)\\n @param rstd           Data tensor rstd (output)\\n @return               miopenStatus_t\"]\n    pub fn miopenLayerNormForward(\n        handle: miopenHandle_t,\n        mode: miopenNormMode_t,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        weightDesc: miopenTensorDescriptor_t,\n        weight: *const ::core::ffi::c_void,\n        biasDesc: miopenTensorDescriptor_t,\n        bias: *const ::core::ffi::c_void,\n        epsilon: f32,\n        normalized_dim: i32,\n        yDesc: miopenTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        meanDesc: miopenTensorDescriptor_t,\n        mean: *mut ::core::ffi::c_void,\n        rstdDesc: miopenTensorDescriptor_t,\n        rstd: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" @addtogroup cat\\n\\n  @{\\n/\\n/*! @brief Execute a cat forward layer\\n\\n @param handle         MIOpen handle (input)\\n @param xCount         Number of input tensor x (input)\\n @param xDescs         Tensor descriptor of input tensor x (input)\\n @param xs             Source data tensor x (input)\\n @param yDesc          Tensor descriptor of output tensor y (input)\\n @param y              Data tensor y (output)\\n @param dim            Concatenation dimension (input)\\n @return               miopenStatus_t\"]\n    pub fn miopenCatForward(\n        handle: miopenHandle_t,\n        xCount: i32,\n        xDescs: *const miopenTensorDescriptor_t,\n        xs: *const *const ::core::ffi::c_void,\n        yDesc: miopenTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        dim: i32,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Derive tensor for gamma and beta from input tensor descriptor\n\n This function takes the input tensor descriptor and outputs a derived tensor for the\n normalization scale (gamma) and shift (beta) tensors.\n\n For an input tensor NCHW and spatial mode, the output derived tensor is 1C11, while for\n per-activation the derived tensor is 1CHW.\n\n For an input tensor NCDHW and spatial mode, the output derived tensor is 1C111, while for\n per-activation the derived tensor is 1CDHW.\n\n @param derivedBnDesc   Output derived tensor descriptor (output)\n @param xDesc           Input tensor descriptor (input)\n @param bn_mode         Batch Normalization mode (input)\n @return                miopenStatus_t*/\n    pub fn miopenDeriveBNTensorDescriptor(\n        derivedBnDesc: miopenTensorDescriptor_t,\n        xDesc: miopenTensorDescriptor_t,\n        bn_mode: miopenBatchNormMode_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute forward training layer for batch normalization\n\n Batch normalization pass for forward training pass.\n Takes in batch normalization mode bn_mode and input tensor x, output tensor y, bnBias and bnScale\n with their descriptor.\n\n If either resultSaveMean, or resultSaveInvVariance are null pointers then the values for the mean\n and inverse variance will not be used.\n\n Likewise, if either resultRunningMean, or resultRunningVariance are null pointers then the values\n for the running mean and variance will not be saved.\n Running averages and variances are scaled using an exponential averaging factor: \\f[\n \\mu_{old} = \\mu_{new}*factor + \\mu_{old}*(1-factor)\n \\f]\n where \\f[\n factor=1/(1+iteration)\n \\f]\n\n @param handle                    MIOpen handle (input)\n @param bn_mode                   Batch normalization mode (input)\n @param alpha                     Floating point scaling factor, allocated on the host (input)\n @param beta                      Floating point shift factor, allocated on the host (input)\n @param xDesc                     Tensor descriptor for data input tensor x (input)\n @param x                         Data tensor x (input)\n @param yDesc                     Tensor descriptor for output data tensor y (input)\n @param y                         Data tensor y (output)\n @param bnScaleBiasMeanVarDesc    Tensor descriptor for BN scaling, shifting, saved variance and\n mean (input)\n @param bnScale                   Batch norm scaling, gamma, tensor (input)\n @param bnBias                    Batch norm bias, beta, tensor (input)\n @param expAvgFactor              Exponential averaging factor (input)\n @param resultRunningMean         Running average saved for inference (output)\n @param resultRunningVariance     Running variance saved for inference (output)\n @param epsilon                   Value to stablize inverse variance calculation (input)\n @param resultSaveMean            Saved mini-batch mean for backwards pass (output)\n @param resultSaveInvVariance     Saved mini-batch inverse variance for backwards pass (output)\n @return                          miopenStatus_t*/\n    pub fn miopenBatchNormalizationForwardTraining(\n        handle: miopenHandle_t,\n        bn_mode: miopenBatchNormMode_t,\n        alpha: *mut ::core::ffi::c_void,\n        beta: *mut ::core::ffi::c_void,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        yDesc: miopenTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        bnScaleBiasMeanVarDesc: miopenTensorDescriptor_t,\n        bnScale: *mut ::core::ffi::c_void,\n        bnBias: *mut ::core::ffi::c_void,\n        expAvgFactor: f64,\n        resultRunningMean: *mut ::core::ffi::c_void,\n        resultRunningVariance: *mut ::core::ffi::c_void,\n        epsilon: f64,\n        resultSaveMean: *mut ::core::ffi::c_void,\n        resultSaveInvVariance: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute forward training layer for batch normalization\n\n Batch normalization pass for forward training pass.\n Takes in batch normalization mode bn_mode and input tensor x, output tensor y, bnBias and bnScale\n with their descriptor.\n\n If either resultSaveMean, or resultSaveInvVariance are null pointers then the values for the mean\n and inverse variance will not be used.\n\n Likewise, if either resultRunningMean, or resultRunningVariance are null pointers then the values\n for the running mean and variance will not be saved.\n Running averages and variances are scaled using an exponential averaging factor: \\f[\n \\mu_{old} = \\mu_{new}*factor + \\mu_{old}*(1-factor)\n \\f]\n where \\f[\n factor=1/(1+iteration)\n \\f]\n\n @param handle                    MIOpen handle (input)\n @param bn_mode                   Batch normalization mode (input)\n @param alpha                     Floating point scaling factor, allocated on the host (input)\n @param beta                      Floating point shift factor, allocated on the host (input)\n @param xDesc                     Tensor descriptor for data input tensor x (input)\n @param x                         Data tensor x (input)\n @param yDesc                     Tensor descriptor for output data tensor y (input)\n @param y                         Data tensor y (output)\n @param ScaleDesc                 Tensor descriptor for BN scaling\n @param biasVarDesc               Tensor descriptor for BN bias\n @param savedMeanDesc             Tensor descriptor for BN saved Mean\n @param savedVarDesc              Tensor descriptor for BN saved Variance\n @param bnScale                   Batch norm scaling, gamma, tensor (input)\n @param bnBias                    Batch norm bias, beta, tensor (input)\n @param expAvgFactor              Exponential averaging factor (input)\n @param resultRunningMean         Running average saved for inference (output)\n @param resultRunningVariance     Running variance saved for inference (output)\n @param epsilon                   Value to stablize inverse variance calculation (input)\n @param resultSaveMean            Saved mini-batch mean for backwards pass (output)\n @param resultSaveInvVariance     Saved mini-batch inverse variance for backwards pass (output)\n @return                          miopenStatus_t*/\n    pub fn miopenBatchNormalizationForwardTraining_V2(\n        handle: miopenHandle_t,\n        bn_mode: miopenBatchNormMode_t,\n        alpha: *mut ::core::ffi::c_void,\n        beta: *mut ::core::ffi::c_void,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        yDesc: miopenTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        scaleDesc: miopenTensorDescriptor_t,\n        biasVarDesc: miopenTensorDescriptor_t,\n        savedMeanDesc: miopenTensorDescriptor_t,\n        savedVarDesc: miopenTensorDescriptor_t,\n        bnScale: *mut ::core::ffi::c_void,\n        bnBias: *mut ::core::ffi::c_void,\n        expAvgFactor: f64,\n        resultRunningMean: *mut ::core::ffi::c_void,\n        resultRunningVariance: *mut ::core::ffi::c_void,\n        epsilon: f64,\n        resultSaveMean: *mut ::core::ffi::c_void,\n        resultSaveInvVariance: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute forward inference layer for batch normalization\n\n Batch normalization pass for forward inference pass.\n Takes in batch normalization mode bn_mode and input tensor x, output tensor y, bnBias and bnScale\n with their descriptor.\n\n If either estimatedMean, or estimatedVariance are null pointers then the values for the mean and\n variance will be calculated from input data and this calculated mean and variance will be used\n to update input values.\n If variance is zero and epsilon is also zero, this function outputs NAN values.  Input espilon\n value should always be non zero positive value.\n\n @param handle                    MIOpen handle (input)\n @param bn_mode                   Batch normalization mode (input)\n @param alpha                     Floating point scaling factor, allocated on the host (input)\n @param beta                      Floating point shift factor, allocated on the host (input)\n @param xDesc                     Tensor descriptor for data input tensor x (input)\n @param x                         Data tensor x (input)\n @param yDesc                     Tensor descriptor for output data tensor y (input)\n @param y                         Data tensor y (output)\n @param bnScaleBiasMeanVarDesc    Tensor descriptor for BN scaling, shifting, saved variance and\n mean (input)\n @param bnScale                   Batch norm scaling, gamma, tensor (input)\n @param bnBias                    Batch norm bias, beta, tensor (input)\n @param estimatedMean             Running average saved during forward training (input)\n @param estimatedVariance         Running variance saved during forward training (input)\n @param epsilon                   Value to stabilize inverse variance calculation (input)\n @return                          miopenStatus_t*/\n    pub fn miopenBatchNormalizationForwardInference(\n        handle: miopenHandle_t,\n        bn_mode: miopenBatchNormMode_t,\n        alpha: *mut ::core::ffi::c_void,\n        beta: *mut ::core::ffi::c_void,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        yDesc: miopenTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        bnScaleBiasMeanVarDesc: miopenTensorDescriptor_t,\n        bnScale: *mut ::core::ffi::c_void,\n        bnBias: *mut ::core::ffi::c_void,\n        estimatedMean: *mut ::core::ffi::c_void,\n        estimatedVariance: *mut ::core::ffi::c_void,\n        epsilon: f64,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute forward inference layer for batch normalization\n\n Batch normalization pass for forward inference pass.\n Takes in batch normalization mode bn_mode and input tensor x, output tensor y, bnBias and bnScale\n with their descriptor.\n\n If either estimatedMean, or estimatedVariance are null pointers then the values for the mean and\n variance will be calculated from input data and this calculated mean and variance will be used\n to update input values.\n If variance is zero and epsilon is also zero, this function outputs NAN values.  Input espilon\n value should always be non zero positive value.\n\n @param handle                    MIOpen handle (input)\n @param bn_mode                   Batch normalization mode (input)\n @param alpha                     Floating point scaling factor, allocated on the host (input)\n @param beta                      Floating point shift factor, allocated on the host (input)\n @param xDesc                     Tensor descriptor for data input tensor x (input)\n @param x                         Data tensor x (input)\n @param yDesc                     Tensor descriptor for output data tensor y (input)\n @param y                         Data tensor y (output)\n @param ScaleDesc                 Tensor descriptor for BN scaling\n @param biasVarDesc               Tensor descriptor for BN bias\n @param estMeanDesc               Tensor descriptor for BN estimated Mean\n @param estVarianceDesc           Tensor descriptor for BN estimated Variance\n @param bnScale                   Batch norm scaling, gamma, tensor (input)\n @param bnBias                    Batch norm bias, beta, tensor (input)\n @param estimatedMean             Running average saved during forward training (input)\n @param estimatedVariance         Running variance saved during forward training (input)\n @param epsilon                   Value to stabilize inverse variance calculation (input)\n @return                          miopenStatus_t*/\n    pub fn miopenBatchNormalizationForwardInference_V2(\n        handle: miopenHandle_t,\n        bn_mode: miopenBatchNormMode_t,\n        alpha: *mut ::core::ffi::c_void,\n        beta: *mut ::core::ffi::c_void,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        yDesc: miopenTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        scaleDesc: miopenTensorDescriptor_t,\n        biasDesc: miopenTensorDescriptor_t,\n        estMeanDesc: miopenTensorDescriptor_t,\n        estVarianceDesc: miopenTensorDescriptor_t,\n        bnScale: *mut ::core::ffi::c_void,\n        bnBias: *mut ::core::ffi::c_void,\n        estimatedMean: *mut ::core::ffi::c_void,\n        estimatedVariance: *mut ::core::ffi::c_void,\n        epsilon: f64,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute backwards propagation layer for batch normalization\n\n Batch normalization pass for backwards propagation training pass.\n The method for backwards propagation batch normalization.\n\n Takes in batch normalization mode bn_mode and input tensor data x, input activation tensor dy,\n output tensor dx, the learned tensors resultBNBiasDiff and resultBNScaleDiff with their\n descriptor.\n\n If BOTH savedMean, and savedVariance are not null pointers then the method will use the saved\n mean and variance calculated by the forward training phase.\n\n @param handle                    MIOpen handle (input)\n @param bn_mode                   Batch normalization mode (input)\n @param alphaDataDiff             Floating point scaling factor, allocated on the host (input)\n @param betaDataDiff              Floating point shift factor, allocated on the host (input)\n @param alphaParamDiff            Floating point scaling factor, allocated on the host (input)\n @param betaParamDiff             Floating point shift factor, allocated on the host (input)\n @param xDesc                     Tensor descriptor for data input tensor x (input)\n @param x                         Data tensor x (input)\n @param dyDesc                    Tensor descriptor for output data tensor y (input)\n @param dy                        Data tensor y (input)\n @param dxDesc                    Tensor descriptor for output data tensor dx (input)\n @param dx                        Data delta tensor dx (output)\n @param bnScaleBiasDiffDesc       Tensor descriptor for BN scaling, shifting, saved variance and\n mean (input)\n @param bnScale                   Batch norm scaling, gamma, tensor (input)\n @param resultBnScaleDiff         Tensor for dscale (output)\n @param resultBnBiasDiff          Tensor for dbias (output)\n @param epsilon                   Value to stabilize inverse variance calculation (input)\n @param savedMean                 Saved mini-batch mean for backwards pass (input)\n @param savedInvVariance          Saved mini-bathc inverse variance for backwards pass (input)\n @return                          miopenStatus_t*/\n    pub fn miopenBatchNormalizationBackward(\n        handle: miopenHandle_t,\n        bn_mode: miopenBatchNormMode_t,\n        alphaDataDiff: *const ::core::ffi::c_void,\n        betaDataDiff: *const ::core::ffi::c_void,\n        alphaParamDiff: *const ::core::ffi::c_void,\n        betaParamDiff: *const ::core::ffi::c_void,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        dyDesc: miopenTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        dxDesc: miopenTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n        bnScaleBiasDiffDesc: miopenTensorDescriptor_t,\n        bnScale: *const ::core::ffi::c_void,\n        resultBnScaleDiff: *mut ::core::ffi::c_void,\n        resultBnBiasDiff: *mut ::core::ffi::c_void,\n        epsilon: f64,\n        savedMean: *const ::core::ffi::c_void,\n        savedInvVariance: *const ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute backwards propagation layer for batch normalization\n\n Batch normalization pass for backwards propagation training pass.\n The method for backwards propagation batch normalization.\n\n Takes in batch normalization mode bn_mode and input tensor data x, input activation tensor dy,\n output tensor dx, the learned tensors resultBNBiasDiff and resultBNScaleDiff with their\n descriptor.\n\n If BOTH savedMean, and savedVariance are not null pointers then the method will use the saved\n mean and variance calculated by the forward training phase.\n\n @param handle                    MIOpen handle (input)\n @param bn_mode                   Batch normalization mode (input)\n @param alphaDataDiff             Floating point scaling factor, allocated on the host (input)\n @param betaDataDiff              Floating point shift factor, allocated on the host (input)\n @param alphaParamDiff            Floating point scaling factor, allocated on the host (input)\n @param betaParamDiff             Floating point shift factor, allocated on the host (input)\n @param xDesc                     Tensor descriptor for data input tensor x (input)\n @param x                         Data tensor x (input)\n @param dyDesc                    Tensor descriptor for output data tensor y (input)\n @param dy                        Data tensor y (input)\n @param dxDesc                    Tensor descriptor for output data tensor dx (input)\n @param dx                        Data delta tensor dx (output)\n @param scaleDesc                 Tensor descriptor for scaling descriptor (input)\n @param biasDesc                  Tensor descriptor for bias/shift descriptor (input)\n @param savedMeanDesc             Tensor descriptor for saved Mean  descriptor (input)\n @param savedVarDesc              Tensor descriptor for saved Variance descriptor (input)\n , shifting, saved variance and\n mean (input)\n @param bnScale                   Batch norm scaling, gamma, tensor (input)\n @param resultBnScaleDiff         Tensor for dscale (output)\n @param resultBnBiasDiff          Tensor for dbias (output)\n @param epsilon                   Value to stabilize inverse variance calculation (input)\n @param savedMean                 Saved mini-batch mean for backwards pass (input)\n @param savedInvVariance          Saved mini-bathc inverse variance for backwards pass (input)\n @return                          miopenStatus_t*/\n    pub fn miopenBatchNormalizationBackward_V2(\n        handle: miopenHandle_t,\n        bn_mode: miopenBatchNormMode_t,\n        alphaDataDiff: *const ::core::ffi::c_void,\n        betaDataDiff: *const ::core::ffi::c_void,\n        alphaParamDiff: *const ::core::ffi::c_void,\n        betaParamDiff: *const ::core::ffi::c_void,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        dyDesc: miopenTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        dxDesc: miopenTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n        scaleDesc: miopenTensorDescriptor_t,\n        biasDesc: miopenTensorDescriptor_t,\n        savedMeanDesc: miopenTensorDescriptor_t,\n        savedVarDesc: miopenTensorDescriptor_t,\n        bnScale: *const ::core::ffi::c_void,\n        resultBnScaleDiff: *mut ::core::ffi::c_void,\n        resultBnBiasDiff: *mut ::core::ffi::c_void,\n        epsilon: f64,\n        savedMean: *const ::core::ffi::c_void,\n        savedInvVariance: *const ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" @addtogroup activation\\n\\n  @{\\n/\\n/*! @brief Creates the Activation descriptor object\\n\\n @param activDesc Pointer to an activation tensor descriptor type\\n @return          miopenStatus_t\"]\n    pub fn miopenCreateActivationDescriptor(\n        activDesc: *mut miopenActivationDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets the activation layer descriptor details\n\n Sets all of the descriptor details for the activation layer\n\n @param activDesc    Pointer to a activation layer descriptor (output)\n @param mode         Activation mode enum (input)\n @param activAlpha   Alpha value for some activation modes (input)\n @param activBeta    Beta value for some activation modes (input)\n @param activGamma   Gamma value for some activation modes (input)\n @return             miopenStatus_t*/\n    pub fn miopenSetActivationDescriptor(\n        activDesc: miopenActivationDescriptor_t,\n        mode: miopenActivationMode_t,\n        activAlpha: f64,\n        activBeta: f64,\n        activGamma: f64,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets the activation layer descriptor details\n\n Retrieves all of the descriptor details for the activation layer.\n\n @param activDesc    Pointer to a activation layer descriptor (input)\n @param mode         Activation mode enum (output)\n @param activAlpha   Alpha value for some activation modes (output)\n @param activBeta    Beta value for some activation modes (output)\n @param activGamma   Gamma value for some activation modes (output)\n @return             miopenStatus_t*/\n    pub fn miopenGetActivationDescriptor(\n        activDesc: miopenActivationDescriptor_t,\n        mode: *mut miopenActivationMode_t,\n        activAlpha: *mut f64,\n        activBeta: *mut f64,\n        activGamma: *mut f64,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute an activation forward layer\n\n @param handle         MIOpen handle (input)\n @param activDesc      Descriptor for activation layer (input)\n @param alpha          Floating point scaling factor, allocated on the host (input)\n @param xDesc          Tensor descriptor for data input tensor x (input)\n @param x              Data tensor x (input)\n @param beta           Floating point shift factor, allocated on the host (input)\n @param yDesc          Tensor descriptor for output data tensor y (input)\n @param y              Data tensor y (output)\n @return               miopenStatus_t*/\n    pub fn miopenActivationForward(\n        handle: miopenHandle_t,\n        activDesc: miopenActivationDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        yDesc: miopenTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute a activation backwards layer\n\n @param handle         MIOpen handle (input)\n @param activDesc      Descriptor for activation layer (input)\n @param alpha          Floating point scaling factor, allocated on the host (input)\n @param yDesc          Tensor descriptor for input data tensor y (input)\n @param y              Data tensor y (input)\n @param dyDesc         Tensor descriptor for input data tensor dy (input)\n @param dy             Data delta tensor dy (input)\n @param xDesc          Tensor descriptor for data input tensor x (input)\n @param x              Data tensor x (input)\n @param beta           Floating point shift factor, allocated on the host (input)\n @param dxDesc         Tensor descriptor for data output tensor dx (input)\n @param dx             Output data delta tensor dx (output)\n @return               miopenStatus_t*/\n    pub fn miopenActivationBackward(\n        handle: miopenHandle_t,\n        activDesc: miopenActivationDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        yDesc: miopenTensorDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        dyDesc: miopenTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        dxDesc: miopenTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Destroys the activation descriptor object\n\n @param activDesc   Activation tensor descriptor type (input)\n @return            miopenStatus_t*/\n    pub fn miopenDestroyActivationDescriptor(\n        activDesc: miopenActivationDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute a GLU forward layer\n\n @param handle                   MIOpen handle (input)\n @param inputDesc                Tensor descriptor for input tensor (input)\n @param input                    Input tensor (input)\n @param outputDesc               Tensor descriptor for output tensor (input)\n @param output                   Output tensor (output)\n @param dim                      Dimension to split the input (input)\n @return                         miopenStatus_t*/\n    pub fn miopenGLUForward(\n        handle: miopenHandle_t,\n        inputDesc: miopenTensorDescriptor_t,\n        input: *const ::core::ffi::c_void,\n        outputDesc: miopenTensorDescriptor_t,\n        output: *mut ::core::ffi::c_void,\n        dim: u32,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute a GLU backward layer\n\n @param handle                   MIOpen handle (input)\n @param inputDesc                Tensor descriptor for input tensor (input)\n @param input                    Input tensor (input)\n @param outputGradDesc           Tensor descriptor for delta output tensor (input)\n @param outputGrad               Delta output tensor (input)\n @param inputGradDesc            Tensor descriptor for delta input tensor (input)\n @param inputGrad                Delta input tensor (output)\n @param dim                      Dimension to split the input (input)\n @return                         miopenStatus_t*/\n    pub fn miopenGLUBackward(\n        handle: miopenHandle_t,\n        inputDesc: miopenTensorDescriptor_t,\n        input: *const ::core::ffi::c_void,\n        outputGradDesc: miopenTensorDescriptor_t,\n        outputGrad: *const ::core::ffi::c_void,\n        inputGradDesc: miopenTensorDescriptor_t,\n        inputGrad: *mut ::core::ffi::c_void,\n        dim: u32,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" @addtogroup softmax\\n\\n  @{\\n/\\n/*! @brief Execute a softmax forward layer\\n\\n This API only implements the SOFTMAX_MODE_CHANNEL in SOFTMAX_ACCURATE path.\\n\\n @param handle         MIOpen handle (input)\\n @param alpha          Floating point scaling factor, allocated on the host (input)\\n @param xDesc          Tensor descriptor for data input tensor x (input)\\n @param x              Data tensor x (input)\\n @param beta           Floating point shift factor, allocated on the host (input)\\n @param yDesc          Tensor descriptor for output data tensor y (input)\\n @param y              Data tensor y (output)\\n @return               miopenStatus_t\"]\n    pub fn miopenSoftmaxForward(\n        handle: miopenHandle_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        yDesc: miopenTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute a softmax backwards layer\n\n This API only implements the SOFTMAX_MODE_CHANNEL in SOFTMAX_ACCURATE path.\n\n @param handle         MIOpen handle (input)\n @param alpha          Floating point scaling factor, allocated on the host (input)\n @param yDesc          Tensor descriptor for input data tensor y (input)\n @param y              Data tensor y (input)\n @param dyDesc         Tensor descriptor for input data tensor dy (input)\n @param dy             Data delta tensor dy (input)\n @param beta           Floating point shift factor, allocated on the host (input)\n @param dxDesc         Tensor descriptor for data output tensor dx (input)\n @param dx             Output data delta tensor dx (output)\n @return               miopenStatus_t*/\n    pub fn miopenSoftmaxBackward(\n        handle: miopenHandle_t,\n        alpha: *const ::core::ffi::c_void,\n        yDesc: miopenTensorDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        dyDesc: miopenTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        dxDesc: miopenTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute a softmax forward layer with expanded modes and algorithms\n\n @param handle         MIOpen handle (input)\n @param alpha          Floating point scaling factor, allocated on the host (input)\n @param xDesc          Tensor descriptor for data input tensor x (input)\n @param x              Data tensor x (input)\n @param beta           Floating point shift factor, allocated on the host (input)\n @param yDesc          Tensor descriptor for output data tensor y (input)\n @param y              Data tensor y (output)\n @param algorithm      Softmax implementation algorithm (input)\n @param mode           Softmax mode (input)\n @return               miopenStatus_t*/\n    pub fn miopenSoftmaxForward_V2(\n        handle: miopenHandle_t,\n        alpha: *const ::core::ffi::c_void,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        yDesc: miopenTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        algorithm: miopenSoftmaxAlgorithm_t,\n        mode: miopenSoftmaxMode_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute a softmax backwards layer with expanded modes and algorithms\n\n @param handle         MIOpen handle (input)\n @param alpha          Floating point scaling factor, allocated on the host (input)\n @param yDesc          Tensor descriptor for input data tensor y (input)\n @param y              Data tensor y (input)\n @param dyDesc         Tensor descriptor for input data tensor dy (input)\n @param dy             Data delta tensor dy (input)\n @param beta           Floating point shift factor, allocated on the host (input)\n @param dxDesc         Tensor descriptor for data output tensor dx (input)\n @param dx             Output data delta tensor dx (output)\n @param algorithm      Softmax implementation algorithm (input)\n @param mode           Softmax mode (input)\n @return               miopenStatus_t*/\n    pub fn miopenSoftmaxBackward_V2(\n        handle: miopenHandle_t,\n        alpha: *const ::core::ffi::c_void,\n        yDesc: miopenTensorDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        dyDesc: miopenTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        dxDesc: miopenTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n        algorithm: miopenSoftmaxAlgorithm_t,\n        mode: miopenSoftmaxMode_t,\n    ) -> miopenStatus_t;\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenFusionPlanDescriptor {\n    pub _address: u8,\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenFusionPlanDescriptor_t(pub *mut miopenFusionPlanDescriptor);\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenOperatorDescriptor {\n    pub _address: u8,\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenOperatorDescriptor_t(pub *mut miopenOperatorDescriptor);\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenOperatorArgs {\n    pub _address: u8,\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenOperatorArgs_t(pub *mut miopenOperatorArgs);\nimpl miopenFusionDirection_t {\n    ///< fuses layers vertically, current the only supported mode\n    pub const miopenVerticalFusion: miopenFusionDirection_t = miopenFusionDirection_t(0);\n}\nimpl miopenFusionDirection_t {\n    ///< fuses layers horizontally, this is unimplemented\n    pub const miopenHorizontalFusion: miopenFusionDirection_t = miopenFusionDirection_t(\n        1,\n    );\n}\n#[repr(transparent)]\n/** @enum miopenFusionDirection_t\n @brief Kernel fusion direction in the network*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenFusionDirection_t(pub ::core::ffi::c_uint);\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates the kenrel fusion plan descriptor object\n\n @param fusePlanDesc  Pointer to a fusion plan (output)\n @param fuseDirection Horizontal or Vertical fusion (input)\n @param inputDesc     Descriptor to tensor for the input (input)\n @return              miopenStatus_t*/\n    pub fn miopenCreateFusionPlan(\n        fusePlanDesc: *mut miopenFusionPlanDescriptor_t,\n        fuseDirection: miopenFusionDirection_t,\n        inputDesc: miopenTensorDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Destroy the fusion plan descriptor object\n\n @param fusePlanDesc  A fusion plan descriptor type\n @return              miopenStatus_t*/\n    pub fn miopenDestroyFusionPlan(\n        fusePlanDesc: miopenFusionPlanDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Compiles the fusion plan\n\n @param handle           MIOpen handle (input)\n @param fusePlanDesc A fusion plan descriptor (input)\n @return             miopenStatus_t*/\n    pub fn miopenCompileFusionPlan(\n        handle: miopenHandle_t,\n        fusePlanDesc: miopenFusionPlanDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Allows access to the operators in a fusion plan\n @details This api call does bounds checking on the supplied op_idx and would\n          return miopenStatusError if the index is out of bounds\n\n @param fusePlanDesc A fusion plan descriptor (input)\n @param op_idx Index of the required operator in the fusion plan, in the order of insertion\n @param op returned pointer to the operator\n @return miopenStatus_t*/\n    pub fn miopenFusionPlanGetOp(\n        fusePlanDesc: miopenFusionPlanDescriptor_t,\n        op_idx: ::core::ffi::c_int,\n        op: *mut miopenFusionOpDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Query the workspace size required for the fusion plan\n @param handle         MIOpen handle (input)\n @param fusePlanDesc   A fusion plan descriptor (input)\n @param workSpaceSize  Pointer to memory to return size in bytes (output)\n @param algo           Algorithm selected (inputs)\n @return               miopenStatus_t*/\n    pub fn miopenFusionPlanGetWorkSpaceSize(\n        handle: miopenHandle_t,\n        fusePlanDesc: miopenFusionPlanDescriptor_t,\n        workSpaceSize: *mut usize,\n        algo: miopenConvFwdAlgorithm_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Returns the supported algorithms for the convolution operator in the Fusion Plan\n\n @details A Convolution operator in a fusion plan may be implemented by different algorithms\n representing different tradeoffs of memory and performance. The returned list of algorithms\n is sorted in decreasing order of priority. Therefore, if the user does not request an\n algorithm to be set using the miopenFusionPlanConvolutionSetAlgo call, the first algorithm\n in the list would be used to execute the convolution in the fusion plan. Moreover this call\n must be immediately preceded by the miopenCreateOpConvForward call for the op in question.\n\n @param fusePlanDesc A fusion plan descriptor (input)\n @param requestAlgoCount Number of algorithms to return (input)\n @param returnedAlgoCount The actual number of returned algorithms; always be less than\n equal to requestAlgoCount (output)\n @param returnedAlgos Pointer to the list of supported algorithms\n @return miopenStatus_t*/\n    pub fn miopenFusionPlanConvolutionGetAlgo(\n        fusePlanDesc: miopenFusionPlanDescriptor_t,\n        requestAlgoCount: ::core::ffi::c_int,\n        returnedAlgoCount: *mut ::core::ffi::c_int,\n        returnedAlgos: *mut miopenConvFwdAlgorithm_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Requests the fusion runtime to choose a particular algorithm for the added convolution\n operation\n\n @details Please see the description for miopenFusionPlanConvolutionGetAlgo\n\n @param fusePlanDesc A fusion plan descriptor (input)\n @param algo Requested algorithm for the convolution operator (input)\n @return miopenStatus_t*/\n    pub fn miopenFusionPlanConvolutionSetAlgo(\n        fusePlanDesc: miopenFusionPlanDescriptor_t,\n        algo: miopenConvFwdAlgorithm_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates forward convolution operator.\n\n @param fusePlanDesc   A fusion plan descriptor (input)\n @param convOp         Pointer to an operator type (output)\n @param convDesc       Convolution layer descriptor (input)\n @param wDesc          Descriptor for the weights tensor (input)\n @return               miopenStatus_t*/\n    pub fn miopenCreateOpConvForward(\n        fusePlanDesc: miopenFusionPlanDescriptor_t,\n        convOp: *mut miopenFusionOpDescriptor_t,\n        convDesc: miopenConvolutionDescriptor_t,\n        wDesc: miopenTensorDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a forward activation operator.\n\n @param fusePlanDesc    A fusion plan descriptor (input)\n @param activFwdOp         Pointer to an operator type (output)\n @param mode            Activation version (input)\n @return                miopenStatus_t*/\n    pub fn miopenCreateOpActivationForward(\n        fusePlanDesc: miopenFusionPlanDescriptor_t,\n        activFwdOp: *mut miopenFusionOpDescriptor_t,\n        mode: miopenActivationMode_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a backward activation operator.\n\n @param fusePlanDesc    A fusion plan descriptor (input)\n @param activBwdOp         Pointer to an operator type (output)\n @param mode            Activation version (input)\n @return                miopenStatus_t*/\n    pub fn miopenCreateOpActivationBackward(\n        fusePlanDesc: miopenFusionPlanDescriptor_t,\n        activBwdOp: *mut miopenFusionOpDescriptor_t,\n        mode: miopenActivationMode_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a forward bias operator.\n\n @param fusePlanDesc   A fusion plan descriptor (input)\n @param biasOp         Pointer to an operator type (output)\n @param bDesc          bias tensor descriptor (input)\n @return               miopenStatus_t*/\n    pub fn miopenCreateOpBiasForward(\n        fusePlanDesc: miopenFusionPlanDescriptor_t,\n        biasOp: *mut miopenFusionOpDescriptor_t,\n        bDesc: miopenTensorDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a forward inference batch normalization operator.\n\n @param fusePlanDesc           A fusion plan descriptor (input)\n @param bnOp                   Pointer to an operator type (output)\n @param bn_mode                Batch normalization layer mode (input)\n @param bnScaleBiasMeanVarDesc Gamma, beta, mean, variance tensor descriptor (input)\n @return                       miopenStatus_t*/\n    pub fn miopenCreateOpBatchNormInference(\n        fusePlanDesc: miopenFusionPlanDescriptor_t,\n        bnOp: *mut miopenFusionOpDescriptor_t,\n        bn_mode: miopenBatchNormMode_t,\n        bnScaleBiasMeanVarDesc: miopenTensorDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a forward training batch normalization operator.\n\n @param fusePlanDesc           A fusion plan descriptor (input)\n @param bnFwdOp                   Pointer to an operator type (output)\n @param bn_mode                Batch normalization layer mode (input)\n @param runningMeanVariance    Toggles whether or not to save population statistics for inference;\n batch statistic are required (input)\n @return                       miopenStatus_t*/\n    pub fn miopenCreateOpBatchNormForward(\n        fusePlanDesc: miopenFusionPlanDescriptor_t,\n        bnFwdOp: *mut miopenFusionOpDescriptor_t,\n        bn_mode: miopenBatchNormMode_t,\n        runningMeanVariance: bool,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a back propagation batch normalization operator.\n\n @param fusePlanDesc           A fusion plan descriptor (input)\n @param bnBwdOp                   Pointer to an operator type (output)\n @param bn_mode                Batch normalization layer mode (input)\n @return                       miopenStatus_t*/\n    pub fn miopenCreateOpBatchNormBackward(\n        fusePlanDesc: miopenFusionPlanDescriptor_t,\n        bnBwdOp: *mut miopenFusionOpDescriptor_t,\n        bn_mode: miopenBatchNormMode_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates an operator argument object\n\n @param args        Pointer to an operator argument type (output)\n @return            miopenStatus_t*/\n    pub fn miopenCreateOperatorArgs(args: *mut miopenOperatorArgs_t) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Destroys an operator argument object\n\n @param args        An operator argument type (output)\n @return            miopenStatus_t*/\n    pub fn miopenDestroyOperatorArgs(args: miopenOperatorArgs_t) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets the arguments for forward convolution op\n\n @param args    An arguments object type (output)\n @param convOp  Forward convolution operator (input)\n @param alpha   Floating point scaling factor, allocated on the host (input)\n @param beta    Floating point shift factor, allocated on the host (input)\n @param w       Pointer to tensor memory  (input)\n @return        miopenStatus_t*/\n    pub fn miopenSetOpArgsConvForward(\n        args: miopenOperatorArgs_t,\n        convOp: miopenFusionOpDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        w: *const ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets the arguments for forward activation op\n\n @param args    An arguments object type (output)\n @param activFwdOp   Activation backwards operator (input)\n @param alpha   Floating point scaling factor, allocated on the host (input)\n @param beta    Floating point shift factor, allocated on the host (input)\n @param activAlpha  Double precision activation parameter which depends on activation mode (input)\n @param activBeta   Double precision activation parameter which depends on activation mode (input)\n @param activGamma  Double precision activation parameter which depends on activation mode (input)\n @return        miopenStatus_t*/\n    pub fn miopenSetOpArgsActivForward(\n        args: miopenOperatorArgs_t,\n        activFwdOp: miopenFusionOpDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        activAlpha: f64,\n        activBeta: f64,\n        activGamma: f64,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets the arguments for backward activation op\n\n @param args    An arguments object type (output)\n @param activBwdOp   Activation backwards operator (input)\n @param alpha   Floating point scaling factor, allocated on the host (input)\n @param beta    Floating point shift factor, allocated on the host (input)\n @param y        Data tensor y, output of activations in the forward direction (input)\n @param reserved    Data tensor reserved memory space; currently should be nullptr (input)\n @param activAlpha  Double precision activation parameter which depends on activation mode (input)\n @param activBeta   Double precision activation parameter which depends on activation mode (input)\n @param activGamma  Double precision activation parameter which depends on activation mode (input)\n @return        miopenStatus_t*/\n    pub fn miopenSetOpArgsActivBackward(\n        args: miopenOperatorArgs_t,\n        activBwdOp: miopenFusionOpDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        y: *const ::core::ffi::c_void,\n        reserved: *const ::core::ffi::c_void,\n        activAlpha: f64,\n        activBeta: f64,\n        activGamma: f64,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets the arguments for inference batch normalization op\n\n @param args               An arguments object type (output)\n @param bnOp               Batch normalization inference operator (input)\n @param alpha              Floating point scaling factor, allocated on the host (input)\n @param beta               Floating point shift factor, allocated on the host (input)\n @param bnScale            Pointer to the gamma tensor memory  (input)\n @param bnBias             Pointer to the beta tensor memory  (input)\n @param estimatedMean      Pointer to population mean memory  (input)\n @param estimatedVariance  Pointer to population variance memory  (input)\n @param epsilon            Scalar value for numerical stability (input)\n @return                   miopenStatus_t*/\n    pub fn miopenSetOpArgsBatchNormInference(\n        args: miopenOperatorArgs_t,\n        bnOp: miopenFusionOpDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        bnScale: *const ::core::ffi::c_void,\n        bnBias: *const ::core::ffi::c_void,\n        estimatedMean: *const ::core::ffi::c_void,\n        estimatedVariance: *const ::core::ffi::c_void,\n        epsilon: f64,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets the arguments for forward batch normalization op\n\n @param args               An arguments object type (output)\n @param bnOp               Batch normalization forward operator (input)\n @param alpha              Floating point scaling factor, allocated on the host (input)\n @param beta               Floating point shift factor, allocated on the host (input)\n @param bnScale            Pointer to the gamma tensor memory  (input)\n @param bnBias             Pointer to the beta tensor memory  (input)\n @param savedMean          Pointer to batch mean memory  (input)\n @param savedInvVariance   Pointer to batch inverse variance memory  (input)\n @param runningMean        Pointer to population mean memory  (input)\n @param runningVariance    Pointer to population variance memory  (input)\n @param expAvgFactor       Scalar value for control of population statistics (input)\n @param epsilon            Scalar value for numerical stability (input)\n @return                   miopenStatus_t*/\n    pub fn miopenSetOpArgsBatchNormForward(\n        args: miopenOperatorArgs_t,\n        bnOp: miopenFusionOpDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        bnScale: *const ::core::ffi::c_void,\n        bnBias: *const ::core::ffi::c_void,\n        savedMean: *mut ::core::ffi::c_void,\n        savedInvVariance: *mut ::core::ffi::c_void,\n        runningMean: *mut ::core::ffi::c_void,\n        runningVariance: *mut ::core::ffi::c_void,\n        expAvgFactor: f64,\n        epsilon: f64,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets the arguments for backward batch normalization op\n\n @param args               An arguments object type (output)\n @param bnOp               Batch normalization forward operator (input)\n @param alpha              Floating point scaling factor, allocated on the host (input)\n @param beta               Floating point shift factor, allocated on the host (input)\n @param x                  Pointer to the forward input tensor memory  (input)\n @param bnScale            Pointer to the gamma tensor memory  (input)\n @param bnBias             Pointer to the beta tensor memory  (input)\n @param resultBnScaleDiff  Pointer to the gamma gradient tensor memory  (output)\n @param resultBnBiasDiff   Pointer to the beta gradient tensor memory  (output)\n @param savedMean          Pointer to batch mean memory  (input)\n @param savedInvVariance   Pointer to batch inverse variance memory  (input)\n @return                   miopenStatus_t*/\n    pub fn miopenSetOpArgsBatchNormBackward(\n        args: miopenOperatorArgs_t,\n        bnOp: miopenFusionOpDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        x: *const ::core::ffi::c_void,\n        bnScale: *const ::core::ffi::c_void,\n        bnBias: *const ::core::ffi::c_void,\n        resultBnScaleDiff: *mut ::core::ffi::c_void,\n        resultBnBiasDiff: *mut ::core::ffi::c_void,\n        savedMean: *const ::core::ffi::c_void,\n        savedInvVariance: *const ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets the arguments for forward bias op\n\n @param args           An arguments object type (output)\n @param biasOp         Forward bias operator (input)\n @param alpha          Floating point scaling factor, allocated on the host (input)\n @param beta           Floating point shift factor, allocated on the host (input)\n @param bias           Pointer to the forward bias input tensor memory  (input)\n @return               miopenStatus_t*/\n    pub fn miopenSetOpArgsBiasForward(\n        args: miopenOperatorArgs_t,\n        biasOp: miopenFusionOpDescriptor_t,\n        alpha: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        bias: *const ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Executes the fusion plan\n\n\n @param handle           MIOpen handle (input)\n @param fusePlanDesc     fused plan descriptor (input)\n @param inputDesc        Descriptor of the input tensor (input)\n @param input            Source data tensor  (input)\n @param outputDesc       Decriptor of the output tensor (input)\n @param output           Destination data tensor  (output)\n @param args             An argument object of the fused kernel (input)\n @return           miopenStatus_t*/\n    pub fn miopenExecuteFusionPlan(\n        handle: miopenHandle_t,\n        fusePlanDesc: miopenFusionPlanDescriptor_t,\n        inputDesc: miopenTensorDescriptor_t,\n        input: *const ::core::ffi::c_void,\n        outputDesc: miopenTensorDescriptor_t,\n        output: *mut ::core::ffi::c_void,\n        args: miopenOperatorArgs_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Prepares and executes the Convlution+Bias+Activation Fusion.\n\n\n @param handle               MIOpen handle (input)\n @param alpha1               floating point scaling factor, allocated on the host (input)\n @param xDesc                Tensor descriptor for input data tensor x (input)\n @param x                    Data tensor x (input)\n @param wDesc                Tensor descriptor for weight tensor w (input)\n @param w                    Weights tensor w (input)\n @param convDesc             Convolution layer descriptor (input)\n @param algo                 Algorithm selected (inputs)\n @param workspace            Pointer to workspace required (input)\n @param workspaceSizeInBytes Size of the memory in bytes pointed to by workSpace above\n @param alpha2               floating point scaling factor, allocated on the host (input)\n @param zDesc                Tensor descriptor for tensor z (input)\n @param z                    Data tensor z (input)\n @param biasDesc             Tensor descriptor for input data tensor x (input)\n @param bias                 Data tensor bias (input)\n @param activationDesc       Activation descriptor that specifies the activation mode\n @param yDesc                Tensor descriptor for output data tensor y (input)\n @param y                    Output data tensor*/\n    pub fn miopenConvolutionBiasActivationForward(\n        handle: miopenHandle_t,\n        alpha1: *const ::core::ffi::c_void,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        wDesc: miopenTensorDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        convDesc: miopenConvolutionDescriptor_t,\n        algo: miopenConvFwdAlgorithm_t,\n        workspace: *mut ::core::ffi::c_void,\n        workspaceSizeInBytes: usize,\n        alpha2: *const ::core::ffi::c_void,\n        zDesc: miopenTensorDescriptor_t,\n        z: *const ::core::ffi::c_void,\n        biasDesc: miopenTensorDescriptor_t,\n        bias: *const ::core::ffi::c_void,\n        activationDesc: miopenActivationDescriptor_t,\n        yDesc: miopenTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\nimpl miopenRNNMode_t {\n    ///< RNN with ReLU activation\n    pub const miopenRNNRELU: miopenRNNMode_t = miopenRNNMode_t(0);\n}\nimpl miopenRNNMode_t {\n    ///< RNN with tanh activation\n    pub const miopenRNNTANH: miopenRNNMode_t = miopenRNNMode_t(1);\n}\nimpl miopenRNNMode_t {\n    ///< LSTM\n    pub const miopenLSTM: miopenRNNMode_t = miopenRNNMode_t(2);\n}\nimpl miopenRNNMode_t {\n    ///< GRU\n    pub const miopenGRU: miopenRNNMode_t = miopenRNNMode_t(3);\n}\n#[repr(transparent)]\n/**  @enum miopenRNNMode_t\n RNN mode selection for rnn layer preference*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenRNNMode_t(pub ::core::ffi::c_uint);\nimpl miopenRNNInputMode_t {\n    ///< Matrix multiplication at the input of the first layer\n    pub const miopenRNNlinear: miopenRNNInputMode_t = miopenRNNInputMode_t(0);\n}\nimpl miopenRNNInputMode_t {\n    ///< No operation is performed at the input of the first layer.\n    pub const miopenRNNskip: miopenRNNInputMode_t = miopenRNNInputMode_t(1);\n}\n#[repr(transparent)]\n/** @enum miopenRNNInputMode_t\n Recurrent Neural Network layer initial input mode*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenRNNInputMode_t(pub ::core::ffi::c_uint);\nimpl miopenRNNAlgo_t {\n    /**< Use dedicated gate-operation kernel for LSTM and fundamental\nalgorithm for vanilla RNN & GRU*/\n    pub const miopenRNNdefault: miopenRNNAlgo_t = miopenRNNAlgo_t(0);\n}\nimpl miopenRNNAlgo_t {\n    /**< Deprecated, low performance. Function by basic tesnsor\noperations, supported for vanilla RNN, LSTM, GRU*/\n    pub const miopenRNNfundamental: miopenRNNAlgo_t = miopenRNNAlgo_t(1);\n}\nimpl miopenRNNAlgo_t {\n    /**< The algorithm rounds some RNN parametrs upwards\nto utilize the most optimal GEMM kernel in the computation.*/\n    pub const miopenRNNroundedDynamic: miopenRNNAlgo_t = miopenRNNAlgo_t(2);\n}\n#[repr(transparent)]\n/** @enum miopenRNNAlgo_t\n Recurrent Neural Network algorithm mode*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenRNNAlgo_t(pub ::core::ffi::c_uint);\nimpl miopenRNNDirectionMode_t {\n    ///< Forward in time only.\n    pub const miopenRNNunidirection: miopenRNNDirectionMode_t = miopenRNNDirectionMode_t(\n        0,\n    );\n}\nimpl miopenRNNDirectionMode_t {\n    ///< Forward and backwards in time.\n    pub const miopenRNNbidirection: miopenRNNDirectionMode_t = miopenRNNDirectionMode_t(\n        1,\n    );\n}\n#[repr(transparent)]\n/** @enum miopenRNNDirectionMode_t\n Recurrent Neural Network bi-directional behavior*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenRNNDirectionMode_t(pub ::core::ffi::c_uint);\nimpl miopenRNNBiasMode_t {\n    ///< No Biases will be applied to GEMM operations\n    pub const miopenRNNNoBias: miopenRNNBiasMode_t = miopenRNNBiasMode_t(0);\n}\nimpl miopenRNNBiasMode_t {\n    ///< Biases will be applied to GEMM operations\n    pub const miopenRNNwithBias: miopenRNNBiasMode_t = miopenRNNBiasMode_t(1);\n}\n#[repr(transparent)]\n/** @enum miopenRNNBiasMode_t\n Recurrent Neural Network add on bias*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenRNNBiasMode_t(pub ::core::ffi::c_uint);\nimpl miopenRNNGEMMalgoMode_t {\n    pub const miopenRNNAlgoGEMM: miopenRNNGEMMalgoMode_t = miopenRNNGEMMalgoMode_t(0);\n}\n#[repr(transparent)]\n/** @enum miopenRNNGEMMalgoMode_t\n Recurrent Neural Network add on bias*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenRNNGEMMalgoMode_t(pub ::core::ffi::c_uint);\nimpl miopenRNNPaddingMode_t {\n    ///< Not padded data at RNN input/output\n    pub const miopenRNNIONotPadded: miopenRNNPaddingMode_t = miopenRNNPaddingMode_t(0);\n}\nimpl miopenRNNPaddingMode_t {\n    ///< Padded data at RNN input/output\n    pub const miopenRNNIOWithPadding: miopenRNNPaddingMode_t = miopenRNNPaddingMode_t(1);\n}\n#[repr(transparent)]\n/** @enum miopenRNNPaddingMode_t\n Recurrent Neural Network input/output data padding mode*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenRNNPaddingMode_t(pub ::core::ffi::c_uint);\nimpl miopenRNNFWDMode_t {\n    ///< FWD, BWD, WRW\n    pub const miopenRNNTraining: miopenRNNFWDMode_t = miopenRNNFWDMode_t(0);\n}\nimpl miopenRNNFWDMode_t {\n    ///< Only FWD-inference no back-propagation\n    pub const miopenRNNInference: miopenRNNFWDMode_t = miopenRNNFWDMode_t(1);\n}\n#[repr(transparent)]\n/** @enum miopenRNNFWDMode_t\n Recurrent Neural Network Training/Inference mode*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenRNNFWDMode_t(pub ::core::ffi::c_uint);\nimpl miopenRNNBaseLayout_t {\n    pub const miopenRNNDataUnknownLayout: miopenRNNBaseLayout_t = miopenRNNBaseLayout_t(\n        0,\n    );\n}\nimpl miopenRNNBaseLayout_t {\n    pub const miopenRNNDataSeqMajorNotPadded: miopenRNNBaseLayout_t = miopenRNNBaseLayout_t(\n        1,\n    );\n}\nimpl miopenRNNBaseLayout_t {\n    pub const miopenRNNDataSeqMajorPadded: miopenRNNBaseLayout_t = miopenRNNBaseLayout_t(\n        2,\n    );\n}\nimpl miopenRNNBaseLayout_t {\n    pub const miopenRNNDataBatchMajorPadded: miopenRNNBaseLayout_t = miopenRNNBaseLayout_t(\n        3,\n    );\n}\n#[repr(transparent)]\n/** @enum miopenRNNBaseLayout_t\n Data layouts for RNN operations*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenRNNBaseLayout_t(pub ::core::ffi::c_uint);\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Create a RNN layer Descriptor\n\n API for creating an uninitialized RNN layer descriptor.\n @param rnnDesc    Pointer to a tensor descriptor type\n @return           miopenStatus_t*/\n    pub fn miopenCreateRNNDescriptor(\n        rnnDesc: *mut miopenRNNDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Retrieves a RNN layer descriptor's details\n\n @param rnnDesc    RNN layer descriptor (input)\n @param rnnMode    RNN mode (output)\n @param algoMode   RNN algorithm mode (output)\n @param inputMode  RNN data input mode (output)\n @param dirMode    Uni or bi direction mode (output)\n @param biasMode   Bias used (output)\n @param hiddenSize Size of hidden state (output)\n @param layer      Number of stacked layers (output)\n @return           miopenStatus_t*/\n    pub fn miopenGetRNNDescriptor(\n        rnnDesc: miopenRNNDescriptor_t,\n        rnnMode: *mut miopenRNNMode_t,\n        algoMode: *mut miopenRNNAlgo_t,\n        inputMode: *mut miopenRNNInputMode_t,\n        dirMode: *mut miopenRNNDirectionMode_t,\n        biasMode: *mut miopenRNNBiasMode_t,\n        hiddenSize: *mut ::core::ffi::c_int,\n        layer: *mut ::core::ffi::c_int,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Retrieves a RNN layer descriptor's details version 2. This version enables retrieving\n information of the dropout descriptor of the rnn descriptor.\n\n @param rnnDesc     RNN layer descriptor (input)\n @param hiddenSize  Size of hidden state (output)\n @param layer       Number of stacked layers (output)\n @param dropoutDesc Pre-configured dropout descriptor for dropout layer in between RNN layers\n (output)\n @param inputMode   RNN data input mode (output)\n @param dirMode     Uni or bi direction mode (output)\n @param rnnMode     RNN mode (output)\n @param biasMode    Bias used (output)\n @param algoMode    RNN algorithm mode (output)\n @param dataType    Data type of RNN (output)\n @return            miopenStatus_t*/\n    pub fn miopenGetRNNDescriptor_V2(\n        rnnDesc: miopenRNNDescriptor_t,\n        hiddenSize: *mut ::core::ffi::c_int,\n        layer: *mut ::core::ffi::c_int,\n        dropoutDesc: *mut miopenDropoutDescriptor_t,\n        inputMode: *mut miopenRNNInputMode_t,\n        dirMode: *mut miopenRNNDirectionMode_t,\n        rnnMode: *mut miopenRNNMode_t,\n        biasMode: *mut miopenRNNBiasMode_t,\n        algoMode: *mut miopenRNNAlgo_t,\n        dataType: *mut miopenDataType_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Destroys the tensor descriptor object\n\n @param rnnDesc RNN tensor descriptor type (input)\n @return           miopenStatus_t*/\n    pub fn miopenDestroyRNNDescriptor(rnnDesc: miopenRNNDescriptor_t) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set the details of the RNN descriptor\n\n Interface for setting the values of the RNN descriptor object. This function requires specific\n algorithm selection.\n @param rnnDesc      RNN layer descriptor type (input)\n @param hsize        Hidden layer size (input)\n @param nlayers      Number of layers (input)\n @param inMode       RNN first layer input mode (input)\n @param direction    RNN direction (input)\n @param rnnMode      RNN model type (input)\n @param biasMode     RNN bias included (input)\n @param algo         RNN algorithm selected (input)\n @param dataType     MIOpen datatype (input)\n @return             miopenStatus_t*/\n    pub fn miopenSetRNNDescriptor(\n        rnnDesc: miopenRNNDescriptor_t,\n        hsize: ::core::ffi::c_int,\n        nlayers: ::core::ffi::c_int,\n        inMode: miopenRNNInputMode_t,\n        direction: miopenRNNDirectionMode_t,\n        rnnMode: miopenRNNMode_t,\n        biasMode: miopenRNNBiasMode_t,\n        algo: miopenRNNAlgo_t,\n        dataType: miopenDataType_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set the details of the RNN descriptor version 2. This version enables the use of dropout\n in rnn.\n\n Interface for setting the values of the RNN descriptor object. This function requires specific\n algorithm selection.\n @param rnnDesc      RNN layer descriptor type (input/output)\n @param hsize        Hidden layer size (input)\n @param nlayers      Number of layers (input)\n @param dropoutDesc  Pre-initialized dropout descriptor for dropout layer in between RNN layers\n (input)\n @param inMode       RNN first layer input mode (input)\n @param direction    RNN direction (input)\n @param rnnMode      RNN model type (input)\n @param biasMode     RNN bias included (input)\n @param algo         RNN algorithm selected (input)\n @param dataType     MIOpen datatype (input)\n @return             miopenStatus_t*/\n    pub fn miopenSetRNNDescriptor_V2(\n        rnnDesc: miopenRNNDescriptor_t,\n        hsize: ::core::ffi::c_int,\n        nlayers: ::core::ffi::c_int,\n        dropoutDesc: miopenDropoutDescriptor_t,\n        inMode: miopenRNNInputMode_t,\n        direction: miopenRNNDirectionMode_t,\n        rnnMode: miopenRNNMode_t,\n        biasMode: miopenRNNBiasMode_t,\n        algo: miopenRNNAlgo_t,\n        dataType: miopenDataType_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set shape of RNN seqData tensor\n\n Interface for setting tensor shape to be used as RNN input data\n\n @param seqTensorDesc     Tensor descriptor (input/output)\n @param dataType          MIOpen datatype (input)\n @param layout            One of the main supported layouts for RNN data(input)\n @param maxSequenceLen      Sequence length limit within this SeqTensor(input)\n @param batchSize         Number of sequences within this SeqTensor (input)\n @param vectorSize        Vector size (input)\n @param sequenceLenArray  Array containing the length of each sequence in the SeqTensor(input)\n @param paddingMarker     Not used, should be NULL (input)\n @return                  miopenStatus_t*/\n    pub fn miopenSetRNNDataSeqTensorDescriptor(\n        seqTensorDesc: miopenSeqTensorDescriptor_t,\n        dataType: miopenDataType_t,\n        layout: miopenRNNBaseLayout_t,\n        maxSequenceLen: ::core::ffi::c_int,\n        batchSize: ::core::ffi::c_int,\n        vectorSize: ::core::ffi::c_int,\n        sequenceLenArray: *const ::core::ffi::c_int,\n        paddingMarker: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get shape of RNN seqData tensor\n\n Interface for setting tensor shape to be used as RNN input data\n\n @param seqTensorDesc             Tensor descriptor (input)\n @param dataType                  MIOpen datatype (output)\n @param layout                    One of the main supported layouts for RNN data(output)\n @param maxSequenceLen              Sequence length limit within this SeqTensor(output)\n @param batchSize                 Number of sequences within this SeqTensor (output)\n @param vectorSize                Vector size (output)\n @param sequenceLenArrayLimit  Limit for number of elements that can be returned to user\n by sequenceLenArray (input)\n @param sequenceLenArray          Array containing the length of each sequence in the\n SeqTensor. This is allowed to be a NULL pointer if sequenceLenArrayLimit is 0 (output)\n @param paddingMarker             Not used, should be NULL (input)\n @return                          miopenStatus_t*/\n    pub fn miopenGetRNNDataSeqTensorDescriptor(\n        seqTensorDesc: miopenSeqTensorDescriptor_t,\n        dataType: *mut miopenDataType_t,\n        layout: *mut miopenRNNBaseLayout_t,\n        maxSequenceLen: *mut ::core::ffi::c_int,\n        batchSize: *mut ::core::ffi::c_int,\n        vectorSize: *mut ::core::ffi::c_int,\n        sequenceLenArrayLimit: ::core::ffi::c_int,\n        sequenceLenArray: *mut ::core::ffi::c_int,\n        paddingMarker: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Query the amount of memory required to execute the RNN layer\n\n This function calculates the amount of memory required to run the RNN layer given an RNN\n descriptor and a tensor descriptor.\n\n @param handle          MIOpen handle (input)\n @param rnnDesc         RNN layer descriptor type (input)\n @param sequenceLen     Number of iteration unrolls (input)\n @param xDesc           An array of tensor descriptors. These are the\n input descriptors to each time step. The first dimension of each descriptor is the\n batch size and may decrease from element n to element n+1 and not increase in size.\n The second dimension is the same for all descriptors in the array and is the input\n vector length. (input)\n @param numBytes        Number of bytes required for RNN layer execution (output)\n @return                miopenStatus_t*/\n    pub fn miopenGetRNNWorkspaceSize(\n        handle: miopenHandle_t,\n        rnnDesc: miopenRNNDescriptor_t,\n        sequenceLen: ::core::ffi::c_int,\n        xDesc: *const miopenTensorDescriptor_t,\n        numBytes: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Query the amount of memory required for RNN training\n\n This function calculates the amount of memory required to train the RNN layer given an\n RNN descriptor and a tensor descriptor.\n\n @param handle          MIOpen handle (input)\n @param rnnDesc         RNN layer descriptor type (input)\n @param sequenceLen     Number of iteration unrolls (input)\n @param xDesc           An array of tensor descriptors. These are the\n input descriptors to each time step. The first dimension of each descriptor is the\n batch size and may decrease from element n to element n+1 and not increase in size.\n The second dimension is the same for all descriptors in the array and is the input\n vector length. (input)\n @param numBytes        Number of bytes required for RNN layer execution (output)\n @return                miopenStatus_t*/\n    pub fn miopenGetRNNTrainingReserveSize(\n        handle: miopenHandle_t,\n        rnnDesc: miopenRNNDescriptor_t,\n        sequenceLen: ::core::ffi::c_int,\n        xDesc: *const miopenTensorDescriptor_t,\n        numBytes: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Query the amount of additional memory required for this RNN layer execution.\n\n This function calculates the size of extra buffers, depending on the layer configuration, which\n is determined by: RNN descriptor, isInference, and data descriptor. If isInference is True,\n reserve_space_size is always zero, because the reserve_space buffer is not used in Inference\n computation.\n\n @param handle           MIOpen handle (input)\n @param rnnDesc          RNN layer descriptor type (input)\n @param xDesc            Sequence data tensor descriptor (input)\n @param fwdMode          Specifies in which mode the buffers will be used.\n @param workSpaceSize    Minimum WorkSpace buffer size required for RNN layer execution (output)\n @param reserveSpaceSize Minimum ReserveSpaceSize buffer size required for RNN layer execution\n (output)\n @return                 miopenStatus_t*/\n    pub fn miopenGetRNNTempSpaceSizes(\n        handle: miopenHandle_t,\n        rnnDesc: miopenRNNDescriptor_t,\n        xDesc: miopenSeqTensorDescriptor_t,\n        fwdMode: miopenRNNFWDMode_t,\n        workSpaceSize: *mut usize,\n        reserveSpaceSize: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Query the amount of parameter memory required for RNN training\n\n This function calculates the amount of parameter memory required to train the RNN layer given an\n RNN descriptor and a tensor descriptor.\n\n @param handle          MIOpen handle (input)\n @param rnnDesc         RNN layer descriptor type (input)\n @param xDesc           A tensor descriptor (input)\n @param numBytes        Number of bytes required for RNN layer execution (output)\n @param dtype           MIOpen data type enum (input)\n @return                miopenStatus_t*/\n    pub fn miopenGetRNNParamsSize(\n        handle: miopenHandle_t,\n        rnnDesc: miopenRNNDescriptor_t,\n        xDesc: miopenTensorDescriptor_t,\n        numBytes: *mut usize,\n        dtype: miopenDataType_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Obtain a weight tensor descriptor for RNNs\n\n This function populates a weight descriptor that describes the memory layout of the\n weight matrix.\n\n @param handle          MIOpen handle (input)\n @param rnnDesc         Fully populated RNN layer descriptor type (input)\n @param xDesc           A previously populated tensor descriptor (input)\n @param wDesc           A previously allocated tensor descriptor (output)\n @param dtype           MIOpen data type enum (input)\n @return                miopenStatus_t*/\n    pub fn miopenGetRNNParamsDescriptor(\n        handle: miopenHandle_t,\n        rnnDesc: miopenRNNDescriptor_t,\n        xDesc: miopenTensorDescriptor_t,\n        wDesc: miopenTensorDescriptor_t,\n        dtype: miopenDataType_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Obtain a the size in bytes of the RNN input tensor\n\n This function determines the size in bytes of the allocation needed for the input data\n tensor for an RNN layer. The number of bytes is derived from the array of\n tensor descriptors.\n\n @param handle          MIOpen handle (input)\n @param rnnDesc         Fully populated RNN layer descriptor (input)\n @param seqLen          Number of iteration unrolls (input)\n @param xDesc           An array of tensor descriptors. These are the\n input descriptors to each time step. The first dimension of each descriptor is the\n batch size and may decrease from element n to element n+1 and not increase in size.\n The second dimension is the same for all descriptors in the array and is the input\n vector length. (input)\n @param numBytes        Number of bytes required for input tensor (output)\n @return                miopenStatus_t*/\n    pub fn miopenGetRNNInputTensorSize(\n        handle: miopenHandle_t,\n        rnnDesc: miopenRNNDescriptor_t,\n        seqLen: ::core::ffi::c_int,\n        xDesc: *mut miopenTensorDescriptor_t,\n        numBytes: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Obtain a the size in bytes of the RNN hidden tensor\n\n This function determines the size in bytes of the allocation needed for the\n hidden tensor over all layers\n\n @param handle          MIOpen handle (input)\n @param rnnDesc         Fully populated RNN layer descriptor type (input)\n @param seqLen          Number of iteration unrolls (input)\n @param xDesc           An array of previously populated tensor descriptors (input)\n @param numBytes        Number of bytes required for input tensor (output)\n @return                miopenStatus_t*/\n    pub fn miopenGetRNNHiddenTensorSize(\n        handle: miopenHandle_t,\n        rnnDesc: miopenRNNDescriptor_t,\n        seqLen: ::core::ffi::c_int,\n        xDesc: *mut miopenTensorDescriptor_t,\n        numBytes: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets the number of bytes of a parameter matrix\n\n\n For RNN vanilla miopenRNNRELU and miopenRNNTANH, paramID == 0 retrieves the\n weight matrix associated with the in input GEMM, while paramID == 1 retrieves\n the weight matrix associated with the hidden state GEMM.\n\n For miopenLSTM paramID 0 to 3 refer to the weight matrices associated\n with the input GEMM, 4-7 are associated with matrices associated with the\n hidden state GEMM.\n\n * paramID 0 and 4 are for the input gate.\n\n * paramID 1 and 5 are for the forget gate.\n\n * paramID 2 and 6 are for the output gate.\n\n * paramID 3 and 7 are for the new memory gate.\n\n For miopenGRU paramID 0 to 2 refer to the weight matrix offset associated\n with the input GEMM, while 3 through 5 are associated with the hidden state\n GEMM.\n\n * paramID 0 and 3 are for the update gate.\n\n * paramID 1 and 4 are for the reset gate.\n\n * paramID 2 and 5 are for the new memory gate.\n\n For bi-directional RNNs the backwards in time direction is numbered as the layer\n directly after the forward in time direction.\n\n @param handle          MIOpen handle (input)\n @param rnnDesc         RNN layer descriptor type (input)\n @param layer           The layer number in the RNN stack (input)\n @param xDesc           A tensor descriptor to input (input)\n @param paramID         ID of the internal parameter tensor (input)\n @param numBytes        The number of bytes of the layer's parameter matrix (output)\n @return                miopenStatus_t*/\n    pub fn miopenGetRNNLayerParamSize(\n        handle: miopenHandle_t,\n        rnnDesc: miopenRNNDescriptor_t,\n        layer: ::core::ffi::c_int,\n        xDesc: miopenTensorDescriptor_t,\n        paramID: ::core::ffi::c_int,\n        numBytes: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets the number of bytes of a bias\n\n For RNN vanilla miopenRNNRELU and miopenRNNTANH, biasID == 0 retrieves the\n weight matrix associated with the in input GEMM, while biasID == 1 retrieves\n the bias associated with the hidden state GEMM.\n\n For miopenLSTM biasID 0 to 3 refer to the biases associated\n with the input GEMM, 4-7 are associated with biases associated with the\n hidden state GEMM.\n\n * biasID 0 and 4 are for the input gate.\n\n * biasID 1 and 5 are for the forget gate.\n\n * biasID 2 and 6 are for the output gate.\n\n * biasID 3 and 7 are for the new memory gate.\n\n For miopenGRU biasID 0 to 2 refer to the biases associated with the input GEMM,\n while 3 through 5 are associated with the hidden state GEMM.\n\n * biasID 0 and 3 are for the update gate.\n\n * biasID 1 and 4 are for the reset gate.\n\n * biasID 2 and 5 are for the new memory gate.\n\n For bi-directional RNNs the backwards in time direction is numbered as the layer\n directly after the forward in time direction.\n\n @param handle          MIOpen handle (input)\n @param rnnDesc         RNN layer descriptor type (input)\n @param layer           The layer number in the RNN stack (input)\n @param biasID          ID of the internal parameter tensor (input)\n @param numBytes        The number of bytes of the layer's bias (output)\n @return                miopenStatus_t*/\n    pub fn miopenGetRNNLayerBiasSize(\n        handle: miopenHandle_t,\n        rnnDesc: miopenRNNDescriptor_t,\n        layer: ::core::ffi::c_int,\n        biasID: ::core::ffi::c_int,\n        numBytes: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets a weight matrix for a specific layer in an RNN stack\n\n This function retrieves the weight matrix data for a specific layer and parameter ID\n and copies the data into previously allocated device memory.\n\n For RNN vanilla miopenRNNRELU and miopenRNNTANH, paramID == 0 retrieves the\n weight matrix associated with the in input GEMM, while paramID == 1 retrieves\n the weight matrix associated with the hidden state GEMM.\n\n For miopenLSTM paramID 0 to 3 refer to the weight matrices associated\n with the input GEMM, 4-7 are associated with matrices associated with the\n hidden state GEMM.\n\n * paramID 0 and 4 are for the input gate.\n\n * paramID 1 and 5 are for the forget gate.\n\n * paramID 2 and 6 are for the output gate.\n\n * paramID 3 and 7 are for the new memory gate.\n\n For miopenGRU paramID 0 to 2 refer to the weight matrix offset associated\n with the input GEMM, while 3 through 5 are associated with the hidden state\n GEMM.\n\n * paramID 0 and 3 are for the update gate.\n\n * paramID 1 and 4 are for the reset gate.\n\n * paramID 2 and 5 are for the new memory gate.\n\n For bi-directional RNNs the backwards in time direction is numbered as the layer\n directly after the forward in time direction.\n\n The output argument paramDesc is a previously created tensor descriptor that is populated\n to describe the memory layout of the parameter matrix. It is full packed and is used when\n calling to miopenSetRNNLayerParam()\n\n The argument layerParam should either be nullptr, or have device memory allocated\n to allow copying of the entire layer parameter matrix into it. If layerParam is\n nullptr then only the paramDesc is populated and returned. The size in bytes of the\n layer parameter matrix can be determined by using miopenGetRNNLayerParamSize().\n\n Note: When inputSkip mode is selected there is no input layer matrix operation,\n and therefore no associated memory. In this case miopenGetRNNLayerParam() will return\n a error status miopenStatusBadParm for input paramID associated with the input GEMM.\n\n @param handle          MIOpen handle (input)\n @param rnnDesc         RNN layer descriptor type (input)\n @param layer           The layer number in the RNN stack (input)\n @param xDesc           A tensor descriptor to input (input)\n @param wDesc           A tensor descriptor to the parameter tensor (input)\n @param w               Pointer to memory containing parameter tensor (input)\n @param paramID         ID of the internal parameter tensor (input)\n @param paramDesc       Tensor descriptor for the fully packed output parameter tensor (output)\n @param layerParam      Pointer to the memory location of the parameter tensor (output)\n @return                miopenStatus_t*/\n    pub fn miopenGetRNNLayerParam(\n        handle: miopenHandle_t,\n        rnnDesc: miopenRNNDescriptor_t,\n        layer: ::core::ffi::c_int,\n        xDesc: miopenTensorDescriptor_t,\n        wDesc: miopenTensorDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        paramID: ::core::ffi::c_int,\n        paramDesc: miopenTensorDescriptor_t,\n        layerParam: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets a bias for a specific layer in an RNN stack\n\n This function retrieves the bias data for a specific layer and bias ID and copies\n the data into previously allocated device memory.\n\n For RNN vanilla miopenRNNRELU and miopenRNNTANH, biasID == 0 retrieves the\n bias associated with the in input GEMM, while biasID == 1 retrieves\n the bias associated with the hidden state GEMM.\n\n For miopenLSTM biasID 0 to 3 refer to the biases associated\n with the input GEMM, 4-7 are associated with biases associated with the\n hidden state GEMM.\n\n * biasID 0 and 4 are for the input gate.\n\n * biasID 1 and 5 are for the forget gate.\n\n * biasID 2 and 6 are for the output gate.\n\n * biasID 3 and 7 are for the new memory gate.\n\n For miopenGRU biasID 0 to 2 refer to the biases associated with the input GEMM,\n while 3 through 5 are associated with the hidden state GEMM.\n\n * biasID 0 and 3 are for the update gate.\n\n * biasID 1 and 4 are for the reset gate.\n\n * biasID 2 and 5 are for the new memory gate.\n\n For bi-directional RNNs the backwards in time direction is numbered as the layer\n directly after the forward in time direction.\n\n The output argument biasDesc is a previously created tensor descriptor that is populated\n to describe the memory layout of the bias. It is full packed and is used when\n calling to miopenSetRNNLayerBias()\n\n The argument layerBias should either be nullptr, or have device memory allocated\n to allow copying of the entire layer bias into it. If layerBias is\n nullptr then only the biasDesc is populated and returned. The size in bytes of the\n layer bias can be determined by using miopenGetRNNLayerBiasSize().\n\n Note: When inputSkip mode is selected there is no input layer matrix operation,\n and therefore no associated memory. In this case miopenGetRNNLayerBias() will return\n a error status miopenStatusBadParm for input biasID associated with the input GEMM.\n\n @param handle          MIOpen handle (input)\n @param rnnDesc         RNN layer descriptor type (input)\n @param layer           The layer number in the RNN stack (input)\n @param xDesc           A tensor descriptor to input (input)\n @param wDesc           A tensor descriptor to the parameter tensor (input)\n @param w               Pointer to memory containing parameter tensor (input)\n @param biasID          ID of the internal parameter tensor (input)\n @param biasDesc        Descriptor of the parameter tensor (output)\n @param layerBias       Pointer to the memory location of the bias tensor (output)\n @return                miopenStatus_t*/\n    pub fn miopenGetRNNLayerBias(\n        handle: miopenHandle_t,\n        rnnDesc: miopenRNNDescriptor_t,\n        layer: ::core::ffi::c_int,\n        xDesc: miopenTensorDescriptor_t,\n        wDesc: miopenTensorDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        biasID: ::core::ffi::c_int,\n        biasDesc: miopenTensorDescriptor_t,\n        layerBias: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets an index offset for a specific weight matrix for a layer in the\n  RNN stack\n\n This function retrieves the index offset for a weight matrix in a layer.\n\n For RNN vanilla miopenRNNRELU and miopenRNNTANH, paramID == 0 retrieves the\n weight matrix offset associated with the in input GEMM, while paramID == 1\n retrieves the weight matrix offset associated with the hidden state GEMM.\n\n For miopenLSTM paramID 0 to 3 refer to the weight matrix offsets associated\n with the input GEMM, 4-7 are associated with matrix offset associated with the\n hidden state GEMM.\n\n * paramID 0 and 4 are for the input gate.\n\n * paramID 1 and 5 are for the forget gate.\n\n * paramID 2 and 6 are for the output gate.\n\n * paramID 3 and 7 are for the new memory gate.\n\n For miopenGRU paramID 0 to 2 refer to the weight matrix offset associated\n with the input GEMM, while 3 through 5 are associated with the hidden state\n GEMM.\n\n * paramID 0 and 3 are for the update gate.\n\n * paramID 1 and 4 are for the reset gate.\n\n * paramID 2 and 5 are for the new memory gate.\n\n For bi-directional RNNs the backwards in time direction is numbered as the layer\n directly after the forward in time direction.\n\n The output argument paramDesc is a previously created tensor descriptor that is populated\n to describe the memory layout of the parameter matrix. It is full packed and is used when\n calling to miopenSetRNNLayerParam().\n\n The argument layerParamOffset should either be nullptr, or an address to place the\n offset. If layerParamOffset is nullptr then only the paramDesc is populated and returned.\n\n Note: When inputSkip mode is selected there is no input layer matrix operation,\n and therefore no associated memory. In this case miopenGetRNNLayerParamOffset() will return\n a error status miopenStatusBadParm for input paramID associated with the input GEMM.\n\n\n @param rnnDesc           RNN layer descriptor type (input)\n @param layer             The layer number in the RNN stack (input)\n @param xDesc             A tensor descriptor to input (input)\n @param paramID           ID of the internal parameter tensor (input)\n @param paramDesc         Tensor descriptor for the fully packed output parameter tensor (output)\n @param layerParamOffset  Location for the parameter offset (output)\n @return                  miopenStatus_t*/\n    pub fn miopenGetRNNLayerParamOffset(\n        rnnDesc: miopenRNNDescriptor_t,\n        layer: ::core::ffi::c_int,\n        xDesc: miopenTensorDescriptor_t,\n        paramID: ::core::ffi::c_int,\n        paramDesc: miopenTensorDescriptor_t,\n        layerParamOffset: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets a bias index offset for a specific layer in an RNN stack\n\n This function retrieves the bias index offset for a specific layer and bias ID.\n\n For RNN vanilla miopenRNNRELU and miopenRNNTANH, biasID == 0 retrieves the\n bias associated with the in input GEMM, while biasID == 1 retrieves\n the weight matrix associated with the hidden state GEMM.\n\n For miopenLSTM biasID 0 to 3 refer to the bias offset associated\n with the input GEMM, 4-7 are the bias offsets associated with the hidden state GEMM.\n\n * biasID 0 and 4 are for the input gate.\n\n * biasID 1 and 5 are for the forget gate.\n\n * biasID 2 and 6 are for the output gate.\n\n * biasID 3 and 7 are for the new memory gate.\n\n For miopenGRU biasID 0 to 2 refer to the biases associated with the input GEMM,\n while 3 through 5 are associated with the hidden state GEMM.\n\n * biasID 0 and 3 are for the update gate.\n\n * biasID 1 and 4 are for the reset gate.\n\n * biasID 2 and 5 are for the new memory gate.\n\n For bi-directional RNNs the backwards in time direction is numbered as the layer\n directly after the forward in time direction.\n\n The output argument biasDesc is a previously created tensor descriptor that is populated\n to describe the memory layout of the bias. It is full packed and is used when\n calling to miopenSetRNNLayerBias()\n\n The argument layerBiasOffset should either be nullptr, or point to an output address.\n If layerBias is nullptr then only the biasDesc is populated and returned.\n\n Note: When inputSkip mode is selected there is no input layer matrix operation,\n and therefore no associated memory. In this case miopenGetRNNLayerBiasOffset() will return\n a error status miopenStatusBadParm for input biasID associated with the input GEMM.\n\n @param rnnDesc         RNN layer descriptor type (input)\n @param layer           The layer number in the RNN stack (input)\n @param xDesc           A tensor descriptor to input (input)\n @param biasID          ID of the internal parameter tensor (input)\n @param biasDesc        Descriptor of the parameter tensor (output)\n @param layerBiasOffset Pointer to the memory location of the bias tensor (output)\n @return                miopenStatus_t*/\n    pub fn miopenGetRNNLayerBiasOffset(\n        rnnDesc: miopenRNNDescriptor_t,\n        layer: ::core::ffi::c_int,\n        xDesc: miopenTensorDescriptor_t,\n        biasID: ::core::ffi::c_int,\n        biasDesc: miopenTensorDescriptor_t,\n        layerBiasOffset: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets a weight matrix for a specific layer in an RNN stack\n\n This function sets the weight matrix data for a specific layer and parameter ID.\n\n For RNN vanilla miopenRNNRELU and miopenRNNTANH, paramID == 0 sets the\n weight matrix associated with the in input GEMM, while paramID == 1 sets\n the weight matrix associated with the hidden state GEMM.\n\n\n For miopenLSTM paramID 0 to 3 refer to the weight matrices associated\n with the input GEMM, 4-7 are associated with matrices associated with the\n hidden state GEMM.\n\n * paramID 0 and 4 are for the input gate.\n\n * paramID 1 and 5 are for the forget gate.\n\n * paramID 2 and 6 are for the output gate.\n\n * paramID 3 and 7 are for the new memory gate.\n\n For miopenGRU paramID 0 to 2 refer to the weight matrix offset associated\n with the input GEMM, while 3 through 5 are associated with the hidden state\n GEMM.\n\n * paramID 0 and 3 are for the update gate.\n\n * paramID 1 and 4 are for the reset gate.\n\n * paramID 2 and 5 are for the new memory gate.\n\n For bi-directional RNNs the backwards in time direction is numbered as the layer\n directly after the forward in time direction.\n\n The input argument paramDesc is a previously populated tensor descriptor typically\n by first calling miopenGetRNNLayerParam().\n\n Note: When inputSkip mode is selected there is no input layer matrix operation,\n and therefore no associated memory. In this case miopenSetRNNLayerParam() will return\n a error status miopenStatusBadParm for input paramID associated with the input GEMM.\n\n @param handle          MIOpen handle (input)\n @param rnnDesc         RNN layer descriptor type (input)\n @param layer           The layer number in the RNN stack (input)\n @param xDesc           A tensor descriptor to input (input)\n @param wDesc           A tensor descriptor to the parameter tensor (input)\n @param w               Pointer to memory containing parameter tensor (input)\n @param paramID         ID of the internal parameter tensor (input)\n @param paramDesc       Descriptor of the parameter tensor (input)\n @param layerParam      Pointer to the memory location of the parameter tensor (input)\n @return                miopenStatus_t*/\n    pub fn miopenSetRNNLayerParam(\n        handle: miopenHandle_t,\n        rnnDesc: miopenRNNDescriptor_t,\n        layer: ::core::ffi::c_int,\n        xDesc: miopenTensorDescriptor_t,\n        wDesc: miopenTensorDescriptor_t,\n        w: *mut ::core::ffi::c_void,\n        paramID: ::core::ffi::c_int,\n        paramDesc: miopenTensorDescriptor_t,\n        layerParam: *const ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets a bias for a specific layer in an RNN stack\n\n This function sets the bias data for a specific layer and bias ID.\n\n For RNN vanilla miopenRNNRELU and miopenRNNTANH, biasID == 0 retrieves the\n weight matrix associated with the in input GEMM, while biasID == 1 retrieves\n the bias associated with the hidden state GEMM.\n\n For miopenLSTM biasID 0 to 3 refer to the biases associated\n with the input GEMM, 4-7 are associated with the biases associated with the\n hidden state GEMM.\n\n * biasID 0 and 4 are for the input gate.\n\n * biasID 1 and 5 are for the forget gate.\n\n * biasID 2 and 6 are for the output gate.\n\n * biasID 3 and 7 are for the new memory gate.\n\n For miopenGRU biasID 0 to 2 refer to the biases associated with the input GEMM,\n while 3 through 5 are associated with the hidden state GEMM.\n\n * biasID 0 and 3 are for the update gate.\n\n * biasID 1 and 4 are for the reset gate.\n\n * biasID 2 and 5 are for the new new memory gate.\n\n For bi-directional RNNs the backwards in time direction is numbered as the layer\n directly after the forward in time direction.\n\n The input argument biasDesc is a previously populated tensor descriptor typically\n by first calling miopenGetRNNLayeBias().\n\n Note: When inputSkip mode is selected there is no input layer matrix operation,\n and therefore no associated memory. In this case miopenSetRNNLayerBias will return\n a error status miopenStatusBadParm for input biasID associated with the input GEMM.\n\n @param handle          MIOpen handle (input)\n @param rnnDesc         RNN layer descriptor type (input)\n @param layer           The layer number in the RNN stack (input)\n @param xDesc           A tensor descriptor to input (input)\n @param wDesc           A tensor descriptor to the bias tensor (input)\n @param w               Pointer to memory containing bias tensor (input)\n @param biasID          ID of the internal bias tensor (input)\n @param biasDesc        Descriptor of the bias tensor (output)\n @param layerBias       Pointer to the memory location of the bias tensor (output)\n @return                miopenStatus_t*/\n    pub fn miopenSetRNNLayerBias(\n        handle: miopenHandle_t,\n        rnnDesc: miopenRNNDescriptor_t,\n        layer: ::core::ffi::c_int,\n        xDesc: miopenTensorDescriptor_t,\n        wDesc: miopenTensorDescriptor_t,\n        w: *mut ::core::ffi::c_void,\n        biasID: ::core::ffi::c_int,\n        biasDesc: miopenTensorDescriptor_t,\n        layerBias: *const ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets a bias for a specific layer in an RNN stack\n\n This function changes padidng mode at previously created and initialized RNN descriptor.\n This function must be called before using miopenGetRNNWorkspaceSize()\n and miopenGetRNNTrainingReserveSize() functions.\n By default, not padded data is expected at the RNN input/output.\n\n @param rnnDesc         RNN layer descriptor type (input/output)\n @param paddingMode     RNN input/output data padding mode (input)\n @return                miopenStatus_t*/\n    pub fn miopenSetRNNPaddingMode(\n        rnnDesc: miopenRNNDescriptor_t,\n        paddingMode: miopenRNNPaddingMode_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief This function retrieves the RNN padding mode from the RNN descriptor.\n\n @param rnnDesc         RNN layer descriptor type (input)\n @param paddingMode     Pointer to the RNN padding mode (output)\n @return                miopenStatus_t*/\n    pub fn miopenGetRNNPaddingMode(\n        rnnDesc: miopenRNNDescriptor_t,\n        paddingMode: *mut miopenRNNPaddingMode_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute forward training for recurrent layer.\n\n Interface for executing the forward training / inference pass on a RNN.\n\n @param handle                MIOpen handle (input)\n @param rnnDesc               RNN layer descriptor type (input)\n @param fwdMode          Specifies in which mode the buffers will be used.\n @param xDesc                 An input tensor descriptor for sequenced RNN data. This\n miopenSeqTensorDescriptor_t should be initialyzed by `miopenSetRNNDataSeqTensorDescriptor`\n function.(input)\n @param x                     Pointer to input tensor (input)\n\n @param hDesc                A hidden tensor descriptor that has as its first dimension\n of the number of layers if the direction mode is unidirectional and twice the\n number of layers if the direction mode is bidirectional. The second dimension of\n the descriptor must equal the largest first dimension of the xDesc tensor descriptor\n array. The third dimension equals the hiddenSize. (input)\n @param hx                    Pointer to the hidden layer input tensor. If hx is NULL,\n then the initial hidden state will be zero initialized. (input)\n @param hy                    Pointer to the hidden layer output tensor. If hy is NULL,\n then the final hidden state will not be saved. (output)\n\n @param cDesc                A cell tensor descriptor that has as its first dimension\n of the number of layers if the direction mode is unidirectional and twice the\n number of layers if the direction mode is bidirectional. The second dimension of\n the descriptor must equal the largest first dimension of the xDesc tensor descriptor\n array. The third dimension equals the hiddenSize. (input)\n @param cx                    Pointer to the cell layer input tensor. If cx is NULL,\n then the initial cell state will be zero initialized. (input)\n @param cy                    Pointer to the cell layer output tensor. If hy is NULL,\n then the final cell state will not be saved. (output)\n\n @param yDesc                 An array of fully packed tensor descriptors associated\n with the output from each time step. The first dimension of the tensor descriptors\n must equal the first dimension of the first descriptor (batch size) in the xDesc\n tensor array. The second dimension of the element of the descriptor array\n depends on the direction mode selected. If the direction mode is unidirectional,\n the second dimension is the hiddenSize. If direction mode is bidirectional\n the second dimension is twice the hiddenSize. (input)\n @param y                     Pointer to output tensor (output)\n\n @param w                     Pointer to input weights tensor (input)\n @param weightSpaceSize       Number of allocated bytes in memory for the weights tensor\n @param workSpace             Pointer to memory allocated for forward (input / output)\n @param workSpaceNumBytes     Number of allocated bytes in memory for the workspace (input)\n @param reserveSpace          Pointer to memory allocated for hidden states used durning training\n (input / output)\n @param reserveSpaceNumBytes  Number of allocated bytes in memory for use in the forward  (input)\n @return                      miopenStatus_t*/\n    pub fn miopenRNNForward(\n        handle: miopenHandle_t,\n        rnnDesc: miopenRNNDescriptor_t,\n        fwdMode: miopenRNNFWDMode_t,\n        xDesc: miopenSeqTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        hDesc: miopenTensorDescriptor_t,\n        hx: *const ::core::ffi::c_void,\n        hy: *mut ::core::ffi::c_void,\n        cDesc: miopenTensorDescriptor_t,\n        cx: *const ::core::ffi::c_void,\n        cy: *mut ::core::ffi::c_void,\n        yDesc: miopenSeqTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        w: *const ::core::ffi::c_void,\n        weightSpaceSize: usize,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceNumBytes: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n        reserveSpaceNumBytes: usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute backward data for recurrent layer\n\n Interface for executing the backward data pass on a RNN.\n\n @param handle                MIOpen handle (input)\n @param rnnDesc               RNN layer descriptor type (input)\n\n @param yDesc                 An output tensor descriptor for sequenced RNN data. This\n miopenSeqTensorDescriptor_t should be initialyzed by `miopenSetRNNDataSeqTensorDescriptor`\nfunction.(input)\n @param y                     Pointer to input tensor (input)\n @param dy                    Pointer to the hidden layer input tensor (input)\n\n @param hDesc                An input hidden tensor descriptor that has as its first dimension\n of the number of layers if the direction mode is unidirectional and twice the\n number of layers if the direction mode is bidirectional. The second dimension of\n the descriptor must equal the largest first dimension of the xDesc tensor descriptor\n array. The third dimension equals the hiddenSize. (input)\n @param hx                    Pointer to the hidden layer input tensor. If hx is NULL,\n then the initial hidden state will be zero initialized. (input)\n @param dhy                   Pointer to the cell layer input tensor (input)\n @param dhx                   Pointer to the delta hidden layer output tensor. If dhx is NULL\n the hidden gradient will not ouput. (output)\n\n @param cDesc                A input cell tensor descriptor that has as its first dimension\n of the number of layers if the direction mode is unidirectional and twice the\n number of layers if the direction mode is bidirectional. The second dimension of\n the descriptor must equal the largest first dimension of the xDesc tensor descriptor\n array. The third dimension equals the hiddenSize. (input)\n @param cx                    Pointer to the hidden layer input tensor. If cx is NULL,\n then the initial cell state will be zero initialized. (input)\n @param dcy                   Pointer to the cell layer input tensor. If dcy is NULL,\n then the initial delta cell state will be zero initialized. (input)\n @param dcx                   Pointer to the cell layer output tensor. If dcx is NULL\n the cell gradient will not ouput. (output)\n\n @param xDesc                 An input tensor descriptor for sequenced RNN data. This\n miopenSeqTensorDescriptor_t should be initialyzed by `miopenSetRNNDataSeqTensorDescriptor`\nfunction.(input)\n @param dx                    Pointer to the cell layer output tensor (output)\n\n @param w                     Pointer to input weights tensor (input)\n @param weightSpaceSize       Number of allocated bytes in memory for the weights tensor\n @param workSpace             Pointer to memory allocated for forward training (input)\n @param workSpaceNumBytes     Number of allocated bytes in memory for the workspace (input)\n @param reserveSpace          Pointer to memory allocated for random states (input / output)\n @param reserveSpaceNumBytes  Number of allocated bytes in memory for use in the forward (input)\n @return                      miopenStatus_t*/\n    pub fn miopenRNNBackwardSeqData(\n        handle: miopenHandle_t,\n        rnnDesc: miopenRNNDescriptor_t,\n        yDesc: miopenSeqTensorDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        dy: *const ::core::ffi::c_void,\n        hDesc: miopenTensorDescriptor_t,\n        hx: *const ::core::ffi::c_void,\n        dhy: *const ::core::ffi::c_void,\n        dhx: *mut ::core::ffi::c_void,\n        cDesc: miopenTensorDescriptor_t,\n        cx: *const ::core::ffi::c_void,\n        dcy: *const ::core::ffi::c_void,\n        dcx: *mut ::core::ffi::c_void,\n        xDesc: miopenSeqTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n        w: *const ::core::ffi::c_void,\n        weightSpaceSize: usize,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceNumBytes: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n        reserveSpaceNumBytes: usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute backward weights for recurrent layer\n\n Interface for executing the backward weights pass on a RNN.\n\n @param handle                MIOpen handle (input)\n @param rnnDesc               RNN layer descriptor type (input)\n\n @param xDesc                 An input tensor descriptor for sequenced RNN data. This\n miopenSeqTensorDescriptor_t should be initialyzed by `miopenSetRNNDataSeqTensorDescriptor`\nfunction.(input)\n @param x                     Pointer to input tensor (input)\n\n @param hDesc                A hidden tensor descriptor that has as its first dimension\n of the number of layers if the direction mode is unidirectional and twice the\n number of layers if the direction mode is bidirectional. The second dimension of\n the descriptor must equal the largest first dimension of the xDesc tensor descriptor\n array. The third dimension equals the hiddenSize. (input)\n @param hx                    Pointer to the hidden layer input tensor. If hx is NULL,\n then the initial hidden state will be zero initialized. (input)\n\n @param yDesc                 An output tensor descriptor for sequenced RNN data. This\n miopenSeqTensorDescriptor_t should be initialyzed by `miopenSetRNNDataSeqTensorDescriptor`\nfunction.(input)\n @param y                     Pointer to the output tensor (input)\n\n @param dw                    Pointer to input weights tensor (input / output)\n @param weightSpaceSize       Number of allocated bytes in memory for the weights tensor\n @param workSpace             Pointer to memory allocated for forward training (input)\n @param workSpaceNumBytes     Number of allocated bytes in memory for the workspace (input)\n @param reserveSpace          Pointer to memory allocated for random states (input)\n @param reserveSpaceNumBytes  Number of allocated bytes in memory for use in the forward (input)\n @return                      miopenStatus_t*/\n    pub fn miopenRNNBackwardWeightsSeqTensor(\n        handle: miopenHandle_t,\n        rnnDesc: miopenRNNDescriptor_t,\n        xDesc: miopenSeqTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        hDesc: miopenTensorDescriptor_t,\n        hx: *const ::core::ffi::c_void,\n        yDesc: miopenSeqTensorDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        dw: *mut ::core::ffi::c_void,\n        weightSpaceSize: usize,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceNumBytes: usize,\n        reserveSpace: *const ::core::ffi::c_void,\n        reserveSpaceNumBytes: usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute forward training for recurrent layer\n\n Interface for executing the forward training pass on a RNN.\n\n @param handle                MIOpen handle (input)\n @param rnnDesc               RNN layer descriptor type (input)\n @param sequenceLen           Temporal iterations to unroll (input)\n @param xDesc                 An array of tensor descriptors. These are the\n input descriptors to each time step. The first dimension of each descriptor is the\n batch size and may decrease from element n to element n+1 and not increase in size.\n The second dimension is the same for all descriptors in the array and is the input\n vector length. (input)\n @param x                     Pointer to input tensor (input)\n @param hxDesc                A hidden tensor descriptor that has as its first dimension\n of the number of layers if the direction mode is unidirectional and twice the\n number of layers if the direction mode is bidirectional. The second dimension of\n the descriptor must equal the largest first dimension of the xDesc tensor descriptor\n array. The third dimension equals the hiddenSize. (input)\n @param hx                    Pointer to the hidden layer input tensor. If hx is NULL,\n then the initial hidden state will be zero initialized. (input)\n @param cxDesc                A cell tensor descriptor that has as its first dimension\n of the number of layers if the direction mode is unidirectional and twice the\n number of layers if the direction mode is bidirectional. The second dimension of\n the descriptor must equal the largest first dimension of the xDesc tensor descriptor\n array. The third dimension equals the hiddenSize. (input)\n @param cx                    Pointer to the cell layer input tensor. If cx is NULL,\n then the initial cell state will be zero initialized. (input)\n @param wDesc                 A weights tensor descriptor (input)\n @param w                     Pointer to input weights tensor (input)\n @param yDesc                 An array of fully packed tensor descriptors associated\n with the output from each time step. The first dimension of the tensor descriptors\n must equal the first dimension of the first descriptor (batch size) in the xDesc\n tensor array. The second dimension of the element of the descriptor array\n depends on the direction mode selected. If the direction mode is unidirectional,\n the second dimension is the hiddenSize. If direction mode is bidirectional\n the second dimension is twice the hiddenSize. (input)\n @param y                     Pointer to output tensor (output)\n @param hyDesc                A hidden tensor descriptor that has as its first dimension\n of the number of layers if the direction mode is unidirectional and twice the\n number of layers if the direction mode is bidirectional. The second dimension of\n the descriptor must equal the largest first dimension of the xDesc tensor descriptor\n array. The third dimension equals the hiddenSize. (input)\n @param hy                    Pointer to the hidden layer output tensor. If hy is NULL,\n then the final hidden state will not be saved. (output)\n @param cyDesc                A cell tensor descriptor that has as its first dimension\n of the number of layers if the direction mode is unidirectional and twice the\n number of layers if the direction mode is bidirectional. The second dimension of\n the descriptor must equal the largest first dimension of the xDesc tensor descriptor\n array. The third dimension equals the hiddenSize. (input)\n @param cy                    Pointer to the cell layer output tensor. If hy is NULL,\n then the final cell state will not be saved. (output)\n @param workSpace             Pointer to memory allocated for forward training (input)\n @param workSpaceNumBytes     Number of allocated bytes in memory for the workspace (input)\n @param reserveSpace          Pointer to memory allocated for random states (input / output)\n @param reserveSpaceNumBytes  Number of allocated bytes in memory for use in the forward  (input)\n @return                      miopenStatus_t*/\n    pub fn miopenRNNForwardTraining(\n        handle: miopenHandle_t,\n        rnnDesc: miopenRNNDescriptor_t,\n        sequenceLen: ::core::ffi::c_int,\n        xDesc: *const miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        hxDesc: miopenTensorDescriptor_t,\n        hx: *const ::core::ffi::c_void,\n        cxDesc: miopenTensorDescriptor_t,\n        cx: *const ::core::ffi::c_void,\n        wDesc: miopenTensorDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        yDesc: *const miopenTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        hyDesc: miopenTensorDescriptor_t,\n        hy: *mut ::core::ffi::c_void,\n        cyDesc: miopenTensorDescriptor_t,\n        cy: *mut ::core::ffi::c_void,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceNumBytes: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n        reserveSpaceNumBytes: usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute backward data for recurrent layer\n\n Interface for executing the backward data pass on a RNN.\n\n @param handle                MIOpen handle (input)\n @param rnnDesc               RNN layer descriptor type (input)\n @param sequenceLen           Temporal iterations to unroll (input)\n @param yDesc                 An array of tensor descriptors (input)\n @param y                     Pointer to input tensor (input)\n @param dyDesc                An array of fully packed tensor descriptors associated\n with the output from each time step. The first dimension of the tensor descriptors\n must equal the first dimension of the first descriptor (batch size) in the xDesc\n tensor array. The second dimension of the element of the descriptor array\n depends on the direction mode selected. If the direction mode is unidirectional,\n the second dimension is the hiddenSize. If direction mode is bidirectional\n the second dimension is twice the hiddenSize. (input)\n @param dy                    Pointer to the hidden layer input tensor (input)\n @param dhyDesc               A hidden tensor descriptor that has as its first dimension\n of the number of layers if the direction mode is unidirectional and twice the\n number of layers if the direction mode is bidirectional. The second dimension of\n the descriptor must equal the largest first dimension of the xDesc tensor descriptor\n array. The third dimension equals the hiddenSize. (input)\n @param dhy                   Pointer to the cell layer input tensor (input)\n @param dcyDesc               A cell tensor descriptor that has as its first dimension\n of the number of layers if the direction mode is unidirectional and twice the\n number of layers if the direction mode is bidirectional. The second dimension of\n the descriptor must equal the largest first dimension of the xDesc tensor descriptor\n array. The third dimension equals the hiddenSize. (input)\n @param dcy                   Pointer to the cell layer input tensor. If dcy is NULL,\n then the initial delta cell state will be zero initialized. (input)\n @param wDesc                 A weights tensor descriptor (input)\n @param w                     Pointer to input weights tensor (input)\n @param hxDesc                An input hidden tensor descriptor that has as its first dimension\n of the number of layers if the direction mode is unidirectional and twice the\n number of layers if the direction mode is bidirectional. The second dimension of\n the descriptor must equal the largest first dimension of the xDesc tensor descriptor\n array. The third dimension equals the hiddenSize. (input)\n @param hx                    Pointer to the hidden layer input tensor. If hx is NULL,\n then the initial hidden state will be zero initialized. (input)\n @param cxDesc                A input cell tensor descriptor that has as its first dimension\n of the number of layers if the direction mode is unidirectional and twice the\n number of layers if the direction mode is bidirectional. The second dimension of\n the descriptor must equal the largest first dimension of the xDesc tensor descriptor\n array. The third dimension equals the hiddenSize. (input)\n @param cx                    Pointer to the hidden layer input tensor. If cx is NULL,\n then the initial cell state will be zero initialized. (input)\n @param dxDesc                An array of tensor descriptors. These are the\n input descriptors to each time step. The first dimension of each descriptor is the\n batch size and may decrease from element n to element n+1 and not increase in size.\n The second dimension is the same for all descriptors in the array and is the input\n vector length. (input)\n @param dx                    Pointer to the cell layer output tensor (output)\n @param dhxDesc               A hidden tensor descriptor that has as its first dimension\n of the number of layers if the direction mode is unidirectional and twice the\n number of layers if the direction mode is bidirectional. The second dimension of\n the descriptor must equal the largest first dimension of the xDesc tensor descriptor\n array. The third dimension equals the hiddenSize. (input)\n @param dhx                   Pointer to the delta hidden layer output tensor. If dhx is NULL\n the hidden gradient will not ouput. (output)\n @param dcxDesc               A tensor descriptor that has as its first dimension\n of the number of layers if the direction mode is unidirectional and twice the\n number of layers if the direction mode is bidirectional. The second dimension of\n the descriptor must equal the largest first dimension of the xDesc tensor descriptor\n array. The third dimension equals the hiddenSize. (input)\n @param dcx                   Pointer to the cell layer output tensor. If dcx is NULL\n the cell gradient will not ouput. (output)\n @param workSpace             Pointer to memory allocated for forward training (input)\n @param workSpaceNumBytes     Number of allocated bytes in memory for the workspace (input)\n @param reserveSpace          Pointer to memory allocated for random states (input / output)\n @param reserveSpaceNumBytes  Number of allocated bytes in memory for use in the forward (input)\n @return                      miopenStatus_t*/\n    pub fn miopenRNNBackwardData(\n        handle: miopenHandle_t,\n        rnnDesc: miopenRNNDescriptor_t,\n        sequenceLen: ::core::ffi::c_int,\n        yDesc: *const miopenTensorDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        dyDesc: *const miopenTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        dhyDesc: miopenTensorDescriptor_t,\n        dhy: *const ::core::ffi::c_void,\n        dcyDesc: miopenTensorDescriptor_t,\n        dcy: *const ::core::ffi::c_void,\n        wDesc: miopenTensorDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        hxDesc: miopenTensorDescriptor_t,\n        hx: *const ::core::ffi::c_void,\n        cxDesc: miopenTensorDescriptor_t,\n        cx: *const ::core::ffi::c_void,\n        dxDesc: *const miopenTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n        dhxDesc: miopenTensorDescriptor_t,\n        dhx: *mut ::core::ffi::c_void,\n        dcxDesc: miopenTensorDescriptor_t,\n        dcx: *mut ::core::ffi::c_void,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceNumBytes: usize,\n        reserveSpace: *mut ::core::ffi::c_void,\n        reserveSpaceNumBytes: usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute backward weights for recurrent layer\n\n Interface for executing the backward weights pass on a RNN.\n\n @param handle                MIOpen handle (input)\n @param rnnDesc               RNN layer descriptor type (input)\n @param sequenceLen           Temporal iterations to unroll (input)\n @param xDesc                 An array of tensor descriptors. These are the\n input descriptors to each time step. The first dimension of each descriptor is the\n batch size and may decrease from element n to element n+1 and not increase in size.\n The second dimension is the same for all descriptors in the array and is the input\n vector length. (input)\n @param x                     Pointer to input tensor (input)\n @param hxDesc                A hidden tensor descriptor that has as its first dimension\n of the number of layers if the direction mode is unidirectional and twice the\n number of layers if the direction mode is bidirectional. The second dimension of\n the descriptor must equal the largest first dimension of the xDesc tensor descriptor\n array. The third dimension equals the hiddenSize. (input)\n @param hx                    Pointer to the hidden layer input tensor. If hx is NULL,\n then the initial hidden state will be zero initialized. (input)\n @param yDesc                 An array of fully packed tensor descriptors associated\n with the output from each time step. The first dimension of the tensor descriptors\n must equal the first dimension of the first descriptor (batch size) in the xDesc\n tensor array. The second dimension of the element of the descriptor array\n depends on the direction mode selected. If the direction mode is unidirectional,\n the second dimension is the hiddenSize. If direction mode is bidirectional\n the second dimension is twice the hiddenSize. (input)\n @param y                     Pointer to the output tensor (input)\n @param dwDesc                A weights tensor descriptor (input)\n @param dw                    Pointer to input weights tensor (input / output)\n @param workSpace             Pointer to memory allocated for forward training (input)\n @param workSpaceNumBytes     Number of allocated bytes in memory for the workspace (input)\n @param reserveSpace          Pointer to memory allocated for random states (input)\n @param reserveSpaceNumBytes  Number of allocated bytes in memory for use in the forward (input)\n @return                      miopenStatus_t*/\n    pub fn miopenRNNBackwardWeights(\n        handle: miopenHandle_t,\n        rnnDesc: miopenRNNDescriptor_t,\n        sequenceLen: ::core::ffi::c_int,\n        xDesc: *const miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        hxDesc: miopenTensorDescriptor_t,\n        hx: *const ::core::ffi::c_void,\n        yDesc: *const miopenTensorDescriptor_t,\n        y: *const ::core::ffi::c_void,\n        dwDesc: miopenTensorDescriptor_t,\n        dw: *mut ::core::ffi::c_void,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceNumBytes: usize,\n        reserveSpace: *const ::core::ffi::c_void,\n        reserveSpaceNumBytes: usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute forward inference for RNN layer\n\n Interface for executing the forward inference pass on a RNN.\n\n @param handle                MIOpen handle (input)\n @param rnnDesc               RNN layer descriptor type (input)\n @param sequenceLen           Temporal iterations to unroll (input)\n @param xDesc                 An array of tensor descriptors. These are the\n input descriptors to each time step. The first dimension of each descriptor is the\n batch size and may decrease from element n to element n+1 and not increase in size.\n The second dimension is the same for all descriptors in the array and is the input\n vector length. (input)\n @param x                     Pointer to input tensor (input)\n @param hxDesc                A hidden tensor descriptor that has as its first dimension\n of the number of layers if the direction mode is unidirectional and twice the\n number of layers if the direction mode is bidirectional. The second dimension of\n the descriptor must equal the largest first dimension of the xDesc tensor descriptor\n array. The third dimension equals the hiddenSize. (input)\n @param hx                    Pointer to the hidden layer input tensor. If hx is NULL,\n then the initial hidden state will be zero initialized. (input)\n @param cxDesc                A cell tensor descriptor that has as its first dimension\n of the number of layers if the direction mode is unidirectional and twice the\n number of layers if the direction mode is bidirectional. The second dimension of\n the descriptor must equal the largest first dimension of the xDesc tensor descriptor\n array. The third dimension equals the hiddenSize. (input)\n @param cx                    Pointer to the cell layer input tensor. If cx is NULL,\n then the initial cell state will be zero initialized. (input)\n @param wDesc                 A weights tensor descriptor (input)\n @param w                     Pointer to input weights tensor (input)\n @param yDesc                 An array of fully packed tensor descriptors associated\n with the output from each time step. The first dimension of the tensor descriptors\n must equal the first dimension of the first descriptor (batch size) in the xDesc\n tensor array. The second dimension of the element of the descriptor array\n depends on the direction mode selected. If the direction mode is unidirectional,\n the second dimension is the hiddenSize. If direction mode is bidirectional\n the second dimension is twice the hiddenSize. (input)\n @param y                     Pointer to output tensor (output)\n @param hyDesc                A hidden tensor descriptor that has as its first dimension\n of the number of layers if the direction mode is unidirectional and twice the\n number of layers if the direction mode is bidirectional. The second dimension of\n the descriptor must equal the largest first dimension of the xDesc tensor descriptor\n array. The third dimension equals the hiddenSize. (input)\n @param hy                    Pointer to the hidden layer output tensor. If hy is NULL,\n then the final hidden state will not be saved. (output)\n @param cyDesc                A output cell tensor descriptor that has as its first dimension\n of the number of layers if the direction mode is unidirectional and twice the\n number of layers if the direction mode is bidirectional. The second dimension of\n the descriptor must equal the largest first dimension of the xDesc tensor descriptor\n array. The third dimension equals the hiddenSize. (input)\n @param cy                    Pointer to the cell layer output tensor. If cy is NULL,\n then the final cell state will not be saved. (output)\n @param workSpace             Pointer to memory allocated for forward training (input)\n @param workSpaceNumBytes     Number of allocated bytes in memory for the workspace (input)\n @return                      miopenStatus_t*/\n    pub fn miopenRNNForwardInference(\n        handle: miopenHandle_t,\n        rnnDesc: miopenRNNDescriptor_t,\n        sequenceLen: ::core::ffi::c_int,\n        xDesc: *const miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        hxDesc: miopenTensorDescriptor_t,\n        hx: *const ::core::ffi::c_void,\n        cxDesc: miopenTensorDescriptor_t,\n        cx: *const ::core::ffi::c_void,\n        wDesc: miopenTensorDescriptor_t,\n        w: *const ::core::ffi::c_void,\n        yDesc: *const miopenTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        hyDesc: miopenTensorDescriptor_t,\n        hy: *mut ::core::ffi::c_void,\n        cyDesc: miopenTensorDescriptor_t,\n        cy: *mut ::core::ffi::c_void,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceNumBytes: usize,\n    ) -> miopenStatus_t;\n}\nimpl miopenCTCLossAlgo_t {\n    ///< Results are guaranteed to be reproducible\n    pub const MIOPEN_CTC_LOSS_ALGO_DETERMINISTIC: miopenCTCLossAlgo_t = miopenCTCLossAlgo_t(\n        0,\n    );\n}\n#[repr(transparent)]\n/** @enum miopenCTCLossAlgo_t\n Algorithms available to execute the CTC loss operation*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenCTCLossAlgo_t(pub ::core::ffi::c_uint);\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Create a CTC loss function Descriptor\n\n API for creating an uninitialized CTC loss function descriptor.\n @param ctcLossDesc  Pointer to the CTC loss function descriptor type (output)\n @return             miopenStatus_t*/\n    pub fn miopenCreateCTCLossDescriptor(\n        ctcLossDesc: *mut miopenCTCLossDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Retrieves a CTC loss function descriptor's details\n\n @param ctcLossDesc          CTC loss function descriptor (input)\n @param dataType             Data type used in this CTC loss operation, only fp32 currently\n supported (output)\n @param blank_label_id       User defined index for blank label (output)\n @param apply_softmax_layer  Boolean to toggle input layer property (output)\n @return                     miopenStatus_t*/\n    pub fn miopenGetCTCLossDescriptor(\n        ctcLossDesc: miopenCTCLossDescriptor_t,\n        dataType: *mut miopenDataType_t,\n        blank_label_id: *mut ::core::ffi::c_int,\n        apply_softmax_layer: *mut bool,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Destroys a CTC loss function descriptor object\n\n @param ctcLossDesc  CTC loss function descriptor type (input)\n @return             miopenStatus_t*/\n    pub fn miopenDestroyCTCLossDescriptor(\n        ctcLossDesc: miopenCTCLossDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Set the details of a CTC loss function descriptor\n\n @param ctcLossDesc          CTC loss function descriptor type (input)\n @param dataType             Data type used in this CTC loss operation, only fp32 currently\n supported (input)\n @param blank_label_id       User defined index for blank label, default 0 (input)\n @param apply_softmax_layer  Boolean to toggle input layer property (input)\n @return             miopenStatus_t*/\n    pub fn miopenSetCTCLossDescriptor(\n        ctcLossDesc: miopenCTCLossDescriptor_t,\n        dataType: miopenDataType_t,\n        blank_label_id: ::core::ffi::c_int,\n        apply_softmax_layer: bool,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Query the amount of memory required to execute miopenCTCLoss\n\n This function calculates the amount of memory required to run the CTC loss function given a CTC\n loss function descriptor with the specified algorithm.\n @param handle         MIOpen handle (input)\n @param probsDesc      Tensor descriptor for probabilities (input)\n @param gradientsDesc  Tensor descriptor for gradients (input)\n @param labels         Pointer to the flattened labels list (input)\n @param labelLengths   Pointer to the lengths list for \"labels\" (input)\n @param inputLengths   Pointer to the list of the time steps in each batch (input)\n @param algo           CTC loss algorithm selected (input)\n @param ctcLossDesc    CTC loss function descriptor type (input)\n @param workSpaceSize  Number of bytes of workspace required for CTC loss operation with selected\n algorithm (output)\n @return               miopenStatus_t*/\n    pub fn miopenGetCTCLossWorkspaceSize(\n        handle: miopenHandle_t,\n        probsDesc: miopenTensorDescriptor_t,\n        gradientsDesc: miopenTensorDescriptor_t,\n        labels: *const ::core::ffi::c_int,\n        labelLengths: *const ::core::ffi::c_int,\n        inputLengths: *const ::core::ffi::c_int,\n        algo: miopenCTCLossAlgo_t,\n        ctcLossDesc: miopenCTCLossDescriptor_t,\n        workSpaceSize: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute forward inference for CTCLoss layer\n\n Interface for executing the forward inference pass on a CTCLoss.\n @param handle         MIOpen handle (input)\n @param probsDesc      Tensor descriptor for probabilities (input)\n @param probs          Pointer to the probabilities tensor (input)\n @param labels         Pointer to the flattened labels list (input)\n @param labelLengths   Pointer to the lengths list for \"labels\" (input)\n @param inputLengths   Pointer to the list of the time steps in each batch (input)\n @param losses         Pointer to the computed losses of CTC (Output)\n @param gradientsDesc  Tensor descriptor for gradients (input)\n @param gradients      Pointer to the computed gradients of CTC (Output)\n @param algo           CTC loss algorithm selected (input)\n @param ctcLossDesc    CTC loss function descriptor type (input)\n @param workSpace      Pointer to memory allocated for execute CTC loss operation (input)\n @param workSpaceSize  Number of bytes of workspace required for CTC loss operation with selected\n algorithm (input)\n @return               miopenStatus_t*/\n    pub fn miopenCTCLoss(\n        handle: miopenHandle_t,\n        probsDesc: miopenTensorDescriptor_t,\n        probs: *const ::core::ffi::c_void,\n        labels: *const ::core::ffi::c_int,\n        labelLengths: *const ::core::ffi::c_int,\n        inputLengths: *const ::core::ffi::c_int,\n        losses: *mut ::core::ffi::c_void,\n        gradientsDesc: miopenTensorDescriptor_t,\n        gradients: *mut ::core::ffi::c_void,\n        algo: miopenCTCLossAlgo_t,\n        ctcLossDesc: miopenCTCLossDescriptor_t,\n        workSpace: *mut ::core::ffi::c_void,\n        workSpaceSize: usize,\n    ) -> miopenStatus_t;\n}\nimpl miopenRNGType_t {\n    ///< XORWOW pseudorandom generator\n    pub const MIOPEN_RNG_PSEUDO_XORWOW: miopenRNGType_t = miopenRNGType_t(0);\n}\n#[repr(transparent)]\n/**  @enum miopenRNGType_t\n random number generator type*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenRNGType_t(pub ::core::ffi::c_uint);\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates the dropout descriptor object\n\n @param dropoutDesc Pointer to a dropout descriptor type\n @return            miopenStatus_t*/\n    pub fn miopenCreateDropoutDescriptor(\n        dropoutDesc: *mut miopenDropoutDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Destroys the dropout descriptor object\n\n @param dropoutDesc Dropout descriptor type (input)\n @return            miopenStatus_t*/\n    pub fn miopenDestroyDropoutDescriptor(\n        dropoutDesc: miopenDropoutDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Query the amount of memory required to run dropout\n\n This function calculates the amount of memory required to run dropout.\n @param xDesc                    Tensor descriptor for data tensor x (input)\n @param reserveSpaceSizeInBytes  Number of bytes of reservespace required for executing dropout\n (Output)\n @return                         miopenStatus_t*/\n    pub fn miopenDropoutGetReserveSpaceSize(\n        xDesc: miopenTensorDescriptor_t,\n        reserveSpaceSizeInBytes: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Query the amount of memory required to store the states of the random number generators\n\n This function calculates the amount of memory required to store the states of the random number\n generators used by miopenDropoutForward.\n @param handle            MIOpen handle (input)\n @param stateSizeInBytes  Number of bytes required to store random generator states (Output)\n @return                  miopenStatus_t*/\n    pub fn miopenDropoutGetStatesSize(\n        handle: miopenHandle_t,\n        stateSizeInBytes: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Get the details of the dropout descriptor\n\n Interface for querying the dropout descriptor\n @param dropoutDesc  Dropout layer descriptor (input)\n @param handle       MIOpen handle (input)\n @param dropout      The probability by which the input is set to 0 in the dropout layer (Output)\n @param states       Pointer to memory that holds random number generator states (Output)\n @param seed         Seed used to initialize random number generator states (Output)\n @param use_mask     Boolean flag indicating whether to use a saved mask (an existing or\n user-defined dropout layout) in reserveSpace (Output)\n @param state_evo    Boolean flag indicating whether to adopt state evolution strategy to update\n the PRNG states by the end of each implementation (Output placeholder, currently not enabled)\n @param rng_mode     Random number generator used to generate parallel random number sequences\n (Output)\n @return             miopenStatus_t*/\n    pub fn miopenGetDropoutDescriptor(\n        dropoutDesc: miopenDropoutDescriptor_t,\n        handle: miopenHandle_t,\n        dropout: *mut f32,\n        states: *mut *mut ::core::ffi::c_void,\n        seed: *mut ::core::ffi::c_ulonglong,\n        use_mask: *mut bool,\n        state_evo: *mut bool,\n        rng_mode: *mut miopenRNGType_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Restore the dropout descriptor to a saved state\n\n This function restores the state of dropout descriptor using the address of a state buffer with\n previously saved PRNG state pattern, without launching the expensive PRNG initialization process.\n\n Interface for restoring the dropout descriptor\n @param dropoutDesc       Dropout layer descriptor (input/Output)\n @param handle            MIOpen handle (input)\n @param dropout           The probability by which the input is set to 0 in the dropout layer\n (input)\n @param states            Pointer to memory that holds random number generator states (input)\n @param stateSizeInBytes  Number of bytes holding random generator states (input)\n @param seed              Seed used to initialize random number generator states (input)\n @param use_mask          Boolean flag indicating whether to use a saved mask (an existing or\n user-defined dropout layout) in reserveSpace (input)\n @param state_evo         Boolean flag indicating whether to adopt state evolution strategy to\n update the PRNG states by the end of each implementation (input placeholder, currently not\n enabled)\n @param rng_mode          Random number generator used to generate parallel random number\n sequences (input)\n @return                  miopenStatus_t*/\n    pub fn miopenRestoreDropoutDescriptor(\n        dropoutDesc: miopenDropoutDescriptor_t,\n        handle: miopenHandle_t,\n        dropout: f32,\n        states: *mut ::core::ffi::c_void,\n        stateSizeInBytes: usize,\n        seed: ::core::ffi::c_ulonglong,\n        use_mask: bool,\n        state_evo: bool,\n        rng_mode: miopenRNGType_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Initialize the dropout descriptor\n\n Interface for setting up the dropout descriptor\n @param dropoutDesc       Dropout layer descriptor (input/Output)\n @param handle            MIOpen handle (input)\n @param dropout           The probability by which the input is set to 0 in the dropout layer\n (input)\n @param states            Pointer to memory that holds random number generator states (input)\n @param stateSizeInBytes  Number of bytes provided for random generator states (input)\n @param seed              Seed used to initialize random number generator states (input)\n @param use_mask          Boolean flag indicating whether to use a saved mask (an existing or\n user-defined dropout layout) in reserveSpace (input)\n @param state_evo         Boolean flag indicating whether to adopt state evolution strategy to\n update the PRNG states by the end of each implementation (input placeholder, currently not\n enabled)\n @param rng_mode          Random number generator used to generate parallel random number\n sequences (input)\n @return                  miopenStatus_t*/\n    pub fn miopenSetDropoutDescriptor(\n        dropoutDesc: miopenDropoutDescriptor_t,\n        handle: miopenHandle_t,\n        dropout: f32,\n        states: *mut ::core::ffi::c_void,\n        stateSizeInBytes: usize,\n        seed: ::core::ffi::c_ulonglong,\n        use_mask: bool,\n        state_evo: bool,\n        rng_mode: miopenRNGType_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute forward dropout operation\n\n Interface for executing the forward pass on a Dropout.\n @param handle                   MIOpen handle (input)\n @param dropoutDesc              Dropout layer descriptor (input)\n @param noise_shape              Tensor descriptor for noise shape (input placeholder, currently\n not enabled)\n @param xDesc                    Tensor descriptor for data tensor x (input)\n @param x                        Data tensor x (input)\n @param yDesc                    Tensor descriptor for data tensor y (input)\n @param y                        Data tensor y (Output)\n @param reserveSpace             Pointer to memory allocated for executing forward dropout,\n expecting reserveSpace unchanged before next call of miopenDropoutBackward (Output)\n @param reserveSpaceSizeInBytes  Number of bytes of reservespace required for executing forward\n dropout (input)\n @return                         miopenStatus_t*/\n    pub fn miopenDropoutForward(\n        handle: miopenHandle_t,\n        dropoutDesc: miopenDropoutDescriptor_t,\n        noise_shape: miopenTensorDescriptor_t,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        yDesc: miopenTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        reserveSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute backward dropout operation\n\n Interface for executing the backward pass on a Dropout.\n @param handle                   MIOpen handle (input)\n @param dropoutDesc              Dropout layer descriptor (input)\n @param noise_shape              Tensor descriptor for noise shape (input placeholder, currently\n not enabled)\n @param dyDesc                   Tensor descriptor for data delta tensor dy (input)\n @param dy                       Data delta tensor dy (input)\n @param dxDesc                   Tensor descriptor for data delta tensor dx (input)\n @param dx                       Data delta tensor dx (Output)\n @param reserveSpace             Pointer to memory allocated for executing backward dropout,\n expecting reserveSpace unchanged after previous call of miopenDropoutForward (input)\n @param reserveSpaceSizeInBytes  Number of bytes of reservespace required for executing backward\n dropout (input)\n @return                         miopenStatus_t*/\n    pub fn miopenDropoutBackward(\n        handle: miopenHandle_t,\n        dropoutDesc: miopenDropoutDescriptor_t,\n        noise_shape: miopenTensorDescriptor_t,\n        dyDesc: miopenTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        dxDesc: miopenTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n        reserveSpace: *mut ::core::ffi::c_void,\n        reserveSpaceSizeInBytes: usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates the ReduceTensor descriptor object\n\n @param reduceTensorDesc Pointer to a ReduceTensor descriptor type\n @return            miopenStatus_t*/\n    pub fn miopenCreateReduceTensorDescriptor(\n        reduceTensorDesc: *mut miopenReduceTensorDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Destroy the ReduceTensor descriptor object\n\n @param reduceTensorDesc  ReduceTensor descriptor type (input)\n @return            miopenStatus_t*/\n    pub fn miopenDestroyReduceTensorDescriptor(\n        reduceTensorDesc: miopenReduceTensorDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Initialize a ReduceTensor descriptor object\n\n @param reduceTensorDesc         Pointer to the ReduceTensor descriptor object (output)\n @param reduceTensorOp           Enumerant specifying the operation used by ReduceTensor (input)\n @param reduceTensorCompType     Enumerant specifying the data type used with ReduceTensor\n operation (input)\n @param reduceTensorNanOpt       Enumerant specifying the Nan number propagation mode (input)\n @param reduceTensorIndices      Enumerant specifying the indices modes used by ReduceTensor\n (input)\n @param reduceTensorIndicesType  Enumerant specifying the data type of the indices (input)\n @return           miopenStatus_t*/\n    pub fn miopenSetReduceTensorDescriptor(\n        reduceTensorDesc: miopenReduceTensorDescriptor_t,\n        reduceTensorOp: miopenReduceTensorOp_t,\n        reduceTensorCompType: miopenDataType_t,\n        reduceTensorNanOpt: miopenNanPropagation_t,\n        reduceTensorIndices: miopenReduceTensorIndices_t,\n        reduceTensorIndicesType: miopenIndicesType_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Query a ReduceTensor descriptor object\n\n @param reduceTensorDesc         Pointer to the ReduceTensor descriptor object (input)\n @param reduceTensorOp           Pointer to enumerant specifying the operation used by\n ReduceTensor (output)\n @param reduceTensorCompType     Pointer to enumerant specifying the data type used with\n ReduceTensor operation (output)\n @param reduceTensorNanOpt       Pointer to enumerant specifying the Nan number propagation mode\n (output)\n @param reduceTensorIndices      Pointer to enumerant specifying the indices modes used by\n ReduceTensor (output)\n @param reduceTensorIndicesType  Pointer to enumerant specifying the data type of the indices\n (output)\n @return           miopenStatus_t*/\n    pub fn miopenGetReduceTensorDescriptor(\n        reduceTensorDesc: miopenReduceTensorDescriptor_t,\n        reduceTensorOp: *mut miopenReduceTensorOp_t,\n        reduceTensorCompType: *mut miopenDataType_t,\n        reduceTensorNanOpt: *mut miopenNanPropagation_t,\n        reduceTensorIndices: *mut miopenReduceTensorIndices_t,\n        reduceTensorIndicesType: *mut miopenIndicesType_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Helper function to query the minimum index space size required by the ReduceTensor call\n\n @param handle                   MIOpen Handle (input)\n @param reduceTensorDesc         Pointer to the ReduceTensor descriptor object (input)\n @param aDesc                    Pointer to the input tensor descriptor (input)\n @param cDesc                    Pointer to the output tensor descriptor (input)\n @param sizeInBytes              Pointer to data to return the minimum index space size\n @return           miopenStatus_t*/\n    pub fn miopenGetReductionIndicesSize(\n        handle: miopenHandle_t,\n        reduceTensorDesc: miopenReduceTensorDescriptor_t,\n        aDesc: miopenTensorDescriptor_t,\n        cDesc: miopenTensorDescriptor_t,\n        sizeInBytes: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Helper function to query the minimum workspace size required by the ReduceTensor call\n\n @param handle                   MIOpen Handle (input)\n @param reduceTensorDesc         Pointer to the ReduceTensor descriptor object (input)\n @param aDesc                    Pointer to the input tensor descriptor (input)\n @param cDesc                    Pointer to the output tensor descriptor (input)\n @param sizeInBytes              Pointer to data to return the minimum workspace size\n @return           miopenStatus_t*/\n    pub fn miopenGetReductionWorkspaceSize(\n        handle: miopenHandle_t,\n        reduceTensorDesc: miopenReduceTensorDescriptor_t,\n        aDesc: miopenTensorDescriptor_t,\n        cDesc: miopenTensorDescriptor_t,\n        sizeInBytes: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief TensorReduce function doing reduction on tensor A by implementing C = alpha * reduceOp(A)\n + beta * C\n\n The length of each dimension of output tensor C must match the length of the corresponding\n dimension of\n input tensor A or must be equal to 1. The dimensions with length equal to 1 indicate the\n dimensions\n of A to be reduced.\n\n @param handle                   MIOpen Handle (input)\n @param reduceTensorDesc         Pointer to the ReduceTensor descriptor object (input)\n @param indices                  Address of the allocated indices data space (output)\n @param indicesSizeInBytes       Size in bytes of the allocated indices data space (input)\n @param workspace                Address of the allocated workspace data (input)\n @param workspaceSizeInBytes     Size in bytes of the allocated workspace data (input)\n @param alpha                    Pointer to scale factor for data in input tensor A (input)\n @param aDesc                    Pointer to the tensor descriptor for input tensor A (input)\n @param A                        Pointer to the data of input tensor A (input)\n @param beta                     Pointer to scale factor for data in output tensor C (input)\n @param cDesc                    Pointer to the tensor descriptor for output tensor C (input)\n @param C                        Pointer to the data of output tensor C (output)\n @return           miopenStatus_t*/\n    pub fn miopenReduceTensor(\n        handle: miopenHandle_t,\n        reduceTensorDesc: miopenReduceTensorDescriptor_t,\n        indices: *mut ::core::ffi::c_void,\n        indicesSizeInBytes: usize,\n        workspace: *mut ::core::ffi::c_void,\n        workspaceSizeInBytes: usize,\n        alpha: *const ::core::ffi::c_void,\n        aDesc: miopenTensorDescriptor_t,\n        A: *const ::core::ffi::c_void,\n        beta: *const ::core::ffi::c_void,\n        cDesc: miopenTensorDescriptor_t,\n        C: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenProblem {\n    pub _address: u8,\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenProblem_t(pub *mut miopenProblem);\nimpl miopenProblemDirection_t {\n    pub const miopenProblemDirectionForward: miopenProblemDirection_t = miopenProblemDirection_t(\n        0,\n    );\n}\nimpl miopenProblemDirection_t {\n    pub const miopenProblemDirectionBackward: miopenProblemDirection_t = miopenProblemDirection_t(\n        1,\n    );\n}\nimpl miopenProblemDirection_t {\n    pub const miopenProblemDirectionBackwardWeights: miopenProblemDirection_t = miopenProblemDirection_t(\n        2,\n    );\n}\nimpl miopenProblemDirection_t {\n    pub const miopenProblemDirectionInference: miopenProblemDirection_t = miopenProblemDirection_t(\n        4,\n    );\n}\n#[repr(transparent)]\n/** @enum miopenProblemDirection_t\n Directions of miopen operation.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenProblemDirection_t(pub ::core::ffi::c_uint);\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorArgumentIdInvalid: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        0,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorConvolutionX: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        1,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorConvolutionW: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        2,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorConvolutionY: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        3,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaK: miopenTensorArgumentId_t = miopenTensorArgumentId_t(4);\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaQ: miopenTensorArgumentId_t = miopenTensorArgumentId_t(5);\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaV: miopenTensorArgumentId_t = miopenTensorArgumentId_t(6);\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaDescaleK: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        7,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaDescaleQ: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        8,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaDescaleV: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        9,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaDescaleS: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        10,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaScaleS: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        11,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaScaleO: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        12,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaDropoutProbability: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        13,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaDropoutSeed: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        14,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaDropoutOffset: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        15,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaO: miopenTensorArgumentId_t = miopenTensorArgumentId_t(16);\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaAmaxO: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        17,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaAmaxS: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        18,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaM: miopenTensorArgumentId_t = miopenTensorArgumentId_t(19);\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaZInv: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        20,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaDO: miopenTensorArgumentId_t = miopenTensorArgumentId_t(21);\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaDescaleO: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        22,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaDescaleDO: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        23,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaDescaleDS: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        24,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaScaleDS: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        25,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaScaleDQ: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        26,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaScaleDK: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        27,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaScaleDV: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        28,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaDQ: miopenTensorArgumentId_t = miopenTensorArgumentId_t(29);\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaDK: miopenTensorArgumentId_t = miopenTensorArgumentId_t(30);\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaDV: miopenTensorArgumentId_t = miopenTensorArgumentId_t(31);\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaAmaxDQ: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        32,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaAmaxDK: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        33,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaAmaxDV: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        34,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaAmaxDS: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        35,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaBias: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        36,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorActivationX: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        37,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorActivationY: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        38,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorActivationDX: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        39,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorActivationDY: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        40,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorBiasX: miopenTensorArgumentId_t = miopenTensorArgumentId_t(41);\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorBiasY: miopenTensorArgumentId_t = miopenTensorArgumentId_t(42);\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorBias: miopenTensorArgumentId_t = miopenTensorArgumentId_t(43);\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorSoftmaxX: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        44,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorSoftmaxY: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        45,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorSoftmaxDX: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        46,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorSoftmaxDY: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        47,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorBatchnormX: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        48,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorBatchnormY: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        49,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorBatchnormRunningMean: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        50,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorBatchnormRunningVariance: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        51,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorBatchnormSavedMean: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        52,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorBatchnormSavedVariance: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        53,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorBatchnormScale: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        54,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorBatchnormScaleDiff: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        55,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorBatchnormEstimatedMean: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        56,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorBatchnormEstimatedVariance: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        57,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorBatchnormBias: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        58,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorBatchnormBiasDiff: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        59,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorBatchnormDX: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        60,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorBatchnormDY: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        61,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorArgumentIsScalar: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        2147483648,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenTensorMhaMask: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        2147483649,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenScalarBatchnormExpAvgFactor: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        2147483650,\n    );\n}\nimpl miopenTensorArgumentId_t {\n    pub const miopenScalarBatchnormEpsilon: miopenTensorArgumentId_t = miopenTensorArgumentId_t(\n        2147483651,\n    );\n}\n#[repr(transparent)]\n/** @enum miopenTensorArgumentId_t\n Identifiers for tensor arguments of problems and operations.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenTensorArgumentId_t(pub ::core::ffi::c_uint);\nimpl miopenFindResultsOrder_t {\n    pub const miopenFindResultsOrderByTime: miopenFindResultsOrder_t = miopenFindResultsOrder_t(\n        0,\n    );\n}\nimpl miopenFindResultsOrder_t {\n    pub const miopenFindResultsOrderByWorkspaceSize: miopenFindResultsOrder_t = miopenFindResultsOrder_t(\n        1,\n    );\n}\n#[repr(transparent)]\n/** @enum miopenTensorArgumentId_t\n Different ways to sort results of the find call.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenFindResultsOrder_t(pub ::core::ffi::c_uint);\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Initializes a problem object describing a convolution operation.\n\n @param problem      Pointer to the problem to initialize\n @param operatorDesc Descriptor of the operator to be used\n @param direction    Direction of the operation\n @return             miopenStatus_t*/\n    pub fn miopenCreateConvProblem(\n        problem: *mut miopenProblem_t,\n        operatorDesc: miopenConvolutionDescriptor_t,\n        direction: miopenProblemDirection_t,\n    ) -> miopenStatus_t;\n}\nimpl miopenMhaMask_t {\n    pub const miopenMhaMaskNone: miopenMhaMask_t = miopenMhaMask_t(0);\n}\nimpl miopenMhaMask_t {\n    pub const miopenMhaMaskCausal: miopenMhaMask_t = miopenMhaMask_t(1);\n}\n#[repr(transparent)]\n/** @enum miopenMhaMask_t\n Different masks for Mha.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenMhaMask_t(pub ::core::ffi::c_uint);\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn miopenCreateMhaProblem(\n        problem: *mut miopenProblem_t,\n        operatorDesc: miopenMhaDescriptor_t,\n        direction: miopenProblemDirection_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates the mha descriptor object\n\n @param mhaDesc     Pointer to a mha descriptor type\n @return            miopenStatus_t*/\n    pub fn miopenCreateMhaDescriptor(\n        mhaDesc: *mut miopenMhaDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets the Mha descriptor details\n\n Sets all of the descriptor details for the Mha\n\n @param mhaDesc               Pointer to a Mha descriptor\n @param scale                 Scale\n @return                      miopenStatus_t*/\n    pub fn miopenSetMhaDescriptor(\n        mhaDesc: miopenMhaDescriptor_t,\n        scale: f32,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets the Mha descriptor details\n\n Retrieves all of the descriptor details for the Mha.\n\n @param mhaDesc       Pointer to a Mha descriptor\n @param scale         Scale (output)\n @return              miopenStatus_t*/\n    pub fn miopenGetMhaDescriptor(\n        mhaDesc: miopenMhaDescriptor_t,\n        scale: *mut f32,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates the Softmax descriptor object\n\n @param softmaxDesc Pointer to an softmax descriptor type\n @return            miopenStatus_t*/\n    pub fn miopenCreateSoftmaxDescriptor(\n        softmaxDesc: *mut miopenSoftmaxDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets the softmax descriptor details\n\n Sets all of the descriptor details for the softmax layer\n\n @param softmaxDesc  Pointer to a softmax layer descriptor\n @param alpha        Softmax alpha parameter\n @param beta         Softmax beta parameter\n @param algorithm    Softmax algorithm\n @param mode         Softmax mode\n @return             miopenStatus_t*/\n    pub fn miopenSetSoftmaxDescriptor(\n        softmaxDesc: miopenSoftmaxDescriptor_t,\n        alpha: f32,\n        beta: f32,\n        algorithm: miopenSoftmaxAlgorithm_t,\n        mode: miopenSoftmaxMode_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets the softmax layer descriptor details\n\n Retrieves all of the descriptor details for the softmax layer.\n\n @param softmaxDesc   Pointer to a softmax layer descriptor (input)\n @param alpha         Softmax alpha parameter (output)\n @param beta          Softmax beta parameter (output)\n @param algorithm     Softmax algorithm (output)\n @param mode          Softmax mode (output)\n @return              miopenStatus_t*/\n    pub fn miopenGetSoftmaxDescriptor(\n        softmaxDesc: miopenSoftmaxDescriptor_t,\n        alpha: *mut f32,\n        beta: *mut f32,\n        algorithm: *mut miopenSoftmaxAlgorithm_t,\n        mode: *mut miopenSoftmaxMode_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Destroys a problem object.\n\n @param problem Problem to destroy\n @return        miopenStatus_t*/\n    pub fn miopenDestroyProblem(problem: miopenProblem_t) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets a tensor descriptor for the specified argument.\n\n @param problem    Problem to update\n @param id         Id of the argument for the descriptor\n @param descriptor Tensor descriptor to set\n @return           miopenStatus_t*/\n    pub fn miopenSetProblemTensorDescriptor(\n        problem: miopenProblem_t,\n        id: miopenTensorArgumentId_t,\n        descriptor: miopenTensorDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenFindOptions {\n    pub _address: u8,\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenFindOptions_t(pub *mut miopenFindOptions);\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Initializes miopenFindOptions object.\n\n @param options    Pointer to options object to initialze\n @return           miopenStatus_t*/\n    pub fn miopenCreateFindOptions(options: *mut miopenFindOptions_t) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Destroys miopenFindOptions object.\n\n @param options    Options object to destroy\n @return           miopenStatus_t*/\n    pub fn miopenDestroyFindOptions(options: miopenFindOptions_t) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets the tuning find option. Default value is zero.\n\n @param options    Options object to update\n @param value      Value of zero means no tuning, value of one means tuning enabled\n @return           miopenStatus_t*/\n    pub fn miopenSetFindOptionTuning(\n        options: miopenFindOptions_t,\n        value: ::core::ffi::c_int,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets the results order find option. Default value is miopenFindResultsOrderByTime.\n\n @param options    Options object to update\n @param value      Specifies what order should find results have\n @return           miopenStatus_t*/\n    pub fn miopenSetFindOptionResultsOrder(\n        options: miopenFindOptions_t,\n        value: miopenFindResultsOrder_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets the workspace limit find option. Default value is maximum of size_t\n\n @param options    Options object to update\n @param value      Specifies the workspace limit for find call. All solvers exceeding the limit\n would be ignored.\n @return           miopenStatus_t*/\n    pub fn miopenSetFindOptionWorkspaceLimit(\n        options: miopenFindOptions_t,\n        value: usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Attaches the preallocated workspace to find options. Allocated by the library by default.\n\n @param options    Options object to update\n @param buffer     Specifies the workspace for find call\n @param size       Specifies the size of the buffer passed\n @return           miopenStatus_t*/\n    pub fn miopenSetFindOptionPreallocatedWorkspace(\n        options: miopenFindOptions_t,\n        buffer: *mut ::core::ffi::c_void,\n        size: usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Attaches a preallocated tensor to find options. If not used, buffers are allocated by\n MIOpen internally, which is not recommended.\n\n @param options    Options object to update\n @param id         Specifies the id of the tensor passed\n @param buffer     Specifies the tensor for find call\n @return           miopenStatus_t*/\n    pub fn miopenSetFindOptionPreallocatedTensor(\n        options: miopenFindOptions_t,\n        id: miopenTensorArgumentId_t,\n        buffer: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Forces library to attach kernel binaries to solutions for later saving. This allows zero\n lookup miopenRunSolution calls after miopenLoadSolution. Default value is 0.\n\n @param options    Options object to update\n @param attach     1 means attaching, 0 - skipping, any other value - reserved for future use\n @return           miopenStatus_t*/\n    pub fn miopenSetFindOptionAttachBinaries(\n        options: miopenFindOptions_t,\n        attach: ::core::ffi::c_uint,\n    ) -> miopenStatus_t;\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenSolution {\n    pub _address: u8,\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenSolution_t(pub *mut miopenSolution);\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Finds solutions to a problem by running different applicable solutions. Memory is\n automatically allocated.\n\n @param handle       Handle to execute the kernels\n @param problem      Problem to solve\n @param options      Find options. When null default values would be used\n @param solutions    Pointer to the first result. Must not be null\n @param numSolutions Pointer to the amount of results. Ignored if null\n @param maxSolutions Limits the amount of results\n @return             miopenStatus_t*/\n    pub fn miopenFindSolutions(\n        handle: miopenHandle_t,\n        problem: miopenProblem_t,\n        options: miopenFindOptions_t,\n        solutions: *mut miopenSolution_t,\n        numSolutions: *mut usize,\n        maxSolutions: usize,\n    ) -> miopenStatus_t;\n}\n/// @brief Values of a tensor or scalar argument for the miopenRunSolution function.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenTensorArgument_t {\n    pub id: miopenTensorArgumentId_t,\n    pub descriptor: *mut miopenTensorDescriptor_t,\n    pub buffer: *mut ::core::ffi::c_void,\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Runs the solution using the passed in buffers.\n\n @param handle        Handle to execute the kernels\n @param solution      Solution to execute\n @param nInputs       Amount to inputs for the solution\n @param tensors       Tensor arguments described by miopenTensorArgument_t\n @param workspace     Pointer to device buffer used as workspace. May be null when not required.\n Should not be less than expected\n @param workspaceSize Size of the workspace buffer\n @return              miopenStatus_t*/\n    pub fn miopenRunSolution(\n        handle: miopenHandle_t,\n        solution: miopenSolution_t,\n        nInputs: usize,\n        tensors: *const miopenTensorArgument_t,\n        workspace: *mut ::core::ffi::c_void,\n        workspaceSize: usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Destroys solution object.\n\n @param solution   Solution to destroy\n @return           miopenStatus_t*/\n    pub fn miopenDestroySolution(solution: miopenSolution_t) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Loads solution object from binary data.\n\n @param solution   Pointer to the solution to load\n @param data       Data to load the solution from\n @param size       Size of the solution blob\n @return           miopenStatus_t*/\n    pub fn miopenLoadSolution(\n        solution: *mut miopenSolution_t,\n        data: *const ::core::ffi::c_char,\n        size: usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Saves a solution object as binary data.\n\n @param solution   Solution to save\n @param data       Pointer to a buffer to save soltuion to\n @return           miopenStatus_t*/\n    pub fn miopenSaveSolution(\n        solution: miopenSolution_t,\n        data: *mut ::core::ffi::c_char,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Reads the expected size of a solution.\n\n @param solution   Solution to get size\n @param size       Pointer to a location where to write the size of the solution blob\n @return           miopenStatus_t*/\n    pub fn miopenGetSolutionSize(\n        solution: miopenSolution_t,\n        size: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Reads the amount of workspace required to exectute the solution.\n\n @param solution      Solution to get required workspace size\n @param workspaceSize Pointer to a location where to write the workspace size\n @return              miopenStatus_t*/\n    pub fn miopenGetSolutionWorkspaceSize(\n        solution: miopenSolution_t,\n        workspaceSize: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Reads the time spent to execute the solution the last it was run.\n\n @param solution Solution to get exection time\n @param time     Pointer to a location where to write the execution time\n @return         miopenStatus_t*/\n    pub fn miopenGetSolutionTime(\n        solution: miopenSolution_t,\n        time: *mut f32,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Reads id of the solver referred by the solution.\n\n @param solution Solution to get solver id from\n @param solverId Pointer to a location where to write the solver id\n @return         miopenStatus_t*/\n    pub fn miopenGetSolutionSolverId(\n        solution: miopenSolution_t,\n        solverId: *mut u64,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Gets the convolution algorithm implemented by a solver.\n\n @param solverId Solver id to get convolution algorithm of\n @param result   Pointer to a location where to write the algorithm\n @return         miopenStatus_t*/\n    pub fn miopenGetSolverIdConvAlgorithm(\n        solverId: u64,\n        result: *mut miopenConvAlgorithm_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Initializes a problem object describing an activation operation.\n @note As of now there is no way to actually get any solution for this kind of problems.\n\n @param problem      Pointer to the problem to initialize\n @param operatorDesc Descriptor of the operator to be used\n @param direction    Direction of the operation\n @return             miopenStatus_t*/\n    pub fn miopenCreateActivationProblem(\n        problem: *mut miopenProblem_t,\n        operatorDesc: miopenActivationDescriptor_t,\n        direction: miopenProblemDirection_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Initializes a problem object describing an activation operation.\n @note As of now there is no way to actually get any solution for this kind of problems.\n\n @param problem   Pointer to the problem to initialize\n @param mode      Batchnorm mode\n @param direction Direction of the operation\n @return          miopenStatus_t*/\n    pub fn miopenCreateBatchnormProblem(\n        problem: *mut miopenProblem_t,\n        mode: miopenBatchNormMode_t,\n        runningMeanVariance: bool,\n        direction: miopenProblemDirection_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Fuse two problems into a single one. Problems can be either regular, or fused. No\n problems are disposed in the process, so the problem2 should be destroyed manually if it is not\n needed anymore.\n @details\n miopenProblem_t problem = makeSomeProblem1();\\n\n miopenProblem_t problem2 = makeSomeProblem2();\\n\n miopenProblem_t problem3 = makeSomeProblem3();\\n\n miopenFuseProblems(problem, problem2);\\n\n // Now problem contains {problem1, problem2}\\n\n miopenFuseProblems(problem, problem3);\\n\n // Now problem contains {problem1, problem2, problem3}\\n\n miopenDestroyProblem(problem2);\\n\n miopenDestroyProblem(problem3);\n @note As of now there is no way to actually get any solution for this kind of problem.\n\n @param problem1     The first problem to fuse. The result would be stored here.\n @param problem2     The second problem to fuse.\n @return             miopenStatus_t*/\n    pub fn miopenFuseProblems(\n        problem1: miopenProblem_t,\n        problem2: miopenProblem_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Initializes a problem object describing an bias operation.\n @note As of now there is no way to actually get any solution for this kind of problems.\n\n @param problem        Pointer to the problem to initialize\n @param direction      Direction of the operation\n @return               miopenStatus_t*/\n    pub fn miopenCreateBiasProblem(\n        problem: *mut miopenProblem_t,\n        direction: miopenProblemDirection_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Initializes a problem object describing a softmax operation.\n\n @param problem      Pointer to the problem to initialize\n @param operatorDesc Descriptor of the operator to be used\n @param direction    Direction of the operation\n @return             miopenStatus_t*/\n    pub fn miopenCreateSoftmaxProblem(\n        problem: *mut miopenProblem_t,\n        operatorDesc: miopenSoftmaxDescriptor_t,\n        direction: miopenProblemDirection_t,\n    ) -> miopenStatus_t;\n}\nimpl miopenReduceCalculationNanPropagation_t {\n    ///< does not propagate Nan number\n    pub const MIOPEN_REDUCE_CALCULATION_NOT_PROPAGATE_NAN: miopenReduceCalculationNanPropagation_t = miopenReduceCalculationNanPropagation_t(\n        0,\n    );\n}\nimpl miopenReduceCalculationNanPropagation_t {\n    pub const MIOPEN_REDUCE_CALCULATION_PROPAGATE_NAN: miopenReduceCalculationNanPropagation_t = miopenReduceCalculationNanPropagation_t(\n        1,\n    );\n}\n#[repr(transparent)]\n/** @ingroup ReduceCalculation\n @enum miopenReduceCalculationNanPropagation_t\n Nan numbers propagation modes for reduce calculation*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenReduceCalculationNanPropagation_t(pub ::core::ffi::c_uint);\nimpl miopenReduceCalculationOp_t {\n    pub const MIOPEN_REDUCE_CALCULATION_PROD: miopenReduceCalculationOp_t = miopenReduceCalculationOp_t(\n        1,\n    );\n}\nimpl miopenReduceCalculationOp_t {\n    pub const MIOPEN_REDUCE_CALCULATION_SUM: miopenReduceCalculationOp_t = miopenReduceCalculationOp_t(\n        2,\n    );\n}\n#[repr(transparent)]\n/** @enum miopenReduceCalculationOp_t\n Reduction Calculation operation types*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenReduceCalculationOp_t(pub ::core::ffi::c_uint);\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Helper function to query the minimum workspace size required by the ReduceTensor call\n\n @param [in]   handle                   MIOpen Handle\n @param [in]   xDesc                    Tensor descriptor for data input tensor x\n @param [in]   dim                      Dimension to calculation.\n @param [in]   yDesc                    Tensor descriptor for output data tensor y\n @param [out]  sizeInBytes              Pointer to data to return the minimum workspace size\n @return                                miopenStatus_t*/\n    pub fn miopenGetReduceCalculationWorkspaceSize(\n        handle: miopenHandle_t,\n        xDesc: miopenTensorDescriptor_t,\n        dim: i32,\n        reduceCalculationOp: miopenReduceCalculationOp_t,\n        reduceDesc: miopenTensorDescriptor_t,\n        sizeInBytes: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute a reducecalculation forward layer\n\n @param [in]   handle                   MIOpen handle\n @param [in]   nanPropagation           Nan number propagation mode\n @param [in]   workspace                Address of the allocated workspace data\n @param [in]   workspaceSizeInBytes     Size in bytes of the allocated workspace data\n @param [in]   xDesc                    Tensor descriptor for data input tensor x\n @param [in]   x                        Data tensor x\n @param [in]   dim                      Dimension to calculation.\n @param [in]   yDesc                    Tensor descriptor for output data tensor y\n @param [out]  y                        Data tensor y\n @return                                miopenStatus_t*/\n    pub fn miopenReduceCalculationForward(\n        handle: miopenHandle_t,\n        nanPropagation: miopenReduceCalculationNanPropagation_t,\n        workspace: *mut ::core::ffi::c_void,\n        workspaceSizeInBytes: usize,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        dim: i32,\n        reduceCalculationOp: miopenReduceCalculationOp_t,\n        reduceDesc: miopenTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\nimpl miopenReduceExtremeOp_t {\n    pub const MIOPEN_REDUCE_EXTREME_ARGMIN: miopenReduceExtremeOp_t = miopenReduceExtremeOp_t(\n        1,\n    );\n}\nimpl miopenReduceExtremeOp_t {\n    pub const MIOPEN_REDUCE_EXTREME_ARGMAX: miopenReduceExtremeOp_t = miopenReduceExtremeOp_t(\n        2,\n    );\n}\nimpl miopenReduceExtremeOp_t {\n    pub const MIOPEN_REDUCE_EXTREME_MIN: miopenReduceExtremeOp_t = miopenReduceExtremeOp_t(\n        3,\n    );\n}\nimpl miopenReduceExtremeOp_t {\n    pub const MIOPEN_REDUCE_EXTREME_MAX: miopenReduceExtremeOp_t = miopenReduceExtremeOp_t(\n        4,\n    );\n}\n#[repr(transparent)]\n/** @ingroup ReduceExtreme\n @enum miopenReduceExtremeOp_t\n Reduction Extreme operation types*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenReduceExtremeOp_t(pub ::core::ffi::c_uint);\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Find the the extreme (minimum, maximum) value and index of a tensor across Dimension.\n\n @param handle                   MIOpen handle (input)\n @param xDesc                    Tensor descriptor for data input tensor x (input)\n @param x                        Data tensor x (input)\n @param dim                      Dimension to reduce argmax. (input)\n @param reduceExtremeOp          Enumerant specifying the operation used by ReduceExtreme (input)\n @param yDesc                    Tensor descriptor for reduce data tensor y (input)\n @param y                        Data tensor y (output)\n @param indiceDesc               Tensor descriptor for reduce data tensor indice only int32_t\n (input)\n @param indice                   Data tensor indice (output)\n @return                         miopenStatus_t*/\n    pub fn miopenReduceExtremeForward(\n        handle: miopenHandle_t,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        dim: i32,\n        reduceExtremeOp: miopenReduceExtremeOp_t,\n        yDesc: miopenTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        indiceDesc: miopenTensorDescriptor_t,\n        indice: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" @addtogroup groupnorm\\n\\n  @{\\n/\\n/*! @brief Execute a groupnorm forward layer\\n\\n @param handle         MIOpen handle (input)\\n @param mode           GroupNorm mode (input)\\n @param xDesc          Tensor descriptor for data input tensor x (input)\\n @param x              Data tensor x (input)\\n @param weightDesc     Tensor descriptor for data input tensor weight (input)\\n @param weight         Data tensor weight (input)\\n @param biasDesc       Tensor descriptor for data input tensor bias (input)\\n @param bias           Data tensor bias (input)\\n @param num_groups     nNmber of groups to separate the channels into (input)\\n @param epsilon        Value to stablize inverse variance calculation (input)\\n @param yDesc          Tensor descriptor for output data tensor y (input)\\n @param y              Data tensor y (output)\\n @param meanDesc       Tensor descriptor for output data tensor mean (input)\\n @param mean           Data tensor mean (output)\\n @param rstdDesc       Tensor descriptor for output data tensor rstd (input)\\n @param rstd           Data tensor rstd (output)\\n @return               miopenStatus_t\"]\n    pub fn miopenGroupNormForward(\n        handle: miopenHandle_t,\n        mode: miopenNormMode_t,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        weightDesc: miopenTensorDescriptor_t,\n        weight: *const ::core::ffi::c_void,\n        biasDesc: miopenTensorDescriptor_t,\n        bias: *const ::core::ffi::c_void,\n        num_groups: u64,\n        epsilon: f32,\n        yDesc: miopenTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        meanDesc: miopenTensorDescriptor_t,\n        mean: *mut ::core::ffi::c_void,\n        rstdDesc: miopenTensorDescriptor_t,\n        rstd: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" @addtogroup layernorm\\n\\n  @{\\n/\\n/*! @brief Execute a add and layernorm forward layer\\n\\n @param handle         MIOpen handle (input)\\n @param mode           LayerNorm mode (input)\\n @param xDesc          Tensor descriptor for data input tensor x (input)\\n @param x              Data tensor x (input)\\n @param x2Desc         Tensor descriptor for data input tensor x2 (input)\\n @param x2             Data tensor x2 (input)\\n @param weightDesc     Tensor descriptor for data input tensor weight (input)\\n @param weight         Data tensor weight (input)\\n @param biasDesc       Tensor descriptor for data input tensor bias (input)\\n @param bias           Data tensor bias (input)\\n @param epsilon        Value to stablize inverse variance calculation (input)\\n @param normalized_dim Nomalized dimensions in the input array (input)\\n @param yDesc          Tensor descriptor for output data tensor y (input)\\n @param y              Data tensor y (output)\\n @param meanDesc       Tensor descriptor for output data tensor mean (input)\\n @param mean           Data tensor mean (output)\\n @param rstdDesc       Tensor descriptor for output data tensor rstd (input)\\n @param rstd           Data tensor rstd (output)\\n @return               miopenStatus_t\"]\n    pub fn miopenAddLayerNormForward(\n        handle: miopenHandle_t,\n        mode: miopenNormMode_t,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        x2Desc: miopenTensorDescriptor_t,\n        x2: *const ::core::ffi::c_void,\n        weightDesc: miopenTensorDescriptor_t,\n        weight: *const ::core::ffi::c_void,\n        biasDesc: miopenTensorDescriptor_t,\n        bias: *const ::core::ffi::c_void,\n        epsilon: f32,\n        normalized_dim: i32,\n        yDesc: miopenTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        meanDesc: miopenTensorDescriptor_t,\n        mean: *mut ::core::ffi::c_void,\n        rstdDesc: miopenTensorDescriptor_t,\n        rstd: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" @addtogroup layernorm\\n\\n  @{\\n/\\n/*! @brief Execute a T5layernorm forward layer\\n\\n @param handle         MIOpen handle (input)\\n @param mode           LayerNorm mode (input)\\n @param xDesc          Tensor descriptor for data input tensor x (input)\\n @param x              Data tensor x (input)\\n @param weightDesc     Tensor descriptor for data input tensor weight (input)\\n @param weight         Data tensor weight (input)\\n @param epsilon        Value to stablize inverse variance calculation (input)\\n @param yDesc          Tensor descriptor for output data tensor y (input)\\n @param y              Data tensor y (output)\\n @param rstdDesc       Tensor descriptor for output data tensor rstd (input)\\n @param rstd           Data tensor rstd (output)\\n @return               miopenStatus_t\"]\n    pub fn miopenT5LayerNormForward(\n        handle: miopenHandle_t,\n        mode: miopenNormMode_t,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        weightDesc: miopenTensorDescriptor_t,\n        weight: *const ::core::ffi::c_void,\n        epsilon: f32,\n        yDesc: miopenTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n        rstdDesc: miopenTensorDescriptor_t,\n        rstd: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Helper function to query the minimum workspace size required by the T5layernorm backward\n call\n\n @param handle                   MIOpen Handle (input)\n @param mode                     LayerNorm mode (input)\n @param dyDesc                   Tensor descriptor for data input tensor dy (input)\n @param xDesc                    Tensor descriptor for data input tensor x (input)\n @param weightDesc               Tensor descriptor for data input tensor weight (input)\n @param rstdDesc                 Tensor descriptor for data input tensor rstd (input)\n @param dxDesc                   Tensor descriptor for output data tensor dx (input)\n @param dwDesc                   Tensor descriptor for output data tensor dw (input)\n @param sizeInBytes              Pointer to data to return the minimum workspace size\n @return                         miopenStatus_t*/\n    pub fn miopenGetT5LayerNormBackwardWorkspaceSize(\n        handle: miopenHandle_t,\n        mode: miopenNormMode_t,\n        dyDesc: miopenTensorDescriptor_t,\n        xDesc: miopenTensorDescriptor_t,\n        weightDesc: miopenTensorDescriptor_t,\n        rstdDesc: miopenTensorDescriptor_t,\n        dxDesc: miopenTensorDescriptor_t,\n        dwDesc: miopenTensorDescriptor_t,\n        sizeInBytes: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute a T5layernorm backward layer\n\n @param handle                   MIOpen handle (input)\n @param mode                     LayerNorm mode (input)\n @param workspace                Address of the allocated workspace data (input)\n @param workspaceSizeInBytes     Size in bytes of the allocated workspace data (input)\n @param dyDesc                   Tensor descriptor for data input tensor dy (input)\n @param dy                       Data tensor dy (input)\n @param xDesc                    Tensor descriptor for output data tensor x (input)\n @param x                        Data tensor x (input)\n @param weightDesc               Tensor descriptor for data input tensor weight (input)\n @param weight                   Data tensor weight (input)\n @param rstdDesc                 Tensor descriptor for output data tensor rstd (input)\n @param rstd                     Data tensor rstd (output)\n @param dxDesc                   Tensor descriptor for output data tensor dx (input)\n @param dx                       Data tensor dx (output)\n @param dwDesc                   Tensor descriptor for output data tensor dw (input)\n @param dw                       Data tensor dw (output)\n @return                         miopenStatus_t*/\n    pub fn miopenT5LayerNormBackward(\n        handle: miopenHandle_t,\n        mode: miopenNormMode_t,\n        workspace: *mut ::core::ffi::c_void,\n        workspaceSizeInBytes: usize,\n        dyDesc: miopenTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        weightDesc: miopenTensorDescriptor_t,\n        weight: *const ::core::ffi::c_void,\n        rstdDesc: miopenTensorDescriptor_t,\n        rstd: *const ::core::ffi::c_void,\n        dxDesc: miopenTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n        dwDesc: miopenTensorDescriptor_t,\n        dw: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_CONVOLUTION_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        0,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_ENGINE_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        1,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_ENGINECFG_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        2,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_ENGINEHEUR_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        3,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        4,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_INTERMEDIATE_INFO_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        5,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_KNOB_CHOICE_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        6,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_KNOB_INFO_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        7,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_LAYOUT_INFO_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        8,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_MATMUL_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        9,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_OPERATION_CONCAT_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        10,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_OPERATION_CONVOLUTION_BACKWARD_DATA_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        11,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_OPERATION_CONVOLUTION_BACKWARD_FILTER_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        12,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_OPERATION_CONVOLUTION_FORWARD_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        13,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_OPERATION_GEN_STATS_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        14,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_OPERATION_MATMUL_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        15,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_OPERATION_NORM_BACKWARD_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        16,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_OPERATION_NORM_FORWARD_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        17,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_OPERATION_POINTWISE_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        18,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_OPERATION_REDUCTION_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        19,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_OPERATION_RESAMPLE_BWD_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        20,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_OPERATION_RESAMPLE_FWD_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        21,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_OPERATION_RESHAPE_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        22,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_OPERATION_RNG_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        23,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_OPERATION_SIGNAL_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        24,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_OPERATIONGRAPH_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        25,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_POINTWISE_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        26,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_REDUCTION_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        27,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_RESAMPLE_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        28,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_RNG_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        29,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_TENSOR_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        30,\n    );\n}\nimpl miopenBackendDescriptorType_t {\n    pub const MIOPEN_BACKEND_VARIANT_PACK_DESCRIPTOR: miopenBackendDescriptorType_t = miopenBackendDescriptorType_t(\n        31,\n    );\n}\n#[repr(transparent)]\n/** @brief Descriptor type\n\n An enumerated type that indicates the type of backend descriptors. Users create a backend\n descriptor of a particular type by passing a value from this enumerate to the\n miopenBackendCreateDescriptor() function.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenBackendDescriptorType_t(pub ::core::ffi::c_uint);\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_POINTWISE_MODE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        0,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_POINTWISE_MATH_PREC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_POINTWISE_NAN_PROPAGATION: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_POINTWISE_RELU_LOWER_CLIP: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        3,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_POINTWISE_RELU_UPPER_CLIP: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        4,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_POINTWISE_RELU_LOWER_CLIP_SLOPE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        5,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_POINTWISE_ELU_ALPHA: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        6,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_POINTWISE_SOFTPLUS_BETA: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        7,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_POINTWISE_SWISH_BETA: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        8,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_POINTWISE_AXIS: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        9,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_CONVOLUTION_COMP_TYPE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        100,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_CONVOLUTION_CONV_MODE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        101,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_CONVOLUTION_DILATIONS: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        102,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_CONVOLUTION_FILTER_STRIDES: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        103,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_CONVOLUTION_POST_PADDINGS: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        104,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_CONVOLUTION_PRE_PADDINGS: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        105,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_CONVOLUTION_SPATIAL_DIMS: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        106,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_ENGINEHEUR_MODE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        200,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_ENGINEHEUR_OPERATION_GRAPH: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        201,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_ENGINEHEUR_RESULTS: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        202,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_ENGINEHEUR_SM_COUNT_TARGET: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        203,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_ENGINECFG_ENGINE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        300,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_ENGINECFG_INTERMEDIATE_INFO: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        301,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_ENGINECFG_KNOB_CHOICES: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        302,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_EXECUTION_PLAN_HANDLE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        400,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_EXECUTION_PLAN_ENGINE_CONFIG: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        401,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_EXECUTION_PLAN_WORKSPACE_SIZE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        402,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_EXECUTION_PLAN_COMPUTED_INTERMEDIATE_UIDS: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        403,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_EXECUTION_PLAN_RUN_ONLY_INTERMEDIATE_UIDS: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        404,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_EXECUTION_PLAN_JSON_REPRESENTATION: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        405,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_INTERMEDIATE_INFO_UNIQUE_ID: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        500,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_INTERMEDIATE_INFO_SIZE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        501,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_INTERMEDIATE_INFO_DEPENDENT_DATA_UIDS: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        502,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_INTERMEDIATE_INFO_DEPENDENT_ATTRIBUTES: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        503,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_KNOB_CHOICE_KNOB_TYPE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        600,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_KNOB_CHOICE_KNOB_VALUE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        601,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_CONVOLUTION_FORWARD_ALPHA: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        700,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_CONVOLUTION_FORWARD_BETA: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        701,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_CONVOLUTION_FORWARD_CONV_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        702,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_CONVOLUTION_FORWARD_W: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        703,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_CONVOLUTION_FORWARD_X: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        704,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_CONVOLUTION_FORWARD_Y: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        705,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_ALPHA: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        706,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_BETA: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        707,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_CONV_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        708,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_W: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        709,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_DX: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        710,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_DY: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        711,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_ALPHA: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        712,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_BETA: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        713,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_CONV_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        714,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_DW: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        715,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_X: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        716,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_DY: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        717,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_POINTWISE_PW_DESCRIPTOR: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        750,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_POINTWISE_XDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        751,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_POINTWISE_BDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        752,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_POINTWISE_YDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        753,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_POINTWISE_ALPHA1: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        754,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_POINTWISE_ALPHA2: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        755,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_POINTWISE_DXDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        756,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_POINTWISE_DYDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        757,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_POINTWISE_TDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        758,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_GENSTATS_MODE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        770,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_GENSTATS_MATH_PREC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        771,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_GENSTATS_XDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        772,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_GENSTATS_SUMDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        773,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_GENSTATS_SQSUMDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        774,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_BN_FINALIZE_STATS_MODE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        780,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_BN_FINALIZE_MATH_PREC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        781,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_BN_FINALIZE_Y_SUM_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        782,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_BN_FINALIZE_Y_SQ_SUM_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        783,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_BN_FINALIZE_SCALE_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        784,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_BN_FINALIZE_BIAS_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        785,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_BN_FINALIZE_PREV_RUNNING_MEAN_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        786,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_BN_FINALIZE_PREV_RUNNING_VAR_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        787,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_BN_FINALIZE_UPDATED_RUNNING_MEAN_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        788,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_BN_FINALIZE_UPDATED_RUNNING_VAR_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        789,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_BN_FINALIZE_SAVED_MEAN_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        790,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_BN_FINALIZE_SAVED_INV_STD_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        791,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_BN_FINALIZE_EQ_SCALE_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        792,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_BN_FINALIZE_EQ_BIAS_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        793,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_BN_FINALIZE_ACCUM_COUNT_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        794,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_BN_FINALIZE_EPSILON_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        795,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_BN_FINALIZE_EXP_AVERATE_FACTOR_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        796,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATIONGRAPH_HANDLE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        800,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATIONGRAPH_OPS: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        801,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATIONGRAPH_ENGINE_GLOBAL_COUNT: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        802,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_TENSOR_BYTE_ALIGNMENT: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        900,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_TENSOR_DATA_TYPE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        901,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_TENSOR_DIMENSIONS: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        902,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_TENSOR_STRIDES: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        903,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_TENSOR_VECTOR_COUNT: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        904,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_TENSOR_VECTORIZED_DIMENSION: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        905,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_TENSOR_UNIQUE_ID: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        906,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_TENSOR_IS_VIRTUAL: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        907,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_TENSOR_IS_BY_VALUE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        908,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_TENSOR_REORDERING_MODE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        909,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_TENSOR_RAGGED_OFFSET_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        910,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_VARIANT_PACK_UNIQUE_IDS: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1000,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_VARIANT_PACK_DATA_POINTERS: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1001,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_VARIANT_PACK_INTERMEDIATES: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1002,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_VARIANT_PACK_WORKSPACE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1003,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_LAYOUT_INFO_TENSOR_UID: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1100,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_LAYOUT_INFO_TYPES: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1101,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_KNOB_INFO_TYPE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1200,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_KNOB_INFO_MAXIMUM_VALUE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1201,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_KNOB_INFO_MINIMUM_VALUE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1202,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_KNOB_INFO_STRIDE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1203,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_ENGINE_OPERATION_GRAPH: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1300,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_ENGINE_GLOBAL_INDEX: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1301,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_ENGINE_KNOB_INFO: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1302,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_ENGINE_NUMERICAL_NOTE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1303,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_ENGINE_LAYOUT_INFO: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1304,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_ENGINE_BEHAVIOR_NOTE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1305,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_ENGINE_SM_COUNT_TARGET: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1306,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_MATMUL_COMP_TYPE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1500,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_MATMUL_PADDING_VALUE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1501,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_MATMUL_ADESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1520,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_MATMUL_BDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1521,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_MATMUL_CDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1522,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_MATMUL_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1523,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_MATMUL_IRREGULARLY_STRIDED_BATCH_COUNT: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1524,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_MATMUL_GEMM_M_OVERRIDE_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1525,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_MATMUL_GEMM_N_OVERRIDE_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1526,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_MATMUL_GEMM_K_OVERRIDE_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1527,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_REDUCTION_OPERATOR: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1600,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_REDUCTION_COMP_TYPE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1601,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_REDUCTION_XDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1610,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_REDUCTION_YDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1611,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_REDUCTION_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1612,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_BN_BWD_WEIGHTS_MATH_PREC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1620,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_BN_BWD_WEIGHTS_MEAN_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1621,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_BN_BWD_WEIGHTS_INVSTD_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1622,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_BN_BWD_WEIGHTS_BN_SCALE_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1623,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_BN_BWD_WEIGHTS_X_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1624,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_BN_BWD_WEIGHTS_DY_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1625,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_BN_BWD_WEIGHTS_DBN_SCALE_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1626,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_BN_BWD_WEIGHTS_DBN_BIAS_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1627,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_BN_BWD_WEIGHTS_EQ_DY_SCALE_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1628,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_BN_BWD_WEIGHTS_EQ_X_SCALE_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1629,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_BN_BWD_WEIGHTS_EQ_BIAS: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1630,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_RESAMPLE_MODE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1700,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_RESAMPLE_COMP_TYPE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1701,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_RESAMPLE_SPATIAL_DIMS: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1702,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_RESAMPLE_POST_PADDINGS: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1703,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_RESAMPLE_PRE_PADDINGS: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1704,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_RESAMPLE_STRIDES: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1705,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_RESAMPLE_WINDOW_DIMS: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1706,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_RESAMPLE_NAN_PROPAGATION: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1707,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_RESAMPLE_PADDING_MODE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1708,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_RESAMPLE_FWD_XDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1710,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_RESAMPLE_FWD_YDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1711,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_RESAMPLE_FWD_IDXDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1712,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_RESAMPLE_FWD_ALPHA: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1713,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_RESAMPLE_FWD_BETA: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1714,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_RESAMPLE_FWD_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1716,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_RESAMPLE_BWD_DXDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1720,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_RESAMPLE_BWD_DYDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1721,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_RESAMPLE_BWD_IDXDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1722,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_RESAMPLE_BWD_ALPHA: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1723,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_RESAMPLE_BWD_BETA: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1724,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_RESAMPLE_BWD_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1725,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_RESAMPLE_BWD_XDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1726,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_RESAMPLE_BWD_YDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1727,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_CONCAT_AXIS: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1800,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_CONCAT_INPUT_DESCS: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1801,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_CONCAT_INPLACE_INDEX: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1802,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_CONCAT_OUTPUT_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1803,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_SIGNAL_MODE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1900,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_SIGNAL_FLAGDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1901,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_SIGNAL_VALUE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1902,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_SIGNAL_XDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1903,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_SIGNAL_YDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        1904,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_NORM_FWD_MODE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2000,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_NORM_FWD_PHASE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2001,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_NORM_FWD_XDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2002,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_NORM_FWD_MEAN_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2003,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_NORM_FWD_INV_VARIANCE_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2004,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_NORM_FWD_SCALE_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2005,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_NORM_FWD_BIAS_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2006,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_NORM_FWD_EPSILON_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2007,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_NORM_FWD_EXP_AVG_FACTOR_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2008,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_NORM_FWD_INPUT_RUNNING_MEAN_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2009,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_NORM_FWD_INPUT_RUNNING_VAR_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2010,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_NORM_FWD_OUTPUT_RUNNING_MEAN_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2011,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_NORM_FWD_OUTPUT_RUNNING_VAR_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2012,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_NORM_FWD_YDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2013,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_NORM_FWD_PEER_STAT_DESCS: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2014,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_NORM_BWD_MODE: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2100,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_NORM_BWD_XDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2101,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_NORM_BWD_MEAN_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2102,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_NORM_BWD_INV_VARIANCE_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2103,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_NORM_BWD_DYDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2104,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_NORM_BWD_SCALE_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2105,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_NORM_BWD_EPSILON_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2106,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_NORM_BWD_DSCALE_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2107,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_NORM_BWD_DBIAS_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2108,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_NORM_BWD_DXDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2109,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_NORM_BWD_PEER_STAT_DESCS: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2110,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_RESHAPE_XDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2200,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_RESHAPE_YDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2201,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_RNG_DISTRIBUTION: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2300,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_RNG_NORMAL_DIST_MEAN: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2301,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_RNG_NORMAL_DIST_STANDARD_DEVIATION: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2302,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_RNG_UNIFORM_DIST_MAXIMUM: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2303,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_RNG_UNIFORM_DIST_MINIMUM: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2304,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_RNG_BERNOULLI_DIST_PROBABILITY: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2305,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_RNG_YDESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2310,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_RNG_SEED: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2311,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_RNG_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2312,\n    );\n}\nimpl miopenBackendAttributeName_t {\n    pub const MIOPEN_ATTR_OPERATION_RNG_OFFSET_DESC: miopenBackendAttributeName_t = miopenBackendAttributeName_t(\n        2313,\n    );\n}\n#[repr(transparent)]\n/** @brief Backend Descriptor's Attribute\n\n An enumerated type that indicates the backend descriptor attributes\n that can be set or get using miopenBackendSetAttribute() and miopenBackendGetAttribute()\n functions. The backend descriptor to which an attribute belongs is\n identified by the prefix of the attribute name.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenBackendAttributeName_t(pub ::core::ffi::c_uint);\nimpl miopenBackendAttributeType_t {\n    ///< miopenHandle_t\n    pub const MIOPEN_TYPE_HANDLE: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        0,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< miopenDataType_t\n    pub const MIOPEN_TYPE_DATA_TYPE: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        1,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< bool\n    pub const MIOPEN_TYPE_BOOLEAN: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        2,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< int64_t\n    pub const MIOPEN_TYPE_INT64: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        3,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< float\n    pub const MIOPEN_TYPE_FLOAT: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        4,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< double\n    pub const MIOPEN_TYPE_DOUBLE: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        5,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< void *\n    pub const MIOPEN_TYPE_VOID_PTR: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        6,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< miopenConvolutionMode_t\n    pub const MIOPEN_TYPE_CONVOLUTION_MODE: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        7,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< miopenBackendHeurMode_t\n    pub const MIOPEN_TYPE_HEUR_MODE: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        8,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< miopenBackendKnobType_t\n    pub const MIOPEN_TYPE_KNOB_TYPE: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        9,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< miopenNanPropagation_t\n    pub const MIOPEN_TYPE_NAN_PROPOGATION: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        10,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< miopenBackendNumericalNote_t\n    pub const MIOPEN_TYPE_NUMERICAL_NOTE: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        11,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< miopenBackendLayoutType_t\n    pub const MIOPEN_TYPE_LAYOUT_TYPE: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        12,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< miopenBackendAttributeName_t\n    pub const MIOPEN_TYPE_ATTRIB_NAME: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        13,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< miopenPointwiseMode_t\n    pub const MIOPEN_TYPE_POINTWISE_MODE: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        14,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< miopenBackendDescriptor_t\n    pub const MIOPEN_TYPE_BACKEND_DESCRIPTOR: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        15,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< miopenGenStatsMode_t\n    pub const MIOPEN_TYPE_GENSTATS_MODE: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        16,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< miopenBnFinalizeStatsMode_t\n    pub const MIOPEN_TYPE_BN_FINALIZE_STATS_MODE: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        17,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< miopenReduceTensorOp_t\n    pub const MIOPEN_TYPE_REDUCTION_OPERATOR_TYPE: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        18,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< miopenBackendBehaviorNote_t\n    pub const MIOPEN_TYPE_BEHAVIOR_NOTE: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        19,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< miopenBackendTensorReordering_t\n    pub const MIOPEN_TYPE_TENSOR_REORDERING_MODE: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        20,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< miopenResampleMode_t\n    pub const MIOPEN_TYPE_RESAMPLE_MODE: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        21,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< miopenPaddingMode_t\n    pub const MIOPEN_TYPE_PADDING_MODE: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        22,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< int32_t\n    pub const MIOPEN_TYPE_INT32: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        23,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< char\n    pub const MIOPEN_TYPE_CHAR: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        24,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< miopenSignalMode_t\n    pub const MIOPEN_TYPE_SIGNAL_MODE: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        25,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< miopenFraction_t\n    pub const MIOPEN_TYPE_FRACTION: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        26,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< miopenBackendNormMode_t\n    pub const MIOPEN_TYPE_NORM_MODE: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        27,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< miopenBackendNormFwdPhase_t\n    pub const MIOPEN_TYPE_NORM_FWD_PHASE: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        28,\n    );\n}\nimpl miopenBackendAttributeType_t {\n    ///< miopenRngDistribution_t\n    pub const MIOPEN_TYPE_RNG_DISTRIBUTION: miopenBackendAttributeType_t = miopenBackendAttributeType_t(\n        29,\n    );\n}\n#[repr(transparent)]\n/** @brief Data type of an attribute of a backend descriptor\n\n Specifies the data type of an attribute of a backend descriptor.\n It is used to specify the type of data pointed to by the\n void *arrayOfElements argument of miopenBackendSetAttribute()\n and miopenBackendGetAttribute()*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenBackendAttributeType_t(pub ::core::ffi::c_uint);\nimpl miopenPointwiseMode_t {\n    /// A pointwise addition between two tensors is computed.\n    pub const MIOPEN_POINTWISE_ADD: miopenPointwiseMode_t = miopenPointwiseMode_t(0);\n}\nimpl miopenPointwiseMode_t {\n    /** A pointwise addition between the first tensor and the square of the second tensor is\ncomputed.*/\n    pub const MIOPEN_POINTWISE_ADD_SQUARE: miopenPointwiseMode_t = miopenPointwiseMode_t(\n        1,\n    );\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise true division of the first tensor by second tensor is computed.\n    pub const MIOPEN_POINTWISE_DIV: miopenPointwiseMode_t = miopenPointwiseMode_t(2);\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise maximum is taken between two tensors.\n    pub const MIOPEN_POINTWISE_MAX: miopenPointwiseMode_t = miopenPointwiseMode_t(3);\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise minimum is taken between two tensors.\n    pub const MIOPEN_POINTWISE_MIN: miopenPointwiseMode_t = miopenPointwiseMode_t(4);\n}\nimpl miopenPointwiseMode_t {\n    /** A pointwise floating-point remainder of the first tensor’s division by the second tensor is\ncomputed.*/\n    pub const MIOPEN_POINTWISE_MOD: miopenPointwiseMode_t = miopenPointwiseMode_t(5);\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise multiplication between two tensors is computed.\n    pub const MIOPEN_POINTWISE_MUL: miopenPointwiseMode_t = miopenPointwiseMode_t(6);\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise value from the first tensor to the power of the second tensor is computed.\n    pub const MIOPEN_POINTWISE_POW: miopenPointwiseMode_t = miopenPointwiseMode_t(7);\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise subtraction between two tensors is computed.\n    pub const MIOPEN_POINTWISE_SUB: miopenPointwiseMode_t = miopenPointwiseMode_t(8);\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise absolute value of the input tensor is computed.\n    pub const MIOPEN_POINTWISE_ABS: miopenPointwiseMode_t = miopenPointwiseMode_t(9);\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise ceiling of the input tensor is computed.\n    pub const MIOPEN_POINTWISE_CEIL: miopenPointwiseMode_t = miopenPointwiseMode_t(10);\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise trigonometric cosine of the input tensor is computed.\n    pub const MIOPEN_POINTWISE_COS: miopenPointwiseMode_t = miopenPointwiseMode_t(11);\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise exponential of the input tensor is computed.\n    pub const MIOPEN_POINTWISE_EXP: miopenPointwiseMode_t = miopenPointwiseMode_t(12);\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise floor of the input tensor is computed.\n    pub const MIOPEN_POINTWISE_FLOOR: miopenPointwiseMode_t = miopenPointwiseMode_t(13);\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise natural logarithm of the input tensor is computed.\n    pub const MIOPEN_POINTWISE_LOG: miopenPointwiseMode_t = miopenPointwiseMode_t(14);\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise numerical negative of the input tensor is computed.\n    pub const MIOPEN_POINTWISE_NEG: miopenPointwiseMode_t = miopenPointwiseMode_t(15);\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise reciprocal of the square root of the input tensor is computed.\n    pub const MIOPEN_POINTWISE_RSQRT: miopenPointwiseMode_t = miopenPointwiseMode_t(16);\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise trigonometric sine of the input tensor is computed.\n    pub const MIOPEN_POINTWISE_SIN: miopenPointwiseMode_t = miopenPointwiseMode_t(17);\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise square root of the input tensor is computed.\n    pub const MIOPEN_POINTWISE_SQRT: miopenPointwiseMode_t = miopenPointwiseMode_t(18);\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise trigonometric tangent of the input tensor is computed.\n    pub const MIOPEN_POINTWISE_TAN: miopenPointwiseMode_t = miopenPointwiseMode_t(19);\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise Error Function is computed.\n    pub const MIOPEN_POINTWISE_ERF: miopenPointwiseMode_t = miopenPointwiseMode_t(20);\n}\nimpl miopenPointwiseMode_t {\n    /** No computation is performed. As with other pointwise modes, this mode provides implicit\nconversions by specifying the data type of the input tensor as one type, and the data type of\nthe output tensor as another.*/\n    pub const MIOPEN_POINTWISE_IDENTITY: miopenPointwiseMode_t = miopenPointwiseMode_t(\n        21,\n    );\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise rectified linear activation function of the input tensor is computed.\n    pub const MIOPEN_POINTWISE_RELU_FWD: miopenPointwiseMode_t = miopenPointwiseMode_t(\n        22,\n    );\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise tanh activation function of the input tensor is computed.\n    pub const MIOPEN_POINTWISE_TANH_FWD: miopenPointwiseMode_t = miopenPointwiseMode_t(\n        23,\n    );\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise sigmoid activation function of the input tensor is computed.\n    pub const MIOPEN_POINTWISE_SIGMOID_FWD: miopenPointwiseMode_t = miopenPointwiseMode_t(\n        24,\n    );\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise Exponential Linear Unit activation function of the input tensor is computed.\n    pub const MIOPEN_POINTWISE_ELU_FWD: miopenPointwiseMode_t = miopenPointwiseMode_t(\n        25,\n    );\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise Gaussian Error Linear Unit activation function of the input tensor is computed.\n    pub const MIOPEN_POINTWISE_GELU_FWD: miopenPointwiseMode_t = miopenPointwiseMode_t(\n        26,\n    );\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise softplus activation function of the input tensor is computed.\n    pub const MIOPEN_POINTWISE_SOFTPLUS_FWD: miopenPointwiseMode_t = miopenPointwiseMode_t(\n        27,\n    );\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise swish activation function of the input tensor is computed.\n    pub const MIOPEN_POINTWISE_SWISH_FWD: miopenPointwiseMode_t = miopenPointwiseMode_t(\n        28,\n    );\n}\nimpl miopenPointwiseMode_t {\n    /** A pointwise tanh approximation of the Gaussian Error Linear Unit activation function of the\ninput tensor is computed. The tanh GELU approximation is computed as \\f$0.5x\\left(\n1+\\tanh\\left[ \\sqrt{2/\\pi}\\left( x+0.044715x^{3} \\right) \\right] \\right)\\f$*/\n    pub const MIOPEN_POINTWISE_GELU_APPROX_TANH_FWD: miopenPointwiseMode_t = miopenPointwiseMode_t(\n        29,\n    );\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise first derivative of rectified linear activation of the input tensor is computed.\n    pub const MIOPEN_POINTWISE_RELU_BWD: miopenPointwiseMode_t = miopenPointwiseMode_t(\n        30,\n    );\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise first derivative of tanh activation of the input tensor is computed.\n    pub const MIOPEN_POINTWISE_TANH_BWD: miopenPointwiseMode_t = miopenPointwiseMode_t(\n        31,\n    );\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise first derivative of sigmoid activation of the input tensor is computed.\n    pub const MIOPEN_POINTWISE_SIGMOID_BWD: miopenPointwiseMode_t = miopenPointwiseMode_t(\n        32,\n    );\n}\nimpl miopenPointwiseMode_t {\n    /** A pointwise first derivative of Exponential Linear Unit activation of the input tensor is\ncomputed.*/\n    pub const MIOPEN_POINTWISE_ELU_BWD: miopenPointwiseMode_t = miopenPointwiseMode_t(\n        33,\n    );\n}\nimpl miopenPointwiseMode_t {\n    /** A pointwise first derivative of Gaussian Error Linear Unit activation of the input tensor is\ncomputed.*/\n    pub const MIOPEN_POINTWISE_GELU_BWD: miopenPointwiseMode_t = miopenPointwiseMode_t(\n        34,\n    );\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise first derivative of softplus activation of the input tensor is computed.\n    pub const MIOPEN_POINTWISE_SOFTPLUS_BWD: miopenPointwiseMode_t = miopenPointwiseMode_t(\n        35,\n    );\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise first derivative of swish activation of the input tensor is computed.\n    pub const MIOPEN_POINTWISE_SWISH_BWD: miopenPointwiseMode_t = miopenPointwiseMode_t(\n        36,\n    );\n}\nimpl miopenPointwiseMode_t {\n    /** A pointwise first derivative of the tanh approximation of the Gaussian Error Linear Unit\nactivation of the input tensor is computed. This is computed as \\f$0.5\\left( 1+\\tanh\\left(\nb\\left( x+cx^{3} \\right) \\right)+bxsech^{2}\\left( b\\left( cx^{3}+x \\right) \\right)\\left(\n3cx^{2}+1 \\right)dy \\right)\\f$ where \\f$b\\f$ is \\f$\\sqrt{2/\\pi}\\f$ and \\f$c\\f$ is\n\\f$0.044715\\f$*/\n    pub const MIOPEN_POINTWISE_GELU_APPROX_TANH_BWD: miopenPointwiseMode_t = miopenPointwiseMode_t(\n        37,\n    );\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise truth value of the first tensor equal to the second tensor is computed.\n    pub const MIOPEN_POINTWISE_CMP_EQ: miopenPointwiseMode_t = miopenPointwiseMode_t(38);\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise truth value of the first tensor not equal to the second tensor is computed.\n    pub const MIOPEN_POINTWISE_CMP_NEQ: miopenPointwiseMode_t = miopenPointwiseMode_t(\n        39,\n    );\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise truth value of the first tensor greater than the second tensor is computed.\n    pub const MIOPEN_POINTWISE_CMP_GT: miopenPointwiseMode_t = miopenPointwiseMode_t(40);\n}\nimpl miopenPointwiseMode_t {\n    /** A pointwise truth value of the first tensor greater than equal to the second tensor is\ncomputed.*/\n    pub const MIOPEN_POINTWISE_CMP_GE: miopenPointwiseMode_t = miopenPointwiseMode_t(41);\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise truth value of the first tensor less than the second tensor is computed.\n    pub const MIOPEN_POINTWISE_CMP_LT: miopenPointwiseMode_t = miopenPointwiseMode_t(42);\n}\nimpl miopenPointwiseMode_t {\n    /** A pointwise truth value of the first tensor less than equal to the second tensor is\ncomputed.*/\n    pub const MIOPEN_POINTWISE_CMP_LE: miopenPointwiseMode_t = miopenPointwiseMode_t(43);\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise truth value of the first tensor logical AND second tensor is computed.\n    pub const MIOPEN_POINTWISE_LOGICAL_AND: miopenPointwiseMode_t = miopenPointwiseMode_t(\n        44,\n    );\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise truth value of the first tensor logical OR second tensor is computed.\n    pub const MIOPEN_POINTWISE_LOGICAL_OR: miopenPointwiseMode_t = miopenPointwiseMode_t(\n        45,\n    );\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise truth value of input tensors logical NOT is computed.\n    pub const MIOPEN_POINTWISE_LOGICAL_NOT: miopenPointwiseMode_t = miopenPointwiseMode_t(\n        46,\n    );\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise index value of the input tensor is generated along a given axis.\n    pub const MIOPEN_POINTWISE_GEN_INDEX: miopenPointwiseMode_t = miopenPointwiseMode_t(\n        47,\n    );\n}\nimpl miopenPointwiseMode_t {\n    /// A pointwise value is selected amongst two input tensors based on a given predicate tensor.\n    pub const MIOPEN_POINTWISE_BINARY_SELECT: miopenPointwiseMode_t = miopenPointwiseMode_t(\n        48,\n    );\n}\nimpl miopenPointwiseMode_t {\n    /** A pointwise reciprocal of the input tensor is computed. In other words, for every element x\nin the input tensor, 1/x is computed.*/\n    pub const MIOPEN_POINTWISE_RECIPROCAL: miopenPointwiseMode_t = miopenPointwiseMode_t(\n        49,\n    );\n}\n#[repr(transparent)]\n/** @brief Intended poinwise math operation for a pointwise operation descriptor\n\n An enumerated type to indicate the intended pointwise math operation in the backend pointwise\n operation descriptor*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenPointwiseMode_t(pub ::core::ffi::c_uint);\nimpl miopenRngDistribution_t {\n    pub const MIOPEN_RNG_DISTRIBUTION_BERNOULLI: miopenRngDistribution_t = miopenRngDistribution_t(\n        0,\n    );\n}\nimpl miopenRngDistribution_t {\n    pub const MIOPEN_RNG_DISTRIBUTION_UNIFORM: miopenRngDistribution_t = miopenRngDistribution_t(\n        1,\n    );\n}\nimpl miopenRngDistribution_t {\n    pub const MIOPEN_RNG_DISTRIBUTION_NORMAL: miopenRngDistribution_t = miopenRngDistribution_t(\n        2,\n    );\n}\n#[repr(transparent)]\n/** @brief Distribution for random number generation\n\n An enumerated type to indicate the distribution to be used in the backend Rng (random number\n generator) operation.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenRngDistribution_t(pub ::core::ffi::c_uint);\nimpl miopenAlphaBetaCase_t {\n    pub const DEFAULT: miopenAlphaBetaCase_t = miopenAlphaBetaCase_t(0);\n}\nimpl miopenAlphaBetaCase_t {\n    pub const SCALE: miopenAlphaBetaCase_t = miopenAlphaBetaCase_t(1);\n}\nimpl miopenAlphaBetaCase_t {\n    pub const BILINEAR: miopenAlphaBetaCase_t = miopenAlphaBetaCase_t(2);\n}\nimpl miopenAlphaBetaCase_t {\n    pub const ERROR_STATE: miopenAlphaBetaCase_t = miopenAlphaBetaCase_t(3);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenAlphaBetaCase_t(pub ::core::ffi::c_uint);\nimpl miopenBackendHeurMode_t {\n    pub const MIOPEN_HEUR_MODE_INSTANT: miopenBackendHeurMode_t = miopenBackendHeurMode_t(\n        0,\n    );\n}\nimpl miopenBackendHeurMode_t {\n    pub const MIOPEN_HEUR_MODE_B: miopenBackendHeurMode_t = miopenBackendHeurMode_t(1);\n}\nimpl miopenBackendHeurMode_t {\n    pub const MIOPEN_HEUR_MODE_FALLBACK: miopenBackendHeurMode_t = miopenBackendHeurMode_t(\n        2,\n    );\n}\nimpl miopenBackendHeurMode_t {\n    pub const MIOPEN_HEUR_MODE_A: miopenBackendHeurMode_t = miopenBackendHeurMode_t(3);\n}\nimpl miopenBackendHeurMode_t {\n    pub const MIOPEN_HEUR_MODES_COUNT: miopenBackendHeurMode_t = miopenBackendHeurMode_t(\n        4,\n    );\n}\n#[repr(transparent)]\n/** @brief Operation mode of CUDNN_BACKEND_ENGINEHEUR_DESCRIPTOR\n\n  An enumerated type to indicate the operation mode of a CUDNN_BACKEND_ENGINEHEUR_DESCRIPTOR*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenBackendHeurMode_t(pub ::core::ffi::c_uint);\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenBackendDescriptor {\n    pub _address: u8,\n}\npub type miopenBackendDescriptor_t = *mut miopenBackendDescriptor;\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Creates a backend descriptor\n\n Allocates memory for a given descriptorType at the location pointed\n by the descriptor\n\n @param [in]   descriptorType  One among the enumerated miopenBackendDescriptorType_t\n @param [out]  descriptor      Pointer to a descriptor\n\n @retval  miopenStatusSuccess        The creation was successful\n @retval  miopenStatusUnsupportedOp  Creating a descriptor of a given type is not supported\n @retval  miopenStatusAllocFailed    The memory allocation failed\n @retval  miopenStatusUnknownError   The error information was not gathered*/\n    pub fn miopenBackendCreateDescriptor(\n        descriptorType: miopenBackendDescriptorType_t,\n        descriptor: *mut miopenBackendDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Sets an attribute of a descriptor\n\n This function sets an attribute of a descriptor to values provided as a pointer.\n Returns miopenStatusUnsupportedOp if the descriptor is already\n successfully finalized using miopenBackendFinalize().\n\n @param  [in]  descriptor       Instance of miopenBackendDescriptor_t whose attribute is being set\n @param  [in]  attributeName    The name of the attribute being set on the descriptor\n @param  [in]  attributeType    The type of attribute\n @param  [in]  elementCount     Number of elements being set\n @param  [in]  arrayOfElements  The starting location for an array from where to read the values\n                                from. The elements of the array are expected to be of the datatype\n                                of the attributeType. The datatype of the attributeType is listed\n                                in the mapping table of miopenBackendAttributeType_t.\n\n @retval  miopenStatusSuccess         The attributeName was set to the descriptor\n @retval  miopenStatusNotInitialized  The backend descriptor pointed to by the descriptor is\n                                      already in the finalized state\n @retval  miopenStatusBadParm         The function is called with arguments that correspond to\n                                      invalid values. Some examples include:\n                                      * attributeName is not a settable attribute of descriptor.\n                                      * attributeType is incorrect for this attributeName.\n                                      * elemCount value is unexpected.\n                                      * arrayOfElements contains values invalid for the\n                                        attributeType.\n @retval  miopenStatusUnsupportedOp  The values to which the attributes are being set are not\n                                     supported by the current version\n @retval  miopenStatusUnknownError   The error information was not gathered*/\n    pub fn miopenBackendSetAttribute(\n        descriptor: miopenBackendDescriptor_t,\n        attributeName: miopenBackendAttributeName_t,\n        attributeType: miopenBackendAttributeType_t,\n        elementCount: i64,\n        arrayOfElements: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Finalizes a backend descriptor\n\n Finalizes the memory pointed to by the descriptor. The type of finalization is done depending on\n the descriptorType argument with which the descriptor was created using\n miopenBackendCreateDescriptor() or initialized using miopenBackendInitialize().\n\n @param  [in]  descriptor  Instance of miopenBackendDescriptor_t to finalize\n\n @retval  miopenStatusSuccess        The descriptor was finalized successfully\n @retval  miopenStatusBadParm        Invalid descriptor attribute values or combination thereof is\n                                     encountered\n @retval  miopenStatusUnsupportedOp  Descriptor attribute values or combinations therefore not\n                                     supported by the current version\n @retval  miopenStatusInternalError  Some internal errors are encountered\n @retval  miopenStatusUnknownError   The error information was not gathered*/\n    pub fn miopenBackendFinalize(\n        descriptor: miopenBackendDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Retrieves backend descriptor's attribute\n\n This function retrieves the values of an attribute of a descriptor. attributeName is the name of\n the attribute whose value is requested. attributeType is the type of attribute.\n requestsedElementCount is the number of elements to be potentially retrieved. The number of\n elements for the requested attribute is stored in elementCount. The retrieved values are stored\n in arrayOfElements. When the attribute is expected to have a single value, arrayOfElements can be\n pointer to the output value. This function will return miopenStatusNotInitialized if the\n descriptor has not been successfully finalized using miopenBackendFinalize()\n\n @param  [in]   descriptor             Instance of miopenBackendDescriptor_t whose attribute to\n                                       retrieve\n @param  [in]   attributeName          The name of the attribute being get from the descriptor\n @param  [in]   attributeType          The type of attribute\n @param  [in]   requestedElementCount  Number of elements to output to arrayOfElements\n @param  [out]  elementCount           Output pointer for the number of elements the descriptor\n                                       attribute has. Note that miopenBackendGetAttribute() will\n                                       only write the least of this and requestedElementCount\n                                       elements to arrayOfElements\n @param  [out]  arrayOfElements        Array of elements of the datatype of the attributeType. The\n                                       data type of the attributeType is listed in the mapping\n                                       table of miopenBackendAttributeType_t\n\n @retval  miopenStatusSuccess         The attributeName was retrieved from the descriptor\n                                      successfully\n @retval  miopenStatusBadParm         One or more invalid or inconsistent argument values were\n                                      encountered. Some examples include:\n                                      * attributeName is not a valid attribute for the descriptor.\n                                      * attributeType is not one of the valid types for the\n                                        attribute.\n @retval  miopenStatusNotInitialized  The descriptor has not been successfully finalized using\n                                      miopenBackendFinalize()\n @retval  miopenStatusUnknownError    The error information was not gathered*/\n    pub fn miopenBackendGetAttribute(\n        descriptor: miopenBackendDescriptor_t,\n        attributeName: miopenBackendAttributeName_t,\n        attributeType: miopenBackendAttributeType_t,\n        requestedElementCount: i64,\n        elementCount: *mut i64,\n        arrayOfElements: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Executes a graph\n\n Executes the given Engine Configuration Plan on the VariantPack and the finalized ExecutionPlan\n on the data. The data and the working space are encapsulated in the VariantPack\n\n @param  [in]  handle         An instance of miopenHandle_t\n @param  [in]  executionPlan  Descriptor of the finalized ExecutionPlan\n @param  [in]  variantPack    Descriptor of the finalized VariantPack consisting of:\n                              * Data pointer for each non-virtual pointer of the operation set in\n                                the execution plan.\n                              * Pointer to user-allocated workspace in global memory at least as\n                              large as the size queried\n\n @retval  miopenStatusSuccess        The ExecutionPlan was executed successfully\n @retval  miopenStatusBadParm        An incorrect or inconsistent value is encountered. For\n                                     example, a required data pointer is invalid\n @retval  miopenStatusInternalError  Some internal errors were encountered\n @retval  miopenStatusUnknownError   The error information was not gathered*/\n    pub fn miopenBackendExecute(\n        handle: miopenHandle_t,\n        executionPlan: miopenBackendDescriptor_t,\n        variantPack: miopenBackendDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Destroys an instance of miopenBackendDescriptor_t\n\n Destroys instances of miopenBackendDescriptor_t that were previously created using\n miopenBackendCreateDescriptor(). The value pointed by the descriptor will be undefined after the\n memory is free and done.\n\n **Undefined Behavior** if the descriptor was altered between the 'Create' and 'Destroy\n Descriptor'\n\n @param  [in]  descriptor  Instance of miopenBackendDescriptor_t previously created by\n                           miopenBackendCreateDescriptor()\n\n @retval  miopenStatusSuccess       The memory was destroyed successfully\n @retval  miopenStatusAllocFailed   The destruction of memory failed\n @retval  miopenStatusUnknownError  The error information was not gathered*/\n    pub fn miopenBackendDestroyDescriptor(\n        descriptor: miopenBackendDescriptor_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Repurposes an instance of miopenBackendDescriptor_t\n\n Repurposes a pre-allocated memory pointed to by a descriptor of size sizeInByte to a backend\n descriptor of type descriptorType. The finalized state of the descriptor is set to false.\n\n @param  [in]  descriptor      Instance of miopenBackendDescriptor_t to be initialized\n @param  [in]  descriptorType  Enumerated value for the type miopenBackendDescriptorType_t\n @param  [in]  sizeInBytes     Size of memory pointed to by descriptor\n\n @retval  miopenStatusSuccess       The memory was initialized successfully\n @retval  miopenStatusBadParm       An invalid or inconsistent argument value is encountered. Some\n                                    examples include:\n                                    * descriptor is a nullptr\n                                    * sizeInBytes is less than the size required by the descriptor\n                                      type\n @retval  miopenStatusUnknownError  The error information was not gathered*/\n    pub fn miopenBackendInitialize(\n        descriptor: miopenBackendDescriptor_t,\n        descriptorType: miopenBackendDescriptorType_t,\n        sizeInBytes: usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" @addtogroup SGD\\n\\n  @{\\n/\\n/*! @brief Perform Fused Adam optimization for a single tensor (Adaptive Moment Estimation).\\n\\n This function implements the Fused Adam optimization algorithm. Adam, short for Adaptive Moment\\n Estimation, extends the RMSProp optimizer. It combines the advantages of AdaGrad and RMSProp by\\n adaptively adjusting learning rates for each parameter using the first and second moments of\\n gradients. Fused Adam optimization efficiently combines multiple operations into a single kernel,\\n reducing memory access overhead and improving performance.\\n\\n Additionally, Fused Adam can be utilized in both adam w and Automatic Mixed Precision (AMP),\\n enabling accelerated model training and reduced memory consumption. AMP supports FP16\\n computation, optimizing model calculations using a mixture of FP32 and FP16 precision to enhance\\n training speed. When utilizing AMP, FoundInf, ScaleGrad, and step tensors should be employed. In\\n AMP mode, the execution of Adam is determined based on the FoundInf value. State Step accepts\\n both int values and int tensors. If a Step tensor is employed, the step received as an int is\\n disregarded, and if Adam is executed, the step tensor is incremented by 1.\\n\\n @code\\n // Execute Adam\\n miopenFusedAdam(handle,\\n                 paramDesc,\\n                 param,\\n                 gradDesc,\\n                 grad,\\n                 expAvgDesc,\\n                 expAvg,\\n                 expAvgSqDesc,\\n                 expAvgSq,\\n                 NULL,     // Unused maxExpAvgSqDesc because amsgrad is false\\n                 NULL,\\n                 NULL,     // Unused stateStep Tensor because use step integer argument\\n                 NULL,\\n                 step,\\n                 lr,\\n                 beta1,\\n                 beta2,\\n                 weight_decay,\\n                 eps,\\n                 false,    // amsgrad\\n                 false,    // maximize\\n                 false,    // adamw\\n                 NULL,     // Unused gradScale Tensor because not amp\\n                 NULL,\\n                 NULL,     // Unused foundInf Tensor because not amp\\n                 NULL);\\n\\n // Execute AdamW\\n miopenFusedAdam(handle,\\n                 paramDesc,\\n                 param,\\n                 gradDesc,\\n                 grad,\\n                 expAvgDesc,\\n                 expAvg,\\n                 expAvgSqDesc,\\n                 expAvgSq,\\n                 NULL,     // Unused maxExpAvgSqDesc because amsgrad is false\\n                 NULL,\\n                 NULL,     // Unused stateStep Tensor because use step integer argument\\n                 NULL,\\n                 step,\\n                 lr,\\n                 beta1,\\n                 beta2,\\n                 weight_decay,\\n                 eps,\\n                 false,    // amsgrad\\n                 false,    // maximize\\n                 true,     // adamw\\n                 NULL,     // Unused gradScale Tensor because not amp\\n                 NULL,\\n                 NULL,     // Unused foundInf Tensor because not amp\\n                 NULL);\\n\\n // Execute AMP Adam\\n miopenFusedAdam(handle,\\n                 paramDesc,\\n                 param,\\n                 gradDesc,\\n                 grad,\\n                 expAvgDesc,\\n                 expAvg,\\n                 expAvgSqDesc,\\n                 expAvgSq,\\n                 NULL,     // Unused maxExpAvgSqDesc because amsgrad is false\\n                 NULL,\\n                 stateStepDesc,\\n                 stateStep,\\n                 -1,       // Ignore step value because stateStep Tensor is used\\n                 lr,\\n                 beta1,\\n                 beta2,\\n                 weight_decay,\\n                 eps,\\n                 false,    // amsgrad\\n                 false,    // maximize\\n                 false,    // adamw\\n                 gradScaleDesc,\\n                 gradScale,\\n                 foundInfDesc,\\n                 foundInf);\\n @endcode\\n\\n @param handle              MIOpen handle (input)\\n @param paramDesc           Tensor descriptor for the input parameter tensor (input)\\n @param param               Input parameter tensor (input)\\n @param gradDesc            Tensor descriptor for the input gradient tensor (input)\\n @param grad                Input gradient tensor (input)\\n @param expAvgDesc          Tensor descriptor for the input exponential moving average tensor\\n                            (input)\\n @param expAvg              Input exponential moving average tensor (input)\\n @param expAvgSqDesc        Tensor descriptor for the input exponential moving average squared\\n                            tensor (input)\\n @param expAvgSq            Input exponential moving average squared tensor (input)\\n @param maxExpAvgSqDesc     Tensor descriptor for the input maximum exponential moving average\\n                            squared tensor. Used when amsgrad is true (input, optional)\\n @param maxExpAvgSq         Input maximum exponential moving average squared tensor. Used when\\n                            amsgrad is true (input, optional)\\n @param stateStepDesc       Tensor descriptor for the input state step tensor (input)\\n @param stateStep           Input state step tensor (input)\\n @param state_step          Input state step. used when the step tensor is null (input)\\n @param lr                  Learning rate (input)\\n @param beta1               Coefficient used for computing the first moment running average of\\n                            gradient (input)\\n @param beta2               Coefficient used for computing the second moment running average of\\n                            gradient (input)\\n @param weight_decay        Weight decay (input)\\n @param eps                 Term added to the denominator to improve numerical stability (input)\\n @param amsgrad             Flag indicating whether to use the AMSGrad variant of Adam (input)\\n @param maximize            Flag indicating whether to maximize the objective with respect to the\\n                            parameters (input)\\n @param adamw               If true, the operation becomes AdamW (input)\\n @param gradScaleDesc       Tensor descriptor for the input grad scale tensor (input, optional)\\n @param gradScale           Input grad scale tensor (input, optional)\\n @param foundInfDesc        Tensor descriptor for the input found inf tensor (input, optional)\\n @param foundInf            Tensor indicating the presence of inf or NaN in gradients. If true,\\n                            skips operation and step update (input, optional)\\n @return                    miopenStatus_t\"]\n    pub fn miopenFusedAdam(\n        handle: miopenHandle_t,\n        paramDesc: miopenTensorDescriptor_t,\n        param: *mut ::core::ffi::c_void,\n        gradDesc: miopenTensorDescriptor_t,\n        grad: *const ::core::ffi::c_void,\n        expAvgDesc: miopenTensorDescriptor_t,\n        expAvg: *mut ::core::ffi::c_void,\n        expAvgSqDesc: miopenTensorDescriptor_t,\n        expAvgSq: *mut ::core::ffi::c_void,\n        maxExpAvgSqDesc: miopenTensorDescriptor_t,\n        maxExpAvgSq: *mut ::core::ffi::c_void,\n        stateStepDesc: miopenTensorDescriptor_t,\n        stateStep: *mut ::core::ffi::c_void,\n        state_step: ::core::ffi::c_uint,\n        lr: f32,\n        beta1: f32,\n        beta2: f32,\n        weight_decay: f32,\n        eps: f32,\n        amsgrad: bool,\n        maximize: bool,\n        adamw: bool,\n        gradScaleDesc: miopenTensorDescriptor_t,\n        gradScale: *const ::core::ffi::c_void,\n        foundInfDesc: miopenTensorDescriptor_t,\n        foundInf: *const ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute single tensor Adam optimization and receive the result in a separate output\n tensor.\n\n This function is equivalent to miopenFusedAdam but receives the result in a separate output\n tensor.\n @see miopenFusedAdam\n\n @code\n // Execute Adam\n miopenFusedAdamWithOutput(handle,\n                           paramInDesc,\n                           paramIn,\n                           paramOutDesc,\n                           paramOut,\n                           NULL,   // Unused paramOutFloat16 tensor because is not amp\n                           NULL,\n                           gradInDesc,\n                           gradIn,\n                           expAvgInDesc,\n                           expAvgIn,\n                           expAvgOutDesc,\n                           expAvgOut,\n                           expAvgInSqDesc,\n                           expAvgSqIn,\n                           expAvgSqOutDesc,\n                           expAvgSqOut,\n                           NULL,   // Unused maxExpAvgSqIn tensor because amsgrad is false\n                           NULL,\n                           NULL,   // Unused maxExpAvgSqOut tensor because amsgrad is false\n                           NULL,\n                           NULL,   // Unused stateStepIn tensor because use step integer argument\n                           NULL,\n                           NULL,   // Unused stateStepOut tensor because use step integer argument\n                           NULL,\n                           step,\n                           lr,\n                           beta1,\n                           beta2,\n                           weight_decay,\n                           eps,\n                           false,  // amsgrad\n                           false,  // maximize\n                           false,  // adamw\n                           NULL,   // Unused gradScale Tensor because not amp\n                           NULL,\n                           NULL,   // Unused foundInf Tensor because not amp\n                           NULL);\n\n // Execute Amp Adam\n miopenFusedAdamWithOutput(handle,\n                           paramInDesc,\n                           paramIn,\n                           paramOutDesc,\n                           paramOut,\n                           paramOutFloat16Desc,  // paramOutFloat16 tensor is optional in amp\n                           paramOutFloat16,\n                           gradInDesc,\n                           gradIn,\n                           expAvgInDesc,\n                           expAvgIn,\n                           expAvgOutDesc,\n                           expAvgOut,\n                           expAvgInSqDesc,\n                           expAvgSqIn,\n                           expAvgSqIn,\n                           expAvgSqOutDesc,\n                           expAvgSqOut,\n                           NULL,         // Unused maxExpAvgSqIn tensor because amsgrad is false\n                           NULL,\n                           NULL,         // Unused maxExpAvgSqOut tensor because amsgrad is false\n                           NULL,\n                           stateStepInDesc,\n                           stateStepIn,\n                           stateStepOutDesc,\n                           stateStepOut\n                           -1,           // Ignore step value because stateStep Tensor is used\n                           lr, beta1, beta2, weight_decay, eps,\n                           false,        // amsgrad\n                           false,        // maximize\n                           false,        // adamw\n                           gradScaleDesc,\n                           gradScale,\n                           foundInfDesc,\n                           foundInf);\n @endcode\n\n @param handle              MIOpen handle (input)\n @param paramInDesc         Tensor descriptor for the input parameter tensor (input)\n @param paramIn             Input parameter tensor (input)\n @param paramOutDesc        Tensor descriptor for the output parameter tensor (input)\n @param paramOut            Output parameter tensor (output)\n @param paramOutFloat16Desc Tensor descriptor for the output parameter tensor float16 (input,\n                            optional)\n @param paramOutFloat16     Output parameter tensor (output, optional)\n @param gradInDesc          Tensor descriptor for the input gradient tensor (input)\n @param gradIn              Input gradient tensor (input)\n @param expAvgInDesc        Tensor descriptor for the input exponential moving average tensor\n                            (input)\n @param expAvgIn            Input exponential moving average tensor (input)\n @param expAvgOutDesc       Tensor descriptor for the output exponential moving average tensor\n                            (input)\n @param expAvgOut           Output exponential moving average tensor (output)\n @param expAvgSqInDesc      Tensor descriptor for the input exponential moving average squared\n                            tensor (input)\n @param expAvgSqIn          Input exponential moving average squared tensor (input)\n @param expAvgSqOutDesc     Tensor descriptor for the output exponential moving average squared\n                            tensor (input)\n @param expAvgSqOut         Output exponential moving average squared tensor (output)\n @param maxExpAvgSqInDesc   Tensor descriptor for the input maximum exponential moving average\n                            squared tensor. Used when amsgrad is true (input, optional)\n @param maxExpAvgSqIn       Input maximum exponential moving average squared tensor. Used when\n                            amsgrad is true (input, optional)\n @param maxExpAvgSqOutDesc  Tensor descriptor for the output maximum exponential moving average\n                            squared tensor. Used when amsgrad is true (input, optional)\n @param maxExpAvgSqOut      Output maximum exponential moving average squared tensor. Used when\n                            amsgrad is true (output, optional)\n @param stateStepInDesc     Tensor descriptor for the input state step tensor (input, optional)\n @param stateStepIn         Input state step tensor (input, optional)\n @param stateStepOutDesc    Tensor descriptor for the output state step tensor (input, optional)\n @param stateStepOut        Output state step tensor that stores the updated step value. (output,\n                            optional)\n @param state_step          Input state step, It is used when the step tensor is null. (input)\n @param lr                  Learning rate (input)\n @param beta1               Coefficient used for computing the first moment running average of\n                            gradient (input)\n @param beta2               Coefficient used for computing the second moment running average of\n                            gradient (input)\n @param weight_decay        Weight decay (input)\n @param eps                 Term added to the denominator to improve numerical stability (input)\n @param amsgrad             Flag indicating whether to use the AMSGrad variant of Adam (input)\n @param maximize            Flag indicating whether to maximize the objective with respect to the\n                            parameters (input)\n @param adamw               If it is true, the operation becomes AdamW (input)\n @param gradScaleDesc       Tensor descriptor for the input grad scale tensor (input, optional)\n @param gradScale           Input grad scale tensor (input, optional)\n @param foundInfDesc        Tensor descriptor for the input found inf tensor (input, optional)\n @param foundInf            Tensor indicating presence of inf or nan in gradients. If true, skips\n                            operation and step update. (input, optional)\n @return                    miopenStatus_t*/\n    pub fn miopenFusedAdamWithOutput(\n        handle: miopenHandle_t,\n        paramInDesc: miopenTensorDescriptor_t,\n        paramIn: *mut ::core::ffi::c_void,\n        paramOutDesc: miopenTensorDescriptor_t,\n        paramOut: *mut ::core::ffi::c_void,\n        paramOutFloat16Desc: miopenTensorDescriptor_t,\n        paramOutFloat16: *mut ::core::ffi::c_void,\n        gradInDesc: miopenTensorDescriptor_t,\n        gradIn: *const ::core::ffi::c_void,\n        expAvgInDesc: miopenTensorDescriptor_t,\n        expAvgIn: *mut ::core::ffi::c_void,\n        expAvgOutDesc: miopenTensorDescriptor_t,\n        expAvgOut: *mut ::core::ffi::c_void,\n        expAvgSqInDesc: miopenTensorDescriptor_t,\n        expAvgSqIn: *mut ::core::ffi::c_void,\n        expAvgSqOutDesc: miopenTensorDescriptor_t,\n        expAvgSqOut: *mut ::core::ffi::c_void,\n        maxExpAvgSqInDesc: miopenTensorDescriptor_t,\n        maxExpAvgSqIn: *mut ::core::ffi::c_void,\n        maxExpAvgSqOutDesc: miopenTensorDescriptor_t,\n        maxExpAvgSqOut: *mut ::core::ffi::c_void,\n        stateStepInDesc: miopenTensorDescriptor_t,\n        stateStepIn: *mut ::core::ffi::c_void,\n        stateStepOutDesc: miopenTensorDescriptor_t,\n        stateStepOut: *mut ::core::ffi::c_void,\n        state_step: ::core::ffi::c_uint,\n        lr: f32,\n        beta1: f32,\n        beta2: f32,\n        weight_decay: f32,\n        eps: f32,\n        amsgrad: bool,\n        maximize: bool,\n        adamw: bool,\n        gradScaleDesc: miopenTensorDescriptor_t,\n        gradScale: *const ::core::ffi::c_void,\n        foundInfDesc: miopenTensorDescriptor_t,\n        foundInf: *const ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" @addtogroup SGD\\n\\n  @{\\n/\\n/*! @brief Implements Adam algorithm with weight decay fix as introduced in\\n <a href=\\\"https://arxiv.org/abs/1711.05101\\\">Decoupled Weight Decay Regularization</a>.\\n This is the fused kernel version of AdamW included in the Hugging Face Transformers module.\\n\\n @see miopenFusedAdam\\n\\n @code\\n // Execute Adam\\n miopenTransformersAdamW(handle,\\n                         paramDesc,\\n                         param,\\n                         gradDesc,\\n                         grad,\\n                         expAvgDesc,\\n                         expAvg,\\n                         expAvgSqDesc,\\n                         expAvgSq,\\n                         NULL,     // Unused stateStep Tensor because use step integer argument\\n                         NULL,\\n                         step,\\n                         lr,\\n                         beta1,\\n                         beta2,\\n                         weight_decay,\\n                         eps,\\n                         true,     // correct_bias\\n                         NULL,     // Unused gradScale Tensor because not amp\\n                         NULL,\\n                         NULL,     // Unused foundInf Tensor because not amp\\n                         NULL);\\n\\n // Execute AMP Adam\\n miopenTransformersAdamW(handle,\\n                         paramDesc,\\n                         param,\\n                         gradDesc,\\n                         grad,\\n                         expAvgDesc,\\n                         expAvg,\\n                         expAvgSqDesc,\\n                         expAvgSq,\\n                         stateStepDesc,\\n                         stateStep,\\n                         -1,       // Ignore step value because stateStep Tensor is used\\n                         lr,\\n                         beta1,\\n                         beta2,\\n                         weight_decay,\\n                         eps,\\n                         true,     // correct_bias\\n                         gradScaleDesc,\\n                         gradScale,\\n                         foundInfDesc,\\n                         foundInf);\\n @endcode\\n\\n @param handle              MIOpen handle (input)\\n @param paramDesc           Tensor descriptor for the input parameter tensor (input)\\n @param param               Input parameter tensor (input)\\n @param gradDesc            Tensor descriptor for the input gradient tensor (input)\\n @param grad                Input gradient tensor (input)\\n @param expAvgDesc          Tensor descriptor for the input exponential moving average tensor\\n                            (input)\\n @param expAvg              Input exponential moving average tensor (input)\\n @param expAvgSqDesc        Tensor descriptor for the input exponential moving average squared\\n                            tensor (input)\\n @param expAvgSq            Input exponential moving average squared tensor (input)\\n @param stateStepDesc       Tensor descriptor for the input state step tensor (input)\\n @param stateStep           Input state step tensor (input)\\n @param state_step          Input state step. used when the step tensor is null (input)\\n @param lr                  Learning rate (input)\\n @param beta1               Coefficient used for computing the first moment running average of\\n                            gradient (input)\\n @param beta2               Coefficient used for computing the second moment running average of\\n                            gradient (input)\\n @param weight_decay        Weight decay (input)\\n @param eps                 Term added to the denominator to improve numerical stability (input)\\n @param correct_bias        Whether or not to correct bias in Adam (for instance, in Bert TF\\n                            repository they use False).\\n @param gradScaleDesc       Tensor descriptor for the input grad scale tensor (input, optional)\\n @param gradScale           Input grad scale tensor (input, optional)\\n @param foundInfDesc        Tensor descriptor for the input found inf tensor (input, optional)\\n @param foundInf            Tensor indicating the presence of inf or NaN in gradients. If true,\\n                            skips operation and step update (input, optional)\\n @return                    miopenStatus_t\"]\n    pub fn miopenTransformersAdamW(\n        handle: miopenHandle_t,\n        paramDesc: miopenTensorDescriptor_t,\n        param: *mut ::core::ffi::c_void,\n        gradDesc: miopenTensorDescriptor_t,\n        grad: *const ::core::ffi::c_void,\n        expAvgDesc: miopenTensorDescriptor_t,\n        expAvg: *mut ::core::ffi::c_void,\n        expAvgSqDesc: miopenTensorDescriptor_t,\n        expAvgSq: *mut ::core::ffi::c_void,\n        stateStepDesc: miopenTensorDescriptor_t,\n        stateStep: *mut ::core::ffi::c_void,\n        state_step: ::core::ffi::c_uint,\n        lr: f32,\n        beta1: f32,\n        beta2: f32,\n        weight_decay: f32,\n        eps: f32,\n        correct_bias: bool,\n        gradScaleDesc: miopenTensorDescriptor_t,\n        gradScale: *const ::core::ffi::c_void,\n        foundInfDesc: miopenTensorDescriptor_t,\n        foundInf: *const ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute single tensor Adam optimization and receive the result in a separate output\n tensor.\n\n This function is equivalent to miopenTransformersAdam but receives the result in a separate\n output tensor.\n @see miopenTransformersAdamW\n @see miopenFusedAdamWithOutput\n\n @code\n // Execute Adam\n miopenTransformersAdamWWithOutput(handle,\n                                   paramInDesc,\n                                   paramIn,\n                                   paramOutDesc,\n                                   paramOut,\n                                   NULL,   // Unused paramOutFloat16 tensor because is not amp\n                                   NULL,\n                                   gradInDesc,\n                                   gradIn,\n                                   expAvgInDesc,\n                                   expAvgIn,\n                                   expAvgOutDesc,\n                                   expAvgOut,\n                                   expAvgInSqDesc,\n                                   expAvgSqIn,\n                                   expAvgSqOutDesc,\n                                   expAvgSqOut,\n                                   NULL,   // Unused stateStepIn tensor because use step int\n                                   NULL,\n                                   NULL,   // Unused stateStepOut tensor because use step int\n                                   NULL,\n                                   step,\n                                   lr,\n                                   beta1,\n                                   beta2,\n                                   weight_decay,\n                                   eps,\n                                   -1,     // step_size\n                                   true,   // correct_bias\n                                   NULL,   // Unused gradScale Tensor because not amp\n                                   NULL,\n                                   NULL,   // Unused foundInf Tensor because not amp\n                                   NULL);\n\n // Execute Amp Adam\n miopenTransformersAdamWWithOutput(handle,\n                                   paramInDesc,\n                                   paramIn,\n                                   paramOutDesc,\n                                   paramOut,\n                                   paramOutFloat16Desc,  // optional in amp\n                                   paramOutFloat16,\n                                   gradInDesc,\n                                   gradIn,\n                                   expAvgInDesc,\n                                   expAvgIn,\n                                   expAvgOutDesc,\n                                   expAvgOut,\n                                   expAvgInSqDesc,\n                                   expAvgSqIn,\n                                   expAvgSqIn,\n                                   expAvgSqOutDesc,\n                                   expAvgSqOut,\n                                   stateStepInDesc,\n                                   stateStepIn,\n                                   stateStepOutDesc,\n                                   stateStepOut\n                                   -1,   // Ignore step value because stateStep Tensor is used\n                                   lr,\n                                   beta1,\n                                   beta2,\n                                   weight_decay,\n                                   eps,\n                                   -1,   // step_size\n                                   true, // correct_bias\n                                   NULL, // Unused gradScale Tensor because not amp\n                                   NULL,\n                                   NULL, // Unused foundInf Tensor because not amp\n                                   NULL);\n @endcode\n\n @param handle              MIOpen handle (input)\n @param paramInDesc         Tensor descriptor for the input parameter tensor (input)\n @param paramIn             Input parameter tensor (input)\n @param paramOutDesc        Tensor descriptor for the output parameter tensor (input)\n @param paramOut            Output parameter tensor (output)\n @param paramOutFloat16Desc Tensor descriptor for the output parameter tensor float16 (input,\n                            optional)\n @param paramOutFloat16     Output parameter tensor (output, optional)\n @param gradInDesc          Tensor descriptor for the input gradient tensor (input)\n @param gradIn              Input gradient tensor (input)\n @param expAvgInDesc        Tensor descriptor for the input exponential moving average tensor\n                            (input)\n @param expAvgIn            Input exponential moving average tensor (input)\n @param expAvgOutDesc       Tensor descriptor for the output exponential moving average tensor\n                            (input)\n @param expAvgOut           Output exponential moving average tensor (output)\n @param expAvgSqInDesc      Tensor descriptor for the input exponential moving average squared\n                            tensor (input)\n @param expAvgSqIn          Input exponential moving average squared tensor (input)\n @param expAvgSqOutDesc     Tensor descriptor for the output exponential moving average squared\n                            tensor (input)\n @param expAvgSqOut         Output exponential moving average squared tensor (output)\n @param stateStepInDesc     Tensor descriptor for the input state step tensor (input, optional)\n @param stateStepIn         Input state step tensor (input, optional)\n @param stateStepOutDesc    Tensor descriptor for the output state step tensor (input, optional)\n @param stateStepOut        Output state step tensor that stores the updated step value. (output,\n                            optional)\n @param state_step          Input state step, It is used when the step tensor is null. (input)\n @param lr                  Learning rate (input)\n @param beta1               Coefficient used for computing the first moment running average of\n                            gradient (input)\n @param beta2               Coefficient used for computing the second moment running average of\n                            gradient (input)\n @param weight_decay        Weight decay (input)\n @param eps                 Term added to the denominator to improve numerical stability (input)\n @param step_size           Pre-calculated step_size, used for performance enhancement (input)\n @param correct_bias        Whether or not to correct bias in Adam (for instance, in Bert TF\n                            repository they use False) (input)\n @param gradScaleDesc       Tensor descriptor for the input grad scale tensor (input, optional)\n @param gradScale           Input grad scale tensor (input, optional)\n @param foundInfDesc        Tensor descriptor for the input found inf tensor (input, optional)\n @param foundInf            Tensor indicating presence of inf or nan in gradients. If true, skips\n                            operation and step update. (input, optional)\n @return                    miopenStatus_t*/\n    pub fn miopenTransformersAdamWWithOutput(\n        handle: miopenHandle_t,\n        paramInDesc: miopenTensorDescriptor_t,\n        paramIn: *mut ::core::ffi::c_void,\n        paramOutDesc: miopenTensorDescriptor_t,\n        paramOut: *mut ::core::ffi::c_void,\n        paramOutFloat16Desc: miopenTensorDescriptor_t,\n        paramOutFloat16: *mut ::core::ffi::c_void,\n        gradInDesc: miopenTensorDescriptor_t,\n        gradIn: *const ::core::ffi::c_void,\n        expAvgInDesc: miopenTensorDescriptor_t,\n        expAvgIn: *mut ::core::ffi::c_void,\n        expAvgOutDesc: miopenTensorDescriptor_t,\n        expAvgOut: *mut ::core::ffi::c_void,\n        expAvgSqInDesc: miopenTensorDescriptor_t,\n        expAvgSqIn: *mut ::core::ffi::c_void,\n        expAvgSqOutDesc: miopenTensorDescriptor_t,\n        expAvgSqOut: *mut ::core::ffi::c_void,\n        stateStepInDesc: miopenTensorDescriptor_t,\n        stateStepIn: *mut ::core::ffi::c_void,\n        stateStepOutDesc: miopenTensorDescriptor_t,\n        stateStepOut: *mut ::core::ffi::c_void,\n        state_step: ::core::ffi::c_uint,\n        lr: f32,\n        beta1: f32,\n        beta2: f32,\n        weight_decay: f32,\n        eps: f32,\n        step_size: f32,\n        correct_bias: bool,\n        gradScaleDesc: miopenTensorDescriptor_t,\n        gradScale: *const ::core::ffi::c_void,\n        foundInfDesc: miopenTensorDescriptor_t,\n        foundInf: *const ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" @addtogroup getitem\\n\\n  @{\\n/\\n/*! @brief Helper function to query the minimum workspace size required by the getitem call\\n\\n @param [in]   handle                  MIOpen Handle\\n @param [in]   indexCount              Number of input tensor indexs\\n @param [in]   indexDescs              Tensor descriptor of input tensor indexs\\n @param [out]  sizeInBytes             Pointer to data to return the minimum workspace size\\n @return                        miopenStatus_t\"]\n    pub fn miopenGetGetitemWorkspaceSize(\n        handle: miopenHandle_t,\n        indexCount: u32,\n        indexDescs: *const miopenTensorDescriptor_t,\n        sizeInBytes: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute a getitem backward layer\n\n Backward of getitem for tensor indexing, slicing, masking.\n\n @param [in]   handle                  MIOpen handle\n @param [in]   workspace               Address of the allocated workspace data\n @param [in]   workspaceSizeInBytes    Size in bytes of the allocated workspace data\n @param [in]   dyDesc                  Tensor descriptor of input tensor dy\n @param [in]   dy                      Source data tensor dy\n @param [in]   indexCount              Number of input tensor indexs\n @param [in]   indexDescs              Tensor descriptor of input tensor indexs(All indexs same\n size)\n @param [in]   indexs                  Source data tensor indexs\n @param [in]   dxDesc                  Tensor descriptor of output tensor dx\n @param [out]  dx                      Data tensor dx(It must be initialized to 0)\n @param [in]   errorDesc               Tensor descriptor of output tensor error\n @param [out]  error                   Data tensor error(It must be initialized to 0)\n @param [in]   dimCount                Number of dimensions\n @param [in]   dims                    Dimensions\n @param [in]   sliceCount              Number of slices\n @param [in]   slices                  Slices\n @param [in]   offset                  Offset of output tensor dx\n @return                               miopenStatus_t*/\n    pub fn miopenGetitemBackward(\n        handle: miopenHandle_t,\n        workspace: *mut ::core::ffi::c_void,\n        workspaceSizeInBytes: usize,\n        dyDesc: miopenTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        indexCount: u32,\n        indexDescs: *const miopenTensorDescriptor_t,\n        indexs: *const *const ::core::ffi::c_void,\n        dxDesc: miopenTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n        errorDesc: miopenTensorDescriptor_t,\n        error: *mut ::core::ffi::c_void,\n        dimCount: u32,\n        dims: *const i32,\n        sliceCount: u32,\n        slices: *const i32,\n        offset: u32,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" @addtogroup RotaryPositionalEmbeddings\\n\\n  @{\\n/\\n/*! @brief Execute a rope forward layer\\n\\n @param [in]   handle         MIOpen handle\\n @param [in]   xDesc          Tensor descriptor for data input tensor x\\n @param [in]   x              Data tensor x\\n @param [in]   cosDesc        Tensor descriptor for data input tensor cos\\n @param [in]   cos            Data tensor cos\\n @param [in]   sinDesc        Tensor descriptor for data input tensor sin\\n @param [in]   sin            Data tensor sin\\n @param [in]   yDesc          Tensor descriptor for output data tensor y\\n @param [out]  y              Data tensor y\\n @return                      miopenStatus_t\"]\n    pub fn miopenRoPEForward(\n        handle: miopenHandle_t,\n        xDesc: miopenTensorDescriptor_t,\n        x: *const ::core::ffi::c_void,\n        cosDesc: miopenTensorDescriptor_t,\n        cos: *const ::core::ffi::c_void,\n        sinDesc: miopenTensorDescriptor_t,\n        sin: *const ::core::ffi::c_void,\n        yDesc: miopenTensorDescriptor_t,\n        y: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute a rope backward layer\n\n @param [in]   handle         MIOpen handle\n @param [in]   dyDesc         Tensor descriptor for data input tensor dy\n @param [in]   dy             Data tensor dy\n @param [in]   cosDesc        Tensor descriptor for output data tensor cos\n @param [in]   cos            Data tensor cos\n @param [in]   sinDesc        Tensor descriptor for data input tensor sin\n @param [in]   sin            Data tensor sin\n @param [in]   dxDesc         Tensor descriptor for output data tensor dx\n @param [out]  dx             Data tensor dx\n @return                      miopenStatus_t*/\n    pub fn miopenRoPEBackward(\n        handle: miopenHandle_t,\n        dyDesc: miopenTensorDescriptor_t,\n        dy: *const ::core::ffi::c_void,\n        cosDesc: miopenTensorDescriptor_t,\n        cos: *const ::core::ffi::c_void,\n        sinDesc: miopenTensorDescriptor_t,\n        sin: *const ::core::ffi::c_void,\n        dxDesc: miopenTensorDescriptor_t,\n        dx: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute a Kthvalue forward layer\n\n @param handle                   MIOpen handle (input)\n @param inputDesc                Tensor descriptor for input tensor (input)\n @param input                    Data tensor input (input)\n @param outputDesc               Tensor descriptor for output tensor (input)\n @param output                   Data tensor output (output)\n @param indices                  Data tensor indices (output)\n @param indicesDesc              Tensor descriptor for indices tensor (input)\n @param k                        The k-th smallest element(input)\n @param dim                      The dimension to find the kth value along (Default = -1)(input)\n @param keepDim                  Whether the output tensor has dim retained or not (Default =\n false)(input)\n @return                         miopenStatus_t*/\n    pub fn miopenKthvalueForward(\n        handle: miopenHandle_t,\n        inputDesc: miopenTensorDescriptor_t,\n        input: *const ::core::ffi::c_void,\n        outputDesc: miopenTensorDescriptor_t,\n        output: *mut ::core::ffi::c_void,\n        indicesDesc: miopenTensorDescriptor_t,\n        indices: *mut usize,\n        k: usize,\n        dim: i32,\n        keepDim: bool,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Helper function to query the minimum workspace size required by the PReLU backward call\n\n @param handle                   MIOpen Handle (input)\n @param inputDesc                Tensor descriptor for input tensor (input)\n @param weightDesc               Tensor descriptor for weight tensor (input)\n @param sizeInBytes              Pointer to data to return the minimum workspace size\n @return                         miopenStatus_t*/\n    pub fn miopenGetPReLUBackwardWorkspaceSize(\n        handle: miopenHandle_t,\n        inputDesc: miopenTensorDescriptor_t,\n        weightDesc: miopenTensorDescriptor_t,\n        sizeInBytes: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute a PReLU backward layer\n\n @param handle                   MIOpen handle (input)\n @param workspace                Address of the allocated workspace data (input)\n @param workspaceSizeInBytes     Size in bytes of the allocated workspace data (input)\n @param inputDesc                Tensor descriptor for input tensor (input)\n @param input                    Data tensor input (input)\n @param weightDesc               Tensor descriptor for weight tensor (input)\n @param weight                   Data tensor weight (input)\n @param doutputDesc              Tensor descriptor for output gradient (input)\n @param doutput                  Gradient of output (input)\n @param dinputDesc               Tensor descriptor for input gradient (input)\n @param dinput                   Gradient of input (output)\n @param dweightDesc              Tensor descriptor for weight gradient (input)\n @param dweight                  Gradient of weight (output)*/\n    pub fn miopenPReLUBackward(\n        handle: miopenHandle_t,\n        workspace: *mut ::core::ffi::c_void,\n        workspaceSizeInBytes: usize,\n        inputDesc: miopenTensorDescriptor_t,\n        input: *const ::core::ffi::c_void,\n        weightDesc: miopenTensorDescriptor_t,\n        weight: *const ::core::ffi::c_void,\n        doutputDesc: miopenTensorDescriptor_t,\n        doutput: *const ::core::ffi::c_void,\n        dinputDesc: miopenTensorDescriptor_t,\n        dinput: *mut ::core::ffi::c_void,\n        dweightDesc: miopenTensorDescriptor_t,\n        dweight: *mut ::core::ffi::c_void,\n    ) -> miopenStatus_t;\n}\nimpl miopenLossReductionMode_t {\n    ///< output tensor elements are not reduced\n    pub const MIOPEN_LOSS_REDUCTION_NONE: miopenLossReductionMode_t = miopenLossReductionMode_t(\n        0,\n    );\n}\nimpl miopenLossReductionMode_t {\n    ///< output tensor elements are summed up\n    pub const MIOPEN_LOSS_REDUCTION_SUM: miopenLossReductionMode_t = miopenLossReductionMode_t(\n        1,\n    );\n}\nimpl miopenLossReductionMode_t {\n    /**< output tensor elements are summed up and divided with total\nnumber of elements to get mean value*/\n    pub const MIOPEN_LOSS_REDUCTION_MEAN: miopenLossReductionMode_t = miopenLossReductionMode_t(\n        2,\n    );\n}\n#[repr(transparent)]\n/** @ingroup LossFunction\n @enum miopenLossReductionMode_t\n Reduction mode for loss function*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct miopenLossReductionMode_t(pub ::core::ffi::c_uint);\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Helper function to query the minimum workspace size required by the\nSoftMarginLossForward call\n\n @param [in]  handle              MIOpen Handle\n @param [in]  inputDesc           Tensor descriptor for input tensor\n @param [in]  targetDesc          Tensor descriptor for target tensor\n @param [in]  outputDesc          Tensor descriptor for output tensor\n  @param [in]  reduction           Reduction mode (sum, mean). For none reduction we don't need to\nuse this function\n @param [out] sizeInBytes         Pointer to data to return the minimum workspace size\n @return                          miopenStatus_t*/\n    pub fn miopenGetSoftMarginLossForwardWorkspaceSize(\n        handle: miopenHandle_t,\n        inputDesc: miopenTensorDescriptor_t,\n        targetDesc: miopenTensorDescriptor_t,\n        outputDesc: miopenTensorDescriptor_t,\n        reduction: miopenLossReductionMode_t,\n        sizeInBytes: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute a SoftMarginLoss forward layer\n\n @param [in]  handle                  MIOpen handle\n @param [in]  inputDesc               Tensor descriptor for input tensor\n @param [in]  input                   Data tensor input\n @param [in]  targetDesc              Tensor descriptor for target tensor\n @param [in]  target                  Data tensor target\n @param [in]  outputDesc              Tensor descriptor for output tensor\n @param [out] output                  Data tensor output\n @param [in]  reduction               Reduction mode. If reduction mode is mean or sum, you must\n provide param workspace and workspaceSizeInBytes. Call\n miopenGetSoftMarginLossForwardWorkspaceSize to get workspaceSizeInBytes\n @param [in]  workspace               Address of the allocated workspace data (Default = null)\n @param [in]  workspaceSizeInBytes    Size in bytes of the allocated workspace data (Default = 0)\n @return                              miopenStatus_t*/\n    pub fn miopenSoftMarginLossForward(\n        handle: miopenHandle_t,\n        inputDesc: miopenTensorDescriptor_t,\n        input: *const ::core::ffi::c_void,\n        targetDesc: miopenTensorDescriptor_t,\n        target: *const ::core::ffi::c_void,\n        outputDesc: miopenTensorDescriptor_t,\n        output: *mut ::core::ffi::c_void,\n        reduction: miopenLossReductionMode_t,\n        workspace: *mut ::core::ffi::c_void,\n        workspaceSizeInBytes: usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute a SoftMarginLoss backward layer\n\n @param [in]  handle                  MIOpen handle\n @param [in]  inputDesc               Tensor descriptor for input tensor\n @param [in]  input                   Data tensor input\n @param [in]  targetDesc              Tensor descriptor for target tensor\n @param [in]  target                  Data tensor target\n @param [in]  doutputDesc             Tensor descriptor for output gradient\n @param [in]  doutput                 Output gradient\n @param [in]  dinputDesc              Tensor descriptor for input gradient\n @param [out] dinput                  Input gradient\n @param [in]  reduction               Reduction mode (none, sum, mean)\n @return                              miopenStatus_t*/\n    pub fn miopenSoftMarginLossBackward(\n        handle: miopenHandle_t,\n        inputDesc: miopenTensorDescriptor_t,\n        input: *const ::core::ffi::c_void,\n        targetDesc: miopenTensorDescriptor_t,\n        target: *const ::core::ffi::c_void,\n        doutputDesc: miopenTensorDescriptor_t,\n        doutput: *const ::core::ffi::c_void,\n        dinputDesc: miopenTensorDescriptor_t,\n        dinput: *mut ::core::ffi::c_void,\n        reduction: miopenLossReductionMode_t,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Helper function to query the minimum workspace size required by the\nMultiMarginLossForward call\n\n @param [in]  handle              MIOpen Handle\n @param [in]  inputDesc           Tensor descriptor for input tensor (N, C) where N is the batch\nsize and C is the number of classes\n @param [in]  targetDesc          Tensor descriptor for target tensor, must have shape (N). Each\nvalue is between 0 and C - 1\n @param [in]  weightDesc          Tensor descriptor for weight tensor. It is a manual rescaling\nweight given to each class. It has to be a Tensor of size C\n @param [in]  outputDesc          Tensor descriptor for output tensor. If reduction is 'none,\nthen it must have shape (N). Otherwise, it is a scalar\n @param [in]  p                   Has a default value of 1. The only supported values are 1 and 2\n @param [in]  margin              Has a default value of 1\n @param [in]  reduction           Reduction mode (sum, mean)\n @param [out] sizeInBytes         Pointer to data to return the minimum workspace size\n @return                          miopenStatus_t*/\n    pub fn miopenGetMultiMarginLossForwardWorkspaceSize(\n        handle: miopenHandle_t,\n        inputDesc: miopenTensorDescriptor_t,\n        targetDesc: miopenTensorDescriptor_t,\n        weightDesc: miopenTensorDescriptor_t,\n        outputDesc: miopenTensorDescriptor_t,\n        p: ::core::ffi::c_long,\n        margin: f32,\n        reduction: miopenLossReductionMode_t,\n        sizeInBytes: *mut usize,\n    ) -> miopenStatus_t;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @brief Execute a MultiMarginLoss forward layer\n\n @param [in]  handle                  MIOpen handle\n @param [in]  inputDesc               Tensor descriptor for input tensor (N, C) where N is the\nbatch size and C is the number of classes.\n @param [in]  input                   Data tensor input\n @param [in]  targetDesc              Tensor descriptor for target tensor, must have shape (N).\nEach value is between 0 and C - 1\n @param [in]  target                  Data tensor target\n @param [in]  weightDesc              Tensor descriptor for weight tensor. It is a manual\nrescaling weight given to each class. It has to be a Tensor of size C\n @param [in]  weight                  Data tensor weight\n @param [in]  outputDesc              Tensor descriptor for output tensor. If reduction is 'none,\nthen it must have shape (N). Otherwise, it is a scalar.\n @param [out] output                  Data tensor output\n @param [in]  p                       Has a default value of 1. The only supported values are 1\nand 2\n @param [in]  margin                  Has a default value of 1\n @param [in]  reduction               Reduction mode. If reduction mode is mean or sum, you must\n provide param workspace and workspaceSizeInBytes. Call\n miopenGetMultiMarginLossForwardWorkspaceSize to get workspaceSizeInBytes\n @param [in]  workspace               Address of the allocated workspace data. Set = nullptr if\nreduction = 'none'\n @param [in]  workspaceSizeInBytes    Size in bytes of the allocated workspace data. Set = 0 if\nreduction = 'none\n @return                              miopenStatus_t*/\n    pub fn miopenMultiMarginLossForward(\n        handle: miopenHandle_t,\n        inputDesc: miopenTensorDescriptor_t,\n        input: *const ::core::ffi::c_void,\n        targetDesc: miopenTensorDescriptor_t,\n        target: *const ::core::ffi::c_void,\n        weightDesc: miopenTensorDescriptor_t,\n        weight: *const ::core::ffi::c_void,\n        outputDesc: miopenTensorDescriptor_t,\n        output: *mut ::core::ffi::c_void,\n        p: ::core::ffi::c_long,\n        margin: f32,\n        reduction: miopenLossReductionMode_t,\n        workspace: *mut ::core::ffi::c_void,\n        workspaceSizeInBytes: usize,\n    ) -> miopenStatus_t;\n}\nimpl miopenError_t {\n    pub const r#NotInitialized: miopenError_t = miopenError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(1)\n    });\n    pub const r#InvalidValue: miopenError_t = miopenError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(2)\n    });\n    pub const r#BadParm: miopenError_t = miopenError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3)\n    });\n    pub const r#AllocFailed: miopenError_t = miopenError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(4)\n    });\n    pub const r#InternalError: miopenError_t = miopenError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(5)\n    });\n    pub const r#NotImplemented: miopenError_t = miopenError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(6)\n    });\n    pub const r#UnknownError: miopenError_t = miopenError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(7)\n    });\n    pub const r#UnsupportedOp: miopenError_t = miopenError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(8)\n    });\n    pub const r#GpuOperationsSkipped: miopenError_t = miopenError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(9)\n    });\n    pub const r#VersionMismatch: miopenError_t = miopenError_t(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(10)\n    });\n}\n#[repr(transparent)]\n#[derive(Debug, Hash, Copy, Clone, PartialEq, Eq)]\npub struct miopenError_t(pub ::core::num::NonZeroU32);\npub trait miopenStatus_tConsts {\n    const Success: miopenStatus_t = miopenStatus_t::Ok(());\n    const ErrorNotInitialized: miopenStatus_t = miopenStatus_t::Err(\n        miopenError_t::r#NotInitialized,\n    );\n    const ErrorInvalidValue: miopenStatus_t = miopenStatus_t::Err(\n        miopenError_t::r#InvalidValue,\n    );\n    const ErrorBadParm: miopenStatus_t = miopenStatus_t::Err(miopenError_t::r#BadParm);\n    const ErrorAllocFailed: miopenStatus_t = miopenStatus_t::Err(\n        miopenError_t::r#AllocFailed,\n    );\n    const ErrorInternalError: miopenStatus_t = miopenStatus_t::Err(\n        miopenError_t::r#InternalError,\n    );\n    const ErrorNotImplemented: miopenStatus_t = miopenStatus_t::Err(\n        miopenError_t::r#NotImplemented,\n    );\n    const ErrorUnknownError: miopenStatus_t = miopenStatus_t::Err(\n        miopenError_t::r#UnknownError,\n    );\n    const ErrorUnsupportedOp: miopenStatus_t = miopenStatus_t::Err(\n        miopenError_t::r#UnsupportedOp,\n    );\n    const ErrorGpuOperationsSkipped: miopenStatus_t = miopenStatus_t::Err(\n        miopenError_t::r#GpuOperationsSkipped,\n    );\n    const ErrorVersionMismatch: miopenStatus_t = miopenStatus_t::Err(\n        miopenError_t::r#VersionMismatch,\n    );\n}\nimpl miopenStatus_tConsts for miopenStatus_t {}\n#[must_use]\npub type miopenStatus_t = ::core::result::Result<(), miopenError_t>;\nconst _: fn() = || {\n    let _ = std::mem::transmute::<miopenStatus_t, u32>;\n};\nunsafe impl Send for miopenHandle_t {}\nunsafe impl Sync for miopenHandle_t {}\nunsafe impl Send for miopenFusionOpDescriptor_t {}\nunsafe impl Sync for miopenFusionOpDescriptor_t {}\nunsafe impl Send for miopenTensorDescriptor_t {}\nunsafe impl Sync for miopenTensorDescriptor_t {}\nunsafe impl Send for miopenSeqTensorDescriptor_t {}\nunsafe impl Sync for miopenSeqTensorDescriptor_t {}\nunsafe impl Send for miopenConvolutionDescriptor_t {}\nunsafe impl Sync for miopenConvolutionDescriptor_t {}\nunsafe impl Send for miopenPoolingDescriptor_t {}\nunsafe impl Sync for miopenPoolingDescriptor_t {}\nunsafe impl Send for miopenLRNDescriptor_t {}\nunsafe impl Sync for miopenLRNDescriptor_t {}\nunsafe impl Send for miopenActivationDescriptor_t {}\nunsafe impl Sync for miopenActivationDescriptor_t {}\nunsafe impl Send for miopenRNNDescriptor_t {}\nunsafe impl Sync for miopenRNNDescriptor_t {}\nunsafe impl Send for miopenCTCLossDescriptor_t {}\nunsafe impl Sync for miopenCTCLossDescriptor_t {}\nunsafe impl Send for miopenDropoutDescriptor_t {}\nunsafe impl Sync for miopenDropoutDescriptor_t {}\nunsafe impl Send for miopenReduceTensorDescriptor_t {}\nunsafe impl Sync for miopenReduceTensorDescriptor_t {}\nunsafe impl Send for miopenMhaDescriptor_t {}\nunsafe impl Sync for miopenMhaDescriptor_t {}\nunsafe impl Send for miopenSoftmaxDescriptor_t {}\nunsafe impl Sync for miopenSoftmaxDescriptor_t {}\nunsafe impl Send for miopenFusionPlanDescriptor_t {}\nunsafe impl Sync for miopenFusionPlanDescriptor_t {}\nunsafe impl Send for miopenOperatorDescriptor_t {}\nunsafe impl Sync for miopenOperatorDescriptor_t {}\nunsafe impl Send for miopenOperatorArgs_t {}\nunsafe impl Sync for miopenOperatorArgs_t {}\nunsafe impl Send for miopenProblem_t {}\nunsafe impl Sync for miopenProblem_t {}\nunsafe impl Send for miopenFindOptions_t {}\nunsafe impl Sync for miopenFindOptions_t {}\nunsafe impl Send for miopenSolution_t {}\nunsafe impl Sync for miopenSolution_t {}\n"
  },
  {
    "path": "ext/rocblas-sys/.rustfmt.toml",
    "content": "disable_all_formatting = true\n"
  },
  {
    "path": "ext/rocblas-sys/Cargo.toml",
    "content": "[package]\nname = \"rocblas-sys\"\nversion = \"0.1.0\"\nauthors = [\"Violet <c01368481@gmail.com>\"]\nedition = \"2021\"\n\n[lib]\n\n[dependencies]\nhip_runtime-sys = { version = \"0.0.0\", path = \"../hip_runtime-sys\" }\n"
  },
  {
    "path": "ext/rocblas-sys/build.rs",
    "content": "use std::env::VarError;\n\nfn main() -> Result<(), VarError> {\n    if !cfg!(windows) {\n        println!(\"cargo:rustc-link-lib=dylib=rocblas\");\n        println!(\"cargo:rustc-link-search=native=/opt/rocm/lib/\");\n    }\n    Ok(())\n}\n"
  },
  {
    "path": "ext/rocblas-sys/src/lib.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\n/// \\brief Struct to represent a 16 bit Brain floating-point number.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocblas_bfloat16 {\n    pub data: u16,\n}\n/// \\brief Struct to represent a 8 bit floating-point number.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocblas_f8 {\n    pub data: u8,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocblas_bf8 {\n    pub data: u8,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct _rocblas_handle {\n    _unused: [u8; 0],\n}\n/** \\brief rocblas_handle is a structure holding the rocblas library context.\n It must be initialized using rocblas_create_handle(),\n and the returned handle must be passed\n to all subsequent library function calls.\n It should be destroyed at the end using rocblas_destroy_handle().*/\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocblas_handle(pub *mut _rocblas_handle);\n/// \\brief Opaque base class for device memory allocation\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct rocblas_device_malloc_base {\n    _unused: [u8; 0],\n}\npub type rocblas_int = i32;\n/// \\brief Stride between matrices or vectors in strided_batched functions\npub type rocblas_stride = i64;\n/// \\brief Single precision floating point type\npub type rocblas_float = f32;\n/// \\brief Double precision floating point type\npub type rocblas_double = f64;\n/// \\brief Structure definition for rocblas_half\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocblas_half {\n    pub data: u16,\n}\n/// \\brief Struct to represent a complex number with single precision real and imaginary parts.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, PartialEq)]\npub struct rocblas_float_complex {\n    pub x: f32,\n    pub y: f32,\n}\n/// \\brief Struct to represent a complex number with double precision real and imaginary parts.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, PartialEq)]\npub struct rocblas_double_complex {\n    pub x: f64,\n    pub y: f64,\n}\nimpl rocblas_operation_ {\n    ///< Operate with the matrix.\n    pub const rocblas_operation_none: rocblas_operation_ = rocblas_operation_(111);\n}\nimpl rocblas_operation_ {\n    ///< Operate with the transpose of the matrix.\n    pub const rocblas_operation_transpose: rocblas_operation_ = rocblas_operation_(112);\n}\nimpl rocblas_operation_ {\n    pub const rocblas_operation_conjugate_transpose: rocblas_operation_ = rocblas_operation_(\n        113,\n    );\n}\n#[repr(transparent)]\n/// \\brief Used to specify whether the matrix is to be transposed or not.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocblas_operation_(pub ::core::ffi::c_uint);\n/// \\brief Used to specify whether the matrix is to be transposed or not.\npub use self::rocblas_operation_ as rocblas_operation;\nimpl rocblas_fill_ {\n    ///< Upper triangle.\n    pub const rocblas_fill_upper: rocblas_fill_ = rocblas_fill_(121);\n}\nimpl rocblas_fill_ {\n    ///< Lower triangle.\n    pub const rocblas_fill_lower: rocblas_fill_ = rocblas_fill_(122);\n}\nimpl rocblas_fill_ {\n    pub const rocblas_fill_full: rocblas_fill_ = rocblas_fill_(123);\n}\n#[repr(transparent)]\n/** \\brief Used by the Hermitian, symmetric and triangular matrix\n routines to specify whether the upper, or lower triangle is being referenced.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocblas_fill_(pub ::core::ffi::c_uint);\n/** \\brief Used by the Hermitian, symmetric and triangular matrix\n routines to specify whether the upper, or lower triangle is being referenced.*/\npub use self::rocblas_fill_ as rocblas_fill;\nimpl rocblas_diagonal_ {\n    ///< Non-unit triangular.\n    pub const rocblas_diagonal_non_unit: rocblas_diagonal_ = rocblas_diagonal_(131);\n}\nimpl rocblas_diagonal_ {\n    ///< Unit triangular.\n    pub const rocblas_diagonal_unit: rocblas_diagonal_ = rocblas_diagonal_(132);\n}\n#[repr(transparent)]\n/** \\brief It is used by the triangular matrix routines to specify whether the\n matrix is unit triangular.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocblas_diagonal_(pub ::core::ffi::c_uint);\n/** \\brief It is used by the triangular matrix routines to specify whether the\n matrix is unit triangular.*/\npub use self::rocblas_diagonal_ as rocblas_diagonal;\nimpl rocblas_side_ {\n    /**< Multiply general matrix by symmetric,\nHermitian, or triangular matrix on the left.*/\n    pub const rocblas_side_left: rocblas_side_ = rocblas_side_(141);\n}\nimpl rocblas_side_ {\n    /**< Multiply general matrix by symmetric,\nHermitian, or triangular matrix on the right.*/\n    pub const rocblas_side_right: rocblas_side_ = rocblas_side_(142);\n}\nimpl rocblas_side_ {\n    pub const rocblas_side_both: rocblas_side_ = rocblas_side_(143);\n}\n#[repr(transparent)]\n/// \\brief Indicates the side matrix A is located relative to matrix B during multiplication.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocblas_side_(pub ::core::ffi::c_uint);\n/// \\brief Indicates the side matrix A is located relative to matrix B during multiplication.\npub use self::rocblas_side_ as rocblas_side;\nimpl rocblas_datatype_ {\n    ///< 16-bit floating point, real\n    pub const rocblas_datatype_f16_r: rocblas_datatype_ = rocblas_datatype_(150);\n}\nimpl rocblas_datatype_ {\n    ///< 32-bit floating point, real\n    pub const rocblas_datatype_f32_r: rocblas_datatype_ = rocblas_datatype_(151);\n}\nimpl rocblas_datatype_ {\n    ///< 64-bit floating point, real\n    pub const rocblas_datatype_f64_r: rocblas_datatype_ = rocblas_datatype_(152);\n}\nimpl rocblas_datatype_ {\n    ///< 16-bit floating point, complex\n    pub const rocblas_datatype_f16_c: rocblas_datatype_ = rocblas_datatype_(153);\n}\nimpl rocblas_datatype_ {\n    ///< 32-bit floating point, complex\n    pub const rocblas_datatype_f32_c: rocblas_datatype_ = rocblas_datatype_(154);\n}\nimpl rocblas_datatype_ {\n    ///< 64-bit floating point, complex\n    pub const rocblas_datatype_f64_c: rocblas_datatype_ = rocblas_datatype_(155);\n}\nimpl rocblas_datatype_ {\n    ///<  8-bit signed integer, real\n    pub const rocblas_datatype_i8_r: rocblas_datatype_ = rocblas_datatype_(160);\n}\nimpl rocblas_datatype_ {\n    ///<  8-bit unsigned integer, real\n    pub const rocblas_datatype_u8_r: rocblas_datatype_ = rocblas_datatype_(161);\n}\nimpl rocblas_datatype_ {\n    ///< 32-bit signed integer, real\n    pub const rocblas_datatype_i32_r: rocblas_datatype_ = rocblas_datatype_(162);\n}\nimpl rocblas_datatype_ {\n    ///< 32-bit unsigned integer, real\n    pub const rocblas_datatype_u32_r: rocblas_datatype_ = rocblas_datatype_(163);\n}\nimpl rocblas_datatype_ {\n    ///<  8-bit signed integer, complex\n    pub const rocblas_datatype_i8_c: rocblas_datatype_ = rocblas_datatype_(164);\n}\nimpl rocblas_datatype_ {\n    ///<  8-bit unsigned integer, complex\n    pub const rocblas_datatype_u8_c: rocblas_datatype_ = rocblas_datatype_(165);\n}\nimpl rocblas_datatype_ {\n    ///< 32-bit signed integer, complex\n    pub const rocblas_datatype_i32_c: rocblas_datatype_ = rocblas_datatype_(166);\n}\nimpl rocblas_datatype_ {\n    ///< 32-bit unsigned integer, complex\n    pub const rocblas_datatype_u32_c: rocblas_datatype_ = rocblas_datatype_(167);\n}\nimpl rocblas_datatype_ {\n    ///< 16-bit bfloat, real\n    pub const rocblas_datatype_bf16_r: rocblas_datatype_ = rocblas_datatype_(168);\n}\nimpl rocblas_datatype_ {\n    ///< 16-bit bfloat, complex\n    pub const rocblas_datatype_bf16_c: rocblas_datatype_ = rocblas_datatype_(169);\n}\nimpl rocblas_datatype_ {\n    ///< 8 bit floating point, real\n    pub const rocblas_datatype_f8_r: rocblas_datatype_ = rocblas_datatype_(170);\n}\nimpl rocblas_datatype_ {\n    ///< 8 bit bfloat, real\n    pub const rocblas_datatype_bf8_r: rocblas_datatype_ = rocblas_datatype_(171);\n}\nimpl rocblas_datatype_ {\n    ///< Invalid datatype value, do not use\n    pub const rocblas_datatype_invalid: rocblas_datatype_ = rocblas_datatype_(255);\n}\n#[repr(transparent)]\n/// \\brief Indicates the precision width of data stored in a blas type.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocblas_datatype_(pub ::core::ffi::c_uint);\n/// \\brief Indicates the precision width of data stored in a blas type.\npub use self::rocblas_datatype_ as rocblas_datatype;\nimpl rocblas_computetype_ {\n    pub const rocblas_compute_type_f32: rocblas_computetype_ = rocblas_computetype_(300);\n}\nimpl rocblas_computetype_ {\n    pub const rocblas_compute_type_f8_f8_f32: rocblas_computetype_ = rocblas_computetype_(\n        301,\n    );\n}\nimpl rocblas_computetype_ {\n    pub const rocblas_compute_type_f8_bf8_f32: rocblas_computetype_ = rocblas_computetype_(\n        302,\n    );\n}\nimpl rocblas_computetype_ {\n    pub const rocblas_compute_type_bf8_f8_f32: rocblas_computetype_ = rocblas_computetype_(\n        303,\n    );\n}\nimpl rocblas_computetype_ {\n    pub const rocblas_compute_type_bf8_bf8_f32: rocblas_computetype_ = rocblas_computetype_(\n        304,\n    );\n}\nimpl rocblas_computetype_ {\n    ///< Invalid datatype value, do not use\n    pub const rocblas_compute_type_invalid: rocblas_computetype_ = rocblas_computetype_(\n        455,\n    );\n}\n#[repr(transparent)]\n/// \\brief Indicates the compute precision mode.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocblas_computetype_(pub ::core::ffi::c_uint);\n/// \\brief Indicates the compute precision mode.\npub use self::rocblas_computetype_ as rocblas_computetype;\nimpl rocblas_pointer_mode_ {\n    /// \\brief Scalar values affected by this variable are located on the host.\n    pub const rocblas_pointer_mode_host: rocblas_pointer_mode_ = rocblas_pointer_mode_(\n        0,\n    );\n}\nimpl rocblas_pointer_mode_ {\n    /// \\brief Scalar values affected by this variable are located on the device.\n    pub const rocblas_pointer_mode_device: rocblas_pointer_mode_ = rocblas_pointer_mode_(\n        1,\n    );\n}\n#[repr(transparent)]\n/** \\brief Indicates if scalar pointers are on host or device. This is used for\n    scalars alpha and beta and for scalar function return values.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocblas_pointer_mode_(pub ::core::ffi::c_uint);\n/** \\brief Indicates if scalar pointers are on host or device. This is used for\n    scalars alpha and beta and for scalar function return values.*/\npub use self::rocblas_pointer_mode_ as rocblas_pointer_mode;\nimpl rocblas_atomics_mode_ {\n    /// \\brief Algorithms will refrain from atomics where applicable\n    pub const rocblas_atomics_not_allowed: rocblas_atomics_mode_ = rocblas_atomics_mode_(\n        0,\n    );\n}\nimpl rocblas_atomics_mode_ {\n    /// \\brief Algorithms will take advantage of atomics where applicable\n    pub const rocblas_atomics_allowed: rocblas_atomics_mode_ = rocblas_atomics_mode_(1);\n}\n#[repr(transparent)]\n/** \\brief Indicates if atomics operations are allowed. Not allowing atomic operations\n    may generally improve determinism and repeatability of results at a cost of performance.\n    Defaults to rocblas_atomics_allowed.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocblas_atomics_mode_(pub ::core::ffi::c_uint);\n/** \\brief Indicates if atomics operations are allowed. Not allowing atomic operations\n    may generally improve determinism and repeatability of results at a cost of performance.\n    Defaults to rocblas_atomics_allowed.*/\npub use self::rocblas_atomics_mode_ as rocblas_atomics_mode;\nimpl rocblas_performance_metric_ {\n    /// \\brief Use Tensile's default performance metric for solution selection\n    pub const rocblas_default_performance_metric: rocblas_performance_metric_ = rocblas_performance_metric_(\n        0,\n    );\n}\nimpl rocblas_performance_metric_ {\n    /// \\brief Select the solution with the highest GFlops across all compute units\n    pub const rocblas_device_efficiency_performance_metric: rocblas_performance_metric_ = rocblas_performance_metric_(\n        1,\n    );\n}\nimpl rocblas_performance_metric_ {\n    /** \\brief Select the solution with the highest GFlops per compute unit it uses. This\n may be useful when running multiple small gemm problems simultaneously*/\n    pub const rocblas_cu_efficiency_performance_metric: rocblas_performance_metric_ = rocblas_performance_metric_(\n        2,\n    );\n}\n#[repr(transparent)]\n/** \\brief Indicates which performance metric Tensile uses when selecting the optimal\n    solution for gemm problems.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocblas_performance_metric_(pub ::core::ffi::c_uint);\n/** \\brief Indicates which performance metric Tensile uses when selecting the optimal\n    solution for gemm problems.*/\npub use self::rocblas_performance_metric_ as rocblas_performance_metric;\nimpl rocblas_layer_mode_ {\n    /// \\brief No logging will take place.\n    pub const rocblas_layer_mode_none: rocblas_layer_mode_ = rocblas_layer_mode_(0);\n}\nimpl rocblas_layer_mode_ {\n    /// \\brief A line containing the function name and value of arguments passed will be printed with each rocBLAS function call.\n    pub const rocblas_layer_mode_log_trace: rocblas_layer_mode_ = rocblas_layer_mode_(1);\n}\nimpl rocblas_layer_mode_ {\n    /// \\brief Outputs a line each time a rocBLAS function is called, this line can be used with rocblas-bench to make the same call again.\n    pub const rocblas_layer_mode_log_bench: rocblas_layer_mode_ = rocblas_layer_mode_(2);\n}\nimpl rocblas_layer_mode_ {\n    /// \\brief Outputs a YAML description of each rocBLAS function called, along with its arguments and number of times it was called.\n    pub const rocblas_layer_mode_log_profile: rocblas_layer_mode_ = rocblas_layer_mode_(\n        4,\n    );\n}\n#[repr(transparent)]\n/// \\brief Indicates if layer is active with bitmask\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocblas_layer_mode_(pub ::core::ffi::c_uint);\n/// \\brief Indicates if layer is active with bitmask\npub use self::rocblas_layer_mode_ as rocblas_layer_mode;\nimpl rocblas_gemm_algo_ {\n    pub const rocblas_gemm_algo_standard: rocblas_gemm_algo_ = rocblas_gemm_algo_(0);\n}\nimpl rocblas_gemm_algo_ {\n    pub const rocblas_gemm_algo_solution_index: rocblas_gemm_algo_ = rocblas_gemm_algo_(\n        1,\n    );\n}\n#[repr(transparent)]\n/// \\brief Indicates if layer is active with bitmask\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocblas_gemm_algo_(pub ::core::ffi::c_uint);\n/// \\brief Indicates if layer is active with bitmask\npub use self::rocblas_gemm_algo_ as rocblas_gemm_algo;\nimpl rocblas_geam_ex_operation_ {\n    pub const rocblas_geam_ex_operation_min_plus: rocblas_geam_ex_operation_ = rocblas_geam_ex_operation_(\n        0,\n    );\n}\nimpl rocblas_geam_ex_operation_ {\n    pub const rocblas_geam_ex_operation_plus_min: rocblas_geam_ex_operation_ = rocblas_geam_ex_operation_(\n        1,\n    );\n}\n#[repr(transparent)]\n/// \\brief Which mathematical geam-like operation to perform for geam_ex\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocblas_geam_ex_operation_(pub ::core::ffi::c_uint);\n/// \\brief Which mathematical geam-like operation to perform for geam_ex\npub use self::rocblas_geam_ex_operation_ as rocblas_geam_ex_operation;\nimpl rocblas_gemm_flags_ {\n    /// \\brief Default empty flags\n    pub const rocblas_gemm_flags_none: rocblas_gemm_flags_ = rocblas_gemm_flags_(0);\n}\nimpl rocblas_gemm_flags_ {\n    #[doc = \" \\\\brief Before ROCm 6.0 rocblas_gemm_flags_pack_int8x4 = 0x1, as has now been removed so is available for future use */\\n/*! \\\\brief Select the gemm problem with the highest efficiency per compute unit used. Useful for running multiple smaller problems\\n simultaneously. This takes precedence over the performance metric set in rocblas_handle and currently only works for\\n gemm_*_ex problems.\"]\n    pub const rocblas_gemm_flags_use_cu_efficiency: rocblas_gemm_flags_ = rocblas_gemm_flags_(\n        2,\n    );\n}\nimpl rocblas_gemm_flags_ {\n    /** \\brief Select an alternate implementation for the MI200 FP16 HPA\n (High Precision Accumulate) GEMM kernel utilizing the BF16 matrix\n instructions with reduced accuracy in cases where computation cannot\n tolerate the FP16 matrix instructions flushing subnormal FP16\n input/output data to zero. See the \"MI200 (gfx90a) Considerations\"\n section for more details.*/\n    pub const rocblas_gemm_flags_fp16_alt_impl: rocblas_gemm_flags_ = rocblas_gemm_flags_(\n        4,\n    );\n}\nimpl rocblas_gemm_flags_ {\n    /** \\brief Select an alternate implementation for the MI200 FP16 HPA\n (High Precision Accumulate) GEMM kernel utilizing the BF16 matrix\n instructions with reduced accuracy in cases where computation cannot\n tolerate the FP16 matrix instructions flushing subnormal FP16\n input/output data to zero. See the \"MI200 (gfx90a) Considerations\"\n section for more details.*/\n    pub const rocblas_gemm_flags_check_solution_index: rocblas_gemm_flags_ = rocblas_gemm_flags_(\n        8,\n    );\n}\nimpl rocblas_gemm_flags_ {\n    /** \\brief Select an alternate implementation for the MI200 FP16 HPA\n (High Precision Accumulate) GEMM kernel utilizing the BF16 matrix\n instructions with reduced accuracy in cases where computation cannot\n tolerate the FP16 matrix instructions flushing subnormal FP16\n input/output data to zero. See the \"MI200 (gfx90a) Considerations\"\n section for more details.*/\n    pub const rocblas_gemm_flags_fp16_alt_impl_rnz: rocblas_gemm_flags_ = rocblas_gemm_flags_(\n        16,\n    );\n}\nimpl rocblas_gemm_flags_ {\n    /** \\brief Select an alternate implementation for the MI200 FP16 HPA\n (High Precision Accumulate) GEMM kernel utilizing the BF16 matrix\n instructions with reduced accuracy in cases where computation cannot\n tolerate the FP16 matrix instructions flushing subnormal FP16\n input/output data to zero. See the \"MI200 (gfx90a) Considerations\"\n section for more details.*/\n    pub const rocblas_gemm_flags_stochastic_rounding: rocblas_gemm_flags_ = rocblas_gemm_flags_(\n        32,\n    );\n}\n#[repr(transparent)]\n/// \\brief Control flags passed into gemm algorithms invoked by Tensile Host\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocblas_gemm_flags_(pub ::core::ffi::c_uint);\n/// \\brief Control flags passed into gemm algorithms invoked by Tensile Host\npub use self::rocblas_gemm_flags_ as rocblas_gemm_flags;\n/// \\brief Union for representing scalar values\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union rocblas_union_u {\n    pub h: rocblas_half,\n    pub s: f32,\n    pub d: f64,\n    pub i: i32,\n    pub c: rocblas_float_complex,\n    pub z: rocblas_double_complex,\n}\n/// \\brief Union for representing scalar values\npub type rocblas_union_t = rocblas_union_u;\nimpl rocblas_check_numerics_mode_ {\n    pub const rocblas_check_numerics_mode_no_check: rocblas_check_numerics_mode_ = rocblas_check_numerics_mode_(\n        0,\n    );\n}\nimpl rocblas_check_numerics_mode_ {\n    pub const rocblas_check_numerics_mode_info: rocblas_check_numerics_mode_ = rocblas_check_numerics_mode_(\n        1,\n    );\n}\nimpl rocblas_check_numerics_mode_ {\n    pub const rocblas_check_numerics_mode_warn: rocblas_check_numerics_mode_ = rocblas_check_numerics_mode_(\n        2,\n    );\n}\nimpl rocblas_check_numerics_mode_ {\n    pub const rocblas_check_numerics_mode_fail: rocblas_check_numerics_mode_ = rocblas_check_numerics_mode_(\n        4,\n    );\n}\nimpl rocblas_check_numerics_mode_ {\n    pub const rocblas_check_numerics_mode_only_nan_inf: rocblas_check_numerics_mode_ = rocblas_check_numerics_mode_(\n        8,\n    );\n}\n#[repr(transparent)]\n/// \\brief Numerical checking for verifying the Input and Output vector/matrix of the rocBLAS functions for a NaN, zero, infinity and denormal value\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocblas_check_numerics_mode_(pub ::core::ffi::c_uint);\n/// \\brief Numerical checking for verifying the Input and Output vector/matrix of the rocBLAS functions for a NaN, zero, infinity and denormal value\npub use self::rocblas_check_numerics_mode_ as rocblas_check_numerics_mode;\nimpl rocblas_math_mode_ {\n    pub const rocblas_default_math: rocblas_math_mode_ = rocblas_math_mode_(0);\n}\nimpl rocblas_math_mode_ {\n    pub const rocblas_xf32_xdl_math_op: rocblas_math_mode_ = rocblas_math_mode_(1);\n}\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocblas_math_mode_(pub ::core::ffi::c_uint);\npub use self::rocblas_math_mode_ as rocblas_math_mode;\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /// \\brief Create handle\n    pub fn rocblas_create_handle(handle: *mut rocblas_handle) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /// \\brief Destroy handle\n    pub fn rocblas_destroy_handle(handle: rocblas_handle) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /// \\brief Set stream for handle\n    pub fn rocblas_set_stream(\n        handle: rocblas_handle,\n        stream: hip_runtime_sys::hipStream_t,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /// \\brief Get stream [0] from handle\n    pub fn rocblas_get_stream(\n        handle: rocblas_handle,\n        stream: *mut hip_runtime_sys::hipStream_t,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /// \\brief Set rocblas_pointer_mode\n    pub fn rocblas_set_pointer_mode(\n        handle: rocblas_handle,\n        pointer_mode: rocblas_pointer_mode,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /// \\brief Get rocblas_pointer_mode\n    pub fn rocblas_get_pointer_mode(\n        handle: rocblas_handle,\n        pointer_mode: *mut rocblas_pointer_mode,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\brief Set rocblas_atomics_mode\n  \\details\n  Some rocBLAS functions may have implementations which use atomic operations to increase performance.\n  By using atomic operations, results are not guaranteed to be identical between multiple runs.\n  Results will be accurate with or without atomic operations, but if it is required to\n  have bit-wise reproducible results, atomic operations should not be used.\n\n  Atomic operations can be turned on or off for a handle by calling rocblas_set_atomics_mode.\n  By default, this is set to `rocblas_atomics_allowed`.*/\n    pub fn rocblas_set_atomics_mode(\n        handle: rocblas_handle,\n        atomics_mode: rocblas_atomics_mode,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /// \\brief Get rocblas_atomics_mode\n    pub fn rocblas_get_atomics_mode(\n        handle: rocblas_handle,\n        atomics_mode: *mut rocblas_atomics_mode,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /// \\brief Set rocblas_math_mode\n    pub fn rocblas_set_math_mode(\n        handle: rocblas_handle,\n        math_mode: rocblas_math_mode,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /// \\brief Get rocblas_math_mode\n    pub fn rocblas_get_math_mode(\n        handle: rocblas_handle,\n        math_mode: *mut rocblas_math_mode,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    /// \\brief  Indicates whether the pointer is on the host or device.\n    pub fn rocblas_pointer_to_mode(\n        ptr: *mut ::core::ffi::c_void,\n    ) -> rocblas_pointer_mode;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\brief Copy vector from host to device\n@param[in]\nn           [rocblas_int]\nnumber of elements in the vector\n@param[in]\nelem_size   [rocblas_int]\nnumber of bytes per element in the matrix\n@param[in]\nx           pointer to vector on the host\n@param[in]\nincx        [rocblas_int]\nspecifies the increment for the elements of the vector\n@param[out]\ny           pointer to vector on the device\n@param[in]\nincy        [rocblas_int]\nspecifies the increment for the elements of the vector*/\n    pub fn rocblas_set_vector(\n        n: rocblas_int,\n        elem_size: rocblas_int,\n        x: *const ::core::ffi::c_void,\n        incx: rocblas_int,\n        y: *mut ::core::ffi::c_void,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_set_vector_64(\n        n: i64,\n        elem_size: i64,\n        x: *const ::core::ffi::c_void,\n        incx: i64,\n        y: *mut ::core::ffi::c_void,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\brief Copy vector from device to host\n@param[in]\nn           [rocblas_int]\nnumber of elements in the vector\n@param[in]\nelem_size   [rocblas_int]\nnumber of bytes per element in the matrix\n@param[in]\nx           pointer to vector on the device\n@param[in]\nincx        [rocblas_int]\nspecifies the increment for the elements of the vector\n@param[out]\ny           pointer to vector on the host\n@param[in]\nincy        [rocblas_int]\nspecifies the increment for the elements of the vector*/\n    pub fn rocblas_get_vector(\n        n: rocblas_int,\n        elem_size: rocblas_int,\n        x: *const ::core::ffi::c_void,\n        incx: rocblas_int,\n        y: *mut ::core::ffi::c_void,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_get_vector_64(\n        n: i64,\n        elem_size: i64,\n        x: *const ::core::ffi::c_void,\n        incx: i64,\n        y: *mut ::core::ffi::c_void,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\brief Copy matrix from host to device\n@param[in]\nrows        [rocblas_int]\nnumber of rows in matrices\n@param[in]\ncols        [rocblas_int]\nnumber of columns in matrices\n@param[in]\nelem_size   [rocblas_int]\nnumber of bytes per element in the matrix\n@param[in]\na           pointer to matrix on the host\n@param[in]\nlda         [rocblas_int]\nspecifies the leading dimension of A, lda >= rows\n@param[out]\nb           pointer to matrix on the GPU\n@param[in]\nldb         [rocblas_int]\nspecifies the leading dimension of B, ldb >= rows*/\n    pub fn rocblas_set_matrix(\n        rows: rocblas_int,\n        cols: rocblas_int,\n        elem_size: rocblas_int,\n        a: *const ::core::ffi::c_void,\n        lda: rocblas_int,\n        b: *mut ::core::ffi::c_void,\n        ldb: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_set_matrix_64(\n        rows: i64,\n        cols: i64,\n        elem_size: i64,\n        a: *const ::core::ffi::c_void,\n        lda: i64,\n        b: *mut ::core::ffi::c_void,\n        ldb: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\brief Copy matrix from device to host\n@param[in]\nrows        [rocblas_int]\nnumber of rows in matrices\n@param[in]\ncols        [rocblas_int]\nnumber of columns in matrices\n@param[in]\nelem_size   [rocblas_int]\nnumber of bytes per element in the matrix\n@param[in]\na           pointer to matrix on the GPU\n@param[in]\nlda         [rocblas_int]\nspecifies the leading dimension of A, lda >= rows\n@param[out]\nb           pointer to matrix on the host\n@param[in]\nldb         [rocblas_int]\nspecifies the leading dimension of B, ldb >= rows*/\n    pub fn rocblas_get_matrix(\n        rows: rocblas_int,\n        cols: rocblas_int,\n        elem_size: rocblas_int,\n        a: *const ::core::ffi::c_void,\n        lda: rocblas_int,\n        b: *mut ::core::ffi::c_void,\n        ldb: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_get_matrix_64(\n        rows: i64,\n        cols: i64,\n        elem_size: i64,\n        a: *const ::core::ffi::c_void,\n        lda: i64,\n        b: *mut ::core::ffi::c_void,\n        ldb: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\brief Asynchronously copy vector from host to device\n\\details\nrocblas_set_vector_async copies a vector from pinned host memory to device memory asynchronously.\nMemory on the host must be allocated with hipHostMalloc or the transfer will be synchronous.\n@param[in]\nn           [rocblas_int]\nnumber of elements in the vector\n@param[in]\nelem_size   [rocblas_int]\nnumber of bytes per element in the matrix\n@param[in]\nx           pointer to vector on the host\n@param[in]\nincx        [rocblas_int]\nspecifies the increment for the elements of the vector\n@param[out]\ny           pointer to vector on the device\n@param[in]\nincy        [rocblas_int]\nspecifies the increment for the elements of the vector\n@param[in]\nstream      specifies the stream into which this transfer request is queued*/\n    pub fn rocblas_set_vector_async(\n        n: rocblas_int,\n        elem_size: rocblas_int,\n        x: *const ::core::ffi::c_void,\n        incx: rocblas_int,\n        y: *mut ::core::ffi::c_void,\n        incy: rocblas_int,\n        stream: hip_runtime_sys::hipStream_t,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_set_vector_async_64(\n        n: i64,\n        elem_size: i64,\n        x: *const ::core::ffi::c_void,\n        incx: i64,\n        y: *mut ::core::ffi::c_void,\n        incy: i64,\n        stream: hip_runtime_sys::hipStream_t,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\brief Asynchronously copy vector from device to host\n\\details\nrocblas_get_vector_async copies a vector from pinned host memory to device memory asynchronously.\nMemory on the host must be allocated with hipHostMalloc or the transfer will be synchronous.\n@param[in]\nn           [rocblas_int]\nnumber of elements in the vector\n@param[in]\nelem_size   [rocblas_int]\nnumber of bytes per element in the matrix\n@param[in]\nx           pointer to vector on the device\n@param[in]\nincx        [rocblas_int]\nspecifies the increment for the elements of the vector\n@param[out]\ny           pointer to vector on the host\n@param[in]\nincy        [rocblas_int]\nspecifies the increment for the elements of the vector\n@param[in]\nstream      specifies the stream into which this transfer request is queued*/\n    pub fn rocblas_get_vector_async(\n        n: rocblas_int,\n        elem_size: rocblas_int,\n        x: *const ::core::ffi::c_void,\n        incx: rocblas_int,\n        y: *mut ::core::ffi::c_void,\n        incy: rocblas_int,\n        stream: hip_runtime_sys::hipStream_t,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_get_vector_async_64(\n        n: i64,\n        elem_size: i64,\n        x: *const ::core::ffi::c_void,\n        incx: i64,\n        y: *mut ::core::ffi::c_void,\n        incy: i64,\n        stream: hip_runtime_sys::hipStream_t,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\brief Asynchronously copy matrix from host to device\n\\details\nrocblas_set_matrix_async copies a matrix from pinned host memory to device memory asynchronously.\nMemory on the host must be allocated with hipHostMalloc or the transfer will be synchronous.\n@param[in]\nrows        [rocblas_int]\nnumber of rows in matrices\n@param[in]\ncols        [rocblas_int]\nnumber of columns in matrices\n@param[in]\nelem_size   [rocblas_int]\nnumber of bytes per element in the matrix\n@param[in]\na           pointer to matrix on the host\n@param[in]\nlda         [rocblas_int]\nspecifies the leading dimension of A, lda >= rows\n@param[out]\nb           pointer to matrix on the GPU\n@param[in]\nldb         [rocblas_int]\nspecifies the leading dimension of B, ldb >= rows\n@param[in]\nstream      specifies the stream into which this transfer request is queued*/\n    pub fn rocblas_set_matrix_async(\n        rows: rocblas_int,\n        cols: rocblas_int,\n        elem_size: rocblas_int,\n        a: *const ::core::ffi::c_void,\n        lda: rocblas_int,\n        b: *mut ::core::ffi::c_void,\n        ldb: rocblas_int,\n        stream: hip_runtime_sys::hipStream_t,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_set_matrix_async_64(\n        rows: i64,\n        cols: i64,\n        elem_size: i64,\n        a: *const ::core::ffi::c_void,\n        lda: i64,\n        b: *mut ::core::ffi::c_void,\n        ldb: i64,\n        stream: hip_runtime_sys::hipStream_t,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\brief asynchronously copy matrix from device to host\n\\details\nrocblas_get_matrix_async copies a matrix from device memory to pinned host memory asynchronously.\nMemory on the host must be allocated with hipHostMalloc or the transfer will be synchronous.\n@param[in]\nrows        [rocblas_int]\nnumber of rows in matrices\n@param[in]\ncols        [rocblas_int]\nnumber of columns in matrices\n@param[in]\nelem_size   [rocblas_int]\nnumber of bytes per element in the matrix\n@param[in]\na           pointer to matrix on the GPU\n@param[in]\nlda         [rocblas_int]\nspecifies the leading dimension of A, lda >= rows\n@param[out]\nb           pointer to matrix on the host\n@param[in]\nldb         [rocblas_int]\nspecifies the leading dimension of B, ldb >= rows\n@param[in]\nstream      specifies the stream into which this transfer request is queued*/\n    pub fn rocblas_get_matrix_async(\n        rows: rocblas_int,\n        cols: rocblas_int,\n        elem_size: rocblas_int,\n        a: *const ::core::ffi::c_void,\n        lda: rocblas_int,\n        b: *mut ::core::ffi::c_void,\n        ldb: rocblas_int,\n        stream: hip_runtime_sys::hipStream_t,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_get_matrix_async_64(\n        rows: i64,\n        cols: i64,\n        elem_size: i64,\n        a: *const ::core::ffi::c_void,\n        lda: i64,\n        b: *mut ::core::ffi::c_void,\n        ldb: i64,\n        stream: hip_runtime_sys::hipStream_t,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /// Function to set start/stop event handlers (for internal use only)\n    pub fn rocblas_set_start_stop_events(\n        handle: rocblas_handle,\n        startEvent: hip_runtime_sys::hipEvent_t,\n        stopEvent: hip_runtime_sys::hipEvent_t,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_set_solution_fitness_query(\n        handle: rocblas_handle,\n        fitness: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\brief specifies the performance metric that solution selection uses\n\\details\nDetermines which performance metric will be used by Tensile when selecting the optimal solution\nfor gemm problems. If a valid solution benchmarked for this performance metric does not exist\nfor a problem, Tensile will default to a solution benchmarked for overall performance instead.\n@param[in]\nhandle      [rocblas_handle]\nthe handle of device\n@param[in]\nmetric      [rocblas_performance_metric]\nthe performance metric to be used*/\n    pub fn rocblas_set_performance_metric(\n        handle: rocblas_handle,\n        metric: rocblas_performance_metric,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\brief returns the performance metric being used for solution selection\n\\details\nReturns the performance metric used by Tensile to select the optimal solution for gemm problems.\n@param[in]\nhandle      [rocblas_handle]\nthe handle of device\n@param[out]\nmetric      [rocblas_performance_metric*]\npointer to where the metric will be stored*/\n    pub fn rocblas_get_performance_metric(\n        handle: rocblas_handle,\n        metric: *mut rocblas_performance_metric,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\nscal  scales each element of vector x with scalar alpha:\n\nx := alpha * x\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nthe number of elements in x.\n@param[in]\nalpha     device pointer or host pointer for the scalar alpha.\n@param[in, out]\nx         device pointer storing vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n*/\n    pub fn rocblas_sscal(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *mut f32,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dscal(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *mut f64,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cscal(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        x: *mut rocblas_float_complex,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zscal(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        x: *mut rocblas_double_complex,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csscal(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *mut rocblas_float_complex,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdscal(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *mut rocblas_double_complex,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sscal_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const f32,\n        x: *mut f32,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dscal_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const f64,\n        x: *mut f64,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cscal_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        x: *mut rocblas_float_complex,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zscal_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        x: *mut rocblas_double_complex,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csscal_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const f32,\n        x: *mut rocblas_float_complex,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdscal_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const f64,\n        x: *mut rocblas_double_complex,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\nscal_batched  scales each element of vector x_i with scalar alpha, for i = 1, ... , batch_count:\n\nx_i := alpha * x_i,\nwhere (x_i) is the i-th instance of the batch.\n\n@param[in]\nhandle      [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn           [rocblas_int]\nthe number of elements in each x_i.\n@param[in]\nalpha       host pointer or device pointer for the scalar alpha.\n@param[in, out]\nx           device array of device pointers storing each vector x_i.\n@param[in]\nincx        [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\nbatch_count [rocblas_int]\nspecifies the number of batches in x.\n*/\n    pub fn rocblas_sscal_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *const *mut f32,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dscal_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *const *mut f64,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cscal_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        x: *const *mut rocblas_float_complex,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zscal_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        x: *const *mut rocblas_double_complex,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csscal_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *const *mut rocblas_float_complex,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdscal_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *const *mut rocblas_double_complex,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sscal_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const f32,\n        x: *const *mut f32,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dscal_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const f64,\n        x: *const *mut f64,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cscal_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        x: *const *mut rocblas_float_complex,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zscal_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        x: *const *mut rocblas_double_complex,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csscal_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const f32,\n        x: *const *mut rocblas_float_complex,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdscal_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const f64,\n        x: *const *mut rocblas_double_complex,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\nscal_strided_batched  scales each element of vector x_i with scalar alpha, for i = 1, ... , batch_count:\n\nx_i := alpha * x_i,\nwhere (x_i) is the i-th instance of the batch.\n\n@param[in]\nhandle      [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn           [rocblas_int]\nthe number of elements in each x_i.\n@param[in]\nalpha       host pointer or device pointer for the scalar alpha.\n@param[in, out]\nx           device pointer to the first vector (x_1) in the batch.\n@param[in]\nincx        [rocblas_int]\nspecifies the increment for the elements of x.\n@param[in]\nstride_x    [rocblas_stride]\nstride from the start of one vector (x_i) and the next one (x_i+1).\nThere are no restrictions placed on stride_x. However, ensure that stride_x is of appropriate size, for a typical\ncase this means stride_x >= n * incx.\n@param[in]\nbatch_count [rocblas_int]\nspecifies the number of batches in x.\n*/\n    pub fn rocblas_sscal_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *mut f32,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dscal_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *mut f64,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cscal_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        x: *mut rocblas_float_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zscal_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        x: *mut rocblas_double_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csscal_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *mut rocblas_float_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdscal_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *mut rocblas_double_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sscal_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const f32,\n        x: *mut f32,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dscal_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const f64,\n        x: *mut f64,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cscal_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        x: *mut rocblas_float_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zscal_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        x: *mut rocblas_double_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csscal_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const f32,\n        x: *mut rocblas_float_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdscal_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const f64,\n        x: *mut rocblas_double_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\ncopy  copies each element x[i] into y[i], for  i = 1 , ... , n:\n\ny := x\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nthe number of elements in x to be copied to y.\n@param[in]\nx         device pointer storing vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n@param[out]\ny         device pointer storing vector y.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of y.\n*/\n    pub fn rocblas_scopy(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const f32,\n        incx: rocblas_int,\n        y: *mut f32,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dcopy(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const f64,\n        incx: rocblas_int,\n        y: *mut f64,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ccopy(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        y: *mut rocblas_float_complex,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zcopy(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        y: *mut rocblas_double_complex,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_scopy_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const f32,\n        incx: i64,\n        y: *mut f32,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dcopy_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const f64,\n        incx: i64,\n        y: *mut f64,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ccopy_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        y: *mut rocblas_float_complex,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zcopy_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        y: *mut rocblas_double_complex,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\ncopy_batched copies each element x_i[j] into y_i[j], for  j = 1 , ... , n; i = 1 , ... , batch_count:\n\ny_i := x_i,\nwhere (x_i, y_i) is the i-th instance of the batch.\nx_i and y_i are vectors.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nthe number of elements in each x_i to be copied to y_i.\n@param[in]\nx         device array of device pointers storing each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each vector x_i.\n@param[out]\ny         device array of device pointers storing each vector y_i.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of each vector y_i.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_scopy_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *const f32,\n        incx: rocblas_int,\n        y: *const *mut f32,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dcopy_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *const f64,\n        incx: rocblas_int,\n        y: *const *mut f64,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ccopy_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *const rocblas_float_complex,\n        incx: rocblas_int,\n        y: *const *mut rocblas_float_complex,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zcopy_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *const rocblas_double_complex,\n        incx: rocblas_int,\n        y: *const *mut rocblas_double_complex,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_scopy_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *const f32,\n        incx: i64,\n        y: *const *mut f32,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dcopy_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *const f64,\n        incx: i64,\n        y: *const *mut f64,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ccopy_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *const rocblas_float_complex,\n        incx: i64,\n        y: *const *mut rocblas_float_complex,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zcopy_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *const rocblas_double_complex,\n        incx: i64,\n        y: *const *mut rocblas_double_complex,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\ncopy_strided_batched copies each element x_i[j] into y_i[j], for  j = 1 , ... , n; i = 1 , ... , batch_count:\n\ny_i := x_i,\nwhere (x_i, y_i) is the i-th instance of the batch.\nx_i and y_i are vectors.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nthe number of elements in each x_i to be copied to y_i.\n@param[in]\nx         device pointer to the first vector (x_1) in the batch.\n@param[in]\nincx      [rocblas_int]\nspecifies the increments for the elements of vectors x_i.\n@param[in]\nstridex     [rocblas_stride]\nstride from the start of one vector (x_i) and the next one (x_i+1).\nThere are no restrictions placed on stride_x. However, the user should\ntake care to ensure that stride_x is of appropriate size. For a typical\ncase, this means stride_x >= n * incx.\n@param[out]\ny         device pointer to the first vector (y_1) in the batch.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of vectors y_i.\n@param[in]\nstridey     [rocblas_stride]\nstride from the start of one vector (y_i) and the next one (y_i+1).\nThere are no restrictions placed on stride_y, However, ensure that stride_y is of appropriate size, for a typical\ncase this means stride_y >= n * incy. stridey should be non zero.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_scopy_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const f32,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *mut f32,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dcopy_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const f64,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *mut f64,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ccopy_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *mut rocblas_float_complex,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zcopy_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *mut rocblas_double_complex,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_scopy_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const f32,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *mut f32,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dcopy_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const f64,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *mut f64,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ccopy_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *mut rocblas_float_complex,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zcopy_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *mut rocblas_double_complex,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\ndot(u)  performs the dot product of vectors x and y:\n\nresult = x * y;\n\ndotc  performs the dot product of the conjugate of complex vector x and complex vector y.\n\nresult = conjugate (x) * y;\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nthe number of elements in x and y.\n@param[in]\nx         device pointer storing vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of y.\n@param[in]\ny         device pointer storing vector y.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of y.\n@param[in, out]\nresult\ndevice pointer or host pointer to store the dot product.\nreturn is 0.0 if n <= 0.\n*/\n    pub fn rocblas_sdot(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const f32,\n        incx: rocblas_int,\n        y: *const f32,\n        incy: rocblas_int,\n        result: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ddot(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const f64,\n        incx: rocblas_int,\n        y: *const f64,\n        incy: rocblas_int,\n        result: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_hdot(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_half,\n        incx: rocblas_int,\n        y: *const rocblas_half,\n        incy: rocblas_int,\n        result: *mut rocblas_half,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_bfdot(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_bfloat16,\n        incx: rocblas_int,\n        y: *const rocblas_bfloat16,\n        incy: rocblas_int,\n        result: *mut rocblas_bfloat16,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cdotu(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        y: *const rocblas_float_complex,\n        incy: rocblas_int,\n        result: *mut rocblas_float_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdotu(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        y: *const rocblas_double_complex,\n        incy: rocblas_int,\n        result: *mut rocblas_double_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cdotc(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        y: *const rocblas_float_complex,\n        incy: rocblas_int,\n        result: *mut rocblas_float_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdotc(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        y: *const rocblas_double_complex,\n        incy: rocblas_int,\n        result: *mut rocblas_double_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sdot_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const f32,\n        incx: i64,\n        y: *const f32,\n        incy: i64,\n        result: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ddot_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const f64,\n        incx: i64,\n        y: *const f64,\n        incy: i64,\n        result: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_hdot_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_half,\n        incx: i64,\n        y: *const rocblas_half,\n        incy: i64,\n        result: *mut rocblas_half,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_bfdot_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_bfloat16,\n        incx: i64,\n        y: *const rocblas_bfloat16,\n        incy: i64,\n        result: *mut rocblas_bfloat16,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cdotu_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        y: *const rocblas_float_complex,\n        incy: i64,\n        result: *mut rocblas_float_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdotu_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        y: *const rocblas_double_complex,\n        incy: i64,\n        result: *mut rocblas_double_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cdotc_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        y: *const rocblas_float_complex,\n        incy: i64,\n        result: *mut rocblas_float_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdotc_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        y: *const rocblas_double_complex,\n        incy: i64,\n        result: *mut rocblas_double_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\ndot_batched(u) performs a batch of dot products of vectors x and y:\n\nresult_i = x_i * y_i;\n\ndotc_batched  performs a batch of dot products of the conjugate of complex vector x and complex vector y\n\nresult_i = conjugate (x_i) * y_i;\nwhere (x_i, y_i) is the i-th instance of the batch.\nx_i and y_i are vectors, for i = 1, ..., batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nthe number of elements in each x_i and y_i.\n@param[in]\nx         device array of device pointers storing each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\ny         device array of device pointers storing each vector y_i.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of each y_i.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n@param[in, out]\nresult\ndevice array or host array of batch_count size to store the dot products of each batch.\nreturn 0.0 for each element if n <= 0.\n*/\n    pub fn rocblas_sdot_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *const f32,\n        incx: rocblas_int,\n        y: *const *const f32,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n        result: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ddot_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *const f64,\n        incx: rocblas_int,\n        y: *const *const f64,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n        result: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_hdot_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *const rocblas_half,\n        incx: rocblas_int,\n        y: *const *const rocblas_half,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n        result: *mut rocblas_half,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_bfdot_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *const rocblas_bfloat16,\n        incx: rocblas_int,\n        y: *const *const rocblas_bfloat16,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n        result: *mut rocblas_bfloat16,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cdotu_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *const rocblas_float_complex,\n        incx: rocblas_int,\n        y: *const *const rocblas_float_complex,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n        result: *mut rocblas_float_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdotu_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *const rocblas_double_complex,\n        incx: rocblas_int,\n        y: *const *const rocblas_double_complex,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n        result: *mut rocblas_double_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cdotc_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *const rocblas_float_complex,\n        incx: rocblas_int,\n        y: *const *const rocblas_float_complex,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n        result: *mut rocblas_float_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdotc_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *const rocblas_double_complex,\n        incx: rocblas_int,\n        y: *const *const rocblas_double_complex,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n        result: *mut rocblas_double_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sdot_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *const f32,\n        incx: i64,\n        y: *const *const f32,\n        incy: i64,\n        batch_count: i64,\n        result: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ddot_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *const f64,\n        incx: i64,\n        y: *const *const f64,\n        incy: i64,\n        batch_count: i64,\n        result: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_hdot_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *const rocblas_half,\n        incx: i64,\n        y: *const *const rocblas_half,\n        incy: i64,\n        batch_count: i64,\n        result: *mut rocblas_half,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_bfdot_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *const rocblas_bfloat16,\n        incx: i64,\n        y: *const *const rocblas_bfloat16,\n        incy: i64,\n        batch_count: i64,\n        result: *mut rocblas_bfloat16,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cdotu_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *const rocblas_float_complex,\n        incx: i64,\n        y: *const *const rocblas_float_complex,\n        incy: i64,\n        batch_count: i64,\n        result: *mut rocblas_float_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdotu_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *const rocblas_double_complex,\n        incx: i64,\n        y: *const *const rocblas_double_complex,\n        incy: i64,\n        batch_count: i64,\n        result: *mut rocblas_double_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cdotc_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *const rocblas_float_complex,\n        incx: i64,\n        y: *const *const rocblas_float_complex,\n        incy: i64,\n        batch_count: i64,\n        result: *mut rocblas_float_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdotc_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *const rocblas_double_complex,\n        incx: i64,\n        y: *const *const rocblas_double_complex,\n        incy: i64,\n        batch_count: i64,\n        result: *mut rocblas_double_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\ndot_strided_batched(u)  performs a batch of dot products of vectors x and y:\n\nresult_i = x_i * y_i;\n\ndotc_strided_batched  performs a batch of dot products of the conjugate of complex vector x and complex vector y\n\nresult_i = conjugate (x_i) * y_i;\nwhere (x_i, y_i) is the i-th instance of the batch.\nx_i and y_i are vectors, for i = 1, ..., batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nthe number of elements in each x_i and y_i.\n@param[in]\nx         device pointer to the first vector (x_1) in the batch.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\nstridex     [rocblas_stride]\nstride from the start of one vector (x_i) and the next one (x_i+1).\n@param[in]\ny         device pointer to the first vector (y_1) in the batch.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of each y_i.\n@param[in]\nstridey     [rocblas_stride]\nstride from the start of one vector (y_i) and the next one (y_i+1).\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n@param[in, out]\nresult\ndevice array or host array of batch_count size to store the dot products of each batch.\nreturn 0.0 for each element if n <= 0.\n*/\n    pub fn rocblas_sdot_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const f32,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *const f32,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n        result: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ddot_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const f64,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *const f64,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n        result: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_hdot_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_half,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *const rocblas_half,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n        result: *mut rocblas_half,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_bfdot_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_bfloat16,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *const rocblas_bfloat16,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n        result: *mut rocblas_bfloat16,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cdotu_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *const rocblas_float_complex,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n        result: *mut rocblas_float_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdotu_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *const rocblas_double_complex,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n        result: *mut rocblas_double_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cdotc_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *const rocblas_float_complex,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n        result: *mut rocblas_float_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdotc_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *const rocblas_double_complex,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n        result: *mut rocblas_double_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sdot_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const f32,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *const f32,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n        result: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ddot_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const f64,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *const f64,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n        result: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_hdot_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_half,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *const rocblas_half,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n        result: *mut rocblas_half,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_bfdot_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_bfloat16,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *const rocblas_bfloat16,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n        result: *mut rocblas_bfloat16,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cdotu_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *const rocblas_float_complex,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n        result: *mut rocblas_float_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdotu_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *const rocblas_double_complex,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n        result: *mut rocblas_double_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cdotc_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *const rocblas_float_complex,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n        result: *mut rocblas_float_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdotc_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *const rocblas_double_complex,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n        result: *mut rocblas_double_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\nswap  interchanges vectors x and y:\n\ny := x;\nx := y\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nthe number of elements in x and y.\n@param[in, out]\nx         device pointer storing vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n@param[in, out]\ny         device pointer storing vector y.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of y.\n*/\n    pub fn rocblas_sswap(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *mut f32,\n        incx: rocblas_int,\n        y: *mut f32,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dswap(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *mut f64,\n        incx: rocblas_int,\n        y: *mut f64,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cswap(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *mut rocblas_float_complex,\n        incx: rocblas_int,\n        y: *mut rocblas_float_complex,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zswap(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *mut rocblas_double_complex,\n        incx: rocblas_int,\n        y: *mut rocblas_double_complex,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sswap_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *mut f32,\n        incx: i64,\n        y: *mut f32,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dswap_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *mut f64,\n        incx: i64,\n        y: *mut f64,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cswap_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *mut rocblas_float_complex,\n        incx: i64,\n        y: *mut rocblas_float_complex,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zswap_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *mut rocblas_double_complex,\n        incx: i64,\n        y: *mut rocblas_double_complex,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\nswap_batched interchanges vectors x_i and y_i, for i = 1 , ... , batch_count:\n\ny_i := x_i;\nx_i := y_i\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nthe number of elements in each x_i and y_i.\n@param[in, out]\nx         device array of device pointers storing each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in, out]\ny         device array of device pointers storing each vector y_i.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of each y_i.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_sswap_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *mut f32,\n        incx: rocblas_int,\n        y: *const *mut f32,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dswap_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *mut f64,\n        incx: rocblas_int,\n        y: *const *mut f64,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cswap_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *mut rocblas_float_complex,\n        incx: rocblas_int,\n        y: *const *mut rocblas_float_complex,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zswap_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *mut rocblas_double_complex,\n        incx: rocblas_int,\n        y: *const *mut rocblas_double_complex,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sswap_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *mut f32,\n        incx: i64,\n        y: *const *mut f32,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dswap_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *mut f64,\n        incx: i64,\n        y: *const *mut f64,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cswap_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *mut rocblas_float_complex,\n        incx: i64,\n        y: *const *mut rocblas_float_complex,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zswap_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *mut rocblas_double_complex,\n        incx: i64,\n        y: *const *mut rocblas_double_complex,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\nswap_strided_batched interchanges vectors x_i and y_i, for i = 1 , ... , batch_count:\n\ny_i := x_i;\nx_i := y_i\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nthe number of elements in each x_i and y_i.\n@param[in, out]\nx         device pointer to the first vector x_1.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n@param[in]\nstridex   [rocblas_stride]\nstride from the start of one vector (x_i) and the next one (x_i+1).\nThere are no restrictions placed on stride_x. However, ensure that stride_x is of appropriate size. For a typical\ncase this means stride_x >= n * incx.\n@param[in, out]\ny         device pointer to the first vector y_1.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of y.\n@param[in]\nstridey   [rocblas_stride]\nstride from the start of one vector (y_i) and the next one (y_i+1).\nThere are no restrictions placed on stride_x. However, ensure that stride_y is of appropriate size. For a typical\ncase this means stride_y >= n * incy. stridey should be non zero.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_sswap_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *mut f32,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *mut f32,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dswap_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *mut f64,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *mut f64,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cswap_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *mut rocblas_float_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *mut rocblas_float_complex,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zswap_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *mut rocblas_double_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *mut rocblas_double_complex,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sswap_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *mut f32,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *mut f32,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dswap_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *mut f64,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *mut f64,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cswap_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *mut rocblas_float_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *mut rocblas_float_complex,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zswap_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *mut rocblas_double_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *mut rocblas_double_complex,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\naxpy   computes constant alpha multiplied by vector x, plus vector y:\n\ny := alpha * x + y\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nthe number of elements in x and y.\n@param[in]\nalpha     device pointer or host pointer to specify the scalar alpha.\n@param[in]\nx         device pointer storing vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n@param[out]\ny         device pointer storing vector y.\n@param[in, out]\nincy      [rocblas_int]\nspecifies the increment for the elements of y.\n*/\n    pub fn rocblas_haxpy(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const rocblas_half,\n        x: *const rocblas_half,\n        incx: rocblas_int,\n        y: *mut rocblas_half,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_saxpy(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *const f32,\n        incx: rocblas_int,\n        y: *mut f32,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_daxpy(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *const f64,\n        incx: rocblas_int,\n        y: *mut f64,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_caxpy(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        y: *mut rocblas_float_complex,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zaxpy(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        y: *mut rocblas_double_complex,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_haxpy_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const rocblas_half,\n        x: *const rocblas_half,\n        incx: i64,\n        y: *mut rocblas_half,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_saxpy_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const f32,\n        x: *const f32,\n        incx: i64,\n        y: *mut f32,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_daxpy_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const f64,\n        x: *const f64,\n        incx: i64,\n        y: *mut f64,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_caxpy_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        y: *mut rocblas_float_complex,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zaxpy_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        y: *mut rocblas_double_complex,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\naxpy_batched compute y := alpha * x + y over a set of batched vectors.\n\n@param[in]\nhandle    rocblas_handle\nhandle to the rocblas library context queue.\n@param[in]\nn         rocblas_int\n@param[in]\nalpha     specifies the scalar alpha.\n@param[in]\nx         pointer storing vector x on the GPU.\n@param[in]\nincx      rocblas_int\nspecifies the increment for the elements of x.\n@param[out]\ny         pointer storing vector y on the GPU.\n@param[in, out]\nincy      rocblas_int\nspecifies the increment for the elements of y.\n\n@param[in]\nbatch_count rocblas_int\nnumber of instances in the batch.\n*/\n    pub fn rocblas_haxpy_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const rocblas_half,\n        x: *const *const rocblas_half,\n        incx: rocblas_int,\n        y: *const *mut rocblas_half,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_saxpy_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *const *const f32,\n        incx: rocblas_int,\n        y: *const *mut f32,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_daxpy_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *const *const f64,\n        incx: rocblas_int,\n        y: *const *mut f64,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_caxpy_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        x: *const *const rocblas_float_complex,\n        incx: rocblas_int,\n        y: *const *mut rocblas_float_complex,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zaxpy_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        x: *const *const rocblas_double_complex,\n        incx: rocblas_int,\n        y: *const *mut rocblas_double_complex,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_haxpy_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const rocblas_half,\n        x: *const *const rocblas_half,\n        incx: i64,\n        y: *const *mut rocblas_half,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_saxpy_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const f32,\n        x: *const *const f32,\n        incx: i64,\n        y: *const *mut f32,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_daxpy_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const f64,\n        x: *const *const f64,\n        incx: i64,\n        y: *const *mut f64,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_caxpy_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        x: *const *const rocblas_float_complex,\n        incx: i64,\n        y: *const *mut rocblas_float_complex,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zaxpy_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        x: *const *const rocblas_double_complex,\n        incx: i64,\n        y: *const *mut rocblas_double_complex,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\naxpy_strided_batched compute y := alpha * x + y over a set of strided batched vectors.\n\n@param[in]\nhandle    rocblas_handle\nhandle to the rocblas library context queue.\n@param[in]\nn         rocblas_int.\n@param[in]\nalpha     specifies the scalar alpha.\n@param[in]\nx         pointer storing vector x on the GPU.\n@param[in]\nincx      rocblas_int\nspecifies the increment for the elements of x.\n@param[in]\nstridex   rocblas_stride\nspecifies the increment between vectors of x.\n@param[out]\ny         pointer storing vector y on the GPU.\n@param[in, out]\nincy      rocblas_int\nspecifies the increment for the elements of y.\n@param[in]\nstridey   rocblas_stride\nspecifies the increment between vectors of y.\n\n@param[in]\nbatch_count rocblas_int\nnumber of instances in the batch.\n*/\n    pub fn rocblas_haxpy_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const rocblas_half,\n        x: *const rocblas_half,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *mut rocblas_half,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_saxpy_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *const f32,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *mut f32,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_daxpy_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *const f64,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *mut f64,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_caxpy_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *mut rocblas_float_complex,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zaxpy_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *mut rocblas_double_complex,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_haxpy_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const rocblas_half,\n        x: *const rocblas_half,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *mut rocblas_half,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_saxpy_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const f32,\n        x: *const f32,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *mut f32,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_daxpy_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const f64,\n        x: *const f64,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *mut f64,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_caxpy_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *mut rocblas_float_complex,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zaxpy_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *mut rocblas_double_complex,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\nasum computes the sum of the magnitudes of elements of a real vector x,\nor the sum of magnitudes of the real and imaginary parts of elements if x is a complex vector.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nthe number of elements in x and y.\n@param[in]\nx         device pointer storing vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x. incx must be > 0.\n@param[in, out]\nresult\ndevice pointer or host pointer to store the asum product.\nreturn is 0.0 if n <= 0.\n*/\n    pub fn rocblas_sasum(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const f32,\n        incx: rocblas_int,\n        result: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dasum(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const f64,\n        incx: rocblas_int,\n        result: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_scasum(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        result: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dzasum(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        result: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sasum_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const f32,\n        incx: i64,\n        result: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dasum_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const f64,\n        incx: i64,\n        result: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_scasum_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        result: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dzasum_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        result: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\nasum_batched computes the sum of the magnitudes of the elements in a batch of real vectors x_i,\nor the sum of magnitudes of the real and imaginary parts of elements if x_i is a complex\nvector, for i = 1, ..., batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nnumber of elements in each vector x_i.\n@param[in]\nx         device array of device pointers storing each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i. incx must be > 0.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n@param[out]\nresults\ndevice array or host array of batch_count size for results.\nreturn is 0.0 if n, incx<=0.\n*/\n    pub fn rocblas_sasum_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *const f32,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n        results: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dasum_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *const f64,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n        results: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_scasum_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *const rocblas_float_complex,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n        results: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dzasum_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *const rocblas_double_complex,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n        results: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sasum_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *const f32,\n        incx: i64,\n        batch_count: i64,\n        results: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dasum_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *const f64,\n        incx: i64,\n        batch_count: i64,\n        results: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_scasum_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *const rocblas_float_complex,\n        incx: i64,\n        batch_count: i64,\n        results: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dzasum_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *const rocblas_double_complex,\n        incx: i64,\n        batch_count: i64,\n        results: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\nasum_strided_batched computes the sum of the magnitudes of elements of a real vectors x_i,\nor the sum of magnitudes of the real and imaginary parts of elements if x_i is a complex\nvector, for i = 1, ..., batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nnumber of elements in each vector x_i.\n@param[in]\nx         device pointer to the first vector x_1.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i. incx must be > 0.\n@param[in]\nstridex   [rocblas_stride]\nstride from the start of one vector (x_i) and the next one (x_i+1).\nThere are no restrictions placed on stride_x. However, ensure that stride_x is of appropriate size. For a typical\ncase this means stride_x >= n * incx.\n@param[out]\nresults\ndevice pointer or host pointer to array for storing contiguous batch_count results.\nreturn is 0.0 if n, incx<=0.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_sasum_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const f32,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        batch_count: rocblas_int,\n        results: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dasum_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const f64,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        batch_count: rocblas_int,\n        results: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_scasum_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        batch_count: rocblas_int,\n        results: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dzasum_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        batch_count: rocblas_int,\n        results: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sasum_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const f32,\n        incx: i64,\n        stridex: rocblas_stride,\n        batch_count: i64,\n        results: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dasum_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const f64,\n        incx: i64,\n        stridex: rocblas_stride,\n        batch_count: i64,\n        results: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_scasum_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        batch_count: i64,\n        results: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dzasum_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        batch_count: i64,\n        results: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\nnrm2 computes the euclidean norm of a real or complex vector:\n\nresult := sqrt( x'*x ) for real vectors\nresult := sqrt( x**H*x ) for complex vectors\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nthe number of elements in x.\n@param[in]\nx         device pointer storing vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of y.\n@param[in, out]\nresult\ndevice pointer or host pointer to store the nrm2 product.\nreturn is 0.0 if n, incx<=0.\n*/\n    pub fn rocblas_snrm2(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const f32,\n        incx: rocblas_int,\n        result: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dnrm2(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const f64,\n        incx: rocblas_int,\n        result: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_scnrm2(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        result: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dznrm2(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        result: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_snrm2_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const f32,\n        incx: i64,\n        result: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dnrm2_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const f64,\n        incx: i64,\n        result: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_scnrm2_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        result: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dznrm2_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        result: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\nnrm2_batched computes the euclidean norm over a batch of real or complex vectors:\n\nresult := sqrt( x_i'*x_i ) for real vectors x, for i = 1, ..., batch_count\nresult := sqrt( x_i**H*x_i ) for complex vectors x, for i = 1, ..., batch_count\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nnumber of elements in each x_i.\n@param[in]\nx         device array of device pointers storing each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i. incx must be > 0.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n@param[out]\nresults\ndevice pointer or host pointer to array of batch_count size for nrm2 results.\nreturn is 0.0 for each element if n <= 0, incx<=0.\n*/\n    pub fn rocblas_snrm2_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *const f32,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n        results: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dnrm2_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *const f64,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n        results: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_scnrm2_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *const rocblas_float_complex,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n        results: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dznrm2_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *const rocblas_double_complex,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n        results: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_snrm2_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *const f32,\n        incx: i64,\n        batch_count: i64,\n        results: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dnrm2_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *const f64,\n        incx: i64,\n        batch_count: i64,\n        results: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_scnrm2_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *const rocblas_float_complex,\n        incx: i64,\n        batch_count: i64,\n        results: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dznrm2_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *const rocblas_double_complex,\n        incx: i64,\n        batch_count: i64,\n        results: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\nnrm2_strided_batched computes the euclidean norm over a batch of real or complex vectors:\n\nresult := sqrt( x_i'*x_i ) for real vectors x, for i = 1, ..., batch_count\nresult := sqrt( x_i**H*x_i ) for complex vectors, for i = 1, ..., batch_count\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nnumber of elements in each x_i.\n@param[in]\nx         device pointer to the first vector x_1.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i. incx must be > 0.\n@param[in]\nstridex   [rocblas_stride]\nstride from the start of one vector (x_i) and the next one (x_i+1).\nThere are no restrictions placed on stride_x. However, ensure that stride_x is of appropriate size. For a typical\ncase this means stride_x >= n * incx.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n@param[out]\nresults\ndevice pointer or host pointer to array for storing contiguous batch_count results.\nreturn is 0.0 for each element if n <= 0, incx<=0.\n*/\n    pub fn rocblas_snrm2_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const f32,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        batch_count: rocblas_int,\n        results: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dnrm2_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const f64,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        batch_count: rocblas_int,\n        results: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_scnrm2_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        batch_count: rocblas_int,\n        results: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dznrm2_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        batch_count: rocblas_int,\n        results: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_snrm2_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const f32,\n        incx: i64,\n        stridex: rocblas_stride,\n        batch_count: i64,\n        results: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dnrm2_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const f64,\n        incx: i64,\n        stridex: rocblas_stride,\n        batch_count: i64,\n        results: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_scnrm2_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        batch_count: i64,\n        results: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dznrm2_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        batch_count: i64,\n        results: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\namax finds the first index of the element of maximum magnitude of a vector x.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nthe number of elements in x.\n@param[in]\nx         device pointer storing vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of y.\n@param[in, out]\nresult\ndevice pointer or host pointer to store the amax index.\nreturn is 0.0 if n, incx<=0.\n*/\n    pub fn rocblas_isamax(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const f32,\n        incx: rocblas_int,\n        result: *mut rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_idamax(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const f64,\n        incx: rocblas_int,\n        result: *mut rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_icamax(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        result: *mut rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_izamax(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        result: *mut rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_isamax_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const f32,\n        incx: i64,\n        result: *mut i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_idamax_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const f64,\n        incx: i64,\n        result: *mut i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_icamax_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        result: *mut i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_izamax_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        result: *mut i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\namax_batched finds the first index of the element of maximum magnitude of each vector x_i in a batch, for i = 1, ..., batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nnumber of elements in each vector x_i.\n@param[in]\nx         device array of device pointers storing each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i. incx must be > 0.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch. Must be > 0.\n@param[out]\nresult\ndevice or host array of pointers of batch_count size for results.\nreturn is 0 if n, incx<=0.\n*/\n    pub fn rocblas_isamax_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *const f32,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n        result: *mut rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_idamax_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *const f64,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n        result: *mut rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_icamax_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *const rocblas_float_complex,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n        result: *mut rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_izamax_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *const rocblas_double_complex,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n        result: *mut rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_isamax_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *const f32,\n        incx: i64,\n        batch_count: i64,\n        result: *mut i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_idamax_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *const f64,\n        incx: i64,\n        batch_count: i64,\n        result: *mut i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_icamax_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *const rocblas_float_complex,\n        incx: i64,\n        batch_count: i64,\n        result: *mut i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_izamax_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *const rocblas_double_complex,\n        incx: i64,\n        batch_count: i64,\n        result: *mut i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\namax_strided_batched finds the first index of the element of maximum magnitude of each vector x_i in a batch, for i = 1, ..., batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nnumber of elements in each vector x_i.\n@param[in]\nx         device pointer to the first vector x_1.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i. incx must be > 0.\n@param[in]\nstridex   [rocblas_stride]\nspecifies the pointer increment between one x_i and the next x_(i + 1).\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n@param[out]\nresult\ndevice or host pointer for storing contiguous batch_count results.\nreturn is 0 if n <= 0, incx<=0.\n*/\n    pub fn rocblas_isamax_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const f32,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        batch_count: rocblas_int,\n        result: *mut rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_idamax_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const f64,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        batch_count: rocblas_int,\n        result: *mut rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_icamax_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        batch_count: rocblas_int,\n        result: *mut rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_izamax_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        batch_count: rocblas_int,\n        result: *mut rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_isamax_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const f32,\n        incx: i64,\n        stridex: rocblas_stride,\n        batch_count: i64,\n        result: *mut i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_idamax_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const f64,\n        incx: i64,\n        stridex: rocblas_stride,\n        batch_count: i64,\n        result: *mut i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_icamax_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        batch_count: i64,\n        result: *mut i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_izamax_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        batch_count: i64,\n        result: *mut i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\namin finds the first index of the element of minimum magnitude of a vector x.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nthe number of elements in x.\n@param[in]\nx         device pointer storing vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of y.\n@param[in, out]\nresult\ndevice pointer or host pointer to store the amin index.\nreturn is 0.0 if n, incx<=0.\n*/\n    pub fn rocblas_isamin(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const f32,\n        incx: rocblas_int,\n        result: *mut rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_idamin(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const f64,\n        incx: rocblas_int,\n        result: *mut rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_icamin(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        result: *mut rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_izamin(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        result: *mut rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_isamin_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const f32,\n        incx: i64,\n        result: *mut i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_idamin_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const f64,\n        incx: i64,\n        result: *mut i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_icamin_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        result: *mut i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_izamin_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        result: *mut i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\namin_batched finds the first index of the element of minimum magnitude of each vector x_i in a batch, for i = 1, ..., batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nnumber of elements in each vector x_i.\n@param[in]\nx         device array of device pointers storing each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i. incx must be > 0.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch. Must be > 0.\n@param[out]\nresult\ndevice or host pointers to array of batch_count size for results.\nreturn is 0 if n, incx<=0.\n*/\n    pub fn rocblas_isamin_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *const f32,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n        result: *mut rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_idamin_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *const f64,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n        result: *mut rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_icamin_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *const rocblas_float_complex,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n        result: *mut rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_izamin_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *const rocblas_double_complex,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n        result: *mut rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_isamin_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *const f32,\n        incx: i64,\n        batch_count: i64,\n        result: *mut i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_idamin_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *const f64,\n        incx: i64,\n        batch_count: i64,\n        result: *mut i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_icamin_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *const rocblas_float_complex,\n        incx: i64,\n        batch_count: i64,\n        result: *mut i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_izamin_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *const rocblas_double_complex,\n        incx: i64,\n        batch_count: i64,\n        result: *mut i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\namin_strided_batched finds the first index of the element of minimum magnitude of each vector x_i in a batch, for i = 1, ..., batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nnumber of elements in each vector x_i.\n@param[in]\nx         device pointer to the first vector x_1.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i. incx must be > 0.\n@param[in]\nstridex   [rocblas_stride]\nspecifies the pointer increment between one x_i and the next x_(i + 1).\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n@param[out]\nresult\ndevice or host pointer to array for storing contiguous batch_count results.\nreturn is 0 if n <= 0, incx<=0.\n*/\n    pub fn rocblas_isamin_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const f32,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        batch_count: rocblas_int,\n        result: *mut rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_idamin_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const f64,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        batch_count: rocblas_int,\n        result: *mut rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_icamin_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        batch_count: rocblas_int,\n        result: *mut rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_izamin_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        batch_count: rocblas_int,\n        result: *mut rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_isamin_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const f32,\n        incx: i64,\n        stridex: rocblas_stride,\n        batch_count: i64,\n        result: *mut i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_idamin_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const f64,\n        incx: i64,\n        stridex: rocblas_stride,\n        batch_count: i64,\n        result: *mut i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_icamin_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        batch_count: i64,\n        result: *mut i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_izamin_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        batch_count: i64,\n        result: *mut i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\nrot applies the Givens rotation matrix defined by c=cos(alpha) and s=sin(alpha) to vectors x and y.\nScalars c and s may be stored in either host or device memory. Location is specified by calling rocblas_set_pointer_mode.\n\n@param[in]\nhandle  [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn       [rocblas_int]\nnumber of elements in the x and y vectors.\n@param[in, out]\nx       device pointer storing vector x.\n@param[in]\nincx    [rocblas_int]\nspecifies the increment between elements of x.\n@param[in, out]\ny       device pointer storing vector y.\n@param[in]\nincy    [rocblas_int]\nspecifies the increment between elements of y.\n@param[in]\nc       device pointer or host pointer storing scalar cosine component of the rotation matrix.\n@param[in]\ns       device pointer or host pointer storing scalar sine component of the rotation matrix.\n*/\n    pub fn rocblas_srot(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *mut f32,\n        incx: rocblas_int,\n        y: *mut f32,\n        incy: rocblas_int,\n        c: *const f32,\n        s: *const f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_drot(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *mut f64,\n        incx: rocblas_int,\n        y: *mut f64,\n        incy: rocblas_int,\n        c: *const f64,\n        s: *const f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_crot(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *mut rocblas_float_complex,\n        incx: rocblas_int,\n        y: *mut rocblas_float_complex,\n        incy: rocblas_int,\n        c: *const f32,\n        s: *const rocblas_float_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csrot(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *mut rocblas_float_complex,\n        incx: rocblas_int,\n        y: *mut rocblas_float_complex,\n        incy: rocblas_int,\n        c: *const f32,\n        s: *const f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zrot(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *mut rocblas_double_complex,\n        incx: rocblas_int,\n        y: *mut rocblas_double_complex,\n        incy: rocblas_int,\n        c: *const f64,\n        s: *const rocblas_double_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdrot(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *mut rocblas_double_complex,\n        incx: rocblas_int,\n        y: *mut rocblas_double_complex,\n        incy: rocblas_int,\n        c: *const f64,\n        s: *const f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_srot_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *mut f32,\n        incx: i64,\n        y: *mut f32,\n        incy: i64,\n        c: *const f32,\n        s: *const f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_drot_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *mut f64,\n        incx: i64,\n        y: *mut f64,\n        incy: i64,\n        c: *const f64,\n        s: *const f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_crot_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *mut rocblas_float_complex,\n        incx: i64,\n        y: *mut rocblas_float_complex,\n        incy: i64,\n        c: *const f32,\n        s: *const rocblas_float_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csrot_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *mut rocblas_float_complex,\n        incx: i64,\n        y: *mut rocblas_float_complex,\n        incy: i64,\n        c: *const f32,\n        s: *const f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zrot_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *mut rocblas_double_complex,\n        incx: i64,\n        y: *mut rocblas_double_complex,\n        incy: i64,\n        c: *const f64,\n        s: *const rocblas_double_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdrot_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *mut rocblas_double_complex,\n        incx: i64,\n        y: *mut rocblas_double_complex,\n        incy: i64,\n        c: *const f64,\n        s: *const f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\nrot_batched applies the Givens rotation matrix defined by c=cos(alpha) and s=sin(alpha) to batched vectors x_i and y_i, for i = 1, ..., batch_count.\nScalars c and s may be stored in either host or device memory. Location is specified by calling rocblas_set_pointer_mode.\n\n@param[in]\nhandle  [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn       [rocblas_int]\nnumber of elements in each x_i and y_i vectors.\n@param[in, out]\nx       device array of deivce pointers storing each vector x_i.\n@param[in]\nincx    [rocblas_int]\nspecifies the increment between elements of each x_i.\n@param[in, out]\ny       device array of device pointers storing each vector y_i.\n@param[in]\nincy    [rocblas_int]\nspecifies the increment between elements of each y_i.\n@param[in]\nc       device pointer or host pointer to scalar cosine component of the rotation matrix.\n@param[in]\ns       device pointer or host pointer to scalar sine component of the rotation matrix.\n@param[in]\nbatch_count [rocblas_int]\nthe number of x and y arrays, i.e. the number of batches.\n*/\n    pub fn rocblas_srot_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *mut f32,\n        incx: rocblas_int,\n        y: *const *mut f32,\n        incy: rocblas_int,\n        c: *const f32,\n        s: *const f32,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_drot_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *mut f64,\n        incx: rocblas_int,\n        y: *const *mut f64,\n        incy: rocblas_int,\n        c: *const f64,\n        s: *const f64,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_crot_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *mut rocblas_float_complex,\n        incx: rocblas_int,\n        y: *const *mut rocblas_float_complex,\n        incy: rocblas_int,\n        c: *const f32,\n        s: *const rocblas_float_complex,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csrot_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *mut rocblas_float_complex,\n        incx: rocblas_int,\n        y: *const *mut rocblas_float_complex,\n        incy: rocblas_int,\n        c: *const f32,\n        s: *const f32,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zrot_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *mut rocblas_double_complex,\n        incx: rocblas_int,\n        y: *const *mut rocblas_double_complex,\n        incy: rocblas_int,\n        c: *const f64,\n        s: *const rocblas_double_complex,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdrot_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *mut rocblas_double_complex,\n        incx: rocblas_int,\n        y: *const *mut rocblas_double_complex,\n        incy: rocblas_int,\n        c: *const f64,\n        s: *const f64,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_srot_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *mut f32,\n        incx: i64,\n        y: *const *mut f32,\n        incy: i64,\n        c: *const f32,\n        s: *const f32,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_drot_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *mut f64,\n        incx: i64,\n        y: *const *mut f64,\n        incy: i64,\n        c: *const f64,\n        s: *const f64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_crot_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *mut rocblas_float_complex,\n        incx: i64,\n        y: *const *mut rocblas_float_complex,\n        incy: i64,\n        c: *const f32,\n        s: *const rocblas_float_complex,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csrot_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *mut rocblas_float_complex,\n        incx: i64,\n        y: *const *mut rocblas_float_complex,\n        incy: i64,\n        c: *const f32,\n        s: *const f32,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zrot_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *mut rocblas_double_complex,\n        incx: i64,\n        y: *const *mut rocblas_double_complex,\n        incy: i64,\n        c: *const f64,\n        s: *const rocblas_double_complex,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdrot_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *mut rocblas_double_complex,\n        incx: i64,\n        y: *const *mut rocblas_double_complex,\n        incy: i64,\n        c: *const f64,\n        s: *const f64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\nrot_strided_batched applies the Givens rotation matrix defined by c=cos(alpha) and s=sin(alpha) to strided batched vectors x_i and y_i, for i = 1, ..., batch_count.\nScalars c and s may be stored in either host or device memory, location is specified by calling rocblas_set_pointer_mode.\n\n@param[in]\nhandle  [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn       [rocblas_int]\nnumber of elements in each x_i and y_i vectors.\n@param[in, out]\nx       device pointer to the first vector x_1.\n@param[in]\nincx    [rocblas_int]\nspecifies the increment between elements of each x_i.\n@param[in]\nstride_x [rocblas_stride]\nspecifies the increment from the beginning of x_i to the beginning of x_(i+1).\n@param[in, out]\ny       device pointer to the first vector y_1.\n@param[in]\nincy    [rocblas_int]\nspecifies the increment between elements of each y_i.\n@param[in]\nstride_y [rocblas_stride]\nspecifies the increment from the beginning of y_i to the beginning of y_(i+1)\n@param[in]\nc       device pointer or host pointer to scalar cosine component of the rotation matrix.\n@param[in]\ns       device pointer or host pointer to scalar sine component of the rotation matrix.\n@param[in]\nbatch_count [rocblas_int]\nthe number of x and y arrays, i.e. the number of batches.\n*/\n    pub fn rocblas_srot_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *mut f32,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        y: *mut f32,\n        incy: rocblas_int,\n        stride_y: rocblas_stride,\n        c: *const f32,\n        s: *const f32,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_drot_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *mut f64,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        y: *mut f64,\n        incy: rocblas_int,\n        stride_y: rocblas_stride,\n        c: *const f64,\n        s: *const f64,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_crot_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *mut rocblas_float_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        y: *mut rocblas_float_complex,\n        incy: rocblas_int,\n        stride_y: rocblas_stride,\n        c: *const f32,\n        s: *const rocblas_float_complex,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csrot_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *mut rocblas_float_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        y: *mut rocblas_float_complex,\n        incy: rocblas_int,\n        stride_y: rocblas_stride,\n        c: *const f32,\n        s: *const f32,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zrot_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *mut rocblas_double_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        y: *mut rocblas_double_complex,\n        incy: rocblas_int,\n        stride_y: rocblas_stride,\n        c: *const f64,\n        s: *const rocblas_double_complex,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdrot_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *mut rocblas_double_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        y: *mut rocblas_double_complex,\n        incy: rocblas_int,\n        stride_y: rocblas_stride,\n        c: *const f64,\n        s: *const f64,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_srot_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *mut f32,\n        incx: i64,\n        stride_x: rocblas_stride,\n        y: *mut f32,\n        incy: i64,\n        stride_y: rocblas_stride,\n        c: *const f32,\n        s: *const f32,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_drot_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *mut f64,\n        incx: i64,\n        stride_x: rocblas_stride,\n        y: *mut f64,\n        incy: i64,\n        stride_y: rocblas_stride,\n        c: *const f64,\n        s: *const f64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_crot_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *mut rocblas_float_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        y: *mut rocblas_float_complex,\n        incy: i64,\n        stride_y: rocblas_stride,\n        c: *const f32,\n        s: *const rocblas_float_complex,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csrot_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *mut rocblas_float_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        y: *mut rocblas_float_complex,\n        incy: i64,\n        stride_y: rocblas_stride,\n        c: *const f32,\n        s: *const f32,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zrot_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *mut rocblas_double_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        y: *mut rocblas_double_complex,\n        incy: i64,\n        stride_y: rocblas_stride,\n        c: *const f64,\n        s: *const rocblas_double_complex,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdrot_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *mut rocblas_double_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        y: *mut rocblas_double_complex,\n        incy: i64,\n        stride_y: rocblas_stride,\n        c: *const f64,\n        s: *const f64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\nrotg creates the Givens rotation matrix for the vector (a b).\nScalars a, b, c, and s may be stored in either host or device memory, location is specified by\ncalling rocblas_set_pointer_mode. The computation uses the formulas\n\nsigma = sgn(a)    if |a| >  |b|\n= sgn(b)    if |b| >= |a|\nr = sigma*sqrt( a**2 + b**2 )\nc = 1; s = 0      if r = 0\nc = a/r; s = b/r  if r != 0\n\nThe subroutine also computes\n\nz = s    if |a| > |b|,\n= 1/c  if |b| >= |a| and c != 0\n= 1    if c = 0\n\nThis allows c and s to be reconstructed from z as follows:\n\nIf z = 1, set c = 0, s = 1.\nIf |z| < 1, set c = sqrt(1 - z**2) and s = z.\nIf |z| > 1, set c = 1/z and s = sqrt( 1 - c**2).\n\n@param[in]\nhandle  [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in, out]\na       pointer to a, an element in vector (a,b), overwritten with r.\n@param[in, out]\nb       pointer to b, an element in vector (a,b), overwritten with z.\n@param[out]\nc       pointer to c, cosine element of Givens rotation.\n@param[out]\ns       pointer to s, sine element of Givens rotation.\n*/\n    pub fn rocblas_srotg(\n        handle: rocblas_handle,\n        a: *mut f32,\n        b: *mut f32,\n        c: *mut f32,\n        s: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_drotg(\n        handle: rocblas_handle,\n        a: *mut f64,\n        b: *mut f64,\n        c: *mut f64,\n        s: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_crotg(\n        handle: rocblas_handle,\n        a: *mut rocblas_float_complex,\n        b: *mut rocblas_float_complex,\n        c: *mut f32,\n        s: *mut rocblas_float_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zrotg(\n        handle: rocblas_handle,\n        a: *mut rocblas_double_complex,\n        b: *mut rocblas_double_complex,\n        c: *mut f64,\n        s: *mut rocblas_double_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_srotg_64(\n        handle: rocblas_handle,\n        a: *mut f32,\n        b: *mut f32,\n        c: *mut f32,\n        s: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_drotg_64(\n        handle: rocblas_handle,\n        a: *mut f64,\n        b: *mut f64,\n        c: *mut f64,\n        s: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_crotg_64(\n        handle: rocblas_handle,\n        a: *mut rocblas_float_complex,\n        b: *mut rocblas_float_complex,\n        c: *mut f32,\n        s: *mut rocblas_float_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zrotg_64(\n        handle: rocblas_handle,\n        a: *mut rocblas_double_complex,\n        b: *mut rocblas_double_complex,\n        c: *mut f64,\n        s: *mut rocblas_double_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\nrotg_batched creates the Givens rotation matrix for the batched vectors (a_i b_i), for i = 1, ..., batch_count.\na, b, c, and s are host pointers to an array of device pointers on the device, where each device pointer points\nto a scalar value of a_i, b_i, c_i, or s_i.\n\n@param[in]\nhandle  [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in, out]\na       a, overwritten with r.\n@param[in, out]\nb       b overwritten with z.\n@param[out]\nc       cosine element of Givens rotation for the batch.\n@param[out]\ns       sine element of Givens rotation for the batch.\n@param[in]\nbatch_count [rocblas_int]\nnumber of batches (length of arrays a, b, c, and s).\n*/\n    pub fn rocblas_srotg_batched(\n        handle: rocblas_handle,\n        a: *const *mut f32,\n        b: *const *mut f32,\n        c: *const *mut f32,\n        s: *const *mut f32,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_drotg_batched(\n        handle: rocblas_handle,\n        a: *const *mut f64,\n        b: *const *mut f64,\n        c: *const *mut f64,\n        s: *const *mut f64,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_crotg_batched(\n        handle: rocblas_handle,\n        a: *const *mut rocblas_float_complex,\n        b: *const *mut rocblas_float_complex,\n        c: *const *mut f32,\n        s: *const *mut rocblas_float_complex,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zrotg_batched(\n        handle: rocblas_handle,\n        a: *const *mut rocblas_double_complex,\n        b: *const *mut rocblas_double_complex,\n        c: *const *mut f64,\n        s: *const *mut rocblas_double_complex,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_srotg_batched_64(\n        handle: rocblas_handle,\n        a: *const *mut f32,\n        b: *const *mut f32,\n        c: *const *mut f32,\n        s: *const *mut f32,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_drotg_batched_64(\n        handle: rocblas_handle,\n        a: *const *mut f64,\n        b: *const *mut f64,\n        c: *const *mut f64,\n        s: *const *mut f64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_crotg_batched_64(\n        handle: rocblas_handle,\n        a: *const *mut rocblas_float_complex,\n        b: *const *mut rocblas_float_complex,\n        c: *const *mut f32,\n        s: *const *mut rocblas_float_complex,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zrotg_batched_64(\n        handle: rocblas_handle,\n        a: *const *mut rocblas_double_complex,\n        b: *const *mut rocblas_double_complex,\n        c: *const *mut f64,\n        s: *const *mut rocblas_double_complex,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\nrotg_strided_batched creates the Givens rotation matrix for the strided batched vectors (a_i b_i), for i = 1, ..., batch_count.\na, b, c, and s are host pointers to arrays a, b, c, s on the device.\n\n@param[in]\nhandle  [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in, out]\na       host pointer to first single input vector element a_1 on the device, overwritten with r.\n@param[in]\nstride_a [rocblas_stride]\ndistance between elements of a in batch (distance between a_i and a_(i + 1)).\n@param[in, out]\nb       host pointer to first single input vector element b_1 on the device, overwritten with z.\n@param[in]\nstride_b [rocblas_stride]\ndistance between elements of b in batch (distance between b_i and b_(i + 1)).\n@param[out]\nc       host pointer to first single cosine element of Givens rotations c_1 on the device.\n@param[in]\nstride_c [rocblas_stride]\ndistance between elements of c in batch (distance between c_i and c_(i + 1)).\n@param[out]\ns       host pointer to first single sine element of Givens rotations s_1 on the device.\n@param[in]\nstride_s [rocblas_stride]\ndistance between elements of s in batch (distance between s_i and s_(i + 1)).\n@param[in]\nbatch_count [rocblas_int]\nnumber of batches (length of arrays a, b, c, and s).\n*/\n    pub fn rocblas_srotg_strided_batched(\n        handle: rocblas_handle,\n        a: *mut f32,\n        stride_a: rocblas_stride,\n        b: *mut f32,\n        stride_b: rocblas_stride,\n        c: *mut f32,\n        stride_c: rocblas_stride,\n        s: *mut f32,\n        stride_s: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_drotg_strided_batched(\n        handle: rocblas_handle,\n        a: *mut f64,\n        stride_a: rocblas_stride,\n        b: *mut f64,\n        stride_b: rocblas_stride,\n        c: *mut f64,\n        stride_c: rocblas_stride,\n        s: *mut f64,\n        stride_s: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_crotg_strided_batched(\n        handle: rocblas_handle,\n        a: *mut rocblas_float_complex,\n        stride_a: rocblas_stride,\n        b: *mut rocblas_float_complex,\n        stride_b: rocblas_stride,\n        c: *mut f32,\n        stride_c: rocblas_stride,\n        s: *mut rocblas_float_complex,\n        stride_s: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zrotg_strided_batched(\n        handle: rocblas_handle,\n        a: *mut rocblas_double_complex,\n        stride_a: rocblas_stride,\n        b: *mut rocblas_double_complex,\n        stride_b: rocblas_stride,\n        c: *mut f64,\n        stride_c: rocblas_stride,\n        s: *mut rocblas_double_complex,\n        stride_s: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_srotg_strided_batched_64(\n        handle: rocblas_handle,\n        a: *mut f32,\n        stride_a: rocblas_stride,\n        b: *mut f32,\n        stride_b: rocblas_stride,\n        c: *mut f32,\n        stride_c: rocblas_stride,\n        s: *mut f32,\n        stride_s: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_drotg_strided_batched_64(\n        handle: rocblas_handle,\n        a: *mut f64,\n        stride_a: rocblas_stride,\n        b: *mut f64,\n        stride_b: rocblas_stride,\n        c: *mut f64,\n        stride_c: rocblas_stride,\n        s: *mut f64,\n        stride_s: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_crotg_strided_batched_64(\n        handle: rocblas_handle,\n        a: *mut rocblas_float_complex,\n        stride_a: rocblas_stride,\n        b: *mut rocblas_float_complex,\n        stride_b: rocblas_stride,\n        c: *mut f32,\n        stride_c: rocblas_stride,\n        s: *mut rocblas_float_complex,\n        stride_s: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zrotg_strided_batched_64(\n        handle: rocblas_handle,\n        a: *mut rocblas_double_complex,\n        stride_a: rocblas_stride,\n        b: *mut rocblas_double_complex,\n        stride_b: rocblas_stride,\n        c: *mut f64,\n        stride_c: rocblas_stride,\n        s: *mut rocblas_double_complex,\n        stride_s: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\nrotm applies the modified Givens rotation matrix defined by param to vectors x and y.\n\n@param[in]\nhandle  [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn       [rocblas_int]\nnumber of elements in the x and y vectors.\n@param[in, out]\nx       device pointer storing vector x.\n@param[in]\nincx    [rocblas_int]\nspecifies the increment between elements of x.\n@param[in, out]\ny       device pointer storing vector y.\n@param[in]\nincy    [rocblas_int]\nspecifies the increment between elements of y.\n@param[in]\nparam   device vector or host vector of 5 elements defining the rotation.\n\nparam[0] = flag\nparam[1] = H11\nparam[2] = H21\nparam[3] = H12\nparam[4] = H22\n\nThe flag parameter defines the form of H:\n\nflag = -1 => H = ( H11 H12 H21 H22 )\nflag =  0 => H = ( 1.0 H12 H21 1.0 )\nflag =  1 => H = ( H11 1.0 -1.0 H22 )\nflag = -2 => H = ( 1.0 0.0 0.0 1.0 )\n\nparam may be stored in either host or device memory,\nlocation is specified by calling rocblas_set_pointer_mode.\n*/\n    pub fn rocblas_srotm(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *mut f32,\n        incx: rocblas_int,\n        y: *mut f32,\n        incy: rocblas_int,\n        param: *const f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_drotm(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *mut f64,\n        incx: rocblas_int,\n        y: *mut f64,\n        incy: rocblas_int,\n        param: *const f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_srotm_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *mut f32,\n        incx: i64,\n        y: *mut f32,\n        incy: i64,\n        param: *const f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_drotm_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *mut f64,\n        incx: i64,\n        y: *mut f64,\n        incy: i64,\n        param: *const f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\nrotm_batched applies the modified Givens rotation matrix defined by param_i to batched vectors x_i and y_i, for i = 1, ..., batch_count.\n\n@param[in]\nhandle  [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn       [rocblas_int]\nnumber of elements in the x and y vectors.\n@param[in, out]\nx       device array of device pointers storing each vector x_i.\n@param[in]\nincx    [rocblas_int]\nspecifies the increment between elements of each x_i.\n@param[in, out]\ny       device array of device pointers storing each vector y_1.\n@param[in]\nincy    [rocblas_int]\nspecifies the increment between elements of each y_i.\n@param[in]\nparam   device array of device vectors of 5 elements defining the rotation.\n\nparam[0] = flag\nparam[1] = H11\nparam[2] = H21\nparam[3] = H12\nparam[4] = H22\n\nThe flag parameter defines the form of H:\n\nflag = -1 => H = ( H11 H12 H21 H22 )\nflag =  0 => H = ( 1.0 H12 H21 1.0 )\nflag =  1 => H = ( H11 1.0 -1.0 H22 )\nflag = -2 => H = ( 1.0 0.0 0.0 1.0 )\n\nparam may ONLY be stored on the device for the batched version of this function.\n\n@param[in]\nbatch_count [rocblas_int]\nthe number of x and y arrays, i.e. the number of batches.\n*/\n    pub fn rocblas_srotm_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *mut f32,\n        incx: rocblas_int,\n        y: *const *mut f32,\n        incy: rocblas_int,\n        param: *const *const f32,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_drotm_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const *mut f64,\n        incx: rocblas_int,\n        y: *const *mut f64,\n        incy: rocblas_int,\n        param: *const *const f64,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_srotm_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *mut f32,\n        incx: i64,\n        y: *const *mut f32,\n        incy: i64,\n        param: *const *const f32,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_drotm_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const *mut f64,\n        incx: i64,\n        y: *const *mut f64,\n        incy: i64,\n        param: *const *const f64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\nrotm_strided_batched applies the modified Givens rotation matrix defined by param_i to strided batched vectors x_i and y_i, for i = 1, ..., batch_count\n\n@param[in]\nhandle  [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn       [rocblas_int]\nnumber of elements in the x and y vectors.\n@param[in, out]\nx       device pointer pointing to first strided batched vector x_1.\n@param[in]\nincx    [rocblas_int]\nspecifies the increment between elements of each x_i.\n@param[in]\nstride_x [rocblas_stride]\nspecifies the increment between the beginning of x_i and x_(i + 1)\n@param[in, out]\ny       device pointer pointing to first strided batched vector y_1.\n@param[in]\nincy    [rocblas_int]\nspecifies the increment between elements of each y_i.\n@param[in]\nstride_y [rocblas_stride]\nspecifies the increment between the beginning of y_i and y_(i + 1).\n@param[in]\nparam   device pointer pointing to first array of 5 elements defining the rotation (param_1).\n\nparam[0] = flag\nparam[1] = H11\nparam[2] = H21\nparam[3] = H12\nparam[4] = H22\n\nThe flag parameter defines the form of H:\n\nflag = -1 => H = ( H11 H12 H21 H22 )\nflag =  0 => H = ( 1.0 H12 H21 1.0 )\nflag =  1 => H = ( H11 1.0 -1.0 H22 )\nflag = -2 => H = ( 1.0 0.0 0.0 1.0 )\n\nparam may ONLY be stored on the device for the strided_batched\nversion of this function.\n\n@param[in]\nstride_param [rocblas_stride]\nspecifies the increment between the beginning of param_i and param_(i + 1).\n@param[in]\nbatch_count [rocblas_int]\nthe number of x and y arrays, i.e. the number of batches.\n*/\n    pub fn rocblas_srotm_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *mut f32,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        y: *mut f32,\n        incy: rocblas_int,\n        stride_y: rocblas_stride,\n        param: *const f32,\n        stride_param: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_drotm_strided_batched(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *mut f64,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        y: *mut f64,\n        incy: rocblas_int,\n        stride_y: rocblas_stride,\n        param: *const f64,\n        stride_param: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_srotm_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *mut f32,\n        incx: i64,\n        stride_x: rocblas_stride,\n        y: *mut f32,\n        incy: i64,\n        stride_y: rocblas_stride,\n        param: *const f32,\n        stride_param: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_drotm_strided_batched_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *mut f64,\n        incx: i64,\n        stride_x: rocblas_stride,\n        y: *mut f64,\n        incy: i64,\n        stride_y: rocblas_stride,\n        param: *const f64,\n        stride_param: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\nrotmg creates the modified Givens rotation matrix for the vector (d1 * x1, d2 * y1).\nParameters may be stored in either host or device memory. Location is specified by calling rocblas_set_pointer_mode:\n\n@param[in]\nhandle  [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in, out]\nd1      device pointer or host pointer to input scalar that is overwritten.\n@param[in, out]\nd2      device pointer or host pointer to input scalar that is overwritten.\n@param[in, out]\nx1      device pointer or host pointer to input scalar that is overwritten.\n@param[in]\ny1      device pointer or host pointer to input scalar.\n@param[out]\nparam   device vector or host vector of five elements defining the rotation.\n\nparam[0] = flag\nparam[1] = H11\nparam[2] = H21\nparam[3] = H12\nparam[4] = H22\n\nThe flag parameter defines the form of H:\n\nflag = -1 => H = ( H11 H12 H21 H22 )\nflag =  0 => H = ( 1.0 H12 H21 1.0 )\nflag =  1 => H = ( H11 1.0 -1.0 H22 )\nflag = -2 => H = ( 1.0 0.0 0.0 1.0 )\n\nparam may be stored in either host or device memory.\nLocation is specified by calling rocblas_set_pointer_mode.\n*/\n    pub fn rocblas_srotmg(\n        handle: rocblas_handle,\n        d1: *mut f32,\n        d2: *mut f32,\n        x1: *mut f32,\n        y1: *const f32,\n        param: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_drotmg(\n        handle: rocblas_handle,\n        d1: *mut f64,\n        d2: *mut f64,\n        x1: *mut f64,\n        y1: *const f64,\n        param: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_srotmg_64(\n        handle: rocblas_handle,\n        d1: *mut f32,\n        d2: *mut f32,\n        x1: *mut f32,\n        y1: *const f32,\n        param: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_drotmg_64(\n        handle: rocblas_handle,\n        d1: *mut f64,\n        d2: *mut f64,\n        x1: *mut f64,\n        y1: *const f64,\n        param: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\nrotmg_batched creates the modified Givens rotation matrix for the batched vectors (d1_i * x1_i, d2_i * y1_i), for i = 1, ..., batch_count.\nParameters may be stored in either host or device memory. Location is specified by calling rocblas_set_pointer_mode:\n\n- If the pointer mode is set to rocblas_pointer_mode_host, then this function blocks the CPU until the GPU has finished and the results are available in host memory.\n- If the pointer mode is set to rocblas_pointer_mode_device, then this function returns immediately and synchronization is required to read the results.\n\n@param[in]\nhandle  [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in, out]\nd1      device batched array or host batched array of input scalars that is overwritten.\n@param[in, out]\nd2      device batched array or host batched array of input scalars that is overwritten.\n@param[in, out]\nx1      device batched array or host batched array of input scalars that is overwritten.\n@param[in]\ny1      device batched array or host batched array of input scalars.\n@param[out]\nparam   device batched array or host batched array of vectors of 5 elements defining the rotation.\n\nparam[0] = flag\nparam[1] = H11\nparam[2] = H21\nparam[3] = H12\nparam[4] = H22\n\nThe flag parameter defines the form of H:\n\nflag = -1 => H = ( H11 H12 H21 H22 )\nflag =  0 => H = ( 1.0 H12 H21 1.0 )\nflag =  1 => H = ( H11 1.0 -1.0 H22 )\nflag = -2 => H = ( 1.0 0.0 0.0 1.0 )\n\nparam may be stored in either host or device memory.\nLocation is specified by calling rocblas_set_pointer_mode.\n\n@param[in]\nbatch_count [rocblas_int]\nthe number of instances in the batch.\n*/\n    pub fn rocblas_srotmg_batched(\n        handle: rocblas_handle,\n        d1: *const *mut f32,\n        d2: *const *mut f32,\n        x1: *const *mut f32,\n        y1: *const *const f32,\n        param: *const *mut f32,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_drotmg_batched(\n        handle: rocblas_handle,\n        d1: *const *mut f64,\n        d2: *const *mut f64,\n        x1: *const *mut f64,\n        y1: *const *const f64,\n        param: *const *mut f64,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_srotmg_batched_64(\n        handle: rocblas_handle,\n        d1: *const *mut f32,\n        d2: *const *mut f32,\n        x1: *const *mut f32,\n        y1: *const *const f32,\n        param: *const *mut f32,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_drotmg_batched_64(\n        handle: rocblas_handle,\n        d1: *const *mut f64,\n        d2: *const *mut f64,\n        x1: *const *mut f64,\n        y1: *const *const f64,\n        param: *const *mut f64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\nrotmg_strided_batched creates the modified Givens rotation matrix for the strided batched vectors (d1_i * x1_i, d2_i * y1_i), for i = 1, ..., batch_count.\nParameters may be stored in either host or device memory. Location is specified by calling rocblas_set_pointer_mode:\n\n- If the pointer mode is set to rocblas_pointer_mode_host, then this function blocks the CPU until the GPU has finished and the results are available in host memory.\n- If the pointer mode is set to rocblas_pointer_mode_device, then this function returns immediately and synchronization is required to read the results.\n\n@param[in]\nhandle  [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in, out]\nd1      device strided_batched array or host strided_batched array of input scalars that is overwritten.\n@param[in]\nstride_d1 [rocblas_stride]\nspecifies the increment between the beginning of d1_i and d1_(i+1).\n@param[in, out]\nd2      device strided_batched array or host strided_batched array of input scalars that is overwritten.\n@param[in]\nstride_d2 [rocblas_stride]\nspecifies the increment between the beginning of d2_i and d2_(i+1).\n@param[in, out]\nx1      device strided_batched array or host strided_batched array of input scalars that is overwritten.\n@param[in]\nstride_x1 [rocblas_stride]\nspecifies the increment between the beginning of x1_i and x1_(i+1).\n@param[in]\ny1      device strided_batched array or host strided_batched array of input scalars.\n@param[in]\nstride_y1 [rocblas_stride]\nspecifies the increment between the beginning of y1_i and y1_(i+1).\n@param[out]\nparam   device strided_batched array or host strided_batched array of vectors of 5 elements defining the rotation.\n\nparam[0] = flag\nparam[1] = H11\nparam[2] = H21\nparam[3] = H12\nparam[4] = H22\nThe flag parameter defines the form of H:\n\nflag = -1 => H = ( H11 H12 H21 H22 )\nflag =  0 => H = ( 1.0 H12 H21 1.0 )\nflag =  1 => H = ( H11 1.0 -1.0 H22 )\nflag = -2 => H = ( 1.0 0.0 0.0 1.0 )\n\nparam may be stored in either host or device memory.\nLocation is specified by calling rocblas_set_pointer_mode.\n\n@param[in]\nstride_param [rocblas_stride]\nspecifies the increment between the beginning of param_i and param_(i + 1).\n@param[in]\nbatch_count [rocblas_int]\nthe number of instances in the batch.\n*/\n    pub fn rocblas_srotmg_strided_batched(\n        handle: rocblas_handle,\n        d1: *mut f32,\n        stride_d1: rocblas_stride,\n        d2: *mut f32,\n        stride_d2: rocblas_stride,\n        x1: *mut f32,\n        stride_x1: rocblas_stride,\n        y1: *const f32,\n        stride_y1: rocblas_stride,\n        param: *mut f32,\n        stride_param: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_drotmg_strided_batched(\n        handle: rocblas_handle,\n        d1: *mut f64,\n        stride_d1: rocblas_stride,\n        d2: *mut f64,\n        stride_d2: rocblas_stride,\n        x1: *mut f64,\n        stride_x1: rocblas_stride,\n        y1: *const f64,\n        stride_y1: rocblas_stride,\n        param: *mut f64,\n        stride_param: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_srotmg_strided_batched_64(\n        handle: rocblas_handle,\n        d1: *mut f32,\n        stride_d1: rocblas_stride,\n        d2: *mut f32,\n        stride_d2: rocblas_stride,\n        x1: *mut f32,\n        stride_x1: rocblas_stride,\n        y1: *const f32,\n        stride_y1: rocblas_stride,\n        param: *mut f32,\n        stride_param: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_drotmg_strided_batched_64(\n        handle: rocblas_handle,\n        d1: *mut f64,\n        stride_d1: rocblas_stride,\n        d2: *mut f64,\n        stride_d2: rocblas_stride,\n        x1: *mut f64,\n        stride_x1: rocblas_stride,\n        y1: *const f64,\n        stride_y1: rocblas_stride,\n        param: *mut f64,\n        stride_param: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\ngbmv performs one of the matrix-vector operations:\n\ny := alpha*A*x    + beta*y,   or\ny := alpha*A**T*x + beta*y,   or\ny := alpha*A**H*x + beta*y,\nwhere alpha and beta are scalars, x and y are vectors and A is an\nm by n banded matrix with kl sub-diagonals and ku super-diagonals.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\ntrans     [rocblas_operation]\nindicates whether matrix A is tranposed (conjugated) or not.\n@param[in]\nm         [rocblas_int]\nnumber of rows of matrix A.\n@param[in]\nn         [rocblas_int]\nnumber of columns of matrix A.\n@param[in]\nkl        [rocblas_int]\nnumber of sub-diagonals of A.\n@param[in]\nku        [rocblas_int]\nnumber of super-diagonals of A.\n@param[in]\nalpha     device pointer or host pointer to scalar alpha.\n@param[in]\nA     device pointer storing banded matrix A.\nLeading (kl + ku + 1) by n part of the matrix contains the coefficients\nof the banded matrix. The leading diagonal resides in row (ku + 1) with\nthe first super-diagonal above on the RHS of row ku. The first sub-diagonal\nresides below on the LHS of row ku + 2. This propagates up and down across\nsub/super-diagonals.\n\nEx: (m = n = 7; ku = 2, kl = 2)\n1 2 3 0 0 0 0             0 0 3 3 3 3 3\n4 1 2 3 0 0 0             0 2 2 2 2 2 2\n5 4 1 2 3 0 0    ---->    1 1 1 1 1 1 1\n0 5 4 1 2 3 0             4 4 4 4 4 4 0\n0 0 5 4 1 2 3             5 5 5 5 5 0 0\n0 0 0 5 4 1 2             0 0 0 0 0 0 0\n0 0 0 0 5 4 1             0 0 0 0 0 0 0\n\nNote that the empty elements which do not correspond to data will not\nbe referenced.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A. Must be >= (kl + ku + 1).\n@param[in]\nx         device pointer storing vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n@param[in]\nbeta      device pointer or host pointer to scalar beta.\n@param[in, out]\ny         device pointer storing vector y.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of y.\n*/\n    pub fn rocblas_sgbmv(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        kl: rocblas_int,\n        ku: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocblas_int,\n        x: *const f32,\n        incx: rocblas_int,\n        beta: *const f32,\n        y: *mut f32,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgbmv(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        kl: rocblas_int,\n        ku: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocblas_int,\n        x: *const f64,\n        incx: rocblas_int,\n        beta: *const f64,\n        y: *mut f64,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgbmv(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        kl: rocblas_int,\n        ku: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        beta: *const rocblas_float_complex,\n        y: *mut rocblas_float_complex,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgbmv(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        kl: rocblas_int,\n        ku: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        beta: *const rocblas_double_complex,\n        y: *mut rocblas_double_complex,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sgbmv_64(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: i64,\n        n: i64,\n        kl: i64,\n        ku: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        x: *const f32,\n        incx: i64,\n        beta: *const f32,\n        y: *mut f32,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgbmv_64(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: i64,\n        n: i64,\n        kl: i64,\n        ku: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        x: *const f64,\n        incx: i64,\n        beta: *const f64,\n        y: *mut f64,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgbmv_64(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: i64,\n        n: i64,\n        kl: i64,\n        ku: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        beta: *const rocblas_float_complex,\n        y: *mut rocblas_float_complex,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgbmv_64(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: i64,\n        n: i64,\n        kl: i64,\n        ku: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        beta: *const rocblas_double_complex,\n        y: *mut rocblas_double_complex,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\ngbmv_batched performs one of the matrix-vector operations:\n\ny_i := alpha*A_i*x_i    + beta*y_i,   or\ny_i := alpha*A_i**T*x_i + beta*y_i,   or\ny_i := alpha*A_i**H*x_i + beta*y_i,\nwhere (A_i, x_i, y_i) is the i-th instance of the batch.\nalpha and beta are scalars, x_i and y_i are vectors and A_i is an\nm by n banded matrix with kl sub-diagonals and ku super-diagonals,\nfor i = 1, ..., batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\ntrans     [rocblas_operation]\nindicates whether matrix A is tranposed (conjugated) or not.\n@param[in]\nm         [rocblas_int]\nnumber of rows of each matrix A_i.\n@param[in]\nn         [rocblas_int]\nnumber of columns of each matrix A_i.\n@param[in]\nkl        [rocblas_int]\nnumber of sub-diagonals of each A_i.\n@param[in]\nku        [rocblas_int]\nnumber of super-diagonals of each A_i.\n@param[in]\nalpha     device pointer or host pointer to scalar alpha.\n@param[in]\nA     device array of device pointers storing each banded matrix A_i.\nLeading (kl + ku + 1) by n part of the matrix contains the coefficients\nof the banded matrix. The leading diagonal resides in row (ku + 1) with\nthe first super-diagonal above on the RHS of row ku. The first sub-diagonal\nresides below on the LHS of row ku + 2. This propagates up and down across\nsub/super-diagonals.\n\nEx: (m = n = 7; ku = 2, kl = 2)\n1 2 3 0 0 0 0             0 0 3 3 3 3 3\n4 1 2 3 0 0 0             0 2 2 2 2 2 2\n5 4 1 2 3 0 0    ---->    1 1 1 1 1 1 1\n0 5 4 1 2 3 0             4 4 4 4 4 4 0\n0 0 5 4 1 2 3             5 5 5 5 5 0 0\n0 0 0 5 4 1 2             0 0 0 0 0 0 0\n0 0 0 0 5 4 1             0 0 0 0 0 0 0\n\nNote that the empty elements which do not correspond to data will not\nbe referenced.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each A_i. Must be >= (kl + ku + 1)\n@param[in]\nx         device array of device pointers storing each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\nbeta      device pointer or host pointer to scalar beta.\n@param[in, out]\ny         device array of device pointers storing each vector y_i.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of each y_i.\n@param[in]\nbatch_count [rocblas_int]\nspecifies the number of instances in the batch.\n*/\n    pub fn rocblas_sgbmv_batched(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        kl: rocblas_int,\n        ku: rocblas_int,\n        alpha: *const f32,\n        A: *const *const f32,\n        lda: rocblas_int,\n        x: *const *const f32,\n        incx: rocblas_int,\n        beta: *const f32,\n        y: *const *mut f32,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgbmv_batched(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        kl: rocblas_int,\n        ku: rocblas_int,\n        alpha: *const f64,\n        A: *const *const f64,\n        lda: rocblas_int,\n        x: *const *const f64,\n        incx: rocblas_int,\n        beta: *const f64,\n        y: *const *mut f64,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgbmv_batched(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        kl: rocblas_int,\n        ku: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: rocblas_int,\n        x: *const *const rocblas_float_complex,\n        incx: rocblas_int,\n        beta: *const rocblas_float_complex,\n        y: *const *mut rocblas_float_complex,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgbmv_batched(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        kl: rocblas_int,\n        ku: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: rocblas_int,\n        x: *const *const rocblas_double_complex,\n        incx: rocblas_int,\n        beta: *const rocblas_double_complex,\n        y: *const *mut rocblas_double_complex,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sgbmv_batched_64(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: i64,\n        n: i64,\n        kl: i64,\n        ku: i64,\n        alpha: *const f32,\n        A: *const *const f32,\n        lda: i64,\n        x: *const *const f32,\n        incx: i64,\n        beta: *const f32,\n        y: *const *mut f32,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgbmv_batched_64(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: i64,\n        n: i64,\n        kl: i64,\n        ku: i64,\n        alpha: *const f64,\n        A: *const *const f64,\n        lda: i64,\n        x: *const *const f64,\n        incx: i64,\n        beta: *const f64,\n        y: *const *mut f64,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgbmv_batched_64(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: i64,\n        n: i64,\n        kl: i64,\n        ku: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: i64,\n        x: *const *const rocblas_float_complex,\n        incx: i64,\n        beta: *const rocblas_float_complex,\n        y: *const *mut rocblas_float_complex,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgbmv_batched_64(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: i64,\n        n: i64,\n        kl: i64,\n        ku: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: i64,\n        x: *const *const rocblas_double_complex,\n        incx: i64,\n        beta: *const rocblas_double_complex,\n        y: *const *mut rocblas_double_complex,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\ngbmv_strided_batched performs one of the matrix-vector operations:\n\ny_i := alpha*A_i*x_i    + beta*y_i,   or\ny_i := alpha*A_i**T*x_i + beta*y_i,   or\ny_i := alpha*A_i**H*x_i + beta*y_i,\nwhere (A_i, x_i, y_i) is the i-th instance of the batch.\nalpha and beta are scalars, x_i and y_i are vectors and A_i is an\nm by n banded matrix with kl sub-diagonals and ku super-diagonals,\nfor i = 1, ..., batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\ntrans     [rocblas_operation]\nindicates whether matrix A is tranposed (conjugated) or not.\n@param[in]\nm         [rocblas_int]\nnumber of rows of matrix A.\n@param[in]\nn         [rocblas_int]\nnumber of columns of matrix A.\n@param[in]\nkl        [rocblas_int]\nnumber of sub-diagonals of A.\n@param[in]\nku        [rocblas_int]\nnumber of super-diagonals of A.\n@param[in]\nalpha     device pointer or host pointer to scalar alpha.\n@param[in]\nA     device pointer to first banded matrix (A_1).\nLeading (kl + ku + 1) by n part of the matrix contains the coefficients\nof the banded matrix. The leading diagonal resides in row (ku + 1) with\nthe first super-diagonal above on the RHS of row ku. The first sub-diagonal\nresides below on the LHS of row ku + 2. This propagates up and down across\nsub/super-diagonals.\n\nEx: (m = n = 7; ku = 2, kl = 2)\n1 2 3 0 0 0 0             0 0 3 3 3 3 3\n4 1 2 3 0 0 0             0 2 2 2 2 2 2\n5 4 1 2 3 0 0    ---->    1 1 1 1 1 1 1\n0 5 4 1 2 3 0             4 4 4 4 4 4 0\n0 0 5 4 1 2 3             5 5 5 5 5 0 0\n0 0 0 5 4 1 2             0 0 0 0 0 0 0\n0 0 0 0 5 4 1             0 0 0 0 0 0 0\n\nNote that the empty elements which do not correspond to data will not\nbe referenced.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A. Must be >= (kl + ku + 1).\n@param[in]\nstride_A  [rocblas_stride]\nstride from the start of one matrix (A_i) and the next one (A_i+1).\n@param[in]\nx         device pointer to first vector (x_1).\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n@param[in]\nstride_x  [rocblas_stride]\nstride from the start of one vector (x_i) and the next one (x_i+1).\n@param[in]\nbeta      device pointer or host pointer to scalar beta.\n@param[in, out]\ny         device pointer to first vector (y_1).\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of y.\n@param[in]\nstride_y  [rocblas_stride]\nstride from the start of one vector (y_i) and the next one (x_i+1).\n@param[in]\nbatch_count [rocblas_int]\nspecifies the number of instances in the batch.\n*/\n    pub fn rocblas_sgbmv_strided_batched(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        kl: rocblas_int,\n        ku: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        x: *const f32,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        beta: *const f32,\n        y: *mut f32,\n        incy: rocblas_int,\n        stride_y: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgbmv_strided_batched(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        kl: rocblas_int,\n        ku: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        x: *const f64,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        beta: *const f64,\n        y: *mut f64,\n        incy: rocblas_int,\n        stride_y: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgbmv_strided_batched(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        kl: rocblas_int,\n        ku: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        beta: *const rocblas_float_complex,\n        y: *mut rocblas_float_complex,\n        incy: rocblas_int,\n        stride_y: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgbmv_strided_batched(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        kl: rocblas_int,\n        ku: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        beta: *const rocblas_double_complex,\n        y: *mut rocblas_double_complex,\n        incy: rocblas_int,\n        stride_y: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sgbmv_strided_batched_64(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: i64,\n        n: i64,\n        kl: i64,\n        ku: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        stride_A: rocblas_stride,\n        x: *const f32,\n        incx: i64,\n        stride_x: rocblas_stride,\n        beta: *const f32,\n        y: *mut f32,\n        incy: i64,\n        stride_y: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgbmv_strided_batched_64(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: i64,\n        n: i64,\n        kl: i64,\n        ku: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        stride_A: rocblas_stride,\n        x: *const f64,\n        incx: i64,\n        stride_x: rocblas_stride,\n        beta: *const f64,\n        y: *mut f64,\n        incy: i64,\n        stride_y: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgbmv_strided_batched_64(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: i64,\n        n: i64,\n        kl: i64,\n        ku: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        beta: *const rocblas_float_complex,\n        y: *mut rocblas_float_complex,\n        incy: i64,\n        stride_y: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgbmv_strided_batched_64(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: i64,\n        n: i64,\n        kl: i64,\n        ku: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        beta: *const rocblas_double_complex,\n        y: *mut rocblas_double_complex,\n        incy: i64,\n        stride_y: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\ngemv performs one of the matrix-vector operations:\n\ny := alpha*A*x    + beta*y,   or\ny := alpha*A**T*x + beta*y,   or\ny := alpha*A**H*x + beta*y,\nwhere alpha and beta are scalars, x and y are vectors and A is an\nm by n matrix.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\ntrans     [rocblas_operation]\nindicates whether matrix A is tranposed (conjugated) or not.\n@param[in]\nm         [rocblas_int]\nnumber of rows of matrix A.\n@param[in]\nn         [rocblas_int]\nnumber of columns of matrix A.\n@param[in]\nalpha     device pointer or host pointer to scalar alpha.\n@param[in]\nA         device pointer storing matrix A.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A.\n@param[in]\nx         device pointer storing vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n@param[in]\nbeta      device pointer or host pointer to scalar beta.\n@param[in, out]\ny         device pointer storing vector y.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of y.\n*/\n    pub fn rocblas_sgemv(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocblas_int,\n        x: *const f32,\n        incx: rocblas_int,\n        beta: *const f32,\n        y: *mut f32,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgemv(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocblas_int,\n        x: *const f64,\n        incx: rocblas_int,\n        beta: *const f64,\n        y: *mut f64,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgemv(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        beta: *const rocblas_float_complex,\n        y: *mut rocblas_float_complex,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgemv(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        beta: *const rocblas_double_complex,\n        y: *mut rocblas_double_complex,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sgemv_64(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        x: *const f32,\n        incx: i64,\n        beta: *const f32,\n        y: *mut f32,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgemv_64(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        x: *const f64,\n        incx: i64,\n        beta: *const f64,\n        y: *mut f64,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgemv_64(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        beta: *const rocblas_float_complex,\n        y: *mut rocblas_float_complex,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgemv_64(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        beta: *const rocblas_double_complex,\n        y: *mut rocblas_double_complex,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\ngemv_batched performs a batch of matrix-vector operations:\n\ny_i := alpha*A_i*x_i    + beta*y_i,   or\ny_i := alpha*A_i**T*x_i + beta*y_i,   or\ny_i := alpha*A_i**H*x_i + beta*y_i,\nwhere (A_i, x_i, y_i) is the i-th instance of the batch.\nalpha and beta are scalars, x_i and y_i are vectors and A_i is an\nm by n matrix, for i = 1, ..., batch_count.\n\n@param[in]\nhandle      [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\ntrans       [rocblas_operation]\nindicates whether matrices A_i are tranposed (conjugated) or not.\n@param[in]\nm           [rocblas_int]\nnumber of rows of each matrix A_i.\n@param[in]\nn           [rocblas_int]\nnumber of columns of each matrix A_i.\n@param[in]\nalpha       device pointer or host pointer to scalar alpha.\n@param[in]\nA           device array of device pointers storing each matrix A_i.\n@param[in]\nlda         [rocblas_int]\nspecifies the leading dimension of each matrix A_i.\n@param[in]\nx           device array of device pointers storing each vector x_i.\n@param[in]\nincx        [rocblas_int]\nspecifies the increment for the elements of each vector x_i.\n@param[in]\nbeta        device pointer or host pointer to scalar beta.\n@param[in, out]\ny           device array of device pointers storing each vector y_i.\n@param[in]\nincy        [rocblas_int]\nspecifies the increment for the elements of each vector y_i.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_sgemv_batched(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const *const f32,\n        lda: rocblas_int,\n        x: *const *const f32,\n        incx: rocblas_int,\n        beta: *const f32,\n        y: *const *mut f32,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgemv_batched(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f64,\n        A: *const *const f64,\n        lda: rocblas_int,\n        x: *const *const f64,\n        incx: rocblas_int,\n        beta: *const f64,\n        y: *const *mut f64,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgemv_batched(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: rocblas_int,\n        x: *const *const rocblas_float_complex,\n        incx: rocblas_int,\n        beta: *const rocblas_float_complex,\n        y: *const *mut rocblas_float_complex,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgemv_batched(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: rocblas_int,\n        x: *const *const rocblas_double_complex,\n        incx: rocblas_int,\n        beta: *const rocblas_double_complex,\n        y: *const *mut rocblas_double_complex,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_hshgemv_batched(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const *const rocblas_half,\n        lda: rocblas_int,\n        x: *const *const rocblas_half,\n        incx: rocblas_int,\n        beta: *const f32,\n        y: *const *mut rocblas_half,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_hssgemv_batched(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const *const rocblas_half,\n        lda: rocblas_int,\n        x: *const *const rocblas_half,\n        incx: rocblas_int,\n        beta: *const f32,\n        y: *const *mut f32,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_tstgemv_batched(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const *const rocblas_bfloat16,\n        lda: rocblas_int,\n        x: *const *const rocblas_bfloat16,\n        incx: rocblas_int,\n        beta: *const f32,\n        y: *const *mut rocblas_bfloat16,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_tssgemv_batched(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const *const rocblas_bfloat16,\n        lda: rocblas_int,\n        x: *const *const rocblas_bfloat16,\n        incx: rocblas_int,\n        beta: *const f32,\n        y: *const *mut f32,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sgemv_batched_64(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const *const f32,\n        lda: i64,\n        x: *const *const f32,\n        incx: i64,\n        beta: *const f32,\n        y: *const *mut f32,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgemv_batched_64(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const f64,\n        A: *const *const f64,\n        lda: i64,\n        x: *const *const f64,\n        incx: i64,\n        beta: *const f64,\n        y: *const *mut f64,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgemv_batched_64(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: i64,\n        x: *const *const rocblas_float_complex,\n        incx: i64,\n        beta: *const rocblas_float_complex,\n        y: *const *mut rocblas_float_complex,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgemv_batched_64(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: i64,\n        x: *const *const rocblas_double_complex,\n        incx: i64,\n        beta: *const rocblas_double_complex,\n        y: *const *mut rocblas_double_complex,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_hshgemv_batched_64(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const *const rocblas_half,\n        lda: i64,\n        x: *const *const rocblas_half,\n        incx: i64,\n        beta: *const f32,\n        y: *const *mut rocblas_half,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_hssgemv_batched_64(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const *const rocblas_half,\n        lda: i64,\n        x: *const *const rocblas_half,\n        incx: i64,\n        beta: *const f32,\n        y: *const *mut f32,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_tstgemv_batched_64(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const *const rocblas_bfloat16,\n        lda: i64,\n        x: *const *const rocblas_bfloat16,\n        incx: i64,\n        beta: *const f32,\n        y: *const *mut rocblas_bfloat16,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_tssgemv_batched_64(\n        handle: rocblas_handle,\n        trans: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const *const rocblas_bfloat16,\n        lda: i64,\n        x: *const *const rocblas_bfloat16,\n        incx: i64,\n        beta: *const f32,\n        y: *const *mut f32,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\ngemv_strided_batched performs a batch of matrix-vector operations:\n\ny_i := alpha*A_i*x_i    + beta*y_i,   or\ny_i := alpha*A_i**T*x_i + beta*y_i,   or\ny_i := alpha*A_i**H*x_i + beta*y_i,\nwhere (A_i, x_i, y_i) is the i-th instance of the batch.\nalpha and beta are scalars, x_i and y_i are vectors and A_i is an\nm by n matrix, for i = 1, ..., batch_count.\n\n@param[in]\nhandle      [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\ntransA      [rocblas_operation]\nindicates whether matrices A_i are tranposed (conjugated) or not.\n@param[in]\nm           [rocblas_int]\nnumber of rows of matrices A_i.\n@param[in]\nn           [rocblas_int]\nnumber of columns of matrices A_i.\n@param[in]\nalpha       device pointer or host pointer to scalar alpha.\n@param[in]\nA           device pointer to the first matrix (A_1) in the batch.\n@param[in]\nlda         [rocblas_int]\nspecifies the leading dimension of matrices A_i.\n@param[in]\nstrideA     [rocblas_stride]\nstride from the start of one matrix (A_i) and the next one (A_i+1).\n@param[in]\nx           device pointer to the first vector (x_1) in the batch.\n@param[in]\nincx        [rocblas_int]\nspecifies the increment for the elements of vectors x_i.\n@param[in]\nstridex     [rocblas_stride]\nstride from the start of one vector (x_i) and the next one (x_i+1).\nThere are no restrictions placed on stride_x. However, ensure that stride_x is of appropriate size. When trans equals rocblas_operation_none\nthis typically means stride_x >= n * incx, otherwise stride_x >= m * incx.\n@param[in]\nbeta        device pointer or host pointer to scalar beta.\n@param[in, out]\ny           device pointer to the first vector (y_1) in the batch.\n@param[in]\nincy        [rocblas_int]\nspecifies the increment for the elements of vectors y_i.\n@param[in]\nstridey     [rocblas_stride]\nstride from the start of one vector (y_i) and the next one (y_i+1).\nThere are no restrictions placed on stride_y. However, ensure that stride_y is of appropriate size. When trans equals rocblas_operation_none\nthis typically means stride_y >= m * incy, otherwise stride_y >= n * incy. stridey should be non zero.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_sgemv_strided_batched(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocblas_int,\n        strideA: rocblas_stride,\n        x: *const f32,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        beta: *const f32,\n        y: *mut f32,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgemv_strided_batched(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocblas_int,\n        strideA: rocblas_stride,\n        x: *const f64,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        beta: *const f64,\n        y: *mut f64,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgemv_strided_batched(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        strideA: rocblas_stride,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        beta: *const rocblas_float_complex,\n        y: *mut rocblas_float_complex,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgemv_strided_batched(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        strideA: rocblas_stride,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        beta: *const rocblas_double_complex,\n        y: *mut rocblas_double_complex,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_hshgemv_strided_batched(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const rocblas_half,\n        lda: rocblas_int,\n        strideA: rocblas_stride,\n        x: *const rocblas_half,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        beta: *const f32,\n        y: *mut rocblas_half,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_hssgemv_strided_batched(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const rocblas_half,\n        lda: rocblas_int,\n        strideA: rocblas_stride,\n        x: *const rocblas_half,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        beta: *const f32,\n        y: *mut f32,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_tstgemv_strided_batched(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const rocblas_bfloat16,\n        lda: rocblas_int,\n        strideA: rocblas_stride,\n        x: *const rocblas_bfloat16,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        beta: *const f32,\n        y: *mut rocblas_bfloat16,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_tssgemv_strided_batched(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const rocblas_bfloat16,\n        lda: rocblas_int,\n        strideA: rocblas_stride,\n        x: *const rocblas_bfloat16,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        beta: *const f32,\n        y: *mut f32,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sgemv_strided_batched_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        strideA: rocblas_stride,\n        x: *const f32,\n        incx: i64,\n        stridex: rocblas_stride,\n        beta: *const f32,\n        y: *mut f32,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgemv_strided_batched_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        strideA: rocblas_stride,\n        x: *const f64,\n        incx: i64,\n        stridex: rocblas_stride,\n        beta: *const f64,\n        y: *mut f64,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgemv_strided_batched_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        strideA: rocblas_stride,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        beta: *const rocblas_float_complex,\n        y: *mut rocblas_float_complex,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgemv_strided_batched_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        strideA: rocblas_stride,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        beta: *const rocblas_double_complex,\n        y: *mut rocblas_double_complex,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_hshgemv_strided_batched_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const rocblas_half,\n        lda: i64,\n        strideA: rocblas_stride,\n        x: *const rocblas_half,\n        incx: i64,\n        stridex: rocblas_stride,\n        beta: *const f32,\n        y: *mut rocblas_half,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_hssgemv_strided_batched_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const rocblas_half,\n        lda: i64,\n        strideA: rocblas_stride,\n        x: *const rocblas_half,\n        incx: i64,\n        stridex: rocblas_stride,\n        beta: *const f32,\n        y: *mut f32,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_tstgemv_strided_batched_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const rocblas_bfloat16,\n        lda: i64,\n        strideA: rocblas_stride,\n        x: *const rocblas_bfloat16,\n        incx: i64,\n        stridex: rocblas_stride,\n        beta: *const f32,\n        y: *mut rocblas_bfloat16,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_tssgemv_strided_batched_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const rocblas_bfloat16,\n        lda: i64,\n        strideA: rocblas_stride,\n        x: *const rocblas_bfloat16,\n        incx: i64,\n        stridex: rocblas_stride,\n        beta: *const f32,\n        y: *mut f32,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nhbmv performs the matrix-vector operations:\n\ny := alpha*A*x + beta*y\nwhere alpha and beta are scalars, x and y are n element vectors and A is an\nn by n Hermitian band matrix, with k super-diagonals.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\n- rocblas_fill_upper: The upper triangular part of A is being supplied.\n- rocblas_fill_lower: The lower triangular part of A is being supplied.\n@param[in]\nn         [rocblas_int]\nthe order of the matrix A.\n@param[in]\nk         [rocblas_int]\nthe number of super-diagonals of the matrix A. Must be >= 0.\n@param[in]\nalpha     device pointer or host pointer to scalar alpha.\n@param[in]\nA         device pointer storing matrix A. Of dimension (lda, n).\n\nif uplo == rocblas_fill_upper:\nThe leading (k + 1) by n part of A must contain the upper\ntriangular band part of the Hermitian matrix, with the leading\ndiagonal in row (k + 1), the first super-diagonal on the RHS\nof row k, etc.\nThe top left k by x triangle of A will not be referenced.\nEx (upper, lda = n = 4, k = 1):\nA                             Represented matrix\n(0,0) (5,9) (6,8) (7,7)       (1, 0) (5, 9) (0, 0) (0, 0)\n(1,0) (2,0) (3,0) (4,0)       (5,-9) (2, 0) (6, 8) (0, 0)\n(0,0) (0,0) (0,0) (0,0)       (0, 0) (6,-8) (3, 0) (7, 7)\n(0,0) (0,0) (0,0) (0,0)       (0, 0) (0, 0) (7,-7) (4, 0)\n\nif uplo == rocblas_fill_lower:\nThe leading (k + 1) by n part of A must contain the lower\ntriangular band part of the Hermitian matrix, with the leading\ndiagonal in row (1), the first sub-diagonal on the LHS of\nrow 2, etc.\nThe bottom right k by k triangle of A will not be referenced.\nEx (lower, lda = 2, n = 4, k = 1):\nA                               Represented matrix\n(1,0) (2,0) (3,0) (4,0)         (1, 0) (5,-9) (0, 0) (0, 0)\n(5,9) (6,8) (7,7) (0,0)         (5, 9) (2, 0) (6,-8) (0, 0)\n(0, 0) (6, 8) (3, 0) (7,-7)\n(0, 0) (0, 0) (7, 7) (4, 0)\n\nAs a Hermitian matrix, the imaginary part of the main diagonal\nof A will not be referenced and is assumed to be == 0.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A. must be >= k + 1.\n@param[in]\nx         device pointer storing vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n@param[in]\nbeta      device pointer or host pointer to scalar beta.\n@param[in, out]\ny         device pointer storing vector y.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of y.\n*/\n    pub fn rocblas_chbmv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        beta: *const rocblas_float_complex,\n        y: *mut rocblas_float_complex,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhbmv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        beta: *const rocblas_double_complex,\n        y: *mut rocblas_double_complex,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_chbmv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        beta: *const rocblas_float_complex,\n        y: *mut rocblas_float_complex,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhbmv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        beta: *const rocblas_double_complex,\n        y: *mut rocblas_double_complex,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nhbmv_batched performs one of the matrix-vector operations:\n\ny_i := alpha*A_i*x_i + beta*y_i\nwhere alpha and beta are scalars, x_i and y_i are n element vectors and A_i is an\nn by n Hermitian band matrix with k super-diagonals, for each batch in i = [1, batch_count].\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\n- rocblas_fill_upper: The upper triangular part of each A_i is being supplied.\n- rocblas_fill_lower: The lower triangular part of each A_i is being supplied.\n@param[in]\nn         [rocblas_int]\nthe order of each matrix A_i.\n@param[in]\nk         [rocblas_int]\nthe number of super-diagonals of each matrix A_i. Must be >= 0.\n@param[in]\nalpha     device pointer or host pointer to scalar alpha.\n@param[in]\nA         device array of device pointers storing each matrix_i A of dimension (lda, n).\n\nif uplo == rocblas_fill_upper:\nThe leading (k + 1) by n part of each A_i must contain the upper\ntriangular band part of the Hermitian matrix, with the leading\ndiagonal in row (k + 1), the first super-diagonal on the RHS\nof row k, etc.\nThe top left k by x triangle of each A_i will not be referenced.\nEx (upper, lda = n = 4, k = 1):\nA                             Represented matrix\n(0,0) (5,9) (6,8) (7,7)       (1, 0) (5, 9) (0, 0) (0, 0)\n(1,0) (2,0) (3,0) (4,0)       (5,-9) (2, 0) (6, 8) (0, 0)\n(0,0) (0,0) (0,0) (0,0)       (0, 0) (6,-8) (3, 0) (7, 7)\n(0,0) (0,0) (0,0) (0,0)       (0, 0) (0, 0) (7,-7) (4, 0)\n\nif uplo == rocblas_fill_lower:\nThe leading (k + 1) by n part of each A_i must contain the lower\ntriangular band part of the Hermitian matrix, with the leading\ndiagonal in row (1), the first sub-diagonal on the LHS of\nrow 2, etc.\nThe bottom right k by k triangle of each A_i will not be referenced.\nEx (lower, lda = 2, n = 4, k = 1):\nA                               Represented matrix\n(1,0) (2,0) (3,0) (4,0)         (1, 0) (5,-9) (0, 0) (0, 0)\n(5,9) (6,8) (7,7) (0,0)         (5, 9) (2, 0) (6,-8) (0, 0)\n(0, 0) (6, 8) (3, 0) (7,-7)\n(0, 0) (0, 0) (7, 7) (4, 0)\n\nAs a Hermitian matrix, the imaginary part of the main diagonal\nof each A_i will not be referenced and is assumed to be == 0.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each A_i. must be >= max(1, n).\n@param[in]\nx         device array of device pointers storing each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\nbeta      device pointer or host pointer to scalar beta.\n@param[in, out]\ny         device array of device pointers storing each vector y_i.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of y.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_chbmv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: rocblas_int,\n        x: *const *const rocblas_float_complex,\n        incx: rocblas_int,\n        beta: *const rocblas_float_complex,\n        y: *const *mut rocblas_float_complex,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhbmv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: rocblas_int,\n        x: *const *const rocblas_double_complex,\n        incx: rocblas_int,\n        beta: *const rocblas_double_complex,\n        y: *const *mut rocblas_double_complex,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_chbmv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: i64,\n        x: *const *const rocblas_float_complex,\n        incx: i64,\n        beta: *const rocblas_float_complex,\n        y: *const *mut rocblas_float_complex,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhbmv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: i64,\n        x: *const *const rocblas_double_complex,\n        incx: i64,\n        beta: *const rocblas_double_complex,\n        y: *const *mut rocblas_double_complex,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nhbmv_strided_batched performs one of the matrix-vector operations:\n\ny_i := alpha*A_i*x_i + beta*y_i\nwhere alpha and beta are scalars, x_i and y_i are n element vectors and A_i is an\nn by n Hermitian band matrix with k super-diagonals, for each batch in i = [1, batch_count].\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\n- rocblas_fill_upper: The upper triangular part of each A_i is being supplied.\n- rocblas_fill_lower: The lower triangular part of each A_i is being supplied.\n@param[in]\nn         [rocblas_int]\nthe order of each matrix A_i.\n@param[in]\nk         [rocblas_int]\nthe number of super-diagonals of each matrix A_i. Must be >= 0.\n@param[in]\nalpha     device pointer or host pointer to scalar alpha.\n@param[in]\nA         device array pointing to the first matrix A_1. Each A_i is of dimension (lda, n).\n\nif uplo == rocblas_fill_upper:\nThe leading (k + 1) by n part of each A_i must contain the upper\ntriangular band part of the Hermitian matrix, with the leading\ndiagonal in row (k + 1), the first super-diagonal on the RHS\nof row k, etc.\nThe top left k by x triangle of each A_i will not be referenced.\nEx (upper, lda = n = 4, k = 1):\nA                             Represented matrix\n(0,0) (5,9) (6,8) (7,7)       (1, 0) (5, 9) (0, 0) (0, 0)\n(1,0) (2,0) (3,0) (4,0)       (5,-9) (2, 0) (6, 8) (0, 0)\n(0,0) (0,0) (0,0) (0,0)       (0, 0) (6,-8) (3, 0) (7, 7)\n(0,0) (0,0) (0,0) (0,0)       (0, 0) (0, 0) (7,-7) (4, 0)\n\nif uplo == rocblas_fill_lower:\nThe leading (k + 1) by n part of each A_i must contain the lower\ntriangular band part of the Hermitian matrix, with the leading\ndiagonal in row (1), the first sub-diagonal on the LHS of\nrow 2, etc.\nThe bottom right k by k triangle of each A_i will not be referenced.\nEx (lower, lda = 2, n = 4, k = 1):\nA                               Represented matrix\n(1,0) (2,0) (3,0) (4,0)         (1, 0) (5,-9) (0, 0) (0, 0)\n(5,9) (6,8) (7,7) (0,0)         (5, 9) (2, 0) (6,-8) (0, 0)\n(0, 0) (6, 8) (3, 0) (7,-7)\n(0, 0) (0, 0) (7, 7) (4, 0)\n\nAs a Hermitian matrix, the imaginary part of the main diagonal\nof each A_i will not be referenced and is assumed to be == 0.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each A_i. must be >= max(1, n).\n@param[in]\nstride_A  [rocblas_stride]\nstride from the start of one matrix (A_i) and the next one (A_i+1).\n@param[in]\nx         device array pointing to the first vector y_1.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\nstride_x  [rocblas_stride]\nstride from the start of one vector (x_i) and the next one (x_i+1).\n@param[in]\nbeta      device pointer or host pointer to scalar beta.\n@param[in, out]\ny         device array pointing to the first vector y_1.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of y.\n@param[in]\nstride_y  [rocblas_stride]\nstride from the start of one vector (y_i) and the next one (y_i+1).\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_chbmv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        beta: *const rocblas_float_complex,\n        y: *mut rocblas_float_complex,\n        incy: rocblas_int,\n        stride_y: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhbmv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        beta: *const rocblas_double_complex,\n        y: *mut rocblas_double_complex,\n        incy: rocblas_int,\n        stride_y: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_chbmv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        beta: *const rocblas_float_complex,\n        y: *mut rocblas_float_complex,\n        incy: i64,\n        stride_y: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhbmv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        beta: *const rocblas_double_complex,\n        y: *mut rocblas_double_complex,\n        incy: i64,\n        stride_y: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nhemv performs one of the matrix-vector operations:\n\ny := alpha*A*x + beta*y\nwhere alpha and beta are scalars, x and y are n element vectors and A is an\nn by n Hermitian matrix.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\n- rocblas_fill_upper: the upper triangular part of the Hermitian matrix A is supplied.\n- rocblas_fill_lower: the lower triangular part of the Hermitian matrix A is supplied.\n@param[in]\nn         [rocblas_int]\nthe order of the matrix A.\n@param[in]\nalpha     device pointer or host pointer to scalar alpha.\n@param[in]\nA         device pointer storing matrix A. Of dimension (lda, n).\n\nif uplo == rocblas_fill_upper:\nThe upper triangular part of A must contain\nthe upper triangular part of a Hermitian matrix. The lower\ntriangular part of A will not be referenced.\n\nif uplo == rocblas_fill_lower:\nThe lower triangular part of A must contain\nthe lower triangular part of a Hermitian matrix. The upper\ntriangular part of A will not be referenced.\nAs a Hermitian matrix, the imaginary part of the main diagonal\nof A will not be referenced and is assumed to be == 0.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A. must be >= max(1, n).\n@param[in]\nx         device pointer storing vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n@param[in]\nbeta      device pointer or host pointer to scalar beta.\n@param[in, out]\ny         device pointer storing vector y.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of y.\n*/\n    pub fn rocblas_chemv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        beta: *const rocblas_float_complex,\n        y: *mut rocblas_float_complex,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhemv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        beta: *const rocblas_double_complex,\n        y: *mut rocblas_double_complex,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_chemv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        beta: *const rocblas_float_complex,\n        y: *mut rocblas_float_complex,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhemv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        beta: *const rocblas_double_complex,\n        y: *mut rocblas_double_complex,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nhemv_batched performs one of the matrix-vector operations:\n\ny_i := alpha*A_i*x_i + beta*y_i\nwhere alpha and beta are scalars, x_i and y_i are n element vectors and A_i is an\nn by n Hermitian matrix, for each batch in i = [1, batch_count].\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\n- rocblas_fill_upper: the upper triangular part of the Hermitian matrix A is supplied.\n- rocblas_fill_lower: the lower triangular part of the Hermitian matrix A is supplied.\n@param[in]\nn         [rocblas_int]\nthe order of each matrix A_i.\n@param[in]\nalpha     device pointer or host pointer to scalar alpha.\n@param[in]\nA         device array of device pointers storing each matrix A_i of dimension (lda, n).\n\nif uplo == rocblas_fill_upper:\nThe upper triangular part of each A_i must contain\nthe upper triangular part of a Hermitian matrix. The lower\ntriangular part of each A_i will not be referenced.\n\nif uplo == rocblas_fill_lower:\nThe lower triangular part of each A_i must contain\nthe lower triangular part of a Hermitian matrix. The upper\ntriangular part of each A_i will not be referenced.\nAs a Hermitian matrix, the imaginary part of the main diagonal\nof each A_i will not be referenced and is assumed to be == 0.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each A_i. must be >= max(1, n).\n@param[in]\nx         device array of device pointers storing each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\nbeta      device pointer or host pointer to scalar beta.\n@param[in, out]\ny         device array of device pointers storing each vector y_i.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of y.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_chemv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: rocblas_int,\n        x: *const *const rocblas_float_complex,\n        incx: rocblas_int,\n        beta: *const rocblas_float_complex,\n        y: *const *mut rocblas_float_complex,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhemv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: rocblas_int,\n        x: *const *const rocblas_double_complex,\n        incx: rocblas_int,\n        beta: *const rocblas_double_complex,\n        y: *const *mut rocblas_double_complex,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_chemv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: i64,\n        x: *const *const rocblas_float_complex,\n        incx: i64,\n        beta: *const rocblas_float_complex,\n        y: *const *mut rocblas_float_complex,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhemv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: i64,\n        x: *const *const rocblas_double_complex,\n        incx: i64,\n        beta: *const rocblas_double_complex,\n        y: *const *mut rocblas_double_complex,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nhemv_strided_batched performs one of the matrix-vector operations:\n\ny_i := alpha*A_i*x_i + beta*y_i\nwhere alpha and beta are scalars, x_i and y_i are n element vectors and A_i is an\nn by n Hermitian matrix, for each batch in i = [1, batch_count].\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\n- rocblas_fill_upper: the upper triangular part of the Hermitian matrix A is supplied.\n- rocblas_fill_lower: the lower triangular part of the Hermitian matrix A is supplied.\n@param[in]\nn         [rocblas_int]\nthe order of each matrix A_i.\n@param[in]\nalpha     device pointer or host pointer to scalar alpha.\n@param[in]\nA         device array of device pointers storing each matrix A_i of dimension (lda, n).\n\nif uplo == rocblas_fill_upper:\nThe upper triangular part of each A_i must contain\nthe upper triangular part of a Hermitian matrix. The lower\ntriangular part of each A_i will not be referenced.\n\nif uplo == rocblas_fill_lower:\nThe lower triangular part of each A_i must contain\nthe lower triangular part of a Hermitian matrix. The upper\ntriangular part of each A_i will not be referenced.\nAs a Hermitian matrix, the imaginary part of the main diagonal\nof each A_i will not be referenced and is assumed to be == 0.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each A_i. must be >= max(1, n).\n@param[in]\nstride_A    [rocblas_stride]\nstride from the start of one (A_i) to the next (A_i+1).\n@param[in]\nx         device array of device pointers storing each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\nstride_x  [rocblas_stride]\nstride from the start of one vector (x_i) and the next one (x_i+1).\n@param[in]\nbeta      device pointer or host pointer to scalar beta.\n@param[in, out]\ny         device array of device pointers storing each vector y_i.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of y.\n@param[in]\nstride_y  [rocblas_stride]\nstride from the start of one vector (y_i) and the next one (y_i+1).\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_chemv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        beta: *const rocblas_float_complex,\n        y: *mut rocblas_float_complex,\n        incy: rocblas_int,\n        stride_y: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhemv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        beta: *const rocblas_double_complex,\n        y: *mut rocblas_double_complex,\n        incy: rocblas_int,\n        stride_y: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_chemv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        beta: *const rocblas_float_complex,\n        y: *mut rocblas_float_complex,\n        incy: i64,\n        stride_y: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhemv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        beta: *const rocblas_double_complex,\n        y: *mut rocblas_double_complex,\n        incy: i64,\n        stride_y: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nher performs the matrix-vector operations:\n\nA := A + alpha*x*x**H\nwhere alpha is a real scalar, x is a vector, and A is an\nn by n Hermitian matrix.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- rocblas_fill_upper: The upper triangular part of A is supplied in A.\n- rocblas_fill_lower: The lower triangular part of A is supplied in A.\n@param[in]\nn         [rocblas_int]\nthe number of rows and columns of matrix A. Must be at least 0.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nx         device pointer storing vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n@param[in, out]\nA         device pointer storing the specified triangular portion of the Hermitian matrix A. Of size (lda * n).\n\nif uplo == rocblas_fill_upper:\nThe upper triangular portion of the Hermitian matrix A is supplied.\nThe lower triangluar portion will not be touched.\n\nif uplo == rocblas_fill_lower:\nThe lower triangular portion of the Hermitian matrix A is supplied.\nThe upper triangular portion will not be touched.\nNote that the imaginary part of the diagonal elements are not accessed\nand are assumed to be 0.\n\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A. Must be at least max(1, n).*/\n    pub fn rocblas_cher(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        A: *mut rocblas_float_complex,\n        lda: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zher(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        A: *mut rocblas_double_complex,\n        lda: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cher_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f32,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        A: *mut rocblas_float_complex,\n        lda: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zher_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f64,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        A: *mut rocblas_double_complex,\n        lda: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nher_batched performs the matrix-vector operations:\n\nA_i := A_i + alpha*x_i*x_i**H\nwhere alpha is a real scalar, x_i is a vector, and A_i is an\nn by n symmetric matrix, for i = 1, ..., batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- rocblas_fill_upper: The upper triangular part of each A_i is supplied in A.\n- rocblas_fill_lower: The lower triangular part of each A_i is supplied in A.\n@param[in]\nn         [rocblas_int]\nthe number of rows and columns of each matrix A_i. Must be at least 0.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nx         device array of device pointers storing each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in, out]\nA         device array of device pointers storing the specified triangular portion of\neach Hermitian matrix A_i of at least size ((n * (n + 1)) / 2). Array is of at least size batch_count.\n\nif uplo == rocblas_fill_upper:\nThe upper triangular portion of each Hermitian matrix A_i is supplied.\nThe lower triangular portion of each A_i will not be touched.\nif uplo == rocblas_fill_lower:\nThe lower triangular portion of each Hermitian matrix A_i is supplied.\nThe upper triangular portion of each A_i will not be touched.\nNote that the imaginary part of the diagonal elements are not accessed\nand are assumed to be 0.\n\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each A_i. Must be at least max(1, n).\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.*/\n    pub fn rocblas_cher_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *const *const rocblas_float_complex,\n        incx: rocblas_int,\n        A: *const *mut rocblas_float_complex,\n        lda: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zher_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *const *const rocblas_double_complex,\n        incx: rocblas_int,\n        A: *const *mut rocblas_double_complex,\n        lda: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cher_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f32,\n        x: *const *const rocblas_float_complex,\n        incx: i64,\n        A: *const *mut rocblas_float_complex,\n        lda: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zher_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f64,\n        x: *const *const rocblas_double_complex,\n        incx: i64,\n        A: *const *mut rocblas_double_complex,\n        lda: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nher_strided_batched performs the matrix-vector operations:\n\nA_i := A_i + alpha*x_i*x_i**H\nwhere alpha is a real scalar, x_i is a vector, and A_i is an\nn by n Hermitian matrix, for i = 1, ..., batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- rocblas_fill_upper: The upper triangular part of each A_i is supplied in A.\n- rocblas_fill_lower: The lower triangular part of each A_i is supplied in A.\n@param[in]\nn         [rocblas_int]\nthe number of rows and columns of each matrix A_i. Must be at least 0.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nx         device pointer pointing to the first vector (x_1).\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\nstride_x  [rocblas_stride]\nstride from the start of one vector (x_i) and the next one (x_i+1).\n@param[in, out]\nA         device array of device pointers storing the specified triangular portion of\neach Hermitian matrix A_i. Points to the first matrix (A_1).\n\nif uplo == rocblas_fill_upper:\nThe upper triangular portion of each Hermitian matrix A_i is supplied.\nThe lower triangular portion of each A_i will not be touched.\n\nif uplo == rocblas_fill_lower:\nThe lower triangular portion of each Hermitian matrix A_i is supplied.\nThe upper triangular portion of each A_i will not be touched.\nNote that the imaginary part of the diagonal elements are not accessed\nand are assumed to be 0.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each A_i.\n@param[in]\nstride_A    [rocblas_stride]\nstride from the start of one (A_i) and the next (A_i+1).\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.*/\n    pub fn rocblas_cher_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        A: *mut rocblas_float_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zher_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        A: *mut rocblas_double_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cher_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f32,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        A: *mut rocblas_float_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zher_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f64,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        A: *mut rocblas_double_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nher2 performs the matrix-vector operations:\n\nA := A + alpha*x*y**H + conj(alpha)*y*x**H\nwhere alpha is a complex scalar, x and y are vectors, and A is an\nn by n Hermitian matrix.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- rocblas_fill_upper: The upper triangular part of A is supplied.\n- rocblas_fill_lower: The lower triangular part of A is supplied.\n@param[in]\nn         [rocblas_int]\nthe number of rows and columns of matrix A. Must be at least 0.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nx         device pointer storing vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n@param[in]\ny         device pointer storing vector y.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of y.\n@param[in, out]\nA         device pointer storing the specified triangular portion of\nthe Hermitian matrix A. Of size (lda, n).\n\nif uplo == rocblas_fill_upper:\nThe upper triangular portion of the Hermitian matrix A is supplied.\nThe lower triangular portion of A will not be touched.\n\nif uplo == rocblas_fill_lower:\nThe lower triangular portion of the Hermitian matrix A is supplied.\nThe upper triangular portion of A will not be touched.\nNote that the imaginary part of the diagonal elements are not accessed\nand are assumed to be 0.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A. Must be at least max(lda, 1).*/\n    pub fn rocblas_cher2(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        y: *const rocblas_float_complex,\n        incy: rocblas_int,\n        A: *mut rocblas_float_complex,\n        lda: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zher2(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        y: *const rocblas_double_complex,\n        incy: rocblas_int,\n        A: *mut rocblas_double_complex,\n        lda: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cher2_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        y: *const rocblas_float_complex,\n        incy: i64,\n        A: *mut rocblas_float_complex,\n        lda: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zher2_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        y: *const rocblas_double_complex,\n        incy: i64,\n        A: *mut rocblas_double_complex,\n        lda: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nher2_batched performs the matrix-vector operations:\n\nA_i := A_i + alpha*x_i*y_i**H + conj(alpha)*y_i*x_i**H\nwhere alpha is a complex scalar, x_i and y_i are vectors, and A_i is an\nn by n Hermitian matrix for each batch in i = [1, batch_count].\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- rocblas_fill_upper: The upper triangular part of each A_i is supplied.\n- rocblas_fill_lower: The lower triangular part of each A_i is supplied.\n@param[in]\nn         [rocblas_int]\nthe number of rows and columns of each matrix A_i. Must be at least 0.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nx         device array of device pointers storing each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n@param[in]\ny         device array of device pointers storing each vector y_i.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of each y_i.\n@param[in, out]\nA         device array of device pointers storing the specified triangular portion of\neach Hermitian matrix A_i of size (lda, n).\n\nif uplo == rocblas_fill_upper:\nThe upper triangular portion of each Hermitian matrix A_i is supplied.\nThe lower triangular portion of each A_i will not be touched.\n\nif uplo == rocblas_fill_lower:\nThe lower triangular portion of each Hermitian matrix A_i is supplied.\nThe upper triangular portion of each A_i will not be touched.\nNote that the imaginary part of the diagonal elements are not accessed\nand are assumed to be 0.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each A_i. Must be at least max(lda, 1).\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.*/\n    pub fn rocblas_cher2_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        x: *const *const rocblas_float_complex,\n        incx: rocblas_int,\n        y: *const *const rocblas_float_complex,\n        incy: rocblas_int,\n        A: *const *mut rocblas_float_complex,\n        lda: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zher2_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        x: *const *const rocblas_double_complex,\n        incx: rocblas_int,\n        y: *const *const rocblas_double_complex,\n        incy: rocblas_int,\n        A: *const *mut rocblas_double_complex,\n        lda: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cher2_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        x: *const *const rocblas_float_complex,\n        incx: i64,\n        y: *const *const rocblas_float_complex,\n        incy: i64,\n        A: *const *mut rocblas_float_complex,\n        lda: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zher2_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        x: *const *const rocblas_double_complex,\n        incx: i64,\n        y: *const *const rocblas_double_complex,\n        incy: i64,\n        A: *const *mut rocblas_double_complex,\n        lda: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nher2_strided_batched performs the matrix-vector operations:\n\nA_i := A_i + alpha*x_i*y_i**H + conj(alpha)*y_i*x_i**H\nwhere alpha is a complex scalar, x_i and y_i are vectors, and A_i is an\nn by n Hermitian matrix for each batch in i = [1, batch_count].\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- rocblas_fill_upper: The upper triangular part of each A_i is supplied.\n- rocblas_fill_lower: The lower triangular part of each A_i is supplied.\n@param[in]\nn         [rocblas_int]\nthe number of rows and columns of each matrix A_i. Must be at least 0.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nx         device pointer pointing to the first vector x_1.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\nstride_x  [rocblas_stride]\nspecifies the stride between the beginning of one vector (x_i) and the next (x_i+1).\n@param[in]\ny         device pointer pointing to the first vector y_i.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of each y_i.\n@param[in]\nstride_y  [rocblas_stride]\nspecifies the stride between the beginning of one vector (y_i) and the next (y_i+1).\n@param[in, out]\nA         device pointer pointing to the first matrix (A_1). Stores the specified triangular portion of\neach Hermitian matrix A_i.\n\nif uplo == rocblas_fill_upper:\nThe upper triangular portion of each Hermitian matrix A_i is supplied.\nThe lower triangular portion of each A_i will not be touched.\n\nif uplo == rocblas_fill_lower:\nThe lower triangular portion of each Hermitian matrix A_i is supplied.\nThe upper triangular portion of each A_i will not be touched.\nNote that the imaginary part of the diagonal elements are not accessed\nand are assumed to be 0.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each A_i. Must be at least max(lda, 1).\n@param[in]\nstride_A  [rocblas_stride]\nspecifies the stride between the beginning of one matrix (A_i) and the next (A_i+1).\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.*/\n    pub fn rocblas_cher2_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        y: *const rocblas_float_complex,\n        incy: rocblas_int,\n        stride_y: rocblas_stride,\n        A: *mut rocblas_float_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zher2_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        y: *const rocblas_double_complex,\n        incy: rocblas_int,\n        stride_y: rocblas_stride,\n        A: *mut rocblas_double_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cher2_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        y: *const rocblas_float_complex,\n        incy: i64,\n        stride_y: rocblas_stride,\n        A: *mut rocblas_float_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zher2_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        y: *const rocblas_double_complex,\n        incy: i64,\n        stride_y: rocblas_stride,\n        A: *mut rocblas_double_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nhpmv performs the matrix-vector operation:\n\ny := alpha*A*x + beta*y\nwhere alpha and beta are scalars, x and y are n element vectors and A is an\nn by n Hermitian matrix, supplied in packed form (see description below).\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\n- rocblas_fill_upper: the upper triangular part of the Hermitian matrix A is supplied in AP.\n- rocblas_fill_lower: the lower triangular part of the Hermitian matrix A is supplied in AP.\n@param[in]\nn         [rocblas_int]\nthe order of the matrix A. Must be >= 0.\n@param[in]\nalpha     device pointer or host pointer to scalar alpha.\n@param[in]\nAP        device pointer storing the packed version of the specified triangular portion of\nthe Hermitian matrix A. Of at least size ((n * (n + 1)) / 2).\n\nif uplo == rocblas_fill_upper:\nThe upper triangular portion of the Hermitian matrix A is supplied.\nThe matrix is compacted so that AP contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(0,1)\nAP(2) = A(1,1), etc.\nEx: (rocblas_fill_upper; n = 3)\n(1, 0) (2, 1) (3, 2)\n(2,-1) (4, 0) (5,-1) ---> [(1,0),(2,1),(4,0),(3,2),(5,-1),(6,0)]\n(3,-2) (5, 1) (6, 0)\n\nif uplo == rocblas_fill_lower:\nThe lower triangular portion of the Hermitian matrix A is supplied.\nThe matrix is compacted so that AP contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(1,0)\nAP(2) = A(2,1), etc.\nEx: (rocblas_fill_lower; n = 3)\n(1, 0) (2, 1) (3, 2)\n(2,-1) (4, 0) (5,-1) ---> [(1,0),(2,-1),(3,-2),(4,0),(5,1),(6,0)]\n(3,-2) (5, 1) (6, 0)\nNote that the imaginary part of the diagonal elements are not accessed\nand are assumed to be 0.\n@param[in]\nx         device pointer storing vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n@param[in]\nbeta      device pointer or host pointer to scalar beta.\n@param[in, out]\ny         device pointer storing vector y.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of y.\n*/\n    pub fn rocblas_chpmv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        AP: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        beta: *const rocblas_float_complex,\n        y: *mut rocblas_float_complex,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhpmv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        AP: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        beta: *const rocblas_double_complex,\n        y: *mut rocblas_double_complex,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_chpmv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        AP: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        beta: *const rocblas_float_complex,\n        y: *mut rocblas_float_complex,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhpmv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        AP: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        beta: *const rocblas_double_complex,\n        y: *mut rocblas_double_complex,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nhpmv_batched performs the matrix-vector operation:\n\ny_i := alpha*A_i*x_i + beta*y_i\nwhere alpha and beta are scalars, x_i and y_i are n element vectors and A_i is an\nn by n Hermitian matrix, supplied in packed form (see description below),\nfor each batch in i = [1, batch_count].\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\n- rocblas_fill_upper: the upper triangular part of each Hermitian matrix A_i is supplied in AP.\n- rocblas_fill_lower: the lower triangular part of each Hermitian matrix A_i is supplied in AP.\n@param[in]\nn         [rocblas_int]\nthe order of each matrix A_i.\n@param[in]\nalpha     device pointer or host pointer to scalar alpha.\n@param[in]\nAP      device pointer of device pointers storing the packed version of the specified triangular\nportion of each Hermitian matrix A_i. Each A_i is of at least size ((n * (n + 1)) / 2).\n\nif uplo == rocblas_fill_upper:\nThe upper triangular portion of each Hermitian matrix A_i is supplied.\nThe matrix is compacted so that each AP_i contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(0,1)\nAP(2) = A(1,1), etc.\nEx: (rocblas_fill_upper; n = 3)\n(1, 0) (2, 1) (3, 2)\n(2,-1) (4, 0) (5,-1) ---> [(1,0),(2,1),(4,0),(3,2),(5,-1),(6,0)]\n(3,-2) (5, 1) (6, 0)\n\nif uplo == rocblas_fill_lower:\nThe lower triangular portion of each Hermitian matrix A_i is supplied.\nThe matrix is compacted so that each AP_i contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(1,0)\nAP(2) = A(2,1), etc.\nEx: (rocblas_fill_lower; n = 3)\n(1, 0) (2, 1) (3, 2)\n(2,-1) (4, 0) (5,-1) ---> [(1,0),(2,-1),(3,-2),(4,0),(5,1),(6,0)]\n(3,-2) (5, 1) (6, 0)\nNote that the imaginary part of the diagonal elements are not accessed\nand are assumed to be 0.\n@param[in]\nx         device array of device pointers storing each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\nbeta      device pointer or host pointer to scalar beta.\n@param[in, out]\ny         device array of device pointers storing each vector y_i.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of y.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_chpmv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        AP: *const *const rocblas_float_complex,\n        x: *const *const rocblas_float_complex,\n        incx: rocblas_int,\n        beta: *const rocblas_float_complex,\n        y: *const *mut rocblas_float_complex,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhpmv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        AP: *const *const rocblas_double_complex,\n        x: *const *const rocblas_double_complex,\n        incx: rocblas_int,\n        beta: *const rocblas_double_complex,\n        y: *const *mut rocblas_double_complex,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_chpmv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        AP: *const *const rocblas_float_complex,\n        x: *const *const rocblas_float_complex,\n        incx: i64,\n        beta: *const rocblas_float_complex,\n        y: *const *mut rocblas_float_complex,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhpmv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        AP: *const *const rocblas_double_complex,\n        x: *const *const rocblas_double_complex,\n        incx: i64,\n        beta: *const rocblas_double_complex,\n        y: *const *mut rocblas_double_complex,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nhpmv_strided_batched performs the matrix-vector operation:\n\ny_i := alpha*A_i*x_i + beta*y_i\nwhere alpha and beta are scalars, x_i and y_i are n element vectors and A_i is an\nn by n Hermitian matrix, supplied in packed form (see description below),\nfor each batch in i = [1, batch_count].\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\n- rocblas_fill_upper: the upper triangular part of each Hermitian matrix A_i is supplied in AP.\n- rocblas_fill_lower: the lower triangular part of each Hermitian matrix A_i is supplied in AP.\n@param[in]\nn         [rocblas_int]\nthe order of each matrix A_i.\n@param[in]\nalpha     device pointer or host pointer to scalar alpha.\n@param[in]\nAP        device pointer pointing to the beginning of the first matrix (AP_1). Stores the packed\nversion of the specified triangular portion of each Hermitian matrix AP_i of size ((n * (n + 1)) / 2).\n\nif uplo == rocblas_fill_upper:\nThe upper triangular portion of each Hermitian matrix A_i is supplied.\nThe matrix is compacted so that each AP_i contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(0,1)\nAP(2) = A(1,1), etc.\nEx: (rocblas_fill_upper; n = 3)\n(1, 0) (2, 1) (3, 2)\n(2,-1) (4, 0) (5,-1) ---> [(1,0),(2,1),(4,0),(3,2),(5,-1),(6,0)]\n(3,-2) (5, 1) (6, 0)\n\nif uplo == rocblas_fill_lower:\nThe lower triangular portion of each Hermitian matrix A_i is supplied.\nThe matrix is compacted so that each AP_i contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(1,0)\nAP(2) = A(2,1), etc.\nEx: (rocblas_fill_lower; n = 3)\n(1, 0) (2, 1) (3, 2)\n(2,-1) (4, 0) (5,-1) ---> [(1,0),(2,-1),(3,-2),(4,0),(5,1),(6,0)]\n(3,-2) (5, 1) (6, 0)\nNote that the imaginary part of the diagonal elements are not accessed\nand are assumed to be 0.\n@param[in]\nstride_A  [rocblas_stride]\nstride from the start of one matrix (AP_i) and the next one (AP_i+1).\n@param[in]\nx         device array pointing to the beginning of the first vector (x_1).\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\nstride_x  [rocblas_stride]\nstride from the start of one vector (x_i) and the next one (x_i+1).\n@param[in]\nbeta      device pointer or host pointer to scalar beta.\n@param[in, out]\ny         device array pointing to the beginning of the first vector (y_1).\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of y.\n@param[in]\nstride_y  [rocblas_stride]\nstride from the start of one vector (y_i) and the next one (y_i+1).\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_chpmv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        AP: *const rocblas_float_complex,\n        stride_A: rocblas_stride,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        beta: *const rocblas_float_complex,\n        y: *mut rocblas_float_complex,\n        incy: rocblas_int,\n        stride_y: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhpmv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        AP: *const rocblas_double_complex,\n        stride_A: rocblas_stride,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        beta: *const rocblas_double_complex,\n        y: *mut rocblas_double_complex,\n        incy: rocblas_int,\n        stride_y: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_chpmv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        AP: *const rocblas_float_complex,\n        stride_A: rocblas_stride,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        beta: *const rocblas_float_complex,\n        y: *mut rocblas_float_complex,\n        incy: i64,\n        stride_y: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhpmv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        AP: *const rocblas_double_complex,\n        stride_A: rocblas_stride,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        beta: *const rocblas_double_complex,\n        y: *mut rocblas_double_complex,\n        incy: i64,\n        stride_y: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nhpr performs the matrix-vector operations:\n\nA := A + alpha*x*x**H\nwhere alpha is a real scalar, x is a vector, and A is an\nn by n Hermitian matrix, supplied in packed form.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- rocblas_fill_upper: The upper triangular part of A is supplied in AP.\n- rocblas_fill_lower: The lower triangular part of A is supplied in AP.\n@param[in]\nn         [rocblas_int]\nthe number of rows and columns of matrix A. Must be at least 0.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nx         device pointer storing vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n@param[in, out]\nAP        device pointer storing the packed version of the specified triangular portion of\nthe Hermitian matrix A. Of at least size ((n * (n + 1)) / 2).\n\nif uplo == rocblas_fill_upper:\nThe upper triangular portion of the Hermitian matrix A is supplied.\nThe matrix is compacted so that AP contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(0,1)\nAP(2) = A(1,1), etc.\nEx: (rocblas_fill_upper; n = 3)\n(1, 0) (2, 1) (4,9)\n(2,-1) (3, 0) (5,3) ---> [(1,0),(2,1),(3,0),(4,9),(5,3),(6,0)]\n(4,-9) (5,-3) (6,0)\n\nif uplo == rocblas_fill_lower:\nThe lower triangular portion of the Hermitian matrix A is supplied.\nThe matrix is compacted so that AP contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(1,0)\nAP(2) = A(2,1), etc.\nEx: (rocblas_fill_lower; n = 3)\n(1, 0) (2, 1) (4,9)\n(2,-1) (3, 0) (5,3) ---> [(1,0),(2,-1),(4,-9),(3,0),(5,-3),(6,0)]\n(4,-9) (5,-3) (6,0)\nNote that the imaginary part of the diagonal elements are not accessed\nand are assumed to be 0.*/\n    pub fn rocblas_chpr(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        AP: *mut rocblas_float_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhpr(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        AP: *mut rocblas_double_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_chpr_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f32,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        AP: *mut rocblas_float_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhpr_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f64,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        AP: *mut rocblas_double_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nhpr_batched performs the matrix-vector operations:\n\nA_i := A_i + alpha*x_i*x_i**H\nwhere alpha is a real scalar, x_i is a vector, and A_i is an\nn by n symmetric matrix, supplied in packed form, for i = 1, ..., batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- rocblas_fill_upper: The upper triangular part of each A_i is supplied in AP.\n- rocblas_fill_lower: The lower triangular part of each A_i is supplied in AP.\n@param[in]\nn         [rocblas_int]\nthe number of rows and columns of each matrix A_i. Must be at least 0.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nx         device array of device pointers storing each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in, out]\nAP        device array of device pointers storing the packed version of the specified triangular portion of\neach Hermitian matrix A_i of at least size ((n * (n + 1)) / 2). Array is of at least size batch_count.\n\nif uplo == rocblas_fill_upper:\nThe upper triangular portion of each Hermitian matrix A_i is supplied.\nThe matrix is compacted so that AP contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(0,1)\nAP(2) = A(1,1), etc.\nEx: (rocblas_fill_upper; n = 3)\n(1, 0) (2, 1) (4,9)\n(2,-1) (3, 0) (5,3) ---> [(1,0),(2,1),(3,0),(4,9),(5,3),(6,0)]\n(4,-9) (5,-3) (6,0)\n\nif uplo == rocblas_fill_lower:\nThe lower triangular portion of each Hermitian matrix A_i is supplied.\nThe matrix is compacted so that AP contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(1,0)\nAP(2) = A(2,1), etc.\nEx: (rocblas_fill_lower; n = 3)\n(1, 0) (2, 1) (4,9)\n(2,-1) (3, 0) (5,3) ---> [(1,0),(2,-1),(4,-9),(3,0),(5,-3),(6,0)]\n(4,-9) (5,-3) (6,0)\nNote that the imaginary part of the diagonal elements are not accessed\nand are assumed to be 0.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.*/\n    pub fn rocblas_chpr_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *const *const rocblas_float_complex,\n        incx: rocblas_int,\n        AP: *const *mut rocblas_float_complex,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhpr_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *const *const rocblas_double_complex,\n        incx: rocblas_int,\n        AP: *const *mut rocblas_double_complex,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_chpr_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f32,\n        x: *const *const rocblas_float_complex,\n        incx: i64,\n        AP: *const *mut rocblas_float_complex,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhpr_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f64,\n        x: *const *const rocblas_double_complex,\n        incx: i64,\n        AP: *const *mut rocblas_double_complex,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nhpr_strided_batched performs the matrix-vector operations:\n\nA_i := A_i + alpha*x_i*x_i**H\nwhere alpha is a real scalar, x_i is a vector, and A_i is an\nn by n symmetric matrix, supplied in packed form, for i = 1, ..., batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- rocblas_fill_upper: The upper triangular part of each A_i is supplied in AP.\n- rocblas_fill_lower: The lower triangular part of each A_i is supplied in AP.\n@param[in]\nn         [rocblas_int]\nthe number of rows and columns of each matrix A_i. Must be at least 0.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nx         device pointer pointing to the first vector (x_1).\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\nstride_x  [rocblas_stride]\nstride from the start of one vector (x_i) and the next one (x_i+1).\n@param[in, out]\nAP        device array of device pointers storing the packed version of the specified triangular portion of\neach Hermitian matrix A_i. Points to the first matrix (A_1).\n\nif uplo == rocblas_fill_upper:\nThe upper triangular portion of each Hermitian matrix A_i is supplied.\nThe matrix is compacted so that AP contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(0,1)\nAP(2) = A(1,1), etc.\nEx: (rocblas_fill_upper; n = 3)\n(1, 0) (2, 1) (4,9)\n(2,-1) (3, 0) (5,3) ---> [(1,0),(2,1),(3,0),(4,9),(5,3),(6,0)]\n(4,-9) (5,-3) (6,0)\n\nif uplo == rocblas_fill_lower:\nThe lower triangular portion of each Hermitian matrix A_i is supplied.\nThe matrix is compacted so that AP contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(1,0)\nAP(2) = A(2,1), etc.\nEx: (rocblas_fill_lower; n = 3)\n(1, 0) (2, 1) (4,9)\n(2,-1) (3, 0) (5,3) ---> [(1,0),(2,-1),(4,-9),(3,0),(5,-3),(6,0)]\n(4,-9) (5,-3) (6,0)\nNote that the imaginary part of the diagonal elements are not accessed\nand are assumed to be 0.\n@param[in]\nstride_A    [rocblas_stride]\nstride from the start of one (A_i) and the next (A_i+1).\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.*/\n    pub fn rocblas_chpr_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        AP: *mut rocblas_float_complex,\n        stride_A: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhpr_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        AP: *mut rocblas_double_complex,\n        stride_A: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_chpr_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f32,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        AP: *mut rocblas_float_complex,\n        stride_A: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhpr_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f64,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        AP: *mut rocblas_double_complex,\n        stride_A: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nhpr2 performs the matrix-vector operations:\n\nA := A + alpha*x*y**H + conj(alpha)*y*x**H\nwhere alpha is a complex scalar, x and y are vectors, and A is an\nn by n Hermitian matrix, supplied in packed form.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- rocblas_fill_upper: The upper triangular part of A is supplied in AP.\n- rocblas_fill_lower: The lower triangular part of A is supplied in AP.\n@param[in]\nn         [rocblas_int]\nthe number of rows and columns of matrix A. Must be at least 0.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nx         device pointer storing vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n@param[in]\ny         device pointer storing vector y.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of y.\n@param[in, out]\nAP        device pointer storing the packed version of the specified triangular portion of\nthe Hermitian matrix A. Of at least size ((n * (n + 1)) / 2).\n\nif uplo == rocblas_fill_upper:\nThe upper triangular portion of the Hermitian matrix A is supplied.\nThe matrix is compacted so that AP contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(0,1)\nAP(2) = A(1,1), etc.\nEx: (rocblas_fill_upper; n = 3)\n(1, 0) (2, 1) (4,9)\n(2,-1) (3, 0) (5,3) ---> [(1,0),(2,1),(3,0),(4,9),(5,3),(6,0)]\n(4,-9) (5,-3) (6,0)\n\nif uplo == rocblas_fill_lower:\nThe lower triangular portion of the Hermitian matrix A is supplied.\nThe matrix is compacted so that AP contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(1,0)\nAP(2) = A(2,1), etc.\nEx: (rocblas_fill_lower; n = 3)\n(1, 0) (2, 1) (4,9)\n(2,-1) (3, 0) (5,3) ---> [(1,0),(2,-1),(4,-9),(3,0),(5,-3),(6,0)]\n(4,-9) (5,-3) (6,0)\nNote that the imaginary part of the diagonal elements are not accessed\nand are assumed to be 0.*/\n    pub fn rocblas_chpr2(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        y: *const rocblas_float_complex,\n        incy: rocblas_int,\n        AP: *mut rocblas_float_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhpr2(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        y: *const rocblas_double_complex,\n        incy: rocblas_int,\n        AP: *mut rocblas_double_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_chpr2_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        y: *const rocblas_float_complex,\n        incy: i64,\n        AP: *mut rocblas_float_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhpr2_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        y: *const rocblas_double_complex,\n        incy: i64,\n        AP: *mut rocblas_double_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nhpr2_batched performs the matrix-vector operations:\n\nA_i := A_i + alpha*x_i*y_i**H + conj(alpha)*y_i*x_i**H\nwhere alpha is a complex scalar, x_i and y_i are vectors, and A_i is an\nn by n symmetric matrix, supplied in packed form, for i = 1, ..., batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- rocblas_fill_upper: The upper triangular part of each A_i is supplied in AP.\n- rocblas_fill_lower: The lower triangular part of each A_i is supplied in AP.\n@param[in]\nn         [rocblas_int]\nthe number of rows and columns of each matrix A_i. Must be at least 0.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nx         device array of device pointers storing each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\ny         device array of device pointers storing each vector y_i.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of each y_i.\n@param[in, out]\nAP        device array of device pointers storing the packed version of the specified triangular portion of\neach Hermitian matrix A_i of at least size ((n * (n + 1)) / 2). Array is of at least size batch_count.\n\nif uplo == rocblas_fill_upper:\nThe upper triangular portion of each Hermitian matrix A_i is supplied.\nThe matrix is compacted so that AP contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(0,1)\nAP(2) = A(1,1), etc.\nEx: (rocblas_fill_upper; n = 3)\n(1, 0) (2, 1) (4,9)\n(2,-1) (3, 0) (5,3) ---> [(1,0),(2,1),(3,0),(4,9),(5,3),(6,0)]\n(4,-9) (5,-3) (6,0)\n\nif uplo == rocblas_fill_lower:\nThe lower triangular portion of each Hermitian matrix A_i is supplied.\nThe matrix is compacted so that AP contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(1,0)\nAP(2) = A(2,1), etc.\nEx: (rocblas_fill_lower; n = 3)\n(1, 0) (2, 1) (4,9)\n(2,-1) (3, 0) (5,3) --> [(1,0),(2,-1),(4,-9),(3,0),(5,-3),(6,0)]\n(4,-9) (5,-3) (6,0)\nNote that the imaginary part of the diagonal elements are not accessed\nand are assumed to be 0.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.*/\n    pub fn rocblas_chpr2_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        x: *const *const rocblas_float_complex,\n        incx: rocblas_int,\n        y: *const *const rocblas_float_complex,\n        incy: rocblas_int,\n        AP: *const *mut rocblas_float_complex,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhpr2_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        x: *const *const rocblas_double_complex,\n        incx: rocblas_int,\n        y: *const *const rocblas_double_complex,\n        incy: rocblas_int,\n        AP: *const *mut rocblas_double_complex,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_chpr2_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        x: *const *const rocblas_float_complex,\n        incx: i64,\n        y: *const *const rocblas_float_complex,\n        incy: i64,\n        AP: *const *mut rocblas_float_complex,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhpr2_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        x: *const *const rocblas_double_complex,\n        incx: i64,\n        y: *const *const rocblas_double_complex,\n        incy: i64,\n        AP: *const *mut rocblas_double_complex,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nhpr2_strided_batched performs the matrix-vector operations:\n\nA_i := A_i + alpha*x_i*y_i**H + conj(alpha)*y_i*x_i**H\nwhere alpha is a complex scalar, x_i and y_i are vectors, and A_i is an\nn by n symmetric matrix, supplied in packed form, for i = 1, ..., batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- rocblas_fill_upper: The upper triangular part of each A_i is supplied in AP.\n- rocblas_fill_lower: The lower triangular part of each A_i is supplied in AP.\n@param[in]\nn         [rocblas_int]\nthe number of rows and columns of each matrix A_i. Must be at least 0.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nx         device pointer pointing to the first vector (x_1).\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\nstride_x  [rocblas_stride]\nstride from the start of one vector (x_i) and the next one (x_i+1).\n@param[in]\ny         device pointer pointing to the first vector (y_1).\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of each y_i.\n@param[in]\nstride_y  [rocblas_stride]\nstride from the start of one vector (y_i) and the next one (y_i+1).\n@param[in, out]\nAP        device array of device pointers storing the packed version of the specified triangular portion of\neach Hermitian matrix A_i. Points to the first matrix (A_1).\n\nif uplo == rocblas_fill_upper:\nThe upper triangular portion of each Hermitian matrix A_i is supplied.\nThe matrix is compacted so that AP contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(0,1)\nAP(2) = A(1,1), etc.\nEx: (rocblas_fill_upper; n = 3)\n(1, 0) (2, 1) (4,9)\n(2,-1) (3, 0) (5,3) ---> [(1,0),(2,1),(3,0),(4,9),(5,3),(6,0)]\n(4,-9) (5,-3) (6,0)\n\nif uplo == rocblas_fill_lower:\nThe lower triangular portion of each Hermitian matrix A_i is supplied.\nThe matrix is compacted so that AP contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(1,0)\nAP(2) = A(2,1), etc.\nEx: (rocblas_fill_lower; n = 3)\n(1, 0) (2, 1) (4,9)\n(2,-1) (3, 0) (5,3) ---> [(1,0),(2,-1),(4,-9),(3,0),(5,-3),(6,0)]\n(4,-9) (5,-3) (6,0)\nNote that the imaginary part of the diagonal elements are not accessed\nand are assumed to be 0.\n@param[in]\nstride_A    [rocblas_stride]\nstride from the start of one (A_i) and the next (A_i+1).\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.*/\n    pub fn rocblas_chpr2_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        y: *const rocblas_float_complex,\n        incy: rocblas_int,\n        stride_y: rocblas_stride,\n        AP: *mut rocblas_float_complex,\n        stride_A: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhpr2_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        y: *const rocblas_double_complex,\n        incy: rocblas_int,\n        stride_y: rocblas_stride,\n        AP: *mut rocblas_double_complex,\n        stride_A: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_chpr2_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        y: *const rocblas_float_complex,\n        incy: i64,\n        stride_y: rocblas_stride,\n        AP: *mut rocblas_float_complex,\n        stride_A: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhpr2_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        y: *const rocblas_double_complex,\n        incy: i64,\n        stride_y: rocblas_stride,\n        AP: *mut rocblas_double_complex,\n        stride_A: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\ntrmv performs one of the matrix-vector operations:\n\nx = A*x or\nx = A**T*x or\nx = A**H*x\nwhere x is an n element vector and A is an n by n unit, or non-unit, upper or lower triangular matrix.\nThe vector x is overwritten.\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  A is an upper triangular matrix.\n- rocblas_fill_lower:  A is a  lower triangular matrix.\n\n@param[in]\ntransA     [rocblas_operation]\n- rocblas_operation_none:    op(A) = A.\n- rocblas_operation_transpose:   op(A) = A^T\n- rocblas_operation_conjugate_transpose:  op(A) = A^H\n\n@param[in]\ndiag    [rocblas_diagonal]\n- rocblas_diagonal_unit:     A is assumed to be unit triangular.\n- rocblas_diagonal_non_unit:  A is not assumed to be unit triangular.\n\n@param[in]\nn         [rocblas_int]\nn specifies the number of rows of A. n >= 0.\n\n@param[in]\nA         device pointer storing matrix A, of dimension ( lda, n ). If uplo == rocblas_fill_upper, the upper triangular part of the leading n-by-n array contains the matrix A, otherwise the lower triangular part of the leading n-by-n array contains the matrix A.\n\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A. lda must be at least max( 1, n ).\n\n@param[in, out]\nx         device pointer storing vector x. On exit, x is overwritten with the transformed vector x.\n\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n*/\n    pub fn rocblas_strmv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const f32,\n        lda: rocblas_int,\n        x: *mut f32,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtrmv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const f64,\n        lda: rocblas_int,\n        x: *mut f64,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctrmv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        x: *mut rocblas_float_complex,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztrmv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        x: *mut rocblas_double_complex,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_strmv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const f32,\n        lda: i64,\n        x: *mut f32,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtrmv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const f64,\n        lda: i64,\n        x: *mut f64,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctrmv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        x: *mut rocblas_float_complex,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztrmv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        x: *mut rocblas_double_complex,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\ntrmv_batched performs one of the matrix-vector operations:\n\nx_i = A_i*x_i or\nx_i = A_i**T*x_i or\nx_i = A_i**H*x_i, 0 < i < batch_count\nwhere x_i is an n element vector and A_i is an n by n (unit, or non-unit, upper or lower triangular matrix)\nThe vectors x_i are overwritten.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  A_i is an upper triangular matrix.\n- rocblas_fill_lower:  A_i is a  lower triangular matrix.\n\n@param[in]\ntransA     [rocblas_operation]\n- rocblas_operation_none:    op(A) = A.\n- rocblas_operation_transpose:   op(A) = A^T\n- rocblas_operation_conjugate_transpose:  op(A) = A^H\n\n@param[in]\ndiag    [rocblas_diagonal]\n- rocblas_diagonal_unit:     A_i is assumed to be unit triangular.\n- rocblas_diagonal_non_unit:  A_i is not assumed to be unit triangular.\n\n@param[in]\nn         [rocblas_int]\nn specifies the number of rows of matrices A_i. n >= 0.\n\n@param[in]\nA         device pointer to an array of device pointers to the A_i matrices, of dimension ( lda, n ). If uplo == rocblas_fill_upper, the upper triangular part of the leading n-by-n array contains the matrix A_i, otherwise the lower triangular part of the leading n-by-n array contains the matrix A_i.\n\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A_i. lda must be at least max( 1, n ).\n\n@param[in, out]\nx         device pointer to an array of device pointers to the x_i vectors. On exit, each x_i is overwritten with the transformed vector x_i.\n\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of vectors x_i.\n\n@param[in]\nbatch_count [rocblas_int]\nThe number of batched matrices/vectors.\n\n*/\n    pub fn rocblas_strmv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const *const f32,\n        lda: rocblas_int,\n        x: *const *mut f32,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtrmv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const *const f64,\n        lda: rocblas_int,\n        x: *const *mut f64,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctrmv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const *const rocblas_float_complex,\n        lda: rocblas_int,\n        x: *const *mut rocblas_float_complex,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztrmv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const *const rocblas_double_complex,\n        lda: rocblas_int,\n        x: *const *mut rocblas_double_complex,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_strmv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const *const f32,\n        lda: i64,\n        x: *const *mut f32,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtrmv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const *const f64,\n        lda: i64,\n        x: *const *mut f64,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctrmv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const *const rocblas_float_complex,\n        lda: i64,\n        x: *const *mut rocblas_float_complex,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztrmv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const *const rocblas_double_complex,\n        lda: i64,\n        x: *const *mut rocblas_double_complex,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\ntrmv_strided_batched performs one of the matrix-vector operations:\n\nx_i = A_i*x_i or\nx_i = A_i**T*x_i, or\nx_i = A_i**H*x_i, 0 < i < batch_count\nwhere x_i is an n element vector and A_i is an n by n (unit, or non-unit, upper or lower triangular matrix)\nwith strides specifying how to retrieve $x_i$ (resp. $A_i$) from $x_{i-1}$ (resp. $A_i$).\n\nThe vectors x_i are overwritten.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  A_i is an upper triangular matrix.\n- rocblas_fill_lower:  A_i is a  lower triangular matrix.\n\n@param[in]\ntransA     [rocblas_operation]\n- rocblas_operation_none:    op(A) = A.\n- rocblas_operation_transpose:   op(A) = A^T\n- rocblas_operation_conjugate_transpose:  op(A) = A^H\n\n@param[in]\ndiag    [rocblas_diagonal]\n- rocblas_diagonal_unit:     A_i is assumed to be unit triangular.\n- rocblas_diagonal_non_unit:  A_i is not assumed to be unit triangular.\n\n@param[in]\nn         [rocblas_int]\nn specifies the number of rows of matrices A_i. n >= 0.\n\n@param[in]\nA         device pointer to the matrix A_1 of the batch, of dimension ( lda, n ). If uplo == rocblas_fill_upper, the upper triangular part of the leading n-by-n array contains the matrix A_i, otherwise the lower triangular part of the leading n-by-n array contains the matrix A_i.\n\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A_i. lda must be at least max( 1, n ).\n\n@param[in]\nstride_A  [rocblas_stride]\nstride from the start of one A_i matrix to the next A_{i + 1}.\n\n@param[in, out]\nx         device pointer to the vector x_1 of the batch. On exit, each x_i is overwritten with the transformed vector x_i.\n\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of one vector x.\n\n@param[in]\nstride_x  [rocblas_stride]\nstride from the start of one x_i vector to the next x_{i + 1}.\n\n@param[in]\nbatch_count [rocblas_int]\nThe number of batched matrices/vectors.\n\n*/\n    pub fn rocblas_strmv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const f32,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        x: *mut f32,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtrmv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const f64,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        x: *mut f64,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctrmv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        x: *mut rocblas_float_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztrmv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        x: *mut rocblas_double_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_strmv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const f32,\n        lda: i64,\n        stride_A: rocblas_stride,\n        x: *mut f32,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtrmv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const f64,\n        lda: i64,\n        stride_A: rocblas_stride,\n        x: *mut f64,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctrmv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        x: *mut rocblas_float_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztrmv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        x: *mut rocblas_double_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\ntpmv performs one of the matrix-vector operations:\n\nx = A*x or\nx = A**T*x or\nx = A**H*x\nwhere x is an n element vector and A is an n by n unit, or non-unit,\nupper or lower triangular matrix, supplied in the pack form.\nThe vector x is overwritten.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  A is an upper triangular matrix.\n- rocblas_fill_lower:  A is a  lower triangular matrix.\n\n@param[in]\ntransA     [rocblas_operation]\n- rocblas_operation_none:    op(A) = A.\n- rocblas_operation_transpose:   op(A) = A^T\n- rocblas_operation_conjugate_transpose:  op(A) = A^H\n\n@param[in]\ndiag    [rocblas_diagonal]\n- rocblas_diagonal_unit:     A is assumed to be unit triangular.\n- rocblas_diagonal_non_unit:  A is not assumed to be unit triangular.\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of rows of A. n >= 0.\n\n@param[in]\nA       device pointer storing matrix A,\nof dimension at leat ( n * ( n + 1 ) / 2 ).\n- Before entry with uplo = rocblas_fill_upper, the array A\nmust contain the upper triangular matrix packed sequentially,\ncolumn by column, so that\nA[0] contains a_{0,0}, A[1] and A[2] contain\na_{0,1} and a_{1, 1}, respectively, and so on.\n\n- Before entry with uplo = rocblas_fill_lower, the array A\nmust contain the lower triangular matrix packed sequentially,\ncolumn by column, so that\nA[0] contains a_{0,0}, A[1] and A[2] contain\na_{1,0} and a_{2,0}, respectively, and so on.\n\nNote that when DIAG = rocblas_diagonal_unit, the diagonal elements of A are\nnot referenced, but are assumed to be unity.\n\n@param[in, out]\nx      device pointer storing vector x. On exit, x is overwritten with the transformed vector x.\n\n@param[in]\nincx    [rocblas_int]\nspecifies the increment for the elements of x. incx must not be zero.\n*/\n    pub fn rocblas_stpmv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const f32,\n        x: *mut f32,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtpmv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const f64,\n        x: *mut f64,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctpmv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const rocblas_float_complex,\n        x: *mut rocblas_float_complex,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztpmv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const rocblas_double_complex,\n        x: *mut rocblas_double_complex,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_stpmv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const f32,\n        x: *mut f32,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtpmv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const f64,\n        x: *mut f64,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctpmv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const rocblas_float_complex,\n        x: *mut rocblas_float_complex,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztpmv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const rocblas_double_complex,\n        x: *mut rocblas_double_complex,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\ntpmv_batched performs one of the matrix-vector operations:\n\nx_i = A_i*x_i or\nx_i = A_i**T*x_i or\nx_i = A_i**H*x_i, 0 < i < batch_count\nwhere x_i is an n element vector and A_i is an n by n (unit, or non-unit, upper or lower triangular matrix)\nThe vectors x_i are overwritten.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  A_i is an upper triangular matrix.\n- rocblas_fill_lower:  A_i is a  lower triangular matrix.\n\n@param[in]\ntransA     [rocblas_operation]\n- rocblas_operation_none:    op(A) = A.\n- rocblas_operation_transpose:   op(A) = A^T\n- rocblas_operation_conjugate_transpose:  op(A) = A^H\n\n@param[in]\ndiag    [rocblas_diagonal]\n- rocblas_diagonal_unit:     A_i is assumed to be unit triangular.\n- rocblas_diagonal_non_unit:  A_i is not assumed to be unit triangular.\n\n@param[in]\nn         [rocblas_int]\nn specifies the number of rows of matrices A_i. n >= 0.\n\n@param[in]\nA         device pointer to an array of device pointers to the A_i matrices, of dimension ( lda, n ). If uplo == rocblas_fill_upper, the upper triangular part of the leading n-by-n array contains the matrix A_i, otherwise the lower triangular part of the leading n-by-n array contains the matrix A_i.\n\n@param[in, out]\nx         device pointer to an array of device pointers to the x_i vectors. On exit, each x_i is overwritten with the transformed vector x_i.\n\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of vectors x_i.\n\n@param[in]\nbatch_count [rocblas_int]\nThe number of batched matrices/vectors.\n\n*/\n    pub fn rocblas_stpmv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const *const f32,\n        x: *const *mut f32,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtpmv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const *const f64,\n        x: *const *mut f64,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctpmv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const *const rocblas_float_complex,\n        x: *const *mut rocblas_float_complex,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztpmv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const *const rocblas_double_complex,\n        x: *const *mut rocblas_double_complex,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_stpmv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const *const f32,\n        x: *const *mut f32,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtpmv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const *const f64,\n        x: *const *mut f64,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctpmv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const *const rocblas_float_complex,\n        x: *const *mut rocblas_float_complex,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztpmv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const *const rocblas_double_complex,\n        x: *const *mut rocblas_double_complex,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\ntpmv_strided_batched performs one of the matrix-vector operations:\n\nx_i = A_i*x_i or\nx_i = A_i**T*x_i or\nx_i = A_i**H*x_i, 0 < i < batch_count\nwhere x_i is an n element vector and A_i is an n by n (unit, or non-unit, upper or lower triangular matrix)\nwith strides specifying how to retrieve $x_i$ (resp. $A_i$) from $x_{i-1}$ (resp. $A_i$).\nThe vectors x_i are overwritten.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  A_i is an upper triangular matrix.\n- rocblas_fill_lower:  A_i is a  lower triangular matrix.\n\n@param[in]\ntransA     [rocblas_operation]\n- rocblas_operation_none:    op(A) = A.\n- rocblas_operation_transpose:   op(A) = A^T\n- rocblas_operation_conjugate_transpose:  op(A) = A^H\n\n@param[in]\ndiag    [rocblas_diagonal]\n- rocblas_diagonal_unit:     A_i is assumed to be unit triangular.\n- rocblas_diagonal_non_unit:  A_i is not assumed to be unit triangular.\n\n@param[in]\nn         [rocblas_int]\nn specifies the number of rows of matrices A_i. n >= 0.\n\n@param[in]\nA       device pointer to the matrix A_1 of the batch, of dimension ( lda, n ). If uplo == rocblas_fill_upper, the upper triangular part of the leading n-by-n array contains the matrix A_i, otherwise the lower triangular part of the leading n-by-n array contains the matrix A_i.\n\n@param[in]\nstride_A  [rocblas_stride]\nstride from the start of one A_i matrix to the next A_{i + 1}.\n\n@param[in, out]\nx       device pointer to the vector x_1 of the batch. On exit, each x_i is overwritten with the transformed vector x_i.\n\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of one vector x.\n\n@param[in]\nstride_x  [rocblas_stride]\nstride from the start of one x_i vector to the next x_{i + 1}.\n\n@param[in]\nbatch_count [rocblas_int]\nThe number of batched matrices/vectors.\n\n*/\n    pub fn rocblas_stpmv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const f32,\n        stride_A: rocblas_stride,\n        x: *mut f32,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtpmv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const f64,\n        stride_A: rocblas_stride,\n        x: *mut f64,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctpmv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const rocblas_float_complex,\n        stride_A: rocblas_stride,\n        x: *mut rocblas_float_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztpmv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const rocblas_double_complex,\n        stride_A: rocblas_stride,\n        x: *mut rocblas_double_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_stpmv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const f32,\n        stride_A: rocblas_stride,\n        x: *mut f32,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtpmv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const f64,\n        stride_A: rocblas_stride,\n        x: *mut f64,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctpmv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const rocblas_float_complex,\n        stride_A: rocblas_stride,\n        x: *mut rocblas_float_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztpmv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const rocblas_double_complex,\n        stride_A: rocblas_stride,\n        x: *mut rocblas_double_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\ntbmv performs one of the matrix-vector operations:\n\nx := A*x      or\nx := A**T*x   or\nx := A**H*x,\nx is a vectors and A is a banded n by n matrix (see description below).\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\n- rocblas_fill_upper: A is an upper banded triangular matrix.\n- rocblas_fill_lower: A is a  lower banded triangular matrix.\n@param[in]\ntrans     [rocblas_operation]\nindicates whether matrix A is tranposed (conjugated) or not.\n@param[in]\ndiag      [rocblas_diagonal]\n- rocblas_diagonal_unit: The main diagonal of A is assumed to consist of only\n1's and is not referenced.\n- rocblas_diagonal_non_unit: No assumptions are made of A's main diagonal.\n@param[in]\nn         [rocblas_int]\nthe number of rows and columns of the matrix represented by A.\n@param[in]\nk         [rocblas_int]\n\nif uplo == rocblas_fill_upper, k specifies the number of super-diagonals\nof the matrix A.\n\nif uplo == rocblas_fill_lower, k specifies the number of sub-diagonals\nof the matrix A.\nk must satisfy k > 0 && k < lda.\n@param[in]\nA         device pointer storing banded triangular matrix A.\n\nif uplo == rocblas_fill_upper:\nThe matrix represented is an upper banded triangular matrix\nwith the main diagonal and k super-diagonals, everything\nelse can be assumed to be 0.\nThe matrix is compacted so that the main diagonal resides on the k'th\nrow, the first super diagonal resides on the RHS of the k-1'th row, etc,\nwith the k'th diagonal on the RHS of the 0'th row.\nEx: (rocblas_fill_upper; n = 5; k = 2)\n1 6 9 0 0              0 0 9 8 7\n0 2 7 8 0              0 6 7 8 9\n0 0 3 8 7     ---->    1 2 3 4 5\n0 0 0 4 9              0 0 0 0 0\n0 0 0 0 5              0 0 0 0 0\n\nif uplo == rocblas_fill_lower:\nThe matrix represnted is a lower banded triangular matrix\nwith the main diagonal and k sub-diagonals, everything else can be\nassumed to be 0.\nThe matrix is compacted so that the main diagonal resides on the 0'th row,\nworking up to the k'th diagonal residing on the LHS of the k'th row.\nEx: (rocblas_fill_lower; n = 5; k = 2)\n1 0 0 0 0              1 2 3 4 5\n6 2 0 0 0              6 7 8 9 0\n9 7 3 0 0     ---->    9 8 7 0 0\n0 8 8 4 0              0 0 0 0 0\n0 0 7 9 5              0 0 0 0 0\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A. lda must satisfy lda > k.\n@param[in, out]\nx         device pointer storing vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n*/\n    pub fn rocblas_stbmv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        k: rocblas_int,\n        A: *const f32,\n        lda: rocblas_int,\n        x: *mut f32,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtbmv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        k: rocblas_int,\n        A: *const f64,\n        lda: rocblas_int,\n        x: *mut f64,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctbmv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        k: rocblas_int,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        x: *mut rocblas_float_complex,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztbmv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        k: rocblas_int,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        x: *mut rocblas_double_complex,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_stbmv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        k: i64,\n        A: *const f32,\n        lda: i64,\n        x: *mut f32,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtbmv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        k: i64,\n        A: *const f64,\n        lda: i64,\n        x: *mut f64,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctbmv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        k: i64,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        x: *mut rocblas_float_complex,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztbmv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        k: i64,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        x: *mut rocblas_double_complex,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\ntbmv_batched performs one of the matrix-vector operations:\n\nx_i := A_i*x_i      or\nx_i := A_i**T*x_i   or\nx_i := A_i**H*x_i,\nwhere (A_i, x_i) is the i-th instance of the batch.\nx_i is a vector and A_i is an n by n matrix, for i = 1, ..., batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\n- rocblas_fill_upper: each A_i is an upper banded triangular matrix.\n- rocblas_fill_lower: each A_i is a  lower banded triangular matrix.\n@param[in]\ntrans     [rocblas_operation]\nindicates whether each matrix A_i is tranposed (conjugated) or not.\n@param[in]\ndiag      [rocblas_diagonal]\n- rocblas_diagonal_unit: The main diagonal of each A_i is assumed to consist of only\n1's and is not referenced.\n- rocblas_diagonal_non_unit: No assumptions are made of each A_i's main diagonal.\n@param[in]\nn         [rocblas_int]\nthe number of rows and columns of the matrix represented by each A_i.\n@param[in]\nk         [rocblas_int]\n\nif uplo == rocblas_fill_upper, k specifies the number of super-diagonals\nof each matrix A_i.\n\nif uplo == rocblas_fill_lower, k specifies the number of sub-diagonals\nof each matrix A_i.\nk must satisfy k > 0 && k < lda.\n@param[in]\nA         device array of device pointers storing each banded triangular matrix A_i.\n\nif uplo == rocblas_fill_upper:\nThe matrix represented is an upper banded triangular matrix\nwith the main diagonal and k super-diagonals, everything\nelse can be assumed to be 0.\nThe matrix is compacted so that the main diagonal resides on the k'th\nrow, the first super diagonal resides on the RHS of the k-1'th row, etc,\nwith the k'th diagonal on the RHS of the 0'th row.\nEx: (rocblas_fill_upper; n = 5; k = 2)\n1 6 9 0 0              0 0 9 8 7\n0 2 7 8 0              0 6 7 8 9\n0 0 3 8 7     ---->    1 2 3 4 5\n0 0 0 4 9              0 0 0 0 0\n0 0 0 0 5              0 0 0 0 0\n\nif uplo == rocblas_fill_lower:\nThe matrix represnted is a lower banded triangular matrix\nwith the main diagonal and k sub-diagonals, everything else can be\nassumed to be 0.\nThe matrix is compacted so that the main diagonal resides on the 0'th row,\nworking up to the k'th diagonal residing on the LHS of the k'th row.\nEx: (rocblas_fill_lower; n = 5; k = 2)\n1 0 0 0 0              1 2 3 4 5\n6 2 0 0 0              6 7 8 9 0\n9 7 3 0 0     ---->    9 8 7 0 0\n0 8 8 4 0              0 0 0 0 0\n0 0 7 9 5              0 0 0 0 0\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each A_i. lda must satisfy lda > k.\n@param[in, out]\nx         device array of device pointer storing each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_stbmv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        k: rocblas_int,\n        A: *const *const f32,\n        lda: rocblas_int,\n        x: *const *mut f32,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtbmv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        k: rocblas_int,\n        A: *const *const f64,\n        lda: rocblas_int,\n        x: *const *mut f64,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctbmv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        k: rocblas_int,\n        A: *const *const rocblas_float_complex,\n        lda: rocblas_int,\n        x: *const *mut rocblas_float_complex,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztbmv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        k: rocblas_int,\n        A: *const *const rocblas_double_complex,\n        lda: rocblas_int,\n        x: *const *mut rocblas_double_complex,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_stbmv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        k: i64,\n        A: *const *const f32,\n        lda: i64,\n        x: *const *mut f32,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtbmv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        k: i64,\n        A: *const *const f64,\n        lda: i64,\n        x: *const *mut f64,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctbmv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        k: i64,\n        A: *const *const rocblas_float_complex,\n        lda: i64,\n        x: *const *mut rocblas_float_complex,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztbmv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        k: i64,\n        A: *const *const rocblas_double_complex,\n        lda: i64,\n        x: *const *mut rocblas_double_complex,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\ntbmv_strided_batched performs one of the matrix-vector operations:\n\nx_i := A_i*x_i      or\nx_i := A_i**T*x_i   or\nx_i := A_i**H*x_i,\nwhere (A_i, x_i) is the i-th instance of the batch.\nx_i is a vector and A_i is an n by n matrix, for i = 1, ..., batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\n- rocblas_fill_upper: each A_i is an upper banded triangular matrix.\n- rocblas_fill_lower: each A_i is a  lower banded triangular matrix.\n@param[in]\ntrans     [rocblas_operation]\nindicates whether each matrix A_i is tranposed (conjugated) or not.\n@param[in]\ndiag      [rocblas_diagonal]\n- rocblas_diagonal_unit: The main diagonal of each A_i is assumed to consist of only\n1's and is not referenced.\n- rocblas_diagonal_non_unit: No assumptions are made of each A_i's main diagonal.\n@param[in]\nn         [rocblas_int]\nthe number of rows and columns of the matrix represented by each A_i.\n@param[in]\nk         [rocblas_int]\n\nif uplo == rocblas_fill_upper, k specifies the number of super-diagonals\nof each matrix A_i.\n\nif uplo == rocblas_fill_lower, k specifies the number of sub-diagonals\nof each matrix A_i.\nk must satisfy k > 0 && k < lda.\n@param[in]\nA         device array to the first matrix A_i of the batch. Stores each banded triangular matrix A_i.\n\nif uplo == rocblas_fill_upper:\nThe matrix represented is an upper banded triangular matrix\nwith the main diagonal and k super-diagonals, everything\nelse can be assumed to be 0.\nThe matrix is compacted so that the main diagonal resides on the k'th\nrow, the first super diagonal resides on the RHS of the k-1'th row, etc,\nwith the k'th diagonal on the RHS of the 0'th row.\nEx: (rocblas_fill_upper; n = 5; k = 2)\n1 6 9 0 0              0 0 9 8 7\n0 2 7 8 0              0 6 7 8 9\n0 0 3 8 7     ---->    1 2 3 4 5\n0 0 0 4 9              0 0 0 0 0\n0 0 0 0 5              0 0 0 0 0\n\nif uplo == rocblas_fill_lower:\nThe matrix represnted is a lower banded triangular matrix\nwith the main diagonal and k sub-diagonals, everything else can be\nassumed to be 0.\nThe matrix is compacted so that the main diagonal resides on the 0'th row,\nworking up to the k'th diagonal residing on the LHS of the k'th row.\nEx: (rocblas_fill_lower; n = 5; k = 2)\n1 0 0 0 0              1 2 3 4 5\n6 2 0 0 0              6 7 8 9 0\n9 7 3 0 0     ---->    9 8 7 0 0\n0 8 8 4 0              0 0 0 0 0\n0 0 7 9 5              0 0 0 0 0\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each A_i. lda must satisfy lda > k.\n@param[in]\nstride_A  [rocblas_stride]\nstride from the start of one A_i matrix to the next A_(i + 1).\n@param[in, out]\nx         device array to the first vector x_i of the batch.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\nstride_x  [rocblas_stride]\nstride from the start of one x_i matrix to the next x_(i + 1).\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_stbmv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        k: rocblas_int,\n        A: *const f32,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        x: *mut f32,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtbmv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        k: rocblas_int,\n        A: *const f64,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        x: *mut f64,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctbmv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        k: rocblas_int,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        x: *mut rocblas_float_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztbmv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        k: rocblas_int,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        x: *mut rocblas_double_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_stbmv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        k: i64,\n        A: *const f32,\n        lda: i64,\n        stride_A: rocblas_stride,\n        x: *mut f32,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtbmv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        k: i64,\n        A: *const f64,\n        lda: i64,\n        stride_A: rocblas_stride,\n        x: *mut f64,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctbmv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        k: i64,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        x: *mut rocblas_float_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztbmv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        k: i64,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        x: *mut rocblas_double_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\ntbsv solves:\n\nA*x = b or\nA**T*x = b or\nA**H*x = b\nwhere x and b are vectors and A is a banded triangular matrix.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  A is an upper triangular matrix.\n- rocblas_fill_lower:  A is a  lower triangular matrix.\n\n@param[in]\ntransA     [rocblas_operation]\n- rocblas_operation_none: Solves A*x = b\n- rocblas_operation_transpose: Solves A**T*x = b\n- rocblas_operation_conjugate_transpose: Solves A**H*x = b\n\n@param[in]\ndiag    [rocblas_diagonal]\n- rocblas_diagonal_unit: A is assumed to be unit triangular (i.e. the diagonal elements\nof A are not used in computations).\n- rocblas_diagonal_non_unit: A is not assumed to be unit triangular.\n\n@param[in]\nn         [rocblas_int]\nn specifies the number of rows of b. n >= 0.\n@param[in]\nk         [rocblas_int]\n\nif(uplo == rocblas_fill_upper)\nk specifies the number of super-diagonals of A.\nif(uplo == rocblas_fill_lower)\nk specifies the number of sub-diagonals of A.\nk >= 0.\n\n@param[in]\nA         device pointer storing the matrix A in banded format.\n\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A.\nlda >= (k + 1).\n\n@param[in, out]\nx         device pointer storing input vector b. Overwritten by the output vector x.\n\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n*/\n    pub fn rocblas_stbsv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        k: rocblas_int,\n        A: *const f32,\n        lda: rocblas_int,\n        x: *mut f32,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtbsv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        k: rocblas_int,\n        A: *const f64,\n        lda: rocblas_int,\n        x: *mut f64,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctbsv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        k: rocblas_int,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        x: *mut rocblas_float_complex,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztbsv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        k: rocblas_int,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        x: *mut rocblas_double_complex,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_stbsv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        k: i64,\n        A: *const f32,\n        lda: i64,\n        x: *mut f32,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtbsv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        k: i64,\n        A: *const f64,\n        lda: i64,\n        x: *mut f64,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctbsv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        k: i64,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        x: *mut rocblas_float_complex,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztbsv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        k: i64,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        x: *mut rocblas_double_complex,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\ntbsv_batched solves:\n\nA_i*x_i = b_i or\nA_i**T*x_i = b_i or\nA_i**H*x_i = b_i\nwhere x_i and b_i are vectors and A_i is a banded triangular matrix,\nfor i = [1, batch_count].\n\nThe input vectors b_i are overwritten by the output vectors x_i.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  A_i is an upper triangular matrix.\n- rocblas_fill_lower:  A_i is a  lower triangular matrix.\n\n@param[in]\ntransA     [rocblas_operation]\n- rocblas_operation_none: Solves A_i*x_i = b_i\n- rocblas_operation_transpose: Solves A_i**T*x_i = b_i\n- rocblas_operation_conjugate_transpose: Solves A_i**H*x_i = b_i\n\n@param[in]\ndiag    [rocblas_diagonal]\n- rocblas_diagonal_unit:     each A_i is assumed to be unit triangular (i.e. the diagonal elements\nof each A_i are not used in computations).\n- rocblas_diagonal_non_unit: each A_i is not assumed to be unit triangular.\n\n@param[in]\nn         [rocblas_int]\nn specifies the number of rows of each b_i. n >= 0.\n@param[in]\nk         [rocblas_int]\n\nif(uplo == rocblas_fill_upper)\nk specifies the number of super-diagonals of each A_i.\nif(uplo == rocblas_fill_lower)\nk specifies the number of sub-diagonals of each A_i.\nk >= 0.\n\n@param[in]\nA         device vector of device pointers storing each matrix A_i in banded format.\n\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each A_i.\nlda >= (k + 1).\n\n@param[in, out]\nx         device vector of device pointers storing each input vector b_i. Overwritten by each output\nvector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_stbsv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        k: rocblas_int,\n        A: *const *const f32,\n        lda: rocblas_int,\n        x: *const *mut f32,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtbsv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        k: rocblas_int,\n        A: *const *const f64,\n        lda: rocblas_int,\n        x: *const *mut f64,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctbsv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        k: rocblas_int,\n        A: *const *const rocblas_float_complex,\n        lda: rocblas_int,\n        x: *const *mut rocblas_float_complex,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztbsv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        k: rocblas_int,\n        A: *const *const rocblas_double_complex,\n        lda: rocblas_int,\n        x: *const *mut rocblas_double_complex,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_stbsv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        k: i64,\n        A: *const *const f32,\n        lda: i64,\n        x: *const *mut f32,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtbsv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        k: i64,\n        A: *const *const f64,\n        lda: i64,\n        x: *const *mut f64,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctbsv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        k: i64,\n        A: *const *const rocblas_float_complex,\n        lda: i64,\n        x: *const *mut rocblas_float_complex,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztbsv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        k: i64,\n        A: *const *const rocblas_double_complex,\n        lda: i64,\n        x: *const *mut rocblas_double_complex,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\ntbsv_strided_batched solves:\n\nA_i*x_i = b_i or\nA_i**T*x_i = b_i or\nA_i**H*x_i = b_i\nwhere x_i and b_i are vectors and A_i is a banded triangular matrix,\nfor i = [1, batch_count].\n\nThe input vectors b_i are overwritten by the output vectors x_i.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  A_i is an upper triangular matrix.\n- rocblas_fill_lower:  A_i is a  lower triangular matrix.\n\n@param[in]\ntransA     [rocblas_operation]\n- rocblas_operation_none: Solves A_i*x_i = b_i\n- rocblas_operation_transpose: Solves A_i**T*x_i = b_i\n- rocblas_operation_conjugate_transpose: Solves A_i**H*x_i = b_i\n\n@param[in]\ndiag    [rocblas_diagonal]\n- rocblas_diagonal_unit:     each A_i is assumed to be unit triangular (i.e. the diagonal elements\nof each A_i are not used in computations).\n- rocblas_diagonal_non_unit: each A_i is not assumed to be unit triangular.\n\n@param[in]\nn         [rocblas_int]\nn specifies the number of rows of each b_i. n >= 0.\n@param[in]\nk         [rocblas_int]\n\nif(uplo == rocblas_fill_upper)\nk specifies the number of super-diagonals of each A_i.\nif(uplo == rocblas_fill_lower)\nk specifies the number of sub-diagonals of each A_i.\nk >= 0.\n\n@param[in]\nA         device pointer pointing to the first banded matrix A_1.\n\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each A_i.\nlda >= (k + 1).\n@param[in]\nstride_A  [rocblas_stride]\nspecifies the distance between the start of one matrix (A_i) and the next (A_i+1).\n\n@param[in, out]\nx         device pointer pointing to the first input vector b_1. Overwritten by output vectors x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\nstride_x  [rocblas_stride]\nspecifies the distance between the start of one vector (x_i) and the next (x_i+1).\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_stbsv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        k: rocblas_int,\n        A: *const f32,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        x: *mut f32,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtbsv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        k: rocblas_int,\n        A: *const f64,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        x: *mut f64,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctbsv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        k: rocblas_int,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        x: *mut rocblas_float_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztbsv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        k: rocblas_int,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        x: *mut rocblas_double_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_stbsv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        k: i64,\n        A: *const f32,\n        lda: i64,\n        stride_A: rocblas_stride,\n        x: *mut f32,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtbsv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        k: i64,\n        A: *const f64,\n        lda: i64,\n        stride_A: rocblas_stride,\n        x: *mut f64,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctbsv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        k: i64,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        x: *mut rocblas_float_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztbsv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        k: i64,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        x: *mut rocblas_double_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\ntrsv solves:\n\nA*x = b or\nA**T*x = b or\nA**H*x = b,\nwhere x and b are vectors and A is a triangular matrix.\nThe vector x is overwritten on b.\n\nAlthough not widespread, some gemm kernels used by trsv may use atomic operations.\nSee Atomic Operations in the API Reference Guide for more information.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  A is an upper triangular matrix.\n- rocblas_fill_lower:  A is a  lower triangular matrix.\n\n@param[in]\ntransA     [rocblas_operation]\n- rocblas_operation_none:    op(A) = A.\n- rocblas_operation_transpose:   op(A) = A^T\n- rocblas_operation_conjugate_transpose:  op(A) = A^H\n\n@param[in]\ndiag    [rocblas_diagonal]\n- rocblas_diagonal_unit:     A is assumed to be unit triangular.\n- rocblas_diagonal_non_unit:  A is not assumed to be unit triangular.\n\n@param[in]\nn         [rocblas_int]\nn specifies the number of rows of b. n >= 0.\n\n@param[in]\nA         device pointer storing matrix A, of dimension ( lda, n ). If uplo == rocblas_fill_upper, the upper triangular part of the leading n-by-n array contains the matrix A, otherwise the lower triangular part of the leading n-by-n array contains the matrix A.\n\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A. lda must be at least max( 1, n ).\n\n@param[in, out]\nx         device pointer storing vector x. On exit, x is overwritten with the transformed vector x.\n\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n*/\n    pub fn rocblas_strsv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const f32,\n        lda: rocblas_int,\n        x: *mut f32,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtrsv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const f64,\n        lda: rocblas_int,\n        x: *mut f64,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctrsv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        x: *mut rocblas_float_complex,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztrsv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        x: *mut rocblas_double_complex,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_strsv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const f32,\n        lda: i64,\n        x: *mut f32,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtrsv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const f64,\n        lda: i64,\n        x: *mut f64,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctrsv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        x: *mut rocblas_float_complex,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztrsv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        x: *mut rocblas_double_complex,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\ntrsv_batched solves:\n\nA_i*x_i = b_i or\nA_i**T*x_i = b_i or\nA_i**H*x_i = b_i,\nwhere (A_i, x_i, b_i) is the i-th instance of the batch.\nx_i and b_i are vectors and A_i is an\nn by n triangular matrix.\n\nThe vector x is overwritten on b.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  A is an upper triangular matrix.\n- rocblas_fill_lower:  A is a  lower triangular matrix.\n\n@param[in]\ntransA     [rocblas_operation]\n- rocblas_operation_none:    op(A) = A.\n- rocblas_operation_transpose:   op(A) = A^T\n- rocblas_operation_conjugate_transpose:  op(A) = A^H\n\n@param[in]\ndiag    [rocblas_diagonal]\n- rocblas_diagonal_unit:     A is assumed to be unit triangular.\n- rocblas_diagonal_non_unit:  A is not assumed to be unit triangular.\n\n@param[in]\nn         [rocblas_int]\nn specifies the number of rows of b. n >= 0.\n\n@param[in]\nA         device pointer to an array of device pointers to the A_i matrices, of dimension ( lda, n ). If uplo == rocblas_fill_upper, the upper triangular part of the leading n-by-n array contains the matrix A_i, otherwise the lower triangular part of the leading n-by-n array contains the matrix A_i.\n\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A_i. lda must be at least max( 1, n ).\n\n@param[in, out]\nx         device pointer to an array of device pointers to the x_i vectors. On exit, each x_i is overwritten with the transformed vector x_i.\n\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_strsv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const *const f32,\n        lda: rocblas_int,\n        x: *const *mut f32,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtrsv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const *const f64,\n        lda: rocblas_int,\n        x: *const *mut f64,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctrsv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const *const rocblas_float_complex,\n        lda: rocblas_int,\n        x: *const *mut rocblas_float_complex,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztrsv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const *const rocblas_double_complex,\n        lda: rocblas_int,\n        x: *const *mut rocblas_double_complex,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_strsv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const *const f32,\n        lda: i64,\n        x: *const *mut f32,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtrsv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const *const f64,\n        lda: i64,\n        x: *const *mut f64,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctrsv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const *const rocblas_float_complex,\n        lda: i64,\n        x: *const *mut rocblas_float_complex,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztrsv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const *const rocblas_double_complex,\n        lda: i64,\n        x: *const *mut rocblas_double_complex,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\ntrsv_strided_batched solves:\n\nA_i*x_i = b_i or\nA_i**T*x_i = b_i or\nA_i**H*x_i = b_i,\nwhere (A_i, x_i, b_i) is the i-th instance of the batch.\nx_i and b_i are vectors and A_i is an n by n triangular matrix, for i = 1, ..., batch_count.\n\nThe vector x is overwritten on b.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  A is an upper triangular matrix.\n- rocblas_fill_lower:  A is a  lower triangular matrix.\n\n@param[in]\ntransA     [rocblas_operation]\n- rocblas_operation_none:    op(A) = A.\n- rocblas_operation_transpose:   op(A) = A^T\n- rocblas_operation_conjugate_transpose:  op(A) = A^H\n\n@param[in]\ndiag    [rocblas_diagonal]\n- rocblas_diagonal_unit:     A is assumed to be unit triangular.\n- rocblas_diagonal_non_unit:  A is not assumed to be unit triangular.\n\n@param[in]\nn         [rocblas_int]\nn specifies the number of rows of each b_i. n >= 0.\n\n@param[in]\nA         device pointer to the matrix A_1 of the batch, of dimension ( lda, n ). If uplo == rocblas_fill_upper, the upper triangular part of the leading n-by-n array contains the matrix A_i, otherwise the lower triangular part of the leading n-by-n array contains the matrix A_i.\n\n@param[in]\nstride_A  [rocblas_stride]\nstride from the start of one A_i matrix to the next A_(i + 1).\n\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A_i. lda must be at least max( 1, n ).\n\n@param[in, out]\nx         device pointer to the vector x_1 of the batch. On exit, each x_i is overwritten with the transformed vector x_i.\n\n@param[in]\nstride_x [rocblas_stride]\nstride from the start of one x_i vector to the next x_(i + 1)\n\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_strsv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const f32,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        x: *mut f32,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtrsv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const f64,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        x: *mut f64,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctrsv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        x: *mut rocblas_float_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztrsv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        x: *mut rocblas_double_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_strsv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const f32,\n        lda: i64,\n        stride_A: rocblas_stride,\n        x: *mut f32,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtrsv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const f64,\n        lda: i64,\n        stride_A: rocblas_stride,\n        x: *mut f64,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctrsv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        x: *mut rocblas_float_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztrsv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        x: *mut rocblas_double_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\ntpsv solves:\n\nA*x = b or\nA**T*x = b or\nA**H*x = b\nwhere x and b are vectors and A is a triangular matrix stored in the packed format.\n\nThe input vector b is overwritten by the output vector x.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  A is an upper triangular matrix.\n- rocblas_fill_lower:  A is a  lower triangular matrix.\n\n@param[in]\ntransA  [rocblas_operation]\n- rocblas_operation_none: Solves A*x = b\n- rocblas_operation_transpose: Solves A**T*x = b\n- rocblas_operation_conjugate_transpose: Solves A**H*x = b\n\n@param[in]\ndiag    [rocblas_diagonal]\n- rocblas_diagonal_unit:  A is assumed to be unit triangular (i.e. the diagonal elements\nof A are not used in computations).\n- rocblas_diagonal_non_unit: A is not assumed to be unit triangular.\n\n@param[in]\nn         [rocblas_int]\nn specifies the number of rows of b. n >= 0.\n\n@param[in]\nAP        device pointer storing the packed version of matrix A,\nof dimension >= (n * (n + 1) / 2).\n\n@param[in, out]\nx         device pointer storing vector b on input, overwritten by x on output.\n\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n*/\n    pub fn rocblas_stpsv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        AP: *const f32,\n        x: *mut f32,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtpsv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        AP: *const f64,\n        x: *mut f64,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctpsv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        AP: *const rocblas_float_complex,\n        x: *mut rocblas_float_complex,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztpsv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        AP: *const rocblas_double_complex,\n        x: *mut rocblas_double_complex,\n        incx: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_stpsv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        AP: *const f32,\n        x: *mut f32,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtpsv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        AP: *const f64,\n        x: *mut f64,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctpsv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        AP: *const rocblas_float_complex,\n        x: *mut rocblas_float_complex,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztpsv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        AP: *const rocblas_double_complex,\n        x: *mut rocblas_double_complex,\n        incx: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\ntpsv_batched solves:\n\nA_i*x_i = b_i or\nA_i**T*x_i = b_i or\nA_i**H*x_i = b_i\nwhere x_i and b_i are vectors and A_i is a triangular matrix stored in the packed format,\nfor i in [1, batch_count].\n\nThe input vectors b_i are overwritten by the output vectors x_i.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  each A_i is an upper triangular matrix.\n- rocblas_fill_lower:  each A_i is a  lower triangular matrix.\n\n@param[in]\ntransA  [rocblas_operation]\n- rocblas_operation_none: Solves A*x = b\n- rocblas_operation_transpose: Solves A**T*x = b\n- rocblas_operation_conjugate_transpose: Solves A**H*x = b\n\n@param[in]\ndiag    [rocblas_diagonal]\n- rocblas_diagonal_unit: Each A_i is assumed to be unit triangular (i.e. the diagonal elements\nof each A_i are not used in computations).\n- rocblas_diagonal_non_unit: each A_i is not assumed to be unit triangular.\n\n@param[in]\nn         [rocblas_int]\nn specifies the number of rows of each b_i. n >= 0.\n\n@param[in]\nAP        device array of device pointers storing the packed versions of each matrix A_i,\nof dimension >= (n * (n + 1) / 2).\n\n@param[in, out]\nx         device array of device pointers storing each input vector b_i, overwritten by x_i on output.\n\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\nbatch_count [rocblas_int]\nspecifies the number of instances in the batch.\n*/\n    pub fn rocblas_stpsv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        AP: *const *const f32,\n        x: *const *mut f32,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtpsv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        AP: *const *const f64,\n        x: *const *mut f64,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctpsv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        AP: *const *const rocblas_float_complex,\n        x: *const *mut rocblas_float_complex,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztpsv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        AP: *const *const rocblas_double_complex,\n        x: *const *mut rocblas_double_complex,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_stpsv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        AP: *const *const f32,\n        x: *const *mut f32,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtpsv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        AP: *const *const f64,\n        x: *const *mut f64,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctpsv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        AP: *const *const rocblas_float_complex,\n        x: *const *mut rocblas_float_complex,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztpsv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        AP: *const *const rocblas_double_complex,\n        x: *const *mut rocblas_double_complex,\n        incx: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\ntpsv_strided_batched solves:\n\nA_i*x_i = b_i or\nA_i**T*x_i = b_i or\nA_i**H*x_i = b_i\nwhere x_i and b_i are vectors and A_i is a triangular matrix stored in the packed format,\nfor i in [1, batch_count].\n\nThe input vectors b_i are overwritten by the output vectors x_i.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  each A_i is an upper triangular matrix.\n- rocblas_fill_lower:  each A_i is a  lower triangular matrix.\n\n@param[in]\ntransA  [rocblas_operation]\n- rocblas_operation_none: Solves A*x = b\n- rocblas_operation_transpose: Solves A**T*x = b\n- rocblas_operation_conjugate_transpose: Solves A**H*x = b\n\n@param[in]\ndiag    [rocblas_diagonal]\n- rocblas_diagonal_unit:     each A_i is assumed to be unit triangular (i.e. the diagonal elements\nof each A_i are not used in computations).\n- rocblas_diagonal_non_unit: each A_i is not assumed to be unit triangular.\n\n@param[in]\nn         [rocblas_int]\nn specifies the number of rows of each b_i. n >= 0.\n\n@param[in]\nAP        device pointer pointing to the first packed matrix A_1,\nof dimension >= (n * (n + 1) / 2).\n\n@param[in]\nstride_A  [rocblas_stride]\nstride from the beginning of one packed matrix (AP_i) and the next (AP_i+1).\n\n@param[in, out]\nx         device pointer pointing to the first input vector b_1. Overwritten by each x_i on output.\n\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\nstride_x  [rocblas_stride]\nstride from the beginning of one vector (x_i) and the next (x_i+1).\n@param[in]\nbatch_count [rocblas_int]\nspecifies the number of instances in the batch.\n*/\n    pub fn rocblas_stpsv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        AP: *const f32,\n        stride_A: rocblas_stride,\n        x: *mut f32,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtpsv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        AP: *const f64,\n        stride_A: rocblas_stride,\n        x: *mut f64,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctpsv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        AP: *const rocblas_float_complex,\n        stride_A: rocblas_stride,\n        x: *mut rocblas_float_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztpsv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        AP: *const rocblas_double_complex,\n        stride_A: rocblas_stride,\n        x: *mut rocblas_double_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_stpsv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        AP: *const f32,\n        stride_A: rocblas_stride,\n        x: *mut f32,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtpsv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        AP: *const f64,\n        stride_A: rocblas_stride,\n        x: *mut f64,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctpsv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        AP: *const rocblas_float_complex,\n        stride_A: rocblas_stride,\n        x: *mut rocblas_float_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztpsv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        n: i64,\n        AP: *const rocblas_double_complex,\n        stride_A: rocblas_stride,\n        x: *mut rocblas_double_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nsymv performs the matrix-vector operation:\n\ny := alpha*A*x + beta*y\nwhere alpha and beta are scalars, x and y are n element vectors and\nA should contain an upper or lower triangular n by n symmetric matrix.\n\nsymv has an implementation which uses atomic operations. See Atomic Operations\nin the API Reference Guide for more information.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo     [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- if rocblas_fill_upper, the lower part of A is not referenced.\n- if rocblas_fill_lower, the upper part of A is not referenced.\n@param[in]\nn         [rocblas_int]\n@param[in]\nalpha\nspecifies the scalar alpha.\n@param[in]\nA         pointer storing matrix A on the GPU\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A.\n@param[in]\nx         pointer storing vector x on the GPU.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n@param[in]\nbeta      specifies the scalar beta\n@param[out]\ny         pointer storing vector y on the GPU.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of y.\n*/\n    pub fn rocblas_ssymv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocblas_int,\n        x: *const f32,\n        incx: rocblas_int,\n        beta: *const f32,\n        y: *mut f32,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsymv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocblas_int,\n        x: *const f64,\n        incx: rocblas_int,\n        beta: *const f64,\n        y: *mut f64,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csymv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        beta: *const rocblas_float_complex,\n        y: *mut rocblas_float_complex,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsymv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        beta: *const rocblas_double_complex,\n        y: *mut rocblas_double_complex,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ssymv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        x: *const f32,\n        incx: i64,\n        beta: *const f32,\n        y: *mut f32,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsymv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        x: *const f64,\n        incx: i64,\n        beta: *const f64,\n        y: *mut f64,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csymv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        beta: *const rocblas_float_complex,\n        y: *mut rocblas_float_complex,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsymv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        beta: *const rocblas_double_complex,\n        y: *mut rocblas_double_complex,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nsymv_batched performs the matrix-vector operation:\n\ny_i := alpha*A_i*x_i + beta*y_i\nwhere (A_i, x_i, y_i) is the i-th instance of the batch.\nalpha and beta are scalars, x_i and y_i are vectors and A_i is an\nn by n symmetric matrix, for i = 1, ..., batch_count.\nA a should contain an upper or lower triangular symmetric matrix\nand the opposing triangular part of A is not referenced.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- if rocblas_fill_upper, the lower part of A is not referenced.\n- if rocblas_fill_lower, the upper part of A is not referenced.\n@param[in]\nn         [rocblas_int]\nnumber of rows and columns of each matrix A_i.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nA         device array of device pointers storing each matrix A_i.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each matrix A_i.\n@param[in]\nx         device array of device pointers storing each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each vector x_i.\n@param[in]\nbeta      device pointer or host pointer to scalar beta.\n@param[out]\ny         device array of device pointers storing each vector y_i.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of each vector y_i.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_ssymv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const *const f32,\n        lda: rocblas_int,\n        x: *const *const f32,\n        incx: rocblas_int,\n        beta: *const f32,\n        y: *const *mut f32,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsymv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f64,\n        A: *const *const f64,\n        lda: rocblas_int,\n        x: *const *const f64,\n        incx: rocblas_int,\n        beta: *const f64,\n        y: *const *mut f64,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csymv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: rocblas_int,\n        x: *const *const rocblas_float_complex,\n        incx: rocblas_int,\n        beta: *const rocblas_float_complex,\n        y: *const *mut rocblas_float_complex,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsymv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: rocblas_int,\n        x: *const *const rocblas_double_complex,\n        incx: rocblas_int,\n        beta: *const rocblas_double_complex,\n        y: *const *mut rocblas_double_complex,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ssymv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f32,\n        A: *const *const f32,\n        lda: i64,\n        x: *const *const f32,\n        incx: i64,\n        beta: *const f32,\n        y: *const *mut f32,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsymv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f64,\n        A: *const *const f64,\n        lda: i64,\n        x: *const *const f64,\n        incx: i64,\n        beta: *const f64,\n        y: *const *mut f64,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csymv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: i64,\n        x: *const *const rocblas_float_complex,\n        incx: i64,\n        beta: *const rocblas_float_complex,\n        y: *const *mut rocblas_float_complex,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsymv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: i64,\n        x: *const *const rocblas_double_complex,\n        incx: i64,\n        beta: *const rocblas_double_complex,\n        y: *const *mut rocblas_double_complex,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nsymv_strided_batched performs the matrix-vector operation:\n\ny_i := alpha*A_i*x_i + beta*y_i\nwhere (A_i, x_i, y_i) is the i-th instance of the batch.\nalpha and beta are scalars, x_i and y_i are vectors and A_i is an\nn by n symmetric matrix, for i = 1, ..., batch_count.\nA a should contain an upper or lower triangular symmetric matrix\nand the opposing triangular part of A is not referenced.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- if rocblas_fill_upper, the lower part of A is not referenced\n- if rocblas_fill_lower, the upper part of A is not referenced\n@param[in]\nn         [rocblas_int]\nnumber of rows and columns of each matrix A_i.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nA         Device pointer to the first matrix A_1 on the GPU.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each matrix A_i.\n@param[in]\nstrideA     [rocblas_stride]\nstride from the start of one matrix (A_i) and the next one (A_i+1).\n@param[in]\nx         Device pointer to the first vector x_1 on the GPU.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each vector x_i.\n@param[in]\nstridex     [rocblas_stride]\nstride from the start of one vector (x_i) and the next one (x_i+1).\nThere are no restrictions placed on stride_x. However, ensure that stridex is of appropriate size.\nThis typically means stridex >= n * incx. stridex should be non zero.\n@param[in]\nbeta      device pointer or host pointer to scalar beta.\n@param[out]\ny         Device pointer to the first vector y_1 on the GPU.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of each vector y_i.\n@param[in]\nstridey     [rocblas_stride]\nstride from the start of one vector (y_i) and the next one (y_i+1).\nThere are no restrictions placed on stride_y. However, ensure that stridey is of appropriate size.\nThis typically means stridey >= n * incy. stridey should be non zero.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_ssymv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocblas_int,\n        strideA: rocblas_stride,\n        x: *const f32,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        beta: *const f32,\n        y: *mut f32,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsymv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocblas_int,\n        strideA: rocblas_stride,\n        x: *const f64,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        beta: *const f64,\n        y: *mut f64,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csymv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        strideA: rocblas_stride,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        beta: *const rocblas_float_complex,\n        y: *mut rocblas_float_complex,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsymv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        strideA: rocblas_stride,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        beta: *const rocblas_double_complex,\n        y: *mut rocblas_double_complex,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ssymv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        strideA: rocblas_stride,\n        x: *const f32,\n        incx: i64,\n        stridex: rocblas_stride,\n        beta: *const f32,\n        y: *mut f32,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsymv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        strideA: rocblas_stride,\n        x: *const f64,\n        incx: i64,\n        stridex: rocblas_stride,\n        beta: *const f64,\n        y: *mut f64,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csymv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        strideA: rocblas_stride,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        beta: *const rocblas_float_complex,\n        y: *mut rocblas_float_complex,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsymv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        strideA: rocblas_stride,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        beta: *const rocblas_double_complex,\n        y: *mut rocblas_double_complex,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nspmv performs the matrix-vector operation:\n\ny := alpha*A*x + beta*y\nwhere alpha and beta are scalars, x and y are n element vectors and\nA should contain an upper or lower triangular n by n packed symmetric matrix.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      rocblas_fill\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- if rocblas_fill_upper, the lower part of A is not referenced\n- if rocblas_fill_lower, the upper part of A is not referenced\n@param[in]\nn         [rocblas_int]\n@param[in]\nalpha\nspecifies the scalar alpha.\n@param[in]\nA         pointer storing matrix A on the GPU.\n@param[in]\nx         pointer storing vector x on the GPU.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n@param[in]\nbeta      specifies the scalar beta.\n@param[out]\ny         pointer storing vector y on the GPU.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of y.\n*/\n    pub fn rocblas_sspmv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        x: *const f32,\n        incx: rocblas_int,\n        beta: *const f32,\n        y: *mut f32,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dspmv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        x: *const f64,\n        incx: rocblas_int,\n        beta: *const f64,\n        y: *mut f64,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sspmv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f32,\n        A: *const f32,\n        x: *const f32,\n        incx: i64,\n        beta: *const f32,\n        y: *mut f32,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dspmv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f64,\n        A: *const f64,\n        x: *const f64,\n        incx: i64,\n        beta: *const f64,\n        y: *mut f64,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nspmv_batched performs the matrix-vector operation:\n\ny_i := alpha*A_i*x_i + beta*y_i\nwhere (A_i, x_i, y_i) is the i-th instance of the batch.\nalpha and beta are scalars, x_i and y_i are vectors and A_i is an\nn by n symmetric matrix, for i = 1, ..., batch_count.\nA should contain an upper or lower triangular n by n packed symmetric matrix.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- if rocblas_fill_upper, the lower part of A is not referenced\n- if rocblas_fill_lower, the upper part of A is not referenced\n@param[in]\nn         [rocblas_int]\nnumber of rows and columns of each matrix A_i.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nA         device array of device pointers storing each matrix A_i.\n@param[in]\nx         device array of device pointers storing each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each vector x_i.\n@param[in]\nbeta      device pointer or host pointer to scalar beta.\n@param[out]\ny         device array of device pointers storing each vector y_i.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of each vector y_i.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_sspmv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const *const f32,\n        x: *const *const f32,\n        incx: rocblas_int,\n        beta: *const f32,\n        y: *const *mut f32,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dspmv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f64,\n        A: *const *const f64,\n        x: *const *const f64,\n        incx: rocblas_int,\n        beta: *const f64,\n        y: *const *mut f64,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sspmv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f32,\n        A: *const *const f32,\n        x: *const *const f32,\n        incx: i64,\n        beta: *const f32,\n        y: *const *mut f32,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dspmv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f64,\n        A: *const *const f64,\n        x: *const *const f64,\n        incx: i64,\n        beta: *const f64,\n        y: *const *mut f64,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nspmv_strided_batched performs the matrix-vector operation:\n\ny_i := alpha*A_i*x_i + beta*y_i\nwhere (A_i, x_i, y_i) is the i-th instance of the batch.\nalpha and beta are scalars, x_i and y_i are vectors and A_i is an\nn by n symmetric matrix, for i = 1, ..., batch_count.\nA should contain an upper or lower triangular n by n packed symmetric matrix.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- if rocblas_fill_upper, the lower part of A is not referenced\n- if rocblas_fill_lower, the upper part of A is not referenced\n@param[in]\nn         [rocblas_int]\nnumber of rows and columns of each matrix A_i.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nA         Device pointer to the first matrix A_1 on the GPU.\n@param[in]\nstrideA     [rocblas_stride]\nstride from the start of one matrix (A_i) and the next one (A_i+1).\n@param[in]\nx         Device pointer to the first vector x_1 on the GPU.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each vector x_i.\n@param[in]\nstridex     [rocblas_stride]\nstride from the start of one vector (x_i) and the next one (x_i+1).\nThere are no restrictions placed on stridex. However, ensure that stridex is of appropriate size.\nThis typically means stridex >= n * incx. stridex should be non zero.\n@param[in]\nbeta      device pointer or host pointer to scalar beta.\n@param[out]\ny         Device pointer to the first vector y_1 on the GPU.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of each vector y_i.\n@param[in]\nstridey     [rocblas_stride]\nstride from the start of one vector (y_i) and the next one (y_i+1).\nThere are no restrictions placed on stridey. However, ensure that stridey is of appropriate size.\nThis typically means stridey >= n * incy. stridey should be non zero.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_sspmv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        strideA: rocblas_stride,\n        x: *const f32,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        beta: *const f32,\n        y: *mut f32,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dspmv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        strideA: rocblas_stride,\n        x: *const f64,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        beta: *const f64,\n        y: *mut f64,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sspmv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f32,\n        A: *const f32,\n        strideA: rocblas_stride,\n        x: *const f32,\n        incx: i64,\n        stridex: rocblas_stride,\n        beta: *const f32,\n        y: *mut f32,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dspmv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f64,\n        A: *const f64,\n        strideA: rocblas_stride,\n        x: *const f64,\n        incx: i64,\n        stridex: rocblas_stride,\n        beta: *const f64,\n        y: *mut f64,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nsbmv performs the matrix-vector operation:\n\ny := alpha*A*x + beta*y\nwhere alpha and beta are scalars, x and y are n element vectors and\nA should contain an upper or lower triangular n by n symmetric banded matrix.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      rocblas_fill\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- if rocblas_fill_upper, the lower part of A is not referenced\n- if rocblas_fill_lower, the upper part of A is not referenced\n@param[in]\nn         [rocblas_int]\n@param[in]\nk         [rocblas_int]\nspecifies the number of sub- and super-diagonals.\n@param[in]\nalpha\nspecifies the scalar alpha.\n@param[in]\nA         pointer storing matrix A on the GPU.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of matrix A.\n@param[in]\nx         pointer storing vector x on the GPU.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n@param[in]\nbeta      specifies the scalar beta.\n@param[out]\ny         pointer storing vector y on the GPU.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of y.\n*/\n    pub fn rocblas_ssbmv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocblas_int,\n        x: *const f32,\n        incx: rocblas_int,\n        beta: *const f32,\n        y: *mut f32,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsbmv(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocblas_int,\n        x: *const f64,\n        incx: rocblas_int,\n        beta: *const f64,\n        y: *mut f64,\n        incy: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ssbmv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        x: *const f32,\n        incx: i64,\n        beta: *const f32,\n        y: *mut f32,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsbmv_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        x: *const f64,\n        incx: i64,\n        beta: *const f64,\n        y: *mut f64,\n        incy: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nsbmv_batched performs the matrix-vector operation:\n\ny_i := alpha*A_i*x_i + beta*y_i\nwhere (A_i, x_i, y_i) is the i-th instance of the batch.\nalpha and beta are scalars, x_i and y_i are vectors and A_i is an\nn by n symmetric banded matrix, for i = 1, ..., batch_count.\nA should contain an upper or lower triangular n by n symmetric banded matrix.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- if rocblas_fill_upper, the lower part of A is not referenced\n- if rocblas_fill_lower, the upper part of A is not referenced\n@param[in]\nn         [rocblas_int]\nnumber of rows and columns of each matrix A_i.\n@param[in]\nk         [rocblas_int]\nspecifies the number of sub- and super-diagonals.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nA         device array of device pointers storing each matrix A_i.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each matrix A_i.\n@param[in]\nx         device array of device pointers storing each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each vector x_i.\n@param[in]\nbeta      device pointer or host pointer to scalar beta.\n@param[out]\ny         device array of device pointers storing each vector y_i.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of each vector y_i.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_ssbmv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f32,\n        A: *const *const f32,\n        lda: rocblas_int,\n        x: *const *const f32,\n        incx: rocblas_int,\n        beta: *const f32,\n        y: *const *mut f32,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsbmv_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f64,\n        A: *const *const f64,\n        lda: rocblas_int,\n        x: *const *const f64,\n        incx: rocblas_int,\n        beta: *const f64,\n        y: *const *mut f64,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ssbmv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const *const f32,\n        lda: i64,\n        x: *const *const f32,\n        incx: i64,\n        beta: *const f32,\n        y: *const *mut f32,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsbmv_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        A: *const *const f64,\n        lda: i64,\n        x: *const *const f64,\n        incx: i64,\n        beta: *const f64,\n        y: *const *mut f64,\n        incy: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nsbmv_strided_batched performs the matrix-vector operation:\n\ny_i := alpha*A_i*x_i + beta*y_i\nwhere (A_i, x_i, y_i) is the i-th instance of the batch.\nalpha and beta are scalars, x_i and y_i are vectors and A_i is an\nn by n symmetric banded matrix, for i = 1, ..., batch_count.\nA should contain an upper or lower triangular n by n symmetric banded matrix.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- if rocblas_fill_upper, the lower part of A is not referenced\n- if rocblas_fill_lower, the upper part of A is not referenced\n@param[in]\nn         [rocblas_int]\nnumber of rows and columns of each matrix A_i.\n@param[in]\nk         [rocblas_int]\nspecifies the number of sub- and super-diagonals.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nA         Device pointer to the first matrix A_1 on the GPU.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each matrix A_i.\n@param[in]\nstrideA     [rocblas_stride]\nstride from the start of one matrix (A_i) and the next one (A_i+1).\n@param[in]\nx         Device pointer to the first vector x_1 on the GPU.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each vector x_i.\n@param[in]\nstridex     [rocblas_stride]\nstride from the start of one vector (x_i) and the next one (x_i+1).\nThere are no restrictions placed on stridex. However, ensure that stridex is of appropriate size.\nThis typically means stridex >= n * incx. stridex should be non zero.\n@param[in]\nbeta      device pointer or host pointer to scalar beta.\n@param[out]\ny         Device pointer to the first vector y_1 on the GPU.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of each vector y_i.\n@param[in]\nstridey     [rocblas_stride]\nstride from the start of one vector (y_i) and the next one (y_i+1).\nThere are no restrictions placed on stridey. However, ensure that stridey is of appropriate size.\nThis typically means stridey >= n * incy. stridey should be non zero.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_ssbmv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocblas_int,\n        strideA: rocblas_stride,\n        x: *const f32,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        beta: *const f32,\n        y: *mut f32,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsbmv_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocblas_int,\n        strideA: rocblas_stride,\n        x: *const f64,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        beta: *const f64,\n        y: *mut f64,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ssbmv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        strideA: rocblas_stride,\n        x: *const f32,\n        incx: i64,\n        stridex: rocblas_stride,\n        beta: *const f32,\n        y: *mut f32,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsbmv_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        strideA: rocblas_stride,\n        x: *const f64,\n        incx: i64,\n        stridex: rocblas_stride,\n        beta: *const f64,\n        y: *mut f64,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nger,geru,gerc performs the matrix-vector operations:\n\nA := A + alpha*x*y**T , OR\nA := A + alpha*x*y**H for gerc\nwhere alpha is a scalar, x and y are vectors, and A is an\nm by n matrix.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nm         [rocblas_int]\nthe number of rows of the matrix A.\n@param[in]\nn         [rocblas_int]\nthe number of columns of the matrix A.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nx         device pointer storing vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n@param[in]\ny         device pointer storing vector y.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of y.\n@param[in, out]\nA         device pointer storing matrix A.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A.\n*/\n    pub fn rocblas_sger(\n        handle: rocblas_handle,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *const f32,\n        incx: rocblas_int,\n        y: *const f32,\n        incy: rocblas_int,\n        A: *mut f32,\n        lda: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dger(\n        handle: rocblas_handle,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *const f64,\n        incx: rocblas_int,\n        y: *const f64,\n        incy: rocblas_int,\n        A: *mut f64,\n        lda: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgeru(\n        handle: rocblas_handle,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        y: *const rocblas_float_complex,\n        incy: rocblas_int,\n        A: *mut rocblas_float_complex,\n        lda: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgeru(\n        handle: rocblas_handle,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        y: *const rocblas_double_complex,\n        incy: rocblas_int,\n        A: *mut rocblas_double_complex,\n        lda: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgerc(\n        handle: rocblas_handle,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        y: *const rocblas_float_complex,\n        incy: rocblas_int,\n        A: *mut rocblas_float_complex,\n        lda: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgerc(\n        handle: rocblas_handle,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        y: *const rocblas_double_complex,\n        incy: rocblas_int,\n        A: *mut rocblas_double_complex,\n        lda: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sger_64(\n        handle: rocblas_handle,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        x: *const f32,\n        incx: i64,\n        y: *const f32,\n        incy: i64,\n        A: *mut f32,\n        lda: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dger_64(\n        handle: rocblas_handle,\n        m: i64,\n        n: i64,\n        alpha: *const f64,\n        x: *const f64,\n        incx: i64,\n        y: *const f64,\n        incy: i64,\n        A: *mut f64,\n        lda: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgeru_64(\n        handle: rocblas_handle,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        y: *const rocblas_float_complex,\n        incy: i64,\n        A: *mut rocblas_float_complex,\n        lda: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgeru_64(\n        handle: rocblas_handle,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        y: *const rocblas_double_complex,\n        incy: i64,\n        A: *mut rocblas_double_complex,\n        lda: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgerc_64(\n        handle: rocblas_handle,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        y: *const rocblas_float_complex,\n        incy: i64,\n        A: *mut rocblas_float_complex,\n        lda: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgerc_64(\n        handle: rocblas_handle,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        y: *const rocblas_double_complex,\n        incy: i64,\n        A: *mut rocblas_double_complex,\n        lda: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nger_batched,geru_batched,gerc_batched perform a batch of the matrix-vector operations:\n\nA := A + alpha*x*y**T , OR\nA := A + alpha*x*y**H for gerc\nwhere (A_i, x_i, y_i) is the i-th instance of the batch.\nalpha is a scalar, x_i and y_i are vectors and A_i is an\nm by n matrix, for i = 1, ..., batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nm         [rocblas_int]\nthe number of rows of each matrix A_i.\n@param[in]\nn         [rocblas_int]\nthe number of columns of each matrix A_i.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nx         device array of device pointers storing each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each vector x_i.\n@param[in]\ny         device array of device pointers storing each vector y_i.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of each vector y_i.\n@param[in, out]\nA         device array of device pointers storing each matrix A_i.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each A_i.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_sger_batched(\n        handle: rocblas_handle,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *const *const f32,\n        incx: rocblas_int,\n        y: *const *const f32,\n        incy: rocblas_int,\n        A: *const *mut f32,\n        lda: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dger_batched(\n        handle: rocblas_handle,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *const *const f64,\n        incx: rocblas_int,\n        y: *const *const f64,\n        incy: rocblas_int,\n        A: *const *mut f64,\n        lda: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgeru_batched(\n        handle: rocblas_handle,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        x: *const *const rocblas_float_complex,\n        incx: rocblas_int,\n        y: *const *const rocblas_float_complex,\n        incy: rocblas_int,\n        A: *const *mut rocblas_float_complex,\n        lda: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgeru_batched(\n        handle: rocblas_handle,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        x: *const *const rocblas_double_complex,\n        incx: rocblas_int,\n        y: *const *const rocblas_double_complex,\n        incy: rocblas_int,\n        A: *const *mut rocblas_double_complex,\n        lda: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgerc_batched(\n        handle: rocblas_handle,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        x: *const *const rocblas_float_complex,\n        incx: rocblas_int,\n        y: *const *const rocblas_float_complex,\n        incy: rocblas_int,\n        A: *const *mut rocblas_float_complex,\n        lda: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgerc_batched(\n        handle: rocblas_handle,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        x: *const *const rocblas_double_complex,\n        incx: rocblas_int,\n        y: *const *const rocblas_double_complex,\n        incy: rocblas_int,\n        A: *const *mut rocblas_double_complex,\n        lda: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sger_batched_64(\n        handle: rocblas_handle,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        x: *const *const f32,\n        incx: i64,\n        y: *const *const f32,\n        incy: i64,\n        A: *const *mut f32,\n        lda: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dger_batched_64(\n        handle: rocblas_handle,\n        m: i64,\n        n: i64,\n        alpha: *const f64,\n        x: *const *const f64,\n        incx: i64,\n        y: *const *const f64,\n        incy: i64,\n        A: *const *mut f64,\n        lda: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgeru_batched_64(\n        handle: rocblas_handle,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        x: *const *const rocblas_float_complex,\n        incx: i64,\n        y: *const *const rocblas_float_complex,\n        incy: i64,\n        A: *const *mut rocblas_float_complex,\n        lda: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgeru_batched_64(\n        handle: rocblas_handle,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        x: *const *const rocblas_double_complex,\n        incx: i64,\n        y: *const *const rocblas_double_complex,\n        incy: i64,\n        A: *const *mut rocblas_double_complex,\n        lda: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgerc_batched_64(\n        handle: rocblas_handle,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        x: *const *const rocblas_float_complex,\n        incx: i64,\n        y: *const *const rocblas_float_complex,\n        incy: i64,\n        A: *const *mut rocblas_float_complex,\n        lda: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgerc_batched_64(\n        handle: rocblas_handle,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        x: *const *const rocblas_double_complex,\n        incx: i64,\n        y: *const *const rocblas_double_complex,\n        incy: i64,\n        A: *const *mut rocblas_double_complex,\n        lda: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nger_strided_batched,geru_strided_batched,gerc_strided_batched performs the matrix-vector operations:\n\nA_i := A_i + alpha*x_i*y_i**T, OR\nA_i := A_i + alpha*x_i*y_i**H  for gerc\nwhere (A_i, x_i, y_i) is the i-th instance of the batch.\nalpha is a scalar, x_i and y_i are vectors and A_i is an\nm by n matrix, for i = 1, ..., batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nm         [rocblas_int]\nthe number of rows of each matrix A_i.\n@param[in]\nn         [rocblas_int]\nthe number of columns of each matrix A_i.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nx         device pointer to the first vector (x_1) in the batch.\n@param[in]\nincx      [rocblas_int]\nspecifies the increments for the elements of each vector x_i.\n@param[in]\nstridex   [rocblas_stride]\nstride from the start of one vector (x_i) and the next one (x_i+1).\nThere are no restrictions placed on stride_x. However, ensure that stride_x is of appropriate size. For a typical\ncase this means stride_x >= m * incx.\n@param[in, out]\ny         device pointer to the first vector (y_1) in the batch.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of each vector y_i.\n@param[in]\nstridey   [rocblas_stride]\nstride from the start of one vector (y_i) and the next one (y_i+1).\nThere are no restrictions placed on stride_y. However, ensure that stride_y is of appropriate size. For a typical\ncase this means stride_y >= n * incy.\n@param[in, out]\nA         device pointer to the first matrix (A_1) in the batch.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each A_i.\n@param[in]\nstrideA     [rocblas_stride]\nstride from the start of one matrix (A_i) and the next one (A_i+1)\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_sger_strided_batched(\n        handle: rocblas_handle,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *const f32,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *const f32,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        A: *mut f32,\n        lda: rocblas_int,\n        strideA: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dger_strided_batched(\n        handle: rocblas_handle,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *const f64,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *const f64,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        A: *mut f64,\n        lda: rocblas_int,\n        strideA: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgeru_strided_batched(\n        handle: rocblas_handle,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *const rocblas_float_complex,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        A: *mut rocblas_float_complex,\n        lda: rocblas_int,\n        strideA: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgeru_strided_batched(\n        handle: rocblas_handle,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *const rocblas_double_complex,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        A: *mut rocblas_double_complex,\n        lda: rocblas_int,\n        strideA: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgerc_strided_batched(\n        handle: rocblas_handle,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *const rocblas_float_complex,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        A: *mut rocblas_float_complex,\n        lda: rocblas_int,\n        strideA: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgerc_strided_batched(\n        handle: rocblas_handle,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *const rocblas_double_complex,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        A: *mut rocblas_double_complex,\n        lda: rocblas_int,\n        strideA: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sger_strided_batched_64(\n        handle: rocblas_handle,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        x: *const f32,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *const f32,\n        incy: i64,\n        stridey: rocblas_stride,\n        A: *mut f32,\n        lda: i64,\n        strideA: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dger_strided_batched_64(\n        handle: rocblas_handle,\n        m: i64,\n        n: i64,\n        alpha: *const f64,\n        x: *const f64,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *const f64,\n        incy: i64,\n        stridey: rocblas_stride,\n        A: *mut f64,\n        lda: i64,\n        strideA: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgeru_strided_batched_64(\n        handle: rocblas_handle,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *const rocblas_float_complex,\n        incy: i64,\n        stridey: rocblas_stride,\n        A: *mut rocblas_float_complex,\n        lda: i64,\n        strideA: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgeru_strided_batched_64(\n        handle: rocblas_handle,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *const rocblas_double_complex,\n        incy: i64,\n        stridey: rocblas_stride,\n        A: *mut rocblas_double_complex,\n        lda: i64,\n        strideA: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgerc_strided_batched_64(\n        handle: rocblas_handle,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *const rocblas_float_complex,\n        incy: i64,\n        stridey: rocblas_stride,\n        A: *mut rocblas_float_complex,\n        lda: i64,\n        strideA: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgerc_strided_batched_64(\n        handle: rocblas_handle,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *const rocblas_double_complex,\n        incy: i64,\n        stridey: rocblas_stride,\n        A: *mut rocblas_double_complex,\n        lda: i64,\n        strideA: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nspr performs the matrix-vector operations:\n\nA := A + alpha*x*x**T\nwhere alpha is a scalar, x is a vector, and A is an\nn by n symmetric matrix, supplied in packed form.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- rocblas_fill_upper: The upper triangular part of A is supplied in AP.\n- rocblas_fill_lower: The lower triangular part of A is supplied in AP.\n@param[in]\nn         [rocblas_int]\nthe number of rows and columns of matrix A. Must be at least 0.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nx         device pointer storing vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n@param[in, out]\nAP        device pointer storing the packed version of the specified triangular portion of\nthe symmetric matrix A. Of at least size ((n * (n + 1)) / 2).\n\nif uplo == rocblas_fill_upper:\nThe upper triangular portion of the symmetric matrix A is supplied.\nThe matrix is compacted so that AP contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(0,1)\nAP(2) = A(1,1), etc.\nEx: (rocblas_fill_upper; n = 4)\n1 2 4 7\n2 3 5 8   -----> [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]\n4 5 6 9\n7 8 9 0\n\nif uplo == rocblas_fill_lower:\nThe lower triangular portion of the symmetric matrix A is supplied.\nThe matrix is compacted so that AP contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(1,0)\nAP(2) = A(2,1), etc.\nEx: (rocblas_fill_lower; n = 4)\n1 2 3 4\n2 5 6 7    -----> [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]\n3 6 8 9\n4 7 9 0*/\n    pub fn rocblas_sspr(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *const f32,\n        incx: rocblas_int,\n        AP: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dspr(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *const f64,\n        incx: rocblas_int,\n        AP: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cspr(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        AP: *mut rocblas_float_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zspr(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        AP: *mut rocblas_double_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sspr_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f32,\n        x: *const f32,\n        incx: i64,\n        AP: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dspr_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f64,\n        x: *const f64,\n        incx: i64,\n        AP: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cspr_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        AP: *mut rocblas_float_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zspr_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        AP: *mut rocblas_double_complex,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nspr_batched performs the matrix-vector operations:\n\nA_i := A_i + alpha*x_i*x_i**T\nwhere alpha is a scalar, x_i is a vector, and A_i is an\nn by n symmetric matrix, supplied in packed form, for i = 1, ..., batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- rocblas_fill_upper: The upper triangular part of each A_i is supplied in AP.\n- rocblas_fill_lower: The lower triangular part of each A_i is supplied in AP.\n@param[in]\nn         [rocblas_int]\nthe number of rows and columns of each matrix A_i. Must be at least 0.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nx         device array of device pointers storing each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in, out]\nAP        device array of device pointers storing the packed version of the specified triangular portion of\neach symmetric matrix A_i of at least size ((n * (n + 1)) / 2). Array is of at least size batch_count.\n\nif uplo == rocblas_fill_upper:\nThe upper triangular portion of each symmetric matrix A_i is supplied.\nThe matrix is compacted so that AP contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(0,1)\nAP(2) = A(1,1), etc.\nEx: (rocblas_fill_upper; n = 4)\n1 2 4 7\n2 3 5 8   -----> [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]\n4 5 6 9\n7 8 9 0\n\nif uplo == rocblas_fill_lower:\nThe lower triangular portion of each symmetric matrix A_i is supplied.\nThe matrix is compacted so that AP contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(1,0)\nAP(2) = A(2,1), etc.\nEx: (rocblas_fill_lower; n = 4)\n1 2 3 4\n2 5 6 7    -----> [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]\n3 6 8 9\n4 7 9 0\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.*/\n    pub fn rocblas_sspr_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *const *const f32,\n        incx: rocblas_int,\n        AP: *const *mut f32,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dspr_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *const *const f64,\n        incx: rocblas_int,\n        AP: *const *mut f64,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cspr_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        x: *const *const rocblas_float_complex,\n        incx: rocblas_int,\n        AP: *const *mut rocblas_float_complex,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zspr_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        x: *const *const rocblas_double_complex,\n        incx: rocblas_int,\n        AP: *const *mut rocblas_double_complex,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sspr_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f32,\n        x: *const *const f32,\n        incx: i64,\n        AP: *const *mut f32,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dspr_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f64,\n        x: *const *const f64,\n        incx: i64,\n        AP: *const *mut f64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cspr_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        x: *const *const rocblas_float_complex,\n        incx: i64,\n        AP: *const *mut rocblas_float_complex,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zspr_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        x: *const *const rocblas_double_complex,\n        incx: i64,\n        AP: *const *mut rocblas_double_complex,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nspr_strided_batched performs the matrix-vector operations:\n\nA_i := A_i + alpha*x_i*x_i**T\nwhere alpha is a scalar, x_i is a vector, and A_i is an\nn by n symmetric matrix, supplied in packed form, for i = 1, ..., batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- rocblas_fill_upper: The upper triangular part of each A_i is supplied in AP.\n- rocblas_fill_lower: The lower triangular part of each A_i is supplied in AP.\n@param[in]\nn         [rocblas_int]\nthe number of rows and columns of each matrix A_i. Must be at least 0.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nx         device pointer pointing to the first vector (x_1).\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\nstride_x  [rocblas_stride]\nstride from the start of one vector (x_i) and the next one (x_i+1).\n@param[in, out]\nAP        device pointer storing the packed version of the specified triangular portion of\neach symmetric matrix A_i. Points to the first A_1.\n\nif uplo == rocblas_fill_upper:\nThe upper triangular portion of each symmetric matrix A_i is supplied.\nThe matrix is compacted so that AP contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(0,1)\nAP(2) = A(1,1), etc.\nEx: (rocblas_fill_upper; n = 4)\n1 2 4 7\n2 3 5 8   -----> [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]\n4 5 6 9\n7 8 9 0\n\nif uplo == rocblas_fill_lower:\nThe lower triangular portion of each symmetric matrix A_i is supplied.\nThe matrix is compacted so that AP contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(1,0)\nAP(2) = A(2,1), etc.\nEx: (rocblas_fill_lower; n = 4)\n1 2 3 4\n2 5 6 7    -----> [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]\n3 6 8 9\n4 7 9 0\n@param[in]\nstride_A    [rocblas_stride]\nstride from the start of one (A_i) and the next (A_i+1).\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.*/\n    pub fn rocblas_sspr_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *const f32,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        AP: *mut f32,\n        stride_A: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dspr_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *const f64,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        AP: *mut f64,\n        stride_A: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cspr_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        AP: *mut rocblas_float_complex,\n        stride_A: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zspr_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        AP: *mut rocblas_double_complex,\n        stride_A: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sspr_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f32,\n        x: *const f32,\n        incx: i64,\n        stride_x: rocblas_stride,\n        AP: *mut f32,\n        stride_A: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dspr_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f64,\n        x: *const f64,\n        incx: i64,\n        stride_x: rocblas_stride,\n        AP: *mut f64,\n        stride_A: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cspr_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        AP: *mut rocblas_float_complex,\n        stride_A: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zspr_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        AP: *mut rocblas_double_complex,\n        stride_A: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nspr2 performs the matrix-vector operation:\n\nA := A + alpha*x*y**T + alpha*y*x**T\nwhere alpha is a scalar, x and y are vectors, and A is an\nn by n symmetric matrix, supplied in packed form.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- rocblas_fill_upper: The upper triangular part of A is supplied in AP.\n- rocblas_fill_lower: The lower triangular part of A is supplied in AP.\n@param[in]\nn         [rocblas_int]\nthe number of rows and columns of matrix A. Must be at least 0.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nx         device pointer storing vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n@param[in]\ny         device pointer storing vector y.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of y.\n@param[in, out]\nAP        device pointer storing the packed version of the specified triangular portion of\nthe symmetric matrix A. Of at least size ((n * (n + 1)) / 2).\n\nif uplo == rocblas_fill_upper:\nThe upper triangular portion of the symmetric matrix A is supplied.\nThe matrix is compacted so that AP contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(0,1)\nAP(2) = A(1,1), etc.\nEx: (rocblas_fill_upper; n = 4)\n1 2 4 7\n2 3 5 8   -----> [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]\n4 5 6 9\n7 8 9 0\n\nif uplo == rocblas_fill_lower:\nThe lower triangular portion of the symmetric matrix A is supplied.\nThe matrix is compacted so that AP contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(1,0)\nAP(n) = A(2,1), etc.\nEx: (rocblas_fill_lower; n = 4)\n1 2 3 4\n2 5 6 7    -----> [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]\n3 6 8 9\n4 7 9 0*/\n    pub fn rocblas_sspr2(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *const f32,\n        incx: rocblas_int,\n        y: *const f32,\n        incy: rocblas_int,\n        AP: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dspr2(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *const f64,\n        incx: rocblas_int,\n        y: *const f64,\n        incy: rocblas_int,\n        AP: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sspr2_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f32,\n        x: *const f32,\n        incx: i64,\n        y: *const f32,\n        incy: i64,\n        AP: *mut f32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dspr2_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f64,\n        x: *const f64,\n        incx: i64,\n        y: *const f64,\n        incy: i64,\n        AP: *mut f64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nspr2_batched performs the matrix-vector operation:\n\nA_i := A_i + alpha*x_i*y_i**T + alpha*y_i*x_i**T\nwhere alpha is a scalar, x_i and y_i are vectors, and A_i is an\nn by n symmetric matrix, supplied in packed form, for i = 1, ..., batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- rocblas_fill_upper: The upper triangular part of each A_i is supplied in AP.\n- rocblas_fill_lower: The lower triangular part of each A_i is supplied in AP.\n@param[in]\nn         [rocblas_int]\nthe number of rows and columns of each matrix A_i. Must be at least 0.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nx         device array of device pointers storing each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\ny         device array of device pointers storing each vector y_i.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of each y_i.\n@param[in, out]\nAP        device array of device pointers storing the packed version of the specified triangular portion of\neach symmetric matrix A_i of at least size ((n * (n + 1)) / 2). Array is of at least size batch_count.\n\nif uplo == rocblas_fill_upper:\nThe upper triangular portion of each symmetric matrix A_i is supplied.\nThe matrix is compacted so that AP contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(0,1)\nAP(2) = A(1,1), etc.\nEx: (rocblas_fill_upper; n = 4)\n1 2 4 7\n2 3 5 8   -----> [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]\n4 5 6 9\n7 8 9 0\n\nif uplo == rocblas_fill_lower:\nThe lower triangular portion of each symmetric matrix A_i is supplied.\nThe matrix is compacted so that AP contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(1,0)\nAP(n) = A(2,1), etc.\nEx: (rocblas_fill_lower; n = 4)\n1 2 3 4\n2 5 6 7    -----> [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]\n3 6 8 9\n4 7 9 0\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.*/\n    pub fn rocblas_sspr2_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *const *const f32,\n        incx: rocblas_int,\n        y: *const *const f32,\n        incy: rocblas_int,\n        AP: *const *mut f32,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dspr2_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *const *const f64,\n        incx: rocblas_int,\n        y: *const *const f64,\n        incy: rocblas_int,\n        AP: *const *mut f64,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sspr2_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f32,\n        x: *const *const f32,\n        incx: i64,\n        y: *const *const f32,\n        incy: i64,\n        AP: *const *mut f32,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dspr2_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f64,\n        x: *const *const f64,\n        incx: i64,\n        y: *const *const f64,\n        incy: i64,\n        AP: *const *mut f64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nspr2_strided_batched performs the matrix-vector operation:\n\nA_i := A_i + alpha*x_i*y_i**T + alpha*y_i*x_i**T\nwhere alpha is a scalar, x_i and y_i are vectors, and A_i is an\nn by n symmetric matrix, supplied in packed form, for i = 1, ..., batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- rocblas_fill_upper: The upper triangular part of each A_i is supplied in AP.\n- rocblas_fill_lower: The lower triangular part of each A_i is supplied in AP.\n@param[in]\nn         [rocblas_int]\nthe number of rows and columns of each matrix A_i. Must be at least 0.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nx         device pointer pointing to the first vector (x_1).\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\nstride_x  [rocblas_stride]\nstride from the start of one vector (x_i) and the next one (x_i+1).\n@param[in]\ny         device pointer pointing to the first vector (y_1).\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of each y_i.\n@param[in]\nstride_y  [rocblas_stride]\nstride from the start of one vector (y_i) and the next one (y_i+1).\n@param[in, out]\nAP        device pointer storing the packed version of the specified triangular portion of\neach symmetric matrix A_i. Points to the first A_1.\n\nif uplo == rocblas_fill_upper:\nThe upper triangular portion of each symmetric matrix A_i is supplied.\nThe matrix is compacted so that AP contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(0,1)\nAP(2) = A(1,1), etc.\nEx: (rocblas_fill_upper; n = 4)\n1 2 4 7\n2 3 5 8   -----> [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]\n4 5 6 9\n7 8 9 0\n\nif uplo == rocblas_fill_lower:\nThe lower triangular portion of each symmetric matrix A_i is supplied.\nThe matrix is compacted so that AP contains the triangular portion\ncolumn-by-column\nso that:\nAP(0) = A(0,0)\nAP(1) = A(1,0)\nAP(n) = A(2,1), etc.\nEx: (rocblas_fill_lower; n = 4)\n1 2 3 4\n2 5 6 7    -----> [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]\n3 6 8 9\n4 7 9 0\n@param[in]\nstride_A    [rocblas_stride]\nstride from the start of one (A_i) and the next (A_i+1).\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.*/\n    pub fn rocblas_sspr2_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *const f32,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        y: *const f32,\n        incy: rocblas_int,\n        stride_y: rocblas_stride,\n        AP: *mut f32,\n        stride_A: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dspr2_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *const f64,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        y: *const f64,\n        incy: rocblas_int,\n        stride_y: rocblas_stride,\n        AP: *mut f64,\n        stride_A: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sspr2_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f32,\n        x: *const f32,\n        incx: i64,\n        stride_x: rocblas_stride,\n        y: *const f32,\n        incy: i64,\n        stride_y: rocblas_stride,\n        AP: *mut f32,\n        stride_A: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dspr2_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f64,\n        x: *const f64,\n        incx: i64,\n        stride_x: rocblas_stride,\n        y: *const f64,\n        incy: i64,\n        stride_y: rocblas_stride,\n        AP: *mut f64,\n        stride_A: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nsyr performs the matrix-vector operations:\n\nA := A + alpha*x*x**T\nwhere alpha is a scalar, x is a vector, and A is an\nn by n symmetric matrix.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- if rocblas_fill_upper, the lower part of A is not referenced\n- if rocblas_fill_lower, the upper part of A is not referenced\n\n@param[in]\nn         [rocblas_int]\nthe number of rows and columns of matrix A.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nx         device pointer storing vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n@param[in, out]\nA         device pointer storing matrix A.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A.\n*/\n    pub fn rocblas_ssyr(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *const f32,\n        incx: rocblas_int,\n        A: *mut f32,\n        lda: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyr(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *const f64,\n        incx: rocblas_int,\n        A: *mut f64,\n        lda: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyr(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        A: *mut rocblas_float_complex,\n        lda: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyr(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        A: *mut rocblas_double_complex,\n        lda: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ssyr_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f32,\n        x: *const f32,\n        incx: i64,\n        A: *mut f32,\n        lda: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyr_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f64,\n        x: *const f64,\n        incx: i64,\n        A: *mut f64,\n        lda: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyr_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        A: *mut rocblas_float_complex,\n        lda: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyr_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        A: *mut rocblas_double_complex,\n        lda: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nsyr_batched performs a batch of matrix-vector operations:\n\nA[i] := A[i] + alpha*x[i]*x[i]**T\nwhere alpha is a scalar, x is an array of vectors, and A is an array of\nn by n symmetric matrices, for i = 1 , ... , batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- if rocblas_fill_upper, the lower part of A is not referenced\n- if rocblas_fill_lower, the upper part of A is not referenced\n@param[in]\nn         [rocblas_int]\nthe number of rows and columns of matrix A.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nx         device array of device pointers storing each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in, out]\nA         device array of device pointers storing each matrix A_i.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each A_i.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_ssyr_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *const *const f32,\n        incx: rocblas_int,\n        A: *const *mut f32,\n        lda: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyr_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *const *const f64,\n        incx: rocblas_int,\n        A: *const *mut f64,\n        lda: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyr_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        x: *const *const rocblas_float_complex,\n        incx: rocblas_int,\n        A: *const *mut rocblas_float_complex,\n        lda: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyr_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        x: *const *const rocblas_double_complex,\n        incx: rocblas_int,\n        A: *const *mut rocblas_double_complex,\n        lda: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ssyr_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f32,\n        x: *const *const f32,\n        incx: i64,\n        A: *const *mut f32,\n        lda: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyr_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f64,\n        x: *const *const f64,\n        incx: i64,\n        A: *const *mut f64,\n        lda: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyr_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        x: *const *const rocblas_float_complex,\n        incx: i64,\n        A: *const *mut rocblas_float_complex,\n        lda: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyr_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        x: *const *const rocblas_double_complex,\n        incx: i64,\n        A: *const *mut rocblas_double_complex,\n        lda: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nsyr_strided_batched performs the matrix-vector operations:\n\nA[i] := A[i] + alpha*x[i]*x[i]**T\nwhere alpha is a scalar, vectors, and A is an array of\nn by n symmetric matrices, for i = 1 , ... , batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- if rocblas_fill_upper, the lower part of A is not referenced\n- if rocblas_fill_lower, the upper part of A is not referenced\n@param[in]\nn         [rocblas_int]\nthe number of rows and columns of each matrix A.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nx         device pointer to the first vector x_1.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\nstridex   [rocblas_stride]\nspecifies the pointer increment between vectors (x_i) and (x_i+1).\n@param[in, out]\nA         device pointer to the first matrix A_1.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each A_i.\n@param[in]\nstrideA   [rocblas_stride]\nstride from the start of one matrix (A_i) and the next one (A_i+1).\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_ssyr_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *const f32,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        A: *mut f32,\n        lda: rocblas_int,\n        strideA: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyr_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *const f64,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        A: *mut f64,\n        lda: rocblas_int,\n        strideA: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyr_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        A: *mut rocblas_float_complex,\n        lda: rocblas_int,\n        strideA: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyr_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        A: *mut rocblas_double_complex,\n        lda: rocblas_int,\n        strideA: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ssyr_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f32,\n        x: *const f32,\n        incx: i64,\n        stridex: rocblas_stride,\n        A: *mut f32,\n        lda: i64,\n        strideA: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyr_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f64,\n        x: *const f64,\n        incx: i64,\n        stridex: rocblas_stride,\n        A: *mut f64,\n        lda: i64,\n        strideA: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyr_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        A: *mut rocblas_float_complex,\n        lda: i64,\n        strideA: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyr_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        A: *mut rocblas_double_complex,\n        lda: i64,\n        strideA: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nsyr2 performs the matrix-vector operations:\n\nA := A + alpha*x*y**T + alpha*y*x**T\nwhere alpha is a scalar, x and y are vectors, and A is an\nn by n symmetric matrix.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- if rocblas_fill_upper, the lower part of A is not referenced\n- if rocblas_fill_lower, the upper part of A is not referenced\n\n@param[in]\nn         [rocblas_int]\nthe number of rows and columns of matrix A.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nx         device pointer storing vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n@param[in]\ny         device pointer storing vector y.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of y.\n@param[in, out]\nA         device pointer storing matrix A.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A.\n*/\n    pub fn rocblas_ssyr2(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *const f32,\n        incx: rocblas_int,\n        y: *const f32,\n        incy: rocblas_int,\n        A: *mut f32,\n        lda: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyr2(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *const f64,\n        incx: rocblas_int,\n        y: *const f64,\n        incy: rocblas_int,\n        A: *mut f64,\n        lda: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyr2(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        y: *const rocblas_float_complex,\n        incy: rocblas_int,\n        A: *mut rocblas_float_complex,\n        lda: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyr2(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        y: *const rocblas_double_complex,\n        incy: rocblas_int,\n        A: *mut rocblas_double_complex,\n        lda: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ssyr2_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f32,\n        x: *const f32,\n        incx: i64,\n        y: *const f32,\n        incy: i64,\n        A: *mut f32,\n        lda: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyr2_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f64,\n        x: *const f64,\n        incx: i64,\n        y: *const f64,\n        incy: i64,\n        A: *mut f64,\n        lda: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyr2_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        y: *const rocblas_float_complex,\n        incy: i64,\n        A: *mut rocblas_float_complex,\n        lda: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyr2_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        y: *const rocblas_double_complex,\n        incy: i64,\n        A: *mut rocblas_double_complex,\n        lda: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nsyr2_batched performs a batch of matrix-vector operations:\n\nA[i] := A[i] + alpha*x[i]*y[i]**T + alpha*y[i]*x[i]**T\nwhere alpha is a scalar, x[i] and y[i] are vectors, and A[i] is a\nn by n symmetric matrix, for i = 1 , ... , batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- if rocblas_fill_upper, the lower part of A is not referenced\n- if rocblas_fill_lower, the upper part of A is not referenced\n@param[in]\nn         [rocblas_int]\nthe number of rows and columns of matrix A.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nx         device array of device pointers storing each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\ny         device array of device pointers storing each vector y_i.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of each y_i.\n@param[in, out]\nA         device array of device pointers storing each matrix A_i.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each A_i.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_ssyr2_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *const *const f32,\n        incx: rocblas_int,\n        y: *const *const f32,\n        incy: rocblas_int,\n        A: *const *mut f32,\n        lda: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyr2_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *const *const f64,\n        incx: rocblas_int,\n        y: *const *const f64,\n        incy: rocblas_int,\n        A: *const *mut f64,\n        lda: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyr2_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        x: *const *const rocblas_float_complex,\n        incx: rocblas_int,\n        y: *const *const rocblas_float_complex,\n        incy: rocblas_int,\n        A: *const *mut rocblas_float_complex,\n        lda: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyr2_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        x: *const *const rocblas_double_complex,\n        incx: rocblas_int,\n        y: *const *const rocblas_double_complex,\n        incy: rocblas_int,\n        A: *const *mut rocblas_double_complex,\n        lda: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ssyr2_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f32,\n        x: *const *const f32,\n        incx: i64,\n        y: *const *const f32,\n        incy: i64,\n        A: *const *mut f32,\n        lda: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyr2_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f64,\n        x: *const *const f64,\n        incx: i64,\n        y: *const *const f64,\n        incy: i64,\n        A: *const *mut f64,\n        lda: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyr2_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        x: *const *const rocblas_float_complex,\n        incx: i64,\n        y: *const *const rocblas_float_complex,\n        incy: i64,\n        A: *const *mut rocblas_float_complex,\n        lda: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyr2_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        x: *const *const rocblas_double_complex,\n        incx: i64,\n        y: *const *const rocblas_double_complex,\n        incy: i64,\n        A: *const *mut rocblas_double_complex,\n        lda: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 2 API </b>\n\n\\details\nsyr2_strided_batched the matrix-vector operations:\n\nA[i] := A[i] + alpha*x[i]*y[i]**T + alpha*y[i]*x[i]**T\nwhere alpha is a scalar, x[i] and y[i] are vectors, and A[i] is a\nn by n symmetric matrices, for i = 1 , ... , batch_count\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n- if rocblas_fill_upper, the lower part of A is not referenced\n- if rocblas_fill_lower, the upper part of A is not referenced\n@param[in]\nn         [rocblas_int]\nthe number of rows and columns of each matrix A.\n@param[in]\nalpha\ndevice pointer or host pointer to scalar alpha.\n@param[in]\nx         device pointer to the first vector x_1.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\nstridex   [rocblas_stride]\nspecifies the pointer increment between vectors (x_i) and (x_i+1).\n@param[in]\ny         device pointer to the first vector y_1.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of each y_i.\n@param[in]\nstridey   [rocblas_stride]\nspecifies the pointer increment between vectors (y_i) and (y_i+1).\n@param[in, out]\nA         device pointer to the first matrix A_1.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each A_i.\n@param[in]\nstrideA   [rocblas_stride]\nstride from the start of one matrix (A_i) and the next one (A_i+1).\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_ssyr2_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f32,\n        x: *const f32,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *const f32,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        A: *mut f32,\n        lda: rocblas_int,\n        strideA: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyr2_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const f64,\n        x: *const f64,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *const f64,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        A: *mut f64,\n        lda: rocblas_int,\n        strideA: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyr2_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *const rocblas_float_complex,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        A: *mut rocblas_float_complex,\n        lda: rocblas_int,\n        strideA: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyr2_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *const rocblas_double_complex,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        A: *mut rocblas_double_complex,\n        lda: rocblas_int,\n        strideA: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ssyr2_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f32,\n        x: *const f32,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *const f32,\n        incy: i64,\n        stridey: rocblas_stride,\n        A: *mut f32,\n        lda: i64,\n        strideA: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyr2_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const f64,\n        x: *const f64,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *const f64,\n        incy: i64,\n        stridey: rocblas_stride,\n        A: *mut f64,\n        lda: i64,\n        strideA: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyr2_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *const rocblas_float_complex,\n        incy: i64,\n        stridey: rocblas_stride,\n        A: *mut rocblas_float_complex,\n        lda: i64,\n        strideA: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyr2_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *const rocblas_double_complex,\n        incy: i64,\n        stridey: rocblas_stride,\n        A: *mut rocblas_double_complex,\n        lda: i64,\n        strideA: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\nhemm performs one of the matrix-matrix operations:\n\nC := alpha*A*B + beta*C if side == rocblas_side_left,\nC := alpha*B*A + beta*C if side == rocblas_side_right,\n\nwhere alpha and beta are scalars, B and C are m by n matrices, and\nA is a Hermitian matrix stored as either upper or lower.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nside  [rocblas_side]\n- rocblas_side_left:      C := alpha*A*B + beta*C\n- rocblas_side_right:     C := alpha*B*A + beta*C\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  A is an upper triangular matrix\n- rocblas_fill_lower:  A is a  lower triangular matrix\n\n@param[in]\nm       [rocblas_int]\nm specifies the number of rows of B and C. m >= 0.\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of columns of B and C. n >= 0.\n\n@param[in]\nalpha\nalpha specifies the scalar alpha. When alpha is\nzero then A and B are not referenced.\n\n@param[in]\nA       pointer storing matrix A on the GPU.\n- A is m by m if side == rocblas_side_left\n- A is n by n if side == rocblas_side_right\nOnly the upper/lower triangular part is accessed.\nThe imaginary component of the diagonal elements is not used.\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A.\n\nif side = rocblas_side_left,  lda >= max( 1, m ),\notherwise lda >= max( 1, n ).\n\n@param[in]\nB       pointer storing matrix B on the GPU.\nMatrix dimension is m by n\n\n@param[in]\nldb     [rocblas_int]\nldb specifies the first dimension of B. ldb >= max( 1, m ).\n\n@param[in]\nbeta\nbeta specifies the scalar beta. When beta is\nzero then C need not be set before entry.\n\n@param[in]\nC       pointer storing matrix C on the GPU.\nMatrix dimension is m by n\n\n@param[in]\nldc    [rocblas_int]\nldc specifies the first dimension of C. ldc >= max( 1, m ).\n*/\n    pub fn rocblas_chemm(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        B: *const rocblas_float_complex,\n        ldb: rocblas_int,\n        beta: *const rocblas_float_complex,\n        C: *mut rocblas_float_complex,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhemm(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        B: *const rocblas_double_complex,\n        ldb: rocblas_int,\n        beta: *const rocblas_double_complex,\n        C: *mut rocblas_double_complex,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_chemm_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        B: *const rocblas_float_complex,\n        ldb: i64,\n        beta: *const rocblas_float_complex,\n        C: *mut rocblas_float_complex,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhemm_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        B: *const rocblas_double_complex,\n        ldb: i64,\n        beta: *const rocblas_double_complex,\n        C: *mut rocblas_double_complex,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\nhemm_batched performs a batch of the matrix-matrix operations:\n\nC_i := alpha*A_i*B_i + beta*C_i if side == rocblas_side_left,\nC_i := alpha*B_i*A_i + beta*C_i if side == rocblas_side_right,\n\nwhere alpha and beta are scalars, B_i and C_i are m by n matrices, and\nA_i is a Hermitian matrix stored as either upper or lower.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nside  [rocblas_side]\n- rocblas_side_left:      C_i := alpha*A_i*B_i + beta*C_i\n- rocblas_side_right:     C_i := alpha*B_i*A_i + beta*C_i\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  A_i is an upper triangular matrix\n- rocblas_fill_lower:  A_i is a  lower triangular matrix\n\n@param[in]\nm       [rocblas_int]\nm specifies the number of rows of B_i and C_i. m >= 0.\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of columns of B_i and C_i. n >= 0.\n\n@param[in]\nalpha\nalpha specifies the scalar alpha. When alpha is\nzero then A_i and B_i are not referenced.\n\n@param[in]\nA       device array of device pointers storing each matrix A_i on the GPU.\n- A_i is m by m if side == rocblas_side_left\n- A_i is n by n if side == rocblas_side_right\nOnly the upper/lower triangular part is accessed.\nThe imaginary component of the diagonal elements is not used.\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A_i.\n\nif side = rocblas_side_left,  lda >= max( 1, m ),\notherwise lda >= max( 1, n ).\n\n@param[in]\nB       device array of device pointers storing each matrix B_i on the GPU.\nMatrix dimension is m by n\n\n@param[in]\nldb     [rocblas_int]\nldb specifies the first dimension of B_i. ldb >= max( 1, m ).\n\n@param[in]\nbeta\nbeta specifies the scalar beta. When beta is\nzero then C_i need not be set before entry.\n\n@param[in]\nC       device array of device pointers storing each matrix C_i on the GPU.\nMatrix dimension is m by n\n\n@param[in]\nldc    [rocblas_int]\nldc specifies the first dimension of C_i. ldc >= max( 1, m ).\n\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_chemm_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: rocblas_int,\n        B: *const *const rocblas_float_complex,\n        ldb: rocblas_int,\n        beta: *const rocblas_float_complex,\n        C: *const *mut rocblas_float_complex,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhemm_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: rocblas_int,\n        B: *const *const rocblas_double_complex,\n        ldb: rocblas_int,\n        beta: *const rocblas_double_complex,\n        C: *const *mut rocblas_double_complex,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_chemm_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: i64,\n        B: *const *const rocblas_float_complex,\n        ldb: i64,\n        beta: *const rocblas_float_complex,\n        C: *const *mut rocblas_float_complex,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhemm_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: i64,\n        B: *const *const rocblas_double_complex,\n        ldb: i64,\n        beta: *const rocblas_double_complex,\n        C: *const *mut rocblas_double_complex,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\nhemm_strided_batched performs a batch of the matrix-matrix operations:\n\nC_i := alpha*A_i*B_i + beta*C_i if side == rocblas_side_left,\nC_i := alpha*B_i*A_i + beta*C_i if side == rocblas_side_right,\n\nwhere alpha and beta are scalars, B_i and C_i are m by n matrices, and\nA_i is a Hermitian matrix stored as either upper or lower.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nside  [rocblas_side]\n- rocblas_side_left:      C_i := alpha*A_i*B_i + beta*C_i\n- rocblas_side_right:     C_i := alpha*B_i*A_i + beta*C_i\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  A_i is an upper triangular matrix\n- rocblas_fill_lower:  A_i is a  lower triangular matrix\n\n@param[in]\nm       [rocblas_int]\nm specifies the number of rows of B_i and C_i. m >= 0.\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of columns of B_i and C_i. n >= 0.\n\n@param[in]\nalpha\nalpha specifies the scalar alpha. When alpha is\nzero then A_i and B_i are not referenced.\n\n@param[in]\nA       device pointer to first matrix A_1\n- A_i is m by m if side == rocblas_side_left\n- A_i is n by n if side == rocblas_side_right\nOnly the upper/lower triangular part is accessed.\nThe imaginary component of the diagonal elements is not used.\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A_i.\n\nif side = rocblas_side_left,  lda >= max( 1, m ),\notherwise lda >= max( 1, n ).\n\n@param[in]\nstride_A  [rocblas_stride]\nstride from the start of one matrix (A_i) and the next one (A_i+1).\n\n@param[in]\nB       device pointer to first matrix B_1 of dimension (ldb, n) on the GPU\n\n@param[in]\nldb     [rocblas_int]\nldb specifies the first dimension of B_i.\n\nif side = rocblas_operation_none,  ldb >= max( 1, m ),\notherwise ldb >= max( 1, n ).\n\n@param[in]\nstride_B  [rocblas_stride]\nstride from the start of one matrix (B_i) and the next one (B_i+1).\n\n@param[in]\nbeta\nbeta specifies the scalar beta. When beta is\nzero then C need not be set before entry.\n\n@param[in]\nC        device pointer to first matrix C_1 of dimension (ldc, n) on the GPU.\n\n@param[in]\nldc    [rocblas_int]\nldc specifies the first dimension of C. ldc >= max( 1, m ).\n\n@param[in, out]\nstride_C  [rocblas_stride]\nstride from the start of one matrix (C_i) and the next one (C_i+1).\n\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_chemm_strided_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        B: *const rocblas_float_complex,\n        ldb: rocblas_int,\n        stride_B: rocblas_stride,\n        beta: *const rocblas_float_complex,\n        C: *mut rocblas_float_complex,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhemm_strided_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        B: *const rocblas_double_complex,\n        ldb: rocblas_int,\n        stride_B: rocblas_stride,\n        beta: *const rocblas_double_complex,\n        C: *mut rocblas_double_complex,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_chemm_strided_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        B: *const rocblas_float_complex,\n        ldb: i64,\n        stride_B: rocblas_stride,\n        beta: *const rocblas_float_complex,\n        C: *mut rocblas_float_complex,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zhemm_strided_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        B: *const rocblas_double_complex,\n        ldb: i64,\n        stride_B: rocblas_stride,\n        beta: *const rocblas_double_complex,\n        C: *mut rocblas_double_complex,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\nherk performs one of the matrix-matrix operations for a Hermitian rank-k update:\n\nC := alpha*op( A )*op( A )^H + beta*C,\n\nwhere  alpha and beta are scalars, op(A) is an n by k matrix, and\nC is a n x n Hermitian matrix stored as either upper or lower.\n\nop( A ) = A, and A is n by k if transA == rocblas_operation_none\nop( A ) = A^H and A is k by n if transA == rocblas_operation_conjugate_transpose\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  C is an upper triangular matrix\n- rocblas_fill_lower:  C is a  lower triangular matrix\n\n@param[in]\ntransA  [rocblas_operation]\n- rocblas_operation_conjugate_transpose:  op(A) = A^H\n- rocblas_operation_none:                 op(A) = A\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of rows and columns of C. n >= 0.\n\n@param[in]\nk       [rocblas_int]\nk specifies the number of columns of op(A). k >= 0.\n\n@param[in]\nalpha\nalpha specifies the scalar alpha. When alpha is\nzero then A is not referenced and A need not be set before\nentry.\n\n@param[in]\nA       pointer storing matrix A on the GPU.\nMatrix dimension is ( lda, k ) when if transA = rocblas_operation_none, otherwise (lda, n)\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A.\n\nif transA = rocblas_operation_none,  lda >= max( 1, n ),\notherwise lda >= max( 1, k ).\n\n@param[in]\nbeta\nbeta specifies the scalar beta. When beta is\nzero then C need not be set before entry.\n\n@param[in]\nC       pointer storing matrix C on the GPU.\nThe imaginary component of the diagonal elements are not used but are set to zero unless quick return.\nonly the upper/lower triangular part is accessed.\n\n@param[in]\nldc    [rocblas_int]\nldc specifies the first dimension of C. ldc >= max( 1, n ).\n*/\n    pub fn rocblas_cherk(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f32,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        beta: *const f32,\n        C: *mut rocblas_float_complex,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zherk(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f64,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        beta: *const f64,\n        C: *mut rocblas_double_complex,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cherk_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        beta: *const f32,\n        C: *mut rocblas_float_complex,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zherk_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        beta: *const f64,\n        C: *mut rocblas_double_complex,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\nherk_batched performs a batch of the matrix-matrix operations for a Hermitian rank-k update:\n\nC_i := alpha*op( A_i )*op( A_i )^H + beta*C_i,\n\nwhere  alpha and beta are scalars, op(A) is an n by k matrix, and\nC_i is a n x n Hermitian matrix stored as either upper or lower.\n\nop( A_i ) = A_i, and A_i is n by k if transA == rocblas_operation_none\nop( A_i ) = A_i^H and A_i is k by n if transA == rocblas_operation_conjugate_transpose\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  C_i is an upper triangular matrix\n- rocblas_fill_lower:  C_i is a  lower triangular matrix\n\n@param[in]\ntransA  [rocblas_operation]\n- rocblas_operation_conjugate_transpose: op(A) = A^H\n- rocblas_operation_none:                op(A) = A\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of rows and columns of C_i. n >= 0.\n\n@param[in]\nk       [rocblas_int]\nk specifies the number of columns of op(A). k >= 0.\n\n@param[in]\nalpha\nalpha specifies the scalar alpha. When alpha is\nzero then A is not referenced and A need not be set before\nentry.\n\n@param[in]\nA       device array of device pointers storing each matrix_i A of dimension (lda, k)\nwhen transA is rocblas_operation_none, otherwise of dimension (lda, n).\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A_i.\n\nif transA = rocblas_operation_none,  lda >= max( 1, n ),\notherwise lda >= max( 1, k ).\n\n@param[in]\nbeta\nbeta specifies the scalar beta. When beta is\nzero then C need not be set before entry.\n\n@param[in]\nC       device array of device pointers storing each matrix C_i on the GPU.\nThe imaginary component of the diagonal elements are not used but are set to zero unless quick return.\nonly the upper/lower triangular part of each C_i is accessed.\n\n@param[in]\nldc    [rocblas_int]\nldc specifies the first dimension of C. ldc >= max( 1, n ).\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_cherk_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f32,\n        A: *const *const rocblas_float_complex,\n        lda: rocblas_int,\n        beta: *const f32,\n        C: *const *mut rocblas_float_complex,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zherk_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f64,\n        A: *const *const rocblas_double_complex,\n        lda: rocblas_int,\n        beta: *const f64,\n        C: *const *mut rocblas_double_complex,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cherk_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const *const rocblas_float_complex,\n        lda: i64,\n        beta: *const f32,\n        C: *const *mut rocblas_float_complex,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zherk_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        A: *const *const rocblas_double_complex,\n        lda: i64,\n        beta: *const f64,\n        C: *const *mut rocblas_double_complex,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\nherk_strided_batched performs a batch of the matrix-matrix operations for a Hermitian rank-k update:\n\nC_i := alpha*op( A_i )*op( A_i )^H + beta*C_i,\n\nwhere  alpha and beta are scalars, op(A) is an n by k matrix, and\nC_i is a n x n Hermitian matrix stored as either upper or lower.\n\nop( A_i ) = A_i, and A_i is n by k if transA == rocblas_operation_none\nop( A_i ) = A_i^H and A_i is k by n if transA == rocblas_operation_conjugate_transpose\n\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  C_i is an upper triangular matrix\n- rocblas_fill_lower:  C_i is a  lower triangular matrix\n\n@param[in]\ntransA  [rocblas_operation]\n- rocblas_operation_conjugate_transpose: op(A) = A^H\n- rocblas_operation_none:                op(A) = A\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of rows and columns of C_i. n >= 0.\n\n@param[in]\nk       [rocblas_int]\nk specifies the number of columns of op(A). k >= 0.\n\n@param[in]\nalpha\nalpha specifies the scalar alpha. When alpha is\nzero then A is not referenced and A need not be set before\nentry.\n\n@param[in]\nA       Device pointer to the first matrix A_1 on the GPU of dimension (lda, k)\nwhen transA is rocblas_operation_none, otherwise of dimension (lda, n)\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A_i.\n\nif transA = rocblas_operation_none,  lda >= max( 1, n ),\notherwise lda >= max( 1, k ).\n\n@param[in]\nstride_A  [rocblas_stride]\nstride from the start of one matrix (A_i) and the next one (A_i+1).\n\n@param[in]\nbeta\nbeta specifies the scalar beta. When beta is\nzero then C need not be set before entry.\n\n@param[in]\nC       Device pointer to the first matrix C_1 on the GPU.\nThe imaginary component of the diagonal elements are not used but are set to zero unless quick return.\nonly the upper/lower triangular part of each C_i is accessed.\n\n@param[in]\nldc    [rocblas_int]\nldc specifies the first dimension of C. ldc >= max( 1, n ).\n\n@param[in, out]\nstride_C  [rocblas_stride]\nstride from the start of one matrix (C_i) and the next one (C_i+1).\n\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_cherk_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f32,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        beta: *const f32,\n        C: *mut rocblas_float_complex,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zherk_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f64,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        beta: *const f64,\n        C: *mut rocblas_double_complex,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cherk_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        beta: *const f32,\n        C: *mut rocblas_float_complex,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zherk_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        beta: *const f64,\n        C: *mut rocblas_double_complex,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\nher2k performs one of the matrix-matrix operations for a Hermitian rank-2k update:\n\nC := alpha*op( A )*op( B )^H + conj(alpha)*op( B )*op( A )^H + beta*C,\n\nwhere  alpha and beta are scalars, op(A) and op(B) are n by k matrices, and\nC is a n x n Hermitian matrix stored as either upper or lower.\n\nop( A ) = A, op( B ) = B, and A and B are n by k if trans == rocblas_operation_none\nop( A ) = A^H, op( B ) = B^H,  and A and B are k by n if trans == rocblas_operation_conjugate_transpose\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  C is an upper triangular matrix\n- rocblas_fill_lower:  C is a  lower triangular matrix\n\n@param[in]\ntrans  [rocblas_operation]\n- rocblas_operation_conjugate_transpose:  op( A ) = A^H, op( B ) = B^H\n- rocblas_operation_none:                 op( A ) = A, op( B ) = B\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of rows and columns of C. n >= 0.\n\n@param[in]\nk       [rocblas_int]\nk specifies the number of columns of op(A). k >= 0.\n\n@param[in]\nalpha\nalpha specifies the scalar alpha. When alpha is\nzero then A is not referenced and A need not be set before\nentry.\n\n@param[in]\nA       pointer storing matrix A on the GPU.\nMatrix dimension is ( lda, k ) when if trans = rocblas_operation_none, otherwise (lda, n)\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A.\n\nif trans = rocblas_operation_none,  lda >= max( 1, n ),\notherwise lda >= max( 1, k ).\n\n@param[in]\nB       pointer storing matrix B on the GPU.\nMatrix dimension is ( ldb, k ) when if trans = rocblas_operation_none, otherwise (ldb, n)\n\n@param[in]\nldb     [rocblas_int]\nldb specifies the first dimension of B.\n\nif trans = rocblas_operation_none,  ldb >= max( 1, n ),\notherwise ldb >= max( 1, k ).\n\n@param[in]\nbeta\nbeta specifies the scalar beta. When beta is\nzero then C need not be set before entry.\n\n@param[in]\nC       pointer storing matrix C on the GPU.\nThe imaginary component of the diagonal elements are not used but are set to zero unless quick return.\nonly the upper/lower triangular part is accessed.\n\n@param[in]\nldc    [rocblas_int]\nldc specifies the first dimension of C. ldc >= max( 1, n ).\n*/\n    pub fn rocblas_cher2k(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        B: *const rocblas_float_complex,\n        ldb: rocblas_int,\n        beta: *const f32,\n        C: *mut rocblas_float_complex,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zher2k(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        B: *const rocblas_double_complex,\n        ldb: rocblas_int,\n        beta: *const f64,\n        C: *mut rocblas_double_complex,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cher2k_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        B: *const rocblas_float_complex,\n        ldb: i64,\n        beta: *const f32,\n        C: *mut rocblas_float_complex,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zher2k_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        B: *const rocblas_double_complex,\n        ldb: i64,\n        beta: *const f64,\n        C: *mut rocblas_double_complex,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\nher2k_batched performs a batch of the matrix-matrix operations for a Hermitian rank-2k update:\n\nC_i := alpha*op( A_i )*op( B_i )^H + conj(alpha)*op( B_i )*op( A_i )^H + beta*C_i,\n\nwhere  alpha and beta are scalars, op(A_i) and op(B_i) are n by k matrices, and\nC_i is a n x n Hermitian matrix stored as either upper or lower.\n\nop( A_i ) = A_i, op( B_i ) = B_i, and A_i and B_i are n by k if trans == rocblas_operation_none\nop( A_i ) = A_i^H, op( B_i ) = B_i^H,  and A_i and B_i are k by n if trans == rocblas_operation_conjugate_transpose\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  C_i is an upper triangular matrix\n- rocblas_fill_lower:  C_i is a  lower triangular matrix\n\n@param[in]\ntrans  [rocblas_operation]\n- rocblas_operation_conjugate_transpose: op(A) = A^H\n- rocblas_operation_none:                op(A) = A\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of rows and columns of C_i. n >= 0.\n\n@param[in]\nk       [rocblas_int]\nk specifies the number of columns of op(A). k >= 0.\n\n@param[in]\nalpha\nalpha specifies the scalar alpha. When alpha is\nzero then A is not referenced and A need not be set before\nentry.\n\n@param[in]\nA       device array of device pointers storing each matrix_i A of dimension (lda, k)\nwhen trans is rocblas_operation_none, otherwise of dimension (lda, n).\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A_i.\n\nif trans = rocblas_operation_none,  lda >= max( 1, n ),\notherwise lda >= max( 1, k ).\n@param[in]\nB       device array of device pointers storing each matrix_i B of dimension (ldb, k)\nwhen trans is rocblas_operation_none, otherwise of dimension (ldb, n).\n\n@param[in]\nldb     [rocblas_int]\nldb specifies the first dimension of B_i.\n\nif trans = rocblas_operation_none,  ldb >= max( 1, n ),\notherwise ldb >= max( 1, k ).\n@param[in]\nbeta\nbeta specifies the scalar beta. When beta is\nzero then C need not be set before entry.\n\n@param[in]\nC       device array of device pointers storing each matrix C_i on the GPU.\nThe imaginary component of the diagonal elements are not used but are set to zero unless quick return.\nonly the upper/lower triangular part of each C_i is accessed.\n\n@param[in]\nldc    [rocblas_int]\nldc specifies the first dimension of C. ldc >= max( 1, n ).\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_cher2k_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: rocblas_int,\n        B: *const *const rocblas_float_complex,\n        ldb: rocblas_int,\n        beta: *const f32,\n        C: *const *mut rocblas_float_complex,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zher2k_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: rocblas_int,\n        B: *const *const rocblas_double_complex,\n        ldb: rocblas_int,\n        beta: *const f64,\n        C: *const *mut rocblas_double_complex,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cher2k_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: i64,\n        B: *const *const rocblas_float_complex,\n        ldb: i64,\n        beta: *const f32,\n        C: *const *mut rocblas_float_complex,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zher2k_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: i64,\n        B: *const *const rocblas_double_complex,\n        ldb: i64,\n        beta: *const f64,\n        C: *const *mut rocblas_double_complex,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\nher2k_strided_batched performs a batch of the matrix-matrix operations for a Hermitian rank-2k update:\n\nC_i := alpha*op( A_i )*op( B_i )^H + conj(alpha)*op( B_i )*op( A_i )^H + beta*C_i,\n\nwhere  alpha and beta are scalars, op(A_i) and op(B_i) are n by k matrices, and\nC_i is a n x n Hermitian matrix stored as either upper or lower.\n\nop( A_i ) = A_i, op( B_i ) = B_i, and A_i and B_i are n by k if trans == rocblas_operation_none\nop( A_i ) = A_i^H, op( B_i ) = B_i^H,  and A_i and B_i are k by n if trans == rocblas_operation_conjugate_transpose\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  C_i is an upper triangular matrix\n- rocblas_fill_lower:  C_i is a  lower triangular matrix\n\n@param[in]\ntrans  [rocblas_operation]\n- rocblas_operation_conjugate_transpose: op( A_i ) = A_i^H, op( B_i ) = B_i^H\n- rocblas_operation_none:                op( A_i ) = A_i, op( B_i ) = B_i\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of rows and columns of C_i. n >= 0.\n\n@param[in]\nk       [rocblas_int]\nk specifies the number of columns of op(A). k >= 0.\n\n@param[in]\nalpha\nalpha specifies the scalar alpha. When alpha is\nzero then A is not referenced and A need not be set before\nentry.\n\n@param[in]\nA       Device pointer to the first matrix A_1 on the GPU of dimension (lda, k)\nwhen trans is rocblas_operation_none, otherwise of dimension (lda, n).\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A_i.\n\nif trans = rocblas_operation_none,  lda >= max( 1, n ),\notherwise lda >= max( 1, k ).\n\n@param[in]\nstride_A  [rocblas_stride]\nstride from the start of one matrix (A_i) and the next one (A_i+1).\n\n@param[in]\nB       Device pointer to the first matrix B_1 on the GPU of dimension (ldb, k)\nwhen trans is rocblas_operation_none, otherwise of dimension (ldb, n).\n\n@param[in]\nldb     [rocblas_int]\nldb specifies the first dimension of B_i.\n\nif trans = rocblas_operation_none,  ldb >= max( 1, n ),\notherwise ldb >= max( 1, k ).\n\n@param[in]\nstride_B  [rocblas_stride]\nstride from the start of one matrix (B_i) and the next one (B_i+1).\n\n@param[in]\nbeta\nbeta specifies the scalar beta. When beta is\nzero then C need not be set before entry.\n\n@param[in]\nC       Device pointer to the first matrix C_1 on the GPU.\nThe imaginary component of the diagonal elements are not used but are set to zero unless quick return.\nonly the upper/lower triangular part of each C_i is accessed.\n\n@param[in]\nldc    [rocblas_int]\nldc specifies the first dimension of C. ldc >= max( 1, n ).\n\n@param[in, out]\nstride_C  [rocblas_stride]\nstride from the start of one matrix (C_i) and the next one (C_i+1).\n\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_cher2k_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        B: *const rocblas_float_complex,\n        ldb: rocblas_int,\n        stride_B: rocblas_stride,\n        beta: *const f32,\n        C: *mut rocblas_float_complex,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zher2k_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        B: *const rocblas_double_complex,\n        ldb: rocblas_int,\n        stride_B: rocblas_stride,\n        beta: *const f64,\n        C: *mut rocblas_double_complex,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cher2k_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        B: *const rocblas_float_complex,\n        ldb: i64,\n        stride_B: rocblas_stride,\n        beta: *const f32,\n        C: *mut rocblas_float_complex,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zher2k_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        B: *const rocblas_double_complex,\n        ldb: i64,\n        stride_B: rocblas_stride,\n        beta: *const f64,\n        C: *mut rocblas_double_complex,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\nherkx performs one of the matrix-matrix operations for a Hermitian rank-k update:\n\nC := alpha*op( A )*op( B )^H + beta*C,\n\nwhere  alpha and beta are scalars, op(A) and op(B) are n by k matrices, and\nC is a n x n Hermitian matrix stored as either upper or lower.\n\nThis routine should only be used when the caller can guarantee that the result of op( A )*op( B )^T will be Hermitian.\n\nop( A ) = A, op( B ) = B, and A and B are n by k if trans == rocblas_operation_none\nop( A ) = A^H, op( B ) = B^H,  and A and B are k by n if trans == rocblas_operation_conjugate_transpose\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  C is an upper triangular matrix\n- rocblas_fill_lower:  C is a  lower triangular matrix\n\n@param[in]\ntrans  [rocblas_operation]\n- rocblas_operation_conjugate_transpose:  op( A ) = A^H, op( B ) = B^H\n- rocblas_operation_none:                 op( A ) = A, op( B ) = B\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of rows and columns of C. n >= 0.\n\n@param[in]\nk       [rocblas_int]\nk specifies the number of columns of op(A). k >= 0.\n\n@param[in]\nalpha\nalpha specifies the scalar alpha. When alpha is\nzero then A is not referenced and A need not be set before\nentry.\n\n@param[in]\nA       pointer storing matrix A on the GPU.\nMatrix dimension is ( lda, k ) when if trans = rocblas_operation_none, otherwise (lda, n)\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A.\n\nif trans = rocblas_operation_none,  lda >= max( 1, n ),\notherwise lda >= max( 1, k ).\n@param[in]\nB       pointer storing matrix B on the GPU.\nMatrix dimension is ( ldb, k ) when if trans = rocblas_operation_none, otherwise (ldb, n)\n\n@param[in]\nldb     [rocblas_int]\nldb specifies the first dimension of B.\n\nif trans = rocblas_operation_none,  ldb >= max( 1, n ),\notherwise ldb >= max( 1, k ).\n\n@param[in]\nbeta\nbeta specifies the scalar beta. When beta is\nzero then C need not be set before entry.\n\n@param[in]\nC       pointer storing matrix C on the GPU.\nThe imaginary component of the diagonal elements are not used but are set to zero unless quick return.\nonly the upper/lower triangular part is accessed.\n\n@param[in]\nldc    [rocblas_int]\nldc specifies the first dimension of C. ldc >= max( 1, n ).\n*/\n    pub fn rocblas_cherkx(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        B: *const rocblas_float_complex,\n        ldb: rocblas_int,\n        beta: *const f32,\n        C: *mut rocblas_float_complex,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zherkx(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        B: *const rocblas_double_complex,\n        ldb: rocblas_int,\n        beta: *const f64,\n        C: *mut rocblas_double_complex,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cherkx_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        B: *const rocblas_float_complex,\n        ldb: i64,\n        beta: *const f32,\n        C: *mut rocblas_float_complex,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zherkx_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        B: *const rocblas_double_complex,\n        ldb: i64,\n        beta: *const f64,\n        C: *mut rocblas_double_complex,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\nherkx_batched performs a batch of the matrix-matrix operations for a Hermitian rank-k update:\n\nC_i := alpha*op( A_i )*op( B_i )^H + beta*C_i,\n\nwhere  alpha and beta are scalars, op(A_i) and op(B_i) are n by k matrices, and\nC_i is a n x n Hermitian matrix stored as either upper or lower.\n\nThis routine should only be used when the caller can guarantee that the result of op( A )*op( B )^T will be Hermitian.\n\nop( A_i ) = A_i, op( B_i ) = B_i, and A_i and B_i are n by k if trans == rocblas_operation_none\nop( A_i ) = A_i^H, op( B_i ) = B_i^H,  and A_i and B_i are k by n if trans == rocblas_operation_conjugate_transpose\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  C_i is an upper triangular matrix\n- rocblas_fill_lower:  C_i is a  lower triangular matrix\n\n@param[in]\ntrans  [rocblas_operation]\n- rocblas_operation_conjugate_transpose: op(A) = A^H\n- rocblas_operation_none:                op(A) = A\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of rows and columns of C_i. n >= 0.\n\n@param[in]\nk       [rocblas_int]\nk specifies the number of columns of op(A). k >= 0.\n\n@param[in]\nalpha\nalpha specifies the scalar alpha. When alpha is\nzero then A is not referenced and A need not be set before\nentry.\n\n@param[in]\nA       device array of device pointers storing each matrix_i A of dimension (lda, k)\nwhen trans is rocblas_operation_none, otherwise of dimension (lda, n)\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A_i.\n\nif trans = rocblas_operation_none,  lda >= max( 1, n ),\notherwise lda >= max( 1, k ).\n\n@param[in]\nB       device array of device pointers storing each matrix_i B of dimension (ldb, k)\nwhen trans is rocblas_operation_none, otherwise of dimension (ldb, n)\n\n@param[in]\nldb     [rocblas_int]\nldb specifies the first dimension of B_i.\n\nif trans = rocblas_operation_none,  ldb >= max( 1, n ),\notherwise ldb >= max( 1, k ).\n\n@param[in]\nbeta\nbeta specifies the scalar beta. When beta is\nzero then C need not be set before entry.\n\n@param[in]\nC       device array of device pointers storing each matrix C_i on the GPU.\nThe imaginary component of the diagonal elements are not used but are set to zero unless quick return.\nonly the upper/lower triangular part of each C_i is accessed.\n\n@param[in]\nldc    [rocblas_int]\nldc specifies the first dimension of C. ldc >= max( 1, n ).\n\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_cherkx_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: rocblas_int,\n        B: *const *const rocblas_float_complex,\n        ldb: rocblas_int,\n        beta: *const f32,\n        C: *const *mut rocblas_float_complex,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zherkx_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: rocblas_int,\n        B: *const *const rocblas_double_complex,\n        ldb: rocblas_int,\n        beta: *const f64,\n        C: *const *mut rocblas_double_complex,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cherkx_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: i64,\n        B: *const *const rocblas_float_complex,\n        ldb: i64,\n        beta: *const f32,\n        C: *const *mut rocblas_float_complex,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zherkx_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: i64,\n        B: *const *const rocblas_double_complex,\n        ldb: i64,\n        beta: *const f64,\n        C: *const *mut rocblas_double_complex,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\nherkx_strided_batched performs a batch of the matrix-matrix operations for a Hermitian rank-k update:\n\nC_i := alpha*op( A_i )*op( B_i )^H + beta*C_i,\n\nwhere  alpha and beta are scalars, op(A_i) and op(B_i) are n by k matrices, and\nC_i is a n x n Hermitian matrix stored as either upper or lower.\n\nThis routine should only be used when the caller can guarantee that the result of op( A )*op( B )^T will be Hermitian.\n\nop( A_i ) = A_i, op( B_i ) = B_i, and A_i and B_i are n by k if trans == rocblas_operation_none\nop( A_i ) = A_i^H, op( B_i ) = B_i^H,  and A_i and B_i are k by n if trans == rocblas_operation_conjugate_transpose\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  C_i is an upper triangular matrix\n- rocblas_fill_lower:  C_i is a  lower triangular matrix\n\n@param[in]\ntrans  [rocblas_operation]\n- rocblas_operation_conjugate_transpose: op( A_i ) = A_i^H, op( B_i ) = B_i^H\n- rocblas_operation_none:                op( A_i ) = A_i, op( B_i ) = B_i\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of rows and columns of C_i. n >= 0.\n\n@param[in]\nk       [rocblas_int]\nk specifies the number of columns of op(A). k >= 0.\n\n@param[in]\nalpha\nalpha specifies the scalar alpha. When alpha is\nzero then A is not referenced and A need not be set before\nentry.\n\n@param[in]\nA       Device pointer to the first matrix A_1 on the GPU of dimension (lda, k)\nwhen trans is rocblas_operation_none, otherwise of dimension (lda, n).\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A_i.\n\nif trans = rocblas_operation_none,  lda >= max( 1, n ),\notherwise lda >= max( 1, k ).\n\n@param[in]\nstride_A  [rocblas_stride]\nstride from the start of one matrix (A_i) and the next one (A_i+1)\n\n@param[in]\nB       Device pointer to the first matrix B_1 on the GPU of dimension (ldb, k)\nwhen trans is rocblas_operation_none, otherwise of dimension (ldb, n).\n\n@param[in]\nldb     [rocblas_int]\nldb specifies the first dimension of B_i.\n\nif trans = rocblas_operation_none,  ldb >= max( 1, n ),\notherwise ldb >= max( 1, k ).\n\n@param[in]\nstride_B  [rocblas_stride]\nstride from the start of one matrix (B_i) and the next one (B_i+1)\n\n@param[in]\nbeta\nbeta specifies the scalar beta. When beta is\nzero then C need not be set before entry.\n\n@param[in]\nC       Device pointer to the first matrix C_1 on the GPU.\nThe imaginary component of the diagonal elements are not used but are set to zero unless quick return.\nonly the upper/lower triangular part of each C_i is accessed.\n\n@param[in]\nldc    [rocblas_int]\nldc specifies the first dimension of C. ldc >= max( 1, n ).\n\n@param[in, out]\nstride_C  [rocblas_stride]\nstride from the start of one matrix (C_i) and the next one (C_i+1).\n\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_cherkx_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        B: *const rocblas_float_complex,\n        ldb: rocblas_int,\n        stride_B: rocblas_stride,\n        beta: *const f32,\n        C: *mut rocblas_float_complex,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zherkx_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        B: *const rocblas_double_complex,\n        ldb: rocblas_int,\n        stride_B: rocblas_stride,\n        beta: *const f64,\n        C: *mut rocblas_double_complex,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cherkx_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        B: *const rocblas_float_complex,\n        ldb: i64,\n        stride_B: rocblas_stride,\n        beta: *const f32,\n        C: *mut rocblas_float_complex,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zherkx_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        B: *const rocblas_double_complex,\n        ldb: i64,\n        stride_B: rocblas_stride,\n        beta: *const f64,\n        C: *mut rocblas_double_complex,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\nsymm performs one of the matrix-matrix operations:\n\nC := alpha*A*B + beta*C if side == rocblas_side_left,\nC := alpha*B*A + beta*C if side == rocblas_side_right,\n\nwhere alpha and beta are scalars, B and C are m by n matrices, and\nA is a symmetric matrix stored as either upper or lower.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nside  [rocblas_side]\n- rocblas_side_left:      C := alpha*A*B + beta*C\n- rocblas_side_right:     C := alpha*B*A + beta*C\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  A is an upper triangular matrix\n- rocblas_fill_lower:  A is a  lower triangular matrix\n\n@param[in]\nm       [rocblas_int]\nm specifies the number of rows of B and C. m >= 0.\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of columns of B and C. n >= 0.\n\n@param[in]\nalpha\nalpha specifies the scalar alpha. When alpha is\nzero then A and B are not referenced.\n\n@param[in]\nA       pointer storing matrix A on the GPU.\n- A is m by m if side == rocblas_side_left\n- A is n by n if side == rocblas_side_right\nonly the upper/lower triangular part is accessed.\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A.\n\nif side = rocblas_side_left,  lda >= max( 1, m ),\notherwise lda >= max( 1, n ).\n\n@param[in]\nB       pointer storing matrix B on the GPU.\nMatrix dimension is m by n\n\n@param[in]\nldb     [rocblas_int]\nldb specifies the first dimension of B. ldb >= max( 1, m ).\n\n@param[in]\nbeta\nbeta specifies the scalar beta. When beta is\nzero then C need not be set before entry.\n\n@param[in]\nC       pointer storing matrix C on the GPU.\nMatrix dimension is m by n\n\n@param[in]\nldc    [rocblas_int]\nldc specifies the first dimension of C. ldc >= max( 1, m ).\n*/\n    pub fn rocblas_ssymm(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocblas_int,\n        B: *const f32,\n        ldb: rocblas_int,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsymm(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocblas_int,\n        B: *const f64,\n        ldb: rocblas_int,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csymm(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        B: *const rocblas_float_complex,\n        ldb: rocblas_int,\n        beta: *const rocblas_float_complex,\n        C: *mut rocblas_float_complex,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsymm(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        B: *const rocblas_double_complex,\n        ldb: rocblas_int,\n        beta: *const rocblas_double_complex,\n        C: *mut rocblas_double_complex,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ssymm_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        B: *const f32,\n        ldb: i64,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsymm_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: i64,\n        n: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        B: *const f64,\n        ldb: i64,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csymm_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        B: *const rocblas_float_complex,\n        ldb: i64,\n        beta: *const rocblas_float_complex,\n        C: *mut rocblas_float_complex,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsymm_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        B: *const rocblas_double_complex,\n        ldb: i64,\n        beta: *const rocblas_double_complex,\n        C: *mut rocblas_double_complex,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\nsymm_batched performs a batch of the matrix-matrix operations:\n\nC_i := alpha*A_i*B_i + beta*C_i if side == rocblas_side_left,\nC_i := alpha*B_i*A_i + beta*C_i if side == rocblas_side_right,\n\nwhere alpha and beta are scalars, B_i and C_i are m by n matrices, and\nA_i is a symmetric matrix stored as either upper or lower.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nside  [rocblas_side]\n- rocblas_side_left:      C_i := alpha*A_i*B_i + beta*C_i\n- rocblas_side_right:     C_i := alpha*B_i*A_i + beta*C_i\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  A_i is an upper triangular matrix\n- rocblas_fill_lower:  A_i is a  lower triangular matrix\n\n@param[in]\nm       [rocblas_int]\nm specifies the number of rows of B_i and C_i. m >= 0.\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of columns of B_i and C_i. n >= 0.\n\n@param[in]\nalpha\nalpha specifies the scalar alpha. When alpha is\nzero then A_i and B_i are not referenced.\n\n@param[in]\nA       device array of device pointers storing each matrix A_i on the GPU.\n- A_i is m by m if side == rocblas_side_left\n- A_i is n by n if side == rocblas_side_right\nonly the upper/lower triangular part is accessed.\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A_i.\n\nif side = rocblas_side_left,  lda >= max( 1, m ),\notherwise lda >= max( 1, n ).\n\n@param[in]\nB       device array of device pointers storing each matrix B_i on the GPU.\nMatrix dimension is m by n\n\n@param[in]\nldb     [rocblas_int]\nldb specifies the first dimension of B_i. ldb >= max( 1, m ).\n\n@param[in]\nbeta\nbeta specifies the scalar beta. When beta is\nzero then C_i need not be set before entry.\n\n@param[in]\nC       device array of device pointers storing each matrix C_i on the GPU.\nMatrix dimension is m by n.\n\n@param[in]\nldc    [rocblas_int]\nldc specifies the first dimension of C_i. ldc >= max( 1, m ).\n\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_ssymm_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const *const f32,\n        lda: rocblas_int,\n        B: *const *const f32,\n        ldb: rocblas_int,\n        beta: *const f32,\n        C: *const *mut f32,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsymm_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f64,\n        A: *const *const f64,\n        lda: rocblas_int,\n        B: *const *const f64,\n        ldb: rocblas_int,\n        beta: *const f64,\n        C: *const *mut f64,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csymm_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: rocblas_int,\n        B: *const *const rocblas_float_complex,\n        ldb: rocblas_int,\n        beta: *const rocblas_float_complex,\n        C: *const *mut rocblas_float_complex,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsymm_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: rocblas_int,\n        B: *const *const rocblas_double_complex,\n        ldb: rocblas_int,\n        beta: *const rocblas_double_complex,\n        C: *const *mut rocblas_double_complex,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ssymm_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const *const f32,\n        lda: i64,\n        B: *const *const f32,\n        ldb: i64,\n        beta: *const f32,\n        C: *const *mut f32,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsymm_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: i64,\n        n: i64,\n        alpha: *const f64,\n        A: *const *const f64,\n        lda: i64,\n        B: *const *const f64,\n        ldb: i64,\n        beta: *const f64,\n        C: *const *mut f64,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csymm_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: i64,\n        B: *const *const rocblas_float_complex,\n        ldb: i64,\n        beta: *const rocblas_float_complex,\n        C: *const *mut rocblas_float_complex,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsymm_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: i64,\n        B: *const *const rocblas_double_complex,\n        ldb: i64,\n        beta: *const rocblas_double_complex,\n        C: *const *mut rocblas_double_complex,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\nsymm_strided_batched performs a batch of the matrix-matrix operations:\n\nC_i := alpha*A_i*B_i + beta*C_i if side == rocblas_side_left,\nC_i := alpha*B_i*A_i + beta*C_i if side == rocblas_side_right,\n\nwhere alpha and beta are scalars, B_i and C_i are m by n matrices, and\nA_i is a symmetric matrix stored as either upper or lower.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nside  [rocblas_side]\n- rocblas_side_left:      C_i := alpha*A_i*B_i + beta*C_i\n- rocblas_side_right:     C_i := alpha*B_i*A_i + beta*C_i\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  A_i is an upper triangular matrix\n- rocblas_fill_lower:  A_i is a  lower triangular matrix\n\n@param[in]\nm       [rocblas_int]\nm specifies the number of rows of B_i and C_i. m >= 0.\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of columns of B_i and C_i. n >= 0.\n\n@param[in]\nalpha\nalpha specifies the scalar alpha. When alpha is\nzero then A_i and B_i are not referenced.\n\n@param[in]\nA       device pointer to first matrix A_1\n- A_i is m by m if side == rocblas_side_left\n- A_i is n by n if side == rocblas_side_right\nonly the upper/lower triangular part is accessed.\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A_i.\n\nif side = rocblas_side_left,  lda >= max( 1, m ),\notherwise lda >= max( 1, n ).\n\n@param[in]\nstride_A  [rocblas_stride]\nstride from the start of one matrix (A_i) and the next one (A_i+1).\n\n@param[in]\nB       device pointer to first matrix B_1 of dimension (ldb, n) on the GPU.\n\n@param[in]\nldb     [rocblas_int]\nldb specifies the first dimension of B_i. ldb >= max( 1, m ).\n\n@param[in]\nstride_B  [rocblas_stride]\nstride from the start of one matrix (B_i) and the next one (B_i+1).\n@param[in]\nbeta\nbeta specifies the scalar beta. When beta is\nzero then C need not be set before entry.\n\n@param[in]\nC        device pointer to first matrix C_1 of dimension (ldc, n) on the GPU.\n\n@param[in]\nldc    [rocblas_int]\nldc specifies the first dimension of C. ldc >= max( 1, m ).\n\n@param[in, out]\nstride_C  [rocblas_stride]\nstride from the start of one matrix (C_i) and the next one (C_i+1).\n\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_ssymm_strided_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        B: *const f32,\n        ldb: rocblas_int,\n        stride_B: rocblas_stride,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsymm_strided_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        B: *const f64,\n        ldb: rocblas_int,\n        stride_B: rocblas_stride,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csymm_strided_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        B: *const rocblas_float_complex,\n        ldb: rocblas_int,\n        stride_B: rocblas_stride,\n        beta: *const rocblas_float_complex,\n        C: *mut rocblas_float_complex,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsymm_strided_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        B: *const rocblas_double_complex,\n        ldb: rocblas_int,\n        stride_B: rocblas_stride,\n        beta: *const rocblas_double_complex,\n        C: *mut rocblas_double_complex,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ssymm_strided_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        stride_A: rocblas_stride,\n        B: *const f32,\n        ldb: i64,\n        stride_B: rocblas_stride,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsymm_strided_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: i64,\n        n: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        stride_A: rocblas_stride,\n        B: *const f64,\n        ldb: i64,\n        stride_B: rocblas_stride,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csymm_strided_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        B: *const rocblas_float_complex,\n        ldb: i64,\n        stride_B: rocblas_stride,\n        beta: *const rocblas_float_complex,\n        C: *mut rocblas_float_complex,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsymm_strided_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        B: *const rocblas_double_complex,\n        ldb: i64,\n        stride_B: rocblas_stride,\n        beta: *const rocblas_double_complex,\n        C: *mut rocblas_double_complex,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\nsyrk performs one of the matrix-matrix operations for a symmetric rank-k update:\n\nC := alpha*op( A )*op( A )^T + beta*C,\n\nwhere  alpha and beta are scalars, op(A) is an n by k matrix, and\nC is a symmetric n x n matrix stored as either upper or lower.\n\nop( A ) = A, and A is n by k if transA == rocblas_operation_none\nop( A ) = A^T and A is k by n if transA == rocblas_operation_transpose\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  C is an upper triangular matrix\n- rocblas_fill_lower:  C is a  lower triangular matrix\n\n@param[in]\ntransA  [rocblas_operation]\n- rocblas_operation_transpose:           op(A) = A^T\n- rocblas_operation_none:                op(A) = A\n- rocblas_operation_conjugate_transpose: op(A) = A^T\n\nrocblas_operation_conjugate_transpose is not supported for complex types. See cherk\nand zherk.\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of rows and columns of C. n >= 0.\n\n@param[in]\nk       [rocblas_int]\nk specifies the number of columns of op(A). k >= 0.\n\n@param[in]\nalpha\nalpha specifies the scalar alpha. When alpha is\nzero then A is not referenced and A need not be set before\nentry.\n\n@param[in]\nA       pointer storing matrix A on the GPU.\nMatrix dimension is ( lda, k ) when if transA = rocblas_operation_none, otherwise (lda, n)\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A.\n\nif transA = rocblas_operation_none,  lda >= max( 1, n ),\notherwise lda >= max( 1, k ).\n\n@param[in]\nbeta\nbeta specifies the scalar beta. When beta is\nzero then C need not be set before entry.\n\n@param[in]\nC       pointer storing matrix C on the GPU.\nonly the upper/lower triangular part is accessed.\n\n@param[in]\nldc    [rocblas_int]\nldc specifies the first dimension of C. ldc >= max( 1, n ).\n*/\n    pub fn rocblas_ssyrk(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocblas_int,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyrk(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocblas_int,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyrk(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        beta: *const rocblas_float_complex,\n        C: *mut rocblas_float_complex,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyrk(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        beta: *const rocblas_double_complex,\n        C: *mut rocblas_double_complex,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ssyrk_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyrk_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyrk_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        beta: *const rocblas_float_complex,\n        C: *mut rocblas_float_complex,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyrk_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        beta: *const rocblas_double_complex,\n        C: *mut rocblas_double_complex,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\nsyrk_batched performs a batch of the matrix-matrix operations for a symmetric rank-k update:\n\nC_i := alpha*op( A_i )*op( A_i )^T + beta*C_i,\n\nwhere  alpha and beta are scalars, op(A_i) is an n by k matrix, and\nC_i is a symmetric n x n matrix stored as either upper or lower.\n\nop( A_i ) = A_i, and A_i is n by k if transA == rocblas_operation_none\nop( A_i ) = A_i^T and A_i is k by n if transA == rocblas_operation_transpose\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  C_i is an upper triangular matrix\n- rocblas_fill_lower:  C_i is a  lower triangular matrix\n\n@param[in]\ntransA  [rocblas_operation]\n- rocblas_operation_transpose:           op(A) = A^T\n- rocblas_operation_none:                op(A) = A\n- rocblas_operation_conjugate_transpose: op(A) = A^T\n\nrocblas_operation_conjugate_transpose is not supported for complex types. See cherk\nand zherk.\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of rows and columns of C_i. n >= 0.\n\n@param[in]\nk       [rocblas_int]\nk specifies the number of columns of op(A). k >= 0.\n\n@param[in]\nalpha\nalpha specifies the scalar alpha. When alpha is\nzero then A is not referenced and A need not be set before\nentry.\n\n@param[in]\nA       device array of device pointers storing each matrix_i A of dimension (lda, k)\nwhen transA is rocblas_operation_none, otherwise of dimension (lda, n).\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A_i.\n\nif transA = rocblas_operation_none,  lda >= max( 1, n ),\notherwise lda >= max( 1, k ).\n\n@param[in]\nbeta\nbeta specifies the scalar beta. When beta is\nzero then C need not be set before entry.\n\n@param[in]\nC       device array of device pointers storing each matrix C_i on the GPU.\nonly the upper/lower triangular part of each C_i is accessed.\n\n@param[in]\nldc    [rocblas_int]\nldc specifies the first dimension of C. ldc >= max( 1, n ).\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_ssyrk_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f32,\n        A: *const *const f32,\n        lda: rocblas_int,\n        beta: *const f32,\n        C: *const *mut f32,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyrk_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f64,\n        A: *const *const f64,\n        lda: rocblas_int,\n        beta: *const f64,\n        C: *const *mut f64,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyrk_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: rocblas_int,\n        beta: *const rocblas_float_complex,\n        C: *const *mut rocblas_float_complex,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyrk_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: rocblas_int,\n        beta: *const rocblas_double_complex,\n        C: *const *mut rocblas_double_complex,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ssyrk_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const *const f32,\n        lda: i64,\n        beta: *const f32,\n        C: *const *mut f32,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyrk_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        A: *const *const f64,\n        lda: i64,\n        beta: *const f64,\n        C: *const *mut f64,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyrk_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: i64,\n        beta: *const rocblas_float_complex,\n        C: *const *mut rocblas_float_complex,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyrk_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: i64,\n        beta: *const rocblas_double_complex,\n        C: *const *mut rocblas_double_complex,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\nsyrk_strided_batched performs a batch of the matrix-matrix operations for a symmetric rank-k update:\n\nC_i := alpha*op( A_i )*op( A_i )^T + beta*C_i,\n\nwhere  alpha and beta are scalars, op(A_i) is an n by k matrix, and\nC_i is a symmetric n x n matrix stored as either upper or lower.\n\nop( A_i ) = A_i, and A_i is n by k if transA == rocblas_operation_none\nop( A_i ) = A_i^T and A_i is k by n if transA == rocblas_operation_transpose\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  C_i is an upper triangular matrix\n- rocblas_fill_lower:  C_i is a  lower triangular matrix\n\n@param[in]\ntransA  [rocblas_operation]\n- rocblas_operation_transpose:           op(A) = A^T\n- rocblas_operation_none:                op(A) = A\n- rocblas_operation_conjugate_transpose: op(A) = A^T\n\nrocblas_operation_conjugate_transpose is not supported for complex types. See cherk\nand zherk.\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of rows and columns of C_i. n >= 0.\n\n@param[in]\nk       [rocblas_int]\nk specifies the number of columns of op(A). k >= 0.\n\n@param[in]\nalpha\nalpha specifies the scalar alpha. When alpha is\nzero then A is not referenced and A need not be set before\nentry.\n\n@param[in]\nA       Device pointer to the first matrix A_1 on the GPU of dimension (lda, k)\nwhen transA is rocblas_operation_none, otherwise of dimension (lda, n).\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A_i.\n\nif transA = rocblas_operation_none,  lda >= max( 1, n ),\notherwise lda >= max( 1, k ).\n\n@param[in]\nstride_A  [rocblas_stride]\nstride from the start of one matrix (A_i) and the next one (A_i+1).\n\n@param[in]\nbeta\nbeta specifies the scalar beta. When beta is\nzero then C need not be set before entry.\n\n@param[in]\nC       Device pointer to the first matrix C_1 on the GPU. on the GPU.\nonly the upper/lower triangular part of each C_i is accessed.\n\n@param[in]\nldc    [rocblas_int]\nldc specifies the first dimension of C. ldc >= max( 1, n ).\n\n@param[in, out]\nstride_C  [rocblas_stride]\nstride from the start of one matrix (C_i) and the next one (C_i+1)\n\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_ssyrk_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyrk_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyrk_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        beta: *const rocblas_float_complex,\n        C: *mut rocblas_float_complex,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyrk_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        beta: *const rocblas_double_complex,\n        C: *mut rocblas_double_complex,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ssyrk_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        stride_A: rocblas_stride,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyrk_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        stride_A: rocblas_stride,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyrk_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        beta: *const rocblas_float_complex,\n        C: *mut rocblas_float_complex,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyrk_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        beta: *const rocblas_double_complex,\n        C: *mut rocblas_double_complex,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\nsyr2k performs one of the matrix-matrix operations for a symmetric rank-2k update:\n\nC := alpha*(op( A )*op( B )^T + op( B )*op( A )^T) + beta*C,\n\nwhere  alpha and beta are scalars, op(A) and op(B) are n by k matrix, and\nC is a symmetric n x n matrix stored as either upper or lower.\n\nop( A ) = A, op( B ) = B, and A and B are n by k if trans == rocblas_operation_none\nop( A ) = A^T, op( B ) = B^T, and A and B are k by n if trans == rocblas_operation_transpose\nor for ssyr2k and dsyr2k when trans == rocblas_operation_conjugate_transpose\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  C is an upper triangular matrix\n- rocblas_fill_lower:  C is a  lower triangular matrix\n\n@param[in]\ntrans  [rocblas_operation]\n- rocblas_operation_transpose:           op( A ) = A^T, op( B ) = B^T\n- rocblas_operation_none:                op( A ) = A, op( B ) = B\n- rocblas_operation_conjugate_transpose: op( A ) = A^T, op( B ) = B^T\n\nrocblas_operation_conjugate_transpose is not supported for complex types in csyr2k and zsyr2k.\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of rows and columns of C. n >= 0.\n\n@param[in]\nk       [rocblas_int]\nk specifies the number of columns of op(A) and op(B). k >= 0.\n\n@param[in]\nalpha\nalpha specifies the scalar alpha. When alpha is\nzero then A is not referenced and A need not be set before\nentry.\n\n@param[in]\nA       pointer storing matrix A on the GPU.\nMatrix dimension is ( lda, k ) when if trans = rocblas_operation_none, otherwise (lda, n)\nonly the upper/lower triangular part is accessed.\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A.\n\nif trans = rocblas_operation_none,  lda >= max( 1, n ),\notherwise lda >= max( 1, k ).\n\n@param[in]\nB       pointer storing matrix B on the GPU.\nMatrix dimension is ( ldb, k ) when if trans = rocblas_operation_none, otherwise (ldb, n)\nonly the upper/lower triangular part is accessed.\n\n@param[in]\nldb     [rocblas_int]\nldb specifies the first dimension of B.\nif trans = rocblas_operation_none,  ldb >= max( 1, n ),\notherwise ldb >= max( 1, k ).\n@param[in]\nbeta\nbeta specifies the scalar beta. When beta is\nzero then C need not be set before entry.\n\n@param[in]\nC       pointer storing matrix C on the GPU.\n\n@param[in]\nldc    [rocblas_int]\nldc specifies the first dimension of C. ldc >= max( 1, n ).\n*/\n    pub fn rocblas_ssyr2k(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocblas_int,\n        B: *const f32,\n        ldb: rocblas_int,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyr2k(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocblas_int,\n        B: *const f64,\n        ldb: rocblas_int,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyr2k(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        B: *const rocblas_float_complex,\n        ldb: rocblas_int,\n        beta: *const rocblas_float_complex,\n        C: *mut rocblas_float_complex,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyr2k(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        B: *const rocblas_double_complex,\n        ldb: rocblas_int,\n        beta: *const rocblas_double_complex,\n        C: *mut rocblas_double_complex,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ssyr2k_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        B: *const f32,\n        ldb: i64,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyr2k_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        B: *const f64,\n        ldb: i64,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyr2k_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        B: *const rocblas_float_complex,\n        ldb: i64,\n        beta: *const rocblas_float_complex,\n        C: *mut rocblas_float_complex,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyr2k_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        B: *const rocblas_double_complex,\n        ldb: i64,\n        beta: *const rocblas_double_complex,\n        C: *mut rocblas_double_complex,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\nsyr2k_batched performs a batch of the matrix-matrix operations for a symmetric rank-2k update:\n\nC_i := alpha*(op( A_i )*op( B_i )^T + op( B_i )*op( A_i )^T) + beta*C_i,\n\nwhere  alpha and beta are scalars, op(A_i) and op(B_i) are n by k matrix, and\nC_i is a symmetric n x n matrix stored as either upper or lower.\n\nop( A_i ) = A_i, op( B_i ) = B_i, and A_i and B_i are n by k if trans == rocblas_operation_none\nop( A_i ) = A_i^T, op( B_i ) = B_i^T, and A_i and B_i are k by n if trans == rocblas_operation_transpose\nor for ssyr2k_batched and dsyr2k_batched when trans == rocblas_operation_conjugate_transpose\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  C_i is an upper triangular matrix\n- rocblas_fill_lower:  C_i is a  lower triangular matrix\n\n@param[in]\ntrans  [rocblas_operation]\n- rocblas_operation_transpose:           op( A_i ) = A_i^T, op( B_i ) = B_i^T\n- rocblas_operation_none:                op( A_i ) = A_i, op( B_i ) = B_i\n- rocblas_operation_conjugate_transpose: op( A_i ) = A_i^T, op( B_i ) = B_i^T\n\nrocblas_operation_conjugate_transpose is not supported for complex types in csyr2k_batched and zsyr2k_batched.\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of rows and columns of C_i. n >= 0.\n\n@param[in]\nk       [rocblas_int]\nk specifies the number of columns of op(A). k >= 0.\n\n@param[in]\nalpha\nalpha specifies the scalar alpha. When alpha is\nzero then A is not referenced and A need not be set before\nentry.\n\n@param[in]\nA       device array of device pointers storing each matrix_i A of dimension (lda, k)\nwhen trans is rocblas_operation_none, otherwise of dimension (lda, n).\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A_i.\nif trans = rocblas_operation_none,  lda >= max( 1, n ),\notherwise lda >= max( 1, k ).\n@param[in]\nB       device array of device pointers storing each matrix_i B of dimension (ldb, k)\nwhen trans is rocblas_operation_none, otherwise of dimension (ldb, n).\n@param[in]\nldb     [rocblas_int]\nldb specifies the first dimension of B.\n\nif trans = rocblas_operation_none,  ldb >= max( 1, n ),\notherwise ldb >= max( 1, k ).\n@param[in]\nbeta\nbeta specifies the scalar beta. When beta is\nzero then C need not be set before entry.\n\n@param[in]\nC       device array of device pointers storing each matrix C_i on the GPU.\n\n@param[in]\nldc    [rocblas_int]\nldc specifies the first dimension of C. ldc >= max( 1, n ).\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_ssyr2k_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f32,\n        A: *const *const f32,\n        lda: rocblas_int,\n        B: *const *const f32,\n        ldb: rocblas_int,\n        beta: *const f32,\n        C: *const *mut f32,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyr2k_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f64,\n        A: *const *const f64,\n        lda: rocblas_int,\n        B: *const *const f64,\n        ldb: rocblas_int,\n        beta: *const f64,\n        C: *const *mut f64,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyr2k_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: rocblas_int,\n        B: *const *const rocblas_float_complex,\n        ldb: rocblas_int,\n        beta: *const rocblas_float_complex,\n        C: *const *mut rocblas_float_complex,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyr2k_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: rocblas_int,\n        B: *const *const rocblas_double_complex,\n        ldb: rocblas_int,\n        beta: *const rocblas_double_complex,\n        C: *const *mut rocblas_double_complex,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ssyr2k_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const *const f32,\n        lda: i64,\n        B: *const *const f32,\n        ldb: i64,\n        beta: *const f32,\n        C: *const *mut f32,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyr2k_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        A: *const *const f64,\n        lda: i64,\n        B: *const *const f64,\n        ldb: i64,\n        beta: *const f64,\n        C: *const *mut f64,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyr2k_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: i64,\n        B: *const *const rocblas_float_complex,\n        ldb: i64,\n        beta: *const rocblas_float_complex,\n        C: *const *mut rocblas_float_complex,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyr2k_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: i64,\n        B: *const *const rocblas_double_complex,\n        ldb: i64,\n        beta: *const rocblas_double_complex,\n        C: *const *mut rocblas_double_complex,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\nsyr2k_strided_batched performs a batch of the matrix-matrix operations for a symmetric rank-2k update:\n\nC_i := alpha*(op( A_i )*op( B_i )^T + op( B_i )*op( A_i )^T) + beta*C_i,\n\nwhere  alpha and beta are scalars, op(A_i) and op(B_i) are n by k matrix, and\nC_i is a symmetric n x n matrix stored as either upper or lower.\n\nop( A_i ) = A_i, op( B_i ) = B_i, and A_i and B_i are n by k if trans == rocblas_operation_none\nop( A_i ) = A_i^T, op( B_i ) = B_i^T, and A_i and B_i are k by n if trans == rocblas_operation_transpose\nor for ssyr2k_strided_batched and dsyr2k_strided_batched when trans == rocblas_operation_conjugate_transpose\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  C_i is an upper triangular matrix\n- rocblas_fill_lower:  C_i is a  lower triangular matrix\n\n@param[in]\ntrans  [rocblas_operation]\n- rocblas_operation_transpose:           op( A_i ) = A_i^T, op( B_i ) = B_i^T\n- rocblas_operation_none:                op( A_i ) = A_i, op( B_i ) = B_i\n- rocblas_operation_conjugate_transpose: op( A_i ) = A_i^T, op( B_i ) = B_i^T\n\nrocblas_operation_conjugate_transpose is not supported for complex types in csyr2k_strided_batched and zsyr2k_strided_batched.\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of rows and columns of C_i. n >= 0.\n\n@param[in]\nk       [rocblas_int]\nk specifies the number of columns of op(A). k >= 0.\n\n@param[in]\nalpha\nalpha specifies the scalar alpha. When alpha is\nzero then A is not referenced and A need not be set before\nentry.\n\n@param[in]\nA       Device pointer to the first matrix A_1 on the GPU of dimension (lda, k)\nwhen trans is rocblas_operation_none, otherwise of dimension (lda, n).\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A_i.\n\nif trans = rocblas_operation_none,  lda >= max( 1, n ),\notherwise lda >= max( 1, k ).\n\n@param[in]\nstride_A  [rocblas_stride]\nstride from the start of one matrix (A_i) and the next one (A_i+1)\n\n@param[in]\nB       Device pointer to the first matrix B_1 on the GPU of dimension (ldb, k)\nwhen trans is rocblas_operation_none, otherwise of dimension (ldb, n)\n\n@param[in]\nldb     [rocblas_int]\nldb specifies the first dimension of B_i.\n\nif trans = rocblas_operation_none,  ldb >= max( 1, n ),\notherwise ldb >= max( 1, k ).\n\n@param[in]\nstride_B  [rocblas_stride]\nstride from the start of one matrix (B_i) and the next one (B_i+1)\n\n@param[in]\nbeta\nbeta specifies the scalar beta. When beta is\nzero then C need not be set before entry.\n\n@param[in]\nC       Device pointer to the first matrix C_1 on the GPU.\n\n@param[in]\nldc    [rocblas_int]\nldc specifies the first dimension of C. ldc >= max( 1, n ).\n\n@param[in, out]\nstride_C  [rocblas_stride]\nstride from the start of one matrix (C_i) and the next one (C_i+1).\n\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_ssyr2k_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        B: *const f32,\n        ldb: rocblas_int,\n        stride_B: rocblas_stride,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyr2k_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        B: *const f64,\n        ldb: rocblas_int,\n        stride_B: rocblas_stride,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyr2k_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        B: *const rocblas_float_complex,\n        ldb: rocblas_int,\n        stride_B: rocblas_stride,\n        beta: *const rocblas_float_complex,\n        C: *mut rocblas_float_complex,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyr2k_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        B: *const rocblas_double_complex,\n        ldb: rocblas_int,\n        stride_B: rocblas_stride,\n        beta: *const rocblas_double_complex,\n        C: *mut rocblas_double_complex,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ssyr2k_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        stride_A: rocblas_stride,\n        B: *const f32,\n        ldb: i64,\n        stride_B: rocblas_stride,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyr2k_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        stride_A: rocblas_stride,\n        B: *const f64,\n        ldb: i64,\n        stride_B: rocblas_stride,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyr2k_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        B: *const rocblas_float_complex,\n        ldb: i64,\n        stride_B: rocblas_stride,\n        beta: *const rocblas_float_complex,\n        C: *mut rocblas_float_complex,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyr2k_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        B: *const rocblas_double_complex,\n        ldb: i64,\n        stride_B: rocblas_stride,\n        beta: *const rocblas_double_complex,\n        C: *mut rocblas_double_complex,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\nsyrkx performs one of the matrix-matrix operations for a symmetric rank-k update:\n\nC := alpha*op( A )*op( B )^T + beta*C,\n\nwhere  alpha and beta are scalars, op(A) and op(B) are n by k matrix, and\nC is a symmetric n x n matrix stored as either upper or lower.\n\nThis routine should only be used when the caller can guarantee that the result of op( A )*op( B )^T will be symmetric.\n\nop( A ) = A, op( B ) = B, and A and B are n by k if trans == rocblas_operation_none\nop( A ) = A^T, op( B ) = B^T,  and A and B are k by n if trans == rocblas_operation_transpose\nor for ssyrkx and dsyrkx when trans == rocblas_operation_conjugate_transpose\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  C is an upper triangular matrix\n- rocblas_fill_lower:  C is a  lower triangular matrix\n\n@param[in]\ntrans  [rocblas_operation]\n- rocblas_operation_transpose:           op( A ) = A^T, op( B ) = B^T\n- rocblas_operation_none:                op( A ) = A, op( B ) = B\n- rocblas_operation_conjugate_transpose: op( A ) = A^T, op( B ) = B^T\n\nrocblas_operation_conjugate_transpose is not supported for complex types in csyrkx and zsyrkx.\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of rows and columns of C. n >= 0.\n\n@param[in]\nk       [rocblas_int]\nk specifies the number of columns of op(A) and op(B). k >= 0.\n\n@param[in]\nalpha\nalpha specifies the scalar alpha. When alpha is\nzero then A is not referenced and A need not be set before\nentry.\n\n@param[in]\nA       pointer storing matrix A on the GPU.\nMatrix dimension is ( lda, k ) when if trans = rocblas_operation_none, otherwise (lda, n)\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A.\n\nif trans = rocblas_operation_none,  lda >= max( 1, n ),\notherwise lda >= max( 1, k ).\n\n@param[in]\nB       pointer storing matrix B on the GPU.\nMatrix dimension is ( ldb, k ) when if trans = rocblas_operation_none, otherwise (ldb, n)\n\n@param[in]\nldb     [rocblas_int]\nldb specifies the first dimension of B.\n\nif trans = rocblas_operation_none,  ldb >= max( 1, n ),\notherwise ldb >= max( 1, k ).\n\n@param[in]\nbeta\nbeta specifies the scalar beta. When beta is\nzero then C need not be set before entry.\n\n@param[in]\nC       pointer storing matrix C on the GPU.\nonly the upper/lower triangular part is accessed.\n\n@param[in]\nldc    [rocblas_int]\nldc specifies the first dimension of C. ldc >= max( 1, n ).\n*/\n    pub fn rocblas_ssyrkx(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocblas_int,\n        B: *const f32,\n        ldb: rocblas_int,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyrkx(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocblas_int,\n        B: *const f64,\n        ldb: rocblas_int,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyrkx(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        B: *const rocblas_float_complex,\n        ldb: rocblas_int,\n        beta: *const rocblas_float_complex,\n        C: *mut rocblas_float_complex,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyrkx(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        B: *const rocblas_double_complex,\n        ldb: rocblas_int,\n        beta: *const rocblas_double_complex,\n        C: *mut rocblas_double_complex,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ssyrkx_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        B: *const f32,\n        ldb: i64,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyrkx_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        B: *const f64,\n        ldb: i64,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyrkx_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        B: *const rocblas_float_complex,\n        ldb: i64,\n        beta: *const rocblas_float_complex,\n        C: *mut rocblas_float_complex,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyrkx_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        B: *const rocblas_double_complex,\n        ldb: i64,\n        beta: *const rocblas_double_complex,\n        C: *mut rocblas_double_complex,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\nsyrkx_batched performs a batch of the matrix-matrix operations for a symmetric rank-k update:\n\nC_i := alpha*op( A_i )*op( B_i )^T + beta*C_i,\n\nwhere  alpha and beta are scalars, op(A_i) and op(B_i) are n by k matrix, and\nC_i is a symmetric n x n matrix stored as either upper or lower.\n\nThis routine should only be used when the caller can guarantee that the result of op( A_i )*op( B_i )^T will be symmetric.\n\nop( A_i ) = A_i, op( B_i ) = B_i, and A_i and B_i are n by k if trans == rocblas_operation_none\nop( A_i ) = A_i^T, op( B_i ) = B_i^T,  and A_i and B_i are k by n if trans == rocblas_operation_transpose\nor for ssyrkx_batched and dsyrkx_batched when trans == rocblas_operation_conjugate_transpose\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  C_i is an upper triangular matrix\n- rocblas_fill_lower:  C_i is a  lower triangular matrix\n\n@param[in]\ntrans  [rocblas_operation]\n- rocblas_operation_transpose:           op( A_i ) = A_i^T, op( B_i ) = B_i^T\n- rocblas_operation_none:                op( A_i ) = A_i, op( B_i ) = B_i\n- rocblas_operation_conjugate_transpose: op( A_i ) = A_i^T, op( B_i ) = B_i^T\n\nrocblas_operation_conjugate_transpose is not supported for complex types in csyrkx_batched and zsyrkx_batched.\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of rows and columns of C_i. n >= 0.\n\n@param[in]\nk       [rocblas_int]\nk specifies the number of columns of op(A). k >= 0.\n\n@param[in]\nalpha\nalpha specifies the scalar alpha. When alpha is\nzero then A is not referenced and A need not be set before\nentry.\n\n@param[in]\nA       device array of device pointers storing each matrix_i A of dimension (lda, k)\nwhen trans is rocblas_operation_none, otherwise of dimension (lda, n)\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A_i.\n\nif trans = rocblas_operation_none,  lda >= max( 1, n ),\notherwise lda >= max( 1, k ).\n\n@param[in]\nB       device array of device pointers storing each matrix_i B of dimension (ldb, k)\nwhen trans is rocblas_operation_none, otherwise of dimension (ldb, n)\n\n@param[in]\nldb     [rocblas_int]\nldb specifies the first dimension of B.\n\nif trans = rocblas_operation_none,  ldb >= max( 1, n ),\notherwise ldb >= max( 1, k ).\n\n@param[in]\nbeta\nbeta specifies the scalar beta. When beta is\nzero then C need not be set before entry.\n\n@param[in]\nC       device array of device pointers storing each matrix C_i on the GPU.\nonly the upper/lower triangular part of each C_i is accessed.\n\n@param[in]\nldc    [rocblas_int]\nldc specifies the first dimension of C. ldc >= max( 1, n ).\n\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_ssyrkx_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f32,\n        A: *const *const f32,\n        lda: rocblas_int,\n        B: *const *const f32,\n        ldb: rocblas_int,\n        beta: *const f32,\n        C: *const *mut f32,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyrkx_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f64,\n        A: *const *const f64,\n        lda: rocblas_int,\n        B: *const *const f64,\n        ldb: rocblas_int,\n        beta: *const f64,\n        C: *const *mut f64,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyrkx_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: rocblas_int,\n        B: *const *const rocblas_float_complex,\n        ldb: rocblas_int,\n        beta: *const rocblas_float_complex,\n        C: *const *mut rocblas_float_complex,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyrkx_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: rocblas_int,\n        B: *const *const rocblas_double_complex,\n        ldb: rocblas_int,\n        beta: *const rocblas_double_complex,\n        C: *const *mut rocblas_double_complex,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ssyrkx_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const *const f32,\n        lda: i64,\n        B: *const *const f32,\n        ldb: i64,\n        beta: *const f32,\n        C: *const *mut f32,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyrkx_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        A: *const *const f64,\n        lda: i64,\n        B: *const *const f64,\n        ldb: i64,\n        beta: *const f64,\n        C: *const *mut f64,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyrkx_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: i64,\n        B: *const *const rocblas_float_complex,\n        ldb: i64,\n        beta: *const rocblas_float_complex,\n        C: *const *mut rocblas_float_complex,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyrkx_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: i64,\n        B: *const *const rocblas_double_complex,\n        ldb: i64,\n        beta: *const rocblas_double_complex,\n        C: *const *mut rocblas_double_complex,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\nsyrkx_strided_batched performs a batch of the matrix-matrix operations for a symmetric rank-k update:\n\nC_i := alpha*op( A_i )*op( B_i )^T + beta*C_i,\n\nwhere  alpha and beta are scalars, op(A_i) and op(B_i) are n by k matrix, and\nC_i is a symmetric n x n matrix stored as either upper or lower.\n\nThis routine should only be used when the caller can guarantee that the result of op( A_i )*op( B_i )^T will be symmetric.\n\nop( A_i ) = A_i, op( B_i ) = B_i, and A_i and B_i are n by k if trans == rocblas_operation_none\nop( A_i ) = A_i^T, op( B_i ) = B_i^T,  and A_i and B_i are k by n if trans == rocblas_operation_transpose\nor for ssyrkx_strided_batched and dsyrkx_strided_batched when trans == rocblas_operation_conjugate_transpose\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  C_i is an upper triangular matrix\n- rocblas_fill_lower:  C_i is a  lower triangular matrix\n\n@param[in]\ntrans  [rocblas_operation]\n- rocblas_operation_transpose:           op( A_i ) = A_i^T, op( B_i ) = B_i^T\n- rocblas_operation_none:                op( A_i ) = A_i, op( B_i ) = B_i\n- rocblas_operation_conjugate_transpose: op( A_i ) = A_i^T, op( B_i ) = B_i^T\n\nrocblas_operation_conjugate_transpose is not supported for complex types in csyrkx_strided_batched and zsyrkx_strided_batched.\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of rows and columns of C_i. n >= 0.\n\n@param[in]\nk       [rocblas_int]\nk specifies the number of columns of op(A). k >= 0.\n\n@param[in]\nalpha\nalpha specifies the scalar alpha. When alpha is\nzero then A is not referenced and A need not be set before\nentry.\n\n@param[in]\nA       Device pointer to the first matrix A_1 on the GPU of dimension (lda, k)\nwhen trans is rocblas_operation_none, otherwise of dimension (lda, n)\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A_i.\n\nif trans = rocblas_operation_none,  lda >= max( 1, n ),\notherwise lda >= max( 1, k ).\n\n@param[in]\nstride_A  [rocblas_stride]\nstride from the start of one matrix (A_i) and the next one (A_i+1).\n\n@param[in]\nB       Device pointer to the first matrix B_1 on the GPU of dimension (ldb, k)\nwhen trans is rocblas_operation_none, otherwise of dimension (ldb, n).\n\n@param[in]\nldb     [rocblas_int]\nldb specifies the first dimension of B_i.\n\nif trans = rocblas_operation_none,  ldb >= max( 1, n ),\notherwise ldb >= max( 1, k ).\n\n@param[in]\nstride_B  [rocblas_stride]\nstride from the start of one matrix (B_i) and the next one (B_i+1).\n\n@param[in]\nbeta\nbeta specifies the scalar beta. When beta is\nzero then C need not be set before entry.\n\n@param[in]\nC       Device pointer to the first matrix C_1 on the GPU.\nonly the upper/lower triangular part of each C_i is accessed.\n\n@param[in]\nldc    [rocblas_int]\nldc specifies the first dimension of C. ldc >= max( 1, n ).\n\n@param[in, out]\nstride_C  [rocblas_stride]\nstride from the start of one matrix (C_i) and the next one (C_i+1).\n\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_ssyrkx_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        B: *const f32,\n        ldb: rocblas_int,\n        stride_B: rocblas_stride,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyrkx_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        B: *const f64,\n        ldb: rocblas_int,\n        stride_B: rocblas_stride,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyrkx_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        B: *const rocblas_float_complex,\n        ldb: rocblas_int,\n        stride_B: rocblas_stride,\n        beta: *const rocblas_float_complex,\n        C: *mut rocblas_float_complex,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyrkx_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        B: *const rocblas_double_complex,\n        ldb: rocblas_int,\n        stride_B: rocblas_stride,\n        beta: *const rocblas_double_complex,\n        C: *mut rocblas_double_complex,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ssyrkx_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        stride_A: rocblas_stride,\n        B: *const f32,\n        ldb: i64,\n        stride_B: rocblas_stride,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dsyrkx_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        stride_A: rocblas_stride,\n        B: *const f64,\n        ldb: i64,\n        stride_B: rocblas_stride,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_csyrkx_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        B: *const rocblas_float_complex,\n        ldb: i64,\n        stride_B: rocblas_stride,\n        beta: *const rocblas_float_complex,\n        C: *mut rocblas_float_complex,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zsyrkx_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        trans: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        B: *const rocblas_double_complex,\n        ldb: i64,\n        stride_B: rocblas_stride,\n        beta: *const rocblas_double_complex,\n        C: *mut rocblas_double_complex,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\ntrmm performs one of the matrix-matrix operations:\n\nC := alpha*op( A )*B,   or\nC := alpha*B*op( A ),\n\nThe Legacy BLAS in-place trmm functionality,\n\nB := alpha*op( A )*B,   or\nB := alpha*B*op( A ),\n\nis available by setting pointer C equal to pointer B, and ldc equal to ldb.\n\nalpha  is a scalar,  B  is an m by n matrix, C  is an m by n matrix,  A  is a unit, or\nnon-unit,  upper or lower triangular matrix  and  op( A )  is one  of\n\nop( A ) = A     or\nop( A ) = A^T   or\nop( A ) = A^H.\n\nWhen uplo == rocblas_fill_upper the  leading  k by k\nupper triangular part of the array  A must contain the upper\ntriangular matrix and the strictly lower triangular part of\nA is not referenced. Here k is m when side == rocblas_side_left\nand is n when side == rocblas_side_right.\n\nWhen uplo == rocblas_fill_lower the  leading  k by k\nlower triangular part of the array  A must contain the lower\ntriangular matrix  and the strictly upper triangular part of\nA is not referenced. Here k is m when  side == rocblas_side_left\nand is n when side == rocblas_side_right.\n\nNote that when  diag == rocblas_diagonal_unit  the diagonal elements of\nA  are not referenced either,  but are assumed to be  unity.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nside    [rocblas_side]\nSpecifies whether op(A) multiplies B from the left or right as follows:\n- rocblas_side_left:       C := alpha*op( A )*B\n- rocblas_side_right:      C := alpha*B*op( A )\n\n@param[in]\nuplo    [rocblas_fill]\nSpecifies whether the matrix A is an upper or lower triangular matrix as follows:\n- rocblas_fill_upper:  A is an upper triangular matrix.\n- rocblas_fill_lower:  A is a  lower triangular matrix.\n\n@param[in]\ntransA  [rocblas_operation]\nSpecifies the form of op(A) to be used in the matrix multiplication as follows:\n- rocblas_operation_none:    op(A) = A\n- rocblas_operation_transpose:      op(A) = A^T\n- rocblas_operation_conjugate_transpose:  op(A) = A^H\n\n@param[in]\ndiag    [rocblas_diagonal]\nSpecifies whether or not A is unit triangular as follows:\n- rocblas_diagonal_unit:      A is assumed to be unit triangular.\n- rocblas_diagonal_non_unit:  A is not assumed to be unit triangular.\n\n@param[in]\nm       [rocblas_int]\nm specifies the number of rows of B. m >= 0.\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of columns of B. n >= 0.\n\n@param[in]\nalpha\nalpha specifies the scalar alpha. When alpha is\nzero then A is not referenced and B need not be set before\nentry.\n\n@param[in]\nA       Device pointer to matrix A on the GPU.\nA has dimension ( lda, k ), where k is m\nwhen  side == rocblas_side_left  and\nis  n  when  side == rocblas_side_right.\n\nWhen uplo == rocblas_fill_upper the  leading  k by k\nupper triangular part of the array  A must contain the upper\ntriangular matrix  and the strictly lower triangular part of\nA is not referenced.\n\nWhen uplo == rocblas_fill_lower the  leading  k by k\nlower triangular part of the array  A must contain the lower\ntriangular matrix  and the strictly upper triangular part of\nA is not referenced.\n\nNote that when  diag == rocblas_diagonal_unit  the diagonal elements of\nA  are not referenced either,  but are assumed to be  unity.\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A.\n\nif side == rocblas_side_left,  lda >= max( 1, m ),\nif side == rocblas_side_right, lda >= max( 1, n ).\n\n@param[in]\nB       Device pointer to the matrix B on the GPU.\n\n@param[in]\nldb    [rocblas_int]\nldb specifies the first dimension of B. ldb >= max( 1, m ).\n\n@param[out]\nC      Device pointer to the matrix C on the GPU.\n\n@param[in]\nldc   [rocblas_int]\nldc specifies the first dimension of C. ldc >= max( 1, m).\nIf B and C are pointers to the same matrix then ldc must equal ldb or\nrocblas_status_invalid_value will be returned.\n*/\n    pub fn rocblas_strmm(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocblas_int,\n        B: *const f32,\n        ldb: rocblas_int,\n        C: *mut f32,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtrmm(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocblas_int,\n        B: *const f64,\n        ldb: rocblas_int,\n        C: *mut f64,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctrmm(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        B: *const rocblas_float_complex,\n        ldb: rocblas_int,\n        C: *mut rocblas_float_complex,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztrmm(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        B: *const rocblas_double_complex,\n        ldb: rocblas_int,\n        C: *mut rocblas_double_complex,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_strmm_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        B: *const f32,\n        ldb: i64,\n        C: *mut f32,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtrmm_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: i64,\n        n: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        B: *const f64,\n        ldb: i64,\n        C: *mut f64,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctrmm_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        B: *const rocblas_float_complex,\n        ldb: i64,\n        C: *mut rocblas_float_complex,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztrmm_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        B: *const rocblas_double_complex,\n        ldb: i64,\n        C: *mut rocblas_double_complex,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\ntrmm_batched performs one of the matrix-matrix operations:\n\nC_i := alpha*op( A_i )*B_i,   or\nC_i := alpha*B_i*op( A_i )  for i = 0, 1, ... batch_count -1,\n\nThe Legacy BLAS in-place trmm_batched functionality,\n\nB_i := alpha*op( A_i )*B_i,   or\nB_i := alpha*B_i*op( A_i )  for i = 0, 1, ... batch_count -1,\n\nis available by setting pointer C equal to pointer B and ldc equal to ldb.\n\nalpha  is a scalar,  B_i  is an m by n matrix, C_i  is an m by n matrix,  A_i  is a unit, or\nnon-unit,  upper or lower triangular matrix  and  op( A_i )  is one  of\n\nop( A_i ) = A_i     or\nop( A_i ) = A_i^T   or\nop( A_i ) = A_i^H.\n\nWhen uplo == rocblas_fill_upper the  leading  k by k\nupper triangular part of the array  A must contain the upper\ntriangular matrix and the strictly lower triangular part of\nA is not referenced. Here k is m when side == rocblas_side_left\nand is n when side == rocblas_side_right.\n\nWhen uplo == rocblas_fill_lower the  leading  k by k\nlower triangular part of the array  A must contain the lower\ntriangular matrix  and the strictly upper triangular part of\nA is not referenced. Here k is m when  side == rocblas_side_left\nand is n when side == rocblas_side_right.\n\nNote that when  diag == rocblas_diagonal_unit  the diagonal elements of\nA  are not referenced either,  but are assumed to be  unity.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nside    [rocblas_side]\nSpecifies whether op(A_i) multiplies B_i from the left or right as follows:\n- rocblas_side_left:       C_i := alpha*op( A_i )*B_i\n- rocblas_side_right:      C_i := alpha*B_i*op( A_i )\n\n@param[in]\nuplo    [rocblas_fill]\nSpecifies whether the matrix A is an upper or lower triangular matrix as follows:\n- rocblas_fill_upper:  A is an upper triangular matrix.\n- rocblas_fill_lower:  A is a  lower triangular matrix.\n\n@param[in]\ntransA  [rocblas_operation]\nSpecifies the form of op(A_i) to be used in the matrix multiplication as follows:\n- rocblas_operation_none:    op(A_i) = A_i\n- rocblas_operation_transpose:      op(A_i) = A_i^T\n- rocblas_operation_conjugate_transpose:  op(A_i) = A_i^H\n\n@param[in]\ndiag    [rocblas_diagonal]\nSpecifies whether or not A_i is unit triangular as follows:\n- rocblas_diagonal_unit:      A_i is assumed to be unit triangular.\n- rocblas_diagonal_non_unit:  A_i is not assumed to be unit triangular.\n\n@param[in]\nm       [rocblas_int]\nm specifies the number of rows of B_i. m >= 0.\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of columns of B_i. n >= 0.\n\n@param[in]\nalpha\nalpha specifies the scalar alpha. When alpha is\nzero then A_i is not referenced and B_i need not be set before\nentry.\n\n@param[in]\nA       Device array of device pointers storing each matrix A_i on the GPU.\nEach A_i is of dimension ( lda, k ), where k is m\nwhen  side == rocblas_side_left  and\nis  n  when  side == rocblas_side_right.\n\nWhen uplo == rocblas_fill_upper the  leading  k by k\nupper triangular part of the array  A must contain the upper\ntriangular matrix  and the strictly lower triangular part of\nA is not referenced.\n\nWhen uplo == rocblas_fill_lower the  leading  k by k\nlower triangular part of the array  A must contain the lower\ntriangular matrix  and the strictly upper triangular part of\nA is not referenced.\n\nNote that when  diag == rocblas_diagonal_unit  the diagonal elements of\nA_i  are not referenced either,  but are assumed to be  unity.\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A.\n\nif side == rocblas_side_left,  lda >= max( 1, m ),\nif side == rocblas_side_right, lda >= max( 1, n ).\n\n@param[in]\nB       device array of device pointers storing each matrix B_i on the GPU.\n\n@param[in]\nldb    [rocblas_int]\nldb specifies the first dimension of B_i. ldb >= max( 1, m ).\n\n@param[out]\nC      device array of device pointers storing each matrix C_i on the GPU.\n\n@param[in]\nldc   [rocblas_int]\nldc specifies the first dimension of C. ldc >= max( 1, m).\nIf B and C are pointers to the same array of pointers then ldc must\nequal ldb or rocblas_status_invalid_value will be returned.\n\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances i in the batch.*/\n    pub fn rocblas_strmm_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const *const f32,\n        lda: rocblas_int,\n        B: *const *const f32,\n        ldb: rocblas_int,\n        C: *const *mut f32,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtrmm_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f64,\n        A: *const *const f64,\n        lda: rocblas_int,\n        B: *const *const f64,\n        ldb: rocblas_int,\n        C: *const *mut f64,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctrmm_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: rocblas_int,\n        B: *const *const rocblas_float_complex,\n        ldb: rocblas_int,\n        C: *const *mut rocblas_float_complex,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztrmm_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: rocblas_int,\n        B: *const *const rocblas_double_complex,\n        ldb: rocblas_int,\n        C: *const *mut rocblas_double_complex,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_strmm_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const *const f32,\n        lda: i64,\n        B: *const *const f32,\n        ldb: i64,\n        C: *const *mut f32,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtrmm_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: i64,\n        n: i64,\n        alpha: *const f64,\n        A: *const *const f64,\n        lda: i64,\n        B: *const *const f64,\n        ldb: i64,\n        C: *const *mut f64,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctrmm_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: i64,\n        B: *const *const rocblas_float_complex,\n        ldb: i64,\n        C: *const *mut rocblas_float_complex,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztrmm_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: i64,\n        B: *const *const rocblas_double_complex,\n        ldb: i64,\n        C: *const *mut rocblas_double_complex,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\ntrmm_strided_batched performs one of the matrix-matrix operations:\n\nC_i := alpha*op( A_i )*B_i,   or\nC_i := alpha*B_i*op( A_i )  for i = 0, 1, ... batch_count -1,\n\nThe Legacy BLAS in-place trmm_strided_batched functionality,\n\nB_i := alpha*op( A_i )*B_i,   or\nB_i := alpha*B_i*op( A_i )  for i = 0, 1, ... batch_count -1,\n\nis available by setting pointer C equal to pointer B, ldc equal to ldb, and stride_C equal to stride_B.\n\nalpha  is a scalar,  B_i  is an m by n matrix, C_i  is an m by n matrix,  A_i  is a unit, or\nnon-unit,  upper or lower triangular matrix  and  op( A_i )  is one  of\n\nop( A_i ) = A_i   or\nop( A_i ) = A_i^T   or\nop( A_i ) = A_i^H.\n\nWhen uplo == rocblas_fill_upper the  leading  k by k\nupper triangular part of the array  A must contain the upper\ntriangular matrix and the strictly lower triangular part of\nA is not referenced. Here k is m when side == rocblas_side_left\nand is n when side == rocblas_side_right.\n\nWhen uplo == rocblas_fill_lower the  leading  k by k\nlower triangular part of the array  A must contain the lower\ntriangular matrix  and the strictly upper triangular part of\nA is not referenced. Here k is m when  side == rocblas_side_left\nand is n when side == rocblas_side_right.\n\nNote that when  diag == rocblas_diagonal_unit  the diagonal elements of\nA  are not referenced either,  but are assumed to be  unity.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nside    [rocblas_side]\nSpecifies whether op(A_i) multiplies B_i from the left or right as follows:\n- rocblas_side_left:       C_i := alpha*op( A_i )*B_i\n- rocblas_side_right:      C_i := alpha*B_i*op( A_i )\n\n@param[in]\nuplo    [rocblas_fill]\nSpecifies whether the matrix A is an upper or lower triangular matrix as follows:\n- rocblas_fill_upper:  A is an upper triangular matrix.\n- rocblas_fill_lower:  A is a  lower triangular matrix.\n\n@param[in]\ntransA  [rocblas_operation]\nSpecifies the form of op(A_i) to be used in the matrix multiplication as follows:\n- rocblas_operation_none:    op(A_i) = A_i\n- rocblas_operation_transpose:      op(A_i) = A_i^T\n- rocblas_operation_conjugate_transpose:  op(A_i) = A_i^H\n\n@param[in]\ndiag    [rocblas_diagonal]\nSpecifies whether or not A_i is unit triangular as follows:\n- rocblas_diagonal_unit:      A_i is assumed to be unit triangular.\n- rocblas_diagonal_non_unit:  A_i is not assumed to be unit triangular.\n\n@param[in]\nm       [rocblas_int]\nm specifies the number of rows of B_i. m >= 0.\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of columns of B_i. n >= 0.\n\n@param[in]\nalpha\nalpha specifies the scalar alpha. When alpha is\nzero then A_i is not referenced and B_i need not be set before\nentry.\n\n@param[in]\nA       Device pointer to the first matrix A_0 on the GPU.\nEach A_i is of dimension ( lda, k ), where k is m\nwhen  side == rocblas_side_left  and\nis  n  when  side == rocblas_side_right.\n\nWhen uplo == rocblas_fill_upper the  leading  k by k\nupper triangular part of the array  A must contain the upper\ntriangular matrix  and the strictly lower triangular part of\nA is not referenced.\n\nWhen uplo == rocblas_fill_lower the  leading  k by k\nlower triangular part of the array  A must contain the lower\ntriangular matrix  and the strictly upper triangular part of\nA is not referenced.\n\nNote that when  diag == rocblas_diagonal_unit  the diagonal elements of\nA_i  are not referenced either,  but are assumed to be  unity.\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A.\n\nif side == rocblas_side_left,  lda >= max( 1, m ),\nif side == rocblas_side_right, lda >= max( 1, n ).\n\n@param[in]\nstride_A  [rocblas_stride]\nstride from the start of one matrix (A_i) and the next one (A_i+1).\n\n@param[in]\nB       Device pointer to the first matrix B_0 on the GPU.\n\n@param[in]\nldb    [rocblas_int]\nldb specifies the first dimension of B_i. ldb >= max( 1, m ).\n\n@param[in]\nstride_B  [rocblas_stride]\nstride from the start of one matrix (B_i) and the next one (B_i+1).\n\n@param[out]\nC      Device pointer to the first matrix C_0 on the GPU.\n\n@param[in]\nldc   [rocblas_int]\nldc specifies the first dimension of C_i. ldc >= max( 1, m).\nIf B and C pointers are to the same matrix then ldc must equal ldb or\nrocblas_status_invalid_size will be returned.\n\n@param[in]\nstride_C  [rocblas_stride]\nstride from the start of one matrix (C_i) and the next one (C_i+1).\nIf B == C and ldb == ldc then stride_C should equal stride_B or\nbehavior is undefined.\n\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances i in the batch.*/\n    pub fn rocblas_strmm_strided_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        B: *const f32,\n        ldb: rocblas_int,\n        stride_B: rocblas_stride,\n        C: *mut f32,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtrmm_strided_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        B: *const f64,\n        ldb: rocblas_int,\n        stride_B: rocblas_stride,\n        C: *mut f64,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctrmm_strided_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        B: *const rocblas_float_complex,\n        ldb: rocblas_int,\n        stride_B: rocblas_stride,\n        C: *mut rocblas_float_complex,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztrmm_strided_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        B: *const rocblas_double_complex,\n        ldb: rocblas_int,\n        stride_B: rocblas_stride,\n        C: *mut rocblas_double_complex,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_strmm_strided_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        stride_A: rocblas_stride,\n        B: *const f32,\n        ldb: i64,\n        stride_B: rocblas_stride,\n        C: *mut f32,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtrmm_strided_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: i64,\n        n: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        stride_A: rocblas_stride,\n        B: *const f64,\n        ldb: i64,\n        stride_B: rocblas_stride,\n        C: *mut f64,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctrmm_strided_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        B: *const rocblas_float_complex,\n        ldb: i64,\n        stride_B: rocblas_stride,\n        C: *mut rocblas_float_complex,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztrmm_strided_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        B: *const rocblas_double_complex,\n        ldb: i64,\n        stride_B: rocblas_stride,\n        C: *mut rocblas_double_complex,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\ntrtri  compute the inverse of a matrix A, namely, invA\nand write the result into invA;\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n\nif rocblas_fill_upper, the lower part of A is not referenced\nif rocblas_fill_lower, the upper part of A is not referenced\n@param[in]\ndiag      [rocblas_diagonal]\n- 'rocblas_diagonal_non_unit', A is non-unit triangular;\n- 'rocblas_diagonal_unit', A is unit triangular;\n@param[in]\nn         [rocblas_int]\nsize of matrix A and invA.\n@param[in]\nA         device pointer storing matrix A.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A.\n@param[out]\ninvA      device pointer storing matrix invA.\nPartial inplace operation is supported. See below:\n-If UPLO = 'U', the leading N-by-N upper triangular part of the invA will store\nthe inverse of the upper triangular matrix, and the strictly lower\ntriangular part of invA may be cleared.\n- If UPLO = 'L', the leading N-by-N lower triangular part of the invA will store\nthe inverse of the lower triangular matrix, and the strictly upper\ntriangular part of invA may be cleared.\n@param[in]\nldinvA    [rocblas_int]\nspecifies the leading dimension of invA.*/\n    pub fn rocblas_strtri(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const f32,\n        lda: rocblas_int,\n        invA: *mut f32,\n        ldinvA: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtrtri(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const f64,\n        lda: rocblas_int,\n        invA: *mut f64,\n        ldinvA: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctrtri(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        invA: *mut rocblas_float_complex,\n        ldinvA: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztrtri(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        invA: *mut rocblas_double_complex,\n        ldinvA: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\ntrtri_batched  compute the inverse of A_i and write into invA_i where\nA_i and invA_i are the i-th matrices in the batch,\nfor i = 1, ..., batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n@param[in]\ndiag      [rocblas_diagonal]\n- 'rocblas_diagonal_non_unit', A is non-unit triangular;\n- 'rocblas_diagonal_unit', A is unit triangular;\n@param[in]\nn         [rocblas_int]\n@param[in]\nA         device array of device pointers storing each matrix A_i.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each A_i.\n@param[out]\ninvA      device array of device pointers storing the inverse of each matrix A_i.\nPartial inplace operation is supported. See below:\n-If UPLO = 'U', the leading N-by-N upper triangular part of the invA will store\nthe inverse of the upper triangular matrix, and the strictly lower\ntriangular part of invA may be cleared.\n- If UPLO = 'L', the leading N-by-N lower triangular part of the invA will store\nthe inverse of the lower triangular matrix, and the strictly upper\ntriangular part of invA may be cleared.\n@param[in]\nldinvA    [rocblas_int]\nspecifies the leading dimension of each invA_i.\n@param[in]\nbatch_count [rocblas_int]\nnumbers of matrices in the batch.*/\n    pub fn rocblas_strtri_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const *const f32,\n        lda: rocblas_int,\n        invA: *const *mut f32,\n        ldinvA: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtrtri_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const *const f64,\n        lda: rocblas_int,\n        invA: *const *mut f64,\n        ldinvA: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctrtri_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const *const rocblas_float_complex,\n        lda: rocblas_int,\n        invA: *const *mut rocblas_float_complex,\n        ldinvA: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztrtri_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const *const rocblas_double_complex,\n        lda: rocblas_int,\n        invA: *const *mut rocblas_double_complex,\n        ldinvA: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\ntrtri_strided_batched compute the inverse of A_i and write into invA_i where\nA_i and invA_i are the i-th matrices in the batch,\nfor i = 1, ..., batch_count.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo      [rocblas_fill]\nspecifies whether the upper 'rocblas_fill_upper' or lower 'rocblas_fill_lower'\n@param[in]\ndiag      [rocblas_diagonal]\n- 'rocblas_diagonal_non_unit', A is non-unit triangular;\n- 'rocblas_diagonal_unit', A is unit triangular;\n@param[in]\nn         [rocblas_int]\n@param[in]\nA         device pointer pointing to address of first matrix A_1.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each A.\n@param[in]\nstride_a  [rocblas_stride]\n\"batch stride a\": stride from the start of one A_i matrix to the next A_(i + 1).\n@param[out]\ninvA      device pointer storing the inverses of each matrix A_i.\nPartial inplace operation is supported. See below:\n\n- If UPLO = 'U', the leading N-by-N upper triangular part of the invA will store\nthe inverse of the upper triangular matrix, and the strictly lower\ntriangular part of invA may be cleared.\n\n- If UPLO = 'L', the leading N-by-N lower triangular part of the invA will store\nthe inverse of the lower triangular matrix, and the strictly upper\ntriangular part of invA may be cleared.\n@param[in]\nldinvA    [rocblas_int]\nspecifies the leading dimension of each invA_i.\n@param[in]\nstride_invA  [rocblas_stride]\n\"batch stride invA\": stride from the start of one invA_i matrix to the next invA_(i + 1).\n@param[in]\nbatch_count  [rocblas_int]\nnumbers of matrices in the batch.*/\n    pub fn rocblas_strtri_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const f32,\n        lda: rocblas_int,\n        stride_a: rocblas_stride,\n        invA: *mut f32,\n        ldinvA: rocblas_int,\n        stride_invA: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtrtri_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const f64,\n        lda: rocblas_int,\n        stride_a: rocblas_stride,\n        invA: *mut f64,\n        ldinvA: rocblas_int,\n        stride_invA: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctrtri_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        stride_a: rocblas_stride,\n        invA: *mut rocblas_float_complex,\n        ldinvA: rocblas_int,\n        stride_invA: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztrtri_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        diag: rocblas_diagonal,\n        n: rocblas_int,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        stride_a: rocblas_stride,\n        invA: *mut rocblas_double_complex,\n        ldinvA: rocblas_int,\n        stride_invA: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\ntrsm solves:\n\nop(A)*X = alpha*B or  X*op(A) = alpha*B,\n\nwhere alpha is a scalar, X and B are m by n matrices,\n\nA is triangular matrix and op(A) is one of\n\nop( A ) = A   or   op( A ) = A^T   or   op( A ) = A^H.\n\nThe matrix X is overwritten on B.\n\nNote about memory allocation:\nWhen trsm is launched with a k evenly divisible by the internal block size of 128,\nand is no larger than 10 of these blocks, the API takes advantage of utilizing pre-allocated\nmemory found in the handle to increase overall performance. This memory can be managed by using\nthe environment variable WORKBUF_TRSM_B_CHNK. When this variable is not set the device memory\nused for temporary storage will default to 1 MB and may result in chunking, which in turn may\nreduce performance. Under these circumstances it is recommended that WORKBUF_TRSM_B_CHNK be set\nto the desired chunk of right hand sides to be used at a time\n(where k is m when rocblas_side_left and is n when rocblas_side_right).\n\nAlthough not widespread, some gemm kernels used by trsm may use atomic operations.\nSee Atomic Operations in the API Reference Guide for more information.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nside    [rocblas_side]\n- rocblas_side_left:       op(A)*X = alpha*B\n- rocblas_side_right:      X*op(A) = alpha*B\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  A is an upper triangular matrix.\n- rocblas_fill_lower:  A is a  lower triangular matrix.\n\n@param[in]\ntransA  [rocblas_operation]\n- transB:    op(A) = A.\n- rocblas_operation_transpose:      op(A) = A^T\n- rocblas_operation_conjugate_transpose:  op(A) = A^H\n\n@param[in]\ndiag    [rocblas_diagonal]\n- rocblas_diagonal_unit:     A is assumed to be unit triangular.\n- rocblas_diagonal_non_unit:  A is not assumed to be unit triangular.\n\n@param[in]\nm       [rocblas_int]\nm specifies the number of rows of B. m >= 0.\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of columns of B. n >= 0.\n\n@param[in]\nalpha\ndevice pointer or host pointer specifying the scalar alpha. When alpha is\n&zero then A is not referenced and B need not be set before\nentry.\n\n@param[in]\nA       device pointer storing matrix A.\nof dimension ( lda, k ), where k is m\nwhen  rocblas_side_left  and\nis  n  when  rocblas_side_right\nonly the upper/lower triangular part is accessed.\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A.\n\nif side = rocblas_side_left,  lda >= max( 1, m ),\nif side = rocblas_side_right, lda >= max( 1, n ).\n\n@param[in,out]\nB       device pointer storing matrix B.\n\n@param[in]\nldb    [rocblas_int]\nldb specifies the first dimension of B. ldb >= max( 1, m ).\n*/\n    pub fn rocblas_strsm(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocblas_int,\n        B: *mut f32,\n        ldb: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtrsm(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocblas_int,\n        B: *mut f64,\n        ldb: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctrsm(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        B: *mut rocblas_float_complex,\n        ldb: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztrsm(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        B: *mut rocblas_double_complex,\n        ldb: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_strsm_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        B: *mut f32,\n        ldb: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtrsm_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: i64,\n        n: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        B: *mut f64,\n        ldb: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctrsm_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        B: *mut rocblas_float_complex,\n        ldb: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztrsm_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        B: *mut rocblas_double_complex,\n        ldb: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\ntrsm_batched performs the following batched operation:\n\nop(A_i)*X_i = alpha*B_i or\nX_i*op(A_i) = alpha*B_i, for i = 1, ..., batch_count,\n\nwhere alpha is a scalar, X and B are batched m by n matrices,\n\nA is triangular batched matrix and op(A) is one of\n\nop( A ) = A   or\nop( A ) = A^T   or\nop( A ) = A^H.\n\nEach matrix X_i is overwritten on B_i for i = 1, ..., batch_count.\n\nNote about memory allocation:\nWhen trsm is launched with a k evenly divisible by the internal block size of 128,\nand is no larger than 10 of these blocks, the API takes advantage of utilizing pre-allocated\nmemory found in the handle to increase overall performance. This memory can be managed by using\nthe environment variable WORKBUF_TRSM_B_CHNK. When this variable is not set the device memory\nused for temporary storage will default to 1 MB and may result in chunking, which in turn may\nreduce performance. Under these circumstances it is recommended that WORKBUF_TRSM_B_CHNK be set\nto the desired chunk of right hand sides to be used at a time\n(where k is m when rocblas_side_left and is n when rocblas_side_right).\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nside    [rocblas_side]\n- rocblas_side_left:       op(A)*X = alpha*B\n- rocblas_side_right:      X*op(A) = alpha*B\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  each A_i is an upper triangular matrix.\n- rocblas_fill_lower:  each A_i is a  lower triangular matrix.\n@param[in]\ntransA  [rocblas_operation]\n- transB:    op(A) = A\n- rocblas_operation_transpose:      op(A) = A^T\n- rocblas_operation_conjugate_transpose:  op(A) = A^H\n@param[in]\ndiag    [rocblas_diagonal]\n- rocblas_diagonal_unit:     each A_i is assumed to be unit triangular.\n- rocblas_diagonal_non_unit:  each A_i is not assumed to be unit triangular.\n@param[in]\nm       [rocblas_int]\nm specifies the number of rows of each B_i. m >= 0.\n@param[in]\nn       [rocblas_int]\nn specifies the number of columns of each B_i. n >= 0.\n@param[in]\nalpha\ndevice pointer or host pointer specifying the scalar alpha. When alpha is\n&zero then A is not referenced and B need not be set before\nentry.\n@param[in]\nA       device array of device pointers storing each matrix A_i on the GPU.\nMatricies are of dimension ( lda, k ), where k is m\nwhen  rocblas_side_left  and is  n  when  rocblas_side_right\nonly the upper/lower triangular part is accessed.\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of each A_i.\n\nif side = rocblas_side_left,  lda >= max( 1, m ),\nif side = rocblas_side_right, lda >= max( 1, n ).\n@param[in,out]\nB       device array of device pointers storing each matrix B_i on the GPU.\n@param[in]\nldb    [rocblas_int]\nldb specifies the first dimension of each B_i. ldb >= max( 1, m ).\n@param[in]\nbatch_count [rocblas_int]\nnumber of trsm operatons in the batch.*/\n    pub fn rocblas_strsm_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const *const f32,\n        lda: rocblas_int,\n        B: *const *mut f32,\n        ldb: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtrsm_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f64,\n        A: *const *const f64,\n        lda: rocblas_int,\n        B: *const *mut f64,\n        ldb: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctrsm_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: rocblas_int,\n        B: *const *mut rocblas_float_complex,\n        ldb: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztrsm_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: rocblas_int,\n        B: *const *mut rocblas_double_complex,\n        ldb: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_strsm_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const *const f32,\n        lda: i64,\n        B: *const *mut f32,\n        ldb: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtrsm_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: i64,\n        n: i64,\n        alpha: *const f64,\n        A: *const *const f64,\n        lda: i64,\n        B: *const *mut f64,\n        ldb: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctrsm_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: i64,\n        B: *const *mut rocblas_float_complex,\n        ldb: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztrsm_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: i64,\n        B: *const *mut rocblas_double_complex,\n        ldb: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\ntrsm_srided_batched performs the following strided batched operation:\n\nop(A_i)*X_i = alpha*B_i or\nX_i*op(A_i) = alpha*B_i, for i = 1, ..., batch_count,\n\nwhere alpha is a scalar, X and B are strided batched m by n matrices,\n\nA is triangular strided batched matrix and op(A) is one of\n\nop( A ) = A   or\nop( A ) = A^T   or\nop( A ) = A^H.\n\nEach matrix X_i is overwritten on B_i for i = 1, ..., batch_count.\n\nNote about memory allocation:\nWhen trsm is launched with a k evenly divisible by the internal block size of 128,\nand is no larger than 10 of these blocks, the API takes advantage of utilizing pre-allocated\nmemory found in the handle to increase overall performance. This memory can be managed by using\nthe environment variable WORKBUF_TRSM_B_CHNK. When this variable is not set the device memory\nused for temporary storage will default to 1 MB and may result in chunking, which in turn may\nreduce performance. Under these circumstances it is recommended that WORKBUF_TRSM_B_CHNK be set\nto the desired chunk of right hand sides to be used at a time\n(where k is m when rocblas_side_left and is n when rocblas_side_right).\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nside    [rocblas_side]\n- rocblas_side_left:       op(A)*X = alpha*B.\n- rocblas_side_right:      X*op(A) = alpha*B.\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  each A_i is an upper triangular matrix.\n- rocblas_fill_lower:  each A_i is a  lower triangular matrix.\n@param[in]\ntransA  [rocblas_operation]\n- transB:    op(A) = A.\n- rocblas_operation_transpose:      op(A) = A^T.\n- rocblas_operation_conjugate_transpose:  op(A) = A^H.\n@param[in]\ndiag    [rocblas_diagonal]\n- rocblas_diagonal_unit:     each A_i is assumed to be unit triangular.\n- rocblas_diagonal_non_unit:  each A_i is not assumed to be unit triangular.\n@param[in]\nm       [rocblas_int]\nm specifies the number of rows of each B_i. m >= 0.\n@param[in]\nn       [rocblas_int]\nn specifies the number of columns of each B_i. n >= 0.\n@param[in]\nalpha\ndevice pointer or host pointer specifying the scalar alpha. When alpha is\n&zero then A is not referenced and B need not be set before\nentry.\n@param[in]\nA       device pointer pointing to the first matrix A_1.\nof dimension ( lda, k ), where k is m\nwhen  rocblas_side_left  and\nis  n  when  rocblas_side_right\nonly the upper/lower triangular part is accessed.\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of each A_i.\n\nif side = rocblas_side_left,  lda >= max( 1, m ).\nif side = rocblas_side_right, lda >= max( 1, n ).\n@param[in]\nstride_a [rocblas_stride]\nstride from the start of one A_i matrix to the next A_(i + 1).\n@param[in,out]\nB       device pointer pointing to the first matrix B_1.\n@param[in]\nldb    [rocblas_int]\nldb specifies the first dimension of each B_i. ldb >= max( 1, m ).\n@param[in]\nstride_b [rocblas_stride]\nstride from the start of one B_i matrix to the next B_(i + 1).\n@param[in]\nbatch_count [rocblas_int]\nnumber of trsm operatons in the batch.*/\n    pub fn rocblas_strsm_strided_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocblas_int,\n        stride_a: rocblas_stride,\n        B: *mut f32,\n        ldb: rocblas_int,\n        stride_b: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtrsm_strided_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocblas_int,\n        stride_a: rocblas_stride,\n        B: *mut f64,\n        ldb: rocblas_int,\n        stride_b: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctrsm_strided_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        stride_a: rocblas_stride,\n        B: *mut rocblas_float_complex,\n        ldb: rocblas_int,\n        stride_b: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztrsm_strided_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        stride_a: rocblas_stride,\n        B: *mut rocblas_double_complex,\n        ldb: rocblas_int,\n        stride_b: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_strsm_strided_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        stride_a: rocblas_stride,\n        B: *mut f32,\n        ldb: i64,\n        stride_b: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dtrsm_strided_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: i64,\n        n: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        stride_a: rocblas_stride,\n        B: *mut f64,\n        ldb: i64,\n        stride_b: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ctrsm_strided_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        stride_a: rocblas_stride,\n        B: *mut rocblas_float_complex,\n        ldb: i64,\n        stride_b: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ztrsm_strided_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        stride_a: rocblas_stride,\n        B: *mut rocblas_double_complex,\n        ldb: i64,\n        stride_b: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\ngemm_kernel_name functions were never fully implemented and are deprecated for removal in a future release.\n\nReturns rocblas_status_not_implemented.*/\n    pub fn rocblas_hgemm_kernel_name(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_half,\n        A: *const rocblas_half,\n        lda: rocblas_int,\n        stride_a: rocblas_stride,\n        B: *const rocblas_half,\n        ldb: rocblas_int,\n        stride_b: rocblas_stride,\n        beta: *const rocblas_half,\n        C: *mut rocblas_half,\n        ldc: rocblas_int,\n        stride_c: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sgemm_kernel_name(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocblas_int,\n        stride_a: rocblas_stride,\n        B: *const f32,\n        ldb: rocblas_int,\n        stride_b: rocblas_stride,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: rocblas_int,\n        stride_c: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgemm_kernel_name(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocblas_int,\n        stride_a: rocblas_stride,\n        B: *const f64,\n        ldb: rocblas_int,\n        stride_b: rocblas_stride,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: rocblas_int,\n        stride_c: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\ngemm performs one of the matrix-matrix operations:\n\nC = alpha*op( A )*op( B ) + beta*C,\n\nwhere op( X ) is one of\n\nop( X ) = X      or\nop( X ) = X**T   or\nop( X ) = X**H,\n\nalpha and beta are scalars, and A, B and C are matrices, with\nop( A ) an m by k matrix, op( B ) a k by n matrix and C an m by n matrix.\n\nAlthough not widespread, some gemm kernels may use atomic operations. See Atomic Operations\nin the API Reference Guide for more information.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\ntransA    [rocblas_operation]\nspecifies the form of op( A ).\n@param[in]\ntransB    [rocblas_operation]\nspecifies the form of op( B ).\n@param[in]\nm         [rocblas_int]\nnumber or rows of matrices op( A ) and C.\n@param[in]\nn         [rocblas_int]\nnumber of columns of matrices op( B ) and C.\n@param[in]\nk         [rocblas_int]\nnumber of columns of matrix op( A ) and number of rows of matrix op( B ).\n@param[in]\nalpha     device pointer or host pointer specifying the scalar alpha.\n@param[in]\nA         device pointer storing matrix A.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A.\n@param[in]\nB         device pointer storing matrix B.\n@param[in]\nldb       [rocblas_int]\nspecifies the leading dimension of B.\n@param[in]\nbeta      device pointer or host pointer specifying the scalar beta.\n@param[in, out]\nC         device pointer storing matrix C on the GPU.\n@param[in]\nldc       [rocblas_int]\nspecifies the leading dimension of C.\n*/\n    pub fn rocblas_sgemm(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocblas_int,\n        B: *const f32,\n        ldb: rocblas_int,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgemm(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocblas_int,\n        B: *const f64,\n        ldb: rocblas_int,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_hgemm(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_half,\n        A: *const rocblas_half,\n        lda: rocblas_int,\n        B: *const rocblas_half,\n        ldb: rocblas_int,\n        beta: *const rocblas_half,\n        C: *mut rocblas_half,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgemm(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        B: *const rocblas_float_complex,\n        ldb: rocblas_int,\n        beta: *const rocblas_float_complex,\n        C: *mut rocblas_float_complex,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgemm(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        B: *const rocblas_double_complex,\n        ldb: rocblas_int,\n        beta: *const rocblas_double_complex,\n        C: *mut rocblas_double_complex,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sgemm_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        B: *const f32,\n        ldb: i64,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgemm_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        B: *const f64,\n        ldb: i64,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_hgemm_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_half,\n        A: *const rocblas_half,\n        lda: i64,\n        B: *const rocblas_half,\n        ldb: i64,\n        beta: *const rocblas_half,\n        C: *mut rocblas_half,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgemm_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        B: *const rocblas_float_complex,\n        ldb: i64,\n        beta: *const rocblas_float_complex,\n        C: *mut rocblas_float_complex,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgemm_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        B: *const rocblas_double_complex,\n        ldb: i64,\n        beta: *const rocblas_double_complex,\n        C: *mut rocblas_double_complex,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\ngemm_batched performs one of the batched matrix-matrix operations:\n\nC_i = alpha*op( A_i )*op( B_i ) + beta*C_i, for i = 1, ..., batch_count,\n\nwhere op( X ) is one of\n\nop( X ) = X      or\nop( X ) = X**T   or\nop( X ) = X**H,\n\nalpha and beta are scalars, and A, B and C are strided batched matrices, with\n\nop( A ) an m by k by batch_count matrices,\nop( B ) an k by n by batch_count matrices and\nC an m by n by batch_count matrices.\n\n@param[in]\nhandle    [rocblas_handle\nhandle to the rocblas library context queue.\n@param[in]\ntransA    [rocblas_operation]\nspecifies the form of op( A ).\n@param[in]\ntransB    [rocblas_operation]\nspecifies the form of op( B ).\n@param[in]\nm         [rocblas_int]\nmatrix dimention m.\n@param[in]\nn         [rocblas_int]\nmatrix dimention n.\n@param[in]\nk         [rocblas_int]\nmatrix dimention k.\n@param[in]\nalpha     device pointer or host pointer specifying the scalar alpha.\n@param[in]\nA         device array of device pointers storing each matrix A_i.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each A_i.\n@param[in]\nB         device array of device pointers storing each matrix B_i.\n@param[in]\nldb       [rocblas_int]\nspecifies the leading dimension of each B_i.\n@param[in]\nbeta      device pointer or host pointer specifying the scalar beta.\n@param[in, out]\nC         device array of device pointers storing each matrix C_i.\n@param[in]\nldc       [rocblas_int]\nspecifies the leading dimension of each C_i.\n@param[in]\nbatch_count\n[rocblas_int]\nnumber of gemm operations in the batch.*/\n    pub fn rocblas_sgemm_batched(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f32,\n        A: *const *const f32,\n        lda: rocblas_int,\n        B: *const *const f32,\n        ldb: rocblas_int,\n        beta: *const f32,\n        C: *const *mut f32,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgemm_batched(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f64,\n        A: *const *const f64,\n        lda: rocblas_int,\n        B: *const *const f64,\n        ldb: rocblas_int,\n        beta: *const f64,\n        C: *const *mut f64,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_hgemm_batched(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_half,\n        A: *const *const rocblas_half,\n        lda: rocblas_int,\n        B: *const *const rocblas_half,\n        ldb: rocblas_int,\n        beta: *const rocblas_half,\n        C: *const *mut rocblas_half,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgemm_batched(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: rocblas_int,\n        B: *const *const rocblas_float_complex,\n        ldb: rocblas_int,\n        beta: *const rocblas_float_complex,\n        C: *const *mut rocblas_float_complex,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgemm_batched(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: rocblas_int,\n        B: *const *const rocblas_double_complex,\n        ldb: rocblas_int,\n        beta: *const rocblas_double_complex,\n        C: *const *mut rocblas_double_complex,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sgemm_batched_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const *const f32,\n        lda: i64,\n        B: *const *const f32,\n        ldb: i64,\n        beta: *const f32,\n        C: *const *mut f32,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgemm_batched_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        A: *const *const f64,\n        lda: i64,\n        B: *const *const f64,\n        ldb: i64,\n        beta: *const f64,\n        C: *const *mut f64,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_hgemm_batched_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_half,\n        A: *const *const rocblas_half,\n        lda: i64,\n        B: *const *const rocblas_half,\n        ldb: i64,\n        beta: *const rocblas_half,\n        C: *const *mut rocblas_half,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgemm_batched_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: i64,\n        B: *const *const rocblas_float_complex,\n        ldb: i64,\n        beta: *const rocblas_float_complex,\n        C: *const *mut rocblas_float_complex,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgemm_batched_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: i64,\n        B: *const *const rocblas_double_complex,\n        ldb: i64,\n        beta: *const rocblas_double_complex,\n        C: *const *mut rocblas_double_complex,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\ngemm_strided_batched performs one of the strided batched matrix-matrix operations:\n\nC_i = alpha*op( A_i )*op( B_i ) + beta*C_i, for i = 1, ..., batch_count,\n\nwhere op( X ) is one of\n\nop( X ) = X      or\nop( X ) = X**T   or\nop( X ) = X**H,\n\nalpha and beta are scalars, and A, B and C are strided batched matrices, with\nop( A ) an m by k by batch_count strided_batched matrix,\nop( B ) an k by n by batch_count strided_batched matrix and\nC an m by n by batch_count strided_batched matrix.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\ntransA    [rocblas_operation]\nspecifies the form of op( A ).\n@param[in]\ntransB    [rocblas_operation]\nspecifies the form of op( B ).\n@param[in]\nm         [rocblas_int]\nmatrix dimention m.\n@param[in]\nn         [rocblas_int]\nmatrix dimention n.\n@param[in]\nk         [rocblas_int]\nmatrix dimention k.\n@param[in]\nalpha     device pointer or host pointer specifying the scalar alpha.\n@param[in]\nA         device pointer pointing to the first matrix A_1.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each A_i.\n@param[in]\nstride_a  [rocblas_stride]\nstride from the start of one A_i matrix to the next A_(i + 1).\n@param[in]\nB         device pointer pointing to the first matrix B_1.\n@param[in]\nldb       [rocblas_int]\nspecifies the leading dimension of each B_i.\n@param[in]\nstride_b  [rocblas_stride]\nstride from the start of one B_i matrix to the next B_(i + 1).\n@param[in]\nbeta      device pointer or host pointer specifying the scalar beta.\n@param[in, out]\nC         device pointer pointing to the first matrix C_1.\n@param[in]\nldc       [rocblas_int]\nspecifies the leading dimension of each C_i.\n@param[in]\nstride_c  [rocblas_stride]\nstride from the start of one C_i matrix to the next C_(i + 1).\n@param[in]\nbatch_count\n[rocblas_int]\nnumber of gemm operatons in the batch.\n*/\n    pub fn rocblas_sgemm_strided_batched(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocblas_int,\n        stride_a: rocblas_stride,\n        B: *const f32,\n        ldb: rocblas_int,\n        stride_b: rocblas_stride,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: rocblas_int,\n        stride_c: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgemm_strided_batched(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocblas_int,\n        stride_a: rocblas_stride,\n        B: *const f64,\n        ldb: rocblas_int,\n        stride_b: rocblas_stride,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: rocblas_int,\n        stride_c: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_hgemm_strided_batched(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_half,\n        A: *const rocblas_half,\n        lda: rocblas_int,\n        stride_a: rocblas_stride,\n        B: *const rocblas_half,\n        ldb: rocblas_int,\n        stride_b: rocblas_stride,\n        beta: *const rocblas_half,\n        C: *mut rocblas_half,\n        ldc: rocblas_int,\n        stride_c: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgemm_strided_batched(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        stride_a: rocblas_stride,\n        B: *const rocblas_float_complex,\n        ldb: rocblas_int,\n        stride_b: rocblas_stride,\n        beta: *const rocblas_float_complex,\n        C: *mut rocblas_float_complex,\n        ldc: rocblas_int,\n        stride_c: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgemm_strided_batched(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        stride_a: rocblas_stride,\n        B: *const rocblas_double_complex,\n        ldb: rocblas_int,\n        stride_b: rocblas_stride,\n        beta: *const rocblas_double_complex,\n        C: *mut rocblas_double_complex,\n        ldc: rocblas_int,\n        stride_c: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sgemm_strided_batched_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        stride_a: rocblas_stride,\n        B: *const f32,\n        ldb: i64,\n        stride_b: rocblas_stride,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: i64,\n        stride_c: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgemm_strided_batched_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        stride_a: rocblas_stride,\n        B: *const f64,\n        ldb: i64,\n        stride_b: rocblas_stride,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: i64,\n        stride_c: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_hgemm_strided_batched_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_half,\n        A: *const rocblas_half,\n        lda: i64,\n        stride_a: rocblas_stride,\n        B: *const rocblas_half,\n        ldb: i64,\n        stride_b: rocblas_stride,\n        beta: *const rocblas_half,\n        C: *mut rocblas_half,\n        ldc: i64,\n        stride_c: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgemm_strided_batched_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        stride_a: rocblas_stride,\n        B: *const rocblas_float_complex,\n        ldb: i64,\n        stride_b: rocblas_stride,\n        beta: *const rocblas_float_complex,\n        C: *mut rocblas_float_complex,\n        ldc: i64,\n        stride_c: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgemm_strided_batched_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        stride_a: rocblas_stride,\n        B: *const rocblas_double_complex,\n        ldb: i64,\n        stride_b: rocblas_stride,\n        beta: *const rocblas_double_complex,\n        C: *mut rocblas_double_complex,\n        ldc: i64,\n        stride_c: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\ndgmm performs one of the matrix-matrix operations:\n\nC = A * diag(x) if side == rocblas_side_right\nC = diag(x) * A if side == rocblas_side_left\n\nwhere C and A are m by n dimensional matrices. diag( x ) is a diagonal matrix\nand x is vector of dimension n if side == rocblas_side_right and dimension m\nif side == rocblas_side_left.\n\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nside      [rocblas_side]\nspecifies the side of diag(x).\n@param[in]\nm         [rocblas_int]\nmatrix dimension m.\n@param[in]\nn         [rocblas_int]\nmatrix dimension n.\n@param[in]\nA         device pointer storing matrix A.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A.\n@param[in]\nx         device pointer storing vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment between values of x\n@param[in, out]\nC         device pointer storing matrix C.\n@param[in]\nldc       [rocblas_int]\nspecifies the leading dimension of C.\n*/\n    pub fn rocblas_sdgmm(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        m: rocblas_int,\n        n: rocblas_int,\n        A: *const f32,\n        lda: rocblas_int,\n        x: *const f32,\n        incx: rocblas_int,\n        C: *mut f32,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ddgmm(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        m: rocblas_int,\n        n: rocblas_int,\n        A: *const f64,\n        lda: rocblas_int,\n        x: *const f64,\n        incx: rocblas_int,\n        C: *mut f64,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cdgmm(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        m: rocblas_int,\n        n: rocblas_int,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        C: *mut rocblas_float_complex,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdgmm(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        m: rocblas_int,\n        n: rocblas_int,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        C: *mut rocblas_double_complex,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sdgmm_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        m: i64,\n        n: i64,\n        A: *const f32,\n        lda: i64,\n        x: *const f32,\n        incx: i64,\n        C: *mut f32,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ddgmm_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        m: i64,\n        n: i64,\n        A: *const f64,\n        lda: i64,\n        x: *const f64,\n        incx: i64,\n        C: *mut f64,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cdgmm_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        m: i64,\n        n: i64,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        C: *mut rocblas_float_complex,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdgmm_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        m: i64,\n        n: i64,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        C: *mut rocblas_double_complex,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\ndgmm_batched performs one of the batched matrix-matrix operations:\n\nC_i = A_i * diag(x_i) for i = 0, 1, ... batch_count-1 if side == rocblas_side_right\nC_i = diag(x_i) * A_i for i = 0, 1, ... batch_count-1 if side == rocblas_side_left,\n\nwhere C_i and A_i are m by n dimensional matrices. diag(x_i) is a diagonal matrix\nand x_i is vector of dimension n if side == rocblas_side_right and dimension m\nif side == rocblas_side_left.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nside      [rocblas_side]\nspecifies the side of diag(x).\n@param[in]\nm         [rocblas_int]\nmatrix dimension m.\n@param[in]\nn         [rocblas_int]\nmatrix dimension n.\n@param[in]\nA         device array of device pointers storing each matrix A_i on the GPU.\nEach A_i is of dimension ( lda, n ).\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A_i.\n@param[in]\nx         device array of device pointers storing each vector x_i on the GPU.\nEach x_i is of dimension n if side == rocblas_side_right and dimension\nm if side == rocblas_side_left.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment between values of x_i.\n@param[in, out]\nC         device array of device pointers storing each matrix C_i on the GPU.\nEach C_i is of dimension ( ldc, n ).\n@param[in]\nldc       [rocblas_int]\nspecifies the leading dimension of C_i.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n*/\n    pub fn rocblas_sdgmm_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        m: rocblas_int,\n        n: rocblas_int,\n        A: *const *const f32,\n        lda: rocblas_int,\n        x: *const *const f32,\n        incx: rocblas_int,\n        C: *const *mut f32,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ddgmm_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        m: rocblas_int,\n        n: rocblas_int,\n        A: *const *const f64,\n        lda: rocblas_int,\n        x: *const *const f64,\n        incx: rocblas_int,\n        C: *const *mut f64,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cdgmm_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        m: rocblas_int,\n        n: rocblas_int,\n        A: *const *const rocblas_float_complex,\n        lda: rocblas_int,\n        x: *const *const rocblas_float_complex,\n        incx: rocblas_int,\n        C: *const *mut rocblas_float_complex,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdgmm_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        m: rocblas_int,\n        n: rocblas_int,\n        A: *const *const rocblas_double_complex,\n        lda: rocblas_int,\n        x: *const *const rocblas_double_complex,\n        incx: rocblas_int,\n        C: *const *mut rocblas_double_complex,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sdgmm_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        m: i64,\n        n: i64,\n        A: *const *const f32,\n        lda: i64,\n        x: *const *const f32,\n        incx: i64,\n        C: *const *mut f32,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ddgmm_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        m: i64,\n        n: i64,\n        A: *const *const f64,\n        lda: i64,\n        x: *const *const f64,\n        incx: i64,\n        C: *const *mut f64,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cdgmm_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        m: i64,\n        n: i64,\n        A: *const *const rocblas_float_complex,\n        lda: i64,\n        x: *const *const rocblas_float_complex,\n        incx: i64,\n        C: *const *mut rocblas_float_complex,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdgmm_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        m: i64,\n        n: i64,\n        A: *const *const rocblas_double_complex,\n        lda: i64,\n        x: *const *const rocblas_double_complex,\n        incx: i64,\n        C: *const *mut rocblas_double_complex,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\ndgmm_strided_batched performs one of the batched matrix-matrix operations:\n\nC_i = A_i * diag(x_i)   if side == rocblas_side_right   for i = 0, 1, ... batch_count-1\nC_i = diag(x_i) * A_i   if side == rocblas_side_left    for i = 0, 1, ... batch_count-1,\n\nwhere C_i and A_i are m by n dimensional matrices. diag(x_i) is a diagonal matrix\nand x_i is vector of dimension n if side == rocblas_side_right and dimension m\nif side == rocblas_side_left.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nside      [rocblas_side]\nspecifies the side of diag(x).\n@param[in]\nm         [rocblas_int]\nmatrix dimension m.\n@param[in]\nn         [rocblas_int]\nmatrix dimension n.\n@param[in]\nA         device pointer to the first matrix A_0 on the GPU.\nEach A_i is of dimension ( lda, n ).\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A.\n@param[in]\nstride_A  [rocblas_stride]\nstride from the start of one matrix (A_i) and the next one (A_i+1).\n@param[in]\nx         pointer to the first vector x_0 on the GPU.\nEach x_i is of dimension n if side == rocblas_side_right and dimension\nm if side == rocblas_side_left.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment between values of x.\n@param[in]\nstride_x  [rocblas_stride]\nstride from the start of one vector(x_i) and the next one (x_i+1).\n@param[in, out]\nC         device pointer to the first matrix C_0 on the GPU.\nEach C_i is of dimension ( ldc, n ).\n@param[in]\nldc       [rocblas_int]\nspecifies the leading dimension of C.\n@param[in]\nstride_C  [rocblas_stride]\nstride from the start of one matrix (C_i) and the next one (C_i+1).\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances i in the batch.\n*/\n    pub fn rocblas_sdgmm_strided_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        m: rocblas_int,\n        n: rocblas_int,\n        A: *const f32,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        x: *const f32,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        C: *mut f32,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ddgmm_strided_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        m: rocblas_int,\n        n: rocblas_int,\n        A: *const f64,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        x: *const f64,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        C: *mut f64,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cdgmm_strided_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        m: rocblas_int,\n        n: rocblas_int,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        x: *const rocblas_float_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        C: *mut rocblas_float_complex,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdgmm_strided_batched(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        m: rocblas_int,\n        n: rocblas_int,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        x: *const rocblas_double_complex,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        C: *mut rocblas_double_complex,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sdgmm_strided_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        m: i64,\n        n: i64,\n        A: *const f32,\n        lda: i64,\n        stride_A: rocblas_stride,\n        x: *const f32,\n        incx: i64,\n        stride_x: rocblas_stride,\n        C: *mut f32,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_ddgmm_strided_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        m: i64,\n        n: i64,\n        A: *const f64,\n        lda: i64,\n        stride_A: rocblas_stride,\n        x: *const f64,\n        incx: i64,\n        stride_x: rocblas_stride,\n        C: *mut f64,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cdgmm_strided_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        m: i64,\n        n: i64,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        x: *const rocblas_float_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        C: *mut rocblas_float_complex,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zdgmm_strided_batched_64(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        m: i64,\n        n: i64,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        x: *const rocblas_double_complex,\n        incx: i64,\n        stride_x: rocblas_stride,\n        C: *mut rocblas_double_complex,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\ngeam performs one of the matrix-matrix operations:\n\nC = alpha*op( A ) + beta*op( B ),\n\nwhere op( X ) is one of\n\nop( X ) = X      or\nop( X ) = X**T   or\nop( X ) = X**H,\n\nalpha and beta are scalars, and A, B and C are matrices, with\nop( A ) an m by n matrix, op( B ) an m by n matrix, and C an m by n matrix.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\ntransA    [rocblas_operation]\nspecifies the form of op( A ).\n@param[in]\ntransB    [rocblas_operation]\nspecifies the form of op( B ).\n@param[in]\nm         [rocblas_int]\nmatrix dimension m.\n@param[in]\nn         [rocblas_int]\nmatrix dimension n.\n@param[in]\nalpha     device pointer or host pointer specifying the scalar alpha.\n@param[in]\nA         device pointer storing matrix A.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A.\n@param[in]\nbeta      device pointer or host pointer specifying the scalar beta.\n@param[in]\nB         device pointer storing matrix B.\n@param[in]\nldb       [rocblas_int]\nspecifies the leading dimension of B.\n@param[in, out]\nC         device pointer storing matrix C.\n@param[in]\nldc       [rocblas_int]\nspecifies the leading dimension of C.\n*/\n    pub fn rocblas_sgeam(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocblas_int,\n        beta: *const f32,\n        B: *const f32,\n        ldb: rocblas_int,\n        C: *mut f32,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgeam(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocblas_int,\n        beta: *const f64,\n        B: *const f64,\n        ldb: rocblas_int,\n        C: *mut f64,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgeam(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        beta: *const rocblas_float_complex,\n        B: *const rocblas_float_complex,\n        ldb: rocblas_int,\n        C: *mut rocblas_float_complex,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgeam(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        beta: *const rocblas_double_complex,\n        B: *const rocblas_double_complex,\n        ldb: rocblas_int,\n        C: *mut rocblas_double_complex,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sgeam_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        beta: *const f32,\n        B: *const f32,\n        ldb: i64,\n        C: *mut f32,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgeam_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        beta: *const f64,\n        B: *const f64,\n        ldb: i64,\n        C: *mut f64,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgeam_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        beta: *const rocblas_float_complex,\n        B: *const rocblas_float_complex,\n        ldb: i64,\n        C: *mut rocblas_float_complex,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgeam_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        beta: *const rocblas_double_complex,\n        B: *const rocblas_double_complex,\n        ldb: i64,\n        C: *mut rocblas_double_complex,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\ngeam_batched performs one of the batched matrix-matrix operations:\n\nC_i = alpha*op( A_i ) + beta*op( B_i )  for i = 0, 1, ... batch_count - 1,\n\nwhere alpha and beta are scalars, and op(A_i), op(B_i) and C_i are m by n matrices\nand op( X ) is one of\n\nop( X ) = X      or\nop( X ) = X**T\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\ntransA    [rocblas_operation]\nspecifies the form of op( A ).\n@param[in]\ntransB    [rocblas_operation]\nspecifies the form of op( B ).\n@param[in]\nm         [rocblas_int]\nmatrix dimension m.\n@param[in]\nn         [rocblas_int]\nmatrix dimension n.\n@param[in]\nalpha     device pointer or host pointer specifying the scalar alpha.\n@param[in]\nA         device array of device pointers storing each matrix A_i on the GPU.\nEach A_i is of dimension ( lda, k ), where k is m\nwhen  transA == rocblas_operation_none and\nis  n  when  transA == rocblas_operation_transpose.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A.\n@param[in]\nbeta      device pointer or host pointer specifying the scalar beta.\n@param[in]\nB         device array of device pointers storing each matrix B_i on the GPU.\nEach B_i is of dimension ( ldb, k ), where k is m\nwhen  transB == rocblas_operation_none and\nis  n  when  transB == rocblas_operation_transpose.\n@param[in]\nldb       [rocblas_int]\nspecifies the leading dimension of B.\n@param[in, out]\nC         device array of device pointers storing each matrix C_i on the GPU.\nEach C_i is of dimension ( ldc, n ).\n@param[in]\nldc       [rocblas_int]\nspecifies the leading dimension of C.\n\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances i in the batch.\n*/\n    pub fn rocblas_sgeam_batched(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const *const f32,\n        lda: rocblas_int,\n        beta: *const f32,\n        B: *const *const f32,\n        ldb: rocblas_int,\n        C: *const *mut f32,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgeam_batched(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f64,\n        A: *const *const f64,\n        lda: rocblas_int,\n        beta: *const f64,\n        B: *const *const f64,\n        ldb: rocblas_int,\n        C: *const *mut f64,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgeam_batched(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: rocblas_int,\n        beta: *const rocblas_float_complex,\n        B: *const *const rocblas_float_complex,\n        ldb: rocblas_int,\n        C: *const *mut rocblas_float_complex,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgeam_batched(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: rocblas_int,\n        beta: *const rocblas_double_complex,\n        B: *const *const rocblas_double_complex,\n        ldb: rocblas_int,\n        C: *const *mut rocblas_double_complex,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sgeam_batched_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const *const f32,\n        lda: i64,\n        beta: *const f32,\n        B: *const *const f32,\n        ldb: i64,\n        C: *const *mut f32,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgeam_batched_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const f64,\n        A: *const *const f64,\n        lda: i64,\n        beta: *const f64,\n        B: *const *const f64,\n        ldb: i64,\n        C: *const *mut f64,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgeam_batched_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: i64,\n        beta: *const rocblas_float_complex,\n        B: *const *const rocblas_float_complex,\n        ldb: i64,\n        C: *const *mut rocblas_float_complex,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgeam_batched_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: i64,\n        beta: *const rocblas_double_complex,\n        B: *const *const rocblas_double_complex,\n        ldb: i64,\n        C: *const *mut rocblas_double_complex,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\ngeam_strided_batched performs one of the batched matrix-matrix operations:\n\nC_i = alpha*op( A_i ) + beta*op( B_i )  for i = 0, 1, ... batch_count - 1,\n\nwhere alpha and beta are scalars, and op(A_i), op(B_i) and C_i are m by n matrices\nand op( X ) is one of\n\nop( X ) = X      or\nop( X ) = X**T\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\ntransA    [rocblas_operation]\nspecifies the form of op( A ).\n\n@param[in]\ntransB    [rocblas_operation]\nspecifies the form of op( B ).\n\n@param[in]\nm         [rocblas_int]\nmatrix dimension m.\n\n@param[in]\nn         [rocblas_int]\nmatrix dimension n.\n\n@param[in]\nalpha     device pointer or host pointer specifying the scalar alpha.\n\n@param[in]\nA         device pointer to the first matrix A_0 on the GPU.\nEach A_i is of dimension ( lda, k ), where k is m\nwhen  transA == rocblas_operation_none and\nis  n  when  transA == rocblas_operation_transpose.\n\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A.\n\n@param[in]\nstride_A  [rocblas_stride]\nstride from the start of one matrix (A_i) and the next one (A_i+1).\n\n@param[in]\nbeta      device pointer or host pointer specifying the scalar beta.\n\n@param[in]\nB         pointer to the first matrix B_0 on the GPU.\nEach B_i is of dimension ( ldb, k ), where k is m\nwhen  transB == rocblas_operation_none and\nis  n  when  transB == rocblas_operation_transpose.\n\n@param[in]\nldb       [rocblas_int]\nspecifies the leading dimension of B.\n\n@param[in]\nstride_B  [rocblas_stride]\nstride from the start of one matrix (B_i) and the next one (B_i+1)\n\n@param[in, out]\nC         pointer to the first matrix C_0 on the GPU.\nEach C_i is of dimension ( ldc, n ).\n\n@param[in]\nldc       [rocblas_int]\nspecifies the leading dimension of C.\n\n@param[in]\nstride_C  [rocblas_stride]\nstride from the start of one matrix (C_i) and the next one (C_i+1).\n\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances i in the batch.\n*/\n    pub fn rocblas_sgeam_strided_batched(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        beta: *const f32,\n        B: *const f32,\n        ldb: rocblas_int,\n        stride_B: rocblas_stride,\n        C: *mut f32,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgeam_strided_batched(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        beta: *const f64,\n        B: *const f64,\n        ldb: rocblas_int,\n        stride_B: rocblas_stride,\n        C: *mut f64,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgeam_strided_batched(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        beta: *const rocblas_float_complex,\n        B: *const rocblas_float_complex,\n        ldb: rocblas_int,\n        stride_B: rocblas_stride,\n        C: *mut rocblas_float_complex,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgeam_strided_batched(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        beta: *const rocblas_double_complex,\n        B: *const rocblas_double_complex,\n        ldb: rocblas_int,\n        stride_B: rocblas_stride,\n        C: *mut rocblas_double_complex,\n        ldc: rocblas_int,\n        stride_C: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sgeam_strided_batched_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        stride_A: rocblas_stride,\n        beta: *const f32,\n        B: *const f32,\n        ldb: i64,\n        stride_B: rocblas_stride,\n        C: *mut f32,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgeam_strided_batched_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        stride_A: rocblas_stride,\n        beta: *const f64,\n        B: *const f64,\n        ldb: i64,\n        stride_B: rocblas_stride,\n        C: *mut f64,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgeam_strided_batched_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        beta: *const rocblas_float_complex,\n        B: *const rocblas_float_complex,\n        ldb: i64,\n        stride_B: rocblas_stride,\n        C: *mut rocblas_float_complex,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgeam_strided_batched_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        stride_A: rocblas_stride,\n        beta: *const rocblas_double_complex,\n        B: *const rocblas_double_complex,\n        ldb: i64,\n        stride_B: rocblas_stride,\n        C: *mut rocblas_double_complex,\n        ldc: i64,\n        stride_C: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS EX API </b>\n\n\\details\ngemm_ex performs one of the matrix-matrix operations:\n\nD = alpha*op( A )*op( B ) + beta*C,\n\nwhere op( X ) is one of\n\nop( X ) = X      or\nop( X ) = X**T   or\nop( X ) = X**H,\n\nalpha and beta are scalars, and A, B, C, and D are matrices, with\nop( A ) an m by k matrix, op( B ) a k by n matrix and C and D are m by n matrices.\nC and D may point to the same matrix if their parameters are identical.\n\nSupported types are as follows:\n- rocblas_datatype_f64_r = a_type = b_type = c_type = d_type = compute_type\n- rocblas_datatype_f32_r = a_type = b_type = c_type = d_type = compute_type\n- rocblas_datatype_f16_r = a_type = b_type = c_type = d_type = compute_type\n- rocblas_datatype_f16_r = a_type = b_type = c_type = d_type; rocblas_datatype_f32_r =\ncompute_type\n- rocblas_datatype_f16_r = a_type = b_type; rocblas_datatype_f32_r = c_type = d_type =\ncompute_type\n- rocblas_datatype_bf16_r = a_type = b_type = c_type = d_type; rocblas_datatype_f32_r =\ncompute_type\n- rocblas_datatype_bf16_r = a_type = b_type; rocblas_datatype_f32_r = c_type = d_type =\ncompute_type\n- rocblas_datatype_i8_r = a_type = b_type; rocblas_datatype_i32_r = c_type = d_type =\ncompute_type\n- rocblas_datatype_f32_c  = a_type = b_type = c_type = d_type = compute_type\n- rocblas_datatype_f64_c  = a_type = b_type = c_type = d_type = compute_type\n\nAlthough not widespread, some gemm kernels used by gemm_ex may use atomic operations.\nSee Atomic Operations in the API Reference Guide for more information.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\ntransA    [rocblas_operation]\nspecifies the form of op( A ).\n@param[in]\ntransB    [rocblas_operation]\nspecifies the form of op( B ).\n@param[in]\nm         [rocblas_int]\nmatrix dimension m.\n@param[in]\nn         [rocblas_int]\nmatrix dimension n.\n@param[in]\nk         [rocblas_int]\nmatrix dimension k.\n@param[in]\nalpha     [const void *]\ndevice pointer or host pointer specifying the scalar alpha. Same datatype as compute_type.\n@param[in]\na         [void *]\ndevice pointer storing matrix A.\n@param[in]\na_type    [rocblas_datatype]\nspecifies the datatype of matrix A.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A.\n@param[in]\nb         [void *]\ndevice pointer storing matrix B.\n@param[in]\nb_type    [rocblas_datatype]\nspecifies the datatype of matrix B.\n@param[in]\nldb       [rocblas_int]\nspecifies the leading dimension of B.\n@param[in]\nbeta      [const void *]\ndevice pointer or host pointer specifying the scalar beta. Same datatype as compute_type.\n@param[in]\nc         [void *]\ndevice pointer storing matrix C.\n@param[in]\nc_type    [rocblas_datatype]\nspecifies the datatype of matrix C.\n@param[in]\nldc       [rocblas_int]\nspecifies the leading dimension of C.\n@param[out]\nd         [void *]\ndevice pointer storing matrix D.\nIf d and c pointers are to the same matrix then d_type must equal c_type and ldd must equal ldc\nor the respective invalid status will be returned.\n@param[in]\nd_type    [rocblas_datatype]\nspecifies the datatype of matrix D.\n@param[in]\nldd       [rocblas_int]\nspecifies the leading dimension of D.\n@param[in]\ncompute_type\n[rocblas_datatype]\nspecifies the datatype of computation.\n@param[in]\nalgo      [rocblas_gemm_algo]\nenumerant specifying the algorithm type.\n@param[in]\nsolution_index\n[int32_t]\nif algo is rocblas_gemm_algo_solution_index, this controls which solution is used.\nWhen algo is not rocblas_gemm_algo_solution_index, or if solution_index <= 0, the default solution is used.\nThis parameter was unused in previous releases and instead always used the default solution\n@param[in]\nflags     [uint32_t]\noptional gemm flags.\n*/\n    pub fn rocblas_gemm_ex(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const ::core::ffi::c_void,\n        a: *const ::core::ffi::c_void,\n        a_type: rocblas_datatype,\n        lda: rocblas_int,\n        b: *const ::core::ffi::c_void,\n        b_type: rocblas_datatype,\n        ldb: rocblas_int,\n        beta: *const ::core::ffi::c_void,\n        c: *const ::core::ffi::c_void,\n        c_type: rocblas_datatype,\n        ldc: rocblas_int,\n        d: *mut ::core::ffi::c_void,\n        d_type: rocblas_datatype,\n        ldd: rocblas_int,\n        compute_type: rocblas_datatype,\n        algo: rocblas_gemm_algo,\n        solution_index: i32,\n        flags: u32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_gemm_ex_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const ::core::ffi::c_void,\n        a: *const ::core::ffi::c_void,\n        a_type: rocblas_datatype,\n        lda: i64,\n        b: *const ::core::ffi::c_void,\n        b_type: rocblas_datatype,\n        ldb: i64,\n        beta: *const ::core::ffi::c_void,\n        c: *const ::core::ffi::c_void,\n        c_type: rocblas_datatype,\n        ldc: i64,\n        d: *mut ::core::ffi::c_void,\n        d_type: rocblas_datatype,\n        ldd: i64,\n        compute_type: rocblas_datatype,\n        algo: rocblas_gemm_algo,\n        solution_index: i32,\n        flags: u32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS EX API </b>\n\n\\details\ngemm_batched_ex performs one of the batched matrix-matrix operations:\nD_i = alpha*op(A_i)*op(B_i) + beta*C_i, for i = 1, ..., batch_count.\nwhere op( X ) is one of\nop( X ) = X      or\nop( X ) = X**T   or\nop( X ) = X**H,\nalpha and beta are scalars, and A, B, C, and D are batched pointers to matrices, with\nop( A ) an m by k by batch_count batched matrix,\nop( B ) a k by n by batch_count batched matrix and\nC and D are m by n by batch_count batched matrices.\nThe batched matrices are an array of pointers to matrices.\nThe number of pointers to matrices is batch_count.\nC and D may point to the same matrices if their parameters are identical.\n\nSupported types are as follows:\n- rocblas_datatype_f64_r = a_type = b_type = c_type = d_type = compute_type\n- rocblas_datatype_f32_r = a_type = b_type = c_type = d_type = compute_type\n- rocblas_datatype_f16_r = a_type = b_type = c_type = d_type = compute_type\n- rocblas_datatype_f16_r = a_type = b_type = c_type = d_type; rocblas_datatype_f32_r =\ncompute_type\n- rocblas_datatype_bf16_r = a_type = b_type = c_type = d_type; rocblas_datatype_f32_r =\ncompute_type\n- rocblas_datatype_i8_r = a_type = b_type; rocblas_datatype_i32_r = c_type = d_type =\ncompute_type\n- rocblas_datatype_f32_c  = a_type = b_type = c_type = d_type = compute_type\n- rocblas_datatype_f64_c  = a_type = b_type = c_type = d_type = compute_type\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\ntransA    [rocblas_operation]\nspecifies the form of op( A ).\n@param[in]\ntransB    [rocblas_operation]\nspecifies the form of op( B ).\n@param[in]\nm         [rocblas_int]\nmatrix dimension m.\n@param[in]\nn         [rocblas_int]\nmatrix dimension n.\n@param[in]\nk         [rocblas_int]\nmatrix dimension k.\n@param[in]\nalpha     [const void *]\ndevice pointer or host pointer specifying the scalar alpha. Same datatype as compute_type.\n@param[in]\na         [void *]\ndevice pointer storing array of pointers to each matrix A_i.\n@param[in]\na_type    [rocblas_datatype]\nspecifies the datatype of each matrix A_i.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each A_i.\n@param[in]\nb         [void *]\ndevice pointer storing array of pointers to each matrix B_i.\n@param[in]\nb_type    [rocblas_datatype]\nspecifies the datatype of each matrix B_i.\n@param[in]\nldb       [rocblas_int]\nspecifies the leading dimension of each B_i.\n@param[in]\nbeta      [const void *]\ndevice pointer or host pointer specifying the scalar beta. Same datatype as compute_type.\n@param[in]\nc         [void *]\ndevice array of device pointers to each matrix C_i.\n@param[in]\nc_type    [rocblas_datatype]\nspecifies the datatype of each matrix C_i.\n@param[in]\nldc       [rocblas_int]\nspecifies the leading dimension of each C_i.\n@param[out]\nd         [void *]\ndevice array of device pointers to each matrix D_i.\nIf d and c are the same array of matrix pointers then d_type must equal c_type and ldd must equal ldc\nor the respective invalid status will be returned.\n@param[in]\nd_type    [rocblas_datatype]\nspecifies the datatype of each matrix D_i.\n@param[in]\nldd       [rocblas_int]\nspecifies the leading dimension of each D_i.\n@param[in]\nbatch_count\n[rocblas_int]\nnumber of gemm operations in the batch.\n@param[in]\ncompute_type\n[rocblas_datatype]\nspecifies the datatype of computation.\n@param[in]\nalgo      [rocblas_gemm_algo]\nenumerant specifying the algorithm type.\n@param[in]\nsolution_index\n[int32_t]\nif algo is rocblas_gemm_algo_solution_index, this controls which solution is used.\nWhen algo is not rocblas_gemm_algo_solution_index, or if solution_index <= 0, the default solution is used.\nThis parameter was unused in previous releases and instead always used the default solution\n@param[in]\nflags     [uint32_t]\noptional gemm flags.\n*/\n    pub fn rocblas_gemm_batched_ex(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const ::core::ffi::c_void,\n        a: *const ::core::ffi::c_void,\n        a_type: rocblas_datatype,\n        lda: rocblas_int,\n        b: *const ::core::ffi::c_void,\n        b_type: rocblas_datatype,\n        ldb: rocblas_int,\n        beta: *const ::core::ffi::c_void,\n        c: *const ::core::ffi::c_void,\n        c_type: rocblas_datatype,\n        ldc: rocblas_int,\n        d: *mut ::core::ffi::c_void,\n        d_type: rocblas_datatype,\n        ldd: rocblas_int,\n        batch_count: rocblas_int,\n        compute_type: rocblas_datatype,\n        algo: rocblas_gemm_algo,\n        solution_index: i32,\n        flags: u32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_gemm_batched_ex_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const ::core::ffi::c_void,\n        a: *const ::core::ffi::c_void,\n        a_type: rocblas_datatype,\n        lda: i64,\n        b: *const ::core::ffi::c_void,\n        b_type: rocblas_datatype,\n        ldb: i64,\n        beta: *const ::core::ffi::c_void,\n        c: *const ::core::ffi::c_void,\n        c_type: rocblas_datatype,\n        ldc: i64,\n        d: *mut ::core::ffi::c_void,\n        d_type: rocblas_datatype,\n        ldd: i64,\n        batch_count: i64,\n        compute_type: rocblas_datatype,\n        algo: rocblas_gemm_algo,\n        solution_index: i32,\n        flags: u32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS EX API </b>\n\n\\details\ngemm_strided_batched_ex performs one of the strided_batched matrix-matrix operations:\n\nD_i = alpha*op(A_i)*op(B_i) + beta*C_i, for i = 1, ..., batch_count\n\nwhere op( X ) is one of\n\nop( X ) = X      or\nop( X ) = X**T   or\nop( X ) = X**H,\n\nalpha and beta are scalars, and A, B, C, and D are strided_batched matrices, with\nop( A ) an m by k by batch_count strided_batched matrix,\nop( B ) a k by n by batch_count strided_batched matrix and\nC and D are m by n by batch_count strided_batched matrices.\nC and D may point to the same matrices if their parameters are identical.\n\nThe strided_batched matrices are multiple matrices separated by a constant stride.\nThe number of matrices is batch_count.\n\nSupported types are as follows:\n- rocblas_datatype_f64_r = a_type = b_type = c_type = d_type = compute_type\n- rocblas_datatype_f32_r = a_type = b_type = c_type = d_type = compute_type\n- rocblas_datatype_f16_r = a_type = b_type = c_type = d_type = compute_type\n- rocblas_datatype_f16_r = a_type = b_type = c_type = d_type; rocblas_datatype_f32_r =\ncompute_type\n- rocblas_datatype_bf16_r = a_type = b_type = c_type = d_type; rocblas_datatype_f32_r =\ncompute_type\n- rocblas_datatype_i8_r = a_type = b_type; rocblas_datatype_i32_r = c_type = d_type =\ncompute_type\n- rocblas_datatype_f32_c  = a_type = b_type = c_type = d_type = compute_type\n- rocblas_datatype_f64_c  = a_type = b_type = c_type = d_type = compute_type\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\ntransA    [rocblas_operation]\nspecifies the form of op( A ).\n@param[in]\ntransB    [rocblas_operation]\nspecifies the form of op( B ).\n@param[in]\nm         [rocblas_int]\nmatrix dimension m.\n@param[in]\nn         [rocblas_int]\nmatrix dimension n.\n@param[in]\nk         [rocblas_int]\nmatrix dimension k.\n@param[in]\nalpha     [const void *]\ndevice pointer or host pointer specifying the scalar alpha. Same datatype as compute_type.\n@param[in]\na         [void *]\ndevice pointer pointing to first matrix A_1.\n@param[in]\na_type    [rocblas_datatype]\nspecifies the datatype of each matrix A_i.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each A_i.\n@param[in]\nstride_a  [rocblas_stride]\nspecifies stride from start of one A_i matrix to the next A_(i + 1).\n@param[in]\nb         [void *]\ndevice pointer pointing to first matrix B_1.\n@param[in]\nb_type    [rocblas_datatype]\nspecifies the datatype of each matrix B_i.\n@param[in]\nldb       [rocblas_int]\nspecifies the leading dimension of each B_i.\n@param[in]\nstride_b  [rocblas_stride]\nspecifies stride from start of one B_i matrix to the next B_(i + 1).\n@param[in]\nbeta      [const void *]\ndevice pointer or host pointer specifying the scalar beta. Same datatype as compute_type.\n@param[in]\nc         [void *]\ndevice pointer pointing to first matrix C_1.\n@param[in]\nc_type    [rocblas_datatype]\nspecifies the datatype of each matrix C_i.\n@param[in]\nldc       [rocblas_int]\nspecifies the leading dimension of each C_i.\n@param[in]\nstride_c  [rocblas_stride]\nspecifies stride from start of one C_i matrix to the next C_(i + 1).\n@param[out]\nd         [void *]\ndevice pointer storing each matrix D_i.\nIf d and c pointers are to the same matrix then d_type must equal c_type and ldd must equal ldc\nand stride_d must equal stride_c or the respective invalid status will be returned.\n@param[in]\nd_type    [rocblas_datatype]\nspecifies the datatype of each matrix D_i.\n@param[in]\nldd       [rocblas_int]\nspecifies the leading dimension of each D_i.\n@param[in]\nstride_d  [rocblas_stride]\nspecifies stride from start of one D_i matrix to the next D_(i + 1).\n@param[in]\nbatch_count\n[rocblas_int]\nnumber of gemm operations in the batch.\n@param[in]\ncompute_type\n[rocblas_datatype]\nspecifies the datatype of computation.\n@param[in]\nalgo      [rocblas_gemm_algo]\nenumerant specifying the algorithm type.\n@param[in]\nsolution_index\n[int32_t]\nif algo is rocblas_gemm_algo_solution_index, this controls which solution is used.\nWhen algo is not rocblas_gemm_algo_solution_index, or if solution_index <= 0, the default solution is used.\nThis parameter was unused in previous releases and instead always used the default solution\n@param[in]\nflags     [uint32_t]\noptional gemm flags.\n*/\n    pub fn rocblas_gemm_strided_batched_ex(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const ::core::ffi::c_void,\n        a: *const ::core::ffi::c_void,\n        a_type: rocblas_datatype,\n        lda: rocblas_int,\n        stride_a: rocblas_stride,\n        b: *const ::core::ffi::c_void,\n        b_type: rocblas_datatype,\n        ldb: rocblas_int,\n        stride_b: rocblas_stride,\n        beta: *const ::core::ffi::c_void,\n        c: *const ::core::ffi::c_void,\n        c_type: rocblas_datatype,\n        ldc: rocblas_int,\n        stride_c: rocblas_stride,\n        d: *mut ::core::ffi::c_void,\n        d_type: rocblas_datatype,\n        ldd: rocblas_int,\n        stride_d: rocblas_stride,\n        batch_count: rocblas_int,\n        compute_type: rocblas_datatype,\n        algo: rocblas_gemm_algo,\n        solution_index: i32,\n        flags: u32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_gemm_strided_batched_ex_64(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: i64,\n        n: i64,\n        k: i64,\n        alpha: *const ::core::ffi::c_void,\n        a: *const ::core::ffi::c_void,\n        a_type: rocblas_datatype,\n        lda: i64,\n        stride_a: rocblas_stride,\n        b: *const ::core::ffi::c_void,\n        b_type: rocblas_datatype,\n        ldb: i64,\n        stride_b: rocblas_stride,\n        beta: *const ::core::ffi::c_void,\n        c: *const ::core::ffi::c_void,\n        c_type: rocblas_datatype,\n        ldc: i64,\n        stride_c: rocblas_stride,\n        d: *mut ::core::ffi::c_void,\n        d_type: rocblas_datatype,\n        ldd: i64,\n        stride_d: rocblas_stride,\n        batch_count: i64,\n        compute_type: rocblas_datatype,\n        algo: rocblas_gemm_algo,\n        solution_index: i32,\n        flags: u32,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\ngemmt performs matrix-matrix operations and updates the upper or lower triangular part of the result matrix:\n\nC = alpha*op( A )*op( B ) + beta*C,\n\nwhere op( X ) is one of\n\nop( X ) = X      or\nop( X ) = X**T   or\nop( X ) = X**H,\n\nalpha and beta are scalars. A, B  are general matrices and C is either an upper or lower triangular matrix, with\nop( A ) an n by k matrix, op( B ) a k by n matrix and C an n by n matrix.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  C is an upper triangular matrix\n- rocblas_fill_lower:  C is a  lower triangular matrix\n@param[in]\ntransA    [rocblas_operation]\n- rocblas_operation_none:    op(A) = A.\n- rocblas_operation_transpose:      op(A) = A^T\n- rocblas_operation_conjugate_transpose:  op(A) = A^H\n@param[in]\ntransB    [rocblas_operation]\n- rocblas_operation_none:    op(B) = B.\n- rocblas_operation_transpose:      op(B) = B^T\n- rocblas_operation_conjugate_transpose:  op(B) = B^H\n@param[in]\nn         [rocblas_int]\nnumber or rows of matrices op( A ), columns of op( B ), and (rows, columns) of C.\n@param[in]\nk         [rocblas_int]\nnumber of rows of matrices op( B ) and columns of op( A ).\n@param[in]\nalpha     device pointer or host pointer specifying the scalar alpha.\n@param[in]\nA         device pointer storing matrix A. If transa = rocblas_operation_none, then, the leading n-by-k part of the array contains the matrix A, otherwise the leading k-by-n part of the array contains the matrix A.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A. If transA == rocblas_operation_none, must have lda >= max(1, n), otherwise, must have lda >= max(1, k).\n@param[in]\nB         device pointer storing matrix B. If transB = rocblas_operation_none, then, the leading k-by-n part of the array contains the matrix B, otherwise the leading n-by-k part of the array contains the matrix B.\n@param[in]\nldb       [rocblas_int]\nspecifies the leading dimension of B. If transB == rocblas_operation_none, must have ldb >= max(1, k), otherwise, must have ldb >= max(1, n)\n@param[in]\nbeta      device pointer or host pointer specifying the scalar beta.\n@param[in, out]\nC         device pointer storing matrix C on the GPU. If uplo == rocblas_fill_upper, the upper triangular part of the leading n-by-n array contains the matrix C, otherwise the lower triangular part of the leading n-by-n array contains the matrix C.\n@param[in]\nldc       [rocblas_int]\nspecifies the leading dimension of C. Must have ldc >= max(1, n).\n*/\n    pub fn rocblas_sgemmt(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocblas_int,\n        B: *const f32,\n        ldb: rocblas_int,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgemmt(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocblas_int,\n        B: *const f64,\n        ldb: rocblas_int,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgemmt(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        B: *const rocblas_float_complex,\n        ldb: rocblas_int,\n        beta: *const rocblas_float_complex,\n        C: *mut rocblas_float_complex,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgemmt(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        B: *const rocblas_double_complex,\n        ldb: rocblas_int,\n        beta: *const rocblas_double_complex,\n        C: *mut rocblas_double_complex,\n        ldc: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sgemmt_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        B: *const f32,\n        ldb: i64,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgemmt_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        B: *const f64,\n        ldb: i64,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgemmt_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        B: *const rocblas_float_complex,\n        ldb: i64,\n        beta: *const rocblas_float_complex,\n        C: *mut rocblas_float_complex,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgemmt_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        B: *const rocblas_double_complex,\n        ldb: i64,\n        beta: *const rocblas_double_complex,\n        C: *mut rocblas_double_complex,\n        ldc: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\ngemmt_batched performs matrix-matrix operations and updates the upper or lower triangular part of the result matrix:\n\nC_i = alpha*op( A_i )*op( B_i ) + beta*C_i, for i = 1, ..., batch_count,\n\nwhere op( X ) is one of\n\nop( X ) = X      or\nop( X ) = X**T   or\nop( X ) = X**H,\n\nalpha and beta are scalars. A, B  are general matrices and C is either an upper or lower triangular matrix, with\n\nop( A ) an n by k by batch_count matrices,\nop( B ) an k by n by batch_count matrices and\nC an n by n by batch_count matrices.\n\n@param[in]\nhandle    [rocblas_handle\nhandle to the rocblas library context queue.\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  C is an upper triangular matrix\n- rocblas_fill_lower:  C is a  lower triangular matrix\n@param[in]\ntransA    [rocblas_operation]\n- rocblas_operation_none:    op(A_i) = A_i.\n- rocblas_operation_transpose:      op(A_i) = A_i^T\n- rocblas_operation_conjugate_transpose:  op(A_i) = A_i^H\n@param[in]\ntransB    [rocblas_operation]\n- rocblas_operation_none:    op(B_i) = B_i.\n- rocblas_operation_transpose:      op(B_i) = B_i^T\n- rocblas_operation_conjugate_transpose:  op(B_i) = B_i^H\n@param[in]\nn         [rocblas_int]\nnumber or rows of matrices op( A_i ), columns of op( B_i ), and (rows, columns) of C_i.\n@param[in]\nk         [rocblas_int]\nnumber of rows of matrices op( B_i ) and columns of op( A_i ).\n@param[in]\nalpha     device pointer or host pointer specifying the scalar alpha.\n@param[in]\nA         device array of device pointers storing each matrix A_i. If transa = rocblas_operation_none, then, the leading n-by-k part of the array contains each matrix A_i, otherwise the leading k-by-n part of the array contains each matrix A_i.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each A_i. If transA == rocblas_operation_none, must have lda >= max(1, n), otherwise, must have lda >= max(1, k).\n@param[in]\nB         device array of device pointers storing each matrix B_i. If transB = rocblas_operation_none, then, the leading k-by-n part of the array contains each matrix B_i, otherwise the leading n-by-k part of the array contains each matrix B_i.\n@param[in]\nldb       [rocblas_int]\nspecifies the leading dimension of each B_i. If transB == rocblas_operation_none, must have ldb >= max(1, k), otherwise, must have ldb >= max(1, n).\n@param[in]\nbeta      device pointer or host pointer specifying the scalar beta.\n@param[in, out]\nC         device array of device pointers storing each matrix C_i. If uplo == rocblas_fill_upper, the upper triangular part of the leading n-by-n array contains each matrix C_i, otherwise the lower triangular part of the leading n-by-n array contains each matrix C_i.\n@param[in]\nldc       [rocblas_int]\nspecifies the leading dimension of each C_i. Must have ldc >= max(1, n).\n@param[in]\nbatch_count\n[rocblas_int]\nnumber of gemm operations in the batch.*/\n    pub fn rocblas_sgemmt_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f32,\n        A: *const *const f32,\n        lda: rocblas_int,\n        B: *const *const f32,\n        ldb: rocblas_int,\n        beta: *const f32,\n        C: *const *mut f32,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgemmt_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f64,\n        A: *const *const f64,\n        lda: rocblas_int,\n        B: *const *const f64,\n        ldb: rocblas_int,\n        beta: *const f64,\n        C: *const *mut f64,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgemmt_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: rocblas_int,\n        B: *const *const rocblas_float_complex,\n        ldb: rocblas_int,\n        beta: *const rocblas_float_complex,\n        C: *const *mut rocblas_float_complex,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgemmt_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: rocblas_int,\n        B: *const *const rocblas_double_complex,\n        ldb: rocblas_int,\n        beta: *const rocblas_double_complex,\n        C: *const *mut rocblas_double_complex,\n        ldc: rocblas_int,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sgemmt_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const *const f32,\n        lda: i64,\n        B: *const *const f32,\n        ldb: i64,\n        beta: *const f32,\n        C: *const *mut f32,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgemmt_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        A: *const *const f64,\n        lda: i64,\n        B: *const *const f64,\n        ldb: i64,\n        beta: *const f64,\n        C: *const *mut f64,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgemmt_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const *const rocblas_float_complex,\n        lda: i64,\n        B: *const *const rocblas_float_complex,\n        ldb: i64,\n        beta: *const rocblas_float_complex,\n        C: *const *mut rocblas_float_complex,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgemmt_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const *const rocblas_double_complex,\n        lda: i64,\n        B: *const *const rocblas_double_complex,\n        ldb: i64,\n        beta: *const rocblas_double_complex,\n        C: *const *mut rocblas_double_complex,\n        ldc: i64,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 3 API </b>\n\n\\details\ngemmt_strided_batched performs matrix-matrix operations and updates the upper or lower triangular part of the result matrix:\n\nC_i = alpha*op( A_i )*op( B_i ) + beta*C_i, for i = 1, ..., batch_count,\n\nwhere op( X ) is one of\n\nop( X ) = X      or\nop( X ) = X**T   or\nop( X ) = X**H,\n\nalpha and beta are scalars. A, B  are general matrices and C is either an upper or lower triangular matrix, with\nop( A ) an n by k by batch_count strided_batched matrix,\nop( B ) an k by n by batch_count strided_batched matrix and\nC an n by n by batch_count strided_batched matrix.\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  C is an upper triangular matrix\n- rocblas_fill_lower:  C is a  lower triangular matrix\n@param[in]\ntransA    [rocblas_operation]\n- rocblas_operation_none:    op(A_i) = A_i.\n- rocblas_operation_transpose:      op(A_i) = A_i^T\n- rocblas_operation_conjugate_transpose:  op(A_i) = A_i^H\n@param[in]\ntransB    [rocblas_operation]\n- rocblas_operation_none:    op(B_i) = B_i.\n- rocblas_operation_transpose:      op(B_i) = B_i^T\n- rocblas_operation_conjugate_transpose:  op(B_i) = B_i^H\n@param[in]\nn         [rocblas_int]\nnumber or rows of matrices op( A_i ), columns of op( B_i ), and (rows, columns) of C_i.\n@param[in]\nk         [rocblas_int]\nnumber of rows of matrices op( B_i ) and columns of op( A_i ).\n@param[in]\nalpha     device pointer or host pointer specifying the scalar alpha.\n@param[in]\nA         device array of device pointers storing each matrix A_i. If transa = rocblas_operation_none, then, the leading n-by-k part of the array contains each matrix A_i, otherwise the leading k-by-n part of the array contains each matrix A_i.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of each A_i. If transA == rocblas_operation_none, must have lda >= max(1, n), otherwise, must have lda >= max(1, k).\n@param[in]\nstride_a  [rocblas_stride]\nstride from the start of one A_i matrix to the next A_(i + 1).\n@param[in]\nB         device array of device pointers storing each matrix B_i. If transB = rocblas_operation_none, then, the leading k-by-n part of the array contains each matrix B_i, otherwise the leading n-by-k part of the array contains each matrix B_i.\n@param[in]\nldb       [rocblas_int]\nspecifies the leading dimension of each B_i. If transB == rocblas_operation_none, must have ldb >= max(1, k), otherwise, must have ldb >= max(1, n).\n@param[in]\nstride_b  [rocblas_stride]\nstride from the start of one B_i matrix to the next B_(i + 1).\n@param[in]\nbeta      device pointer or host pointer specifying the scalar beta.\n@param[in, out]\nC         device array of device pointers storing each matrix C_i. If uplo == rocblas_fill_upper, the upper triangular part of the leading n-by-n array contains each matrix C_i, otherwise the lower triangular part of the leading n-by-n array contains each matrix C_i.\n@param[in]\nldc       [rocblas_int]\nspecifies the leading dimension of each C_i. Must have ldc >= max(1, n).\n@param[in]\nstride_c  [rocblas_stride]\nstride from the start of one C_i matrix to the next C_(i + 1).\n@param[in]\nbatch_count\n[rocblas_int]\nnumber of gemm operatons in the batch.\n*/\n    pub fn rocblas_sgemmt_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocblas_int,\n        stride_a: rocblas_stride,\n        B: *const f32,\n        ldb: rocblas_int,\n        stride_b: rocblas_stride,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: rocblas_int,\n        stride_c: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgemmt_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocblas_int,\n        stride_a: rocblas_stride,\n        B: *const f64,\n        ldb: rocblas_int,\n        stride_b: rocblas_stride,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: rocblas_int,\n        stride_c: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgemmt_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: rocblas_int,\n        stride_a: rocblas_stride,\n        B: *const rocblas_float_complex,\n        ldb: rocblas_int,\n        stride_b: rocblas_stride,\n        beta: *const rocblas_float_complex,\n        C: *mut rocblas_float_complex,\n        ldc: rocblas_int,\n        stride_c: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgemmt_strided_batched(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: rocblas_int,\n        stride_a: rocblas_stride,\n        B: *const rocblas_double_complex,\n        ldb: rocblas_int,\n        stride_b: rocblas_stride,\n        beta: *const rocblas_double_complex,\n        C: *mut rocblas_double_complex,\n        ldc: rocblas_int,\n        stride_c: rocblas_stride,\n        batch_count: rocblas_int,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_sgemmt_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f32,\n        A: *const f32,\n        lda: i64,\n        stride_a: rocblas_stride,\n        B: *const f32,\n        ldb: i64,\n        stride_b: rocblas_stride,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: i64,\n        stride_c: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dgemmt_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const f64,\n        A: *const f64,\n        lda: i64,\n        stride_a: rocblas_stride,\n        B: *const f64,\n        ldb: i64,\n        stride_b: rocblas_stride,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: i64,\n        stride_c: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_cgemmt_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_float_complex,\n        A: *const rocblas_float_complex,\n        lda: i64,\n        stride_a: rocblas_stride,\n        B: *const rocblas_float_complex,\n        ldb: i64,\n        stride_b: rocblas_stride,\n        beta: *const rocblas_float_complex,\n        C: *mut rocblas_float_complex,\n        ldc: i64,\n        stride_c: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_zgemmt_strided_batched_64(\n        handle: rocblas_handle,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        n: i64,\n        k: i64,\n        alpha: *const rocblas_double_complex,\n        A: *const rocblas_double_complex,\n        lda: i64,\n        stride_a: rocblas_stride,\n        B: *const rocblas_double_complex,\n        ldb: i64,\n        stride_b: rocblas_stride,\n        beta: *const rocblas_double_complex,\n        C: *mut rocblas_double_complex,\n        ldc: i64,\n        stride_c: rocblas_stride,\n        batch_count: i64,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS EX API </b>\n\n\\details\ngeam_ex performs one of the matrix-matrix operations:\n\nDij = min(alpha * (Aik + Bkj), beta * Cij)\nDij = min(alpha * Aik, alpha * Bkj) + beta * Cij\n\nalpha and beta are scalars, and A, B, C, and D are matrices, with\nop( A ) an m by k matrix, op( B ) a k by n matrix and C and D are m by n matrices.\nC and D may point to the same matrix if their type and leading dimensions are identical.\n\nAik refers to the element at the i-th row and k-th column of op( A ), Bkj refers to\nthe element at the k-th row and j-th column of op( B ), and Cij/Dij refers to the element\nat the i-th row and j-th column of C/D.\n\nSupported types are as follows:\n- rocblas_datatype_f64_r = a_type = b_type = c_type = d_type = compute_type\n- rocblas_datatype_f32_r = a_type = b_type = c_type = d_type = compute_type\n- rocblas_datatype_f16_r = a_type = b_type = c_type = d_type = compute_type\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\ntransA    [rocblas_operation]\nspecifies the form of op( A ).\n@param[in]\ntransB    [rocblas_operation]\nspecifies the form of op( B ).\n@param[in]\nm         [rocblas_int]\nmatrix dimension m.\n@param[in]\nn         [rocblas_int]\nmatrix dimension n.\n@param[in]\nk         [rocblas_int]\nmatrix dimension k.\n@param[in]\nalpha     [const void *]\ndevice pointer or host pointer specifying the scalar alpha. Same datatype as compute_type.\n@param[in]\nA         [void *]\ndevice pointer storing matrix A.\n@param[in]\na_type    [rocblas_datatype]\nspecifies the datatype of matrix A.\n@param[in]\nlda       [rocblas_int]\nspecifies the leading dimension of A\n\nif transA == N, must have lda >= max(1, m)\notherwise, must have lda >= max(1, k)\n@param[in]\nB         [void *]\ndevice pointer storing matrix B.\n@param[in]\nb_type    [rocblas_datatype]\nspecifies the datatype of matrix B.\n@param[in]\nldb       [rocblas_int]\nspecifies the leading dimension of B\n\nif transB == N, must have ldb >= max(1, k)\notherwise, must have ldb >= max(1, n)\n@param[in]\nbeta      [const void *]\ndevice pointer or host pointer specifying the scalar beta. Same datatype as compute_type.\n@param[in]\nC         [void *]\ndevice pointer storing matrix C.\n@param[in]\nc_type    [rocblas_datatype]\nspecifies the datatype of matrix C.\n@param[in]\nldc       [rocblas_int]\nspecifies the leading dimension of C, must have ldc >= max(1, m).\n@param[out]\nD         [void *]\ndevice pointer storing matrix D.\nIf D and C pointers are to the same matrix then d_type must equal c_type and ldd must equal ldc\nor the respective invalid status will be returned.\n@param[in]\nd_type    [rocblas_datatype]\nspecifies the datatype of matrix D.\n@param[in]\nldd       [rocblas_int]\nspecifies the leading dimension of D, must have ldd >= max(1, m).\n@param[in]\ncompute_type\n[rocblas_datatype]\nspecifies the datatype of computation.\n@param[in]\ngeam_ex_op [rocblas_geam_ex_operation]\nenumerant specifying the operation type, support for rocblas_geam_ex_operation_min_plus and rocblas_geam_ex_operation_plus_min.\n*/\n    pub fn rocblas_geam_ex(\n        handle: rocblas_handle,\n        transA: rocblas_operation,\n        transB: rocblas_operation,\n        m: rocblas_int,\n        n: rocblas_int,\n        k: rocblas_int,\n        alpha: *const ::core::ffi::c_void,\n        A: *const ::core::ffi::c_void,\n        a_type: rocblas_datatype,\n        lda: rocblas_int,\n        B: *const ::core::ffi::c_void,\n        b_type: rocblas_datatype,\n        ldb: rocblas_int,\n        beta: *const ::core::ffi::c_void,\n        C: *const ::core::ffi::c_void,\n        c_type: rocblas_datatype,\n        ldc: rocblas_int,\n        D: *mut ::core::ffi::c_void,\n        d_type: rocblas_datatype,\n        ldd: rocblas_int,\n        compute_type: rocblas_datatype,\n        geam_ex_op: rocblas_geam_ex_operation,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS EX API </b>\n\n\\details\ntrsm_ex solves:\n\nop(A)*X = alpha*B or X*op(A) = alpha*B,\n\nwhere alpha is a scalar, X and B are m by n matrices,\nA is triangular matrix and op(A) is one of\n\nop( A ) = A   or   op( A ) = A^T   or   op( A ) = A^H.\n\nThe matrix X is overwritten on B.\n\nThis function gives the user the ability to reuse the invA matrix between runs.\nIf invA == NULL, rocblas_trsm_ex will automatically calculate invA on every run.\n\nSetting up invA:\nThe accepted invA matrix consists of the packed 128x128 inverses of the diagonal blocks of\nmatrix A, followed by any smaller diagonal block that remains.\nTo set up invA it is recommended that rocblas_trtri_batched be used with matrix A as the input.\n\nDevice memory of size 128 x k should be allocated for invA ahead of time, where k is m when\nrocblas_side_left and is n when rocblas_side_right. The actual number of elements in invA\nshould be passed as invA_size.\n\nTo begin, rocblas_trtri_batched must be called on the full 128x128-sized diagonal blocks of\nmatrix A. Below are the restricted parameters:\n- n = 128\n- ldinvA = 128\n- stride_invA = 128x128\n- batch_count = k / 128,\n\nThen any remaining block may be added:\n- n = k % 128\n- invA = invA + stride_invA * previous_batch_count\n- ldinvA = 128\n- batch_count = 1\n\nAlthough not widespread, some gemm kernels used by trsm_ex may use atomic operations.\nSee Atomic Operations in the API Reference Guide for more information.\n\n@param[in]\nhandle  [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nside    [rocblas_side]\n- rocblas_side_left:       op(A)*X = alpha*B\n- rocblas_side_right:      X*op(A) = alpha*B\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  A is an upper triangular matrix.\n- rocblas_fill_lower:  A is a lower triangular matrix.\n\n@param[in]\ntransA  [rocblas_operation]\n- transB:    op(A) = A.\n- rocblas_operation_transpose:      op(A) = A^T\n- rocblas_operation_conjugate_transpose:  op(A) = A^H\n\n@param[in]\ndiag    [rocblas_diagonal]\n- rocblas_diagonal_unit:     A is assumed to be unit triangular.\n- rocblas_diagonal_non_unit:  A is not assumed to be unit triangular.\n\n@param[in]\nm       [rocblas_int]\nm specifies the number of rows of B. m >= 0.\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of columns of B. n >= 0.\n\n@param[in]\nalpha   [void *]\ndevice pointer or host pointer specifying the scalar alpha. When alpha is\n&zero then A is not referenced, and B need not be set before\nentry.\n\n@param[in]\nA       [void *]\ndevice pointer storing matrix A.\nof dimension ( lda, k ), where k is m\nwhen rocblas_side_left and\nis n when rocblas_side_right\nonly the upper/lower triangular part is accessed.\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A.\n\nif side = rocblas_side_left,  lda >= max( 1, m ),\nif side = rocblas_side_right, lda >= max( 1, n ).\n\n@param[in, out]\nB       [void *]\ndevice pointer storing matrix B.\nB is of dimension ( ldb, n ).\nBefore entry, the leading m by n part of the array B must\ncontain the right-hand side matrix B, and on exit is\noverwritten by the solution matrix X.\n\n@param[in]\nldb    [rocblas_int]\nldb specifies the first dimension of B. ldb >= max( 1, m ).\n\n@param[in]\ninvA    [void *]\ndevice pointer storing the inverse diagonal blocks of A.\ninvA is of dimension ( ld_invA, k ), where k is m\nwhen rocblas_side_left and\nis n when rocblas_side_right.\nld_invA must be equal to 128.\n\n@param[in]\ninvA_size [rocblas_int]\ninvA_size specifies the number of elements of device memory in invA.\n\n@param[in]\ncompute_type [rocblas_datatype]\nspecifies the datatype of computation.\n*/\n    pub fn rocblas_trsm_ex(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const ::core::ffi::c_void,\n        A: *const ::core::ffi::c_void,\n        lda: rocblas_int,\n        B: *mut ::core::ffi::c_void,\n        ldb: rocblas_int,\n        invA: *const ::core::ffi::c_void,\n        invA_size: rocblas_int,\n        compute_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS EX API </b>\n\n\\details\ntrsm_batched_ex solves:\n\nop(A_i)*X_i = alpha*B_i or X_i*op(A_i) = alpha*B_i,\n\nfor i = 1, ..., batch_count; and where alpha is a scalar, X and B are arrays of m by n matrices,\nA is an array of triangular matrix and each op(A_i) is one of\n\nop( A_i ) = A_i   or   op( A_i ) = A_i^T   or   op( A_i ) = A_i^H.\n\nEach matrix X_i is overwritten on B_i.\n\nThis function gives the user the ability to reuse the invA matrix between runs.\nIf invA == NULL, rocblas_trsm_batched_ex will automatically calculate each invA_i on every run.\n\nSetting up invA:\nEach accepted invA_i matrix consists of the packed 128x128 inverses of the diagonal blocks of\nmatrix A_i, followed by any smaller diagonal block that remains.\nTo set up each invA_i it is recommended that rocblas_trtri_batched be used with matrix A_i as the input.\ninvA is an array of pointers of batch_count length holding each invA_i.\n\nDevice memory of size 128 x k should be allocated for each invA_i ahead of time, where k is m when\nrocblas_side_left and is n when rocblas_side_right. The actual number of elements in each invA_i\nshould be passed as invA_size.\n\nTo begin, rocblas_trtri_batched must be called on the full 128x128-sized diagonal blocks of each\nmatrix A_i. Below are the restricted parameters:\n- n = 128\n- ldinvA = 128\n- stride_invA = 128x128\n- batch_count = k / 128,\n\nThen any remaining block may be added:\n- n = k % 128\n- invA = invA + stride_invA * previous_batch_count\n- ldinvA = 128\n- batch_count = 1\n\n@param[in]\nhandle  [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nside    [rocblas_side]\n- rocblas_side_left:       op(A)*X = alpha*B\n- rocblas_side_right:      X*op(A) = alpha*B\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  each A_i is an upper triangular matrix.\n- rocblas_fill_lower:  each A_i is a lower triangular matrix.\n\n@param[in]\ntransA  [rocblas_operation]\n- transB:    op(A) = A.\n- rocblas_operation_transpose:      op(A) = A^T\n- rocblas_operation_conjugate_transpose:  op(A) = A^H\n\n@param[in]\ndiag    [rocblas_diagonal]\n- rocblas_diagonal_unit:     each A_i is assumed to be unit triangular.\n- rocblas_diagonal_non_unit:  each A_i is not assumed to be unit triangular.\n\n@param[in]\nm       [rocblas_int]\nm specifies the number of rows of each B_i. m >= 0.\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of columns of each B_i. n >= 0.\n\n@param[in]\nalpha   [void *]\ndevice pointer or host pointer alpha specifying the scalar alpha. When alpha is\n&zero then A is not referenced, and B need not be set before\nentry.\n\n@param[in]\nA       [void *]\ndevice array of device pointers storing each matrix A_i.\neach A_i is of dimension ( lda, k ), where k is m\nwhen rocblas_side_left and\nis n when rocblas_side_right\nonly the upper/lower triangular part is accessed.\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of each A_i.\n\nif side = rocblas_side_left,  lda >= max( 1, m ),\nif side = rocblas_side_right, lda >= max( 1, n ).\n\n@param[in, out]\nB       [void *]\ndevice array of device pointers storing each matrix B_i.\neach B_i is of dimension ( ldb, n ).\nBefore entry, the leading m by n part of the array B_i must\ncontain the right-hand side matrix B_i, and on exit is\noverwritten by the solution matrix X_i\n\n@param[in]\nldb    [rocblas_int]\nldb specifies the first dimension of each B_i. ldb >= max( 1, m ).\n\n@param[in]\nbatch_count [rocblas_int]\nspecifies how many batches.\n\n@param[in]\ninvA    [void *]\ndevice array of device pointers storing the inverse diagonal blocks of each A_i.\neach invA_i is of dimension ( ld_invA, k ), where k is m\nwhen rocblas_side_left and\nis n when rocblas_side_right.\nld_invA must be equal to 128.\n\n@param[in]\ninvA_size [rocblas_int]\ninvA_size specifies the number of elements of device memory in each invA_i.\n\n@param[in]\ncompute_type [rocblas_datatype]\nspecifies the datatype of computation.\n*/\n    pub fn rocblas_trsm_batched_ex(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const ::core::ffi::c_void,\n        A: *const ::core::ffi::c_void,\n        lda: rocblas_int,\n        B: *mut ::core::ffi::c_void,\n        ldb: rocblas_int,\n        batch_count: rocblas_int,\n        invA: *const ::core::ffi::c_void,\n        invA_size: rocblas_int,\n        compute_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS EX API </b>\n\n\\details\ntrsm_strided_batched_ex solves:\n\nop(A_i)*X_i = alpha*B_i or X_i*op(A_i) = alpha*B_i,\n\nfor i = 1, ..., batch_count; and where alpha is a scalar, X and B are strided batched m by n matrices,\nA is a strided batched triangular matrix and op(A_i) is one of\n\nop( A_i ) = A_i   or   op( A_i ) = A_i^T   or   op( A_i ) = A_i^H.\n\nEach matrix X_i is overwritten on B_i.\n\nThis function gives the user the ability to reuse each invA_i matrix between runs.\nIf invA == NULL, rocblas_trsm_batched_ex will automatically calculate each invA_i on every run.\n\nSetting up invA:\nEach accepted invA_i matrix consists of the packed 128x128 inverses of the diagonal blocks of\nmatrix A_i, followed by any smaller diagonal block that remains.\nTo set up invA_i it is recommended that rocblas_trtri_batched be used with matrix A_i as the input.\ninvA is a contiguous piece of memory holding each invA_i.\n\nDevice memory of size 128 x k should be allocated for each invA_i ahead of time, where k is m when\nrocblas_side_left and is n when rocblas_side_right. The actual number of elements in each invA_i\nshould be passed as invA_size.\n\nTo begin, rocblas_trtri_batched must be called on the full 128x128-sized diagonal blocks of each\nmatrix A_i. Below are the restricted parameters:\n- n = 128\n- ldinvA = 128\n- stride_invA = 128x128\n- batch_count = k / 128\n\nThen any remaining block may be added:\n- n = k % 128\n- invA = invA + stride_invA * previous_batch_count\n- ldinvA = 128\n- batch_count = 1\n\n@param[in]\nhandle  [rocblas_handle]\nhandle to the rocblas library context queue.\n\n@param[in]\nside    [rocblas_side]\n- rocblas_side_left:       op(A)*X = alpha*B\n- rocblas_side_right:      X*op(A) = alpha*B\n\n@param[in]\nuplo    [rocblas_fill]\n- rocblas_fill_upper:  each A_i is an upper triangular matrix.\n- rocblas_fill_lower:  each A_i is a lower triangular matrix.\n\n@param[in]\ntransA  [rocblas_operation]\n- transB:    op(A) = A.\n- rocblas_operation_transpose:      op(A) = A^T\n- rocblas_operation_conjugate_transpose:  op(A) = A^H\n\n@param[in]\ndiag    [rocblas_diagonal]\n- rocblas_diagonal_unit:     each A_i is assumed to be unit triangular.\n- rocblas_diagonal_non_unit:  each A_i is not assumed to be unit triangular.\n\n@param[in]\nm       [rocblas_int]\nm specifies the number of rows of each B_i. m >= 0.\n\n@param[in]\nn       [rocblas_int]\nn specifies the number of columns of each B_i. n >= 0.\n\n@param[in]\nalpha   [void *]\ndevice pointer or host pointer specifying the scalar alpha. When alpha is\n&zero then A is not referenced, and B need not be set before\nentry.\n\n@param[in]\nA       [void *]\ndevice pointer storing matrix A.\nof dimension ( lda, k ), where k is m\nwhen rocblas_side_left and\nis n when rocblas_side_right\nonly the upper/lower triangular part is accessed.\n\n@param[in]\nlda     [rocblas_int]\nlda specifies the first dimension of A.\n\nif side = rocblas_side_left,  lda >= max( 1, m ),\nif side = rocblas_side_right, lda >= max( 1, n ).\n\n@param[in]\nstride_A [rocblas_stride]\nThe stride between each A matrix.\n\n@param[in, out]\nB       [void *]\ndevice pointer pointing to first matrix B_i.\neach B_i is of dimension ( ldb, n ).\nBefore entry, the leading m by n part of each array B_i must\ncontain the right-hand side of matrix B_i, and on exit is\noverwritten by the solution matrix X_i.\n\n@param[in]\nldb    [rocblas_int]\nldb specifies the first dimension of each B_i. ldb >= max( 1, m ).\n\n@param[in]\nstride_B [rocblas_stride]\nThe stride between each B_i matrix.\n\n@param[in]\nbatch_count [rocblas_int]\nspecifies how many batches.\n\n@param[in]\ninvA    [void *]\ndevice pointer storing the inverse diagonal blocks of each A_i.\ninvA points to the first invA_1.\neach invA_i is of dimension ( ld_invA, k ), where k is m\nwhen rocblas_side_left and\nis n when rocblas_side_right.\nld_invA must be equal to 128.\n\n@param[in]\ninvA_size [rocblas_int]\ninvA_size specifies the number of elements of device memory in each invA_i.\n\n@param[in]\nstride_invA [rocblas_stride]\nThe stride between each invA matrix.\n\n@param[in]\ncompute_type [rocblas_datatype]\nspecifies the datatype of computation.\n*/\n    pub fn rocblas_trsm_strided_batched_ex(\n        handle: rocblas_handle,\n        side: rocblas_side,\n        uplo: rocblas_fill,\n        transA: rocblas_operation,\n        diag: rocblas_diagonal,\n        m: rocblas_int,\n        n: rocblas_int,\n        alpha: *const ::core::ffi::c_void,\n        A: *const ::core::ffi::c_void,\n        lda: rocblas_int,\n        stride_A: rocblas_stride,\n        B: *mut ::core::ffi::c_void,\n        ldb: rocblas_int,\n        stride_B: rocblas_stride,\n        batch_count: rocblas_int,\n        invA: *const ::core::ffi::c_void,\n        invA_size: rocblas_int,\n        stride_invA: rocblas_stride,\n        compute_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS EX API </b>\n\n\\details\naxpy_ex   computes constant alpha multiplied by vector x, plus vector y.\n\ny := alpha * x + y\n\nCurrently supported datatypes are as follows:\n\n-------------------------------------------------\n| alpha_type | x_type | y_type | execution_type |\n|------------|--------|--------|----------------|\n|  bf16_r    | bf16_r |  bf16_r|      f32_r     |\n|  f32_r     | bf16_r |  bf16_r|      f32_r     |\n|  f16_r     | f16_r  |  f16_r |      f16_r     |\n|  f16_r     | f16_r  |  f16_r |      f32_r     |\n|  f32_r     | f16_r  |  f16_r |      f32_r     |\n|  f32_r     | f32_r  |  f32_r |      f32_r     |\n|  f64_r     | f64_r  |  f64_r |      f64_r     |\n|  f32_c     | f32_c  |  f32_c |      f32_c     |\n|  f64_c     | f64_c  |  f64_c |      f64_c     |\n-------------------------------------------------\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nthe number of elements in x and y.\n@param[in]\nalpha     device pointer or host pointer to specify the scalar alpha.\n@param[in]\nalpha_type [rocblas_datatype]\nspecifies the datatype of alpha.\n@param[in]\nx         device pointer storing vector x.\n@param[in]\nx_type [rocblas_datatype]\nspecifies the datatype of vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n@param[in, out]\ny         device pointer storing vector y.\n@param[in]\ny_type [rocblas_datatype]\nspecifies the datatype of vector y.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of y.\n@param[in]\nexecution_type [rocblas_datatype]\nspecifies the datatype of computation.\n*/\n    pub fn rocblas_axpy_ex(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const ::core::ffi::c_void,\n        alpha_type: rocblas_datatype,\n        x: *const ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: rocblas_int,\n        y: *mut ::core::ffi::c_void,\n        y_type: rocblas_datatype,\n        incy: rocblas_int,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_axpy_ex_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const ::core::ffi::c_void,\n        alpha_type: rocblas_datatype,\n        x: *const ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: i64,\n        y: *mut ::core::ffi::c_void,\n        y_type: rocblas_datatype,\n        incy: i64,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS EX API </b>\n\n\\details\naxpy_batched_ex   computes constant alpha multiplied by vector x, plus vector y over\na set of batched vectors.\n\ny := alpha * x + y\n\nCurrently supported datatypes are as follows:\n\n-------------------------------------------------\n| alpha_type | x_type | y_type | execution_type |\n|------------|--------|--------|----------------|\n|  bf16_r    | bf16_r |  bf16_r|      f32_r     |\n|  f32_r     | bf16_r |  bf16_r|      f32_r     |\n|  f16_r     | f16_r  |  f16_r |      f16_r     |\n|  f16_r     | f16_r  |  f16_r |      f32_r     |\n|  f32_r     | f16_r  |  f16_r |      f32_r     |\n|  f32_r     | f32_r  |  f32_r |      f32_r     |\n|  f64_r     | f64_r  |  f64_r |      f64_r     |\n|  f32_c     | f32_c  |  f32_c |      f32_c     |\n|  f64_c     | f64_c  |  f64_c |      f64_c     |\n-------------------------------------------------\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nthe number of elements in each x_i and y_i.\n@param[in]\nalpha     device pointer or host pointer to specify the scalar alpha.\n@param[in]\nalpha_type [rocblas_datatype]\nspecifies the datatype of alpha.\n@param[in]\nx         device array of device pointers storing each vector x_i.\n@param[in]\nx_type [rocblas_datatype]\nspecifies the datatype of each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in, out]\ny         device array of device pointers storing each vector y_i.\n@param[in]\ny_type [rocblas_datatype]\nspecifies the datatype of each vector y_i.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of each y_i.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n@param[in]\nexecution_type [rocblas_datatype]\nspecifies the datatype of computation.\n*/\n    pub fn rocblas_axpy_batched_ex(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const ::core::ffi::c_void,\n        alpha_type: rocblas_datatype,\n        x: *const ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: rocblas_int,\n        y: *mut ::core::ffi::c_void,\n        y_type: rocblas_datatype,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_axpy_batched_ex_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const ::core::ffi::c_void,\n        alpha_type: rocblas_datatype,\n        x: *const ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: i64,\n        y: *mut ::core::ffi::c_void,\n        y_type: rocblas_datatype,\n        incy: i64,\n        batch_count: i64,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS EX API </b>\n\n\\details\naxpy_strided_batched_ex   computes constant alpha multiplied by vector x, plus vector y over\na set of strided batched vectors.\n\ny := alpha * x + y\n\nCurrently supported datatypes are as follows:\n\n-------------------------------------------------\n| alpha_type | x_type | y_type | execution_type |\n|------------|--------|--------|----------------|\n|  bf16_r    | bf16_r |  bf16_r|      f32_r     |\n|  f32_r     | bf16_r |  bf16_r|      f32_r     |\n|  f16_r     | f16_r  |  f16_r |      f16_r     |\n|  f16_r     | f16_r  |  f16_r |      f32_r     |\n|  f32_r     | f16_r  |  f16_r |      f32_r     |\n|  f32_r     | f32_r  |  f32_r |      f32_r     |\n|  f64_r     | f64_r  |  f64_r |      f64_r     |\n|  f32_c     | f32_c  |  f32_c |      f32_c     |\n|  f64_c     | f64_c  |  f64_c |      f64_c     |\n-------------------------------------------------\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nthe number of elements in each x_i and y_i.\n@param[in]\nalpha     device pointer or host pointer to specify the scalar alpha.\n@param[in]\nalpha_type [rocblas_datatype]\nspecifies the datatype of alpha.\n@param[in]\nx         device pointer to the first vector x_1.\n@param[in]\nx_type [rocblas_datatype]\nspecifies the datatype of each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\nstridex   [rocblas_stride]\nstride from the start of one vector (x_i) to the next one (x_i+1).\nThere are no restrictions placed on stridex. However, ensure that stridex is of appropriate size. For a typical\ncase this means stridex >= n * incx.\n@param[in, out]\ny         device pointer to the first vector y_1.\n@param[in]\ny_type [rocblas_datatype]\nspecifies the datatype of each vector y_i.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of each y_i.\n@param[in]\nstridey   [rocblas_stride]\nstride from the start of one vector (y_i) to the next one (y_i+1).\nThere are no restrictions placed on stridey. However, ensure that stridey is of appropriate size. For a typical\ncase this means stridey >= n * incy.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n@param[in]\nexecution_type [rocblas_datatype]\nspecifies the datatype of computation.\n*/\n    pub fn rocblas_axpy_strided_batched_ex(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const ::core::ffi::c_void,\n        alpha_type: rocblas_datatype,\n        x: *const ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        y: *mut ::core::ffi::c_void,\n        y_type: rocblas_datatype,\n        incy: rocblas_int,\n        stridey: rocblas_stride,\n        batch_count: rocblas_int,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_axpy_strided_batched_ex_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const ::core::ffi::c_void,\n        alpha_type: rocblas_datatype,\n        x: *const ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: i64,\n        stridex: rocblas_stride,\n        y: *mut ::core::ffi::c_void,\n        y_type: rocblas_datatype,\n        incy: i64,\n        stridey: rocblas_stride,\n        batch_count: i64,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS EX API </b>\n\n\\details\ndot_ex  performs the dot product of vectors x and y.\n\nresult = x * y;\n\ndotc_ex  performs the dot product of the conjugate of complex vector x and complex vector y\n\nresult = conjugate (x) * y;\n\nCurrently supported datatypes are as follows:\n\n--------------------------------------------------\n| x_type | y_type | result_type | execution_type |\n|--------|--------|-------------|----------------|\n| f16_r  | f16_r  |    f16_r    |     f16_r      |\n| f16_r  | f16_r  |    f16_r    |     f32_r      |\n| bf16_r | bf16_r |    bf16_r   |     f32_r      |\n| f32_r  | f32_r  |    f32_r    |     f32_r      |\n| f32_r  | f32_r  |    f64_r    |     f64_r      |\n| f64_r  | f64_r  |    f64_r    |     f64_r      |\n| f32_c  | f32_c  |    f32_c    |     f32_c      |\n| f64_c  | f64_c  |    f64_c    |     f64_c      |\n--------------------------------------------------\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nthe number of elements in x and y.\n@param[in]\nx         device pointer storing vector x.\n@param[in]\nx_type [rocblas_datatype]\nspecifies the datatype of vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of y.\n@param[in]\ny         device pointer storing vector y.\n@param[in]\ny_type [rocblas_datatype]\nspecifies the datatype of vector y.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of y.\n@param[in, out]\nresult\ndevice pointer or host pointer to store the dot product.\nreturn is 0.0 if n <= 0.\n@param[in]\nresult_type [rocblas_datatype]\nspecifies the datatype of the result.\n@param[in]\nexecution_type [rocblas_datatype]\nspecifies the datatype of computation.\n*/\n    pub fn rocblas_dot_ex(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: rocblas_int,\n        y: *const ::core::ffi::c_void,\n        y_type: rocblas_datatype,\n        incy: rocblas_int,\n        result: *mut ::core::ffi::c_void,\n        result_type: rocblas_datatype,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dotc_ex(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: rocblas_int,\n        y: *const ::core::ffi::c_void,\n        y_type: rocblas_datatype,\n        incy: rocblas_int,\n        result: *mut ::core::ffi::c_void,\n        result_type: rocblas_datatype,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dot_ex_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: i64,\n        y: *const ::core::ffi::c_void,\n        y_type: rocblas_datatype,\n        incy: i64,\n        result: *mut ::core::ffi::c_void,\n        result_type: rocblas_datatype,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dotc_ex_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: i64,\n        y: *const ::core::ffi::c_void,\n        y_type: rocblas_datatype,\n        incy: i64,\n        result: *mut ::core::ffi::c_void,\n        result_type: rocblas_datatype,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS EX API </b>\n\n\\details\ndot_batched_ex performs a batch of dot products of vectors x and y.\n\nresult_i = x_i * y_i;\n\ndotc_batched_ex  performs a batch of dot products of the conjugate of complex vector x and complex vector y\n\nresult_i = conjugate (x_i) * y_i;\n\nwhere (x_i, y_i) is the i-th instance of the batch.\nx_i and y_i are vectors, for i = 1, ..., batch_count\n\nCurrently supported datatypes are as follows:\n\n--------------------------------------------------\n| x_type | y_type | result_type | execution_type |\n|--------|--------|-------------|----------------|\n| f16_r  | f16_r  |    f16_r    |     f16_r      |\n| f16_r  | f16_r  |    f16_r    |     f32_r      |\n| bf16_r | bf16_r |    bf16_r   |     f32_r      |\n| f32_r  | f32_r  |    f32_r    |     f32_r      |\n| f32_r  | f32_r  |    f64_r    |     f64_r      |\n| f64_r  | f64_r  |    f64_r    |     f64_r      |\n| f32_c  | f32_c  |    f32_c    |     f32_c      |\n| f64_c  | f64_c  |    f64_c    |     f64_c      |\n--------------------------------------------------\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nthe number of elements in each x_i and y_i.\n@param[in]\nx         device array of device pointers storing each vector x_i.\n@param[in]\nx_type [rocblas_datatype]\nspecifies the datatype of each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\ny         device array of device pointers storing each vector y_i.\n@param[in]\ny_type [rocblas_datatype]\nspecifies the datatype of each vector y_i.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of each y_i.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n@param[in, out]\nresult\ndevice array or host array of batch_count size to store the dot products of each batch.\nreturn 0.0 for each element if n <= 0.\n@param[in]\nresult_type [rocblas_datatype]\nspecifies the datatype of the result.\n@param[in]\nexecution_type [rocblas_datatype]\nspecifies the datatype of computation.\n*/\n    pub fn rocblas_dot_batched_ex(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: rocblas_int,\n        y: *const ::core::ffi::c_void,\n        y_type: rocblas_datatype,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n        result: *mut ::core::ffi::c_void,\n        result_type: rocblas_datatype,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dotc_batched_ex(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: rocblas_int,\n        y: *const ::core::ffi::c_void,\n        y_type: rocblas_datatype,\n        incy: rocblas_int,\n        batch_count: rocblas_int,\n        result: *mut ::core::ffi::c_void,\n        result_type: rocblas_datatype,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dot_batched_ex_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: i64,\n        y: *const ::core::ffi::c_void,\n        y_type: rocblas_datatype,\n        incy: i64,\n        batch_count: i64,\n        result: *mut ::core::ffi::c_void,\n        result_type: rocblas_datatype,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dotc_batched_ex_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: i64,\n        y: *const ::core::ffi::c_void,\n        y_type: rocblas_datatype,\n        incy: i64,\n        batch_count: i64,\n        result: *mut ::core::ffi::c_void,\n        result_type: rocblas_datatype,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS EX API </b>\n\n\\details\ndot_strided_batched_ex  performs a batch of dot products of vectors x and y.\n\nresult_i = x_i * y_i;\n\ndotc_strided_batched_ex  performs a batch of dot products of the conjugate of complex vector x and complex vector y\n\nresult_i = conjugate (x_i) * y_i;\n\nwhere (x_i, y_i) is the i-th instance of the batch.\nx_i and y_i are vectors, for i = 1, ..., batch_count\n\nCurrently supported datatypes are as follows:\n\n--------------------------------------------------\n| x_type | y_type | result_type | execution_type |\n|--------|--------|-------------|----------------|\n| f16_r  | f16_r  |    f16_r    |     f16_r      |\n| f16_r  | f16_r  |    f16_r    |     f32_r      |\n| bf16_r | bf16_r |    bf16_r   |     f32_r      |\n| f32_r  | f32_r  |    f32_r    |     f32_r      |\n| f32_r  | f32_r  |    f64_r    |     f64_r      |\n| f64_r  | f64_r  |    f64_r    |     f64_r      |\n| f32_c  | f32_c  |    f32_c    |     f32_c      |\n| f64_c  | f64_c  |    f64_c    |     f64_c      |\n--------------------------------------------------\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nthe number of elements in each x_i and y_i.\n@param[in]\nx         device pointer to the first vector (x_1) in the batch.\n@param[in]\nx_type [rocblas_datatype]\nspecifies the datatype of each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\nstride_x    [rocblas_stride]\nstride from the start of one vector (x_i) and the next one (x_i+1)\n@param[in]\ny         device pointer to the first vector (y_1) in the batch.\n@param[in]\ny_type [rocblas_datatype]\nspecifies the datatype of each vector y_i.\n@param[in]\nincy      [rocblas_int]\nspecifies the increment for the elements of each y_i.\n@param[in]\nstride_y    [rocblas_stride]\nstride from the start of one vector (y_i) and the next one (y_i+1)\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n@param[in, out]\nresult\ndevice array or host array of batch_count size to store the dot products of each batch.\nreturn 0.0 for each element if n <= 0.\n@param[in]\nresult_type [rocblas_datatype]\nspecifies the datatype of the result.\n@param[in]\nexecution_type [rocblas_datatype]\nspecifies the datatype of computation.\n*/\n    pub fn rocblas_dot_strided_batched_ex(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        y: *const ::core::ffi::c_void,\n        y_type: rocblas_datatype,\n        incy: rocblas_int,\n        stride_y: rocblas_stride,\n        batch_count: rocblas_int,\n        result: *mut ::core::ffi::c_void,\n        result_type: rocblas_datatype,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dotc_strided_batched_ex(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        y: *const ::core::ffi::c_void,\n        y_type: rocblas_datatype,\n        incy: rocblas_int,\n        stride_y: rocblas_stride,\n        batch_count: rocblas_int,\n        result: *mut ::core::ffi::c_void,\n        result_type: rocblas_datatype,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dot_strided_batched_ex_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: i64,\n        stride_x: rocblas_stride,\n        y: *const ::core::ffi::c_void,\n        y_type: rocblas_datatype,\n        incy: i64,\n        stride_y: rocblas_stride,\n        batch_count: i64,\n        result: *mut ::core::ffi::c_void,\n        result_type: rocblas_datatype,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_dotc_strided_batched_ex_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: i64,\n        stride_x: rocblas_stride,\n        y: *const ::core::ffi::c_void,\n        y_type: rocblas_datatype,\n        incy: i64,\n        stride_y: rocblas_stride,\n        batch_count: i64,\n        result: *mut ::core::ffi::c_void,\n        result_type: rocblas_datatype,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief BLAS_EX API\n\n\\details\nnrm2_ex computes the euclidean norm of a real or complex vector.\n\nresult := sqrt( x'*x ) for real vectors\nresult := sqrt( x**H*x ) for complex vectors\n\nCurrently supported datatypes are as follows:\n\n-------------------------------------\n|  x_type | result | execution_type |\n|---------|--------|----------------|\n|  bf16_r |  bf16_r|     f32_r      |\n|  f16_r  |  f16_r |     f32_r      |\n|  f32_r  |  f32_r |     f32_r      |\n|  f64_r  |  f64_r |     f64_r      |\n|  f32_c  |  f32_r |     f32_r      |\n|  f64_c  |  f64_r |     f64_r      |\n-------------------------------------\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nthe number of elements in x.\n@param[in]\nx         device pointer storing vector x.\n@param[in]\nx_type [rocblas_datatype]\nspecifies the datatype of the vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of y.\n@param[in, out]\nresults\ndevice pointer or host pointer to store the nrm2 product.\nreturn is 0.0 if n, incx<=0.\n@param[in]\nresult_type [rocblas_datatype]\nspecifies the datatype of the result.\n@param[in]\nexecution_type [rocblas_datatype]\nspecifies the datatype of computation.\n*/\n    pub fn rocblas_nrm2_ex(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: rocblas_int,\n        results: *mut ::core::ffi::c_void,\n        result_type: rocblas_datatype,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_nrm2_ex_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: i64,\n        results: *mut ::core::ffi::c_void,\n        result_type: rocblas_datatype,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief BLAS_EX API\n\n\\details\nnrm2_batched_ex computes the euclidean norm over a batch of real or complex vectors.\n\nresult := sqrt( x_i'*x_i ) for real vectors x, for i = 1, ..., batch_count\nresult := sqrt( x_i**H*x_i ) for complex vectors x, for i = 1, ..., batch_count\n\nCurrently supported datatypes are as follows:\n\n-------------------------------------\n|  x_type | result | execution_type |\n|---------|--------|----------------|\n|  bf16_r |  bf16_r|     f32_r      |\n|  f16_r  |  f16_r |     f32_r      |\n|  f32_r  |  f32_r |     f32_r      |\n|  f64_r  |  f64_r |     f64_r      |\n|  f32_c  |  f32_r |     f32_r      |\n|  f64_c  |  f64_r |     f64_r      |\n-------------------------------------\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nnumber of elements in each x_i.\n@param[in]\nx         device array of device pointers storing each vector x_i.\n@param[in]\nx_type [rocblas_datatype]\nspecifies the datatype of each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i. incx must be > 0.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n@param[out]\nresults\ndevice pointer or host pointer to array of batch_count size for nrm2 results.\nreturn is 0.0 for each element if n <= 0, incx<=0.\n@param[in]\nresult_type [rocblas_datatype]\nspecifies the datatype of the result.\n@param[in]\nexecution_type [rocblas_datatype]\nspecifies the datatype of computation.\n*/\n    pub fn rocblas_nrm2_batched_ex(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n        results: *mut ::core::ffi::c_void,\n        result_type: rocblas_datatype,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_nrm2_batched_ex_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: i64,\n        batch_count: i64,\n        results: *mut ::core::ffi::c_void,\n        result_type: rocblas_datatype,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief BLAS_EX API\n\n\\details\nnrm2_strided_batched_ex computes the euclidean norm over a batch of real or complex vectors.\n\nresult := sqrt( x_i'*x_i ) for real vectors x, for i = 1, ..., batch_count\nresult := sqrt( x_i**H*x_i ) for complex vectors, for i = 1, ..., batch_count\n\nCurrently supported datatypes are as follows:\n\n-------------------------------------\n|  x_type | result | execution_type |\n|---------|--------|----------------|\n|  bf16_r |  bf16_r|     f32_r      |\n|  f16_r  |  f16_r |     f32_r      |\n|  f32_r  |  f32_r |     f32_r      |\n|  f64_r  |  f64_r |     f64_r      |\n|  f32_c  |  f32_r |     f32_r      |\n|  f64_c  |  f64_r |     f64_r      |\n-------------------------------------\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nnumber of elements in each x_i.\n@param[in]\nx         device pointer to the first vector x_1.\n@param[in]\nx_type [rocblas_datatype]\nspecifies the datatype of each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i. incx must be > 0.\n@param[in]\nstride_x  [rocblas_stride]\nstride from the start of one vector (x_i) and the next one (x_i+1).\nThere are no restrictions placed on stride_x. However, ensure that stride_x is of appropriate size. For a typical\ncase this means stride_x >= n * incx.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n@param[out]\nresults\ndevice pointer or host pointer to array for storing contiguous batch_count results.\nreturn is 0.0 for each element if n <= 0, incx<=0.\n@param[in]\nresult_type [rocblas_datatype]\nspecifies the datatype of the result.\n@param[in]\nexecution_type [rocblas_datatype]\nspecifies the datatype of computation.\n*/\n    pub fn rocblas_nrm2_strided_batched_ex(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *const ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        batch_count: rocblas_int,\n        results: *mut ::core::ffi::c_void,\n        result_type: rocblas_datatype,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_nrm2_strided_batched_ex_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *const ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: i64,\n        stride_x: rocblas_stride,\n        batch_count: i64,\n        results: *mut ::core::ffi::c_void,\n        result_type: rocblas_datatype,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS EX API </b>\n\n\\details\nrot_ex applies the Givens rotation matrix defined by c=cos(alpha) and s=sin(alpha) to vectors x and y.\nScalars c and s may be stored in either host or device memory. Location is specified by calling rocblas_set_pointer_mode.\n\nIn the case where cs_type is real:\n\nx := c * x + s * y\ny := c * y - s * x\n\nIn the case where cs_type is complex, the imaginary part of c is ignored:\n\nx := real(c) * x + s * y\ny := real(c) * y - conj(s) * x\n\nCurrently supported datatypes are as follows:\n\n------------------------------------------------\n|  x_type | y_type  | cs_type | execution_type |\n|---------|---------|---------|----------------|\n|  bf16_r |  bf16_r | bf16_r  |  f32_r         |\n|  f16_r  |  f16_r  | f16_r   |  f32_r         |\n|  f32_r  |  f32_r  | f32_r   |  f32_r         |\n|  f64_r  |  f64_r  | f64_r   |  f64_r         |\n|  f32_c  |  f32_c  | f32_c   |  f32_c         |\n|  f32_c  |  f32_c  | f32_r   |  f32_c         |\n|  f64_c  |  f64_c  | f64_c   |  f64_c         |\n|  f64_c  |  f64_c  | f64_r   |  f64_c         |\n------------------------------------------------\n\n@param[in]\nhandle  [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn       [rocblas_int]\nnumber of elements in the x and y vectors.\n@param[in, out]\nx       device pointer storing vector x.\n@param[in]\nx_type [rocblas_datatype]\nspecifies the datatype of vector x.\n@param[in]\nincx    [rocblas_int]\nspecifies the increment between elements of x.\n@param[in, out]\ny       device pointer storing vector y.\n@param[in]\ny_type [rocblas_datatype]\nspecifies the datatype of vector y.\n@param[in]\nincy    [rocblas_int]\nspecifies the increment between elements of y.\n@param[in]\nc       device pointer or host pointer storing scalar cosine component of the rotation matrix.\n@param[in]\ns       device pointer or host pointer storing scalar sine component of the rotation matrix.\n@param[in]\ncs_type [rocblas_datatype]\nspecifies the datatype of c and s.\n@param[in]\nexecution_type [rocblas_datatype]\nspecifies the datatype of computation.\n*/\n    pub fn rocblas_rot_ex(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *mut ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: rocblas_int,\n        y: *mut ::core::ffi::c_void,\n        y_type: rocblas_datatype,\n        incy: rocblas_int,\n        c: *const ::core::ffi::c_void,\n        s: *const ::core::ffi::c_void,\n        cs_type: rocblas_datatype,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_rot_ex_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *mut ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: i64,\n        y: *mut ::core::ffi::c_void,\n        y_type: rocblas_datatype,\n        incy: i64,\n        c: *const ::core::ffi::c_void,\n        s: *const ::core::ffi::c_void,\n        cs_type: rocblas_datatype,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS EX API </b>\n\n\\details\nrot_batched_ex applies the Givens rotation matrix defined by c=cos(alpha) and s=sin(alpha) to batched vectors x_i and y_i, for i = 1, ..., batch_count.\nScalars c and s may be stored in either host or device memory. Location is specified by calling rocblas_set_pointer_mode.\n\nIn the case where cs_type is real:\n\nx := c * x + s * y\ny := c * y - s * x\n\nIn the case where cs_type is complex, the imaginary part of c is ignored:\n\nx := real(c) * x + s * y\ny := real(c) * y - conj(s) * x\n\nCurrently supported datatypes are as follows:\n\n------------------------------------------------\n|  x_type | y_type  | cs_type | execution_type |\n|---------|---------|---------|----------------|\n|  bf16_r |  bf16_r | bf16_r  |  f32_r         |\n|  f16_r  |  f16_r  | f16_r   |  f32_r         |\n|  f32_r  |  f32_r  | f32_r   |  f32_r         |\n|  f64_r  |  f64_r  | f64_r   |  f64_r         |\n|  f32_c  |  f32_c  | f32_c   |  f32_c         |\n|  f32_c  |  f32_c  | f32_r   |  f32_c         |\n|  f64_c  |  f64_c  | f64_c   |  f64_c         |\n|  f64_c  |  f64_c  | f64_r   |  f64_c         |\n------------------------------------------------\n\n@param[in]\nhandle  [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn       [rocblas_int]\nnumber of elements in each x_i and y_i vectors.\n@param[in, out]\nx       device array of deivce pointers storing each vector x_i.\n@param[in]\nx_type [rocblas_datatype]\nspecifies the datatype of each vector x_i.\n@param[in]\nincx    [rocblas_int]\nspecifies the increment between elements of each x_i.\n@param[in, out]\ny       device array of device pointers storing each vector y_i.\n@param[in]\ny_type [rocblas_datatype]\nspecifies the datatype of each vector y_i.\n@param[in]\nincy    [rocblas_int]\nspecifies the increment between elements of each y_i.\n@param[in]\nc       device pointer or host pointer to scalar cosine component of the rotation matrix.\n@param[in]\ns       device pointer or host pointer to scalar sine component of the rotation matrix.\n@param[in]\ncs_type [rocblas_datatype]\nspecifies the datatype of c and s.\n@param[in]\nbatch_count [rocblas_int]\nthe number of x and y arrays, the number of batches.\n@param[in]\nexecution_type [rocblas_datatype]\nspecifies the datatype of computation.\n*/\n    pub fn rocblas_rot_batched_ex(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *mut ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: rocblas_int,\n        y: *mut ::core::ffi::c_void,\n        y_type: rocblas_datatype,\n        incy: rocblas_int,\n        c: *const ::core::ffi::c_void,\n        s: *const ::core::ffi::c_void,\n        cs_type: rocblas_datatype,\n        batch_count: rocblas_int,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_rot_batched_ex_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *mut ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: i64,\n        y: *mut ::core::ffi::c_void,\n        y_type: rocblas_datatype,\n        incy: i64,\n        c: *const ::core::ffi::c_void,\n        s: *const ::core::ffi::c_void,\n        cs_type: rocblas_datatype,\n        batch_count: i64,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS Level 1 API </b>\n\n\\details\nrot_strided_batched_ex applies the Givens rotation matrix defined by c=cos(alpha) and s=sin(alpha) to strided batched vectors x_i and y_i, for i = 1, ..., batch_count.\nScalars c and s may be stored in either host or device memory. Location is specified by calling rocblas_set_pointer_mode.\n\nIn the case where cs_type is real:\n\nx := c * x + s * y\ny := c * y - s * x\n\nIn the case where cs_type is complex, the imaginary part of c is ignored:\n\nx := real(c) * x + s * y\ny := real(c) * y - conj(s) * x\n\nCurrently supported datatypes are as follows:\n\n------------------------------------------------\n|  x_type | y_type  | cs_type | execution_type |\n|---------|---------|---------|----------------|\n|  bf16_r |  bf16_r | bf16_r  |  f32_r         |\n|  f16_r  |  f16_r  | f16_r   |  f32_r         |\n|  f32_r  |  f32_r  | f32_r   |  f32_r         |\n|  f64_r  |  f64_r  | f64_r   |  f64_r         |\n|  f32_c  |  f32_c  | f32_c   |  f32_c         |\n|  f32_c  |  f32_c  | f32_r   |  f32_c         |\n|  f64_c  |  f64_c  | f64_c   |  f64_c         |\n|  f64_c  |  f64_c  | f64_r   |  f64_c         |\n------------------------------------------------\n\n@param[in]\nhandle  [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn       [rocblas_int]\nnumber of elements in each x_i and y_i vectors.\n@param[in, out]\nx       device pointer to the first vector x_1.\n@param[in]\nx_type [rocblas_datatype]\nspecifies the datatype of each vector x_i.\n@param[in]\nincx    [rocblas_int]\nspecifies the increment between elements of each x_i.\n@param[in]\nstride_x [rocblas_stride]\nspecifies the increment from the beginning of x_i to the beginning of x_(i+1)\n@param[in, out]\ny       device pointer to the first vector y_1.\n@param[in]\ny_type [rocblas_datatype]\nspecifies the datatype of each vector y_i.\n@param[in]\nincy    [rocblas_int]\nspecifies the increment between elements of each y_i.\n@param[in]\nstride_y [rocblas_stride]\nspecifies the increment from the beginning of y_i to the beginning of y_(i+1)\n@param[in]\nc       device pointer or host pointer to scalar cosine component of the rotation matrix.\n@param[in]\ns       device pointer or host pointer to scalar sine component of the rotation matrix.\n@param[in]\ncs_type [rocblas_datatype]\nspecifies the datatype of c and s.\n@param[in]\nbatch_count [rocblas_int]\nthe number of x and y arrays, the number of batches.\n@param[in]\nexecution_type [rocblas_datatype]\nspecifies the datatype of computation.\n*/\n    pub fn rocblas_rot_strided_batched_ex(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        x: *mut ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: rocblas_int,\n        stride_x: rocblas_stride,\n        y: *mut ::core::ffi::c_void,\n        y_type: rocblas_datatype,\n        incy: rocblas_int,\n        stride_y: rocblas_stride,\n        c: *const ::core::ffi::c_void,\n        s: *const ::core::ffi::c_void,\n        cs_type: rocblas_datatype,\n        batch_count: rocblas_int,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_rot_strided_batched_ex_64(\n        handle: rocblas_handle,\n        n: i64,\n        x: *mut ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: i64,\n        stride_x: rocblas_stride,\n        y: *mut ::core::ffi::c_void,\n        y_type: rocblas_datatype,\n        incy: i64,\n        stride_y: rocblas_stride,\n        c: *const ::core::ffi::c_void,\n        s: *const ::core::ffi::c_void,\n        cs_type: rocblas_datatype,\n        batch_count: i64,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS EX API </b>\n\n\\details\nscal_ex  scales each element of vector x with scalar alpha.\n\nx := alpha * x\n\nCurrently supported datatypes are as follows:\n\n----------------------------------------\n| alpha_type | x_type | execution_type |\n|------------|--------|----------------|\n|  f32_r     | bf16_r |     f32_r      |\n|  bf16_r    | bf16_r |     f32_r      |\n|  f16_r     | f16_r  |     f16_r      |\n|  f16_r     | f16_r  |     f32_r      |\n|  f32_r     | f16_r  |     f32_r      |\n|  f32_r     | f32_r  |     f32_r      |\n|  f64_r     | f64_r  |     f64_r      |\n|  f32_c     | f32_c  |     f32_c      |\n|  f64_c     | f64_c  |     f64_c      |\n|  f32_r     | f32_c  |     f32_c      |\n|  f64_r     | f64_c  |     f64_c      |\n----------------------------------------\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nthe number of elements in x.\n@param[in]\nalpha     device pointer or host pointer for the scalar alpha.\n@param[in]\nalpha_type [rocblas_datatype]\nspecifies the datatype of alpha.\n@param[in, out]\nx         device pointer storing vector x.\n@param[in]\nx_type [rocblas_datatype]\nspecifies the datatype of vector x.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of x.\n@param[in]\nexecution_type [rocblas_datatype]\nspecifies the datatype of computation.\n*/\n    pub fn rocblas_scal_ex(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const ::core::ffi::c_void,\n        alpha_type: rocblas_datatype,\n        x: *mut ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: rocblas_int,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_scal_ex_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const ::core::ffi::c_void,\n        alpha_type: rocblas_datatype,\n        x: *mut ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: i64,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS EX API </b>\n\n\\details\nscal_batched_ex  scales each element of each vector x_i with scalar alpha.\n\nx_i := alpha * x_i\n\nCurrently supported datatypes are as follows:\n\n----------------------------------------\n| alpha_type | x_type | execution_type |\n|------------|--------|----------------|\n|  f32_r     | bf16_r |     f32_r      |\n|  bf16_r    | bf16_r |     f32_r      |\n|  f16_r     | f16_r  |     f16_r      |\n|  f16_r     | f16_r  |     f32_r      |\n|  f32_r     | f16_r  |     f32_r      |\n|  f32_r     | f32_r  |     f32_r      |\n|  f64_r     | f64_r  |     f64_r      |\n|  f32_c     | f32_c  |     f32_c      |\n|  f64_c     | f64_c  |     f64_c      |\n|  f32_r     | f32_c  |     f32_c      |\n|  f64_r     | f64_c  |     f64_c      |\n----------------------------------------\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nthe number of elements in x.\n@param[in]\nalpha     device pointer or host pointer for the scalar alpha.\n@param[in]\nalpha_type [rocblas_datatype]\nspecifies the datatype of alpha.\n@param[in, out]\nx         device array of device pointers storing each vector x_i.\n@param[in]\nx_type [rocblas_datatype]\nspecifies the datatype of each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n@param[in]\nexecution_type [rocblas_datatype]\nspecifies the datatype of computation.\n*/\n    pub fn rocblas_scal_batched_ex(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const ::core::ffi::c_void,\n        alpha_type: rocblas_datatype,\n        x: *mut ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: rocblas_int,\n        batch_count: rocblas_int,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_scal_batched_ex_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const ::core::ffi::c_void,\n        alpha_type: rocblas_datatype,\n        x: *mut ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: i64,\n        batch_count: i64,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** @{\n\\brief <b> BLAS EX API </b>\n\n\\details\nscal_strided_batched_ex  scales each element of vector x with scalar alpha over a set\nof strided batched vectors.\n\nx := alpha * x\n\nCurrently supported datatypes are as follows:\n\n----------------------------------------\n| alpha_type | x_type | execution_type |\n|------------|--------|----------------|\n|  f32_r     | bf16_r |     f32_r      |\n|  bf16_r    | bf16_r |     f32_r      |\n|  f16_r     | f16_r  |     f16_r      |\n|  f16_r     | f16_r  |     f32_r      |\n|  f32_r     | f16_r  |     f32_r      |\n|  f32_r     | f32_r  |     f32_r      |\n|  f64_r     | f64_r  |     f64_r      |\n|  f32_c     | f32_c  |     f32_c      |\n|  f64_c     | f64_c  |     f64_c      |\n|  f32_r     | f32_c  |     f32_c      |\n|  f64_r     | f64_c  |     f64_c      |\n----------------------------------------\n\n@param[in]\nhandle    [rocblas_handle]\nhandle to the rocblas library context queue.\n@param[in]\nn         [rocblas_int]\nthe number of elements in x.\n@param[in]\nalpha     device pointer or host pointer for the scalar alpha.\n@param[in]\nalpha_type [rocblas_datatype]\nspecifies the datatype of alpha.\n@param[in, out]\nx         device pointer to the first vector x_1.\n@param[in]\nx_type [rocblas_datatype]\nspecifies the datatype of each vector x_i.\n@param[in]\nincx      [rocblas_int]\nspecifies the increment for the elements of each x_i.\n@param[in]\nstridex   [rocblas_stride]\nstride from the start of one vector (x_i) to the next one (x_i+1).\nThere are no restrictions placed on stridex. However, ensure that stridex is of appropriate size. For a typical\ncase this means stridex >= n * incx.\n@param[in]\nbatch_count [rocblas_int]\nnumber of instances in the batch.\n@param[in]\nexecution_type [rocblas_datatype]\nspecifies the datatype of computation.\n\n*/\n    pub fn rocblas_scal_strided_batched_ex(\n        handle: rocblas_handle,\n        n: rocblas_int,\n        alpha: *const ::core::ffi::c_void,\n        alpha_type: rocblas_datatype,\n        x: *mut ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: rocblas_int,\n        stridex: rocblas_stride,\n        batch_count: rocblas_int,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_scal_strided_batched_ex_64(\n        handle: rocblas_handle,\n        n: i64,\n        alpha: *const ::core::ffi::c_void,\n        alpha_type: rocblas_datatype,\n        x: *mut ::core::ffi::c_void,\n        x_type: rocblas_datatype,\n        incx: i64,\n        stridex: rocblas_stride,\n        batch_count: i64,\n        execution_type: rocblas_datatype,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    /** BLAS Auxiliary API\n\n\\details\nrocblas_status_to_string\n\nReturns string representing rocblas_status value\n\n@param[in]\nstatus  [rocblas_status]\nrocBLAS status to convert to string*/\n    pub fn rocblas_status_to_string(\n        status: rocblas_status,\n    ) -> *const ::core::ffi::c_char;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    /** \\brief Initialize rocBLAS on the current HIP device, to avoid costly startup time at the first call on that device.\n\\details\n\nCalling `rocblas_initialize()` allows upfront initialization including device specific kernel setup.\nOtherwise this function is automatically called on the first function call that requires these initializations (mainly GEMM).\n*/\n    pub fn rocblas_initialize();\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\brief   Loads char* buf with the rocblas library version. size_t len\nis the maximum length of char* buf.\n\\details\n\n@param[in, out]\nbuf             pointer to buffer for version string\n\n@param[in]\nlen             length of buf\n*/\n    pub fn rocblas_get_version_string(\n        buf: *mut ::core::ffi::c_char,\n        len: usize,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\brief   Queries the minimum buffer size for a successful call to\n\\ref rocblas_get_version_string\n\\details\n\n@param[out]\nlen             pointer to size_t for storing the length\n*/\n    pub fn rocblas_get_version_string_size(len: *mut usize) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\brief\n\\details\nIndicates that subsequent rocBLAS kernel calls should collect the optimal device memory size in bytes for their given kernel arguments\nand keep track of the maximum.\nEach kernel call can reuse temporary device memory on the same stream so the maximum is collected.\nReturns rocblas_status_size_query_mismatch if another size query is already in progress; returns rocblas_status_success otherwise\n@param[in]\nhandle          rocblas handle*/\n    pub fn rocblas_start_device_memory_size_query(\n        handle: rocblas_handle,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\brief\n\\details\nStops collecting optimal device memory size information.\nReturns rocblas_status_size_query_mismatch if a collection is not underway; rocblas_status_invalid_handle if handle is nullptr;\nrocblas_status_invalid_pointer if size is nullptr; rocblas_status_success otherwise\n@param[in]\nhandle          rocblas handle\n@param[out]\nsize            maximum of the optimal sizes collected*/\n    pub fn rocblas_stop_device_memory_size_query(\n        handle: rocblas_handle,\n        size: *mut usize,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    pub fn rocblas_is_device_memory_size_query(handle: rocblas_handle) -> bool;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_set_optimal_device_memory_size_impl(\n        handle: rocblas_handle,\n        count: usize,\n        ...\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_device_malloc_alloc(\n        handle: rocblas_handle,\n        res: *mut *mut rocblas_device_malloc_base,\n        count: usize,\n        ...\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    pub fn rocblas_device_malloc_success(ptr: *mut rocblas_device_malloc_base) -> bool;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_device_malloc_ptr(\n        ptr: *mut rocblas_device_malloc_base,\n        res: *mut *mut ::core::ffi::c_void,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_device_malloc_get(\n        ptr: *mut rocblas_device_malloc_base,\n        index: usize,\n        res: *mut *mut ::core::ffi::c_void,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocblas_device_malloc_free(\n        ptr: *mut rocblas_device_malloc_base,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    pub fn rocblas_device_malloc_set_default_memory_size(size: usize);\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\brief\n\\details\nGets the current device memory size for the handle.\nReturns rocblas_status_invalid_handle if handle is nullptr; rocblas_status_invalid_pointer if size is nullptr; rocblas_status_success otherwise\n@param[in]\nhandle          rocblas handle\n@param[out]\nsize            current device memory size for the handle*/\n    pub fn rocblas_get_device_memory_size(\n        handle: rocblas_handle,\n        size: *mut usize,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\brief\n\\details\nChanges the size of allocated device memory at runtime.\n\nAny previously allocated device memory managed by the handle is freed.\n\nIf size > 0 sets the device memory size to the specified size (in bytes).\nIf size == 0, frees the memory allocated so far, and lets rocBLAS manage device memory in the future, expanding it when necessary.\nReturns rocblas_status_invalid_handle if handle is nullptr; rocblas_status_invalid_pointer if size is nullptr; rocblas_status_success otherwise\n@param[in]\nhandle          rocblas handle\n@param[in]\nsize            size of allocated device memory*/\n    pub fn rocblas_set_device_memory_size(\n        handle: rocblas_handle,\n        size: usize,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\brief\n\\details\nSets the device workspace for the handle to use.\n\nAny previously allocated device memory managed by the handle is freed.\n\nReturns rocblas_status_invalid_handle if handle is nullptr; rocblas_status_success otherwise\n@param[in]\nhandle          rocblas handle\n@param[in]\naddr            address of workspace memory\n@param[in]\nsize            size of workspace memory\n*/\n    pub fn rocblas_set_workspace(\n        handle: rocblas_handle,\n        addr: *mut ::core::ffi::c_void,\n        size: usize,\n    ) -> rocblas_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    /** \\brief\n\\details\nReturns true when device memory in handle is managed by rocBLAS\n@param[in]\nhandle          rocblas handle*/\n    pub fn rocblas_is_managing_device_memory(handle: rocblas_handle) -> bool;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    /** \\brief\n\\details\nReturns true when device memory in handle is managed by the user\n@param[in]\nhandle          rocblas handle*/\n    pub fn rocblas_is_user_managing_device_memory(handle: rocblas_handle) -> bool;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    pub fn rocblas_abort() -> !;\n}\nimpl rocblas_error {\n    pub const r#invalid_handle: rocblas_error = rocblas_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(1)\n    });\n    pub const r#not_implemented: rocblas_error = rocblas_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(2)\n    });\n    pub const r#invalid_pointer: rocblas_error = rocblas_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3)\n    });\n    pub const r#invalid_size: rocblas_error = rocblas_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(4)\n    });\n    pub const r#memory_error: rocblas_error = rocblas_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(5)\n    });\n    pub const r#internal_error: rocblas_error = rocblas_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(6)\n    });\n    pub const r#perf_degraded: rocblas_error = rocblas_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(7)\n    });\n    pub const r#size_query_mismatch: rocblas_error = rocblas_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(8)\n    });\n    pub const r#size_increased: rocblas_error = rocblas_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(9)\n    });\n    pub const r#size_unchanged: rocblas_error = rocblas_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(10)\n    });\n    pub const r#invalid_value: rocblas_error = rocblas_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(11)\n    });\n    pub const r#continue: rocblas_error = rocblas_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(12)\n    });\n    pub const r#check_numerics_fail: rocblas_error = rocblas_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(13)\n    });\n    pub const r#excluded_from_build: rocblas_error = rocblas_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(14)\n    });\n    pub const r#arch_mismatch: rocblas_error = rocblas_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(15)\n    });\n}\n#[repr(transparent)]\n#[derive(Debug, Hash, Copy, Clone, PartialEq, Eq)]\npub struct rocblas_error(pub ::core::num::NonZeroU32);\npub trait rocblas_statusConsts {\n    const success: rocblas_status = rocblas_status::Ok(());\n    const error_invalid_handle: rocblas_status = rocblas_status::Err(\n        rocblas_error::r#invalid_handle,\n    );\n    const error_not_implemented: rocblas_status = rocblas_status::Err(\n        rocblas_error::r#not_implemented,\n    );\n    const error_invalid_pointer: rocblas_status = rocblas_status::Err(\n        rocblas_error::r#invalid_pointer,\n    );\n    const error_invalid_size: rocblas_status = rocblas_status::Err(\n        rocblas_error::r#invalid_size,\n    );\n    const error_memory_error: rocblas_status = rocblas_status::Err(\n        rocblas_error::r#memory_error,\n    );\n    const error_internal_error: rocblas_status = rocblas_status::Err(\n        rocblas_error::r#internal_error,\n    );\n    const error_perf_degraded: rocblas_status = rocblas_status::Err(\n        rocblas_error::r#perf_degraded,\n    );\n    const error_size_query_mismatch: rocblas_status = rocblas_status::Err(\n        rocblas_error::r#size_query_mismatch,\n    );\n    const error_size_increased: rocblas_status = rocblas_status::Err(\n        rocblas_error::r#size_increased,\n    );\n    const error_size_unchanged: rocblas_status = rocblas_status::Err(\n        rocblas_error::r#size_unchanged,\n    );\n    const error_invalid_value: rocblas_status = rocblas_status::Err(\n        rocblas_error::r#invalid_value,\n    );\n    const error_continue: rocblas_status = rocblas_status::Err(\n        rocblas_error::r#continue,\n    );\n    const error_check_numerics_fail: rocblas_status = rocblas_status::Err(\n        rocblas_error::r#check_numerics_fail,\n    );\n    const error_excluded_from_build: rocblas_status = rocblas_status::Err(\n        rocblas_error::r#excluded_from_build,\n    );\n    const error_arch_mismatch: rocblas_status = rocblas_status::Err(\n        rocblas_error::r#arch_mismatch,\n    );\n}\nimpl rocblas_statusConsts for rocblas_status {}\n#[must_use]\npub type rocblas_status = ::core::result::Result<(), rocblas_error>;\nconst _: fn() = || {\n    let _ = std::mem::transmute::<rocblas_status, u32>;\n};\nunsafe impl Send for rocblas_handle {}\nunsafe impl Sync for rocblas_handle {}\n"
  },
  {
    "path": "ext/rocm_smi-sys/.rustfmt.toml",
    "content": "disable_all_formatting = true\n"
  },
  {
    "path": "ext/rocm_smi-sys/Cargo.toml",
    "content": "[package]\nname = \"rocm_smi-sys\"\nversion = \"0.0.0\"\nauthors = [\"Andrzej Janik <vosen@vosen.pl>\"]\nedition = \"2021\"\n\n[lib]\n"
  },
  {
    "path": "ext/rocm_smi-sys/build.rs",
    "content": "use std::env::VarError;\n\nfn main() -> Result<(), VarError> {\n    println!(\"cargo:rustc-link-lib=dylib=rocm_smi64\");\n    println!(\"cargo:rustc-link-search=native=/opt/rocm/lib/\");\n    Ok(())\n}\n"
  },
  {
    "path": "ext/rocm_smi-sys/src/lib.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\npub const RSMI_MAX_NUM_FREQUENCIES: u32 = 33;\npub const RSMI_MAX_FAN_SPEED: u32 = 255;\npub const RSMI_NUM_VOLTAGE_CURVE_POINTS: u32 = 3;\npub const RSMI_NUM_HBM_INSTANCES: u32 = 4;\npub const RSMI_MAX_NUM_VCNS: u32 = 4;\npub const RSMI_MAX_NUM_JPEG_ENGS: u32 = 32;\npub const RSMI_MAX_NUM_CLKS: u32 = 4;\npub const RSMI_MAX_NUM_XGMI_LINKS: u32 = 8;\npub const RSMI_MAX_NUM_GFX_CLKS: u32 = 8;\npub const RSMI_MAX_NUM_XCC: u32 = 8;\npub const RSMI_MAX_NUM_XCP: u32 = 8;\npub const RSMI_DEFAULT_VARIANT: i32 = -1;\nimpl rsmi_init_flags_t {\n    /**!< Attempt to add all GPUs found\n!< (including non-AMD) to the list\n!< of devices from which SMI\n!< information can be retrieved. By\n!< default, only AMD devices are\n!<  enumerated by RSMI.*/\n    pub const RSMI_INIT_FLAG_ALL_GPUS: rsmi_init_flags_t = rsmi_init_flags_t(1);\n}\nimpl rsmi_init_flags_t {\n    ///!< The mutex limit to thread\n    pub const RSMI_INIT_FLAG_THRAD_ONLY_MUTEX: rsmi_init_flags_t = rsmi_init_flags_t(\n        288230376151711744,\n    );\n}\nimpl rsmi_init_flags_t {\n    ///!< Reserved for test\n    pub const RSMI_INIT_FLAG_RESRV_TEST1: rsmi_init_flags_t = rsmi_init_flags_t(\n        576460752303423488,\n    );\n}\n#[repr(transparent)]\n/** @brief Initialization flags\n\n Initialization flags may be OR'd together and passed to ::rsmi_init().*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_init_flags_t(pub ::core::ffi::c_ulong);\nimpl rsmi_dev_perf_level_t {\n    ///!< Performance level is \"auto\"\n    pub const RSMI_DEV_PERF_LEVEL_AUTO: rsmi_dev_perf_level_t = rsmi_dev_perf_level_t(0);\n}\nimpl rsmi_dev_perf_level_t {\n    pub const RSMI_DEV_PERF_LEVEL_FIRST: rsmi_dev_perf_level_t = rsmi_dev_perf_level_t(\n        0,\n    );\n}\nimpl rsmi_dev_perf_level_t {\n    /**!< Keep PowerPlay levels \"low\",\n!< regardless of workload*/\n    pub const RSMI_DEV_PERF_LEVEL_LOW: rsmi_dev_perf_level_t = rsmi_dev_perf_level_t(1);\n}\nimpl rsmi_dev_perf_level_t {\n    /**!< Keep PowerPlay levels \"high\",\n!< regardless of workload*/\n    pub const RSMI_DEV_PERF_LEVEL_HIGH: rsmi_dev_perf_level_t = rsmi_dev_perf_level_t(2);\n}\nimpl rsmi_dev_perf_level_t {\n    /**!< Only use values defined by manually\n!< setting the RSMI_CLK_TYPE_SYS speed*/\n    pub const RSMI_DEV_PERF_LEVEL_MANUAL: rsmi_dev_perf_level_t = rsmi_dev_perf_level_t(\n        3,\n    );\n}\nimpl rsmi_dev_perf_level_t {\n    /**!< Stable power state with profiling\n!< clocks*/\n    pub const RSMI_DEV_PERF_LEVEL_STABLE_STD: rsmi_dev_perf_level_t = rsmi_dev_perf_level_t(\n        4,\n    );\n}\nimpl rsmi_dev_perf_level_t {\n    ///!< Stable power state with peak clocks\n    pub const RSMI_DEV_PERF_LEVEL_STABLE_PEAK: rsmi_dev_perf_level_t = rsmi_dev_perf_level_t(\n        5,\n    );\n}\nimpl rsmi_dev_perf_level_t {\n    /**!< Stable power state with minimum\n!< memory clock*/\n    pub const RSMI_DEV_PERF_LEVEL_STABLE_MIN_MCLK: rsmi_dev_perf_level_t = rsmi_dev_perf_level_t(\n        6,\n    );\n}\nimpl rsmi_dev_perf_level_t {\n    /**!< Stable power state with minimum\n!< system clock*/\n    pub const RSMI_DEV_PERF_LEVEL_STABLE_MIN_SCLK: rsmi_dev_perf_level_t = rsmi_dev_perf_level_t(\n        7,\n    );\n}\nimpl rsmi_dev_perf_level_t {\n    ///!< Performance determinism state\n    pub const RSMI_DEV_PERF_LEVEL_DETERMINISM: rsmi_dev_perf_level_t = rsmi_dev_perf_level_t(\n        8,\n    );\n}\nimpl rsmi_dev_perf_level_t {\n    pub const RSMI_DEV_PERF_LEVEL_LAST: rsmi_dev_perf_level_t = rsmi_dev_perf_level_t(8);\n}\nimpl rsmi_dev_perf_level_t {\n    ///!< Unknown performance level\n    pub const RSMI_DEV_PERF_LEVEL_UNKNOWN: rsmi_dev_perf_level_t = rsmi_dev_perf_level_t(\n        256,\n    );\n}\n#[repr(transparent)]\n/// @brief PowerPlay performance levels\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_dev_perf_level_t(pub ::core::ffi::c_uint);\n/// \\cond Ignore in docs.\npub use self::rsmi_dev_perf_level_t as rsmi_dev_perf_level;\nimpl rsmi_sw_component_t {\n    pub const RSMI_SW_COMP_FIRST: rsmi_sw_component_t = rsmi_sw_component_t(0);\n}\nimpl rsmi_sw_component_t {\n    ///!< Driver\n    pub const RSMI_SW_COMP_DRIVER: rsmi_sw_component_t = rsmi_sw_component_t(0);\n}\nimpl rsmi_sw_component_t {\n    pub const RSMI_SW_COMP_LAST: rsmi_sw_component_t = rsmi_sw_component_t(0);\n}\n#[repr(transparent)]\n/// @brief Software components\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_sw_component_t(pub ::core::ffi::c_uint);\n/// @brief Handle to performance event counter\npub type rsmi_event_handle_t = usize;\nimpl rsmi_event_group_t {\n    ///!< Data Fabric (XGMI) related events\n    pub const RSMI_EVNT_GRP_XGMI: rsmi_event_group_t = rsmi_event_group_t(0);\n}\nimpl rsmi_event_group_t {\n    ///!< XGMI Outbound data\n    pub const RSMI_EVNT_GRP_XGMI_DATA_OUT: rsmi_event_group_t = rsmi_event_group_t(10);\n}\nimpl rsmi_event_group_t {\n    pub const RSMI_EVNT_GRP_INVALID: rsmi_event_group_t = rsmi_event_group_t(4294967295);\n}\n#[repr(transparent)]\n/** Event Groups\n\n @brief Enum denoting an event group. The value of the enum is the\n base value for all the event enums in the group.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_event_group_t(pub ::core::ffi::c_uint);\nimpl rsmi_event_type_t {\n    pub const RSMI_EVNT_FIRST: rsmi_event_type_t = rsmi_event_type_t(0);\n}\nimpl rsmi_event_type_t {\n    pub const RSMI_EVNT_XGMI_FIRST: rsmi_event_type_t = rsmi_event_type_t(0);\n}\nimpl rsmi_event_type_t {\n    ///!< NOPs sent to neighbor 0\n    pub const RSMI_EVNT_XGMI_0_NOP_TX: rsmi_event_type_t = rsmi_event_type_t(0);\n}\nimpl rsmi_event_type_t {\n    /**!< Outgoing requests to\n!< neighbor 0*/\n    pub const RSMI_EVNT_XGMI_0_REQUEST_TX: rsmi_event_type_t = rsmi_event_type_t(1);\n}\nimpl rsmi_event_type_t {\n    /**!< Outgoing responses to\n!< neighbor 0*/\n    pub const RSMI_EVNT_XGMI_0_RESPONSE_TX: rsmi_event_type_t = rsmi_event_type_t(2);\n}\nimpl rsmi_event_type_t {\n    /** @brief\n\n Data beats sent to neighbor 0; Each beat represents 32 bytes.<br><br>\n\n XGMI throughput can be calculated by multiplying a BEATs event\n such as ::RSMI_EVNT_XGMI_0_BEATS_TX by 32 and dividing by\n the time for which event collection occurred,\n ::rsmi_counter_value_t.time_running (which is in nanoseconds). To get\n bytes per second, multiply this value by 10<sup>9</sup>.<br>\n <br>\n Throughput = BEATS/time_running * 10<sup>9</sup>  (bytes/second)<br>*/\n    pub const RSMI_EVNT_XGMI_0_BEATS_TX: rsmi_event_type_t = rsmi_event_type_t(3);\n}\nimpl rsmi_event_type_t {\n    ///!< NOPs sent to neighbor 1\n    pub const RSMI_EVNT_XGMI_1_NOP_TX: rsmi_event_type_t = rsmi_event_type_t(4);\n}\nimpl rsmi_event_type_t {\n    /**!< Outgoing requests to\n!< neighbor 1*/\n    pub const RSMI_EVNT_XGMI_1_REQUEST_TX: rsmi_event_type_t = rsmi_event_type_t(5);\n}\nimpl rsmi_event_type_t {\n    /**!< Outgoing responses to\n!< neighbor 1*/\n    pub const RSMI_EVNT_XGMI_1_RESPONSE_TX: rsmi_event_type_t = rsmi_event_type_t(6);\n}\nimpl rsmi_event_type_t {\n    /**!< Data beats sent to\n!< neighbor 1; Each beat\n!< represents 32 bytes*/\n    pub const RSMI_EVNT_XGMI_1_BEATS_TX: rsmi_event_type_t = rsmi_event_type_t(7);\n}\nimpl rsmi_event_type_t {\n    pub const RSMI_EVNT_XGMI_LAST: rsmi_event_type_t = rsmi_event_type_t(7);\n}\nimpl rsmi_event_type_t {\n    pub const RSMI_EVNT_XGMI_DATA_OUT_FIRST: rsmi_event_type_t = rsmi_event_type_t(10);\n}\nimpl rsmi_event_type_t {\n    pub const RSMI_EVNT_XGMI_DATA_OUT_0: rsmi_event_type_t = rsmi_event_type_t(10);\n}\nimpl rsmi_event_type_t {\n    ///!< Outbound beats to neighbor 1\n    pub const RSMI_EVNT_XGMI_DATA_OUT_1: rsmi_event_type_t = rsmi_event_type_t(11);\n}\nimpl rsmi_event_type_t {\n    ///!< Outbound beats to neighbor 2\n    pub const RSMI_EVNT_XGMI_DATA_OUT_2: rsmi_event_type_t = rsmi_event_type_t(12);\n}\nimpl rsmi_event_type_t {\n    ///!< Outbound beats to neighbor 3\n    pub const RSMI_EVNT_XGMI_DATA_OUT_3: rsmi_event_type_t = rsmi_event_type_t(13);\n}\nimpl rsmi_event_type_t {\n    ///!< Outbound beats to neighbor 4\n    pub const RSMI_EVNT_XGMI_DATA_OUT_4: rsmi_event_type_t = rsmi_event_type_t(14);\n}\nimpl rsmi_event_type_t {\n    ///!< Outbound beats to neighbor 5\n    pub const RSMI_EVNT_XGMI_DATA_OUT_5: rsmi_event_type_t = rsmi_event_type_t(15);\n}\nimpl rsmi_event_type_t {\n    pub const RSMI_EVNT_XGMI_DATA_OUT_LAST: rsmi_event_type_t = rsmi_event_type_t(15);\n}\nimpl rsmi_event_type_t {\n    pub const RSMI_EVNT_LAST: rsmi_event_type_t = rsmi_event_type_t(15);\n}\n#[repr(transparent)]\n/** Event types\n @brief Event type enum. Events belonging to a particular event group\n ::rsmi_event_group_t should begin enumerating at the ::rsmi_event_group_t\n value for that group.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_event_type_t(pub ::core::ffi::c_uint);\nimpl rsmi_counter_command_t {\n    ///!< Start the counter\n    pub const RSMI_CNTR_CMD_START: rsmi_counter_command_t = rsmi_counter_command_t(0);\n}\nimpl rsmi_counter_command_t {\n    /**!< Stop the counter; note that this should not\n!< be used before reading.*/\n    pub const RSMI_CNTR_CMD_STOP: rsmi_counter_command_t = rsmi_counter_command_t(1);\n}\n#[repr(transparent)]\n/// Event counter commands\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_counter_command_t(pub ::core::ffi::c_uint);\n/// Counter value\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_counter_value_t {\n    ///!< Counter value\n    pub value: u64,\n    /**!< Time that the counter was enabled\n!< (in nanoseconds)*/\n    pub time_enabled: u64,\n    /**!< Time that the counter was running\n!< (in nanoseconds)*/\n    pub time_running: u64,\n}\nimpl rsmi_evt_notification_type_t {\n    ///!< Unused\n    pub const RSMI_EVT_NOTIF_NONE: rsmi_evt_notification_type_t = rsmi_evt_notification_type_t(\n        0,\n    );\n}\nimpl rsmi_evt_notification_type_t {\n    ///!< VM page fault\n    pub const RSMI_EVT_NOTIF_VMFAULT: rsmi_evt_notification_type_t = rsmi_evt_notification_type_t(\n        1,\n    );\n}\nimpl rsmi_evt_notification_type_t {\n    pub const RSMI_EVT_NOTIF_FIRST: rsmi_evt_notification_type_t = rsmi_evt_notification_type_t(\n        1,\n    );\n}\nimpl rsmi_evt_notification_type_t {\n    pub const RSMI_EVT_NOTIF_THERMAL_THROTTLE: rsmi_evt_notification_type_t = rsmi_evt_notification_type_t(\n        2,\n    );\n}\nimpl rsmi_evt_notification_type_t {\n    pub const RSMI_EVT_NOTIF_GPU_PRE_RESET: rsmi_evt_notification_type_t = rsmi_evt_notification_type_t(\n        3,\n    );\n}\nimpl rsmi_evt_notification_type_t {\n    pub const RSMI_EVT_NOTIF_GPU_POST_RESET: rsmi_evt_notification_type_t = rsmi_evt_notification_type_t(\n        4,\n    );\n}\nimpl rsmi_evt_notification_type_t {\n    pub const RSMI_EVT_NOTIF_EVENT_MIGRATE_START: rsmi_evt_notification_type_t = rsmi_evt_notification_type_t(\n        5,\n    );\n}\nimpl rsmi_evt_notification_type_t {\n    pub const RSMI_EVT_NOTIF_EVENT_MIGRATE_END: rsmi_evt_notification_type_t = rsmi_evt_notification_type_t(\n        6,\n    );\n}\nimpl rsmi_evt_notification_type_t {\n    pub const RSMI_EVT_NOTIF_EVENT_PAGE_FAULT_START: rsmi_evt_notification_type_t = rsmi_evt_notification_type_t(\n        7,\n    );\n}\nimpl rsmi_evt_notification_type_t {\n    pub const RSMI_EVT_NOTIF_EVENT_PAGE_FAULT_END: rsmi_evt_notification_type_t = rsmi_evt_notification_type_t(\n        8,\n    );\n}\nimpl rsmi_evt_notification_type_t {\n    pub const RSMI_EVT_NOTIF_EVENT_QUEUE_EVICTION: rsmi_evt_notification_type_t = rsmi_evt_notification_type_t(\n        9,\n    );\n}\nimpl rsmi_evt_notification_type_t {\n    pub const RSMI_EVT_NOTIF_EVENT_QUEUE_RESTORE: rsmi_evt_notification_type_t = rsmi_evt_notification_type_t(\n        10,\n    );\n}\nimpl rsmi_evt_notification_type_t {\n    pub const RSMI_EVT_NOTIF_EVENT_UNMAP_FROM_GPU: rsmi_evt_notification_type_t = rsmi_evt_notification_type_t(\n        11,\n    );\n}\nimpl rsmi_evt_notification_type_t {\n    pub const RSMI_EVT_NOTIF_EVENT_ALL_PROCESS: rsmi_evt_notification_type_t = rsmi_evt_notification_type_t(\n        64,\n    );\n}\nimpl rsmi_evt_notification_type_t {\n    pub const RSMI_EVT_NOTIF_LAST: rsmi_evt_notification_type_t = rsmi_evt_notification_type_t(\n        64,\n    );\n}\n#[repr(transparent)]\n/// Event notification event types\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_evt_notification_type_t(pub ::core::ffi::c_uint);\n/// Event notification data returned from event notification API\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_evt_notification_data_t {\n    ///!< Index of device that corresponds to the event\n    pub dv_ind: u32,\n    ///!< Event type\n    pub event: rsmi_evt_notification_type_t,\n    ///!< Event message\n    pub message: [::core::ffi::c_char; 96usize],\n}\nimpl rsmi_clk_type_t {\n    ///!< System clock\n    pub const RSMI_CLK_TYPE_SYS: rsmi_clk_type_t = rsmi_clk_type_t(0);\n}\nimpl rsmi_clk_type_t {\n    pub const RSMI_CLK_TYPE_FIRST: rsmi_clk_type_t = rsmi_clk_type_t(0);\n}\nimpl rsmi_clk_type_t {\n    /**!< Data Fabric clock (for ASICs\n!< running on a separate clock)*/\n    pub const RSMI_CLK_TYPE_DF: rsmi_clk_type_t = rsmi_clk_type_t(1);\n}\nimpl rsmi_clk_type_t {\n    ///!< Display Controller Engine clock\n    pub const RSMI_CLK_TYPE_DCEF: rsmi_clk_type_t = rsmi_clk_type_t(2);\n}\nimpl rsmi_clk_type_t {\n    ///!< SOC clock\n    pub const RSMI_CLK_TYPE_SOC: rsmi_clk_type_t = rsmi_clk_type_t(3);\n}\nimpl rsmi_clk_type_t {\n    ///!< Memory clock\n    pub const RSMI_CLK_TYPE_MEM: rsmi_clk_type_t = rsmi_clk_type_t(4);\n}\nimpl rsmi_clk_type_t {\n    ///!< PCIE clock\n    pub const RSMI_CLK_TYPE_PCIE: rsmi_clk_type_t = rsmi_clk_type_t(5);\n}\nimpl rsmi_clk_type_t {\n    pub const RSMI_CLK_TYPE_LAST: rsmi_clk_type_t = rsmi_clk_type_t(4);\n}\nimpl rsmi_clk_type_t {\n    pub const RSMI_CLK_INVALID: rsmi_clk_type_t = rsmi_clk_type_t(4294967295);\n}\n#[repr(transparent)]\n/// Clock types\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_clk_type_t(pub ::core::ffi::c_uint);\n/// \\cond Ignore in docs.\npub use self::rsmi_clk_type_t as rsmi_clk_type;\nimpl rsmi_compute_partition_type_t {\n    pub const RSMI_COMPUTE_PARTITION_INVALID: rsmi_compute_partition_type_t = rsmi_compute_partition_type_t(\n        0,\n    );\n}\nimpl rsmi_compute_partition_type_t {\n    /**!< Single GPU mode (SPX)- All XCCs work\n!< together with shared memory*/\n    pub const RSMI_COMPUTE_PARTITION_SPX: rsmi_compute_partition_type_t = rsmi_compute_partition_type_t(\n        1,\n    );\n}\nimpl rsmi_compute_partition_type_t {\n    /**!< Dual GPU mode (DPX)- Half XCCs work\n!< together with shared memory*/\n    pub const RSMI_COMPUTE_PARTITION_DPX: rsmi_compute_partition_type_t = rsmi_compute_partition_type_t(\n        2,\n    );\n}\nimpl rsmi_compute_partition_type_t {\n    /**!< Triple GPU mode (TPX)- One-third XCCs\n!< work together with shared memory*/\n    pub const RSMI_COMPUTE_PARTITION_TPX: rsmi_compute_partition_type_t = rsmi_compute_partition_type_t(\n        3,\n    );\n}\nimpl rsmi_compute_partition_type_t {\n    /**!< Quad GPU mode (QPX)- Quarter XCCs\n!< work together with shared memory*/\n    pub const RSMI_COMPUTE_PARTITION_QPX: rsmi_compute_partition_type_t = rsmi_compute_partition_type_t(\n        4,\n    );\n}\nimpl rsmi_compute_partition_type_t {\n    /**!< Core mode (CPX)- Per-chip XCC with\n!< shared memory*/\n    pub const RSMI_COMPUTE_PARTITION_CPX: rsmi_compute_partition_type_t = rsmi_compute_partition_type_t(\n        5,\n    );\n}\n#[repr(transparent)]\n/** @brief Compute Partition. This enum is used to identify\n various compute partitioning settings.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_compute_partition_type_t(pub ::core::ffi::c_uint);\n/// \\cond Ignore in docs.\npub use self::rsmi_compute_partition_type_t as rsmi_compute_partition_type;\nimpl rsmi_memory_partition_type_t {\n    pub const RSMI_MEMORY_PARTITION_UNKNOWN: rsmi_memory_partition_type_t = rsmi_memory_partition_type_t(\n        0,\n    );\n}\nimpl rsmi_memory_partition_type_t {\n    /**!< NPS1 - All CCD & XCD data is interleaved\n!< accross all 8 HBM stacks (all stacks/1).*/\n    pub const RSMI_MEMORY_PARTITION_NPS1: rsmi_memory_partition_type_t = rsmi_memory_partition_type_t(\n        1,\n    );\n}\nimpl rsmi_memory_partition_type_t {\n    /**!< NPS2 - 2 sets of CCDs or 4 XCD interleaved\n!< accross the 4 HBM stacks per AID pair\n!< (8 stacks/2).*/\n    pub const RSMI_MEMORY_PARTITION_NPS2: rsmi_memory_partition_type_t = rsmi_memory_partition_type_t(\n        2,\n    );\n}\nimpl rsmi_memory_partition_type_t {\n    /**!< NPS4 - Each XCD data is interleaved accross\n!< accross 2 (or single) HBM stacks\n!< (8 stacks/8 or 8 stacks/4).*/\n    pub const RSMI_MEMORY_PARTITION_NPS4: rsmi_memory_partition_type_t = rsmi_memory_partition_type_t(\n        3,\n    );\n}\nimpl rsmi_memory_partition_type_t {\n    /**!< NPS8 - Each XCD uses a single HBM stack\n!< (8 stacks/8). Or each XCD uses a single\n!< HBM stack & CCDs share 2 non-interleaved\n!< HBM stacks on its AID\n!< (AID[1,2,3] = 6 stacks/6).*/\n    pub const RSMI_MEMORY_PARTITION_NPS8: rsmi_memory_partition_type_t = rsmi_memory_partition_type_t(\n        4,\n    );\n}\n#[repr(transparent)]\n/** @brief Memory Partitions. This enum is used to identify various\n memory partition types.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_memory_partition_type_t(pub ::core::ffi::c_uint);\n/// \\cond Ignore in docs.\npub use self::rsmi_memory_partition_type_t as rsmi_memory_partition_type;\nimpl rsmi_temperature_metric_t {\n    ///!< Temperature current value.\n    pub const RSMI_TEMP_CURRENT: rsmi_temperature_metric_t = rsmi_temperature_metric_t(\n        0,\n    );\n}\nimpl rsmi_temperature_metric_t {\n    pub const RSMI_TEMP_FIRST: rsmi_temperature_metric_t = rsmi_temperature_metric_t(0);\n}\nimpl rsmi_temperature_metric_t {\n    ///!< Temperature max value.\n    pub const RSMI_TEMP_MAX: rsmi_temperature_metric_t = rsmi_temperature_metric_t(1);\n}\nimpl rsmi_temperature_metric_t {\n    ///!< Temperature min value.\n    pub const RSMI_TEMP_MIN: rsmi_temperature_metric_t = rsmi_temperature_metric_t(2);\n}\nimpl rsmi_temperature_metric_t {\n    /**!< Temperature hysteresis value for max limit.\n!< (This is an absolute temperature, not a\n!< delta).*/\n    pub const RSMI_TEMP_MAX_HYST: rsmi_temperature_metric_t = rsmi_temperature_metric_t(\n        3,\n    );\n}\nimpl rsmi_temperature_metric_t {\n    /**!< Temperature hysteresis value for min limit.\n!< (This is an absolute temperature,\n!<  not a delta).*/\n    pub const RSMI_TEMP_MIN_HYST: rsmi_temperature_metric_t = rsmi_temperature_metric_t(\n        4,\n    );\n}\nimpl rsmi_temperature_metric_t {\n    /**!< Temperature critical max value, typically\n!<  greater than corresponding temp_max values.*/\n    pub const RSMI_TEMP_CRITICAL: rsmi_temperature_metric_t = rsmi_temperature_metric_t(\n        5,\n    );\n}\nimpl rsmi_temperature_metric_t {\n    /**!< Temperature hysteresis value for critical\n!<  limit. (This is an absolute temperature,\n!<  not a delta).*/\n    pub const RSMI_TEMP_CRITICAL_HYST: rsmi_temperature_metric_t = rsmi_temperature_metric_t(\n        6,\n    );\n}\nimpl rsmi_temperature_metric_t {\n    /**!< Temperature emergency max value, for chips\n!<  supporting more than two upper temperature\n!<  limits. Must be equal or greater than\n!<  corresponding temp_crit values.*/\n    pub const RSMI_TEMP_EMERGENCY: rsmi_temperature_metric_t = rsmi_temperature_metric_t(\n        7,\n    );\n}\nimpl rsmi_temperature_metric_t {\n    /**!< Temperature hysteresis value for emergency\n!<  limit. (This is an absolute temperature,\n!<  not a delta).*/\n    pub const RSMI_TEMP_EMERGENCY_HYST: rsmi_temperature_metric_t = rsmi_temperature_metric_t(\n        8,\n    );\n}\nimpl rsmi_temperature_metric_t {\n    /**!< Temperature critical min value, typically\n!<  lower than corresponding temperature\n!<  minimum values.*/\n    pub const RSMI_TEMP_CRIT_MIN: rsmi_temperature_metric_t = rsmi_temperature_metric_t(\n        9,\n    );\n}\nimpl rsmi_temperature_metric_t {\n    /**!< Temperature hysteresis value for critical\n!< minimum limit. (This is an absolute\n!< temperature, not a delta).*/\n    pub const RSMI_TEMP_CRIT_MIN_HYST: rsmi_temperature_metric_t = rsmi_temperature_metric_t(\n        10,\n    );\n}\nimpl rsmi_temperature_metric_t {\n    ///!< Temperature offset which is added to the\n    pub const RSMI_TEMP_OFFSET: rsmi_temperature_metric_t = rsmi_temperature_metric_t(\n        11,\n    );\n}\nimpl rsmi_temperature_metric_t {\n    ///!< Historical minimum temperature.\n    pub const RSMI_TEMP_LOWEST: rsmi_temperature_metric_t = rsmi_temperature_metric_t(\n        12,\n    );\n}\nimpl rsmi_temperature_metric_t {\n    ///!< Historical maximum temperature.\n    pub const RSMI_TEMP_HIGHEST: rsmi_temperature_metric_t = rsmi_temperature_metric_t(\n        13,\n    );\n}\nimpl rsmi_temperature_metric_t {\n    pub const RSMI_TEMP_LAST: rsmi_temperature_metric_t = rsmi_temperature_metric_t(13);\n}\n#[repr(transparent)]\n/** @brief Temperature Metrics.  This enum is used to identify various\n temperature metrics. Corresponding values will be in millidegress\n Celcius.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_temperature_metric_t(pub ::core::ffi::c_uint);\n/// \\cond Ignore in docs.\npub use self::rsmi_temperature_metric_t as rsmi_temperature_metric;\nimpl rsmi_temperature_type_t {\n    pub const RSMI_TEMP_TYPE_FIRST: rsmi_temperature_type_t = rsmi_temperature_type_t(0);\n}\nimpl rsmi_temperature_type_t {\n    ///!< Edge GPU temperature\n    pub const RSMI_TEMP_TYPE_EDGE: rsmi_temperature_type_t = rsmi_temperature_type_t(0);\n}\nimpl rsmi_temperature_type_t {\n    /**!< Junction/hotspot\n!< temperature*/\n    pub const RSMI_TEMP_TYPE_JUNCTION: rsmi_temperature_type_t = rsmi_temperature_type_t(\n        1,\n    );\n}\nimpl rsmi_temperature_type_t {\n    ///!< VRAM temperature\n    pub const RSMI_TEMP_TYPE_MEMORY: rsmi_temperature_type_t = rsmi_temperature_type_t(\n        2,\n    );\n}\nimpl rsmi_temperature_type_t {\n    ///!< HBM temperature instance 0\n    pub const RSMI_TEMP_TYPE_HBM_0: rsmi_temperature_type_t = rsmi_temperature_type_t(3);\n}\nimpl rsmi_temperature_type_t {\n    ///!< HBM temperature instance 1\n    pub const RSMI_TEMP_TYPE_HBM_1: rsmi_temperature_type_t = rsmi_temperature_type_t(4);\n}\nimpl rsmi_temperature_type_t {\n    ///!< HBM temperature instance 2\n    pub const RSMI_TEMP_TYPE_HBM_2: rsmi_temperature_type_t = rsmi_temperature_type_t(5);\n}\nimpl rsmi_temperature_type_t {\n    ///!< HBM temperature instance 3\n    pub const RSMI_TEMP_TYPE_HBM_3: rsmi_temperature_type_t = rsmi_temperature_type_t(6);\n}\nimpl rsmi_temperature_type_t {\n    pub const RSMI_TEMP_TYPE_LAST: rsmi_temperature_type_t = rsmi_temperature_type_t(6);\n}\nimpl rsmi_temperature_type_t {\n    ///!< Invalid type\n    pub const RSMI_TEMP_TYPE_INVALID: rsmi_temperature_type_t = rsmi_temperature_type_t(\n        4294967295,\n    );\n}\n#[repr(transparent)]\n/** @brief This enumeration is used to indicate from which part of the device a\n temperature reading should be obtained.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_temperature_type_t(pub ::core::ffi::c_uint);\nimpl rsmi_activity_metric_t {\n    pub const RSMI_ACTIVITY_GFX: rsmi_activity_metric_t = rsmi_activity_metric_t(1);\n}\nimpl rsmi_activity_metric_t {\n    ///!< memory controller\n    pub const RSMI_ACTIVITY_UMC: rsmi_activity_metric_t = rsmi_activity_metric_t(2);\n}\nimpl rsmi_activity_metric_t {\n    ///!< UVD or VCN\n    pub const RSMI_ACTIVITY_MM: rsmi_activity_metric_t = rsmi_activity_metric_t(4);\n}\n#[repr(transparent)]\n/** @brief Activity (Utilization) Metrics.  This enum is used to identify\n various activity metrics.\n*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_activity_metric_t(pub ::core::ffi::c_uint);\nimpl rsmi_voltage_metric_t {\n    ///!< Voltage current value.\n    pub const RSMI_VOLT_CURRENT: rsmi_voltage_metric_t = rsmi_voltage_metric_t(0);\n}\nimpl rsmi_voltage_metric_t {\n    pub const RSMI_VOLT_FIRST: rsmi_voltage_metric_t = rsmi_voltage_metric_t(0);\n}\nimpl rsmi_voltage_metric_t {\n    ///!< Voltage max value.\n    pub const RSMI_VOLT_MAX: rsmi_voltage_metric_t = rsmi_voltage_metric_t(1);\n}\nimpl rsmi_voltage_metric_t {\n    ///!< Voltage critical min value.\n    pub const RSMI_VOLT_MIN_CRIT: rsmi_voltage_metric_t = rsmi_voltage_metric_t(2);\n}\nimpl rsmi_voltage_metric_t {\n    ///!< Voltage min value.\n    pub const RSMI_VOLT_MIN: rsmi_voltage_metric_t = rsmi_voltage_metric_t(3);\n}\nimpl rsmi_voltage_metric_t {\n    ///!< Voltage critical max value.\n    pub const RSMI_VOLT_MAX_CRIT: rsmi_voltage_metric_t = rsmi_voltage_metric_t(4);\n}\nimpl rsmi_voltage_metric_t {\n    ///!< Average voltage.\n    pub const RSMI_VOLT_AVERAGE: rsmi_voltage_metric_t = rsmi_voltage_metric_t(5);\n}\nimpl rsmi_voltage_metric_t {\n    ///!< Historical minimum voltage.\n    pub const RSMI_VOLT_LOWEST: rsmi_voltage_metric_t = rsmi_voltage_metric_t(6);\n}\nimpl rsmi_voltage_metric_t {\n    ///!< Historical maximum voltage.\n    pub const RSMI_VOLT_HIGHEST: rsmi_voltage_metric_t = rsmi_voltage_metric_t(7);\n}\nimpl rsmi_voltage_metric_t {\n    pub const RSMI_VOLT_LAST: rsmi_voltage_metric_t = rsmi_voltage_metric_t(7);\n}\n#[repr(transparent)]\n/** @brief Voltage Metrics.  This enum is used to identify various\n Volatge metrics. Corresponding values will be in millivolt.\n*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_voltage_metric_t(pub ::core::ffi::c_uint);\nimpl rsmi_voltage_type_t {\n    pub const RSMI_VOLT_TYPE_FIRST: rsmi_voltage_type_t = rsmi_voltage_type_t(0);\n}\nimpl rsmi_voltage_type_t {\n    ///!< Vddgfx GPU voltage\n    pub const RSMI_VOLT_TYPE_VDDGFX: rsmi_voltage_type_t = rsmi_voltage_type_t(0);\n}\nimpl rsmi_voltage_type_t {\n    ///!< Voltage for VDDBOARD\n    pub const RSMI_VOLT_TYPE_VDDBOARD: rsmi_voltage_type_t = rsmi_voltage_type_t(1);\n}\nimpl rsmi_voltage_type_t {\n    pub const RSMI_VOLT_TYPE_LAST: rsmi_voltage_type_t = rsmi_voltage_type_t(1);\n}\nimpl rsmi_voltage_type_t {\n    ///!< Invalid type\n    pub const RSMI_VOLT_TYPE_INVALID: rsmi_voltage_type_t = rsmi_voltage_type_t(\n        4294967295,\n    );\n}\n#[repr(transparent)]\n/** @brief This ennumeration is used to indicate which type of\n voltage reading should be obtained.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_voltage_type_t(pub ::core::ffi::c_uint);\nimpl rsmi_power_profile_preset_masks_t {\n    ///!< Custom Power Profile\n    pub const RSMI_PWR_PROF_PRST_CUSTOM_MASK: rsmi_power_profile_preset_masks_t = rsmi_power_profile_preset_masks_t(\n        1,\n    );\n}\nimpl rsmi_power_profile_preset_masks_t {\n    ///!< Video Power Profile\n    pub const RSMI_PWR_PROF_PRST_VIDEO_MASK: rsmi_power_profile_preset_masks_t = rsmi_power_profile_preset_masks_t(\n        2,\n    );\n}\nimpl rsmi_power_profile_preset_masks_t {\n    ///!< Power Saving Profile\n    pub const RSMI_PWR_PROF_PRST_POWER_SAVING_MASK: rsmi_power_profile_preset_masks_t = rsmi_power_profile_preset_masks_t(\n        4,\n    );\n}\nimpl rsmi_power_profile_preset_masks_t {\n    ///!< Compute Saving Profile\n    pub const RSMI_PWR_PROF_PRST_COMPUTE_MASK: rsmi_power_profile_preset_masks_t = rsmi_power_profile_preset_masks_t(\n        8,\n    );\n}\nimpl rsmi_power_profile_preset_masks_t {\n    ///!< VR Power Profile\n    pub const RSMI_PWR_PROF_PRST_VR_MASK: rsmi_power_profile_preset_masks_t = rsmi_power_profile_preset_masks_t(\n        16,\n    );\n}\nimpl rsmi_power_profile_preset_masks_t {\n    pub const RSMI_PWR_PROF_PRST_3D_FULL_SCR_MASK: rsmi_power_profile_preset_masks_t = rsmi_power_profile_preset_masks_t(\n        32,\n    );\n}\nimpl rsmi_power_profile_preset_masks_t {\n    ///!< Default Boot Up Profile\n    pub const RSMI_PWR_PROF_PRST_BOOTUP_DEFAULT: rsmi_power_profile_preset_masks_t = rsmi_power_profile_preset_masks_t(\n        64,\n    );\n}\nimpl rsmi_power_profile_preset_masks_t {\n    pub const RSMI_PWR_PROF_PRST_LAST: rsmi_power_profile_preset_masks_t = rsmi_power_profile_preset_masks_t(\n        64,\n    );\n}\nimpl rsmi_power_profile_preset_masks_t {\n    pub const RSMI_PWR_PROF_PRST_INVALID: rsmi_power_profile_preset_masks_t = rsmi_power_profile_preset_masks_t(\n        18446744073709551615,\n    );\n}\n#[repr(transparent)]\n/** @brief Pre-set Profile Selections. These bitmasks can be AND'd with the\n ::rsmi_power_profile_status_t.available_profiles returned from\n ::rsmi_dev_power_profile_presets_get to determine which power profiles\n are supported by the system.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_power_profile_preset_masks_t(pub ::core::ffi::c_ulong);\n/// \\cond Ignore in docs.\npub use self::rsmi_power_profile_preset_masks_t as rsmi_power_profile_preset_masks;\nimpl rsmi_gpu_block_t {\n    /**!< Used to indicate an\n!< invalid block*/\n    pub const RSMI_GPU_BLOCK_INVALID: rsmi_gpu_block_t = rsmi_gpu_block_t(0);\n}\nimpl rsmi_gpu_block_t {\n    pub const RSMI_GPU_BLOCK_FIRST: rsmi_gpu_block_t = rsmi_gpu_block_t(1);\n}\nimpl rsmi_gpu_block_t {\n    ///!< UMC block\n    pub const RSMI_GPU_BLOCK_UMC: rsmi_gpu_block_t = rsmi_gpu_block_t(1);\n}\nimpl rsmi_gpu_block_t {\n    ///!< SDMA block\n    pub const RSMI_GPU_BLOCK_SDMA: rsmi_gpu_block_t = rsmi_gpu_block_t(2);\n}\nimpl rsmi_gpu_block_t {\n    ///!< GFX block\n    pub const RSMI_GPU_BLOCK_GFX: rsmi_gpu_block_t = rsmi_gpu_block_t(4);\n}\nimpl rsmi_gpu_block_t {\n    ///!< MMHUB block\n    pub const RSMI_GPU_BLOCK_MMHUB: rsmi_gpu_block_t = rsmi_gpu_block_t(8);\n}\nimpl rsmi_gpu_block_t {\n    ///!< ATHUB block\n    pub const RSMI_GPU_BLOCK_ATHUB: rsmi_gpu_block_t = rsmi_gpu_block_t(16);\n}\nimpl rsmi_gpu_block_t {\n    ///!< PCIE_BIF block\n    pub const RSMI_GPU_BLOCK_PCIE_BIF: rsmi_gpu_block_t = rsmi_gpu_block_t(32);\n}\nimpl rsmi_gpu_block_t {\n    ///!< HDP block\n    pub const RSMI_GPU_BLOCK_HDP: rsmi_gpu_block_t = rsmi_gpu_block_t(64);\n}\nimpl rsmi_gpu_block_t {\n    ///!< XGMI block\n    pub const RSMI_GPU_BLOCK_XGMI_WAFL: rsmi_gpu_block_t = rsmi_gpu_block_t(128);\n}\nimpl rsmi_gpu_block_t {\n    ///!< DF block\n    pub const RSMI_GPU_BLOCK_DF: rsmi_gpu_block_t = rsmi_gpu_block_t(256);\n}\nimpl rsmi_gpu_block_t {\n    ///!< SMN block\n    pub const RSMI_GPU_BLOCK_SMN: rsmi_gpu_block_t = rsmi_gpu_block_t(512);\n}\nimpl rsmi_gpu_block_t {\n    ///!< SEM block\n    pub const RSMI_GPU_BLOCK_SEM: rsmi_gpu_block_t = rsmi_gpu_block_t(1024);\n}\nimpl rsmi_gpu_block_t {\n    ///!< MP0 block\n    pub const RSMI_GPU_BLOCK_MP0: rsmi_gpu_block_t = rsmi_gpu_block_t(2048);\n}\nimpl rsmi_gpu_block_t {\n    ///!< MP1 block\n    pub const RSMI_GPU_BLOCK_MP1: rsmi_gpu_block_t = rsmi_gpu_block_t(4096);\n}\nimpl rsmi_gpu_block_t {\n    ///!< Fuse block\n    pub const RSMI_GPU_BLOCK_FUSE: rsmi_gpu_block_t = rsmi_gpu_block_t(8192);\n}\nimpl rsmi_gpu_block_t {\n    /**!< The highest bit position\n!< for supported blocks*/\n    pub const RSMI_GPU_BLOCK_LAST: rsmi_gpu_block_t = rsmi_gpu_block_t(8192);\n}\nimpl rsmi_gpu_block_t {\n    pub const RSMI_GPU_BLOCK_RESERVED: rsmi_gpu_block_t = rsmi_gpu_block_t(\n        9223372036854775808,\n    );\n}\n#[repr(transparent)]\n/// @brief This enum is used to identify different GPU blocks.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_gpu_block_t(pub ::core::ffi::c_ulong);\n/// \\cond Ignore in docs.\npub use self::rsmi_gpu_block_t as rsmi_gpu_block;\nimpl rsmi_ras_err_state_t {\n    ///!< No current errors\n    pub const RSMI_RAS_ERR_STATE_NONE: rsmi_ras_err_state_t = rsmi_ras_err_state_t(0);\n}\nimpl rsmi_ras_err_state_t {\n    ///!< ECC is disabled\n    pub const RSMI_RAS_ERR_STATE_DISABLED: rsmi_ras_err_state_t = rsmi_ras_err_state_t(\n        1,\n    );\n}\nimpl rsmi_ras_err_state_t {\n    ///!< ECC errors present, but type unknown\n    pub const RSMI_RAS_ERR_STATE_PARITY: rsmi_ras_err_state_t = rsmi_ras_err_state_t(2);\n}\nimpl rsmi_ras_err_state_t {\n    ///!< Single correctable error\n    pub const RSMI_RAS_ERR_STATE_SING_C: rsmi_ras_err_state_t = rsmi_ras_err_state_t(3);\n}\nimpl rsmi_ras_err_state_t {\n    ///!< Multiple uncorrectable errors\n    pub const RSMI_RAS_ERR_STATE_MULT_UC: rsmi_ras_err_state_t = rsmi_ras_err_state_t(4);\n}\nimpl rsmi_ras_err_state_t {\n    /**!< Firmware detected error and isolated\n!< page. Treat as uncorrectable.*/\n    pub const RSMI_RAS_ERR_STATE_POISON: rsmi_ras_err_state_t = rsmi_ras_err_state_t(5);\n}\nimpl rsmi_ras_err_state_t {\n    ///!< ECC is enabled\n    pub const RSMI_RAS_ERR_STATE_ENABLED: rsmi_ras_err_state_t = rsmi_ras_err_state_t(6);\n}\nimpl rsmi_ras_err_state_t {\n    pub const RSMI_RAS_ERR_STATE_LAST: rsmi_ras_err_state_t = rsmi_ras_err_state_t(6);\n}\nimpl rsmi_ras_err_state_t {\n    pub const RSMI_RAS_ERR_STATE_INVALID: rsmi_ras_err_state_t = rsmi_ras_err_state_t(\n        4294967295,\n    );\n}\n#[repr(transparent)]\n/// @brief The current ECC state\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_ras_err_state_t(pub ::core::ffi::c_uint);\nimpl rsmi_memory_type_t {\n    pub const RSMI_MEM_TYPE_FIRST: rsmi_memory_type_t = rsmi_memory_type_t(0);\n}\nimpl rsmi_memory_type_t {\n    ///!< VRAM memory\n    pub const RSMI_MEM_TYPE_VRAM: rsmi_memory_type_t = rsmi_memory_type_t(0);\n}\nimpl rsmi_memory_type_t {\n    ///!< VRAM memory that is visible\n    pub const RSMI_MEM_TYPE_VIS_VRAM: rsmi_memory_type_t = rsmi_memory_type_t(1);\n}\nimpl rsmi_memory_type_t {\n    ///!< GTT memory\n    pub const RSMI_MEM_TYPE_GTT: rsmi_memory_type_t = rsmi_memory_type_t(2);\n}\nimpl rsmi_memory_type_t {\n    pub const RSMI_MEM_TYPE_LAST: rsmi_memory_type_t = rsmi_memory_type_t(2);\n}\n#[repr(transparent)]\n/// @brief Types of memory\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_memory_type_t(pub ::core::ffi::c_uint);\nimpl rsmi_freq_ind_t {\n    ///!< Index used for the minimum frequency value\n    pub const RSMI_FREQ_IND_MIN: rsmi_freq_ind_t = rsmi_freq_ind_t(0);\n}\nimpl rsmi_freq_ind_t {\n    ///!< Index used for the maximum frequency value\n    pub const RSMI_FREQ_IND_MAX: rsmi_freq_ind_t = rsmi_freq_ind_t(1);\n}\nimpl rsmi_freq_ind_t {\n    ///!< An invalid frequency index\n    pub const RSMI_FREQ_IND_INVALID: rsmi_freq_ind_t = rsmi_freq_ind_t(4294967295);\n}\n#[repr(transparent)]\n/// @brief The values of this enum are used as frequency identifiers.\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_freq_ind_t(pub ::core::ffi::c_uint);\n/// \\cond Ignore in docs.\npub use self::rsmi_freq_ind_t as rsmi_freq_ind;\nimpl rsmi_fw_block_t {\n    pub const RSMI_FW_BLOCK_FIRST: rsmi_fw_block_t = rsmi_fw_block_t(0);\n}\nimpl rsmi_fw_block_t {\n    pub const RSMI_FW_BLOCK_ASD: rsmi_fw_block_t = rsmi_fw_block_t(0);\n}\nimpl rsmi_fw_block_t {\n    pub const RSMI_FW_BLOCK_CE: rsmi_fw_block_t = rsmi_fw_block_t(1);\n}\nimpl rsmi_fw_block_t {\n    pub const RSMI_FW_BLOCK_DMCU: rsmi_fw_block_t = rsmi_fw_block_t(2);\n}\nimpl rsmi_fw_block_t {\n    pub const RSMI_FW_BLOCK_MC: rsmi_fw_block_t = rsmi_fw_block_t(3);\n}\nimpl rsmi_fw_block_t {\n    pub const RSMI_FW_BLOCK_ME: rsmi_fw_block_t = rsmi_fw_block_t(4);\n}\nimpl rsmi_fw_block_t {\n    pub const RSMI_FW_BLOCK_MEC: rsmi_fw_block_t = rsmi_fw_block_t(5);\n}\nimpl rsmi_fw_block_t {\n    pub const RSMI_FW_BLOCK_MEC2: rsmi_fw_block_t = rsmi_fw_block_t(6);\n}\nimpl rsmi_fw_block_t {\n    pub const RSMI_FW_BLOCK_MES: rsmi_fw_block_t = rsmi_fw_block_t(7);\n}\nimpl rsmi_fw_block_t {\n    pub const RSMI_FW_BLOCK_MES_KIQ: rsmi_fw_block_t = rsmi_fw_block_t(8);\n}\nimpl rsmi_fw_block_t {\n    pub const RSMI_FW_BLOCK_PFP: rsmi_fw_block_t = rsmi_fw_block_t(9);\n}\nimpl rsmi_fw_block_t {\n    pub const RSMI_FW_BLOCK_RLC: rsmi_fw_block_t = rsmi_fw_block_t(10);\n}\nimpl rsmi_fw_block_t {\n    pub const RSMI_FW_BLOCK_RLC_SRLC: rsmi_fw_block_t = rsmi_fw_block_t(11);\n}\nimpl rsmi_fw_block_t {\n    pub const RSMI_FW_BLOCK_RLC_SRLG: rsmi_fw_block_t = rsmi_fw_block_t(12);\n}\nimpl rsmi_fw_block_t {\n    pub const RSMI_FW_BLOCK_RLC_SRLS: rsmi_fw_block_t = rsmi_fw_block_t(13);\n}\nimpl rsmi_fw_block_t {\n    pub const RSMI_FW_BLOCK_SDMA: rsmi_fw_block_t = rsmi_fw_block_t(14);\n}\nimpl rsmi_fw_block_t {\n    pub const RSMI_FW_BLOCK_SDMA2: rsmi_fw_block_t = rsmi_fw_block_t(15);\n}\nimpl rsmi_fw_block_t {\n    pub const RSMI_FW_BLOCK_SMC: rsmi_fw_block_t = rsmi_fw_block_t(16);\n}\nimpl rsmi_fw_block_t {\n    pub const RSMI_FW_BLOCK_SOS: rsmi_fw_block_t = rsmi_fw_block_t(17);\n}\nimpl rsmi_fw_block_t {\n    pub const RSMI_FW_BLOCK_TA_RAS: rsmi_fw_block_t = rsmi_fw_block_t(18);\n}\nimpl rsmi_fw_block_t {\n    pub const RSMI_FW_BLOCK_TA_XGMI: rsmi_fw_block_t = rsmi_fw_block_t(19);\n}\nimpl rsmi_fw_block_t {\n    pub const RSMI_FW_BLOCK_UVD: rsmi_fw_block_t = rsmi_fw_block_t(20);\n}\nimpl rsmi_fw_block_t {\n    pub const RSMI_FW_BLOCK_VCE: rsmi_fw_block_t = rsmi_fw_block_t(21);\n}\nimpl rsmi_fw_block_t {\n    pub const RSMI_FW_BLOCK_VCN: rsmi_fw_block_t = rsmi_fw_block_t(22);\n}\nimpl rsmi_fw_block_t {\n    pub const RSMI_FW_BLOCK_LAST: rsmi_fw_block_t = rsmi_fw_block_t(22);\n}\n#[repr(transparent)]\n/** @brief The values of this enum are used to identify the various firmware\n blocks.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_fw_block_t(pub ::core::ffi::c_uint);\nimpl rsmi_xgmi_status_t {\n    pub const RSMI_XGMI_STATUS_NO_ERRORS: rsmi_xgmi_status_t = rsmi_xgmi_status_t(0);\n}\nimpl rsmi_xgmi_status_t {\n    pub const RSMI_XGMI_STATUS_ERROR: rsmi_xgmi_status_t = rsmi_xgmi_status_t(1);\n}\nimpl rsmi_xgmi_status_t {\n    pub const RSMI_XGMI_STATUS_MULTIPLE_ERRORS: rsmi_xgmi_status_t = rsmi_xgmi_status_t(\n        2,\n    );\n}\n#[repr(transparent)]\n/// @brief XGMI Status\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_xgmi_status_t(pub ::core::ffi::c_uint);\n/// @brief Bitfield used in various RSMI calls\npub type rsmi_bit_field_t = u64;\n/// \\cond Ignore in docs.\npub type rsmi_bit_field = rsmi_bit_field_t;\nimpl rsmi_memory_page_status_t {\n    /**!< Reserved. This gpu page is reserved\n!<  and not available for use*/\n    pub const RSMI_MEM_PAGE_STATUS_RESERVED: rsmi_memory_page_status_t = rsmi_memory_page_status_t(\n        0,\n    );\n}\nimpl rsmi_memory_page_status_t {\n    /**!< Pending. This gpu page is marked\n!<  as bad and will be marked reserved\n!<  at the next window.*/\n    pub const RSMI_MEM_PAGE_STATUS_PENDING: rsmi_memory_page_status_t = rsmi_memory_page_status_t(\n        1,\n    );\n}\nimpl rsmi_memory_page_status_t {\n    ///!< Unable to reserve this page\n    pub const RSMI_MEM_PAGE_STATUS_UNRESERVABLE: rsmi_memory_page_status_t = rsmi_memory_page_status_t(\n        2,\n    );\n}\n#[repr(transparent)]\n/// @brief Reserved Memory Page States\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_memory_page_status_t(pub ::core::ffi::c_uint);\nimpl _RSMI_IO_LINK_TYPE {\n    ///!< unknown type.\n    pub const RSMI_IOLINK_TYPE_UNDEFINED: _RSMI_IO_LINK_TYPE = _RSMI_IO_LINK_TYPE(0);\n}\nimpl _RSMI_IO_LINK_TYPE {\n    ///!< PCI Express\n    pub const RSMI_IOLINK_TYPE_PCIEXPRESS: _RSMI_IO_LINK_TYPE = _RSMI_IO_LINK_TYPE(1);\n}\nimpl _RSMI_IO_LINK_TYPE {\n    ///!< XGMI\n    pub const RSMI_IOLINK_TYPE_XGMI: _RSMI_IO_LINK_TYPE = _RSMI_IO_LINK_TYPE(2);\n}\nimpl _RSMI_IO_LINK_TYPE {\n    ///!< Number of IO Link types\n    pub const RSMI_IOLINK_TYPE_NUMIOLINKTYPES: _RSMI_IO_LINK_TYPE = _RSMI_IO_LINK_TYPE(\n        3,\n    );\n}\nimpl _RSMI_IO_LINK_TYPE {\n    ///!< Max of IO Link types\n    pub const RSMI_IOLINK_TYPE_SIZE: _RSMI_IO_LINK_TYPE = _RSMI_IO_LINK_TYPE(4294967295);\n}\n#[repr(transparent)]\n/// @brief Types for IO Link\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct _RSMI_IO_LINK_TYPE(pub ::core::ffi::c_uint);\n/// @brief Types for IO Link\npub use self::_RSMI_IO_LINK_TYPE as RSMI_IO_LINK_TYPE;\nimpl RSMI_UTILIZATION_COUNTER_TYPE {\n    pub const RSMI_UTILIZATION_COUNTER_FIRST: RSMI_UTILIZATION_COUNTER_TYPE = RSMI_UTILIZATION_COUNTER_TYPE(\n        0,\n    );\n}\nimpl RSMI_UTILIZATION_COUNTER_TYPE {\n    pub const RSMI_COARSE_GRAIN_GFX_ACTIVITY: RSMI_UTILIZATION_COUNTER_TYPE = RSMI_UTILIZATION_COUNTER_TYPE(\n        0,\n    );\n}\nimpl RSMI_UTILIZATION_COUNTER_TYPE {\n    ///!< Memory Activity\n    pub const RSMI_COARSE_GRAIN_MEM_ACTIVITY: RSMI_UTILIZATION_COUNTER_TYPE = RSMI_UTILIZATION_COUNTER_TYPE(\n        1,\n    );\n}\nimpl RSMI_UTILIZATION_COUNTER_TYPE {\n    pub const RSMI_UTILIZATION_COUNTER_LAST: RSMI_UTILIZATION_COUNTER_TYPE = RSMI_UTILIZATION_COUNTER_TYPE(\n        1,\n    );\n}\n#[repr(transparent)]\n/// @brief The utilization counter type\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct RSMI_UTILIZATION_COUNTER_TYPE(pub ::core::ffi::c_uint);\nimpl RSMI_POWER_TYPE {\n    ///!< Average Power\n    pub const RSMI_AVERAGE_POWER: RSMI_POWER_TYPE = RSMI_POWER_TYPE(0);\n}\nimpl RSMI_POWER_TYPE {\n    ///!< Current / Instant Power\n    pub const RSMI_CURRENT_POWER: RSMI_POWER_TYPE = RSMI_POWER_TYPE(1);\n}\nimpl RSMI_POWER_TYPE {\n    ///!< Invalid / Undetected Power\n    pub const RSMI_INVALID_POWER: RSMI_POWER_TYPE = RSMI_POWER_TYPE(4294967295);\n}\n#[repr(transparent)]\n/// @brief Power types\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct RSMI_POWER_TYPE(pub ::core::ffi::c_uint);\n/// @brief The utilization counter data\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_utilization_counter_t {\n    ///!< Utilization counter type\n    pub type_: RSMI_UTILIZATION_COUNTER_TYPE,\n    ///!< Utilization counter value\n    pub value: u64,\n}\n/// @brief Reserved Memory Page Record\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_retired_page_record_t {\n    ///!< Start address of page\n    pub page_address: u64,\n    ///!< Page size\n    pub page_size: u64,\n    ///!< Page \"reserved\" status\n    pub status: rsmi_memory_page_status_t,\n}\n/** @brief This structure contains information about which power profiles are\n supported by the system for a given device, and which power profile is\n currently active.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_power_profile_status_t {\n    /// Which profiles are supported by this system\n    pub available_profiles: rsmi_bit_field_t,\n    /// Which power profile is currently active\n    pub current: rsmi_power_profile_preset_masks_t,\n    /// How many power profiles are available\n    pub num_profiles: u32,\n}\n/// \\cond Ignore in docs.\npub type rsmi_power_profile_status = rsmi_power_profile_status_t;\n/// @brief This structure holds information about clock frequencies.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_frequencies_t {\n    /// Deep Sleep frequency is only supported by some GPUs\n    pub has_deep_sleep: bool,\n    /// The number of supported frequencies\n    pub num_supported: u32,\n    /// The current frequency index\n    pub current: u32,\n    /** List of frequencies.\n Only the first num_supported frequencies are valid.*/\n    pub frequency: [u64; 33usize],\n}\n/// \\cond Ignore in docs.\npub type rsmi_frequencies = rsmi_frequencies_t;\n/** @brief This structure holds information about the possible PCIe\n bandwidths. Specifically, the possible transfer rates and their\n associated numbers of lanes are stored here.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_pcie_bandwidth_t {\n    /// Transfer rates (T/s) that are possible\n    pub transfer_rate: rsmi_frequencies_t,\n    /** List of lanes for corresponding transfer rate.\n Only the first num_supported bandwidths are valid.*/\n    pub lanes: [u32; 33usize],\n}\n/// \\cond Ignore in docs.\npub type rsmi_pcie_bandwidth = rsmi_pcie_bandwidth_t;\n/** @brief This structure holds information about the possible activity\n averages. Specifically, the utilization counters.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_activity_metric_counter_t {\n    ///!< Average graphics activity\n    pub average_gfx_activity: u16,\n    ///!< memory controller\n    pub average_umc_activity: u16,\n    ///!< UVD or VCN\n    pub average_mm_activity: u16,\n}\n/// @brief This structure holds version information.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_version_t {\n    ///!< Major version\n    pub major: u32,\n    ///!< Minor version\n    pub minor: u32,\n    ///!< Patch, build  or stepping version\n    pub patch: u32,\n    ///!< Build string\n    pub build: *const ::core::ffi::c_char,\n}\n/// \\cond Ignore in docs.\npub type rsmi_version = rsmi_version_t;\n#[doc = \" \\\\endcond\\n**\\n* @brief This structure represents a range (e.g., frequencies or voltages).\\n*/\"]\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_range_t {\n    ///!< Lower bound of range\n    pub lower_bound: u64,\n    ///!< Upper bound of range\n    pub upper_bound: u64,\n}\n/// \\cond Ignore in docs.\npub type rsmi_range = rsmi_range_t;\n/// @brief This structure represents a point on the frequency-voltage plane.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_od_vddc_point_t {\n    ///!< Frequency coordinate (in Hz)\n    pub frequency: u64,\n    ///!< Voltage coordinate (in mV)\n    pub voltage: u64,\n}\n/// \\cond Ignore in docs.\npub type rsmi_od_vddc_point = rsmi_od_vddc_point_t;\n/** @brief This structure holds 2 ::rsmi_range_t's, one for frequency and one for\n voltage. These 2 ranges indicate the range of possible values for the\n corresponding ::rsmi_od_vddc_point_t.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_freq_volt_region_t {\n    ///!< The frequency range for this VDDC Curve point\n    pub freq_range: rsmi_range_t,\n    ///!< The voltage range for this VDDC Curve point\n    pub volt_range: rsmi_range_t,\n}\n/// \\cond Ignore in docs.\npub type rsmi_freq_volt_region = rsmi_freq_volt_region_t;\n/// ::RSMI_NUM_VOLTAGE_CURVE_POINTS number of ::rsmi_od_vddc_point_t's\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_od_volt_curve_t {\n    /** Array of ::RSMI_NUM_VOLTAGE_CURVE_POINTS ::rsmi_od_vddc_point_t's that\n make up the voltage frequency curve points.*/\n    pub vc_points: [rsmi_od_vddc_point_t; 3usize],\n}\n/// \\cond Ignore in docs.\npub type rsmi_od_volt_curve = rsmi_od_volt_curve_t;\n/// @brief This structure holds the frequency-voltage values for a device.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_od_volt_freq_data_t {\n    ///!< The current SCLK frequency range\n    pub curr_sclk_range: rsmi_range_t,\n    /**!< The current MCLK frequency range;\n!< (upper bound only)*/\n    pub curr_mclk_range: rsmi_range_t,\n    ///!< The range possible of SCLK values\n    pub sclk_freq_limits: rsmi_range_t,\n    ///!< The range possible of MCLK values\n    pub mclk_freq_limits: rsmi_range_t,\n    /// @brief The current voltage curve\n    pub curve: rsmi_od_volt_curve_t,\n    ///!< The number of voltage curve regions\n    pub num_regions: u32,\n}\n/// \\cond Ignore in docs.\npub type rsmi_od_volt_freq_data = rsmi_od_volt_freq_data_t;\n/// @brief Size and version information of metrics data\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct metrics_table_header_t {\n    /// \\cond Ignore in docs.\n    pub structure_size: u16,\n    pub format_revision: u8,\n    pub content_revision: u8,\n}\n/// @brief The following structures hold the gpu statistics for a device.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct amdgpu_xcp_metrics_t {\n    pub gfx_busy_inst: [u32; 8usize],\n    pub jpeg_busy: [u16; 32usize],\n    pub vcn_busy: [u16; 4usize],\n    pub gfx_busy_acc: [u64; 8usize],\n    pub gfx_below_host_limit_acc: [u64; 8usize],\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_gpu_metrics_t {\n    /// \\cond Ignore in docs.\n    pub common_header: metrics_table_header_t,\n    pub temperature_edge: u16,\n    pub temperature_hotspot: u16,\n    pub temperature_mem: u16,\n    pub temperature_vrgfx: u16,\n    pub temperature_vrsoc: u16,\n    pub temperature_vrmem: u16,\n    pub average_gfx_activity: u16,\n    pub average_umc_activity: u16,\n    pub average_mm_activity: u16,\n    pub average_socket_power: u16,\n    pub energy_accumulator: u64,\n    pub system_clock_counter: u64,\n    pub average_gfxclk_frequency: u16,\n    pub average_socclk_frequency: u16,\n    pub average_uclk_frequency: u16,\n    pub average_vclk0_frequency: u16,\n    pub average_dclk0_frequency: u16,\n    pub average_vclk1_frequency: u16,\n    pub average_dclk1_frequency: u16,\n    pub current_gfxclk: u16,\n    pub current_socclk: u16,\n    pub current_uclk: u16,\n    pub current_vclk0: u16,\n    pub current_dclk0: u16,\n    pub current_vclk1: u16,\n    pub current_dclk1: u16,\n    pub throttle_status: u32,\n    pub current_fan_speed: u16,\n    pub pcie_link_width: u16,\n    pub pcie_link_speed: u16,\n    pub gfx_activity_acc: u32,\n    pub mem_activity_acc: u32,\n    pub temperature_hbm: [u16; 4usize],\n    pub firmware_timestamp: u64,\n    pub voltage_soc: u16,\n    pub voltage_gfx: u16,\n    pub voltage_mem: u16,\n    pub indep_throttle_status: u64,\n    pub current_socket_power: u16,\n    pub vcn_activity: [u16; 4usize],\n    pub gfxclk_lock_status: u32,\n    pub xgmi_link_width: u16,\n    pub xgmi_link_speed: u16,\n    pub pcie_bandwidth_acc: u64,\n    pub pcie_bandwidth_inst: u64,\n    pub pcie_l0_to_recov_count_acc: u64,\n    pub pcie_replay_count_acc: u64,\n    pub pcie_replay_rover_count_acc: u64,\n    pub xgmi_read_data_acc: [u64; 8usize],\n    pub xgmi_write_data_acc: [u64; 8usize],\n    pub current_gfxclks: [u16; 8usize],\n    pub current_socclks: [u16; 4usize],\n    pub current_vclk0s: [u16; 4usize],\n    pub current_dclk0s: [u16; 4usize],\n    pub jpeg_activity: [u16; 32usize],\n    pub pcie_nak_sent_count_acc: u32,\n    pub pcie_nak_rcvd_count_acc: u32,\n    pub accumulation_counter: u64,\n    /// Accumulated throttler residencies\n    pub prochot_residency_acc: u64,\n    /** Accumulated throttler residencies\n\n Prochot (thermal) - PPT (power)\n Package Power Tracking (PPT) violation % (greater than 0% is a violation);\n aka PVIOL\n\n Ex. PVIOL/TVIOL calculations\n Where A and B are measurments recorded at prior points in time.\n Typically A is the earlier measured value and B is the latest measured value.\n\n PVIOL % = (PptResidencyAcc (B) - PptResidencyAcc (A)) * 100/ (AccumulationCounter (B) - AccumulationCounter (A))\n TVIOL % = (SocketThmResidencyAcc (B) -  SocketThmResidencyAcc (A)) * 100 / (AccumulationCounter (B) - AccumulationCounter (A))*/\n    pub ppt_residency_acc: u64,\n    /** Accumulated throttler residencies\n\n Socket (thermal) -\n Socket thermal violation % (greater than 0% is a violation);\n aka TVIOL\n\n Ex. PVIOL/TVIOL calculations\n Where A and B are measurments recorded at prior points in time.\n Typically A is the earlier measured value and B is the latest measured value.\n\n PVIOL % = (PptResidencyAcc (B) - PptResidencyAcc (A)) * 100/ (AccumulationCounter (B) - AccumulationCounter (A))\n TVIOL % = (SocketThmResidencyAcc (B) -  SocketThmResidencyAcc (A)) * 100 / (AccumulationCounter (B) - AccumulationCounter (A))*/\n    pub socket_thm_residency_acc: u64,\n    pub vr_thm_residency_acc: u64,\n    pub hbm_thm_residency_acc: u64,\n    pub num_partition: u16,\n    pub xcp_stats: [amdgpu_xcp_metrics_t; 8usize],\n    pub pcie_lc_perf_other_end_recovery: u32,\n    pub vram_max_bandwidth: u64,\n    pub xgmi_link_status: [u16; 8usize],\n}\n/// @brief This structure holds error counts.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_error_count_t {\n    ///!< Accumulated correctable errors\n    pub correctable_err: u64,\n    ///!< Accumulated uncorrectable errors\n    pub uncorrectable_err: u64,\n}\n/// @brief This structure contains information specific to a process.\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_process_info_t {\n    ///!< Process ID\n    pub process_id: u32,\n    ///!< PASID\n    pub pasid: u32,\n    ///!< VRAM usage\n    pub vram_usage: u64,\n    ///!< SDMA usage in microseconds\n    pub sdma_usage: u64,\n    ///!< Compute Unit usage in percent\n    pub cu_occupancy: u32,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct rsmi_func_id_iter_handle {\n    _unused: [u8; 0],\n}\n/// @brief Opaque handle to function-support object\npub type rsmi_func_id_iter_handle_t = *mut rsmi_func_id_iter_handle;\n/** @brief This union holds the value of an ::rsmi_func_id_iter_handle_t. The\n value may be a function name, or an ennumerated variant value of types\n such as ::rsmi_memory_type_t, ::rsmi_temperature_metric_t, etc.*/\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union id {\n    ///!< uint64_t representation of value\n    pub id: u64,\n    ///!< name string (applicable to functions only)\n    pub name: *const ::core::ffi::c_char,\n    pub __bindgen_anon_1: id__bindgen_ty_1,\n}\n#[repr(C)]\n#[derive(Copy, Clone)]\npub union id__bindgen_ty_1 {\n    /// Used for ::rsmi_memory_type_t variants\n    pub memory_type: rsmi_memory_type_t,\n    /// Used for ::rsmi_temperature_metric_t variants\n    pub temp_metric: rsmi_temperature_metric_t,\n    /// Used for ::rsmi_event_type_t variants\n    pub evnt_type: rsmi_event_type_t,\n    /// Used for ::rsmi_event_group_t variants\n    pub evnt_group: rsmi_event_group_t,\n    /// Used for ::rsmi_clk_type_t variants\n    pub clk_type: rsmi_clk_type_t,\n    /// Used for ::rsmi_fw_block_t variants\n    pub fw_block: rsmi_fw_block_t,\n    /// Used for ::rsmi_gpu_block_t variants\n    pub gpu_block_type: rsmi_gpu_block_t,\n}\n/** @brief This union holds the value of an ::rsmi_func_id_iter_handle_t. The\n value may be a function name, or an ennumerated variant value of types\n such as ::rsmi_memory_type_t, ::rsmi_temperature_metric_t, etc.*/\npub type rsmi_func_id_value_t = id;\n/** @struct rsmi_device_identifiers_t\n @brief Structure to hold various identifiers for a GPU device.\n\n @details This structure contains fields that uniquely identify a GPU device,\n including its card index, DRM render minor, PCI Bus/Device/Function ID (BDFID),\n KFD GPU ID, partition ID, and SMI device ID.*/\n#[repr(C)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rsmi_device_identifiers_t {\n    pub card_index: u32,\n    pub drm_render_minor: u32,\n    pub bdfid: u64,\n    pub kfd_gpu_id: u64,\n    pub partition_id: u32,\n    pub smi_device_id: u32,\n    pub reserved: [u32; 10usize],\n}\nextern \"C\" {\n    #[must_use]\n    #[doc = \"/\\n/** @defgroup InitShutAdmin Initialization and Shutdown\\n  These functions are used for initialization of ROCm SMI and clean up when\\n  done.\\n  @{\\n/\\n/**\\n  @brief Initialize ROCm SMI.\\n\\n  @details When called, this initializes internal data structures,\\n  including those corresponding to sources of information that SMI provides.\\n\\n  @param[in] init_flags Bit flags that tell SMI how to initialze. Values of\\n  ::rsmi_init_flags_t may be OR'd together and passed through @p init_flags\\n  to modify how RSMI initializes.\\n\\n  @retval ::RSMI_STATUS_SUCCESS is returned upon successful call.\"]\n    pub fn rsmi_init(init_flags: u64) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Shutdown ROCm SMI.\n\n  @details Do any necessary clean up.*/\n    pub fn rsmi_shut_down() -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    #[doc = \"/\\n/** @defgroup IDQuer Identifier Queries\\n  These functions provide identification information.\\n  @{\\n/\\n/**\\n  @brief Get the number of devices that have monitor information.\\n\\n  @details The number of devices which have monitors is returned. Monitors\\n  are referenced by the index which can be between 0 and @p num_devices - 1.\\n\\n  @param[inout] num_devices Caller provided pointer to uint32_t. Upon\\n  successful call, the value num_devices will contain the number of monitor\\n  devices.\\n\\n  @retval ::RSMI_STATUS_SUCCESS is returned upon successful call.\"]\n    pub fn rsmi_num_monitor_devices(num_devices: *mut u32) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the device id associated with the device with provided device\n  index.\n\n  @details Given a device index @p dv_ind and a pointer to a uint32_t @p id,\n  this function will write the device id value to the uint64_t pointed to by\n  @p id. This ID is an identification of the type of device, so calling this\n  function for different devices will give the same value if they are kind\n  of device. Consequently, this function should not be used to distinguish\n  one device from another. rsmi_dev_pci_id_get() should be used to get a\n  unique identifier.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] id a pointer to uint64_t to which the device id will be\n  written\n If this parameter is nullptr, this function will return\n ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n provided arguments.\n\n @retval ::RSMI_STATUS_SUCCESS call was successful\n @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n support this function with the given arguments\n @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_id_get(dv_ind: u32, id: *mut u16) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the device revision associated with the device\n\n  @details Given a device index @p dv_ind and a pointer to a uint32_t to\n  which the revision will be written\n\n  @param[in] dv_ind a device index\n\n  @param[inout] revision a pointer to uint32_t to which the device revision\n  will be written\n\n  @retval ::RSMI_STATUS_SUCCESS is returned upon successful call.\n*/\n    pub fn rsmi_dev_revision_get(dv_ind: u32, revision: *mut u16) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the SKU for a desired device associated with the device with\n  provided device index.\n\n  @details Given a device index @p dv_ind and a pointer to a char @p sku,\n  this function will attempt to obtain the SKU from the Product Information\n  FRU chip, present on server ASICs. It will write the sku value to the\n  char array pointed to by @p sku.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] sku a pointer to char to which the sku will be written\n\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_sku_get(dv_ind: u32, sku: *mut u16) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the device vendor id associated with the device with provided\n  device index.\n\n  @details Given a device index @p dv_ind and a pointer to a uint32_t @p id,\n  this function will write the device vendor id value to the uint64_t pointed\n  to by @p id.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] id a pointer to uint64_t to which the device vendor id will\n  be written\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_vendor_id_get(dv_ind: u32, id: *mut u16) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the name string of a gpu device.\n\n  @details Given a device index @p dv_ind, a pointer to a caller provided\n  char buffer @p name, and a length of this buffer @p len, this function\n  will write the name of the device (up to @p len characters) to the buffer\n  @p name.\n\n  If the integer ID associated with the device is not found in one of the\n  system files containing device name information (e.g.\n  /usr/share/misc/pci.ids), then this function will return the hex device ID\n  as a string. Updating the system name files can be accompplished with\n  \"sudo update-pciids\".\n\n  @param[in] dv_ind a device index\n\n  @param[inout] name a pointer to a caller provided char buffer to which the\n  name will be written\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @param[in] len the length of the caller provided buffer @p name.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n  @retval ::RSMI_STATUS_INSUFFICIENT_SIZE is returned if @p len bytes is not\n  large enough to hold the entire name. In this case, only @p len bytes will\n  be written.\n*/\n    pub fn rsmi_dev_name_get(\n        dv_ind: u32,\n        name: *mut ::core::ffi::c_char,\n        len: usize,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the brand string of a gpu device.\n\n  @details Given a device index @p dv_ind, a pointer to a caller provided\n  char buffer @p brand, and a length of this buffer @p len, this function\n  will write the brand of the device (up to @p len characters) to the buffer\n  @p brand.\n\n  If the sku associated with the device is not found as one of the values\n  contained within rsmi_dev_brand_get, then this function will return the\n  device marketing name as a string instead of the brand name.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] brand a pointer to a caller provided char buffer to which the\n  brand will be written\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @param[in] len the length of the caller provided buffer @p brand.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n  @retval ::RSMI_STATUS_INSUFFICIENT_SIZE is returned if @p len bytes is not\n  large enough to hold the entire name. In this case, only @p len bytes will\n  be written.\n*/\n    pub fn rsmi_dev_brand_get(\n        dv_ind: u32,\n        brand: *mut ::core::ffi::c_char,\n        len: u32,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the name string for a give vendor ID\n\n  @details Given a device index @p dv_ind, a pointer to a caller provided\n  char buffer @p name, and a length of this buffer @p len, this function will\n  write the name of the vendor (up to @p len characters) buffer @p name. The\n  @p id may be a device vendor or subsystem vendor ID.\n\n  If the integer ID associated with the vendor is not found in one of the\n  system files containing device name information (e.g.\n  /usr/share/misc/pci.ids), then this function will return the hex vendor ID\n  as a string. Updating the system name files can be accompplished with\n  \"sudo update-pciids\".\n\n  @param[in] dv_ind a device index\n\n  @param[inout] name a pointer to a caller provided char buffer to which the\n  name will be written\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @param[in] len the length of the caller provided buffer @p name.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n  @retval ::RSMI_STATUS_INSUFFICIENT_SIZE is returned if @p len bytes is not\n  large enough to hold the entire name. In this case, only @p len bytes will\n  be written.\n*/\n    pub fn rsmi_dev_vendor_name_get(\n        dv_ind: u32,\n        name: *mut ::core::ffi::c_char,\n        len: usize,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the device's market name\n\n  @details Given a device index @p dv_ind, a pointer to a caller provided\n  char buffer @p market_name, and a length of this buffer @p len, this function will\n  write the name of the market name (up to @p len characters) buffer @p market_name.\n\n  @param[inout] market_name a pointer to a caller provided char buffer to which the\n  market name will be written\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_DRM_ERROR if a DRM error occurs\n\n  @param[in] len the length of the caller provided buffer @p name.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n  @retval ::RSMI_STATUS_DRM_ERROR if a DRM error occurs\n  @retval ::RSMI_STATUS_INSUFFICIENT_SIZE is returned if @p len bytes is not\n  large enough to hold the entire name. In this case, only @p len bytes will\n  be written.\n*/\n    pub fn rsmi_dev_market_name_get(\n        dv_ind: u32,\n        market_name: *mut ::core::ffi::c_char,\n        len: u32,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the vram vendor string of a gpu device.\n\n  @details Given a device index @p dv_ind, a pointer to a caller provided\n  char buffer @p brand, and a length of this buffer @p len, this function\n  will write the vram vendor of the device (up to @p len characters) to the\n  buffer @p brand.\n\n  If the vram vendor for the device is not found as one of the values\n  contained within rsmi_dev_vram_vendor_get, then this function will return\n  the string 'unknown' instead of the vram vendor.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] brand a pointer to a caller provided char buffer to which the\n  vram vendor will be written\n\n  @param[in] len the length of the caller provided buffer @p brand.\n\n  @retval ::RSMI_STATUS_SUCCESS is returned upon successful call.\n*/\n    pub fn rsmi_dev_vram_vendor_get(\n        dv_ind: u32,\n        brand: *mut ::core::ffi::c_char,\n        len: u32,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /** @brief Get the serial number string for a device\n\n @details Given a device index @p dv_ind, a pointer to a buffer of chars\n @p serial_num, and the length of the provided buffer @p len, this function\n will write the serial number string (up to @p len characters) to the buffer\n pointed to by @p serial_num.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] serial_num a pointer to caller-provided memory to which the\n  serial number will be written\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @param[in] len the length of the caller provided buffer @p serial_num.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n  @retval ::RSMI_STATUS_INSUFFICIENT_SIZE is returned if @p len bytes is not\n  large enough to hold the entire name. In this case, only @p len bytes will\n  be written.\n*/\n    pub fn rsmi_dev_serial_number_get(\n        dv_ind: u32,\n        serial_num: *mut ::core::ffi::c_char,\n        len: u32,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the subsystem device id associated with the device with\n  provided device index.\n\n  @details Given a device index @p dv_ind and a pointer to a uint32_t @p id,\n  this function will write the subsystem device id value to the uint64_t\n  pointed to by @p id.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] id a pointer to uint64_t to which the subsystem device id\n  will be written\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_subsystem_id_get(dv_ind: u32, id: *mut u16) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the name string for the device subsytem\n\n  @details Given a device index @p dv_ind, a pointer to a caller provided\n  char buffer @p name, and a length of this buffer @p len, this function\n  will write the name of the device subsystem (up to @p len characters)\n  to the buffer @p name.\n\n  If the integer ID associated with the sub-system is not found in one of the\n  system files containing device name information (e.g.\n  /usr/share/misc/pci.ids), then this function will return the hex sub-system\n  ID as a string. Updating the system name files can be accompplished with\n  \"sudo update-pciids\".\n\n  @param[in] dv_ind a device index\n\n  @param[inout] name a pointer to a caller provided char buffer to which the\n  name will be written\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @param[in] len the length of the caller provided buffer @p name.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n  @retval ::RSMI_STATUS_INSUFFICIENT_SIZE is returned if @p len bytes is not\n  large enough to hold the entire name. In this case, only @p len bytes will\n  be written.\n*/\n    pub fn rsmi_dev_subsystem_name_get(\n        dv_ind: u32,\n        name: *mut ::core::ffi::c_char,\n        len: usize,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the drm minor number associated with this device\n\n  @details Given a device index @p dv_ind, find its render device file\n  /dev/dri/renderDN where N corresponds to its minor number.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] minor a pointer to a uint32_t into which minor number will\n  be copied\n\n  @retval ::RSMI_STATUS_SUCCESS is returned upon successful call.\n  @retval ::RSMI_STATUS_INIT_ERROR if failed to get minor number during\n  initialization.\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_drm_render_minor_get(dv_ind: u32, minor: *mut u32) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the device subsystem vendor id associated with the device with\n  provided device index.\n\n  @details Given a device index @p dv_ind and a pointer to a uint32_t @p id,\n  this function will write the device subsystem vendor id value to the\n  uint64_t pointed to by @p id.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] id a pointer to uint64_t to which the device subsystem vendor\n  id will be written\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid*/\n    pub fn rsmi_dev_subsystem_vendor_id_get(dv_ind: u32, id: *mut u16) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get Unique ID\n\n  @details Given a device index @p dv_ind and a pointer to a uint64_t @p\n  id, this function will write the unique ID of the GPU pointed to @p\n  id.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] id a pointer to uint64_t to which the unique ID of the GPU\n  is written\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid*/\n    pub fn rsmi_dev_unique_id_get(dv_ind: u32, id: *mut u64) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the XGMI physical id associated with the device\n\n  @details Given a device index @p dv_ind and a pointer to a uint32_t to\n  which the XGMI physical id will be written\n\n  @param[in] dv_ind a device index\n\n  @param[inout] id a pointer to uint32_t to which the XGMI physical id\n  will be written\n\n  @retval ::RSMI_STATUS_SUCCESS is returned upon successful call.\n*/\n    pub fn rsmi_dev_xgmi_physical_id_get(dv_ind: u32, id: *mut u16) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the GUID, also known as the GPU device id,\n  associated with the provided device index indicated by KFD.\n\n  @details Given a device index @p dv_ind and a pointer to a uint64_t\n  @p guid, this function will write the KFD GPU id value to the\n  uint64_t pointed to by @p guid.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] guid a pointer to uint64_t to which the KFD gpu id will be\n  written. If the @p guid parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS. If the GPU ID is not supported with\n  the device index queried, gpu_id will return MAX UINT64 value an\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED as a response.\n\n @retval ::RSMI_STATUS_SUCCESS call was successful\n @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n support this function with the given arguments\n @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_guid_get(dv_ind: u32, guid: *mut u64) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the node id associated with the provided device index\n  indicated by KFD.\n\n  @details Given a device index @p dv_ind and a pointer to a uint32_t\n  @p node_id, this function will write the KFD node id value to the\n  uint32_t pointed to by @p node_id.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] node_id a pointer to uint64_t to which the KFD gpu id will be\n  written. If the @p node_id parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS. If @p node_id is not supported with\n  the device index queried, @p node_id will return MAX UINT64 value as an\n  argument and ::RSMI_STATUS_NOT_SUPPORTED as a response.\n\n @retval ::RSMI_STATUS_SUCCESS call was successful\n @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n support this function with the given arguments\n @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_node_id_get(dv_ind: u32, node_id: *mut u32) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /** @brief Retrieves the device identifiers for a specific GPU device.\n\n @details This function retrieves various identifiers for a GPU device, such as\n the card index, DRM render minor, BDFID, KFD GPU ID, partition ID, and SMI device ID.\n The identifiers are written to the provided `rsmi_device_identifiers_t` structure.\n\n @param[in] dv_ind a device index.\n\n @param[out] identifiers A pointer to a structure of type `rsmi_device_identifiers_t`\n                         where the device identifiers will be stored. The structure\n                         contains fields such as:\n                         - `card_index`: The card index of the device.\n                         - `drm_render_minor`: The DRM render minor number.\n                         - `bdfid`: The Bus/Device/Function PCI identifier.\n                         - `kfd_gpu_id`: The KFD GPU ID.\n                         - `partition_id`: The partition ID of the device.\n                         - `smi_device_id`: The SMI device ID.\n\n @retval ::RSMI_STATUS_SUCCESS The call was successful, and the device identifiers were retrieved.\n @retval ::RSMI_STATUS_NOT_SUPPORTED The installed software or hardware does not support this function\n                                     with the given arguments.\n @retval ::RSMI_STATUS_INVALID_ARGS The provided arguments are invalid.\n\n @note Ensure that the `identifiers` pointer is valid and points to a properly allocated structure\n       before calling this function.*/\n    pub fn rsmi_dev_device_identifiers_get(\n        dv_ind: u32,\n        identifiers: *mut rsmi_device_identifiers_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    #[doc = \"/\\n/** @defgroup PCIeQuer PCIe Queries\\n  These functions provide information about PCIe.\\n  @{\\n/\\n/**\\n  @brief Get the list of possible PCIe bandwidths that are available.\\n\\n  @details Given a device index @p dv_ind and a pointer to a to an\\n  ::rsmi_pcie_bandwidth_t structure @p bandwidth, this function will fill in\\n  @p bandwidth with the possible T/s values and associated number of lanes,\\n  and indication of the current selection.\\n\\n  @param[in] dv_ind a device index\\n\\n  @param[inout] bandwidth a pointer to a caller provided\\n  ::rsmi_pcie_bandwidth_t structure to which the frequency information will be\\n  written\\n\\n  @retval ::RSMI_STATUS_SUCCESS is returned upon successful call.\\n  @retval ::RSMI_STATUS_UNEXPECTED_DATA Data read or provided was not as\\n  expected\\n\"]\n    pub fn rsmi_dev_pci_bandwidth_get(\n        dv_ind: u32,\n        bandwidth: *mut rsmi_pcie_bandwidth_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the unique PCI device identifier associated for a device\n\n  @details Give a device index @p dv_ind and a pointer to a uint64_t @p\n  bdfid, this function will write the Bus/Device/Function PCI identifier\n  (BDFID) associated with device @p dv_ind to the value pointed to by\n  @p bdfid.\n\n  The format of @p bdfid will be as follows:\n\n      BDFID = ((DOMAIN & 0xFFFFFFFF) << 32) | ((Partition & 0xF) << 28)\n              | ((BUS & 0xFF) << 8) | ((DEVICE & 0x1F) <<3 )\n              | (FUNCTION & 0x7)\n\n  \\code{.unparsed}\n  | Name         | Field   | KFD property       KFD -> PCIe ID (uint64_t)\n  -------------- | ------- | ---------------- | ---------------------------- |\n  | Domain       | [63:32] | \"domain\"         | (DOMAIN & 0xFFFFFFFF) << 32  |\n  | Partition id | [31:28] | \"location id\"    | (LOCATION & 0xF0000000)      |\n  | Reserved     | [27:16] | \"location id\"    | N/A                          |\n  | Bus          | [15: 8] | \"location id\"    | (LOCATION & 0xFF00)          |\n  | Device       | [ 7: 3] | \"location id\"    | (LOCATION & 0xF8)            |\n  | Function     | [ 2: 0] | \"location id\"    | (LOCATION & 0x7)             |\n  \\endcode\n\n  Note: In some devices, the partition ID may be stored in the function bits\n  BDFID[2:0] instead of BDFID[31:28].\n\n  Note: For MI series devices, the function bits are only used to store the\n  partition ID, but this modified BDF is internal to the ROCm stack.\n  To the OS, partitions share the same BDF as the unpartitioned device and\n  have function bits = 0, which can be verified through lspci.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] bdfid a pointer to uint64_t to which the device bdfid value\n  will be written\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid*/\n    pub fn rsmi_dev_pci_id_get(dv_ind: u32, bdfid: *mut u64) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the NUMA node associated with a device\n\n  @details Given a device index @p dv_ind and a pointer to a uint32_t @p\n  numa_node, this function will retrieve the NUMA node value associated\n  with device @p dv_ind and store the value at location pointed to by\n  @p numa_node.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] numa_node pointer to location where NUMA node value will\n  be written.\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid*/\n    pub fn rsmi_topo_numa_affinity_get(\n        dv_ind: u32,\n        numa_node: *mut i32,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get PCIe traffic information\n\n  @details Give a device index @p dv_ind and pointers to a uint64_t's, @p\n  sent, @p received and @p max_pkt_sz, this function will write the number\n  of bytes sent and received in 1 second to @p sent and @p received,\n  respectively. The maximum possible packet size will be written to\n  @p max_pkt_sz.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] sent a pointer to uint64_t to which the number of bytes sent\n  will be written in 1 second. If pointer is NULL, it will be ignored.\n\n  @param[inout] received a pointer to uint64_t to which the number of bytes\n  received will be written. If pointer is NULL, it will be ignored.\n\n  @param[inout] max_pkt_sz a pointer to uint64_t to which the maximum packet\n  size will be written. If pointer is NULL, it will be ignored.\n\n  @retval ::RSMI_STATUS_SUCCESS is returned upon successful call.\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments*/\n    pub fn rsmi_dev_pci_throughput_get(\n        dv_ind: u32,\n        sent: *mut u64,\n        received: *mut u64,\n        max_pkt_sz: *mut u64,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get PCIe replay counter\n\n  @details Given a device index @p dv_ind and a pointer to a uint64_t @p\n  counter, this function will write the sum of the number of NAK's received\n  by the GPU and the NAK's generated by the GPU to memory pointed to by @p\n  counter.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] counter a pointer to uint64_t to which the sum of the NAK's\n  received and generated by the GPU is written\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid*/\n    pub fn rsmi_dev_pci_replay_counter_get(\n        dv_ind: u32,\n        counter: *mut u64,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Control the set of allowed PCIe bandwidths that can be used.\n\n  @details Given a device index @p dv_ind and a 64 bit bitmask @p bw_bitmask,\n  this function will limit the set of allowable bandwidths. If a bit in @p\n  bw_bitmask has a value of 1, then the frequency (as ordered in an\n  ::rsmi_frequencies_t returned by ::rsmi_dev_gpu_clk_freq_get()) corresponding\n  to that bit index will be allowed.\n\n  This function will change the performance level to\n  ::RSMI_DEV_PERF_LEVEL_MANUAL in order to modify the set of allowable\n  band_widths. Caller will need to set to ::RSMI_DEV_PERF_LEVEL_AUTO in order\n  to get back to default state.\n\n  All bits with indices greater than or equal to the value of the\n  ::rsmi_frequencies_t::num_supported field of ::rsmi_pcie_bandwidth_t will be\n  ignored.\n\n  @param[in] dv_ind a device index\n\n  @param[in] bw_bitmask A bitmask indicating the indices of the\n  bandwidths that are to be enabled (1) and disabled (0). Only the lowest\n  ::rsmi_frequencies_t::num_supported (of ::rsmi_pcie_bandwidth_t) bits of\n  this mask are relevant.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_PERMISSION function requires root access\n*/\n    pub fn rsmi_dev_pci_bandwidth_set(dv_ind: u32, bw_bitmask: u64) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    #[doc = \"/\\n/** @defgroup PowerQuer Power Queries\\n  These functions provide information about power usage.\\n  @{\\n/\\n/**\\n  @brief Get the average power consumption of the device with provided\\n  device index.\\n\\n  @details Given a device index @p dv_ind and a pointer to a uint64_t\\n  @p power, this function will write the current average power consumption\\n  (in microwatts) to the uint64_t pointed to by @p power.\\n\\n  @deprecated ::rsmi_dev_power_get() is preferred due to providing\\n  backwards compatibility, which looks at both average and current power\\n  values. Whereas ::rsmi_dev_power_ave_get only looks for average power\\n  consumption. Newer ASICs will support current power only.\\n\\n  @param[in] dv_ind a device index\\n\\n  @param[in] sensor_ind a 0-based sensor index. Normally, this will be 0.\\n  If a device has more than one sensor, it could be greater than 0.\\n\\n  @param[inout] power a pointer to uint64_t to which the average power\\n  consumption will be written\\n  If this parameter is nullptr, this function will return\\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\\n  provided arguments.\\n\\n  @retval ::RSMI_STATUS_SUCCESS call was successful\\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\\n  support this function with the given arguments\\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\"]\n    pub fn rsmi_dev_power_ave_get(\n        dv_ind: u32,\n        sensor_ind: u32,\n        power: *mut u64,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the current socket power (also known as instant\n  power) of the device index provided.\n\n  @details Given a device index @p dv_ind and a pointer to a uint64_t\n  @p socket_power, this function will write the current socket power\n  (in microwatts) to the uint64_t pointed to by @p socket_power.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] socket_power a pointer to uint64_t to which the current\n  socket power will be written to. If this parameter is nullptr,\n  this function will return ::RSMI_STATUS_INVALID_ARGS if the function is\n  supported with the provided, arguments and ::RSMI_STATUS_NOT_SUPPORTED\n  if it is not supported with the provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid*/\n    pub fn rsmi_dev_current_socket_power_get(\n        dv_ind: u32,\n        socket_power: *mut u64,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief A generic get which attempts to retieve current socket power\n  (also known as instant power) of the device index provided, if not\n  supported tries to get average power consumed by device. Current\n  socket power is typically supported by newer devices, whereas average\n  power is generally reported on older devices. This function\n  aims to provide backwards compatability depending on device support.\n\n  @details Given a device index @p dv_ind, a pointer to a uint64_t\n  @p power, and @p type this function will write the current socket or\n  average power (in microwatts) to the uint64_t pointed to by @p power and\n  a pointer to its @p type RSMI_POWER_TYPE read.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] power a pointer to uint64_t to which the current or average\n  power will be written to. If this parameter is nullptr,\n  this function will return ::RSMI_STATUS_INVALID_ARGS if the function is\n  supported with the provided, arguments and ::RSMI_STATUS_NOT_SUPPORTED\n  if it is not supported with the provided arguments.\n\n  @param[inout] type a pointer to RSMI_POWER_TYPE object. Returns the type\n  of power retrieved from the device. Current power is ::RSMI_CURRENT_POWER\n  and average power is ::RSMI_AVERAGE_POWER. If an error occurs,\n  returns an invalid power type ::RSMI_INVALID_POWER - example device\n  neither supports average power or current power.\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid*/\n    pub fn rsmi_dev_power_get(\n        dv_ind: u32,\n        power: *mut u64,\n        type_: *mut RSMI_POWER_TYPE,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the energy accumulator counter of the device with provided\n  device index.\n\n  @details Given a device index @p dv_ind, a pointer to a uint64_t\n  @p power, and a pointer to a uint64_t @p timestamp, this function will write\n  amount of energy consumed to the uint64_t pointed to by @p power,\n  and the timestamp to the uint64_t pointed to by @p timestamp.\n  The rsmi_dev_power_ave_get() is an average of a short time. This function\n  accumulates all energy consumed.\n\n  @param[in] dv_ind a device index\n  @param[inout] counter_resolution resolution of the counter @p power in\n  micro Joules\n\n  @param[inout] power a pointer to uint64_t to which the energy\n  counter will be written\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @param[inout] timestamp a pointer to uint64_t to which the timestamp\n  will be written. Resolution: 1 ns.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid*/\n    pub fn rsmi_dev_energy_count_get(\n        dv_ind: u32,\n        power: *mut u64,\n        counter_resolution: *mut f32,\n        timestamp: *mut u64,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the cap on power which, when reached, causes the system to take\n  action to reduce power.\n\n  @details When power use rises above the value @p power, the system will\n  take action to reduce power use. The power level returned through\n  @p power will be in microWatts.\n\n  @param[in] dv_ind a device index\n\n  @param[in] sensor_ind a 0-based sensor index. Normally, this will be 0.\n  If a device has more than one sensor, it could be greater than 0.\n\n  @param[inout] cap a pointer to a uint64_t that indicates the power cap,\n  in microwatts\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid*/\n    pub fn rsmi_dev_power_cap_get(\n        dv_ind: u32,\n        sensor_ind: u32,\n        cap: *mut u64,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the default power cap for the device specified by @p dv_ind.\n\n  @details The maximum power cap be temporarily changed by the user. However,\n  this function always returns the default reset power cap. The power level\n  returned through @p power will be in microWatts.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] default_cap a pointer to a uint64_t that indicates the default\n  power cap, in microwatts\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid*/\n    pub fn rsmi_dev_power_cap_default_get(\n        dv_ind: u32,\n        default_cap: *mut u64,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the range of valid values for the power cap\n\n  @details This function will return the maximum possible valid power cap\n  @p max and the minimum possible valid power cap @p min\n\n  @param[in] dv_ind a device index\n\n  @param[in] sensor_ind a 0-based sensor index. Normally, this will be 0.\n  If a device has more than one sensor, it could be greater than 0.\n\n  @param[inout] max a pointer to a uint64_t that indicates the maximum\n  possible power cap, in microwatts\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @param[inout] min a pointer to a uint64_t that indicates the minimum\n  possible power cap, in microwatts\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_power_cap_range_get(\n        dv_ind: u32,\n        sensor_ind: u32,\n        max: *mut u64,\n        min: *mut u64,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    #[doc = \"/\\n/** @defgroup PowerCont Power Control\\n  These functions provide ways to control power usage.\\n  @{\\n/\\n/**\\n  @brief Set the power cap value\\n\\n  @details This function will set the power cap to the provided value @p cap.\\n  @p cap must be between the minimum and maximum power cap values set by the\\n  system, which can be obtained from ::rsmi_dev_power_cap_range_get.\\n\\n  @param[in] dv_ind a device index\\n\\n  @param[in] sensor_ind a 0-based sensor index. Normally, this will be 0.\\n  If a device has more than one sensor, it could be greater than 0.\\n\\n  @param[in] cap a uint64_t that indicates the desired power cap, in\\n  microwatts\\n\\n  @retval ::RSMI_STATUS_SUCCESS is returned upon successful call.\\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\\n  @retval ::RSMI_STATUS_PERMISSION function requires root access\\n\"]\n    pub fn rsmi_dev_power_cap_set(\n        dv_ind: u32,\n        sensor_ind: u32,\n        cap: u64,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Set the power profile\n\n  @details Given a device index @p dv_ind and a @p profile, this function will\n  attempt to set the current profile to the provided profile. The provided\n  profile must be one of the currently supported profiles, as indicated by a\n  call to ::rsmi_dev_power_profile_presets_get()\n\n  @param[in] dv_ind a device index\n\n  @param[in] reserved Not currently used. Set to 0.\n\n  @param[in] profile a ::rsmi_power_profile_preset_masks_t that hold the mask\n  of the desired new power profile\n\n  @retval ::RSMI_STATUS_SUCCESS is returned upon successful call.\n  @retval ::RSMI_STATUS_PERMISSION function requires root access\n*/\n    pub fn rsmi_dev_power_profile_set(\n        dv_ind: u32,\n        reserved: u32,\n        profile: rsmi_power_profile_preset_masks_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the total amount of memory that exists\n\n  @details Given a device index @p dv_ind, a type of memory @p mem_type, and\n  a pointer to a uint64_t @p total, this function will write the total amount\n  of @p mem_type memory that exists to the location pointed to by @p total.\n\n  @param[in] dv_ind a device index\n\n  @param[in] mem_type The type of memory for which the total amount will be\n  found\n\n  @param[inout] total a pointer to uint64_t to which the total amount of\n  memory will be written\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_memory_total_get(\n        dv_ind: u32,\n        mem_type: rsmi_memory_type_t,\n        total: *mut u64,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the current memory usage\n\n  @details Given a device index @p dv_ind, a type of memory @p mem_type, and\n  a pointer to a uint64_t @p usage, this function will write the amount of\n  @p mem_type memory that that is currently being used to the location\n  pointed to by @p used.\n\n  @param[in] dv_ind a device index\n\n  @param[in] mem_type The type of memory for which the amount being used will\n  be found\n\n  @param[inout] used a pointer to uint64_t to which the amount of memory\n  currently being used will be written\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_memory_usage_get(\n        dv_ind: u32,\n        mem_type: rsmi_memory_type_t,\n        used: *mut u64,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get percentage of time any device memory is being used\n\n  @details Given a device index @p dv_ind, this function returns the\n  percentage of time that any device memory is being used for the specified\n  device.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] busy_percent a pointer to the uint32_t to which the busy\n  percent will be written\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_memory_busy_percent_get(\n        dv_ind: u32,\n        busy_percent: *mut u32,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get information about reserved (\"retired\") memory pages\n\n  @details Given a device index @p dv_ind, this function returns retired page\n  information @p records corresponding to the device with the provided device\n  index @p dv_ind. The number of retired page records is returned through @p\n  num_pages. @p records may be NULL on input. In this case, the number of\n  records available for retrieval will be returned through @p num_pages.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] num_pages a pointer to a uint32. As input, the value passed\n  through this parameter is the number of ::rsmi_retired_page_record_t's that\n  may be safely written to the memory pointed to by @p records. This is the\n  limit on how many records will be written to @p records. On return, @p\n  num_pages will contain the number of records written to @p records, or the\n  number of records that could have been written if enough memory had been\n  provided.\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @param[inout] records A pointer to a block of memory to which the\n  ::rsmi_retired_page_record_t values will be written. This value may be NULL.\n  In this case, this function can be used to query how many records are\n  available to read.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n  @retval ::RSMI_STATUS_INSUFFICIENT_SIZE is returned if more records were available\n  than allowed by the provided, allocated memory.*/\n    pub fn rsmi_dev_memory_reserved_pages_get(\n        dv_ind: u32,\n        num_pages: *mut u32,\n        records: *mut rsmi_retired_page_record_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    #[doc = \" @defgroup PhysQuer Physical State Queries\\n  These functions provide information about the physical characteristics of\\n  the device.\\n  @{\\n/\\n/**\\n  @brief Get the fan speed in RPMs of the device with the specified device\\n  index and 0-based sensor index.\\n\\n  @details Given a device index @p dv_ind and a pointer to a uint32_t\\n  @p speed, this function will write the current fan speed in RPMs to the\\n  uint32_t pointed to by @p speed\\n\\n  @param[in] dv_ind a device index\\n\\n  @param[in] sensor_ind a 0-based sensor index. Normally, this will be 0.\\n  If a device has more than one sensor, it could be greater than 0.\\n\\n  @param[inout] speed a pointer to uint32_t to which the speed will be\\n  written\\n  If this parameter is nullptr, this function will return\\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\\n  provided arguments.\\n\\n  @retval ::RSMI_STATUS_SUCCESS call was successful\\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\\n  support this function with the given arguments\\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\\n\"]\n    pub fn rsmi_dev_fan_rpms_get(\n        dv_ind: u32,\n        sensor_ind: u32,\n        speed: *mut i64,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the fan speed for the specified device as a value relative to\n  ::RSMI_MAX_FAN_SPEED\n\n  @details Given a device index @p dv_ind and a pointer to a uint32_t\n  @p speed, this function will write the current fan speed (a value\n  between 0 and the maximum fan speed, ::RSMI_MAX_FAN_SPEED) to the uint32_t\n  pointed to by @p speed\n\n  @param[in] dv_ind a device index\n\n  @param[in] sensor_ind a 0-based sensor index. Normally, this will be 0.\n  If a device has more than one sensor, it could be greater than 0.\n\n  @param[inout] speed a pointer to uint32_t to which the speed will be\n  written\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_fan_speed_get(\n        dv_ind: u32,\n        sensor_ind: u32,\n        speed: *mut i64,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the max. fan speed of the device with provided device index.\n\n  @details Given a device index @p dv_ind and a pointer to a uint32_t\n  @p max_speed, this function will write the maximum fan speed possible to\n  the uint32_t pointed to by @p max_speed\n\n  @param[in] dv_ind a device index\n\n  @param[in] sensor_ind a 0-based sensor index. Normally, this will be 0.\n  If a device has more than one sensor, it could be greater than 0.\n\n  @param[inout] max_speed a pointer to uint32_t to which the maximum speed\n  will be written\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_fan_speed_max_get(\n        dv_ind: u32,\n        sensor_ind: u32,\n        max_speed: *mut u64,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the temperature metric value for the specified metric, from the\n  specified temperature sensor on the specified device.\n\n  @details Given a device index @p dv_ind, a sensor type @p sensor_type, a\n  ::rsmi_temperature_metric_t @p metric and a pointer to an int64_t @p\n  temperature, this function will write the value of the metric indicated by\n  @p metric and @p sensor_type to the memory location @p temperature.\n\n  @param[in] dv_ind a device index\n\n  @param[in] sensor_type part of device from which temperature should be\n  obtained. This should come from the enum ::rsmi_temperature_type_t\n\n  @param[in] metric enum indicated which temperature value should be\n  retrieved\n\n  @param[inout] temperature a pointer to int64_t to which the temperature\n  will be written, in millidegrees Celcius.\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_temp_metric_get(\n        dv_ind: u32,\n        sensor_type: u32,\n        metric: rsmi_temperature_metric_t,\n        temperature: *mut i64,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the voltage metric value for the specified metric, from the\n  specified voltage sensor on the specified device.\n\n  @details Given a device index @p dv_ind, a sensor type @p sensor_type, a\n  ::rsmi_voltage_metric_t @p metric and a pointer to an int64_t @p\n  voltage, this function will write the value of the metric indicated by\n  @p metric and @p sensor_type to the memory location @p voltage.\n\n  @param[in] dv_ind a device index\n\n  @param[in] sensor_type part of device from which voltage should be\n  obtained. This should come from the enum ::rsmi_voltage_type_t\n\n  @param[in] metric enum indicated which voltage value should be\n  retrieved\n\n  @param[inout] voltage a pointer to int64_t to which the voltage\n  will be written, in millivolts.\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_volt_metric_get(\n        dv_ind: u32,\n        sensor_type: rsmi_voltage_type_t,\n        metric: rsmi_voltage_metric_t,\n        voltage: *mut i64,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    #[doc = \"/\\n/** @defgroup PhysCont Physical State Control\\n  These functions provide control over the physical state of a device.\\n  @{\\n/\\n/**\\n  @brief Reset the fan to automatic driver control\\n\\n  @details This function returns control of the fan to the system\\n\\n  @param[in] dv_ind a device index\\n\\n  @param[in] sensor_ind a 0-based sensor index. Normally, this will be 0.\\n  If a device has more than one sensor, it could be greater than 0.\\n\\n  @retval ::RSMI_STATUS_SUCCESS is returned upon successful call.\\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\\n  support this function with the given arguments\\n\"]\n    pub fn rsmi_dev_fan_reset(dv_ind: u32, sensor_ind: u32) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Set the fan speed for the specified device with the provided speed,\n  in RPMs.\n\n  @details Given a device index @p dv_ind and a integer value indicating\n  speed @p speed, this function will attempt to set the fan speed to @p speed.\n  An error will be returned if the specified speed is outside the allowable\n  range for the device. The maximum value is 255 and the minimum is 0.\n\n  @param[in] dv_ind a device index\n\n  @param[in] sensor_ind a 0-based sensor index. Normally, this will be 0.\n  If a device has more than one sensor, it could be greater than 0.\n\n  @param[in] speed the speed to which the function will attempt to set the fan\n\n  @retval ::RSMI_STATUS_SUCCESS is returned upon successful call.\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_PERMISSION function requires root access\n*/\n    pub fn rsmi_dev_fan_speed_set(\n        dv_ind: u32,\n        sensor_ind: u32,\n        speed: u64,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get percentage of time device is busy doing any processing\n\n  @details Given a device index @p dv_ind, this function returns the\n  percentage of time that the specified device is busy. The device is\n  considered busy if any one or more of its sub-blocks are working, and idle\n  if none of the sub-blocks are working.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] busy_percent a pointer to the uint32_t to which the busy\n  percent will be written\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_busy_percent_get(\n        dv_ind: u32,\n        busy_percent: *mut u32,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get coarse grain utilization counter of the specified device\n\n  @details Given a device index @p dv_ind, the array of the utilization counters,\n  the size of the array, this function returns the coarse grain utilization counters\n  and timestamp.\n  The counter is the accumulated percentages. Every milliseconds the firmware calculates\n  % busy count and then accumulates that value in the counter. This provides minimally\n  invasive coarse grain GPU usage information.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] utilization_counters Multiple utilization counters can be retreived with a single\n  call. The caller must allocate enough space to the utilization_counters array. The caller also\n  needs to set valid RSMI_UTILIZATION_COUNTER_TYPE type for each element of the array.\n  ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the provided arguments.\n\n  If the function reutrns RSMI_STATUS_SUCCESS, the counter will be set in the value field of\n  the rsmi_utilization_counter_t.\n\n  @param[in] count The size of utilization_counters array.\n\n  @param[inout] timestamp The timestamp when the counter is retreived. Resolution: 1 ns.\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_utilization_count_get(\n        dv_ind: u32,\n        utilization_counters: *mut rsmi_utilization_counter_t,\n        count: u32,\n        timestamp: *mut u64,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get activity metric average utilization counter of the specified device\n\n  @details Given a device index @p dv_ind, the activity metric type,\n  this function returns the requested utilization counters\n\n  @param[in] dv_ind a device index\n\n  @param[in] activity_metric_type a metric type\n\n  @param[inout] activity_metric_counter Multiple utilization counters can be retrieved with a single\n  call. The caller must allocate enough space to the rsmi_activity_metric_counter_t structure.\n\n  If the function returns RSMI_STATUS_SUCCESS, the requested type will be set in the corresponding\n  field of the counter will be set in the value field of\n  the activity_metric_counter_t.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_activity_metric_get(\n        dv_ind: u32,\n        activity_metric_type: rsmi_activity_metric_t,\n        activity_metric_counter: *mut rsmi_activity_metric_counter_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get activity metric bandwidth average utilization counter of the specified device\n\n  @details Given a device index @p dv_ind, the activity metric type,\n  this function returns the requested utilization counters\n\n  @param[in] dv_ind a device index\n\n  @param[inout] avg_activity average bandwidth utilization counters can be retrieved\n\n  If the function returns RSMI_STATUS_SUCCESS, the requested type will be set in the corresponding\n  field of the counter will be set in the value field of\n  the activity_metric_counter_t.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_activity_avg_mm_get(\n        dv_ind: u32,\n        avg_activity: *mut u16,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the performance level of the device with provided\n  device index.\n\n  @details Given a device index @p dv_ind and a pointer to a uint32_t @p\n  perf, this function will write the ::rsmi_dev_perf_level_t to the uint32_t\n  pointed to by @p perf\n\n  @param[in] dv_ind a device index\n\n  @param[inout] perf a pointer to ::rsmi_dev_perf_level_t to which the\n  performance level will be written\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_perf_level_get(\n        dv_ind: u32,\n        perf: *mut rsmi_dev_perf_level_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Enter performance determinism mode with provided device index.\n\n  @details Given a device index @p dv_ind and @p clkvalue this function\n  will enable performance determinism mode, which enforces a GFXCLK frequency\n  SoftMax limit per GPU set by the user. This prevents the GFXCLK PLL from\n  stretching when running the same workload on different GPUS, making\n  performance variation minimal. This call will result in the performance\n  level ::rsmi_dev_perf_level_t of the device being\n  ::RSMI_DEV_PERF_LEVEL_DETERMINISM.\n\n  @param[in] dv_ind a device index\n\n  @param[in] clkvalue Softmax value for GFXCLK in MHz.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_perf_determinism_mode_set(dv_ind: u32, clkvalue: u64) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the overdrive percent associated with the device with provided\n  device index.\n\n  @details Given a device index @p dv_ind and a pointer to a uint32_t @p od,\n  this function will write the overdrive percentage to the uint32_t pointed\n  to by @p od\n\n  @param[in] dv_ind a device index\n\n  @param[inout] od a pointer to uint32_t to which the overdrive percentage\n  will be written\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_overdrive_level_get(dv_ind: u32, od: *mut u32) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the memory clock overdrive percent associated with the device\n  with provided device index.\n\n  @details Given a device index @p dv_ind and a pointer to a uint32_t @p od,\n  this function will write the memory overdrive percentage to the uint32_t\n  pointed to by @p od\n\n  @param[in] dv_ind a device index\n\n  @param[inout] od a pointer to uint32_t to which the overdrive percentage\n  will be written\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_mem_overdrive_level_get(dv_ind: u32, od: *mut u32) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the list of possible system clock speeds of device for a\n  specified clock type.\n\n  @details Given a device index @p dv_ind, a clock type @p clk_type, and a\n  pointer to a to an ::rsmi_frequencies_t structure @p f, this function will\n  fill in @p f with the possible clock speeds, and indication of the current\n  clock speed selection.\n\n  @param[in] dv_ind a device index\n\n  @param[in] clk_type the type of clock for which the frequency is desired\n\n  @param[inout] f a pointer to a caller provided ::rsmi_frequencies_t structure\n  to which the frequency information will be written. Frequency values are in\n  Hz.\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n  If multiple current frequencies are found, a warning is shown. If no\n  current frequency is found, it is reflected as -1. If frequencies are not\n  read from low to high a warning is shown as well.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n  @retval ::RSMI_STATUS_UNEXPECTED_DATA Data read or provided was not as\n  expected\n*/\n    pub fn rsmi_dev_gpu_clk_freq_get(\n        dv_ind: u32,\n        clk_type: rsmi_clk_type_t,\n        f: *mut rsmi_frequencies_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Reset the gpu associated with the device with provided device index\n\n  @details Given a device index @p dv_ind, this function will reset the GPU\n\n  @param[in] dv_ind a device index\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_gpu_reset(dv_ind: u32) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief This function retrieves the voltage/frequency curve information\n\n  @details Given a device index @p dv_ind and a pointer to a\n  ::rsmi_od_volt_freq_data_t structure @p odv, this function will populate @p\n  odv. See ::rsmi_od_volt_freq_data_t for more details.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] odv a pointer to an ::rsmi_od_volt_freq_data_t structure\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid*/\n    pub fn rsmi_dev_od_volt_info_get(\n        dv_ind: u32,\n        odv: *mut rsmi_od_volt_freq_data_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief This function retrieves the gpu metrics information\n\n  @details Given a device index @p dv_ind and a pointer to a\n  ::rsmi_gpu_metrics_t structure @p pgpu_metrics, this function will populate\n  @p pgpu_metrics. See ::rsmi_gpu_metrics_t for more details.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] pgpu_metrics a pointer to an ::rsmi_gpu_metrics_t structure\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid*/\n    pub fn rsmi_dev_gpu_metrics_info_get(\n        dv_ind: u32,\n        pgpu_metrics: *mut rsmi_gpu_metrics_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief This function sets the clock range information\n\n  @details Given a device index @p dv_ind, a minimum clock value @p minclkvalue,\n  a maximum clock value @p maxclkvalue and a clock type @p clkType this function\n  will set the sclk|mclk range\n\n  @param[in] dv_ind a device index\n\n  @param[in] minclkvalue value to apply to the clock range. Frequency values\n  are in MHz.\n\n  @param[in] maxclkvalue value to apply to the clock range. Frequency values\n  are in MHz.\n\n  @param[in] clkType RSMI_CLK_TYPE_SYS | RSMI_CLK_TYPE_MEM range type\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid*/\n    pub fn rsmi_dev_clk_range_set(\n        dv_ind: u32,\n        minclkvalue: u64,\n        maxclkvalue: u64,\n        clkType: rsmi_clk_type_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief This function sets the clock min/max level\n\n  @details Given a device index @p dv_ind, a clock value @p minclkvalue,\n  a maximum clock value @p maxclkvalue and a clock type @p clkType this function\n  will set the sclk|mclk range\n\n  @param[in] dv_ind a device index\n\n  @param[in] level RSMI_FREQ_IND_MIN|RSMI_FREQ_IND_MAX\n\n  @param[in] clkvalue value to apply to the clock level. Frequency values\n  are in MHz.\n\n  @param[in] clkType RSMI_CLK_TYPE_SYS | RSMI_CLK_TYPE_MEM level type\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid*/\n    pub fn rsmi_dev_clk_extremum_set(\n        dv_ind: u32,\n        level: rsmi_freq_ind_t,\n        clkvalue: u64,\n        clkType: rsmi_clk_type_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief This function sets the clock frequency information\n\n  @details Given a device index @p dv_ind, a frequency level @p level,\n  a clock value @p clkvalue and a clock type @p clkType this function\n  will set the sclk|mclk range\n\n  @param[in] dv_ind a device index\n\n  @param[in] level RSMI_FREQ_IND_MIN|RSMI_FREQ_IND_MAX to set the\n  minimum (0) or maximum (1) speed.\n\n  @param[in] clkvalue value to apply to the clock range. Frequency values\n  are in MHz.\n\n  @param[in] clkType RSMI_CLK_TYPE_SYS | RSMI_CLK_TYPE_MEM range type\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid*/\n    pub fn rsmi_dev_od_clk_info_set(\n        dv_ind: u32,\n        level: rsmi_freq_ind_t,\n        clkvalue: u64,\n        clkType: rsmi_clk_type_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief This function sets  1 of the 3 voltage curve points.\n\n  @details Given a device index @p dv_ind, a voltage point @p vpoint\n  and a voltage value @p voltvalue this function will set voltage curve point\n\n  @param[in] dv_ind a device index\n\n  @param[in] vpoint voltage point [0|1|2] on the voltage curve\n\n  @param[in] clkvalue clock value component of voltage curve point.\n  Frequency values are in MHz.\n\n  @param[in] voltvalue voltage value component of voltage curve point.\n  Voltage is in mV.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid*/\n    pub fn rsmi_dev_od_volt_info_set(\n        dv_ind: u32,\n        vpoint: u32,\n        clkvalue: u64,\n        voltvalue: u64,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief This function will retrieve the current valid regions in the\n  frequency/voltage space.\n\n  @details Given a device index @p dv_ind, a pointer to an unsigned integer\n  @p num_regions and a buffer of ::rsmi_freq_volt_region_t structures, @p\n  buffer, this function will populate @p buffer with the current\n  frequency-volt space regions. The caller should assign @p buffer to memory\n  that can be written to by this function. The caller should also\n  indicate the number of ::rsmi_freq_volt_region_t structures that can safely\n  be written to @p buffer in @p num_regions.\n\n  The number of regions to expect this function provide (@p num_regions) can\n  be obtained by calling ::rsmi_dev_od_volt_info_get().\n\n  @param[in] dv_ind a device index\n\n  @param[inout] num_regions As input, this is the number of\n  ::rsmi_freq_volt_region_t structures that can be written to @p buffer. As\n  output, this is the number of ::rsmi_freq_volt_region_t structures that were\n  actually written.\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @param[inout] buffer a caller provided buffer to which\n  ::rsmi_freq_volt_region_t structures will be written\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid*/\n    pub fn rsmi_dev_od_volt_curve_regions_get(\n        dv_ind: u32,\n        num_regions: *mut u32,\n        buffer: *mut rsmi_freq_volt_region_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the list of available preset power profiles and an indication of\n  which profile is currently active.\n\n  @details Given a device index @p dv_ind and a pointer to a\n  ::rsmi_power_profile_status_t @p status, this function will set the bits of\n  the ::rsmi_power_profile_status_t.available_profiles bit field of @p status to\n  1 if the profile corresponding to the respective\n  ::rsmi_power_profile_preset_masks_t profiles are enabled. For example, if both\n  the VIDEO and VR power profiles are available selections, then\n  ::RSMI_PWR_PROF_PRST_VIDEO_MASK AND'ed with\n  ::rsmi_power_profile_status_t.available_profiles will be non-zero as will\n  ::RSMI_PWR_PROF_PRST_VR_MASK AND'ed with\n  ::rsmi_power_profile_status_t.available_profiles. Additionally,\n  ::rsmi_power_profile_status_t.current will be set to the\n  ::rsmi_power_profile_preset_masks_t of the profile that is currently active.\n\n  @param[in] dv_ind a device index\n\n  @param[in] sensor_ind a 0-based sensor index. Normally, this will be 0.\n  If a device has more than one sensor, it could be greater than 0.\n\n  @param[inout] status a pointer to ::rsmi_power_profile_status_t that will be\n  populated by a call to this function\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_power_profile_presets_get(\n        dv_ind: u32,\n        sensor_ind: u32,\n        status: *mut rsmi_power_profile_status_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    #[doc = \" @defgroup PerfCont Clock, Power and Performance Control\\n  These functions provide control over clock frequencies, power and\\n  performance.\\n  @{\\n/\\n/**\\n  @brief Set the PowerPlay performance level associated with the device with\\n  provided device index with the provided value.\\n\\n  @deprecated ::rsmi_dev_perf_level_set_v1() is preferred, with an\\n  interface that more closely  matches the rest of the rocm_smi API.\\n\\n  @details Given a device index @p dv_ind and an ::rsmi_dev_perf_level_t @p\\n  perf_level, this function will set the PowerPlay performance level for the\\n  device to the value @p perf_lvl.\\n\\n  @param[in] dv_ind a device index\\n\\n  @param[in] perf_lvl the value to which the performance level should be set\\n\\n  @retval ::RSMI_STATUS_SUCCESS is returned upon successful call.\\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\\n  support this function with the given arguments\\n  @retval ::RSMI_STATUS_PERMISSION function requires root access\\n\"]\n    pub fn rsmi_dev_perf_level_set(\n        dv_ind: u32,\n        perf_lvl: rsmi_dev_perf_level_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Set the PowerPlay performance level associated with the device with\n  provided device index with the provided value.\n\n  @details Given a device index @p dv_ind and an ::rsmi_dev_perf_level_t @p\n  perf_level, this function will set the PowerPlay performance level for the\n  device to the value @p perf_lvl.\n\n  @param[in] dv_ind a device index\n\n  @param[in] perf_lvl the value to which the performance level should be set\n\n  @retval ::RSMI_STATUS_SUCCESS is returned upon successful call.\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_PERMISSION function requires root access\n*/\n    pub fn rsmi_dev_perf_level_set_v1(\n        dv_ind: u32,\n        perf_lvl: rsmi_dev_perf_level_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Set the overdrive percent associated with the device with provided\n  device index with the provided value. See details for WARNING.\n\n  @deprecated This function is deprecated. ::rsmi_dev_overdrive_level_set_v1\n  has the same functionaltiy, with an interface that more closely\n  matches the rest of the rocm_smi API.\n\n  @details Given a device index @p dv_ind and an overdrive level @p od,\n  this function will set the overdrive level for the device to the value\n  @p od. The overdrive level is an integer value between 0 and 20, inclusive,\n  which represents the overdrive percentage; e.g., a value of 5 specifies\n  an overclocking of 5%.\n\n  The overdrive level is specific to the gpu system clock.\n\n  The overdrive level is the percentage above the maximum Performance Level\n  to which overclocking will be limited. The overclocking percentage does\n  not apply to clock speeds other than the maximum. This percentage is\n  limited to 20%.\n\n   ******WARNING******\n  Operating your AMD GPU outside of official AMD specifications or outside of\n  factory settings, including but not limited to the conducting of\n  overclocking (including use of this overclocking software, even if such\n  software has been directly or indirectly provided by AMD or otherwise\n  affiliated in any way with AMD), may cause damage to your AMD GPU, system\n  components and/or result in system failure, as well as cause other problems.\n  DAMAGES CAUSED BY USE OF YOUR AMD GPU OUTSIDE OF OFFICIAL AMD SPECIFICATIONS\n  OR OUTSIDE OF FACTORY SETTINGS ARE NOT COVERED UNDER ANY AMD PRODUCT\n  WARRANTY AND MAY NOT BE COVERED BY YOUR BOARD OR SYSTEM MANUFACTURER'S\n  WARRANTY. Please use this utility with caution.\n\n  @param[in] dv_ind a device index\n\n  @param[in] od the value to which the overdrive level should be set\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_PERMISSION function requires root access\n*/\n    pub fn rsmi_dev_overdrive_level_set(dv_ind: u32, od: u32) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Set the overdrive percent associated with the device with provided\n  device index with the provided value. See details for WARNING.\n\n  @details Given a device index @p dv_ind and an overdrive level @p od,\n  this function will set the overdrive level for the device to the value\n  @p od. The overdrive level is an integer value between 0 and 20, inclusive,\n  which represents the overdrive percentage; e.g., a value of 5 specifies\n  an overclocking of 5%.\n\n  The overdrive level is specific to the gpu system clock.\n\n  The overdrive level is the percentage above the maximum Performance Level\n  to which overclocking will be limited. The overclocking percentage does\n  not apply to clock speeds other than the maximum. This percentage is\n  limited to 20%.\n\n   ******WARNING******\n  Operating your AMD GPU outside of official AMD specifications or outside of\n  factory settings, including but not limited to the conducting of\n  overclocking (including use of this overclocking software, even if such\n  software has been directly or indirectly provided by AMD or otherwise\n  affiliated in any way with AMD), may cause damage to your AMD GPU, system\n  components and/or result in system failure, as well as cause other problems.\n  DAMAGES CAUSED BY USE OF YOUR AMD GPU OUTSIDE OF OFFICIAL AMD SPECIFICATIONS\n  OR OUTSIDE OF FACTORY SETTINGS ARE NOT COVERED UNDER ANY AMD PRODUCT\n  WARRANTY AND MAY NOT BE COVERED BY YOUR BOARD OR SYSTEM MANUFACTURER'S\n  WARRANTY. Please use this utility with caution.\n\n  @param[in] dv_ind a device index\n\n  @param[in] od the value to which the overdrive level should be set\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_PERMISSION function requires root access\n*/\n    pub fn rsmi_dev_overdrive_level_set_v1(dv_ind: u32, od: u32) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /** @brief Control the set of allowed frequencies that can be used for the\n specified clock.\n\n @details Given a device index @p dv_ind, a clock type @p clk_type, and a\n 64 bit bitmask @p freq_bitmask, this function will limit the set of\n allowable frequencies. If a bit in @p freq_bitmask has a value of 1, then\n the frequency (as ordered in an ::rsmi_frequencies_t returned by\n rsmi_dev_gpu_clk_freq_get()) corresponding to that bit index will be\n allowed.\n\n This function will change the performance level to\n ::RSMI_DEV_PERF_LEVEL_MANUAL in order to modify the set of allowable\n frequencies. Caller will need to set to ::RSMI_DEV_PERF_LEVEL_AUTO in order\n to get back to default state.\n\n All bits with indices greater than or equal to\n ::rsmi_frequencies_t::num_supported will be ignored.\n\n  @param[in] dv_ind a device index\n\n  @param[in] clk_type the type of clock for which the set of frequencies\n  will be modified\n\n  @param[in] freq_bitmask A bitmask indicating the indices of the\n  frequencies that are to be enabled (1) and disabled (0). Only the lowest\n  ::rsmi_frequencies_t.num_supported bits of this mask are relevant.\n\n  @retval ::RSMI_STATUS_SUCCESS is returned upon successful call.\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_PERMISSION function requires root access\n*/\n    pub fn rsmi_dev_gpu_clk_freq_set(\n        dv_ind: u32,\n        clk_type: rsmi_clk_type_t,\n        freq_bitmask: u64,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /** @brief Get the build version information for the currently running build of\n RSMI.\n\n @details  Get the major, minor, patch and build string for RSMI build\n currently in use through @p version\n\n @param[inout] version A pointer to an ::rsmi_version_t structure that will\n be updated with the version information upon return.\n\n @retval ::RSMI_STATUS_SUCCESS is returned upon successful call\n*/\n    pub fn rsmi_version_get(version: *mut rsmi_version_t) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the driver version string for the current system.\n\n  @details Given a software component @p component, a pointer to a char\n  buffer, @p ver_str, this function will write the driver version string\n  (up to @p len characters) for the current system to @p ver_str. The caller\n  must ensure that it is safe to write at least @p len characters to @p\n  ver_str.\n\n  @param[in] component The component for which the version string is being\n  requested\n\n  @param[inout] ver_str A pointer to a buffer of char's to which the version\n  of @p component will be written\n\n  @param[in] len the length of the caller provided buffer @p name.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n  @retval ::RSMI_STATUS_INSUFFICIENT_SIZE is returned if @p len bytes is not\n  large enough to hold the entire name. In this case, only @p len bytes will\n  be written.*/\n    pub fn rsmi_version_str_get(\n        component: rsmi_sw_component_t,\n        ver_str: *mut ::core::ffi::c_char,\n        len: u32,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the VBIOS identifer string\n\n  @details Given a device ID @p dv_ind, and a pointer to a char buffer,\n  @p vbios, this function will write the VBIOS string (up to @p len\n  characters) for device @p dv_ind to @p vbios. The caller must ensure that\n  it is safe to write at least @p len characters to @p vbios.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] vbios A pointer to a buffer of char's to which the VBIOS name\n  will be written\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @param[in] len The number of char's pointed to by @p vbios which can safely\n  be written to by this function.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_vbios_version_get(\n        dv_ind: u32,\n        vbios: *mut ::core::ffi::c_char,\n        len: u32,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the firmware versions for a device\n\n  @details Given a device ID @p dv_ind, and a pointer to a uint64_t,\n  @p fw_version, this function will write the FW Versions as a string (up to @p len\n  characters) for device @p dv_ind to @p vbios. The caller must ensure that\n  it is safe to write at least @p len characters to @p vbios.\n\n  @param[in] dv_ind a device index\n\n  @param[in] block The firmware block for which the version is being requested\n\n  @param[inout] fw_version The version for the firmware block\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_firmware_version_get(\n        dv_ind: u32,\n        block: rsmi_fw_block_t,\n        fw_version: *mut u64,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the target graphics version for a GPU device\n\n  @details Given a device ID @p dv_ind and a uint64_t pointer\n  @p gfx_version, this function will write the graphics version.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] gfx_version The device graphics version number indicated by\n  KFD. If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS. If device does not support this value,\n  will return ::RSMI_STATUS_NOT_SUPPORTED and a maximum UINT64 value as\n  @p gfx_version.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_target_graphics_version_get(\n        dv_ind: u32,\n        gfx_version: *mut u64,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Retrieve the error counts for a GPU block\n\n  @details Given a device index @p dv_ind, an ::rsmi_gpu_block_t @p block and a\n  pointer to an ::rsmi_error_count_t @p ec, this function will write the error\n  count values for the GPU block indicated by @p block to memory pointed to by\n  @p ec.\n\n  @param[in] dv_ind a device index\n\n  @param[in] block The block for which error counts should be retrieved\n\n  @param[inout] ec A pointer to an ::rsmi_error_count_t to which the error\n  counts should be written\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_ecc_count_get(\n        dv_ind: u32,\n        block: rsmi_gpu_block_t,\n        ec: *mut rsmi_error_count_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Retrieve the enabled ECC bit-mask\n\n  @details Given a device index @p dv_ind, and a pointer to a uint64_t @p\n  enabled_mask, this function will write bits to memory pointed to by\n  @p enabled_blocks. Upon a successful call, @p enabled_blocks can then be\n  AND'd with elements of the ::rsmi_gpu_block_t ennumeration to determine if\n  the corresponding block has ECC enabled. Note that whether a block has ECC\n  enabled or not in the device is independent of whether there is kernel\n  support for error counting for that block. Although a block may be enabled,\n  but there may not be kernel support for reading error counters for that\n  block.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] enabled_blocks A pointer to a uint64_t to which the enabled\n  blocks bits will be written.\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid*/\n    pub fn rsmi_dev_ecc_enabled_get(\n        dv_ind: u32,\n        enabled_blocks: *mut u64,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Retrieve the ECC status for a GPU block\n\n  @details Given a device index @p dv_ind, an ::rsmi_gpu_block_t @p block and\n  a pointer to an ::rsmi_ras_err_state_t @p state, this function will write\n  the current state for the GPU block indicated by @p block to memory pointed\n  to by @p state.\n\n  @param[in] dv_ind a device index\n\n  @param[in] block The block for which error counts should be retrieved\n\n  @param[inout] state A pointer to an ::rsmi_ras_err_state_t to which the\n  ECC state should be written\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_ecc_status_get(\n        dv_ind: u32,\n        block: rsmi_gpu_block_t,\n        state: *mut rsmi_ras_err_state_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get a description of a provided RSMI error status\n\n  @details Set the provided pointer to a const char *, @p status_string, to\n  a string containing a description of the provided error code @p status.\n\n  @param[in] status The error status for which a description is desired\n\n  @param[inout] status_string A pointer to a const char * which will be made\n  to point to a description of the provided error code\n\n  @retval ::RSMI_STATUS_SUCCESS is returned upon successful call\n*/\n    pub fn rsmi_status_string(\n        status: rsmi_status_t,\n        status_string: *mut *const ::core::ffi::c_char,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Tell if an event group is supported by a given device\n\n  @details Given a device index @p dv_ind and an event group specifier @p\n  group, tell if @p group type events are supported by the device associated\n  with @p dv_ind\n\n  @param[in] dv_ind device index of device being queried\n\n  @param[in] group ::rsmi_event_group_t identifier of group for which support\n  is being queried\n\n  @retval ::RSMI_STATUS_SUCCESS if the device associatee with @p dv_ind\n  support counting events of the type indicated by @p group.\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  group\n*/\n    pub fn rsmi_dev_counter_group_supported(\n        dv_ind: u32,\n        group: rsmi_event_group_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Create a performance counter object\n\n  @details Create a performance counter object of type @p type for the device\n  with a device index of @p dv_ind, and write a handle to the object to the\n  memory location pointed to by @p evnt_handle. @p evnt_handle can be used\n  with other performance event operations. The handle should be deallocated\n  with ::rsmi_dev_counter_destroy() when no longer needed.\n\n  @param[in] dv_ind a device index\n\n  @param[in] type the ::rsmi_event_type_t of performance event to create\n\n  @param[inout] evnt_handle A pointer to a ::rsmi_event_handle_t which will be\n  associated with a newly allocated counter\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n  @retval ::RSMI_STATUS_OUT_OF_RESOURCES unable to allocate memory for counter\n  @retval ::RSMI_STATUS_PERMISSION function requires root access\n*/\n    pub fn rsmi_dev_counter_create(\n        dv_ind: u32,\n        type_: rsmi_event_type_t,\n        evnt_handle: *mut rsmi_event_handle_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Deallocate a performance counter object\n\n  @details Deallocate the performance counter object with the provided\n  ::rsmi_event_handle_t @p evnt_handle\n\n  @param[in] evnt_handle handle to event object to be deallocated\n\n  @retval ::RSMI_STATUS_SUCCESS is returned upon successful call\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n  @retval ::RSMI_STATUS_PERMISSION function requires root access\n*/\n    pub fn rsmi_dev_counter_destroy(evnt_handle: rsmi_event_handle_t) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Issue performance counter control commands\n\n  @details Issue a command @p cmd on the event counter associated with the\n  provided handle @p evt_handle.\n\n  @param[in] evt_handle an event handle\n\n  @param[in] cmd The event counter command to be issued\n\n  @param[inout] cmd_args Currently not used. Should be set to NULL.\n\n  @retval ::RSMI_STATUS_SUCCESS is returned upon successful call\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n  @retval ::RSMI_STATUS_PERMISSION function requires root access\n*/\n    pub fn rsmi_counter_control(\n        evt_handle: rsmi_event_handle_t,\n        cmd: rsmi_counter_command_t,\n        cmd_args: *mut ::core::ffi::c_void,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Read the current value of a performance counter\n\n  @details Read the current counter value of the counter associated with the\n  provided handle @p evt_handle and write the value to the location pointed\n  to by @p value.\n\n  @param[in] evt_handle an event handle\n\n  @param[inout] value pointer to memory of size of ::rsmi_counter_value_t to\n  which the counter value will be written\n\n  @retval ::RSMI_STATUS_SUCCESS is returned upon successful call\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n  @retval ::RSMI_STATUS_PERMISSION function requires root access\n*/\n    pub fn rsmi_counter_read(\n        evt_handle: rsmi_event_handle_t,\n        value: *mut rsmi_counter_value_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the number of currently available counters\n\n  @details Given a device index @p dv_ind, a performance event group @p grp,\n  and a pointer to a uint32_t @p available, this function will write the\n  number of @p grp type counters that are available on the device with index\n  @p dv_ind to the memory that @p available points to.\n\n  @param[in] dv_ind a device index\n\n  @param[in] grp an event device group\n\n  @param[inout] available A pointer to a uint32_t to which the number of\n  available counters will be written\n\n  @retval ::RSMI_STATUS_SUCCESS is returned upon successful call\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_counter_available_counters_get(\n        dv_ind: u32,\n        grp: rsmi_event_group_t,\n        available: *mut u32,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get process information about processes currently using GPU\n\n  @details Given a non-NULL pointer to an array @p procs of\n  ::rsmi_process_info_t's, of length *@p num_items, this function will write\n  up to *@p num_items instances of ::rsmi_process_info_t to the memory pointed\n  to by @p procs. These instances contain information about each GPU compute\n  process and their PASID for further analysis or monitoring via\n  ::rsmi_compute_process_info_by_pid_get().\n  If @p procs is not NULL, @p num_items will be updated with\n  the number of processes actually written. If @p procs is NULL, @p num_items\n  will be updated with the number of processes for which there is current\n  process information. Calling this function with @p procs being NULL is a way\n  to determine how much memory should be allocated for when @p procs is not\n  NULL.\n\n  @param[inout] procs a pointer to memory provided by the caller to which\n  process information will be written. This may be NULL in which case only @p\n  num_items will be updated with the number of processes found.\n\n  @param[inout] num_items A pointer to a uint32_t, which on input, should\n  contain the amount of memory in ::rsmi_process_info_t's which have been\n  provided by the @p procs argument. On output, if @p procs is non-NULL, this\n  will be updated with the number ::rsmi_process_info_t structs actually\n  written. If @p procs is NULL, this argument will be updated with the number\n  processes for which there is information.\n\n  @retval ::RSMI_STATUS_SUCCESS is returned upon successful call\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n  @retval ::RSMI_STATUS_INSUFFICIENT_SIZE is returned if there were more\n  processes for which information was available, but not enough space was\n  provided as indicated by @p procs and @p num_items, on input.*/\n    pub fn rsmi_compute_process_info_get(\n        procs: *mut rsmi_process_info_t,\n        num_items: *mut u32,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get process information about a specific process\n\n  @details Given a pointer to an ::rsmi_process_info_t @p proc and a process\n  id\n  @p pid, this function will write the process information for @p pid, if\n  available, to the memory pointed to by @p proc.\n\n  @param[in] pid The process ID for which process information is being\n  requested\n\n  @param[inout] proc a pointer to a ::rsmi_process_info_t to which\n  process information for @p pid will be written if it is found.\n\n  @retval ::RSMI_STATUS_SUCCESS is returned upon successful call\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n  @retval ::RSMI_STATUS_NOT_FOUND is returned if there was no process\n  information\n  found for the provided @p pid\n*/\n    pub fn rsmi_compute_process_info_by_pid_get(\n        pid: u32,\n        proc_: *mut rsmi_process_info_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the device indices currently being used by a process\n\n  @details Given a process id @p pid, a non-NULL pointer to an array of\n  uint32_t's @p dv_indices of length *@p num_devices, this function will\n  write up to @p num_devices device indices to the memory pointed to by\n  @p dv_indices. If @p dv_indices is not NULL, @p num_devices will be\n  updated with the number of gpu's currently being used by process @p pid.\n  If @p dv_indices is NULL, @p dv_indices will be updated with the number of\n  gpus currently being used by @p pid. Calling this function with @p\n  dv_indices being NULL is a way to determine how much memory is required\n  for when @p dv_indices is not NULL.\n\n  @param[in] pid The process id of the process for which the number of gpus\n  currently being used is requested\n\n  @param[inout] dv_indices a pointer to memory provided by the caller to\n  which indices of devices currently being used by the process will be\n  written. This may be NULL in which case only @p num_devices will be\n  updated with the number of devices being used.\n\n  @param[inout] num_devices A pointer to a uint32_t, which on input, should\n  contain the amount of memory in uint32_t's which have been provided by the\n  @p dv_indices argument. On output, if @p dv_indices is non-NULL, this will\n  be updated with the number uint32_t's actually written. If @p dv_indices is\n  NULL, this argument will be updated with the number devices being used.\n\n  @retval ::RSMI_STATUS_SUCCESS is returned upon successful call\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n  @retval ::RSMI_STATUS_INSUFFICIENT_SIZE is returned if there were more\n  gpu indices that could have been written, but not enough space was\n  provided as indicated by @p dv_indices and @p num_devices, on input.\n*/\n    pub fn rsmi_compute_process_gpus_get(\n        pid: u32,\n        dv_indices: *mut u32,\n        num_devices: *mut u32,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the info of a process on a specific device.\n\n  @details Given a process id @p pid, a @p dv_ind, this function will\n  write the process information for pid on the device, if available, to\n  the memory pointed to by @p proc.\n\n  @param[in] pid The process id of the process for which the gpu\n  currently being used is requested.\n\n  @param[in] dv_ind a device index where the process running on.\n\n  @param[inout] proc a pointer to memory provided by the caller to which\n  process information will be written.\n\n  @retval ::RSMI_STATUS_SUCCESS is returned upon successful call\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_compute_process_info_by_device_get(\n        pid: u32,\n        dv_ind: u32,\n        proc_: *mut rsmi_process_info_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Retrieve the XGMI error status for a device\n\n  @details Given a device index @p dv_ind, and a pointer to an\n  ::rsmi_xgmi_status_t @p status, this function will write the current XGMI\n  error state ::rsmi_xgmi_status_t for the device @p dv_ind to the memory\n  pointed to by @p status.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] status A pointer to an ::rsmi_xgmi_status_t to which the\n  XGMI error state should be written\n  If this parameter is nullptr, this function will return\n  ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided,\n  arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the\n  provided arguments.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_xgmi_error_status(\n        dv_ind: u32,\n        status: *mut rsmi_xgmi_status_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /** @brief Reset the XGMI error status for a device\n\n @details Given a device index @p dv_ind, this function will reset the\n current XGMI error state ::rsmi_xgmi_status_t for the device @p dv_ind to\n rsmi_xgmi_status_t::RSMI_XGMI_STATUS_NO_ERRORS\n\n @param[in] dv_ind a device index\n\n @retval ::RSMI_STATUS_SUCCESS is returned upon successful call.\n*/\n    pub fn rsmi_dev_xgmi_error_reset(dv_ind: u32) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Retrieve the XGMI hive id for a device\n\n  @details Given a device index @p dv_ind, and a pointer to an\n  uint64_t @p hive_id, this function will write the current XGMI\n  hive id for the device @p dv_ind to the memory pointed to by @p hive_id.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] hive_id A pointer to an uint64_t to which the XGMI hive id\n  should be written\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function with the given arguments\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_dev_xgmi_hive_id_get(dv_ind: u32, hive_id: *mut u64) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Retrieve the NUMA CPU node number for a device\n\n  @details Given a device index @p dv_ind, and a pointer to an\n  uint32_t @p numa_node, this function will write the\n  node number of NUMA CPU for the device @p dv_ind to the memory\n  pointed to by @p numa_node.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] numa_node A pointer to an uint32_t to which the\n  numa node number should be written.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_topo_get_numa_node_number(\n        dv_ind: u32,\n        numa_node: *mut u32,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Retrieve the weight for a connection between 2 GPUs\n\n  @details Given a source device index @p dv_ind_src and\n  a destination device index @p dv_ind_dst, and a pointer to an\n  uint64_t @p weight, this function will write the\n  weight for the connection between the device @p dv_ind_src\n  and @p dv_ind_dst to the memory pointed to by @p weight.\n\n  @param[in] dv_ind_src the source device index\n\n  @param[in] dv_ind_dst the destination device index\n\n  @param[inout] weight A pointer to an uint64_t to which the\n  weight for the connection should be written.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_topo_get_link_weight(\n        dv_ind_src: u32,\n        dv_ind_dst: u32,\n        weight: *mut u64,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Retreive minimal and maximal io link bandwidth between 2 GPUs\n\n  @details Given a source device index @p dv_ind_src and\n  a destination device index @p dv_ind_dst,  pointer to an\n  uint64_t @p min_bandwidth, and a pointer to uint64_t @p max_bandiwidth,\n  this function will write theoretical minimal and maximal bandwidth limits.\n  API works if src and dst are connected via xgmi and have 1 hop distance.\n\n  @param[in] dv_ind_src the source device index\n\n  @param[in] dv_ind_dst the destination device index\n\n  @param[inout] min_bandwidth A pointer to an uint64_t to which the\n  minimal bandwidth for the connection should be written.\n\n  @param[inout] max_bandwidth A pointer to an uint64_t to which the\n  maximal bandwidth for the connection should be written.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid*/\n    pub fn rsmi_minmax_bandwidth_get(\n        dv_ind_src: u32,\n        dv_ind_dst: u32,\n        min_bandwidth: *mut u64,\n        max_bandwidth: *mut u64,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Retrieve the hops and the connection type between GPU to GPU/CPU\n\n  @details Given a source device index @p dv_ind_src and\n  a destination device index @p dv_ind_dst, and a pointer to an\n  uint64_t @p hops and a pointer to an RSMI_IO_LINK_TYPE @p type,\n  this function will write the number of hops and the connection type\n  between the device @p dv_ind_src and @p dv_ind_dst to the memory\n  pointed to by @p hops and @p type.\n\n  To query the link type between GPU and CPU, given a source GPU index\n  @p dev_ind_srcc and a destination device index @p dv_ind_dst\n  CPU_NODE_INDEX(0xFFFFFFFF), a pointer to an\n  uint64_t @p hops and a pointer to an RSMI_IO_LINK_TYPE @p type,\n  this function will write the number of hops and the connection type\n  between the device @p dv_ind_src and CPU to the memory\n  pointed to by @p hops and @p type.\n\n  @param[in] dv_ind_src the source device index\n\n  @param[in] dv_ind_dst the destination device index\n\n  @param[inout] hops A pointer to an uint64_t to which the\n  hops for the connection should be written.\n\n  @param[inout] type A pointer to an ::RSMI_IO_LINK_TYPE to which the\n  type for the connection should be written.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_topo_get_link_type(\n        dv_ind_src: u32,\n        dv_ind_dst: u32,\n        hops: *mut u64,\n        type_: *mut RSMI_IO_LINK_TYPE,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Return P2P availability status between 2 GPUs\n\n  @details Given a source device index @p dv_ind_src and\n  a destination device index @p dv_ind_dst, and a pointer to a\n  bool @p accessible, this function will write the P2P connection status\n  between the device @p dv_ind_src and @p dv_ind_dst to the memory\n  pointed to by @p accessible.\n\n  @param[in] dv_ind_src the source device index\n\n  @param[in] dv_ind_dst the destination device index\n\n  @param[inout] accessible A pointer to a bool to which the status for\n  the P2P connection availablity should be written.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n*/\n    pub fn rsmi_is_P2P_accessible(\n        dv_ind_src: u32,\n        dv_ind_dst: u32,\n        accessible: *mut bool,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Retrieves the current compute partitioning for a desired device\n\n  @details\n  Given a device index @p dv_ind and a string @p compute_partition ,\n  and uint32 @p len , this function will attempt to obtain the device's\n  current compute partition setting string. Upon successful retreival,\n  the obtained device's compute partition settings string shall be stored in\n  the passed @p compute_partition char string variable.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] compute_partition a pointer to a char string variable,\n  which the device's current compute partition will be written to.\n\n  @param[in] len the length of the caller provided buffer @p compute_partition\n  , suggested length is 4 or greater.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n  @retval ::RSMI_STATUS_UNEXPECTED_DATA data provided to function is not valid\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function\n  @retval ::RSMI_STATUS_INSUFFICIENT_SIZE is returned if @p len bytes is not\n  large enough to hold the entire compute partition value. In this case,\n  only @p len bytes will be written.\n*/\n    pub fn rsmi_dev_compute_partition_get(\n        dv_ind: u32,\n        compute_partition: *mut ::core::ffi::c_char,\n        len: u32,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Modifies a selected device's compute partition setting.\n\n  @details Given a device index @p dv_ind, a type of compute partition\n  @p compute_partition, this function will attempt to update the selected\n  device's compute partition setting.\n\n  @param[in] dv_ind a device index\n\n  @param[in] compute_partition using enum ::rsmi_compute_partition_type_t,\n  define what the selected device's compute partition setting should be\n  updated to.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_PERMISSION function requires root access\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n  @retval ::RSMI_STATUS_SETTING_UNAVAILABLE the provided setting is\n  unavailable for current device\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function\n  @retval ::RSMI_STATUS_BUSY A resource or mutex could not be acquired\n  because it is already being used - device is busy\n*/\n    pub fn rsmi_dev_compute_partition_set(\n        dv_ind: u32,\n        compute_partition: rsmi_compute_partition_type_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Retrieves the partition_id for a desired device\n\n  @details\n  Given a device index @p dv_ind and a uint32_t pointer @p partition_id ,\n  this function will attempt to obtain the device's partition ID.\n  Upon successful retreival, the obtained device's partition will be stored\n  in the passed @p partition_id uint32_t variable. If device does\n  not support partitions or is in SPX, a @p partition_id ID of 0 shall\n  be returned.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] partition_id a uint32_t variable,\n  which the device's partition_id will be written to.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function\n*/\n    pub fn rsmi_dev_partition_id_get(\n        dv_ind: u32,\n        partition_id: *mut u32,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Retrieves the current memory partition for a desired device\n\n  @details\n  Given a device index @p dv_ind and a string @p memory_partition ,\n  and uint32 @p len , this function will attempt to obtain the device's\n  memory partition string. Upon successful retreival, the obtained device's\n  memory partition string shall be stored in the passed @p memory_partition\n  char string variable.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] memory_partition a pointer to a char string variable,\n  which the device's memory partition will be written to.\n\n  @param[in] len the length of the caller provided buffer @p memory_partition ,\n  suggested length is 5 or greater.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n  @retval ::RSMI_STATUS_UNEXPECTED_DATA data provided to function is not valid\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function\n  @retval ::RSMI_STATUS_INSUFFICIENT_SIZE is returned if @p len bytes is not\n  large enough to hold the entire memory partition value. In this case,\n  only @p len bytes will be written.\n*/\n    pub fn rsmi_dev_memory_partition_get(\n        dv_ind: u32,\n        memory_partition: *mut ::core::ffi::c_char,\n        len: u32,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Retrieves the available memory partition capabilities\n  for a desired device\n\n  @details\n  Given a device index @p dv_ind and a string @p memory_partition_caps ,\n  and uint32 @p len , this function will attempt to obtain the device's\n  available memory partition capabilities string. Upon successful\n  retreival, the obtained device's available memory partition capablilities\n  string shall be stored in the passed @p memory_partition_caps\n  char string variable.\n\n  @param[in] dv_ind a device index\n\n  @param[inout] memory_partition_caps a pointer to a char string variable,\n  which the device's available memory partition capabilities will be written to.\n\n  @param[in] len the length of the caller provided buffer @p len ,\n  suggested length is 30 or greater.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n  @retval ::RSMI_STATUS_UNEXPECTED_DATA data provided to function is not valid\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function\n  @retval ::RSMI_STATUS_INSUFFICIENT_SIZE is returned if @p len bytes is not\n  large enough to hold the entire memory partition value. In this case,\n  only @p len bytes will be written.\n*/\n    pub fn rsmi_dev_memory_partition_capabilities_get(\n        dv_ind: u32,\n        memory_partition_caps: *mut ::core::ffi::c_char,\n        len: u32,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Modifies a selected device's current memory partition setting.\n\n  @details Given a device index @p dv_ind and a type of memory partition\n  @p memory_partition, this function will attempt to update the selected\n  device's memory partition setting.\n\n  @param[in] dv_ind a device index\n\n  @param[in] memory_partition using enum ::rsmi_memory_partition_type_t,\n  define what the selected device's current mode setting should be updated to.\n\n  @retval ::RSMI_STATUS_SUCCESS call was successful\n  @retval ::RSMI_STATUS_PERMISSION function requires root access\n  @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid\n  @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not\n  support this function\n  @retval ::RSMI_STATUS_AMDGPU_RESTART_ERR could not successfully restart\n  the amdgpu driver\n  @retval ::RSMI_STATUS_BUSY A resource or mutex could not be acquired\n  because it is already being used - device is busy\n*/\n    pub fn rsmi_dev_memory_partition_set(\n        dv_ind: u32,\n        memory_partition: rsmi_memory_partition_type_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /** @brief Get a function name iterator of supported RSMI functions for a device\n\n @details Given a device index @p dv_ind, this function will write a function\n iterator handle to the caller-provided memory pointed to by @p handle. This\n handle can be used to iterate through all the supported functions.\n\n Note that although this function takes in @p dv_ind as an argument,\n ::rsmi_dev_supported_func_iterator_open itself will not be among the\n functions listed as supported. This is because\n ::rsmi_dev_supported_func_iterator_open does not depend on hardware or\n driver support and should always be supported.\n\n @param[in] dv_ind a device index of device for which support information is\n requested\n\n @param[inout] handle A pointer to caller-provided memory to which the\n function iterator will be written.\n\n @retval ::RSMI_STATUS_SUCCESS is returned upon successful call.\n*/\n    pub fn rsmi_dev_supported_func_iterator_open(\n        dv_ind: u32,\n        handle: *mut rsmi_func_id_iter_handle_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /** @brief Get a variant iterator for a given handle\n\n @details Given a ::rsmi_func_id_iter_handle_t @p obj_h, this function will\n write a function iterator handle to the caller-provided memory pointed to\n by @p var_iter. This handle can be used to iterate through all the supported\n variants of the provided handle. @p obj_h may be a handle to a function\n object, as provided by a call to ::rsmi_dev_supported_func_iterator_open, or\n it may be a variant itself (from a call to\n ::rsmi_dev_supported_variant_iterator_open), it which case @p var_iter will\n be an iterator of the sub-variants of @p obj_h (e.g., monitors).\n\n This call allocates a small amount of memory to @p var_iter. To free this memory\n ::rsmi_dev_supported_func_iterator_close should be called on the returned\n iterator handle @p var_iter when it is no longer needed.\n\n @param[in] obj_h an iterator handle for which the variants are being requested\n\n @param[inout] var_iter A pointer to caller-provided memory to which the\n sub-variant iterator will be written.\n\n @retval ::RSMI_STATUS_SUCCESS is returned upon successful call.\n*/\n    pub fn rsmi_dev_supported_variant_iterator_open(\n        obj_h: rsmi_func_id_iter_handle_t,\n        var_iter: *mut rsmi_func_id_iter_handle_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /** @brief Advance a function identifer iterator\n\n @details Given a function id iterator handle (::rsmi_func_id_iter_handle_t)\n @p handle, this function will increment the iterator to point to the next\n identifier. After a successful call to this function, obtaining the value\n of the iterator @p handle will provide the value of the next item in the\n list of functions/variants.\n\n If there are no more items in the list, ::RSMI_STATUS_NO_DATA is returned.\n\n @param[in] handle A pointer to an iterator handle to be incremented\n\n @retval ::RSMI_STATUS_SUCCESS is returned upon successful call.\n @retval ::RSMI_STATUS_NO_DATA is returned when list of identifiers has been\n exhausted\n*/\n    pub fn rsmi_func_iter_next(handle: rsmi_func_id_iter_handle_t) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /** @brief Close a variant iterator handle\n\n @details Given a pointer to an ::rsmi_func_id_iter_handle_t @p handle, this\n function will free the resources being used by the handle\n\n @param[in] handle A pointer to an iterator handle to be closed\n\n @retval ::RSMI_STATUS_SUCCESS is returned upon successful call.\n*/\n    pub fn rsmi_dev_supported_func_iterator_close(\n        handle: *mut rsmi_func_id_iter_handle_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /** @brief Get the value associated with a function/variant iterator\n\n @details Given an ::rsmi_func_id_iter_handle_t @p handle, this function\n will write the identifier of the function/variant to the user provided\n memory pointed to by @p value.\n\n @p value may point to a function name, a variant id, or a monitor/sensor\n index, depending on what kind of iterator @p handle is\n\n @param[in] handle An iterator for which the value is being requested\n\n @param[inout] value A pointer to an ::rsmi_func_id_value_t provided by the\n caller to which this function will write the value assocaited with @p handle\n\n @retval ::RSMI_STATUS_SUCCESS is returned upon successful call.\n*/\n    pub fn rsmi_func_iter_value_get(\n        handle: rsmi_func_id_iter_handle_t,\n        value: *mut rsmi_func_id_value_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /** @brief Prepare to collect event notifications for a GPU\n\n @details This function prepares to collect events for the GPU with device\n ID @p dv_ind, by initializing any required system parameters. This call\n may open files which will remain open until ::rsmi_event_notification_stop()\n is called.\n\n @param dv_ind a device index corresponding to the device on which to\n listen for events\n\n @retval ::RSMI_STATUS_SUCCESS is returned upon successful call.*/\n    pub fn rsmi_event_notification_init(dv_ind: u32) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /** @brief Specify which events to collect for a device\n\n @details Given a device index @p dv_ind and a @p mask consisting of\n elements of ::rsmi_evt_notification_type_t OR'd together, this function\n will listen for the events specified in @p mask on the device\n corresponding to @p dv_ind.\n\n @param dv_ind a device index corresponding to the device on which to\n listen for events\n\n @param mask Bitmask generated by OR'ing 1 or more elements of\n ::rsmi_evt_notification_type_t indicating which event types to listen for,\n where the rsmi_evt_notification_type_t value indicates the bit field, with\n bit position starting from 1.\n For example, if the mask field is 0x0000000000000003, which means first bit,\n bit 1 (bit position start from 1) and bit 2 are set, which indicate interest\n in receiving RSMI_EVT_NOTIF_VMFAULT (which has a value of 1) and\n RSMI_EVT_NOTIF_THERMAL_THROTTLE event (which has a value of 2).\n\n @retval ::RSMI_STATUS_INIT_ERROR is returned if\n ::rsmi_event_notification_init() has not been called before a call to this\n function\n\n @retval ::RSMI_STATUS_SUCCESS is returned upon successful call*/\n    pub fn rsmi_event_notification_mask_set(dv_ind: u32, mask: u64) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /** @brief Collect event notifications, waiting a specified amount of time\n\n @details Given a time period @p timeout_ms in milliseconds and a caller-\n provided buffer of ::rsmi_evt_notification_data_t's @p data with a length\n (in ::rsmi_evt_notification_data_t's, also specified by the caller) in the\n memory location pointed to by @p num_elem, this function will collect\n ::rsmi_evt_notification_type_t events for up to @p timeout_ms milliseconds,\n and write up to *@p num_elem event items to @p data. Upon return @p num_elem\n is updated with the number of events that were actually written. If events\n are already present when this function is called, it will write the events\n to the buffer then poll for new events if there is still caller-provided\n buffer available to write any new events that would be found.\n\n This function requires prior calls to ::rsmi_event_notification_init() and\n ::rsmi_event_notification_mask_set(). This function polls for the\n occurrance of the events on the respective devices that were previously\n specified by ::rsmi_event_notification_mask_set().\n\n @param[in] timeout_ms number of milliseconds to wait for an event\n to occur\n\n @param[inout] num_elem pointer to uint32_t, provided by the caller. On\n input, this value tells how many ::rsmi_evt_notification_data_t elements\n are being provided by the caller with @p data. On output, the location\n pointed to by @p num_elem will contain the number of items written to\n the provided buffer.\n\n @param[out] data pointer to a caller-provided memory buffer of size\n @p num_elem ::rsmi_evt_notification_data_t to which this function may safely\n write. If there are events found, up to @p num_elem event items will be\n written to @p data.\n\n @retval ::RSMI_STATUS_SUCCESS The function ran successfully. The events\n that were found are written to @p data and @p num_elems is updated\n with the number of elements that were written.\n\n @retval ::RSMI_STATUS_NO_DATA No events were found to collect.\n*/\n    pub fn rsmi_event_notification_get(\n        timeout_ms: ::core::ffi::c_int,\n        num_elem: *mut u32,\n        data: *mut rsmi_evt_notification_data_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /** @brief Close any file handles and free any resources used by event\n notification for a GPU\n\n @details Any resources used by event notification for the GPU with\n device index @p dv_ind will be free with this\n function. This includes freeing any memory and closing file handles. This\n should be called for every call to ::rsmi_event_notification_init()\n\n @param[in] dv_ind The device index of the GPU for which event\n notification resources will be free\n\n @retval ::RSMI_STATUS_INVALID_ARGS resources for the given device have\n either already been freed, or were never allocated by\n ::rsmi_event_notification_init()\n\n @retval ::RSMI_STATUS_SUCCESS is returned upon successful call*/\n    pub fn rsmi_event_notification_stop(dv_ind: u32) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the 'metrics_header_info' from the GPU metrics associated with the device\n\n  @details Given a device index @p dv_ind and a pointer to a metrics_table_header_t in which\n  the 'metrics_header_info' will stored\n\n  @param[in] dv_ind a device index\n\n  @param[inout] header_value a pointer to metrics_table_header_t to which the device gpu\n  metric unit will be stored\n\n  @retval ::RSMI_STATUS_SUCCESS is returned upon successful call.\n          ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit\n            does not exist for the given device\n*/\n    pub fn rsmi_dev_metrics_header_info_get(\n        dv_ind: u32,\n        header_value: *mut metrics_table_header_t,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the 'xcd_counter' from the GPU metrics associated with the device\n\n  @details Given a device index @p dv_ind and a pointer to a uint16_t in which\n  the 'xcd_counter' will stored\n\n  @param[in] dv_ind a device index\n\n  @param[inout] xcd_counter_value a pointer to uint16_t to which the device gpu\n  metric unit will be stored\n\n  @retval ::RSMI_STATUS_SUCCESS is returned upon successful call.\n          ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit\n            does not exist for the given device\n*/\n    pub fn rsmi_dev_metrics_xcd_counter_get(\n        dv_ind: u32,\n        xcd_counter_value: *mut u16,\n    ) -> rsmi_status_t;\n}\nextern \"C\" {\n    #[must_use]\n    /**  @brief Get the log from the GPU metrics associated with the device\n\n  @details Given a device index @p dv_ind it will log all the gpu metric info\n  related to the device. The 'logging' feature must be on.\n\n  @param[in] dv_ind a device index\n\n  @retval ::RSMI_STATUS_SUCCESS is returned upon successful call.\n*/\n    pub fn rsmi_dev_metrics_log_get(dv_ind: u32) -> rsmi_status_t;\n}\nimpl rsmi_error {\n    pub const r#INVALID_ARGS: rsmi_error = rsmi_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(1)\n    });\n    pub const r#NOT_SUPPORTED: rsmi_error = rsmi_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(2)\n    });\n    pub const r#FILE_ERROR: rsmi_error = rsmi_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3)\n    });\n    pub const r#PERMISSION: rsmi_error = rsmi_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(4)\n    });\n    pub const r#OUT_OF_RESOURCES: rsmi_error = rsmi_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(5)\n    });\n    pub const r#INTERNAL_EXCEPTION: rsmi_error = rsmi_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(6)\n    });\n    pub const r#INPUT_OUT_OF_BOUNDS: rsmi_error = rsmi_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(7)\n    });\n    pub const r#INIT_ERROR: rsmi_error = rsmi_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(8)\n    });\n    pub const r#IZATION_ERROR: rsmi_error = rsmi_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(8)\n    });\n    pub const r#NOT_YET_IMPLEMENTED: rsmi_error = rsmi_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(9)\n    });\n    pub const r#NOT_FOUND: rsmi_error = rsmi_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(10)\n    });\n    pub const r#INSUFFICIENT_SIZE: rsmi_error = rsmi_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(11)\n    });\n    pub const r#INTERRUPT: rsmi_error = rsmi_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(12)\n    });\n    pub const r#UNEXPECTED_SIZE: rsmi_error = rsmi_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(13)\n    });\n    pub const r#NO_DATA: rsmi_error = rsmi_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(14)\n    });\n    pub const r#UNEXPECTED_DATA: rsmi_error = rsmi_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(15)\n    });\n    pub const r#BUSY: rsmi_error = rsmi_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(16)\n    });\n    pub const r#REFCOUNT_OVERFLOW: rsmi_error = rsmi_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(17)\n    });\n    pub const r#SETTING_UNAVAILABLE: rsmi_error = rsmi_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(18)\n    });\n    pub const r#AMDGPU_RESTART_ERR: rsmi_error = rsmi_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(19)\n    });\n    pub const r#DRM_ERROR: rsmi_error = rsmi_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(20)\n    });\n    pub const r#FAIL_LOAD_MODULE: rsmi_error = rsmi_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(21)\n    });\n    pub const r#FAIL_LOAD_SYMBOL: rsmi_error = rsmi_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(22)\n    });\n    pub const r#UNKNOWN_ERROR: rsmi_error = rsmi_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(4294967295)\n    });\n}\n#[repr(transparent)]\n#[derive(Debug, Hash, Copy, Clone, PartialEq, Eq)]\npub struct rsmi_error(pub ::core::num::NonZeroU32);\npub trait rsmi_status_tConsts {\n    const SUCCESS: rsmi_status_t = rsmi_status_t::Ok(());\n    const ERROR_INVALID_ARGS: rsmi_status_t = rsmi_status_t::Err(\n        rsmi_error::r#INVALID_ARGS,\n    );\n    const ERROR_NOT_SUPPORTED: rsmi_status_t = rsmi_status_t::Err(\n        rsmi_error::r#NOT_SUPPORTED,\n    );\n    const ERROR_FILE_ERROR: rsmi_status_t = rsmi_status_t::Err(rsmi_error::r#FILE_ERROR);\n    const ERROR_PERMISSION: rsmi_status_t = rsmi_status_t::Err(rsmi_error::r#PERMISSION);\n    const ERROR_OUT_OF_RESOURCES: rsmi_status_t = rsmi_status_t::Err(\n        rsmi_error::r#OUT_OF_RESOURCES,\n    );\n    const ERROR_INTERNAL_EXCEPTION: rsmi_status_t = rsmi_status_t::Err(\n        rsmi_error::r#INTERNAL_EXCEPTION,\n    );\n    const ERROR_INPUT_OUT_OF_BOUNDS: rsmi_status_t = rsmi_status_t::Err(\n        rsmi_error::r#INPUT_OUT_OF_BOUNDS,\n    );\n    const ERROR_INIT_ERROR: rsmi_status_t = rsmi_status_t::Err(rsmi_error::r#INIT_ERROR);\n    const ERROR_IZATION_ERROR: rsmi_status_t = rsmi_status_t::Err(\n        rsmi_error::r#IZATION_ERROR,\n    );\n    const ERROR_NOT_YET_IMPLEMENTED: rsmi_status_t = rsmi_status_t::Err(\n        rsmi_error::r#NOT_YET_IMPLEMENTED,\n    );\n    const ERROR_NOT_FOUND: rsmi_status_t = rsmi_status_t::Err(rsmi_error::r#NOT_FOUND);\n    const ERROR_INSUFFICIENT_SIZE: rsmi_status_t = rsmi_status_t::Err(\n        rsmi_error::r#INSUFFICIENT_SIZE,\n    );\n    const ERROR_INTERRUPT: rsmi_status_t = rsmi_status_t::Err(rsmi_error::r#INTERRUPT);\n    const ERROR_UNEXPECTED_SIZE: rsmi_status_t = rsmi_status_t::Err(\n        rsmi_error::r#UNEXPECTED_SIZE,\n    );\n    const ERROR_NO_DATA: rsmi_status_t = rsmi_status_t::Err(rsmi_error::r#NO_DATA);\n    const ERROR_UNEXPECTED_DATA: rsmi_status_t = rsmi_status_t::Err(\n        rsmi_error::r#UNEXPECTED_DATA,\n    );\n    const ERROR_BUSY: rsmi_status_t = rsmi_status_t::Err(rsmi_error::r#BUSY);\n    const ERROR_REFCOUNT_OVERFLOW: rsmi_status_t = rsmi_status_t::Err(\n        rsmi_error::r#REFCOUNT_OVERFLOW,\n    );\n    const ERROR_SETTING_UNAVAILABLE: rsmi_status_t = rsmi_status_t::Err(\n        rsmi_error::r#SETTING_UNAVAILABLE,\n    );\n    const ERROR_AMDGPU_RESTART_ERR: rsmi_status_t = rsmi_status_t::Err(\n        rsmi_error::r#AMDGPU_RESTART_ERR,\n    );\n    const ERROR_DRM_ERROR: rsmi_status_t = rsmi_status_t::Err(rsmi_error::r#DRM_ERROR);\n    const ERROR_FAIL_LOAD_MODULE: rsmi_status_t = rsmi_status_t::Err(\n        rsmi_error::r#FAIL_LOAD_MODULE,\n    );\n    const ERROR_FAIL_LOAD_SYMBOL: rsmi_status_t = rsmi_status_t::Err(\n        rsmi_error::r#FAIL_LOAD_SYMBOL,\n    );\n    const ERROR_UNKNOWN_ERROR: rsmi_status_t = rsmi_status_t::Err(\n        rsmi_error::r#UNKNOWN_ERROR,\n    );\n}\nimpl rsmi_status_tConsts for rsmi_status_t {}\n#[must_use]\npub type rsmi_status_t = ::core::result::Result<(), rsmi_error>;\nconst _: fn() = || {\n    let _ = std::mem::transmute::<rsmi_status_t, u32>;\n};\n"
  },
  {
    "path": "ext/rocsparse-sys/.rustfmt.toml",
    "content": "disable_all_formatting = true\n"
  },
  {
    "path": "ext/rocsparse-sys/Cargo.toml",
    "content": "[package]\nname = \"rocsparse-sys\"\nversion = \"0.0.0\"\nauthors = [\"Andrzej Janik <vosen@vosen.pl>\"]\nedition = \"2021\"\n\n[lib]\n\n[dependencies]\nhip_runtime-sys = { version = \"0.0.0\", path = \"../hip_runtime-sys\" }\n"
  },
  {
    "path": "ext/rocsparse-sys/build.rs",
    "content": "use std::env::VarError;\n\nfn main() -> Result<(), VarError> {\n    if !cfg!(windows) {\n        println!(\"cargo:rustc-link-lib=dylib=rocsparse\");\n        println!(\"cargo:rustc-link-search=native=/opt/rocm/lib/\");\n    }\n    Ok(())\n}\n"
  },
  {
    "path": "ext/rocsparse-sys/src/lib.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\n#[repr(C)]\n#[derive(Debug, Copy, Clone, PartialEq)]\npub struct rocsparse_float_complex {\n    pub x: f32,\n    pub y: f32,\n}\n#[repr(C)]\n#[derive(Debug, Copy, Clone, PartialEq)]\npub struct rocsparse_double_complex {\n    pub x: f64,\n    pub y: f64,\n}\npub type rocsparse_int = i32;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct _rocsparse_handle {\n    _unused: [u8; 0],\n}\n/** \\ingroup types_module\n  \\brief Handle to the rocSPARSE library context queue.\n\n  \\details\n  The rocSPARSE handle is a structure holding the rocSPARSE library context. It must\n  be initialized using rocsparse_create_handle() and the returned handle must be\n  passed to all subsequent library function calls. It should be destroyed at the end\n  using rocsparse_destroy_handle().*/\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_handle(pub *mut _rocsparse_handle);\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct _rocsparse_mat_descr {\n    _unused: [u8; 0],\n}\n/** \\ingroup types_module\n  \\brief Descriptor of the matrix.\n\n  \\details\n  The rocSPARSE matrix descriptor is a structure holding all properties of a matrix.\n  It must be initialized using rocsparse_create_mat_descr() and the returned\n  descriptor must be passed to all subsequent library calls that involve the matrix.\n  It should be destroyed at the end using rocsparse_destroy_mat_descr().*/\npub type rocsparse_mat_descr = *mut _rocsparse_mat_descr;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct _rocsparse_hyb_mat {\n    _unused: [u8; 0],\n}\n/** \\ingroup types_module\n  \\brief HYB matrix storage format.\n\n  \\details\n  The rocSPARSE HYB matrix structure holds the HYB matrix. It must be initialized using\n  rocsparse_create_hyb_mat() and the returned HYB matrix must be passed to all\n  subsequent library calls that involve the matrix. It should be destroyed at the end\n  using rocsparse_destroy_hyb_mat().*/\npub type rocsparse_hyb_mat = *mut _rocsparse_hyb_mat;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct _rocsparse_mat_info {\n    _unused: [u8; 0],\n}\n/** \\ingroup types_module\n  \\brief Info structure to hold all matrix meta data.\n\n  \\details\n  The rocSPARSE matrix info is a structure holding all matrix information that is\n  gathered during analysis routines. It must be initialized using\n  rocsparse_create_mat_info() and the returned info structure must be passed to all\n  subsequent library calls that require additional matrix information. It should be\n  destroyed at the end using rocsparse_destroy_mat_info().*/\npub type rocsparse_mat_info = *mut _rocsparse_mat_info;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct _rocsparse_spvec_descr {\n    _unused: [u8; 0],\n}\n/** \\ingroup types_module\n  \\brief Generic API descriptor of the sparse vector.\n\n  \\details\n  The rocSPARSE sparse vector descriptor is a structure holding all properties of a sparse vector.\n  It must be initialized using rocsparse_create_spvec_descr() and the returned\n  descriptor must be passed to all subsequent generic API library calls that involve the sparse vector.\n  It should be destroyed at the end using rocsparse_destroy_spvec_descr().*/\npub type rocsparse_spvec_descr = *mut _rocsparse_spvec_descr;\n/** \\ingroup types_module\n  \\brief Generic API descriptor of the sparse vector.\n\n  \\details\n  The rocSPARSE constant sparse vector descriptor is a structure holding all properties of a sparse vector.\n  It must be initialized using rocsparse_create_const_spvec_descr() and the returned\n  descriptor must be passed to all subsequent generic API library calls that involve the sparse vector.\n  It should be destroyed at the end using rocsparse_destroy_spvec_descr().*/\npub type rocsparse_const_spvec_descr = *const _rocsparse_spvec_descr;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct _rocsparse_spmat_descr {\n    _unused: [u8; 0],\n}\n/** \\ingroup types_module\n  \\brief Generic API descriptor of the sparse matrix.\n\n  \\details\n  The rocSPARSE sparse matrix descriptor is a structure holding all properties of a sparse matrix.\n  It must be initialized using rocsparse_create_coo_descr(), rocsparse_create_coo_aos_descr(),\n  rocsparse_create_bsr_descr(), rocsparse_create_csr_descr(), rocsparse_create_csc_descr(),\n  rocsparse_create_ell_descr(), or rocsparse_create_bell_descr() and the returned\n  descriptor must be passed to all subsequent generic API library calls that involve the sparse matrix.\n  It should be destroyed at the end using rocsparse_destroy_spmat_descr().*/\npub type rocsparse_spmat_descr = *mut _rocsparse_spmat_descr;\n/** \\ingroup types_module\n  \\brief Generic API descriptor of the sparse matrix.\n\n  \\details\n  The rocSPARSE constant sparse matrix descriptor is a structure holding all properties of a sparse matrix.\n  It must be initialized using rocsparse_create__constcoo_descr(), rocsparse_create_const_bsr_descr(),\n  rocsparse_create_const_csr_descr(), rocsparse_create_const_csc_descr(),\n  or rocsparse_create_const_bell_descr() and the returned\n  descriptor must be passed to all subsequent generic API library calls that involve the sparse matrix.\n  It should be destroyed at the end using rocsparse_destroy_spmat_descr().*/\npub type rocsparse_const_spmat_descr = *const _rocsparse_spmat_descr;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct _rocsparse_dnvec_descr {\n    _unused: [u8; 0],\n}\n/** \\ingroup types_module\n  \\brief Generic API descriptor of the dense vector.\n\n  \\details\n  The rocSPARSE dense vector descriptor is a structure holding all properties of a dense vector.\n  It must be initialized using rocsparse_create_dnvec_descr() and the returned\n  descriptor must be passed to all subsequent generic API library calls that involve the dense vector.\n  It should be destroyed at the end using rocsparse_destroy_dnvec_descr().*/\npub type rocsparse_dnvec_descr = *mut _rocsparse_dnvec_descr;\n/** \\ingroup types_module\n  \\brief Generic API descriptor of the dense vector.\n\n  \\details\n  The rocSPARSE constant dense vector descriptor is a structure holding all properties of a dense vector.\n  It must be initialized using rocsparse_create_const_dnvec_descr() and the returned\n  descriptor must be passed to all subsequent generic API library calls that involve the dense vector.\n  It should be destroyed at the end using rocsparse_destroy_dnvec_descr().*/\npub type rocsparse_const_dnvec_descr = *const _rocsparse_dnvec_descr;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct _rocsparse_dnmat_descr {\n    _unused: [u8; 0],\n}\n/** \\ingroup types_module\n  \\brief Generic API descriptor of the dense matrix.\n\n  \\details\n  The rocSPARSE dense matrix descriptor is a structure holding all properties of a dense matrix.\n  It must be initialized using rocsparse_create_dnmat_descr() and the returned\n  descriptor must be passed to all subsequent generic API library calls that involve the dense matrix.\n  It should be destroyed at the end using rocsparse_destroy_dnmat_descr().*/\npub type rocsparse_dnmat_descr = *mut _rocsparse_dnmat_descr;\n/** \\ingroup types_module\n  \\brief Generic API descriptor of the dense matrix.\n\n  \\details\n  The rocSPARSE constant dense matrix descriptor is a structure holding all properties of a dense matrix.\n  It must be initialized using rocsparse_create_const_dnmat_descr() and the returned\n  descriptor must be passed to all subsequent generic API library calls that involve the dense matrix.\n  It should be destroyed at the end using rocsparse_destroy_dnmat_descr().*/\npub type rocsparse_const_dnmat_descr = *const _rocsparse_dnmat_descr;\n#[repr(C)]\n#[derive(Debug, Copy, Clone)]\npub struct _rocsparse_color_info {\n    _unused: [u8; 0],\n}\n/** \\ingroup types_module\n  \\brief Coloring info structure to hold data gathered during analysis and later used in\n  rocSPARSE sparse matrix coloring routines.\n\n  \\details\n  The rocSPARSE color info is a structure holding coloring data that is\n  gathered during analysis routines. It must be initialized using\n  rocsparse_create_color_info() and the returned info structure must be passed to all\n  subsequent library calls that require coloring information. It should be\n  destroyed at the end using rocsparse_destroy_color_info().*/\npub type rocsparse_color_info = *mut _rocsparse_color_info;\nimpl rocsparse_operation_ {\n    ///< Operate with matrix.\n    pub const rocsparse_operation_none: rocsparse_operation_ = rocsparse_operation_(111);\n}\nimpl rocsparse_operation_ {\n    ///< Operate with transpose.\n    pub const rocsparse_operation_transpose: rocsparse_operation_ = rocsparse_operation_(\n        112,\n    );\n}\nimpl rocsparse_operation_ {\n    ///< Operate with conj. transpose.\n    pub const rocsparse_operation_conjugate_transpose: rocsparse_operation_ = rocsparse_operation_(\n        113,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief Specify whether the matrix is to be transposed or not.\n\n  \\details\n  The \\ref rocsparse_operation indicates the operation performed with the given matrix.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_operation_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief Specify whether the matrix is to be transposed or not.\n\n  \\details\n  The \\ref rocsparse_operation indicates the operation performed with the given matrix.*/\npub use self::rocsparse_operation_ as rocsparse_operation;\nimpl rocsparse_index_base_ {\n    ///< zero based indexing.\n    pub const rocsparse_index_base_zero: rocsparse_index_base_ = rocsparse_index_base_(\n        0,\n    );\n}\nimpl rocsparse_index_base_ {\n    ///< one based indexing.\n    pub const rocsparse_index_base_one: rocsparse_index_base_ = rocsparse_index_base_(1);\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief Specify the matrix index base.\n\n  \\details\n  The \\ref rocsparse_index_base indicates the index base of the indices. For a\n  given \\ref rocsparse_mat_descr, the \\ref rocsparse_index_base can be set using\n  rocsparse_set_mat_index_base(). The current \\ref rocsparse_index_base of a matrix\n  can be obtained by rocsparse_get_mat_index_base().*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_index_base_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief Specify the matrix index base.\n\n  \\details\n  The \\ref rocsparse_index_base indicates the index base of the indices. For a\n  given \\ref rocsparse_mat_descr, the \\ref rocsparse_index_base can be set using\n  rocsparse_set_mat_index_base(). The current \\ref rocsparse_index_base of a matrix\n  can be obtained by rocsparse_get_mat_index_base().*/\npub use self::rocsparse_index_base_ as rocsparse_index_base;\nimpl rocsparse_matrix_type_ {\n    ///< general matrix type.\n    pub const rocsparse_matrix_type_general: rocsparse_matrix_type_ = rocsparse_matrix_type_(\n        0,\n    );\n}\nimpl rocsparse_matrix_type_ {\n    ///< symmetric matrix type.\n    pub const rocsparse_matrix_type_symmetric: rocsparse_matrix_type_ = rocsparse_matrix_type_(\n        1,\n    );\n}\nimpl rocsparse_matrix_type_ {\n    ///< hermitian matrix type.\n    pub const rocsparse_matrix_type_hermitian: rocsparse_matrix_type_ = rocsparse_matrix_type_(\n        2,\n    );\n}\nimpl rocsparse_matrix_type_ {\n    ///< triangular matrix type.\n    pub const rocsparse_matrix_type_triangular: rocsparse_matrix_type_ = rocsparse_matrix_type_(\n        3,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief Specify the matrix type.\n\n  \\details\n  The \\ref rocsparse_matrix_type indices the type of a matrix. For a given\n  \\ref rocsparse_mat_descr, the \\ref rocsparse_matrix_type can be set using\n  rocsparse_set_mat_type(). The current \\ref rocsparse_matrix_type of a matrix can be\n  obtained by rocsparse_get_mat_type().*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_matrix_type_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief Specify the matrix type.\n\n  \\details\n  The \\ref rocsparse_matrix_type indices the type of a matrix. For a given\n  \\ref rocsparse_mat_descr, the \\ref rocsparse_matrix_type can be set using\n  rocsparse_set_mat_type(). The current \\ref rocsparse_matrix_type of a matrix can be\n  obtained by rocsparse_get_mat_type().*/\npub use self::rocsparse_matrix_type_ as rocsparse_matrix_type;\nimpl rocsparse_diag_type_ {\n    ///< diagonal entries are non-unity.\n    pub const rocsparse_diag_type_non_unit: rocsparse_diag_type_ = rocsparse_diag_type_(\n        0,\n    );\n}\nimpl rocsparse_diag_type_ {\n    ///< diagonal entries are unity\n    pub const rocsparse_diag_type_unit: rocsparse_diag_type_ = rocsparse_diag_type_(1);\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief Indicates if the diagonal entries are unity.\n\n  \\details\n  The \\ref rocsparse_diag_type indicates whether the diagonal entries of a matrix are\n  unity or not. If \\ref rocsparse_diag_type_unit is specified, all present diagonal\n  values will be ignored. For a given \\ref rocsparse_mat_descr, the\n  \\ref rocsparse_diag_type can be set using rocsparse_set_mat_diag_type(). The current\n  \\ref rocsparse_diag_type of a matrix can be obtained by\n  rocsparse_get_mat_diag_type().*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_diag_type_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief Indicates if the diagonal entries are unity.\n\n  \\details\n  The \\ref rocsparse_diag_type indicates whether the diagonal entries of a matrix are\n  unity or not. If \\ref rocsparse_diag_type_unit is specified, all present diagonal\n  values will be ignored. For a given \\ref rocsparse_mat_descr, the\n  \\ref rocsparse_diag_type can be set using rocsparse_set_mat_diag_type(). The current\n  \\ref rocsparse_diag_type of a matrix can be obtained by\n  rocsparse_get_mat_diag_type().*/\npub use self::rocsparse_diag_type_ as rocsparse_diag_type;\nimpl rocsparse_fill_mode_ {\n    ///< lower triangular part is stored.\n    pub const rocsparse_fill_mode_lower: rocsparse_fill_mode_ = rocsparse_fill_mode_(0);\n}\nimpl rocsparse_fill_mode_ {\n    ///< upper triangular part is stored.\n    pub const rocsparse_fill_mode_upper: rocsparse_fill_mode_ = rocsparse_fill_mode_(1);\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief Specify the matrix fill mode.\n\n  \\details\n  The \\ref rocsparse_fill_mode indicates whether the lower or the upper part is stored\n  in a sparse triangular matrix. For a given \\ref rocsparse_mat_descr, the\n  \\ref rocsparse_fill_mode can be set using rocsparse_set_mat_fill_mode(). The current\n  \\ref rocsparse_fill_mode of a matrix can be obtained by\n  rocsparse_get_mat_fill_mode().*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_fill_mode_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief Specify the matrix fill mode.\n\n  \\details\n  The \\ref rocsparse_fill_mode indicates whether the lower or the upper part is stored\n  in a sparse triangular matrix. For a given \\ref rocsparse_mat_descr, the\n  \\ref rocsparse_fill_mode can be set using rocsparse_set_mat_fill_mode(). The current\n  \\ref rocsparse_fill_mode of a matrix can be obtained by\n  rocsparse_get_mat_fill_mode().*/\npub use self::rocsparse_fill_mode_ as rocsparse_fill_mode;\nimpl rocsparse_storage_mode_ {\n    ///< matrix is sorted.\n    pub const rocsparse_storage_mode_sorted: rocsparse_storage_mode_ = rocsparse_storage_mode_(\n        0,\n    );\n}\nimpl rocsparse_storage_mode_ {\n    ///< matrix is unsorted.\n    pub const rocsparse_storage_mode_unsorted: rocsparse_storage_mode_ = rocsparse_storage_mode_(\n        1,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief Specify whether the matrix is stored sorted or not.\n\n  \\details\n  The \\ref rocsparse_storage_mode indicates whether the matrix is stored sorted or not.\n  For a given \\ref rocsparse_mat_descr, the \\ref rocsparse_storage_mode can be set\n  using rocsparse_set_mat_storage_mode(). The current \\ref rocsparse_storage_mode of a\n  matrix can be obtained by rocsparse_get_mat_storage_mode().*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_storage_mode_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief Specify whether the matrix is stored sorted or not.\n\n  \\details\n  The \\ref rocsparse_storage_mode indicates whether the matrix is stored sorted or not.\n  For a given \\ref rocsparse_mat_descr, the \\ref rocsparse_storage_mode can be set\n  using rocsparse_set_mat_storage_mode(). The current \\ref rocsparse_storage_mode of a\n  matrix can be obtained by rocsparse_get_mat_storage_mode().*/\npub use self::rocsparse_storage_mode_ as rocsparse_storage_mode;\nimpl rocsparse_action_ {\n    ///< Operate only on indices.\n    pub const rocsparse_action_symbolic: rocsparse_action_ = rocsparse_action_(0);\n}\nimpl rocsparse_action_ {\n    ///< Operate on data and indices.\n    pub const rocsparse_action_numeric: rocsparse_action_ = rocsparse_action_(1);\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief Specify where the operation is performed on.\n\n  \\details\n  The \\ref rocsparse_action indicates whether the operation is performed on the full\n  matrix, or only on the sparsity pattern of the matrix.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_action_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief Specify where the operation is performed on.\n\n  \\details\n  The \\ref rocsparse_action indicates whether the operation is performed on the full\n  matrix, or only on the sparsity pattern of the matrix.*/\npub use self::rocsparse_action_ as rocsparse_action;\nimpl rocsparse_direction_ {\n    ///< Parse the matrix by rows.\n    pub const rocsparse_direction_row: rocsparse_direction_ = rocsparse_direction_(0);\n}\nimpl rocsparse_direction_ {\n    ///< Parse the matrix by columns.\n    pub const rocsparse_direction_column: rocsparse_direction_ = rocsparse_direction_(1);\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief Specify the matrix direction.\n\n  \\details\n  The \\ref rocsparse_direction indicates whether a dense matrix should be parsed by\n  rows or by columns, assuming column-major storage.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_direction_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief Specify the matrix direction.\n\n  \\details\n  The \\ref rocsparse_direction indicates whether a dense matrix should be parsed by\n  rows or by columns, assuming column-major storage.*/\npub use self::rocsparse_direction_ as rocsparse_direction;\nimpl rocsparse_hyb_partition_ {\n    ///< automatically decide on ELL nnz per row.\n    pub const rocsparse_hyb_partition_auto: rocsparse_hyb_partition_ = rocsparse_hyb_partition_(\n        0,\n    );\n}\nimpl rocsparse_hyb_partition_ {\n    ///< user given ELL nnz per row.\n    pub const rocsparse_hyb_partition_user: rocsparse_hyb_partition_ = rocsparse_hyb_partition_(\n        1,\n    );\n}\nimpl rocsparse_hyb_partition_ {\n    ///< max ELL nnz per row, no COO part.\n    pub const rocsparse_hyb_partition_max: rocsparse_hyb_partition_ = rocsparse_hyb_partition_(\n        2,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief HYB matrix partitioning type.\n\n  \\details\n  The \\ref rocsparse_hyb_partition type indicates how the hybrid format partitioning\n  between COO and ELL storage formats is performed.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_hyb_partition_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief HYB matrix partitioning type.\n\n  \\details\n  The \\ref rocsparse_hyb_partition type indicates how the hybrid format partitioning\n  between COO and ELL storage formats is performed.*/\npub use self::rocsparse_hyb_partition_ as rocsparse_hyb_partition;\nimpl rocsparse_analysis_policy_ {\n    ///< try to re-use meta data.\n    pub const rocsparse_analysis_policy_reuse: rocsparse_analysis_policy_ = rocsparse_analysis_policy_(\n        0,\n    );\n}\nimpl rocsparse_analysis_policy_ {\n    ///< force to re-build meta data.\n    pub const rocsparse_analysis_policy_force: rocsparse_analysis_policy_ = rocsparse_analysis_policy_(\n        1,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief Specify policy in analysis functions.\n\n  \\details\n  The \\ref rocsparse_analysis_policy specifies whether gathered analysis data should be\n  re-used or not. If meta data from a previous e.g. rocsparse_csrilu0_analysis() call\n  is available, it can be re-used for subsequent calls to e.g.\n  rocsparse_csrsv_analysis() and greatly improve performance of the analysis function.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_analysis_policy_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief Specify policy in analysis functions.\n\n  \\details\n  The \\ref rocsparse_analysis_policy specifies whether gathered analysis data should be\n  re-used or not. If meta data from a previous e.g. rocsparse_csrilu0_analysis() call\n  is available, it can be re-used for subsequent calls to e.g.\n  rocsparse_csrsv_analysis() and greatly improve performance of the analysis function.*/\npub use self::rocsparse_analysis_policy_ as rocsparse_analysis_policy;\nimpl rocsparse_solve_policy_ {\n    ///< automatically decide on level information.\n    pub const rocsparse_solve_policy_auto: rocsparse_solve_policy_ = rocsparse_solve_policy_(\n        0,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief Specify policy in triangular solvers and factorizations.\n\n  \\details\n  This is a placeholder.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_solve_policy_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief Specify policy in triangular solvers and factorizations.\n\n  \\details\n  This is a placeholder.*/\npub use self::rocsparse_solve_policy_ as rocsparse_solve_policy;\nimpl rocsparse_pointer_mode_ {\n    ///< scalar pointers are in host memory.\n    pub const rocsparse_pointer_mode_host: rocsparse_pointer_mode_ = rocsparse_pointer_mode_(\n        0,\n    );\n}\nimpl rocsparse_pointer_mode_ {\n    ///< scalar pointers are in device memory.\n    pub const rocsparse_pointer_mode_device: rocsparse_pointer_mode_ = rocsparse_pointer_mode_(\n        1,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief Indicates if the pointer is device pointer or host pointer.\n\n  \\details\n  The \\ref rocsparse_pointer_mode indicates whether scalar values are passed by\n  reference on the host or device. The \\ref rocsparse_pointer_mode can be changed by\n  rocsparse_set_pointer_mode(). The currently used pointer mode can be obtained by\n  rocsparse_get_pointer_mode().*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_pointer_mode_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief Indicates if the pointer is device pointer or host pointer.\n\n  \\details\n  The \\ref rocsparse_pointer_mode indicates whether scalar values are passed by\n  reference on the host or device. The \\ref rocsparse_pointer_mode can be changed by\n  rocsparse_set_pointer_mode(). The currently used pointer mode can be obtained by\n  rocsparse_get_pointer_mode().*/\npub use self::rocsparse_pointer_mode_ as rocsparse_pointer_mode;\nimpl rocsparse_layer_mode {\n    ///< layer is not active.\n    pub const rocsparse_layer_mode_none: rocsparse_layer_mode = rocsparse_layer_mode(0);\n}\nimpl rocsparse_layer_mode {\n    ///< layer is in logging mode.\n    pub const rocsparse_layer_mode_log_trace: rocsparse_layer_mode = rocsparse_layer_mode(\n        1,\n    );\n}\nimpl rocsparse_layer_mode {\n    ///< layer is in benchmarking mode (deprecated)\n    pub const rocsparse_layer_mode_log_bench: rocsparse_layer_mode = rocsparse_layer_mode(\n        2,\n    );\n}\nimpl rocsparse_layer_mode {\n    ///< layer is in debug mode.\n    pub const rocsparse_layer_mode_log_debug: rocsparse_layer_mode = rocsparse_layer_mode(\n        4,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief Indicates if layer is active with bitmask.\n\n  \\details\n  The \\ref rocsparse_layer_mode bit mask indicates the logging characteristics.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_layer_mode(pub ::core::ffi::c_uint);\nimpl rocsparse_data_status_ {\n    ///< success.\n    pub const rocsparse_data_status_success: rocsparse_data_status_ = rocsparse_data_status_(\n        0,\n    );\n}\nimpl rocsparse_data_status_ {\n    ///< An inf value detected.\n    pub const rocsparse_data_status_inf: rocsparse_data_status_ = rocsparse_data_status_(\n        1,\n    );\n}\nimpl rocsparse_data_status_ {\n    ///< An nan value detected.\n    pub const rocsparse_data_status_nan: rocsparse_data_status_ = rocsparse_data_status_(\n        2,\n    );\n}\nimpl rocsparse_data_status_ {\n    ///< An invalid row pointer offset detected.\n    pub const rocsparse_data_status_invalid_offset_ptr: rocsparse_data_status_ = rocsparse_data_status_(\n        3,\n    );\n}\nimpl rocsparse_data_status_ {\n    ///< An invalid row indice detected.\n    pub const rocsparse_data_status_invalid_index: rocsparse_data_status_ = rocsparse_data_status_(\n        4,\n    );\n}\nimpl rocsparse_data_status_ {\n    ///< Duplicate indice detected.\n    pub const rocsparse_data_status_duplicate_entry: rocsparse_data_status_ = rocsparse_data_status_(\n        5,\n    );\n}\nimpl rocsparse_data_status_ {\n    ///< Incorrect sorting detected.\n    pub const rocsparse_data_status_invalid_sorting: rocsparse_data_status_ = rocsparse_data_status_(\n        6,\n    );\n}\nimpl rocsparse_data_status_ {\n    ///< Incorrect fill mode detected.\n    pub const rocsparse_data_status_invalid_fill: rocsparse_data_status_ = rocsparse_data_status_(\n        7,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief List of rocsparse data status codes definition.\n\n  \\details\n  This is a list of the \\ref rocsparse_data_status types that are used by the rocSPARSE\n  library in the matrix check routines.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_data_status_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief List of rocsparse data status codes definition.\n\n  \\details\n  This is a list of the \\ref rocsparse_data_status types that are used by the rocSPARSE\n  library in the matrix check routines.*/\npub use self::rocsparse_data_status_ as rocsparse_data_status;\nimpl rocsparse_indextype_ {\n    ///< 16 bit unsigned integer.\n    pub const rocsparse_indextype_u16: rocsparse_indextype_ = rocsparse_indextype_(1);\n}\nimpl rocsparse_indextype_ {\n    ///< 32 bit signed integer.\n    pub const rocsparse_indextype_i32: rocsparse_indextype_ = rocsparse_indextype_(2);\n}\nimpl rocsparse_indextype_ {\n    ///< 64 bit signed integer.\n    pub const rocsparse_indextype_i64: rocsparse_indextype_ = rocsparse_indextype_(3);\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief List of rocsparse index types.\n\n  \\details\n  Indicates the index width of a rocsparse index type.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_indextype_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief List of rocsparse index types.\n\n  \\details\n  Indicates the index width of a rocsparse index type.*/\npub use self::rocsparse_indextype_ as rocsparse_indextype;\nimpl rocsparse_datatype_ {\n    ///< 32 bit floating point, real.\n    pub const rocsparse_datatype_f32_r: rocsparse_datatype_ = rocsparse_datatype_(151);\n}\nimpl rocsparse_datatype_ {\n    ///< 64 bit floating point, real.\n    pub const rocsparse_datatype_f64_r: rocsparse_datatype_ = rocsparse_datatype_(152);\n}\nimpl rocsparse_datatype_ {\n    ///< 32 bit floating point, complex.\n    pub const rocsparse_datatype_f32_c: rocsparse_datatype_ = rocsparse_datatype_(154);\n}\nimpl rocsparse_datatype_ {\n    ///< 64 bit floating point, complex.\n    pub const rocsparse_datatype_f64_c: rocsparse_datatype_ = rocsparse_datatype_(155);\n}\nimpl rocsparse_datatype_ {\n    ///<  8-bit signed integer, real\n    pub const rocsparse_datatype_i8_r: rocsparse_datatype_ = rocsparse_datatype_(160);\n}\nimpl rocsparse_datatype_ {\n    ///<  8-bit unsigned integer, real\n    pub const rocsparse_datatype_u8_r: rocsparse_datatype_ = rocsparse_datatype_(161);\n}\nimpl rocsparse_datatype_ {\n    ///< 32-bit signed integer, real\n    pub const rocsparse_datatype_i32_r: rocsparse_datatype_ = rocsparse_datatype_(162);\n}\nimpl rocsparse_datatype_ {\n    ///< 32-bit unsigned integer, real\n    pub const rocsparse_datatype_u32_r: rocsparse_datatype_ = rocsparse_datatype_(163);\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief List of rocsparse data types.\n\n  \\details\n  Indicates the precision width of data stored in a rocsparse type.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_datatype_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief List of rocsparse data types.\n\n  \\details\n  Indicates the precision width of data stored in a rocsparse type.*/\npub use self::rocsparse_datatype_ as rocsparse_datatype;\nimpl rocsparse_format_ {\n    ///< COO sparse matrix format.\n    pub const rocsparse_format_coo: rocsparse_format_ = rocsparse_format_(0);\n}\nimpl rocsparse_format_ {\n    ///< COO AoS sparse matrix format.\n    pub const rocsparse_format_coo_aos: rocsparse_format_ = rocsparse_format_(1);\n}\nimpl rocsparse_format_ {\n    ///< CSR sparse matrix format.\n    pub const rocsparse_format_csr: rocsparse_format_ = rocsparse_format_(2);\n}\nimpl rocsparse_format_ {\n    ///< CSC sparse matrix format.\n    pub const rocsparse_format_csc: rocsparse_format_ = rocsparse_format_(3);\n}\nimpl rocsparse_format_ {\n    ///< ELL sparse matrix format.\n    pub const rocsparse_format_ell: rocsparse_format_ = rocsparse_format_(4);\n}\nimpl rocsparse_format_ {\n    ///< BLOCKED ELL sparse matrix format.\n    pub const rocsparse_format_bell: rocsparse_format_ = rocsparse_format_(5);\n}\nimpl rocsparse_format_ {\n    ///< BSR sparse matrix format.\n    pub const rocsparse_format_bsr: rocsparse_format_ = rocsparse_format_(6);\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief List of sparse matrix formats.\n\n  \\details\n  This is a list of supported \\ref rocsparse_format types that are used to describe a\n  sparse matrix.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_format_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief List of sparse matrix formats.\n\n  \\details\n  This is a list of supported \\ref rocsparse_format types that are used to describe a\n  sparse matrix.*/\npub use self::rocsparse_format_ as rocsparse_format;\nimpl rocsparse_order_ {\n    ///< Row major.\n    pub const rocsparse_order_row: rocsparse_order_ = rocsparse_order_(0);\n}\nimpl rocsparse_order_ {\n    ///< Column major.\n    pub const rocsparse_order_column: rocsparse_order_ = rocsparse_order_(1);\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief List of dense matrix ordering.\n\n  \\details\n  This is a list of supported \\ref rocsparse_order types that are used to describe the\n  memory layout of a dense matrix*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_order_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief List of dense matrix ordering.\n\n  \\details\n  This is a list of supported \\ref rocsparse_order types that are used to describe the\n  memory layout of a dense matrix*/\npub use self::rocsparse_order_ as rocsparse_order;\nimpl rocsparse_spmat_attribute_ {\n    ///< Fill mode attribute.\n    pub const rocsparse_spmat_fill_mode: rocsparse_spmat_attribute_ = rocsparse_spmat_attribute_(\n        0,\n    );\n}\nimpl rocsparse_spmat_attribute_ {\n    ///< Diag type attribute.\n    pub const rocsparse_spmat_diag_type: rocsparse_spmat_attribute_ = rocsparse_spmat_attribute_(\n        1,\n    );\n}\nimpl rocsparse_spmat_attribute_ {\n    ///< Matrix type attribute.\n    pub const rocsparse_spmat_matrix_type: rocsparse_spmat_attribute_ = rocsparse_spmat_attribute_(\n        2,\n    );\n}\nimpl rocsparse_spmat_attribute_ {\n    ///< Matrix storage attribute.\n    pub const rocsparse_spmat_storage_mode: rocsparse_spmat_attribute_ = rocsparse_spmat_attribute_(\n        3,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief List of sparse matrix attributes*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_spmat_attribute_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief List of sparse matrix attributes*/\npub use self::rocsparse_spmat_attribute_ as rocsparse_spmat_attribute;\nimpl rocsparse_itilu0_alg_ {\n    ///< ASynchronous ITILU0 algorithm with in-place storage\n    pub const rocsparse_itilu0_alg_default: rocsparse_itilu0_alg_ = rocsparse_itilu0_alg_(\n        0,\n    );\n}\nimpl rocsparse_itilu0_alg_ {\n    pub const rocsparse_itilu0_alg_async_inplace: rocsparse_itilu0_alg_ = rocsparse_itilu0_alg_(\n        1,\n    );\n}\nimpl rocsparse_itilu0_alg_ {\n    pub const rocsparse_itilu0_alg_async_split: rocsparse_itilu0_alg_ = rocsparse_itilu0_alg_(\n        2,\n    );\n}\nimpl rocsparse_itilu0_alg_ {\n    pub const rocsparse_itilu0_alg_sync_split: rocsparse_itilu0_alg_ = rocsparse_itilu0_alg_(\n        3,\n    );\n}\nimpl rocsparse_itilu0_alg_ {\n    pub const rocsparse_itilu0_alg_sync_split_fusion: rocsparse_itilu0_alg_ = rocsparse_itilu0_alg_(\n        4,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief List of Iterative ILU0 algorithms.\n\n  \\details\n  This is a list of supported \\ref rocsparse_itilu0_alg types that are used to perform\n  the iterative ILU0 algorithm.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_itilu0_alg_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief List of Iterative ILU0 algorithms.\n\n  \\details\n  This is a list of supported \\ref rocsparse_itilu0_alg types that are used to perform\n  the iterative ILU0 algorithm.*/\npub use self::rocsparse_itilu0_alg_ as rocsparse_itilu0_alg;\nimpl rocsparse_itilu0_option_ {\n    ///< Compute a stopping criteria.\n    pub const rocsparse_itilu0_option_verbose: rocsparse_itilu0_option_ = rocsparse_itilu0_option_(\n        1,\n    );\n}\nimpl rocsparse_itilu0_option_ {\n    ///< Compute a stopping criteria.\n    pub const rocsparse_itilu0_option_stopping_criteria: rocsparse_itilu0_option_ = rocsparse_itilu0_option_(\n        2,\n    );\n}\nimpl rocsparse_itilu0_option_ {\n    ///< Compute correction\n    pub const rocsparse_itilu0_option_compute_nrm_correction: rocsparse_itilu0_option_ = rocsparse_itilu0_option_(\n        4,\n    );\n}\nimpl rocsparse_itilu0_option_ {\n    ///< Compute residual\n    pub const rocsparse_itilu0_option_compute_nrm_residual: rocsparse_itilu0_option_ = rocsparse_itilu0_option_(\n        8,\n    );\n}\nimpl rocsparse_itilu0_option_ {\n    ///< Log convergence history\n    pub const rocsparse_itilu0_option_convergence_history: rocsparse_itilu0_option_ = rocsparse_itilu0_option_(\n        16,\n    );\n}\nimpl rocsparse_itilu0_option_ {\n    ///< Use internal coordinate format.\n    pub const rocsparse_itilu0_option_coo_format: rocsparse_itilu0_option_ = rocsparse_itilu0_option_(\n        32,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief List of Iterative ILU0 options.\n\n  \\details\n  This is a list of supported \\ref rocsparse_itilu0_option options that are used to perform\n  the iterative ILU0 algorithm.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_itilu0_option_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief List of Iterative ILU0 options.\n\n  \\details\n  This is a list of supported \\ref rocsparse_itilu0_option options that are used to perform\n  the iterative ILU0 algorithm.*/\npub use self::rocsparse_itilu0_option_ as rocsparse_itilu0_option;\nimpl rocsparse_gtsv_interleaved_alg_ {\n    pub const rocsparse_gtsv_interleaved_alg_default: rocsparse_gtsv_interleaved_alg_ = rocsparse_gtsv_interleaved_alg_(\n        0,\n    );\n}\nimpl rocsparse_gtsv_interleaved_alg_ {\n    pub const rocsparse_gtsv_interleaved_alg_thomas: rocsparse_gtsv_interleaved_alg_ = rocsparse_gtsv_interleaved_alg_(\n        1,\n    );\n}\nimpl rocsparse_gtsv_interleaved_alg_ {\n    pub const rocsparse_gtsv_interleaved_alg_lu: rocsparse_gtsv_interleaved_alg_ = rocsparse_gtsv_interleaved_alg_(\n        2,\n    );\n}\nimpl rocsparse_gtsv_interleaved_alg_ {\n    pub const rocsparse_gtsv_interleaved_alg_qr: rocsparse_gtsv_interleaved_alg_ = rocsparse_gtsv_interleaved_alg_(\n        3,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief List of interleaved gtsv algorithms.\n\n  \\details\n  This is a list of supported \\ref rocsparse_gtsv_interleaved_alg types that are used to perform\n  interleaved tridiagonal solve.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_gtsv_interleaved_alg_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief List of interleaved gtsv algorithms.\n\n  \\details\n  This is a list of supported \\ref rocsparse_gtsv_interleaved_alg types that are used to perform\n  interleaved tridiagonal solve.*/\npub use self::rocsparse_gtsv_interleaved_alg_ as rocsparse_gtsv_interleaved_alg;\nimpl rocsparse_check_spmat_stage_ {\n    ///< Returns the required buffer size.\n    pub const rocsparse_check_spmat_stage_buffer_size: rocsparse_check_spmat_stage_ = rocsparse_check_spmat_stage_(\n        0,\n    );\n}\nimpl rocsparse_check_spmat_stage_ {\n    ///< Performs check.\n    pub const rocsparse_check_spmat_stage_compute: rocsparse_check_spmat_stage_ = rocsparse_check_spmat_stage_(\n        1,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief List of check_matrix stages.\n\n  \\details\n  This is a list of possible stages during check_matrix computation. Typical order is\n  rocsparse_check_spmat_stage_buffer_size, rocsparse_check_spmat_stage_compute.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_check_spmat_stage_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief List of check_matrix stages.\n\n  \\details\n  This is a list of possible stages during check_matrix computation. Typical order is\n  rocsparse_check_spmat_stage_buffer_size, rocsparse_check_spmat_stage_compute.*/\npub use self::rocsparse_check_spmat_stage_ as rocsparse_check_spmat_stage;\nimpl rocsparse_spmv_stage_ {\n    ///< Returns the required buffer size.\n    pub const rocsparse_spmv_stage_buffer_size: rocsparse_spmv_stage_ = rocsparse_spmv_stage_(\n        1,\n    );\n}\nimpl rocsparse_spmv_stage_ {\n    ///< Preprocess data.\n    pub const rocsparse_spmv_stage_preprocess: rocsparse_spmv_stage_ = rocsparse_spmv_stage_(\n        2,\n    );\n}\nimpl rocsparse_spmv_stage_ {\n    ///< Performs the actual SpMV computation.\n    pub const rocsparse_spmv_stage_compute: rocsparse_spmv_stage_ = rocsparse_spmv_stage_(\n        3,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief List of SpMV stages.\n\n  \\details\n  This is a list of possible stages during SpMV computation. Typical order is\n  rocsparse_spmv_buffer_size, rocsparse_spmv_preprocess, rocsparse_spmv_compute.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_spmv_stage_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief List of SpMV stages.\n\n  \\details\n  This is a list of possible stages during SpMV computation. Typical order is\n  rocsparse_spmv_buffer_size, rocsparse_spmv_preprocess, rocsparse_spmv_compute.*/\npub use self::rocsparse_spmv_stage_ as rocsparse_spmv_stage;\nimpl rocsparse_spmv_alg_ {\n    ///< Default SpMV algorithm for the given format.\n    pub const rocsparse_spmv_alg_default: rocsparse_spmv_alg_ = rocsparse_spmv_alg_(0);\n}\nimpl rocsparse_spmv_alg_ {\n    ///< COO SpMV algorithm 1 (segmented) for COO matrices.\n    pub const rocsparse_spmv_alg_coo: rocsparse_spmv_alg_ = rocsparse_spmv_alg_(1);\n}\nimpl rocsparse_spmv_alg_ {\n    ///< CSR SpMV algorithm 1 (adaptive) for CSR matrices.\n    pub const rocsparse_spmv_alg_csr_adaptive: rocsparse_spmv_alg_ = rocsparse_spmv_alg_(\n        2,\n    );\n}\nimpl rocsparse_spmv_alg_ {\n    ///< CSR SpMV algorithm 2 (stream) for CSR matrices.\n    pub const rocsparse_spmv_alg_csr_stream: rocsparse_spmv_alg_ = rocsparse_spmv_alg_(\n        3,\n    );\n}\nimpl rocsparse_spmv_alg_ {\n    ///< ELL SpMV algorithm for ELL matrices.\n    pub const rocsparse_spmv_alg_ell: rocsparse_spmv_alg_ = rocsparse_spmv_alg_(4);\n}\nimpl rocsparse_spmv_alg_ {\n    ///< COO SpMV algorithm 2 (atomic) for COO matrices.\n    pub const rocsparse_spmv_alg_coo_atomic: rocsparse_spmv_alg_ = rocsparse_spmv_alg_(\n        5,\n    );\n}\nimpl rocsparse_spmv_alg_ {\n    ///< BSR SpMV algorithm 1 for BSR matrices.\n    pub const rocsparse_spmv_alg_bsr: rocsparse_spmv_alg_ = rocsparse_spmv_alg_(6);\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief List of SpMV algorithms.\n\n  \\details\n  This is a list of supported \\ref rocsparse_spmv_alg types that are used to perform\n  matrix vector product.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_spmv_alg_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief List of SpMV algorithms.\n\n  \\details\n  This is a list of supported \\ref rocsparse_spmv_alg types that are used to perform\n  matrix vector product.*/\npub use self::rocsparse_spmv_alg_ as rocsparse_spmv_alg;\nimpl rocsparse_spsv_alg_ {\n    ///< Default SpSV algorithm for the given format.\n    pub const rocsparse_spsv_alg_default: rocsparse_spsv_alg_ = rocsparse_spsv_alg_(0);\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief List of SpSV algorithms.\n\n  \\details\n  This is a list of supported \\ref rocsparse_spsv_alg types that are used to perform\n  triangular solve.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_spsv_alg_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief List of SpSV algorithms.\n\n  \\details\n  This is a list of supported \\ref rocsparse_spsv_alg types that are used to perform\n  triangular solve.*/\npub use self::rocsparse_spsv_alg_ as rocsparse_spsv_alg;\nimpl rocsparse_spsv_stage_ {\n    ///< Returns the required buffer size.\n    pub const rocsparse_spsv_stage_buffer_size: rocsparse_spsv_stage_ = rocsparse_spsv_stage_(\n        1,\n    );\n}\nimpl rocsparse_spsv_stage_ {\n    ///< Preprocess data.\n    pub const rocsparse_spsv_stage_preprocess: rocsparse_spsv_stage_ = rocsparse_spsv_stage_(\n        2,\n    );\n}\nimpl rocsparse_spsv_stage_ {\n    ///< Performs the actual SpSV computation.\n    pub const rocsparse_spsv_stage_compute: rocsparse_spsv_stage_ = rocsparse_spsv_stage_(\n        3,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief List of SpSV stages.\n\n  \\details\n  This is a list of possible stages during SpSV computation. Typical order is\n  rocsparse_spsv_buffer_size, rocsparse_spsv_preprocess, rocsparse_spsv_compute.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_spsv_stage_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief List of SpSV stages.\n\n  \\details\n  This is a list of possible stages during SpSV computation. Typical order is\n  rocsparse_spsv_buffer_size, rocsparse_spsv_preprocess, rocsparse_spsv_compute.*/\npub use self::rocsparse_spsv_stage_ as rocsparse_spsv_stage;\nimpl rocsparse_spitsv_alg_ {\n    ///< Default SpITSV algorithm for the given format.\n    pub const rocsparse_spitsv_alg_default: rocsparse_spitsv_alg_ = rocsparse_spitsv_alg_(\n        0,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief List of SpITSV algorithms.\n\n  \\details\n  This is a list of supported \\ref rocsparse_spitsv_alg types that are used to perform\n  triangular solve.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_spitsv_alg_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief List of SpITSV algorithms.\n\n  \\details\n  This is a list of supported \\ref rocsparse_spitsv_alg types that are used to perform\n  triangular solve.*/\npub use self::rocsparse_spitsv_alg_ as rocsparse_spitsv_alg;\nimpl rocsparse_spitsv_stage_ {\n    ///< Returns the required buffer size.\n    pub const rocsparse_spitsv_stage_buffer_size: rocsparse_spitsv_stage_ = rocsparse_spitsv_stage_(\n        1,\n    );\n}\nimpl rocsparse_spitsv_stage_ {\n    ///< Preprocess data.\n    pub const rocsparse_spitsv_stage_preprocess: rocsparse_spitsv_stage_ = rocsparse_spitsv_stage_(\n        2,\n    );\n}\nimpl rocsparse_spitsv_stage_ {\n    ///< Performs the actual SpITSV computation.\n    pub const rocsparse_spitsv_stage_compute: rocsparse_spitsv_stage_ = rocsparse_spitsv_stage_(\n        3,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief List of SpITSV stages.\n\n  \\details\n  This is a list of possible stages during SpITSV computation. Typical order is\n  buffer_size, preprocess, compute.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_spitsv_stage_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief List of SpITSV stages.\n\n  \\details\n  This is a list of possible stages during SpITSV computation. Typical order is\n  buffer_size, preprocess, compute.*/\npub use self::rocsparse_spitsv_stage_ as rocsparse_spitsv_stage;\nimpl rocsparse_spsm_alg_ {\n    ///< Default SpSM algorithm for the given format.\n    pub const rocsparse_spsm_alg_default: rocsparse_spsm_alg_ = rocsparse_spsm_alg_(0);\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief List of SpSM algorithms.\n\n  \\details\n  This is a list of supported \\ref rocsparse_spsm_alg types that are used to perform\n  triangular solve.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_spsm_alg_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief List of SpSM algorithms.\n\n  \\details\n  This is a list of supported \\ref rocsparse_spsm_alg types that are used to perform\n  triangular solve.*/\npub use self::rocsparse_spsm_alg_ as rocsparse_spsm_alg;\nimpl rocsparse_spsm_stage_ {\n    ///< Returns the required buffer size.\n    pub const rocsparse_spsm_stage_buffer_size: rocsparse_spsm_stage_ = rocsparse_spsm_stage_(\n        1,\n    );\n}\nimpl rocsparse_spsm_stage_ {\n    ///< Preprocess data.\n    pub const rocsparse_spsm_stage_preprocess: rocsparse_spsm_stage_ = rocsparse_spsm_stage_(\n        2,\n    );\n}\nimpl rocsparse_spsm_stage_ {\n    ///< Performs the actual SpSM computation.\n    pub const rocsparse_spsm_stage_compute: rocsparse_spsm_stage_ = rocsparse_spsm_stage_(\n        3,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief List of SpSM stages.\n\n  \\details\n  This is a list of possible stages during SpSM computation. Typical order is\n  rocsparse_spsm_buffer_size, rocsparse_spsm_preprocess, rocsparse_spsm_compute.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_spsm_stage_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief List of SpSM stages.\n\n  \\details\n  This is a list of possible stages during SpSM computation. Typical order is\n  rocsparse_spsm_buffer_size, rocsparse_spsm_preprocess, rocsparse_spsm_compute.*/\npub use self::rocsparse_spsm_stage_ as rocsparse_spsm_stage;\nimpl rocsparse_spmm_alg_ {\n    ///< Default SpMM algorithm for the given format.\n    pub const rocsparse_spmm_alg_default: rocsparse_spmm_alg_ = rocsparse_spmm_alg_(0);\n}\nimpl rocsparse_spmm_alg_ {\n    ///< SpMM algorithm for CSR format using row split and shared memory.\n    pub const rocsparse_spmm_alg_csr: rocsparse_spmm_alg_ = rocsparse_spmm_alg_(1);\n}\nimpl rocsparse_spmm_alg_ {\n    ///< SpMM algorithm for COO format using segmented scan.\n    pub const rocsparse_spmm_alg_coo_segmented: rocsparse_spmm_alg_ = rocsparse_spmm_alg_(\n        2,\n    );\n}\nimpl rocsparse_spmm_alg_ {\n    ///< SpMM algorithm for COO format using atomics.\n    pub const rocsparse_spmm_alg_coo_atomic: rocsparse_spmm_alg_ = rocsparse_spmm_alg_(\n        3,\n    );\n}\nimpl rocsparse_spmm_alg_ {\n    ///< SpMM algorithm for CSR format using row split and shfl.\n    pub const rocsparse_spmm_alg_csr_row_split: rocsparse_spmm_alg_ = rocsparse_spmm_alg_(\n        4,\n    );\n}\nimpl rocsparse_spmm_alg_ {\n    ///< SpMM algorithm for CSR format using conversion to COO.\n    pub const rocsparse_spmm_alg_csr_merge: rocsparse_spmm_alg_ = rocsparse_spmm_alg_(5);\n}\nimpl rocsparse_spmm_alg_ {\n    ///< SpMM algorithm for COO format using segmented scan and atomics.\n    pub const rocsparse_spmm_alg_coo_segmented_atomic: rocsparse_spmm_alg_ = rocsparse_spmm_alg_(\n        6,\n    );\n}\nimpl rocsparse_spmm_alg_ {\n    ///< SpMM algorithm for Blocked ELL format.\n    pub const rocsparse_spmm_alg_bell: rocsparse_spmm_alg_ = rocsparse_spmm_alg_(7);\n}\nimpl rocsparse_spmm_alg_ {\n    ///< SpMM algorithm for BSR format.\n    pub const rocsparse_spmm_alg_bsr: rocsparse_spmm_alg_ = rocsparse_spmm_alg_(8);\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief List of SpMM algorithms.\n\n  \\details\n  This is a list of supported \\ref rocsparse_spmm_alg types that are used to perform\n  matrix vector product.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_spmm_alg_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief List of SpMM algorithms.\n\n  \\details\n  This is a list of supported \\ref rocsparse_spmm_alg types that are used to perform\n  matrix vector product.*/\npub use self::rocsparse_spmm_alg_ as rocsparse_spmm_alg;\nimpl rocsparse_sddmm_alg_ {\n    ///< Default sddmm algorithm for the given format.\n    pub const rocsparse_sddmm_alg_default: rocsparse_sddmm_alg_ = rocsparse_sddmm_alg_(\n        0,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief List of sddmm algorithms.\n\n  \\details\n  This is a list of supported \\ref rocsparse_sddmm_alg types that are used to perform\n  matrix vector product.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_sddmm_alg_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief List of sddmm algorithms.\n\n  \\details\n  This is a list of supported \\ref rocsparse_sddmm_alg types that are used to perform\n  matrix vector product.*/\npub use self::rocsparse_sddmm_alg_ as rocsparse_sddmm_alg;\nimpl rocsparse_sparse_to_dense_alg_ {\n    pub const rocsparse_sparse_to_dense_alg_default: rocsparse_sparse_to_dense_alg_ = rocsparse_sparse_to_dense_alg_(\n        0,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief List of sparse to dense algorithms.\n\n  \\details\n  This is a list of supported \\ref rocsparse_sparse_to_dense_alg types that are used to perform\n  sparse to dense conversion.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_sparse_to_dense_alg_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief List of sparse to dense algorithms.\n\n  \\details\n  This is a list of supported \\ref rocsparse_sparse_to_dense_alg types that are used to perform\n  sparse to dense conversion.*/\npub use self::rocsparse_sparse_to_dense_alg_ as rocsparse_sparse_to_dense_alg;\nimpl rocsparse_dense_to_sparse_alg_ {\n    pub const rocsparse_dense_to_sparse_alg_default: rocsparse_dense_to_sparse_alg_ = rocsparse_dense_to_sparse_alg_(\n        0,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief List of dense to sparse algorithms.\n\n  \\details\n  This is a list of supported \\ref rocsparse_dense_to_sparse_alg types that are used to perform\n  dense to sparse conversion.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_dense_to_sparse_alg_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief List of dense to sparse algorithms.\n\n  \\details\n  This is a list of supported \\ref rocsparse_dense_to_sparse_alg types that are used to perform\n  dense to sparse conversion.*/\npub use self::rocsparse_dense_to_sparse_alg_ as rocsparse_dense_to_sparse_alg;\nimpl rocsparse_spmm_stage_ {\n    ///< Returns the required buffer size.\n    pub const rocsparse_spmm_stage_buffer_size: rocsparse_spmm_stage_ = rocsparse_spmm_stage_(\n        1,\n    );\n}\nimpl rocsparse_spmm_stage_ {\n    ///< Preprocess data.\n    pub const rocsparse_spmm_stage_preprocess: rocsparse_spmm_stage_ = rocsparse_spmm_stage_(\n        2,\n    );\n}\nimpl rocsparse_spmm_stage_ {\n    ///< Performs the actual SpMM computation.\n    pub const rocsparse_spmm_stage_compute: rocsparse_spmm_stage_ = rocsparse_spmm_stage_(\n        3,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief List of SpMM stages.\n\n  \\details\n  This is a list of possible stages during SpMM computation. Typical order is\n  rocsparse_spmm_buffer_size, rocsparse_spmm_preprocess, rocsparse_spmm_compute.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_spmm_stage_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief List of SpMM stages.\n\n  \\details\n  This is a list of possible stages during SpMM computation. Typical order is\n  rocsparse_spmm_buffer_size, rocsparse_spmm_preprocess, rocsparse_spmm_compute.*/\npub use self::rocsparse_spmm_stage_ as rocsparse_spmm_stage;\nimpl rocsparse_spgemm_stage_ {\n    ///< Returns the required buffer size.\n    pub const rocsparse_spgemm_stage_buffer_size: rocsparse_spgemm_stage_ = rocsparse_spgemm_stage_(\n        1,\n    );\n}\nimpl rocsparse_spgemm_stage_ {\n    ///< Computes number of non-zero entries.\n    pub const rocsparse_spgemm_stage_nnz: rocsparse_spgemm_stage_ = rocsparse_spgemm_stage_(\n        2,\n    );\n}\nimpl rocsparse_spgemm_stage_ {\n    ///< Performs the actual SpGEMM computation.\n    pub const rocsparse_spgemm_stage_compute: rocsparse_spgemm_stage_ = rocsparse_spgemm_stage_(\n        3,\n    );\n}\nimpl rocsparse_spgemm_stage_ {\n    ///< Performs the actual SpGEMM symbolic computation.\n    pub const rocsparse_spgemm_stage_symbolic: rocsparse_spgemm_stage_ = rocsparse_spgemm_stage_(\n        4,\n    );\n}\nimpl rocsparse_spgemm_stage_ {\n    ///< Performs the actual SpGEMM numeric computation.\n    pub const rocsparse_spgemm_stage_numeric: rocsparse_spgemm_stage_ = rocsparse_spgemm_stage_(\n        5,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief List of SpGEMM stages.\n\n  \\details\n  This is a list of possible stages during SpGEMM computation. Typical order is\n  rocsparse_spgemm_buffer_size, rocsparse_spgemm_nnz, rocsparse_spgemm_compute.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_spgemm_stage_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief List of SpGEMM stages.\n\n  \\details\n  This is a list of possible stages during SpGEMM computation. Typical order is\n  rocsparse_spgemm_buffer_size, rocsparse_spgemm_nnz, rocsparse_spgemm_compute.*/\npub use self::rocsparse_spgemm_stage_ as rocsparse_spgemm_stage;\nimpl rocsparse_spgemm_alg_ {\n    ///< Default SpGEMM algorithm for the given format.\n    pub const rocsparse_spgemm_alg_default: rocsparse_spgemm_alg_ = rocsparse_spgemm_alg_(\n        0,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief List of SpGEMM algorithms.\n\n  \\details\n  This is a list of supported \\ref rocsparse_spgemm_alg types that are used to perform\n  sparse matrix sparse matrix product.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_spgemm_alg_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief List of SpGEMM algorithms.\n\n  \\details\n  This is a list of supported \\ref rocsparse_spgemm_alg types that are used to perform\n  sparse matrix sparse matrix product.*/\npub use self::rocsparse_spgemm_alg_ as rocsparse_spgemm_alg;\nimpl rocsparse_gpsv_interleaved_alg_ {\n    ///< Default gpsv algorithm.\n    pub const rocsparse_gpsv_interleaved_alg_default: rocsparse_gpsv_interleaved_alg_ = rocsparse_gpsv_interleaved_alg_(\n        0,\n    );\n}\nimpl rocsparse_gpsv_interleaved_alg_ {\n    ///< QR algorithm\n    pub const rocsparse_gpsv_interleaved_alg_qr: rocsparse_gpsv_interleaved_alg_ = rocsparse_gpsv_interleaved_alg_(\n        1,\n    );\n}\n#[repr(transparent)]\n/** \\ingroup types_module\n  \\brief List of gpsv algorithms.\n\n  \\details\n  This is a list of supported \\ref rocsparse_gpsv_interleaved_alg types that are used to solve\n  pentadiagonal linear systems.*/\n#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]\npub struct rocsparse_gpsv_interleaved_alg_(pub ::core::ffi::c_uint);\n/** \\ingroup types_module\n  \\brief List of gpsv algorithms.\n\n  \\details\n  This is a list of supported \\ref rocsparse_gpsv_interleaved_alg types that are used to solve\n  pentadiagonal linear systems.*/\npub use self::rocsparse_gpsv_interleaved_alg_ as rocsparse_gpsv_interleaved_alg;\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Create a rocsparse handle\n\n  \\details\n  \\p rocsparse_create_handle creates the rocSPARSE library context. It must be\n  initialized before any other rocSPARSE API function is invoked and must be passed to\n  all subsequent library function calls. The handle should be destroyed at the end\n  using rocsparse_destroy_handle().\n\n  @param[out]\n  handle  the pointer to the handle to the rocSPARSE library context.\n\n  \\retval rocsparse_status_success the initialization succeeded.\n  \\retval rocsparse_status_invalid_handle \\p handle pointer is invalid.\n  \\retval rocsparse_status_internal_error an internal error occurred.*/\n    pub fn rocsparse_create_handle(handle: *mut rocsparse_handle) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Destroy a rocsparse handle\n\n  \\details\n  \\p rocsparse_destroy_handle destroys the rocSPARSE library context and releases all\n  resources used by the rocSPARSE library.\n\n  @param[in]\n  handle  the handle to the rocSPARSE library context.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_handle \\p handle is invalid.\n  \\retval rocsparse_status_internal_error an internal error occurred.*/\n    pub fn rocsparse_destroy_handle(handle: rocsparse_handle) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    /** \\ingroup aux_module\n  \\brief Return the string representation of a rocSPARSE status code enum name\n\n  \\details\n  \\p rocsparse_get_status_name takes a rocSPARSE status as input and returns the string representation of this status.\n  If the status is not recognized, the function returns \"Unrecognized status code\"\n\n  @param[in]\n  status  a rocSPARSE status\n\n  \\retval pointer to null terminated string*/\n    pub fn rocsparse_get_status_name(\n        status: rocsparse_status,\n    ) -> *const ::core::ffi::c_char;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    /** \\ingroup aux_module\n  \\brief Return the rocSPARSE status code description as a string\n\n  \\details\n  \\p rocsparse_get_status_description takes a rocSPARSE status as input and returns the status description as a string.\n  If the status is not recognized, the function returns \"Unrecognized status code\"\n\n  @param[in]\n  status  a rocSPARSE status\n\n  \\retval pointer to null terminated string*/\n    pub fn rocsparse_get_status_description(\n        status: rocsparse_status,\n    ) -> *const ::core::ffi::c_char;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Specify user defined HIP stream\n\n  \\details\n  \\p rocsparse_set_stream specifies the stream to be used by the rocSPARSE library\n  context and all subsequent function calls.\n\n  @param[inout]\n  handle  the handle to the rocSPARSE library context.\n  @param[in]\n  stream  the stream to be used by the rocSPARSE library context.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_handle \\p handle is invalid.\n\n  \\par Example\n  This example illustrates, how a user defined stream can be used in rocSPARSE.\n  \\code{.c}\n      // Create rocSPARSE handle\n      rocsparse_handle handle;\n      rocsparse_create_handle(&handle);\n\n      // Create stream\n      hip_runtime_sys::hipStream_t stream;\n      hipStreamCreate(&stream);\n\n      // Set stream to rocSPARSE handle\n      rocsparse_set_stream(handle, stream);\n\n      // Do some work\n      // ...\n\n      // Clean up\n      rocsparse_destroy_handle(handle);\n      hipStreamDestroy(stream);\n  \\endcode*/\n    pub fn rocsparse_set_stream(\n        handle: rocsparse_handle,\n        stream: hip_runtime_sys::hipStream_t,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Get current stream from library context\n\n  \\details\n  \\p rocsparse_get_stream gets the rocSPARSE library context stream which is currently\n  used for all subsequent function calls.\n\n  @param[in]\n  handle the handle to the rocSPARSE library context.\n  @param[out]\n  stream the stream currently used by the rocSPARSE library context.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_handle \\p handle is invalid.*/\n    pub fn rocsparse_get_stream(\n        handle: rocsparse_handle,\n        stream: *mut hip_runtime_sys::hipStream_t,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Specify pointer mode\n\n  \\details\n  \\p rocsparse_set_pointer_mode specifies the pointer mode to be used by the rocSPARSE\n  library context and all subsequent function calls. By default, all values are passed\n  by reference on the host. Valid pointer modes are \\ref rocsparse_pointer_mode_host\n  or \\p rocsparse_pointer_mode_device.\n\n  @param[in]\n  handle          the handle to the rocSPARSE library context.\n  @param[in]\n  pointer_mode    the pointer mode to be used by the rocSPARSE library context.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_handle \\p handle is invalid.*/\n    pub fn rocsparse_set_pointer_mode(\n        handle: rocsparse_handle,\n        pointer_mode: rocsparse_pointer_mode,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Get current pointer mode from library context\n\n  \\details\n  \\p rocsparse_get_pointer_mode gets the rocSPARSE library context pointer mode which\n  is currently used for all subsequent function calls.\n\n  @param[in]\n  handle          the handle to the rocSPARSE library context.\n  @param[out]\n  pointer_mode    the pointer mode that is currently used by the rocSPARSE library\n                  context.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_handle \\p handle is invalid.*/\n    pub fn rocsparse_get_pointer_mode(\n        handle: rocsparse_handle,\n        pointer_mode: *mut rocsparse_pointer_mode,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Get rocSPARSE version\n\n  \\details\n  \\p rocsparse_get_version gets the rocSPARSE library version number.\n  - patch = version % 100\n  - minor = version / 100 % 1000\n  - major = version / 100000\n\n  @param[in]\n  handle  the handle to the rocSPARSE library context.\n  @param[out]\n  version the version number of the rocSPARSE library.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_handle \\p handle is invalid.*/\n    pub fn rocsparse_get_version(\n        handle: rocsparse_handle,\n        version: *mut ::core::ffi::c_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Get rocSPARSE git revision\n\n  \\details\n  \\p rocsparse_get_git_rev gets the rocSPARSE library git commit revision (SHA-1).\n\n  @param[in]\n  handle  the handle to the rocSPARSE library context.\n  @param[out]\n  rev     the git commit revision (SHA-1).\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_handle \\p handle is invalid.*/\n    pub fn rocsparse_get_git_rev(\n        handle: rocsparse_handle,\n        rev: *mut ::core::ffi::c_char,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Create a matrix descriptor\n  \\details\n  \\p rocsparse_create_mat_descr creates a matrix descriptor. It initializes\n  \\ref rocsparse_matrix_type to \\ref rocsparse_matrix_type_general and\n  \\ref rocsparse_index_base to \\ref rocsparse_index_base_zero. It should be destroyed\n  at the end using rocsparse_destroy_mat_descr().\n\n  @param[out]\n  descr   the pointer to the matrix descriptor.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer \\p descr pointer is invalid.*/\n    pub fn rocsparse_create_mat_descr(\n        descr: *mut rocsparse_mat_descr,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Copy a matrix descriptor\n  \\details\n  \\p rocsparse_copy_mat_descr copies a matrix descriptor. Both, source and destination\n  matrix descriptors must be initialized prior to calling \\p rocsparse_copy_mat_descr.\n\n  @param[out]\n  dest    the pointer to the destination matrix descriptor.\n  @param[in]\n  src     the pointer to the source matrix descriptor.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer \\p src or \\p dest pointer is invalid.*/\n    pub fn rocsparse_copy_mat_descr(\n        dest: rocsparse_mat_descr,\n        src: rocsparse_mat_descr,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Destroy a matrix descriptor\n\n  \\details\n  \\p rocsparse_destroy_mat_descr destroys a matrix descriptor and releases all\n  resources used by the descriptor.\n\n  @param[in]\n  descr   the matrix descriptor.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer \\p descr is invalid.*/\n    pub fn rocsparse_destroy_mat_descr(descr: rocsparse_mat_descr) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Specify the index base of a matrix descriptor\n\n  \\details\n  \\p rocsparse_set_mat_index_base sets the index base of a matrix descriptor. Valid\n  options are \\ref rocsparse_index_base_zero or \\ref rocsparse_index_base_one.\n\n  @param[inout]\n  descr   the matrix descriptor.\n  @param[in]\n  base    \\ref rocsparse_index_base_zero or \\ref rocsparse_index_base_one.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer \\p descr pointer is invalid.\n  \\retval rocsparse_status_invalid_value \\p base is invalid.*/\n    pub fn rocsparse_set_mat_index_base(\n        descr: rocsparse_mat_descr,\n        base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    /** \\ingroup aux_module\n  \\brief Get the index base of a matrix descriptor\n\n  \\details\n  \\p rocsparse_get_mat_index_base returns the index base of a matrix descriptor.\n\n  @param[in]\n  descr   the matrix descriptor.\n\n  \\returns \\ref rocsparse_index_base_zero or \\ref rocsparse_index_base_one.*/\n    pub fn rocsparse_get_mat_index_base(\n        descr: rocsparse_mat_descr,\n    ) -> rocsparse_index_base;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Specify the matrix type of a matrix descriptor\n\n  \\details\n  \\p rocsparse_set_mat_type sets the matrix type of a matrix descriptor. Valid\n  matrix types are \\ref rocsparse_matrix_type_general,\n  \\ref rocsparse_matrix_type_symmetric, \\ref rocsparse_matrix_type_hermitian or\n  \\ref rocsparse_matrix_type_triangular.\n\n  @param[inout]\n  descr   the matrix descriptor.\n  @param[in]\n  type    \\ref rocsparse_matrix_type_general, \\ref rocsparse_matrix_type_symmetric,\n          \\ref rocsparse_matrix_type_hermitian or\n          \\ref rocsparse_matrix_type_triangular.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer \\p descr pointer is invalid.\n  \\retval rocsparse_status_invalid_value \\p type is invalid.*/\n    pub fn rocsparse_set_mat_type(\n        descr: rocsparse_mat_descr,\n        type_: rocsparse_matrix_type,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    /** \\ingroup aux_module\n  \\brief Get the matrix type of a matrix descriptor\n\n  \\details\n  \\p rocsparse_get_mat_type returns the matrix type of a matrix descriptor.\n\n  @param[in]\n  descr   the matrix descriptor.\n\n  \\returns    \\ref rocsparse_matrix_type_general, \\ref rocsparse_matrix_type_symmetric,\n              \\ref rocsparse_matrix_type_hermitian or\n              \\ref rocsparse_matrix_type_triangular.*/\n    pub fn rocsparse_get_mat_type(descr: rocsparse_mat_descr) -> rocsparse_matrix_type;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Specify the matrix fill mode of a matrix descriptor\n\n  \\details\n  \\p rocsparse_set_mat_fill_mode sets the matrix fill mode of a matrix descriptor.\n  Valid fill modes are \\ref rocsparse_fill_mode_lower or\n  \\ref rocsparse_fill_mode_upper.\n\n  @param[inout]\n  descr       the matrix descriptor.\n  @param[in]\n  fill_mode   \\ref rocsparse_fill_mode_lower or \\ref rocsparse_fill_mode_upper.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer \\p descr pointer is invalid.\n  \\retval rocsparse_status_invalid_value \\p fill_mode is invalid.*/\n    pub fn rocsparse_set_mat_fill_mode(\n        descr: rocsparse_mat_descr,\n        fill_mode: rocsparse_fill_mode,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    /** \\ingroup aux_module\n  \\brief Get the matrix fill mode of a matrix descriptor\n\n  \\details\n  \\p rocsparse_get_mat_fill_mode returns the matrix fill mode of a matrix descriptor.\n\n  @param[in]\n  descr   the matrix descriptor.\n\n  \\returns    \\ref rocsparse_fill_mode_lower or \\ref rocsparse_fill_mode_upper.*/\n    pub fn rocsparse_get_mat_fill_mode(\n        descr: rocsparse_mat_descr,\n    ) -> rocsparse_fill_mode;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Specify the matrix diagonal type of a matrix descriptor\n\n  \\details\n  \\p rocsparse_set_mat_diag_type sets the matrix diagonal type of a matrix\n  descriptor. Valid diagonal types are \\ref rocsparse_diag_type_unit or\n  \\ref rocsparse_diag_type_non_unit.\n\n  @param[inout]\n  descr       the matrix descriptor.\n  @param[in]\n  diag_type   \\ref rocsparse_diag_type_unit or \\ref rocsparse_diag_type_non_unit.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer \\p descr pointer is invalid.\n  \\retval rocsparse_status_invalid_value \\p diag_type is invalid.*/\n    pub fn rocsparse_set_mat_diag_type(\n        descr: rocsparse_mat_descr,\n        diag_type: rocsparse_diag_type,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    /** \\ingroup aux_module\n  \\brief Get the matrix diagonal type of a matrix descriptor\n\n  \\details\n  \\p rocsparse_get_mat_diag_type returns the matrix diagonal type of a matrix\n  descriptor.\n\n  @param[in]\n  descr   the matrix descriptor.\n\n  \\returns \\ref rocsparse_diag_type_unit or \\ref rocsparse_diag_type_non_unit.*/\n    pub fn rocsparse_get_mat_diag_type(\n        descr: rocsparse_mat_descr,\n    ) -> rocsparse_diag_type;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Specify the matrix storage mode of a matrix descriptor\n\n  \\details\n  \\p rocsparse_set_mat_storage_mode sets the matrix storage mode of a matrix descriptor.\n  Valid fill modes are \\ref rocsparse_storage_mode_sorted or\n  \\ref rocsparse_storage_mode_unsorted.\n\n  @param[inout]\n  descr           the matrix descriptor.\n  @param[in]\n  storage_mode    \\ref rocsparse_storage_mode_sorted or\n                  \\ref rocsparse_storage_mode_unsorted.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer \\p descr pointer is invalid.\n  \\retval rocsparse_status_invalid_value \\p storage_mode is invalid.*/\n    pub fn rocsparse_set_mat_storage_mode(\n        descr: rocsparse_mat_descr,\n        storage_mode: rocsparse_storage_mode,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    /** \\ingroup aux_module\n  \\brief Get the matrix storage mode of a matrix descriptor\n\n  \\details\n  \\p rocsparse_get_mat_storage_mode returns the matrix storage mode of a matrix descriptor.\n\n  @param[in]\n  descr   the matrix descriptor.\n\n  \\returns    \\ref rocsparse_storage_mode_sorted or \\ref rocsparse_storage_mode_unsorted.*/\n    pub fn rocsparse_get_mat_storage_mode(\n        descr: rocsparse_mat_descr,\n    ) -> rocsparse_storage_mode;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Create a \\p HYB matrix structure\n\n  \\details\n  \\p rocsparse_create_hyb_mat creates a structure that holds the matrix in \\p HYB\n  storage format. It should be destroyed at the end using rocsparse_destroy_hyb_mat().\n\n  @param[inout]\n  hyb the pointer to the hybrid matrix.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer \\p hyb pointer is invalid.*/\n    pub fn rocsparse_create_hyb_mat(hyb: *mut rocsparse_hyb_mat) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Copy a \\p HYB matrix structure\n\n  \\details\n  \\p rocsparse_copy_hyb_mat copies a matrix info structure. Both, source and destination\n  matrix info structure must be initialized prior to calling \\p rocsparse_copy_hyb_mat.\n\n  @param[out]\n  dest    the pointer to the destination matrix info structure.\n  @param[in]\n  src     the pointer to the source matrix info structure.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer \\p hyb pointer is invalid.*/\n    pub fn rocsparse_copy_hyb_mat(\n        dest: rocsparse_hyb_mat,\n        src: rocsparse_hyb_mat,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Destroy a \\p HYB matrix structure\n\n  \\details\n  \\p rocsparse_destroy_hyb_mat destroys a \\p HYB structure.\n\n  @param[in]\n  hyb the hybrid matrix structure.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer \\p hyb pointer is invalid.\n  \\retval rocsparse_status_internal_error an internal error occurred.*/\n    pub fn rocsparse_destroy_hyb_mat(hyb: rocsparse_hyb_mat) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Create a matrix info structure\n\n  \\details\n  \\p rocsparse_create_mat_info creates a structure that holds the matrix info data\n  that is gathered during the analysis routines available. It should be destroyed\n  at the end using rocsparse_destroy_mat_info().\n\n  @param[inout]\n  info    the pointer to the info structure.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer \\p info pointer is invalid.*/\n    pub fn rocsparse_create_mat_info(info: *mut rocsparse_mat_info) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Copy a matrix info structure\n  \\details\n  \\p rocsparse_copy_mat_info copies a matrix info structure. Both, source and destination\n  matrix info structure must be initialized prior to calling \\p rocsparse_copy_mat_info.\n\n  @param[out]\n  dest    the pointer to the destination matrix info structure.\n  @param[in]\n  src     the pointer to the source matrix info structure.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer \\p src or \\p dest pointer is invalid.*/\n    pub fn rocsparse_copy_mat_info(\n        dest: rocsparse_mat_info,\n        src: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Destroy a matrix info structure\n\n  \\details\n  \\p rocsparse_destroy_mat_info destroys a matrix info structure.\n\n  @param[in]\n  info    the info structure.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer \\p info pointer is invalid.\n  \\retval rocsparse_status_internal_error an internal error occurred.*/\n    pub fn rocsparse_destroy_mat_info(info: rocsparse_mat_info) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Create a color info structure\n\n  \\details\n  \\p rocsparse_create_color_info creates a structure that holds the color info data\n  that is gathered during the analysis routines available. It should be destroyed\n  at the end using rocsparse_destroy_color_info().\n\n  @param[inout]\n  info    the pointer to the info structure.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer \\p info pointer is invalid.*/\n    pub fn rocsparse_create_color_info(\n        info: *mut rocsparse_color_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Copy a color info structure\n  \\details\n  \\p rocsparse_copy_color_info copies a color info structure. Both, source and destination\n  color info structure must be initialized prior to calling \\p rocsparse_copy_color_info.\n\n  @param[out]\n  dest    the pointer to the destination color info structure.\n  @param[in]\n  src     the pointer to the source color info structure.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer \\p src or \\p dest pointer is invalid.*/\n    pub fn rocsparse_copy_color_info(\n        dest: rocsparse_color_info,\n        src: rocsparse_color_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Destroy a color info structure\n\n  \\details\n  \\p rocsparse_destroy_color_info destroys a color info structure.\n\n  @param[in]\n  info    the info structure.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer \\p info pointer is invalid.\n  \\retval rocsparse_status_internal_error an internal error occurred.*/\n    pub fn rocsparse_destroy_color_info(info: rocsparse_color_info) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup aux_module\\n  \\\\brief Create a sparse vector descriptor\\n  \\\\details\\n  \\\\p rocsparse_create_spvec_descr creates a sparse vector descriptor. It should be\\n  destroyed at the end using rocsparse_destroy_mat_descr().\\n\\n  @param[out]\\n  descr   the pointer to the sparse vector descriptor.\\n  @param[in]\\n  size   size of the sparse vector.\\n  @param[in]\\n  nnz   number of non-zeros in sparse vector.\\n  @param[in]\\n  indices   indices of the sparse vector where non-zeros occur (must be array of length \\\\p nnz ).\\n  @param[in]\\n  values   non-zero values in the sparse vector (must be array of length \\\\p nnz ).\\n  @param[in]\\n  idx_type   \\\\ref rocsparse_indextype_i32 or \\\\ref rocsparse_indextype_i64.\\n  @param[in]\\n  idx_base   \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n  @param[in]\\n  data_type   \\\\ref rocsparse_datatype_f32_r, \\\\ref rocsparse_datatype_f64_r,\\n              \\\\ref rocsparse_datatype_f32_c or \\\\ref rocsparse_datatype_f64_c.\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_pointer if \\\\p descr or \\\\p indices or \\\\p values is invalid.\\n  \\\\retval rocsparse_status_invalid_size if \\\\p size or \\\\p nnz is invalid.\\n  \\\\retval rocsparse_status_invalid_value if \\\\p idx_type or \\\\p idx_base or \\\\p data_type is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_create_spvec_descr(\n        descr: *mut rocsparse_spvec_descr,\n        size: i64,\n        nnz: i64,\n        indices: *mut ::core::ffi::c_void,\n        values: *mut ::core::ffi::c_void,\n        idx_type: rocsparse_indextype,\n        idx_base: rocsparse_index_base,\n        data_type: rocsparse_datatype,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_create_const_spvec_descr(\n        descr: *mut rocsparse_const_spvec_descr,\n        size: i64,\n        nnz: i64,\n        indices: *const ::core::ffi::c_void,\n        values: *const ::core::ffi::c_void,\n        idx_type: rocsparse_indextype,\n        idx_base: rocsparse_index_base,\n        data_type: rocsparse_datatype,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Destroy a sparse vector descriptor\n\n  \\details\n  \\p rocsparse_destroy_spvec_descr destroys a sparse vector descriptor and releases all\n  resources used by the descriptor.\n\n  @param[in]\n  descr   the matrix descriptor.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer \\p descr is invalid.*/\n    pub fn rocsparse_destroy_spvec_descr(\n        descr: rocsparse_const_spvec_descr,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup aux_module\\n  \\\\brief Get the fields of the sparse vector descriptor\\n  \\\\details\\n  \\\\p rocsparse_spvec_get gets the fields of the sparse vector descriptor\\n\\n  @param[in]\\n  descr   the pointer to the sparse vector descriptor.\\n  @param[out]\\n  size   size of the sparse vector.\\n  @param[out]\\n  nnz   number of non-zeros in sparse vector.\\n  @param[out]\\n  indices   indices of the sparse vector where non-zeros occur (must be array of length \\\\p nnz ).\\n  @param[out]\\n  values   non-zero values in the sparse vector (must be array of length \\\\p nnz ).\\n  @param[out]\\n  idx_type   \\\\ref rocsparse_indextype_i32 or \\\\ref rocsparse_indextype_i64.\\n  @param[out]\\n  idx_base   \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n  @param[out]\\n  data_type   \\\\ref rocsparse_datatype_f32_r, \\\\ref rocsparse_datatype_f64_r,\\n              \\\\ref rocsparse_datatype_f32_c or \\\\ref rocsparse_datatype_f64_c.\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_pointer if \\\\p descr or \\\\p indices or \\\\p values is invalid.\\n  \\\\retval rocsparse_status_invalid_size if \\\\p size or \\\\p nnz is invalid.\\n  \\\\retval rocsparse_status_invalid_value if \\\\p idx_type or \\\\p idx_base or \\\\p data_type is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_spvec_get(\n        descr: rocsparse_spvec_descr,\n        size: *mut i64,\n        nnz: *mut i64,\n        indices: *mut *mut ::core::ffi::c_void,\n        values: *mut *mut ::core::ffi::c_void,\n        idx_type: *mut rocsparse_indextype,\n        idx_base: *mut rocsparse_index_base,\n        data_type: *mut rocsparse_datatype,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_const_spvec_get(\n        descr: rocsparse_const_spvec_descr,\n        size: *mut i64,\n        nnz: *mut i64,\n        indices: *mut *const ::core::ffi::c_void,\n        values: *mut *const ::core::ffi::c_void,\n        idx_type: *mut rocsparse_indextype,\n        idx_base: *mut rocsparse_index_base,\n        data_type: *mut rocsparse_datatype,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Get the index base stored in the sparse vector descriptor\n\n  @param[in]\n  descr   the pointer to the sparse vector descriptor.\n  @param[out]\n  idx_base   \\ref rocsparse_index_base_zero or \\ref rocsparse_index_base_one.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer if \\p descr is invalid.\n  \\retval rocsparse_status_invalid_value if \\p idx_base is invalid.*/\n    pub fn rocsparse_spvec_get_index_base(\n        descr: rocsparse_const_spvec_descr,\n        idx_base: *mut rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup aux_module\\n  \\\\brief Get the values array stored in the sparse vector descriptor\\n\\n  @param[in]\\n  descr   the pointer to the sparse vector descriptor.\\n  @param[out]\\n  values   non-zero values in the sparse vector (must be array of length \\\\p nnz ).\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_pointer if \\\\p descr or \\\\p values is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_spvec_get_values(\n        descr: rocsparse_spvec_descr,\n        values: *mut *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_const_spvec_get_values(\n        descr: rocsparse_const_spvec_descr,\n        values: *mut *const ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Set the values array in the sparse vector descriptor\n\n  @param[inout]\n  descr   the pointer to the sparse vector descriptor.\n  @param[in]\n  values   non-zero values in the sparse vector (must be array of length \\p nnz ).\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer if \\p descr or \\p values is invalid.*/\n    pub fn rocsparse_spvec_set_values(\n        descr: rocsparse_spvec_descr,\n        values: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup aux_module\\n  \\\\brief Create a sparse COO matrix descriptor\\n  \\\\details\\n  \\\\p rocsparse_create_coo_descr creates a sparse COO matrix descriptor. It should be\\n  destroyed at the end using \\\\p rocsparse_destroy_spmat_descr.\\n\\n  @param[out]\\n  descr       the pointer to the sparse COO matrix descriptor.\\n  @param[in]\\n  rows        number of rows in the COO matrix.\\n  @param[in]\\n  cols        number of columns in the COO matrix\\n  @param[in]\\n  nnz         number of non-zeros in the COO matrix.\\n  @param[in]\\n  coo_row_ind row indices of the COO matrix (must be array of length \\\\p nnz ).\\n  @param[in]\\n  coo_col_ind column indices of the COO matrix (must be array of length \\\\p nnz ).\\n  @param[in]\\n  coo_val     values of the COO matrix (must be array of length \\\\p nnz ).\\n  @param[in]\\n  idx_type    \\\\ref rocsparse_indextype_i32 or \\\\ref rocsparse_indextype_i64.\\n  @param[in]\\n  idx_base    \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n  @param[in]\\n  data_type   \\\\ref rocsparse_datatype_f32_r, \\\\ref rocsparse_datatype_f64_r,\\n              \\\\ref rocsparse_datatype_f32_c or \\\\ref rocsparse_datatype_f64_c.\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_pointer if \\\\p descr or \\\\p coo_row_ind or \\\\p coo_col_ind or \\\\p coo_val is invalid.\\n  \\\\retval rocsparse_status_invalid_size if \\\\p rows or \\\\p cols or \\\\p nnz is invalid.\\n  \\\\retval rocsparse_status_invalid_value if \\\\p idx_type or \\\\p idx_base or \\\\p data_type is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_create_coo_descr(\n        descr: *mut rocsparse_spmat_descr,\n        rows: i64,\n        cols: i64,\n        nnz: i64,\n        coo_row_ind: *mut ::core::ffi::c_void,\n        coo_col_ind: *mut ::core::ffi::c_void,\n        coo_val: *mut ::core::ffi::c_void,\n        idx_type: rocsparse_indextype,\n        idx_base: rocsparse_index_base,\n        data_type: rocsparse_datatype,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_create_const_coo_descr(\n        descr: *mut rocsparse_const_spmat_descr,\n        rows: i64,\n        cols: i64,\n        nnz: i64,\n        coo_row_ind: *const ::core::ffi::c_void,\n        coo_col_ind: *const ::core::ffi::c_void,\n        coo_val: *const ::core::ffi::c_void,\n        idx_type: rocsparse_indextype,\n        idx_base: rocsparse_index_base,\n        data_type: rocsparse_datatype,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Create a sparse COO AoS matrix descriptor\n  \\details\n  \\p rocsparse_create_coo_aos_descr creates a sparse COO AoS matrix descriptor. It should be\n  destroyed at the end using \\p rocsparse_destroy_spmat_descr.\n\n  @param[out]\n  descr       the pointer to the sparse COO AoS matrix descriptor.\n  @param[in]\n  rows        number of rows in the COO AoS matrix.\n  @param[in]\n  cols        number of columns in the COO AoS matrix\n  @param[in]\n  nnz         number of non-zeros in the COO AoS matrix.\n  @param[in]\n  coo_ind     <row, column> indices of the COO AoS matrix (must be array of length \\p nnz ).\n  @param[in]\n  coo_val     values of the COO AoS matrix (must be array of length \\p nnz ).\n  @param[in]\n  idx_type    \\ref rocsparse_indextype_i32 or \\ref rocsparse_indextype_i64.\n  @param[in]\n  idx_base    \\ref rocsparse_index_base_zero or \\ref rocsparse_index_base_one.\n  @param[in]\n  data_type   \\ref rocsparse_datatype_f32_r, \\ref rocsparse_datatype_f64_r,\n              \\ref rocsparse_datatype_f32_c or \\ref rocsparse_datatype_f64_c.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer if \\p descr or \\p coo_ind or \\p coo_val is invalid.\n  \\retval rocsparse_status_invalid_size if \\p rows or \\p cols or \\p nnz is invalid.\n  \\retval rocsparse_status_invalid_value if \\p idx_type or \\p idx_base or \\p data_type is invalid.*/\n    pub fn rocsparse_create_coo_aos_descr(\n        descr: *mut rocsparse_spmat_descr,\n        rows: i64,\n        cols: i64,\n        nnz: i64,\n        coo_ind: *mut ::core::ffi::c_void,\n        coo_val: *mut ::core::ffi::c_void,\n        idx_type: rocsparse_indextype,\n        idx_base: rocsparse_index_base,\n        data_type: rocsparse_datatype,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Create a sparse BSR matrix descriptor\n  \\details\n  \\p rocsparse_create_bsr_descr creates a sparse BSR matrix descriptor. It should be\n  destroyed at the end using \\p rocsparse_destroy_spmat_descr.\n\n  @param[out]\n  descr        the pointer to the sparse BSR matrix descriptor.\n  @param[in]\n  mb           number of rows in the BSR matrix.\n  @param[in]\n  nb           number of columns in the BSR matrix\n  @param[in]\n  nnzb         number of non-zeros in the BSR matrix.\n  @param[in]\n  block_dir    direction of the internal block storage.\n  @param[in]\n  block_dim    dimension of the blocks.\n  @param[in]\n  bsr_row_ptr  row offsets of the BSR matrix (must be array of length \\p mb+1 ).\n  @param[in]\n  bsr_col_ind  column indices of the BSR matrix (must be array of length \\p nnzb ).\n  @param[in]\n  bsr_val      values of the BSR matrix (must be array of length \\p nnzb * \\p block_dim * \\p block_dim ).\n  @param[in]\n  row_ptr_type \\ref rocsparse_indextype_i32 or \\ref rocsparse_indextype_i64.\n  @param[in]\n  col_ind_type \\ref rocsparse_indextype_i32 or \\ref rocsparse_indextype_i64.\n  @param[in]\n  idx_base     \\ref rocsparse_index_base_zero or \\ref rocsparse_index_base_one.\n  @param[in]\n  data_type    \\ref rocsparse_datatype_f32_r, \\ref rocsparse_datatype_f64_r,\n               \\ref rocsparse_datatype_f32_c or \\ref rocsparse_datatype_f64_c.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer if \\p descr or \\p bsr_row_ptr or \\p bsr_col_ind or \\p bsr_val is invalid.\n  \\retval rocsparse_status_invalid_size if \\p mb or \\p nb or \\p nnzb \\p block_dim is invalid.\n  \\retval rocsparse_status_invalid_value if \\p row_ptr_type or \\p col_ind_type or \\p idx_base or \\p data_type or \\p block_dir is invalid.*/\n    pub fn rocsparse_create_bsr_descr(\n        descr: *mut rocsparse_spmat_descr,\n        mb: i64,\n        nb: i64,\n        nnzb: i64,\n        block_dir: rocsparse_direction,\n        block_dim: i64,\n        bsr_row_ptr: *mut ::core::ffi::c_void,\n        bsr_col_ind: *mut ::core::ffi::c_void,\n        bsr_val: *mut ::core::ffi::c_void,\n        row_ptr_type: rocsparse_indextype,\n        col_ind_type: rocsparse_indextype,\n        idx_base: rocsparse_index_base,\n        data_type: rocsparse_datatype,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup aux_module\\n  \\\\brief Create a sparse CSR matrix descriptor\\n  \\\\details\\n  \\\\p rocsparse_create_csr_descr creates a sparse CSR matrix descriptor. It should be\\n  destroyed at the end using \\\\p rocsparse_destroy_spmat_descr.\\n\\n  @param[out]\\n  descr        the pointer to the sparse CSR matrix descriptor.\\n  @param[in]\\n  rows         number of rows in the CSR matrix.\\n  @param[in]\\n  cols         number of columns in the CSR matrix\\n  @param[in]\\n  nnz          number of non-zeros in the CSR matrix.\\n  @param[in]\\n  csr_row_ptr  row offsets of the CSR matrix (must be array of length \\\\p rows+1 ).\\n  @param[in]\\n  csr_col_ind  column indices of the CSR matrix (must be array of length \\\\p nnz ).\\n  @param[in]\\n  csr_val      values of the CSR matrix (must be array of length \\\\p nnz ).\\n  @param[in]\\n  row_ptr_type \\\\ref rocsparse_indextype_i32 or \\\\ref rocsparse_indextype_i64.\\n  @param[in]\\n  col_ind_type \\\\ref rocsparse_indextype_i32 or \\\\ref rocsparse_indextype_i64.\\n  @param[in]\\n  idx_base     \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n  @param[in]\\n  data_type    \\\\ref rocsparse_datatype_f32_r, \\\\ref rocsparse_datatype_f64_r,\\n               \\\\ref rocsparse_datatype_f32_c or \\\\ref rocsparse_datatype_f64_c.\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_pointer if \\\\p descr or \\\\p csr_row_ptr or \\\\p csr_col_ind or \\\\p csr_val is invalid.\\n  \\\\retval rocsparse_status_invalid_size if \\\\p rows or \\\\p cols or \\\\p nnz is invalid.\\n  \\\\retval rocsparse_status_invalid_value if \\\\p row_ptr_type or \\\\p col_ind_type or \\\\p idx_base or \\\\p data_type is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_create_csr_descr(\n        descr: *mut rocsparse_spmat_descr,\n        rows: i64,\n        cols: i64,\n        nnz: i64,\n        csr_row_ptr: *mut ::core::ffi::c_void,\n        csr_col_ind: *mut ::core::ffi::c_void,\n        csr_val: *mut ::core::ffi::c_void,\n        row_ptr_type: rocsparse_indextype,\n        col_ind_type: rocsparse_indextype,\n        idx_base: rocsparse_index_base,\n        data_type: rocsparse_datatype,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_create_const_csr_descr(\n        descr: *mut rocsparse_const_spmat_descr,\n        rows: i64,\n        cols: i64,\n        nnz: i64,\n        csr_row_ptr: *const ::core::ffi::c_void,\n        csr_col_ind: *const ::core::ffi::c_void,\n        csr_val: *const ::core::ffi::c_void,\n        row_ptr_type: rocsparse_indextype,\n        col_ind_type: rocsparse_indextype,\n        idx_base: rocsparse_index_base,\n        data_type: rocsparse_datatype,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup aux_module\\n  \\\\brief Create a sparse CSC matrix descriptor\\n  \\\\details\\n  \\\\p rocsparse_create_csc_descr creates a sparse CSC matrix descriptor. It should be\\n  destroyed at the end using \\\\p rocsparse_destroy_spmat_descr.\\n\\n  @param[out]\\n  descr       the pointer to the sparse CSC matrix descriptor.\\n  @param[in]\\n  rows         number of rows in the CSC matrix.\\n  @param[in]\\n  cols         number of columns in the CSC matrix\\n  @param[in]\\n  nnz          number of non-zeros in the CSC matrix.\\n  @param[in]\\n  csc_col_ptr  column offsets of the CSC matrix (must be array of length \\\\p cols+1 ).\\n  @param[in]\\n  csc_row_ind  row indices of the CSC matrix (must be array of length \\\\p nnz ).\\n  @param[in]\\n  csc_val      values of the CSC matrix (must be array of length \\\\p nnz ).\\n  @param[in]\\n  col_ptr_type \\\\ref rocsparse_indextype_i32 or \\\\ref rocsparse_indextype_i64.\\n  @param[in]\\n  row_ind_type \\\\ref rocsparse_indextype_i32 or \\\\ref rocsparse_indextype_i64.\\n  @param[in]\\n  idx_base     \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n  @param[in]\\n  data_type    \\\\ref rocsparse_datatype_f32_r, \\\\ref rocsparse_datatype_f64_r,\\n               \\\\ref rocsparse_datatype_f32_c or \\\\ref rocsparse_datatype_f64_c.\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_pointer if \\\\p descr or \\\\p csc_col_ptr or \\\\p csc_row_ind or \\\\p csc_val is invalid.\\n  \\\\retval rocsparse_status_invalid_size if \\\\p rows or \\\\p cols or \\\\p nnz is invalid.\\n  \\\\retval rocsparse_status_invalid_value if \\\\p col_ptr_type or \\\\p row_ind_type or \\\\p idx_base or \\\\p data_type is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_create_csc_descr(\n        descr: *mut rocsparse_spmat_descr,\n        rows: i64,\n        cols: i64,\n        nnz: i64,\n        csc_col_ptr: *mut ::core::ffi::c_void,\n        csc_row_ind: *mut ::core::ffi::c_void,\n        csc_val: *mut ::core::ffi::c_void,\n        col_ptr_type: rocsparse_indextype,\n        row_ind_type: rocsparse_indextype,\n        idx_base: rocsparse_index_base,\n        data_type: rocsparse_datatype,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_create_const_csc_descr(\n        descr: *mut rocsparse_const_spmat_descr,\n        rows: i64,\n        cols: i64,\n        nnz: i64,\n        csc_col_ptr: *const ::core::ffi::c_void,\n        csc_row_ind: *const ::core::ffi::c_void,\n        csc_val: *const ::core::ffi::c_void,\n        col_ptr_type: rocsparse_indextype,\n        row_ind_type: rocsparse_indextype,\n        idx_base: rocsparse_index_base,\n        data_type: rocsparse_datatype,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Create a sparse ELL matrix descriptor\n  \\details\n  \\p rocsparse_create_ell_descr creates a sparse ELL matrix descriptor. It should be\n  destroyed at the end using \\p rocsparse_destroy_spmat_descr.\n\n  @param[out]\n  descr       the pointer to the sparse ELL matrix descriptor.\n  @param[in]\n  rows        number of rows in the ELL matrix.\n  @param[in]\n  cols        number of columns in the ELL matrix\n  @param[in]\n  ell_col_ind column indices of the ELL matrix (must be array of length \\p rows*ell_width ).\n  @param[in]\n  ell_val     values of the ELL matrix (must be array of length \\p rows*ell_width ).\n  @param[in]\n  ell_width   width of the ELL matrix.\n  @param[in]\n  idx_type    \\ref rocsparse_indextype_i32 or \\ref rocsparse_indextype_i64.\n  @param[in]\n  idx_base    \\ref rocsparse_index_base_zero or \\ref rocsparse_index_base_one.\n  @param[in]\n  data_type   \\ref rocsparse_datatype_f32_r, \\ref rocsparse_datatype_f64_r,\n              \\ref rocsparse_datatype_f32_c or \\ref rocsparse_datatype_f64_c.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer if \\p descr or \\p ell_col_ind or \\p ell_val is invalid.\n  \\retval rocsparse_status_invalid_size if \\p rows or \\p cols or \\p ell_width is invalid.\n  \\retval rocsparse_status_invalid_value if \\p idx_type or \\p idx_base or \\p data_type is invalid.*/\n    pub fn rocsparse_create_ell_descr(\n        descr: *mut rocsparse_spmat_descr,\n        rows: i64,\n        cols: i64,\n        ell_col_ind: *mut ::core::ffi::c_void,\n        ell_val: *mut ::core::ffi::c_void,\n        ell_width: i64,\n        idx_type: rocsparse_indextype,\n        idx_base: rocsparse_index_base,\n        data_type: rocsparse_datatype,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup aux_module\\n  \\\\brief Create a sparse blocked ELL matrix descriptor\\n  \\\\details\\n  \\\\p rocsparse_create_bell_descr creates a sparse blocked ELL matrix descriptor. It should be\\n  destroyed at the end using \\\\p rocsparse_destroy_spmat_descr.\\n\\n  @param[out]\\n  descr         the pointer to the sparse blocked ELL matrix descriptor.\\n  @param[in]\\n  rows          number of rows in the blocked ELL matrix.\\n  @param[in]\\n  cols          number of columns in the blocked ELL matrix\\n  @param[in]\\n  ell_block_dir \\\\ref rocsparse_direction_row or \\\\ref rocsparse_direction_column.\\n  @param[in]\\n  ell_block_dim block dimension of the sparse blocked ELL matrix.\\n  @param[in]\\n  ell_cols      column indices of the blocked ELL matrix (must be array of length \\\\p rows*ell_width ).\\n  @param[in]\\n  ell_col_ind   column indices of the blocked ELL matrix (must be array of length \\\\p rows*ell_width ).\\n  @param[in]\\n  ell_val       values of the blocked ELL matrix (must be array of length \\\\p rows*ell_width ).\\n  @param[in]\\n  idx_type      \\\\ref rocsparse_indextype_i32 or \\\\ref rocsparse_indextype_i64.\\n  @param[in]\\n  idx_base      \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n  @param[in]\\n  data_type     \\\\ref rocsparse_datatype_f32_r, \\\\ref rocsparse_datatype_f64_r,\\n                \\\\ref rocsparse_datatype_f32_c or \\\\ref rocsparse_datatype_f64_c.\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_pointer if \\\\p descr or \\\\p ell_cols or \\\\p ell_col_ind or \\\\p ell_val is invalid.\\n  \\\\retval rocsparse_status_invalid_size if \\\\p rows or \\\\p cols is invalid.\\n  \\\\retval rocsparse_status_invalid_value if \\\\p idx_type or \\\\p idx_base or \\\\p data_type is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_create_bell_descr(\n        descr: *mut rocsparse_spmat_descr,\n        rows: i64,\n        cols: i64,\n        ell_block_dir: rocsparse_direction,\n        ell_block_dim: i64,\n        ell_cols: i64,\n        ell_col_ind: *mut ::core::ffi::c_void,\n        ell_val: *mut ::core::ffi::c_void,\n        idx_type: rocsparse_indextype,\n        idx_base: rocsparse_index_base,\n        data_type: rocsparse_datatype,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_create_const_bell_descr(\n        descr: *mut rocsparse_const_spmat_descr,\n        rows: i64,\n        cols: i64,\n        ell_block_dir: rocsparse_direction,\n        ell_block_dim: i64,\n        ell_cols: i64,\n        ell_col_ind: *const ::core::ffi::c_void,\n        ell_val: *const ::core::ffi::c_void,\n        idx_type: rocsparse_indextype,\n        idx_base: rocsparse_index_base,\n        data_type: rocsparse_datatype,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Destroy a sparse matrix descriptor\n\n  \\details\n  \\p rocsparse_destroy_spmat_descr destroys a sparse matrix descriptor and releases all\n  resources used by the descriptor.\n\n  @param[in]\n  descr   the matrix descriptor.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer \\p descr is invalid.*/\n    pub fn rocsparse_destroy_spmat_descr(\n        descr: rocsparse_const_spmat_descr,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup aux_module\\n  \\\\brief Get the fields of the sparse COO matrix descriptor\\n  \\\\details\\n  \\\\p rocsparse_coo_get gets the fields of the sparse COO matrix descriptor\\n\\n  @param[in]\\n  descr       the pointer to the sparse COO matrix descriptor.\\n  @param[out]\\n  rows        number of rows in the sparse COO matrix.\\n  @param[out]\\n  cols        number of columns in the sparse COO matrix.\\n  @param[out]\\n  nnz         number of non-zeros in sparse COO matrix.\\n  @param[out]\\n  coo_row_ind row indices of the COO matrix (must be array of length \\\\p nnz ).\\n  @param[out]\\n  coo_col_ind column indices of the COO matrix (must be array of length \\\\p nnz ).\\n  @param[out]\\n  coo_val     values of the COO matrix (must be array of length \\\\p nnz ).\\n  @param[out]\\n  idx_type    \\\\ref rocsparse_indextype_i32 or \\\\ref rocsparse_indextype_i64.\\n  @param[out]\\n  idx_base    \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n  @param[out]\\n  data_type   \\\\ref rocsparse_datatype_f32_r, \\\\ref rocsparse_datatype_f64_r,\\n              \\\\ref rocsparse_datatype_f32_c or \\\\ref rocsparse_datatype_f64_c.\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_pointer if \\\\p descr or \\\\p coo_row_ind or \\\\p coo_col_ind or \\\\p coo_val is invalid.\\n  \\\\retval rocsparse_status_invalid_size if \\\\p rows or \\\\p cols or \\\\p nnz is invalid.\\n  \\\\retval rocsparse_status_invalid_value if \\\\p idx_type or \\\\p idx_base or \\\\p data_type is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_coo_get(\n        descr: rocsparse_spmat_descr,\n        rows: *mut i64,\n        cols: *mut i64,\n        nnz: *mut i64,\n        coo_row_ind: *mut *mut ::core::ffi::c_void,\n        coo_col_ind: *mut *mut ::core::ffi::c_void,\n        coo_val: *mut *mut ::core::ffi::c_void,\n        idx_type: *mut rocsparse_indextype,\n        idx_base: *mut rocsparse_index_base,\n        data_type: *mut rocsparse_datatype,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_const_coo_get(\n        descr: rocsparse_const_spmat_descr,\n        rows: *mut i64,\n        cols: *mut i64,\n        nnz: *mut i64,\n        coo_row_ind: *mut *const ::core::ffi::c_void,\n        coo_col_ind: *mut *const ::core::ffi::c_void,\n        coo_val: *mut *const ::core::ffi::c_void,\n        idx_type: *mut rocsparse_indextype,\n        idx_base: *mut rocsparse_index_base,\n        data_type: *mut rocsparse_datatype,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Get the fields of the sparse COO AoS matrix descriptor\n  \\details\n  \\p rocsparse_coo_aos_get gets the fields of the sparse COO AoS matrix descriptor\n\n  @param[in]\n  descr       the pointer to the sparse COO AoS matrix descriptor.\n  @param[out]\n  rows        number of rows in the sparse COO AoS matrix.\n  @param[out]\n  cols        number of columns in the sparse COO AoS matrix.\n  @param[out]\n  nnz         number of non-zeros in sparse COO AoS matrix.\n  @param[out]\n  coo_ind     <row, columns> indices of the COO AoS matrix (must be array of length \\p nnz ).\n  @param[out]\n  coo_val     values of the COO AoS matrix (must be array of length \\p nnz ).\n  @param[out]\n  idx_type    \\ref rocsparse_indextype_i32 or \\ref rocsparse_indextype_i64.\n  @param[out]\n  idx_base    \\ref rocsparse_index_base_zero or \\ref rocsparse_index_base_one.\n  @param[out]\n  data_type   \\ref rocsparse_datatype_f32_r, \\ref rocsparse_datatype_f64_r,\n              \\ref rocsparse_datatype_f32_c or \\ref rocsparse_datatype_f64_c.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer if \\p descr or \\p coo_ind or \\p coo_val is invalid.\n  \\retval rocsparse_status_invalid_size if \\p rows or \\p cols or \\p nnz is invalid.\n  \\retval rocsparse_status_invalid_value if \\p idx_type or \\p idx_base or \\p data_type is invalid.*/\n    pub fn rocsparse_coo_aos_get(\n        descr: rocsparse_spmat_descr,\n        rows: *mut i64,\n        cols: *mut i64,\n        nnz: *mut i64,\n        coo_ind: *mut *mut ::core::ffi::c_void,\n        coo_val: *mut *mut ::core::ffi::c_void,\n        idx_type: *mut rocsparse_indextype,\n        idx_base: *mut rocsparse_index_base,\n        data_type: *mut rocsparse_datatype,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup aux_module\\n  \\\\brief Get the fields of the sparse CSR matrix descriptor\\n  \\\\details\\n  \\\\p rocsparse_csr_get gets the fields of the sparse CSR matrix descriptor\\n\\n  @param[in]\\n  descr        the pointer to the sparse CSR matrix descriptor.\\n  @param[out]\\n  rows         number of rows in the CSR matrix.\\n  @param[out]\\n  cols         number of columns in the CSR matrix\\n  @param[out]\\n  nnz          number of non-zeros in the CSR matrix.\\n  @param[out]\\n  csr_row_ptr  row offsets of the CSR matrix (must be array of length \\\\p rows+1 ).\\n  @param[out]\\n  csr_col_ind  column indices of the CSR matrix (must be array of length \\\\p nnz ).\\n  @param[out]\\n  csr_val      values of the CSR matrix (must be array of length \\\\p nnz ).\\n  @param[out]\\n  row_ptr_type \\\\ref rocsparse_indextype_i32 or \\\\ref rocsparse_indextype_i64.\\n  @param[out]\\n  col_ind_type \\\\ref rocsparse_indextype_i32 or \\\\ref rocsparse_indextype_i64.\\n  @param[out]\\n  idx_base     \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n  @param[out]\\n  data_type    \\\\ref rocsparse_datatype_f32_r, \\\\ref rocsparse_datatype_f64_r,\\n               \\\\ref rocsparse_datatype_f32_c or \\\\ref rocsparse_datatype_f64_c.\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_pointer if \\\\p descr or \\\\p csr_row_ptr or \\\\p csr_col_ind or \\\\p csr_val is invalid.\\n  \\\\retval rocsparse_status_invalid_size if \\\\p rows or \\\\p cols or \\\\p nnz is invalid.\\n  \\\\retval rocsparse_status_invalid_value if \\\\p row_ptr_type or \\\\p col_ind_type or \\\\p idx_base or \\\\p data_type is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_csr_get(\n        descr: rocsparse_spmat_descr,\n        rows: *mut i64,\n        cols: *mut i64,\n        nnz: *mut i64,\n        csr_row_ptr: *mut *mut ::core::ffi::c_void,\n        csr_col_ind: *mut *mut ::core::ffi::c_void,\n        csr_val: *mut *mut ::core::ffi::c_void,\n        row_ptr_type: *mut rocsparse_indextype,\n        col_ind_type: *mut rocsparse_indextype,\n        idx_base: *mut rocsparse_index_base,\n        data_type: *mut rocsparse_datatype,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_const_csr_get(\n        descr: rocsparse_const_spmat_descr,\n        rows: *mut i64,\n        cols: *mut i64,\n        nnz: *mut i64,\n        csr_row_ptr: *mut *const ::core::ffi::c_void,\n        csr_col_ind: *mut *const ::core::ffi::c_void,\n        csr_val: *mut *const ::core::ffi::c_void,\n        row_ptr_type: *mut rocsparse_indextype,\n        col_ind_type: *mut rocsparse_indextype,\n        idx_base: *mut rocsparse_index_base,\n        data_type: *mut rocsparse_datatype,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Get the fields of the sparse CSC matrix descriptor\n  \\details\n  \\p rocsparse_csc_get gets the fields of the sparse CSC matrix descriptor\n\n  @param[in]\n  descr        the pointer to the sparse CSC matrix descriptor.\n  @param[out]\n  rows         number of rows in the CSC matrix.\n  @param[out]\n  cols         number of columns in the CSC matrix\n  @param[out]\n  nnz          number of non-zeros in the CSC matrix.\n  @param[out]\n  csc_col_ptr  column offsets of the CSC matrix (must be array of length \\p cols+1 ).\n  @param[out]\n  csc_row_ind  row indices of the CSC matrix (must be array of length \\p nnz ).\n  @param[out]\n  csc_val      values of the CSC matrix (must be array of length \\p nnz ).\n  @param[out]\n  col_ptr_type \\ref rocsparse_indextype_i32 or \\ref rocsparse_indextype_i64.\n  @param[out]\n  row_ind_type \\ref rocsparse_indextype_i32 or \\ref rocsparse_indextype_i64.\n  @param[out]\n  idx_base     \\ref rocsparse_index_base_zero or \\ref rocsparse_index_base_one.\n  @param[out]\n  data_type    \\ref rocsparse_datatype_f32_r, \\ref rocsparse_datatype_f64_r,\n               \\ref rocsparse_datatype_f32_c or \\ref rocsparse_datatype_f64_c.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer if \\p descr or \\p csc_col_ptr or \\p csc_row_ind or \\p csr_val is invalid.\n  \\retval rocsparse_status_invalid_size if \\p rows or \\p cols or \\p nnz is invalid.\n  \\retval rocsparse_status_invalid_value if \\p row_ptr_type or \\p col_ind_type or \\p idx_base or \\p data_type is invalid.*/\n    pub fn rocsparse_const_csc_get(\n        descr: rocsparse_const_spmat_descr,\n        rows: *mut i64,\n        cols: *mut i64,\n        nnz: *mut i64,\n        csc_col_ptr: *mut *const ::core::ffi::c_void,\n        csc_row_ind: *mut *const ::core::ffi::c_void,\n        csc_val: *mut *const ::core::ffi::c_void,\n        col_ptr_type: *mut rocsparse_indextype,\n        row_ind_type: *mut rocsparse_indextype,\n        idx_base: *mut rocsparse_index_base,\n        data_type: *mut rocsparse_datatype,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Get the fields of the sparse ELL matrix descriptor\n  \\details\n  \\p rocsparse_ell_get gets the fields of the sparse ELL matrix descriptor\n\n  @param[in]\n  descr       the pointer to the sparse ELL matrix descriptor.\n  @param[out]\n  rows        number of rows in the ELL matrix.\n  @param[out]\n  cols        number of columns in the ELL matrix\n  @param[out]\n  ell_col_ind column indices of the ELL matrix (must be array of length \\p rows*ell_width ).\n  @param[out]\n  ell_val     values of the ELL matrix (must be array of length \\p rows*ell_width ).\n  @param[out]\n  ell_width   width of the ELL matrix.\n  @param[out]\n  idx_type    \\ref rocsparse_indextype_i32 or \\ref rocsparse_indextype_i64.\n  @param[out]\n  idx_base    \\ref rocsparse_index_base_zero or \\ref rocsparse_index_base_one.\n  @param[out]\n  data_type   \\ref rocsparse_datatype_f32_r, \\ref rocsparse_datatype_f64_r,\n              \\ref rocsparse_datatype_f32_c or \\ref rocsparse_datatype_f64_c.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer if \\p descr or \\p ell_col_ind or \\p ell_val is invalid.\n  \\retval rocsparse_status_invalid_size if \\p rows or \\p cols or \\p ell_width is invalid.\n  \\retval rocsparse_status_invalid_value if \\p idx_type or \\p idx_base or \\p data_type is invalid.*/\n    pub fn rocsparse_ell_get(\n        descr: rocsparse_spmat_descr,\n        rows: *mut i64,\n        cols: *mut i64,\n        ell_col_ind: *mut *mut ::core::ffi::c_void,\n        ell_val: *mut *mut ::core::ffi::c_void,\n        ell_width: *mut i64,\n        idx_type: *mut rocsparse_indextype,\n        idx_base: *mut rocsparse_index_base,\n        data_type: *mut rocsparse_datatype,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup aux_module\\n  \\\\brief Get the fields of the sparse blocked ELL matrix descriptor\\n  \\\\details\\n  \\\\p rocsparse_bell_get gets the fields of the sparse blocked ELL matrix descriptor\\n\\n  @param[in]\\n  descr         the pointer to the sparse blocked ELL matrix descriptor.\\n  @param[out]\\n  rows          number of rows in the blocked ELL matrix.\\n  @param[out]\\n  cols          number of columns in the blocked ELL matrix\\n  @param[out]\\n  ell_block_dir \\\\ref rocsparse_direction_row or \\\\ref rocsparse_direction_column.\\n  @param[out]\\n  ell_block_dim block dimension of the sparse blocked ELL matrix.\\n  @param[out]\\n  ell_cols      column indices of the blocked ELL matrix (must be array of length \\\\p rows*ell_width ).\\n  @param[out]\\n  ell_col_ind   column indices of the blocked ELL matrix (must be array of length \\\\p rows*ell_width ).\\n  @param[out]\\n  ell_val       values of the blocked ELL matrix (must be array of length \\\\p rows*ell_width ).\\n  @param[out]\\n  idx_type      \\\\ref rocsparse_indextype_i32 or \\\\ref rocsparse_indextype_i64.\\n  @param[out]\\n  idx_base      \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n  @param[out]\\n  data_type     \\\\ref rocsparse_datatype_f32_r, \\\\ref rocsparse_datatype_f64_r,\\n                \\\\ref rocsparse_datatype_f32_c or \\\\ref rocsparse_datatype_f64_c.\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_pointer if \\\\p descr or \\\\p ell_cols or \\\\p ell_col_ind or \\\\p ell_val is invalid.\\n  \\\\retval rocsparse_status_invalid_size if \\\\p rows or \\\\p cols or \\\\p ell_block_dim is invalid.\\n  \\\\retval rocsparse_status_invalid_value if \\\\p ell_block_dir or \\\\p idx_type or \\\\p idx_base or \\\\p data_type is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_bell_get(\n        descr: rocsparse_spmat_descr,\n        rows: *mut i64,\n        cols: *mut i64,\n        ell_block_dir: *mut rocsparse_direction,\n        ell_block_dim: *mut i64,\n        ell_cols: *mut i64,\n        ell_col_ind: *mut *mut ::core::ffi::c_void,\n        ell_val: *mut *mut ::core::ffi::c_void,\n        idx_type: *mut rocsparse_indextype,\n        idx_base: *mut rocsparse_index_base,\n        data_type: *mut rocsparse_datatype,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_const_bell_get(\n        descr: rocsparse_const_spmat_descr,\n        rows: *mut i64,\n        cols: *mut i64,\n        ell_block_dir: *mut rocsparse_direction,\n        ell_block_dim: *mut i64,\n        ell_cols: *mut i64,\n        ell_col_ind: *mut *const ::core::ffi::c_void,\n        ell_val: *mut *const ::core::ffi::c_void,\n        idx_type: *mut rocsparse_indextype,\n        idx_base: *mut rocsparse_index_base,\n        data_type: *mut rocsparse_datatype,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Set the row indices, column indices and values array in the sparse COO matrix descriptor\n\n  @param[inout]\n  descr   the pointer to the sparse vector descriptor.\n  @param[in]\n  coo_row_ind row indices of the COO matrix (must be array of length \\p nnz ).\n  @param[in]\n  coo_col_ind column indices of the COO matrix (must be array of length \\p nnz ).\n  @param[in]\n  coo_val     values of the COO matrix (must be array of length \\p nnz ).\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer if \\p descr or \\p coo_row_ind or \\p coo_col_ind or \\p coo_val is invalid.*/\n    pub fn rocsparse_coo_set_pointers(\n        descr: rocsparse_spmat_descr,\n        coo_row_ind: *mut ::core::ffi::c_void,\n        coo_col_ind: *mut ::core::ffi::c_void,\n        coo_val: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Set the <row, column> indices and values array in the sparse COO AoS matrix descriptor\n\n  @param[inout]\n  descr   the pointer to the sparse vector descriptor.\n  @param[in]\n  coo_ind <row, column> indices of the COO matrix (must be array of length \\p nnz ).\n  @param[in]\n  coo_val values of the COO matrix (must be array of length \\p nnz ).\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer if \\p descr or \\p coo_ind or \\p coo_val is invalid.*/\n    pub fn rocsparse_coo_aos_set_pointers(\n        descr: rocsparse_spmat_descr,\n        coo_ind: *mut ::core::ffi::c_void,\n        coo_val: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Set the row offsets, column indices and values array in the sparse CSR matrix descriptor\n\n  @param[inout]\n  descr   the pointer to the sparse vector descriptor.\n  @param[in]\n  csr_row_ptr  row offsets of the CSR matrix (must be array of length \\p rows+1 ).\n  @param[in]\n  csr_col_ind  column indices of the CSR matrix (must be array of length \\p nnz ).\n  @param[in]\n  csr_val      values of the CSR matrix (must be array of length \\p nnz ).\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer if \\p descr or \\p coo_ind or \\p coo_val is invalid.*/\n    pub fn rocsparse_csr_set_pointers(\n        descr: rocsparse_spmat_descr,\n        csr_row_ptr: *mut ::core::ffi::c_void,\n        csr_col_ind: *mut ::core::ffi::c_void,\n        csr_val: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Set the column offsets, row indices and values array in the sparse CSC matrix descriptor\n\n  @param[inout]\n  descr       the pointer to the sparse vector descriptor.\n  @param[in]\n  csc_col_ptr column offsets of the CSC matrix (must be array of length \\p cols+1 ).\n  @param[in]\n  csc_row_ind row indices of the CSC matrix (must be array of length \\p nnz ).\n  @param[in]\n  csc_val     values of the CSC matrix (must be array of length \\p nnz ).\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer if \\p descr or \\p csc_col_ptr or \\p csc_row_ind or \\p csc_val is invalid.*/\n    pub fn rocsparse_csc_set_pointers(\n        descr: rocsparse_spmat_descr,\n        csc_col_ptr: *mut ::core::ffi::c_void,\n        csc_row_ind: *mut ::core::ffi::c_void,\n        csc_val: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Set the column indices and values array in the sparse ELL matrix descriptor\n\n  @param[inout]\n  descr       the pointer to the sparse vector descriptor.\n  @param[in]\n  ell_col_ind column indices of the ELL matrix (must be array of length \\p rows*ell_width ).\n  @param[in]\n  ell_val     values of the ELL matrix (must be array of length \\p rows*ell_width ).\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer if \\p descr or \\p ell_col_ind or \\p ell_val is invalid.*/\n    pub fn rocsparse_ell_set_pointers(\n        descr: rocsparse_spmat_descr,\n        ell_col_ind: *mut ::core::ffi::c_void,\n        ell_val: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Set the row offsets, column indices and values array in the sparse BSR matrix descriptor\n\n  @param[inout]\n  descr   the pointer to the sparse vector descriptor.\n  @param[in]\n  bsr_row_ptr  row offsets of the BSR matrix (must be array of length \\p rows+1 ).\n  @param[in]\n  bsr_col_ind  column indices of the BSR matrix (must be array of length \\p nnzb ).\n  @param[in]\n  bsr_val      values of the BSR matrix (must be array of length \\p nnzb*block_dim*block_dim ).\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer if \\p descr or \\p bsr_row_ptr or \\p bsr_col_ind or \\p bsr_val is invalid.*/\n    pub fn rocsparse_bsr_set_pointers(\n        descr: rocsparse_spmat_descr,\n        bsr_row_ptr: *mut ::core::ffi::c_void,\n        bsr_col_ind: *mut ::core::ffi::c_void,\n        bsr_val: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Get the number of rows, columns and non-zeros from the sparse matrix descriptor\n\n  @param[in]\n  descr       the pointer to the sparse matrix descriptor.\n  @param[out]\n  rows        number of rows in the sparse matrix.\n  @param[out]\n  cols        number of columns in the sparse matrix.\n  @param[out]\n  nnz         number of non-zeros in sparse matrix.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer if \\p descr is invalid.\n  \\retval rocsparse_status_invalid_size if \\p rows or \\p cols or \\p nnz is invalid.*/\n    pub fn rocsparse_spmat_get_size(\n        descr: rocsparse_const_spmat_descr,\n        rows: *mut i64,\n        cols: *mut i64,\n        nnz: *mut i64,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Get the sparse matrix format from the sparse matrix descriptor\n\n  @param[in]\n  descr       the pointer to the sparse matrix descriptor.\n  @param[out]\n  format      \\ref rocsparse_format_coo or \\ref rocsparse_format_coo_aos or\n              \\ref rocsparse_format_csr or \\ref rocsparse_format_csc or\n              \\ref rocsparse_format_ell\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer if \\p descr is invalid.\n  \\retval rocsparse_status_invalid_value if \\p format is invalid.*/\n    pub fn rocsparse_spmat_get_format(\n        descr: rocsparse_const_spmat_descr,\n        format: *mut rocsparse_format,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Get the sparse matrix index base from the sparse matrix descriptor\n\n  @param[in]\n  descr       the pointer to the sparse matrix descriptor.\n  @param[out]\n  idx_base    \\ref rocsparse_index_base_zero or \\ref rocsparse_index_base_one\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer if \\p descr is invalid.\n  \\retval rocsparse_status_invalid_value if \\p idx_base is invalid.*/\n    pub fn rocsparse_spmat_get_index_base(\n        descr: rocsparse_const_spmat_descr,\n        idx_base: *mut rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup aux_module\\n  \\\\brief Get the values array from the sparse matrix descriptor\\n\\n  @param[in]\\n  descr     the pointer to the sparse matrix descriptor.\\n  @param[out]\\n  values    values array of the sparse matrix.\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_pointer if \\\\p descr or \\\\p values is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_spmat_get_values(\n        descr: rocsparse_spmat_descr,\n        values: *mut *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_const_spmat_get_values(\n        descr: rocsparse_const_spmat_descr,\n        values: *mut *const ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Set the values array in the sparse matrix descriptor\n\n  @param[inout]\n  descr     the pointer to the sparse matrix descriptor.\n  @param[in]\n  values    values array of the sparse matrix.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer if \\p descr or \\p values is invalid.*/\n    pub fn rocsparse_spmat_set_values(\n        descr: rocsparse_spmat_descr,\n        values: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Get the strided batch count from the sparse matrix descriptor\n\n  @param[in]\n  descr       the pointer to the sparse matrix descriptor.\n  @param[out]\n  batch_count batch_count of the sparse matrix.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer if \\p descr is invalid.\n  \\retval rocsparse_status_invalid_size if \\p batch_count is invalid.*/\n    pub fn rocsparse_spmat_get_strided_batch(\n        descr: rocsparse_const_spmat_descr,\n        batch_count: *mut ::core::ffi::c_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Set the strided batch count in the sparse matrix descriptor\n\n  @param[in]\n  descr       the pointer to the sparse matrix descriptor.\n  @param[in]\n  batch_count batch_count of the sparse matrix.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer if \\p descr is invalid.\n  \\retval rocsparse_status_invalid_size if \\p batch_count is invalid.*/\n    pub fn rocsparse_spmat_set_strided_batch(\n        descr: rocsparse_spmat_descr,\n        batch_count: ::core::ffi::c_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Set the batch count and batch stride in the sparse COO matrix descriptor\n\n  @param[inout]\n  descr        the pointer to the sparse COO matrix descriptor.\n  @param[in]\n  batch_count  batch_count of the sparse COO matrix.\n  @param[in]\n  batch_stride batch stride of the sparse COO matrix.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer if \\p descr is invalid.\n  \\retval rocsparse_status_invalid_size if \\p batch_count or \\p batch_stride is invalid.*/\n    pub fn rocsparse_coo_set_strided_batch(\n        descr: rocsparse_spmat_descr,\n        batch_count: ::core::ffi::c_int,\n        batch_stride: i64,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Set the batch count, row offset batch stride and the column indices batch stride in the sparse CSR matrix descriptor\n\n  @param[inout]\n  descr                       the pointer to the sparse CSR matrix descriptor.\n  @param[in]\n  batch_count                 batch_count of the sparse CSR matrix.\n  @param[in]\n  offsets_batch_stride        row offset batch stride of the sparse CSR matrix.\n  @param[in]\n  columns_values_batch_stride column indices batch stride of the sparse CSR matrix.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer if \\p descr is invalid.\n  \\retval rocsparse_status_invalid_size if \\p batch_count or \\p offsets_batch_stride or \\p columns_values_batch_stride is invalid.*/\n    pub fn rocsparse_csr_set_strided_batch(\n        descr: rocsparse_spmat_descr,\n        batch_count: ::core::ffi::c_int,\n        offsets_batch_stride: i64,\n        columns_values_batch_stride: i64,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Set the batch count, column offset batch stride and the row indices batch stride in the sparse CSC matrix descriptor\n\n  @param[inout]\n  descr                       the pointer to the sparse CSC matrix descriptor.\n  @param[in]\n  batch_count                 batch_count of the sparse CSC matrix.\n  @param[in]\n  offsets_batch_stride        column offset batch stride of the sparse CSC matrix.\n  @param[in]\n  rows_values_batch_stride    row indices batch stride of the sparse CSC matrix.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer if \\p descr is invalid.\n  \\retval rocsparse_status_invalid_size if \\p batch_count or \\p offsets_batch_stride or \\p rows_values_batch_stride is invalid.*/\n    pub fn rocsparse_csc_set_strided_batch(\n        descr: rocsparse_spmat_descr,\n        batch_count: ::core::ffi::c_int,\n        offsets_batch_stride: i64,\n        rows_values_batch_stride: i64,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Get the requested attribute data from the sparse matrix descriptor\n\n  @param[in]\n  descr       the pointer to the sparse matrix descriptor.\n  @param[in]\n  attribute \\ref rocsparse_spmat_fill_mode or \\ref rocsparse_spmat_diag_type or\n            \\ref rocsparse_spmat_matrix_type or \\ref rocsparse_spmat_storage_mode\n  @param[out]\n  data      attribute data\n  @param[in]\n  data_size attribute data size.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer if \\p descr or \\p data is invalid.\n  \\retval rocsparse_status_invalid_value if \\p attribute is invalid.\n  \\retval rocsparse_status_invalid_size if \\p data_size is invalid.*/\n    pub fn rocsparse_spmat_get_attribute(\n        descr: rocsparse_const_spmat_descr,\n        attribute: rocsparse_spmat_attribute,\n        data: *mut ::core::ffi::c_void,\n        data_size: usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Set the requested attribute data in the sparse matrix descriptor\n\n  @param[inout]\n  descr       the pointer to the sparse matrix descriptor.\n  @param[in]\n  attribute \\ref rocsparse_spmat_fill_mode or \\ref rocsparse_spmat_diag_type or\n            \\ref rocsparse_spmat_matrix_type or \\ref rocsparse_spmat_storage_mode\n  @param[in]\n  data      attribute data\n  @param[in]\n  data_size attribute data size.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer if \\p descr or \\p data is invalid.\n  \\retval rocsparse_status_invalid_value if \\p attribute is invalid.\n  \\retval rocsparse_status_invalid_size if \\p data_size is invalid.*/\n    pub fn rocsparse_spmat_set_attribute(\n        descr: rocsparse_spmat_descr,\n        attribute: rocsparse_spmat_attribute,\n        data: *const ::core::ffi::c_void,\n        data_size: usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup aux_module\\n  \\\\brief Create a dense vector descriptor\\n  \\\\details\\n  \\\\p rocsparse_create_dnvec_descr creates a dense vector descriptor. It should be\\n  destroyed at the end using rocsparse_destroy_dnvec_descr().\\n\\n  @param[out]\\n  descr   the pointer to the dense vector descriptor.\\n  @param[in]\\n  size   size of the dense vector.\\n  @param[in]\\n  values   non-zero values in the dense vector (must be array of length \\\\p size ).\\n  @param[in]\\n  data_type   \\\\ref rocsparse_datatype_f32_r, \\\\ref rocsparse_datatype_f64_r,\\n              \\\\ref rocsparse_datatype_f32_c or \\\\ref rocsparse_datatype_f64_c.\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_pointer if \\\\p descr or \\\\p values is invalid.\\n  \\\\retval rocsparse_status_invalid_size if \\\\p size is invalid.\\n  \\\\retval rocsparse_status_invalid_value if \\\\p data_type is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_create_dnvec_descr(\n        descr: *mut rocsparse_dnvec_descr,\n        size: i64,\n        values: *mut ::core::ffi::c_void,\n        data_type: rocsparse_datatype,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_create_const_dnvec_descr(\n        descr: *mut rocsparse_const_dnvec_descr,\n        size: i64,\n        values: *const ::core::ffi::c_void,\n        data_type: rocsparse_datatype,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Destroy a dense vector descriptor\n\n  \\details\n  \\p rocsparse_destroy_dnvec_descr destroys a dense vector descriptor and releases all\n  resources used by the descriptor.\n\n  @param[in]\n  descr   the matrix descriptor.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer \\p descr is invalid.*/\n    pub fn rocsparse_destroy_dnvec_descr(\n        descr: rocsparse_const_dnvec_descr,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup aux_module\\n  \\\\brief Get the fields of the dense vector descriptor\\n  \\\\details\\n  \\\\p rocsparse_dnvec_get gets the fields of the dense vector descriptor\\n\\n  @param[in]\\n  descr   the pointer to the dense vector descriptor.\\n  @param[out]\\n  size   size of the dense vector.\\n  @param[out]\\n  values   non-zero values in the dense vector (must be array of length \\\\p size ).\\n  @param[out]\\n  data_type   \\\\ref rocsparse_datatype_f32_r, \\\\ref rocsparse_datatype_f64_r,\\n              \\\\ref rocsparse_datatype_f32_c or \\\\ref rocsparse_datatype_f64_c.\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_pointer if \\\\p descr or \\\\p values is invalid.\\n  \\\\retval rocsparse_status_invalid_size if \\\\p size is invalid.\\n  \\\\retval rocsparse_status_invalid_value if \\\\p data_type is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_dnvec_get(\n        descr: rocsparse_dnvec_descr,\n        size: *mut i64,\n        values: *mut *mut ::core::ffi::c_void,\n        data_type: *mut rocsparse_datatype,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_const_dnvec_get(\n        descr: rocsparse_const_dnvec_descr,\n        size: *mut i64,\n        values: *mut *const ::core::ffi::c_void,\n        data_type: *mut rocsparse_datatype,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup aux_module\\n  \\\\brief Get the values array from a dense vector descriptor\\n\\n  @param[in]\\n  descr   the matrix descriptor.\\n  @param[out]\\n  values   non-zero values in the dense vector (must be array of length \\\\p size ).\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_pointer \\\\p descr or \\\\p values is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_dnvec_get_values(\n        descr: rocsparse_dnvec_descr,\n        values: *mut *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_const_dnvec_get_values(\n        descr: rocsparse_const_dnvec_descr,\n        values: *mut *const ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Set the values array in a dense vector descriptor\n\n  @param[inout]\n  descr   the matrix descriptor.\n  @param[in]\n  values   non-zero values in the dense vector (must be array of length \\p size ).\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer \\p descr or \\p values is invalid.*/\n    pub fn rocsparse_dnvec_set_values(\n        descr: rocsparse_dnvec_descr,\n        values: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup aux_module\\n  \\\\brief Create a dense matrix descriptor\\n  \\\\details\\n  \\\\p rocsparse_create_dnmat_descr creates a dense matrix descriptor. It should be\\n  destroyed at the end using rocsparse_destroy_dnmat_descr().\\n\\n  @param[out]\\n  descr     the pointer to the dense matrix descriptor.\\n  @param[in]\\n  rows      number of rows in the dense matrix.\\n  @param[in]\\n  cols      number of columns in the dense matrix.\\n  @param[in]\\n  ld        leading dimension of the dense matrix.\\n  @param[in]\\n  values    non-zero values in the dense vector (must be array of length\\n            \\\\p ld*rows if \\\\p order=rocsparse_order_column or \\\\p ld*cols if \\\\p order=rocsparse_order_row ).\\n  @param[in]\\n  data_type \\\\ref rocsparse_datatype_f32_r, \\\\ref rocsparse_datatype_f64_r,\\n            \\\\ref rocsparse_datatype_f32_c or \\\\ref rocsparse_datatype_f64_c.\\n  @param[in]\\n  order     \\\\ref rocsparse_order_row or \\\\ref rocsparse_order_column.\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_pointer if \\\\p descr or \\\\p values is invalid.\\n  \\\\retval rocsparse_status_invalid_size if \\\\p rows or \\\\p cols or \\\\p ld is invalid.\\n  \\\\retval rocsparse_status_invalid_value if \\\\p data_type or \\\\p order is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_create_dnmat_descr(\n        descr: *mut rocsparse_dnmat_descr,\n        rows: i64,\n        cols: i64,\n        ld: i64,\n        values: *mut ::core::ffi::c_void,\n        data_type: rocsparse_datatype,\n        order: rocsparse_order,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_create_const_dnmat_descr(\n        descr: *mut rocsparse_const_dnmat_descr,\n        rows: i64,\n        cols: i64,\n        ld: i64,\n        values: *const ::core::ffi::c_void,\n        data_type: rocsparse_datatype,\n        order: rocsparse_order,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Destroy a dense matrix descriptor\n\n  \\details\n  \\p rocsparse_destroy_dnmat_descr destroys a dense matrix descriptor and releases all\n  resources used by the descriptor.\n\n  @param[in]\n  descr   the matrix descriptor.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer \\p descr is invalid.*/\n    pub fn rocsparse_destroy_dnmat_descr(\n        descr: rocsparse_const_dnmat_descr,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup aux_module\\n  \\\\brief Get the fields of the dense matrix descriptor\\n\\n  @param[in]\\n  descr   the pointer to the dense matrix descriptor.\\n  @param[out]\\n  rows   number of rows in the dense matrix.\\n  @param[out]\\n  cols   number of columns in the dense matrix.\\n  @param[out]\\n  ld        leading dimension of the dense matrix.\\n  @param[out]\\n  values    non-zero values in the dense matrix (must be array of length\\n            \\\\p ld*rows if \\\\p order=rocsparse_order_column or \\\\p ld*cols if \\\\p order=rocsparse_order_row ).\\n  @param[out]\\n  data_type   \\\\ref rocsparse_datatype_f32_r, \\\\ref rocsparse_datatype_f64_r,\\n              \\\\ref rocsparse_datatype_f32_c or \\\\ref rocsparse_datatype_f64_c.\\n  @param[out]\\n  order     \\\\ref rocsparse_order_row or \\\\ref rocsparse_order_column.\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_pointer if \\\\p descr or \\\\p values is invalid.\\n  \\\\retval rocsparse_status_invalid_size if \\\\p rows or \\\\p cols or \\\\p ld is invalid.\\n  \\\\retval rocsparse_status_invalid_value if \\\\p data_type or \\\\p order is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_dnmat_get(\n        descr: rocsparse_dnmat_descr,\n        rows: *mut i64,\n        cols: *mut i64,\n        ld: *mut i64,\n        values: *mut *mut ::core::ffi::c_void,\n        data_type: *mut rocsparse_datatype,\n        order: *mut rocsparse_order,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_const_dnmat_get(\n        descr: rocsparse_const_dnmat_descr,\n        rows: *mut i64,\n        cols: *mut i64,\n        ld: *mut i64,\n        values: *mut *const ::core::ffi::c_void,\n        data_type: *mut rocsparse_datatype,\n        order: *mut rocsparse_order,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup aux_module\\n  \\\\brief Get the values array from the dense matrix descriptor\\n\\n  @param[in]\\n  descr   the pointer to the dense matrix descriptor.\\n  @param[out]\\n  values    non-zero values in the dense matrix (must be array of length\\n            \\\\p ld*rows if \\\\p order=rocsparse_order_column or \\\\p ld*cols if \\\\p order=rocsparse_order_row ).\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_pointer if \\\\p descr or \\\\p values is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_dnmat_get_values(\n        descr: rocsparse_dnmat_descr,\n        values: *mut *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_const_dnmat_get_values(\n        descr: rocsparse_const_dnmat_descr,\n        values: *mut *const ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Set the values array in a dense matrix descriptor\n\n  @param[inout]\n  descr   the matrix descriptor.\n  @param[in]\n  values    non-zero values in the dense matrix (must be array of length\n            \\p ld*rows if \\p order=rocsparse_order_column or \\p ld*cols if \\p order=rocsparse_order_row ).\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer \\p descr or \\p values is invalid.*/\n    pub fn rocsparse_dnmat_set_values(\n        descr: rocsparse_dnmat_descr,\n        values: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Get the batch count and batch stride from the dense matrix descriptor\n\n  @param[in]\n  descr        the pointer to the dense matrix descriptor.\n  @param[out]\n  batch_count  the batch count in the dense matrix.\n  @param[out]\n  batch_stride the batch stride in the dense matrix.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer if \\p descr is invalid.\n  \\retval rocsparse_status_invalid_size if \\p batch_count or \\p batch_stride is invalid.*/\n    pub fn rocsparse_dnmat_get_strided_batch(\n        descr: rocsparse_const_dnmat_descr,\n        batch_count: *mut ::core::ffi::c_int,\n        batch_stride: *mut i64,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup aux_module\n  \\brief Set the batch count and batch stride in the dense matrix descriptor\n\n  @param[inout]\n  descr        the pointer to the dense matrix descriptor.\n  @param[in]\n  batch_count  the batch count in the dense matrix.\n  @param[in]\n  batch_stride the batch stride in the dense matrix.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_pointer if \\p descr is invalid.\n  \\retval rocsparse_status_invalid_size if \\p batch_count or \\p batch_stride is invalid.*/\n    pub fn rocsparse_dnmat_set_strided_batch(\n        descr: rocsparse_dnmat_descr,\n        batch_count: ::core::ffi::c_int,\n        batch_stride: i64,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    /** \\ingroup aux_module\n  \\brief Enable debug arguments.\n \\details If the debug arguments is enabled then argument descriptors are internally available when an argument checking occurs. It provide information to the user depending of the setup of the verbosity\n \\ref rocsparse_enable_debug_arguments_verbose, \\ref rocsparse_disable_debug_arguments_verbose and \\ref rocsparse_state_debug_arguments_verbose.\n \\note This routine ignores the environment variable ROCSPARSE_DEBUG_ARGUMENTS.\n \\note This routine enables debug arguments verbose with \\ref rocsparse_enable_debug_arguments_verbose.*/\n    pub fn rocsparse_enable_debug_arguments();\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    /** \\ingroup aux_module\n  \\brief Disable debug arguments.\n  \\note This routine ignores the environment variable ROCSPARSE_DEBUG_ARGUMENTS.\n  \\note This routines disables debug arguments verbose.*/\n    pub fn rocsparse_disable_debug_arguments();\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    /** \\ingroup aux_module\n \\return 1 if enabled, 0 otherwise.*/\n    pub fn rocsparse_state_debug_arguments() -> ::core::ffi::c_int;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    /** \\ingroup aux_module\n  \\brief Enable debug arguments verbose.\n  \\details The debug argument verbose displays information related to argument descriptors created from argument checking failures.\n  \\note This routine ignores the environment variable ROCSPARSE_DEBUG_ARGUMENTS_VERBOSE)*/\n    pub fn rocsparse_enable_debug_arguments_verbose();\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    /** \\ingroup aux_module\n  \\brief Disable debug arguments verbose.\n  \\note This routine ignores the environment variable ROCSPARSE_DEBUG_ARGUMENTS_VERBOSE)*/\n    pub fn rocsparse_disable_debug_arguments_verbose();\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    /** \\ingroup aux_module\n \\brief Get state of debug arguments verbose.\n \\return 1 if enabled, 0 otherwise.*/\n    pub fn rocsparse_state_debug_arguments_verbose() -> ::core::ffi::c_int;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    /** \\ingroup aux_module\n  \\brief Enable debug.\n \\details If the debug is enabled then code traces are generated when unsuccessful status returns occur. It provides information to the user depending of the set of the verbosity\n (\\ref rocsparse_enable_debug_verbose, \\ref rocsparse_disable_debug_verbose and \\ref rocsparse_state_debug_verbose).\n  \\note This routine ignores the environment variable ROCSPARSE_DEBUG.\n \\note \\ref rocsparse_enable_debug_verbose and \\ref rocsparse_enable_debug_arguments are called.*/\n    pub fn rocsparse_enable_debug();\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    /** \\ingroup aux_module\n  \\brief Disable debug.\n  \\note This routine also disables debug arguments with \\ref rocsparse_disable_debug_arguments.\n  \\note This routine ignores the environment variable ROCSPARSE_DEBUG.*/\n    pub fn rocsparse_disable_debug();\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    /** \\ingroup aux_module\n \\brief Get state of  debug.\n \\return 1 if enabled, 0 otherwise.*/\n    pub fn rocsparse_state_debug() -> ::core::ffi::c_int;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    /** \\ingroup aux_module\n  \\brief Enable debug verbose.\n  \\details The debug verbose displays a stack of code traces showing where the code is handling a unsuccessful status.\n  \\note This routine enables debug arguments verbose with \\ref rocsparse_enable_debug_arguments_verbose.\n  \\note This routine ignores the environment variable ROCSPARSE_DEBUG_VERBOSE.*/\n    pub fn rocsparse_enable_debug_verbose();\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    /** \\ingroup aux_module\n  \\brief Disable debug verbose.\n  \\note This routine disables debug arguments verbose with  \\ref rocsparse_disable_debug_arguments.\n  \\note This routine ignores the environment variable ROCSPARSE_DEBUG_VERBOSE.*/\n    pub fn rocsparse_disable_debug_verbose();\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    /** \\ingroup aux_module\n \\brief Get state of  debug verbose.\n \\return 1 if enabled, 0 otherwise.*/\n    pub fn rocsparse_state_debug_verbose() -> ::core::ffi::c_int;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief Convert a sparse BSR matrix into a sparse CSR matrix\\n\\n  \\\\details\\n  \\\\p rocsparse_bsr2csr converts a BSR matrix into a CSR matrix. It is assumed,\\n  that \\\\p csr_val, \\\\p csr_col_ind and \\\\p csr_row_ptr are allocated. Allocation size\\n  for \\\\p csr_row_ptr is computed by the number of block rows multiplied by the block\\n  dimension plus one. Allocation for \\\\p csr_val and \\\\p csr_col_ind is computed by the\\n  the number of blocks in the BSR matrix multiplied by the block dimension squared.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  dir         the storage format of the blocks, \\\\ref rocsparse_direction_row or \\\\ref rocsparse_direction_column\\n  @param[in]\\n  mb          number of block rows in the sparse BSR matrix.\\n  @param[in]\\n  nb          number of block columns in the sparse BSR matrix.\\n  @param[in]\\n  bsr_descr   descriptor of the sparse BSR matrix. Currently, only\\n              \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  bsr_val     array of \\\\p nnzb*block_dim*block_dim containing the values of the sparse BSR matrix.\\n  @param[in]\\n  bsr_row_ptr array of \\\\p mb+1 elements that point to the start of every block row of the\\n              sparse BSR matrix.\\n  @param[in]\\n  bsr_col_ind array of \\\\p nnzb elements containing the block column indices of the sparse BSR matrix.\\n  @param[in]\\n  block_dim   size of the blocks in the sparse BSR matrix.\\n  @param[in]\\n  csr_descr   descriptor of the sparse CSR matrix. Currently, only\\n              \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[out]\\n  csr_val     array of \\\\p nnzb*block_dim*block_dim elements containing the values of the sparse CSR matrix.\\n  @param[out]\\n  csr_row_ptr array of \\\\p m+1 where \\\\p m=mb*block_dim elements that point to the start of every row of the\\n              sparse CSR matrix.\\n  @param[out]\\n  csr_col_ind array of \\\\p nnzb*block_dim*block_dim elements containing the column indices of the sparse CSR matrix.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p mb or \\\\p nb or \\\\p block_dim is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p bsr_val,\\n              \\\\p bsr_row_ptr, \\\\p bsr_col_ind, \\\\p csr_val, \\\\p csr_row_ptr or\\n              \\\\p csr_col_ind pointer is invalid.\\n\\n  \\\\par Example\\n  This example converts a BSR matrix into an CSR matrix.\\n  \\\\code{.c}\\n      //     1 4 0 0 0 0\\n      // A = 0 2 3 0 0 0\\n      //     5 0 0 7 8 0\\n      //     0 0 9 0 6 0\\n\\n      rocsparse_int mb   = 2;\\n      rocsparse_int nb   = 3;\\n      rocsparse_int block_dim = 2;\\n      rocsparse_int m = Mb * block_dim;\\n      rocsparse_int n = Nb * block_dim;\\n\\n      bsr_row_ptr[mb+1]                 = {0, 2, 5};                                                    // device memory\\n      bsr_col_ind[nnzb]                 = {0, 1, 0, 1, 2};                                              // device memory\\n      bsr_val[nnzb*block_dim*block_dim] = {1, 0, 4, 2, 0, 3, 0, 0, 5, 0, 0, 0, 0, 9, 7, 0, 8, 6, 0, 0}; // device memory\\n\\n      rocsparse_int nnzb = bsr_row_ptr[mb] - bsr_row_ptr[0];\\n\\n      // Create CSR arrays on device\\n      rocsparse_int* csr_row_ptr;\\n      rocsparse_int* csr_col_ind;\\n      float* csr_val;\\n      hipMalloc((void**)&csr_row_ptr, sizeof(rocsparse_int) * (m + 1));\\n      hipMalloc((void**)&csr_col_ind, sizeof(rocsparse_int) * nnzb * block_dim * block_dim);\\n      hipMalloc((void**)&csr_val, sizeof(float) * nnzb * block_dim * block_dim);\\n\\n      // Create rocsparse handle\\n      rocsparse_local_handle handle;\\n\\n      rocsparse_mat_descr bsr_descr = nullptr;\\n      rocsparse_create_mat_descr(&bsr_descr);\\n\\n      rocsparse_mat_descr csr_descr = nullptr;\\n      rocsparse_create_mat_descr(&csr_descr);\\n\\n      rocsparse_set_mat_index_base(bsr_descr, rocsparse_index_base_zero);\\n      rocsparse_set_mat_index_base(csr_descr, rocsparse_index_base_zero);\\n\\n      // Format conversion\\n      rocsparse_sbsr2csr(handle,\\n                         rocsparse_direction_column,\\n                         mb,\\n                         nb,\\n                         bsr_descr,\\n                         bsr_val,\\n                         bsr_row_ptr,\\n                         bsr_col_ind,\\n                         block_dim,\\n                         csr_descr,\\n                         csr_val,\\n                         csr_row_ptr,\\n                         csr_col_ind);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_sbsr2csr(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        bsr_descr: rocsparse_mat_descr,\n        bsr_val: *const f32,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_val: *mut f32,\n        csr_row_ptr: *mut rocsparse_int,\n        csr_col_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dbsr2csr(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        bsr_descr: rocsparse_mat_descr,\n        bsr_val: *const f64,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_val: *mut f64,\n        csr_row_ptr: *mut rocsparse_int,\n        csr_col_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cbsr2csr(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        bsr_descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_float_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_val: *mut rocsparse_float_complex,\n        csr_row_ptr: *mut rocsparse_int,\n        csr_col_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zbsr2csr(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        bsr_descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_double_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_val: *mut rocsparse_double_complex,\n        csr_row_ptr: *mut rocsparse_int,\n        csr_col_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief Pads a value to the diagonal of the last block (if the last block is a diagonal block) in the sparse BSR matrix\\n  when the matrix expands outside m x m\\n\\n  \\\\details When converting from a CSR matrix to a BSR matrix the resulting BSR matrix will be larger when m < mb * block_dim.\\n  In these situations, the CSR to BSR conversion will expand the BSR matrix to have zeros when outside m x m. This routine\\n  converts the resulting BSR matrix to one that has a value on the last diagonal blocks diagonal if this last block is a diagonal\\n  block in the BSR matrix.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  m           number of rows of the sparse BSR matrix.\\n  @param[in]\\n  mb          number of block rows of the sparse BSR matrix.\\n  @param[in]\\n  nnzb        number of non-zero blocks of the sparse BSR matrix.\\n  @param[in]\\n  block_dim   block dimension of the sparse BSR matrix.\\n  @param[in]\\n  value       scalar value that is set on the diagonal of the last block when the matrix expands outside of \\\\p m x \\\\p m\\n  @param[in]\\n  bsr_descr   descriptor of the sparse BSR matrix. Currently, only\\n              \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[inout]\\n  bsr_val     array of \\\\p nnzb blocks of the sparse BSR matrix.\\n  @param[in]\\n  bsr_row_ptr array of \\\\p mb+1 elements that point to the start of every block row of\\n              the sparse BSR matrix.\\n  @param[in]\\n  bsr_col_ind array of \\\\p nnzb elements containing the block column indices of the sparse\\n              BSR matrix.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m, \\\\p mb, \\\\p nnzb or \\\\p block_dim is\\n              invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p bsr_descr, \\\\p bsr_val,\\n              \\\\p bsr_row_ind, \\\\p bsr_col_ind, pointer is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_sbsrpad_value(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        block_dim: rocsparse_int,\n        value: f32,\n        bsr_descr: rocsparse_mat_descr,\n        bsr_val: *mut f32,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dbsrpad_value(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        block_dim: rocsparse_int,\n        value: f64,\n        bsr_descr: rocsparse_mat_descr,\n        bsr_val: *mut f64,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cbsrpad_value(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        block_dim: rocsparse_int,\n        value: rocsparse_float_complex,\n        bsr_descr: rocsparse_mat_descr,\n        bsr_val: *mut rocsparse_float_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zbsrpad_value(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        block_dim: rocsparse_int,\n        value: rocsparse_double_complex,\n        bsr_descr: rocsparse_mat_descr,\n        bsr_val: *mut rocsparse_double_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup conv_module\n  \\brief Convert a sparse COO matrix into a sparse CSR matrix\n\n  \\details\n  \\p rocsparse_coo2csr converts the COO array containing the row indices into a\n  CSR array of row offsets, that point to the start of every row.\n  It is assumed that the COO row index array is sorted.\n\n  \\note It can also be used, to convert a COO array containing the column indices into\n  a CSC array of column offsets, that point to the start of every column. Then, it is\n  assumed that the COO column index array is sorted, instead.\n\n  \\note\n  This function is non blocking and executed asynchronously with respect to the host.\n  It may return before the actual computation has finished.\n\n  \\note\n  This routine supports execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[in]\n  coo_row_ind array of \\p nnz elements containing the row indices of the sparse COO\n              matrix.\n  @param[in]\n  nnz         number of non-zero entries of the sparse CSR matrix.\n  @param[in]\n  m           number of rows of the sparse CSR matrix.\n  @param[out]\n  csr_row_ptr array of \\p m+1 elements that point to the start of every row of the\n              sparse CSR matrix.\n  @param[in]\n  idx_base    \\ref rocsparse_index_base_zero or \\ref rocsparse_index_base_one.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_size \\p m or \\p nnz is invalid.\n  \\retval     rocsparse_status_invalid_pointer \\p coo_row_ind or \\p csr_row_ptr\n              pointer is invalid.\n\n  \\par Example\n  This example converts a COO matrix into a CSR matrix.\n  \\code{.c}\n      //     1 2 0 3 0\n      // A = 0 4 5 0 0\n      //     6 0 0 7 8\n\n      rocsparse_int m   = 3;\n      rocsparse_int n   = 5;\n      rocsparse_int nnz = 8;\n\n      coo_row_ind[nnz] = {0, 0, 0, 1, 1, 2, 2, 2}; // device memory\n      coo_col_ind[nnz] = {0, 1, 3, 1, 2, 0, 3, 4}; // device memory\n      coo_val[nnz]     = {1, 2, 3, 4, 5, 6, 7, 8}; // device memory\n\n      // Allocate CSR matrix arrays\n      rocsparse_int* csr_row_ptr;\n      rocsparse_int* csr_col_ind;\n      float* csr_val;\n\n      hipMalloc((void**)&csr_row_ptr, sizeof(rocsparse_int) * (m + 1));\n      hipMalloc((void**)&csr_col_ind, sizeof(rocsparse_int) * nnz);\n      hipMalloc((void**)&csr_val, sizeof(float) * nnz);\n\n      // Convert the coo row indices into csr row offsets\n      rocsparse_coo2csr(handle,\n                        coo_row_ind,\n                        nnz,\n                        m,\n                        csr_row_ptr,\n                        rocsparse_index_base_zero);\n\n      // Copy the column and value arrays\n      hipMemcpy(csr_col_ind,\n                coo_col_ind,\n                sizeof(rocsparse_int) * nnz,\n                hipMemcpyDeviceToDevice);\n\n      hipMemcpy(csr_val,\n                coo_val,\n                sizeof(float) * nnz,\n                hipMemcpyDeviceToDevice);\n  \\endcode*/\n    pub fn rocsparse_coo2csr(\n        handle: rocsparse_handle,\n        coo_row_ind: *const rocsparse_int,\n        nnz: rocsparse_int,\n        m: rocsparse_int,\n        csr_row_ptr: *mut rocsparse_int,\n        idx_base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief\\n  This function converts the sparse matrix in COO format into a dense matrix.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n\\n  @param[in]\\n  m           number of rows of the dense matrix \\\\p A.\\n\\n  @param[in]\\n  n           number of columns of the dense matrix \\\\p A.\\n\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse COO matrix.\\n  @param[in]\\n  descr       the descriptor of the dense matrix \\\\p A, the supported matrix type is \\\\ref rocsparse_matrix_type_general and also any valid value of the \\\\ref rocsparse_index_base.\\n\\n  @param[in]\\n  coo_val     array of nnz nonzero elements of matrix \\\\p A.\\n  @param[in]\\n  coo_row_ind integer array of nnz row indices of the non-zero elements of matrix \\\\p A.\\n\\n  @param[in]\\n  coo_col_ind integer array of nnz column indices of the non-zero elements of matrix \\\\p A.\\n  @param[out]\\n  A           array of dimensions (\\\\p ld, \\\\p n)\\n\\n  @param[out]\\n  ld          leading dimension of dense array \\\\p A.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p n or \\\\p nnz or \\\\p ld is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p A or \\\\p coo_val \\\\p coo_col_ind or \\\\p coo_row_ind\\n              pointer is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_scoo2dense(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        coo_val: *const f32,\n        coo_row_ind: *const rocsparse_int,\n        coo_col_ind: *const rocsparse_int,\n        A: *mut f32,\n        ld: rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcoo2dense(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        coo_val: *const f64,\n        coo_row_ind: *const rocsparse_int,\n        coo_col_ind: *const rocsparse_int,\n        A: *mut f64,\n        ld: rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccoo2dense(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        coo_val: *const rocsparse_float_complex,\n        coo_row_ind: *const rocsparse_int,\n        coo_col_ind: *const rocsparse_int,\n        A: *mut rocsparse_float_complex,\n        ld: rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcoo2dense(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        coo_val: *const rocsparse_double_complex,\n        coo_row_ind: *const rocsparse_int,\n        coo_col_ind: *const rocsparse_int,\n        A: *mut rocsparse_double_complex,\n        ld: rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup conv_module\n  \\brief Sort a sparse COO matrix\n\n  \\details\n  \\p coosort_buffer_size returns the size of the temporary storage buffer that is\n  required by rocsparse_coosort_by_row() and rocsparse_coosort_by_column(). The\n  temporary storage buffer has to be allocated by the user.\n\n  \\note\n  This function is non blocking and executed asynchronously with respect to the host.\n  It may return before the actual computation has finished.\n\n  \\note\n  This routine supports execution in a hipGraph context.\n\n  @param[in]\n  handle          handle to the rocsparse library context queue.\n  @param[in]\n  m               number of rows of the sparse COO matrix.\n  @param[in]\n  n               number of columns of the sparse COO matrix.\n  @param[in]\n  nnz             number of non-zero entries of the sparse COO matrix.\n  @param[in]\n  coo_row_ind     array of \\p nnz elements containing the row indices of the sparse\n                  COO matrix.\n  @param[in]\n  coo_col_ind     array of \\p nnz elements containing the column indices of the sparse\n                  COO matrix.\n  @param[out]\n  buffer_size     number of bytes of the temporary storage buffer required by\n                  rocsparse_coosort_by_row() and rocsparse_coosort_by_column().\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_size \\p m, \\p n or \\p nnz is invalid.\n  \\retval     rocsparse_status_invalid_pointer \\p coo_row_ind, \\p coo_col_ind or\n              \\p buffer_size pointer is invalid.\n  \\retval     rocsparse_status_internal_error an internal error occurred.*/\n    pub fn rocsparse_coosort_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        coo_row_ind: *const rocsparse_int,\n        coo_col_ind: *const rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup conv_module\n  \\brief Sort a sparse COO matrix by row\n\n  \\details\n  \\p rocsparse_coosort_by_row sorts a matrix in COO format by row. The sorted\n  permutation vector \\p perm can be used to obtain sorted \\p coo_val array. In this\n  case, \\p perm must be initialized as the identity permutation, see\n  rocsparse_create_identity_permutation().\n\n  \\p rocsparse_coosort_by_row requires extra temporary storage buffer that has to be\n  allocated by the user. Storage buffer size can be determined by\n  rocsparse_coosort_buffer_size().\n\n  \\note\n  \\p perm can be \\p NULL if a sorted permutation vector is not required.\n\n  \\note\n  This function is non blocking and executed asynchronously with respect to the host.\n  It may return before the actual computation has finished.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle          handle to the rocsparse library context queue.\n  @param[in]\n  m               number of rows of the sparse COO matrix.\n  @param[in]\n  n               number of columns of the sparse COO matrix.\n  @param[in]\n  nnz             number of non-zero entries of the sparse COO matrix.\n  @param[inout]\n  coo_row_ind     array of \\p nnz elements containing the row indices of the sparse\n                  COO matrix.\n  @param[inout]\n  coo_col_ind     array of \\p nnz elements containing the column indices of the sparse\n                  COO matrix.\n  @param[inout]\n  perm            array of \\p nnz integers containing the unsorted map indices, can be\n                  \\p NULL.\n  @param[in]\n  temp_buffer     temporary storage buffer allocated by the user, size is returned by\n                  rocsparse_coosort_buffer_size().\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_size \\p m, \\p n or \\p nnz is invalid.\n  \\retval     rocsparse_status_invalid_pointer \\p coo_row_ind, \\p coo_col_ind or\n              \\p temp_buffer pointer is invalid.\n  \\retval     rocsparse_status_internal_error an internal error occurred.\n\n  \\par Example\n  The following example sorts a \\f$3 \\times 3\\f$ COO matrix by row indices.\n  \\code{.c}\n      //     1 2 3\n      // A = 4 5 6\n      //     7 8 9\n      rocsparse_int m   = 3;\n      rocsparse_int n   = 3;\n      rocsparse_int nnz = 9;\n\n      coo_row_ind[nnz] = {0, 1, 2, 0, 1, 2, 0, 1, 2}; // device memory\n      coo_col_ind[nnz] = {0, 0, 0, 1, 1, 1, 2, 2, 2}; // device memory\n      coo_val[nnz]     = {1, 4, 7, 2, 5, 8, 3, 6, 9}; // device memory\n\n      // Create permutation vector perm as the identity map\n      rocsparse_int* perm;\n      hipMalloc((void**)&perm, sizeof(rocsparse_int) * nnz);\n      rocsparse_create_identity_permutation(handle, nnz, perm);\n\n      // Allocate temporary buffer\n      size_t buffer_size;\n      void* temp_buffer;\n      rocsparse_coosort_buffer_size(handle,\n                                    m,\n                                    n,\n                                    nnz,\n                                    coo_row_ind,\n                                    coo_col_ind,\n                                    &buffer_size);\n      hipMalloc(&temp_buffer, buffer_size);\n\n      // Sort the COO matrix\n      rocsparse_coosort_by_row(handle,\n                               m,\n                               n,\n                               nnz,\n                               coo_row_ind,\n                               coo_col_ind,\n                               perm,\n                               temp_buffer);\n\n      // Gather sorted coo_val array\n      float* coo_val_sorted;\n      hipMalloc((void**)&coo_val_sorted, sizeof(float) * nnz);\n      rocsparse_sgthr(handle, nnz, coo_val, coo_val_sorted, perm, rocsparse_index_base_zero);\n\n      // Clean up\n      hipFree(temp_buffer);\n      hipFree(perm);\n      hipFree(coo_val);\n  \\endcode*/\n    pub fn rocsparse_coosort_by_row(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        coo_row_ind: *mut rocsparse_int,\n        coo_col_ind: *mut rocsparse_int,\n        perm: *mut rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup conv_module\n  \\brief Sort a sparse COO matrix by column\n\n  \\details\n  \\p rocsparse_coosort_by_column sorts a matrix in COO format by column. The sorted\n  permutation vector \\p perm can be used to obtain sorted \\p coo_val array. In this\n  case, \\p perm must be initialized as the identity permutation, see\n  rocsparse_create_identity_permutation().\n\n  \\p rocsparse_coosort_by_column requires extra temporary storage buffer that has to be\n  allocated by the user. Storage buffer size can be determined by\n  rocsparse_coosort_buffer_size().\n\n  \\note\n  \\p perm can be \\p NULL if a sorted permutation vector is not required.\n\n  \\note\n  This function is non blocking and executed asynchronously with respect to the host.\n  It may return before the actual computation has finished.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle          handle to the rocsparse library context queue.\n  @param[in]\n  m               number of rows of the sparse COO matrix.\n  @param[in]\n  n               number of columns of the sparse COO matrix.\n  @param[in]\n  nnz             number of non-zero entries of the sparse COO matrix.\n  @param[inout]\n  coo_row_ind     array of \\p nnz elements containing the row indices of the sparse\n                  COO matrix.\n  @param[inout]\n  coo_col_ind     array of \\p nnz elements containing the column indices of the sparse\n                  COO matrix.\n  @param[inout]\n  perm            array of \\p nnz integers containing the unsorted map indices, can be\n                  \\p NULL.\n  @param[in]\n  temp_buffer     temporary storage buffer allocated by the user, size is returned by\n                  rocsparse_coosort_buffer_size().\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_size \\p m, \\p n or \\p nnz is invalid.\n  \\retval     rocsparse_status_invalid_pointer \\p coo_row_ind, \\p coo_col_ind or\n              \\p temp_buffer pointer is invalid.\n  \\retval     rocsparse_status_internal_error an internal error occurred.\n\n  \\par Example\n  The following example sorts a \\f$3 \\times 3\\f$ COO matrix by column indices.\n  \\code{.c}\n      //     1 2 3\n      // A = 4 5 6\n      //     7 8 9\n      rocsparse_int m   = 3;\n      rocsparse_int n   = 3;\n      rocsparse_int nnz = 9;\n\n      coo_row_ind[nnz] = {0, 0, 0, 1, 1, 1, 2, 2, 2}; // device memory\n      coo_col_ind[nnz] = {0, 1, 2, 0, 1, 2, 0, 1, 2}; // device memory\n      coo_val[nnz]     = {1, 2, 3, 4, 5, 6, 7, 8, 9}; // device memory\n\n      // Create permutation vector perm as the identity map\n      rocsparse_int* perm;\n      hipMalloc((void**)&perm, sizeof(rocsparse_int) * nnz);\n      rocsparse_create_identity_permutation(handle, nnz, perm);\n\n      // Allocate temporary buffer\n      size_t buffer_size;\n      void* temp_buffer;\n      rocsparse_coosort_buffer_size(handle,\n                                    m,\n                                    n,\n                                    nnz,\n                                    coo_row_ind,\n                                    coo_col_ind,\n                                    &buffer_size);\n      hipMalloc(&temp_buffer, buffer_size);\n\n      // Sort the COO matrix\n      rocsparse_coosort_by_column(handle,\n                                  m,\n                                  n,\n                                  nnz,\n                                  coo_row_ind,\n                                  coo_col_ind,\n                                  perm,\n                                  temp_buffer);\n\n      // Gather sorted coo_val array\n      float* coo_val_sorted;\n      hipMalloc((void**)&coo_val_sorted, sizeof(float) * nnz);\n      rocsparse_sgthr(handle, nnz, coo_val, coo_val_sorted, perm, rocsparse_index_base_zero);\n\n      // Clean up\n      hipFree(temp_buffer);\n      hipFree(perm);\n      hipFree(coo_val);\n  \\endcode*/\n    pub fn rocsparse_coosort_by_column(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        coo_row_ind: *mut rocsparse_int,\n        coo_col_ind: *mut rocsparse_int,\n        perm: *mut rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief\\n  This function converts the sparse matrix in CSC format into a dense matrix.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n\\n  @param[in]\\n  m           number of rows of the dense matrix \\\\p A.\\n\\n  @param[in]\\n  n           number of columns of the dense matrix \\\\p A.\\n\\n  @param[in]\\n  descr       the descriptor of the dense matrix \\\\p A, the supported matrix type is \\\\ref rocsparse_matrix_type_general and also any valid value of the \\\\ref rocsparse_index_base.\\n\\n  @param[in]\\n  csc_val     array of nnz ( = \\\\p csc_col_ptr[m] - \\\\p csc_col_ptr[0] ) nonzero elements of matrix \\\\p A.\\n  @param[in]\\n  csc_col_ptr integer array of m+1 elements that contains the start of every row and the end of the last row plus one.\\n  @param[in]\\n  csc_row_ind integer array of nnz ( = \\\\p csc_col_ptr[m] - csc_col_ptr[0] ) column indices of the non-zero elements of matrix \\\\p A.\\n\\n  @param[out]\\n  A           array of dimensions (\\\\p ld, \\\\p n)\\n\\n  @param[out]\\n  ld          leading dimension of dense array \\\\p A.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p n or \\\\p ld is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p A or \\\\p csc_val \\\\p csc_col_ptr or \\\\p csc_row_ind\\n              pointer is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_scsc2dense(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csc_val: *const f32,\n        csc_col_ptr: *const rocsparse_int,\n        csc_row_ind: *const rocsparse_int,\n        A: *mut f32,\n        ld: rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsc2dense(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csc_val: *const f64,\n        csc_col_ptr: *const rocsparse_int,\n        csc_row_ind: *const rocsparse_int,\n        A: *mut f64,\n        ld: rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsc2dense(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csc_val: *const rocsparse_float_complex,\n        csc_col_ptr: *const rocsparse_int,\n        csc_row_ind: *const rocsparse_int,\n        A: *mut rocsparse_float_complex,\n        ld: rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsc2dense(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csc_val: *const rocsparse_double_complex,\n        csc_col_ptr: *const rocsparse_int,\n        csc_row_ind: *const rocsparse_int,\n        A: *mut rocsparse_double_complex,\n        ld: rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup conv_module\n  \\brief Sort a sparse CSC matrix\n\n  \\details\n  \\p rocsparse_cscsort_buffer_size returns the size of the temporary storage buffer\n  required by rocsparse_cscsort(). The temporary storage buffer must be allocated by\n  the user.\n\n  \\note\n  This function is non blocking and executed asynchronously with respect to the host.\n  It may return before the actual computation has finished.\n\n  \\note\n  This routine supports execution in a hipGraph context.\n\n  @param[in]\n  handle          handle to the rocsparse library context queue.\n  @param[in]\n  m               number of rows of the sparse CSC matrix.\n  @param[in]\n  n               number of columns of the sparse CSC matrix.\n  @param[in]\n  nnz             number of non-zero entries of the sparse CSC matrix.\n  @param[in]\n  csc_col_ptr     array of \\p n+1 elements that point to the start of every column of\n                  the sparse CSC matrix.\n  @param[in]\n  csc_row_ind     array of \\p nnz elements containing the row indices of the sparse\n                  CSC matrix.\n  @param[out]\n  buffer_size     number of bytes of the temporary storage buffer required by\n                  rocsparse_cscsort().\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_size \\p m, \\p n or \\p nnz is invalid.\n  \\retval     rocsparse_status_invalid_pointer \\p csc_col_ptr, \\p csc_row_ind or\n              \\p buffer_size pointer is invalid.*/\n    pub fn rocsparse_cscsort_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        csc_col_ptr: *const rocsparse_int,\n        csc_row_ind: *const rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup conv_module\n  \\brief Sort a sparse CSC matrix\n\n  \\details\n  \\p rocsparse_cscsort sorts a matrix in CSC format. The sorted permutation vector\n  \\p perm can be used to obtain sorted \\p csc_val array. In this case, \\p perm must be\n  initialized as the identity permutation, see rocsparse_create_identity_permutation().\n\n  \\p rocsparse_cscsort requires extra temporary storage buffer that has to be allocated by\n  the user. Storage buffer size can be determined by rocsparse_cscsort_buffer_size().\n\n  \\note\n  \\p perm can be \\p NULL if a sorted permutation vector is not required.\n\n  \\note\n  This function is non blocking and executed asynchronously with respect to the host.\n  It may return before the actual computation has finished.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle          handle to the rocsparse library context queue.\n  @param[in]\n  m               number of rows of the sparse CSC matrix.\n  @param[in]\n  n               number of columns of the sparse CSC matrix.\n  @param[in]\n  nnz             number of non-zero entries of the sparse CSC matrix.\n  @param[in]\n  descr           descriptor of the sparse CSC matrix. Currently, only\n                  \\ref rocsparse_matrix_type_general is supported.\n  @param[in]\n  csc_col_ptr     array of \\p n+1 elements that point to the start of every column of\n                  the sparse CSC matrix.\n  @param[inout]\n  csc_row_ind     array of \\p nnz elements containing the row indices of the sparse\n                  CSC matrix.\n  @param[inout]\n  perm            array of \\p nnz integers containing the unsorted map indices, can be\n                  \\p NULL.\n  @param[in]\n  temp_buffer     temporary storage buffer allocated by the user, size is returned by\n                  rocsparse_cscsort_buffer_size().\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_size \\p m, \\p n or \\p nnz is invalid.\n  \\retval     rocsparse_status_invalid_pointer \\p descr, \\p csc_col_ptr, \\p csc_row_ind\n              or \\p temp_buffer pointer is invalid.\n  \\retval     rocsparse_status_internal_error an internal error occurred.\n  \\retval     rocsparse_status_not_implemented\n              \\ref rocsparse_matrix_type != \\ref rocsparse_matrix_type_general.\n\n  \\par Example\n  The following example sorts a \\f$3 \\times 3\\f$ CSC matrix.\n  \\code{.c}\n      //     1 2 3\n      // A = 4 5 6\n      //     7 8 9\n      rocsparse_int m   = 3;\n      rocsparse_int n   = 3;\n      rocsparse_int nnz = 9;\n\n      csc_col_ptr[m + 1] = {0, 3, 6, 9};                // device memory\n      csc_row_ind[nnz]   = {2, 0, 1, 0, 1, 2, 0, 2, 1}; // device memory\n      csc_val[nnz]       = {7, 1, 4, 2, 5, 8, 3, 9, 6}; // device memory\n\n      // Create permutation vector perm as the identity map\n      rocsparse_int* perm;\n      hipMalloc((void**)&perm, sizeof(rocsparse_int) * nnz);\n      rocsparse_create_identity_permutation(handle, nnz, perm);\n\n      // Allocate temporary buffer\n      size_t buffer_size;\n      void* temp_buffer;\n      rocsparse_cscsort_buffer_size(handle, m, n, nnz, csc_col_ptr, csc_row_ind, &buffer_size);\n      hipMalloc(&temp_buffer, buffer_size);\n\n      // Sort the CSC matrix\n      rocsparse_cscsort(handle, m, n, nnz, descr, csc_col_ptr, csc_row_ind, perm, temp_buffer);\n\n      // Gather sorted csc_val array\n      float* csc_val_sorted;\n      hipMalloc((void**)&csc_val_sorted, sizeof(float) * nnz);\n      rocsparse_sgthr(handle, nnz, csc_val, csc_val_sorted, perm, rocsparse_index_base_zero);\n\n      // Clean up\n      hipFree(temp_buffer);\n      hipFree(perm);\n      hipFree(csc_val);\n  \\endcode*/\n    pub fn rocsparse_cscsort(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csc_col_ptr: *const rocsparse_int,\n        csc_row_ind: *mut rocsparse_int,\n        perm: *mut rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup conv_module\n  \\brief\n  This function computes the number of nonzero block columns per row and the total number of nonzero blocks in a sparse\n  BSR matrix given a sparse CSR matrix as input.\n\n  \\details\n  The routine does support asynchronous execution if the pointer mode is set to device.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n\n  @param[in]\n  dir         direction that specified whether to count nonzero elements by \\ref rocsparse_direction_row or by\n              \\ref rocsparse_direction_row.\n\n  @param[in]\n  m           number of rows of the sparse CSR matrix.\n\n  @param[in]\n  n           number of columns of the sparse CSR matrix.\n\n  @param[in]\n  csr_descr    descriptor of the sparse CSR matrix. Currently, only\n               \\ref rocsparse_matrix_type_general is supported.\n  @param[in]\n  csr_row_ptr integer array containing \\p m+1 elements that point to the start of each row of the CSR matrix\n\n  @param[in]\n  csr_col_ind integer array of the column indices for each non-zero element in the CSR matrix\n\n  @param[in]\n  block_dim   the block dimension of the BSR matrix. Between 1 and min(m, n)\n\n  @param[in]\n  bsr_descr    descriptor of the sparse BSR matrix. Currently, only\n               \\ref rocsparse_matrix_type_general is supported.\n  @param[out]\n  bsr_row_ptr integer array containing \\p mb+1 elements that point to the start of each block row of the BSR matrix\n\n  @param[out]\n  bsr_nnz     total number of nonzero elements in device or host memory.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_size \\p m or \\p n or \\p block_dim is invalid.\n  \\retval     rocsparse_status_invalid_pointer \\p csr_row_ptr or \\p csr_col_ind or \\p bsr_row_ptr or \\p bsr_nnz\n              pointer is invalid.*/\n    pub fn rocsparse_csr2bsr_nnz(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        bsr_descr: rocsparse_mat_descr,\n        bsr_row_ptr: *mut rocsparse_int,\n        bsr_nnz: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief Convert a sparse CSR matrix into a sparse BSR matrix\\n\\n  \\\\details\\n  \\\\p rocsparse_csr2bsr converts a CSR matrix into a BSR matrix. It is assumed,\\n  that \\\\p bsr_val, \\\\p bsr_col_ind and \\\\p bsr_row_ptr are allocated. Allocation size\\n  for \\\\p bsr_row_ptr is computed as \\\\p mb+1 where \\\\p mb is the number of block rows in\\n  the BSR matrix. Allocation size for \\\\p bsr_val and \\\\p bsr_col_ind is computed using\\n  \\\\p csr2bsr_nnz() which also fills in \\\\p bsr_row_ptr.\\n\\n  \\\\p rocsparse_csr2bsr requires extra temporary storage that is allocated internally if \\\\p block_dim>16\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle       handle to the rocsparse library context queue.\\n  @param[in]\\n  dir          the storage format of the blocks, \\\\ref rocsparse_direction_row or \\\\ref rocsparse_direction_column\\n  @param[in]\\n  m            number of rows in the sparse CSR matrix.\\n  @param[in]\\n  n            number of columns in the sparse CSR matrix.\\n  @param[in]\\n  csr_descr    descriptor of the sparse CSR matrix. Currently, only\\n               \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  csr_val      array of \\\\p nnz elements containing the values of the sparse CSR matrix.\\n  @param[in]\\n  csr_row_ptr  array of \\\\p m+1 elements that point to the start of every row of the\\n               sparse CSR matrix.\\n  @param[in]\\n  csr_col_ind  array of \\\\p nnz elements containing the column indices of the sparse CSR matrix.\\n  @param[in]\\n  block_dim    size of the blocks in the sparse BSR matrix.\\n  @param[in]\\n  bsr_descr    descriptor of the sparse BSR matrix. Currently, only\\n               \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[out]\\n  bsr_val      array of \\\\p nnzb*block_dim*block_dim containing the values of the sparse BSR matrix.\\n  @param[out]\\n  bsr_row_ptr  array of \\\\p mb+1 elements that point to the start of every block row of the\\n               sparse BSR matrix.\\n  @param[out]\\n  bsr_col_ind  array of \\\\p nnzb elements containing the block column indices of the sparse BSR matrix.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p n or \\\\p block_dim is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p bsr_val,\\n              \\\\p bsr_row_ptr, \\\\p bsr_col_ind, \\\\p csr_val, \\\\p csr_row_ptr or\\n              \\\\p csr_col_ind pointer is invalid.\\n\\n  \\\\par Example\\n  This example converts a CSR matrix into an BSR matrix.\\n  \\\\code{.c}\\n      //     1 4 0 0 0 0\\n      // A = 0 2 3 0 0 0\\n      //     5 0 0 7 8 0\\n      //     0 0 9 0 6 0\\n\\n      rocsparse_int m   = 4;\\n      rocsparse_int n   = 6;\\n      rocsparse_int block_dim = 2;\\n      rocsparse_int nnz = 9;\\n      rocsparse_int mb = (m + block_dim - 1) / block_dim;\\n      rocsparse_int nb = (n + block_dim - 1) / block_dim;\\n\\n      csr_row_ptr[m+1]  = {0, 2, 4, 7, 9};             // device memory\\n      csr_col_ind[nnz]  = {0, 1, 1, 2, 0, 3, 4, 2, 4}; // device memory\\n      csr_val[nnz]      = {1, 4, 2, 3, 5, 7, 8, 9, 6}; // device memory\\n\\n      hipMalloc(&bsr_row_ptr, sizeof(rocsparse_int) *(mb + 1));\\n      rocsparse_int nnzb;\\n      rocsparse_int* nnzTotalHostPtr = &nnzb;\\n      csr2bsr_nnz(handle,\\n                  rocsparse_direction_row,\\n                  m,\\n                  n,\\n                  csr_descr,\\n                  csr_row_ptr,\\n                  csr_col_ind,\\n                  block_dim,\\n                  bsr_descr,\\n                  bsr_row_ptr,\\n                  nnzTotalHostPtr);\\n      nnzb = *nnzTotalDevHostPtr;\\n      hipMalloc(&bsr_col_ind, sizeof(int)*nnzb);\\n      hipMalloc(&bsr_val, sizeof(float)*(block_dim * block_dim) * nnzb);\\n      scsr2bsr(handle,\\n               rocsparse_direction_row,\\n               m,\\n               n,\\n               csr_descr,\\n               csr_val,\\n               csr_row_ptr,\\n               csr_col_ind,\\n               block_dim,\\n               bsr_descr,\\n               bsr_val,\\n               bsr_row_ptr,\\n               bsr_col_ind);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_scsr2bsr(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        bsr_descr: rocsparse_mat_descr,\n        bsr_val: *mut f32,\n        bsr_row_ptr: *mut rocsparse_int,\n        bsr_col_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsr2bsr(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        bsr_descr: rocsparse_mat_descr,\n        bsr_val: *mut f64,\n        bsr_row_ptr: *mut rocsparse_int,\n        bsr_col_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsr2bsr(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        bsr_descr: rocsparse_mat_descr,\n        bsr_val: *mut rocsparse_float_complex,\n        bsr_row_ptr: *mut rocsparse_int,\n        bsr_col_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsr2bsr(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        bsr_descr: rocsparse_mat_descr,\n        bsr_val: *mut rocsparse_double_complex,\n        bsr_row_ptr: *mut rocsparse_int,\n        bsr_col_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup conv_module\n  \\brief Convert a sparse CSR matrix into a sparse COO matrix\n\n  \\details\n  \\p rocsparse_csr2coo converts the CSR array containing the row offsets, that point\n  to the start of every row, into a COO array of row indices.\n\n  \\note\n  It can also be used to convert a CSC array containing the column offsets into a COO\n  array of column indices.\n\n  \\note\n  This function is non blocking and executed asynchronously with respect to the host.\n  It may return before the actual computation has finished.\n\n  \\note\n  This routine supports execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[in]\n  csr_row_ptr array of \\p m+1 elements that point to the start of every row\n              of the sparse CSR matrix.\n  @param[in]\n  nnz         number of non-zero entries of the sparse CSR matrix.\n  @param[in]\n  m           number of rows of the sparse CSR matrix.\n  @param[out]\n  coo_row_ind array of \\p nnz elements containing the row indices of the sparse COO\n              matrix.\n  @param[in]\n  idx_base    \\ref rocsparse_index_base_zero or \\ref rocsparse_index_base_one.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_size \\p m or \\p nnz is invalid.\n  \\retval     rocsparse_status_invalid_pointer \\p csr_row_ptr or \\p coo_row_ind\n              pointer is invalid.\n  \\retval     rocsparse_status_arch_mismatch the device is not supported.\n\n  \\par Example\n  This example converts a CSR matrix into a COO matrix.\n  \\code{.c}\n      //     1 2 0 3 0\n      // A = 0 4 5 0 0\n      //     6 0 0 7 8\n\n      rocsparse_int m   = 3;\n      rocsparse_int n   = 5;\n      rocsparse_int nnz = 8;\n\n      csr_row_ptr[m+1] = {0, 3, 5, 8};             // device memory\n      csr_col_ind[nnz] = {0, 1, 3, 1, 2, 0, 3, 4}; // device memory\n      csr_val[nnz]     = {1, 2, 3, 4, 5, 6, 7, 8}; // device memory\n\n      // Allocate COO matrix arrays\n      rocsparse_int* coo_row_ind;\n      rocsparse_int* coo_col_ind;\n      float* coo_val;\n\n      hipMalloc((void**)&coo_row_ind, sizeof(rocsparse_int) * nnz);\n      hipMalloc((void**)&coo_col_ind, sizeof(rocsparse_int) * nnz);\n      hipMalloc((void**)&coo_val, sizeof(float) * nnz);\n\n      // Convert the csr row offsets into coo row indices\n      rocsparse_csr2coo(handle,\n                        csr_row_ptr,\n                        nnz,\n                        m,\n                        coo_row_ind,\n                        rocsparse_index_base_zero);\n\n      // Copy the column and value arrays\n      hipMemcpy(coo_col_ind,\n                csr_col_ind,\n                sizeof(rocsparse_int) * nnz,\n                hipMemcpyDeviceToDevice);\n\n      hipMemcpy(coo_val,\n                csr_val,\n                sizeof(float) * nnz,\n                hipMemcpyDeviceToDevice);\n  \\endcode*/\n    pub fn rocsparse_csr2coo(\n        handle: rocsparse_handle,\n        csr_row_ptr: *const rocsparse_int,\n        nnz: rocsparse_int,\n        m: rocsparse_int,\n        coo_row_ind: *mut rocsparse_int,\n        idx_base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup conv_module\n  \\brief Convert a sparse CSR matrix into a sparse CSC matrix\n\n  \\details\n  \\p rocsparse_csr2csc_buffer_size returns the size of the temporary storage buffer\n  required by rocsparse_scsr2csc(), rocsparse_dcsr2csc(), rocsparse_ccsr2csc() and\n  rocsparse_zcsr2csc(). The temporary storage buffer must be allocated by the user.\n\n  \\note\n  This function is non blocking and executed asynchronously with respect to the host.\n  It may return before the actual computation has finished.\n\n  \\note\n  This routine supports execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[in]\n  m           number of rows of the sparse CSR matrix.\n  @param[in]\n  n           number of columns of the sparse CSR matrix.\n  @param[in]\n  nnz         number of non-zero entries of the sparse CSR matrix.\n  @param[in]\n  csr_row_ptr array of \\p m+1 elements that point to the start of every row of the\n              sparse CSR matrix.\n  @param[in]\n  csr_col_ind array of \\p nnz elements containing the column indices of the sparse\n              CSR matrix.\n  @param[in]\n  copy_values \\ref rocsparse_action_symbolic or \\ref rocsparse_action_numeric.\n  @param[out]\n  buffer_size number of bytes of the temporary storage buffer required by\n              rocsparse_scsr2csc(), rocsparse_dcsr2csc(), rocsparse_ccsr2csc() and\n              rocsparse_zcsr2csc().\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_size \\p m, \\p n or \\p nnz is invalid.\n  \\retval     rocsparse_status_invalid_pointer \\p csr_row_ptr, \\p csr_col_ind or\n              \\p buffer_size pointer is invalid.\n  \\retval     rocsparse_status_internal_error an internal error occurred.*/\n    pub fn rocsparse_csr2csc_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        copy_values: rocsparse_action,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief Convert a sparse CSR matrix into a sparse CSC matrix\\n\\n  \\\\details\\n  \\\\p rocsparse_csr2csc converts a CSR matrix into a CSC matrix. \\\\p rocsparse_csr2csc\\n  can also be used to convert a CSC matrix into a CSR matrix. \\\\p copy_values decides\\n  whether \\\\p csc_val is being filled during conversion (\\\\ref rocsparse_action_numeric)\\n  or not (\\\\ref rocsparse_action_symbolic).\\n\\n  \\\\p rocsparse_csr2csc requires extra temporary storage buffer that has to be allocated\\n  by the user. Storage buffer size can be determined by rocsparse_csr2csc_buffer_size().\\n\\n  \\\\note\\n  The resulting matrix can also be seen as the transpose of the input matrix.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  m           number of rows of the sparse CSR matrix.\\n  @param[in]\\n  n           number of columns of the sparse CSR matrix.\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse CSR matrix.\\n  @param[in]\\n  csr_val     array of \\\\p nnz elements of the sparse CSR matrix.\\n  @param[in]\\n  csr_row_ptr array of \\\\p m+1 elements that point to the start of every row of the\\n              sparse CSR matrix.\\n  @param[in]\\n  csr_col_ind array of \\\\p nnz elements containing the column indices of the sparse\\n              CSR matrix.\\n  @param[out]\\n  csc_val     array of \\\\p nnz elements of the sparse CSC matrix.\\n  @param[out]\\n  csc_row_ind array of \\\\p nnz elements containing the row indices of the sparse CSC\\n              matrix.\\n  @param[out]\\n  csc_col_ptr array of \\\\p n+1 elements that point to the start of every column of the\\n              sparse CSC matrix.\\n  @param[in]\\n  copy_values \\\\ref rocsparse_action_symbolic or \\\\ref rocsparse_action_numeric.\\n  @param[in]\\n  idx_base    \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user, size is returned by\\n              rocsparse_csr2csc_buffer_size().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m, \\\\p n or \\\\p nnz is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p csr_val, \\\\p csr_row_ptr,\\n              \\\\p csr_col_ind, \\\\p csc_val, \\\\p csc_row_ind, \\\\p csc_col_ptr or\\n              \\\\p temp_buffer pointer is invalid.\\n  \\\\retval     rocsparse_status_arch_mismatch the device is not supported.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n\\n  \\\\par Example\\n  This example computes the transpose of a CSR matrix.\\n  \\\\code{.c}\\n      //     1 2 0 3 0\\n      // A = 0 4 5 0 0\\n      //     6 0 0 7 8\\n\\n      rocsparse_int m_A   = 3;\\n      rocsparse_int n_A   = 5;\\n      rocsparse_int nnz_A = 8;\\n\\n      csr_row_ptr_A[m+1] = {0, 3, 5, 8};             // device memory\\n      csr_col_ind_A[nnz] = {0, 1, 3, 1, 2, 0, 3, 4}; // device memory\\n      csr_val_A[nnz]     = {1, 2, 3, 4, 5, 6, 7, 8}; // device memory\\n\\n      // Allocate memory for transposed CSR matrix\\n      rocsparse_int m_T   = n_A;\\n      rocsparse_int n_T   = m_A;\\n      rocsparse_int nnz_T = nnz_A;\\n\\n      rocsparse_int* csr_row_ptr_T;\\n      rocsparse_int* csr_col_ind_T;\\n      float* csr_val_T;\\n\\n      hipMalloc((void**)&csr_row_ptr_T, sizeof(rocsparse_int) * (m_T + 1));\\n      hipMalloc((void**)&csr_col_ind_T, sizeof(rocsparse_int) * nnz_T);\\n      hipMalloc((void**)&csr_val_T, sizeof(float) * nnz_T);\\n\\n      // Obtain the temporary buffer size\\n      size_t buffer_size;\\n      rocsparse_csr2csc_buffer_size(handle,\\n                                    m_A,\\n                                    n_A,\\n                                    nnz_A,\\n                                    csr_row_ptr_A,\\n                                    csr_col_ind_A,\\n                                    rocsparse_action_numeric,\\n                                    &buffer_size);\\n\\n      // Allocate temporary buffer\\n      void* temp_buffer;\\n      hipMalloc(&temp_buffer, buffer_size);\\n\\n      rocsparse_scsr2csc(handle,\\n                         m_A,\\n                         n_A,\\n                         nnz_A,\\n                         csr_val_A,\\n                         csr_row_ptr_A,\\n                         csr_col_ind_A,\\n                         csr_val_T,\\n                         csr_col_ind_T,\\n                         csr_row_ptr_T,\\n                         rocsparse_action_numeric,\\n                         rocsparse_index_base_zero,\\n                         temp_buffer);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_scsr2csc(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        csc_val: *mut f32,\n        csc_row_ind: *mut rocsparse_int,\n        csc_col_ptr: *mut rocsparse_int,\n        copy_values: rocsparse_action,\n        idx_base: rocsparse_index_base,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsr2csc(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        csc_val: *mut f64,\n        csc_row_ind: *mut rocsparse_int,\n        csc_col_ptr: *mut rocsparse_int,\n        copy_values: rocsparse_action,\n        idx_base: rocsparse_index_base,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsr2csc(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        csr_val: *const rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        csc_val: *mut rocsparse_float_complex,\n        csc_row_ind: *mut rocsparse_int,\n        csc_col_ptr: *mut rocsparse_int,\n        copy_values: rocsparse_action,\n        idx_base: rocsparse_index_base,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsr2csc(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        csr_val: *const rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        csc_val: *mut rocsparse_double_complex,\n        csc_row_ind: *mut rocsparse_int,\n        csc_col_ptr: *mut rocsparse_int,\n        copy_values: rocsparse_action,\n        idx_base: rocsparse_index_base,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief Convert a sparse CSR matrix into a compressed sparse CSR matrix\\n\\n  \\\\details\\n  \\\\p rocsparse_csr2csr_compress converts a CSR matrix into a compressed CSR matrix by\\n  removing entries in the input CSR matrix that are below a non-negative threshold \\\\p tol\\n\\n  \\\\note\\n  In the case of complex matrices only the magnitude of the real part of \\\\p tol is used.\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle        handle to the rocsparse library context queue.\\n  @param[in]\\n  m             number of rows of the sparse CSR matrix.\\n  @param[in]\\n  n             number of columns of the sparse CSR matrix.\\n  @param[in]\\n  descr_A       matrix descriptor for the CSR matrix\\n  @param[in]\\n  csr_val_A     array of \\\\p nnz_A elements of the sparse CSR matrix.\\n  @param[in]\\n  csr_row_ptr_A array of \\\\p m+1 elements that point to the start of every row of the\\n                uncompressed sparse CSR matrix.\\n  @param[in]\\n  csr_col_ind_A array of \\\\p nnz_A elements containing the column indices of the uncompressed\\n                sparse CSR matrix.\\n  @param[in]\\n  nnz_A         number of elements in the column indices and values arrays of the uncompressed\\n                sparse CSR matrix.\\n  @param[in]\\n  nnz_per_row   array of length \\\\p m containing the number of entries that will be kept per row in\\n                the final compressed CSR matrix.\\n  @param[out]\\n  csr_val_C     array of \\\\p nnz_C elements of the compressed sparse CSC matrix.\\n  @param[out]\\n  csr_row_ptr_C array of \\\\p m+1 elements that point to the start of every column of the compressed\\n                sparse CSR matrix.\\n  @param[out]\\n  csr_col_ind_C array of \\\\p nnz_C elements containing the row indices of the compressed\\n                sparse CSR matrix.\\n  @param[in]\\n  tol           the non-negative tolerance used for compression. If \\\\p tol is complex then only the magnitude\\n                of the real part is used. Entries in the input uncompressed CSR array that are below the tolerance\\n                are removed in output compressed CSR matrix.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m, \\\\p n or \\\\p nnz_A is invalid.\\n  \\\\retval     rocsparse_status_invalid_value \\\\p tol is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p csr_val_A, \\\\p csr_row_ptr_A,\\n              \\\\p csr_col_ind_A, \\\\p csr_val_C, \\\\p csr_row_ptr_C, \\\\p csr_col_ind_C or\\n              \\\\p nnz_per_row pointer is invalid.\\n\\n  \\\\par Example\\n  This example demonstrates how to compress a CSR matrix. Compressing a CSR matrix involves two steps. First we use\\n  nnz_compress() to determine how many entries will be in the final compressed CSR matrix. Then we call csr2csr_compress()\\n  to finish the compression and fill in the column indices and values arrays of the compressed CSR matrix.\\n  \\\\code{.c}\\n      //     1 2 0 3 0\\n      // A = 0 4 5 0 0\\n      //     6 0 0 7 8\\n\\n      float tol = 0.0f;\\n\\n      rocsparse_int m     = 3;\\n      rocsparse_int n     = 5;\\n      rocsparse_int nnz_A = 8;\\n\\n      csr_row_ptr_A[m+1]   = {0, 3, 5, 8};             // device memory\\n      csr_col_ind_A[nnz_A] = {0, 1, 3, 1, 2, 0, 3, 4}; // device memory\\n      csr_val_A[nnz_A]     = {1, 0, 3, 4, 0, 6, 7, 0}; // device memory\\n\\n      // Allocate memory for the row pointer array of the compressed CSR matrix\\n      rocsparse_int* csr_row_ptr_C;\\n      hipMalloc(csr_row_ptr_C, sizeof(rocsparse_int) * (m + 1));\\n\\n      // Allocate memory for the nnz_per_row array\\n      rocsparse_int* nnz_per_row;\\n      hipMalloc(nnz_per_row, sizeof(rocsparse_int) * m);\\n\\n      // Call nnz_compress() which fills in nnz_per_row array and finds the number\\n      // of entries that will be in the compressed CSR matrix\\n      rocsparse_int nnz_C;\\n      nnz_compress(handle,\\n                   m,\\n                   descr_A,\\n                   csr_val_A,\\n                   csr_row_ptr_A,\\n                   nnz_per_row,\\n                   &nnz_C,\\n                   tol);\\n\\n      // Allocate column indices and values array for the compressed CSR matrix\\n      rocsparse_int* csr_col_ind_C;\\n      rocsparse_int* csr_val_C;\\n      hipMalloc(csr_col_ind_C, sizeof(rocsparse_int) * nnz_C;\\n      hipMalloc(csr_val_C, sizeof(rocsparse_int) * nnz_C;\\n\\n      // Finish compression by calling csr2csr_compress()\\n      csr2csr_compress(handle,\\n                       m,\\n                       n,\\n                       descr_A,\\n                       csr_val_A,\\n                       csr_row_ptr_A,\\n                       csr_col_ind_A,\\n                       nnz_A,\\n                       nnz_per_row,\\n                       csr_val_C,\\n                       csr_row_ptr_C,\\n                       csr_col_ind_C,\\n                       tol);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_scsr2csr_compress(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr_A: rocsparse_mat_descr,\n        csr_val_A: *const f32,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        nnz_A: rocsparse_int,\n        nnz_per_row: *const rocsparse_int,\n        csr_val_C: *mut f32,\n        csr_row_ptr_C: *mut rocsparse_int,\n        csr_col_ind_C: *mut rocsparse_int,\n        tol: f32,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsr2csr_compress(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr_A: rocsparse_mat_descr,\n        csr_val_A: *const f64,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        nnz_A: rocsparse_int,\n        nnz_per_row: *const rocsparse_int,\n        csr_val_C: *mut f64,\n        csr_row_ptr_C: *mut rocsparse_int,\n        csr_col_ind_C: *mut rocsparse_int,\n        tol: f64,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsr2csr_compress(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr_A: rocsparse_mat_descr,\n        csr_val_A: *const rocsparse_float_complex,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        nnz_A: rocsparse_int,\n        nnz_per_row: *const rocsparse_int,\n        csr_val_C: *mut rocsparse_float_complex,\n        csr_row_ptr_C: *mut rocsparse_int,\n        csr_col_ind_C: *mut rocsparse_int,\n        tol: rocsparse_float_complex,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsr2csr_compress(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr_A: rocsparse_mat_descr,\n        csr_val_A: *const rocsparse_double_complex,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        nnz_A: rocsparse_int,\n        nnz_per_row: *const rocsparse_int,\n        csr_val_C: *mut rocsparse_double_complex,\n        csr_row_ptr_C: *mut rocsparse_int,\n        csr_col_ind_C: *mut rocsparse_int,\n        tol: rocsparse_double_complex,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief\\n  This function converts the sparse matrix in CSR format into a dense matrix.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n\\n  @param[in]\\n  m           number of rows of the dense matrix \\\\p A.\\n\\n  @param[in]\\n  n           number of columns of the dense matrix \\\\p A.\\n\\n  @param[in]\\n  descr       the descriptor of the dense matrix \\\\p A, the supported matrix type is \\\\ref rocsparse_matrix_type_general and also any valid value of the \\\\ref rocsparse_index_base.\\n\\n  @param[in]\\n  csr_val     array of nnz ( = \\\\p csr_row_ptr[m] - \\\\p csr_row_ptr[0] ) nonzero elements of matrix \\\\p A.\\n  @param[in]\\n  csr_row_ptr integer array of m+1 elements that contains the start of every row and the end of the last row plus one.\\n  @param[in]\\n  csr_col_ind integer array of nnz ( = \\\\p csr_row_ptr[m] - csr_row_ptr[0] ) column indices of the non-zero elements of matrix \\\\p A.\\n\\n  @param[out]\\n  A           array of dimensions (\\\\p ld, \\\\p n)\\n\\n  @param[out]\\n  ld          leading dimension of dense array \\\\p A.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p n or \\\\p ld is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p A or \\\\p csr_val \\\\p csr_row_ptr or \\\\p csr_col_ind\\n              pointer is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_scsr2dense(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        A: *mut f32,\n        ld: rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsr2dense(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        A: *mut f64,\n        ld: rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsr2dense(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        A: *mut rocsparse_float_complex,\n        ld: rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsr2dense(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        A: *mut rocsparse_double_complex,\n        ld: rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup conv_module\n  \\brief Convert a sparse CSR matrix into a sparse ELL matrix\n\n  \\details\n  \\p rocsparse_csr2ell_width computes the maximum of the per row non-zero elements\n  over all rows, the ELL \\p width, for a given CSR matrix.\n\n  \\note\n  This function is non blocking and executed asynchronously with respect to the host.\n  It may return before the actual computation has finished.\n\n  \\note\n  This routine supports execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[in]\n  m           number of rows of the sparse CSR matrix.\n  @param[in]\n  csr_descr   descriptor of the sparse CSR matrix. Currently, only\n              \\ref rocsparse_matrix_type_general is supported.\n  @param[in]\n  csr_row_ptr array of \\p m+1 elements that point to the start of every row of the\n              sparse CSR matrix.\n  @param[in]\n  ell_descr   descriptor of the sparse ELL matrix. Currently, only\n              \\ref rocsparse_matrix_type_general is supported.\n  @param[out]\n  ell_width   pointer to the number of non-zero elements per row in ELL storage\n              format.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_size \\p m is invalid.\n  \\retval     rocsparse_status_invalid_pointer \\p csr_descr, \\p csr_row_ptr, or\n              \\p ell_width pointer is invalid.\n  \\retval     rocsparse_status_internal_error an internal error occurred.\n  \\retval     rocsparse_status_not_implemented\n              \\ref rocsparse_matrix_type != \\ref rocsparse_matrix_type_general.*/\n    pub fn rocsparse_csr2ell_width(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_row_ptr: *const rocsparse_int,\n        ell_descr: rocsparse_mat_descr,\n        ell_width: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief Convert a sparse CSR matrix into a sparse ELL matrix\\n\\n  \\\\details\\n  \\\\p rocsparse_csr2ell converts a CSR matrix into an ELL matrix. It is assumed,\\n  that \\\\p ell_val and \\\\p ell_col_ind are allocated. Allocation size is computed by the\\n  number of rows times the number of ELL non-zero elements per row, such that\\n  \\\\f$\\\\text{nnz}_{\\\\text{ELL}} = m \\\\cdot \\\\text{ell_width}\\\\f$. The number of ELL\\n  non-zero elements per row is obtained by rocsparse_csr2ell_width().\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  m           number of rows of the sparse CSR matrix.\\n  @param[in]\\n  csr_descr   descriptor of the sparse CSR matrix. Currently, only\\n              \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  csr_val     array containing the values of the sparse CSR matrix.\\n  @param[in]\\n  csr_row_ptr array of \\\\p m+1 elements that point to the start of every row of the\\n              sparse CSR matrix.\\n  @param[in]\\n  csr_col_ind array containing the column indices of the sparse CSR matrix.\\n  @param[in]\\n  ell_descr   descriptor of the sparse ELL matrix. Currently, only\\n              \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  ell_width   number of non-zero elements per row in ELL storage format.\\n  @param[out]\\n  ell_val     array of \\\\p m times \\\\p ell_width elements of the sparse ELL matrix.\\n  @param[out]\\n  ell_col_ind array of \\\\p m times \\\\p ell_width elements containing the column indices\\n              of the sparse ELL matrix.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p ell_width is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p csr_descr, \\\\p csr_val,\\n              \\\\p csr_row_ptr, \\\\p csr_col_ind, \\\\p ell_descr, \\\\p ell_val or\\n              \\\\p ell_col_ind pointer is invalid.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n\\n  \\\\par Example\\n  This example converts a CSR matrix into an ELL matrix.\\n  \\\\code{.c}\\n      //     1 2 0 3 0\\n      // A = 0 4 5 0 0\\n      //     6 0 0 7 8\\n\\n      rocsparse_int m   = 3;\\n      rocsparse_int n   = 5;\\n      rocsparse_int nnz = 8;\\n\\n      csr_row_ptr[m+1] = {0, 3, 5, 8};             // device memory\\n      csr_col_ind[nnz] = {0, 1, 3, 1, 2, 0, 3, 4}; // device memory\\n      csr_val[nnz]     = {1, 2, 3, 4, 5, 6, 7, 8}; // device memory\\n\\n      // Create ELL matrix descriptor\\n      rocsparse_mat_descr ell_descr;\\n      rocsparse_create_mat_descr(&ell_descr);\\n\\n      // Obtain the ELL width\\n      rocsparse_int ell_width;\\n      rocsparse_csr2ell_width(handle,\\n                              m,\\n                              csr_descr,\\n                              csr_row_ptr,\\n                              ell_descr,\\n                              &ell_width);\\n\\n      // Compute ELL non-zero entries\\n      rocsparse_int ell_nnz = m * ell_width;\\n\\n      // Allocate ELL column and value arrays\\n      rocsparse_int* ell_col_ind;\\n      hipMalloc((void**)&ell_col_ind, sizeof(rocsparse_int) * ell_nnz);\\n\\n      float* ell_val;\\n      hipMalloc((void**)&ell_val, sizeof(float) * ell_nnz);\\n\\n      // Format conversion\\n      rocsparse_scsr2ell(handle,\\n                         m,\\n                         csr_descr,\\n                         csr_val,\\n                         csr_row_ptr,\\n                         csr_col_ind,\\n                         ell_descr,\\n                         ell_width,\\n                         ell_val,\\n                         ell_col_ind);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_scsr2ell(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        ell_descr: rocsparse_mat_descr,\n        ell_width: rocsparse_int,\n        ell_val: *mut f32,\n        ell_col_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsr2ell(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        ell_descr: rocsparse_mat_descr,\n        ell_width: rocsparse_int,\n        ell_val: *mut f64,\n        ell_col_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsr2ell(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        ell_descr: rocsparse_mat_descr,\n        ell_width: rocsparse_int,\n        ell_val: *mut rocsparse_float_complex,\n        ell_col_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsr2ell(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        ell_descr: rocsparse_mat_descr,\n        ell_width: rocsparse_int,\n        ell_val: *mut rocsparse_double_complex,\n        ell_col_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief\\n  \\\\details\\n  \\\\p rocsparse_csr2gebsr_buffer_size returns the size of the temporary buffer that\\n  is required by \\\\p rocsparse_csr2gebcsr_nnz, \\\\p rocsparse_scsr2gebcsr, \\\\p rocsparse_dcsr2gebsr,\\n  \\\\p rocsparse_ccsr2gebsr and \\\\p rocsparse_zcsr2gebsr. The temporary storage buffer must be\\n  allocated by the user.\\n\\n  This function computes the number of nonzero block columns per row and the total number of nonzero blocks in a sparse\\n  GEneral BSR matrix given a sparse CSR matrix as input.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n\\n  @param[in]\\n  dir         direction that specified whether to count nonzero elements by \\\\ref rocsparse_direction_row or by\\n              \\\\ref rocsparse_direction_row.\\n\\n  @param[in]\\n  m           number of rows of the sparse CSR matrix.\\n\\n  @param[in]\\n  n           number of columns of the sparse CSR matrix.\\n\\n  @param[in]\\n  csr_descr    descriptor of the sparse CSR matrix. Currently, only\\n               \\\\ref rocsparse_matrix_type_general is supported.\\n\\n  @param[in]\\n  csr_val      array of \\\\p nnz elements containing the values of the sparse CSR matrix.\\n\\n  @param[in]\\n  csr_row_ptr  integer array containing \\\\p m+1 elements that point to the start of each row of the CSR matrix\\n\\n  @param[in]\\n  csr_col_ind  integer array of the column indices for each non-zero element in the CSR matrix\\n\\n  @param[in]\\n  row_block_dim   the row block dimension of the GEneral BSR matrix. Between 1 and \\\\p m\\n\\n  @param[in]\\n  col_block_dim   the col block dimension of the GEneral BSR matrix. Between 1 and \\\\p n\\n\\n  @param[out]\\n  buffer_size  number of bytes of the temporary storage buffer required by \\\\p rocsparse_csr2gebsr_nnz and \\\\p rocsparse_Xcsr2gebsr.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p n or \\\\p row_block_dim  \\\\p col_block_dim is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p csr_val or \\\\p csr_row_ptr or \\\\p csr_col_ind or \\\\p bsr_row_ptr or \\\\p buffer_size\\n              pointer is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_scsr2gebsr_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsr2gebsr_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsr2gebsr_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsr2gebsr_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief\\n  This function computes the number of nonzero block columns per row and the total number of nonzero blocks in a sparse\\n  GEneral BSR matrix given a sparse CSR matrix as input.\\n\\n  \\\\details\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n\\n  @param[in]\\n  dir         direction that specified whether to count nonzero elements by \\\\ref rocsparse_direction_row or by\\n              \\\\ref rocsparse_direction_row.\\n\\n  @param[in]\\n  m           number of rows of the sparse CSR matrix.\\n\\n  @param[in]\\n  n           number of columns of the sparse CSR matrix.\\n\\n  @param[in]\\n  csr_descr    descriptor of the sparse CSR matrix. Currently, only\\n               \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  csr_row_ptr integer array containing \\\\p m+1 elements that point to the start of each row of the CSR matrix\\n\\n  @param[in]\\n  csr_col_ind integer array of the column indices for each non-zero element in the CSR matrix\\n\\n  @param[in]\\n  bsr_descr    descriptor of the sparse GEneral BSR matrix. Currently, only\\n               \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[out]\\n  bsr_row_ptr integer array containing \\\\p mb+1 elements that point to the start of each block row of the General BSR matrix\\n\\n  @param[in]\\n  row_block_dim   the row block dimension of the GEneral BSR matrix. Between 1 and min(m, n)\\n\\n  @param[in]\\n  col_block_dim   the col block dimension of the GEneral BSR matrix. Between 1 and min(m, n)\\n\\n  @param[out]\\n  bsr_nnz_devhost  total number of nonzero elements in device or host memory.\\n\\n  @param[in]\\n  temp_buffer    buffer allocated by the user whose size is determined by calling \\\\p rocsparse_xcsr2gebsr_buffer_size.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p n or \\\\p row_block_dim \\\\p col_block_dim is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p csr_row_ptr or \\\\p csr_col_ind or \\\\p bsr_row_ptr or \\\\p bsr_nnz_devhost\\n              pointer is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_csr2gebsr_nnz(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        bsr_descr: rocsparse_mat_descr,\n        bsr_row_ptr: *mut rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        bsr_nnz_devhost: *mut rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief Convert a sparse CSR matrix into a sparse GEneral BSR matrix\\n\\n  \\\\details\\n  \\\\p rocsparse_csr2gebsr converts a CSR matrix into a GEneral BSR matrix. It is assumed,\\n  that \\\\p bsr_val, \\\\p bsr_col_ind and \\\\p bsr_row_ptr are allocated. Allocation size\\n  for \\\\p bsr_row_ptr is computed as \\\\p mb+1 where \\\\p mb is the number of block rows in\\n  the GEneral BSR matrix. Allocation size for \\\\p bsr_val and \\\\p bsr_col_ind is computed using\\n  \\\\p csr2gebsr_nnz() which also fills in \\\\p bsr_row_ptr.\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle       handle to the rocsparse library context queue.\\n  @param[in]\\n  dir          the storage format of the blocks, \\\\ref rocsparse_direction_row or \\\\ref rocsparse_direction_column\\n  @param[in]\\n  m            number of rows in the sparse CSR matrix.\\n  @param[in]\\n  n            number of columns in the sparse CSR matrix.\\n  @param[in]\\n  csr_descr    descriptor of the sparse CSR matrix. Currently, only\\n               \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  csr_val      array of \\\\p nnz elements containing the values of the sparse CSR matrix.\\n  @param[in]\\n  csr_row_ptr  array of \\\\p m+1 elements that point to the start of every row of the\\n               sparse CSR matrix.\\n  @param[in]\\n  csr_col_ind  array of \\\\p nnz elements containing the column indices of the sparse CSR matrix.\\n  @param[in]\\n  bsr_descr    descriptor of the sparse BSR matrix. Currently, only\\n               \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[out]\\n  bsr_val      array of \\\\p nnzb* \\\\p row_block_dim* \\\\p col_block_dim containing the values of the sparse BSR matrix.\\n  @param[out]\\n  bsr_row_ptr  array of \\\\p mb+1 elements that point to the start of every block row of the\\n               sparse BSR matrix.\\n  @param[out]\\n  bsr_col_ind  array of \\\\p nnzb elements containing the block column indices of the sparse BSR matrix.\\n  @param[in]\\n  row_block_dim    row size of the blocks in the sparse GEneral BSR matrix.\\n  @param[in]\\n  col_block_dim    col size of the blocks in the sparse GEneral BSR matrix.\\n  @param[in]\\n  temp_buffer    buffer allocated by the user whose size is determined by calling \\\\p rocsparse_xcsr2gebsr_buffer_size.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p n or \\\\p row_block_dim or \\\\p col_block_dim is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p bsr_val,\\n              \\\\p bsr_row_ptr, \\\\p bsr_col_ind, \\\\p csr_val, \\\\p csr_row_ptr or\\n              \\\\p csr_col_ind pointer is invalid.\\n\\n  \\\\par Example\\n  This example converts a CSR matrix into an BSR matrix.\\n  \\\\code{.c}\\n      //     1 4 0 0 0 0\\n      // A = 0 2 3 0 0 0\\n      //     5 0 0 7 8 0\\n      //     0 0 9 0 6 0\\n\\n      rocsparse_int m   = 4;\\n      rocsparse_int n   = 6;\\n      rocsparse_int row_block_dim = 2;\\n      rocsparse_int col_block_dim = 3;\\n      rocsparse_int nnz = 9;\\n      rocsparse_int mb = (m + row_block_dim - 1) / row_block_dim;\\n      rocsparse_int nb = (n + col_block_dim - 1) / col_block_dim;\\n\\n      csr_row_ptr[m+1]  = {0, 2, 4, 7, 9};             // device memory\\n      csr_col_ind[nnz]  = {0, 1, 1, 2, 0, 3, 4, 2, 4}; // device memory\\n      csr_val[nnz]      = {1, 4, 2, 3, 5, 7, 8, 9, 6}; // device memory\\n\\n      hipMalloc(&bsr_row_ptr, sizeof(rocsparse_int) *(mb + 1));\\n      rocsparse_int nnzb;\\n      rocsparse_int* nnzTotalHostPtr = &nnzb;\\n      csr2gebsr_nnz(handle,\\n                  rocsparse_direction_row,\\n                  m,\\n                  n,\\n                  csr_descr,\\n                  csr_row_ptr,\\n                  csr_col_ind,\\n                  row_block_dim,\\n                  col_block_dim,\\n                  bsr_descr,\\n                  bsr_row_ptr,\\n                  nnzTotalHostPtr);\\n      nnzb = *nnzTotalHostPtr;\\n      hipMalloc(&bsr_col_ind, sizeof(int)*nnzb);\\n      hipMalloc(&bsr_val, sizeof(float)*(row_block_dim * col_block_dim) * nnzb);\\n      scsr2gebsr(handle,\\n               rocsparse_direction_row,\\n               m,\\n               n,\\n               csr_descr,\\n               csr_val,\\n               csr_row_ptr,\\n               csr_col_ind,\\n               row_block_dim,\\n               col_block_dim,\\n               bsr_descr,\\n               bsr_val,\\n               bsr_row_ptr,\\n               bsr_col_ind);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_scsr2gebsr(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        bsr_descr: rocsparse_mat_descr,\n        bsr_val: *mut f32,\n        bsr_row_ptr: *mut rocsparse_int,\n        bsr_col_ind: *mut rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsr2gebsr(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        bsr_descr: rocsparse_mat_descr,\n        bsr_val: *mut f64,\n        bsr_row_ptr: *mut rocsparse_int,\n        bsr_col_ind: *mut rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsr2gebsr(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        bsr_descr: rocsparse_mat_descr,\n        bsr_val: *mut rocsparse_float_complex,\n        bsr_row_ptr: *mut rocsparse_int,\n        bsr_col_ind: *mut rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsr2gebsr(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        bsr_descr: rocsparse_mat_descr,\n        bsr_val: *mut rocsparse_double_complex,\n        bsr_row_ptr: *mut rocsparse_int,\n        bsr_col_ind: *mut rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief Convert a sparse CSR matrix into a sparse HYB matrix\\n\\n  \\\\details\\n  \\\\p rocsparse_csr2hyb converts a CSR matrix into a HYB matrix. It is assumed\\n  that \\\\p hyb has been initialized with rocsparse_create_hyb_mat().\\n\\n  \\\\note\\n  This function requires a significant amount of storage for the HYB matrix,\\n  depending on the matrix structure.\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle          handle to the rocsparse library context queue.\\n  @param[in]\\n  m               number of rows of the sparse CSR matrix.\\n  @param[in]\\n  n               number of columns of the sparse CSR matrix.\\n  @param[in]\\n  descr           descriptor of the sparse CSR matrix. Currently, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  csr_val         array containing the values of the sparse CSR matrix.\\n  @param[in]\\n  csr_row_ptr     array of \\\\p m+1 elements that point to the start of every row of the\\n                  sparse CSR matrix.\\n  @param[in]\\n  csr_col_ind     array containing the column indices of the sparse CSR matrix.\\n  @param[out]\\n  hyb             sparse matrix in HYB format.\\n  @param[in]\\n  user_ell_width  width of the ELL part of the HYB matrix (only required if\\n                  \\\\p partition_type == \\\\ref rocsparse_hyb_partition_user).\\n  @param[in]\\n  partition_type  \\\\ref rocsparse_hyb_partition_auto (recommended),\\n                  \\\\ref rocsparse_hyb_partition_user or\\n                  \\\\ref rocsparse_hyb_partition_max.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m, \\\\p n or \\\\p user_ell_width is invalid.\\n  \\\\retval     rocsparse_status_invalid_value \\\\p partition_type is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p hyb, \\\\p csr_val,\\n              \\\\p csr_row_ptr or \\\\p csr_col_ind pointer is invalid.\\n  \\\\retval     rocsparse_status_memory_error the buffer for the HYB matrix could not be\\n              allocated.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n\\n  \\\\par Example\\n  This example converts a CSR matrix into a HYB matrix using user defined partitioning.\\n  \\\\code{.c}\\n      // Create HYB matrix structure\\n      rocsparse_hyb_mat hyb;\\n      rocsparse_create_hyb_mat(&hyb);\\n\\n      // User defined ell width\\n      rocsparse_int user_ell_width = 5;\\n\\n      // Perform the conversion\\n      rocsparse_scsr2hyb(handle,\\n                         m,\\n                         n,\\n                         descr,\\n                         csr_val,\\n                         csr_row_ptr,\\n                         csr_col_ind,\\n                         hyb,\\n                         user_ell_width,\\n                         rocsparse_hyb_partition_user);\\n\\n      // Do some work\\n\\n      // Clean up\\n      rocsparse_destroy_hyb_mat(hyb);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_scsr2hyb(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        hyb: rocsparse_hyb_mat,\n        user_ell_width: rocsparse_int,\n        partition_type: rocsparse_hyb_partition,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsr2hyb(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        hyb: rocsparse_hyb_mat,\n        user_ell_width: rocsparse_int,\n        partition_type: rocsparse_hyb_partition,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsr2hyb(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        hyb: rocsparse_hyb_mat,\n        user_ell_width: rocsparse_int,\n        partition_type: rocsparse_hyb_partition,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsr2hyb(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        hyb: rocsparse_hyb_mat,\n        user_ell_width: rocsparse_int,\n        partition_type: rocsparse_hyb_partition,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup conv_module\n  \\brief Sort a sparse CSR matrix\n\n  \\details\n  \\p rocsparse_csrsort_buffer_size returns the size of the temporary storage buffer\n  required by rocsparse_csrsort(). The temporary storage buffer must be allocated by\n  the user.\n\n  \\note\n  This function is non blocking and executed asynchronously with respect to the host.\n  It may return before the actual computation has finished.\n\n  \\note\n  This routine supports execution in a hipGraph context.\n\n  @param[in]\n  handle          handle to the rocsparse library context queue.\n  @param[in]\n  m               number of rows of the sparse CSR matrix.\n  @param[in]\n  n               number of columns of the sparse CSR matrix.\n  @param[in]\n  nnz             number of non-zero entries of the sparse CSR matrix.\n  @param[in]\n  csr_row_ptr     array of \\p m+1 elements that point to the start of every row of the\n                  sparse CSR matrix.\n  @param[in]\n  csr_col_ind     array of \\p nnz elements containing the column indices of the sparse\n                  CSR matrix.\n  @param[out]\n  buffer_size     number of bytes of the temporary storage buffer required by\n                  rocsparse_csrsort().\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_size \\p m, \\p n or \\p nnz is invalid.\n  \\retval     rocsparse_status_invalid_pointer \\p csr_row_ptr, \\p csr_col_ind or\n              \\p buffer_size pointer is invalid.*/\n    pub fn rocsparse_csrsort_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup conv_module\n  \\brief Sort a sparse CSR matrix\n\n  \\details\n  \\p rocsparse_csrsort sorts a matrix in CSR format. The sorted permutation vector\n  \\p perm can be used to obtain sorted \\p csr_val array. In this case, \\p perm must be\n  initialized as the identity permutation, see rocsparse_create_identity_permutation().\n\n  \\p rocsparse_csrsort requires extra temporary storage buffer that has to be allocated by\n  the user. Storage buffer size can be determined by rocsparse_csrsort_buffer_size().\n\n  \\note\n  \\p perm can be \\p NULL if a sorted permutation vector is not required.\n\n  \\note\n  This function is non blocking and executed asynchronously with respect to the host.\n  It may return before the actual computation has finished.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle          handle to the rocsparse library context queue.\n  @param[in]\n  m               number of rows of the sparse CSR matrix.\n  @param[in]\n  n               number of columns of the sparse CSR matrix.\n  @param[in]\n  nnz             number of non-zero entries of the sparse CSR matrix.\n  @param[in]\n  descr           descriptor of the sparse CSR matrix. Currently, only\n                  \\ref rocsparse_matrix_type_general is supported.\n  @param[in]\n  csr_row_ptr     array of \\p m+1 elements that point to the start of every row of the\n                  sparse CSR matrix.\n  @param[inout]\n  csr_col_ind     array of \\p nnz elements containing the column indices of the sparse\n                  CSR matrix.\n  @param[inout]\n  perm            array of \\p nnz integers containing the unsorted map indices, can be\n                  \\p NULL.\n  @param[in]\n  temp_buffer     temporary storage buffer allocated by the user, size is returned by\n                  rocsparse_csrsort_buffer_size().\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_size \\p m, \\p n or \\p nnz is invalid.\n  \\retval     rocsparse_status_invalid_pointer \\p descr, \\p csr_row_ptr, \\p csr_col_ind\n              or \\p temp_buffer pointer is invalid.\n  \\retval     rocsparse_status_internal_error an internal error occurred.\n  \\retval     rocsparse_status_not_implemented\n              \\ref rocsparse_matrix_type != \\ref rocsparse_matrix_type_general.\n\n  \\par Example\n  The following example sorts a \\f$3 \\times 3\\f$ CSR matrix.\n  \\code{.c}\n      //     1 2 3\n      // A = 4 5 6\n      //     7 8 9\n      rocsparse_int m   = 3;\n      rocsparse_int n   = 3;\n      rocsparse_int nnz = 9;\n\n      csr_row_ptr[m + 1] = {0, 3, 6, 9};                // device memory\n      csr_col_ind[nnz]   = {2, 0, 1, 0, 1, 2, 0, 2, 1}; // device memory\n      csr_val[nnz]       = {3, 1, 2, 4, 5, 6, 7, 9, 8}; // device memory\n\n      // Create permutation vector perm as the identity map\n      rocsparse_int* perm;\n      hipMalloc((void**)&perm, sizeof(rocsparse_int) * nnz);\n      rocsparse_create_identity_permutation(handle, nnz, perm);\n\n      // Allocate temporary buffer\n      size_t buffer_size;\n      void* temp_buffer;\n      rocsparse_csrsort_buffer_size(handle, m, n, nnz, csr_row_ptr, csr_col_ind, &buffer_size);\n      hipMalloc(&temp_buffer, buffer_size);\n\n      // Sort the CSR matrix\n      rocsparse_csrsort(handle, m, n, nnz, descr, csr_row_ptr, csr_col_ind, perm, temp_buffer);\n\n      // Gather sorted csr_val array\n      float* csr_val_sorted;\n      hipMalloc((void**)&csr_val_sorted, sizeof(float) * nnz);\n      rocsparse_sgthr(handle, nnz, csr_val, csr_val_sorted, perm, rocsparse_index_base_zero);\n\n      // Clean up\n      hipFree(temp_buffer);\n      hipFree(perm);\n      hipFree(csr_val);\n  \\endcode*/\n    pub fn rocsparse_csrsort(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *mut rocsparse_int,\n        perm: *mut rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief\\n\\n  This function converts the matrix A in dense format into a sparse matrix in COO format.\\n  All the parameters are assumed to have been pre-allocated by the user and the arrays are\\n  filled in based on nnz_per_rows, which can be pre-computed with rocsparse_xnnz().\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n\\n  @param[in]\\n  m           number of rows of the dense matrix \\\\p A.\\n\\n  @param[in]\\n  n           number of columns of the dense matrix \\\\p A.\\n\\n  @param[in]\\n  descr      the descriptor of the dense matrix \\\\p A, the supported matrix type is rocsparse_matrix_type_general and also any valid value of the \\\\ref rocsparse_index_base.\\n\\n  @param[in]\\n  A           array of dimensions (\\\\p ld, \\\\p n)\\n\\n  @param[in]\\n  ld         leading dimension of dense array \\\\p A.\\n\\n  @param[in]\\n  nnz_per_rows   array of size \\\\p n containing the number of non-zero elements per row.\\n\\n  @param[out]\\n  coo_val\\n              array of nnz nonzero elements of matrix \\\\p A.\\n  @param[out]\\n  coo_row_ind\\n              integer array of nnz row indices of the non-zero elements of matrix \\\\p A.\\n  @param[out]\\n  coo_col_ind integer array of nnz column indices of the non-zero elements of matrix \\\\p A.\\n\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p n or \\\\p ld is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p A or \\\\p nnz_per_rows or \\\\p coo_val \\\\p coo_col_ind or \\\\p coo_row_ind\\n              pointer is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_sdense2coo(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        A: *const f32,\n        ld: rocsparse_int,\n        nnz_per_rows: *const rocsparse_int,\n        coo_val: *mut f32,\n        coo_row_ind: *mut rocsparse_int,\n        coo_col_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ddense2coo(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        A: *const f64,\n        ld: rocsparse_int,\n        nnz_per_rows: *const rocsparse_int,\n        coo_val: *mut f64,\n        coo_row_ind: *mut rocsparse_int,\n        coo_col_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cdense2coo(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        A: *const rocsparse_float_complex,\n        ld: rocsparse_int,\n        nnz_per_rows: *const rocsparse_int,\n        coo_val: *mut rocsparse_float_complex,\n        coo_row_ind: *mut rocsparse_int,\n        coo_col_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zdense2coo(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        A: *const rocsparse_double_complex,\n        ld: rocsparse_int,\n        nnz_per_rows: *const rocsparse_int,\n        coo_val: *mut rocsparse_double_complex,\n        coo_row_ind: *mut rocsparse_int,\n        coo_col_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief\\n\\n  This function converts the matrix A in dense format into a sparse matrix in CSC format.\\n  All the parameters are assumed to have been pre-allocated by the user and the arrays are\\n  filled in based on nnz_per_columns, which can be pre-computed with rocsparse_xnnz().\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n\\n  @param[in]\\n  m           number of rows of the dense matrix \\\\p A.\\n\\n  @param[in]\\n  n           number of columns of the dense matrix \\\\p A.\\n\\n  @param[in]\\n  descr      the descriptor of the dense matrix \\\\p A, the supported matrix type is rocsparse_matrix_type_general and also any valid value of the \\\\ref rocsparse_index_base.\\n\\n  @param[in]\\n  A           array of dimensions (\\\\p ld, \\\\p n)\\n\\n  @param[in]\\n  ld         leading dimension of dense array \\\\p A.\\n\\n  @param[in]\\n  nnz_per_columns   array of size \\\\p n containing the number of non-zero elements per column.\\n\\n  @param[out]\\n  csc_val\\n              array of nnz ( = \\\\p csc_col_ptr[m] - \\\\p csc_col_ptr[0] ) nonzero elements of matrix \\\\p A.\\n  @param[out]\\n  csc_col_ptr\\n              integer array of m+1 elements that contains the start of every column and the end of the last column plus one.\\n  @param[out]\\n  csc_row_ind\\n              integer array of nnz ( = \\\\p csc_col_ptr[m] - csc_col_ptr[0] ) column indices of the non-zero elements of matrix \\\\p A.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p n or \\\\p ld is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p A or \\\\p nnz_per_columns or \\\\p csc_val \\\\p csc_col_ptr or \\\\p csc_row_ind\\n              pointer is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_sdense2csc(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        A: *const f32,\n        ld: rocsparse_int,\n        nnz_per_columns: *const rocsparse_int,\n        csc_val: *mut f32,\n        csc_col_ptr: *mut rocsparse_int,\n        csc_row_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ddense2csc(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        A: *const f64,\n        ld: rocsparse_int,\n        nnz_per_columns: *const rocsparse_int,\n        csc_val: *mut f64,\n        csc_col_ptr: *mut rocsparse_int,\n        csc_row_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cdense2csc(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        A: *const rocsparse_float_complex,\n        ld: rocsparse_int,\n        nnz_per_columns: *const rocsparse_int,\n        csc_val: *mut rocsparse_float_complex,\n        csc_col_ptr: *mut rocsparse_int,\n        csc_row_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zdense2csc(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        A: *const rocsparse_double_complex,\n        ld: rocsparse_int,\n        nnz_per_columns: *const rocsparse_int,\n        csc_val: *mut rocsparse_double_complex,\n        csc_col_ptr: *mut rocsparse_int,\n        csc_row_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief\\n  This function converts the matrix A in dense format into a sparse matrix in CSR format.\\n  All the parameters are assumed to have been pre-allocated by the user and the arrays are filled in based on nnz_per_row, which can be pre-computed with rocsparse_xnnz().\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n\\n  @param[in]\\n  m           number of rows of the dense matrix \\\\p A.\\n\\n  @param[in]\\n  n           number of columns of the dense matrix \\\\p A.\\n\\n  @param[in]\\n  descr      the descriptor of the dense matrix \\\\p A, the supported matrix type is rocsparse_matrix_type_general and also any valid value of the \\\\ref rocsparse_index_base.\\n\\n  @param[in]\\n  A           array of dimensions (\\\\p ld, \\\\p n)\\n\\n  @param[in]\\n  ld         leading dimension of dense array \\\\p A.\\n\\n  @param[in]\\n  nnz_per_rows   array of size \\\\p n containing the number of non-zero elements per row.\\n\\n  @param[out]\\n  csr_val\\n              array of nnz ( = \\\\p csr_row_ptr[m] - \\\\p csr_row_ptr[0] ) nonzero elements of matrix \\\\p A.\\n  @param[out]\\n  csr_row_ptr\\n              integer array of m+1 elements that contains the start of every row and the end of the last row plus one.\\n  @param[out]\\n  csr_col_ind\\n              integer array of nnz ( = \\\\p csr_row_ptr[m] - csr_row_ptr[0] ) column indices of the non-zero elements of matrix \\\\p A.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p n or \\\\p ld is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p A or \\\\p nnz_per_rows or \\\\p csr_val \\\\p csr_row_ptr or \\\\p csr_col_ind\\n              pointer is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_sdense2csr(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        A: *const f32,\n        ld: rocsparse_int,\n        nnz_per_rows: *const rocsparse_int,\n        csr_val: *mut f32,\n        csr_row_ptr: *mut rocsparse_int,\n        csr_col_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ddense2csr(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        A: *const f64,\n        ld: rocsparse_int,\n        nnz_per_rows: *const rocsparse_int,\n        csr_val: *mut f64,\n        csr_row_ptr: *mut rocsparse_int,\n        csr_col_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cdense2csr(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        A: *const rocsparse_float_complex,\n        ld: rocsparse_int,\n        nnz_per_rows: *const rocsparse_int,\n        csr_val: *mut rocsparse_float_complex,\n        csr_row_ptr: *mut rocsparse_int,\n        csr_col_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zdense2csr(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        A: *const rocsparse_double_complex,\n        ld: rocsparse_int,\n        nnz_per_rows: *const rocsparse_int,\n        csr_val: *mut rocsparse_double_complex,\n        csr_row_ptr: *mut rocsparse_int,\n        csr_col_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup conv_module\n  \\brief Convert a sparse ELL matrix into a sparse CSR matrix\n\n  \\details\n  \\p rocsparse_ell2csr_nnz computes the total CSR non-zero elements and the CSR\n  row offsets, that point to the start of every row of the sparse CSR matrix, for\n  a given ELL matrix. It is assumed that \\p csr_row_ptr has been allocated with\n  size \\p m+1.\n\n  \\note\n  This function is blocking with respect to the host.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[in]\n  m           number of rows of the sparse ELL matrix.\n  @param[in]\n  n           number of columns of the sparse ELL matrix.\n  @param[in]\n  ell_descr   descriptor of the sparse ELL matrix. Currently, only\n              \\ref rocsparse_matrix_type_general is supported.\n  @param[in]\n  ell_width   number of non-zero elements per row in ELL storage format.\n  @param[in]\n  ell_col_ind array of \\p m times \\p ell_width elements containing the column indices\n              of the sparse ELL matrix.\n  @param[in]\n  csr_descr   descriptor of the sparse CSR matrix. Currently, only\n              \\ref rocsparse_matrix_type_general is supported.\n  @param[out]\n  csr_row_ptr array of \\p m+1 elements that point to the start of every row of the\n              sparse CSR matrix.\n  @param[out]\n  csr_nnz     pointer to the total number of non-zero elements in CSR storage\n              format.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_size \\p m, \\p n or \\p ell_width is invalid.\n  \\retval     rocsparse_status_invalid_pointer \\p ell_descr, \\p ell_col_ind,\n              \\p csr_descr, \\p csr_row_ptr or \\p csr_nnz pointer is invalid.\n  \\retval     rocsparse_status_not_implemented\n              \\ref rocsparse_matrix_type != \\ref rocsparse_matrix_type_general.*/\n    pub fn rocsparse_ell2csr_nnz(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        ell_descr: rocsparse_mat_descr,\n        ell_width: rocsparse_int,\n        ell_col_ind: *const rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_row_ptr: *mut rocsparse_int,\n        csr_nnz: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief Convert a sparse ELL matrix into a sparse CSR matrix\\n\\n  \\\\details\\n  \\\\p rocsparse_ell2csr converts an ELL matrix into a CSR matrix. It is assumed\\n  that \\\\p csr_row_ptr has already been filled and that \\\\p csr_val and \\\\p csr_col_ind\\n  are allocated by the user. \\\\p csr_row_ptr and allocation size of \\\\p csr_col_ind and\\n  \\\\p csr_val is defined by the number of CSR non-zero elements. Both can be obtained\\n  by rocsparse_ell2csr_nnz().\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  m           number of rows of the sparse ELL matrix.\\n  @param[in]\\n  n           number of columns of the sparse ELL matrix.\\n  @param[in]\\n  ell_descr   descriptor of the sparse ELL matrix. Currently, only\\n              \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  ell_width   number of non-zero elements per row in ELL storage format.\\n  @param[in]\\n  ell_val     array of \\\\p m times \\\\p ell_width elements of the sparse ELL matrix.\\n  @param[in]\\n  ell_col_ind array of \\\\p m times \\\\p ell_width elements containing the column indices\\n              of the sparse ELL matrix.\\n  @param[in]\\n  csr_descr   descriptor of the sparse CSR matrix. Currently, only\\n              \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[out]\\n  csr_val     array containing the values of the sparse CSR matrix.\\n  @param[in]\\n  csr_row_ptr array of \\\\p m+1 elements that point to the start of every row of the\\n              sparse CSR matrix.\\n  @param[out]\\n  csr_col_ind array containing the column indices of the sparse CSR matrix.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m, \\\\p n or \\\\p ell_width is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p csr_descr, \\\\p csr_val,\\n              \\\\p csr_row_ptr, \\\\p csr_col_ind, \\\\p ell_descr, \\\\p ell_val or\\n              \\\\p ell_col_ind pointer is invalid.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n\\n  \\\\par Example\\n  This example converts an ELL matrix into a CSR matrix.\\n  \\\\code{.c}\\n      //     1 2 0 3 0\\n      // A = 0 4 5 0 0\\n      //     6 0 0 7 8\\n\\n      rocsparse_int m         = 3;\\n      rocsparse_int n         = 5;\\n      rocsparse_int nnz       = 9;\\n      rocsparse_int ell_width = 3;\\n\\n      ell_col_ind[nnz] = {0, 1, 0, 1, 2, 3, 3, -1, 4}; // device memory\\n      ell_val[nnz]     = {1, 4, 6, 2, 5, 7, 3, 0, 8};  // device memory\\n\\n      // Create CSR matrix descriptor\\n      rocsparse_mat_descr csr_descr;\\n      rocsparse_create_mat_descr(&csr_descr);\\n\\n      // Allocate csr_row_ptr array for row offsets\\n      rocsparse_int* csr_row_ptr;\\n      hipMalloc((void**)&csr_row_ptr, sizeof(rocsparse_int) * (m + 1));\\n\\n      // Obtain the number of CSR non-zero entries\\n      // and fill csr_row_ptr array with row offsets\\n      rocsparse_int csr_nnz;\\n      rocsparse_ell2csr_nnz(handle,\\n                            m,\\n                            n,\\n                            ell_descr,\\n                            ell_width,\\n                            ell_col_ind,\\n                            csr_descr,\\n                            csr_row_ptr,\\n                            &csr_nnz);\\n\\n      // Allocate CSR column and value arrays\\n      rocsparse_int* csr_col_ind;\\n      hipMalloc((void**)&csr_col_ind, sizeof(rocsparse_int) * csr_nnz);\\n\\n      float* csr_val;\\n      hipMalloc((void**)&csr_val, sizeof(float) * csr_nnz);\\n\\n      // Format conversion\\n      rocsparse_sell2csr(handle,\\n                         m,\\n                         n,\\n                         ell_descr,\\n                         ell_width,\\n                         ell_val,\\n                         ell_col_ind,\\n                         csr_descr,\\n                         csr_val,\\n                         csr_row_ptr,\\n                         csr_col_ind);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_sell2csr(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        ell_descr: rocsparse_mat_descr,\n        ell_width: rocsparse_int,\n        ell_val: *const f32,\n        ell_col_ind: *const rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_val: *mut f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dell2csr(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        ell_descr: rocsparse_mat_descr,\n        ell_width: rocsparse_int,\n        ell_val: *const f64,\n        ell_col_ind: *const rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_val: *mut f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cell2csr(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        ell_descr: rocsparse_mat_descr,\n        ell_width: rocsparse_int,\n        ell_val: *const rocsparse_float_complex,\n        ell_col_ind: *const rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_val: *mut rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zell2csr(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        ell_descr: rocsparse_mat_descr,\n        ell_width: rocsparse_int,\n        ell_val: *const rocsparse_double_complex,\n        ell_col_ind: *const rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_val: *mut rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief Convert a sparse general BSR matrix into a sparse CSR matrix\\n\\n  \\\\details\\n  \\\\p rocsparse_gebsr2csr converts a BSR matrix into a CSR matrix. It is assumed,\\n  that \\\\p csr_val, \\\\p csr_col_ind and \\\\p csr_row_ptr are allocated. Allocation size\\n  for \\\\p csr_row_ptr is computed by the number of block rows multiplied by the block\\n  dimension plus one. Allocation for \\\\p csr_val and \\\\p csr_col_ind is computed by the\\n  the number of blocks in the BSR matrix multiplied by the product of the block dimensions.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  dir         the storage format of the blocks, \\\\ref rocsparse_direction_row or \\\\ref rocsparse_direction_column\\n  @param[in]\\n  mb          number of block rows in the sparse general BSR matrix.\\n  @param[in]\\n  nb          number of block columns in the sparse general BSR matrix.\\n  @param[in]\\n  bsr_descr   descriptor of the sparse general BSR matrix. Currently, only\\n              \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  bsr_val     array of \\\\p nnzb*row_block_dim*col_block_dim containing the values of the sparse BSR matrix.\\n  @param[in]\\n  bsr_row_ptr array of \\\\p mb+1 elements that point to the start of every block row of the\\n              sparse BSR matrix.\\n  @param[in]\\n  bsr_col_ind array of \\\\p nnzb elements containing the block column indices of the sparse BSR matrix.\\n  @param[in]\\n  row_block_dim   row size of the blocks in the sparse general BSR matrix.\\n  @param[in]\\n  col_block_dim   column size of the blocks in the sparse general BSR matrix.\\n  @param[in]\\n  csr_descr   descriptor of the sparse CSR matrix. Currently, only\\n              \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[out]\\n  csr_val     array of \\\\p nnzb*row_block_dim*col_block_dim elements containing the values of the sparse CSR matrix.\\n  @param[out]\\n  csr_row_ptr array of \\\\p m+1 where \\\\p m=mb*row_block_dim elements that point to the start of every row of the\\n              sparse CSR matrix.\\n  @param[out]\\n  csr_col_ind array of \\\\p nnzb*block_dim*block_dim elements containing the column indices of the sparse CSR matrix.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p mb or \\\\p nb or \\\\p block_dim is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p bsr_val,\\n              \\\\p bsr_row_ptr, \\\\p bsr_col_ind, \\\\p csr_val, \\\\p csr_row_ptr or\\n              \\\\p csr_col_ind pointer is invalid.\\n\\n  \\\\par Example\\n  This example converts a general BSR matrix into an CSR matrix.\\n  \\\\code{.c}\\n      //     1 4 0 0 0 0\\n      // A = 0 2 3 0 0 0\\n      //     5 0 0 7 8 0\\n      //     0 0 9 0 6 0\\n\\n      rocsparse_int mb   = 2;\\n      rocsparse_int nb   = 2;\\n      rocsparse_int row_block_dim = 2;\\n      rocsparse_int col_block_dim = 3;\\n      rocsparse_int m = Mb * row_block_dim;\\n      rocsparse_int n = Nb * col_block_dim;\\n\\n      bsr_row_ptr[mb+1]                 = {0, 1, 3};                                              // device memory\\n      bsr_col_ind[nnzb]                 = {0, 0, 1};                                              // device memory\\n      bsr_val[nnzb*block_dim*block_dim] = {1, 0, 4, 2, 0, 3, 5, 0, 0, 0, 0, 9, 7, 0, 8, 6, 0, 0}; // device memory\\n\\n      rocsparse_int nnzb = bsr_row_ptr[mb] - bsr_row_ptr[0];\\n\\n      // Create CSR arrays on device\\n      rocsparse_int* csr_row_ptr;\\n      rocsparse_int* csr_col_ind;\\n      float* csr_val;\\n      hipMalloc((void**)&csr_row_ptr, sizeof(rocsparse_int) * (m + 1));\\n      hipMalloc((void**)&csr_col_ind, sizeof(rocsparse_int) * nnzb * row_block_dim * col_block_dim);\\n      hipMalloc((void**)&csr_val, sizeof(float) * nnzb * row_block_dim * col_block_dim);\\n\\n      // Create rocsparse handle\\n      rocsparse_local_handle handle;\\n\\n      rocsparse_mat_descr bsr_descr = nullptr;\\n      rocsparse_create_mat_descr(&bsr_descr);\\n\\n      rocsparse_mat_descr csr_descr = nullptr;\\n      rocsparse_create_mat_descr(&csr_descr);\\n\\n      rocsparse_set_mat_index_base(bsr_descr, rocsparse_index_base_zero);\\n      rocsparse_set_mat_index_base(csr_descr, rocsparse_index_base_zero);\\n\\n      // Format conversion\\n      rocsparse_sgebsr2csr(handle,\\n                         rocsparse_direction_column,\\n                         mb,\\n                         nb,\\n                         bsr_descr,\\n                         bsr_val,\\n                         bsr_row_ptr,\\n                         bsr_col_ind,\\n                         row_block_dim,\\n                         col_block_dim,\\n                         csr_descr,\\n                         csr_val,\\n                         csr_row_ptr,\\n                         csr_col_ind);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_sgebsr2csr(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        bsr_descr: rocsparse_mat_descr,\n        bsr_val: *const f32,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_val: *mut f32,\n        csr_row_ptr: *mut rocsparse_int,\n        csr_col_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dgebsr2csr(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        bsr_descr: rocsparse_mat_descr,\n        bsr_val: *const f64,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_val: *mut f64,\n        csr_row_ptr: *mut rocsparse_int,\n        csr_col_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cgebsr2csr(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        bsr_descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_float_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_val: *mut rocsparse_float_complex,\n        csr_row_ptr: *mut rocsparse_int,\n        csr_col_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zgebsr2csr(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        bsr_descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_double_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        csr_descr: rocsparse_mat_descr,\n        csr_val: *mut rocsparse_double_complex,\n        csr_row_ptr: *mut rocsparse_int,\n        csr_col_ind: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief Convert a sparse GEneral BSR matrix into a sparse GEneral BSC matrix\\n\\n  \\\\details\\n  \\\\p rocsparse_gebsr2gebsc_buffer_size returns the size of the temporary storage buffer\\n  required by rocsparse_sgebsr2gebsc(), rocsparse_dgebsr2gebsc(), rocsparse_cgebsr2gebsc() and\\n  rocsparse_zgebsr2gebsc(). The temporary storage buffer must be allocated by the user.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  mb           number of rows of the sparse GEneral BSR matrix.\\n  @param[in]\\n  nb           number of columns of the sparse GEneral BSR matrix.\\n  @param[in]\\n  nnzb         number of non-zero entries of the sparse GEneral BSR matrix.\\n  @param[in]\\n  bsr_val     array of \\\\p nnzb*row_block_dim*col_block_dim containing the values of the sparse GEneral BSR matrix.\\n  @param[in]\\n  bsr_row_ptr array of \\\\p mb+1 elements that point to the start of every row of the\\n              sparse GEneral BSR matrix.\\n  @param[in]\\n  bsr_col_ind array of \\\\p nnzb elements containing the column indices of the sparse\\n              GEneral BSR matrix.\\n  @param[in]\\n  row_block_dim   row size of the blocks in the sparse general BSR matrix.\\n  @param[in]\\n  col_block_dim   col size of the blocks in the sparse general BSR matrix.\\n\\n  @param[out]\\n  p_buffer_size number of bytes of the temporary storage buffer required by\\n              rocsparse_sgebsr2gebsc(), rocsparse_dgebsr2gebsc(), rocsparse_cgebsr2gebsc() and\\n              rocsparse_zgebsr2gebsc().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p mb, \\\\p nb or \\\\p nnzb is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p bsr_row_ptr, \\\\p bsr_col_ind or\\n              \\\\p buffer_size pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n/\\n/**@{\"]\n    pub fn rocsparse_sgebsr2gebsc_buffer_size(\n        handle: rocsparse_handle,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        bsr_val: *const f32,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        p_buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dgebsr2gebsc_buffer_size(\n        handle: rocsparse_handle,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        bsr_val: *const f64,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        p_buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cgebsr2gebsc_buffer_size(\n        handle: rocsparse_handle,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        bsr_val: *const rocsparse_float_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        p_buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zgebsr2gebsc_buffer_size(\n        handle: rocsparse_handle,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        bsr_val: *const rocsparse_double_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        p_buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief Convert a sparse GEneral BSR matrix into a sparse GEneral BSC matrix\\n\\n  \\\\details\\n  \\\\p rocsparse_gebsr2gebsc converts a GEneral BSR matrix into a GEneral BSC matrix. \\\\p rocsparse_gebsr2gebsc\\n  can also be used to convert a GEneral BSC matrix into a GEneral BSR matrix. \\\\p copy_values decides\\n  whether \\\\p bsc_val is being filled during conversion (\\\\ref rocsparse_action_numeric)\\n  or not (\\\\ref rocsparse_action_symbolic).\\n\\n  \\\\p rocsparse_gebsr2gebsc requires extra temporary storage buffer that has to be allocated\\n  by the user. Storage buffer size can be determined by rocsparse_gebsr2gebsc_buffer_size().\\n\\n  \\\\note\\n  The resulting matrix can also be seen as the transpose of the input matrix.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  mb          number of rows of the sparse GEneral BSR matrix.\\n  @param[in]\\n  nb          number of columns of the sparse GEneral BSR matrix.\\n  @param[in]\\n  nnzb        number of non-zero entries of the sparse GEneral BSR matrix.\\n  @param[in]\\n  bsr_val     array of \\\\p nnzb * \\\\p row_block_dim * \\\\p col_block_dim  elements of the sparse GEneral BSR matrix.\\n  @param[in]\\n  bsr_row_ptr array of \\\\p m+1 elements that point to the start of every row of the\\n              sparse GEneral BSR matrix.\\n  @param[in]\\n  bsr_col_ind array of \\\\p nnz elements containing the column indices of the sparse\\n              GEneral BSR matrix.\\n  @param[in]\\n  row_block_dim   row size of the blocks in the sparse general BSR matrix.\\n  @param[in]\\n  col_block_dim   col size of the blocks in the sparse general BSR matrix.\\n  @param[out]\\n  bsc_val     array of \\\\p nnz elements of the sparse BSC matrix.\\n  @param[out]\\n  bsc_row_ind array of \\\\p nnz elements containing the row indices of the sparse BSC\\n              matrix.\\n  @param[out]\\n  bsc_col_ptr array of \\\\p n+1 elements that point to the start of every column of the\\n              sparse BSC matrix.\\n  @param[in]\\n  copy_values \\\\ref rocsparse_action_symbolic or \\\\ref rocsparse_action_numeric.\\n  @param[in]\\n  idx_base    \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user, size is returned by\\n              rocsparse_gebsr2gebsc_buffer_size().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p mb, \\\\p nb or \\\\p nnzb is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p bsr_val, \\\\p bsr_row_ptr,\\n              \\\\p bsr_col_ind, \\\\p bsc_val, \\\\p bsc_row_ind, \\\\p bsc_col_ptr or\\n              \\\\p temp_buffer pointer is invalid.\\n  \\\\retval     rocsparse_status_arch_mismatch the device is not supported.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n\\n  \\\\par Example\\n  This example computes the transpose of a GEneral BSR matrix.\\n  \\\\code{.c}\\n      //     1 2 0 3\\n      // A = 0 4 5 0\\n      //     6 0 0 7\\n      //     1 2 3 4\\n\\n      rocsparse_int mb_A   = 2;\\n      rocsparse_int row_block_dim = 2;\\n      rocsparse_int col_block_dim = 2;\\n      rocsparse_int nb_A   = 2;\\n      rocsparse_int nnzb_A = 4;\\n\\n      bsr_row_ptr_A[mb_A+1] = {0, 2, 4};               // device memory\\n      bsr_col_ind_A[nnzb_A] = {0, 1, 0, 1}; // device memory\\n      bsr_val_A[nnzb_A]     = {1, 0, 2, 4, 0, 5, 3, 0, 6, 1, 0, 2, 0, 3, 7, 4}; // device memory\\n\\n      // Allocate memory for transposed BSR matrix\\n      rocsparse_int mb_T   = nb_A;\\n      rocsparse_int nb_T   = mb_A;\\n      rocsparse_int nnzb_T = nnzb_A;\\n\\n      rocsparse_int* bsr_row_ptr_T;\\n      rocsparse_int* bsr_col_ind_T;\\n      float* bsr_val_T;\\n\\n      hipMalloc((void**)&bsr_row_ptr_T, sizeof(rocsparse_int) * (mb_T + 1));\\n      hipMalloc((void**)&bsr_col_ind_T, sizeof(rocsparse_int) * nnzb_T);\\n      hipMalloc((void**)&bsr_val_T, sizeof(float) * nnzb_T);\\n\\n      // Obtain the temporary buffer size\\n      size_t buffer_size;\\n      rocsparse_gebsr2gebsc_buffer_size(handle,\\n                                    mb_A,\\n                                    nb_A,\\n                                    nnzb_A,\\n                                    bsr_row_ptr_A,\\n                                    bsr_col_ind_A,\\n                                    rocsparse_action_numeric,\\n                                    &buffer_size);\\n\\n      // Allocate temporary buffer\\n      void* temp_buffer;\\n      hipMalloc(&temp_buffer, buffer_size);\\n\\n      rocsparse_sgebsr2gebsc(handle,\\n                         mb_A,\\n                         nb_A,\\n                         nnzb_A,\\n                         bsr_val_A,\\n                         bsr_row_ptr_A,\\n                         bsr_col_ind_A,\\n                         row_block_dim,\\n                         col_block_dim,\\n                         bsr_val_T,\\n                         bsr_col_ind_T,\\n                         bsr_row_ptr_T,\\n                         rocsparse_action_numeric,\\n                         rocsparse_index_base_zero,\\n                         temp_buffer);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_sgebsr2gebsc(\n        handle: rocsparse_handle,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        bsr_val: *const f32,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        bsc_val: *mut f32,\n        bsc_row_ind: *mut rocsparse_int,\n        bsc_col_ptr: *mut rocsparse_int,\n        copy_values: rocsparse_action,\n        idx_base: rocsparse_index_base,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dgebsr2gebsc(\n        handle: rocsparse_handle,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        bsr_val: *const f64,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        bsc_val: *mut f64,\n        bsc_row_ind: *mut rocsparse_int,\n        bsc_col_ptr: *mut rocsparse_int,\n        copy_values: rocsparse_action,\n        idx_base: rocsparse_index_base,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cgebsr2gebsc(\n        handle: rocsparse_handle,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        bsr_val: *const rocsparse_float_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        bsc_val: *mut rocsparse_float_complex,\n        bsc_row_ind: *mut rocsparse_int,\n        bsc_col_ptr: *mut rocsparse_int,\n        copy_values: rocsparse_action,\n        idx_base: rocsparse_index_base,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zgebsr2gebsc(\n        handle: rocsparse_handle,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        bsr_val: *const rocsparse_double_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        bsc_val: *mut rocsparse_double_complex,\n        bsc_row_ind: *mut rocsparse_int,\n        bsc_col_ptr: *mut rocsparse_int,\n        copy_values: rocsparse_action,\n        idx_base: rocsparse_index_base,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief\\n  This function computes the the size of the user allocated temporary storage buffer used when converting a sparse\\n  general BSR matrix to another sparse general BSR matrix.\\n\\n  \\\\details\\n  \\\\p rocsparse_gebsr2gebsr_buffer_size returns the size of the temporary storage buffer\\n  that is required by rocsparse_gebsr2gebsr_nnz(), rocsparse_sgebsr2gebsr(), rocsparse_dgebsr2gebsr(),\\n  rocsparse_cgebsr2gebsr(), and rocsparse_zgebsr2gebsr(). The temporary\\n  storage buffer must be allocated by the user.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n\\n  @param[in]\\n  dir         the storage format of the blocks, \\\\ref rocsparse_direction_row or \\\\ref rocsparse_direction_column\\n\\n  @param[in]\\n  mb           number of block rows of the general BSR sparse matrix \\\\p A.\\n\\n  @param[in]\\n  nb           number of block columns of the general BSR sparse matrix \\\\p A.\\n\\n  @param[in]\\n  nnzb         number of blocks in the general BSR sparse matrix \\\\p A.\\n\\n  @param[in]\\n  descr_A      the descriptor of the general BSR sparse matrix \\\\p A, the supported matrix type is rocsparse_matrix_type_general and also any valid value of the \\\\ref rocsparse_index_base.\\n\\n  @param[in]\\n  bsr_val_A    array of \\\\p nnzb*row_block_dim_A*col_block_dim_A containing the values of the sparse general BSR matrix \\\\p A.\\n\\n  @param[in]\\n  bsr_row_ptr_A array of \\\\p mb+1 elements that point to the start of every block row of the\\n              sparse general BSR matrix \\\\p A.\\n  @param[in]\\n  bsr_col_ind_A array of \\\\p nnzb elements containing the block column indices of the sparse general BSR matrix \\\\p A.\\n\\n  @param[in]\\n  row_block_dim_A   row size of the blocks in the sparse general BSR matrix \\\\p A.\\n\\n  @param[in]\\n  col_block_dim_A   column size of the blocks in the sparse general BSR matrix \\\\p A.\\n\\n  @param[in]\\n  row_block_dim_C   row size of the blocks in the sparse general BSR matrix \\\\p C.\\n\\n  @param[in]\\n  col_block_dim_C   column size of the blocks in the sparse general BSR matrix \\\\p C.\\n\\n  @param[out]\\n  buffer_size number of bytes of the temporary storage buffer required by rocsparse_gebsr2gebsr_nnz(),\\n              rocsparse_sgebsr2gebsr(), rocsparse_dgebsr2gebsr(), rocsparse_cgebsr2gebsr(), and rocsparse_zgebsr2gebsr().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p mb or \\\\p nb or \\\\p nnzb or \\\\p row_block_dim_A or\\n              \\\\p col_block_dim_A or \\\\p row_block_dim_C or \\\\p col_block_dim_C is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p bsr_row_ptr_A or \\\\p bsr_col_ind_A\\n              or \\\\p descr_A or \\\\p buffer_size pointer is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_sgebsr2gebsr_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr_A: rocsparse_mat_descr,\n        bsr_val_A: *const f32,\n        bsr_row_ptr_A: *const rocsparse_int,\n        bsr_col_ind_A: *const rocsparse_int,\n        row_block_dim_A: rocsparse_int,\n        col_block_dim_A: rocsparse_int,\n        row_block_dim_C: rocsparse_int,\n        col_block_dim_C: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dgebsr2gebsr_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr_A: rocsparse_mat_descr,\n        bsr_val_A: *const f64,\n        bsr_row_ptr_A: *const rocsparse_int,\n        bsr_col_ind_A: *const rocsparse_int,\n        row_block_dim_A: rocsparse_int,\n        col_block_dim_A: rocsparse_int,\n        row_block_dim_C: rocsparse_int,\n        col_block_dim_C: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cgebsr2gebsr_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr_A: rocsparse_mat_descr,\n        bsr_val_A: *const rocsparse_float_complex,\n        bsr_row_ptr_A: *const rocsparse_int,\n        bsr_col_ind_A: *const rocsparse_int,\n        row_block_dim_A: rocsparse_int,\n        col_block_dim_A: rocsparse_int,\n        row_block_dim_C: rocsparse_int,\n        col_block_dim_C: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zgebsr2gebsr_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr_A: rocsparse_mat_descr,\n        bsr_val_A: *const rocsparse_double_complex,\n        bsr_row_ptr_A: *const rocsparse_int,\n        bsr_col_ind_A: *const rocsparse_int,\n        row_block_dim_A: rocsparse_int,\n        col_block_dim_A: rocsparse_int,\n        row_block_dim_C: rocsparse_int,\n        col_block_dim_C: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup conv_module\n  \\brief This function is used when converting a general BSR sparse matrix \\p A to another general BSR sparse matrix \\p C.\n  Specifically, this function determines the number of non-zero blocks that will exist in \\p C (stored using either a host\n  or device pointer), and computes the row pointer array for \\p C.\n\n  \\note\n  This function is blocking with respect to the host.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n\n  @param[in]\n  dir         the storage format of the blocks, \\ref rocsparse_direction_row or \\ref rocsparse_direction_column\n\n  @param[in]\n  mb           number of block rows of the general BSR sparse matrix \\p A.\n\n  @param[in]\n  nb           number of block columns of the general BSR sparse matrix \\p A.\n\n  @param[in]\n  nnzb         number of blocks in the general BSR sparse matrix \\p A.\n\n  @param[in]\n  descr_A      the descriptor of the general BSR sparse matrix \\p A, the supported matrix type is rocsparse_matrix_type_general and also any valid value of the \\ref rocsparse_index_base.\n\n  @param[in]\n  bsr_row_ptr_A array of \\p mb+1 elements that point to the start of every block row of the\n              sparse general BSR matrix \\p A.\n  @param[in]\n  bsr_col_ind_A array of \\p nnzb elements containing the block column indices of the sparse general BSR matrix \\p A.\n\n  @param[in]\n  row_block_dim_A   row size of the blocks in the sparse general BSR matrix \\p A.\n\n  @param[in]\n  col_block_dim_A   column size of the blocks in the sparse general BSR matrix \\p A.\n\n  @param[in]\n  descr_C      the descriptor of the general BSR sparse matrix \\p C, the supported matrix type is rocsparse_matrix_type_general and also any valid value of the \\ref rocsparse_index_base.\n\n  @param[in]\n  bsr_row_ptr_C array of \\p mb_C+1 elements that point to the start of every block row of the\n              sparse general BSR matrix \\p C where \\p mb_C=(m+row_block_dim_C-1)/row_block_dim_C.\n  @param[in]\n  row_block_dim_C   row size of the blocks in the sparse general BSR matrix \\p C.\n\n  @param[in]\n  col_block_dim_C   column size of the blocks in the sparse general BSR matrix \\p C.\n\n  @param[out]\n  nnz_total_dev_host_ptr\n              total number of nonzero blocks in general BSR sparse matrix \\p C stored using device or host memory.\n\n  @param[out]\n  temp_buffer\n              buffer allocated by the user whose size is determined by calling rocsparse_xgebsr2gebsr_buffer_size().\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_size \\p mb or \\p nb or \\p nnzb or \\p row_block_dim_A or\n              \\p col_block_dim_A or \\p row_block_dim_C or \\p col_block_dim_C is invalid.\n  \\retval     rocsparse_status_invalid_pointer \\p bsr_row_ptr_A or \\p bsr_col_ind_A\n              or \\p bsr_row_ptr_C or \\p descr_A or \\p descr_C or \\p temp_buffer pointer is invalid.*/\n    pub fn rocsparse_gebsr2gebsr_nnz(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr_A: rocsparse_mat_descr,\n        bsr_row_ptr_A: *const rocsparse_int,\n        bsr_col_ind_A: *const rocsparse_int,\n        row_block_dim_A: rocsparse_int,\n        col_block_dim_A: rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        bsr_row_ptr_C: *mut rocsparse_int,\n        row_block_dim_C: rocsparse_int,\n        col_block_dim_C: rocsparse_int,\n        nnz_total_dev_host_ptr: *mut rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief\\n  This function converts the general BSR sparse matrix \\\\p A to another general BSR sparse matrix \\\\p C.\\n\\n  \\\\details\\n  The conversion uses three steps. First, the user calls rocsparse_xgebsr2gebsr_buffer_size() to determine the size of\\n  the required temporary storage buffer. The user then allocates this buffer. Secondly, the user then allocates \\\\p mb_C+1\\n  integers for the row pointer array for \\\\p C where \\\\p mb_C=(m+row_block_dim_C-1)/row_block_dim_C. The user then calls\\n  rocsparse_xgebsr2gebsr_nnz() to fill in the row pointer array for \\\\p C ( \\\\p bsr_row_ptr_C ) and determine the number of\\n  non-zero blocks that will exist in \\\\p C. Finally, the user allocates space for the colimn indices array of \\\\p C to have\\n  \\\\p nnzb_C elements and space for the values array of \\\\p C to have \\\\p nnzb_C*roc_block_dim_C*col_block_dim_C and then calls\\n  rocsparse_xgebsr2gebsr() to complete the conversion.\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n\\n  @param[in]\\n  dir         the storage format of the blocks, \\\\ref rocsparse_direction_row or \\\\ref rocsparse_direction_column\\n\\n  @param[in]\\n  mb           number of block rows of the general BSR sparse matrix \\\\p A.\\n\\n  @param[in]\\n  nb           number of block columns of the general BSR sparse matrix \\\\p A.\\n\\n  @param[in]\\n  nnzb         number of blocks in the general BSR sparse matrix \\\\p A.\\n\\n  @param[in]\\n  descr_A      the descriptor of the general BSR sparse matrix \\\\p A, the supported matrix type is rocsparse_matrix_type_general and also any valid value of the \\\\ref rocsparse_index_base.\\n\\n  @param[in]\\n  bsr_val_A    array of \\\\p nnzb*row_block_dim_A*col_block_dim_A containing the values of the sparse general BSR matrix \\\\p A.\\n\\n  @param[in]\\n  bsr_row_ptr_A array of \\\\p mb+1 elements that point to the start of every block row of the\\n              sparse general BSR matrix \\\\p A.\\n  @param[in]\\n  bsr_col_ind_A array of \\\\p nnzb elements containing the block column indices of the sparse general BSR matrix \\\\p A.\\n\\n  @param[in]\\n  row_block_dim_A   row size of the blocks in the sparse general BSR matrix \\\\p A.\\n\\n  @param[in]\\n  col_block_dim_A   column size of the blocks in the sparse general BSR matrix \\\\p A.\\n\\n  @param[in]\\n  descr_C      the descriptor of the general BSR sparse matrix \\\\p C, the supported matrix type is rocsparse_matrix_type_general and also any valid value of the \\\\ref rocsparse_index_base.\\n\\n  @param[in]\\n  bsr_val_C    array of \\\\p nnzb_C*row_block_dim_C*col_block_dim_C containing the values of the sparse general BSR matrix \\\\p C.\\n\\n  @param[in]\\n  bsr_row_ptr_C array of \\\\p mb_C+1 elements that point to the start of every block row of the\\n              sparse general BSR matrix \\\\p C.\\n  @param[in]\\n  bsr_col_ind_C array of \\\\p nnzb_C elements containing the block column indices of the sparse general BSR matrix \\\\p C.\\n\\n  @param[in]\\n  row_block_dim_C   row size of the blocks in the sparse general BSR matrix \\\\p C.\\n\\n  @param[in]\\n  col_block_dim_C   column size of the blocks in the sparse general BSR matrix \\\\p C.\\n\\n  @param[out]\\n  temp_buffer\\n              buffer allocated by the user whose size is determined by calling rocsparse_xgebsr2gebsr_buffer_size().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p mb or \\\\p nb or \\\\p nnzb or \\\\p row_block_dim_A or\\n              \\\\p col_block_dim_A or \\\\p row_block_dim_C or \\\\p col_block_dim_C is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p bsr_row_ptr_A or \\\\p bsr_col_ind_A or \\\\p bsr_val_A\\n              or \\\\p bsr_row_ptr_C or \\\\p bsr_col_ind_C or \\\\p bsr_val_C or \\\\p descr_A or \\\\p descr_C\\n              or \\\\p temp_buffer pointer is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_sgebsr2gebsr(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr_A: rocsparse_mat_descr,\n        bsr_val_A: *const f32,\n        bsr_row_ptr_A: *const rocsparse_int,\n        bsr_col_ind_A: *const rocsparse_int,\n        row_block_dim_A: rocsparse_int,\n        col_block_dim_A: rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        bsr_val_C: *mut f32,\n        bsr_row_ptr_C: *mut rocsparse_int,\n        bsr_col_ind_C: *mut rocsparse_int,\n        row_block_dim_C: rocsparse_int,\n        col_block_dim_C: rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dgebsr2gebsr(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr_A: rocsparse_mat_descr,\n        bsr_val_A: *const f64,\n        bsr_row_ptr_A: *const rocsparse_int,\n        bsr_col_ind_A: *const rocsparse_int,\n        row_block_dim_A: rocsparse_int,\n        col_block_dim_A: rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        bsr_val_C: *mut f64,\n        bsr_row_ptr_C: *mut rocsparse_int,\n        bsr_col_ind_C: *mut rocsparse_int,\n        row_block_dim_C: rocsparse_int,\n        col_block_dim_C: rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cgebsr2gebsr(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr_A: rocsparse_mat_descr,\n        bsr_val_A: *const rocsparse_float_complex,\n        bsr_row_ptr_A: *const rocsparse_int,\n        bsr_col_ind_A: *const rocsparse_int,\n        row_block_dim_A: rocsparse_int,\n        col_block_dim_A: rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        bsr_val_C: *mut rocsparse_float_complex,\n        bsr_row_ptr_C: *mut rocsparse_int,\n        bsr_col_ind_C: *mut rocsparse_int,\n        row_block_dim_C: rocsparse_int,\n        col_block_dim_C: rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zgebsr2gebsr(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr_A: rocsparse_mat_descr,\n        bsr_val_A: *const rocsparse_double_complex,\n        bsr_row_ptr_A: *const rocsparse_int,\n        bsr_col_ind_A: *const rocsparse_int,\n        row_block_dim_A: rocsparse_int,\n        col_block_dim_A: rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        bsr_val_C: *mut rocsparse_double_complex,\n        bsr_row_ptr_C: *mut rocsparse_int,\n        bsr_col_ind_C: *mut rocsparse_int,\n        row_block_dim_C: rocsparse_int,\n        col_block_dim_C: rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup conv_module\n  \\brief Convert a sparse HYB matrix into a sparse CSR matrix\n\n  \\details\n  \\p rocsparse_hyb2csr_buffer_size returns the size of the temporary storage buffer\n  required by rocsparse_shyb2csr(), rocsparse_dhyb2csr(), rocsparse_chyb2csr() and\n  rocsparse_dhyb2csr(). The temporary storage buffer must be allocated by the user.\n\n  \\note\n  This function is non blocking and executed asynchronously with respect to the host.\n  It may return before the actual computation has finished.\n\n  \\note\n  This routine supports execution in a hipGraph context.\n\n  @param[in]\n  handle          handle to the rocsparse library context queue.\n  @param[in]\n  descr           descriptor of the sparse HYB matrix. Currently, only\n                  \\ref rocsparse_matrix_type_general is supported.\n  @param[in]\n  hyb             sparse matrix in HYB format.\n  @param[in]\n  csr_row_ptr     array of \\p m+1 elements that point to the start of every row of the\n                  sparse CSR matrix.\n  @param[out]\n  buffer_size     number of bytes of the temporary storage buffer required by\n                  rocsparse_shyb2csr(), rocsparse_dhyb2csr(), rocsparse_chyb2csr() and\n                  rocsparse_zhyb2csr().\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_pointer \\p descr, \\p hyb, \\p csr_row_ptr or\n              \\p buffer_size pointer is invalid.\n  \\retval     rocsparse_status_internal_error an internal error occurred.\n  \\retval     rocsparse_status_not_implemented\n              \\ref rocsparse_matrix_type != \\ref rocsparse_matrix_type_general.*/\n    pub fn rocsparse_hyb2csr_buffer_size(\n        handle: rocsparse_handle,\n        descr: rocsparse_mat_descr,\n        hyb: rocsparse_hyb_mat,\n        csr_row_ptr: *const rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief Convert a sparse HYB matrix into a sparse CSR matrix\\n\\n  \\\\details\\n  \\\\p rocsparse_hyb2csr converts a HYB matrix into a CSR matrix.\\n\\n  \\\\p rocsparse_hyb2csr requires extra temporary storage buffer that has to be allocated\\n  by the user. Storage buffer size can be determined by\\n  rocsparse_hyb2csr_buffer_size().\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle          handle to the rocsparse library context queue.\\n  @param[in]\\n  descr           descriptor of the sparse HYB matrix. Currently, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  hyb             sparse matrix in HYB format.\\n  @param[out]\\n  csr_val         array containing the values of the sparse CSR matrix.\\n  @param[out]\\n  csr_row_ptr     array of \\\\p m+1 elements that point to the start of every row of the\\n                  sparse CSR matrix.\\n  @param[out]\\n  csr_col_ind     array containing the column indices of the sparse CSR matrix.\\n  @param[in]\\n  temp_buffer     temporary storage buffer allocated by the user, size is returned by\\n                  rocsparse_hyb2csr_buffer_size().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p hyb, \\\\p csr_val,\\n              \\\\p csr_row_ptr, \\\\p csr_col_ind or \\\\p temp_buffer pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n\\n  \\\\par Example\\n  This example converts a HYB matrix into a CSR matrix.\\n  \\\\code{.c}\\n      // Create CSR matrix arrays\\n      rocsparse_int* csr_row_ptr;\\n      rocsparse_int* csr_col_ind;\\n      float* csr_val;\\n\\n      hipMalloc((void**)&csr_row_ptr, sizeof(rocsparse_int) * (m + 1));\\n      hipMalloc((void**)&csr_col_ind, sizeof(rocsparse_int) * nnz);\\n      hipMalloc((void**)&csr_val, sizeof(float) * nnz);\\n\\n      // Get required size of temporary buffer\\n      size_t size;\\n      rocsparse_hyb2csr_buffer_size(handle,\\n                                    descr,\\n                                    hyb,\\n                                    csr_row_ptr,\\n                                    &size);\\n\\n      // Allocate temporary buffer\\n      void* buffer;\\n      hipMalloc(&buffer, size);\\n\\n      // Perform the conversion\\n      rocsparse_shyb2csr(handle,\\n                         descr,\\n                         hyb,\\n                         csr_val,\\n                         csr_row_ptr,\\n                         csr_col_ind,\\n                         buffer);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_shyb2csr(\n        handle: rocsparse_handle,\n        descr: rocsparse_mat_descr,\n        hyb: rocsparse_hyb_mat,\n        csr_val: *mut f32,\n        csr_row_ptr: *mut rocsparse_int,\n        csr_col_ind: *mut rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dhyb2csr(\n        handle: rocsparse_handle,\n        descr: rocsparse_mat_descr,\n        hyb: rocsparse_hyb_mat,\n        csr_val: *mut f64,\n        csr_row_ptr: *mut rocsparse_int,\n        csr_col_ind: *mut rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_chyb2csr(\n        handle: rocsparse_handle,\n        descr: rocsparse_mat_descr,\n        hyb: rocsparse_hyb_mat,\n        csr_val: *mut rocsparse_float_complex,\n        csr_row_ptr: *mut rocsparse_int,\n        csr_col_ind: *mut rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zhyb2csr(\n        handle: rocsparse_handle,\n        descr: rocsparse_mat_descr,\n        hyb: rocsparse_hyb_mat,\n        csr_val: *mut rocsparse_double_complex,\n        csr_row_ptr: *mut rocsparse_int,\n        csr_col_ind: *mut rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup conv_module\n  \\brief Create the identity map\n\n  \\details\n  \\p rocsparse_create_identity_permutation stores the identity map in \\p p, such that\n  \\f$p = 0:1:(n-1)\\f$.\n\n  \\code{.c}\n      for(i = 0; i < n; ++i)\n      {\n          p[i] = i;\n      }\n  \\endcode\n\n  \\note\n  This function is non blocking and executed asynchronously with respect to the host.\n  It may return before the actual computation has finished.\n\n  \\note\n  This routine supports execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[in]\n  n           size of the map \\p p.\n  @param[out]\n  p           array of \\p n integers containing the map.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_size \\p n is invalid.\n  \\retval     rocsparse_status_invalid_pointer \\p p pointer is invalid.\n\n  \\par Example\n  The following example creates an identity permutation.\n  \\code{.c}\n      rocsparse_int size = 200;\n\n      // Allocate memory to hold the identity map\n      rocsparse_int* perm;\n      hipMalloc((void**)&perm, sizeof(rocsparse_int) * size);\n\n      // Fill perm with the identity permutation\n      rocsparse_create_identity_permutation(handle, size, perm);\n  \\endcode*/\n    pub fn rocsparse_create_identity_permutation(\n        handle: rocsparse_handle,\n        n: rocsparse_int,\n        p: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup conv_module\n  \\brief Inverse a permutation vector.\n\n  \\details\n  \\p rocsparse_inverse_permutation computes\n\n  \\code{.c}\n      for(i = 0; i < n; ++i)\n      {\n          q[p[i]- base] = i + base;\n      }\n  \\endcode\n\n  \\note\n  This function is non blocking and executed asynchronously with respect to the host.\n  It may return before the actual computation has finished.\n\n  \\note\n  This routine supports execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[in]\n  n           size of the permutation vector \\p p.\n  @param[in]\n  p           array of \\p n integers containing the permutation vector to inverse.\n  @param[out]\n  q           array of \\p n integers containing the invsrse of the permutation vector.\n  @param[in]\n  base        \\ref rocsparse_index_base_zero or \\ref rocsparse_index_base_one.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_size \\p n is invalid.\n  \\retval     rocsparse_status_invalid_pointer \\p p pointer is invalid or \\p q pointer is invalid.\n  \\retval     rocsparse_status_invalid_value \\p base is invalid.*/\n    pub fn rocsparse_inverse_permutation(\n        handle: rocsparse_handle,\n        n: rocsparse_int,\n        p: *const rocsparse_int,\n        q: *mut rocsparse_int,\n        base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief\\n  This function computes the number of nonzero elements per row or column and the total number of nonzero elements in a dense matrix.\\n  \\\\details\\n  The routine does support asynchronous execution if the pointer mode is set to device.\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n\\n  @param[in]\\n  dir        direction that specified whether to count nonzero elements by \\\\ref rocsparse_direction_row or by \\\\ref rocsparse_direction_row.\\n\\n  @param[in]\\n  m           number of rows of the dense matrix \\\\p A.\\n\\n  @param[in]\\n  n           number of columns of the dense matrix \\\\p A.\\n\\n  @param[in]\\n  descr      the descriptor of the dense matrix \\\\p A.\\n\\n  @param[in]\\n  A           array of dimensions (\\\\p ld, \\\\p n)\\n\\n  @param[in]\\n  ld         leading dimension of dense array \\\\p A.\\n\\n  @param[out]\\n  nnz_per_row_columns\\n              array of size \\\\p m or \\\\p n containing the number of nonzero elements per row or column, respectively.\\n  @param[out]\\n  nnz_total_dev_host_ptr\\n              total number of nonzero elements in device or host memory.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p n or \\\\p ld is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p A or \\\\p nnz_per_row_columns or \\\\p nnz_total_dev_host_ptr\\n              pointer is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_snnz(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        A: *const f32,\n        ld: rocsparse_int,\n        nnz_per_row_columns: *mut rocsparse_int,\n        nnz_total_dev_host_ptr: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dnnz(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        A: *const f64,\n        ld: rocsparse_int,\n        nnz_per_row_columns: *mut rocsparse_int,\n        nnz_total_dev_host_ptr: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cnnz(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        A: *const rocsparse_float_complex,\n        ld: rocsparse_int,\n        nnz_per_row_columns: *mut rocsparse_int,\n        nnz_total_dev_host_ptr: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_znnz(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        A: *const rocsparse_double_complex,\n        ld: rocsparse_int,\n        nnz_per_row_columns: *mut rocsparse_int,\n        nnz_total_dev_host_ptr: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  Given a sparse CSR matrix and a non-negative tolerance, this function computes how many entries would be left\\n  in each row of the matrix if elements less than the tolerance were removed. It also computes the total number\\n  of remaining elements in the matrix.\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle        handle to the rocsparse library context queue.\\n\\n  @param[in]\\n  m             number of rows of the sparse CSR matrix.\\n\\n  @param[in]\\n  descr_A       the descriptor of the sparse CSR matrix.\\n\\n  @param[in]\\n  csr_val_A     array of \\\\p nnz_A elements of the sparse CSR matrix.\\n  @param[in]\\n  csr_row_ptr_A array of \\\\p m+1 elements that point to the start of every row of the\\n                uncompressed sparse CSR matrix.\\n  @param[out]\\n  nnz_per_row   array of length \\\\p m containing the number of entries that will be kept per row in\\n                the final compressed CSR matrix.\\n  @param[out]\\n  nnz_C         number of elements in the column indices and values arrays of the compressed\\n                sparse CSR matrix. Can be either host or device pointer.\\n  @param[in]\\n  tol           the non-negative tolerance used for compression. If \\\\p tol is complex then only the magnitude\\n                of the real part is used. Entries in the input uncompressed CSR array that are below the tolerance\\n                are removed in output compressed CSR matrix.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p n is invalid.\\n  \\\\retval     rocsparse_status_invalid_value \\\\p tol is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p csr_val_A or \\\\p csr_row_ptr_A or \\\\p nnz_per_row or \\\\p nnz_C\\n              pointer is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_snnz_compress(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        descr_A: rocsparse_mat_descr,\n        csr_val_A: *const f32,\n        csr_row_ptr_A: *const rocsparse_int,\n        nnz_per_row: *mut rocsparse_int,\n        nnz_C: *mut rocsparse_int,\n        tol: f32,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dnnz_compress(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        descr_A: rocsparse_mat_descr,\n        csr_val_A: *const f64,\n        csr_row_ptr_A: *const rocsparse_int,\n        nnz_per_row: *mut rocsparse_int,\n        nnz_C: *mut rocsparse_int,\n        tol: f64,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cnnz_compress(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        descr_A: rocsparse_mat_descr,\n        csr_val_A: *const rocsparse_float_complex,\n        csr_row_ptr_A: *const rocsparse_int,\n        nnz_per_row: *mut rocsparse_int,\n        nnz_C: *mut rocsparse_int,\n        tol: rocsparse_float_complex,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_znnz_compress(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        descr_A: rocsparse_mat_descr,\n        csr_val_A: *const rocsparse_double_complex,\n        csr_row_ptr_A: *const rocsparse_int,\n        nnz_per_row: *mut rocsparse_int,\n        nnz_C: *mut rocsparse_int,\n        tol: rocsparse_double_complex,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief Convert and prune sparse CSR matrix into a sparse CSR matrix\\n\\n  \\\\details\\n  \\\\p rocsparse_prune_csr2csr_buffer_size returns the size of the temporary buffer that\\n  is required by \\\\p rocsparse_sprune_csr2csr_nnz, \\\\p rocsparse_dprune_csr2csr_nnz,\\n  \\\\p rocsparse_sprune_csr2csr, and \\\\p rocsparse_dprune_csr2csr. The temporary storage\\n  buffer must be allocated by the user.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle        handle to the rocsparse library context queue.\\n  @param[in]\\n  m             number of rows in the sparse CSR matrix.\\n  @param[in]\\n  n             number of columns in the sparse CSR matrix.\\n  @param[in]\\n  nnz_A         number of non-zeros in the sparse CSR matrix A.\\n  @param[in]\\n  csr_descr_A   descriptor of the sparse CSR matrix A. Currently, only\\n                \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  csr_val_A     array of \\\\p nnz_A elements containing the values of the sparse CSR matrix A.\\n  @param[in]\\n  csr_row_ptr_A array of \\\\p m+1 elements that point to the start of every row of the\\n                sparse CSR matrix A.\\n  @param[in]\\n  csr_col_ind_A array of \\\\p nnz_A elements containing the column indices of the sparse CSR matrix A.\\n  @param[in]\\n  threshold     pointer to the non-negative pruning threshold which can exist in either host or device memory.\\n  @param[in]\\n  csr_descr_C   descriptor of the sparse CSR matrix C. Currently, only\\n                \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  csr_val_C     array of \\\\p nnz_C elements containing the values of the sparse CSR matrix C.\\n  @param[in]\\n  csr_row_ptr_C array of \\\\p m+1 elements that point to the start of every row of the\\n                sparse CSR matrix C.\\n  @param[in]\\n  csr_col_ind_C array of \\\\p nnz_C elements containing the column indices of the sparse CSR matrix C.\\n  @param[out]\\n  buffer_size   number of bytes of the temporary storage buffer required by \\\\p rocsparse_sprune_csr2csr_nnz,\\n                \\\\p rocsparse_dprune_csr2csr_nnz, \\\\p rocsparse_sprune_csr2csr, and \\\\p rocsparse_dprune_csr2csr.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p buffer_size pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n\\n/\\n/**@{\"]\n    pub fn rocsparse_sprune_csr2csr_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz_A: rocsparse_int,\n        csr_descr_A: rocsparse_mat_descr,\n        csr_val_A: *const f32,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        threshold: *const f32,\n        csr_descr_C: rocsparse_mat_descr,\n        csr_val_C: *const f32,\n        csr_row_ptr_C: *const rocsparse_int,\n        csr_col_ind_C: *const rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dprune_csr2csr_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz_A: rocsparse_int,\n        csr_descr_A: rocsparse_mat_descr,\n        csr_val_A: *const f64,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        threshold: *const f64,\n        csr_descr_C: rocsparse_mat_descr,\n        csr_val_C: *const f64,\n        csr_row_ptr_C: *const rocsparse_int,\n        csr_col_ind_C: *const rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief Convert and prune sparse CSR matrix into a sparse CSR matrix\\n\\n  \\\\details\\n  \\\\p rocsparse_prune_csr2csr_nnz computes the number of nonzero elements per row and the total\\n  number of nonzero elements in a sparse CSR matrix once elements less than the threshold are\\n  pruned from the matrix.\\n\\n  \\\\note The routine does support asynchronous execution if the pointer mode is set to device.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle        handle to the rocsparse library context queue.\\n  @param[in]\\n  m             number of rows in the sparse CSR matrix.\\n  @param[in]\\n  n             number of columns in the sparse CSR matrix.\\n  @param[in]\\n  nnz_A         number of non-zeros in the sparse CSR matrix A.\\n  @param[in]\\n  csr_descr_A   descriptor of the sparse CSR matrix A. Currently, only\\n                \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  csr_val_A     array of \\\\p nnz_A elements containing the values of the sparse CSR matrix A.\\n  @param[in]\\n  csr_row_ptr_A array of \\\\p m+1 elements that point to the start of every row of the\\n                sparse CSR matrix A.\\n  @param[in]\\n  csr_col_ind_A array of \\\\p nnz_A elements containing the column indices of the sparse CSR matrix A.\\n  @param[in]\\n  threshold     pointer to the non-negative pruning threshold which can exist in either host or device memory.\\n  @param[in]\\n  csr_descr_C   descriptor of the sparse CSR matrix C. Currently, only\\n                \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[out]\\n  csr_row_ptr_C array of \\\\p m+1 elements that point to the start of every row of the\\n                sparse CSR matrix C.\\n  @param[out]\\n  nnz_total_dev_host_ptr total number of nonzero elements in device or host memory.\\n  @param[out]\\n  temp_buffer   buffer allocated by the user whose size is determined by calling \\\\p rocsparse_xprune_csr2csr_buffer_size().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p n or \\\\p nnz_A is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p threshold or \\\\p csr_descr_A or \\\\p csr_descr_C or \\\\p csr_val_A\\n              or \\\\p csr_row_ptr_A or \\\\p csr_col_ind_A or \\\\p csr_row_ptr_C or \\\\p nnz_total_dev_host_ptr\\n              or \\\\p temp_buffer pointer is invalid.\\n\\n/\\n/**@{\"]\n    pub fn rocsparse_sprune_csr2csr_nnz(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz_A: rocsparse_int,\n        csr_descr_A: rocsparse_mat_descr,\n        csr_val_A: *const f32,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        threshold: *const f32,\n        csr_descr_C: rocsparse_mat_descr,\n        csr_row_ptr_C: *mut rocsparse_int,\n        nnz_total_dev_host_ptr: *mut rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dprune_csr2csr_nnz(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz_A: rocsparse_int,\n        csr_descr_A: rocsparse_mat_descr,\n        csr_val_A: *const f64,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        threshold: *const f64,\n        csr_descr_C: rocsparse_mat_descr,\n        csr_row_ptr_C: *mut rocsparse_int,\n        nnz_total_dev_host_ptr: *mut rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief Convert and prune sparse CSR matrix into a sparse CSR matrix\\n\\n  \\\\details\\n  This function converts the sparse CSR matrix A into a sparse CSR matrix C by pruning values in A\\n  that are less than the threshold. All the parameters are assumed to have been pre-allocated by the user.\\n  The user first calls rocsparse_xprune_csr2csr_buffer_size() to determine the size of the buffer used\\n  by rocsparse_xprune_csr2csr_nnz() and rocsparse_xprune_csr2csr() which the user then allocates. The user then\\n  allocates \\\\p csr_row_ptr_C to have \\\\p m+1 elements and then calls rocsparse_xprune_csr2csr_nnz() which fills\\n  in the \\\\p csr_row_ptr_C array stores then number of elements that are larger than the pruning threshold\\n  in \\\\p nnz_total_dev_host_ptr. The user then calls rocsparse_xprune_csr2csr() to complete the conversion.\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle        handle to the rocsparse library context queue.\\n  @param[in]\\n  m             number of rows in the sparse CSR matrix.\\n  @param[in]\\n  n             number of columns in the sparse CSR matrix.\\n  @param[in]\\n  nnz_A         number of non-zeros in the sparse CSR matrix A.\\n  @param[in]\\n  csr_descr_A   descriptor of the sparse CSR matrix A. Currently, only\\n                \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  csr_val_A     array of \\\\p nnz_A elements containing the values of the sparse CSR matrix A.\\n  @param[in]\\n  csr_row_ptr_A array of \\\\p m+1 elements that point to the start of every row of the\\n                sparse CSR matrix A.\\n  @param[in]\\n  csr_col_ind_A array of \\\\p nnz_A elements containing the column indices of the sparse CSR matrix A.\\n  @param[in]\\n  threshold     pointer to the non-negative pruning threshold which can exist in either host or device memory.\\n  @param[in]\\n  csr_descr_C   descriptor of the sparse CSR matrix C. Currently, only\\n                \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[out]\\n  csr_val_C     array of \\\\p nnz_C elements containing the values of the sparse CSR matrix C.\\n  @param[in]\\n  csr_row_ptr_C array of \\\\p m+1 elements that point to the start of every row of the\\n                sparse CSR matrix C.\\n  @param[out]\\n  csr_col_ind_C array of \\\\p nnz_C elements containing the column indices of the sparse CSR matrix C.\\n  @param[in]\\n  temp_buffer   buffer allocated by the user whose size is determined by calling \\\\p rocsparse_xprune_csr2csr_buffer_size().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p n or \\\\p nnz_A is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p threshold or \\\\p csr_descr_A or \\\\p csr_descr_C or \\\\p csr_val_A\\n              or \\\\p csr_row_ptr_A or \\\\p csr_col_ind_A or \\\\p csr_val_C or \\\\p csr_row_ptr_C or \\\\p csr_col_ind_C\\n              or \\\\p temp_buffer pointer is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_sprune_csr2csr(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz_A: rocsparse_int,\n        csr_descr_A: rocsparse_mat_descr,\n        csr_val_A: *const f32,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        threshold: *const f32,\n        csr_descr_C: rocsparse_mat_descr,\n        csr_val_C: *mut f32,\n        csr_row_ptr_C: *const rocsparse_int,\n        csr_col_ind_C: *mut rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dprune_csr2csr(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz_A: rocsparse_int,\n        csr_descr_A: rocsparse_mat_descr,\n        csr_val_A: *const f64,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        threshold: *const f64,\n        csr_descr_C: rocsparse_mat_descr,\n        csr_val_C: *mut f64,\n        csr_row_ptr_C: *const rocsparse_int,\n        csr_col_ind_C: *mut rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief Convert and prune by percentage a sparse CSR matrix into a sparse CSR matrix\\n\\n  \\\\details\\n  \\\\p rocsparse_prune_csr2csr__by_percentage_buffer_size returns the size of the temporary buffer that\\n  is required by \\\\p rocsparse_sprune_csr2csr_nnz_by_percentage, \\\\p rocsparse_dprune_csr2csr_nnz_by_percentage,\\n  \\\\p rocsparse_sprune_csr2csr_by_percentage, and \\\\p rocsparse_dprune_csr2csr_by_percentage. The temporary storage\\n  buffer must be allocated by the user.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle        handle to the rocsparse library context queue.\\n  @param[in]\\n  m             number of rows in the sparse CSR matrix.\\n  @param[in]\\n  n             number of columns in the sparse CSR matrix.\\n  @param[in]\\n  nnz_A         number of non-zeros in the sparse CSR matrix A.\\n  @param[in]\\n  csr_descr_A   descriptor of the sparse CSR matrix A. Currently, only\\n                \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  csr_val_A     array of \\\\p nnz_A elements containing the values of the sparse CSR matrix A.\\n  @param[in]\\n  csr_row_ptr_A array of \\\\p m+1 elements that point to the start of every row of the\\n                sparse CSR matrix A.\\n  @param[in]\\n  csr_col_ind_A array of \\\\p nnz_A elements containing the column indices of the sparse CSR matrix A.\\n  @param[in]\\n  percentage     percentage >= 0 and percentage <= 100.\\n  @param[in]\\n  csr_descr_C   descriptor of the sparse CSR matrix C. Currently, only\\n                \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  csr_val_C     array of \\\\p nnz_C elements containing the values of the sparse CSR matrix C.\\n  @param[in]\\n  csr_row_ptr_C array of \\\\p m+1 elements that point to the start of every row of the\\n                sparse CSR matrix C.\\n  @param[in]\\n  csr_col_ind_C array of \\\\p nnz_C elements containing the column indices of the sparse CSR matrix C.\\n  @param[in]\\n  info          prune info structure.\\n  @param[out]\\n  buffer_size   number of bytes of the temporary storage buffer required by \\\\p rocsparse_sprune_csr2csr_nnz_by_percentage,\\n                \\\\p rocsparse_dprune_csr2csr_nnz_by_percentage, \\\\p rocsparse_sprune_csr2csr_by_percentage,\\n                and \\\\p rocsparse_dprune_csr2csr_by_percentage.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p buffer_size pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n\\n/\\n/**@{\"]\n    pub fn rocsparse_sprune_csr2csr_by_percentage_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz_A: rocsparse_int,\n        csr_descr_A: rocsparse_mat_descr,\n        csr_val_A: *const f32,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        percentage: f32,\n        csr_descr_C: rocsparse_mat_descr,\n        csr_val_C: *const f32,\n        csr_row_ptr_C: *const rocsparse_int,\n        csr_col_ind_C: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dprune_csr2csr_by_percentage_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz_A: rocsparse_int,\n        csr_descr_A: rocsparse_mat_descr,\n        csr_val_A: *const f64,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        percentage: f64,\n        csr_descr_C: rocsparse_mat_descr,\n        csr_val_C: *const f64,\n        csr_row_ptr_C: *const rocsparse_int,\n        csr_col_ind_C: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief Convert and prune by percentage a sparse CSR matrix into a sparse CSR matrix\\n\\n  \\\\details\\n  \\\\p rocsparse_prune_csr2csr_nnz_by_percentage computes the number of nonzero elements per row and the total\\n  number of nonzero elements in a sparse CSR matrix once elements less than the threshold are\\n  pruned from the matrix.\\n\\n  \\\\note The routine does support asynchronous execution if the pointer mode is set to device.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle        handle to the rocsparse library context queue.\\n  @param[in]\\n  m             number of rows in the sparse CSR matrix.\\n  @param[in]\\n  n             number of columns in the sparse CSR matrix.\\n  @param[in]\\n  nnz_A         number of non-zeros in the sparse CSR matrix A.\\n  @param[in]\\n  csr_descr_A   descriptor of the sparse CSR matrix A. Currently, only\\n                \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  csr_val_A     array of \\\\p nnz_A elements containing the values of the sparse CSR matrix A.\\n  @param[in]\\n  csr_row_ptr_A array of \\\\p m+1 elements that point to the start of every row of the\\n                sparse CSR matrix A.\\n  @param[in]\\n  csr_col_ind_A array of \\\\p nnz_A elements containing the column indices of the sparse CSR matrix A.\\n  @param[in]\\n  percentage    percentage >= 0 and percentage <= 100.\\n  @param[in]\\n  csr_descr_C   descriptor of the sparse CSR matrix C. Currently, only\\n                \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[out]\\n  csr_row_ptr_C array of \\\\p m+1 elements that point to the start of every row of the\\n                sparse CSR matrix C.\\n  @param[out]\\n  nnz_total_dev_host_ptr total number of nonzero elements in device or host memory.\\n  @param[in]\\n  info          prune info structure.\\n  @param[out]\\n  temp_buffer   buffer allocated by the user whose size is determined by calling\\n                \\\\p rocsparse_xprune_csr2csr_by_percentage_buffer_size().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p n or \\\\p nnz_A or \\\\p percentage is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p csr_descr_A or \\\\p csr_descr_C or \\\\p info or \\\\p csr_val_A\\n              or \\\\p csr_row_ptr_A or \\\\p csr_col_ind_A or \\\\p csr_row_ptr_C or \\\\p nnz_total_dev_host_ptr\\n              or \\\\p temp_buffer pointer is invalid.\\n\\n/\\n/**@{\"]\n    pub fn rocsparse_sprune_csr2csr_nnz_by_percentage(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz_A: rocsparse_int,\n        csr_descr_A: rocsparse_mat_descr,\n        csr_val_A: *const f32,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        percentage: f32,\n        csr_descr_C: rocsparse_mat_descr,\n        csr_row_ptr_C: *mut rocsparse_int,\n        nnz_total_dev_host_ptr: *mut rocsparse_int,\n        info: rocsparse_mat_info,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dprune_csr2csr_nnz_by_percentage(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz_A: rocsparse_int,\n        csr_descr_A: rocsparse_mat_descr,\n        csr_val_A: *const f64,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        percentage: f64,\n        csr_descr_C: rocsparse_mat_descr,\n        csr_row_ptr_C: *mut rocsparse_int,\n        nnz_total_dev_host_ptr: *mut rocsparse_int,\n        info: rocsparse_mat_info,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief Convert and prune by percentage a sparse CSR matrix into a sparse CSR matrix\\n\\n  \\\\details\\n  This function converts the sparse CSR matrix A into a sparse CSR matrix C by pruning values in A\\n  that are less than the threshold. All the parameters are assumed to have been pre-allocated by the user.\\n  The user first calls rocsparse_xprune_csr2csr_buffer_size() to determine the size of the buffer used\\n  by rocsparse_xprune_csr2csr_nnz() and rocsparse_xprune_csr2csr() which the user then allocates. The user then\\n  allocates \\\\p csr_row_ptr_C to have \\\\p m+1 elements and then calls rocsparse_xprune_csr2csr_nnz() which fills\\n  in the \\\\p csr_row_ptr_C array stores then number of elements that are larger than the pruning threshold\\n  in \\\\p nnz_total_dev_host_ptr. The user then calls rocsparse_xprune_csr2csr() to complete the conversion.\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle        handle to the rocsparse library context queue.\\n  @param[in]\\n  m             number of rows in the sparse CSR matrix.\\n  @param[in]\\n  n             number of columns in the sparse CSR matrix.\\n  @param[in]\\n  nnz_A         number of non-zeros in the sparse CSR matrix A.\\n  @param[in]\\n  csr_descr_A   descriptor of the sparse CSR matrix A. Currently, only\\n                \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  csr_val_A     array of \\\\p nnz_A elements containing the values of the sparse CSR matrix A.\\n  @param[in]\\n  csr_row_ptr_A array of \\\\p m+1 elements that point to the start of every row of the\\n                sparse CSR matrix A.\\n  @param[in]\\n  csr_col_ind_A array of \\\\p nnz_A elements containing the column indices of the sparse CSR matrix A.\\n  @param[in]\\n  percentage    percentage >= 0 and percentage <= 100.\\n  @param[in]\\n  csr_descr_C   descriptor of the sparse CSR matrix C. Currently, only\\n                \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[out]\\n  csr_val_C     array of \\\\p nnz_C elements containing the values of the sparse CSR matrix C.\\n  @param[in]\\n  csr_row_ptr_C array of \\\\p m+1 elements that point to the start of every row of the\\n                sparse CSR matrix C.\\n  @param[out]\\n  csr_col_ind_C array of \\\\p nnz_C elements containing the column indices of the sparse CSR matrix C.\\n  @param[in]\\n  info          prune info structure.\\n  @param[in]\\n  temp_buffer   buffer allocated by the user whose size is determined by calling \\\\p rocsparse_xprune_csr2csr_buffer_size().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p n or \\\\p nnz_A or \\\\p percentage is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p csr_descr_A or \\\\p csr_descr_C or \\\\p info or \\\\p csr_val_A\\n              or \\\\p csr_row_ptr_A or \\\\p csr_col_ind_A or \\\\p csr_val_C or \\\\p csr_row_ptr_C or \\\\p csr_col_ind_C\\n              or \\\\p temp_buffer pointer is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_sprune_csr2csr_by_percentage(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz_A: rocsparse_int,\n        csr_descr_A: rocsparse_mat_descr,\n        csr_val_A: *const f32,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        percentage: f32,\n        csr_descr_C: rocsparse_mat_descr,\n        csr_val_C: *mut f32,\n        csr_row_ptr_C: *const rocsparse_int,\n        csr_col_ind_C: *mut rocsparse_int,\n        info: rocsparse_mat_info,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dprune_csr2csr_by_percentage(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz_A: rocsparse_int,\n        csr_descr_A: rocsparse_mat_descr,\n        csr_val_A: *const f64,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        percentage: f64,\n        csr_descr_C: rocsparse_mat_descr,\n        csr_val_C: *mut f64,\n        csr_row_ptr_C: *const rocsparse_int,\n        csr_col_ind_C: *mut rocsparse_int,\n        info: rocsparse_mat_info,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief\\n  This function computes the the size of the user allocated temporary storage buffer used when converting and pruning\\n  a dense matrix to a CSR matrix.\\n\\n  \\\\details\\n  \\\\p rocsparse_prune_dense2csr_buffer_size returns the size of the temporary storage buffer\\n  that is required by rocsparse_sprune_dense2csr_nnz(), rocsparse_dprune_dense2csr_nnz(),\\n  rocsparse_sprune_dense2csr(), and rocsparse_dprune_dense2csr(). The temporary\\n  storage buffer must be allocated by the user.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n\\n  @param[in]\\n  m           number of rows of the dense matrix \\\\p A.\\n\\n  @param[in]\\n  n           number of columns of the dense matrix \\\\p A.\\n\\n  @param[in]\\n  A           array of dimensions (\\\\p lda, \\\\p n)\\n\\n  @param[in]\\n  lda         leading dimension of dense array \\\\p A.\\n\\n  @param[in]\\n  threshold   pointer to the pruning non-negative threshold which can exist in either host or device memory.\\n\\n  @param[in]\\n  descr      the descriptor of the dense matrix \\\\p A, the supported matrix type is rocsparse_matrix_type_general and also any valid value of the \\\\ref rocsparse_index_base.\\n\\n  @param[in]\\n  csr_val\\n              array of nnz ( = \\\\p csr_row_ptr[m] - \\\\p csr_row_ptr[0] ) nonzero elements of matrix \\\\p A.\\n  @param[in]\\n  csr_row_ptr\\n              integer array of \\\\p m+1 elements that contains the start of every row and the end of the last row plus one.\\n  @param[in]\\n  csr_col_ind\\n              integer array of nnz ( = \\\\p csr_row_ptr[m] - csr_row_ptr[0] ) column indices of the non-zero elements of matrix \\\\p A.\\n\\n  @param[out]\\n  buffer_size number of bytes of the temporary storage buffer required by\\n              rocsparse_sprune_dense2csr_nnz(), rocsparse_dprune_dense2csr_nnz(),\\n              rocsparse_sprune_dense2csr() and rocsparse_dprune_dense2csr().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p buffer_size pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n/\\n/**@{\"]\n    pub fn rocsparse_sprune_dense2csr_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        A: *const f32,\n        lda: rocsparse_int,\n        threshold: *const f32,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dprune_dense2csr_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        A: *const f64,\n        lda: rocsparse_int,\n        threshold: *const f64,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief\\n  This function computes the number of nonzero elements per row and the total number of nonzero elements in a dense matrix once\\n  elements less than the threshold are pruned from the matrix.\\n\\n  \\\\details\\n  The routine does support asynchronous execution if the pointer mode is set to device.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n\\n  @param[in]\\n  m           number of rows of the dense matrix \\\\p A.\\n\\n  @param[in]\\n  n           number of columns of the dense matrix \\\\p A.\\n\\n  @param[in]\\n  A           array of dimensions (\\\\p lda, \\\\p n)\\n\\n  @param[in]\\n  lda         leading dimension of dense array \\\\p A.\\n\\n  @param[in]\\n  threshold   pointer to the pruning non-negative threshold which can exist in either host or device memory.\\n\\n  @param[in]\\n  descr      the descriptor of the dense matrix \\\\p A.\\n\\n  @param[out]\\n  csr_row_ptr\\n              integer array of \\\\p m+1 elements that contains the start of every row and the end of the last row plus one.\\n  @param[out]\\n  nnz_total_dev_host_ptr\\n              total number of nonzero elements in device or host memory.\\n\\n  @param[out]\\n  temp_buffer\\n              buffer allocated by the user whose size is determined by calling rocsparse_xprune_dense2csr_buffer_size().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p n or \\\\p lda is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p A or \\\\p threshold or \\\\p descr or \\\\p csr_row_ptr\\n              or \\\\p nnz_total_dev_host_ptr or \\\\p temp_buffer pointer is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_sprune_dense2csr_nnz(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        A: *const f32,\n        lda: rocsparse_int,\n        threshold: *const f32,\n        descr: rocsparse_mat_descr,\n        csr_row_ptr: *mut rocsparse_int,\n        nnz_total_dev_host_ptr: *mut rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dprune_dense2csr_nnz(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        A: *const f64,\n        lda: rocsparse_int,\n        threshold: *const f64,\n        descr: rocsparse_mat_descr,\n        csr_row_ptr: *mut rocsparse_int,\n        nnz_total_dev_host_ptr: *mut rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief\\n  This function converts the matrix A in dense format into a sparse matrix in CSR format while pruning values\\n  that are less than the threshold. All the parameters are assumed to have been pre-allocated by the user.\\n\\n  \\\\details\\n  The user first allocates \\\\p csr_row_ptr to have \\\\p m+1 elements and then calls rocsparse_xprune_dense2csr_nnz()\\n  which fills in the \\\\p csr_row_ptr array and stores the number of elements that are larger than the pruning threshold\\n  in \\\\p nnz_total_dev_host_ptr. The user then allocates \\\\p csr_col_ind and \\\\p csr_val to have size \\\\p nnz_total_dev_host_ptr\\n  and completes the conversion by calling rocsparse_xprune_dense2csr(). A temporary storage buffer is used by both\\n  rocsparse_xprune_dense2csr_nnz() and rocsparse_xprune_dense2csr() and must be allocated by the user and whose size is determined\\n  by rocsparse_xprune_dense2csr_buffer_size().\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n\\n  @param[in]\\n  m           number of rows of the dense matrix \\\\p A.\\n\\n  @param[in]\\n  n           number of columns of the dense matrix \\\\p A.\\n\\n  @param[in]\\n  A           array of dimensions (\\\\p lda, \\\\p n)\\n\\n  @param[in]\\n  lda         leading dimension of dense array \\\\p A.\\n\\n  @param[in]\\n  threshold   pointer to the non-negative pruning threshold which can exist in either host or device memory.\\n\\n  @param[in]\\n  descr      the descriptor of the dense matrix \\\\p A, the supported matrix type is rocsparse_matrix_type_general and also any valid value of the \\\\ref rocsparse_index_base.\\n\\n  @param[out]\\n  csr_val\\n              array of nnz ( = \\\\p csr_row_ptr[m] - \\\\p csr_row_ptr[0] ) nonzero elements of matrix \\\\p A.\\n  @param[in]\\n  csr_row_ptr\\n              integer array of \\\\p m+1 elements that contains the start of every row and the end of the last row plus one.\\n  @param[out]\\n  csr_col_ind\\n              integer array of nnz ( = \\\\p csr_row_ptr[m] - csr_row_ptr[0] ) column indices of the non-zero elements of matrix \\\\p A.\\n\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user, size is returned by\\n              rocsparse_xprune_dense2csr_buffer_size().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p n or \\\\p lda is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p A or \\\\p descr or \\\\p threshold or \\\\p csr_val\\n              or \\\\p csr_row_ptr or \\\\p csr_col_ind or \\\\p temp_buffer pointer is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_sprune_dense2csr(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        A: *const f32,\n        lda: rocsparse_int,\n        threshold: *const f32,\n        descr: rocsparse_mat_descr,\n        csr_val: *mut f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *mut rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dprune_dense2csr(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        A: *const f64,\n        lda: rocsparse_int,\n        threshold: *const f64,\n        descr: rocsparse_mat_descr,\n        csr_val: *mut f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *mut rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief\\n  This function computes the size of the user allocated temporary storage buffer used when converting and pruning by percentage a\\n  dense matrix to a CSR matrix.\\n\\n  \\\\details\\n  When converting and pruning a dense matrix A to a CSR matrix by percentage the following steps are performed. First the user\\n  calls \\\\p rocsparse_prune_dense2csr_by_percentage_buffer_size which determines the size of the temporary storage buffer. Once\\n  determined, this buffer must be allocated by the user. Next the user allocates the csr_row_ptr array to have \\\\p m+1 elements\\n  and calls \\\\p rocsparse_prune_dense2csr_nnz_by_percentage. Finally the user finishes the conversion by allocating the csr_col_ind\\n  and csr_val arrays (whos size is determined by the value at nnz_total_dev_host_ptr) and calling \\\\p rocsparse_prune_dense2csr_by_percentage.\\n\\n  The pruning by percentage works by first sorting the absolute values of the dense matrix \\\\p A. We then determine a position in this\\n  sorted array by\\n  \\\\f[\\n    pos = ceil(m*n*(percentage/100)) - 1\\n    pos = min(pos, m*n-1)\\n    pos = max(pos, 0)\\n    threshold = sorted_A[pos]\\n  \\\\f]\\n  Once we have this threshold we prune values in the dense matrix \\\\p A as in \\\\p rocsparse_prune_dense2csr.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n\\n  @param[in]\\n  m           number of rows of the dense matrix \\\\p A.\\n\\n  @param[in]\\n  n           number of columns of the dense matrix \\\\p A.\\n\\n  @param[in]\\n  A           array of dimensions (\\\\p lda, \\\\p n)\\n\\n  @param[in]\\n  lda         leading dimension of dense array \\\\p A.\\n\\n  @param[in]\\n  percentage  percentage >= 0 and percentage <= 100.\\n\\n  @param[in]\\n  descr      the descriptor of the dense matrix \\\\p A, the supported matrix type is rocsparse_matrix_type_general and also any valid value of the \\\\ref rocsparse_index_base.\\n\\n  @param[in]\\n  csr_val    array of nnz ( = \\\\p csr_row_ptr[m] - \\\\p csr_row_ptr[0] ) nonzero elements of matrix \\\\p A.\\n\\n  @param[in]\\n  csr_row_ptr integer array of \\\\p m+1 elements that contains the start of every row and the end of the last row plus one.\\n\\n  @param[in]\\n  csr_col_ind integer array of nnz ( = \\\\p csr_row_ptr[m] - csr_row_ptr[0] ) column indices of the non-zero elements of matrix \\\\p A.\\n\\n  @param[in]\\n  info prune information structure\\n\\n  @param[out]\\n  buffer_size number of bytes of the temporary storage buffer required by\\n              rocsparse_sprune_dense2csr_nnz_by_percentage(), rocsparse_dprune_dense2csr_nnz_by_percentage(),\\n              rocsparse_sprune_dense2csr_by_percentage() and rocsparse_dprune_dense2csr_by_percentage().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p buffer_size pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n/\\n/**@{\"]\n    pub fn rocsparse_sprune_dense2csr_by_percentage_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        A: *const f32,\n        lda: rocsparse_int,\n        percentage: f32,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dprune_dense2csr_by_percentage_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        A: *const f64,\n        lda: rocsparse_int,\n        percentage: f64,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief\\n  This function computes the number of nonzero elements per row and the total number of nonzero elements in a dense matrix\\n  when converting and pruning by percentage a dense matrix to a CSR matrix.\\n\\n  \\\\details\\n  When converting and pruning a dense matrix A to a CSR matrix by percentage the following steps are performed. First the user\\n  calls \\\\p rocsparse_prune_dense2csr_by_percentage_buffer_size which determines the size of the temporary storage buffer. Once\\n  determined, this buffer must be allocated by the user. Next the user allocates the csr_row_ptr array to have \\\\p m+1 elements\\n  and calls \\\\p rocsparse_prune_dense2csr_nnz_by_percentage. Finally the user finishes the conversion by allocating the csr_col_ind\\n  and csr_val arrays (whos size is determined by the value at nnz_total_dev_host_ptr) and calling \\\\p rocsparse_prune_dense2csr_by_percentage.\\n\\n  The pruning by percentage works by first sorting the absolute values of the dense matrix \\\\p A. We then determine a position in this\\n  sorted array by\\n  \\\\f[\\n    pos = ceil(m*n*(percentage/100)) - 1\\n    pos = min(pos, m*n-1)\\n    pos = max(pos, 0)\\n    threshold = sorted_A[pos]\\n  \\\\f]\\n  Once we have this threshold we prune values in the dense matrix \\\\p A as in \\\\p rocsparse_prune_dense2csr.\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n\\n  @param[in]\\n  m           number of rows of the dense matrix \\\\p A.\\n\\n  @param[in]\\n  n           number of columns of the dense matrix \\\\p A.\\n\\n  @param[in]\\n  A           array of dimensions (\\\\p lda, \\\\p n)\\n\\n  @param[in]\\n  lda         leading dimension of dense array \\\\p A.\\n\\n  @param[in]\\n  percentage  percentage >= 0 and percentage <= 100.\\n\\n  @param[in]\\n  descr       the descriptor of the dense matrix \\\\p A.\\n\\n  @param[out]\\n  csr_row_ptr integer array of \\\\p m+1 elements that contains the start of every row and the end of the last row plus one.\\n\\n  @param[out]\\n  nnz_total_dev_host_ptr total number of nonzero elements in device or host memory.\\n\\n  @param[in]\\n  info prune information structure\\n\\n  @param[out]\\n  temp_buffer buffer allocated by the user whose size is determined by calling rocsparse_xprune_dense2csr_buffer_size().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p n or \\\\p lda or \\\\p percentage is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p A or \\\\p descr or \\\\p info or \\\\p csr_row_ptr\\n              or \\\\p nnz_total_dev_host_ptr or \\\\p temp_buffer pointer is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_sprune_dense2csr_nnz_by_percentage(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        A: *const f32,\n        lda: rocsparse_int,\n        percentage: f32,\n        descr: rocsparse_mat_descr,\n        csr_row_ptr: *mut rocsparse_int,\n        nnz_total_dev_host_ptr: *mut rocsparse_int,\n        info: rocsparse_mat_info,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dprune_dense2csr_nnz_by_percentage(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        A: *const f64,\n        lda: rocsparse_int,\n        percentage: f64,\n        descr: rocsparse_mat_descr,\n        csr_row_ptr: *mut rocsparse_int,\n        nnz_total_dev_host_ptr: *mut rocsparse_int,\n        info: rocsparse_mat_info,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup conv_module\\n  \\\\brief\\n  This function converts the matrix A in dense format into a sparse matrix in CSR format while pruning values\\n  based on percentage.\\n\\n  \\\\details\\n  When converting and pruning a dense matrix A to a CSR matrix by percentage the following steps are performed. First the user\\n  calls \\\\p rocsparse_prune_dense2csr_by_percentage_buffer_size which determines the size of the temporary storage buffer. Once\\n  determined, this buffer must be allocated by the user. Next the user allocates the csr_row_ptr array to have \\\\p m+1 elements\\n  and calls \\\\p rocsparse_prune_dense2csr_nnz_by_percentage. Finally the user finishes the conversion by allocating the csr_col_ind\\n  and csr_val arrays (whos size is determined by the value at nnz_total_dev_host_ptr) and calling \\\\p rocsparse_prune_dense2csr_by_percentage.\\n\\n  The pruning by percentage works by first sorting the absolute values of the dense matrix \\\\p A. We then determine a position in this\\n  sorted array by\\n  \\\\f[\\n    pos = ceil(m*n*(percentage/100)) - 1\\n    pos = min(pos, m*n-1)\\n    pos = max(pos, 0)\\n    threshold = sorted_A[pos]\\n  \\\\f]\\n  Once we have this threshold we prune values in the dense matrix \\\\p A as in \\\\p rocsparse_prune_dense2csr.\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n\\n  @param[in]\\n  m           number of rows of the dense matrix \\\\p A.\\n\\n  @param[in]\\n  n           number of columns of the dense matrix \\\\p A.\\n\\n  @param[in]\\n  A           array of dimensions (\\\\p lda, \\\\p n)\\n\\n  @param[in]\\n  lda         leading dimension of dense array \\\\p A.\\n\\n  @param[in]\\n  percentage  percentage >= 0 and percentage <= 100.\\n\\n  @param[in]\\n  descr       the descriptor of the dense matrix \\\\p A, the supported matrix type is rocsparse_matrix_type_general and also any valid value of the \\\\ref rocsparse_index_base.\\n\\n  @param[out]\\n  csr_val array of nnz ( = \\\\p csr_row_ptr[m] - \\\\p csr_row_ptr[0] ) nonzero elements of matrix \\\\p A.\\n\\n  @param[in]\\n  csr_row_ptr integer array of \\\\p m+1 elements that contains the start of every row and the end of the last row plus one.\\n\\n  @param[out]\\n  csr_col_ind integer array of nnz ( = \\\\p csr_row_ptr[m] - csr_row_ptr[0] ) column indices of the non-zero elements of matrix \\\\p A.\\n\\n  @param[in]\\n  info prune information structure\\n\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user, size is returned by\\n              rocsparse_xprune_dense2csr_buffer_size().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p n or \\\\p lda or \\\\p percentage is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p A or \\\\p descr or \\\\p info or \\\\p csr_val\\n              or \\\\p csr_row_ptr or \\\\p csr_col_ind or \\\\p temp_buffer pointer is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_sprune_dense2csr_by_percentage(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        A: *const f32,\n        lda: rocsparse_int,\n        percentage: f32,\n        descr: rocsparse_mat_descr,\n        csr_val: *mut f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *mut rocsparse_int,\n        info: rocsparse_mat_info,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dprune_dense2csr_by_percentage(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        A: *const f64,\n        lda: rocsparse_int,\n        percentage: f64,\n        descr: rocsparse_mat_descr,\n        csr_val: *mut f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *mut rocsparse_int,\n        info: rocsparse_mat_info,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup extra_module\n  \\brief Sparse matrix sparse matrix addition using BSR storage format\n\n  \\details\n  \\p rocsparse_bsrgeam_nnz computes the total BSR non-zero elements and the BSR row\n  offsets, that point to the start of every row of the sparse BSR matrix, of the\n  resulting matrix C. It is assumed that \\p bsr_row_ptr_C has been allocated with\n  size \\p mb+1.\n\n  \\note\n  This function is blocking with respect to the host.\n\n  \\note\n  Currently, only \\ref rocsparse_matrix_type_general is supported.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle          handle to the rocsparse library context queue.\n  @param[in]\n  dir             direction that specifies whether to count nonzero elements by \\ref rocsparse_direction_row or by\n                  \\ref rocsparse_direction_row in the BSR matrices \\f$A\\f$, \\f$B\\f$, and \\f$C\\f$.\n  @param[in]\n  mb              number of block rows in the sparse BSR matrix \\f$op(A)\\f$ and \\f$C\\f$.\n  @param[in]\n  nb              number of block columns of the sparse BSR matrix \\f$op(B)\\f$ and\n                  \\f$C\\f$.\n  @param[in]\n  block_dim       the block dimension of the BSR matrix \\f$A\\f$. Between 1 and m where \\p m=mb*block_dim.\n  @param[in]\n  descr_A         descriptor of the sparse BSR matrix \\f$A\\f$. Currenty, only\n                  \\ref rocsparse_matrix_type_general is supported.\n  @param[in]\n  nnzb_A          number of non-zero block entries of the sparse BSR matrix \\f$A\\f$.\n  @param[in]\n  bsr_row_ptr_A   array of \\p mb+1 elements that point to the start of every block row of the\n                  sparse BSR matrix \\f$A\\f$.\n  @param[in]\n  bsr_col_ind_A   array of \\p nnzb_A elements containing the column indices of the\n                  sparse BSR matrix \\f$A\\f$.\n  @param[in]\n  descr_B         descriptor of the sparse BSR matrix \\f$B\\f$. Currenty, only\n                  \\ref rocsparse_matrix_type_general is supported.\n  @param[in]\n  nnzb_B          number of non-zero block entries of the sparse BSR matrix \\f$B\\f$.\n  @param[in]\n  bsr_row_ptr_B   array of \\p mb+1 elements that point to the start of every block row of the\n                  sparse BSR matrix \\f$B\\f$.\n  @param[in]\n  bsr_col_ind_B   array of \\p nnzb_B elements containing the block column indices of the\n                  sparse BSR matrix \\f$B\\f$.\n  @param[in]\n  descr_C         descriptor of the sparse BSR matrix \\f$C\\f$. Currenty, only\n                  \\ref rocsparse_matrix_type_general is supported.\n  @param[out]\n  bsr_row_ptr_C   array of \\p mb+1 elements that point to the start of every block row of the\n                  sparse BSR matrix \\f$C\\f$.\n  @param[out]\n  nnzb_C          pointer to the number of non-zero block entries of the sparse BSR\n                  matrix \\f$C\\f$. \\p nnzb_C can be a host or device pointer.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval rocsparse_status_invalid_size \\p mb, \\p nb, \\p kb, \\p nnzb_A or \\p nnzb_B is invalid.\n  \\retval rocsparse_status_invalid_pointer \\p descr_A, \\p bsr_row_ptr_A,\n          \\p bsr_col_ind_A, \\p descr_B, \\p bsr_row_ptr_B, \\p bsr_col_ind_B,\n          \\p descr_C, \\p bsr_row_ptr_C or \\p nnzb_C is invalid.\n  \\retval rocsparse_status_not_implemented\n          \\p rocsparse_matrix_type != \\ref rocsparse_matrix_type_general.*/\n    pub fn rocsparse_bsrgeam_nnzb(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        block_dim: rocsparse_int,\n        descr_A: rocsparse_mat_descr,\n        nnzb_A: rocsparse_int,\n        bsr_row_ptr_A: *const rocsparse_int,\n        bsr_col_ind_A: *const rocsparse_int,\n        descr_B: rocsparse_mat_descr,\n        nnzb_B: rocsparse_int,\n        bsr_row_ptr_B: *const rocsparse_int,\n        bsr_col_ind_B: *const rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        bsr_row_ptr_C: *mut rocsparse_int,\n        nnzb_C: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup extra_module\\n  \\\\brief Sparse matrix sparse matrix addition using BSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_bsrgeam multiplies the scalar \\\\f$\\\\alpha\\\\f$ with the sparse\\n  \\\\f$m \\\\times n\\\\f$ matrix \\\\f$A\\\\f$, defined in BSR storage format, multiplies the\\n  scalar \\\\f$\\\\beta\\\\f$ with the sparse \\\\f$mb \\\\times nb\\\\f$ matrix \\\\f$B\\\\f$, defined in BSR\\n  storage format, and adds both resulting matrices to obtain the sparse\\n  \\\\f$mb \\\\times nb\\\\f$ matrix \\\\f$C\\\\f$, defined in BSR storage format, such that\\n  \\\\f[\\n    C := \\\\alpha \\\\cdot A + \\\\beta \\\\cdot B.\\n  \\\\f]\\n\\n  It is assumed that \\\\p bsr_row_ptr_C has already been filled and that \\\\p bsr_val_C and\\n  \\\\p bsr_col_ind_C are allocated by the user. \\\\p bsr_row_ptr_C and allocation size of\\n  \\\\p bsr_col_ind_C and \\\\p bsr_val_C is defined by the number of non-zero block elements of\\n  the sparse BSR matrix C. Both can be obtained by rocsparse_bsrgeam_nnz().\\n\\n  \\\\note Both scalars \\\\f$\\\\alpha\\\\f$ and \\\\f$beta\\\\f$ have to be valid.\\n\\n  \\\\note Currently, only \\\\ref rocsparse_matrix_type_general is supported.\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle          handle to the rocsparse library context queue.\\n  @param[in]\\n  dir             direction that specifies whether to count nonzero elements by \\\\ref rocsparse_direction_row or by\\n                  \\\\ref rocsparse_direction_row in the BSR matrices \\\\f$A\\\\f$, \\\\f$B\\\\f$, and \\\\f$C\\\\f$.\\n  @param[in]\\n  mb               number of rows of the sparse BSR matrix \\\\f$A\\\\f$, \\\\f$B\\\\f$ and \\\\f$C\\\\f$.\\n  @param[in]\\n  nb               number of columns of the sparse BSR matrix \\\\f$A\\\\f$, \\\\f$B\\\\f$ and \\\\f$C\\\\f$.\\n  @param[in]\\n  block_dim       the block dimension of the BSR matrix \\\\f$A\\\\f$. Between 1 and m where \\\\p m=mb*block_dim.\\n  @param[in]\\n  alpha           scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  descr_A         descriptor of the sparse CSR matrix \\\\f$A\\\\f$. Currenty, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  nnzb_A           number of non-zero block entries of the sparse BSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  bsr_val_A       array of \\\\p nnzb_A block elements of the sparse BSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  bsr_row_ptr_A   array of \\\\p mb+1 block elements that point to the start of every block row of the\\n                  sparse BSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  bsr_col_ind_A   array of \\\\p nnzb_A block elements containing the block column indices of the\\n                  sparse BSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  beta            scalar \\\\f$\\\\beta\\\\f$.\\n  @param[in]\\n  descr_B         descriptor of the sparse BSR matrix \\\\f$B\\\\f$. Currenty, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  nnzb_B          number of non-zero block entries of the sparse BSR matrix \\\\f$B\\\\f$.\\n  @param[in]\\n  bsr_val_B       array of \\\\p nnzb_B block elements of the sparse BSR matrix \\\\f$B\\\\f$.\\n  @param[in]\\n  bsr_row_ptr_B   array of \\\\p mb+1 block elements that point to the start of every block row of the\\n                  sparse BSR matrix \\\\f$B\\\\f$.\\n  @param[in]\\n  bsr_col_ind_B   array of \\\\p nnzb_B block elements containing the block column indices of the\\n                  sparse BSR matrix \\\\f$B\\\\f$.\\n  @param[in]\\n  descr_C         descriptor of the sparse BSR matrix \\\\f$C\\\\f$. Currenty, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[out]\\n  bsr_val_C       array of block elements of the sparse BSR matrix \\\\f$C\\\\f$.\\n  @param[in]\\n  bsr_row_ptr_C   array of \\\\p mb+1 block elements that point to the start of every block row of the\\n                  sparse BSR matrix \\\\f$C\\\\f$.\\n  @param[out]\\n  bsr_col_ind_C   array of block elements containing the block column indices of the\\n                  sparse BSR matrix \\\\f$C\\\\f$.\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval rocsparse_status_invalid_size \\\\p mb, \\\\p nb, \\\\p nnzb_A or \\\\p nnzb_B is invalid.\\n  \\\\retval rocsparse_status_invalid_pointer \\\\p alpha, \\\\p descr_A, \\\\p bsr_val_A,\\n          \\\\p bsr_row_ptr_A, \\\\p bsr_col_ind_A, \\\\p beta, \\\\p descr_B, \\\\p bsr_val_B,\\n          \\\\p bsr_row_ptr_B, \\\\p bsr_col_ind_B, \\\\p descr_C, \\\\p csr_val_C,\\n          \\\\p bsr_row_ptr_C or \\\\p bsr_col_ind_C is invalid.\\n  \\\\retval rocsparse_status_not_implemented\\n          \\\\p rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n\\n  \\\\par Example\\n  This example adds two CSR matrices.\\n  \\\\code{.c}\\n  // Initialize scalar multipliers\\n  float alpha = 1.0f;\\n  float beta  = 1.0f;\\n\\n  // Create matrix descriptors\\n  rocsparse_mat_descr descr_A;\\n  rocsparse_mat_descr descr_B;\\n  rocsparse_mat_descr descr_C;\\n\\n  rocsparse_create_mat_descr(&descr_A);\\n  rocsparse_create_mat_descr(&descr_B);\\n  rocsparse_create_mat_descr(&descr_C);\\n\\n  // Set pointer mode\\n  rocsparse_set_pointer_mode(handle, rocsparse_pointer_mode_host);\\n\\n  // Obtain number of total non-zero block entries in C and block row pointers of C\\n  rocsparse_int nnzb_C;\\n  hipMalloc((void**)&bsr_row_ptr_C, sizeof(rocsparse_int) * (mb + 1));\\n\\n  rocsparse_bsrgeam_nnzb(handle,\\n                        dir,\\n                        mb,\\n                        nb,\\n                        block_dim,\\n                        descr_A,\\n                        nnzb_A,\\n                        bsr_row_ptr_A,\\n                        bsr_col_ind_A,\\n                        descr_B,\\n                        nnzb_B,\\n                        bsr_row_ptr_B,\\n                        bsr_col_ind_B,\\n                        descr_C,\\n                        bsr_row_ptr_C,\\n                        &nnzb_C);\\n\\n  // Compute block column indices and block values of C\\n  hipMalloc((void**)&bsr_col_ind_C, sizeof(rocsparse_int) * nnzb_C);\\n  hipMalloc((void**)&bsr_val_C, sizeof(float) * nnzb_C * block_dim * block_dim);\\n\\n  rocsparse_sbsrgeam(handle,\\n                     dir,\\n                     mb,\\n                     nb,\\n                     block_dim,\\n                     &alpha,\\n                     descr_A,\\n                     nnzb_A,\\n                     bsr_val_A,\\n                     bsr_row_ptr_A,\\n                     bsr_col_ind_A,\\n                     &beta,\\n                     descr_B,\\n                     nnzb_B,\\n                     bsr_val_B,\\n                     bsr_row_ptr_B,\\n                     bsr_col_ind_B,\\n                     descr_C,\\n                     bsr_val_C,\\n                     bsr_row_ptr_C,\\n                     bsr_col_ind_C);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_sbsrgeam(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        block_dim: rocsparse_int,\n        alpha: *const f32,\n        descr_A: rocsparse_mat_descr,\n        nnzb_A: rocsparse_int,\n        bsr_val_A: *const f32,\n        bsr_row_ptr_A: *const rocsparse_int,\n        bsr_col_ind_A: *const rocsparse_int,\n        beta: *const f32,\n        descr_B: rocsparse_mat_descr,\n        nnzb_B: rocsparse_int,\n        bsr_val_B: *const f32,\n        bsr_row_ptr_B: *const rocsparse_int,\n        bsr_col_ind_B: *const rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        bsr_val_C: *mut f32,\n        bsr_row_ptr_C: *const rocsparse_int,\n        bsr_col_ind_C: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dbsrgeam(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        block_dim: rocsparse_int,\n        alpha: *const f64,\n        descr_A: rocsparse_mat_descr,\n        nnzb_A: rocsparse_int,\n        bsr_val_A: *const f64,\n        bsr_row_ptr_A: *const rocsparse_int,\n        bsr_col_ind_A: *const rocsparse_int,\n        beta: *const f64,\n        descr_B: rocsparse_mat_descr,\n        nnzb_B: rocsparse_int,\n        bsr_val_B: *const f64,\n        bsr_row_ptr_B: *const rocsparse_int,\n        bsr_col_ind_B: *const rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        bsr_val_C: *mut f64,\n        bsr_row_ptr_C: *const rocsparse_int,\n        bsr_col_ind_C: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cbsrgeam(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        block_dim: rocsparse_int,\n        alpha: *const rocsparse_float_complex,\n        descr_A: rocsparse_mat_descr,\n        nnzb_A: rocsparse_int,\n        bsr_val_A: *const rocsparse_float_complex,\n        bsr_row_ptr_A: *const rocsparse_int,\n        bsr_col_ind_A: *const rocsparse_int,\n        beta: *const rocsparse_float_complex,\n        descr_B: rocsparse_mat_descr,\n        nnzb_B: rocsparse_int,\n        bsr_val_B: *const rocsparse_float_complex,\n        bsr_row_ptr_B: *const rocsparse_int,\n        bsr_col_ind_B: *const rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        bsr_val_C: *mut rocsparse_float_complex,\n        bsr_row_ptr_C: *const rocsparse_int,\n        bsr_col_ind_C: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zbsrgeam(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        block_dim: rocsparse_int,\n        alpha: *const rocsparse_double_complex,\n        descr_A: rocsparse_mat_descr,\n        nnzb_A: rocsparse_int,\n        bsr_val_A: *const rocsparse_double_complex,\n        bsr_row_ptr_A: *const rocsparse_int,\n        bsr_col_ind_A: *const rocsparse_int,\n        beta: *const rocsparse_double_complex,\n        descr_B: rocsparse_mat_descr,\n        nnzb_B: rocsparse_int,\n        bsr_val_B: *const rocsparse_double_complex,\n        bsr_row_ptr_B: *const rocsparse_int,\n        bsr_col_ind_B: *const rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        bsr_val_C: *mut rocsparse_double_complex,\n        bsr_row_ptr_C: *const rocsparse_int,\n        bsr_col_ind_C: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup extra_module\\n  \\\\brief Sparse matrix sparse matrix multiplication using BSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_bsrgemm_buffer_size returns the size of the temporary storage buffer\\n  that is required by rocsparse_bsrgemm_nnzb(), rocsparse_sbsrgemm(),\\n  rocsparse_dbsrgemm(), rocsparse_cbsrgemm() and rocsparse_zbsrgemm(). The temporary\\n  storage buffer must be allocated by the user.\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n  \\\\note\\n  Currently, only \\\\p trans_A == \\\\p trans_B == \\\\ref rocsparse_operation_none is\\n  supported.\\n  \\\\note\\n  Currently, only \\\\ref rocsparse_matrix_type_general is supported.\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle          handle to the rocsparse library context queue.\\n  @param[in]\\n  dir             direction that specifies whether to count nonzero elements by \\\\ref rocsparse_direction_row or by\\n                  \\\\ref rocsparse_direction_row in the BSR matrices \\\\f$A\\\\f$, \\\\f$B\\\\f$, \\\\f$C\\\\f$, and \\\\f$D\\\\f$.\\n  @param[in]\\n  trans_A         matrix \\\\f$A\\\\f$ operation type.\\n  @param[in]\\n  trans_B         matrix \\\\f$B\\\\f$ operation type.\\n  @param[in]\\n  mb              number of block rows in the sparse BSR matrix \\\\f$op(A)\\\\f$ and \\\\f$C\\\\f$.\\n  @param[in]\\n  nb              number of block columns of the sparse BSR matrix \\\\f$op(B)\\\\f$ and\\n                  \\\\f$C\\\\f$.\\n  @param[in]\\n  kb              number of block columns of the sparse BSR matrix \\\\f$op(A)\\\\f$ and number of\\n                  rows of the sparse BSR matrix \\\\f$op(B)\\\\f$.\\n  @param[in]\\n  block_dim       the block dimension of the BSR matrix \\\\f$A\\\\f$, \\\\f$B\\\\f$, \\\\f$C\\\\f$, and \\\\f$D\\\\f$.\\n  @param[in]\\n  alpha           scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  descr_A         descriptor of the sparse BSR matrix \\\\f$A\\\\f$. Currenty, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  nnzb_A          number of non-zero block entries of the sparse BSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  bsr_row_ptr_A   array of \\\\p mb+1 elements (\\\\f$op(A) == A\\\\f$, \\\\p kb+1 otherwise)\\n                  that point to the start of every block row of the sparse BSR matrix\\n                  \\\\f$op(A)\\\\f$.\\n  @param[in]\\n  bsr_col_ind_A   array of \\\\p nnzb_A elements containing the block column indices of the\\n                  sparse BSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  descr_B         descriptor of the sparse BSR matrix \\\\f$B\\\\f$. Currenty, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  nnzb_B          number of non-zero block entries of the sparse BSR matrix \\\\f$B\\\\f$.\\n  @param[in]\\n  bsr_row_ptr_B   array of \\\\p kb+1 elements (\\\\f$op(B) == B\\\\f$, \\\\p mb+1 otherwise)\\n                  that point to the start of every block row of the sparse BSR matrix\\n                  \\\\f$op(B)\\\\f$.\\n  @param[in]\\n  bsr_col_ind_B   array of \\\\p nnzb_B elements containing the block column indices of the\\n                  sparse BSR matrix \\\\f$B\\\\f$.\\n  @param[in]\\n  beta            scalar \\\\f$\\\\beta\\\\f$.\\n  @param[in]\\n  descr_D         descriptor of the sparse BSR matrix \\\\f$D\\\\f$. Currenty, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  nnzb_D          number of non-zero block entries of the sparse BSR matrix \\\\f$D\\\\f$.\\n  @param[in]\\n  bsr_row_ptr_D   array of \\\\p mb+1 elements that point to the start of every block row of the\\n                  sparse BSR matrix \\\\f$D\\\\f$.\\n  @param[in]\\n  bsr_col_ind_D   array of \\\\p nnzb_D elements containing the block column indices of the sparse\\n                  BSR matrix \\\\f$D\\\\f$.\\n  @param[inout]\\n  info_C          structure that holds meta data for the sparse BSR matrix \\\\f$C\\\\f$.\\n  @param[out]\\n  buffer_size     number of bytes of the temporary storage buffer required by\\n                  rocsparse_bsrgemm_nnzb(), rocsparse_sbsrgemm(), rocsparse_dbsrgemm(),\\n                  rocsparse_cbsrgemm() and rocsparse_zbsrgemm().\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval rocsparse_status_invalid_size \\\\p mb, \\\\p nb, \\\\p kb, \\\\p block_dim, \\\\p nnzb_A, \\\\p nnzb_B or\\n          \\\\p nnzb_D is invalid.\\n  \\\\retval rocsparse_status_invalid_pointer \\\\p alpha and \\\\p beta are invalid,\\n          \\\\p descr_A, \\\\p bsr_row_ptr_A, \\\\p bsr_col_ind_A, \\\\p descr_B,\\n          \\\\p bsr_row_ptr_B or \\\\p bsr_col_ind_B are invalid if \\\\p alpha is valid,\\n          \\\\p descr_D, \\\\p bsr_row_ptr_D or \\\\p bsr_col_ind_D is invalid if \\\\p beta is\\n          valid, \\\\p info_C or \\\\p buffer_size is invalid.\\n  \\\\retval rocsparse_status_not_implemented\\n          \\\\p trans_A != \\\\ref rocsparse_operation_none,\\n          \\\\p trans_B != \\\\ref rocsparse_operation_none, or\\n          \\\\p rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_sbsrgemm_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        kb: rocsparse_int,\n        block_dim: rocsparse_int,\n        alpha: *const f32,\n        descr_A: rocsparse_mat_descr,\n        nnzb_A: rocsparse_int,\n        bsr_row_ptr_A: *const rocsparse_int,\n        bsr_col_ind_A: *const rocsparse_int,\n        descr_B: rocsparse_mat_descr,\n        nnzb_B: rocsparse_int,\n        bsr_row_ptr_B: *const rocsparse_int,\n        bsr_col_ind_B: *const rocsparse_int,\n        beta: *const f32,\n        descr_D: rocsparse_mat_descr,\n        nnzb_D: rocsparse_int,\n        bsr_row_ptr_D: *const rocsparse_int,\n        bsr_col_ind_D: *const rocsparse_int,\n        info_C: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dbsrgemm_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        kb: rocsparse_int,\n        block_dim: rocsparse_int,\n        alpha: *const f64,\n        descr_A: rocsparse_mat_descr,\n        nnzb_A: rocsparse_int,\n        bsr_row_ptr_A: *const rocsparse_int,\n        bsr_col_ind_A: *const rocsparse_int,\n        descr_B: rocsparse_mat_descr,\n        nnzb_B: rocsparse_int,\n        bsr_row_ptr_B: *const rocsparse_int,\n        bsr_col_ind_B: *const rocsparse_int,\n        beta: *const f64,\n        descr_D: rocsparse_mat_descr,\n        nnzb_D: rocsparse_int,\n        bsr_row_ptr_D: *const rocsparse_int,\n        bsr_col_ind_D: *const rocsparse_int,\n        info_C: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cbsrgemm_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        kb: rocsparse_int,\n        block_dim: rocsparse_int,\n        alpha: *const rocsparse_float_complex,\n        descr_A: rocsparse_mat_descr,\n        nnzb_A: rocsparse_int,\n        bsr_row_ptr_A: *const rocsparse_int,\n        bsr_col_ind_A: *const rocsparse_int,\n        descr_B: rocsparse_mat_descr,\n        nnzb_B: rocsparse_int,\n        bsr_row_ptr_B: *const rocsparse_int,\n        bsr_col_ind_B: *const rocsparse_int,\n        beta: *const rocsparse_float_complex,\n        descr_D: rocsparse_mat_descr,\n        nnzb_D: rocsparse_int,\n        bsr_row_ptr_D: *const rocsparse_int,\n        bsr_col_ind_D: *const rocsparse_int,\n        info_C: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zbsrgemm_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        kb: rocsparse_int,\n        block_dim: rocsparse_int,\n        alpha: *const rocsparse_double_complex,\n        descr_A: rocsparse_mat_descr,\n        nnzb_A: rocsparse_int,\n        bsr_row_ptr_A: *const rocsparse_int,\n        bsr_col_ind_A: *const rocsparse_int,\n        descr_B: rocsparse_mat_descr,\n        nnzb_B: rocsparse_int,\n        bsr_row_ptr_B: *const rocsparse_int,\n        bsr_col_ind_B: *const rocsparse_int,\n        beta: *const rocsparse_double_complex,\n        descr_D: rocsparse_mat_descr,\n        nnzb_D: rocsparse_int,\n        bsr_row_ptr_D: *const rocsparse_int,\n        bsr_col_ind_D: *const rocsparse_int,\n        info_C: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup extra_module\n  \\brief Sparse matrix sparse matrix multiplication using BSR storage format\n\n  \\details\n  \\p rocsparse_bsrgemm_nnzb computes the total BSR non-zero block elements and the BSR block row\n  offsets, that point to the start of every block row of the sparse BSR matrix, of the\n  resulting multiplied matrix C. It is assumed that \\p bsr_row_ptr_C has been allocated\n  with size \\p mb+1.\n  The required buffer size can be obtained by rocsparse_sbsrgemm_buffer_size(),\n  rocsparse_dbsrgemm_buffer_size(), rocsparse_cbsrgemm_buffer_size() and\n  rocsparse_zbsrgemm_buffer_size(), respectively.\n\n  \\note\n  This function is blocking with respect to the host.\n  \\note\n  Currently, only \\p trans_A == \\p trans_B == \\ref rocsparse_operation_none is\n  supported.\n  \\note\n  Currently, only \\ref rocsparse_matrix_type_general is supported.\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle          handle to the rocsparse library context queue.\n  @param[in]\n  dir             direction that specifies whether to count nonzero elements by \\ref rocsparse_direction_row or by\n                  \\ref rocsparse_direction_row in the BSR matrices \\f$A\\f$, \\f$B\\f$, \\f$C\\f$, and \\f$D\\f$.\n  @param[in]\n  trans_A         matrix \\f$A\\f$ operation type.\n  @param[in]\n  trans_B         matrix \\f$B\\f$ operation type.\n  @param[in]\n  mb              number of block rows in the sparse BSR matrix \\f$op(A)\\f$ and \\f$C\\f$.\n  @param[in]\n  nb              number of block columns of the sparse BSR matrix \\f$op(B)\\f$ and\n                  \\f$C\\f$.\n  @param[in]\n  kb              number of block columns of the sparse BSR matrix \\f$op(A)\\f$ and number of\n                  rows of the sparse BSR matrix \\f$op(B)\\f$.\n  @param[in]\n  block_dim       the block dimension of the BSR matrix \\f$A\\f$, \\f$B\\f$, \\f$C\\f$, and \\f$D\\f$.\n  @param[in]\n  descr_A         descriptor of the sparse BSR matrix \\f$A\\f$. Currenty, only\n                  \\ref rocsparse_matrix_type_general is supported.\n  @param[in]\n  nnzb_A          number of non-zero block entries of the sparse BSR matrix \\f$A\\f$.\n  @param[in]\n  bsr_row_ptr_A   array of \\p mb+1 block elements (\\f$op(A) == A\\f$, \\p kb+1 otherwise)\n                  that point to the start of every row of the sparse BSR matrix\n                  \\f$op(A)\\f$.\n  @param[in]\n  bsr_col_ind_A   array of \\p nnzb_A block elements containing the block column indices of the\n                  sparse BSR matrix \\f$A\\f$.\n  @param[in]\n  descr_B         descriptor of the sparse BSR matrix \\f$B\\f$. Currenty, only\n                  \\ref rocsparse_matrix_type_general is supported.\n  @param[in]\n  nnzb_B          number of non-zero block entries of the sparse BSR matrix \\f$B\\f$.\n  @param[in]\n  bsr_row_ptr_B   array of \\p kb+1 block elements (\\f$op(B) == B\\f$, \\p mb+1 otherwise)\n                  that point to the start of every block row of the sparse BSR matrix\n                  \\f$op(B)\\f$.\n  @param[in]\n  bsr_col_ind_B   array of \\p nnzb_B block elements containing the block column indices of the\n                  sparse BSR matrix \\f$B\\f$.\n  @param[in]\n  descr_D         descriptor of the sparse BSR matrix \\f$D\\f$. Currenty, only\n                  \\ref rocsparse_matrix_type_general is supported.\n  @param[in]\n  nnzb_D          number of non-zero block entries of the sparse BSR matrix \\f$D\\f$.\n  @param[in]\n  bsr_row_ptr_D   array of \\p mb+1 block elements that point to the start of every block row of the\n                  sparse BSR matrix \\f$D\\f$.\n  @param[in]\n  bsr_col_ind_D   array of \\p nnzb_D block elements containing the block column indices of the sparse\n                  BSR matrix \\f$D\\f$.\n  @param[in]\n  descr_C         descriptor of the sparse BSR matrix \\f$C\\f$. Currenty, only\n                  \\ref rocsparse_matrix_type_general is supported.\n  @param[out]\n  bsr_row_ptr_C   array of \\p mb+1 block elements that point to the start of every block row of the\n                  sparse BSR matrix \\f$C\\f$.\n  @param[out]\n  nnzb_C          pointer to the number of non-zero block entries of the sparse BSR\n                  matrix \\f$C\\f$.\n  @param[in]\n  info_C          structure that holds meta data for the sparse BSR matrix \\f$C\\f$.\n  @param[in]\n  temp_buffer     temporary storage buffer allocated by the user, size is returned\n                  by rocsparse_sbsrgemm_buffer_size(),\n                  rocsparse_dbsrgemm_buffer_size(), rocsparse_cbsrgemm_buffer_size() or\n                  rocsparse_zbsrgemm_buffer_size().\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval rocsparse_status_invalid_size \\p mb, \\p nb, \\p kb, \\p block_dim, \\p nnzb_A, \\p nnzb_B or\n          \\p nnzb_D is invalid.\n  \\retval rocsparse_status_invalid_pointer \\p descr_A, \\p bsr_row_ptr_A,\n          \\p bsr_col_ind_A, \\p descr_B, \\p bsr_row_ptr_B, \\p bsr_col_ind_B,\n          \\p descr_D, \\p bsr_row_ptr_D, \\p bsr_col_ind_D, \\p descr_C,\n          \\p bsr_row_ptr_C, \\p nnzb_C, \\p info_C or \\p temp_buffer is invalid.\n  \\retval rocsparse_status_memory_error additional buffer for long rows could not be\n          allocated.\n  \\retval rocsparse_status_not_implemented\n          \\p trans_A != \\ref rocsparse_operation_none,\n          \\p trans_B != \\ref rocsparse_operation_none, or\n          \\p rocsparse_matrix_type != \\ref rocsparse_matrix_type_general.*/\n    pub fn rocsparse_bsrgemm_nnzb(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        kb: rocsparse_int,\n        block_dim: rocsparse_int,\n        descr_A: rocsparse_mat_descr,\n        nnzb_A: rocsparse_int,\n        bsr_row_ptr_A: *const rocsparse_int,\n        bsr_col_ind_A: *const rocsparse_int,\n        descr_B: rocsparse_mat_descr,\n        nnzb_B: rocsparse_int,\n        bsr_row_ptr_B: *const rocsparse_int,\n        bsr_col_ind_B: *const rocsparse_int,\n        descr_D: rocsparse_mat_descr,\n        nnzb_D: rocsparse_int,\n        bsr_row_ptr_D: *const rocsparse_int,\n        bsr_col_ind_D: *const rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        bsr_row_ptr_C: *mut rocsparse_int,\n        nnzb_C: *mut rocsparse_int,\n        info_C: rocsparse_mat_info,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup extra_module\\n  \\\\brief Sparse matrix sparse matrix multiplication using BSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_bsrgemm multiplies the scalar \\\\f$\\\\alpha\\\\f$ with the sparse\\n  \\\\f$mb \\\\times kb\\\\f$ matrix \\\\f$A\\\\f$, defined in BSR storage format, and the sparse\\n  \\\\f$kb \\\\times nb\\\\f$ matrix \\\\f$B\\\\f$, defined in BSR storage format, and adds the result\\n  to the sparse \\\\f$mb \\\\times nb\\\\f$ matrix \\\\f$D\\\\f$ that is multiplied by \\\\f$\\\\beta\\\\f$. The\\n  final result is stored in the sparse \\\\f$mb \\\\times nb\\\\f$ matrix \\\\f$C\\\\f$, defined in BSR\\n  storage format, such\\n  that\\n  \\\\f[\\n    C := \\\\alpha \\\\cdot op(A) \\\\cdot op(B) + \\\\beta \\\\cdot D,\\n  \\\\f]\\n  with\\n  \\\\f[\\n    op(A) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        A,   & \\\\text{if trans_A == rocsparse_operation_none} \\\\\\\\\\n        A^T, & \\\\text{if trans_A == rocsparse_operation_transpose} \\\\\\\\\\n        A^H, & \\\\text{if trans_A == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n  and\\n  \\\\f[\\n    op(B) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        B,   & \\\\text{if trans_B == rocsparse_operation_none} \\\\\\\\\\n        B^T, & \\\\text{if trans_B == rocsparse_operation_transpose} \\\\\\\\\\n        B^H, & \\\\text{if trans_B == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n\\n  It is assumed that \\\\p bsr_row_ptr_C has already been filled and that \\\\p bsr_val_C and\\n  \\\\p bsr_col_ind_C are allocated by the user. \\\\p bsr_row_ptr_C and allocation size of\\n  \\\\p bsr_col_ind_C and \\\\p bsr_val_C is defined by the number of non-zero elements of\\n  the sparse BSR matrix C. Both can be obtained by rocsparse_bsrgemm_nnzb(). The\\n  required buffer size for the computation can be obtained by\\n  rocsparse_sbsrgemm_buffer_size(), rocsparse_dbsrgemm_buffer_size(),\\n  rocsparse_cbsrgemm_buffer_size() and rocsparse_zbsrgemm_buffer_size(), respectively.\\n\\n  \\\\note If \\\\f$\\\\alpha == 0\\\\f$, then \\\\f$C = \\\\beta \\\\cdot D\\\\f$ will be computed.\\n  \\\\note If \\\\f$\\\\beta == 0\\\\f$, then \\\\f$C = \\\\alpha \\\\cdot op(A) \\\\cdot op(B)\\\\f$ will be computed.\\n  \\\\note \\\\f$\\\\alpha == beta == 0\\\\f$ is invalid.\\n  \\\\note Currently, only \\\\p trans_A == \\\\ref rocsparse_operation_none is supported.\\n  \\\\note Currently, only \\\\p trans_B == \\\\ref rocsparse_operation_none is supported.\\n  \\\\note Currently, only \\\\ref rocsparse_matrix_type_general is supported.\\n  \\\\note This function is blocking with respect to the host.\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle          handle to the rocsparse library context queue.\\n  @param[in]\\n  dir             direction that specifies whether to count nonzero elements by \\\\ref rocsparse_direction_row or by\\n                  \\\\ref rocsparse_direction_row in the BSR matrices \\\\f$A\\\\f$, \\\\f$B\\\\f$, \\\\f$C\\\\f$, and \\\\f$D\\\\f$.\\n  @param[in]\\n  trans_A         matrix \\\\f$A\\\\f$ operation type.\\n  @param[in]\\n  trans_B         matrix \\\\f$B\\\\f$ operation type.\\n  @param[in]\\n  mb              number of block rows of the sparse BSR matrix \\\\f$op(A)\\\\f$ and \\\\f$C\\\\f$.\\n  @param[in]\\n  nb              number of block columns of the sparse BSR matrix \\\\f$op(B)\\\\f$ and\\n                  \\\\f$C\\\\f$.\\n  @param[in]\\n  kb              number of block columns of the sparse BSR matrix \\\\f$op(A)\\\\f$ and number of\\n                  block rows of the sparse BSR matrix \\\\f$op(B)\\\\f$.\\n  @param[in]\\n  block_dim       the block dimension of the BSR matrix \\\\f$A\\\\f$, \\\\f$B\\\\f$, \\\\f$C\\\\f$, and \\\\f$D\\\\f$.\\n  @param[in]\\n  alpha           scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  descr_A         descriptor of the sparse BSR matrix \\\\f$A\\\\f$. Currenty, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  nnzb_A          number of non-zero block entries of the sparse BSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  bsr_val_A       array of \\\\p nnzb_A block elements of the sparse BSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  bsr_row_ptr_A   array of \\\\p mb+1 block elements (\\\\f$op(A) == A\\\\f$, \\\\p kb+1 otherwise)\\n                  that point to the start of every block row of the sparse BSR matrix\\n                  \\\\f$op(A)\\\\f$.\\n  @param[in]\\n  bsr_col_ind_A   array of \\\\p nnzb_A block elements containing the block column indices of the\\n                  sparse BSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  descr_B         descriptor of the sparse BSR matrix \\\\f$B\\\\f$. Currenty, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  nnzb_B          number of non-zero block entries of the sparse BSR matrix \\\\f$B\\\\f$.\\n  @param[in]\\n  bsr_val_B       array of \\\\p nnzb_B block elements of the sparse BSR matrix \\\\f$B\\\\f$.\\n  @param[in]\\n  bsr_row_ptr_B   array of \\\\p kb+1 block elements (\\\\f$op(B) == B\\\\f$, \\\\p mb+1 otherwise)\\n                  that point to the start of every block row of the sparse BSR matrix\\n                  \\\\f$op(B)\\\\f$.\\n  @param[in]\\n  bsr_col_ind_B   array of \\\\p nnzb_B block elements containing the block column indices of the\\n                  sparse BSR matrix \\\\f$B\\\\f$.\\n  @param[in]\\n  beta            scalar \\\\f$\\\\beta\\\\f$.\\n  @param[in]\\n  descr_D         descriptor of the sparse BSR matrix \\\\f$D\\\\f$. Currenty, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  nnzb_D          number of non-zero block entries of the sparse BSR matrix \\\\f$D\\\\f$.\\n  @param[in]\\n  bsr_val_D       array of \\\\p nnzb_D block elements of the sparse BSR matrix \\\\f$D\\\\f$.\\n  @param[in]\\n  bsr_row_ptr_D   array of \\\\p mb+1 block elements that point to the start of every block row of the\\n                  sparse BSR matrix \\\\f$D\\\\f$.\\n  @param[in]\\n  bsr_col_ind_D   array of \\\\p nnzb_D block elements containing the block column indices of the\\n                  sparse BSR matrix \\\\f$D\\\\f$.\\n  @param[in]\\n  descr_C         descriptor of the sparse BSR matrix \\\\f$C\\\\f$. Currenty, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[out]\\n  bsr_val_C       array of \\\\p nnzb_C elements of the sparse BSR matrix \\\\f$C\\\\f$.\\n  @param[in]\\n  bsr_row_ptr_C   array of \\\\p mb+1 block elements that point to the start of every block row of the\\n                  sparse BSR matrix \\\\f$C\\\\f$.\\n  @param[out]\\n  bsr_col_ind_C   array of \\\\p nnzb_C block elements containing the block column indices of the\\n                  sparse BSR matrix \\\\f$C\\\\f$.\\n  @param[in]\\n  info_C          structure that holds meta data for the sparse BSR matrix \\\\f$C\\\\f$.\\n  @param[in]\\n  temp_buffer     temporary storage buffer allocated by the user, size is returned\\n                  by rocsparse_sbsrgemm_buffer_size(),\\n                  rocsparse_dbsrgemm_buffer_size(), rocsparse_cbsrgemm_buffer_size() or\\n                  rocsparse_zbsrgemm_buffer_size().\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval rocsparse_status_invalid_size \\\\p mb, \\\\p nb, \\\\p kb, \\\\p block_dim, \\\\p nnzb_A, \\\\p nnzb_B or\\n          \\\\p nnzb_D is invalid.\\n  \\\\retval rocsparse_status_invalid_pointer \\\\p alpha and \\\\p beta are invalid,\\n          \\\\p descr_A, \\\\p bsr_val_A, \\\\p bsr_row_ptr_A, \\\\p bsr_col_ind_A, \\\\p descr_B,\\n          \\\\p bsr_val_B, \\\\p bsr_row_ptr_B or \\\\p bsr_col_ind_B are invalid if \\\\p alpha\\n          is valid, \\\\p descr_D, \\\\p bsr_val_D, \\\\p bsr_row_ptr_D or \\\\p bsr_col_ind_D is\\n          invalid if \\\\p beta is valid, \\\\p bsr_val_C, \\\\p bsr_row_ptr_C,\\n          \\\\p bsr_col_ind_C, \\\\p info_C or \\\\p temp_buffer is invalid.\\n  \\\\retval rocsparse_status_memory_error additional buffer for long rows could not be\\n          allocated.\\n  \\\\retval rocsparse_status_not_implemented\\n          \\\\p trans_A != \\\\ref rocsparse_operation_none,\\n          \\\\p trans_B != \\\\ref rocsparse_operation_none, or\\n          \\\\p rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n\\n  \\\\par Example\\n  This example multiplies two BSR matrices with a scalar alpha and adds the result to\\n  another BSR matrix.\\n  \\\\code{.c}\\n  // Initialize scalar multipliers\\n  float alpha = 2.0f;\\n  float beta  = 1.0f;\\n\\n  // Create matrix descriptors\\n  rocsparse_mat_descr descr_A;\\n  rocsparse_mat_descr descr_B;\\n  rocsparse_mat_descr descr_C;\\n  rocsparse_mat_descr descr_D;\\n\\n  rocsparse_create_mat_descr(&descr_A);\\n  rocsparse_create_mat_descr(&descr_B);\\n  rocsparse_create_mat_descr(&descr_C);\\n  rocsparse_create_mat_descr(&descr_D);\\n\\n  // Create matrix info structure\\n  rocsparse_mat_info info_C;\\n  rocsparse_create_mat_info(&info_C);\\n\\n  // Set pointer mode\\n  rocsparse_set_pointer_mode(handle, rocsparse_pointer_mode_host);\\n\\n  // Query rocsparse for the required buffer size\\n  size_t buffer_size;\\n\\n  rocsparse_sbsrgemm_buffer_size(handle,\\n                                 rocsparse_direction_row,\\n                                 rocsparse_operation_none,\\n                                 rocsparse_operation_none,\\n                                 mb,\\n                                 nb,\\n                                 kb,\\n                                 block_dim,\\n                                 &alpha,\\n                                 descr_A,\\n                                 nnzb_A,\\n                                 bsr_row_ptr_A,\\n                                 bsr_col_ind_A,\\n                                 descr_B,\\n                                 nnzb_B,\\n                                 bsr_row_ptr_B,\\n                                 bsr_col_ind_B,\\n                                 &beta,\\n                                 descr_D,\\n                                 nnzb_D,\\n                                 bsr_row_ptr_D,\\n                                 bsr_col_ind_D,\\n                                 info_C,\\n                                 &buffer_size);\\n\\n  // Allocate buffer\\n  void* buffer;\\n  hipMalloc(&buffer, buffer_size);\\n\\n  // Obtain number of total non-zero block entries in C and block row pointers of C\\n  rocsparse_int nnzb_C;\\n  hipMalloc((void**)&bsr_row_ptr_C, sizeof(rocsparse_int) * (mb + 1));\\n\\n  rocsparse_bsrgemm_nnzb(handle,\\n                        rocsparse_direction_row,\\n                        rocsparse_operation_none,\\n                        rocsparse_operation_none,\\n                        mb,\\n                        nb,\\n                        kb,\\n                        block_dim,\\n                        descr_A,\\n                        nnzb_A,\\n                        bsr_row_ptr_A,\\n                        bsr_col_ind_A,\\n                        descr_B,\\n                        nnzb_B,\\n                        bsr_row_ptr_B,\\n                        bsr_col_ind_B,\\n                        descr_D,\\n                        nnzb_D,\\n                        bsr_row_ptr_D,\\n                        bsr_col_ind_D,\\n                        descr_C,\\n                        bsr_row_ptr_C,\\n                        &nnzb_C,\\n                        info_C,\\n                        buffer);\\n\\n  // Compute block column indices and values of C\\n  hipMalloc((void**)&bsr_col_ind_C, sizeof(rocsparse_int) * nnzb_C);\\n  hipMalloc((void**)&bsr_val_C, sizeof(float) * block_dim * block_dim *nnzb_C);\\n\\n  rocsparse_sbsrgemm(handle,\\n                     rocsparse_direction_row,\\n                     rocsparse_operation_none,\\n                     rocsparse_operation_none,\\n                     mb,\\n                     nb,\\n                     kb,\\n                     block_dim,\\n                     &alpha,\\n                     descr_A,\\n                     nnzb_A,\\n                     bsr_val_A,\\n                     bsr_row_ptr_A,\\n                     bsr_col_ind_A,\\n                     descr_B,\\n                     nnzb_B,\\n                     bsr_val_B,\\n                     bsr_row_ptr_B,\\n                     bsr_col_ind_B,\\n                     &beta,\\n                     descr_D,\\n                     nnzb_D,\\n                     bsr_val_D,\\n                     bsr_row_ptr_D,\\n                     bsr_col_ind_D,\\n                     descr_C,\\n                     bsr_val_C,\\n                     bsr_row_ptr_C,\\n                     bsr_col_ind_C,\\n                     info_C,\\n                     buffer);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_sbsrgemm(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        kb: rocsparse_int,\n        block_dim: rocsparse_int,\n        alpha: *const f32,\n        descr_A: rocsparse_mat_descr,\n        nnzb_A: rocsparse_int,\n        bsr_val_A: *const f32,\n        bsr_row_ptr_A: *const rocsparse_int,\n        bsr_col_ind_A: *const rocsparse_int,\n        descr_B: rocsparse_mat_descr,\n        nnzb_B: rocsparse_int,\n        bsr_val_B: *const f32,\n        bsr_row_ptr_B: *const rocsparse_int,\n        bsr_col_ind_B: *const rocsparse_int,\n        beta: *const f32,\n        descr_D: rocsparse_mat_descr,\n        nnzb_D: rocsparse_int,\n        bsr_val_D: *const f32,\n        bsr_row_ptr_D: *const rocsparse_int,\n        bsr_col_ind_D: *const rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        bsr_val_C: *mut f32,\n        bsr_row_ptr_C: *const rocsparse_int,\n        bsr_col_ind_C: *mut rocsparse_int,\n        info_C: rocsparse_mat_info,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dbsrgemm(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        kb: rocsparse_int,\n        block_dim: rocsparse_int,\n        alpha: *const f64,\n        descr_A: rocsparse_mat_descr,\n        nnzb_A: rocsparse_int,\n        bsr_val_A: *const f64,\n        bsr_row_ptr_A: *const rocsparse_int,\n        bsr_col_ind_A: *const rocsparse_int,\n        descr_B: rocsparse_mat_descr,\n        nnzb_B: rocsparse_int,\n        bsr_val_B: *const f64,\n        bsr_row_ptr_B: *const rocsparse_int,\n        bsr_col_ind_B: *const rocsparse_int,\n        beta: *const f64,\n        descr_D: rocsparse_mat_descr,\n        nnzb_D: rocsparse_int,\n        bsr_val_D: *const f64,\n        bsr_row_ptr_D: *const rocsparse_int,\n        bsr_col_ind_D: *const rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        bsr_val_C: *mut f64,\n        bsr_row_ptr_C: *const rocsparse_int,\n        bsr_col_ind_C: *mut rocsparse_int,\n        info_C: rocsparse_mat_info,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cbsrgemm(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        kb: rocsparse_int,\n        block_dim: rocsparse_int,\n        alpha: *const rocsparse_float_complex,\n        descr_A: rocsparse_mat_descr,\n        nnzb_A: rocsparse_int,\n        bsr_val_A: *const rocsparse_float_complex,\n        bsr_row_ptr_A: *const rocsparse_int,\n        bsr_col_ind_A: *const rocsparse_int,\n        descr_B: rocsparse_mat_descr,\n        nnzb_B: rocsparse_int,\n        bsr_val_B: *const rocsparse_float_complex,\n        bsr_row_ptr_B: *const rocsparse_int,\n        bsr_col_ind_B: *const rocsparse_int,\n        beta: *const rocsparse_float_complex,\n        descr_D: rocsparse_mat_descr,\n        nnzb_D: rocsparse_int,\n        bsr_val_D: *const rocsparse_float_complex,\n        bsr_row_ptr_D: *const rocsparse_int,\n        bsr_col_ind_D: *const rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        bsr_val_C: *mut rocsparse_float_complex,\n        bsr_row_ptr_C: *const rocsparse_int,\n        bsr_col_ind_C: *mut rocsparse_int,\n        info_C: rocsparse_mat_info,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zbsrgemm(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        kb: rocsparse_int,\n        block_dim: rocsparse_int,\n        alpha: *const rocsparse_double_complex,\n        descr_A: rocsparse_mat_descr,\n        nnzb_A: rocsparse_int,\n        bsr_val_A: *const rocsparse_double_complex,\n        bsr_row_ptr_A: *const rocsparse_int,\n        bsr_col_ind_A: *const rocsparse_int,\n        descr_B: rocsparse_mat_descr,\n        nnzb_B: rocsparse_int,\n        bsr_val_B: *const rocsparse_double_complex,\n        bsr_row_ptr_B: *const rocsparse_int,\n        bsr_col_ind_B: *const rocsparse_int,\n        beta: *const rocsparse_double_complex,\n        descr_D: rocsparse_mat_descr,\n        nnzb_D: rocsparse_int,\n        bsr_val_D: *const rocsparse_double_complex,\n        bsr_row_ptr_D: *const rocsparse_int,\n        bsr_col_ind_D: *const rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        bsr_val_C: *mut rocsparse_double_complex,\n        bsr_row_ptr_C: *const rocsparse_int,\n        bsr_col_ind_C: *mut rocsparse_int,\n        info_C: rocsparse_mat_info,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup extra_module\n  \\brief Sparse matrix sparse matrix addition using CSR storage format\n\n  \\details\n  \\p rocsparse_csrgeam_nnz computes the total CSR non-zero elements and the CSR row\n  offsets, that point to the start of every row of the sparse CSR matrix, of the\n  resulting matrix C. It is assumed that \\p csr_row_ptr_C has been allocated with\n  size \\p m+1.\n\n  \\note\n  This function is blocking with respect to the host.\n\n  \\note\n  Currently, only \\ref rocsparse_matrix_type_general is supported.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle          handle to the rocsparse library context queue.\n  @param[in]\n  m               number of rows of the sparse CSR matrix \\f$A\\f$, \\f$B\\f$ and \\f$C\\f$.\n  @param[in]\n  n               number of columns of the sparse CSR matrix \\f$A\\f$, \\f$B\\f$ and \\f$C\\f$.\n  @param[in]\n  descr_A         descriptor of the sparse CSR matrix \\f$A\\f$. Currenty, only\n                  \\ref rocsparse_matrix_type_general is supported.\n  @param[in]\n  nnz_A           number of non-zero entries of the sparse CSR matrix \\f$A\\f$.\n  @param[in]\n  csr_row_ptr_A   array of \\p m+1 elements that point to the start of every row of the\n                  sparse CSR matrix \\f$A\\f$.\n  @param[in]\n  csr_col_ind_A   array of \\p nnz_A elements containing the column indices of the\n                  sparse CSR matrix \\f$A\\f$.\n  @param[in]\n  descr_B         descriptor of the sparse CSR matrix \\f$B\\f$. Currenty, only\n                  \\ref rocsparse_matrix_type_general is supported.\n  @param[in]\n  nnz_B           number of non-zero entries of the sparse CSR matrix \\f$B\\f$.\n  @param[in]\n  csr_row_ptr_B   array of \\p m+1 elements that point to the start of every row of the\n                  sparse CSR matrix \\f$B\\f$.\n  @param[in]\n  csr_col_ind_B   array of \\p nnz_B elements containing the column indices of the\n                  sparse CSR matrix \\f$B\\f$.\n  @param[in]\n  descr_C         descriptor of the sparse CSR matrix \\f$C\\f$. Currenty, only\n                  \\ref rocsparse_matrix_type_general is supported.\n  @param[out]\n  csr_row_ptr_C   array of \\p m+1 elements that point to the start of every row of the\n                  sparse CSR matrix \\f$C\\f$.\n  @param[out]\n  nnz_C           pointer to the number of non-zero entries of the sparse CSR\n                  matrix \\f$C\\f$. \\p nnz_C can be a host or device pointer.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval rocsparse_status_invalid_size \\p m, \\p n, \\p nnz_A or \\p nnz_B is invalid.\n  \\retval rocsparse_status_invalid_pointer \\p descr_A, \\p csr_row_ptr_A,\n          \\p csr_col_ind_A, \\p descr_B, \\p csr_row_ptr_B, \\p csr_col_ind_B,\n          \\p descr_C, \\p csr_row_ptr_C or \\p nnz_C is invalid.\n  \\retval rocsparse_status_not_implemented\n          \\p rocsparse_matrix_type != \\ref rocsparse_matrix_type_general.*/\n    pub fn rocsparse_csrgeam_nnz(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        descr_A: rocsparse_mat_descr,\n        nnz_A: rocsparse_int,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        descr_B: rocsparse_mat_descr,\n        nnz_B: rocsparse_int,\n        csr_row_ptr_B: *const rocsparse_int,\n        csr_col_ind_B: *const rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        csr_row_ptr_C: *mut rocsparse_int,\n        nnz_C: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup extra_module\\n  \\\\brief Sparse matrix sparse matrix addition using CSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_csrgeam multiplies the scalar \\\\f$\\\\alpha\\\\f$ with the sparse\\n  \\\\f$m \\\\times n\\\\f$ matrix \\\\f$A\\\\f$, defined in CSR storage format, multiplies the\\n  scalar \\\\f$\\\\beta\\\\f$ with the sparse \\\\f$m \\\\times n\\\\f$ matrix \\\\f$B\\\\f$, defined in CSR\\n  storage format, and adds both resulting matrices to obtain the sparse\\n  \\\\f$m \\\\times n\\\\f$ matrix \\\\f$C\\\\f$, defined in CSR storage format, such that\\n  \\\\f[\\n    C := \\\\alpha \\\\cdot A + \\\\beta \\\\cdot B.\\n  \\\\f]\\n\\n  It is assumed that \\\\p csr_row_ptr_C has already been filled and that \\\\p csr_val_C and\\n  \\\\p csr_col_ind_C are allocated by the user. \\\\p csr_row_ptr_C and allocation size of\\n  \\\\p csr_col_ind_C and \\\\p csr_val_C is defined by the number of non-zero elements of\\n  the sparse CSR matrix C. Both can be obtained by rocsparse_csrgeam_nnz().\\n\\n  \\\\note Both scalars \\\\f$\\\\alpha\\\\f$ and \\\\f$beta\\\\f$ have to be valid.\\n\\n  \\\\note Currently, only \\\\ref rocsparse_matrix_type_general is supported.\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle          handle to the rocsparse library context queue.\\n  @param[in]\\n  m               number of rows of the sparse CSR matrix \\\\f$A\\\\f$, \\\\f$B\\\\f$ and \\\\f$C\\\\f$.\\n  @param[in]\\n  n               number of columns of the sparse CSR matrix \\\\f$A\\\\f$, \\\\f$B\\\\f$ and \\\\f$C\\\\f$.\\n  @param[in]\\n  alpha           scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  descr_A         descriptor of the sparse CSR matrix \\\\f$A\\\\f$. Currenty, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  nnz_A           number of non-zero entries of the sparse CSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  csr_val_A       array of \\\\p nnz_A elements of the sparse CSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  csr_row_ptr_A   array of \\\\p m+1 elements that point to the start of every row of the\\n                  sparse CSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  csr_col_ind_A   array of \\\\p nnz_A elements containing the column indices of the\\n                  sparse CSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  beta            scalar \\\\f$\\\\beta\\\\f$.\\n  @param[in]\\n  descr_B         descriptor of the sparse CSR matrix \\\\f$B\\\\f$. Currenty, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  nnz_B           number of non-zero entries of the sparse CSR matrix \\\\f$B\\\\f$.\\n  @param[in]\\n  csr_val_B       array of \\\\p nnz_B elements of the sparse CSR matrix \\\\f$B\\\\f$.\\n  @param[in]\\n  csr_row_ptr_B   array of \\\\p m+1 elements that point to the start of every row of the\\n                  sparse CSR matrix \\\\f$B\\\\f$.\\n  @param[in]\\n  csr_col_ind_B   array of \\\\p nnz_B elements containing the column indices of the\\n                  sparse CSR matrix \\\\f$B\\\\f$.\\n  @param[in]\\n  descr_C         descriptor of the sparse CSR matrix \\\\f$C\\\\f$. Currenty, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[out]\\n  csr_val_C       array of elements of the sparse CSR matrix \\\\f$C\\\\f$.\\n  @param[in]\\n  csr_row_ptr_C   array of \\\\p m+1 elements that point to the start of every row of the\\n                  sparse CSR matrix \\\\f$C\\\\f$.\\n  @param[out]\\n  csr_col_ind_C   array of elements containing the column indices of the\\n                  sparse CSR matrix \\\\f$C\\\\f$.\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval rocsparse_status_invalid_size \\\\p m, \\\\p n, \\\\p nnz_A or \\\\p nnz_B is invalid.\\n  \\\\retval rocsparse_status_invalid_pointer \\\\p alpha, \\\\p descr_A, \\\\p csr_val_A,\\n          \\\\p csr_row_ptr_A, \\\\p csr_col_ind_A, \\\\p beta, \\\\p descr_B, \\\\p csr_val_B,\\n          \\\\p csr_row_ptr_B, \\\\p csr_col_ind_B, \\\\p descr_C, \\\\p csr_val_C,\\n          \\\\p csr_row_ptr_C or \\\\p csr_col_ind_C is invalid.\\n  \\\\retval rocsparse_status_not_implemented\\n          \\\\p rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n\\n  \\\\par Example\\n  This example adds two CSR matrices.\\n  \\\\code{.c}\\n  // Initialize scalar multipliers\\n  float alpha = 1.0f;\\n  float beta  = 1.0f;\\n\\n  // Create matrix descriptors\\n  rocsparse_mat_descr descr_A;\\n  rocsparse_mat_descr descr_B;\\n  rocsparse_mat_descr descr_C;\\n\\n  rocsparse_create_mat_descr(&descr_A);\\n  rocsparse_create_mat_descr(&descr_B);\\n  rocsparse_create_mat_descr(&descr_C);\\n\\n  // Set pointer mode\\n  rocsparse_set_pointer_mode(handle, rocsparse_pointer_mode_host);\\n\\n  // Obtain number of total non-zero entries in C and row pointers of C\\n  rocsparse_int nnz_C;\\n  hipMalloc((void**)&csr_row_ptr_C, sizeof(rocsparse_int) * (m + 1));\\n\\n  rocsparse_csrgeam_nnz(handle,\\n                        m,\\n                        n,\\n                        descr_A,\\n                        nnz_A,\\n                        csr_row_ptr_A,\\n                        csr_col_ind_A,\\n                        descr_B,\\n                        nnz_B,\\n                        csr_row_ptr_B,\\n                        csr_col_ind_B,\\n                        descr_C,\\n                        csr_row_ptr_C,\\n                        &nnz_C);\\n\\n  // Compute column indices and values of C\\n  hipMalloc((void**)&csr_col_ind_C, sizeof(rocsparse_int) * nnz_C);\\n  hipMalloc((void**)&csr_val_C, sizeof(float) * nnz_C);\\n\\n  rocsparse_scsrgeam(handle,\\n                     m,\\n                     n,\\n                     &alpha,\\n                     descr_A,\\n                     nnz_A,\\n                     csr_val_A,\\n                     csr_row_ptr_A,\\n                     csr_col_ind_A,\\n                     &beta,\\n                     descr_B,\\n                     nnz_B,\\n                     csr_val_B,\\n                     csr_row_ptr_B,\\n                     csr_col_ind_B,\\n                     descr_C,\\n                     csr_val_C,\\n                     csr_row_ptr_C,\\n                     csr_col_ind_C);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_scsrgeam(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        alpha: *const f32,\n        descr_A: rocsparse_mat_descr,\n        nnz_A: rocsparse_int,\n        csr_val_A: *const f32,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        beta: *const f32,\n        descr_B: rocsparse_mat_descr,\n        nnz_B: rocsparse_int,\n        csr_val_B: *const f32,\n        csr_row_ptr_B: *const rocsparse_int,\n        csr_col_ind_B: *const rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        csr_val_C: *mut f32,\n        csr_row_ptr_C: *const rocsparse_int,\n        csr_col_ind_C: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsrgeam(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        alpha: *const f64,\n        descr_A: rocsparse_mat_descr,\n        nnz_A: rocsparse_int,\n        csr_val_A: *const f64,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        beta: *const f64,\n        descr_B: rocsparse_mat_descr,\n        nnz_B: rocsparse_int,\n        csr_val_B: *const f64,\n        csr_row_ptr_B: *const rocsparse_int,\n        csr_col_ind_B: *const rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        csr_val_C: *mut f64,\n        csr_row_ptr_C: *const rocsparse_int,\n        csr_col_ind_C: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsrgeam(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        alpha: *const rocsparse_float_complex,\n        descr_A: rocsparse_mat_descr,\n        nnz_A: rocsparse_int,\n        csr_val_A: *const rocsparse_float_complex,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        beta: *const rocsparse_float_complex,\n        descr_B: rocsparse_mat_descr,\n        nnz_B: rocsparse_int,\n        csr_val_B: *const rocsparse_float_complex,\n        csr_row_ptr_B: *const rocsparse_int,\n        csr_col_ind_B: *const rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        csr_val_C: *mut rocsparse_float_complex,\n        csr_row_ptr_C: *const rocsparse_int,\n        csr_col_ind_C: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsrgeam(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        alpha: *const rocsparse_double_complex,\n        descr_A: rocsparse_mat_descr,\n        nnz_A: rocsparse_int,\n        csr_val_A: *const rocsparse_double_complex,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        beta: *const rocsparse_double_complex,\n        descr_B: rocsparse_mat_descr,\n        nnz_B: rocsparse_int,\n        csr_val_B: *const rocsparse_double_complex,\n        csr_row_ptr_B: *const rocsparse_int,\n        csr_col_ind_B: *const rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        csr_val_C: *mut rocsparse_double_complex,\n        csr_row_ptr_C: *const rocsparse_int,\n        csr_col_ind_C: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup extra_module\\n  \\\\brief Sparse matrix sparse matrix multiplication using CSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_csrgemm_buffer_size returns the size of the temporary storage buffer\\n  that is required by rocsparse_csrgemm_nnz(), rocsparse_scsrgemm(),\\n  rocsparse_dcsrgemm(), rocsparse_ccsrgemm() and rocsparse_zcsrgemm(). The temporary\\n  storage buffer must be allocated by the user.\\n\\n  \\\\note\\n  Please note, that for matrix products with more than 4096 non-zero entries per row,\\n  additional temporary storage buffer is allocated by the algorithm.\\n  \\\\note\\n  Please note, that for matrix products with more than 8192 intermediate products per\\n  row, additional temporary storage buffer is allocated by the algorithm.\\n  \\\\note\\n  Currently, only \\\\p trans_A == \\\\p trans_B == \\\\ref rocsparse_operation_none is\\n  supported.\\n  \\\\note\\n  Currently, only \\\\ref rocsparse_matrix_type_general is supported.\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle          handle to the rocsparse library context queue.\\n  @param[in]\\n  trans_A         matrix \\\\f$A\\\\f$ operation type.\\n  @param[in]\\n  trans_B         matrix \\\\f$B\\\\f$ operation type.\\n  @param[in]\\n  m               number of rows of the sparse CSR matrix \\\\f$op(A)\\\\f$ and \\\\f$C\\\\f$.\\n  @param[in]\\n  n               number of columns of the sparse CSR matrix \\\\f$op(B)\\\\f$ and\\n                  \\\\f$C\\\\f$.\\n  @param[in]\\n  k               number of columns of the sparse CSR matrix \\\\f$op(A)\\\\f$ and number of\\n                  rows of the sparse CSR matrix \\\\f$op(B)\\\\f$.\\n  @param[in]\\n  alpha           scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  descr_A         descriptor of the sparse CSR matrix \\\\f$A\\\\f$. Currenty, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  nnz_A           number of non-zero entries of the sparse CSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  csr_row_ptr_A   array of \\\\p m+1 elements (\\\\f$op(A) == A\\\\f$, \\\\p k+1 otherwise)\\n                  that point to the start of every row of the sparse CSR matrix\\n                  \\\\f$op(A)\\\\f$.\\n  @param[in]\\n  csr_col_ind_A   array of \\\\p nnz_A elements containing the column indices of the\\n                  sparse CSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  descr_B         descriptor of the sparse CSR matrix \\\\f$B\\\\f$. Currenty, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  nnz_B           number of non-zero entries of the sparse CSR matrix \\\\f$B\\\\f$.\\n  @param[in]\\n  csr_row_ptr_B   array of \\\\p k+1 elements (\\\\f$op(B) == B\\\\f$, \\\\p m+1 otherwise)\\n                  that point to the start of every row of the sparse CSR matrix\\n                  \\\\f$op(B)\\\\f$.\\n  @param[in]\\n  csr_col_ind_B   array of \\\\p nnz_B elements containing the column indices of the\\n                  sparse CSR matrix \\\\f$B\\\\f$.\\n  @param[in]\\n  beta            scalar \\\\f$\\\\beta\\\\f$.\\n  @param[in]\\n  descr_D         descriptor of the sparse CSR matrix \\\\f$D\\\\f$. Currenty, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  nnz_D           number of non-zero entries of the sparse CSR matrix \\\\f$D\\\\f$.\\n  @param[in]\\n  csr_row_ptr_D   array of \\\\p m+1 elements that point to the start of every row of the\\n                  sparse CSR matrix \\\\f$D\\\\f$.\\n  @param[in]\\n  csr_col_ind_D   array of \\\\p nnz_D elements containing the column indices of the sparse\\n                  CSR matrix \\\\f$D\\\\f$.\\n  @param[inout]\\n  info_C          structure that holds meta data for the sparse CSR matrix \\\\f$C\\\\f$.\\n  @param[out]\\n  buffer_size     number of bytes of the temporary storage buffer required by\\n                  rocsparse_csrgemm_nnz(), rocsparse_scsrgemm(), rocsparse_dcsrgemm(),\\n                  rocsparse_ccsrgemm() and rocsparse_zcsrgemm().\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval rocsparse_status_invalid_size \\\\p m, \\\\p n, \\\\p k, \\\\p nnz_A, \\\\p nnz_B or\\n          \\\\p nnz_D is invalid.\\n  \\\\retval rocsparse_status_invalid_pointer \\\\p alpha and \\\\p beta are invalid,\\n          \\\\p descr_A, \\\\p csr_row_ptr_A, \\\\p csr_col_ind_A, \\\\p descr_B,\\n          \\\\p csr_row_ptr_B or \\\\p csr_col_ind_B are invalid if \\\\p alpha is valid,\\n          \\\\p descr_D, \\\\p csr_row_ptr_D or \\\\p csr_col_ind_D is invalid if \\\\p beta is\\n          valid, \\\\p info_C or \\\\p buffer_size is invalid.\\n  \\\\retval rocsparse_status_not_implemented\\n          \\\\p trans_A != \\\\ref rocsparse_operation_none,\\n          \\\\p trans_B != \\\\ref rocsparse_operation_none, or\\n          \\\\p rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_scsrgemm_buffer_size(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        k: rocsparse_int,\n        alpha: *const f32,\n        descr_A: rocsparse_mat_descr,\n        nnz_A: rocsparse_int,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        descr_B: rocsparse_mat_descr,\n        nnz_B: rocsparse_int,\n        csr_row_ptr_B: *const rocsparse_int,\n        csr_col_ind_B: *const rocsparse_int,\n        beta: *const f32,\n        descr_D: rocsparse_mat_descr,\n        nnz_D: rocsparse_int,\n        csr_row_ptr_D: *const rocsparse_int,\n        csr_col_ind_D: *const rocsparse_int,\n        info_C: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsrgemm_buffer_size(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        k: rocsparse_int,\n        alpha: *const f64,\n        descr_A: rocsparse_mat_descr,\n        nnz_A: rocsparse_int,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        descr_B: rocsparse_mat_descr,\n        nnz_B: rocsparse_int,\n        csr_row_ptr_B: *const rocsparse_int,\n        csr_col_ind_B: *const rocsparse_int,\n        beta: *const f64,\n        descr_D: rocsparse_mat_descr,\n        nnz_D: rocsparse_int,\n        csr_row_ptr_D: *const rocsparse_int,\n        csr_col_ind_D: *const rocsparse_int,\n        info_C: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsrgemm_buffer_size(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        k: rocsparse_int,\n        alpha: *const rocsparse_float_complex,\n        descr_A: rocsparse_mat_descr,\n        nnz_A: rocsparse_int,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        descr_B: rocsparse_mat_descr,\n        nnz_B: rocsparse_int,\n        csr_row_ptr_B: *const rocsparse_int,\n        csr_col_ind_B: *const rocsparse_int,\n        beta: *const rocsparse_float_complex,\n        descr_D: rocsparse_mat_descr,\n        nnz_D: rocsparse_int,\n        csr_row_ptr_D: *const rocsparse_int,\n        csr_col_ind_D: *const rocsparse_int,\n        info_C: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsrgemm_buffer_size(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        k: rocsparse_int,\n        alpha: *const rocsparse_double_complex,\n        descr_A: rocsparse_mat_descr,\n        nnz_A: rocsparse_int,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        descr_B: rocsparse_mat_descr,\n        nnz_B: rocsparse_int,\n        csr_row_ptr_B: *const rocsparse_int,\n        csr_col_ind_B: *const rocsparse_int,\n        beta: *const rocsparse_double_complex,\n        descr_D: rocsparse_mat_descr,\n        nnz_D: rocsparse_int,\n        csr_row_ptr_D: *const rocsparse_int,\n        csr_col_ind_D: *const rocsparse_int,\n        info_C: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup extra_module\n  \\brief Sparse matrix sparse matrix multiplication using CSR storage format\n\n  \\details\n  \\p rocsparse_csrgemm_nnz computes the total CSR non-zero elements and the CSR row\n  offsets, that point to the start of every row of the sparse CSR matrix, of the\n  resulting multiplied matrix C. It is assumed that \\p csr_row_ptr_C has been allocated\n  with size \\p m+1.\n  The required buffer size can be obtained by rocsparse_scsrgemm_buffer_size(),\n  rocsparse_dcsrgemm_buffer_size(), rocsparse_ccsrgemm_buffer_size() and\n  rocsparse_zcsrgemm_buffer_size(), respectively.\n\n  \\note\n  Please note, that for matrix products with more than 8192 intermediate products per\n  row, additional temporary storage buffer is allocated by the algorithm.\n  \\note\n  This function supports unsorted CSR matrices as input, while output will be sorted.\n  Please note that matrices B and D can only be unsorted up to 8192 intermediate\n  products per row. If this number is exceeded, \\ref rocsparse_status_requires_sorted_storage\n  will be returned.\n  \\note\n  This function is blocking with respect to the host.\n  \\note\n  Currently, only \\p trans_A == \\p trans_B == \\ref rocsparse_operation_none is\n  supported.\n  \\note\n  Currently, only \\ref rocsparse_matrix_type_general is supported.\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle          handle to the rocsparse library context queue.\n  @param[in]\n  trans_A         matrix \\f$A\\f$ operation type.\n  @param[in]\n  trans_B         matrix \\f$B\\f$ operation type.\n  @param[in]\n  m               number of rows of the sparse CSR matrix \\f$op(A)\\f$ and \\f$C\\f$.\n  @param[in]\n  n               number of columns of the sparse CSR matrix \\f$op(B)\\f$ and\n                  \\f$C\\f$.\n  @param[in]\n  k               number of columns of the sparse CSR matrix \\f$op(A)\\f$ and number of\n                  rows of the sparse CSR matrix \\f$op(B)\\f$.\n  @param[in]\n  descr_A         descriptor of the sparse CSR matrix \\f$A\\f$. Currenty, only\n                  \\ref rocsparse_matrix_type_general is supported.\n  @param[in]\n  nnz_A           number of non-zero entries of the sparse CSR matrix \\f$A\\f$.\n  @param[in]\n  csr_row_ptr_A   array of \\p m+1 elements (\\f$op(A) == A\\f$, \\p k+1 otherwise)\n                  that point to the start of every row of the sparse CSR matrix\n                  \\f$op(A)\\f$.\n  @param[in]\n  csr_col_ind_A   array of \\p nnz_A elements containing the column indices of the\n                  sparse CSR matrix \\f$A\\f$.\n  @param[in]\n  descr_B         descriptor of the sparse CSR matrix \\f$B\\f$. Currenty, only\n                  \\ref rocsparse_matrix_type_general is supported.\n  @param[in]\n  nnz_B           number of non-zero entries of the sparse CSR matrix \\f$B\\f$.\n  @param[in]\n  csr_row_ptr_B   array of \\p k+1 elements (\\f$op(B) == B\\f$, \\p m+1 otherwise)\n                  that point to the start of every row of the sparse CSR matrix\n                  \\f$op(B)\\f$.\n  @param[in]\n  csr_col_ind_B   array of \\p nnz_B elements containing the column indices of the\n                  sparse CSR matrix \\f$B\\f$.\n  @param[in]\n  descr_D         descriptor of the sparse CSR matrix \\f$D\\f$. Currenty, only\n                  \\ref rocsparse_matrix_type_general is supported.\n  @param[in]\n  nnz_D           number of non-zero entries of the sparse CSR matrix \\f$D\\f$.\n  @param[in]\n  csr_row_ptr_D   array of \\p m+1 elements that point to the start of every row of the\n                  sparse CSR matrix \\f$D\\f$.\n  @param[in]\n  csr_col_ind_D   array of \\p nnz_D elements containing the column indices of the sparse\n                  CSR matrix \\f$D\\f$.\n  @param[in]\n  descr_C         descriptor of the sparse CSR matrix \\f$C\\f$. Currenty, only\n                  \\ref rocsparse_matrix_type_general is supported.\n  @param[out]\n  csr_row_ptr_C   array of \\p m+1 elements that point to the start of every row of the\n                  sparse CSR matrix \\f$C\\f$.\n  @param[out]\n  nnz_C           pointer to the number of non-zero entries of the sparse CSR\n                  matrix \\f$C\\f$.\n  @param[in]\n  info_C          structure that holds meta data for the sparse CSR matrix \\f$C\\f$.\n  @param[in]\n  temp_buffer     temporary storage buffer allocated by the user, size is returned\n                  by rocsparse_scsrgemm_buffer_size(),\n                  rocsparse_dcsrgemm_buffer_size(), rocsparse_ccsrgemm_buffer_size() or\n                  rocsparse_zcsrgemm_buffer_size().\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval rocsparse_status_invalid_size \\p m, \\p n, \\p k, \\p nnz_A, \\p nnz_B or\n          \\p nnz_D is invalid.\n  \\retval rocsparse_status_invalid_pointer \\p descr_A, \\p csr_row_ptr_A,\n          \\p csr_col_ind_A, \\p descr_B, \\p csr_row_ptr_B, \\p csr_col_ind_B,\n          \\p descr_D, \\p csr_row_ptr_D, \\p csr_col_ind_D, \\p descr_C,\n          \\p csr_row_ptr_C, \\p nnz_C, \\p info_C or \\p temp_buffer is invalid.\n  \\retval rocsparse_status_memory_error additional buffer for long rows could not be\n          allocated.\n  \\retval rocsparse_status_not_implemented\n          \\p trans_A != \\ref rocsparse_operation_none,\n          \\p trans_B != \\ref rocsparse_operation_none, or\n          \\p rocsparse_matrix_type != \\ref rocsparse_matrix_type_general.*/\n    pub fn rocsparse_csrgemm_nnz(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        k: rocsparse_int,\n        descr_A: rocsparse_mat_descr,\n        nnz_A: rocsparse_int,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        descr_B: rocsparse_mat_descr,\n        nnz_B: rocsparse_int,\n        csr_row_ptr_B: *const rocsparse_int,\n        csr_col_ind_B: *const rocsparse_int,\n        descr_D: rocsparse_mat_descr,\n        nnz_D: rocsparse_int,\n        csr_row_ptr_D: *const rocsparse_int,\n        csr_col_ind_D: *const rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        csr_row_ptr_C: *mut rocsparse_int,\n        nnz_C: *mut rocsparse_int,\n        info_C: rocsparse_mat_info,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup extra_module\\n  \\\\brief Sparse matrix sparse matrix multiplication using CSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_csrgemm multiplies the scalar \\\\f$\\\\alpha\\\\f$ with the sparse\\n  \\\\f$m \\\\times k\\\\f$ matrix \\\\f$A\\\\f$, defined in CSR storage format, and the sparse\\n  \\\\f$k \\\\times n\\\\f$ matrix \\\\f$B\\\\f$, defined in CSR storage format, and adds the result\\n  to the sparse \\\\f$m \\\\times n\\\\f$ matrix \\\\f$D\\\\f$ that is multiplied by \\\\f$\\\\beta\\\\f$. The\\n  final result is stored in the sparse \\\\f$m \\\\times n\\\\f$ matrix \\\\f$C\\\\f$, defined in CSR\\n  storage format, such\\n  that\\n  \\\\f[\\n    C := \\\\alpha \\\\cdot op(A) \\\\cdot op(B) + \\\\beta \\\\cdot D,\\n  \\\\f]\\n  with\\n  \\\\f[\\n    op(A) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        A,   & \\\\text{if trans_A == rocsparse_operation_none} \\\\\\\\\\n        A^T, & \\\\text{if trans_A == rocsparse_operation_transpose} \\\\\\\\\\n        A^H, & \\\\text{if trans_A == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n  and\\n  \\\\f[\\n    op(B) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        B,   & \\\\text{if trans_B == rocsparse_operation_none} \\\\\\\\\\n        B^T, & \\\\text{if trans_B == rocsparse_operation_transpose} \\\\\\\\\\n        B^H, & \\\\text{if trans_B == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n\\n  It is assumed that \\\\p csr_row_ptr_C has already been filled and that \\\\p csr_val_C and\\n  \\\\p csr_col_ind_C are allocated by the user. \\\\p csr_row_ptr_C and allocation size of\\n  \\\\p csr_col_ind_C and \\\\p csr_val_C is defined by the number of non-zero elements of\\n  the sparse CSR matrix C. Both can be obtained by rocsparse_csrgemm_nnz(). The\\n  required buffer size for the computation can be obtained by\\n  rocsparse_scsrgemm_buffer_size(), rocsparse_dcsrgemm_buffer_size(),\\n  rocsparse_ccsrgemm_buffer_size() and rocsparse_zcsrgemm_buffer_size(), respectively.\\n\\n  \\\\note If \\\\f$\\\\alpha == 0\\\\f$, then \\\\f$C = \\\\beta \\\\cdot D\\\\f$ will be computed.\\n  \\\\note If \\\\f$\\\\beta == 0\\\\f$, then \\\\f$C = \\\\alpha \\\\cdot op(A) \\\\cdot op(B)\\\\f$ will be computed.\\n  \\\\note \\\\f$\\\\alpha == beta == 0\\\\f$ is invalid.\\n  \\\\note Currently, only \\\\p trans_A == \\\\ref rocsparse_operation_none is supported.\\n  \\\\note Currently, only \\\\p trans_B == \\\\ref rocsparse_operation_none is supported.\\n  \\\\note Currently, only \\\\ref rocsparse_matrix_type_general is supported.\\n  \\\\note Please note, that for matrix products with more than 4096 non-zero entries per\\n  row, additional temporary storage buffer is allocated by the algorithm.\\n  \\\\note\\n  This function supports unsorted CSR matrices as input, while output will be sorted.\\n  Please note that matrices B and D can only be unsorted up to 4096 non-zero entries\\n  per row. If this number is exceeded, \\\\ref rocsparse_status_requires_sorted_storage\\n  will be returned.\\n  \\\\note\\n  This function is blocking with respect to the host.\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle          handle to the rocsparse library context queue.\\n  @param[in]\\n  trans_A         matrix \\\\f$A\\\\f$ operation type.\\n  @param[in]\\n  trans_B         matrix \\\\f$B\\\\f$ operation type.\\n  @param[in]\\n  m               number of rows of the sparse CSR matrix \\\\f$op(A)\\\\f$ and \\\\f$C\\\\f$.\\n  @param[in]\\n  n               number of columns of the sparse CSR matrix \\\\f$op(B)\\\\f$ and\\n                  \\\\f$C\\\\f$.\\n  @param[in]\\n  k               number of columns of the sparse CSR matrix \\\\f$op(A)\\\\f$ and number of\\n                  rows of the sparse CSR matrix \\\\f$op(B)\\\\f$.\\n  @param[in]\\n  alpha           scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  descr_A         descriptor of the sparse CSR matrix \\\\f$A\\\\f$. Currenty, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  nnz_A           number of non-zero entries of the sparse CSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  csr_val_A       array of \\\\p nnz_A elements of the sparse CSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  csr_row_ptr_A   array of \\\\p m+1 elements (\\\\f$op(A) == A\\\\f$, \\\\p k+1 otherwise)\\n                  that point to the start of every row of the sparse CSR matrix\\n                  \\\\f$op(A)\\\\f$.\\n  @param[in]\\n  csr_col_ind_A   array of \\\\p nnz_A elements containing the column indices of the\\n                  sparse CSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  descr_B         descriptor of the sparse CSR matrix \\\\f$B\\\\f$. Currenty, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  nnz_B           number of non-zero entries of the sparse CSR matrix \\\\f$B\\\\f$.\\n  @param[in]\\n  csr_val_B       array of \\\\p nnz_B elements of the sparse CSR matrix \\\\f$B\\\\f$.\\n  @param[in]\\n  csr_row_ptr_B   array of \\\\p k+1 elements (\\\\f$op(B) == B\\\\f$, \\\\p m+1 otherwise)\\n                  that point to the start of every row of the sparse CSR matrix\\n                  \\\\f$op(B)\\\\f$.\\n  @param[in]\\n  csr_col_ind_B   array of \\\\p nnz_B elements containing the column indices of the\\n                  sparse CSR matrix \\\\f$B\\\\f$.\\n  @param[in]\\n  beta            scalar \\\\f$\\\\beta\\\\f$.\\n  @param[in]\\n  descr_D         descriptor of the sparse CSR matrix \\\\f$D\\\\f$. Currenty, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  nnz_D           number of non-zero entries of the sparse CSR matrix \\\\f$D\\\\f$.\\n  @param[in]\\n  csr_val_D       array of \\\\p nnz_D elements of the sparse CSR matrix \\\\f$D\\\\f$.\\n  @param[in]\\n  csr_row_ptr_D   array of \\\\p m+1 elements that point to the start of every row of the\\n                  sparse CSR matrix \\\\f$D\\\\f$.\\n  @param[in]\\n  csr_col_ind_D   array of \\\\p nnz_D elements containing the column indices of the\\n                  sparse CSR matrix \\\\f$D\\\\f$.\\n  @param[in]\\n  descr_C         descriptor of the sparse CSR matrix \\\\f$C\\\\f$. Currenty, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[out]\\n  csr_val_C       array of \\\\p nnz_C elements of the sparse CSR matrix \\\\f$C\\\\f$.\\n  @param[in]\\n  csr_row_ptr_C   array of \\\\p m+1 elements that point to the start of every row of the\\n                  sparse CSR matrix \\\\f$C\\\\f$.\\n  @param[out]\\n  csr_col_ind_C   array of \\\\p nnz_C elements containing the column indices of the\\n                  sparse CSR matrix \\\\f$C\\\\f$.\\n  @param[in]\\n  info_C          structure that holds meta data for the sparse CSR matrix \\\\f$C\\\\f$.\\n  @param[in]\\n  temp_buffer     temporary storage buffer allocated by the user, size is returned\\n                  by rocsparse_scsrgemm_buffer_size(),\\n                  rocsparse_dcsrgemm_buffer_size(), rocsparse_ccsrgemm_buffer_size() or\\n                  rocsparse_zcsrgemm_buffer_size().\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval rocsparse_status_invalid_size \\\\p m, \\\\p n, \\\\p k, \\\\p nnz_A, \\\\p nnz_B or\\n          \\\\p nnz_D is invalid.\\n  \\\\retval rocsparse_status_invalid_pointer \\\\p alpha and \\\\p beta are invalid,\\n          \\\\p descr_A, \\\\p csr_val_A, \\\\p csr_row_ptr_A, \\\\p csr_col_ind_A, \\\\p descr_B,\\n          \\\\p csr_val_B, \\\\p csr_row_ptr_B or \\\\p csr_col_ind_B are invalid if \\\\p alpha\\n          is valid, \\\\p descr_D, \\\\p csr_val_D, \\\\p csr_row_ptr_D or \\\\p csr_col_ind_D is\\n          invalid if \\\\p beta is valid, \\\\p csr_val_C, \\\\p csr_row_ptr_C,\\n          \\\\p csr_col_ind_C, \\\\p info_C or \\\\p temp_buffer is invalid.\\n  \\\\retval rocsparse_status_memory_error additional buffer for long rows could not be\\n          allocated.\\n  \\\\retval rocsparse_status_not_implemented\\n          \\\\p trans_A != \\\\ref rocsparse_operation_none,\\n          \\\\p trans_B != \\\\ref rocsparse_operation_none, or\\n          \\\\p rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n\\n  \\\\par Example\\n  This example multiplies two CSR matrices with a scalar alpha and adds the result to\\n  another CSR matrix.\\n  \\\\code{.c}\\n  // Initialize scalar multipliers\\n  float alpha = 2.0f;\\n  float beta  = 1.0f;\\n\\n  // Create matrix descriptors\\n  rocsparse_mat_descr descr_A;\\n  rocsparse_mat_descr descr_B;\\n  rocsparse_mat_descr descr_C;\\n  rocsparse_mat_descr descr_D;\\n\\n  rocsparse_create_mat_descr(&descr_A);\\n  rocsparse_create_mat_descr(&descr_B);\\n  rocsparse_create_mat_descr(&descr_C);\\n  rocsparse_create_mat_descr(&descr_D);\\n\\n  // Create matrix info structure\\n  rocsparse_mat_info info_C;\\n  rocsparse_create_mat_info(&info_C);\\n\\n  // Set pointer mode\\n  rocsparse_set_pointer_mode(handle, rocsparse_pointer_mode_host);\\n\\n  // Query rocsparse for the required buffer size\\n  size_t buffer_size;\\n\\n  rocsparse_scsrgemm_buffer_size(handle,\\n                                 rocsparse_operation_none,\\n                                 rocsparse_operation_none,\\n                                 m,\\n                                 n,\\n                                 k,\\n                                 &alpha,\\n                                 descr_A,\\n                                 nnz_A,\\n                                 csr_row_ptr_A,\\n                                 csr_col_ind_A,\\n                                 descr_B,\\n                                 nnz_B,\\n                                 csr_row_ptr_B,\\n                                 csr_col_ind_B,\\n                                 &beta,\\n                                 descr_D,\\n                                 nnz_D,\\n                                 csr_row_ptr_D,\\n                                 csr_col_ind_D,\\n                                 info_C,\\n                                 &buffer_size);\\n\\n  // Allocate buffer\\n  void* buffer;\\n  hipMalloc(&buffer, buffer_size);\\n\\n  // Obtain number of total non-zero entries in C and row pointers of C\\n  rocsparse_int nnz_C;\\n  hipMalloc((void**)&csr_row_ptr_C, sizeof(rocsparse_int) * (m + 1));\\n\\n  rocsparse_csrgemm_nnz(handle,\\n                        rocsparse_operation_none,\\n                        rocsparse_operation_none,\\n                        m,\\n                        n,\\n                        k,\\n                        descr_A,\\n                        nnz_A,\\n                        csr_row_ptr_A,\\n                        csr_col_ind_A,\\n                        descr_B,\\n                        nnz_B,\\n                        csr_row_ptr_B,\\n                        csr_col_ind_B,\\n                        descr_D,\\n                        nnz_D,\\n                        csr_row_ptr_D,\\n                        csr_col_ind_D,\\n                        descr_C,\\n                        csr_row_ptr_C,\\n                        &nnz_C,\\n                        info_C,\\n                        buffer);\\n\\n  // Compute column indices and values of C\\n  hipMalloc((void**)&csr_col_ind_C, sizeof(rocsparse_int) * nnz_C);\\n  hipMalloc((void**)&csr_val_C, sizeof(float) * nnz_C);\\n\\n  rocsparse_scsrgemm(handle,\\n                     rocsparse_operation_none,\\n                     rocsparse_operation_none,\\n                     m,\\n                     n,\\n                     k,\\n                     &alpha,\\n                     descr_A,\\n                     nnz_A,\\n                     csr_val_A,\\n                     csr_row_ptr_A,\\n                     csr_col_ind_A,\\n                     descr_B,\\n                     nnz_B,\\n                     csr_val_B,\\n                     csr_row_ptr_B,\\n                     csr_col_ind_B,\\n                     &beta,\\n                     descr_D,\\n                     nnz_D,\\n                     csr_val_D,\\n                     csr_row_ptr_D,\\n                     csr_col_ind_D,\\n                     descr_C,\\n                     csr_val_C,\\n                     csr_row_ptr_C,\\n                     csr_col_ind_C,\\n                     info_C,\\n                     buffer);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_scsrgemm(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        k: rocsparse_int,\n        alpha: *const f32,\n        descr_A: rocsparse_mat_descr,\n        nnz_A: rocsparse_int,\n        csr_val_A: *const f32,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        descr_B: rocsparse_mat_descr,\n        nnz_B: rocsparse_int,\n        csr_val_B: *const f32,\n        csr_row_ptr_B: *const rocsparse_int,\n        csr_col_ind_B: *const rocsparse_int,\n        beta: *const f32,\n        descr_D: rocsparse_mat_descr,\n        nnz_D: rocsparse_int,\n        csr_val_D: *const f32,\n        csr_row_ptr_D: *const rocsparse_int,\n        csr_col_ind_D: *const rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        csr_val_C: *mut f32,\n        csr_row_ptr_C: *const rocsparse_int,\n        csr_col_ind_C: *mut rocsparse_int,\n        info_C: rocsparse_mat_info,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsrgemm(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        k: rocsparse_int,\n        alpha: *const f64,\n        descr_A: rocsparse_mat_descr,\n        nnz_A: rocsparse_int,\n        csr_val_A: *const f64,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        descr_B: rocsparse_mat_descr,\n        nnz_B: rocsparse_int,\n        csr_val_B: *const f64,\n        csr_row_ptr_B: *const rocsparse_int,\n        csr_col_ind_B: *const rocsparse_int,\n        beta: *const f64,\n        descr_D: rocsparse_mat_descr,\n        nnz_D: rocsparse_int,\n        csr_val_D: *const f64,\n        csr_row_ptr_D: *const rocsparse_int,\n        csr_col_ind_D: *const rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        csr_val_C: *mut f64,\n        csr_row_ptr_C: *const rocsparse_int,\n        csr_col_ind_C: *mut rocsparse_int,\n        info_C: rocsparse_mat_info,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsrgemm(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        k: rocsparse_int,\n        alpha: *const rocsparse_float_complex,\n        descr_A: rocsparse_mat_descr,\n        nnz_A: rocsparse_int,\n        csr_val_A: *const rocsparse_float_complex,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        descr_B: rocsparse_mat_descr,\n        nnz_B: rocsparse_int,\n        csr_val_B: *const rocsparse_float_complex,\n        csr_row_ptr_B: *const rocsparse_int,\n        csr_col_ind_B: *const rocsparse_int,\n        beta: *const rocsparse_float_complex,\n        descr_D: rocsparse_mat_descr,\n        nnz_D: rocsparse_int,\n        csr_val_D: *const rocsparse_float_complex,\n        csr_row_ptr_D: *const rocsparse_int,\n        csr_col_ind_D: *const rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        csr_val_C: *mut rocsparse_float_complex,\n        csr_row_ptr_C: *const rocsparse_int,\n        csr_col_ind_C: *mut rocsparse_int,\n        info_C: rocsparse_mat_info,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsrgemm(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        k: rocsparse_int,\n        alpha: *const rocsparse_double_complex,\n        descr_A: rocsparse_mat_descr,\n        nnz_A: rocsparse_int,\n        csr_val_A: *const rocsparse_double_complex,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        descr_B: rocsparse_mat_descr,\n        nnz_B: rocsparse_int,\n        csr_val_B: *const rocsparse_double_complex,\n        csr_row_ptr_B: *const rocsparse_int,\n        csr_col_ind_B: *const rocsparse_int,\n        beta: *const rocsparse_double_complex,\n        descr_D: rocsparse_mat_descr,\n        nnz_D: rocsparse_int,\n        csr_val_D: *const rocsparse_double_complex,\n        csr_row_ptr_D: *const rocsparse_int,\n        csr_col_ind_D: *const rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        csr_val_C: *mut rocsparse_double_complex,\n        csr_row_ptr_C: *const rocsparse_int,\n        csr_col_ind_C: *mut rocsparse_int,\n        info_C: rocsparse_mat_info,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup extra_module\\n  \\\\brief Sparse matrix sparse matrix symbolic multiplication using CSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_csrgemm_symbolic multiplies two sparsity patterns and add an extra one: \\\\f[ opA \\\\cdot op(B) + D \\\\f]\\n  with \\\\f$m \\\\times k\\\\f$ matrix \\\\f$A\\\\f$, defined in CSR storage format, the sparse\\n  \\\\f$k \\\\times n\\\\f$ matrix \\\\f$B\\\\f$, defined in CSR storage format and the sparse \\\\f$m \\\\times n\\\\f$ matrix \\\\f$D\\\\f$.\\n  The *  final result is stored in the sparse \\\\f$m \\\\times n\\\\f$ matrix \\\\f$C\\\\f$, defined in CSR\\n  storage format, such\\n  that\\n  \\\\f[\\n    C := op(A) \\\\cdot op(B) + D,\\n  \\\\f]\\n  with\\n  \\\\f[\\n    op(A) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        A,   & \\\\text{if trans_A == rocsparse_operation_none} \\\\\\\\\\n        A^T, & \\\\text{if trans_A == rocsparse_operation_transpose} \\\\\\\\\\n        A^H, & \\\\text{if trans_A == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n  and\\n  \\\\f[\\n    op(B) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        B,   & \\\\text{if trans_B == rocsparse_operation_none} \\\\\\\\\\n        B^T, & \\\\text{if trans_B == rocsparse_operation_transpose} \\\\\\\\\\n        B^H, & \\\\text{if trans_B == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n\\n  It is assumed that \\\\p csr_row_ptr_C has already been filled and that and\\n  \\\\p csr_col_ind_C is allocated by the user. \\\\p csr_row_ptr_C and allocation size of\\n  \\\\p csr_col_ind_C is defined by the number of non-zero elements of\\n  the sparse CSR matrix C. Both can be obtained by rocsparse_csrgemm_nnz(). The\\n  required buffer size for the computation can be obtained by\\n  rocsparse_scsrgemm_buffer_size(), rocsparse_dcsrgemm_buffer_size(),\\n  rocsparse_ccsrgemm_buffer_size() and rocsparse_zcsrgemm_buffer_size(), respectively.\\n\\n  \\\\note Currently, only \\\\p trans_A == \\\\ref rocsparse_operation_none is supported.\\n  \\\\note Currently, only \\\\p trans_B == \\\\ref rocsparse_operation_none is supported.\\n  \\\\note Currently, only \\\\ref rocsparse_matrix_type_general is supported.\\n  \\\\note Please note, that for matrix products with more than 4096 non-zero entries per\\n  row, additional temporary storage buffer is allocated by the algorithm.\\n  \\\\note This function is blocking with respect to the host.\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle          handle to the rocsparse library context queue.\\n  @param[in]\\n  trans_A         matrix \\\\f$A\\\\f$ operation type.\\n  @param[in]\\n  trans_B         matrix \\\\f$B\\\\f$ operation type.\\n  @param[in]\\n  m               number of rows of the sparse CSR matrix \\\\f$op(A)\\\\f$ and \\\\f$C\\\\f$.\\n  @param[in]\\n  n               number of columns of the sparse CSR matrix \\\\f$op(B)\\\\f$ and\\n                  \\\\f$C\\\\f$.\\n  @param[in]\\n  k               number of columns of the sparse CSR matrix \\\\f$op(A)\\\\f$ and number of\\n                  rows of the sparse CSR matrix \\\\f$op(B)\\\\f$.\\n  @param[in]\\n  descr_A         descriptor of the sparse CSR matrix \\\\f$A\\\\f$. Currenty, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  nnz_A           number of non-zero entries of the sparse CSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  csr_row_ptr_A   array of \\\\p m+1 elements (\\\\f$op(A) == A\\\\f$, \\\\p k+1 otherwise)\\n                  that point to the start of every row of the sparse CSR matrix\\n                  \\\\f$op(A)\\\\f$.\\n  @param[in]\\n  csr_col_ind_A   array of \\\\p nnz_A elements containing the column indices of the\\n                  sparse CSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  descr_B         descriptor of the sparse CSR matrix \\\\f$B\\\\f$. Currenty, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  nnz_B           number of non-zero entries of the sparse CSR matrix \\\\f$B\\\\f$.\\n  @param[in]\\n  csr_row_ptr_B   array of \\\\p k+1 elements (\\\\f$op(B) == B\\\\f$, \\\\p m+1 otherwise)\\n                  that point to the start of every row of the sparse CSR matrix\\n                  \\\\f$op(B)\\\\f$.\\n  @param[in]\\n  csr_col_ind_B   array of \\\\p nnz_B elements containing the column indices of the\\n                  sparse CSR matrix \\\\f$B\\\\f$.\\n  @param[in]\\n  descr_D         descriptor of the sparse CSR matrix \\\\f$D\\\\f$. Currenty, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  nnz_D           number of non-zero entries of the sparse CSR matrix \\\\f$D\\\\f$.\\n  @param[in]\\n  csr_row_ptr_D   array of \\\\p m+1 elements that point to the start of every row of the\\n                  sparse CSR matrix \\\\f$D\\\\f$.\\n  @param[in]\\n  csr_col_ind_D   array of \\\\p nnz_D elements containing the column indices of the\\n                  sparse CSR matrix \\\\f$D\\\\f$.\\n  @param[in]\\n  descr_C         descriptor of the sparse CSR matrix \\\\f$C\\\\f$. Currenty, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  nnz_C           number of non-zero entries of the sparse CSR matrix \\\\f$C\\\\f$.\\n  @param[in]\\n  csr_row_ptr_C   array of \\\\p m+1 elements that point to the start of every row of the\\n                  sparse CSR matrix \\\\f$C\\\\f$.\\n  @param[out]\\n  csr_col_ind_C   array of \\\\p nnz_C elements containing the column indices of the\\n                  sparse CSR matrix \\\\f$C\\\\f$.\\n  @param[in]\\n  info_C          structure that holds meta data for the sparse CSR matrix \\\\f$C\\\\f$.\\n  @param[in]\\n  temp_buffer     temporary storage buffer allocated by the user, size is returned\\n                  by rocsparse_scsrgemm_buffer_size(),\\n                  rocsparse_dcsrgemm_buffer_size(), rocsparse_ccsrgemm_buffer_size() or\\n                  rocsparse_zcsrgemm_buffer_size().\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval rocsparse_status_invalid_size \\\\p m, \\\\p n, \\\\p k, \\\\p nnz_A, \\\\p nnz_B or\\n          \\\\p nnz_D is invalid.\\n  \\\\retval rocsparse_status_invalid_pointer\\n          \\\\p descr_A, \\\\p csr_row_ptr_A, \\\\p csr_col_ind_A, \\\\p descr_B,\\n          \\\\p csr_row_ptr_B or \\\\p csr_col_ind_B, \\\\p descr_D, \\\\p csr_row_ptr_D, \\\\p csr_col_ind_D\\n          \\\\p csr_row_ptr_C,\\n          \\\\p csr_col_ind_C, \\\\p info_C or \\\\p temp_buffer is invalid.\\n  \\\\retval rocsparse_status_memory_error additional buffer for long rows could not be\\n          allocated.\\n  \\\\retval rocsparse_status_not_implemented\\n          \\\\p trans_A != \\\\ref rocsparse_operation_none,\\n          \\\\p trans_B != \\\\ref rocsparse_operation_none, or\\n          \\\\p rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n\\n  \\\\par Example\\n  This example multiplies symbolically two CSR matrices and adds the result to\\n  another CSR matrix.\\n  \\\\code{.c}\\n  // Initialize scalar multipliers\\n  float alpha = 2.0f;\\n  float beta  = 1.0f;\\n\\n  // Create matrix descriptors\\n  rocsparse_mat_descr descr_A;\\n  rocsparse_mat_descr descr_B;\\n  rocsparse_mat_descr descr_C;\\n  rocsparse_mat_descr descr_D;\\n\\n  rocsparse_create_mat_descr(&descr_A);\\n  rocsparse_create_mat_descr(&descr_B);\\n  rocsparse_create_mat_descr(&descr_C);\\n  rocsparse_create_mat_descr(&descr_D);\\n\\n  // Create matrix info structure\\n  rocsparse_mat_info info_C;\\n  rocsparse_create_mat_info(&info_C);\\n\\n  // Set pointer mode\\n  rocsparse_set_pointer_mode(handle, rocsparse_pointer_mode_host);\\n\\n  // Query rocsparse for the required buffer size\\n  size_t buffer_size;\\n\\n  rocsparse_scsrgemm_buffer_size(handle,\\n                                 rocsparse_operation_none,\\n                                 rocsparse_operation_none,\\n                                 m,\\n                                 n,\\n                                 k,\\n                                 &alpha,\\n                                 descr_A,\\n                                 nnz_A,\\n                                 csr_row_ptr_A,\\n                                 csr_col_ind_A,\\n                                 descr_B,\\n                                 nnz_B,\\n                                 csr_row_ptr_B,\\n                                 csr_col_ind_B,\\n                                 &beta,\\n                                 descr_D,\\n                                 nnz_D,\\n                                 csr_row_ptr_D,\\n                                 csr_col_ind_D,\\n                                 info_C,\\n                                 &buffer_size);\\n\\n  // Allocate buffer\\n  void* buffer;\\n  hipMalloc(&buffer, buffer_size);\\n\\n  // Obtain number of total non-zero entries in C and row pointers of C\\n  rocsparse_int nnz_C;\\n  hipMalloc((void**)&csr_row_ptr_C, sizeof(rocsparse_int) * (m + 1));\\n\\n  rocsparse_csrgemm_nnz(handle,\\n                        rocsparse_operation_none,\\n                        rocsparse_operation_none,\\n                        m,\\n                        n,\\n                        k,\\n                        descr_A,\\n                        nnz_A,\\n                        csr_row_ptr_A,\\n                        csr_col_ind_A,\\n                        descr_B,\\n                        nnz_B,\\n                        csr_row_ptr_B,\\n                        csr_col_ind_B,\\n                        descr_D,\\n                        nnz_D,\\n                        csr_row_ptr_D,\\n                        csr_col_ind_D,\\n                        descr_C,\\n                        csr_row_ptr_C,\\n                        &nnz_C,\\n                        info_C,\\n                        buffer);\\n\\n  // Compute column indices of C\\n  hipMalloc((void**)&csr_col_ind_C, sizeof(rocsparse_int) * nnz_C);\\n\\n  rocsparse_csrgemm_symbolic(handle,\\n                     rocsparse_operation_none,\\n                     rocsparse_operation_none,\\n                     m,\\n                     n,\\n                     k,\\n                     descr_A,\\n                     nnz_A,\\n                     csr_row_ptr_A,\\n                     csr_col_ind_A,\\n                     descr_B,\\n                     nnz_B,\\n                     csr_row_ptr_B,\\n                     csr_col_ind_B,\\n                     descr_D,\\n                     nnz_D,\\n                     csr_row_ptr_D,\\n                     csr_col_ind_D,\\n                     descr_C,\\n                     nnz_C,\\n                     csr_row_ptr_C,\\n                     csr_col_ind_C,\\n                     info_C,\\n                     buffer);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_csrgemm_symbolic(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        k: rocsparse_int,\n        descr_A: rocsparse_mat_descr,\n        nnz_A: rocsparse_int,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        descr_B: rocsparse_mat_descr,\n        nnz_B: rocsparse_int,\n        csr_row_ptr_B: *const rocsparse_int,\n        csr_col_ind_B: *const rocsparse_int,\n        descr_D: rocsparse_mat_descr,\n        nnz_D: rocsparse_int,\n        csr_row_ptr_D: *const rocsparse_int,\n        csr_col_ind_D: *const rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        nnz_C: rocsparse_int,\n        csr_row_ptr_C: *const rocsparse_int,\n        csr_col_ind_C: *mut rocsparse_int,\n        info_C: rocsparse_mat_info,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup extra_module\\n  \\\\brief Sparse matrix sparse matrix numeric multiplication using CSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_csrgemm_numeric multiplies the scalar \\\\f$\\\\alpha\\\\f$ with the sparse\\n  \\\\f$m \\\\times k\\\\f$ matrix \\\\f$A\\\\f$, defined in CSR storage format, and the sparse\\n  \\\\f$k \\\\times n\\\\f$ matrix \\\\f$B\\\\f$, defined in CSR storage format, and adds the result\\n  to the sparse \\\\f$m \\\\times n\\\\f$ matrix \\\\f$D\\\\f$ that is multiplied by \\\\f$\\\\beta\\\\f$. The\\n  final result is stored in the sparse \\\\f$m \\\\times n\\\\f$ matrix \\\\f$C\\\\f$, predefined in CSR\\n  storage format, such\\n  that\\n  \\\\f[\\n    C := \\\\alpha \\\\cdot op(A) \\\\cdot op(B) + \\\\beta \\\\cdot D,\\n  \\\\f]\\n  with\\n  \\\\f[\\n    op(A) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        A,   & \\\\text{if trans_A == rocsparse_operation_none} \\\\\\\\\\n        A^T, & \\\\text{if trans_A == rocsparse_operation_transpose} \\\\\\\\\\n        A^H, & \\\\text{if trans_A == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n  and\\n  \\\\f[\\n    op(B) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        B,   & \\\\text{if trans_B == rocsparse_operation_none} \\\\\\\\\\n        B^T, & \\\\text{if trans_B == rocsparse_operation_transpose} \\\\\\\\\\n        B^H, & \\\\text{if trans_B == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n\\n  The symbolic part of the csr matrix C can be obtained by rocsparse_csrgemm_symbolic().\\n  It is assumed that \\\\p csr_row_ptr_C and \\\\p csr_col_ind_C have already been filled and that \\\\p csr_val_C is allocated by the user. \\\\p csr_row_ptr_C and allocation size of\\n  \\\\p csr_col_ind_C and \\\\p csr_val_C is defined by the number of non-zero elements of\\n  the sparse CSR matrix C. Both can be obtained by rocsparse_csrgemm_nnz(). The\\n  required buffer size for the computation can be obtained by\\n  rocsparse_scsrgemm_buffer_size(), rocsparse_dcsrgemm_buffer_size(),\\n  rocsparse_ccsrgemm_buffer_size() and rocsparse_zcsrgemm_buffer_size(), respectively.\\n\\n  \\\\note If \\\\f$\\\\alpha == 0\\\\f$, then \\\\f$C = \\\\beta \\\\cdot D\\\\f$ will be computed.\\n  \\\\note If \\\\f$\\\\beta == 0\\\\f$, then \\\\f$C = \\\\alpha \\\\cdot op(A) \\\\cdot op(B)\\\\f$ will be computed.\\n  \\\\note \\\\f$\\\\alpha == beta == 0\\\\f$ is invalid.\\n  \\\\note Currently, only \\\\p trans_A == \\\\ref rocsparse_operation_none is supported.\\n  \\\\note Currently, only \\\\p trans_B == \\\\ref rocsparse_operation_none is supported.\\n  \\\\note Currently, only \\\\ref rocsparse_matrix_type_general is supported.\\n  \\\\note Please note, that for matrix products with more than 4096 non-zero entries per\\n  row, additional temporary storage buffer is allocated by the algorithm.\\n  \\\\note This function is blocking with respect to the host.\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle          handle to the rocsparse library context queue.\\n  @param[in]\\n  trans_A         matrix \\\\f$A\\\\f$ operation type.\\n  @param[in]\\n  trans_B         matrix \\\\f$B\\\\f$ operation type.\\n  @param[in]\\n  m               number of rows of the sparse CSR matrix \\\\f$op(A)\\\\f$ and \\\\f$C\\\\f$.\\n  @param[in]\\n  n               number of columns of the sparse CSR matrix \\\\f$op(B)\\\\f$ and\\n                  \\\\f$C\\\\f$.\\n  @param[in]\\n  k               number of columns of the sparse CSR matrix \\\\f$op(A)\\\\f$ and number of\\n                  rows of the sparse CSR matrix \\\\f$op(B)\\\\f$.\\n  @param[in]\\n  alpha           scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  descr_A         descriptor of the sparse CSR matrix \\\\f$A\\\\f$. Currenty, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  nnz_A           number of non-zero entries of the sparse CSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  csr_val_A       array of \\\\p nnz_A elements of the sparse CSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  csr_row_ptr_A   array of \\\\p m+1 elements (\\\\f$op(A) == A\\\\f$, \\\\p k+1 otherwise)\\n                  that point to the start of every row of the sparse CSR matrix\\n                  \\\\f$op(A)\\\\f$.\\n  @param[in]\\n  csr_col_ind_A   array of \\\\p nnz_A elements containing the column indices of the\\n                  sparse CSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  descr_B         descriptor of the sparse CSR matrix \\\\f$B\\\\f$. Currenty, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  nnz_B           number of non-zero entries of the sparse CSR matrix \\\\f$B\\\\f$.\\n  @param[in]\\n  csr_val_B       array of \\\\p nnz_B elements of the sparse CSR matrix \\\\f$B\\\\f$.\\n  @param[in]\\n  csr_row_ptr_B   array of \\\\p k+1 elements (\\\\f$op(B) == B\\\\f$, \\\\p m+1 otherwise)\\n                  that point to the start of every row of the sparse CSR matrix\\n                  \\\\f$op(B)\\\\f$.\\n  @param[in]\\n  csr_col_ind_B   array of \\\\p nnz_B elements containing the column indices of the\\n                  sparse CSR matrix \\\\f$B\\\\f$.\\n  @param[in]\\n  beta            scalar \\\\f$\\\\beta\\\\f$.\\n  @param[in]\\n  descr_D         descriptor of the sparse CSR matrix \\\\f$D\\\\f$. Currenty, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  nnz_D           number of non-zero entries of the sparse CSR matrix \\\\f$D\\\\f$.\\n  @param[in]\\n  csr_val_D       array of \\\\p nnz_D elements of the sparse CSR matrix \\\\f$D\\\\f$.\\n  @param[in]\\n  csr_row_ptr_D   array of \\\\p m+1 elements that point to the start of every row of the\\n                  sparse CSR matrix \\\\f$D\\\\f$.\\n  @param[in]\\n  csr_col_ind_D   array of \\\\p nnz_D elements containing the column indices of the\\n                  sparse CSR matrix \\\\f$D\\\\f$.\\n  @param[in]\\n  descr_C         descriptor of the sparse CSR matrix \\\\f$C\\\\f$. Currenty, only\\n                  \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  nnz_C           number of non-zero entries of the sparse CSR matrix \\\\f$C\\\\f$.\\n  @param[out]\\n  csr_val_C       array of \\\\p nnz_C elements of the sparse CSR matrix \\\\f$C\\\\f$.\\n  @param[in]\\n  csr_row_ptr_C   array of \\\\p m+1 elements that point to the start of every row of the\\n                  sparse CSR matrix \\\\f$C\\\\f$.\\n  @param[in]\\n  csr_col_ind_C   array of \\\\p nnz_C elements containing the column indices of the\\n                  sparse CSR matrix \\\\f$C\\\\f$.\\n  @param[in]\\n  info_C          structure that holds meta data for the sparse CSR matrix \\\\f$C\\\\f$.\\n  @param[in]\\n  temp_buffer     temporary storage buffer allocated by the user, size is returned\\n                  by rocsparse_scsrgemm_buffer_size(),\\n                  rocsparse_dcsrgemm_buffer_size(), rocsparse_ccsrgemm_buffer_size() or\\n                  rocsparse_zcsrgemm_buffer_size().\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval rocsparse_status_invalid_size \\\\p m, \\\\p n, \\\\p k, \\\\p nnz_A, \\\\p nnz_B or\\n          \\\\p nnz_D is invalid.\\n  \\\\retval rocsparse_status_invalid_pointer \\\\p alpha and \\\\p beta are invalid,\\n          \\\\p descr_A, \\\\p csr_val_A, \\\\p csr_row_ptr_A, \\\\p csr_col_ind_A, \\\\p descr_B,\\n          \\\\p csr_val_B, \\\\p csr_row_ptr_B or \\\\p csr_col_ind_B are invalid if \\\\p alpha\\n          is valid, \\\\p descr_D, \\\\p csr_val_D, \\\\p csr_row_ptr_D or \\\\p csr_col_ind_D is\\n          invalid if \\\\p beta is valid, \\\\p csr_val_C, \\\\p csr_row_ptr_C,\\n          \\\\p csr_col_ind_C, \\\\p info_C or \\\\p temp_buffer is invalid.\\n  \\\\retval rocsparse_status_memory_error additional buffer for long rows could not be\\n          allocated.\\n  \\\\retval rocsparse_status_not_implemented\\n          \\\\p trans_A != \\\\ref rocsparse_operation_none,\\n          \\\\p trans_B != \\\\ref rocsparse_operation_none, or\\n          \\\\p rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n\\n  \\\\par Example\\n  This example multiplies two CSR matrices with a scalar alpha and adds the result to\\n  another CSR matrix.\\n  \\\\code{.c}\\n  // Initialize scalar multipliers\\n  float alpha = 2.0f;\\n  float beta  = 1.0f;\\n\\n  // Create matrix descriptors\\n  rocsparse_mat_descr descr_A;\\n  rocsparse_mat_descr descr_B;\\n  rocsparse_mat_descr descr_C;\\n  rocsparse_mat_descr descr_D;\\n\\n  rocsparse_create_mat_descr(&descr_A);\\n  rocsparse_create_mat_descr(&descr_B);\\n  rocsparse_create_mat_descr(&descr_C);\\n  rocsparse_create_mat_descr(&descr_D);\\n\\n  // Create matrix info structure\\n  rocsparse_mat_info info_C;\\n  rocsparse_create_mat_info(&info_C);\\n\\n  // Set pointer mode\\n  rocsparse_set_pointer_mode(handle, rocsparse_pointer_mode_host);\\n\\n  // Query rocsparse for the required buffer size\\n  size_t buffer_size;\\n\\n  rocsparse_scsrgemm_buffer_size(handle,\\n                                 rocsparse_operation_none,\\n                                 rocsparse_operation_none,\\n                                 m,\\n                                 n,\\n                                 k,\\n                                 &alpha,\\n                                 descr_A,\\n                                 nnz_A,\\n                                 csr_row_ptr_A,\\n                                 csr_col_ind_A,\\n                                 descr_B,\\n                                 nnz_B,\\n                                 csr_row_ptr_B,\\n                                 csr_col_ind_B,\\n                                 &beta,\\n                                 descr_D,\\n                                 nnz_D,\\n                                 csr_row_ptr_D,\\n                                 csr_col_ind_D,\\n                                 info_C,\\n                                 &buffer_size);\\n\\n  // Allocate buffer\\n  void* buffer;\\n  hipMalloc(&buffer, buffer_size);\\n\\n  // Obtain number of total non-zero entries in C and row pointers of C\\n  rocsparse_int nnz_C;\\n  hipMalloc((void**)&csr_row_ptr_C, sizeof(rocsparse_int) * (m + 1));\\n\\n  rocsparse_csrgemm_nnz(handle,\\n                        rocsparse_operation_none,\\n                        rocsparse_operation_none,\\n                        m,\\n                        n,\\n                        k,\\n                        descr_A,\\n                        nnz_A,\\n                        csr_row_ptr_A,\\n                        csr_col_ind_A,\\n                        descr_B,\\n                        nnz_B,\\n                        csr_row_ptr_B,\\n                        csr_col_ind_B,\\n                        descr_D,\\n                        nnz_D,\\n                        csr_row_ptr_D,\\n                        csr_col_ind_D,\\n                        descr_C,\\n                        csr_row_ptr_C,\\n                        &nnz_C,\\n                        info_C,\\n                        buffer);\\n\\n  // Compute column indices and values of C\\n  hipMalloc((void**)&csr_col_ind_C, sizeof(rocsparse_int) * nnz_C);\\n  rocsparse_csrgemm_symbolic(handle,\\n                     rocsparse_operation_none,\\n                     rocsparse_operation_none,\\n                     m,\\n                     n,\\n                     k,\\n                     descr_A,\\n                     nnz_A,\\n                     csr_row_ptr_A,\\n                     csr_col_ind_A,\\n                     descr_B,\\n                     nnz_B,\\n                     csr_row_ptr_B,\\n                     csr_col_ind_B,\\n                     descr_D,\\n                     nnz_D,\\n                     csr_row_ptr_D,\\n                     csr_col_ind_D,\\n                     descr_C,\\n                     nnz_C,\\n                     csr_row_ptr_C,\\n                     csr_col_ind_C,\\n                     info_C,\\n                     buffer);\\n  hipMalloc((void**)&csr_val_C, sizeof(float) * nnz_C);\\n\\n  rocsparse_scsrgemm_numeric(handle,\\n                     rocsparse_operation_none,\\n                     rocsparse_operation_none,\\n                     m,\\n                     n,\\n                     k,\\n                     &alpha,\\n                     descr_A,\\n                     nnz_A,\\n                     csr_val_A,\\n                     csr_row_ptr_A,\\n                     csr_col_ind_A,\\n                     descr_B,\\n                     nnz_B,\\n                     csr_val_B,\\n                     csr_row_ptr_B,\\n                     csr_col_ind_B,\\n                     &beta,\\n                     descr_D,\\n                     nnz_D,\\n                     csr_val_D,\\n                     csr_row_ptr_D,\\n                     csr_col_ind_D,\\n                     descr_C,\\n                     nnz_C,\\n                     csr_val_C,\\n                     csr_row_ptr_C,\\n                     csr_col_ind_C,\\n                     info_C,\\n                     buffer);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_scsrgemm_numeric(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        k: rocsparse_int,\n        alpha: *const f32,\n        descr_A: rocsparse_mat_descr,\n        nnz_A: rocsparse_int,\n        csr_val_A: *const f32,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        descr_B: rocsparse_mat_descr,\n        nnz_B: rocsparse_int,\n        csr_val_B: *const f32,\n        csr_row_ptr_B: *const rocsparse_int,\n        csr_col_ind_B: *const rocsparse_int,\n        beta: *const f32,\n        descr_D: rocsparse_mat_descr,\n        nnz_D: rocsparse_int,\n        csr_val_D: *const f32,\n        csr_row_ptr_D: *const rocsparse_int,\n        csr_col_ind_D: *const rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        nnz_C: rocsparse_int,\n        csr_val_C: *mut f32,\n        csr_row_ptr_C: *const rocsparse_int,\n        csr_col_ind_C: *const rocsparse_int,\n        info_C: rocsparse_mat_info,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsrgemm_numeric(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        k: rocsparse_int,\n        alpha: *const f64,\n        descr_A: rocsparse_mat_descr,\n        nnz_A: rocsparse_int,\n        csr_val_A: *const f64,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        descr_B: rocsparse_mat_descr,\n        nnz_B: rocsparse_int,\n        csr_val_B: *const f64,\n        csr_row_ptr_B: *const rocsparse_int,\n        csr_col_ind_B: *const rocsparse_int,\n        beta: *const f64,\n        descr_D: rocsparse_mat_descr,\n        nnz_D: rocsparse_int,\n        csr_val_D: *const f64,\n        csr_row_ptr_D: *const rocsparse_int,\n        csr_col_ind_D: *const rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        nnz_C: rocsparse_int,\n        csr_val_C: *mut f64,\n        csr_row_ptr_C: *const rocsparse_int,\n        csr_col_ind_C: *const rocsparse_int,\n        info_C: rocsparse_mat_info,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsrgemm_numeric(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        k: rocsparse_int,\n        alpha: *const rocsparse_float_complex,\n        descr_A: rocsparse_mat_descr,\n        nnz_A: rocsparse_int,\n        csr_val_A: *const rocsparse_float_complex,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        descr_B: rocsparse_mat_descr,\n        nnz_B: rocsparse_int,\n        csr_val_B: *const rocsparse_float_complex,\n        csr_row_ptr_B: *const rocsparse_int,\n        csr_col_ind_B: *const rocsparse_int,\n        beta: *const rocsparse_float_complex,\n        descr_D: rocsparse_mat_descr,\n        nnz_D: rocsparse_int,\n        csr_val_D: *const rocsparse_float_complex,\n        csr_row_ptr_D: *const rocsparse_int,\n        csr_col_ind_D: *const rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        nnz_C: rocsparse_int,\n        csr_val_C: *mut rocsparse_float_complex,\n        csr_row_ptr_C: *const rocsparse_int,\n        csr_col_ind_C: *const rocsparse_int,\n        info_C: rocsparse_mat_info,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsrgemm_numeric(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        k: rocsparse_int,\n        alpha: *const rocsparse_double_complex,\n        descr_A: rocsparse_mat_descr,\n        nnz_A: rocsparse_int,\n        csr_val_A: *const rocsparse_double_complex,\n        csr_row_ptr_A: *const rocsparse_int,\n        csr_col_ind_A: *const rocsparse_int,\n        descr_B: rocsparse_mat_descr,\n        nnz_B: rocsparse_int,\n        csr_val_B: *const rocsparse_double_complex,\n        csr_row_ptr_B: *const rocsparse_int,\n        csr_col_ind_B: *const rocsparse_int,\n        beta: *const rocsparse_double_complex,\n        descr_D: rocsparse_mat_descr,\n        nnz_D: rocsparse_int,\n        csr_val_D: *const rocsparse_double_complex,\n        csr_row_ptr_D: *const rocsparse_int,\n        csr_col_ind_D: *const rocsparse_int,\n        descr_C: rocsparse_mat_descr,\n        nnz_C: rocsparse_int,\n        csr_val_C: *mut rocsparse_double_complex,\n        csr_row_ptr_C: *const rocsparse_int,\n        csr_col_ind_C: *const rocsparse_int,\n        info_C: rocsparse_mat_info,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup generic_module\n  \\brief Scale a sparse vector and add it to a scaled dense vector.\n\n  \\details\n  \\ref rocsparse_axpby multiplies the sparse vector \\f$x\\f$ with scalar \\f$\\alpha\\f$ and\n  adds the result to the dense vector \\f$y\\f$ that is multiplied with scalar\n  \\f$\\beta\\f$, such that\n\n  \\f[\n      y := \\alpha \\cdot x + \\beta \\cdot y\n  \\f]\n\n  \\code{.c}\n      for(i = 0; i < nnz; ++i)\n      {\n          y[x_ind[i]] = alpha * x_val[i] + beta * y[x_ind[i]]\n      }\n  \\endcode\n\n  \\note\n  This function is non blocking and executed asynchronously with respect to the host.\n  It may return before the actual computation has finished.\n\n  \\note\n  This routine supports execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[in]\n  alpha       scalar \\f$\\alpha\\f$.\n  @param[in]\n  x           sparse matrix descriptor.\n  @param[in]\n  beta        scalar \\f$\\beta\\f$.\n  @param[inout]\n  y           dense matrix descriptor.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval rocsparse_status_invalid_pointer \\p alpha, \\p x, \\p beta or \\p y pointer is\n          invalid.\n\n  \\par Example\n  \\code{.c}\n   // Number of non-zeros of the sparse vector\n   int nnz = 3;\n\n   // Size of sparse and dense vector\n   int size = 9;\n\n   // Sparse index vector\n   std::vector<int> hx_ind = {0, 3, 5};\n\n   // Sparse value vector\n   std::vector<float> hx_val = {1.0f, 2.0f, 3.0f};\n\n   // Dense vector\n   std::vector<float> hy = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f};\n\n   // Scalar alpha\n   float alpha = 3.7f;\n\n   // Scalar beta\n   float beta = 1.2f;\n\n   // Offload data to device\n   int* dx_ind;\n   float* dx_val;\n   float* dy;\n   hipMalloc((void**)&dx_ind, sizeof(int) * nnz);\n   hipMalloc((void**)&dx_val, sizeof(float) * nnz);\n   hipMalloc((void**)&dy, sizeof(float) * size);\n\n   hipMemcpy(dx_ind, hx_ind.data(), sizeof(int) * nnz, hipMemcpyHostToDevice);\n   hipMemcpy(dx_val, hx_val.data(), sizeof(float) * nnz, hipMemcpyHostToDevice);\n   hipMemcpy(dy, hy.data(), sizeof(float) * size, hipMemcpyHostToDevice);\n\n   rocsparse_handle     handle;\n   rocsparse_spvec_descr vecX;\n   rocsparse_dnvec_descr vecY;\n\n   rocsparse_indextype idx_type = rocsparse_indextype_i32;\n   rocsparse_datatype  data_type = rocsparse_datatype_f32_r;\n   rocsparse_index_base idx_base = rocsparse_index_base_zero;\n\n   rocsparse_create_handle(&handle);\n\n   // Create sparse vector X\n   rocsparse_create_spvec_descr(&vecX,\n                                size,\n                                nnz,\n                                dx_ind,\n                                dx_val,\n                                idx_type,\n                                idx_base,\n                                data_type);\n\n   // Create dense vector Y\n   rocsparse_create_dnvec_descr(&vecY,\n                                size,\n                                dy,\n                                data_type);\n\n   // Call axpby to perform y = beta * y + alpha * x\n   rocsparse_axpby(handle,\n                   &alpha,\n                   vecX,\n                   &beta,\n                   vecY);\n\n   rocsparse_dnvec_get_values(vecY, (void**)&dy);\n\n   // Copy result back to host\n   hipMemcpy(hy.data(), dy, sizeof(float) * size, hipMemcpyDeviceToHost);\n\n   std::cout << \"y\" << std::endl;\n   for(size_t i = 0; i < hy.size(); ++i)\n   {\n       std::cout << hy[i] << \" \";\n   }\n   std::cout << std::endl;\n\n   // Clear rocSPARSE\n   rocsparse_destroy_spvec_descr(vecX);\n   rocsparse_destroy_dnvec_descr(vecY);\n   rocsparse_destroy_handle(handle);\n\n   // Clear device memory\n   hipFree(dx_ind);\n   hipFree(dx_val);\n   hipFree(dy);\n  \\endcode*/\n    pub fn rocsparse_axpby(\n        handle: rocsparse_handle,\n        alpha: *const ::core::ffi::c_void,\n        x: rocsparse_const_spvec_descr,\n        beta: *const ::core::ffi::c_void,\n        y: rocsparse_dnvec_descr,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup generic_module\n  \\brief Check matrix to see if it is valid.\n\n  \\details\n  \\p rocsparse_check_spmat checks if the input matrix is valid.\n\n  \\note\n  This function writes the required allocation size (in bytes) to \\p buffer_size and\n  returns without performing the checking operation, when stage is equal to\n  \\ref rocsparse_check_spmat_stage_buffer_size.\n\n  \\note\n  The sparse matrix formats currently supported are: rocsparse_format_coo, rocsparse_format_csr,\n  rocsparse_format_csc and rocsparse_format_ell.\n\n  \\note check_spmat requires two stages to complete. The first stage\n  \\ref rocsparse_check_spmat_stage_buffer_size will return the size of the temporary storage buffer\n  that is required for subsequent calls to \\ref rocsparse_check_spmat.\n  In the final stage \\ref rocsparse_check_spmat_stage_compute, the actual computation is performed.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[in]\n  mat         matrix descriptor.\n  @param[out]\n  data_status modified to indicate the status of the data\n  @param[in]\n  stage       check_matrix stage for the matrix computation.\n  @param[out]\n  buffer_size number of bytes of the temporary storage buffer. buffer_size is set when\n              \\p temp_buffer is nullptr.\n  @param[in]\n  temp_buffer temporary storage buffer allocated by the user. When a nullptr is passed,\n              the required allocation size (in bytes) is written to \\p buffer_size and\n              function returns without performing the checking operation.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_pointer \\p mat, \\p buffer_size, \\p temp_buffer or \\p data_status pointer\n              is invalid.\n  \\retval     rocsparse_status_invalid_value the value of stage is incorrect.*/\n    pub fn rocsparse_check_spmat(\n        handle: rocsparse_handle,\n        mat: rocsparse_const_spmat_descr,\n        data_status: *mut rocsparse_data_status,\n        stage: rocsparse_check_spmat_stage,\n        buffer_size: *mut usize,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup generic_module\n  \\brief Dense matrix to sparse matrix conversion\n\n  \\details\n  \\p rocsparse_dense_to_sparse\n  \\p rocsparse_dense_to_sparse performs the conversion of a dense matrix to a sparse matrix in CSR, CSC, or COO format.\n\n  \\note\n  This function writes the required allocation size (in bytes) to \\p buffer_size and\n  returns without performing the dense to sparse operation, when a nullptr is passed for\n  \\p temp_buffer.\n\n  \\note\n  This function is blocking with respect to the host.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle       handle to the rocsparse library context queue.\n  @param[in]\n  mat_A        dense matrix descriptor.\n  @param[in]\n  mat_B        sparse matrix descriptor.\n  @param[in]\n  alg          algorithm for the sparse to dense computation.\n  @param[out]\n  buffer_size  number of bytes of the temporary storage buffer. buffer_size is set when\n               \\p temp_buffer is nullptr.\n  @param[in]\n  temp_buffer  temporary storage buffer allocated by the user. When a nullptr is passed,\n               the required allocation size (in bytes) is written to \\p buffer_size and\n               function returns without performing the dense to sparse operation.\n\n  \\retval      rocsparse_status_success the operation completed successfully.\n  \\retval      rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval      rocsparse_status_invalid_pointer \\p mat_A, \\p mat_B, or \\p buffer_size\n               pointer is invalid.\n\n  \\par Example\n  \\code{.c}\n   //     1 4 0 0 0 0\n   // A = 0 2 3 0 0 0\n   //     5 0 0 7 8 0\n   //     0 0 9 0 6 0\n   rocsparse_int m   = 4;\n   rocsparse_int n   = 6;\n\n   std::vector<float> hdense = {1, 0, 5, 0, 4, 2, 0, 0, 0, 3, 0, 9, 0, 0, 7, 0, 0, 0, 8, 6, 0, 0, 0, 0};\n\n   // Offload data to device\n   int* dcsr_row_ptr;\n   float* ddense;\n   hipMalloc((void**)&dcsr_row_ptr, sizeof(int) * (m + 1));\n   hipMalloc((void**)&ddense, sizeof(float) * m * n);\n\n   hipMemcpy(ddense, hdense.data(), sizeof(float) * m * n, hipMemcpyHostToDevice);\n\n   rocsparse_handle     handle;\n   rocsparse_dnmat_descr matA;\n   rocsparse_spmat_descr matB;\n\n   rocsparse_indextype row_idx_type = rocsparse_indextype_i32;\n   rocsparse_indextype col_idx_type = rocsparse_indextype_i32;\n   rocsparse_datatype  data_type = rocsparse_datatype_f32_r;\n   rocsparse_index_base idx_base = rocsparse_index_base_zero;\n\n   rocsparse_create_handle(&handle);\n\n   // Create sparse matrix A\n   rocsparse_create_dnmat_descr(&matA, m, n, m, ddense, data_type, rocsparse_order_column);\n\n   // Create dense matrix B\n   rocsparse_create_csr_descr(&matB,\n                              m,\n                              n,\n                              0,\n                              dcsr_row_ptr,\n                              nullptr,\n                              nullptr,\n                              row_idx_type,\n                              col_idx_type,\n                              idx_base,\n                              data_type);\n\n   // Call dense_to_sparse to get required buffer size\n   size_t buffer_size = 0;\n   rocsparse_dense_to_sparse(handle,\n                             matA,\n                             matB,\n                             rocsparse_dense_to_sparse_alg_default,\n                             &buffer_size,\n                             nullptr);\n\n   void* temp_buffer;\n   hipMalloc((void**)&temp_buffer, buffer_size);\n\n   // Call dense_to_sparse to perform analysis\n   rocsparse_dense_to_sparse(handle,\n                             matA,\n                             matB,\n                             rocsparse_dense_to_sparse_alg_default,\n                             nullptr,\n                             temp_buffer);\n\n   int64_t num_rows_tmp, num_cols_tmp, nnz;\n   rocsparse_spmat_get_size(matB, &num_rows_tmp, &num_cols_tmp, &nnz);\n\n   int* dcsr_col_ind;\n   float* dcsr_val;\n   hipMalloc((void**)&dcsr_col_ind, sizeof(int) * nnz);\n   hipMalloc((void**)&dcsr_val, sizeof(float) * nnz);\n\n   rocsparse_csr_set_pointers(matB, dcsr_row_ptr, dcsr_col_ind, dcsr_val);\n\n   // Call dense_to_sparse to complete conversion\n   rocsparse_dense_to_sparse(handle,\n                             matA,\n                             matB,\n                             rocsparse_dense_to_sparse_alg_default,\n                             &buffer_size,\n                             temp_buffer);\n\n   std::vector<int> hcsr_row_ptr(m + 1, 0);\n   std::vector<int> hcsr_col_ind(nnz, 0);\n   std::vector<float> hcsr_val(nnz, 0);\n\n   // Copy result back to host\n   hipMemcpy(hcsr_row_ptr.data(), dcsr_row_ptr, sizeof(int) * (m + 1), hipMemcpyDeviceToHost);\n   hipMemcpy(hcsr_col_ind.data(), dcsr_col_ind, sizeof(int) * nnz, hipMemcpyDeviceToHost);\n   hipMemcpy(hcsr_val.data(), dcsr_val, sizeof(int) * nnz, hipMemcpyDeviceToHost);\n\n   std::cout << \"hcsr_row_ptr\" << std::endl;\n   for(size_t i = 0; i < hcsr_row_ptr.size(); ++i)\n   {\n       std::cout << hcsr_row_ptr[i] << \" \";\n   }\n   std::cout << std::endl;\n\n   std::cout << \"hcsr_col_ind\" << std::endl;\n   for(size_t i = 0; i < hcsr_col_ind.size(); ++i)\n   {\n       std::cout << hcsr_col_ind[i] << \" \";\n   }\n   std::cout << std::endl;\n\n   std::cout << \"hcsr_val\" << std::endl;\n   for(size_t i = 0; i < hcsr_val.size(); ++i)\n   {\n       std::cout << hcsr_val[i] << \" \";\n   }\n   std::cout << std::endl;\n\n   // Clear rocSPARSE\n   rocsparse_destroy_dnmat_descr(matA);\n   rocsparse_destroy_spmat_descr(matB);\n   rocsparse_destroy_handle(handle);\n\n   // Clear device memory\n   hipFree(dcsr_row_ptr);\n   hipFree(dcsr_col_ind);\n   hipFree(dcsr_val);\n   hipFree(ddense);\n  \\endcode*/\n    pub fn rocsparse_dense_to_sparse(\n        handle: rocsparse_handle,\n        mat_A: rocsparse_const_dnmat_descr,\n        mat_B: rocsparse_spmat_descr,\n        alg: rocsparse_dense_to_sparse_alg,\n        buffer_size: *mut usize,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup generic_module\n  \\brief Gather elements from a dense vector and store them into a sparse vector.\n\n  \\details\n  \\ref rocsparse_gather gathers the elements from the dense vector \\f$y\\f$ and stores\n  them in the sparse vector \\f$x\\f$.\n\n  \\code{.c}\n      for(i = 0; i < nnz; ++i)\n      {\n          x_val[i] = y[x_ind[i]];\n      }\n  \\endcode\n\n  \\par Uniform Precisions:\n  <table>\n  <caption id=\"gather_uniform\">Uniform Precisions</caption>\n  <tr><th>X / Y\n  <tr><td>rocsparse_datatype_i8_r\n  <tr><td>rocsparse_datatype_f32_r\n  <tr><td>rocsparse_datatype_f64_r\n  <tr><td>rocsparse_datatype_f32_c\n  <tr><td>rocsparse_datatype_f64_c\n  </table>\n\n  \\note\n  This function is non blocking and executed asynchronously with respect to the host.\n  It may return before the actual computation has finished.\n\n  \\note\n  This routine supports execution in a hipGraph context.\n\n  @param[in]\n  handle       handle to the rocsparse library context queue.\n  @param[in]\n  y            dense vector \\f$y\\f$.\n  @param[out]\n  x            sparse vector \\f$x\\f$.\n\n  \\retval      rocsparse_status_success the operation completed successfully.\n  \\retval      rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval      rocsparse_status_invalid_pointer \\p x or \\p y pointer is invalid.\n\n  \\par Example\n  \\code{.c}\n   // Number of non-zeros of the sparse vector\n   int nnz = 3;\n\n   // Size of sparse and dense vector\n   int size = 9;\n\n   // Sparse index vector\n   std::vector<int> hx_ind = {0, 3, 5};\n\n   // Dense vector\n   std::vector<float> hy = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f};\n\n   // Offload data to device\n   int* dx_ind;\n   float* dx_val;\n   float* dy;\n   hipMalloc((void**)&dx_ind, sizeof(int) * nnz);\n   hipMalloc((void**)&dx_val, sizeof(float) * nnz);\n   hipMalloc((void**)&dy, sizeof(float) * size);\n\n   hipMemcpy(dx_ind, hx_ind.data(), sizeof(int) * nnz, hipMemcpyHostToDevice);\n   hipMemcpy(dy, hy.data(), sizeof(float) * size, hipMemcpyHostToDevice);\n\n   rocsparse_handle     handle;\n   rocsparse_spvec_descr vecX;\n   rocsparse_dnvec_descr vecY;\n\n   rocsparse_indextype idx_type = rocsparse_indextype_i32;\n   rocsparse_datatype  data_type = rocsparse_datatype_f32_r;\n   rocsparse_index_base idx_base = rocsparse_index_base_zero;\n\n   rocsparse_create_handle(&handle);\n\n   // Create sparse vector X\n   rocsparse_create_spvec_descr(&vecX,\n                                size,\n                                nnz,\n                                dx_ind,\n                                dx_val,\n                                idx_type,\n                                idx_base,\n                                data_type);\n\n   // Create dense vector Y\n   rocsparse_create_dnvec_descr(&vecY,\n                                size,\n                                dy,\n                                data_type);\n\n   // Call axpby to perform gather\n   rocsparse_gather(handle, vecY, vecX);\n\n   rocsparse_spvec_get_values(vecX, (void**)&dx_val);\n\n   // Copy result back to host\n   std::vector<float> hx_val(nnz, 0.0f);\n   hipMemcpy(hx_val.data(), dx_val, sizeof(float) * nnz, hipMemcpyDeviceToHost);\n\n   std::cout << \"x\" << std::endl;\n   for(size_t i = 0; i < hx_val.size(); ++i)\n   {\n       std::cout << hx_val[i] << \" \";\n   }\n\n   std::cout << std::endl;\n\n   // Clear rocSPARSE\n   rocsparse_destroy_spvec_descr(vecX);\n   rocsparse_destroy_dnvec_descr(vecY);\n   rocsparse_destroy_handle(handle);\n\n   // Clear device memory\n   hipFree(dx_ind);\n   hipFree(dx_val);\n   hipFree(dy);\n  \\endcode*/\n    pub fn rocsparse_gather(\n        handle: rocsparse_handle,\n        y: rocsparse_const_dnvec_descr,\n        x: rocsparse_spvec_descr,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup generic_module\n  \\brief Apply Givens rotation to a dense and a sparse vector.\n\n  \\details\n  \\ref rocsparse_rot applies the Givens rotation matrix \\f$G\\f$ to the sparse vector\n  \\f$x\\f$ and the dense vector \\f$y\\f$, where\n  \\f[\n    G = \\begin{pmatrix} c & s \\\\ -s & c \\end{pmatrix}\n  \\f]\n\n  \\code{.c}\n      for(i = 0; i < nnz; ++i)\n      {\n          x_tmp = x_val[i];\n          y_tmp = y[x_ind[i]];\n\n          x_val[i]    = c * x_tmp + s * y_tmp;\n          y[x_ind[i]] = c * y_tmp - s * x_tmp;\n      }\n  \\endcode\n\n  \\note\n  This function is non blocking and executed asynchronously with respect to the host.\n  It may return before the actual computation has finished.\n\n  \\note\n  This routine supports execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[in]\n  c           pointer to the cosine element of \\f$G\\f$, can be on host or device.\n  @param[in]\n  s           pointer to the sine element of \\f$G\\f$, can be on host or device.\n  @param[inout]\n  x           sparse vector \\f$x\\f$.\n  @param[inout]\n  y           dense vector \\f$y\\f$.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_pointer \\p c, \\p s, \\p x or \\p y pointer is\n              invalid.\n  \\par Example\n  \\code{.c}\n   // Number of non-zeros of the sparse vector\n   int nnz = 3;\n\n   // Size of sparse and dense vector\n   int size = 9;\n\n   // Sparse index vector\n   std::vector<int> hx_ind = {0, 3, 5};\n\n   // Sparse value vector\n   std::vector<float> hx_val = {1.0f, 2.0f, 3.0f};\n\n   // Dense vector\n   std::vector<float> hy = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f};\n\n   // Scalar c\n   float c = 3.7f;\n\n   // Scalar s\n   float s = 1.2f;\n\n   // Offload data to device\n   int* dx_ind;\n   float* dx_val;\n   float* dy;\n   hipMalloc((void**)&dx_ind, sizeof(int) * nnz);\n   hipMalloc((void**)&dx_val, sizeof(float) * nnz);\n   hipMalloc((void**)&dy, sizeof(float) * size);\n\n   hipMemcpy(dx_ind, hx_ind.data(), sizeof(int) * nnz, hipMemcpyHostToDevice);\n   hipMemcpy(dx_val, hx_val.data(), sizeof(float) * nnz, hipMemcpyHostToDevice);\n   hipMemcpy(dy, hy.data(), sizeof(float) * size, hipMemcpyHostToDevice);\n\n   rocsparse_handle     handle;\n   rocsparse_spvec_descr vecX;\n   rocsparse_dnvec_descr vecY;\n\n   rocsparse_indextype idx_type = rocsparse_indextype_i32;\n   rocsparse_datatype  data_type = rocsparse_datatype_f32_r;\n   rocsparse_index_base idx_base = rocsparse_index_base_zero;\n\n   rocsparse_create_handle(&handle);\n\n   // Create sparse vector X\n   rocsparse_create_spvec_descr(&vecX,\n                                size,\n                                nnz,\n                                dx_ind,\n                                dx_val,\n                                idx_type,\n                                idx_base,\n                                data_type);\n\n   // Create dense vector Y\n   rocsparse_create_dnvec_descr(&vecY,\n                                size,\n                                dy,\n                                data_type);\n\n   // Call rot\n   rocsparse_rot(handle, (void*)&c, (void*)&s, vecX, vecY);\n\n   rocsparse_spvec_get_values(vecX, (void**)&dx_val);\n   rocsparse_dnvec_get_values(vecY, (void**)&dy);\n\n   // Copy result back to host\n   hipMemcpy(hx_val.data(), dx_val, sizeof(float) * nnz, hipMemcpyDeviceToHost);\n   hipMemcpy(hy.data(), dy, sizeof(float) * size, hipMemcpyDeviceToHost);\n\n   std::cout << \"x\" << std::endl;\n   for(size_t i = 0; i < hx_val.size(); ++i)\n   {\n       std::cout << hx_val[i] << \" \";\n   }\n\n   std::cout << std::endl;\n\n   std::cout << \"y\" << std::endl;\n   for(size_t i = 0; i < hy.size(); ++i)\n   {\n       std::cout << hy[i] << \" \";\n   }\n\n   std::cout << std::endl;\n\n   // Clear rocSPARSE\n   rocsparse_destroy_spvec_descr(vecX);\n   rocsparse_destroy_dnvec_descr(vecY);\n   rocsparse_destroy_handle(handle);\n\n   // Clear device memory\n   hipFree(dx_ind);\n   hipFree(dx_val);\n   hipFree(dy);\n  \\endcode*/\n    pub fn rocsparse_rot(\n        handle: rocsparse_handle,\n        c: *const ::core::ffi::c_void,\n        s: *const ::core::ffi::c_void,\n        x: rocsparse_spvec_descr,\n        y: rocsparse_dnvec_descr,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup generic_module\n  \\brief Scatter elements from a sparse vector into a dense vector.\n\n  \\details\n  \\ref rocsparse_scatter scatters the elements from the sparse vector \\f$x\\f$ in the dense\n  vector \\f$y\\f$.\n\n  \\code{.c}\n      for(i = 0; i < nnz; ++i)\n      {\n          y[x_ind[i]] = x_val[i];\n      }\n  \\endcode\n\n  \\par Uniform Precisions:\n  <table>\n  <caption id=\"scatter_uniform\">Uniform Precisions</caption>\n  <tr><th>X / Y\n  <tr><td>rocsparse_datatype_i8_r\n  <tr><td>rocsparse_datatype_f32_r\n  <tr><td>rocsparse_datatype_f64_r\n  <tr><td>rocsparse_datatype_f32_c\n  <tr><td>rocsparse_datatype_f64_c\n  </table>\n\n  \\note\n  This function is non blocking and executed asynchronously with respect to the host.\n  It may return before the actual computation has finished.\n\n  \\note\n  This routine supports execution in a hipGraph context.\n\n  @param[in]\n  handle       handle to the rocsparse library context queue.\n  @param[in]\n  x            sparse vector \\f$x\\f$.\n  @param[out]\n  y            dense vector \\f$y\\f$.\n\n  \\retval      rocsparse_status_success the operation completed successfully.\n  \\retval      rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval      rocsparse_status_invalid_pointer \\p x or \\p y pointer is invalid.\n\n  \\par Example\n  \\code{.c}\n   // Number of non-zeros of the sparse vector\n   int nnz = 3;\n\n   // Size of sparse and dense vector\n   int size = 9;\n\n   // Sparse index vector\n   std::vector<int> hx_ind = {0, 3, 5};\n\n   // Sparse value vector\n   std::vector<float> hx_val = {1.0f, 2.0f, 3.0f};\n\n   // Dense vector\n   std::vector<float> hy = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f};\n\n   // Offload data to device\n   int* dx_ind;\n   float* dx_val;\n   float* dy;\n   hipMalloc((void**)&dx_ind, sizeof(int) * nnz);\n   hipMalloc((void**)&dx_val, sizeof(float) * nnz);\n   hipMalloc((void**)&dy, sizeof(float) * size);\n\n   hipMemcpy(dx_ind, hx_ind.data(), sizeof(int) * nnz, hipMemcpyHostToDevice);\n   hipMemcpy(dx_val, hx_val.data(), sizeof(float) * nnz, hipMemcpyHostToDevice);\n   hipMemcpy(dy, hy.data(), sizeof(float) * size, hipMemcpyHostToDevice);\n\n   rocsparse_handle     handle;\n   rocsparse_spvec_descr vecX;\n   rocsparse_dnvec_descr vecY;\n\n   rocsparse_indextype idx_type = rocsparse_indextype_i32;\n   rocsparse_datatype  data_type = rocsparse_datatype_f32_r;\n   rocsparse_index_base idx_base = rocsparse_index_base_zero;\n\n   rocsparse_create_handle(&handle);\n\n   // Create sparse vector X\n   rocsparse_create_spvec_descr(&vecX,\n                                size,\n                                nnz,\n                                dx_ind,\n                                dx_val,\n                                idx_type,\n                                idx_base,\n                                data_type);\n\n   // Create dense vector Y\n   rocsparse_create_dnvec_descr(&vecY,\n                                size,\n                                dy,\n                                data_type);\n\n   // Call axpby to perform scatter\n   rocsparse_scatter(handle, vecX, vecY);\n\n   rocsparse_dnvec_get_values(vecY, (void**)&dy);\n\n   // Copy result back to host\n   hipMemcpy(hy.data(), dy, sizeof(float) * size, hipMemcpyDeviceToHost);\n\n   std::cout << \"y\" << std::endl;\n   for(size_t i = 0; i < hy.size(); ++i)\n   {\n       std::cout << hy[i] << \" \";\n   }\n\n   std::cout << std::endl;\n\n   // Clear rocSPARSE\n   rocsparse_destroy_spvec_descr(vecX);\n   rocsparse_destroy_dnvec_descr(vecY);\n   rocsparse_destroy_handle(handle);\n\n   // Clear device memory\n   hipFree(dx_ind);\n   hipFree(dx_val);\n   hipFree(dy);\n  \\endcode*/\n    pub fn rocsparse_scatter(\n        handle: rocsparse_handle,\n        x: rocsparse_const_spvec_descr,\n        y: rocsparse_dnvec_descr,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup generic_module\n  \\brief Calculate the size in bytes of the required buffer for the use of \\ref rocsparse_sddmm and \\ref rocsparse_sddmm_preprocess\n\n  \\details\n  \\ref rocsparse_sddmm_buffer_size returns the size of the required buffer to execute the SDDMM operation from a given configuration.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle       handle to the rocsparse library context queue.\n  @param[in]\n  opA      dense matrix \\f$A\\f$ operation type.\n  @param[in]\n  opB      dense matrix \\f$B\\f$ operation type.\n  @param[in]\n  alpha        scalar \\f$\\alpha\\f$.\n  @param[in]\n  A            dense matrix \\f$A\\f$ descriptor.\n  @param[in]\n  B            dense matrix \\f$B\\f$ descriptor.\n  @param[in]\n  beta         scalar \\f$\\beta\\f$.\n  @param[inout]\n  C            sparse matrix \\f$C\\f$ descriptor.\n  @param[in]\n  compute_type floating point precision for the SDDMM computation.\n  @param[in]\n  alg specification of the algorithm to use.\n  @param[out]\n  buffer_size  number of bytes of the temporary storage buffer.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_value the value of \\p trans\\_A or \\p trans\\_B is incorrect.\n  \\retval rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval rocsparse_status_invalid_pointer \\p alpha and \\p beta are invalid,\n          \\p A, \\p B, \\p D, \\p C or \\p buffer_size pointer is invalid.\n  \\retval rocsparse_status_not_implemented\n          \\p opA == \\ref rocsparse_operation_conjugate_transpose or\n          \\p opB == \\ref rocsparse_operation_conjugate_transpose.*/\n    pub fn rocsparse_sddmm_buffer_size(\n        handle: rocsparse_handle,\n        opA: rocsparse_operation,\n        opB: rocsparse_operation,\n        alpha: *const ::core::ffi::c_void,\n        A: rocsparse_const_dnmat_descr,\n        B: rocsparse_const_dnmat_descr,\n        beta: *const ::core::ffi::c_void,\n        C: rocsparse_spmat_descr,\n        compute_type: rocsparse_datatype,\n        alg: rocsparse_sddmm_alg,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup generic_module\n  \\brief Preprocess data before the use of \\ref rocsparse_sddmm.\n\n  \\details\n  \\ref rocsparse_sddmm_preprocess executes a part of the algorithm that can be calculated once in the context of multiple\n  calls of the \\ref rocsparse_sddmm with the same sparsity pattern.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle       handle to the rocsparse library context queue.\n  @param[in]\n  opA      dense matrix \\f$A\\f$ operation type.\n  @param[in]\n  opB      dense matrix \\f$B\\f$ operation type.\n  @param[in]\n  alpha        scalar \\f$\\alpha\\f$.\n  @param[in]\n  A            dense matrix \\f$A\\f$ descriptor.\n  @param[in]\n  B            dense matrix \\f$B\\f$ descriptor.\n  @param[in]\n  beta         scalar \\f$\\beta\\f$.\n  @param[inout]\n  C            sparse matrix \\f$C\\f$ descriptor.\n  @param[in]\n  compute_type floating point precision for the SDDMM computation.\n  @param[in]\n  alg specification of the algorithm to use.\n  @param[in]\n  temp_buffer  temporary storage buffer allocated by the user.\n  The size must be greater or equal to the size obtained with \\ref rocsparse_sddmm_buffer_size.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_value the value of \\p trans\\_A or \\p trans\\_B is incorrect.\n  \\retval rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval rocsparse_status_invalid_pointer \\p alpha and \\p beta are invalid,\n          \\p A, \\p B, \\p D, \\p C or \\p temp_buffer pointer is invalid.\n  \\retval rocsparse_status_not_implemented\n          \\p opA == \\ref rocsparse_operation_conjugate_transpose or\n          \\p opB == \\ref rocsparse_operation_conjugate_transpose.*/\n    pub fn rocsparse_sddmm_preprocess(\n        handle: rocsparse_handle,\n        opA: rocsparse_operation,\n        opB: rocsparse_operation,\n        alpha: *const ::core::ffi::c_void,\n        A: rocsparse_const_dnmat_descr,\n        B: rocsparse_const_dnmat_descr,\n        beta: *const ::core::ffi::c_void,\n        C: rocsparse_spmat_descr,\n        compute_type: rocsparse_datatype,\n        alg: rocsparse_sddmm_alg,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup generic_module\n  \\brief  Sampled Dense-Dense Matrix Multiplication.\n\n  \\details\n  \\ref rocsparse_sddmm multiplies the scalar \\f$\\alpha\\f$ with the dense\n  \\f$m \\times k\\f$ matrix \\f$A\\f$, the dense \\f$k \\times n\\f$ matrix \\f$B\\f$, filtered by the sparsity pattern of the \\f$m \\times n\\f$ sparse matrix \\f$C\\f$ and\n  adds the result to \\f$C\\f$ scaled by\n  \\f$\\beta\\f$. The final result is stored in the sparse \\f$m \\times n\\f$ matrix \\f$C\\f$,\n  such that\n  \\f[\n    C := \\alpha ( op(A) \\cdot op(B) ) \\cdot spy(C) + \\beta C,\n  \\f]\n  with\n  \\f[\n    op(A) = \\left\\{\n    \\begin{array}{ll}\n        A,   & \\text{if op(A) == rocsparse_operation_none} \\\\\n        A^T,   & \\text{if op(A) == rocsparse_operation_transpose} \\\\\n    \\end{array}\n    \\right.\n  \\f],\n  \\f[\n    op(B) = \\left\\{\n    \\begin{array}{ll}\n        B,   & \\text{if op(B) == rocsparse_operation_none} \\\\\n        B^T,   & \\text{if op(B) == rocsparse_operation_transpose} \\\\\n    \\end{array}\n    \\right.\n  \\f]\n   and\n  \\f[\n    spy(C)_ij = \\left\\{\n    \\begin{array}{ll}\n        1 \\text{ if i == j},   & 0 \\text{ if i != j} \\\\\n    \\end{array}\n    \\right.\n  \\f]\n\n  \\note \\p opA == \\ref rocsparse_operation_conjugate_transpose is not supported.\n  \\note \\p opB == \\ref rocsparse_operation_conjugate_transpose is not supported.\n  \\note\n  This routine supports execution in a hipGraph context.\n\n  @param[in]\n  handle       handle to the rocsparse library context queue.\n  @param[in]\n  opA      dense matrix \\f$A\\f$ operation type.\n  @param[in]\n  opB      dense matrix \\f$B\\f$ operation type.\n  @param[in]\n  alpha        scalar \\f$\\alpha\\f$.\n  @param[in]\n  A            dense matrix \\f$A\\f$ descriptor.\n  @param[in]\n  B            dense matrix \\f$B\\f$ descriptor.\n  @param[in]\n  beta         scalar \\f$\\beta\\f$.\n  @param[inout]\n  C            sparse matrix \\f$C\\f$ descriptor.\n  @param[in]\n  compute_type floating point precision for the SDDMM computation.\n  @param[in]\n  alg specification of the algorithm to use.\n  @param[in]\n  temp_buffer  temporary storage buffer allocated by the user.\n  The size must be greater or equal to the size obtained with \\ref rocsparse_sddmm_buffer_size.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_value the value of \\p trans\\_A, \\p trans\\_B, \\p compute\\_type or alg is incorrect.\n  \\retval rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval rocsparse_status_invalid_pointer \\p alpha and \\p beta are invalid,\n          \\p A, \\p B, \\p D, \\p C or \\p temp_buffer pointer is invalid.\n  \\retval rocsparse_status_not_implemented\n          \\p opA == \\ref rocsparse_operation_conjugate_transpose or\n          \\p opB == \\ref rocsparse_operation_conjugate_transpose.*/\n    pub fn rocsparse_sddmm(\n        handle: rocsparse_handle,\n        opA: rocsparse_operation,\n        opB: rocsparse_operation,\n        alpha: *const ::core::ffi::c_void,\n        A: rocsparse_const_dnmat_descr,\n        B: rocsparse_const_dnmat_descr,\n        beta: *const ::core::ffi::c_void,\n        C: rocsparse_spmat_descr,\n        compute_type: rocsparse_datatype,\n        alg: rocsparse_sddmm_alg,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup generic_module\n  \\brief Sparse matrix to dense matrix conversion\n\n  \\details\n  \\p rocsparse_sparse_to_dense\n  \\p rocsparse_sparse_to_dense performs the conversion of a sparse matrix in CSR, CSC, or COO format to\n     a dense matrix\n  \\note\n  This function writes the required allocation size (in bytes) to \\p buffer_size and\n  returns without performing the sparse to dense operation, when a nullptr is passed for\n  \\p temp_buffer.\n\n  \\note\n  This function is blocking with respect to the host.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle       handle to the rocsparse library context queue.\n  @param[in]\n  mat_A        sparse matrix descriptor.\n  @param[in]\n  mat_B        dense matrix descriptor.\n  @param[in]\n  alg          algorithm for the sparse to dense computation.\n  @param[out]\n  buffer_size  number of bytes of the temporary storage buffer. buffer_size is set when\n               \\p temp_buffer is nullptr.\n  @param[in]\n  temp_buffer  temporary storage buffer allocated by the user. When a nullptr is passed,\n               the required allocation size (in bytes) is written to \\p buffer_size and\n               function returns without performing the sparse to dense operation.\n\n  \\retval      rocsparse_status_success the operation completed successfully.\n  \\retval      rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval      rocsparse_status_invalid_pointer \\p mat_A, \\p mat_B, or \\p buffer_size\n               pointer is invalid.\n\n  \\par Example\n  \\code{.c}\n   //     1 4 0 0 0 0\n   // A = 0 2 3 0 0 0\n   //     5 0 0 7 8 0\n   //     0 0 9 0 6 0\n   rocsparse_int m   = 4;\n   rocsparse_int n   = 6;\n\n   std::vector<int> hcsr_row_ptr = {0, 2, 4, 7, 9};\n   std::vector<int> hcsr_col_ind = {0, 1, 1, 2, 0, 3, 4, 2, 4};\n   std::vector<float> hcsr_val   = {1, 4, 2, 3, 5, 7, 8, 9, 6};\n   std::vector<float> hdense(m * n, 0.0f);\n\n   rocsparse_int nnz = hcsr_row_ptr[m] - hcsr_row_ptr[0];\n\n   // Offload data to device\n   int* dcsr_row_ptr;\n   int* dcsr_col_ind;\n   float* dcsr_val;\n   float* ddense;\n   hipMalloc((void**)&dcsr_row_ptr, sizeof(int) * (m + 1));\n   hipMalloc((void**)&dcsr_col_ind, sizeof(int) * nnz);\n   hipMalloc((void**)&dcsr_val, sizeof(float) * nnz);\n   hipMalloc((void**)&ddense, sizeof(float) * m * n);\n\n   hipMemcpy(dcsr_row_ptr, hcsr_row_ptr.data(), sizeof(int) * (m + 1), hipMemcpyHostToDevice);\n   hipMemcpy(dcsr_col_ind, hcsr_col_ind.data(), sizeof(int) * nnz, hipMemcpyHostToDevice);\n   hipMemcpy(dcsr_val, hcsr_val.data(), sizeof(float) * nnz, hipMemcpyHostToDevice);\n   hipMemcpy(ddense, hdense.data(), sizeof(float) * m * n, hipMemcpyHostToDevice);\n\n   rocsparse_handle     handle;\n   rocsparse_spmat_descr matA;\n   rocsparse_dnmat_descr matB;\n\n   rocsparse_indextype row_idx_type = rocsparse_indextype_i32;\n   rocsparse_indextype col_idx_type = rocsparse_indextype_i32;\n   rocsparse_datatype  data_type = rocsparse_datatype_f32_r;\n   rocsparse_index_base idx_base = rocsparse_index_base_zero;\n\n   rocsparse_create_handle(&handle);\n\n   // Create sparse matrix A\n   rocsparse_create_csr_descr(&matA,\n                              m,\n                              n,\n                              nnz,\n                              dcsr_row_ptr,\n                              dcsr_col_ind,\n                              dcsr_val,\n                              row_idx_type,\n                              col_idx_type,\n                              idx_base,\n                              data_type);\n\n   // Create dense matrix B\n   rocsparse_create_dnmat_descr(&matB, m, n, m, ddense, data_type, rocsparse_order_column);\n\n   // Call sparse_to_dense\n   size_t buffer_size = 0;\n   rocsparse_sparse_to_dense(handle,\n                             matA,\n                             matB,\n                             rocsparse_sparse_to_dense_alg_default,\n                             &buffer_size,\n                             nullptr);\n\n   void* temp_buffer;\n   hipMalloc((void**)&temp_buffer, buffer_size);\n\n   rocsparse_sparse_to_dense(handle,\n                             matA,\n                             matB,\n                             rocsparse_sparse_to_dense_alg_default,\n                             &buffer_size,\n                             temp_buffer);\n\n   // Copy result back to host\n   hipMemcpy(hdense.data(), ddense, sizeof(float) * m * n, hipMemcpyDeviceToHost);\n\n   std::cout << \"hdense\" << std::endl;\n   for(size_t i = 0; i < hdense.size(); ++i)\n   {\n       std::cout << hdense[i] << \" \";\n   }\n   std::cout << std::endl;\n\n   // Clear rocSPARSE\n   rocsparse_destroy_spmat_descr(matA);\n   rocsparse_destroy_dnmat_descr(matB);\n   rocsparse_destroy_handle(handle);\n\n   // Clear device memory\n   hipFree(dcsr_row_ptr);\n   hipFree(dcsr_col_ind);\n   hipFree(dcsr_val);\n   hipFree(ddense);\n  \\endcode*/\n    pub fn rocsparse_sparse_to_dense(\n        handle: rocsparse_handle,\n        mat_A: rocsparse_const_spmat_descr,\n        mat_B: rocsparse_dnmat_descr,\n        alg: rocsparse_sparse_to_dense_alg,\n        buffer_size: *mut usize,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup generic_module\n  \\brief Sparse matrix sparse matrix multiplication\n\n  \\details\n  \\ref rocsparse_spgemm multiplies the scalar \\f$\\alpha\\f$ with the sparse\n  \\f$m \\times k\\f$ matrix \\f$A\\f$ and the sparse \\f$k \\times n\\f$ matrix \\f$B\\f$ and\n  adds the result to the sparse \\f$m \\times n\\f$ matrix \\f$D\\f$ that is multiplied by\n  \\f$\\beta\\f$. The final result is stored in the sparse \\f$m \\times n\\f$ matrix \\f$C\\f$,\n  such that\n  \\f[\n    C := \\alpha \\cdot op(A) \\cdot op(B) + \\beta \\cdot D,\n  \\f]\n  with\n  \\f[\n    op(A) = \\left\\{\n    \\begin{array}{ll}\n        A,   & \\text{if trans_A == rocsparse_operation_none} \\\\\n        A^T, & \\text{if trans_A == rocsparse_operation_transpose} \\\\\n        A^H, & \\text{if trans_A == rocsparse_operation_conjugate_transpose}\n    \\end{array}\n    \\right.\n  \\f]\n  and\n  \\f[\n    op(B) = \\left\\{\n    \\begin{array}{ll}\n        B,   & \\text{if trans_B == rocsparse_operation_none} \\\\\n        B^T, & \\text{if trans_B == rocsparse_operation_transpose} \\\\\n        B^H, & \\text{if trans_B == rocsparse_operation_conjugate_transpose}\n    \\end{array}\n    \\right.\n  \\f]\n\n  \\note SpGEMM requires three stages to complete. The first stage\n  \\ref rocsparse_spgemm_stage_buffer_size will return the size of the temporary storage buffer\n  that is required for subsequent calls to \\ref rocsparse_spgemm. The second stage\n  \\ref rocsparse_spgemm_stage_nnz will determine the number of non-zero elements of the\n  resulting \\f$C\\f$ matrix. If the sparsity pattern of \\f$C\\f$ is already known, this\n  stage can be skipped. In the final stage \\ref rocsparse_spgemm_stage_compute, the actual\n  computation is performed.\n  \\note If \\f$\\alpha == 0\\f$, then \\f$C = \\beta \\cdot D\\f$ will be computed.\n  \\note If \\f$\\beta == 0\\f$, then \\f$C = \\alpha \\cdot op(A) \\cdot op(B)\\f$ will be\n  computed.\n  \\note Currently only CSR and BSR formats are supported.\n  \\note If \\ref rocsparse_spgemm_stage_symbolic is selected then the symbolic computation is performed only.\n  \\note If \\ref rocsparse_spgemm_stage_numeric is selected then the numeric computation is performed only.\n  \\note For the \\ref rocsparse_spgemm_stage_symbolic and \\ref rocsparse_spgemm_stage_numeric stages, only\n  CSR matrix format is currently supported.\n  \\note \\f$\\alpha == beta == 0\\f$ is invalid.\n  \\note It is allowed to pass the same sparse matrix for \\f$C\\f$ and \\f$D\\f$, if both\n  matrices have the same sparsity pattern.\n  \\note Currently, only \\p trans_A == \\ref rocsparse_operation_none is supported.\n  \\note Currently, only \\p trans_B == \\ref rocsparse_operation_none is supported.\n  \\note This function is non blocking and executed asynchronously with respect to the\n        host. It may return before the actual computation has finished.\n  \\note Please note, that for rare matrix products with more than 4096 non-zero entries\n  per row, additional temporary storage buffer is allocated by the algorithm.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle       handle to the rocsparse library context queue.\n  @param[in]\n  trans_A      sparse matrix \\f$A\\f$ operation type.\n  @param[in]\n  trans_B      sparse matrix \\f$B\\f$ operation type.\n  @param[in]\n  alpha        scalar \\f$\\alpha\\f$.\n  @param[in]\n  A            sparse matrix \\f$A\\f$ descriptor.\n  @param[in]\n  B            sparse matrix \\f$B\\f$ descriptor.\n  @param[in]\n  beta         scalar \\f$\\beta\\f$.\n  @param[in]\n  D            sparse matrix \\f$D\\f$ descriptor.\n  @param[out]\n  C            sparse matrix \\f$C\\f$ descriptor.\n  @param[in]\n  compute_type floating point precision for the SpGEMM computation.\n  @param[in]\n  alg          SpGEMM algorithm for the SpGEMM computation.\n  @param[in]\n  stage        SpGEMM stage for the SpGEMM computation.\n  @param[out]\n  buffer_size  number of bytes of the temporary storage buffer. buffer_size is set when\n               \\p temp_buffer is nullptr.\n  @param[in]\n  temp_buffer  temporary storage buffer allocated by the user. When a nullptr is passed,\n               the required allocation size (in bytes) is written to \\p buffer_size and\n               function returns without performing the SpGEMM operation.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval rocsparse_status_invalid_pointer \\p alpha and \\p beta are invalid,\n          \\p A, \\p B, \\p D, \\p C or \\p buffer_size pointer is invalid.\n  \\retval rocsparse_status_memory_error additional buffer for long rows could not be\n          allocated.\n  \\retval rocsparse_status_not_implemented\n          \\p trans_A != \\ref rocsparse_operation_none or\n          \\p trans_B != \\ref rocsparse_operation_none.\n\n  \\par Example\n  \\code{.c}\n   // A - m x k\n   // B - k x n\n   // C - m x n\n   int m = 400;\n   int n = 400;\n   int k = 300;\n\n   std::vector<int> hcsr_row_ptr_A = {...}; // host A m x k matrix\n   std::vector<int> hcsr_col_ind_A = {...}; // host A m x k matrix\n   std::vector<float> hcsr_val_A = {...};   // host A m x k matrix\n\n   std::vector<int> hcsr_row_ptr_B = {...}; // host B k x n matrix\n   std::vector<int> hcsr_col_ind_B = {...}; // host B k x n matrix\n   std::vector<float> hcsr_val_B = {...};   // host B k x n matrix\n\n   int nnz_A = hcsr_val_A.size();\n   int nnz_B = hcsr_val_B.size();\n\n   float alpha            = 1.0f;\n   float beta             = 0.0f;\n\n   int* dcsr_row_ptr_A = nullptr;\n   int* dcsr_col_ind_A = nullptr;\n   float* dcsr_val_A = nullptr;\n\n   int* dcsr_row_ptr_B = nullptr;\n   int* dcsr_col_ind_B = nullptr;\n   float* dcsr_val_B = nullptr;\n\n   int* dcsr_row_ptr_C = nullptr;\n\n   hipMalloc((void**)&dcsr_row_ptr_A, (m + 1) * sizeof(int));\n   hipMalloc((void**)&dcsr_col_ind_A, nnz_A * sizeof(int));\n   hipMalloc((void**)&dcsr_val_A, nnz_A * sizeof(float));\n\n   hipMalloc((void**)&dcsr_row_ptr_B, (k + 1) * sizeof(int));\n   hipMalloc((void**)&dcsr_col_ind_B, nnz_B * sizeof(int));\n   hipMalloc((void**)&dcsr_val_B, nnz_B * sizeof(float));\n\n   hipMalloc((void**)&dcsr_row_ptr_C, (m + 1) * sizeof(int));\n\n   hipMemcpy(dcsr_row_ptr_A, hcsr_row_ptr_A.data(), (m + 1) * sizeof(int), hipMemcpyHostToDevice);\n   hipMemcpy(dcsr_col_ind_A, hcsr_col_ind_A.data(), nnz_A * sizeof(int), hipMemcpyHostToDevice);\n   hipMemcpy(dcsr_val_A, hcsr_val_A.data(), nnz_A * sizeof(float), hipMemcpyHostToDevice);\n\n   hipMemcpy(dcsr_row_ptr_B, hcsr_row_ptr_B.data(), (k + 1) * sizeof(int), hipMemcpyHostToDevice);\n   hipMemcpy(dcsr_col_ind_B, hcsr_col_ind_B.data(), nnz_B * sizeof(int), hipMemcpyHostToDevice);\n   hipMemcpy(dcsr_val_B, hcsr_val_B.data(), nnz_B * sizeof(float), hipMemcpyHostToDevice);\n\n   rocsparse_handle     handle;\n   rocsparse_spmat_descr matA, matB, matC, matD;\n   void*                temp_buffer    = NULL;\n   size_t               buffer_size = 0;\n\n   rocsparse_operation trans_A = rocsparse_operation_none;\n   rocsparse_operation trans_B = rocsparse_operation_none;\n   rocsparse_index_base index_base = rocsparse_index_base_zero;\n   rocsparse_indextype itype = rocsparse_indextype_i32;\n   rocsparse_indextype jtype = rocsparse_indextype_i32;\n   rocsparse_datatype  ttype = rocsparse_datatype_f32_r;\n\n   rocsparse_create_handle(&handle);\n\n   // Create sparse matrix A in CSR format\n   rocsparse_create_csr_descr(&matA, m, k, nnz_A,\n                       dcsr_row_ptr_A, dcsr_col_ind_A, dcsr_val_A,\n                       itype, jtype,\n                       index_base, ttype);\n\n   // Create sparse matrix B in CSR format\n   rocsparse_create_csr_descr(&matB, k, n, nnz_B,\n                       dcsr_row_ptr_B, dcsr_col_ind_B, dcsr_val_B,\n                       itype, jtype,\n                       index_base, ttype);\n\n   // Create sparse matrix C in CSR format\n   rocsparse_create_csr_descr(&matC, m, n, 0,\n                       dcsr_row_ptr_C, nullptr, nullptr,\n                       itype, jtype,\n                       index_base, ttype);\n\n   // Create sparse matrix D in CSR format\n   rocsparse_create_csr_descr(&matD, 0, 0, 0,\n                       nullptr, nullptr, nullptr,\n                       itype, jtype,\n                       index_base, ttype);\n\n   Determine buffer size\n   rocsparse_spgemm(handle,\n                    trans_A,\n                    trans_B,\n                    &alpha,\n                    matA,\n                    matB,\n                    &beta,\n                    matD,\n                    matC,\n                    ttype,\n                    rocsparse_spgemm_alg_default,\n                    rocsparse_spgemm_stage_buffer_size,\n                    &buffer_size,\n                    nullptr);\n\n   hipMalloc(&temp_buffer, buffer_size);\n\n   Determine number of non-zeros in C matrix\n   rocsparse_spgemm(handle,\n                    trans_A,\n                    trans_B,\n                    &alpha,\n                    matA,\n                    matB,\n                    &beta,\n                    matD,\n                    matC,\n                    ttype,\n                    rocsparse_spgemm_alg_default,\n                    rocsparse_spgemm_stage_nnz,\n                    &buffer_size,\n                    temp_buffer);\n\n   int64_t rows_C;\n   int64_t cols_C;\n   int64_t nnz_C;\n\n   Extract number of non-zeros in C matrix so we can allocate the column indices and values arrays\n   rocsparse_spmat_get_size(matC, &rows_C, &cols_C, &nnz_C);\n\n   int* dcsr_col_ind_C;\n   float* dcsr_val_C;\n   hipMalloc((void**)&dcsr_col_ind_C, sizeof(int) * nnz_C);\n   hipMalloc((void**)&dcsr_val_C, sizeof(float) * nnz_C);\n\n   // Set C matrix pointers\n   rocsparse_csr_set_pointers(matC, dcsr_row_ptr_C, dcsr_col_ind_C, dcsr_val_C);\n\n   // SpGEMM computation\n   rocsparse_spgemm(handle,\n                    trans_A,\n                    trans_B,\n                    &alpha,\n                    matA,\n                    matB,\n                    &beta,\n                    matD,\n                    matC,\n                    ttype,\n                    rocsparse_spgemm_alg_default,\n                    rocsparse_spgemm_stage_compute,\n                    &buffer_size,\n                    temp_buffer);\n\n   // Copy C matrix result back to host\n   std::vector<int> hcsr_row_ptr_C(m + 1);\n   std::vector<int> hcsr_col_ind_C(nnz_C);\n   std::vector<float>  hcsr_val_C(nnz_C);\n\n   hipMemcpy(hcsr_row_ptr_C.data(), dcsr_row_ptr_C, sizeof(int) * (m + 1), hipMemcpyDeviceToHost);\n   hipMemcpy(hcsr_col_ind_C.data(), dcsr_col_ind_C, sizeof(int) * nnz_C, hipMemcpyDeviceToHost);\n   hipMemcpy(hcsr_val_C.data(), dcsr_val_C, sizeof(float) * nnz_C, hipMemcpyDeviceToHost);\n\n   // Destroy matrix descriptors\n   rocsparse_destroy_spmat_descr(matA);\n   rocsparse_destroy_spmat_descr(matB);\n   rocsparse_destroy_spmat_descr(matC);\n   rocsparse_destroy_spmat_descr(matD);\n   rocsparse_destroy_handle(handle);\n\n   // Free device arrays\n   hipFree(temp_buffer);\n   hipFree(dcsr_row_ptr_A);\n   hipFree(dcsr_col_ind_A);\n   hipFree(dcsr_val_A);\n\n   hipFree(dcsr_row_ptr_B);\n   hipFree(dcsr_col_ind_B);\n   hipFree(dcsr_val_B);\n\n   hipFree(dcsr_row_ptr_C);\n   hipFree(dcsr_col_ind_C);\n   hipFree(dcsr_val_C);\n  \\endcode*/\n    pub fn rocsparse_spgemm(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        alpha: *const ::core::ffi::c_void,\n        A: rocsparse_const_spmat_descr,\n        B: rocsparse_const_spmat_descr,\n        beta: *const ::core::ffi::c_void,\n        D: rocsparse_const_spmat_descr,\n        C: rocsparse_spmat_descr,\n        compute_type: rocsparse_datatype,\n        alg: rocsparse_spgemm_alg,\n        stage: rocsparse_spgemm_stage,\n        buffer_size: *mut usize,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup generic_module\n  \\brief Sparse iterative triangular solve\n\n  \\details\n  \\p rocsparse_spitsv solves, using the Jacobi iterative method, a sparse triangular linear system of a sparse\n  \\f$m \\times m\\f$ matrix, defined in CSR format, a dense solution vector\n  \\f$y\\f$ and the right-hand side \\f$x\\f$ that is multiplied by \\f$\\alpha\\f$, such that\n  \\f[\n    op(A) \\cdot y = \\alpha \\cdot x,\n  \\f]\n  with\n  \\f[\n    op(A) = \\left\\{\n    \\begin{array}{ll}\n        A,   & \\text{if trans == rocsparse_operation_none} \\\\\n        A^T, & \\text{if trans == rocsparse_operation_transpose} \\\\\n        A^H, & \\text{if trans == rocsparse_operation_conjugate_transpose}\n    \\end{array}\n    \\right.\n  \\f]\n\n  \\note SpITSV requires three stages to complete. The first stage\n  \\ref rocsparse_spitsv_stage_buffer_size will return the size of the temporary storage buffer\n  that is required for subsequent calls. The second stage\n  \\ref rocsparse_spitsv_stage_preprocess will preprocess data that would be saved in the temporary storage buffer.\n  In the final stage \\ref rocsparse_spitsv_stage_compute, the actual computation is performed.\n\n  \\note\n  Currently, only non-mixed numerical precision is supported.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle       handle to the rocsparse library context queue.\n  @param[inout]\n  host_nmaxiter     maximum number of iteration on input and maximum number of iteration on output.\n  @param[in]\n  host_tol          if the pointer is null then loop will execute \\p nmaxiter[0] iterations. The precision is float for f32 based calculation (including the complex case) and double for f64 based calculation (including the complex case).\n  @param[out]\n  host_history      Optional array to record the history. The precision is float for f32 based calculation (including the complex case) and double for f64 based calculation (including the complex case).\n  @param[in]\n  trans        matrix operation type.\n  @param[in]\n  alpha        scalar \\f$\\alpha\\f$.\n  @param[in]\n  mat          matrix descriptor.\n  @param[in]\n  x            vector descriptor.\n  @param[inout]\n  y            vector descriptor.\n  @param[in]\n  compute_type floating point precision for the SpITSV computation.\n  @param[in]\n  alg          SpITSV algorithm for the SpITSV computation.\n  @param[in]\n  stage        SpITSV stage for the SpITSV computation.\n  @param[out]\n  buffer_size  number of bytes of the temporary storage buffer.\n  @param[in]\n  temp_buffer  temporary storage buffer allocated by the user. When a nullptr is passed,\n               the required allocation size (in bytes) is written to \\p buffer_size and\n               function returns without performing the SpITSV operation.\n\n  \\retval      rocsparse_status_success the operation completed successfully.\n  \\retval      rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval      rocsparse_status_invalid_pointer \\p alpha, \\p mat, \\p x, \\p y, \\p descr or\n               \\p buffer_size pointer is invalid.\n  \\retval      rocsparse_status_not_implemented \\p trans, \\p compute_type, \\p stage or \\p alg is\n               currently not supported.*/\n    pub fn rocsparse_spitsv(\n        handle: rocsparse_handle,\n        host_nmaxiter: *mut rocsparse_int,\n        host_tol: *const ::core::ffi::c_void,\n        host_history: *mut ::core::ffi::c_void,\n        trans: rocsparse_operation,\n        alpha: *const ::core::ffi::c_void,\n        mat: rocsparse_spmat_descr,\n        x: rocsparse_dnvec_descr,\n        y: rocsparse_dnvec_descr,\n        compute_type: rocsparse_datatype,\n        alg: rocsparse_spitsv_alg,\n        stage: rocsparse_spitsv_stage,\n        buffer_size: *mut usize,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup generic_module\\n  \\\\brief Sparse matrix dense matrix multiplication, extension routine.\\n\\n  \\\\details\\n  \\\\p rocsparse_spmm multiplies the scalar \\\\f$\\\\alpha\\\\f$ with a sparse \\\\f$m \\\\times k\\\\f$\\n  matrix \\\\f$A\\\\f$, defined in CSR or COO or Blocked ELL storage format, and the dense \\\\f$k \\\\times n\\\\f$\\n  matrix \\\\f$B\\\\f$ and adds the result to the dense \\\\f$m \\\\times n\\\\f$ matrix \\\\f$C\\\\f$ that\\n  is multiplied by the scalar \\\\f$\\\\beta\\\\f$, such that\\n  \\\\f[\\n    C := \\\\alpha \\\\cdot op(A) \\\\cdot op(B) + \\\\beta \\\\cdot C,\\n  \\\\f]\\n  with\\n  \\\\f[\\n    op(A) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        A,   & \\\\text{if trans_A == rocsparse_operation_none} \\\\\\\\\\n        A^T, & \\\\text{if trans_A == rocsparse_operation_transpose} \\\\\\\\\\n        A^H, & \\\\text{if trans_A == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n  and\\n  \\\\f[\\n    op(B) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        B,   & \\\\text{if trans_B == rocsparse_operation_none} \\\\\\\\\\n        B^T, & \\\\text{if trans_B == rocsparse_operation_transpose} \\\\\\\\\\n        B^H, & \\\\text{if trans_B == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n\\n  \\\\note\\n  Only the \\\\ref rocsparse_spmm_stage_buffer_size stage and the \\\\ref rocsparse_spmm_stage_compute stage are non blocking\\n  and executed asynchronously with respect to the host. They may return before the actual computation has finished.\\n  The \\\\ref rocsparse_spmm_stage_preprocess stage is blocking with respect to the host.\\n\\n  \\\\note\\n  Currently, only \\\\p trans_A == \\\\ref rocsparse_operation_none is supported for COO and Blocked ELL formats.\\n\\n  \\\\note\\n  Only the \\\\ref rocsparse_spmm_stage_buffer_size stage and the \\\\ref rocsparse_spmm_stage_compute stage\\n  support execution in a hipGraph context. The \\\\ref rocsparse_spmm_stage_preprocess stage does not support hipGraph.\\n\\n  \\\\note\\n  Currently, only CSR, COO and Blocked ELL sparse formats are supported.\\n\\n  \\\\note\\n  Different algorithms are available which can provide better performance for different matrices.\\n  Currently, the available algorithms are rocsparse_spmm_alg_csr, rocsparse_spmm_alg_csr_row_split\\n  or rocsparse_spmm_alg_csr_merge for CSR matrices, rocsparse_spmm_alg_bell for Blocked ELL matrices and\\n  rocsparse_spmm_alg_coo_segmented or rocsparse_spmm_alg_coo_atomic for COO matrices. Additionally,\\n  one can specify the algorithm to be rocsparse_spmm_alg_default. In the case of CSR matrices this will\\n  set the algorithm to be rocsparse_spmm_alg_csr, in the case of Blocked ELL matrices this will set the\\n  algorithm to be rocsparse_spmm_alg_bell and for COO matrices it will set the algorithm to be\\n  rocsparse_spmm_alg_coo_atomic. When A is transposed, rocsparse_spmm will revert to using\\n  rocsparse_spmm_alg_csr for CSR format and rocsparse_spmm_alg_coo_atomic for COO format regardless\\n  of algorithm selected.\\n\\n  \\\\note\\n  This function writes the required allocation size (in bytes) to \\\\p buffer_size and\\n  returns without performing the SpMM operation, when a nullptr is passed for\\n  \\\\p temp_buffer.\\n\\n  \\\\note SpMM requires three stages to complete. The first stage\\n  \\\\ref rocsparse_spmm_stage_buffer_size will return the size of the temporary storage buffer\\n  that is required for subsequent calls to \\\\ref rocsparse_spmm. The second stage\\n  \\\\ref rocsparse_spmm_stage_preprocess will preprocess data that would be saved in the temporary storage buffer.\\n  In the final stage \\\\ref rocsparse_spmm_stage_compute, the actual computation is performed.\\n\\n  @param[in]\\n  handle       handle to the rocsparse library context queue.\\n  @param[in]\\n  trans_A      matrix operation type.\\n  @param[in]\\n  trans_B      matrix operation type.\\n  @param[in]\\n  alpha        scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  mat_A        matrix descriptor.\\n  @param[in]\\n  mat_B        matrix descriptor.\\n  @param[in]\\n  beta         scalar \\\\f$\\\\beta\\\\f$.\\n  @param[in]\\n  mat_C        matrix descriptor.\\n  @param[in]\\n  compute_type floating point precision for the SpMM computation.\\n  @param[in]\\n  alg          SpMM algorithm for the SpMM computation.\\n  @param[in]\\n  stage        SpMM stage for the SpMM computation.\\n  @param[out]\\n  buffer_size  number of bytes of the temporary storage buffer. buffer_size is set when\\n               \\\\p temp_buffer is nullptr.\\n  @param[in]\\n  temp_buffer  temporary storage buffer allocated by the user. When a nullptr is passed,\\n               the required allocation size (in bytes) is written to \\\\p buffer_size and\\n               function returns without performing the SpMM operation.\\n\\n  \\\\retval      rocsparse_status_success the operation completed successfully.\\n  \\\\retval      rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval      rocsparse_status_invalid_pointer \\\\p alpha, \\\\p mat_A, \\\\p mat_B, \\\\p mat_C, \\\\p beta, or\\n               \\\\p buffer_size pointer is invalid.\\n  \\\\retval      rocsparse_status_not_implemented \\\\p trans_A, \\\\p trans_B, \\\\p compute_type or \\\\p alg is\\n               currently not supported.\\n  \\\\par Example\\n  This example performs sparse matrix-dense matrix multiplication, C = alpha * A * B + beta * C\\n  \\\\code{.c}\\n      //     1 4 0 0 0 0\\n      // A = 0 2 3 0 0 0\\n      //     5 0 0 7 8 0\\n      //     0 0 9 0 6 0\\n\\n      //     1 4 2\\n      //     1 2 3\\n      // B = 5 4 0\\n      //     3 1 9\\n      //     1 2 2\\n      //     0 3 0\\n\\n      //     1 1 5\\n      // C = 1 2 1\\n      //     1 3 1\\n      //     6 2 4\\n\\n      rocsparse_int m   = 4;\\n      rocsparse_int k   = 6;\\n      rocsparse_int n   = 3;\\n\\n      csr_row_ptr[m + 1] = {0, 1, 3};                                              // device memory\\n      csr_col_ind[nnz]   = {0, 0, 1};                                              // device memory\\n      csr_val[nnz]       = {1, 0, 4, 2, 0, 3, 5, 0, 0, 0, 0, 9, 7, 0, 8, 6, 0, 0}; // device memory\\n\\n      B[k * n]       = {1, 1, 5, 3, 1, 0, 4, 2, 4, 1, 2, 3, 2, 3, 0, 9, 2, 0};     // device memory\\n      C[m * n]       = {1, 1, 1, 6, 1, 2, 3, 2, 5, 1, 1, 4};                       // device memory\\n\\n      rocsparse_int nnz = csr_row_ptr[m] - csr_row_ptr[0];\\n\\n      float alpha = 1.0f;\\n      float beta  = 0.0f;\\n\\n      // Create CSR arrays on device\\n      rocsparse_int* csr_row_ptr;\\n      rocsparse_int* csr_col_ind;\\n      float* csr_val;\\n      float* B;\\n      float* C;\\n      hipMalloc((void**)&csr_row_ptr, sizeof(rocsparse_int) * (m + 1));\\n      hipMalloc((void**)&csr_col_ind, sizeof(rocsparse_int) * nnz);\\n      hipMalloc((void**)&csr_val, sizeof(float) * nnz);\\n      hipMalloc((void**)&B, sizeof(float) * k * n);\\n      hipMalloc((void**)&C, sizeof(float) * m * n);\\n\\n      // Create rocsparse handle\\n      rocsparse_local_handle handle;\\n\\n      // Types\\n      rocsparse_indextype itype = rocsparse_indextype_i32;\\n      rocsparse_indextype jtype = rocsparse_indextype_i32;\\n      rocsparse_datatype  ttype = rocsparse_datatype_f32_r;\\n\\n      // Create descriptors\\n      rocsparse_spmat_descr mat_A;\\n      rocsparse_dnmat_descr mat_B;\\n      rocsparse_dnmat_descr mat_C;\\n\\n      rocsparse_create_csr_descr(&mat_A, m, k, nnz, csr_row_ptr, csr_col_ind, csr_val, itype, jtype, rocsparse_index_base_zero, ttype);\\n      rocsparse_create_dnmat_descr(&mat_B, k, n, k, B, ttype, rocsparse_order_column);\\n      rocsparse_create_dnmat_descr(&mat_C, m, n, m, C, ttype, rocsparse_order_column);\\n\\n      // Query SpMM buffer\\n      size_t buffer_size;\\n      rocsparse_spmm(handle,\\n                     rocsparse_operation_none,\\n                     rocsparse_operation_none,\\n                     &alpha,\\n                     mat_A,\\n                     mat_B,\\n                     &beta,\\n                     mat_C,\\n                     ttype,\\n                     rocsparse_spmm_alg_default,\\n                     rocsparse_spmm_stage_buffer_size,\\n                     &buffer_size,\\n                     nullptr));\\n\\n      // Allocate buffer\\n      void* buffer;\\n      hipMalloc(&buffer, buffer_size);\\n\\n      rocsparse_spmm(handle,\\n                     rocsparse_operation_none,\\n                     rocsparse_operation_none,\\n                     &alpha,\\n                     mat_A,\\n                     mat_B,\\n                     &beta,\\n                     mat_C,\\n                     ttype,\\n                     rocsparse_spmm_alg_default,\\n                     rocsparse_spmm_stage_preprocess,\\n                     &buffer_size,\\n                     buffer));\\n\\n      // Pointer mode host\\n      rocsparse_spmm(handle,\\n                     rocsparse_operation_none,\\n                     rocsparse_operation_none,\\n                     &alpha,\\n                     mat_A,\\n                     mat_B,\\n                     &beta,\\n                     mat_C,\\n                     ttype,\\n                     rocsparse_spmm_alg_default,\\n                     rocsparse_spmm_stage_compute,\\n                     &buffer_size,\\n                     buffer));\\n\\n      // Clear up on device\\n      hipFree(csr_row_ptr);\\n      hipFree(csr_col_ind);\\n      hipFree(csr_val);\\n      hipFree(B);\\n      hipFree(C);\\n      hipFree(temp_buffer);\\n\\n      rocsparse_destroy_spmat_descr(mat_A);\\n      rocsparse_destroy_dnmat_descr(mat_B);\\n      rocsparse_destroy_dnmat_descr(mat_C);\\n  \\\\endcode\\n\\n  \\\\par Example\\n  SpMM also supports batched computation for CSR and COO matrices. There are three supported batch modes:\\n      C_i = A * B_i\\n      C_i = A_i * B\\n      C_i = A_i * B_i\\n  The batch mode is determined by the batch count and stride passed for each matrix. For example\\n  to use the first batch mode (C_i = A * B_i) with 100 batches for non-transposed A, B, and C, one passes:\\n      batch_count_A = 1\\n      batch_count_B = 100\\n      batch_count_C = 100\\n      offsets_batch_stride_A        = 0\\n      columns_values_batch_stride_A = 0\\n      batch_stride_B                = k * n\\n      batch_stride_C                = m * n\\n  To use the second batch mode (C_i = A_i * B) one could use:\\n      batch_count_A = 100\\n      batch_count_B = 1\\n      batch_count_C = 100\\n      offsets_batch_stride_A        = m + 1\\n      columns_values_batch_stride_A = nnz\\n      batch_stride_B                = 0\\n      batch_stride_C                = m * n\\n  And to use the third batch mode (C_i = A_i * B_i) one could use:\\n      batch_count_A = 100\\n      batch_count_B = 100\\n      batch_count_C = 100\\n      offsets_batch_stride_A        = m + 1\\n      columns_values_batch_stride_A = nnz\\n      batch_stride_B                = k * n\\n      batch_stride_C                = m * n\\n  An example of the first batch mode (C_i = A * B_i) is provided below.\\n  \\\\code{.c}\\n      //     1 4 0 0 0 0\\n      // A = 0 2 3 0 0 0\\n      //     5 0 0 7 8 0\\n      //     0 0 9 0 6 0\\n\\n      rocsparse_int m   = 4;\\n      rocsparse_int k   = 6;\\n      rocsparse_int n   = 3;\\n\\n      csr_row_ptr[m + 1] = {0, 1, 3};                                              // device memory\\n      csr_col_ind[nnz]   = {0, 0, 1};                                              // device memory\\n      csr_val[nnz]       = {1, 0, 4, 2, 0, 3, 5, 0, 0, 0, 0, 9, 7, 0, 8, 6, 0, 0}; // device memory\\n\\n      B[batch_count_B * k * n]       = {...};     // device memory\\n      C[batch_count_C * m * n]       = {...};     // device memory\\n\\n      rocsparse_int nnz = csr_row_ptr[m] - csr_row_ptr[0];\\n\\n      rocsparse_int batch_count_A = 1;\\n      rocsparse_int batch_count_B = 100;\\n      rocsparse_int batch_count_C = 100;\\n\\n      rocsparse_int offsets_batch_stride_A        = 0;\\n      rocsparse_int columns_values_batch_stride_A = 0;\\n      rocsparse_int batch_stride_B                = k * n;\\n      rocsparse_int batch_stride_C                = m * n;\\n\\n      float alpha = 1.0f;\\n      float beta  = 0.0f;\\n\\n      // Create CSR arrays on device\\n      rocsparse_int* csr_row_ptr;\\n      rocsparse_int* csr_col_ind;\\n      float* csr_val;\\n      float* B;\\n      float* C;\\n      hipMalloc((void**)&csr_row_ptr, sizeof(rocsparse_int) * (m + 1));\\n      hipMalloc((void**)&csr_col_ind, sizeof(rocsparse_int) * nnz);\\n      hipMalloc((void**)&csr_val, sizeof(float) * nnz);\\n      hipMalloc((void**)&B, sizeof(float) * batch_count_B * k * n);\\n      hipMalloc((void**)&C, sizeof(float) * batch_count_C * m * n);\\n\\n      // Create rocsparse handle\\n      rocsparse_local_handle handle;\\n\\n      // Types\\n      rocsparse_indextype itype = rocsparse_indextype_i32;\\n      rocsparse_indextype jtype = rocsparse_indextype_i32;\\n      rocsparse_datatype  ttype = rocsparse_datatype_f32_r;\\n\\n      // Create descriptors\\n      rocsparse_spmat_descr mat_A;\\n      rocsparse_dnmat_descr mat_B;\\n      rocsparse_dnmat_descr mat_C;\\n\\n      rocsparse_create_csr_descr(&mat_A, m, k, nnz, csr_row_ptr, csr_col_ind, csr_val, itype, jtype, rocsparse_index_base_zero, ttype);\\n      rocsparse_create_dnmat_descr(&mat_B, k, n, k, B, ttype, rocsparse_order_column);\\n      rocsparse_create_dnmat_descr(&mat_C, m, n, m, C, ttype, rocsparse_order_column);\\n\\n      rocsparse_csr_set_strided_batch(mat_A, batch_count_A, offsets_batch_stride_A, columns_values_batch_stride_A);\\n      rocsparse_dnmat_set_strided_batch(B, batch_count_B, batch_stride_B);\\n      rocsparse_dnmat_set_strided_batch(C, batch_count_C, batch_stride_C);\\n\\n      // Query SpMM buffer\\n      size_t buffer_size;\\n      rocsparse_spmm(handle,\\n                     rocsparse_operation_none,\\n                     rocsparse_operation_none,\\n                     &alpha,\\n                     mat_A,\\n                     mat_B,\\n                     &beta,\\n                     mat_C,\\n                     ttype,\\n                     rocsparse_spmm_alg_default,\\n                     rocsparse_spmm_stage_buffer_size,\\n                     &buffer_size,\\n                     nullptr));\\n\\n      // Allocate buffer\\n      void* buffer;\\n      hipMalloc(&buffer, buffer_size);\\n\\n      rocsparse_spmm(handle,\\n                     rocsparse_operation_none,\\n                     rocsparse_operation_none,\\n                     &alpha,\\n                     mat_A,\\n                     mat_B,\\n                     &beta,\\n                     mat_C,\\n                     ttype,\\n                     rocsparse_spmm_alg_default,\\n                     rocsparse_spmm_stage_preprocess,\\n                     &buffer_size,\\n                     buffer));\\n\\n      // Pointer mode host\\n      rocsparse_spmm(handle,\\n                     rocsparse_operation_none,\\n                     rocsparse_operation_none,\\n                     &alpha,\\n                     mat_A,\\n                     mat_B,\\n                     &beta,\\n                     mat_C,\\n                     ttype,\\n                     rocsparse_spmm_alg_default,\\n                     rocsparse_spmm_stage_compute,\\n                     &buffer_size,\\n                     buffer));\\n\\n      // Clear up on device\\n      hipFree(csr_row_ptr);\\n      hipFree(csr_col_ind);\\n      hipFree(csr_val);\\n      hipFree(B);\\n      hipFree(C);\\n      hipFree(temp_buffer);\\n\\n      rocsparse_destroy_spmat_descr(mat_A);\\n      rocsparse_destroy_dnmat_descr(mat_B);\\n      rocsparse_destroy_dnmat_descr(mat_C);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_spmm(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        alpha: *const ::core::ffi::c_void,\n        mat_A: rocsparse_const_spmat_descr,\n        mat_B: rocsparse_const_dnmat_descr,\n        beta: *const ::core::ffi::c_void,\n        mat_C: rocsparse_dnmat_descr,\n        compute_type: rocsparse_datatype,\n        alg: rocsparse_spmm_alg,\n        stage: rocsparse_spmm_stage,\n        buffer_size: *mut usize,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup generic_module\n  \\brief Sparse matrix vector multiplication\n\n  \\details\n  \\ref rocsparse_spmv multiplies the scalar \\f$\\alpha\\f$ with a sparse \\f$m \\times n\\f$\n  matrix and the dense vector \\f$x\\f$ and adds the result to the dense vector \\f$y\\f$\n  that is multiplied by the scalar \\f$\\beta\\f$, such that\n  \\f[\n    y := \\alpha \\cdot op(A) \\cdot x + \\beta \\cdot y,\n  \\f]\n  with\n  \\f[\n    op(A) = \\left\\{\n    \\begin{array}{ll}\n        A,   & \\text{if trans == rocsparse_operation_none} \\\\\n        A^T, & \\text{if trans == rocsparse_operation_transpose} \\\\\n        A^H, & \\text{if trans == rocsparse_operation_conjugate_transpose}\n    \\end{array}\n    \\right.\n  \\f]\n\n  \\details\n  \\ref rocsparse_spmv supports multiple combinations of data types and compute types. The tables below indicate the currently\n  supported different data types that can be used for for the sparse matrix A and the dense vectors X and Y and the compute\n  type for \\f$\\alpha\\f$ and \\f$\\beta\\f$. The advantage of using different data types is to save on memory bandwidth and storage\n  when a user application allows while performing the actual computation in a higher precision.\n\n  \\par Uniform Precisions:\n  <table>\n  <caption id=\"spmv_uniform\">Uniform Precisions</caption>\n  <tr><th>A / X / Y / compute_type\n  <tr><td>rocsparse_datatype_f32_r\n  <tr><td>rocsparse_datatype_f64_r\n  <tr><td>rocsparse_datatype_f32_c\n  <tr><td>rocsparse_datatype_f64_c\n  </table>\n\n  \\par Mixed precisions:\n  <table>\n  <caption id=\"spmv_mixed\">Mixed Precisions</caption>\n  <tr><th>A / X                   <th>Y                        <th>compute_type\n  <tr><td>rocsparse_datatype_i8_r <td>rocsparse_datatype_i32_r <td>rocsparse_datatype_i32_r\n  <tr><td>rocsparse_datatype_i8_r <td>rocsparse_datatype_f32_r <td>rocsparse_datatype_f32_r\n  <tr><td>rocsparse_datatype_i8_r <td>rocsparse_datatype_i32_r <td>rocsparse_datatype_i32_r\n  </table>\n\n  \\par Mixed-regular real precisions\n  <table>\n  <caption id=\"spmv_mixed_regular_real\">Mixed-regular real precisions</caption>\n  <tr><th>A                        <th>X / Y / compute_type\n  <tr><td>rocsparse_datatype_f32_r <td>rocsparse_datatype_f64_r\n  <tr><td>rocsparse_datatype_f32_c <td>rocsparse_datatype_f64_c\n  </table>\n\n  \\par Mixed-regular Complex precisions\n  <table>\n  <caption id=\"spmv_mixed_regular_complex\">Mixed-regular Complex precisions</caption>\n  <tr><th>A                        <th>X / Y / compute_type\n  <tr><td>rocsparse_datatype_f32_r <td>rocsparse_datatype_f32_c\n  <tr><td>rocsparse_datatype_f64_r <td>rocsparse_datatype_f64_c\n  </table>\n\n  \\note\n  This function writes the required allocation size (in bytes) to \\p buffer_size and\n  returns without performing the SpMV operation, when a nullptr is passed for\n  \\p temp_buffer.\n\n  \\note\n  Only the \\ref rocsparse_spmv_stage_buffer_size stage and the \\ref rocsparse_spmv_stage_compute stage are non blocking\n  and executed asynchronously with respect to the host. They may return before the actual computation has finished.\n  The \\ref rocsparse_spmv_stage_preprocess stage is blocking with respect to the host.\n\n  \\note\n  Only the \\ref rocsparse_spmv_stage_buffer_size stage and the \\ref rocsparse_spmv_stage_compute stage\n  support execution in a hipGraph context. The \\ref rocsparse_spmv_stage_preprocess stage does not support hipGraph.\n\n  \\note\n  The sparse matrix formats currently supported are: rocsparse_format_bsr, rocsparse_format_coo,\n  rocsparse_format_coo_aos, rocsparse_format_csr, rocsparse_format_csc and rocsparse_format_ell.\n\n  @param[in]\n  handle       handle to the rocsparse library context queue.\n  @param[in]\n  trans        matrix operation type.\n  @param[in]\n  alpha        scalar \\f$\\alpha\\f$.\n  @param[in]\n  mat          matrix descriptor.\n  @param[in]\n  x            vector descriptor.\n  @param[in]\n  beta         scalar \\f$\\beta\\f$.\n  @param[inout]\n  y            vector descriptor.\n  @param[in]\n  compute_type floating point precision for the SpMV computation.\n  @param[in]\n  alg          SpMV algorithm for the SpMV computation.\n  @param[in]\n  stage        SpMV stage for the SpMV computation.\n  @param[out]\n  buffer_size  number of bytes of the temporary storage buffer. buffer_size is set when\n               \\p temp_buffer is nullptr.\n  @param[in]\n  temp_buffer  temporary storage buffer allocated by the user. When a nullptr is passed,\n               the required allocation size (in bytes) is written to \\p buffer_size and\n               function returns without performing the SpMV operation.\n\n  \\retval      rocsparse_status_success the operation completed successfully.\n  \\retval      rocsparse_status_invalid_handle the library context \\p handle was not initialized.\n  \\retval      rocsparse_status_invalid_pointer \\p alpha, \\p mat, \\p x, \\p beta, \\p y or\n               \\p buffer_size pointer is invalid.\n  \\retval      rocsparse_status_invalid_value the value of \\p trans, \\p compute_type, \\p alg, or \\p stage is incorrect.\n  \\retval      rocsparse_status_not_implemented \\p compute_type or \\p alg is\n               currently not supported.\n\n  \\par Example\n  \\code{.c}\n   //     1 4 0 0 0 0\n   // A = 0 2 3 0 0 0\n   //     5 0 0 7 8 0\n   //     0 0 9 0 6 0\n   rocsparse_int m   = 4;\n   rocsparse_int n   = 6;\n\n   std::vector<int> hcsr_row_ptr = {0, 2, 4, 7, 9};\n   std::vector<int> hcsr_col_ind = {0, 1, 1, 2, 0, 3, 4, 2, 4};\n   std::vector<float> hcsr_val   = {1, 4, 2, 3, 5, 7, 8, 9, 6};\n   std::vector<float> hx(n, 1.0f);\n   std::vector<float> hy(m, 0.0f);\n\n   // Scalar alpha\n   float alpha = 3.7f;\n\n   // Scalar beta\n   float beta = 0.0f;\n\n   rocsparse_int nnz = hcsr_row_ptr[m] - hcsr_row_ptr[0];\n\n   // Offload data to device\n   int* dcsr_row_ptr;\n   int* dcsr_col_ind;\n   float* dcsr_val;\n   float* dx;\n   float* dy;\n   hipMalloc((void**)&dcsr_row_ptr, sizeof(int) * (m + 1));\n   hipMalloc((void**)&dcsr_col_ind, sizeof(int) * nnz);\n   hipMalloc((void**)&dcsr_val, sizeof(float) * nnz);\n   hipMalloc((void**)&dx, sizeof(float) * n);\n   hipMalloc((void**)&dy, sizeof(float) * m);\n\n   hipMemcpy(dcsr_row_ptr, hcsr_row_ptr.data(), sizeof(int) * (m + 1), hipMemcpyHostToDevice);\n   hipMemcpy(dcsr_col_ind, hcsr_col_ind.data(), sizeof(int) * nnz, hipMemcpyHostToDevice);\n   hipMemcpy(dcsr_val, hcsr_val.data(), sizeof(float) * nnz, hipMemcpyHostToDevice);\n   hipMemcpy(dx, hx.data(), sizeof(float) * n, hipMemcpyHostToDevice);\n\n   rocsparse_handle     handle;\n   rocsparse_spmat_descr matA;\n   rocsparse_dnvec_descr vecX;\n   rocsparse_dnvec_descr vecY;\n\n   rocsparse_indextype row_idx_type = rocsparse_indextype_i32;\n   rocsparse_indextype col_idx_type = rocsparse_indextype_i32;\n   rocsparse_datatype  data_type = rocsparse_datatype_f32_r;\n   rocsparse_datatype  compute_type = rocsparse_datatype_f32_r;\n   rocsparse_index_base idx_base = rocsparse_index_base_zero;\n   rocsparse_operation trans = rocsparse_operation_none;\n\n   rocsparse_create_handle(&handle);\n\n   // Create sparse matrix A\n   rocsparse_create_csr_descr(&matA,\n                              m,\n                              n,\n                              nnz,\n                              dcsr_row_ptr,\n                              dcsr_col_ind,\n                              dcsr_val,\n                              row_idx_type,\n                              col_idx_type,\n                              idx_base,\n                              data_type);\n\n   // Create dense vector X\n   rocsparse_create_dnvec_descr(&vecX,\n                                n,\n                                dx,\n                                data_type);\n\n   // Create dense vector Y\n   rocsparse_create_dnvec_descr(&vecY,\n                                m,\n                                dy,\n                                data_type);\n\n   // Call spmv to get buffer size\n   size_t buffer_size;\n   rocsparse_spmv(handle,\n                  trans,\n                  &alpha,\n                  matA,\n                  vecX,\n                  &beta,\n                  vecY,\n                  compute_type,\n                  rocsparse_spmv_alg_csr_adaptive,\n                  rocsparse_spmv_stage_buffer_size,\n                  &buffer_size,\n                  nullptr);\n\n   void* temp_buffer;\n   hipMalloc((void**)&temp_buffer, buffer_size);\n\n   // Call spmv to perform analysis\n   rocsparse_spmv(handle,\n                  trans,\n                  &alpha,\n                  matA,\n                  vecX,\n                  &beta,\n                  vecY,\n                  compute_type,\n                  rocsparse_spmv_alg_csr_adaptive,\n                  rocsparse_spmv_stage_preprocess,\n                  &buffer_size,\n                  temp_buffer);\n\n   // Call spmv to perform computation\n   rocsparse_spmv(handle,\n                  trans,\n                  &alpha,\n                  matA,\n                  vecX,\n                  &beta,\n                  vecY,\n                  compute_type,\n                  rocsparse_spmv_alg_csr_adaptive,\n                  rocsparse_spmv_stage_compute,\n                  &buffer_size,\n                  temp_buffer);\n\n   // Copy result back to host\n   hipMemcpy(hy.data(), dy, sizeof(float) * m, hipMemcpyDeviceToHost);\n\n   std::cout << \"hy\" << std::endl;\n   for(size_t i = 0; i < hy.size(); ++i)\n   {\n       std::cout << hy[i] << \" \";\n   }\n   std::cout << std::endl;\n\n   // Clear rocSPARSE\n   rocsparse_destroy_spmat_descr(matA);\n   rocsparse_destroy_dnvec_descr(vecX);\n   rocsparse_destroy_dnvec_descr(vecY);\n   rocsparse_destroy_handle(handle);\n\n   // Clear device memory\n   hipFree(dcsr_row_ptr);\n   hipFree(dcsr_col_ind);\n   hipFree(dcsr_val);\n   hipFree(dx);\n   hipFree(dy);\n   hipFree(temp_buffer);\n  \\endcode*/\n    pub fn rocsparse_spmv(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        alpha: *const ::core::ffi::c_void,\n        mat: rocsparse_const_spmat_descr,\n        x: rocsparse_const_dnvec_descr,\n        beta: *const ::core::ffi::c_void,\n        y: rocsparse_dnvec_descr,\n        compute_type: rocsparse_datatype,\n        alg: rocsparse_spmv_alg,\n        stage: rocsparse_spmv_stage,\n        buffer_size: *mut usize,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup generic_module\n  \\brief Sparse matrix vector multiplication\n\n  \\details\n  \\ref rocsparse_spmv_ex multiplies the scalar \\f$\\alpha\\f$ with a sparse \\f$m \\times n\\f$\n  matrix and the dense vector \\f$x\\f$ and adds the result to the dense vector \\f$y\\f$\n  that is multiplied by the scalar \\f$\\beta\\f$, such that\n  \\f[\n    y := \\alpha \\cdot op(A) \\cdot x + \\beta \\cdot y,\n  \\f]\n  with\n  \\f[\n    op(A) = \\left\\{\n    \\begin{array}{ll}\n        A,   & \\text{if trans == rocsparse_operation_none} \\\\\n        A^T, & \\text{if trans == rocsparse_operation_transpose} \\\\\n        A^H, & \\text{if trans == rocsparse_operation_conjugate_transpose}\n    \\end{array}\n    \\right.\n  \\f]\n\n  \\details\n  \\ref rocsparse_spmv_ex supports multiple combinations of data types and compute types. The tables below indicate the currently\n  supported different data types that can be used for for the sparse matrix A and the dense vectors X and Y and the compute\n  type for \\f$\\alpha\\f$ and \\f$\\beta\\f$. The advantage of using different data types is to save on memory bandwidth and storage\n  when a user application allows while performing the actual computation in a higher precision.\n\n  \\par Uniform Precisions:\n  <table>\n  <caption id=\"spmv_uniform_ex\">Uniform Precisions</caption>\n  <tr><th>A / X / Y / compute_type\n  <tr><td>rocsparse_datatype_f32_r\n  <tr><td>rocsparse_datatype_f64_r\n  <tr><td>rocsparse_datatype_f32_c\n  <tr><td>rocsparse_datatype_f64_c\n  </table>\n\n  \\par Mixed precisions:\n  <table>\n  <caption id=\"spmv_mixed_ex\">Mixed Precisions</caption>\n  <tr><th>A / X                   <th>Y                        <th>compute_type\n  <tr><td>rocsparse_datatype_i8_r <td>rocsparse_datatype_i32_r <td>rocsparse_datatype_i32_r\n  <tr><td>rocsparse_datatype_i8_r <td>rocsparse_datatype_f32_r <td>rocsparse_datatype_f32_r\n  <tr><td>rocsparse_datatype_i8_r <td>rocsparse_datatype_i32_r <td>rocsparse_datatype_i32_r\n  </table>\n\n  \\par Mixed-regular real precisions\n  <table>\n  <caption id=\"spmv_mixed_regular_real_ex\">Mixed-regular real precisions</caption>\n  <tr><th>A                        <th>X / Y / compute_type\n  <tr><td>rocsparse_datatype_f32_r <td>rocsparse_datatype_f64_r\n  <tr><td>rocsparse_datatype_f32_c <td>rocsparse_datatype_f64_c\n  </table>\n\n  \\par Mixed-regular Complex precisions\n  <table>\n  <caption id=\"spmv_mixed_regular_complex_ex\">Mixed-regular Complex precisions</caption>\n  <tr><th>A                        <th>X / Y / compute_type\n  <tr><td>rocsparse_datatype_f32_r <td>rocsparse_datatype_f32_c\n  <tr><td>rocsparse_datatype_f64_r <td>rocsparse_datatype_f64_c\n  </table>\n\n  \\note\n  This function writes the required allocation size (in bytes) to \\p buffer_size and\n  returns without performing the SpMV operation, when a nullptr is passed for\n  \\p temp_buffer.\n\n  \\note\n  The sparse matrix formats currently supported are: rocsparse_format_bsr, rocsparse_format_coo,\n  rocsparse_format_coo_aos, rocsparse_format_csr, rocsparse_format_csc and rocsparse_format_ell.\n\n  \\note SpMV_ex requires three stages to complete. The first stage\n  \\ref rocsparse_spmv_stage_buffer_size will return the size of the temporary storage buffer\n  that is required for subsequent calls to \\ref rocsparse_spmv_ex. The second stage\n  \\ref rocsparse_spmv_stage_preprocess will preprocess data that would be saved in the temporary storage buffer.\n  In the final stage \\ref rocsparse_spmv_stage_compute, the actual computation is performed.\n\n  \\note\n  Only the \\ref rocsparse_spmv_stage_buffer_size stage and the \\ref rocsparse_spmv_stage_compute stage are non blocking\n  and executed asynchronously with respect to the host. They may return before the actual computation has finished.\n  The \\ref rocsparse_spmv_stage_preprocess stage is blocking with respect to the host.\n\n  \\note\n  Only the \\ref rocsparse_spmv_stage_buffer_size stage and the \\ref rocsparse_spmv_stage_compute stage\n  support execution in a hipGraph context. The \\ref rocsparse_spmv_stage_preprocess stage does not support hipGraph.\n\n  @param[in]\n  handle       handle to the rocsparse library context queue.\n  @param[in]\n  trans        matrix operation type.\n  @param[in]\n  alpha        scalar \\f$\\alpha\\f$.\n  @param[in]\n  mat          matrix descriptor.\n  @param[in]\n  x            vector descriptor.\n  @param[in]\n  beta         scalar \\f$\\beta\\f$.\n  @param[inout]\n  y            vector descriptor.\n  @param[in]\n  compute_type floating point precision for the SpMV computation.\n  @param[in]\n  alg          SpMV algorithm for the SpMV computation.\n  @param[in]\n  stage        SpMV stage for the SpMV computation.\n  @param[out]\n  buffer_size  number of bytes of the temporary storage buffer. buffer_size is set when\n               \\p temp_buffer is nullptr.\n  @param[in]\n  temp_buffer  temporary storage buffer allocated by the user. When a nullptr is passed,\n               the required allocation size (in bytes) is written to \\p buffer_size and\n               function returns without performing the SpMV operation.\n\n  \\retval      rocsparse_status_success the operation completed successfully.\n  \\retval      rocsparse_status_invalid_handle the library context \\p handle was not initialized.\n  \\retval      rocsparse_status_invalid_pointer \\p alpha, \\p mat, \\p x, \\p beta, \\p y or\n               \\p buffer_size pointer is invalid.\n  \\retval      rocsparse_status_invalid_value the value of \\p trans, \\p compute_type, \\p alg or \\p stage is incorrect.\n  \\retval      rocsparse_status_not_implemented \\p compute_type or \\p alg is\n               currently not supported.*/\n    pub fn rocsparse_spmv_ex(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        alpha: *const ::core::ffi::c_void,\n        mat: rocsparse_spmat_descr,\n        x: rocsparse_dnvec_descr,\n        beta: *const ::core::ffi::c_void,\n        y: rocsparse_dnvec_descr,\n        compute_type: rocsparse_datatype,\n        alg: rocsparse_spmv_alg,\n        stage: rocsparse_spmv_stage,\n        buffer_size: *mut usize,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup generic_module\n  \\brief Sparse triangular system solve\n\n  \\details\n  \\p rocsparse_spsm_solve solves a sparse triangular linear system of a sparse\n  \\f$m \\times m\\f$ matrix, defined in CSR or COO storage format, a dense solution matrix\n  \\f$C\\f$ and the right-hand side \\f$B\\f$ that is multiplied by \\f$\\alpha\\f$, such that\n  \\f[\n    op(A) \\cdot C = \\alpha \\cdot op(B),\n  \\f]\n  with\n  \\f[\n    op(A) = \\left\\{\n    \\begin{array}{ll}\n        A,   & \\text{if trans == rocsparse_operation_none} \\\\\n        A^T, & \\text{if trans == rocsparse_operation_transpose} \\\\\n        A^H, & \\text{if trans == rocsparse_operation_conjugate_transpose}\n    \\end{array}\n    \\right.\n  \\f]\n  and\n  \\f[\n    op(B) = \\left\\{\n    \\begin{array}{ll}\n        B,   & \\text{if trans_B == rocsparse_operation_none} \\\\\n        B^T, & \\text{if trans_B == rocsparse_operation_transpose} \\\\\n        B^H, & \\text{if trans_B == rocsparse_operation_conjugate_transpose}\n    \\end{array}\n    \\right.\n  \\f]\n\n  \\note SpSM requires three stages to complete. The first stage\n  \\ref rocsparse_spsm_stage_buffer_size will return the size of the temporary storage buffer\n  that is required for subsequent calls. The second stage\n  \\ref rocsparse_spsm_stage_preprocess will preprocess data that would be saved in the temporary storage buffer.\n  In the final stage \\ref rocsparse_spsm_stage_compute, the actual computation is performed.\n\n  \\note\n  Only the \\ref rocsparse_spsm_stage_buffer_size stage and the \\ref rocsparse_spsm_stage_compute stage are non blocking\n  and executed asynchronously with respect to the host. They may return before the actual computation has finished.\n  The \\ref rocsparse_spsm_stage_preprocess stage is blocking with respect to the host.\n\n  \\note\n  Currently, only \\p trans_A == \\ref rocsparse_operation_none and \\p trans_A == \\ref rocsparse_operation_transpose is supported.\n  Currently, only \\p trans_B == \\ref rocsparse_operation_none and \\p trans_B == \\ref rocsparse_operation_transpose is supported.\n\n  \\note\n  Only the \\ref rocsparse_spsm_stage_buffer_size stage and the \\ref rocsparse_spsm_stage_compute stage\n  support execution in a hipGraph context. The \\ref rocsparse_spsm_stage_preprocess stage does not support hipGraph.\n\n  @param[in]\n  handle       handle to the rocsparse library context queue.\n  @param[in]\n  trans_A      matrix operation type for the sparse matrix A.\n  @param[in]\n  trans_B      matrix operation type for the dense matrix B.\n  @param[in]\n  alpha        scalar \\f$\\alpha\\f$.\n  @param[in]\n  matA          sparse matrix descriptor.\n  @param[in]\n  matB          dense matrix descriptor.\n  @param[inout]\n  matC          dense matrix descriptor.\n  @param[in]\n  compute_type floating point precision for the SpSM computation.\n  @param[in]\n  alg          SpSM algorithm for the SpSM computation.\n  @param[in]\n  stage        SpSM stage for the SpSM computation.\n  @param[out]\n  buffer_size  number of bytes of the temporary storage buffer.\n  @param[in]\n  temp_buffer  temporary storage buffer allocated by the user. When a nullptr is passed,\n               the required allocation size (in bytes) is written to \\p buffer_size and\n               function returns without performing the SpSM operation.\n\n  \\retval      rocsparse_status_success the operation completed successfully.\n  \\retval      rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval      rocsparse_status_invalid_pointer \\p alpha, \\p matA, \\p matB, \\p matC, \\p descr or\n               \\p buffer_size pointer is invalid.\n  \\retval      rocsparse_status_not_implemented \\p trans_A, \\p trans_B, \\p compute_type, \\p stage or \\p alg is\n               currently not supported.\n\n  \\par Example\n  \\code{.c}\n   //     1 0 0 0\n   // A = 4 2 0 0\n   //     0 3 7 0\n   //     0 0 0 1\n   rocsparse_int m   = 4;\n   rocsparse_int n   = 2;\n\n   std::vector<int> hcsr_row_ptr = {0, 1, 3, 5, 6};\n   std::vector<int> hcsr_col_ind = {0, 0, 1, 1, 2, 3};\n   std::vector<float> hcsr_val   = {1, 4, 2, 3, 7, 1};\n   std::vector<float> hB(m * n);\n   std::vector<float> hC(m * n);\n\n   for(int i = 0; i < n; i++)\n   {\n       for(int j = 0; j < m; j++)\n       {\n           hB[m * i + j] = static_cast<float>(i + 1);\n       }\n   }\n\n   // Scalar alpha\n   float alpha = 1.0f;\n\n   rocsparse_int nnz = hcsr_row_ptr[m] - hcsr_row_ptr[0];\n\n   // Offload data to device\n   int* dcsr_row_ptr;\n   int* dcsr_col_ind;\n   float* dcsr_val;\n   float* dB;\n   float* dC;\n   hipMalloc((void**)&dcsr_row_ptr, sizeof(int) * (m + 1));\n   hipMalloc((void**)&dcsr_col_ind, sizeof(int) * nnz);\n   hipMalloc((void**)&dcsr_val, sizeof(float) * nnz);\n   hipMalloc((void**)&dB, sizeof(float) * m * n);\n   hipMalloc((void**)&dC, sizeof(float) * m * n);\n\n   hipMemcpy(dcsr_row_ptr, hcsr_row_ptr.data(), sizeof(int) * (m + 1), hipMemcpyHostToDevice);\n   hipMemcpy(dcsr_col_ind, hcsr_col_ind.data(), sizeof(int) * nnz, hipMemcpyHostToDevice);\n   hipMemcpy(dcsr_val, hcsr_val.data(), sizeof(float) * nnz, hipMemcpyHostToDevice);\n   hipMemcpy(dB, hB.data(), sizeof(float) * m * n, hipMemcpyHostToDevice);\n\n   rocsparse_handle     handle;\n   rocsparse_spmat_descr matA;\n   rocsparse_dnmat_descr matB;\n   rocsparse_dnmat_descr matC;\n\n   rocsparse_indextype row_idx_type = rocsparse_indextype_i32;\n   rocsparse_indextype col_idx_type = rocsparse_indextype_i32;\n   rocsparse_datatype  data_type = rocsparse_datatype_f32_r;\n   rocsparse_datatype  compute_type = rocsparse_datatype_f32_r;\n   rocsparse_index_base idx_base = rocsparse_index_base_zero;\n   rocsparse_operation trans_A = rocsparse_operation_none;\n   rocsparse_operation trans_B = rocsparse_operation_none;\n\n   rocsparse_create_handle(&handle);\n\n   // Create sparse matrix A\n   rocsparse_create_csr_descr(&matA,\n                              m,\n                              m,\n                              nnz,\n                              dcsr_row_ptr,\n                              dcsr_col_ind,\n                              dcsr_val,\n                              row_idx_type,\n                              col_idx_type,\n                              idx_base,\n                              data_type);\n\n   // Create dense matrix B\n   rocsparse_create_dnmat_descr(&matB,\n                                m,\n                                n,\n                                m,\n                                dB,\n                                data_type,\n                                rocsparse_order_column);\n\n   // Create dense matrix C\n   rocsparse_create_dnmat_descr(&matC,\n                                m,\n                                n,\n                                m,\n                                dC,\n                                data_type,\n                                rocsparse_order_column);\n\n   // Call spsv to get buffer size\n   size_t buffer_size;\n   rocsparse_spsm(handle,\n                  trans_A,\n                  trans_B,\n                  &alpha,\n                  matA,\n                  matB,\n                  matC,\n                  compute_type,\n                  rocsparse_spsm_alg_default,\n                  rocsparse_spsm_stage_buffer_size,\n                  &buffer_size,\n                  nullptr);\n\n   void* temp_buffer;\n   hipMalloc((void**)&temp_buffer, buffer_size);\n\n   // Call spsv to perform analysis\n   rocsparse_spsm(handle,\n                  trans_A,\n                  trans_B,\n                  &alpha,\n                  matA,\n                  matB,\n                  matC,\n                  compute_type,\n                  rocsparse_spsm_alg_default,\n                  rocsparse_spsm_stage_preprocess,\n                  &buffer_size,\n                  temp_buffer);\n\n   // Call spsv to perform computation\n   rocsparse_spsm(handle,\n                  trans_A,\n                  trans_B,\n                  &alpha,\n                  matA,\n                  matB,\n                  matC,\n                  compute_type,\n                  rocsparse_spsm_alg_default,\n                  rocsparse_spsm_stage_compute,\n                  &buffer_size,\n                  temp_buffer);\n\n   // Copy result back to host\n   hipMemcpy(hC.data(), dC, sizeof(float) * m * n, hipMemcpyDeviceToHost);\n\n   std::cout << \"hC\" << std::endl;\n   for(size_t i = 0; i < hC.size(); ++i)\n   {\n       std::cout << hC[i] << \" \";\n   }\n   std::cout << std::endl;\n\n   // Clear rocSPARSE\n   rocsparse_destroy_spmat_descr(matA);\n   rocsparse_destroy_dnmat_descr(matB);\n   rocsparse_destroy_dnmat_descr(matC);\n   rocsparse_destroy_handle(handle);\n\n   // Clear device memory\n   hipFree(dcsr_row_ptr);\n   hipFree(dcsr_col_ind);\n   hipFree(dcsr_val);\n   hipFree(dB);\n   hipFree(dC);\n   hipFree(temp_buffer);\n  \\endcode*/\n    pub fn rocsparse_spsm(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        alpha: *const ::core::ffi::c_void,\n        matA: rocsparse_const_spmat_descr,\n        matB: rocsparse_const_dnmat_descr,\n        matC: rocsparse_dnmat_descr,\n        compute_type: rocsparse_datatype,\n        alg: rocsparse_spsm_alg,\n        stage: rocsparse_spsm_stage,\n        buffer_size: *mut usize,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup generic_module\n  \\brief Sparse triangular solve\n\n  \\details\n  \\p rocsparse_spsv_solve solves a sparse triangular linear system of a sparse\n  \\f$m \\times m\\f$ matrix, defined in CSR or COO storage format, a dense solution vector\n  \\f$y\\f$ and the right-hand side \\f$x\\f$ that is multiplied by \\f$\\alpha\\f$, such that\n  \\f[\n    op(A) \\cdot y = \\alpha \\cdot x,\n  \\f]\n  with\n  \\f[\n    op(A) = \\left\\{\n    \\begin{array}{ll}\n        A,   & \\text{if trans == rocsparse_operation_none} \\\\\n        A^T, & \\text{if trans == rocsparse_operation_transpose} \\\\\n        A^H, & \\text{if trans == rocsparse_operation_conjugate_transpose}\n    \\end{array}\n    \\right.\n  \\f]\n\n  \\note SpSV requires three stages to complete. The first stage\n  \\ref rocsparse_spsv_stage_buffer_size will return the size of the temporary storage buffer\n  that is required for subsequent calls. The second stage\n  \\ref rocsparse_spsv_stage_preprocess will preprocess data that would be saved in the temporary storage buffer.\n  In the final stage \\ref rocsparse_spsv_stage_compute, the actual computation is performed.\n\n  \\note\n  Only the \\ref rocsparse_spsv_stage_buffer_size stage and the \\ref rocsparse_spsv_stage_compute stage are non blocking\n  and executed asynchronously with respect to the host. They may return before the actual computation has finished.\n  The \\ref rocsparse_spsv_stage_preprocess stage is blocking with respect to the host.\n\n  \\note\n  Currently, only \\p trans == \\ref rocsparse_operation_none and \\p trans == \\ref rocsparse_operation_transpose is supported.\n\n  \\note\n  Only the \\ref rocsparse_spsv_stage_buffer_size stage and the \\ref rocsparse_spsv_stage_compute stage\n  support execution in a hipGraph context. The \\ref rocsparse_spsv_stage_preprocess stage does not support hipGraph.\n\n  @param[in]\n  handle       handle to the rocsparse library context queue.\n  @param[in]\n  trans        matrix operation type.\n  @param[in]\n  alpha        scalar \\f$\\alpha\\f$.\n  @param[in]\n  mat          matrix descriptor.\n  @param[in]\n  x            vector descriptor.\n  @param[inout]\n  y            vector descriptor.\n  @param[in]\n  compute_type floating point precision for the SpSV computation.\n  @param[in]\n  alg          SpSV algorithm for the SpSV computation.\n  @param[in]\n  stage        SpSV stage for the SpSV computation.\n  @param[out]\n  buffer_size  number of bytes of the temporary storage buffer.\n  @param[in]\n  temp_buffer  temporary storage buffer allocated by the user. When a nullptr is passed,\n               the required allocation size (in bytes) is written to \\p buffer_size and\n               function returns without performing the SpSV operation.\n\n  \\retval      rocsparse_status_success the operation completed successfully.\n  \\retval      rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval      rocsparse_status_invalid_pointer \\p alpha, \\p mat, \\p x, \\p y or\n               \\p buffer_size pointer is invalid.\n  \\retval      rocsparse_status_not_implemented \\p trans, \\p compute_type, \\p stage or \\p alg is\n               currently not supported.\n\n  \\par Example\n  \\code{.c}\n   //     1 0 0 0\n   // A = 4 2 0 0\n   //     0 3 7 0\n   //     0 0 0 1\n   rocsparse_int m   = 4;\n\n   std::vector<int> hcsr_row_ptr = {0, 1, 3, 5, 6};\n   std::vector<int> hcsr_col_ind = {0, 0, 1, 1, 2, 3};\n   std::vector<float> hcsr_val   = {1, 4, 2, 3, 7, 1};\n   std::vector<float> hx(m, 1.0f);\n   std::vector<float> hy(m, 0.0f);\n\n   // Scalar alpha\n   float alpha = 1.0f;\n\n   rocsparse_int nnz = hcsr_row_ptr[m] - hcsr_row_ptr[0];\n\n   // Offload data to device\n   int* dcsr_row_ptr;\n   int* dcsr_col_ind;\n   float* dcsr_val;\n   float* dx;\n   float* dy;\n   hipMalloc((void**)&dcsr_row_ptr, sizeof(int) * (m + 1));\n   hipMalloc((void**)&dcsr_col_ind, sizeof(int) * nnz);\n   hipMalloc((void**)&dcsr_val, sizeof(float) * nnz);\n   hipMalloc((void**)&dx, sizeof(float) * m);\n   hipMalloc((void**)&dy, sizeof(float) * m);\n\n   hipMemcpy(dcsr_row_ptr, hcsr_row_ptr.data(), sizeof(int) * (m + 1), hipMemcpyHostToDevice);\n   hipMemcpy(dcsr_col_ind, hcsr_col_ind.data(), sizeof(int) * nnz, hipMemcpyHostToDevice);\n   hipMemcpy(dcsr_val, hcsr_val.data(), sizeof(float) * nnz, hipMemcpyHostToDevice);\n   hipMemcpy(dx, hx.data(), sizeof(float) * m, hipMemcpyHostToDevice);\n\n   rocsparse_handle     handle;\n   rocsparse_spmat_descr matA;\n   rocsparse_dnvec_descr vecX;\n   rocsparse_dnvec_descr vecY;\n\n   rocsparse_indextype row_idx_type = rocsparse_indextype_i32;\n   rocsparse_indextype col_idx_type = rocsparse_indextype_i32;\n   rocsparse_datatype  data_type = rocsparse_datatype_f32_r;\n   rocsparse_datatype  compute_type = rocsparse_datatype_f32_r;\n   rocsparse_index_base idx_base = rocsparse_index_base_zero;\n   rocsparse_operation trans = rocsparse_operation_none;\n\n   rocsparse_create_handle(&handle);\n\n   // Create sparse matrix A\n   rocsparse_create_csr_descr(&matA,\n                              m,\n                              m,\n                              nnz,\n                              dcsr_row_ptr,\n                              dcsr_col_ind,\n                              dcsr_val,\n                              row_idx_type,\n                              col_idx_type,\n                              idx_base,\n                              data_type);\n\n   // Create dense vector X\n   rocsparse_create_dnvec_descr(&vecX,\n                                m,\n                                dx,\n                                data_type);\n\n   // Create dense vector Y\n   rocsparse_create_dnvec_descr(&vecY,\n                                m,\n                                dy,\n                                data_type);\n\n   // Call spsv to get buffer size\n   size_t buffer_size;\n   rocsparse_spsv(handle,\n                  trans,\n                  &alpha,\n                  matA,\n                  vecX,\n                  vecY,\n                  compute_type,\n                  rocsparse_spsv_alg_default,\n                  rocsparse_spsv_stage_buffer_size,\n                  &buffer_size,\n                  nullptr);\n\n   void* temp_buffer;\n   hipMalloc((void**)&temp_buffer, buffer_size);\n\n   // Call spsv to perform analysis\n   rocsparse_spsv(handle,\n                  trans,\n                  &alpha,\n                  matA,\n                  vecX,\n                  vecY,\n                  compute_type,\n                  rocsparse_spsv_alg_default,\n                  rocsparse_spsv_stage_preprocess,\n                  &buffer_size,\n                  temp_buffer);\n\n   // Call spsv to perform computation\n   rocsparse_spsv(handle,\n                  trans,\n                  &alpha,\n                  matA,\n                  vecX,\n                  vecY,\n                  compute_type,\n                  rocsparse_spsv_alg_default,\n                  rocsparse_spsv_stage_compute,\n                  &buffer_size,\n                  temp_buffer);\n\n   // Copy result back to host\n   hipMemcpy(hy.data(), dy, sizeof(float) * m, hipMemcpyDeviceToHost);\n\n   std::cout << \"hy\" << std::endl;\n   for(size_t i = 0; i < hy.size(); ++i)\n   {\n       std::cout << hy[i] << \" \";\n   }\n   std::cout << std::endl;\n\n   // Clear rocSPARSE\n   rocsparse_destroy_spmat_descr(matA);\n   rocsparse_destroy_dnvec_descr(vecX);\n   rocsparse_destroy_dnvec_descr(vecY);\n   rocsparse_destroy_handle(handle);\n\n   // Clear device memory\n   hipFree(dcsr_row_ptr);\n   hipFree(dcsr_col_ind);\n   hipFree(dcsr_val);\n   hipFree(dx);\n   hipFree(dy);\n   hipFree(temp_buffer);\n  \\endcode*/\n    pub fn rocsparse_spsv(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        alpha: *const ::core::ffi::c_void,\n        mat: rocsparse_const_spmat_descr,\n        x: rocsparse_const_dnvec_descr,\n        y: rocsparse_dnvec_descr,\n        compute_type: rocsparse_datatype,\n        alg: rocsparse_spsv_alg,\n        stage: rocsparse_spsv_stage,\n        buffer_size: *mut usize,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup generic_module\n  \\brief Sparse vector inner dot product\n\n  \\details\n  \\ref rocsparse_spvv computes the inner dot product of the sparse vecotr \\f$x\\f$ with the\n  dense vector \\f$y\\f$, such that\n  \\f[\n    \\text{result} := x^{'} \\cdot y,\n  \\f]\n  with\n  \\f[\n    op(x) = \\left\\{\n    \\begin{array}{ll}\n        x,   & \\text{if trans == rocsparse_operation_none} \\\\\n        \\bar{x}, & \\text{if trans == rocsparse_operation_conjugate_transpose} \\\\\n    \\end{array}\n    \\right.\n  \\f]\n\n  \\code{.c}\n      result = 0;\n      for(i = 0; i < nnz; ++i)\n      {\n          result += x_val[i] * y[x_ind[i]];\n      }\n  \\endcode\n\n  \\par Uniform Precisions:\n  <table>\n  <caption id=\"spvv_uniform\">Uniform Precisions</caption>\n  <tr><th>X / Y / compute_type\n  <tr><td>rocsparse_datatype_f32_r\n  <tr><td>rocsparse_datatype_f64_r\n  <tr><td>rocsparse_datatype_f32_c\n  <tr><td>rocsparse_datatype_f64_c\n  </table>\n\n  \\par Mixed precisions:\n  <table>\n  <caption id=\"spvv_mixed\">Mixed Precisions</caption>\n  <tr><th>X / Y                   <th>compute_type / result\n  <tr><td>rocsparse_datatype_i8_r <td>rocsparse_datatype_i32_r\n  <tr><td>rocsparse_datatype_i8_r <td>rocsparse_datatype_f32_r\n  </table>\n\n  \\note\n  This function writes the required allocation size (in bytes) to \\p buffer_size and\n  returns without performing the SpVV operation, when a nullptr is passed for\n  \\p temp_buffer.\n\n  \\note\n  This function is blocking with respect to the host.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle       handle to the rocsparse library context queue.\n  @param[in]\n  trans        sparse vector operation type.\n  @param[in]\n  x            sparse vector descriptor.\n  @param[in]\n  y            dense vector descriptor.\n  @param[out]\n  result       pointer to the result, can be host or device memory\n  @param[in]\n  compute_type floating point precision for the SpVV computation.\n  @param[out]\n  buffer_size  number of bytes of the temporary storage buffer. buffer_size is set when\n               \\p temp_buffer is nullptr.\n  @param[in]\n  temp_buffer  temporary storage buffer allocated by the user. When a nullptr is passed,\n               the required allocation size (in bytes) is written to \\p buffer_size and\n               function returns without performing the SpVV operation.\n\n  \\retval      rocsparse_status_success the operation completed successfully.\n  \\retval      rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval      rocsparse_status_invalid_pointer \\p x, \\p y, \\p result or \\p buffer_size\n               pointer is invalid.\n  \\retval      rocsparse_status_not_implemented \\p compute_type is currently not\n               supported.\n\n  \\par Example\n  \\code{.c}\n   // Number of non-zeros of the sparse vector\n   int nnz = 3;\n\n   // Size of sparse and dense vector\n   int size = 9;\n\n   // Sparse index vector\n   std::vector<int> hx_ind = {0, 3, 5};\n\n   // Sparse value vector\n   std::vector<float> hx_val = {1.0f, 2.0f, 3.0f};\n\n   // Dense vector\n   std::vector<float> hy = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f};\n\n   // Offload data to device\n   int* dx_ind;\n   float* dx_val;\n   float* dy;\n   hipMalloc((void**)&dx_ind, sizeof(int) * nnz);\n   hipMalloc((void**)&dx_val, sizeof(float) * nnz);\n   hipMalloc((void**)&dy, sizeof(float) * size);\n\n   hipMemcpy(dx_ind, hx_ind.data(), sizeof(int) * nnz, hipMemcpyHostToDevice);\n   hipMemcpy(dx_val, hx_val.data(), sizeof(float) * nnz, hipMemcpyHostToDevice);\n   hipMemcpy(dy, hy.data(), sizeof(float) * size, hipMemcpyHostToDevice);\n\n   rocsparse_handle     handle;\n   rocsparse_spvec_descr vecX;\n   rocsparse_dnvec_descr vecY;\n\n   rocsparse_indextype idx_type = rocsparse_indextype_i32;\n   rocsparse_datatype  data_type = rocsparse_datatype_f32_r;\n   rocsparse_datatype  compute_type = rocsparse_datatype_f32_r;\n   rocsparse_operation trans = rocsparse_operation_none;\n   rocsparse_index_base idx_base = rocsparse_index_base_zero;\n\n   rocsparse_create_handle(&handle);\n\n   // Create sparse vector X\n   rocsparse_create_spvec_descr(&vecX,\n                                size,\n                                nnz,\n                                dx_ind,\n                                dx_val,\n                                idx_type,\n                                idx_base,\n                                data_type);\n\n   // Create dense vector Y\n   rocsparse_create_dnvec_descr(&vecY,\n                                size,\n                                dy,\n                                data_type);\n\n   // Obtain buffer size\n   float hresult = 0.0f;\n   size_t buffer_size;\n   rocsparse_spvv(handle,\n                  trans,\n                  vecX,\n                  vecY,\n                  &hresult,\n                  compute_type,\n                  &buffer_size,\n                  nullptr);\n\n   void* temp_buffer;\n   hipMalloc(&temp_buffer, buffer_size);\n\n   // SpVV\n   rocsparse_spvv(handle,\n                  trans,\n                  vecX,\n                  vecY,\n                  &hresult,\n                  compute_type,\n                  &buffer_size,\n                  temp_buffer);\n\n   hipDeviceSynchronize();\n\n   std::cout << \"hresult: \" << hresult << std::endl;\n\n   // Clear rocSPARSE\n   rocsparse_destroy_spvec_descr(vecX);\n   rocsparse_destroy_dnvec_descr(vecY);\n   rocsparse_destroy_handle(handle);\n\n   // Clear device memory\n   hipFree(dx_ind);\n   hipFree(dx_val);\n   hipFree(dy);\n   hipFree(temp_buffer);\n  \\endcode*/\n    pub fn rocsparse_spvv(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        x: rocsparse_const_spvec_descr,\n        y: rocsparse_const_dnvec_descr,\n        result: *mut ::core::ffi::c_void,\n        compute_type: rocsparse_datatype,\n        buffer_size: *mut usize,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level1_module\\n  \\\\brief Scale a sparse vector and add it to a dense vector.\\n\\n  \\\\details\\n  \\\\p rocsparse_axpyi multiplies the sparse vector \\\\f$x\\\\f$ with scalar \\\\f$\\\\alpha\\\\f$ and\\n  adds the result to the dense vector \\\\f$y\\\\f$, such that\\n\\n  \\\\f[\\n      y := y + \\\\alpha \\\\cdot x\\n  \\\\f]\\n\\n  \\\\code{.c}\\n      for(i = 0; i < nnz; ++i)\\n      {\\n          y[x_ind[i]] = y[x_ind[i]] + alpha * x_val[i];\\n      }\\n  \\\\endcode\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  nnz         number of non-zero entries of vector \\\\f$x\\\\f$.\\n  @param[in]\\n  alpha       scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  x_val       array of \\\\p nnz elements containing the values of \\\\f$x\\\\f$.\\n  @param[in]\\n  x_ind       array of \\\\p nnz elements containing the indices of the non-zero\\n              values of \\\\f$x\\\\f$.\\n  @param[inout]\\n  y           array of values in dense format.\\n  @param[in]\\n  idx_base    \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval rocsparse_status_invalid_value \\\\p idx_base is invalid.\\n  \\\\retval rocsparse_status_invalid_size \\\\p nnz is invalid.\\n  \\\\retval rocsparse_status_invalid_pointer \\\\p alpha, \\\\p x_val, \\\\p x_ind or \\\\p y pointer\\n          is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_saxpyi(\n        handle: rocsparse_handle,\n        nnz: rocsparse_int,\n        alpha: *const f32,\n        x_val: *const f32,\n        x_ind: *const rocsparse_int,\n        y: *mut f32,\n        idx_base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_daxpyi(\n        handle: rocsparse_handle,\n        nnz: rocsparse_int,\n        alpha: *const f64,\n        x_val: *const f64,\n        x_ind: *const rocsparse_int,\n        y: *mut f64,\n        idx_base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_caxpyi(\n        handle: rocsparse_handle,\n        nnz: rocsparse_int,\n        alpha: *const rocsparse_float_complex,\n        x_val: *const rocsparse_float_complex,\n        x_ind: *const rocsparse_int,\n        y: *mut rocsparse_float_complex,\n        idx_base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zaxpyi(\n        handle: rocsparse_handle,\n        nnz: rocsparse_int,\n        alpha: *const rocsparse_double_complex,\n        x_val: *const rocsparse_double_complex,\n        x_ind: *const rocsparse_int,\n        y: *mut rocsparse_double_complex,\n        idx_base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level1_module\\n  \\\\brief Compute the dot product of a complex conjugate sparse vector with a dense\\n  vector.\\n\\n  \\\\details\\n  \\\\p rocsparse_dotci computes the dot product of the complex conjugate sparse vector\\n  \\\\f$x\\\\f$ with the dense vector \\\\f$y\\\\f$, such that\\n  \\\\f[\\n    \\\\text{result} := \\\\bar{x}^H y\\n  \\\\f]\\n\\n  \\\\code{.c}\\n      for(i = 0; i < nnz; ++i)\\n      {\\n          result += conj(x_val[i]) * y[x_ind[i]];\\n      }\\n  \\\\endcode\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  nnz         number of non-zero entries of vector \\\\f$x\\\\f$.\\n  @param[in]\\n  x_val       array of \\\\p nnz values.\\n  @param[in]\\n  x_ind       array of \\\\p nnz elements containing the indices of the non-zero\\n              values of \\\\f$x\\\\f$.\\n  @param[in]\\n  y           array of values in dense format.\\n  @param[out]\\n  result      pointer to the result, can be host or device memory\\n  @param[in]\\n  idx_base    \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval rocsparse_status_invalid_value \\\\p idx_base is invalid.\\n  \\\\retval rocsparse_status_invalid_size \\\\p nnz is invalid.\\n  \\\\retval rocsparse_status_invalid_pointer \\\\p x_val, \\\\p x_ind, \\\\p y or \\\\p result\\n          pointer is invalid.\\n  \\\\retval rocsparse_status_memory_error the buffer for the dot product reduction\\n          could not be allocated.\\n  \\\\retval rocsparse_status_internal_error an internal error occurred.\\n/\\n/**@{\"]\n    pub fn rocsparse_cdotci(\n        handle: rocsparse_handle,\n        nnz: rocsparse_int,\n        x_val: *const rocsparse_float_complex,\n        x_ind: *const rocsparse_int,\n        y: *const rocsparse_float_complex,\n        result: *mut rocsparse_float_complex,\n        idx_base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zdotci(\n        handle: rocsparse_handle,\n        nnz: rocsparse_int,\n        x_val: *const rocsparse_double_complex,\n        x_ind: *const rocsparse_int,\n        y: *const rocsparse_double_complex,\n        result: *mut rocsparse_double_complex,\n        idx_base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level1_module\\n  \\\\brief Compute the dot product of a sparse vector with a dense vector.\\n\\n  \\\\details\\n  \\\\p rocsparse_doti computes the dot product of the sparse vector \\\\f$x\\\\f$ with the\\n  dense vector \\\\f$y\\\\f$, such that\\n  \\\\f[\\n    \\\\text{result} := y^T x\\n  \\\\f]\\n\\n  \\\\code{.c}\\n      for(i = 0; i < nnz; ++i)\\n      {\\n          result += x_val[i] * y[x_ind[i]];\\n      }\\n  \\\\endcode\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  nnz         number of non-zero entries of vector \\\\f$x\\\\f$.\\n  @param[in]\\n  x_val       array of \\\\p nnz values.\\n  @param[in]\\n  x_ind       array of \\\\p nnz elements containing the indices of the non-zero\\n              values of \\\\f$x\\\\f$.\\n  @param[in]\\n  y           array of values in dense format.\\n  @param[out]\\n  result      pointer to the result, can be host or device memory\\n  @param[in]\\n  idx_base    \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval rocsparse_status_invalid_value \\\\p idx_base is invalid.\\n  \\\\retval rocsparse_status_invalid_size \\\\p nnz is invalid.\\n  \\\\retval rocsparse_status_invalid_pointer \\\\p x_val, \\\\p x_ind, \\\\p y or \\\\p result\\n          pointer is invalid.\\n  \\\\retval rocsparse_status_memory_error the buffer for the dot product reduction\\n          could not be allocated.\\n  \\\\retval rocsparse_status_internal_error an internal error occurred.\\n/\\n/**@{\"]\n    pub fn rocsparse_sdoti(\n        handle: rocsparse_handle,\n        nnz: rocsparse_int,\n        x_val: *const f32,\n        x_ind: *const rocsparse_int,\n        y: *const f32,\n        result: *mut f32,\n        idx_base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ddoti(\n        handle: rocsparse_handle,\n        nnz: rocsparse_int,\n        x_val: *const f64,\n        x_ind: *const rocsparse_int,\n        y: *const f64,\n        result: *mut f64,\n        idx_base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cdoti(\n        handle: rocsparse_handle,\n        nnz: rocsparse_int,\n        x_val: *const rocsparse_float_complex,\n        x_ind: *const rocsparse_int,\n        y: *const rocsparse_float_complex,\n        result: *mut rocsparse_float_complex,\n        idx_base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zdoti(\n        handle: rocsparse_handle,\n        nnz: rocsparse_int,\n        x_val: *const rocsparse_double_complex,\n        x_ind: *const rocsparse_int,\n        y: *const rocsparse_double_complex,\n        result: *mut rocsparse_double_complex,\n        idx_base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level1_module\\n  \\\\brief Gather elements from a dense vector and store them into a sparse vector.\\n\\n  \\\\details\\n  \\\\p rocsparse_gthr gathers the elements that are listed in \\\\p x_ind from the dense\\n  vector \\\\f$y\\\\f$ and stores them in the sparse vector \\\\f$x\\\\f$.\\n\\n  \\\\code{.c}\\n      for(i = 0; i < nnz; ++i)\\n      {\\n          x_val[i] = y[x_ind[i]];\\n      }\\n  \\\\endcode\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  nnz         number of non-zero entries of \\\\f$x\\\\f$.\\n  @param[in]\\n  y           array of values in dense format.\\n  @param[out]\\n  x_val       array of \\\\p nnz elements containing the values of \\\\f$x\\\\f$.\\n  @param[in]\\n  x_ind       array of \\\\p nnz elements containing the indices of the non-zero\\n              values of \\\\f$x\\\\f$.\\n  @param[in]\\n  idx_base    \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_value \\\\p idx_base is invalid.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p nnz is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p y, \\\\p x_val or \\\\p x_ind pointer is\\n              invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_sgthr(\n        handle: rocsparse_handle,\n        nnz: rocsparse_int,\n        y: *const f32,\n        x_val: *mut f32,\n        x_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dgthr(\n        handle: rocsparse_handle,\n        nnz: rocsparse_int,\n        y: *const f64,\n        x_val: *mut f64,\n        x_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cgthr(\n        handle: rocsparse_handle,\n        nnz: rocsparse_int,\n        y: *const rocsparse_float_complex,\n        x_val: *mut rocsparse_float_complex,\n        x_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zgthr(\n        handle: rocsparse_handle,\n        nnz: rocsparse_int,\n        y: *const rocsparse_double_complex,\n        x_val: *mut rocsparse_double_complex,\n        x_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level1_module\\n  \\\\brief Gather and zero out elements from a dense vector and store them into a sparse\\n  vector.\\n\\n  \\\\details\\n  \\\\p rocsparse_gthrz gathers the elements that are listed in \\\\p x_ind from the dense\\n  vector \\\\f$y\\\\f$ and stores them in the sparse vector \\\\f$x\\\\f$. The gathered elements\\n  in \\\\f$y\\\\f$ are replaced by zero.\\n\\n  \\\\code{.c}\\n      for(i = 0; i < nnz; ++i)\\n      {\\n          x_val[i]    = y[x_ind[i]];\\n          y[x_ind[i]] = 0;\\n      }\\n  \\\\endcode\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  nnz         number of non-zero entries of \\\\f$x\\\\f$.\\n  @param[inout]\\n  y           array of values in dense format.\\n  @param[out]\\n  x_val       array of \\\\p nnz elements containing the non-zero values of \\\\f$x\\\\f$.\\n  @param[in]\\n  x_ind       array of \\\\p nnz elements containing the indices of the non-zero\\n              values of \\\\f$x\\\\f$.\\n  @param[in]\\n  idx_base    \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_value \\\\p idx_base is invalid.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p nnz is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p y, \\\\p x_val or \\\\p x_ind pointer is\\n              invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_sgthrz(\n        handle: rocsparse_handle,\n        nnz: rocsparse_int,\n        y: *mut f32,\n        x_val: *mut f32,\n        x_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dgthrz(\n        handle: rocsparse_handle,\n        nnz: rocsparse_int,\n        y: *mut f64,\n        x_val: *mut f64,\n        x_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cgthrz(\n        handle: rocsparse_handle,\n        nnz: rocsparse_int,\n        y: *mut rocsparse_float_complex,\n        x_val: *mut rocsparse_float_complex,\n        x_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zgthrz(\n        handle: rocsparse_handle,\n        nnz: rocsparse_int,\n        y: *mut rocsparse_double_complex,\n        x_val: *mut rocsparse_double_complex,\n        x_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level1_module\\n  \\\\brief Apply Givens rotation to a dense and a sparse vector.\\n\\n  \\\\details\\n  \\\\p rocsparse_roti applies the Givens rotation matrix \\\\f$G\\\\f$ to the sparse vector\\n  \\\\f$x\\\\f$ and the dense vector \\\\f$y\\\\f$, where\\n  \\\\f[\\n    G = \\\\begin{pmatrix} c & s \\\\\\\\ -s & c \\\\end{pmatrix}\\n  \\\\f]\\n\\n  \\\\code{.c}\\n      for(i = 0; i < nnz; ++i)\\n      {\\n          x_tmp = x_val[i];\\n          y_tmp = y[x_ind[i]];\\n\\n          x_val[i]    = c * x_tmp + s * y_tmp;\\n          y[x_ind[i]] = c * y_tmp - s * x_tmp;\\n      }\\n  \\\\endcode\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  nnz         number of non-zero entries of \\\\f$x\\\\f$.\\n  @param[inout]\\n  x_val       array of \\\\p nnz elements containing the non-zero values of \\\\f$x\\\\f$.\\n  @param[in]\\n  x_ind       array of \\\\p nnz elements containing the indices of the non-zero\\n              values of \\\\f$x\\\\f$.\\n  @param[inout]\\n  y           array of values in dense format.\\n  @param[in]\\n  c           pointer to the cosine element of \\\\f$G\\\\f$, can be on host or device.\\n  @param[in]\\n  s           pointer to the sine element of \\\\f$G\\\\f$, can be on host or device.\\n  @param[in]\\n  idx_base    \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_value \\\\p idx_base is invalid.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p nnz is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p c, \\\\p s, \\\\p x_val, \\\\p x_ind or \\\\p y\\n              pointer is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_sroti(\n        handle: rocsparse_handle,\n        nnz: rocsparse_int,\n        x_val: *mut f32,\n        x_ind: *const rocsparse_int,\n        y: *mut f32,\n        c: *const f32,\n        s: *const f32,\n        idx_base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_droti(\n        handle: rocsparse_handle,\n        nnz: rocsparse_int,\n        x_val: *mut f64,\n        x_ind: *const rocsparse_int,\n        y: *mut f64,\n        c: *const f64,\n        s: *const f64,\n        idx_base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level1_module\\n  \\\\brief Scatter elements from a dense vector across a sparse vector.\\n\\n  \\\\details\\n  \\\\p rocsparse_sctr scatters the elements that are listed in \\\\p x_ind from the sparse\\n  vector \\\\f$x\\\\f$ into the dense vector \\\\f$y\\\\f$. Indices of \\\\f$y\\\\f$ that are not listed\\n  in \\\\p x_ind remain unchanged.\\n\\n  \\\\code{.c}\\n      for(i = 0; i < nnz; ++i)\\n      {\\n          y[x_ind[i]] = x_val[i];\\n      }\\n  \\\\endcode\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  nnz         number of non-zero entries of \\\\f$x\\\\f$.\\n  @param[in]\\n  x_val       array of \\\\p nnz elements containing the non-zero values of \\\\f$x\\\\f$.\\n  @param[in]\\n  x_ind       array of \\\\p nnz elements containing the indices of the non-zero\\n              values of x.\\n  @param[inout]\\n  y           array of values in dense format.\\n  @param[in]\\n  idx_base    \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_value \\\\p idx_base is invalid.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p nnz is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p x_val, \\\\p x_ind or \\\\p y pointer is\\n              invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_ssctr(\n        handle: rocsparse_handle,\n        nnz: rocsparse_int,\n        x_val: *const f32,\n        x_ind: *const rocsparse_int,\n        y: *mut f32,\n        idx_base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dsctr(\n        handle: rocsparse_handle,\n        nnz: rocsparse_int,\n        x_val: *const f64,\n        x_ind: *const rocsparse_int,\n        y: *mut f64,\n        idx_base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_csctr(\n        handle: rocsparse_handle,\n        nnz: rocsparse_int,\n        x_val: *const rocsparse_float_complex,\n        x_ind: *const rocsparse_int,\n        y: *mut rocsparse_float_complex,\n        idx_base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zsctr(\n        handle: rocsparse_handle,\n        nnz: rocsparse_int,\n        x_val: *const rocsparse_double_complex,\n        x_ind: *const rocsparse_int,\n        y: *mut rocsparse_double_complex,\n        idx_base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_isctr(\n        handle: rocsparse_handle,\n        nnz: rocsparse_int,\n        x_val: *const rocsparse_int,\n        x_ind: *const rocsparse_int,\n        y: *mut rocsparse_int,\n        idx_base: rocsparse_index_base,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level2_module\\n  \\\\brief Sparse matrix vector multiplication using BSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_bsrmv_ex_analysis performs the analysis step for rocsparse_sbsrmv(),\\n  rocsparse_dbsrmv(), rocsparse_cbsrmv() and rocsparse_zbsrmv(). It is expected that\\n  this function will be executed only once for a given matrix and particular operation\\n  type. The gathered analysis meta data can be cleared by rocsparse_bsrmv_ex_clear().\\n\\n  \\\\note\\n  If the matrix sparsity pattern changes, the gathered information will become invalid.\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  dir         matrix storage of BSR blocks.\\n  @param[in]\\n  trans       matrix operation type.\\n  @param[in]\\n  mb          number of block rows of the sparse BSR matrix.\\n  @param[in]\\n  nb          number of block columns of the sparse BSR matrix.\\n  @param[in]\\n  nnzb        number of non-zero blocks of the sparse BSR matrix.\\n  @param[in]\\n  descr       descriptor of the sparse BSR matrix. Currently, only\\n              \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  bsr_val     array of \\\\p nnzb blocks of the sparse BSR matrix.\\n  @param[in]\\n  bsr_row_ptr array of \\\\p mb+1 elements that point to the start of every block row of\\n              the sparse BSR matrix.\\n  @param[in]\\n  bsr_col_ind array of \\\\p nnzb elements containing the block column indices of the sparse\\n              BSR matrix.\\n  @param[in]\\n  block_dim     block dimension of the sparse BSR matrix.\\n  @param[out]\\n  info        structure that holds the information collected during the analysis step.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p mb, \\\\p nb or \\\\p nnzb is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p bsr_val, \\\\p bsr_row_ptr,\\n              \\\\p bsr_col_ind or \\\\p info pointer is invalid.\\n  \\\\retval     rocsparse_status_memory_error the buffer for the gathered information\\n              could not be allocated.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p trans != \\\\ref rocsparse_operation_none or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_sbsrmv_ex_analysis(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f32,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dbsrmv_ex_analysis(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f64,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cbsrmv_ex_analysis(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_float_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zbsrmv_ex_analysis(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_double_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level2_module\\n  \\\\brief Sparse matrix vector multiplication using BSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_bsrmv_ex multiplies the scalar \\\\f$\\\\alpha\\\\f$ with a sparse\\n  \\\\f$(mb \\\\cdot \\\\text{block_dim}) \\\\times (nb \\\\cdot \\\\text{block_dim})\\\\f$\\n  matrix, defined in BSR storage format, and the dense vector \\\\f$x\\\\f$ and adds the\\n  result to the dense vector \\\\f$y\\\\f$ that is multiplied by the scalar \\\\f$\\\\beta\\\\f$,\\n  such that\\n  \\\\f[\\n    y := \\\\alpha \\\\cdot op(A) \\\\cdot x + \\\\beta \\\\cdot y,\\n  \\\\f]\\n  with\\n  \\\\f[\\n    op(A) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        A,   & \\\\text{if trans == rocsparse_operation_none} \\\\\\\\\\n        A^T, & \\\\text{if trans == rocsparse_operation_transpose} \\\\\\\\\\n        A^H, & \\\\text{if trans == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  Currently, only \\\\p trans == \\\\ref rocsparse_operation_none is supported.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  dir         matrix storage of BSR blocks.\\n  @param[in]\\n  trans       matrix operation type.\\n  @param[in]\\n  mb          number of block rows of the sparse BSR matrix.\\n  @param[in]\\n  nb          number of block columns of the sparse BSR matrix.\\n  @param[in]\\n  nnzb        number of non-zero blocks of the sparse BSR matrix.\\n  @param[in]\\n  alpha       scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  descr       descriptor of the sparse BSR matrix. Currently, only\\n              \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  bsr_val     array of \\\\p nnzb blocks of the sparse BSR matrix.\\n  @param[in]\\n  bsr_row_ptr array of \\\\p mb+1 elements that point to the start of every block row of\\n              the sparse BSR matrix.\\n  @param[in]\\n  bsr_col_ind array of \\\\p nnzb elements containing the block column indices of the sparse\\n              BSR matrix.\\n  @param[in]\\n  block_dim     block dimension of the sparse BSR matrix.\\n  @param[in]\\n  x           array of \\\\p nb*block_dim elements (\\\\f$op(A) = A\\\\f$) or \\\\p mb*block_dim\\n              elements (\\\\f$op(A) = A^T\\\\f$ or \\\\f$op(A) = A^H\\\\f$).\\n  @param[in]\\n  beta        scalar \\\\f$\\\\beta\\\\f$.\\n  @param[inout]\\n  y           array of \\\\p mb*block_dim elements (\\\\f$op(A) = A\\\\f$) or \\\\p nb*block_dim\\n              elements (\\\\f$op(A) = A^T\\\\f$ or \\\\f$op(A) = A^H\\\\f$).\\n  @param[out]\\n  info        structure that holds the information collected during the analysis step.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p mb, \\\\p nb, \\\\p nnzb or \\\\p block_dim is\\n              invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p alpha, \\\\p bsr_val,\\n              \\\\p bsr_row_ind, \\\\p bsr_col_ind, \\\\p x, \\\\p beta or \\\\p y pointer is invalid.\\n  \\\\retval     rocsparse_status_arch_mismatch the device is not supported.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p trans != \\\\ref rocsparse_operation_none or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_sbsrmv_ex(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const f32,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f32,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        x: *const f32,\n        beta: *const f32,\n        y: *mut f32,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dbsrmv_ex(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const f64,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f64,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        x: *const f64,\n        beta: *const f64,\n        y: *mut f64,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cbsrmv_ex(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const rocsparse_float_complex,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_float_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        x: *const rocsparse_float_complex,\n        beta: *const rocsparse_float_complex,\n        y: *mut rocsparse_float_complex,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zbsrmv_ex(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const rocsparse_double_complex,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_double_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        x: *const rocsparse_double_complex,\n        beta: *const rocsparse_double_complex,\n        y: *mut rocsparse_double_complex,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup level2_module\n  \\brief Sparse matrix vector multiplication using BSR storage format\n\n  \\details\n  \\p rocsparse_bsrmv_ex_clear deallocates all memory that was allocated by\n  rocsparse_sbsrmv_ex_analysis(), rocsparse_dbsrmv_ex_analysis(), rocsparse_cbsrmv_ex_analysis()\n  or rocsparse_zbsrmv_ex_analysis(). This is especially useful, if memory is an issue and\n  the analysis data is not required anymore for further computation, e.g. when\n  switching to another sparse matrix format.\n\n  \\note\n  Calling \\p rocsparse_bsrmv_ex_clear is optional. All allocated resources will be\n  cleared, when the opaque \\ref rocsparse_mat_info struct is destroyed using\n  rocsparse_destroy_mat_info().\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[inout]\n  info        structure that holds the information collected during analysis step.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_pointer \\p info pointer is invalid.\n  \\retval     rocsparse_status_memory_error the buffer for the gathered information\n              could not be deallocated.\n  \\retval     rocsparse_status_internal_error an internal error occurred.*/\n    pub fn rocsparse_bsrmv_ex_clear(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level2_module\\n  \\\\brief Sparse matrix vector multiplication using BSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_bsrmv_analysis performs the analysis step for rocsparse_sbsrmv(),\\n  rocsparse_dbsrmv(), rocsparse_cbsrmv() and rocsparse_zbsrmv(). It is expected that\\n  this function will be executed only once for a given matrix and particular operation\\n  type. The gathered analysis meta data can be cleared by rocsparse_bsrmv_clear().\\n\\n  \\\\note\\n  If the matrix sparsity pattern changes, the gathered information will become invalid.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  dir         matrix storage of BSR blocks.\\n  @param[in]\\n  trans       matrix operation type.\\n  @param[in]\\n  mb          number of block rows of the sparse BSR matrix.\\n  @param[in]\\n  nb          number of block columns of the sparse BSR matrix.\\n  @param[in]\\n  nnzb        number of non-zero blocks of the sparse BSR matrix.\\n  @param[in]\\n  descr       descriptor of the sparse BSR matrix. Currently, only\\n              \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  bsr_val     array of \\\\p nnzb blocks of the sparse BSR matrix.\\n  @param[in]\\n  bsr_row_ptr array of \\\\p mb+1 elements that point to the start of every block row of\\n              the sparse BSR matrix.\\n  @param[in]\\n  bsr_col_ind array of \\\\p nnzb elements containing the block column indices of the sparse\\n              BSR matrix.\\n  @param[in]\\n  block_dim     block dimension of the sparse BSR matrix.\\n  @param[out]\\n  info        structure that holds the information collected during the analysis step.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p mb, \\\\p nb or \\\\p nnzb is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p bsr_val, \\\\p bsr_row_ptr,\\n              \\\\p bsr_col_ind or \\\\p info pointer is invalid.\\n  \\\\retval     rocsparse_status_memory_error the buffer for the gathered information\\n              could not be allocated.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p trans != \\\\ref rocsparse_operation_none or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_sbsrmv_analysis(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f32,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dbsrmv_analysis(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f64,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cbsrmv_analysis(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_float_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zbsrmv_analysis(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_double_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level2_module\\n  \\\\brief Sparse matrix vector multiplication using BSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_bsrmv multiplies the scalar \\\\f$\\\\alpha\\\\f$ with a sparse\\n  \\\\f$(mb \\\\cdot \\\\text{block_dim}) \\\\times (nb \\\\cdot \\\\text{block_dim})\\\\f$\\n  matrix, defined in BSR storage format, and the dense vector \\\\f$x\\\\f$ and adds the\\n  result to the dense vector \\\\f$y\\\\f$ that is multiplied by the scalar \\\\f$\\\\beta\\\\f$,\\n  such that\\n  \\\\f[\\n    y := \\\\alpha \\\\cdot op(A) \\\\cdot x + \\\\beta \\\\cdot y,\\n  \\\\f]\\n  with\\n  \\\\f[\\n    op(A) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        A,   & \\\\text{if trans == rocsparse_operation_none} \\\\\\\\\\n        A^T, & \\\\text{if trans == rocsparse_operation_transpose} \\\\\\\\\\n        A^H, & \\\\text{if trans == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  Currently, only \\\\p trans == \\\\ref rocsparse_operation_none is supported.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  dir         matrix storage of BSR blocks.\\n  @param[in]\\n  trans       matrix operation type.\\n  @param[in]\\n  mb          number of block rows of the sparse BSR matrix.\\n  @param[in]\\n  nb          number of block columns of the sparse BSR matrix.\\n  @param[in]\\n  nnzb        number of non-zero blocks of the sparse BSR matrix.\\n  @param[in]\\n  alpha       scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  descr       descriptor of the sparse BSR matrix. Currently, only\\n              \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  bsr_val     array of \\\\p nnzb blocks of the sparse BSR matrix.\\n  @param[in]\\n  bsr_row_ptr array of \\\\p mb+1 elements that point to the start of every block row of\\n              the sparse BSR matrix.\\n  @param[in]\\n  bsr_col_ind array of \\\\p nnzb elements containing the block column indices of the sparse\\n              BSR matrix.\\n  @param[in]\\n  block_dim     block dimension of the sparse BSR matrix.\\n  @param[in]\\n  x           array of \\\\p nb*block_dim elements (\\\\f$op(A) = A\\\\f$) or \\\\p mb*block_dim\\n              elements (\\\\f$op(A) = A^T\\\\f$ or \\\\f$op(A) = A^H\\\\f$).\\n  @param[in]\\n  beta        scalar \\\\f$\\\\beta\\\\f$.\\n  @param[inout]\\n  y           array of \\\\p mb*block_dim elements (\\\\f$op(A) = A\\\\f$) or \\\\p nb*block_dim\\n              elements (\\\\f$op(A) = A^T\\\\f$ or \\\\f$op(A) = A^H\\\\f$).\\n  @param[out]\\n  info        structure that holds the information collected during the analysis step.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p mb, \\\\p nb, \\\\p nnzb or \\\\p block_dim is\\n              invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p alpha, \\\\p bsr_val,\\n              \\\\p bsr_row_ind, \\\\p bsr_col_ind, \\\\p x, \\\\p beta or \\\\p y pointer is invalid.\\n  \\\\retval     rocsparse_status_arch_mismatch the device is not supported.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p trans != \\\\ref rocsparse_operation_none or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_sbsrmv(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const f32,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f32,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        x: *const f32,\n        beta: *const f32,\n        y: *mut f32,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dbsrmv(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const f64,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f64,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        x: *const f64,\n        beta: *const f64,\n        y: *mut f64,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cbsrmv(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const rocsparse_float_complex,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_float_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        x: *const rocsparse_float_complex,\n        beta: *const rocsparse_float_complex,\n        y: *mut rocsparse_float_complex,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zbsrmv(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const rocsparse_double_complex,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_double_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        x: *const rocsparse_double_complex,\n        beta: *const rocsparse_double_complex,\n        y: *mut rocsparse_double_complex,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup level2_module\n  \\brief Sparse matrix vector multiplication using BSR storage format\n\n  \\details\n  \\p rocsparse_bsrmv_clear deallocates all memory that was allocated by\n  rocsparse_sbsrmv_analysis(), rocsparse_dbsrmv_analysis(), rocsparse_cbsrmv_analysis()\n  or rocsparse_zbsrmv_analysis(). This is especially useful, if memory is an issue and\n  the analysis data is not required anymore for further computation, e.g. when\n  switching to another sparse matrix format.\n\n  \\note\n  Calling \\p rocsparse_bsrmv_clear is optional. All allocated resources will be\n  cleared, when the opaque \\ref rocsparse_mat_info struct is destroyed using\n  rocsparse_destroy_mat_info().\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[inout]\n  info        structure that holds the information collected during analysis step.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_pointer \\p info pointer is invalid.\n  \\retval     rocsparse_status_memory_error the buffer for the gathered information\n              could not be deallocated.\n  \\retval     rocsparse_status_internal_error an internal error occurred.*/\n    pub fn rocsparse_bsrmv_clear(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup level2_module\n  \\brief Sparse triangular solve using BSR storage format\n\n  \\details\n  \\p rocsparse_bsrsv_zero_pivot returns \\ref rocsparse_status_zero_pivot, if either a\n  structural or numerical zero has been found during rocsparse_sbsrsv_solve(),\n  rocsparse_dbsrsv_solve(), rocsparse_cbsrsv_solve() or rocsparse_zbsrsv_solve()\n  computation. The first zero pivot \\f$j\\f$ at \\f$A_{j,j}\\f$ is stored in \\p position,\n  using same index base as the BSR matrix.\n\n  \\p position can be in host or device memory. If no zero pivot has been found,\n  \\p position is set to -1 and \\ref rocsparse_status_success is returned instead.\n\n  \\note \\p rocsparse_bsrsv_zero_pivot is a blocking function. It might influence\n  performance negatively.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[in]\n  info        structure that holds the information collected during the analysis step.\n  @param[inout]\n  position    pointer to zero pivot \\f$j\\f$, can be in host or device memory.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_pointer \\p info or \\p position pointer is\n              invalid.\n  \\retval     rocsparse_status_internal_error an internal error occurred.\n  \\retval     rocsparse_status_zero_pivot zero pivot has been found.*/\n    pub fn rocsparse_bsrsv_zero_pivot(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n        position: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level2_module\\n  \\\\brief Sparse triangular solve using BSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_bsrsv_buffer_size returns the size of the temporary storage buffer that\\n  is required by rocsparse_sbsrsv_analysis(), rocsparse_dbsrsv_analysis(),\\n  rocsparse_cbsrsv_analysis(), rocsparse_zbsrsv_analysis(), rocsparse_sbsrsv_solve(),\\n  rocsparse_dbsrsv_solve(), rocsparse_cbsrsv_solve() and rocsparse_zbsrsv_solve(). The\\n  temporary storage buffer must be allocated by the user.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  dir         matrix storage of BSR blocks.\\n  @param[in]\\n  trans       matrix operation type.\\n  @param[in]\\n  mb          number of block rows of the sparse BSR matrix.\\n  @param[in]\\n  nnzb        number of non-zero blocks of the sparse BSR matrix.\\n  @param[in]\\n  descr       descriptor of the sparse BSR matrix.\\n  @param[in]\\n  bsr_val     array of \\\\p nnzb blocks of the sparse BSR matrix.\\n  @param[in]\\n  bsr_row_ptr array of \\\\p mb+1 elements that point to the start of every block row of\\n              the sparse BSR matrix.\\n  @param[in]\\n  bsr_col_ind array of \\\\p nnz containing the block column indices of the sparse\\n              BSR matrix.\\n  @param[in]\\n  block_dim     block dimension of the sparse BSR matrix.\\n  @param[out]\\n  info        structure that holds the information collected during the analysis step.\\n  @param[out]\\n  buffer_size number of bytes of the temporary storage buffer required by\\n              rocsparse_sbsrsv_analysis(), rocsparse_dbsrsv_analysis(),\\n              rocsparse_cbsrsv_analysis(), rocsparse_zbsrsv_analysis(),\\n              rocsparse_sbsrsv_solve(), rocsparse_dbsrsv_solve(),\\n              rocsparse_cbsrsv_solve() and rocsparse_zbsrsv_solve().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p mb, \\\\p nnzb or \\\\p block_dim is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p bsr_val, \\\\p bsr_row_ptr,\\n              \\\\p bsr_col_ind, \\\\p info or \\\\p buffer_size pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p trans == \\\\ref rocsparse_operation_conjugate_transpose or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_sbsrsv_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f32,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dbsrsv_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f64,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cbsrsv_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_float_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zbsrsv_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_double_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level2_module\\n  \\\\brief Sparse triangular solve using BSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_bsrsv_analysis performs the analysis step for rocsparse_sbsrsv_solve(),\\n  rocsparse_dbsrsv_solve(), rocsparse_cbsrsv_solve() and rocsparse_zbsrsv_solve(). It\\n  is expected that this function will be executed only once for a given matrix and\\n  particular operation type. The analysis meta data can be cleared by\\n  rocsparse_bsrsv_clear().\\n\\n  \\\\p rocsparse_bsrsv_analysis can share its meta data with\\n  rocsparse_sbsrsm_analysis(), rocsparse_dbsrsm_analysis(),\\n  rocsparse_cbsrsm_analysis(), rocsparse_zbsrsm_analysis(),\\n  rocsparse_sbsrilu0_analysis(), rocsparse_dbsrilu0_analysis(),\\n  rocsparse_cbsrilu0_analysis(), rocsparse_zbsrilu0_analysis(),\\n  rocsparse_sbsric0_analysis(), rocsparse_dbsric0_analysis(),\\n  rocsparse_cbsric0_analysis() and rocsparse_zbsric0_analysis(). Selecting\\n  \\\\ref rocsparse_analysis_policy_reuse policy can greatly improve computation\\n  performance of meta data. However, the user need to make sure that the sparsity\\n  pattern remains unchanged. If this cannot be assured,\\n  \\\\ref rocsparse_analysis_policy_force has to be used.\\n\\n  \\\\note\\n  If the matrix sparsity pattern changes, the gathered information will become invalid.\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  dir         matrix storage of BSR blocks.\\n  @param[in]\\n  trans       matrix operation type.\\n  @param[in]\\n  mb          number of block rows of the sparse BSR matrix.\\n  @param[in]\\n  nnzb        number of non-zero blocks of the sparse BSR matrix.\\n  @param[in]\\n  descr       descriptor of the sparse BSR matrix.\\n  @param[in]\\n  bsr_val     array of \\\\p nnzb blocks of the sparse BSR matrix.\\n  @param[in]\\n  bsr_row_ptr array of \\\\p mb+1 elements that point to the start of every block row of\\n              the sparse BSR matrix.\\n  @param[in]\\n  bsr_col_ind array of \\\\p nnz containing the block column indices of the sparse\\n              BSR matrix.\\n  @param[in]\\n  block_dim     block dimension of the sparse BSR matrix.\\n  @param[out]\\n  info        structure that holds the information collected during\\n              the analysis step.\\n  @param[in]\\n  analysis    \\\\ref rocsparse_analysis_policy_reuse or\\n              \\\\ref rocsparse_analysis_policy_force.\\n  @param[in]\\n  solve       \\\\ref rocsparse_solve_policy_auto.\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p mb, \\\\p nnzb or \\\\p block_dim is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p bsr_row_ptr,\\n              \\\\p bsr_col_ind, \\\\p info or \\\\p temp_buffer pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p trans == \\\\ref rocsparse_operation_conjugate_transpose or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_sbsrsv_analysis(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f32,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dbsrsv_analysis(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f64,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cbsrsv_analysis(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_float_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zbsrsv_analysis(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_double_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup level2_module\n  \\brief Sparse triangular solve using BSR storage format\n\n  \\details\n  \\p rocsparse_bsrsv_clear deallocates all memory that was allocated by\n  rocsparse_sbsrsv_analysis(), rocsparse_dbsrsv_analysis(), rocsparse_cbsrsv_analysis()\n  or rocsparse_zbsrsv_analysis(). This is especially useful, if memory is an issue and\n  the analysis data is not required for further computation, e.g. when switching to\n  another sparse matrix format. Calling \\p rocsparse_bsrsv_clear is optional. All\n  allocated resources will be cleared, when the opaque \\ref rocsparse_mat_info struct\n  is destroyed using rocsparse_destroy_mat_info().\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[inout]\n  info        structure that holds the information collected during the analysis step.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_pointer \\p info pointer is invalid.\n  \\retval     rocsparse_status_memory_error the buffer holding the meta data could not\n              be deallocated.\n  \\retval     rocsparse_status_internal_error an internal error occurred.*/\n    pub fn rocsparse_bsrsv_clear(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level2_module\\n  \\\\brief Sparse triangular solve using BSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_bsrsv_solve solves a sparse triangular linear system of a sparse\\n  \\\\f$m \\\\times m\\\\f$ matrix, defined in BSR storage format, a dense solution vector\\n  \\\\f$y\\\\f$ and the right-hand side \\\\f$x\\\\f$ that is multiplied by \\\\f$\\\\alpha\\\\f$, such that\\n  \\\\f[\\n    op(A) \\\\cdot y = \\\\alpha \\\\cdot x,\\n  \\\\f]\\n  with\\n  \\\\f[\\n    op(A) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        A,   & \\\\text{if trans == rocsparse_operation_none} \\\\\\\\\\n        A^T, & \\\\text{if trans == rocsparse_operation_transpose} \\\\\\\\\\n        A^H, & \\\\text{if trans == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n\\n  \\\\p rocsparse_bsrsv_solve requires a user allocated temporary buffer. Its size is\\n  returned by rocsparse_sbsrsv_buffer_size(), rocsparse_dbsrsv_buffer_size(),\\n  rocsparse_cbsrsv_buffer_size() or rocsparse_zbsrsv_buffer_size(). Furthermore,\\n  analysis meta data is required. It can be obtained by rocsparse_sbsrsv_analysis(),\\n  rocsparse_dbsrsv_analysis(), rocsparse_cbsrsv_analysis() or\\n  rocsparse_zbsrsv_analysis(). \\\\p rocsparse_bsrsv_solve reports the first zero pivot\\n  (either numerical or structural zero). The zero pivot status can be checked calling\\n  rocsparse_bsrsv_zero_pivot(). If\\n  \\\\ref rocsparse_diag_type == \\\\ref rocsparse_diag_type_unit, no zero pivot will be\\n  reported, even if \\\\f$A_{j,j} = 0\\\\f$ for some \\\\f$j\\\\f$.\\n\\n  \\\\note\\n  The sparse BSR matrix has to be sorted.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  Currently, only \\\\p trans == \\\\ref rocsparse_operation_none and\\n  \\\\p trans == \\\\ref rocsparse_operation_transpose is supported.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  dir         matrix storage of BSR blocks.\\n  @param[in]\\n  trans       matrix operation type.\\n  @param[in]\\n  mb          number of block rows of the sparse BSR matrix.\\n  @param[in]\\n  nnzb        number of non-zero blocks of the sparse BSR matrix.\\n  @param[in]\\n  alpha       scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  descr       descriptor of the sparse BSR matrix.\\n  @param[in]\\n  bsr_val     array of \\\\p nnzb blocks of the sparse BSR matrix.\\n  @param[in]\\n  bsr_row_ptr array of \\\\p mb+1 elements that point to the start of every block row of\\n              the sparse BSR matrix.\\n  @param[in]\\n  bsr_col_ind array of \\\\p nnz containing the block column indices of the sparse\\n              BSR matrix.\\n  @param[in]\\n  block_dim     block dimension of the sparse BSR matrix.\\n  @param[in]\\n  info        structure that holds the information collected during the analysis step.\\n  @param[in]\\n  x           array of \\\\p m elements, holding the right-hand side.\\n  @param[out]\\n  y           array of \\\\p m elements, holding the solution.\\n  @param[in]\\n  policy      \\\\ref rocsparse_solve_policy_auto.\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p mb, \\\\p nnzb or \\\\p block_dim is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p alpha, \\\\p bsr_val,\\n              \\\\p bsr_row_ptr, \\\\p bsr_col_ind, \\\\p x or \\\\p y pointer is invalid.\\n  \\\\retval     rocsparse_status_arch_mismatch the device is not supported.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p trans == \\\\ref rocsparse_operation_conjugate_transpose or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n\\n  \\\\par Example\\n  Consider the lower triangular \\\\f$m \\\\times m\\\\f$ matrix \\\\f$L\\\\f$, stored in BSR\\n  storage format with unit diagonal. The following example solves \\\\f$L \\\\cdot y = x\\\\f$.\\n  \\\\code{.c}\\n      // Create rocSPARSE handle\\n      rocsparse_handle handle;\\n      rocsparse_create_handle(&handle);\\n\\n      // Create matrix descriptor\\n      rocsparse_mat_descr descr;\\n      rocsparse_create_mat_descr(&descr);\\n      rocsparse_set_mat_fill_mode(descr, rocsparse_fill_mode_lower);\\n      rocsparse_set_mat_diag_type(descr, rocsparse_diag_type_unit);\\n\\n      // Create matrix info structure\\n      rocsparse_mat_info info;\\n      rocsparse_create_mat_info(&info);\\n\\n      // Obtain required buffer size\\n      size_t buffer_size;\\n      rocsparse_dbsrsv_buffer_size(handle,\\n                                   rocsparse_direction_column,\\n                                   rocsparse_operation_none,\\n                                   mb,\\n                                   nnzb,\\n                                   descr,\\n                                   bsr_val,\\n                                   bsr_row_ptr,\\n                                   bsr_col_ind,\\n                                   block_dim,\\n                                   info,\\n                                   &buffer_size);\\n\\n      // Allocate temporary buffer\\n      void* temp_buffer;\\n      hipMalloc(&temp_buffer, buffer_size);\\n\\n      // Perform analysis step\\n      rocsparse_dbsrsv_analysis(handle,\\n                                rocsparse_direction_column,\\n                                rocsparse_operation_none,\\n                                mb,\\n                                nnzb,\\n                                descr,\\n                                bsr_val,\\n                                bsr_row_ptr,\\n                                bsr_col_ind,\\n                                block_dim,\\n                                info,\\n                                rocsparse_analysis_policy_reuse,\\n                                rocsparse_solve_policy_auto,\\n                                temp_buffer);\\n\\n      // Solve Ly = x\\n      rocsparse_dbsrsv_solve(handle,\\n                             rocsparse_direction_column,\\n                             rocsparse_operation_none,\\n                             mb,\\n                             nnzb,\\n                             &alpha,\\n                             descr,\\n                             bsr_val,\\n                             bsr_row_ptr,\\n                             bsr_col_ind,\\n                             block_dim,\\n                             info,\\n                             x,\\n                             y,\\n                             rocsparse_solve_policy_auto,\\n                             temp_buffer);\\n\\n      // No zero pivot should be found, with L having unit diagonal\\n\\n      // Clean up\\n      hipFree(temp_buffer);\\n      rocsparse_destroy_mat_info(info);\\n      rocsparse_destroy_mat_descr(descr);\\n      rocsparse_destroy_handle(handle);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_sbsrsv_solve(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const f32,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f32,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        x: *const f32,\n        y: *mut f32,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dbsrsv_solve(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const f64,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f64,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        x: *const f64,\n        y: *mut f64,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cbsrsv_solve(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const rocsparse_float_complex,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_float_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        x: *const rocsparse_float_complex,\n        y: *mut rocsparse_float_complex,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zbsrsv_solve(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const rocsparse_double_complex,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_double_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        x: *const rocsparse_double_complex,\n        y: *mut rocsparse_double_complex,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level2_module\\n  \\\\brief Sparse matrix vector multiplication with mask operation using BSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_bsrxmv multiplies the scalar \\\\f$\\\\alpha\\\\f$ with a sparse\\n  \\\\f$(mb \\\\cdot \\\\text{block_dim}) \\\\times (nb \\\\cdot \\\\text{block_dim})\\\\f$\\n  modified matrix, defined in BSR storage format, and the dense vector \\\\f$x\\\\f$ and adds the\\n  result to the dense vector \\\\f$y\\\\f$ that is multiplied by the scalar \\\\f$\\\\beta\\\\f$,\\n  such that\\n  \\\\f[\\n    y := \\\\left( \\\\alpha \\\\cdot op(A) \\\\cdot x + \\\\beta \\\\cdot y \\\\right)\\\\left( \\\\text{mask} \\\\right),\\n  \\\\f]\\n  with\\n  \\\\f[\\n    op(A) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        A,   & \\\\text{if trans == rocsparse_operation_none} \\\\\\\\\\n        A^T, & \\\\text{if trans == rocsparse_operation_transpose} \\\\\\\\\\n        A^H, & \\\\text{if trans == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n\\n  The \\\\f$\\\\text{mask}\\\\f$ is defined as an array of block row indices.\\n  The input sparse matrix is defined with a modified BSR storage format where the beginning and the end of each row\\n  is defined with two arrays, \\\\p bsr_row_ptr and \\\\p bsr_end_ptr (both of size \\\\p mb), rather the usual \\\\p bsr_row_ptr of size \\\\p mb+1.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  Currently, only \\\\p trans == \\\\ref rocsparse_operation_none is supported.\\n  Currently, \\\\p block_dim==1 is not supported.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  dir         matrix storage of BSR blocks.\\n  @param[in]\\n  trans       matrix operation type.\\n  @param[in]\\n  size_of_mask number of updated block rows of the array \\\\p y.\\n  @param[in]\\n  mb          number of block rows of the sparse BSR matrix.\\n  @param[in]\\n  nb          number of block columns of the sparse BSR matrix.\\n  @param[in]\\n  nnzb        number of non-zero blocks of the sparse BSR matrix.\\n  @param[in]\\n  alpha       scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  descr       descriptor of the sparse BSR matrix. Currently, only\\n              \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  bsr_val     array of \\\\p nnzb blocks of the sparse BSR matrix.\\n\\n  @param[in]\\n  bsr_mask_ptr array of \\\\p size_of_mask elements that give the indices of the updated block rows.\\n\\n  @param[in]\\n  bsr_row_ptr array of \\\\p mb elements that point to the start of every block row of\\n              the sparse BSR matrix.\\n  @param[in]\\n  bsr_end_ptr array of \\\\p mb elements that point to the end of every block row of\\n              the sparse BSR matrix.\\n  @param[in]\\n  bsr_col_ind array of \\\\p nnzb elements containing the block column indices of the sparse\\n              BSR matrix.\\n  @param[in]\\n  block_dim     block dimension of the sparse BSR matrix.\\n  @param[in]\\n  x           array of \\\\p nb*block_dim elements (\\\\f$op(A) = A\\\\f$) or \\\\p mb*block_dim\\n              elements (\\\\f$op(A) = A^T\\\\f$ or \\\\f$op(A) = A^H\\\\f$).\\n  @param[in]\\n  beta        scalar \\\\f$\\\\beta\\\\f$.\\n  @param[inout]\\n  y           array of \\\\p mb*block_dim elements (\\\\f$op(A) = A\\\\f$) or \\\\p nb*block_dim\\n              elements (\\\\f$op(A) = A^T\\\\f$ or \\\\f$op(A) = A^H\\\\f$).\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p mb, \\\\p nb, \\\\p nnzb, \\\\p block_dim or \\\\p size_of_mask is\\n              invalid.\\n  \\\\retval     rocsparse_status_invalid_value \\\\p size_of_mask is greater than \\\\p mb.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p alpha, \\\\p bsr_val,\\n              \\\\p bsr_row_ind, \\\\p bsr_col_ind, \\\\p x, \\\\p beta or \\\\p y pointer is invalid.\\n  \\\\retval     rocsparse_status_arch_mismatch the device is not supported.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p block_dim==1, \\\\p trans != \\\\ref rocsparse_operation_none or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_sbsrxmv(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        size_of_mask: rocsparse_int,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const f32,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f32,\n        bsr_mask_ptr: *const rocsparse_int,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_end_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        x: *const f32,\n        beta: *const f32,\n        y: *mut f32,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dbsrxmv(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        size_of_mask: rocsparse_int,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const f64,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f64,\n        bsr_mask_ptr: *const rocsparse_int,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_end_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        x: *const f64,\n        beta: *const f64,\n        y: *mut f64,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cbsrxmv(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        size_of_mask: rocsparse_int,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const rocsparse_float_complex,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_float_complex,\n        bsr_mask_ptr: *const rocsparse_int,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_end_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        x: *const rocsparse_float_complex,\n        beta: *const rocsparse_float_complex,\n        y: *mut rocsparse_float_complex,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zbsrxmv(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        size_of_mask: rocsparse_int,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const rocsparse_double_complex,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_double_complex,\n        bsr_mask_ptr: *const rocsparse_int,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_end_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        x: *const rocsparse_double_complex,\n        beta: *const rocsparse_double_complex,\n        y: *mut rocsparse_double_complex,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level2_module\\n  \\\\brief Sparse matrix vector multiplication using COO storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_coomv multiplies the scalar \\\\f$\\\\alpha\\\\f$ with a sparse \\\\f$m \\\\times n\\\\f$\\n  matrix, defined in COO storage format, and the dense vector \\\\f$x\\\\f$ and adds the\\n  result to the dense vector \\\\f$y\\\\f$ that is multiplied by the scalar \\\\f$\\\\beta\\\\f$,\\n  such that\\n  \\\\f[\\n    y := \\\\alpha \\\\cdot op(A) \\\\cdot x + \\\\beta \\\\cdot y,\\n  \\\\f]\\n  with\\n  \\\\f[\\n    op(A) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        A,   & \\\\text{if trans == rocsparse_operation_none} \\\\\\\\\\n        A^T, & \\\\text{if trans == rocsparse_operation_transpose} \\\\\\\\\\n        A^H, & \\\\text{if trans == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n\\n  The COO matrix has to be sorted by row indices. This can be achieved by using\\n  rocsparse_coosort_by_row().\\n\\n  \\\\code{.c}\\n      for(i = 0; i < m; ++i)\\n      {\\n          y[i] = beta * y[i];\\n      }\\n\\n      for(i = 0; i < nnz; ++i)\\n      {\\n          y[coo_row_ind[i]] += alpha * coo_val[i] * x[coo_col_ind[i]];\\n      }\\n  \\\\endcode\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  trans       matrix operation type.\\n  @param[in]\\n  m           number of rows of the sparse COO matrix.\\n  @param[in]\\n  n           number of columns of the sparse COO matrix.\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse COO matrix.\\n  @param[in]\\n  alpha       scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  descr       descriptor of the sparse COO matrix. Currently, only\\n              \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  coo_val     array of \\\\p nnz elements of the sparse COO matrix.\\n  @param[in]\\n  coo_row_ind array of \\\\p nnz elements containing the row indices of the sparse COO\\n              matrix.\\n  @param[in]\\n  coo_col_ind array of \\\\p nnz elements containing the column indices of the sparse\\n              COO matrix.\\n  @param[in]\\n  x           array of \\\\p n elements (\\\\f$op(A) = A\\\\f$) or \\\\p m elements\\n              (\\\\f$op(A) = A^T\\\\f$ or \\\\f$op(A) = A^H\\\\f$).\\n  @param[in]\\n  beta        scalar \\\\f$\\\\beta\\\\f$.\\n  @param[inout]\\n  y           array of \\\\p m elements (\\\\f$op(A) = A\\\\f$) or \\\\p n elements\\n              (\\\\f$op(A) = A^T\\\\f$ or \\\\f$op(A) = A^H\\\\f$).\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m, \\\\p n or \\\\p nnz is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p alpha, \\\\p coo_val,\\n              \\\\p coo_row_ind, \\\\p coo_col_ind, \\\\p x, \\\\p beta or \\\\p y pointer is invalid.\\n  \\\\retval     rocsparse_status_arch_mismatch the device is not supported.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_scoomv(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const f32,\n        descr: rocsparse_mat_descr,\n        coo_val: *const f32,\n        coo_row_ind: *const rocsparse_int,\n        coo_col_ind: *const rocsparse_int,\n        x: *const f32,\n        beta: *const f32,\n        y: *mut f32,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcoomv(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const f64,\n        descr: rocsparse_mat_descr,\n        coo_val: *const f64,\n        coo_row_ind: *const rocsparse_int,\n        coo_col_ind: *const rocsparse_int,\n        x: *const f64,\n        beta: *const f64,\n        y: *mut f64,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccoomv(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const rocsparse_float_complex,\n        descr: rocsparse_mat_descr,\n        coo_val: *const rocsparse_float_complex,\n        coo_row_ind: *const rocsparse_int,\n        coo_col_ind: *const rocsparse_int,\n        x: *const rocsparse_float_complex,\n        beta: *const rocsparse_float_complex,\n        y: *mut rocsparse_float_complex,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcoomv(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const rocsparse_double_complex,\n        descr: rocsparse_mat_descr,\n        coo_val: *const rocsparse_double_complex,\n        coo_row_ind: *const rocsparse_int,\n        coo_col_ind: *const rocsparse_int,\n        x: *const rocsparse_double_complex,\n        beta: *const rocsparse_double_complex,\n        y: *mut rocsparse_double_complex,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup level2_module\n  \\brief Sparse iterative triangular solve using CSR storage format\n\n  \\details\n  \\p rocsparse_csritsv_zero_pivot returns \\ref rocsparse_status_zero_pivot, if either a\n  structural or numerical zero has been found during rocsparse_csritsv_solve() and or rocsparse_csritsv_analysis(),\n  execution. The first zero pivot \\f$j\\f$ at \\f$A_{j,j}\\f$ is stored in \\p position,\n  using same index base as the CSR matrix.\n\n  \\p position can be in host or device memory. If no zero pivot has been found,\n  \\p position is set to -1 and \\ref rocsparse_status_success is returned instead.\n\n  \\note \\p rocsparse_csritsv_zero_pivot is a blocking function. It might influence\n  performance negatively.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[in]\n  descr       descriptor of the sparse CSR matrix.\n  @param[in]\n  info        structure that holds the information collected during the analysis step.\n  @param[inout]\n  position    pointer to zero pivot \\f$j\\f$, can be in host or device memory.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_pointer \\p info or \\p position pointer is\n              invalid.\n  \\retval     rocsparse_status_internal_error an internal error occurred.\n  \\retval     rocsparse_status_zero_pivot zero pivot has been found.*/\n    pub fn rocsparse_csritsv_zero_pivot(\n        handle: rocsparse_handle,\n        descr: rocsparse_mat_descr,\n        info: rocsparse_mat_info,\n        position: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level2_module\\n  \\\\brief Sparse iterative triangular solve using CSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_csritsv_buffer_size returns the size of the temporary storage buffer that\\n  is required by rocsparse_scsritsv_analysis(), rocsparse_dcsritsv_analysis(),\\n  rocsparse_ccsritsv_analysis(), rocsparse_zcsritsv_analysis(), rocsparse_scsritsv_solve(),\\n  rocsparse_dcsritsv_solve(), rocsparse_ccsritsv_solve() and rocsparse_zcsritsv_solve(). The\\n  temporary storage buffer must be allocated by the user.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  trans       matrix operation type.\\n  @param[in]\\n  m           number of rows of the sparse CSR matrix.\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse CSR matrix.\\n  @param[in]\\n  descr       descriptor of the sparse CSR matrix.\\n  @param[in]\\n  csr_val     array of \\\\p nnz elements of the sparse CSR matrix.\\n  @param[in]\\n  csr_row_ptr array of \\\\p m+1 elements that point to the start of every row of the\\n              sparse CSR matrix.\\n  @param[in]\\n  csr_col_ind array of \\\\p nnz elements containing the column indices of the sparse\\n              CSR matrix.\\n  @param[out]\\n  info        structure that holds the information collected during the analysis step.\\n  @param[out]\\n  buffer_size number of bytes of the temporary storage buffer required by\\n              rocsparse_scsritsv_analysis(), rocsparse_dcsritsv_analysis(),\\n              rocsparse_ccsritsv_analysis(), rocsparse_zcsritsv_analysis(),\\n              rocsparse_scsritsv_solve(), rocsparse_dcsritsv_solve(),\\n              rocsparse_ccsritsv_solve() and rocsparse_zcsritsv_solve().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p nnz is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p csr_val, \\\\p csr_row_ptr,\\n              \\\\p csr_col_ind, \\\\p info or \\\\p buffer_size pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general and \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_triangular.\\n/\\n/**@{\"]\n    pub fn rocsparse_scsritsv_buffer_size(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsritsv_buffer_size(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsritsv_buffer_size(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsritsv_buffer_size(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level2_module\\n  \\\\brief Sparse iterative triangular solve using CSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_csritsv_analysis performs the analysis step for rocsparse_scsritsv_solve(),\\n  rocsparse_dcsritsv_solve(), rocsparse_ccsritsv_solve() and rocsparse_zcsritsv_solve(). It\\n  is expected that this function will be executed only once for a given matrix and\\n  particular operation type. The analysis meta data can be cleared by\\n  rocsparse_csritsv_clear().\\n\\n   Selecting\\n  \\\\ref rocsparse_analysis_policy_reuse policy can greatly improve computation\\n  performance of meta data. However, the user need to make sure that the sparsity\\n  pattern remains unchanged. If this cannot be assured,\\n  \\\\ref rocsparse_analysis_policy_force has to be used.\\n\\n  \\\\note\\n  If the matrix sparsity pattern changes, the gathered information will become invalid.\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  trans       matrix operation type.\\n  @param[in]\\n  m           number of rows of the sparse CSR matrix.\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse CSR matrix.\\n  @param[in]\\n  descr       descriptor of the sparse CSR matrix.\\n  @param[in]\\n  csr_val     array of \\\\p nnz elements of the sparse CSR matrix.\\n  @param[in]\\n  csr_row_ptr array of \\\\p m+1 elements that point to the start of every row of the\\n              sparse CSR matrix.\\n  @param[in]\\n  csr_col_ind array of \\\\p nnz elements containing the column indices of the sparse\\n              CSR matrix.\\n  @param[out]\\n  info        structure that holds the information collected during\\n              the analysis step.\\n  @param[in]\\n  analysis    \\\\ref rocsparse_analysis_policy_reuse or\\n              \\\\ref rocsparse_analysis_policy_force.\\n  @param[in]\\n  solve       \\\\ref rocsparse_solve_policy_auto.\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p nnz is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p csr_row_ptr,\\n              \\\\p csr_col_ind, \\\\p info or \\\\p temp_buffer pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general and \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_triangular.\\n/\\n/**@{\"]\n    pub fn rocsparse_scsritsv_analysis(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsritsv_analysis(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsritsv_analysis(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsritsv_analysis(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \"@}*/\\n/*! \\\\ingroup level2_module\\n  \\\\brief Sparse triangular solve using CSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_csritsv_clear deallocates all memory that was allocated by\\n  rocsparse_scsritsv_analysis(), rocsparse_dcsritsv_analysis(), rocsparse_ccsritsv_analysis()\\n  or rocsparse_zcsritsv_analysis(). This is especially useful, if memory is an issue and\\n  the analysis data is not required for further computation, e.g. when switching to\\n  another sparse matrix format. Calling \\\\p rocsparse_csritsv_clear is optional. All\\n  allocated resources will be cleared, when the opaque \\\\ref rocsparse_mat_info struct\\n  is destroyed using rocsparse_destroy_mat_info().\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  descr       descriptor of the sparse CSR matrix.\\n  @param[inout]\\n  info        structure that holds the information collected during the analysis step.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p info pointer is invalid.\\n  \\\\retval     rocsparse_status_memory_error the buffer holding the meta data could not\\n              be deallocated.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\"]\n    pub fn rocsparse_csritsv_clear(\n        handle: rocsparse_handle,\n        descr: rocsparse_mat_descr,\n        info: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level2_module\\n  \\\\brief Sparse iterative triangular solve using CSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_csritsv_solve solves iteratively with the use of the Jacobi method a sparse triangular linear system of a sparse\\n  \\\\f$m \\\\times m\\\\f$ matrix, defined in CSR storage format, a dense solution vector\\n  \\\\f$y\\\\f$ and the right-hand side \\\\f$x\\\\f$ that is multiplied by \\\\f$\\\\alpha\\\\f$, such that\\n  \\\\f[\\n    op(A) \\\\cdot y = \\\\alpha \\\\cdot x,\\n  \\\\f]\\n  with\\n  \\\\f[\\n    op(A) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        A,   & \\\\text{if trans == rocsparse_operation_none} \\\\\\\\\\n        A^T, & \\\\text{if trans == rocsparse_operation_transpose} \\\\\\\\\\n        A^H, & \\\\text{if trans == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n\\n  \\\\p rocsparse_csritsv_solve requires a user allocated temporary buffer. Its size is\\n  returned by rocsparse_scsritsv_buffer_size(), rocsparse_dcsritsv_buffer_size(),\\n  rocsparse_ccsritsv_buffer_size() or rocsparse_zcsritsv_buffer_size(). Furthermore,\\n  analysis meta data is required. It can be obtained by rocsparse_scsritsv_analysis(),\\n  rocsparse_dcsritsv_analysis(), rocsparse_ccsritsv_analysis() or\\n  rocsparse_zcsritsv_analysis(). \\\\p rocsparse_csritsv_solve reports the first zero pivot\\n  (either numerical or structural zero). The zero pivot status can be checked calling\\n  rocsparse_csritsv_zero_pivot(). If\\n  \\\\ref rocsparse_diag_type == \\\\ref rocsparse_diag_type_unit, no zero pivot will be\\n  reported, even if \\\\f$A_{j,j} = 0\\\\f$ for some \\\\f$j\\\\f$.\\n\\n  \\\\note\\n  The sparse CSR matrix has to be sorted. This can be achieved by calling\\n  rocsparse_csrsort().\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[inout]\\n  host_nmaxiter     maximum number of iteration on input and maximum number of iteration on output.\\n  @param[in]\\n  host_tol          if the pointer is null then loop will execute \\\\p nmaxiter[0] iterations.\\n  @param[out]\\n  host_history      (optional, record history)\\n  @param[in]\\n  trans       matrix operation type.\\n  @param[in]\\n  m           number of rows of the sparse CSR matrix.\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse CSR matrix.\\n  @param[in]\\n  alpha       scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  descr       descriptor of the sparse CSR matrix.\\n  @param[in]\\n  csr_val     array of \\\\p nnz elements of the sparse CSR matrix.\\n  @param[in]\\n  csr_row_ptr array of \\\\p m+1 elements that point to the start\\n              of every row of the sparse CSR matrix.\\n  @param[in]\\n  csr_col_ind array of \\\\p nnz elements containing the column indices of the sparse\\n              CSR matrix.\\n  @param[in]\\n  info        structure that holds the information collected during the analysis step.\\n  @param[in]\\n  x           array of \\\\p m elements, holding the right-hand side.\\n  @param[out]\\n  y           array of \\\\p m elements, holding the solution.\\n  @param[in]\\n  policy      \\\\ref rocsparse_solve_policy_auto.\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p nnz is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p alpha, \\\\p csr_val,\\n              \\\\p csr_row_ptr, \\\\p csr_col_ind, \\\\p x or \\\\p y pointer is invalid.\\n  \\\\retval     rocsparse_status_arch_mismatch the device is not supported.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general and \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_triangular.\\n\\n  \\\\par Example\\n  Consider the lower triangular \\\\f$m \\\\times m\\\\f$ matrix \\\\f$L\\\\f$, stored in CSR\\n  storage format with unit diagonal. The following example solves \\\\f$L \\\\cdot y = x\\\\f$.\\n  \\\\code{.c}\\n      // Create rocSPARSE handle\\n      rocsparse_handle handle;\\n      rocsparse_create_handle(&handle);\\n\\n      // Create matrix descriptor\\n      rocsparse_mat_descr descr;\\n      rocsparse_create_mat_descr(&descr);\\n      rocsparse_set_mat_fill_mode(descr, rocsparse_fill_mode_lower);\\n      rocsparse_set_mat_diag_type(descr, rocsparse_diag_type_unit);\\n\\n      // Create matrix info structure\\n      rocsparse_mat_info info;\\n      rocsparse_create_mat_info(&info);\\n\\n      // Obtain required buffer size\\n      size_t buffer_size;\\n      rocsparse_dcsritsv_buffer_size(handle,\\n                                   rocsparse_operation_none,\\n                                   m,\\n                                   nnz,\\n                                   descr,\\n                                   csr_val,\\n                                   csr_row_ptr,\\n                                   csr_col_ind,\\n                                   info,\\n                                   &buffer_size);\\n\\n      // Allocate temporary buffer\\n      void* temp_buffer;\\n      hipMalloc(&temp_buffer, buffer_size);\\n\\n      // Perform analysis step\\n      rocsparse_dcsritsv_analysis(handle,\\n                                rocsparse_operation_none,\\n                                m,\\n                                nnz,\\n                                descr,\\n                                csr_val,\\n                                csr_row_ptr,\\n                                csr_col_ind,\\n                                info,\\n                                rocsparse_analysis_policy_reuse,\\n                                rocsparse_solve_policy_auto,\\n                                temp_buffer);\\n\\n      // Solve Ly = x\\n      rocsparse_int nmaxiter = 200;\\n      rocsparse_int maxiter = nmaxiter;\\n      tol = 1.0e-4;\\n      history[200];\\n      rocsparse_dcsritsv_solve(handle,\\n                             &maxiter,\\n                             &tol,\\n                             history,\\n                             rocsparse_operation_none,\\n                             m,\\n                             nnz,\\n                             &alpha,\\n                             descr,\\n                             csr_val,\\n                             csr_row_ptr,\\n                             csr_col_ind,\\n                             info,\\n                             x,\\n                             y,\\n                             rocsparse_solve_policy_auto,\\n                             temp_buffer);\\n\\n      if (maxiter < nmaxiter) {} // convergence\\n      else {} // non converged\\n      for (int i=0;i<maxiter;++i) printf(\\\"iter = %d, max residual=%e\\\\n\\\", iter, history[i]);\\n      // No zero pivot should be found, with L having unit diagonal\\n\\n      // Clean up\\n      hipFree(temp_buffer);\\n      rocsparse_destroy_mat_info(info);\\n      rocsparse_destroy_mat_descr(descr);\\n      rocsparse_destroy_handle(handle);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_scsritsv_solve(\n        handle: rocsparse_handle,\n        host_nmaxiter: *mut rocsparse_int,\n        host_tol: *const f32,\n        host_history: *mut f32,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const f32,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        x: *const f32,\n        y: *mut f32,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsritsv_solve(\n        handle: rocsparse_handle,\n        host_nmaxiter: *mut rocsparse_int,\n        host_tol: *const f64,\n        host_history: *mut f64,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const f64,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        x: *const f64,\n        y: *mut f64,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsritsv_solve(\n        handle: rocsparse_handle,\n        host_nmaxiter: *mut rocsparse_int,\n        host_tol: *const f32,\n        host_history: *mut f32,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const rocsparse_float_complex,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        x: *const rocsparse_float_complex,\n        y: *mut rocsparse_float_complex,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsritsv_solve(\n        handle: rocsparse_handle,\n        host_nmaxiter: *mut rocsparse_int,\n        host_tol: *const f64,\n        host_history: *mut f64,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const rocsparse_double_complex,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        x: *const rocsparse_double_complex,\n        y: *mut rocsparse_double_complex,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level2_module\\n  \\\\brief Sparse matrix vector multiplication using CSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_csrmv_analysis performs the analysis step for rocsparse_scsrmv(),\\n  rocsparse_dcsrmv(), rocsparse_ccsrmv() and rocsparse_zcsrmv(). It is expected that\\n  this function will be executed only once for a given matrix and particular operation\\n  type. The gathered analysis meta data can be cleared by rocsparse_csrmv_clear().\\n\\n  \\\\note\\n  If the matrix sparsity pattern changes, the gathered information will become invalid.\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  trans       matrix operation type.\\n  @param[in]\\n  m           number of rows of the sparse CSR matrix.\\n  @param[in]\\n  n           number of columns of the sparse CSR matrix.\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse CSR matrix.\\n  @param[in]\\n  descr       descriptor of the sparse CSR matrix.\\n  @param[in]\\n  csr_val     array of \\\\p nnz elements of the sparse CSR matrix.\\n  @param[in]\\n  csr_row_ptr array of \\\\p m+1 elements that point to the start of every row of the\\n              sparse CSR matrix.\\n  @param[in]\\n  csr_col_ind array of \\\\p nnz elements containing the column indices of the sparse\\n              CSR matrix.\\n  @param[out]\\n  info        structure that holds the information collected during the analysis step.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m, \\\\p n or \\\\p nnz is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p csr_val, \\\\p csr_row_ptr,\\n              \\\\p csr_col_ind or \\\\p info pointer is invalid.\\n  \\\\retval     rocsparse_status_memory_error the buffer for the gathered information\\n              could not be allocated.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented if \\\\ref rocsparse_matrix_type is not one of\\n              \\\\ref rocsparse_matrix_type_general, \\\\ref rocsparse_matrix_type_symmetric, or\\n              \\\\ref rocsparse_matrix_type_triangular.\\n/\\n/**@{\"]\n    pub fn rocsparse_scsrmv_analysis(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsrmv_analysis(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsrmv_analysis(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsrmv_analysis(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup level2_module\n  \\brief Sparse matrix vector multiplication using CSR storage format\n\n  \\details\n  \\p rocsparse_csrmv_clear deallocates all memory that was allocated by\n  rocsparse_scsrmv_analysis(), rocsparse_dcsrmv_analysis(), rocsparse_ccsrmv_analysis()\n  or rocsparse_zcsrmv_analysis(). This is especially useful, if memory is an issue and\n  the analysis data is not required anymore for further computation, e.g. when\n  switching to another sparse matrix format.\n\n  \\note\n  Calling \\p rocsparse_csrmv_clear is optional. All allocated resources will be\n  cleared, when the opaque \\ref rocsparse_mat_info struct is destroyed using\n  rocsparse_destroy_mat_info().\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[inout]\n  info        structure that holds the information collected during analysis step.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_pointer \\p info pointer is invalid.\n  \\retval     rocsparse_status_memory_error the buffer for the gathered information\n              could not be deallocated.\n  \\retval     rocsparse_status_internal_error an internal error occurred.*/\n    pub fn rocsparse_csrmv_clear(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level2_module\\n  \\\\brief Sparse matrix vector multiplication using CSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_csrmv multiplies the scalar \\\\f$\\\\alpha\\\\f$ with a sparse \\\\f$m \\\\times n\\\\f$\\n  matrix, defined in CSR storage format, and the dense vector \\\\f$x\\\\f$ and adds the\\n  result to the dense vector \\\\f$y\\\\f$ that is multiplied by the scalar \\\\f$\\\\beta\\\\f$,\\n  such that\\n  \\\\f[\\n    y := \\\\alpha \\\\cdot op(A) \\\\cdot x + \\\\beta \\\\cdot y,\\n  \\\\f]\\n  with\\n  \\\\f[\\n    op(A) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        A,   & \\\\text{if trans == rocsparse_operation_none} \\\\\\\\\\n        A^T, & \\\\text{if trans == rocsparse_operation_transpose} \\\\\\\\\\n        A^H, & \\\\text{if trans == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n\\n  The \\\\p info parameter is optional and contains information collected by\\n  rocsparse_scsrmv_analysis(), rocsparse_dcsrmv_analysis(), rocsparse_ccsrmv_analysis()\\n  or rocsparse_zcsrmv_analysis(). If present, the information will be used to speed up\\n  the \\\\p csrmv computation. If \\\\p info == \\\\p NULL, general \\\\p csrmv routine will be\\n  used instead.\\n\\n  \\\\code{.c}\\n      for(i = 0; i < m; ++i)\\n      {\\n          y[i] = beta * y[i];\\n\\n          for(j = csr_row_ptr[i]; j < csr_row_ptr[i + 1]; ++j)\\n          {\\n              y[i] = y[i] + alpha * csr_val[j] * x[csr_col_ind[j]];\\n          }\\n      }\\n  \\\\endcode\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  trans       matrix operation type.\\n  @param[in]\\n  m           number of rows of the sparse CSR matrix.\\n  @param[in]\\n  n           number of columns of the sparse CSR matrix.\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse CSR matrix.\\n  @param[in]\\n  alpha       scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  descr       descriptor of the sparse CSR matrix. Currently, only\\n              \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  csr_val     array of \\\\p nnz elements of the sparse CSR matrix.\\n  @param[in]\\n  csr_row_ptr array of \\\\p m+1 elements that point to the start\\n              of every row of the sparse CSR matrix.\\n  @param[in]\\n  csr_col_ind array of \\\\p nnz elements containing the column indices of the sparse\\n              CSR matrix.\\n  @param[in]\\n  info        information collected by rocsparse_scsrmv_analysis(),\\n              rocsparse_dcsrmv_analysis(), rocsparse_ccsrmv_analysis() or\\n              rocsparse_dcsrmv_analysis(), can be \\\\p NULL if no information is\\n              available.\\n  @param[in]\\n  x           array of \\\\p n elements (\\\\f$op(A) == A\\\\f$) or \\\\p m elements\\n              (\\\\f$op(A) == A^T\\\\f$ or \\\\f$op(A) == A^H\\\\f$).\\n  @param[in]\\n  beta        scalar \\\\f$\\\\beta\\\\f$.\\n  @param[inout]\\n  y           array of \\\\p m elements (\\\\f$op(A) == A\\\\f$) or \\\\p n elements\\n              (\\\\f$op(A) == A^T\\\\f$ or \\\\f$op(A) == A^H\\\\f$).\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m, \\\\p n or \\\\p nnz is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p alpha, \\\\p csr_val,\\n              \\\\p csr_row_ptr, \\\\p csr_col_ind, \\\\p x, \\\\p beta or \\\\p y pointer is\\n              invalid.\\n  \\\\retval     rocsparse_status_arch_mismatch the device is not supported.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n\\n  \\\\par Example\\n  This example performs a sparse matrix vector multiplication in CSR format\\n  using additional meta data to improve performance.\\n  \\\\code{.c}\\n      // Create matrix info structure\\n      rocsparse_mat_info info;\\n      rocsparse_create_mat_info(&info);\\n\\n      // Perform analysis step to obtain meta data\\n      rocsparse_scsrmv_analysis(handle,\\n                                rocsparse_operation_none,\\n                                m,\\n                                n,\\n                                nnz,\\n                                descr,\\n                                csr_val,\\n                                csr_row_ptr,\\n                                csr_col_ind,\\n                                info);\\n\\n      // Compute y = Ax\\n      rocsparse_scsrmv(handle,\\n                       rocsparse_operation_none,\\n                       m,\\n                       n,\\n                       nnz,\\n                       &alpha,\\n                       descr,\\n                       csr_val,\\n                       csr_row_ptr,\\n                       csr_col_ind,\\n                       info,\\n                       x,\\n                       &beta,\\n                       y);\\n\\n      // Do more work\\n      // ...\\n\\n      // Clean up\\n      rocsparse_destroy_mat_info(info);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_scsrmv(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const f32,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        x: *const f32,\n        beta: *const f32,\n        y: *mut f32,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsrmv(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const f64,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        x: *const f64,\n        beta: *const f64,\n        y: *mut f64,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsrmv(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const rocsparse_float_complex,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        x: *const rocsparse_float_complex,\n        beta: *const rocsparse_float_complex,\n        y: *mut rocsparse_float_complex,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsrmv(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const rocsparse_double_complex,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        x: *const rocsparse_double_complex,\n        beta: *const rocsparse_double_complex,\n        y: *mut rocsparse_double_complex,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup level2_module\n  \\brief Sparse triangular solve using CSR storage format\n\n  \\details\n  \\p rocsparse_csrsv_zero_pivot returns \\ref rocsparse_status_zero_pivot, if either a\n  structural or numerical zero has been found during rocsparse_scsrsv_solve(),\n  rocsparse_dcsrsv_solve(), rocsparse_ccsrsv_solve() or rocsparse_zcsrsv_solve()\n  computation. The first zero pivot \\f$j\\f$ at \\f$A_{j,j}\\f$ is stored in \\p position,\n  using same index base as the CSR matrix.\n\n  \\p position can be in host or device memory. If no zero pivot has been found,\n  \\p position is set to -1 and \\ref rocsparse_status_success is returned instead.\n\n  \\note \\p rocsparse_csrsv_zero_pivot is a blocking function. It might influence\n  performance negatively.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[in]\n  descr       descriptor of the sparse CSR matrix.\n  @param[in]\n  info        structure that holds the information collected during the analysis step.\n  @param[inout]\n  position    pointer to zero pivot \\f$j\\f$, can be in host or device memory.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_pointer \\p info or \\p position pointer is\n              invalid.\n  \\retval     rocsparse_status_internal_error an internal error occurred.\n  \\retval     rocsparse_status_zero_pivot zero pivot has been found.*/\n    pub fn rocsparse_csrsv_zero_pivot(\n        handle: rocsparse_handle,\n        descr: rocsparse_mat_descr,\n        info: rocsparse_mat_info,\n        position: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level2_module\\n  \\\\brief Sparse triangular solve using CSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_csrsv_buffer_size returns the size of the temporary storage buffer that\\n  is required by rocsparse_scsrsv_analysis(), rocsparse_dcsrsv_analysis(),\\n  rocsparse_ccsrsv_analysis(), rocsparse_zcsrsv_analysis(), rocsparse_scsrsv_solve(),\\n  rocsparse_dcsrsv_solve(), rocsparse_ccsrsv_solve() and rocsparse_zcsrsv_solve(). The\\n  temporary storage buffer must be allocated by the user. The size of the temporary\\n  storage buffer is identical to the size returned by rocsparse_scsrilu0_buffer_size(),\\n  rocsparse_dcsrilu0_buffer_size(), rocsparse_ccsrilu0_buffer_size() and\\n  rocsparse_zcsrilu0_buffer_size() if the matrix sparsity pattern is identical. The\\n  user allocated buffer can thus be shared between subsequent calls to those functions.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  trans       matrix operation type.\\n  @param[in]\\n  m           number of rows of the sparse CSR matrix.\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse CSR matrix.\\n  @param[in]\\n  descr       descriptor of the sparse CSR matrix.\\n  @param[in]\\n  csr_val     array of \\\\p nnz elements of the sparse CSR matrix.\\n  @param[in]\\n  csr_row_ptr array of \\\\p m+1 elements that point to the start of every row of the\\n              sparse CSR matrix.\\n  @param[in]\\n  csr_col_ind array of \\\\p nnz elements containing the column indices of the sparse\\n              CSR matrix.\\n  @param[out]\\n  info        structure that holds the information collected during the analysis step.\\n  @param[out]\\n  buffer_size number of bytes of the temporary storage buffer required by\\n              rocsparse_scsrsv_analysis(), rocsparse_dcsrsv_analysis(),\\n              rocsparse_ccsrsv_analysis(), rocsparse_zcsrsv_analysis(),\\n              rocsparse_scsrsv_solve(), rocsparse_dcsrsv_solve(),\\n              rocsparse_ccsrsv_solve() and rocsparse_zcsrsv_solve().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p nnz is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p csr_val, \\\\p csr_row_ptr,\\n              \\\\p csr_col_ind, \\\\p info or \\\\p buffer_size pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p trans == \\\\ref rocsparse_operation_conjugate_transpose or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_scsrsv_buffer_size(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsrsv_buffer_size(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsrsv_buffer_size(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsrsv_buffer_size(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \"@}*/\\n/*! \\\\ingroup level2_module\\n  \\\\brief Sparse triangular solve using CSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_csrsv_analysis performs the analysis step for rocsparse_scsrsv_solve(),\\n  rocsparse_dcsrsv_solve(), rocsparse_ccsrsv_solve() and rocsparse_zcsrsv_solve(). It\\n  is expected that this function will be executed only once for a given matrix and\\n  particular operation type. The analysis meta data can be cleared by\\n  rocsparse_csrsv_clear().\\n\\n  \\\\p rocsparse_csrsv_analysis can share its meta data with\\n  rocsparse_scsrsm_analysis(), rocsparse_dcsrsm_analysis(),\\n  rocsparse_ccsrsm_analysis(), rocsparse_zcsrsm_analysis(),\\n  rocsparse_scsrilu0_analysis(), rocsparse_dcsrilu0_analysis(),\\n  rocsparse_ccsrilu0_analysis(), rocsparse_zcsrilu0_analysis(),\\n  rocsparse_scsric0_analysis(), rocsparse_dcsric0_analysis(),\\n  rocsparse_ccsric0_analysis() and rocsparse_zcsric0_analysis(). Selecting\\n  \\\\ref rocsparse_analysis_policy_reuse policy can greatly improve computation\\n  performance of meta data. However, the user need to make sure that the sparsity\\n  pattern remains unchanged. If this cannot be assured,\\n  \\\\ref rocsparse_analysis_policy_force has to be used.\\n\\n  \\\\note\\n  If the matrix sparsity pattern changes, the gathered information will become invalid.\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  trans       matrix operation type.\\n  @param[in]\\n  m           number of rows of the sparse CSR matrix.\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse CSR matrix.\\n  @param[in]\\n  descr       descriptor of the sparse CSR matrix.\\n  @param[in]\\n  csr_val     array of \\\\p nnz elements of the sparse CSR matrix.\\n  @param[in]\\n  csr_row_ptr array of \\\\p m+1 elements that point to the start of every row of the\\n              sparse CSR matrix.\\n  @param[in]\\n  csr_col_ind array of \\\\p nnz elements containing the column indices of the sparse\\n              CSR matrix.\\n  @param[out]\\n  info        structure that holds the information collected during\\n              the analysis step.\\n  @param[in]\\n  analysis    \\\\ref rocsparse_analysis_policy_reuse or\\n              \\\\ref rocsparse_analysis_policy_force.\\n  @param[in]\\n  solve       \\\\ref rocsparse_solve_policy_auto.\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p nnz is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p csr_row_ptr,\\n              \\\\p csr_col_ind, \\\\p info or \\\\p temp_buffer pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p trans == \\\\ref rocsparse_operation_conjugate_transpose or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_scsrsv_analysis(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsrsv_analysis(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsrsv_analysis(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsrsv_analysis(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup level2_module\n  \\brief Sparse triangular solve using CSR storage format\n\n  \\details\n  \\p rocsparse_csrsv_clear deallocates all memory that was allocated by\n  rocsparse_scsrsv_analysis(), rocsparse_dcsrsv_analysis(), rocsparse_ccsrsv_analysis()\n  or rocsparse_zcsrsv_analysis(). This is especially useful, if memory is an issue and\n  the analysis data is not required for further computation, e.g. when switching to\n  another sparse matrix format. Calling \\p rocsparse_csrsv_clear is optional. All\n  allocated resources will be cleared, when the opaque \\ref rocsparse_mat_info struct\n  is destroyed using rocsparse_destroy_mat_info().\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[in]\n  descr       descriptor of the sparse CSR matrix.\n  @param[inout]\n  info        structure that holds the information collected during the analysis step.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_pointer \\p info pointer is invalid.\n  \\retval     rocsparse_status_memory_error the buffer holding the meta data could not\n              be deallocated.\n  \\retval     rocsparse_status_internal_error an internal error occurred.*/\n    pub fn rocsparse_csrsv_clear(\n        handle: rocsparse_handle,\n        descr: rocsparse_mat_descr,\n        info: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level2_module\\n  \\\\brief Sparse triangular solve using CSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_csrsv_solve solves a sparse triangular linear system of a sparse\\n  \\\\f$m \\\\times m\\\\f$ matrix, defined in CSR storage format, a dense solution vector\\n  \\\\f$y\\\\f$ and the right-hand side \\\\f$x\\\\f$ that is multiplied by \\\\f$\\\\alpha\\\\f$, such that\\n  \\\\f[\\n    op(A) \\\\cdot y = \\\\alpha \\\\cdot x,\\n  \\\\f]\\n  with\\n  \\\\f[\\n    op(A) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        A,   & \\\\text{if trans == rocsparse_operation_none} \\\\\\\\\\n        A^T, & \\\\text{if trans == rocsparse_operation_transpose} \\\\\\\\\\n        A^H, & \\\\text{if trans == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n\\n  \\\\p rocsparse_csrsv_solve requires a user allocated temporary buffer. Its size is\\n  returned by rocsparse_scsrsv_buffer_size(), rocsparse_dcsrsv_buffer_size(),\\n  rocsparse_ccsrsv_buffer_size() or rocsparse_zcsrsv_buffer_size(). Furthermore,\\n  analysis meta data is required. It can be obtained by rocsparse_scsrsv_analysis(),\\n  rocsparse_dcsrsv_analysis(), rocsparse_ccsrsv_analysis() or\\n  rocsparse_zcsrsv_analysis(). \\\\p rocsparse_csrsv_solve reports the first zero pivot\\n  (either numerical or structural zero). The zero pivot status can be checked calling\\n  rocsparse_csrsv_zero_pivot(). If\\n  \\\\ref rocsparse_diag_type == \\\\ref rocsparse_diag_type_unit, no zero pivot will be\\n  reported, even if \\\\f$A_{j,j} = 0\\\\f$ for some \\\\f$j\\\\f$.\\n\\n  \\\\note\\n  The sparse CSR matrix has to be sorted. This can be achieved by calling\\n  rocsparse_csrsort().\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  Currently, only \\\\p trans == \\\\ref rocsparse_operation_none and\\n  \\\\p trans == \\\\ref rocsparse_operation_transpose is supported.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  trans       matrix operation type.\\n  @param[in]\\n  m           number of rows of the sparse CSR matrix.\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse CSR matrix.\\n  @param[in]\\n  alpha       scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  descr       descriptor of the sparse CSR matrix.\\n  @param[in]\\n  csr_val     array of \\\\p nnz elements of the sparse CSR matrix.\\n  @param[in]\\n  csr_row_ptr array of \\\\p m+1 elements that point to the start\\n              of every row of the sparse CSR matrix.\\n  @param[in]\\n  csr_col_ind array of \\\\p nnz elements containing the column indices of the sparse\\n              CSR matrix.\\n  @param[in]\\n  info        structure that holds the information collected during the analysis step.\\n  @param[in]\\n  x           array of \\\\p m elements, holding the right-hand side.\\n  @param[out]\\n  y           array of \\\\p m elements, holding the solution.\\n  @param[in]\\n  policy      \\\\ref rocsparse_solve_policy_auto.\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p nnz is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p alpha, \\\\p csr_val,\\n              \\\\p csr_row_ptr, \\\\p csr_col_ind, \\\\p x or \\\\p y pointer is invalid.\\n  \\\\retval     rocsparse_status_arch_mismatch the device is not supported.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p trans == \\\\ref rocsparse_operation_conjugate_transpose or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n\\n  \\\\par Example\\n  Consider the lower triangular \\\\f$m \\\\times m\\\\f$ matrix \\\\f$L\\\\f$, stored in CSR\\n  storage format with unit diagonal. The following example solves \\\\f$L \\\\cdot y = x\\\\f$.\\n  \\\\code{.c}\\n      // Create rocSPARSE handle\\n      rocsparse_handle handle;\\n      rocsparse_create_handle(&handle);\\n\\n      // Create matrix descriptor\\n      rocsparse_mat_descr descr;\\n      rocsparse_create_mat_descr(&descr);\\n      rocsparse_set_mat_fill_mode(descr, rocsparse_fill_mode_lower);\\n      rocsparse_set_mat_diag_type(descr, rocsparse_diag_type_unit);\\n\\n      // Create matrix info structure\\n      rocsparse_mat_info info;\\n      rocsparse_create_mat_info(&info);\\n\\n      // Obtain required buffer size\\n      size_t buffer_size;\\n      rocsparse_dcsrsv_buffer_size(handle,\\n                                   rocsparse_operation_none,\\n                                   m,\\n                                   nnz,\\n                                   descr,\\n                                   csr_val,\\n                                   csr_row_ptr,\\n                                   csr_col_ind,\\n                                   info,\\n                                   &buffer_size);\\n\\n      // Allocate temporary buffer\\n      void* temp_buffer;\\n      hipMalloc(&temp_buffer, buffer_size);\\n\\n      // Perform analysis step\\n      rocsparse_dcsrsv_analysis(handle,\\n                                rocsparse_operation_none,\\n                                m,\\n                                nnz,\\n                                descr,\\n                                csr_val,\\n                                csr_row_ptr,\\n                                csr_col_ind,\\n                                info,\\n                                rocsparse_analysis_policy_reuse,\\n                                rocsparse_solve_policy_auto,\\n                                temp_buffer);\\n\\n      // Solve Ly = x\\n      rocsparse_dcsrsv_solve(handle,\\n                             rocsparse_operation_none,\\n                             m,\\n                             nnz,\\n                             &alpha,\\n                             descr,\\n                             csr_val,\\n                             csr_row_ptr,\\n                             csr_col_ind,\\n                             info,\\n                             x,\\n                             y,\\n                             rocsparse_solve_policy_auto,\\n                             temp_buffer);\\n\\n      // No zero pivot should be found, with L having unit diagonal\\n\\n      // Clean up\\n      hipFree(temp_buffer);\\n      rocsparse_destroy_mat_info(info);\\n      rocsparse_destroy_mat_descr(descr);\\n      rocsparse_destroy_handle(handle);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_scsrsv_solve(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const f32,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        x: *const f32,\n        y: *mut f32,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsrsv_solve(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const f64,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        x: *const f64,\n        y: *mut f64,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsrsv_solve(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const rocsparse_float_complex,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        x: *const rocsparse_float_complex,\n        y: *mut rocsparse_float_complex,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsrsv_solve(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const rocsparse_double_complex,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        x: *const rocsparse_double_complex,\n        y: *mut rocsparse_double_complex,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level2_module\\n  \\\\brief Sparse matrix vector multiplication using ELL storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_ellmv multiplies the scalar \\\\f$\\\\alpha\\\\f$ with a sparse \\\\f$m \\\\times n\\\\f$\\n  matrix, defined in ELL storage format, and the dense vector \\\\f$x\\\\f$ and adds the\\n  result to the dense vector \\\\f$y\\\\f$ that is multiplied by the scalar \\\\f$\\\\beta\\\\f$,\\n  such that\\n  \\\\f[\\n    y := \\\\alpha \\\\cdot op(A) \\\\cdot x + \\\\beta \\\\cdot y,\\n  \\\\f]\\n  with\\n  \\\\f[\\n    op(A) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        A,   & \\\\text{if trans == rocsparse_operation_none} \\\\\\\\\\n        A^T, & \\\\text{if trans == rocsparse_operation_transpose} \\\\\\\\\\n        A^H, & \\\\text{if trans == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n\\n  \\\\code{.c}\\n      for(i = 0; i < m; ++i)\\n      {\\n          y[i] = beta * y[i];\\n\\n          for(p = 0; p < ell_width; ++p)\\n          {\\n              idx = p * m + i;\\n\\n              if((ell_col_ind[idx] >= 0) && (ell_col_ind[idx] < n))\\n              {\\n                  y[i] = y[i] + alpha * ell_val[idx] * x[ell_col_ind[idx]];\\n              }\\n          }\\n      }\\n  \\\\endcode\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  trans       matrix operation type.\\n  @param[in]\\n  m           number of rows of the sparse ELL matrix.\\n  @param[in]\\n  n           number of columns of the sparse ELL matrix.\\n  @param[in]\\n  alpha       scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  descr       descriptor of the sparse ELL matrix. Currently, only\\n              \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  ell_val     array that contains the elements of the sparse ELL matrix. Padded\\n              elements should be zero.\\n  @param[in]\\n  ell_col_ind array that contains the column indices of the sparse ELL matrix.\\n              Padded column indices should be -1.\\n  @param[in]\\n  ell_width   number of non-zero elements per row of the sparse ELL matrix.\\n  @param[in]\\n  x           array of \\\\p n elements (\\\\f$op(A) == A\\\\f$) or \\\\p m elements\\n              (\\\\f$op(A) == A^T\\\\f$ or \\\\f$op(A) == A^H\\\\f$).\\n  @param[in]\\n  beta        scalar \\\\f$\\\\beta\\\\f$.\\n  @param[inout]\\n  y           array of \\\\p m elements (\\\\f$op(A) == A\\\\f$) or \\\\p n elements\\n              (\\\\f$op(A) == A^T\\\\f$ or \\\\f$op(A) == A^H\\\\f$).\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m, \\\\p n or \\\\p ell_width is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p alpha, \\\\p ell_val,\\n              \\\\p ell_col_ind, \\\\p x, \\\\p beta or \\\\p y pointer is invalid.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_sellmv(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        alpha: *const f32,\n        descr: rocsparse_mat_descr,\n        ell_val: *const f32,\n        ell_col_ind: *const rocsparse_int,\n        ell_width: rocsparse_int,\n        x: *const f32,\n        beta: *const f32,\n        y: *mut f32,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dellmv(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        alpha: *const f64,\n        descr: rocsparse_mat_descr,\n        ell_val: *const f64,\n        ell_col_ind: *const rocsparse_int,\n        ell_width: rocsparse_int,\n        x: *const f64,\n        beta: *const f64,\n        y: *mut f64,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cellmv(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        alpha: *const rocsparse_float_complex,\n        descr: rocsparse_mat_descr,\n        ell_val: *const rocsparse_float_complex,\n        ell_col_ind: *const rocsparse_int,\n        ell_width: rocsparse_int,\n        x: *const rocsparse_float_complex,\n        beta: *const rocsparse_float_complex,\n        y: *mut rocsparse_float_complex,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zellmv(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        alpha: *const rocsparse_double_complex,\n        descr: rocsparse_mat_descr,\n        ell_val: *const rocsparse_double_complex,\n        ell_col_ind: *const rocsparse_int,\n        ell_width: rocsparse_int,\n        x: *const rocsparse_double_complex,\n        beta: *const rocsparse_double_complex,\n        y: *mut rocsparse_double_complex,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level2_module\\n  \\\\brief Sparse matrix vector multiplication using GEBSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_gebsrmv multiplies the scalar \\\\f$\\\\alpha\\\\f$ with a sparse\\n  \\\\f$(mb \\\\cdot \\\\text{row_block_dim}) \\\\times (nb \\\\cdot \\\\text{col_block_dim})\\\\f$\\n  matrix, defined in GEBSR storage format, and the dense vector \\\\f$x\\\\f$ and adds the\\n  result to the dense vector \\\\f$y\\\\f$ that is multiplied by the scalar \\\\f$\\\\beta\\\\f$,\\n  such that\\n  \\\\f[\\n    y := \\\\alpha \\\\cdot op(A) \\\\cdot x + \\\\beta \\\\cdot y,\\n  \\\\f]\\n  with\\n  \\\\f[\\n    op(A) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        A,   & \\\\text{if trans == rocsparse_operation_none} \\\\\\\\\\n        A^T, & \\\\text{if trans == rocsparse_operation_transpose} \\\\\\\\\\n        A^H, & \\\\text{if trans == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  Currently, only \\\\p trans == \\\\ref rocsparse_operation_none is supported.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  dir         matrix storage of GEBSR blocks.\\n  @param[in]\\n  trans       matrix operation type.\\n  @param[in]\\n  mb          number of block rows of the sparse GEBSR matrix.\\n  @param[in]\\n  nb          number of block columns of the sparse GEBSR matrix.\\n  @param[in]\\n  nnzb        number of non-zero blocks of the sparse GEBSR matrix.\\n  @param[in]\\n  alpha       scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  descr       descriptor of the sparse GEBSR matrix. Currently, only\\n              \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  bsr_val     array of \\\\p nnzb blocks of the sparse GEBSR matrix.\\n  @param[in]\\n  bsr_row_ptr array of \\\\p mb+1 elements that point to the start of every block row of\\n              the sparse GEBSR matrix.\\n  @param[in]\\n  bsr_col_ind array of \\\\p nnz containing the block column indices of the sparse\\n              GEBSR matrix.\\n  @param[in]\\n  row_block_dim row block dimension of the sparse GEBSR matrix.\\n  @param[in]\\n  col_block_dim column block dimension of the sparse GEBSR matrix.\\n  @param[in]\\n  x           array of \\\\p nb*col_block_dim elements (\\\\f$op(A) = A\\\\f$) or \\\\p mb*row_block_dim\\n              elements (\\\\f$op(A) = A^T\\\\f$ or \\\\f$op(A) = A^H\\\\f$).\\n  @param[in]\\n  beta        scalar \\\\f$\\\\beta\\\\f$.\\n  @param[inout]\\n  y           array of \\\\p mb*row_block_dim elements (\\\\f$op(A) = A\\\\f$) or \\\\p nb*col_block_dim\\n              elements (\\\\f$op(A) = A^T\\\\f$ or \\\\f$op(A) = A^H\\\\f$).\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p mb, \\\\p nb, \\\\p nnzb, \\\\p row_block_dim\\n              or \\\\p col_block_dim is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p alpha, \\\\p bsr_val,\\n              \\\\p bsr_row_ind, \\\\p bsr_col_ind, \\\\p x, \\\\p beta or \\\\p y pointer is invalid.\\n  \\\\retval     rocsparse_status_arch_mismatch the device is not supported.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p trans != \\\\ref rocsparse_operation_none or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_sgebsrmv(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const f32,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f32,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        x: *const f32,\n        beta: *const f32,\n        y: *mut f32,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dgebsrmv(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const f64,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f64,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        x: *const f64,\n        beta: *const f64,\n        y: *mut f64,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cgebsrmv(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const rocsparse_float_complex,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_float_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        x: *const rocsparse_float_complex,\n        beta: *const rocsparse_float_complex,\n        y: *mut rocsparse_float_complex,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zgebsrmv(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans: rocsparse_operation,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const rocsparse_double_complex,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_double_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        x: *const rocsparse_double_complex,\n        beta: *const rocsparse_double_complex,\n        y: *mut rocsparse_double_complex,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level2_module\\n  \\\\brief Dense matrix sparse vector multiplication\\n\\n  \\\\details\\n  \\\\p rocsparse_gemvi_buffer_size returns the size of the temporary storage buffer\\n  required by rocsparse_sgemvi(), rocsparse_dgemvi(), rocsparse_cgemvi() or\\n  rocsparse_zgemvi(). The temporary storage buffer must be allocated by the user.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  trans       matrix operation type.\\n  @param[in]\\n  m           number of rows of the dense matrix.\\n  @param[in]\\n  n           number of columns of the dense matrix.\\n  @param[in]\\n  nnz         number of non-zero entries in the sparse vector.\\n  @param[out]\\n  buffer_size temporary storage buffer size.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m, \\\\p n, or \\\\p nnz is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p buffer_size pointer is invalid.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p trans != \\\\ref rocsparse_operation_none or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_sgemvi_buffer_size(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dgemvi_buffer_size(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cgemvi_buffer_size(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zgemvi_buffer_size(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level2_module\\n  \\\\brief Dense matrix sparse vector multiplication\\n\\n  \\\\details\\n  \\\\p rocsparse_gemvi multiplies the scalar \\\\f$\\\\alpha\\\\f$ with a dense \\\\f$m \\\\times n\\\\f$\\n  matrix \\\\f$A\\\\f$ and the sparse vector \\\\f$x\\\\f$ and adds the result to the dense vector\\n  \\\\f$y\\\\f$ that is multiplied by the scalar \\\\f$\\\\beta\\\\f$, such that\\n  \\\\f[\\n    y := \\\\alpha \\\\cdot op(A) \\\\cdot x + \\\\beta \\\\cdot y,\\n  \\\\f]\\n  with\\n  \\\\f[\\n    op(A) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        A,   & \\\\text{if trans == rocsparse_operation_none} \\\\\\\\\\n        A^T, & \\\\text{if trans == rocsparse_operation_transpose} \\\\\\\\\\n        A^H, & \\\\text{if trans == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n\\n  \\\\p rocsparse_gemvi requires a user allocated temporary buffer. Its size is returned\\n  by rocsparse_sgemvi_buffer_size(), rocsparse_dgemvi_buffer_size(),\\n  rocsparse_cgemvi_buffer_size() or rocsparse_zgemvi_buffer_size().\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  Currently, only \\\\p trans == \\\\ref rocsparse_operation_none is supported.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  trans       matrix operation type.\\n  @param[in]\\n  m           number of rows of the dense matrix.\\n  @param[in]\\n  n           number of columns of the dense matrix.\\n  @param[in]\\n  alpha       scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  A           pointer to the dense matrix.\\n  @param[in]\\n  lda         leading dimension of the dense matrix\\n  @param[in]\\n  nnz         number of non-zero entries in the sparse vector\\n  @param[in]\\n  x_val       array of \\\\p nnz elements containing the values of the sparse vector\\n  @param[in]\\n  x_ind       array of \\\\p nnz elements containing the indices of the sparse vector\\n  @param[in]\\n  beta        scalar \\\\f$\\\\beta\\\\f$.\\n  @param[inout]\\n  y           array of \\\\p m elements (\\\\f$op(A) == A\\\\f$) or \\\\p n elements\\n              (\\\\f$op(A) == A^T\\\\f$ or \\\\f$op(A) == A^H\\\\f$).\\n  @param[in]\\n  idx_base    rocsparse_index_base_zero or rocsparse_index_base_one.\\n  @param[in]\\n  temp_buffer temporary storage buffer\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m, \\\\p n, \\\\p lda or \\\\p nnz is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p alpha, \\\\p A, \\\\p x_val, \\\\p x_ind,\\n              \\\\p beta, \\\\p y or \\\\p temp_buffer pointer is invalid.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p trans != \\\\ref rocsparse_operation_none or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_sgemvi(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocsparse_int,\n        nnz: rocsparse_int,\n        x_val: *const f32,\n        x_ind: *const rocsparse_int,\n        beta: *const f32,\n        y: *mut f32,\n        idx_base: rocsparse_index_base,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dgemvi(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocsparse_int,\n        nnz: rocsparse_int,\n        x_val: *const f64,\n        x_ind: *const rocsparse_int,\n        beta: *const f64,\n        y: *mut f64,\n        idx_base: rocsparse_index_base,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cgemvi(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        alpha: *const rocsparse_float_complex,\n        A: *const rocsparse_float_complex,\n        lda: rocsparse_int,\n        nnz: rocsparse_int,\n        x_val: *const rocsparse_float_complex,\n        x_ind: *const rocsparse_int,\n        beta: *const rocsparse_float_complex,\n        y: *mut rocsparse_float_complex,\n        idx_base: rocsparse_index_base,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zgemvi(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        alpha: *const rocsparse_double_complex,\n        A: *const rocsparse_double_complex,\n        lda: rocsparse_int,\n        nnz: rocsparse_int,\n        x_val: *const rocsparse_double_complex,\n        x_ind: *const rocsparse_int,\n        beta: *const rocsparse_double_complex,\n        y: *mut rocsparse_double_complex,\n        idx_base: rocsparse_index_base,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level2_module\\n  \\\\brief Sparse matrix vector multiplication using HYB storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_hybmv multiplies the scalar \\\\f$\\\\alpha\\\\f$ with a sparse \\\\f$m \\\\times n\\\\f$\\n  matrix, defined in HYB storage format, and the dense vector \\\\f$x\\\\f$ and adds the\\n  result to the dense vector \\\\f$y\\\\f$ that is multiplied by the scalar \\\\f$\\\\beta\\\\f$,\\n  such that\\n  \\\\f[\\n    y := \\\\alpha \\\\cdot op(A) \\\\cdot x + \\\\beta \\\\cdot y,\\n  \\\\f]\\n  with\\n  \\\\f[\\n    op(A) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        A,   & \\\\text{if trans == rocsparse_operation_none} \\\\\\\\\\n        A^T, & \\\\text{if trans == rocsparse_operation_transpose} \\\\\\\\\\n        A^H, & \\\\text{if trans == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  trans       matrix operation type.\\n  @param[in]\\n  alpha       scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  descr       descriptor of the sparse HYB matrix. Currently, only\\n              \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  hyb         matrix in HYB storage format.\\n  @param[in]\\n  x           array of \\\\p n elements (\\\\f$op(A) == A\\\\f$) or \\\\p m elements\\n              (\\\\f$op(A) == A^T\\\\f$ or \\\\f$op(A) == A^H\\\\f$).\\n  @param[in]\\n  beta        scalar \\\\f$\\\\beta\\\\f$.\\n  @param[inout]\\n  y           array of \\\\p m elements (\\\\f$op(A) == A\\\\f$) or \\\\p n elements\\n              (\\\\f$op(A) == A^T\\\\f$ or \\\\f$op(A) == A^H\\\\f$).\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p hyb structure was not initialized with\\n              valid matrix sizes.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p alpha, \\\\p hyb, \\\\p x,\\n              \\\\p beta or \\\\p y pointer is invalid.\\n  \\\\retval     rocsparse_status_invalid_value \\\\p hyb structure was not initialized\\n              with a valid partitioning type.\\n  \\\\retval     rocsparse_status_arch_mismatch the device is not supported.\\n  \\\\retval     rocsparse_status_memory_error the buffer could not be allocated.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p trans != \\\\ref rocsparse_operation_none or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_shybmv(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        alpha: *const f32,\n        descr: rocsparse_mat_descr,\n        hyb: rocsparse_hyb_mat,\n        x: *const f32,\n        beta: *const f32,\n        y: *mut f32,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dhybmv(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        alpha: *const f64,\n        descr: rocsparse_mat_descr,\n        hyb: rocsparse_hyb_mat,\n        x: *const f64,\n        beta: *const f64,\n        y: *mut f64,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_chybmv(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        alpha: *const rocsparse_float_complex,\n        descr: rocsparse_mat_descr,\n        hyb: rocsparse_hyb_mat,\n        x: *const rocsparse_float_complex,\n        beta: *const rocsparse_float_complex,\n        y: *mut rocsparse_float_complex,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zhybmv(\n        handle: rocsparse_handle,\n        trans: rocsparse_operation,\n        alpha: *const rocsparse_double_complex,\n        descr: rocsparse_mat_descr,\n        hyb: rocsparse_hyb_mat,\n        x: *const rocsparse_double_complex,\n        beta: *const rocsparse_double_complex,\n        y: *mut rocsparse_double_complex,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level3_module\\n  \\\\brief Sparse matrix dense matrix multiplication using BSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_bsrmm multiplies the scalar \\\\f$\\\\alpha\\\\f$ with a sparse \\\\f$mb \\\\times kb\\\\f$\\n  matrix \\\\f$A\\\\f$, defined in BSR storage format, and the dense \\\\f$k \\\\times n\\\\f$\\n  matrix \\\\f$B\\\\f$ (where \\\\f$k = block\\\\_dim \\\\times kb\\\\f$) and adds the result to the dense\\n  \\\\f$m \\\\times n\\\\f$ matrix \\\\f$C\\\\f$ (where \\\\f$m = block\\\\_dim \\\\times mb\\\\f$) that\\n  is multiplied by the scalar \\\\f$\\\\beta\\\\f$, such that\\n  \\\\f[\\n    C := \\\\alpha \\\\cdot op(A) \\\\cdot op(B) + \\\\beta \\\\cdot C,\\n  \\\\f]\\n  with\\n  \\\\f[\\n    op(A) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        A,   & \\\\text{if trans_A == rocsparse_operation_none} \\\\\\\\\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n  and\\n  \\\\f[\\n    op(B) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        B,   & \\\\text{if trans_B == rocsparse_operation_none} \\\\\\\\\\n        B^T, & \\\\text{if trans_B == rocsparse_operation_transpose} \\\\\\\\\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  Currently, only \\\\p trans_A == \\\\ref rocsparse_operation_none is supported.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  dir         the storage format of the blocks. Can be \\\\ref rocsparse_direction_row or \\\\ref rocsparse_direction_column.\\n  @param[in]\\n  trans_A     matrix \\\\f$A\\\\f$ operation type. Currently, only \\\\ref rocsparse_operation_none is supported.\\n  @param[in]\\n  trans_B     matrix \\\\f$B\\\\f$ operation type. Currently, only \\\\ref rocsparse_operation_none and rocsparse_operation_transpose\\n              are supported.\\n  @param[in]\\n  mb          number of block rows of the sparse BSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  n           number of columns of the dense matrix \\\\f$op(B)\\\\f$ and \\\\f$C\\\\f$.\\n  @param[in]\\n  kb          number of block columns of the sparse BSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  nnzb        number of non-zero blocks of the sparse BSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  alpha       scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  descr       descriptor of the sparse BSR matrix \\\\f$A\\\\f$. Currently, only\\n              \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  bsr_val     array of \\\\p nnzb*block_dim*block_dim elements of the sparse BSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  bsr_row_ptr array of \\\\p mb+1 elements that point to the start of every block row of the\\n              sparse BSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  bsr_col_ind array of \\\\p nnzb elements containing the block column indices of the sparse\\n              BSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  block_dim   size of the blocks in the sparse BSR matrix.\\n  @param[in]\\n  B           array of dimension \\\\f$ldb \\\\times n\\\\f$ (\\\\f$op(B) == B\\\\f$),\\n              \\\\f$ldb \\\\times k\\\\f$ otherwise.\\n  @param[in]\\n  ldb         leading dimension of \\\\f$B\\\\f$, must be at least \\\\f$\\\\max{(1, k)}\\\\f$ (\\\\f$ op(B) == B\\\\f$) where \\\\f$k = block\\\\_dim \\\\times kb\\\\f$,\\n  \\\\f$\\\\max{(1, n)}\\\\f$ otherwise.\\n  @param[in]\\n  beta        scalar \\\\f$\\\\beta\\\\f$.\\n  @param[inout]\\n  C           array of dimension \\\\f$ldc \\\\times n\\\\f$.\\n  @param[in]\\n  ldc         leading dimension of \\\\f$C\\\\f$, must be at least \\\\f$\\\\max{(1, m)}\\\\f$ (\\\\f$ op(A) == A\\\\f$) where \\\\f$m = block\\\\_dim \\\\times mb\\\\f$,\\n  \\\\f$\\\\max{(1, k)}\\\\f$ where \\\\f$k = block\\\\_dim \\\\times kb\\\\f$ otherwise.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p mb, \\\\p n, \\\\p kb, \\\\p nnzb, \\\\p ldb or \\\\p ldc\\n              is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p alpha, \\\\p bsr_val,\\n              \\\\p bsr_row_ptr, \\\\p bsr_col_ind, \\\\p B, \\\\p beta or \\\\p C pointer is invalid.\\n  \\\\retval     rocsparse_status_arch_mismatch the device is not supported.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p trans_A != \\\\ref rocsparse_operation_none or\\n              \\\\p trans_B == \\\\ref rocsparse_operation_conjugate_transpose or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n\\n  \\\\par Example\\n  This example multiplies a BSR matrix with a dense matrix.\\n  \\\\code{.c}\\n      //     1 2 0 3 0 0\\n      // A = 0 4 5 0 0 0\\n      //     0 0 0 7 8 0\\n      //     0 0 1 2 4 1\\n\\n      rocsparse_int block_dim = 2;\\n      rocsparse_int mb   = 2;\\n      rocsparse_int kb   = 3;\\n      rocsparse_int nnzb = 4;\\n      rocsparse_direction dir = rocsparse_direction_row;\\n\\n      bsr_row_ptr[mb+1]                 = {0, 2, 4};                                        // device memory\\n      bsr_col_ind[nnzb]                 = {0, 1, 1, 2};                                     // device memory\\n      bsr_val[nnzb*block_dim*block_dim] = {1, 2, 0, 4, 0, 3, 5, 0, 0, 7, 1, 2, 8, 0, 4, 1}; // device memory\\n\\n      // Set dimension n of B\\n      rocsparse_int n = 64;\\n      rocsparse_int m = mb * block_dim;\\n      rocsparse_int k = kb * block_dim;\\n\\n      // Allocate and generate dense matrix B\\n      std::vector<float> hB(k * n);\\n      for(rocsparse_int i = 0; i < k * n; ++i)\\n      {\\n          hB[i] = static_cast<float>(rand()) / RAND_MAX;\\n      }\\n\\n      // Copy B to the device\\n      float* B;\\n      hipMalloc((void**)&B, sizeof(float) * k * n);\\n      hipMemcpy(B, hB.data(), sizeof(float) * k * n, hipMemcpyHostToDevice);\\n\\n      // alpha and beta\\n      float alpha = 1.0f;\\n      float beta  = 0.0f;\\n\\n      // Allocate memory for the resulting matrix C\\n      float* C;\\n      hipMalloc((void**)&C, sizeof(float) * m * n);\\n\\n      // Perform the matrix multiplication\\n      rocsparse_sbsrmm(handle,\\n                       dir,\\n                       rocsparse_operation_none,\\n                       rocsparse_operation_none,\\n                       mb,\\n                       n,\\n                       kb,\\n                       nnzb,\\n                       &alpha,\\n                       descr,\\n                       bsr_val,\\n                       bsr_row_ptr,\\n                       bsr_col_ind,\\n                       block_dim,\\n                       B,\\n                       k,\\n                       &beta,\\n                       C,\\n                       m);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_sbsrmm(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        mb: rocsparse_int,\n        n: rocsparse_int,\n        kb: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const f32,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f32,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        B: *const f32,\n        ldb: rocsparse_int,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dbsrmm(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        mb: rocsparse_int,\n        n: rocsparse_int,\n        kb: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const f64,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f64,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        B: *const f64,\n        ldb: rocsparse_int,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cbsrmm(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        mb: rocsparse_int,\n        n: rocsparse_int,\n        kb: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const rocsparse_float_complex,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_float_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        B: *const rocsparse_float_complex,\n        ldb: rocsparse_int,\n        beta: *const rocsparse_float_complex,\n        C: *mut rocsparse_float_complex,\n        ldc: rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zbsrmm(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        mb: rocsparse_int,\n        n: rocsparse_int,\n        kb: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const rocsparse_double_complex,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_double_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        B: *const rocsparse_double_complex,\n        ldb: rocsparse_int,\n        beta: *const rocsparse_double_complex,\n        C: *mut rocsparse_double_complex,\n        ldc: rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup level3_module\n  \\brief Sparse triangular system solve using BSR storage format\n\n  \\details\n  \\p rocsparse_bsrsm_zero_pivot returns \\ref rocsparse_status_zero_pivot, if either a\n  structural or numerical zero has been found during rocsparse_sbsrsm_solve(),\n  rocsparse_dbsrsm_solve(), rocsparse_cbsrsm_solve() or rocsparse_zbsrsm_solve()\n  computation. The first zero pivot \\f$j\\f$ at \\f$A_{j,j}\\f$ is stored in \\p position,\n  using same index base as the BSR matrix.\n\n  \\p position can be in host or device memory. If no zero pivot has been found,\n  \\p position is set to -1 and \\ref rocsparse_status_success is returned instead.\n\n  \\note \\p rocsparse_bsrsm_zero_pivot is a blocking function. It might influence\n  performance negatively.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[in]\n  info        structure that holds the information collected during the analysis step.\n  @param[inout]\n  position    pointer to zero pivot \\f$j\\f$, can be in host or device memory.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_pointer \\p info or \\p position pointer is\n              invalid.\n  \\retval     rocsparse_status_internal_error an internal error occurred.\n  \\retval     rocsparse_status_zero_pivot zero pivot has been found.*/\n    pub fn rocsparse_bsrsm_zero_pivot(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n        position: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level3_module\\n  \\\\brief Sparse triangular system solve using BSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_bsrsm_buffer_size returns the size of the temporary storage buffer that\\n  is required by rocsparse_sbsrsm_analysis(), rocsparse_dbsrsm_analysis(),\\n  rocsparse_cbsrsm_analysis(), rocsparse_zbsrsm_analysis(), rocsparse_sbsrsm_solve(),\\n  rocsparse_dbsrsm_solve(), rocsparse_cbsrsm_solve() and rocsparse_zbsrsm_solve(). The\\n  temporary storage buffer must be allocated by the user.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  dir         matrix storage of BSR blocks.\\n  @param[in]\\n  trans_A     matrix A operation type.\\n  @param[in]\\n  trans_X     matrix X operation type.\\n  @param[in]\\n  mb          number of block rows of the sparse BSR matrix A.\\n  @param[in]\\n  nrhs        number of columns of the dense matrix op(X).\\n  @param[in]\\n  nnzb        number of non-zero blocks of the sparse BSR matrix A.\\n  @param[in]\\n  descr       descriptor of the sparse BSR matrix A.\\n  @param[in]\\n  bsr_val     array of \\\\p nnzb blocks of the sparse BSR matrix.\\n  @param[in]\\n  bsr_row_ptr array of \\\\p mb+1 elements that point to the start of every block row of\\n              the sparse BSR matrix.\\n  @param[in]\\n  bsr_col_ind array of \\\\p nnzb containing the block column indices of the sparse\\n              BSR matrix.\\n  @param[in]\\n  block_dim   block dimension of the sparse BSR matrix.\\n  @param[in]\\n  info        structure that holds the information collected during the analysis step.\\n  @param[out]\\n  buffer_size number of bytes of the temporary storage buffer required by\\n              rocsparse_sbsrsm_analysis(), rocsparse_dbsrsm_analysis(),\\n              rocsparse_cbsrsm_analysis(), rocsparse_zbsrsm_analysis(),\\n              rocsparse_sbsrsm_solve(), rocsparse_dbsrsm_solve(),\\n              rocsparse_cbsrsm_solve() and rocsparse_zbsrsm_solve().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p mb, \\\\p nrhs, \\\\p nnzb or \\\\p block_dim is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p bsr_val,\\n              \\\\p bsr_row_ptr, \\\\p bsr_col_ind, \\\\p info or \\\\p buffer_size pointer\\n              is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p trans_A == \\\\ref rocsparse_operation_conjugate_transpose,\\n              \\\\p trans_X == \\\\ref rocsparse_operation_conjugate_transpose or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_sbsrsm_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_X: rocsparse_operation,\n        mb: rocsparse_int,\n        nrhs: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f32,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dbsrsm_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_X: rocsparse_operation,\n        mb: rocsparse_int,\n        nrhs: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f64,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cbsrsm_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_X: rocsparse_operation,\n        mb: rocsparse_int,\n        nrhs: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_float_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zbsrsm_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_X: rocsparse_operation,\n        mb: rocsparse_int,\n        nrhs: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_double_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level3_module\\n  \\\\brief Sparse triangular system solve using BSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_bsrsm_analysis performs the analysis step for rocsparse_sbsrsm_solve(),\\n  rocsparse_dbsrsm_solve(), rocsparse_cbsrsm_solve() and rocsparse_zbsrsm_solve(). It\\n  is expected that this function will be executed only once for a given matrix and\\n  particular operation type. The analysis meta data can be cleared by\\n  rocsparse_bsrsm_clear().\\n\\n  \\\\p rocsparse_bsrsm_analysis can share its meta data with\\n  rocsparse_sbsrilu0_analysis(), rocsparse_dbsrilu0_analysis(),\\n  rocsparse_cbsrilu0_analysis(), rocsparse_zbsrilu0_analysis(),\\n  rocsparse_sbsric0_analysis(), rocsparse_dbsric0_analysis(),\\n  rocsparse_cbsric0_analysis(), rocsparse_zbsric0_analysis(),\\n  rocsparse_sbsrsv_analysis(), rocsparse_dbsrsv_analysis(),\\n  rocsparse_cbsrsv_analysis() and rocsparse_zbsrsv_analysis(). Selecting\\n  \\\\ref rocsparse_analysis_policy_reuse policy can greatly improve computation\\n  performance of meta data. However, the user need to make sure that the sparsity\\n  pattern remains unchanged. If this cannot be assured,\\n  \\\\ref rocsparse_analysis_policy_force has to be used.\\n\\n  \\\\note\\n  If the matrix sparsity pattern changes, the gathered information will become invalid.\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  dir         matrix storage of BSR blocks.\\n  @param[in]\\n  trans_A     matrix A operation type.\\n  @param[in]\\n  trans_X     matrix X operation type.\\n  @param[in]\\n  mb          number of block rows of the sparse BSR matrix A.\\n  @param[in]\\n  nrhs        number of columns of the dense matrix op(X).\\n  @param[in]\\n  nnzb        number of non-zero blocks of the sparse BSR matrix A.\\n  @param[in]\\n  descr       descriptor of the sparse BSR matrix A.\\n  @param[in]\\n  bsr_val     array of \\\\p nnzb blocks of the sparse BSR matrix A.\\n  @param[in]\\n  bsr_row_ptr array of \\\\p mb+1 elements that point to the start of every block row of\\n              the sparse BSR matrix A.\\n  @param[in]\\n  bsr_col_ind array of \\\\p nnzb containing the block column indices of the sparse\\n              BSR matrix A.\\n  @param[in]\\n  block_dim   block dimension of the sparse BSR matrix A.\\n  @param[out]\\n  info        structure that holds the information collected during the analysis step.\\n  @param[in]\\n  analysis    \\\\ref rocsparse_analysis_policy_reuse or\\n              \\\\ref rocsparse_analysis_policy_force.\\n  @param[in]\\n  solve       \\\\ref rocsparse_solve_policy_auto.\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p mb, \\\\p nrhs, \\\\p nnzb or \\\\p block_dim is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p bsr_val, \\\\p bsr_row_ptr,\\n              \\\\p bsr_col_ind, \\\\p info or \\\\p temp_buffer pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p trans_A == \\\\ref rocsparse_operation_conjugate_transpose,\\n              \\\\p trans_X == \\\\ref rocsparse_operation_conjugate_transpose or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_sbsrsm_analysis(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_X: rocsparse_operation,\n        mb: rocsparse_int,\n        nrhs: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f32,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dbsrsm_analysis(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_X: rocsparse_operation,\n        mb: rocsparse_int,\n        nrhs: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f64,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cbsrsm_analysis(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_X: rocsparse_operation,\n        mb: rocsparse_int,\n        nrhs: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_float_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zbsrsm_analysis(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_X: rocsparse_operation,\n        mb: rocsparse_int,\n        nrhs: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_double_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup level3_module\n  \\brief Sparse triangular system solve using BSR storage format\n\n  \\details\n  \\p rocsparse_bsrsm_clear deallocates all memory that was allocated by\n  rocsparse_sbsrsm_analysis(), rocsparse_dbsrsm_analysis(), rocsparse_cbsrsm_analysis()\n  or rocsparse_zbsrsm_analysis(). This is especially useful, if memory is an issue and\n  the analysis data is not required for further computation, e.g. when switching to\n  another sparse matrix format. Calling \\p rocsparse_bsrsm_clear is optional. All\n  allocated resources will be cleared, when the opaque \\ref rocsparse_mat_info struct\n  is destroyed using rocsparse_destroy_mat_info().\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[inout]\n  info        structure that holds the information collected during the analysis step.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_pointer \\p info pointer is invalid.\n  \\retval     rocsparse_status_memory_error the buffer holding the meta data could not\n              be deallocated.\n  \\retval     rocsparse_status_internal_error an internal error occurred.*/\n    pub fn rocsparse_bsrsm_clear(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level3_module\\n  \\\\brief Sparse triangular system solve using BSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_bsrsm_solve solves a sparse triangular linear system of a sparse\\n  \\\\f$m \\\\times m\\\\f$ matrix, defined in BSR storage format, a dense solution matrix\\n  \\\\f$X\\\\f$ and the right-hand side matrix \\\\f$B\\\\f$ that is multiplied by \\\\f$\\\\alpha\\\\f$, such that\\n  \\\\f[\\n    op(A) \\\\cdot op(X) = \\\\alpha \\\\cdot op(B),\\n  \\\\f]\\n  with\\n  \\\\f[\\n    op(A) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        A,   & \\\\text{if trans_A == rocsparse_operation_none} \\\\\\\\\\n        A^T, & \\\\text{if trans_A == rocsparse_operation_transpose} \\\\\\\\\\n        A^H, & \\\\text{if trans_A == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n  ,\\n  \\\\f[\\n    op(X) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        X,   & \\\\text{if trans_X == rocsparse_operation_none} \\\\\\\\\\n        X^T, & \\\\text{if trans_X == rocsparse_operation_transpose} \\\\\\\\\\n        X^H, & \\\\text{if trans_X == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n\\n  \\\\p rocsparse_bsrsm_solve requires a user allocated temporary buffer. Its size is\\n  returned by rocsparse_sbsrsm_buffer_size(), rocsparse_dbsrsm_buffer_size(),\\n  rocsparse_cbsrsm_buffer_size() or rocsparse_zbsrsm_buffer_size(). Furthermore,\\n  analysis meta data is required. It can be obtained by rocsparse_sbsrsm_analysis(),\\n  rocsparse_dbsrsm_analysis(), rocsparse_cbsrsm_analysis() or\\n  rocsparse_zbsrsm_analysis(). \\\\p rocsparse_bsrsm_solve reports the first zero pivot\\n  (either numerical or structural zero). The zero pivot status can be checked calling\\n  rocsparse_bsrsm_zero_pivot(). If\\n  \\\\ref rocsparse_diag_type == \\\\ref rocsparse_diag_type_unit, no zero pivot will be\\n  reported, even if \\\\f$A_{j,j} = 0\\\\f$ for some \\\\f$j\\\\f$.\\n\\n  \\\\note\\n  The sparse BSR matrix has to be sorted.\\n\\n  \\\\note\\n  Operation type of B and X must match, if \\\\f$op(B)=B, op(X)=X\\\\f$.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  Currently, only \\\\p trans_A != \\\\ref rocsparse_operation_conjugate_transpose and\\n  \\\\p trans_X != \\\\ref rocsparse_operation_conjugate_transpose is supported.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  dir         matrix storage of BSR blocks.\\n  @param[in]\\n  trans_A     matrix A operation type.\\n  @param[in]\\n  trans_X     matrix X operation type.\\n  @param[in]\\n  mb          number of block rows of the sparse BSR matrix A.\\n  @param[in]\\n  nrhs        number of columns of the dense matrix op(X).\\n  @param[in]\\n  nnzb        number of non-zero blocks of the sparse BSR matrix A.\\n  @param[in]\\n  alpha       scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  descr       descriptor of the sparse BSR matrix A.\\n  @param[in]\\n  bsr_val     array of \\\\p nnzb blocks of the sparse BSR matrix.\\n  @param[in]\\n  bsr_row_ptr array of \\\\p mb+1 elements that point to the start of every block row of\\n              the sparse BSR matrix.\\n  @param[in]\\n  bsr_col_ind array of \\\\p nnzb containing the block column indices of the sparse\\n              BSR matrix.\\n  @param[in]\\n  block_dim   block dimension of the sparse BSR matrix.\\n  @param[in]\\n  info        structure that holds the information collected during the analysis step.\\n  @param[in]\\n  B           rhs matrix B with leading dimension \\\\p ldb.\\n  @param[in]\\n  ldb         leading dimension of rhs matrix B.\\n  @param[out]\\n  X           solution matrix X with leading dimension \\\\p ldx.\\n  @param[in]\\n  ldx         leading dimension of solution matrix X.\\n  @param[in]\\n  policy      \\\\ref rocsparse_solve_policy_auto.\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p mb, \\\\p nrhs, \\\\p nnzb or \\\\p block_dim is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p alpha, \\\\p descr, \\\\p bsr_val,\\n              \\\\p bsr_row_ptr, \\\\p bsr_col_ind, \\\\p B, \\\\p X \\\\p info or \\\\p temp_buffer pointer\\n              is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p trans_A == \\\\ref rocsparse_operation_conjugate_transpose,\\n              \\\\p trans_X == \\\\ref rocsparse_operation_conjugate_transpose or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_sbsrsm_solve(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_X: rocsparse_operation,\n        mb: rocsparse_int,\n        nrhs: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const f32,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f32,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        B: *const f32,\n        ldb: rocsparse_int,\n        X: *mut f32,\n        ldx: rocsparse_int,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dbsrsm_solve(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_X: rocsparse_operation,\n        mb: rocsparse_int,\n        nrhs: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const f64,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f64,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        B: *const f64,\n        ldb: rocsparse_int,\n        X: *mut f64,\n        ldx: rocsparse_int,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cbsrsm_solve(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_X: rocsparse_operation,\n        mb: rocsparse_int,\n        nrhs: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const rocsparse_float_complex,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_float_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        B: *const rocsparse_float_complex,\n        ldb: rocsparse_int,\n        X: *mut rocsparse_float_complex,\n        ldx: rocsparse_int,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zbsrsm_solve(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_X: rocsparse_operation,\n        mb: rocsparse_int,\n        nrhs: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const rocsparse_double_complex,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_double_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        B: *const rocsparse_double_complex,\n        ldb: rocsparse_int,\n        X: *mut rocsparse_double_complex,\n        ldx: rocsparse_int,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level3_module\\n  \\\\brief Sparse matrix dense matrix multiplication using CSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_csrmm multiplies the scalar \\\\f$\\\\alpha\\\\f$ with a sparse \\\\f$m \\\\times k\\\\f$\\n  matrix \\\\f$A\\\\f$, defined in CSR storage format, and the dense \\\\f$k \\\\times n\\\\f$\\n  matrix \\\\f$B\\\\f$ and adds the result to the dense \\\\f$m \\\\times n\\\\f$ matrix \\\\f$C\\\\f$ that\\n  is multiplied by the scalar \\\\f$\\\\beta\\\\f$, such that\\n  \\\\f[\\n    C := \\\\alpha \\\\cdot op(A) \\\\cdot op(B) + \\\\beta \\\\cdot C,\\n  \\\\f]\\n  with\\n  \\\\f[\\n    op(A) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        A,   & \\\\text{if trans_A == rocsparse_operation_none} \\\\\\\\\\n        A^T, & \\\\text{if trans_A == rocsparse_operation_transpose} \\\\\\\\\\n        A^H, & \\\\text{if trans_A == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n  and\\n  \\\\f[\\n    op(B) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        B,   & \\\\text{if trans_B == rocsparse_operation_none} \\\\\\\\\\n        B^T, & \\\\text{if trans_B == rocsparse_operation_transpose} \\\\\\\\\\n        B^H, & \\\\text{if trans_B == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n\\n  \\\\code{.c}\\n      for(i = 0; i < ldc; ++i)\\n      {\\n          for(j = 0; j < n; ++j)\\n          {\\n              C[i][j] = beta * C[i][j];\\n\\n              for(k = csr_row_ptr[i]; k < csr_row_ptr[i + 1]; ++k)\\n              {\\n                  C[i][j] += alpha * csr_val[k] * B[csr_col_ind[k]][j];\\n              }\\n          }\\n      }\\n  \\\\endcode\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  trans_A     matrix \\\\f$A\\\\f$ operation type.\\n  @param[in]\\n  trans_B     matrix \\\\f$B\\\\f$ operation type.\\n  @param[in]\\n  m           number of rows of the sparse CSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  n           number of columns of the dense matrix \\\\f$op(B)\\\\f$ and \\\\f$C\\\\f$.\\n  @param[in]\\n  k           number of columns of the sparse CSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse CSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  alpha       scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  descr       descriptor of the sparse CSR matrix \\\\f$A\\\\f$. Currently, only\\n              \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  csr_val     array of \\\\p nnz elements of the sparse CSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  csr_row_ptr array of \\\\p m+1 elements that point to the start of every row of the\\n              sparse CSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  csr_col_ind array of \\\\p nnz elements containing the column indices of the sparse\\n              CSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  B           array of dimension \\\\f$ldb \\\\times n\\\\f$ (\\\\f$op(B) == B\\\\f$),\\n              \\\\f$ldb \\\\times k\\\\f$ otherwise.\\n  @param[in]\\n  ldb         leading dimension of \\\\f$B\\\\f$, must be at least \\\\f$\\\\max{(1, k)}\\\\f$\\n              (\\\\f$op(B) == B\\\\f$), \\\\f$\\\\max{(1, n)}\\\\f$ otherwise.\\n  @param[in]\\n  beta        scalar \\\\f$\\\\beta\\\\f$.\\n  @param[inout]\\n  C           array of dimension \\\\f$ldc \\\\times n\\\\f$.\\n  @param[in]\\n  ldc         leading dimension of \\\\f$C\\\\f$, must be at least \\\\f$\\\\max{(1, m)}\\\\f$\\n              (\\\\f$op(A) == A\\\\f$), \\\\f$\\\\max{(1, k)}\\\\f$ otherwise.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m, \\\\p n, \\\\p k, \\\\p nnz, \\\\p ldb or \\\\p ldc\\n              is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p alpha, \\\\p csr_val,\\n              \\\\p csr_row_ptr, \\\\p csr_col_ind, \\\\p B, \\\\p beta or \\\\p C pointer is invalid.\\n  \\\\retval     rocsparse_status_arch_mismatch the device is not supported.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n\\n  \\\\par Example\\n  This example multiplies a CSR matrix with a dense matrix.\\n  \\\\code{.c}\\n      //     1 2 0 3 0\\n      // A = 0 4 5 0 0\\n      //     6 0 0 7 8\\n\\n      rocsparse_int m   = 3;\\n      rocsparse_int k   = 5;\\n      rocsparse_int nnz = 8;\\n\\n      csr_row_ptr[m+1] = {0, 3, 5, 8};             // device memory\\n      csr_col_ind[nnz] = {0, 1, 3, 1, 2, 0, 3, 4}; // device memory\\n      csr_val[nnz]     = {1, 2, 3, 4, 5, 6, 7, 8}; // device memory\\n\\n      // Set dimension n of B\\n      rocsparse_int n = 64;\\n\\n      // Allocate and generate dense matrix B\\n      std::vector<float> hB(k * n);\\n      for(rocsparse_int i = 0; i < k * n; ++i)\\n      {\\n          hB[i] = static_cast<float>(rand()) / RAND_MAX;\\n      }\\n\\n      // Copy B to the device\\n      float* B;\\n      hipMalloc((void**)&B, sizeof(float) * k * n);\\n      hipMemcpy(B, hB.data(), sizeof(float) * k * n, hipMemcpyHostToDevice);\\n\\n      // alpha and beta\\n      float alpha = 1.0f;\\n      float beta  = 0.0f;\\n\\n      // Allocate memory for the resulting matrix C\\n      float* C;\\n      hipMalloc((void**)&C, sizeof(float) * m * n);\\n\\n      // Perform the matrix multiplication\\n      rocsparse_scsrmm(handle,\\n                       rocsparse_operation_none,\\n                       rocsparse_operation_none,\\n                       m,\\n                       n,\\n                       k,\\n                       nnz,\\n                       &alpha,\\n                       descr,\\n                       csr_val,\\n                       csr_row_ptr,\\n                       csr_col_ind,\\n                       B,\\n                       k,\\n                       &beta,\\n                       C,\\n                       m);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_scsrmm(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        k: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const f32,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        B: *const f32,\n        ldb: rocsparse_int,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsrmm(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        k: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const f64,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        B: *const f64,\n        ldb: rocsparse_int,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsrmm(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        k: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const rocsparse_float_complex,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        B: *const rocsparse_float_complex,\n        ldb: rocsparse_int,\n        beta: *const rocsparse_float_complex,\n        C: *mut rocsparse_float_complex,\n        ldc: rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsrmm(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        k: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const rocsparse_double_complex,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        B: *const rocsparse_double_complex,\n        ldb: rocsparse_int,\n        beta: *const rocsparse_double_complex,\n        C: *mut rocsparse_double_complex,\n        ldc: rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup level3_module\n  \\brief Sparse triangular system solve using CSR storage format\n\n  \\details\n  \\p rocsparse_csrsm_zero_pivot returns \\ref rocsparse_status_zero_pivot, if either a\n  structural or numerical zero has been found during rocsparse_scsrsm_solve(),\n  rocsparse_dcsrsm_solve(), rocsparse_ccsrsm_solve() or rocsparse_zcsrsm_solve()\n  computation. The first zero pivot \\f$j\\f$ at \\f$A_{j,j}\\f$ is stored in \\p position,\n  using same index base as the CSR matrix.\n\n  \\p position can be in host or device memory. If no zero pivot has been found,\n  \\p position is set to -1 and \\ref rocsparse_status_success is returned instead.\n\n  \\note \\p rocsparse_csrsm_zero_pivot is a blocking function. It might influence\n  performance negatively.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[in]\n  info        structure that holds the information collected during the analysis step.\n  @param[inout]\n  position    pointer to zero pivot \\f$j\\f$, can be in host or device memory.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_pointer \\p info or \\p position pointer is\n              invalid.\n  \\retval     rocsparse_status_internal_error an internal error occurred.\n  \\retval     rocsparse_status_zero_pivot zero pivot has been found.*/\n    pub fn rocsparse_csrsm_zero_pivot(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n        position: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level3_module\\n  \\\\brief Sparse triangular system solve using CSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_csrsm_buffer_size returns the size of the temporary storage buffer that\\n  is required by rocsparse_scsrsm_analysis(), rocsparse_dcsrsm_analysis(),\\n  rocsparse_ccsrsm_analysis(), rocsparse_zcsrsm_analysis(), rocsparse_scsrsm_solve(),\\n  rocsparse_dcsrsm_solve(), rocsparse_ccsrsm_solve() and rocsparse_zcsrsm_solve(). The\\n  temporary storage buffer must be allocated by the user.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  trans_A     matrix A operation type.\\n  @param[in]\\n  trans_B     matrix B operation type.\\n  @param[in]\\n  m           number of rows of the sparse CSR matrix A.\\n  @param[in]\\n  nrhs        number of columns of the dense matrix op(B).\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse CSR matrix A.\\n  @param[in]\\n  alpha       scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  descr       descriptor of the sparse CSR matrix A.\\n  @param[in]\\n  csr_val     array of \\\\p nnz elements of the sparse CSR matrix A.\\n  @param[in]\\n  csr_row_ptr array of \\\\p m+1 elements that point to the start of every row of the\\n              sparse CSR matrix A.\\n  @param[in]\\n  csr_col_ind array of \\\\p nnz elements containing the column indices of the sparse\\n              CSR matrix A.\\n  @param[in]\\n  B           array of \\\\p m \\\\f$\\\\times\\\\f$ \\\\p nrhs elements of the rhs matrix B.\\n  @param[in]\\n  ldb         leading dimension of rhs matrix B.\\n  @param[in]\\n  info        structure that holds the information collected during the analysis step.\\n  @param[in]\\n  policy      \\\\ref rocsparse_solve_policy_auto.\\n  @param[out]\\n  buffer_size number of bytes of the temporary storage buffer required by\\n              rocsparse_scsrsm_analysis(), rocsparse_dcsrsm_analysis(),\\n              rocsparse_ccsrsm_analysis(), rocsparse_zcsrsm_analysis(),\\n              rocsparse_scsrsm_solve(), rocsparse_dcsrsm_solve(),\\n              rocsparse_ccsrsm_solve() and rocsparse_zcsrsm_solve().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m, \\\\p nrhs or \\\\p nnz is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p alpha, \\\\p descr, \\\\p csr_val,\\n              \\\\p csr_row_ptr, \\\\p csr_col_ind, \\\\p B, \\\\p info or \\\\p buffer_size pointer\\n              is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p trans_A == \\\\ref rocsparse_operation_conjugate_transpose,\\n              \\\\p trans_B == \\\\ref rocsparse_operation_conjugate_transpose or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_scsrsm_buffer_size(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        nrhs: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const f32,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        B: *const f32,\n        ldb: rocsparse_int,\n        info: rocsparse_mat_info,\n        policy: rocsparse_solve_policy,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsrsm_buffer_size(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        nrhs: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const f64,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        B: *const f64,\n        ldb: rocsparse_int,\n        info: rocsparse_mat_info,\n        policy: rocsparse_solve_policy,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsrsm_buffer_size(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        nrhs: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const rocsparse_float_complex,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        B: *const rocsparse_float_complex,\n        ldb: rocsparse_int,\n        info: rocsparse_mat_info,\n        policy: rocsparse_solve_policy,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsrsm_buffer_size(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        nrhs: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const rocsparse_double_complex,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        B: *const rocsparse_double_complex,\n        ldb: rocsparse_int,\n        info: rocsparse_mat_info,\n        policy: rocsparse_solve_policy,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level3_module\\n  \\\\brief Sparse triangular system solve using CSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_csrsm_analysis performs the analysis step for rocsparse_scsrsm_solve(),\\n  rocsparse_dcsrsm_solve(), rocsparse_ccsrsm_solve() and rocsparse_zcsrsm_solve(). It\\n  is expected that this function will be executed only once for a given matrix and\\n  particular operation type. The analysis meta data can be cleared by\\n  rocsparse_csrsm_clear().\\n\\n  \\\\p rocsparse_csrsm_analysis can share its meta data with\\n  rocsparse_scsrilu0_analysis(), rocsparse_dcsrilu0_analysis(),\\n  rocsparse_ccsrilu0_analysis(), rocsparse_zcsrilu0_analysis(),\\n  rocsparse_scsric0_analysis(), rocsparse_dcsric0_analysis(),\\n  rocsparse_ccsric0_analysis(), rocsparse_zcsric0_analysis(),\\n  rocsparse_scsrsv_analysis(), rocsparse_dcsrsv_analysis(),\\n  rocsparse_ccsrsv_analysis() and rocsparse_zcsrsv_analysis(). Selecting\\n  \\\\ref rocsparse_analysis_policy_reuse policy can greatly improve computation\\n  performance of meta data. However, the user need to make sure that the sparsity\\n  pattern remains unchanged. If this cannot be assured,\\n  \\\\ref rocsparse_analysis_policy_force has to be used.\\n\\n  \\\\note\\n  If the matrix sparsity pattern changes, the gathered information will become invalid.\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  trans_A     matrix A operation type.\\n  @param[in]\\n  trans_B     matrix B operation type.\\n  @param[in]\\n  m           number of rows of the sparse CSR matrix A.\\n  @param[in]\\n  nrhs        number of columns of the dense matrix op(B).\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse CSR matrix A.\\n  @param[in]\\n  alpha       scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  descr       descriptor of the sparse CSR matrix A.\\n  @param[in]\\n  csr_val     array of \\\\p nnz elements of the sparse CSR matrix A.\\n  @param[in]\\n  csr_row_ptr array of \\\\p m+1 elements that point to the start of every row of the\\n              sparse CSR matrix A.\\n  @param[in]\\n  csr_col_ind array of \\\\p nnz elements containing the column indices of the sparse\\n              CSR matrix A.\\n  @param[in]\\n  B           array of \\\\p m \\\\f$\\\\times\\\\f$ \\\\p nrhs elements of the rhs matrix B.\\n  @param[in]\\n  ldb         leading dimension of rhs matrix B.\\n  @param[out]\\n  info        structure that holds the information collected during the analysis step.\\n  @param[in]\\n  analysis    \\\\ref rocsparse_analysis_policy_reuse or\\n              \\\\ref rocsparse_analysis_policy_force.\\n  @param[in]\\n  solve       \\\\ref rocsparse_solve_policy_auto.\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m, \\\\p nrhs or \\\\p nnz is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p alpha, \\\\p descr, \\\\p csr_val,\\n              \\\\p csr_row_ptr, \\\\p csr_col_ind, \\\\p B, \\\\p info or \\\\p temp_buffer pointer\\n              is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p trans_A == \\\\ref rocsparse_operation_conjugate_transpose,\\n              \\\\p trans_B == \\\\ref rocsparse_operation_conjugate_transpose or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_scsrsm_analysis(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        nrhs: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const f32,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        B: *const f32,\n        ldb: rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsrsm_analysis(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        nrhs: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const f64,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        B: *const f64,\n        ldb: rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsrsm_analysis(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        nrhs: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const rocsparse_float_complex,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        B: *const rocsparse_float_complex,\n        ldb: rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsrsm_analysis(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        nrhs: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const rocsparse_double_complex,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        B: *const rocsparse_double_complex,\n        ldb: rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup level3_module\n  \\brief Sparse triangular system solve using CSR storage format\n\n  \\details\n  \\p rocsparse_csrsm_clear deallocates all memory that was allocated by\n  rocsparse_scsrsm_analysis(), rocsparse_dcsrsm_analysis(), rocsparse_ccsrsm_analysis()\n  or rocsparse_zcsrsm_analysis(). This is especially useful, if memory is an issue and\n  the analysis data is not required for further computation, e.g. when switching to\n  another sparse matrix format. Calling \\p rocsparse_csrsm_clear is optional. All\n  allocated resources will be cleared, when the opaque \\ref rocsparse_mat_info struct\n  is destroyed using rocsparse_destroy_mat_info().\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[inout]\n  info        structure that holds the information collected during the analysis step.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_pointer \\p info pointer is invalid.\n  \\retval     rocsparse_status_memory_error the buffer holding the meta data could not\n              be deallocated.\n  \\retval     rocsparse_status_internal_error an internal error occurred.*/\n    pub fn rocsparse_csrsm_clear(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level3_module\\n  \\\\brief Sparse triangular system solve using CSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_csrsm_solve solves a sparse triangular linear system of a sparse\\n  \\\\f$m \\\\times m\\\\f$ matrix, defined in CSR storage format, a dense solution matrix\\n  \\\\f$X\\\\f$ and the right-hand side matrix \\\\f$B\\\\f$ that is multiplied by \\\\f$\\\\alpha\\\\f$, such that\\n  \\\\f[\\n    op(A) \\\\cdot op(X) = \\\\alpha \\\\cdot op(B),\\n  \\\\f]\\n  with\\n  \\\\f[\\n    op(A) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        A,   & \\\\text{if trans_A == rocsparse_operation_none} \\\\\\\\\\n        A^T, & \\\\text{if trans_A == rocsparse_operation_transpose} \\\\\\\\\\n        A^H, & \\\\text{if trans_A == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n  ,\\n  \\\\f[\\n    op(B) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        B,   & \\\\text{if trans_B == rocsparse_operation_none} \\\\\\\\\\n        B^T, & \\\\text{if trans_B == rocsparse_operation_transpose} \\\\\\\\\\n        B^H, & \\\\text{if trans_B == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n  and\\n  \\\\f[\\n    op(X) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        X,   & \\\\text{if trans_B == rocsparse_operation_none} \\\\\\\\\\n        X^T, & \\\\text{if trans_B == rocsparse_operation_transpose} \\\\\\\\\\n        X^H, & \\\\text{if trans_B == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n\\n  \\\\p rocsparse_csrsm_solve requires a user allocated temporary buffer. Its size is\\n  returned by rocsparse_scsrsm_buffer_size(), rocsparse_dcsrsm_buffer_size(),\\n  rocsparse_ccsrsm_buffer_size() or rocsparse_zcsrsm_buffer_size(). Furthermore,\\n  analysis meta data is required. It can be obtained by rocsparse_scsrsm_analysis(),\\n  rocsparse_dcsrsm_analysis(), rocsparse_ccsrsm_analysis() or\\n  rocsparse_zcsrsm_analysis(). \\\\p rocsparse_csrsm_solve reports the first zero pivot\\n  (either numerical or structural zero). The zero pivot status can be checked calling\\n  rocsparse_csrsm_zero_pivot(). If\\n  \\\\ref rocsparse_diag_type == \\\\ref rocsparse_diag_type_unit, no zero pivot will be\\n  reported, even if \\\\f$A_{j,j} = 0\\\\f$ for some \\\\f$j\\\\f$.\\n\\n  \\\\note\\n  The sparse CSR matrix has to be sorted. This can be achieved by calling\\n  rocsparse_csrsort().\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  Currently, only \\\\p trans_A != \\\\ref rocsparse_operation_conjugate_transpose and\\n  \\\\p trans_B != \\\\ref rocsparse_operation_conjugate_transpose is supported.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  trans_A     matrix A operation type.\\n  @param[in]\\n  trans_B     matrix B operation type.\\n  @param[in]\\n  m           number of rows of the sparse CSR matrix A.\\n  @param[in]\\n  nrhs        number of columns of the dense matrix op(B).\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse CSR matrix A.\\n  @param[in]\\n  alpha       scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  descr       descriptor of the sparse CSR matrix A.\\n  @param[in]\\n  csr_val     array of \\\\p nnz elements of the sparse CSR matrix A.\\n  @param[in]\\n  csr_row_ptr array of \\\\p m+1 elements that point to the start of every row of the\\n              sparse CSR matrix A.\\n  @param[in]\\n  csr_col_ind array of \\\\p nnz elements containing the column indices of the sparse\\n              CSR matrix A.\\n  @param[inout]\\n  B           array of \\\\p m \\\\f$\\\\times\\\\f$ \\\\p nrhs elements of the rhs matrix B.\\n  @param[in]\\n  ldb         leading dimension of rhs matrix B.\\n  @param[in]\\n  info        structure that holds the information collected during the analysis step.\\n  @param[in]\\n  policy      \\\\ref rocsparse_solve_policy_auto.\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m, \\\\p nrhs or \\\\p nnz is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p alpha, \\\\p descr, \\\\p csr_val,\\n              \\\\p csr_row_ptr, \\\\p csr_col_ind, \\\\p B, \\\\p info or \\\\p temp_buffer pointer\\n              is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p trans_A == \\\\ref rocsparse_operation_conjugate_transpose,\\n              \\\\p trans_B == \\\\ref rocsparse_operation_conjugate_transpose or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n\\n  \\\\par Example\\n  Consider the lower triangular \\\\f$m \\\\times m\\\\f$ matrix \\\\f$L\\\\f$, stored in CSR\\n  storage format with unit diagonal. The following example solves \\\\f$L \\\\cdot X = B\\\\f$.\\n  \\\\code{.c}\\n      // Create rocSPARSE handle\\n      rocsparse_handle handle;\\n      rocsparse_create_handle(&handle);\\n\\n      // Create matrix descriptor\\n      rocsparse_mat_descr descr;\\n      rocsparse_create_mat_descr(&descr);\\n      rocsparse_set_mat_fill_mode(descr, rocsparse_fill_mode_lower);\\n      rocsparse_set_mat_diag_type(descr, rocsparse_diag_type_unit);\\n\\n      // Create matrix info structure\\n      rocsparse_mat_info info;\\n      rocsparse_create_mat_info(&info);\\n\\n      // Obtain required buffer size\\n      size_t buffer_size;\\n      rocsparse_dcsrsm_buffer_size(handle,\\n                                   rocsparse_operation_none,\\n                                   rocsparse_operation_none,\\n                                   m,\\n                                   nrhs,\\n                                   nnz,\\n                                   &alpha,\\n                                   descr,\\n                                   csr_val,\\n                                   csr_row_ptr,\\n                                   csr_col_ind,\\n                                   B,\\n                                   ldb,\\n                                   info,\\n                                   rocsparse_solve_policy_auto,\\n                                   &buffer_size);\\n\\n      // Allocate temporary buffer\\n      void* temp_buffer;\\n      hipMalloc(&temp_buffer, buffer_size);\\n\\n      // Perform analysis step\\n      rocsparse_dcsrsm_analysis(handle,\\n                                rocsparse_operation_none,\\n                                rocsparse_operation_none,\\n                                m,\\n                                nrhs,\\n                                nnz,\\n                                &alpha,\\n                                descr,\\n                                csr_val,\\n                                csr_row_ptr,\\n                                csr_col_ind,\\n                                B,\\n                                ldb,\\n                                info,\\n                                rocsparse_analysis_policy_reuse,\\n                                rocsparse_solve_policy_auto,\\n                                temp_buffer);\\n\\n      // Solve LX = B\\n      rocsparse_dcsrsm_solve(handle,\\n                             rocsparse_operation_none,\\n                             rocsparse_operation_none,\\n                             m,\\n                             nrhs,\\n                             nnz,\\n                             &alpha,\\n                             descr,\\n                             csr_val,\\n                             csr_row_ptr,\\n                             csr_col_ind,\\n                             B,\\n                             ldb,\\n                             info,\\n                             rocsparse_solve_policy_auto,\\n                             temp_buffer);\\n\\n      // No zero pivot should be found, with L having unit diagonal\\n\\n      // Clean up\\n      hipFree(temp_buffer);\\n      rocsparse_destroy_mat_info(info);\\n      rocsparse_destroy_mat_descr(descr);\\n      rocsparse_destroy_handle(handle);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_scsrsm_solve(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        nrhs: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const f32,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        B: *mut f32,\n        ldb: rocsparse_int,\n        info: rocsparse_mat_info,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsrsm_solve(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        nrhs: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const f64,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        B: *mut f64,\n        ldb: rocsparse_int,\n        info: rocsparse_mat_info,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsrsm_solve(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        nrhs: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const rocsparse_float_complex,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        B: *mut rocsparse_float_complex,\n        ldb: rocsparse_int,\n        info: rocsparse_mat_info,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsrsm_solve(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        nrhs: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const rocsparse_double_complex,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        B: *mut rocsparse_double_complex,\n        ldb: rocsparse_int,\n        info: rocsparse_mat_info,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level3_module\\n  \\\\brief Sparse matrix dense matrix multiplication using GEneral BSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_gebsrmm multiplies the scalar \\\\f$\\\\alpha\\\\f$ with a sparse \\\\f$mb \\\\times kb\\\\f$\\n  matrix \\\\f$A\\\\f$, defined in GEneral BSR storage format, and the dense \\\\f$k \\\\times n\\\\f$\\n  matrix \\\\f$B\\\\f$ (where \\\\f$k = col_block\\\\_dim \\\\times kb\\\\f$) and adds the result to the dense\\n  \\\\f$m \\\\times n\\\\f$ matrix \\\\f$C\\\\f$ (where \\\\f$m = row_block\\\\_dim \\\\times mb\\\\f$) that\\n  is multiplied by the scalar \\\\f$\\\\beta\\\\f$, such that\\n  \\\\f[\\n    C := \\\\alpha \\\\cdot op(A) \\\\cdot op(B) + \\\\beta \\\\cdot C,\\n  \\\\f]\\n  with\\n  \\\\f[\\n    op(A) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        A,   & \\\\text{if trans_A == rocsparse_operation_none} \\\\\\\\\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n  and\\n  \\\\f[\\n    op(B) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        B,   & \\\\text{if trans_B == rocsparse_operation_none} \\\\\\\\\\n        B^T, & \\\\text{if trans_B == rocsparse_operation_transpose} \\\\\\\\\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  Currently, only \\\\p trans_A == \\\\ref rocsparse_operation_none is supported.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  dir         the storage format of the blocks. Can be \\\\ref rocsparse_direction_row or \\\\ref rocsparse_direction_column.\\n  @param[in]\\n  trans_A     matrix \\\\f$A\\\\f$ operation type. Currently, only \\\\ref rocsparse_operation_none is supported.\\n  @param[in]\\n  trans_B     matrix \\\\f$B\\\\f$ operation type. Currently, only \\\\ref rocsparse_operation_none and rocsparse_operation_transpose\\n              are supported.\\n  @param[in]\\n  mb          number of block rows of the sparse GEneral BSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  n           number of columns of the dense matrix \\\\f$op(B)\\\\f$ and \\\\f$C\\\\f$.\\n  @param[in]\\n  kb          number of block columns of the sparse GEneral BSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  nnzb        number of non-zero blocks of the sparse GEneral BSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  alpha       scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  descr       descriptor of the sparse GEneral BSR matrix \\\\f$A\\\\f$. Currently, only\\n              \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  bsr_val     array of \\\\p nnzb*row_block_dim*col_block_dim elements of the sparse GEneral BSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  bsr_row_ptr array of \\\\p mb+1 elements that point to the start of every block row of the\\n              sparse GEneral BSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  bsr_col_ind array of \\\\p nnzb elements containing the block column indices of the sparse\\n              GEneral BSR matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  row_block_dim   row size of the blocks in the sparse GEneral BSR matrix.\\n  @param[in]\\n  col_block_dim   column size of the blocks in the sparse GEneral BSR matrix.\\n  @param[in]\\n  B           array of dimension \\\\f$ldb \\\\times n\\\\f$ (\\\\f$op(B) == B\\\\f$),\\n              \\\\f$ldb \\\\times k\\\\f$ otherwise.\\n  @param[in]\\n  ldb         leading dimension of \\\\f$B\\\\f$, must be at least \\\\f$\\\\max{(1, k)}\\\\f$ (\\\\f$ op(B) == B\\\\f$) where \\\\f$k = col\\\\_block\\\\_dim \\\\times kb\\\\f$,\\n  \\\\f$\\\\max{(1, n)}\\\\f$ otherwise.\\n  @param[in]\\n  beta        scalar \\\\f$\\\\beta\\\\f$.\\n  @param[inout]\\n  C           array of dimension \\\\f$ldc \\\\times n\\\\f$.\\n  @param[in]\\n  ldc         leading dimension of \\\\f$C\\\\f$, must be at least \\\\f$\\\\max{(1, m)}\\\\f$ (\\\\f$ op(A) == A\\\\f$) where \\\\f$m = row\\\\_block\\\\_dim \\\\times mb\\\\f$,\\n  \\\\f$\\\\max{(1, k)}\\\\f$ where \\\\f$k = col\\\\_block\\\\_dim \\\\times kb\\\\f$ otherwise.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p mb, \\\\p n, \\\\p kb, \\\\p nnzb, \\\\p ldb, \\\\p ldc, \\\\p row_block_dim\\n              or \\\\p col_block_dim is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p alpha, \\\\p bsr_val,\\n              \\\\p bsr_row_ptr, \\\\p bsr_col_ind, \\\\p B, \\\\p beta or \\\\p C pointer is invalid.\\n  \\\\retval     rocsparse_status_arch_mismatch the device is not supported.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p trans_A != \\\\ref rocsparse_operation_none or\\n              \\\\p trans_B == \\\\ref rocsparse_operation_conjugate_transpose or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n\\n  \\\\par Example\\n  This example multiplies a GEneral BSR matrix with a dense matrix.\\n  \\\\code{.c}\\n      //     1 2 0 3 0 0\\n      // A = 0 4 5 0 0 0\\n      //     0 0 0 7 8 0\\n      //     0 0 1 2 4 1\\n\\n      rocsparse_int row_block_dim = 2;\\n      rocsparse_int col_block_dim = 3;\\n      rocsparse_int mb   = 2;\\n      rocsparse_int kb   = 2;\\n      rocsparse_int nnzb = 4;\\n      rocsparse_direction dir = rocsparse_direction_row;\\n\\n      bsr_row_ptr[mb+1]                 = {0, 2, 4};                                        // device memory\\n      bsr_col_ind[nnzb]                 = {0, 1, 0, 1};                                     // device memory\\n      bsr_val[nnzb*row_block_dim*col_block_dim] = {1, 2, 0, 0, 4, 5, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 7, 8, 0, 2, 4, 1}; // device memory\\n\\n      // Set dimension n of B\\n      rocsparse_int n = 64;\\n      rocsparse_int m = mb * row_block_dim;\\n      rocsparse_int k = kb * col_block_dim;\\n\\n      // Allocate and generate dense matrix B\\n      std::vector<float> hB(k * n);\\n      for(rocsparse_int i = 0; i < k * n; ++i)\\n      {\\n          hB[i] = static_cast<float>(rand()) / RAND_MAX;\\n      }\\n\\n      // Copy B to the device\\n      float* B;\\n      hipMalloc((void**)&B, sizeof(float) * k * n);\\n      hipMemcpy(B, hB.data(), sizeof(float) * k * n, hipMemcpyHostToDevice);\\n\\n      // alpha and beta\\n      float alpha = 1.0f;\\n      float beta  = 0.0f;\\n\\n      // Allocate memory for the resulting matrix C\\n      float* C;\\n      hipMalloc((void**)&C, sizeof(float) * m * n);\\n\\n      // Perform the matrix multiplication\\n      rocsparse_sgebsrmm(handle,\\n                         dir,\\n                         rocsparse_operation_none,\\n                         rocsparse_operation_none,\\n                         mb,\\n                         n,\\n                         kb,\\n                         nnzb,\\n                         &alpha,\\n                         descr,\\n                         bsr_val,\\n                         bsr_row_ptr,\\n                         bsr_col_ind,\\n                         row_block_dim,\\n                         col_block_dim,\\n                         B,\\n                         k,\\n                         &beta,\\n                         C,\\n                         m);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_sgebsrmm(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        mb: rocsparse_int,\n        n: rocsparse_int,\n        kb: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const f32,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f32,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        B: *const f32,\n        ldb: rocsparse_int,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dgebsrmm(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        mb: rocsparse_int,\n        n: rocsparse_int,\n        kb: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const f64,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f64,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        B: *const f64,\n        ldb: rocsparse_int,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cgebsrmm(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        mb: rocsparse_int,\n        n: rocsparse_int,\n        kb: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const rocsparse_float_complex,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_float_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        B: *const rocsparse_float_complex,\n        ldb: rocsparse_int,\n        beta: *const rocsparse_float_complex,\n        C: *mut rocsparse_float_complex,\n        ldc: rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zgebsrmm(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        mb: rocsparse_int,\n        n: rocsparse_int,\n        kb: rocsparse_int,\n        nnzb: rocsparse_int,\n        alpha: *const rocsparse_double_complex,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_double_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        B: *const rocsparse_double_complex,\n        ldb: rocsparse_int,\n        beta: *const rocsparse_double_complex,\n        C: *mut rocsparse_double_complex,\n        ldc: rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup level3_module\\n  \\\\brief Dense matrix sparse matrix multiplication using CSR storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_gemmi multiplies the scalar \\\\f$\\\\alpha\\\\f$ with a dense \\\\f$m \\\\times k\\\\f$\\n  matrix \\\\f$A\\\\f$ and the sparse \\\\f$k \\\\times n\\\\f$ matrix \\\\f$B\\\\f$, defined in CSR\\n  storage format and adds the result to the dense \\\\f$m \\\\times n\\\\f$ matrix \\\\f$C\\\\f$ that\\n  is multiplied by the scalar \\\\f$\\\\beta\\\\f$, such that\\n  \\\\f[\\n    C := \\\\alpha \\\\cdot op(A) \\\\cdot op(B) + \\\\beta \\\\cdot C\\n  \\\\f]\\n  with\\n  \\\\f[\\n    op(A) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        A,   & \\\\text{if trans_A == rocsparse_operation_none} \\\\\\\\\\n        A^T, & \\\\text{if trans_A == rocsparse_operation_transpose} \\\\\\\\\\n        A^H, & \\\\text{if trans_A == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n  and\\n  \\\\f[\\n    op(B) = \\\\left\\\\{\\n    \\\\begin{array}{ll}\\n        B,   & \\\\text{if trans_B == rocsparse_operation_none} \\\\\\\\\\n        B^T, & \\\\text{if trans_B == rocsparse_operation_transpose} \\\\\\\\\\n        B^H, & \\\\text{if trans_B == rocsparse_operation_conjugate_transpose}\\n    \\\\end{array}\\n    \\\\right.\\n  \\\\f]\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  trans_A     matrix \\\\f$A\\\\f$ operation type.\\n  @param[in]\\n  trans_B     matrix \\\\f$B\\\\f$ operation type.\\n  @param[in]\\n  m           number of rows of the dense matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  n           number of columns of the sparse CSR matrix \\\\f$op(B)\\\\f$ and \\\\f$C\\\\f$.\\n  @param[in]\\n  k           number of columns of the dense matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse CSR matrix \\\\f$B\\\\f$.\\n  @param[in]\\n  alpha       scalar \\\\f$\\\\alpha\\\\f$.\\n  @param[in]\\n  A           array of dimension \\\\f$lda \\\\times k\\\\f$ (\\\\f$op(A) == A\\\\f$) or\\n              \\\\f$lda \\\\times m\\\\f$ (\\\\f$op(A) == A^T\\\\f$ or \\\\f$op(A) == A^H\\\\f$).\\n  @param[in]\\n  lda         leading dimension of \\\\f$A\\\\f$, must be at least \\\\f$m\\\\f$\\n              (\\\\f$op(A) == A\\\\f$) or \\\\f$k\\\\f$ (\\\\f$op(A) == A^T\\\\f$ or\\n              \\\\f$op(A) == A^H\\\\f$).\\n  @param[in]\\n  descr       descriptor of the sparse CSR matrix \\\\f$B\\\\f$. Currently, only\\n              \\\\ref rocsparse_matrix_type_general is supported.\\n  @param[in]\\n  csr_val     array of \\\\p nnz elements of the sparse CSR matrix \\\\f$B\\\\f$.\\n  @param[in]\\n  csr_row_ptr array of \\\\p m+1 elements that point to the start of every row of the\\n              sparse CSR matrix \\\\f$B\\\\f$.\\n  @param[in]\\n  csr_col_ind array of \\\\p nnz elements containing the column indices of the sparse CSR\\n              matrix \\\\f$B\\\\f$.\\n  @param[in]\\n  beta        scalar \\\\f$\\\\beta\\\\f$.\\n  @param[inout]\\n  C           array of dimension \\\\f$ldc \\\\times n\\\\f$ that holds the values of \\\\f$C\\\\f$.\\n  @param[in]\\n  ldc         leading dimension of \\\\f$C\\\\f$, must be at least \\\\f$m\\\\f$.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m, \\\\p n, \\\\p k, \\\\p nnz, \\\\p lda or \\\\p ldc\\n              is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p alpha, \\\\p A, \\\\p csr_val,\\n              \\\\p csr_row_ptr, \\\\p csr_col_ind, \\\\p beta or \\\\p C pointer is invalid.\\n\\n  \\\\par Example\\n  This example multiplies a dense matrix with a CSC matrix.\\n  \\\\code{.c}\\n      rocsparse_int m   = 2;\\n      rocsparse_int n   = 5;\\n      rocsparse_int k   = 3;\\n      rocsparse_int nnz = 8;\\n      rocsparse_int lda = m;\\n      rocsparse_int ldc = m;\\n\\n      // Matrix A (m x k)\\n      // (  9.0  10.0  11.0 )\\n      // ( 12.0  13.0  14.0 )\\n\\n      // Matrix B (k x n)\\n      // ( 1.0  2.0  0.0  3.0  0.0 )\\n      // ( 0.0  4.0  5.0  0.0  0.0 )\\n      // ( 6.0  0.0  0.0  7.0  8.0 )\\n\\n      // Matrix C (m x n)\\n      // ( 15.0  16.0  17.0  18.0  19.0 )\\n      // ( 20.0  21.0  22.0  23.0  24.0 )\\n\\n      A[lda * k]           = {9.0, 12.0, 10.0, 13.0, 11.0, 14.0};      // device memory\\n      csc_col_ptr_B[n + 1] = {0, 2, 4, 5, 7, 8};                       // device memory\\n      csc_row_ind_B[nnz]   = {0, 0, 1, 1, 2, 3, 3, 4};                 // device memory\\n      csc_val_B[nnz]       = {1.0, 6.0, 2.0, 4.0, 5.0, 3.0, 7.0, 8.0}; // device memory\\n      C[ldc * n]           = {15.0, 20.0, 16.0, 21.0, 17.0, 22.0,      // device memory\\n                              18.0, 23.0, 19.0, 24.0};\\n\\n      // alpha and beta\\n      float alpha = 1.0f;\\n      float beta  = 0.0f;\\n\\n      // Perform the matrix multiplication\\n      rocsparse_sgemmi(handle,\\n                       rocsparse_operation_none,\\n                       rocsparse_operation_transpose,\\n                       m,\\n                       n,\\n                       k,\\n                       nnz,\\n                       &alpha,\\n                       A,\\n                       lda,\\n                       descr_B,\\n                       csc_val_B,\\n                       csc_col_ptr_B,\\n                       csc_row_ind_B,\\n                       &beta,\\n                       C,\\n                       ldc);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_sgemmi(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        k: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const f32,\n        A: *const f32,\n        lda: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        beta: *const f32,\n        C: *mut f32,\n        ldc: rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dgemmi(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        k: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const f64,\n        A: *const f64,\n        lda: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        beta: *const f64,\n        C: *mut f64,\n        ldc: rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cgemmi(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        k: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const rocsparse_float_complex,\n        A: *const rocsparse_float_complex,\n        lda: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        beta: *const rocsparse_float_complex,\n        C: *mut rocsparse_float_complex,\n        ldc: rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zgemmi(\n        handle: rocsparse_handle,\n        trans_A: rocsparse_operation,\n        trans_B: rocsparse_operation,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        k: rocsparse_int,\n        nnz: rocsparse_int,\n        alpha: *const rocsparse_double_complex,\n        A: *const rocsparse_double_complex,\n        lda: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        beta: *const rocsparse_double_complex,\n        C: *mut rocsparse_double_complex,\n        ldc: rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup precond_module\n  \\brief Incomplete Cholesky factorization with 0 fill-ins and no pivoting using BSR\n  storage format\n\n  \\details\n  \\p rocsparse_bsric0_zero_pivot returns \\ref rocsparse_status_zero_pivot, if either a\n  structural or numerical zero has been found during rocsparse_sbsric0(),\n  rocsparse_dbsric0(), rocsparse_cbsric0() or rocsparse_zbsric0() computation.\n  The first zero pivot \\f$j\\f$ at \\f$A_{j,j}\\f$ is stored in \\p position, using same\n  index base as the BSR matrix.\n\n  \\p position can be in host or device memory. If no zero pivot has been found,\n  \\p position is set to -1 and \\ref rocsparse_status_success is returned instead.\n\n  \\note\n  If a zero pivot is found, \\p position=j means that either the diagonal block \\p A(j,j)\n  is missing (structural zero) or the diagonal block \\p A(j,j) is not positive definite\n  (numerical zero).\n\n  \\note \\p rocsparse_bsric0_zero_pivot is a blocking function. It might influence\n  performance negatively.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[in]\n  info        structure that holds the information collected during the analysis step.\n  @param[inout]\n  position    pointer to zero pivot \\f$j\\f$, can be in host or device memory.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_pointer \\p info or \\p position pointer is\n              invalid.\n  \\retval     rocsparse_status_internal_error an internal error occurred.\n  \\retval     rocsparse_status_zero_pivot zero pivot has been found.*/\n    pub fn rocsparse_bsric0_zero_pivot(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n        position: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup precond_module\\n  \\\\brief Incomplete Cholesky factorization with 0 fill-ins and no pivoting using BSR\\n  storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_bsric0_buffer_size returns the size of the temporary storage buffer\\n  that is required by rocsparse_sbsric0_analysis(), rocsparse_dbsric0_analysis(),\\n  rocsparse_cbsric0_analysis(), rocsparse_zbsric0_analysis(), rocsparse_sbsric0(),\\n  rocsparse_dbsric0(), rocsparse_sbsric0() and rocsparse_dbsric0(). The temporary\\n  storage buffer must be allocated by the user. The size of the temporary storage\\n  buffer is identical to the size returned by rocsparse_sbsrsv_buffer_size(),\\n  rocsparse_dbsrsv_buffer_size(), rocsparse_cbsrsv_buffer_size(), rocsparse_zbsrsv_buffer_size(),\\n  rocsparse_sbsrilu0_buffer_size(), rocsparse_dbsrilu0_buffer_size(), rocsparse_cbsrilu0_buffer_size()\\n  and rocsparse_zbsrilu0_buffer_size() if the matrix sparsity pattern is identical. The user\\n  allocated buffer can thus be shared between subsequent calls to those functions.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  dir             direction that specifies whether to count nonzero elements by \\\\ref rocsparse_direction_row or by\\n              \\\\ref rocsparse_direction_row.\\n  @param[in]\\n  mb          number of block rows in the sparse BSR matrix.\\n  @param[in]\\n  nnzb        number of non-zero block entries of the sparse BSR matrix.\\n  @param[in]\\n  descr       descriptor of the sparse BSR matrix.\\n  @param[in]\\n  bsr_val     array of length \\\\p nnzb*block_dim*block_dim containing the values of the sparse BSR matrix.\\n  @param[in]\\n  bsr_row_ptr array of \\\\p mb+1 elements that point to the start of every block row of the\\n              sparse BSR matrix.\\n  @param[in]\\n  bsr_col_ind array of \\\\p nnzb elements containing the block column indices of the sparse BSR matrix.\\n  @param[in]\\n  block_dim   the block dimension of the BSR matrix. Between 1 and m where \\\\p m=mb*block_dim.\\n  @param[out]\\n  info        structure that holds the information collected during the analysis step.\\n  @param[out]\\n  buffer_size number of bytes of the temporary storage buffer required by\\n              rocsparse_sbsric0_analysis(), rocsparse_dbsric0_analysis(),\\n              rocsparse_cbsric0_analysis(), rocsparse_zbsric0_analysis(),\\n              rocsparse_sbsric0(), rocsparse_dbsric0(), rocsparse_cbsric0()\\n              and rocsparse_zbsric0().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p mb, \\\\p nnzb, or \\\\p block_dim is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p bsr_val, \\\\p bsr_row_ptr,\\n              \\\\p bsr_col_ind, \\\\p info or \\\\p buffer_size pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_sbsric0_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f32,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dbsric0_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f64,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cbsric0_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_float_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zbsric0_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_double_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup precond_module\\n  \\\\brief Incomplete Cholesky factorization with 0 fill-ins and no pivoting using BSR\\n  storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_bsric0_analysis performs the analysis step for rocsparse_sbsric0()\\n  rocsparse_dbsric0(), rocsparse_cbsric0(), and rocsparse_zbsric0(). It is expected\\n  that this function will be executed only once for a given matrix and particular\\n  operation type. The analysis meta data can be cleared by rocsparse_bsric0_clear().\\n\\n  \\\\p rocsparse_bsric0_analysis can share its meta data with\\n  rocsparse_sbsrilu0_analysis(), rocsparse_dbsrilu0_analysis(),\\n  rocsparse_cbsrilu0_analysis(), rocsparse_zbsrilu0_analysis(),\\n  rocsparse_sbsrsv_analysis(), rocsparse_dbsrsv_analysis(),\\n  rocsparse_cbsrsv_analysis(), rocsparse_zbsrsv_analysis(),\\n  rocsparse_sbsrsm_analysis(), rocsparse_dbsrsm_analysis(),\\n  rocsparse_cbsrsm_analysis() and rocsparse_zbsrsm_analysis(). Selecting\\n  \\\\ref rocsparse_analysis_policy_reuse policy can greatly improve computation\\n  performance of meta data. However, the user need to make sure that the sparsity\\n  pattern remains unchanged. If this cannot be assured,\\n  \\\\ref rocsparse_analysis_policy_force has to be used.\\n\\n  \\\\note\\n  If the matrix sparsity pattern changes, the gathered information will become invalid.\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  dir             direction that specified whether to count nonzero elements by \\\\ref rocsparse_direction_row or by\\n              \\\\ref rocsparse_direction_row.\\n  @param[in]\\n  mb          number of block rows in the sparse BSR matrix.\\n  @param[in]\\n  nnzb        number of non-zero block entries of the sparse BSR matrix.\\n  @param[in]\\n  descr       descriptor of the sparse BSR matrix.\\n  @param[in]\\n  bsr_val     array of length \\\\p nnzb*block_dim*block_dim containing the values of the sparse BSR matrix.\\n  @param[in]\\n  bsr_row_ptr array of \\\\p mb+1 elements that point to the start of every block row of the\\n              sparse BSR matrix.\\n  @param[in]\\n  bsr_col_ind array of \\\\p nnzb elements containing the block column indices of the sparse BSR matrix.\\n  @param[in]\\n  block_dim   the block dimension of the BSR matrix. Between 1 and m where \\\\p m=mb*block_dim.\\n  @param[out]\\n  info        structure that holds the information collected during\\n              the analysis step.\\n  @param[in]\\n  analysis    \\\\ref rocsparse_analysis_policy_reuse or\\n              \\\\ref rocsparse_analysis_policy_force.\\n  @param[in]\\n  solve       \\\\ref rocsparse_solve_policy_auto.\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p mb, \\\\p nnzb, or \\\\p block_dim is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p bsr_val, \\\\p bsr_row_ptr,\\n              \\\\p bsr_col_ind, \\\\p info or \\\\p temp_buffer pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_sbsric0_analysis(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f32,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dbsric0_analysis(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f64,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cbsric0_analysis(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_float_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zbsric0_analysis(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_double_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup precond_module\n  \\brief Incomplete Cholesky factorization with 0 fill-ins and no pivoting using BSR\n  storage format\n\n  \\details\n  \\p rocsparse_bsric0_clear deallocates all memory that was allocated by\n  rocsparse_sbsric0_analysis(), rocsparse_dbsric0_analysis(), rocsparse_cbsric0_analysis()\n  or rocsparse_zbsric0_analysis(). This is especially useful, if memory is an issue and\n  the analysis data is not required for further computation.\n\n  \\note\n  Calling \\p rocsparse_bsric0_clear is optional. All allocated resources will be\n  cleared, when the opaque \\ref rocsparse_mat_info struct is destroyed using\n  rocsparse_destroy_mat_info().\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[inout]\n  info        structure that holds the information collected during the analysis step.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_pointer \\p info pointer is invalid.\n  \\retval     rocsparse_status_memory_error the buffer holding the meta data could not\n              be deallocated.\n  \\retval     rocsparse_status_internal_error an internal error occurred.*/\n    pub fn rocsparse_bsric0_clear(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup precond_module\\n  \\\\brief Incomplete Cholesky factorization with 0 fill-ins and no pivoting using BSR\\n  storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_bsric0 computes the incomplete Cholesky factorization with 0 fill-ins\\n  and no pivoting of a sparse \\\\f$mb \\\\times mb\\\\f$ BSR matrix \\\\f$A\\\\f$, such that\\n  \\\\f[\\n    A \\\\approx LL^T\\n  \\\\f]\\n\\n  \\\\p rocsparse_bsric0 requires a user allocated temporary buffer. Its size is returned\\n  by rocsparse_sbsric0_buffer_size(), rocsparse_dbsric0_buffer_size(),\\n  rocsparse_cbsric0_buffer_size() or rocsparse_zbsric0_buffer_size(). Furthermore,\\n  analysis meta data is required. It can be obtained by rocsparse_sbsric0_analysis(),\\n  rocsparse_dbsric0_analysis(), rocsparse_cbsric0_analysis() or rocsparse_zbsric0_analysis().\\n  \\\\p rocsparse_bsric0 reports the first zero pivot (either numerical or structural zero).\\n  The zero pivot status can be obtained by calling rocsparse_bsric0_zero_pivot().\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  dir             direction that specified whether to count nonzero elements by \\\\ref rocsparse_direction_row or by\\n              \\\\ref rocsparse_direction_row.\\n  @param[in]\\n  mb          number of block rows in the sparse BSR matrix.\\n  @param[in]\\n  nnzb        number of non-zero block entries of the sparse BSR matrix.\\n  @param[in]\\n  descr       descriptor of the sparse BSR matrix.\\n  @param[inout]\\n  bsr_val     array of length \\\\p nnzb*block_dim*block_dim containing the values of the sparse BSR matrix.\\n  @param[in]\\n  bsr_row_ptr array of \\\\p mb+1 elements that point to the start of every block row of the\\n              sparse BSR matrix.\\n  @param[in]\\n  bsr_col_ind array of \\\\p nnzb elements containing the block column indices of the sparse BSR matrix.\\n  @param[in]\\n  block_dim   the block dimension of the BSR matrix. Between 1 and m where \\\\p m=mb*block_dim.\\n  @param[in]\\n  info        structure that holds the information collected during the analysis step.\\n  @param[in]\\n  policy      \\\\ref rocsparse_solve_policy_auto.\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p mb, \\\\p nnzb, or \\\\p block_dim is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p bsr_val, \\\\p bsr_row_ptr\\n              or \\\\p bsr_col_ind pointer is invalid.\\n  \\\\retval     rocsparse_status_arch_mismatch the device is not supported.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n\\n  \\\\par Example\\n  Consider the sparse \\\\f$m \\\\times m\\\\f$ matrix \\\\f$A\\\\f$, stored in BSR\\n  storage format. The following example computes the incomplete Cholesky factorization\\n  \\\\f$M \\\\approx LL^T\\\\f$ and solves the preconditioned system \\\\f$My = x\\\\f$.\\n  \\\\code{.c}\\n      // Create rocSPARSE handle\\n      rocsparse_handle handle;\\n      rocsparse_create_handle(&handle);\\n\\n      // Create matrix descriptor for M\\n      rocsparse_mat_descr descr_M;\\n      rocsparse_create_mat_descr(&descr_M);\\n\\n      // Create matrix descriptor for L\\n      rocsparse_mat_descr descr_L;\\n      rocsparse_create_mat_descr(&descr_L);\\n      rocsparse_set_mat_fill_mode(descr_L, rocsparse_fill_mode_lower);\\n      rocsparse_set_mat_diag_type(descr_L, rocsparse_diag_type_unit);\\n\\n      // Create matrix descriptor for L'\\n      rocsparse_mat_descr descr_Lt;\\n      rocsparse_create_mat_descr(&descr_Lt);\\n      rocsparse_set_mat_fill_mode(descr_Lt, rocsparse_fill_mode_upper);\\n      rocsparse_set_mat_diag_type(descr_Lt, rocsparse_diag_type_non_unit);\\n\\n      // Create matrix info structure\\n      rocsparse_mat_info info;\\n      rocsparse_create_mat_info(&info);\\n\\n      // Obtain required buffer size\\n      size_t buffer_size_M;\\n      size_t buffer_size_L;\\n      size_t buffer_size_Lt;\\n      rocsparse_dbsric0_buffer_size(handle,\\n                                     rocsparse_direction_row,\\n                                     mb,\\n                                     nnzb,\\n                                     descr_M,\\n                                     bsr_val,\\n                                     bsr_row_ptr,\\n                                     bsr_col_ind,\\n                                     block_dim,\\n                                     info,\\n                                     &buffer_size_M);\\n      rocsparse_dbsrsv_buffer_size(handle,\\n                                   rocsparse_direction_row,\\n                                   rocsparse_operation_none,\\n                                   mb,\\n                                   nnzb,\\n                                   descr_L,\\n                                   bsr_val,\\n                                   bsr_row_ptr,\\n                                   bsr_col_ind,\\n                                   block_dim,\\n                                   info,\\n                                   &buffer_size_L);\\n      rocsparse_dbsrsv_buffer_size(handle,\\n                                   rocsparse_direction_row,\\n                                   rocsparse_operation_transpose,\\n                                   mb,\\n                                   nnzb,\\n                                   descr_Lt,\\n                                   bsr_val,\\n                                   bsr_row_ptr,\\n                                   bsr_col_ind,\\n                                   block_dim,\\n                                   info,\\n                                   &buffer_size_Lt);\\n\\n      size_t buffer_size = max(buffer_size_M, max(buffer_size_L, buffer_size_Lt));\\n\\n      // Allocate temporary buffer\\n      void* temp_buffer;\\n      hipMalloc(&temp_buffer, buffer_size);\\n\\n      // Perform analysis steps, using rocsparse_analysis_policy_reuse to improve\\n      // computation performance\\n      rocsparse_dbsric0_analysis(handle,\\n                                  rocsparse_direction_row,\\n                                  mb,\\n                                  nnzb,\\n                                  descr_M,\\n                                  bsr_val,\\n                                  bsr_row_ptr,\\n                                  bsr_col_ind,\\n                                  block_dim,\\n                                  info,\\n                                  rocsparse_analysis_policy_reuse,\\n                                  rocsparse_solve_policy_auto,\\n                                  temp_buffer);\\n      rocsparse_dbsrsv_analysis(handle,\\n                                rocsparse_direction_row,\\n                                rocsparse_operation_none,\\n                                mb,\\n                                nnzb,\\n                                descr_L,\\n                                bsr_val,\\n                                bsr_row_ptr,\\n                                bsr_col_ind,\\n                                block_dim,\\n                                info,\\n                                rocsparse_analysis_policy_reuse,\\n                                rocsparse_solve_policy_auto,\\n                                temp_buffer);\\n      rocsparse_dbsrsv_analysis(handle,\\n                                rocsparse_direction_row,\\n                                rocsparse_operation_transpose,\\n                                mb,\\n                                nnzb,\\n                                descr_Lt,\\n                                bsr_val,\\n                                bsr_row_ptr,\\n                                bsr_col_ind,\\n                                block_dim,\\n                                info,\\n                                rocsparse_analysis_policy_reuse,\\n                                rocsparse_solve_policy_auto,\\n                                temp_buffer);\\n\\n      // Check for zero pivot\\n      rocsparse_int position;\\n      if(rocsparse_status_zero_pivot == rocsparse_bsric0_zero_pivot(handle,\\n                                                                    info,\\n                                                                    &position))\\n      {\\n          printf(\\\"A has structural zero at A(%d,%d)\\\\n\\\", position, position);\\n      }\\n\\n      // Compute incomplete Cholesky factorization M = LL'\\n      rocsparse_dbsric0(handle,\\n                         rocsparse_direction_row,\\n                         mb,\\n                         nnzb,\\n                         descr_M,\\n                         bsr_val,\\n                         bsr_row_ptr,\\n                         bsr_col_ind,\\n                         block_dim,\\n                         info,\\n                         rocsparse_solve_policy_auto,\\n                         temp_buffer);\\n\\n      // Check for zero pivot\\n      if(rocsparse_status_zero_pivot == rocsparse_bsric0_zero_pivot(handle,\\n                                                                     info,\\n                                                                     &position))\\n      {\\n          printf(\\\"L has structural and/or numerical zero at L(%d,%d)\\\\n\\\",\\n                 position,\\n                 position);\\n      }\\n\\n      // Solve Lz = x\\n      rocsparse_dbsrsv_solve(handle,\\n                             rocsparse_direction_row,\\n                             rocsparse_operation_none,\\n                             mb,\\n                             nnzb,\\n                             &alpha,\\n                             descr_L,\\n                             bsr_val,\\n                             bsr_row_ptr,\\n                             bsr_col_ind,\\n                             block_dim,\\n                             info,\\n                             x,\\n                             z,\\n                             rocsparse_solve_policy_auto,\\n                             temp_buffer);\\n\\n      // Solve L'y = z\\n      rocsparse_dbsrsv_solve(handle,\\n                             rocsparse_direction_row,\\n                             rocsparse_operation_transpose,\\n                             mb,\\n                             nnzb,\\n                             &alpha,\\n                             descr_Lt,\\n                             bsr_val,\\n                             bsr_row_ptr,\\n                             bsr_col_ind,\\n                             block_dim,\\n                             info,\\n                             z,\\n                             y,\\n                             rocsparse_solve_policy_auto,\\n                             temp_buffer);\\n\\n      // Clean up\\n      hipFree(temp_buffer);\\n      rocsparse_destroy_mat_info(info);\\n      rocsparse_destroy_mat_descr(descr_M);\\n      rocsparse_destroy_mat_descr(descr_L);\\n      rocsparse_destroy_mat_descr(descr_Lt);\\n      rocsparse_destroy_handle(handle);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_sbsric0(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *mut f32,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dbsric0(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *mut f64,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cbsric0(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *mut rocsparse_float_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zbsric0(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *mut rocsparse_double_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup precond_module\n  \\brief Incomplete LU factorization with 0 fill-ins and no pivoting using BSR storage\n  format\n\n  \\details\n  \\p rocsparse_bsrilu0_zero_pivot returns \\ref rocsparse_status_zero_pivot, if either a\n  structural or numerical zero has been found during rocsparse_sbsrilu0(),\n  rocsparse_dbsrilu0(), rocsparse_cbsrilu0() or rocsparse_zbsrilu0() computation.\n  The first zero pivot \\f$j\\f$ at \\f$A_{j,j}\\f$ is stored in \\p position, using same\n  index base as the BSR matrix.\n\n  \\p position can be in host or device memory. If no zero pivot has been found,\n  \\p position is set to -1 and \\ref rocsparse_status_success is returned instead.\n\n  \\note\n  If a zero pivot is found, \\p position \\f$=j\\f$ means that either the diagonal block\n  \\f$A_{j,j}\\f$ is missing (structural zero) or the diagonal block \\f$A_{j,j}\\f$ is not\n  invertible (numerical zero).\n\n  \\note \\p rocsparse_bsrilu0_zero_pivot is a blocking function. It might influence\n  performance negatively.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[in]\n  info        structure that holds the information collected during the analysis step.\n  @param[inout]\n  position    pointer to zero pivot \\f$j\\f$, can be in host or device memory.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_pointer \\p info or \\p position pointer is\n              invalid.\n  \\retval     rocsparse_status_internal_error an internal error occurred.\n  \\retval     rocsparse_status_zero_pivot zero pivot has been found.*/\n    pub fn rocsparse_bsrilu0_zero_pivot(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n        position: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup precond_module\\n  \\\\brief Incomplete LU factorization with 0 fill-ins and no pivoting using BSR storage\\n  format\\n\\n  \\\\details\\n  \\\\p rocsparse_bsrilu0_numeric_boost enables the user to replace a numerical value in\\n  an incomplete LU factorization. \\\\p tol is used to determine whether a numerical value\\n  is replaced by \\\\p boost_val, such that \\\\f$A_{j,j} = \\\\text{boost_val}\\\\f$ if\\n  \\\\f$\\\\text{tol} \\\\ge \\\\left|A_{j,j}\\\\right|\\\\f$.\\n\\n  \\\\note The boost value is enabled by setting \\\\p enable_boost to 1 or disabled by\\n  setting \\\\p enable_boost to 0.\\n\\n  \\\\note \\\\p tol and \\\\p boost_val can be in host or device memory.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle          handle to the rocsparse library context queue.\\n  @param[in]\\n  info            structure that holds the information collected during the analysis step.\\n  @param[in]\\n  enable_boost    enable/disable numeric boost.\\n  @param[in]\\n  boost_tol       tolerance to determine whether a numerical value is replaced or not.\\n  @param[in]\\n  boost_val       boost value to replace a numerical value.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p info, \\\\p tol or \\\\p boost_val pointer\\n              is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n/\\n/**@{\"]\n    pub fn rocsparse_sbsrilu0_numeric_boost(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n        enable_boost: ::core::ffi::c_int,\n        boost_tol: *const f32,\n        boost_val: *const f32,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dbsrilu0_numeric_boost(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n        enable_boost: ::core::ffi::c_int,\n        boost_tol: *const f64,\n        boost_val: *const f64,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cbsrilu0_numeric_boost(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n        enable_boost: ::core::ffi::c_int,\n        boost_tol: *const f32,\n        boost_val: *const rocsparse_float_complex,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zbsrilu0_numeric_boost(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n        enable_boost: ::core::ffi::c_int,\n        boost_tol: *const f64,\n        boost_val: *const rocsparse_double_complex,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dsbsrilu0_numeric_boost(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n        enable_boost: ::core::ffi::c_int,\n        boost_tol: *const f64,\n        boost_val: *const f32,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcbsrilu0_numeric_boost(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n        enable_boost: ::core::ffi::c_int,\n        boost_tol: *const f64,\n        boost_val: *const rocsparse_float_complex,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup precond_module\\n  \\\\brief Incomplete LU factorization with 0 fill-ins and no pivoting using BSR storage\\n  format\\n\\n  \\\\details\\n  \\\\p rocsparse_bsrilu0_buffer_size returns the size of the temporary storage buffer\\n  that is required by rocsparse_sbsrilu0_analysis(), rocsparse_dbsrilu0_analysis(),\\n  rocsparse_cbsrilu0_analysis(), rocsparse_zbsrilu0_analysis(), rocsparse_sbsrilu0(),\\n  rocsparse_dbsrilu0(), rocsparse_sbsrilu0() and rocsparse_dbsrilu0(). The temporary\\n  storage buffer must be allocated by the user. The size of the temporary storage\\n  buffer is identical to the size returned by rocsparse_sbsrsv_buffer_size(),\\n  rocsparse_dbsrsv_buffer_size(), rocsparse_cbsrsv_buffer_size(), rocsparse_zbsrsv_buffer_size(),\\n  rocsparse_sbsric0_buffer_size(), rocsparse_dbsric0_buffer_size(), rocsparse_cbsric0_buffer_size()\\n  and rocsparse_zbsric0_buffer_size() if the matrix sparsity pattern is identical. The user\\n  allocated buffer can thus be shared between subsequent calls to those functions.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  dir         direction that specifies whether to count nonzero elements by \\\\ref rocsparse_direction_row or by\\n              \\\\ref rocsparse_direction_row.\\n  @param[in]\\n  mb          number of block rows in the sparse BSR matrix.\\n  @param[in]\\n  nnzb        number of non-zero block entries of the sparse BSR matrix.\\n  @param[in]\\n  descr       descriptor of the sparse BSR matrix.\\n  @param[in]\\n  bsr_val     array of length \\\\p nnzb*block_dim*block_dim containing the values of the sparse BSR matrix.\\n  @param[in]\\n  bsr_row_ptr array of \\\\p mb+1 elements that point to the start of every block row of the\\n              sparse BSR matrix.\\n  @param[in]\\n  bsr_col_ind array of \\\\p nnzb elements containing the block column indices of the sparse BSR matrix.\\n  @param[in]\\n  block_dim   the block dimension of the BSR matrix. Between 1 and m where \\\\p m=mb*block_dim.\\n  @param[out]\\n  info        structure that holds the information collected during the analysis step.\\n  @param[out]\\n  buffer_size number of bytes of the temporary storage buffer required by\\n              rocsparse_sbsrilu0_analysis(), rocsparse_dbsrilu0_analysis(),\\n              rocsparse_cbsrilu0_analysis(), rocsparse_zbsrilu0_analysis(),\\n              rocsparse_sbsrilu0(), rocsparse_dbsrilu0(), rocsparse_cbsrilu0()\\n              and rocsparse_zbsrilu0().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p mb, \\\\p nnzb, or \\\\p block_dim is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p bsr_val, \\\\p bsr_row_ptr,\\n              \\\\p bsr_col_ind, \\\\p info or \\\\p buffer_size pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_sbsrilu0_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f32,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dbsrilu0_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f64,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cbsrilu0_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_float_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zbsrilu0_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_double_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup precond_module\\n  \\\\brief Incomplete LU factorization with 0 fill-ins and no pivoting using BSR storage\\n  format\\n\\n  \\\\details\\n  \\\\p rocsparse_bsrilu0_analysis performs the analysis step for rocsparse_sbsrilu0()\\n  rocsparse_dbsrilu0(), rocsparse_cbsrilu0(), and rocsparse_zbsrilu0(). It is expected\\n  that this function will be executed only once for a given matrix. The analysis meta\\n  data can be cleared by rocsparse_bsrilu0_clear().\\n\\n  \\\\p rocsparse_bsrilu0_analysis can share its meta data with\\n  rocsparse_sbsric0_analysis(), rocsparse_dbsric0_analysis(),\\n  rocsparse_cbsric0_analysis(), rocsparse_zbsric0_analysis(),\\n  rocsparse_sbsrsv_analysis(), rocsparse_dbsrsv_analysis(),\\n  rocsparse_cbsrsv_analysis(), rocsparse_zbsrsv_analysis(),\\n  rocsparse_sbsrsm_analysis(), rocsparse_dbsrsm_analysis(),\\n  rocsparse_cbsrsm_analysis() and rocsparse_zbsrsm_analysis(). Selecting\\n  \\\\ref rocsparse_analysis_policy_reuse policy can greatly improve computation\\n  performance of meta data. However, the user need to make sure that the sparsity\\n  pattern remains unchanged. If this cannot be assured,\\n  \\\\ref rocsparse_analysis_policy_force has to be used.\\n\\n  \\\\note\\n  If the matrix sparsity pattern changes, the gathered information will become invalid.\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  dir         direction that specified whether to count nonzero elements by\\n              \\\\ref rocsparse_direction_row or by \\\\ref rocsparse_direction_row.\\n  @param[in]\\n  mb          number of block rows in the sparse BSR matrix.\\n  @param[in]\\n  nnzb        number of non-zero block entries of the sparse BSR matrix.\\n  @param[in]\\n  descr       descriptor of the sparse BSR matrix.\\n  @param[in]\\n  bsr_val     array of length \\\\p nnzb*block_dim*block_dim containing the values of the sparse BSR matrix.\\n  @param[in]\\n  bsr_row_ptr array of \\\\p mb+1 elements that point to the start of every block row of the\\n              sparse BSR matrix.\\n  @param[in]\\n  bsr_col_ind array of \\\\p nnzb elements containing the block column indices of the sparse BSR matrix.\\n  @param[in]\\n  block_dim   the block dimension of the BSR matrix. Between 1 and m where \\\\p m=mb*block_dim.\\n  @param[out]\\n  info        structure that holds the information collected during\\n              the analysis step.\\n  @param[in]\\n  analysis    \\\\ref rocsparse_analysis_policy_reuse or\\n              \\\\ref rocsparse_analysis_policy_force.\\n  @param[in]\\n  solve       \\\\ref rocsparse_solve_policy_auto.\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p mb, \\\\p nnzb, or \\\\p block_dim is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p bsr_val, \\\\p bsr_row_ptr,\\n              \\\\p bsr_col_ind, \\\\p info or \\\\p temp_buffer pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_sbsrilu0_analysis(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f32,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dbsrilu0_analysis(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const f64,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cbsrilu0_analysis(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_float_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zbsrilu0_analysis(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *const rocsparse_double_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup precond_module\n  \\brief Incomplete LU factorization with 0 fill-ins and no pivoting using BSR storage\n  format\n\n  \\details\n  \\p rocsparse_bsrilu0_clear deallocates all memory that was allocated by\n  rocsparse_sbsrilu0_analysis(), rocsparse_dbsrilu0_analysis(), rocsparse_cbsrilu0_analysis()\n  or rocsparse_zbsrilu0_analysis(). This is especially useful, if memory is an issue and\n  the analysis data is not required for further computation.\n\n  \\note\n  Calling \\p rocsparse_bsrilu0_clear is optional. All allocated resources will be\n  cleared, when the opaque \\ref rocsparse_mat_info struct is destroyed using\n  rocsparse_destroy_mat_info().\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[inout]\n  info        structure that holds the information collected during the analysis step.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_pointer \\p info pointer is invalid.\n  \\retval     rocsparse_status_memory_error the buffer holding the meta data could not\n              be deallocated.\n  \\retval     rocsparse_status_internal_error an internal error occurred.*/\n    pub fn rocsparse_bsrilu0_clear(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup precond_module\\n  \\\\brief Incomplete LU factorization with 0 fill-ins and no pivoting using BSR storage\\n  format\\n\\n  \\\\details\\n  \\\\p rocsparse_bsrilu0 computes the incomplete LU factorization with 0 fill-ins and no\\n  pivoting of a sparse \\\\f$mb \\\\times mb\\\\f$ BSR matrix \\\\f$A\\\\f$, such that\\n  \\\\f[\\n    A \\\\approx LU\\n  \\\\f]\\n\\n  \\\\p rocsparse_bsrilu0 requires a user allocated temporary buffer. Its size is returned\\n  by rocsparse_sbsrilu0_buffer_size(), rocsparse_dbsrilu0_buffer_size(),\\n  rocsparse_cbsrilu0_buffer_size() or rocsparse_zbsrilu0_buffer_size(). Furthermore,\\n  analysis meta data is required. It can be obtained by rocsparse_sbsrilu0_analysis(),\\n  rocsparse_dbsrilu0_analysis(), rocsparse_cbsrilu0_analysis() or\\n  rocsparse_zbsrilu0_analysis(). \\\\p rocsparse_bsrilu0 reports the first zero pivot\\n  (either numerical or structural zero). The zero pivot status can be obtained by\\n  calling rocsparse_bsrilu0_zero_pivot().\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  dir         direction that specified whether to count nonzero elements by\\n              \\\\ref rocsparse_direction_row or by \\\\ref rocsparse_direction_row.\\n  @param[in]\\n  mb          number of block rows in the sparse BSR matrix.\\n  @param[in]\\n  nnzb        number of non-zero block entries of the sparse BSR matrix.\\n  @param[in]\\n  descr       descriptor of the sparse BSR matrix.\\n  @param[inout]\\n  bsr_val     array of length \\\\p nnzb*block_dim*block_dim containing the values of the sparse BSR matrix.\\n  @param[in]\\n  bsr_row_ptr array of \\\\p mb+1 elements that point to the start of every block row of the\\n              sparse BSR matrix.\\n  @param[in]\\n  bsr_col_ind array of \\\\p nnzb elements containing the block column indices of the sparse BSR matrix.\\n  @param[in]\\n  block_dim   the block dimension of the BSR matrix. Between 1 and m where \\\\p m=mb*block_dim.\\n  @param[in]\\n  info        structure that holds the information collected during the analysis step.\\n  @param[in]\\n  policy      \\\\ref rocsparse_solve_policy_auto.\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p mb, \\\\p nnzb, or \\\\p block_dim is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p bsr_val, \\\\p bsr_row_ptr\\n              or \\\\p bsr_col_ind pointer is invalid.\\n  \\\\retval     rocsparse_status_arch_mismatch the device is not supported.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n\\n  \\\\par Example\\n  Consider the sparse \\\\f$m \\\\times m\\\\f$ matrix \\\\f$A\\\\f$, stored in BSR\\n  storage format. The following example computes the incomplete LU factorization\\n  \\\\f$M \\\\approx LU\\\\f$ and solves the preconditioned system \\\\f$My = x\\\\f$.\\n  \\\\code{.c}\\n      // Create rocSPARSE handle\\n      rocsparse_handle handle;\\n      rocsparse_create_handle(&handle);\\n\\n      // Create matrix descriptor for M\\n      rocsparse_mat_descr descr_M;\\n      rocsparse_create_mat_descr(&descr_M);\\n\\n      // Create matrix descriptor for L\\n      rocsparse_mat_descr descr_L;\\n      rocsparse_create_mat_descr(&descr_L);\\n      rocsparse_set_mat_fill_mode(descr_L, rocsparse_fill_mode_lower);\\n      rocsparse_set_mat_diag_type(descr_L, rocsparse_diag_type_unit);\\n\\n      // Create matrix descriptor for U\\n      rocsparse_mat_descr descr_U;\\n      rocsparse_create_mat_descr(&descr_U);\\n      rocsparse_set_mat_fill_mode(descr_U, rocsparse_fill_mode_upper);\\n      rocsparse_set_mat_diag_type(descr_U, rocsparse_diag_type_non_unit);\\n\\n      // Create matrix info structure\\n      rocsparse_mat_info info;\\n      rocsparse_create_mat_info(&info);\\n\\n      // Obtain required buffer size\\n      size_t buffer_size_M;\\n      size_t buffer_size_L;\\n      size_t buffer_size_U;\\n      rocsparse_dbsrilu0_buffer_size(handle,\\n                                     rocsparse_direction_row,\\n                                     mb,\\n                                     nnzb,\\n                                     descr_M,\\n                                     bsr_val,\\n                                     bsr_row_ptr,\\n                                     bsr_col_ind,\\n                                     block_dim,\\n                                     info,\\n                                     &buffer_size_M);\\n      rocsparse_dbsrsv_buffer_size(handle,\\n                                   rocsparse_direction_row,\\n                                   rocsparse_operation_none,\\n                                   mb,\\n                                   nnzb,\\n                                   descr_L,\\n                                   bsr_val,\\n                                   bsr_row_ptr,\\n                                   bsr_col_ind,\\n                                   block_dim,\\n                                   info,\\n                                   &buffer_size_L);\\n      rocsparse_dbsrsv_buffer_size(handle,\\n                                   rocsparse_direction_row,\\n                                   rocsparse_operation_none,\\n                                   mb,\\n                                   nnzb,\\n                                   descr_U,\\n                                   bsr_val,\\n                                   bsr_row_ptr,\\n                                   bsr_col_ind,\\n                                   block_dim,\\n                                   info,\\n                                   &buffer_size_U);\\n\\n      size_t buffer_size = max(buffer_size_M, max(buffer_size_L, buffer_size_U));\\n\\n      // Allocate temporary buffer\\n      void* temp_buffer;\\n      hipMalloc(&temp_buffer, buffer_size);\\n\\n      // Perform analysis steps, using rocsparse_analysis_policy_reuse to improve\\n      // computation performance\\n      rocsparse_dbsrilu0_analysis(handle,\\n                                  rocsparse_direction_row,\\n                                  mb,\\n                                  nnzb,\\n                                  descr_M,\\n                                  bsr_val,\\n                                  bsr_row_ptr,\\n                                  bsr_col_ind,\\n                                  block_dim,\\n                                  info,\\n                                  rocsparse_analysis_policy_reuse,\\n                                  rocsparse_solve_policy_auto,\\n                                  temp_buffer);\\n      rocsparse_dbsrsv_analysis(handle,\\n                                rocsparse_direction_row,\\n                                rocsparse_operation_none,\\n                                mb,\\n                                nnzb,\\n                                descr_L,\\n                                bsr_val,\\n                                bsr_row_ptr,\\n                                bsr_col_ind,\\n                                block_dim,\\n                                info,\\n                                rocsparse_analysis_policy_reuse,\\n                                rocsparse_solve_policy_auto,\\n                                temp_buffer);\\n      rocsparse_dbsrsv_analysis(handle,\\n                                rocsparse_direction_row,\\n                                rocsparse_operation_none,\\n                                mb,\\n                                nnzb,\\n                                descr_U,\\n                                bsr_val,\\n                                bsr_row_ptr,\\n                                bsr_col_ind,\\n                                block_dim,\\n                                info,\\n                                rocsparse_analysis_policy_reuse,\\n                                rocsparse_solve_policy_auto,\\n                                temp_buffer);\\n\\n      // Check for zero pivot\\n      rocsparse_int position;\\n      if(rocsparse_status_zero_pivot == rocsparse_bsrilu0_zero_pivot(handle,\\n                                                                    info,\\n                                                                    &position))\\n      {\\n          printf(\\\"A has structural zero at A(%d,%d)\\\\n\\\", position, position);\\n      }\\n\\n      // Compute incomplete LU factorization M = LU\\n      rocsparse_dbsrilu0(handle,\\n                         rocsparse_direction_row,\\n                         mb,\\n                         nnzb,\\n                         descr_M,\\n                         bsr_val,\\n                         bsr_row_ptr,\\n                         bsr_col_ind,\\n                         block_dim,\\n                         info,\\n                         rocsparse_solve_policy_auto,\\n                         temp_buffer);\\n\\n      // Check for zero pivot\\n      if(rocsparse_status_zero_pivot == rocsparse_bsrilu0_zero_pivot(handle,\\n                                                                     info,\\n                                                                     &position))\\n      {\\n          printf(\\\"L has structural and/or numerical zero at L(%d,%d)\\\\n\\\",\\n                 position,\\n                 position);\\n      }\\n\\n      // Solve Lz = x\\n      rocsparse_dbsrsv_solve(handle,\\n                             rocsparse_direction_row,\\n                             rocsparse_operation_none,\\n                             mb,\\n                             nnzb,\\n                             &alpha,\\n                             descr_L,\\n                             bsr_val,\\n                             bsr_row_ptr,\\n                             bsr_col_ind,\\n                             block_dim,\\n                             info,\\n                             x,\\n                             z,\\n                             rocsparse_solve_policy_auto,\\n                             temp_buffer);\\n\\n      // Solve Uy = z\\n      rocsparse_dbsrsv_solve(handle,\\n                             rocsparse_direction_row,\\n                             rocsparse_operation_none,\\n                             mb,\\n                             nnzb,\\n                             &alpha,\\n                             descr_U,\\n                             bsr_val,\\n                             bsr_row_ptr,\\n                             bsr_col_ind,\\n                             block_dim,\\n                             info,\\n                             z,\\n                             y,\\n                             rocsparse_solve_policy_auto,\\n                             temp_buffer);\\n\\n      // Clean up\\n      hipFree(temp_buffer);\\n      rocsparse_destroy_mat_info(info);\\n      rocsparse_destroy_mat_descr(descr_M);\\n      rocsparse_destroy_mat_descr(descr_L);\\n      rocsparse_destroy_mat_descr(descr_U);\\n      rocsparse_destroy_handle(handle);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_sbsrilu0(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *mut f32,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dbsrilu0(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *mut f64,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cbsrilu0(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *mut rocsparse_float_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zbsrilu0(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nnzb: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        bsr_val: *mut rocsparse_double_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        block_dim: rocsparse_int,\n        info: rocsparse_mat_info,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup precond_module\n  \\brief Incomplete Cholesky factorization with 0 fill-ins and no pivoting using CSR\n  storage format\n\n  \\details\n  \\p rocsparse_csric_zero_pivot returns \\ref rocsparse_status_zero_pivot, if either a\n  structural or numerical zero has been found during rocsparse_scsric0() or\n  rocsparse_dcsric0() computation. The first zero pivot \\f$j\\f$ at \\f$A_{j,j}\\f$\n  is stored in \\p position, using same index base as the CSR matrix.\n\n  \\p position can be in host or device memory. If no zero pivot has been found,\n  \\p position is set to -1 and \\ref rocsparse_status_success is returned instead.\n\n  \\note \\p rocsparse_csric0_zero_pivot is a blocking function. It might influence\n  performance negatively.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[in]\n  info        structure that holds the information collected during the analysis step.\n  @param[inout]\n  position    pointer to zero pivot \\f$j\\f$, can be in host or device memory.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_pointer \\p info or \\p position pointer is\n              invalid.\n  \\retval     rocsparse_status_internal_error an internal error occurred.\n  \\retval     rocsparse_status_zero_pivot zero pivot has been found.*/\n    pub fn rocsparse_csric0_zero_pivot(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n        position: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup precond_module\\n  \\\\brief Incomplete Cholesky factorization with 0 fill-ins and no pivoting using CSR\\n  storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_csric0_buffer_size returns the size of the temporary storage buffer\\n  that is required by rocsparse_scsric0_analysis(), rocsparse_dcsric0_analysis(),\\n  rocsparse_scsric0() and rocsparse_dcsric0(). The temporary storage buffer must\\n  be allocated by the user. The size of the temporary storage buffer is identical to\\n  the size returned by rocsparse_scsrsv_buffer_size(), rocsparse_dcsrsv_buffer_size(),\\n  rocsparse_scsrilu0_buffer_size() and rocsparse_dcsrilu0_buffer_size() if the matrix\\n  sparsity pattern is identical. The user allocated buffer can thus be shared between\\n  subsequent calls to those functions.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  m           number of rows of the sparse CSR matrix.\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse CSR matrix.\\n  @param[in]\\n  descr       descriptor of the sparse CSR matrix.\\n  @param[in]\\n  csr_val     array of \\\\p nnz elements of the sparse CSR matrix.\\n  @param[in]\\n  csr_row_ptr array of \\\\p m+1 elements that point to the start of every row of the\\n              sparse CSR matrix.\\n  @param[in]\\n  csr_col_ind array of \\\\p nnz elements containing the column indices of the sparse\\n              CSR matrix.\\n  @param[out]\\n  info        structure that holds the information collected during the analysis step.\\n  @param[out]\\n  buffer_size number of bytes of the temporary storage buffer required by\\n              rocsparse_scsric0_analysis(), rocsparse_dcsric0_analysis(),\\n              rocsparse_scsric0() and rocsparse_dcsric0().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p nnz is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p csr_val, \\\\p csr_row_ptr,\\n              \\\\p csr_col_ind, \\\\p info or \\\\p buffer_size pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p trans != \\\\ref rocsparse_operation_none or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_scsric0_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsric0_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsric0_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsric0_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup precond_module\\n  \\\\brief Incomplete Cholesky factorization with 0 fill-ins and no pivoting using CSR\\n  storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_csric0_analysis performs the analysis step for rocsparse_scsric0()\\n  and rocsparse_dcsric0(). It is expected that this function will be executed only\\n  once for a given matrix and particular operation type. The analysis meta data can be\\n  cleared by rocsparse_csric0_clear().\\n\\n  \\\\p rocsparse_csric0_analysis can share its meta data with\\n  rocsparse_scsrilu0_analysis(), rocsparse_dcsrilu0_analysis(),\\n  rocsparse_ccsrilu0_analysis(), rocsparse_zcsrilu0_analysis(),\\n  rocsparse_scsrsv_analysis(), rocsparse_dcsrsv_analysis(),\\n  rocsparse_ccsrsv_analysis(), rocsparse_zcsrsv_analysis(),\\n  rocsparse_scsrsm_analysis(), rocsparse_dcsrsm_analysis(),\\n  rocsparse_scsrsm_analysis() and rocsparse_dcsrsm_analysis(). Selecting\\n  \\\\ref rocsparse_analysis_policy_reuse policy can greatly improve computation\\n  performance of meta data. However, the user need to make sure that the sparsity\\n  pattern remains unchanged. If this cannot be assured,\\n  \\\\ref rocsparse_analysis_policy_force has to be used.\\n\\n  \\\\note\\n  If the matrix sparsity pattern changes, the gathered information will become invalid.\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  m           number of rows of the sparse CSR matrix.\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse CSR matrix.\\n  @param[in]\\n  descr       descriptor of the sparse CSR matrix.\\n  @param[in]\\n  csr_val     array of \\\\p nnz elements of the sparse CSR matrix.\\n  @param[in]\\n  csr_row_ptr array of \\\\p m+1 elements that point to the start of every row of the\\n              sparse CSR matrix.\\n  @param[in]\\n  csr_col_ind array of \\\\p nnz elements containing the column indices of the sparse\\n              CSR matrix.\\n  @param[out]\\n  info        structure that holds the information collected during\\n              the analysis step.\\n  @param[in]\\n  analysis    \\\\ref rocsparse_analysis_policy_reuse or\\n              \\\\ref rocsparse_analysis_policy_force.\\n  @param[in]\\n  solve       \\\\ref rocsparse_solve_policy_auto.\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p nnz is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p csr_val, \\\\p csr_row_ptr,\\n              \\\\p csr_col_ind, \\\\p info or \\\\p temp_buffer pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p trans != \\\\ref rocsparse_operation_none or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_scsric0_analysis(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsric0_analysis(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsric0_analysis(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsric0_analysis(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup precond_module\n  \\brief Incomplete Cholesky factorization with 0 fill-ins and no pivoting using CSR\n  storage format\n\n  \\details\n  \\p rocsparse_csric0_clear deallocates all memory that was allocated by\n  rocsparse_scsric0_analysis() or rocsparse_dcsric0_analysis(). This is especially\n  useful, if memory is an issue and the analysis data is not required for further\n  computation.\n\n  \\note\n  Calling \\p rocsparse_csric0_clear is optional. All allocated resources will be\n  cleared, when the opaque \\ref rocsparse_mat_info struct is destroyed using\n  rocsparse_destroy_mat_info().\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[inout]\n  info        structure that holds the information collected during the analysis step.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_pointer \\p info pointer is invalid.\n  \\retval     rocsparse_status_memory_error the buffer holding the meta data could not\n              be deallocated.\n  \\retval     rocsparse_status_internal_error an internal error occurred.*/\n    pub fn rocsparse_csric0_clear(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup precond_module\\n  \\\\brief Incomplete Cholesky factorization with 0 fill-ins and no pivoting using CSR\\n  storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_csric0 computes the incomplete Cholesky factorization with 0 fill-ins\\n  and no pivoting of a sparse \\\\f$m \\\\times m\\\\f$ CSR matrix \\\\f$A\\\\f$, such that\\n  \\\\f[\\n    A \\\\approx LL^T\\n  \\\\f]\\n\\n  \\\\p rocsparse_csric0 requires a user allocated temporary buffer. Its size is returned\\n  by rocsparse_scsric0_buffer_size() or rocsparse_dcsric0_buffer_size(). Furthermore,\\n  analysis meta data is required. It can be obtained by rocsparse_scsric0_analysis()\\n  or rocsparse_dcsric0_analysis(). \\\\p rocsparse_csric0 reports the first zero pivot\\n  (either numerical or structural zero). The zero pivot status can be obtained by\\n  calling rocsparse_csric0_zero_pivot().\\n\\n  \\\\note\\n  The sparse CSR matrix has to be sorted. This can be achieved by calling\\n  rocsparse_csrsort().\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  m           number of rows of the sparse CSR matrix.\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse CSR matrix.\\n  @param[in]\\n  descr       descriptor of the sparse CSR matrix.\\n  @param[inout]\\n  csr_val     array of \\\\p nnz elements of the sparse CSR matrix.\\n  @param[in]\\n  csr_row_ptr array of \\\\p m+1 elements that point to the start\\n              of every row of the sparse CSR matrix.\\n  @param[in]\\n  csr_col_ind array of \\\\p nnz elements containing the column indices of the sparse\\n              CSR matrix.\\n  @param[in]\\n  info        structure that holds the information collected during the analysis step.\\n  @param[in]\\n  policy      \\\\ref rocsparse_solve_policy_auto.\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p nnz is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p csr_val, \\\\p csr_row_ptr\\n              or \\\\p csr_col_ind pointer is invalid.\\n  \\\\retval     rocsparse_status_arch_mismatch the device is not supported.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p trans != \\\\ref rocsparse_operation_none or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n\\n  \\\\par Example\\n  Consider the sparse \\\\f$m \\\\times m\\\\f$ matrix \\\\f$A\\\\f$, stored in CSR\\n  storage format. The following example computes the incomplete Cholesky factorization\\n  \\\\f$M \\\\approx LL^T\\\\f$ and solves the preconditioned system \\\\f$My = x\\\\f$.\\n  \\\\code{.c}\\n      // Create rocSPARSE handle\\n      rocsparse_handle handle;\\n      rocsparse_create_handle(&handle);\\n\\n      // Create matrix descriptor for M\\n      rocsparse_mat_descr descr_M;\\n      rocsparse_create_mat_descr(&descr_M);\\n\\n      // Create matrix descriptor for L\\n      rocsparse_mat_descr descr_L;\\n      rocsparse_create_mat_descr(&descr_L);\\n      rocsparse_set_mat_fill_mode(descr_L, rocsparse_fill_mode_lower);\\n      rocsparse_set_mat_diag_type(descr_L, rocsparse_diag_type_unit);\\n\\n      // Create matrix descriptor for L'\\n      rocsparse_mat_descr descr_Lt;\\n      rocsparse_create_mat_descr(&descr_Lt);\\n      rocsparse_set_mat_fill_mode(descr_Lt, rocsparse_fill_mode_upper);\\n      rocsparse_set_mat_diag_type(descr_Lt, rocsparse_diag_type_non_unit);\\n\\n      // Create matrix info structure\\n      rocsparse_mat_info info;\\n      rocsparse_create_mat_info(&info);\\n\\n      // Obtain required buffer size\\n      size_t buffer_size_M;\\n      size_t buffer_size_L;\\n      size_t buffer_size_Lt;\\n      rocsparse_dcsric0_buffer_size(handle,\\n                                    m,\\n                                    nnz,\\n                                    descr_M,\\n                                    csr_val,\\n                                    csr_row_ptr,\\n                                    csr_col_ind,\\n                                    info,\\n                                    &buffer_size_M);\\n      rocsparse_dcsrsv_buffer_size(handle,\\n                                   rocsparse_operation_none,\\n                                   m,\\n                                   nnz,\\n                                   descr_L,\\n                                   csr_val,\\n                                   csr_row_ptr,\\n                                   csr_col_ind,\\n                                   info,\\n                                   &buffer_size_L);\\n      rocsparse_dcsrsv_buffer_size(handle,\\n                                   rocsparse_operation_transpose,\\n                                   m,\\n                                   nnz,\\n                                   descr_Lt,\\n                                   csr_val,\\n                                   csr_row_ptr,\\n                                   csr_col_ind,\\n                                   info,\\n                                   &buffer_size_Lt);\\n\\n      size_t buffer_size = max(buffer_size_M, max(buffer_size_L, buffer_size_Lt));\\n\\n      // Allocate temporary buffer\\n      void* temp_buffer;\\n      hipMalloc(&temp_buffer, buffer_size);\\n\\n      // Perform analysis steps, using rocsparse_analysis_policy_reuse to improve\\n      // computation performance\\n      rocsparse_dcsric0_analysis(handle,\\n                                 m,\\n                                 nnz,\\n                                 descr_M,\\n                                 csr_val,\\n                                 csr_row_ptr,\\n                                 csr_col_ind,\\n                                 info,\\n                                 rocsparse_analysis_policy_reuse,\\n                                 rocsparse_solve_policy_auto,\\n                                 temp_buffer);\\n      rocsparse_dcsrsv_analysis(handle,\\n                                rocsparse_operation_none,\\n                                m,\\n                                nnz,\\n                                descr_L,\\n                                csr_val,\\n                                csr_row_ptr,\\n                                csr_col_ind,\\n                                info,\\n                                rocsparse_analysis_policy_reuse,\\n                                rocsparse_solve_policy_auto,\\n                                temp_buffer);\\n      rocsparse_dcsrsv_analysis(handle,\\n                                rocsparse_operation_transpose,\\n                                m,\\n                                nnz,\\n                                descr_Lt,\\n                                csr_val,\\n                                csr_row_ptr,\\n                                csr_col_ind,\\n                                info,\\n                                rocsparse_analysis_policy_reuse,\\n                                rocsparse_solve_policy_auto,\\n                                temp_buffer);\\n\\n      // Check for zero pivot\\n      rocsparse_int position;\\n      if(rocsparse_status_zero_pivot == rocsparse_csric0_zero_pivot(handle,\\n                                                                    info,\\n                                                                    &position))\\n      {\\n          printf(\\\"A has structural zero at A(%d,%d)\\\\n\\\", position, position);\\n      }\\n\\n      // Compute incomplete Cholesky factorization M = LL'\\n      rocsparse_dcsric0(handle,\\n                        m,\\n                        nnz,\\n                        descr_M,\\n                        csr_val,\\n                        csr_row_ptr,\\n                        csr_col_ind,\\n                        info,\\n                        rocsparse_solve_policy_auto,\\n                        temp_buffer);\\n\\n      // Check for zero pivot\\n      if(rocsparse_status_zero_pivot == rocsparse_csric0_zero_pivot(handle,\\n                                                                    info,\\n                                                                    &position))\\n      {\\n          printf(\\\"L has structural and/or numerical zero at L(%d,%d)\\\\n\\\",\\n                 position,\\n                 position);\\n      }\\n\\n      // Solve Lz = x\\n      rocsparse_dcsrsv_solve(handle,\\n                             rocsparse_operation_none,\\n                             m,\\n                             nnz,\\n                             &alpha,\\n                             descr_L,\\n                             csr_val,\\n                             csr_row_ptr,\\n                             csr_col_ind,\\n                             info,\\n                             x,\\n                             z,\\n                             rocsparse_solve_policy_auto,\\n                             temp_buffer);\\n\\n      // Solve L'y = z\\n      rocsparse_dcsrsv_solve(handle,\\n                             rocsparse_operation_transpose,\\n                             m,\\n                             nnz,\\n                             &alpha,\\n                             descr_Lt,\\n                             csr_val,\\n                             csr_row_ptr,\\n                             csr_col_ind,\\n                             info,\\n                             z,\\n                             y,\\n                             rocsparse_solve_policy_auto,\\n                             temp_buffer);\\n\\n      // Clean up\\n      hipFree(temp_buffer);\\n      rocsparse_destroy_mat_info(info);\\n      rocsparse_destroy_mat_descr(descr_M);\\n      rocsparse_destroy_mat_descr(descr_L);\\n      rocsparse_destroy_mat_descr(descr_Lt);\\n      rocsparse_destroy_handle(handle);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_scsric0(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *mut f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsric0(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *mut f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsric0(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *mut rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsric0(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *mut rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup precond_module\n  \\brief Incomplete LU factorization with 0 fill-ins and no pivoting using CSR\n  storage format\n\n  \\details\n  \\p rocsparse_csrilu0_zero_pivot returns \\ref rocsparse_status_zero_pivot, if either a\n  structural or numerical zero has been found during rocsparse_scsrilu0(),\n  rocsparse_dcsrilu0(), rocsparse_ccsrilu0() or rocsparse_zcsrilu0() computation. The\n  first zero pivot \\f$j\\f$ at \\f$A_{j,j}\\f$ is stored in \\p position, using same index\n  base as the CSR matrix.\n\n  \\p position can be in host or device memory. If no zero pivot has been found,\n  \\p position is set to -1 and \\ref rocsparse_status_success is returned instead.\n\n  \\note \\p rocsparse_csrilu0_zero_pivot is a blocking function. It might influence\n  performance negatively.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[in]\n  info        structure that holds the information collected during the analysis step.\n  @param[inout]\n  position    pointer to zero pivot \\f$j\\f$, can be in host or device memory.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_pointer \\p info or \\p position pointer is\n              invalid.\n  \\retval     rocsparse_status_internal_error an internal error occurred.\n  \\retval     rocsparse_status_zero_pivot zero pivot has been found.*/\n    pub fn rocsparse_csrilu0_zero_pivot(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n        position: *mut rocsparse_int,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup precond_module\\n  \\\\brief Incomplete LU factorization with 0 fill-ins and no pivoting using CSR storage\\n  format\\n\\n  \\\\details\\n  \\\\p rocsparse_csrilu0_numeric_boost enables the user to replace a numerical value in\\n  an incomplete LU factorization. \\\\p tol is used to determine whether a numerical value\\n  is replaced by \\\\p boost_val, such that \\\\f$A_{j,j} = \\\\text{boost_val}\\\\f$ if\\n  \\\\f$\\\\text{tol} \\\\ge \\\\left|A_{j,j}\\\\right|\\\\f$.\\n\\n  \\\\note The boost value is enabled by setting \\\\p enable_boost to 1 or disabled by\\n  setting \\\\p enable_boost to 0.\\n\\n  \\\\note \\\\p tol and \\\\p boost_val can be in host or device memory.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle          handle to the rocsparse library context queue.\\n  @param[in]\\n  info            structure that holds the information collected during the analysis step.\\n  @param[in]\\n  enable_boost    enable/disable numeric boost.\\n  @param[in]\\n  boost_tol       tolerance to determine whether a numerical value is replaced or not.\\n  @param[in]\\n  boost_val       boost value to replace a numerical value.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p info, \\\\p tol or \\\\p boost_val pointer\\n              is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n/\\n/**@{\"]\n    pub fn rocsparse_scsrilu0_numeric_boost(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n        enable_boost: ::core::ffi::c_int,\n        boost_tol: *const f32,\n        boost_val: *const f32,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsrilu0_numeric_boost(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n        enable_boost: ::core::ffi::c_int,\n        boost_tol: *const f64,\n        boost_val: *const f64,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsrilu0_numeric_boost(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n        enable_boost: ::core::ffi::c_int,\n        boost_tol: *const f32,\n        boost_val: *const rocsparse_float_complex,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsrilu0_numeric_boost(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n        enable_boost: ::core::ffi::c_int,\n        boost_tol: *const f64,\n        boost_val: *const rocsparse_double_complex,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dscsrilu0_numeric_boost(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n        enable_boost: ::core::ffi::c_int,\n        boost_tol: *const f64,\n        boost_val: *const f32,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dccsrilu0_numeric_boost(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n        enable_boost: ::core::ffi::c_int,\n        boost_tol: *const f64,\n        boost_val: *const rocsparse_float_complex,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup precond_module\\n  \\\\brief Incomplete LU factorization with 0 fill-ins and no pivoting using CSR\\n  storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_csrilu0_buffer_size returns the size of the temporary storage buffer\\n  that is required by rocsparse_scsrilu0_analysis(), rocsparse_dcsrilu0_analysis(),\\n  rocsparse_ccsrilu0_analysis(), rocsparse_zcsrilu0_analysis(), rocsparse_scsrilu0(),\\n  rocsparse_dcsrilu0(), rocsparse_ccsrilu0() and rocsparse_zcsrilu0(). The temporary\\n  storage buffer must be allocated by the user. The size of the temporary storage\\n  buffer is identical to the size returned by rocsparse_scsrsv_buffer_size(),\\n  rocsparse_dcsrsv_buffer_size(), rocsparse_ccsrsv_buffer_size() and\\n  rocsparse_zcsrsv_buffer_size() if the matrix sparsity pattern is identical. The user\\n  allocated buffer can thus be shared between subsequent calls to those functions.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  m           number of rows of the sparse CSR matrix.\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse CSR matrix.\\n  @param[in]\\n  descr       descriptor of the sparse CSR matrix.\\n  @param[in]\\n  csr_val     array of \\\\p nnz elements of the sparse CSR matrix.\\n  @param[in]\\n  csr_row_ptr array of \\\\p m+1 elements that point to the start of every row of the\\n              sparse CSR matrix.\\n  @param[in]\\n  csr_col_ind array of \\\\p nnz elements containing the column indices of the sparse\\n              CSR matrix.\\n  @param[out]\\n  info        structure that holds the information collected during the analysis step.\\n  @param[out]\\n  buffer_size number of bytes of the temporary storage buffer required by\\n              rocsparse_scsrilu0_analysis(), rocsparse_dcsrilu0_analysis(),\\n              rocsparse_ccsrilu0_analysis(), rocsparse_zcsrilu0_analysis(),\\n              rocsparse_scsrilu0(), rocsparse_dcsrilu0(), rocsparse_ccsrilu0() and\\n              rocsparse_zcsrilu0().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p nnz is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p csr_val, \\\\p csr_row_ptr,\\n              \\\\p csr_col_ind, \\\\p info or \\\\p buffer_size pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p trans != \\\\ref rocsparse_operation_none or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_scsrilu0_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsrilu0_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsrilu0_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsrilu0_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup precond_module\\n  \\\\brief Incomplete LU factorization with 0 fill-ins and no pivoting using CSR\\n  storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_csrilu0_analysis performs the analysis step for rocsparse_scsrilu0(),\\n  rocsparse_dcsrilu0(), rocsparse_ccsrilu0() and rocsparse_zcsrilu0(). It is expected\\n  that this function will be executed only once for a given matrix and particular\\n  operation type. The analysis meta data can be cleared by rocsparse_csrilu0_clear().\\n\\n  \\\\p rocsparse_csrilu0_analysis can share its meta data with\\n  rocsparse_scsric0_analysis(), rocsparse_dcsric0_analysis(),\\n  rocsparse_ccsric0_analysis(), rocsparse_zcsric0_analysis(),\\n  rocsparse_scsrsv_analysis(), rocsparse_dcsrsv_analysis(),\\n  rocsparse_ccsrsv_analysis(), rocsparse_zcsrsv_analysis(),\\n  rocsparse_scsrsm_analysis(), rocsparse_dcsrsm_analysis(),\\n  rocsparse_scsrsm_analysis() and rocsparse_dcsrsm_analysis(). Selecting\\n  \\\\ref rocsparse_analysis_policy_reuse policy can greatly improve computation\\n  performance of meta data. However, the user need to make sure that the sparsity\\n  pattern remains unchanged. If this cannot be assured,\\n  \\\\ref rocsparse_analysis_policy_force has to be used.\\n\\n  \\\\note\\n  If the matrix sparsity pattern changes, the gathered information will become invalid.\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  m           number of rows of the sparse CSR matrix.\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse CSR matrix.\\n  @param[in]\\n  descr       descriptor of the sparse CSR matrix.\\n  @param[in]\\n  csr_val     array of \\\\p nnz elements of the sparse CSR matrix.\\n  @param[in]\\n  csr_row_ptr array of \\\\p m+1 elements that point to the start of every row of the\\n              sparse CSR matrix.\\n  @param[in]\\n  csr_col_ind array of \\\\p nnz elements containing the column indices of the sparse\\n              CSR matrix.\\n  @param[out]\\n  info        structure that holds the information collected during\\n              the analysis step.\\n  @param[in]\\n  analysis    \\\\ref rocsparse_analysis_policy_reuse or\\n              \\\\ref rocsparse_analysis_policy_force.\\n  @param[in]\\n  solve       \\\\ref rocsparse_solve_policy_auto.\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p nnz is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p csr_val, \\\\p csr_row_ptr,\\n              \\\\p csr_col_ind, \\\\p info or \\\\p temp_buffer pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p trans != \\\\ref rocsparse_operation_none or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n/\\n/**@{\"]\n    pub fn rocsparse_scsrilu0_analysis(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsrilu0_analysis(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsrilu0_analysis(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsrilu0_analysis(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        analysis: rocsparse_analysis_policy,\n        solve: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup precond_module\n  \\brief Incomplete LU factorization with 0 fill-ins and no pivoting using CSR\n  storage format\n\n  \\details\n  \\p rocsparse_csrilu0_clear deallocates all memory that was allocated by\n  rocsparse_scsrilu0_analysis(), rocsparse_dcsrilu0_analysis(),\n  rocsparse_ccsrilu0_analysis() or rocsparse_zcsrilu0_analysis(). This is especially\n  useful, if memory is an issue and the analysis data is not required for further\n  computation.\n\n  \\note\n  Calling \\p rocsparse_csrilu0_clear is optional. All allocated resources will be\n  cleared, when the opaque \\ref rocsparse_mat_info struct is destroyed using\n  rocsparse_destroy_mat_info().\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[inout]\n  info        structure that holds the information collected during the analysis step.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_pointer \\p info pointer is invalid.\n  \\retval     rocsparse_status_memory_error the buffer holding the meta data could not\n              be deallocated.\n  \\retval     rocsparse_status_internal_error an internal error occurred.*/\n    pub fn rocsparse_csrilu0_clear(\n        handle: rocsparse_handle,\n        info: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup precond_module\\n  \\\\brief Incomplete LU factorization with 0 fill-ins and no pivoting using CSR\\n  storage format\\n\\n  \\\\details\\n  \\\\p rocsparse_csrilu0 computes the incomplete LU factorization with 0 fill-ins and no\\n  pivoting of a sparse \\\\f$m \\\\times m\\\\f$ CSR matrix \\\\f$A\\\\f$, such that\\n  \\\\f[\\n    A \\\\approx LU\\n  \\\\f]\\n\\n  \\\\p rocsparse_csrilu0 requires a user allocated temporary buffer. Its size is returned\\n  by rocsparse_scsrilu0_buffer_size(), rocsparse_dcsrilu0_buffer_size(),\\n  rocsparse_ccsrilu0_buffer_size() or rocsparse_zcsrilu0_buffer_size(). Furthermore,\\n  analysis meta data is required. It can be obtained by rocsparse_scsrilu0_analysis(),\\n  rocsparse_dcsrilu0_analysis(), rocsparse_ccsrilu0_analysis() or\\n  rocsparse_zcsrilu0_analysis(). \\\\p rocsparse_csrilu0 reports the first zero pivot\\n  (either numerical or structural zero). The zero pivot status can be obtained by\\n  calling rocsparse_csrilu0_zero_pivot().\\n\\n  \\\\note\\n  The sparse CSR matrix has to be sorted. This can be achieved by calling\\n  rocsparse_csrsort().\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  m           number of rows of the sparse CSR matrix.\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse CSR matrix.\\n  @param[in]\\n  descr       descriptor of the sparse CSR matrix.\\n  @param[inout]\\n  csr_val     array of \\\\p nnz elements of the sparse CSR matrix.\\n  @param[in]\\n  csr_row_ptr array of \\\\p m+1 elements that point to the start\\n              of every row of the sparse CSR matrix.\\n  @param[in]\\n  csr_col_ind array of \\\\p nnz elements containing the column indices of the sparse\\n              CSR matrix.\\n  @param[in]\\n  info        structure that holds the information collected during the analysis step.\\n  @param[in]\\n  policy      \\\\ref rocsparse_solve_policy_auto.\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p nnz is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p descr, \\\\p csr_val, \\\\p csr_row_ptr\\n              or \\\\p csr_col_ind pointer is invalid.\\n  \\\\retval     rocsparse_status_arch_mismatch the device is not supported.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n  \\\\retval     rocsparse_status_not_implemented\\n              \\\\p trans != \\\\ref rocsparse_operation_none or\\n              \\\\ref rocsparse_matrix_type != \\\\ref rocsparse_matrix_type_general.\\n\\n  \\\\par Example\\n  Consider the sparse \\\\f$m \\\\times m\\\\f$ matrix \\\\f$A\\\\f$, stored in CSR\\n  storage format. The following example computes the incomplete LU factorization\\n  \\\\f$M \\\\approx LU\\\\f$ and solves the preconditioned system \\\\f$My = x\\\\f$.\\n  \\\\code{.c}\\n      // Create rocSPARSE handle\\n      rocsparse_handle handle;\\n      rocsparse_create_handle(&handle);\\n\\n      // Create matrix descriptor for M\\n      rocsparse_mat_descr descr_M;\\n      rocsparse_create_mat_descr(&descr_M);\\n\\n      // Create matrix descriptor for L\\n      rocsparse_mat_descr descr_L;\\n      rocsparse_create_mat_descr(&descr_L);\\n      rocsparse_set_mat_fill_mode(descr_L, rocsparse_fill_mode_lower);\\n      rocsparse_set_mat_diag_type(descr_L, rocsparse_diag_type_unit);\\n\\n      // Create matrix descriptor for U\\n      rocsparse_mat_descr descr_U;\\n      rocsparse_create_mat_descr(&descr_U);\\n      rocsparse_set_mat_fill_mode(descr_U, rocsparse_fill_mode_upper);\\n      rocsparse_set_mat_diag_type(descr_U, rocsparse_diag_type_non_unit);\\n\\n      // Create matrix info structure\\n      rocsparse_mat_info info;\\n      rocsparse_create_mat_info(&info);\\n\\n      // Obtain required buffer size\\n      size_t buffer_size_M;\\n      size_t buffer_size_L;\\n      size_t buffer_size_U;\\n      rocsparse_dcsrilu0_buffer_size(handle,\\n                                    m,\\n                                    nnz,\\n                                    descr_M,\\n                                    csr_val,\\n                                    csr_row_ptr,\\n                                    csr_col_ind,\\n                                    info,\\n                                    &buffer_size_M);\\n      rocsparse_dcsrsv_buffer_size(handle,\\n                                   rocsparse_operation_none,\\n                                   m,\\n                                   nnz,\\n                                   descr_L,\\n                                   csr_val,\\n                                   csr_row_ptr,\\n                                   csr_col_ind,\\n                                   info,\\n                                   &buffer_size_L);\\n      rocsparse_dcsrsv_buffer_size(handle,\\n                                   rocsparse_operation_none,\\n                                   m,\\n                                   nnz,\\n                                   descr_U,\\n                                   csr_val,\\n                                   csr_row_ptr,\\n                                   csr_col_ind,\\n                                   info,\\n                                   &buffer_size_U);\\n\\n      size_t buffer_size = max(buffer_size_M, max(buffer_size_L, buffer_size_U));\\n\\n      // Allocate temporary buffer\\n      void* temp_buffer;\\n      hipMalloc(&temp_buffer, buffer_size);\\n\\n      // Perform analysis steps, using rocsparse_analysis_policy_reuse to improve\\n      // computation performance\\n      rocsparse_dcsrilu0_analysis(handle,\\n                                  m,\\n                                  nnz,\\n                                  descr_M,\\n                                  csr_val,\\n                                  csr_row_ptr,\\n                                  csr_col_ind,\\n                                  info,\\n                                  rocsparse_analysis_policy_reuse,\\n                                  rocsparse_solve_policy_auto,\\n                                  temp_buffer);\\n      rocsparse_dcsrsv_analysis(handle,\\n                                rocsparse_operation_none,\\n                                m,\\n                                nnz,\\n                                descr_L,\\n                                csr_val,\\n                                csr_row_ptr,\\n                                csr_col_ind,\\n                                info,\\n                                rocsparse_analysis_policy_reuse,\\n                                rocsparse_solve_policy_auto,\\n                                temp_buffer);\\n      rocsparse_dcsrsv_analysis(handle,\\n                                rocsparse_operation_none,\\n                                m,\\n                                nnz,\\n                                descr_U,\\n                                csr_val,\\n                                csr_row_ptr,\\n                                csr_col_ind,\\n                                info,\\n                                rocsparse_analysis_policy_reuse,\\n                                rocsparse_solve_policy_auto,\\n                                temp_buffer);\\n\\n      // Check for zero pivot\\n      rocsparse_int position;\\n      if(rocsparse_status_zero_pivot == rocsparse_csrilu0_zero_pivot(handle,\\n                                                                     info,\\n                                                                     &position))\\n      {\\n          printf(\\\"A has structural zero at A(%d,%d)\\\\n\\\", position, position);\\n      }\\n\\n      // Compute incomplete LU factorization\\n      rocsparse_dcsrilu0(handle,\\n                         m,\\n                         nnz,\\n                         descr_M,\\n                         csr_val,\\n                         csr_row_ptr,\\n                         csr_col_ind,\\n                         info,\\n                         rocsparse_solve_policy_auto,\\n                         temp_buffer);\\n\\n      // Check for zero pivot\\n      if(rocsparse_status_zero_pivot == rocsparse_csrilu0_zero_pivot(handle,\\n                                                                     info,\\n                                                                     &position))\\n      {\\n          printf(\\\"U has structural and/or numerical zero at U(%d,%d)\\\\n\\\",\\n                 position,\\n                 position);\\n      }\\n\\n      // Solve Lz = x\\n      rocsparse_dcsrsv_solve(handle,\\n                             rocsparse_operation_none,\\n                             m,\\n                             nnz,\\n                             &alpha,\\n                             descr_L,\\n                             csr_val,\\n                             csr_row_ptr,\\n                             csr_col_ind,\\n                             info,\\n                             x,\\n                             z,\\n                             rocsparse_solve_policy_auto,\\n                             temp_buffer);\\n\\n      // Solve Uy = z\\n      rocsparse_dcsrsv_solve(handle,\\n                             rocsparse_operation_none,\\n                             m,\\n                             nnz,\\n                             &alpha,\\n                             descr_U,\\n                             csr_val,\\n                             csr_row_ptr,\\n                             csr_col_ind,\\n                             info,\\n                             z,\\n                             y,\\n                             rocsparse_solve_policy_auto,\\n                             temp_buffer);\\n\\n      // Clean up\\n      hipFree(temp_buffer);\\n      rocsparse_destroy_mat_info(info);\\n      rocsparse_destroy_mat_descr(descr_M);\\n      rocsparse_destroy_mat_descr(descr_L);\\n      rocsparse_destroy_mat_descr(descr_U);\\n      rocsparse_destroy_handle(handle);\\n  \\\\endcode\\n/\\n/**@{\"]\n    pub fn rocsparse_scsrilu0(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *mut f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsrilu0(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *mut f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsrilu0(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *mut rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsrilu0(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *mut rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        info: rocsparse_mat_info,\n        policy: rocsparse_solve_policy,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup precond_module\n  \\brief Iterative Incomplete LU factorization with 0 fill-ins and no pivoting using CSR\n  storage format.\n\n  \\details\n  \\p rocsparse_csritilu0_buffer_size computes the size in bytes of the buffer that has to be allocated by the user.\n\n  \\note\n  The sparse CSR matrix has to be sorted. This can be achieved by calling\n  rocsparse_csrsort().\n\n  \\note\n  This function is blocking with respect to the host.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[in]\n  alg         algorithm to use, \\ref rocsparse_itilu0_alg\n  @param[in]\n  option      combination of enumeration values from \\ref rocsparse_itilu0_option.\n  @param[in]\n  nmaxiter     maximum number of iterations.\n  @param[in]\n  m           number of rows of the sparse CSR matrix.\n  @param[in]\n  nnz         number of non-zero entries of the sparse CSR matrix.\n  @param[in]\n  csr_row_ptr array of \\p m+1 elements that point to the start\n              of every row of the sparse CSR matrix.\n  @param[in]\n  csr_col_ind array of \\p nnz elements containing the column indices of the sparse\n              CSR matrix.\n  @param[in]\n  idx_base    \\ref rocsparse_index_base_zero or \\ref rocsparse_index_base_one.\n  @param[in]\n  datatype    Type of numerical values, \\ref rocsparse_datatype.\n  @param[out]\n  buffer_size size of the temporary storage buffer allocated by the user.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_size \\p m or \\p nnz is invalid.\n  \\retval     rocsparse_status_invalid_value \\p alg, \\p base or datatype is invalid.\n  \\retval     rocsparse_status_invalid_pointer \\p csr_row_ptr\n              or \\p csr_col_ind pointer is invalid.\n  \\retval     rocsparse_status_zero_pivot if nnz is zero.\n  \\retval     rocsparse_status_internal_error an internal error occurred.*/\n    pub fn rocsparse_csritilu0_buffer_size(\n        handle: rocsparse_handle,\n        alg: rocsparse_itilu0_alg,\n        option: rocsparse_int,\n        nmaxiter: rocsparse_int,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        datatype: rocsparse_datatype,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup precond_module\n  \\brief Iterative Incomplete LU factorization with 0 fill-ins and no pivoting using CSR\n  storage format.\n\n  \\details\n  \\p rocsparse_csritilu0_preprocess computes the information required to run \\ref rocsparse_scsritilu0_compute,\n  \\ref rocsparse_dcsritilu0_compute, \\ref rocsparse_ccsritilu0_compute, or \\ref rocsparse_zcsritilu0_compute,\n  and stores it in the buffer.\n\n  \\note\n  The sparse CSR matrix has to be sorted. This can be achieved by calling\n  rocsparse_csrsort().\n\n  \\note\n  This function is blocking with respect to the host.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[in]\n  alg         algorithm to use, \\ref rocsparse_itilu0_alg\n  @param[in]\n  option      combination of enumeration values from \\ref rocsparse_itilu0_option.\n  @param[in]\n  nmaxiter     maximum number of iterations.\n  @param[in]\n  m           number of rows of the sparse CSR matrix.\n  @param[in]\n  nnz         number of non-zero entries of the sparse CSR matrix.\n  @param[in]\n  csr_row_ptr array of \\p m+1 elements that point to the start\n              of every row of the sparse CSR matrix.\n  @param[in]\n  csr_col_ind array of \\p nnz elements containing the column indices of the sparse\n              CSR matrix.\n  @param[in]\n  idx_base    \\ref rocsparse_index_base_zero or \\ref rocsparse_index_base_one.\n  @param[in]\n  datatype    Type of numerical values, \\ref rocsparse_datatype.\n  @param[in]\n  buffer_size size of the storage buffer allocated by the user.\n  @param[in]\n  buffer      storage buffer allocated by the user.\n\n  \\retval     rocsparse_status_success the operation completed successfully.\n  \\retval     rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval     rocsparse_status_invalid_value \\p alg, \\p base or datatype is invalid.\n  \\retval     rocsparse_status_invalid_size \\p m or \\p nnz is invalid.\n  \\retval     rocsparse_status_invalid_pointer \\p csr_row_ptr\n              or \\p csr_col_ind pointer is invalid.\n  \\retval     rocsparse_status_internal_error an internal error occurred.\n  \\retval     rocsparse_status_zero_pivot if missing diagonal element is detected.*/\n    pub fn rocsparse_csritilu0_preprocess(\n        handle: rocsparse_handle,\n        alg: rocsparse_itilu0_alg,\n        option: rocsparse_int,\n        nmaxiter: rocsparse_int,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        datatype: rocsparse_datatype,\n        buffer_size: usize,\n        buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup precond_module\\n  \\\\brief Iterative Incomplete LU factorization with 0 fill-ins and no pivoting using CSR\\n  storage format.\\n\\n  \\\\details\\n  \\\\p rocsparse_csritilu0_compute computes iteratively the incomplete LU factorization with 0 fill-ins and no\\n  pivoting of a sparse \\\\f$m \\\\times m\\\\f$ CSR matrix \\\\f$A\\\\f$, such that\\n  \\\\f[\\n    A \\\\approx LU\\n  \\\\f]\\n\\n  \\\\p rocsparse_csritilu0 requires a user allocated temporary buffer. Its size is returned\\n  by rocsparse_csritilu0_buffer_size(). Furthermore,\\n  analysis meta data is required. It can be obtained by rocsparse_csritlu0_preprocess().\\n\\n  \\\\note\\n  The sparse CSR matrix has to be sorted. This can be achieved by calling\\n  rocsparse_csrsort().\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  alg         algorithm to use, \\\\ref rocsparse_itilu0_alg\\n  @param[in]\\n  option      combination of enumeration values from \\\\ref rocsparse_itilu0_option.\\n  @param[inout]\\n  nmaxiter     maximum number of iterations.\\n  @param[in]\\n  tol tolerance to use for stopping criteria.\\n  @param[in]\\n  m           number of rows of the sparse CSR matrix.\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse CSR matrix.\\n  @param[in]\\n  csr_row_ptr array of \\\\p m+1 elements that point to the start\\n              of every row of the sparse CSR matrix.\\n  @param[in]\\n  csr_col_ind array of \\\\p nnz elements containing the column indices of the sparse\\n              CSR matrix.\\n  @param[inout]\\n  csr_val     array of \\\\p nnz elements of the sparse CSR matrix.\\n  @param[out]\\n  ilu0        incomplete factorization.\\n  @param[in]\\n  idx_base    \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n  @param[in]\\n  buffer_size size of the storage buffer allocated by the user.\\n  @param[in]\\n  buffer      storage buffer allocated by the user.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_value \\\\p alg or \\\\p base is invalid.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p nnz is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p csr_row_ptr\\n              or \\\\p csr_col_ind pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n\\n/\\n/**@{\"]\n    pub fn rocsparse_scsritilu0_compute(\n        handle: rocsparse_handle,\n        alg: rocsparse_itilu0_alg,\n        option: rocsparse_int,\n        nmaxiter: *mut rocsparse_int,\n        tol: f32,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        csr_val: *const f32,\n        ilu0: *mut f32,\n        idx_base: rocsparse_index_base,\n        buffer_size: usize,\n        buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsritilu0_compute(\n        handle: rocsparse_handle,\n        alg: rocsparse_itilu0_alg,\n        option: rocsparse_int,\n        nmaxiter: *mut rocsparse_int,\n        tol: f64,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        csr_val: *const f64,\n        ilu0: *mut f64,\n        idx_base: rocsparse_index_base,\n        buffer_size: usize,\n        buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsritilu0_compute(\n        handle: rocsparse_handle,\n        alg: rocsparse_itilu0_alg,\n        option: rocsparse_int,\n        nmaxiter: *mut rocsparse_int,\n        tol: f32,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        csr_val: *const rocsparse_float_complex,\n        ilu0: *mut rocsparse_float_complex,\n        idx_base: rocsparse_index_base,\n        buffer_size: usize,\n        buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsritilu0_compute(\n        handle: rocsparse_handle,\n        alg: rocsparse_itilu0_alg,\n        option: rocsparse_int,\n        nmaxiter: *mut rocsparse_int,\n        tol: f64,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        csr_val: *const rocsparse_double_complex,\n        ilu0: *mut rocsparse_double_complex,\n        idx_base: rocsparse_index_base,\n        buffer_size: usize,\n        buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup precond_module\\n  \\\\brief Iterative Incomplete LU factorization with 0 fill-ins and no pivoting using CSR\\n  storage format.\\n\\n  \\\\details\\n  \\\\p rocsparse_csritilu0_history fetches convergence history data.\\n\\n  \\\\note\\n  The sparse CSR matrix has to be sorted. This can be achieved by calling\\n  rocsparse_csrsort().\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  alg         algorithm to use, \\\\ref rocsparse_itilu0_alg\\n  @param[out]\\n  niter       number of performed iterations.\\n  @param[out]\\n  data        norms.\\n  @param[in]\\n  buffer_size size of the buffer allocated by the user.\\n  @param[in]\\n  buffer buffer allocated by the user.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p niter or \\\\p data is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n\\n/\\n/**@{\"]\n    pub fn rocsparse_scsritilu0_history(\n        handle: rocsparse_handle,\n        alg: rocsparse_itilu0_alg,\n        niter: *mut rocsparse_int,\n        data: *mut f32,\n        buffer_size: usize,\n        buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsritilu0_history(\n        handle: rocsparse_handle,\n        alg: rocsparse_itilu0_alg,\n        niter: *mut rocsparse_int,\n        data: *mut f64,\n        buffer_size: usize,\n        buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsritilu0_history(\n        handle: rocsparse_handle,\n        alg: rocsparse_itilu0_alg,\n        niter: *mut rocsparse_int,\n        data: *mut f32,\n        buffer_size: usize,\n        buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsritilu0_history(\n        handle: rocsparse_handle,\n        alg: rocsparse_itilu0_alg,\n        niter: *mut rocsparse_int,\n        data: *mut f64,\n        buffer_size: usize,\n        buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup precond_module\\n  \\\\brief Batched Pentadiagonal solver\\n\\n  \\\\details\\n  \\\\p rocsparse_gpsv_interleaved_batch_buffer_size calculates the required buffer size\\n  for rocsparse_gpsv_interleaved_batch(). It is the users responsibility to allocate\\n  this buffer.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle       handle to the rocsparse library context queue.\\n  @param[in]\\n  alg          algorithm to solve the linear system.\\n  @param[in]\\n  m            size of the pentadiagonal linear system.\\n  @param[in]\\n  ds           lower diagonal (distance 2) of pentadiagonal system. First two entries\\n               must be zero.\\n  @param[in]\\n  dl           lower diagonal of pentadiagonal system. First entry must be zero.\\n  @param[in]\\n  d            main diagonal of pentadiagonal system.\\n  @param[in]\\n  du           upper diagonal of pentadiagonal system. Last entry must be zero.\\n  @param[in]\\n  dw           upper diagonal (distance 2) of pentadiagonal system. Last two entries\\n               must be zero.\\n  @param[in]\\n  x            Dense array of right-hand-sides with dimension \\\\p batch_stride by \\\\p m.\\n  @param[in]\\n  batch_count  The number of systems to solve.\\n  @param[in]\\n  batch_stride The number of elements that separate consecutive elements in a system.\\n               Must satisfy \\\\p batch_stride >= batch_count.\\n  @param[out]\\n  buffer_size  Number of bytes of the temporary storage buffer required.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m, \\\\p alg, \\\\p batch_count or\\n              \\\\p batch_stride is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p ds, \\\\p dl, \\\\p d, \\\\p du, \\\\p dw, \\\\p x\\n              or \\\\p temp_buffer pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n/\\n/**@{\"]\n    pub fn rocsparse_sgpsv_interleaved_batch_buffer_size(\n        handle: rocsparse_handle,\n        alg: rocsparse_gpsv_interleaved_alg,\n        m: rocsparse_int,\n        ds: *const f32,\n        dl: *const f32,\n        d: *const f32,\n        du: *const f32,\n        dw: *const f32,\n        x: *const f32,\n        batch_count: rocsparse_int,\n        batch_stride: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dgpsv_interleaved_batch_buffer_size(\n        handle: rocsparse_handle,\n        alg: rocsparse_gpsv_interleaved_alg,\n        m: rocsparse_int,\n        ds: *const f64,\n        dl: *const f64,\n        d: *const f64,\n        du: *const f64,\n        dw: *const f64,\n        x: *const f64,\n        batch_count: rocsparse_int,\n        batch_stride: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cgpsv_interleaved_batch_buffer_size(\n        handle: rocsparse_handle,\n        alg: rocsparse_gpsv_interleaved_alg,\n        m: rocsparse_int,\n        ds: *const rocsparse_float_complex,\n        dl: *const rocsparse_float_complex,\n        d: *const rocsparse_float_complex,\n        du: *const rocsparse_float_complex,\n        dw: *const rocsparse_float_complex,\n        x: *const rocsparse_float_complex,\n        batch_count: rocsparse_int,\n        batch_stride: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zgpsv_interleaved_batch_buffer_size(\n        handle: rocsparse_handle,\n        alg: rocsparse_gpsv_interleaved_alg,\n        m: rocsparse_int,\n        ds: *const rocsparse_double_complex,\n        dl: *const rocsparse_double_complex,\n        d: *const rocsparse_double_complex,\n        du: *const rocsparse_double_complex,\n        dw: *const rocsparse_double_complex,\n        x: *const rocsparse_double_complex,\n        batch_count: rocsparse_int,\n        batch_stride: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup precond_module\\n  \\\\brief Batched Pentadiagonal solver\\n\\n  \\\\details\\n  \\\\p rocsparse_gpsv_interleaved_batch  solves a batch of pentadiagonal linear systems.\\n  The coefficient matrix of each pentadiagonal linear system is defined by five vectors\\n  for the lower part (ds, dl), main diagonal (d) and upper part (du, dw).\\n\\n  The function requires a temporary buffer. The size of the required buffer is returned\\n  by rocsparse_gpsv_interleaved_batch_buffer_size().\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  The routine is numerically stable because it uses QR to solve the linear systems.\\n\\n  \\\\note\\n  m need to be at least 3, to be a valid pentadiagonal matrix.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle       handle to the rocsparse library context queue.\\n  @param[in]\\n  alg          algorithm to solve the linear system.\\n  @param[in]\\n  m            size of the pentadiagonal linear system.\\n  @param[inout]\\n  ds           lower diagonal (distance 2) of pentadiagonal system. First two entries\\n               must be zero.\\n  @param[inout]\\n  dl           lower diagonal of pentadiagonal system. First entry must be zero.\\n  @param[inout]\\n  d            main diagonal of pentadiagonal system.\\n  @param[inout]\\n  du           upper diagonal of pentadiagonal system. Last entry must be zero.\\n  @param[inout]\\n  dw           upper diagonal (distance 2) of pentadiagonal system. Last two entries\\n               must be zero.\\n  @param[inout]\\n  x            Dense array of right-hand-sides with dimension \\\\p batch_stride by \\\\p m.\\n  @param[in]\\n  batch_count  The number of systems to solve.\\n  @param[in]\\n  batch_stride The number of elements that separate consecutive elements in a system.\\n               Must satisfy \\\\p batch_stride >= batch_count.\\n  @param[in]\\n  temp_buffer  Temporary storage buffer allocated by the user.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m, \\\\p alg, \\\\p batch_count or\\n              \\\\p batch_stride is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p ds, \\\\p dl, \\\\p d, \\\\p du, \\\\p dw, \\\\p x\\n              or \\\\p temp_buffer pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n/\\n/**@{\"]\n    pub fn rocsparse_sgpsv_interleaved_batch(\n        handle: rocsparse_handle,\n        alg: rocsparse_gpsv_interleaved_alg,\n        m: rocsparse_int,\n        ds: *mut f32,\n        dl: *mut f32,\n        d: *mut f32,\n        du: *mut f32,\n        dw: *mut f32,\n        x: *mut f32,\n        batch_count: rocsparse_int,\n        batch_stride: rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dgpsv_interleaved_batch(\n        handle: rocsparse_handle,\n        alg: rocsparse_gpsv_interleaved_alg,\n        m: rocsparse_int,\n        ds: *mut f64,\n        dl: *mut f64,\n        d: *mut f64,\n        du: *mut f64,\n        dw: *mut f64,\n        x: *mut f64,\n        batch_count: rocsparse_int,\n        batch_stride: rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cgpsv_interleaved_batch(\n        handle: rocsparse_handle,\n        alg: rocsparse_gpsv_interleaved_alg,\n        m: rocsparse_int,\n        ds: *mut rocsparse_float_complex,\n        dl: *mut rocsparse_float_complex,\n        d: *mut rocsparse_float_complex,\n        du: *mut rocsparse_float_complex,\n        dw: *mut rocsparse_float_complex,\n        x: *mut rocsparse_float_complex,\n        batch_count: rocsparse_int,\n        batch_stride: rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zgpsv_interleaved_batch(\n        handle: rocsparse_handle,\n        alg: rocsparse_gpsv_interleaved_alg,\n        m: rocsparse_int,\n        ds: *mut rocsparse_double_complex,\n        dl: *mut rocsparse_double_complex,\n        d: *mut rocsparse_double_complex,\n        du: *mut rocsparse_double_complex,\n        dw: *mut rocsparse_double_complex,\n        x: *mut rocsparse_double_complex,\n        batch_count: rocsparse_int,\n        batch_stride: rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup precond_module\\n  \\\\brief Tridiagonal solver with pivoting\\n\\n  \\\\details\\n  \\\\p rocsparse_gtsv_buffer_size returns the size of the temporary storage buffer\\n  that is required by rocsparse_sgtsv(), rocsparse_dgtsv(),\\n  rocsparse_cgtsv() and rocsparse_zgtsv(). The temporary storage buffer\\n  must be allocated by the user.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  m           size of the tri-diagonal linear system (must be >= 2).\\n  @param[in]\\n  n           number of columns in the dense matrix B.\\n  @param[in]\\n  dl          lower diagonal of tri-diagonal system. First entry must be zero.\\n  @param[in]\\n  d           main diagonal of tri-diagonal system.\\n  @param[in]\\n  du          upper diagonal of tri-diagonal system. Last entry must be zero.\\n  @param[in]\\n  B           Dense matrix of size ( \\\\p ldb, \\\\p n ).\\n  @param[in]\\n  ldb         Leading dimension of B. Must satisfy \\\\p ldb >= max(1, m).\\n  @param[out]\\n  buffer_size number of bytes of the temporary storage buffer required by\\n              rocsparse_sgtsv(), rocsparse_dgtsv(), rocsparse_cgtsv()\\n              and rocsparse_zgtsv().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m, \\\\p n or \\\\p ldb is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p dl, \\\\p d, \\\\p du,\\n              \\\\p B or \\\\p buffer_size pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n/\\n/**@{\"]\n    pub fn rocsparse_sgtsv_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        dl: *const f32,\n        d: *const f32,\n        du: *const f32,\n        B: *const f32,\n        ldb: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dgtsv_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        dl: *const f64,\n        d: *const f64,\n        du: *const f64,\n        B: *const f64,\n        ldb: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cgtsv_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        dl: *const rocsparse_float_complex,\n        d: *const rocsparse_float_complex,\n        du: *const rocsparse_float_complex,\n        B: *const rocsparse_float_complex,\n        ldb: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zgtsv_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        dl: *const rocsparse_double_complex,\n        d: *const rocsparse_double_complex,\n        du: *const rocsparse_double_complex,\n        B: *const rocsparse_double_complex,\n        ldb: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup precond_module\\n  \\\\brief Tridiagonal solver with pivoting\\n\\n  \\\\details\\n  \\\\p rocsparse_gtsv solves a tridiagonal system for multiple right hand sides using pivoting.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  m           size of the tri-diagonal linear system (must be >= 2).\\n  @param[in]\\n  n           number of columns in the dense matrix B.\\n  @param[in]\\n  dl          lower diagonal of tri-diagonal system. First entry must be zero.\\n  @param[in]\\n  d           main diagonal of tri-diagonal system.\\n  @param[in]\\n  du          upper diagonal of tri-diagonal system. Last entry must be zero.\\n  @param[inout]\\n  B           Dense matrix of size ( \\\\p ldb, \\\\p n ).\\n  @param[in]\\n  ldb         Leading dimension of B. Must satisfy \\\\p ldb >= max(1, m).\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m, \\\\p n or \\\\p ldb is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p dl, \\\\p d,\\n              \\\\p du, \\\\p B or \\\\p temp_buffer pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n/\\n/**@{\"]\n    pub fn rocsparse_sgtsv(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        dl: *const f32,\n        d: *const f32,\n        du: *const f32,\n        B: *mut f32,\n        ldb: rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dgtsv(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        dl: *const f64,\n        d: *const f64,\n        du: *const f64,\n        B: *mut f64,\n        ldb: rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cgtsv(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        dl: *const rocsparse_float_complex,\n        d: *const rocsparse_float_complex,\n        du: *const rocsparse_float_complex,\n        B: *mut rocsparse_float_complex,\n        ldb: rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zgtsv(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        dl: *const rocsparse_double_complex,\n        d: *const rocsparse_double_complex,\n        du: *const rocsparse_double_complex,\n        B: *mut rocsparse_double_complex,\n        ldb: rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup precond_module\\n  \\\\brief Tridiagonal solver (no pivoting)\\n\\n  \\\\details\\n  \\\\p rocsparse_gtsv_no_pivot_buffer_size returns the size of the temporary storage buffer\\n  that is required by rocsparse_sgtsv_no_pivot(), rocsparse_dgtsv_no_pivot(),\\n  rocsparse_cgtsv_no_pivot() and rocsparse_zgtsv_no_pivot(). The temporary storage buffer\\n  must be allocated by the user.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  m           size of the tri-diagonal linear system (must be >= 2).\\n  @param[in]\\n  n           number of columns in the dense matrix B.\\n  @param[in]\\n  dl          lower diagonal of tri-diagonal system. First entry must be zero.\\n  @param[in]\\n  d           main diagonal of tri-diagonal system.\\n  @param[in]\\n  du          upper diagonal of tri-diagonal system. Last entry must be zero.\\n  @param[in]\\n  B           Dense matrix of size ( \\\\p ldb, \\\\p n ).\\n  @param[in]\\n  ldb         Leading dimension of B. Must satisfy \\\\p ldb >= max(1, m).\\n  @param[out]\\n  buffer_size number of bytes of the temporary storage buffer required by\\n              rocsparse_sgtsv_no_pivot(), rocsparse_dgtsv_no_pivot(), rocsparse_cgtsv_no_pivot()\\n              and rocsparse_zgtsv_no_pivot().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m, \\\\p n or \\\\p ldb is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p dl, \\\\p d, \\\\p du,\\n              \\\\p B or \\\\p buffer_size pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n/\\n/**@{\"]\n    pub fn rocsparse_sgtsv_no_pivot_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        dl: *const f32,\n        d: *const f32,\n        du: *const f32,\n        B: *const f32,\n        ldb: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dgtsv_no_pivot_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        dl: *const f64,\n        d: *const f64,\n        du: *const f64,\n        B: *const f64,\n        ldb: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cgtsv_no_pivot_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        dl: *const rocsparse_float_complex,\n        d: *const rocsparse_float_complex,\n        du: *const rocsparse_float_complex,\n        B: *const rocsparse_float_complex,\n        ldb: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zgtsv_no_pivot_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        dl: *const rocsparse_double_complex,\n        d: *const rocsparse_double_complex,\n        du: *const rocsparse_double_complex,\n        B: *const rocsparse_double_complex,\n        ldb: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup precond_module\\n  \\\\brief Tridiagonal solver (no pivoting)\\n\\n  \\\\details\\n  \\\\p rocsparse_gtsv_no_pivot  solves a tridiagonal linear system for multiple right-hand sides\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  m           size of the tri-diagonal linear system (must be >= 2).\\n  @param[in]\\n  n           number of columns in the dense matrix B.\\n  @param[in]\\n  dl          lower diagonal of tri-diagonal system. First entry must be zero.\\n  @param[in]\\n  d           main diagonal of tri-diagonal system.\\n  @param[in]\\n  du          upper diagonal of tri-diagonal system. Last entry must be zero.\\n  @param[inout]\\n  B           Dense matrix of size ( \\\\p ldb, \\\\p n ).\\n  @param[in]\\n  ldb         Leading dimension of B. Must satisfy \\\\p ldb >= max(1, m).\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m, \\\\p n or \\\\p ldb is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p dl, \\\\p d,\\n              \\\\p du, \\\\p B or \\\\p temp_buffer pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n/\\n/**@{\"]\n    pub fn rocsparse_sgtsv_no_pivot(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        dl: *const f32,\n        d: *const f32,\n        du: *const f32,\n        B: *mut f32,\n        ldb: rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dgtsv_no_pivot(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        dl: *const f64,\n        d: *const f64,\n        du: *const f64,\n        B: *mut f64,\n        ldb: rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cgtsv_no_pivot(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        dl: *const rocsparse_float_complex,\n        d: *const rocsparse_float_complex,\n        du: *const rocsparse_float_complex,\n        B: *mut rocsparse_float_complex,\n        ldb: rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zgtsv_no_pivot(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        dl: *const rocsparse_double_complex,\n        d: *const rocsparse_double_complex,\n        du: *const rocsparse_double_complex,\n        B: *mut rocsparse_double_complex,\n        ldb: rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup precond_module\\n  \\\\brief Strided Batch tridiagonal solver (no pivoting)\\n\\n  \\\\details\\n  \\\\p rocsparse_gtsv_no_pivot_strided_batch_buffer_size returns the size of the temporary storage buffer\\n  that is required by rocsparse_sgtsv_no_pivot_strided_batch(), rocsparse_dgtsv_no_pivot_strided_batch(),\\n  rocsparse_cgtsv_no_pivot_strided_batch() and rocsparse_zgtsv_no_pivot_strided_batch(). The temporary\\n  storage buffer must be allocated by the user.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  m           size of the tri-diagonal linear system.\\n  @param[in]\\n  dl          lower diagonal of tri-diagonal system where the ith system lower diagonal starts at \\\\p dl+batch_stride*i.\\n  @param[in]\\n  d           main diagonal of tri-diagonal system where the ith system diagonal starts at \\\\p d+batch_stride*i.\\n  @param[in]\\n  du          upper diagonal of tri-diagonal system where the ith system upper diagonal starts at \\\\p du+batch_stride*i.\\n  @param[inout]\\n  x           Dense array of righthand-sides where the ith righthand-side starts at \\\\p x+batch_stride*i.\\n  @param[in]\\n  batch_count The number of systems to solve.\\n  @param[in]\\n  batch_stride The number of elements that separate each system. Must satisfy \\\\p batch_stride >= m.\\n  @param[out]\\n  buffer_size number of bytes of the temporary storage buffer required by\\n              rocsparse_sgtsv_no_pivot_strided_batch(), rocsparse_dgtsv_no_pivot_strided_batch(), rocsparse_cgtsv_no_pivot_strided_batch()\\n              and rocsparse_zgtsv_no_pivot_strided_batch().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m, \\\\p batch_count or \\\\p batch_stride is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p dl, \\\\p d, \\\\p du,\\n              \\\\p x or \\\\p buffer_size pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n/\\n/**@{\"]\n    pub fn rocsparse_sgtsv_no_pivot_strided_batch_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        dl: *const f32,\n        d: *const f32,\n        du: *const f32,\n        x: *const f32,\n        batch_count: rocsparse_int,\n        batch_stride: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dgtsv_no_pivot_strided_batch_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        dl: *const f64,\n        d: *const f64,\n        du: *const f64,\n        x: *const f64,\n        batch_count: rocsparse_int,\n        batch_stride: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cgtsv_no_pivot_strided_batch_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        dl: *const rocsparse_float_complex,\n        d: *const rocsparse_float_complex,\n        du: *const rocsparse_float_complex,\n        x: *const rocsparse_float_complex,\n        batch_count: rocsparse_int,\n        batch_stride: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zgtsv_no_pivot_strided_batch_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        dl: *const rocsparse_double_complex,\n        d: *const rocsparse_double_complex,\n        du: *const rocsparse_double_complex,\n        x: *const rocsparse_double_complex,\n        batch_count: rocsparse_int,\n        batch_stride: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup precond_module\\n  \\\\brief Strided Batch tridiagonal solver (no pivoting)\\n\\n  \\\\details\\n  \\\\p rocsparse_gtsv_no_pivot_strided_batch  solves a batched tridiagonal linear system\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  m           size of the tri-diagonal linear system (must be >= 2).\\n  @param[in]\\n  dl          lower diagonal of tri-diagonal system. First entry must be zero.\\n  @param[in]\\n  d           main diagonal of tri-diagonal system.\\n  @param[in]\\n  du          upper diagonal of tri-diagonal system. Last entry must be zero.\\n  @param[inout]\\n  x           Dense array of righthand-sides where the ith righthand-side starts at \\\\p x+batch_stride*i.\\n  @param[in]\\n  batch_count The number of systems to solve.\\n  @param[in]\\n  batch_stride The number of elements that separate each system. Must satisfy \\\\p batch_stride >= m.\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m, \\\\p batch_count or \\\\p batch_stride is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p dl, \\\\p d,\\n              \\\\p du, \\\\p x or \\\\p temp_buffer pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n/\\n/**@{\"]\n    pub fn rocsparse_sgtsv_no_pivot_strided_batch(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        dl: *const f32,\n        d: *const f32,\n        du: *const f32,\n        x: *mut f32,\n        batch_count: rocsparse_int,\n        batch_stride: rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dgtsv_no_pivot_strided_batch(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        dl: *const f64,\n        d: *const f64,\n        du: *const f64,\n        x: *mut f64,\n        batch_count: rocsparse_int,\n        batch_stride: rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cgtsv_no_pivot_strided_batch(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        dl: *const rocsparse_float_complex,\n        d: *const rocsparse_float_complex,\n        du: *const rocsparse_float_complex,\n        x: *mut rocsparse_float_complex,\n        batch_count: rocsparse_int,\n        batch_stride: rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zgtsv_no_pivot_strided_batch(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        dl: *const rocsparse_double_complex,\n        d: *const rocsparse_double_complex,\n        du: *const rocsparse_double_complex,\n        x: *mut rocsparse_double_complex,\n        batch_count: rocsparse_int,\n        batch_stride: rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup precond_module\\n  \\\\brief Interleaved Batch tridiagonal solver\\n\\n  \\\\details\\n  \\\\p rocsparse_gtsv_interleaved_batch_buffer_size returns the size of the temporary storage buffer\\n  that is required by rocsparse_sgtsv_interleaved_batch(), rocsparse_dgtsv_interleaved_batch(),\\n  rocsparse_cgtsv_interleaved_batch() and rocsparse_zgtsv_interleaved_batch(). The temporary\\n  storage buffer must be allocated by the user.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  alg         Algorithm to use when solving tridiagonal systems. Options are thomas ( \\\\p rocsparse_gtsv_interleaved_thomas ),\\n              LU ( \\\\p rocsparse_gtsv_interleaved_lu ), or QR ( \\\\p rocsparse_gtsv_interleaved_qr ). Passing\\n              \\\\p rocsparse_gtsv_interleaved_default defaults the algorithm to use QR. Thomas algorithm is the fastest but is not\\n              stable while LU and QR are slower but are stable.\\n  @param[in]\\n  m           size of the tri-diagonal linear system.\\n  @param[in]\\n  dl          lower diagonal of tri-diagonal system. The first element of the lower diagonal must be zero.\\n  @param[in]\\n  d           main diagonal of tri-diagonal system.\\n  @param[in]\\n  du          upper diagonal of tri-diagonal system. The last element of the upper diagonal must be zero.\\n  @param[inout]\\n  x           Dense array of righthand-sides with dimension \\\\p batch_stride by \\\\p m.\\n  @param[in]\\n  batch_count The number of systems to solve.\\n  @param[in]\\n  batch_stride The number of elements that separate consecutive elements in a system. Must satisfy \\\\p batch_stride >= batch_count.\\n  @param[out]\\n  buffer_size number of bytes of the temporary storage buffer required by\\n              rocsparse_sgtsv_interleaved_batch(), rocsparse_dgtsv_interleaved_batch(), rocsparse_cgtsv_interleaved_batch()\\n              and rocsparse_zgtsv_interleaved_batch().\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m, \\\\p batch_count, \\\\p batch_stride is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p dl, \\\\p d, \\\\p du,\\n              \\\\p x or \\\\p buffer_size pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n/\\n/**@{\"]\n    pub fn rocsparse_sgtsv_interleaved_batch_buffer_size(\n        handle: rocsparse_handle,\n        alg: rocsparse_gtsv_interleaved_alg,\n        m: rocsparse_int,\n        dl: *const f32,\n        d: *const f32,\n        du: *const f32,\n        x: *const f32,\n        batch_count: rocsparse_int,\n        batch_stride: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dgtsv_interleaved_batch_buffer_size(\n        handle: rocsparse_handle,\n        alg: rocsparse_gtsv_interleaved_alg,\n        m: rocsparse_int,\n        dl: *const f64,\n        d: *const f64,\n        du: *const f64,\n        x: *const f64,\n        batch_count: rocsparse_int,\n        batch_stride: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cgtsv_interleaved_batch_buffer_size(\n        handle: rocsparse_handle,\n        alg: rocsparse_gtsv_interleaved_alg,\n        m: rocsparse_int,\n        dl: *const rocsparse_float_complex,\n        d: *const rocsparse_float_complex,\n        du: *const rocsparse_float_complex,\n        x: *const rocsparse_float_complex,\n        batch_count: rocsparse_int,\n        batch_stride: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zgtsv_interleaved_batch_buffer_size(\n        handle: rocsparse_handle,\n        alg: rocsparse_gtsv_interleaved_alg,\n        m: rocsparse_int,\n        dl: *const rocsparse_double_complex,\n        d: *const rocsparse_double_complex,\n        du: *const rocsparse_double_complex,\n        x: *const rocsparse_double_complex,\n        batch_count: rocsparse_int,\n        batch_stride: rocsparse_int,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup precond_module\\n  \\\\brief Interleaved Batch tridiagonal solver\\n\\n  \\\\details\\n  \\\\p rocsparse_gtsv_interleaved_batch  solves a batched tridiagonal linear system. The routine requires a temporary storage\\n  buffer that must be allocated by the user. The size of this buffer can be determined by first calling\\n  \\\\p rocsparse_gtsv_interleaved_batch_buffer_size. The user can specify different algorithms for \\\\p rocsparse_gtsv_interleaved_batch\\n  to use. Options are thomas ( \\\\p rocsparse_gtsv_interleaved_thomas ), LU ( \\\\p rocsparse_gtsv_interleaved_lu ),\\n  or QR ( \\\\p rocsparse_gtsv_interleaved_qr ). Passing \\\\p rocsparse_gtsv_interleaved_default defaults the algorithm to use QR.\\n\\n  \\\\note\\n  This function is non blocking and executed asynchronously with respect to the host.\\n  It may return before the actual computation has finished.\\n\\n  \\\\note\\n  This routine supports execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  alg         Algorithm to use when solving tridiagonal systems. Options are thomas ( \\\\p rocsparse_gtsv_interleaved_thomas ),\\n              LU ( \\\\p rocsparse_gtsv_interleaved_lu ), or QR ( \\\\p rocsparse_gtsv_interleaved_qr ). Passing\\n              \\\\p rocsparse_gtsv_interleaved_default defaults the algorithm to use QR. Thomas algorithm is the fastest but is not\\n              stable while LU and QR are slower but are stable.\\n  @param[in]\\n  m           size of the tri-diagonal linear system.\\n  @param[inout]\\n  dl          lower diagonal of tri-diagonal system. The first element of the lower diagonal must be zero.\\n  @param[inout]\\n  d           main diagonal of tri-diagonal system.\\n  @param[inout]\\n  du          upper diagonal of tri-diagonal system. The last element of the upper diagonal must be zero.\\n  @param[inout]\\n  x           Dense array of righthand-sides with dimension \\\\p batch_stride by \\\\p m.\\n  @param[in]\\n  batch_count The number of systems to solve.\\n  @param[in]\\n  batch_stride The number of elements that separate consecutive elements in a system. Must satisfy \\\\p batch_stride >= batch_count.\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user.\\n\\n  \\\\retval     rocsparse_status_success the operation completed successfully.\\n  \\\\retval     rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval     rocsparse_status_invalid_size \\\\p m or \\\\p batch_count or \\\\p batch_stride is invalid.\\n  \\\\retval     rocsparse_status_invalid_pointer \\\\p dl, \\\\p d,\\n              \\\\p du, \\\\p x or \\\\p temp_buffer pointer is invalid.\\n  \\\\retval     rocsparse_status_internal_error an internal error occurred.\\n/\\n/**@{\"]\n    pub fn rocsparse_sgtsv_interleaved_batch(\n        handle: rocsparse_handle,\n        alg: rocsparse_gtsv_interleaved_alg,\n        m: rocsparse_int,\n        dl: *mut f32,\n        d: *mut f32,\n        du: *mut f32,\n        x: *mut f32,\n        batch_count: rocsparse_int,\n        batch_stride: rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dgtsv_interleaved_batch(\n        handle: rocsparse_handle,\n        alg: rocsparse_gtsv_interleaved_alg,\n        m: rocsparse_int,\n        dl: *mut f64,\n        d: *mut f64,\n        du: *mut f64,\n        x: *mut f64,\n        batch_count: rocsparse_int,\n        batch_stride: rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_cgtsv_interleaved_batch(\n        handle: rocsparse_handle,\n        alg: rocsparse_gtsv_interleaved_alg,\n        m: rocsparse_int,\n        dl: *mut rocsparse_float_complex,\n        d: *mut rocsparse_float_complex,\n        du: *mut rocsparse_float_complex,\n        x: *mut rocsparse_float_complex,\n        batch_count: rocsparse_int,\n        batch_stride: rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zgtsv_interleaved_batch(\n        handle: rocsparse_handle,\n        alg: rocsparse_gtsv_interleaved_alg,\n        m: rocsparse_int,\n        dl: *mut rocsparse_double_complex,\n        d: *mut rocsparse_double_complex,\n        du: *mut rocsparse_double_complex,\n        x: *mut rocsparse_double_complex,\n        batch_count: rocsparse_int,\n        batch_stride: rocsparse_int,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup reordering_module\\n  \\\\brief Coloring of the adjacency graph of the matrix \\\\f$A\\\\f$ stored in the CSR format.\\n\\n  \\\\details\\n  \\\\p rocsparse_csrcolor performs the coloring of the undirected graph represented by the (symmetric) sparsity pattern of the\\n  matrix \\\\f$A\\\\f$ stored in CSR format. Graph coloring is a way of coloring the nodes of a graph such that no two adjacent nodes\\n  are of the same color. The \\\\p fraction_to_color is a parameter to only color a given percentage of the graph nodes, the\\n  remaining uncolored nodes receive distinct new colors. The optional \\\\p reordering array is a permutation array such that\\n  unknowns of the same color are grouped. The matrix \\\\f$A\\\\f$ must be stored as a general matrix with a symmetric sparsity pattern,\\n  and if the matrix \\\\f$A\\\\f$ is non-symmetric then the user is responsible to provide the symmetric part \\\\f$\\\\frac{A+A^T}{2}\\\\f$.\\n\\n  \\\\note\\n  This function is blocking with respect to the host.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  m           number of rows of sparse matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  nnz         number of non-zero entries of sparse matrix \\\\f$A\\\\f$.\\n  @param[in]\\n  descr      sparse matrix descriptor.\\n  @param[in]\\n  csr_val     array of \\\\p nnz elements of the sparse CSR matrix.\\n  @param[in]\\n  csr_row_ptr array of \\\\p m+1 elements that point to the start of every row of the\\n              sparse CSR matrix.\\n  @param[in]\\n  csr_col_ind array of \\\\p nnz elements containing the column indices of the sparse\\n              CSR matrix.\\n  @param[in]\\n  fraction_to_color  fraction of nodes to be colored, which should be in the interval [0.0,1.0], for example 0.8 implies that 80 percent of nodes will be colored.\\n  @param[out]\\n  ncolors      resulting number of distinct colors.\\n  @param[out]\\n  coloring     resulting mapping of colors.\\n  @param[out]\\n  reordering   optional resulting reordering permutation if \\\\p reordering is a non-null pointer.\\n  @param[inout]\\n  info    structure that holds the information collected during the coloring algorithm.\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval rocsparse_status_invalid_size \\\\p m or \\\\p nnz is invalid.\\n  \\\\retval rocsparse_status_invalid_pointer \\\\p descr, \\\\p csr_val, \\\\p csr_row_ptr, \\\\p csr_col_ind, \\\\p fraction_to_color, \\\\p ncolors, \\\\p coloring or \\\\p info pointer is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_scsrcolor(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        fraction_to_color: *const f32,\n        ncolors: *mut rocsparse_int,\n        coloring: *mut rocsparse_int,\n        reordering: *mut rocsparse_int,\n        info: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcsrcolor(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        fraction_to_color: *const f64,\n        ncolors: *mut rocsparse_int,\n        coloring: *mut rocsparse_int,\n        reordering: *mut rocsparse_int,\n        info: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccsrcolor(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        fraction_to_color: *const f32,\n        ncolors: *mut rocsparse_int,\n        coloring: *mut rocsparse_int,\n        reordering: *mut rocsparse_int,\n        info: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcsrcolor(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        nnz: rocsparse_int,\n        descr: rocsparse_mat_descr,\n        csr_val: *const rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        fraction_to_color: *const f64,\n        ncolors: *mut rocsparse_int,\n        coloring: *mut rocsparse_int,\n        reordering: *mut rocsparse_int,\n        info: rocsparse_mat_info,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup utility_module\\n  \\\\brief Check matrix to see if it is valid.\\n\\n  \\\\details\\n  \\\\p rocsparse_check_matrix_coo_buffer_size computes the required buffer size needed when\\n  calling \\\\p rocsparse_check_matrix_coo\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  m           number of rows of the sparse CSR matrix.\\n  @param[in]\\n  n           number of columns of the sparse CSR matrix.\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse CSR matrix.\\n  @param[in]\\n  coo_val     array of \\\\p nnz elements of the sparse COO matrix.\\n  @param[in]\\n  coo_row_ind array of \\\\p nnz elements containing the row indices of the sparse\\n              COO matrix.\\n  @param[in]\\n  coo_col_ind array of \\\\p nnz elements containing the column indices of the sparse\\n              COO matrix.\\n  @param[in]\\n  idx_base    \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n  @param[in]\\n  matrix_type \\\\ref rocsparse_matrix_type_general, \\\\ref rocsparse_matrix_type_symmetric,\\n              \\\\ref rocsparse_matrix_type_hermitian or \\\\ref rocsparse_matrix_type_triangular.\\n  @param[in]\\n  uplo        \\\\ref rocsparse_fill_mode_lower or \\\\ref rocsparse_fill_mode_upper.\\n  @param[in]\\n  storage     \\\\ref rocsparse_storage_mode_sorted or \\\\ref rocsparse_storage_mode_sorted.\\n  @param[out]\\n  buffer_size number of bytes of the temporary storage buffer required by\\n              rocsparse_scheck_matrix_coo(), rocsparse_dcheck_matrix_coo(),\\n              rocsparse_ccheck_matrix_coo() and rocsparse_zcheck_matrix_coo().\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval rocsparse_status_invalid_value \\\\p idx_base or \\\\p matrix_type or \\\\p uplo or \\\\p storage is invalid.\\n  \\\\retval rocsparse_status_invalid_size \\\\p m \\\\p n or \\\\p nnz is invalid.\\n  \\\\retval rocsparse_status_invalid_pointer \\\\p coo_val, \\\\p coo_row_ind, \\\\p coo_col_ind or \\\\p buffer_size pointer\\n          is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_scheck_matrix_coo_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        coo_val: *const f32,\n        coo_row_ind: *const rocsparse_int,\n        coo_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcheck_matrix_coo_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        coo_val: *const f64,\n        coo_row_ind: *const rocsparse_int,\n        coo_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccheck_matrix_coo_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        coo_val: *const rocsparse_float_complex,\n        coo_row_ind: *const rocsparse_int,\n        coo_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcheck_matrix_coo_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        coo_val: *const rocsparse_double_complex,\n        coo_row_ind: *const rocsparse_int,\n        coo_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup utility_module\\n  \\\\brief Check matrix to see if it is valid.\\n\\n  \\\\details\\n  \\\\p rocsparse_check_matrix_coo checks if the input COO matrix is valid.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  m           number of rows of the sparse COO matrix.\\n  @param[in]\\n  n           number of columns of the sparse COO matrix.\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse COO matrix.\\n  @param[in]\\n  coo_val     array of \\\\p nnz elements of the sparse COO matrix.\\n  @param[in]\\n  coo_row_ind array of \\\\p nnz elements containing the row indices of the sparse\\n              COO matrix.\\n  @param[in]\\n  coo_col_ind array of \\\\p nnz elements containing the column indices of the sparse\\n              COO matrix.\\n  @param[in]\\n  idx_base    \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n  @param[in]\\n  matrix_type \\\\ref rocsparse_matrix_type_general, \\\\ref rocsparse_matrix_type_symmetric,\\n              \\\\ref rocsparse_matrix_type_hermitian or \\\\ref rocsparse_matrix_type_triangular.\\n  @param[in]\\n  uplo        \\\\ref rocsparse_fill_mode_lower or \\\\ref rocsparse_fill_mode_upper.\\n  @param[in]\\n  storage     \\\\ref rocsparse_storage_mode_sorted or \\\\ref rocsparse_storage_mode_sorted.\\n  @param[out]\\n  data_status modified to indicate the status of the data\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user.\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval rocsparse_status_invalid_value \\\\p idx_base or \\\\p matrix_type or \\\\p uplo or \\\\p storage is invalid.\\n  \\\\retval rocsparse_status_invalid_size \\\\p m \\\\p n or \\\\p nnz is invalid.\\n  \\\\retval rocsparse_status_invalid_pointer \\\\p coo_val, \\\\p coo_row_ind, \\\\p coo_col_ind, \\\\p temp_buffer or \\\\p data_status  pointer\\n          is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_scheck_matrix_coo(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        coo_val: *const f32,\n        coo_row_ind: *const rocsparse_int,\n        coo_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        data_status: *mut rocsparse_data_status,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcheck_matrix_coo(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        coo_val: *const f64,\n        coo_row_ind: *const rocsparse_int,\n        coo_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        data_status: *mut rocsparse_data_status,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccheck_matrix_coo(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        coo_val: *const rocsparse_float_complex,\n        coo_row_ind: *const rocsparse_int,\n        coo_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        data_status: *mut rocsparse_data_status,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcheck_matrix_coo(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        coo_val: *const rocsparse_double_complex,\n        coo_row_ind: *const rocsparse_int,\n        coo_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        data_status: *mut rocsparse_data_status,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup utility_module\\n  \\\\brief Check matrix to see if it is valid.\\n\\n  \\\\details\\n  \\\\p rocsparse_check_matrix_csc_buffer_size computes the required buffer size needed when\\n  calling \\\\p rocsparse_check_matrix_csc\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  m           number of rows of the sparse CSC matrix.\\n  @param[in]\\n  n           number of columns of the sparse CSC matrix.\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse CSC matrix.\\n  @param[in]\\n  csc_val     array of \\\\p nnz elements of the sparse CSC matrix.\\n  @param[in]\\n  csc_col_ptr array of \\\\p m+1 elements that point to the start of every column of the\\n              sparse CSC matrix.\\n  @param[in]\\n  csc_row_ind array of \\\\p nnz elements containing the row indices of the sparse\\n              CSC matrix.\\n  @param[in]\\n  idx_base    \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n  @param[in]\\n  matrix_type \\\\ref rocsparse_matrix_type_general, \\\\ref rocsparse_matrix_type_symmetric,\\n              \\\\ref rocsparse_matrix_type_hermitian or \\\\ref rocsparse_matrix_type_triangular.\\n  @param[in]\\n  uplo        \\\\ref rocsparse_fill_mode_lower or \\\\ref rocsparse_fill_mode_upper.\\n  @param[in]\\n  storage     \\\\ref rocsparse_storage_mode_sorted or \\\\ref rocsparse_storage_mode_sorted.\\n  @param[out]\\n  buffer_size number of bytes of the temporary storage buffer required by\\n              rocsparse_scheck_matrix_csc(), rocsparse_dcheck_matrix_csc(),\\n              rocsparse_ccheck_matrix_csc() and rocsparse_zcheck_matrix_csc().\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval rocsparse_status_invalid_value \\\\p idx_base or \\\\p matrix_type or \\\\p uplo or \\\\p storage is invalid.\\n  \\\\retval rocsparse_status_invalid_size \\\\p m \\\\p n or \\\\p nnz is invalid.\\n  \\\\retval rocsparse_status_invalid_pointer \\\\p csc_val, \\\\p csc_col_ptr, \\\\p csc_row_ind or \\\\p buffer_size pointer\\n          is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_scheck_matrix_csc_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        csc_val: *const f32,\n        csc_col_ptr: *const rocsparse_int,\n        csc_row_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcheck_matrix_csc_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        csc_val: *const f64,\n        csc_col_ptr: *const rocsparse_int,\n        csc_row_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccheck_matrix_csc_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        csc_val: *const rocsparse_float_complex,\n        csc_col_ptr: *const rocsparse_int,\n        csc_row_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcheck_matrix_csc_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        csc_val: *const rocsparse_double_complex,\n        csc_col_ptr: *const rocsparse_int,\n        csc_row_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup utility_module\\n  \\\\brief Check matrix to see if it is valid.\\n\\n  \\\\details\\n  \\\\p rocsparse_check_matrix_csc checks if the input CSC matrix is valid.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  m           number of rows of the sparse CSC matrix.\\n  @param[in]\\n  n           number of columns of the sparse CSC matrix.\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse CSC matrix.\\n  @param[in]\\n  csc_val     array of \\\\p nnz elements of the sparse CSC matrix.\\n  @param[in]\\n  csc_col_ptr array of \\\\p m+1 elements that point to the start of every column of the\\n              sparse CSC matrix.\\n  @param[in]\\n  csc_row_ind array of \\\\p nnz elements containing the row indices of the sparse\\n              CSC matrix.\\n  @param[in]\\n  idx_base    \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n  @param[in]\\n  matrix_type \\\\ref rocsparse_matrix_type_general, \\\\ref rocsparse_matrix_type_symmetric,\\n              \\\\ref rocsparse_matrix_type_hermitian or \\\\ref rocsparse_matrix_type_triangular.\\n  @param[in]\\n  uplo        \\\\ref rocsparse_fill_mode_lower or \\\\ref rocsparse_fill_mode_upper.\\n  @param[in]\\n  storage     \\\\ref rocsparse_storage_mode_sorted or \\\\ref rocsparse_storage_mode_sorted.\\n  @param[out]\\n  data_status modified to indicate the status of the data\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user.\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval rocsparse_status_invalid_value \\\\p idx_base or \\\\p matrix_type or \\\\p uplo or \\\\p storage is invalid.\\n  \\\\retval rocsparse_status_invalid_size \\\\p m \\\\p n or \\\\p nnz is invalid.\\n  \\\\retval rocsparse_status_invalid_pointer \\\\p csc_val, \\\\p csc_col_ptr, \\\\p csc_row_ind, \\\\p temp_buffer or \\\\p data_status pointer\\n          is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_scheck_matrix_csc(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        csc_val: *const f32,\n        csc_col_ptr: *const rocsparse_int,\n        csc_row_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        data_status: *mut rocsparse_data_status,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcheck_matrix_csc(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        csc_val: *const f64,\n        csc_col_ptr: *const rocsparse_int,\n        csc_row_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        data_status: *mut rocsparse_data_status,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccheck_matrix_csc(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        csc_val: *const rocsparse_float_complex,\n        csc_col_ptr: *const rocsparse_int,\n        csc_row_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        data_status: *mut rocsparse_data_status,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcheck_matrix_csc(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        csc_val: *const rocsparse_double_complex,\n        csc_col_ptr: *const rocsparse_int,\n        csc_row_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        data_status: *mut rocsparse_data_status,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup utility_module\\n  \\\\brief Check matrix to see if it is valid.\\n\\n  \\\\details\\n  \\\\p rocsparse_check_matrix_csr_buffer_size computes the required buffer size needed when calling \\\\p rocsparse_check_matrix_csr\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  m           number of rows of the sparse CSR matrix.\\n  @param[in]\\n  n           number of columns of the sparse CSR matrix.\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse CSR matrix.\\n  @param[in]\\n  csr_val     array of \\\\p nnz elements of the sparse CSR matrix.\\n  @param[in]\\n  csr_row_ptr array of \\\\p m+1 elements that point to the start of every row of the\\n              sparse CSR matrix.\\n  @param[in]\\n  csr_col_ind array of \\\\p nnz elements containing the column indices of the sparse\\n              CSR matrix.\\n  @param[in]\\n  idx_base    \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n  @param[in]\\n  matrix_type \\\\ref rocsparse_matrix_type_general, \\\\ref rocsparse_matrix_type_symmetric,\\n              \\\\ref rocsparse_matrix_type_hermitian or \\\\ref rocsparse_matrix_type_triangular.\\n  @param[in]\\n  uplo        \\\\ref rocsparse_fill_mode_lower or \\\\ref rocsparse_fill_mode_upper.\\n  @param[in]\\n  storage     \\\\ref rocsparse_storage_mode_sorted or \\\\ref rocsparse_storage_mode_sorted.\\n  @param[out]\\n  buffer_size number of bytes of the temporary storage buffer required by\\n              rocsparse_scheck_matrix_csr(), rocsparse_dcheck_matrix_csr(),\\n              rocsparse_ccheck_matrix_csr() and rocsparse_zcheck_matrix_csr().\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval rocsparse_status_invalid_value \\\\p idx_base or \\\\p matrix_type or \\\\p uplo or \\\\p storage is invalid.\\n  \\\\retval rocsparse_status_invalid_size \\\\p m \\\\p n or \\\\p nnz is invalid.\\n  \\\\retval rocsparse_status_invalid_pointer \\\\p csr_val, \\\\p csr_row_ptr, \\\\p csr_col_ind or \\\\p buffer_size pointer\\n          is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_scheck_matrix_csr_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcheck_matrix_csr_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccheck_matrix_csr_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        csr_val: *const rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcheck_matrix_csr_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        csr_val: *const rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup utility_module\\n  \\\\brief Check matrix to see if it is valid.\\n\\n  \\\\details\\n  \\\\p rocsparse_check_matrix_csr checks if the input CSR matrix is valid.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  m           number of rows of the sparse CSR matrix.\\n  @param[in]\\n  n           number of columns of the sparse CSR matrix.\\n  @param[in]\\n  nnz         number of non-zero entries of the sparse CSR matrix.\\n  @param[in]\\n  csr_val     array of \\\\p nnz elements of the sparse CSR matrix.\\n  @param[in]\\n  csr_row_ptr array of \\\\p m+1 elements that point to the start of every row of the\\n              sparse CSR matrix.\\n  @param[in]\\n  csr_col_ind array of \\\\p nnz elements containing the column indices of the sparse\\n              CSR matrix.\\n  @param[in]\\n  idx_base    \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n  @param[in]\\n  matrix_type \\\\ref rocsparse_matrix_type_general, \\\\ref rocsparse_matrix_type_symmetric,\\n              \\\\ref rocsparse_matrix_type_hermitian or \\\\ref rocsparse_matrix_type_triangular.\\n  @param[in]\\n  uplo        \\\\ref rocsparse_fill_mode_lower or \\\\ref rocsparse_fill_mode_upper.\\n  @param[in]\\n  storage     \\\\ref rocsparse_storage_mode_sorted or \\\\ref rocsparse_storage_mode_sorted.\\n  @param[out]\\n  data_status modified to indicate the status of the data\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user.\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval rocsparse_status_invalid_value \\\\p idx_base or \\\\p matrix_type or \\\\p uplo or \\\\p storage is invalid.\\n  \\\\retval rocsparse_status_invalid_size \\\\p m \\\\p n or \\\\p nnz is invalid.\\n  \\\\retval rocsparse_status_invalid_pointer \\\\p csr_val, \\\\p csr_row_ptr, \\\\p csr_col_ind, \\\\p temp_buffer or \\\\p data_status pointer\\n          is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_scheck_matrix_csr(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        csr_val: *const f32,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        data_status: *mut rocsparse_data_status,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcheck_matrix_csr(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        csr_val: *const f64,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        data_status: *mut rocsparse_data_status,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccheck_matrix_csr(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        csr_val: *const rocsparse_float_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        data_status: *mut rocsparse_data_status,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcheck_matrix_csr(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        nnz: rocsparse_int,\n        csr_val: *const rocsparse_double_complex,\n        csr_row_ptr: *const rocsparse_int,\n        csr_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        data_status: *mut rocsparse_data_status,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup utility_module\\n  \\\\brief Check matrix to see if it is valid.\\n\\n  \\\\details\\n  \\\\p rocsparse_check_matrix_ell_buffer_size computes the required buffer size needed when\\n  calling \\\\p rocsparse_check_matrix_ell\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  m           number of rows of the sparse ELL matrix.\\n  @param[in]\\n  n           number of columns of the sparse ELL matrix.\\n  @param[in]\\n  ell_width   number of non-zero elements per row of the sparse ELL matrix.\\n  @param[in]\\n  ell_val     array that contains the elements of the sparse ELL matrix. Padded\\n              elements should be zero.\\n  @param[in]\\n  ell_col_ind array that contains the column indices of the sparse ELL matrix.\\n              Padded column indices should be -1.\\n  @param[in]\\n  idx_base    \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n  @param[in]\\n  matrix_type \\\\ref rocsparse_matrix_type_general, \\\\ref rocsparse_matrix_type_symmetric,\\n              \\\\ref rocsparse_matrix_type_hermitian or \\\\ref rocsparse_matrix_type_triangular.\\n  @param[in]\\n  uplo        \\\\ref rocsparse_fill_mode_lower or \\\\ref rocsparse_fill_mode_upper.\\n  @param[in]\\n  storage     \\\\ref rocsparse_storage_mode_sorted or \\\\ref rocsparse_storage_mode_sorted.\\n  @param[out]\\n  buffer_size number of bytes of the temporary storage buffer required by\\n              rocsparse_scheck_matrix_ell(), rocsparse_dcheck_matrix_ell(),\\n              rocsparse_ccheck_matrix_ell() and rocsparse_zcheck_matrix_ell().\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval rocsparse_status_invalid_value \\\\p idx_base or \\\\p matrix_type or \\\\p uplo or \\\\p storage is invalid.\\n  \\\\retval rocsparse_status_invalid_size \\\\p m \\\\p n or \\\\p ell_width is invalid.\\n  \\\\retval rocsparse_status_invalid_pointer \\\\p ell_val, \\\\p ell_col_ind or \\\\p buffer_size pointer\\n          is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_scheck_matrix_ell_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        ell_width: rocsparse_int,\n        ell_val: *const f32,\n        ell_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcheck_matrix_ell_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        ell_width: rocsparse_int,\n        ell_val: *const f64,\n        ell_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccheck_matrix_ell_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        ell_width: rocsparse_int,\n        ell_val: *const rocsparse_float_complex,\n        ell_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcheck_matrix_ell_buffer_size(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        ell_width: rocsparse_int,\n        ell_val: *const rocsparse_double_complex,\n        ell_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup utility_module\\n  \\\\brief Check matrix to see if it is valid.\\n\\n  \\\\details\\n  \\\\p rocsparse_check_matrix_ell checks if the input ELL matrix is valid.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  m           number of rows of the sparse ELL matrix.\\n  @param[in]\\n  n           number of columns of the sparse ELL matrix.\\n  @param[in]\\n  ell_width   number of non-zero elements per row of the sparse ELL matrix.\\n  @param[in]\\n  ell_val     array that contains the elements of the sparse ELL matrix. Padded\\n              elements should be zero.\\n  @param[in]\\n  ell_col_ind array that contains the column indices of the sparse ELL matrix.\\n              Padded column indices should be -1.\\n  @param[in]\\n  idx_base    \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n  @param[in]\\n  matrix_type \\\\ref rocsparse_matrix_type_general, \\\\ref rocsparse_matrix_type_symmetric,\\n              \\\\ref rocsparse_matrix_type_hermitian or \\\\ref rocsparse_matrix_type_triangular.\\n  @param[in]\\n  uplo        \\\\ref rocsparse_fill_mode_lower or \\\\ref rocsparse_fill_mode_upper.\\n  @param[in]\\n  storage     \\\\ref rocsparse_storage_mode_sorted or \\\\ref rocsparse_storage_mode_sorted.\\n  @param[out]\\n  data_status modified to indicate the status of the data\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user.\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval rocsparse_status_invalid_value \\\\p idx_base or \\\\p matrix_type or \\\\p uplo or \\\\p storage is invalid.\\n  \\\\retval rocsparse_status_invalid_size \\\\p m \\\\p n or \\\\p ell_width is invalid.\\n  \\\\retval rocsparse_status_invalid_pointer \\\\p ell_val, \\\\p ell_col_ind, \\\\p temp_buffer or \\\\p data_status pointer\\n          is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_scheck_matrix_ell(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        ell_width: rocsparse_int,\n        ell_val: *const f32,\n        ell_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        data_status: *mut rocsparse_data_status,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcheck_matrix_ell(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        ell_width: rocsparse_int,\n        ell_val: *const f64,\n        ell_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        data_status: *mut rocsparse_data_status,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccheck_matrix_ell(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        ell_width: rocsparse_int,\n        ell_val: *const rocsparse_float_complex,\n        ell_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        data_status: *mut rocsparse_data_status,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcheck_matrix_ell(\n        handle: rocsparse_handle,\n        m: rocsparse_int,\n        n: rocsparse_int,\n        ell_width: rocsparse_int,\n        ell_val: *const rocsparse_double_complex,\n        ell_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        data_status: *mut rocsparse_data_status,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup utility_module\\n  \\\\brief Check matrix to see if it is valid.\\n\\n  \\\\details\\n  \\\\p rocsparse_check_matrix_gebsc_buffer_size computes the required buffer size needed when\\n  calling \\\\p rocsparse_check_matrix_gebsc\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  dir          matrix storage of GEBSC blocks.\\n  @param[in]\\n  mb           number of block rows of the sparse GEBSC matrix.\\n  @param[in]\\n  nb           number of block columns of the sparse GEBSC matrix.\\n  @param[in]\\n  nnzb         number of non-zero blocks of the sparse GEBSC matrix.\\n  @param[in]\\n  row_block_dim row block dimension of the sparse GEBSC matrix.\\n  @param[in]\\n  col_block_dim column block dimension of the sparse GEBSC matrix.\\n  @param[in]\\n  bsc_val     array of \\\\p nnzb elements of the sparse GEBSC matrix.\\n  @param[in]\\n  bsc_col_ptr array of \\\\p nb+1 elements that point to the start of every column of the\\n              sparse GEBSC matrix.\\n  @param[in]\\n  bsc_row_ind array of \\\\p nnzb elements containing the row indices of the sparse\\n              GEBSC matrix.\\n  @param[in]\\n  idx_base    \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n  @param[in]\\n  matrix_type \\\\ref rocsparse_matrix_type_general, \\\\ref rocsparse_matrix_type_symmetric,\\n              \\\\ref rocsparse_matrix_type_hermitian or \\\\ref rocsparse_matrix_type_triangular.\\n  @param[in]\\n  uplo        \\\\ref rocsparse_fill_mode_lower or \\\\ref rocsparse_fill_mode_upper.\\n  @param[in]\\n  storage     \\\\ref rocsparse_storage_mode_sorted or \\\\ref rocsparse_storage_mode_sorted.\\n  @param[out]\\n  buffer_size number of bytes of the temporary storage buffer required by\\n              rocsparse_scheck_matrix_gebsc(), rocsparse_dcheck_matrix_gebsc(),\\n              rocsparse_ccheck_matrix_gebsc() and rocsparse_zcheck_matrix_gebsc().\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval rocsparse_status_invalid_value \\\\p dir or \\\\p idx_base or \\\\p matrix_type or \\\\p uplo or \\\\p storage is invalid.\\n  \\\\retval rocsparse_status_invalid_size \\\\p mb \\\\p nb \\\\p nnzb \\\\p row_block_dim or \\\\p col_block_dim is invalid.\\n  \\\\retval rocsparse_status_invalid_pointer \\\\p bsc_val, \\\\p bsc_col_ptr, \\\\p bsc_row_ind or \\\\p buffer_size pointer\\n          is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_scheck_matrix_gebsc_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        bsc_val: *const f32,\n        bsc_col_ptr: *const rocsparse_int,\n        bsc_row_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcheck_matrix_gebsc_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        bsc_val: *const f64,\n        bsc_col_ptr: *const rocsparse_int,\n        bsc_row_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccheck_matrix_gebsc_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        bsc_val: *const rocsparse_float_complex,\n        bsc_col_ptr: *const rocsparse_int,\n        bsc_row_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcheck_matrix_gebsc_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        bsc_val: *const rocsparse_double_complex,\n        bsc_col_ptr: *const rocsparse_int,\n        bsc_row_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup utility_module\\n  \\\\brief Check matrix to see if it is valid.\\n\\n  \\\\details\\n  \\\\p rocsparse_check_matrix_gebsc checks if the input GEBSC matrix is valid.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  dir          matrix storage of GEBSC blocks.\\n  @param[in]\\n  mb           number of block rows of the sparse GEBSC matrix.\\n  @param[in]\\n  nb           number of block columns of the sparse GEBSC matrix.\\n  @param[in]\\n  nnzb         number of non-zero blocks of the sparse GEBSC matrix.\\n  @param[in]\\n  row_block_dim row block dimension of the sparse GEBSC matrix.\\n  @param[in]\\n  col_block_dim column block dimension of the sparse GEBSC matrix.\\n  @param[in]\\n  bsc_val     array of \\\\p nnzb elements of the sparse GEBSC matrix.\\n  @param[in]\\n  bsc_col_ptr array of \\\\p nb+1 elements that point to the start of every column of the\\n              sparse GEBSC matrix.\\n  @param[in]\\n  bsc_row_ind array of \\\\p nnzb elements containing the row indices of the sparse\\n              GEBSC matrix.\\n  @param[in]\\n  idx_base    \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n  @param[in]\\n  matrix_type \\\\ref rocsparse_matrix_type_general, \\\\ref rocsparse_matrix_type_symmetric,\\n              \\\\ref rocsparse_matrix_type_hermitian or \\\\ref rocsparse_matrix_type_triangular.\\n  @param[in]\\n  uplo        \\\\ref rocsparse_fill_mode_lower or \\\\ref rocsparse_fill_mode_upper.\\n  @param[in]\\n  storage     \\\\ref rocsparse_storage_mode_sorted or \\\\ref rocsparse_storage_mode_sorted.\\n  @param[out]\\n  data_status modified to indicate the status of the data\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user.\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval rocsparse_status_invalid_value \\\\p dir or \\\\p idx_base or \\\\p matrix_type or \\\\p uplo or \\\\p storage is invalid.\\n  \\\\retval rocsparse_status_invalid_size \\\\p mb \\\\p nb \\\\p nnzb \\\\p row_block_dim or \\\\p col_block_dim is invalid.\\n  \\\\retval rocsparse_status_invalid_pointer \\\\p bsc_val, \\\\p bsc_col_ptr, \\\\p bsc_row_ind, \\\\p temp_buffer or \\\\p data_status pointer\\n          is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_scheck_matrix_gebsc(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        bsc_val: *const f32,\n        bsc_col_ptr: *const rocsparse_int,\n        bsc_row_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        data_status: *mut rocsparse_data_status,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcheck_matrix_gebsc(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        bsc_val: *const f64,\n        bsc_col_ptr: *const rocsparse_int,\n        bsc_row_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        data_status: *mut rocsparse_data_status,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccheck_matrix_gebsc(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        bsc_val: *const rocsparse_float_complex,\n        bsc_col_ptr: *const rocsparse_int,\n        bsc_row_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        data_status: *mut rocsparse_data_status,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcheck_matrix_gebsc(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        bsc_val: *const rocsparse_double_complex,\n        bsc_col_ptr: *const rocsparse_int,\n        bsc_row_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        data_status: *mut rocsparse_data_status,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup utility_module\\n  \\\\brief Check matrix to see if it is valid.\\n\\n  \\\\details\\n  \\\\p rocsparse_check_matrix_gebsr_buffer_size computes the required buffer size needed when\\n  calling \\\\p rocsparse_check_matrix_gebsr\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  dir          matrix storage of GEBSR blocks.\\n  @param[in]\\n  mb           number of block rows of the sparse GEBSR matrix.\\n  @param[in]\\n  nb           number of block columns of the sparse GEBSR matrix.\\n  @param[in]\\n  nnzb         number of non-zero blocks of the sparse GEBSR matrix.\\n  @param[in]\\n  row_block_dim row block dimension of the sparse GEBSR matrix.\\n  @param[in]\\n  col_block_dim column block dimension of the sparse GEBSR matrix.\\n  @param[in]\\n  bsr_val     array of \\\\p nnzb elements of the sparse GEBSR matrix.\\n  @param[in]\\n  bsr_row_ptr array of \\\\p mb+1 elements that point to the start of every row of the\\n              sparse GEBSR matrix.\\n  @param[in]\\n  bsr_col_ind array of \\\\p nnzb elements containing the column indices of the sparse\\n              GEBSR matrix.\\n  @param[in]\\n  idx_base    \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n  @param[in]\\n  matrix_type \\\\ref rocsparse_matrix_type_general, \\\\ref rocsparse_matrix_type_symmetric,\\n              \\\\ref rocsparse_matrix_type_hermitian or \\\\ref rocsparse_matrix_type_triangular.\\n  @param[in]\\n  uplo        \\\\ref rocsparse_fill_mode_lower or \\\\ref rocsparse_fill_mode_upper.\\n  @param[in]\\n  storage     \\\\ref rocsparse_storage_mode_sorted or \\\\ref rocsparse_storage_mode_sorted.\\n  @param[out]\\n  buffer_size number of bytes of the temporary storage buffer required by\\n              rocsparse_scheck_matrix_gebsr(), rocsparse_dcheck_matrix_gebsr(),\\n              rocsparse_ccheck_matrix_gebsr() and rocsparse_zcheck_matrix_gebsr().\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval rocsparse_status_invalid_value \\\\p dir or \\\\p idx_base or \\\\p matrix_type or \\\\p uplo or \\\\p storage is invalid.\\n  \\\\retval rocsparse_status_invalid_size \\\\p mb \\\\p nb \\\\p nnzb \\\\p row_block_dim or \\\\p col_block_dim is invalid.\\n  \\\\retval rocsparse_status_invalid_pointer \\\\p bsr_val, \\\\p bsr_row_ptr, \\\\p bsr_col_ind or \\\\p buffer_size pointer\\n          is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_scheck_matrix_gebsr_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        bsr_val: *const f32,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcheck_matrix_gebsr_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        bsr_val: *const f64,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccheck_matrix_gebsr_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        bsr_val: *const rocsparse_float_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcheck_matrix_gebsr_buffer_size(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        bsr_val: *const rocsparse_double_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    #[doc = \" \\\\ingroup utility_module\\n  \\\\brief Check matrix to see if it is valid.\\n\\n  \\\\details\\n  \\\\p rocsparse_check_matrix_gebsr checks if the input GEBSR matrix is valid.\\n\\n  \\\\note\\n  This routine does not support execution in a hipGraph context.\\n\\n  @param[in]\\n  handle      handle to the rocsparse library context queue.\\n  @param[in]\\n  dir          matrix storage of GEBSR blocks.\\n  @param[in]\\n  mb           number of block rows of the sparse GEBSR matrix.\\n  @param[in]\\n  nb           number of block columns of the sparse GEBSR matrix.\\n  @param[in]\\n  nnzb         number of non-zero blocks of the sparse GEBSR matrix.\\n  @param[in]\\n  row_block_dim row block dimension of the sparse GEBSR matrix.\\n  @param[in]\\n  col_block_dim column block dimension of the sparse GEBSR matrix.\\n  @param[in]\\n  bsr_val     array of \\\\p nnzb elements of the sparse GEBSR matrix.\\n  @param[in]\\n  bsr_row_ptr array of \\\\p mb+1 elements that point to the start of every row of the\\n              sparse GEBSR matrix.\\n  @param[in]\\n  bsr_col_ind array of \\\\p nnzb elements containing the column indices of the sparse\\n              GEBSR matrix.\\n  @param[in]\\n  idx_base    \\\\ref rocsparse_index_base_zero or \\\\ref rocsparse_index_base_one.\\n  @param[in]\\n  matrix_type \\\\ref rocsparse_matrix_type_general, \\\\ref rocsparse_matrix_type_symmetric,\\n              \\\\ref rocsparse_matrix_type_hermitian or \\\\ref rocsparse_matrix_type_triangular.\\n  @param[in]\\n  uplo        \\\\ref rocsparse_fill_mode_lower or \\\\ref rocsparse_fill_mode_upper.\\n  @param[in]\\n  storage     \\\\ref rocsparse_storage_mode_sorted or \\\\ref rocsparse_storage_mode_sorted.\\n  @param[out]\\n  data_status modified to indicate the status of the data\\n  @param[in]\\n  temp_buffer temporary storage buffer allocated by the user.\\n\\n  \\\\retval rocsparse_status_success the operation completed successfully.\\n  \\\\retval rocsparse_status_invalid_handle the library context was not initialized.\\n  \\\\retval rocsparse_status_invalid_value \\\\p dir or \\\\p idx_base or \\\\p matrix_type or \\\\p uplo or \\\\p storage is invalid.\\n  \\\\retval rocsparse_status_invalid_size \\\\p mb \\\\p nb \\\\p nnzb \\\\p row_block_dim or \\\\p col_block_dim is invalid.\\n  \\\\retval rocsparse_status_invalid_pointer \\\\p bsr_val, \\\\p bsr_row_ptr, \\\\p bsr_col_ind, \\\\p temp_buffer or \\\\p data_status pointer\\n          is invalid.\\n/\\n/**@{\"]\n    pub fn rocsparse_scheck_matrix_gebsr(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        bsr_val: *const f32,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        data_status: *mut rocsparse_data_status,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_dcheck_matrix_gebsr(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        bsr_val: *const f64,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        data_status: *mut rocsparse_data_status,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_ccheck_matrix_gebsr(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        bsr_val: *const rocsparse_float_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        data_status: *mut rocsparse_data_status,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    pub fn rocsparse_zcheck_matrix_gebsr(\n        handle: rocsparse_handle,\n        dir: rocsparse_direction,\n        mb: rocsparse_int,\n        nb: rocsparse_int,\n        nnzb: rocsparse_int,\n        row_block_dim: rocsparse_int,\n        col_block_dim: rocsparse_int,\n        bsr_val: *const rocsparse_double_complex,\n        bsr_row_ptr: *const rocsparse_int,\n        bsr_col_ind: *const rocsparse_int,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        data_status: *mut rocsparse_data_status,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup utility_module\n  \\brief Check matrix to see if it is valid.\n\n  \\details\n  \\p rocsparse_check_matrix_hyb_buffer_size computes the required buffer size needed when\n  calling \\p rocsparse_check_matrix_hyb\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[in]\n  hyb         matrix in HYB storage format.\n  @param[in]\n  idx_base    \\ref rocsparse_index_base_zero or \\ref rocsparse_index_base_one.\n  @param[in]\n  matrix_type \\ref rocsparse_matrix_type_general, \\ref rocsparse_matrix_type_symmetric,\n              \\ref rocsparse_matrix_type_hermitian or \\ref rocsparse_matrix_type_triangular.\n  @param[in]\n  uplo        \\ref rocsparse_fill_mode_lower or \\ref rocsparse_fill_mode_upper.\n  @param[in]\n  storage     \\ref rocsparse_storage_mode_sorted or \\ref rocsparse_storage_mode_sorted.\n  @param[out]\n  buffer_size number of bytes of the temporary storage buffer required by\n              rocsparse_check_matrix_hyb().\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval rocsparse_status_invalid_value \\p idx_base or \\p matrix_type or \\p uplo or \\p storage is invalid.\n  \\retval rocsparse_status_invalid_pointer \\p hyb or \\p buffer_size pointer is invalid.*/\n    pub fn rocsparse_check_matrix_hyb_buffer_size(\n        handle: rocsparse_handle,\n        hyb: rocsparse_hyb_mat,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        buffer_size: *mut usize,\n    ) -> rocsparse_status;\n}\n#[cfg(not(windows))]\nextern \"C\" {\n    #[must_use]\n    /** \\ingroup utility_module\n  \\brief Check matrix to see if it is valid.\n\n  \\details\n  \\p rocsparse_check_matrix_hyb checks if the input HYB matrix is valid.\n\n  \\note\n  This routine does not support execution in a hipGraph context.\n\n  @param[in]\n  handle      handle to the rocsparse library context queue.\n  @param[in]\n  hyb         matrix in HYB storage format.\n  @param[in]\n  idx_base    \\ref rocsparse_index_base_zero or \\ref rocsparse_index_base_one.\n  @param[in]\n  matrix_type \\ref rocsparse_matrix_type_general, \\ref rocsparse_matrix_type_symmetric,\n              \\ref rocsparse_matrix_type_hermitian or \\ref rocsparse_matrix_type_triangular.\n  @param[in]\n  uplo        \\ref rocsparse_fill_mode_lower or \\ref rocsparse_fill_mode_upper.\n  @param[in]\n  storage     \\ref rocsparse_storage_mode_sorted or \\ref rocsparse_storage_mode_sorted.\n  @param[out]\n  data_status modified to indicate the status of the data\n  @param[in]\n  temp_buffer temporary storage buffer allocated by the user.\n\n  \\retval rocsparse_status_success the operation completed successfully.\n  \\retval rocsparse_status_invalid_handle the library context was not initialized.\n  \\retval rocsparse_status_invalid_value \\p idx_base or \\p matrix_type or \\p uplo or \\p storage is invalid.\n  \\retval rocsparse_status_invalid_pointer \\p hyb or \\p data_status pointer is invalid.*/\n    pub fn rocsparse_check_matrix_hyb(\n        handle: rocsparse_handle,\n        hyb: rocsparse_hyb_mat,\n        idx_base: rocsparse_index_base,\n        matrix_type: rocsparse_matrix_type,\n        uplo: rocsparse_fill_mode,\n        storage: rocsparse_storage_mode,\n        data_status: *mut rocsparse_data_status,\n        temp_buffer: *mut ::core::ffi::c_void,\n    ) -> rocsparse_status;\n}\nimpl rocsparse_error {\n    pub const r#invalid_handle: rocsparse_error = rocsparse_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(1)\n    });\n    pub const r#not_implemented: rocsparse_error = rocsparse_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(2)\n    });\n    pub const r#invalid_pointer: rocsparse_error = rocsparse_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(3)\n    });\n    pub const r#invalid_size: rocsparse_error = rocsparse_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(4)\n    });\n    pub const r#memory_error: rocsparse_error = rocsparse_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(5)\n    });\n    pub const r#internal_error: rocsparse_error = rocsparse_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(6)\n    });\n    pub const r#invalid_value: rocsparse_error = rocsparse_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(7)\n    });\n    pub const r#arch_mismatch: rocsparse_error = rocsparse_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(8)\n    });\n    pub const r#zero_pivot: rocsparse_error = rocsparse_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(9)\n    });\n    pub const r#not_initialized: rocsparse_error = rocsparse_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(10)\n    });\n    pub const r#type_mismatch: rocsparse_error = rocsparse_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(11)\n    });\n    pub const r#requires_sorted_storage: rocsparse_error = rocsparse_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(12)\n    });\n    pub const r#thrown_exception: rocsparse_error = rocsparse_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(13)\n    });\n    pub const r#continue: rocsparse_error = rocsparse_error(unsafe {\n        ::core::num::NonZeroU32::new_unchecked(14)\n    });\n}\n#[repr(transparent)]\n#[derive(Debug, Hash, Copy, Clone, PartialEq, Eq)]\npub struct rocsparse_error(pub ::core::num::NonZeroU32);\npub trait rocsparse_statusConsts {\n    const success: rocsparse_status = rocsparse_status::Ok(());\n    const error_invalid_handle: rocsparse_status = rocsparse_status::Err(\n        rocsparse_error::r#invalid_handle,\n    );\n    const error_not_implemented: rocsparse_status = rocsparse_status::Err(\n        rocsparse_error::r#not_implemented,\n    );\n    const error_invalid_pointer: rocsparse_status = rocsparse_status::Err(\n        rocsparse_error::r#invalid_pointer,\n    );\n    const error_invalid_size: rocsparse_status = rocsparse_status::Err(\n        rocsparse_error::r#invalid_size,\n    );\n    const error_memory_error: rocsparse_status = rocsparse_status::Err(\n        rocsparse_error::r#memory_error,\n    );\n    const error_internal_error: rocsparse_status = rocsparse_status::Err(\n        rocsparse_error::r#internal_error,\n    );\n    const error_invalid_value: rocsparse_status = rocsparse_status::Err(\n        rocsparse_error::r#invalid_value,\n    );\n    const error_arch_mismatch: rocsparse_status = rocsparse_status::Err(\n        rocsparse_error::r#arch_mismatch,\n    );\n    const error_zero_pivot: rocsparse_status = rocsparse_status::Err(\n        rocsparse_error::r#zero_pivot,\n    );\n    const error_not_initialized: rocsparse_status = rocsparse_status::Err(\n        rocsparse_error::r#not_initialized,\n    );\n    const error_type_mismatch: rocsparse_status = rocsparse_status::Err(\n        rocsparse_error::r#type_mismatch,\n    );\n    const error_requires_sorted_storage: rocsparse_status = rocsparse_status::Err(\n        rocsparse_error::r#requires_sorted_storage,\n    );\n    const error_thrown_exception: rocsparse_status = rocsparse_status::Err(\n        rocsparse_error::r#thrown_exception,\n    );\n    const error_continue: rocsparse_status = rocsparse_status::Err(\n        rocsparse_error::r#continue,\n    );\n}\nimpl rocsparse_statusConsts for rocsparse_status {}\n#[must_use]\npub type rocsparse_status = ::core::result::Result<(), rocsparse_error>;\nconst _: fn() = || {\n    let _ = std::mem::transmute::<rocsparse_status, u32>;\n};\nunsafe impl Send for rocsparse_handle {}\nunsafe impl Sync for rocsparse_handle {}\n"
  },
  {
    "path": "format/.rustfmt.toml",
    "content": "disable_all_formatting = true\n"
  },
  {
    "path": "format/Cargo.toml",
    "content": "[package]\nname = \"format\"\nversion = \"0.0.0\"\nedition = \"2021\"\n\n[dependencies]\ncuda_types = { path = \"../cuda_types\" }\nuuid = \"1.16\"\n"
  },
  {
    "path": "format/src/dark_api.rs",
    "content": "use crate::CudaDisplay;\nuse cuda_types::dark_api::*;\n\nimpl CudaDisplay for FatbincWrapper {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(b\"{ magic: \")?;\n        CudaDisplay::write(&self.magic, \"\", 0, writer)?;\n        writer.write_all(b\", version: \")?;\n        CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(b\", data: \")?;\n        CudaDisplay::write(&self.data, \"\", 0, writer)?;\n        writer.write_all(b\", filename_or_fatbins: \")?;\n        CudaDisplay::write(&self.filename_or_fatbins, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\n\nimpl CudaDisplay for FatbinHeader {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(b\"{ magic: \")?;\n        CudaDisplay::write(&self.magic, \"\", 0, writer)?;\n        writer.write_all(b\", version: \")?;\n        CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(b\", header_size: \")?;\n        CudaDisplay::write(&self.header_size, \"\", 0, writer)?;\n        writer.write_all(b\", files_size: \")?;\n        CudaDisplay::write(&self.files_size, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\n"
  },
  {
    "path": "format/src/dnn8.rs",
    "content": "#[path = \"format_generated_dnn8.rs\"]\nmod format_generated_dnn8;\npub use format_generated_dnn8::*;\n\npub use crate::dnn9::write_cudnnBackendSetAttribute;\npub use crate::dnn9::write_cudnnBackendGetAttribute;\npub use crate::dnn9::write_cudnnSetTensorNdDescriptor;\npub use crate::dnn9::write_cudnnSetFilterNdDescriptor;\npub use crate::dnn9::write_cudnnSetConvolutionNdDescriptor;"
  },
  {
    "path": "format/src/dnn9.rs",
    "content": "use std::{ffi::c_void, slice};\n\n#[path = \"format_generated_dnn9.rs\"]\nmod format_generated_dnn9;\npub use format_generated_dnn9::*;\n\n#[allow(non_snake_case)]\npub fn write_cudnnBackendGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    descriptor: cuda_types::cudnn9::cudnnBackendDescriptor_t,\n    attributeName: cuda_types::cudnn9::cudnnBackendAttributeName_t,\n    attributeType: cuda_types::cudnn9::cudnnBackendAttributeType_t,\n    requestedElementCount: i64,\n    elementCount: *mut i64,\n    arrayOfElements: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(descriptor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descriptor, \"cudnnBackendGetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attributeName), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attributeName, \"cudnnBackendGetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attributeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attributeType, \"cudnnBackendGetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(requestedElementCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &requestedElementCount,\n        \"cudnnBackendGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(elementCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&elementCount, \"cudnnBackendGetAttribute\", arg_idx, writer)?;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(arrayOfElements), \": \").as_bytes())?;\n    cudnn9_print_elements(\n        writer,\n        attributeType,\n        unsafe { elementCount.as_ref() }\n            .copied()\n            .unwrap_or(requestedElementCount),\n        arrayOfElements,\n    )?;\n    writer.write_all(b\")\")\n}\n\npub fn cudnn9_print_elements(\n    writer: &mut (impl std::io::Write + ?Sized),\n    type_: cuda_types::cudnn9::cudnnBackendAttributeType_t,\n    element_count: i64,\n    array_of_elements: *const ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    fn print_typed<T: crate::CudaDisplay>(\n        writer: &mut (impl std::io::Write + ?Sized),\n        element_count: i64,\n        array_of_elements: *const ::core::ffi::c_void,\n    ) -> std::io::Result<()> {\n        if array_of_elements.is_null() {\n            return writer.write_all(b\"NULL\");\n        }\n        let elements =\n            unsafe { slice::from_raw_parts(array_of_elements as *const T, element_count as usize) };\n        crate::CudaDisplay::write(elements, \"\", 0, writer)\n    }\n    match type_ {\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_HANDLE => {\n            print_typed::<cuda_types::cudnn9::cudnnHandle_t>(\n                writer,\n                element_count,\n                array_of_elements,\n            )\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_DATA_TYPE => {\n            print_typed::<cuda_types::cudnn9::cudnnDataType_t>(\n                writer,\n                element_count,\n                array_of_elements,\n            )\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_BOOLEAN => {\n            print_typed::<bool>(writer, element_count, array_of_elements)\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_INT64 => {\n            print_typed::<i64>(writer, element_count, array_of_elements)\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_FLOAT => {\n            print_typed::<f32>(writer, element_count, array_of_elements)\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_DOUBLE => {\n            print_typed::<f64>(writer, element_count, array_of_elements)\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_VOID_PTR => {\n            print_typed::<*const c_void>(writer, element_count, array_of_elements)\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_CONVOLUTION_MODE => {\n            print_typed::<cuda_types::cudnn9::cudnnConvolutionMode_t>(\n                writer,\n                element_count,\n                array_of_elements,\n            )\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_HEUR_MODE => {\n            print_typed::<cuda_types::cudnn9::cudnnBackendHeurMode_t>(\n                writer,\n                element_count,\n                array_of_elements,\n            )\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_KNOB_TYPE => {\n            print_typed::<cuda_types::cudnn9::cudnnBackendKnobType_t>(\n                writer,\n                element_count,\n                array_of_elements,\n            )\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_NAN_PROPOGATION => {\n            print_typed::<cuda_types::cudnn9::cudnnNanPropagation_t>(\n                writer,\n                element_count,\n                array_of_elements,\n            )\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_NUMERICAL_NOTE => {\n            print_typed::<cuda_types::cudnn9::cudnnBackendNumericalNote_t>(\n                writer,\n                element_count,\n                array_of_elements,\n            )\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_LAYOUT_TYPE => {\n            print_typed::<cuda_types::cudnn9::cudnnBackendLayoutType_t>(\n                writer,\n                element_count,\n                array_of_elements,\n            )\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_ATTRIB_NAME => {\n            print_typed::<cuda_types::cudnn9::cudnnBackendAttributeName_t>(\n                writer,\n                element_count,\n                array_of_elements,\n            )\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_POINTWISE_MODE => {\n            print_typed::<cuda_types::cudnn9::cudnnPointwiseMode_t>(\n                writer,\n                element_count,\n                array_of_elements,\n            )\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_BACKEND_DESCRIPTOR => {\n            print_typed::<cuda_types::cudnn9::cudnnBackendDescriptor_t>(\n                writer,\n                element_count,\n                array_of_elements,\n            )\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_GENSTATS_MODE => {\n            print_typed::<cuda_types::cudnn9::cudnnGenStatsMode_t>(\n                writer,\n                element_count,\n                array_of_elements,\n            )\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_BN_FINALIZE_STATS_MODE => {\n            print_typed::<cuda_types::cudnn9::cudnnBnFinalizeStatsMode_t>(\n                writer,\n                element_count,\n                array_of_elements,\n            )\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_REDUCTION_OPERATOR_TYPE => {\n            print_typed::<cuda_types::cudnn9::cudnnReduceTensorOp_t>(\n                writer,\n                element_count,\n                array_of_elements,\n            )\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_BEHAVIOR_NOTE => {\n            print_typed::<cuda_types::cudnn9::cudnnBackendBehaviorNote_t>(\n                writer,\n                element_count,\n                array_of_elements,\n            )\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_TENSOR_REORDERING_MODE => {\n            print_typed::<cuda_types::cudnn9::cudnnBackendTensorReordering_t>(\n                writer,\n                element_count,\n                array_of_elements,\n            )\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_RESAMPLE_MODE => {\n            print_typed::<cuda_types::cudnn9::cudnnResampleMode_t>(\n                writer,\n                element_count,\n                array_of_elements,\n            )\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_PADDING_MODE => {\n            print_typed::<cuda_types::cudnn9::cudnnPaddingMode_t>(\n                writer,\n                element_count,\n                array_of_elements,\n            )\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_INT32 => {\n            print_typed::<i32>(writer, element_count, array_of_elements)\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_CHAR => {\n            crate::CudaDisplay::write(&array_of_elements.cast::<i8>(), \"\", 0, writer)\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_SIGNAL_MODE => {\n            print_typed::<cuda_types::cudnn9::cudnnSignalMode_t>(\n                writer,\n                element_count,\n                array_of_elements,\n            )\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_FRACTION => {\n            print_typed::<cuda_types::cudnn9::cudnnFraction_t>(\n                writer,\n                element_count,\n                array_of_elements,\n            )\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_NORM_MODE => {\n            print_typed::<cuda_types::cudnn9::cudnnBackendNormMode_t>(\n                writer,\n                element_count,\n                array_of_elements,\n            )\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_NORM_FWD_PHASE => {\n            print_typed::<cuda_types::cudnn9::cudnnBackendNormFwdPhase_t>(\n                writer,\n                element_count,\n                array_of_elements,\n            )\n        }\n        cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_RNG_DISTRIBUTION => {\n            print_typed::<cuda_types::cudnn9::cudnnRngDistribution_t>(\n                writer,\n                element_count,\n                array_of_elements,\n            )\n        }\n        _ => unimplemented!(),\n    }\n}\n\n#[allow(non_snake_case)]\npub fn write_cudnnBackendSetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    descriptor: cuda_types::cudnn9::cudnnBackendDescriptor_t,\n    attributeName: cuda_types::cudnn9::cudnnBackendAttributeName_t,\n    attributeType: cuda_types::cudnn9::cudnnBackendAttributeType_t,\n    elementCount: i64,\n    arrayOfElements: *const ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(descriptor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descriptor, \"cudnnBackendSetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attributeName), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attributeName, \"cudnnBackendSetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attributeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attributeType, \"cudnnBackendSetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(elementCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&elementCount, \"cudnnBackendSetAttribute\", arg_idx, writer)?;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(arrayOfElements), \": \").as_bytes())?;\n    cudnn9_print_elements(writer, attributeType, elementCount, arrayOfElements)?;\n    writer.write_all(b\")\")\n}\n\n#[allow(non_snake_case)]\npub fn write_cudnnSetTensorNdDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    tensorDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dataType: cuda_types::cudnn8::cudnnDataType_t,\n    nbDims: ::core::ffi::c_int,\n    dimA: *const ::core::ffi::c_int,\n    strideA: *const ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(tensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &tensorDesc,\n        \"cudnnSetTensorNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnSetTensorNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDims), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nbDims, \"cudnnSetTensorNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(unsafe { std::slice::from_raw_parts(dimA, nbDims as usize) }, \"cudnnSetTensorNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(unsafe { std::slice::from_raw_parts(strideA, nbDims as usize) }, \"cudnnSetTensorNdDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\n\n#[allow(non_snake_case)]\npub fn write_cudnnSetFilterNdDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    filterDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    dataType: cuda_types::cudnn9::cudnnDataType_t,\n    format: cuda_types::cudnn9::cudnnTensorFormat_t,\n    nbDims: ::core::ffi::c_int,\n    filterDimA: *const ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(filterDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDesc,\n        \"cudnnSetFilterNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnSetFilterNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(format), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&format, \"cudnnSetFilterNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDims), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nbDims, \"cudnnSetFilterNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(filterDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        unsafe { std::slice::from_raw_parts(filterDimA, nbDims as usize) },\n        \"cudnnSetFilterNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\n\n#[allow(non_snake_case)]\npub fn write_cudnnSetConvolutionNdDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    arrayLength: ::core::ffi::c_int,\n    padA: *const ::core::ffi::c_int,\n    filterStrideA: *const ::core::ffi::c_int,\n    dilationA: *const ::core::ffi::c_int,\n    mode: cuda_types::cudnn9::cudnnConvolutionMode_t,\n    computeType: cuda_types::cudnn9::cudnnDataType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnSetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(arrayLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &arrayLength,\n        \"cudnnSetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(padA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        unsafe { std::slice::from_raw_parts(padA, arrayLength as usize) },\n        \"cudnnSetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(filterStrideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        unsafe { std::slice::from_raw_parts(filterStrideA, arrayLength as usize) },\n        \"cudnnSetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dilationA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        unsafe { std::slice::from_raw_parts(dilationA, arrayLength as usize) },\n        \"cudnnSetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnSetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &computeType,\n        \"cudnnSetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\n"
  },
  {
    "path": "format/src/format_generated.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\nimpl crate::CudaDisplay for cuda_types::cuda::CUdeviceptr_v2 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(writer, \"{:p}\", self.0)\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUcontext {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(writer, \"{:p}\", self.0)\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmodule {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(writer, \"{:p}\", self.0)\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUfunction {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(writer, \"{:p}\", self.0)\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUlibrary {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(writer, \"{:p}\", self.0)\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUkernel {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUarray {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmipmappedArray {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUtexref {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUsurfref {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUevent {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUstream {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(writer, \"{:p}\", self.0)\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUgraphicsResource {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUexternalMemory {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUexternalSemaphore {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUgraph {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUgraphNode {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUgraphExec {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmemoryPool {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUuserObject {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUgraphDeviceNode {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUasyncCallbackHandle {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUgreenCtx {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmemFabricHandle_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(data), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.data, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUipcMem_flags_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUipcMem_flags_enum::CU_IPC_MEM_LAZY_ENABLE_PEER_ACCESS => {\n                writer\n                    .write_all(stringify!(CU_IPC_MEM_LAZY_ENABLE_PEER_ACCESS).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmemAttach_flags_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUmemAttach_flags_enum::CU_MEM_ATTACH_GLOBAL => {\n                writer.write_all(stringify!(CU_MEM_ATTACH_GLOBAL).as_bytes())\n            }\n            &cuda_types::cuda::CUmemAttach_flags_enum::CU_MEM_ATTACH_HOST => {\n                writer.write_all(stringify!(CU_MEM_ATTACH_HOST).as_bytes())\n            }\n            &cuda_types::cuda::CUmemAttach_flags_enum::CU_MEM_ATTACH_SINGLE => {\n                writer.write_all(stringify!(CU_MEM_ATTACH_SINGLE).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUctx_flags_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUctx_flags_enum::CU_CTX_SCHED_AUTO => {\n                writer.write_all(stringify!(CU_CTX_SCHED_AUTO).as_bytes())\n            }\n            &cuda_types::cuda::CUctx_flags_enum::CU_CTX_SCHED_SPIN => {\n                writer.write_all(stringify!(CU_CTX_SCHED_SPIN).as_bytes())\n            }\n            &cuda_types::cuda::CUctx_flags_enum::CU_CTX_SCHED_YIELD => {\n                writer.write_all(stringify!(CU_CTX_SCHED_YIELD).as_bytes())\n            }\n            &cuda_types::cuda::CUctx_flags_enum::CU_CTX_SCHED_BLOCKING_SYNC => {\n                writer.write_all(stringify!(CU_CTX_SCHED_BLOCKING_SYNC).as_bytes())\n            }\n            &cuda_types::cuda::CUctx_flags_enum::CU_CTX_BLOCKING_SYNC => {\n                writer.write_all(stringify!(CU_CTX_BLOCKING_SYNC).as_bytes())\n            }\n            &cuda_types::cuda::CUctx_flags_enum::CU_CTX_SCHED_MASK => {\n                writer.write_all(stringify!(CU_CTX_SCHED_MASK).as_bytes())\n            }\n            &cuda_types::cuda::CUctx_flags_enum::CU_CTX_MAP_HOST => {\n                writer.write_all(stringify!(CU_CTX_MAP_HOST).as_bytes())\n            }\n            &cuda_types::cuda::CUctx_flags_enum::CU_CTX_LMEM_RESIZE_TO_MAX => {\n                writer.write_all(stringify!(CU_CTX_LMEM_RESIZE_TO_MAX).as_bytes())\n            }\n            &cuda_types::cuda::CUctx_flags_enum::CU_CTX_COREDUMP_ENABLE => {\n                writer.write_all(stringify!(CU_CTX_COREDUMP_ENABLE).as_bytes())\n            }\n            &cuda_types::cuda::CUctx_flags_enum::CU_CTX_USER_COREDUMP_ENABLE => {\n                writer.write_all(stringify!(CU_CTX_USER_COREDUMP_ENABLE).as_bytes())\n            }\n            &cuda_types::cuda::CUctx_flags_enum::CU_CTX_SYNC_MEMOPS => {\n                writer.write_all(stringify!(CU_CTX_SYNC_MEMOPS).as_bytes())\n            }\n            &cuda_types::cuda::CUctx_flags_enum::CU_CTX_FLAGS_MASK => {\n                writer.write_all(stringify!(CU_CTX_FLAGS_MASK).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUevent_sched_flags_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUevent_sched_flags_enum::CU_EVENT_SCHED_AUTO => {\n                writer.write_all(stringify!(CU_EVENT_SCHED_AUTO).as_bytes())\n            }\n            &cuda_types::cuda::CUevent_sched_flags_enum::CU_EVENT_SCHED_SPIN => {\n                writer.write_all(stringify!(CU_EVENT_SCHED_SPIN).as_bytes())\n            }\n            &cuda_types::cuda::CUevent_sched_flags_enum::CU_EVENT_SCHED_YIELD => {\n                writer.write_all(stringify!(CU_EVENT_SCHED_YIELD).as_bytes())\n            }\n            &cuda_types::cuda::CUevent_sched_flags_enum::CU_EVENT_SCHED_BLOCKING_SYNC => {\n                writer.write_all(stringify!(CU_EVENT_SCHED_BLOCKING_SYNC).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUstream_flags_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUstream_flags_enum::CU_STREAM_DEFAULT => {\n                writer.write_all(stringify!(CU_STREAM_DEFAULT).as_bytes())\n            }\n            &cuda_types::cuda::CUstream_flags_enum::CU_STREAM_NON_BLOCKING => {\n                writer.write_all(stringify!(CU_STREAM_NON_BLOCKING).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUevent_flags_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUevent_flags_enum::CU_EVENT_DEFAULT => {\n                writer.write_all(stringify!(CU_EVENT_DEFAULT).as_bytes())\n            }\n            &cuda_types::cuda::CUevent_flags_enum::CU_EVENT_BLOCKING_SYNC => {\n                writer.write_all(stringify!(CU_EVENT_BLOCKING_SYNC).as_bytes())\n            }\n            &cuda_types::cuda::CUevent_flags_enum::CU_EVENT_DISABLE_TIMING => {\n                writer.write_all(stringify!(CU_EVENT_DISABLE_TIMING).as_bytes())\n            }\n            &cuda_types::cuda::CUevent_flags_enum::CU_EVENT_INTERPROCESS => {\n                writer.write_all(stringify!(CU_EVENT_INTERPROCESS).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUevent_record_flags_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUevent_record_flags_enum::CU_EVENT_RECORD_DEFAULT => {\n                writer.write_all(stringify!(CU_EVENT_RECORD_DEFAULT).as_bytes())\n            }\n            &cuda_types::cuda::CUevent_record_flags_enum::CU_EVENT_RECORD_EXTERNAL => {\n                writer.write_all(stringify!(CU_EVENT_RECORD_EXTERNAL).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUevent_wait_flags_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUevent_wait_flags_enum::CU_EVENT_WAIT_DEFAULT => {\n                writer.write_all(stringify!(CU_EVENT_WAIT_DEFAULT).as_bytes())\n            }\n            &cuda_types::cuda::CUevent_wait_flags_enum::CU_EVENT_WAIT_EXTERNAL => {\n                writer.write_all(stringify!(CU_EVENT_WAIT_EXTERNAL).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUstreamWaitValue_flags_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUstreamWaitValue_flags_enum::CU_STREAM_WAIT_VALUE_GEQ => {\n                writer.write_all(stringify!(CU_STREAM_WAIT_VALUE_GEQ).as_bytes())\n            }\n            &cuda_types::cuda::CUstreamWaitValue_flags_enum::CU_STREAM_WAIT_VALUE_EQ => {\n                writer.write_all(stringify!(CU_STREAM_WAIT_VALUE_EQ).as_bytes())\n            }\n            &cuda_types::cuda::CUstreamWaitValue_flags_enum::CU_STREAM_WAIT_VALUE_AND => {\n                writer.write_all(stringify!(CU_STREAM_WAIT_VALUE_AND).as_bytes())\n            }\n            &cuda_types::cuda::CUstreamWaitValue_flags_enum::CU_STREAM_WAIT_VALUE_NOR => {\n                writer.write_all(stringify!(CU_STREAM_WAIT_VALUE_NOR).as_bytes())\n            }\n            &cuda_types::cuda::CUstreamWaitValue_flags_enum::CU_STREAM_WAIT_VALUE_FLUSH => {\n                writer.write_all(stringify!(CU_STREAM_WAIT_VALUE_FLUSH).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUstreamWriteValue_flags_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUstreamWriteValue_flags_enum::CU_STREAM_WRITE_VALUE_DEFAULT => {\n                writer.write_all(stringify!(CU_STREAM_WRITE_VALUE_DEFAULT).as_bytes())\n            }\n            &cuda_types::cuda::CUstreamWriteValue_flags_enum::CU_STREAM_WRITE_VALUE_NO_MEMORY_BARRIER => {\n                writer\n                    .write_all(\n                        stringify!(CU_STREAM_WRITE_VALUE_NO_MEMORY_BARRIER).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUstreamBatchMemOpType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUstreamBatchMemOpType_enum::CU_STREAM_MEM_OP_WAIT_VALUE_32 => {\n                writer.write_all(stringify!(CU_STREAM_MEM_OP_WAIT_VALUE_32).as_bytes())\n            }\n            &cuda_types::cuda::CUstreamBatchMemOpType_enum::CU_STREAM_MEM_OP_WRITE_VALUE_32 => {\n                writer.write_all(stringify!(CU_STREAM_MEM_OP_WRITE_VALUE_32).as_bytes())\n            }\n            &cuda_types::cuda::CUstreamBatchMemOpType_enum::CU_STREAM_MEM_OP_WAIT_VALUE_64 => {\n                writer.write_all(stringify!(CU_STREAM_MEM_OP_WAIT_VALUE_64).as_bytes())\n            }\n            &cuda_types::cuda::CUstreamBatchMemOpType_enum::CU_STREAM_MEM_OP_WRITE_VALUE_64 => {\n                writer.write_all(stringify!(CU_STREAM_MEM_OP_WRITE_VALUE_64).as_bytes())\n            }\n            &cuda_types::cuda::CUstreamBatchMemOpType_enum::CU_STREAM_MEM_OP_BARRIER => {\n                writer.write_all(stringify!(CU_STREAM_MEM_OP_BARRIER).as_bytes())\n            }\n            &cuda_types::cuda::CUstreamBatchMemOpType_enum::CU_STREAM_MEM_OP_FLUSH_REMOTE_WRITES => {\n                writer\n                    .write_all(\n                        stringify!(CU_STREAM_MEM_OP_FLUSH_REMOTE_WRITES).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUstreamMemoryBarrier_flags_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUstreamMemoryBarrier_flags_enum::CU_STREAM_MEMORY_BARRIER_TYPE_SYS => {\n                writer\n                    .write_all(stringify!(CU_STREAM_MEMORY_BARRIER_TYPE_SYS).as_bytes())\n            }\n            &cuda_types::cuda::CUstreamMemoryBarrier_flags_enum::CU_STREAM_MEMORY_BARRIER_TYPE_GPU => {\n                writer\n                    .write_all(stringify!(CU_STREAM_MEMORY_BARRIER_TYPE_GPU).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::cuda::CUstreamBatchMemOpParams_union_CUstreamMemOpFlushRemoteWritesParams_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(operation), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.operation, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(flags), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.flags, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::cuda::CUstreamBatchMemOpParams_union_CUstreamMemOpMemoryBarrierParams_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(operation), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.operation, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(flags), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.flags, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_BATCH_MEM_OP_NODE_PARAMS_v1_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(ctx), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.ctx, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(count), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.count, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(paramArray), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.paramArray, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(flags), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.flags, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_BATCH_MEM_OP_NODE_PARAMS_v2_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(ctx), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.ctx, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(count), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.count, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(paramArray), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.paramArray, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(flags), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.flags, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUoccupancy_flags_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUoccupancy_flags_enum::CU_OCCUPANCY_DEFAULT => {\n                writer.write_all(stringify!(CU_OCCUPANCY_DEFAULT).as_bytes())\n            }\n            &cuda_types::cuda::CUoccupancy_flags_enum::CU_OCCUPANCY_DISABLE_CACHING_OVERRIDE => {\n                writer\n                    .write_all(\n                        stringify!(CU_OCCUPANCY_DISABLE_CACHING_OVERRIDE).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::cuda::CUstreamUpdateCaptureDependencies_flags_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUstreamUpdateCaptureDependencies_flags_enum::CU_STREAM_ADD_CAPTURE_DEPENDENCIES => {\n                writer\n                    .write_all(stringify!(CU_STREAM_ADD_CAPTURE_DEPENDENCIES).as_bytes())\n            }\n            &cuda_types::cuda::CUstreamUpdateCaptureDependencies_flags_enum::CU_STREAM_SET_CAPTURE_DEPENDENCIES => {\n                writer\n                    .write_all(stringify!(CU_STREAM_SET_CAPTURE_DEPENDENCIES).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUasyncNotificationType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUasyncNotificationType_enum::CU_ASYNC_NOTIFICATION_TYPE_OVER_BUDGET => {\n                writer\n                    .write_all(\n                        stringify!(CU_ASYNC_NOTIFICATION_TYPE_OVER_BUDGET).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::cuda::CUasyncNotificationInfo_st__bindgen_ty_1__bindgen_ty_1 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(bytesOverBudget), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.bytesOverBudget, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUasyncCallback {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(\n            writer,\n            \"{:p}\",\n            unsafe {\n                std::mem::transmute::<\n                    cuda_types::cuda::CUasyncCallback,\n                    *mut ::std::ffi::c_void,\n                >(*self)\n            },\n        )\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUarray_format_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_UNSIGNED_INT8 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_UNSIGNED_INT8).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_UNSIGNED_INT16 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_UNSIGNED_INT16).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_UNSIGNED_INT32 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_UNSIGNED_INT32).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_SIGNED_INT8 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_SIGNED_INT8).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_SIGNED_INT16 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_SIGNED_INT16).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_SIGNED_INT32 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_SIGNED_INT32).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_HALF => {\n                writer.write_all(stringify!(CU_AD_FORMAT_HALF).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_FLOAT => {\n                writer.write_all(stringify!(CU_AD_FORMAT_FLOAT).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_NV12 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_NV12).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_UNORM_INT8X1 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_UNORM_INT8X1).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_UNORM_INT8X2 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_UNORM_INT8X2).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_UNORM_INT8X4 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_UNORM_INT8X4).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_UNORM_INT16X1 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_UNORM_INT16X1).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_UNORM_INT16X2 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_UNORM_INT16X2).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_UNORM_INT16X4 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_UNORM_INT16X4).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_SNORM_INT8X1 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_SNORM_INT8X1).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_SNORM_INT8X2 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_SNORM_INT8X2).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_SNORM_INT8X4 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_SNORM_INT8X4).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_SNORM_INT16X1 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_SNORM_INT16X1).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_SNORM_INT16X2 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_SNORM_INT16X2).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_SNORM_INT16X4 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_SNORM_INT16X4).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_BC1_UNORM => {\n                writer.write_all(stringify!(CU_AD_FORMAT_BC1_UNORM).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_BC1_UNORM_SRGB => {\n                writer.write_all(stringify!(CU_AD_FORMAT_BC1_UNORM_SRGB).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_BC2_UNORM => {\n                writer.write_all(stringify!(CU_AD_FORMAT_BC2_UNORM).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_BC2_UNORM_SRGB => {\n                writer.write_all(stringify!(CU_AD_FORMAT_BC2_UNORM_SRGB).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_BC3_UNORM => {\n                writer.write_all(stringify!(CU_AD_FORMAT_BC3_UNORM).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_BC3_UNORM_SRGB => {\n                writer.write_all(stringify!(CU_AD_FORMAT_BC3_UNORM_SRGB).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_BC4_UNORM => {\n                writer.write_all(stringify!(CU_AD_FORMAT_BC4_UNORM).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_BC4_SNORM => {\n                writer.write_all(stringify!(CU_AD_FORMAT_BC4_SNORM).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_BC5_UNORM => {\n                writer.write_all(stringify!(CU_AD_FORMAT_BC5_UNORM).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_BC5_SNORM => {\n                writer.write_all(stringify!(CU_AD_FORMAT_BC5_SNORM).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_BC6H_UF16 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_BC6H_UF16).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_BC6H_SF16 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_BC6H_SF16).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_BC7_UNORM => {\n                writer.write_all(stringify!(CU_AD_FORMAT_BC7_UNORM).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_BC7_UNORM_SRGB => {\n                writer.write_all(stringify!(CU_AD_FORMAT_BC7_UNORM_SRGB).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_P010 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_P010).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_P016 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_P016).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_NV16 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_NV16).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_P210 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_P210).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_P216 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_P216).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_YUY2 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_YUY2).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_Y210 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_Y210).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_Y216 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_Y216).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_AYUV => {\n                writer.write_all(stringify!(CU_AD_FORMAT_AYUV).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_Y410 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_Y410).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_Y416 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_Y416).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_Y444_PLANAR8 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_Y444_PLANAR8).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_Y444_PLANAR10 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_Y444_PLANAR10).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_YUV444_8bit_SemiPlanar => {\n                writer\n                    .write_all(\n                        stringify!(CU_AD_FORMAT_YUV444_8bit_SemiPlanar).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_YUV444_16bit_SemiPlanar => {\n                writer\n                    .write_all(\n                        stringify!(CU_AD_FORMAT_YUV444_16bit_SemiPlanar).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_UNORM_INT_101010_2 => {\n                writer.write_all(stringify!(CU_AD_FORMAT_UNORM_INT_101010_2).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_format_enum::CU_AD_FORMAT_MAX => {\n                writer.write_all(stringify!(CU_AD_FORMAT_MAX).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUaddress_mode_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUaddress_mode_enum::CU_TR_ADDRESS_MODE_WRAP => {\n                writer.write_all(stringify!(CU_TR_ADDRESS_MODE_WRAP).as_bytes())\n            }\n            &cuda_types::cuda::CUaddress_mode_enum::CU_TR_ADDRESS_MODE_CLAMP => {\n                writer.write_all(stringify!(CU_TR_ADDRESS_MODE_CLAMP).as_bytes())\n            }\n            &cuda_types::cuda::CUaddress_mode_enum::CU_TR_ADDRESS_MODE_MIRROR => {\n                writer.write_all(stringify!(CU_TR_ADDRESS_MODE_MIRROR).as_bytes())\n            }\n            &cuda_types::cuda::CUaddress_mode_enum::CU_TR_ADDRESS_MODE_BORDER => {\n                writer.write_all(stringify!(CU_TR_ADDRESS_MODE_BORDER).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUfilter_mode_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUfilter_mode_enum::CU_TR_FILTER_MODE_POINT => {\n                writer.write_all(stringify!(CU_TR_FILTER_MODE_POINT).as_bytes())\n            }\n            &cuda_types::cuda::CUfilter_mode_enum::CU_TR_FILTER_MODE_LINEAR => {\n                writer.write_all(stringify!(CU_TR_FILTER_MODE_LINEAR).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUdevice_attribute_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAX_THREADS_PER_BLOCK => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAX_THREADS_PER_BLOCK).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_X => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_X).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_Y => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_Y).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_Z => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_Z).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_X => {\n                writer\n                    .write_all(stringify!(CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_X).as_bytes())\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_Y => {\n                writer\n                    .write_all(stringify!(CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_Y).as_bytes())\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_Z => {\n                writer\n                    .write_all(stringify!(CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_Z).as_bytes())\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_SHARED_MEMORY_PER_BLOCK => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_SHARED_MEMORY_PER_BLOCK)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_TOTAL_CONSTANT_MEMORY => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_TOTAL_CONSTANT_MEMORY).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_WARP_SIZE => {\n                writer.write_all(stringify!(CU_DEVICE_ATTRIBUTE_WARP_SIZE).as_bytes())\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAX_PITCH => {\n                writer.write_all(stringify!(CU_DEVICE_ATTRIBUTE_MAX_PITCH).as_bytes())\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAX_REGISTERS_PER_BLOCK => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAX_REGISTERS_PER_BLOCK)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_REGISTERS_PER_BLOCK => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_REGISTERS_PER_BLOCK).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_CLOCK_RATE => {\n                writer.write_all(stringify!(CU_DEVICE_ATTRIBUTE_CLOCK_RATE).as_bytes())\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_TEXTURE_ALIGNMENT => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_TEXTURE_ALIGNMENT).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_GPU_OVERLAP => {\n                writer.write_all(stringify!(CU_DEVICE_ATTRIBUTE_GPU_OVERLAP).as_bytes())\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MULTIPROCESSOR_COUNT => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MULTIPROCESSOR_COUNT).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_KERNEL_EXEC_TIMEOUT => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_KERNEL_EXEC_TIMEOUT).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_INTEGRATED => {\n                writer.write_all(stringify!(CU_DEVICE_ATTRIBUTE_INTEGRATED).as_bytes())\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_CAN_MAP_HOST_MEMORY => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_CAN_MAP_HOST_MEMORY).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_COMPUTE_MODE => {\n                writer.write_all(stringify!(CU_DEVICE_ATTRIBUTE_COMPUTE_MODE).as_bytes())\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_WIDTH => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_WIDTH)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_WIDTH => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_WIDTH)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_HEIGHT => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_HEIGHT)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_WIDTH => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_WIDTH)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_HEIGHT => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_HEIGHT)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_DEPTH => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_DEPTH)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_WIDTH => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_WIDTH)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_HEIGHT => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_HEIGHT)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_LAYERS => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_LAYERS)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_ARRAY_WIDTH => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_ARRAY_WIDTH)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_ARRAY_HEIGHT => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_ARRAY_HEIGHT)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_ARRAY_NUMSLICES => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_ARRAY_NUMSLICES)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_SURFACE_ALIGNMENT => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_SURFACE_ALIGNMENT).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_CONCURRENT_KERNELS => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_CONCURRENT_KERNELS).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_ECC_ENABLED => {\n                writer.write_all(stringify!(CU_DEVICE_ATTRIBUTE_ECC_ENABLED).as_bytes())\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_PCI_BUS_ID => {\n                writer.write_all(stringify!(CU_DEVICE_ATTRIBUTE_PCI_BUS_ID).as_bytes())\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_PCI_DEVICE_ID => {\n                writer\n                    .write_all(stringify!(CU_DEVICE_ATTRIBUTE_PCI_DEVICE_ID).as_bytes())\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_TCC_DRIVER => {\n                writer.write_all(stringify!(CU_DEVICE_ATTRIBUTE_TCC_DRIVER).as_bytes())\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MEMORY_CLOCK_RATE => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MEMORY_CLOCK_RATE).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_GLOBAL_MEMORY_BUS_WIDTH => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_GLOBAL_MEMORY_BUS_WIDTH)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_L2_CACHE_SIZE => {\n                writer\n                    .write_all(stringify!(CU_DEVICE_ATTRIBUTE_L2_CACHE_SIZE).as_bytes())\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAX_THREADS_PER_MULTIPROCESSOR => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAX_THREADS_PER_MULTIPROCESSOR)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_ASYNC_ENGINE_COUNT => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_ASYNC_ENGINE_COUNT).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_UNIFIED_ADDRESSING => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_UNIFIED_ADDRESSING).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LAYERED_WIDTH => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LAYERED_WIDTH)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LAYERED_LAYERS => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LAYERED_LAYERS)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_CAN_TEX2D_GATHER => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_CAN_TEX2D_GATHER).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_GATHER_WIDTH => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_GATHER_WIDTH)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_GATHER_HEIGHT => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_GATHER_HEIGHT)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_WIDTH_ALTERNATE => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_WIDTH_ALTERNATE)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_HEIGHT_ALTERNATE => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_HEIGHT_ALTERNATE\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_DEPTH_ALTERNATE => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_DEPTH_ALTERNATE)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_PCI_DOMAIN_ID => {\n                writer\n                    .write_all(stringify!(CU_DEVICE_ATTRIBUTE_PCI_DOMAIN_ID).as_bytes())\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_TEXTURE_PITCH_ALIGNMENT => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_TEXTURE_PITCH_ALIGNMENT)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_WIDTH => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_WIDTH)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_LAYERED_WIDTH => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_LAYERED_WIDTH\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_LAYERED_LAYERS => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_LAYERED_LAYERS\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE1D_WIDTH => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE1D_WIDTH)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_WIDTH => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_WIDTH)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_HEIGHT => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_HEIGHT)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_WIDTH => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_WIDTH)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_HEIGHT => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_HEIGHT)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_DEPTH => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_DEPTH)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE1D_LAYERED_WIDTH => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE1D_LAYERED_WIDTH)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE1D_LAYERED_LAYERS => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE1D_LAYERED_LAYERS)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_WIDTH => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_WIDTH)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_HEIGHT => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_HEIGHT)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_LAYERS => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_LAYERS)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_WIDTH => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_WIDTH)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_LAYERED_WIDTH => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_LAYERED_WIDTH\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_LAYERED_LAYERS => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_LAYERED_LAYERS\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LINEAR_WIDTH => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LINEAR_WIDTH)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_WIDTH => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_WIDTH)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_HEIGHT => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_HEIGHT)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_PITCH => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_PITCH)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_MIPMAPPED_WIDTH => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_MIPMAPPED_WIDTH)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_MIPMAPPED_HEIGHT => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_MIPMAPPED_HEIGHT\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_MIPMAPPED_WIDTH => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_MIPMAPPED_WIDTH)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_STREAM_PRIORITIES_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_STREAM_PRIORITIES_SUPPORTED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_GLOBAL_L1_CACHE_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_GLOBAL_L1_CACHE_SUPPORTED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_LOCAL_L1_CACHE_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_LOCAL_L1_CACHE_SUPPORTED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_MULTIPROCESSOR => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_MULTIPROCESSOR\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAX_REGISTERS_PER_MULTIPROCESSOR => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAX_REGISTERS_PER_MULTIPROCESSOR)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MANAGED_MEMORY => {\n                writer\n                    .write_all(stringify!(CU_DEVICE_ATTRIBUTE_MANAGED_MEMORY).as_bytes())\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MULTI_GPU_BOARD => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MULTI_GPU_BOARD).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MULTI_GPU_BOARD_GROUP_ID => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MULTI_GPU_BOARD_GROUP_ID)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_HOST_NATIVE_ATOMIC_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_HOST_NATIVE_ATOMIC_SUPPORTED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_SINGLE_TO_DOUBLE_PRECISION_PERF_RATIO => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_DEVICE_ATTRIBUTE_SINGLE_TO_DOUBLE_PRECISION_PERF_RATIO\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_COMPUTE_PREEMPTION_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_COMPUTE_PREEMPTION_SUPPORTED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_CAN_USE_HOST_POINTER_FOR_REGISTERED_MEM => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_DEVICE_ATTRIBUTE_CAN_USE_HOST_POINTER_FOR_REGISTERED_MEM\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_MEM_OPS_V1 => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_MEM_OPS_V1)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_CAN_USE_64_BIT_STREAM_MEM_OPS_V1 => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_CAN_USE_64_BIT_STREAM_MEM_OPS_V1)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_WAIT_VALUE_NOR_V1 => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_WAIT_VALUE_NOR_V1)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_COOPERATIVE_LAUNCH => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_COOPERATIVE_LAUNCH).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_COOPERATIVE_MULTI_DEVICE_LAUNCH => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_COOPERATIVE_MULTI_DEVICE_LAUNCH)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK_OPTIN => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK_OPTIN)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_CAN_FLUSH_REMOTE_WRITES => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_CAN_FLUSH_REMOTE_WRITES)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_HOST_REGISTER_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_HOST_REGISTER_SUPPORTED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS_USES_HOST_PAGE_TABLES => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS_USES_HOST_PAGE_TABLES\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_DIRECT_MANAGED_MEM_ACCESS_FROM_HOST => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_DEVICE_ATTRIBUTE_DIRECT_MANAGED_MEM_ACCESS_FROM_HOST\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_VIRTUAL_ADDRESS_MANAGEMENT_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_DEVICE_ATTRIBUTE_VIRTUAL_ADDRESS_MANAGEMENT_SUPPORTED\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_VIRTUAL_MEMORY_MANAGEMENT_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_DEVICE_ATTRIBUTE_VIRTUAL_MEMORY_MANAGEMENT_SUPPORTED\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_HANDLE_TYPE_POSIX_FILE_DESCRIPTOR_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_DEVICE_ATTRIBUTE_HANDLE_TYPE_POSIX_FILE_DESCRIPTOR_SUPPORTED\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_HANDLE_TYPE_WIN32_HANDLE_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_DEVICE_ATTRIBUTE_HANDLE_TYPE_WIN32_HANDLE_SUPPORTED\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_HANDLE_TYPE_WIN32_KMT_HANDLE_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_DEVICE_ATTRIBUTE_HANDLE_TYPE_WIN32_KMT_HANDLE_SUPPORTED\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAX_BLOCKS_PER_MULTIPROCESSOR => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAX_BLOCKS_PER_MULTIPROCESSOR)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_GENERIC_COMPRESSION_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_GENERIC_COMPRESSION_SUPPORTED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAX_PERSISTING_L2_CACHE_SIZE => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAX_PERSISTING_L2_CACHE_SIZE)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAX_ACCESS_POLICY_WINDOW_SIZE => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MAX_ACCESS_POLICY_WINDOW_SIZE)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_WITH_CUDA_VMM_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_WITH_CUDA_VMM_SUPPORTED\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_RESERVED_SHARED_MEMORY_PER_BLOCK => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_RESERVED_SHARED_MEMORY_PER_BLOCK)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_SPARSE_CUDA_ARRAY_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_SPARSE_CUDA_ARRAY_SUPPORTED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_READ_ONLY_HOST_REGISTER_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_READ_ONLY_HOST_REGISTER_SUPPORTED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_TIMELINE_SEMAPHORE_INTEROP_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_DEVICE_ATTRIBUTE_TIMELINE_SEMAPHORE_INTEROP_SUPPORTED\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MEMORY_POOLS_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MEMORY_POOLS_SUPPORTED).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_SUPPORTED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_FLUSH_WRITES_OPTIONS => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_FLUSH_WRITES_OPTIONS\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_WRITES_ORDERING => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_WRITES_ORDERING)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MEMPOOL_SUPPORTED_HANDLE_TYPES => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MEMPOOL_SUPPORTED_HANDLE_TYPES)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_CLUSTER_LAUNCH => {\n                writer\n                    .write_all(stringify!(CU_DEVICE_ATTRIBUTE_CLUSTER_LAUNCH).as_bytes())\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_DEFERRED_MAPPING_CUDA_ARRAY_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_DEVICE_ATTRIBUTE_DEFERRED_MAPPING_CUDA_ARRAY_SUPPORTED\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_CAN_USE_64_BIT_STREAM_MEM_OPS => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_CAN_USE_64_BIT_STREAM_MEM_OPS)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_WAIT_VALUE_NOR => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_WAIT_VALUE_NOR)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_DMA_BUF_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_DMA_BUF_SUPPORTED).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_IPC_EVENT_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_IPC_EVENT_SUPPORTED).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MEM_SYNC_DOMAIN_COUNT => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MEM_SYNC_DOMAIN_COUNT).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_TENSOR_MAP_ACCESS_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_TENSOR_MAP_ACCESS_SUPPORTED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_HANDLE_TYPE_FABRIC_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_HANDLE_TYPE_FABRIC_SUPPORTED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_UNIFIED_FUNCTION_POINTERS => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_UNIFIED_FUNCTION_POINTERS)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_NUMA_CONFIG => {\n                writer.write_all(stringify!(CU_DEVICE_ATTRIBUTE_NUMA_CONFIG).as_bytes())\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_NUMA_ID => {\n                writer.write_all(stringify!(CU_DEVICE_ATTRIBUTE_NUMA_ID).as_bytes())\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MULTICAST_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MULTICAST_SUPPORTED).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MPS_ENABLED => {\n                writer.write_all(stringify!(CU_DEVICE_ATTRIBUTE_MPS_ENABLED).as_bytes())\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_HOST_NUMA_ID => {\n                writer.write_all(stringify!(CU_DEVICE_ATTRIBUTE_HOST_NUMA_ID).as_bytes())\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_D3D12_CIG_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_D3D12_CIG_SUPPORTED).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MEM_DECOMPRESS_ALGORITHM_MASK => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MEM_DECOMPRESS_ALGORITHM_MASK)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MEM_DECOMPRESS_MAXIMUM_LENGTH => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_MEM_DECOMPRESS_MAXIMUM_LENGTH)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_VULKAN_CIG_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_VULKAN_CIG_SUPPORTED).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_GPU_PCI_DEVICE_ID => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_GPU_PCI_DEVICE_ID).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_GPU_PCI_SUBSYSTEM_ID => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_GPU_PCI_SUBSYSTEM_ID).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_HOST_NUMA_VIRTUAL_MEMORY_MANAGEMENT_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_DEVICE_ATTRIBUTE_HOST_NUMA_VIRTUAL_MEMORY_MANAGEMENT_SUPPORTED\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_HOST_NUMA_MEMORY_POOLS_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_HOST_NUMA_MEMORY_POOLS_SUPPORTED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_HOST_NUMA_MULTINODE_IPC_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_HOST_NUMA_MULTINODE_IPC_SUPPORTED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_HOST_MEMORY_POOLS_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_HOST_MEMORY_POOLS_SUPPORTED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_HOST_VIRTUAL_MEMORY_MANAGEMENT_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_DEVICE_ATTRIBUTE_HOST_VIRTUAL_MEMORY_MANAGEMENT_SUPPORTED\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_HOST_ALLOC_DMA_BUF_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_ATTRIBUTE_HOST_ALLOC_DMA_BUF_SUPPORTED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_ONLY_PARTIAL_HOST_NATIVE_ATOMIC_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_DEVICE_ATTRIBUTE_ONLY_PARTIAL_HOST_NATIVE_ATOMIC_SUPPORTED\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_attribute_enum::CU_DEVICE_ATTRIBUTE_MAX => {\n                writer.write_all(stringify!(CU_DEVICE_ATTRIBUTE_MAX).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUdevprop_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer\n            .write_all(concat!(\"{ \", stringify!(maxThreadsPerBlock), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.maxThreadsPerBlock, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(maxThreadsDim), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.maxThreadsDim, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(maxGridSize), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.maxGridSize, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sharedMemPerBlock), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sharedMemPerBlock, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(totalConstantMemory), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.totalConstantMemory, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(SIMDWidth), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.SIMDWidth, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(memPitch), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.memPitch, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(regsPerBlock), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.regsPerBlock, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(clockRate), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.clockRate, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(textureAlign), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.textureAlign, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUpointer_attribute_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUpointer_attribute_enum::CU_POINTER_ATTRIBUTE_CONTEXT => {\n                writer.write_all(stringify!(CU_POINTER_ATTRIBUTE_CONTEXT).as_bytes())\n            }\n            &cuda_types::cuda::CUpointer_attribute_enum::CU_POINTER_ATTRIBUTE_MEMORY_TYPE => {\n                writer.write_all(stringify!(CU_POINTER_ATTRIBUTE_MEMORY_TYPE).as_bytes())\n            }\n            &cuda_types::cuda::CUpointer_attribute_enum::CU_POINTER_ATTRIBUTE_DEVICE_POINTER => {\n                writer\n                    .write_all(\n                        stringify!(CU_POINTER_ATTRIBUTE_DEVICE_POINTER).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUpointer_attribute_enum::CU_POINTER_ATTRIBUTE_HOST_POINTER => {\n                writer\n                    .write_all(stringify!(CU_POINTER_ATTRIBUTE_HOST_POINTER).as_bytes())\n            }\n            &cuda_types::cuda::CUpointer_attribute_enum::CU_POINTER_ATTRIBUTE_P2P_TOKENS => {\n                writer.write_all(stringify!(CU_POINTER_ATTRIBUTE_P2P_TOKENS).as_bytes())\n            }\n            &cuda_types::cuda::CUpointer_attribute_enum::CU_POINTER_ATTRIBUTE_SYNC_MEMOPS => {\n                writer.write_all(stringify!(CU_POINTER_ATTRIBUTE_SYNC_MEMOPS).as_bytes())\n            }\n            &cuda_types::cuda::CUpointer_attribute_enum::CU_POINTER_ATTRIBUTE_BUFFER_ID => {\n                writer.write_all(stringify!(CU_POINTER_ATTRIBUTE_BUFFER_ID).as_bytes())\n            }\n            &cuda_types::cuda::CUpointer_attribute_enum::CU_POINTER_ATTRIBUTE_IS_MANAGED => {\n                writer.write_all(stringify!(CU_POINTER_ATTRIBUTE_IS_MANAGED).as_bytes())\n            }\n            &cuda_types::cuda::CUpointer_attribute_enum::CU_POINTER_ATTRIBUTE_DEVICE_ORDINAL => {\n                writer\n                    .write_all(\n                        stringify!(CU_POINTER_ATTRIBUTE_DEVICE_ORDINAL).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUpointer_attribute_enum::CU_POINTER_ATTRIBUTE_IS_LEGACY_CUDA_IPC_CAPABLE => {\n                writer\n                    .write_all(\n                        stringify!(CU_POINTER_ATTRIBUTE_IS_LEGACY_CUDA_IPC_CAPABLE)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUpointer_attribute_enum::CU_POINTER_ATTRIBUTE_RANGE_START_ADDR => {\n                writer\n                    .write_all(\n                        stringify!(CU_POINTER_ATTRIBUTE_RANGE_START_ADDR).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUpointer_attribute_enum::CU_POINTER_ATTRIBUTE_RANGE_SIZE => {\n                writer.write_all(stringify!(CU_POINTER_ATTRIBUTE_RANGE_SIZE).as_bytes())\n            }\n            &cuda_types::cuda::CUpointer_attribute_enum::CU_POINTER_ATTRIBUTE_MAPPED => {\n                writer.write_all(stringify!(CU_POINTER_ATTRIBUTE_MAPPED).as_bytes())\n            }\n            &cuda_types::cuda::CUpointer_attribute_enum::CU_POINTER_ATTRIBUTE_ALLOWED_HANDLE_TYPES => {\n                writer\n                    .write_all(\n                        stringify!(CU_POINTER_ATTRIBUTE_ALLOWED_HANDLE_TYPES).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUpointer_attribute_enum::CU_POINTER_ATTRIBUTE_IS_GPU_DIRECT_RDMA_CAPABLE => {\n                writer\n                    .write_all(\n                        stringify!(CU_POINTER_ATTRIBUTE_IS_GPU_DIRECT_RDMA_CAPABLE)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUpointer_attribute_enum::CU_POINTER_ATTRIBUTE_ACCESS_FLAGS => {\n                writer\n                    .write_all(stringify!(CU_POINTER_ATTRIBUTE_ACCESS_FLAGS).as_bytes())\n            }\n            &cuda_types::cuda::CUpointer_attribute_enum::CU_POINTER_ATTRIBUTE_MEMPOOL_HANDLE => {\n                writer\n                    .write_all(\n                        stringify!(CU_POINTER_ATTRIBUTE_MEMPOOL_HANDLE).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUpointer_attribute_enum::CU_POINTER_ATTRIBUTE_MAPPING_SIZE => {\n                writer\n                    .write_all(stringify!(CU_POINTER_ATTRIBUTE_MAPPING_SIZE).as_bytes())\n            }\n            &cuda_types::cuda::CUpointer_attribute_enum::CU_POINTER_ATTRIBUTE_MAPPING_BASE_ADDR => {\n                writer\n                    .write_all(\n                        stringify!(CU_POINTER_ATTRIBUTE_MAPPING_BASE_ADDR).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUpointer_attribute_enum::CU_POINTER_ATTRIBUTE_MEMORY_BLOCK_ID => {\n                writer\n                    .write_all(\n                        stringify!(CU_POINTER_ATTRIBUTE_MEMORY_BLOCK_ID).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUpointer_attribute_enum::CU_POINTER_ATTRIBUTE_IS_HW_DECOMPRESS_CAPABLE => {\n                writer\n                    .write_all(\n                        stringify!(CU_POINTER_ATTRIBUTE_IS_HW_DECOMPRESS_CAPABLE)\n                            .as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUfunction_attribute_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUfunction_attribute_enum::CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK => {\n                writer\n                    .write_all(\n                        stringify!(CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUfunction_attribute_enum::CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES => {\n                writer\n                    .write_all(\n                        stringify!(CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUfunction_attribute_enum::CU_FUNC_ATTRIBUTE_CONST_SIZE_BYTES => {\n                writer\n                    .write_all(stringify!(CU_FUNC_ATTRIBUTE_CONST_SIZE_BYTES).as_bytes())\n            }\n            &cuda_types::cuda::CUfunction_attribute_enum::CU_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES => {\n                writer\n                    .write_all(stringify!(CU_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES).as_bytes())\n            }\n            &cuda_types::cuda::CUfunction_attribute_enum::CU_FUNC_ATTRIBUTE_NUM_REGS => {\n                writer.write_all(stringify!(CU_FUNC_ATTRIBUTE_NUM_REGS).as_bytes())\n            }\n            &cuda_types::cuda::CUfunction_attribute_enum::CU_FUNC_ATTRIBUTE_PTX_VERSION => {\n                writer.write_all(stringify!(CU_FUNC_ATTRIBUTE_PTX_VERSION).as_bytes())\n            }\n            &cuda_types::cuda::CUfunction_attribute_enum::CU_FUNC_ATTRIBUTE_BINARY_VERSION => {\n                writer.write_all(stringify!(CU_FUNC_ATTRIBUTE_BINARY_VERSION).as_bytes())\n            }\n            &cuda_types::cuda::CUfunction_attribute_enum::CU_FUNC_ATTRIBUTE_CACHE_MODE_CA => {\n                writer.write_all(stringify!(CU_FUNC_ATTRIBUTE_CACHE_MODE_CA).as_bytes())\n            }\n            &cuda_types::cuda::CUfunction_attribute_enum::CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES => {\n                writer\n                    .write_all(\n                        stringify!(CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUfunction_attribute_enum::CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT => {\n                writer\n                    .write_all(\n                        stringify!(CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUfunction_attribute_enum::CU_FUNC_ATTRIBUTE_CLUSTER_SIZE_MUST_BE_SET => {\n                writer\n                    .write_all(\n                        stringify!(CU_FUNC_ATTRIBUTE_CLUSTER_SIZE_MUST_BE_SET).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUfunction_attribute_enum::CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_WIDTH => {\n                writer\n                    .write_all(\n                        stringify!(CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_WIDTH).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUfunction_attribute_enum::CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_HEIGHT => {\n                writer\n                    .write_all(\n                        stringify!(CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_HEIGHT).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUfunction_attribute_enum::CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_DEPTH => {\n                writer\n                    .write_all(\n                        stringify!(CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_DEPTH).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUfunction_attribute_enum::CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED => {\n                writer\n                    .write_all(\n                        stringify!(CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUfunction_attribute_enum::CU_FUNC_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_FUNC_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUfunction_attribute_enum::CU_FUNC_ATTRIBUTE_MAX => {\n                writer.write_all(stringify!(CU_FUNC_ATTRIBUTE_MAX).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUfunc_cache_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUfunc_cache_enum::CU_FUNC_CACHE_PREFER_NONE => {\n                writer.write_all(stringify!(CU_FUNC_CACHE_PREFER_NONE).as_bytes())\n            }\n            &cuda_types::cuda::CUfunc_cache_enum::CU_FUNC_CACHE_PREFER_SHARED => {\n                writer.write_all(stringify!(CU_FUNC_CACHE_PREFER_SHARED).as_bytes())\n            }\n            &cuda_types::cuda::CUfunc_cache_enum::CU_FUNC_CACHE_PREFER_L1 => {\n                writer.write_all(stringify!(CU_FUNC_CACHE_PREFER_L1).as_bytes())\n            }\n            &cuda_types::cuda::CUfunc_cache_enum::CU_FUNC_CACHE_PREFER_EQUAL => {\n                writer.write_all(stringify!(CU_FUNC_CACHE_PREFER_EQUAL).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUsharedconfig_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUsharedconfig_enum::CU_SHARED_MEM_CONFIG_DEFAULT_BANK_SIZE => {\n                writer\n                    .write_all(\n                        stringify!(CU_SHARED_MEM_CONFIG_DEFAULT_BANK_SIZE).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUsharedconfig_enum::CU_SHARED_MEM_CONFIG_FOUR_BYTE_BANK_SIZE => {\n                writer\n                    .write_all(\n                        stringify!(CU_SHARED_MEM_CONFIG_FOUR_BYTE_BANK_SIZE).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUsharedconfig_enum::CU_SHARED_MEM_CONFIG_EIGHT_BYTE_BANK_SIZE => {\n                writer\n                    .write_all(\n                        stringify!(CU_SHARED_MEM_CONFIG_EIGHT_BYTE_BANK_SIZE).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUshared_carveout_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUshared_carveout_enum::CU_SHAREDMEM_CARVEOUT_DEFAULT => {\n                writer.write_all(stringify!(CU_SHAREDMEM_CARVEOUT_DEFAULT).as_bytes())\n            }\n            &cuda_types::cuda::CUshared_carveout_enum::CU_SHAREDMEM_CARVEOUT_MAX_SHARED => {\n                writer.write_all(stringify!(CU_SHAREDMEM_CARVEOUT_MAX_SHARED).as_bytes())\n            }\n            &cuda_types::cuda::CUshared_carveout_enum::CU_SHAREDMEM_CARVEOUT_MAX_L1 => {\n                writer.write_all(stringify!(CU_SHAREDMEM_CARVEOUT_MAX_L1).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmemorytype_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUmemorytype_enum::CU_MEMORYTYPE_HOST => {\n                writer.write_all(stringify!(CU_MEMORYTYPE_HOST).as_bytes())\n            }\n            &cuda_types::cuda::CUmemorytype_enum::CU_MEMORYTYPE_DEVICE => {\n                writer.write_all(stringify!(CU_MEMORYTYPE_DEVICE).as_bytes())\n            }\n            &cuda_types::cuda::CUmemorytype_enum::CU_MEMORYTYPE_ARRAY => {\n                writer.write_all(stringify!(CU_MEMORYTYPE_ARRAY).as_bytes())\n            }\n            &cuda_types::cuda::CUmemorytype_enum::CU_MEMORYTYPE_UNIFIED => {\n                writer.write_all(stringify!(CU_MEMORYTYPE_UNIFIED).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUcomputemode_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUcomputemode_enum::CU_COMPUTEMODE_DEFAULT => {\n                writer.write_all(stringify!(CU_COMPUTEMODE_DEFAULT).as_bytes())\n            }\n            &cuda_types::cuda::CUcomputemode_enum::CU_COMPUTEMODE_PROHIBITED => {\n                writer.write_all(stringify!(CU_COMPUTEMODE_PROHIBITED).as_bytes())\n            }\n            &cuda_types::cuda::CUcomputemode_enum::CU_COMPUTEMODE_EXCLUSIVE_PROCESS => {\n                writer.write_all(stringify!(CU_COMPUTEMODE_EXCLUSIVE_PROCESS).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmem_advise_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUmem_advise_enum::CU_MEM_ADVISE_SET_READ_MOSTLY => {\n                writer.write_all(stringify!(CU_MEM_ADVISE_SET_READ_MOSTLY).as_bytes())\n            }\n            &cuda_types::cuda::CUmem_advise_enum::CU_MEM_ADVISE_UNSET_READ_MOSTLY => {\n                writer.write_all(stringify!(CU_MEM_ADVISE_UNSET_READ_MOSTLY).as_bytes())\n            }\n            &cuda_types::cuda::CUmem_advise_enum::CU_MEM_ADVISE_SET_PREFERRED_LOCATION => {\n                writer\n                    .write_all(\n                        stringify!(CU_MEM_ADVISE_SET_PREFERRED_LOCATION).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUmem_advise_enum::CU_MEM_ADVISE_UNSET_PREFERRED_LOCATION => {\n                writer\n                    .write_all(\n                        stringify!(CU_MEM_ADVISE_UNSET_PREFERRED_LOCATION).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUmem_advise_enum::CU_MEM_ADVISE_SET_ACCESSED_BY => {\n                writer.write_all(stringify!(CU_MEM_ADVISE_SET_ACCESSED_BY).as_bytes())\n            }\n            &cuda_types::cuda::CUmem_advise_enum::CU_MEM_ADVISE_UNSET_ACCESSED_BY => {\n                writer.write_all(stringify!(CU_MEM_ADVISE_UNSET_ACCESSED_BY).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmem_range_attribute_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUmem_range_attribute_enum::CU_MEM_RANGE_ATTRIBUTE_READ_MOSTLY => {\n                writer\n                    .write_all(stringify!(CU_MEM_RANGE_ATTRIBUTE_READ_MOSTLY).as_bytes())\n            }\n            &cuda_types::cuda::CUmem_range_attribute_enum::CU_MEM_RANGE_ATTRIBUTE_PREFERRED_LOCATION => {\n                writer\n                    .write_all(\n                        stringify!(CU_MEM_RANGE_ATTRIBUTE_PREFERRED_LOCATION).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUmem_range_attribute_enum::CU_MEM_RANGE_ATTRIBUTE_ACCESSED_BY => {\n                writer\n                    .write_all(stringify!(CU_MEM_RANGE_ATTRIBUTE_ACCESSED_BY).as_bytes())\n            }\n            &cuda_types::cuda::CUmem_range_attribute_enum::CU_MEM_RANGE_ATTRIBUTE_LAST_PREFETCH_LOCATION => {\n                writer\n                    .write_all(\n                        stringify!(CU_MEM_RANGE_ATTRIBUTE_LAST_PREFETCH_LOCATION)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUmem_range_attribute_enum::CU_MEM_RANGE_ATTRIBUTE_PREFERRED_LOCATION_TYPE => {\n                writer\n                    .write_all(\n                        stringify!(CU_MEM_RANGE_ATTRIBUTE_PREFERRED_LOCATION_TYPE)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUmem_range_attribute_enum::CU_MEM_RANGE_ATTRIBUTE_PREFERRED_LOCATION_ID => {\n                writer\n                    .write_all(\n                        stringify!(CU_MEM_RANGE_ATTRIBUTE_PREFERRED_LOCATION_ID)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUmem_range_attribute_enum::CU_MEM_RANGE_ATTRIBUTE_LAST_PREFETCH_LOCATION_TYPE => {\n                writer\n                    .write_all(\n                        stringify!(CU_MEM_RANGE_ATTRIBUTE_LAST_PREFETCH_LOCATION_TYPE)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUmem_range_attribute_enum::CU_MEM_RANGE_ATTRIBUTE_LAST_PREFETCH_LOCATION_ID => {\n                writer\n                    .write_all(\n                        stringify!(CU_MEM_RANGE_ATTRIBUTE_LAST_PREFETCH_LOCATION_ID)\n                            .as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUjit_option_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_MAX_REGISTERS => {\n                writer.write_all(stringify!(CU_JIT_MAX_REGISTERS).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_THREADS_PER_BLOCK => {\n                writer.write_all(stringify!(CU_JIT_THREADS_PER_BLOCK).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_WALL_TIME => {\n                writer.write_all(stringify!(CU_JIT_WALL_TIME).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_INFO_LOG_BUFFER => {\n                writer.write_all(stringify!(CU_JIT_INFO_LOG_BUFFER).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_INFO_LOG_BUFFER_SIZE_BYTES => {\n                writer\n                    .write_all(stringify!(CU_JIT_INFO_LOG_BUFFER_SIZE_BYTES).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_ERROR_LOG_BUFFER => {\n                writer.write_all(stringify!(CU_JIT_ERROR_LOG_BUFFER).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_ERROR_LOG_BUFFER_SIZE_BYTES => {\n                writer\n                    .write_all(stringify!(CU_JIT_ERROR_LOG_BUFFER_SIZE_BYTES).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_OPTIMIZATION_LEVEL => {\n                writer.write_all(stringify!(CU_JIT_OPTIMIZATION_LEVEL).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_TARGET_FROM_CUCONTEXT => {\n                writer.write_all(stringify!(CU_JIT_TARGET_FROM_CUCONTEXT).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_TARGET => {\n                writer.write_all(stringify!(CU_JIT_TARGET).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_FALLBACK_STRATEGY => {\n                writer.write_all(stringify!(CU_JIT_FALLBACK_STRATEGY).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_GENERATE_DEBUG_INFO => {\n                writer.write_all(stringify!(CU_JIT_GENERATE_DEBUG_INFO).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_LOG_VERBOSE => {\n                writer.write_all(stringify!(CU_JIT_LOG_VERBOSE).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_GENERATE_LINE_INFO => {\n                writer.write_all(stringify!(CU_JIT_GENERATE_LINE_INFO).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_CACHE_MODE => {\n                writer.write_all(stringify!(CU_JIT_CACHE_MODE).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_NEW_SM3X_OPT => {\n                writer.write_all(stringify!(CU_JIT_NEW_SM3X_OPT).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_FAST_COMPILE => {\n                writer.write_all(stringify!(CU_JIT_FAST_COMPILE).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_GLOBAL_SYMBOL_NAMES => {\n                writer.write_all(stringify!(CU_JIT_GLOBAL_SYMBOL_NAMES).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_GLOBAL_SYMBOL_ADDRESSES => {\n                writer.write_all(stringify!(CU_JIT_GLOBAL_SYMBOL_ADDRESSES).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_GLOBAL_SYMBOL_COUNT => {\n                writer.write_all(stringify!(CU_JIT_GLOBAL_SYMBOL_COUNT).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_LTO => {\n                writer.write_all(stringify!(CU_JIT_LTO).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_FTZ => {\n                writer.write_all(stringify!(CU_JIT_FTZ).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_PREC_DIV => {\n                writer.write_all(stringify!(CU_JIT_PREC_DIV).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_PREC_SQRT => {\n                writer.write_all(stringify!(CU_JIT_PREC_SQRT).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_FMA => {\n                writer.write_all(stringify!(CU_JIT_FMA).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_REFERENCED_KERNEL_NAMES => {\n                writer.write_all(stringify!(CU_JIT_REFERENCED_KERNEL_NAMES).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_REFERENCED_KERNEL_COUNT => {\n                writer.write_all(stringify!(CU_JIT_REFERENCED_KERNEL_COUNT).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_REFERENCED_VARIABLE_NAMES => {\n                writer.write_all(stringify!(CU_JIT_REFERENCED_VARIABLE_NAMES).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_REFERENCED_VARIABLE_COUNT => {\n                writer.write_all(stringify!(CU_JIT_REFERENCED_VARIABLE_COUNT).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_OPTIMIZE_UNUSED_DEVICE_VARIABLES => {\n                writer\n                    .write_all(\n                        stringify!(CU_JIT_OPTIMIZE_UNUSED_DEVICE_VARIABLES).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_POSITION_INDEPENDENT_CODE => {\n                writer.write_all(stringify!(CU_JIT_POSITION_INDEPENDENT_CODE).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_MIN_CTA_PER_SM => {\n                writer.write_all(stringify!(CU_JIT_MIN_CTA_PER_SM).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_MAX_THREADS_PER_BLOCK => {\n                writer.write_all(stringify!(CU_JIT_MAX_THREADS_PER_BLOCK).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_OVERRIDE_DIRECTIVE_VALUES => {\n                writer.write_all(stringify!(CU_JIT_OVERRIDE_DIRECTIVE_VALUES).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_SPLIT_COMPILE => {\n                writer.write_all(stringify!(CU_JIT_SPLIT_COMPILE).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_option_enum::CU_JIT_NUM_OPTIONS => {\n                writer.write_all(stringify!(CU_JIT_NUM_OPTIONS).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUjit_target_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_30 => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_30).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_32 => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_32).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_35 => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_35).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_37 => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_37).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_50 => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_50).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_52 => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_52).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_53 => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_53).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_60 => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_60).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_61 => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_61).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_62 => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_62).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_70 => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_70).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_72 => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_72).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_75 => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_75).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_80 => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_80).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_86 => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_86).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_87 => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_87).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_89 => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_89).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_90 => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_90).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_100 => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_100).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_110 => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_110).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_103 => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_103).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_120 => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_120).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_121 => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_121).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_90A => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_90A).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_100A => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_100A).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_110A => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_110A).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_103A => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_103A).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_120A => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_120A).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_121A => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_121A).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_100F => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_100F).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_110F => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_110F).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_103F => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_103F).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_120F => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_120F).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_target_enum::CU_TARGET_COMPUTE_121F => {\n                writer.write_all(stringify!(CU_TARGET_COMPUTE_121F).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUjit_fallback_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUjit_fallback_enum::CU_PREFER_PTX => {\n                writer.write_all(stringify!(CU_PREFER_PTX).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_fallback_enum::CU_PREFER_BINARY => {\n                writer.write_all(stringify!(CU_PREFER_BINARY).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUjit_cacheMode_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUjit_cacheMode_enum::CU_JIT_CACHE_OPTION_NONE => {\n                writer.write_all(stringify!(CU_JIT_CACHE_OPTION_NONE).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_cacheMode_enum::CU_JIT_CACHE_OPTION_CG => {\n                writer.write_all(stringify!(CU_JIT_CACHE_OPTION_CG).as_bytes())\n            }\n            &cuda_types::cuda::CUjit_cacheMode_enum::CU_JIT_CACHE_OPTION_CA => {\n                writer.write_all(stringify!(CU_JIT_CACHE_OPTION_CA).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUjitInputType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUjitInputType_enum::CU_JIT_INPUT_CUBIN => {\n                writer.write_all(stringify!(CU_JIT_INPUT_CUBIN).as_bytes())\n            }\n            &cuda_types::cuda::CUjitInputType_enum::CU_JIT_INPUT_PTX => {\n                writer.write_all(stringify!(CU_JIT_INPUT_PTX).as_bytes())\n            }\n            &cuda_types::cuda::CUjitInputType_enum::CU_JIT_INPUT_FATBINARY => {\n                writer.write_all(stringify!(CU_JIT_INPUT_FATBINARY).as_bytes())\n            }\n            &cuda_types::cuda::CUjitInputType_enum::CU_JIT_INPUT_OBJECT => {\n                writer.write_all(stringify!(CU_JIT_INPUT_OBJECT).as_bytes())\n            }\n            &cuda_types::cuda::CUjitInputType_enum::CU_JIT_INPUT_LIBRARY => {\n                writer.write_all(stringify!(CU_JIT_INPUT_LIBRARY).as_bytes())\n            }\n            &cuda_types::cuda::CUjitInputType_enum::CU_JIT_INPUT_NVVM => {\n                writer.write_all(stringify!(CU_JIT_INPUT_NVVM).as_bytes())\n            }\n            &cuda_types::cuda::CUjitInputType_enum::CU_JIT_NUM_INPUT_TYPES => {\n                writer.write_all(stringify!(CU_JIT_NUM_INPUT_TYPES).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUlinkState {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUgraphicsRegisterFlags_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUgraphicsRegisterFlags_enum::CU_GRAPHICS_REGISTER_FLAGS_NONE => {\n                writer.write_all(stringify!(CU_GRAPHICS_REGISTER_FLAGS_NONE).as_bytes())\n            }\n            &cuda_types::cuda::CUgraphicsRegisterFlags_enum::CU_GRAPHICS_REGISTER_FLAGS_READ_ONLY => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPHICS_REGISTER_FLAGS_READ_ONLY).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphicsRegisterFlags_enum::CU_GRAPHICS_REGISTER_FLAGS_WRITE_DISCARD => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPHICS_REGISTER_FLAGS_WRITE_DISCARD).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphicsRegisterFlags_enum::CU_GRAPHICS_REGISTER_FLAGS_SURFACE_LDST => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPHICS_REGISTER_FLAGS_SURFACE_LDST).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphicsRegisterFlags_enum::CU_GRAPHICS_REGISTER_FLAGS_TEXTURE_GATHER => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPHICS_REGISTER_FLAGS_TEXTURE_GATHER).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUgraphicsMapResourceFlags_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUgraphicsMapResourceFlags_enum::CU_GRAPHICS_MAP_RESOURCE_FLAGS_NONE => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPHICS_MAP_RESOURCE_FLAGS_NONE).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphicsMapResourceFlags_enum::CU_GRAPHICS_MAP_RESOURCE_FLAGS_READ_ONLY => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPHICS_MAP_RESOURCE_FLAGS_READ_ONLY).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphicsMapResourceFlags_enum::CU_GRAPHICS_MAP_RESOURCE_FLAGS_WRITE_DISCARD => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPHICS_MAP_RESOURCE_FLAGS_WRITE_DISCARD)\n                            .as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUarray_cubemap_face_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUarray_cubemap_face_enum::CU_CUBEMAP_FACE_POSITIVE_X => {\n                writer.write_all(stringify!(CU_CUBEMAP_FACE_POSITIVE_X).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_cubemap_face_enum::CU_CUBEMAP_FACE_NEGATIVE_X => {\n                writer.write_all(stringify!(CU_CUBEMAP_FACE_NEGATIVE_X).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_cubemap_face_enum::CU_CUBEMAP_FACE_POSITIVE_Y => {\n                writer.write_all(stringify!(CU_CUBEMAP_FACE_POSITIVE_Y).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_cubemap_face_enum::CU_CUBEMAP_FACE_NEGATIVE_Y => {\n                writer.write_all(stringify!(CU_CUBEMAP_FACE_NEGATIVE_Y).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_cubemap_face_enum::CU_CUBEMAP_FACE_POSITIVE_Z => {\n                writer.write_all(stringify!(CU_CUBEMAP_FACE_POSITIVE_Z).as_bytes())\n            }\n            &cuda_types::cuda::CUarray_cubemap_face_enum::CU_CUBEMAP_FACE_NEGATIVE_Z => {\n                writer.write_all(stringify!(CU_CUBEMAP_FACE_NEGATIVE_Z).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUlimit_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUlimit_enum::CU_LIMIT_STACK_SIZE => {\n                writer.write_all(stringify!(CU_LIMIT_STACK_SIZE).as_bytes())\n            }\n            &cuda_types::cuda::CUlimit_enum::CU_LIMIT_PRINTF_FIFO_SIZE => {\n                writer.write_all(stringify!(CU_LIMIT_PRINTF_FIFO_SIZE).as_bytes())\n            }\n            &cuda_types::cuda::CUlimit_enum::CU_LIMIT_MALLOC_HEAP_SIZE => {\n                writer.write_all(stringify!(CU_LIMIT_MALLOC_HEAP_SIZE).as_bytes())\n            }\n            &cuda_types::cuda::CUlimit_enum::CU_LIMIT_DEV_RUNTIME_SYNC_DEPTH => {\n                writer.write_all(stringify!(CU_LIMIT_DEV_RUNTIME_SYNC_DEPTH).as_bytes())\n            }\n            &cuda_types::cuda::CUlimit_enum::CU_LIMIT_DEV_RUNTIME_PENDING_LAUNCH_COUNT => {\n                writer\n                    .write_all(\n                        stringify!(CU_LIMIT_DEV_RUNTIME_PENDING_LAUNCH_COUNT).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUlimit_enum::CU_LIMIT_MAX_L2_FETCH_GRANULARITY => {\n                writer\n                    .write_all(stringify!(CU_LIMIT_MAX_L2_FETCH_GRANULARITY).as_bytes())\n            }\n            &cuda_types::cuda::CUlimit_enum::CU_LIMIT_PERSISTING_L2_CACHE_SIZE => {\n                writer\n                    .write_all(stringify!(CU_LIMIT_PERSISTING_L2_CACHE_SIZE).as_bytes())\n            }\n            &cuda_types::cuda::CUlimit_enum::CU_LIMIT_SHMEM_SIZE => {\n                writer.write_all(stringify!(CU_LIMIT_SHMEM_SIZE).as_bytes())\n            }\n            &cuda_types::cuda::CUlimit_enum::CU_LIMIT_CIG_ENABLED => {\n                writer.write_all(stringify!(CU_LIMIT_CIG_ENABLED).as_bytes())\n            }\n            &cuda_types::cuda::CUlimit_enum::CU_LIMIT_CIG_SHMEM_FALLBACK_ENABLED => {\n                writer\n                    .write_all(\n                        stringify!(CU_LIMIT_CIG_SHMEM_FALLBACK_ENABLED).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUlimit_enum::CU_LIMIT_MAX => {\n                writer.write_all(stringify!(CU_LIMIT_MAX).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUresourcetype_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUresourcetype_enum::CU_RESOURCE_TYPE_ARRAY => {\n                writer.write_all(stringify!(CU_RESOURCE_TYPE_ARRAY).as_bytes())\n            }\n            &cuda_types::cuda::CUresourcetype_enum::CU_RESOURCE_TYPE_MIPMAPPED_ARRAY => {\n                writer.write_all(stringify!(CU_RESOURCE_TYPE_MIPMAPPED_ARRAY).as_bytes())\n            }\n            &cuda_types::cuda::CUresourcetype_enum::CU_RESOURCE_TYPE_LINEAR => {\n                writer.write_all(stringify!(CU_RESOURCE_TYPE_LINEAR).as_bytes())\n            }\n            &cuda_types::cuda::CUresourcetype_enum::CU_RESOURCE_TYPE_PITCH2D => {\n                writer.write_all(stringify!(CU_RESOURCE_TYPE_PITCH2D).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUhostFn {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(\n            writer,\n            \"{:p}\",\n            unsafe {\n                std::mem::transmute::<\n                    cuda_types::cuda::CUhostFn,\n                    *mut ::std::ffi::c_void,\n                >(*self)\n            },\n        )\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUaccessProperty_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUaccessProperty_enum::CU_ACCESS_PROPERTY_NORMAL => {\n                writer.write_all(stringify!(CU_ACCESS_PROPERTY_NORMAL).as_bytes())\n            }\n            &cuda_types::cuda::CUaccessProperty_enum::CU_ACCESS_PROPERTY_STREAMING => {\n                writer.write_all(stringify!(CU_ACCESS_PROPERTY_STREAMING).as_bytes())\n            }\n            &cuda_types::cuda::CUaccessProperty_enum::CU_ACCESS_PROPERTY_PERSISTING => {\n                writer.write_all(stringify!(CU_ACCESS_PROPERTY_PERSISTING).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUaccessPolicyWindow_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(base_ptr), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.base_ptr, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(num_bytes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.num_bytes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(hitRatio), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.hitRatio, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(hitProp), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.hitProp, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(missProp), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.missProp, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_KERNEL_NODE_PARAMS_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(func), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.func, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(gridDimX), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.gridDimX, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(gridDimY), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.gridDimY, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(gridDimZ), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.gridDimZ, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(blockDimX), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.blockDimX, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(blockDimY), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.blockDimY, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(blockDimZ), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.blockDimZ, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sharedMemBytes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sharedMemBytes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(kernelParams), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.kernelParams, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(extra), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.extra, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_KERNEL_NODE_PARAMS_v2_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(func), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.func, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(gridDimX), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.gridDimX, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(gridDimY), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.gridDimY, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(gridDimZ), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.gridDimZ, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(blockDimX), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.blockDimX, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(blockDimY), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.blockDimY, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(blockDimZ), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.blockDimZ, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sharedMemBytes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sharedMemBytes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(kernelParams), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.kernelParams, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(extra), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.extra, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(kern), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.kern, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(ctx), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.ctx, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_KERNEL_NODE_PARAMS_v3_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(func), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.func, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(gridDimX), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.gridDimX, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(gridDimY), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.gridDimY, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(gridDimZ), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.gridDimZ, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(blockDimX), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.blockDimX, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(blockDimY), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.blockDimY, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(blockDimZ), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.blockDimZ, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sharedMemBytes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sharedMemBytes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(kernelParams), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.kernelParams, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(extra), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.extra, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(kern), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.kern, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(ctx), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.ctx, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_MEMSET_NODE_PARAMS_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(dst), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dst, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(pitch), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.pitch, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(value), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.value, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(elementSize), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.elementSize, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(width), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.width, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(height), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.height, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_MEMSET_NODE_PARAMS_v2_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(dst), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dst, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(pitch), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.pitch, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(value), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.value, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(elementSize), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.elementSize, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(width), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.width, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(height), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.height, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(ctx), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.ctx, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_HOST_NODE_PARAMS_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(fn_), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.fn_, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(userData), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.userData, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_HOST_NODE_PARAMS_v2_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(fn_), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.fn_, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(userData), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.userData, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUgraphConditionalNodeType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUgraphConditionalNodeType_enum::CU_GRAPH_COND_TYPE_IF => {\n                writer.write_all(stringify!(CU_GRAPH_COND_TYPE_IF).as_bytes())\n            }\n            &cuda_types::cuda::CUgraphConditionalNodeType_enum::CU_GRAPH_COND_TYPE_WHILE => {\n                writer.write_all(stringify!(CU_GRAPH_COND_TYPE_WHILE).as_bytes())\n            }\n            &cuda_types::cuda::CUgraphConditionalNodeType_enum::CU_GRAPH_COND_TYPE_SWITCH => {\n                writer.write_all(stringify!(CU_GRAPH_COND_TYPE_SWITCH).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_CONDITIONAL_NODE_PARAMS {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(handle), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.handle, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(type_), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.type_, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(size), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.size, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(phGraph_out), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.phGraph_out, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(ctx), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.ctx, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUgraphNodeType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUgraphNodeType_enum::CU_GRAPH_NODE_TYPE_KERNEL => {\n                writer.write_all(stringify!(CU_GRAPH_NODE_TYPE_KERNEL).as_bytes())\n            }\n            &cuda_types::cuda::CUgraphNodeType_enum::CU_GRAPH_NODE_TYPE_MEMCPY => {\n                writer.write_all(stringify!(CU_GRAPH_NODE_TYPE_MEMCPY).as_bytes())\n            }\n            &cuda_types::cuda::CUgraphNodeType_enum::CU_GRAPH_NODE_TYPE_MEMSET => {\n                writer.write_all(stringify!(CU_GRAPH_NODE_TYPE_MEMSET).as_bytes())\n            }\n            &cuda_types::cuda::CUgraphNodeType_enum::CU_GRAPH_NODE_TYPE_HOST => {\n                writer.write_all(stringify!(CU_GRAPH_NODE_TYPE_HOST).as_bytes())\n            }\n            &cuda_types::cuda::CUgraphNodeType_enum::CU_GRAPH_NODE_TYPE_GRAPH => {\n                writer.write_all(stringify!(CU_GRAPH_NODE_TYPE_GRAPH).as_bytes())\n            }\n            &cuda_types::cuda::CUgraphNodeType_enum::CU_GRAPH_NODE_TYPE_EMPTY => {\n                writer.write_all(stringify!(CU_GRAPH_NODE_TYPE_EMPTY).as_bytes())\n            }\n            &cuda_types::cuda::CUgraphNodeType_enum::CU_GRAPH_NODE_TYPE_WAIT_EVENT => {\n                writer.write_all(stringify!(CU_GRAPH_NODE_TYPE_WAIT_EVENT).as_bytes())\n            }\n            &cuda_types::cuda::CUgraphNodeType_enum::CU_GRAPH_NODE_TYPE_EVENT_RECORD => {\n                writer.write_all(stringify!(CU_GRAPH_NODE_TYPE_EVENT_RECORD).as_bytes())\n            }\n            &cuda_types::cuda::CUgraphNodeType_enum::CU_GRAPH_NODE_TYPE_EXT_SEMAS_SIGNAL => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPH_NODE_TYPE_EXT_SEMAS_SIGNAL).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphNodeType_enum::CU_GRAPH_NODE_TYPE_EXT_SEMAS_WAIT => {\n                writer\n                    .write_all(stringify!(CU_GRAPH_NODE_TYPE_EXT_SEMAS_WAIT).as_bytes())\n            }\n            &cuda_types::cuda::CUgraphNodeType_enum::CU_GRAPH_NODE_TYPE_MEM_ALLOC => {\n                writer.write_all(stringify!(CU_GRAPH_NODE_TYPE_MEM_ALLOC).as_bytes())\n            }\n            &cuda_types::cuda::CUgraphNodeType_enum::CU_GRAPH_NODE_TYPE_MEM_FREE => {\n                writer.write_all(stringify!(CU_GRAPH_NODE_TYPE_MEM_FREE).as_bytes())\n            }\n            &cuda_types::cuda::CUgraphNodeType_enum::CU_GRAPH_NODE_TYPE_BATCH_MEM_OP => {\n                writer.write_all(stringify!(CU_GRAPH_NODE_TYPE_BATCH_MEM_OP).as_bytes())\n            }\n            &cuda_types::cuda::CUgraphNodeType_enum::CU_GRAPH_NODE_TYPE_CONDITIONAL => {\n                writer.write_all(stringify!(CU_GRAPH_NODE_TYPE_CONDITIONAL).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUgraphDependencyType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUgraphDependencyType_enum::CU_GRAPH_DEPENDENCY_TYPE_DEFAULT => {\n                writer.write_all(stringify!(CU_GRAPH_DEPENDENCY_TYPE_DEFAULT).as_bytes())\n            }\n            &cuda_types::cuda::CUgraphDependencyType_enum::CU_GRAPH_DEPENDENCY_TYPE_PROGRAMMATIC => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPH_DEPENDENCY_TYPE_PROGRAMMATIC).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUgraphEdgeData_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(from_port), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.from_port, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(to_port), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.to_port, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(type_), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.type_, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUgraphInstantiateResult_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUgraphInstantiateResult_enum::CUDA_GRAPH_INSTANTIATE_SUCCESS => {\n                writer.write_all(stringify!(CUDA_GRAPH_INSTANTIATE_SUCCESS).as_bytes())\n            }\n            &cuda_types::cuda::CUgraphInstantiateResult_enum::CUDA_GRAPH_INSTANTIATE_ERROR => {\n                writer.write_all(stringify!(CUDA_GRAPH_INSTANTIATE_ERROR).as_bytes())\n            }\n            &cuda_types::cuda::CUgraphInstantiateResult_enum::CUDA_GRAPH_INSTANTIATE_INVALID_STRUCTURE => {\n                writer\n                    .write_all(\n                        stringify!(CUDA_GRAPH_INSTANTIATE_INVALID_STRUCTURE).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphInstantiateResult_enum::CUDA_GRAPH_INSTANTIATE_NODE_OPERATION_NOT_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CUDA_GRAPH_INSTANTIATE_NODE_OPERATION_NOT_SUPPORTED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphInstantiateResult_enum::CUDA_GRAPH_INSTANTIATE_MULTIPLE_CTXS_NOT_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CUDA_GRAPH_INSTANTIATE_MULTIPLE_CTXS_NOT_SUPPORTED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphInstantiateResult_enum::CUDA_GRAPH_INSTANTIATE_CONDITIONAL_HANDLE_UNUSED => {\n                writer\n                    .write_all(\n                        stringify!(CUDA_GRAPH_INSTANTIATE_CONDITIONAL_HANDLE_UNUSED)\n                            .as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_GRAPH_INSTANTIATE_PARAMS_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(flags), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.flags, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(hUploadStream), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.hUploadStream, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(hErrNode_out), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.hErrNode_out, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(result_out), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.result_out, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUsynchronizationPolicy_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUsynchronizationPolicy_enum::CU_SYNC_POLICY_AUTO => {\n                writer.write_all(stringify!(CU_SYNC_POLICY_AUTO).as_bytes())\n            }\n            &cuda_types::cuda::CUsynchronizationPolicy_enum::CU_SYNC_POLICY_SPIN => {\n                writer.write_all(stringify!(CU_SYNC_POLICY_SPIN).as_bytes())\n            }\n            &cuda_types::cuda::CUsynchronizationPolicy_enum::CU_SYNC_POLICY_YIELD => {\n                writer.write_all(stringify!(CU_SYNC_POLICY_YIELD).as_bytes())\n            }\n            &cuda_types::cuda::CUsynchronizationPolicy_enum::CU_SYNC_POLICY_BLOCKING_SYNC => {\n                writer.write_all(stringify!(CU_SYNC_POLICY_BLOCKING_SYNC).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUclusterSchedulingPolicy_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUclusterSchedulingPolicy_enum::CU_CLUSTER_SCHEDULING_POLICY_DEFAULT => {\n                writer\n                    .write_all(\n                        stringify!(CU_CLUSTER_SCHEDULING_POLICY_DEFAULT).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUclusterSchedulingPolicy_enum::CU_CLUSTER_SCHEDULING_POLICY_SPREAD => {\n                writer\n                    .write_all(\n                        stringify!(CU_CLUSTER_SCHEDULING_POLICY_SPREAD).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUclusterSchedulingPolicy_enum::CU_CLUSTER_SCHEDULING_POLICY_LOAD_BALANCING => {\n                writer\n                    .write_all(\n                        stringify!(CU_CLUSTER_SCHEDULING_POLICY_LOAD_BALANCING)\n                            .as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUlaunchMemSyncDomain_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUlaunchMemSyncDomain_enum::CU_LAUNCH_MEM_SYNC_DOMAIN_DEFAULT => {\n                writer\n                    .write_all(stringify!(CU_LAUNCH_MEM_SYNC_DOMAIN_DEFAULT).as_bytes())\n            }\n            &cuda_types::cuda::CUlaunchMemSyncDomain_enum::CU_LAUNCH_MEM_SYNC_DOMAIN_REMOTE => {\n                writer.write_all(stringify!(CU_LAUNCH_MEM_SYNC_DOMAIN_REMOTE).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUlaunchMemSyncDomainMap_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(default_), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.default_, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(remote), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.remote, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUlaunchAttributeID_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUlaunchAttributeID_enum::CU_LAUNCH_ATTRIBUTE_IGNORE => {\n                writer.write_all(stringify!(CU_LAUNCH_ATTRIBUTE_IGNORE).as_bytes())\n            }\n            &cuda_types::cuda::CUlaunchAttributeID_enum::CU_LAUNCH_ATTRIBUTE_ACCESS_POLICY_WINDOW => {\n                writer\n                    .write_all(\n                        stringify!(CU_LAUNCH_ATTRIBUTE_ACCESS_POLICY_WINDOW).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUlaunchAttributeID_enum::CU_LAUNCH_ATTRIBUTE_COOPERATIVE => {\n                writer.write_all(stringify!(CU_LAUNCH_ATTRIBUTE_COOPERATIVE).as_bytes())\n            }\n            &cuda_types::cuda::CUlaunchAttributeID_enum::CU_LAUNCH_ATTRIBUTE_SYNCHRONIZATION_POLICY => {\n                writer\n                    .write_all(\n                        stringify!(CU_LAUNCH_ATTRIBUTE_SYNCHRONIZATION_POLICY).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUlaunchAttributeID_enum::CU_LAUNCH_ATTRIBUTE_CLUSTER_DIMENSION => {\n                writer\n                    .write_all(\n                        stringify!(CU_LAUNCH_ATTRIBUTE_CLUSTER_DIMENSION).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUlaunchAttributeID_enum::CU_LAUNCH_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_LAUNCH_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUlaunchAttributeID_enum::CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_STREAM_SERIALIZATION => {\n                writer\n                    .write_all(\n                        stringify!(CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_STREAM_SERIALIZATION)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUlaunchAttributeID_enum::CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_EVENT => {\n                writer\n                    .write_all(\n                        stringify!(CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_EVENT).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUlaunchAttributeID_enum::CU_LAUNCH_ATTRIBUTE_PRIORITY => {\n                writer.write_all(stringify!(CU_LAUNCH_ATTRIBUTE_PRIORITY).as_bytes())\n            }\n            &cuda_types::cuda::CUlaunchAttributeID_enum::CU_LAUNCH_ATTRIBUTE_MEM_SYNC_DOMAIN_MAP => {\n                writer\n                    .write_all(\n                        stringify!(CU_LAUNCH_ATTRIBUTE_MEM_SYNC_DOMAIN_MAP).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUlaunchAttributeID_enum::CU_LAUNCH_ATTRIBUTE_MEM_SYNC_DOMAIN => {\n                writer\n                    .write_all(\n                        stringify!(CU_LAUNCH_ATTRIBUTE_MEM_SYNC_DOMAIN).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUlaunchAttributeID_enum::CU_LAUNCH_ATTRIBUTE_PREFERRED_CLUSTER_DIMENSION => {\n                writer\n                    .write_all(\n                        stringify!(CU_LAUNCH_ATTRIBUTE_PREFERRED_CLUSTER_DIMENSION)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUlaunchAttributeID_enum::CU_LAUNCH_ATTRIBUTE_LAUNCH_COMPLETION_EVENT => {\n                writer\n                    .write_all(\n                        stringify!(CU_LAUNCH_ATTRIBUTE_LAUNCH_COMPLETION_EVENT)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUlaunchAttributeID_enum::CU_LAUNCH_ATTRIBUTE_DEVICE_UPDATABLE_KERNEL_NODE => {\n                writer\n                    .write_all(\n                        stringify!(CU_LAUNCH_ATTRIBUTE_DEVICE_UPDATABLE_KERNEL_NODE)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUlaunchAttributeID_enum::CU_LAUNCH_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT => {\n                writer\n                    .write_all(\n                        stringify!(CU_LAUNCH_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUlaunchAttributeID_enum::CU_LAUNCH_ATTRIBUTE_NVLINK_UTIL_CENTRIC_SCHEDULING => {\n                writer\n                    .write_all(\n                        stringify!(CU_LAUNCH_ATTRIBUTE_NVLINK_UTIL_CENTRIC_SCHEDULING)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUlaunchAttributeID_enum::CU_LAUNCH_ATTRIBUTE_MAX => {\n                writer.write_all(stringify!(CU_LAUNCH_ATTRIBUTE_MAX).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::cuda::CUlaunchAttributeValue_union__bindgen_ty_1 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(x), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.x, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(y), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.y, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(z), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.z, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::cuda::CUlaunchAttributeValue_union__bindgen_ty_2 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(event), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.event, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(flags), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.flags, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(triggerAtBlockStart), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.triggerAtBlockStart, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::cuda::CUlaunchAttributeValue_union__bindgen_ty_3 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(event), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.event, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(flags), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.flags, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::cuda::CUlaunchAttributeValue_union__bindgen_ty_4 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(x), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.x, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(y), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.y, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(z), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.z, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::cuda::CUlaunchAttributeValue_union__bindgen_ty_5 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(deviceUpdatable), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.deviceUpdatable, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(devNode), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.devNode, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUstreamCaptureStatus_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUstreamCaptureStatus_enum::CU_STREAM_CAPTURE_STATUS_NONE => {\n                writer.write_all(stringify!(CU_STREAM_CAPTURE_STATUS_NONE).as_bytes())\n            }\n            &cuda_types::cuda::CUstreamCaptureStatus_enum::CU_STREAM_CAPTURE_STATUS_ACTIVE => {\n                writer.write_all(stringify!(CU_STREAM_CAPTURE_STATUS_ACTIVE).as_bytes())\n            }\n            &cuda_types::cuda::CUstreamCaptureStatus_enum::CU_STREAM_CAPTURE_STATUS_INVALIDATED => {\n                writer\n                    .write_all(\n                        stringify!(CU_STREAM_CAPTURE_STATUS_INVALIDATED).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUstreamCaptureMode_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUstreamCaptureMode_enum::CU_STREAM_CAPTURE_MODE_GLOBAL => {\n                writer.write_all(stringify!(CU_STREAM_CAPTURE_MODE_GLOBAL).as_bytes())\n            }\n            &cuda_types::cuda::CUstreamCaptureMode_enum::CU_STREAM_CAPTURE_MODE_THREAD_LOCAL => {\n                writer\n                    .write_all(\n                        stringify!(CU_STREAM_CAPTURE_MODE_THREAD_LOCAL).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUstreamCaptureMode_enum::CU_STREAM_CAPTURE_MODE_RELAXED => {\n                writer.write_all(stringify!(CU_STREAM_CAPTURE_MODE_RELAXED).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUdriverProcAddress_flags_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUdriverProcAddress_flags_enum::CU_GET_PROC_ADDRESS_DEFAULT => {\n                writer.write_all(stringify!(CU_GET_PROC_ADDRESS_DEFAULT).as_bytes())\n            }\n            &cuda_types::cuda::CUdriverProcAddress_flags_enum::CU_GET_PROC_ADDRESS_LEGACY_STREAM => {\n                writer\n                    .write_all(stringify!(CU_GET_PROC_ADDRESS_LEGACY_STREAM).as_bytes())\n            }\n            &cuda_types::cuda::CUdriverProcAddress_flags_enum::CU_GET_PROC_ADDRESS_PER_THREAD_DEFAULT_STREAM => {\n                writer\n                    .write_all(\n                        stringify!(CU_GET_PROC_ADDRESS_PER_THREAD_DEFAULT_STREAM)\n                            .as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUdriverProcAddressQueryResult_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUdriverProcAddressQueryResult_enum::CU_GET_PROC_ADDRESS_SUCCESS => {\n                writer.write_all(stringify!(CU_GET_PROC_ADDRESS_SUCCESS).as_bytes())\n            }\n            &cuda_types::cuda::CUdriverProcAddressQueryResult_enum::CU_GET_PROC_ADDRESS_SYMBOL_NOT_FOUND => {\n                writer\n                    .write_all(\n                        stringify!(CU_GET_PROC_ADDRESS_SYMBOL_NOT_FOUND).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdriverProcAddressQueryResult_enum::CU_GET_PROC_ADDRESS_VERSION_NOT_SUFFICIENT => {\n                writer\n                    .write_all(\n                        stringify!(CU_GET_PROC_ADDRESS_VERSION_NOT_SUFFICIENT).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUexecAffinityType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUexecAffinityType_enum::CU_EXEC_AFFINITY_TYPE_SM_COUNT => {\n                writer.write_all(stringify!(CU_EXEC_AFFINITY_TYPE_SM_COUNT).as_bytes())\n            }\n            &cuda_types::cuda::CUexecAffinityType_enum::CU_EXEC_AFFINITY_TYPE_MAX => {\n                writer.write_all(stringify!(CU_EXEC_AFFINITY_TYPE_MAX).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUexecAffinitySmCount_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(val), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.val, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUcigDataType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUcigDataType_enum::CIG_DATA_TYPE_D3D12_COMMAND_QUEUE => {\n                writer\n                    .write_all(stringify!(CIG_DATA_TYPE_D3D12_COMMAND_QUEUE).as_bytes())\n            }\n            &cuda_types::cuda::CUcigDataType_enum::CIG_DATA_TYPE_NV_BLOB => {\n                writer.write_all(stringify!(CIG_DATA_TYPE_NV_BLOB).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUctxCigParam_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(sharedDataType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sharedDataType, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sharedData), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sharedData, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUctxCreateParams_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer\n            .write_all(concat!(\"{ \", stringify!(execAffinityParams), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.execAffinityParams, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(numExecAffinityParams), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.numExecAffinityParams, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(cigParams), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.cigParams, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUlibraryOption_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUlibraryOption_enum::CU_LIBRARY_HOST_UNIVERSAL_FUNCTION_AND_DATA_TABLE => {\n                writer\n                    .write_all(\n                        stringify!(CU_LIBRARY_HOST_UNIVERSAL_FUNCTION_AND_DATA_TABLE)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUlibraryOption_enum::CU_LIBRARY_BINARY_IS_PRESERVED => {\n                writer.write_all(stringify!(CU_LIBRARY_BINARY_IS_PRESERVED).as_bytes())\n            }\n            &cuda_types::cuda::CUlibraryOption_enum::CU_LIBRARY_NUM_OPTIONS => {\n                writer.write_all(stringify!(CU_LIBRARY_NUM_OPTIONS).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::cuda::CUlibraryHostUniversalFunctionAndDataTable_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(functionTable), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.functionTable, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(functionWindowSize), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.functionWindowSize, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dataTable), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dataTable, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dataWindowSize), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dataWindowSize, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUdevice_P2PAttribute_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUdevice_P2PAttribute_enum::CU_DEVICE_P2P_ATTRIBUTE_PERFORMANCE_RANK => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_P2P_ATTRIBUTE_PERFORMANCE_RANK).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_P2PAttribute_enum::CU_DEVICE_P2P_ATTRIBUTE_ACCESS_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_P2P_ATTRIBUTE_ACCESS_SUPPORTED).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_P2PAttribute_enum::CU_DEVICE_P2P_ATTRIBUTE_NATIVE_ATOMIC_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_P2P_ATTRIBUTE_NATIVE_ATOMIC_SUPPORTED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_P2PAttribute_enum::CU_DEVICE_P2P_ATTRIBUTE_ACCESS_ACCESS_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_P2P_ATTRIBUTE_ACCESS_ACCESS_SUPPORTED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_P2PAttribute_enum::CU_DEVICE_P2P_ATTRIBUTE_CUDA_ARRAY_ACCESS_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEVICE_P2P_ATTRIBUTE_CUDA_ARRAY_ACCESS_SUPPORTED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevice_P2PAttribute_enum::CU_DEVICE_P2P_ATTRIBUTE_ONLY_PARTIAL_NATIVE_ATOMIC_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_DEVICE_P2P_ATTRIBUTE_ONLY_PARTIAL_NATIVE_ATOMIC_SUPPORTED\n                        )\n                            .as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUatomicOperation_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUatomicOperation_enum::CU_ATOMIC_OPERATION_INTEGER_ADD => {\n                writer.write_all(stringify!(CU_ATOMIC_OPERATION_INTEGER_ADD).as_bytes())\n            }\n            &cuda_types::cuda::CUatomicOperation_enum::CU_ATOMIC_OPERATION_INTEGER_MIN => {\n                writer.write_all(stringify!(CU_ATOMIC_OPERATION_INTEGER_MIN).as_bytes())\n            }\n            &cuda_types::cuda::CUatomicOperation_enum::CU_ATOMIC_OPERATION_INTEGER_MAX => {\n                writer.write_all(stringify!(CU_ATOMIC_OPERATION_INTEGER_MAX).as_bytes())\n            }\n            &cuda_types::cuda::CUatomicOperation_enum::CU_ATOMIC_OPERATION_INTEGER_INCREMENT => {\n                writer\n                    .write_all(\n                        stringify!(CU_ATOMIC_OPERATION_INTEGER_INCREMENT).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUatomicOperation_enum::CU_ATOMIC_OPERATION_INTEGER_DECREMENT => {\n                writer\n                    .write_all(\n                        stringify!(CU_ATOMIC_OPERATION_INTEGER_DECREMENT).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUatomicOperation_enum::CU_ATOMIC_OPERATION_AND => {\n                writer.write_all(stringify!(CU_ATOMIC_OPERATION_AND).as_bytes())\n            }\n            &cuda_types::cuda::CUatomicOperation_enum::CU_ATOMIC_OPERATION_OR => {\n                writer.write_all(stringify!(CU_ATOMIC_OPERATION_OR).as_bytes())\n            }\n            &cuda_types::cuda::CUatomicOperation_enum::CU_ATOMIC_OPERATION_XOR => {\n                writer.write_all(stringify!(CU_ATOMIC_OPERATION_XOR).as_bytes())\n            }\n            &cuda_types::cuda::CUatomicOperation_enum::CU_ATOMIC_OPERATION_EXCHANGE => {\n                writer.write_all(stringify!(CU_ATOMIC_OPERATION_EXCHANGE).as_bytes())\n            }\n            &cuda_types::cuda::CUatomicOperation_enum::CU_ATOMIC_OPERATION_CAS => {\n                writer.write_all(stringify!(CU_ATOMIC_OPERATION_CAS).as_bytes())\n            }\n            &cuda_types::cuda::CUatomicOperation_enum::CU_ATOMIC_OPERATION_FLOAT_ADD => {\n                writer.write_all(stringify!(CU_ATOMIC_OPERATION_FLOAT_ADD).as_bytes())\n            }\n            &cuda_types::cuda::CUatomicOperation_enum::CU_ATOMIC_OPERATION_FLOAT_MIN => {\n                writer.write_all(stringify!(CU_ATOMIC_OPERATION_FLOAT_MIN).as_bytes())\n            }\n            &cuda_types::cuda::CUatomicOperation_enum::CU_ATOMIC_OPERATION_FLOAT_MAX => {\n                writer.write_all(stringify!(CU_ATOMIC_OPERATION_FLOAT_MAX).as_bytes())\n            }\n            &cuda_types::cuda::CUatomicOperation_enum::CU_ATOMIC_OPERATION_MAX => {\n                writer.write_all(stringify!(CU_ATOMIC_OPERATION_MAX).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUatomicOperationCapability_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUatomicOperationCapability_enum::CU_ATOMIC_CAPABILITY_SIGNED => {\n                writer.write_all(stringify!(CU_ATOMIC_CAPABILITY_SIGNED).as_bytes())\n            }\n            &cuda_types::cuda::CUatomicOperationCapability_enum::CU_ATOMIC_CAPABILITY_UNSIGNED => {\n                writer.write_all(stringify!(CU_ATOMIC_CAPABILITY_UNSIGNED).as_bytes())\n            }\n            &cuda_types::cuda::CUatomicOperationCapability_enum::CU_ATOMIC_CAPABILITY_REDUCTION => {\n                writer.write_all(stringify!(CU_ATOMIC_CAPABILITY_REDUCTION).as_bytes())\n            }\n            &cuda_types::cuda::CUatomicOperationCapability_enum::CU_ATOMIC_CAPABILITY_SCALAR_32 => {\n                writer.write_all(stringify!(CU_ATOMIC_CAPABILITY_SCALAR_32).as_bytes())\n            }\n            &cuda_types::cuda::CUatomicOperationCapability_enum::CU_ATOMIC_CAPABILITY_SCALAR_64 => {\n                writer.write_all(stringify!(CU_ATOMIC_CAPABILITY_SCALAR_64).as_bytes())\n            }\n            &cuda_types::cuda::CUatomicOperationCapability_enum::CU_ATOMIC_CAPABILITY_SCALAR_128 => {\n                writer.write_all(stringify!(CU_ATOMIC_CAPABILITY_SCALAR_128).as_bytes())\n            }\n            &cuda_types::cuda::CUatomicOperationCapability_enum::CU_ATOMIC_CAPABILITY_VECTOR_32x4 => {\n                writer.write_all(stringify!(CU_ATOMIC_CAPABILITY_VECTOR_32x4).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUstreamCallback {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(\n            writer,\n            \"{:p}\",\n            unsafe {\n                std::mem::transmute::<\n                    cuda_types::cuda::CUstreamCallback,\n                    *mut ::std::ffi::c_void,\n                >(*self)\n            },\n        )\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUoccupancyB2DSize {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(\n            writer,\n            \"{:p}\",\n            unsafe {\n                std::mem::transmute::<\n                    cuda_types::cuda::CUoccupancyB2DSize,\n                    *mut ::std::ffi::c_void,\n                >(*self)\n            },\n        )\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_MEMCPY2D_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(srcXInBytes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcXInBytes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcY), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcY, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcMemoryType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcMemoryType, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcHost), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcHost, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcDevice), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcDevice, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcArray), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcArray, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcPitch), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcPitch, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstXInBytes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstXInBytes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstY), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstY, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstMemoryType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstMemoryType, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstHost), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstHost, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstDevice), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstDevice, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstArray), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstArray, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstPitch), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstPitch, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(WidthInBytes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.WidthInBytes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(Height), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.Height, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_MEMCPY3D_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(srcXInBytes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcXInBytes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcY), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcY, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcZ), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcZ, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcLOD), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcLOD, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcMemoryType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcMemoryType, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcHost), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcHost, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcDevice), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcDevice, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcArray), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcArray, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcPitch), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcPitch, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcHeight), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcHeight, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstXInBytes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstXInBytes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstY), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstY, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstZ), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstZ, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstLOD), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstLOD, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstMemoryType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstMemoryType, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstHost), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstHost, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstDevice), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstDevice, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstArray), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstArray, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstPitch), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstPitch, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstHeight), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstHeight, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(WidthInBytes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.WidthInBytes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(Height), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.Height, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(Depth), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.Depth, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_MEMCPY3D_PEER_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(srcXInBytes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcXInBytes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcY), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcY, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcZ), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcZ, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcLOD), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcLOD, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcMemoryType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcMemoryType, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcHost), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcHost, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcDevice), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcDevice, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcArray), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcArray, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcContext), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcContext, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcPitch), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcPitch, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcHeight), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcHeight, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstXInBytes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstXInBytes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstY), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstY, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstZ), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstZ, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstLOD), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstLOD, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstMemoryType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstMemoryType, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstHost), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstHost, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstDevice), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstDevice, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstArray), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstArray, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstContext), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstContext, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstPitch), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstPitch, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstHeight), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstHeight, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(WidthInBytes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.WidthInBytes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(Height), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.Height, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(Depth), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.Depth, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_MEMCPY_NODE_PARAMS_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(flags), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.flags, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(copyCtx), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.copyCtx, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(copyParams), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.copyParams, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_ARRAY_DESCRIPTOR_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(Width), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.Width, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(Height), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.Height, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(Format), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.Format, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(NumChannels), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.NumChannels, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_ARRAY3D_DESCRIPTOR_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(Width), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.Width, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(Height), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.Height, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(Depth), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.Depth, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(Format), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.Format, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(NumChannels), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.NumChannels, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(Flags), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.Flags, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_ARRAY_SPARSE_PROPERTIES_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(tileExtent), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.tileExtent, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(miptailFirstLevel), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.miptailFirstLevel, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(miptailSize), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.miptailSize, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(flags), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.flags, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::cuda::CUDA_ARRAY_SPARSE_PROPERTIES_st__bindgen_ty_1 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(width), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.width, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(height), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.height, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(depth), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.depth, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_ARRAY_MEMORY_REQUIREMENTS_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(size), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.size, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(alignment), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.alignment, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::cuda::CUDA_RESOURCE_DESC_st__bindgen_ty_1__bindgen_ty_1 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(hArray), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.hArray, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::cuda::CUDA_RESOURCE_DESC_st__bindgen_ty_1__bindgen_ty_2 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(hMipmappedArray), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.hMipmappedArray, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::cuda::CUDA_RESOURCE_DESC_st__bindgen_ty_1__bindgen_ty_3 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(devPtr), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.devPtr, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(format), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.format, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(numChannels), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.numChannels, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sizeInBytes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sizeInBytes, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::cuda::CUDA_RESOURCE_DESC_st__bindgen_ty_1__bindgen_ty_4 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(devPtr), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.devPtr, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(format), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.format, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(numChannels), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.numChannels, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(width), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.width, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(height), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.height, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(pitchInBytes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.pitchInBytes, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_TEXTURE_DESC_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(addressMode), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.addressMode, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(filterMode), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.filterMode, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(flags), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.flags, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(maxAnisotropy), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.maxAnisotropy, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(mipmapFilterMode), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.mipmapFilterMode, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(mipmapLevelBias), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.mipmapLevelBias, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(minMipmapLevelClamp), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.minMipmapLevelClamp, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(maxMipmapLevelClamp), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.maxMipmapLevelClamp, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(borderColor), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.borderColor, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUresourceViewFormat_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_NONE => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_NONE).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_UINT_1X8 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_UINT_1X8).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_UINT_2X8 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_UINT_2X8).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_UINT_4X8 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_UINT_4X8).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_SINT_1X8 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_SINT_1X8).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_SINT_2X8 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_SINT_2X8).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_SINT_4X8 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_SINT_4X8).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_UINT_1X16 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_UINT_1X16).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_UINT_2X16 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_UINT_2X16).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_UINT_4X16 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_UINT_4X16).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_SINT_1X16 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_SINT_1X16).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_SINT_2X16 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_SINT_2X16).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_SINT_4X16 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_SINT_4X16).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_UINT_1X32 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_UINT_1X32).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_UINT_2X32 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_UINT_2X32).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_UINT_4X32 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_UINT_4X32).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_SINT_1X32 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_SINT_1X32).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_SINT_2X32 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_SINT_2X32).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_SINT_4X32 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_SINT_4X32).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_FLOAT_1X16 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_FLOAT_1X16).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_FLOAT_2X16 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_FLOAT_2X16).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_FLOAT_4X16 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_FLOAT_4X16).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_FLOAT_1X32 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_FLOAT_1X32).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_FLOAT_2X32 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_FLOAT_2X32).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_FLOAT_4X32 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_FLOAT_4X32).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_UNSIGNED_BC1 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_UNSIGNED_BC1).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_UNSIGNED_BC2 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_UNSIGNED_BC2).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_UNSIGNED_BC3 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_UNSIGNED_BC3).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_UNSIGNED_BC4 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_UNSIGNED_BC4).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_SIGNED_BC4 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_SIGNED_BC4).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_UNSIGNED_BC5 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_UNSIGNED_BC5).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_SIGNED_BC5 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_SIGNED_BC5).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_UNSIGNED_BC6H => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_UNSIGNED_BC6H).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_SIGNED_BC6H => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_SIGNED_BC6H).as_bytes())\n            }\n            &cuda_types::cuda::CUresourceViewFormat_enum::CU_RES_VIEW_FORMAT_UNSIGNED_BC7 => {\n                writer.write_all(stringify!(CU_RES_VIEW_FORMAT_UNSIGNED_BC7).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_RESOURCE_VIEW_DESC_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(format), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.format, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(width), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.width, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(height), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.height, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(depth), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.depth, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(firstMipmapLevel), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.firstMipmapLevel, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(lastMipmapLevel), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.lastMipmapLevel, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(firstLayer), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.firstLayer, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(lastLayer), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.lastLayer, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUtensorMap_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(opaque), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.opaque, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUtensorMapDataType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUtensorMapDataType_enum::CU_TENSOR_MAP_DATA_TYPE_UINT8 => {\n                writer.write_all(stringify!(CU_TENSOR_MAP_DATA_TYPE_UINT8).as_bytes())\n            }\n            &cuda_types::cuda::CUtensorMapDataType_enum::CU_TENSOR_MAP_DATA_TYPE_UINT16 => {\n                writer.write_all(stringify!(CU_TENSOR_MAP_DATA_TYPE_UINT16).as_bytes())\n            }\n            &cuda_types::cuda::CUtensorMapDataType_enum::CU_TENSOR_MAP_DATA_TYPE_UINT32 => {\n                writer.write_all(stringify!(CU_TENSOR_MAP_DATA_TYPE_UINT32).as_bytes())\n            }\n            &cuda_types::cuda::CUtensorMapDataType_enum::CU_TENSOR_MAP_DATA_TYPE_INT32 => {\n                writer.write_all(stringify!(CU_TENSOR_MAP_DATA_TYPE_INT32).as_bytes())\n            }\n            &cuda_types::cuda::CUtensorMapDataType_enum::CU_TENSOR_MAP_DATA_TYPE_UINT64 => {\n                writer.write_all(stringify!(CU_TENSOR_MAP_DATA_TYPE_UINT64).as_bytes())\n            }\n            &cuda_types::cuda::CUtensorMapDataType_enum::CU_TENSOR_MAP_DATA_TYPE_INT64 => {\n                writer.write_all(stringify!(CU_TENSOR_MAP_DATA_TYPE_INT64).as_bytes())\n            }\n            &cuda_types::cuda::CUtensorMapDataType_enum::CU_TENSOR_MAP_DATA_TYPE_FLOAT16 => {\n                writer.write_all(stringify!(CU_TENSOR_MAP_DATA_TYPE_FLOAT16).as_bytes())\n            }\n            &cuda_types::cuda::CUtensorMapDataType_enum::CU_TENSOR_MAP_DATA_TYPE_FLOAT32 => {\n                writer.write_all(stringify!(CU_TENSOR_MAP_DATA_TYPE_FLOAT32).as_bytes())\n            }\n            &cuda_types::cuda::CUtensorMapDataType_enum::CU_TENSOR_MAP_DATA_TYPE_FLOAT64 => {\n                writer.write_all(stringify!(CU_TENSOR_MAP_DATA_TYPE_FLOAT64).as_bytes())\n            }\n            &cuda_types::cuda::CUtensorMapDataType_enum::CU_TENSOR_MAP_DATA_TYPE_BFLOAT16 => {\n                writer.write_all(stringify!(CU_TENSOR_MAP_DATA_TYPE_BFLOAT16).as_bytes())\n            }\n            &cuda_types::cuda::CUtensorMapDataType_enum::CU_TENSOR_MAP_DATA_TYPE_FLOAT32_FTZ => {\n                writer\n                    .write_all(\n                        stringify!(CU_TENSOR_MAP_DATA_TYPE_FLOAT32_FTZ).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUtensorMapDataType_enum::CU_TENSOR_MAP_DATA_TYPE_TFLOAT32 => {\n                writer.write_all(stringify!(CU_TENSOR_MAP_DATA_TYPE_TFLOAT32).as_bytes())\n            }\n            &cuda_types::cuda::CUtensorMapDataType_enum::CU_TENSOR_MAP_DATA_TYPE_TFLOAT32_FTZ => {\n                writer\n                    .write_all(\n                        stringify!(CU_TENSOR_MAP_DATA_TYPE_TFLOAT32_FTZ).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUtensorMapDataType_enum::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN8B => {\n                writer\n                    .write_all(\n                        stringify!(CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN8B).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUtensorMapDataType_enum::CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN16B => {\n                writer\n                    .write_all(\n                        stringify!(CU_TENSOR_MAP_DATA_TYPE_16U4_ALIGN16B).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUtensorMapDataType_enum::CU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B => {\n                writer\n                    .write_all(\n                        stringify!(CU_TENSOR_MAP_DATA_TYPE_16U6_ALIGN16B).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUtensorMapInterleave_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUtensorMapInterleave_enum::CU_TENSOR_MAP_INTERLEAVE_NONE => {\n                writer.write_all(stringify!(CU_TENSOR_MAP_INTERLEAVE_NONE).as_bytes())\n            }\n            &cuda_types::cuda::CUtensorMapInterleave_enum::CU_TENSOR_MAP_INTERLEAVE_16B => {\n                writer.write_all(stringify!(CU_TENSOR_MAP_INTERLEAVE_16B).as_bytes())\n            }\n            &cuda_types::cuda::CUtensorMapInterleave_enum::CU_TENSOR_MAP_INTERLEAVE_32B => {\n                writer.write_all(stringify!(CU_TENSOR_MAP_INTERLEAVE_32B).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUtensorMapSwizzle_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUtensorMapSwizzle_enum::CU_TENSOR_MAP_SWIZZLE_NONE => {\n                writer.write_all(stringify!(CU_TENSOR_MAP_SWIZZLE_NONE).as_bytes())\n            }\n            &cuda_types::cuda::CUtensorMapSwizzle_enum::CU_TENSOR_MAP_SWIZZLE_32B => {\n                writer.write_all(stringify!(CU_TENSOR_MAP_SWIZZLE_32B).as_bytes())\n            }\n            &cuda_types::cuda::CUtensorMapSwizzle_enum::CU_TENSOR_MAP_SWIZZLE_64B => {\n                writer.write_all(stringify!(CU_TENSOR_MAP_SWIZZLE_64B).as_bytes())\n            }\n            &cuda_types::cuda::CUtensorMapSwizzle_enum::CU_TENSOR_MAP_SWIZZLE_128B => {\n                writer.write_all(stringify!(CU_TENSOR_MAP_SWIZZLE_128B).as_bytes())\n            }\n            &cuda_types::cuda::CUtensorMapSwizzle_enum::CU_TENSOR_MAP_SWIZZLE_128B_ATOM_32B => {\n                writer\n                    .write_all(\n                        stringify!(CU_TENSOR_MAP_SWIZZLE_128B_ATOM_32B).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUtensorMapSwizzle_enum::CU_TENSOR_MAP_SWIZZLE_128B_ATOM_32B_FLIP_8B => {\n                writer\n                    .write_all(\n                        stringify!(CU_TENSOR_MAP_SWIZZLE_128B_ATOM_32B_FLIP_8B)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUtensorMapSwizzle_enum::CU_TENSOR_MAP_SWIZZLE_128B_ATOM_64B => {\n                writer\n                    .write_all(\n                        stringify!(CU_TENSOR_MAP_SWIZZLE_128B_ATOM_64B).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUtensorMapL2promotion_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUtensorMapL2promotion_enum::CU_TENSOR_MAP_L2_PROMOTION_NONE => {\n                writer.write_all(stringify!(CU_TENSOR_MAP_L2_PROMOTION_NONE).as_bytes())\n            }\n            &cuda_types::cuda::CUtensorMapL2promotion_enum::CU_TENSOR_MAP_L2_PROMOTION_L2_64B => {\n                writer\n                    .write_all(stringify!(CU_TENSOR_MAP_L2_PROMOTION_L2_64B).as_bytes())\n            }\n            &cuda_types::cuda::CUtensorMapL2promotion_enum::CU_TENSOR_MAP_L2_PROMOTION_L2_128B => {\n                writer\n                    .write_all(stringify!(CU_TENSOR_MAP_L2_PROMOTION_L2_128B).as_bytes())\n            }\n            &cuda_types::cuda::CUtensorMapL2promotion_enum::CU_TENSOR_MAP_L2_PROMOTION_L2_256B => {\n                writer\n                    .write_all(stringify!(CU_TENSOR_MAP_L2_PROMOTION_L2_256B).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUtensorMapFloatOOBfill_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUtensorMapFloatOOBfill_enum::CU_TENSOR_MAP_FLOAT_OOB_FILL_NONE => {\n                writer\n                    .write_all(stringify!(CU_TENSOR_MAP_FLOAT_OOB_FILL_NONE).as_bytes())\n            }\n            &cuda_types::cuda::CUtensorMapFloatOOBfill_enum::CU_TENSOR_MAP_FLOAT_OOB_FILL_NAN_REQUEST_ZERO_FMA => {\n                writer\n                    .write_all(\n                        stringify!(CU_TENSOR_MAP_FLOAT_OOB_FILL_NAN_REQUEST_ZERO_FMA)\n                            .as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUtensorMapIm2ColWideMode_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUtensorMapIm2ColWideMode_enum::CU_TENSOR_MAP_IM2COL_WIDE_MODE_W => {\n                writer.write_all(stringify!(CU_TENSOR_MAP_IM2COL_WIDE_MODE_W).as_bytes())\n            }\n            &cuda_types::cuda::CUtensorMapIm2ColWideMode_enum::CU_TENSOR_MAP_IM2COL_WIDE_MODE_W128 => {\n                writer\n                    .write_all(\n                        stringify!(CU_TENSOR_MAP_IM2COL_WIDE_MODE_W128).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_POINTER_ATTRIBUTE_P2P_TOKENS_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(p2pToken), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.p2pToken, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(vaSpaceToken), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.vaSpaceToken, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_POINTER_ATTRIBUTE_ACCESS_FLAGS_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUDA_POINTER_ATTRIBUTE_ACCESS_FLAGS_enum::CU_POINTER_ATTRIBUTE_ACCESS_FLAG_NONE => {\n                writer\n                    .write_all(\n                        stringify!(CU_POINTER_ATTRIBUTE_ACCESS_FLAG_NONE).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUDA_POINTER_ATTRIBUTE_ACCESS_FLAGS_enum::CU_POINTER_ATTRIBUTE_ACCESS_FLAG_READ => {\n                writer\n                    .write_all(\n                        stringify!(CU_POINTER_ATTRIBUTE_ACCESS_FLAG_READ).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUDA_POINTER_ATTRIBUTE_ACCESS_FLAGS_enum::CU_POINTER_ATTRIBUTE_ACCESS_FLAG_READWRITE => {\n                writer\n                    .write_all(\n                        stringify!(CU_POINTER_ATTRIBUTE_ACCESS_FLAG_READWRITE).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_LAUNCH_PARAMS_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(function), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.function, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(gridDimX), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.gridDimX, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(gridDimY), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.gridDimY, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(gridDimZ), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.gridDimZ, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(blockDimX), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.blockDimX, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(blockDimY), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.blockDimY, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(blockDimZ), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.blockDimZ, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sharedMemBytes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sharedMemBytes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(hStream), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.hStream, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(kernelParams), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.kernelParams, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUexternalMemoryHandleType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUexternalMemoryHandleType_enum::CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD => {\n                writer\n                    .write_all(\n                        stringify!(CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUexternalMemoryHandleType_enum::CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32 => {\n                writer\n                    .write_all(\n                        stringify!(CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUexternalMemoryHandleType_enum::CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT => {\n                writer\n                    .write_all(\n                        stringify!(CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUexternalMemoryHandleType_enum::CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP => {\n                writer\n                    .write_all(\n                        stringify!(CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUexternalMemoryHandleType_enum::CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE => {\n                writer\n                    .write_all(\n                        stringify!(CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUexternalMemoryHandleType_enum::CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE => {\n                writer\n                    .write_all(\n                        stringify!(CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUexternalMemoryHandleType_enum::CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE_KMT => {\n                writer\n                    .write_all(\n                        stringify!(CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE_KMT)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUexternalMemoryHandleType_enum::CU_EXTERNAL_MEMORY_HANDLE_TYPE_NVSCIBUF => {\n                writer\n                    .write_all(\n                        stringify!(CU_EXTERNAL_MEMORY_HANDLE_TYPE_NVSCIBUF).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUexternalMemoryHandleType_enum::CU_EXTERNAL_MEMORY_HANDLE_TYPE_DMABUF_FD => {\n                writer\n                    .write_all(\n                        stringify!(CU_EXTERNAL_MEMORY_HANDLE_TYPE_DMABUF_FD).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::cuda::CUDA_EXTERNAL_MEMORY_HANDLE_DESC_st__bindgen_ty_1__bindgen_ty_1 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(handle), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.handle, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(name), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.name, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_EXTERNAL_MEMORY_BUFFER_DESC_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(offset), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.offset, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(size), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.size, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(flags), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.flags, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::cuda::CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(offset), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.offset, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(arrayDesc), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.arrayDesc, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(numLevels), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.numLevels, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUexternalSemaphoreHandleType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUexternalSemaphoreHandleType_enum::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD => {\n                writer\n                    .write_all(\n                        stringify!(CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUexternalSemaphoreHandleType_enum::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32 => {\n                writer\n                    .write_all(\n                        stringify!(CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUexternalSemaphoreHandleType_enum::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT => {\n                writer\n                    .write_all(\n                        stringify!(CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUexternalSemaphoreHandleType_enum::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE => {\n                writer\n                    .write_all(\n                        stringify!(CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUexternalSemaphoreHandleType_enum::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE => {\n                writer\n                    .write_all(\n                        stringify!(CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUexternalSemaphoreHandleType_enum::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_NVSCISYNC => {\n                writer\n                    .write_all(\n                        stringify!(CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_NVSCISYNC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUexternalSemaphoreHandleType_enum::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX => {\n                writer\n                    .write_all(\n                        stringify!(CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUexternalSemaphoreHandleType_enum::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX_KMT => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX_KMT\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUexternalSemaphoreHandleType_enum::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TIMELINE_SEMAPHORE_FD => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TIMELINE_SEMAPHORE_FD\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUexternalSemaphoreHandleType_enum::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TIMELINE_SEMAPHORE_WIN32 => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TIMELINE_SEMAPHORE_WIN32\n                        )\n                            .as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::cuda::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_st__bindgen_ty_1__bindgen_ty_1 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(handle), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.handle, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(name), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.name, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(params), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.params, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(flags), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.flags, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::cuda::CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st__bindgen_ty_1 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(fence), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.fence, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(nvSciSync), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.nvSciSync, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(keyedMutex), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.keyedMutex, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::cuda::CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st__bindgen_ty_1__bindgen_ty_1 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(value), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.value, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::cuda::CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st__bindgen_ty_1__bindgen_ty_3 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(key), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.key, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(params), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.params, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(flags), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.flags, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::cuda::CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st__bindgen_ty_1 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(fence), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.fence, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(nvSciSync), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.nvSciSync, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(keyedMutex), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.keyedMutex, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::cuda::CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st__bindgen_ty_1__bindgen_ty_1 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(value), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.value, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::cuda::CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st__bindgen_ty_1__bindgen_ty_3 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(key), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.key, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(timeoutMs), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.timeoutMs, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_EXT_SEM_SIGNAL_NODE_PARAMS_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(extSemArray), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.extSemArray, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(paramsArray), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.paramsArray, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(numExtSems), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.numExtSems, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_EXT_SEM_SIGNAL_NODE_PARAMS_v2_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(extSemArray), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.extSemArray, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(paramsArray), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.paramsArray, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(numExtSems), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.numExtSems, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_EXT_SEM_WAIT_NODE_PARAMS_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(extSemArray), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.extSemArray, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(paramsArray), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.paramsArray, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(numExtSems), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.numExtSems, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_EXT_SEM_WAIT_NODE_PARAMS_v2_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(extSemArray), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.extSemArray, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(paramsArray), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.paramsArray, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(numExtSems), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.numExtSems, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmemAllocationHandleType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUmemAllocationHandleType_enum::CU_MEM_HANDLE_TYPE_NONE => {\n                writer.write_all(stringify!(CU_MEM_HANDLE_TYPE_NONE).as_bytes())\n            }\n            &cuda_types::cuda::CUmemAllocationHandleType_enum::CU_MEM_HANDLE_TYPE_POSIX_FILE_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(CU_MEM_HANDLE_TYPE_POSIX_FILE_DESCRIPTOR).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUmemAllocationHandleType_enum::CU_MEM_HANDLE_TYPE_WIN32 => {\n                writer.write_all(stringify!(CU_MEM_HANDLE_TYPE_WIN32).as_bytes())\n            }\n            &cuda_types::cuda::CUmemAllocationHandleType_enum::CU_MEM_HANDLE_TYPE_WIN32_KMT => {\n                writer.write_all(stringify!(CU_MEM_HANDLE_TYPE_WIN32_KMT).as_bytes())\n            }\n            &cuda_types::cuda::CUmemAllocationHandleType_enum::CU_MEM_HANDLE_TYPE_FABRIC => {\n                writer.write_all(stringify!(CU_MEM_HANDLE_TYPE_FABRIC).as_bytes())\n            }\n            &cuda_types::cuda::CUmemAllocationHandleType_enum::CU_MEM_HANDLE_TYPE_MAX => {\n                writer.write_all(stringify!(CU_MEM_HANDLE_TYPE_MAX).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmemAccess_flags_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUmemAccess_flags_enum::CU_MEM_ACCESS_FLAGS_PROT_NONE => {\n                writer.write_all(stringify!(CU_MEM_ACCESS_FLAGS_PROT_NONE).as_bytes())\n            }\n            &cuda_types::cuda::CUmemAccess_flags_enum::CU_MEM_ACCESS_FLAGS_PROT_READ => {\n                writer.write_all(stringify!(CU_MEM_ACCESS_FLAGS_PROT_READ).as_bytes())\n            }\n            &cuda_types::cuda::CUmemAccess_flags_enum::CU_MEM_ACCESS_FLAGS_PROT_READWRITE => {\n                writer\n                    .write_all(stringify!(CU_MEM_ACCESS_FLAGS_PROT_READWRITE).as_bytes())\n            }\n            &cuda_types::cuda::CUmemAccess_flags_enum::CU_MEM_ACCESS_FLAGS_PROT_MAX => {\n                writer.write_all(stringify!(CU_MEM_ACCESS_FLAGS_PROT_MAX).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmemLocationType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUmemLocationType_enum::CU_MEM_LOCATION_TYPE_INVALID => {\n                writer.write_all(stringify!(CU_MEM_LOCATION_TYPE_INVALID).as_bytes())\n            }\n            &cuda_types::cuda::CUmemLocationType_enum::CU_MEM_LOCATION_TYPE_NONE => {\n                writer.write_all(stringify!(CU_MEM_LOCATION_TYPE_NONE).as_bytes())\n            }\n            &cuda_types::cuda::CUmemLocationType_enum::CU_MEM_LOCATION_TYPE_DEVICE => {\n                writer.write_all(stringify!(CU_MEM_LOCATION_TYPE_DEVICE).as_bytes())\n            }\n            &cuda_types::cuda::CUmemLocationType_enum::CU_MEM_LOCATION_TYPE_HOST => {\n                writer.write_all(stringify!(CU_MEM_LOCATION_TYPE_HOST).as_bytes())\n            }\n            &cuda_types::cuda::CUmemLocationType_enum::CU_MEM_LOCATION_TYPE_HOST_NUMA => {\n                writer.write_all(stringify!(CU_MEM_LOCATION_TYPE_HOST_NUMA).as_bytes())\n            }\n            &cuda_types::cuda::CUmemLocationType_enum::CU_MEM_LOCATION_TYPE_HOST_NUMA_CURRENT => {\n                writer\n                    .write_all(\n                        stringify!(CU_MEM_LOCATION_TYPE_HOST_NUMA_CURRENT).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUmemLocationType_enum::CU_MEM_LOCATION_TYPE_MAX => {\n                writer.write_all(stringify!(CU_MEM_LOCATION_TYPE_MAX).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmemAllocationType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUmemAllocationType_enum::CU_MEM_ALLOCATION_TYPE_INVALID => {\n                writer.write_all(stringify!(CU_MEM_ALLOCATION_TYPE_INVALID).as_bytes())\n            }\n            &cuda_types::cuda::CUmemAllocationType_enum::CU_MEM_ALLOCATION_TYPE_PINNED => {\n                writer.write_all(stringify!(CU_MEM_ALLOCATION_TYPE_PINNED).as_bytes())\n            }\n            &cuda_types::cuda::CUmemAllocationType_enum::CU_MEM_ALLOCATION_TYPE_MANAGED => {\n                writer.write_all(stringify!(CU_MEM_ALLOCATION_TYPE_MANAGED).as_bytes())\n            }\n            &cuda_types::cuda::CUmemAllocationType_enum::CU_MEM_ALLOCATION_TYPE_MAX => {\n                writer.write_all(stringify!(CU_MEM_ALLOCATION_TYPE_MAX).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmemAllocationGranularity_flags_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUmemAllocationGranularity_flags_enum::CU_MEM_ALLOC_GRANULARITY_MINIMUM => {\n                writer.write_all(stringify!(CU_MEM_ALLOC_GRANULARITY_MINIMUM).as_bytes())\n            }\n            &cuda_types::cuda::CUmemAllocationGranularity_flags_enum::CU_MEM_ALLOC_GRANULARITY_RECOMMENDED => {\n                writer\n                    .write_all(\n                        stringify!(CU_MEM_ALLOC_GRANULARITY_RECOMMENDED).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmemRangeHandleType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUmemRangeHandleType_enum::CU_MEM_RANGE_HANDLE_TYPE_DMA_BUF_FD => {\n                writer\n                    .write_all(\n                        stringify!(CU_MEM_RANGE_HANDLE_TYPE_DMA_BUF_FD).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUmemRangeHandleType_enum::CU_MEM_RANGE_HANDLE_TYPE_MAX => {\n                writer.write_all(stringify!(CU_MEM_RANGE_HANDLE_TYPE_MAX).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmemRangeFlags_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUmemRangeFlags_enum::CU_MEM_RANGE_FLAG_DMA_BUF_MAPPING_TYPE_PCIE => {\n                writer\n                    .write_all(\n                        stringify!(CU_MEM_RANGE_FLAG_DMA_BUF_MAPPING_TYPE_PCIE)\n                            .as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUarraySparseSubresourceType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUarraySparseSubresourceType_enum::CU_ARRAY_SPARSE_SUBRESOURCE_TYPE_SPARSE_LEVEL => {\n                writer\n                    .write_all(\n                        stringify!(CU_ARRAY_SPARSE_SUBRESOURCE_TYPE_SPARSE_LEVEL)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUarraySparseSubresourceType_enum::CU_ARRAY_SPARSE_SUBRESOURCE_TYPE_MIPTAIL => {\n                writer\n                    .write_all(\n                        stringify!(CU_ARRAY_SPARSE_SUBRESOURCE_TYPE_MIPTAIL).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmemOperationType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUmemOperationType_enum::CU_MEM_OPERATION_TYPE_MAP => {\n                writer.write_all(stringify!(CU_MEM_OPERATION_TYPE_MAP).as_bytes())\n            }\n            &cuda_types::cuda::CUmemOperationType_enum::CU_MEM_OPERATION_TYPE_UNMAP => {\n                writer.write_all(stringify!(CU_MEM_OPERATION_TYPE_UNMAP).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmemHandleType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUmemHandleType_enum::CU_MEM_HANDLE_TYPE_GENERIC => {\n                writer.write_all(stringify!(CU_MEM_HANDLE_TYPE_GENERIC).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::cuda::CUarrayMapInfo_st__bindgen_ty_2__bindgen_ty_1 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(level), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.level, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(layer), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.layer, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(offsetX), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.offsetX, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(offsetY), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.offsetY, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(offsetZ), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.offsetZ, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(extentWidth), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.extentWidth, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(extentHeight), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.extentHeight, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(extentDepth), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.extentDepth, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::cuda::CUarrayMapInfo_st__bindgen_ty_2__bindgen_ty_2 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(layer), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.layer, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(offset), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.offset, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(size), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.size, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmemLocation_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(type_), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.type_, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(id), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.id, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmemAllocationCompType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUmemAllocationCompType_enum::CU_MEM_ALLOCATION_COMP_NONE => {\n                writer.write_all(stringify!(CU_MEM_ALLOCATION_COMP_NONE).as_bytes())\n            }\n            &cuda_types::cuda::CUmemAllocationCompType_enum::CU_MEM_ALLOCATION_COMP_GENERIC => {\n                writer.write_all(stringify!(CU_MEM_ALLOCATION_COMP_GENERIC).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmemAllocationProp_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(type_), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.type_, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(requestedHandleTypes), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.requestedHandleTypes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(location), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.location, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(win32HandleMetaData), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.win32HandleMetaData, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(allocFlags), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.allocFlags, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmemAllocationProp_st__bindgen_ty_1 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(compressionType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.compressionType, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(gpuDirectRDMACapable), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.gpuDirectRDMACapable, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(usage), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.usage, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmulticastGranularity_flags_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUmulticastGranularity_flags_enum::CU_MULTICAST_GRANULARITY_MINIMUM => {\n                writer.write_all(stringify!(CU_MULTICAST_GRANULARITY_MINIMUM).as_bytes())\n            }\n            &cuda_types::cuda::CUmulticastGranularity_flags_enum::CU_MULTICAST_GRANULARITY_RECOMMENDED => {\n                writer\n                    .write_all(\n                        stringify!(CU_MULTICAST_GRANULARITY_RECOMMENDED).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmulticastObjectProp_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(numDevices), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.numDevices, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(size), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.size, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(handleTypes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.handleTypes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(flags), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.flags, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmemAccessDesc_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(location), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.location, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(flags), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.flags, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUgraphExecUpdateResult_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUgraphExecUpdateResult_enum::CU_GRAPH_EXEC_UPDATE_SUCCESS => {\n                writer.write_all(stringify!(CU_GRAPH_EXEC_UPDATE_SUCCESS).as_bytes())\n            }\n            &cuda_types::cuda::CUgraphExecUpdateResult_enum::CU_GRAPH_EXEC_UPDATE_ERROR => {\n                writer.write_all(stringify!(CU_GRAPH_EXEC_UPDATE_ERROR).as_bytes())\n            }\n            &cuda_types::cuda::CUgraphExecUpdateResult_enum::CU_GRAPH_EXEC_UPDATE_ERROR_TOPOLOGY_CHANGED => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPH_EXEC_UPDATE_ERROR_TOPOLOGY_CHANGED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphExecUpdateResult_enum::CU_GRAPH_EXEC_UPDATE_ERROR_NODE_TYPE_CHANGED => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPH_EXEC_UPDATE_ERROR_NODE_TYPE_CHANGED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphExecUpdateResult_enum::CU_GRAPH_EXEC_UPDATE_ERROR_FUNCTION_CHANGED => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPH_EXEC_UPDATE_ERROR_FUNCTION_CHANGED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphExecUpdateResult_enum::CU_GRAPH_EXEC_UPDATE_ERROR_PARAMETERS_CHANGED => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPH_EXEC_UPDATE_ERROR_PARAMETERS_CHANGED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphExecUpdateResult_enum::CU_GRAPH_EXEC_UPDATE_ERROR_NOT_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPH_EXEC_UPDATE_ERROR_NOT_SUPPORTED).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphExecUpdateResult_enum::CU_GRAPH_EXEC_UPDATE_ERROR_UNSUPPORTED_FUNCTION_CHANGE => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CU_GRAPH_EXEC_UPDATE_ERROR_UNSUPPORTED_FUNCTION_CHANGE\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphExecUpdateResult_enum::CU_GRAPH_EXEC_UPDATE_ERROR_ATTRIBUTES_CHANGED => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPH_EXEC_UPDATE_ERROR_ATTRIBUTES_CHANGED)\n                            .as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUgraphExecUpdateResultInfo_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(result), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.result, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(errorNode), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.errorNode, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(errorFromNode), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.errorFromNode, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmemPool_attribute_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUmemPool_attribute_enum::CU_MEMPOOL_ATTR_REUSE_FOLLOW_EVENT_DEPENDENCIES => {\n                writer\n                    .write_all(\n                        stringify!(CU_MEMPOOL_ATTR_REUSE_FOLLOW_EVENT_DEPENDENCIES)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUmemPool_attribute_enum::CU_MEMPOOL_ATTR_REUSE_ALLOW_OPPORTUNISTIC => {\n                writer\n                    .write_all(\n                        stringify!(CU_MEMPOOL_ATTR_REUSE_ALLOW_OPPORTUNISTIC).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUmemPool_attribute_enum::CU_MEMPOOL_ATTR_REUSE_ALLOW_INTERNAL_DEPENDENCIES => {\n                writer\n                    .write_all(\n                        stringify!(CU_MEMPOOL_ATTR_REUSE_ALLOW_INTERNAL_DEPENDENCIES)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUmemPool_attribute_enum::CU_MEMPOOL_ATTR_RELEASE_THRESHOLD => {\n                writer\n                    .write_all(stringify!(CU_MEMPOOL_ATTR_RELEASE_THRESHOLD).as_bytes())\n            }\n            &cuda_types::cuda::CUmemPool_attribute_enum::CU_MEMPOOL_ATTR_RESERVED_MEM_CURRENT => {\n                writer\n                    .write_all(\n                        stringify!(CU_MEMPOOL_ATTR_RESERVED_MEM_CURRENT).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUmemPool_attribute_enum::CU_MEMPOOL_ATTR_RESERVED_MEM_HIGH => {\n                writer\n                    .write_all(stringify!(CU_MEMPOOL_ATTR_RESERVED_MEM_HIGH).as_bytes())\n            }\n            &cuda_types::cuda::CUmemPool_attribute_enum::CU_MEMPOOL_ATTR_USED_MEM_CURRENT => {\n                writer.write_all(stringify!(CU_MEMPOOL_ATTR_USED_MEM_CURRENT).as_bytes())\n            }\n            &cuda_types::cuda::CUmemPool_attribute_enum::CU_MEMPOOL_ATTR_USED_MEM_HIGH => {\n                writer.write_all(stringify!(CU_MEMPOOL_ATTR_USED_MEM_HIGH).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmemPoolProps_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(allocType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.allocType, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(handleTypes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.handleTypes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(location), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.location, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(win32SecurityAttributes), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.win32SecurityAttributes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(maxSize), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.maxSize, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(usage), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.usage, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmemcpyFlags_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUmemcpyFlags_enum::CU_MEMCPY_FLAG_DEFAULT => {\n                writer.write_all(stringify!(CU_MEMCPY_FLAG_DEFAULT).as_bytes())\n            }\n            &cuda_types::cuda::CUmemcpyFlags_enum::CU_MEMCPY_FLAG_PREFER_OVERLAP_WITH_COMPUTE => {\n                writer\n                    .write_all(\n                        stringify!(CU_MEMCPY_FLAG_PREFER_OVERLAP_WITH_COMPUTE).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmemcpySrcAccessOrder_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUmemcpySrcAccessOrder_enum::CU_MEMCPY_SRC_ACCESS_ORDER_INVALID => {\n                writer\n                    .write_all(stringify!(CU_MEMCPY_SRC_ACCESS_ORDER_INVALID).as_bytes())\n            }\n            &cuda_types::cuda::CUmemcpySrcAccessOrder_enum::CU_MEMCPY_SRC_ACCESS_ORDER_STREAM => {\n                writer\n                    .write_all(stringify!(CU_MEMCPY_SRC_ACCESS_ORDER_STREAM).as_bytes())\n            }\n            &cuda_types::cuda::CUmemcpySrcAccessOrder_enum::CU_MEMCPY_SRC_ACCESS_ORDER_DURING_API_CALL => {\n                writer\n                    .write_all(\n                        stringify!(CU_MEMCPY_SRC_ACCESS_ORDER_DURING_API_CALL).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUmemcpySrcAccessOrder_enum::CU_MEMCPY_SRC_ACCESS_ORDER_ANY => {\n                writer.write_all(stringify!(CU_MEMCPY_SRC_ACCESS_ORDER_ANY).as_bytes())\n            }\n            &cuda_types::cuda::CUmemcpySrcAccessOrder_enum::CU_MEMCPY_SRC_ACCESS_ORDER_MAX => {\n                writer.write_all(stringify!(CU_MEMCPY_SRC_ACCESS_ORDER_MAX).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmemcpyAttributes_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(srcAccessOrder), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcAccessOrder, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcLocHint), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcLocHint, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstLocHint), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstLocHint, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(flags), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.flags, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmemcpy3DOperandType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUmemcpy3DOperandType_enum::CU_MEMCPY_OPERAND_TYPE_POINTER => {\n                writer.write_all(stringify!(CU_MEMCPY_OPERAND_TYPE_POINTER).as_bytes())\n            }\n            &cuda_types::cuda::CUmemcpy3DOperandType_enum::CU_MEMCPY_OPERAND_TYPE_ARRAY => {\n                writer.write_all(stringify!(CU_MEMCPY_OPERAND_TYPE_ARRAY).as_bytes())\n            }\n            &cuda_types::cuda::CUmemcpy3DOperandType_enum::CU_MEMCPY_OPERAND_TYPE_MAX => {\n                writer.write_all(stringify!(CU_MEMCPY_OPERAND_TYPE_MAX).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUoffset3D_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(x), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.x, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(y), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.y, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(z), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.z, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUextent3D_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(width), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.width, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(height), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.height, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(depth), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.depth, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::cuda::CUmemcpy3DOperand_st__bindgen_ty_1__bindgen_ty_1 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(ptr), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.ptr, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(rowLength), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.rowLength, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(layerHeight), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.layerHeight, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(locHint), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.locHint, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::cuda::CUmemcpy3DOperand_st__bindgen_ty_1__bindgen_ty_2 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(array), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.array, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(offset), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.offset, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_MEMCPY3D_BATCH_OP_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(src), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.src, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dst), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dst, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(extent), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.extent, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcAccessOrder), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcAccessOrder, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(flags), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.flags, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_MEM_ALLOC_NODE_PARAMS_v1_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(poolProps), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.poolProps, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(accessDescs), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.accessDescs, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(accessDescCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.accessDescCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(bytesize), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.bytesize, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dptr), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dptr, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_MEM_ALLOC_NODE_PARAMS_v2_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(poolProps), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.poolProps, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(accessDescs), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.accessDescs, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(accessDescCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.accessDescCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(bytesize), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.bytesize, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dptr), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dptr, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_MEM_FREE_NODE_PARAMS_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(dptr), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dptr, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUgraphMem_attribute_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUgraphMem_attribute_enum::CU_GRAPH_MEM_ATTR_USED_MEM_CURRENT => {\n                writer\n                    .write_all(stringify!(CU_GRAPH_MEM_ATTR_USED_MEM_CURRENT).as_bytes())\n            }\n            &cuda_types::cuda::CUgraphMem_attribute_enum::CU_GRAPH_MEM_ATTR_USED_MEM_HIGH => {\n                writer.write_all(stringify!(CU_GRAPH_MEM_ATTR_USED_MEM_HIGH).as_bytes())\n            }\n            &cuda_types::cuda::CUgraphMem_attribute_enum::CU_GRAPH_MEM_ATTR_RESERVED_MEM_CURRENT => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPH_MEM_ATTR_RESERVED_MEM_CURRENT).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphMem_attribute_enum::CU_GRAPH_MEM_ATTR_RESERVED_MEM_HIGH => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPH_MEM_ATTR_RESERVED_MEM_HIGH).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUgraphChildGraphNodeOwnership_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUgraphChildGraphNodeOwnership_enum::CU_GRAPH_CHILD_GRAPH_OWNERSHIP_CLONE => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPH_CHILD_GRAPH_OWNERSHIP_CLONE).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphChildGraphNodeOwnership_enum::CU_GRAPH_CHILD_GRAPH_OWNERSHIP_MOVE => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPH_CHILD_GRAPH_OWNERSHIP_MOVE).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_CHILD_GRAPH_NODE_PARAMS_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(graph), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.graph, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(ownership), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.ownership, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_EVENT_RECORD_NODE_PARAMS_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(event), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.event, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_EVENT_WAIT_NODE_PARAMS_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(event), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.event, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUflushGPUDirectRDMAWritesOptions_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUflushGPUDirectRDMAWritesOptions_enum::CU_FLUSH_GPU_DIRECT_RDMA_WRITES_OPTION_HOST => {\n                writer\n                    .write_all(\n                        stringify!(CU_FLUSH_GPU_DIRECT_RDMA_WRITES_OPTION_HOST)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUflushGPUDirectRDMAWritesOptions_enum::CU_FLUSH_GPU_DIRECT_RDMA_WRITES_OPTION_MEMOPS => {\n                writer\n                    .write_all(\n                        stringify!(CU_FLUSH_GPU_DIRECT_RDMA_WRITES_OPTION_MEMOPS)\n                            .as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUGPUDirectRDMAWritesOrdering_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUGPUDirectRDMAWritesOrdering_enum::CU_GPU_DIRECT_RDMA_WRITES_ORDERING_NONE => {\n                writer\n                    .write_all(\n                        stringify!(CU_GPU_DIRECT_RDMA_WRITES_ORDERING_NONE).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUGPUDirectRDMAWritesOrdering_enum::CU_GPU_DIRECT_RDMA_WRITES_ORDERING_OWNER => {\n                writer\n                    .write_all(\n                        stringify!(CU_GPU_DIRECT_RDMA_WRITES_ORDERING_OWNER).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUGPUDirectRDMAWritesOrdering_enum::CU_GPU_DIRECT_RDMA_WRITES_ORDERING_ALL_DEVICES => {\n                writer\n                    .write_all(\n                        stringify!(CU_GPU_DIRECT_RDMA_WRITES_ORDERING_ALL_DEVICES)\n                            .as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUflushGPUDirectRDMAWritesScope_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUflushGPUDirectRDMAWritesScope_enum::CU_FLUSH_GPU_DIRECT_RDMA_WRITES_TO_OWNER => {\n                writer\n                    .write_all(\n                        stringify!(CU_FLUSH_GPU_DIRECT_RDMA_WRITES_TO_OWNER).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUflushGPUDirectRDMAWritesScope_enum::CU_FLUSH_GPU_DIRECT_RDMA_WRITES_TO_ALL_DEVICES => {\n                writer\n                    .write_all(\n                        stringify!(CU_FLUSH_GPU_DIRECT_RDMA_WRITES_TO_ALL_DEVICES)\n                            .as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUflushGPUDirectRDMAWritesTarget_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUflushGPUDirectRDMAWritesTarget_enum::CU_FLUSH_GPU_DIRECT_RDMA_WRITES_TARGET_CURRENT_CTX => {\n                writer\n                    .write_all(\n                        stringify!(CU_FLUSH_GPU_DIRECT_RDMA_WRITES_TARGET_CURRENT_CTX)\n                            .as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUgraphDebugDot_flags_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUgraphDebugDot_flags_enum::CU_GRAPH_DEBUG_DOT_FLAGS_VERBOSE => {\n                writer.write_all(stringify!(CU_GRAPH_DEBUG_DOT_FLAGS_VERBOSE).as_bytes())\n            }\n            &cuda_types::cuda::CUgraphDebugDot_flags_enum::CU_GRAPH_DEBUG_DOT_FLAGS_RUNTIME_TYPES => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPH_DEBUG_DOT_FLAGS_RUNTIME_TYPES).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphDebugDot_flags_enum::CU_GRAPH_DEBUG_DOT_FLAGS_KERNEL_NODE_PARAMS => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPH_DEBUG_DOT_FLAGS_KERNEL_NODE_PARAMS)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphDebugDot_flags_enum::CU_GRAPH_DEBUG_DOT_FLAGS_MEMCPY_NODE_PARAMS => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPH_DEBUG_DOT_FLAGS_MEMCPY_NODE_PARAMS)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphDebugDot_flags_enum::CU_GRAPH_DEBUG_DOT_FLAGS_MEMSET_NODE_PARAMS => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPH_DEBUG_DOT_FLAGS_MEMSET_NODE_PARAMS)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphDebugDot_flags_enum::CU_GRAPH_DEBUG_DOT_FLAGS_HOST_NODE_PARAMS => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPH_DEBUG_DOT_FLAGS_HOST_NODE_PARAMS).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphDebugDot_flags_enum::CU_GRAPH_DEBUG_DOT_FLAGS_EVENT_NODE_PARAMS => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPH_DEBUG_DOT_FLAGS_EVENT_NODE_PARAMS).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphDebugDot_flags_enum::CU_GRAPH_DEBUG_DOT_FLAGS_EXT_SEMAS_SIGNAL_NODE_PARAMS => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPH_DEBUG_DOT_FLAGS_EXT_SEMAS_SIGNAL_NODE_PARAMS)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphDebugDot_flags_enum::CU_GRAPH_DEBUG_DOT_FLAGS_EXT_SEMAS_WAIT_NODE_PARAMS => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPH_DEBUG_DOT_FLAGS_EXT_SEMAS_WAIT_NODE_PARAMS)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphDebugDot_flags_enum::CU_GRAPH_DEBUG_DOT_FLAGS_KERNEL_NODE_ATTRIBUTES => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPH_DEBUG_DOT_FLAGS_KERNEL_NODE_ATTRIBUTES)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphDebugDot_flags_enum::CU_GRAPH_DEBUG_DOT_FLAGS_HANDLES => {\n                writer.write_all(stringify!(CU_GRAPH_DEBUG_DOT_FLAGS_HANDLES).as_bytes())\n            }\n            &cuda_types::cuda::CUgraphDebugDot_flags_enum::CU_GRAPH_DEBUG_DOT_FLAGS_MEM_ALLOC_NODE_PARAMS => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPH_DEBUG_DOT_FLAGS_MEM_ALLOC_NODE_PARAMS)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphDebugDot_flags_enum::CU_GRAPH_DEBUG_DOT_FLAGS_MEM_FREE_NODE_PARAMS => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPH_DEBUG_DOT_FLAGS_MEM_FREE_NODE_PARAMS)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphDebugDot_flags_enum::CU_GRAPH_DEBUG_DOT_FLAGS_BATCH_MEM_OP_NODE_PARAMS => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPH_DEBUG_DOT_FLAGS_BATCH_MEM_OP_NODE_PARAMS)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphDebugDot_flags_enum::CU_GRAPH_DEBUG_DOT_FLAGS_EXTRA_TOPO_INFO => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPH_DEBUG_DOT_FLAGS_EXTRA_TOPO_INFO).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphDebugDot_flags_enum::CU_GRAPH_DEBUG_DOT_FLAGS_CONDITIONAL_NODE_PARAMS => {\n                writer\n                    .write_all(\n                        stringify!(CU_GRAPH_DEBUG_DOT_FLAGS_CONDITIONAL_NODE_PARAMS)\n                            .as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUuserObject_flags_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUuserObject_flags_enum::CU_USER_OBJECT_NO_DESTRUCTOR_SYNC => {\n                writer\n                    .write_all(stringify!(CU_USER_OBJECT_NO_DESTRUCTOR_SYNC).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUuserObjectRetain_flags_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUuserObjectRetain_flags_enum::CU_GRAPH_USER_OBJECT_MOVE => {\n                writer.write_all(stringify!(CU_GRAPH_USER_OBJECT_MOVE).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUgraphInstantiate_flags_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUgraphInstantiate_flags_enum::CUDA_GRAPH_INSTANTIATE_FLAG_AUTO_FREE_ON_LAUNCH => {\n                writer\n                    .write_all(\n                        stringify!(CUDA_GRAPH_INSTANTIATE_FLAG_AUTO_FREE_ON_LAUNCH)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphInstantiate_flags_enum::CUDA_GRAPH_INSTANTIATE_FLAG_UPLOAD => {\n                writer\n                    .write_all(stringify!(CUDA_GRAPH_INSTANTIATE_FLAG_UPLOAD).as_bytes())\n            }\n            &cuda_types::cuda::CUgraphInstantiate_flags_enum::CUDA_GRAPH_INSTANTIATE_FLAG_DEVICE_LAUNCH => {\n                writer\n                    .write_all(\n                        stringify!(CUDA_GRAPH_INSTANTIATE_FLAG_DEVICE_LAUNCH).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUgraphInstantiate_flags_enum::CUDA_GRAPH_INSTANTIATE_FLAG_USE_NODE_PRIORITY => {\n                writer\n                    .write_all(\n                        stringify!(CUDA_GRAPH_INSTANTIATE_FLAG_USE_NODE_PRIORITY)\n                            .as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUdeviceNumaConfig_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUdeviceNumaConfig_enum::CU_DEVICE_NUMA_CONFIG_NONE => {\n                writer.write_all(stringify!(CU_DEVICE_NUMA_CONFIG_NONE).as_bytes())\n            }\n            &cuda_types::cuda::CUdeviceNumaConfig_enum::CU_DEVICE_NUMA_CONFIG_NUMA_NODE => {\n                writer.write_all(stringify!(CU_DEVICE_NUMA_CONFIG_NUMA_NODE).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUprocessState_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUprocessState_enum::CU_PROCESS_STATE_RUNNING => {\n                writer.write_all(stringify!(CU_PROCESS_STATE_RUNNING).as_bytes())\n            }\n            &cuda_types::cuda::CUprocessState_enum::CU_PROCESS_STATE_LOCKED => {\n                writer.write_all(stringify!(CU_PROCESS_STATE_LOCKED).as_bytes())\n            }\n            &cuda_types::cuda::CUprocessState_enum::CU_PROCESS_STATE_CHECKPOINTED => {\n                writer.write_all(stringify!(CU_PROCESS_STATE_CHECKPOINTED).as_bytes())\n            }\n            &cuda_types::cuda::CUprocessState_enum::CU_PROCESS_STATE_FAILED => {\n                writer.write_all(stringify!(CU_PROCESS_STATE_FAILED).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUcheckpointLockArgs_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(timeoutMs), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.timeoutMs, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUcheckpointGpuPair_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(oldUuid), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.oldUuid, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(newUuid), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.newUuid, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUcheckpointRestoreArgs_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(gpuPairs), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.gpuPairs, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(gpuPairsCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.gpuPairsCount, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\npub fn write_cuGetErrorString(\n    writer: &mut (impl std::io::Write + ?Sized),\n    error: cuda_types::cuda::CUresult,\n    pStr: *mut *const ::core::ffi::c_char,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(error), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&error, \"cuGetErrorString\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pStr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pStr, \"cuGetErrorString\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGetErrorName(\n    writer: &mut (impl std::io::Write + ?Sized),\n    error: cuda_types::cuda::CUresult,\n    pStr: *mut *const ::core::ffi::c_char,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(error), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&error, \"cuGetErrorName\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pStr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pStr, \"cuGetErrorName\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuInit(\n    writer: &mut (impl std::io::Write + ?Sized),\n    Flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(Flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Flags, \"cuInit\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDriverGetVersion(\n    writer: &mut (impl std::io::Write + ?Sized),\n    driverVersion: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(driverVersion), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&driverVersion, \"cuDriverGetVersion\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDeviceGet(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: *mut cuda_types::cuda::CUdevice,\n    ordinal: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"cuDeviceGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ordinal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ordinal, \"cuDeviceGet\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDeviceGetCount(\n    writer: &mut (impl std::io::Write + ?Sized),\n    count: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuDeviceGetCount\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDeviceGetName(\n    writer: &mut (impl std::io::Write + ?Sized),\n    name: *mut ::core::ffi::c_char,\n    len: ::core::ffi::c_int,\n    dev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(name), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&name, \"cuDeviceGetName\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(len), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&len, \"cuDeviceGetName\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuDeviceGetName\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDeviceGetUuid_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    uuid: *mut cuda_types::cuda::CUuuid,\n    dev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(uuid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uuid, \"cuDeviceGetUuid_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuDeviceGetUuid_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDeviceGetLuid(\n    writer: &mut (impl std::io::Write + ?Sized),\n    luid: *mut ::core::ffi::c_char,\n    deviceNodeMask: *mut ::core::ffi::c_uint,\n    dev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(luid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&luid, \"cuDeviceGetLuid\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(deviceNodeMask), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&deviceNodeMask, \"cuDeviceGetLuid\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuDeviceGetLuid\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDeviceTotalMem_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    bytes: *mut usize,\n    dev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(bytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bytes, \"cuDeviceTotalMem_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuDeviceTotalMem_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDeviceGetTexture1DLinearMaxWidth(\n    writer: &mut (impl std::io::Write + ?Sized),\n    maxWidthInElements: *mut usize,\n    format: cuda_types::cuda::CUarray_format,\n    numChannels: ::core::ffi::c_uint,\n    dev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(maxWidthInElements), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxWidthInElements,\n        \"cuDeviceGetTexture1DLinearMaxWidth\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(format), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &format,\n        \"cuDeviceGetTexture1DLinearMaxWidth\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numChannels), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numChannels,\n        \"cuDeviceGetTexture1DLinearMaxWidth\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dev,\n        \"cuDeviceGetTexture1DLinearMaxWidth\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDeviceGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pi: *mut ::core::ffi::c_int,\n    attrib: cuda_types::cuda::CUdevice_attribute,\n    dev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pi), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pi, \"cuDeviceGetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attrib), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attrib, \"cuDeviceGetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuDeviceGetAttribute\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDeviceGetHostAtomicCapabilities(\n    writer: &mut (impl std::io::Write + ?Sized),\n    capabilities: *mut ::core::ffi::c_uint,\n    operations: *const cuda_types::cuda::CUatomicOperation,\n    count: ::core::ffi::c_uint,\n    dev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(capabilities), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &capabilities,\n        \"cuDeviceGetHostAtomicCapabilities\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(operations), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &operations,\n        \"cuDeviceGetHostAtomicCapabilities\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &count,\n        \"cuDeviceGetHostAtomicCapabilities\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dev,\n        \"cuDeviceGetHostAtomicCapabilities\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDeviceGetNvSciSyncAttributes(\n    writer: &mut (impl std::io::Write + ?Sized),\n    nvSciSyncAttrList: *mut ::core::ffi::c_void,\n    dev: cuda_types::cuda::CUdevice,\n    flags: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(nvSciSyncAttrList), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nvSciSyncAttrList,\n        \"cuDeviceGetNvSciSyncAttributes\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuDeviceGetNvSciSyncAttributes\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &flags,\n        \"cuDeviceGetNvSciSyncAttributes\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDeviceSetMemPool(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dev: cuda_types::cuda::CUdevice,\n    pool: cuda_types::cuda::CUmemoryPool,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuDeviceSetMemPool\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pool), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pool, \"cuDeviceSetMemPool\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDeviceGetMemPool(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pool: *mut cuda_types::cuda::CUmemoryPool,\n    dev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pool), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pool, \"cuDeviceGetMemPool\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuDeviceGetMemPool\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDeviceGetDefaultMemPool(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pool_out: *mut cuda_types::cuda::CUmemoryPool,\n    dev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pool_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pool_out, \"cuDeviceGetDefaultMemPool\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuDeviceGetDefaultMemPool\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDeviceGetExecAffinitySupport(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pi: *mut ::core::ffi::c_int,\n    type_: cuda_types::cuda::CUexecAffinityType,\n    dev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pi), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pi, \"cuDeviceGetExecAffinitySupport\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &type_,\n        \"cuDeviceGetExecAffinitySupport\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuDeviceGetExecAffinitySupport\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuFlushGPUDirectRDMAWrites(\n    writer: &mut (impl std::io::Write + ?Sized),\n    target: cuda_types::cuda::CUflushGPUDirectRDMAWritesTarget,\n    scope: cuda_types::cuda::CUflushGPUDirectRDMAWritesScope,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(target), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&target, \"cuFlushGPUDirectRDMAWrites\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(scope), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&scope, \"cuFlushGPUDirectRDMAWrites\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDeviceGetProperties(\n    writer: &mut (impl std::io::Write + ?Sized),\n    prop: *mut cuda_types::cuda::CUdevprop,\n    dev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(prop), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&prop, \"cuDeviceGetProperties\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuDeviceGetProperties\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDeviceComputeCapability(\n    writer: &mut (impl std::io::Write + ?Sized),\n    major: *mut ::core::ffi::c_int,\n    minor: *mut ::core::ffi::c_int,\n    dev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(major), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&major, \"cuDeviceComputeCapability\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(minor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&minor, \"cuDeviceComputeCapability\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuDeviceComputeCapability\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDevicePrimaryCtxRetain(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pctx: *mut cuda_types::cuda::CUcontext,\n    dev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pctx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pctx, \"cuDevicePrimaryCtxRetain\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuDevicePrimaryCtxRetain\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDevicePrimaryCtxRelease_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuDevicePrimaryCtxRelease_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDevicePrimaryCtxSetFlags_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dev: cuda_types::cuda::CUdevice,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuDevicePrimaryCtxSetFlags_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuDevicePrimaryCtxSetFlags_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDevicePrimaryCtxGetState(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dev: cuda_types::cuda::CUdevice,\n    flags: *mut ::core::ffi::c_uint,\n    active: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuDevicePrimaryCtxGetState\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuDevicePrimaryCtxGetState\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(active), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&active, \"cuDevicePrimaryCtxGetState\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDevicePrimaryCtxReset_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuDevicePrimaryCtxReset_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxCreate_v4(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pctx: *mut cuda_types::cuda::CUcontext,\n    ctxCreateParams: *mut cuda_types::cuda::CUctxCreateParams,\n    flags: ::core::ffi::c_uint,\n    dev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pctx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pctx, \"cuCtxCreate_v4\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ctxCreateParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ctxCreateParams, \"cuCtxCreate_v4\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuCtxCreate_v4\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuCtxCreate_v4\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxDestroy_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ctx: cuda_types::cuda::CUcontext,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ctx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ctx, \"cuCtxDestroy_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxPushCurrent_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ctx: cuda_types::cuda::CUcontext,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ctx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ctx, \"cuCtxPushCurrent_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxPopCurrent_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pctx: *mut cuda_types::cuda::CUcontext,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pctx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pctx, \"cuCtxPopCurrent_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxSetCurrent(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ctx: cuda_types::cuda::CUcontext,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ctx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ctx, \"cuCtxSetCurrent\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxGetCurrent(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pctx: *mut cuda_types::cuda::CUcontext,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pctx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pctx, \"cuCtxGetCurrent\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxGetDevice(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: *mut cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"cuCtxGetDevice\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxGetDevice_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: *mut cuda_types::cuda::CUdevice,\n    ctx: cuda_types::cuda::CUcontext,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"cuCtxGetDevice_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ctx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ctx, \"cuCtxGetDevice_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxGetFlags(\n    writer: &mut (impl std::io::Write + ?Sized),\n    flags: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuCtxGetFlags\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxSetFlags(\n    writer: &mut (impl std::io::Write + ?Sized),\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuCtxSetFlags\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxGetId(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ctx: cuda_types::cuda::CUcontext,\n    ctxId: *mut ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ctx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ctx, \"cuCtxGetId\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ctxId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ctxId, \"cuCtxGetId\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxSynchronize(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_cuCtxSynchronize_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ctx: cuda_types::cuda::CUcontext,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ctx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ctx, \"cuCtxSynchronize_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxSetLimit(\n    writer: &mut (impl std::io::Write + ?Sized),\n    limit: cuda_types::cuda::CUlimit,\n    value: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(limit), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&limit, \"cuCtxSetLimit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuCtxSetLimit\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxGetLimit(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pvalue: *mut usize,\n    limit: cuda_types::cuda::CUlimit,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pvalue), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pvalue, \"cuCtxGetLimit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(limit), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&limit, \"cuCtxGetLimit\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxGetCacheConfig(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pconfig: *mut cuda_types::cuda::CUfunc_cache,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pconfig), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pconfig, \"cuCtxGetCacheConfig\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxSetCacheConfig(\n    writer: &mut (impl std::io::Write + ?Sized),\n    config: cuda_types::cuda::CUfunc_cache,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(config), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&config, \"cuCtxSetCacheConfig\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxGetApiVersion(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ctx: cuda_types::cuda::CUcontext,\n    version: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ctx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ctx, \"cuCtxGetApiVersion\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(version), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&version, \"cuCtxGetApiVersion\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxGetStreamPriorityRange(\n    writer: &mut (impl std::io::Write + ?Sized),\n    leastPriority: *mut ::core::ffi::c_int,\n    greatestPriority: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(leastPriority), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &leastPriority,\n        \"cuCtxGetStreamPriorityRange\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(greatestPriority), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &greatestPriority,\n        \"cuCtxGetStreamPriorityRange\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxResetPersistingL2Cache(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_cuCtxGetExecAffinity(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pExecAffinity: *mut cuda_types::cuda::CUexecAffinityParam,\n    type_: cuda_types::cuda::CUexecAffinityType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pExecAffinity), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pExecAffinity, \"cuCtxGetExecAffinity\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cuCtxGetExecAffinity\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxRecordEvent(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hCtx: cuda_types::cuda::CUcontext,\n    hEvent: cuda_types::cuda::CUevent,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hCtx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hCtx, \"cuCtxRecordEvent\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hEvent), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hEvent, \"cuCtxRecordEvent\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxWaitEvent(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hCtx: cuda_types::cuda::CUcontext,\n    hEvent: cuda_types::cuda::CUevent,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hCtx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hCtx, \"cuCtxWaitEvent\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hEvent), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hEvent, \"cuCtxWaitEvent\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxAttach(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pctx: *mut cuda_types::cuda::CUcontext,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pctx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pctx, \"cuCtxAttach\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuCtxAttach\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxDetach(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ctx: cuda_types::cuda::CUcontext,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ctx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ctx, \"cuCtxDetach\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxGetSharedMemConfig(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pConfig: *mut cuda_types::cuda::CUsharedconfig,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pConfig), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pConfig, \"cuCtxGetSharedMemConfig\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxSetSharedMemConfig(\n    writer: &mut (impl std::io::Write + ?Sized),\n    config: cuda_types::cuda::CUsharedconfig,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(config), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&config, \"cuCtxSetSharedMemConfig\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuModuleLoad(\n    writer: &mut (impl std::io::Write + ?Sized),\n    module: *mut cuda_types::cuda::CUmodule,\n    fname: *const ::core::ffi::c_char,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(module), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&module, \"cuModuleLoad\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fname), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fname, \"cuModuleLoad\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuModuleLoadData(\n    writer: &mut (impl std::io::Write + ?Sized),\n    module: *mut cuda_types::cuda::CUmodule,\n    image: *const ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(module), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&module, \"cuModuleLoadData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(image), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&image, \"cuModuleLoadData\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuModuleLoadFatBinary(\n    writer: &mut (impl std::io::Write + ?Sized),\n    module: *mut cuda_types::cuda::CUmodule,\n    fatCubin: *const ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(module), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&module, \"cuModuleLoadFatBinary\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fatCubin), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fatCubin, \"cuModuleLoadFatBinary\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuModuleUnload(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hmod: cuda_types::cuda::CUmodule,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hmod), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hmod, \"cuModuleUnload\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmoduleLoadingMode_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUmoduleLoadingMode_enum::CU_MODULE_EAGER_LOADING => {\n                writer.write_all(stringify!(CU_MODULE_EAGER_LOADING).as_bytes())\n            }\n            &cuda_types::cuda::CUmoduleLoadingMode_enum::CU_MODULE_LAZY_LOADING => {\n                writer.write_all(stringify!(CU_MODULE_LAZY_LOADING).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cuModuleGetLoadingMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    mode: *mut cuda_types::cuda::CUmoduleLoadingMode,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cuModuleGetLoadingMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuModuleGetFunction(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hfunc: *mut cuda_types::cuda::CUfunction,\n    hmod: cuda_types::cuda::CUmodule,\n    name: *const ::core::ffi::c_char,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hfunc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hfunc, \"cuModuleGetFunction\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hmod), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hmod, \"cuModuleGetFunction\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(name), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&name, \"cuModuleGetFunction\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuModuleGetFunctionCount(\n    writer: &mut (impl std::io::Write + ?Sized),\n    count: *mut ::core::ffi::c_uint,\n    mod_: cuda_types::cuda::CUmodule,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuModuleGetFunctionCount\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mod_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mod_, \"cuModuleGetFunctionCount\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuModuleEnumerateFunctions(\n    writer: &mut (impl std::io::Write + ?Sized),\n    functions: *mut cuda_types::cuda::CUfunction,\n    numFunctions: ::core::ffi::c_uint,\n    mod_: cuda_types::cuda::CUmodule,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(functions), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &functions,\n        \"cuModuleEnumerateFunctions\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numFunctions), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numFunctions,\n        \"cuModuleEnumerateFunctions\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mod_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mod_, \"cuModuleEnumerateFunctions\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuModuleGetGlobal_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptr: *mut cuda_types::cuda::CUdeviceptr,\n    bytes: *mut usize,\n    hmod: cuda_types::cuda::CUmodule,\n    name: *const ::core::ffi::c_char,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuModuleGetGlobal_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bytes, \"cuModuleGetGlobal_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hmod), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hmod, \"cuModuleGetGlobal_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(name), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&name, \"cuModuleGetGlobal_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLinkCreate_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    numOptions: ::core::ffi::c_uint,\n    options: *mut cuda_types::cuda::CUjit_option,\n    optionValues: *mut *mut ::core::ffi::c_void,\n    stateOut: *mut cuda_types::cuda::CUlinkState,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(numOptions), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numOptions, \"cuLinkCreate_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(options), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&options, \"cuLinkCreate_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(optionValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&optionValues, \"cuLinkCreate_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stateOut), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stateOut, \"cuLinkCreate_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLinkAddData_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    state: cuda_types::cuda::CUlinkState,\n    type_: cuda_types::cuda::CUjitInputType,\n    data: *mut ::core::ffi::c_void,\n    size: usize,\n    name: *const ::core::ffi::c_char,\n    numOptions: ::core::ffi::c_uint,\n    options: *mut cuda_types::cuda::CUjit_option,\n    optionValues: *mut *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(state), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&state, \"cuLinkAddData_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cuLinkAddData_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(data), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&data, \"cuLinkAddData_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cuLinkAddData_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(name), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&name, \"cuLinkAddData_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numOptions), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numOptions, \"cuLinkAddData_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(options), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&options, \"cuLinkAddData_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(optionValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&optionValues, \"cuLinkAddData_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLinkAddFile_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    state: cuda_types::cuda::CUlinkState,\n    type_: cuda_types::cuda::CUjitInputType,\n    path: *const ::core::ffi::c_char,\n    numOptions: ::core::ffi::c_uint,\n    options: *mut cuda_types::cuda::CUjit_option,\n    optionValues: *mut *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(state), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&state, \"cuLinkAddFile_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cuLinkAddFile_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(path), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&path, \"cuLinkAddFile_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numOptions), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numOptions, \"cuLinkAddFile_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(options), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&options, \"cuLinkAddFile_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(optionValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&optionValues, \"cuLinkAddFile_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLinkComplete(\n    writer: &mut (impl std::io::Write + ?Sized),\n    state: cuda_types::cuda::CUlinkState,\n    cubinOut: *mut *mut ::core::ffi::c_void,\n    sizeOut: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(state), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&state, \"cuLinkComplete\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cubinOut), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cubinOut, \"cuLinkComplete\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeOut), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&sizeOut, \"cuLinkComplete\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLinkDestroy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    state: cuda_types::cuda::CUlinkState,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(state), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&state, \"cuLinkDestroy\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuModuleGetTexRef(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pTexRef: *mut cuda_types::cuda::CUtexref,\n    hmod: cuda_types::cuda::CUmodule,\n    name: *const ::core::ffi::c_char,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pTexRef, \"cuModuleGetTexRef\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hmod), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hmod, \"cuModuleGetTexRef\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(name), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&name, \"cuModuleGetTexRef\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuModuleGetSurfRef(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pSurfRef: *mut cuda_types::cuda::CUsurfref,\n    hmod: cuda_types::cuda::CUmodule,\n    name: *const ::core::ffi::c_char,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pSurfRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pSurfRef, \"cuModuleGetSurfRef\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hmod), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hmod, \"cuModuleGetSurfRef\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(name), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&name, \"cuModuleGetSurfRef\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLibraryLoadData(\n    writer: &mut (impl std::io::Write + ?Sized),\n    library: *mut cuda_types::cuda::CUlibrary,\n    code: *const ::core::ffi::c_void,\n    jitOptions: *mut cuda_types::cuda::CUjit_option,\n    jitOptionsValues: *mut *mut ::core::ffi::c_void,\n    numJitOptions: ::core::ffi::c_uint,\n    libraryOptions: *mut cuda_types::cuda::CUlibraryOption,\n    libraryOptionValues: *mut *mut ::core::ffi::c_void,\n    numLibraryOptions: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(library), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&library, \"cuLibraryLoadData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(code), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&code, \"cuLibraryLoadData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(jitOptions), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&jitOptions, \"cuLibraryLoadData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(jitOptionsValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&jitOptionsValues, \"cuLibraryLoadData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numJitOptions), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numJitOptions, \"cuLibraryLoadData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(libraryOptions), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&libraryOptions, \"cuLibraryLoadData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(libraryOptionValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &libraryOptionValues,\n        \"cuLibraryLoadData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numLibraryOptions), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numLibraryOptions, \"cuLibraryLoadData\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLibraryLoadFromFile(\n    writer: &mut (impl std::io::Write + ?Sized),\n    library: *mut cuda_types::cuda::CUlibrary,\n    fileName: *const ::core::ffi::c_char,\n    jitOptions: *mut cuda_types::cuda::CUjit_option,\n    jitOptionsValues: *mut *mut ::core::ffi::c_void,\n    numJitOptions: ::core::ffi::c_uint,\n    libraryOptions: *mut cuda_types::cuda::CUlibraryOption,\n    libraryOptionValues: *mut *mut ::core::ffi::c_void,\n    numLibraryOptions: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(library), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&library, \"cuLibraryLoadFromFile\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fileName), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fileName, \"cuLibraryLoadFromFile\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(jitOptions), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&jitOptions, \"cuLibraryLoadFromFile\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(jitOptionsValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &jitOptionsValues,\n        \"cuLibraryLoadFromFile\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numJitOptions), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numJitOptions, \"cuLibraryLoadFromFile\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(libraryOptions), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &libraryOptions,\n        \"cuLibraryLoadFromFile\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(libraryOptionValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &libraryOptionValues,\n        \"cuLibraryLoadFromFile\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numLibraryOptions), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numLibraryOptions,\n        \"cuLibraryLoadFromFile\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLibraryUnload(\n    writer: &mut (impl std::io::Write + ?Sized),\n    library: cuda_types::cuda::CUlibrary,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(library), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&library, \"cuLibraryUnload\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLibraryGetKernel(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pKernel: *mut cuda_types::cuda::CUkernel,\n    library: cuda_types::cuda::CUlibrary,\n    name: *const ::core::ffi::c_char,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pKernel), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pKernel, \"cuLibraryGetKernel\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(library), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&library, \"cuLibraryGetKernel\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(name), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&name, \"cuLibraryGetKernel\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLibraryGetKernelCount(\n    writer: &mut (impl std::io::Write + ?Sized),\n    count: *mut ::core::ffi::c_uint,\n    lib: cuda_types::cuda::CUlibrary,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuLibraryGetKernelCount\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lib), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lib, \"cuLibraryGetKernelCount\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLibraryEnumerateKernels(\n    writer: &mut (impl std::io::Write + ?Sized),\n    kernels: *mut cuda_types::cuda::CUkernel,\n    numKernels: ::core::ffi::c_uint,\n    lib: cuda_types::cuda::CUlibrary,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(kernels), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kernels, \"cuLibraryEnumerateKernels\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numKernels), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numKernels,\n        \"cuLibraryEnumerateKernels\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lib), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lib, \"cuLibraryEnumerateKernels\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLibraryGetModule(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pMod: *mut cuda_types::cuda::CUmodule,\n    library: cuda_types::cuda::CUlibrary,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pMod), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pMod, \"cuLibraryGetModule\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(library), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&library, \"cuLibraryGetModule\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuKernelGetFunction(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pFunc: *mut cuda_types::cuda::CUfunction,\n    kernel: cuda_types::cuda::CUkernel,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pFunc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pFunc, \"cuKernelGetFunction\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kernel), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kernel, \"cuKernelGetFunction\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuKernelGetLibrary(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pLib: *mut cuda_types::cuda::CUlibrary,\n    kernel: cuda_types::cuda::CUkernel,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pLib), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pLib, \"cuKernelGetLibrary\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kernel), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kernel, \"cuKernelGetLibrary\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLibraryGetGlobal(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptr: *mut cuda_types::cuda::CUdeviceptr,\n    bytes: *mut usize,\n    library: cuda_types::cuda::CUlibrary,\n    name: *const ::core::ffi::c_char,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuLibraryGetGlobal\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bytes, \"cuLibraryGetGlobal\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(library), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&library, \"cuLibraryGetGlobal\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(name), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&name, \"cuLibraryGetGlobal\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLibraryGetManaged(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptr: *mut cuda_types::cuda::CUdeviceptr,\n    bytes: *mut usize,\n    library: cuda_types::cuda::CUlibrary,\n    name: *const ::core::ffi::c_char,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuLibraryGetManaged\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bytes, \"cuLibraryGetManaged\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(library), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&library, \"cuLibraryGetManaged\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(name), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&name, \"cuLibraryGetManaged\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLibraryGetUnifiedFunction(\n    writer: &mut (impl std::io::Write + ?Sized),\n    fptr: *mut *mut ::core::ffi::c_void,\n    library: cuda_types::cuda::CUlibrary,\n    symbol: *const ::core::ffi::c_char,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(fptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fptr, \"cuLibraryGetUnifiedFunction\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(library), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&library, \"cuLibraryGetUnifiedFunction\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(symbol), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&symbol, \"cuLibraryGetUnifiedFunction\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuKernelGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pi: *mut ::core::ffi::c_int,\n    attrib: cuda_types::cuda::CUfunction_attribute,\n    kernel: cuda_types::cuda::CUkernel,\n    dev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pi), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pi, \"cuKernelGetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attrib), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attrib, \"cuKernelGetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kernel), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kernel, \"cuKernelGetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuKernelGetAttribute\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuKernelSetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    attrib: cuda_types::cuda::CUfunction_attribute,\n    val: ::core::ffi::c_int,\n    kernel: cuda_types::cuda::CUkernel,\n    dev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(attrib), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attrib, \"cuKernelSetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(val), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&val, \"cuKernelSetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kernel), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kernel, \"cuKernelSetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuKernelSetAttribute\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuKernelSetCacheConfig(\n    writer: &mut (impl std::io::Write + ?Sized),\n    kernel: cuda_types::cuda::CUkernel,\n    config: cuda_types::cuda::CUfunc_cache,\n    dev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(kernel), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kernel, \"cuKernelSetCacheConfig\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(config), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&config, \"cuKernelSetCacheConfig\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuKernelSetCacheConfig\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuKernelGetName(\n    writer: &mut (impl std::io::Write + ?Sized),\n    name: *mut *const ::core::ffi::c_char,\n    hfunc: cuda_types::cuda::CUkernel,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(name), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&name, \"cuKernelGetName\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hfunc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hfunc, \"cuKernelGetName\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuKernelGetParamInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    kernel: cuda_types::cuda::CUkernel,\n    paramIndex: usize,\n    paramOffset: *mut usize,\n    paramSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(kernel), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kernel, \"cuKernelGetParamInfo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paramIndex), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&paramIndex, \"cuKernelGetParamInfo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paramOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&paramOffset, \"cuKernelGetParamInfo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paramSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&paramSize, \"cuKernelGetParamInfo\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemGetInfo_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    free: *mut usize,\n    total: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(free), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&free, \"cuMemGetInfo_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(total), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&total, \"cuMemGetInfo_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemAlloc_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptr: *mut cuda_types::cuda::CUdeviceptr,\n    bytesize: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuMemAlloc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bytesize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bytesize, \"cuMemAlloc_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemAllocPitch_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptr: *mut cuda_types::cuda::CUdeviceptr,\n    pPitch: *mut usize,\n    WidthInBytes: usize,\n    Height: usize,\n    ElementSizeBytes: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuMemAllocPitch_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pPitch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pPitch, \"cuMemAllocPitch_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(WidthInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&WidthInBytes, \"cuMemAllocPitch_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Height), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Height, \"cuMemAllocPitch_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ElementSizeBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ElementSizeBytes, \"cuMemAllocPitch_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemFree_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptr: cuda_types::cuda::CUdeviceptr,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuMemFree_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemGetAddressRange_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pbase: *mut cuda_types::cuda::CUdeviceptr,\n    psize: *mut usize,\n    dptr: cuda_types::cuda::CUdeviceptr,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pbase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pbase, \"cuMemGetAddressRange_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(psize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&psize, \"cuMemGetAddressRange_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuMemGetAddressRange_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemAllocHost_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pp: *mut *mut ::core::ffi::c_void,\n    bytesize: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pp), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pp, \"cuMemAllocHost_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bytesize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bytesize, \"cuMemAllocHost_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemFreeHost(\n    writer: &mut (impl std::io::Write + ?Sized),\n    p: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(p), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&p, \"cuMemFreeHost\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemHostAlloc(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pp: *mut *mut ::core::ffi::c_void,\n    bytesize: usize,\n    Flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pp), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pp, \"cuMemHostAlloc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bytesize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bytesize, \"cuMemHostAlloc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Flags, \"cuMemHostAlloc\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemHostGetDevicePointer_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pdptr: *mut cuda_types::cuda::CUdeviceptr,\n    p: *mut ::core::ffi::c_void,\n    Flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pdptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pdptr, \"cuMemHostGetDevicePointer_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(p), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&p, \"cuMemHostGetDevicePointer_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Flags, \"cuMemHostGetDevicePointer_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemHostGetFlags(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pFlags: *mut ::core::ffi::c_uint,\n    p: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pFlags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pFlags, \"cuMemHostGetFlags\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(p), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&p, \"cuMemHostGetFlags\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemAllocManaged(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptr: *mut cuda_types::cuda::CUdeviceptr,\n    bytesize: usize,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuMemAllocManaged\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bytesize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bytesize, \"cuMemAllocManaged\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuMemAllocManaged\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDeviceRegisterAsyncNotification(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::cuda::CUdevice,\n    callbackFunc: cuda_types::cuda::CUasyncCallback,\n    userData: *mut ::core::ffi::c_void,\n    callback: *mut cuda_types::cuda::CUasyncCallbackHandle,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"cuDeviceRegisterAsyncNotification\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(callbackFunc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &callbackFunc,\n        \"cuDeviceRegisterAsyncNotification\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(userData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &userData,\n        \"cuDeviceRegisterAsyncNotification\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(callback), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &callback,\n        \"cuDeviceRegisterAsyncNotification\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDeviceUnregisterAsyncNotification(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::cuda::CUdevice,\n    callback: cuda_types::cuda::CUasyncCallbackHandle,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"cuDeviceUnregisterAsyncNotification\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(callback), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &callback,\n        \"cuDeviceUnregisterAsyncNotification\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDeviceGetByPCIBusId(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dev: *mut cuda_types::cuda::CUdevice,\n    pciBusId: *const ::core::ffi::c_char,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuDeviceGetByPCIBusId\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pciBusId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pciBusId, \"cuDeviceGetByPCIBusId\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDeviceGetPCIBusId(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pciBusId: *mut ::core::ffi::c_char,\n    len: ::core::ffi::c_int,\n    dev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pciBusId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pciBusId, \"cuDeviceGetPCIBusId\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(len), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&len, \"cuDeviceGetPCIBusId\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuDeviceGetPCIBusId\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuIpcGetEventHandle(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pHandle: *mut cuda_types::cuda::CUipcEventHandle,\n    event: cuda_types::cuda::CUevent,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pHandle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pHandle, \"cuIpcGetEventHandle\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(event), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&event, \"cuIpcGetEventHandle\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuIpcOpenEventHandle(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phEvent: *mut cuda_types::cuda::CUevent,\n    handle: cuda_types::cuda::CUipcEventHandle,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phEvent), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phEvent, \"cuIpcOpenEventHandle\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cuIpcOpenEventHandle\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuIpcGetMemHandle(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pHandle: *mut cuda_types::cuda::CUipcMemHandle,\n    dptr: cuda_types::cuda::CUdeviceptr,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pHandle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pHandle, \"cuIpcGetMemHandle\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuIpcGetMemHandle\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuIpcOpenMemHandle_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pdptr: *mut cuda_types::cuda::CUdeviceptr,\n    handle: cuda_types::cuda::CUipcMemHandle,\n    Flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pdptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pdptr, \"cuIpcOpenMemHandle_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cuIpcOpenMemHandle_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Flags, \"cuIpcOpenMemHandle_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuIpcCloseMemHandle(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptr: cuda_types::cuda::CUdeviceptr,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuIpcCloseMemHandle\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemHostRegister_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    p: *mut ::core::ffi::c_void,\n    bytesize: usize,\n    Flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(p), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&p, \"cuMemHostRegister_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bytesize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bytesize, \"cuMemHostRegister_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Flags, \"cuMemHostRegister_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemHostUnregister(\n    writer: &mut (impl std::io::Write + ?Sized),\n    p: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(p), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&p, \"cuMemHostUnregister\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpy_ptds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dst: cuda_types::cuda::CUdeviceptr,\n    src: cuda_types::cuda::CUdeviceptr,\n    ByteCount: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dst), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dst, \"cuMemcpy_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(src), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&src, \"cuMemcpy_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpy_ptds\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyPeer_ptds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    dstContext: cuda_types::cuda::CUcontext,\n    srcDevice: cuda_types::cuda::CUdeviceptr,\n    srcContext: cuda_types::cuda::CUcontext,\n    ByteCount: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemcpyPeer_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstContext), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstContext, \"cuMemcpyPeer_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcDevice, \"cuMemcpyPeer_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcContext), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcContext, \"cuMemcpyPeer_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyPeer_ptds\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyHtoD_v2_ptds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    srcHost: *const ::core::ffi::c_void,\n    ByteCount: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemcpyHtoD_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcHost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcHost, \"cuMemcpyHtoD_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyHtoD_v2_ptds\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyDtoH_v2_ptds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstHost: *mut ::core::ffi::c_void,\n    srcDevice: cuda_types::cuda::CUdeviceptr,\n    ByteCount: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstHost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstHost, \"cuMemcpyDtoH_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcDevice, \"cuMemcpyDtoH_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyDtoH_v2_ptds\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyDtoD_v2_ptds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    srcDevice: cuda_types::cuda::CUdeviceptr,\n    ByteCount: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemcpyDtoD_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcDevice, \"cuMemcpyDtoD_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyDtoD_v2_ptds\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyDtoA_v2_ptds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstArray: cuda_types::cuda::CUarray,\n    dstOffset: usize,\n    srcDevice: cuda_types::cuda::CUdeviceptr,\n    ByteCount: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstArray, \"cuMemcpyDtoA_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstOffset, \"cuMemcpyDtoA_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcDevice, \"cuMemcpyDtoA_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyDtoA_v2_ptds\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyAtoD_v2_ptds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    srcArray: cuda_types::cuda::CUarray,\n    srcOffset: usize,\n    ByteCount: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemcpyAtoD_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcArray, \"cuMemcpyAtoD_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcOffset, \"cuMemcpyAtoD_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyAtoD_v2_ptds\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyHtoA_v2_ptds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstArray: cuda_types::cuda::CUarray,\n    dstOffset: usize,\n    srcHost: *const ::core::ffi::c_void,\n    ByteCount: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstArray, \"cuMemcpyHtoA_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstOffset, \"cuMemcpyHtoA_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcHost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcHost, \"cuMemcpyHtoA_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyHtoA_v2_ptds\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyAtoH_v2_ptds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstHost: *mut ::core::ffi::c_void,\n    srcArray: cuda_types::cuda::CUarray,\n    srcOffset: usize,\n    ByteCount: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstHost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstHost, \"cuMemcpyAtoH_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcArray, \"cuMemcpyAtoH_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcOffset, \"cuMemcpyAtoH_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyAtoH_v2_ptds\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyAtoA_v2_ptds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstArray: cuda_types::cuda::CUarray,\n    dstOffset: usize,\n    srcArray: cuda_types::cuda::CUarray,\n    srcOffset: usize,\n    ByteCount: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstArray, \"cuMemcpyAtoA_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstOffset, \"cuMemcpyAtoA_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcArray, \"cuMemcpyAtoA_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcOffset, \"cuMemcpyAtoA_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyAtoA_v2_ptds\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpy2D_v2_ptds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pCopy: *const cuda_types::cuda::CUDA_MEMCPY2D,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pCopy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pCopy, \"cuMemcpy2D_v2_ptds\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpy2DUnaligned_v2_ptds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pCopy: *const cuda_types::cuda::CUDA_MEMCPY2D,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pCopy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pCopy, \"cuMemcpy2DUnaligned_v2_ptds\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpy3D_v2_ptds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pCopy: *const cuda_types::cuda::CUDA_MEMCPY3D,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pCopy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pCopy, \"cuMemcpy3D_v2_ptds\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpy3DPeer_ptds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pCopy: *const cuda_types::cuda::CUDA_MEMCPY3D_PEER,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pCopy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pCopy, \"cuMemcpy3DPeer_ptds\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyAsync_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dst: cuda_types::cuda::CUdeviceptr,\n    src: cuda_types::cuda::CUdeviceptr,\n    ByteCount: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dst), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dst, \"cuMemcpyAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(src), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&src, \"cuMemcpyAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpyAsync_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyPeerAsync_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    dstContext: cuda_types::cuda::CUcontext,\n    srcDevice: cuda_types::cuda::CUdeviceptr,\n    srcContext: cuda_types::cuda::CUcontext,\n    ByteCount: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemcpyPeerAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstContext), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstContext, \"cuMemcpyPeerAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcDevice, \"cuMemcpyPeerAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcContext), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcContext, \"cuMemcpyPeerAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyPeerAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpyPeerAsync_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyHtoDAsync_v2_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    srcHost: *const ::core::ffi::c_void,\n    ByteCount: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemcpyHtoDAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcHost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcHost, \"cuMemcpyHtoDAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyHtoDAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpyHtoDAsync_v2_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyDtoHAsync_v2_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstHost: *mut ::core::ffi::c_void,\n    srcDevice: cuda_types::cuda::CUdeviceptr,\n    ByteCount: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstHost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstHost, \"cuMemcpyDtoHAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcDevice, \"cuMemcpyDtoHAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyDtoHAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpyDtoHAsync_v2_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyDtoDAsync_v2_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    srcDevice: cuda_types::cuda::CUdeviceptr,\n    ByteCount: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemcpyDtoDAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcDevice, \"cuMemcpyDtoDAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyDtoDAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpyDtoDAsync_v2_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyHtoAAsync_v2_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstArray: cuda_types::cuda::CUarray,\n    dstOffset: usize,\n    srcHost: *const ::core::ffi::c_void,\n    ByteCount: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstArray, \"cuMemcpyHtoAAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstOffset, \"cuMemcpyHtoAAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcHost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcHost, \"cuMemcpyHtoAAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyHtoAAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpyHtoAAsync_v2_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyAtoHAsync_v2_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstHost: *mut ::core::ffi::c_void,\n    srcArray: cuda_types::cuda::CUarray,\n    srcOffset: usize,\n    ByteCount: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstHost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstHost, \"cuMemcpyAtoHAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcArray, \"cuMemcpyAtoHAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcOffset, \"cuMemcpyAtoHAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyAtoHAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpyAtoHAsync_v2_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpy2DAsync_v2_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pCopy: *const cuda_types::cuda::CUDA_MEMCPY2D,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pCopy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pCopy, \"cuMemcpy2DAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpy2DAsync_v2_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpy3DAsync_v2_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pCopy: *const cuda_types::cuda::CUDA_MEMCPY3D,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pCopy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pCopy, \"cuMemcpy3DAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpy3DAsync_v2_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpy3DPeerAsync_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pCopy: *const cuda_types::cuda::CUDA_MEMCPY3D_PEER,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pCopy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pCopy, \"cuMemcpy3DPeerAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpy3DPeerAsync_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyBatchAsync_v2_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dsts: *mut cuda_types::cuda::CUdeviceptr,\n    srcs: *mut cuda_types::cuda::CUdeviceptr,\n    sizes: *mut usize,\n    count: usize,\n    attrs: *mut cuda_types::cuda::CUmemcpyAttributes,\n    attrsIdxs: *mut usize,\n    numAttrs: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dsts), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dsts, \"cuMemcpyBatchAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcs, \"cuMemcpyBatchAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&sizes, \"cuMemcpyBatchAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuMemcpyBatchAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attrs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attrs, \"cuMemcpyBatchAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attrsIdxs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &attrsIdxs,\n        \"cuMemcpyBatchAsync_v2_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numAttrs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numAttrs, \"cuMemcpyBatchAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpyBatchAsync_v2_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpy3DBatchAsync_v2_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    numOps: usize,\n    opList: *mut cuda_types::cuda::CUDA_MEMCPY3D_BATCH_OP,\n    flags: ::core::ffi::c_ulonglong,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(numOps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numOps, \"cuMemcpy3DBatchAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opList), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opList, \"cuMemcpy3DBatchAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuMemcpy3DBatchAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hStream,\n        \"cuMemcpy3DBatchAsync_v2_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD8_v2_ptds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    uc: ::core::ffi::c_uchar,\n    N: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD8_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uc, \"cuMemsetD8_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(N), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&N, \"cuMemsetD8_v2_ptds\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD16_v2_ptds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    us: ::core::ffi::c_ushort,\n    N: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD16_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(us), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&us, \"cuMemsetD16_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(N), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&N, \"cuMemsetD16_v2_ptds\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD32_v2_ptds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    ui: ::core::ffi::c_uint,\n    N: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD32_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ui), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ui, \"cuMemsetD32_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(N), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&N, \"cuMemsetD32_v2_ptds\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD2D8_v2_ptds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    dstPitch: usize,\n    uc: ::core::ffi::c_uchar,\n    Width: usize,\n    Height: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD2D8_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstPitch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstPitch, \"cuMemsetD2D8_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uc, \"cuMemsetD2D8_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Width), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Width, \"cuMemsetD2D8_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Height), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Height, \"cuMemsetD2D8_v2_ptds\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD2D16_v2_ptds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    dstPitch: usize,\n    us: ::core::ffi::c_ushort,\n    Width: usize,\n    Height: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD2D16_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstPitch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstPitch, \"cuMemsetD2D16_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(us), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&us, \"cuMemsetD2D16_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Width), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Width, \"cuMemsetD2D16_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Height), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Height, \"cuMemsetD2D16_v2_ptds\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD2D32_v2_ptds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    dstPitch: usize,\n    ui: ::core::ffi::c_uint,\n    Width: usize,\n    Height: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD2D32_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstPitch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstPitch, \"cuMemsetD2D32_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ui), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ui, \"cuMemsetD2D32_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Width), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Width, \"cuMemsetD2D32_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Height), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Height, \"cuMemsetD2D32_v2_ptds\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD8Async_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    uc: ::core::ffi::c_uchar,\n    N: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD8Async_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uc, \"cuMemsetD8Async_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(N), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&N, \"cuMemsetD8Async_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemsetD8Async_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD16Async_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    us: ::core::ffi::c_ushort,\n    N: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD16Async_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(us), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&us, \"cuMemsetD16Async_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(N), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&N, \"cuMemsetD16Async_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemsetD16Async_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD32Async_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    ui: ::core::ffi::c_uint,\n    N: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD32Async_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ui), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ui, \"cuMemsetD32Async_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(N), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&N, \"cuMemsetD32Async_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemsetD32Async_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD2D8Async_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    dstPitch: usize,\n    uc: ::core::ffi::c_uchar,\n    Width: usize,\n    Height: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD2D8Async_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstPitch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstPitch, \"cuMemsetD2D8Async_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uc, \"cuMemsetD2D8Async_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Width), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Width, \"cuMemsetD2D8Async_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Height), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Height, \"cuMemsetD2D8Async_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemsetD2D8Async_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD2D16Async_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    dstPitch: usize,\n    us: ::core::ffi::c_ushort,\n    Width: usize,\n    Height: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD2D16Async_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstPitch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstPitch, \"cuMemsetD2D16Async_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(us), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&us, \"cuMemsetD2D16Async_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Width), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Width, \"cuMemsetD2D16Async_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Height), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Height, \"cuMemsetD2D16Async_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemsetD2D16Async_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD2D32Async_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    dstPitch: usize,\n    ui: ::core::ffi::c_uint,\n    Width: usize,\n    Height: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD2D32Async_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstPitch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstPitch, \"cuMemsetD2D32Async_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ui), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ui, \"cuMemsetD2D32Async_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Width), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Width, \"cuMemsetD2D32Async_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Height), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Height, \"cuMemsetD2D32Async_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemsetD2D32Async_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuArrayCreate_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pHandle: *mut cuda_types::cuda::CUarray,\n    pAllocateArray: *const cuda_types::cuda::CUDA_ARRAY_DESCRIPTOR,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pHandle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pHandle, \"cuArrayCreate_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pAllocateArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pAllocateArray, \"cuArrayCreate_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuArrayGetDescriptor_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pArrayDescriptor: *mut cuda_types::cuda::CUDA_ARRAY_DESCRIPTOR,\n    hArray: cuda_types::cuda::CUarray,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pArrayDescriptor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pArrayDescriptor,\n        \"cuArrayGetDescriptor_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hArray, \"cuArrayGetDescriptor_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuArrayGetSparseProperties(\n    writer: &mut (impl std::io::Write + ?Sized),\n    sparseProperties: *mut cuda_types::cuda::CUDA_ARRAY_SPARSE_PROPERTIES,\n    array: cuda_types::cuda::CUarray,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(sparseProperties), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sparseProperties,\n        \"cuArrayGetSparseProperties\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&array, \"cuArrayGetSparseProperties\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMipmappedArrayGetSparseProperties(\n    writer: &mut (impl std::io::Write + ?Sized),\n    sparseProperties: *mut cuda_types::cuda::CUDA_ARRAY_SPARSE_PROPERTIES,\n    mipmap: cuda_types::cuda::CUmipmappedArray,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(sparseProperties), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sparseProperties,\n        \"cuMipmappedArrayGetSparseProperties\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mipmap), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mipmap,\n        \"cuMipmappedArrayGetSparseProperties\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuArrayGetMemoryRequirements(\n    writer: &mut (impl std::io::Write + ?Sized),\n    memoryRequirements: *mut cuda_types::cuda::CUDA_ARRAY_MEMORY_REQUIREMENTS,\n    array: cuda_types::cuda::CUarray,\n    device: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(memoryRequirements), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &memoryRequirements,\n        \"cuArrayGetMemoryRequirements\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&array, \"cuArrayGetMemoryRequirements\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"cuArrayGetMemoryRequirements\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMipmappedArrayGetMemoryRequirements(\n    writer: &mut (impl std::io::Write + ?Sized),\n    memoryRequirements: *mut cuda_types::cuda::CUDA_ARRAY_MEMORY_REQUIREMENTS,\n    mipmap: cuda_types::cuda::CUmipmappedArray,\n    device: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(memoryRequirements), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &memoryRequirements,\n        \"cuMipmappedArrayGetMemoryRequirements\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mipmap), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mipmap,\n        \"cuMipmappedArrayGetMemoryRequirements\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"cuMipmappedArrayGetMemoryRequirements\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuArrayGetPlane(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pPlaneArray: *mut cuda_types::cuda::CUarray,\n    hArray: cuda_types::cuda::CUarray,\n    planeIdx: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pPlaneArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pPlaneArray, \"cuArrayGetPlane\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hArray, \"cuArrayGetPlane\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(planeIdx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&planeIdx, \"cuArrayGetPlane\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuArrayDestroy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hArray: cuda_types::cuda::CUarray,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hArray, \"cuArrayDestroy\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuArray3DCreate_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pHandle: *mut cuda_types::cuda::CUarray,\n    pAllocateArray: *const cuda_types::cuda::CUDA_ARRAY3D_DESCRIPTOR,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pHandle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pHandle, \"cuArray3DCreate_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pAllocateArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pAllocateArray, \"cuArray3DCreate_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuArray3DGetDescriptor_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pArrayDescriptor: *mut cuda_types::cuda::CUDA_ARRAY3D_DESCRIPTOR,\n    hArray: cuda_types::cuda::CUarray,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pArrayDescriptor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pArrayDescriptor,\n        \"cuArray3DGetDescriptor_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hArray, \"cuArray3DGetDescriptor_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMipmappedArrayCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pHandle: *mut cuda_types::cuda::CUmipmappedArray,\n    pMipmappedArrayDesc: *const cuda_types::cuda::CUDA_ARRAY3D_DESCRIPTOR,\n    numMipmapLevels: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pHandle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pHandle, \"cuMipmappedArrayCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pMipmappedArrayDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pMipmappedArrayDesc,\n        \"cuMipmappedArrayCreate\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numMipmapLevels), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numMipmapLevels,\n        \"cuMipmappedArrayCreate\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMipmappedArrayGetLevel(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pLevelArray: *mut cuda_types::cuda::CUarray,\n    hMipmappedArray: cuda_types::cuda::CUmipmappedArray,\n    level: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pLevelArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pLevelArray,\n        \"cuMipmappedArrayGetLevel\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hMipmappedArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hMipmappedArray,\n        \"cuMipmappedArrayGetLevel\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(level), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&level, \"cuMipmappedArrayGetLevel\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMipmappedArrayDestroy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hMipmappedArray: cuda_types::cuda::CUmipmappedArray,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hMipmappedArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hMipmappedArray,\n        \"cuMipmappedArrayDestroy\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemGetHandleForAddressRange(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: *mut ::core::ffi::c_void,\n    dptr: cuda_types::cuda::CUdeviceptr,\n    size: usize,\n    handleType: cuda_types::cuda::CUmemRangeHandleType,\n    flags: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cuMemGetHandleForAddressRange\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuMemGetHandleForAddressRange\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cuMemGetHandleForAddressRange\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(handleType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handleType,\n        \"cuMemGetHandleForAddressRange\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuMemGetHandleForAddressRange\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmemDecompressAlgorithm_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUmemDecompressAlgorithm_enum::CU_MEM_DECOMPRESS_UNSUPPORTED => {\n                writer.write_all(stringify!(CU_MEM_DECOMPRESS_UNSUPPORTED).as_bytes())\n            }\n            &cuda_types::cuda::CUmemDecompressAlgorithm_enum::CU_MEM_DECOMPRESS_ALGORITHM_DEFLATE => {\n                writer\n                    .write_all(\n                        stringify!(CU_MEM_DECOMPRESS_ALGORITHM_DEFLATE).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUmemDecompressAlgorithm_enum::CU_MEM_DECOMPRESS_ALGORITHM_SNAPPY => {\n                writer\n                    .write_all(stringify!(CU_MEM_DECOMPRESS_ALGORITHM_SNAPPY).as_bytes())\n            }\n            &cuda_types::cuda::CUmemDecompressAlgorithm_enum::CU_MEM_DECOMPRESS_ALGORITHM_LZ4 => {\n                writer.write_all(stringify!(CU_MEM_DECOMPRESS_ALGORITHM_LZ4).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUmemDecompressParams_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(srcNumBytes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcNumBytes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstNumBytes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstNumBytes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstActBytes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstActBytes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(src), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.src, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dst), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dst, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(algo), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.algo, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(padding), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.padding, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\npub fn write_cuMemBatchDecompressAsync_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    paramsArray: *mut cuda_types::cuda::CUmemDecompressParams,\n    count: usize,\n    flags: ::core::ffi::c_uint,\n    errorIndex: *mut usize,\n    stream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(paramsArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paramsArray,\n        \"cuMemBatchDecompressAsync_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &count,\n        \"cuMemBatchDecompressAsync_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &flags,\n        \"cuMemBatchDecompressAsync_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(errorIndex), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &errorIndex,\n        \"cuMemBatchDecompressAsync_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stream,\n        \"cuMemBatchDecompressAsync_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemAddressReserve(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ptr: *mut cuda_types::cuda::CUdeviceptr,\n    size: usize,\n    alignment: usize,\n    addr: cuda_types::cuda::CUdeviceptr,\n    flags: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ptr, \"cuMemAddressReserve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cuMemAddressReserve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alignment), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alignment, \"cuMemAddressReserve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(addr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&addr, \"cuMemAddressReserve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuMemAddressReserve\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemAddressFree(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ptr: cuda_types::cuda::CUdeviceptr,\n    size: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ptr, \"cuMemAddressFree\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cuMemAddressFree\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: *mut cuda_types::cuda::CUmemGenericAllocationHandle,\n    size: usize,\n    prop: *const cuda_types::cuda::CUmemAllocationProp,\n    flags: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cuMemCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cuMemCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(prop), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&prop, \"cuMemCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuMemCreate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemRelease(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cuda::CUmemGenericAllocationHandle,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cuMemRelease\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemMap(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ptr: cuda_types::cuda::CUdeviceptr,\n    size: usize,\n    offset: usize,\n    handle: cuda_types::cuda::CUmemGenericAllocationHandle,\n    flags: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ptr, \"cuMemMap\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cuMemMap\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(offset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&offset, \"cuMemMap\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cuMemMap\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuMemMap\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemMapArrayAsync_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    mapInfoList: *mut cuda_types::cuda::CUarrayMapInfo,\n    count: ::core::ffi::c_uint,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(mapInfoList), \": \").as_bytes())?;\n    writer.write_all(b\"[\")?;\n    for i in 0..count {\n        if i != 0 {\n            writer.write_all(b\", \")?;\n        }\n        crate::CudaDisplay::write(\n            unsafe { &*mapInfoList.add(i as usize) },\n            \"cuMemMapArrayAsync_ptsz\",\n            arg_idx,\n            writer,\n        )?;\n    }\n    writer.write_all(b\"]\")?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuMemMapArrayAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemMapArrayAsync_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemUnmap(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ptr: cuda_types::cuda::CUdeviceptr,\n    size: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ptr, \"cuMemUnmap\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cuMemUnmap\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemSetAccess(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ptr: cuda_types::cuda::CUdeviceptr,\n    size: usize,\n    desc: *const cuda_types::cuda::CUmemAccessDesc,\n    count: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ptr, \"cuMemSetAccess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cuMemSetAccess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(desc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&desc, \"cuMemSetAccess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuMemSetAccess\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemGetAccess(\n    writer: &mut (impl std::io::Write + ?Sized),\n    flags: *mut ::core::ffi::c_ulonglong,\n    location: *const cuda_types::cuda::CUmemLocation,\n    ptr: cuda_types::cuda::CUdeviceptr,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuMemGetAccess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(location), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&location, \"cuMemGetAccess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ptr, \"cuMemGetAccess\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemExportToShareableHandle(\n    writer: &mut (impl std::io::Write + ?Sized),\n    shareableHandle: *mut ::core::ffi::c_void,\n    handle: cuda_types::cuda::CUmemGenericAllocationHandle,\n    handleType: cuda_types::cuda::CUmemAllocationHandleType,\n    flags: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(shareableHandle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &shareableHandle,\n        \"cuMemExportToShareableHandle\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cuMemExportToShareableHandle\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(handleType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handleType,\n        \"cuMemExportToShareableHandle\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuMemExportToShareableHandle\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemImportFromShareableHandle(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: *mut cuda_types::cuda::CUmemGenericAllocationHandle,\n    osHandle: *mut ::core::ffi::c_void,\n    shHandleType: cuda_types::cuda::CUmemAllocationHandleType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cuMemImportFromShareableHandle\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(osHandle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &osHandle,\n        \"cuMemImportFromShareableHandle\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(shHandleType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &shHandleType,\n        \"cuMemImportFromShareableHandle\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemGetAllocationGranularity(\n    writer: &mut (impl std::io::Write + ?Sized),\n    granularity: *mut usize,\n    prop: *const cuda_types::cuda::CUmemAllocationProp,\n    option: cuda_types::cuda::CUmemAllocationGranularity_flags,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(granularity), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &granularity,\n        \"cuMemGetAllocationGranularity\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(prop), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&prop, \"cuMemGetAllocationGranularity\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(option), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &option,\n        \"cuMemGetAllocationGranularity\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemGetAllocationPropertiesFromHandle(\n    writer: &mut (impl std::io::Write + ?Sized),\n    prop: *mut cuda_types::cuda::CUmemAllocationProp,\n    handle: cuda_types::cuda::CUmemGenericAllocationHandle,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(prop), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &prop,\n        \"cuMemGetAllocationPropertiesFromHandle\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cuMemGetAllocationPropertiesFromHandle\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemRetainAllocationHandle(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: *mut cuda_types::cuda::CUmemGenericAllocationHandle,\n    addr: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cuMemRetainAllocationHandle\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(addr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&addr, \"cuMemRetainAllocationHandle\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemFreeAsync_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptr: cuda_types::cuda::CUdeviceptr,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuMemFreeAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemFreeAsync_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemAllocAsync_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptr: *mut cuda_types::cuda::CUdeviceptr,\n    bytesize: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuMemAllocAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bytesize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bytesize, \"cuMemAllocAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemAllocAsync_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemPoolTrimTo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pool: cuda_types::cuda::CUmemoryPool,\n    minBytesToKeep: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pool), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pool, \"cuMemPoolTrimTo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(minBytesToKeep), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&minBytesToKeep, \"cuMemPoolTrimTo\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemPoolSetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pool: cuda_types::cuda::CUmemoryPool,\n    attr: cuda_types::cuda::CUmemPool_attribute,\n    value: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pool), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pool, \"cuMemPoolSetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attr, \"cuMemPoolSetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuMemPoolSetAttribute\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemPoolGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pool: cuda_types::cuda::CUmemoryPool,\n    attr: cuda_types::cuda::CUmemPool_attribute,\n    value: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pool), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pool, \"cuMemPoolGetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attr, \"cuMemPoolGetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuMemPoolGetAttribute\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemPoolSetAccess(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pool: cuda_types::cuda::CUmemoryPool,\n    map: *const cuda_types::cuda::CUmemAccessDesc,\n    count: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pool), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pool, \"cuMemPoolSetAccess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(map), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&map, \"cuMemPoolSetAccess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuMemPoolSetAccess\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemPoolGetAccess(\n    writer: &mut (impl std::io::Write + ?Sized),\n    flags: *mut cuda_types::cuda::CUmemAccess_flags,\n    memPool: cuda_types::cuda::CUmemoryPool,\n    location: *mut cuda_types::cuda::CUmemLocation,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuMemPoolGetAccess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(memPool), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&memPool, \"cuMemPoolGetAccess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(location), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&location, \"cuMemPoolGetAccess\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemPoolCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pool: *mut cuda_types::cuda::CUmemoryPool,\n    poolProps: *const cuda_types::cuda::CUmemPoolProps,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pool), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pool, \"cuMemPoolCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(poolProps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&poolProps, \"cuMemPoolCreate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemPoolDestroy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pool: cuda_types::cuda::CUmemoryPool,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pool), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pool, \"cuMemPoolDestroy\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemGetDefaultMemPool(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pool_out: *mut cuda_types::cuda::CUmemoryPool,\n    location: *mut cuda_types::cuda::CUmemLocation,\n    type_: cuda_types::cuda::CUmemAllocationType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pool_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pool_out, \"cuMemGetDefaultMemPool\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(location), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&location, \"cuMemGetDefaultMemPool\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cuMemGetDefaultMemPool\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemGetMemPool(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pool: *mut cuda_types::cuda::CUmemoryPool,\n    location: *mut cuda_types::cuda::CUmemLocation,\n    type_: cuda_types::cuda::CUmemAllocationType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pool), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pool, \"cuMemGetMemPool\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(location), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&location, \"cuMemGetMemPool\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cuMemGetMemPool\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemSetMemPool(\n    writer: &mut (impl std::io::Write + ?Sized),\n    location: *mut cuda_types::cuda::CUmemLocation,\n    type_: cuda_types::cuda::CUmemAllocationType,\n    pool: cuda_types::cuda::CUmemoryPool,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(location), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&location, \"cuMemSetMemPool\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cuMemSetMemPool\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pool), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pool, \"cuMemSetMemPool\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemAllocFromPoolAsync_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptr: *mut cuda_types::cuda::CUdeviceptr,\n    bytesize: usize,\n    pool: cuda_types::cuda::CUmemoryPool,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuMemAllocFromPoolAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bytesize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bytesize,\n        \"cuMemAllocFromPoolAsync_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pool), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pool, \"cuMemAllocFromPoolAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hStream,\n        \"cuMemAllocFromPoolAsync_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemPoolExportToShareableHandle(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle_out: *mut ::core::ffi::c_void,\n    pool: cuda_types::cuda::CUmemoryPool,\n    handleType: cuda_types::cuda::CUmemAllocationHandleType,\n    flags: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle_out,\n        \"cuMemPoolExportToShareableHandle\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pool), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pool,\n        \"cuMemPoolExportToShareableHandle\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(handleType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handleType,\n        \"cuMemPoolExportToShareableHandle\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &flags,\n        \"cuMemPoolExportToShareableHandle\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemPoolImportFromShareableHandle(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pool_out: *mut cuda_types::cuda::CUmemoryPool,\n    handle: *mut ::core::ffi::c_void,\n    handleType: cuda_types::cuda::CUmemAllocationHandleType,\n    flags: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pool_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pool_out,\n        \"cuMemPoolImportFromShareableHandle\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cuMemPoolImportFromShareableHandle\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(handleType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handleType,\n        \"cuMemPoolImportFromShareableHandle\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &flags,\n        \"cuMemPoolImportFromShareableHandle\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemPoolExportPointer(\n    writer: &mut (impl std::io::Write + ?Sized),\n    shareData_out: *mut cuda_types::cuda::CUmemPoolPtrExportData,\n    ptr: cuda_types::cuda::CUdeviceptr,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(shareData_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &shareData_out,\n        \"cuMemPoolExportPointer\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ptr, \"cuMemPoolExportPointer\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemPoolImportPointer(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ptr_out: *mut cuda_types::cuda::CUdeviceptr,\n    pool: cuda_types::cuda::CUmemoryPool,\n    shareData: *mut cuda_types::cuda::CUmemPoolPtrExportData,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ptr_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ptr_out, \"cuMemPoolImportPointer\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pool), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pool, \"cuMemPoolImportPointer\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(shareData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&shareData, \"cuMemPoolImportPointer\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMulticastCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    mcHandle: *mut cuda_types::cuda::CUmemGenericAllocationHandle,\n    prop: *const cuda_types::cuda::CUmulticastObjectProp,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(mcHandle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mcHandle, \"cuMulticastCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(prop), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&prop, \"cuMulticastCreate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMulticastAddDevice(\n    writer: &mut (impl std::io::Write + ?Sized),\n    mcHandle: cuda_types::cuda::CUmemGenericAllocationHandle,\n    dev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(mcHandle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mcHandle, \"cuMulticastAddDevice\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuMulticastAddDevice\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMulticastBindMem(\n    writer: &mut (impl std::io::Write + ?Sized),\n    mcHandle: cuda_types::cuda::CUmemGenericAllocationHandle,\n    mcOffset: usize,\n    memHandle: cuda_types::cuda::CUmemGenericAllocationHandle,\n    memOffset: usize,\n    size: usize,\n    flags: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(mcHandle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mcHandle, \"cuMulticastBindMem\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mcOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mcOffset, \"cuMulticastBindMem\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(memHandle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&memHandle, \"cuMulticastBindMem\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(memOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&memOffset, \"cuMulticastBindMem\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cuMulticastBindMem\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuMulticastBindMem\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMulticastBindAddr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    mcHandle: cuda_types::cuda::CUmemGenericAllocationHandle,\n    mcOffset: usize,\n    memptr: cuda_types::cuda::CUdeviceptr,\n    size: usize,\n    flags: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(mcHandle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mcHandle, \"cuMulticastBindAddr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mcOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mcOffset, \"cuMulticastBindAddr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(memptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&memptr, \"cuMulticastBindAddr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cuMulticastBindAddr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuMulticastBindAddr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMulticastUnbind(\n    writer: &mut (impl std::io::Write + ?Sized),\n    mcHandle: cuda_types::cuda::CUmemGenericAllocationHandle,\n    dev: cuda_types::cuda::CUdevice,\n    mcOffset: usize,\n    size: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(mcHandle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mcHandle, \"cuMulticastUnbind\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuMulticastUnbind\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mcOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mcOffset, \"cuMulticastUnbind\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cuMulticastUnbind\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMulticastGetGranularity(\n    writer: &mut (impl std::io::Write + ?Sized),\n    granularity: *mut usize,\n    prop: *const cuda_types::cuda::CUmulticastObjectProp,\n    option: cuda_types::cuda::CUmulticastGranularity_flags,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(granularity), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &granularity,\n        \"cuMulticastGetGranularity\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(prop), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&prop, \"cuMulticastGetGranularity\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(option), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&option, \"cuMulticastGetGranularity\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemPrefetchAsync_v2_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    devPtr: cuda_types::cuda::CUdeviceptr,\n    count: usize,\n    location: cuda_types::cuda::CUmemLocation,\n    flags: ::core::ffi::c_uint,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(devPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&devPtr, \"cuMemPrefetchAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuMemPrefetchAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(location), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&location, \"cuMemPrefetchAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuMemPrefetchAsync_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemPrefetchAsync_v2_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemAdvise_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    devPtr: cuda_types::cuda::CUdeviceptr,\n    count: usize,\n    advice: cuda_types::cuda::CUmem_advise,\n    location: cuda_types::cuda::CUmemLocation,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(devPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&devPtr, \"cuMemAdvise_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuMemAdvise_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(advice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&advice, \"cuMemAdvise_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(location), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&location, \"cuMemAdvise_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemPrefetchBatchAsync_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptrs: *mut cuda_types::cuda::CUdeviceptr,\n    sizes: *mut usize,\n    count: usize,\n    prefetchLocs: *mut cuda_types::cuda::CUmemLocation,\n    prefetchLocIdxs: *mut usize,\n    numPrefetchLocs: usize,\n    flags: ::core::ffi::c_ulonglong,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptrs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptrs, \"cuMemPrefetchBatchAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&sizes, \"cuMemPrefetchBatchAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuMemPrefetchBatchAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(prefetchLocs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &prefetchLocs,\n        \"cuMemPrefetchBatchAsync_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(prefetchLocIdxs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &prefetchLocIdxs,\n        \"cuMemPrefetchBatchAsync_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numPrefetchLocs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numPrefetchLocs,\n        \"cuMemPrefetchBatchAsync_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuMemPrefetchBatchAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hStream,\n        \"cuMemPrefetchBatchAsync_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemDiscardBatchAsync_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptrs: *mut cuda_types::cuda::CUdeviceptr,\n    sizes: *mut usize,\n    count: usize,\n    flags: ::core::ffi::c_ulonglong,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptrs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptrs, \"cuMemDiscardBatchAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&sizes, \"cuMemDiscardBatchAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuMemDiscardBatchAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuMemDiscardBatchAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemDiscardBatchAsync_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemDiscardAndPrefetchBatchAsync_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptrs: *mut cuda_types::cuda::CUdeviceptr,\n    sizes: *mut usize,\n    count: usize,\n    prefetchLocs: *mut cuda_types::cuda::CUmemLocation,\n    prefetchLocIdxs: *mut usize,\n    numPrefetchLocs: usize,\n    flags: ::core::ffi::c_ulonglong,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptrs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dptrs,\n        \"cuMemDiscardAndPrefetchBatchAsync_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizes,\n        \"cuMemDiscardAndPrefetchBatchAsync_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &count,\n        \"cuMemDiscardAndPrefetchBatchAsync_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(prefetchLocs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &prefetchLocs,\n        \"cuMemDiscardAndPrefetchBatchAsync_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(prefetchLocIdxs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &prefetchLocIdxs,\n        \"cuMemDiscardAndPrefetchBatchAsync_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numPrefetchLocs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numPrefetchLocs,\n        \"cuMemDiscardAndPrefetchBatchAsync_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &flags,\n        \"cuMemDiscardAndPrefetchBatchAsync_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hStream,\n        \"cuMemDiscardAndPrefetchBatchAsync_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemRangeGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    data: *mut ::core::ffi::c_void,\n    dataSize: usize,\n    attribute: cuda_types::cuda::CUmem_range_attribute,\n    devPtr: cuda_types::cuda::CUdeviceptr,\n    count: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(data), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&data, \"cuMemRangeGetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataSize, \"cuMemRangeGetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attribute), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attribute, \"cuMemRangeGetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&devPtr, \"cuMemRangeGetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuMemRangeGetAttribute\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemRangeGetAttributes(\n    writer: &mut (impl std::io::Write + ?Sized),\n    data: *mut *mut ::core::ffi::c_void,\n    dataSizes: *mut usize,\n    attributes: *mut cuda_types::cuda::CUmem_range_attribute,\n    numAttributes: usize,\n    devPtr: cuda_types::cuda::CUdeviceptr,\n    count: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(data), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&data, \"cuMemRangeGetAttributes\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataSizes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataSizes, \"cuMemRangeGetAttributes\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attributes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attributes, \"cuMemRangeGetAttributes\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numAttributes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numAttributes,\n        \"cuMemRangeGetAttributes\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&devPtr, \"cuMemRangeGetAttributes\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuMemRangeGetAttributes\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuPointerSetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    value: *const ::core::ffi::c_void,\n    attribute: cuda_types::cuda::CUpointer_attribute,\n    ptr: cuda_types::cuda::CUdeviceptr,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuPointerSetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attribute), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attribute, \"cuPointerSetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ptr, \"cuPointerSetAttribute\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phStream: *mut cuda_types::cuda::CUstream,\n    Flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phStream, \"cuStreamCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Flags, \"cuStreamCreate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamCreateWithPriority(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phStream: *mut cuda_types::cuda::CUstream,\n    flags: ::core::ffi::c_uint,\n    priority: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phStream, \"cuStreamCreateWithPriority\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuStreamCreateWithPriority\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(priority), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&priority, \"cuStreamCreateWithPriority\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamGetPriority_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    priority: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamGetPriority_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(priority), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&priority, \"cuStreamGetPriority_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamGetDevice_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    device: *mut cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamGetDevice_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"cuStreamGetDevice_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamGetFlags_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    flags: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamGetFlags_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuStreamGetFlags_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamGetId_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    streamId: *mut ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamGetId_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(streamId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&streamId, \"cuStreamGetId_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamGetCtx_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    pctx: *mut cuda_types::cuda::CUcontext,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamGetCtx_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pctx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pctx, \"cuStreamGetCtx_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamGetCtx_v2_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    pCtx: *mut cuda_types::cuda::CUcontext,\n    pGreenCtx: *mut cuda_types::cuda::CUgreenCtx,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamGetCtx_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pCtx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pCtx, \"cuStreamGetCtx_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pGreenCtx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pGreenCtx, \"cuStreamGetCtx_v2_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamWaitEvent_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    hEvent: cuda_types::cuda::CUevent,\n    Flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamWaitEvent_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hEvent), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hEvent, \"cuStreamWaitEvent_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Flags, \"cuStreamWaitEvent_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamAddCallback_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    callback: cuda_types::cuda::CUstreamCallback,\n    userData: *mut ::core::ffi::c_void,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamAddCallback_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(callback), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&callback, \"cuStreamAddCallback_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(userData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&userData, \"cuStreamAddCallback_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuStreamAddCallback_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamBeginCapture_v2_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    mode: cuda_types::cuda::CUstreamCaptureMode,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hStream,\n        \"cuStreamBeginCapture_v2_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cuStreamBeginCapture_v2_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamBeginCaptureToGraph_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    hGraph: cuda_types::cuda::CUgraph,\n    dependencies: *const cuda_types::cuda::CUgraphNode,\n    dependencyData: *const cuda_types::cuda::CUgraphEdgeData,\n    numDependencies: usize,\n    mode: cuda_types::cuda::CUstreamCaptureMode,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hStream,\n        \"cuStreamBeginCaptureToGraph_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hGraph,\n        \"cuStreamBeginCaptureToGraph_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dependencies,\n        \"cuStreamBeginCaptureToGraph_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencyData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dependencyData,\n        \"cuStreamBeginCaptureToGraph_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependencies,\n        \"cuStreamBeginCaptureToGraph_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cuStreamBeginCaptureToGraph_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuThreadExchangeStreamCaptureMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    mode: *mut cuda_types::cuda::CUstreamCaptureMode,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cuThreadExchangeStreamCaptureMode\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamEndCapture_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    phGraph: *mut cuda_types::cuda::CUgraph,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamEndCapture_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(phGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phGraph, \"cuStreamEndCapture_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamIsCapturing_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    captureStatus: *mut cuda_types::cuda::CUstreamCaptureStatus,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamIsCapturing_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(captureStatus), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &captureStatus,\n        \"cuStreamIsCapturing_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamGetCaptureInfo_v3_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    captureStatus_out: *mut cuda_types::cuda::CUstreamCaptureStatus,\n    id_out: *mut cuda_types::cuda::cuuint64_t,\n    graph_out: *mut cuda_types::cuda::CUgraph,\n    dependencies_out: *mut *const cuda_types::cuda::CUgraphNode,\n    edgeData_out: *mut *const cuda_types::cuda::CUgraphEdgeData,\n    numDependencies_out: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hStream,\n        \"cuStreamGetCaptureInfo_v3_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(captureStatus_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &captureStatus_out,\n        \"cuStreamGetCaptureInfo_v3_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(id_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &id_out,\n        \"cuStreamGetCaptureInfo_v3_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(graph_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &graph_out,\n        \"cuStreamGetCaptureInfo_v3_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencies_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dependencies_out,\n        \"cuStreamGetCaptureInfo_v3_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(edgeData_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &edgeData_out,\n        \"cuStreamGetCaptureInfo_v3_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependencies_out,\n        \"cuStreamGetCaptureInfo_v3_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamUpdateCaptureDependencies_v2_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    dependencies: *mut cuda_types::cuda::CUgraphNode,\n    dependencyData: *const cuda_types::cuda::CUgraphEdgeData,\n    numDependencies: usize,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hStream,\n        \"cuStreamUpdateCaptureDependencies_v2_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dependencies,\n        \"cuStreamUpdateCaptureDependencies_v2_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencyData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dependencyData,\n        \"cuStreamUpdateCaptureDependencies_v2_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependencies,\n        \"cuStreamUpdateCaptureDependencies_v2_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &flags,\n        \"cuStreamUpdateCaptureDependencies_v2_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamAttachMemAsync_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    dptr: cuda_types::cuda::CUdeviceptr,\n    length: usize,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamAttachMemAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuStreamAttachMemAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(length), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&length, \"cuStreamAttachMemAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuStreamAttachMemAsync_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamQuery_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamQuery_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamSynchronize_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamSynchronize_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamDestroy_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamDestroy_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamCopyAttributes_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dst: cuda_types::cuda::CUstream,\n    src: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dst), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dst, \"cuStreamCopyAttributes_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(src), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&src, \"cuStreamCopyAttributes_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuEventCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phEvent: *mut cuda_types::cuda::CUevent,\n    Flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phEvent), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phEvent, \"cuEventCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Flags, \"cuEventCreate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuEventRecord_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hEvent: cuda_types::cuda::CUevent,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hEvent), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hEvent, \"cuEventRecord_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuEventRecord_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuEventRecordWithFlags_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hEvent: cuda_types::cuda::CUevent,\n    hStream: cuda_types::cuda::CUstream,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hEvent), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hEvent, \"cuEventRecordWithFlags_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuEventRecordWithFlags_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuEventRecordWithFlags_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuEventQuery(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hEvent: cuda_types::cuda::CUevent,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hEvent), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hEvent, \"cuEventQuery\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuEventSynchronize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hEvent: cuda_types::cuda::CUevent,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hEvent), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hEvent, \"cuEventSynchronize\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuEventDestroy_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hEvent: cuda_types::cuda::CUevent,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hEvent), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hEvent, \"cuEventDestroy_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuEventElapsedTime_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pMilliseconds: *mut f32,\n    hStart: cuda_types::cuda::CUevent,\n    hEnd: cuda_types::cuda::CUevent,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pMilliseconds), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pMilliseconds, \"cuEventElapsedTime_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStart), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStart, \"cuEventElapsedTime_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hEnd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hEnd, \"cuEventElapsedTime_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuImportExternalMemory(\n    writer: &mut (impl std::io::Write + ?Sized),\n    extMem_out: *mut cuda_types::cuda::CUexternalMemory,\n    memHandleDesc: *const cuda_types::cuda::CUDA_EXTERNAL_MEMORY_HANDLE_DESC,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(extMem_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&extMem_out, \"cuImportExternalMemory\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(memHandleDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &memHandleDesc,\n        \"cuImportExternalMemory\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuExternalMemoryGetMappedBuffer(\n    writer: &mut (impl std::io::Write + ?Sized),\n    devPtr: *mut cuda_types::cuda::CUdeviceptr,\n    extMem: cuda_types::cuda::CUexternalMemory,\n    bufferDesc: *const cuda_types::cuda::CUDA_EXTERNAL_MEMORY_BUFFER_DESC,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(devPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &devPtr,\n        \"cuExternalMemoryGetMappedBuffer\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(extMem), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &extMem,\n        \"cuExternalMemoryGetMappedBuffer\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bufferDesc,\n        \"cuExternalMemoryGetMappedBuffer\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuExternalMemoryGetMappedMipmappedArray(\n    writer: &mut (impl std::io::Write + ?Sized),\n    mipmap: *mut cuda_types::cuda::CUmipmappedArray,\n    extMem: cuda_types::cuda::CUexternalMemory,\n    mipmapDesc: *const cuda_types::cuda::CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(mipmap), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mipmap,\n        \"cuExternalMemoryGetMappedMipmappedArray\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(extMem), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &extMem,\n        \"cuExternalMemoryGetMappedMipmappedArray\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mipmapDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mipmapDesc,\n        \"cuExternalMemoryGetMappedMipmappedArray\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDestroyExternalMemory(\n    writer: &mut (impl std::io::Write + ?Sized),\n    extMem: cuda_types::cuda::CUexternalMemory,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(extMem), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&extMem, \"cuDestroyExternalMemory\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuImportExternalSemaphore(\n    writer: &mut (impl std::io::Write + ?Sized),\n    extSem_out: *mut cuda_types::cuda::CUexternalSemaphore,\n    semHandleDesc: *const cuda_types::cuda::CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(extSem_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &extSem_out,\n        \"cuImportExternalSemaphore\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(semHandleDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &semHandleDesc,\n        \"cuImportExternalSemaphore\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuSignalExternalSemaphoresAsync_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    extSemArray: *const cuda_types::cuda::CUexternalSemaphore,\n    paramsArray: *const cuda_types::cuda::CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS,\n    numExtSems: ::core::ffi::c_uint,\n    stream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(extSemArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &extSemArray,\n        \"cuSignalExternalSemaphoresAsync_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paramsArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paramsArray,\n        \"cuSignalExternalSemaphoresAsync_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numExtSems), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numExtSems,\n        \"cuSignalExternalSemaphoresAsync_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stream,\n        \"cuSignalExternalSemaphoresAsync_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuWaitExternalSemaphoresAsync_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    extSemArray: *const cuda_types::cuda::CUexternalSemaphore,\n    paramsArray: *const cuda_types::cuda::CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS,\n    numExtSems: ::core::ffi::c_uint,\n    stream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(extSemArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &extSemArray,\n        \"cuWaitExternalSemaphoresAsync_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paramsArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paramsArray,\n        \"cuWaitExternalSemaphoresAsync_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numExtSems), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numExtSems,\n        \"cuWaitExternalSemaphoresAsync_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stream,\n        \"cuWaitExternalSemaphoresAsync_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDestroyExternalSemaphore(\n    writer: &mut (impl std::io::Write + ?Sized),\n    extSem: cuda_types::cuda::CUexternalSemaphore,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(extSem), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&extSem, \"cuDestroyExternalSemaphore\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamWaitValue32_v2_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    stream: cuda_types::cuda::CUstream,\n    addr: cuda_types::cuda::CUdeviceptr,\n    value: cuda_types::cuda::cuuint32_t,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cuStreamWaitValue32_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(addr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&addr, \"cuStreamWaitValue32_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuStreamWaitValue32_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuStreamWaitValue32_v2_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamWaitValue64_v2_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    stream: cuda_types::cuda::CUstream,\n    addr: cuda_types::cuda::CUdeviceptr,\n    value: cuda_types::cuda::cuuint64_t,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cuStreamWaitValue64_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(addr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&addr, \"cuStreamWaitValue64_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuStreamWaitValue64_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuStreamWaitValue64_v2_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamWriteValue32_v2_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    stream: cuda_types::cuda::CUstream,\n    addr: cuda_types::cuda::CUdeviceptr,\n    value: cuda_types::cuda::cuuint32_t,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cuStreamWriteValue32_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(addr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&addr, \"cuStreamWriteValue32_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuStreamWriteValue32_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuStreamWriteValue32_v2_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamWriteValue64_v2_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    stream: cuda_types::cuda::CUstream,\n    addr: cuda_types::cuda::CUdeviceptr,\n    value: cuda_types::cuda::cuuint64_t,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cuStreamWriteValue64_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(addr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&addr, \"cuStreamWriteValue64_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuStreamWriteValue64_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuStreamWriteValue64_v2_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamBatchMemOp_v2_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    stream: cuda_types::cuda::CUstream,\n    count: ::core::ffi::c_uint,\n    paramArray: *mut cuda_types::cuda::CUstreamBatchMemOpParams,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cuStreamBatchMemOp_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuStreamBatchMemOp_v2_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paramArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paramArray,\n        \"cuStreamBatchMemOp_v2_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuStreamBatchMemOp_v2_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuFuncGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pi: *mut ::core::ffi::c_int,\n    attrib: cuda_types::cuda::CUfunction_attribute,\n    hfunc: cuda_types::cuda::CUfunction,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pi), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pi, \"cuFuncGetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attrib), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attrib, \"cuFuncGetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hfunc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hfunc, \"cuFuncGetAttribute\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuFuncSetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hfunc: cuda_types::cuda::CUfunction,\n    attrib: cuda_types::cuda::CUfunction_attribute,\n    value: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hfunc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hfunc, \"cuFuncSetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attrib), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attrib, \"cuFuncSetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuFuncSetAttribute\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuFuncSetCacheConfig(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hfunc: cuda_types::cuda::CUfunction,\n    config: cuda_types::cuda::CUfunc_cache,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hfunc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hfunc, \"cuFuncSetCacheConfig\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(config), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&config, \"cuFuncSetCacheConfig\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuFuncGetModule(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hmod: *mut cuda_types::cuda::CUmodule,\n    hfunc: cuda_types::cuda::CUfunction,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hmod), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hmod, \"cuFuncGetModule\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hfunc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hfunc, \"cuFuncGetModule\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuFuncGetName(\n    writer: &mut (impl std::io::Write + ?Sized),\n    name: *mut *const ::core::ffi::c_char,\n    hfunc: cuda_types::cuda::CUfunction,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(name), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&name, \"cuFuncGetName\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hfunc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hfunc, \"cuFuncGetName\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuFuncGetParamInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    func: cuda_types::cuda::CUfunction,\n    paramIndex: usize,\n    paramOffset: *mut usize,\n    paramSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(func), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&func, \"cuFuncGetParamInfo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paramIndex), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&paramIndex, \"cuFuncGetParamInfo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paramOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&paramOffset, \"cuFuncGetParamInfo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paramSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&paramSize, \"cuFuncGetParamInfo\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUfunctionLoadingState_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUfunctionLoadingState_enum::CU_FUNCTION_LOADING_STATE_UNLOADED => {\n                writer\n                    .write_all(stringify!(CU_FUNCTION_LOADING_STATE_UNLOADED).as_bytes())\n            }\n            &cuda_types::cuda::CUfunctionLoadingState_enum::CU_FUNCTION_LOADING_STATE_LOADED => {\n                writer.write_all(stringify!(CU_FUNCTION_LOADING_STATE_LOADED).as_bytes())\n            }\n            &cuda_types::cuda::CUfunctionLoadingState_enum::CU_FUNCTION_LOADING_STATE_MAX => {\n                writer.write_all(stringify!(CU_FUNCTION_LOADING_STATE_MAX).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cuFuncIsLoaded(\n    writer: &mut (impl std::io::Write + ?Sized),\n    state: *mut cuda_types::cuda::CUfunctionLoadingState,\n    function: cuda_types::cuda::CUfunction,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(state), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&state, \"cuFuncIsLoaded\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(function), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&function, \"cuFuncIsLoaded\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuFuncLoad(\n    writer: &mut (impl std::io::Write + ?Sized),\n    function: cuda_types::cuda::CUfunction,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(function), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&function, \"cuFuncLoad\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLaunchKernel_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    f: cuda_types::cuda::CUfunction,\n    gridDimX: ::core::ffi::c_uint,\n    gridDimY: ::core::ffi::c_uint,\n    gridDimZ: ::core::ffi::c_uint,\n    blockDimX: ::core::ffi::c_uint,\n    blockDimY: ::core::ffi::c_uint,\n    blockDimZ: ::core::ffi::c_uint,\n    sharedMemBytes: ::core::ffi::c_uint,\n    hStream: cuda_types::cuda::CUstream,\n    kernelParams: *mut *mut ::core::ffi::c_void,\n    extra: *mut *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(f), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&f, \"cuLaunchKernel_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gridDimX), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&gridDimX, \"cuLaunchKernel_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gridDimY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&gridDimY, \"cuLaunchKernel_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gridDimZ), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&gridDimZ, \"cuLaunchKernel_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDimX), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDimX, \"cuLaunchKernel_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDimY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDimY, \"cuLaunchKernel_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDimZ), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDimZ, \"cuLaunchKernel_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sharedMemBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&sharedMemBytes, \"cuLaunchKernel_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuLaunchKernel_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kernelParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kernelParams, \"cuLaunchKernel_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(extra), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&extra, \"cuLaunchKernel_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLaunchKernelEx_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    config: *const cuda_types::cuda::CUlaunchConfig,\n    f: cuda_types::cuda::CUfunction,\n    kernelParams: *mut *mut ::core::ffi::c_void,\n    extra: *mut *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(config), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&config, \"cuLaunchKernelEx_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(f), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&f, \"cuLaunchKernelEx_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kernelParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kernelParams, \"cuLaunchKernelEx_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(extra), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&extra, \"cuLaunchKernelEx_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLaunchCooperativeKernel_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    f: cuda_types::cuda::CUfunction,\n    gridDimX: ::core::ffi::c_uint,\n    gridDimY: ::core::ffi::c_uint,\n    gridDimZ: ::core::ffi::c_uint,\n    blockDimX: ::core::ffi::c_uint,\n    blockDimY: ::core::ffi::c_uint,\n    blockDimZ: ::core::ffi::c_uint,\n    sharedMemBytes: ::core::ffi::c_uint,\n    hStream: cuda_types::cuda::CUstream,\n    kernelParams: *mut *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(f), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&f, \"cuLaunchCooperativeKernel_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gridDimX), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gridDimX,\n        \"cuLaunchCooperativeKernel_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gridDimY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gridDimY,\n        \"cuLaunchCooperativeKernel_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gridDimZ), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gridDimZ,\n        \"cuLaunchCooperativeKernel_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDimX), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockDimX,\n        \"cuLaunchCooperativeKernel_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDimY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockDimY,\n        \"cuLaunchCooperativeKernel_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDimZ), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockDimZ,\n        \"cuLaunchCooperativeKernel_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sharedMemBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sharedMemBytes,\n        \"cuLaunchCooperativeKernel_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hStream,\n        \"cuLaunchCooperativeKernel_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kernelParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &kernelParams,\n        \"cuLaunchCooperativeKernel_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLaunchCooperativeKernelMultiDevice(\n    writer: &mut (impl std::io::Write + ?Sized),\n    launchParamsList: *mut cuda_types::cuda::CUDA_LAUNCH_PARAMS,\n    numDevices: ::core::ffi::c_uint,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(launchParamsList), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &launchParamsList,\n        \"cuLaunchCooperativeKernelMultiDevice\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDevices), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDevices,\n        \"cuLaunchCooperativeKernelMultiDevice\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &flags,\n        \"cuLaunchCooperativeKernelMultiDevice\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLaunchHostFunc_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    fn_: cuda_types::cuda::CUhostFn,\n    userData: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuLaunchHostFunc_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fn_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fn_, \"cuLaunchHostFunc_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(userData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&userData, \"cuLaunchHostFunc_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuFuncSetBlockShape(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hfunc: cuda_types::cuda::CUfunction,\n    x: ::core::ffi::c_int,\n    y: ::core::ffi::c_int,\n    z: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hfunc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hfunc, \"cuFuncSetBlockShape\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cuFuncSetBlockShape\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cuFuncSetBlockShape\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(z), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&z, \"cuFuncSetBlockShape\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuFuncSetSharedSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hfunc: cuda_types::cuda::CUfunction,\n    bytes: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hfunc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hfunc, \"cuFuncSetSharedSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bytes, \"cuFuncSetSharedSize\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuParamSetSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hfunc: cuda_types::cuda::CUfunction,\n    numbytes: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hfunc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hfunc, \"cuParamSetSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numbytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numbytes, \"cuParamSetSize\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuParamSeti(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hfunc: cuda_types::cuda::CUfunction,\n    offset: ::core::ffi::c_int,\n    value: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hfunc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hfunc, \"cuParamSeti\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(offset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&offset, \"cuParamSeti\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuParamSeti\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuParamSetf(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hfunc: cuda_types::cuda::CUfunction,\n    offset: ::core::ffi::c_int,\n    value: f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hfunc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hfunc, \"cuParamSetf\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(offset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&offset, \"cuParamSetf\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuParamSetf\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuParamSetv(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hfunc: cuda_types::cuda::CUfunction,\n    offset: ::core::ffi::c_int,\n    ptr: *mut ::core::ffi::c_void,\n    numbytes: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hfunc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hfunc, \"cuParamSetv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(offset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&offset, \"cuParamSetv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ptr, \"cuParamSetv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numbytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numbytes, \"cuParamSetv\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLaunch(\n    writer: &mut (impl std::io::Write + ?Sized),\n    f: cuda_types::cuda::CUfunction,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(f), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&f, \"cuLaunch\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLaunchGrid(\n    writer: &mut (impl std::io::Write + ?Sized),\n    f: cuda_types::cuda::CUfunction,\n    grid_width: ::core::ffi::c_int,\n    grid_height: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(f), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&f, \"cuLaunchGrid\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(grid_width), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&grid_width, \"cuLaunchGrid\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(grid_height), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&grid_height, \"cuLaunchGrid\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLaunchGridAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    f: cuda_types::cuda::CUfunction,\n    grid_width: ::core::ffi::c_int,\n    grid_height: ::core::ffi::c_int,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(f), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&f, \"cuLaunchGridAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(grid_width), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&grid_width, \"cuLaunchGridAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(grid_height), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&grid_height, \"cuLaunchGridAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuLaunchGridAsync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuParamSetTexRef(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hfunc: cuda_types::cuda::CUfunction,\n    texunit: ::core::ffi::c_int,\n    hTexRef: cuda_types::cuda::CUtexref,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hfunc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hfunc, \"cuParamSetTexRef\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(texunit), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&texunit, \"cuParamSetTexRef\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuParamSetTexRef\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuFuncSetSharedMemConfig(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hfunc: cuda_types::cuda::CUfunction,\n    config: cuda_types::cuda::CUsharedconfig,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hfunc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hfunc, \"cuFuncSetSharedMemConfig\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(config), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&config, \"cuFuncSetSharedMemConfig\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phGraph: *mut cuda_types::cuda::CUgraph,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phGraph, \"cuGraphCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuGraphCreate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphAddKernelNode_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n    hGraph: cuda_types::cuda::CUgraph,\n    dependencies: *const cuda_types::cuda::CUgraphNode,\n    numDependencies: usize,\n    nodeParams: *const cuda_types::cuda::CUDA_KERNEL_NODE_PARAMS,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phGraphNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phGraphNode, \"cuGraphAddKernelNode_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphAddKernelNode_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dependencies,\n        \"cuGraphAddKernelNode_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependencies,\n        \"cuGraphAddKernelNode_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nodeParams, \"cuGraphAddKernelNode_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphKernelNodeGetParams_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    nodeParams: *mut cuda_types::cuda::CUDA_KERNEL_NODE_PARAMS,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hNode, \"cuGraphKernelNodeGetParams_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nodeParams,\n        \"cuGraphKernelNodeGetParams_v2\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphKernelNodeSetParams_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    nodeParams: *const cuda_types::cuda::CUDA_KERNEL_NODE_PARAMS,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hNode, \"cuGraphKernelNodeSetParams_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nodeParams,\n        \"cuGraphKernelNodeSetParams_v2\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphAddMemcpyNode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n    hGraph: cuda_types::cuda::CUgraph,\n    dependencies: *const cuda_types::cuda::CUgraphNode,\n    numDependencies: usize,\n    copyParams: *const cuda_types::cuda::CUDA_MEMCPY3D,\n    ctx: cuda_types::cuda::CUcontext,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phGraphNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phGraphNode, \"cuGraphAddMemcpyNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphAddMemcpyNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dependencies, \"cuGraphAddMemcpyNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependencies,\n        \"cuGraphAddMemcpyNode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(copyParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&copyParams, \"cuGraphAddMemcpyNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ctx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ctx, \"cuGraphAddMemcpyNode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphMemcpyNodeGetParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    nodeParams: *mut cuda_types::cuda::CUDA_MEMCPY3D,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hNode, \"cuGraphMemcpyNodeGetParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nodeParams,\n        \"cuGraphMemcpyNodeGetParams\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphMemcpyNodeSetParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    nodeParams: *const cuda_types::cuda::CUDA_MEMCPY3D,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hNode, \"cuGraphMemcpyNodeSetParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nodeParams,\n        \"cuGraphMemcpyNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphAddMemsetNode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n    hGraph: cuda_types::cuda::CUgraph,\n    dependencies: *const cuda_types::cuda::CUgraphNode,\n    numDependencies: usize,\n    memsetParams: *const cuda_types::cuda::CUDA_MEMSET_NODE_PARAMS,\n    ctx: cuda_types::cuda::CUcontext,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phGraphNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phGraphNode, \"cuGraphAddMemsetNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphAddMemsetNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dependencies, \"cuGraphAddMemsetNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependencies,\n        \"cuGraphAddMemsetNode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(memsetParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&memsetParams, \"cuGraphAddMemsetNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ctx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ctx, \"cuGraphAddMemsetNode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphMemsetNodeGetParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    nodeParams: *mut cuda_types::cuda::CUDA_MEMSET_NODE_PARAMS,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hNode, \"cuGraphMemsetNodeGetParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nodeParams,\n        \"cuGraphMemsetNodeGetParams\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphMemsetNodeSetParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    nodeParams: *const cuda_types::cuda::CUDA_MEMSET_NODE_PARAMS,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hNode, \"cuGraphMemsetNodeSetParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nodeParams,\n        \"cuGraphMemsetNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphAddHostNode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n    hGraph: cuda_types::cuda::CUgraph,\n    dependencies: *const cuda_types::cuda::CUgraphNode,\n    numDependencies: usize,\n    nodeParams: *const cuda_types::cuda::CUDA_HOST_NODE_PARAMS,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phGraphNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phGraphNode, \"cuGraphAddHostNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphAddHostNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dependencies, \"cuGraphAddHostNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numDependencies, \"cuGraphAddHostNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nodeParams, \"cuGraphAddHostNode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphHostNodeGetParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    nodeParams: *mut cuda_types::cuda::CUDA_HOST_NODE_PARAMS,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hNode, \"cuGraphHostNodeGetParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nodeParams, \"cuGraphHostNodeGetParams\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphHostNodeSetParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    nodeParams: *const cuda_types::cuda::CUDA_HOST_NODE_PARAMS,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hNode, \"cuGraphHostNodeSetParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nodeParams, \"cuGraphHostNodeSetParams\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphAddChildGraphNode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n    hGraph: cuda_types::cuda::CUgraph,\n    dependencies: *const cuda_types::cuda::CUgraphNode,\n    numDependencies: usize,\n    childGraph: cuda_types::cuda::CUgraph,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phGraphNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &phGraphNode,\n        \"cuGraphAddChildGraphNode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphAddChildGraphNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dependencies,\n        \"cuGraphAddChildGraphNode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependencies,\n        \"cuGraphAddChildGraphNode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(childGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&childGraph, \"cuGraphAddChildGraphNode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphChildGraphNodeGetGraph(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    phGraph: *mut cuda_types::cuda::CUgraph,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hNode, \"cuGraphChildGraphNodeGetGraph\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(phGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &phGraph,\n        \"cuGraphChildGraphNodeGetGraph\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphAddEmptyNode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n    hGraph: cuda_types::cuda::CUgraph,\n    dependencies: *const cuda_types::cuda::CUgraphNode,\n    numDependencies: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phGraphNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phGraphNode, \"cuGraphAddEmptyNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphAddEmptyNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dependencies, \"cuGraphAddEmptyNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numDependencies, \"cuGraphAddEmptyNode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphAddEventRecordNode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n    hGraph: cuda_types::cuda::CUgraph,\n    dependencies: *const cuda_types::cuda::CUgraphNode,\n    numDependencies: usize,\n    event: cuda_types::cuda::CUevent,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phGraphNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &phGraphNode,\n        \"cuGraphAddEventRecordNode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphAddEventRecordNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dependencies,\n        \"cuGraphAddEventRecordNode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependencies,\n        \"cuGraphAddEventRecordNode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(event), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&event, \"cuGraphAddEventRecordNode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphEventRecordNodeGetEvent(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    event_out: *mut cuda_types::cuda::CUevent,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hNode,\n        \"cuGraphEventRecordNodeGetEvent\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(event_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &event_out,\n        \"cuGraphEventRecordNodeGetEvent\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphEventRecordNodeSetEvent(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    event: cuda_types::cuda::CUevent,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hNode,\n        \"cuGraphEventRecordNodeSetEvent\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(event), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &event,\n        \"cuGraphEventRecordNodeSetEvent\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphAddEventWaitNode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n    hGraph: cuda_types::cuda::CUgraph,\n    dependencies: *const cuda_types::cuda::CUgraphNode,\n    numDependencies: usize,\n    event: cuda_types::cuda::CUevent,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phGraphNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phGraphNode, \"cuGraphAddEventWaitNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphAddEventWaitNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dependencies,\n        \"cuGraphAddEventWaitNode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependencies,\n        \"cuGraphAddEventWaitNode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(event), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&event, \"cuGraphAddEventWaitNode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphEventWaitNodeGetEvent(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    event_out: *mut cuda_types::cuda::CUevent,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hNode, \"cuGraphEventWaitNodeGetEvent\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(event_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &event_out,\n        \"cuGraphEventWaitNodeGetEvent\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphEventWaitNodeSetEvent(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    event: cuda_types::cuda::CUevent,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hNode, \"cuGraphEventWaitNodeSetEvent\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(event), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&event, \"cuGraphEventWaitNodeSetEvent\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphAddExternalSemaphoresSignalNode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n    hGraph: cuda_types::cuda::CUgraph,\n    dependencies: *const cuda_types::cuda::CUgraphNode,\n    numDependencies: usize,\n    nodeParams: *const cuda_types::cuda::CUDA_EXT_SEM_SIGNAL_NODE_PARAMS,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phGraphNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &phGraphNode,\n        \"cuGraphAddExternalSemaphoresSignalNode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hGraph,\n        \"cuGraphAddExternalSemaphoresSignalNode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dependencies,\n        \"cuGraphAddExternalSemaphoresSignalNode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependencies,\n        \"cuGraphAddExternalSemaphoresSignalNode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nodeParams,\n        \"cuGraphAddExternalSemaphoresSignalNode\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphExternalSemaphoresSignalNodeGetParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    params_out: *mut cuda_types::cuda::CUDA_EXT_SEM_SIGNAL_NODE_PARAMS,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hNode,\n        \"cuGraphExternalSemaphoresSignalNodeGetParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(params_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &params_out,\n        \"cuGraphExternalSemaphoresSignalNodeGetParams\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphExternalSemaphoresSignalNodeSetParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    nodeParams: *const cuda_types::cuda::CUDA_EXT_SEM_SIGNAL_NODE_PARAMS,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hNode,\n        \"cuGraphExternalSemaphoresSignalNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nodeParams,\n        \"cuGraphExternalSemaphoresSignalNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphAddExternalSemaphoresWaitNode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n    hGraph: cuda_types::cuda::CUgraph,\n    dependencies: *const cuda_types::cuda::CUgraphNode,\n    numDependencies: usize,\n    nodeParams: *const cuda_types::cuda::CUDA_EXT_SEM_WAIT_NODE_PARAMS,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phGraphNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &phGraphNode,\n        \"cuGraphAddExternalSemaphoresWaitNode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hGraph,\n        \"cuGraphAddExternalSemaphoresWaitNode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dependencies,\n        \"cuGraphAddExternalSemaphoresWaitNode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependencies,\n        \"cuGraphAddExternalSemaphoresWaitNode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nodeParams,\n        \"cuGraphAddExternalSemaphoresWaitNode\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphExternalSemaphoresWaitNodeGetParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    params_out: *mut cuda_types::cuda::CUDA_EXT_SEM_WAIT_NODE_PARAMS,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hNode,\n        \"cuGraphExternalSemaphoresWaitNodeGetParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(params_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &params_out,\n        \"cuGraphExternalSemaphoresWaitNodeGetParams\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphExternalSemaphoresWaitNodeSetParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    nodeParams: *const cuda_types::cuda::CUDA_EXT_SEM_WAIT_NODE_PARAMS,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hNode,\n        \"cuGraphExternalSemaphoresWaitNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nodeParams,\n        \"cuGraphExternalSemaphoresWaitNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphAddBatchMemOpNode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n    hGraph: cuda_types::cuda::CUgraph,\n    dependencies: *const cuda_types::cuda::CUgraphNode,\n    numDependencies: usize,\n    nodeParams: *const cuda_types::cuda::CUDA_BATCH_MEM_OP_NODE_PARAMS,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phGraphNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &phGraphNode,\n        \"cuGraphAddBatchMemOpNode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphAddBatchMemOpNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dependencies,\n        \"cuGraphAddBatchMemOpNode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependencies,\n        \"cuGraphAddBatchMemOpNode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nodeParams, \"cuGraphAddBatchMemOpNode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphBatchMemOpNodeGetParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    nodeParams_out: *mut cuda_types::cuda::CUDA_BATCH_MEM_OP_NODE_PARAMS,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hNode,\n        \"cuGraphBatchMemOpNodeGetParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nodeParams_out,\n        \"cuGraphBatchMemOpNodeGetParams\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphBatchMemOpNodeSetParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    nodeParams: *const cuda_types::cuda::CUDA_BATCH_MEM_OP_NODE_PARAMS,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hNode,\n        \"cuGraphBatchMemOpNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nodeParams,\n        \"cuGraphBatchMemOpNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphExecBatchMemOpNodeSetParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraphExec: cuda_types::cuda::CUgraphExec,\n    hNode: cuda_types::cuda::CUgraphNode,\n    nodeParams: *const cuda_types::cuda::CUDA_BATCH_MEM_OP_NODE_PARAMS,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraphExec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hGraphExec,\n        \"cuGraphExecBatchMemOpNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hNode,\n        \"cuGraphExecBatchMemOpNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nodeParams,\n        \"cuGraphExecBatchMemOpNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphAddMemAllocNode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n    hGraph: cuda_types::cuda::CUgraph,\n    dependencies: *const cuda_types::cuda::CUgraphNode,\n    numDependencies: usize,\n    nodeParams: *mut cuda_types::cuda::CUDA_MEM_ALLOC_NODE_PARAMS,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phGraphNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phGraphNode, \"cuGraphAddMemAllocNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphAddMemAllocNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dependencies, \"cuGraphAddMemAllocNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependencies,\n        \"cuGraphAddMemAllocNode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nodeParams, \"cuGraphAddMemAllocNode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphMemAllocNodeGetParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    params_out: *mut cuda_types::cuda::CUDA_MEM_ALLOC_NODE_PARAMS,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hNode, \"cuGraphMemAllocNodeGetParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(params_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &params_out,\n        \"cuGraphMemAllocNodeGetParams\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphAddMemFreeNode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n    hGraph: cuda_types::cuda::CUgraph,\n    dependencies: *const cuda_types::cuda::CUgraphNode,\n    numDependencies: usize,\n    dptr: cuda_types::cuda::CUdeviceptr,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phGraphNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phGraphNode, \"cuGraphAddMemFreeNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphAddMemFreeNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dependencies, \"cuGraphAddMemFreeNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependencies,\n        \"cuGraphAddMemFreeNode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuGraphAddMemFreeNode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphMemFreeNodeGetParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    dptr_out: *mut cuda_types::cuda::CUdeviceptr,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hNode, \"cuGraphMemFreeNodeGetParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dptr_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dptr_out,\n        \"cuGraphMemFreeNodeGetParams\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDeviceGraphMemTrim(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"cuDeviceGraphMemTrim\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDeviceGetGraphMemAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::cuda::CUdevice,\n    attr: cuda_types::cuda::CUgraphMem_attribute,\n    value: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"cuDeviceGetGraphMemAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attr, \"cuDeviceGetGraphMemAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuDeviceGetGraphMemAttribute\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDeviceSetGraphMemAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::cuda::CUdevice,\n    attr: cuda_types::cuda::CUgraphMem_attribute,\n    value: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"cuDeviceSetGraphMemAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attr, \"cuDeviceSetGraphMemAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuDeviceSetGraphMemAttribute\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphClone(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phGraphClone: *mut cuda_types::cuda::CUgraph,\n    originalGraph: cuda_types::cuda::CUgraph,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phGraphClone), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phGraphClone, \"cuGraphClone\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(originalGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&originalGraph, \"cuGraphClone\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphNodeFindInClone(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phNode: *mut cuda_types::cuda::CUgraphNode,\n    hOriginalNode: cuda_types::cuda::CUgraphNode,\n    hClonedGraph: cuda_types::cuda::CUgraph,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phNode, \"cuGraphNodeFindInClone\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hOriginalNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hOriginalNode,\n        \"cuGraphNodeFindInClone\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hClonedGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hClonedGraph, \"cuGraphNodeFindInClone\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphNodeGetType(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    type_: *mut cuda_types::cuda::CUgraphNodeType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hNode, \"cuGraphNodeGetType\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cuGraphNodeGetType\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphGetNodes(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraph: cuda_types::cuda::CUgraph,\n    nodes: *mut cuda_types::cuda::CUgraphNode,\n    numNodes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphGetNodes\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nodes, \"cuGraphGetNodes\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numNodes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numNodes, \"cuGraphGetNodes\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphGetRootNodes(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraph: cuda_types::cuda::CUgraph,\n    rootNodes: *mut cuda_types::cuda::CUgraphNode,\n    numRootNodes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphGetRootNodes\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rootNodes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rootNodes, \"cuGraphGetRootNodes\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numRootNodes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numRootNodes, \"cuGraphGetRootNodes\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphGetEdges_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraph: cuda_types::cuda::CUgraph,\n    from: *mut cuda_types::cuda::CUgraphNode,\n    to: *mut cuda_types::cuda::CUgraphNode,\n    edgeData: *mut cuda_types::cuda::CUgraphEdgeData,\n    numEdges: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphGetEdges_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(from), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&from, \"cuGraphGetEdges_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(to), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&to, \"cuGraphGetEdges_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(edgeData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&edgeData, \"cuGraphGetEdges_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numEdges), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numEdges, \"cuGraphGetEdges_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphNodeGetDependencies_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    dependencies: *mut cuda_types::cuda::CUgraphNode,\n    edgeData: *mut cuda_types::cuda::CUgraphEdgeData,\n    numDependencies: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hNode, \"cuGraphNodeGetDependencies_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dependencies,\n        \"cuGraphNodeGetDependencies_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(edgeData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &edgeData,\n        \"cuGraphNodeGetDependencies_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependencies,\n        \"cuGraphNodeGetDependencies_v2\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphNodeGetDependentNodes_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    dependentNodes: *mut cuda_types::cuda::CUgraphNode,\n    edgeData: *mut cuda_types::cuda::CUgraphEdgeData,\n    numDependentNodes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hNode,\n        \"cuGraphNodeGetDependentNodes_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependentNodes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dependentNodes,\n        \"cuGraphNodeGetDependentNodes_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(edgeData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &edgeData,\n        \"cuGraphNodeGetDependentNodes_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependentNodes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependentNodes,\n        \"cuGraphNodeGetDependentNodes_v2\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphAddDependencies_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraph: cuda_types::cuda::CUgraph,\n    from: *const cuda_types::cuda::CUgraphNode,\n    to: *const cuda_types::cuda::CUgraphNode,\n    edgeData: *const cuda_types::cuda::CUgraphEdgeData,\n    numDependencies: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphAddDependencies_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(from), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&from, \"cuGraphAddDependencies_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(to), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&to, \"cuGraphAddDependencies_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(edgeData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&edgeData, \"cuGraphAddDependencies_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependencies,\n        \"cuGraphAddDependencies_v2\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphRemoveDependencies_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraph: cuda_types::cuda::CUgraph,\n    from: *const cuda_types::cuda::CUgraphNode,\n    to: *const cuda_types::cuda::CUgraphNode,\n    edgeData: *const cuda_types::cuda::CUgraphEdgeData,\n    numDependencies: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphRemoveDependencies_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(from), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&from, \"cuGraphRemoveDependencies_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(to), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&to, \"cuGraphRemoveDependencies_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(edgeData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &edgeData,\n        \"cuGraphRemoveDependencies_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependencies,\n        \"cuGraphRemoveDependencies_v2\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphDestroyNode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hNode, \"cuGraphDestroyNode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphInstantiateWithFlags(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phGraphExec: *mut cuda_types::cuda::CUgraphExec,\n    hGraph: cuda_types::cuda::CUgraph,\n    flags: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phGraphExec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &phGraphExec,\n        \"cuGraphInstantiateWithFlags\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphInstantiateWithFlags\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuGraphInstantiateWithFlags\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphInstantiateWithParams_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phGraphExec: *mut cuda_types::cuda::CUgraphExec,\n    hGraph: cuda_types::cuda::CUgraph,\n    instantiateParams: *mut cuda_types::cuda::CUDA_GRAPH_INSTANTIATE_PARAMS,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phGraphExec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &phGraphExec,\n        \"cuGraphInstantiateWithParams_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hGraph,\n        \"cuGraphInstantiateWithParams_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(instantiateParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &instantiateParams,\n        \"cuGraphInstantiateWithParams_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphExecGetFlags(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraphExec: cuda_types::cuda::CUgraphExec,\n    flags: *mut cuda_types::cuda::cuuint64_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraphExec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraphExec, \"cuGraphExecGetFlags\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuGraphExecGetFlags\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphExecKernelNodeSetParams_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraphExec: cuda_types::cuda::CUgraphExec,\n    hNode: cuda_types::cuda::CUgraphNode,\n    nodeParams: *const cuda_types::cuda::CUDA_KERNEL_NODE_PARAMS,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraphExec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hGraphExec,\n        \"cuGraphExecKernelNodeSetParams_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hNode,\n        \"cuGraphExecKernelNodeSetParams_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nodeParams,\n        \"cuGraphExecKernelNodeSetParams_v2\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphExecMemcpyNodeSetParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraphExec: cuda_types::cuda::CUgraphExec,\n    hNode: cuda_types::cuda::CUgraphNode,\n    copyParams: *const cuda_types::cuda::CUDA_MEMCPY3D,\n    ctx: cuda_types::cuda::CUcontext,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraphExec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hGraphExec,\n        \"cuGraphExecMemcpyNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hNode,\n        \"cuGraphExecMemcpyNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(copyParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &copyParams,\n        \"cuGraphExecMemcpyNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ctx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ctx, \"cuGraphExecMemcpyNodeSetParams\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphExecMemsetNodeSetParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraphExec: cuda_types::cuda::CUgraphExec,\n    hNode: cuda_types::cuda::CUgraphNode,\n    memsetParams: *const cuda_types::cuda::CUDA_MEMSET_NODE_PARAMS,\n    ctx: cuda_types::cuda::CUcontext,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraphExec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hGraphExec,\n        \"cuGraphExecMemsetNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hNode,\n        \"cuGraphExecMemsetNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(memsetParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &memsetParams,\n        \"cuGraphExecMemsetNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ctx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ctx, \"cuGraphExecMemsetNodeSetParams\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphExecHostNodeSetParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraphExec: cuda_types::cuda::CUgraphExec,\n    hNode: cuda_types::cuda::CUgraphNode,\n    nodeParams: *const cuda_types::cuda::CUDA_HOST_NODE_PARAMS,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraphExec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hGraphExec,\n        \"cuGraphExecHostNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hNode, \"cuGraphExecHostNodeSetParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nodeParams,\n        \"cuGraphExecHostNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphExecChildGraphNodeSetParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraphExec: cuda_types::cuda::CUgraphExec,\n    hNode: cuda_types::cuda::CUgraphNode,\n    childGraph: cuda_types::cuda::CUgraph,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraphExec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hGraphExec,\n        \"cuGraphExecChildGraphNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hNode,\n        \"cuGraphExecChildGraphNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(childGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &childGraph,\n        \"cuGraphExecChildGraphNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphExecEventRecordNodeSetEvent(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraphExec: cuda_types::cuda::CUgraphExec,\n    hNode: cuda_types::cuda::CUgraphNode,\n    event: cuda_types::cuda::CUevent,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraphExec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hGraphExec,\n        \"cuGraphExecEventRecordNodeSetEvent\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hNode,\n        \"cuGraphExecEventRecordNodeSetEvent\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(event), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &event,\n        \"cuGraphExecEventRecordNodeSetEvent\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphExecEventWaitNodeSetEvent(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraphExec: cuda_types::cuda::CUgraphExec,\n    hNode: cuda_types::cuda::CUgraphNode,\n    event: cuda_types::cuda::CUevent,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraphExec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hGraphExec,\n        \"cuGraphExecEventWaitNodeSetEvent\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hNode,\n        \"cuGraphExecEventWaitNodeSetEvent\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(event), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &event,\n        \"cuGraphExecEventWaitNodeSetEvent\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphExecExternalSemaphoresSignalNodeSetParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraphExec: cuda_types::cuda::CUgraphExec,\n    hNode: cuda_types::cuda::CUgraphNode,\n    nodeParams: *const cuda_types::cuda::CUDA_EXT_SEM_SIGNAL_NODE_PARAMS,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraphExec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hGraphExec,\n        \"cuGraphExecExternalSemaphoresSignalNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hNode,\n        \"cuGraphExecExternalSemaphoresSignalNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nodeParams,\n        \"cuGraphExecExternalSemaphoresSignalNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphExecExternalSemaphoresWaitNodeSetParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraphExec: cuda_types::cuda::CUgraphExec,\n    hNode: cuda_types::cuda::CUgraphNode,\n    nodeParams: *const cuda_types::cuda::CUDA_EXT_SEM_WAIT_NODE_PARAMS,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraphExec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hGraphExec,\n        \"cuGraphExecExternalSemaphoresWaitNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hNode,\n        \"cuGraphExecExternalSemaphoresWaitNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nodeParams,\n        \"cuGraphExecExternalSemaphoresWaitNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphNodeSetEnabled(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraphExec: cuda_types::cuda::CUgraphExec,\n    hNode: cuda_types::cuda::CUgraphNode,\n    isEnabled: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraphExec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraphExec, \"cuGraphNodeSetEnabled\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hNode, \"cuGraphNodeSetEnabled\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(isEnabled), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&isEnabled, \"cuGraphNodeSetEnabled\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphNodeGetEnabled(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraphExec: cuda_types::cuda::CUgraphExec,\n    hNode: cuda_types::cuda::CUgraphNode,\n    isEnabled: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraphExec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraphExec, \"cuGraphNodeGetEnabled\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hNode, \"cuGraphNodeGetEnabled\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(isEnabled), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&isEnabled, \"cuGraphNodeGetEnabled\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphUpload_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraphExec: cuda_types::cuda::CUgraphExec,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraphExec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraphExec, \"cuGraphUpload_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuGraphUpload_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphLaunch_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraphExec: cuda_types::cuda::CUgraphExec,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraphExec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraphExec, \"cuGraphLaunch_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuGraphLaunch_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphExecDestroy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraphExec: cuda_types::cuda::CUgraphExec,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraphExec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraphExec, \"cuGraphExecDestroy\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphDestroy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraph: cuda_types::cuda::CUgraph,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphDestroy\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphExecUpdate_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraphExec: cuda_types::cuda::CUgraphExec,\n    hGraph: cuda_types::cuda::CUgraph,\n    resultInfo: *mut cuda_types::cuda::CUgraphExecUpdateResultInfo,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraphExec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraphExec, \"cuGraphExecUpdate_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphExecUpdate_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&resultInfo, \"cuGraphExecUpdate_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphKernelNodeCopyAttributes(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dst: cuda_types::cuda::CUgraphNode,\n    src: cuda_types::cuda::CUgraphNode,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dst), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dst, \"cuGraphKernelNodeCopyAttributes\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(src), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&src, \"cuGraphKernelNodeCopyAttributes\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphDebugDotPrint(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraph: cuda_types::cuda::CUgraph,\n    path: *const ::core::ffi::c_char,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphDebugDotPrint\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(path), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&path, \"cuGraphDebugDotPrint\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuGraphDebugDotPrint\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuUserObjectCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    object_out: *mut cuda_types::cuda::CUuserObject,\n    ptr: *mut ::core::ffi::c_void,\n    destroy: cuda_types::cuda::CUhostFn,\n    initialRefcount: ::core::ffi::c_uint,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(object_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&object_out, \"cuUserObjectCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ptr, \"cuUserObjectCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(destroy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&destroy, \"cuUserObjectCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(initialRefcount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&initialRefcount, \"cuUserObjectCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuUserObjectCreate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuUserObjectRetain(\n    writer: &mut (impl std::io::Write + ?Sized),\n    object: cuda_types::cuda::CUuserObject,\n    count: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(object), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&object, \"cuUserObjectRetain\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuUserObjectRetain\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuUserObjectRelease(\n    writer: &mut (impl std::io::Write + ?Sized),\n    object: cuda_types::cuda::CUuserObject,\n    count: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(object), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&object, \"cuUserObjectRelease\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuUserObjectRelease\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphRetainUserObject(\n    writer: &mut (impl std::io::Write + ?Sized),\n    graph: cuda_types::cuda::CUgraph,\n    object: cuda_types::cuda::CUuserObject,\n    count: ::core::ffi::c_uint,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(graph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&graph, \"cuGraphRetainUserObject\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(object), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&object, \"cuGraphRetainUserObject\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuGraphRetainUserObject\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuGraphRetainUserObject\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphReleaseUserObject(\n    writer: &mut (impl std::io::Write + ?Sized),\n    graph: cuda_types::cuda::CUgraph,\n    object: cuda_types::cuda::CUuserObject,\n    count: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(graph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&graph, \"cuGraphReleaseUserObject\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(object), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&object, \"cuGraphReleaseUserObject\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuGraphReleaseUserObject\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphAddNode_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n    hGraph: cuda_types::cuda::CUgraph,\n    dependencies: *const cuda_types::cuda::CUgraphNode,\n    dependencyData: *const cuda_types::cuda::CUgraphEdgeData,\n    numDependencies: usize,\n    nodeParams: *mut cuda_types::cuda::CUgraphNodeParams,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phGraphNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phGraphNode, \"cuGraphAddNode_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphAddNode_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dependencies, \"cuGraphAddNode_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencyData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dependencyData, \"cuGraphAddNode_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numDependencies, \"cuGraphAddNode_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nodeParams, \"cuGraphAddNode_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphNodeSetParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    nodeParams: *mut cuda_types::cuda::CUgraphNodeParams,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hNode, \"cuGraphNodeSetParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nodeParams, \"cuGraphNodeSetParams\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphExecNodeSetParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraphExec: cuda_types::cuda::CUgraphExec,\n    hNode: cuda_types::cuda::CUgraphNode,\n    nodeParams: *mut cuda_types::cuda::CUgraphNodeParams,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraphExec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraphExec, \"cuGraphExecNodeSetParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hNode, \"cuGraphExecNodeSetParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nodeParams, \"cuGraphExecNodeSetParams\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphConditionalHandleCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pHandle_out: *mut cuda_types::cuda::CUgraphConditionalHandle,\n    hGraph: cuda_types::cuda::CUgraph,\n    ctx: cuda_types::cuda::CUcontext,\n    defaultLaunchValue: ::core::ffi::c_uint,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pHandle_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pHandle_out,\n        \"cuGraphConditionalHandleCreate\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hGraph,\n        \"cuGraphConditionalHandleCreate\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ctx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ctx, \"cuGraphConditionalHandleCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(defaultLaunchValue), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &defaultLaunchValue,\n        \"cuGraphConditionalHandleCreate\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &flags,\n        \"cuGraphConditionalHandleCreate\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuOccupancyMaxActiveBlocksPerMultiprocessor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    numBlocks: *mut ::core::ffi::c_int,\n    func: cuda_types::cuda::CUfunction,\n    blockSize: ::core::ffi::c_int,\n    dynamicSMemSize: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(numBlocks), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numBlocks,\n        \"cuOccupancyMaxActiveBlocksPerMultiprocessor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(func), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &func,\n        \"cuOccupancyMaxActiveBlocksPerMultiprocessor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSize,\n        \"cuOccupancyMaxActiveBlocksPerMultiprocessor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dynamicSMemSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dynamicSMemSize,\n        \"cuOccupancyMaxActiveBlocksPerMultiprocessor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuOccupancyMaxActiveBlocksPerMultiprocessorWithFlags(\n    writer: &mut (impl std::io::Write + ?Sized),\n    numBlocks: *mut ::core::ffi::c_int,\n    func: cuda_types::cuda::CUfunction,\n    blockSize: ::core::ffi::c_int,\n    dynamicSMemSize: usize,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(numBlocks), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numBlocks,\n        \"cuOccupancyMaxActiveBlocksPerMultiprocessorWithFlags\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(func), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &func,\n        \"cuOccupancyMaxActiveBlocksPerMultiprocessorWithFlags\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSize,\n        \"cuOccupancyMaxActiveBlocksPerMultiprocessorWithFlags\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dynamicSMemSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dynamicSMemSize,\n        \"cuOccupancyMaxActiveBlocksPerMultiprocessorWithFlags\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &flags,\n        \"cuOccupancyMaxActiveBlocksPerMultiprocessorWithFlags\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuOccupancyMaxPotentialBlockSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    minGridSize: *mut ::core::ffi::c_int,\n    blockSize: *mut ::core::ffi::c_int,\n    func: cuda_types::cuda::CUfunction,\n    blockSizeToDynamicSMemSize: cuda_types::cuda::CUoccupancyB2DSize,\n    dynamicSMemSize: usize,\n    blockSizeLimit: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(minGridSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &minGridSize,\n        \"cuOccupancyMaxPotentialBlockSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSize,\n        \"cuOccupancyMaxPotentialBlockSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(func), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &func,\n        \"cuOccupancyMaxPotentialBlockSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSizeToDynamicSMemSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSizeToDynamicSMemSize,\n        \"cuOccupancyMaxPotentialBlockSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dynamicSMemSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dynamicSMemSize,\n        \"cuOccupancyMaxPotentialBlockSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSizeLimit), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSizeLimit,\n        \"cuOccupancyMaxPotentialBlockSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuOccupancyMaxPotentialBlockSizeWithFlags(\n    writer: &mut (impl std::io::Write + ?Sized),\n    minGridSize: *mut ::core::ffi::c_int,\n    blockSize: *mut ::core::ffi::c_int,\n    func: cuda_types::cuda::CUfunction,\n    blockSizeToDynamicSMemSize: cuda_types::cuda::CUoccupancyB2DSize,\n    dynamicSMemSize: usize,\n    blockSizeLimit: ::core::ffi::c_int,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(minGridSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &minGridSize,\n        \"cuOccupancyMaxPotentialBlockSizeWithFlags\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSize,\n        \"cuOccupancyMaxPotentialBlockSizeWithFlags\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(func), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &func,\n        \"cuOccupancyMaxPotentialBlockSizeWithFlags\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSizeToDynamicSMemSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSizeToDynamicSMemSize,\n        \"cuOccupancyMaxPotentialBlockSizeWithFlags\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dynamicSMemSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dynamicSMemSize,\n        \"cuOccupancyMaxPotentialBlockSizeWithFlags\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSizeLimit), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSizeLimit,\n        \"cuOccupancyMaxPotentialBlockSizeWithFlags\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &flags,\n        \"cuOccupancyMaxPotentialBlockSizeWithFlags\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuOccupancyAvailableDynamicSMemPerBlock(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dynamicSmemSize: *mut usize,\n    func: cuda_types::cuda::CUfunction,\n    numBlocks: ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dynamicSmemSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dynamicSmemSize,\n        \"cuOccupancyAvailableDynamicSMemPerBlock\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(func), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &func,\n        \"cuOccupancyAvailableDynamicSMemPerBlock\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numBlocks), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numBlocks,\n        \"cuOccupancyAvailableDynamicSMemPerBlock\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSize,\n        \"cuOccupancyAvailableDynamicSMemPerBlock\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuOccupancyMaxPotentialClusterSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    clusterSize: *mut ::core::ffi::c_int,\n    func: cuda_types::cuda::CUfunction,\n    config: *const cuda_types::cuda::CUlaunchConfig,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(clusterSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &clusterSize,\n        \"cuOccupancyMaxPotentialClusterSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(func), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &func,\n        \"cuOccupancyMaxPotentialClusterSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(config), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &config,\n        \"cuOccupancyMaxPotentialClusterSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuOccupancyMaxActiveClusters(\n    writer: &mut (impl std::io::Write + ?Sized),\n    numClusters: *mut ::core::ffi::c_int,\n    func: cuda_types::cuda::CUfunction,\n    config: *const cuda_types::cuda::CUlaunchConfig,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(numClusters), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numClusters,\n        \"cuOccupancyMaxActiveClusters\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(func), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&func, \"cuOccupancyMaxActiveClusters\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(config), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&config, \"cuOccupancyMaxActiveClusters\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefSetArray(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hTexRef: cuda_types::cuda::CUtexref,\n    hArray: cuda_types::cuda::CUarray,\n    Flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefSetArray\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hArray, \"cuTexRefSetArray\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Flags, \"cuTexRefSetArray\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefSetMipmappedArray(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hTexRef: cuda_types::cuda::CUtexref,\n    hMipmappedArray: cuda_types::cuda::CUmipmappedArray,\n    Flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefSetMipmappedArray\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hMipmappedArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hMipmappedArray,\n        \"cuTexRefSetMipmappedArray\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Flags, \"cuTexRefSetMipmappedArray\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefSetAddress_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ByteOffset: *mut usize,\n    hTexRef: cuda_types::cuda::CUtexref,\n    dptr: cuda_types::cuda::CUdeviceptr,\n    bytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ByteOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteOffset, \"cuTexRefSetAddress_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefSetAddress_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuTexRefSetAddress_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bytes, \"cuTexRefSetAddress_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefSetAddress2D_v3(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hTexRef: cuda_types::cuda::CUtexref,\n    desc: *const cuda_types::cuda::CUDA_ARRAY_DESCRIPTOR,\n    dptr: cuda_types::cuda::CUdeviceptr,\n    Pitch: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefSetAddress2D_v3\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(desc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&desc, \"cuTexRefSetAddress2D_v3\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuTexRefSetAddress2D_v3\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Pitch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Pitch, \"cuTexRefSetAddress2D_v3\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefSetFormat(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hTexRef: cuda_types::cuda::CUtexref,\n    fmt: cuda_types::cuda::CUarray_format,\n    NumPackedComponents: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefSetFormat\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fmt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fmt, \"cuTexRefSetFormat\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(NumPackedComponents), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &NumPackedComponents,\n        \"cuTexRefSetFormat\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefSetAddressMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hTexRef: cuda_types::cuda::CUtexref,\n    dim: ::core::ffi::c_int,\n    am: cuda_types::cuda::CUaddress_mode,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefSetAddressMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dim, \"cuTexRefSetAddressMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(am), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&am, \"cuTexRefSetAddressMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefSetFilterMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hTexRef: cuda_types::cuda::CUtexref,\n    fm: cuda_types::cuda::CUfilter_mode,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefSetFilterMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fm), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fm, \"cuTexRefSetFilterMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefSetMipmapFilterMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hTexRef: cuda_types::cuda::CUtexref,\n    fm: cuda_types::cuda::CUfilter_mode,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefSetMipmapFilterMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fm), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fm, \"cuTexRefSetMipmapFilterMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefSetMipmapLevelBias(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hTexRef: cuda_types::cuda::CUtexref,\n    bias: f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefSetMipmapLevelBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bias), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bias, \"cuTexRefSetMipmapLevelBias\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefSetMipmapLevelClamp(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hTexRef: cuda_types::cuda::CUtexref,\n    minMipmapLevelClamp: f32,\n    maxMipmapLevelClamp: f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefSetMipmapLevelClamp\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(minMipmapLevelClamp), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &minMipmapLevelClamp,\n        \"cuTexRefSetMipmapLevelClamp\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxMipmapLevelClamp), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxMipmapLevelClamp,\n        \"cuTexRefSetMipmapLevelClamp\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefSetMaxAnisotropy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hTexRef: cuda_types::cuda::CUtexref,\n    maxAniso: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefSetMaxAnisotropy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxAniso), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&maxAniso, \"cuTexRefSetMaxAnisotropy\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefSetBorderColor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hTexRef: cuda_types::cuda::CUtexref,\n    pBorderColor: *mut f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefSetBorderColor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBorderColor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBorderColor, \"cuTexRefSetBorderColor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefSetFlags(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hTexRef: cuda_types::cuda::CUtexref,\n    Flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefSetFlags\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Flags, \"cuTexRefSetFlags\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefGetAddress_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pdptr: *mut cuda_types::cuda::CUdeviceptr,\n    hTexRef: cuda_types::cuda::CUtexref,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pdptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pdptr, \"cuTexRefGetAddress_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefGetAddress_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefGetArray(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phArray: *mut cuda_types::cuda::CUarray,\n    hTexRef: cuda_types::cuda::CUtexref,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phArray, \"cuTexRefGetArray\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefGetArray\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefGetMipmappedArray(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phMipmappedArray: *mut cuda_types::cuda::CUmipmappedArray,\n    hTexRef: cuda_types::cuda::CUtexref,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phMipmappedArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &phMipmappedArray,\n        \"cuTexRefGetMipmappedArray\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefGetMipmappedArray\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefGetAddressMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pam: *mut cuda_types::cuda::CUaddress_mode,\n    hTexRef: cuda_types::cuda::CUtexref,\n    dim: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pam), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pam, \"cuTexRefGetAddressMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefGetAddressMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dim, \"cuTexRefGetAddressMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefGetFilterMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pfm: *mut cuda_types::cuda::CUfilter_mode,\n    hTexRef: cuda_types::cuda::CUtexref,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pfm), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pfm, \"cuTexRefGetFilterMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefGetFilterMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefGetFormat(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pFormat: *mut cuda_types::cuda::CUarray_format,\n    pNumChannels: *mut ::core::ffi::c_int,\n    hTexRef: cuda_types::cuda::CUtexref,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pFormat), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pFormat, \"cuTexRefGetFormat\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pNumChannels), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pNumChannels, \"cuTexRefGetFormat\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefGetFormat\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefGetMipmapFilterMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pfm: *mut cuda_types::cuda::CUfilter_mode,\n    hTexRef: cuda_types::cuda::CUtexref,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pfm), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pfm, \"cuTexRefGetMipmapFilterMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefGetMipmapFilterMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefGetMipmapLevelBias(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pbias: *mut f32,\n    hTexRef: cuda_types::cuda::CUtexref,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pbias), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pbias, \"cuTexRefGetMipmapLevelBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefGetMipmapLevelBias\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefGetMipmapLevelClamp(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pminMipmapLevelClamp: *mut f32,\n    pmaxMipmapLevelClamp: *mut f32,\n    hTexRef: cuda_types::cuda::CUtexref,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pminMipmapLevelClamp), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pminMipmapLevelClamp,\n        \"cuTexRefGetMipmapLevelClamp\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pmaxMipmapLevelClamp), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pmaxMipmapLevelClamp,\n        \"cuTexRefGetMipmapLevelClamp\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefGetMipmapLevelClamp\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefGetMaxAnisotropy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pmaxAniso: *mut ::core::ffi::c_int,\n    hTexRef: cuda_types::cuda::CUtexref,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pmaxAniso), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pmaxAniso, \"cuTexRefGetMaxAnisotropy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefGetMaxAnisotropy\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefGetBorderColor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pBorderColor: *mut f32,\n    hTexRef: cuda_types::cuda::CUtexref,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pBorderColor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBorderColor, \"cuTexRefGetBorderColor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefGetBorderColor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefGetFlags(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pFlags: *mut ::core::ffi::c_uint,\n    hTexRef: cuda_types::cuda::CUtexref,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pFlags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pFlags, \"cuTexRefGetFlags\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefGetFlags\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pTexRef: *mut cuda_types::cuda::CUtexref,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pTexRef, \"cuTexRefCreate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefDestroy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hTexRef: cuda_types::cuda::CUtexref,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefDestroy\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuSurfRefSetArray(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hSurfRef: cuda_types::cuda::CUsurfref,\n    hArray: cuda_types::cuda::CUarray,\n    Flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hSurfRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hSurfRef, \"cuSurfRefSetArray\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hArray, \"cuSurfRefSetArray\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Flags, \"cuSurfRefSetArray\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuSurfRefGetArray(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phArray: *mut cuda_types::cuda::CUarray,\n    hSurfRef: cuda_types::cuda::CUsurfref,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phArray, \"cuSurfRefGetArray\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hSurfRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hSurfRef, \"cuSurfRefGetArray\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexObjectCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pTexObject: *mut cuda_types::cuda::CUtexObject,\n    pResDesc: *const cuda_types::cuda::CUDA_RESOURCE_DESC,\n    pTexDesc: *const cuda_types::cuda::CUDA_TEXTURE_DESC,\n    pResViewDesc: *const cuda_types::cuda::CUDA_RESOURCE_VIEW_DESC,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pTexObject), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pTexObject, \"cuTexObjectCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pResDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pResDesc, \"cuTexObjectCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pTexDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pTexDesc, \"cuTexObjectCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pResViewDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pResViewDesc, \"cuTexObjectCreate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexObjectDestroy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    texObject: cuda_types::cuda::CUtexObject,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(texObject), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&texObject, \"cuTexObjectDestroy\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexObjectGetResourceDesc(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pResDesc: *mut cuda_types::cuda::CUDA_RESOURCE_DESC,\n    texObject: cuda_types::cuda::CUtexObject,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pResDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pResDesc, \"cuTexObjectGetResourceDesc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(texObject), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &texObject,\n        \"cuTexObjectGetResourceDesc\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexObjectGetTextureDesc(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pTexDesc: *mut cuda_types::cuda::CUDA_TEXTURE_DESC,\n    texObject: cuda_types::cuda::CUtexObject,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pTexDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pTexDesc, \"cuTexObjectGetTextureDesc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(texObject), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&texObject, \"cuTexObjectGetTextureDesc\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexObjectGetResourceViewDesc(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pResViewDesc: *mut cuda_types::cuda::CUDA_RESOURCE_VIEW_DESC,\n    texObject: cuda_types::cuda::CUtexObject,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pResViewDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pResViewDesc,\n        \"cuTexObjectGetResourceViewDesc\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(texObject), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &texObject,\n        \"cuTexObjectGetResourceViewDesc\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuSurfObjectCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pSurfObject: *mut cuda_types::cuda::CUsurfObject,\n    pResDesc: *const cuda_types::cuda::CUDA_RESOURCE_DESC,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pSurfObject), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pSurfObject, \"cuSurfObjectCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pResDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pResDesc, \"cuSurfObjectCreate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuSurfObjectDestroy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    surfObject: cuda_types::cuda::CUsurfObject,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(surfObject), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&surfObject, \"cuSurfObjectDestroy\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuSurfObjectGetResourceDesc(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pResDesc: *mut cuda_types::cuda::CUDA_RESOURCE_DESC,\n    surfObject: cuda_types::cuda::CUsurfObject,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pResDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pResDesc,\n        \"cuSurfObjectGetResourceDesc\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(surfObject), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &surfObject,\n        \"cuSurfObjectGetResourceDesc\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTensorMapEncodeTiled(\n    writer: &mut (impl std::io::Write + ?Sized),\n    tensorMap: *mut cuda_types::cuda::CUtensorMap,\n    tensorDataType: cuda_types::cuda::CUtensorMapDataType,\n    tensorRank: cuda_types::cuda::cuuint32_t,\n    globalAddress: *mut ::core::ffi::c_void,\n    globalDim: *const cuda_types::cuda::cuuint64_t,\n    globalStrides: *const cuda_types::cuda::cuuint64_t,\n    boxDim: *const cuda_types::cuda::cuuint32_t,\n    elementStrides: *const cuda_types::cuda::cuuint32_t,\n    interleave: cuda_types::cuda::CUtensorMapInterleave,\n    swizzle: cuda_types::cuda::CUtensorMapSwizzle,\n    l2Promotion: cuda_types::cuda::CUtensorMapL2promotion,\n    oobFill: cuda_types::cuda::CUtensorMapFloatOOBfill,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(tensorMap), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&tensorMap, \"cuTensorMapEncodeTiled\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(tensorDataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &tensorDataType,\n        \"cuTensorMapEncodeTiled\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(tensorRank), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&tensorRank, \"cuTensorMapEncodeTiled\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(globalAddress), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &globalAddress,\n        \"cuTensorMapEncodeTiled\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(globalDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&globalDim, \"cuTensorMapEncodeTiled\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(globalStrides), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &globalStrides,\n        \"cuTensorMapEncodeTiled\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(boxDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&boxDim, \"cuTensorMapEncodeTiled\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(elementStrides), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &elementStrides,\n        \"cuTensorMapEncodeTiled\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(interleave), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&interleave, \"cuTensorMapEncodeTiled\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(swizzle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&swizzle, \"cuTensorMapEncodeTiled\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(l2Promotion), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&l2Promotion, \"cuTensorMapEncodeTiled\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(oobFill), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&oobFill, \"cuTensorMapEncodeTiled\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTensorMapEncodeIm2col(\n    writer: &mut (impl std::io::Write + ?Sized),\n    tensorMap: *mut cuda_types::cuda::CUtensorMap,\n    tensorDataType: cuda_types::cuda::CUtensorMapDataType,\n    tensorRank: cuda_types::cuda::cuuint32_t,\n    globalAddress: *mut ::core::ffi::c_void,\n    globalDim: *const cuda_types::cuda::cuuint64_t,\n    globalStrides: *const cuda_types::cuda::cuuint64_t,\n    pixelBoxLowerCorner: *const ::core::ffi::c_int,\n    pixelBoxUpperCorner: *const ::core::ffi::c_int,\n    channelsPerPixel: cuda_types::cuda::cuuint32_t,\n    pixelsPerColumn: cuda_types::cuda::cuuint32_t,\n    elementStrides: *const cuda_types::cuda::cuuint32_t,\n    interleave: cuda_types::cuda::CUtensorMapInterleave,\n    swizzle: cuda_types::cuda::CUtensorMapSwizzle,\n    l2Promotion: cuda_types::cuda::CUtensorMapL2promotion,\n    oobFill: cuda_types::cuda::CUtensorMapFloatOOBfill,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(tensorMap), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&tensorMap, \"cuTensorMapEncodeIm2col\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(tensorDataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &tensorDataType,\n        \"cuTensorMapEncodeIm2col\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(tensorRank), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&tensorRank, \"cuTensorMapEncodeIm2col\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(globalAddress), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &globalAddress,\n        \"cuTensorMapEncodeIm2col\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(globalDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&globalDim, \"cuTensorMapEncodeIm2col\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(globalStrides), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &globalStrides,\n        \"cuTensorMapEncodeIm2col\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pixelBoxLowerCorner), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pixelBoxLowerCorner,\n        \"cuTensorMapEncodeIm2col\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pixelBoxUpperCorner), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pixelBoxUpperCorner,\n        \"cuTensorMapEncodeIm2col\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(channelsPerPixel), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &channelsPerPixel,\n        \"cuTensorMapEncodeIm2col\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pixelsPerColumn), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pixelsPerColumn,\n        \"cuTensorMapEncodeIm2col\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(elementStrides), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &elementStrides,\n        \"cuTensorMapEncodeIm2col\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(interleave), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&interleave, \"cuTensorMapEncodeIm2col\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(swizzle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&swizzle, \"cuTensorMapEncodeIm2col\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(l2Promotion), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&l2Promotion, \"cuTensorMapEncodeIm2col\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(oobFill), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&oobFill, \"cuTensorMapEncodeIm2col\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTensorMapEncodeIm2colWide(\n    writer: &mut (impl std::io::Write + ?Sized),\n    tensorMap: *mut cuda_types::cuda::CUtensorMap,\n    tensorDataType: cuda_types::cuda::CUtensorMapDataType,\n    tensorRank: cuda_types::cuda::cuuint32_t,\n    globalAddress: *mut ::core::ffi::c_void,\n    globalDim: *const cuda_types::cuda::cuuint64_t,\n    globalStrides: *const cuda_types::cuda::cuuint64_t,\n    pixelBoxLowerCornerWidth: ::core::ffi::c_int,\n    pixelBoxUpperCornerWidth: ::core::ffi::c_int,\n    channelsPerPixel: cuda_types::cuda::cuuint32_t,\n    pixelsPerColumn: cuda_types::cuda::cuuint32_t,\n    elementStrides: *const cuda_types::cuda::cuuint32_t,\n    interleave: cuda_types::cuda::CUtensorMapInterleave,\n    mode: cuda_types::cuda::CUtensorMapIm2ColWideMode,\n    swizzle: cuda_types::cuda::CUtensorMapSwizzle,\n    l2Promotion: cuda_types::cuda::CUtensorMapL2promotion,\n    oobFill: cuda_types::cuda::CUtensorMapFloatOOBfill,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(tensorMap), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &tensorMap,\n        \"cuTensorMapEncodeIm2colWide\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(tensorDataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &tensorDataType,\n        \"cuTensorMapEncodeIm2colWide\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(tensorRank), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &tensorRank,\n        \"cuTensorMapEncodeIm2colWide\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(globalAddress), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &globalAddress,\n        \"cuTensorMapEncodeIm2colWide\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(globalDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &globalDim,\n        \"cuTensorMapEncodeIm2colWide\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(globalStrides), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &globalStrides,\n        \"cuTensorMapEncodeIm2colWide\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pixelBoxLowerCornerWidth), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pixelBoxLowerCornerWidth,\n        \"cuTensorMapEncodeIm2colWide\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pixelBoxUpperCornerWidth), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pixelBoxUpperCornerWidth,\n        \"cuTensorMapEncodeIm2colWide\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(channelsPerPixel), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &channelsPerPixel,\n        \"cuTensorMapEncodeIm2colWide\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pixelsPerColumn), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pixelsPerColumn,\n        \"cuTensorMapEncodeIm2colWide\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(elementStrides), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &elementStrides,\n        \"cuTensorMapEncodeIm2colWide\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(interleave), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &interleave,\n        \"cuTensorMapEncodeIm2colWide\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cuTensorMapEncodeIm2colWide\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(swizzle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&swizzle, \"cuTensorMapEncodeIm2colWide\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(l2Promotion), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &l2Promotion,\n        \"cuTensorMapEncodeIm2colWide\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(oobFill), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&oobFill, \"cuTensorMapEncodeIm2colWide\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTensorMapReplaceAddress(\n    writer: &mut (impl std::io::Write + ?Sized),\n    tensorMap: *mut cuda_types::cuda::CUtensorMap,\n    globalAddress: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(tensorMap), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&tensorMap, \"cuTensorMapReplaceAddress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(globalAddress), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &globalAddress,\n        \"cuTensorMapReplaceAddress\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDeviceCanAccessPeer(\n    writer: &mut (impl std::io::Write + ?Sized),\n    canAccessPeer: *mut ::core::ffi::c_int,\n    dev: cuda_types::cuda::CUdevice,\n    peerDev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(canAccessPeer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&canAccessPeer, \"cuDeviceCanAccessPeer\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuDeviceCanAccessPeer\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(peerDev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&peerDev, \"cuDeviceCanAccessPeer\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxEnablePeerAccess(\n    writer: &mut (impl std::io::Write + ?Sized),\n    peerContext: cuda_types::cuda::CUcontext,\n    Flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(peerContext), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&peerContext, \"cuCtxEnablePeerAccess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Flags, \"cuCtxEnablePeerAccess\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxDisablePeerAccess(\n    writer: &mut (impl std::io::Write + ?Sized),\n    peerContext: cuda_types::cuda::CUcontext,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(peerContext), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&peerContext, \"cuCtxDisablePeerAccess\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDeviceGetP2PAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    value: *mut ::core::ffi::c_int,\n    attrib: cuda_types::cuda::CUdevice_P2PAttribute,\n    srcDevice: cuda_types::cuda::CUdevice,\n    dstDevice: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuDeviceGetP2PAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attrib), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attrib, \"cuDeviceGetP2PAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcDevice, \"cuDeviceGetP2PAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuDeviceGetP2PAttribute\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDeviceGetP2PAtomicCapabilities(\n    writer: &mut (impl std::io::Write + ?Sized),\n    capabilities: *mut ::core::ffi::c_uint,\n    operations: *const cuda_types::cuda::CUatomicOperation,\n    count: ::core::ffi::c_uint,\n    srcDevice: cuda_types::cuda::CUdevice,\n    dstDevice: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(capabilities), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &capabilities,\n        \"cuDeviceGetP2PAtomicCapabilities\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(operations), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &operations,\n        \"cuDeviceGetP2PAtomicCapabilities\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &count,\n        \"cuDeviceGetP2PAtomicCapabilities\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &srcDevice,\n        \"cuDeviceGetP2PAtomicCapabilities\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dstDevice,\n        \"cuDeviceGetP2PAtomicCapabilities\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphicsUnregisterResource(\n    writer: &mut (impl std::io::Write + ?Sized),\n    resource: cuda_types::cuda::CUgraphicsResource,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(resource), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resource,\n        \"cuGraphicsUnregisterResource\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphicsSubResourceGetMappedArray(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pArray: *mut cuda_types::cuda::CUarray,\n    resource: cuda_types::cuda::CUgraphicsResource,\n    arrayIndex: ::core::ffi::c_uint,\n    mipLevel: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pArray,\n        \"cuGraphicsSubResourceGetMappedArray\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resource), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resource,\n        \"cuGraphicsSubResourceGetMappedArray\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(arrayIndex), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &arrayIndex,\n        \"cuGraphicsSubResourceGetMappedArray\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mipLevel), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mipLevel,\n        \"cuGraphicsSubResourceGetMappedArray\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphicsResourceGetMappedMipmappedArray(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pMipmappedArray: *mut cuda_types::cuda::CUmipmappedArray,\n    resource: cuda_types::cuda::CUgraphicsResource,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pMipmappedArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pMipmappedArray,\n        \"cuGraphicsResourceGetMappedMipmappedArray\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resource), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resource,\n        \"cuGraphicsResourceGetMappedMipmappedArray\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphicsResourceGetMappedPointer_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pDevPtr: *mut cuda_types::cuda::CUdeviceptr,\n    pSize: *mut usize,\n    resource: cuda_types::cuda::CUgraphicsResource,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pDevPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pDevPtr,\n        \"cuGraphicsResourceGetMappedPointer_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pSize,\n        \"cuGraphicsResourceGetMappedPointer_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resource), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resource,\n        \"cuGraphicsResourceGetMappedPointer_v2\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphicsResourceSetMapFlags_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    resource: cuda_types::cuda::CUgraphicsResource,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(resource), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resource,\n        \"cuGraphicsResourceSetMapFlags_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &flags,\n        \"cuGraphicsResourceSetMapFlags_v2\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphicsMapResources_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    count: ::core::ffi::c_uint,\n    resources: *mut cuda_types::cuda::CUgraphicsResource,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuGraphicsMapResources_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resources), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resources,\n        \"cuGraphicsMapResources_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuGraphicsMapResources_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphicsUnmapResources_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    count: ::core::ffi::c_uint,\n    resources: *mut cuda_types::cuda::CUgraphicsResource,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuGraphicsUnmapResources_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resources), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resources,\n        \"cuGraphicsUnmapResources_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hStream,\n        \"cuGraphicsUnmapResources_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGetProcAddress_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    symbol: *const ::core::ffi::c_char,\n    pfn: *mut *mut ::core::ffi::c_void,\n    cudaVersion: ::core::ffi::c_int,\n    flags: cuda_types::cuda::cuuint64_t,\n    symbolStatus: *mut cuda_types::cuda::CUdriverProcAddressQueryResult,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(symbol), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&symbol, \"cuGetProcAddress_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pfn), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pfn, \"cuGetProcAddress_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cudaVersion), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cudaVersion, \"cuGetProcAddress_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuGetProcAddress_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(symbolStatus), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&symbolStatus, \"cuGetProcAddress_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUcoredumpSettings_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUcoredumpSettings_enum::CU_COREDUMP_ENABLE_ON_EXCEPTION => {\n                writer.write_all(stringify!(CU_COREDUMP_ENABLE_ON_EXCEPTION).as_bytes())\n            }\n            &cuda_types::cuda::CUcoredumpSettings_enum::CU_COREDUMP_TRIGGER_HOST => {\n                writer.write_all(stringify!(CU_COREDUMP_TRIGGER_HOST).as_bytes())\n            }\n            &cuda_types::cuda::CUcoredumpSettings_enum::CU_COREDUMP_LIGHTWEIGHT => {\n                writer.write_all(stringify!(CU_COREDUMP_LIGHTWEIGHT).as_bytes())\n            }\n            &cuda_types::cuda::CUcoredumpSettings_enum::CU_COREDUMP_ENABLE_USER_TRIGGER => {\n                writer.write_all(stringify!(CU_COREDUMP_ENABLE_USER_TRIGGER).as_bytes())\n            }\n            &cuda_types::cuda::CUcoredumpSettings_enum::CU_COREDUMP_FILE => {\n                writer.write_all(stringify!(CU_COREDUMP_FILE).as_bytes())\n            }\n            &cuda_types::cuda::CUcoredumpSettings_enum::CU_COREDUMP_PIPE => {\n                writer.write_all(stringify!(CU_COREDUMP_PIPE).as_bytes())\n            }\n            &cuda_types::cuda::CUcoredumpSettings_enum::CU_COREDUMP_GENERATION_FLAGS => {\n                writer.write_all(stringify!(CU_COREDUMP_GENERATION_FLAGS).as_bytes())\n            }\n            &cuda_types::cuda::CUcoredumpSettings_enum::CU_COREDUMP_MAX => {\n                writer.write_all(stringify!(CU_COREDUMP_MAX).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUCoredumpGenerationFlags {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUCoredumpGenerationFlags::CU_COREDUMP_DEFAULT_FLAGS => {\n                writer.write_all(stringify!(CU_COREDUMP_DEFAULT_FLAGS).as_bytes())\n            }\n            &cuda_types::cuda::CUCoredumpGenerationFlags::CU_COREDUMP_SKIP_NONRELOCATED_ELF_IMAGES => {\n                writer\n                    .write_all(\n                        stringify!(CU_COREDUMP_SKIP_NONRELOCATED_ELF_IMAGES).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUCoredumpGenerationFlags::CU_COREDUMP_SKIP_GLOBAL_MEMORY => {\n                writer.write_all(stringify!(CU_COREDUMP_SKIP_GLOBAL_MEMORY).as_bytes())\n            }\n            &cuda_types::cuda::CUCoredumpGenerationFlags::CU_COREDUMP_SKIP_SHARED_MEMORY => {\n                writer.write_all(stringify!(CU_COREDUMP_SKIP_SHARED_MEMORY).as_bytes())\n            }\n            &cuda_types::cuda::CUCoredumpGenerationFlags::CU_COREDUMP_SKIP_LOCAL_MEMORY => {\n                writer.write_all(stringify!(CU_COREDUMP_SKIP_LOCAL_MEMORY).as_bytes())\n            }\n            &cuda_types::cuda::CUCoredumpGenerationFlags::CU_COREDUMP_SKIP_ABORT => {\n                writer.write_all(stringify!(CU_COREDUMP_SKIP_ABORT).as_bytes())\n            }\n            &cuda_types::cuda::CUCoredumpGenerationFlags::CU_COREDUMP_SKIP_CONSTBANK_MEMORY => {\n                writer\n                    .write_all(stringify!(CU_COREDUMP_SKIP_CONSTBANK_MEMORY).as_bytes())\n            }\n            &cuda_types::cuda::CUCoredumpGenerationFlags::CU_COREDUMP_LIGHTWEIGHT_FLAGS => {\n                writer.write_all(stringify!(CU_COREDUMP_LIGHTWEIGHT_FLAGS).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cuCoredumpGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    attrib: cuda_types::cuda::CUcoredumpSettings,\n    value: *mut ::core::ffi::c_void,\n    size: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(attrib), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attrib, \"cuCoredumpGetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuCoredumpGetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cuCoredumpGetAttribute\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCoredumpGetAttributeGlobal(\n    writer: &mut (impl std::io::Write + ?Sized),\n    attrib: cuda_types::cuda::CUcoredumpSettings,\n    value: *mut ::core::ffi::c_void,\n    size: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(attrib), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attrib, \"cuCoredumpGetAttributeGlobal\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuCoredumpGetAttributeGlobal\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cuCoredumpGetAttributeGlobal\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCoredumpSetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    attrib: cuda_types::cuda::CUcoredumpSettings,\n    value: *mut ::core::ffi::c_void,\n    size: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(attrib), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attrib, \"cuCoredumpSetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuCoredumpSetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cuCoredumpSetAttribute\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCoredumpSetAttributeGlobal(\n    writer: &mut (impl std::io::Write + ?Sized),\n    attrib: cuda_types::cuda::CUcoredumpSettings,\n    value: *mut ::core::ffi::c_void,\n    size: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(attrib), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attrib, \"cuCoredumpSetAttributeGlobal\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuCoredumpSetAttributeGlobal\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cuCoredumpSetAttributeGlobal\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGetExportTable(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ppExportTable: *mut *const ::core::ffi::c_void,\n    pExportTableId: *const cuda_types::cuda::CUuuid,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ppExportTable), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ppExportTable, \"cuGetExportTable\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pExportTableId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pExportTableId, \"cuGetExportTable\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUdevResourceDesc {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUgreenCtxCreate_flags {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUgreenCtxCreate_flags::CU_GREEN_CTX_DEFAULT_STREAM => {\n                writer.write_all(stringify!(CU_GREEN_CTX_DEFAULT_STREAM).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUdevSmResourceSplit_flags {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUdevSmResourceSplit_flags::CU_DEV_SM_RESOURCE_SPLIT_IGNORE_SM_COSCHEDULING => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEV_SM_RESOURCE_SPLIT_IGNORE_SM_COSCHEDULING)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUdevSmResourceSplit_flags::CU_DEV_SM_RESOURCE_SPLIT_MAX_POTENTIAL_CLUSTER_SIZE => {\n                writer\n                    .write_all(\n                        stringify!(CU_DEV_SM_RESOURCE_SPLIT_MAX_POTENTIAL_CLUSTER_SIZE)\n                            .as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUdevResourceType {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUdevResourceType::CU_DEV_RESOURCE_TYPE_INVALID => {\n                writer.write_all(stringify!(CU_DEV_RESOURCE_TYPE_INVALID).as_bytes())\n            }\n            &cuda_types::cuda::CUdevResourceType::CU_DEV_RESOURCE_TYPE_SM => {\n                writer.write_all(stringify!(CU_DEV_RESOURCE_TYPE_SM).as_bytes())\n            }\n            &cuda_types::cuda::CUdevResourceType::CU_DEV_RESOURCE_TYPE_MAX => {\n                writer.write_all(stringify!(CU_DEV_RESOURCE_TYPE_MAX).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUdevSmResource_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(smCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.smCount, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(minSmPartitionSize), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.minSmPartitionSize, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(smCoscheduledAlignment), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.smCoscheduledAlignment, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\npub fn write_cuGreenCtxCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phCtx: *mut cuda_types::cuda::CUgreenCtx,\n    desc: cuda_types::cuda::CUdevResourceDesc,\n    dev: cuda_types::cuda::CUdevice,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phCtx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phCtx, \"cuGreenCtxCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(desc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&desc, \"cuGreenCtxCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuGreenCtxCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuGreenCtxCreate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGreenCtxDestroy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hCtx: cuda_types::cuda::CUgreenCtx,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hCtx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hCtx, \"cuGreenCtxDestroy\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxFromGreenCtx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pContext: *mut cuda_types::cuda::CUcontext,\n    hCtx: cuda_types::cuda::CUgreenCtx,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pContext), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pContext, \"cuCtxFromGreenCtx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hCtx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hCtx, \"cuCtxFromGreenCtx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDeviceGetDevResource(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::cuda::CUdevice,\n    resource: *mut cuda_types::cuda::CUdevResource,\n    type_: cuda_types::cuda::CUdevResourceType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"cuDeviceGetDevResource\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resource), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&resource, \"cuDeviceGetDevResource\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cuDeviceGetDevResource\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxGetDevResource(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hCtx: cuda_types::cuda::CUcontext,\n    resource: *mut cuda_types::cuda::CUdevResource,\n    type_: cuda_types::cuda::CUdevResourceType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hCtx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hCtx, \"cuCtxGetDevResource\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resource), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&resource, \"cuCtxGetDevResource\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cuCtxGetDevResource\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGreenCtxGetDevResource(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hCtx: cuda_types::cuda::CUgreenCtx,\n    resource: *mut cuda_types::cuda::CUdevResource,\n    type_: cuda_types::cuda::CUdevResourceType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hCtx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hCtx, \"cuGreenCtxGetDevResource\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resource), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&resource, \"cuGreenCtxGetDevResource\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cuGreenCtxGetDevResource\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDevSmResourceSplitByCount(\n    writer: &mut (impl std::io::Write + ?Sized),\n    result: *mut cuda_types::cuda::CUdevResource,\n    nbGroups: *mut ::core::ffi::c_uint,\n    input: *const cuda_types::cuda::CUdevResource,\n    remaining: *mut cuda_types::cuda::CUdevResource,\n    useFlags: ::core::ffi::c_uint,\n    minCount: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cuDevSmResourceSplitByCount\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbGroups), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nbGroups,\n        \"cuDevSmResourceSplitByCount\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(input), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&input, \"cuDevSmResourceSplitByCount\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(remaining), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &remaining,\n        \"cuDevSmResourceSplitByCount\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(useFlags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &useFlags,\n        \"cuDevSmResourceSplitByCount\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(minCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &minCount,\n        \"cuDevSmResourceSplitByCount\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDevResourceGenerateDesc(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phDesc: *mut cuda_types::cuda::CUdevResourceDesc,\n    resources: *mut cuda_types::cuda::CUdevResource,\n    nbResources: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phDesc, \"cuDevResourceGenerateDesc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resources), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&resources, \"cuDevResourceGenerateDesc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbResources), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nbResources,\n        \"cuDevResourceGenerateDesc\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGreenCtxRecordEvent(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hCtx: cuda_types::cuda::CUgreenCtx,\n    hEvent: cuda_types::cuda::CUevent,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hCtx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hCtx, \"cuGreenCtxRecordEvent\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hEvent), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hEvent, \"cuGreenCtxRecordEvent\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGreenCtxWaitEvent(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hCtx: cuda_types::cuda::CUgreenCtx,\n    hEvent: cuda_types::cuda::CUevent,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hCtx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hCtx, \"cuGreenCtxWaitEvent\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hEvent), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hEvent, \"cuGreenCtxWaitEvent\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamGetGreenCtx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    phCtx: *mut cuda_types::cuda::CUgreenCtx,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamGetGreenCtx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(phCtx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phCtx, \"cuStreamGetGreenCtx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGreenCtxStreamCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phStream: *mut cuda_types::cuda::CUstream,\n    greenCtx: cuda_types::cuda::CUgreenCtx,\n    flags: ::core::ffi::c_uint,\n    priority: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phStream, \"cuGreenCtxStreamCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(greenCtx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&greenCtx, \"cuGreenCtxStreamCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuGreenCtxStreamCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(priority), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&priority, \"cuGreenCtxStreamCreate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGreenCtxGetId(\n    writer: &mut (impl std::io::Write + ?Sized),\n    greenCtx: cuda_types::cuda::CUgreenCtx,\n    greenCtxId: *mut ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(greenCtx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&greenCtx, \"cuGreenCtxGetId\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(greenCtxId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&greenCtxId, \"cuGreenCtxGetId\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUlogLevel_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUlogLevel_enum::CU_LOG_LEVEL_ERROR => {\n                writer.write_all(stringify!(CU_LOG_LEVEL_ERROR).as_bytes())\n            }\n            &cuda_types::cuda::CUlogLevel_enum::CU_LOG_LEVEL_WARNING => {\n                writer.write_all(stringify!(CU_LOG_LEVEL_WARNING).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUlogsCallbackHandle {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUlogsCallback {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(\n            writer,\n            \"{:p}\",\n            unsafe {\n                std::mem::transmute::<\n                    cuda_types::cuda::CUlogsCallback,\n                    *mut ::std::ffi::c_void,\n                >(*self)\n            },\n        )\n    }\n}\npub fn write_cuLogsRegisterCallback(\n    writer: &mut (impl std::io::Write + ?Sized),\n    callbackFunc: cuda_types::cuda::CUlogsCallback,\n    userData: *mut ::core::ffi::c_void,\n    callback_out: *mut cuda_types::cuda::CUlogsCallbackHandle,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(callbackFunc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&callbackFunc, \"cuLogsRegisterCallback\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(userData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&userData, \"cuLogsRegisterCallback\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(callback_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&callback_out, \"cuLogsRegisterCallback\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLogsUnregisterCallback(\n    writer: &mut (impl std::io::Write + ?Sized),\n    callback: cuda_types::cuda::CUlogsCallbackHandle,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(callback), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&callback, \"cuLogsUnregisterCallback\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLogsCurrent(\n    writer: &mut (impl std::io::Write + ?Sized),\n    iterator_out: *mut cuda_types::cuda::CUlogIterator,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(iterator_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&iterator_out, \"cuLogsCurrent\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuLogsCurrent\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLogsDumpToFile(\n    writer: &mut (impl std::io::Write + ?Sized),\n    iterator: *mut cuda_types::cuda::CUlogIterator,\n    pathToFile: *const ::core::ffi::c_char,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(iterator), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&iterator, \"cuLogsDumpToFile\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pathToFile), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pathToFile, \"cuLogsDumpToFile\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuLogsDumpToFile\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLogsDumpToMemory(\n    writer: &mut (impl std::io::Write + ?Sized),\n    iterator: *mut cuda_types::cuda::CUlogIterator,\n    buffer: *mut ::core::ffi::c_char,\n    size: *mut usize,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(iterator), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&iterator, \"cuLogsDumpToMemory\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(buffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&buffer, \"cuLogsDumpToMemory\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cuLogsDumpToMemory\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuLogsDumpToMemory\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemHostRegister(\n    writer: &mut (impl std::io::Write + ?Sized),\n    p: *mut ::core::ffi::c_void,\n    bytesize: usize,\n    Flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(p), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&p, \"cuMemHostRegister\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bytesize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bytesize, \"cuMemHostRegister\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Flags, \"cuMemHostRegister\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphicsResourceSetMapFlags(\n    writer: &mut (impl std::io::Write + ?Sized),\n    resource: cuda_types::cuda::CUgraphicsResource,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(resource), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resource,\n        \"cuGraphicsResourceSetMapFlags\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuGraphicsResourceSetMapFlags\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLinkCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    numOptions: ::core::ffi::c_uint,\n    options: *mut cuda_types::cuda::CUjit_option,\n    optionValues: *mut *mut ::core::ffi::c_void,\n    stateOut: *mut cuda_types::cuda::CUlinkState,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(numOptions), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numOptions, \"cuLinkCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(options), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&options, \"cuLinkCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(optionValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&optionValues, \"cuLinkCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stateOut), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stateOut, \"cuLinkCreate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLinkAddData(\n    writer: &mut (impl std::io::Write + ?Sized),\n    state: cuda_types::cuda::CUlinkState,\n    type_: cuda_types::cuda::CUjitInputType,\n    data: *mut ::core::ffi::c_void,\n    size: usize,\n    name: *const ::core::ffi::c_char,\n    numOptions: ::core::ffi::c_uint,\n    options: *mut cuda_types::cuda::CUjit_option,\n    optionValues: *mut *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(state), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&state, \"cuLinkAddData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cuLinkAddData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(data), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&data, \"cuLinkAddData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cuLinkAddData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(name), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&name, \"cuLinkAddData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numOptions), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numOptions, \"cuLinkAddData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(options), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&options, \"cuLinkAddData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(optionValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&optionValues, \"cuLinkAddData\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLinkAddFile(\n    writer: &mut (impl std::io::Write + ?Sized),\n    state: cuda_types::cuda::CUlinkState,\n    type_: cuda_types::cuda::CUjitInputType,\n    path: *const ::core::ffi::c_char,\n    numOptions: ::core::ffi::c_uint,\n    options: *mut cuda_types::cuda::CUjit_option,\n    optionValues: *mut *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(state), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&state, \"cuLinkAddFile\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cuLinkAddFile\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(path), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&path, \"cuLinkAddFile\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numOptions), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numOptions, \"cuLinkAddFile\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(options), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&options, \"cuLinkAddFile\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(optionValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&optionValues, \"cuLinkAddFile\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefSetAddress2D_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hTexRef: cuda_types::cuda::CUtexref,\n    desc: *const cuda_types::cuda::CUDA_ARRAY_DESCRIPTOR,\n    dptr: cuda_types::cuda::CUdeviceptr,\n    Pitch: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefSetAddress2D_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(desc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&desc, \"cuTexRefSetAddress2D_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuTexRefSetAddress2D_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Pitch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Pitch, \"cuTexRefSetAddress2D_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_MEMCPY2D_v1_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(srcXInBytes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcXInBytes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcY), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcY, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcMemoryType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcMemoryType, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcHost), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcHost, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcDevice), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcDevice, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcArray), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcArray, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcPitch), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcPitch, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstXInBytes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstXInBytes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstY), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstY, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstMemoryType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstMemoryType, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstHost), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstHost, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstDevice), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstDevice, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstArray), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstArray, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstPitch), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstPitch, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(WidthInBytes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.WidthInBytes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(Height), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.Height, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_MEMCPY3D_v1_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(srcXInBytes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcXInBytes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcY), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcY, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcZ), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcZ, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcLOD), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcLOD, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcMemoryType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcMemoryType, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcHost), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcHost, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcDevice), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcDevice, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcArray), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcArray, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcPitch), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcPitch, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(srcHeight), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.srcHeight, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstXInBytes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstXInBytes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstY), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstY, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstZ), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstZ, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstLOD), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstLOD, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstMemoryType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstMemoryType, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstHost), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstHost, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstDevice), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstDevice, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstArray), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstArray, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstPitch), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstPitch, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dstHeight), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dstHeight, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(WidthInBytes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.WidthInBytes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(Height), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.Height, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(Depth), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.Depth, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_ARRAY_DESCRIPTOR_v1_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(Width), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.Width, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(Height), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.Height, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(Format), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.Format, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(NumChannels), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.NumChannels, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUDA_ARRAY3D_DESCRIPTOR_v1_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(Width), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.Width, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(Height), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.Height, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(Depth), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.Depth, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(Format), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.Format, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(NumChannels), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.NumChannels, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(Flags), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.Flags, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\npub fn write_cuDeviceTotalMem(\n    writer: &mut (impl std::io::Write + ?Sized),\n    bytes: *mut ::core::ffi::c_uint,\n    dev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(bytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bytes, \"cuDeviceTotalMem\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuDeviceTotalMem\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pctx: *mut cuda_types::cuda::CUcontext,\n    flags: ::core::ffi::c_uint,\n    dev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pctx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pctx, \"cuCtxCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuCtxCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuCtxCreate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxCreate_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pctx: *mut cuda_types::cuda::CUcontext,\n    flags: ::core::ffi::c_uint,\n    dev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pctx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pctx, \"cuCtxCreate_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuCtxCreate_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuCtxCreate_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxCreate_v3(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pctx: *mut cuda_types::cuda::CUcontext,\n    paramsArray: *mut cuda_types::cuda::CUexecAffinityParam,\n    numParams: ::core::ffi::c_int,\n    flags: ::core::ffi::c_uint,\n    dev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pctx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pctx, \"cuCtxCreate_v3\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paramsArray), \": \").as_bytes())?;\n    writer.write_all(b\"[\")?;\n    for i in 0..numParams {\n        if i != 0 {\n            writer.write_all(b\", \")?;\n        }\n        crate::CudaDisplay::write(\n            unsafe { &*paramsArray.add(i as usize) },\n            \"cuCtxCreate_v3\",\n            arg_idx,\n            writer,\n        )?;\n    }\n    writer.write_all(b\"]\")?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numParams, \"cuCtxCreate_v3\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuCtxCreate_v3\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuCtxCreate_v3\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuModuleGetGlobal(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptr: *mut cuda_types::cuda::CUdeviceptr_v1,\n    bytes: *mut ::core::ffi::c_uint,\n    hmod: cuda_types::cuda::CUmodule,\n    name: *const ::core::ffi::c_char,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuModuleGetGlobal\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bytes, \"cuModuleGetGlobal\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hmod), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hmod, \"cuModuleGetGlobal\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(name), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&name, \"cuModuleGetGlobal\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemGetInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    free: *mut ::core::ffi::c_uint,\n    total: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(free), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&free, \"cuMemGetInfo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(total), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&total, \"cuMemGetInfo\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemAlloc(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptr: *mut cuda_types::cuda::CUdeviceptr_v1,\n    bytesize: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuMemAlloc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bytesize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bytesize, \"cuMemAlloc\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemAllocPitch(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptr: *mut cuda_types::cuda::CUdeviceptr_v1,\n    pPitch: *mut ::core::ffi::c_uint,\n    WidthInBytes: ::core::ffi::c_uint,\n    Height: ::core::ffi::c_uint,\n    ElementSizeBytes: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuMemAllocPitch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pPitch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pPitch, \"cuMemAllocPitch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(WidthInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&WidthInBytes, \"cuMemAllocPitch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Height), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Height, \"cuMemAllocPitch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ElementSizeBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ElementSizeBytes, \"cuMemAllocPitch\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemFree(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptr: cuda_types::cuda::CUdeviceptr_v1,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuMemFree\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemGetAddressRange(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pbase: *mut cuda_types::cuda::CUdeviceptr_v1,\n    psize: *mut ::core::ffi::c_uint,\n    dptr: cuda_types::cuda::CUdeviceptr_v1,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pbase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pbase, \"cuMemGetAddressRange\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(psize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&psize, \"cuMemGetAddressRange\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuMemGetAddressRange\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemAllocHost(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pp: *mut *mut ::core::ffi::c_void,\n    bytesize: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pp), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pp, \"cuMemAllocHost\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bytesize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bytesize, \"cuMemAllocHost\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemHostGetDevicePointer(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pdptr: *mut cuda_types::cuda::CUdeviceptr_v1,\n    p: *mut ::core::ffi::c_void,\n    Flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pdptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pdptr, \"cuMemHostGetDevicePointer\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(p), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&p, \"cuMemHostGetDevicePointer\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Flags, \"cuMemHostGetDevicePointer\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyHtoD(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr_v1,\n    srcHost: *const ::core::ffi::c_void,\n    ByteCount: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemcpyHtoD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcHost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcHost, \"cuMemcpyHtoD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyHtoD\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyDtoH(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstHost: *mut ::core::ffi::c_void,\n    srcDevice: cuda_types::cuda::CUdeviceptr_v1,\n    ByteCount: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstHost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstHost, \"cuMemcpyDtoH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcDevice, \"cuMemcpyDtoH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyDtoH\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyDtoD(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr_v1,\n    srcDevice: cuda_types::cuda::CUdeviceptr_v1,\n    ByteCount: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemcpyDtoD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcDevice, \"cuMemcpyDtoD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyDtoD\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyDtoA(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstArray: cuda_types::cuda::CUarray,\n    dstOffset: ::core::ffi::c_uint,\n    srcDevice: cuda_types::cuda::CUdeviceptr_v1,\n    ByteCount: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstArray, \"cuMemcpyDtoA\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstOffset, \"cuMemcpyDtoA\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcDevice, \"cuMemcpyDtoA\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyDtoA\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyAtoD(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr_v1,\n    srcArray: cuda_types::cuda::CUarray,\n    srcOffset: ::core::ffi::c_uint,\n    ByteCount: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemcpyAtoD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcArray, \"cuMemcpyAtoD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcOffset, \"cuMemcpyAtoD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyAtoD\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyHtoA(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstArray: cuda_types::cuda::CUarray,\n    dstOffset: ::core::ffi::c_uint,\n    srcHost: *const ::core::ffi::c_void,\n    ByteCount: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstArray, \"cuMemcpyHtoA\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstOffset, \"cuMemcpyHtoA\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcHost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcHost, \"cuMemcpyHtoA\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyHtoA\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyAtoH(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstHost: *mut ::core::ffi::c_void,\n    srcArray: cuda_types::cuda::CUarray,\n    srcOffset: ::core::ffi::c_uint,\n    ByteCount: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstHost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstHost, \"cuMemcpyAtoH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcArray, \"cuMemcpyAtoH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcOffset, \"cuMemcpyAtoH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyAtoH\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyAtoA(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstArray: cuda_types::cuda::CUarray,\n    dstOffset: ::core::ffi::c_uint,\n    srcArray: cuda_types::cuda::CUarray,\n    srcOffset: ::core::ffi::c_uint,\n    ByteCount: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstArray, \"cuMemcpyAtoA\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstOffset, \"cuMemcpyAtoA\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcArray, \"cuMemcpyAtoA\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcOffset, \"cuMemcpyAtoA\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyAtoA\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyHtoAAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstArray: cuda_types::cuda::CUarray,\n    dstOffset: ::core::ffi::c_uint,\n    srcHost: *const ::core::ffi::c_void,\n    ByteCount: ::core::ffi::c_uint,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstArray, \"cuMemcpyHtoAAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstOffset, \"cuMemcpyHtoAAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcHost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcHost, \"cuMemcpyHtoAAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyHtoAAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpyHtoAAsync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyAtoHAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstHost: *mut ::core::ffi::c_void,\n    srcArray: cuda_types::cuda::CUarray,\n    srcOffset: ::core::ffi::c_uint,\n    ByteCount: ::core::ffi::c_uint,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstHost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstHost, \"cuMemcpyAtoHAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcArray, \"cuMemcpyAtoHAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcOffset, \"cuMemcpyAtoHAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyAtoHAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpyAtoHAsync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpy2D(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pCopy: *const cuda_types::cuda::CUDA_MEMCPY2D_v1,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pCopy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pCopy, \"cuMemcpy2D\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpy2DUnaligned(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pCopy: *const cuda_types::cuda::CUDA_MEMCPY2D_v1,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pCopy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pCopy, \"cuMemcpy2DUnaligned\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpy3D(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pCopy: *const cuda_types::cuda::CUDA_MEMCPY3D_v1,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pCopy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pCopy, \"cuMemcpy3D\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyHtoDAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr_v1,\n    srcHost: *const ::core::ffi::c_void,\n    ByteCount: ::core::ffi::c_uint,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemcpyHtoDAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcHost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcHost, \"cuMemcpyHtoDAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyHtoDAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpyHtoDAsync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyDtoHAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstHost: *mut ::core::ffi::c_void,\n    srcDevice: cuda_types::cuda::CUdeviceptr_v1,\n    ByteCount: ::core::ffi::c_uint,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstHost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstHost, \"cuMemcpyDtoHAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcDevice, \"cuMemcpyDtoHAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyDtoHAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpyDtoHAsync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyDtoDAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr_v1,\n    srcDevice: cuda_types::cuda::CUdeviceptr_v1,\n    ByteCount: ::core::ffi::c_uint,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemcpyDtoDAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcDevice, \"cuMemcpyDtoDAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyDtoDAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpyDtoDAsync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpy2DAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pCopy: *const cuda_types::cuda::CUDA_MEMCPY2D_v1,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pCopy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pCopy, \"cuMemcpy2DAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpy2DAsync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpy3DAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pCopy: *const cuda_types::cuda::CUDA_MEMCPY3D_v1,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pCopy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pCopy, \"cuMemcpy3DAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpy3DAsync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD8(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr_v1,\n    uc: ::core::ffi::c_uchar,\n    N: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uc, \"cuMemsetD8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(N), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&N, \"cuMemsetD8\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD16(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr_v1,\n    us: ::core::ffi::c_ushort,\n    N: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD16\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(us), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&us, \"cuMemsetD16\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(N), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&N, \"cuMemsetD16\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD32(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr_v1,\n    ui: ::core::ffi::c_uint,\n    N: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD32\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ui), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ui, \"cuMemsetD32\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(N), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&N, \"cuMemsetD32\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD2D8(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr_v1,\n    dstPitch: ::core::ffi::c_uint,\n    uc: ::core::ffi::c_uchar,\n    Width: ::core::ffi::c_uint,\n    Height: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD2D8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstPitch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstPitch, \"cuMemsetD2D8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uc, \"cuMemsetD2D8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Width), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Width, \"cuMemsetD2D8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Height), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Height, \"cuMemsetD2D8\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD2D16(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr_v1,\n    dstPitch: ::core::ffi::c_uint,\n    us: ::core::ffi::c_ushort,\n    Width: ::core::ffi::c_uint,\n    Height: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD2D16\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstPitch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstPitch, \"cuMemsetD2D16\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(us), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&us, \"cuMemsetD2D16\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Width), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Width, \"cuMemsetD2D16\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Height), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Height, \"cuMemsetD2D16\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD2D32(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr_v1,\n    dstPitch: ::core::ffi::c_uint,\n    ui: ::core::ffi::c_uint,\n    Width: ::core::ffi::c_uint,\n    Height: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD2D32\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstPitch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstPitch, \"cuMemsetD2D32\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ui), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ui, \"cuMemsetD2D32\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Width), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Width, \"cuMemsetD2D32\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Height), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Height, \"cuMemsetD2D32\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuArrayCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pHandle: *mut cuda_types::cuda::CUarray,\n    pAllocateArray: *const cuda_types::cuda::CUDA_ARRAY_DESCRIPTOR_v1,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pHandle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pHandle, \"cuArrayCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pAllocateArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pAllocateArray, \"cuArrayCreate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuArrayGetDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pArrayDescriptor: *mut cuda_types::cuda::CUDA_ARRAY_DESCRIPTOR_v1,\n    hArray: cuda_types::cuda::CUarray,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pArrayDescriptor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pArrayDescriptor,\n        \"cuArrayGetDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hArray, \"cuArrayGetDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuArray3DCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pHandle: *mut cuda_types::cuda::CUarray,\n    pAllocateArray: *const cuda_types::cuda::CUDA_ARRAY3D_DESCRIPTOR_v1,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pHandle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pHandle, \"cuArray3DCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pAllocateArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pAllocateArray, \"cuArray3DCreate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuArray3DGetDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pArrayDescriptor: *mut cuda_types::cuda::CUDA_ARRAY3D_DESCRIPTOR_v1,\n    hArray: cuda_types::cuda::CUarray,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pArrayDescriptor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pArrayDescriptor,\n        \"cuArray3DGetDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hArray, \"cuArray3DGetDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefSetAddress(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ByteOffset: *mut ::core::ffi::c_uint,\n    hTexRef: cuda_types::cuda::CUtexref,\n    dptr: cuda_types::cuda::CUdeviceptr_v1,\n    bytes: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ByteOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteOffset, \"cuTexRefSetAddress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefSetAddress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuTexRefSetAddress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bytes, \"cuTexRefSetAddress\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefSetAddress2D(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hTexRef: cuda_types::cuda::CUtexref,\n    desc: *const cuda_types::cuda::CUDA_ARRAY_DESCRIPTOR_v1,\n    dptr: cuda_types::cuda::CUdeviceptr_v1,\n    Pitch: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefSetAddress2D\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(desc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&desc, \"cuTexRefSetAddress2D\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuTexRefSetAddress2D\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Pitch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Pitch, \"cuTexRefSetAddress2D\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuTexRefGetAddress(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pdptr: *mut cuda_types::cuda::CUdeviceptr_v1,\n    hTexRef: cuda_types::cuda::CUtexref,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pdptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pdptr, \"cuTexRefGetAddress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hTexRef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hTexRef, \"cuTexRefGetAddress\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphicsResourceGetMappedPointer(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pDevPtr: *mut cuda_types::cuda::CUdeviceptr_v1,\n    pSize: *mut ::core::ffi::c_uint,\n    resource: cuda_types::cuda::CUgraphicsResource,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pDevPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pDevPtr,\n        \"cuGraphicsResourceGetMappedPointer\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pSize,\n        \"cuGraphicsResourceGetMappedPointer\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resource), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resource,\n        \"cuGraphicsResourceGetMappedPointer\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxDestroy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ctx: cuda_types::cuda::CUcontext,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ctx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ctx, \"cuCtxDestroy\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxPopCurrent(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pctx: *mut cuda_types::cuda::CUcontext,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pctx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pctx, \"cuCtxPopCurrent\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCtxPushCurrent(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ctx: cuda_types::cuda::CUcontext,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ctx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ctx, \"cuCtxPushCurrent\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamDestroy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamDestroy\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuEventDestroy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hEvent: cuda_types::cuda::CUevent,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hEvent), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hEvent, \"cuEventDestroy\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuEventElapsedTime(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pMilliseconds: *mut f32,\n    hStart: cuda_types::cuda::CUevent,\n    hEnd: cuda_types::cuda::CUevent,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pMilliseconds), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pMilliseconds, \"cuEventElapsedTime\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStart), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStart, \"cuEventElapsedTime\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hEnd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hEnd, \"cuEventElapsedTime\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDevicePrimaryCtxRelease(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuDevicePrimaryCtxRelease\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDevicePrimaryCtxReset(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuDevicePrimaryCtxReset\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDevicePrimaryCtxSetFlags(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dev: cuda_types::cuda::CUdevice,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuDevicePrimaryCtxSetFlags\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuDevicePrimaryCtxSetFlags\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuDeviceGetUuid(\n    writer: &mut (impl std::io::Write + ?Sized),\n    uuid: *mut cuda_types::cuda::CUuuid,\n    dev: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(uuid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uuid, \"cuDeviceGetUuid\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dev), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dev, \"cuDeviceGetUuid\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyHtoD_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    srcHost: *const ::core::ffi::c_void,\n    ByteCount: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemcpyHtoD_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcHost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcHost, \"cuMemcpyHtoD_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyHtoD_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyDtoH_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstHost: *mut ::core::ffi::c_void,\n    srcDevice: cuda_types::cuda::CUdeviceptr,\n    ByteCount: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstHost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstHost, \"cuMemcpyDtoH_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcDevice, \"cuMemcpyDtoH_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyDtoH_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyDtoD_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    srcDevice: cuda_types::cuda::CUdeviceptr,\n    ByteCount: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemcpyDtoD_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcDevice, \"cuMemcpyDtoD_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyDtoD_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyDtoA_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstArray: cuda_types::cuda::CUarray,\n    dstOffset: usize,\n    srcDevice: cuda_types::cuda::CUdeviceptr,\n    ByteCount: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstArray, \"cuMemcpyDtoA_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstOffset, \"cuMemcpyDtoA_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcDevice, \"cuMemcpyDtoA_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyDtoA_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyAtoD_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    srcArray: cuda_types::cuda::CUarray,\n    srcOffset: usize,\n    ByteCount: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemcpyAtoD_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcArray, \"cuMemcpyAtoD_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcOffset, \"cuMemcpyAtoD_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyAtoD_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyHtoA_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstArray: cuda_types::cuda::CUarray,\n    dstOffset: usize,\n    srcHost: *const ::core::ffi::c_void,\n    ByteCount: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstArray, \"cuMemcpyHtoA_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstOffset, \"cuMemcpyHtoA_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcHost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcHost, \"cuMemcpyHtoA_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyHtoA_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyAtoH_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstHost: *mut ::core::ffi::c_void,\n    srcArray: cuda_types::cuda::CUarray,\n    srcOffset: usize,\n    ByteCount: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstHost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstHost, \"cuMemcpyAtoH_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcArray, \"cuMemcpyAtoH_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcOffset, \"cuMemcpyAtoH_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyAtoH_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyAtoA_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstArray: cuda_types::cuda::CUarray,\n    dstOffset: usize,\n    srcArray: cuda_types::cuda::CUarray,\n    srcOffset: usize,\n    ByteCount: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstArray, \"cuMemcpyAtoA_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstOffset, \"cuMemcpyAtoA_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcArray, \"cuMemcpyAtoA_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcOffset, \"cuMemcpyAtoA_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyAtoA_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyHtoAAsync_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstArray: cuda_types::cuda::CUarray,\n    dstOffset: usize,\n    srcHost: *const ::core::ffi::c_void,\n    ByteCount: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstArray, \"cuMemcpyHtoAAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstOffset, \"cuMemcpyHtoAAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcHost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcHost, \"cuMemcpyHtoAAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyHtoAAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpyHtoAAsync_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyAtoHAsync_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstHost: *mut ::core::ffi::c_void,\n    srcArray: cuda_types::cuda::CUarray,\n    srcOffset: usize,\n    ByteCount: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstHost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstHost, \"cuMemcpyAtoHAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcArray, \"cuMemcpyAtoHAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcOffset, \"cuMemcpyAtoHAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyAtoHAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpyAtoHAsync_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpy2D_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pCopy: *const cuda_types::cuda::CUDA_MEMCPY2D,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pCopy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pCopy, \"cuMemcpy2D_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpy2DUnaligned_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pCopy: *const cuda_types::cuda::CUDA_MEMCPY2D,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pCopy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pCopy, \"cuMemcpy2DUnaligned_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpy3D_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pCopy: *const cuda_types::cuda::CUDA_MEMCPY3D,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pCopy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pCopy, \"cuMemcpy3D_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyHtoDAsync_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    srcHost: *const ::core::ffi::c_void,\n    ByteCount: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemcpyHtoDAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcHost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcHost, \"cuMemcpyHtoDAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyHtoDAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpyHtoDAsync_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyDtoHAsync_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstHost: *mut ::core::ffi::c_void,\n    srcDevice: cuda_types::cuda::CUdeviceptr,\n    ByteCount: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstHost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstHost, \"cuMemcpyDtoHAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcDevice, \"cuMemcpyDtoHAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyDtoHAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpyDtoHAsync_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyDtoDAsync_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    srcDevice: cuda_types::cuda::CUdeviceptr,\n    ByteCount: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemcpyDtoDAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcDevice, \"cuMemcpyDtoDAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyDtoDAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpyDtoDAsync_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpy2DAsync_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pCopy: *const cuda_types::cuda::CUDA_MEMCPY2D,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pCopy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pCopy, \"cuMemcpy2DAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpy2DAsync_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpy3DAsync_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pCopy: *const cuda_types::cuda::CUDA_MEMCPY3D,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pCopy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pCopy, \"cuMemcpy3DAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpy3DAsync_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD8_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    uc: ::core::ffi::c_uchar,\n    N: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD8_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uc, \"cuMemsetD8_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(N), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&N, \"cuMemsetD8_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD16_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    us: ::core::ffi::c_ushort,\n    N: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD16_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(us), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&us, \"cuMemsetD16_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(N), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&N, \"cuMemsetD16_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD32_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    ui: ::core::ffi::c_uint,\n    N: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD32_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ui), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ui, \"cuMemsetD32_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(N), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&N, \"cuMemsetD32_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD2D8_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    dstPitch: usize,\n    uc: ::core::ffi::c_uchar,\n    Width: usize,\n    Height: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD2D8_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstPitch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstPitch, \"cuMemsetD2D8_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uc, \"cuMemsetD2D8_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Width), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Width, \"cuMemsetD2D8_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Height), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Height, \"cuMemsetD2D8_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD2D16_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    dstPitch: usize,\n    us: ::core::ffi::c_ushort,\n    Width: usize,\n    Height: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD2D16_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstPitch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstPitch, \"cuMemsetD2D16_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(us), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&us, \"cuMemsetD2D16_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Width), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Width, \"cuMemsetD2D16_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Height), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Height, \"cuMemsetD2D16_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD2D32_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    dstPitch: usize,\n    ui: ::core::ffi::c_uint,\n    Width: usize,\n    Height: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD2D32_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstPitch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstPitch, \"cuMemsetD2D32_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ui), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ui, \"cuMemsetD2D32_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Width), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Width, \"cuMemsetD2D32_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Height), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Height, \"cuMemsetD2D32_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dst: cuda_types::cuda::CUdeviceptr,\n    src: cuda_types::cuda::CUdeviceptr,\n    ByteCount: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dst), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dst, \"cuMemcpy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(src), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&src, \"cuMemcpy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpy\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dst: cuda_types::cuda::CUdeviceptr,\n    src: cuda_types::cuda::CUdeviceptr,\n    ByteCount: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dst), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dst, \"cuMemcpyAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(src), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&src, \"cuMemcpyAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpyAsync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyPeer(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    dstContext: cuda_types::cuda::CUcontext,\n    srcDevice: cuda_types::cuda::CUdeviceptr,\n    srcContext: cuda_types::cuda::CUcontext,\n    ByteCount: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemcpyPeer\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstContext), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstContext, \"cuMemcpyPeer\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcDevice, \"cuMemcpyPeer\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcContext), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcContext, \"cuMemcpyPeer\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyPeer\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyPeerAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    dstContext: cuda_types::cuda::CUcontext,\n    srcDevice: cuda_types::cuda::CUdeviceptr,\n    srcContext: cuda_types::cuda::CUcontext,\n    ByteCount: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemcpyPeerAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstContext), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstContext, \"cuMemcpyPeerAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcDevice, \"cuMemcpyPeerAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcContext), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcContext, \"cuMemcpyPeerAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ByteCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ByteCount, \"cuMemcpyPeerAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpyPeerAsync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpy3DPeer(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pCopy: *const cuda_types::cuda::CUDA_MEMCPY3D_PEER,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pCopy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pCopy, \"cuMemcpy3DPeer\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpy3DPeerAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pCopy: *const cuda_types::cuda::CUDA_MEMCPY3D_PEER,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pCopy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pCopy, \"cuMemcpy3DPeerAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpy3DPeerAsync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyBatchAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dsts: *mut cuda_types::cuda::CUdeviceptr,\n    srcs: *mut cuda_types::cuda::CUdeviceptr,\n    sizes: *mut usize,\n    count: usize,\n    attrs: *mut cuda_types::cuda::CUmemcpyAttributes,\n    attrsIdxs: *mut usize,\n    numAttrs: usize,\n    failIdx: *mut usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dsts), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dsts, \"cuMemcpyBatchAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcs, \"cuMemcpyBatchAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&sizes, \"cuMemcpyBatchAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuMemcpyBatchAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attrs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attrs, \"cuMemcpyBatchAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attrsIdxs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attrsIdxs, \"cuMemcpyBatchAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numAttrs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numAttrs, \"cuMemcpyBatchAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(failIdx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&failIdx, \"cuMemcpyBatchAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpyBatchAsync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpy3DBatchAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    numOps: usize,\n    opList: *mut cuda_types::cuda::CUDA_MEMCPY3D_BATCH_OP,\n    failIdx: *mut usize,\n    flags: ::core::ffi::c_ulonglong,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(numOps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numOps, \"cuMemcpy3DBatchAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opList), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opList, \"cuMemcpy3DBatchAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(failIdx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&failIdx, \"cuMemcpy3DBatchAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuMemcpy3DBatchAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpy3DBatchAsync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyBatchAsync_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dsts: *mut cuda_types::cuda::CUdeviceptr,\n    srcs: *mut cuda_types::cuda::CUdeviceptr,\n    sizes: *mut usize,\n    count: usize,\n    attrs: *mut cuda_types::cuda::CUmemcpyAttributes,\n    attrsIdxs: *mut usize,\n    numAttrs: usize,\n    failIdx: *mut usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dsts), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dsts, \"cuMemcpyBatchAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcs, \"cuMemcpyBatchAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&sizes, \"cuMemcpyBatchAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuMemcpyBatchAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attrs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attrs, \"cuMemcpyBatchAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attrsIdxs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attrsIdxs, \"cuMemcpyBatchAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numAttrs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numAttrs, \"cuMemcpyBatchAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(failIdx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&failIdx, \"cuMemcpyBatchAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpyBatchAsync_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpy3DBatchAsync_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    numOps: usize,\n    opList: *mut cuda_types::cuda::CUDA_MEMCPY3D_BATCH_OP,\n    failIdx: *mut usize,\n    flags: ::core::ffi::c_ulonglong,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(numOps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numOps, \"cuMemcpy3DBatchAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opList), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opList, \"cuMemcpy3DBatchAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(failIdx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&failIdx, \"cuMemcpy3DBatchAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuMemcpy3DBatchAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpy3DBatchAsync_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpyBatchAsync_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dsts: *mut cuda_types::cuda::CUdeviceptr,\n    srcs: *mut cuda_types::cuda::CUdeviceptr,\n    sizes: *mut usize,\n    count: usize,\n    attrs: *mut cuda_types::cuda::CUmemcpyAttributes,\n    attrsIdxs: *mut usize,\n    numAttrs: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dsts), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dsts, \"cuMemcpyBatchAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcs, \"cuMemcpyBatchAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&sizes, \"cuMemcpyBatchAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuMemcpyBatchAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attrs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attrs, \"cuMemcpyBatchAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attrsIdxs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attrsIdxs, \"cuMemcpyBatchAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numAttrs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numAttrs, \"cuMemcpyBatchAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpyBatchAsync_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemcpy3DBatchAsync_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    numOps: usize,\n    opList: *mut cuda_types::cuda::CUDA_MEMCPY3D_BATCH_OP,\n    flags: ::core::ffi::c_ulonglong,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(numOps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numOps, \"cuMemcpy3DBatchAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opList), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opList, \"cuMemcpy3DBatchAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuMemcpy3DBatchAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemcpy3DBatchAsync_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD8Async(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    uc: ::core::ffi::c_uchar,\n    N: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD8Async\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uc, \"cuMemsetD8Async\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(N), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&N, \"cuMemsetD8Async\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemsetD8Async\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD16Async(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    us: ::core::ffi::c_ushort,\n    N: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD16Async\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(us), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&us, \"cuMemsetD16Async\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(N), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&N, \"cuMemsetD16Async\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemsetD16Async\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD32Async(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    ui: ::core::ffi::c_uint,\n    N: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD32Async\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ui), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ui, \"cuMemsetD32Async\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(N), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&N, \"cuMemsetD32Async\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemsetD32Async\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD2D8Async(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    dstPitch: usize,\n    uc: ::core::ffi::c_uchar,\n    Width: usize,\n    Height: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD2D8Async\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstPitch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstPitch, \"cuMemsetD2D8Async\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uc, \"cuMemsetD2D8Async\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Width), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Width, \"cuMemsetD2D8Async\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Height), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Height, \"cuMemsetD2D8Async\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemsetD2D8Async\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD2D16Async(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    dstPitch: usize,\n    us: ::core::ffi::c_ushort,\n    Width: usize,\n    Height: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD2D16Async\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstPitch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstPitch, \"cuMemsetD2D16Async\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(us), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&us, \"cuMemsetD2D16Async\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Width), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Width, \"cuMemsetD2D16Async\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Height), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Height, \"cuMemsetD2D16Async\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemsetD2D16Async\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemsetD2D32Async(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstDevice: cuda_types::cuda::CUdeviceptr,\n    dstPitch: usize,\n    ui: ::core::ffi::c_uint,\n    Width: usize,\n    Height: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemsetD2D32Async\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstPitch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstPitch, \"cuMemsetD2D32Async\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ui), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ui, \"cuMemsetD2D32Async\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Width), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Width, \"cuMemsetD2D32Async\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Height), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Height, \"cuMemsetD2D32Async\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemsetD2D32Async\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamGetPriority(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    priority: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamGetPriority\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(priority), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&priority, \"cuStreamGetPriority\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamGetId(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    streamId: *mut ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamGetId\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(streamId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&streamId, \"cuStreamGetId\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamGetFlags(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    flags: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamGetFlags\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuStreamGetFlags\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamGetDevice(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    device: *mut cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamGetDevice\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"cuStreamGetDevice\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamGetCtx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    pctx: *mut cuda_types::cuda::CUcontext,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamGetCtx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pctx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pctx, \"cuStreamGetCtx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamGetCtx_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    pCtx: *mut cuda_types::cuda::CUcontext,\n    pGreenCtx: *mut cuda_types::cuda::CUgreenCtx,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamGetCtx_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pCtx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pCtx, \"cuStreamGetCtx_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pGreenCtx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pGreenCtx, \"cuStreamGetCtx_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamWaitEvent(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    hEvent: cuda_types::cuda::CUevent,\n    Flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamWaitEvent\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hEvent), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hEvent, \"cuStreamWaitEvent\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Flags, \"cuStreamWaitEvent\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamAddCallback(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    callback: cuda_types::cuda::CUstreamCallback,\n    userData: *mut ::core::ffi::c_void,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamAddCallback\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(callback), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&callback, \"cuStreamAddCallback\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(userData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&userData, \"cuStreamAddCallback\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuStreamAddCallback\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamAttachMemAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    dptr: cuda_types::cuda::CUdeviceptr,\n    length: usize,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamAttachMemAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuStreamAttachMemAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(length), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&length, \"cuStreamAttachMemAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuStreamAttachMemAsync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamQuery(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamQuery\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamSynchronize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamSynchronize\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuEventRecord(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hEvent: cuda_types::cuda::CUevent,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hEvent), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hEvent, \"cuEventRecord\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuEventRecord\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuEventRecordWithFlags(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hEvent: cuda_types::cuda::CUevent,\n    hStream: cuda_types::cuda::CUstream,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hEvent), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hEvent, \"cuEventRecordWithFlags\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuEventRecordWithFlags\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuEventRecordWithFlags\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLaunchKernel(\n    writer: &mut (impl std::io::Write + ?Sized),\n    f: cuda_types::cuda::CUfunction,\n    gridDimX: ::core::ffi::c_uint,\n    gridDimY: ::core::ffi::c_uint,\n    gridDimZ: ::core::ffi::c_uint,\n    blockDimX: ::core::ffi::c_uint,\n    blockDimY: ::core::ffi::c_uint,\n    blockDimZ: ::core::ffi::c_uint,\n    sharedMemBytes: ::core::ffi::c_uint,\n    hStream: cuda_types::cuda::CUstream,\n    kernelParams: *mut *mut ::core::ffi::c_void,\n    extra: *mut *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(f), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&f, \"cuLaunchKernel\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gridDimX), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&gridDimX, \"cuLaunchKernel\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gridDimY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&gridDimY, \"cuLaunchKernel\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gridDimZ), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&gridDimZ, \"cuLaunchKernel\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDimX), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDimX, \"cuLaunchKernel\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDimY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDimY, \"cuLaunchKernel\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDimZ), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDimZ, \"cuLaunchKernel\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sharedMemBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&sharedMemBytes, \"cuLaunchKernel\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuLaunchKernel\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kernelParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kernelParams, \"cuLaunchKernel\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(extra), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&extra, \"cuLaunchKernel\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLaunchKernelEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    config: *const cuda_types::cuda::CUlaunchConfig,\n    f: cuda_types::cuda::CUfunction,\n    kernelParams: *mut *mut ::core::ffi::c_void,\n    extra: *mut *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(config), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&config, \"cuLaunchKernelEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(f), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&f, \"cuLaunchKernelEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kernelParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kernelParams, \"cuLaunchKernelEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(extra), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&extra, \"cuLaunchKernelEx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLaunchHostFunc(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    fn_: cuda_types::cuda::CUhostFn,\n    userData: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuLaunchHostFunc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fn_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fn_, \"cuLaunchHostFunc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(userData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&userData, \"cuLaunchHostFunc\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphicsMapResources(\n    writer: &mut (impl std::io::Write + ?Sized),\n    count: ::core::ffi::c_uint,\n    resources: *mut cuda_types::cuda::CUgraphicsResource,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuGraphicsMapResources\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resources), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&resources, \"cuGraphicsMapResources\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuGraphicsMapResources\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphicsUnmapResources(\n    writer: &mut (impl std::io::Write + ?Sized),\n    count: ::core::ffi::c_uint,\n    resources: *mut cuda_types::cuda::CUgraphicsResource,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuGraphicsUnmapResources\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resources), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&resources, \"cuGraphicsUnmapResources\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuGraphicsUnmapResources\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamWriteValue32(\n    writer: &mut (impl std::io::Write + ?Sized),\n    stream: cuda_types::cuda::CUstream,\n    addr: cuda_types::cuda::CUdeviceptr,\n    value: cuda_types::cuda::cuuint32_t,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cuStreamWriteValue32\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(addr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&addr, \"cuStreamWriteValue32\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuStreamWriteValue32\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuStreamWriteValue32\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamWaitValue32(\n    writer: &mut (impl std::io::Write + ?Sized),\n    stream: cuda_types::cuda::CUstream,\n    addr: cuda_types::cuda::CUdeviceptr,\n    value: cuda_types::cuda::cuuint32_t,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cuStreamWaitValue32\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(addr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&addr, \"cuStreamWaitValue32\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuStreamWaitValue32\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuStreamWaitValue32\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamWriteValue64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    stream: cuda_types::cuda::CUstream,\n    addr: cuda_types::cuda::CUdeviceptr,\n    value: cuda_types::cuda::cuuint64_t,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cuStreamWriteValue64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(addr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&addr, \"cuStreamWriteValue64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuStreamWriteValue64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuStreamWriteValue64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamWaitValue64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    stream: cuda_types::cuda::CUstream,\n    addr: cuda_types::cuda::CUdeviceptr,\n    value: cuda_types::cuda::cuuint64_t,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cuStreamWaitValue64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(addr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&addr, \"cuStreamWaitValue64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuStreamWaitValue64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuStreamWaitValue64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamBatchMemOp(\n    writer: &mut (impl std::io::Write + ?Sized),\n    stream: cuda_types::cuda::CUstream,\n    count: ::core::ffi::c_uint,\n    paramArray: *mut cuda_types::cuda::CUstreamBatchMemOpParams,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cuStreamBatchMemOp\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuStreamBatchMemOp\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paramArray), \": \").as_bytes())?;\n    writer.write_all(b\"[\")?;\n    for i in 0..count {\n        if i != 0 {\n            writer.write_all(b\", \")?;\n        }\n        crate::CudaDisplay::write(\n            unsafe { &*paramArray.add(i as usize) },\n            \"cuStreamBatchMemOp\",\n            arg_idx,\n            writer,\n        )?;\n    }\n    writer.write_all(b\"]\")?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuStreamBatchMemOp\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamWriteValue32_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    stream: cuda_types::cuda::CUstream,\n    addr: cuda_types::cuda::CUdeviceptr,\n    value: cuda_types::cuda::cuuint32_t,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cuStreamWriteValue32_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(addr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&addr, \"cuStreamWriteValue32_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuStreamWriteValue32_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuStreamWriteValue32_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamWaitValue32_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    stream: cuda_types::cuda::CUstream,\n    addr: cuda_types::cuda::CUdeviceptr,\n    value: cuda_types::cuda::cuuint32_t,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cuStreamWaitValue32_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(addr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&addr, \"cuStreamWaitValue32_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuStreamWaitValue32_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuStreamWaitValue32_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamWriteValue64_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    stream: cuda_types::cuda::CUstream,\n    addr: cuda_types::cuda::CUdeviceptr,\n    value: cuda_types::cuda::cuuint64_t,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cuStreamWriteValue64_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(addr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&addr, \"cuStreamWriteValue64_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuStreamWriteValue64_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuStreamWriteValue64_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamWaitValue64_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    stream: cuda_types::cuda::CUstream,\n    addr: cuda_types::cuda::CUdeviceptr,\n    value: cuda_types::cuda::cuuint64_t,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cuStreamWaitValue64_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(addr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&addr, \"cuStreamWaitValue64_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuStreamWaitValue64_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuStreamWaitValue64_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamBatchMemOp_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    stream: cuda_types::cuda::CUstream,\n    count: ::core::ffi::c_uint,\n    paramArray: *mut cuda_types::cuda::CUstreamBatchMemOpParams,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cuStreamBatchMemOp_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuStreamBatchMemOp_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paramArray), \": \").as_bytes())?;\n    writer.write_all(b\"[\")?;\n    for i in 0..count {\n        if i != 0 {\n            writer.write_all(b\", \")?;\n        }\n        crate::CudaDisplay::write(\n            unsafe { &*paramArray.add(i as usize) },\n            \"cuStreamBatchMemOp_ptsz\",\n            arg_idx,\n            writer,\n        )?;\n    }\n    writer.write_all(b\"]\")?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuStreamBatchMemOp_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamWriteValue32_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    stream: cuda_types::cuda::CUstream,\n    addr: cuda_types::cuda::CUdeviceptr,\n    value: cuda_types::cuda::cuuint32_t,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cuStreamWriteValue32_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(addr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&addr, \"cuStreamWriteValue32_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuStreamWriteValue32_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuStreamWriteValue32_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamWaitValue32_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    stream: cuda_types::cuda::CUstream,\n    addr: cuda_types::cuda::CUdeviceptr,\n    value: cuda_types::cuda::cuuint32_t,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cuStreamWaitValue32_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(addr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&addr, \"cuStreamWaitValue32_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuStreamWaitValue32_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuStreamWaitValue32_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamWriteValue64_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    stream: cuda_types::cuda::CUstream,\n    addr: cuda_types::cuda::CUdeviceptr,\n    value: cuda_types::cuda::cuuint64_t,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cuStreamWriteValue64_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(addr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&addr, \"cuStreamWriteValue64_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuStreamWriteValue64_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuStreamWriteValue64_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamWaitValue64_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    stream: cuda_types::cuda::CUstream,\n    addr: cuda_types::cuda::CUdeviceptr,\n    value: cuda_types::cuda::cuuint64_t,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cuStreamWaitValue64_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(addr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&addr, \"cuStreamWaitValue64_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cuStreamWaitValue64_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuStreamWaitValue64_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamBatchMemOp_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    stream: cuda_types::cuda::CUstream,\n    count: ::core::ffi::c_uint,\n    paramArray: *mut cuda_types::cuda::CUstreamBatchMemOpParams,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cuStreamBatchMemOp_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuStreamBatchMemOp_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paramArray), \": \").as_bytes())?;\n    writer.write_all(b\"[\")?;\n    for i in 0..count {\n        if i != 0 {\n            writer.write_all(b\", \")?;\n        }\n        crate::CudaDisplay::write(\n            unsafe { &*paramArray.add(i as usize) },\n            \"cuStreamBatchMemOp_v2\",\n            arg_idx,\n            writer,\n        )?;\n    }\n    writer.write_all(b\"]\")?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuStreamBatchMemOp_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemPrefetchAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    devPtr: cuda_types::cuda::CUdeviceptr,\n    count: usize,\n    dstDevice: cuda_types::cuda::CUdevice,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(devPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&devPtr, \"cuMemPrefetchAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuMemPrefetchAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemPrefetchAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemPrefetchAsync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemPrefetchAsync_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    devPtr: cuda_types::cuda::CUdeviceptr,\n    count: usize,\n    dstDevice: cuda_types::cuda::CUdevice,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(devPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&devPtr, \"cuMemPrefetchAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuMemPrefetchAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstDevice, \"cuMemPrefetchAsync_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemPrefetchAsync_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemPrefetchAsync_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    devPtr: cuda_types::cuda::CUdeviceptr,\n    count: usize,\n    location: cuda_types::cuda::CUmemLocation,\n    flags: ::core::ffi::c_uint,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(devPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&devPtr, \"cuMemPrefetchAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuMemPrefetchAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(location), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&location, \"cuMemPrefetchAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuMemPrefetchAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemPrefetchAsync_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemAdvise(\n    writer: &mut (impl std::io::Write + ?Sized),\n    devPtr: cuda_types::cuda::CUdeviceptr,\n    count: usize,\n    advice: cuda_types::cuda::CUmem_advise,\n    device: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(devPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&devPtr, \"cuMemAdvise\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuMemAdvise\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(advice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&advice, \"cuMemAdvise\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"cuMemAdvise\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemPrefetchBatchAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptrs: *mut cuda_types::cuda::CUdeviceptr,\n    sizes: *mut usize,\n    count: usize,\n    prefetchLocs: *mut cuda_types::cuda::CUmemLocation,\n    prefetchLocIdxs: *mut usize,\n    numPrefetchLocs: usize,\n    flags: ::core::ffi::c_ulonglong,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptrs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptrs, \"cuMemPrefetchBatchAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&sizes, \"cuMemPrefetchBatchAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuMemPrefetchBatchAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(prefetchLocs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &prefetchLocs,\n        \"cuMemPrefetchBatchAsync\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(prefetchLocIdxs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &prefetchLocIdxs,\n        \"cuMemPrefetchBatchAsync\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numPrefetchLocs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numPrefetchLocs,\n        \"cuMemPrefetchBatchAsync\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuMemPrefetchBatchAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemPrefetchBatchAsync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemDiscardBatchAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptrs: *mut cuda_types::cuda::CUdeviceptr,\n    sizes: *mut usize,\n    count: usize,\n    flags: ::core::ffi::c_ulonglong,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptrs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptrs, \"cuMemDiscardBatchAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&sizes, \"cuMemDiscardBatchAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuMemDiscardBatchAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuMemDiscardBatchAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemDiscardBatchAsync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemDiscardAndPrefetchBatchAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptrs: *mut cuda_types::cuda::CUdeviceptr,\n    sizes: *mut usize,\n    count: usize,\n    prefetchLocs: *mut cuda_types::cuda::CUmemLocation,\n    prefetchLocIdxs: *mut usize,\n    numPrefetchLocs: usize,\n    flags: ::core::ffi::c_ulonglong,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptrs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dptrs,\n        \"cuMemDiscardAndPrefetchBatchAsync\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizes,\n        \"cuMemDiscardAndPrefetchBatchAsync\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &count,\n        \"cuMemDiscardAndPrefetchBatchAsync\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(prefetchLocs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &prefetchLocs,\n        \"cuMemDiscardAndPrefetchBatchAsync\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(prefetchLocIdxs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &prefetchLocIdxs,\n        \"cuMemDiscardAndPrefetchBatchAsync\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numPrefetchLocs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numPrefetchLocs,\n        \"cuMemDiscardAndPrefetchBatchAsync\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &flags,\n        \"cuMemDiscardAndPrefetchBatchAsync\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hStream,\n        \"cuMemDiscardAndPrefetchBatchAsync\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuLaunchCooperativeKernel(\n    writer: &mut (impl std::io::Write + ?Sized),\n    f: cuda_types::cuda::CUfunction,\n    gridDimX: ::core::ffi::c_uint,\n    gridDimY: ::core::ffi::c_uint,\n    gridDimZ: ::core::ffi::c_uint,\n    blockDimX: ::core::ffi::c_uint,\n    blockDimY: ::core::ffi::c_uint,\n    blockDimZ: ::core::ffi::c_uint,\n    sharedMemBytes: ::core::ffi::c_uint,\n    hStream: cuda_types::cuda::CUstream,\n    kernelParams: *mut *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(f), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&f, \"cuLaunchCooperativeKernel\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gridDimX), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&gridDimX, \"cuLaunchCooperativeKernel\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gridDimY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&gridDimY, \"cuLaunchCooperativeKernel\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gridDimZ), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&gridDimZ, \"cuLaunchCooperativeKernel\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDimX), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDimX, \"cuLaunchCooperativeKernel\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDimY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDimY, \"cuLaunchCooperativeKernel\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDimZ), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDimZ, \"cuLaunchCooperativeKernel\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sharedMemBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sharedMemBytes,\n        \"cuLaunchCooperativeKernel\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuLaunchCooperativeKernel\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kernelParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &kernelParams,\n        \"cuLaunchCooperativeKernel\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuSignalExternalSemaphoresAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    extSemArray: *const cuda_types::cuda::CUexternalSemaphore,\n    paramsArray: *const cuda_types::cuda::CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS,\n    numExtSems: ::core::ffi::c_uint,\n    stream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(extSemArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &extSemArray,\n        \"cuSignalExternalSemaphoresAsync\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paramsArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paramsArray,\n        \"cuSignalExternalSemaphoresAsync\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numExtSems), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numExtSems,\n        \"cuSignalExternalSemaphoresAsync\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stream,\n        \"cuSignalExternalSemaphoresAsync\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuWaitExternalSemaphoresAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    extSemArray: *const cuda_types::cuda::CUexternalSemaphore,\n    paramsArray: *const cuda_types::cuda::CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS,\n    numExtSems: ::core::ffi::c_uint,\n    stream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(extSemArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &extSemArray,\n        \"cuWaitExternalSemaphoresAsync\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paramsArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paramsArray,\n        \"cuWaitExternalSemaphoresAsync\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numExtSems), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numExtSems,\n        \"cuWaitExternalSemaphoresAsync\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stream,\n        \"cuWaitExternalSemaphoresAsync\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamBeginCapture(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamBeginCapture\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamBeginCapture_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamBeginCapture_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamBeginCapture_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    mode: cuda_types::cuda::CUstreamCaptureMode,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamBeginCapture_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cuStreamBeginCapture_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamBeginCaptureToGraph(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    hGraph: cuda_types::cuda::CUgraph,\n    dependencies: *const cuda_types::cuda::CUgraphNode,\n    dependencyData: *const cuda_types::cuda::CUgraphEdgeData,\n    numDependencies: usize,\n    mode: cuda_types::cuda::CUstreamCaptureMode,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamBeginCaptureToGraph\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuStreamBeginCaptureToGraph\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dependencies,\n        \"cuStreamBeginCaptureToGraph\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencyData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dependencyData,\n        \"cuStreamBeginCaptureToGraph\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependencies,\n        \"cuStreamBeginCaptureToGraph\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cuStreamBeginCaptureToGraph\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamEndCapture(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    phGraph: *mut cuda_types::cuda::CUgraph,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamEndCapture\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(phGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phGraph, \"cuStreamEndCapture\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamIsCapturing(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    captureStatus: *mut cuda_types::cuda::CUstreamCaptureStatus,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamIsCapturing\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(captureStatus), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&captureStatus, \"cuStreamIsCapturing\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamGetCaptureInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    captureStatus_out: *mut cuda_types::cuda::CUstreamCaptureStatus,\n    id_out: *mut cuda_types::cuda::cuuint64_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamGetCaptureInfo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(captureStatus_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &captureStatus_out,\n        \"cuStreamGetCaptureInfo\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(id_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&id_out, \"cuStreamGetCaptureInfo\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamGetCaptureInfo_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    captureStatus_out: *mut cuda_types::cuda::CUstreamCaptureStatus,\n    id_out: *mut cuda_types::cuda::cuuint64_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamGetCaptureInfo_ptsz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(captureStatus_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &captureStatus_out,\n        \"cuStreamGetCaptureInfo_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(id_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&id_out, \"cuStreamGetCaptureInfo_ptsz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamGetCaptureInfo_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    captureStatus_out: *mut cuda_types::cuda::CUstreamCaptureStatus,\n    id_out: *mut cuda_types::cuda::cuuint64_t,\n    graph_out: *mut cuda_types::cuda::CUgraph,\n    dependencies_out: *mut *const cuda_types::cuda::CUgraphNode,\n    numDependencies_out: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamGetCaptureInfo_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(captureStatus_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &captureStatus_out,\n        \"cuStreamGetCaptureInfo_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(id_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&id_out, \"cuStreamGetCaptureInfo_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(graph_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&graph_out, \"cuStreamGetCaptureInfo_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencies_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dependencies_out,\n        \"cuStreamGetCaptureInfo_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependencies_out,\n        \"cuStreamGetCaptureInfo_v2\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamGetCaptureInfo_v2_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    captureStatus_out: *mut cuda_types::cuda::CUstreamCaptureStatus,\n    id_out: *mut cuda_types::cuda::cuuint64_t,\n    graph_out: *mut cuda_types::cuda::CUgraph,\n    dependencies_out: *mut *const cuda_types::cuda::CUgraphNode,\n    numDependencies_out: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hStream,\n        \"cuStreamGetCaptureInfo_v2_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(captureStatus_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &captureStatus_out,\n        \"cuStreamGetCaptureInfo_v2_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(id_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &id_out,\n        \"cuStreamGetCaptureInfo_v2_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(graph_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &graph_out,\n        \"cuStreamGetCaptureInfo_v2_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencies_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dependencies_out,\n        \"cuStreamGetCaptureInfo_v2_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependencies_out,\n        \"cuStreamGetCaptureInfo_v2_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamGetCaptureInfo_v3(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    captureStatus_out: *mut cuda_types::cuda::CUstreamCaptureStatus,\n    id_out: *mut cuda_types::cuda::cuuint64_t,\n    graph_out: *mut cuda_types::cuda::CUgraph,\n    dependencies_out: *mut *const cuda_types::cuda::CUgraphNode,\n    edgeData_out: *mut *const cuda_types::cuda::CUgraphEdgeData,\n    numDependencies_out: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuStreamGetCaptureInfo_v3\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(captureStatus_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &captureStatus_out,\n        \"cuStreamGetCaptureInfo_v3\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(id_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&id_out, \"cuStreamGetCaptureInfo_v3\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(graph_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&graph_out, \"cuStreamGetCaptureInfo_v3\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencies_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dependencies_out,\n        \"cuStreamGetCaptureInfo_v3\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(edgeData_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &edgeData_out,\n        \"cuStreamGetCaptureInfo_v3\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependencies_out,\n        \"cuStreamGetCaptureInfo_v3\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphAddKernelNode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n    hGraph: cuda_types::cuda::CUgraph,\n    dependencies: *const cuda_types::cuda::CUgraphNode,\n    numDependencies: usize,\n    nodeParams: *const cuda_types::cuda::CUDA_KERNEL_NODE_PARAMS_v1,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phGraphNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phGraphNode, \"cuGraphAddKernelNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphAddKernelNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dependencies, \"cuGraphAddKernelNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependencies,\n        \"cuGraphAddKernelNode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nodeParams, \"cuGraphAddKernelNode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphKernelNodeGetParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    nodeParams: *mut cuda_types::cuda::CUDA_KERNEL_NODE_PARAMS_v1,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hNode, \"cuGraphKernelNodeGetParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nodeParams,\n        \"cuGraphKernelNodeGetParams\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphKernelNodeSetParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    nodeParams: *const cuda_types::cuda::CUDA_KERNEL_NODE_PARAMS_v1,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hNode, \"cuGraphKernelNodeSetParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nodeParams,\n        \"cuGraphKernelNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphExecKernelNodeSetParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraphExec: cuda_types::cuda::CUgraphExec,\n    hNode: cuda_types::cuda::CUgraphNode,\n    nodeParams: *const cuda_types::cuda::CUDA_KERNEL_NODE_PARAMS_v1,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraphExec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hGraphExec,\n        \"cuGraphExecKernelNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hNode,\n        \"cuGraphExecKernelNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nodeParams,\n        \"cuGraphExecKernelNodeSetParams\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphInstantiateWithParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phGraphExec: *mut cuda_types::cuda::CUgraphExec,\n    hGraph: cuda_types::cuda::CUgraph,\n    instantiateParams: *mut cuda_types::cuda::CUDA_GRAPH_INSTANTIATE_PARAMS,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phGraphExec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &phGraphExec,\n        \"cuGraphInstantiateWithParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphInstantiateWithParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(instantiateParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &instantiateParams,\n        \"cuGraphInstantiateWithParams\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphExecUpdate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraphExec: cuda_types::cuda::CUgraphExec,\n    hGraph: cuda_types::cuda::CUgraph,\n    hErrorNode_out: *mut cuda_types::cuda::CUgraphNode,\n    updateResult_out: *mut cuda_types::cuda::CUgraphExecUpdateResult,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraphExec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraphExec, \"cuGraphExecUpdate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphExecUpdate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hErrorNode_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hErrorNode_out, \"cuGraphExecUpdate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(updateResult_out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&updateResult_out, \"cuGraphExecUpdate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphUpload(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraph: cuda_types::cuda::CUgraphExec,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphUpload\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuGraphUpload\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphLaunch(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraph: cuda_types::cuda::CUgraphExec,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphLaunch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuGraphLaunch\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphGetEdges(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraph: cuda_types::cuda::CUgraph,\n    from: *mut cuda_types::cuda::CUgraphNode,\n    to: *mut cuda_types::cuda::CUgraphNode,\n    numEdges: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphGetEdges\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(from), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&from, \"cuGraphGetEdges\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(to), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&to, \"cuGraphGetEdges\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numEdges), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numEdges, \"cuGraphGetEdges\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphNodeGetDependencies(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    dependencies: *mut cuda_types::cuda::CUgraphNode,\n    numDependencies: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hNode, \"cuGraphNodeGetDependencies\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dependencies,\n        \"cuGraphNodeGetDependencies\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependencies,\n        \"cuGraphNodeGetDependencies\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphNodeGetDependentNodes(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: cuda_types::cuda::CUgraphNode,\n    dependentNodes: *mut cuda_types::cuda::CUgraphNode,\n    numDependentNodes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hNode, \"cuGraphNodeGetDependentNodes\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependentNodes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dependentNodes,\n        \"cuGraphNodeGetDependentNodes\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependentNodes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependentNodes,\n        \"cuGraphNodeGetDependentNodes\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphAddDependencies(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraph: cuda_types::cuda::CUgraph,\n    from: *const cuda_types::cuda::CUgraphNode,\n    to: *const cuda_types::cuda::CUgraphNode,\n    numDependencies: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphAddDependencies\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(from), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&from, \"cuGraphAddDependencies\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(to), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&to, \"cuGraphAddDependencies\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependencies,\n        \"cuGraphAddDependencies\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphRemoveDependencies(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hGraph: cuda_types::cuda::CUgraph,\n    from: *const cuda_types::cuda::CUgraphNode,\n    to: *const cuda_types::cuda::CUgraphNode,\n    numDependencies: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphRemoveDependencies\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(from), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&from, \"cuGraphRemoveDependencies\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(to), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&to, \"cuGraphRemoveDependencies\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependencies,\n        \"cuGraphRemoveDependencies\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphAddNode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phGraphNode: *mut cuda_types::cuda::CUgraphNode,\n    hGraph: cuda_types::cuda::CUgraph,\n    dependencies: *const cuda_types::cuda::CUgraphNode,\n    numDependencies: usize,\n    nodeParams: *mut cuda_types::cuda::CUgraphNodeParams,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phGraphNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phGraphNode, \"cuGraphAddNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphAddNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dependencies, \"cuGraphAddNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numDependencies, \"cuGraphAddNode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeParams), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nodeParams, \"cuGraphAddNode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamCopyAttributes(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dstStream: cuda_types::cuda::CUstream,\n    srcStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dstStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstStream, \"cuStreamCopyAttributes\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcStream, \"cuStreamCopyAttributes\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuIpcOpenMemHandle(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pdptr: *mut cuda_types::cuda::CUdeviceptr,\n    handle: cuda_types::cuda::CUipcMemHandle,\n    Flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pdptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pdptr, \"cuIpcOpenMemHandle\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cuIpcOpenMemHandle\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Flags, \"cuIpcOpenMemHandle\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphInstantiate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phGraphExec: *mut cuda_types::cuda::CUgraphExec,\n    hGraph: cuda_types::cuda::CUgraph,\n    phErrorNode: *mut cuda_types::cuda::CUgraphNode,\n    logBuffer: *mut ::core::ffi::c_char,\n    bufferSize: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phGraphExec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phGraphExec, \"cuGraphInstantiate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphInstantiate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(phErrorNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phErrorNode, \"cuGraphInstantiate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(logBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&logBuffer, \"cuGraphInstantiate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bufferSize, \"cuGraphInstantiate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphInstantiate_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phGraphExec: *mut cuda_types::cuda::CUgraphExec,\n    hGraph: cuda_types::cuda::CUgraph,\n    phErrorNode: *mut cuda_types::cuda::CUgraphNode,\n    logBuffer: *mut ::core::ffi::c_char,\n    bufferSize: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phGraphExec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phGraphExec, \"cuGraphInstantiate_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hGraph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hGraph, \"cuGraphInstantiate_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(phErrorNode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phErrorNode, \"cuGraphInstantiate_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(logBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&logBuffer, \"cuGraphInstantiate_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bufferSize, \"cuGraphInstantiate_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemMapArrayAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    mapInfoList: *mut cuda_types::cuda::CUarrayMapInfo,\n    count: ::core::ffi::c_uint,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(mapInfoList), \": \").as_bytes())?;\n    writer.write_all(b\"[\")?;\n    for i in 0..count {\n        if i != 0 {\n            writer.write_all(b\", \")?;\n        }\n        crate::CudaDisplay::write(\n            unsafe { &*mapInfoList.add(i as usize) },\n            \"cuMemMapArrayAsync\",\n            arg_idx,\n            writer,\n        )?;\n    }\n    writer.write_all(b\"]\")?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuMemMapArrayAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemMapArrayAsync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemFreeAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptr: cuda_types::cuda::CUdeviceptr,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuMemFreeAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemFreeAsync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemAllocAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptr: *mut cuda_types::cuda::CUdeviceptr,\n    bytesize: usize,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuMemAllocAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bytesize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bytesize, \"cuMemAllocAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemAllocAsync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemAllocFromPoolAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptr: *mut cuda_types::cuda::CUdeviceptr,\n    bytesize: usize,\n    pool: cuda_types::cuda::CUmemoryPool,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuMemAllocFromPoolAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bytesize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bytesize, \"cuMemAllocFromPoolAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pool), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pool, \"cuMemAllocFromPoolAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuMemAllocFromPoolAsync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamUpdateCaptureDependencies(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    dependencies: *mut cuda_types::cuda::CUgraphNode,\n    numDependencies: usize,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hStream,\n        \"cuStreamUpdateCaptureDependencies\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dependencies,\n        \"cuStreamUpdateCaptureDependencies\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependencies,\n        \"cuStreamUpdateCaptureDependencies\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &flags,\n        \"cuStreamUpdateCaptureDependencies\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamUpdateCaptureDependencies_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    dependencies: *mut cuda_types::cuda::CUgraphNode,\n    numDependencies: usize,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hStream,\n        \"cuStreamUpdateCaptureDependencies_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dependencies,\n        \"cuStreamUpdateCaptureDependencies_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependencies,\n        \"cuStreamUpdateCaptureDependencies_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &flags,\n        \"cuStreamUpdateCaptureDependencies_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuStreamUpdateCaptureDependencies_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: cuda_types::cuda::CUstream,\n    dependencies: *mut cuda_types::cuda::CUgraphNode,\n    dependencyData: *const cuda_types::cuda::CUgraphEdgeData,\n    numDependencies: usize,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hStream,\n        \"cuStreamUpdateCaptureDependencies_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dependencies,\n        \"cuStreamUpdateCaptureDependencies_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dependencyData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dependencyData,\n        \"cuStreamUpdateCaptureDependencies_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDependencies), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDependencies,\n        \"cuStreamUpdateCaptureDependencies_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &flags,\n        \"cuStreamUpdateCaptureDependencies_v2\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuMemBatchDecompressAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    paramsArray: *mut cuda_types::cuda::CUmemDecompressParams,\n    count: usize,\n    flags: ::core::ffi::c_uint,\n    errorIndex: *mut usize,\n    stream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(paramsArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paramsArray,\n        \"cuMemBatchDecompressAsync\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"cuMemBatchDecompressAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuMemBatchDecompressAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(errorIndex), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &errorIndex,\n        \"cuMemBatchDecompressAsync\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cuMemBatchDecompressAsync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGetProcAddress(\n    writer: &mut (impl std::io::Write + ?Sized),\n    symbol: *const ::core::ffi::c_char,\n    pfn: *mut *mut ::core::ffi::c_void,\n    cudaVersion: ::core::ffi::c_int,\n    flags: cuda_types::cuda::cuuint64_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(symbol), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&symbol, \"cuGetProcAddress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pfn), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pfn, \"cuGetProcAddress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cudaVersion), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cudaVersion, \"cuGetProcAddress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuGetProcAddress\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCheckpointProcessGetRestoreThreadId(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pid: ::core::ffi::c_int,\n    tid: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pid,\n        \"cuCheckpointProcessGetRestoreThreadId\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(tid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &tid,\n        \"cuCheckpointProcessGetRestoreThreadId\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCheckpointProcessGetState(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pid: ::core::ffi::c_int,\n    state: *mut cuda_types::cuda::CUprocessState,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pid, \"cuCheckpointProcessGetState\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(state), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&state, \"cuCheckpointProcessGetState\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCheckpointProcessLock(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pid: ::core::ffi::c_int,\n    args: *mut cuda_types::cuda::CUcheckpointLockArgs,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pid, \"cuCheckpointProcessLock\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(args), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&args, \"cuCheckpointProcessLock\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCheckpointProcessCheckpoint(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pid: ::core::ffi::c_int,\n    args: *mut cuda_types::cuda::CUcheckpointCheckpointArgs,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pid, \"cuCheckpointProcessCheckpoint\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(args), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&args, \"cuCheckpointProcessCheckpoint\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCheckpointProcessRestore(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pid: ::core::ffi::c_int,\n    args: *mut cuda_types::cuda::CUcheckpointRestoreArgs,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pid, \"cuCheckpointProcessRestore\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(args), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&args, \"cuCheckpointProcessRestore\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuCheckpointProcessUnlock(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pid: ::core::ffi::c_int,\n    args: *mut cuda_types::cuda::CUcheckpointUnlockArgs,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pid, \"cuCheckpointProcessUnlock\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(args), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&args, \"cuCheckpointProcessUnlock\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUoutput_mode_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUoutput_mode_enum::CU_OUT_KEY_VALUE_PAIR => {\n                writer.write_all(stringify!(CU_OUT_KEY_VALUE_PAIR).as_bytes())\n            }\n            &cuda_types::cuda::CUoutput_mode_enum::CU_OUT_CSV => {\n                writer.write_all(stringify!(CU_OUT_CSV).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cuProfilerInitialize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    configFile: *const ::core::ffi::c_char,\n    outputFile: *const ::core::ffi::c_char,\n    outputMode: cuda_types::cuda::CUoutput_mode,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(configFile), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&configFile, \"cuProfilerInitialize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(outputFile), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&outputFile, \"cuProfilerInitialize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(outputMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&outputMode, \"cuProfilerInitialize\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuProfilerStart(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_cuProfilerStop(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_cuGraphicsGLRegisterBuffer(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pCudaResource: *mut cuda_types::cuda::CUgraphicsResource,\n    buffer: cuda_types::cuda::GLuint,\n    Flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pCudaResource), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pCudaResource,\n        \"cuGraphicsGLRegisterBuffer\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(buffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&buffer, \"cuGraphicsGLRegisterBuffer\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Flags, \"cuGraphicsGLRegisterBuffer\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphicsGLRegisterImage(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pCudaResource: *mut cuda_types::cuda::CUgraphicsResource,\n    image: cuda_types::cuda::GLuint,\n    target: cuda_types::cuda::GLenum,\n    Flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pCudaResource), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pCudaResource,\n        \"cuGraphicsGLRegisterImage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(image), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&image, \"cuGraphicsGLRegisterImage\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(target), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&target, \"cuGraphicsGLRegisterImage\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Flags, \"cuGraphicsGLRegisterImage\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUGLDeviceList_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUGLDeviceList_enum::CU_GL_DEVICE_LIST_ALL => {\n                writer.write_all(stringify!(CU_GL_DEVICE_LIST_ALL).as_bytes())\n            }\n            &cuda_types::cuda::CUGLDeviceList_enum::CU_GL_DEVICE_LIST_CURRENT_FRAME => {\n                writer.write_all(stringify!(CU_GL_DEVICE_LIST_CURRENT_FRAME).as_bytes())\n            }\n            &cuda_types::cuda::CUGLDeviceList_enum::CU_GL_DEVICE_LIST_NEXT_FRAME => {\n                writer.write_all(stringify!(CU_GL_DEVICE_LIST_NEXT_FRAME).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUGLmap_flags_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUGLmap_flags_enum::CU_GL_MAP_RESOURCE_FLAGS_NONE => {\n                writer.write_all(stringify!(CU_GL_MAP_RESOURCE_FLAGS_NONE).as_bytes())\n            }\n            &cuda_types::cuda::CUGLmap_flags_enum::CU_GL_MAP_RESOURCE_FLAGS_READ_ONLY => {\n                writer\n                    .write_all(stringify!(CU_GL_MAP_RESOURCE_FLAGS_READ_ONLY).as_bytes())\n            }\n            &cuda_types::cuda::CUGLmap_flags_enum::CU_GL_MAP_RESOURCE_FLAGS_WRITE_DISCARD => {\n                writer\n                    .write_all(\n                        stringify!(CU_GL_MAP_RESOURCE_FLAGS_WRITE_DISCARD).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cuGLCtxCreate_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pCtx: *mut cuda_types::cuda::CUcontext,\n    Flags: ::core::ffi::c_uint,\n    device: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pCtx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pCtx, \"cuGLCtxCreate_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Flags, \"cuGLCtxCreate_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"cuGLCtxCreate_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGLInit(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_cuGLRegisterBufferObject(\n    writer: &mut (impl std::io::Write + ?Sized),\n    buffer: cuda_types::cuda::GLuint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(buffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&buffer, \"cuGLRegisterBufferObject\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGLMapBufferObject_v2_ptds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptr: *mut cuda_types::cuda::CUdeviceptr,\n    size: *mut usize,\n    buffer: cuda_types::cuda::GLuint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuGLMapBufferObject_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cuGLMapBufferObject_v2_ptds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(buffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&buffer, \"cuGLMapBufferObject_v2_ptds\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGLUnmapBufferObject(\n    writer: &mut (impl std::io::Write + ?Sized),\n    buffer: cuda_types::cuda::GLuint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(buffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&buffer, \"cuGLUnmapBufferObject\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGLUnregisterBufferObject(\n    writer: &mut (impl std::io::Write + ?Sized),\n    buffer: cuda_types::cuda::GLuint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(buffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&buffer, \"cuGLUnregisterBufferObject\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGLSetBufferObjectMapFlags(\n    writer: &mut (impl std::io::Write + ?Sized),\n    buffer: cuda_types::cuda::GLuint,\n    Flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(buffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&buffer, \"cuGLSetBufferObjectMapFlags\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Flags, \"cuGLSetBufferObjectMapFlags\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGLMapBufferObjectAsync_v2_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptr: *mut cuda_types::cuda::CUdeviceptr,\n    size: *mut usize,\n    buffer: cuda_types::cuda::GLuint,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dptr,\n        \"cuGLMapBufferObjectAsync_v2_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &size,\n        \"cuGLMapBufferObjectAsync_v2_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(buffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &buffer,\n        \"cuGLMapBufferObjectAsync_v2_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hStream,\n        \"cuGLMapBufferObjectAsync_v2_ptsz\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGLUnmapBufferObjectAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    buffer: cuda_types::cuda::GLuint,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(buffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&buffer, \"cuGLUnmapBufferObjectAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuGLUnmapBufferObjectAsync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGLMapBufferObject_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptr: *mut cuda_types::cuda::CUdeviceptr,\n    size: *mut usize,\n    buffer: cuda_types::cuda::GLuint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuGLMapBufferObject_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cuGLMapBufferObject_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(buffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&buffer, \"cuGLMapBufferObject_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGLMapBufferObjectAsync_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptr: *mut cuda_types::cuda::CUdeviceptr,\n    size: *mut usize,\n    buffer: cuda_types::cuda::GLuint,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuGLMapBufferObjectAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cuGLMapBufferObjectAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(buffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&buffer, \"cuGLMapBufferObjectAsync_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuGLMapBufferObjectAsync_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGLCtxCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pCtx: *mut cuda_types::cuda::CUcontext,\n    Flags: ::core::ffi::c_uint,\n    device: cuda_types::cuda::CUdevice,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pCtx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pCtx, \"cuGLCtxCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Flags, \"cuGLCtxCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"cuGLCtxCreate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGLMapBufferObject(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptr: *mut cuda_types::cuda::CUdeviceptr_v1,\n    size: *mut ::core::ffi::c_uint,\n    buffer: cuda_types::cuda::GLuint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuGLMapBufferObject\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cuGLMapBufferObject\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(buffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&buffer, \"cuGLMapBufferObject\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGLMapBufferObjectAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dptr: *mut cuda_types::cuda::CUdeviceptr_v1,\n    size: *mut ::core::ffi::c_uint,\n    buffer: cuda_types::cuda::GLuint,\n    hStream: cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dptr, \"cuGLMapBufferObjectAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cuGLMapBufferObjectAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(buffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&buffer, \"cuGLMapBufferObjectAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStream, \"cuGLMapBufferObjectAsync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUeglFrameType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUeglFrameType_enum::CU_EGL_FRAME_TYPE_ARRAY => {\n                writer.write_all(stringify!(CU_EGL_FRAME_TYPE_ARRAY).as_bytes())\n            }\n            &cuda_types::cuda::CUeglFrameType_enum::CU_EGL_FRAME_TYPE_PITCH => {\n                writer.write_all(stringify!(CU_EGL_FRAME_TYPE_PITCH).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUeglResourceLocationFlags_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUeglResourceLocationFlags_enum::CU_EGL_RESOURCE_LOCATION_SYSMEM => {\n                writer.write_all(stringify!(CU_EGL_RESOURCE_LOCATION_SYSMEM).as_bytes())\n            }\n            &cuda_types::cuda::CUeglResourceLocationFlags_enum::CU_EGL_RESOURCE_LOCATION_VIDMEM => {\n                writer.write_all(stringify!(CU_EGL_RESOURCE_LOCATION_VIDMEM).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUeglColorFormat_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YUV420_PLANAR => {\n                writer\n                    .write_all(stringify!(CU_EGL_COLOR_FORMAT_YUV420_PLANAR).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YUV420_SEMIPLANAR => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_YUV420_SEMIPLANAR).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YUV422_PLANAR => {\n                writer\n                    .write_all(stringify!(CU_EGL_COLOR_FORMAT_YUV422_PLANAR).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YUV422_SEMIPLANAR => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_YUV422_SEMIPLANAR).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_RGB => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_RGB).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BGR => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BGR).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_ARGB => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_ARGB).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_RGBA => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_RGBA).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_L => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_L).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_R => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_R).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YUV444_PLANAR => {\n                writer\n                    .write_all(stringify!(CU_EGL_COLOR_FORMAT_YUV444_PLANAR).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YUV444_SEMIPLANAR => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_YUV444_SEMIPLANAR).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YUYV_422 => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_YUYV_422).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_UYVY_422 => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_UYVY_422).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_ABGR => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_ABGR).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BGRA => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BGRA).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_A => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_A).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_RG => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_RG).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_AYUV => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_AYUV).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YVU444_SEMIPLANAR => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_YVU444_SEMIPLANAR).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YVU422_SEMIPLANAR => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_YVU422_SEMIPLANAR).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YVU420_SEMIPLANAR => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_YVU420_SEMIPLANAR).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_Y10V10U10_444_SEMIPLANAR => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_Y10V10U10_444_SEMIPLANAR)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_Y10V10U10_420_SEMIPLANAR => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_Y10V10U10_420_SEMIPLANAR)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_Y12V12U12_444_SEMIPLANAR => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_Y12V12U12_444_SEMIPLANAR)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_Y12V12U12_420_SEMIPLANAR => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_Y12V12U12_420_SEMIPLANAR)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_VYUY_ER => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_VYUY_ER).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_UYVY_ER => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_UYVY_ER).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YUYV_ER => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_YUYV_ER).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YVYU_ER => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_YVYU_ER).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YUV_ER => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_YUV_ER).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YUVA_ER => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_YUVA_ER).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_AYUV_ER => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_AYUV_ER).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YUV444_PLANAR_ER => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_YUV444_PLANAR_ER).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YUV422_PLANAR_ER => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_YUV422_PLANAR_ER).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YUV420_PLANAR_ER => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_YUV420_PLANAR_ER).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YUV444_SEMIPLANAR_ER => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_YUV444_SEMIPLANAR_ER).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YUV422_SEMIPLANAR_ER => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_YUV422_SEMIPLANAR_ER).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YUV420_SEMIPLANAR_ER => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_YUV420_SEMIPLANAR_ER).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YVU444_PLANAR_ER => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_YVU444_PLANAR_ER).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YVU422_PLANAR_ER => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_YVU422_PLANAR_ER).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YVU420_PLANAR_ER => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_YVU420_PLANAR_ER).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YVU444_SEMIPLANAR_ER => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_YVU444_SEMIPLANAR_ER).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YVU422_SEMIPLANAR_ER => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_YVU422_SEMIPLANAR_ER).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YVU420_SEMIPLANAR_ER => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_YVU420_SEMIPLANAR_ER).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER_RGGB => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER_RGGB).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER_BGGR => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER_BGGR).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER_GRBG => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER_GRBG).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER_GBRG => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER_GBRG).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER10_RGGB => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER10_RGGB).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER10_BGGR => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER10_BGGR).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER10_GRBG => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER10_GRBG).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER10_GBRG => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER10_GBRG).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER12_RGGB => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER12_RGGB).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER12_BGGR => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER12_BGGR).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER12_GRBG => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER12_GRBG).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER12_GBRG => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER12_GBRG).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER14_RGGB => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER14_RGGB).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER14_BGGR => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER14_BGGR).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER14_GRBG => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER14_GRBG).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER14_GBRG => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER14_GBRG).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER20_RGGB => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER20_RGGB).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER20_BGGR => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER20_BGGR).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER20_GRBG => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER20_GRBG).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER20_GBRG => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER20_GBRG).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YVU444_PLANAR => {\n                writer\n                    .write_all(stringify!(CU_EGL_COLOR_FORMAT_YVU444_PLANAR).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YVU422_PLANAR => {\n                writer\n                    .write_all(stringify!(CU_EGL_COLOR_FORMAT_YVU422_PLANAR).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YVU420_PLANAR => {\n                writer\n                    .write_all(stringify!(CU_EGL_COLOR_FORMAT_YVU420_PLANAR).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER_ISP_RGGB => {\n                writer\n                    .write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER_ISP_RGGB).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER_ISP_BGGR => {\n                writer\n                    .write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER_ISP_BGGR).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER_ISP_GRBG => {\n                writer\n                    .write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER_ISP_GRBG).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER_ISP_GBRG => {\n                writer\n                    .write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER_ISP_GBRG).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER_BCCR => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER_BCCR).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER_RCCB => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER_RCCB).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER_CRBC => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER_CRBC).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER_CBRC => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER_CBRC).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER10_CCCC => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER10_CCCC).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER12_BCCR => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER12_BCCR).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER12_RCCB => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER12_RCCB).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER12_CRBC => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER12_CRBC).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER12_CBRC => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER12_CBRC).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_BAYER12_CCCC => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_BAYER12_CCCC).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_Y => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_Y).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YUV420_SEMIPLANAR_2020 => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_YUV420_SEMIPLANAR_2020).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YVU420_SEMIPLANAR_2020 => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_YVU420_SEMIPLANAR_2020).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YUV420_PLANAR_2020 => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_YUV420_PLANAR_2020).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YVU420_PLANAR_2020 => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_YVU420_PLANAR_2020).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YUV420_SEMIPLANAR_709 => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_YUV420_SEMIPLANAR_709).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YVU420_SEMIPLANAR_709 => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_YVU420_SEMIPLANAR_709).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YUV420_PLANAR_709 => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_YUV420_PLANAR_709).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YVU420_PLANAR_709 => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_YVU420_PLANAR_709).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_Y10V10U10_420_SEMIPLANAR_709 => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_Y10V10U10_420_SEMIPLANAR_709)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_Y10V10U10_420_SEMIPLANAR_2020 => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_Y10V10U10_420_SEMIPLANAR_2020)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_Y10V10U10_422_SEMIPLANAR_2020 => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_Y10V10U10_422_SEMIPLANAR_2020)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_Y10V10U10_422_SEMIPLANAR => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_Y10V10U10_422_SEMIPLANAR)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_Y10V10U10_422_SEMIPLANAR_709 => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_Y10V10U10_422_SEMIPLANAR_709)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_Y_ER => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_Y_ER).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_Y_709_ER => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_Y_709_ER).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_Y10_ER => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_Y10_ER).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_Y10_709_ER => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_Y10_709_ER).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_Y12_ER => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_Y12_ER).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_Y12_709_ER => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_Y12_709_ER).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YUVA => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_YUVA).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YUV => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_YUV).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_YVYU => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_YVYU).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_VYUY => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_VYUY).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_Y10V10U10_420_SEMIPLANAR_ER => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_Y10V10U10_420_SEMIPLANAR_ER)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_Y10V10U10_420_SEMIPLANAR_709_ER => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_Y10V10U10_420_SEMIPLANAR_709_ER)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_Y10V10U10_444_SEMIPLANAR_ER => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_Y10V10U10_444_SEMIPLANAR_ER)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_Y10V10U10_444_SEMIPLANAR_709_ER => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_Y10V10U10_444_SEMIPLANAR_709_ER)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_Y12V12U12_420_SEMIPLANAR_ER => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_Y12V12U12_420_SEMIPLANAR_ER)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_Y12V12U12_420_SEMIPLANAR_709_ER => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_Y12V12U12_420_SEMIPLANAR_709_ER)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_Y12V12U12_444_SEMIPLANAR_ER => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_Y12V12U12_444_SEMIPLANAR_ER)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_Y12V12U12_444_SEMIPLANAR_709_ER => {\n                writer\n                    .write_all(\n                        stringify!(CU_EGL_COLOR_FORMAT_Y12V12U12_444_SEMIPLANAR_709_ER)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_UYVY_709 => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_UYVY_709).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_UYVY_709_ER => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_UYVY_709_ER).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_UYVY_2020 => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_UYVY_2020).as_bytes())\n            }\n            &cuda_types::cuda::CUeglColorFormat_enum::CU_EGL_COLOR_FORMAT_MAX => {\n                writer.write_all(stringify!(CU_EGL_COLOR_FORMAT_MAX).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUeglStreamConnection {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\npub fn write_cuGraphicsEGLRegisterImage(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pCudaResource: *mut cuda_types::cuda::CUgraphicsResource,\n    image: cuda_types::cuda::EGLImageKHR,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pCudaResource), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pCudaResource,\n        \"cuGraphicsEGLRegisterImage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(image), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&image, \"cuGraphicsEGLRegisterImage\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuGraphicsEGLRegisterImage\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuEGLStreamConsumerConnect(\n    writer: &mut (impl std::io::Write + ?Sized),\n    conn: *mut cuda_types::cuda::CUeglStreamConnection,\n    stream: cuda_types::cuda::EGLStreamKHR,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(conn), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&conn, \"cuEGLStreamConsumerConnect\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cuEGLStreamConsumerConnect\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuEGLStreamConsumerConnectWithFlags(\n    writer: &mut (impl std::io::Write + ?Sized),\n    conn: *mut cuda_types::cuda::CUeglStreamConnection,\n    stream: cuda_types::cuda::EGLStreamKHR,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(conn), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &conn,\n        \"cuEGLStreamConsumerConnectWithFlags\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stream,\n        \"cuEGLStreamConsumerConnectWithFlags\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &flags,\n        \"cuEGLStreamConsumerConnectWithFlags\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuEGLStreamConsumerDisconnect(\n    writer: &mut (impl std::io::Write + ?Sized),\n    conn: *mut cuda_types::cuda::CUeglStreamConnection,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(conn), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&conn, \"cuEGLStreamConsumerDisconnect\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuEGLStreamConsumerAcquireFrame(\n    writer: &mut (impl std::io::Write + ?Sized),\n    conn: *mut cuda_types::cuda::CUeglStreamConnection,\n    pCudaResource: *mut cuda_types::cuda::CUgraphicsResource,\n    pStream: *mut cuda_types::cuda::CUstream,\n    timeout: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(conn), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &conn,\n        \"cuEGLStreamConsumerAcquireFrame\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pCudaResource), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pCudaResource,\n        \"cuEGLStreamConsumerAcquireFrame\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pStream,\n        \"cuEGLStreamConsumerAcquireFrame\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(timeout), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &timeout,\n        \"cuEGLStreamConsumerAcquireFrame\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuEGLStreamConsumerReleaseFrame(\n    writer: &mut (impl std::io::Write + ?Sized),\n    conn: *mut cuda_types::cuda::CUeglStreamConnection,\n    pCudaResource: cuda_types::cuda::CUgraphicsResource,\n    pStream: *mut cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(conn), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &conn,\n        \"cuEGLStreamConsumerReleaseFrame\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pCudaResource), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pCudaResource,\n        \"cuEGLStreamConsumerReleaseFrame\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pStream,\n        \"cuEGLStreamConsumerReleaseFrame\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuEGLStreamProducerConnect(\n    writer: &mut (impl std::io::Write + ?Sized),\n    conn: *mut cuda_types::cuda::CUeglStreamConnection,\n    stream: cuda_types::cuda::EGLStreamKHR,\n    width: cuda_types::cuda::EGLint,\n    height: cuda_types::cuda::EGLint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(conn), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&conn, \"cuEGLStreamProducerConnect\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cuEGLStreamProducerConnect\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(width), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&width, \"cuEGLStreamProducerConnect\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(height), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&height, \"cuEGLStreamProducerConnect\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuEGLStreamProducerDisconnect(\n    writer: &mut (impl std::io::Write + ?Sized),\n    conn: *mut cuda_types::cuda::CUeglStreamConnection,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(conn), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&conn, \"cuEGLStreamProducerDisconnect\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuEGLStreamProducerPresentFrame(\n    writer: &mut (impl std::io::Write + ?Sized),\n    conn: *mut cuda_types::cuda::CUeglStreamConnection,\n    eglframe: cuda_types::cuda::CUeglFrame,\n    pStream: *mut cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(conn), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &conn,\n        \"cuEGLStreamProducerPresentFrame\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(eglframe), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &eglframe,\n        \"cuEGLStreamProducerPresentFrame\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pStream,\n        \"cuEGLStreamProducerPresentFrame\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuEGLStreamProducerReturnFrame(\n    writer: &mut (impl std::io::Write + ?Sized),\n    conn: *mut cuda_types::cuda::CUeglStreamConnection,\n    eglframe: *mut cuda_types::cuda::CUeglFrame,\n    pStream: *mut cuda_types::cuda::CUstream,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(conn), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&conn, \"cuEGLStreamProducerReturnFrame\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(eglframe), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &eglframe,\n        \"cuEGLStreamProducerReturnFrame\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pStream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pStream,\n        \"cuEGLStreamProducerReturnFrame\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphicsResourceGetMappedEglFrame(\n    writer: &mut (impl std::io::Write + ?Sized),\n    eglFrame: *mut cuda_types::cuda::CUeglFrame,\n    resource: cuda_types::cuda::CUgraphicsResource,\n    index: ::core::ffi::c_uint,\n    mipLevel: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(eglFrame), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &eglFrame,\n        \"cuGraphicsResourceGetMappedEglFrame\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resource), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resource,\n        \"cuGraphicsResourceGetMappedEglFrame\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(index), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &index,\n        \"cuGraphicsResourceGetMappedEglFrame\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mipLevel), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mipLevel,\n        \"cuGraphicsResourceGetMappedEglFrame\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuEventCreateFromEGLSync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    phEvent: *mut cuda_types::cuda::CUevent,\n    eglSync: cuda_types::cuda::EGLSyncKHR,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(phEvent), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&phEvent, \"cuEventCreateFromEGLSync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(eglSync), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&eglSync, \"cuEventCreateFromEGLSync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuEventCreateFromEGLSync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cuda::VdpStatus {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::VdpStatus::VDP_STATUS_OK => {\n                writer.write_all(stringify!(VDP_STATUS_OK).as_bytes())\n            }\n            &cuda_types::cuda::VdpStatus::VDP_STATUS_NO_IMPLEMENTATION => {\n                writer.write_all(stringify!(VDP_STATUS_NO_IMPLEMENTATION).as_bytes())\n            }\n            &cuda_types::cuda::VdpStatus::VDP_STATUS_DISPLAY_PREEMPTED => {\n                writer.write_all(stringify!(VDP_STATUS_DISPLAY_PREEMPTED).as_bytes())\n            }\n            &cuda_types::cuda::VdpStatus::VDP_STATUS_INVALID_HANDLE => {\n                writer.write_all(stringify!(VDP_STATUS_INVALID_HANDLE).as_bytes())\n            }\n            &cuda_types::cuda::VdpStatus::VDP_STATUS_INVALID_POINTER => {\n                writer.write_all(stringify!(VDP_STATUS_INVALID_POINTER).as_bytes())\n            }\n            &cuda_types::cuda::VdpStatus::VDP_STATUS_INVALID_CHROMA_TYPE => {\n                writer.write_all(stringify!(VDP_STATUS_INVALID_CHROMA_TYPE).as_bytes())\n            }\n            &cuda_types::cuda::VdpStatus::VDP_STATUS_INVALID_Y_CB_CR_FORMAT => {\n                writer\n                    .write_all(stringify!(VDP_STATUS_INVALID_Y_CB_CR_FORMAT).as_bytes())\n            }\n            &cuda_types::cuda::VdpStatus::VDP_STATUS_INVALID_RGBA_FORMAT => {\n                writer.write_all(stringify!(VDP_STATUS_INVALID_RGBA_FORMAT).as_bytes())\n            }\n            &cuda_types::cuda::VdpStatus::VDP_STATUS_INVALID_INDEXED_FORMAT => {\n                writer\n                    .write_all(stringify!(VDP_STATUS_INVALID_INDEXED_FORMAT).as_bytes())\n            }\n            &cuda_types::cuda::VdpStatus::VDP_STATUS_INVALID_COLOR_STANDARD => {\n                writer\n                    .write_all(stringify!(VDP_STATUS_INVALID_COLOR_STANDARD).as_bytes())\n            }\n            &cuda_types::cuda::VdpStatus::VDP_STATUS_INVALID_COLOR_TABLE_FORMAT => {\n                writer\n                    .write_all(\n                        stringify!(VDP_STATUS_INVALID_COLOR_TABLE_FORMAT).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::VdpStatus::VDP_STATUS_INVALID_BLEND_FACTOR => {\n                writer.write_all(stringify!(VDP_STATUS_INVALID_BLEND_FACTOR).as_bytes())\n            }\n            &cuda_types::cuda::VdpStatus::VDP_STATUS_INVALID_BLEND_EQUATION => {\n                writer\n                    .write_all(stringify!(VDP_STATUS_INVALID_BLEND_EQUATION).as_bytes())\n            }\n            &cuda_types::cuda::VdpStatus::VDP_STATUS_INVALID_FLAG => {\n                writer.write_all(stringify!(VDP_STATUS_INVALID_FLAG).as_bytes())\n            }\n            &cuda_types::cuda::VdpStatus::VDP_STATUS_INVALID_DECODER_PROFILE => {\n                writer\n                    .write_all(stringify!(VDP_STATUS_INVALID_DECODER_PROFILE).as_bytes())\n            }\n            &cuda_types::cuda::VdpStatus::VDP_STATUS_INVALID_VIDEO_MIXER_FEATURE => {\n                writer\n                    .write_all(\n                        stringify!(VDP_STATUS_INVALID_VIDEO_MIXER_FEATURE).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::VdpStatus::VDP_STATUS_INVALID_VIDEO_MIXER_PARAMETER => {\n                writer\n                    .write_all(\n                        stringify!(VDP_STATUS_INVALID_VIDEO_MIXER_PARAMETER).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::VdpStatus::VDP_STATUS_INVALID_VIDEO_MIXER_ATTRIBUTE => {\n                writer\n                    .write_all(\n                        stringify!(VDP_STATUS_INVALID_VIDEO_MIXER_ATTRIBUTE).as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::VdpStatus::VDP_STATUS_INVALID_VIDEO_MIXER_PICTURE_STRUCTURE => {\n                writer\n                    .write_all(\n                        stringify!(VDP_STATUS_INVALID_VIDEO_MIXER_PICTURE_STRUCTURE)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cuda::VdpStatus::VDP_STATUS_INVALID_FUNC_ID => {\n                writer.write_all(stringify!(VDP_STATUS_INVALID_FUNC_ID).as_bytes())\n            }\n            &cuda_types::cuda::VdpStatus::VDP_STATUS_INVALID_SIZE => {\n                writer.write_all(stringify!(VDP_STATUS_INVALID_SIZE).as_bytes())\n            }\n            &cuda_types::cuda::VdpStatus::VDP_STATUS_INVALID_VALUE => {\n                writer.write_all(stringify!(VDP_STATUS_INVALID_VALUE).as_bytes())\n            }\n            &cuda_types::cuda::VdpStatus::VDP_STATUS_INVALID_STRUCT_VERSION => {\n                writer\n                    .write_all(stringify!(VDP_STATUS_INVALID_STRUCT_VERSION).as_bytes())\n            }\n            &cuda_types::cuda::VdpStatus::VDP_STATUS_RESOURCES => {\n                writer.write_all(stringify!(VDP_STATUS_RESOURCES).as_bytes())\n            }\n            &cuda_types::cuda::VdpStatus::VDP_STATUS_HANDLE_DEVICE_MISMATCH => {\n                writer\n                    .write_all(stringify!(VDP_STATUS_HANDLE_DEVICE_MISMATCH).as_bytes())\n            }\n            &cuda_types::cuda::VdpStatus::VDP_STATUS_ERROR => {\n                writer.write_all(stringify!(VDP_STATUS_ERROR).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::VdpGetProcAddress {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(\n            writer,\n            \"{:p}\",\n            unsafe {\n                std::mem::transmute::<\n                    cuda_types::cuda::VdpGetProcAddress,\n                    *mut ::std::ffi::c_void,\n                >(*self)\n            },\n        )\n    }\n}\npub fn write_cuVDPAUGetDevice(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pDevice: *mut cuda_types::cuda::CUdevice,\n    vdpDevice: cuda_types::cuda::VdpDevice,\n    vdpGetProcAddress: cuda_types::cuda::VdpGetProcAddress,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pDevice, \"cuVDPAUGetDevice\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vdpDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vdpDevice, \"cuVDPAUGetDevice\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vdpGetProcAddress), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vdpGetProcAddress, \"cuVDPAUGetDevice\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cuVDPAUCtxCreate_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pCtx: *mut cuda_types::cuda::CUcontext,\n    flags: ::core::ffi::c_uint,\n    device: cuda_types::cuda::CUdevice,\n    vdpDevice: cuda_types::cuda::VdpDevice,\n    vdpGetProcAddress: cuda_types::cuda::VdpGetProcAddress,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pCtx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pCtx, \"cuVDPAUCtxCreate_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuVDPAUCtxCreate_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"cuVDPAUCtxCreate_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vdpDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vdpDevice, \"cuVDPAUCtxCreate_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vdpGetProcAddress), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vdpGetProcAddress,\n        \"cuVDPAUCtxCreate_v2\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphicsVDPAURegisterVideoSurface(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pCudaResource: *mut cuda_types::cuda::CUgraphicsResource,\n    vdpSurface: cuda_types::cuda::VdpVideoSurface,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pCudaResource), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pCudaResource,\n        \"cuGraphicsVDPAURegisterVideoSurface\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vdpSurface), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vdpSurface,\n        \"cuGraphicsVDPAURegisterVideoSurface\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &flags,\n        \"cuGraphicsVDPAURegisterVideoSurface\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuGraphicsVDPAURegisterOutputSurface(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pCudaResource: *mut cuda_types::cuda::CUgraphicsResource,\n    vdpSurface: cuda_types::cuda::VdpOutputSurface,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pCudaResource), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pCudaResource,\n        \"cuGraphicsVDPAURegisterOutputSurface\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vdpSurface), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vdpSurface,\n        \"cuGraphicsVDPAURegisterOutputSurface\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &flags,\n        \"cuGraphicsVDPAURegisterOutputSurface\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cuVDPAUCtxCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pCtx: *mut cuda_types::cuda::CUcontext,\n    flags: ::core::ffi::c_uint,\n    device: cuda_types::cuda::CUdevice,\n    vdpDevice: cuda_types::cuda::VdpDevice,\n    vdpGetProcAddress: cuda_types::cuda::VdpGetProcAddress,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pCtx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pCtx, \"cuVDPAUCtxCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"cuVDPAUCtxCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"cuVDPAUCtxCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vdpDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vdpDevice, \"cuVDPAUCtxCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vdpGetProcAddress), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vdpGetProcAddress, \"cuVDPAUCtxCreate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cuda::cudaDataType_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::cudaDataType_t::CUDA_R_16F => {\n                writer.write_all(stringify!(CUDA_R_16F).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_C_16F => {\n                writer.write_all(stringify!(CUDA_C_16F).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_R_16BF => {\n                writer.write_all(stringify!(CUDA_R_16BF).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_C_16BF => {\n                writer.write_all(stringify!(CUDA_C_16BF).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_R_32F => {\n                writer.write_all(stringify!(CUDA_R_32F).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_C_32F => {\n                writer.write_all(stringify!(CUDA_C_32F).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_R_64F => {\n                writer.write_all(stringify!(CUDA_R_64F).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_C_64F => {\n                writer.write_all(stringify!(CUDA_C_64F).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_R_4I => {\n                writer.write_all(stringify!(CUDA_R_4I).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_C_4I => {\n                writer.write_all(stringify!(CUDA_C_4I).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_R_4U => {\n                writer.write_all(stringify!(CUDA_R_4U).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_C_4U => {\n                writer.write_all(stringify!(CUDA_C_4U).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_R_8I => {\n                writer.write_all(stringify!(CUDA_R_8I).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_C_8I => {\n                writer.write_all(stringify!(CUDA_C_8I).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_R_8U => {\n                writer.write_all(stringify!(CUDA_R_8U).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_C_8U => {\n                writer.write_all(stringify!(CUDA_C_8U).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_R_16I => {\n                writer.write_all(stringify!(CUDA_R_16I).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_C_16I => {\n                writer.write_all(stringify!(CUDA_C_16I).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_R_16U => {\n                writer.write_all(stringify!(CUDA_R_16U).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_C_16U => {\n                writer.write_all(stringify!(CUDA_C_16U).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_R_32I => {\n                writer.write_all(stringify!(CUDA_R_32I).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_C_32I => {\n                writer.write_all(stringify!(CUDA_C_32I).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_R_32U => {\n                writer.write_all(stringify!(CUDA_R_32U).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_C_32U => {\n                writer.write_all(stringify!(CUDA_C_32U).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_R_64I => {\n                writer.write_all(stringify!(CUDA_R_64I).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_C_64I => {\n                writer.write_all(stringify!(CUDA_C_64I).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_R_64U => {\n                writer.write_all(stringify!(CUDA_R_64U).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_C_64U => {\n                writer.write_all(stringify!(CUDA_C_64U).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_R_8F_E4M3 => {\n                writer.write_all(stringify!(CUDA_R_8F_E4M3).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_R_8F_UE4M3 => {\n                writer.write_all(stringify!(CUDA_R_8F_UE4M3).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_R_8F_E5M2 => {\n                writer.write_all(stringify!(CUDA_R_8F_E5M2).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_R_8F_UE8M0 => {\n                writer.write_all(stringify!(CUDA_R_8F_UE8M0).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_R_6F_E2M3 => {\n                writer.write_all(stringify!(CUDA_R_6F_E2M3).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_R_6F_E3M2 => {\n                writer.write_all(stringify!(CUDA_R_6F_E3M2).as_bytes())\n            }\n            &cuda_types::cuda::cudaDataType_t::CUDA_R_4F_E2M1 => {\n                writer.write_all(stringify!(CUDA_R_4F_E2M1).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::cudaEmulationStrategy_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::cudaEmulationStrategy_t::CUDA_EMULATION_STRATEGY_DEFAULT => {\n                writer.write_all(stringify!(CUDA_EMULATION_STRATEGY_DEFAULT).as_bytes())\n            }\n            &cuda_types::cuda::cudaEmulationStrategy_t::CUDA_EMULATION_STRATEGY_PERFORMANT => {\n                writer\n                    .write_all(stringify!(CUDA_EMULATION_STRATEGY_PERFORMANT).as_bytes())\n            }\n            &cuda_types::cuda::cudaEmulationStrategy_t::CUDA_EMULATION_STRATEGY_EAGER => {\n                writer.write_all(stringify!(CUDA_EMULATION_STRATEGY_EAGER).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::libraryPropertyType_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cuda::libraryPropertyType_t::MAJOR_VERSION => {\n                writer.write_all(stringify!(MAJOR_VERSION).as_bytes())\n            }\n            &cuda_types::cuda::libraryPropertyType_t::MINOR_VERSION => {\n                writer.write_all(stringify!(MINOR_VERSION).as_bytes())\n            }\n            &cuda_types::cuda::libraryPropertyType_t::PATCH_LEVEL => {\n                writer.write_all(stringify!(PATCH_LEVEL).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::float2 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(x), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.x, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(y), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.y, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::double2 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(x), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.x, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(y), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.y, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cuda::CUresult {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            Ok(()) => writer.write_all(b\"CUDA_SUCCESS\"),\n            Err(err) => {\n                match err.0.get() {\n                    1 => writer.write_all(\"CUDA_ERROR_INVALID_VALUE\".as_bytes()),\n                    2 => writer.write_all(\"CUDA_ERROR_OUT_OF_MEMORY\".as_bytes()),\n                    3 => writer.write_all(\"CUDA_ERROR_NOT_INITIALIZED\".as_bytes()),\n                    4 => writer.write_all(\"CUDA_ERROR_DEINITIALIZED\".as_bytes()),\n                    5 => writer.write_all(\"CUDA_ERROR_PROFILER_DISABLED\".as_bytes()),\n                    6 => {\n                        writer\n                            .write_all(\"CUDA_ERROR_PROFILER_NOT_INITIALIZED\".as_bytes())\n                    }\n                    7 => {\n                        writer\n                            .write_all(\"CUDA_ERROR_PROFILER_ALREADY_STARTED\".as_bytes())\n                    }\n                    8 => {\n                        writer\n                            .write_all(\"CUDA_ERROR_PROFILER_ALREADY_STOPPED\".as_bytes())\n                    }\n                    34 => writer.write_all(\"CUDA_ERROR_STUB_LIBRARY\".as_bytes()),\n                    36 => {\n                        writer\n                            .write_all(\n                                \"CUDA_ERROR_CALL_REQUIRES_NEWER_DRIVER\".as_bytes(),\n                            )\n                    }\n                    46 => writer.write_all(\"CUDA_ERROR_DEVICE_UNAVAILABLE\".as_bytes()),\n                    100 => writer.write_all(\"CUDA_ERROR_NO_DEVICE\".as_bytes()),\n                    101 => writer.write_all(\"CUDA_ERROR_INVALID_DEVICE\".as_bytes()),\n                    102 => writer.write_all(\"CUDA_ERROR_DEVICE_NOT_LICENSED\".as_bytes()),\n                    200 => writer.write_all(\"CUDA_ERROR_INVALID_IMAGE\".as_bytes()),\n                    201 => writer.write_all(\"CUDA_ERROR_INVALID_CONTEXT\".as_bytes()),\n                    202 => {\n                        writer.write_all(\"CUDA_ERROR_CONTEXT_ALREADY_CURRENT\".as_bytes())\n                    }\n                    205 => writer.write_all(\"CUDA_ERROR_MAP_FAILED\".as_bytes()),\n                    206 => writer.write_all(\"CUDA_ERROR_UNMAP_FAILED\".as_bytes()),\n                    207 => writer.write_all(\"CUDA_ERROR_ARRAY_IS_MAPPED\".as_bytes()),\n                    208 => writer.write_all(\"CUDA_ERROR_ALREADY_MAPPED\".as_bytes()),\n                    209 => writer.write_all(\"CUDA_ERROR_NO_BINARY_FOR_GPU\".as_bytes()),\n                    210 => writer.write_all(\"CUDA_ERROR_ALREADY_ACQUIRED\".as_bytes()),\n                    211 => writer.write_all(\"CUDA_ERROR_NOT_MAPPED\".as_bytes()),\n                    212 => writer.write_all(\"CUDA_ERROR_NOT_MAPPED_AS_ARRAY\".as_bytes()),\n                    213 => {\n                        writer.write_all(\"CUDA_ERROR_NOT_MAPPED_AS_POINTER\".as_bytes())\n                    }\n                    214 => writer.write_all(\"CUDA_ERROR_ECC_UNCORRECTABLE\".as_bytes()),\n                    215 => writer.write_all(\"CUDA_ERROR_UNSUPPORTED_LIMIT\".as_bytes()),\n                    216 => {\n                        writer.write_all(\"CUDA_ERROR_CONTEXT_ALREADY_IN_USE\".as_bytes())\n                    }\n                    217 => {\n                        writer.write_all(\"CUDA_ERROR_PEER_ACCESS_UNSUPPORTED\".as_bytes())\n                    }\n                    218 => writer.write_all(\"CUDA_ERROR_INVALID_PTX\".as_bytes()),\n                    219 => {\n                        writer\n                            .write_all(\"CUDA_ERROR_INVALID_GRAPHICS_CONTEXT\".as_bytes())\n                    }\n                    220 => writer.write_all(\"CUDA_ERROR_NVLINK_UNCORRECTABLE\".as_bytes()),\n                    221 => {\n                        writer.write_all(\"CUDA_ERROR_JIT_COMPILER_NOT_FOUND\".as_bytes())\n                    }\n                    222 => {\n                        writer.write_all(\"CUDA_ERROR_UNSUPPORTED_PTX_VERSION\".as_bytes())\n                    }\n                    223 => {\n                        writer\n                            .write_all(\"CUDA_ERROR_JIT_COMPILATION_DISABLED\".as_bytes())\n                    }\n                    224 => {\n                        writer\n                            .write_all(\"CUDA_ERROR_UNSUPPORTED_EXEC_AFFINITY\".as_bytes())\n                    }\n                    225 => {\n                        writer\n                            .write_all(\"CUDA_ERROR_UNSUPPORTED_DEVSIDE_SYNC\".as_bytes())\n                    }\n                    226 => writer.write_all(\"CUDA_ERROR_CONTAINED\".as_bytes()),\n                    300 => writer.write_all(\"CUDA_ERROR_INVALID_SOURCE\".as_bytes()),\n                    301 => writer.write_all(\"CUDA_ERROR_FILE_NOT_FOUND\".as_bytes()),\n                    302 => {\n                        writer\n                            .write_all(\n                                \"CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND\".as_bytes(),\n                            )\n                    }\n                    303 => {\n                        writer\n                            .write_all(\"CUDA_ERROR_SHARED_OBJECT_INIT_FAILED\".as_bytes())\n                    }\n                    304 => writer.write_all(\"CUDA_ERROR_OPERATING_SYSTEM\".as_bytes()),\n                    400 => writer.write_all(\"CUDA_ERROR_INVALID_HANDLE\".as_bytes()),\n                    401 => writer.write_all(\"CUDA_ERROR_ILLEGAL_STATE\".as_bytes()),\n                    402 => writer.write_all(\"CUDA_ERROR_LOSSY_QUERY\".as_bytes()),\n                    500 => writer.write_all(\"CUDA_ERROR_NOT_FOUND\".as_bytes()),\n                    600 => writer.write_all(\"CUDA_ERROR_NOT_READY\".as_bytes()),\n                    700 => writer.write_all(\"CUDA_ERROR_ILLEGAL_ADDRESS\".as_bytes()),\n                    701 => {\n                        writer.write_all(\"CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES\".as_bytes())\n                    }\n                    702 => writer.write_all(\"CUDA_ERROR_LAUNCH_TIMEOUT\".as_bytes()),\n                    703 => {\n                        writer\n                            .write_all(\n                                \"CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING\".as_bytes(),\n                            )\n                    }\n                    704 => {\n                        writer\n                            .write_all(\n                                \"CUDA_ERROR_PEER_ACCESS_ALREADY_ENABLED\".as_bytes(),\n                            )\n                    }\n                    705 => {\n                        writer.write_all(\"CUDA_ERROR_PEER_ACCESS_NOT_ENABLED\".as_bytes())\n                    }\n                    708 => {\n                        writer.write_all(\"CUDA_ERROR_PRIMARY_CONTEXT_ACTIVE\".as_bytes())\n                    }\n                    709 => writer.write_all(\"CUDA_ERROR_CONTEXT_IS_DESTROYED\".as_bytes()),\n                    710 => writer.write_all(\"CUDA_ERROR_ASSERT\".as_bytes()),\n                    711 => writer.write_all(\"CUDA_ERROR_TOO_MANY_PEERS\".as_bytes()),\n                    712 => {\n                        writer\n                            .write_all(\n                                \"CUDA_ERROR_HOST_MEMORY_ALREADY_REGISTERED\".as_bytes(),\n                            )\n                    }\n                    713 => {\n                        writer\n                            .write_all(\n                                \"CUDA_ERROR_HOST_MEMORY_NOT_REGISTERED\".as_bytes(),\n                            )\n                    }\n                    714 => writer.write_all(\"CUDA_ERROR_HARDWARE_STACK_ERROR\".as_bytes()),\n                    715 => writer.write_all(\"CUDA_ERROR_ILLEGAL_INSTRUCTION\".as_bytes()),\n                    716 => writer.write_all(\"CUDA_ERROR_MISALIGNED_ADDRESS\".as_bytes()),\n                    717 => {\n                        writer.write_all(\"CUDA_ERROR_INVALID_ADDRESS_SPACE\".as_bytes())\n                    }\n                    718 => writer.write_all(\"CUDA_ERROR_INVALID_PC\".as_bytes()),\n                    719 => writer.write_all(\"CUDA_ERROR_LAUNCH_FAILED\".as_bytes()),\n                    720 => {\n                        writer\n                            .write_all(\n                                \"CUDA_ERROR_COOPERATIVE_LAUNCH_TOO_LARGE\".as_bytes(),\n                            )\n                    }\n                    721 => writer.write_all(\"CUDA_ERROR_TENSOR_MEMORY_LEAK\".as_bytes()),\n                    800 => writer.write_all(\"CUDA_ERROR_NOT_PERMITTED\".as_bytes()),\n                    801 => writer.write_all(\"CUDA_ERROR_NOT_SUPPORTED\".as_bytes()),\n                    802 => writer.write_all(\"CUDA_ERROR_SYSTEM_NOT_READY\".as_bytes()),\n                    803 => {\n                        writer.write_all(\"CUDA_ERROR_SYSTEM_DRIVER_MISMATCH\".as_bytes())\n                    }\n                    804 => {\n                        writer\n                            .write_all(\n                                \"CUDA_ERROR_COMPAT_NOT_SUPPORTED_ON_DEVICE\".as_bytes(),\n                            )\n                    }\n                    805 => {\n                        writer.write_all(\"CUDA_ERROR_MPS_CONNECTION_FAILED\".as_bytes())\n                    }\n                    806 => writer.write_all(\"CUDA_ERROR_MPS_RPC_FAILURE\".as_bytes()),\n                    807 => writer.write_all(\"CUDA_ERROR_MPS_SERVER_NOT_READY\".as_bytes()),\n                    808 => {\n                        writer.write_all(\"CUDA_ERROR_MPS_MAX_CLIENTS_REACHED\".as_bytes())\n                    }\n                    809 => {\n                        writer\n                            .write_all(\n                                \"CUDA_ERROR_MPS_MAX_CONNECTIONS_REACHED\".as_bytes(),\n                            )\n                    }\n                    810 => {\n                        writer.write_all(\"CUDA_ERROR_MPS_CLIENT_TERMINATED\".as_bytes())\n                    }\n                    811 => writer.write_all(\"CUDA_ERROR_CDP_NOT_SUPPORTED\".as_bytes()),\n                    812 => writer.write_all(\"CUDA_ERROR_CDP_VERSION_MISMATCH\".as_bytes()),\n                    900 => {\n                        writer\n                            .write_all(\n                                \"CUDA_ERROR_STREAM_CAPTURE_UNSUPPORTED\".as_bytes(),\n                            )\n                    }\n                    901 => {\n                        writer\n                            .write_all(\n                                \"CUDA_ERROR_STREAM_CAPTURE_INVALIDATED\".as_bytes(),\n                            )\n                    }\n                    902 => writer.write_all(\"CUDA_ERROR_STREAM_CAPTURE_MERGE\".as_bytes()),\n                    903 => {\n                        writer\n                            .write_all(\"CUDA_ERROR_STREAM_CAPTURE_UNMATCHED\".as_bytes())\n                    }\n                    904 => {\n                        writer.write_all(\"CUDA_ERROR_STREAM_CAPTURE_UNJOINED\".as_bytes())\n                    }\n                    905 => {\n                        writer\n                            .write_all(\"CUDA_ERROR_STREAM_CAPTURE_ISOLATION\".as_bytes())\n                    }\n                    906 => {\n                        writer.write_all(\"CUDA_ERROR_STREAM_CAPTURE_IMPLICIT\".as_bytes())\n                    }\n                    907 => writer.write_all(\"CUDA_ERROR_CAPTURED_EVENT\".as_bytes()),\n                    908 => {\n                        writer\n                            .write_all(\n                                \"CUDA_ERROR_STREAM_CAPTURE_WRONG_THREAD\".as_bytes(),\n                            )\n                    }\n                    909 => writer.write_all(\"CUDA_ERROR_TIMEOUT\".as_bytes()),\n                    910 => {\n                        writer\n                            .write_all(\"CUDA_ERROR_GRAPH_EXEC_UPDATE_FAILURE\".as_bytes())\n                    }\n                    911 => writer.write_all(\"CUDA_ERROR_EXTERNAL_DEVICE\".as_bytes()),\n                    912 => writer.write_all(\"CUDA_ERROR_INVALID_CLUSTER_SIZE\".as_bytes()),\n                    913 => writer.write_all(\"CUDA_ERROR_FUNCTION_NOT_LOADED\".as_bytes()),\n                    914 => {\n                        writer.write_all(\"CUDA_ERROR_INVALID_RESOURCE_TYPE\".as_bytes())\n                    }\n                    915 => {\n                        writer\n                            .write_all(\n                                \"CUDA_ERROR_INVALID_RESOURCE_CONFIGURATION\".as_bytes(),\n                            )\n                    }\n                    916 => writer.write_all(\"CUDA_ERROR_KEY_ROTATION\".as_bytes()),\n                    999 => writer.write_all(\"CUDA_ERROR_UNKNOWN\".as_bytes()),\n                    err => write!(writer, \"{}\", err),\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "format/src/format_generated_blas.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\nimpl crate::CudaDisplay for cuda_types::cublas::cublasFillMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cublas::cublasFillMode_t::CUBLAS_FILL_MODE_LOWER => {\n                writer.write_all(stringify!(CUBLAS_FILL_MODE_LOWER).as_bytes())\n            }\n            &cuda_types::cublas::cublasFillMode_t::CUBLAS_FILL_MODE_UPPER => {\n                writer.write_all(stringify!(CUBLAS_FILL_MODE_UPPER).as_bytes())\n            }\n            &cuda_types::cublas::cublasFillMode_t::CUBLAS_FILL_MODE_FULL => {\n                writer.write_all(stringify!(CUBLAS_FILL_MODE_FULL).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cublas::cublasDiagType_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cublas::cublasDiagType_t::CUBLAS_DIAG_NON_UNIT => {\n                writer.write_all(stringify!(CUBLAS_DIAG_NON_UNIT).as_bytes())\n            }\n            &cuda_types::cublas::cublasDiagType_t::CUBLAS_DIAG_UNIT => {\n                writer.write_all(stringify!(CUBLAS_DIAG_UNIT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cublas::cublasSideMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cublas::cublasSideMode_t::CUBLAS_SIDE_LEFT => {\n                writer.write_all(stringify!(CUBLAS_SIDE_LEFT).as_bytes())\n            }\n            &cuda_types::cublas::cublasSideMode_t::CUBLAS_SIDE_RIGHT => {\n                writer.write_all(stringify!(CUBLAS_SIDE_RIGHT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cublas::cublasOperation_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cublas::cublasOperation_t::CUBLAS_OP_N => {\n                writer.write_all(stringify!(CUBLAS_OP_N).as_bytes())\n            }\n            &cuda_types::cublas::cublasOperation_t::CUBLAS_OP_T => {\n                writer.write_all(stringify!(CUBLAS_OP_T).as_bytes())\n            }\n            &cuda_types::cublas::cublasOperation_t::CUBLAS_OP_C => {\n                writer.write_all(stringify!(CUBLAS_OP_C).as_bytes())\n            }\n            &cuda_types::cublas::cublasOperation_t::CUBLAS_OP_HERMITAN => {\n                writer.write_all(stringify!(CUBLAS_OP_HERMITAN).as_bytes())\n            }\n            &cuda_types::cublas::cublasOperation_t::CUBLAS_OP_CONJG => {\n                writer.write_all(stringify!(CUBLAS_OP_CONJG).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cublas::cublasPointerMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cublas::cublasPointerMode_t::CUBLAS_POINTER_MODE_HOST => {\n                writer.write_all(stringify!(CUBLAS_POINTER_MODE_HOST).as_bytes())\n            }\n            &cuda_types::cublas::cublasPointerMode_t::CUBLAS_POINTER_MODE_DEVICE => {\n                writer.write_all(stringify!(CUBLAS_POINTER_MODE_DEVICE).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cublas::cublasAtomicsMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cublas::cublasAtomicsMode_t::CUBLAS_ATOMICS_NOT_ALLOWED => {\n                writer.write_all(stringify!(CUBLAS_ATOMICS_NOT_ALLOWED).as_bytes())\n            }\n            &cuda_types::cublas::cublasAtomicsMode_t::CUBLAS_ATOMICS_ALLOWED => {\n                writer.write_all(stringify!(CUBLAS_ATOMICS_ALLOWED).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cublas::cublasGemmAlgo_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_DFALT => {\n                writer.write_all(stringify!(CUBLAS_GEMM_DFALT).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_DEFAULT => {\n                writer.write_all(stringify!(CUBLAS_GEMM_DEFAULT).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO0 => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO0).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO1 => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO1).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO2 => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO2).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO3 => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO3).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO4 => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO4).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO5 => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO5).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO6 => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO6).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO7 => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO7).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO8 => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO8).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO9 => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO9).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO10 => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO10).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO11 => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO11).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO12 => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO12).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO13 => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO13).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO14 => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO14).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO15 => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO15).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO16 => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO16).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO17 => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO17).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO18 => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO18).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO19 => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO19).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO20 => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO20).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO21 => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO21).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO22 => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO22).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO23 => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO23).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_DEFAULT_TENSOR_OP => {\n                writer.write_all(stringify!(CUBLAS_GEMM_DEFAULT_TENSOR_OP).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_DFALT_TENSOR_OP => {\n                writer.write_all(stringify!(CUBLAS_GEMM_DFALT_TENSOR_OP).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO0_TENSOR_OP => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO0_TENSOR_OP).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO1_TENSOR_OP => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO1_TENSOR_OP).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO2_TENSOR_OP => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO2_TENSOR_OP).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO3_TENSOR_OP => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO3_TENSOR_OP).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO4_TENSOR_OP => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO4_TENSOR_OP).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO5_TENSOR_OP => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO5_TENSOR_OP).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO6_TENSOR_OP => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO6_TENSOR_OP).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO7_TENSOR_OP => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO7_TENSOR_OP).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO8_TENSOR_OP => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO8_TENSOR_OP).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO9_TENSOR_OP => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO9_TENSOR_OP).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO10_TENSOR_OP => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO10_TENSOR_OP).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO11_TENSOR_OP => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO11_TENSOR_OP).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO12_TENSOR_OP => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO12_TENSOR_OP).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO13_TENSOR_OP => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO13_TENSOR_OP).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO14_TENSOR_OP => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO14_TENSOR_OP).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_ALGO15_TENSOR_OP => {\n                writer.write_all(stringify!(CUBLAS_GEMM_ALGO15_TENSOR_OP).as_bytes())\n            }\n            &cuda_types::cublas::cublasGemmAlgo_t::CUBLAS_GEMM_AUTOTUNE => {\n                writer.write_all(stringify!(CUBLAS_GEMM_AUTOTUNE).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cublas::cublasMath_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cublas::cublasMath_t::CUBLAS_DEFAULT_MATH => {\n                writer.write_all(stringify!(CUBLAS_DEFAULT_MATH).as_bytes())\n            }\n            &cuda_types::cublas::cublasMath_t::CUBLAS_TENSOR_OP_MATH => {\n                writer.write_all(stringify!(CUBLAS_TENSOR_OP_MATH).as_bytes())\n            }\n            &cuda_types::cublas::cublasMath_t::CUBLAS_PEDANTIC_MATH => {\n                writer.write_all(stringify!(CUBLAS_PEDANTIC_MATH).as_bytes())\n            }\n            &cuda_types::cublas::cublasMath_t::CUBLAS_TF32_TENSOR_OP_MATH => {\n                writer.write_all(stringify!(CUBLAS_TF32_TENSOR_OP_MATH).as_bytes())\n            }\n            &cuda_types::cublas::cublasMath_t::CUBLAS_FP32_EMULATED_BF16X9_MATH => {\n                writer.write_all(stringify!(CUBLAS_FP32_EMULATED_BF16X9_MATH).as_bytes())\n            }\n            &cuda_types::cublas::cublasMath_t::CUBLAS_MATH_DISALLOW_REDUCED_PRECISION_REDUCTION => {\n                writer\n                    .write_all(\n                        stringify!(CUBLAS_MATH_DISALLOW_REDUCED_PRECISION_REDUCTION)\n                            .as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cublas::cublasComputeType_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cublas::cublasComputeType_t::CUBLAS_COMPUTE_16F => {\n                writer.write_all(stringify!(CUBLAS_COMPUTE_16F).as_bytes())\n            }\n            &cuda_types::cublas::cublasComputeType_t::CUBLAS_COMPUTE_16F_PEDANTIC => {\n                writer.write_all(stringify!(CUBLAS_COMPUTE_16F_PEDANTIC).as_bytes())\n            }\n            &cuda_types::cublas::cublasComputeType_t::CUBLAS_COMPUTE_32F => {\n                writer.write_all(stringify!(CUBLAS_COMPUTE_32F).as_bytes())\n            }\n            &cuda_types::cublas::cublasComputeType_t::CUBLAS_COMPUTE_32F_PEDANTIC => {\n                writer.write_all(stringify!(CUBLAS_COMPUTE_32F_PEDANTIC).as_bytes())\n            }\n            &cuda_types::cublas::cublasComputeType_t::CUBLAS_COMPUTE_32F_FAST_16F => {\n                writer.write_all(stringify!(CUBLAS_COMPUTE_32F_FAST_16F).as_bytes())\n            }\n            &cuda_types::cublas::cublasComputeType_t::CUBLAS_COMPUTE_32F_FAST_16BF => {\n                writer.write_all(stringify!(CUBLAS_COMPUTE_32F_FAST_16BF).as_bytes())\n            }\n            &cuda_types::cublas::cublasComputeType_t::CUBLAS_COMPUTE_32F_FAST_TF32 => {\n                writer.write_all(stringify!(CUBLAS_COMPUTE_32F_FAST_TF32).as_bytes())\n            }\n            &cuda_types::cublas::cublasComputeType_t::CUBLAS_COMPUTE_32F_EMULATED_16BFX9 => {\n                writer\n                    .write_all(stringify!(CUBLAS_COMPUTE_32F_EMULATED_16BFX9).as_bytes())\n            }\n            &cuda_types::cublas::cublasComputeType_t::CUBLAS_COMPUTE_64F => {\n                writer.write_all(stringify!(CUBLAS_COMPUTE_64F).as_bytes())\n            }\n            &cuda_types::cublas::cublasComputeType_t::CUBLAS_COMPUTE_64F_PEDANTIC => {\n                writer.write_all(stringify!(CUBLAS_COMPUTE_64F_PEDANTIC).as_bytes())\n            }\n            &cuda_types::cublas::cublasComputeType_t::CUBLAS_COMPUTE_32I => {\n                writer.write_all(stringify!(CUBLAS_COMPUTE_32I).as_bytes())\n            }\n            &cuda_types::cublas::cublasComputeType_t::CUBLAS_COMPUTE_32I_PEDANTIC => {\n                writer.write_all(stringify!(CUBLAS_COMPUTE_32I_PEDANTIC).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cublas::cublasEmulationStrategy_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cublas::cublasEmulationStrategy_t::CUBLAS_EMULATION_STRATEGY_DEFAULT => {\n                writer\n                    .write_all(stringify!(CUBLAS_EMULATION_STRATEGY_DEFAULT).as_bytes())\n            }\n            &cuda_types::cublas::cublasEmulationStrategy_t::CUBLAS_EMULATION_STRATEGY_PERFORMANT => {\n                writer\n                    .write_all(\n                        stringify!(CUBLAS_EMULATION_STRATEGY_PERFORMANT).as_bytes(),\n                    )\n            }\n            &cuda_types::cublas::cublasEmulationStrategy_t::CUBLAS_EMULATION_STRATEGY_EAGER => {\n                writer.write_all(stringify!(CUBLAS_EMULATION_STRATEGY_EAGER).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cublas::cublasHandle_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(writer, \"{:p}\", self.0)\n    }\n}\npub fn write_cublasCreate_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: *mut cuda_types::cublas::cublasHandle_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCreate_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDestroy_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDestroy_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasGetVersion_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    version: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasGetVersion_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(version), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&version, \"cublasGetVersion_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasGetProperty(\n    writer: &mut (impl std::io::Write + ?Sized),\n    type_: cuda_types::cublas::libraryPropertyType,\n    value: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cublasGetProperty\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cublasGetProperty\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasGetCudartVersion(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_cublasSetWorkspace_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    workspace: *mut ::core::ffi::c_void,\n    workspaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSetWorkspace_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workspace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workspace, \"cublasSetWorkspace_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workspaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workspaceSizeInBytes,\n        \"cublasSetWorkspace_v2\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSetStream_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    streamId: cuda_types::cublas::cudaStream_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSetStream_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(streamId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&streamId, \"cublasSetStream_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasGetStream_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    streamId: *mut cuda_types::cublas::cudaStream_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasGetStream_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(streamId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&streamId, \"cublasGetStream_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasGetPointerMode_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    mode: *mut cuda_types::cublas::cublasPointerMode_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasGetPointerMode_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cublasGetPointerMode_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSetPointerMode_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    mode: cuda_types::cublas::cublasPointerMode_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSetPointerMode_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cublasSetPointerMode_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasGetAtomicsMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    mode: *mut cuda_types::cublas::cublasAtomicsMode_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasGetAtomicsMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cublasGetAtomicsMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSetAtomicsMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    mode: cuda_types::cublas::cublasAtomicsMode_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSetAtomicsMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cublasSetAtomicsMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasGetMathMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    mode: *mut cuda_types::cublas::cublasMath_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasGetMathMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cublasGetMathMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSetMathMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    mode: cuda_types::cublas::cublasMath_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSetMathMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cublasSetMathMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasGetSmCountTarget(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    smCountTarget: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasGetSmCountTarget\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(smCountTarget), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &smCountTarget,\n        \"cublasGetSmCountTarget\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSetSmCountTarget(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    smCountTarget: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSetSmCountTarget\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(smCountTarget), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &smCountTarget,\n        \"cublasSetSmCountTarget\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasGetEmulationStrategy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    emulationStrategy: *mut cuda_types::cublas::cublasEmulationStrategy_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasGetEmulationStrategy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(emulationStrategy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &emulationStrategy,\n        \"cublasGetEmulationStrategy\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSetEmulationStrategy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    emulationStrategy: cuda_types::cublas::cublasEmulationStrategy_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSetEmulationStrategy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(emulationStrategy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &emulationStrategy,\n        \"cublasSetEmulationStrategy\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasGetStatusName(\n    writer: &mut (impl std::io::Write + ?Sized),\n    status: cuda_types::cublas::cublasStatus_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(status), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&status, \"cublasGetStatusName\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasGetStatusString(\n    writer: &mut (impl std::io::Write + ?Sized),\n    status: cuda_types::cublas::cublasStatus_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(status), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&status, \"cublasGetStatusString\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLoggerConfigure(\n    writer: &mut (impl std::io::Write + ?Sized),\n    logIsOn: ::core::ffi::c_int,\n    logToStdOut: ::core::ffi::c_int,\n    logToStdErr: ::core::ffi::c_int,\n    logFileName: *const ::core::ffi::c_char,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(logIsOn), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&logIsOn, \"cublasLoggerConfigure\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(logToStdOut), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&logToStdOut, \"cublasLoggerConfigure\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(logToStdErr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&logToStdErr, \"cublasLoggerConfigure\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(logFileName), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&logFileName, \"cublasLoggerConfigure\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSetLoggerCallback(\n    writer: &mut (impl std::io::Write + ?Sized),\n    userCallback: cuda_types::cublas::cublasLogCallback,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(userCallback), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &userCallback,\n        \"cublasSetLoggerCallback\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasGetLoggerCallback(\n    writer: &mut (impl std::io::Write + ?Sized),\n    userCallback: *mut cuda_types::cublas::cublasLogCallback,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(userCallback), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &userCallback,\n        \"cublasGetLoggerCallback\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSetVector(\n    writer: &mut (impl std::io::Write + ?Sized),\n    n: ::core::ffi::c_int,\n    elemSize: ::core::ffi::c_int,\n    x: *const ::core::ffi::c_void,\n    incx: ::core::ffi::c_int,\n    devicePtr: *mut ::core::ffi::c_void,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSetVector\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(elemSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&elemSize, \"cublasSetVector\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSetVector\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSetVector\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devicePtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&devicePtr, \"cublasSetVector\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSetVector\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSetVector_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    n: i64,\n    elemSize: i64,\n    x: *const ::core::ffi::c_void,\n    incx: i64,\n    devicePtr: *mut ::core::ffi::c_void,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSetVector_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(elemSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&elemSize, \"cublasSetVector_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSetVector_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSetVector_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devicePtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&devicePtr, \"cublasSetVector_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSetVector_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasGetVector(\n    writer: &mut (impl std::io::Write + ?Sized),\n    n: ::core::ffi::c_int,\n    elemSize: ::core::ffi::c_int,\n    x: *const ::core::ffi::c_void,\n    incx: ::core::ffi::c_int,\n    y: *mut ::core::ffi::c_void,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasGetVector\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(elemSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&elemSize, \"cublasGetVector\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasGetVector\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasGetVector\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasGetVector\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasGetVector\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasGetVector_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    n: i64,\n    elemSize: i64,\n    x: *const ::core::ffi::c_void,\n    incx: i64,\n    y: *mut ::core::ffi::c_void,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasGetVector_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(elemSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&elemSize, \"cublasGetVector_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasGetVector_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasGetVector_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasGetVector_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasGetVector_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSetMatrix(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rows: ::core::ffi::c_int,\n    cols: ::core::ffi::c_int,\n    elemSize: ::core::ffi::c_int,\n    A: *const ::core::ffi::c_void,\n    lda: ::core::ffi::c_int,\n    B: *mut ::core::ffi::c_void,\n    ldb: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cublasSetMatrix\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cublasSetMatrix\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(elemSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&elemSize, \"cublasSetMatrix\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSetMatrix\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSetMatrix\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasSetMatrix\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasSetMatrix\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSetMatrix_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rows: i64,\n    cols: i64,\n    elemSize: i64,\n    A: *const ::core::ffi::c_void,\n    lda: i64,\n    B: *mut ::core::ffi::c_void,\n    ldb: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cublasSetMatrix_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cublasSetMatrix_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(elemSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&elemSize, \"cublasSetMatrix_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSetMatrix_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSetMatrix_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasSetMatrix_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasSetMatrix_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasGetMatrix(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rows: ::core::ffi::c_int,\n    cols: ::core::ffi::c_int,\n    elemSize: ::core::ffi::c_int,\n    A: *const ::core::ffi::c_void,\n    lda: ::core::ffi::c_int,\n    B: *mut ::core::ffi::c_void,\n    ldb: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cublasGetMatrix\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cublasGetMatrix\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(elemSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&elemSize, \"cublasGetMatrix\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasGetMatrix\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasGetMatrix\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasGetMatrix\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasGetMatrix\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasGetMatrix_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rows: i64,\n    cols: i64,\n    elemSize: i64,\n    A: *const ::core::ffi::c_void,\n    lda: i64,\n    B: *mut ::core::ffi::c_void,\n    ldb: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cublasGetMatrix_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cublasGetMatrix_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(elemSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&elemSize, \"cublasGetMatrix_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasGetMatrix_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasGetMatrix_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasGetMatrix_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasGetMatrix_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSetVectorAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    n: ::core::ffi::c_int,\n    elemSize: ::core::ffi::c_int,\n    hostPtr: *const ::core::ffi::c_void,\n    incx: ::core::ffi::c_int,\n    devicePtr: *mut ::core::ffi::c_void,\n    incy: ::core::ffi::c_int,\n    stream: cuda_types::cublas::cudaStream_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSetVectorAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(elemSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&elemSize, \"cublasSetVectorAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hostPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hostPtr, \"cublasSetVectorAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSetVectorAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devicePtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&devicePtr, \"cublasSetVectorAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSetVectorAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cublasSetVectorAsync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSetVectorAsync_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    n: i64,\n    elemSize: i64,\n    hostPtr: *const ::core::ffi::c_void,\n    incx: i64,\n    devicePtr: *mut ::core::ffi::c_void,\n    incy: i64,\n    stream: cuda_types::cublas::cudaStream_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSetVectorAsync_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(elemSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&elemSize, \"cublasSetVectorAsync_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hostPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hostPtr, \"cublasSetVectorAsync_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSetVectorAsync_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devicePtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&devicePtr, \"cublasSetVectorAsync_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSetVectorAsync_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cublasSetVectorAsync_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasGetVectorAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    n: ::core::ffi::c_int,\n    elemSize: ::core::ffi::c_int,\n    devicePtr: *const ::core::ffi::c_void,\n    incx: ::core::ffi::c_int,\n    hostPtr: *mut ::core::ffi::c_void,\n    incy: ::core::ffi::c_int,\n    stream: cuda_types::cublas::cudaStream_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasGetVectorAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(elemSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&elemSize, \"cublasGetVectorAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devicePtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&devicePtr, \"cublasGetVectorAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasGetVectorAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hostPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hostPtr, \"cublasGetVectorAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasGetVectorAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cublasGetVectorAsync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasGetVectorAsync_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    n: i64,\n    elemSize: i64,\n    devicePtr: *const ::core::ffi::c_void,\n    incx: i64,\n    hostPtr: *mut ::core::ffi::c_void,\n    incy: i64,\n    stream: cuda_types::cublas::cudaStream_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasGetVectorAsync_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(elemSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&elemSize, \"cublasGetVectorAsync_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devicePtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&devicePtr, \"cublasGetVectorAsync_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasGetVectorAsync_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hostPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hostPtr, \"cublasGetVectorAsync_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasGetVectorAsync_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cublasGetVectorAsync_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSetMatrixAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rows: ::core::ffi::c_int,\n    cols: ::core::ffi::c_int,\n    elemSize: ::core::ffi::c_int,\n    A: *const ::core::ffi::c_void,\n    lda: ::core::ffi::c_int,\n    B: *mut ::core::ffi::c_void,\n    ldb: ::core::ffi::c_int,\n    stream: cuda_types::cublas::cudaStream_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cublasSetMatrixAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cublasSetMatrixAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(elemSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&elemSize, \"cublasSetMatrixAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSetMatrixAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSetMatrixAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasSetMatrixAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasSetMatrixAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cublasSetMatrixAsync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSetMatrixAsync_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rows: i64,\n    cols: i64,\n    elemSize: i64,\n    A: *const ::core::ffi::c_void,\n    lda: i64,\n    B: *mut ::core::ffi::c_void,\n    ldb: i64,\n    stream: cuda_types::cublas::cudaStream_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cublasSetMatrixAsync_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cublasSetMatrixAsync_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(elemSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&elemSize, \"cublasSetMatrixAsync_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSetMatrixAsync_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSetMatrixAsync_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasSetMatrixAsync_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasSetMatrixAsync_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cublasSetMatrixAsync_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasGetMatrixAsync(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rows: ::core::ffi::c_int,\n    cols: ::core::ffi::c_int,\n    elemSize: ::core::ffi::c_int,\n    A: *const ::core::ffi::c_void,\n    lda: ::core::ffi::c_int,\n    B: *mut ::core::ffi::c_void,\n    ldb: ::core::ffi::c_int,\n    stream: cuda_types::cublas::cudaStream_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cublasGetMatrixAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cublasGetMatrixAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(elemSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&elemSize, \"cublasGetMatrixAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasGetMatrixAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasGetMatrixAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasGetMatrixAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasGetMatrixAsync\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cublasGetMatrixAsync\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasGetMatrixAsync_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rows: i64,\n    cols: i64,\n    elemSize: i64,\n    A: *const ::core::ffi::c_void,\n    lda: i64,\n    B: *mut ::core::ffi::c_void,\n    ldb: i64,\n    stream: cuda_types::cublas::cudaStream_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cublasGetMatrixAsync_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cublasGetMatrixAsync_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(elemSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&elemSize, \"cublasGetMatrixAsync_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasGetMatrixAsync_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasGetMatrixAsync_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasGetMatrixAsync_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasGetMatrixAsync_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cublasGetMatrixAsync_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasXerbla(\n    writer: &mut (impl std::io::Write + ?Sized),\n    srName: *const ::core::ffi::c_char,\n    info: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(srName), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srName, \"cublasXerbla\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cublasXerbla\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasNrm2Ex(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const ::core::ffi::c_void,\n    xType: cuda_types::cublas::cudaDataType,\n    incx: ::core::ffi::c_int,\n    result: *mut ::core::ffi::c_void,\n    resultType: cuda_types::cublas::cudaDataType,\n    executionType: cuda_types::cublas::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasNrm2Ex\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasNrm2Ex\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasNrm2Ex\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xType, \"cublasNrm2Ex\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasNrm2Ex\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasNrm2Ex\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&resultType, \"cublasNrm2Ex\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(executionType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&executionType, \"cublasNrm2Ex\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasNrm2Ex_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const ::core::ffi::c_void,\n    xType: cuda_types::cublas::cudaDataType,\n    incx: i64,\n    result: *mut ::core::ffi::c_void,\n    resultType: cuda_types::cublas::cudaDataType,\n    executionType: cuda_types::cublas::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasNrm2Ex_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasNrm2Ex_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasNrm2Ex_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xType, \"cublasNrm2Ex_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasNrm2Ex_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasNrm2Ex_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&resultType, \"cublasNrm2Ex_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(executionType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&executionType, \"cublasNrm2Ex_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSnrm2_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const f32,\n    incx: ::core::ffi::c_int,\n    result: *mut f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSnrm2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSnrm2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSnrm2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSnrm2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasSnrm2_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSnrm2_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const f32,\n    incx: i64,\n    result: *mut f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSnrm2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSnrm2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSnrm2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSnrm2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasSnrm2_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDnrm2_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const f64,\n    incx: ::core::ffi::c_int,\n    result: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDnrm2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDnrm2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDnrm2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDnrm2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasDnrm2_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDnrm2_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const f64,\n    incx: i64,\n    result: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDnrm2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDnrm2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDnrm2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDnrm2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasDnrm2_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasScnrm2_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n    result: *mut f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasScnrm2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasScnrm2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasScnrm2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasScnrm2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasScnrm2_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasScnrm2_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: i64,\n    result: *mut f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasScnrm2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasScnrm2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasScnrm2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasScnrm2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasScnrm2_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDznrm2_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n    result: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDznrm2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDznrm2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDznrm2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDznrm2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasDznrm2_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDznrm2_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n    result: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDznrm2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDznrm2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDznrm2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDznrm2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasDznrm2_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDotEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const ::core::ffi::c_void,\n    xType: cuda_types::cublas::cudaDataType,\n    incx: ::core::ffi::c_int,\n    y: *const ::core::ffi::c_void,\n    yType: cuda_types::cublas::cudaDataType,\n    incy: ::core::ffi::c_int,\n    result: *mut ::core::ffi::c_void,\n    resultType: cuda_types::cublas::cudaDataType,\n    executionType: cuda_types::cublas::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDotEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDotEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDotEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xType, \"cublasDotEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDotEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDotEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yType, \"cublasDotEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDotEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasDotEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&resultType, \"cublasDotEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(executionType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&executionType, \"cublasDotEx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDotEx_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const ::core::ffi::c_void,\n    xType: cuda_types::cublas::cudaDataType,\n    incx: i64,\n    y: *const ::core::ffi::c_void,\n    yType: cuda_types::cublas::cudaDataType,\n    incy: i64,\n    result: *mut ::core::ffi::c_void,\n    resultType: cuda_types::cublas::cudaDataType,\n    executionType: cuda_types::cublas::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDotEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDotEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDotEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xType, \"cublasDotEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDotEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDotEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yType, \"cublasDotEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDotEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasDotEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&resultType, \"cublasDotEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(executionType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&executionType, \"cublasDotEx_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDotcEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const ::core::ffi::c_void,\n    xType: cuda_types::cublas::cudaDataType,\n    incx: ::core::ffi::c_int,\n    y: *const ::core::ffi::c_void,\n    yType: cuda_types::cublas::cudaDataType,\n    incy: ::core::ffi::c_int,\n    result: *mut ::core::ffi::c_void,\n    resultType: cuda_types::cublas::cudaDataType,\n    executionType: cuda_types::cublas::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDotcEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDotcEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDotcEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xType, \"cublasDotcEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDotcEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDotcEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yType, \"cublasDotcEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDotcEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasDotcEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&resultType, \"cublasDotcEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(executionType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&executionType, \"cublasDotcEx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDotcEx_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const ::core::ffi::c_void,\n    xType: cuda_types::cublas::cudaDataType,\n    incx: i64,\n    y: *const ::core::ffi::c_void,\n    yType: cuda_types::cublas::cudaDataType,\n    incy: i64,\n    result: *mut ::core::ffi::c_void,\n    resultType: cuda_types::cublas::cudaDataType,\n    executionType: cuda_types::cublas::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDotcEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDotcEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDotcEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xType, \"cublasDotcEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDotcEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDotcEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yType, \"cublasDotcEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDotcEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasDotcEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&resultType, \"cublasDotcEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(executionType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&executionType, \"cublasDotcEx_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSdot_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const f32,\n    incx: ::core::ffi::c_int,\n    y: *const f32,\n    incy: ::core::ffi::c_int,\n    result: *mut f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSdot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSdot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSdot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSdot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSdot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSdot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasSdot_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSdot_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const f32,\n    incx: i64,\n    y: *const f32,\n    incy: i64,\n    result: *mut f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSdot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSdot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSdot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSdot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSdot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSdot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasSdot_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDdot_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const f64,\n    incx: ::core::ffi::c_int,\n    y: *const f64,\n    incy: ::core::ffi::c_int,\n    result: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDdot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDdot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDdot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDdot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDdot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDdot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasDdot_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDdot_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const f64,\n    incx: i64,\n    y: *const f64,\n    incy: i64,\n    result: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDdot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDdot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDdot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDdot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDdot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDdot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasDdot_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCdotu_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n    y: *const cuda_types::cublas::cuComplex,\n    incy: ::core::ffi::c_int,\n    result: *mut cuda_types::cublas::cuComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCdotu_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCdotu_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCdotu_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCdotu_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCdotu_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCdotu_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasCdotu_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCdotu_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: i64,\n    y: *const cuda_types::cublas::cuComplex,\n    incy: i64,\n    result: *mut cuda_types::cublas::cuComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCdotu_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCdotu_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCdotu_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCdotu_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCdotu_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCdotu_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasCdotu_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCdotc_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n    y: *const cuda_types::cublas::cuComplex,\n    incy: ::core::ffi::c_int,\n    result: *mut cuda_types::cublas::cuComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCdotc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCdotc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCdotc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCdotc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCdotc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCdotc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasCdotc_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCdotc_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: i64,\n    y: *const cuda_types::cublas::cuComplex,\n    incy: i64,\n    result: *mut cuda_types::cublas::cuComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCdotc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCdotc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCdotc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCdotc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCdotc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCdotc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasCdotc_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZdotu_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n    y: *const cuda_types::cublas::cuDoubleComplex,\n    incy: ::core::ffi::c_int,\n    result: *mut cuda_types::cublas::cuDoubleComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZdotu_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZdotu_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZdotu_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZdotu_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZdotu_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZdotu_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasZdotu_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZdotu_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n    y: *const cuda_types::cublas::cuDoubleComplex,\n    incy: i64,\n    result: *mut cuda_types::cublas::cuDoubleComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZdotu_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZdotu_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZdotu_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZdotu_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZdotu_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZdotu_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasZdotu_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZdotc_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n    y: *const cuda_types::cublas::cuDoubleComplex,\n    incy: ::core::ffi::c_int,\n    result: *mut cuda_types::cublas::cuDoubleComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZdotc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZdotc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZdotc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZdotc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZdotc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZdotc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasZdotc_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZdotc_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n    y: *const cuda_types::cublas::cuDoubleComplex,\n    incy: i64,\n    result: *mut cuda_types::cublas::cuDoubleComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZdotc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZdotc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZdotc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZdotc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZdotc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZdotc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasZdotc_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasScalEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    alpha: *const ::core::ffi::c_void,\n    alphaType: cuda_types::cublas::cudaDataType,\n    x: *mut ::core::ffi::c_void,\n    xType: cuda_types::cublas::cudaDataType,\n    incx: ::core::ffi::c_int,\n    executionType: cuda_types::cublas::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasScalEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasScalEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasScalEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alphaType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alphaType, \"cublasScalEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasScalEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xType, \"cublasScalEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasScalEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(executionType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&executionType, \"cublasScalEx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasScalEx_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    alpha: *const ::core::ffi::c_void,\n    alphaType: cuda_types::cublas::cudaDataType,\n    x: *mut ::core::ffi::c_void,\n    xType: cuda_types::cublas::cudaDataType,\n    incx: i64,\n    executionType: cuda_types::cublas::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasScalEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasScalEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasScalEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alphaType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alphaType, \"cublasScalEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasScalEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xType, \"cublasScalEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasScalEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(executionType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&executionType, \"cublasScalEx_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSscal_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    x: *mut f32,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSscal_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSscal_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSscal_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSscal_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSscal_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSscal_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    alpha: *const f32,\n    x: *mut f32,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSscal_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSscal_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSscal_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSscal_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSscal_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDscal_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    alpha: *const f64,\n    x: *mut f64,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDscal_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDscal_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDscal_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDscal_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDscal_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDscal_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    alpha: *const f64,\n    x: *mut f64,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDscal_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDscal_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDscal_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDscal_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDscal_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCscal_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    x: *mut cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCscal_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCscal_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCscal_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCscal_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCscal_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCscal_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    x: *mut cuda_types::cublas::cuComplex,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCscal_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCscal_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCscal_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCscal_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCscal_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCsscal_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    x: *mut cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCsscal_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCsscal_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCsscal_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCsscal_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCsscal_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCsscal_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    alpha: *const f32,\n    x: *mut cuda_types::cublas::cuComplex,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCsscal_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCsscal_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCsscal_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCsscal_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCsscal_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZscal_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    x: *mut cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZscal_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZscal_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZscal_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZscal_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZscal_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZscal_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    x: *mut cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZscal_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZscal_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZscal_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZscal_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZscal_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZdscal_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    alpha: *const f64,\n    x: *mut cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZdscal_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZdscal_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZdscal_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZdscal_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZdscal_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZdscal_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    alpha: *const f64,\n    x: *mut cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZdscal_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZdscal_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZdscal_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZdscal_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZdscal_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasAxpyEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    alpha: *const ::core::ffi::c_void,\n    alphaType: cuda_types::cublas::cudaDataType,\n    x: *const ::core::ffi::c_void,\n    xType: cuda_types::cublas::cudaDataType,\n    incx: ::core::ffi::c_int,\n    y: *mut ::core::ffi::c_void,\n    yType: cuda_types::cublas::cudaDataType,\n    incy: ::core::ffi::c_int,\n    executiontype: cuda_types::cublas::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasAxpyEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasAxpyEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasAxpyEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alphaType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alphaType, \"cublasAxpyEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasAxpyEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xType, \"cublasAxpyEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasAxpyEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasAxpyEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yType, \"cublasAxpyEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasAxpyEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(executiontype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&executiontype, \"cublasAxpyEx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasAxpyEx_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    alpha: *const ::core::ffi::c_void,\n    alphaType: cuda_types::cublas::cudaDataType,\n    x: *const ::core::ffi::c_void,\n    xType: cuda_types::cublas::cudaDataType,\n    incx: i64,\n    y: *mut ::core::ffi::c_void,\n    yType: cuda_types::cublas::cudaDataType,\n    incy: i64,\n    executiontype: cuda_types::cublas::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasAxpyEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasAxpyEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasAxpyEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alphaType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alphaType, \"cublasAxpyEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasAxpyEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xType, \"cublasAxpyEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasAxpyEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasAxpyEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yType, \"cublasAxpyEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasAxpyEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(executiontype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&executiontype, \"cublasAxpyEx_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSaxpy_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    x: *const f32,\n    incx: ::core::ffi::c_int,\n    y: *mut f32,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSaxpy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSaxpy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSaxpy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSaxpy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSaxpy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSaxpy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSaxpy_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSaxpy_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    alpha: *const f32,\n    x: *const f32,\n    incx: i64,\n    y: *mut f32,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSaxpy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSaxpy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSaxpy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSaxpy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSaxpy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSaxpy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSaxpy_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDaxpy_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    alpha: *const f64,\n    x: *const f64,\n    incx: ::core::ffi::c_int,\n    y: *mut f64,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDaxpy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDaxpy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDaxpy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDaxpy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDaxpy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDaxpy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDaxpy_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDaxpy_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    alpha: *const f64,\n    x: *const f64,\n    incx: i64,\n    y: *mut f64,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDaxpy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDaxpy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDaxpy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDaxpy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDaxpy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDaxpy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDaxpy_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCaxpy_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n    y: *mut cuda_types::cublas::cuComplex,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCaxpy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCaxpy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCaxpy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCaxpy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCaxpy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCaxpy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCaxpy_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCaxpy_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: i64,\n    y: *mut cuda_types::cublas::cuComplex,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCaxpy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCaxpy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCaxpy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCaxpy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCaxpy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCaxpy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCaxpy_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZaxpy_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n    y: *mut cuda_types::cublas::cuDoubleComplex,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZaxpy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZaxpy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZaxpy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZaxpy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZaxpy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZaxpy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZaxpy_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZaxpy_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n    y: *mut cuda_types::cublas::cuDoubleComplex,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZaxpy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZaxpy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZaxpy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZaxpy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZaxpy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZaxpy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZaxpy_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCopyEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const ::core::ffi::c_void,\n    xType: cuda_types::cublas::cudaDataType,\n    incx: ::core::ffi::c_int,\n    y: *mut ::core::ffi::c_void,\n    yType: cuda_types::cublas::cudaDataType,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCopyEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCopyEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCopyEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xType, \"cublasCopyEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCopyEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCopyEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yType, \"cublasCopyEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCopyEx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCopyEx_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const ::core::ffi::c_void,\n    xType: cuda_types::cublas::cudaDataType,\n    incx: i64,\n    y: *mut ::core::ffi::c_void,\n    yType: cuda_types::cublas::cudaDataType,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCopyEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCopyEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCopyEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xType, \"cublasCopyEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCopyEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCopyEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yType, \"cublasCopyEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCopyEx_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasScopy_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const f32,\n    incx: ::core::ffi::c_int,\n    y: *mut f32,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasScopy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasScopy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasScopy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasScopy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasScopy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasScopy_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasScopy_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const f32,\n    incx: i64,\n    y: *mut f32,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasScopy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasScopy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasScopy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasScopy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasScopy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasScopy_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDcopy_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const f64,\n    incx: ::core::ffi::c_int,\n    y: *mut f64,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDcopy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDcopy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDcopy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDcopy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDcopy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDcopy_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDcopy_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const f64,\n    incx: i64,\n    y: *mut f64,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDcopy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDcopy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDcopy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDcopy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDcopy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDcopy_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCcopy_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n    y: *mut cuda_types::cublas::cuComplex,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCcopy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCcopy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCcopy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCcopy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCcopy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCcopy_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCcopy_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: i64,\n    y: *mut cuda_types::cublas::cuComplex,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCcopy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCcopy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCcopy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCcopy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCcopy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCcopy_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZcopy_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n    y: *mut cuda_types::cublas::cuDoubleComplex,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZcopy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZcopy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZcopy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZcopy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZcopy_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZcopy_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZcopy_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n    y: *mut cuda_types::cublas::cuDoubleComplex,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZcopy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZcopy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZcopy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZcopy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZcopy_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZcopy_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSswap_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *mut f32,\n    incx: ::core::ffi::c_int,\n    y: *mut f32,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSswap_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSswap_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSswap_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSswap_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSswap_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSswap_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSswap_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *mut f32,\n    incx: i64,\n    y: *mut f32,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSswap_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSswap_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSswap_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSswap_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSswap_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSswap_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDswap_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *mut f64,\n    incx: ::core::ffi::c_int,\n    y: *mut f64,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDswap_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDswap_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDswap_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDswap_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDswap_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDswap_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDswap_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *mut f64,\n    incx: i64,\n    y: *mut f64,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDswap_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDswap_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDswap_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDswap_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDswap_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDswap_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCswap_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *mut cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n    y: *mut cuda_types::cublas::cuComplex,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCswap_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCswap_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCswap_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCswap_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCswap_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCswap_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCswap_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *mut cuda_types::cublas::cuComplex,\n    incx: i64,\n    y: *mut cuda_types::cublas::cuComplex,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCswap_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCswap_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCswap_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCswap_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCswap_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCswap_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZswap_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *mut cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n    y: *mut cuda_types::cublas::cuDoubleComplex,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZswap_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZswap_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZswap_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZswap_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZswap_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZswap_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZswap_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *mut cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n    y: *mut cuda_types::cublas::cuDoubleComplex,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZswap_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZswap_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZswap_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZswap_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZswap_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZswap_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSwapEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *mut ::core::ffi::c_void,\n    xType: cuda_types::cublas::cudaDataType,\n    incx: ::core::ffi::c_int,\n    y: *mut ::core::ffi::c_void,\n    yType: cuda_types::cublas::cudaDataType,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSwapEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSwapEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSwapEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xType, \"cublasSwapEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSwapEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSwapEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yType, \"cublasSwapEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSwapEx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSwapEx_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *mut ::core::ffi::c_void,\n    xType: cuda_types::cublas::cudaDataType,\n    incx: i64,\n    y: *mut ::core::ffi::c_void,\n    yType: cuda_types::cublas::cudaDataType,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSwapEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSwapEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSwapEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xType, \"cublasSwapEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSwapEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSwapEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yType, \"cublasSwapEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSwapEx_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasIsamax_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const f32,\n    incx: ::core::ffi::c_int,\n    result: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasIsamax_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasIsamax_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasIsamax_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasIsamax_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasIsamax_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasIsamax_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const f32,\n    incx: i64,\n    result: *mut i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasIsamax_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasIsamax_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasIsamax_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasIsamax_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasIsamax_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasIdamax_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const f64,\n    incx: ::core::ffi::c_int,\n    result: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasIdamax_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasIdamax_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasIdamax_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasIdamax_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasIdamax_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasIdamax_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const f64,\n    incx: i64,\n    result: *mut i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasIdamax_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasIdamax_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasIdamax_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasIdamax_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasIdamax_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasIcamax_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n    result: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasIcamax_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasIcamax_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasIcamax_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasIcamax_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasIcamax_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasIcamax_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: i64,\n    result: *mut i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasIcamax_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasIcamax_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasIcamax_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasIcamax_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasIcamax_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasIzamax_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n    result: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasIzamax_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasIzamax_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasIzamax_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasIzamax_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasIzamax_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasIzamax_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n    result: *mut i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasIzamax_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasIzamax_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasIzamax_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasIzamax_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasIzamax_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasIamaxEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const ::core::ffi::c_void,\n    xType: cuda_types::cublas::cudaDataType,\n    incx: ::core::ffi::c_int,\n    result: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasIamaxEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasIamaxEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasIamaxEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xType, \"cublasIamaxEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasIamaxEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasIamaxEx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasIamaxEx_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const ::core::ffi::c_void,\n    xType: cuda_types::cublas::cudaDataType,\n    incx: i64,\n    result: *mut i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasIamaxEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasIamaxEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasIamaxEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xType, \"cublasIamaxEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasIamaxEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasIamaxEx_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasIsamin_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const f32,\n    incx: ::core::ffi::c_int,\n    result: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasIsamin_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasIsamin_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasIsamin_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasIsamin_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasIsamin_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasIsamin_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const f32,\n    incx: i64,\n    result: *mut i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasIsamin_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasIsamin_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasIsamin_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasIsamin_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasIsamin_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasIdamin_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const f64,\n    incx: ::core::ffi::c_int,\n    result: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasIdamin_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasIdamin_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasIdamin_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasIdamin_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasIdamin_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasIdamin_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const f64,\n    incx: i64,\n    result: *mut i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasIdamin_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasIdamin_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasIdamin_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasIdamin_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasIdamin_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasIcamin_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n    result: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasIcamin_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasIcamin_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasIcamin_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasIcamin_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasIcamin_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasIcamin_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: i64,\n    result: *mut i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasIcamin_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasIcamin_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasIcamin_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasIcamin_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasIcamin_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasIzamin_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n    result: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasIzamin_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasIzamin_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasIzamin_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasIzamin_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasIzamin_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasIzamin_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n    result: *mut i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasIzamin_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasIzamin_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasIzamin_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasIzamin_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasIzamin_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasIaminEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const ::core::ffi::c_void,\n    xType: cuda_types::cublas::cudaDataType,\n    incx: ::core::ffi::c_int,\n    result: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasIaminEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasIaminEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasIaminEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xType, \"cublasIaminEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasIaminEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasIaminEx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasIaminEx_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const ::core::ffi::c_void,\n    xType: cuda_types::cublas::cudaDataType,\n    incx: i64,\n    result: *mut i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasIaminEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasIaminEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasIaminEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xType, \"cublasIaminEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasIaminEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasIaminEx_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasAsumEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const ::core::ffi::c_void,\n    xType: cuda_types::cublas::cudaDataType,\n    incx: ::core::ffi::c_int,\n    result: *mut ::core::ffi::c_void,\n    resultType: cuda_types::cublas::cudaDataType,\n    executiontype: cuda_types::cublas::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasAsumEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasAsumEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasAsumEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xType, \"cublasAsumEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasAsumEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasAsumEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&resultType, \"cublasAsumEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(executiontype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&executiontype, \"cublasAsumEx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasAsumEx_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const ::core::ffi::c_void,\n    xType: cuda_types::cublas::cudaDataType,\n    incx: i64,\n    result: *mut ::core::ffi::c_void,\n    resultType: cuda_types::cublas::cudaDataType,\n    executiontype: cuda_types::cublas::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasAsumEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasAsumEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasAsumEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xType, \"cublasAsumEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasAsumEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasAsumEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&resultType, \"cublasAsumEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(executiontype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&executiontype, \"cublasAsumEx_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSasum_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const f32,\n    incx: ::core::ffi::c_int,\n    result: *mut f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSasum_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSasum_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSasum_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSasum_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasSasum_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSasum_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const f32,\n    incx: i64,\n    result: *mut f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSasum_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSasum_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSasum_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSasum_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasSasum_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDasum_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const f64,\n    incx: ::core::ffi::c_int,\n    result: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDasum_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDasum_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDasum_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDasum_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasDasum_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDasum_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const f64,\n    incx: i64,\n    result: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDasum_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDasum_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDasum_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDasum_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasDasum_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasScasum_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n    result: *mut f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasScasum_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasScasum_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasScasum_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasScasum_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasScasum_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasScasum_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: i64,\n    result: *mut f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasScasum_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasScasum_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasScasum_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasScasum_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasScasum_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDzasum_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n    result: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDzasum_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDzasum_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDzasum_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDzasum_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasDzasum_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDzasum_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n    result: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDzasum_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDzasum_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDzasum_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDzasum_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasDzasum_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSrot_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *mut f32,\n    incx: ::core::ffi::c_int,\n    y: *mut f32,\n    incy: ::core::ffi::c_int,\n    c: *const f32,\n    s: *const f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cublasSrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(s), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&s, \"cublasSrot_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSrot_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *mut f32,\n    incx: i64,\n    y: *mut f32,\n    incy: i64,\n    c: *const f32,\n    s: *const f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cublasSrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(s), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&s, \"cublasSrot_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDrot_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *mut f64,\n    incx: ::core::ffi::c_int,\n    y: *mut f64,\n    incy: ::core::ffi::c_int,\n    c: *const f64,\n    s: *const f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cublasDrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(s), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&s, \"cublasDrot_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDrot_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *mut f64,\n    incx: i64,\n    y: *mut f64,\n    incy: i64,\n    c: *const f64,\n    s: *const f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cublasDrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(s), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&s, \"cublasDrot_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCrot_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *mut cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n    y: *mut cuda_types::cublas::cuComplex,\n    incy: ::core::ffi::c_int,\n    c: *const f32,\n    s: *const cuda_types::cublas::cuComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cublasCrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(s), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&s, \"cublasCrot_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCrot_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *mut cuda_types::cublas::cuComplex,\n    incx: i64,\n    y: *mut cuda_types::cublas::cuComplex,\n    incy: i64,\n    c: *const f32,\n    s: *const cuda_types::cublas::cuComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cublasCrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(s), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&s, \"cublasCrot_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCsrot_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *mut cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n    y: *mut cuda_types::cublas::cuComplex,\n    incy: ::core::ffi::c_int,\n    c: *const f32,\n    s: *const f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCsrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCsrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCsrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCsrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCsrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCsrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cublasCsrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(s), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&s, \"cublasCsrot_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCsrot_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *mut cuda_types::cublas::cuComplex,\n    incx: i64,\n    y: *mut cuda_types::cublas::cuComplex,\n    incy: i64,\n    c: *const f32,\n    s: *const f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCsrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCsrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCsrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCsrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCsrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCsrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cublasCsrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(s), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&s, \"cublasCsrot_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZrot_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *mut cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n    y: *mut cuda_types::cublas::cuDoubleComplex,\n    incy: ::core::ffi::c_int,\n    c: *const f64,\n    s: *const cuda_types::cublas::cuDoubleComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cublasZrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(s), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&s, \"cublasZrot_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZrot_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *mut cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n    y: *mut cuda_types::cublas::cuDoubleComplex,\n    incy: i64,\n    c: *const f64,\n    s: *const cuda_types::cublas::cuDoubleComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cublasZrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(s), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&s, \"cublasZrot_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZdrot_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *mut cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n    y: *mut cuda_types::cublas::cuDoubleComplex,\n    incy: ::core::ffi::c_int,\n    c: *const f64,\n    s: *const f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZdrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZdrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZdrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZdrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZdrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZdrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cublasZdrot_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(s), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&s, \"cublasZdrot_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZdrot_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *mut cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n    y: *mut cuda_types::cublas::cuDoubleComplex,\n    incy: i64,\n    c: *const f64,\n    s: *const f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZdrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZdrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZdrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZdrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZdrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZdrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cublasZdrot_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(s), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&s, \"cublasZdrot_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasRotEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *mut ::core::ffi::c_void,\n    xType: cuda_types::cublas::cudaDataType,\n    incx: ::core::ffi::c_int,\n    y: *mut ::core::ffi::c_void,\n    yType: cuda_types::cublas::cudaDataType,\n    incy: ::core::ffi::c_int,\n    c: *const ::core::ffi::c_void,\n    s: *const ::core::ffi::c_void,\n    csType: cuda_types::cublas::cudaDataType,\n    executiontype: cuda_types::cublas::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasRotEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasRotEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasRotEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xType, \"cublasRotEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasRotEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasRotEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yType, \"cublasRotEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasRotEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cublasRotEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(s), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&s, \"cublasRotEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csType, \"cublasRotEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(executiontype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&executiontype, \"cublasRotEx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasRotEx_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *mut ::core::ffi::c_void,\n    xType: cuda_types::cublas::cudaDataType,\n    incx: i64,\n    y: *mut ::core::ffi::c_void,\n    yType: cuda_types::cublas::cudaDataType,\n    incy: i64,\n    c: *const ::core::ffi::c_void,\n    s: *const ::core::ffi::c_void,\n    csType: cuda_types::cublas::cudaDataType,\n    executiontype: cuda_types::cublas::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasRotEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasRotEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasRotEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xType, \"cublasRotEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasRotEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasRotEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yType, \"cublasRotEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasRotEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cublasRotEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(s), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&s, \"cublasRotEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csType, \"cublasRotEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(executiontype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&executiontype, \"cublasRotEx_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSrotg_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    a: *mut f32,\n    b: *mut f32,\n    c: *mut f32,\n    s: *mut f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSrotg_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(a), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&a, \"cublasSrotg_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(b), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&b, \"cublasSrotg_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cublasSrotg_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(s), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&s, \"cublasSrotg_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDrotg_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    a: *mut f64,\n    b: *mut f64,\n    c: *mut f64,\n    s: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDrotg_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(a), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&a, \"cublasDrotg_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(b), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&b, \"cublasDrotg_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cublasDrotg_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(s), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&s, \"cublasDrotg_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCrotg_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    a: *mut cuda_types::cublas::cuComplex,\n    b: *mut cuda_types::cublas::cuComplex,\n    c: *mut f32,\n    s: *mut cuda_types::cublas::cuComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCrotg_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(a), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&a, \"cublasCrotg_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(b), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&b, \"cublasCrotg_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cublasCrotg_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(s), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&s, \"cublasCrotg_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZrotg_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    a: *mut cuda_types::cublas::cuDoubleComplex,\n    b: *mut cuda_types::cublas::cuDoubleComplex,\n    c: *mut f64,\n    s: *mut cuda_types::cublas::cuDoubleComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZrotg_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(a), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&a, \"cublasZrotg_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(b), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&b, \"cublasZrotg_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cublasZrotg_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(s), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&s, \"cublasZrotg_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasRotgEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    a: *mut ::core::ffi::c_void,\n    b: *mut ::core::ffi::c_void,\n    abType: cuda_types::cublas::cudaDataType,\n    c: *mut ::core::ffi::c_void,\n    s: *mut ::core::ffi::c_void,\n    csType: cuda_types::cublas::cudaDataType,\n    executiontype: cuda_types::cublas::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasRotgEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(a), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&a, \"cublasRotgEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(b), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&b, \"cublasRotgEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(abType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&abType, \"cublasRotgEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cublasRotgEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(s), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&s, \"cublasRotgEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csType, \"cublasRotgEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(executiontype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&executiontype, \"cublasRotgEx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSrotm_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *mut f32,\n    incx: ::core::ffi::c_int,\n    y: *mut f32,\n    incy: ::core::ffi::c_int,\n    param: *const f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSrotm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSrotm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSrotm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSrotm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSrotm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSrotm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param, \"cublasSrotm_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSrotm_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *mut f32,\n    incx: i64,\n    y: *mut f32,\n    incy: i64,\n    param: *const f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSrotm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSrotm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSrotm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSrotm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSrotm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSrotm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param, \"cublasSrotm_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDrotm_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *mut f64,\n    incx: ::core::ffi::c_int,\n    y: *mut f64,\n    incy: ::core::ffi::c_int,\n    param: *const f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDrotm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDrotm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDrotm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDrotm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDrotm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDrotm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param, \"cublasDrotm_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDrotm_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *mut f64,\n    incx: i64,\n    y: *mut f64,\n    incy: i64,\n    param: *const f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDrotm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDrotm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDrotm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDrotm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDrotm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDrotm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param, \"cublasDrotm_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasRotmEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    x: *mut ::core::ffi::c_void,\n    xType: cuda_types::cublas::cudaDataType,\n    incx: ::core::ffi::c_int,\n    y: *mut ::core::ffi::c_void,\n    yType: cuda_types::cublas::cudaDataType,\n    incy: ::core::ffi::c_int,\n    param: *const ::core::ffi::c_void,\n    paramType: cuda_types::cublas::cudaDataType,\n    executiontype: cuda_types::cublas::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasRotmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasRotmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasRotmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xType, \"cublasRotmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasRotmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasRotmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yType, \"cublasRotmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasRotmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param, \"cublasRotmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paramType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&paramType, \"cublasRotmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(executiontype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&executiontype, \"cublasRotmEx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasRotmEx_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: i64,\n    x: *mut ::core::ffi::c_void,\n    xType: cuda_types::cublas::cudaDataType,\n    incx: i64,\n    y: *mut ::core::ffi::c_void,\n    yType: cuda_types::cublas::cudaDataType,\n    incy: i64,\n    param: *const ::core::ffi::c_void,\n    paramType: cuda_types::cublas::cudaDataType,\n    executiontype: cuda_types::cublas::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasRotmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasRotmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasRotmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xType, \"cublasRotmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasRotmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasRotmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yType, \"cublasRotmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasRotmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param, \"cublasRotmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paramType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&paramType, \"cublasRotmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(executiontype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&executiontype, \"cublasRotmEx_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSrotmg_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    d1: *mut f32,\n    d2: *mut f32,\n    x1: *mut f32,\n    y1: *const f32,\n    param: *mut f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSrotmg_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d1, \"cublasSrotmg_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d2, \"cublasSrotmg_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x1, \"cublasSrotmg_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y1, \"cublasSrotmg_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param, \"cublasSrotmg_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDrotmg_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    d1: *mut f64,\n    d2: *mut f64,\n    x1: *mut f64,\n    y1: *const f64,\n    param: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDrotmg_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d1, \"cublasDrotmg_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d2, \"cublasDrotmg_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x1, \"cublasDrotmg_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y1, \"cublasDrotmg_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param, \"cublasDrotmg_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasRotmgEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    d1: *mut ::core::ffi::c_void,\n    d1Type: cuda_types::cublas::cudaDataType,\n    d2: *mut ::core::ffi::c_void,\n    d2Type: cuda_types::cublas::cudaDataType,\n    x1: *mut ::core::ffi::c_void,\n    x1Type: cuda_types::cublas::cudaDataType,\n    y1: *const ::core::ffi::c_void,\n    y1Type: cuda_types::cublas::cudaDataType,\n    param: *mut ::core::ffi::c_void,\n    paramType: cuda_types::cublas::cudaDataType,\n    executiontype: cuda_types::cublas::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasRotmgEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d1, \"cublasRotmgEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d1Type), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d1Type, \"cublasRotmgEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d2, \"cublasRotmgEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d2Type), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d2Type, \"cublasRotmgEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x1, \"cublasRotmgEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x1Type), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x1Type, \"cublasRotmgEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y1, \"cublasRotmgEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y1Type), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y1Type, \"cublasRotmgEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param, \"cublasRotmgEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paramType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&paramType, \"cublasRotmgEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(executiontype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&executiontype, \"cublasRotmgEx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSgemv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    A: *const f32,\n    lda: ::core::ffi::c_int,\n    x: *const f32,\n    incx: ::core::ffi::c_int,\n    beta: *const f32,\n    y: *mut f32,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasSgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasSgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSgemv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSgemv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    alpha: *const f32,\n    A: *const f32,\n    lda: i64,\n    x: *const f32,\n    incx: i64,\n    beta: *const f32,\n    y: *mut f32,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasSgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasSgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSgemv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDgemv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f64,\n    A: *const f64,\n    lda: ::core::ffi::c_int,\n    x: *const f64,\n    incx: ::core::ffi::c_int,\n    beta: *const f64,\n    y: *mut f64,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDgemv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDgemv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    alpha: *const f64,\n    A: *const f64,\n    lda: i64,\n    x: *const f64,\n    incx: i64,\n    beta: *const f64,\n    y: *mut f64,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDgemv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgemv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuComplex,\n    y: *mut cuda_types::cublas::cuComplex,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCgemv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgemv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: i64,\n    beta: *const cuda_types::cublas::cuComplex,\n    y: *mut cuda_types::cublas::cuComplex,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCgemv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZgemv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    y: *mut cuda_types::cublas::cuDoubleComplex,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZgemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZgemv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZgemv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    y: *mut cuda_types::cublas::cuDoubleComplex,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZgemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZgemv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSgbmv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    kl: ::core::ffi::c_int,\n    ku: ::core::ffi::c_int,\n    alpha: *const f32,\n    A: *const f32,\n    lda: ::core::ffi::c_int,\n    x: *const f32,\n    incx: ::core::ffi::c_int,\n    beta: *const f32,\n    y: *mut f32,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasSgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasSgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kl, \"cublasSgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ku), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ku, \"cublasSgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSgbmv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSgbmv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    kl: i64,\n    ku: i64,\n    alpha: *const f32,\n    A: *const f32,\n    lda: i64,\n    x: *const f32,\n    incx: i64,\n    beta: *const f32,\n    y: *mut f32,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasSgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasSgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kl, \"cublasSgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ku), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ku, \"cublasSgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSgbmv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDgbmv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    kl: ::core::ffi::c_int,\n    ku: ::core::ffi::c_int,\n    alpha: *const f64,\n    A: *const f64,\n    lda: ::core::ffi::c_int,\n    x: *const f64,\n    incx: ::core::ffi::c_int,\n    beta: *const f64,\n    y: *mut f64,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kl, \"cublasDgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ku), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ku, \"cublasDgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDgbmv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDgbmv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    kl: i64,\n    ku: i64,\n    alpha: *const f64,\n    A: *const f64,\n    lda: i64,\n    x: *const f64,\n    incx: i64,\n    beta: *const f64,\n    y: *mut f64,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kl, \"cublasDgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ku), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ku, \"cublasDgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDgbmv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgbmv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    kl: ::core::ffi::c_int,\n    ku: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuComplex,\n    y: *mut cuda_types::cublas::cuComplex,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kl, \"cublasCgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ku), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ku, \"cublasCgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCgbmv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgbmv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    kl: i64,\n    ku: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: i64,\n    beta: *const cuda_types::cublas::cuComplex,\n    y: *mut cuda_types::cublas::cuComplex,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kl, \"cublasCgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ku), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ku, \"cublasCgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCgbmv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZgbmv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    kl: ::core::ffi::c_int,\n    ku: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    y: *mut cuda_types::cublas::cuDoubleComplex,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kl, \"cublasZgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ku), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ku, \"cublasZgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZgbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZgbmv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZgbmv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    kl: i64,\n    ku: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    y: *mut cuda_types::cublas::cuDoubleComplex,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kl, \"cublasZgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ku), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ku, \"cublasZgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZgbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZgbmv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasStrmv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: ::core::ffi::c_int,\n    A: *const f32,\n    lda: ::core::ffi::c_int,\n    x: *mut f32,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasStrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasStrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasStrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasStrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasStrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasStrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasStrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasStrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasStrmv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasStrmv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: i64,\n    A: *const f32,\n    lda: i64,\n    x: *mut f32,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasStrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasStrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasStrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasStrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasStrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasStrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasStrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasStrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasStrmv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDtrmv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: ::core::ffi::c_int,\n    A: *const f64,\n    lda: ::core::ffi::c_int,\n    x: *mut f64,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDtrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDtrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDtrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasDtrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDtrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDtrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDtrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDtrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDtrmv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDtrmv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: i64,\n    A: *const f64,\n    lda: i64,\n    x: *mut f64,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDtrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDtrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDtrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasDtrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDtrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDtrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDtrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDtrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDtrmv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCtrmv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: ::core::ffi::c_int,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    x: *mut cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCtrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCtrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCtrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasCtrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCtrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCtrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCtrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCtrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCtrmv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCtrmv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: i64,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    x: *mut cuda_types::cublas::cuComplex,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCtrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCtrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCtrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasCtrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCtrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCtrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCtrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCtrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCtrmv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZtrmv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: ::core::ffi::c_int,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    x: *mut cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZtrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZtrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZtrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasZtrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZtrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZtrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZtrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZtrmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZtrmv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZtrmv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: i64,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n    x: *mut cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZtrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZtrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZtrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasZtrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZtrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZtrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZtrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZtrmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZtrmv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasStbmv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    A: *const f32,\n    lda: ::core::ffi::c_int,\n    x: *mut f32,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasStbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasStbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasStbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasStbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasStbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasStbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasStbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasStbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasStbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasStbmv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasStbmv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: i64,\n    k: i64,\n    A: *const f32,\n    lda: i64,\n    x: *mut f32,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasStbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasStbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasStbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasStbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasStbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasStbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasStbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasStbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasStbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasStbmv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDtbmv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    A: *const f64,\n    lda: ::core::ffi::c_int,\n    x: *mut f64,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDtbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDtbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDtbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasDtbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDtbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasDtbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDtbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDtbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDtbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDtbmv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDtbmv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: i64,\n    k: i64,\n    A: *const f64,\n    lda: i64,\n    x: *mut f64,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDtbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDtbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDtbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasDtbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDtbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasDtbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDtbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDtbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDtbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDtbmv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCtbmv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    x: *mut cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCtbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCtbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCtbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasCtbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCtbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCtbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCtbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCtbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCtbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCtbmv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCtbmv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: i64,\n    k: i64,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    x: *mut cuda_types::cublas::cuComplex,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCtbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCtbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCtbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasCtbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCtbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCtbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCtbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCtbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCtbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCtbmv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZtbmv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    x: *mut cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZtbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZtbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZtbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasZtbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZtbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasZtbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZtbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZtbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZtbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZtbmv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZtbmv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: i64,\n    k: i64,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n    x: *mut cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZtbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZtbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZtbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasZtbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZtbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasZtbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZtbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZtbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZtbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZtbmv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasStpmv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: ::core::ffi::c_int,\n    AP: *const f32,\n    x: *mut f32,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasStpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasStpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasStpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasStpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasStpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasStpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasStpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasStpmv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasStpmv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: i64,\n    AP: *const f32,\n    x: *mut f32,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasStpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasStpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasStpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasStpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasStpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasStpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasStpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasStpmv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDtpmv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: ::core::ffi::c_int,\n    AP: *const f64,\n    x: *mut f64,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDtpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDtpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDtpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasDtpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDtpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasDtpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDtpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDtpmv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDtpmv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: i64,\n    AP: *const f64,\n    x: *mut f64,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDtpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDtpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDtpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasDtpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDtpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasDtpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDtpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDtpmv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCtpmv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: ::core::ffi::c_int,\n    AP: *const cuda_types::cublas::cuComplex,\n    x: *mut cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCtpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCtpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCtpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasCtpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCtpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasCtpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCtpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCtpmv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCtpmv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: i64,\n    AP: *const cuda_types::cublas::cuComplex,\n    x: *mut cuda_types::cublas::cuComplex,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCtpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCtpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCtpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasCtpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCtpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasCtpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCtpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCtpmv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZtpmv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: ::core::ffi::c_int,\n    AP: *const cuda_types::cublas::cuDoubleComplex,\n    x: *mut cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZtpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZtpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZtpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasZtpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZtpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasZtpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZtpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZtpmv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZtpmv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: i64,\n    AP: *const cuda_types::cublas::cuDoubleComplex,\n    x: *mut cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZtpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZtpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZtpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasZtpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZtpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasZtpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZtpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZtpmv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasStrsv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: ::core::ffi::c_int,\n    A: *const f32,\n    lda: ::core::ffi::c_int,\n    x: *mut f32,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasStrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasStrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasStrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasStrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasStrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasStrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasStrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasStrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasStrsv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasStrsv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: i64,\n    A: *const f32,\n    lda: i64,\n    x: *mut f32,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasStrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasStrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasStrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasStrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasStrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasStrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasStrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasStrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasStrsv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDtrsv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: ::core::ffi::c_int,\n    A: *const f64,\n    lda: ::core::ffi::c_int,\n    x: *mut f64,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDtrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDtrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDtrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasDtrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDtrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDtrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDtrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDtrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDtrsv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDtrsv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: i64,\n    A: *const f64,\n    lda: i64,\n    x: *mut f64,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDtrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDtrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDtrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasDtrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDtrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDtrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDtrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDtrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDtrsv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCtrsv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: ::core::ffi::c_int,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    x: *mut cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCtrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCtrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCtrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasCtrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCtrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCtrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCtrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCtrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCtrsv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCtrsv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: i64,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    x: *mut cuda_types::cublas::cuComplex,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCtrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCtrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCtrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasCtrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCtrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCtrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCtrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCtrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCtrsv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZtrsv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: ::core::ffi::c_int,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    x: *mut cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZtrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZtrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZtrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasZtrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZtrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZtrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZtrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZtrsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZtrsv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZtrsv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: i64,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n    x: *mut cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZtrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZtrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZtrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasZtrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZtrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZtrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZtrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZtrsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZtrsv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasStpsv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: ::core::ffi::c_int,\n    AP: *const f32,\n    x: *mut f32,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasStpsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasStpsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasStpsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasStpsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasStpsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasStpsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasStpsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasStpsv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasStpsv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: i64,\n    AP: *const f32,\n    x: *mut f32,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasStpsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasStpsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasStpsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasStpsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasStpsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasStpsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasStpsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasStpsv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDtpsv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: ::core::ffi::c_int,\n    AP: *const f64,\n    x: *mut f64,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDtpsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDtpsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDtpsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasDtpsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDtpsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasDtpsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDtpsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDtpsv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDtpsv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: i64,\n    AP: *const f64,\n    x: *mut f64,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDtpsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDtpsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDtpsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasDtpsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDtpsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasDtpsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDtpsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDtpsv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCtpsv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: ::core::ffi::c_int,\n    AP: *const cuda_types::cublas::cuComplex,\n    x: *mut cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCtpsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCtpsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCtpsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasCtpsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCtpsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasCtpsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCtpsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCtpsv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCtpsv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: i64,\n    AP: *const cuda_types::cublas::cuComplex,\n    x: *mut cuda_types::cublas::cuComplex,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCtpsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCtpsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCtpsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasCtpsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCtpsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasCtpsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCtpsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCtpsv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZtpsv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: ::core::ffi::c_int,\n    AP: *const cuda_types::cublas::cuDoubleComplex,\n    x: *mut cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZtpsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZtpsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZtpsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasZtpsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZtpsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasZtpsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZtpsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZtpsv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZtpsv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: i64,\n    AP: *const cuda_types::cublas::cuDoubleComplex,\n    x: *mut cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZtpsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZtpsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZtpsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasZtpsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZtpsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasZtpsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZtpsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZtpsv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasStbsv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    A: *const f32,\n    lda: ::core::ffi::c_int,\n    x: *mut f32,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasStbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasStbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasStbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasStbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasStbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasStbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasStbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasStbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasStbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasStbsv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasStbsv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: i64,\n    k: i64,\n    A: *const f32,\n    lda: i64,\n    x: *mut f32,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasStbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasStbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasStbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasStbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasStbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasStbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasStbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasStbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasStbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasStbsv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDtbsv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    A: *const f64,\n    lda: ::core::ffi::c_int,\n    x: *mut f64,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDtbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDtbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDtbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasDtbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDtbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasDtbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDtbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDtbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDtbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDtbsv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDtbsv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: i64,\n    k: i64,\n    A: *const f64,\n    lda: i64,\n    x: *mut f64,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDtbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDtbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDtbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasDtbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDtbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasDtbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDtbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDtbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDtbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDtbsv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCtbsv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    x: *mut cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCtbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCtbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCtbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasCtbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCtbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCtbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCtbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCtbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCtbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCtbsv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCtbsv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: i64,\n    k: i64,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    x: *mut cuda_types::cublas::cuComplex,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCtbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCtbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCtbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasCtbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCtbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCtbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCtbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCtbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCtbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCtbsv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZtbsv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    x: *mut cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZtbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZtbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZtbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasZtbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZtbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasZtbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZtbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZtbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZtbsv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZtbsv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZtbsv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    n: i64,\n    k: i64,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n    x: *mut cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZtbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZtbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZtbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasZtbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZtbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasZtbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZtbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZtbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZtbsv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZtbsv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSsymv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    A: *const f32,\n    lda: ::core::ffi::c_int,\n    x: *const f32,\n    incx: ::core::ffi::c_int,\n    beta: *const f32,\n    y: *mut f32,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasSsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSsymv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSsymv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const f32,\n    A: *const f32,\n    lda: i64,\n    x: *const f32,\n    incx: i64,\n    beta: *const f32,\n    y: *mut f32,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasSsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSsymv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDsymv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const f64,\n    A: *const f64,\n    lda: ::core::ffi::c_int,\n    x: *const f64,\n    incx: ::core::ffi::c_int,\n    beta: *const f64,\n    y: *mut f64,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDsymv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDsymv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const f64,\n    A: *const f64,\n    lda: i64,\n    x: *const f64,\n    incx: i64,\n    beta: *const f64,\n    y: *mut f64,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDsymv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCsymv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuComplex,\n    y: *mut cuda_types::cublas::cuComplex,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCsymv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCsymv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: i64,\n    beta: *const cuda_types::cublas::cuComplex,\n    y: *mut cuda_types::cublas::cuComplex,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCsymv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZsymv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    y: *mut cuda_types::cublas::cuDoubleComplex,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZsymv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZsymv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZsymv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    y: *mut cuda_types::cublas::cuDoubleComplex,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZsymv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZsymv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasChemv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuComplex,\n    y: *mut cuda_types::cublas::cuComplex,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasChemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasChemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasChemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasChemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasChemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasChemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasChemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasChemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasChemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasChemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasChemv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasChemv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: i64,\n    beta: *const cuda_types::cublas::cuComplex,\n    y: *mut cuda_types::cublas::cuComplex,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasChemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasChemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasChemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasChemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasChemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasChemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasChemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasChemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasChemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasChemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasChemv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZhemv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    y: *mut cuda_types::cublas::cuDoubleComplex,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZhemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZhemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZhemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZhemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZhemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZhemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZhemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZhemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZhemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZhemv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZhemv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZhemv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    y: *mut cuda_types::cublas::cuDoubleComplex,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZhemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZhemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZhemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZhemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZhemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZhemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZhemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZhemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZhemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZhemv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZhemv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSsbmv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const f32,\n    A: *const f32,\n    lda: ::core::ffi::c_int,\n    x: *const f32,\n    incx: ::core::ffi::c_int,\n    beta: *const f32,\n    y: *mut f32,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSsbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasSsbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSsbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasSsbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSsbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSsbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSsbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSsbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSsbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSsbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSsbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSsbmv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSsbmv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    k: i64,\n    alpha: *const f32,\n    A: *const f32,\n    lda: i64,\n    x: *const f32,\n    incx: i64,\n    beta: *const f32,\n    y: *mut f32,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSsbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasSsbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSsbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasSsbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSsbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSsbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSsbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSsbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSsbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSsbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSsbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSsbmv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDsbmv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const f64,\n    A: *const f64,\n    lda: ::core::ffi::c_int,\n    x: *const f64,\n    incx: ::core::ffi::c_int,\n    beta: *const f64,\n    y: *mut f64,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDsbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDsbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDsbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasDsbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDsbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDsbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDsbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDsbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDsbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDsbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDsbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDsbmv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDsbmv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    k: i64,\n    alpha: *const f64,\n    A: *const f64,\n    lda: i64,\n    x: *const f64,\n    incx: i64,\n    beta: *const f64,\n    y: *mut f64,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDsbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDsbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDsbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasDsbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDsbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDsbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDsbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDsbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDsbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDsbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDsbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDsbmv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasChbmv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuComplex,\n    y: *mut cuda_types::cublas::cuComplex,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasChbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasChbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasChbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasChbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasChbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasChbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasChbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasChbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasChbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasChbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasChbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasChbmv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasChbmv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: i64,\n    beta: *const cuda_types::cublas::cuComplex,\n    y: *mut cuda_types::cublas::cuComplex,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasChbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasChbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasChbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasChbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasChbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasChbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasChbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasChbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasChbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasChbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasChbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasChbmv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZhbmv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    y: *mut cuda_types::cublas::cuDoubleComplex,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZhbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZhbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZhbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasZhbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZhbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZhbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZhbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZhbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZhbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZhbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZhbmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZhbmv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZhbmv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    y: *mut cuda_types::cublas::cuDoubleComplex,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZhbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZhbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZhbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasZhbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZhbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZhbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZhbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZhbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZhbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZhbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZhbmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZhbmv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSspmv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    AP: *const f32,\n    x: *const f32,\n    incx: ::core::ffi::c_int,\n    beta: *const f32,\n    y: *mut f32,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSspmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasSspmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSspmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSspmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasSspmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSspmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSspmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSspmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSspmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSspmv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSspmv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const f32,\n    AP: *const f32,\n    x: *const f32,\n    incx: i64,\n    beta: *const f32,\n    y: *mut f32,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSspmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasSspmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSspmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSspmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasSspmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSspmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSspmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSspmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSspmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSspmv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDspmv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const f64,\n    AP: *const f64,\n    x: *const f64,\n    incx: ::core::ffi::c_int,\n    beta: *const f64,\n    y: *mut f64,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDspmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDspmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDspmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDspmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasDspmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDspmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDspmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDspmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDspmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDspmv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDspmv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const f64,\n    AP: *const f64,\n    x: *const f64,\n    incx: i64,\n    beta: *const f64,\n    y: *mut f64,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDspmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDspmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDspmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDspmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasDspmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDspmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDspmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDspmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDspmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDspmv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasChpmv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    AP: *const cuda_types::cublas::cuComplex,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuComplex,\n    y: *mut cuda_types::cublas::cuComplex,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasChpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasChpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasChpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasChpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasChpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasChpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasChpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasChpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasChpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasChpmv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasChpmv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    AP: *const cuda_types::cublas::cuComplex,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: i64,\n    beta: *const cuda_types::cublas::cuComplex,\n    y: *mut cuda_types::cublas::cuComplex,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasChpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasChpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasChpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasChpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasChpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasChpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasChpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasChpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasChpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasChpmv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZhpmv_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    AP: *const cuda_types::cublas::cuDoubleComplex,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    y: *mut cuda_types::cublas::cuDoubleComplex,\n    incy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZhpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZhpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZhpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZhpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasZhpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZhpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZhpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZhpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZhpmv_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZhpmv_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZhpmv_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    AP: *const cuda_types::cublas::cuDoubleComplex,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    y: *mut cuda_types::cublas::cuDoubleComplex,\n    incy: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZhpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZhpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZhpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZhpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasZhpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZhpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZhpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZhpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZhpmv_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZhpmv_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSger_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    x: *const f32,\n    incx: ::core::ffi::c_int,\n    y: *const f32,\n    incy: ::core::ffi::c_int,\n    A: *mut f32,\n    lda: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSger_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasSger_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSger_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSger_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSger_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSger_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSger_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSger_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSger_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSger_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSger_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    m: i64,\n    n: i64,\n    alpha: *const f32,\n    x: *const f32,\n    incx: i64,\n    y: *const f32,\n    incy: i64,\n    A: *mut f32,\n    lda: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSger_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasSger_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSger_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSger_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSger_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSger_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSger_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSger_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSger_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSger_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDger_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f64,\n    x: *const f64,\n    incx: ::core::ffi::c_int,\n    y: *const f64,\n    incy: ::core::ffi::c_int,\n    A: *mut f64,\n    lda: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDger_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDger_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDger_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDger_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDger_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDger_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDger_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDger_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDger_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDger_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDger_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    m: i64,\n    n: i64,\n    alpha: *const f64,\n    x: *const f64,\n    incx: i64,\n    y: *const f64,\n    incy: i64,\n    A: *mut f64,\n    lda: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDger_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDger_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDger_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDger_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDger_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDger_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDger_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDger_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDger_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDger_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgeru_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n    y: *const cuda_types::cublas::cuComplex,\n    incy: ::core::ffi::c_int,\n    A: *mut cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgeru_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgeru_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgeru_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgeru_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCgeru_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCgeru_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCgeru_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCgeru_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCgeru_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgeru_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgeru_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    m: i64,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: i64,\n    y: *const cuda_types::cublas::cuComplex,\n    incy: i64,\n    A: *mut cuda_types::cublas::cuComplex,\n    lda: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgeru_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgeru_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgeru_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgeru_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCgeru_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCgeru_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCgeru_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCgeru_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCgeru_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgeru_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgerc_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n    y: *const cuda_types::cublas::cuComplex,\n    incy: ::core::ffi::c_int,\n    A: *mut cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgerc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgerc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgerc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgerc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCgerc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCgerc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCgerc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCgerc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCgerc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgerc_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgerc_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    m: i64,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: i64,\n    y: *const cuda_types::cublas::cuComplex,\n    incy: i64,\n    A: *mut cuda_types::cublas::cuComplex,\n    lda: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgerc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgerc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgerc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgerc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCgerc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCgerc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCgerc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCgerc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCgerc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgerc_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZgeru_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n    y: *const cuda_types::cublas::cuDoubleComplex,\n    incy: ::core::ffi::c_int,\n    A: *mut cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZgeru_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZgeru_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZgeru_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZgeru_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZgeru_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZgeru_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZgeru_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZgeru_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZgeru_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZgeru_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZgeru_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    m: i64,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n    y: *const cuda_types::cublas::cuDoubleComplex,\n    incy: i64,\n    A: *mut cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZgeru_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZgeru_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZgeru_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZgeru_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZgeru_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZgeru_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZgeru_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZgeru_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZgeru_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZgeru_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZgerc_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n    y: *const cuda_types::cublas::cuDoubleComplex,\n    incy: ::core::ffi::c_int,\n    A: *mut cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZgerc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZgerc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZgerc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZgerc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZgerc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZgerc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZgerc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZgerc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZgerc_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZgerc_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZgerc_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    m: i64,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n    y: *const cuda_types::cublas::cuDoubleComplex,\n    incy: i64,\n    A: *mut cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZgerc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZgerc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZgerc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZgerc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZgerc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZgerc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZgerc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZgerc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZgerc_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZgerc_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSsyr_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    x: *const f32,\n    incx: ::core::ffi::c_int,\n    A: *mut f32,\n    lda: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSsyr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasSsyr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSsyr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSsyr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSsyr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSsyr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSsyr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSsyr_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSsyr_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const f32,\n    x: *const f32,\n    incx: i64,\n    A: *mut f32,\n    lda: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSsyr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasSsyr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSsyr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSsyr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSsyr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSsyr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSsyr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSsyr_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDsyr_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const f64,\n    x: *const f64,\n    incx: ::core::ffi::c_int,\n    A: *mut f64,\n    lda: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDsyr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDsyr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDsyr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDsyr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDsyr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDsyr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDsyr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDsyr_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDsyr_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const f64,\n    x: *const f64,\n    incx: i64,\n    A: *mut f64,\n    lda: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDsyr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDsyr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDsyr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDsyr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDsyr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDsyr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDsyr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDsyr_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCsyr_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n    A: *mut cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCsyr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCsyr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCsyr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCsyr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCsyr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCsyr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCsyr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCsyr_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCsyr_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: i64,\n    A: *mut cuda_types::cublas::cuComplex,\n    lda: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCsyr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCsyr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCsyr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCsyr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCsyr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCsyr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCsyr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCsyr_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZsyr_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n    A: *mut cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZsyr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZsyr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZsyr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZsyr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZsyr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZsyr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZsyr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZsyr_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZsyr_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n    A: *mut cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZsyr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZsyr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZsyr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZsyr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZsyr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZsyr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZsyr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZsyr_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCher_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n    A: *mut cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCher_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCher_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCher_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCher_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCher_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCher_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCher_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCher_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCher_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const f32,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: i64,\n    A: *mut cuda_types::cublas::cuComplex,\n    lda: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCher_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCher_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCher_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCher_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCher_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCher_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCher_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCher_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZher_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const f64,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n    A: *mut cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZher_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZher_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZher_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZher_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZher_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZher_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZher_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZher_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZher_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const f64,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n    A: *mut cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZher_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZher_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZher_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZher_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZher_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZher_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZher_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZher_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSspr_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    x: *const f32,\n    incx: ::core::ffi::c_int,\n    AP: *mut f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSspr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasSspr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSspr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSspr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSspr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSspr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasSspr_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSspr_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const f32,\n    x: *const f32,\n    incx: i64,\n    AP: *mut f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSspr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasSspr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSspr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSspr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSspr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSspr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasSspr_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDspr_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const f64,\n    x: *const f64,\n    incx: ::core::ffi::c_int,\n    AP: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDspr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDspr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDspr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDspr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDspr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDspr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasDspr_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDspr_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const f64,\n    x: *const f64,\n    incx: i64,\n    AP: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDspr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDspr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDspr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDspr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDspr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDspr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasDspr_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasChpr_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n    AP: *mut cuda_types::cublas::cuComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasChpr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasChpr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasChpr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasChpr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasChpr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasChpr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasChpr_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasChpr_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const f32,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: i64,\n    AP: *mut cuda_types::cublas::cuComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasChpr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasChpr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasChpr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasChpr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasChpr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasChpr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasChpr_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZhpr_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const f64,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n    AP: *mut cuda_types::cublas::cuDoubleComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZhpr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZhpr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZhpr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZhpr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZhpr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZhpr_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasZhpr_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZhpr_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const f64,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n    AP: *mut cuda_types::cublas::cuDoubleComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZhpr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZhpr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZhpr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZhpr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZhpr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZhpr_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasZhpr_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSsyr2_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    x: *const f32,\n    incx: ::core::ffi::c_int,\n    y: *const f32,\n    incy: ::core::ffi::c_int,\n    A: *mut f32,\n    lda: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasSsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSsyr2_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSsyr2_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const f32,\n    x: *const f32,\n    incx: i64,\n    y: *const f32,\n    incy: i64,\n    A: *mut f32,\n    lda: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasSsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSsyr2_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDsyr2_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const f64,\n    x: *const f64,\n    incx: ::core::ffi::c_int,\n    y: *const f64,\n    incy: ::core::ffi::c_int,\n    A: *mut f64,\n    lda: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDsyr2_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDsyr2_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const f64,\n    x: *const f64,\n    incx: i64,\n    y: *const f64,\n    incy: i64,\n    A: *mut f64,\n    lda: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDsyr2_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCsyr2_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n    y: *const cuda_types::cublas::cuComplex,\n    incy: ::core::ffi::c_int,\n    A: *mut cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCsyr2_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCsyr2_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: i64,\n    y: *const cuda_types::cublas::cuComplex,\n    incy: i64,\n    A: *mut cuda_types::cublas::cuComplex,\n    lda: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCsyr2_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZsyr2_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n    y: *const cuda_types::cublas::cuDoubleComplex,\n    incy: ::core::ffi::c_int,\n    A: *mut cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZsyr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZsyr2_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZsyr2_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n    y: *const cuda_types::cublas::cuDoubleComplex,\n    incy: i64,\n    A: *mut cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZsyr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZsyr2_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCher2_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n    y: *const cuda_types::cublas::cuComplex,\n    incy: ::core::ffi::c_int,\n    A: *mut cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCher2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCher2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCher2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCher2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCher2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCher2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCher2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCher2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCher2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCher2_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCher2_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: i64,\n    y: *const cuda_types::cublas::cuComplex,\n    incy: i64,\n    A: *mut cuda_types::cublas::cuComplex,\n    lda: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCher2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCher2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCher2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCher2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCher2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCher2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCher2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCher2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCher2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCher2_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZher2_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n    y: *const cuda_types::cublas::cuDoubleComplex,\n    incy: ::core::ffi::c_int,\n    A: *mut cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZher2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZher2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZher2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZher2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZher2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZher2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZher2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZher2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZher2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZher2_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZher2_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n    y: *const cuda_types::cublas::cuDoubleComplex,\n    incy: i64,\n    A: *mut cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZher2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZher2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZher2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZher2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZher2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZher2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZher2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZher2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZher2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZher2_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSspr2_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    x: *const f32,\n    incx: ::core::ffi::c_int,\n    y: *const f32,\n    incy: ::core::ffi::c_int,\n    AP: *mut f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSspr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasSspr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSspr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSspr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSspr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSspr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSspr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSspr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasSspr2_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSspr2_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const f32,\n    x: *const f32,\n    incx: i64,\n    y: *const f32,\n    incy: i64,\n    AP: *mut f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSspr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasSspr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSspr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSspr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSspr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSspr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSspr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSspr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasSspr2_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDspr2_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const f64,\n    x: *const f64,\n    incx: ::core::ffi::c_int,\n    y: *const f64,\n    incy: ::core::ffi::c_int,\n    AP: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDspr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDspr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDspr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDspr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDspr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDspr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDspr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDspr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasDspr2_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDspr2_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const f64,\n    x: *const f64,\n    incx: i64,\n    y: *const f64,\n    incy: i64,\n    AP: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDspr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDspr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDspr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDspr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDspr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDspr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDspr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDspr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasDspr2_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasChpr2_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n    y: *const cuda_types::cublas::cuComplex,\n    incy: ::core::ffi::c_int,\n    AP: *mut cuda_types::cublas::cuComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasChpr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasChpr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasChpr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasChpr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasChpr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasChpr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasChpr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasChpr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasChpr2_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasChpr2_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: i64,\n    y: *const cuda_types::cublas::cuComplex,\n    incy: i64,\n    AP: *mut cuda_types::cublas::cuComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasChpr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasChpr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasChpr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasChpr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasChpr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasChpr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasChpr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasChpr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasChpr2_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZhpr2_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n    y: *const cuda_types::cublas::cuDoubleComplex,\n    incy: ::core::ffi::c_int,\n    AP: *mut cuda_types::cublas::cuDoubleComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZhpr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZhpr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZhpr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZhpr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZhpr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZhpr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZhpr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZhpr2_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasZhpr2_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZhpr2_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n    y: *const cuda_types::cublas::cuDoubleComplex,\n    incy: i64,\n    AP: *mut cuda_types::cublas::cuDoubleComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZhpr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZhpr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZhpr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZhpr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZhpr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZhpr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZhpr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZhpr2_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasZhpr2_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSgemvBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    Aarray: *const *const f32,\n    lda: ::core::ffi::c_int,\n    xarray: *const *const f32,\n    incx: ::core::ffi::c_int,\n    beta: *const f32,\n    yarray: *const *mut f32,\n    incy: ::core::ffi::c_int,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xarray, \"cublasSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yarray, \"cublasSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasSgemvBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSgemvBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    alpha: *const f32,\n    Aarray: *const *const f32,\n    lda: i64,\n    xarray: *const *const f32,\n    incx: i64,\n    beta: *const f32,\n    yarray: *const *mut f32,\n    incy: i64,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xarray, \"cublasSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yarray, \"cublasSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasSgemvBatched_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDgemvBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f64,\n    Aarray: *const *const f64,\n    lda: ::core::ffi::c_int,\n    xarray: *const *const f64,\n    incx: ::core::ffi::c_int,\n    beta: *const f64,\n    yarray: *const *mut f64,\n    incy: ::core::ffi::c_int,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasDgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xarray, \"cublasDgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yarray, \"cublasDgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasDgemvBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDgemvBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    alpha: *const f64,\n    Aarray: *const *const f64,\n    lda: i64,\n    xarray: *const *const f64,\n    incx: i64,\n    beta: *const f64,\n    yarray: *const *mut f64,\n    incy: i64,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasDgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xarray, \"cublasDgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yarray, \"cublasDgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasDgemvBatched_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgemvBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    Aarray: *const *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    xarray: *const *const cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuComplex,\n    yarray: *const *mut cuda_types::cublas::cuComplex,\n    incy: ::core::ffi::c_int,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasCgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xarray, \"cublasCgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yarray, \"cublasCgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasCgemvBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgemvBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    Aarray: *const *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    xarray: *const *const cuda_types::cublas::cuComplex,\n    incx: i64,\n    beta: *const cuda_types::cublas::cuComplex,\n    yarray: *const *mut cuda_types::cublas::cuComplex,\n    incy: i64,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasCgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xarray, \"cublasCgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yarray, \"cublasCgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasCgemvBatched_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZgemvBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    Aarray: *const *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    xarray: *const *const cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    yarray: *const *mut cuda_types::cublas::cuDoubleComplex,\n    incy: ::core::ffi::c_int,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasZgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xarray, \"cublasZgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yarray, \"cublasZgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasZgemvBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZgemvBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    Aarray: *const *const cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n    xarray: *const *const cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    yarray: *const *mut cuda_types::cublas::cuDoubleComplex,\n    incy: i64,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasZgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xarray, \"cublasZgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yarray, \"cublasZgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasZgemvBatched_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasHSHgemvBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    Aarray: *const *const cuda_types::cublas::__half,\n    lda: ::core::ffi::c_int,\n    xarray: *const *const cuda_types::cublas::__half,\n    incx: ::core::ffi::c_int,\n    beta: *const f32,\n    yarray: *const *mut cuda_types::cublas::__half,\n    incy: ::core::ffi::c_int,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasHSHgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasHSHgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasHSHgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasHSHgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasHSHgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasHSHgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasHSHgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xarray, \"cublasHSHgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasHSHgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasHSHgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yarray, \"cublasHSHgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasHSHgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasHSHgemvBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasHSHgemvBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    alpha: *const f32,\n    Aarray: *const *const cuda_types::cublas::__half,\n    lda: i64,\n    xarray: *const *const cuda_types::cublas::__half,\n    incx: i64,\n    beta: *const f32,\n    yarray: *const *mut cuda_types::cublas::__half,\n    incy: i64,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasHSHgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasHSHgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasHSHgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasHSHgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasHSHgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasHSHgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasHSHgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xarray, \"cublasHSHgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasHSHgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasHSHgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yarray, \"cublasHSHgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasHSHgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasHSHgemvBatched_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasHSSgemvBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    Aarray: *const *const cuda_types::cublas::__half,\n    lda: ::core::ffi::c_int,\n    xarray: *const *const cuda_types::cublas::__half,\n    incx: ::core::ffi::c_int,\n    beta: *const f32,\n    yarray: *const *mut f32,\n    incy: ::core::ffi::c_int,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasHSSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasHSSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasHSSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasHSSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasHSSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasHSSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasHSSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xarray, \"cublasHSSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasHSSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasHSSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yarray, \"cublasHSSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasHSSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasHSSgemvBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasHSSgemvBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    alpha: *const f32,\n    Aarray: *const *const cuda_types::cublas::__half,\n    lda: i64,\n    xarray: *const *const cuda_types::cublas::__half,\n    incx: i64,\n    beta: *const f32,\n    yarray: *const *mut f32,\n    incy: i64,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasHSSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasHSSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasHSSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasHSSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasHSSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasHSSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasHSSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xarray, \"cublasHSSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasHSSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasHSSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yarray, \"cublasHSSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasHSSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasHSSgemvBatched_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasTSTgemvBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    Aarray: *const *const cuda_types::cublas::__nv_bfloat16,\n    lda: ::core::ffi::c_int,\n    xarray: *const *const cuda_types::cublas::__nv_bfloat16,\n    incx: ::core::ffi::c_int,\n    beta: *const f32,\n    yarray: *const *mut cuda_types::cublas::__nv_bfloat16,\n    incy: ::core::ffi::c_int,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasTSTgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasTSTgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasTSTgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasTSTgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasTSTgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasTSTgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasTSTgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xarray, \"cublasTSTgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasTSTgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasTSTgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yarray, \"cublasTSTgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasTSTgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasTSTgemvBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasTSTgemvBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    alpha: *const f32,\n    Aarray: *const *const cuda_types::cublas::__nv_bfloat16,\n    lda: i64,\n    xarray: *const *const cuda_types::cublas::__nv_bfloat16,\n    incx: i64,\n    beta: *const f32,\n    yarray: *const *mut cuda_types::cublas::__nv_bfloat16,\n    incy: i64,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasTSTgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasTSTgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasTSTgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasTSTgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasTSTgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasTSTgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasTSTgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xarray, \"cublasTSTgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasTSTgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasTSTgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yarray, \"cublasTSTgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasTSTgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasTSTgemvBatched_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasTSSgemvBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    Aarray: *const *const cuda_types::cublas::__nv_bfloat16,\n    lda: ::core::ffi::c_int,\n    xarray: *const *const cuda_types::cublas::__nv_bfloat16,\n    incx: ::core::ffi::c_int,\n    beta: *const f32,\n    yarray: *const *mut f32,\n    incy: ::core::ffi::c_int,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasTSSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasTSSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasTSSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasTSSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasTSSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasTSSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasTSSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xarray, \"cublasTSSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasTSSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasTSSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yarray, \"cublasTSSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasTSSgemvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasTSSgemvBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasTSSgemvBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    alpha: *const f32,\n    Aarray: *const *const cuda_types::cublas::__nv_bfloat16,\n    lda: i64,\n    xarray: *const *const cuda_types::cublas::__nv_bfloat16,\n    incx: i64,\n    beta: *const f32,\n    yarray: *const *mut f32,\n    incy: i64,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasTSSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasTSSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasTSSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasTSSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasTSSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasTSSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasTSSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xarray, \"cublasTSSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasTSSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasTSSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yarray, \"cublasTSSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasTSSgemvBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasTSSgemvBatched_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSgemvStridedBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    A: *const f32,\n    lda: ::core::ffi::c_int,\n    strideA: ::core::ffi::c_longlong,\n    x: *const f32,\n    incx: ::core::ffi::c_int,\n    stridex: ::core::ffi::c_longlong,\n    beta: *const f32,\n    y: *mut f32,\n    incy: ::core::ffi::c_int,\n    stridey: ::core::ffi::c_longlong,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideA, \"cublasSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridex), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stridex, \"cublasSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridey), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stridey, \"cublasSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasSgemvStridedBatched\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSgemvStridedBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    alpha: *const f32,\n    A: *const f32,\n    lda: i64,\n    strideA: ::core::ffi::c_longlong,\n    x: *const f32,\n    incx: i64,\n    stridex: ::core::ffi::c_longlong,\n    beta: *const f32,\n    y: *mut f32,\n    incy: i64,\n    stridey: ::core::ffi::c_longlong,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideA,\n        \"cublasSgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridex), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stridex,\n        \"cublasSgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridey), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stridey,\n        \"cublasSgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasSgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDgemvStridedBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f64,\n    A: *const f64,\n    lda: ::core::ffi::c_int,\n    strideA: ::core::ffi::c_longlong,\n    x: *const f64,\n    incx: ::core::ffi::c_int,\n    stridex: ::core::ffi::c_longlong,\n    beta: *const f64,\n    y: *mut f64,\n    incy: ::core::ffi::c_int,\n    stridey: ::core::ffi::c_longlong,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideA, \"cublasDgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridex), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stridex, \"cublasDgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridey), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stridey, \"cublasDgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasDgemvStridedBatched\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDgemvStridedBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    alpha: *const f64,\n    A: *const f64,\n    lda: i64,\n    strideA: ::core::ffi::c_longlong,\n    x: *const f64,\n    incx: i64,\n    stridex: ::core::ffi::c_longlong,\n    beta: *const f64,\n    y: *mut f64,\n    incy: i64,\n    stridey: ::core::ffi::c_longlong,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideA,\n        \"cublasDgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridex), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stridex,\n        \"cublasDgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasDgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasDgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridey), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stridey,\n        \"cublasDgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasDgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgemvStridedBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    strideA: ::core::ffi::c_longlong,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n    stridex: ::core::ffi::c_longlong,\n    beta: *const cuda_types::cublas::cuComplex,\n    y: *mut cuda_types::cublas::cuComplex,\n    incy: ::core::ffi::c_int,\n    stridey: ::core::ffi::c_longlong,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideA, \"cublasCgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridex), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stridex, \"cublasCgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridey), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stridey, \"cublasCgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasCgemvStridedBatched\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgemvStridedBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    strideA: ::core::ffi::c_longlong,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: i64,\n    stridex: ::core::ffi::c_longlong,\n    beta: *const cuda_types::cublas::cuComplex,\n    y: *mut cuda_types::cublas::cuComplex,\n    incy: i64,\n    stridey: ::core::ffi::c_longlong,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideA,\n        \"cublasCgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridex), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stridex,\n        \"cublasCgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasCgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasCgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridey), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stridey,\n        \"cublasCgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasCgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZgemvStridedBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    strideA: ::core::ffi::c_longlong,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n    stridex: ::core::ffi::c_longlong,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    y: *mut cuda_types::cublas::cuDoubleComplex,\n    incy: ::core::ffi::c_int,\n    stridey: ::core::ffi::c_longlong,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideA, \"cublasZgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridex), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stridex, \"cublasZgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridey), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stridey, \"cublasZgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasZgemvStridedBatched\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZgemvStridedBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n    strideA: ::core::ffi::c_longlong,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n    stridex: ::core::ffi::c_longlong,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    y: *mut cuda_types::cublas::cuDoubleComplex,\n    incy: i64,\n    stridey: ::core::ffi::c_longlong,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideA,\n        \"cublasZgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridex), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stridex,\n        \"cublasZgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasZgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasZgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridey), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stridey,\n        \"cublasZgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasZgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasHSHgemvStridedBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    A: *const cuda_types::cublas::__half,\n    lda: ::core::ffi::c_int,\n    strideA: ::core::ffi::c_longlong,\n    x: *const cuda_types::cublas::__half,\n    incx: ::core::ffi::c_int,\n    stridex: ::core::ffi::c_longlong,\n    beta: *const f32,\n    y: *mut cuda_types::cublas::__half,\n    incy: ::core::ffi::c_int,\n    stridey: ::core::ffi::c_longlong,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasHSHgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasHSHgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasHSHgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasHSHgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasHSHgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasHSHgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasHSHgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideA, \"cublasHSHgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasHSHgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasHSHgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridex), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stridex, \"cublasHSHgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasHSHgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasHSHgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasHSHgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridey), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stridey, \"cublasHSHgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasHSHgemvStridedBatched\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasHSHgemvStridedBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    alpha: *const f32,\n    A: *const cuda_types::cublas::__half,\n    lda: i64,\n    strideA: ::core::ffi::c_longlong,\n    x: *const cuda_types::cublas::__half,\n    incx: i64,\n    stridex: ::core::ffi::c_longlong,\n    beta: *const f32,\n    y: *mut cuda_types::cublas::__half,\n    incy: i64,\n    stridey: ::core::ffi::c_longlong,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cublasHSHgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &trans,\n        \"cublasHSHgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasHSHgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasHSHgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha,\n        \"cublasHSHgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasHSHgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasHSHgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideA,\n        \"cublasHSHgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasHSHgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasHSHgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridex), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stridex,\n        \"cublasHSHgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasHSHgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasHSHgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasHSHgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridey), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stridey,\n        \"cublasHSHgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasHSHgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasHSSgemvStridedBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    A: *const cuda_types::cublas::__half,\n    lda: ::core::ffi::c_int,\n    strideA: ::core::ffi::c_longlong,\n    x: *const cuda_types::cublas::__half,\n    incx: ::core::ffi::c_int,\n    stridex: ::core::ffi::c_longlong,\n    beta: *const f32,\n    y: *mut f32,\n    incy: ::core::ffi::c_int,\n    stridey: ::core::ffi::c_longlong,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasHSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasHSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasHSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasHSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasHSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasHSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasHSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideA, \"cublasHSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasHSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasHSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridex), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stridex, \"cublasHSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasHSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasHSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasHSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridey), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stridey, \"cublasHSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasHSSgemvStridedBatched\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasHSSgemvStridedBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    alpha: *const f32,\n    A: *const cuda_types::cublas::__half,\n    lda: i64,\n    strideA: ::core::ffi::c_longlong,\n    x: *const cuda_types::cublas::__half,\n    incx: i64,\n    stridex: ::core::ffi::c_longlong,\n    beta: *const f32,\n    y: *mut f32,\n    incy: i64,\n    stridey: ::core::ffi::c_longlong,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cublasHSSgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &trans,\n        \"cublasHSSgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasHSSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasHSSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha,\n        \"cublasHSSgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasHSSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasHSSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideA,\n        \"cublasHSSgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasHSSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasHSSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridex), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stridex,\n        \"cublasHSSgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasHSSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasHSSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasHSSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridey), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stridey,\n        \"cublasHSSgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasHSSgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasTSTgemvStridedBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    A: *const cuda_types::cublas::__nv_bfloat16,\n    lda: ::core::ffi::c_int,\n    strideA: ::core::ffi::c_longlong,\n    x: *const cuda_types::cublas::__nv_bfloat16,\n    incx: ::core::ffi::c_int,\n    stridex: ::core::ffi::c_longlong,\n    beta: *const f32,\n    y: *mut cuda_types::cublas::__nv_bfloat16,\n    incy: ::core::ffi::c_int,\n    stridey: ::core::ffi::c_longlong,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasTSTgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasTSTgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasTSTgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasTSTgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasTSTgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasTSTgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasTSTgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideA, \"cublasTSTgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasTSTgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasTSTgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridex), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stridex, \"cublasTSTgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasTSTgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasTSTgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasTSTgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridey), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stridey, \"cublasTSTgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasTSTgemvStridedBatched\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasTSTgemvStridedBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    alpha: *const f32,\n    A: *const cuda_types::cublas::__nv_bfloat16,\n    lda: i64,\n    strideA: ::core::ffi::c_longlong,\n    x: *const cuda_types::cublas::__nv_bfloat16,\n    incx: i64,\n    stridex: ::core::ffi::c_longlong,\n    beta: *const f32,\n    y: *mut cuda_types::cublas::__nv_bfloat16,\n    incy: i64,\n    stridey: ::core::ffi::c_longlong,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cublasTSTgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &trans,\n        \"cublasTSTgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasTSTgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasTSTgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha,\n        \"cublasTSTgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasTSTgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasTSTgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideA,\n        \"cublasTSTgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasTSTgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasTSTgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridex), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stridex,\n        \"cublasTSTgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasTSTgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasTSTgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasTSTgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridey), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stridey,\n        \"cublasTSTgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasTSTgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasTSSgemvStridedBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    A: *const cuda_types::cublas::__nv_bfloat16,\n    lda: ::core::ffi::c_int,\n    strideA: ::core::ffi::c_longlong,\n    x: *const cuda_types::cublas::__nv_bfloat16,\n    incx: ::core::ffi::c_int,\n    stridex: ::core::ffi::c_longlong,\n    beta: *const f32,\n    y: *mut f32,\n    incy: ::core::ffi::c_int,\n    stridey: ::core::ffi::c_longlong,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasTSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasTSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasTSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasTSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasTSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasTSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasTSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideA, \"cublasTSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasTSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasTSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridex), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stridex, \"cublasTSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasTSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasTSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasTSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridey), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stridey, \"cublasTSSgemvStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasTSSgemvStridedBatched\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasTSSgemvStridedBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    alpha: *const f32,\n    A: *const cuda_types::cublas::__nv_bfloat16,\n    lda: i64,\n    strideA: ::core::ffi::c_longlong,\n    x: *const cuda_types::cublas::__nv_bfloat16,\n    incx: i64,\n    stridex: ::core::ffi::c_longlong,\n    beta: *const f32,\n    y: *mut f32,\n    incy: i64,\n    stridey: ::core::ffi::c_longlong,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cublasTSSgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &trans,\n        \"cublasTSSgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasTSSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasTSSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha,\n        \"cublasTSSgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasTSSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasTSSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideA,\n        \"cublasTSSgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasTSSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasTSSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridex), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stridex,\n        \"cublasTSSgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasTSSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cublasTSSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incy, \"cublasTSSgemvStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stridey), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stridey,\n        \"cublasTSSgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasTSSgemvStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSgemm_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const f32,\n    A: *const f32,\n    lda: ::core::ffi::c_int,\n    B: *const f32,\n    ldb: ::core::ffi::c_int,\n    beta: *const f32,\n    C: *mut f32,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasSgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasSgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasSgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasSgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasSgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasSgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasSgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasSgemm_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSgemm_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    k: i64,\n    alpha: *const f32,\n    A: *const f32,\n    lda: i64,\n    B: *const f32,\n    ldb: i64,\n    beta: *const f32,\n    C: *mut f32,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasSgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasSgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasSgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasSgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasSgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasSgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasSgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasSgemm_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDgemm_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const f64,\n    A: *const f64,\n    lda: ::core::ffi::c_int,\n    B: *const f64,\n    ldb: ::core::ffi::c_int,\n    beta: *const f64,\n    C: *mut f64,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasDgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasDgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasDgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasDgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasDgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasDgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasDgemm_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDgemm_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    k: i64,\n    alpha: *const f64,\n    A: *const f64,\n    lda: i64,\n    B: *const f64,\n    ldb: i64,\n    beta: *const f64,\n    C: *mut f64,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasDgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasDgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasDgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasDgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasDgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasDgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasDgemm_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgemm_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    B: *const cuda_types::cublas::cuComplex,\n    ldb: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuComplex,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasCgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasCgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCgemm_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgemm_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    B: *const cuda_types::cublas::cuComplex,\n    ldb: i64,\n    beta: *const cuda_types::cublas::cuComplex,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasCgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasCgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCgemm_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgemm3m(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    B: *const cuda_types::cublas::cuComplex,\n    ldb: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuComplex,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgemm3m\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasCgemm3m\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasCgemm3m\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgemm3m\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgemm3m\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCgemm3m\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgemm3m\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCgemm3m\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgemm3m\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCgemm3m\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCgemm3m\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCgemm3m\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCgemm3m\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCgemm3m\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgemm3m_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    B: *const cuda_types::cublas::cuComplex,\n    ldb: i64,\n    beta: *const cuda_types::cublas::cuComplex,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgemm3m_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasCgemm3m_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasCgemm3m_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgemm3m_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgemm3m_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCgemm3m_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgemm3m_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCgemm3m_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgemm3m_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCgemm3m_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCgemm3m_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCgemm3m_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCgemm3m_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCgemm3m_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgemm3mEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const ::core::ffi::c_void,\n    Atype: cuda_types::cublas::cudaDataType,\n    lda: ::core::ffi::c_int,\n    B: *const ::core::ffi::c_void,\n    Btype: cuda_types::cublas::cudaDataType,\n    ldb: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuComplex,\n    C: *mut ::core::ffi::c_void,\n    Ctype: cuda_types::cublas::cudaDataType,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgemm3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasCgemm3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasCgemm3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgemm3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgemm3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCgemm3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgemm3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCgemm3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Atype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Atype, \"cublasCgemm3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgemm3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCgemm3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Btype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Btype, \"cublasCgemm3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCgemm3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCgemm3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCgemm3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ctype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ctype, \"cublasCgemm3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCgemm3mEx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgemm3mEx_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const ::core::ffi::c_void,\n    Atype: cuda_types::cublas::cudaDataType,\n    lda: i64,\n    B: *const ::core::ffi::c_void,\n    Btype: cuda_types::cublas::cudaDataType,\n    ldb: i64,\n    beta: *const cuda_types::cublas::cuComplex,\n    C: *mut ::core::ffi::c_void,\n    Ctype: cuda_types::cublas::cudaDataType,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgemm3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasCgemm3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasCgemm3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgemm3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgemm3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCgemm3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgemm3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCgemm3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Atype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Atype, \"cublasCgemm3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgemm3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCgemm3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Btype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Btype, \"cublasCgemm3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCgemm3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCgemm3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCgemm3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ctype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ctype, \"cublasCgemm3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCgemm3mEx_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZgemm_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    B: *const cuda_types::cublas::cuDoubleComplex,\n    ldb: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    C: *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasZgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasZgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasZgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasZgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZgemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZgemm_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZgemm_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n    B: *const cuda_types::cublas::cuDoubleComplex,\n    ldb: i64,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    C: *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasZgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasZgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasZgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasZgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZgemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZgemm_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZgemm3m(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    B: *const cuda_types::cublas::cuDoubleComplex,\n    ldb: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    C: *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZgemm3m\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasZgemm3m\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasZgemm3m\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZgemm3m\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZgemm3m\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasZgemm3m\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZgemm3m\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZgemm3m\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZgemm3m\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasZgemm3m\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZgemm3m\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZgemm3m\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZgemm3m\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZgemm3m\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZgemm3m_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n    B: *const cuda_types::cublas::cuDoubleComplex,\n    ldb: i64,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    C: *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZgemm3m_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasZgemm3m_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasZgemm3m_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZgemm3m_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZgemm3m_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasZgemm3m_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZgemm3m_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZgemm3m_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZgemm3m_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasZgemm3m_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZgemm3m_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZgemm3m_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZgemm3m_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZgemm3m_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasHgemm(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::__half,\n    A: *const cuda_types::cublas::__half,\n    lda: ::core::ffi::c_int,\n    B: *const cuda_types::cublas::__half,\n    ldb: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::__half,\n    C: *mut cuda_types::cublas::__half,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasHgemm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasHgemm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasHgemm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasHgemm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasHgemm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasHgemm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasHgemm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasHgemm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasHgemm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasHgemm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasHgemm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasHgemm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasHgemm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasHgemm\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasHgemm_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::__half,\n    A: *const cuda_types::cublas::__half,\n    lda: i64,\n    B: *const cuda_types::cublas::__half,\n    ldb: i64,\n    beta: *const cuda_types::cublas::__half,\n    C: *mut cuda_types::cublas::__half,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasHgemm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasHgemm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasHgemm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasHgemm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasHgemm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasHgemm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasHgemm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasHgemm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasHgemm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasHgemm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasHgemm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasHgemm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasHgemm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasHgemm_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSgemmEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const f32,\n    A: *const ::core::ffi::c_void,\n    Atype: cuda_types::cublas::cudaDataType,\n    lda: ::core::ffi::c_int,\n    B: *const ::core::ffi::c_void,\n    Btype: cuda_types::cublas::cudaDataType,\n    ldb: ::core::ffi::c_int,\n    beta: *const f32,\n    C: *mut ::core::ffi::c_void,\n    Ctype: cuda_types::cublas::cudaDataType,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasSgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasSgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasSgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasSgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Atype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Atype, \"cublasSgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasSgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Btype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Btype, \"cublasSgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasSgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasSgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ctype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ctype, \"cublasSgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasSgemmEx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSgemmEx_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    k: i64,\n    alpha: *const f32,\n    A: *const ::core::ffi::c_void,\n    Atype: cuda_types::cublas::cudaDataType,\n    lda: i64,\n    B: *const ::core::ffi::c_void,\n    Btype: cuda_types::cublas::cudaDataType,\n    ldb: i64,\n    beta: *const f32,\n    C: *mut ::core::ffi::c_void,\n    Ctype: cuda_types::cublas::cudaDataType,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasSgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasSgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasSgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasSgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Atype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Atype, \"cublasSgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasSgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Btype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Btype, \"cublasSgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasSgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasSgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ctype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ctype, \"cublasSgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasSgemmEx_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasGemmEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const ::core::ffi::c_void,\n    A: *const ::core::ffi::c_void,\n    Atype: cuda_types::cublas::cudaDataType,\n    lda: ::core::ffi::c_int,\n    B: *const ::core::ffi::c_void,\n    Btype: cuda_types::cublas::cudaDataType,\n    ldb: ::core::ffi::c_int,\n    beta: *const ::core::ffi::c_void,\n    C: *mut ::core::ffi::c_void,\n    Ctype: cuda_types::cublas::cudaDataType,\n    ldc: ::core::ffi::c_int,\n    computeType: cuda_types::cublas::cublasComputeType_t,\n    algo: cuda_types::cublas::cublasGemmAlgo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasGemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasGemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasGemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasGemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasGemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasGemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasGemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasGemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Atype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Atype, \"cublasGemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasGemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasGemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Btype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Btype, \"cublasGemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasGemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasGemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasGemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ctype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ctype, \"cublasGemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasGemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&computeType, \"cublasGemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cublasGemmEx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasGemmEx_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    k: i64,\n    alpha: *const ::core::ffi::c_void,\n    A: *const ::core::ffi::c_void,\n    Atype: cuda_types::cublas::cudaDataType,\n    lda: i64,\n    B: *const ::core::ffi::c_void,\n    Btype: cuda_types::cublas::cudaDataType,\n    ldb: i64,\n    beta: *const ::core::ffi::c_void,\n    C: *mut ::core::ffi::c_void,\n    Ctype: cuda_types::cublas::cudaDataType,\n    ldc: i64,\n    computeType: cuda_types::cublas::cublasComputeType_t,\n    algo: cuda_types::cublas::cublasGemmAlgo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasGemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasGemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasGemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasGemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasGemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasGemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasGemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasGemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Atype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Atype, \"cublasGemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasGemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasGemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Btype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Btype, \"cublasGemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasGemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasGemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasGemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ctype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ctype, \"cublasGemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasGemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&computeType, \"cublasGemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cublasGemmEx_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgemmEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const ::core::ffi::c_void,\n    Atype: cuda_types::cublas::cudaDataType,\n    lda: ::core::ffi::c_int,\n    B: *const ::core::ffi::c_void,\n    Btype: cuda_types::cublas::cudaDataType,\n    ldb: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuComplex,\n    C: *mut ::core::ffi::c_void,\n    Ctype: cuda_types::cublas::cudaDataType,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasCgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasCgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Atype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Atype, \"cublasCgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Btype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Btype, \"cublasCgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ctype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ctype, \"cublasCgemmEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCgemmEx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgemmEx_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const ::core::ffi::c_void,\n    Atype: cuda_types::cublas::cudaDataType,\n    lda: i64,\n    B: *const ::core::ffi::c_void,\n    Btype: cuda_types::cublas::cudaDataType,\n    ldb: i64,\n    beta: *const cuda_types::cublas::cuComplex,\n    C: *mut ::core::ffi::c_void,\n    Ctype: cuda_types::cublas::cudaDataType,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasCgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasCgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Atype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Atype, \"cublasCgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Btype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Btype, \"cublasCgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ctype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ctype, \"cublasCgemmEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCgemmEx_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSsyrk_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const f32,\n    A: *const f32,\n    lda: ::core::ffi::c_int,\n    beta: *const f32,\n    C: *mut f32,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasSsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasSsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasSsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasSsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasSsyrk_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSsyrk_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: i64,\n    k: i64,\n    alpha: *const f32,\n    A: *const f32,\n    lda: i64,\n    beta: *const f32,\n    C: *mut f32,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasSsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasSsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasSsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasSsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasSsyrk_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDsyrk_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const f64,\n    A: *const f64,\n    lda: ::core::ffi::c_int,\n    beta: *const f64,\n    C: *mut f64,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasDsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasDsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasDsyrk_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDsyrk_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: i64,\n    k: i64,\n    alpha: *const f64,\n    A: *const f64,\n    lda: i64,\n    beta: *const f64,\n    C: *mut f64,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasDsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasDsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasDsyrk_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCsyrk_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuComplex,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCsyrk_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCsyrk_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    beta: *const cuda_types::cublas::cuComplex,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCsyrk_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZsyrk_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    C: *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasZsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZsyrk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZsyrk_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZsyrk_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    C: *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasZsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZsyrk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZsyrk_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCsyrkEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const ::core::ffi::c_void,\n    Atype: cuda_types::cublas::cudaDataType,\n    lda: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuComplex,\n    C: *mut ::core::ffi::c_void,\n    Ctype: cuda_types::cublas::cudaDataType,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCsyrkEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCsyrkEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCsyrkEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCsyrkEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCsyrkEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCsyrkEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCsyrkEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Atype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Atype, \"cublasCsyrkEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCsyrkEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCsyrkEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCsyrkEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ctype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ctype, \"cublasCsyrkEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCsyrkEx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCsyrkEx_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const ::core::ffi::c_void,\n    Atype: cuda_types::cublas::cudaDataType,\n    lda: i64,\n    beta: *const cuda_types::cublas::cuComplex,\n    C: *mut ::core::ffi::c_void,\n    Ctype: cuda_types::cublas::cudaDataType,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCsyrkEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCsyrkEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCsyrkEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCsyrkEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCsyrkEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCsyrkEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCsyrkEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Atype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Atype, \"cublasCsyrkEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCsyrkEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCsyrkEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCsyrkEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ctype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ctype, \"cublasCsyrkEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCsyrkEx_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCsyrk3mEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const ::core::ffi::c_void,\n    Atype: cuda_types::cublas::cudaDataType,\n    lda: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuComplex,\n    C: *mut ::core::ffi::c_void,\n    Ctype: cuda_types::cublas::cudaDataType,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCsyrk3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCsyrk3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCsyrk3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCsyrk3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCsyrk3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCsyrk3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCsyrk3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Atype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Atype, \"cublasCsyrk3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCsyrk3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCsyrk3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCsyrk3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ctype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ctype, \"cublasCsyrk3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCsyrk3mEx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCsyrk3mEx_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const ::core::ffi::c_void,\n    Atype: cuda_types::cublas::cudaDataType,\n    lda: i64,\n    beta: *const cuda_types::cublas::cuComplex,\n    C: *mut ::core::ffi::c_void,\n    Ctype: cuda_types::cublas::cudaDataType,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCsyrk3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCsyrk3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCsyrk3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCsyrk3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCsyrk3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCsyrk3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCsyrk3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Atype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Atype, \"cublasCsyrk3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCsyrk3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCsyrk3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCsyrk3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ctype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ctype, \"cublasCsyrk3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCsyrk3mEx_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCherk_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const f32,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    beta: *const f32,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCherk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCherk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCherk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCherk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCherk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCherk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCherk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCherk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCherk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCherk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCherk_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCherk_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: i64,\n    k: i64,\n    alpha: *const f32,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    beta: *const f32,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCherk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCherk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCherk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCherk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCherk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCherk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCherk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCherk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCherk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCherk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCherk_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZherk_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const f64,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    beta: *const f64,\n    C: *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZherk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZherk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZherk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZherk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasZherk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZherk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZherk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZherk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZherk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZherk_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZherk_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZherk_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: i64,\n    k: i64,\n    alpha: *const f64,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n    beta: *const f64,\n    C: *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZherk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZherk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZherk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZherk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasZherk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZherk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZherk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZherk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZherk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZherk_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZherk_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCherkEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const f32,\n    A: *const ::core::ffi::c_void,\n    Atype: cuda_types::cublas::cudaDataType,\n    lda: ::core::ffi::c_int,\n    beta: *const f32,\n    C: *mut ::core::ffi::c_void,\n    Ctype: cuda_types::cublas::cudaDataType,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCherkEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCherkEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCherkEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCherkEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCherkEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCherkEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCherkEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Atype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Atype, \"cublasCherkEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCherkEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCherkEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCherkEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ctype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ctype, \"cublasCherkEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCherkEx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCherkEx_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: i64,\n    k: i64,\n    alpha: *const f32,\n    A: *const ::core::ffi::c_void,\n    Atype: cuda_types::cublas::cudaDataType,\n    lda: i64,\n    beta: *const f32,\n    C: *mut ::core::ffi::c_void,\n    Ctype: cuda_types::cublas::cudaDataType,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCherkEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCherkEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCherkEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCherkEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCherkEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCherkEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCherkEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Atype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Atype, \"cublasCherkEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCherkEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCherkEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCherkEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ctype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ctype, \"cublasCherkEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCherkEx_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCherk3mEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const f32,\n    A: *const ::core::ffi::c_void,\n    Atype: cuda_types::cublas::cudaDataType,\n    lda: ::core::ffi::c_int,\n    beta: *const f32,\n    C: *mut ::core::ffi::c_void,\n    Ctype: cuda_types::cublas::cudaDataType,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCherk3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCherk3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCherk3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCherk3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCherk3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCherk3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCherk3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Atype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Atype, \"cublasCherk3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCherk3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCherk3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCherk3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ctype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ctype, \"cublasCherk3mEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCherk3mEx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCherk3mEx_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: i64,\n    k: i64,\n    alpha: *const f32,\n    A: *const ::core::ffi::c_void,\n    Atype: cuda_types::cublas::cudaDataType,\n    lda: i64,\n    beta: *const f32,\n    C: *mut ::core::ffi::c_void,\n    Ctype: cuda_types::cublas::cudaDataType,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCherk3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCherk3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCherk3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCherk3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCherk3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCherk3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCherk3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Atype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Atype, \"cublasCherk3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCherk3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCherk3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCherk3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ctype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ctype, \"cublasCherk3mEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCherk3mEx_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSsyr2k_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const f32,\n    A: *const f32,\n    lda: ::core::ffi::c_int,\n    B: *const f32,\n    ldb: ::core::ffi::c_int,\n    beta: *const f32,\n    C: *mut f32,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasSsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasSsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasSsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasSsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasSsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasSsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasSsyr2k_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSsyr2k_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: i64,\n    k: i64,\n    alpha: *const f32,\n    A: *const f32,\n    lda: i64,\n    B: *const f32,\n    ldb: i64,\n    beta: *const f32,\n    C: *mut f32,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasSsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasSsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasSsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasSsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasSsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasSsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasSsyr2k_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDsyr2k_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const f64,\n    A: *const f64,\n    lda: ::core::ffi::c_int,\n    B: *const f64,\n    ldb: ::core::ffi::c_int,\n    beta: *const f64,\n    C: *mut f64,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasDsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasDsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasDsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasDsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasDsyr2k_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDsyr2k_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: i64,\n    k: i64,\n    alpha: *const f64,\n    A: *const f64,\n    lda: i64,\n    B: *const f64,\n    ldb: i64,\n    beta: *const f64,\n    C: *mut f64,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasDsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasDsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasDsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasDsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasDsyr2k_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCsyr2k_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    B: *const cuda_types::cublas::cuComplex,\n    ldb: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuComplex,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCsyr2k_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCsyr2k_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    B: *const cuda_types::cublas::cuComplex,\n    ldb: i64,\n    beta: *const cuda_types::cublas::cuComplex,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCsyr2k_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZsyr2k_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    B: *const cuda_types::cublas::cuDoubleComplex,\n    ldb: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    C: *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasZsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasZsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZsyr2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZsyr2k_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZsyr2k_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n    B: *const cuda_types::cublas::cuDoubleComplex,\n    ldb: i64,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    C: *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasZsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasZsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZsyr2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZsyr2k_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCher2k_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    B: *const cuda_types::cublas::cuComplex,\n    ldb: ::core::ffi::c_int,\n    beta: *const f32,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCher2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCher2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCher2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCher2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCher2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCher2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCher2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCher2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCher2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCher2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCher2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCher2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCher2k_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCher2k_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    B: *const cuda_types::cublas::cuComplex,\n    ldb: i64,\n    beta: *const f32,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCher2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCher2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCher2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCher2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCher2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCher2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCher2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCher2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCher2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCher2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCher2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCher2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCher2k_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZher2k_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    B: *const cuda_types::cublas::cuDoubleComplex,\n    ldb: ::core::ffi::c_int,\n    beta: *const f64,\n    C: *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZher2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZher2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZher2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZher2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasZher2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZher2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZher2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZher2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasZher2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZher2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZher2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZher2k_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZher2k_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZher2k_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n    B: *const cuda_types::cublas::cuDoubleComplex,\n    ldb: i64,\n    beta: *const f64,\n    C: *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZher2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZher2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZher2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZher2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasZher2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZher2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZher2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZher2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasZher2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZher2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZher2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZher2k_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZher2k_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSsyrkx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const f32,\n    A: *const f32,\n    lda: ::core::ffi::c_int,\n    B: *const f32,\n    ldb: ::core::ffi::c_int,\n    beta: *const f32,\n    C: *mut f32,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasSsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasSsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasSsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasSsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasSsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasSsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasSsyrkx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSsyrkx_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: i64,\n    k: i64,\n    alpha: *const f32,\n    A: *const f32,\n    lda: i64,\n    B: *const f32,\n    ldb: i64,\n    beta: *const f32,\n    C: *mut f32,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasSsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasSsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasSsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasSsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasSsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasSsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasSsyrkx_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDsyrkx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const f64,\n    A: *const f64,\n    lda: ::core::ffi::c_int,\n    B: *const f64,\n    ldb: ::core::ffi::c_int,\n    beta: *const f64,\n    C: *mut f64,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasDsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasDsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasDsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasDsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasDsyrkx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDsyrkx_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: i64,\n    k: i64,\n    alpha: *const f64,\n    A: *const f64,\n    lda: i64,\n    B: *const f64,\n    ldb: i64,\n    beta: *const f64,\n    C: *mut f64,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasDsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasDsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasDsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasDsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasDsyrkx_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCsyrkx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    B: *const cuda_types::cublas::cuComplex,\n    ldb: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuComplex,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCsyrkx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCsyrkx_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    B: *const cuda_types::cublas::cuComplex,\n    ldb: i64,\n    beta: *const cuda_types::cublas::cuComplex,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCsyrkx_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZsyrkx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    B: *const cuda_types::cublas::cuDoubleComplex,\n    ldb: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    C: *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasZsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasZsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZsyrkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZsyrkx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZsyrkx_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n    B: *const cuda_types::cublas::cuDoubleComplex,\n    ldb: i64,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    C: *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasZsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasZsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZsyrkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZsyrkx_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCherkx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    B: *const cuda_types::cublas::cuComplex,\n    ldb: ::core::ffi::c_int,\n    beta: *const f32,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCherkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCherkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCherkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCherkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCherkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCherkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCherkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCherkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCherkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCherkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCherkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCherkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCherkx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCherkx_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    B: *const cuda_types::cublas::cuComplex,\n    ldb: i64,\n    beta: *const f32,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCherkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCherkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCherkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCherkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCherkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCherkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCherkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCherkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCherkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCherkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCherkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCherkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCherkx_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZherkx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    B: *const cuda_types::cublas::cuDoubleComplex,\n    ldb: ::core::ffi::c_int,\n    beta: *const f64,\n    C: *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZherkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZherkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZherkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZherkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasZherkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZherkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZherkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZherkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasZherkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZherkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZherkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZherkx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZherkx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZherkx_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n    B: *const cuda_types::cublas::cuDoubleComplex,\n    ldb: i64,\n    beta: *const f64,\n    C: *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZherkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZherkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZherkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZherkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasZherkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZherkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZherkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZherkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasZherkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZherkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZherkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZherkx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZherkx_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSsymm_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    A: *const f32,\n    lda: ::core::ffi::c_int,\n    B: *const f32,\n    ldb: ::core::ffi::c_int,\n    beta: *const f32,\n    C: *mut f32,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasSsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasSsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasSsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasSsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasSsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasSsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasSsymm_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSsymm_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    m: i64,\n    n: i64,\n    alpha: *const f32,\n    A: *const f32,\n    lda: i64,\n    B: *const f32,\n    ldb: i64,\n    beta: *const f32,\n    C: *mut f32,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasSsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasSsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasSsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasSsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasSsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasSsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasSsymm_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDsymm_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f64,\n    A: *const f64,\n    lda: ::core::ffi::c_int,\n    B: *const f64,\n    ldb: ::core::ffi::c_int,\n    beta: *const f64,\n    C: *mut f64,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasDsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasDsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasDsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasDsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasDsymm_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDsymm_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    m: i64,\n    n: i64,\n    alpha: *const f64,\n    A: *const f64,\n    lda: i64,\n    B: *const f64,\n    ldb: i64,\n    beta: *const f64,\n    C: *mut f64,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasDsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasDsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasDsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasDsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasDsymm_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCsymm_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    B: *const cuda_types::cublas::cuComplex,\n    ldb: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuComplex,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasCsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCsymm_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCsymm_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    m: i64,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    B: *const cuda_types::cublas::cuComplex,\n    ldb: i64,\n    beta: *const cuda_types::cublas::cuComplex,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasCsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCsymm_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZsymm_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    B: *const cuda_types::cublas::cuDoubleComplex,\n    ldb: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    C: *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasZsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasZsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZsymm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZsymm_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZsymm_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    m: i64,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n    B: *const cuda_types::cublas::cuDoubleComplex,\n    ldb: i64,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    C: *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasZsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasZsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZsymm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZsymm_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasChemm_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    B: *const cuda_types::cublas::cuComplex,\n    ldb: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuComplex,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasChemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasChemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasChemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasChemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasChemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasChemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasChemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasChemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasChemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasChemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasChemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasChemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasChemm_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasChemm_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    m: i64,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    B: *const cuda_types::cublas::cuComplex,\n    ldb: i64,\n    beta: *const cuda_types::cublas::cuComplex,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasChemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasChemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasChemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasChemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasChemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasChemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasChemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasChemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasChemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasChemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasChemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasChemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasChemm_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZhemm_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    B: *const cuda_types::cublas::cuDoubleComplex,\n    ldb: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    C: *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZhemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasZhemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZhemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZhemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZhemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZhemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZhemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZhemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasZhemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZhemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZhemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZhemm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZhemm_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZhemm_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    m: i64,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n    B: *const cuda_types::cublas::cuDoubleComplex,\n    ldb: i64,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    C: *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZhemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasZhemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZhemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZhemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZhemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZhemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZhemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZhemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasZhemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZhemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZhemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZhemm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZhemm_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasStrsm_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    A: *const f32,\n    lda: ::core::ffi::c_int,\n    B: *mut f32,\n    ldb: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasStrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasStrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasStrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasStrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasStrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasStrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasStrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasStrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasStrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasStrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasStrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasStrsm_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasStrsm_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    m: i64,\n    n: i64,\n    alpha: *const f32,\n    A: *const f32,\n    lda: i64,\n    B: *mut f32,\n    ldb: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasStrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasStrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasStrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasStrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasStrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasStrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasStrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasStrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasStrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasStrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasStrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasStrsm_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDtrsm_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f64,\n    A: *const f64,\n    lda: ::core::ffi::c_int,\n    B: *mut f64,\n    ldb: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasDtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasDtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasDtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasDtrsm_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDtrsm_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    m: i64,\n    n: i64,\n    alpha: *const f64,\n    A: *const f64,\n    lda: i64,\n    B: *mut f64,\n    ldb: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasDtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasDtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasDtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasDtrsm_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCtrsm_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    B: *mut cuda_types::cublas::cuComplex,\n    ldb: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasCtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasCtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCtrsm_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCtrsm_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    m: i64,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    B: *mut cuda_types::cublas::cuComplex,\n    ldb: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasCtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasCtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCtrsm_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZtrsm_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    B: *mut cuda_types::cublas::cuDoubleComplex,\n    ldb: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasZtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasZtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasZtrsm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZtrsm_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZtrsm_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    m: i64,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n    B: *mut cuda_types::cublas::cuDoubleComplex,\n    ldb: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasZtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasZtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasZtrsm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZtrsm_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasStrmm_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    A: *const f32,\n    lda: ::core::ffi::c_int,\n    B: *const f32,\n    ldb: ::core::ffi::c_int,\n    C: *mut f32,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasStrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasStrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasStrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasStrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasStrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasStrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasStrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasStrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasStrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasStrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasStrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasStrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasStrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasStrmm_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasStrmm_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    m: i64,\n    n: i64,\n    alpha: *const f32,\n    A: *const f32,\n    lda: i64,\n    B: *const f32,\n    ldb: i64,\n    C: *mut f32,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasStrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasStrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasStrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasStrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasStrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasStrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasStrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasStrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasStrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasStrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasStrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasStrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasStrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasStrmm_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDtrmm_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f64,\n    A: *const f64,\n    lda: ::core::ffi::c_int,\n    B: *const f64,\n    ldb: ::core::ffi::c_int,\n    C: *mut f64,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasDtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasDtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasDtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasDtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasDtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasDtrmm_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDtrmm_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    m: i64,\n    n: i64,\n    alpha: *const f64,\n    A: *const f64,\n    lda: i64,\n    B: *const f64,\n    ldb: i64,\n    C: *mut f64,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasDtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasDtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasDtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasDtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasDtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasDtrmm_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCtrmm_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    B: *const cuda_types::cublas::cuComplex,\n    ldb: ::core::ffi::c_int,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasCtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasCtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCtrmm_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCtrmm_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    m: i64,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    B: *const cuda_types::cublas::cuComplex,\n    ldb: i64,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasCtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasCtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCtrmm_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZtrmm_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    B: *const cuda_types::cublas::cuDoubleComplex,\n    ldb: ::core::ffi::c_int,\n    C: *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasZtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasZtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasZtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZtrmm_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZtrmm_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZtrmm_v2_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    m: i64,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n    B: *const cuda_types::cublas::cuDoubleComplex,\n    ldb: i64,\n    C: *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasZtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasZtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasZtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZtrmm_v2_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZtrmm_v2_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasHgemmBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::__half,\n    Aarray: *const *const cuda_types::cublas::__half,\n    lda: ::core::ffi::c_int,\n    Barray: *const *const cuda_types::cublas::__half,\n    ldb: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::__half,\n    Carray: *const *mut cuda_types::cublas::__half,\n    ldc: ::core::ffi::c_int,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasHgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasHgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasHgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasHgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasHgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasHgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasHgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasHgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasHgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Barray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Barray, \"cublasHgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasHgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasHgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Carray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Carray, \"cublasHgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasHgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasHgemmBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasHgemmBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::__half,\n    Aarray: *const *const cuda_types::cublas::__half,\n    lda: i64,\n    Barray: *const *const cuda_types::cublas::__half,\n    ldb: i64,\n    beta: *const cuda_types::cublas::__half,\n    Carray: *const *mut cuda_types::cublas::__half,\n    ldc: i64,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasHgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasHgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasHgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasHgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasHgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasHgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasHgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasHgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasHgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Barray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Barray, \"cublasHgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasHgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasHgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Carray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Carray, \"cublasHgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasHgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasHgemmBatched_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSgemmBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const f32,\n    Aarray: *const *const f32,\n    lda: ::core::ffi::c_int,\n    Barray: *const *const f32,\n    ldb: ::core::ffi::c_int,\n    beta: *const f32,\n    Carray: *const *mut f32,\n    ldc: ::core::ffi::c_int,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasSgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasSgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasSgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasSgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasSgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Barray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Barray, \"cublasSgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasSgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Carray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Carray, \"cublasSgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasSgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasSgemmBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSgemmBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    k: i64,\n    alpha: *const f32,\n    Aarray: *const *const f32,\n    lda: i64,\n    Barray: *const *const f32,\n    ldb: i64,\n    beta: *const f32,\n    Carray: *const *mut f32,\n    ldc: i64,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasSgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasSgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasSgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasSgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasSgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Barray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Barray, \"cublasSgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasSgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Carray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Carray, \"cublasSgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasSgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasSgemmBatched_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDgemmBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const f64,\n    Aarray: *const *const f64,\n    lda: ::core::ffi::c_int,\n    Barray: *const *const f64,\n    ldb: ::core::ffi::c_int,\n    beta: *const f64,\n    Carray: *const *mut f64,\n    ldc: ::core::ffi::c_int,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasDgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasDgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasDgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasDgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Barray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Barray, \"cublasDgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasDgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Carray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Carray, \"cublasDgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasDgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasDgemmBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDgemmBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    k: i64,\n    alpha: *const f64,\n    Aarray: *const *const f64,\n    lda: i64,\n    Barray: *const *const f64,\n    ldb: i64,\n    beta: *const f64,\n    Carray: *const *mut f64,\n    ldc: i64,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasDgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasDgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasDgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasDgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Barray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Barray, \"cublasDgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasDgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Carray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Carray, \"cublasDgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasDgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasDgemmBatched_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgemmBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    Aarray: *const *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    Barray: *const *const cuda_types::cublas::cuComplex,\n    ldb: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuComplex,\n    Carray: *const *mut cuda_types::cublas::cuComplex,\n    ldc: ::core::ffi::c_int,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasCgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasCgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasCgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Barray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Barray, \"cublasCgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Carray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Carray, \"cublasCgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasCgemmBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgemmBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    Aarray: *const *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    Barray: *const *const cuda_types::cublas::cuComplex,\n    ldb: i64,\n    beta: *const cuda_types::cublas::cuComplex,\n    Carray: *const *mut cuda_types::cublas::cuComplex,\n    ldc: i64,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasCgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasCgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasCgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Barray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Barray, \"cublasCgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Carray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Carray, \"cublasCgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasCgemmBatched_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgemm3mBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    Aarray: *const *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    Barray: *const *const cuda_types::cublas::cuComplex,\n    ldb: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuComplex,\n    Carray: *const *mut cuda_types::cublas::cuComplex,\n    ldc: ::core::ffi::c_int,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgemm3mBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasCgemm3mBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasCgemm3mBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgemm3mBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgemm3mBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCgemm3mBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgemm3mBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasCgemm3mBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgemm3mBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Barray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Barray, \"cublasCgemm3mBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCgemm3mBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCgemm3mBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Carray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Carray, \"cublasCgemm3mBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCgemm3mBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasCgemm3mBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgemm3mBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    Aarray: *const *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    Barray: *const *const cuda_types::cublas::cuComplex,\n    ldb: i64,\n    beta: *const cuda_types::cublas::cuComplex,\n    Carray: *const *mut cuda_types::cublas::cuComplex,\n    ldc: i64,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgemm3mBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasCgemm3mBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasCgemm3mBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgemm3mBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgemm3mBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCgemm3mBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgemm3mBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasCgemm3mBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgemm3mBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Barray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Barray, \"cublasCgemm3mBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCgemm3mBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCgemm3mBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Carray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Carray, \"cublasCgemm3mBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCgemm3mBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasCgemm3mBatched_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZgemmBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    Aarray: *const *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    Barray: *const *const cuda_types::cublas::cuDoubleComplex,\n    ldb: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    Carray: *const *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: ::core::ffi::c_int,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasZgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasZgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasZgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasZgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Barray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Barray, \"cublasZgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Carray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Carray, \"cublasZgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZgemmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasZgemmBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZgemmBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    Aarray: *const *const cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n    Barray: *const *const cuda_types::cublas::cuDoubleComplex,\n    ldb: i64,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    Carray: *const *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: i64,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasZgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasZgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasZgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasZgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Barray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Barray, \"cublasZgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Carray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Carray, \"cublasZgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZgemmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasZgemmBatched_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasHgemmStridedBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::__half,\n    A: *const cuda_types::cublas::__half,\n    lda: ::core::ffi::c_int,\n    strideA: ::core::ffi::c_longlong,\n    B: *const cuda_types::cublas::__half,\n    ldb: ::core::ffi::c_int,\n    strideB: ::core::ffi::c_longlong,\n    beta: *const cuda_types::cublas::__half,\n    C: *mut cuda_types::cublas::__half,\n    ldc: ::core::ffi::c_int,\n    strideC: ::core::ffi::c_longlong,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasHgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasHgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasHgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasHgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasHgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasHgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasHgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasHgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasHgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideA, \"cublasHgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasHgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasHgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideB, \"cublasHgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasHgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasHgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasHgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideC, \"cublasHgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasHgemmStridedBatched\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasHgemmStridedBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::__half,\n    A: *const cuda_types::cublas::__half,\n    lda: i64,\n    strideA: ::core::ffi::c_longlong,\n    B: *const cuda_types::cublas::__half,\n    ldb: i64,\n    strideB: ::core::ffi::c_longlong,\n    beta: *const cuda_types::cublas::__half,\n    C: *mut cuda_types::cublas::__half,\n    ldc: i64,\n    strideC: ::core::ffi::c_longlong,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasHgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasHgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasHgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasHgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasHgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasHgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasHgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasHgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasHgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideA,\n        \"cublasHgemmStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasHgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasHgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideB,\n        \"cublasHgemmStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasHgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasHgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasHgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideC,\n        \"cublasHgemmStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasHgemmStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSgemmStridedBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const f32,\n    A: *const f32,\n    lda: ::core::ffi::c_int,\n    strideA: ::core::ffi::c_longlong,\n    B: *const f32,\n    ldb: ::core::ffi::c_int,\n    strideB: ::core::ffi::c_longlong,\n    beta: *const f32,\n    C: *mut f32,\n    ldc: ::core::ffi::c_int,\n    strideC: ::core::ffi::c_longlong,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasSgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasSgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasSgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasSgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideA, \"cublasSgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasSgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasSgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideB, \"cublasSgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasSgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasSgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideC, \"cublasSgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasSgemmStridedBatched\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSgemmStridedBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    k: i64,\n    alpha: *const f32,\n    A: *const f32,\n    lda: i64,\n    strideA: ::core::ffi::c_longlong,\n    B: *const f32,\n    ldb: i64,\n    strideB: ::core::ffi::c_longlong,\n    beta: *const f32,\n    C: *mut f32,\n    ldc: i64,\n    strideC: ::core::ffi::c_longlong,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasSgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasSgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasSgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasSgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideA,\n        \"cublasSgemmStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasSgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasSgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideB,\n        \"cublasSgemmStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasSgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasSgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideC,\n        \"cublasSgemmStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasSgemmStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDgemmStridedBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const f64,\n    A: *const f64,\n    lda: ::core::ffi::c_int,\n    strideA: ::core::ffi::c_longlong,\n    B: *const f64,\n    ldb: ::core::ffi::c_int,\n    strideB: ::core::ffi::c_longlong,\n    beta: *const f64,\n    C: *mut f64,\n    ldc: ::core::ffi::c_int,\n    strideC: ::core::ffi::c_longlong,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasDgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasDgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasDgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideA, \"cublasDgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasDgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasDgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideB, \"cublasDgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasDgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasDgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideC, \"cublasDgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasDgemmStridedBatched\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDgemmStridedBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    k: i64,\n    alpha: *const f64,\n    A: *const f64,\n    lda: i64,\n    strideA: ::core::ffi::c_longlong,\n    B: *const f64,\n    ldb: i64,\n    strideB: ::core::ffi::c_longlong,\n    beta: *const f64,\n    C: *mut f64,\n    ldc: i64,\n    strideC: ::core::ffi::c_longlong,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasDgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasDgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasDgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideA,\n        \"cublasDgemmStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasDgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasDgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideB,\n        \"cublasDgemmStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasDgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasDgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideC,\n        \"cublasDgemmStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasDgemmStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgemmStridedBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    strideA: ::core::ffi::c_longlong,\n    B: *const cuda_types::cublas::cuComplex,\n    ldb: ::core::ffi::c_int,\n    strideB: ::core::ffi::c_longlong,\n    beta: *const cuda_types::cublas::cuComplex,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: ::core::ffi::c_int,\n    strideC: ::core::ffi::c_longlong,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasCgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasCgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideA, \"cublasCgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideB, \"cublasCgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideC, \"cublasCgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasCgemmStridedBatched\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgemmStridedBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    strideA: ::core::ffi::c_longlong,\n    B: *const cuda_types::cublas::cuComplex,\n    ldb: i64,\n    strideB: ::core::ffi::c_longlong,\n    beta: *const cuda_types::cublas::cuComplex,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: i64,\n    strideC: ::core::ffi::c_longlong,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasCgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasCgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideA,\n        \"cublasCgemmStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideB,\n        \"cublasCgemmStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideC,\n        \"cublasCgemmStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasCgemmStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgemm3mStridedBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    strideA: ::core::ffi::c_longlong,\n    B: *const cuda_types::cublas::cuComplex,\n    ldb: ::core::ffi::c_int,\n    strideB: ::core::ffi::c_longlong,\n    beta: *const cuda_types::cublas::cuComplex,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: ::core::ffi::c_int,\n    strideC: ::core::ffi::c_longlong,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgemm3mStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasCgemm3mStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasCgemm3mStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgemm3mStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgemm3mStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCgemm3mStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgemm3mStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCgemm3mStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgemm3mStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideA, \"cublasCgemm3mStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCgemm3mStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCgemm3mStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideB, \"cublasCgemm3mStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCgemm3mStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCgemm3mStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCgemm3mStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideC, \"cublasCgemm3mStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasCgemm3mStridedBatched\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgemm3mStridedBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    strideA: ::core::ffi::c_longlong,\n    B: *const cuda_types::cublas::cuComplex,\n    ldb: i64,\n    strideB: ::core::ffi::c_longlong,\n    beta: *const cuda_types::cublas::cuComplex,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: i64,\n    strideC: ::core::ffi::c_longlong,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cublasCgemm3mStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transa,\n        \"cublasCgemm3mStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transb,\n        \"cublasCgemm3mStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgemm3mStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgemm3mStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasCgemm3mStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha,\n        \"cublasCgemm3mStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCgemm3mStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgemm3mStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideA,\n        \"cublasCgemm3mStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCgemm3mStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCgemm3mStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideB,\n        \"cublasCgemm3mStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCgemm3mStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCgemm3mStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCgemm3mStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideC,\n        \"cublasCgemm3mStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasCgemm3mStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZgemmStridedBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    strideA: ::core::ffi::c_longlong,\n    B: *const cuda_types::cublas::cuDoubleComplex,\n    ldb: ::core::ffi::c_int,\n    strideB: ::core::ffi::c_longlong,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    C: *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: ::core::ffi::c_int,\n    strideC: ::core::ffi::c_longlong,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasZgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasZgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasZgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideA, \"cublasZgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasZgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideB, \"cublasZgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideC, \"cublasZgemmStridedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasZgemmStridedBatched\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZgemmStridedBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    k: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n    strideA: ::core::ffi::c_longlong,\n    B: *const cuda_types::cublas::cuDoubleComplex,\n    ldb: i64,\n    strideB: ::core::ffi::c_longlong,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    C: *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: i64,\n    strideC: ::core::ffi::c_longlong,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasZgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasZgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasZgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideA,\n        \"cublasZgemmStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasZgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideB,\n        \"cublasZgemmStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZgemmStridedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideC,\n        \"cublasZgemmStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasZgemmStridedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasGemmBatchedEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const ::core::ffi::c_void,\n    Aarray: *const *const ::core::ffi::c_void,\n    Atype: cuda_types::cublas::cudaDataType,\n    lda: ::core::ffi::c_int,\n    Barray: *const *const ::core::ffi::c_void,\n    Btype: cuda_types::cublas::cudaDataType,\n    ldb: ::core::ffi::c_int,\n    beta: *const ::core::ffi::c_void,\n    Carray: *const *mut ::core::ffi::c_void,\n    Ctype: cuda_types::cublas::cudaDataType,\n    ldc: ::core::ffi::c_int,\n    batchCount: ::core::ffi::c_int,\n    computeType: cuda_types::cublas::cublasComputeType_t,\n    algo: cuda_types::cublas::cublasGemmAlgo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasGemmBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasGemmBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasGemmBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasGemmBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasGemmBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasGemmBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasGemmBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasGemmBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Atype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Atype, \"cublasGemmBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasGemmBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Barray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Barray, \"cublasGemmBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Btype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Btype, \"cublasGemmBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasGemmBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasGemmBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Carray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Carray, \"cublasGemmBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ctype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ctype, \"cublasGemmBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasGemmBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasGemmBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&computeType, \"cublasGemmBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cublasGemmBatchedEx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasGemmBatchedEx_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    k: i64,\n    alpha: *const ::core::ffi::c_void,\n    Aarray: *const *const ::core::ffi::c_void,\n    Atype: cuda_types::cublas::cudaDataType,\n    lda: i64,\n    Barray: *const *const ::core::ffi::c_void,\n    Btype: cuda_types::cublas::cudaDataType,\n    ldb: i64,\n    beta: *const ::core::ffi::c_void,\n    Carray: *const *mut ::core::ffi::c_void,\n    Ctype: cuda_types::cublas::cudaDataType,\n    ldc: i64,\n    batchCount: i64,\n    computeType: cuda_types::cublas::cublasComputeType_t,\n    algo: cuda_types::cublas::cublasGemmAlgo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasGemmBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasGemmBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasGemmBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasGemmBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasGemmBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasGemmBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasGemmBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasGemmBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Atype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Atype, \"cublasGemmBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasGemmBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Barray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Barray, \"cublasGemmBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Btype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Btype, \"cublasGemmBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasGemmBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasGemmBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Carray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Carray, \"cublasGemmBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ctype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ctype, \"cublasGemmBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasGemmBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasGemmBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&computeType, \"cublasGemmBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cublasGemmBatchedEx_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasGemmStridedBatchedEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    alpha: *const ::core::ffi::c_void,\n    A: *const ::core::ffi::c_void,\n    Atype: cuda_types::cublas::cudaDataType,\n    lda: ::core::ffi::c_int,\n    strideA: ::core::ffi::c_longlong,\n    B: *const ::core::ffi::c_void,\n    Btype: cuda_types::cublas::cudaDataType,\n    ldb: ::core::ffi::c_int,\n    strideB: ::core::ffi::c_longlong,\n    beta: *const ::core::ffi::c_void,\n    C: *mut ::core::ffi::c_void,\n    Ctype: cuda_types::cublas::cudaDataType,\n    ldc: ::core::ffi::c_int,\n    strideC: ::core::ffi::c_longlong,\n    batchCount: ::core::ffi::c_int,\n    computeType: cuda_types::cublas::cublasComputeType_t,\n    algo: cuda_types::cublas::cublasGemmAlgo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasGemmStridedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasGemmStridedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasGemmStridedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasGemmStridedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasGemmStridedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasGemmStridedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasGemmStridedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasGemmStridedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Atype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Atype, \"cublasGemmStridedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasGemmStridedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideA, \"cublasGemmStridedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasGemmStridedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Btype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Btype, \"cublasGemmStridedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasGemmStridedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideB, \"cublasGemmStridedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasGemmStridedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasGemmStridedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ctype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ctype, \"cublasGemmStridedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasGemmStridedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideC, \"cublasGemmStridedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasGemmStridedBatchedEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &computeType,\n        \"cublasGemmStridedBatchedEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cublasGemmStridedBatchedEx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasGemmStridedBatchedEx_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    k: i64,\n    alpha: *const ::core::ffi::c_void,\n    A: *const ::core::ffi::c_void,\n    Atype: cuda_types::cublas::cudaDataType,\n    lda: i64,\n    strideA: ::core::ffi::c_longlong,\n    B: *const ::core::ffi::c_void,\n    Btype: cuda_types::cublas::cudaDataType,\n    ldb: i64,\n    strideB: ::core::ffi::c_longlong,\n    beta: *const ::core::ffi::c_void,\n    C: *mut ::core::ffi::c_void,\n    Ctype: cuda_types::cublas::cudaDataType,\n    ldc: i64,\n    strideC: ::core::ffi::c_longlong,\n    batchCount: i64,\n    computeType: cuda_types::cublas::cublasComputeType_t,\n    algo: cuda_types::cublas::cublasGemmAlgo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cublasGemmStridedBatchedEx_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transa,\n        \"cublasGemmStridedBatchedEx_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transb,\n        \"cublasGemmStridedBatchedEx_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasGemmStridedBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasGemmStridedBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasGemmStridedBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasGemmStridedBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasGemmStridedBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Atype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Atype, \"cublasGemmStridedBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasGemmStridedBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideA,\n        \"cublasGemmStridedBatchedEx_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasGemmStridedBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Btype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Btype, \"cublasGemmStridedBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasGemmStridedBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideB,\n        \"cublasGemmStridedBatchedEx_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasGemmStridedBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasGemmStridedBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ctype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ctype, \"cublasGemmStridedBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasGemmStridedBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideC,\n        \"cublasGemmStridedBatchedEx_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cublasGemmStridedBatchedEx_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &computeType,\n        \"cublasGemmStridedBatchedEx_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cublasGemmStridedBatchedEx_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSgemmGroupedBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa_array: *const cuda_types::cublas::cublasOperation_t,\n    transb_array: *const cuda_types::cublas::cublasOperation_t,\n    m_array: *const ::core::ffi::c_int,\n    n_array: *const ::core::ffi::c_int,\n    k_array: *const ::core::ffi::c_int,\n    alpha_array: *const f32,\n    Aarray: *const *const f32,\n    lda_array: *const ::core::ffi::c_int,\n    Barray: *const *const f32,\n    ldb_array: *const ::core::ffi::c_int,\n    beta_array: *const f32,\n    Carray: *const *mut f32,\n    ldc_array: *const ::core::ffi::c_int,\n    group_count: ::core::ffi::c_int,\n    group_size: *const ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSgemmGroupedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transa_array,\n        \"cublasSgemmGroupedBatched\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transb_array,\n        \"cublasSgemmGroupedBatched\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m_array, \"cublasSgemmGroupedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n_array, \"cublasSgemmGroupedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k_array, \"cublasSgemmGroupedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha_array,\n        \"cublasSgemmGroupedBatched\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasSgemmGroupedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda_array, \"cublasSgemmGroupedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Barray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Barray, \"cublasSgemmGroupedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb_array, \"cublasSgemmGroupedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &beta_array,\n        \"cublasSgemmGroupedBatched\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Carray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Carray, \"cublasSgemmGroupedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc_array, \"cublasSgemmGroupedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(group_count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &group_count,\n        \"cublasSgemmGroupedBatched\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(group_size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &group_size,\n        \"cublasSgemmGroupedBatched\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSgemmGroupedBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa_array: *const cuda_types::cublas::cublasOperation_t,\n    transb_array: *const cuda_types::cublas::cublasOperation_t,\n    m_array: *const i64,\n    n_array: *const i64,\n    k_array: *const i64,\n    alpha_array: *const f32,\n    Aarray: *const *const f32,\n    lda_array: *const i64,\n    Barray: *const *const f32,\n    ldb_array: *const i64,\n    beta_array: *const f32,\n    Carray: *const *mut f32,\n    ldc_array: *const i64,\n    group_count: i64,\n    group_size: *const i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSgemmGroupedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transa_array,\n        \"cublasSgemmGroupedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transb_array,\n        \"cublasSgemmGroupedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m_array,\n        \"cublasSgemmGroupedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &n_array,\n        \"cublasSgemmGroupedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &k_array,\n        \"cublasSgemmGroupedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha_array,\n        \"cublasSgemmGroupedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasSgemmGroupedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &lda_array,\n        \"cublasSgemmGroupedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Barray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Barray, \"cublasSgemmGroupedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ldb_array,\n        \"cublasSgemmGroupedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &beta_array,\n        \"cublasSgemmGroupedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Carray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Carray, \"cublasSgemmGroupedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ldc_array,\n        \"cublasSgemmGroupedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(group_count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &group_count,\n        \"cublasSgemmGroupedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(group_size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &group_size,\n        \"cublasSgemmGroupedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDgemmGroupedBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa_array: *const cuda_types::cublas::cublasOperation_t,\n    transb_array: *const cuda_types::cublas::cublasOperation_t,\n    m_array: *const ::core::ffi::c_int,\n    n_array: *const ::core::ffi::c_int,\n    k_array: *const ::core::ffi::c_int,\n    alpha_array: *const f64,\n    Aarray: *const *const f64,\n    lda_array: *const ::core::ffi::c_int,\n    Barray: *const *const f64,\n    ldb_array: *const ::core::ffi::c_int,\n    beta_array: *const f64,\n    Carray: *const *mut f64,\n    ldc_array: *const ::core::ffi::c_int,\n    group_count: ::core::ffi::c_int,\n    group_size: *const ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDgemmGroupedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transa_array,\n        \"cublasDgemmGroupedBatched\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transb_array,\n        \"cublasDgemmGroupedBatched\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m_array, \"cublasDgemmGroupedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n_array, \"cublasDgemmGroupedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k_array, \"cublasDgemmGroupedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha_array,\n        \"cublasDgemmGroupedBatched\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasDgemmGroupedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda_array, \"cublasDgemmGroupedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Barray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Barray, \"cublasDgemmGroupedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb_array, \"cublasDgemmGroupedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &beta_array,\n        \"cublasDgemmGroupedBatched\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Carray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Carray, \"cublasDgemmGroupedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc_array, \"cublasDgemmGroupedBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(group_count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &group_count,\n        \"cublasDgemmGroupedBatched\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(group_size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &group_size,\n        \"cublasDgemmGroupedBatched\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDgemmGroupedBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa_array: *const cuda_types::cublas::cublasOperation_t,\n    transb_array: *const cuda_types::cublas::cublasOperation_t,\n    m_array: *const i64,\n    n_array: *const i64,\n    k_array: *const i64,\n    alpha_array: *const f64,\n    Aarray: *const *const f64,\n    lda_array: *const i64,\n    Barray: *const *const f64,\n    ldb_array: *const i64,\n    beta_array: *const f64,\n    Carray: *const *mut f64,\n    ldc_array: *const i64,\n    group_count: i64,\n    group_size: *const i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDgemmGroupedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transa_array,\n        \"cublasDgemmGroupedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transb_array,\n        \"cublasDgemmGroupedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m_array,\n        \"cublasDgemmGroupedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &n_array,\n        \"cublasDgemmGroupedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &k_array,\n        \"cublasDgemmGroupedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha_array,\n        \"cublasDgemmGroupedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasDgemmGroupedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &lda_array,\n        \"cublasDgemmGroupedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Barray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Barray, \"cublasDgemmGroupedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ldb_array,\n        \"cublasDgemmGroupedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &beta_array,\n        \"cublasDgemmGroupedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Carray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Carray, \"cublasDgemmGroupedBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ldc_array,\n        \"cublasDgemmGroupedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(group_count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &group_count,\n        \"cublasDgemmGroupedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(group_size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &group_size,\n        \"cublasDgemmGroupedBatched_64\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasGemmGroupedBatchedEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa_array: *const cuda_types::cublas::cublasOperation_t,\n    transb_array: *const cuda_types::cublas::cublasOperation_t,\n    m_array: *const ::core::ffi::c_int,\n    n_array: *const ::core::ffi::c_int,\n    k_array: *const ::core::ffi::c_int,\n    alpha_array: *const ::core::ffi::c_void,\n    Aarray: *const *const ::core::ffi::c_void,\n    Atype: cuda_types::cublas::cudaDataType_t,\n    lda_array: *const ::core::ffi::c_int,\n    Barray: *const *const ::core::ffi::c_void,\n    Btype: cuda_types::cublas::cudaDataType_t,\n    ldb_array: *const ::core::ffi::c_int,\n    beta_array: *const ::core::ffi::c_void,\n    Carray: *const *mut ::core::ffi::c_void,\n    Ctype: cuda_types::cublas::cudaDataType_t,\n    ldc_array: *const ::core::ffi::c_int,\n    group_count: ::core::ffi::c_int,\n    group_size: *const ::core::ffi::c_int,\n    computeType: cuda_types::cublas::cublasComputeType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasGemmGroupedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transa_array,\n        \"cublasGemmGroupedBatchedEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transb_array,\n        \"cublasGemmGroupedBatchedEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m_array, \"cublasGemmGroupedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n_array, \"cublasGemmGroupedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k_array, \"cublasGemmGroupedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha_array,\n        \"cublasGemmGroupedBatchedEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasGemmGroupedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Atype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Atype, \"cublasGemmGroupedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &lda_array,\n        \"cublasGemmGroupedBatchedEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Barray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Barray, \"cublasGemmGroupedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Btype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Btype, \"cublasGemmGroupedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ldb_array,\n        \"cublasGemmGroupedBatchedEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &beta_array,\n        \"cublasGemmGroupedBatchedEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Carray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Carray, \"cublasGemmGroupedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ctype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ctype, \"cublasGemmGroupedBatchedEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ldc_array,\n        \"cublasGemmGroupedBatchedEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(group_count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &group_count,\n        \"cublasGemmGroupedBatchedEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(group_size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &group_size,\n        \"cublasGemmGroupedBatchedEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &computeType,\n        \"cublasGemmGroupedBatchedEx\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasGemmGroupedBatchedEx_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa_array: *const cuda_types::cublas::cublasOperation_t,\n    transb_array: *const cuda_types::cublas::cublasOperation_t,\n    m_array: *const i64,\n    n_array: *const i64,\n    k_array: *const i64,\n    alpha_array: *const ::core::ffi::c_void,\n    Aarray: *const *const ::core::ffi::c_void,\n    Atype: cuda_types::cublas::cudaDataType_t,\n    lda_array: *const i64,\n    Barray: *const *const ::core::ffi::c_void,\n    Btype: cuda_types::cublas::cudaDataType_t,\n    ldb_array: *const i64,\n    beta_array: *const ::core::ffi::c_void,\n    Carray: *const *mut ::core::ffi::c_void,\n    Ctype: cuda_types::cublas::cudaDataType_t,\n    ldc_array: *const i64,\n    group_count: i64,\n    group_size: *const i64,\n    computeType: cuda_types::cublas::cublasComputeType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cublasGemmGroupedBatchedEx_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transa_array,\n        \"cublasGemmGroupedBatchedEx_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transb_array,\n        \"cublasGemmGroupedBatchedEx_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m_array,\n        \"cublasGemmGroupedBatchedEx_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &n_array,\n        \"cublasGemmGroupedBatchedEx_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &k_array,\n        \"cublasGemmGroupedBatchedEx_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha_array,\n        \"cublasGemmGroupedBatchedEx_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &Aarray,\n        \"cublasGemmGroupedBatchedEx_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Atype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Atype, \"cublasGemmGroupedBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &lda_array,\n        \"cublasGemmGroupedBatchedEx_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Barray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &Barray,\n        \"cublasGemmGroupedBatchedEx_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Btype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Btype, \"cublasGemmGroupedBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ldb_array,\n        \"cublasGemmGroupedBatchedEx_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &beta_array,\n        \"cublasGemmGroupedBatchedEx_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Carray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &Carray,\n        \"cublasGemmGroupedBatchedEx_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ctype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ctype, \"cublasGemmGroupedBatchedEx_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc_array), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ldc_array,\n        \"cublasGemmGroupedBatchedEx_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(group_count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &group_count,\n        \"cublasGemmGroupedBatchedEx_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(group_size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &group_size,\n        \"cublasGemmGroupedBatchedEx_64\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &computeType,\n        \"cublasGemmGroupedBatchedEx_64\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSgeam(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    A: *const f32,\n    lda: ::core::ffi::c_int,\n    beta: *const f32,\n    B: *const f32,\n    ldb: ::core::ffi::c_int,\n    C: *mut f32,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasSgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasSgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasSgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasSgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasSgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasSgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasSgeam\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSgeam_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    alpha: *const f32,\n    A: *const f32,\n    lda: i64,\n    beta: *const f32,\n    B: *const f32,\n    ldb: i64,\n    C: *mut f32,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasSgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasSgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasSgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasSgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasSgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasSgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasSgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasSgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasSgeam_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDgeam(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f64,\n    A: *const f64,\n    lda: ::core::ffi::c_int,\n    beta: *const f64,\n    B: *const f64,\n    ldb: ::core::ffi::c_int,\n    C: *mut f64,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasDgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasDgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasDgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasDgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasDgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasDgeam\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDgeam_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    alpha: *const f64,\n    A: *const f64,\n    lda: i64,\n    beta: *const f64,\n    B: *const f64,\n    ldb: i64,\n    C: *mut f64,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasDgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasDgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasDgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasDgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasDgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasDgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasDgeam_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgeam(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuComplex,\n    B: *const cuda_types::cublas::cuComplex,\n    ldb: ::core::ffi::c_int,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasCgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasCgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCgeam\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgeam_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    beta: *const cuda_types::cublas::cuComplex,\n    B: *const cuda_types::cublas::cuComplex,\n    ldb: i64,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasCgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasCgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasCgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCgeam_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZgeam(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    B: *const cuda_types::cublas::cuDoubleComplex,\n    ldb: ::core::ffi::c_int,\n    C: *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasZgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasZgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasZgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZgeam\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZgeam\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZgeam_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    m: i64,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n    beta: *const cuda_types::cublas::cuDoubleComplex,\n    B: *const cuda_types::cublas::cuDoubleComplex,\n    ldb: i64,\n    C: *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasZgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasZgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasZgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasZgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZgeam_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZgeam_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasStrsmBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    A: *const *const f32,\n    lda: ::core::ffi::c_int,\n    B: *const *mut f32,\n    ldb: ::core::ffi::c_int,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasStrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasStrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasStrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasStrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasStrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasStrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasStrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasStrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasStrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasStrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasStrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasStrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasStrsmBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasStrsmBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    m: i64,\n    n: i64,\n    alpha: *const f32,\n    A: *const *const f32,\n    lda: i64,\n    B: *const *mut f32,\n    ldb: i64,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasStrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasStrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasStrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasStrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasStrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasStrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasStrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasStrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasStrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasStrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasStrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasStrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasStrsmBatched_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDtrsmBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f64,\n    A: *const *const f64,\n    lda: ::core::ffi::c_int,\n    B: *const *mut f64,\n    ldb: ::core::ffi::c_int,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasDtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasDtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasDtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasDtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasDtrsmBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDtrsmBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    m: i64,\n    n: i64,\n    alpha: *const f64,\n    A: *const *const f64,\n    lda: i64,\n    B: *const *mut f64,\n    ldb: i64,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasDtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasDtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasDtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasDtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasDtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasDtrsmBatched_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCtrsmBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    B: *const *mut cuda_types::cublas::cuComplex,\n    ldb: ::core::ffi::c_int,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasCtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasCtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasCtrsmBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCtrsmBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    m: i64,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuComplex,\n    A: *const *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    B: *const *mut cuda_types::cublas::cuComplex,\n    ldb: i64,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasCtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasCtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasCtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasCtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasCtrsmBatched_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZtrsmBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    B: *const *mut cuda_types::cublas::cuDoubleComplex,\n    ldb: ::core::ffi::c_int,\n    batchCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasZtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasZtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasZtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZtrsmBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasZtrsmBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZtrsmBatched_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    side: cuda_types::cublas::cublasSideMode_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    diag: cuda_types::cublas::cublasDiagType_t,\n    m: i64,\n    n: i64,\n    alpha: *const cuda_types::cublas::cuDoubleComplex,\n    A: *const *const cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n    B: *const *mut cuda_types::cublas::cuDoubleComplex,\n    ldb: i64,\n    batchCount: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(side), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&side, \"cublasZtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diag, \"cublasZtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasZtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasZtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZtrsmBatched_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchCount, \"cublasZtrsmBatched_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSdgmm(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    mode: cuda_types::cublas::cublasSideMode_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    A: *const f32,\n    lda: ::core::ffi::c_int,\n    x: *const f32,\n    incx: ::core::ffi::c_int,\n    C: *mut f32,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cublasSdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasSdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasSdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasSdgmm\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSdgmm_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    mode: cuda_types::cublas::cublasSideMode_t,\n    m: i64,\n    n: i64,\n    A: *const f32,\n    lda: i64,\n    x: *const f32,\n    incx: i64,\n    C: *mut f32,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cublasSdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasSdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasSdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasSdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasSdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasSdgmm_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDdgmm(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    mode: cuda_types::cublas::cublasSideMode_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    A: *const f64,\n    lda: ::core::ffi::c_int,\n    x: *const f64,\n    incx: ::core::ffi::c_int,\n    C: *mut f64,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cublasDdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasDdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasDdgmm\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDdgmm_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    mode: cuda_types::cublas::cublasSideMode_t,\n    m: i64,\n    n: i64,\n    A: *const f64,\n    lda: i64,\n    x: *const f64,\n    incx: i64,\n    C: *mut f64,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cublasDdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasDdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasDdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasDdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasDdgmm_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCdgmm(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    mode: cuda_types::cublas::cublasSideMode_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: ::core::ffi::c_int,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cublasCdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCdgmm\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCdgmm_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    mode: cuda_types::cublas::cublasSideMode_t,\n    m: i64,\n    n: i64,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: i64,\n    x: *const cuda_types::cublas::cuComplex,\n    incx: i64,\n    C: *mut cuda_types::cublas::cuComplex,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cublasCdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasCdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasCdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCdgmm_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZdgmm(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    mode: cuda_types::cublas::cublasSideMode_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: ::core::ffi::c_int,\n    C: *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cublasZdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZdgmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZdgmm\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZdgmm_64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    mode: cuda_types::cublas::cublasSideMode_t,\n    m: i64,\n    n: i64,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: i64,\n    x: *const cuda_types::cublas::cuDoubleComplex,\n    incx: i64,\n    C: *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cublasZdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cublasZdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(incx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&incx, \"cublasZdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZdgmm_64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZdgmm_64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSmatinvBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    A: *const *const f32,\n    lda: ::core::ffi::c_int,\n    Ainv: *const *mut f32,\n    lda_inv: ::core::ffi::c_int,\n    info: *mut ::core::ffi::c_int,\n    batchSize: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSmatinvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSmatinvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSmatinvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSmatinvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ainv), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ainv, \"cublasSmatinvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda_inv), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda_inv, \"cublasSmatinvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cublasSmatinvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchSize, \"cublasSmatinvBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDmatinvBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    A: *const *const f64,\n    lda: ::core::ffi::c_int,\n    Ainv: *const *mut f64,\n    lda_inv: ::core::ffi::c_int,\n    info: *mut ::core::ffi::c_int,\n    batchSize: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDmatinvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDmatinvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDmatinvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDmatinvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ainv), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ainv, \"cublasDmatinvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda_inv), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda_inv, \"cublasDmatinvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cublasDmatinvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchSize, \"cublasDmatinvBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCmatinvBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    A: *const *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    Ainv: *const *mut cuda_types::cublas::cuComplex,\n    lda_inv: ::core::ffi::c_int,\n    info: *mut ::core::ffi::c_int,\n    batchSize: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCmatinvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCmatinvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCmatinvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCmatinvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ainv), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ainv, \"cublasCmatinvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda_inv), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda_inv, \"cublasCmatinvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cublasCmatinvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchSize, \"cublasCmatinvBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZmatinvBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    A: *const *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    Ainv: *const *mut cuda_types::cublas::cuDoubleComplex,\n    lda_inv: ::core::ffi::c_int,\n    info: *mut ::core::ffi::c_int,\n    batchSize: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZmatinvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZmatinvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZmatinvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZmatinvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ainv), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ainv, \"cublasZmatinvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda_inv), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda_inv, \"cublasZmatinvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cublasZmatinvBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchSize, \"cublasZmatinvBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSgeqrfBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    Aarray: *const *mut f32,\n    lda: ::core::ffi::c_int,\n    TauArray: *const *mut f32,\n    info: *mut ::core::ffi::c_int,\n    batchSize: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSgeqrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasSgeqrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSgeqrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasSgeqrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSgeqrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(TauArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&TauArray, \"cublasSgeqrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cublasSgeqrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchSize, \"cublasSgeqrfBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDgeqrfBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    Aarray: *const *mut f64,\n    lda: ::core::ffi::c_int,\n    TauArray: *const *mut f64,\n    info: *mut ::core::ffi::c_int,\n    batchSize: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDgeqrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDgeqrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDgeqrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasDgeqrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDgeqrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(TauArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&TauArray, \"cublasDgeqrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cublasDgeqrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchSize, \"cublasDgeqrfBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgeqrfBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    Aarray: *const *mut cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    TauArray: *const *mut cuda_types::cublas::cuComplex,\n    info: *mut ::core::ffi::c_int,\n    batchSize: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgeqrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgeqrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgeqrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasCgeqrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgeqrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(TauArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&TauArray, \"cublasCgeqrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cublasCgeqrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchSize, \"cublasCgeqrfBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZgeqrfBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    Aarray: *const *mut cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    TauArray: *const *mut cuda_types::cublas::cuDoubleComplex,\n    info: *mut ::core::ffi::c_int,\n    batchSize: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZgeqrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZgeqrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZgeqrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasZgeqrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZgeqrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(TauArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&TauArray, \"cublasZgeqrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cublasZgeqrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchSize, \"cublasZgeqrfBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSgelsBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nrhs: ::core::ffi::c_int,\n    Aarray: *const *mut f32,\n    lda: ::core::ffi::c_int,\n    Carray: *const *mut f32,\n    ldc: ::core::ffi::c_int,\n    info: *mut ::core::ffi::c_int,\n    devInfoArray: *mut ::core::ffi::c_int,\n    batchSize: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasSgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasSgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nrhs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nrhs, \"cublasSgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasSgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Carray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Carray, \"cublasSgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasSgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cublasSgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devInfoArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&devInfoArray, \"cublasSgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchSize, \"cublasSgelsBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDgelsBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nrhs: ::core::ffi::c_int,\n    Aarray: *const *mut f64,\n    lda: ::core::ffi::c_int,\n    Carray: *const *mut f64,\n    ldc: ::core::ffi::c_int,\n    info: *mut ::core::ffi::c_int,\n    devInfoArray: *mut ::core::ffi::c_int,\n    batchSize: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasDgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nrhs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nrhs, \"cublasDgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasDgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Carray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Carray, \"cublasDgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasDgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cublasDgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devInfoArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&devInfoArray, \"cublasDgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchSize, \"cublasDgelsBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgelsBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nrhs: ::core::ffi::c_int,\n    Aarray: *const *mut cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    Carray: *const *mut cuda_types::cublas::cuComplex,\n    ldc: ::core::ffi::c_int,\n    info: *mut ::core::ffi::c_int,\n    devInfoArray: *mut ::core::ffi::c_int,\n    batchSize: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasCgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nrhs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nrhs, \"cublasCgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasCgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Carray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Carray, \"cublasCgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cublasCgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devInfoArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&devInfoArray, \"cublasCgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchSize, \"cublasCgelsBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZgelsBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nrhs: ::core::ffi::c_int,\n    Aarray: *const *mut cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    Carray: *const *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: ::core::ffi::c_int,\n    info: *mut ::core::ffi::c_int,\n    devInfoArray: *mut ::core::ffi::c_int,\n    batchSize: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasZgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nrhs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nrhs, \"cublasZgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasZgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Carray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Carray, \"cublasZgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cublasZgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devInfoArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&devInfoArray, \"cublasZgelsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchSize, \"cublasZgelsBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasStpttr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    AP: *const f32,\n    A: *mut f32,\n    lda: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasStpttr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasStpttr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasStpttr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasStpttr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasStpttr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasStpttr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDtpttr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    AP: *const f64,\n    A: *mut f64,\n    lda: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDtpttr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDtpttr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDtpttr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasDtpttr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDtpttr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDtpttr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCtpttr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    AP: *const cuda_types::cublas::cuComplex,\n    A: *mut cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCtpttr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCtpttr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCtpttr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasCtpttr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCtpttr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCtpttr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZtpttr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    AP: *const cuda_types::cublas::cuDoubleComplex,\n    A: *mut cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZtpttr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZtpttr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZtpttr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasZtpttr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZtpttr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZtpttr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasStrttp(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    A: *const f32,\n    lda: ::core::ffi::c_int,\n    AP: *mut f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasStrttp\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasStrttp\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasStrttp\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasStrttp\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasStrttp\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasStrttp\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDtrttp(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    A: *const f64,\n    lda: ::core::ffi::c_int,\n    AP: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDtrttp\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasDtrttp\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDtrttp\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDtrttp\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDtrttp\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasDtrttp\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCtrttp(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    A: *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    AP: *mut cuda_types::cublas::cuComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCtrttp\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasCtrttp\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCtrttp\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCtrttp\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCtrttp\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasCtrttp\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZtrttp(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    uplo: cuda_types::cublas::cublasFillMode_t,\n    n: ::core::ffi::c_int,\n    A: *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    AP: *mut cuda_types::cublas::cuDoubleComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZtrttp\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uplo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uplo, \"cublasZtrttp\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZtrttp\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZtrttp\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZtrttp\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(AP), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&AP, \"cublasZtrttp\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSgetrfBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    A: *const *mut f32,\n    lda: ::core::ffi::c_int,\n    P: *mut ::core::ffi::c_int,\n    info: *mut ::core::ffi::c_int,\n    batchSize: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSgetrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSgetrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSgetrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSgetrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(P), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&P, \"cublasSgetrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cublasSgetrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchSize, \"cublasSgetrfBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDgetrfBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    A: *const *mut f64,\n    lda: ::core::ffi::c_int,\n    P: *mut ::core::ffi::c_int,\n    info: *mut ::core::ffi::c_int,\n    batchSize: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDgetrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDgetrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDgetrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDgetrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(P), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&P, \"cublasDgetrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cublasDgetrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchSize, \"cublasDgetrfBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgetrfBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    A: *const *mut cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    P: *mut ::core::ffi::c_int,\n    info: *mut ::core::ffi::c_int,\n    batchSize: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgetrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgetrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCgetrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgetrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(P), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&P, \"cublasCgetrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cublasCgetrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchSize, \"cublasCgetrfBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZgetrfBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    A: *const *mut cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    P: *mut ::core::ffi::c_int,\n    info: *mut ::core::ffi::c_int,\n    batchSize: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZgetrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZgetrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZgetrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZgetrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(P), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&P, \"cublasZgetrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cublasZgetrfBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchSize, \"cublasZgetrfBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSgetriBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    A: *const *const f32,\n    lda: ::core::ffi::c_int,\n    P: *const ::core::ffi::c_int,\n    C: *const *mut f32,\n    ldc: ::core::ffi::c_int,\n    info: *mut ::core::ffi::c_int,\n    batchSize: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasSgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(P), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&P, \"cublasSgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasSgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasSgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cublasSgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchSize, \"cublasSgetriBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDgetriBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    A: *const *const f64,\n    lda: ::core::ffi::c_int,\n    P: *const ::core::ffi::c_int,\n    C: *const *mut f64,\n    ldc: ::core::ffi::c_int,\n    info: *mut ::core::ffi::c_int,\n    batchSize: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasDgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(P), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&P, \"cublasDgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasDgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasDgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cublasDgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchSize, \"cublasDgetriBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgetriBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    A: *const *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    P: *const ::core::ffi::c_int,\n    C: *const *mut cuda_types::cublas::cuComplex,\n    ldc: ::core::ffi::c_int,\n    info: *mut ::core::ffi::c_int,\n    batchSize: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasCgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(P), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&P, \"cublasCgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasCgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasCgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cublasCgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchSize, \"cublasCgetriBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZgetriBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    n: ::core::ffi::c_int,\n    A: *const *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    P: *const ::core::ffi::c_int,\n    C: *const *mut cuda_types::cublas::cuDoubleComplex,\n    ldc: ::core::ffi::c_int,\n    info: *mut ::core::ffi::c_int,\n    batchSize: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasZgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(P), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&P, \"cublasZgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasZgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasZgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cublasZgetriBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchSize, \"cublasZgetriBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSgetrsBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: ::core::ffi::c_int,\n    nrhs: ::core::ffi::c_int,\n    Aarray: *const *const f32,\n    lda: ::core::ffi::c_int,\n    devIpiv: *const ::core::ffi::c_int,\n    Barray: *const *mut f32,\n    ldb: ::core::ffi::c_int,\n    info: *mut ::core::ffi::c_int,\n    batchSize: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasSgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasSgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasSgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nrhs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nrhs, \"cublasSgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasSgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasSgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devIpiv), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&devIpiv, \"cublasSgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Barray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Barray, \"cublasSgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasSgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cublasSgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchSize, \"cublasSgetrsBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasDgetrsBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: ::core::ffi::c_int,\n    nrhs: ::core::ffi::c_int,\n    Aarray: *const *const f64,\n    lda: ::core::ffi::c_int,\n    devIpiv: *const ::core::ffi::c_int,\n    Barray: *const *mut f64,\n    ldb: ::core::ffi::c_int,\n    info: *mut ::core::ffi::c_int,\n    batchSize: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasDgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasDgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasDgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nrhs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nrhs, \"cublasDgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasDgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasDgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devIpiv), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&devIpiv, \"cublasDgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Barray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Barray, \"cublasDgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasDgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cublasDgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchSize, \"cublasDgetrsBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasCgetrsBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: ::core::ffi::c_int,\n    nrhs: ::core::ffi::c_int,\n    Aarray: *const *const cuda_types::cublas::cuComplex,\n    lda: ::core::ffi::c_int,\n    devIpiv: *const ::core::ffi::c_int,\n    Barray: *const *mut cuda_types::cublas::cuComplex,\n    ldb: ::core::ffi::c_int,\n    info: *mut ::core::ffi::c_int,\n    batchSize: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasCgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasCgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasCgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nrhs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nrhs, \"cublasCgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasCgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasCgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devIpiv), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&devIpiv, \"cublasCgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Barray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Barray, \"cublasCgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasCgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cublasCgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchSize, \"cublasCgetrsBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasZgetrsBatched(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    trans: cuda_types::cublas::cublasOperation_t,\n    n: ::core::ffi::c_int,\n    nrhs: ::core::ffi::c_int,\n    Aarray: *const *const cuda_types::cublas::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    devIpiv: *const ::core::ffi::c_int,\n    Barray: *const *mut cuda_types::cublas::cuDoubleComplex,\n    ldb: ::core::ffi::c_int,\n    info: *mut ::core::ffi::c_int,\n    batchSize: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasZgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(trans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&trans, \"cublasZgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasZgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nrhs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nrhs, \"cublasZgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Aarray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Aarray, \"cublasZgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasZgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devIpiv), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&devIpiv, \"cublasZgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Barray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Barray, \"cublasZgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasZgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cublasZgetrsBatched\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchSize, \"cublasZgetrsBatched\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasUint8gemmBias(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cublas::cublasHandle_t,\n    transa: cuda_types::cublas::cublasOperation_t,\n    transb: cuda_types::cublas::cublasOperation_t,\n    transc: cuda_types::cublas::cublasOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    k: ::core::ffi::c_int,\n    A: *const ::core::ffi::c_uchar,\n    A_bias: ::core::ffi::c_int,\n    lda: ::core::ffi::c_int,\n    B: *const ::core::ffi::c_uchar,\n    B_bias: ::core::ffi::c_int,\n    ldb: ::core::ffi::c_int,\n    C: *mut ::core::ffi::c_uchar,\n    C_bias: ::core::ffi::c_int,\n    ldc: ::core::ffi::c_int,\n    C_mult: ::core::ffi::c_int,\n    C_shift: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cublasUint8gemmBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transa), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transa, \"cublasUint8gemmBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transb, \"cublasUint8gemmBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transc, \"cublasUint8gemmBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cublasUint8gemmBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cublasUint8gemmBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cublasUint8gemmBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasUint8gemmBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A_bias), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A_bias, \"cublasUint8gemmBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cublasUint8gemmBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasUint8gemmBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B_bias), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B_bias, \"cublasUint8gemmBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cublasUint8gemmBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasUint8gemmBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C_bias), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C_bias, \"cublasUint8gemmBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cublasUint8gemmBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C_mult), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C_mult, \"cublasUint8gemmBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C_shift), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C_shift, \"cublasUint8gemmBias\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasSetEnvironmentMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasSetEnvironmentMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasSetEnvironmentMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cublas::cublasStatus_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            Ok(()) => writer.write_all(b\"CUBLAS_STATUS_SUCCESS\"),\n            Err(err) => {\n                match err.0.get() {\n                    1 => writer.write_all(\"CUBLAS_STATUS_NOT_INITIALIZED\".as_bytes()),\n                    3 => writer.write_all(\"CUBLAS_STATUS_ALLOC_FAILED\".as_bytes()),\n                    7 => writer.write_all(\"CUBLAS_STATUS_INVALID_VALUE\".as_bytes()),\n                    8 => writer.write_all(\"CUBLAS_STATUS_ARCH_MISMATCH\".as_bytes()),\n                    11 => writer.write_all(\"CUBLAS_STATUS_MAPPING_ERROR\".as_bytes()),\n                    13 => writer.write_all(\"CUBLAS_STATUS_EXECUTION_FAILED\".as_bytes()),\n                    14 => writer.write_all(\"CUBLAS_STATUS_INTERNAL_ERROR\".as_bytes()),\n                    15 => writer.write_all(\"CUBLAS_STATUS_NOT_SUPPORTED\".as_bytes()),\n                    16 => writer.write_all(\"CUBLAS_STATUS_LICENSE_ERROR\".as_bytes()),\n                    err => write!(writer, \"{}\", err),\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "format/src/format_generated_blaslt.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\nimpl crate::CudaDisplay for cuda_types::cublaslt::cublasLtHandle_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\npub fn write_cublasLtCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    lightHandle: *mut cuda_types::cublaslt::cublasLtHandle_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(lightHandle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lightHandle, \"cublasLtCreate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtDestroy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    lightHandle: cuda_types::cublaslt::cublasLtHandle_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(lightHandle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lightHandle, \"cublasLtDestroy\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtGetStatusName(\n    writer: &mut (impl std::io::Write + ?Sized),\n    status: cuda_types::cublas::cublasStatus_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(status), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&status, \"cublasLtGetStatusName\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtGetStatusString(\n    writer: &mut (impl std::io::Write + ?Sized),\n    status: cuda_types::cublas::cublasStatus_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(status), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&status, \"cublasLtGetStatusString\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtGetVersion(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_cublasLtGetCudartVersion(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_cublasLtGetProperty(\n    writer: &mut (impl std::io::Write + ?Sized),\n    type_: cuda_types::cublaslt::libraryPropertyType,\n    value: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cublasLtGetProperty\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cublasLtGetProperty\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtHeuristicsCacheGetCapacity(\n    writer: &mut (impl std::io::Write + ?Sized),\n    capacity: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(capacity), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &capacity,\n        \"cublasLtHeuristicsCacheGetCapacity\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtHeuristicsCacheSetCapacity(\n    writer: &mut (impl std::io::Write + ?Sized),\n    capacity: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(capacity), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &capacity,\n        \"cublasLtHeuristicsCacheSetCapacity\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtDisableCpuInstructionsSetMask(\n    writer: &mut (impl std::io::Write + ?Sized),\n    mask: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(mask), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mask,\n        \"cublasLtDisableCpuInstructionsSetMask\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cublaslt::cublasLtMatrixLayout_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cublaslt::cublasLtMatmulAlgo_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(data), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.data, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cublaslt::cublasLtMatmulDesc_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cublaslt::cublasLtMatrixTransformDesc_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cublaslt::cublasLtMatmulPreference_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cublaslt::cublasLtMatmulTile_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_UNDEFINED => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_UNDEFINED).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_8x8 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_8x8).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_8x16 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_8x16).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_16x8 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_16x8).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_8x32 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_8x32).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_16x16 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_16x16).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_32x8 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_32x8).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_8x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_8x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_16x32 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_16x32).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_32x16 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_32x16).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x8 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x8).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_32x32 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_32x32).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_32x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_32x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x32 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x32).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_32x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_32x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x32 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x32).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x256 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x256).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x512 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x512).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x256 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x256).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_512x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_512x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x96 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x96).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_96x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_96x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_96x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_96x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x160 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x160).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_160x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_160x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x96 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x96).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_32x256 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_32x256).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x32 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x32).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_8x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_8x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_8x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_8x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_8x256 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_8x256).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_8x320 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_8x320).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_8x384 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_8x384).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_8x448 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_8x448).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_8x512 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_8x512).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_8x576 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_8x576).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_8x640 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_8x640).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_8x704 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_8x704).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_8x768 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_8x768).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_16x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_16x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_16x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_16x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_16x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_16x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_16x256 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_16x256).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_16x320 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_16x320).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_16x384 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_16x384).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_16x448 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_16x448).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_16x512 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_16x512).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_16x576 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_16x576).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_16x640 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_16x640).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_16x704 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_16x704).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_16x768 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_16x768).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_24x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_24x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_24x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_24x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_24x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_24x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_24x256 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_24x256).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_24x320 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_24x320).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_24x384 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_24x384).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_24x448 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_24x448).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_24x512 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_24x512).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_24x576 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_24x576).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_24x640 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_24x640).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_24x704 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_24x704).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_24x768 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_24x768).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_32x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_32x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_32x320 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_32x320).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_32x384 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_32x384).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_32x448 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_32x448).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_32x512 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_32x512).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_32x576 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_32x576).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_32x640 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_32x640).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_32x704 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_32x704).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_32x768 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_32x768).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_40x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_40x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_40x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_40x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_40x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_40x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_40x256 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_40x256).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_40x320 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_40x320).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_40x384 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_40x384).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_40x448 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_40x448).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_40x512 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_40x512).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_40x576 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_40x576).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_40x640 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_40x640).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_40x704 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_40x704).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_40x768 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_40x768).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_48x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_48x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_48x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_48x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_48x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_48x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_48x256 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_48x256).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_48x320 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_48x320).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_48x384 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_48x384).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_48x448 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_48x448).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_48x512 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_48x512).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_48x576 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_48x576).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_48x640 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_48x640).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_48x704 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_48x704).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_48x768 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_48x768).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_56x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_56x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_56x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_56x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_56x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_56x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_56x256 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_56x256).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_56x320 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_56x320).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_56x384 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_56x384).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_56x448 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_56x448).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_56x512 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_56x512).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_56x576 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_56x576).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_56x640 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_56x640).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_56x704 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_56x704).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_56x768 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_56x768).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x320 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x320).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x384 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x384).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x448 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x448).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x576 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x576).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x640 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x640).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x704 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x704).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x768 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x768).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_72x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_72x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_72x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_72x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_72x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_72x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_72x256 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_72x256).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_72x320 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_72x320).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_72x384 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_72x384).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_72x448 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_72x448).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_72x512 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_72x512).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_72x576 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_72x576).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_72x640 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_72x640).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_80x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_80x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_80x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_80x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_80x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_80x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_80x256 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_80x256).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_80x320 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_80x320).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_80x384 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_80x384).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_80x448 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_80x448).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_80x512 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_80x512).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_80x576 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_80x576).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_88x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_88x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_88x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_88x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_88x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_88x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_88x256 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_88x256).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_88x320 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_88x320).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_88x384 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_88x384).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_88x448 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_88x448).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_88x512 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_88x512).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_96x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_96x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_96x256 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_96x256).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_96x320 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_96x320).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_96x384 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_96x384).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_96x448 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_96x448).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_96x512 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_96x512).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_104x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_104x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_104x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_104x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_104x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_104x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_104x256 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_104x256).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_104x320 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_104x320).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_104x384 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_104x384).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_104x448 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_104x448).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_112x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_112x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_112x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_112x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_112x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_112x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_112x256 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_112x256).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_112x320 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_112x320).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_112x384 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_112x384).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_120x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_120x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_120x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_120x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_120x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_120x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_120x256 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_120x256).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_120x320 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_120x320).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_120x384 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_120x384).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x320 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x320).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x384 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x384).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_136x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_136x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_136x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_136x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_136x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_136x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_136x256 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_136x256).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_136x320 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_136x320).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_144x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_144x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_144x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_144x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_144x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_144x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_144x256 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_144x256).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_144x320 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_144x320).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_152x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_152x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_152x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_152x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_152x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_152x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_152x256 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_152x256).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_152x320 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_152x320).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_160x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_160x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_160x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_160x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_160x256 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_160x256).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_168x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_168x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_168x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_168x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_168x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_168x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_168x256 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_168x256).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_176x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_176x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_176x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_176x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_176x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_176x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_176x256 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_176x256).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_184x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_184x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_184x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_184x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_184x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_184x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_184x256 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_184x256).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x256 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x256).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_200x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_200x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_200x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_200x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_200x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_200x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_208x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_208x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_208x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_208x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_208x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_208x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_216x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_216x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_216x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_216x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_216x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_216x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_224x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_224x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_224x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_224x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_224x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_224x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_232x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_232x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_232x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_232x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_232x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_232x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_240x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_240x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_240x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_240x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_240x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_240x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_248x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_248x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_248x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_248x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_248x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_248x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_264x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_264x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_264x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_264x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_272x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_272x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_272x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_272x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_280x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_280x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_280x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_280x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_288x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_288x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_288x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_288x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_296x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_296x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_296x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_296x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_304x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_304x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_304x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_304x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_312x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_312x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_312x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_312x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_320x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_320x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_320x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_320x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_328x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_328x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_328x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_328x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_336x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_336x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_336x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_336x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_344x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_344x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_344x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_344x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_352x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_352x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_352x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_352x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_360x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_360x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_360x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_360x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_368x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_368x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_368x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_368x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_376x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_376x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_376x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_376x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_384x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_384x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_384x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_384x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_392x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_392x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_400x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_400x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_408x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_408x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_416x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_416x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_424x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_424x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_432x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_432x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_440x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_440x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_448x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_448x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_456x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_456x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_464x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_464x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_472x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_472x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_480x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_480x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_488x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_488x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_496x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_496x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_504x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_504x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_520x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_520x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_528x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_528x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_536x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_536x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_544x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_544x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_552x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_552x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_560x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_560x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_568x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_568x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_576x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_576x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_584x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_584x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_592x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_592x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_600x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_600x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_608x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_608x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_616x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_616x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_624x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_624x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_632x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_632x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_640x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_640x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_648x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_648x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_656x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_656x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_664x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_664x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_672x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_672x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_680x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_680x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_688x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_688x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_696x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_696x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_704x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_704x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_712x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_712x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_720x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_720x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_728x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_728x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_736x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_736x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_744x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_744x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_752x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_752x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_760x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_760x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_768x64 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_768x64).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x16 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x16).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x24 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x24).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x40 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x40).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x48 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x48).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x56 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x56).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x72 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x72).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x80 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x80).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x88 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x88).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x104 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x104).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x112 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x112).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x120 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x120).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x136 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x136).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x144 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x144).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x152 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x152).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x160 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x160).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x168 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x168).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x176 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x176).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x184 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x184).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x200 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x200).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x208 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x208).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x216 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x216).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x224 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x224).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x232 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x232).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x240 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x240).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x248 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x248).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x264 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x264).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x272 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x272).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x280 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x280).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x288 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x288).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x296 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x296).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x304 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x304).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x312 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x312).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x328 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x328).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x336 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x336).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x344 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x344).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x352 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x352).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x360 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x360).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x368 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x368).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x376 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x376).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x392 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x392).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x400 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x400).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x408 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x408).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x416 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x416).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x424 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x424).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x432 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x432).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x440 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x440).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x456 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x456).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x464 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x464).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x472 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x472).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x480 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x480).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x488 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x488).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x496 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x496).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x504 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x504).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x520 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x520).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x528 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x528).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x536 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x536).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x544 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x544).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x552 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x552).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x560 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x560).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x568 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x568).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x584 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x584).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x592 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x592).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x600 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x600).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x608 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x608).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x616 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x616).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x624 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x624).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x632 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x632).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x648 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x648).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x656 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x656).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x664 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x664).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x672 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x672).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x680 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x680).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x688 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x688).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x696 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x696).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x712 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x712).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x720 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x720).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x728 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x728).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x736 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x736).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x744 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x744).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x752 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x752).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_64x760 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_64x760).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x8 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x8).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x16 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x16).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x24 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x24).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x40 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x40).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x48 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x48).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x56 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x56).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x72 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x72).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x80 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x80).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x88 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x88).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x104 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x104).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x112 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x112).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x120 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x120).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x136 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x136).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x144 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x144).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x152 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x152).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x168 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x168).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x176 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x176).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x184 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x184).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x200 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x200).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x208 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x208).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x216 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x216).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x224 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x224).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x232 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x232).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x240 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x240).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x248 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x248).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x264 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x264).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x272 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x272).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x280 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x280).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x288 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x288).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x296 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x296).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x304 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x304).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x312 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x312).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x328 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x328).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x336 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x336).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x344 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x344).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x352 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x352).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x360 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x360).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x368 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x368).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x376 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x376).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x392 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x392).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x400 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x400).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x408 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x408).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x416 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x416).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x424 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x424).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x432 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x432).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x440 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x440).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x448 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x448).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x456 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x456).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x464 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x464).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x472 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x472).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x480 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x480).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x488 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x488).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x496 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x496).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x504 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x504).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_128x512 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_128x512).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x8 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x8).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x16 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x16).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x24 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x24).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x32 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x32).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x40 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x40).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x48 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x48).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x56 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x56).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x72 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x72).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x80 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x80).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x88 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x88).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x96 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x96).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x104 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x104).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x112 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x112).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x120 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x120).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x136 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x136).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x144 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x144).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x152 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x152).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x160 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x160).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x168 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x168).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x176 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x176).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x184 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x184).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x200 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x200).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x208 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x208).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x216 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x216).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x224 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x224).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x232 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x232).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x240 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x240).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x248 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x248).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x264 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x264).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x272 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x272).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x280 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x280).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x288 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x288).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x296 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x296).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x304 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x304).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x312 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x312).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x320 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x320).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x328 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x328).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_192x336 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_192x336).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x8 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x8).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x16 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x16).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x24 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x24).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x40 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x40).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x48 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x48).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x56 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x56).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x72 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x72).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x80 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x80).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x88 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x88).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x96 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x96).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x104 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x104).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x112 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x112).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x120 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x120).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x136 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x136).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x144 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x144).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x152 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x152).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x160 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x160).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x168 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x168).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x176 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x176).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x184 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x184).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x200 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x200).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x208 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x208).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x216 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x216).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x224 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x224).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x232 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x232).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x240 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x240).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x248 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x248).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x256 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x256).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_320x8 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_320x8).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_320x16 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_320x16).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_320x24 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_320x24).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_320x32 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_320x32).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_320x40 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_320x40).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_320x48 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_320x48).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_320x56 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_320x56).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_320x72 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_320x72).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_320x80 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_320x80).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_320x88 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_320x88).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_320x96 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_320x96).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_320x104 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_320x104).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_320x112 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_320x112).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_320x120 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_320x120).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_320x136 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_320x136).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_320x144 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_320x144).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_320x152 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_320x152).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_320x160 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_320x160).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_320x168 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_320x168).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_320x176 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_320x176).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_320x184 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_320x184).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_320x192 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_320x192).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_320x200 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_320x200).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_384x8 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_384x8).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_384x16 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_384x16).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_384x24 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_384x24).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_384x32 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_384x32).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_384x40 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_384x40).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_384x48 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_384x48).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_384x56 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_384x56).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_384x72 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_384x72).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_384x80 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_384x80).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_384x88 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_384x88).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_384x96 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_384x96).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_384x104 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_384x104).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_384x112 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_384x112).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_384x120 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_384x120).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_384x136 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_384x136).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_384x144 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_384x144).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_384x152 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_384x152).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_384x160 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_384x160).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_384x168 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_384x168).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_448x8 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_448x8).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_448x16 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_448x16).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_448x24 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_448x24).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_448x32 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_448x32).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_448x40 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_448x40).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_448x48 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_448x48).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_448x56 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_448x56).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_448x72 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_448x72).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_448x80 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_448x80).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_448x88 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_448x88).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_448x96 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_448x96).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_448x104 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_448x104).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_448x112 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_448x112).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_448x120 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_448x120).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_448x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_448x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_448x136 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_448x136).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_448x144 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_448x144).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_512x8 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_512x8).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_512x16 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_512x16).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_512x24 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_512x24).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_512x32 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_512x32).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_512x40 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_512x40).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_512x48 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_512x48).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_512x56 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_512x56).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_512x72 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_512x72).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_512x80 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_512x80).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_512x88 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_512x88).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_512x96 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_512x96).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_512x104 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_512x104).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_512x112 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_512x112).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_512x120 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_512x120).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_512x128 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_512x128).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_576x8 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_576x8).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_576x16 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_576x16).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_576x24 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_576x24).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_576x32 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_576x32).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_576x40 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_576x40).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_576x48 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_576x48).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_576x56 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_576x56).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_576x72 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_576x72).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_576x80 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_576x80).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_576x88 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_576x88).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_576x96 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_576x96).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_576x104 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_576x104).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_576x112 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_576x112).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_640x8 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_640x8).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_640x16 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_640x16).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_640x24 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_640x24).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_640x32 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_640x32).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_640x40 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_640x40).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_640x48 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_640x48).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_640x56 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_640x56).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_640x72 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_640x72).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_640x80 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_640x80).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_640x88 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_640x88).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_640x96 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_640x96).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_704x8 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_704x8).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_704x16 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_704x16).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_704x24 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_704x24).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_704x32 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_704x32).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_704x40 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_704x40).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_704x48 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_704x48).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_704x56 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_704x56).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_704x72 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_704x72).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_704x80 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_704x80).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_704x88 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_704x88).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_768x8 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_768x8).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_768x16 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_768x16).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_768x24 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_768x24).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_768x32 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_768x32).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_768x40 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_768x40).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_768x48 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_768x48).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_768x56 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_768x56).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_768x72 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_768x72).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_768x80 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_768x80).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x512 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x512).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_256x1024 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_256x1024).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_512x512 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_512x512).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_512x1024 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_512x1024).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulTile_t::CUBLASLT_MATMUL_TILE_END => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_TILE_END).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cublaslt::cublasLtMatmulStages_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_UNDEFINED => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_UNDEFINED).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_16x1 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_16x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_16x2 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_16x2).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_16x3 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_16x3).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_16x4 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_16x4).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_16x5 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_16x5).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_16x6 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_16x6).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_32x1 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_32x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_32x2 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_32x2).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_32x3 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_32x3).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_32x4 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_32x4).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_32x5 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_32x5).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_32x6 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_32x6).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_64x1 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_64x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_64x2 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_64x2).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_64x3 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_64x3).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_64x4 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_64x4).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_64x5 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_64x5).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_64x6 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_64x6).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_128x1 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_128x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_128x2 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_128x2).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_128x3 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_128x3).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_128x4 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_128x4).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_128x5 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_128x5).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_128x6 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_128x6).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_32x10 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_32x10).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_8x4 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_8x4).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_16x10 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_16x10).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_8x5 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_8x5).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_8x3 => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_8x3).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_8xAUTO => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_8xAUTO).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_16xAUTO => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_16xAUTO).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_32xAUTO => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_32xAUTO).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_64xAUTO => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_64xAUTO).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_128xAUTO => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_128xAUTO).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_256xAUTO => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_256xAUTO).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_768xAUTO => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_768xAUTO).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulStages_t::CUBLASLT_MATMUL_STAGES_END => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_STAGES_END).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cublaslt::cublasLtClusterShape_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_AUTO => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_AUTO).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_1x1x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_1x1x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_2x1x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_2x1x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_4x1x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_4x1x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_1x2x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_1x2x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_2x2x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_2x2x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_4x2x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_4x2x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_1x4x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_1x4x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_2x4x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_2x4x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_4x4x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_4x4x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_8x1x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_8x1x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_1x8x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_1x8x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_8x2x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_8x2x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_2x8x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_2x8x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_16x1x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_16x1x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_1x16x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_1x16x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_3x1x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_3x1x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_5x1x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_5x1x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_6x1x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_6x1x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_7x1x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_7x1x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_9x1x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_9x1x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_10x1x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_10x1x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_11x1x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_11x1x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_12x1x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_12x1x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_13x1x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_13x1x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_14x1x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_14x1x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_15x1x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_15x1x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_3x2x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_3x2x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_5x2x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_5x2x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_6x2x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_6x2x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_7x2x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_7x2x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_1x3x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_1x3x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_2x3x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_2x3x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_3x3x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_3x3x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_4x3x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_4x3x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_5x3x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_5x3x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_3x4x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_3x4x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_1x5x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_1x5x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_2x5x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_2x5x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_3x5x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_3x5x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_1x6x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_1x6x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_2x6x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_2x6x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_1x7x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_1x7x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_2x7x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_2x7x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_1x9x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_1x9x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_1x10x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_1x10x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_1x11x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_1x11x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_1x12x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_1x12x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_1x13x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_1x13x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_1x14x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_1x14x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_1x15x1 => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_1x15x1).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtClusterShape_t::CUBLASLT_CLUSTER_SHAPE_END => {\n                writer.write_all(stringify!(CUBLASLT_CLUSTER_SHAPE_END).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cublaslt::cublasLtMatmulInnerShape_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cublaslt::cublasLtMatmulInnerShape_t::CUBLASLT_MATMUL_INNER_SHAPE_UNDEFINED => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_INNER_SHAPE_UNDEFINED).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulInnerShape_t::CUBLASLT_MATMUL_INNER_SHAPE_MMA884 => {\n                writer\n                    .write_all(stringify!(CUBLASLT_MATMUL_INNER_SHAPE_MMA884).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulInnerShape_t::CUBLASLT_MATMUL_INNER_SHAPE_MMA1684 => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_INNER_SHAPE_MMA1684).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulInnerShape_t::CUBLASLT_MATMUL_INNER_SHAPE_MMA1688 => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_INNER_SHAPE_MMA1688).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulInnerShape_t::CUBLASLT_MATMUL_INNER_SHAPE_MMA16816 => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_INNER_SHAPE_MMA16816).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulInnerShape_t::CUBLASLT_MATMUL_INNER_SHAPE_END => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_INNER_SHAPE_END).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cublaslt::cublasLtMatmulMatrixScale_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cublaslt::cublasLtMatmulMatrixScale_t::CUBLASLT_MATMUL_MATRIX_SCALE_SCALAR_32F => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_MATRIX_SCALE_SCALAR_32F).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulMatrixScale_t::CUBLASLT_MATMUL_MATRIX_SCALE_VEC16_UE4M3 => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_MATRIX_SCALE_VEC16_UE4M3).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulMatrixScale_t::CUBLASLT_MATMUL_MATRIX_SCALE_VEC32_UE8M0 => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_MATRIX_SCALE_VEC32_UE8M0).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulMatrixScale_t::CUBLASLT_MATMUL_MATRIX_SCALE_OUTER_VEC_32F => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_MATRIX_SCALE_OUTER_VEC_32F).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulMatrixScale_t::CUBLASLT_MATMUL_MATRIX_SCALE_VEC128_32F => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_MATRIX_SCALE_VEC128_32F).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulMatrixScale_t::CUBLASLT_MATMUL_MATRIX_SCALE_BLK128x128_32F => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_MATRIX_SCALE_BLK128x128_32F)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulMatrixScale_t::CUBLASLT_MATMUL_MATRIX_SCALE_END => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_MATRIX_SCALE_END).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cublaslt::cublasLtPointerMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cublaslt::cublasLtPointerMode_t::CUBLASLT_POINTER_MODE_HOST => {\n                writer.write_all(stringify!(CUBLASLT_POINTER_MODE_HOST).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtPointerMode_t::CUBLASLT_POINTER_MODE_DEVICE => {\n                writer.write_all(stringify!(CUBLASLT_POINTER_MODE_DEVICE).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtPointerMode_t::CUBLASLT_POINTER_MODE_DEVICE_VECTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_POINTER_MODE_DEVICE_VECTOR).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtPointerMode_t::CUBLASLT_POINTER_MODE_ALPHA_DEVICE_VECTOR_BETA_ZERO => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_POINTER_MODE_ALPHA_DEVICE_VECTOR_BETA_ZERO)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtPointerMode_t::CUBLASLT_POINTER_MODE_ALPHA_DEVICE_VECTOR_BETA_HOST => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_POINTER_MODE_ALPHA_DEVICE_VECTOR_BETA_HOST)\n                            .as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cublaslt::cublasLtPointerModeMask_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cublaslt::cublasLtPointerModeMask_t::CUBLASLT_POINTER_MODE_MASK_HOST => {\n                writer.write_all(stringify!(CUBLASLT_POINTER_MODE_MASK_HOST).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtPointerModeMask_t::CUBLASLT_POINTER_MODE_MASK_DEVICE => {\n                writer\n                    .write_all(stringify!(CUBLASLT_POINTER_MODE_MASK_DEVICE).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtPointerModeMask_t::CUBLASLT_POINTER_MODE_MASK_DEVICE_VECTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_POINTER_MODE_MASK_DEVICE_VECTOR).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtPointerModeMask_t::CUBLASLT_POINTER_MODE_MASK_ALPHA_DEVICE_VECTOR_BETA_ZERO => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CUBLASLT_POINTER_MODE_MASK_ALPHA_DEVICE_VECTOR_BETA_ZERO\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtPointerModeMask_t::CUBLASLT_POINTER_MODE_MASK_ALPHA_DEVICE_VECTOR_BETA_HOST => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CUBLASLT_POINTER_MODE_MASK_ALPHA_DEVICE_VECTOR_BETA_HOST\n                        )\n                            .as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cublasLtMatmul(\n    writer: &mut (impl std::io::Write + ?Sized),\n    lightHandle: cuda_types::cublaslt::cublasLtHandle_t,\n    computeDesc: cuda_types::cublaslt::cublasLtMatmulDesc_t,\n    alpha: *const ::core::ffi::c_void,\n    A: *const ::core::ffi::c_void,\n    Adesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n    B: *const ::core::ffi::c_void,\n    Bdesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n    beta: *const ::core::ffi::c_void,\n    C: *const ::core::ffi::c_void,\n    Cdesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n    D: *mut ::core::ffi::c_void,\n    Ddesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n    algo: *const cuda_types::cublaslt::cublasLtMatmulAlgo_t,\n    workspace: *mut ::core::ffi::c_void,\n    workspaceSizeInBytes: usize,\n    stream: cuda_types::cublaslt::cudaStream_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(lightHandle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lightHandle, \"cublasLtMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&computeDesc, \"cublasLtMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasLtMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasLtMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Adesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Adesc, \"cublasLtMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasLtMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Bdesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Bdesc, \"cublasLtMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasLtMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasLtMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Cdesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Cdesc, \"cublasLtMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(D), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&D, \"cublasLtMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ddesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ddesc, \"cublasLtMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cublasLtMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workspace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workspace, \"cublasLtMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workspaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workspaceSizeInBytes, \"cublasLtMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cublasLtMatmul\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtMatrixTransform(\n    writer: &mut (impl std::io::Write + ?Sized),\n    lightHandle: cuda_types::cublaslt::cublasLtHandle_t,\n    transformDesc: cuda_types::cublaslt::cublasLtMatrixTransformDesc_t,\n    alpha: *const ::core::ffi::c_void,\n    A: *const ::core::ffi::c_void,\n    Adesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n    beta: *const ::core::ffi::c_void,\n    B: *const ::core::ffi::c_void,\n    Bdesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n    C: *mut ::core::ffi::c_void,\n    Cdesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n    stream: cuda_types::cublaslt::cudaStream_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(lightHandle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lightHandle, \"cublasLtMatrixTransform\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transformDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transformDesc,\n        \"cublasLtMatrixTransform\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cublasLtMatrixTransform\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cublasLtMatrixTransform\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Adesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Adesc, \"cublasLtMatrixTransform\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cublasLtMatrixTransform\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cublasLtMatrixTransform\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Bdesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Bdesc, \"cublasLtMatrixTransform\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cublasLtMatrixTransform\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Cdesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Cdesc, \"cublasLtMatrixTransform\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cublasLtMatrixTransform\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cublaslt::cublasLtOrder_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cublaslt::cublasLtOrder_t::CUBLASLT_ORDER_COL => {\n                writer.write_all(stringify!(CUBLASLT_ORDER_COL).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtOrder_t::CUBLASLT_ORDER_ROW => {\n                writer.write_all(stringify!(CUBLASLT_ORDER_ROW).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtOrder_t::CUBLASLT_ORDER_COL32 => {\n                writer.write_all(stringify!(CUBLASLT_ORDER_COL32).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtOrder_t::CUBLASLT_ORDER_COL4_4R2_8C => {\n                writer.write_all(stringify!(CUBLASLT_ORDER_COL4_4R2_8C).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtOrder_t::CUBLASLT_ORDER_COL32_2R_4R4 => {\n                writer.write_all(stringify!(CUBLASLT_ORDER_COL32_2R_4R4).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cublaslt::cublasLtBatchMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cublaslt::cublasLtBatchMode_t::CUBLASLT_BATCH_MODE_STRIDED => {\n                writer.write_all(stringify!(CUBLASLT_BATCH_MODE_STRIDED).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtBatchMode_t::CUBLASLT_BATCH_MODE_POINTER_ARRAY => {\n                writer\n                    .write_all(stringify!(CUBLASLT_BATCH_MODE_POINTER_ARRAY).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cublaslt::cublasLtMatrixLayoutAttribute_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cublaslt::cublasLtMatrixLayoutAttribute_t::CUBLASLT_MATRIX_LAYOUT_TYPE => {\n                writer.write_all(stringify!(CUBLASLT_MATRIX_LAYOUT_TYPE).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatrixLayoutAttribute_t::CUBLASLT_MATRIX_LAYOUT_ORDER => {\n                writer.write_all(stringify!(CUBLASLT_MATRIX_LAYOUT_ORDER).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatrixLayoutAttribute_t::CUBLASLT_MATRIX_LAYOUT_ROWS => {\n                writer.write_all(stringify!(CUBLASLT_MATRIX_LAYOUT_ROWS).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatrixLayoutAttribute_t::CUBLASLT_MATRIX_LAYOUT_COLS => {\n                writer.write_all(stringify!(CUBLASLT_MATRIX_LAYOUT_COLS).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatrixLayoutAttribute_t::CUBLASLT_MATRIX_LAYOUT_LD => {\n                writer.write_all(stringify!(CUBLASLT_MATRIX_LAYOUT_LD).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatrixLayoutAttribute_t::CUBLASLT_MATRIX_LAYOUT_BATCH_COUNT => {\n                writer\n                    .write_all(stringify!(CUBLASLT_MATRIX_LAYOUT_BATCH_COUNT).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatrixLayoutAttribute_t::CUBLASLT_MATRIX_LAYOUT_STRIDED_BATCH_OFFSET => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATRIX_LAYOUT_STRIDED_BATCH_OFFSET)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatrixLayoutAttribute_t::CUBLASLT_MATRIX_LAYOUT_PLANE_OFFSET => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATRIX_LAYOUT_PLANE_OFFSET).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatrixLayoutAttribute_t::CUBLASLT_MATRIX_LAYOUT_BATCH_MODE => {\n                writer\n                    .write_all(stringify!(CUBLASLT_MATRIX_LAYOUT_BATCH_MODE).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cublasLtMatrixLayoutInit_internal(\n    writer: &mut (impl std::io::Write + ?Sized),\n    matLayout: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n    size: usize,\n    type_: cuda_types::cublaslt::cudaDataType,\n    rows: u64,\n    cols: u64,\n    ld: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(matLayout), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &matLayout,\n        \"cublasLtMatrixLayoutInit_internal\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &size,\n        \"cublasLtMatrixLayoutInit_internal\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &type_,\n        \"cublasLtMatrixLayoutInit_internal\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rows,\n        \"cublasLtMatrixLayoutInit_internal\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cols,\n        \"cublasLtMatrixLayoutInit_internal\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ld), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ld,\n        \"cublasLtMatrixLayoutInit_internal\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtMatrixLayoutCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    matLayout: *mut cuda_types::cublaslt::cublasLtMatrixLayout_t,\n    type_: cuda_types::cublaslt::cudaDataType,\n    rows: u64,\n    cols: u64,\n    ld: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(matLayout), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &matLayout,\n        \"cublasLtMatrixLayoutCreate\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cublasLtMatrixLayoutCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cublasLtMatrixLayoutCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cublasLtMatrixLayoutCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ld), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ld, \"cublasLtMatrixLayoutCreate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtMatrixLayoutDestroy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    matLayout: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(matLayout), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &matLayout,\n        \"cublasLtMatrixLayoutDestroy\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtMatrixLayoutSetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    matLayout: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n    attr: cuda_types::cublaslt::cublasLtMatrixLayoutAttribute_t,\n    buf: *const ::core::ffi::c_void,\n    sizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(matLayout), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &matLayout,\n        \"cublasLtMatrixLayoutSetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &attr,\n        \"cublasLtMatrixLayoutSetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(buf), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &buf,\n        \"cublasLtMatrixLayoutSetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cublasLtMatrixLayoutSetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtMatrixLayoutGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    matLayout: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n    attr: cuda_types::cublaslt::cublasLtMatrixLayoutAttribute_t,\n    buf: *mut ::core::ffi::c_void,\n    sizeInBytes: usize,\n    sizeWritten: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(matLayout), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &matLayout,\n        \"cublasLtMatrixLayoutGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &attr,\n        \"cublasLtMatrixLayoutGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(buf), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &buf,\n        \"cublasLtMatrixLayoutGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cublasLtMatrixLayoutGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeWritten), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeWritten,\n        \"cublasLtMatrixLayoutGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cublaslt::cublasLtMatmulDescAttributes_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_COMPUTE_TYPE => {\n                writer\n                    .write_all(stringify!(CUBLASLT_MATMUL_DESC_COMPUTE_TYPE).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_SCALE_TYPE => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_DESC_SCALE_TYPE).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_POINTER_MODE => {\n                writer\n                    .write_all(stringify!(CUBLASLT_MATMUL_DESC_POINTER_MODE).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_TRANSA => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_DESC_TRANSA).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_TRANSB => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_DESC_TRANSB).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_TRANSC => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_DESC_TRANSC).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_FILL_MODE => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_DESC_FILL_MODE).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_EPILOGUE => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_DESC_EPILOGUE).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_BIAS_POINTER => {\n                writer\n                    .write_all(stringify!(CUBLASLT_MATMUL_DESC_BIAS_POINTER).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_BIAS_BATCH_STRIDE => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_DESC_BIAS_BATCH_STRIDE).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_POINTER => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_POINTER).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_LD => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_LD).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_BATCH_STRIDE => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_BATCH_STRIDE)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_ALPHA_VECTOR_BATCH_STRIDE => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_DESC_ALPHA_VECTOR_BATCH_STRIDE)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_SM_COUNT_TARGET => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_DESC_SM_COUNT_TARGET).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_A_SCALE_POINTER => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_DESC_A_SCALE_POINTER).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_B_SCALE_POINTER => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_DESC_B_SCALE_POINTER).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_C_SCALE_POINTER => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_DESC_C_SCALE_POINTER).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_D_SCALE_POINTER => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_DESC_D_SCALE_POINTER).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_AMAX_D_POINTER => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_DESC_AMAX_D_POINTER).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_DATA_TYPE => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_DATA_TYPE)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_SCALE_POINTER => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_SCALE_POINTER)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_AMAX_POINTER => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_AMAX_POINTER)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_FAST_ACCUM => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_DESC_FAST_ACCUM).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_BIAS_DATA_TYPE => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_DESC_BIAS_DATA_TYPE).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_A_SCALE_MODE => {\n                writer\n                    .write_all(stringify!(CUBLASLT_MATMUL_DESC_A_SCALE_MODE).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_B_SCALE_MODE => {\n                writer\n                    .write_all(stringify!(CUBLASLT_MATMUL_DESC_B_SCALE_MODE).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_C_SCALE_MODE => {\n                writer\n                    .write_all(stringify!(CUBLASLT_MATMUL_DESC_C_SCALE_MODE).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_D_SCALE_MODE => {\n                writer\n                    .write_all(stringify!(CUBLASLT_MATMUL_DESC_D_SCALE_MODE).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_SCALE_MODE => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_DESC_EPILOGUE_AUX_SCALE_MODE)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_D_OUT_SCALE_POINTER => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_DESC_D_OUT_SCALE_POINTER).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulDescAttributes_t::CUBLASLT_MATMUL_DESC_D_OUT_SCALE_MODE => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_DESC_D_OUT_SCALE_MODE).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cublasLtMatmulDescInit_internal(\n    writer: &mut (impl std::io::Write + ?Sized),\n    matmulDesc: cuda_types::cublaslt::cublasLtMatmulDesc_t,\n    size: usize,\n    computeType: cuda_types::cublas::cublasComputeType_t,\n    scaleType: cuda_types::cublaslt::cudaDataType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(matmulDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &matmulDesc,\n        \"cublasLtMatmulDescInit_internal\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &size,\n        \"cublasLtMatmulDescInit_internal\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &computeType,\n        \"cublasLtMatmulDescInit_internal\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(scaleType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &scaleType,\n        \"cublasLtMatmulDescInit_internal\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtMatmulDescCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    matmulDesc: *mut cuda_types::cublaslt::cublasLtMatmulDesc_t,\n    computeType: cuda_types::cublas::cublasComputeType_t,\n    scaleType: cuda_types::cublaslt::cudaDataType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(matmulDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matmulDesc, \"cublasLtMatmulDescCreate\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &computeType,\n        \"cublasLtMatmulDescCreate\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(scaleType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&scaleType, \"cublasLtMatmulDescCreate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtMatmulDescDestroy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    matmulDesc: cuda_types::cublaslt::cublasLtMatmulDesc_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(matmulDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &matmulDesc,\n        \"cublasLtMatmulDescDestroy\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtMatmulDescSetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    matmulDesc: cuda_types::cublaslt::cublasLtMatmulDesc_t,\n    attr: cuda_types::cublaslt::cublasLtMatmulDescAttributes_t,\n    buf: *const ::core::ffi::c_void,\n    sizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(matmulDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &matmulDesc,\n        \"cublasLtMatmulDescSetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attr, \"cublasLtMatmulDescSetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(buf), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&buf, \"cublasLtMatmulDescSetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cublasLtMatmulDescSetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtMatmulDescGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    matmulDesc: cuda_types::cublaslt::cublasLtMatmulDesc_t,\n    attr: cuda_types::cublaslt::cublasLtMatmulDescAttributes_t,\n    buf: *mut ::core::ffi::c_void,\n    sizeInBytes: usize,\n    sizeWritten: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(matmulDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &matmulDesc,\n        \"cublasLtMatmulDescGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attr, \"cublasLtMatmulDescGetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(buf), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&buf, \"cublasLtMatmulDescGetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cublasLtMatmulDescGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeWritten), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeWritten,\n        \"cublasLtMatmulDescGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay\nfor cuda_types::cublaslt::cublasLtMatrixTransformDescAttributes_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cublaslt::cublasLtMatrixTransformDescAttributes_t::CUBLASLT_MATRIX_TRANSFORM_DESC_SCALE_TYPE => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATRIX_TRANSFORM_DESC_SCALE_TYPE).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatrixTransformDescAttributes_t::CUBLASLT_MATRIX_TRANSFORM_DESC_POINTER_MODE => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATRIX_TRANSFORM_DESC_POINTER_MODE)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatrixTransformDescAttributes_t::CUBLASLT_MATRIX_TRANSFORM_DESC_TRANSA => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATRIX_TRANSFORM_DESC_TRANSA).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatrixTransformDescAttributes_t::CUBLASLT_MATRIX_TRANSFORM_DESC_TRANSB => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATRIX_TRANSFORM_DESC_TRANSB).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cublasLtMatrixTransformDescInit_internal(\n    writer: &mut (impl std::io::Write + ?Sized),\n    transformDesc: cuda_types::cublaslt::cublasLtMatrixTransformDesc_t,\n    size: usize,\n    scaleType: cuda_types::cublaslt::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(transformDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transformDesc,\n        \"cublasLtMatrixTransformDescInit_internal\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &size,\n        \"cublasLtMatrixTransformDescInit_internal\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(scaleType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &scaleType,\n        \"cublasLtMatrixTransformDescInit_internal\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtMatrixTransformDescCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    transformDesc: *mut cuda_types::cublaslt::cublasLtMatrixTransformDesc_t,\n    scaleType: cuda_types::cublaslt::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(transformDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transformDesc,\n        \"cublasLtMatrixTransformDescCreate\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(scaleType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &scaleType,\n        \"cublasLtMatrixTransformDescCreate\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtMatrixTransformDescDestroy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    transformDesc: cuda_types::cublaslt::cublasLtMatrixTransformDesc_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(transformDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transformDesc,\n        \"cublasLtMatrixTransformDescDestroy\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtMatrixTransformDescSetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    transformDesc: cuda_types::cublaslt::cublasLtMatrixTransformDesc_t,\n    attr: cuda_types::cublaslt::cublasLtMatrixTransformDescAttributes_t,\n    buf: *const ::core::ffi::c_void,\n    sizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(transformDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transformDesc,\n        \"cublasLtMatrixTransformDescSetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &attr,\n        \"cublasLtMatrixTransformDescSetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(buf), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &buf,\n        \"cublasLtMatrixTransformDescSetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cublasLtMatrixTransformDescSetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtMatrixTransformDescGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    transformDesc: cuda_types::cublaslt::cublasLtMatrixTransformDesc_t,\n    attr: cuda_types::cublaslt::cublasLtMatrixTransformDescAttributes_t,\n    buf: *mut ::core::ffi::c_void,\n    sizeInBytes: usize,\n    sizeWritten: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(transformDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transformDesc,\n        \"cublasLtMatrixTransformDescGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &attr,\n        \"cublasLtMatrixTransformDescGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(buf), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &buf,\n        \"cublasLtMatrixTransformDescGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cublasLtMatrixTransformDescGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeWritten), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeWritten,\n        \"cublasLtMatrixTransformDescGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cublaslt::cublasLtReductionScheme_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cublaslt::cublasLtReductionScheme_t::CUBLASLT_REDUCTION_SCHEME_NONE => {\n                writer.write_all(stringify!(CUBLASLT_REDUCTION_SCHEME_NONE).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtReductionScheme_t::CUBLASLT_REDUCTION_SCHEME_INPLACE => {\n                writer\n                    .write_all(stringify!(CUBLASLT_REDUCTION_SCHEME_INPLACE).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtReductionScheme_t::CUBLASLT_REDUCTION_SCHEME_COMPUTE_TYPE => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_REDUCTION_SCHEME_COMPUTE_TYPE).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtReductionScheme_t::CUBLASLT_REDUCTION_SCHEME_OUTPUT_TYPE => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_REDUCTION_SCHEME_OUTPUT_TYPE).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtReductionScheme_t::CUBLASLT_REDUCTION_SCHEME_MASK => {\n                writer.write_all(stringify!(CUBLASLT_REDUCTION_SCHEME_MASK).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cublaslt::cublasLtEpilogue_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cublaslt::cublasLtEpilogue_t::CUBLASLT_EPILOGUE_DEFAULT => {\n                writer.write_all(stringify!(CUBLASLT_EPILOGUE_DEFAULT).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtEpilogue_t::CUBLASLT_EPILOGUE_RELU => {\n                writer.write_all(stringify!(CUBLASLT_EPILOGUE_RELU).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtEpilogue_t::CUBLASLT_EPILOGUE_RELU_AUX => {\n                writer.write_all(stringify!(CUBLASLT_EPILOGUE_RELU_AUX).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtEpilogue_t::CUBLASLT_EPILOGUE_BIAS => {\n                writer.write_all(stringify!(CUBLASLT_EPILOGUE_BIAS).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtEpilogue_t::CUBLASLT_EPILOGUE_RELU_BIAS => {\n                writer.write_all(stringify!(CUBLASLT_EPILOGUE_RELU_BIAS).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtEpilogue_t::CUBLASLT_EPILOGUE_RELU_AUX_BIAS => {\n                writer.write_all(stringify!(CUBLASLT_EPILOGUE_RELU_AUX_BIAS).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtEpilogue_t::CUBLASLT_EPILOGUE_DRELU => {\n                writer.write_all(stringify!(CUBLASLT_EPILOGUE_DRELU).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtEpilogue_t::CUBLASLT_EPILOGUE_DRELU_BGRAD => {\n                writer.write_all(stringify!(CUBLASLT_EPILOGUE_DRELU_BGRAD).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtEpilogue_t::CUBLASLT_EPILOGUE_GELU => {\n                writer.write_all(stringify!(CUBLASLT_EPILOGUE_GELU).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtEpilogue_t::CUBLASLT_EPILOGUE_GELU_AUX => {\n                writer.write_all(stringify!(CUBLASLT_EPILOGUE_GELU_AUX).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtEpilogue_t::CUBLASLT_EPILOGUE_GELU_BIAS => {\n                writer.write_all(stringify!(CUBLASLT_EPILOGUE_GELU_BIAS).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtEpilogue_t::CUBLASLT_EPILOGUE_GELU_AUX_BIAS => {\n                writer.write_all(stringify!(CUBLASLT_EPILOGUE_GELU_AUX_BIAS).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtEpilogue_t::CUBLASLT_EPILOGUE_DGELU => {\n                writer.write_all(stringify!(CUBLASLT_EPILOGUE_DGELU).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtEpilogue_t::CUBLASLT_EPILOGUE_DGELU_BGRAD => {\n                writer.write_all(stringify!(CUBLASLT_EPILOGUE_DGELU_BGRAD).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtEpilogue_t::CUBLASLT_EPILOGUE_BGRADA => {\n                writer.write_all(stringify!(CUBLASLT_EPILOGUE_BGRADA).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtEpilogue_t::CUBLASLT_EPILOGUE_BGRADB => {\n                writer.write_all(stringify!(CUBLASLT_EPILOGUE_BGRADB).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cublaslt::cublasLtMatmulSearch_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cublaslt::cublasLtMatmulSearch_t::CUBLASLT_SEARCH_BEST_FIT => {\n                writer.write_all(stringify!(CUBLASLT_SEARCH_BEST_FIT).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulSearch_t::CUBLASLT_SEARCH_LIMITED_BY_ALGO_ID => {\n                writer\n                    .write_all(stringify!(CUBLASLT_SEARCH_LIMITED_BY_ALGO_ID).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulSearch_t::CUBLASLT_SEARCH_RESERVED_02 => {\n                writer.write_all(stringify!(CUBLASLT_SEARCH_RESERVED_02).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulSearch_t::CUBLASLT_SEARCH_RESERVED_03 => {\n                writer.write_all(stringify!(CUBLASLT_SEARCH_RESERVED_03).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulSearch_t::CUBLASLT_SEARCH_RESERVED_04 => {\n                writer.write_all(stringify!(CUBLASLT_SEARCH_RESERVED_04).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulSearch_t::CUBLASLT_SEARCH_RESERVED_05 => {\n                writer.write_all(stringify!(CUBLASLT_SEARCH_RESERVED_05).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulSearch_t::CUBLASLT_SEARCH_RESERVED_06 => {\n                writer.write_all(stringify!(CUBLASLT_SEARCH_RESERVED_06).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulSearch_t::CUBLASLT_SEARCH_RESERVED_07 => {\n                writer.write_all(stringify!(CUBLASLT_SEARCH_RESERVED_07).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulSearch_t::CUBLASLT_SEARCH_RESERVED_08 => {\n                writer.write_all(stringify!(CUBLASLT_SEARCH_RESERVED_08).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulSearch_t::CUBLASLT_SEARCH_RESERVED_09 => {\n                writer.write_all(stringify!(CUBLASLT_SEARCH_RESERVED_09).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cublaslt::cublasLtMatmulPreferenceAttributes_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cublaslt::cublasLtMatmulPreferenceAttributes_t::CUBLASLT_MATMUL_PREF_SEARCH_MODE => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_PREF_SEARCH_MODE).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulPreferenceAttributes_t::CUBLASLT_MATMUL_PREF_MAX_WORKSPACE_BYTES => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_PREF_MAX_WORKSPACE_BYTES).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulPreferenceAttributes_t::CUBLASLT_MATMUL_PREF_REDUCTION_SCHEME_MASK => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_PREF_REDUCTION_SCHEME_MASK).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulPreferenceAttributes_t::CUBLASLT_MATMUL_PREF_MIN_ALIGNMENT_A_BYTES => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_PREF_MIN_ALIGNMENT_A_BYTES).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulPreferenceAttributes_t::CUBLASLT_MATMUL_PREF_MIN_ALIGNMENT_B_BYTES => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_PREF_MIN_ALIGNMENT_B_BYTES).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulPreferenceAttributes_t::CUBLASLT_MATMUL_PREF_MIN_ALIGNMENT_C_BYTES => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_PREF_MIN_ALIGNMENT_C_BYTES).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulPreferenceAttributes_t::CUBLASLT_MATMUL_PREF_MIN_ALIGNMENT_D_BYTES => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_PREF_MIN_ALIGNMENT_D_BYTES).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulPreferenceAttributes_t::CUBLASLT_MATMUL_PREF_MAX_WAVES_COUNT => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_MATMUL_PREF_MAX_WAVES_COUNT).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulPreferenceAttributes_t::CUBLASLT_MATMUL_PREF_IMPL_MASK => {\n                writer.write_all(stringify!(CUBLASLT_MATMUL_PREF_IMPL_MASK).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cublasLtMatmulPreferenceInit_internal(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pref: cuda_types::cublaslt::cublasLtMatmulPreference_t,\n    size: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pref), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pref,\n        \"cublasLtMatmulPreferenceInit_internal\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &size,\n        \"cublasLtMatmulPreferenceInit_internal\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtMatmulPreferenceCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pref: *mut cuda_types::cublaslt::cublasLtMatmulPreference_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pref), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pref, \"cublasLtMatmulPreferenceCreate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtMatmulPreferenceDestroy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pref: cuda_types::cublaslt::cublasLtMatmulPreference_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pref), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pref,\n        \"cublasLtMatmulPreferenceDestroy\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtMatmulPreferenceSetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pref: cuda_types::cublaslt::cublasLtMatmulPreference_t,\n    attr: cuda_types::cublaslt::cublasLtMatmulPreferenceAttributes_t,\n    buf: *const ::core::ffi::c_void,\n    sizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pref), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pref,\n        \"cublasLtMatmulPreferenceSetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &attr,\n        \"cublasLtMatmulPreferenceSetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(buf), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &buf,\n        \"cublasLtMatmulPreferenceSetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cublasLtMatmulPreferenceSetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtMatmulPreferenceGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pref: cuda_types::cublaslt::cublasLtMatmulPreference_t,\n    attr: cuda_types::cublaslt::cublasLtMatmulPreferenceAttributes_t,\n    buf: *mut ::core::ffi::c_void,\n    sizeInBytes: usize,\n    sizeWritten: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pref), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pref,\n        \"cublasLtMatmulPreferenceGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &attr,\n        \"cublasLtMatmulPreferenceGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(buf), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &buf,\n        \"cublasLtMatmulPreferenceGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cublasLtMatmulPreferenceGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeWritten), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeWritten,\n        \"cublasLtMatmulPreferenceGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cublaslt::cublasLtMatmulHeuristicResult_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(algo), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.algo, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(workspaceSize), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.workspaceSize, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(state), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.state, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(wavesCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.wavesCount, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\npub fn write_cublasLtMatmulAlgoGetHeuristic(\n    writer: &mut (impl std::io::Write + ?Sized),\n    lightHandle: cuda_types::cublaslt::cublasLtHandle_t,\n    operationDesc: cuda_types::cublaslt::cublasLtMatmulDesc_t,\n    Adesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n    Bdesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n    Cdesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n    Ddesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n    preference: cuda_types::cublaslt::cublasLtMatmulPreference_t,\n    requestedAlgoCount: ::core::ffi::c_int,\n    heuristicResultsArray: *mut cuda_types::cublaslt::cublasLtMatmulHeuristicResult_t,\n    returnAlgoCount: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(lightHandle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &lightHandle,\n        \"cublasLtMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(operationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &operationDesc,\n        \"cublasLtMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Adesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &Adesc,\n        \"cublasLtMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Bdesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &Bdesc,\n        \"cublasLtMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Cdesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &Cdesc,\n        \"cublasLtMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ddesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &Ddesc,\n        \"cublasLtMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(preference), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &preference,\n        \"cublasLtMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(requestedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &requestedAlgoCount,\n        \"cublasLtMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(heuristicResultsArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &heuristicResultsArray,\n        \"cublasLtMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(returnAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &returnAlgoCount,\n        \"cublasLtMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtMatmulAlgoGetIds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    lightHandle: cuda_types::cublaslt::cublasLtHandle_t,\n    computeType: cuda_types::cublas::cublasComputeType_t,\n    scaleType: cuda_types::cublaslt::cudaDataType_t,\n    Atype: cuda_types::cublaslt::cudaDataType_t,\n    Btype: cuda_types::cublaslt::cudaDataType_t,\n    Ctype: cuda_types::cublaslt::cudaDataType_t,\n    Dtype: cuda_types::cublaslt::cudaDataType_t,\n    requestedAlgoCount: ::core::ffi::c_int,\n    algoIdsArray: *mut ::core::ffi::c_int,\n    returnAlgoCount: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(lightHandle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &lightHandle,\n        \"cublasLtMatmulAlgoGetIds\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &computeType,\n        \"cublasLtMatmulAlgoGetIds\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(scaleType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&scaleType, \"cublasLtMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Atype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Atype, \"cublasLtMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Btype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Btype, \"cublasLtMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ctype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ctype, \"cublasLtMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Dtype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Dtype, \"cublasLtMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(requestedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &requestedAlgoCount,\n        \"cublasLtMatmulAlgoGetIds\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algoIdsArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algoIdsArray,\n        \"cublasLtMatmulAlgoGetIds\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(returnAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &returnAlgoCount,\n        \"cublasLtMatmulAlgoGetIds\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtMatmulAlgoInit(\n    writer: &mut (impl std::io::Write + ?Sized),\n    lightHandle: cuda_types::cublaslt::cublasLtHandle_t,\n    computeType: cuda_types::cublas::cublasComputeType_t,\n    scaleType: cuda_types::cublaslt::cudaDataType_t,\n    Atype: cuda_types::cublaslt::cudaDataType_t,\n    Btype: cuda_types::cublaslt::cudaDataType_t,\n    Ctype: cuda_types::cublaslt::cudaDataType_t,\n    Dtype: cuda_types::cublaslt::cudaDataType_t,\n    algoId: ::core::ffi::c_int,\n    algo: *mut cuda_types::cublaslt::cublasLtMatmulAlgo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(lightHandle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lightHandle, \"cublasLtMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&computeType, \"cublasLtMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(scaleType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&scaleType, \"cublasLtMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Atype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Atype, \"cublasLtMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Btype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Btype, \"cublasLtMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ctype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ctype, \"cublasLtMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Dtype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Dtype, \"cublasLtMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algoId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algoId, \"cublasLtMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cublasLtMatmulAlgoInit\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtMatmulAlgoCheck(\n    writer: &mut (impl std::io::Write + ?Sized),\n    lightHandle: cuda_types::cublaslt::cublasLtHandle_t,\n    operationDesc: cuda_types::cublaslt::cublasLtMatmulDesc_t,\n    Adesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n    Bdesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n    Cdesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n    Ddesc: cuda_types::cublaslt::cublasLtMatrixLayout_t,\n    algo: *const cuda_types::cublaslt::cublasLtMatmulAlgo_t,\n    result: *mut cuda_types::cublaslt::cublasLtMatmulHeuristicResult_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(lightHandle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lightHandle, \"cublasLtMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(operationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &operationDesc,\n        \"cublasLtMatmulAlgoCheck\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Adesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Adesc, \"cublasLtMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Bdesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Bdesc, \"cublasLtMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Cdesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Cdesc, \"cublasLtMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(Ddesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&Ddesc, \"cublasLtMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cublasLtMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cublasLtMatmulAlgoCheck\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cublaslt::cublasLtMatmulAlgoCapAttributes_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cublaslt::cublasLtMatmulAlgoCapAttributes_t::CUBLASLT_ALGO_CAP_SPLITK_SUPPORT => {\n                writer.write_all(stringify!(CUBLASLT_ALGO_CAP_SPLITK_SUPPORT).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulAlgoCapAttributes_t::CUBLASLT_ALGO_CAP_REDUCTION_SCHEME_MASK => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_ALGO_CAP_REDUCTION_SCHEME_MASK).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulAlgoCapAttributes_t::CUBLASLT_ALGO_CAP_CTA_SWIZZLING_SUPPORT => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_ALGO_CAP_CTA_SWIZZLING_SUPPORT).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulAlgoCapAttributes_t::CUBLASLT_ALGO_CAP_STRIDED_BATCH_SUPPORT => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_ALGO_CAP_STRIDED_BATCH_SUPPORT).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulAlgoCapAttributes_t::CUBLASLT_ALGO_CAP_OUT_OF_PLACE_RESULT_SUPPORT => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_ALGO_CAP_OUT_OF_PLACE_RESULT_SUPPORT)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulAlgoCapAttributes_t::CUBLASLT_ALGO_CAP_UPLO_SUPPORT => {\n                writer.write_all(stringify!(CUBLASLT_ALGO_CAP_UPLO_SUPPORT).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulAlgoCapAttributes_t::CUBLASLT_ALGO_CAP_TILE_IDS => {\n                writer.write_all(stringify!(CUBLASLT_ALGO_CAP_TILE_IDS).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulAlgoCapAttributes_t::CUBLASLT_ALGO_CAP_CUSTOM_OPTION_MAX => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_ALGO_CAP_CUSTOM_OPTION_MAX).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulAlgoCapAttributes_t::CUBLASLT_ALGO_CAP_CUSTOM_MEMORY_ORDER => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_ALGO_CAP_CUSTOM_MEMORY_ORDER).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulAlgoCapAttributes_t::CUBLASLT_ALGO_CAP_POINTER_MODE_MASK => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_ALGO_CAP_POINTER_MODE_MASK).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulAlgoCapAttributes_t::CUBLASLT_ALGO_CAP_EPILOGUE_MASK => {\n                writer.write_all(stringify!(CUBLASLT_ALGO_CAP_EPILOGUE_MASK).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulAlgoCapAttributes_t::CUBLASLT_ALGO_CAP_STAGES_IDS => {\n                writer.write_all(stringify!(CUBLASLT_ALGO_CAP_STAGES_IDS).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulAlgoCapAttributes_t::CUBLASLT_ALGO_CAP_LD_NEGATIVE => {\n                writer.write_all(stringify!(CUBLASLT_ALGO_CAP_LD_NEGATIVE).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulAlgoCapAttributes_t::CUBLASLT_ALGO_CAP_NUMERICAL_IMPL_FLAGS => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_ALGO_CAP_NUMERICAL_IMPL_FLAGS).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulAlgoCapAttributes_t::CUBLASLT_ALGO_CAP_MIN_ALIGNMENT_A_BYTES => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_ALGO_CAP_MIN_ALIGNMENT_A_BYTES).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulAlgoCapAttributes_t::CUBLASLT_ALGO_CAP_MIN_ALIGNMENT_B_BYTES => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_ALGO_CAP_MIN_ALIGNMENT_B_BYTES).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulAlgoCapAttributes_t::CUBLASLT_ALGO_CAP_MIN_ALIGNMENT_C_BYTES => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_ALGO_CAP_MIN_ALIGNMENT_C_BYTES).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulAlgoCapAttributes_t::CUBLASLT_ALGO_CAP_MIN_ALIGNMENT_D_BYTES => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_ALGO_CAP_MIN_ALIGNMENT_D_BYTES).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulAlgoCapAttributes_t::CUBLASLT_ALGO_CAP_POINTER_ARRAY_BATCH_SUPPORT => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_ALGO_CAP_POINTER_ARRAY_BATCH_SUPPORT)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulAlgoCapAttributes_t::CUBLASLT_ALGO_CAP_FLOATING_POINT_EMULATION_SUPPORT => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_ALGO_CAP_FLOATING_POINT_EMULATION_SUPPORT)\n                            .as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cublasLtMatmulAlgoCapGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    algo: *const cuda_types::cublaslt::cublasLtMatmulAlgo_t,\n    attr: cuda_types::cublaslt::cublasLtMatmulAlgoCapAttributes_t,\n    buf: *mut ::core::ffi::c_void,\n    sizeInBytes: usize,\n    sizeWritten: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cublasLtMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &attr,\n        \"cublasLtMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(buf), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &buf,\n        \"cublasLtMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cublasLtMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeWritten), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeWritten,\n        \"cublasLtMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cublaslt::cublasLtMatmulAlgoConfigAttributes_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cublaslt::cublasLtMatmulAlgoConfigAttributes_t::CUBLASLT_ALGO_CONFIG_ID => {\n                writer.write_all(stringify!(CUBLASLT_ALGO_CONFIG_ID).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulAlgoConfigAttributes_t::CUBLASLT_ALGO_CONFIG_TILE_ID => {\n                writer.write_all(stringify!(CUBLASLT_ALGO_CONFIG_TILE_ID).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulAlgoConfigAttributes_t::CUBLASLT_ALGO_CONFIG_SPLITK_NUM => {\n                writer.write_all(stringify!(CUBLASLT_ALGO_CONFIG_SPLITK_NUM).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulAlgoConfigAttributes_t::CUBLASLT_ALGO_CONFIG_REDUCTION_SCHEME => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_ALGO_CONFIG_REDUCTION_SCHEME).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulAlgoConfigAttributes_t::CUBLASLT_ALGO_CONFIG_CTA_SWIZZLING => {\n                writer\n                    .write_all(stringify!(CUBLASLT_ALGO_CONFIG_CTA_SWIZZLING).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulAlgoConfigAttributes_t::CUBLASLT_ALGO_CONFIG_CUSTOM_OPTION => {\n                writer\n                    .write_all(stringify!(CUBLASLT_ALGO_CONFIG_CUSTOM_OPTION).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulAlgoConfigAttributes_t::CUBLASLT_ALGO_CONFIG_STAGES_ID => {\n                writer.write_all(stringify!(CUBLASLT_ALGO_CONFIG_STAGES_ID).as_bytes())\n            }\n            &cuda_types::cublaslt::cublasLtMatmulAlgoConfigAttributes_t::CUBLASLT_ALGO_CONFIG_INNER_SHAPE_ID => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_ALGO_CONFIG_INNER_SHAPE_ID).as_bytes(),\n                    )\n            }\n            &cuda_types::cublaslt::cublasLtMatmulAlgoConfigAttributes_t::CUBLASLT_ALGO_CONFIG_CLUSTER_SHAPE_ID => {\n                writer\n                    .write_all(\n                        stringify!(CUBLASLT_ALGO_CONFIG_CLUSTER_SHAPE_ID).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cublasLtMatmulAlgoConfigSetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    algo: *mut cuda_types::cublaslt::cublasLtMatmulAlgo_t,\n    attr: cuda_types::cublaslt::cublasLtMatmulAlgoConfigAttributes_t,\n    buf: *const ::core::ffi::c_void,\n    sizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cublasLtMatmulAlgoConfigSetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &attr,\n        \"cublasLtMatmulAlgoConfigSetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(buf), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &buf,\n        \"cublasLtMatmulAlgoConfigSetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cublasLtMatmulAlgoConfigSetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtMatmulAlgoConfigGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    algo: *const cuda_types::cublaslt::cublasLtMatmulAlgo_t,\n    attr: cuda_types::cublaslt::cublasLtMatmulAlgoConfigAttributes_t,\n    buf: *mut ::core::ffi::c_void,\n    sizeInBytes: usize,\n    sizeWritten: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cublasLtMatmulAlgoConfigGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &attr,\n        \"cublasLtMatmulAlgoConfigGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(buf), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &buf,\n        \"cublasLtMatmulAlgoConfigGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cublasLtMatmulAlgoConfigGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeWritten), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeWritten,\n        \"cublasLtMatmulAlgoConfigGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtLoggerSetCallback(\n    writer: &mut (impl std::io::Write + ?Sized),\n    callback: cuda_types::cublaslt::cublasLtLoggerCallback_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(callback), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&callback, \"cublasLtLoggerSetCallback\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtLoggerSetFile(\n    writer: &mut (impl std::io::Write + ?Sized),\n    file: *mut cuda_types::FILE,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(file), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&file, \"cublasLtLoggerSetFile\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtLoggerOpenFile(\n    writer: &mut (impl std::io::Write + ?Sized),\n    logFile: *const ::core::ffi::c_char,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(logFile), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&logFile, \"cublasLtLoggerOpenFile\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtLoggerSetLevel(\n    writer: &mut (impl std::io::Write + ?Sized),\n    level: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(level), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&level, \"cublasLtLoggerSetLevel\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtLoggerSetMask(\n    writer: &mut (impl std::io::Write + ?Sized),\n    mask: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(mask), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mask, \"cublasLtLoggerSetMask\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtLoggerForceDisable(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\n"
  },
  {
    "path": "format/src/format_generated_blaslt_internal.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\npub fn write_cublasLtShutdownCtx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtShutdownCtx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtSetEnvironmentMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtSetEnvironmentMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtSetEnvironmentMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtGetEnvironmentMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtGetEnvironmentMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtGetEnvironmentMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtCtxInit(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtCtxInit\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtHeuristicsCacheDestroy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtHeuristicsCacheDestroy\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtHeuristicLutSerializeEntry(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: *mut ::core::ffi::c_ulonglong,\n    param_13: *mut ::core::ffi::c_ulonglong,\n    param_14: ::core::ffi::c_ulonglong,\n    param_15: *mut ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtHeuristicLutSerializeEntry\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtHeuristicLutSerializeEntry\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtHeuristicLutSerializeEntry\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtHeuristicLutSerializeEntry\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtHeuristicLutSerializeEntry\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_6,\n        \"cublasLtHeuristicLutSerializeEntry\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_7,\n        \"cublasLtHeuristicLutSerializeEntry\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_8,\n        \"cublasLtHeuristicLutSerializeEntry\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_9,\n        \"cublasLtHeuristicLutSerializeEntry\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtHeuristicLutSerializeEntry\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_11,\n        \"cublasLtHeuristicLutSerializeEntry\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_12,\n        \"cublasLtHeuristicLutSerializeEntry\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_13,\n        \"cublasLtHeuristicLutSerializeEntry\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_14,\n        \"cublasLtHeuristicLutSerializeEntry\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_15,\n        \"cublasLtHeuristicLutSerializeEntry\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtHeuristicsCachePut(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtHeuristicsCachePut\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtHeuristicsCachePut\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtHeuristicsCachePut\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtHeuristicsCachePut\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtHeuristicsCachePut\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtHeuristicsCachePut\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtHeuristicsCachePut\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtHeuristicsCachePut\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtHeuristicsCachePut\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtHeuristicsCachePut\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtHeuristicsCachePut\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtHeuristicsCachePut\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtHeuristicsCacheGet(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtHeuristicsCacheGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtHeuristicsCacheGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtHeuristicsCacheGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtHeuristicsCacheGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtHeuristicsCacheGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtHeuristicsCacheGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtHeuristicsCacheGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtHeuristicsCacheGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtHeuristicsCacheGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtHeuristicsCacheGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtHeuristicsCacheGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtHeuristicsCacheGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtHeuristicsCacheGet\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtHeuristicsCacheCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: *mut ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtHeuristicsCacheCreate\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtLegacyGemmACC(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: *mut ::core::ffi::c_int,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_uint,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_uint,\n    param_14: ::core::ffi::c_uint,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_uint,\n    param_17: ::core::ffi::c_uint,\n    param_18: ::core::ffi::c_ulonglong,\n    param_19: ::core::ffi::c_uint,\n    param_20: ::core::ffi::c_uint,\n    param_21: ::core::ffi::c_uint,\n    param_22: ::core::ffi::c_uint,\n    param_23: ::core::ffi::c_uint,\n    param_24: ::core::ffi::c_uchar,\n    param_25: ::core::ffi::c_ulonglong,\n    param_26: ::core::ffi::c_ulonglong,\n    param_27: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtLegacyGemmACC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtLegacyGemmACC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtLegacyGemmACC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtLegacyGemmACC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtLegacyGemmACC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtLegacyGemmACC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtLegacyGemmACC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtLegacyGemmACC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtLegacyGemmACC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtLegacyGemmACC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtLegacyGemmACC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtLegacyGemmACC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtLegacyGemmACC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtLegacyGemmACC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtLegacyGemmACC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtLegacyGemmACC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_17), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_17, \"cublasLtLegacyGemmACC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_18), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_18, \"cublasLtLegacyGemmACC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_19), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_19, \"cublasLtLegacyGemmACC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_20), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_20, \"cublasLtLegacyGemmACC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_21), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_21, \"cublasLtLegacyGemmACC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_22), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_22, \"cublasLtLegacyGemmACC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_23), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_23, \"cublasLtLegacyGemmACC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_24), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_24, \"cublasLtLegacyGemmACC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_25), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_25, \"cublasLtLegacyGemmACC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_26), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_26, \"cublasLtLegacyGemmACC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_27), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_27, \"cublasLtLegacyGemmACC\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtLegacyGemmBII(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: *mut ::core::ffi::c_int,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_uint,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_uint,\n    param_14: ::core::ffi::c_uint,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_uint,\n    param_17: ::core::ffi::c_uint,\n    param_18: ::core::ffi::c_ulonglong,\n    param_19: ::core::ffi::c_uint,\n    param_20: ::core::ffi::c_uint,\n    param_21: ::core::ffi::c_uint,\n    param_22: ::core::ffi::c_uint,\n    param_23: ::core::ffi::c_uint,\n    param_24: ::core::ffi::c_uchar,\n    param_25: ::core::ffi::c_ulonglong,\n    param_26: ::core::ffi::c_ulonglong,\n    param_27: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtLegacyGemmBII\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtLegacyGemmBII\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtLegacyGemmBII\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtLegacyGemmBII\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtLegacyGemmBII\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtLegacyGemmBII\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtLegacyGemmBII\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtLegacyGemmBII\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtLegacyGemmBII\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtLegacyGemmBII\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtLegacyGemmBII\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtLegacyGemmBII\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtLegacyGemmBII\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtLegacyGemmBII\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtLegacyGemmBII\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtLegacyGemmBII\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_17), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_17, \"cublasLtLegacyGemmBII\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_18), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_18, \"cublasLtLegacyGemmBII\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_19), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_19, \"cublasLtLegacyGemmBII\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_20), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_20, \"cublasLtLegacyGemmBII\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_21), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_21, \"cublasLtLegacyGemmBII\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_22), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_22, \"cublasLtLegacyGemmBII\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_23), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_23, \"cublasLtLegacyGemmBII\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_24), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_24, \"cublasLtLegacyGemmBII\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_25), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_25, \"cublasLtLegacyGemmBII\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_26), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_26, \"cublasLtLegacyGemmBII\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_27), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_27, \"cublasLtLegacyGemmBII\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtLegacyGemmBSS(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: *mut ::core::ffi::c_int,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_uint,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_uint,\n    param_14: ::core::ffi::c_uint,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_uint,\n    param_17: ::core::ffi::c_uint,\n    param_18: ::core::ffi::c_ulonglong,\n    param_19: ::core::ffi::c_uint,\n    param_20: ::core::ffi::c_uint,\n    param_21: ::core::ffi::c_uint,\n    param_22: ::core::ffi::c_uint,\n    param_23: ::core::ffi::c_uint,\n    param_24: ::core::ffi::c_uchar,\n    param_25: ::core::ffi::c_ulonglong,\n    param_26: ::core::ffi::c_ulonglong,\n    param_27: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtLegacyGemmBSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtLegacyGemmBSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtLegacyGemmBSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtLegacyGemmBSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtLegacyGemmBSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtLegacyGemmBSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtLegacyGemmBSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtLegacyGemmBSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtLegacyGemmBSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtLegacyGemmBSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtLegacyGemmBSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtLegacyGemmBSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtLegacyGemmBSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtLegacyGemmBSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtLegacyGemmBSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtLegacyGemmBSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_17), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_17, \"cublasLtLegacyGemmBSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_18), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_18, \"cublasLtLegacyGemmBSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_19), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_19, \"cublasLtLegacyGemmBSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_20), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_20, \"cublasLtLegacyGemmBSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_21), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_21, \"cublasLtLegacyGemmBSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_22), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_22, \"cublasLtLegacyGemmBSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_23), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_23, \"cublasLtLegacyGemmBSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_24), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_24, \"cublasLtLegacyGemmBSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_25), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_25, \"cublasLtLegacyGemmBSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_26), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_26, \"cublasLtLegacyGemmBSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_27), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_27, \"cublasLtLegacyGemmBSS\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtLegacyGemmCCC(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: *mut ::core::ffi::c_int,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_uint,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_uint,\n    param_14: ::core::ffi::c_uint,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_uint,\n    param_17: ::core::ffi::c_uint,\n    param_18: ::core::ffi::c_ulonglong,\n    param_19: ::core::ffi::c_uint,\n    param_20: ::core::ffi::c_uint,\n    param_21: ::core::ffi::c_uint,\n    param_22: ::core::ffi::c_uint,\n    param_23: ::core::ffi::c_uint,\n    param_24: ::core::ffi::c_uchar,\n    param_25: ::core::ffi::c_ulonglong,\n    param_26: ::core::ffi::c_ulonglong,\n    param_27: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtLegacyGemmCCC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtLegacyGemmCCC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtLegacyGemmCCC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtLegacyGemmCCC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtLegacyGemmCCC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtLegacyGemmCCC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtLegacyGemmCCC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtLegacyGemmCCC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtLegacyGemmCCC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtLegacyGemmCCC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtLegacyGemmCCC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtLegacyGemmCCC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtLegacyGemmCCC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtLegacyGemmCCC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtLegacyGemmCCC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtLegacyGemmCCC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_17), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_17, \"cublasLtLegacyGemmCCC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_18), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_18, \"cublasLtLegacyGemmCCC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_19), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_19, \"cublasLtLegacyGemmCCC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_20), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_20, \"cublasLtLegacyGemmCCC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_21), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_21, \"cublasLtLegacyGemmCCC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_22), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_22, \"cublasLtLegacyGemmCCC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_23), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_23, \"cublasLtLegacyGemmCCC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_24), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_24, \"cublasLtLegacyGemmCCC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_25), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_25, \"cublasLtLegacyGemmCCC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_26), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_26, \"cublasLtLegacyGemmCCC\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_27), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_27, \"cublasLtLegacyGemmCCC\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtLegacyGemmDDD(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: *mut ::core::ffi::c_int,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_uint,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_uint,\n    param_14: ::core::ffi::c_uint,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_uint,\n    param_17: ::core::ffi::c_uint,\n    param_18: ::core::ffi::c_ulonglong,\n    param_19: ::core::ffi::c_uint,\n    param_20: ::core::ffi::c_uint,\n    param_21: ::core::ffi::c_uint,\n    param_22: ::core::ffi::c_uint,\n    param_23: ::core::ffi::c_uint,\n    param_24: ::core::ffi::c_uchar,\n    param_25: ::core::ffi::c_ulonglong,\n    param_26: ::core::ffi::c_ulonglong,\n    param_27: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtLegacyGemmDDD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtLegacyGemmDDD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtLegacyGemmDDD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtLegacyGemmDDD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtLegacyGemmDDD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtLegacyGemmDDD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtLegacyGemmDDD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtLegacyGemmDDD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtLegacyGemmDDD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtLegacyGemmDDD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtLegacyGemmDDD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtLegacyGemmDDD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtLegacyGemmDDD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtLegacyGemmDDD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtLegacyGemmDDD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtLegacyGemmDDD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_17), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_17, \"cublasLtLegacyGemmDDD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_18), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_18, \"cublasLtLegacyGemmDDD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_19), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_19, \"cublasLtLegacyGemmDDD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_20), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_20, \"cublasLtLegacyGemmDDD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_21), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_21, \"cublasLtLegacyGemmDDD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_22), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_22, \"cublasLtLegacyGemmDDD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_23), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_23, \"cublasLtLegacyGemmDDD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_24), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_24, \"cublasLtLegacyGemmDDD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_25), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_25, \"cublasLtLegacyGemmDDD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_26), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_26, \"cublasLtLegacyGemmDDD\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_27), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_27, \"cublasLtLegacyGemmDDD\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtLegacyGemmHHH(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: *mut ::core::ffi::c_int,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_uint,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_uint,\n    param_14: ::core::ffi::c_uint,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_uint,\n    param_17: ::core::ffi::c_uint,\n    param_18: ::core::ffi::c_ulonglong,\n    param_19: ::core::ffi::c_uint,\n    param_20: ::core::ffi::c_uint,\n    param_21: ::core::ffi::c_uint,\n    param_22: ::core::ffi::c_uint,\n    param_23: ::core::ffi::c_uint,\n    param_24: ::core::ffi::c_uchar,\n    param_25: ::core::ffi::c_ulonglong,\n    param_26: ::core::ffi::c_ulonglong,\n    param_27: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtLegacyGemmHHH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtLegacyGemmHHH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtLegacyGemmHHH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtLegacyGemmHHH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtLegacyGemmHHH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtLegacyGemmHHH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtLegacyGemmHHH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtLegacyGemmHHH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtLegacyGemmHHH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtLegacyGemmHHH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtLegacyGemmHHH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtLegacyGemmHHH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtLegacyGemmHHH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtLegacyGemmHHH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtLegacyGemmHHH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtLegacyGemmHHH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_17), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_17, \"cublasLtLegacyGemmHHH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_18), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_18, \"cublasLtLegacyGemmHHH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_19), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_19, \"cublasLtLegacyGemmHHH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_20), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_20, \"cublasLtLegacyGemmHHH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_21), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_21, \"cublasLtLegacyGemmHHH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_22), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_22, \"cublasLtLegacyGemmHHH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_23), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_23, \"cublasLtLegacyGemmHHH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_24), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_24, \"cublasLtLegacyGemmHHH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_25), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_25, \"cublasLtLegacyGemmHHH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_26), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_26, \"cublasLtLegacyGemmHHH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_27), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_27, \"cublasLtLegacyGemmHHH\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtLegacyGemmHSS(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: *mut ::core::ffi::c_int,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_uint,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_uint,\n    param_14: ::core::ffi::c_uint,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_uint,\n    param_17: ::core::ffi::c_uint,\n    param_18: ::core::ffi::c_ulonglong,\n    param_19: ::core::ffi::c_uint,\n    param_20: ::core::ffi::c_uint,\n    param_21: ::core::ffi::c_uint,\n    param_22: ::core::ffi::c_uint,\n    param_23: ::core::ffi::c_uint,\n    param_24: ::core::ffi::c_uchar,\n    param_25: ::core::ffi::c_ulonglong,\n    param_26: ::core::ffi::c_ulonglong,\n    param_27: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtLegacyGemmHSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtLegacyGemmHSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtLegacyGemmHSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtLegacyGemmHSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtLegacyGemmHSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtLegacyGemmHSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtLegacyGemmHSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtLegacyGemmHSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtLegacyGemmHSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtLegacyGemmHSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtLegacyGemmHSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtLegacyGemmHSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtLegacyGemmHSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtLegacyGemmHSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtLegacyGemmHSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtLegacyGemmHSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_17), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_17, \"cublasLtLegacyGemmHSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_18), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_18, \"cublasLtLegacyGemmHSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_19), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_19, \"cublasLtLegacyGemmHSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_20), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_20, \"cublasLtLegacyGemmHSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_21), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_21, \"cublasLtLegacyGemmHSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_22), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_22, \"cublasLtLegacyGemmHSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_23), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_23, \"cublasLtLegacyGemmHSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_24), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_24, \"cublasLtLegacyGemmHSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_25), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_25, \"cublasLtLegacyGemmHSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_26), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_26, \"cublasLtLegacyGemmHSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_27), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_27, \"cublasLtLegacyGemmHSS\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtLegacyGemmHSH(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: *mut ::core::ffi::c_int,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_uint,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_uint,\n    param_14: ::core::ffi::c_uint,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_uint,\n    param_17: ::core::ffi::c_uint,\n    param_18: ::core::ffi::c_ulonglong,\n    param_19: ::core::ffi::c_uint,\n    param_20: ::core::ffi::c_uint,\n    param_21: ::core::ffi::c_uint,\n    param_22: ::core::ffi::c_uint,\n    param_23: ::core::ffi::c_uint,\n    param_24: ::core::ffi::c_uchar,\n    param_25: ::core::ffi::c_ulonglong,\n    param_26: ::core::ffi::c_ulonglong,\n    param_27: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtLegacyGemmHSH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtLegacyGemmHSH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtLegacyGemmHSH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtLegacyGemmHSH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtLegacyGemmHSH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtLegacyGemmHSH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtLegacyGemmHSH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtLegacyGemmHSH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtLegacyGemmHSH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtLegacyGemmHSH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtLegacyGemmHSH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtLegacyGemmHSH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtLegacyGemmHSH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtLegacyGemmHSH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtLegacyGemmHSH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtLegacyGemmHSH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_17), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_17, \"cublasLtLegacyGemmHSH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_18), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_18, \"cublasLtLegacyGemmHSH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_19), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_19, \"cublasLtLegacyGemmHSH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_20), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_20, \"cublasLtLegacyGemmHSH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_21), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_21, \"cublasLtLegacyGemmHSH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_22), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_22, \"cublasLtLegacyGemmHSH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_23), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_23, \"cublasLtLegacyGemmHSH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_24), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_24, \"cublasLtLegacyGemmHSH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_25), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_25, \"cublasLtLegacyGemmHSH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_26), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_26, \"cublasLtLegacyGemmHSH\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_27), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_27, \"cublasLtLegacyGemmHSH\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtLegacyGemmSSS(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: *mut ::core::ffi::c_int,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_uint,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_uint,\n    param_14: ::core::ffi::c_uint,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_uint,\n    param_17: ::core::ffi::c_uint,\n    param_18: ::core::ffi::c_ulonglong,\n    param_19: ::core::ffi::c_uint,\n    param_20: ::core::ffi::c_uint,\n    param_21: ::core::ffi::c_uint,\n    param_22: ::core::ffi::c_uint,\n    param_23: ::core::ffi::c_uint,\n    param_24: ::core::ffi::c_uchar,\n    param_25: ::core::ffi::c_ulonglong,\n    param_26: ::core::ffi::c_ulonglong,\n    param_27: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtLegacyGemmSSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtLegacyGemmSSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtLegacyGemmSSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtLegacyGemmSSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtLegacyGemmSSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtLegacyGemmSSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtLegacyGemmSSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtLegacyGemmSSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtLegacyGemmSSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtLegacyGemmSSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtLegacyGemmSSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtLegacyGemmSSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtLegacyGemmSSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtLegacyGemmSSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtLegacyGemmSSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtLegacyGemmSSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_17), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_17, \"cublasLtLegacyGemmSSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_18), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_18, \"cublasLtLegacyGemmSSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_19), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_19, \"cublasLtLegacyGemmSSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_20), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_20, \"cublasLtLegacyGemmSSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_21), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_21, \"cublasLtLegacyGemmSSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_22), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_22, \"cublasLtLegacyGemmSSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_23), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_23, \"cublasLtLegacyGemmSSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_24), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_24, \"cublasLtLegacyGemmSSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_25), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_25, \"cublasLtLegacyGemmSSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_26), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_26, \"cublasLtLegacyGemmSSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_27), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_27, \"cublasLtLegacyGemmSSS\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtLegacyGemmTSS(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: *mut ::core::ffi::c_int,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_uint,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_uint,\n    param_14: ::core::ffi::c_uint,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_uint,\n    param_17: ::core::ffi::c_uint,\n    param_18: ::core::ffi::c_ulonglong,\n    param_19: ::core::ffi::c_uint,\n    param_20: ::core::ffi::c_uint,\n    param_21: ::core::ffi::c_uint,\n    param_22: ::core::ffi::c_uint,\n    param_23: ::core::ffi::c_uint,\n    param_24: ::core::ffi::c_uchar,\n    param_25: ::core::ffi::c_ulonglong,\n    param_26: ::core::ffi::c_ulonglong,\n    param_27: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtLegacyGemmTSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtLegacyGemmTSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtLegacyGemmTSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtLegacyGemmTSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtLegacyGemmTSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtLegacyGemmTSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtLegacyGemmTSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtLegacyGemmTSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtLegacyGemmTSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtLegacyGemmTSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtLegacyGemmTSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtLegacyGemmTSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtLegacyGemmTSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtLegacyGemmTSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtLegacyGemmTSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtLegacyGemmTSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_17), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_17, \"cublasLtLegacyGemmTSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_18), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_18, \"cublasLtLegacyGemmTSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_19), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_19, \"cublasLtLegacyGemmTSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_20), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_20, \"cublasLtLegacyGemmTSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_21), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_21, \"cublasLtLegacyGemmTSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_22), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_22, \"cublasLtLegacyGemmTSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_23), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_23, \"cublasLtLegacyGemmTSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_24), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_24, \"cublasLtLegacyGemmTSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_25), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_25, \"cublasLtLegacyGemmTSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_26), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_26, \"cublasLtLegacyGemmTSS\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_27), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_27, \"cublasLtLegacyGemmTSS\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtLegacyGemmTST(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: *mut ::core::ffi::c_int,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_uint,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_uint,\n    param_14: ::core::ffi::c_uint,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_uint,\n    param_17: ::core::ffi::c_uint,\n    param_18: ::core::ffi::c_ulonglong,\n    param_19: ::core::ffi::c_uint,\n    param_20: ::core::ffi::c_uint,\n    param_21: ::core::ffi::c_uint,\n    param_22: ::core::ffi::c_uint,\n    param_23: ::core::ffi::c_uint,\n    param_24: ::core::ffi::c_uchar,\n    param_25: ::core::ffi::c_ulonglong,\n    param_26: ::core::ffi::c_ulonglong,\n    param_27: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtLegacyGemmTST\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtLegacyGemmTST\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtLegacyGemmTST\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtLegacyGemmTST\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtLegacyGemmTST\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtLegacyGemmTST\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtLegacyGemmTST\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtLegacyGemmTST\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtLegacyGemmTST\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtLegacyGemmTST\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtLegacyGemmTST\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtLegacyGemmTST\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtLegacyGemmTST\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtLegacyGemmTST\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtLegacyGemmTST\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtLegacyGemmTST\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_17), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_17, \"cublasLtLegacyGemmTST\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_18), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_18, \"cublasLtLegacyGemmTST\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_19), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_19, \"cublasLtLegacyGemmTST\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_20), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_20, \"cublasLtLegacyGemmTST\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_21), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_21, \"cublasLtLegacyGemmTST\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_22), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_22, \"cublasLtLegacyGemmTST\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_23), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_23, \"cublasLtLegacyGemmTST\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_24), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_24, \"cublasLtLegacyGemmTST\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_25), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_25, \"cublasLtLegacyGemmTST\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_26), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_26, \"cublasLtLegacyGemmTST\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_27), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_27, \"cublasLtLegacyGemmTST\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtLegacyGemmZZZ(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: *mut ::core::ffi::c_int,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_uint,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_uint,\n    param_14: ::core::ffi::c_uint,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_uint,\n    param_17: ::core::ffi::c_uint,\n    param_18: ::core::ffi::c_ulonglong,\n    param_19: ::core::ffi::c_uint,\n    param_20: ::core::ffi::c_uint,\n    param_21: ::core::ffi::c_uint,\n    param_22: ::core::ffi::c_uint,\n    param_23: ::core::ffi::c_uint,\n    param_24: ::core::ffi::c_uchar,\n    param_25: ::core::ffi::c_ulonglong,\n    param_26: ::core::ffi::c_ulonglong,\n    param_27: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtLegacyGemmZZZ\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtLegacyGemmZZZ\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtLegacyGemmZZZ\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtLegacyGemmZZZ\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtLegacyGemmZZZ\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtLegacyGemmZZZ\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtLegacyGemmZZZ\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtLegacyGemmZZZ\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtLegacyGemmZZZ\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtLegacyGemmZZZ\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtLegacyGemmZZZ\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtLegacyGemmZZZ\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtLegacyGemmZZZ\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtLegacyGemmZZZ\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtLegacyGemmZZZ\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtLegacyGemmZZZ\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_17), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_17, \"cublasLtLegacyGemmZZZ\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_18), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_18, \"cublasLtLegacyGemmZZZ\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_19), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_19, \"cublasLtLegacyGemmZZZ\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_20), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_20, \"cublasLtLegacyGemmZZZ\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_21), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_21, \"cublasLtLegacyGemmZZZ\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_22), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_22, \"cublasLtLegacyGemmZZZ\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_23), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_23, \"cublasLtLegacyGemmZZZ\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_24), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_24, \"cublasLtLegacyGemmZZZ\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_25), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_25, \"cublasLtLegacyGemmZZZ\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_26), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_26, \"cublasLtLegacyGemmZZZ\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_27), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_27, \"cublasLtLegacyGemmZZZ\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtClearNvjetCache(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtClearNvjetCache\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtAlgoCharacteristicGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_int,\n    param_4: ::core::ffi::c_int,\n    param_5: ::core::ffi::c_int,\n    param_6: *mut ::core::ffi::c_char,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtAlgoCharacteristicGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtAlgoCharacteristicGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtAlgoCharacteristicGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtAlgoCharacteristicGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtAlgoCharacteristicGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_6,\n        \"cublasLtAlgoCharacteristicGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_7,\n        \"cublasLtAlgoCharacteristicGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_8,\n        \"cublasLtAlgoCharacteristicGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtMatmulAlgoConfigGetAttributeRange(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_cublasLtHHHMatmulAlgoGetIds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_int,\n    param_5: ::core::ffi::c_int,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_int,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtHHHMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtHHHMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtHHHMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtHHHMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtHHHMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtHHHMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtHHHMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtHHHMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtHHHMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtHHHMatmulAlgoGetIds\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtHHHMatmulAlgoInit(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtHHHMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtHHHMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtHHHMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtHHHMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtHHHMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtHHHMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtHHHMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtHHHMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtHHHMatmulAlgoInit\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtHHHMatmulAlgoCapGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtHHHMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtHHHMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtHHHMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtHHHMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtHHHMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtHHHMatmul(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_ulonglong,\n    param_14: ::core::ffi::c_ulonglong,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtHHHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtHHHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtHHHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtHHHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtHHHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtHHHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtHHHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtHHHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtHHHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtHHHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtHHHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtHHHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtHHHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtHHHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtHHHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtHHHMatmul\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtHHHMatmulAlgoCheck(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtHHHMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtHHHMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtHHHMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtHHHMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtHHHMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtHHHMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtHHHMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtHHHMatmulAlgoCheck\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtHHHMatmulAlgoGetHeuristic(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: *mut ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtHHHMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtHHHMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtHHHMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtHHHMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtHHHMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_6,\n        \"cublasLtHHHMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_7,\n        \"cublasLtHHHMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_8,\n        \"cublasLtHHHMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_9,\n        \"cublasLtHHHMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtHHHMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtHSHMatmulAlgoGetIds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_int,\n    param_5: ::core::ffi::c_int,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_int,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtHSHMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtHSHMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtHSHMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtHSHMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtHSHMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtHSHMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtHSHMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtHSHMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtHSHMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtHSHMatmulAlgoGetIds\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtHSHMatmulAlgoInit(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtHSHMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtHSHMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtHSHMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtHSHMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtHSHMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtHSHMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtHSHMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtHSHMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtHSHMatmulAlgoInit\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtHSHMatmulAlgoCapGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtHSHMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtHSHMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtHSHMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtHSHMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtHSHMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtHSHMatmul(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_ulonglong,\n    param_14: ::core::ffi::c_ulonglong,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtHSHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtHSHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtHSHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtHSHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtHSHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtHSHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtHSHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtHSHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtHSHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtHSHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtHSHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtHSHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtHSHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtHSHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtHSHMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtHSHMatmul\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtHSHMatmulAlgoCheck(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtHSHMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtHSHMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtHSHMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtHSHMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtHSHMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtHSHMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtHSHMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtHSHMatmulAlgoCheck\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtHSHMatmulAlgoGetHeuristic(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: *mut ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtHSHMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtHSHMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtHSHMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtHSHMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtHSHMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_6,\n        \"cublasLtHSHMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_7,\n        \"cublasLtHSHMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_8,\n        \"cublasLtHSHMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_9,\n        \"cublasLtHSHMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtHSHMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtSSSMatmulAlgoGetIds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_int,\n    param_5: ::core::ffi::c_int,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_int,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtSSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtSSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtSSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtSSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtSSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtSSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtSSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtSSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtSSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtSSSMatmulAlgoGetIds\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtSSSMatmulAlgoInit(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtSSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtSSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtSSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtSSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtSSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtSSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtSSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtSSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtSSSMatmulAlgoInit\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtSSSMatmulAlgoCapGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtSSSMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtSSSMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtSSSMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtSSSMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtSSSMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtSSSMatmul(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_ulonglong,\n    param_14: ::core::ffi::c_ulonglong,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtSSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtSSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtSSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtSSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtSSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtSSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtSSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtSSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtSSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtSSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtSSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtSSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtSSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtSSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtSSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtSSSMatmul\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtSSSMatmulAlgoCheck(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtSSSMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtSSSMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtSSSMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtSSSMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtSSSMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtSSSMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtSSSMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtSSSMatmulAlgoCheck\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtSSSMatmulAlgoGetHeuristic(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: *mut ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtSSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtSSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtSSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtSSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtSSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_6,\n        \"cublasLtSSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_7,\n        \"cublasLtSSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_8,\n        \"cublasLtSSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_9,\n        \"cublasLtSSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtSSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtDDDMatmulAlgoGetIds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_int,\n    param_5: ::core::ffi::c_int,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_int,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtDDDMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtDDDMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtDDDMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtDDDMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtDDDMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtDDDMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtDDDMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtDDDMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtDDDMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtDDDMatmulAlgoGetIds\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtDDDMatmulAlgoInit(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtDDDMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtDDDMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtDDDMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtDDDMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtDDDMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtDDDMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtDDDMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtDDDMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtDDDMatmulAlgoInit\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtDDDMatmulAlgoCapGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtDDDMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtDDDMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtDDDMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtDDDMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtDDDMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtDDDMatmul(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_ulonglong,\n    param_14: ::core::ffi::c_ulonglong,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtDDDMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtDDDMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtDDDMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtDDDMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtDDDMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtDDDMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtDDDMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtDDDMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtDDDMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtDDDMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtDDDMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtDDDMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtDDDMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtDDDMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtDDDMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtDDDMatmul\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtDDDMatmulAlgoCheck(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtDDDMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtDDDMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtDDDMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtDDDMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtDDDMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtDDDMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtDDDMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtDDDMatmulAlgoCheck\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtDDDMatmulAlgoGetHeuristic(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: *mut ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtDDDMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtDDDMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtDDDMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtDDDMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtDDDMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_6,\n        \"cublasLtDDDMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_7,\n        \"cublasLtDDDMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_8,\n        \"cublasLtDDDMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_9,\n        \"cublasLtDDDMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtDDDMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtBSSMatmulAlgoGetIds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_int,\n    param_5: ::core::ffi::c_int,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_int,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtBSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtBSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtBSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtBSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtBSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtBSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtBSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtBSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtBSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtBSSMatmulAlgoGetIds\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtBSSMatmulAlgoInit(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtBSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtBSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtBSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtBSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtBSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtBSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtBSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtBSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtBSSMatmulAlgoInit\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtBSSMatmulAlgoCapGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtBSSMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtBSSMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtBSSMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtBSSMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtBSSMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtBSSMatmul(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_ulonglong,\n    param_14: ::core::ffi::c_ulonglong,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtBSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtBSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtBSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtBSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtBSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtBSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtBSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtBSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtBSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtBSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtBSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtBSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtBSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtBSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtBSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtBSSMatmul\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtBSSMatmulAlgoCheck(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtBSSMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtBSSMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtBSSMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtBSSMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtBSSMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtBSSMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtBSSMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtBSSMatmulAlgoCheck\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtBSSMatmulAlgoGetHeuristic(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: *mut ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtBSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtBSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtBSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtBSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtBSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_6,\n        \"cublasLtBSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_7,\n        \"cublasLtBSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_8,\n        \"cublasLtBSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_9,\n        \"cublasLtBSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtBSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtCCCMatmulAlgoGetIds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_int,\n    param_5: ::core::ffi::c_int,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_int,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtCCCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtCCCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtCCCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtCCCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtCCCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtCCCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtCCCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtCCCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtCCCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtCCCMatmulAlgoGetIds\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtCCCMatmulAlgoInit(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtCCCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtCCCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtCCCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtCCCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtCCCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtCCCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtCCCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtCCCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtCCCMatmulAlgoInit\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtCCCMatmulAlgoCapGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtCCCMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtCCCMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtCCCMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtCCCMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtCCCMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtCCCMatmul(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_ulonglong,\n    param_14: ::core::ffi::c_ulonglong,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtCCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtCCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtCCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtCCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtCCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtCCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtCCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtCCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtCCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtCCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtCCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtCCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtCCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtCCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtCCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtCCCMatmul\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtCCCMatmulAlgoCheck(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtCCCMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtCCCMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtCCCMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtCCCMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtCCCMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtCCCMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtCCCMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtCCCMatmulAlgoCheck\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtCCCMatmulAlgoGetHeuristic(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: *mut ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtCCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtCCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtCCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtCCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtCCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_6,\n        \"cublasLtCCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_7,\n        \"cublasLtCCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_8,\n        \"cublasLtCCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_9,\n        \"cublasLtCCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtCCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtZZZMatmulAlgoGetIds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_int,\n    param_5: ::core::ffi::c_int,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_int,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtZZZMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtZZZMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtZZZMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtZZZMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtZZZMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtZZZMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtZZZMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtZZZMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtZZZMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtZZZMatmulAlgoGetIds\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtZZZMatmulAlgoInit(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtZZZMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtZZZMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtZZZMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtZZZMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtZZZMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtZZZMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtZZZMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtZZZMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtZZZMatmulAlgoInit\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtZZZMatmulAlgoCapGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtZZZMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtZZZMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtZZZMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtZZZMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtZZZMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtZZZMatmul(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_ulonglong,\n    param_14: ::core::ffi::c_ulonglong,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtZZZMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtZZZMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtZZZMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtZZZMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtZZZMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtZZZMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtZZZMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtZZZMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtZZZMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtZZZMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtZZZMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtZZZMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtZZZMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtZZZMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtZZZMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtZZZMatmul\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtZZZMatmulAlgoCheck(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtZZZMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtZZZMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtZZZMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtZZZMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtZZZMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtZZZMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtZZZMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtZZZMatmulAlgoCheck\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtZZZMatmulAlgoGetHeuristic(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: *mut ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtZZZMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtZZZMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtZZZMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtZZZMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtZZZMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_6,\n        \"cublasLtZZZMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_7,\n        \"cublasLtZZZMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_8,\n        \"cublasLtZZZMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_9,\n        \"cublasLtZZZMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtZZZMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtACCMatmulAlgoGetIds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_int,\n    param_5: ::core::ffi::c_int,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_int,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtACCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtACCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtACCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtACCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtACCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtACCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtACCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtACCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtACCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtACCMatmulAlgoGetIds\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtACCMatmulAlgoInit(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtACCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtACCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtACCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtACCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtACCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtACCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtACCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtACCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtACCMatmulAlgoInit\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtACCMatmulAlgoCapGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtACCMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtACCMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtACCMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtACCMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtACCMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtACCMatmul(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_ulonglong,\n    param_14: ::core::ffi::c_ulonglong,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtACCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtACCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtACCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtACCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtACCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtACCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtACCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtACCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtACCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtACCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtACCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtACCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtACCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtACCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtACCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtACCMatmul\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtACCMatmulAlgoCheck(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtACCMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtACCMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtACCMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtACCMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtACCMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtACCMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtACCMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtACCMatmulAlgoCheck\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtACCMatmulAlgoGetHeuristic(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: *mut ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtACCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtACCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtACCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtACCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtACCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_6,\n        \"cublasLtACCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_7,\n        \"cublasLtACCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_8,\n        \"cublasLtACCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_9,\n        \"cublasLtACCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtACCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtBIIMatmulAlgoGetIds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_int,\n    param_5: ::core::ffi::c_int,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_int,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtBIIMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtBIIMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtBIIMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtBIIMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtBIIMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtBIIMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtBIIMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtBIIMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtBIIMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtBIIMatmulAlgoGetIds\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtBIIMatmulAlgoInit(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtBIIMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtBIIMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtBIIMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtBIIMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtBIIMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtBIIMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtBIIMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtBIIMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtBIIMatmulAlgoInit\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtBIIMatmulAlgoCapGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtBIIMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtBIIMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtBIIMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtBIIMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtBIIMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtBIIMatmul(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_ulonglong,\n    param_14: ::core::ffi::c_ulonglong,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtBIIMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtBIIMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtBIIMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtBIIMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtBIIMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtBIIMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtBIIMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtBIIMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtBIIMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtBIIMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtBIIMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtBIIMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtBIIMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtBIIMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtBIIMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtBIIMatmul\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtBIIMatmulAlgoCheck(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtBIIMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtBIIMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtBIIMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtBIIMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtBIIMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtBIIMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtBIIMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtBIIMatmulAlgoCheck\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtBIIMatmulAlgoGetHeuristic(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: *mut ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtBIIMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtBIIMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtBIIMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtBIIMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtBIIMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_6,\n        \"cublasLtBIIMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_7,\n        \"cublasLtBIIMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_8,\n        \"cublasLtBIIMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_9,\n        \"cublasLtBIIMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtBIIMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtBSBMatmulAlgoGetIds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_int,\n    param_5: ::core::ffi::c_int,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_int,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtBSBMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtBSBMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtBSBMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtBSBMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtBSBMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtBSBMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtBSBMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtBSBMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtBSBMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtBSBMatmulAlgoGetIds\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtBSBMatmulAlgoInit(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtBSBMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtBSBMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtBSBMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtBSBMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtBSBMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtBSBMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtBSBMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtBSBMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtBSBMatmulAlgoInit\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtBSBMatmulAlgoCapGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtBSBMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtBSBMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtBSBMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtBSBMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtBSBMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtBSBMatmul(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_ulonglong,\n    param_14: ::core::ffi::c_ulonglong,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtBSBMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtBSBMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtBSBMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtBSBMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtBSBMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtBSBMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtBSBMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtBSBMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtBSBMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtBSBMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtBSBMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtBSBMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtBSBMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtBSBMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtBSBMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtBSBMatmul\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtBSBMatmulAlgoCheck(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtBSBMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtBSBMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtBSBMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtBSBMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtBSBMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtBSBMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtBSBMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtBSBMatmulAlgoCheck\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtBSBMatmulAlgoGetHeuristic(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: *mut ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtBSBMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtBSBMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtBSBMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtBSBMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtBSBMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_6,\n        \"cublasLtBSBMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_7,\n        \"cublasLtBSBMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_8,\n        \"cublasLtBSBMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_9,\n        \"cublasLtBSBMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtBSBMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtHSSMatmulAlgoGetIds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_int,\n    param_5: ::core::ffi::c_int,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_int,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtHSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtHSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtHSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtHSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtHSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtHSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtHSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtHSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtHSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtHSSMatmulAlgoGetIds\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtHSSMatmulAlgoInit(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtHSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtHSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtHSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtHSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtHSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtHSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtHSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtHSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtHSSMatmulAlgoInit\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtHSSMatmulAlgoCapGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtHSSMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtHSSMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtHSSMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtHSSMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtHSSMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtHSSMatmul(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_ulonglong,\n    param_14: ::core::ffi::c_ulonglong,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtHSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtHSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtHSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtHSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtHSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtHSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtHSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtHSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtHSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtHSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtHSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtHSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtHSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtHSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtHSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtHSSMatmul\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtHSSMatmulAlgoCheck(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtHSSMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtHSSMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtHSSMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtHSSMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtHSSMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtHSSMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtHSSMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtHSSMatmulAlgoCheck\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtHSSMatmulAlgoGetHeuristic(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: *mut ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtHSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtHSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtHSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtHSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtHSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_6,\n        \"cublasLtHSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_7,\n        \"cublasLtHSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_8,\n        \"cublasLtHSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_9,\n        \"cublasLtHSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtHSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtKCCMatmulAlgoGetIds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_int,\n    param_5: ::core::ffi::c_int,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_int,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtKCCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtKCCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtKCCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtKCCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtKCCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtKCCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtKCCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtKCCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtKCCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtKCCMatmulAlgoGetIds\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtKCCMatmulAlgoInit(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtKCCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtKCCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtKCCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtKCCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtKCCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtKCCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtKCCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtKCCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtKCCMatmulAlgoInit\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtKCCMatmulAlgoCapGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtKCCMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtKCCMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtKCCMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtKCCMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtKCCMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtKCCMatmul(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_ulonglong,\n    param_14: ::core::ffi::c_ulonglong,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtKCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtKCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtKCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtKCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtKCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtKCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtKCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtKCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtKCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtKCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtKCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtKCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtKCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtKCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtKCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtKCCMatmul\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtKCCMatmulAlgoCheck(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtKCCMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtKCCMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtKCCMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtKCCMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtKCCMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtKCCMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtKCCMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtKCCMatmulAlgoCheck\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtKCCMatmulAlgoGetHeuristic(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: *mut ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtKCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtKCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtKCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtKCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtKCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_6,\n        \"cublasLtKCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_7,\n        \"cublasLtKCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_8,\n        \"cublasLtKCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_9,\n        \"cublasLtKCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtKCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtKCKMatmulAlgoGetIds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_int,\n    param_5: ::core::ffi::c_int,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_int,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtKCKMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtKCKMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtKCKMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtKCKMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtKCKMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtKCKMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtKCKMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtKCKMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtKCKMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtKCKMatmulAlgoGetIds\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtKCKMatmulAlgoInit(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtKCKMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtKCKMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtKCKMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtKCKMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtKCKMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtKCKMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtKCKMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtKCKMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtKCKMatmulAlgoInit\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtKCKMatmulAlgoCapGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtKCKMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtKCKMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtKCKMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtKCKMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtKCKMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtKCKMatmul(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_ulonglong,\n    param_14: ::core::ffi::c_ulonglong,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtKCKMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtKCKMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtKCKMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtKCKMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtKCKMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtKCKMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtKCKMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtKCKMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtKCKMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtKCKMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtKCKMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtKCKMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtKCKMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtKCKMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtKCKMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtKCKMatmul\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtKCKMatmulAlgoCheck(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtKCKMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtKCKMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtKCKMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtKCKMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtKCKMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtKCKMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtKCKMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtKCKMatmulAlgoCheck\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtKCKMatmulAlgoGetHeuristic(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: *mut ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtKCKMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtKCKMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtKCKMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtKCKMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtKCKMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_6,\n        \"cublasLtKCKMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_7,\n        \"cublasLtKCKMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_8,\n        \"cublasLtKCKMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_9,\n        \"cublasLtKCKMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtKCKMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtTSSMatmulAlgoGetIds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_int,\n    param_5: ::core::ffi::c_int,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_int,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtTSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtTSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtTSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtTSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtTSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtTSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtTSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtTSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtTSSMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtTSSMatmulAlgoGetIds\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtTSSMatmulAlgoInit(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtTSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtTSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtTSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtTSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtTSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtTSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtTSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtTSSMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtTSSMatmulAlgoInit\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtTSSMatmulAlgoCapGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtTSSMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtTSSMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtTSSMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtTSSMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtTSSMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtTSSMatmul(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_ulonglong,\n    param_14: ::core::ffi::c_ulonglong,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtTSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtTSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtTSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtTSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtTSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtTSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtTSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtTSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtTSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtTSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtTSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtTSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtTSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtTSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtTSSMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtTSSMatmul\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtTSSMatmulAlgoCheck(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtTSSMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtTSSMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtTSSMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtTSSMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtTSSMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtTSSMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtTSSMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtTSSMatmulAlgoCheck\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtTSSMatmulAlgoGetHeuristic(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: *mut ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtTSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtTSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtTSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtTSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtTSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_6,\n        \"cublasLtTSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_7,\n        \"cublasLtTSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_8,\n        \"cublasLtTSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_9,\n        \"cublasLtTSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtTSSMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtTSTMatmulAlgoGetIds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_int,\n    param_5: ::core::ffi::c_int,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_int,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtTSTMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtTSTMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtTSTMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtTSTMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtTSTMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtTSTMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtTSTMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtTSTMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtTSTMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtTSTMatmulAlgoGetIds\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtTSTMatmulAlgoInit(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtTSTMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtTSTMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtTSTMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtTSTMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtTSTMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtTSTMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtTSTMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtTSTMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtTSTMatmulAlgoInit\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtTSTMatmulAlgoCapGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtTSTMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtTSTMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtTSTMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtTSTMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtTSTMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtTSTMatmul(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_ulonglong,\n    param_14: ::core::ffi::c_ulonglong,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtTSTMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtTSTMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtTSTMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtTSTMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtTSTMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtTSTMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtTSTMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtTSTMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtTSTMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtTSTMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtTSTMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtTSTMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtTSTMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtTSTMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtTSTMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtTSTMatmul\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtTSTMatmulAlgoCheck(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtTSTMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtTSTMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtTSTMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtTSTMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtTSTMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtTSTMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtTSTMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtTSTMatmulAlgoCheck\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtTSTMatmulAlgoGetHeuristic(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: *mut ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtTSTMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtTSTMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtTSTMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtTSTMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtTSTMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_6,\n        \"cublasLtTSTMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_7,\n        \"cublasLtTSTMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_8,\n        \"cublasLtTSTMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_9,\n        \"cublasLtTSTMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtTSTMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtVCCMatmulAlgoGetIds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_int,\n    param_5: ::core::ffi::c_int,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_int,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtVCCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtVCCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtVCCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtVCCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtVCCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtVCCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtVCCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtVCCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtVCCMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtVCCMatmulAlgoGetIds\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtVCCMatmulAlgoInit(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtVCCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtVCCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtVCCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtVCCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtVCCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtVCCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtVCCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtVCCMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtVCCMatmulAlgoInit\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtVCCMatmulAlgoCapGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtVCCMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtVCCMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtVCCMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtVCCMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtVCCMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtVCCMatmul(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_ulonglong,\n    param_14: ::core::ffi::c_ulonglong,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtVCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtVCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtVCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtVCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtVCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtVCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtVCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtVCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtVCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtVCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtVCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtVCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtVCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtVCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtVCCMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtVCCMatmul\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtVCCMatmulAlgoCheck(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtVCCMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtVCCMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtVCCMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtVCCMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtVCCMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtVCCMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtVCCMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtVCCMatmulAlgoCheck\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtVCCMatmulAlgoGetHeuristic(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: *mut ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtVCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtVCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtVCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtVCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtVCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_6,\n        \"cublasLtVCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_7,\n        \"cublasLtVCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_8,\n        \"cublasLtVCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_9,\n        \"cublasLtVCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtVCCMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtVCVMatmulAlgoGetIds(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_int,\n    param_5: ::core::ffi::c_int,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_int,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtVCVMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtVCVMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtVCVMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtVCVMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtVCVMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtVCVMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtVCVMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtVCVMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtVCVMatmulAlgoGetIds\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtVCVMatmulAlgoGetIds\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtVCVMatmulAlgoInit(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_uint,\n    param_4: ::core::ffi::c_uint,\n    param_5: ::core::ffi::c_uint,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtVCVMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtVCVMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtVCVMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtVCVMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtVCVMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtVCVMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtVCVMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtVCVMatmulAlgoInit\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtVCVMatmulAlgoInit\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtVCVMatmulAlgoCapGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_uint,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtVCVMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtVCVMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtVCVMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtVCVMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtVCVMatmulAlgoCapGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtVCVMatmul(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n    param_11: ::core::ffi::c_ulonglong,\n    param_12: ::core::ffi::c_ulonglong,\n    param_13: ::core::ffi::c_ulonglong,\n    param_14: ::core::ffi::c_ulonglong,\n    param_15: ::core::ffi::c_ulonglong,\n    param_16: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtVCVMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtVCVMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtVCVMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtVCVMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtVCVMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtVCVMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtVCVMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtVCVMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cublasLtVCVMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cublasLtVCVMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_11), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_11, \"cublasLtVCVMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_12), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_12, \"cublasLtVCVMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_13), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_13, \"cublasLtVCVMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_14), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_14, \"cublasLtVCVMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_15), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_15, \"cublasLtVCVMatmul\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_16), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_16, \"cublasLtVCVMatmul\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtVCVMatmulAlgoCheck(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cublasLtVCVMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cublasLtVCVMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cublasLtVCVMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cublasLtVCVMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cublasLtVCVMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cublasLtVCVMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cublasLtVCVMatmulAlgoCheck\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cublasLtVCVMatmulAlgoCheck\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLtVCVMatmulAlgoGetHeuristic(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_ulonglong,\n    param_2: ::core::ffi::c_ulonglong,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_ulonglong,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_ulonglong,\n    param_7: *mut ::core::ffi::c_ulonglong,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_1,\n        \"cublasLtVCVMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_2,\n        \"cublasLtVCVMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_3,\n        \"cublasLtVCVMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_4,\n        \"cublasLtVCVMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_5,\n        \"cublasLtVCVMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_6,\n        \"cublasLtVCVMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_7,\n        \"cublasLtVCVMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_8,\n        \"cublasLtVCVMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_9,\n        \"cublasLtVCVMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param_10,\n        \"cublasLtVCVMatmulAlgoGetHeuristic\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cublasLt_for_cublas_BII(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_cublasLt_for_cublas_BSS(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_cublasLt_for_cublas_DDD(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_cublasLt_for_cublas_HHH(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_cublasLt_for_cublas_HSH(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_cublasLt_for_cublas_HSS(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_cublasLt_for_cublas_SSS(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_cublasLt_for_cublas_TSS(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_cublasLt_for_cublas_TST(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\n"
  },
  {
    "path": "format/src/format_generated_dnn8.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\npub fn write_cudnnGetVersion(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_cudnnGetMaxDeviceVersion(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_cudnnGetCudartVersion(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_cudnnGetErrorString(\n    writer: &mut (impl std::io::Write + ?Sized),\n    status: cuda_types::cudnn8::cudnnStatus_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(status), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&status, \"cudnnGetErrorString\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnQueryRuntimeError(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rstatus: *mut cuda_types::cudnn8::cudnnStatus_t,\n    mode: cuda_types::cudnn8::cudnnErrQueryMode_t,\n    tag: *mut cuda_types::cudnn8::cudnnRuntimeTag_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnQueryRuntimeError\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rstatus), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rstatus, \"cudnnQueryRuntimeError\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cudnnQueryRuntimeError\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(tag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&tag, \"cudnnQueryRuntimeError\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetProperty(\n    writer: &mut (impl std::io::Write + ?Sized),\n    type_: cuda_types::cudnn8::libraryPropertyType,\n    value: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cudnnGetProperty\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cudnnGetProperty\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: *mut cuda_types::cudnn8::cudnnHandle_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnCreate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnDestroy\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetStream(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    streamId: cuda_types::cudnn8::cudaStream_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnSetStream\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(streamId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&streamId, \"cudnnSetStream\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetStream(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    streamId: *mut cuda_types::cudnn8::cudaStream_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnGetStream\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(streamId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&streamId, \"cudnnGetStream\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreateTensorDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    tensorDesc: *mut cuda_types::cudnn8::cudnnTensorDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(tensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &tensorDesc,\n        \"cudnnCreateTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetTensor4dDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    tensorDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    format: cuda_types::cudnn8::cudnnTensorFormat_t,\n    dataType: cuda_types::cudnn8::cudnnDataType_t,\n    n: ::core::ffi::c_int,\n    c: ::core::ffi::c_int,\n    h: ::core::ffi::c_int,\n    w: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(tensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &tensorDesc,\n        \"cudnnSetTensor4dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(format), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&format, \"cudnnSetTensor4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnSetTensor4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cudnnSetTensor4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cudnnSetTensor4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(h), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&h, \"cudnnSetTensor4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&w, \"cudnnSetTensor4dDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetTensor4dDescriptorEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    tensorDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dataType: cuda_types::cudnn8::cudnnDataType_t,\n    n: ::core::ffi::c_int,\n    c: ::core::ffi::c_int,\n    h: ::core::ffi::c_int,\n    w: ::core::ffi::c_int,\n    nStride: ::core::ffi::c_int,\n    cStride: ::core::ffi::c_int,\n    hStride: ::core::ffi::c_int,\n    wStride: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(tensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &tensorDesc,\n        \"cudnnSetTensor4dDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dataType,\n        \"cudnnSetTensor4dDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cudnnSetTensor4dDescriptorEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cudnnSetTensor4dDescriptorEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(h), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&h, \"cudnnSetTensor4dDescriptorEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&w, \"cudnnSetTensor4dDescriptorEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nStride,\n        \"cudnnSetTensor4dDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cStride,\n        \"cudnnSetTensor4dDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hStride,\n        \"cudnnSetTensor4dDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &wStride,\n        \"cudnnSetTensor4dDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetTensor4dDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    tensorDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dataType: *mut cuda_types::cudnn8::cudnnDataType_t,\n    n: *mut ::core::ffi::c_int,\n    c: *mut ::core::ffi::c_int,\n    h: *mut ::core::ffi::c_int,\n    w: *mut ::core::ffi::c_int,\n    nStride: *mut ::core::ffi::c_int,\n    cStride: *mut ::core::ffi::c_int,\n    hStride: *mut ::core::ffi::c_int,\n    wStride: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(tensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &tensorDesc,\n        \"cudnnGetTensor4dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnGetTensor4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cudnnGetTensor4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cudnnGetTensor4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(h), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&h, \"cudnnGetTensor4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&w, \"cudnnGetTensor4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nStride, \"cudnnGetTensor4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cStride, \"cudnnGetTensor4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStride, \"cudnnGetTensor4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&wStride, \"cudnnGetTensor4dDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetTensorNdDescriptorEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    tensorDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    format: cuda_types::cudnn8::cudnnTensorFormat_t,\n    dataType: cuda_types::cudnn8::cudnnDataType_t,\n    nbDims: ::core::ffi::c_int,\n    dimA: *const ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(tensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &tensorDesc,\n        \"cudnnSetTensorNdDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(format), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&format, \"cudnnSetTensorNdDescriptorEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dataType,\n        \"cudnnSetTensorNdDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDims), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nbDims, \"cudnnSetTensorNdDescriptorEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dimA, \"cudnnSetTensorNdDescriptorEx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetTensorNdDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    tensorDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    nbDimsRequested: ::core::ffi::c_int,\n    dataType: *mut cuda_types::cudnn8::cudnnDataType_t,\n    nbDims: *mut ::core::ffi::c_int,\n    dimA: *mut ::core::ffi::c_int,\n    strideA: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(tensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &tensorDesc,\n        \"cudnnGetTensorNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDimsRequested), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nbDimsRequested,\n        \"cudnnGetTensorNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnGetTensorNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDims), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nbDims, \"cudnnGetTensorNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dimA, \"cudnnGetTensorNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideA, \"cudnnGetTensorNdDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetTensorSizeInBytes(\n    writer: &mut (impl std::io::Write + ?Sized),\n    tensorDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    size: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(tensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &tensorDesc,\n        \"cudnnGetTensorSizeInBytes\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cudnnGetTensorSizeInBytes\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyTensorDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    tensorDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(tensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &tensorDesc,\n        \"cudnnDestroyTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnInitTransformDest(\n    writer: &mut (impl std::io::Write + ?Sized),\n    transformDesc: cuda_types::cudnn8::cudnnTensorTransformDescriptor_t,\n    srcDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    destDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    destSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(transformDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transformDesc,\n        \"cudnnInitTransformDest\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcDesc, \"cudnnInitTransformDest\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(destDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&destDesc, \"cudnnInitTransformDest\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(destSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &destSizeInBytes,\n        \"cudnnInitTransformDest\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreateTensorTransformDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    transformDesc: *mut cuda_types::cudnn8::cudnnTensorTransformDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(transformDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transformDesc,\n        \"cudnnCreateTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetTensorTransformDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    transformDesc: cuda_types::cudnn8::cudnnTensorTransformDescriptor_t,\n    nbDims: u32,\n    destFormat: cuda_types::cudnn8::cudnnTensorFormat_t,\n    padBeforeA: *const i32,\n    padAfterA: *const i32,\n    foldA: *const u32,\n    direction: cuda_types::cudnn8::cudnnFoldingDirection_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(transformDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transformDesc,\n        \"cudnnSetTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDims), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nbDims,\n        \"cudnnSetTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(destFormat), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &destFormat,\n        \"cudnnSetTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(padBeforeA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &padBeforeA,\n        \"cudnnSetTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(padAfterA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &padAfterA,\n        \"cudnnSetTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(foldA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &foldA,\n        \"cudnnSetTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(direction), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &direction,\n        \"cudnnSetTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetTensorTransformDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    transformDesc: cuda_types::cudnn8::cudnnTensorTransformDescriptor_t,\n    nbDimsRequested: u32,\n    destFormat: *mut cuda_types::cudnn8::cudnnTensorFormat_t,\n    padBeforeA: *mut i32,\n    padAfterA: *mut i32,\n    foldA: *mut u32,\n    direction: *mut cuda_types::cudnn8::cudnnFoldingDirection_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(transformDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transformDesc,\n        \"cudnnGetTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDimsRequested), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nbDimsRequested,\n        \"cudnnGetTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(destFormat), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &destFormat,\n        \"cudnnGetTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(padBeforeA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &padBeforeA,\n        \"cudnnGetTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(padAfterA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &padAfterA,\n        \"cudnnGetTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(foldA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &foldA,\n        \"cudnnGetTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(direction), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &direction,\n        \"cudnnGetTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyTensorTransformDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    transformDesc: cuda_types::cudnn8::cudnnTensorTransformDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(transformDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transformDesc,\n        \"cudnnDestroyTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnTransformTensor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    alpha: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnTransformTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnTransformTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnTransformTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnTransformTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnTransformTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnTransformTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnTransformTensor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnTransformTensorEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    transDesc: cuda_types::cudnn8::cudnnTensorTransformDescriptor_t,\n    alpha: *const ::core::ffi::c_void,\n    srcDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    srcData: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    destDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    destData: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnTransformTensorEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transDesc, \"cudnnTransformTensorEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnTransformTensorEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcDesc, \"cudnnTransformTensorEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcData, \"cudnnTransformTensorEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnTransformTensorEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(destDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&destDesc, \"cudnnTransformTensorEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(destData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&destData, \"cudnnTransformTensorEx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnAddTensor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    alpha: *const ::core::ffi::c_void,\n    aDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    A: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    cDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    C: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnAddTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnAddTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(aDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&aDesc, \"cudnnAddTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cudnnAddTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnAddTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cDesc, \"cudnnAddTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cudnnAddTensor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreateOpTensorDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    opTensorDesc: *mut cuda_types::cudnn8::cudnnOpTensorDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(opTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &opTensorDesc,\n        \"cudnnCreateOpTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetOpTensorDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    opTensorDesc: cuda_types::cudnn8::cudnnOpTensorDescriptor_t,\n    opTensorOp: cuda_types::cudnn8::cudnnOpTensorOp_t,\n    opTensorCompType: cuda_types::cudnn8::cudnnDataType_t,\n    opTensorNanOpt: cuda_types::cudnn8::cudnnNanPropagation_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(opTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &opTensorDesc,\n        \"cudnnSetOpTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opTensorOp), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &opTensorOp,\n        \"cudnnSetOpTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opTensorCompType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &opTensorCompType,\n        \"cudnnSetOpTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opTensorNanOpt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &opTensorNanOpt,\n        \"cudnnSetOpTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetOpTensorDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    opTensorDesc: cuda_types::cudnn8::cudnnOpTensorDescriptor_t,\n    opTensorOp: *mut cuda_types::cudnn8::cudnnOpTensorOp_t,\n    opTensorCompType: *mut cuda_types::cudnn8::cudnnDataType_t,\n    opTensorNanOpt: *mut cuda_types::cudnn8::cudnnNanPropagation_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(opTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &opTensorDesc,\n        \"cudnnGetOpTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opTensorOp), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &opTensorOp,\n        \"cudnnGetOpTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opTensorCompType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &opTensorCompType,\n        \"cudnnGetOpTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opTensorNanOpt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &opTensorNanOpt,\n        \"cudnnGetOpTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyOpTensorDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    opTensorDesc: cuda_types::cudnn8::cudnnOpTensorDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(opTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &opTensorDesc,\n        \"cudnnDestroyOpTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnOpTensor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    opTensorDesc: cuda_types::cudnn8::cudnnOpTensorDescriptor_t,\n    alpha1: *const ::core::ffi::c_void,\n    aDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    A: *const ::core::ffi::c_void,\n    alpha2: *const ::core::ffi::c_void,\n    bDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    B: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    cDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    C: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnOpTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opTensorDesc, \"cudnnOpTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha1, \"cudnnOpTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(aDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&aDesc, \"cudnnOpTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cudnnOpTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha2, \"cudnnOpTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bDesc, \"cudnnOpTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cudnnOpTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnOpTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cDesc, \"cudnnOpTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cudnnOpTensor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreateReduceTensorDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    reduceTensorDesc: *mut cuda_types::cudnn8::cudnnReduceTensorDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(reduceTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorDesc,\n        \"cudnnCreateReduceTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetReduceTensorDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    reduceTensorDesc: cuda_types::cudnn8::cudnnReduceTensorDescriptor_t,\n    reduceTensorOp: cuda_types::cudnn8::cudnnReduceTensorOp_t,\n    reduceTensorCompType: cuda_types::cudnn8::cudnnDataType_t,\n    reduceTensorNanOpt: cuda_types::cudnn8::cudnnNanPropagation_t,\n    reduceTensorIndices: cuda_types::cudnn8::cudnnReduceTensorIndices_t,\n    reduceTensorIndicesType: cuda_types::cudnn8::cudnnIndicesType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(reduceTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorDesc,\n        \"cudnnSetReduceTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reduceTensorOp), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorOp,\n        \"cudnnSetReduceTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reduceTensorCompType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorCompType,\n        \"cudnnSetReduceTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reduceTensorNanOpt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorNanOpt,\n        \"cudnnSetReduceTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reduceTensorIndices), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorIndices,\n        \"cudnnSetReduceTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reduceTensorIndicesType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorIndicesType,\n        \"cudnnSetReduceTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetReduceTensorDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    reduceTensorDesc: cuda_types::cudnn8::cudnnReduceTensorDescriptor_t,\n    reduceTensorOp: *mut cuda_types::cudnn8::cudnnReduceTensorOp_t,\n    reduceTensorCompType: *mut cuda_types::cudnn8::cudnnDataType_t,\n    reduceTensorNanOpt: *mut cuda_types::cudnn8::cudnnNanPropagation_t,\n    reduceTensorIndices: *mut cuda_types::cudnn8::cudnnReduceTensorIndices_t,\n    reduceTensorIndicesType: *mut cuda_types::cudnn8::cudnnIndicesType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(reduceTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorDesc,\n        \"cudnnGetReduceTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reduceTensorOp), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorOp,\n        \"cudnnGetReduceTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reduceTensorCompType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorCompType,\n        \"cudnnGetReduceTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reduceTensorNanOpt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorNanOpt,\n        \"cudnnGetReduceTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reduceTensorIndices), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorIndices,\n        \"cudnnGetReduceTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reduceTensorIndicesType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorIndicesType,\n        \"cudnnGetReduceTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyReduceTensorDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    reduceTensorDesc: cuda_types::cudnn8::cudnnReduceTensorDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(reduceTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorDesc,\n        \"cudnnDestroyReduceTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetReductionIndicesSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    reduceTensorDesc: cuda_types::cudnn8::cudnnReduceTensorDescriptor_t,\n    aDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    cDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    sizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnGetReductionIndicesSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reduceTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorDesc,\n        \"cudnnGetReductionIndicesSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(aDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&aDesc, \"cudnnGetReductionIndicesSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cDesc, \"cudnnGetReductionIndicesSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnGetReductionIndicesSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetReductionWorkspaceSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    reduceTensorDesc: cuda_types::cudnn8::cudnnReduceTensorDescriptor_t,\n    aDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    cDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    sizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetReductionWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reduceTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorDesc,\n        \"cudnnGetReductionWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(aDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &aDesc,\n        \"cudnnGetReductionWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cDesc,\n        \"cudnnGetReductionWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnGetReductionWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnReduceTensor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    reduceTensorDesc: cuda_types::cudnn8::cudnnReduceTensorDescriptor_t,\n    indices: *mut ::core::ffi::c_void,\n    indicesSizeInBytes: usize,\n    workspace: *mut ::core::ffi::c_void,\n    workspaceSizeInBytes: usize,\n    alpha: *const ::core::ffi::c_void,\n    aDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    A: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    cDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    C: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnReduceTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reduceTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&reduceTensorDesc, \"cudnnReduceTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(indices), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&indices, \"cudnnReduceTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(indicesSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &indicesSizeInBytes,\n        \"cudnnReduceTensor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workspace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workspace, \"cudnnReduceTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workspaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workspaceSizeInBytes,\n        \"cudnnReduceTensor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnReduceTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(aDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&aDesc, \"cudnnReduceTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cudnnReduceTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnReduceTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cDesc, \"cudnnReduceTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cudnnReduceTensor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetTensor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n    valuePtr: *const ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnSetTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnSetTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnSetTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valuePtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valuePtr, \"cudnnSetTensor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnScaleTensor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n    alpha: *const ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnScaleTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnScaleTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnScaleTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnScaleTensor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreateFilterDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    filterDesc: *mut cuda_types::cudnn8::cudnnFilterDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(filterDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDesc,\n        \"cudnnCreateFilterDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetFilter4dDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    filterDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    dataType: cuda_types::cudnn8::cudnnDataType_t,\n    format: cuda_types::cudnn8::cudnnTensorFormat_t,\n    k: ::core::ffi::c_int,\n    c: ::core::ffi::c_int,\n    h: ::core::ffi::c_int,\n    w: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(filterDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDesc,\n        \"cudnnSetFilter4dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnSetFilter4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(format), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&format, \"cudnnSetFilter4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cudnnSetFilter4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cudnnSetFilter4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(h), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&h, \"cudnnSetFilter4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&w, \"cudnnSetFilter4dDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetFilter4dDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    filterDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    dataType: *mut cuda_types::cudnn8::cudnnDataType_t,\n    format: *mut cuda_types::cudnn8::cudnnTensorFormat_t,\n    k: *mut ::core::ffi::c_int,\n    c: *mut ::core::ffi::c_int,\n    h: *mut ::core::ffi::c_int,\n    w: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(filterDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDesc,\n        \"cudnnGetFilter4dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnGetFilter4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(format), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&format, \"cudnnGetFilter4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cudnnGetFilter4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cudnnGetFilter4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(h), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&h, \"cudnnGetFilter4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&w, \"cudnnGetFilter4dDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetFilterNdDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    filterDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    dataType: cuda_types::cudnn8::cudnnDataType_t,\n    format: cuda_types::cudnn8::cudnnTensorFormat_t,\n    nbDims: ::core::ffi::c_int,\n    filterDimA: *const ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(filterDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDesc,\n        \"cudnnSetFilterNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnSetFilterNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(format), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&format, \"cudnnSetFilterNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDims), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nbDims, \"cudnnSetFilterNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(filterDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDimA,\n        \"cudnnSetFilterNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetFilterNdDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    filterDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    nbDimsRequested: ::core::ffi::c_int,\n    dataType: *mut cuda_types::cudnn8::cudnnDataType_t,\n    format: *mut cuda_types::cudnn8::cudnnTensorFormat_t,\n    nbDims: *mut ::core::ffi::c_int,\n    filterDimA: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(filterDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDesc,\n        \"cudnnGetFilterNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDimsRequested), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nbDimsRequested,\n        \"cudnnGetFilterNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnGetFilterNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(format), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&format, \"cudnnGetFilterNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDims), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nbDims, \"cudnnGetFilterNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(filterDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDimA,\n        \"cudnnGetFilterNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetFilterSizeInBytes(\n    writer: &mut (impl std::io::Write + ?Sized),\n    filterDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    size: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(filterDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDesc,\n        \"cudnnGetFilterSizeInBytes\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cudnnGetFilterSizeInBytes\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnTransformFilter(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    transDesc: cuda_types::cudnn8::cudnnTensorTransformDescriptor_t,\n    alpha: *const ::core::ffi::c_void,\n    srcDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    srcData: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    destDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    destData: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnTransformFilter\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transDesc, \"cudnnTransformFilter\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnTransformFilter\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcDesc, \"cudnnTransformFilter\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcData, \"cudnnTransformFilter\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnTransformFilter\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(destDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&destDesc, \"cudnnTransformFilter\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(destData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&destData, \"cudnnTransformFilter\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyFilterDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    filterDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(filterDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDesc,\n        \"cudnnDestroyFilterDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSoftmaxForward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    algo: cuda_types::cudnn8::cudnnSoftmaxAlgorithm_t,\n    mode: cuda_types::cudnn8::cudnnSoftmaxMode_t,\n    alpha: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnSoftmaxForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cudnnSoftmaxForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cudnnSoftmaxForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnSoftmaxForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnSoftmaxForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnSoftmaxForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnSoftmaxForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnSoftmaxForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnSoftmaxForward\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreatePoolingDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    poolingDesc: *mut cuda_types::cudnn8::cudnnPoolingDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(poolingDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &poolingDesc,\n        \"cudnnCreatePoolingDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetPooling2dDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    poolingDesc: cuda_types::cudnn8::cudnnPoolingDescriptor_t,\n    mode: cuda_types::cudnn8::cudnnPoolingMode_t,\n    maxpoolingNanOpt: cuda_types::cudnn8::cudnnNanPropagation_t,\n    windowHeight: ::core::ffi::c_int,\n    windowWidth: ::core::ffi::c_int,\n    verticalPadding: ::core::ffi::c_int,\n    horizontalPadding: ::core::ffi::c_int,\n    verticalStride: ::core::ffi::c_int,\n    horizontalStride: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(poolingDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &poolingDesc,\n        \"cudnnSetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cudnnSetPooling2dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxpoolingNanOpt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxpoolingNanOpt,\n        \"cudnnSetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(windowHeight), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &windowHeight,\n        \"cudnnSetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(windowWidth), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &windowWidth,\n        \"cudnnSetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(verticalPadding), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &verticalPadding,\n        \"cudnnSetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(horizontalPadding), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &horizontalPadding,\n        \"cudnnSetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(verticalStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &verticalStride,\n        \"cudnnSetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(horizontalStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &horizontalStride,\n        \"cudnnSetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetPooling2dDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    poolingDesc: cuda_types::cudnn8::cudnnPoolingDescriptor_t,\n    mode: *mut cuda_types::cudnn8::cudnnPoolingMode_t,\n    maxpoolingNanOpt: *mut cuda_types::cudnn8::cudnnNanPropagation_t,\n    windowHeight: *mut ::core::ffi::c_int,\n    windowWidth: *mut ::core::ffi::c_int,\n    verticalPadding: *mut ::core::ffi::c_int,\n    horizontalPadding: *mut ::core::ffi::c_int,\n    verticalStride: *mut ::core::ffi::c_int,\n    horizontalStride: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(poolingDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &poolingDesc,\n        \"cudnnGetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cudnnGetPooling2dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxpoolingNanOpt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxpoolingNanOpt,\n        \"cudnnGetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(windowHeight), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &windowHeight,\n        \"cudnnGetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(windowWidth), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &windowWidth,\n        \"cudnnGetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(verticalPadding), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &verticalPadding,\n        \"cudnnGetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(horizontalPadding), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &horizontalPadding,\n        \"cudnnGetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(verticalStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &verticalStride,\n        \"cudnnGetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(horizontalStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &horizontalStride,\n        \"cudnnGetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetPoolingNdDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    poolingDesc: cuda_types::cudnn8::cudnnPoolingDescriptor_t,\n    mode: cuda_types::cudnn8::cudnnPoolingMode_t,\n    maxpoolingNanOpt: cuda_types::cudnn8::cudnnNanPropagation_t,\n    nbDims: ::core::ffi::c_int,\n    windowDimA: *const ::core::ffi::c_int,\n    paddingA: *const ::core::ffi::c_int,\n    strideA: *const ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(poolingDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &poolingDesc,\n        \"cudnnSetPoolingNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cudnnSetPoolingNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxpoolingNanOpt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxpoolingNanOpt,\n        \"cudnnSetPoolingNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDims), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nbDims, \"cudnnSetPoolingNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(windowDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &windowDimA,\n        \"cudnnSetPoolingNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paddingA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paddingA,\n        \"cudnnSetPoolingNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideA, \"cudnnSetPoolingNdDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetPoolingNdDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    poolingDesc: cuda_types::cudnn8::cudnnPoolingDescriptor_t,\n    nbDimsRequested: ::core::ffi::c_int,\n    mode: *mut cuda_types::cudnn8::cudnnPoolingMode_t,\n    maxpoolingNanOpt: *mut cuda_types::cudnn8::cudnnNanPropagation_t,\n    nbDims: *mut ::core::ffi::c_int,\n    windowDimA: *mut ::core::ffi::c_int,\n    paddingA: *mut ::core::ffi::c_int,\n    strideA: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(poolingDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &poolingDesc,\n        \"cudnnGetPoolingNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDimsRequested), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nbDimsRequested,\n        \"cudnnGetPoolingNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cudnnGetPoolingNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxpoolingNanOpt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxpoolingNanOpt,\n        \"cudnnGetPoolingNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDims), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nbDims, \"cudnnGetPoolingNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(windowDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &windowDimA,\n        \"cudnnGetPoolingNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paddingA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paddingA,\n        \"cudnnGetPoolingNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideA, \"cudnnGetPoolingNdDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetPoolingNdForwardOutputDim(\n    writer: &mut (impl std::io::Write + ?Sized),\n    poolingDesc: cuda_types::cudnn8::cudnnPoolingDescriptor_t,\n    inputTensorDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    nbDims: ::core::ffi::c_int,\n    outputTensorDimA: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(poolingDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &poolingDesc,\n        \"cudnnGetPoolingNdForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inputTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &inputTensorDesc,\n        \"cudnnGetPoolingNdForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDims), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nbDims,\n        \"cudnnGetPoolingNdForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(outputTensorDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &outputTensorDimA,\n        \"cudnnGetPoolingNdForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetPooling2dForwardOutputDim(\n    writer: &mut (impl std::io::Write + ?Sized),\n    poolingDesc: cuda_types::cudnn8::cudnnPoolingDescriptor_t,\n    inputTensorDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    n: *mut ::core::ffi::c_int,\n    c: *mut ::core::ffi::c_int,\n    h: *mut ::core::ffi::c_int,\n    w: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(poolingDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &poolingDesc,\n        \"cudnnGetPooling2dForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inputTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &inputTensorDesc,\n        \"cudnnGetPooling2dForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cudnnGetPooling2dForwardOutputDim\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cudnnGetPooling2dForwardOutputDim\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(h), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&h, \"cudnnGetPooling2dForwardOutputDim\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&w, \"cudnnGetPooling2dForwardOutputDim\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyPoolingDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    poolingDesc: cuda_types::cudnn8::cudnnPoolingDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(poolingDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &poolingDesc,\n        \"cudnnDestroyPoolingDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnPoolingForward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    poolingDesc: cuda_types::cudnn8::cudnnPoolingDescriptor_t,\n    alpha: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnPoolingForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(poolingDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&poolingDesc, \"cudnnPoolingForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnPoolingForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnPoolingForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnPoolingForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnPoolingForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnPoolingForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnPoolingForward\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreateActivationDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    activationDesc: *mut cuda_types::cudnn8::cudnnActivationDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnCreateActivationDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetActivationDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n    mode: cuda_types::cudnn8::cudnnActivationMode_t,\n    reluNanOpt: cuda_types::cudnn8::cudnnNanPropagation_t,\n    coef: f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnSetActivationDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cudnnSetActivationDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reluNanOpt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reluNanOpt,\n        \"cudnnSetActivationDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(coef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&coef, \"cudnnSetActivationDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetActivationDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n    mode: *mut cuda_types::cudnn8::cudnnActivationMode_t,\n    reluNanOpt: *mut cuda_types::cudnn8::cudnnNanPropagation_t,\n    coef: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnGetActivationDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cudnnGetActivationDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reluNanOpt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reluNanOpt,\n        \"cudnnGetActivationDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(coef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&coef, \"cudnnGetActivationDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetActivationDescriptorSwishBeta(\n    writer: &mut (impl std::io::Write + ?Sized),\n    activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n    swish_beta: f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnSetActivationDescriptorSwishBeta\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(swish_beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &swish_beta,\n        \"cudnnSetActivationDescriptorSwishBeta\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetActivationDescriptorSwishBeta(\n    writer: &mut (impl std::io::Write + ?Sized),\n    activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n    swish_beta: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnGetActivationDescriptorSwishBeta\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(swish_beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &swish_beta,\n        \"cudnnGetActivationDescriptorSwishBeta\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyActivationDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnDestroyActivationDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnActivationForward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n    alpha: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnActivationForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnActivationForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnActivationForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnActivationForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnActivationForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnActivationForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnActivationForward\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreateLRNDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    normDesc: *mut cuda_types::cudnn8::cudnnLRNDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(normDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&normDesc, \"cudnnCreateLRNDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetLRNDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    normDesc: cuda_types::cudnn8::cudnnLRNDescriptor_t,\n    lrnN: ::core::ffi::c_uint,\n    lrnAlpha: f64,\n    lrnBeta: f64,\n    lrnK: f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(normDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&normDesc, \"cudnnSetLRNDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lrnN), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lrnN, \"cudnnSetLRNDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lrnAlpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lrnAlpha, \"cudnnSetLRNDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lrnBeta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lrnBeta, \"cudnnSetLRNDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lrnK), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lrnK, \"cudnnSetLRNDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetLRNDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    normDesc: cuda_types::cudnn8::cudnnLRNDescriptor_t,\n    lrnN: *mut ::core::ffi::c_uint,\n    lrnAlpha: *mut f64,\n    lrnBeta: *mut f64,\n    lrnK: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(normDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&normDesc, \"cudnnGetLRNDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lrnN), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lrnN, \"cudnnGetLRNDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lrnAlpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lrnAlpha, \"cudnnGetLRNDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lrnBeta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lrnBeta, \"cudnnGetLRNDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lrnK), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lrnK, \"cudnnGetLRNDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyLRNDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    lrnDesc: cuda_types::cudnn8::cudnnLRNDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(lrnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lrnDesc, \"cudnnDestroyLRNDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnLRNCrossChannelForward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    normDesc: cuda_types::cudnn8::cudnnLRNDescriptor_t,\n    lrnMode: cuda_types::cudnn8::cudnnLRNMode_t,\n    alpha: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnLRNCrossChannelForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normDesc,\n        \"cudnnLRNCrossChannelForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lrnMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lrnMode, \"cudnnLRNCrossChannelForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnLRNCrossChannelForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnLRNCrossChannelForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnLRNCrossChannelForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnLRNCrossChannelForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnLRNCrossChannelForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnLRNCrossChannelForward\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDivisiveNormalizationForward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    normDesc: cuda_types::cudnn8::cudnnLRNDescriptor_t,\n    mode: cuda_types::cudnn8::cudnnDivNormMode_t,\n    alpha: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    means: *const ::core::ffi::c_void,\n    temp: *mut ::core::ffi::c_void,\n    temp2: *mut ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnDivisiveNormalizationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normDesc,\n        \"cudnnDivisiveNormalizationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnDivisiveNormalizationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha,\n        \"cudnnDivisiveNormalizationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnDivisiveNormalizationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnDivisiveNormalizationForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(means), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &means,\n        \"cudnnDivisiveNormalizationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(temp), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &temp,\n        \"cudnnDivisiveNormalizationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(temp2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &temp2,\n        \"cudnnDivisiveNormalizationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &beta,\n        \"cudnnDivisiveNormalizationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnDivisiveNormalizationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnDivisiveNormalizationForward\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDeriveBNTensorDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    derivedBnDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    mode: cuda_types::cudnn8::cudnnBatchNormMode_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(derivedBnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &derivedBnDesc,\n        \"cudnnDeriveBNTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnDeriveBNTensorDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cudnnDeriveBNTensorDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnBatchNormalizationForwardInference(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    mode: cuda_types::cudnn8::cudnnBatchNormMode_t,\n    alpha: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n    bnScaleBiasMeanVarDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    bnScale: *const ::core::ffi::c_void,\n    bnBias: *const ::core::ffi::c_void,\n    estimatedMean: *const ::core::ffi::c_void,\n    estimatedVariance: *const ::core::ffi::c_void,\n    epsilon: f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnBatchNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnBatchNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha,\n        \"cudnnBatchNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &beta,\n        \"cudnnBatchNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnBatchNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cudnnBatchNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnBatchNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &y,\n        \"cudnnBatchNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnScaleBiasMeanVarDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnScaleBiasMeanVarDesc,\n        \"cudnnBatchNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnScale), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnScale,\n        \"cudnnBatchNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnBias), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnBias,\n        \"cudnnBatchNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(estimatedMean), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &estimatedMean,\n        \"cudnnBatchNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(estimatedVariance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &estimatedVariance,\n        \"cudnnBatchNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(epsilon), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &epsilon,\n        \"cudnnBatchNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDeriveNormTensorDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    derivedNormScaleBiasDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    derivedNormMeanVarDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    mode: cuda_types::cudnn8::cudnnNormMode_t,\n    groupCnt: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(derivedNormScaleBiasDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &derivedNormScaleBiasDesc,\n        \"cudnnDeriveNormTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(derivedNormMeanVarDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &derivedNormMeanVarDesc,\n        \"cudnnDeriveNormTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnDeriveNormTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnDeriveNormTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(groupCnt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &groupCnt,\n        \"cudnnDeriveNormTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnNormalizationForwardInference(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    mode: cuda_types::cudnn8::cudnnNormMode_t,\n    normOps: cuda_types::cudnn8::cudnnNormOps_t,\n    algo: cuda_types::cudnn8::cudnnNormAlgo_t,\n    alpha: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    normScaleBiasDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    normScale: *const ::core::ffi::c_void,\n    normBias: *const ::core::ffi::c_void,\n    normMeanVarDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    estimatedMean: *const ::core::ffi::c_void,\n    estimatedVariance: *const ::core::ffi::c_void,\n    zDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    z: *const ::core::ffi::c_void,\n    activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n    epsilon: f64,\n    groupCnt: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normOps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normOps,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &beta,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normScaleBiasDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normScaleBiasDesc,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normScale), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normScale,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normBias), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normBias,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normMeanVarDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normMeanVarDesc,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(estimatedMean), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &estimatedMean,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(estimatedVariance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &estimatedVariance,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(zDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &zDesc,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(z), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &z,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &y,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(epsilon), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &epsilon,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(groupCnt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &groupCnt,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreateSpatialTransformerDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    stDesc: *mut cuda_types::cudnn8::cudnnSpatialTransformerDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(stDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stDesc,\n        \"cudnnCreateSpatialTransformerDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetSpatialTransformerNdDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    stDesc: cuda_types::cudnn8::cudnnSpatialTransformerDescriptor_t,\n    samplerType: cuda_types::cudnn8::cudnnSamplerType_t,\n    dataType: cuda_types::cudnn8::cudnnDataType_t,\n    nbDims: ::core::ffi::c_int,\n    dimA: *const ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(stDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stDesc,\n        \"cudnnSetSpatialTransformerNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(samplerType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &samplerType,\n        \"cudnnSetSpatialTransformerNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dataType,\n        \"cudnnSetSpatialTransformerNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDims), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nbDims,\n        \"cudnnSetSpatialTransformerNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dimA,\n        \"cudnnSetSpatialTransformerNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroySpatialTransformerDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    stDesc: cuda_types::cudnn8::cudnnSpatialTransformerDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(stDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stDesc,\n        \"cudnnDestroySpatialTransformerDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSpatialTfGridGeneratorForward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    stDesc: cuda_types::cudnn8::cudnnSpatialTransformerDescriptor_t,\n    theta: *const ::core::ffi::c_void,\n    grid: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnSpatialTfGridGeneratorForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stDesc,\n        \"cudnnSpatialTfGridGeneratorForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(theta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &theta,\n        \"cudnnSpatialTfGridGeneratorForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(grid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &grid,\n        \"cudnnSpatialTfGridGeneratorForward\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSpatialTfSamplerForward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    stDesc: cuda_types::cudnn8::cudnnSpatialTransformerDescriptor_t,\n    alpha: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    grid: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnSpatialTfSamplerForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stDesc, \"cudnnSpatialTfSamplerForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnSpatialTfSamplerForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnSpatialTfSamplerForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnSpatialTfSamplerForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(grid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&grid, \"cudnnSpatialTfSamplerForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnSpatialTfSamplerForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnSpatialTfSamplerForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnSpatialTfSamplerForward\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreateDropoutDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dropoutDesc: *mut cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dropoutDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dropoutDesc,\n        \"cudnnCreateDropoutDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyDropoutDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dropoutDesc: cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dropoutDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dropoutDesc,\n        \"cudnnDestroyDropoutDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDropoutGetStatesSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    sizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnDropoutGetStatesSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnDropoutGetStatesSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDropoutGetReserveSpaceSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    xdesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    sizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(xdesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xdesc,\n        \"cudnnDropoutGetReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnDropoutGetReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetDropoutDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dropoutDesc: cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    dropout: f32,\n    states: *mut ::core::ffi::c_void,\n    stateSizeInBytes: usize,\n    seed: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dropoutDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dropoutDesc,\n        \"cudnnSetDropoutDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnSetDropoutDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dropout), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dropout, \"cudnnSetDropoutDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(states), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&states, \"cudnnSetDropoutDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stateSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stateSizeInBytes,\n        \"cudnnSetDropoutDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&seed, \"cudnnSetDropoutDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnRestoreDropoutDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dropoutDesc: cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    dropout: f32,\n    states: *mut ::core::ffi::c_void,\n    stateSizeInBytes: usize,\n    seed: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dropoutDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dropoutDesc,\n        \"cudnnRestoreDropoutDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnRestoreDropoutDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dropout), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dropout,\n        \"cudnnRestoreDropoutDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(states), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &states,\n        \"cudnnRestoreDropoutDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stateSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stateSizeInBytes,\n        \"cudnnRestoreDropoutDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&seed, \"cudnnRestoreDropoutDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetDropoutDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dropoutDesc: cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    dropout: *mut f32,\n    states: *mut *mut ::core::ffi::c_void,\n    seed: *mut ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dropoutDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dropoutDesc,\n        \"cudnnGetDropoutDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnGetDropoutDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dropout), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dropout, \"cudnnGetDropoutDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(states), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&states, \"cudnnGetDropoutDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&seed, \"cudnnGetDropoutDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDropoutForward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    dropoutDesc: cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n    xdesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    ydesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n    reserveSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnDropoutForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dropoutDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dropoutDesc, \"cudnnDropoutForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xdesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xdesc, \"cudnnDropoutForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnDropoutForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ydesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ydesc, \"cudnnDropoutForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnDropoutForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&reserveSpace, \"cudnnDropoutForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnDropoutForward\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn8::cudnnAlgorithmDescriptor_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn8::cudnnAlgorithmPerformance_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn8::cudnnAlgorithmUnionStruct {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(algo), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.algo, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\npub fn write_cudnnCreateAlgorithmDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    algoDesc: *mut cuda_types::cudnn8::cudnnAlgorithmDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(algoDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algoDesc,\n        \"cudnnCreateAlgorithmDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetAlgorithmDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    algoDesc: cuda_types::cudnn8::cudnnAlgorithmDescriptor_t,\n    algorithm: cuda_types::cudnn8::cudnnAlgorithm_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(algoDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algoDesc,\n        \"cudnnSetAlgorithmDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algorithm), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algorithm,\n        \"cudnnSetAlgorithmDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetAlgorithmDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    algoDesc: cuda_types::cudnn8::cudnnAlgorithmDescriptor_t,\n    algorithm: *mut cuda_types::cudnn8::cudnnAlgorithm_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(algoDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algoDesc,\n        \"cudnnGetAlgorithmDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algorithm), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algorithm,\n        \"cudnnGetAlgorithmDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCopyAlgorithmDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    src: cuda_types::cudnn8::cudnnAlgorithmDescriptor_t,\n    dest: cuda_types::cudnn8::cudnnAlgorithmDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(src), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&src, \"cudnnCopyAlgorithmDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dest), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dest, \"cudnnCopyAlgorithmDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyAlgorithmDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    algoDesc: cuda_types::cudnn8::cudnnAlgorithmDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(algoDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algoDesc,\n        \"cudnnDestroyAlgorithmDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreateAlgorithmPerformance(\n    writer: &mut (impl std::io::Write + ?Sized),\n    algoPerf: *mut cuda_types::cudnn8::cudnnAlgorithmPerformance_t,\n    numberToCreate: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(algoPerf), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algoPerf,\n        \"cudnnCreateAlgorithmPerformance\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numberToCreate), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numberToCreate,\n        \"cudnnCreateAlgorithmPerformance\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetAlgorithmPerformance(\n    writer: &mut (impl std::io::Write + ?Sized),\n    algoPerf: cuda_types::cudnn8::cudnnAlgorithmPerformance_t,\n    algoDesc: cuda_types::cudnn8::cudnnAlgorithmDescriptor_t,\n    status: cuda_types::cudnn8::cudnnStatus_t,\n    time: f32,\n    memory: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(algoPerf), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algoPerf,\n        \"cudnnSetAlgorithmPerformance\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algoDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algoDesc,\n        \"cudnnSetAlgorithmPerformance\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(status), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&status, \"cudnnSetAlgorithmPerformance\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(time), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&time, \"cudnnSetAlgorithmPerformance\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(memory), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&memory, \"cudnnSetAlgorithmPerformance\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetAlgorithmPerformance(\n    writer: &mut (impl std::io::Write + ?Sized),\n    algoPerf: cuda_types::cudnn8::cudnnAlgorithmPerformance_t,\n    algoDesc: *mut cuda_types::cudnn8::cudnnAlgorithmDescriptor_t,\n    status: *mut cuda_types::cudnn8::cudnnStatus_t,\n    time: *mut f32,\n    memory: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(algoPerf), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algoPerf,\n        \"cudnnGetAlgorithmPerformance\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algoDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algoDesc,\n        \"cudnnGetAlgorithmPerformance\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(status), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&status, \"cudnnGetAlgorithmPerformance\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(time), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&time, \"cudnnGetAlgorithmPerformance\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(memory), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&memory, \"cudnnGetAlgorithmPerformance\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyAlgorithmPerformance(\n    writer: &mut (impl std::io::Write + ?Sized),\n    algoPerf: *mut cuda_types::cudnn8::cudnnAlgorithmPerformance_t,\n    numberToDestroy: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(algoPerf), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algoPerf,\n        \"cudnnDestroyAlgorithmPerformance\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numberToDestroy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numberToDestroy,\n        \"cudnnDestroyAlgorithmPerformance\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetAlgorithmSpaceSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    algoDesc: cuda_types::cudnn8::cudnnAlgorithmDescriptor_t,\n    algoSpaceSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnGetAlgorithmSpaceSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algoDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algoDesc, \"cudnnGetAlgorithmSpaceSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algoSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algoSpaceSizeInBytes,\n        \"cudnnGetAlgorithmSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSaveAlgorithm(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    algoDesc: cuda_types::cudnn8::cudnnAlgorithmDescriptor_t,\n    algoSpace: *mut ::core::ffi::c_void,\n    algoSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnSaveAlgorithm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algoDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algoDesc, \"cudnnSaveAlgorithm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algoSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algoSpace, \"cudnnSaveAlgorithm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algoSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algoSpaceSizeInBytes,\n        \"cudnnSaveAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnRestoreAlgorithm(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    algoSpace: *mut ::core::ffi::c_void,\n    algoSpaceSizeInBytes: usize,\n    algoDesc: cuda_types::cudnn8::cudnnAlgorithmDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnRestoreAlgorithm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algoSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algoSpace, \"cudnnRestoreAlgorithm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algoSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algoSpaceSizeInBytes,\n        \"cudnnRestoreAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algoDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algoDesc, \"cudnnRestoreAlgorithm\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn8::cudnnDebugStruct {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(cudnn_version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.cudnn_version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(cudnnStatus), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.cudnnStatus, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(time_sec), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.time_sec, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(time_usec), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.time_usec, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(time_delta), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.time_delta, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(handle), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.handle, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(stream), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.stream, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(pid), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.pid, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(tid), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.tid, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(cudaDeviceId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.cudaDeviceId, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn8::cudnnCallback_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(\n            writer,\n            \"{:p}\",\n            unsafe {\n                std::mem::transmute::<\n                    cuda_types::cudnn8::cudnnCallback_t,\n                    *mut ::std::ffi::c_void,\n                >(*self)\n            },\n        )\n    }\n}\npub fn write_cudnnSetCallback(\n    writer: &mut (impl std::io::Write + ?Sized),\n    mask: ::core::ffi::c_uint,\n    udata: *mut ::core::ffi::c_void,\n    fptr: cuda_types::cudnn8::cudnnCallback_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(mask), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mask, \"cudnnSetCallback\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(udata), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&udata, \"cudnnSetCallback\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fptr, \"cudnnSetCallback\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetCallback(\n    writer: &mut (impl std::io::Write + ?Sized),\n    mask: *mut ::core::ffi::c_uint,\n    udata: *mut *mut ::core::ffi::c_void,\n    fptr: *mut cuda_types::cudnn8::cudnnCallback_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(mask), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mask, \"cudnnGetCallback\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(udata), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&udata, \"cudnnGetCallback\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fptr, \"cudnnGetCallback\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnOpsInferVersionCheck(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_cudnnSoftmaxBackward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    algo: cuda_types::cudnn8::cudnnSoftmaxAlgorithm_t,\n    mode: cuda_types::cudnn8::cudnnSoftmaxMode_t,\n    alpha: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *const ::core::ffi::c_void,\n    dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dy: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    dxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dx: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnSoftmaxBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cudnnSoftmaxBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cudnnSoftmaxBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnSoftmaxBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnSoftmaxBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnSoftmaxBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dyDesc, \"cudnnSoftmaxBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dy, \"cudnnSoftmaxBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnSoftmaxBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dxDesc, \"cudnnSoftmaxBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dx, \"cudnnSoftmaxBackward\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnPoolingBackward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    poolingDesc: cuda_types::cudnn8::cudnnPoolingDescriptor_t,\n    alpha: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *const ::core::ffi::c_void,\n    dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dy: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    dxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dx: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnPoolingBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(poolingDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&poolingDesc, \"cudnnPoolingBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnPoolingBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnPoolingBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnPoolingBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dyDesc, \"cudnnPoolingBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dy, \"cudnnPoolingBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnPoolingBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnPoolingBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnPoolingBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dxDesc, \"cudnnPoolingBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dx, \"cudnnPoolingBackward\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnActivationBackward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n    alpha: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *const ::core::ffi::c_void,\n    dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dy: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    dxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dx: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnActivationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnActivationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnActivationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnActivationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnActivationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dyDesc, \"cudnnActivationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dy, \"cudnnActivationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnActivationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnActivationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnActivationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dxDesc, \"cudnnActivationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dx, \"cudnnActivationBackward\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnLRNCrossChannelBackward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    normDesc: cuda_types::cudnn8::cudnnLRNDescriptor_t,\n    lrnMode: cuda_types::cudnn8::cudnnLRNMode_t,\n    alpha: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *const ::core::ffi::c_void,\n    dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dy: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    dxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dx: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnLRNCrossChannelBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normDesc,\n        \"cudnnLRNCrossChannelBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lrnMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &lrnMode,\n        \"cudnnLRNCrossChannelBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnLRNCrossChannelBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnLRNCrossChannelBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnLRNCrossChannelBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dyDesc, \"cudnnLRNCrossChannelBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dy, \"cudnnLRNCrossChannelBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnLRNCrossChannelBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnLRNCrossChannelBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnLRNCrossChannelBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dxDesc, \"cudnnLRNCrossChannelBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dx, \"cudnnLRNCrossChannelBackward\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDivisiveNormalizationBackward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    normDesc: cuda_types::cudnn8::cudnnLRNDescriptor_t,\n    mode: cuda_types::cudnn8::cudnnDivNormMode_t,\n    alpha: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    means: *const ::core::ffi::c_void,\n    dy: *const ::core::ffi::c_void,\n    temp: *mut ::core::ffi::c_void,\n    temp2: *mut ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    dXdMeansDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dx: *mut ::core::ffi::c_void,\n    dMeans: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnDivisiveNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normDesc,\n        \"cudnnDivisiveNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnDivisiveNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha,\n        \"cudnnDivisiveNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnDivisiveNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cudnnDivisiveNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(means), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &means,\n        \"cudnnDivisiveNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dy,\n        \"cudnnDivisiveNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(temp), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &temp,\n        \"cudnnDivisiveNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(temp2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &temp2,\n        \"cudnnDivisiveNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &beta,\n        \"cudnnDivisiveNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dXdMeansDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dXdMeansDesc,\n        \"cudnnDivisiveNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dx,\n        \"cudnnDivisiveNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dMeans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dMeans,\n        \"cudnnDivisiveNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetBatchNormalizationForwardTrainingExWorkspaceSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    mode: cuda_types::cudnn8::cudnnBatchNormMode_t,\n    bnOps: cuda_types::cudnn8::cudnnBatchNormOps_t,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    zDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    bnScaleBiasMeanVarDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n    sizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetBatchNormalizationForwardTrainingExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnGetBatchNormalizationForwardTrainingExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnOps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnOps,\n        \"cudnnGetBatchNormalizationForwardTrainingExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnGetBatchNormalizationForwardTrainingExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(zDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &zDesc,\n        \"cudnnGetBatchNormalizationForwardTrainingExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnGetBatchNormalizationForwardTrainingExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnScaleBiasMeanVarDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnScaleBiasMeanVarDesc,\n        \"cudnnGetBatchNormalizationForwardTrainingExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnGetBatchNormalizationForwardTrainingExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnGetBatchNormalizationForwardTrainingExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetBatchNormalizationBackwardExWorkspaceSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    mode: cuda_types::cudnn8::cudnnBatchNormMode_t,\n    bnOps: cuda_types::cudnn8::cudnnBatchNormOps_t,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dzDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dBnScaleBiasDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n    sizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetBatchNormalizationBackwardExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnGetBatchNormalizationBackwardExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnOps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnOps,\n        \"cudnnGetBatchNormalizationBackwardExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnGetBatchNormalizationBackwardExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnGetBatchNormalizationBackwardExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dyDesc,\n        \"cudnnGetBatchNormalizationBackwardExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dzDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dzDesc,\n        \"cudnnGetBatchNormalizationBackwardExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dxDesc,\n        \"cudnnGetBatchNormalizationBackwardExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dBnScaleBiasDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dBnScaleBiasDesc,\n        \"cudnnGetBatchNormalizationBackwardExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnGetBatchNormalizationBackwardExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnGetBatchNormalizationBackwardExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetBatchNormalizationTrainingExReserveSpaceSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    mode: cuda_types::cudnn8::cudnnBatchNormMode_t,\n    bnOps: cuda_types::cudnn8::cudnnBatchNormOps_t,\n    activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    sizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetBatchNormalizationTrainingExReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnGetBatchNormalizationTrainingExReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnOps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnOps,\n        \"cudnnGetBatchNormalizationTrainingExReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnGetBatchNormalizationTrainingExReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnGetBatchNormalizationTrainingExReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnGetBatchNormalizationTrainingExReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnBatchNormalizationForwardTraining(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    mode: cuda_types::cudnn8::cudnnBatchNormMode_t,\n    alpha: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n    bnScaleBiasMeanVarDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    bnScale: *const ::core::ffi::c_void,\n    bnBias: *const ::core::ffi::c_void,\n    exponentialAverageFactor: f64,\n    resultRunningMean: *mut ::core::ffi::c_void,\n    resultRunningVariance: *mut ::core::ffi::c_void,\n    epsilon: f64,\n    resultSaveMean: *mut ::core::ffi::c_void,\n    resultSaveInvVariance: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &beta,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &y,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnScaleBiasMeanVarDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnScaleBiasMeanVarDesc,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnScale), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnScale,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnBias), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnBias,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(exponentialAverageFactor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &exponentialAverageFactor,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultRunningMean), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resultRunningMean,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultRunningVariance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resultRunningVariance,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(epsilon), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &epsilon,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultSaveMean), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resultSaveMean,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultSaveInvVariance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resultSaveInvVariance,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnBatchNormalizationForwardTrainingEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    mode: cuda_types::cudnn8::cudnnBatchNormMode_t,\n    bnOps: cuda_types::cudnn8::cudnnBatchNormOps_t,\n    alpha: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    xData: *const ::core::ffi::c_void,\n    zDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    zData: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    yData: *mut ::core::ffi::c_void,\n    bnScaleBiasMeanVarDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    bnScale: *const ::core::ffi::c_void,\n    bnBias: *const ::core::ffi::c_void,\n    exponentialAverageFactor: f64,\n    resultRunningMean: *mut ::core::ffi::c_void,\n    resultRunningVariance: *mut ::core::ffi::c_void,\n    epsilon: f64,\n    resultSaveMean: *mut ::core::ffi::c_void,\n    resultSaveInvVariance: *mut ::core::ffi::c_void,\n    activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n    workspace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    reserveSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnOps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnOps,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &beta,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xData,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(zDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &zDesc,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(zData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &zData,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yData,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnScaleBiasMeanVarDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnScaleBiasMeanVarDesc,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnScale), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnScale,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnBias), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnBias,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(exponentialAverageFactor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &exponentialAverageFactor,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultRunningMean), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resultRunningMean,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultRunningVariance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resultRunningVariance,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(epsilon), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &epsilon,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultSaveMean), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resultSaveMean,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultSaveInvVariance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resultSaveInvVariance,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workspace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workspace,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpace,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnBatchNormalizationBackward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    mode: cuda_types::cudnn8::cudnnBatchNormMode_t,\n    alphaDataDiff: *const ::core::ffi::c_void,\n    betaDataDiff: *const ::core::ffi::c_void,\n    alphaParamDiff: *const ::core::ffi::c_void,\n    betaParamDiff: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dy: *const ::core::ffi::c_void,\n    dxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dx: *mut ::core::ffi::c_void,\n    dBnScaleBiasDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    bnScale: *const ::core::ffi::c_void,\n    dBnScaleResult: *mut ::core::ffi::c_void,\n    dBnBiasResult: *mut ::core::ffi::c_void,\n    epsilon: f64,\n    savedMean: *const ::core::ffi::c_void,\n    savedInvVariance: *const ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alphaDataDiff), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alphaDataDiff,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(betaDataDiff), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &betaDataDiff,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alphaParamDiff), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alphaParamDiff,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(betaParamDiff), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &betaParamDiff,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnBatchNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dyDesc,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dy, \"cudnnBatchNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dxDesc,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dx, \"cudnnBatchNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dBnScaleBiasDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dBnScaleBiasDesc,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnScale), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnScale,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dBnScaleResult), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dBnScaleResult,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dBnBiasResult), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dBnBiasResult,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(epsilon), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &epsilon,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(savedMean), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &savedMean,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(savedInvVariance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &savedInvVariance,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnBatchNormalizationBackwardEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    mode: cuda_types::cudnn8::cudnnBatchNormMode_t,\n    bnOps: cuda_types::cudnn8::cudnnBatchNormOps_t,\n    alphaDataDiff: *const ::core::ffi::c_void,\n    betaDataDiff: *const ::core::ffi::c_void,\n    alphaParamDiff: *const ::core::ffi::c_void,\n    betaParamDiff: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    xData: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    yData: *const ::core::ffi::c_void,\n    dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dyData: *const ::core::ffi::c_void,\n    dzDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dzData: *mut ::core::ffi::c_void,\n    dxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dxData: *mut ::core::ffi::c_void,\n    dBnScaleBiasDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    bnScaleData: *const ::core::ffi::c_void,\n    bnBiasData: *const ::core::ffi::c_void,\n    dBnScaleData: *mut ::core::ffi::c_void,\n    dBnBiasData: *mut ::core::ffi::c_void,\n    epsilon: f64,\n    savedMean: *const ::core::ffi::c_void,\n    savedInvVariance: *const ::core::ffi::c_void,\n    activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n    workSpace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    reserveSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnOps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnOps,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alphaDataDiff), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alphaDataDiff,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(betaDataDiff), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &betaDataDiff,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alphaParamDiff), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alphaParamDiff,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(betaParamDiff), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &betaParamDiff,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xData,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yData,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dyDesc,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dyData,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dzDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dzDesc,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dzData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dzData,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dxDesc,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dxData,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dBnScaleBiasDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dBnScaleBiasDesc,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnScaleData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnScaleData,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnBiasData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnBiasData,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dBnScaleData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dBnScaleData,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dBnBiasData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dBnBiasData,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(epsilon), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &epsilon,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(savedMean), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &savedMean,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(savedInvVariance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &savedInvVariance,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpace,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpace,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetNormalizationForwardTrainingWorkspaceSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    mode: cuda_types::cudnn8::cudnnNormMode_t,\n    normOps: cuda_types::cudnn8::cudnnNormOps_t,\n    algo: cuda_types::cudnn8::cudnnNormAlgo_t,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    zDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    normScaleBiasDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n    normMeanVarDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    sizeInBytes: *mut usize,\n    groupCnt: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetNormalizationForwardTrainingWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnGetNormalizationForwardTrainingWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normOps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normOps,\n        \"cudnnGetNormalizationForwardTrainingWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cudnnGetNormalizationForwardTrainingWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnGetNormalizationForwardTrainingWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(zDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &zDesc,\n        \"cudnnGetNormalizationForwardTrainingWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnGetNormalizationForwardTrainingWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normScaleBiasDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normScaleBiasDesc,\n        \"cudnnGetNormalizationForwardTrainingWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnGetNormalizationForwardTrainingWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normMeanVarDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normMeanVarDesc,\n        \"cudnnGetNormalizationForwardTrainingWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnGetNormalizationForwardTrainingWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(groupCnt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &groupCnt,\n        \"cudnnGetNormalizationForwardTrainingWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetNormalizationBackwardWorkspaceSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    mode: cuda_types::cudnn8::cudnnNormMode_t,\n    normOps: cuda_types::cudnn8::cudnnNormOps_t,\n    algo: cuda_types::cudnn8::cudnnNormAlgo_t,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dzDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dNormScaleBiasDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n    normMeanVarDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    sizeInBytes: *mut usize,\n    groupCnt: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetNormalizationBackwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnGetNormalizationBackwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normOps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normOps,\n        \"cudnnGetNormalizationBackwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cudnnGetNormalizationBackwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnGetNormalizationBackwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnGetNormalizationBackwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dyDesc,\n        \"cudnnGetNormalizationBackwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dzDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dzDesc,\n        \"cudnnGetNormalizationBackwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dxDesc,\n        \"cudnnGetNormalizationBackwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dNormScaleBiasDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dNormScaleBiasDesc,\n        \"cudnnGetNormalizationBackwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnGetNormalizationBackwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normMeanVarDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normMeanVarDesc,\n        \"cudnnGetNormalizationBackwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnGetNormalizationBackwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(groupCnt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &groupCnt,\n        \"cudnnGetNormalizationBackwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetNormalizationTrainingReserveSpaceSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    mode: cuda_types::cudnn8::cudnnNormMode_t,\n    normOps: cuda_types::cudnn8::cudnnNormOps_t,\n    algo: cuda_types::cudnn8::cudnnNormAlgo_t,\n    activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    sizeInBytes: *mut usize,\n    groupCnt: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetNormalizationTrainingReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnGetNormalizationTrainingReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normOps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normOps,\n        \"cudnnGetNormalizationTrainingReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cudnnGetNormalizationTrainingReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnGetNormalizationTrainingReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnGetNormalizationTrainingReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnGetNormalizationTrainingReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(groupCnt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &groupCnt,\n        \"cudnnGetNormalizationTrainingReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnNormalizationForwardTraining(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    mode: cuda_types::cudnn8::cudnnNormMode_t,\n    normOps: cuda_types::cudnn8::cudnnNormOps_t,\n    algo: cuda_types::cudnn8::cudnnNormAlgo_t,\n    alpha: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    xData: *const ::core::ffi::c_void,\n    normScaleBiasDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    normScale: *const ::core::ffi::c_void,\n    normBias: *const ::core::ffi::c_void,\n    exponentialAverageFactor: f64,\n    normMeanVarDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    resultRunningMean: *mut ::core::ffi::c_void,\n    resultRunningVariance: *mut ::core::ffi::c_void,\n    epsilon: f64,\n    resultSaveMean: *mut ::core::ffi::c_void,\n    resultSaveInvVariance: *mut ::core::ffi::c_void,\n    activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n    zDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    zData: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    yData: *mut ::core::ffi::c_void,\n    workspace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    reserveSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSizeInBytes: usize,\n    groupCnt: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normOps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normOps,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &beta,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xData,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normScaleBiasDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normScaleBiasDesc,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normScale), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normScale,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normBias), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normBias,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(exponentialAverageFactor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &exponentialAverageFactor,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normMeanVarDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normMeanVarDesc,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultRunningMean), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resultRunningMean,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultRunningVariance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resultRunningVariance,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(epsilon), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &epsilon,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultSaveMean), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resultSaveMean,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultSaveInvVariance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resultSaveInvVariance,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(zDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &zDesc,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(zData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &zData,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yData,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workspace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workspace,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpace,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(groupCnt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &groupCnt,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnNormalizationBackward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    mode: cuda_types::cudnn8::cudnnNormMode_t,\n    normOps: cuda_types::cudnn8::cudnnNormOps_t,\n    algo: cuda_types::cudnn8::cudnnNormAlgo_t,\n    alphaDataDiff: *const ::core::ffi::c_void,\n    betaDataDiff: *const ::core::ffi::c_void,\n    alphaParamDiff: *const ::core::ffi::c_void,\n    betaParamDiff: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    xData: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    yData: *const ::core::ffi::c_void,\n    dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dyData: *const ::core::ffi::c_void,\n    dzDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dzData: *mut ::core::ffi::c_void,\n    dxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dxData: *mut ::core::ffi::c_void,\n    dNormScaleBiasDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    normScaleData: *const ::core::ffi::c_void,\n    normBiasData: *const ::core::ffi::c_void,\n    dNormScaleData: *mut ::core::ffi::c_void,\n    dNormBiasData: *mut ::core::ffi::c_void,\n    epsilon: f64,\n    normMeanVarDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    savedMean: *const ::core::ffi::c_void,\n    savedInvVariance: *const ::core::ffi::c_void,\n    activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n    workSpace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    reserveSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSizeInBytes: usize,\n    groupCnt: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normOps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&normOps, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alphaDataDiff), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alphaDataDiff,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(betaDataDiff), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &betaDataDiff,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alphaParamDiff), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alphaParamDiff,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(betaParamDiff), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &betaParamDiff,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xData, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yData, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dyDesc, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dyData, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dzDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dzDesc, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dzData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dzData, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dxDesc, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dxData, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dNormScaleBiasDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dNormScaleBiasDesc,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normScaleData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normScaleData,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normBiasData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normBiasData,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dNormScaleData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dNormScaleData,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dNormBiasData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dNormBiasData,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(epsilon), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&epsilon, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normMeanVarDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normMeanVarDesc,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(savedMean), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &savedMean,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(savedInvVariance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &savedInvVariance,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpace,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpace,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(groupCnt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&groupCnt, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSpatialTfGridGeneratorBackward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    stDesc: cuda_types::cudnn8::cudnnSpatialTransformerDescriptor_t,\n    dgrid: *const ::core::ffi::c_void,\n    dtheta: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnSpatialTfGridGeneratorBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stDesc,\n        \"cudnnSpatialTfGridGeneratorBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dgrid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dgrid,\n        \"cudnnSpatialTfGridGeneratorBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dtheta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dtheta,\n        \"cudnnSpatialTfGridGeneratorBackward\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSpatialTfSamplerBackward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    stDesc: cuda_types::cudnn8::cudnnSpatialTransformerDescriptor_t,\n    alpha: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    dxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dx: *mut ::core::ffi::c_void,\n    alphaDgrid: *const ::core::ffi::c_void,\n    dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dy: *const ::core::ffi::c_void,\n    grid: *const ::core::ffi::c_void,\n    betaDgrid: *const ::core::ffi::c_void,\n    dgrid: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnSpatialTfSamplerBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stDesc,\n        \"cudnnSpatialTfSamplerBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnSpatialTfSamplerBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnSpatialTfSamplerBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnSpatialTfSamplerBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnSpatialTfSamplerBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dxDesc,\n        \"cudnnSpatialTfSamplerBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dx, \"cudnnSpatialTfSamplerBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alphaDgrid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alphaDgrid,\n        \"cudnnSpatialTfSamplerBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dyDesc,\n        \"cudnnSpatialTfSamplerBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dy, \"cudnnSpatialTfSamplerBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(grid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&grid, \"cudnnSpatialTfSamplerBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(betaDgrid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &betaDgrid,\n        \"cudnnSpatialTfSamplerBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dgrid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dgrid, \"cudnnSpatialTfSamplerBackward\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDropoutBackward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    dropoutDesc: cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n    dydesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dy: *const ::core::ffi::c_void,\n    dxdesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dx: *mut ::core::ffi::c_void,\n    reserveSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnDropoutBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dropoutDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dropoutDesc, \"cudnnDropoutBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dydesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dydesc, \"cudnnDropoutBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dy, \"cudnnDropoutBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxdesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dxdesc, \"cudnnDropoutBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dx, \"cudnnDropoutBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&reserveSpace, \"cudnnDropoutBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnDropoutBackward\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnOpsTrainVersionCheck(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn8::cudnnPersistentRNNPlan_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\npub fn write_cudnnCreateRNNDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDesc: *mut cuda_types::cudnn8::cudnnRNNDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnCreateRNNDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyRNNDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnDestroyRNNDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetRNNDescriptor_v8(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    algo: cuda_types::cudnn8::cudnnRNNAlgo_t,\n    cellMode: cuda_types::cudnn8::cudnnRNNMode_t,\n    biasMode: cuda_types::cudnn8::cudnnRNNBiasMode_t,\n    dirMode: cuda_types::cudnn8::cudnnDirectionMode_t,\n    inputMode: cuda_types::cudnn8::cudnnRNNInputMode_t,\n    dataType: cuda_types::cudnn8::cudnnDataType_t,\n    mathPrec: cuda_types::cudnn8::cudnnDataType_t,\n    mathType: cuda_types::cudnn8::cudnnMathType_t,\n    inputSize: i32,\n    hiddenSize: i32,\n    projSize: i32,\n    numLayers: i32,\n    dropoutDesc: cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n    auxFlags: u32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnSetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cudnnSetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cellMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cellMode, \"cudnnSetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(biasMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&biasMode, \"cudnnSetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirMode, \"cudnnSetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inputMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&inputMode, \"cudnnSetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnSetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mathPrec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mathPrec, \"cudnnSetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mathType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mathType, \"cudnnSetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inputSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&inputSize, \"cudnnSetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hiddenSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hiddenSize, \"cudnnSetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(projSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&projSize, \"cudnnSetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numLayers), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numLayers, \"cudnnSetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dropoutDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dropoutDesc,\n        \"cudnnSetRNNDescriptor_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(auxFlags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&auxFlags, \"cudnnSetRNNDescriptor_v8\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetRNNDescriptor_v8(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    algo: *mut cuda_types::cudnn8::cudnnRNNAlgo_t,\n    cellMode: *mut cuda_types::cudnn8::cudnnRNNMode_t,\n    biasMode: *mut cuda_types::cudnn8::cudnnRNNBiasMode_t,\n    dirMode: *mut cuda_types::cudnn8::cudnnDirectionMode_t,\n    inputMode: *mut cuda_types::cudnn8::cudnnRNNInputMode_t,\n    dataType: *mut cuda_types::cudnn8::cudnnDataType_t,\n    mathPrec: *mut cuda_types::cudnn8::cudnnDataType_t,\n    mathType: *mut cuda_types::cudnn8::cudnnMathType_t,\n    inputSize: *mut i32,\n    hiddenSize: *mut i32,\n    projSize: *mut i32,\n    numLayers: *mut i32,\n    dropoutDesc: *mut cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n    auxFlags: *mut u32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnGetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cudnnGetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cellMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cellMode, \"cudnnGetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(biasMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&biasMode, \"cudnnGetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirMode, \"cudnnGetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inputMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&inputMode, \"cudnnGetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnGetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mathPrec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mathPrec, \"cudnnGetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mathType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mathType, \"cudnnGetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inputSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&inputSize, \"cudnnGetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hiddenSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hiddenSize, \"cudnnGetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(projSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&projSize, \"cudnnGetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numLayers), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numLayers, \"cudnnGetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dropoutDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dropoutDesc,\n        \"cudnnGetRNNDescriptor_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(auxFlags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&auxFlags, \"cudnnGetRNNDescriptor_v8\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetRNNDescriptor_v6(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    hiddenSize: ::core::ffi::c_int,\n    numLayers: ::core::ffi::c_int,\n    dropoutDesc: cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n    inputMode: cuda_types::cudnn8::cudnnRNNInputMode_t,\n    direction: cuda_types::cudnn8::cudnnDirectionMode_t,\n    cellMode: cuda_types::cudnn8::cudnnRNNMode_t,\n    algo: cuda_types::cudnn8::cudnnRNNAlgo_t,\n    mathPrec: cuda_types::cudnn8::cudnnDataType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnSetRNNDescriptor_v6\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnSetRNNDescriptor_v6\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hiddenSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hiddenSize, \"cudnnSetRNNDescriptor_v6\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numLayers), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numLayers, \"cudnnSetRNNDescriptor_v6\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dropoutDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dropoutDesc,\n        \"cudnnSetRNNDescriptor_v6\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inputMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&inputMode, \"cudnnSetRNNDescriptor_v6\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(direction), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&direction, \"cudnnSetRNNDescriptor_v6\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cellMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cellMode, \"cudnnSetRNNDescriptor_v6\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cudnnSetRNNDescriptor_v6\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mathPrec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mathPrec, \"cudnnSetRNNDescriptor_v6\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetRNNDescriptor_v6(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    hiddenSize: *mut ::core::ffi::c_int,\n    numLayers: *mut ::core::ffi::c_int,\n    dropoutDesc: *mut cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n    inputMode: *mut cuda_types::cudnn8::cudnnRNNInputMode_t,\n    direction: *mut cuda_types::cudnn8::cudnnDirectionMode_t,\n    cellMode: *mut cuda_types::cudnn8::cudnnRNNMode_t,\n    algo: *mut cuda_types::cudnn8::cudnnRNNAlgo_t,\n    mathPrec: *mut cuda_types::cudnn8::cudnnDataType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnGetRNNDescriptor_v6\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnGetRNNDescriptor_v6\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hiddenSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hiddenSize, \"cudnnGetRNNDescriptor_v6\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numLayers), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numLayers, \"cudnnGetRNNDescriptor_v6\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dropoutDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dropoutDesc,\n        \"cudnnGetRNNDescriptor_v6\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inputMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&inputMode, \"cudnnGetRNNDescriptor_v6\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(direction), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&direction, \"cudnnGetRNNDescriptor_v6\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cellMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cellMode, \"cudnnGetRNNDescriptor_v6\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cudnnGetRNNDescriptor_v6\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mathPrec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mathPrec, \"cudnnGetRNNDescriptor_v6\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetRNNMatrixMathType(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    mType: cuda_types::cudnn8::cudnnMathType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnSetRNNMatrixMathType\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mType, \"cudnnSetRNNMatrixMathType\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetRNNMatrixMathType(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    mType: *mut cuda_types::cudnn8::cudnnMathType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnGetRNNMatrixMathType\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mType, \"cudnnGetRNNMatrixMathType\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetRNNBiasMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    biasMode: cuda_types::cudnn8::cudnnRNNBiasMode_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnSetRNNBiasMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(biasMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&biasMode, \"cudnnSetRNNBiasMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetRNNBiasMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    biasMode: *mut cuda_types::cudnn8::cudnnRNNBiasMode_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnGetRNNBiasMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(biasMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&biasMode, \"cudnnGetRNNBiasMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnRNNSetClip_v8(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    clipMode: cuda_types::cudnn8::cudnnRNNClipMode_t,\n    clipNanOpt: cuda_types::cudnn8::cudnnNanPropagation_t,\n    lclip: f64,\n    rclip: f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnRNNSetClip_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clipMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&clipMode, \"cudnnRNNSetClip_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clipNanOpt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&clipNanOpt, \"cudnnRNNSetClip_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lclip), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lclip, \"cudnnRNNSetClip_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rclip), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rclip, \"cudnnRNNSetClip_v8\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnRNNGetClip_v8(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    clipMode: *mut cuda_types::cudnn8::cudnnRNNClipMode_t,\n    clipNanOpt: *mut cuda_types::cudnn8::cudnnNanPropagation_t,\n    lclip: *mut f64,\n    rclip: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnRNNGetClip_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clipMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&clipMode, \"cudnnRNNGetClip_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clipNanOpt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&clipNanOpt, \"cudnnRNNGetClip_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lclip), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lclip, \"cudnnRNNGetClip_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rclip), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rclip, \"cudnnRNNGetClip_v8\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnRNNSetClip(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    clipMode: cuda_types::cudnn8::cudnnRNNClipMode_t,\n    clipNanOpt: cuda_types::cudnn8::cudnnNanPropagation_t,\n    lclip: f64,\n    rclip: f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnRNNSetClip\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnRNNSetClip\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clipMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&clipMode, \"cudnnRNNSetClip\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clipNanOpt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&clipNanOpt, \"cudnnRNNSetClip\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lclip), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lclip, \"cudnnRNNSetClip\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rclip), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rclip, \"cudnnRNNSetClip\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnRNNGetClip(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    clipMode: *mut cuda_types::cudnn8::cudnnRNNClipMode_t,\n    clipNanOpt: *mut cuda_types::cudnn8::cudnnNanPropagation_t,\n    lclip: *mut f64,\n    rclip: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnRNNGetClip\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnRNNGetClip\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clipMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&clipMode, \"cudnnRNNGetClip\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clipNanOpt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&clipNanOpt, \"cudnnRNNGetClip\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lclip), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lclip, \"cudnnRNNGetClip\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rclip), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rclip, \"cudnnRNNGetClip\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetRNNProjectionLayers(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    recProjSize: ::core::ffi::c_int,\n    outProjSize: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnSetRNNProjectionLayers\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnSetRNNProjectionLayers\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(recProjSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &recProjSize,\n        \"cudnnSetRNNProjectionLayers\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(outProjSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &outProjSize,\n        \"cudnnSetRNNProjectionLayers\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetRNNProjectionLayers(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    recProjSize: *mut ::core::ffi::c_int,\n    outProjSize: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnGetRNNProjectionLayers\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnGetRNNProjectionLayers\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(recProjSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &recProjSize,\n        \"cudnnGetRNNProjectionLayers\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(outProjSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &outProjSize,\n        \"cudnnGetRNNProjectionLayers\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreatePersistentRNNPlan(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    minibatch: ::core::ffi::c_int,\n    dataType: cuda_types::cudnn8::cudnnDataType_t,\n    plan: *mut cuda_types::cudnn8::cudnnPersistentRNNPlan_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rnnDesc,\n        \"cudnnCreatePersistentRNNPlan\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(minibatch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &minibatch,\n        \"cudnnCreatePersistentRNNPlan\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dataType,\n        \"cudnnCreatePersistentRNNPlan\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cudnnCreatePersistentRNNPlan\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyPersistentRNNPlan(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cudnn8::cudnnPersistentRNNPlan_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cudnnDestroyPersistentRNNPlan\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetPersistentRNNPlan(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    plan: cuda_types::cudnn8::cudnnPersistentRNNPlan_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnSetPersistentRNNPlan\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cudnnSetPersistentRNNPlan\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnBuildRNNDynamic(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    miniBatch: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnBuildRNNDynamic\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnBuildRNNDynamic\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(miniBatch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&miniBatch, \"cudnnBuildRNNDynamic\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetRNNWorkspaceSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    seqLength: ::core::ffi::c_int,\n    xDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    sizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnGetRNNWorkspaceSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnGetRNNWorkspaceSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seqLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&seqLength, \"cudnnGetRNNWorkspaceSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnGetRNNWorkspaceSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnGetRNNWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetRNNTrainingReserveSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    seqLength: ::core::ffi::c_int,\n    xDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    sizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetRNNTrainingReserveSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rnnDesc,\n        \"cudnnGetRNNTrainingReserveSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seqLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &seqLength,\n        \"cudnnGetRNNTrainingReserveSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnGetRNNTrainingReserveSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnGetRNNTrainingReserveSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetRNNTempSpaceSizes(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    fwdMode: cuda_types::cudnn8::cudnnForwardMode_t,\n    xDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    workSpaceSize: *mut usize,\n    reserveSpaceSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnGetRNNTempSpaceSizes\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnGetRNNTempSpaceSizes\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fwdMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fwdMode, \"cudnnGetRNNTempSpaceSizes\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnGetRNNTempSpaceSizes\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSize,\n        \"cudnnGetRNNTempSpaceSizes\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSize,\n        \"cudnnGetRNNTempSpaceSizes\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetRNNParamsSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    sizeInBytes: *mut usize,\n    dataType: cuda_types::cudnn8::cudnnDataType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnGetRNNParamsSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnGetRNNParamsSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnGetRNNParamsSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&sizeInBytes, \"cudnnGetRNNParamsSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnGetRNNParamsSize\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetRNNWeightSpaceSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    weightSpaceSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnGetRNNWeightSpaceSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnGetRNNWeightSpaceSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weightSpaceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &weightSpaceSize,\n        \"cudnnGetRNNWeightSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetRNNLinLayerMatrixParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    pseudoLayer: ::core::ffi::c_int,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    w: *const ::core::ffi::c_void,\n    linLayerID: ::core::ffi::c_int,\n    linLayerMatDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    linLayerMat: *mut *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetRNNLinLayerMatrixParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rnnDesc,\n        \"cudnnGetRNNLinLayerMatrixParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pseudoLayer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pseudoLayer,\n        \"cudnnGetRNNLinLayerMatrixParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnGetRNNLinLayerMatrixParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &wDesc,\n        \"cudnnGetRNNLinLayerMatrixParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&w, \"cudnnGetRNNLinLayerMatrixParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(linLayerID), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &linLayerID,\n        \"cudnnGetRNNLinLayerMatrixParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(linLayerMatDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &linLayerMatDesc,\n        \"cudnnGetRNNLinLayerMatrixParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(linLayerMat), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &linLayerMat,\n        \"cudnnGetRNNLinLayerMatrixParams\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetRNNLinLayerBiasParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    pseudoLayer: ::core::ffi::c_int,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    w: *const ::core::ffi::c_void,\n    linLayerID: ::core::ffi::c_int,\n    linLayerBiasDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    linLayerBias: *mut *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetRNNLinLayerBiasParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rnnDesc,\n        \"cudnnGetRNNLinLayerBiasParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pseudoLayer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pseudoLayer,\n        \"cudnnGetRNNLinLayerBiasParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnGetRNNLinLayerBiasParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&wDesc, \"cudnnGetRNNLinLayerBiasParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&w, \"cudnnGetRNNLinLayerBiasParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(linLayerID), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &linLayerID,\n        \"cudnnGetRNNLinLayerBiasParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(linLayerBiasDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &linLayerBiasDesc,\n        \"cudnnGetRNNLinLayerBiasParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(linLayerBias), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &linLayerBias,\n        \"cudnnGetRNNLinLayerBiasParams\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetRNNWeightParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    pseudoLayer: i32,\n    weightSpaceSize: usize,\n    weightSpace: *const ::core::ffi::c_void,\n    linLayerID: i32,\n    mDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    mAddr: *mut *mut ::core::ffi::c_void,\n    bDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    bAddr: *mut *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnGetRNNWeightParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnGetRNNWeightParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pseudoLayer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pseudoLayer, \"cudnnGetRNNWeightParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weightSpaceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &weightSpaceSize,\n        \"cudnnGetRNNWeightParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weightSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&weightSpace, \"cudnnGetRNNWeightParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(linLayerID), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&linLayerID, \"cudnnGetRNNWeightParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mDesc, \"cudnnGetRNNWeightParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mAddr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mAddr, \"cudnnGetRNNWeightParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bDesc, \"cudnnGetRNNWeightParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bAddr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bAddr, \"cudnnGetRNNWeightParams\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnRNNForwardInference(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    seqLength: ::core::ffi::c_int,\n    xDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    hxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    hx: *const ::core::ffi::c_void,\n    cxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    cx: *const ::core::ffi::c_void,\n    wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    w: *const ::core::ffi::c_void,\n    yDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n    hyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    hy: *mut ::core::ffi::c_void,\n    cyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    cy: *mut ::core::ffi::c_void,\n    workSpace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnRNNForwardInference\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnRNNForwardInference\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seqLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&seqLength, \"cudnnRNNForwardInference\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnRNNForwardInference\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnRNNForwardInference\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hxDesc, \"cudnnRNNForwardInference\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hx, \"cudnnRNNForwardInference\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cxDesc, \"cudnnRNNForwardInference\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cx, \"cudnnRNNForwardInference\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&wDesc, \"cudnnRNNForwardInference\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&w, \"cudnnRNNForwardInference\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnRNNForwardInference\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnRNNForwardInference\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hyDesc, \"cudnnRNNForwardInference\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hy, \"cudnnRNNForwardInference\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cyDesc, \"cudnnRNNForwardInference\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cy, \"cudnnRNNForwardInference\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSpace, \"cudnnRNNForwardInference\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnRNNForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetRNNPaddingMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    paddingMode: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnSetRNNPaddingMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paddingMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&paddingMode, \"cudnnSetRNNPaddingMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetRNNPaddingMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    paddingMode: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnGetRNNPaddingMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paddingMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&paddingMode, \"cudnnGetRNNPaddingMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreateRNNDataDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDataDesc: *mut cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDataDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rnnDataDesc,\n        \"cudnnCreateRNNDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyRNNDataDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDataDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDataDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rnnDataDesc,\n        \"cudnnDestroyRNNDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetRNNDataDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDataDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    dataType: cuda_types::cudnn8::cudnnDataType_t,\n    layout: cuda_types::cudnn8::cudnnRNNDataLayout_t,\n    maxSeqLength: ::core::ffi::c_int,\n    batchSize: ::core::ffi::c_int,\n    vectorSize: ::core::ffi::c_int,\n    seqLengthArray: *const ::core::ffi::c_int,\n    paddingFill: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDataDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rnnDataDesc,\n        \"cudnnSetRNNDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnSetRNNDataDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(layout), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&layout, \"cudnnSetRNNDataDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxSeqLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxSeqLength,\n        \"cudnnSetRNNDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchSize, \"cudnnSetRNNDataDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vectorSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vectorSize,\n        \"cudnnSetRNNDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seqLengthArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &seqLengthArray,\n        \"cudnnSetRNNDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paddingFill), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paddingFill,\n        \"cudnnSetRNNDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetRNNDataDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDataDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    dataType: *mut cuda_types::cudnn8::cudnnDataType_t,\n    layout: *mut cuda_types::cudnn8::cudnnRNNDataLayout_t,\n    maxSeqLength: *mut ::core::ffi::c_int,\n    batchSize: *mut ::core::ffi::c_int,\n    vectorSize: *mut ::core::ffi::c_int,\n    arrayLengthRequested: ::core::ffi::c_int,\n    seqLengthArray: *mut ::core::ffi::c_int,\n    paddingFill: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDataDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rnnDataDesc,\n        \"cudnnGetRNNDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnGetRNNDataDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(layout), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&layout, \"cudnnGetRNNDataDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxSeqLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxSeqLength,\n        \"cudnnGetRNNDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchSize, \"cudnnGetRNNDataDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vectorSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vectorSize,\n        \"cudnnGetRNNDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(arrayLengthRequested), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &arrayLengthRequested,\n        \"cudnnGetRNNDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seqLengthArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &seqLengthArray,\n        \"cudnnGetRNNDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paddingFill), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paddingFill,\n        \"cudnnGetRNNDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnRNNForwardInferenceEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    xDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    hxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    hx: *const ::core::ffi::c_void,\n    cxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    cx: *const ::core::ffi::c_void,\n    wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    w: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n    hyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    hy: *mut ::core::ffi::c_void,\n    cyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    cy: *mut ::core::ffi::c_void,\n    kDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    keys: *const ::core::ffi::c_void,\n    cDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    cAttn: *mut ::core::ffi::c_void,\n    iDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    iAttn: *mut ::core::ffi::c_void,\n    qDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    queries: *mut ::core::ffi::c_void,\n    workSpace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnRNNForwardInferenceEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnRNNForwardInferenceEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnRNNForwardInferenceEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnRNNForwardInferenceEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hxDesc, \"cudnnRNNForwardInferenceEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hx, \"cudnnRNNForwardInferenceEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cxDesc, \"cudnnRNNForwardInferenceEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cx, \"cudnnRNNForwardInferenceEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&wDesc, \"cudnnRNNForwardInferenceEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&w, \"cudnnRNNForwardInferenceEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnRNNForwardInferenceEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnRNNForwardInferenceEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hyDesc, \"cudnnRNNForwardInferenceEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hy, \"cudnnRNNForwardInferenceEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cyDesc, \"cudnnRNNForwardInferenceEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cy, \"cudnnRNNForwardInferenceEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kDesc, \"cudnnRNNForwardInferenceEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(keys), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&keys, \"cudnnRNNForwardInferenceEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cDesc, \"cudnnRNNForwardInferenceEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cAttn), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cAttn, \"cudnnRNNForwardInferenceEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(iDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&iDesc, \"cudnnRNNForwardInferenceEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(iAttn), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&iAttn, \"cudnnRNNForwardInferenceEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(qDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&qDesc, \"cudnnRNNForwardInferenceEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(queries), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&queries, \"cudnnRNNForwardInferenceEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpace,\n        \"cudnnRNNForwardInferenceEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnRNNForwardInferenceEx\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnRNNForward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    fwdMode: cuda_types::cudnn8::cudnnForwardMode_t,\n    devSeqLengths: *const i32,\n    xDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n    hDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    hx: *const ::core::ffi::c_void,\n    hy: *mut ::core::ffi::c_void,\n    cDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    cx: *const ::core::ffi::c_void,\n    cy: *mut ::core::ffi::c_void,\n    weightSpaceSize: usize,\n    weightSpace: *const ::core::ffi::c_void,\n    workSpaceSize: usize,\n    workSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSize: usize,\n    reserveSpace: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fwdMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fwdMode, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devSeqLengths), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&devSeqLengths, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hDesc, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hx, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hy, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cDesc, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cx, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cy, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weightSpaceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&weightSpaceSize, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weightSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&weightSpace, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSpaceSize, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSpace, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&reserveSpaceSize, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&reserveSpace, \"cudnnRNNForward\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetRNNAlgorithmDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    algoDesc: cuda_types::cudnn8::cudnnAlgorithmDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnSetRNNAlgorithmDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rnnDesc,\n        \"cudnnSetRNNAlgorithmDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algoDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algoDesc,\n        \"cudnnSetRNNAlgorithmDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetRNNForwardInferenceAlgorithmMaxCount(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    count: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetRNNForwardInferenceAlgorithmMaxCount\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rnnDesc,\n        \"cudnnGetRNNForwardInferenceAlgorithmMaxCount\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &count,\n        \"cudnnGetRNNForwardInferenceAlgorithmMaxCount\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnFindRNNForwardInferenceAlgorithmEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    seqLength: ::core::ffi::c_int,\n    xDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    hxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    hx: *const ::core::ffi::c_void,\n    cxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    cx: *const ::core::ffi::c_void,\n    wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    w: *const ::core::ffi::c_void,\n    yDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n    hyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    hy: *mut ::core::ffi::c_void,\n    cyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    cy: *mut ::core::ffi::c_void,\n    findIntensity: f32,\n    requestedAlgoCount: ::core::ffi::c_int,\n    returnedAlgoCount: *mut ::core::ffi::c_int,\n    perfResults: *mut cuda_types::cudnn8::cudnnAlgorithmPerformance_t,\n    workspace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnFindRNNForwardInferenceAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rnnDesc,\n        \"cudnnFindRNNForwardInferenceAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seqLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &seqLength,\n        \"cudnnFindRNNForwardInferenceAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnFindRNNForwardInferenceAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cudnnFindRNNForwardInferenceAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hxDesc,\n        \"cudnnFindRNNForwardInferenceAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hx,\n        \"cudnnFindRNNForwardInferenceAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cxDesc,\n        \"cudnnFindRNNForwardInferenceAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cx,\n        \"cudnnFindRNNForwardInferenceAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &wDesc,\n        \"cudnnFindRNNForwardInferenceAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &w,\n        \"cudnnFindRNNForwardInferenceAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnFindRNNForwardInferenceAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &y,\n        \"cudnnFindRNNForwardInferenceAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hyDesc,\n        \"cudnnFindRNNForwardInferenceAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hy,\n        \"cudnnFindRNNForwardInferenceAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cyDesc,\n        \"cudnnFindRNNForwardInferenceAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cy,\n        \"cudnnFindRNNForwardInferenceAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(findIntensity), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &findIntensity,\n        \"cudnnFindRNNForwardInferenceAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(requestedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &requestedAlgoCount,\n        \"cudnnFindRNNForwardInferenceAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(returnedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &returnedAlgoCount,\n        \"cudnnFindRNNForwardInferenceAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(perfResults), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &perfResults,\n        \"cudnnFindRNNForwardInferenceAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workspace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workspace,\n        \"cudnnFindRNNForwardInferenceAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnFindRNNForwardInferenceAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreateSeqDataDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    seqDataDesc: *mut cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(seqDataDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &seqDataDesc,\n        \"cudnnCreateSeqDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroySeqDataDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    seqDataDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(seqDataDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &seqDataDesc,\n        \"cudnnDestroySeqDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetSeqDataDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    seqDataDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n    dataType: cuda_types::cudnn8::cudnnDataType_t,\n    nbDims: ::core::ffi::c_int,\n    dimA: *const ::core::ffi::c_int,\n    axes: *const cuda_types::cudnn8::cudnnSeqDataAxis_t,\n    seqLengthArraySize: usize,\n    seqLengthArray: *const ::core::ffi::c_int,\n    paddingFill: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(seqDataDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &seqDataDesc,\n        \"cudnnSetSeqDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnSetSeqDataDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDims), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nbDims, \"cudnnSetSeqDataDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dimA, \"cudnnSetSeqDataDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(axes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&axes, \"cudnnSetSeqDataDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seqLengthArraySize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &seqLengthArraySize,\n        \"cudnnSetSeqDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seqLengthArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &seqLengthArray,\n        \"cudnnSetSeqDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paddingFill), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paddingFill,\n        \"cudnnSetSeqDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetSeqDataDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    seqDataDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n    dataType: *mut cuda_types::cudnn8::cudnnDataType_t,\n    nbDims: *mut ::core::ffi::c_int,\n    nbDimsRequested: ::core::ffi::c_int,\n    dimA: *mut ::core::ffi::c_int,\n    axes: *mut cuda_types::cudnn8::cudnnSeqDataAxis_t,\n    seqLengthArraySize: *mut usize,\n    seqLengthSizeRequested: usize,\n    seqLengthArray: *mut ::core::ffi::c_int,\n    paddingFill: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(seqDataDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &seqDataDesc,\n        \"cudnnGetSeqDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnGetSeqDataDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDims), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nbDims, \"cudnnGetSeqDataDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDimsRequested), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nbDimsRequested,\n        \"cudnnGetSeqDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dimA, \"cudnnGetSeqDataDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(axes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&axes, \"cudnnGetSeqDataDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seqLengthArraySize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &seqLengthArraySize,\n        \"cudnnGetSeqDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seqLengthSizeRequested), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &seqLengthSizeRequested,\n        \"cudnnGetSeqDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seqLengthArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &seqLengthArray,\n        \"cudnnGetSeqDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paddingFill), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paddingFill,\n        \"cudnnGetSeqDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreateAttnDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    attnDesc: *mut cuda_types::cudnn8::cudnnAttnDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(attnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attnDesc, \"cudnnCreateAttnDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyAttnDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    attnDesc: cuda_types::cudnn8::cudnnAttnDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(attnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attnDesc, \"cudnnDestroyAttnDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetAttnDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    attnDesc: cuda_types::cudnn8::cudnnAttnDescriptor_t,\n    attnMode: ::core::ffi::c_uint,\n    nHeads: ::core::ffi::c_int,\n    smScaler: f64,\n    dataType: cuda_types::cudnn8::cudnnDataType_t,\n    computePrec: cuda_types::cudnn8::cudnnDataType_t,\n    mathType: cuda_types::cudnn8::cudnnMathType_t,\n    attnDropoutDesc: cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n    postDropoutDesc: cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n    qSize: ::core::ffi::c_int,\n    kSize: ::core::ffi::c_int,\n    vSize: ::core::ffi::c_int,\n    qProjSize: ::core::ffi::c_int,\n    kProjSize: ::core::ffi::c_int,\n    vProjSize: ::core::ffi::c_int,\n    oProjSize: ::core::ffi::c_int,\n    qoMaxSeqLength: ::core::ffi::c_int,\n    kvMaxSeqLength: ::core::ffi::c_int,\n    maxBatchSize: ::core::ffi::c_int,\n    maxBeamSize: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(attnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attnDesc, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attnMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attnMode, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nHeads), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nHeads, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(smScaler), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&smScaler, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computePrec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&computePrec, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mathType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mathType, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attnDropoutDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &attnDropoutDesc,\n        \"cudnnSetAttnDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(postDropoutDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &postDropoutDesc,\n        \"cudnnSetAttnDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(qSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&qSize, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kSize, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vSize, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(qProjSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&qProjSize, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kProjSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kProjSize, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vProjSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vProjSize, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(oProjSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&oProjSize, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(qoMaxSeqLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &qoMaxSeqLength,\n        \"cudnnSetAttnDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kvMaxSeqLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &kvMaxSeqLength,\n        \"cudnnSetAttnDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxBatchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&maxBatchSize, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxBeamSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&maxBeamSize, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetAttnDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    attnDesc: cuda_types::cudnn8::cudnnAttnDescriptor_t,\n    attnMode: *mut ::core::ffi::c_uint,\n    nHeads: *mut ::core::ffi::c_int,\n    smScaler: *mut f64,\n    dataType: *mut cuda_types::cudnn8::cudnnDataType_t,\n    computePrec: *mut cuda_types::cudnn8::cudnnDataType_t,\n    mathType: *mut cuda_types::cudnn8::cudnnMathType_t,\n    attnDropoutDesc: *mut cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n    postDropoutDesc: *mut cuda_types::cudnn8::cudnnDropoutDescriptor_t,\n    qSize: *mut ::core::ffi::c_int,\n    kSize: *mut ::core::ffi::c_int,\n    vSize: *mut ::core::ffi::c_int,\n    qProjSize: *mut ::core::ffi::c_int,\n    kProjSize: *mut ::core::ffi::c_int,\n    vProjSize: *mut ::core::ffi::c_int,\n    oProjSize: *mut ::core::ffi::c_int,\n    qoMaxSeqLength: *mut ::core::ffi::c_int,\n    kvMaxSeqLength: *mut ::core::ffi::c_int,\n    maxBatchSize: *mut ::core::ffi::c_int,\n    maxBeamSize: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(attnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attnDesc, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attnMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attnMode, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nHeads), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nHeads, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(smScaler), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&smScaler, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computePrec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&computePrec, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mathType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mathType, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attnDropoutDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &attnDropoutDesc,\n        \"cudnnGetAttnDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(postDropoutDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &postDropoutDesc,\n        \"cudnnGetAttnDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(qSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&qSize, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kSize, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vSize, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(qProjSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&qProjSize, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kProjSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kProjSize, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vProjSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vProjSize, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(oProjSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&oProjSize, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(qoMaxSeqLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &qoMaxSeqLength,\n        \"cudnnGetAttnDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kvMaxSeqLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &kvMaxSeqLength,\n        \"cudnnGetAttnDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxBatchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&maxBatchSize, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxBeamSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&maxBeamSize, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetMultiHeadAttnBuffers(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    attnDesc: cuda_types::cudnn8::cudnnAttnDescriptor_t,\n    weightSizeInBytes: *mut usize,\n    workSpaceSizeInBytes: *mut usize,\n    reserveSpaceSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnGetMultiHeadAttnBuffers\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &attnDesc,\n        \"cudnnGetMultiHeadAttnBuffers\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weightSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &weightSizeInBytes,\n        \"cudnnGetMultiHeadAttnBuffers\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnGetMultiHeadAttnBuffers\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnGetMultiHeadAttnBuffers\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetMultiHeadAttnWeights(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    attnDesc: cuda_types::cudnn8::cudnnAttnDescriptor_t,\n    wKind: cuda_types::cudnn8::cudnnMultiHeadAttnWeightKind_t,\n    weightSizeInBytes: usize,\n    weights: *const ::core::ffi::c_void,\n    wDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    wAddr: *mut *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnGetMultiHeadAttnWeights\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &attnDesc,\n        \"cudnnGetMultiHeadAttnWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wKind), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&wKind, \"cudnnGetMultiHeadAttnWeights\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weightSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &weightSizeInBytes,\n        \"cudnnGetMultiHeadAttnWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weights), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &weights,\n        \"cudnnGetMultiHeadAttnWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&wDesc, \"cudnnGetMultiHeadAttnWeights\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wAddr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&wAddr, \"cudnnGetMultiHeadAttnWeights\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnMultiHeadAttnForward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    attnDesc: cuda_types::cudnn8::cudnnAttnDescriptor_t,\n    currIdx: ::core::ffi::c_int,\n    loWinIdx: *const ::core::ffi::c_int,\n    hiWinIdx: *const ::core::ffi::c_int,\n    devSeqLengthsQO: *const ::core::ffi::c_int,\n    devSeqLengthsKV: *const ::core::ffi::c_int,\n    qDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n    queries: *const ::core::ffi::c_void,\n    residuals: *const ::core::ffi::c_void,\n    kDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n    keys: *const ::core::ffi::c_void,\n    vDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n    values: *const ::core::ffi::c_void,\n    oDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n    out: *mut ::core::ffi::c_void,\n    weightSizeInBytes: usize,\n    weights: *const ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    workSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSizeInBytes: usize,\n    reserveSpace: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attnDesc, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(currIdx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&currIdx, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(loWinIdx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&loWinIdx, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hiWinIdx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hiWinIdx, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devSeqLengthsQO), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &devSeqLengthsQO,\n        \"cudnnMultiHeadAttnForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devSeqLengthsKV), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &devSeqLengthsKV,\n        \"cudnnMultiHeadAttnForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(qDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&qDesc, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(queries), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&queries, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(residuals), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&residuals, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kDesc, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(keys), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&keys, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vDesc, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&values, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(oDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&oDesc, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&out, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weightSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &weightSizeInBytes,\n        \"cudnnMultiHeadAttnForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weights), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&weights, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnMultiHeadAttnForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSpace, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnMultiHeadAttnForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpace,\n        \"cudnnMultiHeadAttnForward\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnAdvInferVersionCheck(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_cudnnRNNForwardTraining(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    seqLength: ::core::ffi::c_int,\n    xDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    hxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    hx: *const ::core::ffi::c_void,\n    cxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    cx: *const ::core::ffi::c_void,\n    wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    w: *const ::core::ffi::c_void,\n    yDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n    hyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    hy: *mut ::core::ffi::c_void,\n    cyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    cy: *mut ::core::ffi::c_void,\n    workSpace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    reserveSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnRNNForwardTraining\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnRNNForwardTraining\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seqLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&seqLength, \"cudnnRNNForwardTraining\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnRNNForwardTraining\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnRNNForwardTraining\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hxDesc, \"cudnnRNNForwardTraining\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hx, \"cudnnRNNForwardTraining\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cxDesc, \"cudnnRNNForwardTraining\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cx, \"cudnnRNNForwardTraining\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&wDesc, \"cudnnRNNForwardTraining\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&w, \"cudnnRNNForwardTraining\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnRNNForwardTraining\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnRNNForwardTraining\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hyDesc, \"cudnnRNNForwardTraining\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hy, \"cudnnRNNForwardTraining\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cyDesc, \"cudnnRNNForwardTraining\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cy, \"cudnnRNNForwardTraining\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSpace, \"cudnnRNNForwardTraining\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnRNNForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpace,\n        \"cudnnRNNForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnRNNForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnRNNBackwardData(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    seqLength: ::core::ffi::c_int,\n    yDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *const ::core::ffi::c_void,\n    dyDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dy: *const ::core::ffi::c_void,\n    dhyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dhy: *const ::core::ffi::c_void,\n    dcyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dcy: *const ::core::ffi::c_void,\n    wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    w: *const ::core::ffi::c_void,\n    hxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    hx: *const ::core::ffi::c_void,\n    cxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    cx: *const ::core::ffi::c_void,\n    dxDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dx: *mut ::core::ffi::c_void,\n    dhxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dhx: *mut ::core::ffi::c_void,\n    dcxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dcx: *mut ::core::ffi::c_void,\n    workSpace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    reserveSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnRNNBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnRNNBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seqLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&seqLength, \"cudnnRNNBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnRNNBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnRNNBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dyDesc, \"cudnnRNNBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dy, \"cudnnRNNBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dhyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dhyDesc, \"cudnnRNNBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dhy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dhy, \"cudnnRNNBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dcyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dcyDesc, \"cudnnRNNBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dcy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dcy, \"cudnnRNNBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&wDesc, \"cudnnRNNBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&w, \"cudnnRNNBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hxDesc, \"cudnnRNNBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hx, \"cudnnRNNBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cxDesc, \"cudnnRNNBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cx, \"cudnnRNNBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dxDesc, \"cudnnRNNBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dx, \"cudnnRNNBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dhxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dhxDesc, \"cudnnRNNBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dhx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dhx, \"cudnnRNNBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dcxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dcxDesc, \"cudnnRNNBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dcx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dcx, \"cudnnRNNBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSpace, \"cudnnRNNBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnRNNBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&reserveSpace, \"cudnnRNNBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnRNNBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnRNNBackwardData_v8(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    devSeqLengths: *const i32,\n    yDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    y: *const ::core::ffi::c_void,\n    dy: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    dx: *mut ::core::ffi::c_void,\n    hDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    hx: *const ::core::ffi::c_void,\n    dhy: *const ::core::ffi::c_void,\n    dhx: *mut ::core::ffi::c_void,\n    cDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    cx: *const ::core::ffi::c_void,\n    dcy: *const ::core::ffi::c_void,\n    dcx: *mut ::core::ffi::c_void,\n    weightSpaceSize: usize,\n    weightSpace: *const ::core::ffi::c_void,\n    workSpaceSize: usize,\n    workSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSize: usize,\n    reserveSpace: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devSeqLengths), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &devSeqLengths,\n        \"cudnnRNNBackwardData_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dy, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dx, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hDesc, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hx, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dhy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dhy, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dhx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dhx, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cDesc, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cx, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dcy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dcy, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dcx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dcx, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weightSpaceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &weightSpaceSize,\n        \"cudnnRNNBackwardData_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weightSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&weightSpace, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSize,\n        \"cudnnRNNBackwardData_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSpace, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSize,\n        \"cudnnRNNBackwardData_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpace,\n        \"cudnnRNNBackwardData_v8\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnRNNBackwardWeights(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    seqLength: ::core::ffi::c_int,\n    xDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    hxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    hx: *const ::core::ffi::c_void,\n    yDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *const ::core::ffi::c_void,\n    workSpace: *const ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    dwDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    dw: *mut ::core::ffi::c_void,\n    reserveSpace: *const ::core::ffi::c_void,\n    reserveSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnRNNBackwardWeights\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnRNNBackwardWeights\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seqLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&seqLength, \"cudnnRNNBackwardWeights\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnRNNBackwardWeights\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnRNNBackwardWeights\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hxDesc, \"cudnnRNNBackwardWeights\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hx, \"cudnnRNNBackwardWeights\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnRNNBackwardWeights\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnRNNBackwardWeights\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSpace, \"cudnnRNNBackwardWeights\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnRNNBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dwDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dwDesc, \"cudnnRNNBackwardWeights\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dw), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dw, \"cudnnRNNBackwardWeights\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpace,\n        \"cudnnRNNBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnRNNBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnRNNBackwardWeights_v8(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    addGrad: cuda_types::cudnn8::cudnnWgradMode_t,\n    devSeqLengths: *const i32,\n    xDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    hDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    hx: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    y: *const ::core::ffi::c_void,\n    weightSpaceSize: usize,\n    dweightSpace: *mut ::core::ffi::c_void,\n    workSpaceSize: usize,\n    workSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSize: usize,\n    reserveSpace: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnRNNBackwardWeights_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnRNNBackwardWeights_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(addGrad), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&addGrad, \"cudnnRNNBackwardWeights_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devSeqLengths), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &devSeqLengths,\n        \"cudnnRNNBackwardWeights_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnRNNBackwardWeights_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnRNNBackwardWeights_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hDesc, \"cudnnRNNBackwardWeights_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hx, \"cudnnRNNBackwardWeights_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnRNNBackwardWeights_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnRNNBackwardWeights_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weightSpaceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &weightSpaceSize,\n        \"cudnnRNNBackwardWeights_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dweightSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dweightSpace,\n        \"cudnnRNNBackwardWeights_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSize,\n        \"cudnnRNNBackwardWeights_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpace,\n        \"cudnnRNNBackwardWeights_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSize,\n        \"cudnnRNNBackwardWeights_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpace,\n        \"cudnnRNNBackwardWeights_v8\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnRNNForwardTrainingEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    xDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    hxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    hx: *const ::core::ffi::c_void,\n    cxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    cx: *const ::core::ffi::c_void,\n    wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    w: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n    hyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    hy: *mut ::core::ffi::c_void,\n    cyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    cy: *mut ::core::ffi::c_void,\n    kDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    keys: *const ::core::ffi::c_void,\n    cDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    cAttn: *mut ::core::ffi::c_void,\n    iDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    iAttn: *mut ::core::ffi::c_void,\n    qDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    queries: *mut ::core::ffi::c_void,\n    workSpace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    reserveSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnRNNForwardTrainingEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnRNNForwardTrainingEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnRNNForwardTrainingEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnRNNForwardTrainingEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hxDesc, \"cudnnRNNForwardTrainingEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hx, \"cudnnRNNForwardTrainingEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cxDesc, \"cudnnRNNForwardTrainingEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cx, \"cudnnRNNForwardTrainingEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&wDesc, \"cudnnRNNForwardTrainingEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&w, \"cudnnRNNForwardTrainingEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnRNNForwardTrainingEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnRNNForwardTrainingEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hyDesc, \"cudnnRNNForwardTrainingEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hy, \"cudnnRNNForwardTrainingEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cyDesc, \"cudnnRNNForwardTrainingEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cy, \"cudnnRNNForwardTrainingEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kDesc, \"cudnnRNNForwardTrainingEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(keys), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&keys, \"cudnnRNNForwardTrainingEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cDesc, \"cudnnRNNForwardTrainingEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cAttn), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cAttn, \"cudnnRNNForwardTrainingEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(iDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&iDesc, \"cudnnRNNForwardTrainingEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(iAttn), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&iAttn, \"cudnnRNNForwardTrainingEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(qDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&qDesc, \"cudnnRNNForwardTrainingEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(queries), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&queries, \"cudnnRNNForwardTrainingEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSpace, \"cudnnRNNForwardTrainingEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnRNNForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpace,\n        \"cudnnRNNForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnRNNForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnRNNBackwardDataEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    yDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    y: *const ::core::ffi::c_void,\n    dyDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    dy: *const ::core::ffi::c_void,\n    dcDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    dcAttn: *const ::core::ffi::c_void,\n    dhyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dhy: *const ::core::ffi::c_void,\n    dcyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dcy: *const ::core::ffi::c_void,\n    wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    w: *const ::core::ffi::c_void,\n    hxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    hx: *const ::core::ffi::c_void,\n    cxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    cx: *const ::core::ffi::c_void,\n    dxDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    dx: *mut ::core::ffi::c_void,\n    dhxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dhx: *mut ::core::ffi::c_void,\n    dcxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dcx: *mut ::core::ffi::c_void,\n    dkDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    dkeys: *mut ::core::ffi::c_void,\n    workSpace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    reserveSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnRNNBackwardDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnRNNBackwardDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnRNNBackwardDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnRNNBackwardDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dyDesc, \"cudnnRNNBackwardDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dy, \"cudnnRNNBackwardDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dcDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dcDesc, \"cudnnRNNBackwardDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dcAttn), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dcAttn, \"cudnnRNNBackwardDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dhyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dhyDesc, \"cudnnRNNBackwardDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dhy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dhy, \"cudnnRNNBackwardDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dcyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dcyDesc, \"cudnnRNNBackwardDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dcy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dcy, \"cudnnRNNBackwardDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&wDesc, \"cudnnRNNBackwardDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&w, \"cudnnRNNBackwardDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hxDesc, \"cudnnRNNBackwardDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hx, \"cudnnRNNBackwardDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cxDesc, \"cudnnRNNBackwardDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cx, \"cudnnRNNBackwardDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dxDesc, \"cudnnRNNBackwardDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dx, \"cudnnRNNBackwardDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dhxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dhxDesc, \"cudnnRNNBackwardDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dhx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dhx, \"cudnnRNNBackwardDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dcxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dcxDesc, \"cudnnRNNBackwardDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dcx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dcx, \"cudnnRNNBackwardDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dkDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dkDesc, \"cudnnRNNBackwardDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dkeys), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dkeys, \"cudnnRNNBackwardDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSpace, \"cudnnRNNBackwardDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnRNNBackwardDataEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&reserveSpace, \"cudnnRNNBackwardDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnRNNBackwardDataEx\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnRNNBackwardWeightsEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    xDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    hxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    hx: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn8::cudnnRNNDataDescriptor_t,\n    y: *const ::core::ffi::c_void,\n    workSpace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    dwDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    dw: *mut ::core::ffi::c_void,\n    reserveSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnRNNBackwardWeightsEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnRNNBackwardWeightsEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnRNNBackwardWeightsEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnRNNBackwardWeightsEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hxDesc, \"cudnnRNNBackwardWeightsEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hx, \"cudnnRNNBackwardWeightsEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnRNNBackwardWeightsEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnRNNBackwardWeightsEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSpace, \"cudnnRNNBackwardWeightsEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnRNNBackwardWeightsEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dwDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dwDesc, \"cudnnRNNBackwardWeightsEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dw), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dw, \"cudnnRNNBackwardWeightsEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpace,\n        \"cudnnRNNBackwardWeightsEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnRNNBackwardWeightsEx\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetRNNForwardTrainingAlgorithmMaxCount(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    count: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetRNNForwardTrainingAlgorithmMaxCount\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rnnDesc,\n        \"cudnnGetRNNForwardTrainingAlgorithmMaxCount\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &count,\n        \"cudnnGetRNNForwardTrainingAlgorithmMaxCount\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnFindRNNForwardTrainingAlgorithmEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    seqLength: ::core::ffi::c_int,\n    xDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    hxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    hx: *const ::core::ffi::c_void,\n    cxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    cx: *const ::core::ffi::c_void,\n    wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    w: *const ::core::ffi::c_void,\n    yDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n    hyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    hy: *mut ::core::ffi::c_void,\n    cyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    cy: *mut ::core::ffi::c_void,\n    findIntensity: f32,\n    requestedAlgoCount: ::core::ffi::c_int,\n    returnedAlgoCount: *mut ::core::ffi::c_int,\n    perfResults: *mut cuda_types::cudnn8::cudnnAlgorithmPerformance_t,\n    workspace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    reserveSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnFindRNNForwardTrainingAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rnnDesc,\n        \"cudnnFindRNNForwardTrainingAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seqLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &seqLength,\n        \"cudnnFindRNNForwardTrainingAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnFindRNNForwardTrainingAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cudnnFindRNNForwardTrainingAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hxDesc,\n        \"cudnnFindRNNForwardTrainingAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hx,\n        \"cudnnFindRNNForwardTrainingAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cxDesc,\n        \"cudnnFindRNNForwardTrainingAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cx,\n        \"cudnnFindRNNForwardTrainingAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &wDesc,\n        \"cudnnFindRNNForwardTrainingAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &w,\n        \"cudnnFindRNNForwardTrainingAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnFindRNNForwardTrainingAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &y,\n        \"cudnnFindRNNForwardTrainingAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hyDesc,\n        \"cudnnFindRNNForwardTrainingAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hy,\n        \"cudnnFindRNNForwardTrainingAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cyDesc,\n        \"cudnnFindRNNForwardTrainingAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cy,\n        \"cudnnFindRNNForwardTrainingAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(findIntensity), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &findIntensity,\n        \"cudnnFindRNNForwardTrainingAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(requestedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &requestedAlgoCount,\n        \"cudnnFindRNNForwardTrainingAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(returnedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &returnedAlgoCount,\n        \"cudnnFindRNNForwardTrainingAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(perfResults), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &perfResults,\n        \"cudnnFindRNNForwardTrainingAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workspace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workspace,\n        \"cudnnFindRNNForwardTrainingAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnFindRNNForwardTrainingAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpace,\n        \"cudnnFindRNNForwardTrainingAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnFindRNNForwardTrainingAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetRNNBackwardDataAlgorithmMaxCount(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    count: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetRNNBackwardDataAlgorithmMaxCount\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rnnDesc,\n        \"cudnnGetRNNBackwardDataAlgorithmMaxCount\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &count,\n        \"cudnnGetRNNBackwardDataAlgorithmMaxCount\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnFindRNNBackwardDataAlgorithmEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    seqLength: ::core::ffi::c_int,\n    yDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *const ::core::ffi::c_void,\n    dyDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dy: *const ::core::ffi::c_void,\n    dhyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dhy: *const ::core::ffi::c_void,\n    dcyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dcy: *const ::core::ffi::c_void,\n    wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    w: *const ::core::ffi::c_void,\n    hxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    hx: *const ::core::ffi::c_void,\n    cxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    cx: *const ::core::ffi::c_void,\n    dxDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dx: *mut ::core::ffi::c_void,\n    dhxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dhx: *mut ::core::ffi::c_void,\n    dcxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dcx: *mut ::core::ffi::c_void,\n    findIntensity: f32,\n    requestedAlgoCount: ::core::ffi::c_int,\n    returnedAlgoCount: *mut ::core::ffi::c_int,\n    perfResults: *mut cuda_types::cudnn8::cudnnAlgorithmPerformance_t,\n    workspace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    reserveSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rnnDesc,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seqLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &seqLength,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &y,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dyDesc,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dy,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dhyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dhyDesc,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dhy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dhy,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dcyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dcyDesc,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dcy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dcy,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &wDesc,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &w,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hxDesc,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hx,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cxDesc,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cx,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dxDesc,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dx,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dhxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dhxDesc,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dhx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dhx,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dcxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dcxDesc,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dcx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dcx,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(findIntensity), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &findIntensity,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(requestedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &requestedAlgoCount,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(returnedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &returnedAlgoCount,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(perfResults), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &perfResults,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workspace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workspace,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpace,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnFindRNNBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetRNNBackwardWeightsAlgorithmMaxCount(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    count: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetRNNBackwardWeightsAlgorithmMaxCount\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rnnDesc,\n        \"cudnnGetRNNBackwardWeightsAlgorithmMaxCount\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &count,\n        \"cudnnGetRNNBackwardWeightsAlgorithmMaxCount\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnFindRNNBackwardWeightsAlgorithmEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn8::cudnnRNNDescriptor_t,\n    seqLength: ::core::ffi::c_int,\n    xDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    hxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    hx: *const ::core::ffi::c_void,\n    yDesc: *const cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *const ::core::ffi::c_void,\n    findIntensity: f32,\n    requestedAlgoCount: ::core::ffi::c_int,\n    returnedAlgoCount: *mut ::core::ffi::c_int,\n    perfResults: *mut cuda_types::cudnn8::cudnnAlgorithmPerformance_t,\n    workspace: *const ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    dwDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    dw: *mut ::core::ffi::c_void,\n    reserveSpace: *const ::core::ffi::c_void,\n    reserveSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnFindRNNBackwardWeightsAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rnnDesc,\n        \"cudnnFindRNNBackwardWeightsAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seqLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &seqLength,\n        \"cudnnFindRNNBackwardWeightsAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnFindRNNBackwardWeightsAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cudnnFindRNNBackwardWeightsAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hxDesc,\n        \"cudnnFindRNNBackwardWeightsAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hx,\n        \"cudnnFindRNNBackwardWeightsAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnFindRNNBackwardWeightsAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &y,\n        \"cudnnFindRNNBackwardWeightsAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(findIntensity), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &findIntensity,\n        \"cudnnFindRNNBackwardWeightsAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(requestedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &requestedAlgoCount,\n        \"cudnnFindRNNBackwardWeightsAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(returnedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &returnedAlgoCount,\n        \"cudnnFindRNNBackwardWeightsAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(perfResults), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &perfResults,\n        \"cudnnFindRNNBackwardWeightsAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workspace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workspace,\n        \"cudnnFindRNNBackwardWeightsAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnFindRNNBackwardWeightsAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dwDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dwDesc,\n        \"cudnnFindRNNBackwardWeightsAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dw), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dw,\n        \"cudnnFindRNNBackwardWeightsAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpace,\n        \"cudnnFindRNNBackwardWeightsAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnFindRNNBackwardWeightsAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnMultiHeadAttnBackwardData(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    attnDesc: cuda_types::cudnn8::cudnnAttnDescriptor_t,\n    loWinIdx: *const ::core::ffi::c_int,\n    hiWinIdx: *const ::core::ffi::c_int,\n    devSeqLengthsDQDO: *const ::core::ffi::c_int,\n    devSeqLengthsDKDV: *const ::core::ffi::c_int,\n    doDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n    dout: *const ::core::ffi::c_void,\n    dqDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n    dqueries: *mut ::core::ffi::c_void,\n    queries: *const ::core::ffi::c_void,\n    dkDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n    dkeys: *mut ::core::ffi::c_void,\n    keys: *const ::core::ffi::c_void,\n    dvDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n    dvalues: *mut ::core::ffi::c_void,\n    values: *const ::core::ffi::c_void,\n    weightSizeInBytes: usize,\n    weights: *const ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    workSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSizeInBytes: usize,\n    reserveSpace: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &attnDesc,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(loWinIdx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &loWinIdx,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hiWinIdx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hiWinIdx,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devSeqLengthsDQDO), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &devSeqLengthsDQDO,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devSeqLengthsDKDV), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &devSeqLengthsDKDV,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(doDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &doDesc,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dout), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dout, \"cudnnMultiHeadAttnBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dqDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dqDesc,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dqueries), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dqueries,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(queries), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &queries,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dkDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dkDesc,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dkeys), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dkeys,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(keys), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&keys, \"cudnnMultiHeadAttnBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dvDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dvDesc,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dvalues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dvalues,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &values,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weightSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &weightSizeInBytes,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weights), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &weights,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpace,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpace,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnMultiHeadAttnBackwardWeights(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    attnDesc: cuda_types::cudnn8::cudnnAttnDescriptor_t,\n    addGrad: cuda_types::cudnn8::cudnnWgradMode_t,\n    qDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n    queries: *const ::core::ffi::c_void,\n    kDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n    keys: *const ::core::ffi::c_void,\n    vDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n    values: *const ::core::ffi::c_void,\n    doDesc: cuda_types::cudnn8::cudnnSeqDataDescriptor_t,\n    dout: *const ::core::ffi::c_void,\n    weightSizeInBytes: usize,\n    weights: *const ::core::ffi::c_void,\n    dweights: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    workSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSizeInBytes: usize,\n    reserveSpace: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &attnDesc,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(addGrad), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &addGrad,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(qDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &qDesc,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(queries), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &queries,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &kDesc,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(keys), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &keys,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vDesc,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &values,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(doDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &doDesc,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dout), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dout,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weightSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &weightSizeInBytes,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weights), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &weights,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dweights), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dweights,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpace,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpace,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreateCTCLossDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ctcLossDesc: *mut cuda_types::cudnn8::cudnnCTCLossDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ctcLossDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ctcLossDesc,\n        \"cudnnCreateCTCLossDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetCTCLossDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ctcLossDesc: cuda_types::cudnn8::cudnnCTCLossDescriptor_t,\n    compType: cuda_types::cudnn8::cudnnDataType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ctcLossDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ctcLossDesc,\n        \"cudnnSetCTCLossDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(compType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&compType, \"cudnnSetCTCLossDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetCTCLossDescriptorEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ctcLossDesc: cuda_types::cudnn8::cudnnCTCLossDescriptor_t,\n    compType: cuda_types::cudnn8::cudnnDataType_t,\n    normMode: cuda_types::cudnn8::cudnnLossNormalizationMode_t,\n    gradMode: cuda_types::cudnn8::cudnnNanPropagation_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ctcLossDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ctcLossDesc,\n        \"cudnnSetCTCLossDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(compType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &compType,\n        \"cudnnSetCTCLossDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normMode,\n        \"cudnnSetCTCLossDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gradMode,\n        \"cudnnSetCTCLossDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetCTCLossDescriptor_v8(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ctcLossDesc: cuda_types::cudnn8::cudnnCTCLossDescriptor_t,\n    compType: cuda_types::cudnn8::cudnnDataType_t,\n    normMode: cuda_types::cudnn8::cudnnLossNormalizationMode_t,\n    gradMode: cuda_types::cudnn8::cudnnNanPropagation_t,\n    maxLabelLength: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ctcLossDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ctcLossDesc,\n        \"cudnnSetCTCLossDescriptor_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(compType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &compType,\n        \"cudnnSetCTCLossDescriptor_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normMode,\n        \"cudnnSetCTCLossDescriptor_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gradMode,\n        \"cudnnSetCTCLossDescriptor_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxLabelLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxLabelLength,\n        \"cudnnSetCTCLossDescriptor_v8\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetCTCLossDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ctcLossDesc: cuda_types::cudnn8::cudnnCTCLossDescriptor_t,\n    compType: *mut cuda_types::cudnn8::cudnnDataType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ctcLossDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ctcLossDesc,\n        \"cudnnGetCTCLossDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(compType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&compType, \"cudnnGetCTCLossDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetCTCLossDescriptorEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ctcLossDesc: cuda_types::cudnn8::cudnnCTCLossDescriptor_t,\n    compType: *mut cuda_types::cudnn8::cudnnDataType_t,\n    normMode: *mut cuda_types::cudnn8::cudnnLossNormalizationMode_t,\n    gradMode: *mut cuda_types::cudnn8::cudnnNanPropagation_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ctcLossDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ctcLossDesc,\n        \"cudnnGetCTCLossDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(compType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &compType,\n        \"cudnnGetCTCLossDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normMode,\n        \"cudnnGetCTCLossDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gradMode,\n        \"cudnnGetCTCLossDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetCTCLossDescriptor_v8(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ctcLossDesc: cuda_types::cudnn8::cudnnCTCLossDescriptor_t,\n    compType: *mut cuda_types::cudnn8::cudnnDataType_t,\n    normMode: *mut cuda_types::cudnn8::cudnnLossNormalizationMode_t,\n    gradMode: *mut cuda_types::cudnn8::cudnnNanPropagation_t,\n    maxLabelLength: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ctcLossDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ctcLossDesc,\n        \"cudnnGetCTCLossDescriptor_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(compType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &compType,\n        \"cudnnGetCTCLossDescriptor_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normMode,\n        \"cudnnGetCTCLossDescriptor_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gradMode,\n        \"cudnnGetCTCLossDescriptor_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxLabelLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxLabelLength,\n        \"cudnnGetCTCLossDescriptor_v8\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyCTCLossDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ctcLossDesc: cuda_types::cudnn8::cudnnCTCLossDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ctcLossDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ctcLossDesc,\n        \"cudnnDestroyCTCLossDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCTCLoss(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    probsDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    probs: *const ::core::ffi::c_void,\n    hostLabels: *const ::core::ffi::c_int,\n    hostLabelLengths: *const ::core::ffi::c_int,\n    hostInputLengths: *const ::core::ffi::c_int,\n    costs: *mut ::core::ffi::c_void,\n    gradientsDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    gradients: *mut ::core::ffi::c_void,\n    algo: cuda_types::cudnn8::cudnnCTCLossAlgo_t,\n    ctcLossDesc: cuda_types::cudnn8::cudnnCTCLossDescriptor_t,\n    workspace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnCTCLoss\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(probsDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&probsDesc, \"cudnnCTCLoss\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(probs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&probs, \"cudnnCTCLoss\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hostLabels), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hostLabels, \"cudnnCTCLoss\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hostLabelLengths), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hostLabelLengths, \"cudnnCTCLoss\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hostInputLengths), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hostInputLengths, \"cudnnCTCLoss\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(costs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&costs, \"cudnnCTCLoss\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradientsDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&gradientsDesc, \"cudnnCTCLoss\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradients), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&gradients, \"cudnnCTCLoss\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cudnnCTCLoss\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ctcLossDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ctcLossDesc, \"cudnnCTCLoss\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workspace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workspace, \"cudnnCTCLoss\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSpaceSizeInBytes, \"cudnnCTCLoss\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCTCLoss_v8(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    algo: cuda_types::cudnn8::cudnnCTCLossAlgo_t,\n    ctcLossDesc: cuda_types::cudnn8::cudnnCTCLossDescriptor_t,\n    probsDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    probs: *const ::core::ffi::c_void,\n    labels: *const ::core::ffi::c_int,\n    labelLengths: *const ::core::ffi::c_int,\n    inputLengths: *const ::core::ffi::c_int,\n    costs: *mut ::core::ffi::c_void,\n    gradientsDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    gradients: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    workspace: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnCTCLoss_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cudnnCTCLoss_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ctcLossDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ctcLossDesc, \"cudnnCTCLoss_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(probsDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&probsDesc, \"cudnnCTCLoss_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(probs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&probs, \"cudnnCTCLoss_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(labels), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&labels, \"cudnnCTCLoss_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(labelLengths), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&labelLengths, \"cudnnCTCLoss_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inputLengths), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&inputLengths, \"cudnnCTCLoss_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(costs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&costs, \"cudnnCTCLoss_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradientsDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&gradientsDesc, \"cudnnCTCLoss_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradients), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&gradients, \"cudnnCTCLoss_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnCTCLoss_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workspace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workspace, \"cudnnCTCLoss_v8\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetCTCLossWorkspaceSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    probsDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    gradientsDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    labels: *const ::core::ffi::c_int,\n    labelLengths: *const ::core::ffi::c_int,\n    inputLengths: *const ::core::ffi::c_int,\n    algo: cuda_types::cudnn8::cudnnCTCLossAlgo_t,\n    ctcLossDesc: cuda_types::cudnn8::cudnnCTCLossDescriptor_t,\n    sizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnGetCTCLossWorkspaceSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(probsDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &probsDesc,\n        \"cudnnGetCTCLossWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradientsDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gradientsDesc,\n        \"cudnnGetCTCLossWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(labels), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&labels, \"cudnnGetCTCLossWorkspaceSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(labelLengths), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &labelLengths,\n        \"cudnnGetCTCLossWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inputLengths), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &inputLengths,\n        \"cudnnGetCTCLossWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cudnnGetCTCLossWorkspaceSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ctcLossDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ctcLossDesc,\n        \"cudnnGetCTCLossWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnGetCTCLossWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetCTCLossWorkspaceSize_v8(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    algo: cuda_types::cudnn8::cudnnCTCLossAlgo_t,\n    ctcLossDesc: cuda_types::cudnn8::cudnnCTCLossDescriptor_t,\n    probsDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    gradientsDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    sizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetCTCLossWorkspaceSize_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cudnnGetCTCLossWorkspaceSize_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ctcLossDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ctcLossDesc,\n        \"cudnnGetCTCLossWorkspaceSize_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(probsDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &probsDesc,\n        \"cudnnGetCTCLossWorkspaceSize_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradientsDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gradientsDesc,\n        \"cudnnGetCTCLossWorkspaceSize_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnGetCTCLossWorkspaceSize_v8\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnAdvTrainVersionCheck(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn8::cudnnConvolutionFwdAlgoPerfStruct {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(algo), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.algo, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(status), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.status, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(time), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.time, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(memory), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.memory, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(determinism), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.determinism, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(mathType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.mathType, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\npub fn write_cudnnCreateConvolutionDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    convDesc: *mut cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnCreateConvolutionDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyConvolutionDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnDestroyConvolutionDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetConvolutionMathType(\n    writer: &mut (impl std::io::Write + ?Sized),\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    mathType: cuda_types::cudnn8::cudnnMathType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnSetConvolutionMathType\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mathType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mathType,\n        \"cudnnSetConvolutionMathType\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetConvolutionMathType(\n    writer: &mut (impl std::io::Write + ?Sized),\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    mathType: *mut cuda_types::cudnn8::cudnnMathType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnGetConvolutionMathType\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mathType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mathType,\n        \"cudnnGetConvolutionMathType\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetConvolutionGroupCount(\n    writer: &mut (impl std::io::Write + ?Sized),\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    groupCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnSetConvolutionGroupCount\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(groupCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &groupCount,\n        \"cudnnSetConvolutionGroupCount\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetConvolutionGroupCount(\n    writer: &mut (impl std::io::Write + ?Sized),\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    groupCount: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnGetConvolutionGroupCount\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(groupCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &groupCount,\n        \"cudnnGetConvolutionGroupCount\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetConvolutionReorderType(\n    writer: &mut (impl std::io::Write + ?Sized),\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    reorderType: cuda_types::cudnn8::cudnnReorderType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnSetConvolutionReorderType\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reorderType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reorderType,\n        \"cudnnSetConvolutionReorderType\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetConvolutionReorderType(\n    writer: &mut (impl std::io::Write + ?Sized),\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    reorderType: *mut cuda_types::cudnn8::cudnnReorderType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnGetConvolutionReorderType\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reorderType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reorderType,\n        \"cudnnGetConvolutionReorderType\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetConvolution2dDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    pad_h: ::core::ffi::c_int,\n    pad_w: ::core::ffi::c_int,\n    u: ::core::ffi::c_int,\n    v: ::core::ffi::c_int,\n    dilation_h: ::core::ffi::c_int,\n    dilation_w: ::core::ffi::c_int,\n    mode: cuda_types::cudnn8::cudnnConvolutionMode_t,\n    computeType: cuda_types::cudnn8::cudnnDataType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnSetConvolution2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pad_h), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pad_h,\n        \"cudnnSetConvolution2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pad_w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pad_w,\n        \"cudnnSetConvolution2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(u), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&u, \"cudnnSetConvolution2dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(v), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&v, \"cudnnSetConvolution2dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dilation_h), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dilation_h,\n        \"cudnnSetConvolution2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dilation_w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dilation_w,\n        \"cudnnSetConvolution2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnSetConvolution2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &computeType,\n        \"cudnnSetConvolution2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetConvolution2dDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    pad_h: *mut ::core::ffi::c_int,\n    pad_w: *mut ::core::ffi::c_int,\n    u: *mut ::core::ffi::c_int,\n    v: *mut ::core::ffi::c_int,\n    dilation_h: *mut ::core::ffi::c_int,\n    dilation_w: *mut ::core::ffi::c_int,\n    mode: *mut cuda_types::cudnn8::cudnnConvolutionMode_t,\n    computeType: *mut cuda_types::cudnn8::cudnnDataType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnGetConvolution2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pad_h), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pad_h,\n        \"cudnnGetConvolution2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pad_w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pad_w,\n        \"cudnnGetConvolution2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(u), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&u, \"cudnnGetConvolution2dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(v), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&v, \"cudnnGetConvolution2dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dilation_h), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dilation_h,\n        \"cudnnGetConvolution2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dilation_w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dilation_w,\n        \"cudnnGetConvolution2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnGetConvolution2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &computeType,\n        \"cudnnGetConvolution2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetConvolutionNdDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    arrayLength: ::core::ffi::c_int,\n    padA: *const ::core::ffi::c_int,\n    filterStrideA: *const ::core::ffi::c_int,\n    dilationA: *const ::core::ffi::c_int,\n    mode: cuda_types::cudnn8::cudnnConvolutionMode_t,\n    computeType: cuda_types::cudnn8::cudnnDataType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnSetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(arrayLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &arrayLength,\n        \"cudnnSetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(padA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &padA,\n        \"cudnnSetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(filterStrideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterStrideA,\n        \"cudnnSetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dilationA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dilationA,\n        \"cudnnSetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnSetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &computeType,\n        \"cudnnSetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetConvolutionNdDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    arrayLengthRequested: ::core::ffi::c_int,\n    arrayLength: *mut ::core::ffi::c_int,\n    padA: *mut ::core::ffi::c_int,\n    strideA: *mut ::core::ffi::c_int,\n    dilationA: *mut ::core::ffi::c_int,\n    mode: *mut cuda_types::cudnn8::cudnnConvolutionMode_t,\n    computeType: *mut cuda_types::cudnn8::cudnnDataType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnGetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(arrayLengthRequested), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &arrayLengthRequested,\n        \"cudnnGetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(arrayLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &arrayLength,\n        \"cudnnGetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(padA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &padA,\n        \"cudnnGetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideA,\n        \"cudnnGetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dilationA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dilationA,\n        \"cudnnGetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnGetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &computeType,\n        \"cudnnGetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetConvolution2dForwardOutputDim(\n    writer: &mut (impl std::io::Write + ?Sized),\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    inputTensorDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    filterDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    n: *mut ::core::ffi::c_int,\n    c: *mut ::core::ffi::c_int,\n    h: *mut ::core::ffi::c_int,\n    w: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnGetConvolution2dForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inputTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &inputTensorDesc,\n        \"cudnnGetConvolution2dForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(filterDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDesc,\n        \"cudnnGetConvolution2dForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &n,\n        \"cudnnGetConvolution2dForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &c,\n        \"cudnnGetConvolution2dForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(h), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &h,\n        \"cudnnGetConvolution2dForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &w,\n        \"cudnnGetConvolution2dForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetConvolutionNdForwardOutputDim(\n    writer: &mut (impl std::io::Write + ?Sized),\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    inputTensorDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    filterDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    nbDims: ::core::ffi::c_int,\n    tensorOuputDimA: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnGetConvolutionNdForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inputTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &inputTensorDesc,\n        \"cudnnGetConvolutionNdForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(filterDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDesc,\n        \"cudnnGetConvolutionNdForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDims), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nbDims,\n        \"cudnnGetConvolutionNdForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(tensorOuputDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &tensorOuputDimA,\n        \"cudnnGetConvolutionNdForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetConvolutionForwardAlgorithmMaxCount(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    count: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetConvolutionForwardAlgorithmMaxCount\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &count,\n        \"cudnnGetConvolutionForwardAlgorithmMaxCount\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetConvolutionForwardAlgorithm_v7(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    srcDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    filterDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    destDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    requestedAlgoCount: ::core::ffi::c_int,\n    returnedAlgoCount: *mut ::core::ffi::c_int,\n    perfResults: *mut cuda_types::cudnn8::cudnnConvolutionFwdAlgoPerf_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetConvolutionForwardAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &srcDesc,\n        \"cudnnGetConvolutionForwardAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(filterDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDesc,\n        \"cudnnGetConvolutionForwardAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnGetConvolutionForwardAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(destDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &destDesc,\n        \"cudnnGetConvolutionForwardAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(requestedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &requestedAlgoCount,\n        \"cudnnGetConvolutionForwardAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(returnedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &returnedAlgoCount,\n        \"cudnnGetConvolutionForwardAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(perfResults), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &perfResults,\n        \"cudnnGetConvolutionForwardAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnFindConvolutionForwardAlgorithm(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    requestedAlgoCount: ::core::ffi::c_int,\n    returnedAlgoCount: *mut ::core::ffi::c_int,\n    perfResults: *mut cuda_types::cudnn8::cudnnConvolutionFwdAlgoPerf_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnFindConvolutionForwardAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnFindConvolutionForwardAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &wDesc,\n        \"cudnnFindConvolutionForwardAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnFindConvolutionForwardAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnFindConvolutionForwardAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(requestedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &requestedAlgoCount,\n        \"cudnnFindConvolutionForwardAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(returnedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &returnedAlgoCount,\n        \"cudnnFindConvolutionForwardAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(perfResults), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &perfResults,\n        \"cudnnFindConvolutionForwardAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnFindConvolutionForwardAlgorithmEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    w: *const ::core::ffi::c_void,\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n    requestedAlgoCount: ::core::ffi::c_int,\n    returnedAlgoCount: *mut ::core::ffi::c_int,\n    perfResults: *mut cuda_types::cudnn8::cudnnConvolutionFwdAlgoPerf_t,\n    workSpace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnFindConvolutionForwardAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnFindConvolutionForwardAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cudnnFindConvolutionForwardAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &wDesc,\n        \"cudnnFindConvolutionForwardAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &w,\n        \"cudnnFindConvolutionForwardAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnFindConvolutionForwardAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnFindConvolutionForwardAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &y,\n        \"cudnnFindConvolutionForwardAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(requestedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &requestedAlgoCount,\n        \"cudnnFindConvolutionForwardAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(returnedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &returnedAlgoCount,\n        \"cudnnFindConvolutionForwardAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(perfResults), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &perfResults,\n        \"cudnnFindConvolutionForwardAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpace,\n        \"cudnnFindConvolutionForwardAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnFindConvolutionForwardAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnIm2Col(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    colBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnIm2Col\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnIm2Col\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnIm2Col\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&wDesc, \"cudnnIm2Col\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&convDesc, \"cudnnIm2Col\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&colBuffer, \"cudnnIm2Col\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnReorderFilterAndBias(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    filterDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    reorderType: cuda_types::cudnn8::cudnnReorderType_t,\n    filterData: *const ::core::ffi::c_void,\n    reorderedFilterData: *mut ::core::ffi::c_void,\n    reorderBias: ::core::ffi::c_int,\n    biasData: *const ::core::ffi::c_void,\n    reorderedBiasData: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnReorderFilterAndBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(filterDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDesc,\n        \"cudnnReorderFilterAndBias\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reorderType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reorderType,\n        \"cudnnReorderFilterAndBias\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(filterData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterData,\n        \"cudnnReorderFilterAndBias\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reorderedFilterData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reorderedFilterData,\n        \"cudnnReorderFilterAndBias\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reorderBias), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reorderBias,\n        \"cudnnReorderFilterAndBias\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(biasData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&biasData, \"cudnnReorderFilterAndBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reorderedBiasData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reorderedBiasData,\n        \"cudnnReorderFilterAndBias\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetConvolutionForwardWorkspaceSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    algo: cuda_types::cudnn8::cudnnConvolutionFwdAlgo_t,\n    sizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetConvolutionForwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnGetConvolutionForwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &wDesc,\n        \"cudnnGetConvolutionForwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnGetConvolutionForwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnGetConvolutionForwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cudnnGetConvolutionForwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnGetConvolutionForwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnConvolutionForward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    alpha: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    w: *const ::core::ffi::c_void,\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    algo: cuda_types::cudnn8::cudnnConvolutionFwdAlgo_t,\n    workSpace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    beta: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnConvolutionForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnConvolutionForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnConvolutionForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnConvolutionForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&wDesc, \"cudnnConvolutionForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&w, \"cudnnConvolutionForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&convDesc, \"cudnnConvolutionForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cudnnConvolutionForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSpace, \"cudnnConvolutionForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnConvolutionForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnConvolutionForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnConvolutionForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnConvolutionForward\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnConvolutionBiasActivationForward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    alpha1: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    w: *const ::core::ffi::c_void,\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    algo: cuda_types::cudnn8::cudnnConvolutionFwdAlgo_t,\n    workSpace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    alpha2: *const ::core::ffi::c_void,\n    zDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    z: *const ::core::ffi::c_void,\n    biasDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    bias: *const ::core::ffi::c_void,\n    activationDesc: cuda_types::cudnn8::cudnnActivationDescriptor_t,\n    yDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha1,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &wDesc,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &w,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpace,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha2,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(zDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &zDesc,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(z), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &z,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(biasDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &biasDesc,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bias), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bias,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &y,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn8::cudnnConvolutionBwdDataAlgoPerfStruct {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(algo), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.algo, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(status), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.status, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(time), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.time, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(memory), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.memory, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(determinism), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.determinism, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(mathType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.mathType, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\npub fn write_cudnnGetConvolutionBackwardDataAlgorithmMaxCount(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    count: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetConvolutionBackwardDataAlgorithmMaxCount\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &count,\n        \"cudnnGetConvolutionBackwardDataAlgorithmMaxCount\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnFindConvolutionBackwardDataAlgorithm(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    dxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    requestedAlgoCount: ::core::ffi::c_int,\n    returnedAlgoCount: *mut ::core::ffi::c_int,\n    perfResults: *mut cuda_types::cudnn8::cudnnConvolutionBwdDataAlgoPerf_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnFindConvolutionBackwardDataAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &wDesc,\n        \"cudnnFindConvolutionBackwardDataAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dyDesc,\n        \"cudnnFindConvolutionBackwardDataAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnFindConvolutionBackwardDataAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dxDesc,\n        \"cudnnFindConvolutionBackwardDataAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(requestedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &requestedAlgoCount,\n        \"cudnnFindConvolutionBackwardDataAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(returnedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &returnedAlgoCount,\n        \"cudnnFindConvolutionBackwardDataAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(perfResults), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &perfResults,\n        \"cudnnFindConvolutionBackwardDataAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnFindConvolutionBackwardDataAlgorithmEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    w: *const ::core::ffi::c_void,\n    dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dy: *const ::core::ffi::c_void,\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    dxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dx: *mut ::core::ffi::c_void,\n    requestedAlgoCount: ::core::ffi::c_int,\n    returnedAlgoCount: *mut ::core::ffi::c_int,\n    perfResults: *mut cuda_types::cudnn8::cudnnConvolutionBwdDataAlgoPerf_t,\n    workSpace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnFindConvolutionBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &wDesc,\n        \"cudnnFindConvolutionBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &w,\n        \"cudnnFindConvolutionBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dyDesc,\n        \"cudnnFindConvolutionBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dy,\n        \"cudnnFindConvolutionBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnFindConvolutionBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dxDesc,\n        \"cudnnFindConvolutionBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dx,\n        \"cudnnFindConvolutionBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(requestedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &requestedAlgoCount,\n        \"cudnnFindConvolutionBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(returnedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &returnedAlgoCount,\n        \"cudnnFindConvolutionBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(perfResults), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &perfResults,\n        \"cudnnFindConvolutionBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpace,\n        \"cudnnFindConvolutionBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnFindConvolutionBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetConvolutionBackwardDataAlgorithm_v7(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    filterDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    diffDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    gradDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    requestedAlgoCount: ::core::ffi::c_int,\n    returnedAlgoCount: *mut ::core::ffi::c_int,\n    perfResults: *mut cuda_types::cudnn8::cudnnConvolutionBwdDataAlgoPerf_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetConvolutionBackwardDataAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(filterDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDesc,\n        \"cudnnGetConvolutionBackwardDataAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diffDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &diffDesc,\n        \"cudnnGetConvolutionBackwardDataAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnGetConvolutionBackwardDataAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gradDesc,\n        \"cudnnGetConvolutionBackwardDataAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(requestedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &requestedAlgoCount,\n        \"cudnnGetConvolutionBackwardDataAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(returnedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &returnedAlgoCount,\n        \"cudnnGetConvolutionBackwardDataAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(perfResults), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &perfResults,\n        \"cudnnGetConvolutionBackwardDataAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetConvolutionBackwardDataWorkspaceSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    dxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    algo: cuda_types::cudnn8::cudnnConvolutionBwdDataAlgo_t,\n    sizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetConvolutionBackwardDataWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &wDesc,\n        \"cudnnGetConvolutionBackwardDataWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dyDesc,\n        \"cudnnGetConvolutionBackwardDataWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnGetConvolutionBackwardDataWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dxDesc,\n        \"cudnnGetConvolutionBackwardDataWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cudnnGetConvolutionBackwardDataWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnGetConvolutionBackwardDataWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnConvolutionBackwardData(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    alpha: *const ::core::ffi::c_void,\n    wDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    w: *const ::core::ffi::c_void,\n    dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dy: *const ::core::ffi::c_void,\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    algo: cuda_types::cudnn8::cudnnConvolutionBwdDataAlgo_t,\n    workSpace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    beta: *const ::core::ffi::c_void,\n    dxDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dx: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnConvolutionBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnConvolutionBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&wDesc, \"cudnnConvolutionBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&w, \"cudnnConvolutionBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dyDesc, \"cudnnConvolutionBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dy, \"cudnnConvolutionBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnConvolutionBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cudnnConvolutionBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpace,\n        \"cudnnConvolutionBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnConvolutionBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnConvolutionBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dxDesc, \"cudnnConvolutionBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dx, \"cudnnConvolutionBackwardData\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetFoldedConvBackwardDataDescriptors(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    filterDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    diffDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    gradDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    transformFormat: cuda_types::cudnn8::cudnnTensorFormat_t,\n    foldedFilterDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    paddedDiffDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    foldedConvDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    foldedGradDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    filterFoldTransDesc: cuda_types::cudnn8::cudnnTensorTransformDescriptor_t,\n    diffPadTransDesc: cuda_types::cudnn8::cudnnTensorTransformDescriptor_t,\n    gradFoldTransDesc: cuda_types::cudnn8::cudnnTensorTransformDescriptor_t,\n    gradUnfoldTransDesc: cuda_types::cudnn8::cudnnTensorTransformDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetFoldedConvBackwardDataDescriptors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(filterDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDesc,\n        \"cudnnGetFoldedConvBackwardDataDescriptors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diffDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &diffDesc,\n        \"cudnnGetFoldedConvBackwardDataDescriptors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnGetFoldedConvBackwardDataDescriptors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gradDesc,\n        \"cudnnGetFoldedConvBackwardDataDescriptors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transformFormat), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transformFormat,\n        \"cudnnGetFoldedConvBackwardDataDescriptors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(foldedFilterDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &foldedFilterDesc,\n        \"cudnnGetFoldedConvBackwardDataDescriptors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paddedDiffDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paddedDiffDesc,\n        \"cudnnGetFoldedConvBackwardDataDescriptors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(foldedConvDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &foldedConvDesc,\n        \"cudnnGetFoldedConvBackwardDataDescriptors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(foldedGradDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &foldedGradDesc,\n        \"cudnnGetFoldedConvBackwardDataDescriptors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(filterFoldTransDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterFoldTransDesc,\n        \"cudnnGetFoldedConvBackwardDataDescriptors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diffPadTransDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &diffPadTransDesc,\n        \"cudnnGetFoldedConvBackwardDataDescriptors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradFoldTransDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gradFoldTransDesc,\n        \"cudnnGetFoldedConvBackwardDataDescriptors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradUnfoldTransDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gradUnfoldTransDesc,\n        \"cudnnGetFoldedConvBackwardDataDescriptors\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCnnInferVersionCheck(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn8::cudnnConvolutionBwdFilterAlgoPerfStruct {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(algo), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.algo, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(status), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.status, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(time), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.time, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(memory), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.memory, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(determinism), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.determinism, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(mathType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.mathType, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\npub fn write_cudnnGetConvolutionBackwardFilterAlgorithmMaxCount(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    count: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetConvolutionBackwardFilterAlgorithmMaxCount\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &count,\n        \"cudnnGetConvolutionBackwardFilterAlgorithmMaxCount\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnFindConvolutionBackwardFilterAlgorithm(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    dwDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    requestedAlgoCount: ::core::ffi::c_int,\n    returnedAlgoCount: *mut ::core::ffi::c_int,\n    perfResults: *mut cuda_types::cudnn8::cudnnConvolutionBwdFilterAlgoPerf_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnFindConvolutionBackwardFilterAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnFindConvolutionBackwardFilterAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dyDesc,\n        \"cudnnFindConvolutionBackwardFilterAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnFindConvolutionBackwardFilterAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dwDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dwDesc,\n        \"cudnnFindConvolutionBackwardFilterAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(requestedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &requestedAlgoCount,\n        \"cudnnFindConvolutionBackwardFilterAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(returnedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &returnedAlgoCount,\n        \"cudnnFindConvolutionBackwardFilterAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(perfResults), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &perfResults,\n        \"cudnnFindConvolutionBackwardFilterAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnFindConvolutionBackwardFilterAlgorithmEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    y: *const ::core::ffi::c_void,\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    dwDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    dw: *mut ::core::ffi::c_void,\n    requestedAlgoCount: ::core::ffi::c_int,\n    returnedAlgoCount: *mut ::core::ffi::c_int,\n    perfResults: *mut cuda_types::cudnn8::cudnnConvolutionBwdFilterAlgoPerf_t,\n    workSpace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnFindConvolutionBackwardFilterAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnFindConvolutionBackwardFilterAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cudnnFindConvolutionBackwardFilterAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dyDesc,\n        \"cudnnFindConvolutionBackwardFilterAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &y,\n        \"cudnnFindConvolutionBackwardFilterAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnFindConvolutionBackwardFilterAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dwDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dwDesc,\n        \"cudnnFindConvolutionBackwardFilterAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dw), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dw,\n        \"cudnnFindConvolutionBackwardFilterAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(requestedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &requestedAlgoCount,\n        \"cudnnFindConvolutionBackwardFilterAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(returnedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &returnedAlgoCount,\n        \"cudnnFindConvolutionBackwardFilterAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(perfResults), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &perfResults,\n        \"cudnnFindConvolutionBackwardFilterAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpace,\n        \"cudnnFindConvolutionBackwardFilterAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnFindConvolutionBackwardFilterAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetConvolutionBackwardFilterAlgorithm_v7(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    srcDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    diffDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    gradDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    requestedAlgoCount: ::core::ffi::c_int,\n    returnedAlgoCount: *mut ::core::ffi::c_int,\n    perfResults: *mut cuda_types::cudnn8::cudnnConvolutionBwdFilterAlgoPerf_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetConvolutionBackwardFilterAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &srcDesc,\n        \"cudnnGetConvolutionBackwardFilterAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diffDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &diffDesc,\n        \"cudnnGetConvolutionBackwardFilterAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnGetConvolutionBackwardFilterAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gradDesc,\n        \"cudnnGetConvolutionBackwardFilterAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(requestedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &requestedAlgoCount,\n        \"cudnnGetConvolutionBackwardFilterAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(returnedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &returnedAlgoCount,\n        \"cudnnGetConvolutionBackwardFilterAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(perfResults), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &perfResults,\n        \"cudnnGetConvolutionBackwardFilterAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetConvolutionBackwardFilterWorkspaceSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    gradDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    algo: cuda_types::cudnn8::cudnnConvolutionBwdFilterAlgo_t,\n    sizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetConvolutionBackwardFilterWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnGetConvolutionBackwardFilterWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dyDesc,\n        \"cudnnGetConvolutionBackwardFilterWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnGetConvolutionBackwardFilterWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gradDesc,\n        \"cudnnGetConvolutionBackwardFilterWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cudnnGetConvolutionBackwardFilterWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnGetConvolutionBackwardFilterWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnConvolutionBackwardFilter(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    alpha: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dy: *const ::core::ffi::c_void,\n    convDesc: cuda_types::cudnn8::cudnnConvolutionDescriptor_t,\n    algo: cuda_types::cudnn8::cudnnConvolutionBwdFilterAlgo_t,\n    workSpace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    beta: *const ::core::ffi::c_void,\n    dwDesc: cuda_types::cudnn8::cudnnFilterDescriptor_t,\n    dw: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnConvolutionBackwardFilter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha,\n        \"cudnnConvolutionBackwardFilter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnConvolutionBackwardFilter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnConvolutionBackwardFilter\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dyDesc,\n        \"cudnnConvolutionBackwardFilter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dy, \"cudnnConvolutionBackwardFilter\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnConvolutionBackwardFilter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cudnnConvolutionBackwardFilter\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpace,\n        \"cudnnConvolutionBackwardFilter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnConvolutionBackwardFilter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnConvolutionBackwardFilter\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dwDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dwDesc,\n        \"cudnnConvolutionBackwardFilter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dw), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dw, \"cudnnConvolutionBackwardFilter\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnConvolutionBackwardBias(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    alpha: *const ::core::ffi::c_void,\n    dyDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    dy: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    dbDesc: cuda_types::cudnn8::cudnnTensorDescriptor_t,\n    db: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnConvolutionBackwardBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnConvolutionBackwardBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dyDesc, \"cudnnConvolutionBackwardBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dy, \"cudnnConvolutionBackwardBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnConvolutionBackwardBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dbDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dbDesc, \"cudnnConvolutionBackwardBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(db), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&db, \"cudnnConvolutionBackwardBias\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreateFusedOpsConstParamPack(\n    writer: &mut (impl std::io::Write + ?Sized),\n    constPack: *mut cuda_types::cudnn8::cudnnFusedOpsConstParamPack_t,\n    ops: cuda_types::cudnn8::cudnnFusedOps_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(constPack), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &constPack,\n        \"cudnnCreateFusedOpsConstParamPack\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ops), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ops,\n        \"cudnnCreateFusedOpsConstParamPack\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyFusedOpsConstParamPack(\n    writer: &mut (impl std::io::Write + ?Sized),\n    constPack: cuda_types::cudnn8::cudnnFusedOpsConstParamPack_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(constPack), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &constPack,\n        \"cudnnDestroyFusedOpsConstParamPack\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetFusedOpsConstParamPackAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    constPack: cuda_types::cudnn8::cudnnFusedOpsConstParamPack_t,\n    paramLabel: cuda_types::cudnn8::cudnnFusedOpsConstParamLabel_t,\n    param: *const ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(constPack), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &constPack,\n        \"cudnnSetFusedOpsConstParamPackAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paramLabel), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paramLabel,\n        \"cudnnSetFusedOpsConstParamPackAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param,\n        \"cudnnSetFusedOpsConstParamPackAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetFusedOpsConstParamPackAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    constPack: cuda_types::cudnn8::cudnnFusedOpsConstParamPack_t,\n    paramLabel: cuda_types::cudnn8::cudnnFusedOpsConstParamLabel_t,\n    param: *mut ::core::ffi::c_void,\n    isNULL: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(constPack), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &constPack,\n        \"cudnnGetFusedOpsConstParamPackAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paramLabel), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paramLabel,\n        \"cudnnGetFusedOpsConstParamPackAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param,\n        \"cudnnGetFusedOpsConstParamPackAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(isNULL), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &isNULL,\n        \"cudnnGetFusedOpsConstParamPackAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreateFusedOpsVariantParamPack(\n    writer: &mut (impl std::io::Write + ?Sized),\n    varPack: *mut cuda_types::cudnn8::cudnnFusedOpsVariantParamPack_t,\n    ops: cuda_types::cudnn8::cudnnFusedOps_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(varPack), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &varPack,\n        \"cudnnCreateFusedOpsVariantParamPack\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ops), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ops,\n        \"cudnnCreateFusedOpsVariantParamPack\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyFusedOpsVariantParamPack(\n    writer: &mut (impl std::io::Write + ?Sized),\n    varPack: cuda_types::cudnn8::cudnnFusedOpsVariantParamPack_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(varPack), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &varPack,\n        \"cudnnDestroyFusedOpsVariantParamPack\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetFusedOpsVariantParamPackAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    varPack: cuda_types::cudnn8::cudnnFusedOpsVariantParamPack_t,\n    paramLabel: cuda_types::cudnn8::cudnnFusedOpsVariantParamLabel_t,\n    ptr: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(varPack), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &varPack,\n        \"cudnnSetFusedOpsVariantParamPackAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paramLabel), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paramLabel,\n        \"cudnnSetFusedOpsVariantParamPackAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ptr,\n        \"cudnnSetFusedOpsVariantParamPackAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetFusedOpsVariantParamPackAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    varPack: cuda_types::cudnn8::cudnnFusedOpsVariantParamPack_t,\n    paramLabel: cuda_types::cudnn8::cudnnFusedOpsVariantParamLabel_t,\n    ptr: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(varPack), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &varPack,\n        \"cudnnGetFusedOpsVariantParamPackAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paramLabel), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paramLabel,\n        \"cudnnGetFusedOpsVariantParamPackAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ptr,\n        \"cudnnGetFusedOpsVariantParamPackAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreateFusedOpsPlan(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: *mut cuda_types::cudnn8::cudnnFusedOpsPlan_t,\n    ops: cuda_types::cudnn8::cudnnFusedOps_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cudnnCreateFusedOpsPlan\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ops), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ops, \"cudnnCreateFusedOpsPlan\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyFusedOpsPlan(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cudnn8::cudnnFusedOpsPlan_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cudnnDestroyFusedOpsPlan\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnMakeFusedOpsPlan(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    plan: cuda_types::cudnn8::cudnnFusedOpsPlan_t,\n    constPack: cuda_types::cudnn8::cudnnFusedOpsConstParamPack_t,\n    workspaceSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnMakeFusedOpsPlan\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cudnnMakeFusedOpsPlan\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(constPack), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&constPack, \"cudnnMakeFusedOpsPlan\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workspaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workspaceSizeInBytes,\n        \"cudnnMakeFusedOpsPlan\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnFusedOpsExecute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    plan: cuda_types::cudnn8::cudnnFusedOpsPlan_t,\n    varPack: cuda_types::cudnn8::cudnnFusedOpsVariantParamPack_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnFusedOpsExecute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cudnnFusedOpsExecute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(varPack), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&varPack, \"cudnnFusedOpsExecute\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCnnTrainVersionCheck(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn8::cudnnBackendNumericalNote_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn8::cudnnBackendNumericalNote_t::CUDNN_NUMERICAL_NOTE_TENSOR_CORE => {\n                writer.write_all(stringify!(CUDNN_NUMERICAL_NOTE_TENSOR_CORE).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendNumericalNote_t::CUDNN_NUMERICAL_NOTE_DOWN_CONVERT_INPUTS => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_NUMERICAL_NOTE_DOWN_CONVERT_INPUTS).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn8::cudnnBackendNumericalNote_t::CUDNN_NUMERICAL_NOTE_REDUCED_PRECISION_REDUCTION => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_NUMERICAL_NOTE_REDUCED_PRECISION_REDUCTION)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn8::cudnnBackendNumericalNote_t::CUDNN_NUMERICAL_NOTE_FFT => {\n                writer.write_all(stringify!(CUDNN_NUMERICAL_NOTE_FFT).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendNumericalNote_t::CUDNN_NUMERICAL_NOTE_NONDETERMINISTIC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_NUMERICAL_NOTE_NONDETERMINISTIC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn8::cudnnBackendNumericalNote_t::CUDNN_NUMERICAL_NOTE_WINOGRAD => {\n                writer.write_all(stringify!(CUDNN_NUMERICAL_NOTE_WINOGRAD).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendNumericalNote_t::CUDNN_NUMERICAL_NOTE_WINOGRAD_TILE_4x4 => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_NUMERICAL_NOTE_WINOGRAD_TILE_4x4).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn8::cudnnBackendNumericalNote_t::CUDNN_NUMERICAL_NOTE_WINOGRAD_TILE_6x6 => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_NUMERICAL_NOTE_WINOGRAD_TILE_6x6).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn8::cudnnBackendNumericalNote_t::CUDNN_NUMERICAL_NOTE_WINOGRAD_TILE_13x13 => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_NUMERICAL_NOTE_WINOGRAD_TILE_13x13).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn8::cudnnBackendNumericalNote_t::CUDNN_NUMERICAL_NOTE_TYPE_COUNT => {\n                writer.write_all(stringify!(CUDNN_NUMERICAL_NOTE_TYPE_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn8::cudnnBackendBehaviorNote_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn8::cudnnBackendBehaviorNote_t::CUDNN_BEHAVIOR_NOTE_RUNTIME_COMPILATION => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BEHAVIOR_NOTE_RUNTIME_COMPILATION).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn8::cudnnBackendBehaviorNote_t::CUDNN_BEHAVIOR_NOTE_REQUIRES_FILTER_INT8x32_REORDER => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BEHAVIOR_NOTE_REQUIRES_FILTER_INT8x32_REORDER)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn8::cudnnBackendBehaviorNote_t::CUDNN_BEHAVIOR_NOTE_REQUIRES_BIAS_INT8x32_REORDER => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BEHAVIOR_NOTE_REQUIRES_BIAS_INT8x32_REORDER)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn8::cudnnBackendBehaviorNote_t::CUDNN_BEHAVIOR_NOTE_TYPE_COUNT => {\n                writer.write_all(stringify!(CUDNN_BEHAVIOR_NOTE_TYPE_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn8::cudnnBackendKnobType_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_SPLIT_K => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_SPLIT_K).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_SWIZZLE => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_SWIZZLE).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_TILE_SIZE => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_TILE_SIZE).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_USE_TEX => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_USE_TEX).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_EDGE => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_EDGE).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_KBLOCK => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_KBLOCK).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_LDGA => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_LDGA).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_LDGB => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_LDGB).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_CHUNK_K => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_CHUNK_K).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_SPLIT_H => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_SPLIT_H).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_WINO_TILE => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_WINO_TILE).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_MULTIPLY => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_MULTIPLY).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_SPLIT_K_BUF => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_SPLIT_K_BUF).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_TILEK => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_TILEK).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_STAGES => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_STAGES).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_REDUCTION_MODE => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_REDUCTION_MODE).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_CTA_SPLIT_K_MODE => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_CTA_SPLIT_K_MODE).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_SPLIT_K_SLC => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_SPLIT_K_SLC).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_IDX_MODE => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_IDX_MODE).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_SLICED => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_SLICED).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_SPLIT_RS => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_SPLIT_RS).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_SINGLEBUFFER => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_SINGLEBUFFER).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_LDGC => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_LDGC).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_SPECFILT => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_SPECFILT).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_KERNEL_CFG => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_KERNEL_CFG).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_WORKSPACE => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_WORKSPACE).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_TILE_CGA => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_TILE_CGA).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_TILE_CGA_M => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_TILE_CGA_M).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_TILE_CGA_N => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_TILE_CGA_N).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_BLOCK_SIZE => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_BLOCK_SIZE).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_OCCUPANCY => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_OCCUPANCY).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_ARRAY_SIZE_PER_THREAD => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_KNOB_TYPE_ARRAY_SIZE_PER_THREAD).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_NUM_C_PER_BLOCK => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_NUM_C_PER_BLOCK).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_SPLIT_COLS => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_SPLIT_COLS).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_TILE_ROWS => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_TILE_ROWS).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_TILE_COLS => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_TILE_COLS).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_LOAD_SIZE => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_LOAD_SIZE).as_bytes())\n            }\n            &cuda_types::cudnn8::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_COUNTS => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_COUNTS).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cudnnBackendCreateDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    descriptorType: cuda_types::cudnn8::cudnnBackendDescriptorType_t,\n    descriptor: *mut cuda_types::cudnn8::cudnnBackendDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(descriptorType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descriptorType,\n        \"cudnnBackendCreateDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descriptor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descriptor,\n        \"cudnnBackendCreateDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnBackendDestroyDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    descriptor: cuda_types::cudnn8::cudnnBackendDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(descriptor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descriptor,\n        \"cudnnBackendDestroyDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnBackendInitialize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    descriptor: cuda_types::cudnn8::cudnnBackendDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(descriptor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descriptor, \"cudnnBackendInitialize\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnBackendFinalize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    descriptor: cuda_types::cudnn8::cudnnBackendDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(descriptor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descriptor, \"cudnnBackendFinalize\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnBackendExecute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn8::cudnnHandle_t,\n    executionPlan: cuda_types::cudnn8::cudnnBackendDescriptor_t,\n    variantPack: cuda_types::cudnn8::cudnnBackendDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnBackendExecute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(executionPlan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&executionPlan, \"cudnnBackendExecute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(variantPack), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&variantPack, \"cudnnBackendExecute\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn8::cudnnStatus_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            Ok(()) => writer.write_all(b\"CUDNN_STATUS_SUCCESS\"),\n            Err(err) => {\n                match err.0.get() {\n                    1 => writer.write_all(\"CUDNN_STATUS_NOT_INITIALIZED\".as_bytes()),\n                    2 => writer.write_all(\"CUDNN_STATUS_ALLOC_FAILED\".as_bytes()),\n                    3 => writer.write_all(\"CUDNN_STATUS_BAD_PARAM\".as_bytes()),\n                    4 => writer.write_all(\"CUDNN_STATUS_INTERNAL_ERROR\".as_bytes()),\n                    5 => writer.write_all(\"CUDNN_STATUS_INVALID_VALUE\".as_bytes()),\n                    6 => writer.write_all(\"CUDNN_STATUS_ARCH_MISMATCH\".as_bytes()),\n                    7 => writer.write_all(\"CUDNN_STATUS_MAPPING_ERROR\".as_bytes()),\n                    8 => writer.write_all(\"CUDNN_STATUS_EXECUTION_FAILED\".as_bytes()),\n                    9 => writer.write_all(\"CUDNN_STATUS_NOT_SUPPORTED\".as_bytes()),\n                    10 => writer.write_all(\"CUDNN_STATUS_LICENSE_ERROR\".as_bytes()),\n                    11 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_RUNTIME_PREREQUISITE_MISSING\".as_bytes(),\n                            )\n                    }\n                    12 => writer.write_all(\"CUDNN_STATUS_RUNTIME_IN_PROGRESS\".as_bytes()),\n                    13 => writer.write_all(\"CUDNN_STATUS_RUNTIME_FP_OVERFLOW\".as_bytes()),\n                    14 => writer.write_all(\"CUDNN_STATUS_VERSION_MISMATCH\".as_bytes()),\n                    err => write!(writer, \"{}\", err),\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "format/src/format_generated_dnn9.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnHandle_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\npub fn write_cudnnGetVersion(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_cudnnGetMaxDeviceVersion(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_cudnnGetCudartVersion(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_cudnnGetErrorString(\n    writer: &mut (impl std::io::Write + ?Sized),\n    status: cuda_types::cudnn9::cudnnStatus_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(status), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&status, \"cudnnGetErrorString\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetLastErrorString(\n    writer: &mut (impl std::io::Write + ?Sized),\n    message: *mut ::core::ffi::c_char,\n    max_size: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(message), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&message, \"cudnnGetLastErrorString\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(max_size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&max_size, \"cudnnGetLastErrorString\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnErrQueryMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnErrQueryMode_t::CUDNN_ERRQUERY_RAWCODE => {\n                writer.write_all(stringify!(CUDNN_ERRQUERY_RAWCODE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnErrQueryMode_t::CUDNN_ERRQUERY_NONBLOCKING => {\n                writer.write_all(stringify!(CUDNN_ERRQUERY_NONBLOCKING).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnErrQueryMode_t::CUDNN_ERRQUERY_BLOCKING => {\n                writer.write_all(stringify!(CUDNN_ERRQUERY_BLOCKING).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cudnnQueryRuntimeError(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    rstatus: *mut cuda_types::cudnn9::cudnnStatus_t,\n    mode: cuda_types::cudnn9::cudnnErrQueryMode_t,\n    tag: *mut cuda_types::cudnn9::cudnnRuntimeTag_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnQueryRuntimeError\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rstatus), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rstatus, \"cudnnQueryRuntimeError\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cudnnQueryRuntimeError\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(tag), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&tag, \"cudnnQueryRuntimeError\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetProperty(\n    writer: &mut (impl std::io::Write + ?Sized),\n    type_: cuda_types::cudnn9::libraryPropertyType,\n    value: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cudnnGetProperty\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cudnnGetProperty\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: *mut cuda_types::cudnn9::cudnnHandle_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnCreate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnDestroy\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetStream(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    streamId: cuda_types::cudnn9::cudaStream_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnSetStream\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(streamId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&streamId, \"cudnnSetStream\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetStream(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    streamId: *mut cuda_types::cudnn9::cudaStream_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnGetStream\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(streamId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&streamId, \"cudnnGetStream\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnDataType_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnDataType_t::CUDNN_DATA_FLOAT => {\n                writer.write_all(stringify!(CUDNN_DATA_FLOAT).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnDataType_t::CUDNN_DATA_DOUBLE => {\n                writer.write_all(stringify!(CUDNN_DATA_DOUBLE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnDataType_t::CUDNN_DATA_HALF => {\n                writer.write_all(stringify!(CUDNN_DATA_HALF).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnDataType_t::CUDNN_DATA_INT8 => {\n                writer.write_all(stringify!(CUDNN_DATA_INT8).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnDataType_t::CUDNN_DATA_INT32 => {\n                writer.write_all(stringify!(CUDNN_DATA_INT32).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnDataType_t::CUDNN_DATA_INT8x4 => {\n                writer.write_all(stringify!(CUDNN_DATA_INT8x4).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnDataType_t::CUDNN_DATA_UINT8 => {\n                writer.write_all(stringify!(CUDNN_DATA_UINT8).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnDataType_t::CUDNN_DATA_UINT8x4 => {\n                writer.write_all(stringify!(CUDNN_DATA_UINT8x4).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnDataType_t::CUDNN_DATA_INT8x32 => {\n                writer.write_all(stringify!(CUDNN_DATA_INT8x32).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnDataType_t::CUDNN_DATA_BFLOAT16 => {\n                writer.write_all(stringify!(CUDNN_DATA_BFLOAT16).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnDataType_t::CUDNN_DATA_INT64 => {\n                writer.write_all(stringify!(CUDNN_DATA_INT64).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnDataType_t::CUDNN_DATA_BOOLEAN => {\n                writer.write_all(stringify!(CUDNN_DATA_BOOLEAN).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnDataType_t::CUDNN_DATA_FP8_E4M3 => {\n                writer.write_all(stringify!(CUDNN_DATA_FP8_E4M3).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnDataType_t::CUDNN_DATA_FP8_E5M2 => {\n                writer.write_all(stringify!(CUDNN_DATA_FP8_E5M2).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnDataType_t::CUDNN_DATA_FAST_FLOAT_FOR_FP8 => {\n                writer.write_all(stringify!(CUDNN_DATA_FAST_FLOAT_FOR_FP8).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnDataType_t::CUDNN_DATA_FP8_E8M0 => {\n                writer.write_all(stringify!(CUDNN_DATA_FP8_E8M0).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnDataType_t::CUDNN_DATA_FP4_E2M1 => {\n                writer.write_all(stringify!(CUDNN_DATA_FP4_E2M1).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnDataType_t::CUDNN_DATA_INT4 => {\n                writer.write_all(stringify!(CUDNN_DATA_INT4).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnDataType_t::CUDNN_DATA_UINT4 => {\n                writer.write_all(stringify!(CUDNN_DATA_UINT4).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnDataType_t::CUDNN_DATA_UINT32 => {\n                writer.write_all(stringify!(CUDNN_DATA_UINT32).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnMathType_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnMathType_t::CUDNN_DEFAULT_MATH => {\n                writer.write_all(stringify!(CUDNN_DEFAULT_MATH).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnMathType_t::CUDNN_TENSOR_OP_MATH => {\n                writer.write_all(stringify!(CUDNN_TENSOR_OP_MATH).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnMathType_t::CUDNN_TENSOR_OP_MATH_ALLOW_CONVERSION => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_TENSOR_OP_MATH_ALLOW_CONVERSION).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnMathType_t::CUDNN_FMA_MATH => {\n                writer.write_all(stringify!(CUDNN_FMA_MATH).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnNanPropagation_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnNanPropagation_t::CUDNN_NOT_PROPAGATE_NAN => {\n                writer.write_all(stringify!(CUDNN_NOT_PROPAGATE_NAN).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnNanPropagation_t::CUDNN_PROPAGATE_NAN => {\n                writer.write_all(stringify!(CUDNN_PROPAGATE_NAN).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnCTCGradMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnCTCGradMode_t::CUDNN_CTC_ZERO_OOB_GRADIENTS => {\n                writer.write_all(stringify!(CUDNN_CTC_ZERO_OOB_GRADIENTS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnCTCGradMode_t::CUDNN_CTC_SKIP_OOB_GRADIENTS => {\n                writer.write_all(stringify!(CUDNN_CTC_SKIP_OOB_GRADIENTS).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnTensorFormat_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnTensorFormat_t::CUDNN_TENSOR_NCHW => {\n                writer.write_all(stringify!(CUDNN_TENSOR_NCHW).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnTensorFormat_t::CUDNN_TENSOR_NHWC => {\n                writer.write_all(stringify!(CUDNN_TENSOR_NHWC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnTensorFormat_t::CUDNN_TENSOR_NCHW_VECT_C => {\n                writer.write_all(stringify!(CUDNN_TENSOR_NCHW_VECT_C).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnReduceTensorOp_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnReduceTensorOp_t::CUDNN_REDUCE_TENSOR_ADD => {\n                writer.write_all(stringify!(CUDNN_REDUCE_TENSOR_ADD).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnReduceTensorOp_t::CUDNN_REDUCE_TENSOR_MUL => {\n                writer.write_all(stringify!(CUDNN_REDUCE_TENSOR_MUL).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnReduceTensorOp_t::CUDNN_REDUCE_TENSOR_MIN => {\n                writer.write_all(stringify!(CUDNN_REDUCE_TENSOR_MIN).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnReduceTensorOp_t::CUDNN_REDUCE_TENSOR_MAX => {\n                writer.write_all(stringify!(CUDNN_REDUCE_TENSOR_MAX).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnReduceTensorOp_t::CUDNN_REDUCE_TENSOR_AMAX => {\n                writer.write_all(stringify!(CUDNN_REDUCE_TENSOR_AMAX).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnReduceTensorOp_t::CUDNN_REDUCE_TENSOR_AVG => {\n                writer.write_all(stringify!(CUDNN_REDUCE_TENSOR_AVG).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnReduceTensorOp_t::CUDNN_REDUCE_TENSOR_NORM1 => {\n                writer.write_all(stringify!(CUDNN_REDUCE_TENSOR_NORM1).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnReduceTensorOp_t::CUDNN_REDUCE_TENSOR_NORM2 => {\n                writer.write_all(stringify!(CUDNN_REDUCE_TENSOR_NORM2).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnReduceTensorOp_t::CUDNN_REDUCE_TENSOR_MUL_NO_ZEROS => {\n                writer.write_all(stringify!(CUDNN_REDUCE_TENSOR_MUL_NO_ZEROS).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnActivationMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnActivationMode_t::CUDNN_ACTIVATION_SIGMOID => {\n                writer.write_all(stringify!(CUDNN_ACTIVATION_SIGMOID).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnActivationMode_t::CUDNN_ACTIVATION_RELU => {\n                writer.write_all(stringify!(CUDNN_ACTIVATION_RELU).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnActivationMode_t::CUDNN_ACTIVATION_TANH => {\n                writer.write_all(stringify!(CUDNN_ACTIVATION_TANH).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnActivationMode_t::CUDNN_ACTIVATION_CLIPPED_RELU => {\n                writer.write_all(stringify!(CUDNN_ACTIVATION_CLIPPED_RELU).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnActivationMode_t::CUDNN_ACTIVATION_ELU => {\n                writer.write_all(stringify!(CUDNN_ACTIVATION_ELU).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnActivationMode_t::CUDNN_ACTIVATION_IDENTITY => {\n                writer.write_all(stringify!(CUDNN_ACTIVATION_IDENTITY).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnActivationMode_t::CUDNN_ACTIVATION_SWISH => {\n                writer.write_all(stringify!(CUDNN_ACTIVATION_SWISH).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnSeverity_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnSeverity_t::CUDNN_SEV_FATAL => {\n                writer.write_all(stringify!(CUDNN_SEV_FATAL).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnSeverity_t::CUDNN_SEV_ERROR => {\n                writer.write_all(stringify!(CUDNN_SEV_ERROR).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnSeverity_t::CUDNN_SEV_WARNING => {\n                writer.write_all(stringify!(CUDNN_SEV_WARNING).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnSeverity_t::CUDNN_SEV_INFO => {\n                writer.write_all(stringify!(CUDNN_SEV_INFO).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnDebugStruct {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(cudnn_version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.cudnn_version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(cudnnStatus), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.cudnnStatus, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(time_sec), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.time_sec, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(time_usec), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.time_usec, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(time_delta), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.time_delta, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(handle), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.handle, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(stream), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.stream, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(pid), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.pid, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(tid), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.tid, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(cudaDeviceId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.cudaDeviceId, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnCallback_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(\n            writer,\n            \"{:p}\",\n            unsafe {\n                std::mem::transmute::<\n                    cuda_types::cudnn9::cudnnCallback_t,\n                    *mut ::std::ffi::c_void,\n                >(*self)\n            },\n        )\n    }\n}\npub fn write_cudnnSetCallback(\n    writer: &mut (impl std::io::Write + ?Sized),\n    mask: ::core::ffi::c_uint,\n    udata: *mut ::core::ffi::c_void,\n    fptr: cuda_types::cudnn9::cudnnCallback_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(mask), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mask, \"cudnnSetCallback\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(udata), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&udata, \"cudnnSetCallback\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fptr, \"cudnnSetCallback\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetCallback(\n    writer: &mut (impl std::io::Write + ?Sized),\n    mask: *mut ::core::ffi::c_uint,\n    udata: *mut *mut ::core::ffi::c_void,\n    fptr: *mut cuda_types::cudnn9::cudnnCallback_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(mask), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mask, \"cudnnGetCallback\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(udata), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&udata, \"cudnnGetCallback\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fptr, \"cudnnGetCallback\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGraphVersionCheck(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnConvolutionMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnConvolutionMode_t::CUDNN_CONVOLUTION => {\n                writer.write_all(stringify!(CUDNN_CONVOLUTION).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnConvolutionMode_t::CUDNN_CROSS_CORRELATION => {\n                writer.write_all(stringify!(CUDNN_CROSS_CORRELATION).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnReorderType_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnReorderType_t::CUDNN_DEFAULT_REORDER => {\n                writer.write_all(stringify!(CUDNN_DEFAULT_REORDER).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnReorderType_t::CUDNN_NO_REORDER => {\n                writer.write_all(stringify!(CUDNN_NO_REORDER).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnFractionStruct {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(numerator), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.numerator, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(denominator), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.denominator, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnPointwiseMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_ADD => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_ADD).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_ADD_SQUARE => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_ADD_SQUARE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_DIV => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_DIV).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_MAX => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_MAX).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_MIN => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_MIN).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_MOD => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_MOD).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_MUL => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_MUL).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_POW => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_POW).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_SUB => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_SUB).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_ABS => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_ABS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_CEIL => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_CEIL).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_COS => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_COS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_EXP => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_EXP).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_FLOOR => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_FLOOR).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_LOG => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_LOG).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_NEG => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_NEG).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_RSQRT => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_RSQRT).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_SIN => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_SIN).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_SQRT => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_SQRT).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_TAN => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_TAN).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_ERF => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_ERF).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_IDENTITY => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_IDENTITY).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_RECIPROCAL => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_RECIPROCAL).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_ATAN2 => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_ATAN2).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_RELU_FWD => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_RELU_FWD).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_TANH_FWD => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_TANH_FWD).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_SIGMOID_FWD => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_SIGMOID_FWD).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_ELU_FWD => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_ELU_FWD).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_GELU_FWD => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_GELU_FWD).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_SOFTPLUS_FWD => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_SOFTPLUS_FWD).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_SWISH_FWD => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_SWISH_FWD).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_GELU_APPROX_TANH_FWD => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_POINTWISE_GELU_APPROX_TANH_FWD).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_RELU_BWD => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_RELU_BWD).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_TANH_BWD => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_TANH_BWD).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_SIGMOID_BWD => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_SIGMOID_BWD).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_ELU_BWD => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_ELU_BWD).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_GELU_BWD => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_GELU_BWD).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_SOFTPLUS_BWD => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_SOFTPLUS_BWD).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_SWISH_BWD => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_SWISH_BWD).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_GELU_APPROX_TANH_BWD => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_POINTWISE_GELU_APPROX_TANH_BWD).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_CMP_EQ => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_CMP_EQ).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_CMP_NEQ => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_CMP_NEQ).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_CMP_GT => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_CMP_GT).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_CMP_GE => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_CMP_GE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_CMP_LT => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_CMP_LT).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_CMP_LE => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_CMP_LE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_LOGICAL_AND => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_LOGICAL_AND).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_LOGICAL_OR => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_LOGICAL_OR).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_LOGICAL_NOT => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_LOGICAL_NOT).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_GEN_INDEX => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_GEN_INDEX).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPointwiseMode_t::CUDNN_POINTWISE_BINARY_SELECT => {\n                writer.write_all(stringify!(CUDNN_POINTWISE_BINARY_SELECT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnResampleMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnResampleMode_t::CUDNN_RESAMPLE_NEAREST => {\n                writer.write_all(stringify!(CUDNN_RESAMPLE_NEAREST).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnResampleMode_t::CUDNN_RESAMPLE_BILINEAR => {\n                writer.write_all(stringify!(CUDNN_RESAMPLE_BILINEAR).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnResampleMode_t::CUDNN_RESAMPLE_AVGPOOL => {\n                writer.write_all(stringify!(CUDNN_RESAMPLE_AVGPOOL).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnResampleMode_t::CUDNN_RESAMPLE_AVGPOOL_INCLUDE_PADDING => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_RESAMPLE_AVGPOOL_INCLUDE_PADDING).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnResampleMode_t::CUDNN_RESAMPLE_AVGPOOL_EXCLUDE_PADDING => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_RESAMPLE_AVGPOOL_EXCLUDE_PADDING).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnResampleMode_t::CUDNN_RESAMPLE_MAXPOOL => {\n                writer.write_all(stringify!(CUDNN_RESAMPLE_MAXPOOL).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnSignalMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnSignalMode_t::CUDNN_SIGNAL_SET => {\n                writer.write_all(stringify!(CUDNN_SIGNAL_SET).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnSignalMode_t::CUDNN_SIGNAL_WAIT => {\n                writer.write_all(stringify!(CUDNN_SIGNAL_WAIT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnGenStatsMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnGenStatsMode_t::CUDNN_GENSTATS_SUM_SQSUM => {\n                writer.write_all(stringify!(CUDNN_GENSTATS_SUM_SQSUM).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnBnFinalizeStatsMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnBnFinalizeStatsMode_t::CUDNN_BN_FINALIZE_STATISTICS_TRAINING => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BN_FINALIZE_STATISTICS_TRAINING).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBnFinalizeStatsMode_t::CUDNN_BN_FINALIZE_STATISTICS_INFERENCE => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BN_FINALIZE_STATISTICS_INFERENCE).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnRngDistribution_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnRngDistribution_t::CUDNN_RNG_DISTRIBUTION_BERNOULLI => {\n                writer.write_all(stringify!(CUDNN_RNG_DISTRIBUTION_BERNOULLI).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnRngDistribution_t::CUDNN_RNG_DISTRIBUTION_UNIFORM => {\n                writer.write_all(stringify!(CUDNN_RNG_DISTRIBUTION_UNIFORM).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnRngDistribution_t::CUDNN_RNG_DISTRIBUTION_NORMAL => {\n                writer.write_all(stringify!(CUDNN_RNG_DISTRIBUTION_NORMAL).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnBackendAttributeName_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_POINTWISE_MODE => {\n                writer.write_all(stringify!(CUDNN_ATTR_POINTWISE_MODE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_POINTWISE_MATH_PREC => {\n                writer.write_all(stringify!(CUDNN_ATTR_POINTWISE_MATH_PREC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_POINTWISE_NAN_PROPAGATION => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_POINTWISE_NAN_PROPAGATION).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_POINTWISE_RELU_LOWER_CLIP => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_POINTWISE_RELU_LOWER_CLIP).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_POINTWISE_RELU_UPPER_CLIP => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_POINTWISE_RELU_UPPER_CLIP).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_POINTWISE_RELU_LOWER_CLIP_SLOPE => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_POINTWISE_RELU_LOWER_CLIP_SLOPE).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_POINTWISE_ELU_ALPHA => {\n                writer.write_all(stringify!(CUDNN_ATTR_POINTWISE_ELU_ALPHA).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_POINTWISE_SOFTPLUS_BETA => {\n                writer\n                    .write_all(stringify!(CUDNN_ATTR_POINTWISE_SOFTPLUS_BETA).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_POINTWISE_SWISH_BETA => {\n                writer.write_all(stringify!(CUDNN_ATTR_POINTWISE_SWISH_BETA).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_POINTWISE_AXIS => {\n                writer.write_all(stringify!(CUDNN_ATTR_POINTWISE_AXIS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_CONVOLUTION_COMP_TYPE => {\n                writer.write_all(stringify!(CUDNN_ATTR_CONVOLUTION_COMP_TYPE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_CONVOLUTION_CONV_MODE => {\n                writer.write_all(stringify!(CUDNN_ATTR_CONVOLUTION_CONV_MODE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_CONVOLUTION_DILATIONS => {\n                writer.write_all(stringify!(CUDNN_ATTR_CONVOLUTION_DILATIONS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_CONVOLUTION_FILTER_STRIDES => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_CONVOLUTION_FILTER_STRIDES).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_CONVOLUTION_POST_PADDINGS => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_CONVOLUTION_POST_PADDINGS).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_CONVOLUTION_PRE_PADDINGS => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_CONVOLUTION_PRE_PADDINGS).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_CONVOLUTION_SPATIAL_DIMS => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_CONVOLUTION_SPATIAL_DIMS).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_ENGINEHEUR_MODE => {\n                writer.write_all(stringify!(CUDNN_ATTR_ENGINEHEUR_MODE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_ENGINEHEUR_OPERATION_GRAPH => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_ENGINEHEUR_OPERATION_GRAPH).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_ENGINEHEUR_RESULTS => {\n                writer.write_all(stringify!(CUDNN_ATTR_ENGINEHEUR_RESULTS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_ENGINEHEUR_SM_COUNT_TARGET => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_ENGINEHEUR_SM_COUNT_TARGET).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_ENGINEHEUR_DEVICEPROP => {\n                writer.write_all(stringify!(CUDNN_ATTR_ENGINEHEUR_DEVICEPROP).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_ENGINECFG_ENGINE => {\n                writer.write_all(stringify!(CUDNN_ATTR_ENGINECFG_ENGINE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_ENGINECFG_INTERMEDIATE_INFO => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_ENGINECFG_INTERMEDIATE_INFO).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_ENGINECFG_KNOB_CHOICES => {\n                writer\n                    .write_all(stringify!(CUDNN_ATTR_ENGINECFG_KNOB_CHOICES).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_ENGINECFG_WORKSPACE_SIZE => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_ENGINECFG_WORKSPACE_SIZE).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_ENGINECFG_SHARED_MEMORY_USED => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_ENGINECFG_SHARED_MEMORY_USED).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_EXECUTION_PLAN_HANDLE => {\n                writer.write_all(stringify!(CUDNN_ATTR_EXECUTION_PLAN_HANDLE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_EXECUTION_PLAN_ENGINE_CONFIG => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_EXECUTION_PLAN_ENGINE_CONFIG).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_EXECUTION_PLAN_WORKSPACE_SIZE => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_EXECUTION_PLAN_WORKSPACE_SIZE).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_EXECUTION_PLAN_COMPUTED_INTERMEDIATE_UIDS => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_EXECUTION_PLAN_COMPUTED_INTERMEDIATE_UIDS)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_EXECUTION_PLAN_RUN_ONLY_INTERMEDIATE_UIDS => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_EXECUTION_PLAN_RUN_ONLY_INTERMEDIATE_UIDS)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_EXECUTION_PLAN_JSON_REPRESENTATION => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_EXECUTION_PLAN_JSON_REPRESENTATION)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_EXECUTION_PLAN_KERNEL_CACHE => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_EXECUTION_PLAN_KERNEL_CACHE).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_EXECUTION_PLAN_DEVICEPROP => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_EXECUTION_PLAN_DEVICEPROP).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_INTERMEDIATE_INFO_UNIQUE_ID => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_INTERMEDIATE_INFO_UNIQUE_ID).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_INTERMEDIATE_INFO_SIZE => {\n                writer\n                    .write_all(stringify!(CUDNN_ATTR_INTERMEDIATE_INFO_SIZE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_INTERMEDIATE_INFO_DEPENDENT_DATA_UIDS => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_INTERMEDIATE_INFO_DEPENDENT_DATA_UIDS)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_INTERMEDIATE_INFO_DEPENDENT_ATTRIBUTES => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_INTERMEDIATE_INFO_DEPENDENT_ATTRIBUTES)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_KNOB_CHOICE_KNOB_TYPE => {\n                writer.write_all(stringify!(CUDNN_ATTR_KNOB_CHOICE_KNOB_TYPE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_KNOB_CHOICE_KNOB_VALUE => {\n                writer\n                    .write_all(stringify!(CUDNN_ATTR_KNOB_CHOICE_KNOB_VALUE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_ALPHA => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_ALPHA)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_BETA => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_BETA)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_CONV_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_CONV_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_W => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_W).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_X => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_X).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_Y => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_Y).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_ALPHA => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_ALPHA)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_BETA => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_BETA)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_CONV_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_CONV_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_W => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_W)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_DX => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_DX)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_DY => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_DY)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_ALPHA => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_ALPHA)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_BETA => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_BETA)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_CONV_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_CONV_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_DW => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_DW)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_X => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_X)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_DY => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_DY)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_POINTWISE_PW_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_POINTWISE_PW_DESCRIPTOR)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_POINTWISE_XDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_POINTWISE_XDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_POINTWISE_BDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_POINTWISE_BDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_POINTWISE_YDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_POINTWISE_YDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_POINTWISE_ALPHA1 => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_POINTWISE_ALPHA1).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_POINTWISE_ALPHA2 => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_POINTWISE_ALPHA2).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_POINTWISE_DXDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_POINTWISE_DXDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_POINTWISE_DYDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_POINTWISE_DYDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_POINTWISE_TDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_POINTWISE_TDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_GENSTATS_MODE => {\n                writer\n                    .write_all(stringify!(CUDNN_ATTR_OPERATION_GENSTATS_MODE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_GENSTATS_MATH_PREC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_GENSTATS_MATH_PREC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_GENSTATS_XDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_GENSTATS_XDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_GENSTATS_SUMDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_GENSTATS_SUMDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_GENSTATS_SQSUMDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_GENSTATS_SQSUMDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BN_FINALIZE_STATS_MODE => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BN_FINALIZE_STATS_MODE)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BN_FINALIZE_MATH_PREC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BN_FINALIZE_MATH_PREC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BN_FINALIZE_Y_SUM_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BN_FINALIZE_Y_SUM_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BN_FINALIZE_Y_SQ_SUM_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BN_FINALIZE_Y_SQ_SUM_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BN_FINALIZE_SCALE_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BN_FINALIZE_SCALE_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BN_FINALIZE_BIAS_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BN_FINALIZE_BIAS_DESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BN_FINALIZE_PREV_RUNNING_MEAN_DESC => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CUDNN_ATTR_OPERATION_BN_FINALIZE_PREV_RUNNING_MEAN_DESC\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BN_FINALIZE_PREV_RUNNING_VAR_DESC => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CUDNN_ATTR_OPERATION_BN_FINALIZE_PREV_RUNNING_VAR_DESC\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BN_FINALIZE_UPDATED_RUNNING_MEAN_DESC => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CUDNN_ATTR_OPERATION_BN_FINALIZE_UPDATED_RUNNING_MEAN_DESC\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BN_FINALIZE_UPDATED_RUNNING_VAR_DESC => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CUDNN_ATTR_OPERATION_BN_FINALIZE_UPDATED_RUNNING_VAR_DESC\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BN_FINALIZE_SAVED_MEAN_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BN_FINALIZE_SAVED_MEAN_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BN_FINALIZE_SAVED_INV_STD_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BN_FINALIZE_SAVED_INV_STD_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BN_FINALIZE_EQ_SCALE_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BN_FINALIZE_EQ_SCALE_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BN_FINALIZE_EQ_BIAS_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BN_FINALIZE_EQ_BIAS_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BN_FINALIZE_ACCUM_COUNT_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BN_FINALIZE_ACCUM_COUNT_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BN_FINALIZE_EPSILON_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BN_FINALIZE_EPSILON_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BN_FINALIZE_EXP_AVERATE_FACTOR_DESC => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CUDNN_ATTR_OPERATION_BN_FINALIZE_EXP_AVERATE_FACTOR_DESC\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATIONGRAPH_HANDLE => {\n                writer.write_all(stringify!(CUDNN_ATTR_OPERATIONGRAPH_HANDLE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATIONGRAPH_OPS => {\n                writer.write_all(stringify!(CUDNN_ATTR_OPERATIONGRAPH_OPS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATIONGRAPH_ENGINE_GLOBAL_COUNT => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATIONGRAPH_ENGINE_GLOBAL_COUNT)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATIONGRAPH_IS_DYNAMIC_SHAPE_ENABLED => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATIONGRAPH_IS_DYNAMIC_SHAPE_ENABLED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATIONGRAPH_IS_SAME_TOPOLOGY => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATIONGRAPH_IS_SAME_TOPOLOGY).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_TENSOR_BYTE_ALIGNMENT => {\n                writer.write_all(stringify!(CUDNN_ATTR_TENSOR_BYTE_ALIGNMENT).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_TENSOR_DATA_TYPE => {\n                writer.write_all(stringify!(CUDNN_ATTR_TENSOR_DATA_TYPE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_TENSOR_DIMENSIONS => {\n                writer.write_all(stringify!(CUDNN_ATTR_TENSOR_DIMENSIONS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_TENSOR_STRIDES => {\n                writer.write_all(stringify!(CUDNN_ATTR_TENSOR_STRIDES).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_TENSOR_VECTOR_COUNT => {\n                writer.write_all(stringify!(CUDNN_ATTR_TENSOR_VECTOR_COUNT).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_TENSOR_VECTORIZED_DIMENSION => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_TENSOR_VECTORIZED_DIMENSION).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_TENSOR_UNIQUE_ID => {\n                writer.write_all(stringify!(CUDNN_ATTR_TENSOR_UNIQUE_ID).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_TENSOR_IS_VIRTUAL => {\n                writer.write_all(stringify!(CUDNN_ATTR_TENSOR_IS_VIRTUAL).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_TENSOR_IS_BY_VALUE => {\n                writer.write_all(stringify!(CUDNN_ATTR_TENSOR_IS_BY_VALUE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_TENSOR_REORDERING_MODE => {\n                writer\n                    .write_all(stringify!(CUDNN_ATTR_TENSOR_REORDERING_MODE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_TENSOR_RAGGED_OFFSET_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_TENSOR_RAGGED_OFFSET_DESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_VARIANT_PACK_UNIQUE_IDS => {\n                writer\n                    .write_all(stringify!(CUDNN_ATTR_VARIANT_PACK_UNIQUE_IDS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_VARIANT_PACK_DATA_POINTERS => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_VARIANT_PACK_DATA_POINTERS).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_VARIANT_PACK_INTERMEDIATES => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_VARIANT_PACK_INTERMEDIATES).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_VARIANT_PACK_WORKSPACE => {\n                writer\n                    .write_all(stringify!(CUDNN_ATTR_VARIANT_PACK_WORKSPACE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_LAYOUT_INFO_TENSOR_UID => {\n                writer\n                    .write_all(stringify!(CUDNN_ATTR_LAYOUT_INFO_TENSOR_UID).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_LAYOUT_INFO_TYPES => {\n                writer.write_all(stringify!(CUDNN_ATTR_LAYOUT_INFO_TYPES).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_KNOB_INFO_TYPE => {\n                writer.write_all(stringify!(CUDNN_ATTR_KNOB_INFO_TYPE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_KNOB_INFO_MAXIMUM_VALUE => {\n                writer\n                    .write_all(stringify!(CUDNN_ATTR_KNOB_INFO_MAXIMUM_VALUE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_KNOB_INFO_MINIMUM_VALUE => {\n                writer\n                    .write_all(stringify!(CUDNN_ATTR_KNOB_INFO_MINIMUM_VALUE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_KNOB_INFO_STRIDE => {\n                writer.write_all(stringify!(CUDNN_ATTR_KNOB_INFO_STRIDE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_ENGINE_OPERATION_GRAPH => {\n                writer\n                    .write_all(stringify!(CUDNN_ATTR_ENGINE_OPERATION_GRAPH).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_ENGINE_GLOBAL_INDEX => {\n                writer.write_all(stringify!(CUDNN_ATTR_ENGINE_GLOBAL_INDEX).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_ENGINE_KNOB_INFO => {\n                writer.write_all(stringify!(CUDNN_ATTR_ENGINE_KNOB_INFO).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_ENGINE_NUMERICAL_NOTE => {\n                writer.write_all(stringify!(CUDNN_ATTR_ENGINE_NUMERICAL_NOTE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_ENGINE_LAYOUT_INFO => {\n                writer.write_all(stringify!(CUDNN_ATTR_ENGINE_LAYOUT_INFO).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_ENGINE_BEHAVIOR_NOTE => {\n                writer.write_all(stringify!(CUDNN_ATTR_ENGINE_BEHAVIOR_NOTE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_ENGINE_SM_COUNT_TARGET => {\n                writer\n                    .write_all(stringify!(CUDNN_ATTR_ENGINE_SM_COUNT_TARGET).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_ENGINE_DEVICEPROP => {\n                writer.write_all(stringify!(CUDNN_ATTR_ENGINE_DEVICEPROP).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_MATMUL_COMP_TYPE => {\n                writer.write_all(stringify!(CUDNN_ATTR_MATMUL_COMP_TYPE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_MATMUL_PADDING_VALUE => {\n                writer.write_all(stringify!(CUDNN_ATTR_MATMUL_PADDING_VALUE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_MATMUL_ADESC => {\n                writer\n                    .write_all(stringify!(CUDNN_ATTR_OPERATION_MATMUL_ADESC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_MATMUL_BDESC => {\n                writer\n                    .write_all(stringify!(CUDNN_ATTR_OPERATION_MATMUL_BDESC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_MATMUL_CDESC => {\n                writer\n                    .write_all(stringify!(CUDNN_ATTR_OPERATION_MATMUL_CDESC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_MATMUL_DESC => {\n                writer.write_all(stringify!(CUDNN_ATTR_OPERATION_MATMUL_DESC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_MATMUL_IRREGULARLY_STRIDED_BATCH_COUNT => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CUDNN_ATTR_OPERATION_MATMUL_IRREGULARLY_STRIDED_BATCH_COUNT\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_MATMUL_GEMM_M_OVERRIDE_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_MATMUL_GEMM_M_OVERRIDE_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_MATMUL_GEMM_N_OVERRIDE_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_MATMUL_GEMM_N_OVERRIDE_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_MATMUL_GEMM_K_OVERRIDE_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_MATMUL_GEMM_K_OVERRIDE_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_REDUCTION_OPERATOR => {\n                writer.write_all(stringify!(CUDNN_ATTR_REDUCTION_OPERATOR).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_REDUCTION_COMP_TYPE => {\n                writer.write_all(stringify!(CUDNN_ATTR_REDUCTION_COMP_TYPE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_REDUCTION_IS_DETERMINISTIC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_REDUCTION_IS_DETERMINISTIC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_REDUCTION_XDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_REDUCTION_XDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_REDUCTION_YDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_REDUCTION_YDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_REDUCTION_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_REDUCTION_DESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_MATH_PREC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_MATH_PREC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_MEAN_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_MEAN_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_INVSTD_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_INVSTD_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_BN_SCALE_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_BN_SCALE_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_X_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_X_DESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_DY_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_DY_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_DBN_SCALE_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_DBN_SCALE_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_DBN_BIAS_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_DBN_BIAS_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_EQ_DY_SCALE_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_EQ_DY_SCALE_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_EQ_X_SCALE_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_EQ_X_SCALE_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_EQ_BIAS => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BN_BWD_WEIGHTS_EQ_BIAS)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_RESAMPLE_MODE => {\n                writer.write_all(stringify!(CUDNN_ATTR_RESAMPLE_MODE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_RESAMPLE_COMP_TYPE => {\n                writer.write_all(stringify!(CUDNN_ATTR_RESAMPLE_COMP_TYPE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_RESAMPLE_SPATIAL_DIMS => {\n                writer.write_all(stringify!(CUDNN_ATTR_RESAMPLE_SPATIAL_DIMS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_RESAMPLE_POST_PADDINGS => {\n                writer\n                    .write_all(stringify!(CUDNN_ATTR_RESAMPLE_POST_PADDINGS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_RESAMPLE_PRE_PADDINGS => {\n                writer.write_all(stringify!(CUDNN_ATTR_RESAMPLE_PRE_PADDINGS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_RESAMPLE_STRIDES => {\n                writer.write_all(stringify!(CUDNN_ATTR_RESAMPLE_STRIDES).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_RESAMPLE_WINDOW_DIMS => {\n                writer.write_all(stringify!(CUDNN_ATTR_RESAMPLE_WINDOW_DIMS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_RESAMPLE_NAN_PROPAGATION => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_RESAMPLE_NAN_PROPAGATION).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_RESAMPLE_PADDING_MODE => {\n                writer.write_all(stringify!(CUDNN_ATTR_RESAMPLE_PADDING_MODE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_RESAMPLE_FWD_XDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_RESAMPLE_FWD_XDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_RESAMPLE_FWD_YDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_RESAMPLE_FWD_YDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_RESAMPLE_FWD_IDXDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_RESAMPLE_FWD_IDXDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_RESAMPLE_FWD_ALPHA => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_RESAMPLE_FWD_ALPHA).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_RESAMPLE_FWD_BETA => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_RESAMPLE_FWD_BETA).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_RESAMPLE_FWD_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_RESAMPLE_FWD_DESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_RESAMPLE_BWD_DXDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_RESAMPLE_BWD_DXDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_RESAMPLE_BWD_DYDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_RESAMPLE_BWD_DYDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_RESAMPLE_BWD_IDXDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_RESAMPLE_BWD_IDXDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_RESAMPLE_BWD_ALPHA => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_RESAMPLE_BWD_ALPHA).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_RESAMPLE_BWD_BETA => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_RESAMPLE_BWD_BETA).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_RESAMPLE_BWD_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_RESAMPLE_BWD_DESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_RESAMPLE_BWD_XDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_RESAMPLE_BWD_XDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_RESAMPLE_BWD_YDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_RESAMPLE_BWD_YDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONCAT_AXIS => {\n                writer.write_all(stringify!(CUDNN_ATTR_OPERATION_CONCAT_AXIS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONCAT_INPUT_DESCS => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_CONCAT_INPUT_DESCS).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONCAT_INPLACE_INDEX => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_CONCAT_INPLACE_INDEX).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONCAT_OUTPUT_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_CONCAT_OUTPUT_DESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_SIGNAL_MODE => {\n                writer.write_all(stringify!(CUDNN_ATTR_OPERATION_SIGNAL_MODE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_SIGNAL_FLAGDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_SIGNAL_FLAGDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_SIGNAL_VALUE => {\n                writer\n                    .write_all(stringify!(CUDNN_ATTR_OPERATION_SIGNAL_VALUE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_SIGNAL_XDESC => {\n                writer\n                    .write_all(stringify!(CUDNN_ATTR_OPERATION_SIGNAL_XDESC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_SIGNAL_YDESC => {\n                writer\n                    .write_all(stringify!(CUDNN_ATTR_OPERATION_SIGNAL_YDESC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_PAGED_CACHE_LOAD_CONTAINER_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_PAGED_CACHE_LOAD_CONTAINER_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_PAGED_CACHE_LOAD_YDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_PAGED_CACHE_LOAD_YDESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_PAGED_CACHE_LOAD_SEQUENCE_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_PAGED_CACHE_LOAD_SEQUENCE_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_PAGED_CACHE_LOAD_PAGE_TABLE_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_PAGED_CACHE_LOAD_PAGE_TABLE_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_NORM_FWD_MODE => {\n                writer\n                    .write_all(stringify!(CUDNN_ATTR_OPERATION_NORM_FWD_MODE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_NORM_FWD_PHASE => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_NORM_FWD_PHASE).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_NORM_FWD_XDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_NORM_FWD_XDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_NORM_FWD_MEAN_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_NORM_FWD_MEAN_DESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_NORM_FWD_INV_VARIANCE_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_NORM_FWD_INV_VARIANCE_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_NORM_FWD_SCALE_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_NORM_FWD_SCALE_DESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_NORM_FWD_BIAS_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_NORM_FWD_BIAS_DESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_NORM_FWD_EPSILON_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_NORM_FWD_EPSILON_DESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_NORM_FWD_EXP_AVG_FACTOR_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_NORM_FWD_EXP_AVG_FACTOR_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_NORM_FWD_INPUT_RUNNING_MEAN_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_NORM_FWD_INPUT_RUNNING_MEAN_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_NORM_FWD_INPUT_RUNNING_VAR_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_NORM_FWD_INPUT_RUNNING_VAR_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_NORM_FWD_OUTPUT_RUNNING_MEAN_DESC => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CUDNN_ATTR_OPERATION_NORM_FWD_OUTPUT_RUNNING_MEAN_DESC\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_NORM_FWD_OUTPUT_RUNNING_VAR_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_NORM_FWD_OUTPUT_RUNNING_VAR_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_NORM_FWD_YDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_NORM_FWD_YDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_NORM_FWD_PEER_STAT_DESCS => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_NORM_FWD_PEER_STAT_DESCS)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_NORM_BWD_MODE => {\n                writer\n                    .write_all(stringify!(CUDNN_ATTR_OPERATION_NORM_BWD_MODE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_NORM_BWD_XDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_NORM_BWD_XDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_NORM_BWD_MEAN_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_NORM_BWD_MEAN_DESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_NORM_BWD_INV_VARIANCE_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_NORM_BWD_INV_VARIANCE_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_NORM_BWD_DYDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_NORM_BWD_DYDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_NORM_BWD_SCALE_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_NORM_BWD_SCALE_DESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_NORM_BWD_EPSILON_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_NORM_BWD_EPSILON_DESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_NORM_BWD_DSCALE_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_NORM_BWD_DSCALE_DESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_NORM_BWD_DBIAS_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_NORM_BWD_DBIAS_DESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_NORM_BWD_DXDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_NORM_BWD_DXDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_NORM_BWD_PEER_STAT_DESCS => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_NORM_BWD_PEER_STAT_DESCS)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_RESHAPE_XDESC => {\n                writer\n                    .write_all(stringify!(CUDNN_ATTR_OPERATION_RESHAPE_XDESC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_RESHAPE_YDESC => {\n                writer\n                    .write_all(stringify!(CUDNN_ATTR_OPERATION_RESHAPE_YDESC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_EXPAND_BAND_MATRIX_XDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_EXPAND_BAND_MATRIX_XDESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_EXPAND_BAND_MATRIX_YDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_EXPAND_BAND_MATRIX_YDESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_EXPAND_BAND_MATRIX_LOWER_BANDWIDTH => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CUDNN_ATTR_OPERATION_EXPAND_BAND_MATRIX_LOWER_BANDWIDTH\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_EXPAND_BAND_MATRIX_UPPER_BANDWIDTH => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CUDNN_ATTR_OPERATION_EXPAND_BAND_MATRIX_UPPER_BANDWIDTH\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_EXPAND_BAND_MATRIX_AXIS => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_EXPAND_BAND_MATRIX_AXIS)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_EXPAND_BAND_MATRIX_PAD_VALUE => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_EXPAND_BAND_MATRIX_PAD_VALUE)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_EXPAND_BAND_MATRIX_KV_TOKEN_OFFSET_DESC => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CUDNN_ATTR_OPERATION_EXPAND_BAND_MATRIX_KV_TOKEN_OFFSET_DESC\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_EXPAND_BAND_MATRIX_SPECULATIVE_MASK_DESC => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CUDNN_ATTR_OPERATION_EXPAND_BAND_MATRIX_SPECULATIVE_MASK_DESC\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONTRACT_BAND_MATRIX_XDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_CONTRACT_BAND_MATRIX_XDESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONTRACT_BAND_MATRIX_YDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_CONTRACT_BAND_MATRIX_YDESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONTRACT_BAND_MATRIX_LOWER_BANDWIDTH => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CUDNN_ATTR_OPERATION_CONTRACT_BAND_MATRIX_LOWER_BANDWIDTH\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONTRACT_BAND_MATRIX_UPPER_BANDWIDTH => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CUDNN_ATTR_OPERATION_CONTRACT_BAND_MATRIX_UPPER_BANDWIDTH\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONTRACT_BAND_MATRIX_AXIS => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_CONTRACT_BAND_MATRIX_AXIS)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONTRACT_BAND_MATRIX_PAD_VALUE => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_CONTRACT_BAND_MATRIX_PAD_VALUE)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_CONTRACT_BAND_MAX_TOKEN_VALUE => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_CONTRACT_BAND_MAX_TOKEN_VALUE)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_RNG_DISTRIBUTION => {\n                writer.write_all(stringify!(CUDNN_ATTR_RNG_DISTRIBUTION).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_RNG_NORMAL_DIST_MEAN => {\n                writer.write_all(stringify!(CUDNN_ATTR_RNG_NORMAL_DIST_MEAN).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_RNG_NORMAL_DIST_STANDARD_DEVIATION => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_RNG_NORMAL_DIST_STANDARD_DEVIATION)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_RNG_UNIFORM_DIST_MAXIMUM => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_RNG_UNIFORM_DIST_MAXIMUM).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_RNG_UNIFORM_DIST_MINIMUM => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_RNG_UNIFORM_DIST_MINIMUM).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_RNG_BERNOULLI_DIST_PROBABILITY => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_RNG_BERNOULLI_DIST_PROBABILITY).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_RNG_YDESC => {\n                writer.write_all(stringify!(CUDNN_ATTR_OPERATION_RNG_YDESC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_RNG_SEED => {\n                writer.write_all(stringify!(CUDNN_ATTR_OPERATION_RNG_SEED).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_RNG_DESC => {\n                writer.write_all(stringify!(CUDNN_ATTR_OPERATION_RNG_DESC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_RNG_OFFSET_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_RNG_OFFSET_DESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_KERNEL_CACHE_OPERATION_GRAPH => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_KERNEL_CACHE_OPERATION_GRAPH).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_KERNEL_CACHE_IS_ENGINECFG_KERNEL_CACHED => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_KERNEL_CACHE_IS_ENGINECFG_KERNEL_CACHED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_KERNEL_CACHE_JSON_REPRESENTATION => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_KERNEL_CACHE_JSON_REPRESENTATION)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BLOCK_SCALE_QUANTIZE_XDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BLOCK_SCALE_QUANTIZE_XDESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BLOCK_SCALE_QUANTIZE_YDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BLOCK_SCALE_QUANTIZE_YDESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BLOCK_SCALE_QUANTIZE_SCALE_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BLOCK_SCALE_QUANTIZE_SCALE_DESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BLOCK_SCALE_QUANTIZE_MATH_PREC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BLOCK_SCALE_QUANTIZE_MATH_PREC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BLOCK_SCALE_QUANTIZE_BLOCK_SIZE => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BLOCK_SCALE_QUANTIZE_BLOCK_SIZE)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BLOCK_SCALE_DEQUANTIZE_XDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BLOCK_SCALE_DEQUANTIZE_XDESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BLOCK_SCALE_DEQUANTIZE_SCALE_DESC => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CUDNN_ATTR_OPERATION_BLOCK_SCALE_DEQUANTIZE_SCALE_DESC\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BLOCK_SCALE_DEQUANTIZE_YDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BLOCK_SCALE_DEQUANTIZE_YDESC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BLOCK_SCALE_DEQUANTIZE_MATH_PREC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BLOCK_SCALE_DEQUANTIZE_MATH_PREC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BLOCK_SCALE_DEQUANTIZE_BLOCK_SIZE => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CUDNN_ATTR_OPERATION_BLOCK_SCALE_DEQUANTIZE_BLOCK_SIZE\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_BLOCK_SCALE_DEQUANTIZE_NEG_SCALE => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_BLOCK_SCALE_DEQUANTIZE_NEG_SCALE)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_DEVICEPROP_DEVICE_ID => {\n                writer.write_all(stringify!(CUDNN_ATTR_DEVICEPROP_DEVICE_ID).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_DEVICEPROP_HANDLE => {\n                writer.write_all(stringify!(CUDNN_ATTR_DEVICEPROP_HANDLE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_DEVICEPROP_JSON_REPRESENTATION => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_DEVICEPROP_JSON_REPRESENTATION).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_SDPA_FWD_QDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_SDPA_FWD_QDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_SDPA_FWD_KDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_SDPA_FWD_KDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_SDPA_FWD_VDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_SDPA_FWD_VDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_SDPA_FWD_ODESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_SDPA_FWD_ODESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_SDPA_FWD_STATSDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_SDPA_FWD_STATSDESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeName_t::CUDNN_ATTR_OPERATION_SDPA_FWD_SCALEDESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_ATTR_OPERATION_SDPA_FWD_SCALEDESC).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnBackendAttributeType_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_HANDLE => {\n                writer.write_all(stringify!(CUDNN_TYPE_HANDLE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_DATA_TYPE => {\n                writer.write_all(stringify!(CUDNN_TYPE_DATA_TYPE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_BOOLEAN => {\n                writer.write_all(stringify!(CUDNN_TYPE_BOOLEAN).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_INT64 => {\n                writer.write_all(stringify!(CUDNN_TYPE_INT64).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_FLOAT => {\n                writer.write_all(stringify!(CUDNN_TYPE_FLOAT).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_DOUBLE => {\n                writer.write_all(stringify!(CUDNN_TYPE_DOUBLE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_VOID_PTR => {\n                writer.write_all(stringify!(CUDNN_TYPE_VOID_PTR).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_CONVOLUTION_MODE => {\n                writer.write_all(stringify!(CUDNN_TYPE_CONVOLUTION_MODE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_HEUR_MODE => {\n                writer.write_all(stringify!(CUDNN_TYPE_HEUR_MODE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_KNOB_TYPE => {\n                writer.write_all(stringify!(CUDNN_TYPE_KNOB_TYPE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_NAN_PROPOGATION => {\n                writer.write_all(stringify!(CUDNN_TYPE_NAN_PROPOGATION).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_NUMERICAL_NOTE => {\n                writer.write_all(stringify!(CUDNN_TYPE_NUMERICAL_NOTE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_LAYOUT_TYPE => {\n                writer.write_all(stringify!(CUDNN_TYPE_LAYOUT_TYPE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_ATTRIB_NAME => {\n                writer.write_all(stringify!(CUDNN_TYPE_ATTRIB_NAME).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_POINTWISE_MODE => {\n                writer.write_all(stringify!(CUDNN_TYPE_POINTWISE_MODE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_BACKEND_DESCRIPTOR => {\n                writer.write_all(stringify!(CUDNN_TYPE_BACKEND_DESCRIPTOR).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_GENSTATS_MODE => {\n                writer.write_all(stringify!(CUDNN_TYPE_GENSTATS_MODE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_BN_FINALIZE_STATS_MODE => {\n                writer\n                    .write_all(stringify!(CUDNN_TYPE_BN_FINALIZE_STATS_MODE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_REDUCTION_OPERATOR_TYPE => {\n                writer\n                    .write_all(stringify!(CUDNN_TYPE_REDUCTION_OPERATOR_TYPE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_BEHAVIOR_NOTE => {\n                writer.write_all(stringify!(CUDNN_TYPE_BEHAVIOR_NOTE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_TENSOR_REORDERING_MODE => {\n                writer\n                    .write_all(stringify!(CUDNN_TYPE_TENSOR_REORDERING_MODE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_RESAMPLE_MODE => {\n                writer.write_all(stringify!(CUDNN_TYPE_RESAMPLE_MODE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_PADDING_MODE => {\n                writer.write_all(stringify!(CUDNN_TYPE_PADDING_MODE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_INT32 => {\n                writer.write_all(stringify!(CUDNN_TYPE_INT32).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_CHAR => {\n                writer.write_all(stringify!(CUDNN_TYPE_CHAR).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_SIGNAL_MODE => {\n                writer.write_all(stringify!(CUDNN_TYPE_SIGNAL_MODE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_FRACTION => {\n                writer.write_all(stringify!(CUDNN_TYPE_FRACTION).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_NORM_MODE => {\n                writer.write_all(stringify!(CUDNN_TYPE_NORM_MODE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_NORM_FWD_PHASE => {\n                writer.write_all(stringify!(CUDNN_TYPE_NORM_FWD_PHASE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendAttributeType_t::CUDNN_TYPE_RNG_DISTRIBUTION => {\n                writer.write_all(stringify!(CUDNN_TYPE_RNG_DISTRIBUTION).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnBackendDescriptorType_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_POINTWISE_DESCRIPTOR => {\n                writer\n                    .write_all(stringify!(CUDNN_BACKEND_POINTWISE_DESCRIPTOR).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_CONVOLUTION_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BACKEND_CONVOLUTION_DESCRIPTOR).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_ENGINE_DESCRIPTOR => {\n                writer.write_all(stringify!(CUDNN_BACKEND_ENGINE_DESCRIPTOR).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_ENGINECFG_DESCRIPTOR => {\n                writer\n                    .write_all(stringify!(CUDNN_BACKEND_ENGINECFG_DESCRIPTOR).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_ENGINEHEUR_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BACKEND_ENGINEHEUR_DESCRIPTOR).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_INTERMEDIATE_INFO_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BACKEND_INTERMEDIATE_INFO_DESCRIPTOR).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_KNOB_CHOICE_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BACKEND_KNOB_CHOICE_DESCRIPTOR).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_KNOB_INFO_DESCRIPTOR => {\n                writer\n                    .write_all(stringify!(CUDNN_BACKEND_KNOB_INFO_DESCRIPTOR).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_LAYOUT_INFO_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BACKEND_LAYOUT_INFO_DESCRIPTOR).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_OPERATION_CONVOLUTION_FORWARD_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CUDNN_BACKEND_OPERATION_CONVOLUTION_FORWARD_DESCRIPTOR\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_OPERATION_CONVOLUTION_BACKWARD_FILTER_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CUDNN_BACKEND_OPERATION_CONVOLUTION_BACKWARD_FILTER_DESCRIPTOR\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_OPERATION_CONVOLUTION_BACKWARD_DATA_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CUDNN_BACKEND_OPERATION_CONVOLUTION_BACKWARD_DATA_DESCRIPTOR\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_OPERATION_POINTWISE_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BACKEND_OPERATION_POINTWISE_DESCRIPTOR)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_OPERATION_GEN_STATS_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BACKEND_OPERATION_GEN_STATS_DESCRIPTOR)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_OPERATIONGRAPH_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BACKEND_OPERATIONGRAPH_DESCRIPTOR).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_VARIANT_PACK_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BACKEND_VARIANT_PACK_DESCRIPTOR).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_TENSOR_DESCRIPTOR => {\n                writer.write_all(stringify!(CUDNN_BACKEND_TENSOR_DESCRIPTOR).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_MATMUL_DESCRIPTOR => {\n                writer.write_all(stringify!(CUDNN_BACKEND_MATMUL_DESCRIPTOR).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_OPERATION_MATMUL_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BACKEND_OPERATION_MATMUL_DESCRIPTOR).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_OPERATION_BN_FINALIZE_STATISTICS_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CUDNN_BACKEND_OPERATION_BN_FINALIZE_STATISTICS_DESCRIPTOR\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_REDUCTION_DESCRIPTOR => {\n                writer\n                    .write_all(stringify!(CUDNN_BACKEND_REDUCTION_DESCRIPTOR).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_OPERATION_REDUCTION_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BACKEND_OPERATION_REDUCTION_DESCRIPTOR)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_OPERATION_BN_BWD_WEIGHTS_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BACKEND_OPERATION_BN_BWD_WEIGHTS_DESCRIPTOR)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_RESAMPLE_DESCRIPTOR => {\n                writer\n                    .write_all(stringify!(CUDNN_BACKEND_RESAMPLE_DESCRIPTOR).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_OPERATION_RESAMPLE_FWD_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BACKEND_OPERATION_RESAMPLE_FWD_DESCRIPTOR)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_OPERATION_RESAMPLE_BWD_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BACKEND_OPERATION_RESAMPLE_BWD_DESCRIPTOR)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_OPERATION_CONCAT_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BACKEND_OPERATION_CONCAT_DESCRIPTOR).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_OPERATION_SIGNAL_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BACKEND_OPERATION_SIGNAL_DESCRIPTOR).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_OPERATION_NORM_FORWARD_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BACKEND_OPERATION_NORM_FORWARD_DESCRIPTOR)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_OPERATION_NORM_BACKWARD_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BACKEND_OPERATION_NORM_BACKWARD_DESCRIPTOR)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_OPERATION_RESHAPE_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BACKEND_OPERATION_RESHAPE_DESCRIPTOR).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_RNG_DESCRIPTOR => {\n                writer.write_all(stringify!(CUDNN_BACKEND_RNG_DESCRIPTOR).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_OPERATION_RNG_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BACKEND_OPERATION_RNG_DESCRIPTOR).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_KERNEL_CACHE_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BACKEND_KERNEL_CACHE_DESCRIPTOR).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_OPERATION_PAGED_CACHE_LOAD_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BACKEND_OPERATION_PAGED_CACHE_LOAD_DESCRIPTOR)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_OPERATION_BLOCK_SCALE_QUANTIZE_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CUDNN_BACKEND_OPERATION_BLOCK_SCALE_QUANTIZE_DESCRIPTOR\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_OPERATION_BLOCK_SCALE_DEQUANTIZE_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CUDNN_BACKEND_OPERATION_BLOCK_SCALE_DEQUANTIZE_DESCRIPTOR\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_DEVICEPROP_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BACKEND_DEVICEPROP_DESCRIPTOR).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_OPERATION_EXPAND_BAND_MATRIX_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BACKEND_OPERATION_EXPAND_BAND_MATRIX_DESCRIPTOR)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_OPERATION_CONTRACT_BAND_MATRIX_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(\n                            CUDNN_BACKEND_OPERATION_CONTRACT_BAND_MATRIX_DESCRIPTOR\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendDescriptorType_t::CUDNN_BACKEND_OPERATION_SDPA_FWD_DESCRIPTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BACKEND_OPERATION_SDPA_FWD_DESCRIPTOR)\n                            .as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnBackendNumericalNote_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnBackendNumericalNote_t::CUDNN_NUMERICAL_NOTE_TENSOR_CORE => {\n                writer.write_all(stringify!(CUDNN_NUMERICAL_NOTE_TENSOR_CORE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendNumericalNote_t::CUDNN_NUMERICAL_NOTE_DOWN_CONVERT_INPUTS => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_NUMERICAL_NOTE_DOWN_CONVERT_INPUTS).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendNumericalNote_t::CUDNN_NUMERICAL_NOTE_REDUCED_PRECISION_REDUCTION => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_NUMERICAL_NOTE_REDUCED_PRECISION_REDUCTION)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendNumericalNote_t::CUDNN_NUMERICAL_NOTE_FFT => {\n                writer.write_all(stringify!(CUDNN_NUMERICAL_NOTE_FFT).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendNumericalNote_t::CUDNN_NUMERICAL_NOTE_NONDETERMINISTIC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_NUMERICAL_NOTE_NONDETERMINISTIC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendNumericalNote_t::CUDNN_NUMERICAL_NOTE_WINOGRAD => {\n                writer.write_all(stringify!(CUDNN_NUMERICAL_NOTE_WINOGRAD).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendNumericalNote_t::CUDNN_NUMERICAL_NOTE_WINOGRAD_TILE_4x4 => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_NUMERICAL_NOTE_WINOGRAD_TILE_4x4).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendNumericalNote_t::CUDNN_NUMERICAL_NOTE_WINOGRAD_TILE_6x6 => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_NUMERICAL_NOTE_WINOGRAD_TILE_6x6).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendNumericalNote_t::CUDNN_NUMERICAL_NOTE_WINOGRAD_TILE_13x13 => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_NUMERICAL_NOTE_WINOGRAD_TILE_13x13).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendNumericalNote_t::CUDNN_NUMERICAL_NOTE_STRICT_NAN_PROP => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_NUMERICAL_NOTE_STRICT_NAN_PROP).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendNumericalNote_t::CUDNN_NUMERICAL_NOTE_TYPE_COUNT => {\n                writer.write_all(stringify!(CUDNN_NUMERICAL_NOTE_TYPE_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnBackendBehaviorNote_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnBackendBehaviorNote_t::CUDNN_BEHAVIOR_NOTE_RUNTIME_COMPILATION => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BEHAVIOR_NOTE_RUNTIME_COMPILATION).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendBehaviorNote_t::CUDNN_BEHAVIOR_NOTE_REQUIRES_FILTER_INT8x32_REORDER => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BEHAVIOR_NOTE_REQUIRES_FILTER_INT8x32_REORDER)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendBehaviorNote_t::CUDNN_BEHAVIOR_NOTE_REQUIRES_BIAS_INT8x32_REORDER => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BEHAVIOR_NOTE_REQUIRES_BIAS_INT8x32_REORDER)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendBehaviorNote_t::CUDNN_BEHAVIOR_NOTE_SUPPORTS_CUDA_GRAPH_NATIVE_API => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BEHAVIOR_NOTE_SUPPORTS_CUDA_GRAPH_NATIVE_API)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendBehaviorNote_t::CUDNN_BEHAVIOR_NOTE_TYPE_COUNT => {\n                writer.write_all(stringify!(CUDNN_BEHAVIOR_NOTE_TYPE_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnBackendKnobType_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_SPLIT_K => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_SPLIT_K).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_SWIZZLE => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_SWIZZLE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_TILE_SIZE => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_TILE_SIZE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_USE_TEX => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_USE_TEX).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_EDGE => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_EDGE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_KBLOCK => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_KBLOCK).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_LDGA => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_LDGA).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_LDGB => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_LDGB).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_CHUNK_K => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_CHUNK_K).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_SPLIT_H => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_SPLIT_H).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_WINO_TILE => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_WINO_TILE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_MULTIPLY => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_MULTIPLY).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_SPLIT_K_BUF => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_SPLIT_K_BUF).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_TILEK => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_TILEK).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_STAGES => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_STAGES).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_REDUCTION_MODE => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_REDUCTION_MODE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_CTA_SPLIT_K_MODE => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_CTA_SPLIT_K_MODE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_SPLIT_K_SLC => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_SPLIT_K_SLC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_IDX_MODE => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_IDX_MODE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_SLICED => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_SLICED).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_SPLIT_RS => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_SPLIT_RS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_SINGLEBUFFER => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_SINGLEBUFFER).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_LDGC => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_LDGC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_SPECFILT => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_SPECFILT).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_KERNEL_CFG => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_KERNEL_CFG).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_WORKSPACE => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_WORKSPACE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_TILE_CGA => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_TILE_CGA).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_TILE_CGA_M => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_TILE_CGA_M).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_TILE_CGA_N => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_TILE_CGA_N).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_BLOCK_SIZE => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_BLOCK_SIZE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_OCCUPANCY => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_OCCUPANCY).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_ARRAY_SIZE_PER_THREAD => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_KNOB_TYPE_ARRAY_SIZE_PER_THREAD).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_NUM_C_PER_BLOCK => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_NUM_C_PER_BLOCK).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_SPLIT_COLS => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_SPLIT_COLS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_TILE_ROWS => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_TILE_ROWS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_TILE_COLS => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_TILE_COLS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_LOAD_SIZE => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_LOAD_SIZE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_CTA_COUNT => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_CTA_COUNT).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_STREAM_K => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_STREAM_K).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_SPLIT_P_SLC => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_SPLIT_P_SLC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_TILE_M => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_TILE_M).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_TILE_N => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_TILE_N).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_WARP_SPEC_CFG => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_WARP_SPEC_CFG).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendKnobType_t::CUDNN_KNOB_TYPE_COUNTS => {\n                writer.write_all(stringify!(CUDNN_KNOB_TYPE_COUNTS).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnBackendLayoutType_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnBackendLayoutType_t::CUDNN_LAYOUT_TYPE_PREFERRED_NCHW => {\n                writer.write_all(stringify!(CUDNN_LAYOUT_TYPE_PREFERRED_NCHW).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendLayoutType_t::CUDNN_LAYOUT_TYPE_PREFERRED_NHWC => {\n                writer.write_all(stringify!(CUDNN_LAYOUT_TYPE_PREFERRED_NHWC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendLayoutType_t::CUDNN_LAYOUT_TYPE_PREFERRED_PAD4CK => {\n                writer\n                    .write_all(stringify!(CUDNN_LAYOUT_TYPE_PREFERRED_PAD4CK).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendLayoutType_t::CUDNN_LAYOUT_TYPE_PREFERRED_PAD8CK => {\n                writer\n                    .write_all(stringify!(CUDNN_LAYOUT_TYPE_PREFERRED_PAD8CK).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendLayoutType_t::CUDNN_LAYOUT_TYPE_COUNT => {\n                writer.write_all(stringify!(CUDNN_LAYOUT_TYPE_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnBackendHeurMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnBackendHeurMode_t::CUDNN_HEUR_MODE_INSTANT => {\n                writer.write_all(stringify!(CUDNN_HEUR_MODE_INSTANT).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendHeurMode_t::CUDNN_HEUR_MODE_B => {\n                writer.write_all(stringify!(CUDNN_HEUR_MODE_B).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendHeurMode_t::CUDNN_HEUR_MODE_FALLBACK => {\n                writer.write_all(stringify!(CUDNN_HEUR_MODE_FALLBACK).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendHeurMode_t::CUDNN_HEUR_MODE_A => {\n                writer.write_all(stringify!(CUDNN_HEUR_MODE_A).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendHeurMode_t::CUDNN_HEUR_MODES_COUNT => {\n                writer.write_all(stringify!(CUDNN_HEUR_MODES_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnBackendTensorReordering_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnBackendTensorReordering_t::CUDNN_TENSOR_REORDERING_NONE => {\n                writer.write_all(stringify!(CUDNN_TENSOR_REORDERING_NONE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendTensorReordering_t::CUDNN_TENSOR_REORDERING_INT8x32 => {\n                writer.write_all(stringify!(CUDNN_TENSOR_REORDERING_INT8x32).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendTensorReordering_t::CUDNN_TENSOR_REORDERING_F16x16 => {\n                writer.write_all(stringify!(CUDNN_TENSOR_REORDERING_F16x16).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendTensorReordering_t::CUDNN_TENSOR_REORDERING_F8_128x4 => {\n                writer.write_all(stringify!(CUDNN_TENSOR_REORDERING_F8_128x4).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnPaddingMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnPaddingMode_t::CUDNN_ZERO_PAD => {\n                writer.write_all(stringify!(CUDNN_ZERO_PAD).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPaddingMode_t::CUDNN_NEG_INF_PAD => {\n                writer.write_all(stringify!(CUDNN_NEG_INF_PAD).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPaddingMode_t::CUDNN_EDGE_VAL_PAD => {\n                writer.write_all(stringify!(CUDNN_EDGE_VAL_PAD).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnBackendNormMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnBackendNormMode_t::CUDNN_LAYER_NORM => {\n                writer.write_all(stringify!(CUDNN_LAYER_NORM).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendNormMode_t::CUDNN_INSTANCE_NORM => {\n                writer.write_all(stringify!(CUDNN_INSTANCE_NORM).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendNormMode_t::CUDNN_BATCH_NORM => {\n                writer.write_all(stringify!(CUDNN_BATCH_NORM).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendNormMode_t::CUDNN_GROUP_NORM => {\n                writer.write_all(stringify!(CUDNN_GROUP_NORM).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendNormMode_t::CUDNN_RMS_NORM => {\n                writer.write_all(stringify!(CUDNN_RMS_NORM).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendNormMode_t::CUDNN_ADA_LAYER_NORM => {\n                writer.write_all(stringify!(CUDNN_ADA_LAYER_NORM).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnBackendNormFwdPhase_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnBackendNormFwdPhase_t::CUDNN_NORM_FWD_INFERENCE => {\n                writer.write_all(stringify!(CUDNN_NORM_FWD_INFERENCE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBackendNormFwdPhase_t::CUDNN_NORM_FWD_TRAINING => {\n                writer.write_all(stringify!(CUDNN_NORM_FWD_TRAINING).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cudnnBackendCreateDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    descriptorType: cuda_types::cudnn9::cudnnBackendDescriptorType_t,\n    descriptor: *mut cuda_types::cudnn9::cudnnBackendDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(descriptorType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descriptorType,\n        \"cudnnBackendCreateDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descriptor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descriptor,\n        \"cudnnBackendCreateDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnBackendDestroyDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    descriptor: cuda_types::cudnn9::cudnnBackendDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(descriptor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descriptor,\n        \"cudnnBackendDestroyDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnBackendInitialize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    descriptor: cuda_types::cudnn9::cudnnBackendDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(descriptor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descriptor, \"cudnnBackendInitialize\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnBackendFinalize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    descriptor: cuda_types::cudnn9::cudnnBackendDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(descriptor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descriptor, \"cudnnBackendFinalize\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnBackendExecute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    executionPlan: cuda_types::cudnn9::cudnnBackendDescriptor_t,\n    variantPack: cuda_types::cudnn9::cudnnBackendDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnBackendExecute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(executionPlan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&executionPlan, \"cudnnBackendExecute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(variantPack), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&variantPack, \"cudnnBackendExecute\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnBackendPopulateCudaGraph(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    executionPlan: cuda_types::cudnn9::cudnnBackendDescriptor_t,\n    variantPack: cuda_types::cudnn9::cudnnBackendDescriptor_t,\n    graph: cuda_types::cudnn9::cudaGraph_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnBackendPopulateCudaGraph\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(executionPlan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &executionPlan,\n        \"cudnnBackendPopulateCudaGraph\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(variantPack), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &variantPack,\n        \"cudnnBackendPopulateCudaGraph\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(graph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&graph, \"cudnnBackendPopulateCudaGraph\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnBackendUpdateCudaGraph(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    executionPlan: cuda_types::cudnn9::cudnnBackendDescriptor_t,\n    variantPack: cuda_types::cudnn9::cudnnBackendDescriptor_t,\n    graph: cuda_types::cudnn9::cudaGraph_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnBackendUpdateCudaGraph\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(executionPlan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &executionPlan,\n        \"cudnnBackendUpdateCudaGraph\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(variantPack), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &variantPack,\n        \"cudnnBackendUpdateCudaGraph\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(graph), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&graph, \"cudnnBackendUpdateCudaGraph\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnTensorDescriptor_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnPoolingDescriptor_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnFilterDescriptor_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnLRNDescriptor_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnActivationDescriptor_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnSpatialTransformerDescriptor_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnOpTensorDescriptor_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnReduceTensorDescriptor_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnCTCLossDescriptor_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnTensorTransformDescriptor_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnDeterminism_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnDeterminism_t::CUDNN_NON_DETERMINISTIC => {\n                writer.write_all(stringify!(CUDNN_NON_DETERMINISTIC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnDeterminism_t::CUDNN_DETERMINISTIC => {\n                writer.write_all(stringify!(CUDNN_DETERMINISTIC).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cudnnCreateTensorDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    tensorDesc: *mut cuda_types::cudnn9::cudnnTensorDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(tensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &tensorDesc,\n        \"cudnnCreateTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetTensor4dDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    tensorDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    format: cuda_types::cudnn9::cudnnTensorFormat_t,\n    dataType: cuda_types::cudnn9::cudnnDataType_t,\n    n: ::core::ffi::c_int,\n    c: ::core::ffi::c_int,\n    h: ::core::ffi::c_int,\n    w: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(tensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &tensorDesc,\n        \"cudnnSetTensor4dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(format), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&format, \"cudnnSetTensor4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnSetTensor4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cudnnSetTensor4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cudnnSetTensor4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(h), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&h, \"cudnnSetTensor4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&w, \"cudnnSetTensor4dDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetTensor4dDescriptorEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    tensorDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dataType: cuda_types::cudnn9::cudnnDataType_t,\n    n: ::core::ffi::c_int,\n    c: ::core::ffi::c_int,\n    h: ::core::ffi::c_int,\n    w: ::core::ffi::c_int,\n    nStride: ::core::ffi::c_int,\n    cStride: ::core::ffi::c_int,\n    hStride: ::core::ffi::c_int,\n    wStride: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(tensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &tensorDesc,\n        \"cudnnSetTensor4dDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dataType,\n        \"cudnnSetTensor4dDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cudnnSetTensor4dDescriptorEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cudnnSetTensor4dDescriptorEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(h), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&h, \"cudnnSetTensor4dDescriptorEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&w, \"cudnnSetTensor4dDescriptorEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nStride,\n        \"cudnnSetTensor4dDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cStride,\n        \"cudnnSetTensor4dDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hStride,\n        \"cudnnSetTensor4dDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &wStride,\n        \"cudnnSetTensor4dDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetTensor4dDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    tensorDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dataType: *mut cuda_types::cudnn9::cudnnDataType_t,\n    n: *mut ::core::ffi::c_int,\n    c: *mut ::core::ffi::c_int,\n    h: *mut ::core::ffi::c_int,\n    w: *mut ::core::ffi::c_int,\n    nStride: *mut ::core::ffi::c_int,\n    cStride: *mut ::core::ffi::c_int,\n    hStride: *mut ::core::ffi::c_int,\n    wStride: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(tensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &tensorDesc,\n        \"cudnnGetTensor4dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnGetTensor4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cudnnGetTensor4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cudnnGetTensor4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(h), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&h, \"cudnnGetTensor4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&w, \"cudnnGetTensor4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nStride, \"cudnnGetTensor4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cStride, \"cudnnGetTensor4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hStride, \"cudnnGetTensor4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&wStride, \"cudnnGetTensor4dDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetTensorNdDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    tensorDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dataType: cuda_types::cudnn9::cudnnDataType_t,\n    nbDims: ::core::ffi::c_int,\n    dimA: *const ::core::ffi::c_int,\n    strideA: *const ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(tensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &tensorDesc,\n        \"cudnnSetTensorNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnSetTensorNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDims), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nbDims, \"cudnnSetTensorNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dimA, \"cudnnSetTensorNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideA, \"cudnnSetTensorNdDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetTensorNdDescriptorEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    tensorDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    format: cuda_types::cudnn9::cudnnTensorFormat_t,\n    dataType: cuda_types::cudnn9::cudnnDataType_t,\n    nbDims: ::core::ffi::c_int,\n    dimA: *const ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(tensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &tensorDesc,\n        \"cudnnSetTensorNdDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(format), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&format, \"cudnnSetTensorNdDescriptorEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dataType,\n        \"cudnnSetTensorNdDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDims), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nbDims, \"cudnnSetTensorNdDescriptorEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dimA, \"cudnnSetTensorNdDescriptorEx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetTensorNdDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    tensorDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    nbDimsRequested: ::core::ffi::c_int,\n    dataType: *mut cuda_types::cudnn9::cudnnDataType_t,\n    nbDims: *mut ::core::ffi::c_int,\n    dimA: *mut ::core::ffi::c_int,\n    strideA: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(tensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &tensorDesc,\n        \"cudnnGetTensorNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDimsRequested), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nbDimsRequested,\n        \"cudnnGetTensorNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnGetTensorNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDims), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nbDims, \"cudnnGetTensorNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dimA, \"cudnnGetTensorNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideA, \"cudnnGetTensorNdDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetTensorSizeInBytes(\n    writer: &mut (impl std::io::Write + ?Sized),\n    tensorDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    size: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(tensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &tensorDesc,\n        \"cudnnGetTensorSizeInBytes\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cudnnGetTensorSizeInBytes\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyTensorDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    tensorDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(tensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &tensorDesc,\n        \"cudnnDestroyTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnFoldingDirection_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnFoldingDirection_t::CUDNN_TRANSFORM_FOLD => {\n                writer.write_all(stringify!(CUDNN_TRANSFORM_FOLD).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFoldingDirection_t::CUDNN_TRANSFORM_UNFOLD => {\n                writer.write_all(stringify!(CUDNN_TRANSFORM_UNFOLD).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cudnnInitTransformDest(\n    writer: &mut (impl std::io::Write + ?Sized),\n    transformDesc: cuda_types::cudnn9::cudnnTensorTransformDescriptor_t,\n    srcDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    destDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    destSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(transformDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transformDesc,\n        \"cudnnInitTransformDest\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcDesc, \"cudnnInitTransformDest\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(destDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&destDesc, \"cudnnInitTransformDest\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(destSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &destSizeInBytes,\n        \"cudnnInitTransformDest\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreateTensorTransformDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    transformDesc: *mut cuda_types::cudnn9::cudnnTensorTransformDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(transformDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transformDesc,\n        \"cudnnCreateTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetTensorTransformDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    transformDesc: cuda_types::cudnn9::cudnnTensorTransformDescriptor_t,\n    nbDims: u32,\n    destFormat: cuda_types::cudnn9::cudnnTensorFormat_t,\n    padBeforeA: *const i32,\n    padAfterA: *const i32,\n    foldA: *const u32,\n    direction: cuda_types::cudnn9::cudnnFoldingDirection_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(transformDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transformDesc,\n        \"cudnnSetTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDims), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nbDims,\n        \"cudnnSetTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(destFormat), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &destFormat,\n        \"cudnnSetTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(padBeforeA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &padBeforeA,\n        \"cudnnSetTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(padAfterA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &padAfterA,\n        \"cudnnSetTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(foldA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &foldA,\n        \"cudnnSetTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(direction), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &direction,\n        \"cudnnSetTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetTensorTransformDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    transformDesc: cuda_types::cudnn9::cudnnTensorTransformDescriptor_t,\n    nbDimsRequested: u32,\n    destFormat: *mut cuda_types::cudnn9::cudnnTensorFormat_t,\n    padBeforeA: *mut i32,\n    padAfterA: *mut i32,\n    foldA: *mut u32,\n    direction: *mut cuda_types::cudnn9::cudnnFoldingDirection_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(transformDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transformDesc,\n        \"cudnnGetTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDimsRequested), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nbDimsRequested,\n        \"cudnnGetTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(destFormat), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &destFormat,\n        \"cudnnGetTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(padBeforeA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &padBeforeA,\n        \"cudnnGetTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(padAfterA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &padAfterA,\n        \"cudnnGetTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(foldA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &foldA,\n        \"cudnnGetTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(direction), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &direction,\n        \"cudnnGetTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyTensorTransformDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    transformDesc: cuda_types::cudnn9::cudnnTensorTransformDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(transformDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transformDesc,\n        \"cudnnDestroyTensorTransformDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnTransformTensor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    alpha: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnTransformTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnTransformTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnTransformTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnTransformTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnTransformTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnTransformTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnTransformTensor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnTransformTensorEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    transDesc: cuda_types::cudnn9::cudnnTensorTransformDescriptor_t,\n    alpha: *const ::core::ffi::c_void,\n    srcDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    srcData: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    destDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    destData: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnTransformTensorEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transDesc, \"cudnnTransformTensorEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnTransformTensorEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcDesc, \"cudnnTransformTensorEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcData, \"cudnnTransformTensorEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnTransformTensorEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(destDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&destDesc, \"cudnnTransformTensorEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(destData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&destData, \"cudnnTransformTensorEx\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnAddTensor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    alpha: *const ::core::ffi::c_void,\n    aDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    A: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    cDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    C: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnAddTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnAddTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(aDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&aDesc, \"cudnnAddTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cudnnAddTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnAddTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cDesc, \"cudnnAddTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cudnnAddTensor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnOpTensorOp_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnOpTensorOp_t::CUDNN_OP_TENSOR_ADD => {\n                writer.write_all(stringify!(CUDNN_OP_TENSOR_ADD).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnOpTensorOp_t::CUDNN_OP_TENSOR_MUL => {\n                writer.write_all(stringify!(CUDNN_OP_TENSOR_MUL).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnOpTensorOp_t::CUDNN_OP_TENSOR_MIN => {\n                writer.write_all(stringify!(CUDNN_OP_TENSOR_MIN).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnOpTensorOp_t::CUDNN_OP_TENSOR_MAX => {\n                writer.write_all(stringify!(CUDNN_OP_TENSOR_MAX).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnOpTensorOp_t::CUDNN_OP_TENSOR_SQRT => {\n                writer.write_all(stringify!(CUDNN_OP_TENSOR_SQRT).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnOpTensorOp_t::CUDNN_OP_TENSOR_NOT => {\n                writer.write_all(stringify!(CUDNN_OP_TENSOR_NOT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cudnnCreateOpTensorDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    opTensorDesc: *mut cuda_types::cudnn9::cudnnOpTensorDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(opTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &opTensorDesc,\n        \"cudnnCreateOpTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetOpTensorDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    opTensorDesc: cuda_types::cudnn9::cudnnOpTensorDescriptor_t,\n    opTensorOp: cuda_types::cudnn9::cudnnOpTensorOp_t,\n    opTensorCompType: cuda_types::cudnn9::cudnnDataType_t,\n    opTensorNanOpt: cuda_types::cudnn9::cudnnNanPropagation_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(opTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &opTensorDesc,\n        \"cudnnSetOpTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opTensorOp), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &opTensorOp,\n        \"cudnnSetOpTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opTensorCompType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &opTensorCompType,\n        \"cudnnSetOpTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opTensorNanOpt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &opTensorNanOpt,\n        \"cudnnSetOpTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetOpTensorDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    opTensorDesc: cuda_types::cudnn9::cudnnOpTensorDescriptor_t,\n    opTensorOp: *mut cuda_types::cudnn9::cudnnOpTensorOp_t,\n    opTensorCompType: *mut cuda_types::cudnn9::cudnnDataType_t,\n    opTensorNanOpt: *mut cuda_types::cudnn9::cudnnNanPropagation_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(opTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &opTensorDesc,\n        \"cudnnGetOpTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opTensorOp), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &opTensorOp,\n        \"cudnnGetOpTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opTensorCompType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &opTensorCompType,\n        \"cudnnGetOpTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opTensorNanOpt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &opTensorNanOpt,\n        \"cudnnGetOpTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyOpTensorDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    opTensorDesc: cuda_types::cudnn9::cudnnOpTensorDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(opTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &opTensorDesc,\n        \"cudnnDestroyOpTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnOpTensor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    opTensorDesc: cuda_types::cudnn9::cudnnOpTensorDescriptor_t,\n    alpha1: *const ::core::ffi::c_void,\n    aDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    A: *const ::core::ffi::c_void,\n    alpha2: *const ::core::ffi::c_void,\n    bDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    B: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    cDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    C: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnOpTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opTensorDesc, \"cudnnOpTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha1, \"cudnnOpTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(aDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&aDesc, \"cudnnOpTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cudnnOpTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha2, \"cudnnOpTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bDesc, \"cudnnOpTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cudnnOpTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnOpTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cDesc, \"cudnnOpTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cudnnOpTensor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnReduceTensorIndices_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnReduceTensorIndices_t::CUDNN_REDUCE_TENSOR_NO_INDICES => {\n                writer.write_all(stringify!(CUDNN_REDUCE_TENSOR_NO_INDICES).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnReduceTensorIndices_t::CUDNN_REDUCE_TENSOR_FLATTENED_INDICES => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_REDUCE_TENSOR_FLATTENED_INDICES).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnIndicesType_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnIndicesType_t::CUDNN_32BIT_INDICES => {\n                writer.write_all(stringify!(CUDNN_32BIT_INDICES).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnIndicesType_t::CUDNN_64BIT_INDICES => {\n                writer.write_all(stringify!(CUDNN_64BIT_INDICES).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnIndicesType_t::CUDNN_16BIT_INDICES => {\n                writer.write_all(stringify!(CUDNN_16BIT_INDICES).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnIndicesType_t::CUDNN_8BIT_INDICES => {\n                writer.write_all(stringify!(CUDNN_8BIT_INDICES).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cudnnCreateReduceTensorDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    reduceTensorDesc: *mut cuda_types::cudnn9::cudnnReduceTensorDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(reduceTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorDesc,\n        \"cudnnCreateReduceTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetReduceTensorDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    reduceTensorDesc: cuda_types::cudnn9::cudnnReduceTensorDescriptor_t,\n    reduceTensorOp: cuda_types::cudnn9::cudnnReduceTensorOp_t,\n    reduceTensorCompType: cuda_types::cudnn9::cudnnDataType_t,\n    reduceTensorNanOpt: cuda_types::cudnn9::cudnnNanPropagation_t,\n    reduceTensorIndices: cuda_types::cudnn9::cudnnReduceTensorIndices_t,\n    reduceTensorIndicesType: cuda_types::cudnn9::cudnnIndicesType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(reduceTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorDesc,\n        \"cudnnSetReduceTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reduceTensorOp), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorOp,\n        \"cudnnSetReduceTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reduceTensorCompType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorCompType,\n        \"cudnnSetReduceTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reduceTensorNanOpt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorNanOpt,\n        \"cudnnSetReduceTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reduceTensorIndices), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorIndices,\n        \"cudnnSetReduceTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reduceTensorIndicesType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorIndicesType,\n        \"cudnnSetReduceTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetReduceTensorDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    reduceTensorDesc: cuda_types::cudnn9::cudnnReduceTensorDescriptor_t,\n    reduceTensorOp: *mut cuda_types::cudnn9::cudnnReduceTensorOp_t,\n    reduceTensorCompType: *mut cuda_types::cudnn9::cudnnDataType_t,\n    reduceTensorNanOpt: *mut cuda_types::cudnn9::cudnnNanPropagation_t,\n    reduceTensorIndices: *mut cuda_types::cudnn9::cudnnReduceTensorIndices_t,\n    reduceTensorIndicesType: *mut cuda_types::cudnn9::cudnnIndicesType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(reduceTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorDesc,\n        \"cudnnGetReduceTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reduceTensorOp), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorOp,\n        \"cudnnGetReduceTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reduceTensorCompType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorCompType,\n        \"cudnnGetReduceTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reduceTensorNanOpt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorNanOpt,\n        \"cudnnGetReduceTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reduceTensorIndices), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorIndices,\n        \"cudnnGetReduceTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reduceTensorIndicesType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorIndicesType,\n        \"cudnnGetReduceTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyReduceTensorDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    reduceTensorDesc: cuda_types::cudnn9::cudnnReduceTensorDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(reduceTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorDesc,\n        \"cudnnDestroyReduceTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetReductionIndicesSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    reduceTensorDesc: cuda_types::cudnn9::cudnnReduceTensorDescriptor_t,\n    aDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    cDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    sizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnGetReductionIndicesSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reduceTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorDesc,\n        \"cudnnGetReductionIndicesSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(aDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&aDesc, \"cudnnGetReductionIndicesSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cDesc, \"cudnnGetReductionIndicesSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnGetReductionIndicesSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetReductionWorkspaceSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    reduceTensorDesc: cuda_types::cudnn9::cudnnReduceTensorDescriptor_t,\n    aDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    cDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    sizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetReductionWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reduceTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reduceTensorDesc,\n        \"cudnnGetReductionWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(aDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &aDesc,\n        \"cudnnGetReductionWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cDesc,\n        \"cudnnGetReductionWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnGetReductionWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnReduceTensor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    reduceTensorDesc: cuda_types::cudnn9::cudnnReduceTensorDescriptor_t,\n    indices: *mut ::core::ffi::c_void,\n    indicesSizeInBytes: usize,\n    workspace: *mut ::core::ffi::c_void,\n    workspaceSizeInBytes: usize,\n    alpha: *const ::core::ffi::c_void,\n    aDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    A: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    cDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    C: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnReduceTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reduceTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&reduceTensorDesc, \"cudnnReduceTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(indices), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&indices, \"cudnnReduceTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(indicesSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &indicesSizeInBytes,\n        \"cudnnReduceTensor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workspace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workspace, \"cudnnReduceTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workspaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workspaceSizeInBytes,\n        \"cudnnReduceTensor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnReduceTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(aDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&aDesc, \"cudnnReduceTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cudnnReduceTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnReduceTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cDesc, \"cudnnReduceTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cudnnReduceTensor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetTensor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n    valuePtr: *const ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnSetTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnSetTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnSetTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valuePtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valuePtr, \"cudnnSetTensor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnScaleTensor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n    alpha: *const ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnScaleTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnScaleTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnScaleTensor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnScaleTensor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreateFilterDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    filterDesc: *mut cuda_types::cudnn9::cudnnFilterDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(filterDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDesc,\n        \"cudnnCreateFilterDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetFilter4dDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    filterDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    dataType: cuda_types::cudnn9::cudnnDataType_t,\n    format: cuda_types::cudnn9::cudnnTensorFormat_t,\n    k: ::core::ffi::c_int,\n    c: ::core::ffi::c_int,\n    h: ::core::ffi::c_int,\n    w: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(filterDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDesc,\n        \"cudnnSetFilter4dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnSetFilter4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(format), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&format, \"cudnnSetFilter4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cudnnSetFilter4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cudnnSetFilter4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(h), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&h, \"cudnnSetFilter4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&w, \"cudnnSetFilter4dDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetFilter4dDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    filterDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    dataType: *mut cuda_types::cudnn9::cudnnDataType_t,\n    format: *mut cuda_types::cudnn9::cudnnTensorFormat_t,\n    k: *mut ::core::ffi::c_int,\n    c: *mut ::core::ffi::c_int,\n    h: *mut ::core::ffi::c_int,\n    w: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(filterDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDesc,\n        \"cudnnGetFilter4dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnGetFilter4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(format), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&format, \"cudnnGetFilter4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(k), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&k, \"cudnnGetFilter4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cudnnGetFilter4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(h), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&h, \"cudnnGetFilter4dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&w, \"cudnnGetFilter4dDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetFilterNdDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    filterDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    nbDimsRequested: ::core::ffi::c_int,\n    dataType: *mut cuda_types::cudnn9::cudnnDataType_t,\n    format: *mut cuda_types::cudnn9::cudnnTensorFormat_t,\n    nbDims: *mut ::core::ffi::c_int,\n    filterDimA: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(filterDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDesc,\n        \"cudnnGetFilterNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDimsRequested), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nbDimsRequested,\n        \"cudnnGetFilterNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnGetFilterNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(format), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&format, \"cudnnGetFilterNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDims), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nbDims, \"cudnnGetFilterNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(filterDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDimA,\n        \"cudnnGetFilterNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetFilterSizeInBytes(\n    writer: &mut (impl std::io::Write + ?Sized),\n    filterDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    size: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(filterDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDesc,\n        \"cudnnGetFilterSizeInBytes\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cudnnGetFilterSizeInBytes\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnTransformFilter(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    transDesc: cuda_types::cudnn9::cudnnTensorTransformDescriptor_t,\n    alpha: *const ::core::ffi::c_void,\n    srcDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    srcData: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    destDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    destData: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnTransformFilter\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transDesc, \"cudnnTransformFilter\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnTransformFilter\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcDesc, \"cudnnTransformFilter\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcData, \"cudnnTransformFilter\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnTransformFilter\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(destDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&destDesc, \"cudnnTransformFilter\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(destData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&destData, \"cudnnTransformFilter\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyFilterDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    filterDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(filterDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDesc,\n        \"cudnnDestroyFilterDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnSoftmaxAlgorithm_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnSoftmaxAlgorithm_t::CUDNN_SOFTMAX_FAST => {\n                writer.write_all(stringify!(CUDNN_SOFTMAX_FAST).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnSoftmaxAlgorithm_t::CUDNN_SOFTMAX_ACCURATE => {\n                writer.write_all(stringify!(CUDNN_SOFTMAX_ACCURATE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnSoftmaxAlgorithm_t::CUDNN_SOFTMAX_LOG => {\n                writer.write_all(stringify!(CUDNN_SOFTMAX_LOG).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnSoftmaxMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnSoftmaxMode_t::CUDNN_SOFTMAX_MODE_INSTANCE => {\n                writer.write_all(stringify!(CUDNN_SOFTMAX_MODE_INSTANCE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnSoftmaxMode_t::CUDNN_SOFTMAX_MODE_CHANNEL => {\n                writer.write_all(stringify!(CUDNN_SOFTMAX_MODE_CHANNEL).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cudnnSoftmaxForward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    algo: cuda_types::cudnn9::cudnnSoftmaxAlgorithm_t,\n    mode: cuda_types::cudnn9::cudnnSoftmaxMode_t,\n    alpha: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnSoftmaxForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cudnnSoftmaxForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cudnnSoftmaxForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnSoftmaxForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnSoftmaxForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnSoftmaxForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnSoftmaxForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnSoftmaxForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnSoftmaxForward\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnPoolingMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnPoolingMode_t::CUDNN_POOLING_MAX => {\n                writer.write_all(stringify!(CUDNN_POOLING_MAX).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnPoolingMode_t::CUDNN_POOLING_AVERAGE_COUNT_INCLUDE_PADDING => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_POOLING_AVERAGE_COUNT_INCLUDE_PADDING)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnPoolingMode_t::CUDNN_POOLING_AVERAGE_COUNT_EXCLUDE_PADDING => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_POOLING_AVERAGE_COUNT_EXCLUDE_PADDING)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnPoolingMode_t::CUDNN_POOLING_MAX_DETERMINISTIC => {\n                writer.write_all(stringify!(CUDNN_POOLING_MAX_DETERMINISTIC).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cudnnCreatePoolingDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    poolingDesc: *mut cuda_types::cudnn9::cudnnPoolingDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(poolingDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &poolingDesc,\n        \"cudnnCreatePoolingDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetPooling2dDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    poolingDesc: cuda_types::cudnn9::cudnnPoolingDescriptor_t,\n    mode: cuda_types::cudnn9::cudnnPoolingMode_t,\n    maxpoolingNanOpt: cuda_types::cudnn9::cudnnNanPropagation_t,\n    windowHeight: ::core::ffi::c_int,\n    windowWidth: ::core::ffi::c_int,\n    verticalPadding: ::core::ffi::c_int,\n    horizontalPadding: ::core::ffi::c_int,\n    verticalStride: ::core::ffi::c_int,\n    horizontalStride: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(poolingDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &poolingDesc,\n        \"cudnnSetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cudnnSetPooling2dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxpoolingNanOpt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxpoolingNanOpt,\n        \"cudnnSetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(windowHeight), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &windowHeight,\n        \"cudnnSetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(windowWidth), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &windowWidth,\n        \"cudnnSetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(verticalPadding), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &verticalPadding,\n        \"cudnnSetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(horizontalPadding), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &horizontalPadding,\n        \"cudnnSetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(verticalStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &verticalStride,\n        \"cudnnSetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(horizontalStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &horizontalStride,\n        \"cudnnSetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetPooling2dDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    poolingDesc: cuda_types::cudnn9::cudnnPoolingDescriptor_t,\n    mode: *mut cuda_types::cudnn9::cudnnPoolingMode_t,\n    maxpoolingNanOpt: *mut cuda_types::cudnn9::cudnnNanPropagation_t,\n    windowHeight: *mut ::core::ffi::c_int,\n    windowWidth: *mut ::core::ffi::c_int,\n    verticalPadding: *mut ::core::ffi::c_int,\n    horizontalPadding: *mut ::core::ffi::c_int,\n    verticalStride: *mut ::core::ffi::c_int,\n    horizontalStride: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(poolingDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &poolingDesc,\n        \"cudnnGetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cudnnGetPooling2dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxpoolingNanOpt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxpoolingNanOpt,\n        \"cudnnGetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(windowHeight), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &windowHeight,\n        \"cudnnGetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(windowWidth), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &windowWidth,\n        \"cudnnGetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(verticalPadding), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &verticalPadding,\n        \"cudnnGetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(horizontalPadding), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &horizontalPadding,\n        \"cudnnGetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(verticalStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &verticalStride,\n        \"cudnnGetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(horizontalStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &horizontalStride,\n        \"cudnnGetPooling2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetPoolingNdDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    poolingDesc: cuda_types::cudnn9::cudnnPoolingDescriptor_t,\n    mode: cuda_types::cudnn9::cudnnPoolingMode_t,\n    maxpoolingNanOpt: cuda_types::cudnn9::cudnnNanPropagation_t,\n    nbDims: ::core::ffi::c_int,\n    windowDimA: *const ::core::ffi::c_int,\n    paddingA: *const ::core::ffi::c_int,\n    strideA: *const ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(poolingDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &poolingDesc,\n        \"cudnnSetPoolingNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cudnnSetPoolingNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxpoolingNanOpt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxpoolingNanOpt,\n        \"cudnnSetPoolingNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDims), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nbDims, \"cudnnSetPoolingNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(windowDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &windowDimA,\n        \"cudnnSetPoolingNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paddingA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paddingA,\n        \"cudnnSetPoolingNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideA, \"cudnnSetPoolingNdDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetPoolingNdDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    poolingDesc: cuda_types::cudnn9::cudnnPoolingDescriptor_t,\n    nbDimsRequested: ::core::ffi::c_int,\n    mode: *mut cuda_types::cudnn9::cudnnPoolingMode_t,\n    maxpoolingNanOpt: *mut cuda_types::cudnn9::cudnnNanPropagation_t,\n    nbDims: *mut ::core::ffi::c_int,\n    windowDimA: *mut ::core::ffi::c_int,\n    paddingA: *mut ::core::ffi::c_int,\n    strideA: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(poolingDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &poolingDesc,\n        \"cudnnGetPoolingNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDimsRequested), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nbDimsRequested,\n        \"cudnnGetPoolingNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cudnnGetPoolingNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxpoolingNanOpt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxpoolingNanOpt,\n        \"cudnnGetPoolingNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDims), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nbDims, \"cudnnGetPoolingNdDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(windowDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &windowDimA,\n        \"cudnnGetPoolingNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paddingA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paddingA,\n        \"cudnnGetPoolingNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&strideA, \"cudnnGetPoolingNdDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetPoolingNdForwardOutputDim(\n    writer: &mut (impl std::io::Write + ?Sized),\n    poolingDesc: cuda_types::cudnn9::cudnnPoolingDescriptor_t,\n    inputTensorDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    nbDims: ::core::ffi::c_int,\n    outputTensorDimA: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(poolingDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &poolingDesc,\n        \"cudnnGetPoolingNdForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inputTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &inputTensorDesc,\n        \"cudnnGetPoolingNdForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDims), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nbDims,\n        \"cudnnGetPoolingNdForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(outputTensorDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &outputTensorDimA,\n        \"cudnnGetPoolingNdForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetPooling2dForwardOutputDim(\n    writer: &mut (impl std::io::Write + ?Sized),\n    poolingDesc: cuda_types::cudnn9::cudnnPoolingDescriptor_t,\n    inputTensorDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    n: *mut ::core::ffi::c_int,\n    c: *mut ::core::ffi::c_int,\n    h: *mut ::core::ffi::c_int,\n    w: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(poolingDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &poolingDesc,\n        \"cudnnGetPooling2dForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inputTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &inputTensorDesc,\n        \"cudnnGetPooling2dForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cudnnGetPooling2dForwardOutputDim\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c, \"cudnnGetPooling2dForwardOutputDim\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(h), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&h, \"cudnnGetPooling2dForwardOutputDim\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&w, \"cudnnGetPooling2dForwardOutputDim\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyPoolingDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    poolingDesc: cuda_types::cudnn9::cudnnPoolingDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(poolingDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &poolingDesc,\n        \"cudnnDestroyPoolingDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnPoolingForward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    poolingDesc: cuda_types::cudnn9::cudnnPoolingDescriptor_t,\n    alpha: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnPoolingForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(poolingDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&poolingDesc, \"cudnnPoolingForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnPoolingForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnPoolingForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnPoolingForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnPoolingForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnPoolingForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnPoolingForward\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreateActivationDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    activationDesc: *mut cuda_types::cudnn9::cudnnActivationDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnCreateActivationDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetActivationDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n    mode: cuda_types::cudnn9::cudnnActivationMode_t,\n    reluNanOpt: cuda_types::cudnn9::cudnnNanPropagation_t,\n    coef: f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnSetActivationDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cudnnSetActivationDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reluNanOpt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reluNanOpt,\n        \"cudnnSetActivationDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(coef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&coef, \"cudnnSetActivationDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetActivationDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n    mode: *mut cuda_types::cudnn9::cudnnActivationMode_t,\n    reluNanOpt: *mut cuda_types::cudnn9::cudnnNanPropagation_t,\n    coef: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnGetActivationDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cudnnGetActivationDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reluNanOpt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reluNanOpt,\n        \"cudnnGetActivationDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(coef), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&coef, \"cudnnGetActivationDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetActivationDescriptorSwishBeta(\n    writer: &mut (impl std::io::Write + ?Sized),\n    activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n    swish_beta: f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnSetActivationDescriptorSwishBeta\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(swish_beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &swish_beta,\n        \"cudnnSetActivationDescriptorSwishBeta\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetActivationDescriptorSwishBeta(\n    writer: &mut (impl std::io::Write + ?Sized),\n    activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n    swish_beta: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnGetActivationDescriptorSwishBeta\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(swish_beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &swish_beta,\n        \"cudnnGetActivationDescriptorSwishBeta\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyActivationDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnDestroyActivationDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnActivationForward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n    alpha: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnActivationForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnActivationForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnActivationForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnActivationForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnActivationForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnActivationForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnActivationForward\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreateLRNDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    normDesc: *mut cuda_types::cudnn9::cudnnLRNDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(normDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&normDesc, \"cudnnCreateLRNDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnLRNMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnLRNMode_t::CUDNN_LRN_CROSS_CHANNEL_DIM1 => {\n                writer.write_all(stringify!(CUDNN_LRN_CROSS_CHANNEL_DIM1).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cudnnSetLRNDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    normDesc: cuda_types::cudnn9::cudnnLRNDescriptor_t,\n    lrnN: ::core::ffi::c_uint,\n    lrnAlpha: f64,\n    lrnBeta: f64,\n    lrnK: f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(normDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&normDesc, \"cudnnSetLRNDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lrnN), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lrnN, \"cudnnSetLRNDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lrnAlpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lrnAlpha, \"cudnnSetLRNDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lrnBeta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lrnBeta, \"cudnnSetLRNDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lrnK), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lrnK, \"cudnnSetLRNDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetLRNDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    normDesc: cuda_types::cudnn9::cudnnLRNDescriptor_t,\n    lrnN: *mut ::core::ffi::c_uint,\n    lrnAlpha: *mut f64,\n    lrnBeta: *mut f64,\n    lrnK: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(normDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&normDesc, \"cudnnGetLRNDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lrnN), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lrnN, \"cudnnGetLRNDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lrnAlpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lrnAlpha, \"cudnnGetLRNDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lrnBeta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lrnBeta, \"cudnnGetLRNDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lrnK), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lrnK, \"cudnnGetLRNDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyLRNDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    lrnDesc: cuda_types::cudnn9::cudnnLRNDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(lrnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lrnDesc, \"cudnnDestroyLRNDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnLRNCrossChannelForward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    normDesc: cuda_types::cudnn9::cudnnLRNDescriptor_t,\n    lrnMode: cuda_types::cudnn9::cudnnLRNMode_t,\n    alpha: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnLRNCrossChannelForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normDesc,\n        \"cudnnLRNCrossChannelForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lrnMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lrnMode, \"cudnnLRNCrossChannelForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnLRNCrossChannelForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnLRNCrossChannelForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnLRNCrossChannelForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnLRNCrossChannelForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnLRNCrossChannelForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnLRNCrossChannelForward\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnDivNormMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnDivNormMode_t::CUDNN_DIVNORM_PRECOMPUTED_MEANS => {\n                writer.write_all(stringify!(CUDNN_DIVNORM_PRECOMPUTED_MEANS).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cudnnDivisiveNormalizationForward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    normDesc: cuda_types::cudnn9::cudnnLRNDescriptor_t,\n    mode: cuda_types::cudnn9::cudnnDivNormMode_t,\n    alpha: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    means: *const ::core::ffi::c_void,\n    temp: *mut ::core::ffi::c_void,\n    temp2: *mut ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnDivisiveNormalizationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normDesc,\n        \"cudnnDivisiveNormalizationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnDivisiveNormalizationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha,\n        \"cudnnDivisiveNormalizationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnDivisiveNormalizationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnDivisiveNormalizationForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(means), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &means,\n        \"cudnnDivisiveNormalizationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(temp), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &temp,\n        \"cudnnDivisiveNormalizationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(temp2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &temp2,\n        \"cudnnDivisiveNormalizationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &beta,\n        \"cudnnDivisiveNormalizationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnDivisiveNormalizationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnDivisiveNormalizationForward\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnBatchNormMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnBatchNormMode_t::CUDNN_BATCHNORM_PER_ACTIVATION => {\n                writer.write_all(stringify!(CUDNN_BATCHNORM_PER_ACTIVATION).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBatchNormMode_t::CUDNN_BATCHNORM_SPATIAL => {\n                writer.write_all(stringify!(CUDNN_BATCHNORM_SPATIAL).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBatchNormMode_t::CUDNN_BATCHNORM_SPATIAL_PERSISTENT => {\n                writer\n                    .write_all(stringify!(CUDNN_BATCHNORM_SPATIAL_PERSISTENT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cudnnDeriveBNTensorDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    derivedBnDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    mode: cuda_types::cudnn9::cudnnBatchNormMode_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(derivedBnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &derivedBnDesc,\n        \"cudnnDeriveBNTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnDeriveBNTensorDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cudnnDeriveBNTensorDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnBatchNormOps_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnBatchNormOps_t::CUDNN_BATCHNORM_OPS_BN => {\n                writer.write_all(stringify!(CUDNN_BATCHNORM_OPS_BN).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBatchNormOps_t::CUDNN_BATCHNORM_OPS_BN_ACTIVATION => {\n                writer\n                    .write_all(stringify!(CUDNN_BATCHNORM_OPS_BN_ACTIVATION).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnBatchNormOps_t::CUDNN_BATCHNORM_OPS_BN_ADD_ACTIVATION => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_BATCHNORM_OPS_BN_ADD_ACTIVATION).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cudnnBatchNormalizationForwardInference(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    mode: cuda_types::cudnn9::cudnnBatchNormMode_t,\n    alpha: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n    bnScaleBiasMeanVarDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    bnScale: *const ::core::ffi::c_void,\n    bnBias: *const ::core::ffi::c_void,\n    estimatedMean: *const ::core::ffi::c_void,\n    estimatedVariance: *const ::core::ffi::c_void,\n    epsilon: f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnBatchNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnBatchNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha,\n        \"cudnnBatchNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &beta,\n        \"cudnnBatchNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnBatchNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cudnnBatchNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnBatchNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &y,\n        \"cudnnBatchNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnScaleBiasMeanVarDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnScaleBiasMeanVarDesc,\n        \"cudnnBatchNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnScale), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnScale,\n        \"cudnnBatchNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnBias), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnBias,\n        \"cudnnBatchNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(estimatedMean), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &estimatedMean,\n        \"cudnnBatchNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(estimatedVariance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &estimatedVariance,\n        \"cudnnBatchNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(epsilon), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &epsilon,\n        \"cudnnBatchNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnNormMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnNormMode_t::CUDNN_NORM_PER_ACTIVATION => {\n                writer.write_all(stringify!(CUDNN_NORM_PER_ACTIVATION).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnNormMode_t::CUDNN_NORM_PER_CHANNEL => {\n                writer.write_all(stringify!(CUDNN_NORM_PER_CHANNEL).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnNormAlgo_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnNormAlgo_t::CUDNN_NORM_ALGO_STANDARD => {\n                writer.write_all(stringify!(CUDNN_NORM_ALGO_STANDARD).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnNormAlgo_t::CUDNN_NORM_ALGO_PERSIST => {\n                writer.write_all(stringify!(CUDNN_NORM_ALGO_PERSIST).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cudnnDeriveNormTensorDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    derivedNormScaleBiasDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    derivedNormMeanVarDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    mode: cuda_types::cudnn9::cudnnNormMode_t,\n    groupCnt: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(derivedNormScaleBiasDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &derivedNormScaleBiasDesc,\n        \"cudnnDeriveNormTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(derivedNormMeanVarDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &derivedNormMeanVarDesc,\n        \"cudnnDeriveNormTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnDeriveNormTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnDeriveNormTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(groupCnt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &groupCnt,\n        \"cudnnDeriveNormTensorDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnNormOps_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnNormOps_t::CUDNN_NORM_OPS_NORM => {\n                writer.write_all(stringify!(CUDNN_NORM_OPS_NORM).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnNormOps_t::CUDNN_NORM_OPS_NORM_ACTIVATION => {\n                writer.write_all(stringify!(CUDNN_NORM_OPS_NORM_ACTIVATION).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnNormOps_t::CUDNN_NORM_OPS_NORM_ADD_ACTIVATION => {\n                writer\n                    .write_all(stringify!(CUDNN_NORM_OPS_NORM_ADD_ACTIVATION).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cudnnNormalizationForwardInference(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    mode: cuda_types::cudnn9::cudnnNormMode_t,\n    normOps: cuda_types::cudnn9::cudnnNormOps_t,\n    algo: cuda_types::cudnn9::cudnnNormAlgo_t,\n    alpha: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    normScaleBiasDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    normScale: *const ::core::ffi::c_void,\n    normBias: *const ::core::ffi::c_void,\n    normMeanVarDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    estimatedMean: *const ::core::ffi::c_void,\n    estimatedVariance: *const ::core::ffi::c_void,\n    zDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    z: *const ::core::ffi::c_void,\n    activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n    epsilon: f64,\n    groupCnt: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normOps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normOps,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &beta,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normScaleBiasDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normScaleBiasDesc,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normScale), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normScale,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normBias), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normBias,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normMeanVarDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normMeanVarDesc,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(estimatedMean), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &estimatedMean,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(estimatedVariance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &estimatedVariance,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(zDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &zDesc,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(z), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &z,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &y,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(epsilon), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &epsilon,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(groupCnt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &groupCnt,\n        \"cudnnNormalizationForwardInference\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnSamplerType_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnSamplerType_t::CUDNN_SAMPLER_BILINEAR => {\n                writer.write_all(stringify!(CUDNN_SAMPLER_BILINEAR).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cudnnCreateSpatialTransformerDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    stDesc: *mut cuda_types::cudnn9::cudnnSpatialTransformerDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(stDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stDesc,\n        \"cudnnCreateSpatialTransformerDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetSpatialTransformerNdDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    stDesc: cuda_types::cudnn9::cudnnSpatialTransformerDescriptor_t,\n    samplerType: cuda_types::cudnn9::cudnnSamplerType_t,\n    dataType: cuda_types::cudnn9::cudnnDataType_t,\n    nbDims: ::core::ffi::c_int,\n    dimA: *const ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(stDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stDesc,\n        \"cudnnSetSpatialTransformerNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(samplerType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &samplerType,\n        \"cudnnSetSpatialTransformerNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dataType,\n        \"cudnnSetSpatialTransformerNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDims), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nbDims,\n        \"cudnnSetSpatialTransformerNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dimA,\n        \"cudnnSetSpatialTransformerNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroySpatialTransformerDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    stDesc: cuda_types::cudnn9::cudnnSpatialTransformerDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(stDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stDesc,\n        \"cudnnDestroySpatialTransformerDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSpatialTfGridGeneratorForward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    stDesc: cuda_types::cudnn9::cudnnSpatialTransformerDescriptor_t,\n    theta: *const ::core::ffi::c_void,\n    grid: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnSpatialTfGridGeneratorForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stDesc,\n        \"cudnnSpatialTfGridGeneratorForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(theta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &theta,\n        \"cudnnSpatialTfGridGeneratorForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(grid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &grid,\n        \"cudnnSpatialTfGridGeneratorForward\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSpatialTfSamplerForward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    stDesc: cuda_types::cudnn9::cudnnSpatialTransformerDescriptor_t,\n    alpha: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    grid: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnSpatialTfSamplerForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stDesc, \"cudnnSpatialTfSamplerForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnSpatialTfSamplerForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnSpatialTfSamplerForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnSpatialTfSamplerForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(grid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&grid, \"cudnnSpatialTfSamplerForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnSpatialTfSamplerForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnSpatialTfSamplerForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnSpatialTfSamplerForward\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnDropoutDescriptor_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\npub fn write_cudnnCreateDropoutDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dropoutDesc: *mut cuda_types::cudnn9::cudnnDropoutDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dropoutDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dropoutDesc,\n        \"cudnnCreateDropoutDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyDropoutDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dropoutDesc: cuda_types::cudnn9::cudnnDropoutDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dropoutDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dropoutDesc,\n        \"cudnnDestroyDropoutDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDropoutGetStatesSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    sizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnDropoutGetStatesSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnDropoutGetStatesSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDropoutGetReserveSpaceSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    xdesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    sizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(xdesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xdesc,\n        \"cudnnDropoutGetReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnDropoutGetReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetDropoutDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dropoutDesc: cuda_types::cudnn9::cudnnDropoutDescriptor_t,\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    dropout: f32,\n    states: *mut ::core::ffi::c_void,\n    stateSizeInBytes: usize,\n    seed: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dropoutDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dropoutDesc,\n        \"cudnnSetDropoutDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnSetDropoutDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dropout), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dropout, \"cudnnSetDropoutDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(states), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&states, \"cudnnSetDropoutDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stateSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stateSizeInBytes,\n        \"cudnnSetDropoutDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&seed, \"cudnnSetDropoutDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnRestoreDropoutDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dropoutDesc: cuda_types::cudnn9::cudnnDropoutDescriptor_t,\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    dropout: f32,\n    states: *mut ::core::ffi::c_void,\n    stateSizeInBytes: usize,\n    seed: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dropoutDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dropoutDesc,\n        \"cudnnRestoreDropoutDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnRestoreDropoutDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dropout), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dropout,\n        \"cudnnRestoreDropoutDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(states), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &states,\n        \"cudnnRestoreDropoutDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stateSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stateSizeInBytes,\n        \"cudnnRestoreDropoutDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&seed, \"cudnnRestoreDropoutDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetDropoutDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dropoutDesc: cuda_types::cudnn9::cudnnDropoutDescriptor_t,\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    dropout: *mut f32,\n    states: *mut *mut ::core::ffi::c_void,\n    seed: *mut ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dropoutDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dropoutDesc,\n        \"cudnnGetDropoutDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnGetDropoutDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dropout), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dropout, \"cudnnGetDropoutDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(states), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&states, \"cudnnGetDropoutDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&seed, \"cudnnGetDropoutDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDropoutForward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    dropoutDesc: cuda_types::cudnn9::cudnnDropoutDescriptor_t,\n    xdesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    ydesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n    reserveSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnDropoutForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dropoutDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dropoutDesc, \"cudnnDropoutForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xdesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xdesc, \"cudnnDropoutForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnDropoutForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ydesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ydesc, \"cudnnDropoutForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnDropoutForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&reserveSpace, \"cudnnDropoutForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnDropoutForward\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnConvolutionFwdAlgo_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnConvolutionFwdAlgo_t::CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_GEMM => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_GEMM).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnConvolutionFwdAlgo_t::CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_PRECOMP_GEMM => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_PRECOMP_GEMM)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnConvolutionFwdAlgo_t::CUDNN_CONVOLUTION_FWD_ALGO_GEMM => {\n                writer.write_all(stringify!(CUDNN_CONVOLUTION_FWD_ALGO_GEMM).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnConvolutionFwdAlgo_t::CUDNN_CONVOLUTION_FWD_ALGO_DIRECT => {\n                writer\n                    .write_all(stringify!(CUDNN_CONVOLUTION_FWD_ALGO_DIRECT).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnConvolutionFwdAlgo_t::CUDNN_CONVOLUTION_FWD_ALGO_FFT => {\n                writer.write_all(stringify!(CUDNN_CONVOLUTION_FWD_ALGO_FFT).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnConvolutionFwdAlgo_t::CUDNN_CONVOLUTION_FWD_ALGO_FFT_TILING => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_CONVOLUTION_FWD_ALGO_FFT_TILING).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnConvolutionFwdAlgo_t::CUDNN_CONVOLUTION_FWD_ALGO_WINOGRAD => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_CONVOLUTION_FWD_ALGO_WINOGRAD).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnConvolutionFwdAlgo_t::CUDNN_CONVOLUTION_FWD_ALGO_WINOGRAD_NONFUSED => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_CONVOLUTION_FWD_ALGO_WINOGRAD_NONFUSED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnConvolutionFwdAlgo_t::CUDNN_CONVOLUTION_FWD_ALGO_COUNT => {\n                writer.write_all(stringify!(CUDNN_CONVOLUTION_FWD_ALGO_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnConvolutionBwdFilterAlgo_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnConvolutionBwdFilterAlgo_t::CUDNN_CONVOLUTION_BWD_FILTER_ALGO_0 => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_CONVOLUTION_BWD_FILTER_ALGO_0).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnConvolutionBwdFilterAlgo_t::CUDNN_CONVOLUTION_BWD_FILTER_ALGO_1 => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_CONVOLUTION_BWD_FILTER_ALGO_1).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnConvolutionBwdFilterAlgo_t::CUDNN_CONVOLUTION_BWD_FILTER_ALGO_FFT => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_CONVOLUTION_BWD_FILTER_ALGO_FFT).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnConvolutionBwdFilterAlgo_t::CUDNN_CONVOLUTION_BWD_FILTER_ALGO_3 => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_CONVOLUTION_BWD_FILTER_ALGO_3).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnConvolutionBwdFilterAlgo_t::CUDNN_CONVOLUTION_BWD_FILTER_ALGO_WINOGRAD => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_CONVOLUTION_BWD_FILTER_ALGO_WINOGRAD).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnConvolutionBwdFilterAlgo_t::CUDNN_CONVOLUTION_BWD_FILTER_ALGO_WINOGRAD_NONFUSED => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_CONVOLUTION_BWD_FILTER_ALGO_WINOGRAD_NONFUSED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnConvolutionBwdFilterAlgo_t::CUDNN_CONVOLUTION_BWD_FILTER_ALGO_FFT_TILING => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_CONVOLUTION_BWD_FILTER_ALGO_FFT_TILING)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnConvolutionBwdFilterAlgo_t::CUDNN_CONVOLUTION_BWD_FILTER_ALGO_COUNT => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_CONVOLUTION_BWD_FILTER_ALGO_COUNT).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnConvolutionBwdDataAlgo_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnConvolutionBwdDataAlgo_t::CUDNN_CONVOLUTION_BWD_DATA_ALGO_0 => {\n                writer\n                    .write_all(stringify!(CUDNN_CONVOLUTION_BWD_DATA_ALGO_0).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnConvolutionBwdDataAlgo_t::CUDNN_CONVOLUTION_BWD_DATA_ALGO_1 => {\n                writer\n                    .write_all(stringify!(CUDNN_CONVOLUTION_BWD_DATA_ALGO_1).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnConvolutionBwdDataAlgo_t::CUDNN_CONVOLUTION_BWD_DATA_ALGO_FFT => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_CONVOLUTION_BWD_DATA_ALGO_FFT).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnConvolutionBwdDataAlgo_t::CUDNN_CONVOLUTION_BWD_DATA_ALGO_FFT_TILING => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_CONVOLUTION_BWD_DATA_ALGO_FFT_TILING).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnConvolutionBwdDataAlgo_t::CUDNN_CONVOLUTION_BWD_DATA_ALGO_WINOGRAD => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_CONVOLUTION_BWD_DATA_ALGO_WINOGRAD).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnConvolutionBwdDataAlgo_t::CUDNN_CONVOLUTION_BWD_DATA_ALGO_WINOGRAD_NONFUSED => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_CONVOLUTION_BWD_DATA_ALGO_WINOGRAD_NONFUSED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnConvolutionBwdDataAlgo_t::CUDNN_CONVOLUTION_BWD_DATA_ALGO_COUNT => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_CONVOLUTION_BWD_DATA_ALGO_COUNT).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnCTCLossAlgo_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnCTCLossAlgo_t::CUDNN_CTC_LOSS_ALGO_DETERMINISTIC => {\n                writer\n                    .write_all(stringify!(CUDNN_CTC_LOSS_ALGO_DETERMINISTIC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnCTCLossAlgo_t::CUDNN_CTC_LOSS_ALGO_NON_DETERMINISTIC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_CTC_LOSS_ALGO_NON_DETERMINISTIC).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cudnnOpsVersionCheck(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_cudnnSoftmaxBackward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    algo: cuda_types::cudnn9::cudnnSoftmaxAlgorithm_t,\n    mode: cuda_types::cudnn9::cudnnSoftmaxMode_t,\n    alpha: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    y: *const ::core::ffi::c_void,\n    dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dy: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    dxDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dx: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnSoftmaxBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cudnnSoftmaxBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cudnnSoftmaxBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnSoftmaxBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnSoftmaxBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnSoftmaxBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dyDesc, \"cudnnSoftmaxBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dy, \"cudnnSoftmaxBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnSoftmaxBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dxDesc, \"cudnnSoftmaxBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dx, \"cudnnSoftmaxBackward\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnPoolingBackward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    poolingDesc: cuda_types::cudnn9::cudnnPoolingDescriptor_t,\n    alpha: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    y: *const ::core::ffi::c_void,\n    dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dy: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    dxDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dx: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnPoolingBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(poolingDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&poolingDesc, \"cudnnPoolingBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnPoolingBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnPoolingBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnPoolingBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dyDesc, \"cudnnPoolingBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dy, \"cudnnPoolingBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnPoolingBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnPoolingBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnPoolingBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dxDesc, \"cudnnPoolingBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dx, \"cudnnPoolingBackward\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnActivationBackward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n    alpha: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    y: *const ::core::ffi::c_void,\n    dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dy: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    dxDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dx: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnActivationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnActivationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnActivationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnActivationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnActivationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dyDesc, \"cudnnActivationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dy, \"cudnnActivationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnActivationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnActivationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnActivationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dxDesc, \"cudnnActivationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dx, \"cudnnActivationBackward\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnLRNCrossChannelBackward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    normDesc: cuda_types::cudnn9::cudnnLRNDescriptor_t,\n    lrnMode: cuda_types::cudnn9::cudnnLRNMode_t,\n    alpha: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    y: *const ::core::ffi::c_void,\n    dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dy: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    dxDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dx: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnLRNCrossChannelBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normDesc,\n        \"cudnnLRNCrossChannelBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lrnMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &lrnMode,\n        \"cudnnLRNCrossChannelBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnLRNCrossChannelBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnLRNCrossChannelBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnLRNCrossChannelBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dyDesc, \"cudnnLRNCrossChannelBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dy, \"cudnnLRNCrossChannelBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnLRNCrossChannelBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnLRNCrossChannelBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnLRNCrossChannelBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dxDesc, \"cudnnLRNCrossChannelBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dx, \"cudnnLRNCrossChannelBackward\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDivisiveNormalizationBackward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    normDesc: cuda_types::cudnn9::cudnnLRNDescriptor_t,\n    mode: cuda_types::cudnn9::cudnnDivNormMode_t,\n    alpha: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    means: *const ::core::ffi::c_void,\n    dy: *const ::core::ffi::c_void,\n    temp: *mut ::core::ffi::c_void,\n    temp2: *mut ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    dXdMeansDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dx: *mut ::core::ffi::c_void,\n    dMeans: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnDivisiveNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normDesc,\n        \"cudnnDivisiveNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnDivisiveNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha,\n        \"cudnnDivisiveNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnDivisiveNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cudnnDivisiveNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(means), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &means,\n        \"cudnnDivisiveNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dy,\n        \"cudnnDivisiveNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(temp), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &temp,\n        \"cudnnDivisiveNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(temp2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &temp2,\n        \"cudnnDivisiveNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &beta,\n        \"cudnnDivisiveNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dXdMeansDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dXdMeansDesc,\n        \"cudnnDivisiveNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dx,\n        \"cudnnDivisiveNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dMeans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dMeans,\n        \"cudnnDivisiveNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetBatchNormalizationForwardTrainingExWorkspaceSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    mode: cuda_types::cudnn9::cudnnBatchNormMode_t,\n    bnOps: cuda_types::cudnn9::cudnnBatchNormOps_t,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    zDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    bnScaleBiasMeanVarDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n    sizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetBatchNormalizationForwardTrainingExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnGetBatchNormalizationForwardTrainingExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnOps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnOps,\n        \"cudnnGetBatchNormalizationForwardTrainingExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnGetBatchNormalizationForwardTrainingExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(zDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &zDesc,\n        \"cudnnGetBatchNormalizationForwardTrainingExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnGetBatchNormalizationForwardTrainingExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnScaleBiasMeanVarDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnScaleBiasMeanVarDesc,\n        \"cudnnGetBatchNormalizationForwardTrainingExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnGetBatchNormalizationForwardTrainingExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnGetBatchNormalizationForwardTrainingExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetBatchNormalizationBackwardExWorkspaceSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    mode: cuda_types::cudnn9::cudnnBatchNormMode_t,\n    bnOps: cuda_types::cudnn9::cudnnBatchNormOps_t,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dzDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dxDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dBnScaleBiasDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n    sizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetBatchNormalizationBackwardExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnGetBatchNormalizationBackwardExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnOps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnOps,\n        \"cudnnGetBatchNormalizationBackwardExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnGetBatchNormalizationBackwardExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnGetBatchNormalizationBackwardExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dyDesc,\n        \"cudnnGetBatchNormalizationBackwardExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dzDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dzDesc,\n        \"cudnnGetBatchNormalizationBackwardExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dxDesc,\n        \"cudnnGetBatchNormalizationBackwardExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dBnScaleBiasDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dBnScaleBiasDesc,\n        \"cudnnGetBatchNormalizationBackwardExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnGetBatchNormalizationBackwardExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnGetBatchNormalizationBackwardExWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetBatchNormalizationTrainingExReserveSpaceSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    mode: cuda_types::cudnn9::cudnnBatchNormMode_t,\n    bnOps: cuda_types::cudnn9::cudnnBatchNormOps_t,\n    activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    sizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetBatchNormalizationTrainingExReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnGetBatchNormalizationTrainingExReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnOps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnOps,\n        \"cudnnGetBatchNormalizationTrainingExReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnGetBatchNormalizationTrainingExReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnGetBatchNormalizationTrainingExReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnGetBatchNormalizationTrainingExReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnBatchNormalizationForwardTraining(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    mode: cuda_types::cudnn9::cudnnBatchNormMode_t,\n    alpha: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n    bnScaleBiasMeanVarDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    bnScale: *const ::core::ffi::c_void,\n    bnBias: *const ::core::ffi::c_void,\n    exponentialAverageFactor: f64,\n    resultRunningMean: *mut ::core::ffi::c_void,\n    resultRunningVariance: *mut ::core::ffi::c_void,\n    epsilon: f64,\n    resultSaveMean: *mut ::core::ffi::c_void,\n    resultSaveInvVariance: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &beta,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &y,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnScaleBiasMeanVarDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnScaleBiasMeanVarDesc,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnScale), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnScale,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnBias), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnBias,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(exponentialAverageFactor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &exponentialAverageFactor,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultRunningMean), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resultRunningMean,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultRunningVariance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resultRunningVariance,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(epsilon), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &epsilon,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultSaveMean), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resultSaveMean,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultSaveInvVariance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resultSaveInvVariance,\n        \"cudnnBatchNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnBatchNormalizationForwardTrainingEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    mode: cuda_types::cudnn9::cudnnBatchNormMode_t,\n    bnOps: cuda_types::cudnn9::cudnnBatchNormOps_t,\n    alpha: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    xData: *const ::core::ffi::c_void,\n    zDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    zData: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    yData: *mut ::core::ffi::c_void,\n    bnScaleBiasMeanVarDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    bnScale: *const ::core::ffi::c_void,\n    bnBias: *const ::core::ffi::c_void,\n    exponentialAverageFactor: f64,\n    resultRunningMean: *mut ::core::ffi::c_void,\n    resultRunningVariance: *mut ::core::ffi::c_void,\n    epsilon: f64,\n    resultSaveMean: *mut ::core::ffi::c_void,\n    resultSaveInvVariance: *mut ::core::ffi::c_void,\n    activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n    workspace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    reserveSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnOps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnOps,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &beta,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xData,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(zDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &zDesc,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(zData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &zData,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yData,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnScaleBiasMeanVarDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnScaleBiasMeanVarDesc,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnScale), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnScale,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnBias), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnBias,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(exponentialAverageFactor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &exponentialAverageFactor,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultRunningMean), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resultRunningMean,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultRunningVariance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resultRunningVariance,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(epsilon), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &epsilon,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultSaveMean), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resultSaveMean,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultSaveInvVariance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resultSaveInvVariance,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workspace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workspace,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpace,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnBatchNormalizationForwardTrainingEx\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnBatchNormalizationBackward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    mode: cuda_types::cudnn9::cudnnBatchNormMode_t,\n    alphaDataDiff: *const ::core::ffi::c_void,\n    betaDataDiff: *const ::core::ffi::c_void,\n    alphaParamDiff: *const ::core::ffi::c_void,\n    betaParamDiff: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dy: *const ::core::ffi::c_void,\n    dxDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dx: *mut ::core::ffi::c_void,\n    dBnScaleBiasDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    bnScale: *const ::core::ffi::c_void,\n    dBnScaleResult: *mut ::core::ffi::c_void,\n    dBnBiasResult: *mut ::core::ffi::c_void,\n    epsilon: f64,\n    savedMean: *const ::core::ffi::c_void,\n    savedInvVariance: *const ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alphaDataDiff), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alphaDataDiff,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(betaDataDiff), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &betaDataDiff,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alphaParamDiff), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alphaParamDiff,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(betaParamDiff), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &betaParamDiff,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnBatchNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dyDesc,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dy, \"cudnnBatchNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dxDesc,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dx, \"cudnnBatchNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dBnScaleBiasDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dBnScaleBiasDesc,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnScale), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnScale,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dBnScaleResult), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dBnScaleResult,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dBnBiasResult), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dBnBiasResult,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(epsilon), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &epsilon,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(savedMean), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &savedMean,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(savedInvVariance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &savedInvVariance,\n        \"cudnnBatchNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnBatchNormalizationBackwardEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    mode: cuda_types::cudnn9::cudnnBatchNormMode_t,\n    bnOps: cuda_types::cudnn9::cudnnBatchNormOps_t,\n    alphaDataDiff: *const ::core::ffi::c_void,\n    betaDataDiff: *const ::core::ffi::c_void,\n    alphaParamDiff: *const ::core::ffi::c_void,\n    betaParamDiff: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    xData: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    yData: *const ::core::ffi::c_void,\n    dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dyData: *const ::core::ffi::c_void,\n    dzDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dzData: *mut ::core::ffi::c_void,\n    dxDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dxData: *mut ::core::ffi::c_void,\n    dBnScaleBiasDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    bnScaleData: *const ::core::ffi::c_void,\n    bnBiasData: *const ::core::ffi::c_void,\n    dBnScaleData: *mut ::core::ffi::c_void,\n    dBnBiasData: *mut ::core::ffi::c_void,\n    epsilon: f64,\n    savedMean: *const ::core::ffi::c_void,\n    savedInvVariance: *const ::core::ffi::c_void,\n    activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n    workSpace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    reserveSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnOps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnOps,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alphaDataDiff), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alphaDataDiff,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(betaDataDiff), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &betaDataDiff,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alphaParamDiff), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alphaParamDiff,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(betaParamDiff), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &betaParamDiff,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xData,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yData,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dyDesc,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dyData,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dzDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dzDesc,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dzData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dzData,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dxDesc,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dxData,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dBnScaleBiasDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dBnScaleBiasDesc,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnScaleData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnScaleData,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnBiasData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bnBiasData,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dBnScaleData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dBnScaleData,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dBnBiasData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dBnBiasData,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(epsilon), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &epsilon,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(savedMean), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &savedMean,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(savedInvVariance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &savedInvVariance,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpace,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpace,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnBatchNormalizationBackwardEx\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetNormalizationForwardTrainingWorkspaceSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    mode: cuda_types::cudnn9::cudnnNormMode_t,\n    normOps: cuda_types::cudnn9::cudnnNormOps_t,\n    algo: cuda_types::cudnn9::cudnnNormAlgo_t,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    zDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    normScaleBiasDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n    normMeanVarDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    sizeInBytes: *mut usize,\n    groupCnt: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetNormalizationForwardTrainingWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnGetNormalizationForwardTrainingWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normOps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normOps,\n        \"cudnnGetNormalizationForwardTrainingWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cudnnGetNormalizationForwardTrainingWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnGetNormalizationForwardTrainingWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(zDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &zDesc,\n        \"cudnnGetNormalizationForwardTrainingWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnGetNormalizationForwardTrainingWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normScaleBiasDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normScaleBiasDesc,\n        \"cudnnGetNormalizationForwardTrainingWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnGetNormalizationForwardTrainingWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normMeanVarDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normMeanVarDesc,\n        \"cudnnGetNormalizationForwardTrainingWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnGetNormalizationForwardTrainingWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(groupCnt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &groupCnt,\n        \"cudnnGetNormalizationForwardTrainingWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetNormalizationBackwardWorkspaceSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    mode: cuda_types::cudnn9::cudnnNormMode_t,\n    normOps: cuda_types::cudnn9::cudnnNormOps_t,\n    algo: cuda_types::cudnn9::cudnnNormAlgo_t,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dzDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dxDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dNormScaleBiasDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n    normMeanVarDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    sizeInBytes: *mut usize,\n    groupCnt: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetNormalizationBackwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnGetNormalizationBackwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normOps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normOps,\n        \"cudnnGetNormalizationBackwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cudnnGetNormalizationBackwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnGetNormalizationBackwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnGetNormalizationBackwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dyDesc,\n        \"cudnnGetNormalizationBackwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dzDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dzDesc,\n        \"cudnnGetNormalizationBackwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dxDesc,\n        \"cudnnGetNormalizationBackwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dNormScaleBiasDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dNormScaleBiasDesc,\n        \"cudnnGetNormalizationBackwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnGetNormalizationBackwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normMeanVarDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normMeanVarDesc,\n        \"cudnnGetNormalizationBackwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnGetNormalizationBackwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(groupCnt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &groupCnt,\n        \"cudnnGetNormalizationBackwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetNormalizationTrainingReserveSpaceSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    mode: cuda_types::cudnn9::cudnnNormMode_t,\n    normOps: cuda_types::cudnn9::cudnnNormOps_t,\n    algo: cuda_types::cudnn9::cudnnNormAlgo_t,\n    activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    sizeInBytes: *mut usize,\n    groupCnt: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetNormalizationTrainingReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnGetNormalizationTrainingReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normOps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normOps,\n        \"cudnnGetNormalizationTrainingReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cudnnGetNormalizationTrainingReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnGetNormalizationTrainingReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnGetNormalizationTrainingReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnGetNormalizationTrainingReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(groupCnt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &groupCnt,\n        \"cudnnGetNormalizationTrainingReserveSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnNormalizationForwardTraining(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    mode: cuda_types::cudnn9::cudnnNormMode_t,\n    normOps: cuda_types::cudnn9::cudnnNormOps_t,\n    algo: cuda_types::cudnn9::cudnnNormAlgo_t,\n    alpha: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    xData: *const ::core::ffi::c_void,\n    normScaleBiasDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    normScale: *const ::core::ffi::c_void,\n    normBias: *const ::core::ffi::c_void,\n    exponentialAverageFactor: f64,\n    normMeanVarDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    resultRunningMean: *mut ::core::ffi::c_void,\n    resultRunningVariance: *mut ::core::ffi::c_void,\n    epsilon: f64,\n    resultSaveMean: *mut ::core::ffi::c_void,\n    resultSaveInvVariance: *mut ::core::ffi::c_void,\n    activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n    zDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    zData: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    yData: *mut ::core::ffi::c_void,\n    workspace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    reserveSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSizeInBytes: usize,\n    groupCnt: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normOps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normOps,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &beta,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xData,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normScaleBiasDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normScaleBiasDesc,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normScale), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normScale,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normBias), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normBias,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(exponentialAverageFactor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &exponentialAverageFactor,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normMeanVarDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normMeanVarDesc,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultRunningMean), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resultRunningMean,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultRunningVariance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resultRunningVariance,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(epsilon), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &epsilon,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultSaveMean), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resultSaveMean,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(resultSaveInvVariance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &resultSaveInvVariance,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(zDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &zDesc,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(zData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &zData,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yData,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workspace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workspace,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpace,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(groupCnt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &groupCnt,\n        \"cudnnNormalizationForwardTraining\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnNormalizationBackward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    mode: cuda_types::cudnn9::cudnnNormMode_t,\n    normOps: cuda_types::cudnn9::cudnnNormOps_t,\n    algo: cuda_types::cudnn9::cudnnNormAlgo_t,\n    alphaDataDiff: *const ::core::ffi::c_void,\n    betaDataDiff: *const ::core::ffi::c_void,\n    alphaParamDiff: *const ::core::ffi::c_void,\n    betaParamDiff: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    xData: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    yData: *const ::core::ffi::c_void,\n    dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dyData: *const ::core::ffi::c_void,\n    dzDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dzData: *mut ::core::ffi::c_void,\n    dxDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dxData: *mut ::core::ffi::c_void,\n    dNormScaleBiasDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    normScaleData: *const ::core::ffi::c_void,\n    normBiasData: *const ::core::ffi::c_void,\n    dNormScaleData: *mut ::core::ffi::c_void,\n    dNormBiasData: *mut ::core::ffi::c_void,\n    epsilon: f64,\n    normMeanVarDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    savedMean: *const ::core::ffi::c_void,\n    savedInvVariance: *const ::core::ffi::c_void,\n    activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n    workSpace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    reserveSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSizeInBytes: usize,\n    groupCnt: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normOps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&normOps, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alphaDataDiff), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alphaDataDiff,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(betaDataDiff), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &betaDataDiff,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alphaParamDiff), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alphaParamDiff,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(betaParamDiff), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &betaParamDiff,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xData, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yData, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dyDesc, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dyData, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dzDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dzDesc, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dzData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dzData, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dxDesc, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dxData, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dNormScaleBiasDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dNormScaleBiasDesc,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normScaleData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normScaleData,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normBiasData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normBiasData,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dNormScaleData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dNormScaleData,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dNormBiasData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dNormBiasData,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(epsilon), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&epsilon, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normMeanVarDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normMeanVarDesc,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(savedMean), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &savedMean,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(savedInvVariance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &savedInvVariance,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpace,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpace,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnNormalizationBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(groupCnt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&groupCnt, \"cudnnNormalizationBackward\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSpatialTfGridGeneratorBackward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    stDesc: cuda_types::cudnn9::cudnnSpatialTransformerDescriptor_t,\n    dgrid: *const ::core::ffi::c_void,\n    dtheta: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnSpatialTfGridGeneratorBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stDesc,\n        \"cudnnSpatialTfGridGeneratorBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dgrid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dgrid,\n        \"cudnnSpatialTfGridGeneratorBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dtheta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dtheta,\n        \"cudnnSpatialTfGridGeneratorBackward\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSpatialTfSamplerBackward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    stDesc: cuda_types::cudnn9::cudnnSpatialTransformerDescriptor_t,\n    alpha: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    dxDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dx: *mut ::core::ffi::c_void,\n    alphaDgrid: *const ::core::ffi::c_void,\n    dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dy: *const ::core::ffi::c_void,\n    grid: *const ::core::ffi::c_void,\n    betaDgrid: *const ::core::ffi::c_void,\n    dgrid: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnSpatialTfSamplerBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stDesc,\n        \"cudnnSpatialTfSamplerBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnSpatialTfSamplerBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnSpatialTfSamplerBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnSpatialTfSamplerBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnSpatialTfSamplerBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dxDesc,\n        \"cudnnSpatialTfSamplerBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dx, \"cudnnSpatialTfSamplerBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alphaDgrid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alphaDgrid,\n        \"cudnnSpatialTfSamplerBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dyDesc,\n        \"cudnnSpatialTfSamplerBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dy, \"cudnnSpatialTfSamplerBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(grid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&grid, \"cudnnSpatialTfSamplerBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(betaDgrid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &betaDgrid,\n        \"cudnnSpatialTfSamplerBackward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dgrid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dgrid, \"cudnnSpatialTfSamplerBackward\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDropoutBackward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    dropoutDesc: cuda_types::cudnn9::cudnnDropoutDescriptor_t,\n    dydesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dy: *const ::core::ffi::c_void,\n    dxdesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dx: *mut ::core::ffi::c_void,\n    reserveSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnDropoutBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dropoutDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dropoutDesc, \"cudnnDropoutBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dydesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dydesc, \"cudnnDropoutBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dy, \"cudnnDropoutBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxdesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dxdesc, \"cudnnDropoutBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dx, \"cudnnDropoutBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&reserveSpace, \"cudnnDropoutBackward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnDropoutBackward\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnRNNAlgo_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnRNNAlgo_t::CUDNN_RNN_ALGO_STANDARD => {\n                writer.write_all(stringify!(CUDNN_RNN_ALGO_STANDARD).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnRNNAlgo_t::CUDNN_RNN_ALGO_PERSIST_STATIC => {\n                writer.write_all(stringify!(CUDNN_RNN_ALGO_PERSIST_STATIC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnRNNAlgo_t::CUDNN_RNN_ALGO_PERSIST_DYNAMIC => {\n                writer.write_all(stringify!(CUDNN_RNN_ALGO_PERSIST_DYNAMIC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnRNNAlgo_t::CUDNN_RNN_ALGO_PERSIST_STATIC_SMALL_H => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_RNN_ALGO_PERSIST_STATIC_SMALL_H).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnRNNAlgo_t::CUDNN_RNN_ALGO_COUNT => {\n                writer.write_all(stringify!(CUDNN_RNN_ALGO_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnForwardMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnForwardMode_t::CUDNN_FWD_MODE_INFERENCE => {\n                writer.write_all(stringify!(CUDNN_FWD_MODE_INFERENCE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnForwardMode_t::CUDNN_FWD_MODE_TRAINING => {\n                writer.write_all(stringify!(CUDNN_FWD_MODE_TRAINING).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnRNNMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnRNNMode_t::CUDNN_RNN_RELU => {\n                writer.write_all(stringify!(CUDNN_RNN_RELU).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnRNNMode_t::CUDNN_RNN_TANH => {\n                writer.write_all(stringify!(CUDNN_RNN_TANH).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnRNNMode_t::CUDNN_LSTM => {\n                writer.write_all(stringify!(CUDNN_LSTM).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnRNNMode_t::CUDNN_GRU => {\n                writer.write_all(stringify!(CUDNN_GRU).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnRNNBiasMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnRNNBiasMode_t::CUDNN_RNN_NO_BIAS => {\n                writer.write_all(stringify!(CUDNN_RNN_NO_BIAS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnRNNBiasMode_t::CUDNN_RNN_SINGLE_INP_BIAS => {\n                writer.write_all(stringify!(CUDNN_RNN_SINGLE_INP_BIAS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnRNNBiasMode_t::CUDNN_RNN_DOUBLE_BIAS => {\n                writer.write_all(stringify!(CUDNN_RNN_DOUBLE_BIAS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnRNNBiasMode_t::CUDNN_RNN_SINGLE_REC_BIAS => {\n                writer.write_all(stringify!(CUDNN_RNN_SINGLE_REC_BIAS).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnDirectionMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnDirectionMode_t::CUDNN_UNIDIRECTIONAL => {\n                writer.write_all(stringify!(CUDNN_UNIDIRECTIONAL).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnDirectionMode_t::CUDNN_BIDIRECTIONAL => {\n                writer.write_all(stringify!(CUDNN_BIDIRECTIONAL).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnRNNInputMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnRNNInputMode_t::CUDNN_LINEAR_INPUT => {\n                writer.write_all(stringify!(CUDNN_LINEAR_INPUT).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnRNNInputMode_t::CUDNN_SKIP_INPUT => {\n                writer.write_all(stringify!(CUDNN_SKIP_INPUT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnRNNClipMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnRNNClipMode_t::CUDNN_RNN_CLIP_NONE => {\n                writer.write_all(stringify!(CUDNN_RNN_CLIP_NONE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnRNNClipMode_t::CUDNN_RNN_CLIP_MINMAX => {\n                writer.write_all(stringify!(CUDNN_RNN_CLIP_MINMAX).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnRNNDataLayout_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnRNNDataLayout_t::CUDNN_RNN_DATA_LAYOUT_SEQ_MAJOR_UNPACKED => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_RNN_DATA_LAYOUT_SEQ_MAJOR_UNPACKED).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnRNNDataLayout_t::CUDNN_RNN_DATA_LAYOUT_SEQ_MAJOR_PACKED => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_RNN_DATA_LAYOUT_SEQ_MAJOR_PACKED).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnRNNDataLayout_t::CUDNN_RNN_DATA_LAYOUT_BATCH_MAJOR_UNPACKED => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_RNN_DATA_LAYOUT_BATCH_MAJOR_UNPACKED).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnRNNDescriptor_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnRNNDataDescriptor_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\npub fn write_cudnnCreateRNNDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDesc: *mut cuda_types::cudnn9::cudnnRNNDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnCreateRNNDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyRNNDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDesc: cuda_types::cudnn9::cudnnRNNDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnDestroyRNNDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetRNNDescriptor_v8(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDesc: cuda_types::cudnn9::cudnnRNNDescriptor_t,\n    algo: cuda_types::cudnn9::cudnnRNNAlgo_t,\n    cellMode: cuda_types::cudnn9::cudnnRNNMode_t,\n    biasMode: cuda_types::cudnn9::cudnnRNNBiasMode_t,\n    dirMode: cuda_types::cudnn9::cudnnDirectionMode_t,\n    inputMode: cuda_types::cudnn9::cudnnRNNInputMode_t,\n    dataType: cuda_types::cudnn9::cudnnDataType_t,\n    mathPrec: cuda_types::cudnn9::cudnnDataType_t,\n    mathType: cuda_types::cudnn9::cudnnMathType_t,\n    inputSize: i32,\n    hiddenSize: i32,\n    projSize: i32,\n    numLayers: i32,\n    dropoutDesc: cuda_types::cudnn9::cudnnDropoutDescriptor_t,\n    auxFlags: u32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnSetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cudnnSetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cellMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cellMode, \"cudnnSetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(biasMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&biasMode, \"cudnnSetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirMode, \"cudnnSetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inputMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&inputMode, \"cudnnSetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnSetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mathPrec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mathPrec, \"cudnnSetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mathType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mathType, \"cudnnSetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inputSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&inputSize, \"cudnnSetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hiddenSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hiddenSize, \"cudnnSetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(projSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&projSize, \"cudnnSetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numLayers), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numLayers, \"cudnnSetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dropoutDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dropoutDesc,\n        \"cudnnSetRNNDescriptor_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(auxFlags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&auxFlags, \"cudnnSetRNNDescriptor_v8\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetRNNDescriptor_v8(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDesc: cuda_types::cudnn9::cudnnRNNDescriptor_t,\n    algo: *mut cuda_types::cudnn9::cudnnRNNAlgo_t,\n    cellMode: *mut cuda_types::cudnn9::cudnnRNNMode_t,\n    biasMode: *mut cuda_types::cudnn9::cudnnRNNBiasMode_t,\n    dirMode: *mut cuda_types::cudnn9::cudnnDirectionMode_t,\n    inputMode: *mut cuda_types::cudnn9::cudnnRNNInputMode_t,\n    dataType: *mut cuda_types::cudnn9::cudnnDataType_t,\n    mathPrec: *mut cuda_types::cudnn9::cudnnDataType_t,\n    mathType: *mut cuda_types::cudnn9::cudnnMathType_t,\n    inputSize: *mut i32,\n    hiddenSize: *mut i32,\n    projSize: *mut i32,\n    numLayers: *mut i32,\n    dropoutDesc: *mut cuda_types::cudnn9::cudnnDropoutDescriptor_t,\n    auxFlags: *mut u32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnGetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cudnnGetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cellMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cellMode, \"cudnnGetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(biasMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&biasMode, \"cudnnGetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirMode, \"cudnnGetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inputMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&inputMode, \"cudnnGetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnGetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mathPrec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mathPrec, \"cudnnGetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mathType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mathType, \"cudnnGetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inputSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&inputSize, \"cudnnGetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hiddenSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hiddenSize, \"cudnnGetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(projSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&projSize, \"cudnnGetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numLayers), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numLayers, \"cudnnGetRNNDescriptor_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dropoutDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dropoutDesc,\n        \"cudnnGetRNNDescriptor_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(auxFlags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&auxFlags, \"cudnnGetRNNDescriptor_v8\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnRNNSetClip_v8(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDesc: cuda_types::cudnn9::cudnnRNNDescriptor_t,\n    clipMode: cuda_types::cudnn9::cudnnRNNClipMode_t,\n    clipNanOpt: cuda_types::cudnn9::cudnnNanPropagation_t,\n    lclip: f64,\n    rclip: f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnRNNSetClip_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clipMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&clipMode, \"cudnnRNNSetClip_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clipNanOpt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&clipNanOpt, \"cudnnRNNSetClip_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lclip), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lclip, \"cudnnRNNSetClip_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rclip), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rclip, \"cudnnRNNSetClip_v8\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnRNNSetClip_v9(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDesc: cuda_types::cudnn9::cudnnRNNDescriptor_t,\n    clipMode: cuda_types::cudnn9::cudnnRNNClipMode_t,\n    lclip: f64,\n    rclip: f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnRNNSetClip_v9\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clipMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&clipMode, \"cudnnRNNSetClip_v9\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lclip), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lclip, \"cudnnRNNSetClip_v9\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rclip), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rclip, \"cudnnRNNSetClip_v9\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnRNNGetClip_v8(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDesc: cuda_types::cudnn9::cudnnRNNDescriptor_t,\n    clipMode: *mut cuda_types::cudnn9::cudnnRNNClipMode_t,\n    clipNanOpt: *mut cuda_types::cudnn9::cudnnNanPropagation_t,\n    lclip: *mut f64,\n    rclip: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnRNNGetClip_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clipMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&clipMode, \"cudnnRNNGetClip_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clipNanOpt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&clipNanOpt, \"cudnnRNNGetClip_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lclip), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lclip, \"cudnnRNNGetClip_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rclip), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rclip, \"cudnnRNNGetClip_v8\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnRNNGetClip_v9(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDesc: cuda_types::cudnn9::cudnnRNNDescriptor_t,\n    clipMode: *mut cuda_types::cudnn9::cudnnRNNClipMode_t,\n    lclip: *mut f64,\n    rclip: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnRNNGetClip_v9\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clipMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&clipMode, \"cudnnRNNGetClip_v9\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lclip), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lclip, \"cudnnRNNGetClip_v9\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rclip), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rclip, \"cudnnRNNGetClip_v9\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnBuildRNNDynamic(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn9::cudnnRNNDescriptor_t,\n    miniBatch: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnBuildRNNDynamic\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnBuildRNNDynamic\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(miniBatch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&miniBatch, \"cudnnBuildRNNDynamic\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetRNNTempSpaceSizes(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn9::cudnnRNNDescriptor_t,\n    fwdMode: cuda_types::cudnn9::cudnnForwardMode_t,\n    xDesc: cuda_types::cudnn9::cudnnRNNDataDescriptor_t,\n    workSpaceSize: *mut usize,\n    reserveSpaceSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnGetRNNTempSpaceSizes\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnGetRNNTempSpaceSizes\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fwdMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fwdMode, \"cudnnGetRNNTempSpaceSizes\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnGetRNNTempSpaceSizes\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSize,\n        \"cudnnGetRNNTempSpaceSizes\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSize,\n        \"cudnnGetRNNTempSpaceSizes\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetRNNWeightSpaceSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn9::cudnnRNNDescriptor_t,\n    weightSpaceSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnGetRNNWeightSpaceSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnGetRNNWeightSpaceSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weightSpaceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &weightSpaceSize,\n        \"cudnnGetRNNWeightSpaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetRNNWeightParams(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn9::cudnnRNNDescriptor_t,\n    pseudoLayer: i32,\n    weightSpaceSize: usize,\n    weightSpace: *const ::core::ffi::c_void,\n    linLayerID: i32,\n    mDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    mAddr: *mut *mut ::core::ffi::c_void,\n    bDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    bAddr: *mut *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnGetRNNWeightParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnGetRNNWeightParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pseudoLayer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pseudoLayer, \"cudnnGetRNNWeightParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weightSpaceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &weightSpaceSize,\n        \"cudnnGetRNNWeightParams\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weightSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&weightSpace, \"cudnnGetRNNWeightParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(linLayerID), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&linLayerID, \"cudnnGetRNNWeightParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mDesc, \"cudnnGetRNNWeightParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mAddr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mAddr, \"cudnnGetRNNWeightParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bDesc, \"cudnnGetRNNWeightParams\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bAddr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bAddr, \"cudnnGetRNNWeightParams\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreateRNNDataDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDataDesc: *mut cuda_types::cudnn9::cudnnRNNDataDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDataDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rnnDataDesc,\n        \"cudnnCreateRNNDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyRNNDataDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDataDesc: cuda_types::cudnn9::cudnnRNNDataDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDataDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rnnDataDesc,\n        \"cudnnDestroyRNNDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetRNNDataDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDataDesc: cuda_types::cudnn9::cudnnRNNDataDescriptor_t,\n    dataType: cuda_types::cudnn9::cudnnDataType_t,\n    layout: cuda_types::cudnn9::cudnnRNNDataLayout_t,\n    maxSeqLength: ::core::ffi::c_int,\n    batchSize: ::core::ffi::c_int,\n    vectorSize: ::core::ffi::c_int,\n    seqLengthArray: *const ::core::ffi::c_int,\n    paddingFill: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDataDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rnnDataDesc,\n        \"cudnnSetRNNDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnSetRNNDataDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(layout), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&layout, \"cudnnSetRNNDataDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxSeqLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxSeqLength,\n        \"cudnnSetRNNDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchSize, \"cudnnSetRNNDataDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vectorSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vectorSize,\n        \"cudnnSetRNNDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seqLengthArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &seqLengthArray,\n        \"cudnnSetRNNDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paddingFill), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paddingFill,\n        \"cudnnSetRNNDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetRNNDataDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rnnDataDesc: cuda_types::cudnn9::cudnnRNNDataDescriptor_t,\n    dataType: *mut cuda_types::cudnn9::cudnnDataType_t,\n    layout: *mut cuda_types::cudnn9::cudnnRNNDataLayout_t,\n    maxSeqLength: *mut ::core::ffi::c_int,\n    batchSize: *mut ::core::ffi::c_int,\n    vectorSize: *mut ::core::ffi::c_int,\n    arrayLengthRequested: ::core::ffi::c_int,\n    seqLengthArray: *mut ::core::ffi::c_int,\n    paddingFill: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rnnDataDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rnnDataDesc,\n        \"cudnnGetRNNDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnGetRNNDataDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(layout), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&layout, \"cudnnGetRNNDataDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxSeqLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxSeqLength,\n        \"cudnnGetRNNDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batchSize, \"cudnnGetRNNDataDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vectorSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vectorSize,\n        \"cudnnGetRNNDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(arrayLengthRequested), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &arrayLengthRequested,\n        \"cudnnGetRNNDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seqLengthArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &seqLengthArray,\n        \"cudnnGetRNNDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paddingFill), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paddingFill,\n        \"cudnnGetRNNDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnRNNForward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn9::cudnnRNNDescriptor_t,\n    fwdMode: cuda_types::cudnn9::cudnnForwardMode_t,\n    devSeqLengths: *const i32,\n    xDesc: cuda_types::cudnn9::cudnnRNNDataDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn9::cudnnRNNDataDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n    hDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    hx: *const ::core::ffi::c_void,\n    hy: *mut ::core::ffi::c_void,\n    cDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    cx: *const ::core::ffi::c_void,\n    cy: *mut ::core::ffi::c_void,\n    weightSpaceSize: usize,\n    weightSpace: *const ::core::ffi::c_void,\n    workSpaceSize: usize,\n    workSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSize: usize,\n    reserveSpace: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fwdMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fwdMode, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devSeqLengths), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&devSeqLengths, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hDesc, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hx, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hy, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cDesc, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cx, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cy, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weightSpaceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&weightSpaceSize, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weightSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&weightSpace, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSpaceSize, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSpace, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&reserveSpaceSize, \"cudnnRNNForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&reserveSpace, \"cudnnRNNForward\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnSeqDataAxis_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnSeqDataAxis_t::CUDNN_SEQDATA_TIME_DIM => {\n                writer.write_all(stringify!(CUDNN_SEQDATA_TIME_DIM).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnSeqDataAxis_t::CUDNN_SEQDATA_BATCH_DIM => {\n                writer.write_all(stringify!(CUDNN_SEQDATA_BATCH_DIM).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnSeqDataAxis_t::CUDNN_SEQDATA_BEAM_DIM => {\n                writer.write_all(stringify!(CUDNN_SEQDATA_BEAM_DIM).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnSeqDataAxis_t::CUDNN_SEQDATA_VECT_DIM => {\n                writer.write_all(stringify!(CUDNN_SEQDATA_VECT_DIM).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnSeqDataDescriptor_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\npub fn write_cudnnCreateSeqDataDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    seqDataDesc: *mut cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(seqDataDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &seqDataDesc,\n        \"cudnnCreateSeqDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroySeqDataDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    seqDataDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(seqDataDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &seqDataDesc,\n        \"cudnnDestroySeqDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetSeqDataDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    seqDataDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n    dataType: cuda_types::cudnn9::cudnnDataType_t,\n    nbDims: ::core::ffi::c_int,\n    dimA: *const ::core::ffi::c_int,\n    axes: *const cuda_types::cudnn9::cudnnSeqDataAxis_t,\n    seqLengthArraySize: usize,\n    seqLengthArray: *const ::core::ffi::c_int,\n    paddingFill: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(seqDataDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &seqDataDesc,\n        \"cudnnSetSeqDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnSetSeqDataDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDims), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nbDims, \"cudnnSetSeqDataDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dimA, \"cudnnSetSeqDataDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(axes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&axes, \"cudnnSetSeqDataDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seqLengthArraySize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &seqLengthArraySize,\n        \"cudnnSetSeqDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seqLengthArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &seqLengthArray,\n        \"cudnnSetSeqDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paddingFill), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paddingFill,\n        \"cudnnSetSeqDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetSeqDataDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    seqDataDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n    dataType: *mut cuda_types::cudnn9::cudnnDataType_t,\n    nbDims: *mut ::core::ffi::c_int,\n    nbDimsRequested: ::core::ffi::c_int,\n    dimA: *mut ::core::ffi::c_int,\n    axes: *mut cuda_types::cudnn9::cudnnSeqDataAxis_t,\n    seqLengthArraySize: *mut usize,\n    seqLengthSizeRequested: usize,\n    seqLengthArray: *mut ::core::ffi::c_int,\n    paddingFill: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(seqDataDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &seqDataDesc,\n        \"cudnnGetSeqDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnGetSeqDataDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDims), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nbDims, \"cudnnGetSeqDataDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDimsRequested), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nbDimsRequested,\n        \"cudnnGetSeqDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dimA, \"cudnnGetSeqDataDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(axes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&axes, \"cudnnGetSeqDataDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seqLengthArraySize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &seqLengthArraySize,\n        \"cudnnGetSeqDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seqLengthSizeRequested), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &seqLengthSizeRequested,\n        \"cudnnGetSeqDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(seqLengthArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &seqLengthArray,\n        \"cudnnGetSeqDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paddingFill), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paddingFill,\n        \"cudnnGetSeqDataDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnAttnDescriptor_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\npub fn write_cudnnCreateAttnDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    attnDesc: *mut cuda_types::cudnn9::cudnnAttnDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(attnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attnDesc, \"cudnnCreateAttnDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyAttnDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    attnDesc: cuda_types::cudnn9::cudnnAttnDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(attnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attnDesc, \"cudnnDestroyAttnDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetAttnDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    attnDesc: cuda_types::cudnn9::cudnnAttnDescriptor_t,\n    attnMode: ::core::ffi::c_uint,\n    nHeads: ::core::ffi::c_int,\n    smScaler: f64,\n    dataType: cuda_types::cudnn9::cudnnDataType_t,\n    computePrec: cuda_types::cudnn9::cudnnDataType_t,\n    mathType: cuda_types::cudnn9::cudnnMathType_t,\n    attnDropoutDesc: cuda_types::cudnn9::cudnnDropoutDescriptor_t,\n    postDropoutDesc: cuda_types::cudnn9::cudnnDropoutDescriptor_t,\n    qSize: ::core::ffi::c_int,\n    kSize: ::core::ffi::c_int,\n    vSize: ::core::ffi::c_int,\n    qProjSize: ::core::ffi::c_int,\n    kProjSize: ::core::ffi::c_int,\n    vProjSize: ::core::ffi::c_int,\n    oProjSize: ::core::ffi::c_int,\n    qoMaxSeqLength: ::core::ffi::c_int,\n    kvMaxSeqLength: ::core::ffi::c_int,\n    maxBatchSize: ::core::ffi::c_int,\n    maxBeamSize: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(attnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attnDesc, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attnMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attnMode, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nHeads), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nHeads, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(smScaler), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&smScaler, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computePrec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&computePrec, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mathType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mathType, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attnDropoutDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &attnDropoutDesc,\n        \"cudnnSetAttnDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(postDropoutDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &postDropoutDesc,\n        \"cudnnSetAttnDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(qSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&qSize, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kSize, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vSize, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(qProjSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&qProjSize, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kProjSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kProjSize, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vProjSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vProjSize, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(oProjSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&oProjSize, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(qoMaxSeqLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &qoMaxSeqLength,\n        \"cudnnSetAttnDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kvMaxSeqLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &kvMaxSeqLength,\n        \"cudnnSetAttnDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxBatchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&maxBatchSize, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxBeamSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&maxBeamSize, \"cudnnSetAttnDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetAttnDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    attnDesc: cuda_types::cudnn9::cudnnAttnDescriptor_t,\n    attnMode: *mut ::core::ffi::c_uint,\n    nHeads: *mut ::core::ffi::c_int,\n    smScaler: *mut f64,\n    dataType: *mut cuda_types::cudnn9::cudnnDataType_t,\n    computePrec: *mut cuda_types::cudnn9::cudnnDataType_t,\n    mathType: *mut cuda_types::cudnn9::cudnnMathType_t,\n    attnDropoutDesc: *mut cuda_types::cudnn9::cudnnDropoutDescriptor_t,\n    postDropoutDesc: *mut cuda_types::cudnn9::cudnnDropoutDescriptor_t,\n    qSize: *mut ::core::ffi::c_int,\n    kSize: *mut ::core::ffi::c_int,\n    vSize: *mut ::core::ffi::c_int,\n    qProjSize: *mut ::core::ffi::c_int,\n    kProjSize: *mut ::core::ffi::c_int,\n    vProjSize: *mut ::core::ffi::c_int,\n    oProjSize: *mut ::core::ffi::c_int,\n    qoMaxSeqLength: *mut ::core::ffi::c_int,\n    kvMaxSeqLength: *mut ::core::ffi::c_int,\n    maxBatchSize: *mut ::core::ffi::c_int,\n    maxBeamSize: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(attnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attnDesc, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attnMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attnMode, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nHeads), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nHeads, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(smScaler), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&smScaler, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataType, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computePrec), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&computePrec, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mathType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mathType, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attnDropoutDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &attnDropoutDesc,\n        \"cudnnGetAttnDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(postDropoutDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &postDropoutDesc,\n        \"cudnnGetAttnDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(qSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&qSize, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kSize, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vSize, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(qProjSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&qProjSize, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kProjSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kProjSize, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vProjSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vProjSize, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(oProjSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&oProjSize, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(qoMaxSeqLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &qoMaxSeqLength,\n        \"cudnnGetAttnDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kvMaxSeqLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &kvMaxSeqLength,\n        \"cudnnGetAttnDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxBatchSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&maxBatchSize, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxBeamSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&maxBeamSize, \"cudnnGetAttnDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetMultiHeadAttnBuffers(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    attnDesc: cuda_types::cudnn9::cudnnAttnDescriptor_t,\n    weightSizeInBytes: *mut usize,\n    workSpaceSizeInBytes: *mut usize,\n    reserveSpaceSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnGetMultiHeadAttnBuffers\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &attnDesc,\n        \"cudnnGetMultiHeadAttnBuffers\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weightSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &weightSizeInBytes,\n        \"cudnnGetMultiHeadAttnBuffers\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnGetMultiHeadAttnBuffers\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnGetMultiHeadAttnBuffers\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnMultiHeadAttnWeightKind_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnMultiHeadAttnWeightKind_t::CUDNN_MH_ATTN_Q_WEIGHTS => {\n                writer.write_all(stringify!(CUDNN_MH_ATTN_Q_WEIGHTS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnMultiHeadAttnWeightKind_t::CUDNN_MH_ATTN_K_WEIGHTS => {\n                writer.write_all(stringify!(CUDNN_MH_ATTN_K_WEIGHTS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnMultiHeadAttnWeightKind_t::CUDNN_MH_ATTN_V_WEIGHTS => {\n                writer.write_all(stringify!(CUDNN_MH_ATTN_V_WEIGHTS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnMultiHeadAttnWeightKind_t::CUDNN_MH_ATTN_O_WEIGHTS => {\n                writer.write_all(stringify!(CUDNN_MH_ATTN_O_WEIGHTS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnMultiHeadAttnWeightKind_t::CUDNN_MH_ATTN_Q_BIASES => {\n                writer.write_all(stringify!(CUDNN_MH_ATTN_Q_BIASES).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnMultiHeadAttnWeightKind_t::CUDNN_MH_ATTN_K_BIASES => {\n                writer.write_all(stringify!(CUDNN_MH_ATTN_K_BIASES).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnMultiHeadAttnWeightKind_t::CUDNN_MH_ATTN_V_BIASES => {\n                writer.write_all(stringify!(CUDNN_MH_ATTN_V_BIASES).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnMultiHeadAttnWeightKind_t::CUDNN_MH_ATTN_O_BIASES => {\n                writer.write_all(stringify!(CUDNN_MH_ATTN_O_BIASES).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cudnnGetMultiHeadAttnWeights(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    attnDesc: cuda_types::cudnn9::cudnnAttnDescriptor_t,\n    wKind: cuda_types::cudnn9::cudnnMultiHeadAttnWeightKind_t,\n    weightSizeInBytes: usize,\n    weights: *const ::core::ffi::c_void,\n    wDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    wAddr: *mut *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnGetMultiHeadAttnWeights\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &attnDesc,\n        \"cudnnGetMultiHeadAttnWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wKind), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&wKind, \"cudnnGetMultiHeadAttnWeights\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weightSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &weightSizeInBytes,\n        \"cudnnGetMultiHeadAttnWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weights), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &weights,\n        \"cudnnGetMultiHeadAttnWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&wDesc, \"cudnnGetMultiHeadAttnWeights\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wAddr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&wAddr, \"cudnnGetMultiHeadAttnWeights\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnMultiHeadAttnForward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    attnDesc: cuda_types::cudnn9::cudnnAttnDescriptor_t,\n    currIdx: ::core::ffi::c_int,\n    loWinIdx: *const ::core::ffi::c_int,\n    hiWinIdx: *const ::core::ffi::c_int,\n    devSeqLengthsQO: *const ::core::ffi::c_int,\n    devSeqLengthsKV: *const ::core::ffi::c_int,\n    qDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n    queries: *const ::core::ffi::c_void,\n    residuals: *const ::core::ffi::c_void,\n    kDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n    keys: *const ::core::ffi::c_void,\n    vDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n    values: *const ::core::ffi::c_void,\n    oDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n    out: *mut ::core::ffi::c_void,\n    weightSizeInBytes: usize,\n    weights: *const ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    workSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSizeInBytes: usize,\n    reserveSpace: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attnDesc, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(currIdx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&currIdx, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(loWinIdx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&loWinIdx, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hiWinIdx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hiWinIdx, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devSeqLengthsQO), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &devSeqLengthsQO,\n        \"cudnnMultiHeadAttnForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devSeqLengthsKV), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &devSeqLengthsKV,\n        \"cudnnMultiHeadAttnForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(qDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&qDesc, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(queries), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&queries, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(residuals), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&residuals, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kDesc, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(keys), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&keys, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vDesc, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&values, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(oDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&oDesc, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(out), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&out, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weightSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &weightSizeInBytes,\n        \"cudnnMultiHeadAttnForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weights), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&weights, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnMultiHeadAttnForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSpace, \"cudnnMultiHeadAttnForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnMultiHeadAttnForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpace,\n        \"cudnnMultiHeadAttnForward\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnAdvVersionCheck(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnWgradMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnWgradMode_t::CUDNN_WGRAD_MODE_ADD => {\n                writer.write_all(stringify!(CUDNN_WGRAD_MODE_ADD).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnWgradMode_t::CUDNN_WGRAD_MODE_SET => {\n                writer.write_all(stringify!(CUDNN_WGRAD_MODE_SET).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cudnnRNNBackwardData_v8(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn9::cudnnRNNDescriptor_t,\n    devSeqLengths: *const i32,\n    yDesc: cuda_types::cudnn9::cudnnRNNDataDescriptor_t,\n    y: *const ::core::ffi::c_void,\n    dy: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn9::cudnnRNNDataDescriptor_t,\n    dx: *mut ::core::ffi::c_void,\n    hDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    hx: *const ::core::ffi::c_void,\n    dhy: *const ::core::ffi::c_void,\n    dhx: *mut ::core::ffi::c_void,\n    cDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    cx: *const ::core::ffi::c_void,\n    dcy: *const ::core::ffi::c_void,\n    dcx: *mut ::core::ffi::c_void,\n    weightSpaceSize: usize,\n    weightSpace: *const ::core::ffi::c_void,\n    workSpaceSize: usize,\n    workSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSize: usize,\n    reserveSpace: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devSeqLengths), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &devSeqLengths,\n        \"cudnnRNNBackwardData_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dy, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dx, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hDesc, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hx, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dhy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dhy, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dhx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dhx, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cDesc, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cx, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dcy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dcy, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dcx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dcx, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weightSpaceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &weightSpaceSize,\n        \"cudnnRNNBackwardData_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weightSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&weightSpace, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSize,\n        \"cudnnRNNBackwardData_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSpace, \"cudnnRNNBackwardData_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSize,\n        \"cudnnRNNBackwardData_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpace,\n        \"cudnnRNNBackwardData_v8\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnRNNBackwardWeights_v8(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    rnnDesc: cuda_types::cudnn9::cudnnRNNDescriptor_t,\n    addGrad: cuda_types::cudnn9::cudnnWgradMode_t,\n    devSeqLengths: *const i32,\n    xDesc: cuda_types::cudnn9::cudnnRNNDataDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    hDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    hx: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn9::cudnnRNNDataDescriptor_t,\n    y: *const ::core::ffi::c_void,\n    weightSpaceSize: usize,\n    dweightSpace: *mut ::core::ffi::c_void,\n    workSpaceSize: usize,\n    workSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSize: usize,\n    reserveSpace: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnRNNBackwardWeights_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rnnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rnnDesc, \"cudnnRNNBackwardWeights_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(addGrad), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&addGrad, \"cudnnRNNBackwardWeights_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devSeqLengths), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &devSeqLengths,\n        \"cudnnRNNBackwardWeights_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnRNNBackwardWeights_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnRNNBackwardWeights_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hDesc, \"cudnnRNNBackwardWeights_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hx, \"cudnnRNNBackwardWeights_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnRNNBackwardWeights_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnRNNBackwardWeights_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weightSpaceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &weightSpaceSize,\n        \"cudnnRNNBackwardWeights_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dweightSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dweightSpace,\n        \"cudnnRNNBackwardWeights_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSize,\n        \"cudnnRNNBackwardWeights_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpace,\n        \"cudnnRNNBackwardWeights_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSize,\n        \"cudnnRNNBackwardWeights_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpace,\n        \"cudnnRNNBackwardWeights_v8\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnMultiHeadAttnBackwardData(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    attnDesc: cuda_types::cudnn9::cudnnAttnDescriptor_t,\n    loWinIdx: *const ::core::ffi::c_int,\n    hiWinIdx: *const ::core::ffi::c_int,\n    devSeqLengthsDQDO: *const ::core::ffi::c_int,\n    devSeqLengthsDKDV: *const ::core::ffi::c_int,\n    doDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n    dout: *const ::core::ffi::c_void,\n    dqDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n    dqueries: *mut ::core::ffi::c_void,\n    queries: *const ::core::ffi::c_void,\n    dkDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n    dkeys: *mut ::core::ffi::c_void,\n    keys: *const ::core::ffi::c_void,\n    dvDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n    dvalues: *mut ::core::ffi::c_void,\n    values: *const ::core::ffi::c_void,\n    weightSizeInBytes: usize,\n    weights: *const ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    workSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSizeInBytes: usize,\n    reserveSpace: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &attnDesc,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(loWinIdx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &loWinIdx,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hiWinIdx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &hiWinIdx,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devSeqLengthsDQDO), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &devSeqLengthsDQDO,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devSeqLengthsDKDV), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &devSeqLengthsDKDV,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(doDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &doDesc,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dout), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dout, \"cudnnMultiHeadAttnBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dqDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dqDesc,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dqueries), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dqueries,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(queries), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &queries,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dkDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dkDesc,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dkeys), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dkeys,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(keys), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&keys, \"cudnnMultiHeadAttnBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dvDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dvDesc,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dvalues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dvalues,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &values,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weightSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &weightSizeInBytes,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weights), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &weights,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpace,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpace,\n        \"cudnnMultiHeadAttnBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnMultiHeadAttnBackwardWeights(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    attnDesc: cuda_types::cudnn9::cudnnAttnDescriptor_t,\n    addGrad: cuda_types::cudnn9::cudnnWgradMode_t,\n    qDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n    queries: *const ::core::ffi::c_void,\n    kDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n    keys: *const ::core::ffi::c_void,\n    vDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n    values: *const ::core::ffi::c_void,\n    doDesc: cuda_types::cudnn9::cudnnSeqDataDescriptor_t,\n    dout: *const ::core::ffi::c_void,\n    weightSizeInBytes: usize,\n    weights: *const ::core::ffi::c_void,\n    dweights: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    workSpace: *mut ::core::ffi::c_void,\n    reserveSpaceSizeInBytes: usize,\n    reserveSpace: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attnDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &attnDesc,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(addGrad), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &addGrad,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(qDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &qDesc,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(queries), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &queries,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &kDesc,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(keys), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &keys,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vDesc,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &values,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(doDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &doDesc,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dout), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dout,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weightSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &weightSizeInBytes,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(weights), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &weights,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dweights), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dweights,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpace,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpaceSizeInBytes,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reserveSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reserveSpace,\n        \"cudnnMultiHeadAttnBackwardWeights\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnLossNormalizationMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnLossNormalizationMode_t::CUDNN_LOSS_NORMALIZATION_NONE => {\n                writer.write_all(stringify!(CUDNN_LOSS_NORMALIZATION_NONE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnLossNormalizationMode_t::CUDNN_LOSS_NORMALIZATION_SOFTMAX => {\n                writer.write_all(stringify!(CUDNN_LOSS_NORMALIZATION_SOFTMAX).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cudnnCreateCTCLossDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ctcLossDesc: *mut cuda_types::cudnn9::cudnnCTCLossDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ctcLossDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ctcLossDesc,\n        \"cudnnCreateCTCLossDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetCTCLossDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ctcLossDesc: cuda_types::cudnn9::cudnnCTCLossDescriptor_t,\n    compType: cuda_types::cudnn9::cudnnDataType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ctcLossDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ctcLossDesc,\n        \"cudnnSetCTCLossDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(compType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&compType, \"cudnnSetCTCLossDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetCTCLossDescriptorEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ctcLossDesc: cuda_types::cudnn9::cudnnCTCLossDescriptor_t,\n    compType: cuda_types::cudnn9::cudnnDataType_t,\n    normMode: cuda_types::cudnn9::cudnnLossNormalizationMode_t,\n    gradMode: cuda_types::cudnn9::cudnnNanPropagation_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ctcLossDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ctcLossDesc,\n        \"cudnnSetCTCLossDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(compType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &compType,\n        \"cudnnSetCTCLossDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normMode,\n        \"cudnnSetCTCLossDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gradMode,\n        \"cudnnSetCTCLossDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetCTCLossDescriptor_v8(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ctcLossDesc: cuda_types::cudnn9::cudnnCTCLossDescriptor_t,\n    compType: cuda_types::cudnn9::cudnnDataType_t,\n    normMode: cuda_types::cudnn9::cudnnLossNormalizationMode_t,\n    gradMode: cuda_types::cudnn9::cudnnNanPropagation_t,\n    maxLabelLength: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ctcLossDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ctcLossDesc,\n        \"cudnnSetCTCLossDescriptor_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(compType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &compType,\n        \"cudnnSetCTCLossDescriptor_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normMode,\n        \"cudnnSetCTCLossDescriptor_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gradMode,\n        \"cudnnSetCTCLossDescriptor_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxLabelLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxLabelLength,\n        \"cudnnSetCTCLossDescriptor_v8\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetCTCLossDescriptor_v9(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ctcLossDesc: cuda_types::cudnn9::cudnnCTCLossDescriptor_t,\n    compType: cuda_types::cudnn9::cudnnDataType_t,\n    normMode: cuda_types::cudnn9::cudnnLossNormalizationMode_t,\n    ctcGradMode: cuda_types::cudnn9::cudnnCTCGradMode_t,\n    maxLabelLength: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ctcLossDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ctcLossDesc,\n        \"cudnnSetCTCLossDescriptor_v9\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(compType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &compType,\n        \"cudnnSetCTCLossDescriptor_v9\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normMode,\n        \"cudnnSetCTCLossDescriptor_v9\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ctcGradMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ctcGradMode,\n        \"cudnnSetCTCLossDescriptor_v9\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxLabelLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxLabelLength,\n        \"cudnnSetCTCLossDescriptor_v9\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetCTCLossDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ctcLossDesc: cuda_types::cudnn9::cudnnCTCLossDescriptor_t,\n    compType: *mut cuda_types::cudnn9::cudnnDataType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ctcLossDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ctcLossDesc,\n        \"cudnnGetCTCLossDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(compType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&compType, \"cudnnGetCTCLossDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetCTCLossDescriptorEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ctcLossDesc: cuda_types::cudnn9::cudnnCTCLossDescriptor_t,\n    compType: *mut cuda_types::cudnn9::cudnnDataType_t,\n    normMode: *mut cuda_types::cudnn9::cudnnLossNormalizationMode_t,\n    gradMode: *mut cuda_types::cudnn9::cudnnNanPropagation_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ctcLossDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ctcLossDesc,\n        \"cudnnGetCTCLossDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(compType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &compType,\n        \"cudnnGetCTCLossDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normMode,\n        \"cudnnGetCTCLossDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gradMode,\n        \"cudnnGetCTCLossDescriptorEx\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetCTCLossDescriptor_v8(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ctcLossDesc: cuda_types::cudnn9::cudnnCTCLossDescriptor_t,\n    compType: *mut cuda_types::cudnn9::cudnnDataType_t,\n    normMode: *mut cuda_types::cudnn9::cudnnLossNormalizationMode_t,\n    gradMode: *mut cuda_types::cudnn9::cudnnNanPropagation_t,\n    maxLabelLength: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ctcLossDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ctcLossDesc,\n        \"cudnnGetCTCLossDescriptor_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(compType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &compType,\n        \"cudnnGetCTCLossDescriptor_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normMode,\n        \"cudnnGetCTCLossDescriptor_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gradMode,\n        \"cudnnGetCTCLossDescriptor_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxLabelLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxLabelLength,\n        \"cudnnGetCTCLossDescriptor_v8\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetCTCLossDescriptor_v9(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ctcLossDesc: cuda_types::cudnn9::cudnnCTCLossDescriptor_t,\n    compType: *mut cuda_types::cudnn9::cudnnDataType_t,\n    normMode: *mut cuda_types::cudnn9::cudnnLossNormalizationMode_t,\n    ctcGradMode: *mut cuda_types::cudnn9::cudnnCTCGradMode_t,\n    maxLabelLength: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ctcLossDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ctcLossDesc,\n        \"cudnnGetCTCLossDescriptor_v9\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(compType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &compType,\n        \"cudnnGetCTCLossDescriptor_v9\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(normMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &normMode,\n        \"cudnnGetCTCLossDescriptor_v9\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ctcGradMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ctcGradMode,\n        \"cudnnGetCTCLossDescriptor_v9\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxLabelLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxLabelLength,\n        \"cudnnGetCTCLossDescriptor_v9\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyCTCLossDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    ctcLossDesc: cuda_types::cudnn9::cudnnCTCLossDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(ctcLossDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ctcLossDesc,\n        \"cudnnDestroyCTCLossDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCTCLoss(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    probsDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    probs: *const ::core::ffi::c_void,\n    hostLabels: *const ::core::ffi::c_int,\n    hostLabelLengths: *const ::core::ffi::c_int,\n    hostInputLengths: *const ::core::ffi::c_int,\n    costs: *mut ::core::ffi::c_void,\n    gradientsDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    gradients: *mut ::core::ffi::c_void,\n    algo: cuda_types::cudnn9::cudnnCTCLossAlgo_t,\n    ctcLossDesc: cuda_types::cudnn9::cudnnCTCLossDescriptor_t,\n    workspace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnCTCLoss\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(probsDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&probsDesc, \"cudnnCTCLoss\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(probs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&probs, \"cudnnCTCLoss\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hostLabels), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hostLabels, \"cudnnCTCLoss\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hostLabelLengths), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hostLabelLengths, \"cudnnCTCLoss\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hostInputLengths), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hostInputLengths, \"cudnnCTCLoss\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(costs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&costs, \"cudnnCTCLoss\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradientsDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&gradientsDesc, \"cudnnCTCLoss\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradients), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&gradients, \"cudnnCTCLoss\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cudnnCTCLoss\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ctcLossDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ctcLossDesc, \"cudnnCTCLoss\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workspace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workspace, \"cudnnCTCLoss\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSpaceSizeInBytes, \"cudnnCTCLoss\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCTCLoss_v8(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    algo: cuda_types::cudnn9::cudnnCTCLossAlgo_t,\n    ctcLossDesc: cuda_types::cudnn9::cudnnCTCLossDescriptor_t,\n    probsDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    probs: *const ::core::ffi::c_void,\n    labels: *const ::core::ffi::c_int,\n    labelLengths: *const ::core::ffi::c_int,\n    inputLengths: *const ::core::ffi::c_int,\n    costs: *mut ::core::ffi::c_void,\n    gradientsDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    gradients: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    workspace: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnCTCLoss_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cudnnCTCLoss_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ctcLossDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ctcLossDesc, \"cudnnCTCLoss_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(probsDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&probsDesc, \"cudnnCTCLoss_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(probs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&probs, \"cudnnCTCLoss_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(labels), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&labels, \"cudnnCTCLoss_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(labelLengths), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&labelLengths, \"cudnnCTCLoss_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inputLengths), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&inputLengths, \"cudnnCTCLoss_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(costs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&costs, \"cudnnCTCLoss_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradientsDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&gradientsDesc, \"cudnnCTCLoss_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradients), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&gradients, \"cudnnCTCLoss_v8\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnCTCLoss_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workspace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workspace, \"cudnnCTCLoss_v8\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetCTCLossWorkspaceSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    probsDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    gradientsDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    labels: *const ::core::ffi::c_int,\n    labelLengths: *const ::core::ffi::c_int,\n    inputLengths: *const ::core::ffi::c_int,\n    algo: cuda_types::cudnn9::cudnnCTCLossAlgo_t,\n    ctcLossDesc: cuda_types::cudnn9::cudnnCTCLossDescriptor_t,\n    sizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnGetCTCLossWorkspaceSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(probsDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &probsDesc,\n        \"cudnnGetCTCLossWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradientsDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gradientsDesc,\n        \"cudnnGetCTCLossWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(labels), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&labels, \"cudnnGetCTCLossWorkspaceSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(labelLengths), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &labelLengths,\n        \"cudnnGetCTCLossWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inputLengths), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &inputLengths,\n        \"cudnnGetCTCLossWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cudnnGetCTCLossWorkspaceSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ctcLossDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ctcLossDesc,\n        \"cudnnGetCTCLossWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnGetCTCLossWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetCTCLossWorkspaceSize_v8(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    algo: cuda_types::cudnn9::cudnnCTCLossAlgo_t,\n    ctcLossDesc: cuda_types::cudnn9::cudnnCTCLossDescriptor_t,\n    probsDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    gradientsDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    sizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetCTCLossWorkspaceSize_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cudnnGetCTCLossWorkspaceSize_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ctcLossDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ctcLossDesc,\n        \"cudnnGetCTCLossWorkspaceSize_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(probsDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &probsDesc,\n        \"cudnnGetCTCLossWorkspaceSize_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradientsDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gradientsDesc,\n        \"cudnnGetCTCLossWorkspaceSize_v8\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnGetCTCLossWorkspaceSize_v8\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnConvolutionDescriptor_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnConvolutionFwdAlgoPerfStruct {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(algo), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.algo, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(status), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.status, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(time), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.time, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(memory), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.memory, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(determinism), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.determinism, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(mathType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.mathType, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\npub fn write_cudnnCreateConvolutionDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    convDesc: *mut cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnCreateConvolutionDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyConvolutionDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnDestroyConvolutionDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetConvolutionMathType(\n    writer: &mut (impl std::io::Write + ?Sized),\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    mathType: cuda_types::cudnn9::cudnnMathType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnSetConvolutionMathType\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mathType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mathType,\n        \"cudnnSetConvolutionMathType\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetConvolutionMathType(\n    writer: &mut (impl std::io::Write + ?Sized),\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    mathType: *mut cuda_types::cudnn9::cudnnMathType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnGetConvolutionMathType\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mathType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mathType,\n        \"cudnnGetConvolutionMathType\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetConvolutionGroupCount(\n    writer: &mut (impl std::io::Write + ?Sized),\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    groupCount: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnSetConvolutionGroupCount\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(groupCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &groupCount,\n        \"cudnnSetConvolutionGroupCount\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetConvolutionGroupCount(\n    writer: &mut (impl std::io::Write + ?Sized),\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    groupCount: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnGetConvolutionGroupCount\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(groupCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &groupCount,\n        \"cudnnGetConvolutionGroupCount\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetConvolutionReorderType(\n    writer: &mut (impl std::io::Write + ?Sized),\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    reorderType: cuda_types::cudnn9::cudnnReorderType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnSetConvolutionReorderType\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reorderType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reorderType,\n        \"cudnnSetConvolutionReorderType\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetConvolutionReorderType(\n    writer: &mut (impl std::io::Write + ?Sized),\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    reorderType: *mut cuda_types::cudnn9::cudnnReorderType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnGetConvolutionReorderType\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reorderType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reorderType,\n        \"cudnnGetConvolutionReorderType\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetConvolution2dDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    pad_h: ::core::ffi::c_int,\n    pad_w: ::core::ffi::c_int,\n    u: ::core::ffi::c_int,\n    v: ::core::ffi::c_int,\n    dilation_h: ::core::ffi::c_int,\n    dilation_w: ::core::ffi::c_int,\n    mode: cuda_types::cudnn9::cudnnConvolutionMode_t,\n    computeType: cuda_types::cudnn9::cudnnDataType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnSetConvolution2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pad_h), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pad_h,\n        \"cudnnSetConvolution2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pad_w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pad_w,\n        \"cudnnSetConvolution2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(u), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&u, \"cudnnSetConvolution2dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(v), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&v, \"cudnnSetConvolution2dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dilation_h), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dilation_h,\n        \"cudnnSetConvolution2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dilation_w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dilation_w,\n        \"cudnnSetConvolution2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnSetConvolution2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &computeType,\n        \"cudnnSetConvolution2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetConvolution2dDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    pad_h: *mut ::core::ffi::c_int,\n    pad_w: *mut ::core::ffi::c_int,\n    u: *mut ::core::ffi::c_int,\n    v: *mut ::core::ffi::c_int,\n    dilation_h: *mut ::core::ffi::c_int,\n    dilation_w: *mut ::core::ffi::c_int,\n    mode: *mut cuda_types::cudnn9::cudnnConvolutionMode_t,\n    computeType: *mut cuda_types::cudnn9::cudnnDataType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnGetConvolution2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pad_h), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pad_h,\n        \"cudnnGetConvolution2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pad_w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pad_w,\n        \"cudnnGetConvolution2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(u), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&u, \"cudnnGetConvolution2dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(v), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&v, \"cudnnGetConvolution2dDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dilation_h), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dilation_h,\n        \"cudnnGetConvolution2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dilation_w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dilation_w,\n        \"cudnnGetConvolution2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnGetConvolution2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &computeType,\n        \"cudnnGetConvolution2dDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetConvolutionNdDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    arrayLengthRequested: ::core::ffi::c_int,\n    arrayLength: *mut ::core::ffi::c_int,\n    padA: *mut ::core::ffi::c_int,\n    strideA: *mut ::core::ffi::c_int,\n    dilationA: *mut ::core::ffi::c_int,\n    mode: *mut cuda_types::cudnn9::cudnnConvolutionMode_t,\n    computeType: *mut cuda_types::cudnn9::cudnnDataType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnGetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(arrayLengthRequested), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &arrayLengthRequested,\n        \"cudnnGetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(arrayLength), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &arrayLength,\n        \"cudnnGetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(padA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &padA,\n        \"cudnnGetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(strideA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &strideA,\n        \"cudnnGetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dilationA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dilationA,\n        \"cudnnGetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"cudnnGetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &computeType,\n        \"cudnnGetConvolutionNdDescriptor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetConvolution2dForwardOutputDim(\n    writer: &mut (impl std::io::Write + ?Sized),\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    inputTensorDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    filterDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    n: *mut ::core::ffi::c_int,\n    c: *mut ::core::ffi::c_int,\n    h: *mut ::core::ffi::c_int,\n    w: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnGetConvolution2dForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inputTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &inputTensorDesc,\n        \"cudnnGetConvolution2dForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(filterDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDesc,\n        \"cudnnGetConvolution2dForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &n,\n        \"cudnnGetConvolution2dForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &c,\n        \"cudnnGetConvolution2dForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(h), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &h,\n        \"cudnnGetConvolution2dForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &w,\n        \"cudnnGetConvolution2dForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetConvolutionNdForwardOutputDim(\n    writer: &mut (impl std::io::Write + ?Sized),\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    inputTensorDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    filterDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    nbDims: ::core::ffi::c_int,\n    tensorOuputDimA: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnGetConvolutionNdForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inputTensorDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &inputTensorDesc,\n        \"cudnnGetConvolutionNdForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(filterDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDesc,\n        \"cudnnGetConvolutionNdForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nbDims), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nbDims,\n        \"cudnnGetConvolutionNdForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(tensorOuputDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &tensorOuputDimA,\n        \"cudnnGetConvolutionNdForwardOutputDim\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetConvolutionForwardAlgorithmMaxCount(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    count: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetConvolutionForwardAlgorithmMaxCount\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &count,\n        \"cudnnGetConvolutionForwardAlgorithmMaxCount\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetConvolutionForwardAlgorithm_v7(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    srcDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    filterDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    destDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    requestedAlgoCount: ::core::ffi::c_int,\n    returnedAlgoCount: *mut ::core::ffi::c_int,\n    perfResults: *mut cuda_types::cudnn9::cudnnConvolutionFwdAlgoPerf_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetConvolutionForwardAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &srcDesc,\n        \"cudnnGetConvolutionForwardAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(filterDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDesc,\n        \"cudnnGetConvolutionForwardAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnGetConvolutionForwardAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(destDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &destDesc,\n        \"cudnnGetConvolutionForwardAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(requestedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &requestedAlgoCount,\n        \"cudnnGetConvolutionForwardAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(returnedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &returnedAlgoCount,\n        \"cudnnGetConvolutionForwardAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(perfResults), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &perfResults,\n        \"cudnnGetConvolutionForwardAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnFindConvolutionForwardAlgorithm(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    wDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    requestedAlgoCount: ::core::ffi::c_int,\n    returnedAlgoCount: *mut ::core::ffi::c_int,\n    perfResults: *mut cuda_types::cudnn9::cudnnConvolutionFwdAlgoPerf_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnFindConvolutionForwardAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnFindConvolutionForwardAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &wDesc,\n        \"cudnnFindConvolutionForwardAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnFindConvolutionForwardAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnFindConvolutionForwardAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(requestedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &requestedAlgoCount,\n        \"cudnnFindConvolutionForwardAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(returnedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &returnedAlgoCount,\n        \"cudnnFindConvolutionForwardAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(perfResults), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &perfResults,\n        \"cudnnFindConvolutionForwardAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnFindConvolutionForwardAlgorithmEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    wDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    w: *const ::core::ffi::c_void,\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n    requestedAlgoCount: ::core::ffi::c_int,\n    returnedAlgoCount: *mut ::core::ffi::c_int,\n    perfResults: *mut cuda_types::cudnn9::cudnnConvolutionFwdAlgoPerf_t,\n    workSpace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnFindConvolutionForwardAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnFindConvolutionForwardAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cudnnFindConvolutionForwardAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &wDesc,\n        \"cudnnFindConvolutionForwardAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &w,\n        \"cudnnFindConvolutionForwardAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnFindConvolutionForwardAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnFindConvolutionForwardAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &y,\n        \"cudnnFindConvolutionForwardAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(requestedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &requestedAlgoCount,\n        \"cudnnFindConvolutionForwardAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(returnedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &returnedAlgoCount,\n        \"cudnnFindConvolutionForwardAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(perfResults), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &perfResults,\n        \"cudnnFindConvolutionForwardAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpace,\n        \"cudnnFindConvolutionForwardAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnFindConvolutionForwardAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnIm2Col(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    wDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    colBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnIm2Col\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnIm2Col\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnIm2Col\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&wDesc, \"cudnnIm2Col\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&convDesc, \"cudnnIm2Col\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&colBuffer, \"cudnnIm2Col\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnReorderFilterAndBias(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    filterDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    reorderType: cuda_types::cudnn9::cudnnReorderType_t,\n    filterData: *const ::core::ffi::c_void,\n    reorderedFilterData: *mut ::core::ffi::c_void,\n    reorderBias: ::core::ffi::c_int,\n    biasData: *const ::core::ffi::c_void,\n    reorderedBiasData: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnReorderFilterAndBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(filterDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDesc,\n        \"cudnnReorderFilterAndBias\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reorderType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reorderType,\n        \"cudnnReorderFilterAndBias\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(filterData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterData,\n        \"cudnnReorderFilterAndBias\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reorderedFilterData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reorderedFilterData,\n        \"cudnnReorderFilterAndBias\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reorderBias), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reorderBias,\n        \"cudnnReorderFilterAndBias\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(biasData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&biasData, \"cudnnReorderFilterAndBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reorderedBiasData), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reorderedBiasData,\n        \"cudnnReorderFilterAndBias\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetConvolutionForwardWorkspaceSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    wDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    algo: cuda_types::cudnn9::cudnnConvolutionFwdAlgo_t,\n    sizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetConvolutionForwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnGetConvolutionForwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &wDesc,\n        \"cudnnGetConvolutionForwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnGetConvolutionForwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnGetConvolutionForwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cudnnGetConvolutionForwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnGetConvolutionForwardWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnConvolutionForward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    alpha: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    wDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    w: *const ::core::ffi::c_void,\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    algo: cuda_types::cudnn9::cudnnConvolutionFwdAlgo_t,\n    workSpace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    beta: *const ::core::ffi::c_void,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnConvolutionForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnConvolutionForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xDesc, \"cudnnConvolutionForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnConvolutionForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&wDesc, \"cudnnConvolutionForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&w, \"cudnnConvolutionForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&convDesc, \"cudnnConvolutionForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cudnnConvolutionForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSpace, \"cudnnConvolutionForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnConvolutionForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnConvolutionForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&yDesc, \"cudnnConvolutionForward\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cudnnConvolutionForward\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnConvolutionBiasActivationForward(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    alpha1: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    wDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    w: *const ::core::ffi::c_void,\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    algo: cuda_types::cudnn9::cudnnConvolutionFwdAlgo_t,\n    workSpace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    alpha2: *const ::core::ffi::c_void,\n    zDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    z: *const ::core::ffi::c_void,\n    biasDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    bias: *const ::core::ffi::c_void,\n    activationDesc: cuda_types::cudnn9::cudnnActivationDescriptor_t,\n    yDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    y: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha1,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &wDesc,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &w,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpace,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha2,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(zDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &zDesc,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(z), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &z,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(biasDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &biasDesc,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bias), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bias,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationDesc,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(yDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &yDesc,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &y,\n        \"cudnnConvolutionBiasActivationForward\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnConvolutionBwdDataAlgoPerfStruct {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(algo), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.algo, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(status), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.status, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(time), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.time, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(memory), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.memory, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(determinism), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.determinism, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(mathType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.mathType, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\npub fn write_cudnnGetConvolutionBackwardDataAlgorithmMaxCount(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    count: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetConvolutionBackwardDataAlgorithmMaxCount\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &count,\n        \"cudnnGetConvolutionBackwardDataAlgorithmMaxCount\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnFindConvolutionBackwardDataAlgorithm(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    wDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    dxDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    requestedAlgoCount: ::core::ffi::c_int,\n    returnedAlgoCount: *mut ::core::ffi::c_int,\n    perfResults: *mut cuda_types::cudnn9::cudnnConvolutionBwdDataAlgoPerf_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnFindConvolutionBackwardDataAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &wDesc,\n        \"cudnnFindConvolutionBackwardDataAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dyDesc,\n        \"cudnnFindConvolutionBackwardDataAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnFindConvolutionBackwardDataAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dxDesc,\n        \"cudnnFindConvolutionBackwardDataAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(requestedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &requestedAlgoCount,\n        \"cudnnFindConvolutionBackwardDataAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(returnedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &returnedAlgoCount,\n        \"cudnnFindConvolutionBackwardDataAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(perfResults), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &perfResults,\n        \"cudnnFindConvolutionBackwardDataAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnFindConvolutionBackwardDataAlgorithmEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    wDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    w: *const ::core::ffi::c_void,\n    dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dy: *const ::core::ffi::c_void,\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    dxDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dx: *mut ::core::ffi::c_void,\n    requestedAlgoCount: ::core::ffi::c_int,\n    returnedAlgoCount: *mut ::core::ffi::c_int,\n    perfResults: *mut cuda_types::cudnn9::cudnnConvolutionBwdDataAlgoPerf_t,\n    workSpace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnFindConvolutionBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &wDesc,\n        \"cudnnFindConvolutionBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &w,\n        \"cudnnFindConvolutionBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dyDesc,\n        \"cudnnFindConvolutionBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dy,\n        \"cudnnFindConvolutionBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnFindConvolutionBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dxDesc,\n        \"cudnnFindConvolutionBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dx,\n        \"cudnnFindConvolutionBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(requestedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &requestedAlgoCount,\n        \"cudnnFindConvolutionBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(returnedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &returnedAlgoCount,\n        \"cudnnFindConvolutionBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(perfResults), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &perfResults,\n        \"cudnnFindConvolutionBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpace,\n        \"cudnnFindConvolutionBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnFindConvolutionBackwardDataAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetConvolutionBackwardDataAlgorithm_v7(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    filterDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    diffDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    gradDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    requestedAlgoCount: ::core::ffi::c_int,\n    returnedAlgoCount: *mut ::core::ffi::c_int,\n    perfResults: *mut cuda_types::cudnn9::cudnnConvolutionBwdDataAlgoPerf_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetConvolutionBackwardDataAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(filterDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDesc,\n        \"cudnnGetConvolutionBackwardDataAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diffDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &diffDesc,\n        \"cudnnGetConvolutionBackwardDataAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnGetConvolutionBackwardDataAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gradDesc,\n        \"cudnnGetConvolutionBackwardDataAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(requestedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &requestedAlgoCount,\n        \"cudnnGetConvolutionBackwardDataAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(returnedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &returnedAlgoCount,\n        \"cudnnGetConvolutionBackwardDataAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(perfResults), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &perfResults,\n        \"cudnnGetConvolutionBackwardDataAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetConvolutionBackwardDataWorkspaceSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    wDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    dxDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    algo: cuda_types::cudnn9::cudnnConvolutionBwdDataAlgo_t,\n    sizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetConvolutionBackwardDataWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &wDesc,\n        \"cudnnGetConvolutionBackwardDataWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dyDesc,\n        \"cudnnGetConvolutionBackwardDataWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnGetConvolutionBackwardDataWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dxDesc,\n        \"cudnnGetConvolutionBackwardDataWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cudnnGetConvolutionBackwardDataWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnGetConvolutionBackwardDataWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnConvolutionBackwardData(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    alpha: *const ::core::ffi::c_void,\n    wDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    w: *const ::core::ffi::c_void,\n    dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dy: *const ::core::ffi::c_void,\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    algo: cuda_types::cudnn9::cudnnConvolutionBwdDataAlgo_t,\n    workSpace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    beta: *const ::core::ffi::c_void,\n    dxDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dx: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnConvolutionBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnConvolutionBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(wDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&wDesc, \"cudnnConvolutionBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(w), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&w, \"cudnnConvolutionBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dyDesc, \"cudnnConvolutionBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dy, \"cudnnConvolutionBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnConvolutionBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cudnnConvolutionBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpace,\n        \"cudnnConvolutionBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnConvolutionBackwardData\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnConvolutionBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dxDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dxDesc, \"cudnnConvolutionBackwardData\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dx, \"cudnnConvolutionBackwardData\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetFoldedConvBackwardDataDescriptors(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    filterDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    diffDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    gradDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    transformFormat: cuda_types::cudnn9::cudnnTensorFormat_t,\n    foldedFilterDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    paddedDiffDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    foldedConvDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    foldedGradDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    filterFoldTransDesc: cuda_types::cudnn9::cudnnTensorTransformDescriptor_t,\n    diffPadTransDesc: cuda_types::cudnn9::cudnnTensorTransformDescriptor_t,\n    gradFoldTransDesc: cuda_types::cudnn9::cudnnTensorTransformDescriptor_t,\n    gradUnfoldTransDesc: cuda_types::cudnn9::cudnnTensorTransformDescriptor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetFoldedConvBackwardDataDescriptors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(filterDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterDesc,\n        \"cudnnGetFoldedConvBackwardDataDescriptors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diffDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &diffDesc,\n        \"cudnnGetFoldedConvBackwardDataDescriptors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnGetFoldedConvBackwardDataDescriptors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gradDesc,\n        \"cudnnGetFoldedConvBackwardDataDescriptors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transformFormat), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transformFormat,\n        \"cudnnGetFoldedConvBackwardDataDescriptors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(foldedFilterDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &foldedFilterDesc,\n        \"cudnnGetFoldedConvBackwardDataDescriptors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paddedDiffDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paddedDiffDesc,\n        \"cudnnGetFoldedConvBackwardDataDescriptors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(foldedConvDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &foldedConvDesc,\n        \"cudnnGetFoldedConvBackwardDataDescriptors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(foldedGradDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &foldedGradDesc,\n        \"cudnnGetFoldedConvBackwardDataDescriptors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(filterFoldTransDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &filterFoldTransDesc,\n        \"cudnnGetFoldedConvBackwardDataDescriptors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diffPadTransDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &diffPadTransDesc,\n        \"cudnnGetFoldedConvBackwardDataDescriptors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradFoldTransDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gradFoldTransDesc,\n        \"cudnnGetFoldedConvBackwardDataDescriptors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradUnfoldTransDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gradUnfoldTransDesc,\n        \"cudnnGetFoldedConvBackwardDataDescriptors\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnFusedOpsConstParamPack_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnFusedOpsVariantParamPack_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnFusedOpsPlan_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnFusedOps_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnFusedOps_t::CUDNN_FUSED_SCALE_BIAS_ACTIVATION_CONV_BNSTATS => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_FUSED_SCALE_BIAS_ACTIVATION_CONV_BNSTATS)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnFusedOps_t::CUDNN_FUSED_SCALE_BIAS_ACTIVATION_WGRAD => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_FUSED_SCALE_BIAS_ACTIVATION_WGRAD).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnFusedOps_t::CUDNN_FUSED_BN_FINALIZE_STATISTICS_TRAINING => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_FUSED_BN_FINALIZE_STATISTICS_TRAINING)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnFusedOps_t::CUDNN_FUSED_BN_FINALIZE_STATISTICS_INFERENCE => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_FUSED_BN_FINALIZE_STATISTICS_INFERENCE)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnFusedOps_t::CUDNN_FUSED_CONV_SCALE_BIAS_ADD_ACTIVATION => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_FUSED_CONV_SCALE_BIAS_ADD_ACTIVATION).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnFusedOps_t::CUDNN_FUSED_SCALE_BIAS_ADD_ACTIVATION_GEN_BITMASK => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_FUSED_SCALE_BIAS_ADD_ACTIVATION_GEN_BITMASK)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnFusedOps_t::CUDNN_FUSED_DACTIVATION_FORK_DBATCHNORM => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_FUSED_DACTIVATION_FORK_DBATCHNORM).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_XDESC => {\n                writer.write_all(stringify!(CUDNN_PARAM_XDESC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_XDATA_PLACEHOLDER => {\n                writer.write_all(stringify!(CUDNN_PARAM_XDATA_PLACEHOLDER).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_BN_MODE => {\n                writer.write_all(stringify!(CUDNN_PARAM_BN_MODE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_BN_EQSCALEBIAS_DESC => {\n                writer.write_all(stringify!(CUDNN_PARAM_BN_EQSCALEBIAS_DESC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_BN_EQSCALE_PLACEHOLDER => {\n                writer\n                    .write_all(stringify!(CUDNN_PARAM_BN_EQSCALE_PLACEHOLDER).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_BN_EQBIAS_PLACEHOLDER => {\n                writer\n                    .write_all(stringify!(CUDNN_PARAM_BN_EQBIAS_PLACEHOLDER).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_ACTIVATION_DESC => {\n                writer.write_all(stringify!(CUDNN_PARAM_ACTIVATION_DESC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_CONV_DESC => {\n                writer.write_all(stringify!(CUDNN_PARAM_CONV_DESC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_WDESC => {\n                writer.write_all(stringify!(CUDNN_PARAM_WDESC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_WDATA_PLACEHOLDER => {\n                writer.write_all(stringify!(CUDNN_PARAM_WDATA_PLACEHOLDER).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_DWDESC => {\n                writer.write_all(stringify!(CUDNN_PARAM_DWDESC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_DWDATA_PLACEHOLDER => {\n                writer.write_all(stringify!(CUDNN_PARAM_DWDATA_PLACEHOLDER).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_YDESC => {\n                writer.write_all(stringify!(CUDNN_PARAM_YDESC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_YDATA_PLACEHOLDER => {\n                writer.write_all(stringify!(CUDNN_PARAM_YDATA_PLACEHOLDER).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_DYDESC => {\n                writer.write_all(stringify!(CUDNN_PARAM_DYDESC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_DYDATA_PLACEHOLDER => {\n                writer.write_all(stringify!(CUDNN_PARAM_DYDATA_PLACEHOLDER).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_YSTATS_DESC => {\n                writer.write_all(stringify!(CUDNN_PARAM_YSTATS_DESC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_YSUM_PLACEHOLDER => {\n                writer.write_all(stringify!(CUDNN_PARAM_YSUM_PLACEHOLDER).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_YSQSUM_PLACEHOLDER => {\n                writer.write_all(stringify!(CUDNN_PARAM_YSQSUM_PLACEHOLDER).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_BN_SCALEBIAS_MEANVAR_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_PARAM_BN_SCALEBIAS_MEANVAR_DESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_BN_SCALE_PLACEHOLDER => {\n                writer.write_all(stringify!(CUDNN_PARAM_BN_SCALE_PLACEHOLDER).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_BN_BIAS_PLACEHOLDER => {\n                writer.write_all(stringify!(CUDNN_PARAM_BN_BIAS_PLACEHOLDER).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_BN_SAVED_MEAN_PLACEHOLDER => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_PARAM_BN_SAVED_MEAN_PLACEHOLDER).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_BN_SAVED_INVSTD_PLACEHOLDER => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_PARAM_BN_SAVED_INVSTD_PLACEHOLDER).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_BN_RUNNING_MEAN_PLACEHOLDER => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_PARAM_BN_RUNNING_MEAN_PLACEHOLDER).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_BN_RUNNING_VAR_PLACEHOLDER => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_PARAM_BN_RUNNING_VAR_PLACEHOLDER).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_ZDESC => {\n                writer.write_all(stringify!(CUDNN_PARAM_ZDESC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_ZDATA_PLACEHOLDER => {\n                writer.write_all(stringify!(CUDNN_PARAM_ZDATA_PLACEHOLDER).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_BN_Z_EQSCALEBIAS_DESC => {\n                writer\n                    .write_all(stringify!(CUDNN_PARAM_BN_Z_EQSCALEBIAS_DESC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_BN_Z_EQSCALE_PLACEHOLDER => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_PARAM_BN_Z_EQSCALE_PLACEHOLDER).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_BN_Z_EQBIAS_PLACEHOLDER => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_PARAM_BN_Z_EQBIAS_PLACEHOLDER).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_ACTIVATION_BITMASK_DESC => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_PARAM_ACTIVATION_BITMASK_DESC).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_ACTIVATION_BITMASK_PLACEHOLDER => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_PARAM_ACTIVATION_BITMASK_PLACEHOLDER).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_DXDESC => {\n                writer.write_all(stringify!(CUDNN_PARAM_DXDESC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_DXDATA_PLACEHOLDER => {\n                writer.write_all(stringify!(CUDNN_PARAM_DXDATA_PLACEHOLDER).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_DZDESC => {\n                writer.write_all(stringify!(CUDNN_PARAM_DZDESC).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_DZDATA_PLACEHOLDER => {\n                writer.write_all(stringify!(CUDNN_PARAM_DZDATA_PLACEHOLDER).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_BN_DSCALE_PLACEHOLDER => {\n                writer\n                    .write_all(stringify!(CUDNN_PARAM_BN_DSCALE_PLACEHOLDER).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t::CUDNN_PARAM_BN_DBIAS_PLACEHOLDER => {\n                writer.write_all(stringify!(CUDNN_PARAM_BN_DBIAS_PLACEHOLDER).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnFusedOpsPointerPlaceHolder_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnFusedOpsPointerPlaceHolder_t::CUDNN_PTR_NULL => {\n                writer.write_all(stringify!(CUDNN_PTR_NULL).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsPointerPlaceHolder_t::CUDNN_PTR_ELEM_ALIGNED => {\n                writer.write_all(stringify!(CUDNN_PTR_ELEM_ALIGNED).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsPointerPlaceHolder_t::CUDNN_PTR_16B_ALIGNED => {\n                writer.write_all(stringify!(CUDNN_PTR_16B_ALIGNED).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t::CUDNN_PTR_XDATA => {\n                writer.write_all(stringify!(CUDNN_PTR_XDATA).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t::CUDNN_PTR_BN_EQSCALE => {\n                writer.write_all(stringify!(CUDNN_PTR_BN_EQSCALE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t::CUDNN_PTR_BN_EQBIAS => {\n                writer.write_all(stringify!(CUDNN_PTR_BN_EQBIAS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t::CUDNN_PTR_WDATA => {\n                writer.write_all(stringify!(CUDNN_PTR_WDATA).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t::CUDNN_PTR_DWDATA => {\n                writer.write_all(stringify!(CUDNN_PTR_DWDATA).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t::CUDNN_PTR_YDATA => {\n                writer.write_all(stringify!(CUDNN_PTR_YDATA).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t::CUDNN_PTR_DYDATA => {\n                writer.write_all(stringify!(CUDNN_PTR_DYDATA).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t::CUDNN_PTR_YSUM => {\n                writer.write_all(stringify!(CUDNN_PTR_YSUM).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t::CUDNN_PTR_YSQSUM => {\n                writer.write_all(stringify!(CUDNN_PTR_YSQSUM).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t::CUDNN_PTR_WORKSPACE => {\n                writer.write_all(stringify!(CUDNN_PTR_WORKSPACE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t::CUDNN_PTR_BN_SCALE => {\n                writer.write_all(stringify!(CUDNN_PTR_BN_SCALE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t::CUDNN_PTR_BN_BIAS => {\n                writer.write_all(stringify!(CUDNN_PTR_BN_BIAS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t::CUDNN_PTR_BN_SAVED_MEAN => {\n                writer.write_all(stringify!(CUDNN_PTR_BN_SAVED_MEAN).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t::CUDNN_PTR_BN_SAVED_INVSTD => {\n                writer.write_all(stringify!(CUDNN_PTR_BN_SAVED_INVSTD).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t::CUDNN_PTR_BN_RUNNING_MEAN => {\n                writer.write_all(stringify!(CUDNN_PTR_BN_RUNNING_MEAN).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t::CUDNN_PTR_BN_RUNNING_VAR => {\n                writer.write_all(stringify!(CUDNN_PTR_BN_RUNNING_VAR).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t::CUDNN_PTR_ZDATA => {\n                writer.write_all(stringify!(CUDNN_PTR_ZDATA).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t::CUDNN_PTR_BN_Z_EQSCALE => {\n                writer.write_all(stringify!(CUDNN_PTR_BN_Z_EQSCALE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t::CUDNN_PTR_BN_Z_EQBIAS => {\n                writer.write_all(stringify!(CUDNN_PTR_BN_Z_EQBIAS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t::CUDNN_PTR_ACTIVATION_BITMASK => {\n                writer.write_all(stringify!(CUDNN_PTR_ACTIVATION_BITMASK).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t::CUDNN_PTR_DXDATA => {\n                writer.write_all(stringify!(CUDNN_PTR_DXDATA).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t::CUDNN_PTR_DZDATA => {\n                writer.write_all(stringify!(CUDNN_PTR_DZDATA).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t::CUDNN_PTR_BN_DSCALE => {\n                writer.write_all(stringify!(CUDNN_PTR_BN_DSCALE).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t::CUDNN_PTR_BN_DBIAS => {\n                writer.write_all(stringify!(CUDNN_PTR_BN_DBIAS).as_bytes())\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t::CUDNN_SCALAR_SIZE_T_WORKSPACE_SIZE_IN_BYTES => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_SCALAR_SIZE_T_WORKSPACE_SIZE_IN_BYTES)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t::CUDNN_SCALAR_INT64_T_BN_ACCUMULATION_COUNT => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_SCALAR_INT64_T_BN_ACCUMULATION_COUNT).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t::CUDNN_SCALAR_DOUBLE_BN_EXP_AVG_FACTOR => {\n                writer\n                    .write_all(\n                        stringify!(CUDNN_SCALAR_DOUBLE_BN_EXP_AVG_FACTOR).as_bytes(),\n                    )\n            }\n            &cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t::CUDNN_SCALAR_DOUBLE_BN_EPSILON => {\n                writer.write_all(stringify!(CUDNN_SCALAR_DOUBLE_BN_EPSILON).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cudnnCnnVersionCheck(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnConvolutionBwdFilterAlgoPerfStruct {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(algo), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.algo, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(status), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.status, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(time), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.time, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(memory), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.memory, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(determinism), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.determinism, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(mathType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.mathType, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\npub fn write_cudnnGetConvolutionBackwardFilterAlgorithmMaxCount(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    count: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetConvolutionBackwardFilterAlgorithmMaxCount\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &count,\n        \"cudnnGetConvolutionBackwardFilterAlgorithmMaxCount\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnFindConvolutionBackwardFilterAlgorithm(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    dwDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    requestedAlgoCount: ::core::ffi::c_int,\n    returnedAlgoCount: *mut ::core::ffi::c_int,\n    perfResults: *mut cuda_types::cudnn9::cudnnConvolutionBwdFilterAlgoPerf_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnFindConvolutionBackwardFilterAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnFindConvolutionBackwardFilterAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dyDesc,\n        \"cudnnFindConvolutionBackwardFilterAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnFindConvolutionBackwardFilterAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dwDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dwDesc,\n        \"cudnnFindConvolutionBackwardFilterAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(requestedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &requestedAlgoCount,\n        \"cudnnFindConvolutionBackwardFilterAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(returnedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &returnedAlgoCount,\n        \"cudnnFindConvolutionBackwardFilterAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(perfResults), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &perfResults,\n        \"cudnnFindConvolutionBackwardFilterAlgorithm\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnFindConvolutionBackwardFilterAlgorithmEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    y: *const ::core::ffi::c_void,\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    dwDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    dw: *mut ::core::ffi::c_void,\n    requestedAlgoCount: ::core::ffi::c_int,\n    returnedAlgoCount: *mut ::core::ffi::c_int,\n    perfResults: *mut cuda_types::cudnn9::cudnnConvolutionBwdFilterAlgoPerf_t,\n    workSpace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnFindConvolutionBackwardFilterAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnFindConvolutionBackwardFilterAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cudnnFindConvolutionBackwardFilterAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dyDesc,\n        \"cudnnFindConvolutionBackwardFilterAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &y,\n        \"cudnnFindConvolutionBackwardFilterAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnFindConvolutionBackwardFilterAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dwDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dwDesc,\n        \"cudnnFindConvolutionBackwardFilterAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dw), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dw,\n        \"cudnnFindConvolutionBackwardFilterAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(requestedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &requestedAlgoCount,\n        \"cudnnFindConvolutionBackwardFilterAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(returnedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &returnedAlgoCount,\n        \"cudnnFindConvolutionBackwardFilterAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(perfResults), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &perfResults,\n        \"cudnnFindConvolutionBackwardFilterAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpace,\n        \"cudnnFindConvolutionBackwardFilterAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnFindConvolutionBackwardFilterAlgorithmEx\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetConvolutionBackwardFilterAlgorithm_v7(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    srcDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    diffDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    gradDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    requestedAlgoCount: ::core::ffi::c_int,\n    returnedAlgoCount: *mut ::core::ffi::c_int,\n    perfResults: *mut cuda_types::cudnn9::cudnnConvolutionBwdFilterAlgoPerf_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetConvolutionBackwardFilterAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &srcDesc,\n        \"cudnnGetConvolutionBackwardFilterAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diffDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &diffDesc,\n        \"cudnnGetConvolutionBackwardFilterAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnGetConvolutionBackwardFilterAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gradDesc,\n        \"cudnnGetConvolutionBackwardFilterAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(requestedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &requestedAlgoCount,\n        \"cudnnGetConvolutionBackwardFilterAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(returnedAlgoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &returnedAlgoCount,\n        \"cudnnGetConvolutionBackwardFilterAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(perfResults), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &perfResults,\n        \"cudnnGetConvolutionBackwardFilterAlgorithm_v7\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetConvolutionBackwardFilterWorkspaceSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    gradDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    algo: cuda_types::cudnn9::cudnnConvolutionBwdFilterAlgo_t,\n    sizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnGetConvolutionBackwardFilterWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnGetConvolutionBackwardFilterWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dyDesc,\n        \"cudnnGetConvolutionBackwardFilterWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnGetConvolutionBackwardFilterWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gradDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gradDesc,\n        \"cudnnGetConvolutionBackwardFilterWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cudnnGetConvolutionBackwardFilterWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeInBytes,\n        \"cudnnGetConvolutionBackwardFilterWorkspaceSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnConvolutionBackwardFilter(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    alpha: *const ::core::ffi::c_void,\n    xDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    x: *const ::core::ffi::c_void,\n    dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dy: *const ::core::ffi::c_void,\n    convDesc: cuda_types::cudnn9::cudnnConvolutionDescriptor_t,\n    algo: cuda_types::cudnn9::cudnnConvolutionBwdFilterAlgo_t,\n    workSpace: *mut ::core::ffi::c_void,\n    workSpaceSizeInBytes: usize,\n    beta: *const ::core::ffi::c_void,\n    dwDesc: cuda_types::cudnn9::cudnnFilterDescriptor_t,\n    dw: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cudnnConvolutionBackwardFilter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha,\n        \"cudnnConvolutionBackwardFilter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &xDesc,\n        \"cudnnConvolutionBackwardFilter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cudnnConvolutionBackwardFilter\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dyDesc,\n        \"cudnnConvolutionBackwardFilter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dy, \"cudnnConvolutionBackwardFilter\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(convDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &convDesc,\n        \"cudnnConvolutionBackwardFilter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cudnnConvolutionBackwardFilter\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpace,\n        \"cudnnConvolutionBackwardFilter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSpaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workSpaceSizeInBytes,\n        \"cudnnConvolutionBackwardFilter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnConvolutionBackwardFilter\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dwDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dwDesc,\n        \"cudnnConvolutionBackwardFilter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dw), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dw, \"cudnnConvolutionBackwardFilter\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnConvolutionBackwardBias(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    alpha: *const ::core::ffi::c_void,\n    dyDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    dy: *const ::core::ffi::c_void,\n    beta: *const ::core::ffi::c_void,\n    dbDesc: cuda_types::cudnn9::cudnnTensorDescriptor_t,\n    db: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnConvolutionBackwardBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cudnnConvolutionBackwardBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dyDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dyDesc, \"cudnnConvolutionBackwardBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dy, \"cudnnConvolutionBackwardBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cudnnConvolutionBackwardBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dbDesc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dbDesc, \"cudnnConvolutionBackwardBias\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(db), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&db, \"cudnnConvolutionBackwardBias\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreateFusedOpsConstParamPack(\n    writer: &mut (impl std::io::Write + ?Sized),\n    constPack: *mut cuda_types::cudnn9::cudnnFusedOpsConstParamPack_t,\n    ops: cuda_types::cudnn9::cudnnFusedOps_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(constPack), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &constPack,\n        \"cudnnCreateFusedOpsConstParamPack\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ops), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ops,\n        \"cudnnCreateFusedOpsConstParamPack\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyFusedOpsConstParamPack(\n    writer: &mut (impl std::io::Write + ?Sized),\n    constPack: cuda_types::cudnn9::cudnnFusedOpsConstParamPack_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(constPack), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &constPack,\n        \"cudnnDestroyFusedOpsConstParamPack\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetFusedOpsConstParamPackAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    constPack: cuda_types::cudnn9::cudnnFusedOpsConstParamPack_t,\n    paramLabel: cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t,\n    param: *const ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(constPack), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &constPack,\n        \"cudnnSetFusedOpsConstParamPackAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paramLabel), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paramLabel,\n        \"cudnnSetFusedOpsConstParamPackAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param,\n        \"cudnnSetFusedOpsConstParamPackAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetFusedOpsConstParamPackAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    constPack: cuda_types::cudnn9::cudnnFusedOpsConstParamPack_t,\n    paramLabel: cuda_types::cudnn9::cudnnFusedOpsConstParamLabel_t,\n    param: *mut ::core::ffi::c_void,\n    isNULL: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(constPack), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &constPack,\n        \"cudnnGetFusedOpsConstParamPackAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paramLabel), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paramLabel,\n        \"cudnnGetFusedOpsConstParamPackAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &param,\n        \"cudnnGetFusedOpsConstParamPackAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(isNULL), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &isNULL,\n        \"cudnnGetFusedOpsConstParamPackAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreateFusedOpsVariantParamPack(\n    writer: &mut (impl std::io::Write + ?Sized),\n    varPack: *mut cuda_types::cudnn9::cudnnFusedOpsVariantParamPack_t,\n    ops: cuda_types::cudnn9::cudnnFusedOps_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(varPack), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &varPack,\n        \"cudnnCreateFusedOpsVariantParamPack\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ops), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ops,\n        \"cudnnCreateFusedOpsVariantParamPack\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyFusedOpsVariantParamPack(\n    writer: &mut (impl std::io::Write + ?Sized),\n    varPack: cuda_types::cudnn9::cudnnFusedOpsVariantParamPack_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(varPack), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &varPack,\n        \"cudnnDestroyFusedOpsVariantParamPack\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnSetFusedOpsVariantParamPackAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    varPack: cuda_types::cudnn9::cudnnFusedOpsVariantParamPack_t,\n    paramLabel: cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t,\n    ptr: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(varPack), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &varPack,\n        \"cudnnSetFusedOpsVariantParamPackAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paramLabel), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paramLabel,\n        \"cudnnSetFusedOpsVariantParamPackAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ptr,\n        \"cudnnSetFusedOpsVariantParamPackAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnGetFusedOpsVariantParamPackAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    varPack: cuda_types::cudnn9::cudnnFusedOpsVariantParamPack_t,\n    paramLabel: cuda_types::cudnn9::cudnnFusedOpsVariantParamLabel_t,\n    ptr: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(varPack), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &varPack,\n        \"cudnnGetFusedOpsVariantParamPackAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(paramLabel), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &paramLabel,\n        \"cudnnGetFusedOpsVariantParamPackAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ptr,\n        \"cudnnGetFusedOpsVariantParamPackAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnCreateFusedOpsPlan(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: *mut cuda_types::cudnn9::cudnnFusedOpsPlan_t,\n    ops: cuda_types::cudnn9::cudnnFusedOps_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cudnnCreateFusedOpsPlan\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ops), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ops, \"cudnnCreateFusedOpsPlan\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnDestroyFusedOpsPlan(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cudnn9::cudnnFusedOpsPlan_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cudnnDestroyFusedOpsPlan\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnMakeFusedOpsPlan(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    plan: cuda_types::cudnn9::cudnnFusedOpsPlan_t,\n    constPack: cuda_types::cudnn9::cudnnFusedOpsConstParamPack_t,\n    workspaceSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnMakeFusedOpsPlan\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cudnnMakeFusedOpsPlan\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(constPack), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&constPack, \"cudnnMakeFusedOpsPlan\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workspaceSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &workspaceSizeInBytes,\n        \"cudnnMakeFusedOpsPlan\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cudnnFusedOpsExecute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cudnn9::cudnnHandle_t,\n    plan: cuda_types::cudnn9::cudnnFusedOpsPlan_t,\n    varPack: cuda_types::cudnn9::cudnnFusedOpsVariantParamPack_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cudnnFusedOpsExecute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cudnnFusedOpsExecute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(varPack), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&varPack, \"cudnnFusedOpsExecute\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cudnn9::cudnnStatus_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            Ok(()) => writer.write_all(b\"CUDNN_STATUS_SUCCESS\"),\n            Err(err) => {\n                match err.0.get() {\n                    1001 => writer.write_all(\"CUDNN_STATUS_NOT_INITIALIZED\".as_bytes()),\n                    1002 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_SUBLIBRARY_VERSION_MISMATCH\".as_bytes(),\n                            )\n                    }\n                    1003 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_SERIALIZATION_VERSION_MISMATCH\".as_bytes(),\n                            )\n                    }\n                    1004 => writer.write_all(\"CUDNN_STATUS_DEPRECATED\".as_bytes()),\n                    1005 => writer.write_all(\"CUDNN_STATUS_LICENSE_ERROR\".as_bytes()),\n                    1006 => {\n                        writer.write_all(\"CUDNN_STATUS_RUNTIME_IN_PROGRESS\".as_bytes())\n                    }\n                    1007 => {\n                        writer.write_all(\"CUDNN_STATUS_RUNTIME_FP_OVERFLOW\".as_bytes())\n                    }\n                    1008 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_SUBLIBRARY_LOADING_FAILED\".as_bytes(),\n                            )\n                    }\n                    2000 => writer.write_all(\"CUDNN_STATUS_BAD_PARAM\".as_bytes()),\n                    2002 => {\n                        writer\n                            .write_all(\"CUDNN_STATUS_BAD_PARAM_NULL_POINTER\".as_bytes())\n                    }\n                    2003 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_BAD_PARAM_MISALIGNED_POINTER\".as_bytes(),\n                            )\n                    }\n                    2004 => {\n                        writer\n                            .write_all(\"CUDNN_STATUS_BAD_PARAM_NOT_FINALIZED\".as_bytes())\n                    }\n                    2005 => {\n                        writer\n                            .write_all(\"CUDNN_STATUS_BAD_PARAM_OUT_OF_BOUND\".as_bytes())\n                    }\n                    2006 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_BAD_PARAM_SIZE_INSUFFICIENT\".as_bytes(),\n                            )\n                    }\n                    2007 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_BAD_PARAM_STREAM_MISMATCH\".as_bytes(),\n                            )\n                    }\n                    2008 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_BAD_PARAM_SHAPE_MISMATCH\".as_bytes(),\n                            )\n                    }\n                    2009 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_BAD_PARAM_DUPLICATED_ENTRIES\".as_bytes(),\n                            )\n                    }\n                    2010 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_BAD_PARAM_ATTRIBUTE_TYPE\".as_bytes(),\n                            )\n                    }\n                    2011 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_BAD_PARAM_CUDA_GRAPH_MISMATCH\".as_bytes(),\n                            )\n                    }\n                    2012 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_BAD_PARAM_DESCRIPTOR_TYPE\".as_bytes(),\n                            )\n                    }\n                    3000 => writer.write_all(\"CUDNN_STATUS_NOT_SUPPORTED\".as_bytes()),\n                    3001 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_NOT_SUPPORTED_GRAPH_PATTERN\".as_bytes(),\n                            )\n                    }\n                    3002 => {\n                        writer.write_all(\"CUDNN_STATUS_NOT_SUPPORTED_SHAPE\".as_bytes())\n                    }\n                    3003 => {\n                        writer\n                            .write_all(\"CUDNN_STATUS_NOT_SUPPORTED_DATA_TYPE\".as_bytes())\n                    }\n                    3004 => {\n                        writer.write_all(\"CUDNN_STATUS_NOT_SUPPORTED_LAYOUT\".as_bytes())\n                    }\n                    3005 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_NOT_SUPPORTED_INCOMPATIBLE_CUDA_DRIVER\"\n                                    .as_bytes(),\n                            )\n                    }\n                    3006 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_NOT_SUPPORTED_INCOMPATIBLE_CUDART\".as_bytes(),\n                            )\n                    }\n                    3007 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_NOT_SUPPORTED_ARCH_MISMATCH\".as_bytes(),\n                            )\n                    }\n                    3008 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_NOT_SUPPORTED_RUNTIME_PREREQUISITE_MISSING\"\n                                    .as_bytes(),\n                            )\n                    }\n                    3009 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_NOT_SUPPORTED_SUBLIBRARY_UNAVAILABLE\"\n                                    .as_bytes(),\n                            )\n                    }\n                    3010 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_NOT_SUPPORTED_SHARED_MEMORY_INSUFFICIENT\"\n                                    .as_bytes(),\n                            )\n                    }\n                    3011 => {\n                        writer.write_all(\"CUDNN_STATUS_NOT_SUPPORTED_PADDING\".as_bytes())\n                    }\n                    3012 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_NOT_SUPPORTED_BAD_LAUNCH_PARAM\".as_bytes(),\n                            )\n                    }\n                    3013 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_NOT_SUPPORTED_CUDA_GRAPH_NATIVE_API\"\n                                    .as_bytes(),\n                            )\n                    }\n                    4000 => writer.write_all(\"CUDNN_STATUS_INTERNAL_ERROR\".as_bytes()),\n                    4001 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_INTERNAL_ERROR_COMPILATION_FAILED\".as_bytes(),\n                            )\n                    }\n                    4002 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_INTERNAL_ERROR_UNEXPECTED_VALUE\".as_bytes(),\n                            )\n                    }\n                    4003 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_INTERNAL_ERROR_HOST_ALLOCATION_FAILED\"\n                                    .as_bytes(),\n                            )\n                    }\n                    4004 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_INTERNAL_ERROR_DEVICE_ALLOCATION_FAILED\"\n                                    .as_bytes(),\n                            )\n                    }\n                    4005 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_INTERNAL_ERROR_BAD_LAUNCH_PARAM\".as_bytes(),\n                            )\n                    }\n                    4006 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_INTERNAL_ERROR_TEXTURE_CREATION_FAILED\"\n                                    .as_bytes(),\n                            )\n                    }\n                    5000 => writer.write_all(\"CUDNN_STATUS_EXECUTION_FAILED\".as_bytes()),\n                    5001 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_EXECUTION_FAILED_CUDA_DRIVER\".as_bytes(),\n                            )\n                    }\n                    5002 => {\n                        writer\n                            .write_all(\"CUDNN_STATUS_EXECUTION_FAILED_CUBLAS\".as_bytes())\n                    }\n                    5003 => {\n                        writer\n                            .write_all(\"CUDNN_STATUS_EXECUTION_FAILED_CUDART\".as_bytes())\n                    }\n                    5004 => {\n                        writer\n                            .write_all(\"CUDNN_STATUS_EXECUTION_FAILED_CURAND\".as_bytes())\n                    }\n                    4003 => writer.write_all(\"CUDNN_STATUS_ALLOC_FAILED\".as_bytes()),\n                    2001 => writer.write_all(\"CUDNN_STATUS_INVALID_VALUE\".as_bytes()),\n                    3007 => writer.write_all(\"CUDNN_STATUS_ARCH_MISMATCH\".as_bytes()),\n                    4006 => writer.write_all(\"CUDNN_STATUS_MAPPING_ERROR\".as_bytes()),\n                    3008 => {\n                        writer\n                            .write_all(\n                                \"CUDNN_STATUS_RUNTIME_PREREQUISITE_MISSING\".as_bytes(),\n                            )\n                    }\n                    1002 => writer.write_all(\"CUDNN_STATUS_VERSION_MISMATCH\".as_bytes()),\n                    err => write!(writer, \"{}\", err),\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "format/src/format_generated_fft.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\nimpl crate::CudaDisplay for cuda_types::cufft::libFormat_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cufft::libFormat_t::LIB_FORMAT_CUFFT => {\n                writer.write_all(stringify!(LIB_FORMAT_CUFFT).as_bytes())\n            }\n            &cuda_types::cufft::libFormat_t::LIB_FORMAT_UNDEFINED => {\n                writer.write_all(stringify!(LIB_FORMAT_UNDEFINED).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cufft::cudaXtDesc_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(nGPUs), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.nGPUs, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(GPUs), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.GPUs, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(data), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.data, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(size), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.size, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(cudaXtState), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.cudaXtState, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cufft::cudaLibXtDesc_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(descriptor), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.descriptor, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(library), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.library, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(subFormat), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.subFormat, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(libDescriptor), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.libDescriptor, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cufft::cufftType_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cufft::cufftType_t::CUFFT_R2C => {\n                writer.write_all(stringify!(CUFFT_R2C).as_bytes())\n            }\n            &cuda_types::cufft::cufftType_t::CUFFT_C2R => {\n                writer.write_all(stringify!(CUFFT_C2R).as_bytes())\n            }\n            &cuda_types::cufft::cufftType_t::CUFFT_C2C => {\n                writer.write_all(stringify!(CUFFT_C2C).as_bytes())\n            }\n            &cuda_types::cufft::cufftType_t::CUFFT_D2Z => {\n                writer.write_all(stringify!(CUFFT_D2Z).as_bytes())\n            }\n            &cuda_types::cufft::cufftType_t::CUFFT_Z2D => {\n                writer.write_all(stringify!(CUFFT_Z2D).as_bytes())\n            }\n            &cuda_types::cufft::cufftType_t::CUFFT_Z2Z => {\n                writer.write_all(stringify!(CUFFT_Z2Z).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cufft::cufftCompatibility_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cufft::cufftCompatibility_t::CUFFT_COMPATIBILITY_FFTW_PADDING => {\n                writer.write_all(stringify!(CUFFT_COMPATIBILITY_FFTW_PADDING).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cufftPlan1d(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: *mut cuda_types::cufft::cufftHandle,\n    nx: ::core::ffi::c_int,\n    type_: cuda_types::cufft::cufftType,\n    batch: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftPlan1d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nx, \"cufftPlan1d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cufftPlan1d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batch, \"cufftPlan1d\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftPlan2d(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: *mut cuda_types::cufft::cufftHandle,\n    nx: ::core::ffi::c_int,\n    ny: ::core::ffi::c_int,\n    type_: cuda_types::cufft::cufftType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftPlan2d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nx, \"cufftPlan2d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ny), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ny, \"cufftPlan2d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cufftPlan2d\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftPlan3d(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: *mut cuda_types::cufft::cufftHandle,\n    nx: ::core::ffi::c_int,\n    ny: ::core::ffi::c_int,\n    nz: ::core::ffi::c_int,\n    type_: cuda_types::cufft::cufftType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftPlan3d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nx, \"cufftPlan3d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ny), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ny, \"cufftPlan3d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nz, \"cufftPlan3d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cufftPlan3d\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftPlanMany(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: *mut cuda_types::cufft::cufftHandle,\n    rank: ::core::ffi::c_int,\n    n: *mut ::core::ffi::c_int,\n    inembed: *mut ::core::ffi::c_int,\n    istride: ::core::ffi::c_int,\n    idist: ::core::ffi::c_int,\n    onembed: *mut ::core::ffi::c_int,\n    ostride: ::core::ffi::c_int,\n    odist: ::core::ffi::c_int,\n    type_: cuda_types::cufft::cufftType,\n    batch: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftPlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rank), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rank, \"cufftPlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cufftPlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inembed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&inembed, \"cufftPlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(istride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&istride, \"cufftPlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idist), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idist, \"cufftPlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(onembed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&onembed, \"cufftPlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ostride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ostride, \"cufftPlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(odist), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&odist, \"cufftPlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cufftPlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batch, \"cufftPlanMany\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftMakePlan1d(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    nx: ::core::ffi::c_int,\n    type_: cuda_types::cufft::cufftType,\n    batch: ::core::ffi::c_int,\n    workSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftMakePlan1d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nx, \"cufftMakePlan1d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cufftMakePlan1d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batch, \"cufftMakePlan1d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSize, \"cufftMakePlan1d\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftMakePlan2d(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    nx: ::core::ffi::c_int,\n    ny: ::core::ffi::c_int,\n    type_: cuda_types::cufft::cufftType,\n    workSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftMakePlan2d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nx, \"cufftMakePlan2d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ny), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ny, \"cufftMakePlan2d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cufftMakePlan2d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSize, \"cufftMakePlan2d\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftMakePlan3d(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    nx: ::core::ffi::c_int,\n    ny: ::core::ffi::c_int,\n    nz: ::core::ffi::c_int,\n    type_: cuda_types::cufft::cufftType,\n    workSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftMakePlan3d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nx, \"cufftMakePlan3d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ny), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ny, \"cufftMakePlan3d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nz, \"cufftMakePlan3d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cufftMakePlan3d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSize, \"cufftMakePlan3d\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftMakePlanMany(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    rank: ::core::ffi::c_int,\n    n: *mut ::core::ffi::c_int,\n    inembed: *mut ::core::ffi::c_int,\n    istride: ::core::ffi::c_int,\n    idist: ::core::ffi::c_int,\n    onembed: *mut ::core::ffi::c_int,\n    ostride: ::core::ffi::c_int,\n    odist: ::core::ffi::c_int,\n    type_: cuda_types::cufft::cufftType,\n    batch: ::core::ffi::c_int,\n    workSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftMakePlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rank), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rank, \"cufftMakePlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cufftMakePlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inembed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&inembed, \"cufftMakePlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(istride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&istride, \"cufftMakePlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idist), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idist, \"cufftMakePlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(onembed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&onembed, \"cufftMakePlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ostride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ostride, \"cufftMakePlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(odist), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&odist, \"cufftMakePlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cufftMakePlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batch, \"cufftMakePlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSize, \"cufftMakePlanMany\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftMakePlanMany64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    rank: ::core::ffi::c_int,\n    n: *mut ::core::ffi::c_longlong,\n    inembed: *mut ::core::ffi::c_longlong,\n    istride: ::core::ffi::c_longlong,\n    idist: ::core::ffi::c_longlong,\n    onembed: *mut ::core::ffi::c_longlong,\n    ostride: ::core::ffi::c_longlong,\n    odist: ::core::ffi::c_longlong,\n    type_: cuda_types::cufft::cufftType,\n    batch: ::core::ffi::c_longlong,\n    workSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftMakePlanMany64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rank), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rank, \"cufftMakePlanMany64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cufftMakePlanMany64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inembed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&inembed, \"cufftMakePlanMany64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(istride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&istride, \"cufftMakePlanMany64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idist), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idist, \"cufftMakePlanMany64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(onembed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&onembed, \"cufftMakePlanMany64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ostride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ostride, \"cufftMakePlanMany64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(odist), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&odist, \"cufftMakePlanMany64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cufftMakePlanMany64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batch, \"cufftMakePlanMany64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSize, \"cufftMakePlanMany64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftGetSizeMany64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    rank: ::core::ffi::c_int,\n    n: *mut ::core::ffi::c_longlong,\n    inembed: *mut ::core::ffi::c_longlong,\n    istride: ::core::ffi::c_longlong,\n    idist: ::core::ffi::c_longlong,\n    onembed: *mut ::core::ffi::c_longlong,\n    ostride: ::core::ffi::c_longlong,\n    odist: ::core::ffi::c_longlong,\n    type_: cuda_types::cufft::cufftType,\n    batch: ::core::ffi::c_longlong,\n    workSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftGetSizeMany64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rank), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rank, \"cufftGetSizeMany64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cufftGetSizeMany64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inembed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&inembed, \"cufftGetSizeMany64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(istride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&istride, \"cufftGetSizeMany64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idist), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idist, \"cufftGetSizeMany64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(onembed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&onembed, \"cufftGetSizeMany64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ostride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ostride, \"cufftGetSizeMany64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(odist), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&odist, \"cufftGetSizeMany64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cufftGetSizeMany64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batch, \"cufftGetSizeMany64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSize, \"cufftGetSizeMany64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftEstimate1d(\n    writer: &mut (impl std::io::Write + ?Sized),\n    nx: ::core::ffi::c_int,\n    type_: cuda_types::cufft::cufftType,\n    batch: ::core::ffi::c_int,\n    workSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(nx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nx, \"cufftEstimate1d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cufftEstimate1d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batch, \"cufftEstimate1d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSize, \"cufftEstimate1d\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftEstimate2d(\n    writer: &mut (impl std::io::Write + ?Sized),\n    nx: ::core::ffi::c_int,\n    ny: ::core::ffi::c_int,\n    type_: cuda_types::cufft::cufftType,\n    workSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(nx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nx, \"cufftEstimate2d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ny), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ny, \"cufftEstimate2d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cufftEstimate2d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSize, \"cufftEstimate2d\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftEstimate3d(\n    writer: &mut (impl std::io::Write + ?Sized),\n    nx: ::core::ffi::c_int,\n    ny: ::core::ffi::c_int,\n    nz: ::core::ffi::c_int,\n    type_: cuda_types::cufft::cufftType,\n    workSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(nx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nx, \"cufftEstimate3d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ny), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ny, \"cufftEstimate3d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nz, \"cufftEstimate3d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cufftEstimate3d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSize, \"cufftEstimate3d\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftEstimateMany(\n    writer: &mut (impl std::io::Write + ?Sized),\n    rank: ::core::ffi::c_int,\n    n: *mut ::core::ffi::c_int,\n    inembed: *mut ::core::ffi::c_int,\n    istride: ::core::ffi::c_int,\n    idist: ::core::ffi::c_int,\n    onembed: *mut ::core::ffi::c_int,\n    ostride: ::core::ffi::c_int,\n    odist: ::core::ffi::c_int,\n    type_: cuda_types::cufft::cufftType,\n    batch: ::core::ffi::c_int,\n    workSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(rank), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rank, \"cufftEstimateMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cufftEstimateMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inembed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&inembed, \"cufftEstimateMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(istride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&istride, \"cufftEstimateMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idist), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idist, \"cufftEstimateMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(onembed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&onembed, \"cufftEstimateMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ostride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ostride, \"cufftEstimateMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(odist), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&odist, \"cufftEstimateMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cufftEstimateMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batch, \"cufftEstimateMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSize, \"cufftEstimateMany\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: *mut cuda_types::cufft::cufftHandle,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cufftCreate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftGetSize1d(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cufft::cufftHandle,\n    nx: ::core::ffi::c_int,\n    type_: cuda_types::cufft::cufftType,\n    batch: ::core::ffi::c_int,\n    workSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cufftGetSize1d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nx, \"cufftGetSize1d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cufftGetSize1d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batch, \"cufftGetSize1d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSize, \"cufftGetSize1d\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftGetSize2d(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cufft::cufftHandle,\n    nx: ::core::ffi::c_int,\n    ny: ::core::ffi::c_int,\n    type_: cuda_types::cufft::cufftType,\n    workSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cufftGetSize2d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nx, \"cufftGetSize2d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ny), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ny, \"cufftGetSize2d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cufftGetSize2d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSize, \"cufftGetSize2d\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftGetSize3d(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cufft::cufftHandle,\n    nx: ::core::ffi::c_int,\n    ny: ::core::ffi::c_int,\n    nz: ::core::ffi::c_int,\n    type_: cuda_types::cufft::cufftType,\n    workSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cufftGetSize3d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nx, \"cufftGetSize3d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ny), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ny, \"cufftGetSize3d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nz, \"cufftGetSize3d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cufftGetSize3d\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSize, \"cufftGetSize3d\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftGetSizeMany(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cufft::cufftHandle,\n    rank: ::core::ffi::c_int,\n    n: *mut ::core::ffi::c_int,\n    inembed: *mut ::core::ffi::c_int,\n    istride: ::core::ffi::c_int,\n    idist: ::core::ffi::c_int,\n    onembed: *mut ::core::ffi::c_int,\n    ostride: ::core::ffi::c_int,\n    odist: ::core::ffi::c_int,\n    type_: cuda_types::cufft::cufftType,\n    batch: ::core::ffi::c_int,\n    workArea: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cufftGetSizeMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rank), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rank, \"cufftGetSizeMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cufftGetSizeMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inembed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&inembed, \"cufftGetSizeMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(istride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&istride, \"cufftGetSizeMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idist), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idist, \"cufftGetSizeMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(onembed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&onembed, \"cufftGetSizeMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ostride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ostride, \"cufftGetSizeMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(odist), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&odist, \"cufftGetSizeMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cufftGetSizeMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batch, \"cufftGetSizeMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workArea), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workArea, \"cufftGetSizeMany\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftGetSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cufft::cufftHandle,\n    workSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cufftGetSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSize, \"cufftGetSize\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftSetWorkArea(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    workArea: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftSetWorkArea\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workArea), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workArea, \"cufftSetWorkArea\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftSetAutoAllocation(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    autoAllocate: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftSetAutoAllocation\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(autoAllocate), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&autoAllocate, \"cufftSetAutoAllocation\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftExecC2C(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    idata: *mut cuda_types::cufft::cufftComplex,\n    odata: *mut cuda_types::cufft::cufftComplex,\n    direction: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftExecC2C\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idata), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idata, \"cufftExecC2C\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(odata), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&odata, \"cufftExecC2C\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(direction), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&direction, \"cufftExecC2C\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftExecR2C(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    idata: *mut cuda_types::cufft::cufftReal,\n    odata: *mut cuda_types::cufft::cufftComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftExecR2C\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idata), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idata, \"cufftExecR2C\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(odata), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&odata, \"cufftExecR2C\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftExecC2R(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    idata: *mut cuda_types::cufft::cufftComplex,\n    odata: *mut cuda_types::cufft::cufftReal,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftExecC2R\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idata), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idata, \"cufftExecC2R\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(odata), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&odata, \"cufftExecC2R\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftExecZ2Z(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    idata: *mut cuda_types::cufft::cufftDoubleComplex,\n    odata: *mut cuda_types::cufft::cufftDoubleComplex,\n    direction: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftExecZ2Z\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idata), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idata, \"cufftExecZ2Z\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(odata), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&odata, \"cufftExecZ2Z\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(direction), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&direction, \"cufftExecZ2Z\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftExecD2Z(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    idata: *mut cuda_types::cufft::cufftDoubleReal,\n    odata: *mut cuda_types::cufft::cufftDoubleComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftExecD2Z\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idata), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idata, \"cufftExecD2Z\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(odata), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&odata, \"cufftExecD2Z\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftExecZ2D(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    idata: *mut cuda_types::cufft::cufftDoubleComplex,\n    odata: *mut cuda_types::cufft::cufftDoubleReal,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftExecZ2D\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idata), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idata, \"cufftExecZ2D\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(odata), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&odata, \"cufftExecZ2D\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftSetStream(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    stream: cuda_types::cufft::cudaStream_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftSetStream\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stream), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stream, \"cufftSetStream\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftDestroy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftDestroy\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftGetVersion(\n    writer: &mut (impl std::io::Write + ?Sized),\n    version: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(version), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&version, \"cufftGetVersion\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftGetProperty(\n    writer: &mut (impl std::io::Write + ?Sized),\n    type_: cuda_types::cufft::libraryPropertyType,\n    value: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cufftGetProperty\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cufftGetProperty\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cufft::cufftProperty_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cufft::cufftProperty_t::NVFFT_PLAN_PROPERTY_INT64_PATIENT_JIT => {\n                writer\n                    .write_all(\n                        stringify!(NVFFT_PLAN_PROPERTY_INT64_PATIENT_JIT).as_bytes(),\n                    )\n            }\n            &cuda_types::cufft::cufftProperty_t::NVFFT_PLAN_PROPERTY_INT64_MAX_NUM_HOST_THREADS => {\n                writer\n                    .write_all(\n                        stringify!(NVFFT_PLAN_PROPERTY_INT64_MAX_NUM_HOST_THREADS)\n                            .as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cufftSetPlanPropertyInt64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    property: cuda_types::cufft::cufftProperty,\n    inputValueInt: ::core::ffi::c_longlong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftSetPlanPropertyInt64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(property), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&property, \"cufftSetPlanPropertyInt64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inputValueInt), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &inputValueInt,\n        \"cufftSetPlanPropertyInt64\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftGetPlanPropertyInt64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    property: cuda_types::cufft::cufftProperty,\n    returnPtrValue: *mut ::core::ffi::c_longlong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftGetPlanPropertyInt64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(property), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&property, \"cufftGetPlanPropertyInt64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(returnPtrValue), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &returnPtrValue,\n        \"cufftGetPlanPropertyInt64\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftResetPlanProperty(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    property: cuda_types::cufft::cufftProperty,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftResetPlanProperty\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(property), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&property, \"cufftResetPlanProperty\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cufft::cufftXtSubFormat_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cufft::cufftXtSubFormat_t::CUFFT_XT_FORMAT_INPUT => {\n                writer.write_all(stringify!(CUFFT_XT_FORMAT_INPUT).as_bytes())\n            }\n            &cuda_types::cufft::cufftXtSubFormat_t::CUFFT_XT_FORMAT_OUTPUT => {\n                writer.write_all(stringify!(CUFFT_XT_FORMAT_OUTPUT).as_bytes())\n            }\n            &cuda_types::cufft::cufftXtSubFormat_t::CUFFT_XT_FORMAT_INPLACE => {\n                writer.write_all(stringify!(CUFFT_XT_FORMAT_INPLACE).as_bytes())\n            }\n            &cuda_types::cufft::cufftXtSubFormat_t::CUFFT_XT_FORMAT_INPLACE_SHUFFLED => {\n                writer.write_all(stringify!(CUFFT_XT_FORMAT_INPLACE_SHUFFLED).as_bytes())\n            }\n            &cuda_types::cufft::cufftXtSubFormat_t::CUFFT_XT_FORMAT_1D_INPUT_SHUFFLED => {\n                writer\n                    .write_all(stringify!(CUFFT_XT_FORMAT_1D_INPUT_SHUFFLED).as_bytes())\n            }\n            &cuda_types::cufft::cufftXtSubFormat_t::CUFFT_XT_FORMAT_DISTRIBUTED_INPUT => {\n                writer\n                    .write_all(stringify!(CUFFT_XT_FORMAT_DISTRIBUTED_INPUT).as_bytes())\n            }\n            &cuda_types::cufft::cufftXtSubFormat_t::CUFFT_XT_FORMAT_DISTRIBUTED_OUTPUT => {\n                writer\n                    .write_all(stringify!(CUFFT_XT_FORMAT_DISTRIBUTED_OUTPUT).as_bytes())\n            }\n            &cuda_types::cufft::cufftXtSubFormat_t::CUFFT_FORMAT_UNDEFINED => {\n                writer.write_all(stringify!(CUFFT_FORMAT_UNDEFINED).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cufft::cufftXtCopyType_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cufft::cufftXtCopyType_t::CUFFT_COPY_HOST_TO_DEVICE => {\n                writer.write_all(stringify!(CUFFT_COPY_HOST_TO_DEVICE).as_bytes())\n            }\n            &cuda_types::cufft::cufftXtCopyType_t::CUFFT_COPY_DEVICE_TO_HOST => {\n                writer.write_all(stringify!(CUFFT_COPY_DEVICE_TO_HOST).as_bytes())\n            }\n            &cuda_types::cufft::cufftXtCopyType_t::CUFFT_COPY_DEVICE_TO_DEVICE => {\n                writer.write_all(stringify!(CUFFT_COPY_DEVICE_TO_DEVICE).as_bytes())\n            }\n            &cuda_types::cufft::cufftXtCopyType_t::CUFFT_COPY_UNDEFINED => {\n                writer.write_all(stringify!(CUFFT_COPY_UNDEFINED).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cufft::cufftXtQueryType_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cufft::cufftXtQueryType_t::CUFFT_QUERY_1D_FACTORS => {\n                writer.write_all(stringify!(CUFFT_QUERY_1D_FACTORS).as_bytes())\n            }\n            &cuda_types::cufft::cufftXtQueryType_t::CUFFT_QUERY_UNDEFINED => {\n                writer.write_all(stringify!(CUFFT_QUERY_UNDEFINED).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cufft::cufftXt1dFactors_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(size), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.size, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(stringCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.stringCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(stringLength), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.stringLength, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(substringLength), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.substringLength, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(factor1), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.factor1, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(factor2), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.factor2, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(stringMask), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.stringMask, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(substringMask), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.substringMask, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(factor1Mask), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.factor1Mask, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(factor2Mask), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.factor2Mask, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(stringShift), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.stringShift, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(substringShift), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.substringShift, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(factor1Shift), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.factor1Shift, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(factor2Shift), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.factor2Shift, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cufft::cufftXtWorkAreaPolicy_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cufft::cufftXtWorkAreaPolicy_t::CUFFT_WORKAREA_MINIMAL => {\n                writer.write_all(stringify!(CUFFT_WORKAREA_MINIMAL).as_bytes())\n            }\n            &cuda_types::cufft::cufftXtWorkAreaPolicy_t::CUFFT_WORKAREA_USER => {\n                writer.write_all(stringify!(CUFFT_WORKAREA_USER).as_bytes())\n            }\n            &cuda_types::cufft::cufftXtWorkAreaPolicy_t::CUFFT_WORKAREA_PERFORMANCE => {\n                writer.write_all(stringify!(CUFFT_WORKAREA_PERFORMANCE).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cufftXtSetGPUs(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cufft::cufftHandle,\n    nGPUs: ::core::ffi::c_int,\n    whichGPUs: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cufftXtSetGPUs\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nGPUs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nGPUs, \"cufftXtSetGPUs\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(whichGPUs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&whichGPUs, \"cufftXtSetGPUs\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftXtMalloc(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    descriptor: *mut *mut cuda_types::cufft::cudaLibXtDesc,\n    format: cuda_types::cufft::cufftXtSubFormat,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftXtMalloc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descriptor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descriptor, \"cufftXtMalloc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(format), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&format, \"cufftXtMalloc\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftXtMemcpy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    dstPointer: *mut ::core::ffi::c_void,\n    srcPointer: *mut ::core::ffi::c_void,\n    type_: cuda_types::cufft::cufftXtCopyType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftXtMemcpy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dstPointer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dstPointer, \"cufftXtMemcpy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(srcPointer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&srcPointer, \"cufftXtMemcpy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cufftXtMemcpy\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftXtFree(\n    writer: &mut (impl std::io::Write + ?Sized),\n    descriptor: *mut cuda_types::cufft::cudaLibXtDesc,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(descriptor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descriptor, \"cufftXtFree\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftXtSetWorkArea(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    workArea: *mut *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftXtSetWorkArea\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workArea), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workArea, \"cufftXtSetWorkArea\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftXtExecDescriptorC2C(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    input: *mut cuda_types::cufft::cudaLibXtDesc,\n    output: *mut cuda_types::cufft::cudaLibXtDesc,\n    direction: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftXtExecDescriptorC2C\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(input), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&input, \"cufftXtExecDescriptorC2C\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(output), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&output, \"cufftXtExecDescriptorC2C\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(direction), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&direction, \"cufftXtExecDescriptorC2C\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftXtExecDescriptorR2C(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    input: *mut cuda_types::cufft::cudaLibXtDesc,\n    output: *mut cuda_types::cufft::cudaLibXtDesc,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftXtExecDescriptorR2C\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(input), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&input, \"cufftXtExecDescriptorR2C\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(output), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&output, \"cufftXtExecDescriptorR2C\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftXtExecDescriptorC2R(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    input: *mut cuda_types::cufft::cudaLibXtDesc,\n    output: *mut cuda_types::cufft::cudaLibXtDesc,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftXtExecDescriptorC2R\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(input), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&input, \"cufftXtExecDescriptorC2R\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(output), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&output, \"cufftXtExecDescriptorC2R\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftXtExecDescriptorZ2Z(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    input: *mut cuda_types::cufft::cudaLibXtDesc,\n    output: *mut cuda_types::cufft::cudaLibXtDesc,\n    direction: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftXtExecDescriptorZ2Z\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(input), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&input, \"cufftXtExecDescriptorZ2Z\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(output), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&output, \"cufftXtExecDescriptorZ2Z\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(direction), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&direction, \"cufftXtExecDescriptorZ2Z\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftXtExecDescriptorD2Z(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    input: *mut cuda_types::cufft::cudaLibXtDesc,\n    output: *mut cuda_types::cufft::cudaLibXtDesc,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftXtExecDescriptorD2Z\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(input), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&input, \"cufftXtExecDescriptorD2Z\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(output), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&output, \"cufftXtExecDescriptorD2Z\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftXtExecDescriptorZ2D(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    input: *mut cuda_types::cufft::cudaLibXtDesc,\n    output: *mut cuda_types::cufft::cudaLibXtDesc,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftXtExecDescriptorZ2D\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(input), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&input, \"cufftXtExecDescriptorZ2D\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(output), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&output, \"cufftXtExecDescriptorZ2D\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftXtQueryPlan(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    queryStruct: *mut ::core::ffi::c_void,\n    queryType: cuda_types::cufft::cufftXtQueryType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftXtQueryPlan\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(queryStruct), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&queryStruct, \"cufftXtQueryPlan\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(queryType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&queryType, \"cufftXtQueryPlan\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cufft::cufftXtCallbackType_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cufft::cufftXtCallbackType_t::CUFFT_CB_LD_COMPLEX => {\n                writer.write_all(stringify!(CUFFT_CB_LD_COMPLEX).as_bytes())\n            }\n            &cuda_types::cufft::cufftXtCallbackType_t::CUFFT_CB_LD_COMPLEX_DOUBLE => {\n                writer.write_all(stringify!(CUFFT_CB_LD_COMPLEX_DOUBLE).as_bytes())\n            }\n            &cuda_types::cufft::cufftXtCallbackType_t::CUFFT_CB_LD_REAL => {\n                writer.write_all(stringify!(CUFFT_CB_LD_REAL).as_bytes())\n            }\n            &cuda_types::cufft::cufftXtCallbackType_t::CUFFT_CB_LD_REAL_DOUBLE => {\n                writer.write_all(stringify!(CUFFT_CB_LD_REAL_DOUBLE).as_bytes())\n            }\n            &cuda_types::cufft::cufftXtCallbackType_t::CUFFT_CB_ST_COMPLEX => {\n                writer.write_all(stringify!(CUFFT_CB_ST_COMPLEX).as_bytes())\n            }\n            &cuda_types::cufft::cufftXtCallbackType_t::CUFFT_CB_ST_COMPLEX_DOUBLE => {\n                writer.write_all(stringify!(CUFFT_CB_ST_COMPLEX_DOUBLE).as_bytes())\n            }\n            &cuda_types::cufft::cufftXtCallbackType_t::CUFFT_CB_ST_REAL => {\n                writer.write_all(stringify!(CUFFT_CB_ST_REAL).as_bytes())\n            }\n            &cuda_types::cufft::cufftXtCallbackType_t::CUFFT_CB_ST_REAL_DOUBLE => {\n                writer.write_all(stringify!(CUFFT_CB_ST_REAL_DOUBLE).as_bytes())\n            }\n            &cuda_types::cufft::cufftXtCallbackType_t::CUFFT_CB_UNDEFINED => {\n                writer.write_all(stringify!(CUFFT_CB_UNDEFINED).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cufft::cufftCallbackLoadC {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(\n            writer,\n            \"{:p}\",\n            unsafe {\n                std::mem::transmute::<\n                    cuda_types::cufft::cufftCallbackLoadC,\n                    *mut ::std::ffi::c_void,\n                >(*self)\n            },\n        )\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cufft::cufftCallbackLoadZ {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(\n            writer,\n            \"{:p}\",\n            unsafe {\n                std::mem::transmute::<\n                    cuda_types::cufft::cufftCallbackLoadZ,\n                    *mut ::std::ffi::c_void,\n                >(*self)\n            },\n        )\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cufft::cufftCallbackLoadR {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(\n            writer,\n            \"{:p}\",\n            unsafe {\n                std::mem::transmute::<\n                    cuda_types::cufft::cufftCallbackLoadR,\n                    *mut ::std::ffi::c_void,\n                >(*self)\n            },\n        )\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cufft::cufftCallbackLoadD {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(\n            writer,\n            \"{:p}\",\n            unsafe {\n                std::mem::transmute::<\n                    cuda_types::cufft::cufftCallbackLoadD,\n                    *mut ::std::ffi::c_void,\n                >(*self)\n            },\n        )\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cufft::cufftCallbackStoreC {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(\n            writer,\n            \"{:p}\",\n            unsafe {\n                std::mem::transmute::<\n                    cuda_types::cufft::cufftCallbackStoreC,\n                    *mut ::std::ffi::c_void,\n                >(*self)\n            },\n        )\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cufft::cufftCallbackStoreZ {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(\n            writer,\n            \"{:p}\",\n            unsafe {\n                std::mem::transmute::<\n                    cuda_types::cufft::cufftCallbackStoreZ,\n                    *mut ::std::ffi::c_void,\n                >(*self)\n            },\n        )\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cufft::cufftCallbackStoreR {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(\n            writer,\n            \"{:p}\",\n            unsafe {\n                std::mem::transmute::<\n                    cuda_types::cufft::cufftCallbackStoreR,\n                    *mut ::std::ffi::c_void,\n                >(*self)\n            },\n        )\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cufft::cufftCallbackStoreD {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(\n            writer,\n            \"{:p}\",\n            unsafe {\n                std::mem::transmute::<\n                    cuda_types::cufft::cufftCallbackStoreD,\n                    *mut ::std::ffi::c_void,\n                >(*self)\n            },\n        )\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cufft::cufftJITCallbackLoadC {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(\n            writer,\n            \"{:p}\",\n            unsafe {\n                std::mem::transmute::<\n                    cuda_types::cufft::cufftJITCallbackLoadC,\n                    *mut ::std::ffi::c_void,\n                >(*self)\n            },\n        )\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cufft::cufftJITCallbackLoadZ {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(\n            writer,\n            \"{:p}\",\n            unsafe {\n                std::mem::transmute::<\n                    cuda_types::cufft::cufftJITCallbackLoadZ,\n                    *mut ::std::ffi::c_void,\n                >(*self)\n            },\n        )\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cufft::cufftJITCallbackLoadR {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(\n            writer,\n            \"{:p}\",\n            unsafe {\n                std::mem::transmute::<\n                    cuda_types::cufft::cufftJITCallbackLoadR,\n                    *mut ::std::ffi::c_void,\n                >(*self)\n            },\n        )\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cufft::cufftJITCallbackLoadD {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(\n            writer,\n            \"{:p}\",\n            unsafe {\n                std::mem::transmute::<\n                    cuda_types::cufft::cufftJITCallbackLoadD,\n                    *mut ::std::ffi::c_void,\n                >(*self)\n            },\n        )\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cufft::cufftJITCallbackStoreC {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(\n            writer,\n            \"{:p}\",\n            unsafe {\n                std::mem::transmute::<\n                    cuda_types::cufft::cufftJITCallbackStoreC,\n                    *mut ::std::ffi::c_void,\n                >(*self)\n            },\n        )\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cufft::cufftJITCallbackStoreZ {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(\n            writer,\n            \"{:p}\",\n            unsafe {\n                std::mem::transmute::<\n                    cuda_types::cufft::cufftJITCallbackStoreZ,\n                    *mut ::std::ffi::c_void,\n                >(*self)\n            },\n        )\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cufft::cufftJITCallbackStoreR {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(\n            writer,\n            \"{:p}\",\n            unsafe {\n                std::mem::transmute::<\n                    cuda_types::cufft::cufftJITCallbackStoreR,\n                    *mut ::std::ffi::c_void,\n                >(*self)\n            },\n        )\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cufft::cufftJITCallbackStoreD {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(\n            writer,\n            \"{:p}\",\n            unsafe {\n                std::mem::transmute::<\n                    cuda_types::cufft::cufftJITCallbackStoreD,\n                    *mut ::std::ffi::c_void,\n                >(*self)\n            },\n        )\n    }\n}\npub fn write_cufftXtSetCallback(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    callback_routine: *mut *mut ::core::ffi::c_void,\n    cbType: cuda_types::cufft::cufftXtCallbackType,\n    caller_info: *mut *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftXtSetCallback\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(callback_routine), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&callback_routine, \"cufftXtSetCallback\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cbType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cbType, \"cufftXtSetCallback\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(caller_info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&caller_info, \"cufftXtSetCallback\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftXtClearCallback(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    cbType: cuda_types::cufft::cufftXtCallbackType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftXtClearCallback\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cbType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cbType, \"cufftXtClearCallback\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftXtSetCallbackSharedSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    cbType: cuda_types::cufft::cufftXtCallbackType,\n    sharedSize: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftXtSetCallbackSharedSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cbType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cbType, \"cufftXtSetCallbackSharedSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sharedSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sharedSize,\n        \"cufftXtSetCallbackSharedSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftXtSetJITCallback(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    lto_callback_symbol_name: *const ::core::ffi::c_char,\n    lto_callback_fatbin: *const ::core::ffi::c_void,\n    lto_callback_fatbin_size: usize,\n    type_: cuda_types::cufft::cufftXtCallbackType,\n    caller_info: *mut *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftXtSetJITCallback\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lto_callback_symbol_name), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &lto_callback_symbol_name,\n        \"cufftXtSetJITCallback\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lto_callback_fatbin), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &lto_callback_fatbin,\n        \"cufftXtSetJITCallback\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lto_callback_fatbin_size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &lto_callback_fatbin_size,\n        \"cufftXtSetJITCallback\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cufftXtSetJITCallback\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(caller_info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&caller_info, \"cufftXtSetJITCallback\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftXtMakePlanMany(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    rank: ::core::ffi::c_int,\n    n: *mut ::core::ffi::c_longlong,\n    inembed: *mut ::core::ffi::c_longlong,\n    istride: ::core::ffi::c_longlong,\n    idist: ::core::ffi::c_longlong,\n    inputtype: cuda_types::cufft::cudaDataType,\n    onembed: *mut ::core::ffi::c_longlong,\n    ostride: ::core::ffi::c_longlong,\n    odist: ::core::ffi::c_longlong,\n    outputtype: cuda_types::cufft::cudaDataType,\n    batch: ::core::ffi::c_longlong,\n    workSize: *mut usize,\n    executiontype: cuda_types::cufft::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftXtMakePlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rank), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rank, \"cufftXtMakePlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cufftXtMakePlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inembed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&inembed, \"cufftXtMakePlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(istride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&istride, \"cufftXtMakePlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idist), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idist, \"cufftXtMakePlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inputtype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&inputtype, \"cufftXtMakePlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(onembed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&onembed, \"cufftXtMakePlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ostride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ostride, \"cufftXtMakePlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(odist), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&odist, \"cufftXtMakePlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(outputtype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&outputtype, \"cufftXtMakePlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batch, \"cufftXtMakePlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSize, \"cufftXtMakePlanMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(executiontype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&executiontype, \"cufftXtMakePlanMany\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftXtGetSizeMany(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    rank: ::core::ffi::c_int,\n    n: *mut ::core::ffi::c_longlong,\n    inembed: *mut ::core::ffi::c_longlong,\n    istride: ::core::ffi::c_longlong,\n    idist: ::core::ffi::c_longlong,\n    inputtype: cuda_types::cufft::cudaDataType,\n    onembed: *mut ::core::ffi::c_longlong,\n    ostride: ::core::ffi::c_longlong,\n    odist: ::core::ffi::c_longlong,\n    outputtype: cuda_types::cufft::cudaDataType,\n    batch: ::core::ffi::c_longlong,\n    workSize: *mut usize,\n    executiontype: cuda_types::cufft::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftXtGetSizeMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rank), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rank, \"cufftXtGetSizeMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cufftXtGetSizeMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inembed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&inembed, \"cufftXtGetSizeMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(istride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&istride, \"cufftXtGetSizeMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idist), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idist, \"cufftXtGetSizeMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(inputtype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&inputtype, \"cufftXtGetSizeMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(onembed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&onembed, \"cufftXtGetSizeMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ostride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ostride, \"cufftXtGetSizeMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(odist), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&odist, \"cufftXtGetSizeMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(outputtype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&outputtype, \"cufftXtGetSizeMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&batch, \"cufftXtGetSizeMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSize, \"cufftXtGetSizeMany\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(executiontype), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&executiontype, \"cufftXtGetSizeMany\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftXtExec(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    input: *mut ::core::ffi::c_void,\n    output: *mut ::core::ffi::c_void,\n    direction: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftXtExec\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(input), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&input, \"cufftXtExec\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(output), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&output, \"cufftXtExec\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(direction), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&direction, \"cufftXtExec\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftXtExecDescriptor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    input: *mut cuda_types::cufft::cudaLibXtDesc,\n    output: *mut cuda_types::cufft::cudaLibXtDesc,\n    direction: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftXtExecDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(input), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&input, \"cufftXtExecDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(output), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&output, \"cufftXtExecDescriptor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(direction), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&direction, \"cufftXtExecDescriptor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftXtSetWorkAreaPolicy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cufft::cufftHandle,\n    policy: cuda_types::cufft::cufftXtWorkAreaPolicy,\n    workSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cufftXtSetWorkAreaPolicy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cufftXtSetWorkAreaPolicy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workSize, \"cufftXtSetWorkAreaPolicy\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftXtMakePlanGuru64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_uint,\n    param_2: ::core::ffi::c_int,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_int,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_uint,\n    param_8: ::core::ffi::c_uint,\n    param_9: ::core::ffi::c_ulonglong,\n    param_10: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cufftXtMakePlanGuru64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cufftXtMakePlanGuru64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cufftXtMakePlanGuru64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cufftXtMakePlanGuru64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cufftXtMakePlanGuru64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cufftXtMakePlanGuru64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cufftXtMakePlanGuru64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_8), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_8, \"cufftXtMakePlanGuru64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_9), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_9, \"cufftXtMakePlanGuru64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_10), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_10, \"cufftXtMakePlanGuru64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftMakePlanGuru64(\n    writer: &mut (impl std::io::Write + ?Sized),\n    param_1: ::core::ffi::c_uint,\n    param_2: ::core::ffi::c_int,\n    param_3: ::core::ffi::c_ulonglong,\n    param_4: ::core::ffi::c_int,\n    param_5: ::core::ffi::c_ulonglong,\n    param_6: ::core::ffi::c_uint,\n    param_7: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(param_1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_1, \"cufftMakePlanGuru64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_2, \"cufftMakePlanGuru64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_3, \"cufftMakePlanGuru64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_4, \"cufftMakePlanGuru64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_5, \"cufftMakePlanGuru64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_6), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_6, \"cufftMakePlanGuru64\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(param_7), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&param_7, \"cufftMakePlanGuru64\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cufftEnterCS(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_cufftLeaveCS(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\nimpl crate::CudaDisplay for cuda_types::cufft::cufftResult {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            Ok(()) => writer.write_all(b\"CUFFT_SUCCESS\"),\n            Err(err) => {\n                match err.0.get() {\n                    1 => writer.write_all(\"CUFFT_INVALID_PLAN\".as_bytes()),\n                    2 => writer.write_all(\"CUFFT_ALLOC_FAILED\".as_bytes()),\n                    3 => writer.write_all(\"CUFFT_INVALID_TYPE\".as_bytes()),\n                    4 => writer.write_all(\"CUFFT_INVALID_VALUE\".as_bytes()),\n                    5 => writer.write_all(\"CUFFT_INTERNAL_ERROR\".as_bytes()),\n                    6 => writer.write_all(\"CUFFT_EXEC_FAILED\".as_bytes()),\n                    7 => writer.write_all(\"CUFFT_SETUP_FAILED\".as_bytes()),\n                    8 => writer.write_all(\"CUFFT_INVALID_SIZE\".as_bytes()),\n                    9 => writer.write_all(\"CUFFT_UNALIGNED_DATA\".as_bytes()),\n                    11 => writer.write_all(\"CUFFT_INVALID_DEVICE\".as_bytes()),\n                    13 => writer.write_all(\"CUFFT_NO_WORKSPACE\".as_bytes()),\n                    14 => writer.write_all(\"CUFFT_NOT_IMPLEMENTED\".as_bytes()),\n                    16 => writer.write_all(\"CUFFT_NOT_SUPPORTED\".as_bytes()),\n                    17 => writer.write_all(\"CUFFT_MISSING_DEPENDENCY\".as_bytes()),\n                    18 => writer.write_all(\"CUFFT_NVRTC_FAILURE\".as_bytes()),\n                    19 => writer.write_all(\"CUFFT_NVJITLINK_FAILURE\".as_bytes()),\n                    20 => writer.write_all(\"CUFFT_NVSHMEM_FAILURE\".as_bytes()),\n                    err => write!(writer, \"{}\", err),\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "format/src/format_generated_nvml.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlDevice_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlGpuInstance_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlPciInfoExt_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(domain), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.domain, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(bus), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.bus, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(device), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.device, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(pciDeviceId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.pciDeviceId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(pciSubSystemId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.pciSubSystemId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(baseClass), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.baseClass, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(subClass), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.subClass, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(busId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.busId, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlPciInfo_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(busIdLegacy), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.busIdLegacy, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(domain), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.domain, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(bus), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.bus, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(device), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.device, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(pciDeviceId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.pciDeviceId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(pciSubSystemId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.pciSubSystemId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(busId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.busId, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlEccErrorCounts_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(l1Cache), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.l1Cache, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(l2Cache), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.l2Cache, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(deviceMemory), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.deviceMemory, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(registerFile), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.registerFile, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlUtilization_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(gpu), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.gpu, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(memory), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.memory, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlMemory_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(total), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.total, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(free), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.free, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(used), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.used, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlMemory_v2_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(total), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.total, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(free), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.free, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(used), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.used, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlBAR1Memory_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(bar1Total), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.bar1Total, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(bar1Free), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.bar1Free, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(bar1Used), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.bar1Used, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlProcessInfo_v1_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(pid), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.pid, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(usedGpuMemory), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.usedGpuMemory, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlProcessInfo_v2_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(pid), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.pid, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(usedGpuMemory), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.usedGpuMemory, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(gpuInstanceId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.gpuInstanceId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(computeInstanceId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.computeInstanceId, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlProcessDetail_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(pid), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.pid, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(usedGpuMemory), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.usedGpuMemory, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(gpuInstanceId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.gpuInstanceId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(computeInstanceId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.computeInstanceId, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(usedGpuCcProtectedMemory), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.usedGpuCcProtectedMemory, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlProcessDetailList_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(mode), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.mode, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(numProcArrayEntries), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.numProcArrayEntries, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(procArray), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.procArray, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlDeviceAttributes_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer\n            .write_all(concat!(\"{ \", stringify!(multiprocessorCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.multiprocessorCount, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(sharedCopyEngineCount), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.sharedCopyEngineCount, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(sharedDecoderCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sharedDecoderCount, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(sharedEncoderCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sharedEncoderCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sharedJpegCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sharedJpegCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sharedOfaCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sharedOfaCount, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(gpuInstanceSliceCount), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.gpuInstanceSliceCount, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(computeInstanceSliceCount), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.computeInstanceSliceCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(memorySizeMB), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.memorySizeMB, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlC2cModeInfo_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(isC2cEnabled), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.isC2cEnabled, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlDeviceAddressingModeType_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlDeviceAddressingModeType_t::NVML_DEVICE_ADDRESSING_MODE_NONE => {\n                writer.write_all(stringify!(NVML_DEVICE_ADDRESSING_MODE_NONE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlDeviceAddressingModeType_t::NVML_DEVICE_ADDRESSING_MODE_HMM => {\n                writer.write_all(stringify!(NVML_DEVICE_ADDRESSING_MODE_HMM).as_bytes())\n            }\n            &cuda_types::nvml::nvmlDeviceAddressingModeType_t::NVML_DEVICE_ADDRESSING_MODE_ATS => {\n                writer.write_all(stringify!(NVML_DEVICE_ADDRESSING_MODE_ATS).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlDeviceAddressingMode_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(value), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.value, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlRepairStatus_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(bChannelRepairPending), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.bChannelRepairPending, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(bTpcRepairPending), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.bTpcRepairPending, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlRowRemapperHistogramValues_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(max), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.max, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(high), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.high, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(partial), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.partial, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(low), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.low, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(none), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.none, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlBridgeChipType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlBridgeChipType_enum::NVML_BRIDGE_CHIP_PLX => {\n                writer.write_all(stringify!(NVML_BRIDGE_CHIP_PLX).as_bytes())\n            }\n            &cuda_types::nvml::nvmlBridgeChipType_enum::NVML_BRIDGE_CHIP_BRO4 => {\n                writer.write_all(stringify!(NVML_BRIDGE_CHIP_BRO4).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlNvLinkUtilizationCountUnits_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlNvLinkUtilizationCountUnits_enum::NVML_NVLINK_COUNTER_UNIT_CYCLES => {\n                writer.write_all(stringify!(NVML_NVLINK_COUNTER_UNIT_CYCLES).as_bytes())\n            }\n            &cuda_types::nvml::nvmlNvLinkUtilizationCountUnits_enum::NVML_NVLINK_COUNTER_UNIT_PACKETS => {\n                writer.write_all(stringify!(NVML_NVLINK_COUNTER_UNIT_PACKETS).as_bytes())\n            }\n            &cuda_types::nvml::nvmlNvLinkUtilizationCountUnits_enum::NVML_NVLINK_COUNTER_UNIT_BYTES => {\n                writer.write_all(stringify!(NVML_NVLINK_COUNTER_UNIT_BYTES).as_bytes())\n            }\n            &cuda_types::nvml::nvmlNvLinkUtilizationCountUnits_enum::NVML_NVLINK_COUNTER_UNIT_RESERVED => {\n                writer\n                    .write_all(stringify!(NVML_NVLINK_COUNTER_UNIT_RESERVED).as_bytes())\n            }\n            &cuda_types::nvml::nvmlNvLinkUtilizationCountUnits_enum::NVML_NVLINK_COUNTER_UNIT_COUNT => {\n                writer.write_all(stringify!(NVML_NVLINK_COUNTER_UNIT_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlNvLinkUtilizationCountPktTypes_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlNvLinkUtilizationCountPktTypes_enum::NVML_NVLINK_COUNTER_PKTFILTER_NOP => {\n                writer\n                    .write_all(stringify!(NVML_NVLINK_COUNTER_PKTFILTER_NOP).as_bytes())\n            }\n            &cuda_types::nvml::nvmlNvLinkUtilizationCountPktTypes_enum::NVML_NVLINK_COUNTER_PKTFILTER_READ => {\n                writer\n                    .write_all(stringify!(NVML_NVLINK_COUNTER_PKTFILTER_READ).as_bytes())\n            }\n            &cuda_types::nvml::nvmlNvLinkUtilizationCountPktTypes_enum::NVML_NVLINK_COUNTER_PKTFILTER_WRITE => {\n                writer\n                    .write_all(\n                        stringify!(NVML_NVLINK_COUNTER_PKTFILTER_WRITE).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlNvLinkUtilizationCountPktTypes_enum::NVML_NVLINK_COUNTER_PKTFILTER_RATOM => {\n                writer\n                    .write_all(\n                        stringify!(NVML_NVLINK_COUNTER_PKTFILTER_RATOM).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlNvLinkUtilizationCountPktTypes_enum::NVML_NVLINK_COUNTER_PKTFILTER_NRATOM => {\n                writer\n                    .write_all(\n                        stringify!(NVML_NVLINK_COUNTER_PKTFILTER_NRATOM).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlNvLinkUtilizationCountPktTypes_enum::NVML_NVLINK_COUNTER_PKTFILTER_FLUSH => {\n                writer\n                    .write_all(\n                        stringify!(NVML_NVLINK_COUNTER_PKTFILTER_FLUSH).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlNvLinkUtilizationCountPktTypes_enum::NVML_NVLINK_COUNTER_PKTFILTER_RESPDATA => {\n                writer\n                    .write_all(\n                        stringify!(NVML_NVLINK_COUNTER_PKTFILTER_RESPDATA).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlNvLinkUtilizationCountPktTypes_enum::NVML_NVLINK_COUNTER_PKTFILTER_RESPNODATA => {\n                writer\n                    .write_all(\n                        stringify!(NVML_NVLINK_COUNTER_PKTFILTER_RESPNODATA).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlNvLinkUtilizationCountPktTypes_enum::NVML_NVLINK_COUNTER_PKTFILTER_ALL => {\n                writer\n                    .write_all(stringify!(NVML_NVLINK_COUNTER_PKTFILTER_ALL).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlNvLinkUtilizationControl_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(units), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.units, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(pktfilter), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.pktfilter, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlNvLinkCapability_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlNvLinkCapability_enum::NVML_NVLINK_CAP_P2P_SUPPORTED => {\n                writer.write_all(stringify!(NVML_NVLINK_CAP_P2P_SUPPORTED).as_bytes())\n            }\n            &cuda_types::nvml::nvmlNvLinkCapability_enum::NVML_NVLINK_CAP_SYSMEM_ACCESS => {\n                writer.write_all(stringify!(NVML_NVLINK_CAP_SYSMEM_ACCESS).as_bytes())\n            }\n            &cuda_types::nvml::nvmlNvLinkCapability_enum::NVML_NVLINK_CAP_P2P_ATOMICS => {\n                writer.write_all(stringify!(NVML_NVLINK_CAP_P2P_ATOMICS).as_bytes())\n            }\n            &cuda_types::nvml::nvmlNvLinkCapability_enum::NVML_NVLINK_CAP_SYSMEM_ATOMICS => {\n                writer.write_all(stringify!(NVML_NVLINK_CAP_SYSMEM_ATOMICS).as_bytes())\n            }\n            &cuda_types::nvml::nvmlNvLinkCapability_enum::NVML_NVLINK_CAP_SLI_BRIDGE => {\n                writer.write_all(stringify!(NVML_NVLINK_CAP_SLI_BRIDGE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlNvLinkCapability_enum::NVML_NVLINK_CAP_VALID => {\n                writer.write_all(stringify!(NVML_NVLINK_CAP_VALID).as_bytes())\n            }\n            &cuda_types::nvml::nvmlNvLinkCapability_enum::NVML_NVLINK_CAP_COUNT => {\n                writer.write_all(stringify!(NVML_NVLINK_CAP_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlNvLinkErrorCounter_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlNvLinkErrorCounter_enum::NVML_NVLINK_ERROR_DL_REPLAY => {\n                writer.write_all(stringify!(NVML_NVLINK_ERROR_DL_REPLAY).as_bytes())\n            }\n            &cuda_types::nvml::nvmlNvLinkErrorCounter_enum::NVML_NVLINK_ERROR_DL_RECOVERY => {\n                writer.write_all(stringify!(NVML_NVLINK_ERROR_DL_RECOVERY).as_bytes())\n            }\n            &cuda_types::nvml::nvmlNvLinkErrorCounter_enum::NVML_NVLINK_ERROR_DL_CRC_FLIT => {\n                writer.write_all(stringify!(NVML_NVLINK_ERROR_DL_CRC_FLIT).as_bytes())\n            }\n            &cuda_types::nvml::nvmlNvLinkErrorCounter_enum::NVML_NVLINK_ERROR_DL_CRC_DATA => {\n                writer.write_all(stringify!(NVML_NVLINK_ERROR_DL_CRC_DATA).as_bytes())\n            }\n            &cuda_types::nvml::nvmlNvLinkErrorCounter_enum::NVML_NVLINK_ERROR_DL_ECC_DATA => {\n                writer.write_all(stringify!(NVML_NVLINK_ERROR_DL_ECC_DATA).as_bytes())\n            }\n            &cuda_types::nvml::nvmlNvLinkErrorCounter_enum::NVML_NVLINK_ERROR_COUNT => {\n                writer.write_all(stringify!(NVML_NVLINK_ERROR_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlIntNvLinkDeviceType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlIntNvLinkDeviceType_enum::NVML_NVLINK_DEVICE_TYPE_GPU => {\n                writer.write_all(stringify!(NVML_NVLINK_DEVICE_TYPE_GPU).as_bytes())\n            }\n            &cuda_types::nvml::nvmlIntNvLinkDeviceType_enum::NVML_NVLINK_DEVICE_TYPE_IBMNPU => {\n                writer.write_all(stringify!(NVML_NVLINK_DEVICE_TYPE_IBMNPU).as_bytes())\n            }\n            &cuda_types::nvml::nvmlIntNvLinkDeviceType_enum::NVML_NVLINK_DEVICE_TYPE_SWITCH => {\n                writer.write_all(stringify!(NVML_NVLINK_DEVICE_TYPE_SWITCH).as_bytes())\n            }\n            &cuda_types::nvml::nvmlIntNvLinkDeviceType_enum::NVML_NVLINK_DEVICE_TYPE_UNKNOWN => {\n                writer.write_all(stringify!(NVML_NVLINK_DEVICE_TYPE_UNKNOWN).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlGpuLevel_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlGpuLevel_enum::NVML_TOPOLOGY_INTERNAL => {\n                writer.write_all(stringify!(NVML_TOPOLOGY_INTERNAL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpuLevel_enum::NVML_TOPOLOGY_SINGLE => {\n                writer.write_all(stringify!(NVML_TOPOLOGY_SINGLE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpuLevel_enum::NVML_TOPOLOGY_MULTIPLE => {\n                writer.write_all(stringify!(NVML_TOPOLOGY_MULTIPLE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpuLevel_enum::NVML_TOPOLOGY_HOSTBRIDGE => {\n                writer.write_all(stringify!(NVML_TOPOLOGY_HOSTBRIDGE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpuLevel_enum::NVML_TOPOLOGY_NODE => {\n                writer.write_all(stringify!(NVML_TOPOLOGY_NODE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpuLevel_enum::NVML_TOPOLOGY_SYSTEM => {\n                writer.write_all(stringify!(NVML_TOPOLOGY_SYSTEM).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlGpuP2PStatus_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlGpuP2PStatus_enum::NVML_P2P_STATUS_OK => {\n                writer.write_all(stringify!(NVML_P2P_STATUS_OK).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpuP2PStatus_enum::NVML_P2P_STATUS_CHIPSET_NOT_SUPPORED => {\n                writer\n                    .write_all(\n                        stringify!(NVML_P2P_STATUS_CHIPSET_NOT_SUPPORED).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpuP2PStatus_enum::NVML_P2P_STATUS_CHIPSET_NOT_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(NVML_P2P_STATUS_CHIPSET_NOT_SUPPORTED).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpuP2PStatus_enum::NVML_P2P_STATUS_GPU_NOT_SUPPORTED => {\n                writer\n                    .write_all(stringify!(NVML_P2P_STATUS_GPU_NOT_SUPPORTED).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpuP2PStatus_enum::NVML_P2P_STATUS_IOH_TOPOLOGY_NOT_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(NVML_P2P_STATUS_IOH_TOPOLOGY_NOT_SUPPORTED).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpuP2PStatus_enum::NVML_P2P_STATUS_DISABLED_BY_REGKEY => {\n                writer\n                    .write_all(stringify!(NVML_P2P_STATUS_DISABLED_BY_REGKEY).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpuP2PStatus_enum::NVML_P2P_STATUS_NOT_SUPPORTED => {\n                writer.write_all(stringify!(NVML_P2P_STATUS_NOT_SUPPORTED).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpuP2PStatus_enum::NVML_P2P_STATUS_UNKNOWN => {\n                writer.write_all(stringify!(NVML_P2P_STATUS_UNKNOWN).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlGpuP2PCapsIndex_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlGpuP2PCapsIndex_enum::NVML_P2P_CAPS_INDEX_READ => {\n                writer.write_all(stringify!(NVML_P2P_CAPS_INDEX_READ).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpuP2PCapsIndex_enum::NVML_P2P_CAPS_INDEX_WRITE => {\n                writer.write_all(stringify!(NVML_P2P_CAPS_INDEX_WRITE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpuP2PCapsIndex_enum::NVML_P2P_CAPS_INDEX_NVLINK => {\n                writer.write_all(stringify!(NVML_P2P_CAPS_INDEX_NVLINK).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpuP2PCapsIndex_enum::NVML_P2P_CAPS_INDEX_ATOMICS => {\n                writer.write_all(stringify!(NVML_P2P_CAPS_INDEX_ATOMICS).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpuP2PCapsIndex_enum::NVML_P2P_CAPS_INDEX_PCI => {\n                writer.write_all(stringify!(NVML_P2P_CAPS_INDEX_PCI).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpuP2PCapsIndex_enum::NVML_P2P_CAPS_INDEX_PROP => {\n                writer.write_all(stringify!(NVML_P2P_CAPS_INDEX_PROP).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpuP2PCapsIndex_enum::NVML_P2P_CAPS_INDEX_UNKNOWN => {\n                writer.write_all(stringify!(NVML_P2P_CAPS_INDEX_UNKNOWN).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlBridgeChipInfo_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(type_), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.type_, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(fwVersion), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.fwVersion, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlBridgeChipHierarchy_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(bridgeCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.bridgeCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(bridgeChipInfo), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.bridgeChipInfo, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlSamplingType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlSamplingType_enum::NVML_TOTAL_POWER_SAMPLES => {\n                writer.write_all(stringify!(NVML_TOTAL_POWER_SAMPLES).as_bytes())\n            }\n            &cuda_types::nvml::nvmlSamplingType_enum::NVML_GPU_UTILIZATION_SAMPLES => {\n                writer.write_all(stringify!(NVML_GPU_UTILIZATION_SAMPLES).as_bytes())\n            }\n            &cuda_types::nvml::nvmlSamplingType_enum::NVML_MEMORY_UTILIZATION_SAMPLES => {\n                writer.write_all(stringify!(NVML_MEMORY_UTILIZATION_SAMPLES).as_bytes())\n            }\n            &cuda_types::nvml::nvmlSamplingType_enum::NVML_ENC_UTILIZATION_SAMPLES => {\n                writer.write_all(stringify!(NVML_ENC_UTILIZATION_SAMPLES).as_bytes())\n            }\n            &cuda_types::nvml::nvmlSamplingType_enum::NVML_DEC_UTILIZATION_SAMPLES => {\n                writer.write_all(stringify!(NVML_DEC_UTILIZATION_SAMPLES).as_bytes())\n            }\n            &cuda_types::nvml::nvmlSamplingType_enum::NVML_PROCESSOR_CLK_SAMPLES => {\n                writer.write_all(stringify!(NVML_PROCESSOR_CLK_SAMPLES).as_bytes())\n            }\n            &cuda_types::nvml::nvmlSamplingType_enum::NVML_MEMORY_CLK_SAMPLES => {\n                writer.write_all(stringify!(NVML_MEMORY_CLK_SAMPLES).as_bytes())\n            }\n            &cuda_types::nvml::nvmlSamplingType_enum::NVML_MODULE_POWER_SAMPLES => {\n                writer.write_all(stringify!(NVML_MODULE_POWER_SAMPLES).as_bytes())\n            }\n            &cuda_types::nvml::nvmlSamplingType_enum::NVML_JPG_UTILIZATION_SAMPLES => {\n                writer.write_all(stringify!(NVML_JPG_UTILIZATION_SAMPLES).as_bytes())\n            }\n            &cuda_types::nvml::nvmlSamplingType_enum::NVML_OFA_UTILIZATION_SAMPLES => {\n                writer.write_all(stringify!(NVML_OFA_UTILIZATION_SAMPLES).as_bytes())\n            }\n            &cuda_types::nvml::nvmlSamplingType_enum::NVML_SAMPLINGTYPE_COUNT => {\n                writer.write_all(stringify!(NVML_SAMPLINGTYPE_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlPcieUtilCounter_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlPcieUtilCounter_enum::NVML_PCIE_UTIL_TX_BYTES => {\n                writer.write_all(stringify!(NVML_PCIE_UTIL_TX_BYTES).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPcieUtilCounter_enum::NVML_PCIE_UTIL_RX_BYTES => {\n                writer.write_all(stringify!(NVML_PCIE_UTIL_RX_BYTES).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPcieUtilCounter_enum::NVML_PCIE_UTIL_COUNT => {\n                writer.write_all(stringify!(NVML_PCIE_UTIL_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlValueType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlValueType_enum::NVML_VALUE_TYPE_DOUBLE => {\n                writer.write_all(stringify!(NVML_VALUE_TYPE_DOUBLE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlValueType_enum::NVML_VALUE_TYPE_UNSIGNED_INT => {\n                writer.write_all(stringify!(NVML_VALUE_TYPE_UNSIGNED_INT).as_bytes())\n            }\n            &cuda_types::nvml::nvmlValueType_enum::NVML_VALUE_TYPE_UNSIGNED_LONG => {\n                writer.write_all(stringify!(NVML_VALUE_TYPE_UNSIGNED_LONG).as_bytes())\n            }\n            &cuda_types::nvml::nvmlValueType_enum::NVML_VALUE_TYPE_UNSIGNED_LONG_LONG => {\n                writer\n                    .write_all(stringify!(NVML_VALUE_TYPE_UNSIGNED_LONG_LONG).as_bytes())\n            }\n            &cuda_types::nvml::nvmlValueType_enum::NVML_VALUE_TYPE_SIGNED_LONG_LONG => {\n                writer.write_all(stringify!(NVML_VALUE_TYPE_SIGNED_LONG_LONG).as_bytes())\n            }\n            &cuda_types::nvml::nvmlValueType_enum::NVML_VALUE_TYPE_SIGNED_INT => {\n                writer.write_all(stringify!(NVML_VALUE_TYPE_SIGNED_INT).as_bytes())\n            }\n            &cuda_types::nvml::nvmlValueType_enum::NVML_VALUE_TYPE_UNSIGNED_SHORT => {\n                writer.write_all(stringify!(NVML_VALUE_TYPE_UNSIGNED_SHORT).as_bytes())\n            }\n            &cuda_types::nvml::nvmlValueType_enum::NVML_VALUE_TYPE_COUNT => {\n                writer.write_all(stringify!(NVML_VALUE_TYPE_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlPerfPolicyType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlPerfPolicyType_enum::NVML_PERF_POLICY_POWER => {\n                writer.write_all(stringify!(NVML_PERF_POLICY_POWER).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPerfPolicyType_enum::NVML_PERF_POLICY_THERMAL => {\n                writer.write_all(stringify!(NVML_PERF_POLICY_THERMAL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPerfPolicyType_enum::NVML_PERF_POLICY_SYNC_BOOST => {\n                writer.write_all(stringify!(NVML_PERF_POLICY_SYNC_BOOST).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPerfPolicyType_enum::NVML_PERF_POLICY_BOARD_LIMIT => {\n                writer.write_all(stringify!(NVML_PERF_POLICY_BOARD_LIMIT).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPerfPolicyType_enum::NVML_PERF_POLICY_LOW_UTILIZATION => {\n                writer.write_all(stringify!(NVML_PERF_POLICY_LOW_UTILIZATION).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPerfPolicyType_enum::NVML_PERF_POLICY_RELIABILITY => {\n                writer.write_all(stringify!(NVML_PERF_POLICY_RELIABILITY).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPerfPolicyType_enum::NVML_PERF_POLICY_TOTAL_APP_CLOCKS => {\n                writer\n                    .write_all(stringify!(NVML_PERF_POLICY_TOTAL_APP_CLOCKS).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPerfPolicyType_enum::NVML_PERF_POLICY_TOTAL_BASE_CLOCKS => {\n                writer\n                    .write_all(stringify!(NVML_PERF_POLICY_TOTAL_BASE_CLOCKS).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPerfPolicyType_enum::NVML_PERF_POLICY_COUNT => {\n                writer.write_all(stringify!(NVML_PERF_POLICY_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlViolationTime_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(referenceTime), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.referenceTime, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(violationTime), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.violationTime, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlThermalTarget_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlThermalTarget_t::NVML_THERMAL_TARGET_NONE => {\n                writer.write_all(stringify!(NVML_THERMAL_TARGET_NONE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlThermalTarget_t::NVML_THERMAL_TARGET_GPU => {\n                writer.write_all(stringify!(NVML_THERMAL_TARGET_GPU).as_bytes())\n            }\n            &cuda_types::nvml::nvmlThermalTarget_t::NVML_THERMAL_TARGET_MEMORY => {\n                writer.write_all(stringify!(NVML_THERMAL_TARGET_MEMORY).as_bytes())\n            }\n            &cuda_types::nvml::nvmlThermalTarget_t::NVML_THERMAL_TARGET_POWER_SUPPLY => {\n                writer.write_all(stringify!(NVML_THERMAL_TARGET_POWER_SUPPLY).as_bytes())\n            }\n            &cuda_types::nvml::nvmlThermalTarget_t::NVML_THERMAL_TARGET_BOARD => {\n                writer.write_all(stringify!(NVML_THERMAL_TARGET_BOARD).as_bytes())\n            }\n            &cuda_types::nvml::nvmlThermalTarget_t::NVML_THERMAL_TARGET_VCD_BOARD => {\n                writer.write_all(stringify!(NVML_THERMAL_TARGET_VCD_BOARD).as_bytes())\n            }\n            &cuda_types::nvml::nvmlThermalTarget_t::NVML_THERMAL_TARGET_VCD_INLET => {\n                writer.write_all(stringify!(NVML_THERMAL_TARGET_VCD_INLET).as_bytes())\n            }\n            &cuda_types::nvml::nvmlThermalTarget_t::NVML_THERMAL_TARGET_VCD_OUTLET => {\n                writer.write_all(stringify!(NVML_THERMAL_TARGET_VCD_OUTLET).as_bytes())\n            }\n            &cuda_types::nvml::nvmlThermalTarget_t::NVML_THERMAL_TARGET_ALL => {\n                writer.write_all(stringify!(NVML_THERMAL_TARGET_ALL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlThermalTarget_t::NVML_THERMAL_TARGET_UNKNOWN => {\n                writer.write_all(stringify!(NVML_THERMAL_TARGET_UNKNOWN).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlThermalController_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_NONE => {\n                writer.write_all(stringify!(NVML_THERMAL_CONTROLLER_NONE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_GPU_INTERNAL => {\n                writer\n                    .write_all(\n                        stringify!(NVML_THERMAL_CONTROLLER_GPU_INTERNAL).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_ADM1032 => {\n                writer.write_all(stringify!(NVML_THERMAL_CONTROLLER_ADM1032).as_bytes())\n            }\n            &cuda_types::nvml::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_ADT7461 => {\n                writer.write_all(stringify!(NVML_THERMAL_CONTROLLER_ADT7461).as_bytes())\n            }\n            &cuda_types::nvml::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_MAX6649 => {\n                writer.write_all(stringify!(NVML_THERMAL_CONTROLLER_MAX6649).as_bytes())\n            }\n            &cuda_types::nvml::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_MAX1617 => {\n                writer.write_all(stringify!(NVML_THERMAL_CONTROLLER_MAX1617).as_bytes())\n            }\n            &cuda_types::nvml::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_LM99 => {\n                writer.write_all(stringify!(NVML_THERMAL_CONTROLLER_LM99).as_bytes())\n            }\n            &cuda_types::nvml::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_LM89 => {\n                writer.write_all(stringify!(NVML_THERMAL_CONTROLLER_LM89).as_bytes())\n            }\n            &cuda_types::nvml::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_LM64 => {\n                writer.write_all(stringify!(NVML_THERMAL_CONTROLLER_LM64).as_bytes())\n            }\n            &cuda_types::nvml::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_G781 => {\n                writer.write_all(stringify!(NVML_THERMAL_CONTROLLER_G781).as_bytes())\n            }\n            &cuda_types::nvml::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_ADT7473 => {\n                writer.write_all(stringify!(NVML_THERMAL_CONTROLLER_ADT7473).as_bytes())\n            }\n            &cuda_types::nvml::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_SBMAX6649 => {\n                writer\n                    .write_all(stringify!(NVML_THERMAL_CONTROLLER_SBMAX6649).as_bytes())\n            }\n            &cuda_types::nvml::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_VBIOSEVT => {\n                writer.write_all(stringify!(NVML_THERMAL_CONTROLLER_VBIOSEVT).as_bytes())\n            }\n            &cuda_types::nvml::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_OS => {\n                writer.write_all(stringify!(NVML_THERMAL_CONTROLLER_OS).as_bytes())\n            }\n            &cuda_types::nvml::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_NVSYSCON_CANOAS => {\n                writer\n                    .write_all(\n                        stringify!(NVML_THERMAL_CONTROLLER_NVSYSCON_CANOAS).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_NVSYSCON_E551 => {\n                writer\n                    .write_all(\n                        stringify!(NVML_THERMAL_CONTROLLER_NVSYSCON_E551).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_MAX6649R => {\n                writer.write_all(stringify!(NVML_THERMAL_CONTROLLER_MAX6649R).as_bytes())\n            }\n            &cuda_types::nvml::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_ADT7473S => {\n                writer.write_all(stringify!(NVML_THERMAL_CONTROLLER_ADT7473S).as_bytes())\n            }\n            &cuda_types::nvml::nvmlThermalController_t::NVML_THERMAL_CONTROLLER_UNKNOWN => {\n                writer.write_all(stringify!(NVML_THERMAL_CONTROLLER_UNKNOWN).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlGpuThermalSettings_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(count), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.count, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sensor), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sensor, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlGpuThermalSettings_t__bindgen_ty_1 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(controller), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.controller, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(defaultMinTemp), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.defaultMinTemp, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(defaultMaxTemp), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.defaultMaxTemp, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(currentTemp), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.currentTemp, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(target), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.target, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlCoolerControl_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlCoolerControl_enum::NVML_THERMAL_COOLER_SIGNAL_NONE => {\n                writer.write_all(stringify!(NVML_THERMAL_COOLER_SIGNAL_NONE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlCoolerControl_enum::NVML_THERMAL_COOLER_SIGNAL_TOGGLE => {\n                writer\n                    .write_all(stringify!(NVML_THERMAL_COOLER_SIGNAL_TOGGLE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlCoolerControl_enum::NVML_THERMAL_COOLER_SIGNAL_VARIABLE => {\n                writer\n                    .write_all(\n                        stringify!(NVML_THERMAL_COOLER_SIGNAL_VARIABLE).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlCoolerControl_enum::NVML_THERMAL_COOLER_SIGNAL_COUNT => {\n                writer.write_all(stringify!(NVML_THERMAL_COOLER_SIGNAL_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlCoolerTarget_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlCoolerTarget_enum::NVML_THERMAL_COOLER_TARGET_NONE => {\n                writer.write_all(stringify!(NVML_THERMAL_COOLER_TARGET_NONE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlCoolerTarget_enum::NVML_THERMAL_COOLER_TARGET_GPU => {\n                writer.write_all(stringify!(NVML_THERMAL_COOLER_TARGET_GPU).as_bytes())\n            }\n            &cuda_types::nvml::nvmlCoolerTarget_enum::NVML_THERMAL_COOLER_TARGET_MEMORY => {\n                writer\n                    .write_all(stringify!(NVML_THERMAL_COOLER_TARGET_MEMORY).as_bytes())\n            }\n            &cuda_types::nvml::nvmlCoolerTarget_enum::NVML_THERMAL_COOLER_TARGET_POWER_SUPPLY => {\n                writer\n                    .write_all(\n                        stringify!(NVML_THERMAL_COOLER_TARGET_POWER_SUPPLY).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlCoolerTarget_enum::NVML_THERMAL_COOLER_TARGET_GPU_RELATED => {\n                writer\n                    .write_all(\n                        stringify!(NVML_THERMAL_COOLER_TARGET_GPU_RELATED).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlCoolerInfo_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(index), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.index, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(signalType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.signalType, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(target), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.target, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlUUIDType_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlUUIDType_t::NVML_UUID_TYPE_NONE => {\n                writer.write_all(stringify!(NVML_UUID_TYPE_NONE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlUUIDType_t::NVML_UUID_TYPE_ASCII => {\n                writer.write_all(stringify!(NVML_UUID_TYPE_ASCII).as_bytes())\n            }\n            &cuda_types::nvml::nvmlUUIDType_t::NVML_UUID_TYPE_BINARY => {\n                writer.write_all(stringify!(NVML_UUID_TYPE_BINARY).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlPdi_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(value), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.value, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlEnableState_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlEnableState_enum::NVML_FEATURE_DISABLED => {\n                writer.write_all(stringify!(NVML_FEATURE_DISABLED).as_bytes())\n            }\n            &cuda_types::nvml::nvmlEnableState_enum::NVML_FEATURE_ENABLED => {\n                writer.write_all(stringify!(NVML_FEATURE_ENABLED).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlDramEncryptionInfo_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(encryptionState), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.encryptionState, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlBrandType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlBrandType_enum::NVML_BRAND_UNKNOWN => {\n                writer.write_all(stringify!(NVML_BRAND_UNKNOWN).as_bytes())\n            }\n            &cuda_types::nvml::nvmlBrandType_enum::NVML_BRAND_QUADRO => {\n                writer.write_all(stringify!(NVML_BRAND_QUADRO).as_bytes())\n            }\n            &cuda_types::nvml::nvmlBrandType_enum::NVML_BRAND_TESLA => {\n                writer.write_all(stringify!(NVML_BRAND_TESLA).as_bytes())\n            }\n            &cuda_types::nvml::nvmlBrandType_enum::NVML_BRAND_NVS => {\n                writer.write_all(stringify!(NVML_BRAND_NVS).as_bytes())\n            }\n            &cuda_types::nvml::nvmlBrandType_enum::NVML_BRAND_GRID => {\n                writer.write_all(stringify!(NVML_BRAND_GRID).as_bytes())\n            }\n            &cuda_types::nvml::nvmlBrandType_enum::NVML_BRAND_GEFORCE => {\n                writer.write_all(stringify!(NVML_BRAND_GEFORCE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlBrandType_enum::NVML_BRAND_TITAN => {\n                writer.write_all(stringify!(NVML_BRAND_TITAN).as_bytes())\n            }\n            &cuda_types::nvml::nvmlBrandType_enum::NVML_BRAND_NVIDIA_VAPPS => {\n                writer.write_all(stringify!(NVML_BRAND_NVIDIA_VAPPS).as_bytes())\n            }\n            &cuda_types::nvml::nvmlBrandType_enum::NVML_BRAND_NVIDIA_VPC => {\n                writer.write_all(stringify!(NVML_BRAND_NVIDIA_VPC).as_bytes())\n            }\n            &cuda_types::nvml::nvmlBrandType_enum::NVML_BRAND_NVIDIA_VCS => {\n                writer.write_all(stringify!(NVML_BRAND_NVIDIA_VCS).as_bytes())\n            }\n            &cuda_types::nvml::nvmlBrandType_enum::NVML_BRAND_NVIDIA_VWS => {\n                writer.write_all(stringify!(NVML_BRAND_NVIDIA_VWS).as_bytes())\n            }\n            &cuda_types::nvml::nvmlBrandType_enum::NVML_BRAND_NVIDIA_CLOUD_GAMING => {\n                writer.write_all(stringify!(NVML_BRAND_NVIDIA_CLOUD_GAMING).as_bytes())\n            }\n            &cuda_types::nvml::nvmlBrandType_enum::NVML_BRAND_NVIDIA_VGAMING => {\n                writer.write_all(stringify!(NVML_BRAND_NVIDIA_VGAMING).as_bytes())\n            }\n            &cuda_types::nvml::nvmlBrandType_enum::NVML_BRAND_QUADRO_RTX => {\n                writer.write_all(stringify!(NVML_BRAND_QUADRO_RTX).as_bytes())\n            }\n            &cuda_types::nvml::nvmlBrandType_enum::NVML_BRAND_NVIDIA_RTX => {\n                writer.write_all(stringify!(NVML_BRAND_NVIDIA_RTX).as_bytes())\n            }\n            &cuda_types::nvml::nvmlBrandType_enum::NVML_BRAND_NVIDIA => {\n                writer.write_all(stringify!(NVML_BRAND_NVIDIA).as_bytes())\n            }\n            &cuda_types::nvml::nvmlBrandType_enum::NVML_BRAND_GEFORCE_RTX => {\n                writer.write_all(stringify!(NVML_BRAND_GEFORCE_RTX).as_bytes())\n            }\n            &cuda_types::nvml::nvmlBrandType_enum::NVML_BRAND_TITAN_RTX => {\n                writer.write_all(stringify!(NVML_BRAND_TITAN_RTX).as_bytes())\n            }\n            &cuda_types::nvml::nvmlBrandType_enum::NVML_BRAND_COUNT => {\n                writer.write_all(stringify!(NVML_BRAND_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlTemperatureThresholds_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlTemperatureThresholds_enum::NVML_TEMPERATURE_THRESHOLD_SHUTDOWN => {\n                writer\n                    .write_all(\n                        stringify!(NVML_TEMPERATURE_THRESHOLD_SHUTDOWN).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlTemperatureThresholds_enum::NVML_TEMPERATURE_THRESHOLD_SLOWDOWN => {\n                writer\n                    .write_all(\n                        stringify!(NVML_TEMPERATURE_THRESHOLD_SLOWDOWN).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlTemperatureThresholds_enum::NVML_TEMPERATURE_THRESHOLD_MEM_MAX => {\n                writer\n                    .write_all(stringify!(NVML_TEMPERATURE_THRESHOLD_MEM_MAX).as_bytes())\n            }\n            &cuda_types::nvml::nvmlTemperatureThresholds_enum::NVML_TEMPERATURE_THRESHOLD_GPU_MAX => {\n                writer\n                    .write_all(stringify!(NVML_TEMPERATURE_THRESHOLD_GPU_MAX).as_bytes())\n            }\n            &cuda_types::nvml::nvmlTemperatureThresholds_enum::NVML_TEMPERATURE_THRESHOLD_ACOUSTIC_MIN => {\n                writer\n                    .write_all(\n                        stringify!(NVML_TEMPERATURE_THRESHOLD_ACOUSTIC_MIN).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlTemperatureThresholds_enum::NVML_TEMPERATURE_THRESHOLD_ACOUSTIC_CURR => {\n                writer\n                    .write_all(\n                        stringify!(NVML_TEMPERATURE_THRESHOLD_ACOUSTIC_CURR).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlTemperatureThresholds_enum::NVML_TEMPERATURE_THRESHOLD_ACOUSTIC_MAX => {\n                writer\n                    .write_all(\n                        stringify!(NVML_TEMPERATURE_THRESHOLD_ACOUSTIC_MAX).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlTemperatureThresholds_enum::NVML_TEMPERATURE_THRESHOLD_GPS_CURR => {\n                writer\n                    .write_all(\n                        stringify!(NVML_TEMPERATURE_THRESHOLD_GPS_CURR).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlTemperatureThresholds_enum::NVML_TEMPERATURE_THRESHOLD_COUNT => {\n                writer.write_all(stringify!(NVML_TEMPERATURE_THRESHOLD_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlTemperatureSensors_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlTemperatureSensors_enum::NVML_TEMPERATURE_GPU => {\n                writer.write_all(stringify!(NVML_TEMPERATURE_GPU).as_bytes())\n            }\n            &cuda_types::nvml::nvmlTemperatureSensors_enum::NVML_TEMPERATURE_COUNT => {\n                writer.write_all(stringify!(NVML_TEMPERATURE_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlMarginTemperature_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(marginTemperature), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.marginTemperature, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlComputeMode_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlComputeMode_enum::NVML_COMPUTEMODE_DEFAULT => {\n                writer.write_all(stringify!(NVML_COMPUTEMODE_DEFAULT).as_bytes())\n            }\n            &cuda_types::nvml::nvmlComputeMode_enum::NVML_COMPUTEMODE_EXCLUSIVE_THREAD => {\n                writer\n                    .write_all(stringify!(NVML_COMPUTEMODE_EXCLUSIVE_THREAD).as_bytes())\n            }\n            &cuda_types::nvml::nvmlComputeMode_enum::NVML_COMPUTEMODE_PROHIBITED => {\n                writer.write_all(stringify!(NVML_COMPUTEMODE_PROHIBITED).as_bytes())\n            }\n            &cuda_types::nvml::nvmlComputeMode_enum::NVML_COMPUTEMODE_EXCLUSIVE_PROCESS => {\n                writer\n                    .write_all(stringify!(NVML_COMPUTEMODE_EXCLUSIVE_PROCESS).as_bytes())\n            }\n            &cuda_types::nvml::nvmlComputeMode_enum::NVML_COMPUTEMODE_COUNT => {\n                writer.write_all(stringify!(NVML_COMPUTEMODE_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlClkMonFaultInfo_struct {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(clkApiDomain), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.clkApiDomain, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(clkDomainFaultMask), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.clkDomainFaultMask, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlClkMonStatus_status {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(bGlobalStatus), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.bGlobalStatus, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(clkMonListSize), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.clkMonListSize, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(clkMonList), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.clkMonList, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlMemoryErrorType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlMemoryErrorType_enum::NVML_MEMORY_ERROR_TYPE_CORRECTED => {\n                writer.write_all(stringify!(NVML_MEMORY_ERROR_TYPE_CORRECTED).as_bytes())\n            }\n            &cuda_types::nvml::nvmlMemoryErrorType_enum::NVML_MEMORY_ERROR_TYPE_UNCORRECTED => {\n                writer\n                    .write_all(stringify!(NVML_MEMORY_ERROR_TYPE_UNCORRECTED).as_bytes())\n            }\n            &cuda_types::nvml::nvmlMemoryErrorType_enum::NVML_MEMORY_ERROR_TYPE_COUNT => {\n                writer.write_all(stringify!(NVML_MEMORY_ERROR_TYPE_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlNvlinkVersion_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlNvlinkVersion_enum::NVML_NVLINK_VERSION_INVALID => {\n                writer.write_all(stringify!(NVML_NVLINK_VERSION_INVALID).as_bytes())\n            }\n            &cuda_types::nvml::nvmlNvlinkVersion_enum::NVML_NVLINK_VERSION_1_0 => {\n                writer.write_all(stringify!(NVML_NVLINK_VERSION_1_0).as_bytes())\n            }\n            &cuda_types::nvml::nvmlNvlinkVersion_enum::NVML_NVLINK_VERSION_2_0 => {\n                writer.write_all(stringify!(NVML_NVLINK_VERSION_2_0).as_bytes())\n            }\n            &cuda_types::nvml::nvmlNvlinkVersion_enum::NVML_NVLINK_VERSION_2_2 => {\n                writer.write_all(stringify!(NVML_NVLINK_VERSION_2_2).as_bytes())\n            }\n            &cuda_types::nvml::nvmlNvlinkVersion_enum::NVML_NVLINK_VERSION_3_0 => {\n                writer.write_all(stringify!(NVML_NVLINK_VERSION_3_0).as_bytes())\n            }\n            &cuda_types::nvml::nvmlNvlinkVersion_enum::NVML_NVLINK_VERSION_3_1 => {\n                writer.write_all(stringify!(NVML_NVLINK_VERSION_3_1).as_bytes())\n            }\n            &cuda_types::nvml::nvmlNvlinkVersion_enum::NVML_NVLINK_VERSION_4_0 => {\n                writer.write_all(stringify!(NVML_NVLINK_VERSION_4_0).as_bytes())\n            }\n            &cuda_types::nvml::nvmlNvlinkVersion_enum::NVML_NVLINK_VERSION_5_0 => {\n                writer.write_all(stringify!(NVML_NVLINK_VERSION_5_0).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlEccCounterType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlEccCounterType_enum::NVML_VOLATILE_ECC => {\n                writer.write_all(stringify!(NVML_VOLATILE_ECC).as_bytes())\n            }\n            &cuda_types::nvml::nvmlEccCounterType_enum::NVML_AGGREGATE_ECC => {\n                writer.write_all(stringify!(NVML_AGGREGATE_ECC).as_bytes())\n            }\n            &cuda_types::nvml::nvmlEccCounterType_enum::NVML_ECC_COUNTER_TYPE_COUNT => {\n                writer.write_all(stringify!(NVML_ECC_COUNTER_TYPE_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlClockType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlClockType_enum::NVML_CLOCK_GRAPHICS => {\n                writer.write_all(stringify!(NVML_CLOCK_GRAPHICS).as_bytes())\n            }\n            &cuda_types::nvml::nvmlClockType_enum::NVML_CLOCK_SM => {\n                writer.write_all(stringify!(NVML_CLOCK_SM).as_bytes())\n            }\n            &cuda_types::nvml::nvmlClockType_enum::NVML_CLOCK_MEM => {\n                writer.write_all(stringify!(NVML_CLOCK_MEM).as_bytes())\n            }\n            &cuda_types::nvml::nvmlClockType_enum::NVML_CLOCK_VIDEO => {\n                writer.write_all(stringify!(NVML_CLOCK_VIDEO).as_bytes())\n            }\n            &cuda_types::nvml::nvmlClockType_enum::NVML_CLOCK_COUNT => {\n                writer.write_all(stringify!(NVML_CLOCK_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlClockId_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlClockId_enum::NVML_CLOCK_ID_CURRENT => {\n                writer.write_all(stringify!(NVML_CLOCK_ID_CURRENT).as_bytes())\n            }\n            &cuda_types::nvml::nvmlClockId_enum::NVML_CLOCK_ID_APP_CLOCK_TARGET => {\n                writer.write_all(stringify!(NVML_CLOCK_ID_APP_CLOCK_TARGET).as_bytes())\n            }\n            &cuda_types::nvml::nvmlClockId_enum::NVML_CLOCK_ID_APP_CLOCK_DEFAULT => {\n                writer.write_all(stringify!(NVML_CLOCK_ID_APP_CLOCK_DEFAULT).as_bytes())\n            }\n            &cuda_types::nvml::nvmlClockId_enum::NVML_CLOCK_ID_CUSTOMER_BOOST_MAX => {\n                writer.write_all(stringify!(NVML_CLOCK_ID_CUSTOMER_BOOST_MAX).as_bytes())\n            }\n            &cuda_types::nvml::nvmlClockId_enum::NVML_CLOCK_ID_COUNT => {\n                writer.write_all(stringify!(NVML_CLOCK_ID_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlDriverModel_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlDriverModel_enum::NVML_DRIVER_WDDM => {\n                writer.write_all(stringify!(NVML_DRIVER_WDDM).as_bytes())\n            }\n            &cuda_types::nvml::nvmlDriverModel_enum::NVML_DRIVER_WDM => {\n                writer.write_all(stringify!(NVML_DRIVER_WDM).as_bytes())\n            }\n            &cuda_types::nvml::nvmlDriverModel_enum::NVML_DRIVER_MCDM => {\n                writer.write_all(stringify!(NVML_DRIVER_MCDM).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlPStates_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlPStates_enum::NVML_PSTATE_0 => {\n                writer.write_all(stringify!(NVML_PSTATE_0).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPStates_enum::NVML_PSTATE_1 => {\n                writer.write_all(stringify!(NVML_PSTATE_1).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPStates_enum::NVML_PSTATE_2 => {\n                writer.write_all(stringify!(NVML_PSTATE_2).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPStates_enum::NVML_PSTATE_3 => {\n                writer.write_all(stringify!(NVML_PSTATE_3).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPStates_enum::NVML_PSTATE_4 => {\n                writer.write_all(stringify!(NVML_PSTATE_4).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPStates_enum::NVML_PSTATE_5 => {\n                writer.write_all(stringify!(NVML_PSTATE_5).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPStates_enum::NVML_PSTATE_6 => {\n                writer.write_all(stringify!(NVML_PSTATE_6).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPStates_enum::NVML_PSTATE_7 => {\n                writer.write_all(stringify!(NVML_PSTATE_7).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPStates_enum::NVML_PSTATE_8 => {\n                writer.write_all(stringify!(NVML_PSTATE_8).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPStates_enum::NVML_PSTATE_9 => {\n                writer.write_all(stringify!(NVML_PSTATE_9).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPStates_enum::NVML_PSTATE_10 => {\n                writer.write_all(stringify!(NVML_PSTATE_10).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPStates_enum::NVML_PSTATE_11 => {\n                writer.write_all(stringify!(NVML_PSTATE_11).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPStates_enum::NVML_PSTATE_12 => {\n                writer.write_all(stringify!(NVML_PSTATE_12).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPStates_enum::NVML_PSTATE_13 => {\n                writer.write_all(stringify!(NVML_PSTATE_13).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPStates_enum::NVML_PSTATE_14 => {\n                writer.write_all(stringify!(NVML_PSTATE_14).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPStates_enum::NVML_PSTATE_15 => {\n                writer.write_all(stringify!(NVML_PSTATE_15).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPStates_enum::NVML_PSTATE_UNKNOWN => {\n                writer.write_all(stringify!(NVML_PSTATE_UNKNOWN).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlClockOffset_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(type_), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.type_, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(pstate), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.pstate, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(clockOffsetMHz), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.clockOffsetMHz, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(minClockOffsetMHz), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.minClockOffsetMHz, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(maxClockOffsetMHz), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.maxClockOffsetMHz, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlFanSpeedInfo_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(fan), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.fan, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(speed), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.speed, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlDevicePerfModes_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(str_), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.str_, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlDeviceCurrentClockFreqs_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(str_), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.str_, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlDevicePowerMizerModes_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(currentMode), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.currentMode, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(mode), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.mode, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(supportedPowerMizerModes), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.supportedPowerMizerModes, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlGom_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlGom_enum::NVML_GOM_ALL_ON => {\n                writer.write_all(stringify!(NVML_GOM_ALL_ON).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGom_enum::NVML_GOM_COMPUTE => {\n                writer.write_all(stringify!(NVML_GOM_COMPUTE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGom_enum::NVML_GOM_LOW_DP => {\n                writer.write_all(stringify!(NVML_GOM_LOW_DP).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlInforomObject_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlInforomObject_enum::NVML_INFOROM_OEM => {\n                writer.write_all(stringify!(NVML_INFOROM_OEM).as_bytes())\n            }\n            &cuda_types::nvml::nvmlInforomObject_enum::NVML_INFOROM_ECC => {\n                writer.write_all(stringify!(NVML_INFOROM_ECC).as_bytes())\n            }\n            &cuda_types::nvml::nvmlInforomObject_enum::NVML_INFOROM_POWER => {\n                writer.write_all(stringify!(NVML_INFOROM_POWER).as_bytes())\n            }\n            &cuda_types::nvml::nvmlInforomObject_enum::NVML_INFOROM_DEN => {\n                writer.write_all(stringify!(NVML_INFOROM_DEN).as_bytes())\n            }\n            &cuda_types::nvml::nvmlInforomObject_enum::NVML_INFOROM_COUNT => {\n                writer.write_all(stringify!(NVML_INFOROM_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlMemoryLocation_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlMemoryLocation_enum::NVML_MEMORY_LOCATION_L1_CACHE => {\n                writer.write_all(stringify!(NVML_MEMORY_LOCATION_L1_CACHE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlMemoryLocation_enum::NVML_MEMORY_LOCATION_L2_CACHE => {\n                writer.write_all(stringify!(NVML_MEMORY_LOCATION_L2_CACHE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlMemoryLocation_enum::NVML_MEMORY_LOCATION_DRAM => {\n                writer.write_all(stringify!(NVML_MEMORY_LOCATION_DRAM).as_bytes())\n            }\n            &cuda_types::nvml::nvmlMemoryLocation_enum::NVML_MEMORY_LOCATION_DEVICE_MEMORY => {\n                writer\n                    .write_all(stringify!(NVML_MEMORY_LOCATION_DEVICE_MEMORY).as_bytes())\n            }\n            &cuda_types::nvml::nvmlMemoryLocation_enum::NVML_MEMORY_LOCATION_REGISTER_FILE => {\n                writer\n                    .write_all(stringify!(NVML_MEMORY_LOCATION_REGISTER_FILE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlMemoryLocation_enum::NVML_MEMORY_LOCATION_TEXTURE_MEMORY => {\n                writer\n                    .write_all(\n                        stringify!(NVML_MEMORY_LOCATION_TEXTURE_MEMORY).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlMemoryLocation_enum::NVML_MEMORY_LOCATION_TEXTURE_SHM => {\n                writer.write_all(stringify!(NVML_MEMORY_LOCATION_TEXTURE_SHM).as_bytes())\n            }\n            &cuda_types::nvml::nvmlMemoryLocation_enum::NVML_MEMORY_LOCATION_CBU => {\n                writer.write_all(stringify!(NVML_MEMORY_LOCATION_CBU).as_bytes())\n            }\n            &cuda_types::nvml::nvmlMemoryLocation_enum::NVML_MEMORY_LOCATION_SRAM => {\n                writer.write_all(stringify!(NVML_MEMORY_LOCATION_SRAM).as_bytes())\n            }\n            &cuda_types::nvml::nvmlMemoryLocation_enum::NVML_MEMORY_LOCATION_COUNT => {\n                writer.write_all(stringify!(NVML_MEMORY_LOCATION_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlPageRetirementCause_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlPageRetirementCause_enum::NVML_PAGE_RETIREMENT_CAUSE_MULTIPLE_SINGLE_BIT_ECC_ERRORS => {\n                writer\n                    .write_all(\n                        stringify!(\n                            NVML_PAGE_RETIREMENT_CAUSE_MULTIPLE_SINGLE_BIT_ECC_ERRORS\n                        )\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlPageRetirementCause_enum::NVML_PAGE_RETIREMENT_CAUSE_DOUBLE_BIT_ECC_ERROR => {\n                writer\n                    .write_all(\n                        stringify!(NVML_PAGE_RETIREMENT_CAUSE_DOUBLE_BIT_ECC_ERROR)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlPageRetirementCause_enum::NVML_PAGE_RETIREMENT_CAUSE_COUNT => {\n                writer.write_all(stringify!(NVML_PAGE_RETIREMENT_CAUSE_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlRestrictedAPI_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlRestrictedAPI_enum::NVML_RESTRICTED_API_SET_APPLICATION_CLOCKS => {\n                writer\n                    .write_all(\n                        stringify!(NVML_RESTRICTED_API_SET_APPLICATION_CLOCKS).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlRestrictedAPI_enum::NVML_RESTRICTED_API_SET_AUTO_BOOSTED_CLOCKS => {\n                writer\n                    .write_all(\n                        stringify!(NVML_RESTRICTED_API_SET_AUTO_BOOSTED_CLOCKS)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlRestrictedAPI_enum::NVML_RESTRICTED_API_COUNT => {\n                writer.write_all(stringify!(NVML_RESTRICTED_API_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlProcessUtilizationSample_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(pid), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.pid, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(timeStamp), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.timeStamp, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(smUtil), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.smUtil, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(memUtil), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.memUtil, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(encUtil), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.encUtil, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(decUtil), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.decUtil, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlProcessUtilizationInfo_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(timeStamp), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.timeStamp, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(pid), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.pid, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(smUtil), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.smUtil, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(memUtil), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.memUtil, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(encUtil), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.encUtil, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(decUtil), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.decUtil, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(jpgUtil), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.jpgUtil, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(ofaUtil), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.ofaUtil, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlProcessesUtilizationInfo_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(processSamplesCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.processSamplesCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(lastSeenTimeStamp), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.lastSeenTimeStamp, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(procUtilArray), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.procUtilArray, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlEccSramErrorStatus_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(aggregateUncParity), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.aggregateUncParity, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(aggregateUncSecDed), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.aggregateUncSecDed, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(aggregateCor), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.aggregateCor, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(volatileUncParity), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.volatileUncParity, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(volatileUncSecDed), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.volatileUncSecDed, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(volatileCor), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.volatileCor, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(aggregateUncBucketL2), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.aggregateUncBucketL2, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(aggregateUncBucketSm), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.aggregateUncBucketSm, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(aggregateUncBucketPcie), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.aggregateUncBucketPcie, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(aggregateUncBucketMcu), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.aggregateUncBucketMcu, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(aggregateUncBucketOther), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.aggregateUncBucketOther, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(bThresholdExceeded), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.bThresholdExceeded, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlPlatformInfo_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(ibGuid), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.ibGuid, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(rackGuid), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.rackGuid, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(chassisPhysicalSlotNumber), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.chassisPhysicalSlotNumber, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(computeSlotIndex), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.computeSlotIndex, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(nodeIndex), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.nodeIndex, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(peerType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.peerType, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(moduleId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.moduleId, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlPlatformInfo_v2_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(ibGuid), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.ibGuid, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(chassisSerialNumber), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.chassisSerialNumber, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(slotNumber), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.slotNumber, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(trayIndex), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.trayIndex, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(hostId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.hostId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(peerType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.peerType, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(moduleId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.moduleId, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlHostname_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(value), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.value, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::nvml::nvmlEccSramUniqueUncorrectedErrorEntry_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(unit), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.unit, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(location), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.location, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sublocation), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sublocation, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(extlocation), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.extlocation, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(address), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.address, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(isParity), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.isParity, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(count), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.count, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::nvml::nvmlEccSramUniqueUncorrectedErrorCounts_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(entryCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.entryCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(entries), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.entries, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlGpuUtilizationDomainId_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlGpuUtilizationDomainId_t::NVML_GPU_UTILIZATION_DOMAIN_GPU => {\n                writer.write_all(stringify!(NVML_GPU_UTILIZATION_DOMAIN_GPU).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpuUtilizationDomainId_t::NVML_GPU_UTILIZATION_DOMAIN_FB => {\n                writer.write_all(stringify!(NVML_GPU_UTILIZATION_DOMAIN_FB).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpuUtilizationDomainId_t::NVML_GPU_UTILIZATION_DOMAIN_VID => {\n                writer.write_all(stringify!(NVML_GPU_UTILIZATION_DOMAIN_VID).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpuUtilizationDomainId_t::NVML_GPU_UTILIZATION_DOMAIN_BUS => {\n                writer.write_all(stringify!(NVML_GPU_UTILIZATION_DOMAIN_BUS).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlGpuDynamicPstatesInfo_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(flags), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.flags, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(utilization), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.utilization, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::nvml::nvmlGpuDynamicPstatesInfo_st__bindgen_ty_1 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(bIsPresent), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.bIsPresent, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(percentage), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.percentage, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(incThreshold), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.incThreshold, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(decThreshold), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.decThreshold, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlPowerValue_v2_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(powerScope), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.powerScope, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(powerValueMw), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.powerValueMw, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlGpuVirtualizationMode {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlGpuVirtualizationMode::NVML_GPU_VIRTUALIZATION_MODE_NONE => {\n                writer\n                    .write_all(stringify!(NVML_GPU_VIRTUALIZATION_MODE_NONE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpuVirtualizationMode::NVML_GPU_VIRTUALIZATION_MODE_PASSTHROUGH => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPU_VIRTUALIZATION_MODE_PASSTHROUGH).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpuVirtualizationMode::NVML_GPU_VIRTUALIZATION_MODE_VGPU => {\n                writer\n                    .write_all(stringify!(NVML_GPU_VIRTUALIZATION_MODE_VGPU).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpuVirtualizationMode::NVML_GPU_VIRTUALIZATION_MODE_HOST_VGPU => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPU_VIRTUALIZATION_MODE_HOST_VGPU).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpuVirtualizationMode::NVML_GPU_VIRTUALIZATION_MODE_HOST_VSGA => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPU_VIRTUALIZATION_MODE_HOST_VSGA).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlHostVgpuMode_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlHostVgpuMode_enum::NVML_HOST_VGPU_MODE_NON_SRIOV => {\n                writer.write_all(stringify!(NVML_HOST_VGPU_MODE_NON_SRIOV).as_bytes())\n            }\n            &cuda_types::nvml::nvmlHostVgpuMode_enum::NVML_HOST_VGPU_MODE_SRIOV => {\n                writer.write_all(stringify!(NVML_HOST_VGPU_MODE_SRIOV).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuVmIdType {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlVgpuVmIdType::NVML_VGPU_VM_ID_DOMAIN_ID => {\n                writer.write_all(stringify!(NVML_VGPU_VM_ID_DOMAIN_ID).as_bytes())\n            }\n            &cuda_types::nvml::nvmlVgpuVmIdType::NVML_VGPU_VM_ID_UUID => {\n                writer.write_all(stringify!(NVML_VGPU_VM_ID_UUID).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuGuestInfoState_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlVgpuGuestInfoState_enum::NVML_VGPU_INSTANCE_GUEST_INFO_STATE_UNINITIALIZED => {\n                writer\n                    .write_all(\n                        stringify!(NVML_VGPU_INSTANCE_GUEST_INFO_STATE_UNINITIALIZED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlVgpuGuestInfoState_enum::NVML_VGPU_INSTANCE_GUEST_INFO_STATE_INITIALIZED => {\n                writer\n                    .write_all(\n                        stringify!(NVML_VGPU_INSTANCE_GUEST_INFO_STATE_INITIALIZED)\n                            .as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlGridLicenseFeatureCode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlGridLicenseFeatureCode_t::NVML_GRID_LICENSE_FEATURE_CODE_UNKNOWN => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GRID_LICENSE_FEATURE_CODE_UNKNOWN).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGridLicenseFeatureCode_t::NVML_GRID_LICENSE_FEATURE_CODE_VGPU => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GRID_LICENSE_FEATURE_CODE_VGPU).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGridLicenseFeatureCode_t::NVML_GRID_LICENSE_FEATURE_CODE_NVIDIA_RTX => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GRID_LICENSE_FEATURE_CODE_NVIDIA_RTX).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGridLicenseFeatureCode_t::NVML_GRID_LICENSE_FEATURE_CODE_VWORKSTATION => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GRID_LICENSE_FEATURE_CODE_VWORKSTATION)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGridLicenseFeatureCode_t::NVML_GRID_LICENSE_FEATURE_CODE_GAMING => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GRID_LICENSE_FEATURE_CODE_GAMING).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGridLicenseFeatureCode_t::NVML_GRID_LICENSE_FEATURE_CODE_COMPUTE => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GRID_LICENSE_FEATURE_CODE_COMPUTE).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuCapability_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlVgpuCapability_enum::NVML_VGPU_CAP_NVLINK_P2P => {\n                writer.write_all(stringify!(NVML_VGPU_CAP_NVLINK_P2P).as_bytes())\n            }\n            &cuda_types::nvml::nvmlVgpuCapability_enum::NVML_VGPU_CAP_GPUDIRECT => {\n                writer.write_all(stringify!(NVML_VGPU_CAP_GPUDIRECT).as_bytes())\n            }\n            &cuda_types::nvml::nvmlVgpuCapability_enum::NVML_VGPU_CAP_MULTI_VGPU_EXCLUSIVE => {\n                writer\n                    .write_all(stringify!(NVML_VGPU_CAP_MULTI_VGPU_EXCLUSIVE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlVgpuCapability_enum::NVML_VGPU_CAP_EXCLUSIVE_TYPE => {\n                writer.write_all(stringify!(NVML_VGPU_CAP_EXCLUSIVE_TYPE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlVgpuCapability_enum::NVML_VGPU_CAP_EXCLUSIVE_SIZE => {\n                writer.write_all(stringify!(NVML_VGPU_CAP_EXCLUSIVE_SIZE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlVgpuCapability_enum::NVML_VGPU_CAP_COUNT => {\n                writer.write_all(stringify!(NVML_VGPU_CAP_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuDriverCapability_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlVgpuDriverCapability_enum::NVML_VGPU_DRIVER_CAP_HETEROGENEOUS_MULTI_VGPU => {\n                writer\n                    .write_all(\n                        stringify!(NVML_VGPU_DRIVER_CAP_HETEROGENEOUS_MULTI_VGPU)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlVgpuDriverCapability_enum::NVML_VGPU_DRIVER_CAP_WARM_UPDATE => {\n                writer.write_all(stringify!(NVML_VGPU_DRIVER_CAP_WARM_UPDATE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlVgpuDriverCapability_enum::NVML_VGPU_DRIVER_CAP_COUNT => {\n                writer.write_all(stringify!(NVML_VGPU_DRIVER_CAP_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlDeviceVgpuCapability_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlDeviceVgpuCapability_enum::NVML_DEVICE_VGPU_CAP_FRACTIONAL_MULTI_VGPU => {\n                writer\n                    .write_all(\n                        stringify!(NVML_DEVICE_VGPU_CAP_FRACTIONAL_MULTI_VGPU).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlDeviceVgpuCapability_enum::NVML_DEVICE_VGPU_CAP_HETEROGENEOUS_TIMESLICE_PROFILES => {\n                writer\n                    .write_all(\n                        stringify!(NVML_DEVICE_VGPU_CAP_HETEROGENEOUS_TIMESLICE_PROFILES)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlDeviceVgpuCapability_enum::NVML_DEVICE_VGPU_CAP_HETEROGENEOUS_TIMESLICE_SIZES => {\n                writer\n                    .write_all(\n                        stringify!(NVML_DEVICE_VGPU_CAP_HETEROGENEOUS_TIMESLICE_SIZES)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlDeviceVgpuCapability_enum::NVML_DEVICE_VGPU_CAP_READ_DEVICE_BUFFER_BW => {\n                writer\n                    .write_all(\n                        stringify!(NVML_DEVICE_VGPU_CAP_READ_DEVICE_BUFFER_BW).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlDeviceVgpuCapability_enum::NVML_DEVICE_VGPU_CAP_WRITE_DEVICE_BUFFER_BW => {\n                writer\n                    .write_all(\n                        stringify!(NVML_DEVICE_VGPU_CAP_WRITE_DEVICE_BUFFER_BW)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlDeviceVgpuCapability_enum::NVML_DEVICE_VGPU_CAP_DEVICE_STREAMING => {\n                writer\n                    .write_all(\n                        stringify!(NVML_DEVICE_VGPU_CAP_DEVICE_STREAMING).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlDeviceVgpuCapability_enum::NVML_DEVICE_VGPU_CAP_MINI_QUARTER_GPU => {\n                writer\n                    .write_all(\n                        stringify!(NVML_DEVICE_VGPU_CAP_MINI_QUARTER_GPU).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlDeviceVgpuCapability_enum::NVML_DEVICE_VGPU_CAP_COMPUTE_MEDIA_ENGINE_GPU => {\n                writer\n                    .write_all(\n                        stringify!(NVML_DEVICE_VGPU_CAP_COMPUTE_MEDIA_ENGINE_GPU)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlDeviceVgpuCapability_enum::NVML_DEVICE_VGPU_CAP_WARM_UPDATE => {\n                writer.write_all(stringify!(NVML_DEVICE_VGPU_CAP_WARM_UPDATE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlDeviceVgpuCapability_enum::NVML_DEVICE_VGPU_CAP_HOMOGENEOUS_PLACEMENTS => {\n                writer\n                    .write_all(\n                        stringify!(NVML_DEVICE_VGPU_CAP_HOMOGENEOUS_PLACEMENTS)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlDeviceVgpuCapability_enum::NVML_DEVICE_VGPU_CAP_MIG_TIMESLICING_SUPPORTED => {\n                writer\n                    .write_all(\n                        stringify!(NVML_DEVICE_VGPU_CAP_MIG_TIMESLICING_SUPPORTED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlDeviceVgpuCapability_enum::NVML_DEVICE_VGPU_CAP_MIG_TIMESLICING_ENABLED => {\n                writer\n                    .write_all(\n                        stringify!(NVML_DEVICE_VGPU_CAP_MIG_TIMESLICING_ENABLED)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlDeviceVgpuCapability_enum::NVML_DEVICE_VGPU_CAP_COUNT => {\n                writer.write_all(stringify!(NVML_DEVICE_VGPU_CAP_COUNT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuHeterogeneousMode_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(mode), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.mode, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuPlacementId_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(placementId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.placementId, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuPlacementList_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(placementSize), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.placementSize, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(count), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.count, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(placementIds), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.placementIds, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuPlacementList_v2_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(placementSize), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.placementSize, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(count), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.count, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(placementIds), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.placementIds, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(mode), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.mode, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuTypeBar1Info_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(bar1Size), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.bar1Size, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuInstancesUtilizationInfo_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sampleValType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sampleValType, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(vgpuInstanceCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.vgpuInstanceCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(lastSeenTimeStamp), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.lastSeenTimeStamp, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(vgpuUtilArray), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.vgpuUtilArray, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuProcessUtilizationSample_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(vgpuInstance), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.vgpuInstance, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(pid), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.pid, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(processName), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.processName, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(timeStamp), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.timeStamp, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(smUtil), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.smUtil, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(memUtil), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.memUtil, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(encUtil), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.encUtil, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(decUtil), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.decUtil, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuProcessUtilizationInfo_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(processName), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.processName, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(timeStamp), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.timeStamp, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(vgpuInstance), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.vgpuInstance, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(pid), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.pid, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(smUtil), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.smUtil, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(memUtil), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.memUtil, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(encUtil), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.encUtil, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(decUtil), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.decUtil, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(jpgUtil), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.jpgUtil, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(ofaUtil), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.ofaUtil, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuProcessesUtilizationInfo_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(vgpuProcessCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.vgpuProcessCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(lastSeenTimeStamp), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.lastSeenTimeStamp, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(vgpuProcUtilArray), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.vgpuProcUtilArray, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuRuntimeState_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(size), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.size, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuSchedulerParams_t__bindgen_ty_1 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(avgFactor), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.avgFactor, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(timeslice), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.timeslice, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuSchedulerParams_t__bindgen_ty_2 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(timeslice), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.timeslice, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuSchedulerLogEntries_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(timestamp), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.timestamp, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(timeRunTotal), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.timeRunTotal, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(timeRun), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.timeRun, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(swRunlistId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.swRunlistId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(targetTimeSlice), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.targetTimeSlice, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(cumulativePreemptionTime), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.cumulativePreemptionTime, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::nvml::nvmlVgpuSchedulerSetParams_t__bindgen_ty_1 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(avgFactor), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.avgFactor, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(frequency), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.frequency, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::nvml::nvmlVgpuSchedulerSetParams_t__bindgen_ty_2 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(timeslice), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.timeslice, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuSchedulerCapabilities_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer\n            .write_all(concat!(\"{ \", stringify!(supportedSchedulers), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.supportedSchedulers, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(maxTimeslice), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.maxTimeslice, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(minTimeslice), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.minTimeslice, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(isArrModeSupported), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.isArrModeSupported, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(maxFrequencyForARR), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.maxFrequencyForARR, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(minFrequencyForARR), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.minFrequencyForARR, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(maxAvgFactorForARR), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.maxAvgFactorForARR, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(minAvgFactorForARR), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.minAvgFactorForARR, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuLicenseExpiry_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(year), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.year, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(month), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.month, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(day), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.day, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(hour), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.hour, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(min), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.min, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sec), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sec, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(status), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.status, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuLicenseInfo_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(isLicensed), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.isLicensed, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(licenseExpiry), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.licenseExpiry, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(currentState), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.currentState, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlGridLicenseExpiry_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(year), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.year, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(month), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.month, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(day), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.day, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(hour), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.hour, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(min), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.min, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sec), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sec, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(status), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.status, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlGridLicensableFeature_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(featureCode), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.featureCode, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(featureState), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.featureState, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(licenseInfo), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.licenseInfo, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(productName), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.productName, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(featureEnabled), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.featureEnabled, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(licenseExpiry), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.licenseExpiry, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlGridLicensableFeatures_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer\n            .write_all(\n                concat!(\"{ \", stringify!(isGridLicenseSupported), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.isGridLicenseSupported, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(licensableFeaturesCount), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.licensableFeaturesCount, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(gridLicensableFeatures), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.gridLicensableFeatures, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlDeviceGpuRecoveryAction_s {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlDeviceGpuRecoveryAction_s::NVML_GPU_RECOVERY_ACTION_NONE => {\n                writer.write_all(stringify!(NVML_GPU_RECOVERY_ACTION_NONE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlDeviceGpuRecoveryAction_s::NVML_GPU_RECOVERY_ACTION_GPU_RESET => {\n                writer\n                    .write_all(stringify!(NVML_GPU_RECOVERY_ACTION_GPU_RESET).as_bytes())\n            }\n            &cuda_types::nvml::nvmlDeviceGpuRecoveryAction_s::NVML_GPU_RECOVERY_ACTION_NODE_REBOOT => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPU_RECOVERY_ACTION_NODE_REBOOT).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlDeviceGpuRecoveryAction_s::NVML_GPU_RECOVERY_ACTION_DRAIN_P2P => {\n                writer\n                    .write_all(stringify!(NVML_GPU_RECOVERY_ACTION_DRAIN_P2P).as_bytes())\n            }\n            &cuda_types::nvml::nvmlDeviceGpuRecoveryAction_s::NVML_GPU_RECOVERY_ACTION_DRAIN_AND_RESET => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPU_RECOVERY_ACTION_DRAIN_AND_RESET).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuTypeIdInfo_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(vgpuCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.vgpuCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(vgpuTypeIds), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.vgpuTypeIds, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuTypeMaxInstance_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(vgpuTypeId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.vgpuTypeId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(maxInstancePerGI), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.maxInstancePerGI, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlActiveVgpuInstanceInfo_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(vgpuCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.vgpuCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(vgpuInstances), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.vgpuInstances, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuCreatablePlacementInfo_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(vgpuTypeId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.vgpuTypeId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(count), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.count, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(placementIds), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.placementIds, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(placementSize), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.placementSize, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlNvLinkPowerThres_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(lowPwrThreshold), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.lowPwrThreshold, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlUnit_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlHwbcEntry_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(hwbcId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.hwbcId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(firmwareVersion), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.firmwareVersion, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlFanState_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlFanState_enum::NVML_FAN_NORMAL => {\n                writer.write_all(stringify!(NVML_FAN_NORMAL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlFanState_enum::NVML_FAN_FAILED => {\n                writer.write_all(stringify!(NVML_FAN_FAILED).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlLedColor_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlLedColor_enum::NVML_LED_COLOR_GREEN => {\n                writer.write_all(stringify!(NVML_LED_COLOR_GREEN).as_bytes())\n            }\n            &cuda_types::nvml::nvmlLedColor_enum::NVML_LED_COLOR_AMBER => {\n                writer.write_all(stringify!(NVML_LED_COLOR_AMBER).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlLedState_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(cause), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.cause, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(color), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.color, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlUnitInfo_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(name), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.name, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(id), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.id, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(serial), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.serial, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(firmwareVersion), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.firmwareVersion, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlPSUInfo_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(state), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.state, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(current), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.current, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(voltage), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.voltage, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(power), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.power, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlUnitFanInfo_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(speed), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.speed, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(state), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.state, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlUnitFanSpeeds_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(fans), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.fans, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(count), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.count, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlEventSet_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlEventData_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(device), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.device, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(eventType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.eventType, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(eventData), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.eventData, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(gpuInstanceId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.gpuInstanceId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(computeInstanceId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.computeInstanceId, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlSystemEventSet_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlSystemEventSetCreateRequest_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(set), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.set, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlSystemEventSetFreeRequest_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(set), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.set, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlSystemRegisterEventRequest_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(eventTypes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.eventTypes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(set), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.set, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlSystemEventData_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(eventType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.eventType, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(gpuId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.gpuId, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlSystemEventSetWaitRequest_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(timeoutms), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.timeoutms, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(set), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.set, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(data), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.data, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(dataSize), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dataSize, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(numEvent), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.numEvent, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlAccountingStats_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(gpuUtilization), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.gpuUtilization, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(memoryUtilization), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.memoryUtilization, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(maxMemoryUsage), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.maxMemoryUsage, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(time), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.time, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(startTime), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.startTime, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(isRunning), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.isRunning, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlEncoderQueryType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlEncoderQueryType_enum::NVML_ENCODER_QUERY_H264 => {\n                writer.write_all(stringify!(NVML_ENCODER_QUERY_H264).as_bytes())\n            }\n            &cuda_types::nvml::nvmlEncoderQueryType_enum::NVML_ENCODER_QUERY_HEVC => {\n                writer.write_all(stringify!(NVML_ENCODER_QUERY_HEVC).as_bytes())\n            }\n            &cuda_types::nvml::nvmlEncoderQueryType_enum::NVML_ENCODER_QUERY_AV1 => {\n                writer.write_all(stringify!(NVML_ENCODER_QUERY_AV1).as_bytes())\n            }\n            &cuda_types::nvml::nvmlEncoderQueryType_enum::NVML_ENCODER_QUERY_UNKNOWN => {\n                writer.write_all(stringify!(NVML_ENCODER_QUERY_UNKNOWN).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlEncoderSessionInfo_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(sessionId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sessionId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(pid), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.pid, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(vgpuInstance), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.vgpuInstance, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(codecType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.codecType, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(hResolution), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.hResolution, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(vResolution), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.vResolution, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(averageFps), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.averageFps, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(averageLatency), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.averageLatency, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlFBCSessionType_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlFBCSessionType_enum::NVML_FBC_SESSION_TYPE_UNKNOWN => {\n                writer.write_all(stringify!(NVML_FBC_SESSION_TYPE_UNKNOWN).as_bytes())\n            }\n            &cuda_types::nvml::nvmlFBCSessionType_enum::NVML_FBC_SESSION_TYPE_TOSYS => {\n                writer.write_all(stringify!(NVML_FBC_SESSION_TYPE_TOSYS).as_bytes())\n            }\n            &cuda_types::nvml::nvmlFBCSessionType_enum::NVML_FBC_SESSION_TYPE_CUDA => {\n                writer.write_all(stringify!(NVML_FBC_SESSION_TYPE_CUDA).as_bytes())\n            }\n            &cuda_types::nvml::nvmlFBCSessionType_enum::NVML_FBC_SESSION_TYPE_VID => {\n                writer.write_all(stringify!(NVML_FBC_SESSION_TYPE_VID).as_bytes())\n            }\n            &cuda_types::nvml::nvmlFBCSessionType_enum::NVML_FBC_SESSION_TYPE_HWENC => {\n                writer.write_all(stringify!(NVML_FBC_SESSION_TYPE_HWENC).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlFBCStats_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(sessionsCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sessionsCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(averageFPS), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.averageFPS, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(averageLatency), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.averageLatency, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlFBCSessionInfo_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(sessionId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sessionId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(pid), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.pid, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(vgpuInstance), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.vgpuInstance, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(displayOrdinal), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.displayOrdinal, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sessionType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sessionType, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sessionFlags), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sessionFlags, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(hMaxResolution), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.hMaxResolution, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(vMaxResolution), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.vMaxResolution, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(hResolution), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.hResolution, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(vResolution), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.vResolution, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(averageFPS), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.averageFPS, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(averageLatency), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.averageLatency, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlDetachGpuState_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlDetachGpuState_enum::NVML_DETACH_GPU_KEEP => {\n                writer.write_all(stringify!(NVML_DETACH_GPU_KEEP).as_bytes())\n            }\n            &cuda_types::nvml::nvmlDetachGpuState_enum::NVML_DETACH_GPU_REMOVE => {\n                writer.write_all(stringify!(NVML_DETACH_GPU_REMOVE).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlPcieLinkState_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlPcieLinkState_enum::NVML_PCIE_LINK_KEEP => {\n                writer.write_all(stringify!(NVML_PCIE_LINK_KEEP).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPcieLinkState_enum::NVML_PCIE_LINK_SHUT_DOWN => {\n                writer.write_all(stringify!(NVML_PCIE_LINK_SHUT_DOWN).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlConfComputeSystemCaps_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(cpuCaps), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.cpuCaps, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(gpusCaps), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.gpusCaps, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlConfComputeSystemState_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(environment), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.environment, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(ccFeature), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.ccFeature, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(devToolsMode), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.devToolsMode, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlSystemConfComputeSettings_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(environment), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.environment, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(ccFeature), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.ccFeature, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(devToolsMode), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.devToolsMode, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(multiGpuMode), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.multiGpuMode, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlConfComputeMemSizeInfo_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer\n            .write_all(concat!(\"{ \", stringify!(protectedMemSizeKib), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.protectedMemSizeKib, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(unprotectedMemSizeKib), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.unprotectedMemSizeKib, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlConfComputeGpuCertificate_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(certChainSize), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.certChainSize, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(attestationCertChainSize), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.attestationCertChainSize, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(certChain), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.certChain, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(attestationCertChain), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.attestationCertChain, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlConfComputeGpuAttestationReport_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer\n            .write_all(\n                concat!(\"{ \", stringify!(isCecAttestationReportPresent), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.isCecAttestationReportPresent, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(attestationReportSize), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.attestationReportSize, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(cecAttestationReportSize), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.cecAttestationReportSize, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(nonce), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.nonce, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(attestationReport), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.attestationReport, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(cecAttestationReport), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.cecAttestationReport, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::nvml::nvmlConfComputeSetKeyRotationThresholdInfo_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(maxAttackerAdvantage), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.maxAttackerAdvantage, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::nvml::nvmlConfComputeGetKeyRotationThresholdInfo_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(attackerAdvantage), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.attackerAdvantage, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlGpuFabricInfo_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(clusterUuid), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.clusterUuid, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(status), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.status, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(cliqueId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.cliqueId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(state), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.state, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlGpuFabricInfo_v2_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(clusterUuid), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.clusterUuid, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(status), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.status, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(cliqueId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.cliqueId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(state), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.state, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(healthMask), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.healthMask, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlGpuFabricInfo_v3_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(clusterUuid), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.clusterUuid, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(status), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.status, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(cliqueId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.cliqueId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(state), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.state, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(healthMask), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.healthMask, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(healthSummary), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.healthSummary, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\npub fn write_nvmlInit_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_nvmlInitWithFlags(\n    writer: &mut (impl std::io::Write + ?Sized),\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"nvmlInitWithFlags\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlShutdown(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_nvmlErrorString(\n    writer: &mut (impl std::io::Write + ?Sized),\n    result: cuda_types::nvml::nvmlReturn_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"nvmlErrorString\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlSystemGetDriverVersion(\n    writer: &mut (impl std::io::Write + ?Sized),\n    version: *mut ::core::ffi::c_char,\n    length: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(version), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&version, \"nvmlSystemGetDriverVersion\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(length), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&length, \"nvmlSystemGetDriverVersion\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlSystemGetNVMLVersion(\n    writer: &mut (impl std::io::Write + ?Sized),\n    version: *mut ::core::ffi::c_char,\n    length: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(version), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&version, \"nvmlSystemGetNVMLVersion\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(length), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&length, \"nvmlSystemGetNVMLVersion\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlSystemGetCudaDriverVersion(\n    writer: &mut (impl std::io::Write + ?Sized),\n    cudaDriverVersion: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(cudaDriverVersion), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cudaDriverVersion,\n        \"nvmlSystemGetCudaDriverVersion\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlSystemGetCudaDriverVersion_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    cudaDriverVersion: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(cudaDriverVersion), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cudaDriverVersion,\n        \"nvmlSystemGetCudaDriverVersion_v2\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlSystemGetProcessName(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pid: ::core::ffi::c_uint,\n    name: *mut ::core::ffi::c_char,\n    length: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pid, \"nvmlSystemGetProcessName\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(name), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&name, \"nvmlSystemGetProcessName\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(length), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&length, \"nvmlSystemGetProcessName\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlSystemGetHicVersion(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hwbcCount: *mut ::core::ffi::c_uint,\n    hwbcEntries: *mut cuda_types::nvml::nvmlHwbcEntry_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(hwbcCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hwbcCount, \"nvmlSystemGetHicVersion\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hwbcEntries), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hwbcEntries, \"nvmlSystemGetHicVersion\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlSystemGetTopologyGpuSet(\n    writer: &mut (impl std::io::Write + ?Sized),\n    cpuNumber: ::core::ffi::c_uint,\n    count: *mut ::core::ffi::c_uint,\n    deviceArray: *mut cuda_types::nvml::nvmlDevice_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(cpuNumber), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cpuNumber,\n        \"nvmlSystemGetTopologyGpuSet\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"nvmlSystemGetTopologyGpuSet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(deviceArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &deviceArray,\n        \"nvmlSystemGetTopologyGpuSet\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlSystemDriverBranchInfo_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(branch), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.branch, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\npub fn write_nvmlSystemGetDriverBranch(\n    writer: &mut (impl std::io::Write + ?Sized),\n    branchInfo: *mut cuda_types::nvml::nvmlSystemDriverBranchInfo_t,\n    length: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(branchInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &branchInfo,\n        \"nvmlSystemGetDriverBranch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(length), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&length, \"nvmlSystemGetDriverBranch\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlUnitGetCount(\n    writer: &mut (impl std::io::Write + ?Sized),\n    unitCount: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(unitCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&unitCount, \"nvmlUnitGetCount\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlUnitGetHandleByIndex(\n    writer: &mut (impl std::io::Write + ?Sized),\n    index: ::core::ffi::c_uint,\n    unit: *mut cuda_types::nvml::nvmlUnit_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(index), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&index, \"nvmlUnitGetHandleByIndex\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(unit), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&unit, \"nvmlUnitGetHandleByIndex\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlUnitGetUnitInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    unit: cuda_types::nvml::nvmlUnit_t,\n    info: *mut cuda_types::nvml::nvmlUnitInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(unit), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&unit, \"nvmlUnitGetUnitInfo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"nvmlUnitGetUnitInfo\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlUnitGetLedState(\n    writer: &mut (impl std::io::Write + ?Sized),\n    unit: cuda_types::nvml::nvmlUnit_t,\n    state: *mut cuda_types::nvml::nvmlLedState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(unit), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&unit, \"nvmlUnitGetLedState\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(state), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&state, \"nvmlUnitGetLedState\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlUnitGetPsuInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    unit: cuda_types::nvml::nvmlUnit_t,\n    psu: *mut cuda_types::nvml::nvmlPSUInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(unit), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&unit, \"nvmlUnitGetPsuInfo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(psu), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&psu, \"nvmlUnitGetPsuInfo\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlUnitGetTemperature(\n    writer: &mut (impl std::io::Write + ?Sized),\n    unit: cuda_types::nvml::nvmlUnit_t,\n    type_: ::core::ffi::c_uint,\n    temp: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(unit), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&unit, \"nvmlUnitGetTemperature\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"nvmlUnitGetTemperature\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(temp), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&temp, \"nvmlUnitGetTemperature\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlUnitGetFanSpeedInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    unit: cuda_types::nvml::nvmlUnit_t,\n    fanSpeeds: *mut cuda_types::nvml::nvmlUnitFanSpeeds_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(unit), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&unit, \"nvmlUnitGetFanSpeedInfo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fanSpeeds), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fanSpeeds, \"nvmlUnitGetFanSpeedInfo\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlUnitGetDevices(\n    writer: &mut (impl std::io::Write + ?Sized),\n    unit: cuda_types::nvml::nvmlUnit_t,\n    deviceCount: *mut ::core::ffi::c_uint,\n    devices: *mut cuda_types::nvml::nvmlDevice_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(unit), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&unit, \"nvmlUnitGetDevices\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(deviceCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&deviceCount, \"nvmlUnitGetDevices\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(devices), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&devices, \"nvmlUnitGetDevices\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetCount_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    deviceCount: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(deviceCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&deviceCount, \"nvmlDeviceGetCount_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetAttributes_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    attributes: *mut cuda_types::nvml::nvmlDeviceAttributes_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetAttributes_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attributes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &attributes,\n        \"nvmlDeviceGetAttributes_v2\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetHandleByIndex_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    index: ::core::ffi::c_uint,\n    device: *mut cuda_types::nvml::nvmlDevice_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(index), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&index, \"nvmlDeviceGetHandleByIndex_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetHandleByIndex_v2\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetHandleBySerial(\n    writer: &mut (impl std::io::Write + ?Sized),\n    serial: *const ::core::ffi::c_char,\n    device: *mut cuda_types::nvml::nvmlDevice_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(serial), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&serial, \"nvmlDeviceGetHandleBySerial\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetHandleBySerial\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetHandleByUUID(\n    writer: &mut (impl std::io::Write + ?Sized),\n    uuid: *const ::core::ffi::c_char,\n    device: *mut cuda_types::nvml::nvmlDevice_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(uuid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uuid, \"nvmlDeviceGetHandleByUUID\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetHandleByUUID\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetHandleByUUIDV(\n    writer: &mut (impl std::io::Write + ?Sized),\n    uuid: *const cuda_types::nvml::nvmlUUID_t,\n    device: *mut cuda_types::nvml::nvmlDevice_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(uuid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uuid, \"nvmlDeviceGetHandleByUUIDV\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetHandleByUUIDV\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetHandleByPciBusId_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pciBusId: *const ::core::ffi::c_char,\n    device: *mut cuda_types::nvml::nvmlDevice_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pciBusId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pciBusId,\n        \"nvmlDeviceGetHandleByPciBusId_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetHandleByPciBusId_v2\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetName(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    name: *mut ::core::ffi::c_char,\n    length: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetName\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(name), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&name, \"nvmlDeviceGetName\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(length), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&length, \"nvmlDeviceGetName\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetBrand(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    type_: *mut cuda_types::nvml::nvmlBrandType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetBrand\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"nvmlDeviceGetBrand\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetIndex(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    index: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetIndex\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(index), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&index, \"nvmlDeviceGetIndex\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetSerial(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    serial: *mut ::core::ffi::c_char,\n    length: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetSerial\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(serial), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&serial, \"nvmlDeviceGetSerial\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(length), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&length, \"nvmlDeviceGetSerial\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetModuleId(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    moduleId: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetModuleId\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(moduleId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&moduleId, \"nvmlDeviceGetModuleId\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetC2cModeInfoV(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    c2cModeInfo: *mut cuda_types::nvml::nvmlC2cModeInfo_v1_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetC2cModeInfoV\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c2cModeInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &c2cModeInfo,\n        \"nvmlDeviceGetC2cModeInfoV\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetMemoryAffinity(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    nodeSetSize: ::core::ffi::c_uint,\n    nodeSet: *mut ::core::ffi::c_ulong,\n    scope: cuda_types::nvml::nvmlAffinityScope_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetMemoryAffinity\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeSetSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nodeSetSize,\n        \"nvmlDeviceGetMemoryAffinity\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nodeSet), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nodeSet, \"nvmlDeviceGetMemoryAffinity\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(scope), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&scope, \"nvmlDeviceGetMemoryAffinity\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetCpuAffinityWithinScope(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    cpuSetSize: ::core::ffi::c_uint,\n    cpuSet: *mut ::core::ffi::c_ulong,\n    scope: cuda_types::nvml::nvmlAffinityScope_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetCpuAffinityWithinScope\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cpuSetSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cpuSetSize,\n        \"nvmlDeviceGetCpuAffinityWithinScope\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cpuSet), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cpuSet,\n        \"nvmlDeviceGetCpuAffinityWithinScope\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(scope), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &scope,\n        \"nvmlDeviceGetCpuAffinityWithinScope\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetCpuAffinity(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    cpuSetSize: ::core::ffi::c_uint,\n    cpuSet: *mut ::core::ffi::c_ulong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetCpuAffinity\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cpuSetSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cpuSetSize, \"nvmlDeviceGetCpuAffinity\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cpuSet), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cpuSet, \"nvmlDeviceGetCpuAffinity\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetCpuAffinity(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceSetCpuAffinity\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceClearCpuAffinity(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceClearCpuAffinity\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetNumaNodeId(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    node: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetNumaNodeId\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(node), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&node, \"nvmlDeviceGetNumaNodeId\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetAddressingMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    mode: *mut cuda_types::nvml::nvmlDeviceAddressingMode_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetAddressingMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"nvmlDeviceGetAddressingMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetRepairStatus(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    repairStatus: *mut cuda_types::nvml::nvmlRepairStatus_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetRepairStatus\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(repairStatus), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &repairStatus,\n        \"nvmlDeviceGetRepairStatus\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetTopologyCommonAncestor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device1: cuda_types::nvml::nvmlDevice_t,\n    device2: cuda_types::nvml::nvmlDevice_t,\n    pathInfo: *mut cuda_types::nvml::nvmlGpuTopologyLevel_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device1,\n        \"nvmlDeviceGetTopologyCommonAncestor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(device2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device2,\n        \"nvmlDeviceGetTopologyCommonAncestor\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pathInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pathInfo,\n        \"nvmlDeviceGetTopologyCommonAncestor\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetTopologyNearestGpus(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    level: cuda_types::nvml::nvmlGpuTopologyLevel_t,\n    count: *mut ::core::ffi::c_uint,\n    deviceArray: *mut cuda_types::nvml::nvmlDevice_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetTopologyNearestGpus\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(level), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &level,\n        \"nvmlDeviceGetTopologyNearestGpus\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &count,\n        \"nvmlDeviceGetTopologyNearestGpus\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(deviceArray), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &deviceArray,\n        \"nvmlDeviceGetTopologyNearestGpus\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetP2PStatus(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device1: cuda_types::nvml::nvmlDevice_t,\n    device2: cuda_types::nvml::nvmlDevice_t,\n    p2pIndex: cuda_types::nvml::nvmlGpuP2PCapsIndex_t,\n    p2pStatus: *mut cuda_types::nvml::nvmlGpuP2PStatus_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device1, \"nvmlDeviceGetP2PStatus\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(device2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device2, \"nvmlDeviceGetP2PStatus\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(p2pIndex), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&p2pIndex, \"nvmlDeviceGetP2PStatus\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(p2pStatus), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&p2pStatus, \"nvmlDeviceGetP2PStatus\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetUUID(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    uuid: *mut ::core::ffi::c_char,\n    length: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetUUID\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uuid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uuid, \"nvmlDeviceGetUUID\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(length), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&length, \"nvmlDeviceGetUUID\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetMinorNumber(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    minorNumber: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetMinorNumber\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(minorNumber), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &minorNumber,\n        \"nvmlDeviceGetMinorNumber\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetBoardPartNumber(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    partNumber: *mut ::core::ffi::c_char,\n    length: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetBoardPartNumber\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(partNumber), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &partNumber,\n        \"nvmlDeviceGetBoardPartNumber\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(length), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&length, \"nvmlDeviceGetBoardPartNumber\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetInforomVersion(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    object: cuda_types::nvml::nvmlInforomObject_t,\n    version: *mut ::core::ffi::c_char,\n    length: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetInforomVersion\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(object), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&object, \"nvmlDeviceGetInforomVersion\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(version), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&version, \"nvmlDeviceGetInforomVersion\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(length), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&length, \"nvmlDeviceGetInforomVersion\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetInforomImageVersion(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    version: *mut ::core::ffi::c_char,\n    length: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetInforomImageVersion\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(version), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &version,\n        \"nvmlDeviceGetInforomImageVersion\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(length), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &length,\n        \"nvmlDeviceGetInforomImageVersion\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetInforomConfigurationChecksum(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    checksum: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetInforomConfigurationChecksum\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(checksum), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &checksum,\n        \"nvmlDeviceGetInforomConfigurationChecksum\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceValidateInforom(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceValidateInforom\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetLastBBXFlushTime(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    timestamp: *mut ::core::ffi::c_ulonglong,\n    durationUs: *mut ::core::ffi::c_ulong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetLastBBXFlushTime\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(timestamp), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &timestamp,\n        \"nvmlDeviceGetLastBBXFlushTime\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(durationUs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &durationUs,\n        \"nvmlDeviceGetLastBBXFlushTime\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetDisplayMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    display: *mut cuda_types::nvml::nvmlEnableState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetDisplayMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(display), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&display, \"nvmlDeviceGetDisplayMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetDisplayActive(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    isActive: *mut cuda_types::nvml::nvmlEnableState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetDisplayActive\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(isActive), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&isActive, \"nvmlDeviceGetDisplayActive\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetPersistenceMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    mode: *mut cuda_types::nvml::nvmlEnableState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetPersistenceMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"nvmlDeviceGetPersistenceMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetPciInfoExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    pci: *mut cuda_types::nvml::nvmlPciInfoExt_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetPciInfoExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pci), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pci, \"nvmlDeviceGetPciInfoExt\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetPciInfo_v3(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    pci: *mut cuda_types::nvml::nvmlPciInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetPciInfo_v3\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pci), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pci, \"nvmlDeviceGetPciInfo_v3\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetMaxPcieLinkGeneration(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    maxLinkGen: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetMaxPcieLinkGeneration\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxLinkGen), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxLinkGen,\n        \"nvmlDeviceGetMaxPcieLinkGeneration\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetGpuMaxPcieLinkGeneration(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    maxLinkGenDevice: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetGpuMaxPcieLinkGeneration\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxLinkGenDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxLinkGenDevice,\n        \"nvmlDeviceGetGpuMaxPcieLinkGeneration\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetMaxPcieLinkWidth(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    maxLinkWidth: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetMaxPcieLinkWidth\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxLinkWidth), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxLinkWidth,\n        \"nvmlDeviceGetMaxPcieLinkWidth\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetCurrPcieLinkGeneration(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    currLinkGen: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetCurrPcieLinkGeneration\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(currLinkGen), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &currLinkGen,\n        \"nvmlDeviceGetCurrPcieLinkGeneration\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetCurrPcieLinkWidth(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    currLinkWidth: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetCurrPcieLinkWidth\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(currLinkWidth), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &currLinkWidth,\n        \"nvmlDeviceGetCurrPcieLinkWidth\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetPcieThroughput(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    counter: cuda_types::nvml::nvmlPcieUtilCounter_t,\n    value: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetPcieThroughput\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(counter), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&counter, \"nvmlDeviceGetPcieThroughput\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"nvmlDeviceGetPcieThroughput\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetPcieReplayCounter(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    value: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetPcieReplayCounter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &value,\n        \"nvmlDeviceGetPcieReplayCounter\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetClockInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    type_: cuda_types::nvml::nvmlClockType_t,\n    clock: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetClockInfo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"nvmlDeviceGetClockInfo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clock), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&clock, \"nvmlDeviceGetClockInfo\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetMaxClockInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    type_: cuda_types::nvml::nvmlClockType_t,\n    clock: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetMaxClockInfo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"nvmlDeviceGetMaxClockInfo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clock), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&clock, \"nvmlDeviceGetMaxClockInfo\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetGpcClkVfOffset(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    offset: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetGpcClkVfOffset\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(offset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&offset, \"nvmlDeviceGetGpcClkVfOffset\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetApplicationsClock(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    clockType: cuda_types::nvml::nvmlClockType_t,\n    clockMHz: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetApplicationsClock\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clockType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &clockType,\n        \"nvmlDeviceGetApplicationsClock\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clockMHz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &clockMHz,\n        \"nvmlDeviceGetApplicationsClock\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetDefaultApplicationsClock(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    clockType: cuda_types::nvml::nvmlClockType_t,\n    clockMHz: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetDefaultApplicationsClock\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clockType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &clockType,\n        \"nvmlDeviceGetDefaultApplicationsClock\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clockMHz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &clockMHz,\n        \"nvmlDeviceGetDefaultApplicationsClock\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetClock(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    clockType: cuda_types::nvml::nvmlClockType_t,\n    clockId: cuda_types::nvml::nvmlClockId_t,\n    clockMHz: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetClock\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clockType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&clockType, \"nvmlDeviceGetClock\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clockId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&clockId, \"nvmlDeviceGetClock\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clockMHz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&clockMHz, \"nvmlDeviceGetClock\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetMaxCustomerBoostClock(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    clockType: cuda_types::nvml::nvmlClockType_t,\n    clockMHz: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetMaxCustomerBoostClock\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clockType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &clockType,\n        \"nvmlDeviceGetMaxCustomerBoostClock\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clockMHz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &clockMHz,\n        \"nvmlDeviceGetMaxCustomerBoostClock\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetSupportedMemoryClocks(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    count: *mut ::core::ffi::c_uint,\n    clocksMHz: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetSupportedMemoryClocks\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &count,\n        \"nvmlDeviceGetSupportedMemoryClocks\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clocksMHz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &clocksMHz,\n        \"nvmlDeviceGetSupportedMemoryClocks\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetSupportedGraphicsClocks(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    memoryClockMHz: ::core::ffi::c_uint,\n    count: *mut ::core::ffi::c_uint,\n    clocksMHz: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetSupportedGraphicsClocks\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(memoryClockMHz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &memoryClockMHz,\n        \"nvmlDeviceGetSupportedGraphicsClocks\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &count,\n        \"nvmlDeviceGetSupportedGraphicsClocks\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clocksMHz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &clocksMHz,\n        \"nvmlDeviceGetSupportedGraphicsClocks\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetAutoBoostedClocksEnabled(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    isEnabled: *mut cuda_types::nvml::nvmlEnableState_t,\n    defaultIsEnabled: *mut cuda_types::nvml::nvmlEnableState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetAutoBoostedClocksEnabled\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(isEnabled), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &isEnabled,\n        \"nvmlDeviceGetAutoBoostedClocksEnabled\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(defaultIsEnabled), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &defaultIsEnabled,\n        \"nvmlDeviceGetAutoBoostedClocksEnabled\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetFanSpeed(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    speed: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetFanSpeed\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(speed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&speed, \"nvmlDeviceGetFanSpeed\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetFanSpeed_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    fan: ::core::ffi::c_uint,\n    speed: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetFanSpeed_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fan, \"nvmlDeviceGetFanSpeed_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(speed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&speed, \"nvmlDeviceGetFanSpeed_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetFanSpeedRPM(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    fanSpeed: *mut cuda_types::nvml::nvmlFanSpeedInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetFanSpeedRPM\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fanSpeed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fanSpeed, \"nvmlDeviceGetFanSpeedRPM\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetTargetFanSpeed(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    fan: ::core::ffi::c_uint,\n    targetSpeed: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetTargetFanSpeed\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fan, \"nvmlDeviceGetTargetFanSpeed\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(targetSpeed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &targetSpeed,\n        \"nvmlDeviceGetTargetFanSpeed\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetMinMaxFanSpeed(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    minSpeed: *mut ::core::ffi::c_uint,\n    maxSpeed: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetMinMaxFanSpeed\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(minSpeed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &minSpeed,\n        \"nvmlDeviceGetMinMaxFanSpeed\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxSpeed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxSpeed,\n        \"nvmlDeviceGetMinMaxFanSpeed\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetFanControlPolicy_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    fan: ::core::ffi::c_uint,\n    policy: *mut cuda_types::nvml::nvmlFanControlPolicy_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetFanControlPolicy_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &fan,\n        \"nvmlDeviceGetFanControlPolicy_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &policy,\n        \"nvmlDeviceGetFanControlPolicy_v2\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetNumFans(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    numFans: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetNumFans\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numFans), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numFans, \"nvmlDeviceGetNumFans\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetTemperature(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    sensorType: cuda_types::nvml::nvmlTemperatureSensors_t,\n    temp: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetTemperature\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sensorType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&sensorType, \"nvmlDeviceGetTemperature\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(temp), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&temp, \"nvmlDeviceGetTemperature\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetCoolerInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    coolerInfo: *mut cuda_types::nvml::nvmlCoolerInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetCoolerInfo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(coolerInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&coolerInfo, \"nvmlDeviceGetCoolerInfo\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlTemperature_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sensorType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sensorType, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(temperature), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.temperature, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\npub fn write_nvmlDeviceGetTemperatureV(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    temperature: *mut cuda_types::nvml::nvmlTemperature_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetTemperatureV\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(temperature), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &temperature,\n        \"nvmlDeviceGetTemperatureV\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetTemperatureThreshold(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    thresholdType: cuda_types::nvml::nvmlTemperatureThresholds_t,\n    temp: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetTemperatureThreshold\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(thresholdType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &thresholdType,\n        \"nvmlDeviceGetTemperatureThreshold\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(temp), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &temp,\n        \"nvmlDeviceGetTemperatureThreshold\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetMarginTemperature(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    marginTempInfo: *mut cuda_types::nvml::nvmlMarginTemperature_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetMarginTemperature\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(marginTempInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &marginTempInfo,\n        \"nvmlDeviceGetMarginTemperature\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetThermalSettings(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    sensorIndex: ::core::ffi::c_uint,\n    pThermalSettings: *mut cuda_types::nvml::nvmlGpuThermalSettings_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetThermalSettings\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sensorIndex), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sensorIndex,\n        \"nvmlDeviceGetThermalSettings\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pThermalSettings), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pThermalSettings,\n        \"nvmlDeviceGetThermalSettings\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetPerformanceState(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    pState: *mut cuda_types::nvml::nvmlPstates_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetPerformanceState\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pState), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pState,\n        \"nvmlDeviceGetPerformanceState\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetCurrentClocksEventReasons(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    clocksEventReasons: *mut ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetCurrentClocksEventReasons\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clocksEventReasons), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &clocksEventReasons,\n        \"nvmlDeviceGetCurrentClocksEventReasons\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetCurrentClocksThrottleReasons(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    clocksThrottleReasons: *mut ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetCurrentClocksThrottleReasons\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(clocksThrottleReasons), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &clocksThrottleReasons,\n        \"nvmlDeviceGetCurrentClocksThrottleReasons\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetSupportedClocksEventReasons(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    supportedClocksEventReasons: *mut ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetSupportedClocksEventReasons\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(supportedClocksEventReasons), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &supportedClocksEventReasons,\n        \"nvmlDeviceGetSupportedClocksEventReasons\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetSupportedClocksThrottleReasons(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    supportedClocksThrottleReasons: *mut ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetSupportedClocksThrottleReasons\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer\n        .write_all(\n            concat!(stringify!(supportedClocksThrottleReasons), \": \").as_bytes(),\n        )?;\n    crate::CudaDisplay::write(\n        &supportedClocksThrottleReasons,\n        \"nvmlDeviceGetSupportedClocksThrottleReasons\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetPowerState(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    pState: *mut cuda_types::nvml::nvmlPstates_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetPowerState\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pState), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pState, \"nvmlDeviceGetPowerState\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetDynamicPstatesInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    pDynamicPstatesInfo: *mut cuda_types::nvml::nvmlGpuDynamicPstatesInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetDynamicPstatesInfo\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pDynamicPstatesInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pDynamicPstatesInfo,\n        \"nvmlDeviceGetDynamicPstatesInfo\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetMemClkVfOffset(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    offset: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetMemClkVfOffset\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(offset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&offset, \"nvmlDeviceGetMemClkVfOffset\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetMinMaxClockOfPState(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    type_: cuda_types::nvml::nvmlClockType_t,\n    pstate: cuda_types::nvml::nvmlPstates_t,\n    minClockMHz: *mut ::core::ffi::c_uint,\n    maxClockMHz: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetMinMaxClockOfPState\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &type_,\n        \"nvmlDeviceGetMinMaxClockOfPState\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pstate), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pstate,\n        \"nvmlDeviceGetMinMaxClockOfPState\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(minClockMHz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &minClockMHz,\n        \"nvmlDeviceGetMinMaxClockOfPState\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxClockMHz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxClockMHz,\n        \"nvmlDeviceGetMinMaxClockOfPState\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetSupportedPerformanceStates(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    pstates: *mut cuda_types::nvml::nvmlPstates_t,\n    size: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetSupportedPerformanceStates\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pstates), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pstates,\n        \"nvmlDeviceGetSupportedPerformanceStates\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &size,\n        \"nvmlDeviceGetSupportedPerformanceStates\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetGpcClkMinMaxVfOffset(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    minOffset: *mut ::core::ffi::c_int,\n    maxOffset: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetGpcClkMinMaxVfOffset\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(minOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &minOffset,\n        \"nvmlDeviceGetGpcClkMinMaxVfOffset\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxOffset,\n        \"nvmlDeviceGetGpcClkMinMaxVfOffset\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetMemClkMinMaxVfOffset(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    minOffset: *mut ::core::ffi::c_int,\n    maxOffset: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetMemClkMinMaxVfOffset\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(minOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &minOffset,\n        \"nvmlDeviceGetMemClkMinMaxVfOffset\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxOffset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxOffset,\n        \"nvmlDeviceGetMemClkMinMaxVfOffset\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetClockOffsets(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    info: *mut cuda_types::nvml::nvmlClockOffset_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetClockOffsets\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"nvmlDeviceGetClockOffsets\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetClockOffsets(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    info: *mut cuda_types::nvml::nvmlClockOffset_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceSetClockOffsets\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"nvmlDeviceSetClockOffsets\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetPerformanceModes(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    perfModes: *mut cuda_types::nvml::nvmlDevicePerfModes_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetPerformanceModes\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(perfModes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &perfModes,\n        \"nvmlDeviceGetPerformanceModes\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetCurrentClockFreqs(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    currentClockFreqs: *mut cuda_types::nvml::nvmlDeviceCurrentClockFreqs_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetCurrentClockFreqs\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(currentClockFreqs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &currentClockFreqs,\n        \"nvmlDeviceGetCurrentClockFreqs\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetPowerManagementMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    mode: *mut cuda_types::nvml::nvmlEnableState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetPowerManagementMode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"nvmlDeviceGetPowerManagementMode\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetPowerManagementLimit(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    limit: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetPowerManagementLimit\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(limit), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &limit,\n        \"nvmlDeviceGetPowerManagementLimit\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetPowerManagementLimitConstraints(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    minLimit: *mut ::core::ffi::c_uint,\n    maxLimit: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetPowerManagementLimitConstraints\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(minLimit), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &minLimit,\n        \"nvmlDeviceGetPowerManagementLimitConstraints\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxLimit), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxLimit,\n        \"nvmlDeviceGetPowerManagementLimitConstraints\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetPowerManagementDefaultLimit(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    defaultLimit: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetPowerManagementDefaultLimit\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(defaultLimit), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &defaultLimit,\n        \"nvmlDeviceGetPowerManagementDefaultLimit\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetPowerUsage(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    power: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetPowerUsage\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(power), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&power, \"nvmlDeviceGetPowerUsage\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetPowerMizerMode_v1(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    powerMizerMode: *mut cuda_types::nvml::nvmlDevicePowerMizerModes_v1_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetPowerMizerMode_v1\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(powerMizerMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &powerMizerMode,\n        \"nvmlDeviceGetPowerMizerMode_v1\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetPowerMizerMode_v1(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    powerMizerMode: *mut cuda_types::nvml::nvmlDevicePowerMizerModes_v1_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceSetPowerMizerMode_v1\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(powerMizerMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &powerMizerMode,\n        \"nvmlDeviceSetPowerMizerMode_v1\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetTotalEnergyConsumption(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    energy: *mut ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetTotalEnergyConsumption\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(energy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &energy,\n        \"nvmlDeviceGetTotalEnergyConsumption\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetEnforcedPowerLimit(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    limit: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetEnforcedPowerLimit\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(limit), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &limit,\n        \"nvmlDeviceGetEnforcedPowerLimit\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetGpuOperationMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    current: *mut cuda_types::nvml::nvmlGpuOperationMode_t,\n    pending: *mut cuda_types::nvml::nvmlGpuOperationMode_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetGpuOperationMode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(current), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &current,\n        \"nvmlDeviceGetGpuOperationMode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pending), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pending,\n        \"nvmlDeviceGetGpuOperationMode\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetMemoryInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    memory: *mut cuda_types::nvml::nvmlMemory_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetMemoryInfo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(memory), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&memory, \"nvmlDeviceGetMemoryInfo\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetMemoryInfo_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    memory: *mut cuda_types::nvml::nvmlMemory_v2_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetMemoryInfo_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(memory), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&memory, \"nvmlDeviceGetMemoryInfo_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetComputeMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    mode: *mut cuda_types::nvml::nvmlComputeMode_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetComputeMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"nvmlDeviceGetComputeMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetCudaComputeCapability(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    major: *mut ::core::ffi::c_int,\n    minor: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetCudaComputeCapability\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(major), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &major,\n        \"nvmlDeviceGetCudaComputeCapability\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(minor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &minor,\n        \"nvmlDeviceGetCudaComputeCapability\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetDramEncryptionMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    current: *mut cuda_types::nvml::nvmlDramEncryptionInfo_t,\n    pending: *mut cuda_types::nvml::nvmlDramEncryptionInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetDramEncryptionMode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(current), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &current,\n        \"nvmlDeviceGetDramEncryptionMode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pending), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pending,\n        \"nvmlDeviceGetDramEncryptionMode\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetDramEncryptionMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    dramEncryption: *const cuda_types::nvml::nvmlDramEncryptionInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceSetDramEncryptionMode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dramEncryption), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dramEncryption,\n        \"nvmlDeviceSetDramEncryptionMode\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetEccMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    current: *mut cuda_types::nvml::nvmlEnableState_t,\n    pending: *mut cuda_types::nvml::nvmlEnableState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetEccMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(current), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&current, \"nvmlDeviceGetEccMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pending), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pending, \"nvmlDeviceGetEccMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetDefaultEccMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    defaultMode: *mut cuda_types::nvml::nvmlEnableState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetDefaultEccMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(defaultMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &defaultMode,\n        \"nvmlDeviceGetDefaultEccMode\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetBoardId(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    boardId: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetBoardId\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(boardId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&boardId, \"nvmlDeviceGetBoardId\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetMultiGpuBoard(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    multiGpuBool: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetMultiGpuBoard\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(multiGpuBool), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &multiGpuBool,\n        \"nvmlDeviceGetMultiGpuBoard\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetTotalEccErrors(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    errorType: cuda_types::nvml::nvmlMemoryErrorType_t,\n    counterType: cuda_types::nvml::nvmlEccCounterType_t,\n    eccCounts: *mut ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetTotalEccErrors\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(errorType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &errorType,\n        \"nvmlDeviceGetTotalEccErrors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(counterType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &counterType,\n        \"nvmlDeviceGetTotalEccErrors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(eccCounts), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &eccCounts,\n        \"nvmlDeviceGetTotalEccErrors\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetDetailedEccErrors(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    errorType: cuda_types::nvml::nvmlMemoryErrorType_t,\n    counterType: cuda_types::nvml::nvmlEccCounterType_t,\n    eccCounts: *mut cuda_types::nvml::nvmlEccErrorCounts_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetDetailedEccErrors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(errorType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &errorType,\n        \"nvmlDeviceGetDetailedEccErrors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(counterType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &counterType,\n        \"nvmlDeviceGetDetailedEccErrors\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(eccCounts), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &eccCounts,\n        \"nvmlDeviceGetDetailedEccErrors\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetMemoryErrorCounter(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    errorType: cuda_types::nvml::nvmlMemoryErrorType_t,\n    counterType: cuda_types::nvml::nvmlEccCounterType_t,\n    locationType: cuda_types::nvml::nvmlMemoryLocation_t,\n    count: *mut ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetMemoryErrorCounter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(errorType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &errorType,\n        \"nvmlDeviceGetMemoryErrorCounter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(counterType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &counterType,\n        \"nvmlDeviceGetMemoryErrorCounter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(locationType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &locationType,\n        \"nvmlDeviceGetMemoryErrorCounter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &count,\n        \"nvmlDeviceGetMemoryErrorCounter\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetUtilizationRates(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    utilization: *mut cuda_types::nvml::nvmlUtilization_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetUtilizationRates\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(utilization), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &utilization,\n        \"nvmlDeviceGetUtilizationRates\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetEncoderUtilization(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    utilization: *mut ::core::ffi::c_uint,\n    samplingPeriodUs: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetEncoderUtilization\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(utilization), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &utilization,\n        \"nvmlDeviceGetEncoderUtilization\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(samplingPeriodUs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &samplingPeriodUs,\n        \"nvmlDeviceGetEncoderUtilization\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetEncoderCapacity(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    encoderQueryType: cuda_types::nvml::nvmlEncoderType_t,\n    encoderCapacity: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetEncoderCapacity\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(encoderQueryType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &encoderQueryType,\n        \"nvmlDeviceGetEncoderCapacity\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(encoderCapacity), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &encoderCapacity,\n        \"nvmlDeviceGetEncoderCapacity\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetEncoderStats(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    sessionCount: *mut ::core::ffi::c_uint,\n    averageFps: *mut ::core::ffi::c_uint,\n    averageLatency: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetEncoderStats\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sessionCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sessionCount,\n        \"nvmlDeviceGetEncoderStats\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(averageFps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &averageFps,\n        \"nvmlDeviceGetEncoderStats\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(averageLatency), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &averageLatency,\n        \"nvmlDeviceGetEncoderStats\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetEncoderSessions(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    sessionCount: *mut ::core::ffi::c_uint,\n    sessionInfos: *mut cuda_types::nvml::nvmlEncoderSessionInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetEncoderSessions\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sessionCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sessionCount,\n        \"nvmlDeviceGetEncoderSessions\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sessionInfos), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sessionInfos,\n        \"nvmlDeviceGetEncoderSessions\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetDecoderUtilization(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    utilization: *mut ::core::ffi::c_uint,\n    samplingPeriodUs: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetDecoderUtilization\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(utilization), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &utilization,\n        \"nvmlDeviceGetDecoderUtilization\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(samplingPeriodUs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &samplingPeriodUs,\n        \"nvmlDeviceGetDecoderUtilization\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetJpgUtilization(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    utilization: *mut ::core::ffi::c_uint,\n    samplingPeriodUs: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetJpgUtilization\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(utilization), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &utilization,\n        \"nvmlDeviceGetJpgUtilization\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(samplingPeriodUs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &samplingPeriodUs,\n        \"nvmlDeviceGetJpgUtilization\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetOfaUtilization(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    utilization: *mut ::core::ffi::c_uint,\n    samplingPeriodUs: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetOfaUtilization\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(utilization), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &utilization,\n        \"nvmlDeviceGetOfaUtilization\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(samplingPeriodUs), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &samplingPeriodUs,\n        \"nvmlDeviceGetOfaUtilization\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetFBCStats(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    fbcStats: *mut cuda_types::nvml::nvmlFBCStats_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetFBCStats\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fbcStats), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fbcStats, \"nvmlDeviceGetFBCStats\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetFBCSessions(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    sessionCount: *mut ::core::ffi::c_uint,\n    sessionInfo: *mut cuda_types::nvml::nvmlFBCSessionInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetFBCSessions\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sessionCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sessionCount,\n        \"nvmlDeviceGetFBCSessions\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sessionInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sessionInfo,\n        \"nvmlDeviceGetFBCSessions\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetDriverModel_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    current: *mut cuda_types::nvml::nvmlDriverModel_t,\n    pending: *mut cuda_types::nvml::nvmlDriverModel_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetDriverModel_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(current), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&current, \"nvmlDeviceGetDriverModel_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pending), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pending, \"nvmlDeviceGetDriverModel_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetVbiosVersion(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    version: *mut ::core::ffi::c_char,\n    length: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetVbiosVersion\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(version), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&version, \"nvmlDeviceGetVbiosVersion\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(length), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&length, \"nvmlDeviceGetVbiosVersion\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetBridgeChipInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    bridgeHierarchy: *mut cuda_types::nvml::nvmlBridgeChipHierarchy_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetBridgeChipInfo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bridgeHierarchy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bridgeHierarchy,\n        \"nvmlDeviceGetBridgeChipInfo\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetComputeRunningProcesses_v3(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    infoCount: *mut ::core::ffi::c_uint,\n    infos: *mut cuda_types::nvml::nvmlProcessInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetComputeRunningProcesses_v3\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(infoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &infoCount,\n        \"nvmlDeviceGetComputeRunningProcesses_v3\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(infos), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &infos,\n        \"nvmlDeviceGetComputeRunningProcesses_v3\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetGraphicsRunningProcesses_v3(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    infoCount: *mut ::core::ffi::c_uint,\n    infos: *mut cuda_types::nvml::nvmlProcessInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetGraphicsRunningProcesses_v3\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(infoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &infoCount,\n        \"nvmlDeviceGetGraphicsRunningProcesses_v3\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(infos), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &infos,\n        \"nvmlDeviceGetGraphicsRunningProcesses_v3\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetMPSComputeRunningProcesses_v3(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    infoCount: *mut ::core::ffi::c_uint,\n    infos: *mut cuda_types::nvml::nvmlProcessInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetMPSComputeRunningProcesses_v3\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(infoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &infoCount,\n        \"nvmlDeviceGetMPSComputeRunningProcesses_v3\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(infos), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &infos,\n        \"nvmlDeviceGetMPSComputeRunningProcesses_v3\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetRunningProcessDetailList(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    plist: *mut cuda_types::nvml::nvmlProcessDetailList_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetRunningProcessDetailList\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(plist), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &plist,\n        \"nvmlDeviceGetRunningProcessDetailList\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceOnSameBoard(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device1: cuda_types::nvml::nvmlDevice_t,\n    device2: cuda_types::nvml::nvmlDevice_t,\n    onSameBoard: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device1, \"nvmlDeviceOnSameBoard\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(device2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device2, \"nvmlDeviceOnSameBoard\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(onSameBoard), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&onSameBoard, \"nvmlDeviceOnSameBoard\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetAPIRestriction(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    apiType: cuda_types::nvml::nvmlRestrictedAPI_t,\n    isRestricted: *mut cuda_types::nvml::nvmlEnableState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetAPIRestriction\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(apiType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&apiType, \"nvmlDeviceGetAPIRestriction\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(isRestricted), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &isRestricted,\n        \"nvmlDeviceGetAPIRestriction\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetSamples(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    type_: cuda_types::nvml::nvmlSamplingType_t,\n    lastSeenTimeStamp: ::core::ffi::c_ulonglong,\n    sampleValType: *mut cuda_types::nvml::nvmlValueType_t,\n    sampleCount: *mut ::core::ffi::c_uint,\n    samples: *mut cuda_types::nvml::nvmlSample_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetSamples\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"nvmlDeviceGetSamples\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lastSeenTimeStamp), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &lastSeenTimeStamp,\n        \"nvmlDeviceGetSamples\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sampleValType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&sampleValType, \"nvmlDeviceGetSamples\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sampleCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&sampleCount, \"nvmlDeviceGetSamples\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(samples), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&samples, \"nvmlDeviceGetSamples\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetBAR1MemoryInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    bar1Memory: *mut cuda_types::nvml::nvmlBAR1Memory_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetBAR1MemoryInfo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bar1Memory), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bar1Memory,\n        \"nvmlDeviceGetBAR1MemoryInfo\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetViolationStatus(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    perfPolicyType: cuda_types::nvml::nvmlPerfPolicyType_t,\n    violTime: *mut cuda_types::nvml::nvmlViolationTime_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetViolationStatus\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(perfPolicyType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &perfPolicyType,\n        \"nvmlDeviceGetViolationStatus\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(violTime), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &violTime,\n        \"nvmlDeviceGetViolationStatus\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetIrqNum(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    irqNum: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetIrqNum\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(irqNum), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&irqNum, \"nvmlDeviceGetIrqNum\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetNumGpuCores(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    numCores: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetNumGpuCores\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numCores), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numCores, \"nvmlDeviceGetNumGpuCores\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetPowerSource(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    powerSource: *mut cuda_types::nvml::nvmlPowerSource_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetPowerSource\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(powerSource), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &powerSource,\n        \"nvmlDeviceGetPowerSource\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetMemoryBusWidth(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    busWidth: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetMemoryBusWidth\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(busWidth), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &busWidth,\n        \"nvmlDeviceGetMemoryBusWidth\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetPcieLinkMaxSpeed(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    maxSpeed: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetPcieLinkMaxSpeed\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxSpeed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxSpeed,\n        \"nvmlDeviceGetPcieLinkMaxSpeed\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetPcieSpeed(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    pcieSpeed: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetPcieSpeed\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pcieSpeed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pcieSpeed, \"nvmlDeviceGetPcieSpeed\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetAdaptiveClockInfoStatus(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    adaptiveClockStatus: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetAdaptiveClockInfoStatus\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(adaptiveClockStatus), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &adaptiveClockStatus,\n        \"nvmlDeviceGetAdaptiveClockInfoStatus\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetBusType(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    type_: *mut cuda_types::nvml::nvmlBusType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetBusType\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"nvmlDeviceGetBusType\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetGpuFabricInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    gpuFabricInfo: *mut cuda_types::nvml::nvmlGpuFabricInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetGpuFabricInfo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gpuFabricInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gpuFabricInfo,\n        \"nvmlDeviceGetGpuFabricInfo\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetGpuFabricInfoV(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    gpuFabricInfo: *mut cuda_types::nvml::nvmlGpuFabricInfoV_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetGpuFabricInfoV\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gpuFabricInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gpuFabricInfo,\n        \"nvmlDeviceGetGpuFabricInfoV\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlSystemGetConfComputeCapabilities(\n    writer: &mut (impl std::io::Write + ?Sized),\n    capabilities: *mut cuda_types::nvml::nvmlConfComputeSystemCaps_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(capabilities), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &capabilities,\n        \"nvmlSystemGetConfComputeCapabilities\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlSystemGetConfComputeState(\n    writer: &mut (impl std::io::Write + ?Sized),\n    state: *mut cuda_types::nvml::nvmlConfComputeSystemState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(state), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&state, \"nvmlSystemGetConfComputeState\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetConfComputeMemSizeInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    memInfo: *mut cuda_types::nvml::nvmlConfComputeMemSizeInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetConfComputeMemSizeInfo\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(memInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &memInfo,\n        \"nvmlDeviceGetConfComputeMemSizeInfo\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlSystemGetConfComputeGpusReadyState(\n    writer: &mut (impl std::io::Write + ?Sized),\n    isAcceptingWork: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(isAcceptingWork), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &isAcceptingWork,\n        \"nvmlSystemGetConfComputeGpusReadyState\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetConfComputeProtectedMemoryUsage(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    memory: *mut cuda_types::nvml::nvmlMemory_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetConfComputeProtectedMemoryUsage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(memory), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &memory,\n        \"nvmlDeviceGetConfComputeProtectedMemoryUsage\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetConfComputeGpuCertificate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    gpuCert: *mut cuda_types::nvml::nvmlConfComputeGpuCertificate_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetConfComputeGpuCertificate\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gpuCert), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gpuCert,\n        \"nvmlDeviceGetConfComputeGpuCertificate\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetConfComputeGpuAttestationReport(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    gpuAtstReport: *mut cuda_types::nvml::nvmlConfComputeGpuAttestationReport_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetConfComputeGpuAttestationReport\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gpuAtstReport), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gpuAtstReport,\n        \"nvmlDeviceGetConfComputeGpuAttestationReport\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlSystemGetConfComputeKeyRotationThresholdInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pKeyRotationThrInfo: *mut cuda_types::nvml::nvmlConfComputeGetKeyRotationThresholdInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pKeyRotationThrInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pKeyRotationThrInfo,\n        \"nvmlSystemGetConfComputeKeyRotationThresholdInfo\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetConfComputeUnprotectedMemSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    sizeKiB: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceSetConfComputeUnprotectedMemSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeKiB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sizeKiB,\n        \"nvmlDeviceSetConfComputeUnprotectedMemSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlSystemSetConfComputeGpusReadyState(\n    writer: &mut (impl std::io::Write + ?Sized),\n    isAcceptingWork: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(isAcceptingWork), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &isAcceptingWork,\n        \"nvmlSystemSetConfComputeGpusReadyState\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlSystemSetConfComputeKeyRotationThresholdInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pKeyRotationThrInfo: *mut cuda_types::nvml::nvmlConfComputeSetKeyRotationThresholdInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pKeyRotationThrInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pKeyRotationThrInfo,\n        \"nvmlSystemSetConfComputeKeyRotationThresholdInfo\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlSystemGetConfComputeSettings(\n    writer: &mut (impl std::io::Write + ?Sized),\n    settings: *mut cuda_types::nvml::nvmlSystemConfComputeSettings_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(settings), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &settings,\n        \"nvmlSystemGetConfComputeSettings\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetGspFirmwareVersion(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    version: *mut ::core::ffi::c_char,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetGspFirmwareVersion\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(version), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &version,\n        \"nvmlDeviceGetGspFirmwareVersion\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetGspFirmwareMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    isEnabled: *mut ::core::ffi::c_uint,\n    defaultMode: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetGspFirmwareMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(isEnabled), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &isEnabled,\n        \"nvmlDeviceGetGspFirmwareMode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(defaultMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &defaultMode,\n        \"nvmlDeviceGetGspFirmwareMode\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetSramEccErrorStatus(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    status: *mut cuda_types::nvml::nvmlEccSramErrorStatus_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetSramEccErrorStatus\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(status), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &status,\n        \"nvmlDeviceGetSramEccErrorStatus\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetPowerManagementLimit_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    powerValue: *mut cuda_types::nvml::nvmlPowerValue_v2_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceSetPowerManagementLimit_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(powerValue), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &powerValue,\n        \"nvmlDeviceSetPowerManagementLimit_v2\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetAccountingMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    mode: *mut cuda_types::nvml::nvmlEnableState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetAccountingMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"nvmlDeviceGetAccountingMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetAccountingStats(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    pid: ::core::ffi::c_uint,\n    stats: *mut cuda_types::nvml::nvmlAccountingStats_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetAccountingStats\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pid, \"nvmlDeviceGetAccountingStats\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stats), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&stats, \"nvmlDeviceGetAccountingStats\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetAccountingPids(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    count: *mut ::core::ffi::c_uint,\n    pids: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetAccountingPids\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"nvmlDeviceGetAccountingPids\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pids), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pids, \"nvmlDeviceGetAccountingPids\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetAccountingBufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    bufferSize: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetAccountingBufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bufferSize,\n        \"nvmlDeviceGetAccountingBufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetRetiredPages(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    cause: cuda_types::nvml::nvmlPageRetirementCause_t,\n    pageCount: *mut ::core::ffi::c_uint,\n    addresses: *mut ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetRetiredPages\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cause), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cause, \"nvmlDeviceGetRetiredPages\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pageCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pageCount, \"nvmlDeviceGetRetiredPages\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(addresses), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&addresses, \"nvmlDeviceGetRetiredPages\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetRetiredPages_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    cause: cuda_types::nvml::nvmlPageRetirementCause_t,\n    pageCount: *mut ::core::ffi::c_uint,\n    addresses: *mut ::core::ffi::c_ulonglong,\n    timestamps: *mut ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetRetiredPages_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cause), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cause, \"nvmlDeviceGetRetiredPages_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pageCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pageCount,\n        \"nvmlDeviceGetRetiredPages_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(addresses), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &addresses,\n        \"nvmlDeviceGetRetiredPages_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(timestamps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &timestamps,\n        \"nvmlDeviceGetRetiredPages_v2\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetRetiredPagesPendingStatus(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    isPending: *mut cuda_types::nvml::nvmlEnableState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetRetiredPagesPendingStatus\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(isPending), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &isPending,\n        \"nvmlDeviceGetRetiredPagesPendingStatus\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetRemappedRows(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    corrRows: *mut ::core::ffi::c_uint,\n    uncRows: *mut ::core::ffi::c_uint,\n    isPending: *mut ::core::ffi::c_uint,\n    failureOccurred: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetRemappedRows\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(corrRows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&corrRows, \"nvmlDeviceGetRemappedRows\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uncRows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uncRows, \"nvmlDeviceGetRemappedRows\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(isPending), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&isPending, \"nvmlDeviceGetRemappedRows\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(failureOccurred), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &failureOccurred,\n        \"nvmlDeviceGetRemappedRows\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetRowRemapperHistogram(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    values: *mut cuda_types::nvml::nvmlRowRemapperHistogramValues_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetRowRemapperHistogram\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &values,\n        \"nvmlDeviceGetRowRemapperHistogram\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetArchitecture(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    arch: *mut cuda_types::nvml::nvmlDeviceArchitecture_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetArchitecture\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(arch), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&arch, \"nvmlDeviceGetArchitecture\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetClkMonStatus(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    status: *mut cuda_types::nvml::nvmlClkMonStatus_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetClkMonStatus\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(status), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&status, \"nvmlDeviceGetClkMonStatus\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetProcessUtilization(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    utilization: *mut cuda_types::nvml::nvmlProcessUtilizationSample_t,\n    processSamplesCount: *mut ::core::ffi::c_uint,\n    lastSeenTimeStamp: ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetProcessUtilization\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(utilization), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &utilization,\n        \"nvmlDeviceGetProcessUtilization\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(processSamplesCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &processSamplesCount,\n        \"nvmlDeviceGetProcessUtilization\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lastSeenTimeStamp), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &lastSeenTimeStamp,\n        \"nvmlDeviceGetProcessUtilization\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetProcessesUtilizationInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    procesesUtilInfo: *mut cuda_types::nvml::nvmlProcessesUtilizationInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetProcessesUtilizationInfo\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(procesesUtilInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &procesesUtilInfo,\n        \"nvmlDeviceGetProcessesUtilizationInfo\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetPlatformInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    platformInfo: *mut cuda_types::nvml::nvmlPlatformInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetPlatformInfo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(platformInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &platformInfo,\n        \"nvmlDeviceGetPlatformInfo\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetPdi(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    pdi: *mut cuda_types::nvml::nvmlPdi_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetPdi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pdi), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pdi, \"nvmlDeviceGetPdi\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetHostname_v1(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    hostname: *mut cuda_types::nvml::nvmlHostname_v1_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceSetHostname_v1\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hostname), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hostname, \"nvmlDeviceSetHostname_v1\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetHostname_v1(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    hostname: *mut cuda_types::nvml::nvmlHostname_v1_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetHostname_v1\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(hostname), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&hostname, \"nvmlDeviceGetHostname_v1\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlUnitSetLedState(\n    writer: &mut (impl std::io::Write + ?Sized),\n    unit: cuda_types::nvml::nvmlUnit_t,\n    color: cuda_types::nvml::nvmlLedColor_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(unit), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&unit, \"nvmlUnitSetLedState\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(color), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&color, \"nvmlUnitSetLedState\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetPersistenceMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    mode: cuda_types::nvml::nvmlEnableState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceSetPersistenceMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"nvmlDeviceSetPersistenceMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetComputeMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    mode: cuda_types::nvml::nvmlComputeMode_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceSetComputeMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"nvmlDeviceSetComputeMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetEccMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    ecc: cuda_types::nvml::nvmlEnableState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceSetEccMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ecc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ecc, \"nvmlDeviceSetEccMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceClearEccErrorCounts(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    counterType: cuda_types::nvml::nvmlEccCounterType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceClearEccErrorCounts\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(counterType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &counterType,\n        \"nvmlDeviceClearEccErrorCounts\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetDriverModel(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    driverModel: cuda_types::nvml::nvmlDriverModel_t,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceSetDriverModel\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(driverModel), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &driverModel,\n        \"nvmlDeviceSetDriverModel\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&flags, \"nvmlDeviceSetDriverModel\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlClockLimitId_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlClockLimitId_enum::NVML_CLOCK_LIMIT_ID_RANGE_START => {\n                writer.write_all(stringify!(NVML_CLOCK_LIMIT_ID_RANGE_START).as_bytes())\n            }\n            &cuda_types::nvml::nvmlClockLimitId_enum::NVML_CLOCK_LIMIT_ID_TDP => {\n                writer.write_all(stringify!(NVML_CLOCK_LIMIT_ID_TDP).as_bytes())\n            }\n            &cuda_types::nvml::nvmlClockLimitId_enum::NVML_CLOCK_LIMIT_ID_UNLIMITED => {\n                writer.write_all(stringify!(NVML_CLOCK_LIMIT_ID_UNLIMITED).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_nvmlDeviceSetGpuLockedClocks(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    minGpuClockMHz: ::core::ffi::c_uint,\n    maxGpuClockMHz: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceSetGpuLockedClocks\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(minGpuClockMHz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &minGpuClockMHz,\n        \"nvmlDeviceSetGpuLockedClocks\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxGpuClockMHz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxGpuClockMHz,\n        \"nvmlDeviceSetGpuLockedClocks\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceResetGpuLockedClocks(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceResetGpuLockedClocks\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetMemoryLockedClocks(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    minMemClockMHz: ::core::ffi::c_uint,\n    maxMemClockMHz: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceSetMemoryLockedClocks\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(minMemClockMHz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &minMemClockMHz,\n        \"nvmlDeviceSetMemoryLockedClocks\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(maxMemClockMHz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &maxMemClockMHz,\n        \"nvmlDeviceSetMemoryLockedClocks\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceResetMemoryLockedClocks(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceResetMemoryLockedClocks\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetApplicationsClocks(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    memClockMHz: ::core::ffi::c_uint,\n    graphicsClockMHz: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceSetApplicationsClocks\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(memClockMHz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &memClockMHz,\n        \"nvmlDeviceSetApplicationsClocks\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(graphicsClockMHz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &graphicsClockMHz,\n        \"nvmlDeviceSetApplicationsClocks\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceResetApplicationsClocks(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceResetApplicationsClocks\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetAutoBoostedClocksEnabled(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    enabled: cuda_types::nvml::nvmlEnableState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceSetAutoBoostedClocksEnabled\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(enabled), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &enabled,\n        \"nvmlDeviceSetAutoBoostedClocksEnabled\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetDefaultAutoBoostedClocksEnabled(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    enabled: cuda_types::nvml::nvmlEnableState_t,\n    flags: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceSetDefaultAutoBoostedClocksEnabled\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(enabled), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &enabled,\n        \"nvmlDeviceSetDefaultAutoBoostedClocksEnabled\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(flags), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &flags,\n        \"nvmlDeviceSetDefaultAutoBoostedClocksEnabled\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetDefaultFanSpeed_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    fan: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceSetDefaultFanSpeed_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fan, \"nvmlDeviceSetDefaultFanSpeed_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetFanControlPolicy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    fan: ::core::ffi::c_uint,\n    policy: cuda_types::nvml::nvmlFanControlPolicy_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceSetFanControlPolicy\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fan, \"nvmlDeviceSetFanControlPolicy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &policy,\n        \"nvmlDeviceSetFanControlPolicy\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetTemperatureThreshold(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    thresholdType: cuda_types::nvml::nvmlTemperatureThresholds_t,\n    temp: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceSetTemperatureThreshold\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(thresholdType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &thresholdType,\n        \"nvmlDeviceSetTemperatureThreshold\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(temp), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &temp,\n        \"nvmlDeviceSetTemperatureThreshold\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetPowerManagementLimit(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    limit: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceSetPowerManagementLimit\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(limit), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &limit,\n        \"nvmlDeviceSetPowerManagementLimit\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetGpuOperationMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    mode: cuda_types::nvml::nvmlGpuOperationMode_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceSetGpuOperationMode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"nvmlDeviceSetGpuOperationMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetAPIRestriction(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    apiType: cuda_types::nvml::nvmlRestrictedAPI_t,\n    isRestricted: cuda_types::nvml::nvmlEnableState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceSetAPIRestriction\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(apiType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&apiType, \"nvmlDeviceSetAPIRestriction\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(isRestricted), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &isRestricted,\n        \"nvmlDeviceSetAPIRestriction\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetFanSpeed_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    fan: ::core::ffi::c_uint,\n    speed: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceSetFanSpeed_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fan, \"nvmlDeviceSetFanSpeed_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(speed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&speed, \"nvmlDeviceSetFanSpeed_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetGpcClkVfOffset(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    offset: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceSetGpcClkVfOffset\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(offset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&offset, \"nvmlDeviceSetGpcClkVfOffset\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetMemClkVfOffset(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    offset: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceSetMemClkVfOffset\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(offset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&offset, \"nvmlDeviceSetMemClkVfOffset\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetAccountingMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    mode: cuda_types::nvml::nvmlEnableState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceSetAccountingMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"nvmlDeviceSetAccountingMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceClearAccountingPids(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceClearAccountingPids\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlNvlinkSupportedBwModes_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(bwModes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.bwModes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(totalBwModes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.totalBwModes, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlNvlinkGetBwMode_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(bIsBest), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.bIsBest, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(bwMode), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.bwMode, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlNvlinkSetBwMode_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(bSetBest), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.bSetBest, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(bwMode), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.bwMode, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlNvLinkInfo_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(isNvleEnabled), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.isNvleEnabled, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlNvlinkFirmwareVersion_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(ucodeType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.ucodeType, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(major), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.major, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(minor), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.minor, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(subMinor), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.subMinor, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlNvlinkFirmwareInfo_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(firmwareVersion), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.firmwareVersion, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(numValidEntries), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.numValidEntries, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlNvLinkInfo_v2_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(isNvleEnabled), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.isNvleEnabled, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(firmwareInfo), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.firmwareInfo, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\npub fn write_nvmlDeviceGetNvLinkState(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    link: ::core::ffi::c_uint,\n    isActive: *mut cuda_types::nvml::nvmlEnableState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetNvLinkState\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(link), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&link, \"nvmlDeviceGetNvLinkState\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(isActive), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&isActive, \"nvmlDeviceGetNvLinkState\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetNvLinkVersion(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    link: ::core::ffi::c_uint,\n    version: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetNvLinkVersion\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(link), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&link, \"nvmlDeviceGetNvLinkVersion\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(version), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&version, \"nvmlDeviceGetNvLinkVersion\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetNvLinkCapability(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    link: ::core::ffi::c_uint,\n    capability: cuda_types::nvml::nvmlNvLinkCapability_t,\n    capResult: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetNvLinkCapability\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(link), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&link, \"nvmlDeviceGetNvLinkCapability\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(capability), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &capability,\n        \"nvmlDeviceGetNvLinkCapability\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(capResult), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &capResult,\n        \"nvmlDeviceGetNvLinkCapability\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetNvLinkRemotePciInfo_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    link: ::core::ffi::c_uint,\n    pci: *mut cuda_types::nvml::nvmlPciInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetNvLinkRemotePciInfo_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(link), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &link,\n        \"nvmlDeviceGetNvLinkRemotePciInfo_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pci), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pci,\n        \"nvmlDeviceGetNvLinkRemotePciInfo_v2\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetNvLinkErrorCounter(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    link: ::core::ffi::c_uint,\n    counter: cuda_types::nvml::nvmlNvLinkErrorCounter_t,\n    counterValue: *mut ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetNvLinkErrorCounter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(link), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &link,\n        \"nvmlDeviceGetNvLinkErrorCounter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(counter), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &counter,\n        \"nvmlDeviceGetNvLinkErrorCounter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(counterValue), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &counterValue,\n        \"nvmlDeviceGetNvLinkErrorCounter\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceResetNvLinkErrorCounters(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    link: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceResetNvLinkErrorCounters\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(link), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &link,\n        \"nvmlDeviceResetNvLinkErrorCounters\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetNvLinkUtilizationControl(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    link: ::core::ffi::c_uint,\n    counter: ::core::ffi::c_uint,\n    control: *mut cuda_types::nvml::nvmlNvLinkUtilizationControl_t,\n    reset: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceSetNvLinkUtilizationControl\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(link), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &link,\n        \"nvmlDeviceSetNvLinkUtilizationControl\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(counter), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &counter,\n        \"nvmlDeviceSetNvLinkUtilizationControl\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(control), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &control,\n        \"nvmlDeviceSetNvLinkUtilizationControl\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reset), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &reset,\n        \"nvmlDeviceSetNvLinkUtilizationControl\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetNvLinkUtilizationControl(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    link: ::core::ffi::c_uint,\n    counter: ::core::ffi::c_uint,\n    control: *mut cuda_types::nvml::nvmlNvLinkUtilizationControl_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetNvLinkUtilizationControl\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(link), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &link,\n        \"nvmlDeviceGetNvLinkUtilizationControl\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(counter), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &counter,\n        \"nvmlDeviceGetNvLinkUtilizationControl\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(control), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &control,\n        \"nvmlDeviceGetNvLinkUtilizationControl\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetNvLinkUtilizationCounter(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    link: ::core::ffi::c_uint,\n    counter: ::core::ffi::c_uint,\n    rxcounter: *mut ::core::ffi::c_ulonglong,\n    txcounter: *mut ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetNvLinkUtilizationCounter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(link), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &link,\n        \"nvmlDeviceGetNvLinkUtilizationCounter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(counter), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &counter,\n        \"nvmlDeviceGetNvLinkUtilizationCounter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rxcounter), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rxcounter,\n        \"nvmlDeviceGetNvLinkUtilizationCounter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(txcounter), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &txcounter,\n        \"nvmlDeviceGetNvLinkUtilizationCounter\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceFreezeNvLinkUtilizationCounter(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    link: ::core::ffi::c_uint,\n    counter: ::core::ffi::c_uint,\n    freeze: cuda_types::nvml::nvmlEnableState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceFreezeNvLinkUtilizationCounter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(link), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &link,\n        \"nvmlDeviceFreezeNvLinkUtilizationCounter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(counter), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &counter,\n        \"nvmlDeviceFreezeNvLinkUtilizationCounter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(freeze), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &freeze,\n        \"nvmlDeviceFreezeNvLinkUtilizationCounter\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceResetNvLinkUtilizationCounter(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    link: ::core::ffi::c_uint,\n    counter: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceResetNvLinkUtilizationCounter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(link), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &link,\n        \"nvmlDeviceResetNvLinkUtilizationCounter\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(counter), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &counter,\n        \"nvmlDeviceResetNvLinkUtilizationCounter\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetNvLinkRemoteDeviceType(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    link: ::core::ffi::c_uint,\n    pNvLinkDeviceType: *mut cuda_types::nvml::nvmlIntNvLinkDeviceType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetNvLinkRemoteDeviceType\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(link), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &link,\n        \"nvmlDeviceGetNvLinkRemoteDeviceType\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pNvLinkDeviceType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pNvLinkDeviceType,\n        \"nvmlDeviceGetNvLinkRemoteDeviceType\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetNvLinkDeviceLowPowerThreshold(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    info: *mut cuda_types::nvml::nvmlNvLinkPowerThres_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceSetNvLinkDeviceLowPowerThreshold\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"nvmlDeviceSetNvLinkDeviceLowPowerThreshold\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlSystemSetNvlinkBwMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    nvlinkBwMode: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(nvlinkBwMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nvlinkBwMode,\n        \"nvmlSystemSetNvlinkBwMode\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlSystemGetNvlinkBwMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    nvlinkBwMode: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(nvlinkBwMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nvlinkBwMode,\n        \"nvmlSystemGetNvlinkBwMode\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetNvlinkSupportedBwModes(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    supportedBwMode: *mut cuda_types::nvml::nvmlNvlinkSupportedBwModes_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetNvlinkSupportedBwModes\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(supportedBwMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &supportedBwMode,\n        \"nvmlDeviceGetNvlinkSupportedBwModes\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetNvlinkBwMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    getBwMode: *mut cuda_types::nvml::nvmlNvlinkGetBwMode_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetNvlinkBwMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(getBwMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&getBwMode, \"nvmlDeviceGetNvlinkBwMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetNvlinkBwMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    setBwMode: *mut cuda_types::nvml::nvmlNvlinkSetBwMode_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceSetNvlinkBwMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(setBwMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&setBwMode, \"nvmlDeviceSetNvlinkBwMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetNvLinkInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    info: *mut cuda_types::nvml::nvmlNvLinkInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetNvLinkInfo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"nvmlDeviceGetNvLinkInfo\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlEventSetCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    set: *mut cuda_types::nvml::nvmlEventSet_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(set), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&set, \"nvmlEventSetCreate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceRegisterEvents(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    eventTypes: ::core::ffi::c_ulonglong,\n    set: cuda_types::nvml::nvmlEventSet_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceRegisterEvents\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(eventTypes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&eventTypes, \"nvmlDeviceRegisterEvents\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(set), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&set, \"nvmlDeviceRegisterEvents\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetSupportedEventTypes(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    eventTypes: *mut ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetSupportedEventTypes\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(eventTypes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &eventTypes,\n        \"nvmlDeviceGetSupportedEventTypes\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlEventSetWait_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    set: cuda_types::nvml::nvmlEventSet_t,\n    data: *mut cuda_types::nvml::nvmlEventData_t,\n    timeoutms: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(set), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&set, \"nvmlEventSetWait_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(data), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&data, \"nvmlEventSetWait_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(timeoutms), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&timeoutms, \"nvmlEventSetWait_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlEventSetFree(\n    writer: &mut (impl std::io::Write + ?Sized),\n    set: cuda_types::nvml::nvmlEventSet_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(set), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&set, \"nvmlEventSetFree\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlSystemEventSetCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    request: *mut cuda_types::nvml::nvmlSystemEventSetCreateRequest_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(request), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&request, \"nvmlSystemEventSetCreate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlSystemEventSetFree(\n    writer: &mut (impl std::io::Write + ?Sized),\n    request: *mut cuda_types::nvml::nvmlSystemEventSetFreeRequest_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(request), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&request, \"nvmlSystemEventSetFree\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlSystemRegisterEvents(\n    writer: &mut (impl std::io::Write + ?Sized),\n    request: *mut cuda_types::nvml::nvmlSystemRegisterEventRequest_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(request), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&request, \"nvmlSystemRegisterEvents\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlSystemEventSetWait(\n    writer: &mut (impl std::io::Write + ?Sized),\n    request: *mut cuda_types::nvml::nvmlSystemEventSetWaitRequest_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(request), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&request, \"nvmlSystemEventSetWait\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceModifyDrainState(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pciInfo: *mut cuda_types::nvml::nvmlPciInfo_t,\n    newState: cuda_types::nvml::nvmlEnableState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pciInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pciInfo, \"nvmlDeviceModifyDrainState\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(newState), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&newState, \"nvmlDeviceModifyDrainState\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceQueryDrainState(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pciInfo: *mut cuda_types::nvml::nvmlPciInfo_t,\n    currentState: *mut cuda_types::nvml::nvmlEnableState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pciInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pciInfo, \"nvmlDeviceQueryDrainState\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(currentState), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &currentState,\n        \"nvmlDeviceQueryDrainState\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceRemoveGpu_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pciInfo: *mut cuda_types::nvml::nvmlPciInfo_t,\n    gpuState: cuda_types::nvml::nvmlDetachGpuState_t,\n    linkState: cuda_types::nvml::nvmlPcieLinkState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pciInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pciInfo, \"nvmlDeviceRemoveGpu_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gpuState), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&gpuState, \"nvmlDeviceRemoveGpu_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(linkState), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&linkState, \"nvmlDeviceRemoveGpu_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceDiscoverGpus(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pciInfo: *mut cuda_types::nvml::nvmlPciInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pciInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pciInfo, \"nvmlDeviceDiscoverGpus\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetFieldValues(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    valuesCount: ::core::ffi::c_int,\n    values: *mut cuda_types::nvml::nvmlFieldValue_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetFieldValues\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valuesCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &valuesCount,\n        \"nvmlDeviceGetFieldValues\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&values, \"nvmlDeviceGetFieldValues\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceClearFieldValues(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    valuesCount: ::core::ffi::c_int,\n    values: *mut cuda_types::nvml::nvmlFieldValue_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceClearFieldValues\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valuesCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &valuesCount,\n        \"nvmlDeviceClearFieldValues\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&values, \"nvmlDeviceClearFieldValues\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetVirtualizationMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    pVirtualMode: *mut cuda_types::nvml::nvmlGpuVirtualizationMode_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetVirtualizationMode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pVirtualMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pVirtualMode,\n        \"nvmlDeviceGetVirtualizationMode\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetHostVgpuMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    pHostVgpuMode: *mut cuda_types::nvml::nvmlHostVgpuMode_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetHostVgpuMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pHostVgpuMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pHostVgpuMode,\n        \"nvmlDeviceGetHostVgpuMode\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetVirtualizationMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    virtualMode: cuda_types::nvml::nvmlGpuVirtualizationMode_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceSetVirtualizationMode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(virtualMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &virtualMode,\n        \"nvmlDeviceSetVirtualizationMode\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetVgpuHeterogeneousMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    pHeterogeneousMode: *mut cuda_types::nvml::nvmlVgpuHeterogeneousMode_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetVgpuHeterogeneousMode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pHeterogeneousMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pHeterogeneousMode,\n        \"nvmlDeviceGetVgpuHeterogeneousMode\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetVgpuHeterogeneousMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    pHeterogeneousMode: *const cuda_types::nvml::nvmlVgpuHeterogeneousMode_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceSetVgpuHeterogeneousMode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pHeterogeneousMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pHeterogeneousMode,\n        \"nvmlDeviceSetVgpuHeterogeneousMode\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuInstanceGetPlacementId(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n    pPlacement: *mut cuda_types::nvml::nvmlVgpuPlacementId_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstance,\n        \"nvmlVgpuInstanceGetPlacementId\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pPlacement), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pPlacement,\n        \"nvmlVgpuInstanceGetPlacementId\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetVgpuTypeSupportedPlacements(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n    pPlacementList: *mut cuda_types::nvml::nvmlVgpuPlacementList_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetVgpuTypeSupportedPlacements\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vgpuTypeId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuTypeId,\n        \"nvmlDeviceGetVgpuTypeSupportedPlacements\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pPlacementList), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pPlacementList,\n        \"nvmlDeviceGetVgpuTypeSupportedPlacements\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetVgpuTypeCreatablePlacements(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n    pPlacementList: *mut cuda_types::nvml::nvmlVgpuPlacementList_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetVgpuTypeCreatablePlacements\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vgpuTypeId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuTypeId,\n        \"nvmlDeviceGetVgpuTypeCreatablePlacements\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pPlacementList), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pPlacementList,\n        \"nvmlDeviceGetVgpuTypeCreatablePlacements\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuTypeGetGspHeapSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n    gspHeapSize: *mut ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuTypeId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuTypeId,\n        \"nvmlVgpuTypeGetGspHeapSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gspHeapSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gspHeapSize,\n        \"nvmlVgpuTypeGetGspHeapSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuTypeGetFbReservation(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n    fbReservation: *mut ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuTypeId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuTypeId,\n        \"nvmlVgpuTypeGetFbReservation\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fbReservation), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &fbReservation,\n        \"nvmlVgpuTypeGetFbReservation\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuInstanceGetRuntimeStateSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n    pState: *mut cuda_types::nvml::nvmlVgpuRuntimeState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstance,\n        \"nvmlVgpuInstanceGetRuntimeStateSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pState), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pState,\n        \"nvmlVgpuInstanceGetRuntimeStateSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetVgpuCapabilities(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    capability: cuda_types::nvml::nvmlDeviceVgpuCapability_t,\n    state: cuda_types::nvml::nvmlEnableState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceSetVgpuCapabilities\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(capability), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &capability,\n        \"nvmlDeviceSetVgpuCapabilities\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(state), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&state, \"nvmlDeviceSetVgpuCapabilities\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetGridLicensableFeatures_v4(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    pGridLicensableFeatures: *mut cuda_types::nvml::nvmlGridLicensableFeatures_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetGridLicensableFeatures_v4\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pGridLicensableFeatures), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pGridLicensableFeatures,\n        \"nvmlDeviceGetGridLicensableFeatures_v4\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGetVgpuDriverCapabilities(\n    writer: &mut (impl std::io::Write + ?Sized),\n    capability: cuda_types::nvml::nvmlVgpuDriverCapability_t,\n    capResult: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(capability), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &capability,\n        \"nvmlGetVgpuDriverCapabilities\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(capResult), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &capResult,\n        \"nvmlGetVgpuDriverCapabilities\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetVgpuCapabilities(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    capability: cuda_types::nvml::nvmlDeviceVgpuCapability_t,\n    capResult: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetVgpuCapabilities\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(capability), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &capability,\n        \"nvmlDeviceGetVgpuCapabilities\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(capResult), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &capResult,\n        \"nvmlDeviceGetVgpuCapabilities\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetSupportedVgpus(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    vgpuCount: *mut ::core::ffi::c_uint,\n    vgpuTypeIds: *mut cuda_types::nvml::nvmlVgpuTypeId_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetSupportedVgpus\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vgpuCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuCount,\n        \"nvmlDeviceGetSupportedVgpus\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vgpuTypeIds), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuTypeIds,\n        \"nvmlDeviceGetSupportedVgpus\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetCreatableVgpus(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    vgpuCount: *mut ::core::ffi::c_uint,\n    vgpuTypeIds: *mut cuda_types::nvml::nvmlVgpuTypeId_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetCreatableVgpus\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vgpuCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuCount,\n        \"nvmlDeviceGetCreatableVgpus\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vgpuTypeIds), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuTypeIds,\n        \"nvmlDeviceGetCreatableVgpus\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuTypeGetClass(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n    vgpuTypeClass: *mut ::core::ffi::c_char,\n    size: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuTypeId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vgpuTypeId, \"nvmlVgpuTypeGetClass\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vgpuTypeClass), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vgpuTypeClass, \"nvmlVgpuTypeGetClass\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"nvmlVgpuTypeGetClass\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuTypeGetName(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n    vgpuTypeName: *mut ::core::ffi::c_char,\n    size: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuTypeId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vgpuTypeId, \"nvmlVgpuTypeGetName\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vgpuTypeName), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vgpuTypeName, \"nvmlVgpuTypeGetName\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"nvmlVgpuTypeGetName\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuTypeGetGpuInstanceProfileId(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n    gpuInstanceProfileId: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuTypeId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuTypeId,\n        \"nvmlVgpuTypeGetGpuInstanceProfileId\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gpuInstanceProfileId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gpuInstanceProfileId,\n        \"nvmlVgpuTypeGetGpuInstanceProfileId\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuTypeGetDeviceID(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n    deviceID: *mut ::core::ffi::c_ulonglong,\n    subsystemID: *mut ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuTypeId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vgpuTypeId, \"nvmlVgpuTypeGetDeviceID\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(deviceID), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&deviceID, \"nvmlVgpuTypeGetDeviceID\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(subsystemID), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&subsystemID, \"nvmlVgpuTypeGetDeviceID\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuTypeGetFramebufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n    fbSize: *mut ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuTypeId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuTypeId,\n        \"nvmlVgpuTypeGetFramebufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fbSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &fbSize,\n        \"nvmlVgpuTypeGetFramebufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuTypeGetNumDisplayHeads(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n    numDisplayHeads: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuTypeId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuTypeId,\n        \"nvmlVgpuTypeGetNumDisplayHeads\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numDisplayHeads), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numDisplayHeads,\n        \"nvmlVgpuTypeGetNumDisplayHeads\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuTypeGetResolution(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n    displayIndex: ::core::ffi::c_uint,\n    xdim: *mut ::core::ffi::c_uint,\n    ydim: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuTypeId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuTypeId,\n        \"nvmlVgpuTypeGetResolution\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(displayIndex), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &displayIndex,\n        \"nvmlVgpuTypeGetResolution\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xdim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xdim, \"nvmlVgpuTypeGetResolution\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ydim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ydim, \"nvmlVgpuTypeGetResolution\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuTypeGetLicense(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n    vgpuTypeLicenseString: *mut ::core::ffi::c_char,\n    size: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuTypeId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vgpuTypeId, \"nvmlVgpuTypeGetLicense\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vgpuTypeLicenseString), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuTypeLicenseString,\n        \"nvmlVgpuTypeGetLicense\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"nvmlVgpuTypeGetLicense\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuTypeGetFrameRateLimit(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n    frameRateLimit: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuTypeId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuTypeId,\n        \"nvmlVgpuTypeGetFrameRateLimit\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(frameRateLimit), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &frameRateLimit,\n        \"nvmlVgpuTypeGetFrameRateLimit\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuTypeGetMaxInstances(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n    vgpuInstanceCount: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlVgpuTypeGetMaxInstances\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vgpuTypeId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuTypeId,\n        \"nvmlVgpuTypeGetMaxInstances\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vgpuInstanceCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstanceCount,\n        \"nvmlVgpuTypeGetMaxInstances\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuTypeGetMaxInstancesPerVm(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n    vgpuInstanceCountPerVm: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuTypeId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuTypeId,\n        \"nvmlVgpuTypeGetMaxInstancesPerVm\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vgpuInstanceCountPerVm), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstanceCountPerVm,\n        \"nvmlVgpuTypeGetMaxInstancesPerVm\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuTypeGetBAR1Info(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n    bar1Info: *mut cuda_types::nvml::nvmlVgpuTypeBar1Info_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuTypeId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vgpuTypeId, \"nvmlVgpuTypeGetBAR1Info\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bar1Info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bar1Info, \"nvmlVgpuTypeGetBAR1Info\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetActiveVgpus(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    vgpuCount: *mut ::core::ffi::c_uint,\n    vgpuInstances: *mut cuda_types::nvml::nvmlVgpuInstance_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetActiveVgpus\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vgpuCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vgpuCount, \"nvmlDeviceGetActiveVgpus\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vgpuInstances), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstances,\n        \"nvmlDeviceGetActiveVgpus\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuInstanceGetVmID(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n    vmId: *mut ::core::ffi::c_char,\n    size: ::core::ffi::c_uint,\n    vmIdType: *mut cuda_types::nvml::nvmlVgpuVmIdType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstance,\n        \"nvmlVgpuInstanceGetVmID\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vmId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vmId, \"nvmlVgpuInstanceGetVmID\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"nvmlVgpuInstanceGetVmID\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vmIdType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vmIdType, \"nvmlVgpuInstanceGetVmID\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuInstanceGetUUID(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n    uuid: *mut ::core::ffi::c_char,\n    size: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstance,\n        \"nvmlVgpuInstanceGetUUID\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(uuid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&uuid, \"nvmlVgpuInstanceGetUUID\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"nvmlVgpuInstanceGetUUID\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuInstanceGetVmDriverVersion(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n    version: *mut ::core::ffi::c_char,\n    length: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstance,\n        \"nvmlVgpuInstanceGetVmDriverVersion\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(version), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &version,\n        \"nvmlVgpuInstanceGetVmDriverVersion\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(length), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &length,\n        \"nvmlVgpuInstanceGetVmDriverVersion\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuInstanceGetFbUsage(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n    fbUsage: *mut ::core::ffi::c_ulonglong,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstance,\n        \"nvmlVgpuInstanceGetFbUsage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fbUsage), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fbUsage, \"nvmlVgpuInstanceGetFbUsage\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuInstanceGetLicenseStatus(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n    licensed: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstance,\n        \"nvmlVgpuInstanceGetLicenseStatus\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(licensed), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &licensed,\n        \"nvmlVgpuInstanceGetLicenseStatus\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuInstanceGetType(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n    vgpuTypeId: *mut cuda_types::nvml::nvmlVgpuTypeId_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstance,\n        \"nvmlVgpuInstanceGetType\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vgpuTypeId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vgpuTypeId, \"nvmlVgpuInstanceGetType\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuInstanceGetFrameRateLimit(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n    frameRateLimit: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstance,\n        \"nvmlVgpuInstanceGetFrameRateLimit\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(frameRateLimit), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &frameRateLimit,\n        \"nvmlVgpuInstanceGetFrameRateLimit\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuInstanceGetEccMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n    eccMode: *mut cuda_types::nvml::nvmlEnableState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstance,\n        \"nvmlVgpuInstanceGetEccMode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(eccMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&eccMode, \"nvmlVgpuInstanceGetEccMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuInstanceGetEncoderCapacity(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n    encoderCapacity: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstance,\n        \"nvmlVgpuInstanceGetEncoderCapacity\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(encoderCapacity), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &encoderCapacity,\n        \"nvmlVgpuInstanceGetEncoderCapacity\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuInstanceSetEncoderCapacity(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n    encoderCapacity: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstance,\n        \"nvmlVgpuInstanceSetEncoderCapacity\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(encoderCapacity), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &encoderCapacity,\n        \"nvmlVgpuInstanceSetEncoderCapacity\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuInstanceGetEncoderStats(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n    sessionCount: *mut ::core::ffi::c_uint,\n    averageFps: *mut ::core::ffi::c_uint,\n    averageLatency: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstance,\n        \"nvmlVgpuInstanceGetEncoderStats\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sessionCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sessionCount,\n        \"nvmlVgpuInstanceGetEncoderStats\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(averageFps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &averageFps,\n        \"nvmlVgpuInstanceGetEncoderStats\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(averageLatency), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &averageLatency,\n        \"nvmlVgpuInstanceGetEncoderStats\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuInstanceGetEncoderSessions(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n    sessionCount: *mut ::core::ffi::c_uint,\n    sessionInfo: *mut cuda_types::nvml::nvmlEncoderSessionInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstance,\n        \"nvmlVgpuInstanceGetEncoderSessions\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sessionCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sessionCount,\n        \"nvmlVgpuInstanceGetEncoderSessions\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sessionInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sessionInfo,\n        \"nvmlVgpuInstanceGetEncoderSessions\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuInstanceGetFBCStats(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n    fbcStats: *mut cuda_types::nvml::nvmlFBCStats_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstance,\n        \"nvmlVgpuInstanceGetFBCStats\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fbcStats), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &fbcStats,\n        \"nvmlVgpuInstanceGetFBCStats\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuInstanceGetFBCSessions(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n    sessionCount: *mut ::core::ffi::c_uint,\n    sessionInfo: *mut cuda_types::nvml::nvmlFBCSessionInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstance,\n        \"nvmlVgpuInstanceGetFBCSessions\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sessionCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sessionCount,\n        \"nvmlVgpuInstanceGetFBCSessions\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sessionInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sessionInfo,\n        \"nvmlVgpuInstanceGetFBCSessions\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuInstanceGetGpuInstanceId(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n    gpuInstanceId: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstance,\n        \"nvmlVgpuInstanceGetGpuInstanceId\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gpuInstanceId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gpuInstanceId,\n        \"nvmlVgpuInstanceGetGpuInstanceId\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuInstanceGetGpuPciId(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n    vgpuPciId: *mut ::core::ffi::c_char,\n    length: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstance,\n        \"nvmlVgpuInstanceGetGpuPciId\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vgpuPciId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuPciId,\n        \"nvmlVgpuInstanceGetGpuPciId\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(length), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&length, \"nvmlVgpuInstanceGetGpuPciId\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuTypeGetCapabilities(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuTypeId: cuda_types::nvml::nvmlVgpuTypeId_t,\n    capability: cuda_types::nvml::nvmlVgpuCapability_t,\n    capResult: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuTypeId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuTypeId,\n        \"nvmlVgpuTypeGetCapabilities\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(capability), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &capability,\n        \"nvmlVgpuTypeGetCapabilities\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(capResult), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &capResult,\n        \"nvmlVgpuTypeGetCapabilities\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuInstanceGetMdevUUID(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n    mdevUuid: *mut ::core::ffi::c_char,\n    size: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstance,\n        \"nvmlVgpuInstanceGetMdevUUID\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mdevUuid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mdevUuid,\n        \"nvmlVgpuInstanceGetMdevUUID\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"nvmlVgpuInstanceGetMdevUUID\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGpuInstanceGetCreatableVgpus(\n    writer: &mut (impl std::io::Write + ?Sized),\n    gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n    pVgpus: *mut cuda_types::nvml::nvmlVgpuTypeIdInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(gpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gpuInstance,\n        \"nvmlGpuInstanceGetCreatableVgpus\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pVgpus), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pVgpus,\n        \"nvmlGpuInstanceGetCreatableVgpus\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuTypeGetMaxInstancesPerGpuInstance(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pMaxInstance: *mut cuda_types::nvml::nvmlVgpuTypeMaxInstance_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pMaxInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pMaxInstance,\n        \"nvmlVgpuTypeGetMaxInstancesPerGpuInstance\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGpuInstanceGetActiveVgpus(\n    writer: &mut (impl std::io::Write + ?Sized),\n    gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n    pVgpuInstanceInfo: *mut cuda_types::nvml::nvmlActiveVgpuInstanceInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(gpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gpuInstance,\n        \"nvmlGpuInstanceGetActiveVgpus\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pVgpuInstanceInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pVgpuInstanceInfo,\n        \"nvmlGpuInstanceGetActiveVgpus\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGpuInstanceSetVgpuSchedulerState(\n    writer: &mut (impl std::io::Write + ?Sized),\n    gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n    pScheduler: *mut cuda_types::nvml::nvmlVgpuSchedulerState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(gpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gpuInstance,\n        \"nvmlGpuInstanceSetVgpuSchedulerState\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pScheduler), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pScheduler,\n        \"nvmlGpuInstanceSetVgpuSchedulerState\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGpuInstanceGetVgpuSchedulerState(\n    writer: &mut (impl std::io::Write + ?Sized),\n    gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n    pSchedulerStateInfo: *mut cuda_types::nvml::nvmlVgpuSchedulerStateInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(gpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gpuInstance,\n        \"nvmlGpuInstanceGetVgpuSchedulerState\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pSchedulerStateInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pSchedulerStateInfo,\n        \"nvmlGpuInstanceGetVgpuSchedulerState\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGpuInstanceGetVgpuSchedulerLog(\n    writer: &mut (impl std::io::Write + ?Sized),\n    gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n    pSchedulerLogInfo: *mut cuda_types::nvml::nvmlVgpuSchedulerLogInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(gpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gpuInstance,\n        \"nvmlGpuInstanceGetVgpuSchedulerLog\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pSchedulerLogInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pSchedulerLogInfo,\n        \"nvmlGpuInstanceGetVgpuSchedulerLog\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGpuInstanceGetVgpuTypeCreatablePlacements(\n    writer: &mut (impl std::io::Write + ?Sized),\n    gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n    pCreatablePlacementInfo: *mut cuda_types::nvml::nvmlVgpuCreatablePlacementInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(gpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gpuInstance,\n        \"nvmlGpuInstanceGetVgpuTypeCreatablePlacements\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pCreatablePlacementInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pCreatablePlacementInfo,\n        \"nvmlGpuInstanceGetVgpuTypeCreatablePlacements\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGpuInstanceGetVgpuHeterogeneousMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n    pHeterogeneousMode: *mut cuda_types::nvml::nvmlVgpuHeterogeneousMode_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(gpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gpuInstance,\n        \"nvmlGpuInstanceGetVgpuHeterogeneousMode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pHeterogeneousMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pHeterogeneousMode,\n        \"nvmlGpuInstanceGetVgpuHeterogeneousMode\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGpuInstanceSetVgpuHeterogeneousMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n    pHeterogeneousMode: *const cuda_types::nvml::nvmlVgpuHeterogeneousMode_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(gpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gpuInstance,\n        \"nvmlGpuInstanceSetVgpuHeterogeneousMode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pHeterogeneousMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pHeterogeneousMode,\n        \"nvmlGpuInstanceSetVgpuHeterogeneousMode\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuVersion_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(minVersion), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.minVersion, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(maxVersion), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.maxVersion, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuMetadata_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(revision), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.revision, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(guestInfoState), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.guestInfoState, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(guestDriverVersion), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.guestDriverVersion, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(hostDriverVersion), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.hostDriverVersion, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(vgpuVirtualizationCaps), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.vgpuVirtualizationCaps, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(guestVgpuVersion), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.guestVgpuVersion, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(opaqueDataSize), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.opaqueDataSize, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(opaqueData), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.opaqueData, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuPgpuMetadata_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(revision), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.revision, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(hostDriverVersion), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.hostDriverVersion, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(pgpuVirtualizationCaps), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.pgpuVirtualizationCaps, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(hostSupportedVgpuRange), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.hostSupportedVgpuRange, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(opaqueDataSize), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.opaqueDataSize, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(opaqueData), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.opaqueData, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuVmCompatibility_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlVgpuVmCompatibility_enum::NVML_VGPU_VM_COMPATIBILITY_NONE => {\n                writer.write_all(stringify!(NVML_VGPU_VM_COMPATIBILITY_NONE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlVgpuVmCompatibility_enum::NVML_VGPU_VM_COMPATIBILITY_COLD => {\n                writer.write_all(stringify!(NVML_VGPU_VM_COMPATIBILITY_COLD).as_bytes())\n            }\n            &cuda_types::nvml::nvmlVgpuVmCompatibility_enum::NVML_VGPU_VM_COMPATIBILITY_HIBERNATE => {\n                writer\n                    .write_all(\n                        stringify!(NVML_VGPU_VM_COMPATIBILITY_HIBERNATE).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlVgpuVmCompatibility_enum::NVML_VGPU_VM_COMPATIBILITY_SLEEP => {\n                writer.write_all(stringify!(NVML_VGPU_VM_COMPATIBILITY_SLEEP).as_bytes())\n            }\n            &cuda_types::nvml::nvmlVgpuVmCompatibility_enum::NVML_VGPU_VM_COMPATIBILITY_LIVE => {\n                writer.write_all(stringify!(NVML_VGPU_VM_COMPATIBILITY_LIVE).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuPgpuCompatibilityLimitCode_enum {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlVgpuPgpuCompatibilityLimitCode_enum::NVML_VGPU_COMPATIBILITY_LIMIT_NONE => {\n                writer\n                    .write_all(stringify!(NVML_VGPU_COMPATIBILITY_LIMIT_NONE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlVgpuPgpuCompatibilityLimitCode_enum::NVML_VGPU_COMPATIBILITY_LIMIT_HOST_DRIVER => {\n                writer\n                    .write_all(\n                        stringify!(NVML_VGPU_COMPATIBILITY_LIMIT_HOST_DRIVER).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlVgpuPgpuCompatibilityLimitCode_enum::NVML_VGPU_COMPATIBILITY_LIMIT_GUEST_DRIVER => {\n                writer\n                    .write_all(\n                        stringify!(NVML_VGPU_COMPATIBILITY_LIMIT_GUEST_DRIVER).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlVgpuPgpuCompatibilityLimitCode_enum::NVML_VGPU_COMPATIBILITY_LIMIT_GPU => {\n                writer\n                    .write_all(stringify!(NVML_VGPU_COMPATIBILITY_LIMIT_GPU).as_bytes())\n            }\n            &cuda_types::nvml::nvmlVgpuPgpuCompatibilityLimitCode_enum::NVML_VGPU_COMPATIBILITY_LIMIT_OTHER => {\n                writer\n                    .write_all(\n                        stringify!(NVML_VGPU_COMPATIBILITY_LIMIT_OTHER).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuPgpuCompatibility_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer\n            .write_all(concat!(\"{ \", stringify!(vgpuVmCompatibility), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.vgpuVmCompatibility, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(compatibilityLimitCode), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.compatibilityLimitCode, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\npub fn write_nvmlVgpuInstanceGetMetadata(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n    vgpuMetadata: *mut cuda_types::nvml::nvmlVgpuMetadata_t,\n    bufferSize: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstance,\n        \"nvmlVgpuInstanceGetMetadata\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vgpuMetadata), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuMetadata,\n        \"nvmlVgpuInstanceGetMetadata\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bufferSize,\n        \"nvmlVgpuInstanceGetMetadata\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetVgpuMetadata(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    pgpuMetadata: *mut cuda_types::nvml::nvmlVgpuPgpuMetadata_t,\n    bufferSize: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetVgpuMetadata\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pgpuMetadata), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pgpuMetadata,\n        \"nvmlDeviceGetVgpuMetadata\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bufferSize,\n        \"nvmlDeviceGetVgpuMetadata\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGetVgpuCompatibility(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuMetadata: *mut cuda_types::nvml::nvmlVgpuMetadata_t,\n    pgpuMetadata: *mut cuda_types::nvml::nvmlVgpuPgpuMetadata_t,\n    compatibilityInfo: *mut cuda_types::nvml::nvmlVgpuPgpuCompatibility_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuMetadata), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuMetadata,\n        \"nvmlGetVgpuCompatibility\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pgpuMetadata), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pgpuMetadata,\n        \"nvmlGetVgpuCompatibility\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(compatibilityInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &compatibilityInfo,\n        \"nvmlGetVgpuCompatibility\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetPgpuMetadataString(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    pgpuMetadata: *mut ::core::ffi::c_char,\n    bufferSize: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetPgpuMetadataString\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pgpuMetadata), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pgpuMetadata,\n        \"nvmlDeviceGetPgpuMetadataString\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bufferSize,\n        \"nvmlDeviceGetPgpuMetadataString\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetVgpuSchedulerLog(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    pSchedulerLog: *mut cuda_types::nvml::nvmlVgpuSchedulerLog_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetVgpuSchedulerLog\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pSchedulerLog), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pSchedulerLog,\n        \"nvmlDeviceGetVgpuSchedulerLog\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetVgpuSchedulerState(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    pSchedulerState: *mut cuda_types::nvml::nvmlVgpuSchedulerGetState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetVgpuSchedulerState\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pSchedulerState), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pSchedulerState,\n        \"nvmlDeviceGetVgpuSchedulerState\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetVgpuSchedulerCapabilities(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    pCapabilities: *mut cuda_types::nvml::nvmlVgpuSchedulerCapabilities_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetVgpuSchedulerCapabilities\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pCapabilities), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pCapabilities,\n        \"nvmlDeviceGetVgpuSchedulerCapabilities\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceSetVgpuSchedulerState(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    pSchedulerState: *mut cuda_types::nvml::nvmlVgpuSchedulerSetState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceSetVgpuSchedulerState\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pSchedulerState), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pSchedulerState,\n        \"nvmlDeviceSetVgpuSchedulerState\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGetVgpuVersion(\n    writer: &mut (impl std::io::Write + ?Sized),\n    supported: *mut cuda_types::nvml::nvmlVgpuVersion_t,\n    current: *mut cuda_types::nvml::nvmlVgpuVersion_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(supported), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&supported, \"nvmlGetVgpuVersion\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(current), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&current, \"nvmlGetVgpuVersion\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlSetVgpuVersion(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuVersion: *mut cuda_types::nvml::nvmlVgpuVersion_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuVersion), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vgpuVersion, \"nvmlSetVgpuVersion\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetVgpuUtilization(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    lastSeenTimeStamp: ::core::ffi::c_ulonglong,\n    sampleValType: *mut cuda_types::nvml::nvmlValueType_t,\n    vgpuInstanceSamplesCount: *mut ::core::ffi::c_uint,\n    utilizationSamples: *mut cuda_types::nvml::nvmlVgpuInstanceUtilizationSample_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetVgpuUtilization\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lastSeenTimeStamp), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &lastSeenTimeStamp,\n        \"nvmlDeviceGetVgpuUtilization\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sampleValType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sampleValType,\n        \"nvmlDeviceGetVgpuUtilization\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vgpuInstanceSamplesCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstanceSamplesCount,\n        \"nvmlDeviceGetVgpuUtilization\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(utilizationSamples), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &utilizationSamples,\n        \"nvmlDeviceGetVgpuUtilization\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetVgpuInstancesUtilizationInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    vgpuUtilInfo: *mut cuda_types::nvml::nvmlVgpuInstancesUtilizationInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetVgpuInstancesUtilizationInfo\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vgpuUtilInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuUtilInfo,\n        \"nvmlDeviceGetVgpuInstancesUtilizationInfo\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetVgpuProcessUtilization(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    lastSeenTimeStamp: ::core::ffi::c_ulonglong,\n    vgpuProcessSamplesCount: *mut ::core::ffi::c_uint,\n    utilizationSamples: *mut cuda_types::nvml::nvmlVgpuProcessUtilizationSample_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetVgpuProcessUtilization\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lastSeenTimeStamp), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &lastSeenTimeStamp,\n        \"nvmlDeviceGetVgpuProcessUtilization\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vgpuProcessSamplesCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuProcessSamplesCount,\n        \"nvmlDeviceGetVgpuProcessUtilization\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(utilizationSamples), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &utilizationSamples,\n        \"nvmlDeviceGetVgpuProcessUtilization\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetVgpuProcessesUtilizationInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    vgpuProcUtilInfo: *mut cuda_types::nvml::nvmlVgpuProcessesUtilizationInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetVgpuProcessesUtilizationInfo\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vgpuProcUtilInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuProcUtilInfo,\n        \"nvmlDeviceGetVgpuProcessesUtilizationInfo\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuInstanceGetAccountingMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n    mode: *mut cuda_types::nvml::nvmlEnableState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstance,\n        \"nvmlVgpuInstanceGetAccountingMode\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mode,\n        \"nvmlVgpuInstanceGetAccountingMode\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuInstanceGetAccountingPids(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n    count: *mut ::core::ffi::c_uint,\n    pids: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstance,\n        \"nvmlVgpuInstanceGetAccountingPids\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &count,\n        \"nvmlVgpuInstanceGetAccountingPids\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pids), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pids,\n        \"nvmlVgpuInstanceGetAccountingPids\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuInstanceGetAccountingStats(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n    pid: ::core::ffi::c_uint,\n    stats: *mut cuda_types::nvml::nvmlAccountingStats_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstance,\n        \"nvmlVgpuInstanceGetAccountingStats\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pid), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pid,\n        \"nvmlVgpuInstanceGetAccountingStats\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(stats), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &stats,\n        \"nvmlVgpuInstanceGetAccountingStats\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuInstanceClearAccountingPids(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstance,\n        \"nvmlVgpuInstanceClearAccountingPids\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuInstanceGetLicenseInfo_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n    licenseInfo: *mut cuda_types::nvml::nvmlVgpuLicenseInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstance,\n        \"nvmlVgpuInstanceGetLicenseInfo_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(licenseInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &licenseInfo,\n        \"nvmlVgpuInstanceGetLicenseInfo_v2\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlExcludedDeviceInfo_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(pciInfo), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.pciInfo, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(uuid), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.uuid, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\npub fn write_nvmlGetExcludedDeviceCount(\n    writer: &mut (impl std::io::Write + ?Sized),\n    deviceCount: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(deviceCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &deviceCount,\n        \"nvmlGetExcludedDeviceCount\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGetExcludedDeviceInfoByIndex(\n    writer: &mut (impl std::io::Write + ?Sized),\n    index: ::core::ffi::c_uint,\n    info: *mut cuda_types::nvml::nvmlExcludedDeviceInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(index), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &index,\n        \"nvmlGetExcludedDeviceInfoByIndex\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"nvmlGetExcludedDeviceInfoByIndex\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceReadWritePRM_v1(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    buffer: *mut cuda_types::nvml::nvmlPRMTLV_v1_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceReadWritePRM_v1\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(buffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&buffer, \"nvmlDeviceReadWritePRM_v1\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlGpuInstancePlacement_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(start), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.start, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(size), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.size, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlGpuInstanceProfileInfo_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(id), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.id, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(isP2pSupported), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.isP2pSupported, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sliceCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sliceCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(instanceCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.instanceCount, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(multiprocessorCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.multiprocessorCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(copyEngineCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.copyEngineCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(decoderCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.decoderCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(encoderCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.encoderCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(jpegCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.jpegCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(ofaCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.ofaCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(memorySizeMB), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.memorySizeMB, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlGpuInstanceProfileInfo_v2_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(id), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.id, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(isP2pSupported), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.isP2pSupported, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sliceCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sliceCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(instanceCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.instanceCount, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(multiprocessorCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.multiprocessorCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(copyEngineCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.copyEngineCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(decoderCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.decoderCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(encoderCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.encoderCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(jpegCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.jpegCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(ofaCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.ofaCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(memorySizeMB), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.memorySizeMB, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(name), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.name, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlGpuInstanceProfileInfo_v3_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(id), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.id, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sliceCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sliceCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(instanceCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.instanceCount, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(multiprocessorCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.multiprocessorCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(copyEngineCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.copyEngineCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(decoderCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.decoderCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(encoderCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.encoderCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(jpegCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.jpegCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(ofaCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.ofaCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(memorySizeMB), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.memorySizeMB, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(name), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.name, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(capabilities), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.capabilities, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlGpuInstanceInfo_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(device), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.device, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(id), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.id, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(profileId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.profileId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(placement), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.placement, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlComputeInstancePlacement_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(start), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.start, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(size), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.size, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlComputeInstanceProfileInfo_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(id), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.id, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sliceCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sliceCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(instanceCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.instanceCount, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(multiprocessorCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.multiprocessorCount, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(sharedCopyEngineCount), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.sharedCopyEngineCount, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(sharedDecoderCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sharedDecoderCount, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(sharedEncoderCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sharedEncoderCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sharedJpegCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sharedJpegCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sharedOfaCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sharedOfaCount, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlComputeInstanceProfileInfo_v2_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(id), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.id, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sliceCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sliceCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(instanceCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.instanceCount, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(multiprocessorCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.multiprocessorCount, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(sharedCopyEngineCount), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.sharedCopyEngineCount, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(sharedDecoderCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sharedDecoderCount, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(sharedEncoderCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sharedEncoderCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sharedJpegCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sharedJpegCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sharedOfaCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sharedOfaCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(name), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.name, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlComputeInstanceProfileInfo_v3_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(id), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.id, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sliceCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sliceCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(instanceCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.instanceCount, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(multiprocessorCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.multiprocessorCount, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(sharedCopyEngineCount), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.sharedCopyEngineCount, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(sharedDecoderCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sharedDecoderCount, \"\", 0, writer)?;\n        writer\n            .write_all(concat!(\", \", stringify!(sharedEncoderCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sharedEncoderCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sharedJpegCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sharedJpegCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sharedOfaCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sharedOfaCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(name), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.name, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(capabilities), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.capabilities, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlComputeInstanceInfo_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(device), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.device, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(gpuInstance), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.gpuInstance, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(id), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.id, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(profileId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.profileId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(placement), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.placement, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlComputeInstance_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\npub fn write_nvmlDeviceSetMigMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    mode: ::core::ffi::c_uint,\n    activationStatus: *mut cuda_types::nvml::nvmlReturn_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceSetMigMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"nvmlDeviceSetMigMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(activationStatus), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &activationStatus,\n        \"nvmlDeviceSetMigMode\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetMigMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    currentMode: *mut ::core::ffi::c_uint,\n    pendingMode: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetMigMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(currentMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&currentMode, \"nvmlDeviceGetMigMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pendingMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pendingMode, \"nvmlDeviceGetMigMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetGpuInstanceProfileInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    profile: ::core::ffi::c_uint,\n    info: *mut cuda_types::nvml::nvmlGpuInstanceProfileInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetGpuInstanceProfileInfo\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(profile), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &profile,\n        \"nvmlDeviceGetGpuInstanceProfileInfo\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"nvmlDeviceGetGpuInstanceProfileInfo\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetGpuInstanceProfileInfoV(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    profile: ::core::ffi::c_uint,\n    info: *mut cuda_types::nvml::nvmlGpuInstanceProfileInfo_v2_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetGpuInstanceProfileInfoV\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(profile), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &profile,\n        \"nvmlDeviceGetGpuInstanceProfileInfoV\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"nvmlDeviceGetGpuInstanceProfileInfoV\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetGpuInstanceProfileInfoByIdV(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    profileId: ::core::ffi::c_uint,\n    info: *mut cuda_types::nvml::nvmlGpuInstanceProfileInfo_v2_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetGpuInstanceProfileInfoByIdV\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(profileId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &profileId,\n        \"nvmlDeviceGetGpuInstanceProfileInfoByIdV\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"nvmlDeviceGetGpuInstanceProfileInfoByIdV\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetGpuInstancePossiblePlacements_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    profileId: ::core::ffi::c_uint,\n    placements: *mut cuda_types::nvml::nvmlGpuInstancePlacement_t,\n    count: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetGpuInstancePossiblePlacements_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(profileId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &profileId,\n        \"nvmlDeviceGetGpuInstancePossiblePlacements_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(placements), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &placements,\n        \"nvmlDeviceGetGpuInstancePossiblePlacements_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &count,\n        \"nvmlDeviceGetGpuInstancePossiblePlacements_v2\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetGpuInstanceRemainingCapacity(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    profileId: ::core::ffi::c_uint,\n    count: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetGpuInstanceRemainingCapacity\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(profileId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &profileId,\n        \"nvmlDeviceGetGpuInstanceRemainingCapacity\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &count,\n        \"nvmlDeviceGetGpuInstanceRemainingCapacity\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceCreateGpuInstance(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    profileId: ::core::ffi::c_uint,\n    gpuInstance: *mut cuda_types::nvml::nvmlGpuInstance_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceCreateGpuInstance\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(profileId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &profileId,\n        \"nvmlDeviceCreateGpuInstance\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gpuInstance,\n        \"nvmlDeviceCreateGpuInstance\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceCreateGpuInstanceWithPlacement(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    profileId: ::core::ffi::c_uint,\n    placement: *const cuda_types::nvml::nvmlGpuInstancePlacement_t,\n    gpuInstance: *mut cuda_types::nvml::nvmlGpuInstance_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceCreateGpuInstanceWithPlacement\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(profileId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &profileId,\n        \"nvmlDeviceCreateGpuInstanceWithPlacement\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(placement), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &placement,\n        \"nvmlDeviceCreateGpuInstanceWithPlacement\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gpuInstance,\n        \"nvmlDeviceCreateGpuInstanceWithPlacement\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGpuInstanceDestroy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(gpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&gpuInstance, \"nvmlGpuInstanceDestroy\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetGpuInstances(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    profileId: ::core::ffi::c_uint,\n    gpuInstances: *mut cuda_types::nvml::nvmlGpuInstance_t,\n    count: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetGpuInstances\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(profileId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&profileId, \"nvmlDeviceGetGpuInstances\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gpuInstances), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gpuInstances,\n        \"nvmlDeviceGetGpuInstances\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&count, \"nvmlDeviceGetGpuInstances\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetGpuInstanceById(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    id: ::core::ffi::c_uint,\n    gpuInstance: *mut cuda_types::nvml::nvmlGpuInstance_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetGpuInstanceById\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(id), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&id, \"nvmlDeviceGetGpuInstanceById\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gpuInstance,\n        \"nvmlDeviceGetGpuInstanceById\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGpuInstanceGetInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n    info: *mut cuda_types::nvml::nvmlGpuInstanceInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(gpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&gpuInstance, \"nvmlGpuInstanceGetInfo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"nvmlGpuInstanceGetInfo\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGpuInstanceGetComputeInstanceProfileInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n    profile: ::core::ffi::c_uint,\n    engProfile: ::core::ffi::c_uint,\n    info: *mut cuda_types::nvml::nvmlComputeInstanceProfileInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(gpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gpuInstance,\n        \"nvmlGpuInstanceGetComputeInstanceProfileInfo\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(profile), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &profile,\n        \"nvmlGpuInstanceGetComputeInstanceProfileInfo\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(engProfile), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &engProfile,\n        \"nvmlGpuInstanceGetComputeInstanceProfileInfo\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"nvmlGpuInstanceGetComputeInstanceProfileInfo\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGpuInstanceGetComputeInstanceProfileInfoV(\n    writer: &mut (impl std::io::Write + ?Sized),\n    gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n    profile: ::core::ffi::c_uint,\n    engProfile: ::core::ffi::c_uint,\n    info: *mut cuda_types::nvml::nvmlComputeInstanceProfileInfo_v2_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(gpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gpuInstance,\n        \"nvmlGpuInstanceGetComputeInstanceProfileInfoV\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(profile), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &profile,\n        \"nvmlGpuInstanceGetComputeInstanceProfileInfoV\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(engProfile), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &engProfile,\n        \"nvmlGpuInstanceGetComputeInstanceProfileInfoV\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"nvmlGpuInstanceGetComputeInstanceProfileInfoV\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGpuInstanceGetComputeInstanceRemainingCapacity(\n    writer: &mut (impl std::io::Write + ?Sized),\n    gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n    profileId: ::core::ffi::c_uint,\n    count: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(gpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gpuInstance,\n        \"nvmlGpuInstanceGetComputeInstanceRemainingCapacity\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(profileId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &profileId,\n        \"nvmlGpuInstanceGetComputeInstanceRemainingCapacity\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &count,\n        \"nvmlGpuInstanceGetComputeInstanceRemainingCapacity\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGpuInstanceGetComputeInstancePossiblePlacements(\n    writer: &mut (impl std::io::Write + ?Sized),\n    gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n    profileId: ::core::ffi::c_uint,\n    placements: *mut cuda_types::nvml::nvmlComputeInstancePlacement_t,\n    count: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(gpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gpuInstance,\n        \"nvmlGpuInstanceGetComputeInstancePossiblePlacements\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(profileId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &profileId,\n        \"nvmlGpuInstanceGetComputeInstancePossiblePlacements\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(placements), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &placements,\n        \"nvmlGpuInstanceGetComputeInstancePossiblePlacements\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &count,\n        \"nvmlGpuInstanceGetComputeInstancePossiblePlacements\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGpuInstanceCreateComputeInstance(\n    writer: &mut (impl std::io::Write + ?Sized),\n    gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n    profileId: ::core::ffi::c_uint,\n    computeInstance: *mut cuda_types::nvml::nvmlComputeInstance_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(gpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gpuInstance,\n        \"nvmlGpuInstanceCreateComputeInstance\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(profileId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &profileId,\n        \"nvmlGpuInstanceCreateComputeInstance\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &computeInstance,\n        \"nvmlGpuInstanceCreateComputeInstance\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGpuInstanceCreateComputeInstanceWithPlacement(\n    writer: &mut (impl std::io::Write + ?Sized),\n    gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n    profileId: ::core::ffi::c_uint,\n    placement: *const cuda_types::nvml::nvmlComputeInstancePlacement_t,\n    computeInstance: *mut cuda_types::nvml::nvmlComputeInstance_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(gpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gpuInstance,\n        \"nvmlGpuInstanceCreateComputeInstanceWithPlacement\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(profileId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &profileId,\n        \"nvmlGpuInstanceCreateComputeInstanceWithPlacement\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(placement), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &placement,\n        \"nvmlGpuInstanceCreateComputeInstanceWithPlacement\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &computeInstance,\n        \"nvmlGpuInstanceCreateComputeInstanceWithPlacement\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlComputeInstanceDestroy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    computeInstance: cuda_types::nvml::nvmlComputeInstance_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(computeInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &computeInstance,\n        \"nvmlComputeInstanceDestroy\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGpuInstanceGetComputeInstances(\n    writer: &mut (impl std::io::Write + ?Sized),\n    gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n    profileId: ::core::ffi::c_uint,\n    computeInstances: *mut cuda_types::nvml::nvmlComputeInstance_t,\n    count: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(gpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gpuInstance,\n        \"nvmlGpuInstanceGetComputeInstances\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(profileId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &profileId,\n        \"nvmlGpuInstanceGetComputeInstances\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeInstances), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &computeInstances,\n        \"nvmlGpuInstanceGetComputeInstances\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &count,\n        \"nvmlGpuInstanceGetComputeInstances\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGpuInstanceGetComputeInstanceById(\n    writer: &mut (impl std::io::Write + ?Sized),\n    gpuInstance: cuda_types::nvml::nvmlGpuInstance_t,\n    id: ::core::ffi::c_uint,\n    computeInstance: *mut cuda_types::nvml::nvmlComputeInstance_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(gpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gpuInstance,\n        \"nvmlGpuInstanceGetComputeInstanceById\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(id), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &id,\n        \"nvmlGpuInstanceGetComputeInstanceById\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &computeInstance,\n        \"nvmlGpuInstanceGetComputeInstanceById\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlComputeInstanceGetInfo_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    computeInstance: cuda_types::nvml::nvmlComputeInstance_t,\n    info: *mut cuda_types::nvml::nvmlComputeInstanceInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(computeInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &computeInstance,\n        \"nvmlComputeInstanceGetInfo_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"nvmlComputeInstanceGetInfo_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceIsMigDeviceHandle(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    isMigDevice: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceIsMigDeviceHandle\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(isMigDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &isMigDevice,\n        \"nvmlDeviceIsMigDeviceHandle\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetGpuInstanceId(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    id: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetGpuInstanceId\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(id), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&id, \"nvmlDeviceGetGpuInstanceId\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetComputeInstanceId(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    id: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetComputeInstanceId\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(id), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&id, \"nvmlDeviceGetComputeInstanceId\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetMaxMigDeviceCount(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    count: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetMaxMigDeviceCount\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &count,\n        \"nvmlDeviceGetMaxMigDeviceCount\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetMigDeviceHandleByIndex(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    index: ::core::ffi::c_uint,\n    migDevice: *mut cuda_types::nvml::nvmlDevice_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetMigDeviceHandleByIndex\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(index), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &index,\n        \"nvmlDeviceGetMigDeviceHandleByIndex\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(migDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &migDevice,\n        \"nvmlDeviceGetMigDeviceHandleByIndex\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetDeviceHandleFromMigDeviceHandle(\n    writer: &mut (impl std::io::Write + ?Sized),\n    migDevice: cuda_types::nvml::nvmlDevice_t,\n    device: *mut cuda_types::nvml::nvmlDevice_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(migDevice), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &migDevice,\n        \"nvmlDeviceGetDeviceHandleFromMigDeviceHandle\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetDeviceHandleFromMigDeviceHandle\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlGpmMetricId_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GRAPHICS_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_GRAPHICS_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_SM_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_SM_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_SM_OCCUPANCY => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_SM_OCCUPANCY).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_INTEGER_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_INTEGER_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_ANY_TENSOR_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_ANY_TENSOR_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_DFMA_TENSOR_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_DFMA_TENSOR_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_HMMA_TENSOR_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_HMMA_TENSOR_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_IMMA_TENSOR_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_IMMA_TENSOR_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_DRAM_BW_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_DRAM_BW_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_FP64_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_FP64_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_FP32_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_FP32_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_FP16_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_FP16_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_PCIE_TX_PER_SEC => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_PCIE_TX_PER_SEC).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_PCIE_RX_PER_SEC => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_PCIE_RX_PER_SEC).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVDEC_0_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_NVDEC_0_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVDEC_1_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_NVDEC_1_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVDEC_2_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_NVDEC_2_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVDEC_3_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_NVDEC_3_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVDEC_4_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_NVDEC_4_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVDEC_5_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_NVDEC_5_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVDEC_6_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_NVDEC_6_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVDEC_7_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_NVDEC_7_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVJPG_0_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_NVJPG_0_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVJPG_1_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_NVJPG_1_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVJPG_2_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_NVJPG_2_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVJPG_3_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_NVJPG_3_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVJPG_4_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_NVJPG_4_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVJPG_5_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_NVJPG_5_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVJPG_6_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_NVJPG_6_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVJPG_7_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_NVJPG_7_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVOFA_0_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_NVOFA_0_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVOFA_1_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_NVOFA_1_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_TOTAL_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_TOTAL_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_TOTAL_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_TOTAL_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L0_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L0_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L0_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L0_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L1_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L1_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L1_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L1_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L2_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L2_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L2_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L2_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L3_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L3_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L3_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L3_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L4_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L4_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L4_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L4_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L5_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L5_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L5_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L5_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L6_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L6_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L6_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L6_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L7_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L7_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L7_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L7_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L8_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L8_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L8_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L8_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L9_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L9_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L9_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L9_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L10_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L10_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L10_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L10_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L11_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L11_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L11_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L11_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L12_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L12_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L12_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L12_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L13_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L13_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L13_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L13_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L14_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L14_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L14_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L14_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L15_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L15_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L15_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L15_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L16_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L16_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L16_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L16_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L17_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L17_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVLINK_L17_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_NVLINK_L17_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_TOTAL_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_TOTAL_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_TOTAL_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_TOTAL_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_DATA_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_DATA_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_DATA_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_DATA_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK0_TOTAL_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK0_TOTAL_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK0_TOTAL_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK0_TOTAL_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK0_DATA_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK0_DATA_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK0_DATA_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK0_DATA_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK1_TOTAL_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK1_TOTAL_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK1_TOTAL_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK1_TOTAL_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK1_DATA_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK1_DATA_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK1_DATA_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK1_DATA_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK2_TOTAL_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK2_TOTAL_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK2_TOTAL_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK2_TOTAL_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK2_DATA_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK2_DATA_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK2_DATA_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK2_DATA_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK3_TOTAL_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK3_TOTAL_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK3_TOTAL_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK3_TOTAL_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK3_DATA_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK3_DATA_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK3_DATA_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK3_DATA_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK4_TOTAL_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK4_TOTAL_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK4_TOTAL_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK4_TOTAL_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK4_DATA_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK4_DATA_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK4_DATA_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK4_DATA_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK5_TOTAL_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK5_TOTAL_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK5_TOTAL_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK5_TOTAL_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK5_DATA_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK5_DATA_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK5_DATA_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK5_DATA_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK6_TOTAL_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK6_TOTAL_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK6_TOTAL_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK6_TOTAL_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK6_DATA_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK6_DATA_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK6_DATA_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK6_DATA_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK7_TOTAL_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK7_TOTAL_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK7_TOTAL_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK7_TOTAL_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK7_DATA_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK7_DATA_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK7_DATA_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK7_DATA_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK8_TOTAL_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK8_TOTAL_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK8_TOTAL_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK8_TOTAL_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK8_DATA_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK8_DATA_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK8_DATA_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK8_DATA_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK9_TOTAL_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK9_TOTAL_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK9_TOTAL_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK9_TOTAL_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK9_DATA_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK9_DATA_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK9_DATA_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK9_DATA_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK10_TOTAL_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK10_TOTAL_TX_PER_SEC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK10_TOTAL_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK10_TOTAL_RX_PER_SEC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK10_DATA_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK10_DATA_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK10_DATA_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK10_DATA_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK11_TOTAL_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK11_TOTAL_TX_PER_SEC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK11_TOTAL_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK11_TOTAL_RX_PER_SEC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK11_DATA_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK11_DATA_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK11_DATA_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK11_DATA_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK12_TOTAL_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK12_TOTAL_TX_PER_SEC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK12_TOTAL_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK12_TOTAL_RX_PER_SEC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK12_DATA_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK12_DATA_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK12_DATA_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK12_DATA_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK13_TOTAL_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK13_TOTAL_TX_PER_SEC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK13_TOTAL_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK13_TOTAL_RX_PER_SEC)\n                            .as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK13_DATA_TX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK13_DATA_TX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_C2C_LINK13_DATA_RX_PER_SEC => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_C2C_LINK13_DATA_RX_PER_SEC).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_HOSTMEM_CACHE_HIT => {\n                writer\n                    .write_all(stringify!(NVML_GPM_METRIC_HOSTMEM_CACHE_HIT).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_HOSTMEM_CACHE_MISS => {\n                writer\n                    .write_all(stringify!(NVML_GPM_METRIC_HOSTMEM_CACHE_MISS).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_PEERMEM_CACHE_HIT => {\n                writer\n                    .write_all(stringify!(NVML_GPM_METRIC_PEERMEM_CACHE_HIT).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_PEERMEM_CACHE_MISS => {\n                writer\n                    .write_all(stringify!(NVML_GPM_METRIC_PEERMEM_CACHE_MISS).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_DRAM_CACHE_HIT => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_DRAM_CACHE_HIT).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_DRAM_CACHE_MISS => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_DRAM_CACHE_MISS).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVENC_0_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_NVENC_0_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVENC_1_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_NVENC_1_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVENC_2_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_NVENC_2_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_NVENC_3_UTIL => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_NVENC_3_UTIL).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR0_CTXSW_CYCLES_ELAPSED => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR0_CTXSW_CYCLES_ELAPSED).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR0_CTXSW_CYCLES_ACTIVE => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR0_CTXSW_CYCLES_ACTIVE).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR0_CTXSW_REQUESTS => {\n                writer\n                    .write_all(stringify!(NVML_GPM_METRIC_GR0_CTXSW_REQUESTS).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR0_CTXSW_CYCLES_PER_REQ => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR0_CTXSW_CYCLES_PER_REQ).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR0_CTXSW_ACTIVE_PCT => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR0_CTXSW_ACTIVE_PCT).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR1_CTXSW_CYCLES_ELAPSED => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR1_CTXSW_CYCLES_ELAPSED).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR1_CTXSW_CYCLES_ACTIVE => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR1_CTXSW_CYCLES_ACTIVE).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR1_CTXSW_REQUESTS => {\n                writer\n                    .write_all(stringify!(NVML_GPM_METRIC_GR1_CTXSW_REQUESTS).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR1_CTXSW_CYCLES_PER_REQ => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR1_CTXSW_CYCLES_PER_REQ).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR1_CTXSW_ACTIVE_PCT => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR1_CTXSW_ACTIVE_PCT).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR2_CTXSW_CYCLES_ELAPSED => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR2_CTXSW_CYCLES_ELAPSED).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR2_CTXSW_CYCLES_ACTIVE => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR2_CTXSW_CYCLES_ACTIVE).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR2_CTXSW_REQUESTS => {\n                writer\n                    .write_all(stringify!(NVML_GPM_METRIC_GR2_CTXSW_REQUESTS).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR2_CTXSW_CYCLES_PER_REQ => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR2_CTXSW_CYCLES_PER_REQ).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR2_CTXSW_ACTIVE_PCT => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR2_CTXSW_ACTIVE_PCT).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR3_CTXSW_CYCLES_ELAPSED => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR3_CTXSW_CYCLES_ELAPSED).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR3_CTXSW_CYCLES_ACTIVE => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR3_CTXSW_CYCLES_ACTIVE).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR3_CTXSW_REQUESTS => {\n                writer\n                    .write_all(stringify!(NVML_GPM_METRIC_GR3_CTXSW_REQUESTS).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR3_CTXSW_CYCLES_PER_REQ => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR3_CTXSW_CYCLES_PER_REQ).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR3_CTXSW_ACTIVE_PCT => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR3_CTXSW_ACTIVE_PCT).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR4_CTXSW_CYCLES_ELAPSED => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR4_CTXSW_CYCLES_ELAPSED).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR4_CTXSW_CYCLES_ACTIVE => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR4_CTXSW_CYCLES_ACTIVE).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR4_CTXSW_REQUESTS => {\n                writer\n                    .write_all(stringify!(NVML_GPM_METRIC_GR4_CTXSW_REQUESTS).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR4_CTXSW_CYCLES_PER_REQ => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR4_CTXSW_CYCLES_PER_REQ).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR4_CTXSW_ACTIVE_PCT => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR4_CTXSW_ACTIVE_PCT).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR5_CTXSW_CYCLES_ELAPSED => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR5_CTXSW_CYCLES_ELAPSED).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR5_CTXSW_CYCLES_ACTIVE => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR5_CTXSW_CYCLES_ACTIVE).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR5_CTXSW_REQUESTS => {\n                writer\n                    .write_all(stringify!(NVML_GPM_METRIC_GR5_CTXSW_REQUESTS).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR5_CTXSW_CYCLES_PER_REQ => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR5_CTXSW_CYCLES_PER_REQ).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR5_CTXSW_ACTIVE_PCT => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR5_CTXSW_ACTIVE_PCT).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR6_CTXSW_CYCLES_ELAPSED => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR6_CTXSW_CYCLES_ELAPSED).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR6_CTXSW_CYCLES_ACTIVE => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR6_CTXSW_CYCLES_ACTIVE).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR6_CTXSW_REQUESTS => {\n                writer\n                    .write_all(stringify!(NVML_GPM_METRIC_GR6_CTXSW_REQUESTS).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR6_CTXSW_CYCLES_PER_REQ => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR6_CTXSW_CYCLES_PER_REQ).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR6_CTXSW_ACTIVE_PCT => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR6_CTXSW_ACTIVE_PCT).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR7_CTXSW_CYCLES_ELAPSED => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR7_CTXSW_CYCLES_ELAPSED).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR7_CTXSW_CYCLES_ACTIVE => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR7_CTXSW_CYCLES_ACTIVE).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR7_CTXSW_REQUESTS => {\n                writer\n                    .write_all(stringify!(NVML_GPM_METRIC_GR7_CTXSW_REQUESTS).as_bytes())\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR7_CTXSW_CYCLES_PER_REQ => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR7_CTXSW_CYCLES_PER_REQ).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_GR7_CTXSW_ACTIVE_PCT => {\n                writer\n                    .write_all(\n                        stringify!(NVML_GPM_METRIC_GR7_CTXSW_ACTIVE_PCT).as_bytes(),\n                    )\n            }\n            &cuda_types::nvml::nvmlGpmMetricId_t::NVML_GPM_METRIC_MAX => {\n                writer.write_all(stringify!(NVML_GPM_METRIC_MAX).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlGpmSample_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlGpmMetric_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(metricId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.metricId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(nvmlReturn), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.nvmlReturn, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(value), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.value, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(metricInfo), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.metricInfo, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlGpmMetric_t__bindgen_ty_1 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(shortName), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.shortName, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(longName), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.longName, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(unit), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.unit, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlGpmMetricsGet_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(numMetrics), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.numMetrics, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sample1), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sample1, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sample2), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sample2, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(metrics), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.metrics, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlGpmSupport_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(isSupportedDevice), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.isSupportedDevice, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\npub fn write_nvmlGpmMetricsGet(\n    writer: &mut (impl std::io::Write + ?Sized),\n    metricsGet: *mut cuda_types::nvml::nvmlGpmMetricsGet_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(metricsGet), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&metricsGet, \"nvmlGpmMetricsGet\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGpmSampleFree(\n    writer: &mut (impl std::io::Write + ?Sized),\n    gpmSample: cuda_types::nvml::nvmlGpmSample_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(gpmSample), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&gpmSample, \"nvmlGpmSampleFree\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGpmSampleAlloc(\n    writer: &mut (impl std::io::Write + ?Sized),\n    gpmSample: *mut cuda_types::nvml::nvmlGpmSample_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(gpmSample), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&gpmSample, \"nvmlGpmSampleAlloc\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGpmSampleGet(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    gpmSample: cuda_types::nvml::nvmlGpmSample_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlGpmSampleGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gpmSample), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&gpmSample, \"nvmlGpmSampleGet\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGpmMigSampleGet(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    gpuInstanceId: ::core::ffi::c_uint,\n    gpmSample: cuda_types::nvml::nvmlGpmSample_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlGpmMigSampleGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gpuInstanceId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&gpuInstanceId, \"nvmlGpmMigSampleGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gpmSample), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&gpmSample, \"nvmlGpmMigSampleGet\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGpmQueryDeviceSupport(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    gpmSupport: *mut cuda_types::nvml::nvmlGpmSupport_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlGpmQueryDeviceSupport\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(gpmSupport), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &gpmSupport,\n        \"nvmlGpmQueryDeviceSupport\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGpmQueryIfStreamingEnabled(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    state: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlGpmQueryIfStreamingEnabled\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(state), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &state,\n        \"nvmlGpmQueryIfStreamingEnabled\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlGpmSetStreamingEnabled(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    state: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlGpmSetStreamingEnabled\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(state), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&state, \"nvmlGpmSetStreamingEnabled\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlDeviceCapabilities_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(capMask), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.capMask, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\npub fn write_nvmlDeviceGetCapabilities(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    caps: *mut cuda_types::nvml::nvmlDeviceCapabilities_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetCapabilities\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(caps), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&caps, \"nvmlDeviceGetCapabilities\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlMask255_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(mask), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.mask, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlPowerProfileType_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::nvml::nvmlPowerProfileType_t::NVML_POWER_PROFILE_MAX_P => {\n                writer.write_all(stringify!(NVML_POWER_PROFILE_MAX_P).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPowerProfileType_t::NVML_POWER_PROFILE_MAX_Q => {\n                writer.write_all(stringify!(NVML_POWER_PROFILE_MAX_Q).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPowerProfileType_t::NVML_POWER_PROFILE_COMPUTE => {\n                writer.write_all(stringify!(NVML_POWER_PROFILE_COMPUTE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPowerProfileType_t::NVML_POWER_PROFILE_MEMORY_BOUND => {\n                writer.write_all(stringify!(NVML_POWER_PROFILE_MEMORY_BOUND).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPowerProfileType_t::NVML_POWER_PROFILE_NETWORK => {\n                writer.write_all(stringify!(NVML_POWER_PROFILE_NETWORK).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPowerProfileType_t::NVML_POWER_PROFILE_BALANCED => {\n                writer.write_all(stringify!(NVML_POWER_PROFILE_BALANCED).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPowerProfileType_t::NVML_POWER_PROFILE_LLM_INFERENCE => {\n                writer.write_all(stringify!(NVML_POWER_PROFILE_LLM_INFERENCE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPowerProfileType_t::NVML_POWER_PROFILE_LLM_TRAINING => {\n                writer.write_all(stringify!(NVML_POWER_PROFILE_LLM_TRAINING).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPowerProfileType_t::NVML_POWER_PROFILE_RBM => {\n                writer.write_all(stringify!(NVML_POWER_PROFILE_RBM).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPowerProfileType_t::NVML_POWER_PROFILE_DCPCIE => {\n                writer.write_all(stringify!(NVML_POWER_PROFILE_DCPCIE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPowerProfileType_t::NVML_POWER_PROFILE_HMMA_SPARSE => {\n                writer.write_all(stringify!(NVML_POWER_PROFILE_HMMA_SPARSE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPowerProfileType_t::NVML_POWER_PROFILE_HMMA_DENSE => {\n                writer.write_all(stringify!(NVML_POWER_PROFILE_HMMA_DENSE).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPowerProfileType_t::NVML_POWER_PROFILE_SYNC_BALANCED => {\n                writer.write_all(stringify!(NVML_POWER_PROFILE_SYNC_BALANCED).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPowerProfileType_t::NVML_POWER_PROFILE_HPC => {\n                writer.write_all(stringify!(NVML_POWER_PROFILE_HPC).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPowerProfileType_t::NVML_POWER_PROFILE_MIG => {\n                writer.write_all(stringify!(NVML_POWER_PROFILE_MIG).as_bytes())\n            }\n            &cuda_types::nvml::nvmlPowerProfileType_t::NVML_POWER_PROFILE_MAX => {\n                writer.write_all(stringify!(NVML_POWER_PROFILE_MAX).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlWorkloadPowerProfileInfo_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(profileId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.profileId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(priority), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.priority, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(conflictingMask), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.conflictingMask, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlWorkloadPowerProfileProfilesInfo_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(perfProfilesMask), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.perfProfilesMask, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(perfProfile), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.perfProfile, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::nvml::nvmlWorkloadPowerProfileCurrentProfiles_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(perfProfilesMask), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.perfProfilesMask, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(requestedProfilesMask), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.requestedProfilesMask, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(enforcedProfilesMask), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.enforcedProfilesMask, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay\nfor cuda_types::nvml::nvmlWorkloadPowerProfileRequestedProfiles_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer\n            .write_all(\n                concat!(\", \", stringify!(requestedProfilesMask), \": \").as_bytes(),\n            )?;\n        crate::CudaDisplay::write(&self.requestedProfilesMask, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\npub fn write_nvmlDeviceWorkloadPowerProfileGetProfilesInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    profilesInfo: *mut cuda_types::nvml::nvmlWorkloadPowerProfileProfilesInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceWorkloadPowerProfileGetProfilesInfo\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(profilesInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &profilesInfo,\n        \"nvmlDeviceWorkloadPowerProfileGetProfilesInfo\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceWorkloadPowerProfileGetCurrentProfiles(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    currentProfiles: *mut cuda_types::nvml::nvmlWorkloadPowerProfileCurrentProfiles_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceWorkloadPowerProfileGetCurrentProfiles\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(currentProfiles), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &currentProfiles,\n        \"nvmlDeviceWorkloadPowerProfileGetCurrentProfiles\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceWorkloadPowerProfileSetRequestedProfiles(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    requestedProfiles: *mut cuda_types::nvml::nvmlWorkloadPowerProfileRequestedProfiles_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceWorkloadPowerProfileSetRequestedProfiles\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(requestedProfiles), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &requestedProfiles,\n        \"nvmlDeviceWorkloadPowerProfileSetRequestedProfiles\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceWorkloadPowerProfileClearRequestedProfiles(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    requestedProfiles: *mut cuda_types::nvml::nvmlWorkloadPowerProfileRequestedProfiles_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceWorkloadPowerProfileClearRequestedProfiles\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(requestedProfiles), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &requestedProfiles,\n        \"nvmlDeviceWorkloadPowerProfileClearRequestedProfiles\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlPowerSmoothingProfile_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(profileId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.profileId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(paramId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.paramId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(value), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.value, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlPowerSmoothingState_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(state), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.state, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\npub fn write_nvmlDevicePowerSmoothingActivatePresetProfile(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    profile: *mut cuda_types::nvml::nvmlPowerSmoothingProfile_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDevicePowerSmoothingActivatePresetProfile\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(profile), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &profile,\n        \"nvmlDevicePowerSmoothingActivatePresetProfile\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDevicePowerSmoothingUpdatePresetProfileParam(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    profile: *mut cuda_types::nvml::nvmlPowerSmoothingProfile_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDevicePowerSmoothingUpdatePresetProfileParam\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(profile), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &profile,\n        \"nvmlDevicePowerSmoothingUpdatePresetProfileParam\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDevicePowerSmoothingSetState(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    state: *mut cuda_types::nvml::nvmlPowerSmoothingState_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDevicePowerSmoothingSetState\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(state), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &state,\n        \"nvmlDevicePowerSmoothingSetState\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetSramUniqueUncorrectedEccErrorCounts(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    errorCounts: *mut cuda_types::nvml::nvmlEccSramUniqueUncorrectedErrorCounts_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetSramUniqueUncorrectedEccErrorCounts\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(errorCounts), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &errorCounts,\n        \"nvmlDeviceGetSramUniqueUncorrectedEccErrorCounts\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlInit(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_nvmlDeviceGetCount(\n    writer: &mut (impl std::io::Write + ?Sized),\n    deviceCount: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(deviceCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&deviceCount, \"nvmlDeviceGetCount\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetHandleByIndex(\n    writer: &mut (impl std::io::Write + ?Sized),\n    index: ::core::ffi::c_uint,\n    device: *mut cuda_types::nvml::nvmlDevice_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(index), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&index, \"nvmlDeviceGetHandleByIndex\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetHandleByIndex\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetHandleByPciBusId(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pciBusId: *const ::core::ffi::c_char,\n    device: *mut cuda_types::nvml::nvmlDevice_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pciBusId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pciBusId,\n        \"nvmlDeviceGetHandleByPciBusId\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetHandleByPciBusId\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetPciInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    pci: *mut cuda_types::nvml::nvmlPciInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetPciInfo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pci), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pci, \"nvmlDeviceGetPciInfo\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetPciInfo_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    pci: *mut cuda_types::nvml::nvmlPciInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetPciInfo_v2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pci), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pci, \"nvmlDeviceGetPciInfo_v2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetNvLinkRemotePciInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    link: ::core::ffi::c_uint,\n    pci: *mut cuda_types::nvml::nvmlPciInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetNvLinkRemotePciInfo\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(link), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &link,\n        \"nvmlDeviceGetNvLinkRemotePciInfo\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pci), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pci,\n        \"nvmlDeviceGetNvLinkRemotePciInfo\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetGridLicensableFeatures(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    pGridLicensableFeatures: *mut cuda_types::nvml::nvmlGridLicensableFeatures_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetGridLicensableFeatures\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pGridLicensableFeatures), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pGridLicensableFeatures,\n        \"nvmlDeviceGetGridLicensableFeatures\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetGridLicensableFeatures_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    pGridLicensableFeatures: *mut cuda_types::nvml::nvmlGridLicensableFeatures_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetGridLicensableFeatures_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pGridLicensableFeatures), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pGridLicensableFeatures,\n        \"nvmlDeviceGetGridLicensableFeatures_v2\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetGridLicensableFeatures_v3(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    pGridLicensableFeatures: *mut cuda_types::nvml::nvmlGridLicensableFeatures_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetGridLicensableFeatures_v3\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pGridLicensableFeatures), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pGridLicensableFeatures,\n        \"nvmlDeviceGetGridLicensableFeatures_v3\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceRemoveGpu(\n    writer: &mut (impl std::io::Write + ?Sized),\n    pciInfo: *mut cuda_types::nvml::nvmlPciInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(pciInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pciInfo, \"nvmlDeviceRemoveGpu\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlEventSetWait(\n    writer: &mut (impl std::io::Write + ?Sized),\n    set: cuda_types::nvml::nvmlEventSet_t,\n    data: *mut cuda_types::nvml::nvmlEventData_t,\n    timeoutms: ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(set), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&set, \"nvmlEventSetWait\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(data), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&data, \"nvmlEventSetWait\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(timeoutms), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&timeoutms, \"nvmlEventSetWait\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetAttributes(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    attributes: *mut cuda_types::nvml::nvmlDeviceAttributes_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetAttributes\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attributes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attributes, \"nvmlDeviceGetAttributes\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlComputeInstanceGetInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    computeInstance: cuda_types::nvml::nvmlComputeInstance_t,\n    info: *mut cuda_types::nvml::nvmlComputeInstanceInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(computeInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &computeInstance,\n        \"nvmlComputeInstanceGetInfo\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"nvmlComputeInstanceGetInfo\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetComputeRunningProcesses(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    infoCount: *mut ::core::ffi::c_uint,\n    infos: *mut cuda_types::nvml::nvmlProcessInfo_v1_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetComputeRunningProcesses\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(infoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &infoCount,\n        \"nvmlDeviceGetComputeRunningProcesses\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(infos), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &infos,\n        \"nvmlDeviceGetComputeRunningProcesses\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetComputeRunningProcesses_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    infoCount: *mut ::core::ffi::c_uint,\n    infos: *mut cuda_types::nvml::nvmlProcessInfo_v2_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetComputeRunningProcesses_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(infoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &infoCount,\n        \"nvmlDeviceGetComputeRunningProcesses_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(infos), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &infos,\n        \"nvmlDeviceGetComputeRunningProcesses_v2\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetGraphicsRunningProcesses(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    infoCount: *mut ::core::ffi::c_uint,\n    infos: *mut cuda_types::nvml::nvmlProcessInfo_v1_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetGraphicsRunningProcesses\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(infoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &infoCount,\n        \"nvmlDeviceGetGraphicsRunningProcesses\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(infos), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &infos,\n        \"nvmlDeviceGetGraphicsRunningProcesses\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetGraphicsRunningProcesses_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    infoCount: *mut ::core::ffi::c_uint,\n    infos: *mut cuda_types::nvml::nvmlProcessInfo_v2_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetGraphicsRunningProcesses_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(infoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &infoCount,\n        \"nvmlDeviceGetGraphicsRunningProcesses_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(infos), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &infos,\n        \"nvmlDeviceGetGraphicsRunningProcesses_v2\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetMPSComputeRunningProcesses(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    infoCount: *mut ::core::ffi::c_uint,\n    infos: *mut cuda_types::nvml::nvmlProcessInfo_v1_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetMPSComputeRunningProcesses\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(infoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &infoCount,\n        \"nvmlDeviceGetMPSComputeRunningProcesses\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(infos), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &infos,\n        \"nvmlDeviceGetMPSComputeRunningProcesses\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetMPSComputeRunningProcesses_v2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    infoCount: *mut ::core::ffi::c_uint,\n    infos: *mut cuda_types::nvml::nvmlProcessInfo_v2_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetMPSComputeRunningProcesses_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(infoCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &infoCount,\n        \"nvmlDeviceGetMPSComputeRunningProcesses_v2\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(infos), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &infos,\n        \"nvmlDeviceGetMPSComputeRunningProcesses_v2\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetGpuInstancePossiblePlacements(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    profileId: ::core::ffi::c_uint,\n    placements: *mut cuda_types::nvml::nvmlGpuInstancePlacement_t,\n    count: *mut ::core::ffi::c_uint,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &device,\n        \"nvmlDeviceGetGpuInstancePossiblePlacements\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(profileId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &profileId,\n        \"nvmlDeviceGetGpuInstancePossiblePlacements\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(placements), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &placements,\n        \"nvmlDeviceGetGpuInstancePossiblePlacements\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(count), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &count,\n        \"nvmlDeviceGetGpuInstancePossiblePlacements\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlVgpuInstanceGetLicenseInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    vgpuInstance: cuda_types::nvml::nvmlVgpuInstance_t,\n    licenseInfo: *mut cuda_types::nvml::nvmlVgpuLicenseInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(vgpuInstance), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &vgpuInstance,\n        \"nvmlVgpuInstanceGetLicenseInfo\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(licenseInfo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &licenseInfo,\n        \"nvmlVgpuInstanceGetLicenseInfo\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_nvmlDeviceGetDriverModel(\n    writer: &mut (impl std::io::Write + ?Sized),\n    device: cuda_types::nvml::nvmlDevice_t,\n    current: *mut cuda_types::nvml::nvmlDriverModel_t,\n    pending: *mut cuda_types::nvml::nvmlDriverModel_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(device), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&device, \"nvmlDeviceGetDriverModel\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(current), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&current, \"nvmlDeviceGetDriverModel\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pending), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pending, \"nvmlDeviceGetDriverModel\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlReturn_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            Ok(()) => writer.write_all(b\"NVML_SUCCESS\"),\n            Err(err) => {\n                match err.0.get() {\n                    1 => writer.write_all(\"NVML_ERROR_UNINITIALIZED\".as_bytes()),\n                    2 => writer.write_all(\"NVML_ERROR_INVALID_ARGUMENT\".as_bytes()),\n                    3 => writer.write_all(\"NVML_ERROR_NOT_SUPPORTED\".as_bytes()),\n                    4 => writer.write_all(\"NVML_ERROR_NO_PERMISSION\".as_bytes()),\n                    5 => writer.write_all(\"NVML_ERROR_ALREADY_INITIALIZED\".as_bytes()),\n                    6 => writer.write_all(\"NVML_ERROR_NOT_FOUND\".as_bytes()),\n                    7 => writer.write_all(\"NVML_ERROR_INSUFFICIENT_SIZE\".as_bytes()),\n                    8 => writer.write_all(\"NVML_ERROR_INSUFFICIENT_POWER\".as_bytes()),\n                    9 => writer.write_all(\"NVML_ERROR_DRIVER_NOT_LOADED\".as_bytes()),\n                    10 => writer.write_all(\"NVML_ERROR_TIMEOUT\".as_bytes()),\n                    11 => writer.write_all(\"NVML_ERROR_IRQ_ISSUE\".as_bytes()),\n                    12 => writer.write_all(\"NVML_ERROR_LIBRARY_NOT_FOUND\".as_bytes()),\n                    13 => writer.write_all(\"NVML_ERROR_FUNCTION_NOT_FOUND\".as_bytes()),\n                    14 => writer.write_all(\"NVML_ERROR_CORRUPTED_INFOROM\".as_bytes()),\n                    15 => writer.write_all(\"NVML_ERROR_GPU_IS_LOST\".as_bytes()),\n                    16 => writer.write_all(\"NVML_ERROR_RESET_REQUIRED\".as_bytes()),\n                    17 => writer.write_all(\"NVML_ERROR_OPERATING_SYSTEM\".as_bytes()),\n                    18 => {\n                        writer.write_all(\"NVML_ERROR_LIB_RM_VERSION_MISMATCH\".as_bytes())\n                    }\n                    19 => writer.write_all(\"NVML_ERROR_IN_USE\".as_bytes()),\n                    20 => writer.write_all(\"NVML_ERROR_MEMORY\".as_bytes()),\n                    21 => writer.write_all(\"NVML_ERROR_NO_DATA\".as_bytes()),\n                    22 => {\n                        writer.write_all(\"NVML_ERROR_VGPU_ECC_NOT_SUPPORTED\".as_bytes())\n                    }\n                    23 => {\n                        writer.write_all(\"NVML_ERROR_INSUFFICIENT_RESOURCES\".as_bytes())\n                    }\n                    24 => writer.write_all(\"NVML_ERROR_FREQ_NOT_SUPPORTED\".as_bytes()),\n                    25 => {\n                        writer\n                            .write_all(\"NVML_ERROR_ARGUMENT_VERSION_MISMATCH\".as_bytes())\n                    }\n                    26 => writer.write_all(\"NVML_ERROR_DEPRECATED\".as_bytes()),\n                    27 => writer.write_all(\"NVML_ERROR_NOT_READY\".as_bytes()),\n                    28 => writer.write_all(\"NVML_ERROR_GPU_NOT_FOUND\".as_bytes()),\n                    29 => writer.write_all(\"NVML_ERROR_INVALID_STATE\".as_bytes()),\n                    30 => {\n                        writer\n                            .write_all(\"NVML_ERROR_RESET_TYPE_NOT_SUPPORTED\".as_bytes())\n                    }\n                    999 => writer.write_all(\"NVML_ERROR_UNKNOWN\".as_bytes()),\n                    err => write!(writer, \"{}\", err),\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "format/src/format_generated_sparse.rs",
    "content": "// Generated automatically by zluda_bindgen\n// DO NOT EDIT MANUALLY\n#![allow(warnings)]\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseHandle_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseMatDescr_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::bsrsv2Info_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::bsrsm2Info_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::csric02Info_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::bsric02Info_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::csrilu02Info_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::bsrilu02Info_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::csru2csrInfo_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseColorInfo_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::pruneInfo_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparsePointerMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cusparse::cusparsePointerMode_t::CUSPARSE_POINTER_MODE_HOST => {\n                writer.write_all(stringify!(CUSPARSE_POINTER_MODE_HOST).as_bytes())\n            }\n            &cuda_types::cusparse::cusparsePointerMode_t::CUSPARSE_POINTER_MODE_DEVICE => {\n                writer.write_all(stringify!(CUSPARSE_POINTER_MODE_DEVICE).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseAction_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cusparse::cusparseAction_t::CUSPARSE_ACTION_SYMBOLIC => {\n                writer.write_all(stringify!(CUSPARSE_ACTION_SYMBOLIC).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseAction_t::CUSPARSE_ACTION_NUMERIC => {\n                writer.write_all(stringify!(CUSPARSE_ACTION_NUMERIC).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseMatrixType_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cusparse::cusparseMatrixType_t::CUSPARSE_MATRIX_TYPE_GENERAL => {\n                writer.write_all(stringify!(CUSPARSE_MATRIX_TYPE_GENERAL).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseMatrixType_t::CUSPARSE_MATRIX_TYPE_SYMMETRIC => {\n                writer.write_all(stringify!(CUSPARSE_MATRIX_TYPE_SYMMETRIC).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseMatrixType_t::CUSPARSE_MATRIX_TYPE_HERMITIAN => {\n                writer.write_all(stringify!(CUSPARSE_MATRIX_TYPE_HERMITIAN).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseMatrixType_t::CUSPARSE_MATRIX_TYPE_TRIANGULAR => {\n                writer.write_all(stringify!(CUSPARSE_MATRIX_TYPE_TRIANGULAR).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseFillMode_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cusparse::cusparseFillMode_t::CUSPARSE_FILL_MODE_LOWER => {\n                writer.write_all(stringify!(CUSPARSE_FILL_MODE_LOWER).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseFillMode_t::CUSPARSE_FILL_MODE_UPPER => {\n                writer.write_all(stringify!(CUSPARSE_FILL_MODE_UPPER).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseDiagType_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cusparse::cusparseDiagType_t::CUSPARSE_DIAG_TYPE_NON_UNIT => {\n                writer.write_all(stringify!(CUSPARSE_DIAG_TYPE_NON_UNIT).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseDiagType_t::CUSPARSE_DIAG_TYPE_UNIT => {\n                writer.write_all(stringify!(CUSPARSE_DIAG_TYPE_UNIT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseIndexBase_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cusparse::cusparseIndexBase_t::CUSPARSE_INDEX_BASE_ZERO => {\n                writer.write_all(stringify!(CUSPARSE_INDEX_BASE_ZERO).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseIndexBase_t::CUSPARSE_INDEX_BASE_ONE => {\n                writer.write_all(stringify!(CUSPARSE_INDEX_BASE_ONE).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseOperation_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cusparse::cusparseOperation_t::CUSPARSE_OPERATION_NON_TRANSPOSE => {\n                writer.write_all(stringify!(CUSPARSE_OPERATION_NON_TRANSPOSE).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseOperation_t::CUSPARSE_OPERATION_TRANSPOSE => {\n                writer.write_all(stringify!(CUSPARSE_OPERATION_TRANSPOSE).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseOperation_t::CUSPARSE_OPERATION_CONJUGATE_TRANSPOSE => {\n                writer\n                    .write_all(\n                        stringify!(CUSPARSE_OPERATION_CONJUGATE_TRANSPOSE).as_bytes(),\n                    )\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseDirection_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cusparse::cusparseDirection_t::CUSPARSE_DIRECTION_ROW => {\n                writer.write_all(stringify!(CUSPARSE_DIRECTION_ROW).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseDirection_t::CUSPARSE_DIRECTION_COLUMN => {\n                writer.write_all(stringify!(CUSPARSE_DIRECTION_COLUMN).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseSolvePolicy_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cusparse::cusparseSolvePolicy_t::CUSPARSE_SOLVE_POLICY_NO_LEVEL => {\n                writer.write_all(stringify!(CUSPARSE_SOLVE_POLICY_NO_LEVEL).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseSolvePolicy_t::CUSPARSE_SOLVE_POLICY_USE_LEVEL => {\n                writer.write_all(stringify!(CUSPARSE_SOLVE_POLICY_USE_LEVEL).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseColorAlg_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cusparse::cusparseColorAlg_t::CUSPARSE_COLOR_ALG0 => {\n                writer.write_all(stringify!(CUSPARSE_COLOR_ALG0).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseColorAlg_t::CUSPARSE_COLOR_ALG1 => {\n                writer.write_all(stringify!(CUSPARSE_COLOR_ALG1).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cusparseCreate(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: *mut cuda_types::cusparse::cusparseHandle_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCreate\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDestroy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDestroy\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseGetVersion(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    version: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseGetVersion\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(version), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&version, \"cusparseGetVersion\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseGetProperty(\n    writer: &mut (impl std::io::Write + ?Sized),\n    type_: cuda_types::cusparse::libraryPropertyType,\n    value: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cusparseGetProperty\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(value), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&value, \"cusparseGetProperty\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseGetErrorName(\n    writer: &mut (impl std::io::Write + ?Sized),\n    status: cuda_types::cusparse::cusparseStatus_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(status), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&status, \"cusparseGetErrorName\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseGetErrorString(\n    writer: &mut (impl std::io::Write + ?Sized),\n    status: cuda_types::cusparse::cusparseStatus_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(status), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&status, \"cusparseGetErrorString\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSetStream(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    streamId: cuda_types::cusparse::cudaStream_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSetStream\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(streamId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&streamId, \"cusparseSetStream\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseGetStream(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    streamId: *mut cuda_types::cusparse::cudaStream_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseGetStream\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(streamId), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&streamId, \"cusparseGetStream\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseGetPointerMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    mode: *mut cuda_types::cusparse::cusparsePointerMode_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseGetPointerMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cusparseGetPointerMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSetPointerMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    mode: cuda_types::cusparse::cusparsePointerMode_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSetPointerMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mode, \"cusparseSetPointerMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseLoggerSetCallback(\n    writer: &mut (impl std::io::Write + ?Sized),\n    callback: cuda_types::cusparse::cusparseLoggerCallback_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(callback), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&callback, \"cusparseLoggerSetCallback\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseLoggerSetFile(\n    writer: &mut (impl std::io::Write + ?Sized),\n    file: *mut cuda_types::FILE,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(file), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&file, \"cusparseLoggerSetFile\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseLoggerOpenFile(\n    writer: &mut (impl std::io::Write + ?Sized),\n    logFile: *const ::core::ffi::c_char,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(logFile), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&logFile, \"cusparseLoggerOpenFile\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseLoggerSetLevel(\n    writer: &mut (impl std::io::Write + ?Sized),\n    level: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(level), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&level, \"cusparseLoggerSetLevel\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseLoggerSetMask(\n    writer: &mut (impl std::io::Write + ?Sized),\n    mask: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(mask), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mask, \"cusparseLoggerSetMask\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseLoggerForceDisable(\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"()\")\n}\npub fn write_cusparseCreateMatDescr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    descrA: *mut cuda_types::cusparse::cusparseMatDescr_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCreateMatDescr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDestroyMatDescr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDestroyMatDescr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSetMatType(\n    writer: &mut (impl std::io::Write + ?Sized),\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    type_: cuda_types::cusparse::cusparseMatrixType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseSetMatType\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cusparseSetMatType\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseGetMatType(\n    writer: &mut (impl std::io::Write + ?Sized),\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseGetMatType\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSetMatFillMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    fillMode: cuda_types::cusparse::cusparseFillMode_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseSetMatFillMode\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fillMode), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fillMode, \"cusparseSetMatFillMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseGetMatFillMode(\n    writer: &mut (impl std::io::Write + ?Sized),\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseGetMatFillMode\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSetMatDiagType(\n    writer: &mut (impl std::io::Write + ?Sized),\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    diagType: cuda_types::cusparse::cusparseDiagType_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseSetMatDiagType\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(diagType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&diagType, \"cusparseSetMatDiagType\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseGetMatDiagType(\n    writer: &mut (impl std::io::Write + ?Sized),\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseGetMatDiagType\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSetMatIndexBase(\n    writer: &mut (impl std::io::Write + ?Sized),\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    base: cuda_types::cusparse::cusparseIndexBase_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseSetMatIndexBase\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(base), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&base, \"cusparseSetMatIndexBase\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseGetMatIndexBase(\n    writer: &mut (impl std::io::Write + ?Sized),\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseGetMatIndexBase\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCreateCsric02Info(\n    writer: &mut (impl std::io::Write + ?Sized),\n    info: *mut cuda_types::cusparse::csric02Info_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCreateCsric02Info\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDestroyCsric02Info(\n    writer: &mut (impl std::io::Write + ?Sized),\n    info: cuda_types::cusparse::csric02Info_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDestroyCsric02Info\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCreateBsric02Info(\n    writer: &mut (impl std::io::Write + ?Sized),\n    info: *mut cuda_types::cusparse::bsric02Info_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCreateBsric02Info\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDestroyBsric02Info(\n    writer: &mut (impl std::io::Write + ?Sized),\n    info: cuda_types::cusparse::bsric02Info_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDestroyBsric02Info\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCreateCsrilu02Info(\n    writer: &mut (impl std::io::Write + ?Sized),\n    info: *mut cuda_types::cusparse::csrilu02Info_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCreateCsrilu02Info\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDestroyCsrilu02Info(\n    writer: &mut (impl std::io::Write + ?Sized),\n    info: cuda_types::cusparse::csrilu02Info_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDestroyCsrilu02Info\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCreateBsrilu02Info(\n    writer: &mut (impl std::io::Write + ?Sized),\n    info: *mut cuda_types::cusparse::bsrilu02Info_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCreateBsrilu02Info\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDestroyBsrilu02Info(\n    writer: &mut (impl std::io::Write + ?Sized),\n    info: cuda_types::cusparse::bsrilu02Info_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDestroyBsrilu02Info\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCreateBsrsv2Info(\n    writer: &mut (impl std::io::Write + ?Sized),\n    info: *mut cuda_types::cusparse::bsrsv2Info_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCreateBsrsv2Info\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDestroyBsrsv2Info(\n    writer: &mut (impl std::io::Write + ?Sized),\n    info: cuda_types::cusparse::bsrsv2Info_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDestroyBsrsv2Info\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCreateBsrsm2Info(\n    writer: &mut (impl std::io::Write + ?Sized),\n    info: *mut cuda_types::cusparse::bsrsm2Info_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCreateBsrsm2Info\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDestroyBsrsm2Info(\n    writer: &mut (impl std::io::Write + ?Sized),\n    info: cuda_types::cusparse::bsrsm2Info_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDestroyBsrsm2Info\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCreateCsru2csrInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    info: *mut cuda_types::cusparse::csru2csrInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCreateCsru2csrInfo\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDestroyCsru2csrInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    info: cuda_types::cusparse::csru2csrInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDestroyCsru2csrInfo\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCreateColorInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    info: *mut cuda_types::cusparse::cusparseColorInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCreateColorInfo\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDestroyColorInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    info: cuda_types::cusparse::cusparseColorInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDestroyColorInfo\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCreatePruneInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    info: *mut cuda_types::cusparse::pruneInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCreatePruneInfo\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDestroyPruneInfo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    info: cuda_types::cusparse::pruneInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDestroyPruneInfo\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSgemvi(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    A: *const f32,\n    lda: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    xVal: *const f32,\n    xInd: *const ::core::ffi::c_int,\n    beta: *const f32,\n    y: *mut f32,\n    idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseSgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseSgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseSgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseSgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cusparseSgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cusparseSgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseSgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xVal, \"cusparseSgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xInd, \"cusparseSgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseSgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cusparseSgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseSgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseSgemvi\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSgemvi_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    pBufferSize: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSgemvi_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseSgemvi_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseSgemvi_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseSgemvi_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseSgemvi_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseSgemvi_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDgemvi(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f64,\n    A: *const f64,\n    lda: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    xVal: *const f64,\n    xInd: *const ::core::ffi::c_int,\n    beta: *const f64,\n    y: *mut f64,\n    idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseDgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseDgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseDgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cusparseDgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cusparseDgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseDgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xVal, \"cusparseDgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xInd, \"cusparseDgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseDgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cusparseDgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseDgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseDgemvi\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDgemvi_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    pBufferSize: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDgemvi_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseDgemvi_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDgemvi_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseDgemvi_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseDgemvi_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseDgemvi_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCgemvi(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cusparse::cuComplex,\n    A: *const cuda_types::cusparse::cuComplex,\n    lda: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    xVal: *const cuda_types::cusparse::cuComplex,\n    xInd: *const ::core::ffi::c_int,\n    beta: *const cuda_types::cusparse::cuComplex,\n    y: *mut cuda_types::cusparse::cuComplex,\n    idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseCgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseCgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseCgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cusparseCgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cusparseCgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xVal, \"cusparseCgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xInd, \"cusparseCgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseCgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cusparseCgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseCgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseCgemvi\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCgemvi_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    pBufferSize: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCgemvi_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseCgemvi_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCgemvi_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseCgemvi_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCgemvi_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseCgemvi_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZgemvi(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cusparse::cuDoubleComplex,\n    A: *const cuda_types::cusparse::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    xVal: *const cuda_types::cusparse::cuDoubleComplex,\n    xInd: *const ::core::ffi::c_int,\n    beta: *const cuda_types::cusparse::cuDoubleComplex,\n    y: *mut cuda_types::cusparse::cuDoubleComplex,\n    idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseZgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseZgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseZgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cusparseZgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cusparseZgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseZgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xVal, \"cusparseZgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(xInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&xInd, \"cusparseZgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseZgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cusparseZgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseZgemvi\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseZgemvi\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZgemvi_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    pBufferSize: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZgemvi_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseZgemvi_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZgemvi_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseZgemvi_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseZgemvi_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseZgemvi_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSbsrmv(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    alpha: *const f32,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const f32,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    x: *const f32,\n    beta: *const f32,\n    y: *mut f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseSbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseSbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseSbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseSbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseSbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseSbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseSbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValA, \"cusparseSbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrA, \"cusparseSbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndA, \"cusparseSbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseSbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cusparseSbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseSbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cusparseSbsrmv\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDbsrmv(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    alpha: *const f64,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const f64,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    x: *const f64,\n    beta: *const f64,\n    y: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseDbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseDbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseDbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseDbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseDbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseDbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValA, \"cusparseDbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrA, \"cusparseDbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndA, \"cusparseDbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseDbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cusparseDbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseDbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cusparseDbsrmv\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCbsrmv(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    alpha: *const cuda_types::cusparse::cuComplex,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    x: *const cuda_types::cusparse::cuComplex,\n    beta: *const cuda_types::cusparse::cuComplex,\n    y: *mut cuda_types::cusparse::cuComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseCbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseCbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseCbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseCbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseCbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseCbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValA, \"cusparseCbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrA, \"cusparseCbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndA, \"cusparseCbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseCbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cusparseCbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseCbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cusparseCbsrmv\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZbsrmv(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    alpha: *const cuda_types::cusparse::cuDoubleComplex,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    x: *const cuda_types::cusparse::cuDoubleComplex,\n    beta: *const cuda_types::cusparse::cuDoubleComplex,\n    y: *mut cuda_types::cusparse::cuDoubleComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseZbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseZbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseZbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseZbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseZbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseZbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValA, \"cusparseZbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrA, \"cusparseZbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndA, \"cusparseZbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseZbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cusparseZbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseZbsrmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cusparseZbsrmv\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSbsrxmv(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    sizeOfMask: ::core::ffi::c_int,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    alpha: *const f32,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const f32,\n    bsrSortedMaskPtrA: *const ::core::ffi::c_int,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedEndPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    x: *const f32,\n    beta: *const f32,\n    y: *mut f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseSbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseSbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeOfMask), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&sizeOfMask, \"cusparseSbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseSbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseSbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseSbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseSbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseSbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValA, \"cusparseSbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedMaskPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedMaskPtrA, \"cusparseSbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrA, \"cusparseSbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedEndPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedEndPtrA, \"cusparseSbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndA, \"cusparseSbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseSbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cusparseSbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseSbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cusparseSbsrxmv\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDbsrxmv(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    sizeOfMask: ::core::ffi::c_int,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    alpha: *const f64,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const f64,\n    bsrSortedMaskPtrA: *const ::core::ffi::c_int,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedEndPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    x: *const f64,\n    beta: *const f64,\n    y: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseDbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseDbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeOfMask), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&sizeOfMask, \"cusparseDbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseDbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseDbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseDbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseDbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValA, \"cusparseDbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedMaskPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedMaskPtrA, \"cusparseDbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrA, \"cusparseDbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedEndPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedEndPtrA, \"cusparseDbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndA, \"cusparseDbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseDbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cusparseDbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseDbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cusparseDbsrxmv\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCbsrxmv(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    sizeOfMask: ::core::ffi::c_int,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    alpha: *const cuda_types::cusparse::cuComplex,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const cuda_types::cusparse::cuComplex,\n    bsrSortedMaskPtrA: *const ::core::ffi::c_int,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedEndPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    x: *const cuda_types::cusparse::cuComplex,\n    beta: *const cuda_types::cusparse::cuComplex,\n    y: *mut cuda_types::cusparse::cuComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseCbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseCbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeOfMask), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&sizeOfMask, \"cusparseCbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseCbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseCbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseCbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseCbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValA, \"cusparseCbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedMaskPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedMaskPtrA, \"cusparseCbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrA, \"cusparseCbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedEndPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedEndPtrA, \"cusparseCbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndA, \"cusparseCbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseCbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cusparseCbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseCbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cusparseCbsrxmv\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZbsrxmv(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    sizeOfMask: ::core::ffi::c_int,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    alpha: *const cuda_types::cusparse::cuDoubleComplex,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedMaskPtrA: *const ::core::ffi::c_int,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedEndPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    x: *const cuda_types::cusparse::cuDoubleComplex,\n    beta: *const cuda_types::cusparse::cuDoubleComplex,\n    y: *mut cuda_types::cusparse::cuDoubleComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseZbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseZbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sizeOfMask), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&sizeOfMask, \"cusparseZbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseZbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseZbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseZbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseZbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValA, \"cusparseZbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedMaskPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedMaskPtrA, \"cusparseZbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrA, \"cusparseZbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedEndPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedEndPtrA, \"cusparseZbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndA, \"cusparseZbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseZbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cusparseZbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseZbsrxmv\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(y), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&y, \"cusparseZbsrxmv\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseXbsrsv2_zeroPivot(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    info: cuda_types::cusparse::bsrsv2Info_t,\n    position: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseXbsrsv2_zeroPivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseXbsrsv2_zeroPivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(position), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&position, \"cusparseXbsrsv2_zeroPivot\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSbsrsv2_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *mut f32,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsv2Info_t,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseSbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseSbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseSbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseSbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseSbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedValA,\n        \"cusparseSbsrsv2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseSbsrsv2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseSbsrsv2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseSbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseSbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseSbsrsv2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDbsrsv2_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *mut f64,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsv2Info_t,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseDbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseDbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseDbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseDbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedValA,\n        \"cusparseDbsrsv2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseDbsrsv2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseDbsrsv2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseDbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseDbsrsv2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCbsrsv2_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *mut cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsv2Info_t,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseCbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseCbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseCbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseCbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedValA,\n        \"cusparseCbsrsv2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseCbsrsv2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseCbsrsv2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseCbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseCbsrsv2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZbsrsv2_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *mut cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsv2Info_t,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseZbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseZbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseZbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseZbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedValA,\n        \"cusparseZbsrsv2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseZbsrsv2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseZbsrsv2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseZbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseZbsrsv2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseZbsrsv2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSbsrsv2_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *mut f32,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsv2Info_t,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseSbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseSbsrsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transA,\n        \"cusparseSbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseSbsrsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseSbsrsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseSbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedValA,\n        \"cusparseSbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseSbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseSbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSize,\n        \"cusparseSbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseSbsrsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseSbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDbsrsv2_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *mut f64,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsv2Info_t,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseDbsrsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transA,\n        \"cusparseDbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseDbsrsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseDbsrsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseDbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedValA,\n        \"cusparseDbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseDbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseDbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSize,\n        \"cusparseDbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDbsrsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseDbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCbsrsv2_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *mut cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsv2Info_t,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseCbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseCbsrsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transA,\n        \"cusparseCbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseCbsrsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseCbsrsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseCbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedValA,\n        \"cusparseCbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseCbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseCbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSize,\n        \"cusparseCbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCbsrsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseCbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZbsrsv2_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *mut cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsv2Info_t,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseZbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseZbsrsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transA,\n        \"cusparseZbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseZbsrsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseZbsrsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseZbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedValA,\n        \"cusparseZbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseZbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseZbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSize,\n        \"cusparseZbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseZbsrsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseZbsrsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSbsrsv2_analysis(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const f32,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsv2Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseSbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseSbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseSbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseSbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseSbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedValA,\n        \"cusparseSbsrsv2_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseSbsrsv2_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseSbsrsv2_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseSbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseSbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseSbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseSbsrsv2_analysis\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDbsrsv2_analysis(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const f64,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsv2Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseDbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseDbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseDbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseDbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedValA,\n        \"cusparseDbsrsv2_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseDbsrsv2_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseDbsrsv2_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseDbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseDbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseDbsrsv2_analysis\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCbsrsv2_analysis(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsv2Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseCbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseCbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseCbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseCbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedValA,\n        \"cusparseCbsrsv2_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseCbsrsv2_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseCbsrsv2_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseCbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseCbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseCbsrsv2_analysis\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZbsrsv2_analysis(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsv2Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseZbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseZbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseZbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseZbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedValA,\n        \"cusparseZbsrsv2_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseZbsrsv2_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseZbsrsv2_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseZbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseZbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseZbsrsv2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseZbsrsv2_analysis\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSbsrsv2_solve(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    alpha: *const f32,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const f32,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsv2Info_t,\n    f: *const f32,\n    x: *mut f32,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseSbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseSbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseSbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseSbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseSbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseSbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValA, \"cusparseSbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseSbsrsv2_solve\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseSbsrsv2_solve\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseSbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseSbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(f), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&f, \"cusparseSbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cusparseSbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseSbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseSbsrsv2_solve\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDbsrsv2_solve(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    alpha: *const f64,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const f64,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsv2Info_t,\n    f: *const f64,\n    x: *mut f64,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseDbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseDbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseDbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseDbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseDbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValA, \"cusparseDbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseDbsrsv2_solve\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseDbsrsv2_solve\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseDbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(f), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&f, \"cusparseDbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cusparseDbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseDbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseDbsrsv2_solve\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCbsrsv2_solve(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    alpha: *const cuda_types::cusparse::cuComplex,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsv2Info_t,\n    f: *const cuda_types::cusparse::cuComplex,\n    x: *mut cuda_types::cusparse::cuComplex,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseCbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseCbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseCbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseCbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseCbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValA, \"cusparseCbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseCbsrsv2_solve\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseCbsrsv2_solve\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseCbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(f), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&f, \"cusparseCbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cusparseCbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseCbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseCbsrsv2_solve\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZbsrsv2_solve(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    alpha: *const cuda_types::cusparse::cuDoubleComplex,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsv2Info_t,\n    f: *const cuda_types::cusparse::cuDoubleComplex,\n    x: *mut cuda_types::cusparse::cuDoubleComplex,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseZbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseZbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseZbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseZbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseZbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValA, \"cusparseZbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseZbsrsv2_solve\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseZbsrsv2_solve\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseZbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseZbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(f), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&f, \"cusparseZbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cusparseZbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseZbsrsv2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseZbsrsv2_solve\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSbsrmm(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    transB: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    kb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    alpha: *const f32,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const f32,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    B: *const f32,\n    ldb: ::core::ffi::c_int,\n    beta: *const f32,\n    C: *mut f32,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseSbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseSbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transB, \"cusparseSbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseSbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseSbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kb, \"cusparseSbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseSbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseSbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseSbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValA, \"cusparseSbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrA, \"cusparseSbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndA, \"cusparseSbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockSize, \"cusparseSbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cusparseSbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cusparseSbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseSbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cusparseSbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cusparseSbsrmm\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDbsrmm(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    transB: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    kb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    alpha: *const f64,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const f64,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    B: *const f64,\n    ldb: ::core::ffi::c_int,\n    beta: *const f64,\n    C: *mut f64,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseDbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseDbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transB, \"cusparseDbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseDbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseDbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kb, \"cusparseDbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseDbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseDbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValA, \"cusparseDbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrA, \"cusparseDbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndA, \"cusparseDbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockSize, \"cusparseDbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cusparseDbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cusparseDbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseDbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cusparseDbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cusparseDbsrmm\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCbsrmm(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    transB: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    kb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    alpha: *const cuda_types::cusparse::cuComplex,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    B: *const cuda_types::cusparse::cuComplex,\n    ldb: ::core::ffi::c_int,\n    beta: *const cuda_types::cusparse::cuComplex,\n    C: *mut cuda_types::cusparse::cuComplex,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseCbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseCbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transB, \"cusparseCbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseCbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseCbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kb, \"cusparseCbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseCbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseCbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValA, \"cusparseCbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrA, \"cusparseCbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndA, \"cusparseCbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockSize, \"cusparseCbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cusparseCbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cusparseCbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseCbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cusparseCbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cusparseCbsrmm\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZbsrmm(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    transB: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    kb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    alpha: *const cuda_types::cusparse::cuDoubleComplex,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    B: *const cuda_types::cusparse::cuDoubleComplex,\n    ldb: ::core::ffi::c_int,\n    beta: *const cuda_types::cusparse::cuDoubleComplex,\n    C: *mut cuda_types::cusparse::cuDoubleComplex,\n    ldc: ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseZbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseZbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transB, \"cusparseZbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseZbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseZbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(kb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&kb, \"cusparseZbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseZbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseZbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValA, \"cusparseZbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrA, \"cusparseZbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndA, \"cusparseZbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockSize, \"cusparseZbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cusparseZbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cusparseZbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseZbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(C), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&C, \"cusparseZbsrmm\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldc), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldc, \"cusparseZbsrmm\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseXbsrsm2_zeroPivot(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    info: cuda_types::cusparse::bsrsm2Info_t,\n    position: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseXbsrsm2_zeroPivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseXbsrsm2_zeroPivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(position), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&position, \"cusparseXbsrsm2_zeroPivot\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSbsrsm2_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    transXY: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut f32,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsm2Info_t,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseSbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseSbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transXY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transXY, \"cusparseSbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseSbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseSbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseSbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseSbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseSbsrsm2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseSbsrsm2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseSbsrsm2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSize,\n        \"cusparseSbsrsm2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseSbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseSbsrsm2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDbsrsm2_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    transXY: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut f64,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsm2Info_t,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseDbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseDbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transXY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transXY, \"cusparseDbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseDbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseDbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseDbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseDbsrsm2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseDbsrsm2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseDbsrsm2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSize,\n        \"cusparseDbsrsm2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseDbsrsm2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCbsrsm2_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    transXY: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsm2Info_t,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseCbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseCbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transXY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transXY, \"cusparseCbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseCbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseCbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseCbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseCbsrsm2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseCbsrsm2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseCbsrsm2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSize,\n        \"cusparseCbsrsm2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseCbsrsm2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZbsrsm2_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    transXY: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsm2Info_t,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseZbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseZbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transXY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transXY, \"cusparseZbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseZbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseZbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseZbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseZbsrsm2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseZbsrsm2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseZbsrsm2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSize,\n        \"cusparseZbsrsm2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseZbsrsm2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseZbsrsm2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSbsrsm2_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    transB: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut f32,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsm2Info_t,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseSbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseSbsrsm2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transA,\n        \"cusparseSbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transB,\n        \"cusparseSbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseSbsrsm2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseSbsrsm2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseSbsrsm2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseSbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseSbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseSbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseSbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSize,\n        \"cusparseSbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseSbsrsm2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseSbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDbsrsm2_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    transB: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut f64,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsm2Info_t,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseDbsrsm2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transA,\n        \"cusparseDbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transB,\n        \"cusparseDbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseDbsrsm2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseDbsrsm2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseDbsrsm2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseDbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseDbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseDbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseDbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSize,\n        \"cusparseDbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDbsrsm2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseDbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCbsrsm2_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    transB: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsm2Info_t,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseCbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseCbsrsm2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transA,\n        \"cusparseCbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transB,\n        \"cusparseCbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseCbsrsm2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseCbsrsm2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseCbsrsm2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseCbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseCbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseCbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseCbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSize,\n        \"cusparseCbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCbsrsm2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseCbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZbsrsm2_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    transB: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsm2Info_t,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseZbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseZbsrsm2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transA,\n        \"cusparseZbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &transB,\n        \"cusparseZbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseZbsrsm2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseZbsrsm2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseZbsrsm2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseZbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseZbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseZbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseZbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSize,\n        \"cusparseZbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseZbsrsm2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseZbsrsm2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSbsrsm2_analysis(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    transXY: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *const f32,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsm2Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseSbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseSbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transXY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transXY, \"cusparseSbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseSbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseSbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseSbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseSbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseSbsrsm2_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseSbsrsm2_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseSbsrsm2_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockSize, \"cusparseSbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseSbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseSbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseSbsrsm2_analysis\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDbsrsm2_analysis(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    transXY: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *const f64,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsm2Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseDbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseDbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transXY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transXY, \"cusparseDbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseDbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseDbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseDbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseDbsrsm2_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseDbsrsm2_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseDbsrsm2_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockSize, \"cusparseDbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseDbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseDbsrsm2_analysis\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCbsrsm2_analysis(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    transXY: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *const cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsm2Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseCbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseCbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transXY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transXY, \"cusparseCbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseCbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseCbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseCbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseCbsrsm2_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseCbsrsm2_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseCbsrsm2_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockSize, \"cusparseCbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseCbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseCbsrsm2_analysis\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZbsrsm2_analysis(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    transXY: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *const cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsm2Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseZbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseZbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transXY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transXY, \"cusparseZbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseZbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseZbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseZbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseZbsrsm2_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseZbsrsm2_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseZbsrsm2_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockSize, \"cusparseZbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseZbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseZbsrsm2_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseZbsrsm2_analysis\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSbsrsm2_solve(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    transXY: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    alpha: *const f32,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *const f32,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsm2Info_t,\n    B: *const f32,\n    ldb: ::core::ffi::c_int,\n    X: *mut f32,\n    ldx: ::core::ffi::c_int,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseSbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseSbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transXY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transXY, \"cusparseSbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseSbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseSbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseSbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseSbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseSbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedVal, \"cusparseSbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseSbsrsm2_solve\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseSbsrsm2_solve\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockSize, \"cusparseSbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseSbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cusparseSbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cusparseSbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(X), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&X, \"cusparseSbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldx, \"cusparseSbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseSbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseSbsrsm2_solve\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDbsrsm2_solve(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    transXY: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    alpha: *const f64,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *const f64,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsm2Info_t,\n    B: *const f64,\n    ldb: ::core::ffi::c_int,\n    X: *mut f64,\n    ldx: ::core::ffi::c_int,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseDbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseDbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transXY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transXY, \"cusparseDbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseDbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseDbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseDbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseDbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedVal, \"cusparseDbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseDbsrsm2_solve\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseDbsrsm2_solve\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockSize, \"cusparseDbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cusparseDbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cusparseDbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(X), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&X, \"cusparseDbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldx, \"cusparseDbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseDbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseDbsrsm2_solve\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCbsrsm2_solve(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    transXY: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    alpha: *const cuda_types::cusparse::cuComplex,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *const cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsm2Info_t,\n    B: *const cuda_types::cusparse::cuComplex,\n    ldb: ::core::ffi::c_int,\n    X: *mut cuda_types::cusparse::cuComplex,\n    ldx: ::core::ffi::c_int,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseCbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseCbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transXY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transXY, \"cusparseCbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseCbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseCbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseCbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseCbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedVal, \"cusparseCbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseCbsrsm2_solve\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseCbsrsm2_solve\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockSize, \"cusparseCbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cusparseCbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cusparseCbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(X), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&X, \"cusparseCbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldx, \"cusparseCbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseCbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseCbsrsm2_solve\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZbsrsm2_solve(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    transA: cuda_types::cusparse::cusparseOperation_t,\n    transXY: cuda_types::cusparse::cusparseOperation_t,\n    mb: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    alpha: *const cuda_types::cusparse::cuDoubleComplex,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *const cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrsm2Info_t,\n    B: *const cuda_types::cusparse::cuDoubleComplex,\n    ldb: ::core::ffi::c_int,\n    X: *mut cuda_types::cusparse::cuDoubleComplex,\n    ldx: ::core::ffi::c_int,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseZbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transA, \"cusparseZbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(transXY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&transXY, \"cusparseZbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseZbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseZbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseZbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseZbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedVal, \"cusparseZbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseZbsrsm2_solve\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseZbsrsm2_solve\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockSize, \"cusparseZbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseZbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cusparseZbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cusparseZbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(X), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&X, \"cusparseZbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldx), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldx, \"cusparseZbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseZbsrsm2_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseZbsrsm2_solve\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseScsrilu02_numericBoost(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    info: cuda_types::cusparse::csrilu02Info_t,\n    enable_boost: ::core::ffi::c_int,\n    tol: *mut f64,\n    boost_val: *mut f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseScsrilu02_numericBoost\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseScsrilu02_numericBoost\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(enable_boost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &enable_boost,\n        \"cusparseScsrilu02_numericBoost\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(tol), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&tol, \"cusparseScsrilu02_numericBoost\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(boost_val), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &boost_val,\n        \"cusparseScsrilu02_numericBoost\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDcsrilu02_numericBoost(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    info: cuda_types::cusparse::csrilu02Info_t,\n    enable_boost: ::core::ffi::c_int,\n    tol: *mut f64,\n    boost_val: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDcsrilu02_numericBoost\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDcsrilu02_numericBoost\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(enable_boost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &enable_boost,\n        \"cusparseDcsrilu02_numericBoost\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(tol), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&tol, \"cusparseDcsrilu02_numericBoost\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(boost_val), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &boost_val,\n        \"cusparseDcsrilu02_numericBoost\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCcsrilu02_numericBoost(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    info: cuda_types::cusparse::csrilu02Info_t,\n    enable_boost: ::core::ffi::c_int,\n    tol: *mut f64,\n    boost_val: *mut cuda_types::cusparse::cuComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseCcsrilu02_numericBoost\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCcsrilu02_numericBoost\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(enable_boost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &enable_boost,\n        \"cusparseCcsrilu02_numericBoost\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(tol), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&tol, \"cusparseCcsrilu02_numericBoost\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(boost_val), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &boost_val,\n        \"cusparseCcsrilu02_numericBoost\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZcsrilu02_numericBoost(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    info: cuda_types::cusparse::csrilu02Info_t,\n    enable_boost: ::core::ffi::c_int,\n    tol: *mut f64,\n    boost_val: *mut cuda_types::cusparse::cuDoubleComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseZcsrilu02_numericBoost\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseZcsrilu02_numericBoost\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(enable_boost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &enable_boost,\n        \"cusparseZcsrilu02_numericBoost\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(tol), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&tol, \"cusparseZcsrilu02_numericBoost\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(boost_val), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &boost_val,\n        \"cusparseZcsrilu02_numericBoost\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseXcsrilu02_zeroPivot(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    info: cuda_types::cusparse::csrilu02Info_t,\n    position: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseXcsrilu02_zeroPivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseXcsrilu02_zeroPivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(position), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &position,\n        \"cusparseXcsrilu02_zeroPivot\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseScsrilu02_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *mut f32,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csrilu02Info_t,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseScsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseScsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseScsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseScsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseScsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseScsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseScsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseScsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseScsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDcsrilu02_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *mut f64,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csrilu02Info_t,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDcsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDcsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseDcsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDcsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseDcsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseDcsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseDcsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDcsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseDcsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCcsrilu02_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *mut cuda_types::cusparse::cuComplex,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csrilu02Info_t,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCcsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCcsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCcsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCcsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseCcsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseCcsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseCcsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCcsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseCcsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZcsrilu02_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *mut cuda_types::cusparse::cuDoubleComplex,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csrilu02Info_t,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZcsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZcsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseZcsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZcsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseZcsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseZcsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseZcsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseZcsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseZcsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseScsrilu02_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedVal: *mut f32,\n    csrSortedRowPtr: *const ::core::ffi::c_int,\n    csrSortedColInd: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csrilu02Info_t,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseScsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseScsrilu02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseScsrilu02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseScsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedVal,\n        \"cusparseScsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtr,\n        \"cusparseScsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColInd,\n        \"cusparseScsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"cusparseScsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseScsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDcsrilu02_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedVal: *mut f64,\n    csrSortedRowPtr: *const ::core::ffi::c_int,\n    csrSortedColInd: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csrilu02Info_t,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDcsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDcsrilu02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseDcsrilu02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseDcsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedVal,\n        \"cusparseDcsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtr,\n        \"cusparseDcsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColInd,\n        \"cusparseDcsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"cusparseDcsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseDcsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCcsrilu02_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedVal: *mut cuda_types::cusparse::cuComplex,\n    csrSortedRowPtr: *const ::core::ffi::c_int,\n    csrSortedColInd: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csrilu02Info_t,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseCcsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCcsrilu02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCcsrilu02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseCcsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedVal,\n        \"cusparseCcsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtr,\n        \"cusparseCcsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColInd,\n        \"cusparseCcsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"cusparseCcsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseCcsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZcsrilu02_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedVal: *mut cuda_types::cusparse::cuDoubleComplex,\n    csrSortedRowPtr: *const ::core::ffi::c_int,\n    csrSortedColInd: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csrilu02Info_t,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseZcsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZcsrilu02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseZcsrilu02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseZcsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedVal,\n        \"cusparseZcsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtr,\n        \"cusparseZcsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColInd,\n        \"cusparseZcsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"cusparseZcsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseZcsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseScsrilu02_analysis(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f32,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csrilu02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseScsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseScsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseScsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseScsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseScsrilu02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseScsrilu02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseScsrilu02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseScsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseScsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseScsrilu02_analysis\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDcsrilu02_analysis(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f64,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csrilu02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDcsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDcsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseDcsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDcsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseDcsrilu02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseDcsrilu02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseDcsrilu02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDcsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseDcsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseDcsrilu02_analysis\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCcsrilu02_analysis(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const cuda_types::cusparse::cuComplex,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csrilu02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCcsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCcsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCcsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCcsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseCcsrilu02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseCcsrilu02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseCcsrilu02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCcsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseCcsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseCcsrilu02_analysis\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZcsrilu02_analysis(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csrilu02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZcsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZcsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseZcsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZcsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseZcsrilu02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseZcsrilu02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseZcsrilu02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseZcsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseZcsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseZcsrilu02_analysis\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseScsrilu02(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA_valM: *mut f32,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csrilu02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseScsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseScsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseScsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseScsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA_valM), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA_valM,\n        \"cusparseScsrilu02\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrA, \"cusparseScsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndA, \"cusparseScsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseScsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseScsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseScsrilu02\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDcsrilu02(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA_valM: *mut f64,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csrilu02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDcsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDcsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseDcsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDcsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA_valM), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA_valM,\n        \"cusparseDcsrilu02\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrA, \"cusparseDcsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndA, \"cusparseDcsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDcsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseDcsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseDcsrilu02\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCcsrilu02(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA_valM: *mut cuda_types::cusparse::cuComplex,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csrilu02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCcsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCcsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCcsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCcsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA_valM), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA_valM,\n        \"cusparseCcsrilu02\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrA, \"cusparseCcsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndA, \"cusparseCcsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCcsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseCcsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseCcsrilu02\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZcsrilu02(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA_valM: *mut cuda_types::cusparse::cuDoubleComplex,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csrilu02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZcsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZcsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseZcsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZcsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA_valM), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA_valM,\n        \"cusparseZcsrilu02\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrA, \"cusparseZcsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndA, \"cusparseZcsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseZcsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseZcsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseZcsrilu02\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSbsrilu02_numericBoost(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    info: cuda_types::cusparse::bsrilu02Info_t,\n    enable_boost: ::core::ffi::c_int,\n    tol: *mut f64,\n    boost_val: *mut f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseSbsrilu02_numericBoost\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseSbsrilu02_numericBoost\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(enable_boost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &enable_boost,\n        \"cusparseSbsrilu02_numericBoost\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(tol), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&tol, \"cusparseSbsrilu02_numericBoost\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(boost_val), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &boost_val,\n        \"cusparseSbsrilu02_numericBoost\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDbsrilu02_numericBoost(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    info: cuda_types::cusparse::bsrilu02Info_t,\n    enable_boost: ::core::ffi::c_int,\n    tol: *mut f64,\n    boost_val: *mut f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDbsrilu02_numericBoost\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDbsrilu02_numericBoost\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(enable_boost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &enable_boost,\n        \"cusparseDbsrilu02_numericBoost\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(tol), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&tol, \"cusparseDbsrilu02_numericBoost\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(boost_val), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &boost_val,\n        \"cusparseDbsrilu02_numericBoost\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCbsrilu02_numericBoost(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    info: cuda_types::cusparse::bsrilu02Info_t,\n    enable_boost: ::core::ffi::c_int,\n    tol: *mut f64,\n    boost_val: *mut cuda_types::cusparse::cuComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseCbsrilu02_numericBoost\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCbsrilu02_numericBoost\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(enable_boost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &enable_boost,\n        \"cusparseCbsrilu02_numericBoost\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(tol), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&tol, \"cusparseCbsrilu02_numericBoost\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(boost_val), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &boost_val,\n        \"cusparseCbsrilu02_numericBoost\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZbsrilu02_numericBoost(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    info: cuda_types::cusparse::bsrilu02Info_t,\n    enable_boost: ::core::ffi::c_int,\n    tol: *mut f64,\n    boost_val: *mut cuda_types::cusparse::cuDoubleComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseZbsrilu02_numericBoost\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseZbsrilu02_numericBoost\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(enable_boost), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &enable_boost,\n        \"cusparseZbsrilu02_numericBoost\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(tol), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&tol, \"cusparseZbsrilu02_numericBoost\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(boost_val), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &boost_val,\n        \"cusparseZbsrilu02_numericBoost\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseXbsrilu02_zeroPivot(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    info: cuda_types::cusparse::bsrilu02Info_t,\n    position: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseXbsrilu02_zeroPivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseXbsrilu02_zeroPivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(position), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &position,\n        \"cusparseXbsrilu02_zeroPivot\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSbsrilu02_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut f32,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrilu02Info_t,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSbsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseSbsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseSbsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseSbsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseSbsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseSbsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseSbsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseSbsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockDim,\n        \"cusparseSbsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseSbsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseSbsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDbsrilu02_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut f64,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrilu02Info_t,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDbsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseDbsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseDbsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseDbsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDbsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseDbsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseDbsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseDbsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockDim,\n        \"cusparseDbsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDbsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseDbsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCbsrilu02_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrilu02Info_t,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCbsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseCbsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseCbsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseCbsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCbsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseCbsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseCbsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseCbsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockDim,\n        \"cusparseCbsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCbsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseCbsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZbsrilu02_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrilu02Info_t,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZbsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseZbsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseZbsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseZbsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZbsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseZbsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseZbsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseZbsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockDim,\n        \"cusparseZbsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseZbsrilu02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseZbsrilu02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSbsrilu02_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut f32,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrilu02Info_t,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseSbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dirA,\n        \"cusparseSbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseSbsrilu02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzb,\n        \"cusparseSbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseSbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseSbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseSbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseSbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSize,\n        \"cusparseSbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"cusparseSbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseSbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDbsrilu02_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut f64,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrilu02Info_t,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dirA,\n        \"cusparseDbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseDbsrilu02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzb,\n        \"cusparseDbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseDbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseDbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseDbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseDbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSize,\n        \"cusparseDbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"cusparseDbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseDbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCbsrilu02_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrilu02Info_t,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseCbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dirA,\n        \"cusparseCbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseCbsrilu02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzb,\n        \"cusparseCbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseCbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseCbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseCbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseCbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSize,\n        \"cusparseCbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"cusparseCbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseCbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZbsrilu02_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrilu02Info_t,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseZbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dirA,\n        \"cusparseZbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseZbsrilu02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzb,\n        \"cusparseZbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseZbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseZbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseZbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseZbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSize,\n        \"cusparseZbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"cusparseZbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseZbsrilu02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSbsrilu02_analysis(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut f32,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrilu02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseSbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseSbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseSbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseSbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseSbsrilu02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseSbsrilu02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseSbsrilu02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseSbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseSbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseSbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseSbsrilu02_analysis\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDbsrilu02_analysis(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut f64,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrilu02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseDbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseDbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseDbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseDbsrilu02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseDbsrilu02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseDbsrilu02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseDbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseDbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseDbsrilu02_analysis\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCbsrilu02_analysis(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrilu02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseCbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseCbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseCbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseCbsrilu02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseCbsrilu02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseCbsrilu02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseCbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseCbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseCbsrilu02_analysis\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZbsrilu02_analysis(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrilu02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseZbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseZbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseZbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseZbsrilu02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseZbsrilu02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseZbsrilu02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseZbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseZbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseZbsrilu02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseZbsrilu02_analysis\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSbsrilu02(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut f32,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrilu02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseSbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseSbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseSbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseSbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedVal, \"cusparseSbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtr, \"cusparseSbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColInd, \"cusparseSbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseSbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseSbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseSbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseSbsrilu02\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDbsrilu02(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut f64,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrilu02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseDbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseDbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseDbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedVal, \"cusparseDbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtr, \"cusparseDbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColInd, \"cusparseDbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseDbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseDbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseDbsrilu02\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCbsrilu02(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrilu02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseCbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseCbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseCbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedVal, \"cusparseCbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtr, \"cusparseCbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColInd, \"cusparseCbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseCbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseCbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseCbsrilu02\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZbsrilu02(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsrilu02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseZbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseZbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseZbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedVal, \"cusparseZbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtr, \"cusparseZbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColInd, \"cusparseZbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseZbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseZbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseZbsrilu02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseZbsrilu02\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseXcsric02_zeroPivot(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    info: cuda_types::cusparse::csric02Info_t,\n    position: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseXcsric02_zeroPivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseXcsric02_zeroPivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(position), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&position, \"cusparseXcsric02_zeroPivot\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseScsric02_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *mut f32,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csric02Info_t,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseScsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseScsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseScsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseScsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseScsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseScsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseScsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseScsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseScsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDcsric02_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *mut f64,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csric02Info_t,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDcsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDcsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseDcsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDcsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseDcsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseDcsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseDcsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDcsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseDcsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCcsric02_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *mut cuda_types::cusparse::cuComplex,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csric02Info_t,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCcsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCcsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCcsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCcsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseCcsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseCcsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseCcsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCcsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseCcsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZcsric02_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *mut cuda_types::cusparse::cuDoubleComplex,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csric02Info_t,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZcsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZcsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseZcsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZcsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseZcsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseZcsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseZcsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseZcsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseZcsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseScsric02_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedVal: *mut f32,\n    csrSortedRowPtr: *const ::core::ffi::c_int,\n    csrSortedColInd: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csric02Info_t,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseScsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseScsric02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseScsric02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseScsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedVal,\n        \"cusparseScsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtr,\n        \"cusparseScsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColInd,\n        \"cusparseScsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseScsric02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseScsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDcsric02_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedVal: *mut f64,\n    csrSortedRowPtr: *const ::core::ffi::c_int,\n    csrSortedColInd: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csric02Info_t,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDcsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDcsric02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseDcsric02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseDcsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedVal,\n        \"cusparseDcsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtr,\n        \"cusparseDcsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColInd,\n        \"cusparseDcsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDcsric02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseDcsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCcsric02_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedVal: *mut cuda_types::cusparse::cuComplex,\n    csrSortedRowPtr: *const ::core::ffi::c_int,\n    csrSortedColInd: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csric02Info_t,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseCcsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCcsric02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCcsric02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseCcsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedVal,\n        \"cusparseCcsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtr,\n        \"cusparseCcsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColInd,\n        \"cusparseCcsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCcsric02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseCcsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZcsric02_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedVal: *mut cuda_types::cusparse::cuDoubleComplex,\n    csrSortedRowPtr: *const ::core::ffi::c_int,\n    csrSortedColInd: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csric02Info_t,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseZcsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZcsric02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseZcsric02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseZcsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedVal,\n        \"cusparseZcsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtr,\n        \"cusparseZcsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColInd,\n        \"cusparseZcsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseZcsric02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseZcsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseScsric02_analysis(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f32,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csric02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseScsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseScsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseScsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseScsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseScsric02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseScsric02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseScsric02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseScsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseScsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseScsric02_analysis\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDcsric02_analysis(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f64,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csric02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDcsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDcsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseDcsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDcsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseDcsric02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseDcsric02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseDcsric02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDcsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseDcsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseDcsric02_analysis\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCcsric02_analysis(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const cuda_types::cusparse::cuComplex,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csric02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCcsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCcsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCcsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCcsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseCcsric02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseCcsric02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseCcsric02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCcsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseCcsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseCcsric02_analysis\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZcsric02_analysis(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csric02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZcsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZcsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseZcsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZcsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseZcsric02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseZcsric02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseZcsric02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseZcsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseZcsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseZcsric02_analysis\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseScsric02(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA_valM: *mut f32,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csric02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseScsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseScsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseScsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseScsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA_valM), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValA_valM, \"cusparseScsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrA, \"cusparseScsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndA, \"cusparseScsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseScsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseScsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseScsric02\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDcsric02(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA_valM: *mut f64,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csric02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDcsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDcsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseDcsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDcsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA_valM), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValA_valM, \"cusparseDcsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrA, \"cusparseDcsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndA, \"cusparseDcsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDcsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseDcsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseDcsric02\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCcsric02(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA_valM: *mut cuda_types::cusparse::cuComplex,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csric02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCcsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCcsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCcsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCcsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA_valM), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValA_valM, \"cusparseCcsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrA, \"cusparseCcsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndA, \"cusparseCcsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCcsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseCcsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseCcsric02\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZcsric02(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA_valM: *mut cuda_types::cusparse::cuDoubleComplex,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::csric02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZcsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZcsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseZcsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZcsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA_valM), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValA_valM, \"cusparseZcsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrA, \"cusparseZcsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndA, \"cusparseZcsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseZcsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseZcsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseZcsric02\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseXbsric02_zeroPivot(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    info: cuda_types::cusparse::bsric02Info_t,\n    position: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseXbsric02_zeroPivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseXbsric02_zeroPivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(position), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&position, \"cusparseXbsric02_zeroPivot\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSbsric02_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut f32,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsric02Info_t,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSbsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseSbsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseSbsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseSbsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseSbsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseSbsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseSbsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseSbsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockDim,\n        \"cusparseSbsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseSbsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseSbsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDbsric02_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut f64,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsric02Info_t,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDbsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseDbsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseDbsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseDbsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDbsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseDbsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseDbsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseDbsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockDim,\n        \"cusparseDbsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDbsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseDbsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCbsric02_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsric02Info_t,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCbsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseCbsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseCbsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseCbsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCbsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseCbsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseCbsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseCbsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockDim,\n        \"cusparseCbsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCbsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseCbsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZbsric02_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsric02Info_t,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZbsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseZbsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseZbsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseZbsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZbsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseZbsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseZbsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseZbsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockDim,\n        \"cusparseZbsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseZbsric02_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseZbsric02_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSbsric02_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut f32,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsric02Info_t,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseSbsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseSbsric02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseSbsric02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseSbsric02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseSbsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseSbsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseSbsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseSbsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSize,\n        \"cusparseSbsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseSbsric02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseSbsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDbsric02_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut f64,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsric02Info_t,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDbsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseDbsric02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseDbsric02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseDbsric02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseDbsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseDbsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseDbsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseDbsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSize,\n        \"cusparseDbsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDbsric02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseDbsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCbsric02_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsric02Info_t,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseCbsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseCbsric02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseCbsric02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseCbsric02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseCbsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseCbsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseCbsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseCbsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSize,\n        \"cusparseCbsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCbsric02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseCbsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZbsric02_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockSize: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsric02Info_t,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseZbsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseZbsric02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseZbsric02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseZbsric02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseZbsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseZbsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseZbsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseZbsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &blockSize,\n        \"cusparseZbsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseZbsric02_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseZbsric02_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSbsric02_analysis(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *const f32,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsric02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pInputBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseSbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseSbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseSbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseSbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseSbsric02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseSbsric02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseSbsric02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseSbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseSbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseSbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pInputBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pInputBuffer,\n        \"cusparseSbsric02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDbsric02_analysis(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *const f64,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsric02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pInputBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseDbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseDbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseDbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseDbsric02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseDbsric02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseDbsric02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseDbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseDbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pInputBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pInputBuffer,\n        \"cusparseDbsric02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCbsric02_analysis(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *const cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsric02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pInputBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseCbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseCbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseCbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseCbsric02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseCbsric02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseCbsric02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseCbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseCbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pInputBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pInputBuffer,\n        \"cusparseCbsric02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZbsric02_analysis(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *const cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsric02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pInputBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseZbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseZbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseZbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseZbsric02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseZbsric02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseZbsric02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseZbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseZbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseZbsric02_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pInputBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pInputBuffer,\n        \"cusparseZbsric02_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSbsric02(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut f32,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsric02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseSbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseSbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseSbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseSbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedVal, \"cusparseSbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtr, \"cusparseSbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColInd, \"cusparseSbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseSbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseSbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseSbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseSbsric02\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDbsric02(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut f64,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsric02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseDbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseDbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseDbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedVal, \"cusparseDbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtr, \"cusparseDbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColInd, \"cusparseDbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseDbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseDbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseDbsric02\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCbsric02(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsric02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseCbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseCbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseCbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedVal, \"cusparseCbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtr, \"cusparseCbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColInd, \"cusparseCbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseCbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseCbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseCbsric02\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZbsric02(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedVal: *mut cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    info: cuda_types::cusparse::bsric02Info_t,\n    policy: cuda_types::cusparse::cusparseSolvePolicy_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseZbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseZbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseZbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedVal, \"cusparseZbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtr, \"cusparseZbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColInd, \"cusparseZbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseZbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseZbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(policy), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&policy, \"cusparseZbsric02\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseZbsric02\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSgtsv2_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    dl: *const f32,\n    d: *const f32,\n    du: *const f32,\n    B: *const f32,\n    ldb: ::core::ffi::c_int,\n    bufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseSgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseSgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dl, \"cusparseSgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d, \"cusparseSgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&du, \"cusparseSgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cusparseSgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cusparseSgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bufferSizeInBytes,\n        \"cusparseSgtsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDgtsv2_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    dl: *const f64,\n    d: *const f64,\n    du: *const f64,\n    B: *const f64,\n    ldb: ::core::ffi::c_int,\n    bufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseDgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dl, \"cusparseDgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d, \"cusparseDgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&du, \"cusparseDgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cusparseDgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cusparseDgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bufferSizeInBytes,\n        \"cusparseDgtsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCgtsv2_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    dl: *const cuda_types::cusparse::cuComplex,\n    d: *const cuda_types::cusparse::cuComplex,\n    du: *const cuda_types::cusparse::cuComplex,\n    B: *const cuda_types::cusparse::cuComplex,\n    ldb: ::core::ffi::c_int,\n    bufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseCgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dl, \"cusparseCgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d, \"cusparseCgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&du, \"cusparseCgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cusparseCgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cusparseCgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bufferSizeInBytes,\n        \"cusparseCgtsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZgtsv2_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    dl: *const cuda_types::cusparse::cuDoubleComplex,\n    d: *const cuda_types::cusparse::cuDoubleComplex,\n    du: *const cuda_types::cusparse::cuDoubleComplex,\n    B: *const cuda_types::cusparse::cuDoubleComplex,\n    ldb: ::core::ffi::c_int,\n    bufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseZgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dl, \"cusparseZgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d, \"cusparseZgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&du, \"cusparseZgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cusparseZgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cusparseZgtsv2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bufferSizeInBytes,\n        \"cusparseZgtsv2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSgtsv2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    dl: *const f32,\n    d: *const f32,\n    du: *const f32,\n    B: *mut f32,\n    ldb: ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseSgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseSgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dl, \"cusparseSgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d, \"cusparseSgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&du, \"cusparseSgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cusparseSgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cusparseSgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseSgtsv2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDgtsv2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    dl: *const f64,\n    d: *const f64,\n    du: *const f64,\n    B: *mut f64,\n    ldb: ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseDgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dl, \"cusparseDgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d, \"cusparseDgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&du, \"cusparseDgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cusparseDgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cusparseDgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseDgtsv2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCgtsv2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    dl: *const cuda_types::cusparse::cuComplex,\n    d: *const cuda_types::cusparse::cuComplex,\n    du: *const cuda_types::cusparse::cuComplex,\n    B: *mut cuda_types::cusparse::cuComplex,\n    ldb: ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseCgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dl, \"cusparseCgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d, \"cusparseCgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&du, \"cusparseCgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cusparseCgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cusparseCgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseCgtsv2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZgtsv2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    dl: *const cuda_types::cusparse::cuDoubleComplex,\n    d: *const cuda_types::cusparse::cuDoubleComplex,\n    du: *const cuda_types::cusparse::cuDoubleComplex,\n    B: *mut cuda_types::cusparse::cuDoubleComplex,\n    ldb: ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseZgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dl, \"cusparseZgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d, \"cusparseZgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&du, \"cusparseZgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cusparseZgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cusparseZgtsv2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseZgtsv2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSgtsv2_nopivot_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    dl: *const f32,\n    d: *const f32,\n    du: *const f32,\n    B: *const f32,\n    ldb: ::core::ffi::c_int,\n    bufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseSgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseSgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &n,\n        \"cusparseSgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dl,\n        \"cusparseSgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &d,\n        \"cusparseSgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &du,\n        \"cusparseSgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &B,\n        \"cusparseSgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ldb,\n        \"cusparseSgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bufferSizeInBytes,\n        \"cusparseSgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDgtsv2_nopivot_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    dl: *const f64,\n    d: *const f64,\n    du: *const f64,\n    B: *const f64,\n    ldb: ::core::ffi::c_int,\n    bufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseDgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &n,\n        \"cusparseDgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dl,\n        \"cusparseDgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &d,\n        \"cusparseDgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &du,\n        \"cusparseDgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &B,\n        \"cusparseDgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ldb,\n        \"cusparseDgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bufferSizeInBytes,\n        \"cusparseDgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCgtsv2_nopivot_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    dl: *const cuda_types::cusparse::cuComplex,\n    d: *const cuda_types::cusparse::cuComplex,\n    du: *const cuda_types::cusparse::cuComplex,\n    B: *const cuda_types::cusparse::cuComplex,\n    ldb: ::core::ffi::c_int,\n    bufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseCgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseCgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &n,\n        \"cusparseCgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dl,\n        \"cusparseCgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &d,\n        \"cusparseCgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &du,\n        \"cusparseCgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &B,\n        \"cusparseCgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ldb,\n        \"cusparseCgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bufferSizeInBytes,\n        \"cusparseCgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZgtsv2_nopivot_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    dl: *const cuda_types::cusparse::cuDoubleComplex,\n    d: *const cuda_types::cusparse::cuDoubleComplex,\n    du: *const cuda_types::cusparse::cuDoubleComplex,\n    B: *const cuda_types::cusparse::cuDoubleComplex,\n    ldb: ::core::ffi::c_int,\n    bufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseZgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseZgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &n,\n        \"cusparseZgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dl,\n        \"cusparseZgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &d,\n        \"cusparseZgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &du,\n        \"cusparseZgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &B,\n        \"cusparseZgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ldb,\n        \"cusparseZgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bufferSizeInBytes,\n        \"cusparseZgtsv2_nopivot_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSgtsv2_nopivot(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    dl: *const f32,\n    d: *const f32,\n    du: *const f32,\n    B: *mut f32,\n    ldb: ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseSgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseSgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dl, \"cusparseSgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d, \"cusparseSgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&du, \"cusparseSgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cusparseSgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cusparseSgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseSgtsv2_nopivot\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDgtsv2_nopivot(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    dl: *const f64,\n    d: *const f64,\n    du: *const f64,\n    B: *mut f64,\n    ldb: ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseDgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dl, \"cusparseDgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d, \"cusparseDgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&du, \"cusparseDgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cusparseDgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cusparseDgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseDgtsv2_nopivot\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCgtsv2_nopivot(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    dl: *const cuda_types::cusparse::cuComplex,\n    d: *const cuda_types::cusparse::cuComplex,\n    du: *const cuda_types::cusparse::cuComplex,\n    B: *mut cuda_types::cusparse::cuComplex,\n    ldb: ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseCgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dl, \"cusparseCgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d, \"cusparseCgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&du, \"cusparseCgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cusparseCgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cusparseCgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseCgtsv2_nopivot\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZgtsv2_nopivot(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    dl: *const cuda_types::cusparse::cuDoubleComplex,\n    d: *const cuda_types::cusparse::cuDoubleComplex,\n    du: *const cuda_types::cusparse::cuDoubleComplex,\n    B: *mut cuda_types::cusparse::cuDoubleComplex,\n    ldb: ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseZgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dl, \"cusparseZgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d, \"cusparseZgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&du, \"cusparseZgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(B), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&B, \"cusparseZgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ldb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ldb, \"cusparseZgtsv2_nopivot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseZgtsv2_nopivot\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSgtsv2StridedBatch_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    dl: *const f32,\n    d: *const f32,\n    du: *const f32,\n    x: *const f32,\n    batchCount: ::core::ffi::c_int,\n    batchStride: ::core::ffi::c_int,\n    bufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseSgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseSgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dl,\n        \"cusparseSgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &d,\n        \"cusparseSgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &du,\n        \"cusparseSgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cusparseSgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseSgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchStride,\n        \"cusparseSgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bufferSizeInBytes,\n        \"cusparseSgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDgtsv2StridedBatch_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    dl: *const f64,\n    d: *const f64,\n    du: *const f64,\n    x: *const f64,\n    batchCount: ::core::ffi::c_int,\n    batchStride: ::core::ffi::c_int,\n    bufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseDgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dl,\n        \"cusparseDgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &d,\n        \"cusparseDgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &du,\n        \"cusparseDgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cusparseDgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseDgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchStride,\n        \"cusparseDgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bufferSizeInBytes,\n        \"cusparseDgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCgtsv2StridedBatch_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    dl: *const cuda_types::cusparse::cuComplex,\n    d: *const cuda_types::cusparse::cuComplex,\n    du: *const cuda_types::cusparse::cuComplex,\n    x: *const cuda_types::cusparse::cuComplex,\n    batchCount: ::core::ffi::c_int,\n    batchStride: ::core::ffi::c_int,\n    bufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseCgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseCgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dl,\n        \"cusparseCgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &d,\n        \"cusparseCgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &du,\n        \"cusparseCgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cusparseCgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseCgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchStride,\n        \"cusparseCgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bufferSizeInBytes,\n        \"cusparseCgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZgtsv2StridedBatch_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    dl: *const cuda_types::cusparse::cuDoubleComplex,\n    d: *const cuda_types::cusparse::cuDoubleComplex,\n    du: *const cuda_types::cusparse::cuDoubleComplex,\n    x: *const cuda_types::cusparse::cuDoubleComplex,\n    batchCount: ::core::ffi::c_int,\n    batchStride: ::core::ffi::c_int,\n    bufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseZgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseZgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dl,\n        \"cusparseZgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &d,\n        \"cusparseZgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &du,\n        \"cusparseZgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cusparseZgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseZgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchStride,\n        \"cusparseZgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bufferSizeInBytes,\n        \"cusparseZgtsv2StridedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSgtsv2StridedBatch(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    dl: *const f32,\n    d: *const f32,\n    du: *const f32,\n    x: *mut f32,\n    batchCount: ::core::ffi::c_int,\n    batchStride: ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSgtsv2StridedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseSgtsv2StridedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dl, \"cusparseSgtsv2StridedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d, \"cusparseSgtsv2StridedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&du, \"cusparseSgtsv2StridedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cusparseSgtsv2StridedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseSgtsv2StridedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchStride,\n        \"cusparseSgtsv2StridedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseSgtsv2StridedBatch\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDgtsv2StridedBatch(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    dl: *const f64,\n    d: *const f64,\n    du: *const f64,\n    x: *mut f64,\n    batchCount: ::core::ffi::c_int,\n    batchStride: ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDgtsv2StridedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDgtsv2StridedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dl, \"cusparseDgtsv2StridedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d, \"cusparseDgtsv2StridedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&du, \"cusparseDgtsv2StridedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cusparseDgtsv2StridedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseDgtsv2StridedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchStride,\n        \"cusparseDgtsv2StridedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseDgtsv2StridedBatch\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCgtsv2StridedBatch(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    dl: *const cuda_types::cusparse::cuComplex,\n    d: *const cuda_types::cusparse::cuComplex,\n    du: *const cuda_types::cusparse::cuComplex,\n    x: *mut cuda_types::cusparse::cuComplex,\n    batchCount: ::core::ffi::c_int,\n    batchStride: ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCgtsv2StridedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCgtsv2StridedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dl, \"cusparseCgtsv2StridedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d, \"cusparseCgtsv2StridedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&du, \"cusparseCgtsv2StridedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cusparseCgtsv2StridedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseCgtsv2StridedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchStride,\n        \"cusparseCgtsv2StridedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseCgtsv2StridedBatch\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZgtsv2StridedBatch(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    dl: *const cuda_types::cusparse::cuDoubleComplex,\n    d: *const cuda_types::cusparse::cuDoubleComplex,\n    du: *const cuda_types::cusparse::cuDoubleComplex,\n    x: *mut cuda_types::cusparse::cuDoubleComplex,\n    batchCount: ::core::ffi::c_int,\n    batchStride: ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZgtsv2StridedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZgtsv2StridedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dl, \"cusparseZgtsv2StridedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d, \"cusparseZgtsv2StridedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&du, \"cusparseZgtsv2StridedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cusparseZgtsv2StridedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseZgtsv2StridedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchStride,\n        \"cusparseZgtsv2StridedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseZgtsv2StridedBatch\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSgtsvInterleavedBatch_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    algo: ::core::ffi::c_int,\n    m: ::core::ffi::c_int,\n    dl: *const f32,\n    d: *const f32,\n    du: *const f32,\n    x: *const f32,\n    batchCount: ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseSgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cusparseSgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseSgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dl,\n        \"cusparseSgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &d,\n        \"cusparseSgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &du,\n        \"cusparseSgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cusparseSgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseSgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseSgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDgtsvInterleavedBatch_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    algo: ::core::ffi::c_int,\n    m: ::core::ffi::c_int,\n    dl: *const f64,\n    d: *const f64,\n    du: *const f64,\n    x: *const f64,\n    batchCount: ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cusparseDgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseDgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dl,\n        \"cusparseDgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &d,\n        \"cusparseDgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &du,\n        \"cusparseDgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cusparseDgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseDgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseDgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCgtsvInterleavedBatch_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    algo: ::core::ffi::c_int,\n    m: ::core::ffi::c_int,\n    dl: *const cuda_types::cusparse::cuComplex,\n    d: *const cuda_types::cusparse::cuComplex,\n    du: *const cuda_types::cusparse::cuComplex,\n    x: *const cuda_types::cusparse::cuComplex,\n    batchCount: ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseCgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cusparseCgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseCgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dl,\n        \"cusparseCgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &d,\n        \"cusparseCgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &du,\n        \"cusparseCgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cusparseCgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseCgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseCgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZgtsvInterleavedBatch_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    algo: ::core::ffi::c_int,\n    m: ::core::ffi::c_int,\n    dl: *const cuda_types::cusparse::cuDoubleComplex,\n    d: *const cuda_types::cusparse::cuDoubleComplex,\n    du: *const cuda_types::cusparse::cuDoubleComplex,\n    x: *const cuda_types::cusparse::cuDoubleComplex,\n    batchCount: ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseZgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cusparseZgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseZgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dl,\n        \"cusparseZgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &d,\n        \"cusparseZgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &du,\n        \"cusparseZgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cusparseZgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseZgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseZgtsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSgtsvInterleavedBatch(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    algo: ::core::ffi::c_int,\n    m: ::core::ffi::c_int,\n    dl: *mut f32,\n    d: *mut f32,\n    du: *mut f32,\n    x: *mut f32,\n    batchCount: ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseSgtsvInterleavedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cusparseSgtsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseSgtsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dl, \"cusparseSgtsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d, \"cusparseSgtsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&du, \"cusparseSgtsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cusparseSgtsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseSgtsvInterleavedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBuffer,\n        \"cusparseSgtsvInterleavedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDgtsvInterleavedBatch(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    algo: ::core::ffi::c_int,\n    m: ::core::ffi::c_int,\n    dl: *mut f64,\n    d: *mut f64,\n    du: *mut f64,\n    x: *mut f64,\n    batchCount: ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDgtsvInterleavedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cusparseDgtsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDgtsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dl, \"cusparseDgtsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d, \"cusparseDgtsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&du, \"cusparseDgtsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cusparseDgtsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseDgtsvInterleavedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBuffer,\n        \"cusparseDgtsvInterleavedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCgtsvInterleavedBatch(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    algo: ::core::ffi::c_int,\n    m: ::core::ffi::c_int,\n    dl: *mut cuda_types::cusparse::cuComplex,\n    d: *mut cuda_types::cusparse::cuComplex,\n    du: *mut cuda_types::cusparse::cuComplex,\n    x: *mut cuda_types::cusparse::cuComplex,\n    batchCount: ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseCgtsvInterleavedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cusparseCgtsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCgtsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dl, \"cusparseCgtsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d, \"cusparseCgtsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&du, \"cusparseCgtsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cusparseCgtsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseCgtsvInterleavedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBuffer,\n        \"cusparseCgtsvInterleavedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZgtsvInterleavedBatch(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    algo: ::core::ffi::c_int,\n    m: ::core::ffi::c_int,\n    dl: *mut cuda_types::cusparse::cuDoubleComplex,\n    d: *mut cuda_types::cusparse::cuDoubleComplex,\n    du: *mut cuda_types::cusparse::cuDoubleComplex,\n    x: *mut cuda_types::cusparse::cuDoubleComplex,\n    batchCount: ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseZgtsvInterleavedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cusparseZgtsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZgtsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dl, \"cusparseZgtsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d, \"cusparseZgtsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&du, \"cusparseZgtsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cusparseZgtsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseZgtsvInterleavedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBuffer,\n        \"cusparseZgtsvInterleavedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSgpsvInterleavedBatch_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    algo: ::core::ffi::c_int,\n    m: ::core::ffi::c_int,\n    ds: *const f32,\n    dl: *const f32,\n    d: *const f32,\n    du: *const f32,\n    dw: *const f32,\n    x: *const f32,\n    batchCount: ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseSgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cusparseSgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseSgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ds), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ds,\n        \"cusparseSgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dl,\n        \"cusparseSgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &d,\n        \"cusparseSgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &du,\n        \"cusparseSgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dw), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dw,\n        \"cusparseSgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cusparseSgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseSgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseSgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDgpsvInterleavedBatch_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    algo: ::core::ffi::c_int,\n    m: ::core::ffi::c_int,\n    ds: *const f64,\n    dl: *const f64,\n    d: *const f64,\n    du: *const f64,\n    dw: *const f64,\n    x: *const f64,\n    batchCount: ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cusparseDgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseDgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ds), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ds,\n        \"cusparseDgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dl,\n        \"cusparseDgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &d,\n        \"cusparseDgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &du,\n        \"cusparseDgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dw), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dw,\n        \"cusparseDgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cusparseDgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseDgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseDgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCgpsvInterleavedBatch_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    algo: ::core::ffi::c_int,\n    m: ::core::ffi::c_int,\n    ds: *const cuda_types::cusparse::cuComplex,\n    dl: *const cuda_types::cusparse::cuComplex,\n    d: *const cuda_types::cusparse::cuComplex,\n    du: *const cuda_types::cusparse::cuComplex,\n    dw: *const cuda_types::cusparse::cuComplex,\n    x: *const cuda_types::cusparse::cuComplex,\n    batchCount: ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseCgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cusparseCgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseCgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ds), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ds,\n        \"cusparseCgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dl,\n        \"cusparseCgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &d,\n        \"cusparseCgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &du,\n        \"cusparseCgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dw), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dw,\n        \"cusparseCgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cusparseCgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseCgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseCgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZgpsvInterleavedBatch_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    algo: ::core::ffi::c_int,\n    m: ::core::ffi::c_int,\n    ds: *const cuda_types::cusparse::cuDoubleComplex,\n    dl: *const cuda_types::cusparse::cuDoubleComplex,\n    d: *const cuda_types::cusparse::cuDoubleComplex,\n    du: *const cuda_types::cusparse::cuDoubleComplex,\n    dw: *const cuda_types::cusparse::cuDoubleComplex,\n    x: *const cuda_types::cusparse::cuDoubleComplex,\n    batchCount: ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseZgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &algo,\n        \"cusparseZgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseZgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ds), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ds,\n        \"cusparseZgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dl,\n        \"cusparseZgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &d,\n        \"cusparseZgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &du,\n        \"cusparseZgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dw), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dw,\n        \"cusparseZgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &x,\n        \"cusparseZgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseZgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseZgpsvInterleavedBatch_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSgpsvInterleavedBatch(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    algo: ::core::ffi::c_int,\n    m: ::core::ffi::c_int,\n    ds: *mut f32,\n    dl: *mut f32,\n    d: *mut f32,\n    du: *mut f32,\n    dw: *mut f32,\n    x: *mut f32,\n    batchCount: ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseSgpsvInterleavedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cusparseSgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseSgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ds), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ds, \"cusparseSgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dl, \"cusparseSgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d, \"cusparseSgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&du, \"cusparseSgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dw), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dw, \"cusparseSgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cusparseSgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseSgpsvInterleavedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBuffer,\n        \"cusparseSgpsvInterleavedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDgpsvInterleavedBatch(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    algo: ::core::ffi::c_int,\n    m: ::core::ffi::c_int,\n    ds: *mut f64,\n    dl: *mut f64,\n    d: *mut f64,\n    du: *mut f64,\n    dw: *mut f64,\n    x: *mut f64,\n    batchCount: ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDgpsvInterleavedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cusparseDgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ds), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ds, \"cusparseDgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dl, \"cusparseDgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d, \"cusparseDgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&du, \"cusparseDgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dw), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dw, \"cusparseDgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cusparseDgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseDgpsvInterleavedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBuffer,\n        \"cusparseDgpsvInterleavedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCgpsvInterleavedBatch(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    algo: ::core::ffi::c_int,\n    m: ::core::ffi::c_int,\n    ds: *mut cuda_types::cusparse::cuComplex,\n    dl: *mut cuda_types::cusparse::cuComplex,\n    d: *mut cuda_types::cusparse::cuComplex,\n    du: *mut cuda_types::cusparse::cuComplex,\n    dw: *mut cuda_types::cusparse::cuComplex,\n    x: *mut cuda_types::cusparse::cuComplex,\n    batchCount: ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseCgpsvInterleavedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cusparseCgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ds), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ds, \"cusparseCgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dl, \"cusparseCgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d, \"cusparseCgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&du, \"cusparseCgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dw), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dw, \"cusparseCgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cusparseCgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseCgpsvInterleavedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBuffer,\n        \"cusparseCgpsvInterleavedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZgpsvInterleavedBatch(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    algo: ::core::ffi::c_int,\n    m: ::core::ffi::c_int,\n    ds: *mut cuda_types::cusparse::cuDoubleComplex,\n    dl: *mut cuda_types::cusparse::cuDoubleComplex,\n    d: *mut cuda_types::cusparse::cuDoubleComplex,\n    du: *mut cuda_types::cusparse::cuDoubleComplex,\n    dw: *mut cuda_types::cusparse::cuDoubleComplex,\n    x: *mut cuda_types::cusparse::cuDoubleComplex,\n    batchCount: ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseZgpsvInterleavedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(algo), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&algo, \"cusparseZgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ds), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ds, \"cusparseZgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dl), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dl, \"cusparseZgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(d), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&d, \"cusparseZgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(du), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&du, \"cusparseZgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dw), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dw, \"cusparseZgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(x), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&x, \"cusparseZgpsvInterleavedBatch\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseZgpsvInterleavedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBuffer,\n        \"cusparseZgpsvInterleavedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseScsrgeam2_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    nnzA: ::core::ffi::c_int,\n    csrSortedValA: *const f32,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    beta: *const f32,\n    descrB: cuda_types::cusparse::cusparseMatDescr_t,\n    nnzB: ::core::ffi::c_int,\n    csrSortedValB: *const f32,\n    csrSortedRowPtrB: *const ::core::ffi::c_int,\n    csrSortedColIndB: *const ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *const f32,\n    csrSortedRowPtrC: *const ::core::ffi::c_int,\n    csrSortedColIndC: *const ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseScsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseScsrgeam2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseScsrgeam2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha,\n        \"cusparseScsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseScsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzA,\n        \"cusparseScsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseScsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseScsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseScsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &beta,\n        \"cusparseScsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrB,\n        \"cusparseScsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzB,\n        \"cusparseScsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValB,\n        \"cusparseScsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrB,\n        \"cusparseScsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndB,\n        \"cusparseScsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrC,\n        \"cusparseScsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValC,\n        \"cusparseScsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseScsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndC,\n        \"cusparseScsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseScsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDcsrgeam2_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f64,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    nnzA: ::core::ffi::c_int,\n    csrSortedValA: *const f64,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    beta: *const f64,\n    descrB: cuda_types::cusparse::cusparseMatDescr_t,\n    nnzB: ::core::ffi::c_int,\n    csrSortedValB: *const f64,\n    csrSortedRowPtrB: *const ::core::ffi::c_int,\n    csrSortedColIndB: *const ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *const f64,\n    csrSortedRowPtrC: *const ::core::ffi::c_int,\n    csrSortedColIndC: *const ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDcsrgeam2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseDcsrgeam2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha,\n        \"cusparseDcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseDcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzA,\n        \"cusparseDcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseDcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseDcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseDcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &beta,\n        \"cusparseDcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrB,\n        \"cusparseDcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzB,\n        \"cusparseDcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValB,\n        \"cusparseDcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrB,\n        \"cusparseDcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndB,\n        \"cusparseDcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrC,\n        \"cusparseDcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValC,\n        \"cusparseDcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseDcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndC,\n        \"cusparseDcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseDcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCcsrgeam2_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cusparse::cuComplex,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    nnzA: ::core::ffi::c_int,\n    csrSortedValA: *const cuda_types::cusparse::cuComplex,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    beta: *const cuda_types::cusparse::cuComplex,\n    descrB: cuda_types::cusparse::cusparseMatDescr_t,\n    nnzB: ::core::ffi::c_int,\n    csrSortedValB: *const cuda_types::cusparse::cuComplex,\n    csrSortedRowPtrB: *const ::core::ffi::c_int,\n    csrSortedColIndB: *const ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *const cuda_types::cusparse::cuComplex,\n    csrSortedRowPtrC: *const ::core::ffi::c_int,\n    csrSortedColIndC: *const ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseCcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCcsrgeam2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseCcsrgeam2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha,\n        \"cusparseCcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseCcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzA,\n        \"cusparseCcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseCcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseCcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseCcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &beta,\n        \"cusparseCcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrB,\n        \"cusparseCcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzB,\n        \"cusparseCcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValB,\n        \"cusparseCcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrB,\n        \"cusparseCcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndB,\n        \"cusparseCcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrC,\n        \"cusparseCcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValC,\n        \"cusparseCcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseCcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndC,\n        \"cusparseCcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseCcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZcsrgeam2_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cusparse::cuDoubleComplex,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    nnzA: ::core::ffi::c_int,\n    csrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    beta: *const cuda_types::cusparse::cuDoubleComplex,\n    descrB: cuda_types::cusparse::cusparseMatDescr_t,\n    nnzB: ::core::ffi::c_int,\n    csrSortedValB: *const cuda_types::cusparse::cuDoubleComplex,\n    csrSortedRowPtrB: *const ::core::ffi::c_int,\n    csrSortedColIndB: *const ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *const cuda_types::cusparse::cuDoubleComplex,\n    csrSortedRowPtrC: *const ::core::ffi::c_int,\n    csrSortedColIndC: *const ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseZcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZcsrgeam2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseZcsrgeam2_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alpha,\n        \"cusparseZcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseZcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzA,\n        \"cusparseZcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseZcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseZcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseZcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &beta,\n        \"cusparseZcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrB,\n        \"cusparseZcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzB,\n        \"cusparseZcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValB,\n        \"cusparseZcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrB,\n        \"cusparseZcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndB,\n        \"cusparseZcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrC,\n        \"cusparseZcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValC,\n        \"cusparseZcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseZcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndC,\n        \"cusparseZcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseZcsrgeam2_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseXcsrgeam2Nnz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    nnzA: ::core::ffi::c_int,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    descrB: cuda_types::cusparse::cusparseMatDescr_t,\n    nnzB: ::core::ffi::c_int,\n    csrSortedRowPtrB: *const ::core::ffi::c_int,\n    csrSortedColIndB: *const ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedRowPtrC: *mut ::core::ffi::c_int,\n    nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n    workspace: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseXcsrgeam2Nnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseXcsrgeam2Nnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseXcsrgeam2Nnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseXcsrgeam2Nnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzA, \"cusparseXcsrgeam2Nnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseXcsrgeam2Nnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseXcsrgeam2Nnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrB, \"cusparseXcsrgeam2Nnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzB, \"cusparseXcsrgeam2Nnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrB,\n        \"cusparseXcsrgeam2Nnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndB,\n        \"cusparseXcsrgeam2Nnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseXcsrgeam2Nnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseXcsrgeam2Nnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzTotalDevHostPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzTotalDevHostPtr,\n        \"cusparseXcsrgeam2Nnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(workspace), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&workspace, \"cusparseXcsrgeam2Nnz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseScsrgeam2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f32,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    nnzA: ::core::ffi::c_int,\n    csrSortedValA: *const f32,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    beta: *const f32,\n    descrB: cuda_types::cusparse::cusparseMatDescr_t,\n    nnzB: ::core::ffi::c_int,\n    csrSortedValB: *const f32,\n    csrSortedRowPtrB: *const ::core::ffi::c_int,\n    csrSortedColIndB: *const ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *mut f32,\n    csrSortedRowPtrC: *mut ::core::ffi::c_int,\n    csrSortedColIndC: *mut ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseScsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseScsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseScsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseScsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseScsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzA, \"cusparseScsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValA, \"cusparseScsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrA, \"cusparseScsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndA, \"cusparseScsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseScsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrB, \"cusparseScsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzB, \"cusparseScsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValB, \"cusparseScsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrB, \"cusparseScsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndB, \"cusparseScsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseScsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValC, \"cusparseScsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrC, \"cusparseScsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndC, \"cusparseScsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseScsrgeam2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDcsrgeam2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const f64,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    nnzA: ::core::ffi::c_int,\n    csrSortedValA: *const f64,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    beta: *const f64,\n    descrB: cuda_types::cusparse::cusparseMatDescr_t,\n    nnzB: ::core::ffi::c_int,\n    csrSortedValB: *const f64,\n    csrSortedRowPtrB: *const ::core::ffi::c_int,\n    csrSortedColIndB: *const ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *mut f64,\n    csrSortedRowPtrC: *mut ::core::ffi::c_int,\n    csrSortedColIndC: *mut ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseDcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseDcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzA, \"cusparseDcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValA, \"cusparseDcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrA, \"cusparseDcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndA, \"cusparseDcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseDcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrB, \"cusparseDcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzB, \"cusparseDcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValB, \"cusparseDcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrB, \"cusparseDcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndB, \"cusparseDcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseDcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValC, \"cusparseDcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrC, \"cusparseDcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndC, \"cusparseDcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseDcsrgeam2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCcsrgeam2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cusparse::cuComplex,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    nnzA: ::core::ffi::c_int,\n    csrSortedValA: *const cuda_types::cusparse::cuComplex,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    beta: *const cuda_types::cusparse::cuComplex,\n    descrB: cuda_types::cusparse::cusparseMatDescr_t,\n    nnzB: ::core::ffi::c_int,\n    csrSortedValB: *const cuda_types::cusparse::cuComplex,\n    csrSortedRowPtrB: *const ::core::ffi::c_int,\n    csrSortedColIndB: *const ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *mut cuda_types::cusparse::cuComplex,\n    csrSortedRowPtrC: *mut ::core::ffi::c_int,\n    csrSortedColIndC: *mut ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseCcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseCcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzA, \"cusparseCcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValA, \"cusparseCcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrA, \"cusparseCcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndA, \"cusparseCcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseCcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrB, \"cusparseCcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzB, \"cusparseCcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValB, \"cusparseCcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrB, \"cusparseCcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndB, \"cusparseCcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseCcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValC, \"cusparseCcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrC, \"cusparseCcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndC, \"cusparseCcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseCcsrgeam2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZcsrgeam2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    alpha: *const cuda_types::cusparse::cuDoubleComplex,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    nnzA: ::core::ffi::c_int,\n    csrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    beta: *const cuda_types::cusparse::cuDoubleComplex,\n    descrB: cuda_types::cusparse::cusparseMatDescr_t,\n    nnzB: ::core::ffi::c_int,\n    csrSortedValB: *const cuda_types::cusparse::cuDoubleComplex,\n    csrSortedRowPtrB: *const ::core::ffi::c_int,\n    csrSortedColIndB: *const ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *mut cuda_types::cusparse::cuDoubleComplex,\n    csrSortedRowPtrC: *mut ::core::ffi::c_int,\n    csrSortedColIndC: *mut ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseZcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseZcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzA, \"cusparseZcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValA, \"cusparseZcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrA, \"cusparseZcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndA, \"cusparseZcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseZcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrB, \"cusparseZcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzB, \"cusparseZcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValB, \"cusparseZcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrB, \"cusparseZcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndB, \"cusparseZcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseZcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValC, \"cusparseZcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrC, \"cusparseZcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndC, \"cusparseZcsrgeam2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseZcsrgeam2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseScsrcolor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f32,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    fractionToColor: *const f32,\n    ncolors: *mut ::core::ffi::c_int,\n    coloring: *mut ::core::ffi::c_int,\n    reordering: *mut ::core::ffi::c_int,\n    info: cuda_types::cusparse::cusparseColorInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseScsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseScsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseScsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseScsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValA, \"cusparseScsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrA, \"cusparseScsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndA, \"cusparseScsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fractionToColor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fractionToColor, \"cusparseScsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ncolors), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ncolors, \"cusparseScsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(coloring), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&coloring, \"cusparseScsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reordering), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&reordering, \"cusparseScsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseScsrcolor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDcsrcolor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f64,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    fractionToColor: *const f64,\n    ncolors: *mut ::core::ffi::c_int,\n    coloring: *mut ::core::ffi::c_int,\n    reordering: *mut ::core::ffi::c_int,\n    info: cuda_types::cusparse::cusparseColorInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseDcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValA, \"cusparseDcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrA, \"cusparseDcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndA, \"cusparseDcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fractionToColor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fractionToColor, \"cusparseDcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ncolors), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ncolors, \"cusparseDcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(coloring), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&coloring, \"cusparseDcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reordering), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&reordering, \"cusparseDcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDcsrcolor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCcsrcolor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const cuda_types::cusparse::cuComplex,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    fractionToColor: *const f32,\n    ncolors: *mut ::core::ffi::c_int,\n    coloring: *mut ::core::ffi::c_int,\n    reordering: *mut ::core::ffi::c_int,\n    info: cuda_types::cusparse::cusparseColorInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValA, \"cusparseCcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrA, \"cusparseCcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndA, \"cusparseCcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fractionToColor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fractionToColor, \"cusparseCcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ncolors), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ncolors, \"cusparseCcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(coloring), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&coloring, \"cusparseCcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reordering), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&reordering, \"cusparseCcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCcsrcolor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZcsrcolor(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    fractionToColor: *const f64,\n    ncolors: *mut ::core::ffi::c_int,\n    coloring: *mut ::core::ffi::c_int,\n    reordering: *mut ::core::ffi::c_int,\n    info: cuda_types::cusparse::cusparseColorInfo_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseZcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValA, \"cusparseZcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrA, \"cusparseZcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndA, \"cusparseZcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(fractionToColor), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&fractionToColor, \"cusparseZcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ncolors), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ncolors, \"cusparseZcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(coloring), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&coloring, \"cusparseZcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(reordering), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&reordering, \"cusparseZcsrcolor\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseZcsrcolor\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSnnz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    A: *const f32,\n    lda: ::core::ffi::c_int,\n    nnzPerRowCol: *mut ::core::ffi::c_int,\n    nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseSnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseSnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseSnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseSnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cusparseSnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cusparseSnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzPerRowCol), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzPerRowCol, \"cusparseSnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzTotalDevHostPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzTotalDevHostPtr, \"cusparseSnnz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDnnz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    A: *const f64,\n    lda: ::core::ffi::c_int,\n    nnzPerRowCol: *mut ::core::ffi::c_int,\n    nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseDnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseDnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cusparseDnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cusparseDnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzPerRowCol), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzPerRowCol, \"cusparseDnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzTotalDevHostPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzTotalDevHostPtr, \"cusparseDnnz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCnnz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    A: *const cuda_types::cusparse::cuComplex,\n    lda: ::core::ffi::c_int,\n    nnzPerRowCol: *mut ::core::ffi::c_int,\n    nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseCnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseCnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cusparseCnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cusparseCnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzPerRowCol), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzPerRowCol, \"cusparseCnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzTotalDevHostPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzTotalDevHostPtr, \"cusparseCnnz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZnnz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    A: *const cuda_types::cusparse::cuDoubleComplex,\n    lda: ::core::ffi::c_int,\n    nnzPerRowCol: *mut ::core::ffi::c_int,\n    nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseZnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseZnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cusparseZnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cusparseZnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzPerRowCol), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzPerRowCol, \"cusparseZnnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzTotalDevHostPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzTotalDevHostPtr, \"cusparseZnnz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSnnz_compress(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    descr: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f32,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    nnzPerRow: *mut ::core::ffi::c_int,\n    nnzC: *mut ::core::ffi::c_int,\n    tol: f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSnnz_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseSnnz_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descr, \"cusparseSnnz_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValA, \"cusparseSnnz_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseSnnz_compress\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzPerRow), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzPerRow, \"cusparseSnnz_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzC, \"cusparseSnnz_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(tol), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&tol, \"cusparseSnnz_compress\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDnnz_compress(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    descr: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f64,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    nnzPerRow: *mut ::core::ffi::c_int,\n    nnzC: *mut ::core::ffi::c_int,\n    tol: f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDnnz_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDnnz_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descr, \"cusparseDnnz_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValA, \"cusparseDnnz_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseDnnz_compress\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzPerRow), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzPerRow, \"cusparseDnnz_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzC, \"cusparseDnnz_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(tol), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&tol, \"cusparseDnnz_compress\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCnnz_compress(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    descr: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const cuda_types::cusparse::cuComplex,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    nnzPerRow: *mut ::core::ffi::c_int,\n    nnzC: *mut ::core::ffi::c_int,\n    tol: cuda_types::cusparse::cuComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCnnz_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCnnz_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descr, \"cusparseCnnz_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValA, \"cusparseCnnz_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseCnnz_compress\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzPerRow), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzPerRow, \"cusparseCnnz_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzC, \"cusparseCnnz_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(tol), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&tol, \"cusparseCnnz_compress\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZnnz_compress(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    descr: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    nnzPerRow: *mut ::core::ffi::c_int,\n    nnzC: *mut ::core::ffi::c_int,\n    tol: cuda_types::cusparse::cuDoubleComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZnnz_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZnnz_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descr, \"cusparseZnnz_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValA, \"cusparseZnnz_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseZnnz_compress\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzPerRow), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzPerRow, \"cusparseZnnz_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzC, \"cusparseZnnz_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(tol), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&tol, \"cusparseZnnz_compress\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseScsr2csr_compress(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f32,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    nnzA: ::core::ffi::c_int,\n    nnzPerRow: *const ::core::ffi::c_int,\n    csrSortedValC: *mut f32,\n    csrSortedColIndC: *mut ::core::ffi::c_int,\n    csrSortedRowPtrC: *mut ::core::ffi::c_int,\n    tol: f32,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseScsr2csr_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseScsr2csr_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseScsr2csr_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseScsr2csr_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseScsr2csr_compress\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseScsr2csr_compress\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseScsr2csr_compress\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzA, \"cusparseScsr2csr_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzPerRow), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzPerRow, \"cusparseScsr2csr_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValC,\n        \"cusparseScsr2csr_compress\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndC,\n        \"cusparseScsr2csr_compress\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseScsr2csr_compress\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(tol), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&tol, \"cusparseScsr2csr_compress\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDcsr2csr_compress(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f64,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    nnzA: ::core::ffi::c_int,\n    nnzPerRow: *const ::core::ffi::c_int,\n    csrSortedValC: *mut f64,\n    csrSortedColIndC: *mut ::core::ffi::c_int,\n    csrSortedRowPtrC: *mut ::core::ffi::c_int,\n    tol: f64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDcsr2csr_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDcsr2csr_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseDcsr2csr_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDcsr2csr_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseDcsr2csr_compress\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseDcsr2csr_compress\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseDcsr2csr_compress\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzA, \"cusparseDcsr2csr_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzPerRow), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzPerRow, \"cusparseDcsr2csr_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValC,\n        \"cusparseDcsr2csr_compress\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndC,\n        \"cusparseDcsr2csr_compress\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseDcsr2csr_compress\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(tol), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&tol, \"cusparseDcsr2csr_compress\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCcsr2csr_compress(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const cuda_types::cusparse::cuComplex,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    nnzA: ::core::ffi::c_int,\n    nnzPerRow: *const ::core::ffi::c_int,\n    csrSortedValC: *mut cuda_types::cusparse::cuComplex,\n    csrSortedColIndC: *mut ::core::ffi::c_int,\n    csrSortedRowPtrC: *mut ::core::ffi::c_int,\n    tol: cuda_types::cusparse::cuComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCcsr2csr_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCcsr2csr_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseCcsr2csr_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCcsr2csr_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseCcsr2csr_compress\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseCcsr2csr_compress\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseCcsr2csr_compress\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzA, \"cusparseCcsr2csr_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzPerRow), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzPerRow, \"cusparseCcsr2csr_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValC,\n        \"cusparseCcsr2csr_compress\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndC,\n        \"cusparseCcsr2csr_compress\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseCcsr2csr_compress\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(tol), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&tol, \"cusparseCcsr2csr_compress\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZcsr2csr_compress(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    nnzA: ::core::ffi::c_int,\n    nnzPerRow: *const ::core::ffi::c_int,\n    csrSortedValC: *mut cuda_types::cusparse::cuDoubleComplex,\n    csrSortedColIndC: *mut ::core::ffi::c_int,\n    csrSortedRowPtrC: *mut ::core::ffi::c_int,\n    tol: cuda_types::cusparse::cuDoubleComplex,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZcsr2csr_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZcsr2csr_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseZcsr2csr_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZcsr2csr_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseZcsr2csr_compress\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseZcsr2csr_compress\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseZcsr2csr_compress\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzA, \"cusparseZcsr2csr_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzPerRow), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzPerRow, \"cusparseZcsr2csr_compress\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValC,\n        \"cusparseZcsr2csr_compress\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndC,\n        \"cusparseZcsr2csr_compress\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseZcsr2csr_compress\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(tol), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&tol, \"cusparseZcsr2csr_compress\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseXcoo2csr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    cooRowInd: *const ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    m: ::core::ffi::c_int,\n    csrSortedRowPtr: *mut ::core::ffi::c_int,\n    idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseXcoo2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cooRowInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cooRowInd, \"cusparseXcoo2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseXcoo2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseXcoo2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtr, \"cusparseXcoo2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseXcoo2csr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseXcsr2coo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    csrSortedRowPtr: *const ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    m: ::core::ffi::c_int,\n    cooRowInd: *mut ::core::ffi::c_int,\n    idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseXcsr2coo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtr, \"cusparseXcsr2coo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseXcsr2coo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseXcsr2coo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cooRowInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cooRowInd, \"cusparseXcsr2coo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseXcsr2coo\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseXcsr2bsrNnz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n    nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseXcsr2bsrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseXcsr2bsrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseXcsr2bsrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseXcsr2bsrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseXcsr2bsrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseXcsr2bsrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseXcsr2bsrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseXcsr2bsrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseXcsr2bsrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrC,\n        \"cusparseXcsr2bsrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzTotalDevHostPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzTotalDevHostPtr,\n        \"cusparseXcsr2bsrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseScsr2bsr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f32,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValC: *mut f32,\n    bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n    bsrSortedColIndC: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseScsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseScsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseScsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseScsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseScsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValA, \"cusparseScsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrA, \"cusparseScsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndA, \"cusparseScsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseScsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseScsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValC, \"cusparseScsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrC, \"cusparseScsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndC, \"cusparseScsr2bsr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDcsr2bsr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f64,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValC: *mut f64,\n    bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n    bsrSortedColIndC: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseDcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseDcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValA, \"cusparseDcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrA, \"cusparseDcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndA, \"cusparseDcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseDcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseDcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValC, \"cusparseDcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrC, \"cusparseDcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndC, \"cusparseDcsr2bsr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCcsr2bsr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const cuda_types::cusparse::cuComplex,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValC: *mut cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n    bsrSortedColIndC: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseCcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseCcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValA, \"cusparseCcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrA, \"cusparseCcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndA, \"cusparseCcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseCcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseCcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValC, \"cusparseCcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrC, \"cusparseCcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndC, \"cusparseCcsr2bsr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZcsr2bsr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValC: *mut cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n    bsrSortedColIndC: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseZcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseZcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValA, \"cusparseZcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrA, \"cusparseZcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndA, \"cusparseZcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseZcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseZcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValC, \"cusparseZcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrC, \"cusparseZcsr2bsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndC, \"cusparseZcsr2bsr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSbsr2csr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const f32,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *mut f32,\n    csrSortedRowPtrC: *mut ::core::ffi::c_int,\n    csrSortedColIndC: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseSbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseSbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseSbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseSbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValA, \"cusparseSbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrA, \"cusparseSbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndA, \"cusparseSbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseSbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseSbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValC, \"cusparseSbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrC, \"cusparseSbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndC, \"cusparseSbsr2csr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDbsr2csr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const f64,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *mut f64,\n    csrSortedRowPtrC: *mut ::core::ffi::c_int,\n    csrSortedColIndC: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseDbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseDbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseDbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValA, \"cusparseDbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrA, \"cusparseDbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndA, \"cusparseDbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseDbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseDbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValC, \"cusparseDbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrC, \"cusparseDbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndC, \"cusparseDbsr2csr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCbsr2csr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *mut cuda_types::cusparse::cuComplex,\n    csrSortedRowPtrC: *mut ::core::ffi::c_int,\n    csrSortedColIndC: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseCbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseCbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseCbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValA, \"cusparseCbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrA, \"cusparseCbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndA, \"cusparseCbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseCbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseCbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValC, \"cusparseCbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrC, \"cusparseCbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndC, \"cusparseCbsr2csr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZbsr2csr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    blockDim: ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *mut cuda_types::cusparse::cuDoubleComplex,\n    csrSortedRowPtrC: *mut ::core::ffi::c_int,\n    csrSortedColIndC: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseZbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseZbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseZbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValA, \"cusparseZbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrA, \"cusparseZbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndA, \"cusparseZbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(blockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&blockDim, \"cusparseZbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseZbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValC, \"cusparseZbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrC, \"cusparseZbsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndC, \"cusparseZbsr2csr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSgebsr2gebsc_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    bsrSortedVal: *const f32,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseSgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseSgebsr2gebsc_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseSgebsr2gebsc_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzb,\n        \"cusparseSgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseSgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseSgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseSgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDim,\n        \"cusparseSgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDim,\n        \"cusparseSgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseSgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDgebsr2gebsc_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    bsrSortedVal: *const f64,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseDgebsr2gebsc_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseDgebsr2gebsc_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzb,\n        \"cusparseDgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseDgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseDgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseDgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDim,\n        \"cusparseDgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDim,\n        \"cusparseDgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseDgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCgebsr2gebsc_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    bsrSortedVal: *const cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseCgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseCgebsr2gebsc_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseCgebsr2gebsc_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzb,\n        \"cusparseCgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseCgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseCgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseCgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDim,\n        \"cusparseCgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDim,\n        \"cusparseCgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseCgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZgebsr2gebsc_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    bsrSortedVal: *const cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseZgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseZgebsr2gebsc_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseZgebsr2gebsc_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzb,\n        \"cusparseZgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseZgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseZgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseZgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDim,\n        \"cusparseZgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDim,\n        \"cusparseZgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseZgebsr2gebsc_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSgebsr2gebsc_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    bsrSortedVal: *const f32,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseSgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mb,\n        \"cusparseSgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nb,\n        \"cusparseSgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzb,\n        \"cusparseSgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseSgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseSgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseSgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDim,\n        \"cusparseSgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDim,\n        \"cusparseSgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseSgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDgebsr2gebsc_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    bsrSortedVal: *const f64,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mb,\n        \"cusparseDgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nb,\n        \"cusparseDgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzb,\n        \"cusparseDgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseDgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseDgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseDgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDim,\n        \"cusparseDgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDim,\n        \"cusparseDgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseDgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCgebsr2gebsc_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    bsrSortedVal: *const cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseCgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mb,\n        \"cusparseCgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nb,\n        \"cusparseCgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzb,\n        \"cusparseCgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseCgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseCgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseCgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDim,\n        \"cusparseCgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDim,\n        \"cusparseCgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseCgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZgebsr2gebsc_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    bsrSortedVal: *const cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseZgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mb,\n        \"cusparseZgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nb,\n        \"cusparseZgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzb,\n        \"cusparseZgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedVal,\n        \"cusparseZgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseZgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseZgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDim,\n        \"cusparseZgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDim,\n        \"cusparseZgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseZgebsr2gebsc_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSgebsr2gebsc(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    bsrSortedVal: *const f32,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    bscVal: *mut f32,\n    bscRowInd: *mut ::core::ffi::c_int,\n    bscColPtr: *mut ::core::ffi::c_int,\n    copyValues: cuda_types::cusparse::cusparseAction_t,\n    idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseSgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseSgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseSgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedVal, \"cusparseSgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseSgebsr2gebsc\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseSgebsr2gebsc\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rowBlockDim, \"cusparseSgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&colBlockDim, \"cusparseSgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bscVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bscVal, \"cusparseSgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bscRowInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bscRowInd, \"cusparseSgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bscColPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bscColPtr, \"cusparseSgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(copyValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&copyValues, \"cusparseSgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseSgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseSgebsr2gebsc\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDgebsr2gebsc(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    bsrSortedVal: *const f64,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    bscVal: *mut f64,\n    bscRowInd: *mut ::core::ffi::c_int,\n    bscColPtr: *mut ::core::ffi::c_int,\n    copyValues: cuda_types::cusparse::cusparseAction_t,\n    idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseDgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseDgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseDgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedVal, \"cusparseDgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseDgebsr2gebsc\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseDgebsr2gebsc\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rowBlockDim, \"cusparseDgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&colBlockDim, \"cusparseDgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bscVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bscVal, \"cusparseDgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bscRowInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bscRowInd, \"cusparseDgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bscColPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bscColPtr, \"cusparseDgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(copyValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&copyValues, \"cusparseDgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseDgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseDgebsr2gebsc\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCgebsr2gebsc(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    bsrSortedVal: *const cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    bscVal: *mut cuda_types::cusparse::cuComplex,\n    bscRowInd: *mut ::core::ffi::c_int,\n    bscColPtr: *mut ::core::ffi::c_int,\n    copyValues: cuda_types::cusparse::cusparseAction_t,\n    idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseCgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseCgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseCgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedVal, \"cusparseCgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseCgebsr2gebsc\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseCgebsr2gebsc\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rowBlockDim, \"cusparseCgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&colBlockDim, \"cusparseCgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bscVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bscVal, \"cusparseCgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bscRowInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bscRowInd, \"cusparseCgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bscColPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bscColPtr, \"cusparseCgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(copyValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&copyValues, \"cusparseCgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseCgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseCgebsr2gebsc\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZgebsr2gebsc(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    bsrSortedVal: *const cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtr: *const ::core::ffi::c_int,\n    bsrSortedColInd: *const ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    bscVal: *mut cuda_types::cusparse::cuDoubleComplex,\n    bscRowInd: *mut ::core::ffi::c_int,\n    bscColPtr: *mut ::core::ffi::c_int,\n    copyValues: cuda_types::cusparse::cusparseAction_t,\n    idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseZgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseZgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseZgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedVal, \"cusparseZgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtr,\n        \"cusparseZgebsr2gebsc\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColInd,\n        \"cusparseZgebsr2gebsc\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rowBlockDim, \"cusparseZgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&colBlockDim, \"cusparseZgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bscVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bscVal, \"cusparseZgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bscRowInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bscRowInd, \"cusparseZgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bscColPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bscColPtr, \"cusparseZgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(copyValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&copyValues, \"cusparseZgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseZgebsr2gebsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseZgebsr2gebsc\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseXgebsr2csr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedRowPtrC: *mut ::core::ffi::c_int,\n    csrSortedColIndC: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseXgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseXgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseXgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseXgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseXgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrA, \"cusparseXgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndA, \"cusparseXgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rowBlockDim, \"cusparseXgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&colBlockDim, \"cusparseXgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseXgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrC, \"cusparseXgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndC, \"cusparseXgebsr2csr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSgebsr2csr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const f32,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *mut f32,\n    csrSortedRowPtrC: *mut ::core::ffi::c_int,\n    csrSortedColIndC: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseSgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseSgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseSgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseSgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValA, \"cusparseSgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrA, \"cusparseSgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndA, \"cusparseSgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rowBlockDim, \"cusparseSgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&colBlockDim, \"cusparseSgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseSgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValC, \"cusparseSgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrC, \"cusparseSgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndC, \"cusparseSgebsr2csr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDgebsr2csr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const f64,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *mut f64,\n    csrSortedRowPtrC: *mut ::core::ffi::c_int,\n    csrSortedColIndC: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseDgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseDgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseDgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValA, \"cusparseDgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrA, \"cusparseDgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndA, \"cusparseDgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rowBlockDim, \"cusparseDgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&colBlockDim, \"cusparseDgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseDgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValC, \"cusparseDgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrC, \"cusparseDgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndC, \"cusparseDgebsr2csr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCgebsr2csr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *mut cuda_types::cusparse::cuComplex,\n    csrSortedRowPtrC: *mut ::core::ffi::c_int,\n    csrSortedColIndC: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseCgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseCgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseCgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValA, \"cusparseCgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrA, \"cusparseCgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndA, \"cusparseCgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rowBlockDim, \"cusparseCgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&colBlockDim, \"cusparseCgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseCgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValC, \"cusparseCgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrC, \"cusparseCgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndC, \"cusparseCgebsr2csr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZgebsr2csr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *mut cuda_types::cusparse::cuDoubleComplex,\n    csrSortedRowPtrC: *mut ::core::ffi::c_int,\n    csrSortedColIndC: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseZgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseZgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseZgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValA, \"cusparseZgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrA, \"cusparseZgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndA, \"cusparseZgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rowBlockDim, \"cusparseZgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&colBlockDim, \"cusparseZgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseZgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValC, \"cusparseZgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrC, \"cusparseZgebsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndC, \"cusparseZgebsr2csr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseScsr2gebsr_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f32,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseScsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseScsr2gebsr_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseScsr2gebsr_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseScsr2gebsr_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseScsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseScsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseScsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseScsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDim,\n        \"cusparseScsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDim,\n        \"cusparseScsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseScsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDcsr2gebsr_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f64,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDcsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseDcsr2gebsr_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDcsr2gebsr_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseDcsr2gebsr_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseDcsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseDcsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseDcsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseDcsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDim,\n        \"cusparseDcsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDim,\n        \"cusparseDcsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseDcsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCcsr2gebsr_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const cuda_types::cusparse::cuComplex,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseCcsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseCcsr2gebsr_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCcsr2gebsr_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseCcsr2gebsr_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseCcsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseCcsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseCcsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseCcsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDim,\n        \"cusparseCcsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDim,\n        \"cusparseCcsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseCcsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZcsr2gebsr_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseZcsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseZcsr2gebsr_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZcsr2gebsr_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseZcsr2gebsr_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseZcsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseZcsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseZcsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseZcsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDim,\n        \"cusparseZcsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDim,\n        \"cusparseZcsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseZcsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseScsr2gebsr_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f32,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseScsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dirA,\n        \"cusparseScsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseScsr2gebsr_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseScsr2gebsr_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseScsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseScsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseScsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseScsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDim,\n        \"cusparseScsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDim,\n        \"cusparseScsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseScsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDcsr2gebsr_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f64,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDcsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dirA,\n        \"cusparseDcsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDcsr2gebsr_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseDcsr2gebsr_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseDcsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseDcsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseDcsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseDcsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDim,\n        \"cusparseDcsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDim,\n        \"cusparseDcsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseDcsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCcsr2gebsr_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const cuda_types::cusparse::cuComplex,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseCcsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dirA,\n        \"cusparseCcsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCcsr2gebsr_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseCcsr2gebsr_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseCcsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseCcsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseCcsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseCcsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDim,\n        \"cusparseCcsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDim,\n        \"cusparseCcsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseCcsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZcsr2gebsr_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseZcsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dirA,\n        \"cusparseZcsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZcsr2gebsr_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseZcsr2gebsr_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseZcsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseZcsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseZcsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseZcsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDim,\n        \"cusparseZcsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDim,\n        \"cusparseZcsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseZcsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseXcsr2gebsrNnz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseXcsr2gebsrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseXcsr2gebsrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseXcsr2gebsrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseXcsr2gebsrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseXcsr2gebsrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseXcsr2gebsrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseXcsr2gebsrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseXcsr2gebsrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrC,\n        \"cusparseXcsr2gebsrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rowBlockDim, \"cusparseXcsr2gebsrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&colBlockDim, \"cusparseXcsr2gebsrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzTotalDevHostPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzTotalDevHostPtr,\n        \"cusparseXcsr2gebsrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseXcsr2gebsrNnz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseScsr2gebsr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f32,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValC: *mut f32,\n    bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n    bsrSortedColIndC: *mut ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseScsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseScsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseScsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseScsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseScsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValA, \"cusparseScsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrA, \"cusparseScsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndA, \"cusparseScsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseScsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValC, \"cusparseScsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrC, \"cusparseScsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndC, \"cusparseScsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rowBlockDim, \"cusparseScsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&colBlockDim, \"cusparseScsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseScsr2gebsr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDcsr2gebsr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f64,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValC: *mut f64,\n    bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n    bsrSortedColIndC: *mut ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseDcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseDcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValA, \"cusparseDcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrA, \"cusparseDcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndA, \"cusparseDcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseDcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValC, \"cusparseDcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrC, \"cusparseDcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndC, \"cusparseDcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rowBlockDim, \"cusparseDcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&colBlockDim, \"cusparseDcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseDcsr2gebsr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCcsr2gebsr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const cuda_types::cusparse::cuComplex,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValC: *mut cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n    bsrSortedColIndC: *mut ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseCcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseCcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValA, \"cusparseCcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrA, \"cusparseCcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndA, \"cusparseCcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseCcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValC, \"cusparseCcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrC, \"cusparseCcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndC, \"cusparseCcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rowBlockDim, \"cusparseCcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&colBlockDim, \"cusparseCcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseCcsr2gebsr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZcsr2gebsr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValC: *mut cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n    bsrSortedColIndC: *mut ::core::ffi::c_int,\n    rowBlockDim: ::core::ffi::c_int,\n    colBlockDim: ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseZcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseZcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValA, \"cusparseZcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedRowPtrA, \"cusparseZcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedColIndA, \"cusparseZcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseZcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValC, \"cusparseZcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedRowPtrC, \"cusparseZcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedColIndC, \"cusparseZcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rowBlockDim, \"cusparseZcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&colBlockDim, \"cusparseZcsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseZcsr2gebsr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSgebsr2gebsr_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const f32,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    rowBlockDimA: ::core::ffi::c_int,\n    colBlockDimA: ::core::ffi::c_int,\n    rowBlockDimC: ::core::ffi::c_int,\n    colBlockDimC: ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseSgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dirA,\n        \"cusparseSgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseSgebsr2gebsr_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseSgebsr2gebsr_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzb,\n        \"cusparseSgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseSgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedValA,\n        \"cusparseSgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseSgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseSgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDimA,\n        \"cusparseSgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDimA,\n        \"cusparseSgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDimC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDimC,\n        \"cusparseSgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDimC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDimC,\n        \"cusparseSgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseSgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDgebsr2gebsr_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const f64,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    rowBlockDimA: ::core::ffi::c_int,\n    colBlockDimA: ::core::ffi::c_int,\n    rowBlockDimC: ::core::ffi::c_int,\n    colBlockDimC: ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dirA,\n        \"cusparseDgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseDgebsr2gebsr_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseDgebsr2gebsr_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzb,\n        \"cusparseDgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseDgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedValA,\n        \"cusparseDgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseDgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseDgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDimA,\n        \"cusparseDgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDimA,\n        \"cusparseDgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDimC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDimC,\n        \"cusparseDgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDimC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDimC,\n        \"cusparseDgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseDgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCgebsr2gebsr_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    rowBlockDimA: ::core::ffi::c_int,\n    colBlockDimA: ::core::ffi::c_int,\n    rowBlockDimC: ::core::ffi::c_int,\n    colBlockDimC: ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseCgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dirA,\n        \"cusparseCgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseCgebsr2gebsr_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseCgebsr2gebsr_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzb,\n        \"cusparseCgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseCgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedValA,\n        \"cusparseCgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseCgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseCgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDimA,\n        \"cusparseCgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDimA,\n        \"cusparseCgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDimC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDimC,\n        \"cusparseCgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDimC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDimC,\n        \"cusparseCgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseCgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZgebsr2gebsr_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    rowBlockDimA: ::core::ffi::c_int,\n    colBlockDimA: ::core::ffi::c_int,\n    rowBlockDimC: ::core::ffi::c_int,\n    colBlockDimC: ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseZgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dirA,\n        \"cusparseZgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseZgebsr2gebsr_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseZgebsr2gebsr_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzb,\n        \"cusparseZgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseZgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedValA,\n        \"cusparseZgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseZgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseZgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDimA,\n        \"cusparseZgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDimA,\n        \"cusparseZgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDimC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDimC,\n        \"cusparseZgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDimC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDimC,\n        \"cusparseZgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseZgebsr2gebsr_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSgebsr2gebsr_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const f32,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    rowBlockDimA: ::core::ffi::c_int,\n    colBlockDimA: ::core::ffi::c_int,\n    rowBlockDimC: ::core::ffi::c_int,\n    colBlockDimC: ::core::ffi::c_int,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseSgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dirA,\n        \"cusparseSgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mb,\n        \"cusparseSgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nb,\n        \"cusparseSgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzb,\n        \"cusparseSgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseSgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedValA,\n        \"cusparseSgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseSgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseSgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDimA,\n        \"cusparseSgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDimA,\n        \"cusparseSgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDimC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDimC,\n        \"cusparseSgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDimC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDimC,\n        \"cusparseSgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseSgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDgebsr2gebsr_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const f64,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    rowBlockDimA: ::core::ffi::c_int,\n    colBlockDimA: ::core::ffi::c_int,\n    rowBlockDimC: ::core::ffi::c_int,\n    colBlockDimC: ::core::ffi::c_int,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dirA,\n        \"cusparseDgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mb,\n        \"cusparseDgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nb,\n        \"cusparseDgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzb,\n        \"cusparseDgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseDgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedValA,\n        \"cusparseDgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseDgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseDgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDimA,\n        \"cusparseDgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDimA,\n        \"cusparseDgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDimC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDimC,\n        \"cusparseDgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDimC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDimC,\n        \"cusparseDgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseDgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCgebsr2gebsr_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    rowBlockDimA: ::core::ffi::c_int,\n    colBlockDimA: ::core::ffi::c_int,\n    rowBlockDimC: ::core::ffi::c_int,\n    colBlockDimC: ::core::ffi::c_int,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseCgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dirA,\n        \"cusparseCgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mb,\n        \"cusparseCgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nb,\n        \"cusparseCgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzb,\n        \"cusparseCgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseCgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedValA,\n        \"cusparseCgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseCgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseCgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDimA,\n        \"cusparseCgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDimA,\n        \"cusparseCgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDimC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDimC,\n        \"cusparseCgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDimC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDimC,\n        \"cusparseCgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseCgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZgebsr2gebsr_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    rowBlockDimA: ::core::ffi::c_int,\n    colBlockDimA: ::core::ffi::c_int,\n    rowBlockDimC: ::core::ffi::c_int,\n    colBlockDimC: ::core::ffi::c_int,\n    pBufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseZgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dirA,\n        \"cusparseZgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mb,\n        \"cusparseZgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nb,\n        \"cusparseZgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzb,\n        \"cusparseZgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseZgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedValA,\n        \"cusparseZgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseZgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseZgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDimA,\n        \"cusparseZgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDimA,\n        \"cusparseZgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDimC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDimC,\n        \"cusparseZgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDimC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDimC,\n        \"cusparseZgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSize,\n        \"cusparseZgebsr2gebsr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseXgebsr2gebsrNnz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    rowBlockDimA: ::core::ffi::c_int,\n    colBlockDimA: ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n    rowBlockDimC: ::core::ffi::c_int,\n    colBlockDimC: ::core::ffi::c_int,\n    nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseXgebsr2gebsrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseXgebsr2gebsrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseXgebsr2gebsrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseXgebsr2gebsrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseXgebsr2gebsrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseXgebsr2gebsrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseXgebsr2gebsrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseXgebsr2gebsrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDimA,\n        \"cusparseXgebsr2gebsrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDimA,\n        \"cusparseXgebsr2gebsrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseXgebsr2gebsrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrC,\n        \"cusparseXgebsr2gebsrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDimC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &rowBlockDimC,\n        \"cusparseXgebsr2gebsrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDimC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &colBlockDimC,\n        \"cusparseXgebsr2gebsrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzTotalDevHostPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzTotalDevHostPtr,\n        \"cusparseXgebsr2gebsrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseXgebsr2gebsrNnz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSgebsr2gebsr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const f32,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    rowBlockDimA: ::core::ffi::c_int,\n    colBlockDimA: ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValC: *mut f32,\n    bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n    bsrSortedColIndC: *mut ::core::ffi::c_int,\n    rowBlockDimC: ::core::ffi::c_int,\n    colBlockDimC: ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseSgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseSgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseSgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseSgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseSgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValA, \"cusparseSgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseSgebsr2gebsr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseSgebsr2gebsr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rowBlockDimA, \"cusparseSgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&colBlockDimA, \"cusparseSgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseSgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValC, \"cusparseSgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrC,\n        \"cusparseSgebsr2gebsr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndC,\n        \"cusparseSgebsr2gebsr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDimC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rowBlockDimC, \"cusparseSgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDimC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&colBlockDimC, \"cusparseSgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseSgebsr2gebsr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDgebsr2gebsr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const f64,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    rowBlockDimA: ::core::ffi::c_int,\n    colBlockDimA: ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValC: *mut f64,\n    bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n    bsrSortedColIndC: *mut ::core::ffi::c_int,\n    rowBlockDimC: ::core::ffi::c_int,\n    colBlockDimC: ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseDgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseDgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseDgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseDgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValA, \"cusparseDgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseDgebsr2gebsr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseDgebsr2gebsr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rowBlockDimA, \"cusparseDgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&colBlockDimA, \"cusparseDgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseDgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValC, \"cusparseDgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrC,\n        \"cusparseDgebsr2gebsr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndC,\n        \"cusparseDgebsr2gebsr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDimC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rowBlockDimC, \"cusparseDgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDimC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&colBlockDimC, \"cusparseDgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseDgebsr2gebsr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCgebsr2gebsr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    rowBlockDimA: ::core::ffi::c_int,\n    colBlockDimA: ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValC: *mut cuda_types::cusparse::cuComplex,\n    bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n    bsrSortedColIndC: *mut ::core::ffi::c_int,\n    rowBlockDimC: ::core::ffi::c_int,\n    colBlockDimC: ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseCgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseCgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseCgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseCgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValA, \"cusparseCgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseCgebsr2gebsr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseCgebsr2gebsr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rowBlockDimA, \"cusparseCgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&colBlockDimA, \"cusparseCgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseCgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValC, \"cusparseCgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrC,\n        \"cusparseCgebsr2gebsr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndC,\n        \"cusparseCgebsr2gebsr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDimC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rowBlockDimC, \"cusparseCgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDimC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&colBlockDimC, \"cusparseCgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseCgebsr2gebsr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZgebsr2gebsr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    dirA: cuda_types::cusparse::cusparseDirection_t,\n    mb: ::core::ffi::c_int,\n    nb: ::core::ffi::c_int,\n    nnzb: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValA: *const cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtrA: *const ::core::ffi::c_int,\n    bsrSortedColIndA: *const ::core::ffi::c_int,\n    rowBlockDimA: ::core::ffi::c_int,\n    colBlockDimA: ::core::ffi::c_int,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    bsrSortedValC: *mut cuda_types::cusparse::cuDoubleComplex,\n    bsrSortedRowPtrC: *mut ::core::ffi::c_int,\n    bsrSortedColIndC: *mut ::core::ffi::c_int,\n    rowBlockDimC: ::core::ffi::c_int,\n    colBlockDimC: ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dirA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dirA, \"cusparseZgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&mb, \"cusparseZgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nb, \"cusparseZgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzb), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzb, \"cusparseZgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValA, \"cusparseZgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrA,\n        \"cusparseZgebsr2gebsr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndA,\n        \"cusparseZgebsr2gebsr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rowBlockDimA, \"cusparseZgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDimA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&colBlockDimA, \"cusparseZgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseZgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrSortedValC, \"cusparseZgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedRowPtrC,\n        \"cusparseZgebsr2gebsr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrSortedColIndC,\n        \"cusparseZgebsr2gebsr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDimC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rowBlockDimC, \"cusparseZgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDimC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&colBlockDimC, \"cusparseZgebsr2gebsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseZgebsr2gebsr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCreateIdentityPermutation(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    n: ::core::ffi::c_int,\n    p: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseCreateIdentityPermutation\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseCreateIdentityPermutation\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(p), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&p, \"cusparseCreateIdentityPermutation\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseXcoosort_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    cooRowsA: *const ::core::ffi::c_int,\n    cooColsA: *const ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseXcoosort_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseXcoosort_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseXcoosort_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseXcoosort_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cooRowsA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cooRowsA,\n        \"cusparseXcoosort_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cooColsA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cooColsA,\n        \"cusparseXcoosort_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseXcoosort_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseXcoosortByRow(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    cooRowsA: *mut ::core::ffi::c_int,\n    cooColsA: *mut ::core::ffi::c_int,\n    P: *mut ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseXcoosortByRow\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseXcoosortByRow\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseXcoosortByRow\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseXcoosortByRow\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cooRowsA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cooRowsA, \"cusparseXcoosortByRow\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cooColsA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cooColsA, \"cusparseXcoosortByRow\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(P), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&P, \"cusparseXcoosortByRow\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseXcoosortByRow\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseXcoosortByColumn(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    cooRowsA: *mut ::core::ffi::c_int,\n    cooColsA: *mut ::core::ffi::c_int,\n    P: *mut ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseXcoosortByColumn\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseXcoosortByColumn\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseXcoosortByColumn\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseXcoosortByColumn\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cooRowsA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cooRowsA, \"cusparseXcoosortByColumn\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cooColsA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cooColsA, \"cusparseXcoosortByColumn\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(P), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&P, \"cusparseXcoosortByColumn\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseXcoosortByColumn\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseXcsrsort_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    csrRowPtrA: *const ::core::ffi::c_int,\n    csrColIndA: *const ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseXcsrsort_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseXcsrsort_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseXcsrsort_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseXcsrsort_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrRowPtrA,\n        \"cusparseXcsrsort_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrColIndA,\n        \"cusparseXcsrsort_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseXcsrsort_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseXcsrsort(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrRowPtrA: *const ::core::ffi::c_int,\n    csrColIndA: *mut ::core::ffi::c_int,\n    P: *mut ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseXcsrsort\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseXcsrsort\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseXcsrsort\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseXcsrsort\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseXcsrsort\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrRowPtrA, \"cusparseXcsrsort\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrColIndA, \"cusparseXcsrsort\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(P), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&P, \"cusparseXcsrsort\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseXcsrsort\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseXcscsort_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    cscColPtrA: *const ::core::ffi::c_int,\n    cscRowIndA: *const ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseXcscsort_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseXcscsort_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseXcscsort_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseXcscsort_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscColPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cscColPtrA,\n        \"cusparseXcscsort_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscRowIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cscRowIndA,\n        \"cusparseXcscsort_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseXcscsort_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseXcscsort(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    cscColPtrA: *const ::core::ffi::c_int,\n    cscRowIndA: *mut ::core::ffi::c_int,\n    P: *mut ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseXcscsort\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseXcscsort\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseXcscsort\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseXcscsort\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseXcscsort\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscColPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cscColPtrA, \"cusparseXcscsort\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscRowIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cscRowIndA, \"cusparseXcscsort\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(P), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&P, \"cusparseXcscsort\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseXcscsort\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseScsru2csr_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    csrVal: *mut f32,\n    csrRowPtr: *const ::core::ffi::c_int,\n    csrColInd: *mut ::core::ffi::c_int,\n    info: cuda_types::cusparse::csru2csrInfo_t,\n    pBufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseScsru2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseScsru2csr_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseScsru2csr_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseScsru2csr_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrVal,\n        \"cusparseScsru2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrRowPtr,\n        \"cusparseScsru2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrColInd,\n        \"cusparseScsru2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"cusparseScsru2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseScsru2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDcsru2csr_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    csrVal: *mut f64,\n    csrRowPtr: *const ::core::ffi::c_int,\n    csrColInd: *mut ::core::ffi::c_int,\n    info: cuda_types::cusparse::csru2csrInfo_t,\n    pBufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDcsru2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDcsru2csr_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseDcsru2csr_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseDcsru2csr_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrVal,\n        \"cusparseDcsru2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrRowPtr,\n        \"cusparseDcsru2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrColInd,\n        \"cusparseDcsru2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"cusparseDcsru2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseDcsru2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCcsru2csr_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    csrVal: *mut cuda_types::cusparse::cuComplex,\n    csrRowPtr: *const ::core::ffi::c_int,\n    csrColInd: *mut ::core::ffi::c_int,\n    info: cuda_types::cusparse::csru2csrInfo_t,\n    pBufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseCcsru2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCcsru2csr_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseCcsru2csr_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCcsru2csr_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrVal,\n        \"cusparseCcsru2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrRowPtr,\n        \"cusparseCcsru2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrColInd,\n        \"cusparseCcsru2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"cusparseCcsru2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseCcsru2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZcsru2csr_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    csrVal: *mut cuda_types::cusparse::cuDoubleComplex,\n    csrRowPtr: *const ::core::ffi::c_int,\n    csrColInd: *mut ::core::ffi::c_int,\n    info: cuda_types::cusparse::csru2csrInfo_t,\n    pBufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseZcsru2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZcsru2csr_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseZcsru2csr_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseZcsru2csr_bufferSizeExt\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrVal,\n        \"cusparseZcsru2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrRowPtr,\n        \"cusparseZcsru2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrColInd,\n        \"cusparseZcsru2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"cusparseZcsru2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseZcsru2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseScsru2csr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrVal: *mut f32,\n    csrRowPtr: *const ::core::ffi::c_int,\n    csrColInd: *mut ::core::ffi::c_int,\n    info: cuda_types::cusparse::csru2csrInfo_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseScsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseScsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseScsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseScsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseScsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrVal, \"cusparseScsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrRowPtr, \"cusparseScsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrColInd, \"cusparseScsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseScsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseScsru2csr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDcsru2csr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrVal: *mut f64,\n    csrRowPtr: *const ::core::ffi::c_int,\n    csrColInd: *mut ::core::ffi::c_int,\n    info: cuda_types::cusparse::csru2csrInfo_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDcsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDcsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseDcsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseDcsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDcsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrVal, \"cusparseDcsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrRowPtr, \"cusparseDcsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrColInd, \"cusparseDcsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDcsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseDcsru2csr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCcsru2csr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrVal: *mut cuda_types::cusparse::cuComplex,\n    csrRowPtr: *const ::core::ffi::c_int,\n    csrColInd: *mut ::core::ffi::c_int,\n    info: cuda_types::cusparse::csru2csrInfo_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCcsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCcsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseCcsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCcsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCcsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrVal, \"cusparseCcsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrRowPtr, \"cusparseCcsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrColInd, \"cusparseCcsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCcsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseCcsru2csr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZcsru2csr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrVal: *mut cuda_types::cusparse::cuDoubleComplex,\n    csrRowPtr: *const ::core::ffi::c_int,\n    csrColInd: *mut ::core::ffi::c_int,\n    info: cuda_types::cusparse::csru2csrInfo_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZcsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZcsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseZcsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseZcsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZcsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrVal, \"cusparseZcsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrRowPtr, \"cusparseZcsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrColInd, \"cusparseZcsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseZcsru2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseZcsru2csr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseScsr2csru(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrVal: *mut f32,\n    csrRowPtr: *const ::core::ffi::c_int,\n    csrColInd: *mut ::core::ffi::c_int,\n    info: cuda_types::cusparse::csru2csrInfo_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseScsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseScsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseScsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseScsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseScsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrVal, \"cusparseScsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrRowPtr, \"cusparseScsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrColInd, \"cusparseScsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseScsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseScsr2csru\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDcsr2csru(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrVal: *mut f64,\n    csrRowPtr: *const ::core::ffi::c_int,\n    csrColInd: *mut ::core::ffi::c_int,\n    info: cuda_types::cusparse::csru2csrInfo_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDcsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDcsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseDcsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseDcsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDcsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrVal, \"cusparseDcsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrRowPtr, \"cusparseDcsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrColInd, \"cusparseDcsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseDcsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseDcsr2csru\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCcsr2csru(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrVal: *mut cuda_types::cusparse::cuComplex,\n    csrRowPtr: *const ::core::ffi::c_int,\n    csrColInd: *mut ::core::ffi::c_int,\n    info: cuda_types::cusparse::csru2csrInfo_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCcsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCcsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseCcsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCcsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseCcsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrVal, \"cusparseCcsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrRowPtr, \"cusparseCcsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrColInd, \"cusparseCcsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseCcsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseCcsr2csru\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseZcsr2csru(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrVal: *mut cuda_types::cusparse::cuDoubleComplex,\n    csrRowPtr: *const ::core::ffi::c_int,\n    csrColInd: *mut ::core::ffi::c_int,\n    info: cuda_types::cusparse::csru2csrInfo_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseZcsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseZcsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseZcsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseZcsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseZcsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrVal, \"cusparseZcsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrRowPtr, \"cusparseZcsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrColInd, \"cusparseZcsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&info, \"cusparseZcsr2csru\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseZcsr2csru\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpruneDense2csr_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    A: *const f32,\n    lda: ::core::ffi::c_int,\n    threshold: *const f32,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *const f32,\n    csrSortedRowPtrC: *const ::core::ffi::c_int,\n    csrSortedColIndC: *const ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseSpruneDense2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseSpruneDense2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &n,\n        \"cusparseSpruneDense2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &A,\n        \"cusparseSpruneDense2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &lda,\n        \"cusparseSpruneDense2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(threshold), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &threshold,\n        \"cusparseSpruneDense2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrC,\n        \"cusparseSpruneDense2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValC,\n        \"cusparseSpruneDense2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseSpruneDense2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndC,\n        \"cusparseSpruneDense2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseSpruneDense2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDpruneDense2csr_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    A: *const f64,\n    lda: ::core::ffi::c_int,\n    threshold: *const f64,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *const f64,\n    csrSortedRowPtrC: *const ::core::ffi::c_int,\n    csrSortedColIndC: *const ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDpruneDense2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseDpruneDense2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &n,\n        \"cusparseDpruneDense2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &A,\n        \"cusparseDpruneDense2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &lda,\n        \"cusparseDpruneDense2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(threshold), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &threshold,\n        \"cusparseDpruneDense2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrC,\n        \"cusparseDpruneDense2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValC,\n        \"cusparseDpruneDense2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseDpruneDense2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndC,\n        \"cusparseDpruneDense2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseDpruneDense2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpruneDense2csrNnz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    A: *const f32,\n    lda: ::core::ffi::c_int,\n    threshold: *const f32,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrRowPtrC: *mut ::core::ffi::c_int,\n    nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSpruneDense2csrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseSpruneDense2csrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseSpruneDense2csrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cusparseSpruneDense2csrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cusparseSpruneDense2csrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(threshold), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &threshold,\n        \"cusparseSpruneDense2csrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseSpruneDense2csrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrRowPtrC,\n        \"cusparseSpruneDense2csrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzTotalDevHostPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzTotalDevHostPtr,\n        \"cusparseSpruneDense2csrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseSpruneDense2csrNnz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDpruneDense2csrNnz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    A: *const f64,\n    lda: ::core::ffi::c_int,\n    threshold: *const f64,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedRowPtrC: *mut ::core::ffi::c_int,\n    nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDpruneDense2csrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDpruneDense2csrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseDpruneDense2csrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cusparseDpruneDense2csrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cusparseDpruneDense2csrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(threshold), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &threshold,\n        \"cusparseDpruneDense2csrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseDpruneDense2csrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseDpruneDense2csrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzTotalDevHostPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzTotalDevHostPtr,\n        \"cusparseDpruneDense2csrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseDpruneDense2csrNnz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpruneDense2csr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    A: *const f32,\n    lda: ::core::ffi::c_int,\n    threshold: *const f32,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *mut f32,\n    csrSortedRowPtrC: *const ::core::ffi::c_int,\n    csrSortedColIndC: *mut ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSpruneDense2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseSpruneDense2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseSpruneDense2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cusparseSpruneDense2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cusparseSpruneDense2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(threshold), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&threshold, \"cusparseSpruneDense2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseSpruneDense2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValC,\n        \"cusparseSpruneDense2csr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseSpruneDense2csr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndC,\n        \"cusparseSpruneDense2csr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseSpruneDense2csr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDpruneDense2csr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    A: *const f64,\n    lda: ::core::ffi::c_int,\n    threshold: *const f64,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *mut f64,\n    csrSortedRowPtrC: *const ::core::ffi::c_int,\n    csrSortedColIndC: *mut ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDpruneDense2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDpruneDense2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseDpruneDense2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&A, \"cusparseDpruneDense2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&lda, \"cusparseDpruneDense2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(threshold), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&threshold, \"cusparseDpruneDense2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseDpruneDense2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValC,\n        \"cusparseDpruneDense2csr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseDpruneDense2csr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndC,\n        \"cusparseDpruneDense2csr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseDpruneDense2csr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpruneCsr2csr_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnzA: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f32,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    threshold: *const f32,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *const f32,\n    csrSortedRowPtrC: *const ::core::ffi::c_int,\n    csrSortedColIndC: *const ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseSpruneCsr2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseSpruneCsr2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &n,\n        \"cusparseSpruneCsr2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzA,\n        \"cusparseSpruneCsr2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseSpruneCsr2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseSpruneCsr2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseSpruneCsr2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseSpruneCsr2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(threshold), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &threshold,\n        \"cusparseSpruneCsr2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrC,\n        \"cusparseSpruneCsr2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValC,\n        \"cusparseSpruneCsr2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseSpruneCsr2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndC,\n        \"cusparseSpruneCsr2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseSpruneCsr2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDpruneCsr2csr_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnzA: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f64,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    threshold: *const f64,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *const f64,\n    csrSortedRowPtrC: *const ::core::ffi::c_int,\n    csrSortedColIndC: *const ::core::ffi::c_int,\n    pBufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDpruneCsr2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseDpruneCsr2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &n,\n        \"cusparseDpruneCsr2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzA,\n        \"cusparseDpruneCsr2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseDpruneCsr2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseDpruneCsr2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseDpruneCsr2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseDpruneCsr2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(threshold), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &threshold,\n        \"cusparseDpruneCsr2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrC,\n        \"cusparseDpruneCsr2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValC,\n        \"cusparseDpruneCsr2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseDpruneCsr2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndC,\n        \"cusparseDpruneCsr2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseDpruneCsr2csr_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpruneCsr2csrNnz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnzA: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f32,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    threshold: *const f32,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedRowPtrC: *mut ::core::ffi::c_int,\n    nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSpruneCsr2csrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseSpruneCsr2csrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseSpruneCsr2csrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzA, \"cusparseSpruneCsr2csrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseSpruneCsr2csrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseSpruneCsr2csrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseSpruneCsr2csrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseSpruneCsr2csrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(threshold), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&threshold, \"cusparseSpruneCsr2csrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseSpruneCsr2csrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseSpruneCsr2csrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzTotalDevHostPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzTotalDevHostPtr,\n        \"cusparseSpruneCsr2csrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseSpruneCsr2csrNnz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDpruneCsr2csrNnz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnzA: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f64,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    threshold: *const f64,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedRowPtrC: *mut ::core::ffi::c_int,\n    nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDpruneCsr2csrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDpruneCsr2csrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseDpruneCsr2csrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzA, \"cusparseDpruneCsr2csrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDpruneCsr2csrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseDpruneCsr2csrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseDpruneCsr2csrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseDpruneCsr2csrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(threshold), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&threshold, \"cusparseDpruneCsr2csrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseDpruneCsr2csrNnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseDpruneCsr2csrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzTotalDevHostPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzTotalDevHostPtr,\n        \"cusparseDpruneCsr2csrNnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseDpruneCsr2csrNnz\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpruneCsr2csr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnzA: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f32,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    threshold: *const f32,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *mut f32,\n    csrSortedRowPtrC: *const ::core::ffi::c_int,\n    csrSortedColIndC: *mut ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSpruneCsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseSpruneCsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseSpruneCsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzA, \"cusparseSpruneCsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseSpruneCsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValA, \"cusparseSpruneCsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseSpruneCsr2csr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseSpruneCsr2csr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(threshold), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&threshold, \"cusparseSpruneCsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseSpruneCsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValC, \"cusparseSpruneCsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseSpruneCsr2csr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndC,\n        \"cusparseSpruneCsr2csr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseSpruneCsr2csr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDpruneCsr2csr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnzA: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f64,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    threshold: *const f64,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *mut f64,\n    csrSortedRowPtrC: *const ::core::ffi::c_int,\n    csrSortedColIndC: *mut ::core::ffi::c_int,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseDpruneCsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDpruneCsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseDpruneCsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnzA, \"cusparseDpruneCsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrA, \"cusparseDpruneCsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValA, \"cusparseDpruneCsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseDpruneCsr2csr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseDpruneCsr2csr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(threshold), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&threshold, \"cusparseDpruneCsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descrC, \"cusparseDpruneCsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrSortedValC, \"cusparseDpruneCsr2csr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseDpruneCsr2csr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndC,\n        \"cusparseDpruneCsr2csr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&pBuffer, \"cusparseDpruneCsr2csr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpruneDense2csrByPercentage_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    A: *const f32,\n    lda: ::core::ffi::c_int,\n    percentage: f32,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *const f32,\n    csrSortedRowPtrC: *const ::core::ffi::c_int,\n    csrSortedColIndC: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::pruneInfo_t,\n    pBufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseSpruneDense2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseSpruneDense2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &n,\n        \"cusparseSpruneDense2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &A,\n        \"cusparseSpruneDense2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &lda,\n        \"cusparseSpruneDense2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(percentage), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &percentage,\n        \"cusparseSpruneDense2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrC,\n        \"cusparseSpruneDense2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValC,\n        \"cusparseSpruneDense2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseSpruneDense2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndC,\n        \"cusparseSpruneDense2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"cusparseSpruneDense2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseSpruneDense2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDpruneDense2csrByPercentage_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    A: *const f64,\n    lda: ::core::ffi::c_int,\n    percentage: f32,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *const f64,\n    csrSortedRowPtrC: *const ::core::ffi::c_int,\n    csrSortedColIndC: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::pruneInfo_t,\n    pBufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDpruneDense2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseDpruneDense2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &n,\n        \"cusparseDpruneDense2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &A,\n        \"cusparseDpruneDense2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &lda,\n        \"cusparseDpruneDense2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(percentage), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &percentage,\n        \"cusparseDpruneDense2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrC,\n        \"cusparseDpruneDense2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValC,\n        \"cusparseDpruneDense2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseDpruneDense2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndC,\n        \"cusparseDpruneDense2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"cusparseDpruneDense2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseDpruneDense2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpruneDense2csrNnzByPercentage(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    A: *const f32,\n    lda: ::core::ffi::c_int,\n    percentage: f32,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrRowPtrC: *mut ::core::ffi::c_int,\n    nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n    info: cuda_types::cusparse::pruneInfo_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseSpruneDense2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseSpruneDense2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &n,\n        \"cusparseSpruneDense2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &A,\n        \"cusparseSpruneDense2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &lda,\n        \"cusparseSpruneDense2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(percentage), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &percentage,\n        \"cusparseSpruneDense2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrC,\n        \"cusparseSpruneDense2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrRowPtrC,\n        \"cusparseSpruneDense2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzTotalDevHostPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzTotalDevHostPtr,\n        \"cusparseSpruneDense2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"cusparseSpruneDense2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBuffer,\n        \"cusparseSpruneDense2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDpruneDense2csrNnzByPercentage(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    A: *const f64,\n    lda: ::core::ffi::c_int,\n    percentage: f32,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrRowPtrC: *mut ::core::ffi::c_int,\n    nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n    info: cuda_types::cusparse::pruneInfo_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDpruneDense2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseDpruneDense2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &n,\n        \"cusparseDpruneDense2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &A,\n        \"cusparseDpruneDense2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &lda,\n        \"cusparseDpruneDense2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(percentage), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &percentage,\n        \"cusparseDpruneDense2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrC,\n        \"cusparseDpruneDense2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrRowPtrC,\n        \"cusparseDpruneDense2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzTotalDevHostPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzTotalDevHostPtr,\n        \"cusparseDpruneDense2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"cusparseDpruneDense2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBuffer,\n        \"cusparseDpruneDense2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpruneDense2csrByPercentage(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    A: *const f32,\n    lda: ::core::ffi::c_int,\n    percentage: f32,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *mut f32,\n    csrSortedRowPtrC: *const ::core::ffi::c_int,\n    csrSortedColIndC: *mut ::core::ffi::c_int,\n    info: cuda_types::cusparse::pruneInfo_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseSpruneDense2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseSpruneDense2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &n,\n        \"cusparseSpruneDense2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &A,\n        \"cusparseSpruneDense2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &lda,\n        \"cusparseSpruneDense2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(percentage), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &percentage,\n        \"cusparseSpruneDense2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrC,\n        \"cusparseSpruneDense2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValC,\n        \"cusparseSpruneDense2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseSpruneDense2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndC,\n        \"cusparseSpruneDense2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"cusparseSpruneDense2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBuffer,\n        \"cusparseSpruneDense2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDpruneDense2csrByPercentage(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    A: *const f64,\n    lda: ::core::ffi::c_int,\n    percentage: f32,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *mut f64,\n    csrSortedRowPtrC: *const ::core::ffi::c_int,\n    csrSortedColIndC: *mut ::core::ffi::c_int,\n    info: cuda_types::cusparse::pruneInfo_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDpruneDense2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseDpruneDense2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &n,\n        \"cusparseDpruneDense2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(A), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &A,\n        \"cusparseDpruneDense2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(lda), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &lda,\n        \"cusparseDpruneDense2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(percentage), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &percentage,\n        \"cusparseDpruneDense2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrC,\n        \"cusparseDpruneDense2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValC,\n        \"cusparseDpruneDense2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseDpruneDense2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndC,\n        \"cusparseDpruneDense2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"cusparseDpruneDense2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBuffer,\n        \"cusparseDpruneDense2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpruneCsr2csrByPercentage_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnzA: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f32,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    percentage: f32,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *const f32,\n    csrSortedRowPtrC: *const ::core::ffi::c_int,\n    csrSortedColIndC: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::pruneInfo_t,\n    pBufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseSpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseSpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &n,\n        \"cusparseSpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzA,\n        \"cusparseSpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseSpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseSpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseSpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseSpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(percentage), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &percentage,\n        \"cusparseSpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrC,\n        \"cusparseSpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValC,\n        \"cusparseSpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseSpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndC,\n        \"cusparseSpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"cusparseSpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseSpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDpruneCsr2csrByPercentage_bufferSizeExt(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnzA: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f64,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    percentage: f32,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *const f64,\n    csrSortedRowPtrC: *const ::core::ffi::c_int,\n    csrSortedColIndC: *const ::core::ffi::c_int,\n    info: cuda_types::cusparse::pruneInfo_t,\n    pBufferSizeInBytes: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseDpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &n,\n        \"cusparseDpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzA,\n        \"cusparseDpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseDpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseDpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseDpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseDpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(percentage), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &percentage,\n        \"cusparseDpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrC,\n        \"cusparseDpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValC,\n        \"cusparseDpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseDpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndC,\n        \"cusparseDpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"cusparseDpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBufferSizeInBytes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBufferSizeInBytes,\n        \"cusparseDpruneCsr2csrByPercentage_bufferSizeExt\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpruneCsr2csrNnzByPercentage(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnzA: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f32,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    percentage: f32,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedRowPtrC: *mut ::core::ffi::c_int,\n    nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n    info: cuda_types::cusparse::pruneInfo_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseSpruneCsr2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseSpruneCsr2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &n,\n        \"cusparseSpruneCsr2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzA,\n        \"cusparseSpruneCsr2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseSpruneCsr2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseSpruneCsr2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseSpruneCsr2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseSpruneCsr2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(percentage), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &percentage,\n        \"cusparseSpruneCsr2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrC,\n        \"cusparseSpruneCsr2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseSpruneCsr2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzTotalDevHostPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzTotalDevHostPtr,\n        \"cusparseSpruneCsr2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"cusparseSpruneCsr2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBuffer,\n        \"cusparseSpruneCsr2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDpruneCsr2csrNnzByPercentage(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnzA: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f64,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    percentage: f32,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedRowPtrC: *mut ::core::ffi::c_int,\n    nnzTotalDevHostPtr: *mut ::core::ffi::c_int,\n    info: cuda_types::cusparse::pruneInfo_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDpruneCsr2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &m,\n        \"cusparseDpruneCsr2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &n,\n        \"cusparseDpruneCsr2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzA,\n        \"cusparseDpruneCsr2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseDpruneCsr2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseDpruneCsr2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseDpruneCsr2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseDpruneCsr2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(percentage), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &percentage,\n        \"cusparseDpruneCsr2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrC,\n        \"cusparseDpruneCsr2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseDpruneCsr2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzTotalDevHostPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzTotalDevHostPtr,\n        \"cusparseDpruneCsr2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"cusparseDpruneCsr2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBuffer,\n        \"cusparseDpruneCsr2csrNnzByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpruneCsr2csrByPercentage(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnzA: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f32,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    percentage: f32,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *mut f32,\n    csrSortedRowPtrC: *const ::core::ffi::c_int,\n    csrSortedColIndC: *mut ::core::ffi::c_int,\n    info: cuda_types::cusparse::pruneInfo_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseSpruneCsr2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseSpruneCsr2csrByPercentage\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseSpruneCsr2csrByPercentage\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzA,\n        \"cusparseSpruneCsr2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseSpruneCsr2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseSpruneCsr2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseSpruneCsr2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseSpruneCsr2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(percentage), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &percentage,\n        \"cusparseSpruneCsr2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrC,\n        \"cusparseSpruneCsr2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValC,\n        \"cusparseSpruneCsr2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseSpruneCsr2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndC,\n        \"cusparseSpruneCsr2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"cusparseSpruneCsr2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBuffer,\n        \"cusparseSpruneCsr2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDpruneCsr2csrByPercentage(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnzA: ::core::ffi::c_int,\n    descrA: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValA: *const f64,\n    csrSortedRowPtrA: *const ::core::ffi::c_int,\n    csrSortedColIndA: *const ::core::ffi::c_int,\n    percentage: f32,\n    descrC: cuda_types::cusparse::cusparseMatDescr_t,\n    csrSortedValC: *mut f64,\n    csrSortedRowPtrC: *const ::core::ffi::c_int,\n    csrSortedColIndC: *mut ::core::ffi::c_int,\n    info: cuda_types::cusparse::pruneInfo_t,\n    pBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDpruneCsr2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseDpruneCsr2csrByPercentage\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseDpruneCsr2csrByPercentage\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnzA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &nnzA,\n        \"cusparseDpruneCsr2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrA,\n        \"cusparseDpruneCsr2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValA,\n        \"cusparseDpruneCsr2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrA,\n        \"cusparseDpruneCsr2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndA,\n        \"cusparseDpruneCsr2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(percentage), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &percentage,\n        \"cusparseDpruneCsr2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(descrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &descrC,\n        \"cusparseDpruneCsr2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedValC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedValC,\n        \"cusparseDpruneCsr2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedRowPtrC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedRowPtrC,\n        \"cusparseDpruneCsr2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrSortedColIndC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrSortedColIndC,\n        \"cusparseDpruneCsr2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(info), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &info,\n        \"cusparseDpruneCsr2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(pBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &pBuffer,\n        \"cusparseDpruneCsr2csrByPercentage\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseCsr2CscAlg_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cusparse::cusparseCsr2CscAlg_t::CUSPARSE_CSR2CSC_ALG_DEFAULT => {\n                writer.write_all(stringify!(CUSPARSE_CSR2CSC_ALG_DEFAULT).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseCsr2CscAlg_t::CUSPARSE_CSR2CSC_ALG1 => {\n                writer.write_all(stringify!(CUSPARSE_CSR2CSC_ALG1).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cusparseCsr2cscEx2(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    csrVal: *const ::core::ffi::c_void,\n    csrRowPtr: *const ::core::ffi::c_int,\n    csrColInd: *const ::core::ffi::c_int,\n    cscVal: *mut ::core::ffi::c_void,\n    cscColPtr: *mut ::core::ffi::c_int,\n    cscRowInd: *mut ::core::ffi::c_int,\n    valType: cuda_types::cusparse::cudaDataType,\n    copyValues: cuda_types::cusparse::cusparseAction_t,\n    idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n    alg: cuda_types::cusparse::cusparseCsr2CscAlg_t,\n    buffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseCsr2cscEx2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCsr2cscEx2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseCsr2cscEx2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCsr2cscEx2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrVal, \"cusparseCsr2cscEx2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrRowPtr, \"cusparseCsr2cscEx2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrColInd, \"cusparseCsr2cscEx2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cscVal, \"cusparseCsr2cscEx2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscColPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cscColPtr, \"cusparseCsr2cscEx2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscRowInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cscRowInd, \"cusparseCsr2cscEx2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valType, \"cusparseCsr2cscEx2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(copyValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&copyValues, \"cusparseCsr2cscEx2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseCsr2cscEx2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alg, \"cusparseCsr2cscEx2\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(buffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&buffer, \"cusparseCsr2cscEx2\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCsr2cscEx2_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    m: ::core::ffi::c_int,\n    n: ::core::ffi::c_int,\n    nnz: ::core::ffi::c_int,\n    csrVal: *const ::core::ffi::c_void,\n    csrRowPtr: *const ::core::ffi::c_int,\n    csrColInd: *const ::core::ffi::c_int,\n    cscVal: *mut ::core::ffi::c_void,\n    cscColPtr: *mut ::core::ffi::c_int,\n    cscRowInd: *mut ::core::ffi::c_int,\n    valType: cuda_types::cusparse::cudaDataType,\n    copyValues: cuda_types::cusparse::cusparseAction_t,\n    idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n    alg: cuda_types::cusparse::cusparseCsr2CscAlg_t,\n    bufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseCsr2cscEx2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(m), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&m, \"cusparseCsr2cscEx2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(n), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&n, \"cusparseCsr2cscEx2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCsr2cscEx2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrVal,\n        \"cusparseCsr2cscEx2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrRowPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrRowPtr,\n        \"cusparseCsr2cscEx2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrColInd,\n        \"cusparseCsr2cscEx2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscVal), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cscVal,\n        \"cusparseCsr2cscEx2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscColPtr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cscColPtr,\n        \"cusparseCsr2cscEx2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscRowInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cscRowInd,\n        \"cusparseCsr2cscEx2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &valType,\n        \"cusparseCsr2cscEx2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(copyValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &copyValues,\n        \"cusparseCsr2cscEx2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &idxBase,\n        \"cusparseCsr2cscEx2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alg, \"cusparseCsr2cscEx2_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bufferSize,\n        \"cusparseCsr2cscEx2_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseFormat_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cusparse::cusparseFormat_t::CUSPARSE_FORMAT_CSR => {\n                writer.write_all(stringify!(CUSPARSE_FORMAT_CSR).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseFormat_t::CUSPARSE_FORMAT_CSC => {\n                writer.write_all(stringify!(CUSPARSE_FORMAT_CSC).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseFormat_t::CUSPARSE_FORMAT_COO => {\n                writer.write_all(stringify!(CUSPARSE_FORMAT_COO).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseFormat_t::CUSPARSE_FORMAT_BLOCKED_ELL => {\n                writer.write_all(stringify!(CUSPARSE_FORMAT_BLOCKED_ELL).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseFormat_t::CUSPARSE_FORMAT_BSR => {\n                writer.write_all(stringify!(CUSPARSE_FORMAT_BSR).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseFormat_t::CUSPARSE_FORMAT_SLICED_ELLPACK => {\n                writer.write_all(stringify!(CUSPARSE_FORMAT_SLICED_ELLPACK).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseOrder_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cusparse::cusparseOrder_t::CUSPARSE_ORDER_COL => {\n                writer.write_all(stringify!(CUSPARSE_ORDER_COL).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseOrder_t::CUSPARSE_ORDER_ROW => {\n                writer.write_all(stringify!(CUSPARSE_ORDER_ROW).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseIndexType_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cusparse::cusparseIndexType_t::CUSPARSE_INDEX_16U => {\n                writer.write_all(stringify!(CUSPARSE_INDEX_16U).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseIndexType_t::CUSPARSE_INDEX_32I => {\n                writer.write_all(stringify!(CUSPARSE_INDEX_32I).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseIndexType_t::CUSPARSE_INDEX_64I => {\n                writer.write_all(stringify!(CUSPARSE_INDEX_64I).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseSpVecDescr_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseDnVecDescr_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseSpMatDescr_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseDnMatDescr_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseConstSpVecDescr_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseConstDnVecDescr_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseConstSpMatDescr_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseConstDnMatDescr_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\npub fn write_cusparseCreateSpVec(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spVecDescr: *mut cuda_types::cusparse::cusparseSpVecDescr_t,\n    size: i64,\n    nnz: i64,\n    indices: *mut ::core::ffi::c_void,\n    values: *mut ::core::ffi::c_void,\n    idxType: cuda_types::cusparse::cusparseIndexType_t,\n    idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n    valueType: cuda_types::cusparse::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spVecDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spVecDescr, \"cusparseCreateSpVec\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cusparseCreateSpVec\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCreateSpVec\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(indices), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&indices, \"cusparseCreateSpVec\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&values, \"cusparseCreateSpVec\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxType, \"cusparseCreateSpVec\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseCreateSpVec\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valueType, \"cusparseCreateSpVec\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCreateConstSpVec(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spVecDescr: *mut cuda_types::cusparse::cusparseConstSpVecDescr_t,\n    size: i64,\n    nnz: i64,\n    indices: *const ::core::ffi::c_void,\n    values: *const ::core::ffi::c_void,\n    idxType: cuda_types::cusparse::cusparseIndexType_t,\n    idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n    valueType: cuda_types::cusparse::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spVecDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spVecDescr, \"cusparseCreateConstSpVec\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cusparseCreateConstSpVec\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCreateConstSpVec\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(indices), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&indices, \"cusparseCreateConstSpVec\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&values, \"cusparseCreateConstSpVec\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxType, \"cusparseCreateConstSpVec\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseCreateConstSpVec\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valueType, \"cusparseCreateConstSpVec\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDestroySpVec(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spVecDescr: cuda_types::cusparse::cusparseConstSpVecDescr_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spVecDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spVecDescr, \"cusparseDestroySpVec\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpVecGet(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spVecDescr: cuda_types::cusparse::cusparseSpVecDescr_t,\n    size: *mut i64,\n    nnz: *mut i64,\n    indices: *mut *mut ::core::ffi::c_void,\n    values: *mut *mut ::core::ffi::c_void,\n    idxType: *mut cuda_types::cusparse::cusparseIndexType_t,\n    idxBase: *mut cuda_types::cusparse::cusparseIndexBase_t,\n    valueType: *mut cuda_types::cusparse::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spVecDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spVecDescr, \"cusparseSpVecGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cusparseSpVecGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseSpVecGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(indices), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&indices, \"cusparseSpVecGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&values, \"cusparseSpVecGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxType, \"cusparseSpVecGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseSpVecGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valueType, \"cusparseSpVecGet\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseConstSpVecGet(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spVecDescr: cuda_types::cusparse::cusparseConstSpVecDescr_t,\n    size: *mut i64,\n    nnz: *mut i64,\n    indices: *mut *const ::core::ffi::c_void,\n    values: *mut *const ::core::ffi::c_void,\n    idxType: *mut cuda_types::cusparse::cusparseIndexType_t,\n    idxBase: *mut cuda_types::cusparse::cusparseIndexBase_t,\n    valueType: *mut cuda_types::cusparse::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spVecDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spVecDescr, \"cusparseConstSpVecGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cusparseConstSpVecGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseConstSpVecGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(indices), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&indices, \"cusparseConstSpVecGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&values, \"cusparseConstSpVecGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxType, \"cusparseConstSpVecGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseConstSpVecGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valueType, \"cusparseConstSpVecGet\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpVecGetIndexBase(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spVecDescr: cuda_types::cusparse::cusparseConstSpVecDescr_t,\n    idxBase: *mut cuda_types::cusparse::cusparseIndexBase_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spVecDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &spVecDescr,\n        \"cusparseSpVecGetIndexBase\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseSpVecGetIndexBase\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpVecGetValues(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spVecDescr: cuda_types::cusparse::cusparseSpVecDescr_t,\n    values: *mut *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spVecDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spVecDescr, \"cusparseSpVecGetValues\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&values, \"cusparseSpVecGetValues\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseConstSpVecGetValues(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spVecDescr: cuda_types::cusparse::cusparseConstSpVecDescr_t,\n    values: *mut *const ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spVecDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &spVecDescr,\n        \"cusparseConstSpVecGetValues\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&values, \"cusparseConstSpVecGetValues\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpVecSetValues(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spVecDescr: cuda_types::cusparse::cusparseSpVecDescr_t,\n    values: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spVecDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spVecDescr, \"cusparseSpVecSetValues\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&values, \"cusparseSpVecSetValues\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCreateDnVec(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dnVecDescr: *mut cuda_types::cusparse::cusparseDnVecDescr_t,\n    size: i64,\n    values: *mut ::core::ffi::c_void,\n    valueType: cuda_types::cusparse::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dnVecDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dnVecDescr, \"cusparseCreateDnVec\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cusparseCreateDnVec\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&values, \"cusparseCreateDnVec\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valueType, \"cusparseCreateDnVec\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCreateConstDnVec(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dnVecDescr: *mut cuda_types::cusparse::cusparseConstDnVecDescr_t,\n    size: i64,\n    values: *const ::core::ffi::c_void,\n    valueType: cuda_types::cusparse::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dnVecDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dnVecDescr, \"cusparseCreateConstDnVec\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cusparseCreateConstDnVec\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&values, \"cusparseCreateConstDnVec\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valueType, \"cusparseCreateConstDnVec\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDestroyDnVec(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dnVecDescr: cuda_types::cusparse::cusparseConstDnVecDescr_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dnVecDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dnVecDescr, \"cusparseDestroyDnVec\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDnVecGet(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dnVecDescr: cuda_types::cusparse::cusparseDnVecDescr_t,\n    size: *mut i64,\n    values: *mut *mut ::core::ffi::c_void,\n    valueType: *mut cuda_types::cusparse::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dnVecDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dnVecDescr, \"cusparseDnVecGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cusparseDnVecGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&values, \"cusparseDnVecGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valueType, \"cusparseDnVecGet\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseConstDnVecGet(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dnVecDescr: cuda_types::cusparse::cusparseConstDnVecDescr_t,\n    size: *mut i64,\n    values: *mut *const ::core::ffi::c_void,\n    valueType: *mut cuda_types::cusparse::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dnVecDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dnVecDescr, \"cusparseConstDnVecGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(size), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&size, \"cusparseConstDnVecGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&values, \"cusparseConstDnVecGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valueType, \"cusparseConstDnVecGet\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDnVecGetValues(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dnVecDescr: cuda_types::cusparse::cusparseDnVecDescr_t,\n    values: *mut *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dnVecDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dnVecDescr, \"cusparseDnVecGetValues\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&values, \"cusparseDnVecGetValues\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseConstDnVecGetValues(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dnVecDescr: cuda_types::cusparse::cusparseConstDnVecDescr_t,\n    values: *mut *const ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dnVecDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dnVecDescr,\n        \"cusparseConstDnVecGetValues\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&values, \"cusparseConstDnVecGetValues\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDnVecSetValues(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dnVecDescr: cuda_types::cusparse::cusparseDnVecDescr_t,\n    values: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dnVecDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dnVecDescr, \"cusparseDnVecSetValues\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&values, \"cusparseDnVecSetValues\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDestroySpMat(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spMatDescr, \"cusparseDestroySpMat\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpMatGetFormat(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    format: *mut cuda_types::cusparse::cusparseFormat_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spMatDescr, \"cusparseSpMatGetFormat\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(format), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&format, \"cusparseSpMatGetFormat\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpMatGetIndexBase(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    idxBase: *mut cuda_types::cusparse::cusparseIndexBase_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &spMatDescr,\n        \"cusparseSpMatGetIndexBase\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseSpMatGetIndexBase\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpMatGetValues(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: cuda_types::cusparse::cusparseSpMatDescr_t,\n    values: *mut *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spMatDescr, \"cusparseSpMatGetValues\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&values, \"cusparseSpMatGetValues\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseConstSpMatGetValues(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    values: *mut *const ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &spMatDescr,\n        \"cusparseConstSpMatGetValues\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&values, \"cusparseConstSpMatGetValues\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpMatSetValues(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: cuda_types::cusparse::cusparseSpMatDescr_t,\n    values: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spMatDescr, \"cusparseSpMatSetValues\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&values, \"cusparseSpMatSetValues\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpMatGetSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    rows: *mut i64,\n    cols: *mut i64,\n    nnz: *mut i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spMatDescr, \"cusparseSpMatGetSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cusparseSpMatGetSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cusparseSpMatGetSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseSpMatGetSize\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpMatGetStridedBatch(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    batchCount: *mut ::core::ffi::c_int,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &spMatDescr,\n        \"cusparseSpMatGetStridedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseSpMatGetStridedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCooSetStridedBatch(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: cuda_types::cusparse::cusparseSpMatDescr_t,\n    batchCount: ::core::ffi::c_int,\n    batchStride: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &spMatDescr,\n        \"cusparseCooSetStridedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseCooSetStridedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchStride,\n        \"cusparseCooSetStridedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCsrSetStridedBatch(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: cuda_types::cusparse::cusparseSpMatDescr_t,\n    batchCount: ::core::ffi::c_int,\n    offsetsBatchStride: i64,\n    columnsValuesBatchStride: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &spMatDescr,\n        \"cusparseCsrSetStridedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseCsrSetStridedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(offsetsBatchStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &offsetsBatchStride,\n        \"cusparseCsrSetStridedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(columnsValuesBatchStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &columnsValuesBatchStride,\n        \"cusparseCsrSetStridedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseBsrSetStridedBatch(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: cuda_types::cusparse::cusparseSpMatDescr_t,\n    batchCount: ::core::ffi::c_int,\n    offsetsBatchStride: i64,\n    columnsBatchStride: i64,\n    ValuesBatchStride: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &spMatDescr,\n        \"cusparseBsrSetStridedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseBsrSetStridedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(offsetsBatchStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &offsetsBatchStride,\n        \"cusparseBsrSetStridedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(columnsBatchStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &columnsBatchStride,\n        \"cusparseBsrSetStridedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ValuesBatchStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ValuesBatchStride,\n        \"cusparseBsrSetStridedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseSpMatAttribute_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cusparse::cusparseSpMatAttribute_t::CUSPARSE_SPMAT_FILL_MODE => {\n                writer.write_all(stringify!(CUSPARSE_SPMAT_FILL_MODE).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseSpMatAttribute_t::CUSPARSE_SPMAT_DIAG_TYPE => {\n                writer.write_all(stringify!(CUSPARSE_SPMAT_DIAG_TYPE).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cusparseSpMatGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    attribute: cuda_types::cusparse::cusparseSpMatAttribute_t,\n    data: *mut ::core::ffi::c_void,\n    dataSize: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &spMatDescr,\n        \"cusparseSpMatGetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attribute), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attribute, \"cusparseSpMatGetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(data), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&data, \"cusparseSpMatGetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataSize, \"cusparseSpMatGetAttribute\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpMatSetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: cuda_types::cusparse::cusparseSpMatDescr_t,\n    attribute: cuda_types::cusparse::cusparseSpMatAttribute_t,\n    data: *mut ::core::ffi::c_void,\n    dataSize: usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &spMatDescr,\n        \"cusparseSpMatSetAttribute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attribute), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attribute, \"cusparseSpMatSetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(data), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&data, \"cusparseSpMatSetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(dataSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dataSize, \"cusparseSpMatSetAttribute\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCreateCsr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: *mut cuda_types::cusparse::cusparseSpMatDescr_t,\n    rows: i64,\n    cols: i64,\n    nnz: i64,\n    csrRowOffsets: *mut ::core::ffi::c_void,\n    csrColInd: *mut ::core::ffi::c_void,\n    csrValues: *mut ::core::ffi::c_void,\n    csrRowOffsetsType: cuda_types::cusparse::cusparseIndexType_t,\n    csrColIndType: cuda_types::cusparse::cusparseIndexType_t,\n    idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n    valueType: cuda_types::cusparse::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spMatDescr, \"cusparseCreateCsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cusparseCreateCsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cusparseCreateCsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCreateCsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrRowOffsets), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrRowOffsets, \"cusparseCreateCsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrColInd, \"cusparseCreateCsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrValues, \"cusparseCreateCsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrRowOffsetsType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrRowOffsetsType, \"cusparseCreateCsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrColIndType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrColIndType, \"cusparseCreateCsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseCreateCsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valueType, \"cusparseCreateCsr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCreateConstCsr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: *mut cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    rows: i64,\n    cols: i64,\n    nnz: i64,\n    csrRowOffsets: *const ::core::ffi::c_void,\n    csrColInd: *const ::core::ffi::c_void,\n    csrValues: *const ::core::ffi::c_void,\n    csrRowOffsetsType: cuda_types::cusparse::cusparseIndexType_t,\n    csrColIndType: cuda_types::cusparse::cusparseIndexType_t,\n    idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n    valueType: cuda_types::cusparse::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spMatDescr, \"cusparseCreateConstCsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cusparseCreateConstCsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cusparseCreateConstCsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCreateConstCsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrRowOffsets), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrRowOffsets,\n        \"cusparseCreateConstCsr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrColInd, \"cusparseCreateConstCsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrValues, \"cusparseCreateConstCsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrRowOffsetsType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrRowOffsetsType,\n        \"cusparseCreateConstCsr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrColIndType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrColIndType,\n        \"cusparseCreateConstCsr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseCreateConstCsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valueType, \"cusparseCreateConstCsr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCreateCsc(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: *mut cuda_types::cusparse::cusparseSpMatDescr_t,\n    rows: i64,\n    cols: i64,\n    nnz: i64,\n    cscColOffsets: *mut ::core::ffi::c_void,\n    cscRowInd: *mut ::core::ffi::c_void,\n    cscValues: *mut ::core::ffi::c_void,\n    cscColOffsetsType: cuda_types::cusparse::cusparseIndexType_t,\n    cscRowIndType: cuda_types::cusparse::cusparseIndexType_t,\n    idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n    valueType: cuda_types::cusparse::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spMatDescr, \"cusparseCreateCsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cusparseCreateCsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cusparseCreateCsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCreateCsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscColOffsets), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cscColOffsets, \"cusparseCreateCsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscRowInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cscRowInd, \"cusparseCreateCsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cscValues, \"cusparseCreateCsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscColOffsetsType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cscColOffsetsType, \"cusparseCreateCsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscRowIndType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cscRowIndType, \"cusparseCreateCsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseCreateCsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valueType, \"cusparseCreateCsc\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCreateConstCsc(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: *mut cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    rows: i64,\n    cols: i64,\n    nnz: i64,\n    cscColOffsets: *const ::core::ffi::c_void,\n    cscRowInd: *const ::core::ffi::c_void,\n    cscValues: *const ::core::ffi::c_void,\n    cscColOffsetsType: cuda_types::cusparse::cusparseIndexType_t,\n    cscRowIndType: cuda_types::cusparse::cusparseIndexType_t,\n    idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n    valueType: cuda_types::cusparse::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spMatDescr, \"cusparseCreateConstCsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cusparseCreateConstCsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cusparseCreateConstCsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCreateConstCsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscColOffsets), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cscColOffsets,\n        \"cusparseCreateConstCsc\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscRowInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cscRowInd, \"cusparseCreateConstCsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cscValues, \"cusparseCreateConstCsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscColOffsetsType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cscColOffsetsType,\n        \"cusparseCreateConstCsc\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscRowIndType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cscRowIndType,\n        \"cusparseCreateConstCsc\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseCreateConstCsc\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valueType, \"cusparseCreateConstCsc\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCsrGet(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: cuda_types::cusparse::cusparseSpMatDescr_t,\n    rows: *mut i64,\n    cols: *mut i64,\n    nnz: *mut i64,\n    csrRowOffsets: *mut *mut ::core::ffi::c_void,\n    csrColInd: *mut *mut ::core::ffi::c_void,\n    csrValues: *mut *mut ::core::ffi::c_void,\n    csrRowOffsetsType: *mut cuda_types::cusparse::cusparseIndexType_t,\n    csrColIndType: *mut cuda_types::cusparse::cusparseIndexType_t,\n    idxBase: *mut cuda_types::cusparse::cusparseIndexBase_t,\n    valueType: *mut cuda_types::cusparse::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spMatDescr, \"cusparseCsrGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cusparseCsrGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cusparseCsrGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCsrGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrRowOffsets), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrRowOffsets, \"cusparseCsrGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrColInd, \"cusparseCsrGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrValues, \"cusparseCsrGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrRowOffsetsType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrRowOffsetsType, \"cusparseCsrGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrColIndType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrColIndType, \"cusparseCsrGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseCsrGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valueType, \"cusparseCsrGet\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseConstCsrGet(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    rows: *mut i64,\n    cols: *mut i64,\n    nnz: *mut i64,\n    csrRowOffsets: *mut *const ::core::ffi::c_void,\n    csrColInd: *mut *const ::core::ffi::c_void,\n    csrValues: *mut *const ::core::ffi::c_void,\n    csrRowOffsetsType: *mut cuda_types::cusparse::cusparseIndexType_t,\n    csrColIndType: *mut cuda_types::cusparse::cusparseIndexType_t,\n    idxBase: *mut cuda_types::cusparse::cusparseIndexBase_t,\n    valueType: *mut cuda_types::cusparse::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spMatDescr, \"cusparseConstCsrGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cusparseConstCsrGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cusparseConstCsrGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseConstCsrGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrRowOffsets), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrRowOffsets, \"cusparseConstCsrGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrColInd, \"cusparseConstCsrGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrValues, \"cusparseConstCsrGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrRowOffsetsType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrRowOffsetsType,\n        \"cusparseConstCsrGet\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrColIndType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrColIndType, \"cusparseConstCsrGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseConstCsrGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valueType, \"cusparseConstCsrGet\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCscGet(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: cuda_types::cusparse::cusparseSpMatDescr_t,\n    rows: *mut i64,\n    cols: *mut i64,\n    nnz: *mut i64,\n    cscColOffsets: *mut *mut ::core::ffi::c_void,\n    cscRowInd: *mut *mut ::core::ffi::c_void,\n    cscValues: *mut *mut ::core::ffi::c_void,\n    cscColOffsetsType: *mut cuda_types::cusparse::cusparseIndexType_t,\n    cscRowIndType: *mut cuda_types::cusparse::cusparseIndexType_t,\n    idxBase: *mut cuda_types::cusparse::cusparseIndexBase_t,\n    valueType: *mut cuda_types::cusparse::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spMatDescr, \"cusparseCscGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cusparseCscGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cusparseCscGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCscGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscColOffsets), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cscColOffsets, \"cusparseCscGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscRowInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cscRowInd, \"cusparseCscGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cscValues, \"cusparseCscGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscColOffsetsType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cscColOffsetsType, \"cusparseCscGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscRowIndType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cscRowIndType, \"cusparseCscGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseCscGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valueType, \"cusparseCscGet\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseConstCscGet(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    rows: *mut i64,\n    cols: *mut i64,\n    nnz: *mut i64,\n    cscColOffsets: *mut *const ::core::ffi::c_void,\n    cscRowInd: *mut *const ::core::ffi::c_void,\n    cscValues: *mut *const ::core::ffi::c_void,\n    cscColOffsetsType: *mut cuda_types::cusparse::cusparseIndexType_t,\n    cscRowIndType: *mut cuda_types::cusparse::cusparseIndexType_t,\n    idxBase: *mut cuda_types::cusparse::cusparseIndexBase_t,\n    valueType: *mut cuda_types::cusparse::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spMatDescr, \"cusparseConstCscGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cusparseConstCscGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cusparseConstCscGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseConstCscGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscColOffsets), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cscColOffsets, \"cusparseConstCscGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscRowInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cscRowInd, \"cusparseConstCscGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cscValues, \"cusparseConstCscGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscColOffsetsType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cscColOffsetsType,\n        \"cusparseConstCscGet\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscRowIndType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cscRowIndType, \"cusparseConstCscGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseConstCscGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valueType, \"cusparseConstCscGet\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCsrSetPointers(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: cuda_types::cusparse::cusparseSpMatDescr_t,\n    csrRowOffsets: *mut ::core::ffi::c_void,\n    csrColInd: *mut ::core::ffi::c_void,\n    csrValues: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spMatDescr, \"cusparseCsrSetPointers\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrRowOffsets), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &csrRowOffsets,\n        \"cusparseCsrSetPointers\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrColInd, \"cusparseCsrSetPointers\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(csrValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&csrValues, \"cusparseCsrSetPointers\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCscSetPointers(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: cuda_types::cusparse::cusparseSpMatDescr_t,\n    cscColOffsets: *mut ::core::ffi::c_void,\n    cscRowInd: *mut ::core::ffi::c_void,\n    cscValues: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spMatDescr, \"cusparseCscSetPointers\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscColOffsets), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &cscColOffsets,\n        \"cusparseCscSetPointers\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscRowInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cscRowInd, \"cusparseCscSetPointers\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cscValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cscValues, \"cusparseCscSetPointers\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCreateBsr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: *mut cuda_types::cusparse::cusparseSpMatDescr_t,\n    brows: i64,\n    bcols: i64,\n    bnnz: i64,\n    rowBlockSize: i64,\n    colBlockSize: i64,\n    bsrRowOffsets: *mut ::core::ffi::c_void,\n    bsrColInd: *mut ::core::ffi::c_void,\n    bsrValues: *mut ::core::ffi::c_void,\n    bsrRowOffsetsType: cuda_types::cusparse::cusparseIndexType_t,\n    bsrColIndType: cuda_types::cusparse::cusparseIndexType_t,\n    idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n    valueType: cuda_types::cusparse::cudaDataType,\n    order: cuda_types::cusparse::cusparseOrder_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spMatDescr, \"cusparseCreateBsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(brows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&brows, \"cusparseCreateBsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bcols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bcols, \"cusparseCreateBsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bnnz, \"cusparseCreateBsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rowBlockSize, \"cusparseCreateBsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&colBlockSize, \"cusparseCreateBsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrRowOffsets), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrRowOffsets, \"cusparseCreateBsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrColInd, \"cusparseCreateBsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrValues, \"cusparseCreateBsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrRowOffsetsType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrRowOffsetsType, \"cusparseCreateBsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrColIndType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrColIndType, \"cusparseCreateBsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseCreateBsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valueType, \"cusparseCreateBsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(order), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&order, \"cusparseCreateBsr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCreateConstBsr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: *mut cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    brows: i64,\n    bcols: i64,\n    bnnz: i64,\n    rowBlockDim: i64,\n    colBlockDim: i64,\n    bsrRowOffsets: *const ::core::ffi::c_void,\n    bsrColInd: *const ::core::ffi::c_void,\n    bsrValues: *const ::core::ffi::c_void,\n    bsrRowOffsetsType: cuda_types::cusparse::cusparseIndexType_t,\n    bsrColIndType: cuda_types::cusparse::cusparseIndexType_t,\n    idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n    valueType: cuda_types::cusparse::cudaDataType,\n    order: cuda_types::cusparse::cusparseOrder_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spMatDescr, \"cusparseCreateConstBsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(brows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&brows, \"cusparseCreateConstBsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bcols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bcols, \"cusparseCreateConstBsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bnnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bnnz, \"cusparseCreateConstBsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rowBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rowBlockDim, \"cusparseCreateConstBsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(colBlockDim), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&colBlockDim, \"cusparseCreateConstBsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrRowOffsets), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrRowOffsets,\n        \"cusparseCreateConstBsr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrColInd, \"cusparseCreateConstBsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bsrValues, \"cusparseCreateConstBsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrRowOffsetsType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrRowOffsetsType,\n        \"cusparseCreateConstBsr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bsrColIndType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bsrColIndType,\n        \"cusparseCreateConstBsr\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseCreateConstBsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valueType, \"cusparseCreateConstBsr\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(order), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&order, \"cusparseCreateConstBsr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCreateCoo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: *mut cuda_types::cusparse::cusparseSpMatDescr_t,\n    rows: i64,\n    cols: i64,\n    nnz: i64,\n    cooRowInd: *mut ::core::ffi::c_void,\n    cooColInd: *mut ::core::ffi::c_void,\n    cooValues: *mut ::core::ffi::c_void,\n    cooIdxType: cuda_types::cusparse::cusparseIndexType_t,\n    idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n    valueType: cuda_types::cusparse::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spMatDescr, \"cusparseCreateCoo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cusparseCreateCoo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cusparseCreateCoo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCreateCoo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cooRowInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cooRowInd, \"cusparseCreateCoo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cooColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cooColInd, \"cusparseCreateCoo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cooValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cooValues, \"cusparseCreateCoo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cooIdxType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cooIdxType, \"cusparseCreateCoo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseCreateCoo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valueType, \"cusparseCreateCoo\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCreateConstCoo(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: *mut cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    rows: i64,\n    cols: i64,\n    nnz: i64,\n    cooRowInd: *const ::core::ffi::c_void,\n    cooColInd: *const ::core::ffi::c_void,\n    cooValues: *const ::core::ffi::c_void,\n    cooIdxType: cuda_types::cusparse::cusparseIndexType_t,\n    idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n    valueType: cuda_types::cusparse::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spMatDescr, \"cusparseCreateConstCoo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cusparseCreateConstCoo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cusparseCreateConstCoo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCreateConstCoo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cooRowInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cooRowInd, \"cusparseCreateConstCoo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cooColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cooColInd, \"cusparseCreateConstCoo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cooValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cooValues, \"cusparseCreateConstCoo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cooIdxType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cooIdxType, \"cusparseCreateConstCoo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseCreateConstCoo\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valueType, \"cusparseCreateConstCoo\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCooGet(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: cuda_types::cusparse::cusparseSpMatDescr_t,\n    rows: *mut i64,\n    cols: *mut i64,\n    nnz: *mut i64,\n    cooRowInd: *mut *mut ::core::ffi::c_void,\n    cooColInd: *mut *mut ::core::ffi::c_void,\n    cooValues: *mut *mut ::core::ffi::c_void,\n    idxType: *mut cuda_types::cusparse::cusparseIndexType_t,\n    idxBase: *mut cuda_types::cusparse::cusparseIndexBase_t,\n    valueType: *mut cuda_types::cusparse::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spMatDescr, \"cusparseCooGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cusparseCooGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cusparseCooGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCooGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cooRowInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cooRowInd, \"cusparseCooGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cooColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cooColInd, \"cusparseCooGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cooValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cooValues, \"cusparseCooGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxType, \"cusparseCooGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseCooGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valueType, \"cusparseCooGet\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseConstCooGet(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    rows: *mut i64,\n    cols: *mut i64,\n    nnz: *mut i64,\n    cooRowInd: *mut *const ::core::ffi::c_void,\n    cooColInd: *mut *const ::core::ffi::c_void,\n    cooValues: *mut *const ::core::ffi::c_void,\n    idxType: *mut cuda_types::cusparse::cusparseIndexType_t,\n    idxBase: *mut cuda_types::cusparse::cusparseIndexBase_t,\n    valueType: *mut cuda_types::cusparse::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spMatDescr, \"cusparseConstCooGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cusparseConstCooGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cusparseConstCooGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseConstCooGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cooRowInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cooRowInd, \"cusparseConstCooGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cooColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cooColInd, \"cusparseConstCooGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cooValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cooValues, \"cusparseConstCooGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxType, \"cusparseConstCooGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseConstCooGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valueType, \"cusparseConstCooGet\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCooSetPointers(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: cuda_types::cusparse::cusparseSpMatDescr_t,\n    cooRows: *mut ::core::ffi::c_void,\n    cooColumns: *mut ::core::ffi::c_void,\n    cooValues: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spMatDescr, \"cusparseCooSetPointers\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cooRows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cooRows, \"cusparseCooSetPointers\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cooColumns), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cooColumns, \"cusparseCooSetPointers\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cooValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cooValues, \"cusparseCooSetPointers\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCreateBlockedEll(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: *mut cuda_types::cusparse::cusparseSpMatDescr_t,\n    rows: i64,\n    cols: i64,\n    ellBlockSize: i64,\n    ellCols: i64,\n    ellColInd: *mut ::core::ffi::c_void,\n    ellValue: *mut ::core::ffi::c_void,\n    ellIdxType: cuda_types::cusparse::cusparseIndexType_t,\n    idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n    valueType: cuda_types::cusparse::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spMatDescr, \"cusparseCreateBlockedEll\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cusparseCreateBlockedEll\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cusparseCreateBlockedEll\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ellBlockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ellBlockSize,\n        \"cusparseCreateBlockedEll\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ellCols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ellCols, \"cusparseCreateBlockedEll\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ellColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ellColInd, \"cusparseCreateBlockedEll\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ellValue), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ellValue, \"cusparseCreateBlockedEll\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ellIdxType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ellIdxType, \"cusparseCreateBlockedEll\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseCreateBlockedEll\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valueType, \"cusparseCreateBlockedEll\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCreateConstBlockedEll(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: *mut cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    rows: i64,\n    cols: i64,\n    ellBlockSize: i64,\n    ellCols: i64,\n    ellColInd: *const ::core::ffi::c_void,\n    ellValue: *const ::core::ffi::c_void,\n    ellIdxType: cuda_types::cusparse::cusparseIndexType_t,\n    idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n    valueType: cuda_types::cusparse::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &spMatDescr,\n        \"cusparseCreateConstBlockedEll\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cusparseCreateConstBlockedEll\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cusparseCreateConstBlockedEll\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ellBlockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ellBlockSize,\n        \"cusparseCreateConstBlockedEll\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ellCols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ellCols,\n        \"cusparseCreateConstBlockedEll\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ellColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ellColInd,\n        \"cusparseCreateConstBlockedEll\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ellValue), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ellValue,\n        \"cusparseCreateConstBlockedEll\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ellIdxType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ellIdxType,\n        \"cusparseCreateConstBlockedEll\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &idxBase,\n        \"cusparseCreateConstBlockedEll\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &valueType,\n        \"cusparseCreateConstBlockedEll\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseBlockedEllGet(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: cuda_types::cusparse::cusparseSpMatDescr_t,\n    rows: *mut i64,\n    cols: *mut i64,\n    ellBlockSize: *mut i64,\n    ellCols: *mut i64,\n    ellColInd: *mut *mut ::core::ffi::c_void,\n    ellValue: *mut *mut ::core::ffi::c_void,\n    ellIdxType: *mut cuda_types::cusparse::cusparseIndexType_t,\n    idxBase: *mut cuda_types::cusparse::cusparseIndexBase_t,\n    valueType: *mut cuda_types::cusparse::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spMatDescr, \"cusparseBlockedEllGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cusparseBlockedEllGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cusparseBlockedEllGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ellBlockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ellBlockSize, \"cusparseBlockedEllGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ellCols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ellCols, \"cusparseBlockedEllGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ellColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ellColInd, \"cusparseBlockedEllGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ellValue), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ellValue, \"cusparseBlockedEllGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ellIdxType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ellIdxType, \"cusparseBlockedEllGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseBlockedEllGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valueType, \"cusparseBlockedEllGet\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseConstBlockedEllGet(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    rows: *mut i64,\n    cols: *mut i64,\n    ellBlockSize: *mut i64,\n    ellCols: *mut i64,\n    ellColInd: *mut *const ::core::ffi::c_void,\n    ellValue: *mut *const ::core::ffi::c_void,\n    ellIdxType: *mut cuda_types::cusparse::cusparseIndexType_t,\n    idxBase: *mut cuda_types::cusparse::cusparseIndexBase_t,\n    valueType: *mut cuda_types::cusparse::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &spMatDescr,\n        \"cusparseConstBlockedEllGet\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cusparseConstBlockedEllGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cusparseConstBlockedEllGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ellBlockSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ellBlockSize,\n        \"cusparseConstBlockedEllGet\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ellCols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ellCols, \"cusparseConstBlockedEllGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ellColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ellColInd,\n        \"cusparseConstBlockedEllGet\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ellValue), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ellValue, \"cusparseConstBlockedEllGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ellIdxType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &ellIdxType,\n        \"cusparseConstBlockedEllGet\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseConstBlockedEllGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &valueType,\n        \"cusparseConstBlockedEllGet\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCreateSlicedEll(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: *mut cuda_types::cusparse::cusparseSpMatDescr_t,\n    rows: i64,\n    cols: i64,\n    nnz: i64,\n    sellValuesSize: i64,\n    sliceSize: i64,\n    sellSliceOffsets: *mut ::core::ffi::c_void,\n    sellColInd: *mut ::core::ffi::c_void,\n    sellValues: *mut ::core::ffi::c_void,\n    sellSliceOffsetsType: cuda_types::cusparse::cusparseIndexType_t,\n    sellColIndType: cuda_types::cusparse::cusparseIndexType_t,\n    idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n    valueType: cuda_types::cusparse::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spMatDescr, \"cusparseCreateSlicedEll\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cusparseCreateSlicedEll\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cusparseCreateSlicedEll\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCreateSlicedEll\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sellValuesSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sellValuesSize,\n        \"cusparseCreateSlicedEll\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sliceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&sliceSize, \"cusparseCreateSlicedEll\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sellSliceOffsets), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sellSliceOffsets,\n        \"cusparseCreateSlicedEll\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sellColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&sellColInd, \"cusparseCreateSlicedEll\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sellValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&sellValues, \"cusparseCreateSlicedEll\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sellSliceOffsetsType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sellSliceOffsetsType,\n        \"cusparseCreateSlicedEll\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sellColIndType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sellColIndType,\n        \"cusparseCreateSlicedEll\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&idxBase, \"cusparseCreateSlicedEll\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valueType, \"cusparseCreateSlicedEll\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCreateConstSlicedEll(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spMatDescr: *mut cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    rows: i64,\n    cols: i64,\n    nnz: i64,\n    sellValuesSize: i64,\n    sliceSize: i64,\n    sellSliceOffsets: *const ::core::ffi::c_void,\n    sellColInd: *const ::core::ffi::c_void,\n    sellValues: *const ::core::ffi::c_void,\n    sellSliceOffsetsType: cuda_types::cusparse::cusparseIndexType_t,\n    sellColIndType: cuda_types::cusparse::cusparseIndexType_t,\n    idxBase: cuda_types::cusparse::cusparseIndexBase_t,\n    valueType: cuda_types::cusparse::cudaDataType,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &spMatDescr,\n        \"cusparseCreateConstSlicedEll\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cusparseCreateConstSlicedEll\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cusparseCreateConstSlicedEll\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(nnz), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&nnz, \"cusparseCreateConstSlicedEll\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sellValuesSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sellValuesSize,\n        \"cusparseCreateConstSlicedEll\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sliceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sliceSize,\n        \"cusparseCreateConstSlicedEll\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sellSliceOffsets), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sellSliceOffsets,\n        \"cusparseCreateConstSlicedEll\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sellColInd), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sellColInd,\n        \"cusparseCreateConstSlicedEll\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sellValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sellValues,\n        \"cusparseCreateConstSlicedEll\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sellSliceOffsetsType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sellSliceOffsetsType,\n        \"cusparseCreateConstSlicedEll\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(sellColIndType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &sellColIndType,\n        \"cusparseCreateConstSlicedEll\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(idxBase), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &idxBase,\n        \"cusparseCreateConstSlicedEll\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &valueType,\n        \"cusparseCreateConstSlicedEll\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCreateDnMat(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dnMatDescr: *mut cuda_types::cusparse::cusparseDnMatDescr_t,\n    rows: i64,\n    cols: i64,\n    ld: i64,\n    values: *mut ::core::ffi::c_void,\n    valueType: cuda_types::cusparse::cudaDataType,\n    order: cuda_types::cusparse::cusparseOrder_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dnMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dnMatDescr, \"cusparseCreateDnMat\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cusparseCreateDnMat\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cusparseCreateDnMat\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ld), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ld, \"cusparseCreateDnMat\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&values, \"cusparseCreateDnMat\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valueType, \"cusparseCreateDnMat\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(order), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&order, \"cusparseCreateDnMat\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseCreateConstDnMat(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dnMatDescr: *mut cuda_types::cusparse::cusparseConstDnMatDescr_t,\n    rows: i64,\n    cols: i64,\n    ld: i64,\n    values: *const ::core::ffi::c_void,\n    valueType: cuda_types::cusparse::cudaDataType,\n    order: cuda_types::cusparse::cusparseOrder_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dnMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dnMatDescr, \"cusparseCreateConstDnMat\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cusparseCreateConstDnMat\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cusparseCreateConstDnMat\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ld), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ld, \"cusparseCreateConstDnMat\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&values, \"cusparseCreateConstDnMat\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(valueType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&valueType, \"cusparseCreateConstDnMat\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(order), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&order, \"cusparseCreateConstDnMat\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDestroyDnMat(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dnMatDescr: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dnMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dnMatDescr, \"cusparseDestroyDnMat\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDnMatGet(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dnMatDescr: cuda_types::cusparse::cusparseDnMatDescr_t,\n    rows: *mut i64,\n    cols: *mut i64,\n    ld: *mut i64,\n    values: *mut *mut ::core::ffi::c_void,\n    type_: *mut cuda_types::cusparse::cudaDataType,\n    order: *mut cuda_types::cusparse::cusparseOrder_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dnMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dnMatDescr, \"cusparseDnMatGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cusparseDnMatGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cusparseDnMatGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ld), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ld, \"cusparseDnMatGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&values, \"cusparseDnMatGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cusparseDnMatGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(order), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&order, \"cusparseDnMatGet\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseConstDnMatGet(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dnMatDescr: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n    rows: *mut i64,\n    cols: *mut i64,\n    ld: *mut i64,\n    values: *mut *const ::core::ffi::c_void,\n    type_: *mut cuda_types::cusparse::cudaDataType,\n    order: *mut cuda_types::cusparse::cusparseOrder_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dnMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dnMatDescr, \"cusparseConstDnMatGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(rows), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&rows, \"cusparseConstDnMatGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(cols), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&cols, \"cusparseConstDnMatGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ld), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ld, \"cusparseConstDnMatGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&values, \"cusparseConstDnMatGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(type_), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&type_, \"cusparseConstDnMatGet\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(order), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&order, \"cusparseConstDnMatGet\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDnMatGetValues(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dnMatDescr: cuda_types::cusparse::cusparseDnMatDescr_t,\n    values: *mut *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dnMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dnMatDescr, \"cusparseDnMatGetValues\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&values, \"cusparseDnMatGetValues\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseConstDnMatGetValues(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dnMatDescr: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n    values: *mut *const ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dnMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dnMatDescr,\n        \"cusparseConstDnMatGetValues\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&values, \"cusparseConstDnMatGetValues\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDnMatSetValues(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dnMatDescr: cuda_types::cusparse::cusparseDnMatDescr_t,\n    values: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dnMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&dnMatDescr, \"cusparseDnMatSetValues\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(values), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&values, \"cusparseDnMatSetValues\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDnMatSetStridedBatch(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dnMatDescr: cuda_types::cusparse::cusparseDnMatDescr_t,\n    batchCount: ::core::ffi::c_int,\n    batchStride: i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dnMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dnMatDescr,\n        \"cusparseDnMatSetStridedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseDnMatSetStridedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchStride,\n        \"cusparseDnMatSetStridedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDnMatGetStridedBatch(\n    writer: &mut (impl std::io::Write + ?Sized),\n    dnMatDescr: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n    batchCount: *mut ::core::ffi::c_int,\n    batchStride: *mut i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(dnMatDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &dnMatDescr,\n        \"cusparseDnMatGetStridedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchCount), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchCount,\n        \"cusparseDnMatGetStridedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(batchStride), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &batchStride,\n        \"cusparseDnMatGetStridedBatch\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseAxpby(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    alpha: *const ::core::ffi::c_void,\n    vecX: cuda_types::cusparse::cusparseConstSpVecDescr_t,\n    beta: *const ::core::ffi::c_void,\n    vecY: cuda_types::cusparse::cusparseDnVecDescr_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseAxpby\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseAxpby\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vecX), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vecX, \"cusparseAxpby\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseAxpby\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vecY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vecY, \"cusparseAxpby\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseGather(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    vecY: cuda_types::cusparse::cusparseConstDnVecDescr_t,\n    vecX: cuda_types::cusparse::cusparseSpVecDescr_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseGather\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vecY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vecY, \"cusparseGather\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vecX), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vecX, \"cusparseGather\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseScatter(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    vecX: cuda_types::cusparse::cusparseConstSpVecDescr_t,\n    vecY: cuda_types::cusparse::cusparseDnVecDescr_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseScatter\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vecX), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vecX, \"cusparseScatter\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vecY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vecY, \"cusparseScatter\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseRot(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    c_coeff: *const ::core::ffi::c_void,\n    s_coeff: *const ::core::ffi::c_void,\n    vecX: cuda_types::cusparse::cusparseSpVecDescr_t,\n    vecY: cuda_types::cusparse::cusparseDnVecDescr_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseRot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(c_coeff), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&c_coeff, \"cusparseRot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(s_coeff), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&s_coeff, \"cusparseRot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vecX), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vecX, \"cusparseRot\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vecY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vecY, \"cusparseRot\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpVV_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    opX: cuda_types::cusparse::cusparseOperation_t,\n    vecX: cuda_types::cusparse::cusparseConstSpVecDescr_t,\n    vecY: cuda_types::cusparse::cusparseConstDnVecDescr_t,\n    result: *const ::core::ffi::c_void,\n    computeType: cuda_types::cusparse::cudaDataType,\n    bufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSpVV_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opX), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opX, \"cusparseSpVV_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vecX), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vecX, \"cusparseSpVV_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vecY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vecY, \"cusparseSpVV_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cusparseSpVV_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&computeType, \"cusparseSpVV_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bufferSize, \"cusparseSpVV_bufferSize\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpVV(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    opX: cuda_types::cusparse::cusparseOperation_t,\n    vecX: cuda_types::cusparse::cusparseConstSpVecDescr_t,\n    vecY: cuda_types::cusparse::cusparseConstDnVecDescr_t,\n    result: *mut ::core::ffi::c_void,\n    computeType: cuda_types::cusparse::cudaDataType,\n    externalBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSpVV\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opX), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opX, \"cusparseSpVV\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vecX), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vecX, \"cusparseSpVV\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vecY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vecY, \"cusparseSpVV\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(result), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&result, \"cusparseSpVV\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&computeType, \"cusparseSpVV\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(externalBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&externalBuffer, \"cusparseSpVV\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseSparseToDenseAlg_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cusparse::cusparseSparseToDenseAlg_t::CUSPARSE_SPARSETODENSE_ALG_DEFAULT => {\n                writer\n                    .write_all(stringify!(CUSPARSE_SPARSETODENSE_ALG_DEFAULT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cusparseSparseToDense_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    matB: cuda_types::cusparse::cusparseDnMatDescr_t,\n    alg: cuda_types::cusparse::cusparseSparseToDenseAlg_t,\n    bufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseSparseToDense_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &matA,\n        \"cusparseSparseToDense_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &matB,\n        \"cusparseSparseToDense_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alg,\n        \"cusparseSparseToDense_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bufferSize,\n        \"cusparseSparseToDense_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSparseToDense(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    matB: cuda_types::cusparse::cusparseDnMatDescr_t,\n    alg: cuda_types::cusparse::cusparseSparseToDenseAlg_t,\n    externalBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSparseToDense\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matA, \"cusparseSparseToDense\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matB, \"cusparseSparseToDense\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alg, \"cusparseSparseToDense\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(externalBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &externalBuffer,\n        \"cusparseSparseToDense\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseDenseToSparseAlg_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cusparse::cusparseDenseToSparseAlg_t::CUSPARSE_DENSETOSPARSE_ALG_DEFAULT => {\n                writer\n                    .write_all(stringify!(CUSPARSE_DENSETOSPARSE_ALG_DEFAULT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cusparseDenseToSparse_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    matA: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n    matB: cuda_types::cusparse::cusparseSpMatDescr_t,\n    alg: cuda_types::cusparse::cusparseDenseToSparseAlg_t,\n    bufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDenseToSparse_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &matA,\n        \"cusparseDenseToSparse_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &matB,\n        \"cusparseDenseToSparse_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alg,\n        \"cusparseDenseToSparse_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bufferSize,\n        \"cusparseDenseToSparse_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDenseToSparse_analysis(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    matA: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n    matB: cuda_types::cusparse::cusparseSpMatDescr_t,\n    alg: cuda_types::cusparse::cusparseDenseToSparseAlg_t,\n    externalBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDenseToSparse_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matA, \"cusparseDenseToSparse_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matB, \"cusparseDenseToSparse_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alg, \"cusparseDenseToSparse_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(externalBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &externalBuffer,\n        \"cusparseDenseToSparse_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseDenseToSparse_convert(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    matA: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n    matB: cuda_types::cusparse::cusparseSpMatDescr_t,\n    alg: cuda_types::cusparse::cusparseDenseToSparseAlg_t,\n    externalBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseDenseToSparse_convert\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matA, \"cusparseDenseToSparse_convert\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matB, \"cusparseDenseToSparse_convert\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alg, \"cusparseDenseToSparse_convert\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(externalBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &externalBuffer,\n        \"cusparseDenseToSparse_convert\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseSpMVAlg_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cusparse::cusparseSpMVAlg_t::CUSPARSE_SPMV_ALG_DEFAULT => {\n                writer.write_all(stringify!(CUSPARSE_SPMV_ALG_DEFAULT).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseSpMVAlg_t::CUSPARSE_SPMV_CSR_ALG1 => {\n                writer.write_all(stringify!(CUSPARSE_SPMV_CSR_ALG1).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseSpMVAlg_t::CUSPARSE_SPMV_CSR_ALG2 => {\n                writer.write_all(stringify!(CUSPARSE_SPMV_CSR_ALG2).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseSpMVAlg_t::CUSPARSE_SPMV_COO_ALG1 => {\n                writer.write_all(stringify!(CUSPARSE_SPMV_COO_ALG1).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseSpMVAlg_t::CUSPARSE_SPMV_COO_ALG2 => {\n                writer.write_all(stringify!(CUSPARSE_SPMV_COO_ALG2).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseSpMVAlg_t::CUSPARSE_SPMV_SELL_ALG1 => {\n                writer.write_all(stringify!(CUSPARSE_SPMV_SELL_ALG1).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseSpMVAlg_t::CUSPARSE_SPMV_BSR_ALG1 => {\n                writer.write_all(stringify!(CUSPARSE_SPMV_BSR_ALG1).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cusparseSpMV(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    opA: cuda_types::cusparse::cusparseOperation_t,\n    alpha: *const ::core::ffi::c_void,\n    matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    vecX: cuda_types::cusparse::cusparseConstDnVecDescr_t,\n    beta: *const ::core::ffi::c_void,\n    vecY: cuda_types::cusparse::cusparseDnVecDescr_t,\n    computeType: cuda_types::cusparse::cudaDataType,\n    alg: cuda_types::cusparse::cusparseSpMVAlg_t,\n    externalBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSpMV\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opA, \"cusparseSpMV\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseSpMV\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matA, \"cusparseSpMV\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vecX), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vecX, \"cusparseSpMV\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseSpMV\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vecY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vecY, \"cusparseSpMV\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&computeType, \"cusparseSpMV\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alg, \"cusparseSpMV\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(externalBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&externalBuffer, \"cusparseSpMV\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpMV_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    opA: cuda_types::cusparse::cusparseOperation_t,\n    alpha: *const ::core::ffi::c_void,\n    matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    vecX: cuda_types::cusparse::cusparseConstDnVecDescr_t,\n    beta: *const ::core::ffi::c_void,\n    vecY: cuda_types::cusparse::cusparseDnVecDescr_t,\n    computeType: cuda_types::cusparse::cudaDataType,\n    alg: cuda_types::cusparse::cusparseSpMVAlg_t,\n    bufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSpMV_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opA, \"cusparseSpMV_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseSpMV_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matA, \"cusparseSpMV_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vecX), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vecX, \"cusparseSpMV_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseSpMV_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vecY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vecY, \"cusparseSpMV_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&computeType, \"cusparseSpMV_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alg, \"cusparseSpMV_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bufferSize, \"cusparseSpMV_bufferSize\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpMV_preprocess(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    opA: cuda_types::cusparse::cusparseOperation_t,\n    alpha: *const ::core::ffi::c_void,\n    matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    vecX: cuda_types::cusparse::cusparseConstDnVecDescr_t,\n    beta: *const ::core::ffi::c_void,\n    vecY: cuda_types::cusparse::cusparseDnVecDescr_t,\n    computeType: cuda_types::cusparse::cudaDataType,\n    alg: cuda_types::cusparse::cusparseSpMVAlg_t,\n    externalBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSpMV_preprocess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opA, \"cusparseSpMV_preprocess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseSpMV_preprocess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matA, \"cusparseSpMV_preprocess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vecX), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vecX, \"cusparseSpMV_preprocess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseSpMV_preprocess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vecY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vecY, \"cusparseSpMV_preprocess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&computeType, \"cusparseSpMV_preprocess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alg, \"cusparseSpMV_preprocess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(externalBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &externalBuffer,\n        \"cusparseSpMV_preprocess\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseSpSVAlg_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cusparse::cusparseSpSVAlg_t::CUSPARSE_SPSV_ALG_DEFAULT => {\n                writer.write_all(stringify!(CUSPARSE_SPSV_ALG_DEFAULT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseSpSVUpdate_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cusparse::cusparseSpSVUpdate_t::CUSPARSE_SPSV_UPDATE_GENERAL => {\n                writer.write_all(stringify!(CUSPARSE_SPSV_UPDATE_GENERAL).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseSpSVUpdate_t::CUSPARSE_SPSV_UPDATE_DIAGONAL => {\n                writer.write_all(stringify!(CUSPARSE_SPSV_UPDATE_DIAGONAL).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseSpSVDescr_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\npub fn write_cusparseSpSV_createDescr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    descr: *mut cuda_types::cusparse::cusparseSpSVDescr_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(descr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descr, \"cusparseSpSV_createDescr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpSV_destroyDescr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    descr: cuda_types::cusparse::cusparseSpSVDescr_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(descr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descr, \"cusparseSpSV_destroyDescr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpSV_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    opA: cuda_types::cusparse::cusparseOperation_t,\n    alpha: *const ::core::ffi::c_void,\n    matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    vecX: cuda_types::cusparse::cusparseConstDnVecDescr_t,\n    vecY: cuda_types::cusparse::cusparseDnVecDescr_t,\n    computeType: cuda_types::cusparse::cudaDataType,\n    alg: cuda_types::cusparse::cusparseSpSVAlg_t,\n    spsvDescr: cuda_types::cusparse::cusparseSpSVDescr_t,\n    bufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSpSV_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opA, \"cusparseSpSV_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseSpSV_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matA, \"cusparseSpSV_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vecX), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vecX, \"cusparseSpSV_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vecY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vecY, \"cusparseSpSV_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&computeType, \"cusparseSpSV_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alg, \"cusparseSpSV_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(spsvDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spsvDescr, \"cusparseSpSV_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bufferSize, \"cusparseSpSV_bufferSize\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpSV_analysis(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    opA: cuda_types::cusparse::cusparseOperation_t,\n    alpha: *const ::core::ffi::c_void,\n    matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    vecX: cuda_types::cusparse::cusparseConstDnVecDescr_t,\n    vecY: cuda_types::cusparse::cusparseDnVecDescr_t,\n    computeType: cuda_types::cusparse::cudaDataType,\n    alg: cuda_types::cusparse::cusparseSpSVAlg_t,\n    spsvDescr: cuda_types::cusparse::cusparseSpSVDescr_t,\n    externalBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSpSV_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opA, \"cusparseSpSV_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseSpSV_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matA, \"cusparseSpSV_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vecX), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vecX, \"cusparseSpSV_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vecY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vecY, \"cusparseSpSV_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&computeType, \"cusparseSpSV_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alg, \"cusparseSpSV_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(spsvDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spsvDescr, \"cusparseSpSV_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(externalBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &externalBuffer,\n        \"cusparseSpSV_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpSV_solve(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    opA: cuda_types::cusparse::cusparseOperation_t,\n    alpha: *const ::core::ffi::c_void,\n    matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    vecX: cuda_types::cusparse::cusparseConstDnVecDescr_t,\n    vecY: cuda_types::cusparse::cusparseDnVecDescr_t,\n    computeType: cuda_types::cusparse::cudaDataType,\n    alg: cuda_types::cusparse::cusparseSpSVAlg_t,\n    spsvDescr: cuda_types::cusparse::cusparseSpSVDescr_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSpSV_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opA, \"cusparseSpSV_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseSpSV_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matA, \"cusparseSpSV_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vecX), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vecX, \"cusparseSpSV_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(vecY), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&vecY, \"cusparseSpSV_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&computeType, \"cusparseSpSV_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alg, \"cusparseSpSV_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(spsvDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spsvDescr, \"cusparseSpSV_solve\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpSV_updateMatrix(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    spsvDescr: cuda_types::cusparse::cusparseSpSVDescr_t,\n    newValues: *mut ::core::ffi::c_void,\n    updatePart: cuda_types::cusparse::cusparseSpSVUpdate_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSpSV_updateMatrix\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(spsvDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spsvDescr, \"cusparseSpSV_updateMatrix\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(newValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&newValues, \"cusparseSpSV_updateMatrix\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(updatePart), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &updatePart,\n        \"cusparseSpSV_updateMatrix\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseSpSMAlg_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cusparse::cusparseSpSMAlg_t::CUSPARSE_SPSM_ALG_DEFAULT => {\n                writer.write_all(stringify!(CUSPARSE_SPSM_ALG_DEFAULT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseSpSMUpdate_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cusparse::cusparseSpSMUpdate_t::CUSPARSE_SPSM_UPDATE_GENERAL => {\n                writer.write_all(stringify!(CUSPARSE_SPSM_UPDATE_GENERAL).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseSpSMUpdate_t::CUSPARSE_SPSM_UPDATE_DIAGONAL => {\n                writer.write_all(stringify!(CUSPARSE_SPSM_UPDATE_DIAGONAL).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseSpSMDescr_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\npub fn write_cusparseSpSM_createDescr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    descr: *mut cuda_types::cusparse::cusparseSpSMDescr_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(descr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descr, \"cusparseSpSM_createDescr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpSM_destroyDescr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    descr: cuda_types::cusparse::cusparseSpSMDescr_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(descr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descr, \"cusparseSpSM_destroyDescr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpSM_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    opA: cuda_types::cusparse::cusparseOperation_t,\n    opB: cuda_types::cusparse::cusparseOperation_t,\n    alpha: *const ::core::ffi::c_void,\n    matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    matB: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n    matC: cuda_types::cusparse::cusparseDnMatDescr_t,\n    computeType: cuda_types::cusparse::cudaDataType,\n    alg: cuda_types::cusparse::cusparseSpSMAlg_t,\n    spsmDescr: cuda_types::cusparse::cusparseSpSMDescr_t,\n    bufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSpSM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opA, \"cusparseSpSM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opB, \"cusparseSpSM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseSpSM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matA, \"cusparseSpSM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matB, \"cusparseSpSM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matC, \"cusparseSpSM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&computeType, \"cusparseSpSM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alg, \"cusparseSpSM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(spsmDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spsmDescr, \"cusparseSpSM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bufferSize, \"cusparseSpSM_bufferSize\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpSM_analysis(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    opA: cuda_types::cusparse::cusparseOperation_t,\n    opB: cuda_types::cusparse::cusparseOperation_t,\n    alpha: *const ::core::ffi::c_void,\n    matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    matB: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n    matC: cuda_types::cusparse::cusparseDnMatDescr_t,\n    computeType: cuda_types::cusparse::cudaDataType,\n    alg: cuda_types::cusparse::cusparseSpSMAlg_t,\n    spsmDescr: cuda_types::cusparse::cusparseSpSMDescr_t,\n    externalBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSpSM_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opA, \"cusparseSpSM_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opB, \"cusparseSpSM_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseSpSM_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matA, \"cusparseSpSM_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matB, \"cusparseSpSM_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matC, \"cusparseSpSM_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&computeType, \"cusparseSpSM_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alg, \"cusparseSpSM_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(spsmDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spsmDescr, \"cusparseSpSM_analysis\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(externalBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &externalBuffer,\n        \"cusparseSpSM_analysis\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpSM_solve(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    opA: cuda_types::cusparse::cusparseOperation_t,\n    opB: cuda_types::cusparse::cusparseOperation_t,\n    alpha: *const ::core::ffi::c_void,\n    matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    matB: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n    matC: cuda_types::cusparse::cusparseDnMatDescr_t,\n    computeType: cuda_types::cusparse::cudaDataType,\n    alg: cuda_types::cusparse::cusparseSpSMAlg_t,\n    spsmDescr: cuda_types::cusparse::cusparseSpSMDescr_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSpSM_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opA, \"cusparseSpSM_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opB, \"cusparseSpSM_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseSpSM_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matA, \"cusparseSpSM_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matB, \"cusparseSpSM_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matC, \"cusparseSpSM_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&computeType, \"cusparseSpSM_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alg, \"cusparseSpSM_solve\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(spsmDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spsmDescr, \"cusparseSpSM_solve\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpSM_updateMatrix(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    spsmDescr: cuda_types::cusparse::cusparseSpSMDescr_t,\n    newValues: *mut ::core::ffi::c_void,\n    updatePart: cuda_types::cusparse::cusparseSpSMUpdate_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSpSM_updateMatrix\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(spsmDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spsmDescr, \"cusparseSpSM_updateMatrix\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(newValues), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&newValues, \"cusparseSpSM_updateMatrix\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(updatePart), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &updatePart,\n        \"cusparseSpSM_updateMatrix\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseSpMMAlg_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cusparse::cusparseSpMMAlg_t::CUSPARSE_SPMM_ALG_DEFAULT => {\n                writer.write_all(stringify!(CUSPARSE_SPMM_ALG_DEFAULT).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseSpMMAlg_t::CUSPARSE_SPMM_COO_ALG1 => {\n                writer.write_all(stringify!(CUSPARSE_SPMM_COO_ALG1).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseSpMMAlg_t::CUSPARSE_SPMM_COO_ALG2 => {\n                writer.write_all(stringify!(CUSPARSE_SPMM_COO_ALG2).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseSpMMAlg_t::CUSPARSE_SPMM_COO_ALG3 => {\n                writer.write_all(stringify!(CUSPARSE_SPMM_COO_ALG3).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseSpMMAlg_t::CUSPARSE_SPMM_COO_ALG4 => {\n                writer.write_all(stringify!(CUSPARSE_SPMM_COO_ALG4).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseSpMMAlg_t::CUSPARSE_SPMM_CSR_ALG1 => {\n                writer.write_all(stringify!(CUSPARSE_SPMM_CSR_ALG1).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseSpMMAlg_t::CUSPARSE_SPMM_CSR_ALG2 => {\n                writer.write_all(stringify!(CUSPARSE_SPMM_CSR_ALG2).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseSpMMAlg_t::CUSPARSE_SPMM_CSR_ALG3 => {\n                writer.write_all(stringify!(CUSPARSE_SPMM_CSR_ALG3).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseSpMMAlg_t::CUSPARSE_SPMM_BLOCKED_ELL_ALG1 => {\n                writer.write_all(stringify!(CUSPARSE_SPMM_BLOCKED_ELL_ALG1).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseSpMMAlg_t::CUSPARSE_SPMM_BSR_ALG1 => {\n                writer.write_all(stringify!(CUSPARSE_SPMM_BSR_ALG1).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cusparseSpMM_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    opA: cuda_types::cusparse::cusparseOperation_t,\n    opB: cuda_types::cusparse::cusparseOperation_t,\n    alpha: *const ::core::ffi::c_void,\n    matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    matB: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n    beta: *const ::core::ffi::c_void,\n    matC: cuda_types::cusparse::cusparseDnMatDescr_t,\n    computeType: cuda_types::cusparse::cudaDataType,\n    alg: cuda_types::cusparse::cusparseSpMMAlg_t,\n    bufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSpMM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opA, \"cusparseSpMM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opB, \"cusparseSpMM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseSpMM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matA, \"cusparseSpMM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matB, \"cusparseSpMM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseSpMM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matC, \"cusparseSpMM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&computeType, \"cusparseSpMM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alg, \"cusparseSpMM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bufferSize, \"cusparseSpMM_bufferSize\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpMM_preprocess(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    opA: cuda_types::cusparse::cusparseOperation_t,\n    opB: cuda_types::cusparse::cusparseOperation_t,\n    alpha: *const ::core::ffi::c_void,\n    matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    matB: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n    beta: *const ::core::ffi::c_void,\n    matC: cuda_types::cusparse::cusparseDnMatDescr_t,\n    computeType: cuda_types::cusparse::cudaDataType,\n    alg: cuda_types::cusparse::cusparseSpMMAlg_t,\n    externalBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSpMM_preprocess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opA, \"cusparseSpMM_preprocess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opB, \"cusparseSpMM_preprocess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseSpMM_preprocess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matA, \"cusparseSpMM_preprocess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matB, \"cusparseSpMM_preprocess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseSpMM_preprocess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matC, \"cusparseSpMM_preprocess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&computeType, \"cusparseSpMM_preprocess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alg, \"cusparseSpMM_preprocess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(externalBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &externalBuffer,\n        \"cusparseSpMM_preprocess\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpMM(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    opA: cuda_types::cusparse::cusparseOperation_t,\n    opB: cuda_types::cusparse::cusparseOperation_t,\n    alpha: *const ::core::ffi::c_void,\n    matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    matB: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n    beta: *const ::core::ffi::c_void,\n    matC: cuda_types::cusparse::cusparseDnMatDescr_t,\n    computeType: cuda_types::cusparse::cudaDataType,\n    alg: cuda_types::cusparse::cusparseSpMMAlg_t,\n    externalBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSpMM\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opA, \"cusparseSpMM\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opB, \"cusparseSpMM\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseSpMM\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matA, \"cusparseSpMM\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matB, \"cusparseSpMM\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseSpMM\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matC, \"cusparseSpMM\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&computeType, \"cusparseSpMM\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alg, \"cusparseSpMM\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(externalBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&externalBuffer, \"cusparseSpMM\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseSpGEMMAlg_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cusparse::cusparseSpGEMMAlg_t::CUSPARSE_SPGEMM_DEFAULT => {\n                writer.write_all(stringify!(CUSPARSE_SPGEMM_DEFAULT).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseSpGEMMAlg_t::CUSPARSE_SPGEMM_CSR_ALG_DETERMINITIC => {\n                writer\n                    .write_all(\n                        stringify!(CUSPARSE_SPGEMM_CSR_ALG_DETERMINITIC).as_bytes(),\n                    )\n            }\n            &cuda_types::cusparse::cusparseSpGEMMAlg_t::CUSPARSE_SPGEMM_CSR_ALG_NONDETERMINITIC => {\n                writer\n                    .write_all(\n                        stringify!(CUSPARSE_SPGEMM_CSR_ALG_NONDETERMINITIC).as_bytes(),\n                    )\n            }\n            &cuda_types::cusparse::cusparseSpGEMMAlg_t::CUSPARSE_SPGEMM_ALG1 => {\n                writer.write_all(stringify!(CUSPARSE_SPGEMM_ALG1).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseSpGEMMAlg_t::CUSPARSE_SPGEMM_ALG2 => {\n                writer.write_all(stringify!(CUSPARSE_SPGEMM_ALG2).as_bytes())\n            }\n            &cuda_types::cusparse::cusparseSpGEMMAlg_t::CUSPARSE_SPGEMM_ALG3 => {\n                writer.write_all(stringify!(CUSPARSE_SPGEMM_ALG3).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseSpGEMMDescr_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\npub fn write_cusparseSpGEMM_createDescr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    descr: *mut cuda_types::cusparse::cusparseSpGEMMDescr_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(descr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descr, \"cusparseSpGEMM_createDescr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpGEMM_destroyDescr(\n    writer: &mut (impl std::io::Write + ?Sized),\n    descr: cuda_types::cusparse::cusparseSpGEMMDescr_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(descr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&descr, \"cusparseSpGEMM_destroyDescr\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpGEMM_workEstimation(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    opA: cuda_types::cusparse::cusparseOperation_t,\n    opB: cuda_types::cusparse::cusparseOperation_t,\n    alpha: *const ::core::ffi::c_void,\n    matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    matB: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    beta: *const ::core::ffi::c_void,\n    matC: cuda_types::cusparse::cusparseSpMatDescr_t,\n    computeType: cuda_types::cusparse::cudaDataType,\n    alg: cuda_types::cusparse::cusparseSpGEMMAlg_t,\n    spgemmDescr: cuda_types::cusparse::cusparseSpGEMMDescr_t,\n    bufferSize1: *mut usize,\n    externalBuffer1: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseSpGEMM_workEstimation\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opA, \"cusparseSpGEMM_workEstimation\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opB, \"cusparseSpGEMM_workEstimation\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseSpGEMM_workEstimation\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matA, \"cusparseSpGEMM_workEstimation\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matB, \"cusparseSpGEMM_workEstimation\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseSpGEMM_workEstimation\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matC, \"cusparseSpGEMM_workEstimation\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &computeType,\n        \"cusparseSpGEMM_workEstimation\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alg, \"cusparseSpGEMM_workEstimation\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(spgemmDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &spgemmDescr,\n        \"cusparseSpGEMM_workEstimation\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSize1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bufferSize1,\n        \"cusparseSpGEMM_workEstimation\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(externalBuffer1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &externalBuffer1,\n        \"cusparseSpGEMM_workEstimation\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpGEMM_getNumProducts(\n    writer: &mut (impl std::io::Write + ?Sized),\n    spgemmDescr: cuda_types::cusparse::cusparseSpGEMMDescr_t,\n    num_prods: *mut i64,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(spgemmDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &spgemmDescr,\n        \"cusparseSpGEMM_getNumProducts\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(num_prods), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &num_prods,\n        \"cusparseSpGEMM_getNumProducts\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpGEMM_estimateMemory(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    opA: cuda_types::cusparse::cusparseOperation_t,\n    opB: cuda_types::cusparse::cusparseOperation_t,\n    alpha: *const ::core::ffi::c_void,\n    matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    matB: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    beta: *const ::core::ffi::c_void,\n    matC: cuda_types::cusparse::cusparseSpMatDescr_t,\n    computeType: cuda_types::cusparse::cudaDataType,\n    alg: cuda_types::cusparse::cusparseSpGEMMAlg_t,\n    spgemmDescr: cuda_types::cusparse::cusparseSpGEMMDescr_t,\n    chunk_fraction: f32,\n    bufferSize3: *mut usize,\n    externalBuffer3: *mut ::core::ffi::c_void,\n    bufferSize2: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseSpGEMM_estimateMemory\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opA, \"cusparseSpGEMM_estimateMemory\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opB, \"cusparseSpGEMM_estimateMemory\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseSpGEMM_estimateMemory\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matA, \"cusparseSpGEMM_estimateMemory\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matB, \"cusparseSpGEMM_estimateMemory\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseSpGEMM_estimateMemory\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matC, \"cusparseSpGEMM_estimateMemory\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &computeType,\n        \"cusparseSpGEMM_estimateMemory\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alg, \"cusparseSpGEMM_estimateMemory\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(spgemmDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &spgemmDescr,\n        \"cusparseSpGEMM_estimateMemory\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(chunk_fraction), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &chunk_fraction,\n        \"cusparseSpGEMM_estimateMemory\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSize3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bufferSize3,\n        \"cusparseSpGEMM_estimateMemory\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(externalBuffer3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &externalBuffer3,\n        \"cusparseSpGEMM_estimateMemory\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSize2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bufferSize2,\n        \"cusparseSpGEMM_estimateMemory\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpGEMM_compute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    opA: cuda_types::cusparse::cusparseOperation_t,\n    opB: cuda_types::cusparse::cusparseOperation_t,\n    alpha: *const ::core::ffi::c_void,\n    matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    matB: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    beta: *const ::core::ffi::c_void,\n    matC: cuda_types::cusparse::cusparseSpMatDescr_t,\n    computeType: cuda_types::cusparse::cudaDataType,\n    alg: cuda_types::cusparse::cusparseSpGEMMAlg_t,\n    spgemmDescr: cuda_types::cusparse::cusparseSpGEMMDescr_t,\n    bufferSize2: *mut usize,\n    externalBuffer2: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSpGEMM_compute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opA, \"cusparseSpGEMM_compute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opB, \"cusparseSpGEMM_compute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseSpGEMM_compute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matA, \"cusparseSpGEMM_compute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matB, \"cusparseSpGEMM_compute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseSpGEMM_compute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matC, \"cusparseSpGEMM_compute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&computeType, \"cusparseSpGEMM_compute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alg, \"cusparseSpGEMM_compute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(spgemmDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spgemmDescr, \"cusparseSpGEMM_compute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSize2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bufferSize2, \"cusparseSpGEMM_compute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(externalBuffer2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &externalBuffer2,\n        \"cusparseSpGEMM_compute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpGEMM_copy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    opA: cuda_types::cusparse::cusparseOperation_t,\n    opB: cuda_types::cusparse::cusparseOperation_t,\n    alpha: *const ::core::ffi::c_void,\n    matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    matB: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    beta: *const ::core::ffi::c_void,\n    matC: cuda_types::cusparse::cusparseSpMatDescr_t,\n    computeType: cuda_types::cusparse::cudaDataType,\n    alg: cuda_types::cusparse::cusparseSpGEMMAlg_t,\n    spgemmDescr: cuda_types::cusparse::cusparseSpGEMMDescr_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSpGEMM_copy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opA, \"cusparseSpGEMM_copy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opB, \"cusparseSpGEMM_copy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseSpGEMM_copy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matA, \"cusparseSpGEMM_copy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matB, \"cusparseSpGEMM_copy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseSpGEMM_copy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matC, \"cusparseSpGEMM_copy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&computeType, \"cusparseSpGEMM_copy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alg, \"cusparseSpGEMM_copy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(spgemmDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spgemmDescr, \"cusparseSpGEMM_copy\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpGEMMreuse_workEstimation(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    opA: cuda_types::cusparse::cusparseOperation_t,\n    opB: cuda_types::cusparse::cusparseOperation_t,\n    matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    matB: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    matC: cuda_types::cusparse::cusparseSpMatDescr_t,\n    alg: cuda_types::cusparse::cusparseSpGEMMAlg_t,\n    spgemmDescr: cuda_types::cusparse::cusparseSpGEMMDescr_t,\n    bufferSize1: *mut usize,\n    externalBuffer1: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &handle,\n        \"cusparseSpGEMMreuse_workEstimation\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &opA,\n        \"cusparseSpGEMMreuse_workEstimation\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &opB,\n        \"cusparseSpGEMMreuse_workEstimation\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &matA,\n        \"cusparseSpGEMMreuse_workEstimation\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &matB,\n        \"cusparseSpGEMMreuse_workEstimation\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &matC,\n        \"cusparseSpGEMMreuse_workEstimation\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &alg,\n        \"cusparseSpGEMMreuse_workEstimation\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(spgemmDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &spgemmDescr,\n        \"cusparseSpGEMMreuse_workEstimation\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSize1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bufferSize1,\n        \"cusparseSpGEMMreuse_workEstimation\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(externalBuffer1), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &externalBuffer1,\n        \"cusparseSpGEMMreuse_workEstimation\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpGEMMreuse_nnz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    opA: cuda_types::cusparse::cusparseOperation_t,\n    opB: cuda_types::cusparse::cusparseOperation_t,\n    matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    matB: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    matC: cuda_types::cusparse::cusparseSpMatDescr_t,\n    alg: cuda_types::cusparse::cusparseSpGEMMAlg_t,\n    spgemmDescr: cuda_types::cusparse::cusparseSpGEMMDescr_t,\n    bufferSize2: *mut usize,\n    externalBuffer2: *mut ::core::ffi::c_void,\n    bufferSize3: *mut usize,\n    externalBuffer3: *mut ::core::ffi::c_void,\n    bufferSize4: *mut usize,\n    externalBuffer4: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSpGEMMreuse_nnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opA, \"cusparseSpGEMMreuse_nnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opB, \"cusparseSpGEMMreuse_nnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matA, \"cusparseSpGEMMreuse_nnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matB, \"cusparseSpGEMMreuse_nnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matC, \"cusparseSpGEMMreuse_nnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alg, \"cusparseSpGEMMreuse_nnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(spgemmDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&spgemmDescr, \"cusparseSpGEMMreuse_nnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSize2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bufferSize2, \"cusparseSpGEMMreuse_nnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(externalBuffer2), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &externalBuffer2,\n        \"cusparseSpGEMMreuse_nnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSize3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bufferSize3, \"cusparseSpGEMMreuse_nnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(externalBuffer3), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &externalBuffer3,\n        \"cusparseSpGEMMreuse_nnz\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSize4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bufferSize4, \"cusparseSpGEMMreuse_nnz\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(externalBuffer4), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &externalBuffer4,\n        \"cusparseSpGEMMreuse_nnz\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpGEMMreuse_copy(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    opA: cuda_types::cusparse::cusparseOperation_t,\n    opB: cuda_types::cusparse::cusparseOperation_t,\n    matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    matB: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    matC: cuda_types::cusparse::cusparseSpMatDescr_t,\n    alg: cuda_types::cusparse::cusparseSpGEMMAlg_t,\n    spgemmDescr: cuda_types::cusparse::cusparseSpGEMMDescr_t,\n    bufferSize5: *mut usize,\n    externalBuffer5: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSpGEMMreuse_copy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opA, \"cusparseSpGEMMreuse_copy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opB, \"cusparseSpGEMMreuse_copy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matA, \"cusparseSpGEMMreuse_copy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matB, \"cusparseSpGEMMreuse_copy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matC, \"cusparseSpGEMMreuse_copy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alg, \"cusparseSpGEMMreuse_copy\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(spgemmDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &spgemmDescr,\n        \"cusparseSpGEMMreuse_copy\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSize5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &bufferSize5,\n        \"cusparseSpGEMMreuse_copy\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(externalBuffer5), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &externalBuffer5,\n        \"cusparseSpGEMMreuse_copy\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpGEMMreuse_compute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    opA: cuda_types::cusparse::cusparseOperation_t,\n    opB: cuda_types::cusparse::cusparseOperation_t,\n    alpha: *const ::core::ffi::c_void,\n    matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    matB: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    beta: *const ::core::ffi::c_void,\n    matC: cuda_types::cusparse::cusparseSpMatDescr_t,\n    computeType: cuda_types::cusparse::cudaDataType,\n    alg: cuda_types::cusparse::cusparseSpGEMMAlg_t,\n    spgemmDescr: cuda_types::cusparse::cusparseSpGEMMDescr_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSpGEMMreuse_compute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opA, \"cusparseSpGEMMreuse_compute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opB, \"cusparseSpGEMMreuse_compute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseSpGEMMreuse_compute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matA, \"cusparseSpGEMMreuse_compute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matB, \"cusparseSpGEMMreuse_compute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseSpGEMMreuse_compute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matC, \"cusparseSpGEMMreuse_compute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &computeType,\n        \"cusparseSpGEMMreuse_compute\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alg, \"cusparseSpGEMMreuse_compute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(spgemmDescr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &spgemmDescr,\n        \"cusparseSpGEMMreuse_compute\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseSDDMMAlg_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cusparse::cusparseSDDMMAlg_t::CUSPARSE_SDDMM_ALG_DEFAULT => {\n                writer.write_all(stringify!(CUSPARSE_SDDMM_ALG_DEFAULT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cusparseSDDMM_bufferSize(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    opA: cuda_types::cusparse::cusparseOperation_t,\n    opB: cuda_types::cusparse::cusparseOperation_t,\n    alpha: *const ::core::ffi::c_void,\n    matA: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n    matB: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n    beta: *const ::core::ffi::c_void,\n    matC: cuda_types::cusparse::cusparseSpMatDescr_t,\n    computeType: cuda_types::cusparse::cudaDataType,\n    alg: cuda_types::cusparse::cusparseSDDMMAlg_t,\n    bufferSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSDDMM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opA, \"cusparseSDDMM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opB, \"cusparseSDDMM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseSDDMM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matA, \"cusparseSDDMM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matB, \"cusparseSDDMM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseSDDMM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matC, \"cusparseSDDMM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &computeType,\n        \"cusparseSDDMM_bufferSize\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alg, \"cusparseSDDMM_bufferSize\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(bufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&bufferSize, \"cusparseSDDMM_bufferSize\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSDDMM_preprocess(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    opA: cuda_types::cusparse::cusparseOperation_t,\n    opB: cuda_types::cusparse::cusparseOperation_t,\n    alpha: *const ::core::ffi::c_void,\n    matA: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n    matB: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n    beta: *const ::core::ffi::c_void,\n    matC: cuda_types::cusparse::cusparseSpMatDescr_t,\n    computeType: cuda_types::cusparse::cudaDataType,\n    alg: cuda_types::cusparse::cusparseSDDMMAlg_t,\n    externalBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSDDMM_preprocess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opA, \"cusparseSDDMM_preprocess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opB, \"cusparseSDDMM_preprocess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseSDDMM_preprocess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matA, \"cusparseSDDMM_preprocess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matB, \"cusparseSDDMM_preprocess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseSDDMM_preprocess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matC, \"cusparseSDDMM_preprocess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &computeType,\n        \"cusparseSDDMM_preprocess\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alg, \"cusparseSDDMM_preprocess\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(externalBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &externalBuffer,\n        \"cusparseSDDMM_preprocess\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSDDMM(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    opA: cuda_types::cusparse::cusparseOperation_t,\n    opB: cuda_types::cusparse::cusparseOperation_t,\n    alpha: *const ::core::ffi::c_void,\n    matA: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n    matB: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n    beta: *const ::core::ffi::c_void,\n    matC: cuda_types::cusparse::cusparseSpMatDescr_t,\n    computeType: cuda_types::cusparse::cudaDataType,\n    alg: cuda_types::cusparse::cusparseSDDMMAlg_t,\n    externalBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSDDMM\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opA, \"cusparseSDDMM\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opB, \"cusparseSDDMM\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alpha), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alpha, \"cusparseSDDMM\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matA, \"cusparseSDDMM\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matB, \"cusparseSDDMM\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(beta), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&beta, \"cusparseSDDMM\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matC, \"cusparseSDDMM\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&computeType, \"cusparseSDDMM\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alg, \"cusparseSDDMM\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(externalBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&externalBuffer, \"cusparseSDDMM\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseSpMMOpPlan_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseSpMMOpAlg_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            &cuda_types::cusparse::cusparseSpMMOpAlg_t::CUSPARSE_SPMM_OP_ALG_DEFAULT => {\n                writer.write_all(stringify!(CUSPARSE_SPMM_OP_ALG_DEFAULT).as_bytes())\n            }\n            _ => write!(writer, \"{}\", self.0),\n        }\n    }\n}\npub fn write_cusparseSpMMOp_createPlan(\n    writer: &mut (impl std::io::Write + ?Sized),\n    handle: cuda_types::cusparse::cusparseHandle_t,\n    plan: *mut cuda_types::cusparse::cusparseSpMMOpPlan_t,\n    opA: cuda_types::cusparse::cusparseOperation_t,\n    opB: cuda_types::cusparse::cusparseOperation_t,\n    matA: cuda_types::cusparse::cusparseConstSpMatDescr_t,\n    matB: cuda_types::cusparse::cusparseConstDnMatDescr_t,\n    matC: cuda_types::cusparse::cusparseDnMatDescr_t,\n    computeType: cuda_types::cusparse::cudaDataType,\n    alg: cuda_types::cusparse::cusparseSpMMOpAlg_t,\n    addOperationNvvmBuffer: *const ::core::ffi::c_void,\n    addOperationBufferSize: usize,\n    mulOperationNvvmBuffer: *const ::core::ffi::c_void,\n    mulOperationBufferSize: usize,\n    epilogueNvvmBuffer: *const ::core::ffi::c_void,\n    epilogueBufferSize: usize,\n    SpMMWorkspaceSize: *mut usize,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(handle), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&handle, \"cusparseSpMMOp_createPlan\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cusparseSpMMOp_createPlan\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opA, \"cusparseSpMMOp_createPlan\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(opB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&opB, \"cusparseSpMMOp_createPlan\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matA), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matA, \"cusparseSpMMOp_createPlan\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matB), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matB, \"cusparseSpMMOp_createPlan\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(matC), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&matC, \"cusparseSpMMOp_createPlan\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(computeType), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &computeType,\n        \"cusparseSpMMOp_createPlan\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(alg), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&alg, \"cusparseSpMMOp_createPlan\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(addOperationNvvmBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &addOperationNvvmBuffer,\n        \"cusparseSpMMOp_createPlan\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(addOperationBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &addOperationBufferSize,\n        \"cusparseSpMMOp_createPlan\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mulOperationNvvmBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mulOperationNvvmBuffer,\n        \"cusparseSpMMOp_createPlan\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(mulOperationBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &mulOperationBufferSize,\n        \"cusparseSpMMOp_createPlan\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(epilogueNvvmBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &epilogueNvvmBuffer,\n        \"cusparseSpMMOp_createPlan\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(epilogueBufferSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &epilogueBufferSize,\n        \"cusparseSpMMOp_createPlan\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(SpMMWorkspaceSize), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &SpMMWorkspaceSize,\n        \"cusparseSpMMOp_createPlan\",\n        arg_idx,\n        writer,\n    )?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpMMOp(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cusparse::cusparseSpMMOpPlan_t,\n    externalBuffer: *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cusparseSpMMOp\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(externalBuffer), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&externalBuffer, \"cusparseSpMMOp\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\npub fn write_cusparseSpMMOp_destroyPlan(\n    writer: &mut (impl std::io::Write + ?Sized),\n    plan: cuda_types::cusparse::cusparseSpMMOpPlan_t,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(plan), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&plan, \"cusparseSpMMOp_destroyPlan\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\nimpl crate::CudaDisplay for cuda_types::cusparse::cusparseStatus_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match self {\n            Ok(()) => writer.write_all(b\"CUSPARSE_STATUS_SUCCESS\"),\n            Err(err) => {\n                match err.0.get() {\n                    1 => writer.write_all(\"CUSPARSE_STATUS_NOT_INITIALIZED\".as_bytes()),\n                    2 => writer.write_all(\"CUSPARSE_STATUS_ALLOC_FAILED\".as_bytes()),\n                    3 => writer.write_all(\"CUSPARSE_STATUS_INVALID_VALUE\".as_bytes()),\n                    4 => writer.write_all(\"CUSPARSE_STATUS_ARCH_MISMATCH\".as_bytes()),\n                    5 => writer.write_all(\"CUSPARSE_STATUS_MAPPING_ERROR\".as_bytes()),\n                    6 => writer.write_all(\"CUSPARSE_STATUS_EXECUTION_FAILED\".as_bytes()),\n                    7 => writer.write_all(\"CUSPARSE_STATUS_INTERNAL_ERROR\".as_bytes()),\n                    8 => {\n                        writer\n                            .write_all(\n                                \"CUSPARSE_STATUS_MATRIX_TYPE_NOT_SUPPORTED\".as_bytes(),\n                            )\n                    }\n                    9 => writer.write_all(\"CUSPARSE_STATUS_ZERO_PIVOT\".as_bytes()),\n                    10 => writer.write_all(\"CUSPARSE_STATUS_NOT_SUPPORTED\".as_bytes()),\n                    11 => {\n                        writer\n                            .write_all(\n                                \"CUSPARSE_STATUS_INSUFFICIENT_RESOURCES\".as_bytes(),\n                            )\n                    }\n                    err => write!(writer, \"{}\", err),\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "format/src/lib.rs",
    "content": "use cuda_types::cuda::*;\nuse std::{\n    any::TypeId,\n    ffi::{c_ulonglong, c_void, CStr},\n    fmt::LowerHex,\n    mem, ptr, slice,\n};\n\npub trait CudaDisplay {\n    fn write(\n        &self,\n        fn_name: &'static str,\n        index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()>;\n}\n\nimpl CudaDisplay for () {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(writer, \"()\")\n    }\n}\n\nimpl CudaDisplay for CUuuid {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        let guid = self.bytes;\n        let uuid = uuid::Uuid::from_bytes(guid);\n        let braced = uuid.as_braced();\n        write!(writer, \"{braced:#X}\")\n    }\n}\n\nimpl CudaDisplay for CUdeviceptr_v1 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(writer, \"{:p}\", self.0 as usize as *const ())\n    }\n}\n\nimpl CudaDisplay for bool {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(writer, \"{}\", *self)\n    }\n}\n\nimpl CudaDisplay for u8 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(writer, \"{}\", *self)\n    }\n}\n\nimpl CudaDisplay for u16 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(writer, \"{}\", *self)\n    }\n}\n\nimpl CudaDisplay for i32 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(writer, \"{}\", *self)\n    }\n}\n\nimpl CudaDisplay for u32 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(writer, \"{}\", *self)\n    }\n}\n\nimpl CudaDisplay for i64 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(writer, \"{}\", *self)\n    }\n}\n\nimpl CudaDisplay for u64 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(writer, \"{}\", *self)\n    }\n}\n\nimpl CudaDisplay for usize {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(writer, \"{}\", *self)\n    }\n}\n\nimpl CudaDisplay for f32 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(writer, \"{}\", *self)\n    }\n}\n\nimpl CudaDisplay for f64 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(writer, \"{}\", *self)\n    }\n}\n\n// user by Dark API\nimpl CudaDisplay\n    for Option<\n        extern \"system\" fn(\n            cuda_types::cuda::CUcontext,\n            *mut std::ffi::c_void,\n            *mut std::ffi::c_void,\n        ),\n    >\n{\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if let Some(fn_ptr) = self {\n            write!(writer, \"{:p}\", *fn_ptr)\n        } else {\n            writer.write_all(b\"NULL\")\n        }\n    }\n}\n\nimpl CudaDisplay for Option<unsafe extern \"C\" fn(*const i8)> {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if let Some(fn_ptr) = self {\n            write!(writer, \"{:p}\", *fn_ptr)\n        } else {\n            writer.write_all(b\"NULL\")\n        }\n    }\n}\n\nimpl CudaDisplay for Option<unsafe extern \"C\" fn(i32, *const i8, *const i8)> {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if let Some(fn_ptr) = self {\n            write!(writer, \"{:p}\", *fn_ptr)\n        } else {\n            writer.write_all(b\"NULL\")\n        }\n    }\n}\n\npub fn write_handle<T: LowerHex>(\n    this: &[T; 64],\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    writer.write_all(b\"0x\")?;\n    for i in (0..64).rev() {\n        write!(writer, \"{:02x}\", this[i])?;\n    }\n    Ok(())\n}\n\nimpl CudaDisplay for CUipcMemHandle {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write_handle(&self.reserved, writer)\n    }\n}\n\nimpl CudaDisplay for CUipcEventHandle {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write_handle(&self.reserved, writer)\n    }\n}\n\nimpl CudaDisplay for CUmemPoolPtrExportData_v1 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write_handle(&self.reserved, writer)\n    }\n}\n\nimpl CudaDisplay for *mut c_void {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(writer, \"{:p}\", *self)\n    }\n}\n\nimpl CudaDisplay for *const c_void {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write!(writer, \"{:p}\", *self)\n    }\n}\n\nimpl CudaDisplay for *const i8 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(\n                writer,\n                \"\\\"{}\\\"\",\n                unsafe { CStr::from_ptr(*self as _) }.to_string_lossy()\n            )\n        }\n    }\n}\n\nimpl CudaDisplay for *mut cuda_types::FILE {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if self.is_null() {\n            writer.write_all(b\"NULL\")\n        } else {\n            write!(writer, \"{:p}\", *self)\n        }\n    }\n}\n\n#[repr(C)]\n#[derive(Copy, Clone)]\nstruct Luid {\n    low_part: u32,\n    high_part: u32,\n}\n\nimpl CudaDisplay for *mut i8 {\n    fn write(\n        &self,\n        fn_name: &'static str,\n        index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        if fn_name == \"cuDeviceGetLuid\" && index == 0 {\n            let luid_ptr = *self as *mut Luid;\n            let luid = unsafe { *luid_ptr };\n            write!(writer, \"{{{:08X}-{:08X}}}\", luid.low_part, luid.high_part)\n        } else {\n            write!(\n                writer,\n                \"\\\"{}\\\"\",\n                unsafe { CStr::from_ptr(*self as _) }.to_string_lossy()\n            )\n        }\n    }\n}\n\nimpl CudaDisplay for CUstreamBatchMemOpParams {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        unsafe {\n            match self.operation {\n                // The below is not a typo, `WAIT_VALUE` and `WRITE_VALUE` are\n                // distinct operations with nominally distinct union variants, but\n                // in reality they are structurally different, so we take a little\n                // shortcut here\n                CUstreamBatchMemOpType::CU_STREAM_MEM_OP_WAIT_VALUE_32\n                | CUstreamBatchMemOpType::CU_STREAM_MEM_OP_WRITE_VALUE_32 => {\n                    write_wait_value(&self.waitValue, writer, false)\n                }\n                CUstreamBatchMemOpType::CU_STREAM_MEM_OP_WAIT_VALUE_64\n                | CUstreamBatchMemOpType::CU_STREAM_MEM_OP_WRITE_VALUE_64 => {\n                    write_wait_value(&self.waitValue, writer, true)\n                }\n                CUstreamBatchMemOpType::CU_STREAM_MEM_OP_FLUSH_REMOTE_WRITES => {\n                    CudaDisplay::write(&self.flushRemoteWrites, \"\", 0, writer)\n                }\n                _ => {\n                    writer.write_all(b\"{ operation: \")?;\n                    CudaDisplay::write(&self.operation, \"\", 0, writer)?;\n                    writer.write_all(b\", ... }\")\n                }\n            }\n        }\n    }\n}\n\nimpl CudaDisplay for CUcheckpointUnlockArgs_st {\n    fn write(\n        &self,\n        fn_name: &'static str,\n        index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        CudaDisplay::write(&self.reserved, fn_name, index, writer)\n    }\n}\n\nimpl CudaDisplay for CUcheckpointCheckpointArgs_st {\n    fn write(\n        &self,\n        fn_name: &'static str,\n        index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        CudaDisplay::write(&self.reserved, fn_name, index, writer)\n    }\n}\n\nimpl CudaDisplay for CUmemcpy3DOperand_st {\n    fn write(\n        &self,\n        fn_name: &'static str,\n        index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(b\"{ type_: \")?;\n        CudaDisplay::write(&self.type_, \"\", 0, writer)?;\n        writer.write_all(b\", op: \")?;\n        match self.type_ {\n            CUmemcpy3DOperandType::CU_MEMCPY_OPERAND_TYPE_ARRAY => {\n                CudaDisplay::write(unsafe { &self.op.array }, fn_name, index, writer)?;\n            }\n            CUmemcpy3DOperandType::CU_MEMCPY_OPERAND_TYPE_POINTER => {\n                CudaDisplay::write(unsafe { &self.op.ptr }, fn_name, index, writer)?;\n            }\n            _ => {\n                const CU_MEMCPY_3D_OP_SIZE: usize =\n                    mem::size_of::<CUmemcpy3DOperand_st__bindgen_ty_1>();\n                CudaDisplay::write(\n                    &unsafe { mem::transmute::<_, [u8; CU_MEMCPY_3D_OP_SIZE]>(self.op) },\n                    fn_name,\n                    index,\n                    writer,\n                )?;\n            }\n        }\n        writer.write_all(b\" }\")\n    }\n}\n\npub fn write_wait_value(\n    this: &CUstreamBatchMemOpParams_union_CUstreamMemOpWaitValueParams_st,\n    writer: &mut (impl std::io::Write + ?Sized),\n    is_64_bit: bool,\n) -> std::io::Result<()> {\n    writer.write_all(b\"{ operation: \")?;\n    CudaDisplay::write(&this.operation, \"\", 0, writer)?;\n    writer.write_all(b\", address: \")?;\n    CudaDisplay::write(&this.address, \"\", 0, writer)?;\n    write_wait_value_32_or_64(&this.__bindgen_anon_1, writer, is_64_bit)?;\n    writer.write_all(b\", flags: \")?;\n    CudaDisplay::write(&this.flags, \"\", 0, writer)?;\n    writer.write_all(b\", alias: \")?;\n    CudaDisplay::write(&this.alias, \"\", 0, writer)?;\n    writer.write_all(b\" }\")\n}\n\npub fn write_wait_value_32_or_64(\n    this: &CUstreamBatchMemOpParams_union_CUstreamMemOpWaitValueParams_st__bindgen_ty_1,\n    writer: &mut (impl std::io::Write + ?Sized),\n    is_64_bit: bool,\n) -> std::io::Result<()> {\n    if is_64_bit {\n        writer.write_all(b\", value64: \")?;\n        CudaDisplay::write(unsafe { &this.value64 }, \"\", 0, writer)\n    } else {\n        writer.write_all(b\", value: \")?;\n        CudaDisplay::write(unsafe { &this.value }, \"\", 0, writer)\n    }\n}\n\nimpl CudaDisplay for CUDA_RESOURCE_DESC_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(b\"{ resType: \")?;\n        CudaDisplay::write(&self.resType, \"\", 0, writer)?;\n        match self.resType {\n            CUresourcetype::CU_RESOURCE_TYPE_ARRAY => {\n                writer.write_all(b\", res: \")?;\n                CudaDisplay::write(unsafe { &self.res.array }, \"\", 0, writer)?;\n                writer.write_all(b\", flags: \")?;\n                CudaDisplay::write(&self.flags, \"\", 0, writer)?;\n                writer.write_all(b\" }\")\n            }\n            CUresourcetype::CU_RESOURCE_TYPE_MIPMAPPED_ARRAY => {\n                writer.write_all(b\", res: \")?;\n                CudaDisplay::write(unsafe { &self.res.mipmap }, \"\", 0, writer)?;\n                writer.write_all(b\", flags: \")?;\n                CudaDisplay::write(&self.flags, \"\", 0, writer)?;\n                writer.write_all(b\" }\")\n            }\n            CUresourcetype::CU_RESOURCE_TYPE_LINEAR => {\n                writer.write_all(b\", res: \")?;\n                CudaDisplay::write(unsafe { &self.res.linear }, \"\", 0, writer)?;\n                writer.write_all(b\", flags: \")?;\n                CudaDisplay::write(&self.flags, \"\", 0, writer)?;\n                writer.write_all(b\" }\")\n            }\n            CUresourcetype::CU_RESOURCE_TYPE_PITCH2D => {\n                writer.write_all(b\", res: \")?;\n                CudaDisplay::write(unsafe { &self.res.pitch2D }, \"\", 0, writer)?;\n                writer.write_all(b\", flags: \")?;\n                CudaDisplay::write(&self.flags, \"\", 0, writer)?;\n                writer.write_all(b\" }\")\n            }\n            _ => {\n                writer.write_all(b\", flags: \")?;\n                CudaDisplay::write(&self.flags, \"\", 0, writer)?;\n                writer.write_all(b\", ... }\")\n            }\n        }\n    }\n}\n\nimpl crate::CudaDisplay for cuda_types::cuda::CUlaunchConfig_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(gridDimX), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.gridDimX, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(gridDimY), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.gridDimY, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(gridDimZ), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.gridDimZ, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(blockDimX), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.blockDimX, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(blockDimY), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.blockDimY, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(blockDimZ), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.blockDimZ, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sharedMemBytes), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.sharedMemBytes, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(hStream), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.hStream, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(numAttrs), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.numAttrs, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(attrs), \": \").as_bytes())?;\n        writer.write_all(b\"[\")?;\n        for i in 0..self.numAttrs {\n            if i != 0 {\n                writer.write_all(b\", \")?;\n            }\n            crate::CudaDisplay::write(&unsafe { *self.attrs.add(i as usize) }, \"\", 0, writer)?;\n        }\n        writer.write_all(b\"]\")?;\n        writer.write_all(b\" }\")\n    }\n}\n\nimpl CudaDisplay for CUDA_EXTERNAL_MEMORY_HANDLE_DESC_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(b\"{ type: \")?;\n        CudaDisplay::write(&self.type_, \"\", 0, writer)?;\n        match self.type_ {\n            CUexternalMemoryHandleType::CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD => {\n                writer.write_all(b\", handle: \")?;\n                CudaDisplay::write(unsafe { &self.handle.fd }, \"\", 0, writer)?;\n            }\n            CUexternalMemoryHandleType::CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32\n            | CUexternalMemoryHandleType::CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP\n            | CUexternalMemoryHandleType::CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE\n            | CUexternalMemoryHandleType::CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE => {\n                write_win32_handle(unsafe { self.handle.win32 }, writer)?;\n            }\n            CUexternalMemoryHandleType::CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT\n            | CUexternalMemoryHandleType::CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE_KMT => {\n                writer.write_all(b\", handle: \")?;\n                CudaDisplay::write(unsafe { &self.handle.win32.handle }, \"\", 0, writer)?;\n            }\n            CUexternalMemoryHandleType::CU_EXTERNAL_MEMORY_HANDLE_TYPE_NVSCIBUF => {\n                writer.write_all(b\", handle: \")?;\n                CudaDisplay::write(unsafe { &self.handle.nvSciBufObject }, \"\", 0, writer)?;\n            }\n            _ => {\n                writer.write_all(b\", size: \")?;\n                CudaDisplay::write(&self.size, \"\", 0, writer)?;\n                writer.write_all(b\", flags: \")?;\n                CudaDisplay::write(&self.flags, \"\", 0, writer)?;\n                return writer.write_all(b\", ... }\");\n            }\n        }\n        writer.write_all(b\", size: \")?;\n        CudaDisplay::write(&self.size, \"\", 0, writer)?;\n        writer.write_all(b\", flags: \")?;\n        CudaDisplay::write(&self.flags, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\n\npub fn write_win32_handle(\n    win32: CUDA_EXTERNAL_MEMORY_HANDLE_DESC_st__bindgen_ty_1__bindgen_ty_1,\n    writer: &mut (impl std::io::Write + ?Sized),\n) -> std::io::Result<()> {\n    if win32.handle != ptr::null_mut() {\n        writer.write_all(b\", handle: \")?;\n        CudaDisplay::write(&win32.handle, \"\", 0, writer)?;\n    }\n    if win32.name != ptr::null_mut() {\n        let name_ptr = win32.name as *const u16;\n        let mut strlen = 0usize;\n        while unsafe { *name_ptr.add(strlen) } != 0 {\n            strlen += 1;\n        }\n        let text = String::from_utf16_lossy(unsafe { slice::from_raw_parts(name_ptr, strlen) });\n        write!(writer, \", name: \\\"{}\\\"\", text)?;\n    }\n    Ok(())\n}\n\nimpl CudaDisplay for CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(b\"{ type: \")?;\n        CudaDisplay::write(&self.type_, \"\", 0, writer)?;\n        match self.type_ {\n            CUexternalSemaphoreHandleType::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD => {\n                writer.write_all(b\", handle: \")?;\n                CudaDisplay::write(unsafe { &self.handle.fd }, \"\", 0,writer)?;\n            }\n            CUexternalSemaphoreHandleType::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32\n            | CUexternalSemaphoreHandleType::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE\n            | CUexternalSemaphoreHandleType::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE\n            | CUexternalSemaphoreHandleType::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX\n            | CUexternalSemaphoreHandleType::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_KEYED_MUTEX_KMT => {\n                write_win32_handle(unsafe { mem::transmute(self.handle.win32) }, writer)?;\n            }\n            CUexternalSemaphoreHandleType::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT => {\n                writer.write_all(b\", handle: \")?;\n                CudaDisplay::write(unsafe { &self.handle.win32.handle }, \"\", 0,writer)?;\n            }\n            CUexternalSemaphoreHandleType::CU_EXTERNAL_SEMAPHORE_HANDLE_TYPE_NVSCISYNC => {\n                writer.write_all(b\", handle: \")?;\n                CudaDisplay::write(unsafe { &self.handle.nvSciSyncObj }, \"\", 0,writer)?;\n            }\n            _ => {\n                writer.write_all(b\", flags: \")?;\n                CudaDisplay::write(&self.flags, \"\", 0,writer)?;\n                return writer.write_all(b\", ... }\")\n            }\n        }\n        writer.write_all(b\", flags: \")?;\n        CudaDisplay::write(&self.flags, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\n\nimpl CudaDisplay for CUDA_EXTERNAL_SEMAPHORE_SIGNAL_PARAMS_st__bindgen_ty_1__bindgen_ty_2 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(b\"{ fence: \")?;\n        CudaDisplay::write(&unsafe { self.fence }, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\n\nimpl CudaDisplay for CUDA_EXTERNAL_SEMAPHORE_WAIT_PARAMS_st__bindgen_ty_1__bindgen_ty_2 {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(b\"{ fence: \")?;\n        CudaDisplay::write(&unsafe { self.fence }, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\n\nimpl CudaDisplay for CUgraphNodeParams_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        _writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        todo!()\n    }\n}\n\nimpl CudaDisplay for CUeglFrame_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        _writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        todo!()\n    }\n}\n\nimpl CudaDisplay for CUdevResource_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        _writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        todo!()\n    }\n}\n\nimpl CudaDisplay for CUlaunchAttribute_st {\n    fn write(\n        &self,\n        fn_name: &'static str,\n        index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        write_launch_attribute(writer, fn_name, index, self.id, self.value)\n    }\n}\n\nimpl<T: CudaDisplay + 'static> CudaDisplay for *mut T {\n    fn write(\n        &self,\n        fn_name: &'static str,\n        index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        CudaDisplay::write(&self.cast_const(), fn_name, index, writer)\n    }\n}\n\nimpl<T: CudaDisplay + 'static> CudaDisplay for *const T {\n    fn write(\n        &self,\n        fn_name: &'static str,\n        index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        match unsafe { self.as_ref() } {\n            None => writer.write_all(b\"NULL\"),\n            Some(this) => {\n                if fn_name.len() > 2\n                && fn_name.starts_with(\"cu\")\n                && fn_name.as_bytes()[2].is_ascii_lowercase()\n                && (TypeId::of::<T>() == TypeId::of::<f32>()\n                    || TypeId::of::<T>() == TypeId::of::<f64>())\n                {\n                    CudaDisplay::write(&self.cast::<c_void>(), fn_name, index, writer)\n                } else {\n                    this.write(fn_name, index, writer)\n                }\n            }\n        }\n    }\n}\n\nimpl<T: CudaDisplay, const N: usize> CudaDisplay for [T; N] {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(b\"[\")?;\n        for i in 0..N {\n            CudaDisplay::write(&self[i], \"\", 0, writer)?;\n            if i != N - 1 {\n                writer.write_all(b\", \")?;\n            }\n        }\n        writer.write_all(b\"]\")\n    }\n}\n\nimpl<const N: usize> CudaDisplay for [i8; N] {\n    fn write(\n        &self,\n        fn_name: &'static str,\n        index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        let slice = unsafe { std::slice::from_raw_parts(self.as_ptr().cast::<u8>(), N) };\n        match CStr::from_bytes_until_nul(slice) {\n            Ok(cstr) => writer.write_all(cstr.to_bytes()),\n            Err(_) => CudaDisplay::write(\n                slice,\n                fn_name,\n                index,\n                writer,\n            ),\n        }\n    }\n}\n\nimpl<T: CudaDisplay> CudaDisplay for [T] {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(b\"[\")?;\n        for i in 0..self.len() {\n            CudaDisplay::write(&self[i], \"\", 0, writer)?;\n            if i != self.len() - 1 {\n                writer.write_all(b\", \")?;\n            }\n        }\n        writer.write_all(b\"]\")\n    }\n}\n\nimpl CudaDisplay for CUarrayMapInfo_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        _writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        todo!()\n    }\n}\n\nimpl CudaDisplay for CUexecAffinityParam_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        _writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        todo!()\n    }\n}\n\nimpl CudaDisplay for *mut cuda_types::cudnn9::cudnnRuntimeTag_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        _writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        todo!()\n    }\n}\n\n#[allow(non_snake_case)]\npub fn write_cuGraphKernelNodeGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: CUgraphNode,\n    attr: CUkernelNodeAttrID,\n    value_out: *mut CUkernelNodeAttrValue,\n) -> std::io::Result<()> {\n    writer.write_all(b\"(hNode: \")?;\n    CudaDisplay::write(&hNode, \"cuGraphKernelNodeGetAttribute\", 0, writer)?;\n    writer.write_all(b\", attr: \")?;\n    CudaDisplay::write(&attr, \"cuGraphKernelNodeGetAttribute\", 1, writer)?;\n    writer.write_all(b\", value_out: \")?;\n    write_launch_attribute(writer, \"cuGraphKernelNodeGetAttribute\", 2, attr, unsafe {\n        *value_out\n    })?;\n    writer.write_all(b\") \")\n}\n\n#[allow(non_snake_case)]\npub fn write_cuGraphKernelNodeSetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hNode: CUgraphNode,\n    attr: CUkernelNodeAttrID,\n    value_out: *const CUkernelNodeAttrValue,\n) -> std::io::Result<()> {\n    write_cuGraphKernelNodeGetAttribute(writer, hNode, attr, value_out as *mut _)\n}\n\n#[allow(non_snake_case)]\npub fn write_cuPointerGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    data: *mut ::core::ffi::c_void,\n    attribute: cuda_types::cuda::CUpointer_attribute,\n    ptr: cuda_types::cuda::CUdeviceptr,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(data), \": \").as_bytes())?;\n    write_attribute(writer, attribute, data)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attribute), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&attribute, \"cuPointerGetAttribute\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ptr, \"cuPointerGetAttribute\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\n\n#[allow(non_snake_case)]\npub fn write_cuPointerGetAttributes(\n    writer: &mut (impl std::io::Write + ?Sized),\n    numAttributes: ::core::ffi::c_uint,\n    attributes: *mut cuda_types::cuda::CUpointer_attribute,\n    data: *mut *mut ::core::ffi::c_void,\n    ptr: cuda_types::cuda::CUdeviceptr,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(numAttributes), \": \").as_bytes())?;\n    crate::CudaDisplay::write(\n        &numAttributes,\n        \"cuPointerGetAttributes\",\n        arg_idx,\n        writer,\n    )?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(attributes), \": \").as_bytes())?;\n    let attributes = unsafe { std::slice::from_raw_parts(attributes, numAttributes as usize) };\n    crate::CudaDisplay::write(attributes, \"cuPointerGetAttributes\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(data), \": \").as_bytes())?;\n    let data = unsafe { std::slice::from_raw_parts(data, numAttributes as usize) };\n    writer.write_all(b\"[\")?;\n    for (i, data_ptr) in data.iter().copied().enumerate() {\n        if i != 0 {\n            writer.write_all(b\", \")?;\n        }\n        write_attribute(writer, attributes[i], data_ptr)?;\n    }\n    writer.write_all(b\"]\")?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(ptr), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&ptr, \"cuPointerGetAttributes\", arg_idx, writer)?;\n    writer.write_all(b\")\")\n}\n\nfn write_attribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    attribute: cuda_types::cuda::CUpointer_attribute,\n    data:  *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    match attribute {\n        cuda_types::cuda::CUpointer_attribute::CU_POINTER_ATTRIBUTE_CONTEXT => {\n            CudaDisplay::write(unsafe { &*(data as *const cuda_types::cuda::CUcontext) }, \"\", 0, writer)\n        }\n        cuda_types::cuda::CUpointer_attribute::CU_POINTER_ATTRIBUTE_MEMORY_TYPE => {\n            CudaDisplay::write(unsafe { &*(data as *const cuda_types::cuda::CUmemorytype) }, \"\", 0, writer)\n        }\n        cuda_types::cuda::CUpointer_attribute::CU_POINTER_ATTRIBUTE_DEVICE_POINTER => {\n            CudaDisplay::write(unsafe { &*(data as *const cuda_types::cuda::CUdeviceptr) }, \"\", 0, writer)\n        }\n        cuda_types::cuda::CUpointer_attribute::CU_POINTER_ATTRIBUTE_HOST_POINTER => {\n            CudaDisplay::write(unsafe { &*(data as *const *mut ::core::ffi::c_void) }, \"\", 0, writer)\n        }\n        cuda_types::cuda::CUpointer_attribute::CU_POINTER_ATTRIBUTE_P2P_TOKENS => {\n            CudaDisplay::write(unsafe { &*(data as *const cuda_types::cuda::CUDA_POINTER_ATTRIBUTE_P2P_TOKENS) }, \"\", 0, writer)\n        }\n        cuda_types::cuda::CUpointer_attribute::CU_POINTER_ATTRIBUTE_SYNC_MEMOPS => {\n            CudaDisplay::write(unsafe { &*(data as *const bool) }, \"\", 0, writer)\n        }\n        cuda_types::cuda::CUpointer_attribute::CU_POINTER_ATTRIBUTE_BUFFER_ID => {\n            CudaDisplay::write(unsafe { &*(data as *const c_ulonglong) }, \"\", 0, writer)\n        }\n        cuda_types::cuda::CUpointer_attribute::CU_POINTER_ATTRIBUTE_IS_MANAGED => {\n            CudaDisplay::write(unsafe { &*(data as *const bool) }, \"\", 0, writer)\n        }\n        cuda_types::cuda::CUpointer_attribute::CU_POINTER_ATTRIBUTE_DEVICE_ORDINAL => {\n            CudaDisplay::write(unsafe { &*(data as *const i32) }, \"\", 0, writer)\n        }\n        cuda_types::cuda::CUpointer_attribute::CU_POINTER_ATTRIBUTE_IS_LEGACY_CUDA_IPC_CAPABLE => {\n            CudaDisplay::write(unsafe { &*(data as *const bool) }, \"\", 0, writer)\n        }\n        cuda_types::cuda::CUpointer_attribute::CU_POINTER_ATTRIBUTE_RANGE_START_ADDR => {\n            CudaDisplay::write(unsafe { &*(data as *const usize) }, \"\", 0, writer)\n        }\n        cuda_types::cuda::CUpointer_attribute::CU_POINTER_ATTRIBUTE_RANGE_SIZE => {\n            CudaDisplay::write(unsafe { &*(data as *const usize) }, \"\", 0, writer)\n        }\n        cuda_types::cuda::CUpointer_attribute::CU_POINTER_ATTRIBUTE_MAPPED => {\n            CudaDisplay::write(unsafe { &*(data as *const bool) }, \"\", 0, writer)\n        }\n        cuda_types::cuda::CUpointer_attribute::CU_POINTER_ATTRIBUTE_ALLOWED_HANDLE_TYPES => {\n            CudaDisplay::write(unsafe { &*(data as *const CUmemAllocationHandleType) }, \"\", 0, writer)\n        }\n        cuda_types::cuda::CUpointer_attribute::CU_POINTER_ATTRIBUTE_IS_GPU_DIRECT_RDMA_CAPABLE => {\n            CudaDisplay::write(unsafe { &*(data as *const bool) }, \"\", 0, writer)\n        }\n        cuda_types::cuda::CUpointer_attribute::CU_POINTER_ATTRIBUTE_ACCESS_FLAGS => {\n            CudaDisplay::write(unsafe { &*(data as *const CUDA_POINTER_ATTRIBUTE_ACCESS_FLAGS) }, \"\", 0, writer)\n        }\n        cuda_types::cuda::CUpointer_attribute::CU_POINTER_ATTRIBUTE_MEMPOOL_HANDLE => {\n            CudaDisplay::write(unsafe { &*(data as *const CUmemoryPool) }, \"\", 0, writer)\n        }\n        cuda_types::cuda::CUpointer_attribute::CU_POINTER_ATTRIBUTE_MAPPING_SIZE => {\n            CudaDisplay::write(unsafe { &*(data as *const usize) }, \"\", 0, writer)\n        }\n        cuda_types::cuda::CUpointer_attribute::CU_POINTER_ATTRIBUTE_MAPPING_BASE_ADDR => {\n            CudaDisplay::write(unsafe { &*(data as *const usize) }, \"\", 0, writer)\n        }\n        // We don't know the type of the result\n        // cuda_types::cuda::CUpointer_attribute::CU_POINTER_ATTRIBUTE_MEMORY_BLOCK_ID => {\n        //     CudaDisplay::write(unsafe { &*(data as *const ???) }, \"\", 0, writer)\n        // }\n        cuda_types::cuda::CUpointer_attribute::CU_POINTER_ATTRIBUTE_IS_HW_DECOMPRESS_CAPABLE => {\n            CudaDisplay::write(unsafe { &*(data as *const bool) }, \"\", 0, writer)\n        }\n        _ => writer.write_all(b\"UNKNOWN ATTRIBUTE\"),\n    }\n}\n\n#[allow(non_snake_case)]\npub fn write_cuStreamGetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: CUstream,\n    attr: CUstreamAttrID,\n    value_out: *mut CUstreamAttrValue,\n) -> std::io::Result<()> {\n    writer.write_all(b\"(hStream: \")?;\n    CudaDisplay::write(&hStream, \"cuStreamGetAttribute\", 0, writer)?;\n    writer.write_all(b\", attr: \")?;\n    CudaDisplay::write(&attr, \"cuStreamGetAttribute\", 1, writer)?;\n    writer.write_all(b\", value_out: \")?;\n    write_launch_attribute(writer, \"cuStreamGetAttribute\", 2, attr, unsafe {\n        *value_out\n    })?;\n    writer.write_all(b\") \")\n}\n\nfn write_launch_attribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    fn_name: &'static str,\n    index: usize,\n    attribute: CUlaunchAttributeID,\n    value: CUlaunchAttributeValue,\n) -> std::io::Result<()> {\n    match attribute {\n        CUlaunchAttributeID::CU_LAUNCH_ATTRIBUTE_ACCESS_POLICY_WINDOW => {\n            writer.write_all(b\"CU_LAUNCH_ATTRIBUTE_ACCESS_POLICY_WINDOW = \")?;\n            CudaDisplay::write(unsafe { &value.accessPolicyWindow }, fn_name, index, writer)\n        }\n        CUlaunchAttributeID::CU_LAUNCH_ATTRIBUTE_COOPERATIVE => {\n            writer.write_all(b\"CU_LAUNCH_ATTRIBUTE_COOPERATIVE = \")?;\n            CudaDisplay::write(unsafe { &value.cooperative }, fn_name, index, writer)\n        }\n        CUlaunchAttributeID::CU_LAUNCH_ATTRIBUTE_SYNCHRONIZATION_POLICY => {\n            writer.write_all(b\"CU_LAUNCH_ATTRIBUTE_SYNCHRONIZATION_POLICY = \")?;\n            CudaDisplay::write(unsafe { &value.syncPolicy }, fn_name, index, writer)\n        }\n        CUlaunchAttributeID::CU_LAUNCH_ATTRIBUTE_CLUSTER_DIMENSION => {\n            writer.write_all(b\"CU_LAUNCH_ATTRIBUTE_CLUSTER_DIMENSION = \")?;\n            CudaDisplay::write(unsafe { &value.clusterDim }, fn_name, index, writer)\n        }\n        CUlaunchAttributeID::CU_LAUNCH_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE => {\n            writer.write_all(b\"CU_LAUNCH_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE = \")?;\n            CudaDisplay::write(\n                unsafe { &value.clusterSchedulingPolicyPreference },\n                fn_name,\n                index,\n                writer,\n            )\n        }\n        CUlaunchAttributeID::CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_STREAM_SERIALIZATION => {\n            writer.write_all(b\"CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_STREAM_SERIALIZATION = \")?;\n            CudaDisplay::write(\n                unsafe { &value.programmaticStreamSerializationAllowed },\n                fn_name,\n                index,\n                writer,\n            )\n        }\n        CUlaunchAttributeID::CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_EVENT => {\n            writer.write_all(b\"CU_LAUNCH_ATTRIBUTE_PROGRAMMATIC_EVENT = \")?;\n            CudaDisplay::write(unsafe { &value.programmaticEvent }, fn_name, index, writer)\n        }\n        CUlaunchAttributeID::CU_LAUNCH_ATTRIBUTE_PRIORITY => {\n            writer.write_all(b\"CU_LAUNCH_ATTRIBUTE_PRIORITY = \")?;\n            CudaDisplay::write(unsafe { &value.priority }, fn_name, index, writer)\n        }\n        CUlaunchAttributeID::CU_LAUNCH_ATTRIBUTE_MEM_SYNC_DOMAIN_MAP => {\n            writer.write_all(b\"CU_LAUNCH_ATTRIBUTE_MEM_SYNC_DOMAIN_MAP = \")?;\n            CudaDisplay::write(unsafe { &value.memSyncDomainMap }, fn_name, index, writer)\n        }\n        CUlaunchAttributeID::CU_LAUNCH_ATTRIBUTE_MEM_SYNC_DOMAIN => {\n            writer.write_all(b\"CU_LAUNCH_ATTRIBUTE_MEM_SYNC_DOMAIN = \")?;\n            CudaDisplay::write(unsafe { &value.memSyncDomain }, fn_name, index, writer)\n        }\n        CUlaunchAttributeID::CU_LAUNCH_ATTRIBUTE_LAUNCH_COMPLETION_EVENT => {\n            writer.write_all(b\"CU_LAUNCH_ATTRIBUTE_LAUNCH_COMPLETION_EVENT = \")?;\n            CudaDisplay::write(\n                unsafe { &value.launchCompletionEvent },\n                fn_name,\n                index,\n                writer,\n            )\n        }\n        CUlaunchAttributeID::CU_LAUNCH_ATTRIBUTE_DEVICE_UPDATABLE_KERNEL_NODE => {\n            writer.write_all(b\"CU_LAUNCH_ATTRIBUTE_DEVICE_UPDATABLE_KERNEL_NODE = \")?;\n            CudaDisplay::write(\n                unsafe { &value.deviceUpdatableKernelNode },\n                fn_name,\n                index,\n                writer,\n            )\n        }\n        _ => writer.write_all(b\"\"),\n    }\n}\n\n#[allow(non_snake_case)]\npub fn write_cuStreamGetAttribute_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: CUstream,\n    attr: CUstreamAttrID,\n    value_out: *mut CUstreamAttrValue,\n) -> std::io::Result<()> {\n    write_cuStreamGetAttribute(writer, hStream, attr, value_out)\n}\n\n#[allow(non_snake_case)]\npub fn write_cuStreamSetAttribute(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: CUstream,\n    attr: CUstreamAttrID,\n    value_out: *const CUstreamAttrValue,\n) -> std::io::Result<()> {\n    write_cuStreamGetAttribute(writer, hStream, attr, value_out as *mut _)\n}\n\n#[allow(non_snake_case)]\npub fn write_cuStreamSetAttribute_ptsz(\n    writer: &mut (impl std::io::Write + ?Sized),\n    hStream: CUstream,\n    attr: CUstreamAttrID,\n    value_out: *const CUstreamAttrValue,\n) -> std::io::Result<()> {\n    write_cuStreamSetAttribute(writer, hStream, attr, value_out)\n}\n\n#[allow(non_snake_case)]\npub fn write_cuGLGetDevices(\n    _writer: &mut (impl std::io::Write + ?Sized),\n    _pCudaDeviceCount: *mut ::std::os::raw::c_uint,\n    _pCudaDevices: *mut CUdevice,\n    _cudaDeviceCount: ::std::os::raw::c_uint,\n    _deviceList: CUGLDeviceList,\n) -> std::io::Result<()> {\n    todo!()\n}\n\n#[allow(non_snake_case)]\npub fn write_cuGLGetDevices_v2(\n    _writer: &mut (impl std::io::Write + ?Sized),\n    _pCudaDeviceCount: *mut ::std::os::raw::c_uint,\n    _pCudaDevices: *mut CUdevice,\n    _cudaDeviceCount: ::std::os::raw::c_uint,\n    _deviceList: CUGLDeviceList,\n) -> std::io::Result<()> {\n    todo!()\n}\n\n#[allow(non_snake_case)]\npub fn write_cuModuleLoadDataEx(\n    writer: &mut (impl std::io::Write + ?Sized),\n    module: *mut cuda_types::cuda::CUmodule,\n    image: *const ::core::ffi::c_void,\n    numOptions: ::core::ffi::c_uint,\n    options: *mut cuda_types::cuda::CUjit_option,\n    optionValues: *mut *mut ::core::ffi::c_void,\n) -> std::io::Result<()> {\n    let mut arg_idx = 0usize;\n    writer.write_all(b\"(\")?;\n    writer.write_all(concat!(stringify!(module), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&module, \"cuModuleLoadDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(image), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&image, \"cuModuleLoadDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(numOptions), \": \").as_bytes())?;\n    crate::CudaDisplay::write(&numOptions, \"cuModuleLoadDataEx\", arg_idx, writer)?;\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(options), \": \").as_bytes())?;\n    if numOptions == 0 {\n        write!(writer, \"{:p}\", options)?;\n    } else {\n        let options = unsafe { std::slice::from_raw_parts(options, numOptions as usize) };\n        crate::CudaDisplay::write(options, \"cuModuleLoadDataEx\", arg_idx, writer)?;\n    }\n    arg_idx += 1;\n    writer.write_all(b\", \")?;\n    writer.write_all(concat!(stringify!(optionValues), \": \").as_bytes())?;\n    if numOptions == 0 {\n        write!(writer, \"{:p}\", optionValues)?;\n    } else {\n        let optionValues =\n            unsafe { std::slice::from_raw_parts(optionValues, numOptions as usize) };\n        crate::CudaDisplay::write(optionValues, \"cuModuleLoadDataEx\", arg_idx, writer)?;\n    }\n    writer.write_all(b\")\")\n}\n\nfn write_nvml_value(\n    writer: &mut (impl std::io::Write + ?Sized),\n    type_: Option<cuda_types::nvml::nvmlValueType_t>,\n    value: cuda_types::nvml::nvmlValue_t) -> std::io::Result<()> {\n    match type_ {\n        Some(cuda_types::nvml::nvmlValueType_t::NVML_VALUE_TYPE_DOUBLE) => {\n            writer.write_fmt(format_args!(\"{}\", unsafe { value.dVal } ))\n        }\n        Some(cuda_types::nvml::nvmlValueType_t::NVML_VALUE_TYPE_UNSIGNED_INT) => {\n            writer.write_fmt(format_args!(\"{}\", unsafe { value.uiVal }))\n        }\n        Some(cuda_types::nvml::nvmlValueType_t::NVML_VALUE_TYPE_UNSIGNED_LONG) => {\n            writer.write_fmt(format_args!(\"{}\", unsafe { value.ulVal }))\n        }\n        Some(cuda_types::nvml::nvmlValueType_t::NVML_VALUE_TYPE_UNSIGNED_LONG_LONG) => {\n            writer.write_fmt(format_args!(\"{}\", unsafe { value.ullVal }))\n        }\n        Some(cuda_types::nvml::nvmlValueType_t::NVML_VALUE_TYPE_SIGNED_LONG_LONG) => {\n            writer.write_fmt(format_args!(\"{}\", unsafe { value.sllVal }))\n        }\n        Some(cuda_types::nvml::nvmlValueType_t::NVML_VALUE_TYPE_SIGNED_INT) => {\n            writer.write_fmt(format_args!(\"{}\", unsafe { value.siVal }))\n        }\n        Some(cuda_types::nvml::nvmlValueType_t::NVML_VALUE_TYPE_UNSIGNED_SHORT) => {\n            writer.write_fmt(format_args!(\"{}\", unsafe { value.usVal }))\n        }\n        Some(_) | None => {\n            CudaDisplay::write(&unsafe { mem::transmute::<_, [u8;8]>(value) }, \"\", 0, writer)\n        },\n    }\n}\n\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlSample_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(timeStamp), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.timeStamp, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(sampleValue), \": \").as_bytes())?;\n        write_nvml_value(writer, None, self.sampleValue)?;\n        writer.write_all(b\" }\")\n    }\n}\n\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuInstanceUtilizationSample_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(vgpuInstance), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.vgpuInstance, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(timeStamp), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.timeStamp, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(smUtil), \": \").as_bytes())?;\n        write_nvml_value(writer, None, self.smUtil)?;\n        writer.write_all(concat!(\", \", stringify!(memUtil), \": \").as_bytes())?;\n        write_nvml_value(writer, None, self.memUtil)?;\n        writer.write_all(concat!(\", \", stringify!(encUtil), \": \").as_bytes())?;\n        write_nvml_value(writer, None, self.encUtil)?;\n        writer.write_all(concat!(\", \", stringify!(decUtil), \": \").as_bytes())?;\n        write_nvml_value(writer, None, self.decUtil)?;\n        writer.write_all(b\" }\")\n    }\n}\n\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuInstanceUtilizationInfo_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(timeStamp), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.timeStamp, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(vgpuInstance), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.vgpuInstance, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(smUtil), \": \").as_bytes())?;\n        write_nvml_value(writer, None, self.smUtil)?;\n        writer.write_all(concat!(\", \", stringify!(memUtil), \": \").as_bytes())?;\n        write_nvml_value(writer, None, self.memUtil)?;\n        writer.write_all(concat!(\", \", stringify!(encUtil), \": \").as_bytes())?;\n        write_nvml_value(writer, None, self.encUtil)?;\n        writer.write_all(concat!(\", \", stringify!(decUtil), \": \").as_bytes())?;\n        write_nvml_value(writer, None, self.decUtil)?;\n        writer.write_all(concat!(\", \", stringify!(jpgUtil), \": \").as_bytes())?;\n        write_nvml_value(writer, None, self.jpgUtil)?;\n        writer.write_all(concat!(\", \", stringify!(ofaUtil), \": \").as_bytes())?;\n        write_nvml_value(writer, None, self.ofaUtil)?;\n        writer.write_all(b\" }\")\n    }\n}\n\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlFieldValue_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(fieldId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.fieldId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(scopeId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.scopeId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(timestamp), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.timestamp, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(latencyUsec), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.latencyUsec, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(valueType), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.valueType, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(nvmlReturn), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.nvmlReturn, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(value), \": \").as_bytes())?;\n        write_nvml_value(writer, Some(self.valueType), self.value)?;\n        writer.write_all(b\" }\")\n    }\n}\n\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuSchedulerSetState_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(schedulerPolicy), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.schedulerPolicy, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(enableARRMode), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.enableARRMode, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(schedulerParams), \": \").as_bytes())?;\n        if self.enableARRMode != 0 {\n            crate::CudaDisplay::write(&unsafe { self.schedulerParams.vgpuSchedDataWithARR }, \"\", 0, writer)?;\n        } else {\n            crate::CudaDisplay::write(&unsafe { self.schedulerParams.vgpuSchedData } , \"\", 0, writer)?;\n        }\n        writer.write_all(b\" }\")\n    }\n}\n\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuSchedulerLog_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(engineId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.engineId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(schedulerPolicy), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.schedulerPolicy, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(arrMode), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.arrMode, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(schedulerParams), \": \").as_bytes())?;        if self.arrMode != 0 {\n            crate::CudaDisplay::write(&unsafe { self.schedulerParams.vgpuSchedDataWithARR }, \"\", 0, writer)?;\n        } else {\n            crate::CudaDisplay::write(&unsafe { self.schedulerParams.vgpuSchedData } , \"\", 0, writer)?;\n        }\n        writer.write_all(concat!(\", \", stringify!(entriesCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.entriesCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(logEntries), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.logEntries, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\n\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuSchedulerGetState_st {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(schedulerPolicy), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.schedulerPolicy, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(arrMode), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.arrMode, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(schedulerParams), \": \").as_bytes())?;\n        if self.arrMode != 0 {\n            crate::CudaDisplay::write(&unsafe { self.schedulerParams.vgpuSchedDataWithARR }, \"\", 0, writer)?;\n        } else {\n            crate::CudaDisplay::write(&unsafe { self.schedulerParams.vgpuSchedData } , \"\", 0, writer)?;\n        }\n        writer.write_all(b\" }\")\n    }\n}\n\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlUUID_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(type_), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.type_, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(value), \": \").as_bytes())?;\n        if self.type_ == cuda_types::nvml::nvmlUUIDType_t::NVML_UUID_TYPE_ASCII.0  {\n            writer.write_all(&unsafe { mem::transmute::<_, [u8;41]>( self.value.str_ )}[..])?\n        } else if self.type_ == cuda_types::nvml::nvmlUUIDType_t::NVML_UUID_TYPE_BINARY.0 {\n            crate::CudaDisplay::write(& cuda_types::cuda::CUuuid { bytes: unsafe { self.value.bytes } }, \"\", 0, writer)?\n        } else {\n            crate::CudaDisplay::write(&unsafe { mem::transmute::<_, [u8; 41]>(self.value) }, \"\", 0, writer)?\n        }\n        writer.write_all(b\" }\")\n    }\n}\n\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuSchedulerLogInfo_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(engineId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.engineId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(schedulerPolicy), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.schedulerPolicy, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(arrMode), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.arrMode, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(schedulerParams), \": \").as_bytes())?;\n        if self.arrMode == cuda_types::nvml::NVML_VGPU_SCHEDULER_ARR_DISABLE {\n            crate::CudaDisplay::write(&unsafe { self.schedulerParams.vgpuSchedData } , \"\", 0, writer)?;\n        } else {\n            crate::CudaDisplay::write(&unsafe { self.schedulerParams.vgpuSchedDataWithARR }, \"\", 0, writer)?;\n        }\n        writer.write_all(concat!(\", \", stringify!(entriesCount), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.entriesCount, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(logEntries), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.logEntries, \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\n\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuSchedulerState_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(engineId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.engineId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(schedulerPolicy), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.schedulerPolicy, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(enableARRMode), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.enableARRMode, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(schedulerParams), \": \").as_bytes())?;\n        if self.enableARRMode == 0 {\n            crate::CudaDisplay::write(&unsafe { self.schedulerParams.vgpuSchedData } , \"\", 0, writer)?;\n        } else {\n            crate::CudaDisplay::write(&unsafe { self.schedulerParams.vgpuSchedDataWithARR }, \"\", 0, writer)?;\n        }\n        writer.write_all(b\" }\")\n    }\n}\n\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlVgpuSchedulerStateInfo_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(version), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.version, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(engineId), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.engineId, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(schedulerPolicy), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.schedulerPolicy, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(arrMode), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.arrMode, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(schedulerParams), \": \").as_bytes())?;\n        if self.arrMode == cuda_types::nvml::NVML_VGPU_SCHEDULER_ARR_DISABLE {\n            crate::CudaDisplay::write(&unsafe { self.schedulerParams.vgpuSchedData } , \"\", 0, writer)?;\n        } else {\n            crate::CudaDisplay::write(&unsafe { self.schedulerParams.vgpuSchedDataWithARR }, \"\", 0, writer)?;\n        }\n        writer.write_all(b\" }\")\n    }\n}\n\nimpl crate::CudaDisplay for cuda_types::nvml::nvmlPRMTLV_v1_t {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        writer.write_all(concat!(\"{ \", stringify!(dataSize), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.dataSize, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(status), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&self.status, \"\", 0, writer)?;\n        writer.write_all(concat!(\", \", stringify!(__bindgen_anon_1), \": \").as_bytes())?;\n        crate::CudaDisplay::write(&unsafe { mem::transmute::<_, [u8; 496]>(self.__bindgen_anon_1) }[..], \"\", 0, writer)?;\n        writer.write_all(b\" }\")\n    }\n}\n\nimpl crate::CudaDisplay for cuda_types::cudnn8::cudnnAlgorithmUnionStruct_Algorithm {\n    fn write(\n        &self,\n        _fn_name: &'static str,\n        _index: usize,\n        writer: &mut (impl std::io::Write + ?Sized),\n    ) -> std::io::Result<()> {\n        crate::CudaDisplay::write(&unsafe { mem::transmute::<_, [u8; 4]>(*self) }, \"\", 0, writer)\n    }\n}\n\nmod dark_api;\nmod format_generated;\npub use format_generated::*;\nmod format_generated_blas;\npub use format_generated_blas::*;\nmod format_generated_blaslt;\npub use format_generated_blaslt::*;\nmod format_generated_blaslt_internal;\npub use format_generated_blaslt_internal::*;\npub mod dnn8;\npub mod dnn9;\nmod format_generated_fft;\npub use format_generated_fft::*;\nmod format_generated_nvml;\npub use format_generated_nvml::*;\nmod format_generated_sparse;\npub use format_generated_sparse::*;\n"
  },
  {
    "path": "llvm_zluda/Cargo.toml",
    "content": "[package]\nname = \"llvm_zluda\"\nversion = \"0.1.0\"\nedition = \"2021\"\n# Used for the metadata environment variables (ie, DEP_LLVM_ROOT is set)\nlinks = \"LLVM\"\n\n[lib]\n\n[dependencies]\ntempfile = \"3\"\n\n[dependencies.llvm-sys]\nversion = \"191\"\nfeatures = [ \"disable-alltargets-init\", \"no-llvm-linking\" ]\n\n[build-dependencies]\ncmake = \"0.1\"\ncc = \"1.0.69\"\n"
  },
  {
    "path": "llvm_zluda/build.rs",
    "content": "use cmake::Config;\nuse core::panic;\nuse std::path::PathBuf;\nuse std::process::Command;\nuse std::{env, io};\n\nconst COMPONENTS: &[&'static str] = &[\n    \"LLVMCore\",\n    \"LLVMBitWriter\",\n    \"AMDGPU\",\n    \"llvm-libraries\",\n    \"lldCommon\",\n    \"lldELF\",\n    \"LLVMBitReader\",\n    \"LLVMAnalysis\", // for module verify\n];\n\nfn main() {\n    let mut cmake = Config::new(r\"../ext/llvm-project/llvm\");\n    try_use_sccache(&mut cmake);\n    try_use_ninja(&mut cmake);\n    cmake\n        // It's not like we can do anything about the warnings\n        .define(\"LLVM_ENABLE_WARNINGS\", \"OFF\")\n        // For some reason Rust always links to release CRT\n        .define(\"CMAKE_MSVC_RUNTIME_LIBRARY\", \"MultiThreaded\")\n        .define(\"LLVM_ENABLE_TERMINFO\", \"OFF\")\n        .define(\"LLVM_ENABLE_LIBXML2\", \"OFF\")\n        .define(\"LLVM_ENABLE_LIBEDIT\", \"OFF\")\n        .define(\"LLVM_ENABLE_LIBPFM\", \"OFF\")\n        .define(\"LLVM_ENABLE_ZLIB\", \"OFF\")\n        .define(\"LLVM_ENABLE_ZSTD\", \"OFF\")\n        .define(\"LLVM_INCLUDE_BENCHMARKS\", \"OFF\")\n        .define(\"LLVM_INCLUDE_EXAMPLES\", \"OFF\")\n        .define(\"LLVM_INCLUDE_TESTS\", \"OFF\")\n        .define(\"LLVM_BUILD_TESTS\", \"OFF\")\n        .define(\"LLVM_BUILD_TOOLS\", \"OFF\")\n        .define(\"LLVM_OPTIMIZED_TABLEGEN\", \"ON\")\n        //.define(\"LLVM_USE_LINKER\", \"lld\")\n        .define(\"LLVM_TARGETS_TO_BUILD\", \"AMDGPU\")\n        .define(\"LLVM_ENABLE_PROJECTS\", \"llvm;lld\");\n    // Debug build is so slow that no debugging of ZLUDA is possible.\n    // If you want to build with debug symbols, use dev-llvm profile.\n    if try_get_build_profile_name() == \"debug\" {\n        cmake.profile(\"Release\");\n    }\n    cmake.build_target(\"llvm-config\");\n    let llvm_dir = cmake.build();\n    for c in COMPONENTS {\n        cmake.build_target(c);\n        cmake.build();\n    }\n    let cmake_profile = cmake.get_profile();\n    let llvm_build_path = get_llvm_build_path(&llvm_dir, cmake_profile);\n    println!(\"cargo:build-path={}\", llvm_build_path.display());\n    let (cxxflags, ldflags, libdir, lib_names, system_libs) =\n        llvm_config(&llvm_build_path.join(\"bin/llvm-config\")).unwrap();\n    println!(\"cargo:rustc-link-arg={ldflags}\");\n    println!(\"cargo:rustc-link-search=native={libdir}\");\n    for lib in system_libs.split_ascii_whitespace() {\n        println!(\"cargo:rustc-link-arg={lib}\");\n    }\n    link_lld_components();\n    link_llvm_components(lib_names);\n    compile_cxx_lib(cxxflags, &llvm_build_path);\n}\n\n// https://github.com/mozilla/sccache/blob/main/README.md#usage\nfn try_use_sccache(cmake: &mut Config) {\n    if let Ok(sccache) = std::env::var(\"SCCACHE_PATH\") {\n        cmake.define(\"CMAKE_CXX_COMPILER_LAUNCHER\", &*sccache);\n        cmake.define(\"CMAKE_C_COMPILER_LAUNCHER\", &*sccache);\n        match std::env::var_os(\"CARGO_CFG_TARGET_OS\") {\n            Some(os) if os == \"windows\" => {\n                cmake.define(\n                    \"CMAKE_MSVC_DEBUG_INFORMATION_FORMAT\",\n                    \"$<$<CONFIG:Debug,RelWithDebInfo>:Embedded>\",\n                );\n                cmake.define(\"CMAKE_POLICY_CMP0141\", \"NEW\");\n            }\n            _ => {}\n        }\n    }\n}\n\nfn try_use_ninja(cmake: &mut Config) {\n    let mut cmd = Command::new(\"ninja\");\n    cmd.arg(\"--version\");\n    if let Ok(status) = cmd.status() {\n        if status.success() {\n            cmake.generator(\"Ninja\");\n        }\n    }\n}\n\n// Source: https://stackoverflow.com/a/73603419\n// We resort to this garbage because Cargo is ideologically opposed to\n// being useful, see here: https://github.com/rust-lang/cargo/issues/11054\nfn try_get_build_profile_name() -> String {\n    let mut path = PathBuf::from(env::var(\"OUT_DIR\").unwrap());\n    path.pop();\n    path.pop();\n    path.pop();\n    let name = path.file_name().unwrap().to_str().unwrap();\n    if ![\"debug\", \"dev-llvm\", \"release\", \"release-lto\"].contains(&name) {\n        panic!(\"Unknown build profile: {}\", name);\n    }\n    name.to_string()\n}\n\nfn get_llvm_build_path(llvm_build_dir: &PathBuf, cmake_profile: &str) -> PathBuf {\n    let mut with_cmake = llvm_build_dir.clone();\n    with_cmake.extend(&[\"build\", cmake_profile]);\n    if with_cmake.exists() {\n        return with_cmake;\n    }\n\n    let mut llvm_build_path = llvm_build_dir.clone();\n    llvm_build_path.extend(&[\"build\"]);\n\n    return llvm_build_path;\n}\n\nfn llvm_config(llvm_config_path: &PathBuf) -> io::Result<(String, String, String, String, String)> {\n    let mut cmd = Command::new(llvm_config_path);\n    cmd.args([\n        \"--link-static\",\n        \"--cxxflags\",\n        \"--ldflags\",\n        \"--libdir\",\n        \"--libnames\",\n        \"--system-libs\",\n    ]);\n    cmd.arg(\"core\");\n    cmd.arg(\"bitwriter\");\n    cmd.arg(\"amdgpu\");\n    cmd.arg(\"option\");\n    cmd.arg(\"codegen\");\n    cmd.arg(\"passes\");\n    // LLD seems to require this\n    cmd.arg(\"lto\");\n\n    if cfg!(debug_assertions) {\n        cmd.arg(\"analysis\");\n        cmd.arg(\"bitreader\");\n    }\n\n    let output = cmd.output()?;\n    if !output.status.success() {\n        return Err(io::Error::from(io::ErrorKind::Other));\n    }\n    let output = unsafe { String::from_utf8_unchecked(output.stdout) };\n    let mut lines = output.lines();\n    let cxxflags = lines.next().unwrap();\n    let ldflags = lines.next().unwrap();\n    let libdir = lines.next().unwrap();\n    let lib_names = lines.next().unwrap();\n    let system_libs = lines.next().unwrap();\n    Ok((\n        cxxflags.to_string(),\n        ldflags.to_string(),\n        libdir.to_string(),\n        lib_names.to_string(),\n        system_libs.to_string(),\n    ))\n}\n\nfn compile_cxx_lib(cxxflags: String, llvm_build_path: &PathBuf) {\n    let mut cc = cc::Build::new();\n    for flag in cxxflags.split_whitespace() {\n        cc.flag(flag);\n    }\n\n    let lld_include = PathBuf::from(\"../ext/llvm-project/lld/include\");\n    cc.include(&lld_include);\n    let lld_build_include = llvm_build_path.join(\"tools/lld/include\");\n    cc.include(&lld_build_include);\n\n    cc.cpp(true).file(\"src/lib.cpp\").compile(\"llvm_zluda_cpp\");\n    println!(\"cargo:rerun-if-changed=../ext/llvm-project\");\n    println!(\"cargo:rerun-if-changed=src/lib.cpp\");\n    println!(\"cargo:rerun-if-changed=src/lib.rs\");\n}\n\nfn get_library_name(file_name: &str) -> Option<&str> {\n    if let Some(name) = file_name\n        .strip_prefix(\"lib\")\n        .and_then(|name| name.strip_suffix(\".a\"))\n    {\n        // Unix (Linux/Mac)\n        // libLLVMfoo.a\n        Some(name)\n    } else if let Some(name) = file_name.strip_suffix(\".lib\") {\n        // Windows\n        // LLVMfoo.lib\n        Some(name)\n    } else {\n        None\n    }\n}\n\nfn link_llvm_components(components: String) {\n    for component in components.split_whitespace() {\n        let component = get_library_name(component).expect(&format!(\n            \"'{}' does not look like a static library name\",\n            component\n        ));\n        println!(\"cargo:rustc-link-lib={component}\");\n    }\n}\n\nfn link_lld_components() {\n    println!(\"cargo:rustc-link-lib=lldELF\");\n    println!(\"cargo:rustc-link-lib=lldCommon\");\n}\n"
  },
  {
    "path": "llvm_zluda/src/compile.rs",
    "content": "use crate::utils::{Context, Message, PassBuilderOptions, TargetMachine};\nuse crate::LLVMZludaParseCommandLineOptions;\nuse crate::{ffi::LLVMZludaLinkWithLLD, utils::Module};\nuse llvm_sys::{\n    core::*,\n    target::{\n        LLVMInitializeAMDGPUAsmPrinter, LLVMInitializeAMDGPUTarget, LLVMInitializeAMDGPUTargetInfo,\n        LLVMInitializeAMDGPUTargetMC,\n    },\n    target_machine::{\n        LLVMCodeGenFileType, LLVMCodeGenOptLevel, LLVMCodeModel, LLVMGetTargetFromTriple,\n        LLVMRelocMode,\n    },\n    transforms::pass_builder::LLVMRunPasses,\n};\nuse llvm_sys::{LLVMLinkage, LLVMVisibility};\nuse std::ffi::{CStr, CString};\nuse std::fs;\nuse std::sync::OnceLock;\nuse tempfile::NamedTempFile;\n\nconst OCKL_MODULE: &[u8] = include_bytes!(\"device-libs/ockl.bc\");\nconst OCML_MODULE: &[u8] = include_bytes!(\"device-libs/ocml.bc\");\n\n// https://llvm.org/docs/AMDGPUUsage.html#address-spaces\nconst CONSTANT_ADDRESS_SPACE: u32 = 4;\n\nfn load_module(ctx: &Context, bc: &[u8], name: &std::ffi::CStr) -> Result<Module, String> {\n    let module = Module::try_from_bitcode(ctx, bc, Some(name))\n        .ok_or((\"Failed to parse bitcode\").to_string())?;\n    module.verify()?;\n    Ok(module)\n}\n\n// TODO: see if there's a way to reduce duplication with attributes.rs\nfn add_constant(context: &Context, module: &Module, name: &CStr, attribute: u32) {\n    let attribute_type = unsafe { LLVMInt32TypeInContext(context.get()) };\n    let global = unsafe {\n        LLVMAddGlobalInAddressSpace(\n            module.get(),\n            attribute_type,\n            name.as_ptr(),\n            CONSTANT_ADDRESS_SPACE,\n        )\n    };\n    unsafe { LLVMSetLinkage(global, LLVMLinkage::LLVMExternalLinkage) };\n    unsafe { LLVMSetVisibility(global, LLVMVisibility::LLVMHiddenVisibility) };\n    unsafe { LLVMSetInitializer(global, LLVMConstInt(attribute_type, attribute as u64, 0)) };\n    unsafe { LLVMSetGlobalConstant(global, 1) };\n}\n\nfn path_to_cstring(path: &std::path::Path) -> Result<CString, String> {\n    let path_str = path\n        .to_str()\n        .ok_or((\"path is not valid as str\").to_string())?;\n    CString::new(path_str).map_err(|_| (\"path includes invalid null byte\").to_string())\n}\n\nfn get_isa_version_from_gcn_arch(gcn_arch: &str) -> Result<u32, String> {\n    let base: u32 = gcn_arch\n        .replace(\"gfx\", \"\")\n        .parse()\n        .map_err(|_| (\"could not get ISA version from gcn_arch\").to_string())?;\n    let stepping = base % 10;\n    let minor = (base / 10) % 10;\n    let major = base / 100;\n    Ok(major * 1000 + minor * 100 + stepping)\n}\n\nfn create_oclc_constants(ctx: &Context, gcn_arch: &str) -> Result<Module, String> {\n    let module = Module::new(ctx, c\"oclc_constants\");\n\n    // used by ockl\n    add_constant(ctx, &module, c\"__oclc_wavefrontsize64\", 0);\n    add_constant(ctx, &module, c\"__oclc_wavefrontsize_log2\", 5);\n    add_constant(ctx, &module, c\"__oclc_ABI_version\", 500);\n    add_constant(\n        ctx,\n        &module,\n        c\"__oclc_ISA_version\",\n        get_isa_version_from_gcn_arch(gcn_arch)?,\n    );\n\n    // used by ocml\n    add_constant(ctx, &module, c\"__oclc_unsafe_math_opt\", 0);\n    add_constant(ctx, &module, c\"__oclc_correctly_rounded_sqrt32\", 1);\n    add_constant(ctx, &module, c\"__oclc_finite_only_opt\", 0);\n    Ok(module)\n}\n\npub fn compile(\n    ctx: &Context,\n    gcn_arch: &str,\n    main: Module,\n    ptx_impl: &[u8],\n    attributes: Module,\n    compiler_hook: Option<&dyn Fn(&Vec<u8>, String)>,\n) -> Result<Vec<u8>, String> {\n    init_globals()?;\n\n    let linked = Module::new(ctx, c\"llvm-link\");\n\n    let ptx_impl = load_module(ctx, ptx_impl, c\"ptx_impl.bc\")?;\n    let ockl = load_module(ctx, OCKL_MODULE, c\"ockl.bc\")?;\n    let ocml = load_module(ctx, OCML_MODULE, c\"ocml.bc\")?;\n\n    let oclc_constants = create_oclc_constants(ctx, gcn_arch)?;\n\n    linked.link(main)?;\n    linked.link(attributes)?;\n    linked.link(oclc_constants)?;\n    linked.link(ptx_impl)?;\n    linked.link(ockl)?;\n    linked.link(ocml)?;\n\n    linked.verify()?;\n\n    if let Some(hook) = compiler_hook {\n        // Run compiler hook on human-readable LLVM IR\n        let message = linked.print_module_to_string();\n        let data = message.to_bytes().to_vec();\n        hook(&data, String::from(\"linked.ll\"));\n    }\n\n    let triple = c\"amdgcn-amd-amdhsa\";\n    let cpu = std::ffi::CString::new(gcn_arch).map_err(|_| (\"invalid gcn_arch\").to_string())?;\n    let features = c\"-wavefrontsize64,+cumode\";\n\n    let mut target = unsafe { std::mem::zeroed() };\n    let mut err = std::ptr::null_mut();\n    let status = unsafe { LLVMGetTargetFromTriple(triple.as_ptr(), &mut target, &mut err) };\n    if status != 0 {\n        let message = Message::new(unsafe { CStr::from_ptr(err) });\n        return Err(message.to_str().to_string());\n    }\n\n    let target_machine = TargetMachine::new(\n        target,\n        triple,\n        &cpu,\n        features,\n        LLVMCodeGenOptLevel::LLVMCodeGenLevelAggressive,\n        LLVMRelocMode::LLVMRelocDefault,\n        LLVMCodeModel::LLVMCodeModelDefault,\n    );\n\n    let pb_options = PassBuilderOptions::new();\n    let error = unsafe {\n        LLVMRunPasses(\n            linked.get(),\n            c\"default<O3>\".as_ptr(),\n            target_machine.get(),\n            pb_options.get(),\n        )\n    };\n\n    if !error.is_null() {\n        let err_msg = unsafe { llvm_sys::error::LLVMGetErrorMessage(error) };\n        let message = Message::new(unsafe { CStr::from_ptr(err_msg) });\n        return Err(message.to_str().to_string());\n    }\n\n    if let Some(hook) = compiler_hook {\n        // Run compiler hook on optimized human-readable LLVM IR\n        let message = linked.print_module_to_string();\n        let data = message.to_bytes().to_vec();\n        hook(&data, String::from(\"opt.ll\"));\n\n        // Running a disassembler would be a bit of a pain, so run codegen as assembly\n        let assembly = target_machine\n            .emit_to_memory_buffer(&linked.clone(), LLVMCodeGenFileType::LLVMAssemblyFile)?\n            .to_vec();\n        hook(&assembly, String::from(\"asm\"))\n    }\n\n    let object_file = target_machine\n        .emit_to_memory_buffer(&linked, LLVMCodeGenFileType::LLVMObjectFile)?\n        .to_vec();\n\n    if let Some(hook) = compiler_hook {\n        // Run compiler hook for object file\n        hook(&object_file, String::from(\"o\"));\n    }\n\n    let object_path = NamedTempFile::with_prefix(\"zluda.o\")\n        .map_err(|_| (\"Failed to create temporary file\").to_string())?\n        .into_temp_path();\n    let executable_path = NamedTempFile::with_prefix(\"zluda.elf\")\n        .map_err(|_| (\"Failed to create temporary file\").to_string())?\n        .into_temp_path();\n\n    fs::write(&object_path, &object_file)\n        .map_err(|_| (\"Failed to write object file\").to_string())?;\n\n    let object_path_cstr = path_to_cstring(&object_path)?;\n    let executable_path_cstr = path_to_cstring(&executable_path)?;\n\n    let mut err = std::ptr::null_mut();\n    let result = unsafe {\n        LLVMZludaLinkWithLLD(\n            object_path_cstr.as_ptr(),\n            executable_path_cstr.as_ptr(),\n            &mut err,\n        )\n    };\n    if result != 0 {\n        let message = Message::new(unsafe { CStr::from_ptr(err) });\n        return Err(message.to_str().to_string());\n    }\n\n    let executable =\n        fs::read(&executable_path).map_err(|_| (\"Failed to read executable file\").to_string())?;\n\n    if let Some(hook) = compiler_hook {\n        // Run compiler hook for final executable\n        hook(&executable, String::from(\"elf\"));\n    }\n\n    Ok(executable)\n}\n\nfn init_globals() -> Result<(), String> {\n    static INIT_AMDGPU: OnceLock<Result<(), Message>> = OnceLock::new();\n    INIT_AMDGPU\n        .get_or_init(|| {\n            let common_options = vec![\n                // Uncomment for LLVM debug\n                //c\"-debug\",\n                // Uncomment to save passes\n                // c\"-print-before-all\",\n                c\"llvm_zluda\",\n                c\"-ignore-tti-inline-compatible\",\n                // c\"-amdgpu-early-inline-all=true\",\n                c\"-amdgpu-internalize-symbols\",\n                c\"-amdhsa-code-object-version=5\",\n            ]\n            .into_iter();\n            let opt_options = if cfg!(debug_assertions) {\n                vec![]\n            } else {\n                vec![\n                    // default inlining threshold times 10\n                    c\"-inline-threshold=2250\",\n                    c\"-inlinehint-threshold=3250\",\n                ]\n            };\n            let llvm_args_ptrs: Vec<*const i8> = common_options\n                .chain(opt_options)\n                .map(|s| s.as_ptr())\n                .collect();\n            let mut err_msg = std::ptr::null_mut();\n            let success = unsafe {\n                LLVMZludaParseCommandLineOptions(\n                    llvm_args_ptrs.len() as i32,\n                    llvm_args_ptrs.as_ptr(),\n                    &mut err_msg,\n                )\n            };\n            if !success {\n                return Err(Message::new(unsafe { CStr::from_ptr(err_msg) }));\n            }\n            unsafe { LLVMInitializeAMDGPUTargetInfo() };\n            unsafe { LLVMInitializeAMDGPUTarget() };\n            unsafe { LLVMInitializeAMDGPUTargetMC() };\n            unsafe { LLVMInitializeAMDGPUAsmPrinter() };\n            Ok(())\n        })\n        .as_ref()\n        .map(|()| ())\n        .map_err(|e| e.to_str().to_owned())\n}\n"
  },
  {
    "path": "llvm_zluda/src/device-libs/LICENSE.TXT",
    "content": "==============================================================================\nROCm-Device-Libs Release License\n==============================================================================\nUniversity of Illinois/NCSA\nOpen Source License\n\nCopyright (c) 2014-2016, Advanced Micro Devices, Inc.\nAll rights reserved.\n\nDeveloped by:\n\n    AMD Research and AMD HSA Software Development\n\n    Advanced Micro Devices, Inc.\n\n    www.amd.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal with\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimers.\n\n    * Redistributions in binary form must reproduce the above copyright notice,\n      this list of conditions and the following disclaimers in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the names of the LLVM Team, University of Illinois at\n      Urbana-Champaign, nor the names of its contributors may be used to\n      endorse or promote products derived from this Software without specific\n      prior written permission.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\nCONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE\nSOFTWARE.\n"
  },
  {
    "path": "llvm_zluda/src/device-libs/README.md",
    "content": "These are the AMD device libraries in bitcode form, distributed under the University of Illinois/NCSA Open Source License in LICENSE.txt.\n"
  },
  {
    "path": "llvm_zluda/src/device-libs/ockl.bc",
    "content": "version https://git-lfs.github.com/spec/v1\noid sha256:e7b2f66c694f3f6771b9f2800502ed3fb62c9c769a6ab455330c6e2f5e36b6de\nsize 244908\n"
  },
  {
    "path": "llvm_zluda/src/ffi.rs",
    "content": "use llvm_sys::{prelude::*, *};\n\n#[repr(C)]\n#[derive(Clone, Copy, Debug, PartialEq)]\npub enum LLVMZludaAtomicRMWBinOp {\n    LLVMZludaAtomicRMWBinOpXchg = 0,\n    LLVMZludaAtomicRMWBinOpAdd = 1,\n    LLVMZludaAtomicRMWBinOpSub = 2,\n    LLVMZludaAtomicRMWBinOpAnd = 3,\n    LLVMZludaAtomicRMWBinOpNand = 4,\n    LLVMZludaAtomicRMWBinOpOr = 5,\n    LLVMZludaAtomicRMWBinOpXor = 6,\n    LLVMZludaAtomicRMWBinOpMax = 7,\n    LLVMZludaAtomicRMWBinOpMin = 8,\n    LLVMZludaAtomicRMWBinOpUMax = 9,\n    LLVMZludaAtomicRMWBinOpUMin = 10,\n    LLVMZludaAtomicRMWBinOpFAdd = 11,\n    LLVMZludaAtomicRMWBinOpFSub = 12,\n    LLVMZludaAtomicRMWBinOpFMax = 13,\n    LLVMZludaAtomicRMWBinOpFMin = 14,\n    LLVMZludaAtomicRMWBinOpUIncWrap = 15,\n    LLVMZludaAtomicRMWBinOpUDecWrap = 16,\n}\n\n// Backport from LLVM 19\npub const LLVMZludaFastMathAllowReassoc: ::std::ffi::c_uint = 1 << 0;\npub const LLVMZludaFastMathNoNaNs: ::std::ffi::c_uint = 1 << 1;\npub const LLVMZludaFastMathNoInfs: ::std::ffi::c_uint = 1 << 2;\npub const LLVMZludaFastMathNoSignedZeros: ::std::ffi::c_uint = 1 << 3;\npub const LLVMZludaFastMathAllowReciprocal: ::std::ffi::c_uint = 1 << 4;\npub const LLVMZludaFastMathAllowContract: ::std::ffi::c_uint = 1 << 5;\npub const LLVMZludaFastMathApproxFunc: ::std::ffi::c_uint = 1 << 6;\npub const LLVMZludaFastMathNone: ::std::ffi::c_uint = 0;\npub const LLVMZludaFastMathAll: ::std::ffi::c_uint = LLVMZludaFastMathAllowReassoc\n    | LLVMZludaFastMathNoNaNs\n    | LLVMZludaFastMathNoInfs\n    | LLVMZludaFastMathNoSignedZeros\n    | LLVMZludaFastMathAllowReciprocal\n    | LLVMZludaFastMathAllowContract\n    | LLVMZludaFastMathApproxFunc;\n\npub type LLVMZludaFastMathFlags = std::ffi::c_uint;\n\nextern \"C\" {\n    pub fn LLVMZludaBuildAlloca(\n        B: LLVMBuilderRef,\n        Ty: LLVMTypeRef,\n        AddrSpace: u32,\n        Name: *const i8,\n    ) -> LLVMValueRef;\n\n    pub fn LLVMZludaBuildAtomicRMW(\n        B: LLVMBuilderRef,\n        op: LLVMZludaAtomicRMWBinOp,\n        PTR: LLVMValueRef,\n        Val: LLVMValueRef,\n        scope: *const i8,\n        ordering: LLVMAtomicOrdering,\n    ) -> LLVMValueRef;\n\n    pub fn LLVMZludaBuildAtomicCmpXchg(\n        B: LLVMBuilderRef,\n        Ptr: LLVMValueRef,\n        Cmp: LLVMValueRef,\n        New: LLVMValueRef,\n        scope: *const i8,\n        SuccessOrdering: LLVMAtomicOrdering,\n        FailureOrdering: LLVMAtomicOrdering,\n    ) -> LLVMValueRef;\n\n    pub fn LLVMZludaSetFastMathFlags(FPMathInst: LLVMValueRef, FMF: LLVMZludaFastMathFlags);\n\n    pub fn LLVMZludaBuildFence(\n        B: LLVMBuilderRef,\n        ordering: LLVMAtomicOrdering,\n        scope: *const i8,\n        Name: *const i8,\n    ) -> LLVMValueRef;\n\n    pub fn LLVMZludaSetAtomic(\n        AtomicInst: LLVMValueRef,\n        Ordering: LLVMAtomicOrdering,\n        SSID: *const i8,\n    );\n\n    pub fn LLVMZludaLinkWithLLD(\n        input_path: *const i8,\n        output_path: *const i8,\n        error_message: *mut *mut i8,\n    ) -> i32;\n\n    pub fn LLVMZludaParseCommandLineOptions(\n        argc: i32,\n        argv: *const *const i8,\n        error_message: *mut *mut i8,\n    ) -> bool;\n}\n"
  },
  {
    "path": "ptx/Cargo.toml",
    "content": "[package]\nname = \"ptx\"\nversion = \"0.0.0\"\nauthors = [\"Andrzej Janik <vosen@vosen.pl>\"]\nedition = \"2021\"\n\n[lib]\n\n[dependencies]\nptx_parser = { path = \"../ptx_parser\" }\nllvm_zluda = { path = \"../llvm_zluda\" }\nquick-error = \"1.2\"\nthiserror = \"1.0\"\nbit-vec = \"0.8\"\nhalf =\"1.6\"\nbitflags = \"1.2\"\nrustc-hash = \"2.0.0\"\nstrum = \"0.26\"\nstrum_macros = \"0.26\"\npetgraph = \"0.7.1\"\nhighs = \"1.12.0\"\nint-enum = \"1.1\"\nunwrap_or = \"1.0.1\"\nsmallvec = \"1.15.1\"\nfixedbitset = \"0.5\"\n\n[dev-dependencies]\nhip_runtime-sys = { path = \"../ext/hip_runtime-sys\" }\ncuda_types = { path = \"../cuda_types\" }\ncuda_macros = { path = \"../cuda_macros\" }\ntempfile = \"3\"\npaste = \"1.0\"\npretty_assertions = \"1.4.1\"\nlibloading = \"0.8\"\n\n[features]\nci_build = []\n"
  },
  {
    "path": "ptx/lib/zluda_ptx_impl.cpp",
    "content": "/*\nEvery time this file changes it must be rebuilt.\nYou must use LLVM from ZLUDA submodule dir ext/llvm-project:\n\ncd ext/llvm-project && \\\nmkdir -p build && \\\ncd build && \\\ncmake \\\n    -DCMAKE_BUILD_TYPE=Release \\\n    -DLLVM_ENABLE_PROJECTS=\"clang\" \\\n    -DLLVM_TARGETS_TO_BUILD=\"AMDGPU;X86\" \\\n    -GNinja \\\n    ../llvm && \\\nninja clang llvm-dis llvm-as\n\nthen cd to the directory with this file and run this simple command:\n\n../../ext/llvm-project/build/bin/clang \\\n    -std=c++20 \\\n    -Xclang -fdenormal-fp-math=dynamic \\\n    -Wall -Wextra -Wsign-compare -Wconversion \\\n    -x hip \\\n    zluda_ptx_impl.cpp \\\n    -nogpulib \\\n    -O3 \\\n    -mno-wavefrontsize64 \\\n    -o zluda_ptx_impl.bc \\\n    -emit-llvm \\\n    -c \\\n    --offload-device-only --offload-arch=gfx1030 && \\\n../../ext/llvm-project/build/bin/llvm-dis zluda_ptx_impl.bc -o - \\\n    | sed '/@llvm.used/d' \\\n    | sed '/wchar_size/d' \\\n    | sed '/llvm.module.flags/d' \\\n    | sed '/__hip_cuid/d' \\\n    | sed 's/optnone//g' \\\n    | sed 's/define hidden/define linkonce_odr/g' \\\n    | sed 's/\\\"target-cpu\\\"=\\\"gfx1030\\\"//g' \\\n    | sed -E 's/\\\"target-features\\\"=\\\"[^\\\"]+\\\"//g'| \\\n../../ext/llvm-project/build/bin/llvm-as - -o  zluda_ptx_impl.bc && \\\n../../ext/llvm-project/build/bin/llvm-dis zluda_ptx_impl.bc\n*/\n\n#include <cstddef>\n#include <cstdint>\n#include <bit>\n#include <cmath>\n#include <hip/hip_runtime.h>\n#include <hip/amd_detail/amd_device_functions.h>\n#include <hip/hip_fp8.h>\n\n#define SHARED_SPACE __attribute__((address_space(3)))\n#define CONSTANT_SPACE __attribute__((address_space(4)))\n\ntypedef _Float16 half16 __attribute__((ext_vector_type(16)));\ntypedef float float8 __attribute__((ext_vector_type(8)));\ntypedef _Float16 f16;\ntypedef _Float16 f16x2 __attribute__((ext_vector_type(2)));\ntypedef _Float16 f16x4 __attribute__((ext_vector_type(4)));\ntypedef _Float16 f16x8 __attribute__((ext_vector_type(8)));\ntypedef __bf16 bf16;\ntypedef __bf16 bf16x2 __attribute__((ext_vector_type(2)));\ntypedef __bf16 bf16x4 __attribute__((ext_vector_type(4)));\ntypedef __bf16 bf16x8 __attribute__((ext_vector_type(8)));\ntypedef char s8x4 __attribute__((ext_vector_type(4)));\n\n#define FUNC(NAME) __device__ __attribute__((retain)) __zluda_ptx_impl_##NAME\n#define FUNC_CALL(NAME) __zluda_ptx_impl_##NAME\n#define ATTR(NAME) __ZLUDA_PTX_IMPL_ATTRIBUTE_##NAME\n#define DECLARE_ATTR(TYPE, NAME)                                        \\\n    extern \"C\" __attribute__((constant)) CONSTANT_SPACE TYPE ATTR(NAME) \\\n    __device__\n\nextern \"C\"\n{\n    extern \"C\" __attribute__((constant)) CONSTANT_SPACE uint32_t __oclc_ISA_version __device__;\n\n    uint32_t FUNC(activemask)()\n    {\n        return __builtin_amdgcn_read_exec_lo();\n    }\n\n    size_t __ockl_get_local_id(uint32_t) __device__;\n    uint32_t FUNC(sreg_tid)(uint8_t member)\n    {\n        return (uint32_t)__ockl_get_local_id(member);\n    }\n\n    size_t __ockl_get_local_size(uint32_t) __device__;\n    uint32_t FUNC(sreg_ntid)(uint8_t member)\n    {\n        return (uint32_t)__ockl_get_local_size(member);\n    }\n\n    size_t __ockl_get_group_id(uint32_t) __device__;\n    uint32_t FUNC(sreg_ctaid)(uint8_t member)\n    {\n        return (uint32_t)__ockl_get_group_id(member);\n    }\n\n    size_t __ockl_get_num_groups(uint32_t) __device__;\n    uint32_t FUNC(sreg_nctaid)(uint8_t member)\n    {\n        return (uint32_t)__ockl_get_num_groups(member);\n    }\n\n    uint32_t FUNC(sreg_laneid)()\n    {\n        return __lane_id();\n    }\n\n    uint32_t FUNC(sreg_lanemask_le)()\n    {\n        uint32_t lane_idx = FUNC_CALL(sreg_laneid)();\n        return (2U << lane_idx) - 1U;\n    }\n\n    uint32_t FUNC(sreg_lanemask_lt)()\n    {\n        uint32_t lane_idx = FUNC_CALL(sreg_laneid)();\n        return (1U << lane_idx) - 1U;\n    }\n\n    uint32_t FUNC(sreg_lanemask_ge)()\n    {\n        uint32_t lane_idx = FUNC_CALL(sreg_laneid)();\n        return (~0U) << lane_idx;\n    }\n\n    uint32_t __ockl_bfe_u32(uint32_t, uint32_t, uint32_t) __device__;\n    uint32_t FUNC(bfe_u32)(uint32_t base, uint32_t pos_32, uint32_t len_32)\n    {\n        uint32_t pos = pos_32 & 0xFFU;\n        uint32_t len = len_32 & 0xFFU;\n        if (pos >= 32)\n            return 0;\n        // V_BFE_U32 only uses bits [4:0] for len (max value is 31)\n        if (len >= 32)\n            return base >> pos;\n        len = std::min(len, 31U);\n        return __ockl_bfe_u32(base, pos, len);\n    }\n\n    // LLVM contains mentions of llvm.amdgcn.ubfe.i64 and llvm.amdgcn.sbfe.i64,\n    // but using it only leads to LLVM crashes on RDNA2\n    uint64_t FUNC(bfe_u64)(uint64_t base, uint32_t pos, uint32_t len)\n    {\n        // NVIDIA docs are incorrect. In 64 bit `bfe` both `pos` and `len`\n        // parameters use whole 32 bit number and not just bottom 8 bits\n        if (pos >= 64)\n            return 0;\n        if (len >= 64)\n            return base >> pos;\n        len = std::min(len, 63U);\n        return (base >> pos) & ((1UL << len) - 1UL);\n    }\n\n    int32_t __ockl_bfe_i32(int32_t, uint32_t, uint32_t) __device__;\n    int32_t FUNC(bfe_s32)(int32_t base, uint32_t pos_32, uint32_t len_32)\n    {\n        uint32_t pos = pos_32 & 0xFFU;\n        uint32_t len = len_32 & 0xFFU;\n        if (len == 0)\n            return 0;\n        if (pos >= 32)\n            return (base >> 31);\n        // V_BFE_I32 only uses bits [4:0] for len (max value is 31)\n        if (len >= 32)\n            return base >> pos;\n        len = std::min(len, 31U);\n        return __ockl_bfe_i32(base, pos, len);\n    }\n\n    static __device__ uint32_t add_sat(uint32_t x, uint32_t y)\n    {\n        uint32_t result;\n        if (__builtin_add_overflow(x, y, &result))\n        {\n            return UINT32_MAX;\n        }\n        else\n        {\n            return result;\n        }\n    }\n\n    int64_t FUNC(bfe_s64)(int64_t base, uint32_t pos, uint32_t len)\n    {\n        // NVIDIA docs are incorrect. In 64 bit `bfe` both `pos` and `len`\n        // parameters use whole 32 bit number and not just bottom 8 bits\n        if (len == 0)\n            return 0;\n        if (pos >= 64)\n            return (base >> 63U);\n        if (add_sat(pos, len) >= 64)\n            len = 64 - pos;\n        return (base << (64U - pos - len)) >> (64U - len);\n    }\n\n    uint32_t __ockl_bfm_u32(uint32_t count, uint32_t offset) __device__;\n    uint32_t FUNC(bfi_b32)(uint32_t insert, uint32_t base, uint32_t pos_32, uint32_t len_32)\n    {\n        uint32_t pos = pos_32 & 0xFFU;\n        uint32_t len = len_32 & 0xFFU;\n        if (pos >= 32)\n            return base;\n        uint32_t mask;\n        if (len >= 32)\n            mask = UINT32_MAX << pos;\n        else\n            mask = __ockl_bfm_u32(len, pos);\n        return (~mask & base) | (mask & (insert << pos));\n    }\n\n    uint64_t FUNC(bfi_b64)(uint64_t insert, uint64_t base, uint32_t pos, uint32_t len)\n    {\n        // NVIDIA docs are incorrect. In 64 bit `bfe` both `pos` and `len`\n        // parameters use whole 32 bit number and not just bottom 8 bits\n        if (pos >= 64)\n            return base;\n        uint64_t mask;\n        if (len >= 64)\n            mask = UINT64_MAX << pos;\n        else\n            mask = ((1UL << len) - 1UL) << (pos);\n        return (~mask & base) | (mask & (insert << pos));\n    }\n\n    uint32_t FUNC(bmsk_clamp_b32)(uint32_t position, uint32_t width)\n    {\n        return __ockl_bfm_u32(width, position);\n    }\n\n    void FUNC(bar_sync)(uint32_t)\n    {\n        __builtin_amdgcn_fence(__ATOMIC_SEQ_CST, \"workgroup\");\n        __builtin_amdgcn_s_barrier();\n    }\n\n    int32_t __ockl_wgred_and_i32(int32_t) __device__;\n    int32_t __ockl_wgred_or_i32(int32_t) __device__;\n\n#define BAR_RED_IMPL(reducer)                                                                                            \\\n    bool FUNC(bar_red_##reducer##_pred)(uint32_t barrier __attribute__((unused)), bool predicate, bool invert_predicate) \\\n    {                                                                                                                    \\\n        /* TODO: handle barrier */                                                                                       \\\n        return __ockl_wgred_##reducer##_i32(predicate ^ invert_predicate);                                               \\\n    }\n\n    BAR_RED_IMPL(and);\n    BAR_RED_IMPL(or);\n\n    typedef uint32_t ShflSyncResult __attribute__((ext_vector_type(2)));\n\n    // shfl.sync opts consists of two values, the warp end ID and the subsection mask.\n    //\n    // The current warp is partitioned into some number of subsections with a width of w. The\n    // subsection mask is 32 - w, and indicates which bits of the lane id are part of the subsection\n    // address. For example, if each subsection is 8 lanes wide, the subsection mask will be 24 –\n    // 11000 in binary. This indicates that the two most significant bits in the 5-bit lane ID are\n    // the subsection address. For example, for a lane ID 13 (0b01101) the address of the beginning\n    // of the subsection is 0b01000 (8).\n    //\n    // The warp end ID is the max lane ID for a specific mode. For the CUDA __shfl_sync\n    // intrinsics, it is always 31 for idx, bfly, and down, and 0 for up. This is used for the\n    // bounds check.\n#define SHFL_SYNC_IMPL(mode, calculate_index, CMP)                                                                                              \\\n    ShflSyncResult FUNC(shfl_sync_##mode##_b32_pred)(uint32_t input, int32_t delta, uint32_t opts, uint32_t membermask __attribute__((unused))) \\\n    {                                                                                                                                           \\\n        int32_t section_mask = (opts >> 8) & 0b11111;                                                                                           \\\n        int32_t warp_end = opts & 0b11111;                                                                                                      \\\n        int32_t self = (int32_t)__lane_id();                                                                                                    \\\n        int32_t subsection = section_mask & self;                                                                                               \\\n        int32_t subsection_end = subsection | (~section_mask & warp_end);                                                                       \\\n        int32_t idx = calculate_index;                                                                                                          \\\n        bool out_of_bounds = idx CMP subsection_end;                                                                                            \\\n        if (out_of_bounds)                                                                                                                      \\\n        {                                                                                                                                       \\\n            idx = self;                                                                                                                         \\\n        }                                                                                                                                       \\\n        int32_t output = __builtin_amdgcn_ds_bpermute(idx << 2, (int32_t)input);                                                                \\\n        return {(uint32_t)output, uint32_t(!out_of_bounds)};                                                                                    \\\n    }                                                                                                                                           \\\n                                                                                                                                                \\\n    uint32_t FUNC(shfl_sync_##mode##_b32)(uint32_t input, int32_t delta, uint32_t opts, uint32_t membermask)                                    \\\n    {                                                                                                                                           \\\n        return __zluda_ptx_impl_shfl_sync_##mode##_b32_pred(input, delta, opts, membermask).x;                                                  \\\n    }\n\n    // We are using the HIP __shfl intrinsics to implement these, rather than the __shfl_sync\n    // intrinsics, as those only add an assertion checking that the membermask is used correctly.\n    // They do not return the result of the range check, so we must replicate that logic here.\n\n    SHFL_SYNC_IMPL(up, self - delta, <);\n    SHFL_SYNC_IMPL(down, self + delta, >);\n    SHFL_SYNC_IMPL(bfly, self ^ delta, >);\n    SHFL_SYNC_IMPL(idx, (delta & ~section_mask) | subsection, >);\n\n    DECLARE_ATTR(uint32_t, CLOCK_RATE);\n    void FUNC(nanosleep_u32)(uint32_t nanoseconds)\n    {\n        // clock_rate is in kHz\n        uint64_t cycles_per_ns = ATTR(CLOCK_RATE) / 1000000;\n        uint64_t cycles = nanoseconds * cycles_per_ns;\n        // Avoid small sleep values resulting in s_sleep 0\n        cycles += 63;\n        // s_sleep N sleeps for 64 * N cycles\n        uint64_t sleep_amount = cycles / 64;\n\n        // The argument to s_sleep must be a constant\n        for (size_t i = 0; i < sleep_amount >> 4; i++)\n            __builtin_amdgcn_s_sleep(16);\n        if (sleep_amount & 8U)\n            __builtin_amdgcn_s_sleep(8);\n        if (sleep_amount & 4U)\n            __builtin_amdgcn_s_sleep(4);\n        if (sleep_amount & 2U)\n            __builtin_amdgcn_s_sleep(2);\n        if (sleep_amount & 1U)\n            __builtin_amdgcn_s_sleep(1);\n    }\n\n    void FUNC(__assertfail)(uint64_t message,\n                            uint64_t file,\n                            uint32_t line,\n                            uint64_t function,\n                            uint64_t char_size)\n    {\n        (void)char_size;\n        __assert_fail((const char *)message, (const char *)file, line, (const char *)function);\n    }\n\n    // * Smallest denormal is 1.4 × 10^-45\n    // * Smallest normal is ~1.175494351 × 10^(-38)\n    // * Now, 1.175494351×10^-38 / 1.4 × 10^-45  = 8396388 + 31/140\n    // * Next power of 2 is 16777216\n    const float DENORMAL_TO_NORMAL_FACTOR_F32 = 16777216.0f;\n    // * Largest subnormal is ~1.175494210692441e × 10^(-38)\n    // * Then any value equal or larger than following will produce subnormals: 8.50706018714406320806444272332455743547934627837873057975602739772164... × 10^37\n    const float RCP_DENORMAL_OUTPUT = 8.50706018714406320806444272332455743547934627837873057975602739772164e37f;\n    const float REVERSE_DENORMAL_TO_NORMAL_FACTOR_F32 = 0.029387360490963111877208252592662410455594571842846914442095471744599661631813495980086003637902577995683214210345151992265999035207077609582844f;\n\n    float FUNC(sqrt_approx_f32)(float x)\n    {\n        bool is_subnormal = __builtin_isfpclass(x, __FPCLASS_NEGSUBNORMAL | __FPCLASS_POSSUBNORMAL);\n        float input = x;\n        if (is_subnormal)\n            input = x * DENORMAL_TO_NORMAL_FACTOR_F32;\n        float value = __builtin_amdgcn_sqrtf(input);\n        if (is_subnormal)\n            return value * 0.000244140625f;\n        else\n            return value;\n    }\n\n    float FUNC(rsqrt_approx_f32)(float x)\n    {\n        bool is_subnormal = __builtin_isfpclass(x, __FPCLASS_NEGSUBNORMAL | __FPCLASS_POSSUBNORMAL);\n        float input = x;\n        if (is_subnormal)\n            input = x * DENORMAL_TO_NORMAL_FACTOR_F32;\n        float value = __builtin_amdgcn_rsqf(input);\n        if (is_subnormal)\n            return value * 4096.0f;\n        else\n            return value;\n    }\n\n    float FUNC(rcp_approx_f32)(float x)\n    {\n        float factor = 1.0f;\n        if (__builtin_isfpclass(x, __FPCLASS_NEGSUBNORMAL | __FPCLASS_POSSUBNORMAL))\n        {\n            factor = DENORMAL_TO_NORMAL_FACTOR_F32;\n        }\n        if (std::fabs(x) >= RCP_DENORMAL_OUTPUT)\n        {\n            factor = REVERSE_DENORMAL_TO_NORMAL_FACTOR_F32;\n        }\n        return __builtin_amdgcn_rcpf(x * factor) * factor;\n    }\n\n    // When x = -126, exp2(x) = 2^(-126) ≈ 1.175494351 × 10^(-38),\n    // which is the smallest normalized number in FP32\n    float FUNC(ex2_approx_f32)(float x)\n    {\n        bool special_handling = x < -126.0f;\n        float input = x;\n        if (special_handling)\n            input *= 0.5f;\n        float result = __builtin_amdgcn_exp2f(input);\n        if (special_handling)\n            return result * result;\n        else\n            return result;\n    }\n\n    float FUNC(lg2_approx_f32)(float x)\n    {\n        bool is_subnormal = __builtin_isfpclass(x, __FPCLASS_NEGSUBNORMAL | __FPCLASS_POSSUBNORMAL);\n        float input = x;\n        if (is_subnormal)\n            input = x * DENORMAL_TO_NORMAL_FACTOR_F32;\n        float value = __builtin_amdgcn_logf(input);\n        if (is_subnormal)\n            return value - 24.0f;\n        else\n            return value;\n    }\n\n    // Logic taken from legalizeFSQRTF32/lowerFSQRTF32 in LLVM AMDGPU target\n    __device__ static float precise_square_root(float x, bool needs_denorm_handling)\n    {\n\n        // Constants for denormal handling\n        const float scale_threshold = 0x1.0p-96f;   // Very small value threshold\n        const float scale_up_factor = 0x1.0p+32f;   // 2^32\n        const float scale_down_factor = 0x1.0p-16f; // 2^-16\n\n        // Check if input needs scaling (for very small values)\n        bool need_scale = scale_threshold > x;\n        auto scaled = scale_up_factor * x;\n\n        // Scale up input if needed\n        float sqrt_x = need_scale ? scaled : x;\n\n        float sqrt_s;\n\n        // Check if we need special denormal handling\n\n        if (needs_denorm_handling)\n        {\n            // Use hardware sqrt as initial approximation\n            sqrt_s = __builtin_sqrtf(sqrt_x); // Or equivalent hardware instruction\n\n            // Bit manipulations to get next values up/down\n            uint32_t sqrt_s_bits = std::bit_cast<uint32_t>(sqrt_s);\n\n            // Next value down (subtract 1 from bit pattern)\n            uint32_t sqrt_s_next_down_bits = sqrt_s_bits - 1;\n            float sqrt_s_next_down = std::bit_cast<float>(sqrt_s_next_down_bits);\n\n            // Calculate residual: x - sqrt_next_down * sqrt\n            float neg_sqrt_s_next_down = -sqrt_s_next_down;\n            float sqrt_vp = std::fma(neg_sqrt_s_next_down, sqrt_s, sqrt_x);\n\n            // Next value up (add 1 to bit pattern)\n            uint32_t sqrt_s_next_up_bits = sqrt_s_bits + 1;\n            float sqrt_s_next_up = std::bit_cast<float>(sqrt_s_next_up_bits);\n\n            // Calculate residual: x - sqrt_next_up * sqrt\n            float neg_sqrt_s_next_up = -sqrt_s_next_up;\n            float sqrt_vs = std::fma(neg_sqrt_s_next_up, sqrt_s, sqrt_x);\n\n            // Select correctly rounded result\n            if (sqrt_vp <= 0.0f)\n            {\n                sqrt_s = sqrt_s_next_down;\n            }\n\n            if (sqrt_vs > 0.0f)\n            {\n                sqrt_s = sqrt_s_next_up;\n            }\n        }\n        else\n        {\n            // Use Newton-Raphson method with reciprocal square root\n\n            // Initial approximation\n            float sqrt_r = __builtin_amdgcn_rsqf(sqrt_x); // Or equivalent hardware 1/sqrt instruction\n            sqrt_s = sqrt_x * sqrt_r;\n\n            // Refine approximation\n            float half = 0.5f;\n            float sqrt_h = sqrt_r * half;\n            float neg_sqrt_h = -sqrt_h;\n\n            // Calculate error term\n            float sqrt_e = std::fma(neg_sqrt_h, sqrt_s, half);\n\n            // First refinement\n            sqrt_h = std::fma(sqrt_h, sqrt_e, sqrt_h);\n            sqrt_s = std::fma(sqrt_s, sqrt_e, sqrt_s);\n\n            // Second refinement\n            float neg_sqrt_s = -sqrt_s;\n            float sqrt_d = std::fma(neg_sqrt_s, sqrt_s, sqrt_x);\n            sqrt_s = std::fma(sqrt_d, sqrt_h, sqrt_s);\n        }\n\n        // Scale back if input was scaled\n        if (need_scale)\n        {\n            sqrt_s *= scale_down_factor;\n        }\n\n        // Special case handling for zero and infinity\n        bool is_zero_or_inf = __builtin_isfpclass(sqrt_x, __FPCLASS_POSINF | __FPCLASS_POSZERO | __FPCLASS_NEGZERO);\n\n        return is_zero_or_inf ? sqrt_x : sqrt_s;\n    }\n\n    float FUNC(sqrt_rn_f32)(float x)\n    {\n        return precise_square_root(x, true);\n    }\n\n    float FUNC(sqrt_rn_ftz_f32)(float x)\n    {\n        return precise_square_root(x, false);\n    }\n\n    struct DivRnFtzF32Part1Result\n    {\n        float fma_4;\n        float fma_1;\n        float fma_3;\n        uint8_t numerator_scaled_flag;\n    };\n\n    DivRnFtzF32Part1Result FUNC(div_f32_part1)(float lhs, float rhs)\n    {\n        float one = 1.0f;\n\n        // Division scale operations\n        bool denominator_scaled_flag;\n        float denominator_scaled = __builtin_amdgcn_div_scalef(lhs, rhs, false, &denominator_scaled_flag);\n\n        bool numerator_scaled_flag;\n        float numerator_scaled = __builtin_amdgcn_div_scalef(lhs, rhs, true, &numerator_scaled_flag);\n\n        // Reciprocal approximation\n        float approx_rcp = __builtin_amdgcn_rcpf(denominator_scaled);\n        float neg_div_scale0 = -denominator_scaled;\n\n        // Perform division approximation steps\n        float fma_0 = fmaf(neg_div_scale0, approx_rcp, one);\n        float fma_1 = fmaf(fma_0, approx_rcp, approx_rcp);\n        float mul = numerator_scaled * fma_1;\n        float fma_2 = fmaf(neg_div_scale0, mul, numerator_scaled);\n        float fma_3 = fmaf(fma_2, fma_1, mul);\n        float fma_4 = fmaf(neg_div_scale0, fma_3, numerator_scaled);\n        return {fma_4, fma_1, fma_3, numerator_scaled_flag};\n    }\n\n    __device__ static float div_f32_part2(float x, float y, DivRnFtzF32Part1Result part1)\n    {\n        float fmas = __builtin_amdgcn_div_fmasf(part1.fma_4, part1.fma_1, part1.fma_3, part1.numerator_scaled_flag);\n        float result = __builtin_amdgcn_div_fixupf(fmas, y, x);\n\n        return result;\n    }\n\n    float FUNC(div_f32_part2)(float x, float y,\n                              float fma_4,\n                              float fma_1,\n                              float fma_3,\n                              uint8_t numerator_scaled_flag)\n    {\n        return div_f32_part2(x, y, {fma_4, fma_1, fma_3, numerator_scaled_flag});\n    }\n\n    __device__ static __hip_fp8_storage_t cvt_float_to_fp8(float f, __hip_fp8_interpretation_t interp)\n    {\n        const uint32_t bits = reinterpret_cast<uint32_t &>(f);\n        const uint8_t sign = (bits & 0x80000000) ? 0x80 : 0x0;\n        const uint32_t abs = bits & 0x7fffffff;\n\n        const uint32_t min = interp == __HIP_E4M3 ? 0x3A800000 : 0x37000000;\n        if (abs < min)\n        {\n            return sign; // +/- 0\n        }\n\n        return __hip_cvt_float_to_fp8(f, __HIP_SATFINITE, interp);\n    }\n\n    struct Fp8x2\n    {\n        __hip_fp8_storage_t b : 8;\n        __hip_fp8_storage_t a : 8;\n    };\n\n    Fp8x2 FUNC(cvt_rn_satfinite_e4m3x2_f32)(float a, float b)\n    {\n        // If built-in support for fp8 formats is added to LLVM IR we should switch to use that.\n        return {cvt_float_to_fp8(b, __HIP_E4M3), cvt_float_to_fp8(a, __HIP_E4M3)};\n    }\n\n    Fp8x2 FUNC(cvt_rn_satfinite_e5m2x2_f32)(float a, float b)\n    {\n        return {cvt_float_to_fp8(b, __HIP_E5M2), cvt_float_to_fp8(a, __HIP_E5M2)};\n    }\n\n    __half2 FUNC(cvt_rn_f16x2_e4m3x2)(__hip_fp8x2_e4m3 in)\n    {\n        return in;\n    }\n\n    __half2 FUNC(cvt_rn_f16x2_e5m2x2)(__hip_fp8x2_e5m2 in)\n    {\n        return in;\n    }\n\n    __device__ static inline uint32_t ballot(bool value, bool negate)\n    {\n        __builtin_amdgcn_wave_barrier();\n        return __builtin_amdgcn_ballot_w32(negate ? !value : value);\n    }\n\n    bool FUNC(vote_sync_any_pred)(bool value, uint32_t membermask __attribute__((unused)))\n    {\n        return ballot(value, false) != 0;\n    }\n\n    bool FUNC(vote_sync_any_pred_negate)(bool value, uint32_t membermask __attribute__((unused)))\n    {\n        return ballot(value, true) != 0;\n    }\n\n    // IMPORTANT: exec mask must be a subset of membermask, the behavior is undefined otherwise\n    bool FUNC(vote_sync_all_pred)(bool value, uint32_t membermask __attribute__((unused)))\n    {\n        return ballot(value, false) == __builtin_amdgcn_read_exec_lo();\n    }\n\n    // also known as \"none\"\n    bool FUNC(vote_sync_all_pred_negate)(bool value, uint32_t membermask __attribute__((unused)))\n    {\n        return ballot(value, false) == 0;\n    }\n\n    uint32_t FUNC(vote_sync_ballot_b32)(bool value, uint32_t membermask __attribute__((unused)))\n    {\n        return ballot(value, false);\n    }\n\n    uint32_t FUNC(vote_sync_ballot_b32_negate)(bool value, uint32_t membermask __attribute__((unused)))\n    {\n        return ballot(value, true);\n    }\n\n#define REDUX_SYNC_TYPE_IMPL(reducer, ptx_type, amd_type, cpp_type)                                             \\\n    cpp_type __ockl_wfred_##reducer##_##amd_type(cpp_type) __device__;                                          \\\n    cpp_type FUNC(redux_sync_##reducer##_##ptx_type)(cpp_type src, uint32_t membermask __attribute__((unused))) \\\n    {                                                                                                           \\\n        return __ockl_wfred_##reducer##_##amd_type(src);                                                        \\\n    }\n\n#define REDUX_SYNC_IMPL(reducer)                      \\\n    REDUX_SYNC_TYPE_IMPL(reducer, u32, u32, uint32_t) \\\n    REDUX_SYNC_TYPE_IMPL(reducer, s32, i32, int32_t)\n\n    REDUX_SYNC_IMPL(add);\n    REDUX_SYNC_IMPL(min);\n    REDUX_SYNC_IMPL(max);\n\n    __device__ inline static uint32_t load_single_matrix(void SHARED_SPACE *lds_address, uint32_t warp_offset)\n    {\n        uint32_t laneid = __zluda_ptx_impl_sreg_laneid();\n        int32_t row_address = __builtin_amdgcn_ds_bpermute((int32_t)(warp_offset + (laneid / 4U)) << 2U, (int32_t)lds_address);\n        uint32_t matrix_cell_address = (uint32_t)row_address + ((laneid % 4) * 4);\n        return *((uint32_t SHARED_SPACE *)matrix_cell_address);\n    }\n\n    __device__ inline static uint32_t load_single_matrix_trans(void SHARED_SPACE *lds_address, uint32_t warp_offset)\n    {\n        uint32_t laneid = __zluda_ptx_impl_sreg_laneid();\n        int32_t row_address_lo = __builtin_amdgcn_ds_bpermute((int32_t)(warp_offset + ((laneid % 4U) * 2)) << 2U, (int32_t)lds_address);\n        uint32_t address_lo = (uint32_t)row_address_lo + ((laneid / 4) * 2);\n        uint16_t lo = *((uint16_t SHARED_SPACE *)address_lo);\n        int32_t row_address_hi = __builtin_amdgcn_ds_bpermute((int32_t)(warp_offset + ((laneid % 4U) * 2) + 1) << 2U, (int32_t)lds_address);\n        uint32_t address_hi = (uint32_t)row_address_hi + ((laneid / 4) * 2);\n        uint16_t hi = *((uint16_t SHARED_SPACE *)address_hi);\n        return std::bit_cast<uint32_t>(ushort2::Native_vec_{lo, hi});\n    }\n\n    uint2::Native_vec_ FUNC(ldmatrix_m8n8_x2_b16)(void SHARED_SPACE *address)\n    {\n        uint32_t x0 = load_single_matrix(address, 0);\n        uint32_t x1 = load_single_matrix(address, 8);\n        return uint2::Native_vec_{x0, x1};\n    }\n\n    uint4::Native_vec_ FUNC(ldmatrix_m8n8_x4_b16)(void SHARED_SPACE *address)\n    {\n        uint32_t x0 = load_single_matrix(address, 0);\n        uint32_t x1 = load_single_matrix(address, 8);\n        uint32_t x2 = load_single_matrix(address, 16);\n        uint32_t x3 = load_single_matrix(address, 24);\n        return uint4::Native_vec_{x0, x1, x2, x3};\n    }\n\n    uint4::Native_vec_ FUNC(ldmatrix_m8n8_x4_trans_b16)(void SHARED_SPACE *address)\n    {\n        uint32_t x0 = load_single_matrix_trans(address, 0);\n        uint32_t x1 = load_single_matrix_trans(address, 8);\n        uint32_t x2 = load_single_matrix_trans(address, 16);\n        uint32_t x3 = load_single_matrix_trans(address, 24);\n        return uint4::Native_vec_{x0, x1, x2, x3};\n    }\n\n    struct byte4\n    {\n        union\n        {\n            uint32_t u32;\n            uint8_t u8x4[4];\n        };\n    } __attribute__((aligned(4)));\n\n    struct byte8\n    {\n        union\n        {\n            uint32_t u32x2[2];\n            uint8_t u8x8[8];\n        };\n    } __attribute__((aligned(8)));\n\n    uint32_t FUNC(prmt_b32)(uint32_t x, uint32_t y, uint32_t s)\n    {\n        byte4 v_perm_selector;\n        v_perm_selector.u32 = 0;\n\n        byte8 input;\n        input.u32x2[0] = x;\n        input.u32x2[1] = y;\n\n        for (size_t i = 0; i < 4; i++)\n        {\n            uint8_t sel = static_cast<uint8_t>(s >> (i * 4));\n            uint8_t addr = sel & 0x7;\n            if (sel & 0x8)\n            {\n                if (addr % 2 == 1)\n                {\n                    v_perm_selector.u8x4[i] = 0x8 + addr / 2;\n                    continue;\n                }\n            }\n            v_perm_selector.u8x4[i] = addr;\n        }\n\n        byte4 output;\n        output.u32 = __builtin_amdgcn_perm(input.u32x2[1], input.u32x2[0], v_perm_selector.u32);\n\n        for (size_t i = 0; i < 4; i++)\n        {\n            uint8_t sel = static_cast<uint8_t>(s >> (i * 4));\n            uint8_t addr = sel & 0x7;\n            if (sel & 0x8)\n            {\n                if (addr % 2 != 1)\n                {\n                    output.u8x4[i] = (output.u8x4[i] & 0x80) * 0xff;\n                    continue;\n                }\n            }\n        }\n\n        return output.u32;\n    }\n\n    int FUNC(vprintf)(const char *format __attribute__((unused)), void *vlist __attribute__((unused)))\n    {\n        // TODO: replace calls to vprintf with a raising pass to printf when we have a mechanism\n        // to write SSA passes\n        // Use https://github.com/ROCm/llvm-project/blob/99a81d16b9d811cadd420190bed16981a0a57bc6/llvm/lib/Transforms/Utils/AMDGPUEmitPrintf.cpp#L426\n        return -1;\n    }\n}\n\ntemplate <typename Acc, typename T>\n__device__ static Acc dot_product(Acc initial_value, T row[8], T column[8]);\n\ntemplate <>\n__device__ int32_t dot_product<int32_t, s8x4>(int32_t initial_value, s8x4 row[8], s8x4 column[8])\n{\n    int32_t result = initial_value;\n    for (int i = 0; i < 8; i++)\n    {\n        // ockl bug\n        if (__oclc_ISA_version == 10103)\n        {\n            result += int32_t(row[i].x) * int32_t(column[i].x);\n            result += int32_t(row[i].y) * int32_t(column[i].y);\n            result += int32_t(row[i].z) * int32_t(column[i].z);\n            result += int32_t(row[i].w) * int32_t(column[i].w);\n        }\n        else\n        {\n            result = __ockl_sdot4(row[i], column[i], result, false);\n        }\n    }\n    return result;\n}\n\ntemplate <>\n__device__ float dot_product<float, bf16x2>(float initial_value, bf16x2 row[8], bf16x2 column[8])\n{\n    float result = initial_value;\n    for (int i = 0; i < 8; i++)\n    {\n        result = std::fma(float(row[i].x), float(column[i].x), result);\n        result = std::fma(float(row[i].y), float(column[i].y), result);\n    }\n    return result;\n}\n\ntemplate <>\n__device__ float dot_product<float, f16x2>(float initial_value, f16x2 row[8], f16x2 column[8])\n{\n    float result = initial_value;\n    for (int i = 0; i < 8; i++)\n    {\n        // ockl bug\n        if (__oclc_ISA_version == 10103)\n        {\n            result = std::fma(float(row[i].x), float(column[i].x), result);\n            result = std::fma(float(row[i].y), float(column[i].y), result);\n        }\n        else\n        {\n            result = __ockl_fdot2(row[i], column[i], result, false);\n        }\n    }\n    return result;\n}\n\n// Template function because DPP mask must be a compile time constant\ntemplate <typename T, const int DPP_MASK>\n__device__ static void mma_load_rowcol(T upper_row[8], T lower_row[8], T left_column[8], T right_column[8],\n                                       int index, int left_column_start,\n                                       uint8_t quad_index,\n                                       uint32_t a0a1, uint32_t a2a3,\n                                       uint32_t b0b1)\n{\n    uint8_t laneid = uint8_t(__lane_id());\n    uint8_t quad_source = (laneid + quad_index) % 4;\n    upper_row[index] = std::bit_cast<T>(__builtin_amdgcn_mov_dpp(std::bit_cast<int32_t>(a0a1), DPP_MASK, 0xf, 0xf, 1));\n    lower_row[index] = std::bit_cast<T>(__builtin_amdgcn_mov_dpp(std::bit_cast<int32_t>(a2a3), DPP_MASK, 0xf, 0xf, 1));\n    left_column[index] = std::bit_cast<T>(__builtin_amdgcn_ds_bpermute((left_column_start + quad_source) << 2, std::bit_cast<int32_t>(b0b1)));\n    right_column[index] = std::bit_cast<T>(__builtin_amdgcn_ds_bpermute((left_column_start + 4 + quad_source) << 2, std::bit_cast<int32_t>(b0b1)));\n}\n\ntemplate <typename T>\n__device__ static void mma_load_col(T upper_row[16], T lower_row[16], T left_column[16], T right_column[16],\n                                    int index, int left_column_start,\n                                    uint32_t a0a1, uint32_t a2a3,\n                                    uint32_t b0b1)\n{\n    uint8_t laneid = uint8_t(__lane_id());\n    uint8_t quad_source = laneid % 4;\n    upper_row[index] = std::bit_cast<T>(a0a1);\n    lower_row[index] = std::bit_cast<T>(a2a3);\n    left_column[index] = std::bit_cast<T>(__builtin_amdgcn_ds_bpermute((left_column_start + quad_source) << 2, std::bit_cast<int32_t>(b0b1)));\n    right_column[index] = std::bit_cast<T>(__builtin_amdgcn_ds_bpermute((left_column_start + 4 + quad_source) << 2, std::bit_cast<int32_t>(b0b1)));\n}\n\ntemplate <typename Acc, typename T>\n__device__ HIP_vector_base<Acc, 4> fallback_mma_sync_aligned(uint4::Native_vec_ a_reg, uint2::Native_vec_ b_reg, HIP_vector_base<Acc, 4> c_reg)\n{\n    uint8_t laneid = uint8_t(FUNC_CALL(sreg_laneid)());\n    uint8_t quad_index = laneid % 4;\n    const Acc c0 = c_reg.x;\n    const Acc c1 = c_reg.y;\n    const Acc c2 = c_reg.z;\n    const Acc c3 = c_reg.w;\n    uint8_t left_column_start = quad_index * 8;\n    T upper_row[8];\n    T lower_row[8];\n    T left_column[8];\n    T right_column[8];\n    mma_load_col<T>(upper_row, lower_row, left_column, right_column,\n                    0, left_column_start,\n                    a_reg[0], a_reg[1],\n                    b_reg[0]);\n    mma_load_rowcol<T, 0b00'11'10'01>(upper_row, lower_row, left_column, right_column,\n                                      1, left_column_start,\n                                      1,\n                                      a_reg[0], a_reg[1],\n                                      b_reg[0]);\n    mma_load_rowcol<T, 0b01'00'11'10>(upper_row, lower_row, left_column, right_column,\n                                      2, left_column_start,\n                                      2,\n                                      a_reg[0], a_reg[1],\n                                      b_reg[0]);\n    mma_load_rowcol<T, 0b10'01'00'11>(upper_row, lower_row, left_column, right_column,\n                                      3, left_column_start,\n                                      3,\n                                      a_reg[0], a_reg[1],\n                                      b_reg[0]);\n    mma_load_col<T>(upper_row, lower_row, left_column, right_column,\n                    4, left_column_start,\n                    a_reg[2], a_reg[3],\n                    b_reg[1]);\n    mma_load_rowcol<T, 0b00'11'10'01>(upper_row, lower_row, left_column, right_column,\n                                      5, left_column_start,\n                                      1,\n                                      a_reg[2], a_reg[3],\n                                      b_reg[1]);\n    mma_load_rowcol<T, 0b01'00'11'10>(upper_row, lower_row, left_column, right_column,\n                                      6, left_column_start,\n                                      2,\n                                      a_reg[2], a_reg[3],\n                                      b_reg[1]);\n    mma_load_rowcol<T, 0b10'01'00'11>(upper_row, lower_row, left_column, right_column,\n                                      7, left_column_start,\n                                      3,\n                                      a_reg[2], a_reg[3],\n                                      b_reg[1]);\n    Acc d0 = dot_product<Acc, T>(c0, upper_row, left_column);\n    Acc d1 = dot_product<Acc, T>(c1, upper_row, right_column);\n    Acc d2 = dot_product<Acc, T>(c2, lower_row, left_column);\n    Acc d3 = dot_product<Acc, T>(c3, lower_row, right_column);\n    return {d0, d1, d2, d3};\n}\n\nextern \"C\"\n{\n    float4::Native_vec_ FUNC(mma_sync_aligned_m16n8k16_row_col_f32_f16_f16_f32)(uint4::Native_vec_ a_reg, uint2::Native_vec_ b_reg, float4::Native_vec_ c_reg)\n    {\n        return fallback_mma_sync_aligned<float, f16x2>(a_reg, b_reg, HIP_vector_base<float, 4>(c_reg.x, c_reg.y, c_reg.z, c_reg.w)).data;\n    }\n\n    // We wrap the intrinsic in an optnone function to prevent ZLUDA-specific\n    // passes from optimizing away the intrinsic call\n    static __device__ float4::Native_vec_ __llvm_zluda_mma_m16n8k16_f32_bf16_bf16_f32_optnone [[clang::optnone]] (uint4::Native_vec_ a_reg, uint2::Native_vec_ b_reg, float4::Native_vec_ c_reg)\n    {\n        __device__ uint4::Native_vec_ __llvm_zluda_mma_m16n8k16_f32_bf16_bf16_f32(uint4::Native_vec_ a_reg, uint2::Native_vec_ b_reg, uint4::Native_vec_ c_reg) __asm(\"llvm.zluda.mma.m16n8k16.f32.bf16.bf16.f32\");\n        return std::bit_cast<float4::Native_vec_>(__llvm_zluda_mma_m16n8k16_f32_bf16_bf16_f32(a_reg, b_reg, std::bit_cast<uint4::Native_vec_>(c_reg)));\n    }\n\n    float4::Native_vec_ FUNC(mma_sync_aligned_m16n8k16_row_col_f32_bf16_bf16_f32)(uint4::Native_vec_ a_reg, uint2::Native_vec_ b_reg, float4::Native_vec_ c_reg)\n    {\n        if (__oclc_ISA_version >= 11000 && __oclc_ISA_version < 12000)\n        {\n            [[clang::always_inline]] return __llvm_zluda_mma_m16n8k16_f32_bf16_bf16_f32_optnone(a_reg, b_reg, c_reg);\n        }\n        else\n        {\n            return fallback_mma_sync_aligned<float, bf16x2>(a_reg, b_reg, HIP_vector_base<float, 4>(c_reg.x, c_reg.y, c_reg.z, c_reg.w)).data;\n        }\n    }\n\n    // We wrap the intrinsic in an optnone function to prevent ZLUDA-specific\n    // passes from optimizing away the intrinsic call\n    static __device__ uint4::Native_vec_ __llvm_zluda_mma_m16n8k32_s32_s8_s8_fs32_optnone [[clang::optnone]] (uint4::Native_vec_ a_reg, uint2::Native_vec_ b_reg, uint4::Native_vec_ c_reg)\n    {\n        __device__ uint4::Native_vec_ __llvm_zluda_mma_m16n8k32_s32_s8_s8_fs32(uint4::Native_vec_ a_reg, uint2::Native_vec_ b_reg, uint4::Native_vec_ c_reg) __asm(\"llvm.zluda.mma.m16n8k32.s32.s8.s8.s32\");\n        return __llvm_zluda_mma_m16n8k32_s32_s8_s8_fs32(a_reg, b_reg, c_reg);\n    }\n\n    uint4::Native_vec_ FUNC(mma_sync_aligned_m16n8k32_row_col_s32_s8_s8_s32)(uint4::Native_vec_ a_reg, uint2::Native_vec_ b_reg, uint4::Native_vec_ c_reg)\n    {\n        if (__oclc_ISA_version >= 11000 && __oclc_ISA_version < 12000)\n        {\n            [[clang::always_inline]] return __llvm_zluda_mma_m16n8k32_s32_s8_s8_fs32_optnone(a_reg, b_reg, c_reg);\n        }\n        return std::bit_cast<uint4::Native_vec_>(fallback_mma_sync_aligned<int32_t, s8x4>(a_reg, b_reg, std::bit_cast<HIP_vector_base<int32_t, 4>>(c_reg)));\n    }\n}\n\ntemplate <typename T, typename A, typename B, int BOffset, typename OcklFunc>\n__device__ T dp2a_impl(T a, T b, T c, OcklFunc ockl_func)\n{\n    B b_typed = std::bit_cast<B>(b);\n    return ockl_func(std::bit_cast<A>(a), {b_typed[BOffset], b_typed[BOffset + 1]}, c, false);\n}\n\nextern \"C\"\n{\n    uint32_t FUNC(dp2a_lo_u32_u32)(uint32_t a, uint32_t b, uint32_t c)\n    {\n        return dp2a_impl<uint32_t, ushort2::Native_vec_, uchar4::Native_vec_, 0>(a, b, c, __ockl_udot2);\n    }\n\n    uint32_t FUNC(dp2a_hi_u32_u32)(uint32_t a, uint32_t b, uint32_t c)\n    {\n        return dp2a_impl<uint32_t, ushort2::Native_vec_, uchar4::Native_vec_, 2>(a, b, c, __ockl_udot2);\n    }\n\n    int32_t FUNC(dp2a_lo_s32_s32)(int32_t a, int32_t b, int32_t c)\n    {\n        return dp2a_impl<int32_t, short2::Native_vec_, char4::Native_vec_, 0>(a, b, c, __ockl_sdot2);\n    }\n\n    int32_t FUNC(dp2a_hi_s32_s32)(int32_t a, int32_t b, int32_t c)\n    {\n        return dp2a_impl<int32_t, short2::Native_vec_, char4::Native_vec_, 2>(a, b, c, __ockl_sdot2);\n    }\n\n    // When mixing signed and unsigned a and b the arguments are slightly incorrect,\n    // but keeping them all signed avoids Clang warnings and LLVM has no concept of\n    // signedness in integer types, so it's fine\n    int32_t FUNC(dp2a_lo_s32_u32)(int32_t a, int32_t b, int32_t c)\n    {\n        return dp2a_impl<int32_t, short2::Native_vec_, uchar4::Native_vec_, 0>(a, b, c, __ockl_sdot2);\n    }\n\n    int32_t FUNC(dp2a_hi_s32_u32)(int32_t a, int32_t b, int32_t c)\n    {\n        return dp2a_impl<int32_t, short2::Native_vec_, uchar4::Native_vec_, 2>(a, b, c, __ockl_sdot2);\n    }\n\n    int32_t FUNC(dp2a_lo_u32_s32)(uint32_t a, int32_t b, int32_t c)\n    {\n        auto a_typed = std::bit_cast<ushort2::Native_vec_>(a);\n        auto b_typed = std::bit_cast<char4::Native_vec_>(b);\n        return int32_t(a_typed[0]) * int32_t(b_typed[0]) +\n               int32_t(a_typed[1]) * int32_t(b_typed[1]) +\n               c;\n    }\n\n    int32_t FUNC(dp2a_hi_u32_s32)(uint32_t a, int32_t b, int32_t c)\n    {\n        auto a_typed = std::bit_cast<ushort2::Native_vec_>(a);\n        auto b_typed = std::bit_cast<char4::Native_vec_>(b);\n        return int32_t(a_typed[0]) * int32_t(b_typed[2]) +\n               int32_t(a_typed[1]) * int32_t(b_typed[3]) +\n               c;\n    }\n}\n"
  },
  {
    "path": "ptx/src/pass/deparamize_functions.rs",
    "content": "use super::*;\n\npub(super) fn run<'a, 'input>(\n    resolver: &mut GlobalStringIdentResolver2<'input>,\n    directives: Vec<Directive2<ast::Instruction<SpirvWord>, SpirvWord>>,\n) -> Result<Vec<Directive2<ast::Instruction<SpirvWord>, SpirvWord>>, TranslateError> {\n    directives\n        .into_iter()\n        .map(|directive| run_directive(resolver, directive))\n        .collect::<Result<Vec<_>, _>>()\n}\n\nfn run_directive<'input>(\n    resolver: &mut GlobalStringIdentResolver2,\n    directive: Directive2<ast::Instruction<SpirvWord>, SpirvWord>,\n) -> Result<Directive2<ast::Instruction<SpirvWord>, SpirvWord>, TranslateError> {\n    Ok(match directive {\n        var @ Directive2::Variable(..) => var,\n        Directive2::Method(method) => Directive2::Method(run_method(resolver, method)?),\n    })\n}\n\nfn run_method<'input>(\n    resolver: &mut GlobalStringIdentResolver2,\n    mut method: Function2<ast::Instruction<SpirvWord>, SpirvWord>,\n) -> Result<Function2<ast::Instruction<SpirvWord>, SpirvWord>, TranslateError> {\n    let is_declaration = method.body.is_none();\n    let mut body = Vec::new();\n    let mut remap_returns = Vec::new();\n    if !method.is_kernel() {\n        for arg in method.return_arguments.iter_mut() {\n            match arg.info.state_space {\n                ptx_parser::StateSpace::Param => {\n                    arg.info.state_space = ptx_parser::StateSpace::Reg;\n                    let old_name = arg.name;\n                    arg.name = resolver\n                        .register_unnamed(Some((arg.info.v_type.clone(), arg.info.state_space)));\n                    if is_declaration {\n                        continue;\n                    }\n                    remap_returns.push((old_name, arg.name, arg.info.v_type.clone()));\n                    body.push(Statement::Variable(ast::Variable {\n                        info: ast::VariableInfo {\n                            align: None,\n                            v_type: arg.info.v_type.clone(),\n                            state_space: ptx_parser::StateSpace::Param,\n                            array_init: Vec::new(),\n                        },\n                        name: old_name,\n                    }));\n                }\n                ptx_parser::StateSpace::Reg => {}\n                _ => return Err(error_unreachable()),\n            }\n        }\n        for arg in method.input_arguments.iter_mut() {\n            match arg.info.state_space {\n                ptx_parser::StateSpace::Param => {\n                    arg.info.state_space = ptx_parser::StateSpace::Reg;\n                    let old_name = arg.name;\n                    arg.name = resolver\n                        .register_unnamed(Some((arg.info.v_type.clone(), arg.info.state_space)));\n                    if is_declaration {\n                        continue;\n                    }\n                    body.push(Statement::Variable(ast::Variable {\n                        info: ast::VariableInfo {\n                            align: None,\n                            v_type: arg.info.v_type.clone(),\n                            state_space: ptx_parser::StateSpace::Param,\n                            array_init: Vec::new(),\n                        },\n                        name: old_name,\n                    }));\n                    body.push(Statement::Instruction(ast::Instruction::St {\n                        data: ast::StData {\n                            qualifier: ast::LdStQualifier::Weak,\n                            state_space: ast::StateSpace::Param,\n                            caching: ast::StCacheOperator::Writethrough,\n                            typ: arg.info.v_type.clone(),\n                        },\n                        arguments: ast::StArgs {\n                            src1: old_name,\n                            src2: arg.name,\n                        },\n                    }));\n                }\n                ptx_parser::StateSpace::Reg => {}\n                _ => return Err(error_unreachable()),\n            }\n        }\n    }\n    let body = method\n        .body\n        .map(|statements| {\n            for statement in statements {\n                run_statement(resolver, &remap_returns, &mut body, statement)?;\n            }\n            Ok::<_, TranslateError>(body)\n        })\n        .transpose()?;\n    Ok(Function2 { body, ..method })\n}\n\nfn run_statement<'input>(\n    resolver: &mut GlobalStringIdentResolver2<'input>,\n    remap_returns: &Vec<(SpirvWord, SpirvWord, ast::Type)>,\n    result: &mut Vec<Statement<ast::Instruction<SpirvWord>, SpirvWord>>,\n    statement: Statement<ast::Instruction<SpirvWord>, SpirvWord>,\n) -> Result<(), TranslateError> {\n    match statement {\n        Statement::Instruction(ast::Instruction::Call {\n            mut data,\n            mut arguments,\n        }) => {\n            let mut post_st = Vec::new();\n            for ((type_, space), ident) in data\n                .input_arguments\n                .iter_mut()\n                .zip(arguments.input_arguments.iter_mut())\n            {\n                if *space == ptx_parser::StateSpace::Param {\n                    *space = ptx_parser::StateSpace::Reg;\n                    let old_name = *ident;\n                    *ident = resolver\n                        .register_unnamed(Some((type_.clone(), ptx_parser::StateSpace::Reg)));\n                    result.push(Statement::Instruction(ast::Instruction::Ld {\n                        data: ast::LdDetails {\n                            qualifier: ast::LdStQualifier::Weak,\n                            state_space: ast::StateSpace::Param,\n                            caching: ast::LdCacheOperator::Cached,\n                            typ: type_.clone(),\n                            non_coherent: false,\n                        },\n                        arguments: ast::LdArgs {\n                            dst: *ident,\n                            src: old_name,\n                        },\n                    }));\n                }\n            }\n            for ((type_, space), ident) in data\n                .return_arguments\n                .iter_mut()\n                .zip(arguments.return_arguments.iter_mut())\n            {\n                if *space == ptx_parser::StateSpace::Param {\n                    *space = ptx_parser::StateSpace::Reg;\n                    let old_name = *ident;\n                    *ident = resolver\n                        .register_unnamed(Some((type_.clone(), ptx_parser::StateSpace::Reg)));\n                    post_st.push(Statement::Instruction(ast::Instruction::St {\n                        data: ast::StData {\n                            qualifier: ast::LdStQualifier::Weak,\n                            state_space: ast::StateSpace::Param,\n                            caching: ast::StCacheOperator::Writethrough,\n                            typ: type_.clone(),\n                        },\n                        arguments: ast::StArgs {\n                            src1: old_name,\n                            src2: *ident,\n                        },\n                    }));\n                }\n            }\n            result.push(Statement::Instruction(ast::Instruction::Call {\n                data,\n                arguments,\n            }));\n            result.extend(post_st.into_iter());\n        }\n        Statement::Instruction(ast::Instruction::Ret { data }) => {\n            for (old_name, new_name, type_) in remap_returns.iter() {\n                result.push(Statement::Instruction(ast::Instruction::Ld {\n                    data: ast::LdDetails {\n                        qualifier: ast::LdStQualifier::Weak,\n                        state_space: ast::StateSpace::Param,\n                        caching: ast::LdCacheOperator::Cached,\n                        typ: type_.clone(),\n                        non_coherent: false,\n                    },\n                    arguments: ast::LdArgs {\n                        dst: *new_name,\n                        src: *old_name,\n                    },\n                }));\n            }\n            result.push(Statement::Instruction(ast::Instruction::Ret { data }));\n        }\n        statement => {\n            result.push(statement);\n        }\n    }\n    Ok(())\n}\n"
  },
  {
    "path": "zluda_cache/migrations/.keep",
    "content": ""
  }
]